summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorintrigeri <intrigeri@boum.org>2008-12-30 18:24:36 +0100
committerintrigeri <intrigeri@boum.org>2008-12-30 18:24:36 +0100
commit21add7ffa87a5e622d18bdbb24c638c15bdb3800 (patch)
tree6780aa6dbee71f18db64e44b012e789fc8197d4b
parent3190e5cea75a43d38f58b8a45fbc87d5527d18f0 (diff)
parent3032909090711c86c5056987043eeff5a1f6aec2 (diff)
Merge commit 'upstream/master' into prv/po
Conflicts: debian/control debian/copyright doc/ikiwiki/pagespec.mdwn Signed-off-by: intrigeri <intrigeri@boum.org>
-rw-r--r--IkiWiki.pm441
-rw-r--r--IkiWiki/CGI.pm68
-rw-r--r--IkiWiki/Plugin/aggregate.pm144
-rw-r--r--IkiWiki/Plugin/amazon_s3.pm32
-rw-r--r--IkiWiki/Plugin/anonok.pm12
-rw-r--r--IkiWiki/Plugin/attachment.pm32
-rw-r--r--IkiWiki/Plugin/autoindex.pm16
-rw-r--r--IkiWiki/Plugin/brokenlinks.pm12
-rw-r--r--IkiWiki/Plugin/bzr.pm54
-rw-r--r--IkiWiki/Plugin/calendar.pm30
-rw-r--r--IkiWiki/Plugin/camelcase.pm32
-rw-r--r--IkiWiki/Plugin/color.pm20
-rw-r--r--IkiWiki/Plugin/comments.pm642
-rw-r--r--IkiWiki/Plugin/conditional.pm28
-rw-r--r--IkiWiki/Plugin/creole.pm12
-rw-r--r--IkiWiki/Plugin/cutpaste.pm20
-rw-r--r--IkiWiki/Plugin/ddate.pm12
-rw-r--r--IkiWiki/Plugin/editdiff.pm16
-rw-r--r--IkiWiki/Plugin/editpage.pm28
-rw-r--r--IkiWiki/Plugin/edittemplate.pm24
-rw-r--r--IkiWiki/Plugin/embed.pm20
-rw-r--r--IkiWiki/Plugin/external.pm48
-rw-r--r--IkiWiki/Plugin/favicon.pm12
-rw-r--r--IkiWiki/Plugin/filecheck.pm30
-rw-r--r--IkiWiki/Plugin/format.pm8
-rw-r--r--IkiWiki/Plugin/fortune.pm12
-rw-r--r--IkiWiki/Plugin/git.pm72
-rw-r--r--IkiWiki/Plugin/goodstuff.pm8
-rw-r--r--IkiWiki/Plugin/google.pm16
-rw-r--r--IkiWiki/Plugin/googlecalendar.pm22
-rw-r--r--IkiWiki/Plugin/graphviz.pm16
-rw-r--r--IkiWiki/Plugin/haiku.pm12
-rw-r--r--IkiWiki/Plugin/hnb.pm12
-rw-r--r--IkiWiki/Plugin/html.pm12
-rw-r--r--IkiWiki/Plugin/htmlbalance.pm57
-rw-r--r--IkiWiki/Plugin/htmlscrubber.pm16
-rw-r--r--IkiWiki/Plugin/htmltidy.pm12
-rw-r--r--IkiWiki/Plugin/httpauth.pm12
-rw-r--r--IkiWiki/Plugin/img.pm12
-rw-r--r--IkiWiki/Plugin/inline.pm137
-rw-r--r--IkiWiki/Plugin/link.pm24
-rw-r--r--IkiWiki/Plugin/linkmap.pm20
-rw-r--r--IkiWiki/Plugin/listdirectives.pm20
-rw-r--r--IkiWiki/Plugin/lockedit.pm16
-rw-r--r--IkiWiki/Plugin/map.pm12
-rw-r--r--IkiWiki/Plugin/mdwn.pm12
-rw-r--r--IkiWiki/Plugin/mercurial.pm52
-rw-r--r--IkiWiki/Plugin/meta.pm79
-rw-r--r--IkiWiki/Plugin/mirrorlist.pm16
-rw-r--r--IkiWiki/Plugin/monotone.pm77
-rw-r--r--IkiWiki/Plugin/more.pm10
-rw-r--r--IkiWiki/Plugin/norcs.pm48
-rw-r--r--IkiWiki/Plugin/opendiscussion.pm12
-rw-r--r--IkiWiki/Plugin/openid.pm36
-rw-r--r--IkiWiki/Plugin/orphans.pm12
-rw-r--r--IkiWiki/Plugin/otl.pm16
-rw-r--r--IkiWiki/Plugin/pagecount.pm12
-rw-r--r--IkiWiki/Plugin/pagestats.pm12
-rw-r--r--IkiWiki/Plugin/pagetemplate.pm16
-rw-r--r--IkiWiki/Plugin/parentlinks.pm16
-rw-r--r--IkiWiki/Plugin/passwordauth.pm26
-rw-r--r--IkiWiki/Plugin/pingee.pm12
-rw-r--r--IkiWiki/Plugin/pinger.pm16
-rw-r--r--IkiWiki/Plugin/poll.pm16
-rw-r--r--IkiWiki/Plugin/polygen.pm12
-rw-r--r--IkiWiki/Plugin/postsparkline.pm12
-rw-r--r--IkiWiki/Plugin/prettydate.pm16
-rw-r--r--IkiWiki/Plugin/progress.pm16
-rw-r--r--IkiWiki/Plugin/rawhtml.pm8
-rw-r--r--IkiWiki/Plugin/recentchanges.pm46
-rw-r--r--IkiWiki/Plugin/recentchangesdiff.pm17
-rw-r--r--IkiWiki/Plugin/relativedate.pm20
-rw-r--r--IkiWiki/Plugin/remove.pm34
-rw-r--r--IkiWiki/Plugin/rename.pm50
-rw-r--r--IkiWiki/Plugin/search.pm40
-rw-r--r--IkiWiki/Plugin/shortcut.pm20
-rw-r--r--IkiWiki/Plugin/sidebar.pm16
-rw-r--r--IkiWiki/Plugin/signinedit.pm12
-rw-r--r--IkiWiki/Plugin/skeleton.pm.example102
-rw-r--r--IkiWiki/Plugin/smiley.pm16
-rw-r--r--IkiWiki/Plugin/sparkline.pm12
-rw-r--r--IkiWiki/Plugin/svn.pm54
-rw-r--r--IkiWiki/Plugin/table.pm26
-rw-r--r--IkiWiki/Plugin/tag.pm32
-rw-r--r--IkiWiki/Plugin/template.pm12
-rw-r--r--IkiWiki/Plugin/testpagespec.pm12
-rw-r--r--IkiWiki/Plugin/teximg.pm32
-rw-r--r--IkiWiki/Plugin/textile.pm12
-rw-r--r--IkiWiki/Plugin/tla.pm46
-rw-r--r--IkiWiki/Plugin/toc.pm14
-rw-r--r--IkiWiki/Plugin/toggle.pm28
-rw-r--r--IkiWiki/Plugin/txt.pm4
-rw-r--r--IkiWiki/Plugin/typography.pm16
-rw-r--r--IkiWiki/Plugin/version.pm16
-rw-r--r--IkiWiki/Plugin/websetup.pm36
-rw-r--r--IkiWiki/Plugin/wikitext.pm12
-rw-r--r--IkiWiki/Receive.pm16
-rw-r--r--IkiWiki/Render.pm34
-rw-r--r--IkiWiki/Setup.pm12
-rw-r--r--IkiWiki/Setup/Automator.pm12
-rw-r--r--IkiWiki/Setup/Standard.pm16
-rw-r--r--IkiWiki/UserInfo.pm32
-rw-r--r--IkiWiki/Wrapper.pm4
-rwxr-xr-xMakefile.PL7
-rw-r--r--debian/changelog43
-rw-r--r--debian/control4
-rw-r--r--debian/copyright12
-rw-r--r--doc/bugs/Allow_overriding_of_symlink_restriction.mdwn6
-rw-r--r--doc/bugs/Can__39__t_create_root_page.mdwn4
-rw-r--r--doc/bugs/Comments_link_is_to_index.html_if_usedirs_is_on.mdwn5
-rw-r--r--doc/bugs/IkiWiki::Wrapper_should_use_destdir.mdwn23
-rw-r--r--doc/bugs/IkiWiki::Wrapper_should_use_destdir/discussion.mdwn4
-rw-r--r--doc/bugs/Insecure_dependency_in_eval_while_running_with_-T_switch.mdwn4
-rw-r--r--doc/bugs/Meta_plugin_does_not_respect_htmlscrubber__95__skip_setting.___40__patch__41__.mdwn11
-rw-r--r--doc/bugs/Monotone_rcs_support.mdwn2
-rw-r--r--doc/bugs/No_link_for_blog_items_when_filename_contains_a_colon.mdwn8
-rw-r--r--doc/bugs/Problem_with_toc.pm_plug-in.mdwn4
-rw-r--r--doc/bugs/Problems_with_graphviz.pm_plug-in.mdwn14
-rw-r--r--doc/bugs/RecentChanges_broken_with_empty_svnpath.mdwn2
-rw-r--r--doc/bugs/Spaces_in_link_text_for_ikiwiki_links.mdwn2
-rw-r--r--doc/bugs/Titles_are_lower-cased_when_creating_a_page.mdwn2
-rw-r--r--doc/bugs/Warns_about_use_of_uninitialized_value_if_prefix__95__directives_is_on_and_a_directive_does_not_contain_a_space.mdwn4
-rw-r--r--doc/bugs/beautify__95__urlpath_will_add_.__47___even_if_it_is_already_present.mdwn3
-rw-r--r--doc/bugs/bugfix_for:___34__mtn:_operation_canceled:_Broken_pipe__34_____40__patch__41__.mdwn24
-rw-r--r--doc/bugs/comments_produce_broken_links_in_RecentChanges.mdwn9
-rw-r--r--doc/bugs/dumpsetup_does_not_save_destdir.mdwn3
-rw-r--r--doc/bugs/git_stderr_output_causes_problems.mdwn2
-rw-r--r--doc/bugs/img_plugin_should_pass_through_class_attribute.mdwn4
-rw-r--r--doc/bugs/inline_sort-by-title_issues.mdwn2
-rw-r--r--doc/bugs/inline_sort_order_and_meta_date_value.mdwn314
-rw-r--r--doc/bugs/links_misparsed_in_CSV_files.mdwn17
-rw-r--r--doc/bugs/lockedit_plugin_should_alert_user_about_an_invalid_pagespec_in_preferences.mdwn6
-rw-r--r--doc/bugs/login_page_should_note_cookie_requirement.mdwn16
-rw-r--r--doc/bugs/markdown_bug:_email_escaping_and_plus_addresses.mdwn2
-rw-r--r--doc/bugs/mercurial_fail_to_add.mdwn2
-rw-r--r--doc/bugs/methodResponse_in_add__95__plugins.mdwn2
-rw-r--r--doc/bugs/multiple_pages_with_same_name.mdwn6
-rw-r--r--doc/bugs/output_of_successful_rename_should_list_the_full_path_to_affected_pages.mdwn12
-rw-r--r--doc/bugs/pagespec_parsing_chokes_on_function__40____41__.mdwn2
-rw-r--r--doc/bugs/prune_causing_taint_mode_failures.mdwn4
-rw-r--r--doc/bugs/quieten_mercurial.mdwn4
-rw-r--r--doc/bugs/search_for_locale_data_in_the_installed_location.mdwn2
-rw-r--r--doc/bugs/stray___60____47__p__62___tags.mdwn15
-rw-r--r--doc/bugs/tbasewiki__95__brokenlinks.t_broken.mdwn6
-rw-r--r--doc/bugs/textile_plugin_dies_if_input_has_a_non-utf8_character.mdwn2
-rw-r--r--doc/download.mdwn2
-rw-r--r--doc/examples/blog.mdwn12
-rw-r--r--doc/forum/discussion.mdwn2
-rw-r--r--doc/git.mdwn26
-rw-r--r--doc/ikiwiki/directive/cutpaste.mdwn10
-rw-r--r--doc/ikiwiki/directive/inline.mdwn9
-rw-r--r--doc/ikiwiki/directive/tag.mdwn4
-rw-r--r--doc/ikiwiki/pagespec.mdwn4
-rw-r--r--doc/ikiwiki/pagespec/attachment.mdwn2
-rw-r--r--doc/ikiwikiusers.mdwn9
-rw-r--r--doc/ikiwikiusers/discussion.mdwn4
-rw-r--r--doc/install.mdwn9
-rw-r--r--doc/install/discussion.mdwn4
-rw-r--r--doc/news/openid/discussion.mdwn2
-rw-r--r--doc/news/version_2.66.mdwn39
-rw-r--r--doc/news/version_2.67.mdwn17
-rw-r--r--doc/news/version_2.71.mdwn28
-rw-r--r--doc/news/version_2.72.mdwn9
-rw-r--r--doc/plugins/aggregate.mdwn6
-rw-r--r--doc/plugins/aggregate/discussion.mdwn2
-rw-r--r--doc/plugins/anonok.mdwn7
-rw-r--r--doc/plugins/calendar/discussion.mdwn2
-rw-r--r--doc/plugins/comments.mdwn43
-rw-r--r--doc/plugins/comments/discussion.mdwn163
-rw-r--r--doc/plugins/contrib/headinganchors.mdwn8
-rw-r--r--doc/plugins/contrib/po.mdwn3
-rw-r--r--doc/plugins/contrib/siterel2pagerel.mdwn8
-rw-r--r--doc/plugins/contrib/unixauth.mdwn24
-rw-r--r--doc/plugins/contrib/unixauth/discussion.mdwn4
-rw-r--r--doc/plugins/cutpaste.mdwn2
-rw-r--r--doc/plugins/htmlbalance.mdwn9
-rw-r--r--doc/plugins/htmlbalance/discussion.mdwn10
-rw-r--r--doc/plugins/htmlscrubber.mdwn2
-rw-r--r--doc/plugins/htmltidy.mdwn3
-rw-r--r--doc/plugins/lockedit.mdwn4
-rw-r--r--doc/plugins/pagecount.mdwn4
-rw-r--r--doc/plugins/write.mdwn10
-rw-r--r--doc/plugins/write/discussion.mdwn2
-rw-r--r--doc/rcs/git.mdwn4
-rw-r--r--doc/roadmap.mdwn2
-rw-r--r--doc/sandbox.mdwn4
-rw-r--r--doc/sandbox/Omgwtf_a_blof_post__33____33____33____33____33__1__33__1__33__11111__33____33____33__1__33__1__33____33__1five.html31
-rw-r--r--doc/sandbox/castle/discussion/jon_tests_too.mdwn2
-rw-r--r--doc/setup/discussion.mdwn11
-rw-r--r--doc/style.css17
-rw-r--r--doc/tips/DreamHost.mdwn2
-rw-r--r--doc/tips/comments_feed.mdwn10
-rw-r--r--doc/tips/convert_mediawiki_to_ikiwiki/discussion.mdwn600
-rw-r--r--doc/tips/inside_dot_ikiwiki.mdwn2
-rw-r--r--doc/tips/inside_dot_ikiwiki/discussion.mdwn47
-rw-r--r--doc/tips/nearlyfreespeech.mdwn3
-rw-r--r--doc/tips/untrusted_git_push/discussion.mdwn4
-rw-r--r--doc/tips/using_the_web_interface_with_a_real_text_editor.mdwn7
-rw-r--r--doc/tips/vim_syntax_highlighting/discussion.mdwn2
-rw-r--r--doc/todo/Add_DATE_parameter_for_use_in_templates.mdwn14
-rw-r--r--doc/todo/Add_camelcase_exclusions.mdwn23
-rw-r--r--doc/todo/Add_support_for_latest_Text::Markdown_as_found_on_CPAN.mdwn2
-rw-r--r--doc/todo/Allow_change_of_wiki_file_types.mdwn8
-rw-r--r--doc/todo/Allow_disabling_edit_and_preferences_links.mdwn48
-rw-r--r--doc/todo/Allow_edittemplate_to_set_file_type.mdwn8
-rw-r--r--doc/todo/Bestdir_along_with_bestlink_in_IkiWiki.pm.mdwn8
-rw-r--r--doc/todo/Default_text_for_new_pages.mdwn8
-rw-r--r--doc/todo/Give_access_to_more_TMPL__95__VAR_variables_in_templates_inserted_by_the_template_plugin.mdwn2
-rw-r--r--doc/todo/Improve_display_of_OpenIDs.mdwn5
-rw-r--r--doc/todo/Inline_plugin_option_to_show_full_page_path.mdwn2
-rw-r--r--doc/todo/Move_teximg_latex_preamble_to_config_file.mdwn10
-rw-r--r--doc/todo/Set_arbitrary_date_to_be_used_by_calendar_plugin.mdwn12
-rw-r--r--doc/todo/Silence_monotone_warning.mdwn2
-rw-r--r--doc/todo/Support_wildcard_inside_of_link__40____41___within_a_pagespec.mdwn4
-rw-r--r--doc/todo/Wrapper_config_with_multiline_regexp.mdwn4
-rw-r--r--doc/todo/add_forward_age_sorting_option_to_inline.mdwn2
-rw-r--r--doc/todo/apache_404_ErrorDocument_handler.mdwn18
-rw-r--r--doc/todo/automatic_use_of_syntax_plugin_on_source_code_files/discussion.mdwn20
-rw-r--r--doc/todo/blogpost_plugin.mdwn20
-rw-r--r--doc/todo/bzr.mdwn28
-rw-r--r--doc/todo/cas_authentication.mdwn14
-rw-r--r--doc/todo/clear_page_to_delete.mdwn4
-rw-r--r--doc/todo/color_plugin.mdwn20
-rw-r--r--doc/todo/comments.mdwn149
-rw-r--r--doc/todo/darcs.mdwn26
-rw-r--r--doc/todo/datearchives-plugin.mdwn8
-rw-r--r--doc/todo/different_search_engine.mdwn40
-rw-r--r--doc/todo/directive_docs.mdwn12
-rw-r--r--doc/todo/enable-htaccess-files.mdwn2
-rw-r--r--doc/todo/format_escape.mdwn16
-rw-r--r--doc/todo/fortune:_select_options_via_environment.mdwn4
-rw-r--r--doc/todo/generic___39__do__61__goto__39___for_CGI.mdwn9
-rw-r--r--doc/todo/httpauth_feature_parity_with_passwordauth.mdwn21
-rw-r--r--doc/todo/index.html_allowed.mdwn10
-rw-r--r--doc/todo/inline:_numerical_ordering_by_title.mdwn22
-rw-r--r--doc/todo/inline_plugin:_ability_to_override_feed_name.mdwn29
-rw-r--r--doc/todo/inline_plugin:_hide_feed_buttons_if_empty.mdwn7
-rw-r--r--doc/todo/language_definition_for_the_meta_plugin.mdwn4
-rw-r--r--doc/todo/location_of_external_plugins.mdwn24
-rw-r--r--doc/todo/location_of_ikiwiki-w3m.cgi.mdwn3
-rw-r--r--doc/todo/mbox.mdwn3
-rw-r--r--doc/todo/meta_rcsid.mdwn2
-rw-r--r--doc/todo/missingparents.pm.mdwn44
-rw-r--r--doc/todo/modify_page_filename_in_plugin.mdwn6
-rw-r--r--doc/todo/need_global_renamepage_hook.mdwn53
-rw-r--r--doc/todo/pagespec_relative_to_a_target.mdwn16
-rw-r--r--doc/todo/provide_sha1_for_git_diffurl.mdwn2
-rw-r--r--doc/todo/replace_HTML::Template_with_Template_Toolkit.mdwn2
-rw-r--r--doc/todo/require_CAPTCHA_to_edit.mdwn22
-rw-r--r--doc/todo/source_link.mdwn16
-rw-r--r--doc/todo/structured_page_data.mdwn50
-rw-r--r--doc/todo/support_creole_markup.mdwn2
-rw-r--r--doc/todo/supporting_comments_via_disussion_pages.mdwn17
-rw-r--r--doc/todo/syntax_highlighting.mdwn12
-rw-r--r--doc/todo/tidy_git__39__s_ctime_debug_output.mdwn2
-rw-r--r--doc/todo/tmplvars_plugin.mdwn12
-rw-r--r--doc/todo/toc_plugin:_set_a_header_ceiling___40__opposite_of_levels__61____41__.mdwn3
-rw-r--r--doc/todo/tracking_bugs_with_dependencies.mdwn58
-rw-r--r--doc/todo/turn_edittemplate_verbosity_off_by_default.mdwn6
-rw-r--r--doc/todo/using_meta_titles_for_parentlinks.html8
-rw-r--r--doc/todo/varioki_--_add_template_variables___40__with_closures_for_values__41___in_ikiwiki.setup.mdwn8
-rw-r--r--doc/users/StevenBlack.mdwn5
-rw-r--r--doc/users/ajt.mdwn20
-rw-r--r--doc/users/jon.mdwn (renamed from doc/users/jondowland.mdwn)3
-rw-r--r--doc/users/smcv.mdwn11
-rw-r--r--doc/users/weakishjiang.mdwn4
-rw-r--r--doc/users/xma.mdwn2
-rw-r--r--doc/wikitemplates.mdwn4
-rwxr-xr-xgitremotes29
-rwxr-xr-xikiwiki.in16
-rw-r--r--po/bg.po170
-rw-r--r--po/cs.po170
-rw-r--r--po/da.po170
-rw-r--r--po/de.po426
-rw-r--r--po/es.po188
-rw-r--r--po/fr.po277
-rw-r--r--po/gu.po170
-rw-r--r--po/ikiwiki.pot162
-rw-r--r--po/pl.po170
-rw-r--r--po/sv.po170
-rw-r--r--po/vi.po170
-rwxr-xr-xt/beautify_urlpath.t17
-rwxr-xr-xt/htmlbalance.t23
-rwxr-xr-xt/openiduser.t37
-rw-r--r--templates/atomitem.tmpl6
-rw-r--r--templates/change.tmpl4
-rw-r--r--templates/comment.tmpl42
-rw-r--r--templates/editcomment.tmpl29
-rw-r--r--templates/inlinepage.tmpl4
-rw-r--r--templates/page.tmpl17
-rw-r--r--templates/rssitem.tmpl3
291 files changed, 6222 insertions, 2925 deletions
diff --git a/IkiWiki.pm b/IkiWiki.pm
index 735dc97b1..54e00ec7b 100644
--- a/IkiWiki.pm
+++ b/IkiWiki.pm
@@ -34,7 +34,7 @@ memoize("abs2rel");
memoize("pagespec_translate");
memoize("file_pruned");
-sub getsetup () { #{{{
+sub getsetup () {
wikiname => {
type => "string",
default => "wiki",
@@ -100,7 +100,7 @@ sub getsetup () { #{{{
type => "string",
default => '',
example => "/var/www/wiki/ikiwiki.cgi",
- description => "cgi wrapper to generate",
+ description => "filename of cgi wrapper to generate",
safe => 0, # file
rebuild => 0,
},
@@ -277,13 +277,20 @@ sub getsetup () { #{{{
},
umask => {
type => "integer",
- description => "",
example => "022",
description => "force ikiwiki to use a particular umask",
advanced => 1,
safe => 0, # paranoia
rebuild => 0,
},
+ wrappergroup => {
+ type => "string",
+ example => "ikiwiki",
+ description => "group for wrappers to run in",
+ advanced => 1,
+ safe => 0, # paranoia
+ rebuild => 0,
+ },
libdir => {
type => "string",
default => "",
@@ -424,9 +431,9 @@ sub getsetup () { #{{{
safe => 0,
rebuild => 0,
},
-} #}}}
+}
-sub defaultconfig () { #{{{
+sub defaultconfig () {
my %s=getsetup();
my @ret;
foreach my $key (keys %s) {
@@ -434,9 +441,9 @@ sub defaultconfig () { #{{{
}
use Data::Dumper;
return @ret;
-} #}}}
+}
-sub checkconfig () { #{{{
+sub checkconfig () {
# locale stuff; avoid LC_ALL since it overrides everything
if (defined $ENV{LC_ALL}) {
$ENV{LANG} = $ENV{LC_ALL};
@@ -483,9 +490,9 @@ sub checkconfig () { #{{{
run_hooks(checkconfig => sub { shift->() });
return 1;
-} #}}}
+}
-sub listplugins () { #{{{
+sub listplugins () {
my %ret;
foreach my $dir (@INC, $config{libdir}) {
@@ -503,9 +510,9 @@ sub listplugins () { #{{{
}
return keys %ret;
-} #}}}
+}
-sub loadplugins () { #{{{
+sub loadplugins () {
if (defined $config{libdir} && length $config{libdir}) {
unshift @INC, possibly_foolish_untaint($config{libdir});
}
@@ -532,9 +539,9 @@ sub loadplugins () { #{{{
}
return 1;
-} #}}}
+}
-sub loadplugin ($) { #{{{
+sub loadplugin ($) {
my $plugin=shift;
return if grep { $_ eq $plugin} @{$config{disable_plugins}};
@@ -560,9 +567,9 @@ sub loadplugin ($) { #{{{
}
$loaded_plugins{$plugin}=1;
return 1;
-} #}}}
+}
-sub error ($;$) { #{{{
+sub error ($;$) {
my $message=shift;
my $cleaner=shift;
log_message('err' => $message) if $config{syslog};
@@ -570,15 +577,15 @@ sub error ($;$) { #{{{
$cleaner->();
}
die $message."\n";
-} #}}}
+}
-sub debug ($) { #{{{
+sub debug ($) {
return unless $config{verbose};
return log_message(debug => @_);
-} #}}}
+}
my $log_open=0;
-sub log_message ($$) { #{{{
+sub log_message ($$) {
my $type=shift;
if ($config{syslog}) {
@@ -598,44 +605,44 @@ sub log_message ($$) { #{{{
else {
return print STDERR "@_\n";
}
-} #}}}
+}
-sub possibly_foolish_untaint ($) { #{{{
+sub possibly_foolish_untaint ($) {
my $tainted=shift;
my ($untainted)=$tainted=~/(.*)/s;
return $untainted;
-} #}}}
+}
-sub basename ($) { #{{{
+sub basename ($) {
my $file=shift;
$file=~s!.*/+!!;
return $file;
-} #}}}
+}
-sub dirname ($) { #{{{
+sub dirname ($) {
my $file=shift;
$file=~s!/*[^/]+$!!;
return $file;
-} #}}}
+}
-sub pagetype ($) { #{{{
+sub pagetype ($) {
my $page=shift;
if ($page =~ /\.([^.]+)$/) {
return $1 if exists $hooks{htmlize}{$1};
}
return;
-} #}}}
+}
-sub isinternal ($) { #{{{
+sub isinternal ($) {
my $page=shift;
return exists $pagesources{$page} &&
$pagesources{$page} =~ /\._([^.]+)$/;
-} #}}}
+}
-sub pagename ($) { #{{{
+sub pagename ($) {
my $file=shift;
my $type=pagetype($file);
@@ -645,9 +652,9 @@ sub pagename ($) { #{{{
$page=$1;
}
return $page;
-} #}}}
+}
-sub newpagefile ($$) { #{{{
+sub newpagefile ($$) {
my $page=shift;
my $type=shift;
@@ -657,27 +664,31 @@ sub newpagefile ($$) { #{{{
else {
return $page."/index.".$type;
}
-} #}}}
+}
-sub targetpage ($$) { #{{{
+sub targetpage ($$;$) {
my $page=shift;
my $ext=shift;
+ my $filename=shift;
- if (! $config{usedirs} || $page eq 'index') {
+ if (defined $filename) {
+ return $page."/".$filename.".".$ext;
+ }
+ elsif (! $config{usedirs} || $page eq 'index') {
return $page.".".$ext;
}
else {
return $page."/index.".$ext;
}
-} #}}}
+}
-sub htmlpage ($) { #{{{
+sub htmlpage ($) {
my $page=shift;
return targetpage($page, $config{htmlext});
-} #}}}
+}
-sub srcfile_stat { #{{{
+sub srcfile_stat {
my $file=shift;
my $nothrow=shift;
@@ -687,13 +698,13 @@ sub srcfile_stat { #{{{
}
error("internal error: $file cannot be found in $config{srcdir} or underlay") unless $nothrow;
return;
-} #}}}
+}
-sub srcfile ($;$) { #{{{
+sub srcfile ($;$) {
return (srcfile_stat(@_))[0];
-} #}}}
+}
-sub add_underlay ($) { #{{{
+sub add_underlay ($) {
my $dir=shift;
if ($dir !~ /^\//) {
@@ -705,9 +716,9 @@ sub add_underlay ($) { #{{{
}
return 1;
-} #}}}
+}
-sub readfile ($;$$) { #{{{
+sub readfile ($;$$) {
my $file=shift;
my $binary=shift;
my $wantfd=shift;
@@ -727,9 +738,9 @@ sub readfile ($;$$) { #{{{
}
close $in || error("failed to read $file: $!");
return $ret;
-} #}}}
+}
-sub prep_writefile ($$) { #{{{
+sub prep_writefile ($$) {
my $file=shift;
my $destdir=shift;
@@ -753,9 +764,9 @@ sub prep_writefile ($$) { #{{{
}
return 1;
-} #}}}
+}
-sub writefile ($$$;$$) { #{{{
+sub writefile ($$$;$$) {
my $file=shift; # can include subdirs
my $destdir=shift; # directory to put file in
my $content=shift;
@@ -783,10 +794,10 @@ sub writefile ($$$;$$) { #{{{
error("failed renaming $newfile to $destdir/$file: $!", $cleanup);
return 1;
-} #}}}
+}
my %cleared;
-sub will_render ($$;$) { #{{{
+sub will_render ($$;$) {
my $page=shift;
my $dest=shift;
my $clear=shift;
@@ -810,9 +821,9 @@ sub will_render ($$;$) { #{{{
$destsources{$dest}=$page;
return 1;
-} #}}}
+}
-sub bestlink ($$) { #{{{
+sub bestlink ($$) {
my $page=shift;
my $link=shift;
@@ -848,15 +859,15 @@ sub bestlink ($$) { #{{{
#print STDERR "warning: page $page, broken link: $link\n";
return "";
-} #}}}
+}
-sub isinlinableimage ($) { #{{{
+sub isinlinableimage ($) {
my $file=shift;
return $file =~ /\.(png|gif|jpg|jpeg)$/i;
-} #}}}
+}
-sub pagetitle ($;$) { #{{{
+sub pagetitle ($;$) {
my $page=shift;
my $unescaped=shift;
@@ -868,31 +879,31 @@ sub pagetitle ($;$) { #{{{
}
return $page;
-} #}}}
+}
-sub titlepage ($) { #{{{
+sub titlepage ($) {
my $title=shift;
# support use w/o %config set
my $chars = defined $config{wiki_file_chars} ? $config{wiki_file_chars} : "-[:alnum:]+/.:_";
$title=~s/([^$chars]|_)/$1 eq ' ' ? '_' : "__".ord($1)."__"/eg;
return $title;
-} #}}}
+}
-sub linkpage ($) { #{{{
+sub linkpage ($) {
my $link=shift;
my $chars = defined $config{wiki_file_chars} ? $config{wiki_file_chars} : "-[:alnum:]+/.:_";
$link=~s/([^$chars])/$1 eq ' ' ? '_' : "__".ord($1)."__"/eg;
return $link;
-} #}}}
+}
-sub cgiurl (@) { #{{{
+sub cgiurl (@) {
my %params=@_;
return $config{cgiurl}."?".
join("&amp;", map $_."=".uri_escape_utf8($params{$_}), keys %params);
-} #}}}
+}
-sub baseurl (;$) { #{{{
+sub baseurl (;$) {
my $page=shift;
return "$config{url}/" if ! defined $page;
@@ -901,9 +912,9 @@ sub baseurl (;$) { #{{{
$page=~s/[^\/]+$//;
$page=~s/[^\/]+\//..\//g;
return $page;
-} #}}}
+}
-sub abs2rel ($$) { #{{{
+sub abs2rel ($$) {
# Work around very innefficient behavior in File::Spec if abs2rel
# is passed two relative paths. It's much faster if paths are
# absolute! (Debian bug #376658; fixed in debian unstable now)
@@ -914,15 +925,15 @@ sub abs2rel ($$) { #{{{
my $ret=File::Spec->abs2rel($path, $base);
$ret=~s/^// if defined $ret;
return $ret;
-} #}}}
+}
-sub displaytime ($;$) { #{{{
+sub displaytime ($;$) {
# Plugins can override this function to mark up the time to
# display.
return '<span class="date">'.formattime(@_).'</span>';
-} #}}}
+}
-sub formattime ($;$) { #{{{
+sub formattime ($;$) {
# Plugins can override this function to format the time.
my $time=shift;
my $format=shift;
@@ -933,25 +944,25 @@ sub formattime ($;$) { #{{{
# strftime doesn't know about encodings, so make sure
# its output is properly treated as utf8
return decode_utf8(POSIX::strftime($format, localtime($time)));
-} #}}}
+}
-sub beautify_urlpath ($) { #{{{
+sub beautify_urlpath ($) {
my $url=shift;
- if ($config{usedirs}) {
- $url =~ s!/index.$config{htmlext}$!/!;
+ # Ensure url is not an empty link, and if necessary,
+ # add ./ to avoid colon confusion.
+ if ($url !~ /^\// && $url !~ /^\.\.?\//) {
+ $url="./$url";
}
- # Ensure url is not an empty link, and
- # if it's relative, make that explicit to avoid colon confusion.
- if ($url !~ /^\//) {
- $url="./$url";
+ if ($config{usedirs}) {
+ $url =~ s!/index.$config{htmlext}$!/!;
}
return $url;
-} #}}}
+}
-sub urlto ($$;$) { #{{{
+sub urlto ($$;$) {
my $to=shift;
my $from=shift;
my $absolute=shift;
@@ -971,9 +982,9 @@ sub urlto ($$;$) { #{{{
my $link = abs2rel($to, dirname(htmlpage($from)));
return beautify_urlpath($link);
-} #}}}
+}
-sub htmllink ($$$;@) { #{{{
+sub htmllink ($$$;@) {
my $lpage=shift; # the page doing the linking
my $page=shift; # the page that will contain the link (different for inline)
my $link=shift;
@@ -1036,9 +1047,9 @@ sub htmllink ($$$;@) { #{{{
}
return "<a href=\"$bestlink\"@attrs>$linktext</a>";
-} #}}}
+}
-sub userlink ($) { #{{{
+sub userlink ($) {
my $user=shift;
my $oiduser=eval { openiduser($user) };
@@ -1053,9 +1064,9 @@ sub userlink ($) { #{{{
length $config{userdir} ? $config{userdir}."/".$user : $user
), noimageinline => 1);
}
-} #}}}
+}
-sub htmlize ($$$$) { #{{{
+sub htmlize ($$$$) {
my $page=shift;
my $destpage=shift;
my $type=shift;
@@ -1090,9 +1101,9 @@ sub htmlize ($$$$) { #{{{
}
return $content;
-} #}}}
+}
-sub linkify ($$$) { #{{{
+sub linkify ($$$) {
my $page=shift;
my $destpage=shift;
my $content=shift;
@@ -1106,11 +1117,11 @@ sub linkify ($$$) { #{{{
});
return $content;
-} #}}}
+}
our %preprocessing;
our $preprocess_preview=0;
-sub preprocess ($$$;$$) { #{{{
+sub preprocess ($$$;$$) {
my $page=shift; # the page the data comes from
my $destpage=shift; # the page the data will appear in (different for inline)
my $content=shift;
@@ -1263,9 +1274,9 @@ sub preprocess ($$$;$$) { #{{{
$content =~ s{$regex}{$handle->($1, $2, $3, $4)}eg;
return $content;
-} #}}}
+}
-sub filter ($$$) { #{{{
+sub filter ($$$) {
my $page=shift;
my $destpage=shift;
my $content=shift;
@@ -1276,15 +1287,15 @@ sub filter ($$$) { #{{{
});
return $content;
-} #}}}
+}
-sub indexlink () { #{{{
+sub indexlink () {
return "<a href=\"$config{url}\">$config{wikiname}</a>";
-} #}}}
+}
my $wikilock;
-sub lockwiki () { #{{{
+sub lockwiki () {
# Take an exclusive lock on the wiki to prevent multiple concurrent
# run issues. The lock will be dropped on program exit.
if (! -d $config{wikistatedir}) {
@@ -1296,17 +1307,17 @@ sub lockwiki () { #{{{
error("failed to get lock");
}
return 1;
-} #}}}
+}
-sub unlockwiki () { #{{{
+sub unlockwiki () {
POSIX::close($ENV{IKIWIKI_CGILOCK_FD}) if exists $ENV{IKIWIKI_CGILOCK_FD};
return close($wikilock) if $wikilock;
return;
-} #}}}
+}
my $commitlock;
-sub commit_hook_enabled () { #{{{
+sub commit_hook_enabled () {
open($commitlock, '+>', "$config{wikistatedir}/commitlock") ||
error("cannot write to $config{wikistatedir}/commitlock: $!");
if (! flock($commitlock, 1 | 4)) { # LOCK_SH | LOCK_NB to test
@@ -1315,23 +1326,23 @@ sub commit_hook_enabled () { #{{{
}
close($commitlock) || error("failed closing commitlock: $!");
return 1;
-} #}}}
+}
-sub disable_commit_hook () { #{{{
+sub disable_commit_hook () {
open($commitlock, '>', "$config{wikistatedir}/commitlock") ||
error("cannot write to $config{wikistatedir}/commitlock: $!");
if (! flock($commitlock, 2)) { # LOCK_EX
error("failed to get commit lock");
}
return 1;
-} #}}}
+}
-sub enable_commit_hook () { #{{{
+sub enable_commit_hook () {
return close($commitlock) if $commitlock;
return;
-} #}}}
+}
-sub loadindex () { #{{{
+sub loadindex () {
%oldrenderedfiles=%pagectime=();
if (! $config{rebuild}) {
%pagesources=%pagemtime=%oldlinks=%links=%depends=
@@ -1391,9 +1402,9 @@ sub loadindex () { #{{{
$destsources{$_}=$page foreach @{$renderedfiles{$page}};
}
return close($in);
-} #}}}
+}
-sub saveindex () { #{{{
+sub saveindex () {
run_hooks(savestate => sub { shift->() });
my %hookids;
@@ -1449,18 +1460,18 @@ sub saveindex () { #{{{
error("failed renaming $newfile to $config{wikistatedir}/indexdb", $cleanup);
return 1;
-} #}}}
+}
-sub template_file ($) { #{{{
+sub template_file ($) {
my $template=shift;
foreach my $dir ($config{templatedir}, "$installdir/share/ikiwiki/templates") {
return "$dir/$template" if -e "$dir/$template";
}
return;
-} #}}}
+}
-sub template_params (@) { #{{{
+sub template_params (@) {
my $filename=template_file(shift);
if (! defined $filename) {
@@ -1479,14 +1490,14 @@ sub template_params (@) { #{{{
@_
);
return wantarray ? @ret : {@ret};
-} #}}}
+}
-sub template ($;@) { #{{{
+sub template ($;@) {
require HTML::Template;
return HTML::Template->new(template_params(@_));
-} #}}}
+}
-sub misctemplate ($$;@) { #{{{
+sub misctemplate ($$;@) {
my $title=shift;
my $pagebody=shift;
@@ -1503,9 +1514,9 @@ sub misctemplate ($$;@) { #{{{
shift->(page => "", destpage => "", template => $template);
});
return $template->output;
-}#}}}
+}
-sub hook (@) { # {{{
+sub hook (@) {
my %param=@_;
if (! exists $param{type} || ! ref $param{call} || ! exists $param{id}) {
@@ -1516,76 +1527,80 @@ sub hook (@) { # {{{
$hooks{$param{type}}{$param{id}}=\%param;
return 1;
-} # }}}
+}
-sub run_hooks ($$) { # {{{
+sub run_hooks ($$) {
# Calls the given sub for each hook of the given type,
# passing it the hook function to call.
my $type=shift;
my $sub=shift;
if (exists $hooks{$type}) {
- my @deferred;
+ my (@first, @middle, @last);
foreach my $id (keys %{$hooks{$type}}) {
- if ($hooks{$type}{$id}{last}) {
- push @deferred, $id;
- next;
+ if ($hooks{$type}{$id}{first}) {
+ push @first, $id;
+ }
+ elsif ($hooks{$type}{$id}{last}) {
+ push @last, $id;
+ }
+ else {
+ push @middle, $id;
}
- $sub->($hooks{$type}{$id}{call});
}
- foreach my $id (@deferred) {
+ foreach my $id (@first, @middle, @last) {
$sub->($hooks{$type}{$id}{call});
}
}
return 1;
-} #}}}
+}
-sub rcs_update () { #{{{
+sub rcs_update () {
$hooks{rcs}{rcs_update}{call}->(@_);
-} #}}}
+}
-sub rcs_prepedit ($) { #{{{
+sub rcs_prepedit ($) {
$hooks{rcs}{rcs_prepedit}{call}->(@_);
-} #}}}
+}
-sub rcs_commit ($$$;$$) { #{{{
+sub rcs_commit ($$$;$$) {
$hooks{rcs}{rcs_commit}{call}->(@_);
-} #}}}
+}
-sub rcs_commit_staged ($$$) { #{{{
+sub rcs_commit_staged ($$$) {
$hooks{rcs}{rcs_commit_staged}{call}->(@_);
-} #}}}
+}
-sub rcs_add ($) { #{{{
+sub rcs_add ($) {
$hooks{rcs}{rcs_add}{call}->(@_);
-} #}}}
+}
-sub rcs_remove ($) { #{{{
+sub rcs_remove ($) {
$hooks{rcs}{rcs_remove}{call}->(@_);
-} #}}}
+}
-sub rcs_rename ($$) { #{{{
+sub rcs_rename ($$) {
$hooks{rcs}{rcs_rename}{call}->(@_);
-} #}}}
+}
-sub rcs_recentchanges ($) { #{{{
+sub rcs_recentchanges ($) {
$hooks{rcs}{rcs_recentchanges}{call}->(@_);
-} #}}}
+}
-sub rcs_diff ($) { #{{{
+sub rcs_diff ($) {
$hooks{rcs}{rcs_diff}{call}->(@_);
-} #}}}
+}
-sub rcs_getctime ($) { #{{{
+sub rcs_getctime ($) {
$hooks{rcs}{rcs_getctime}{call}->(@_);
-} #}}}
+}
-sub rcs_receive () { #{{{
+sub rcs_receive () {
$hooks{rcs}{rcs_receive}{call}->();
-} #}}}
+}
-sub globlist_to_pagespec ($) { #{{{
+sub globlist_to_pagespec ($) {
my @globlist=split(' ', shift);
my (@spec, @skip);
@@ -1609,20 +1624,23 @@ sub globlist_to_pagespec ($) { #{{{
}
}
return $spec;
-} #}}}
+}
-sub is_globlist ($) { #{{{
+sub is_globlist ($) {
my $s=shift;
- return ( $s =~ /[^\s]+\s+([^\s]+)/ && $1 ne "and" && $1 ne "or" );
-} #}}}
+ my $ret= ( $s =~ /[^\s]+\s+([^\s]+)/ && $1 ne "and" && $1 ne "or" );
+ print STDERR "warning: deprecated GlobList style PageSpec \"$s\" will stop working in ikiwiki version 3.0\n"
+ if $ret && $s !~ /TMPL_VAR/; # hack alert
+ return $ret;
+}
-sub safequote ($) { #{{{
+sub safequote ($) {
my $s=shift;
$s=~s/[{}]//g;
return "q{$s}";
-} #}}}
+}
-sub add_depends ($$) { #{{{
+sub add_depends ($$) {
my $page=shift;
my $pagespec=shift;
@@ -1636,9 +1654,9 @@ sub add_depends ($$) { #{{{
}
return 1;
-} # }}}
+}
-sub file_pruned ($$) { #{{{
+sub file_pruned ($$) {
require File::Spec;
my $file=File::Spec->canonpath(shift);
my $base=File::Spec->canonpath(shift);
@@ -1646,9 +1664,9 @@ sub file_pruned ($$) { #{{{
my $regexp='('.join('|', @{$config{wiki_file_prune_regexps}}).')';
return $file =~ m/$regexp/ && $file ne $base;
-} #}}}
+}
-sub gettext { #{{{
+sub gettext {
# Only use gettext in the rare cases it's needed.
if ((exists $ENV{LANG} && length $ENV{LANG}) ||
(exists $ENV{LC_ALL} && length $ENV{LC_ALL}) ||
@@ -1669,15 +1687,15 @@ sub gettext { #{{{
else {
return shift;
}
-} #}}}
+}
-sub yesno ($) { #{{{
+sub yesno ($) {
my $val=shift;
return (defined $val && lc($val) eq gettext("yes"));
-} #}}}
+}
-sub inject { #{{{
+sub inject {
# Injects a new function into the symbol table to replace an
# exported function.
my %params=@_;
@@ -1700,9 +1718,9 @@ sub inject { #{{{
}
use strict;
use warnings;
-} #}}}
+}
-sub pagespec_merge ($$) { #{{{
+sub pagespec_merge ($$) {
my $a=shift;
my $b=shift;
@@ -1717,9 +1735,9 @@ sub pagespec_merge ($$) { #{{{
}
return "($a) or ($b)";
-} #}}}
+}
-sub pagespec_translate ($) { #{{{
+sub pagespec_translate ($) {
my $spec=shift;
# Support for old-style GlobLists.
@@ -1773,9 +1791,9 @@ sub pagespec_translate ($) { #{{{
no warnings;
return eval 'sub { my $page=shift; '.$code.' }';
-} #}}}
+}
-sub pagespec_match ($$;@) { #{{{
+sub pagespec_match ($$;@) {
my $page=shift;
my $spec=shift;
my @params=@_;
@@ -1786,57 +1804,58 @@ sub pagespec_match ($$;@) { #{{{
}
my $sub=pagespec_translate($spec);
- return IkiWiki::FailReason->new("syntax error in pagespec \"$spec\"") if $@;
+ return IkiWiki::FailReason->new("syntax error in pagespec \"$spec\"")
+ if $@ || ! defined $sub;
return $sub->($page, @params);
-} #}}}
+}
-sub pagespec_valid ($) { #{{{
+sub pagespec_valid ($) {
my $spec=shift;
my $sub=pagespec_translate($spec);
return ! $@;
-} #}}}
+}
-sub glob2re ($) { #{{{
+sub glob2re ($) {
my $re=quotemeta(shift);
$re=~s/\\\*/.*/g;
$re=~s/\\\?/./g;
return $re;
-} #}}}
+}
package IkiWiki::FailReason;
-use overload ( #{{{
+use overload (
'""' => sub { ${$_[0]} },
'0+' => sub { 0 },
'!' => sub { bless $_[0], 'IkiWiki::SuccessReason'},
fallback => 1,
-); #}}}
+);
-sub new { #{{{
+sub new {
my $class = shift;
my $value = shift;
return bless \$value, $class;
-} #}}}
+}
package IkiWiki::SuccessReason;
-use overload ( #{{{
+use overload (
'""' => sub { ${$_[0]} },
'0+' => sub { 1 },
'!' => sub { bless $_[0], 'IkiWiki::FailReason'},
fallback => 1,
-); #}}}
+);
-sub new { #{{{
+sub new {
my $class = shift;
my $value = shift;
return bless \$value, $class;
-}; #}}}
+};
package IkiWiki::PageSpec;
-sub match_glob ($$;@) { #{{{
+sub match_glob ($$;@) {
my $page=shift;
my $glob=shift;
my %params=@_;
@@ -1862,13 +1881,13 @@ sub match_glob ($$;@) { #{{{
else {
return IkiWiki::FailReason->new("$glob does not match $page");
}
-} #}}}
+}
-sub match_internal ($$;@) { #{{{
+sub match_internal ($$;@) {
return match_glob($_[0], $_[1], @_, internal => 1)
-} #}}}
+}
-sub match_link ($$;@) { #{{{
+sub match_link ($$;@) {
my $page=shift;
my $link=lc(shift);
my %params=@_;
@@ -1900,13 +1919,13 @@ sub match_link ($$;@) { #{{{
}
}
return IkiWiki::FailReason->new("$page does not link to $link");
-} #}}}
+}
-sub match_backlink ($$;@) { #{{{
+sub match_backlink ($$;@) {
return match_link($_[1], $_[0], @_);
-} #}}}
+}
-sub match_created_before ($$;@) { #{{{
+sub match_created_before ($$;@) {
my $page=shift;
my $testpage=shift;
@@ -1921,9 +1940,9 @@ sub match_created_before ($$;@) { #{{{
else {
return IkiWiki::FailReason->new("$testpage has no ctime");
}
-} #}}}
+}
-sub match_created_after ($$;@) { #{{{
+sub match_created_after ($$;@) {
my $page=shift;
my $testpage=shift;
@@ -1938,36 +1957,36 @@ sub match_created_after ($$;@) { #{{{
else {
return IkiWiki::FailReason->new("$testpage has no ctime");
}
-} #}}}
+}
-sub match_creation_day ($$;@) { #{{{
+sub match_creation_day ($$;@) {
if ((gmtime($IkiWiki::pagectime{shift()}))[3] == shift) {
return IkiWiki::SuccessReason->new('creation_day matched');
}
else {
return IkiWiki::FailReason->new('creation_day did not match');
}
-} #}}}
+}
-sub match_creation_month ($$;@) { #{{{
+sub match_creation_month ($$;@) {
if ((gmtime($IkiWiki::pagectime{shift()}))[4] + 1 == shift) {
return IkiWiki::SuccessReason->new('creation_month matched');
}
else {
return IkiWiki::FailReason->new('creation_month did not match');
}
-} #}}}
+}
-sub match_creation_year ($$;@) { #{{{
+sub match_creation_year ($$;@) {
if ((gmtime($IkiWiki::pagectime{shift()}))[5] + 1900 == shift) {
return IkiWiki::SuccessReason->new('creation_year matched');
}
else {
return IkiWiki::FailReason->new('creation_year did not match');
}
-} #}}}
+}
-sub match_user ($$;@) { #{{{
+sub match_user ($$;@) {
shift;
my $user=shift;
my %params=@_;
@@ -1985,9 +2004,9 @@ sub match_user ($$;@) { #{{{
else {
return IkiWiki::FailReason->new("user is $params{user}, not $user");
}
-} #}}}
+}
-sub match_admin ($$;@) { #{{{
+sub match_admin ($$;@) {
shift;
shift;
my %params=@_;
@@ -2005,9 +2024,9 @@ sub match_admin ($$;@) { #{{{
else {
return IkiWiki::FailReason->new("user is not an admin");
}
-} #}}}
+}
-sub match_ip ($$;@) { #{{{
+sub match_ip ($$;@) {
shift;
my $ip=shift;
my %params=@_;
@@ -2022,6 +2041,6 @@ sub match_ip ($$;@) { #{{{
else {
return IkiWiki::FailReason->new("IP is $params{ip}, not $ip");
}
-} #}}}
+}
1
diff --git a/IkiWiki/CGI.pm b/IkiWiki/CGI.pm
index 4399d0dcb..81cb42d13 100644
--- a/IkiWiki/CGI.pm
+++ b/IkiWiki/CGI.pm
@@ -9,7 +9,7 @@ use IkiWiki::UserInfo;
use open qw{:utf8 :std};
use Encode;
-sub printheader ($) { #{{{
+sub printheader ($) {
my $session=shift;
if ($config{sslcookie}) {
@@ -19,9 +19,9 @@ sub printheader ($) { #{{{
print $session->header(-charset => 'utf-8',
-cookie => $session->cookie(-httponly => 1));
}
-} #}}}
+}
-sub showform ($$$$;@) { #{{{
+sub showform ($$$$;@) {
my $form=shift;
my $buttons=shift;
my $session=shift;
@@ -38,7 +38,7 @@ sub showform ($$$$;@) { #{{{
print misctemplate($form->title, $form->render(submit => $buttons), @_);
}
-sub redirect ($$) { #{{{
+sub redirect ($$) {
my $q=shift;
my $url=shift;
if (! $config{w3mmode}) {
@@ -48,9 +48,9 @@ sub redirect ($$) { #{{{
print "Content-type: text/plain\n";
print "W3m-control: GOTO $url\n\n";
}
-} #}}}
+}
-sub decode_cgi_utf8 ($) { #{{{
+sub decode_cgi_utf8 ($) {
# decode_form_utf8 method is needed for 5.10
if ($] < 5.01) {
my $cgi = shift;
@@ -58,9 +58,9 @@ sub decode_cgi_utf8 ($) { #{{{
$cgi->param($f, map { decode_utf8 $_ } $cgi->param($f));
}
}
-} #}}}
+}
-sub decode_form_utf8 ($) { #{{{
+sub decode_form_utf8 ($) {
if ($] >= 5.01) {
my $form = shift;
foreach my $f ($form->field) {
@@ -70,11 +70,11 @@ sub decode_form_utf8 ($) { #{{{
);
}
}
-} #}}}
+}
# Check if the user is signed in. If not, redirect to the signin form and
# save their place to return to later.
-sub needsignin ($$) { #{{{
+sub needsignin ($$) {
my $q=shift;
my $session=shift;
@@ -85,9 +85,9 @@ sub needsignin ($$) { #{{{
cgi_savesession($session);
exit;
}
-} #}}}
+}
-sub cgi_signin ($$) { #{{{
+sub cgi_signin ($$) {
my $q=shift;
my $session=shift;
@@ -127,9 +127,9 @@ sub cgi_signin ($$) { #{{{
}
showform($form, $buttons, $session, $q);
-} #}}}
+}
-sub cgi_postsignin ($$) { #{{{
+sub cgi_postsignin ($$) {
my $q=shift;
my $session=shift;
@@ -144,9 +144,9 @@ sub cgi_postsignin ($$) { #{{{
else {
error(gettext("login failed, perhaps you need to turn on cookies?"));
}
-} #}}}
+}
-sub cgi_prefs ($$) { #{{{
+sub cgi_prefs ($$) {
my $q=shift;
my $session=shift;
@@ -254,9 +254,9 @@ sub cgi_prefs ($$) { #{{{
}
showform($form, $buttons, $session, $q);
-} #}}}
+}
-sub check_banned ($$) { #{{{
+sub check_banned ($$) {
my $q=shift;
my $session=shift;
@@ -275,7 +275,7 @@ sub check_banned ($$) { #{{{
}
}
-sub cgi_getsession ($) { #{{{
+sub cgi_getsession ($) {
my $q=shift;
eval q{use CGI::Session; use HTML::Entities};
@@ -294,18 +294,34 @@ sub cgi_getsession ($) { #{{{
umask($oldmask);
return $session;
-} #}}}
+}
-sub cgi_savesession ($) { #{{{
+# To guard against CSRF, the user's session id (sid)
+# can be stored on a form. This function will check
+# (for logged in users) that the sid on the form matches
+# the session id in the cookie.
+sub checksessionexpiry ($$) {
+ my $q=shift;
+ my $session = shift;
+
+ if (defined $session->param("name")) {
+ my $sid=$q->param('sid');
+ if (! defined $sid || $sid ne $session->id) {
+ error(gettext("Your login session has expired."));
+ }
+ }
+}
+
+sub cgi_savesession ($) {
my $session=shift;
# Force session flush with safe umask.
my $oldmask=umask(077);
$session->flush;
umask($oldmask);
-} #}}}
+}
-sub cgi (;$$) { #{{{
+sub cgi (;$$) {
my $q=shift;
my $session=shift;
@@ -375,16 +391,16 @@ sub cgi (;$$) { #{{{
else {
error("unknown do parameter");
}
-} #}}}
+}
# Does not need to be called directly; all errors will go through here.
-sub cgierror ($) { #{{{
+sub cgierror ($) {
my $message=shift;
print "Content-type: text/html\n\n";
print misctemplate(gettext("Error"),
"<p class=\"error\">".gettext("Error").": $message</p>");
die $@;
-} #}}}
+}
1
diff --git a/IkiWiki/Plugin/aggregate.pm b/IkiWiki/Plugin/aggregate.pm
index c9c2880c5..97dd036f6 100644
--- a/IkiWiki/Plugin/aggregate.pm
+++ b/IkiWiki/Plugin/aggregate.pm
@@ -14,7 +14,7 @@ use open qw{:utf8 :std};
my %feeds;
my %guids;
-sub import { #{{{
+sub import {
hook(type => "getopt", id => "aggregate", call => \&getopt);
hook(type => "getsetup", id => "aggregate", call => \&getsetup);
hook(type => "checkconfig", id => "aggregate", call => \&checkconfig);
@@ -26,9 +26,9 @@ sub import { #{{{
if (exists $config{aggregate_webtrigger} && $config{aggregate_webtrigger}) {
hook(type => "cgi", id => "aggregate", call => \&cgi);
}
-} # }}}
+}
-sub getopt () { #{{{
+sub getopt () {
eval q{use Getopt::Long};
error($@) if $@;
Getopt::Long::Configure('pass_through');
@@ -36,9 +36,9 @@ sub getopt () { #{{{
"aggregate" => \$config{aggregate},
"aggregateinternal!" => \$config{aggregateinternal},
);
-} #}}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 1,
@@ -58,16 +58,16 @@ sub getsetup () { #{{{
safe => 1,
rebuild => 0,
},
-} #}}}
+}
-sub checkconfig () { #{{{
+sub checkconfig () {
if ($config{aggregate} && ! ($config{post_commit} &&
IkiWiki::commit_hook_enabled())) {
launchaggregation();
}
-} #}}}
+}
-sub cgi ($) { #{{{
+sub cgi ($) {
my $cgi=shift;
if (defined $cgi->param('do') &&
@@ -90,9 +90,9 @@ sub cgi ($) { #{{{
}
exit 0;
}
-} #}}}
+}
-sub launchaggregation () { #{{{
+sub launchaggregation () {
# See if any feeds need aggregation.
loadstate();
my @feeds=needsaggregate();
@@ -135,16 +135,16 @@ sub launchaggregation () { #{{{
unlockaggregate();
return 1;
-} #}}}
+}
# Pages with extension _aggregated have plain html markup, pass through.
-sub htmlize (@) { #{{{
+sub htmlize (@) {
my %params=@_;
return $params{content};
-} #}}}
+}
# Used by ikiwiki-transition aggregateinternal.
-sub migrate_to_internal { #{{{
+sub migrate_to_internal {
if (! lockaggregate()) {
error("an aggregation process is currently running");
}
@@ -190,9 +190,9 @@ sub migrate_to_internal { #{{{
IkiWiki::unlockwiki;
unlockaggregate();
-} #}}}
+}
-sub needsbuild (@) { #{{{
+sub needsbuild (@) {
my $needsbuild=shift;
loadstate();
@@ -206,9 +206,9 @@ sub needsbuild (@) { #{{{
markunseen($feed->{sourcepage});
}
}
-} # }}}
+}
-sub preprocess (@) { #{{{
+sub preprocess (@) {
my %params=@_;
foreach my $required (qw{name url}) {
@@ -245,6 +245,7 @@ sub preprocess (@) { #{{{
$feed->{template}=$params{template} . ".tmpl";
delete $feed->{unseen};
$feed->{lastupdate}=0 unless defined $feed->{lastupdate};
+ $feed->{lasttry}=$feed->{lastupdate} unless defined $feed->{lasttry};
$feed->{numposts}=0 unless defined $feed->{numposts};
$feed->{newposts}=0 unless defined $feed->{newposts};
$feed->{message}=gettext("new feed") unless defined $feed->{message};
@@ -265,9 +266,9 @@ sub preprocess (@) { #{{{
($feed->{newposts} ? "; ".$feed->{newposts}.
" ".gettext("new") : "").
")";
-} # }}}
+}
-sub delete (@) { #{{{
+sub delete (@) {
my @files=@_;
# Remove feed data for removed pages.
@@ -275,9 +276,9 @@ sub delete (@) { #{{{
my $page=pagename($file);
markunseen($page);
}
-} #}}}
+}
-sub markunseen ($) { #{{{
+sub markunseen ($) {
my $page=shift;
foreach my $id (keys %feeds) {
@@ -285,11 +286,11 @@ sub markunseen ($) { #{{{
$feeds{$id}->{unseen}=1;
}
}
-} #}}}
+}
my $state_loaded=0;
-sub loadstate () { #{{{
+sub loadstate () {
return if $state_loaded;
$state_loaded=1;
if (-e "$config{wikistatedir}/aggregate") {
@@ -323,9 +324,9 @@ sub loadstate () { #{{{
close IN;
}
-} #}}}
+}
-sub savestate () { #{{{
+sub savestate () {
return unless $state_loaded;
garbage_collect();
my $newfile="$config{wikistatedir}/aggregate.new";
@@ -342,7 +343,8 @@ sub savestate () { #{{{
push @line, "tag=$_" foreach @{$data->{tags}};
}
else {
- push @line, "$field=".$data->{$field};
+ push @line, "$field=".$data->{$field}
+ if defined $data->{$field};
}
}
print OUT join(" ", @line)."\n" || error("write $newfile: $!", $cleanup);
@@ -350,9 +352,9 @@ sub savestate () { #{{{
close OUT || error("save $newfile: $!", $cleanup);
rename($newfile, "$config{wikistatedir}/aggregate") ||
error("rename $newfile: $!", $cleanup);
-} #}}}
+}
-sub garbage_collect () { #{{{
+sub garbage_collect () {
foreach my $name (keys %feeds) {
# remove any feeds that were not seen while building the pages
# that used to contain them
@@ -375,9 +377,9 @@ sub garbage_collect () { #{{{
delete $guid->{md5};
}
}
-} #}}}
+}
-sub mergestate () { #{{{
+sub mergestate () {
# Load the current state in from disk, and merge into it
# values from the state in memory that might have changed
# during aggregation.
@@ -390,8 +392,8 @@ sub mergestate () { #{{{
# fields.
foreach my $name (keys %myfeeds) {
if (exists $feeds{$name}) {
- foreach my $field (qw{message lastupdate numposts
- newposts error}) {
+ foreach my $field (qw{message lastupdate lasttry
+ numposts newposts error}) {
$feeds{$name}->{$field}=$myfeeds{$name}->{$field};
}
}
@@ -407,15 +409,15 @@ sub mergestate () { #{{{
$guids{$guid}=$myguids{$guid};
}
}
-} #}}}
+}
-sub clearstate () { #{{{
+sub clearstate () {
%feeds=();
%guids=();
$state_loaded=0;
-} #}}}
+}
-sub expire () { #{{{
+sub expire () {
foreach my $feed (values %feeds) {
next unless $feed->{expireage} || $feed->{expirecount};
my $count=0;
@@ -444,24 +446,24 @@ sub expire () { #{{{
}
}
}
-} #}}}
+}
-sub needsaggregate () { #{{{
+sub needsaggregate () {
return values %feeds if $config{rebuild};
return grep { time - $_->{lastupdate} >= $_->{updateinterval} } values %feeds;
-} #}}}
+}
-sub aggregate (@) { #{{{
+sub aggregate (@) {
eval q{use XML::Feed};
error($@) if $@;
eval q{use URI::Fetch};
error($@) if $@;
foreach my $feed (@_) {
- $feed->{lastupdate}=time;
+ $feed->{lasttry}=time;
$feed->{newposts}=0;
$feed->{message}=sprintf(gettext("last checked %s"),
- displaytime($feed->{lastupdate}));
+ displaytime($feed->{lasttry}));
$feed->{error}=0;
debug(sprintf(gettext("checking feed %s ..."), $feed->{name}));
@@ -483,6 +485,10 @@ sub aggregate (@) { #{{{
debug($feed->{message});
next;
}
+
+ # lastupdate is only set if we were able to contact the server
+ $feed->{lastupdate}=$feed->{lasttry};
+
if ($res->status == URI::Fetch::URI_GONE()) {
$feed->{message}=gettext("feed not found");
$feed->{error}=1;
@@ -496,15 +502,19 @@ sub aggregate (@) { #{{{
# that contains invalid UTF-8 sequences. Convert
# feed to ascii to try to work around.
$feed->{message}.=" ".sprintf(gettext("(invalid UTF-8 stripped from feed)"));
- $content=Encode::decode_utf8($content, 0);
- $f=eval{XML::Feed->parse(\$content)};
+ $f=eval {
+ $content=Encode::decode_utf8($content, 0);
+ XML::Feed->parse(\$content)
+ };
}
if ($@) {
# Another possibility is badly escaped entities.
$feed->{message}.=" ".sprintf(gettext("(feed entities escaped)"));
$content=~s/\&(?!amp)(\w+);/&amp;$1;/g;
- $content=Encode::decode_utf8($content, 0);
- $f=eval{XML::Feed->parse(\$content)};
+ $f=eval {
+ $content=Encode::decode_utf8($content, 0);
+ XML::Feed->parse(\$content)
+ };
}
if ($@) {
$feed->{message}=gettext("feed crashed XML::Feed!")." ($@)";
@@ -531,16 +541,16 @@ sub aggregate (@) { #{{{
copyright => $f->copyright,
title => defined $entry->title ? decode_entities($entry->title) : "untitled",
link => $entry->link,
- content => defined $c ? $c->body : "",
+ content => (defined $c && defined $c->body) ? $c->body : "",
guid => defined $entry->id ? $entry->id : time."_".$feed->{name},
ctime => $entry->issued ? ($entry->issued->epoch || time) : time,
base => (defined $c && $c->can("base")) ? $c->base : undef,
);
}
}
-} #}}}
+}
-sub add_page (@) { #{{{
+sub add_page (@) {
my %params=@_;
my $feed=$params{feed};
@@ -606,7 +616,7 @@ sub add_page (@) { #{{{
my $template=template($feed->{template}, blind_cache => 1);
$template->param(title => $params{title})
if defined $params{title} && length($params{title});
- $template->param(content => htmlescape(htmlabs($params{content},
+ $template->param(content => wikiescape(htmlabs($params{content},
defined $params{base} ? $params{base} : $feed->{feedurl})));
$template->param(name => $feed->{name});
$template->param(url => $feed->{url});
@@ -631,23 +641,21 @@ sub add_page (@) { #{{{
# Dummy value for expiry code.
$IkiWiki::pagectime{$guid->{page}}=time;
}
-} #}}}
+}
-sub htmlescape ($) { #{{{
+sub wikiescape ($) {
# escape accidental wikilinks and preprocessor stuff
- my $html=shift;
- $html=~s/(?<!\\)\[\[/\\\[\[/g;
- return $html;
-} #}}}
+ return encode_entities(shift, '\[\]');
+}
-sub urlabs ($$) { #{{{
+sub urlabs ($$) {
my $url=shift;
my $urlbase=shift;
URI->new_abs($url, $urlbase)->as_string;
-} #}}}
+}
-sub htmlabs ($$) { #{{{
+sub htmlabs ($$) {
# Convert links in html from relative to absolute.
# Note that this is a heuristic, which is not specified by the rss
# spec and may not be right for all feeds. Also, see Debian
@@ -683,15 +691,15 @@ sub htmlabs ($$) { #{{{
$p->eof;
return $ret;
-} #}}}
+}
-sub htmlfn ($) { #{{{
+sub htmlfn ($) {
return shift().".".($config{aggregateinternal} ? "_aggregated" : $config{htmlext});
-} #}}}
+}
my $aggregatelock;
-sub lockaggregate () { #{{{
+sub lockaggregate () {
# Take an exclusive lock to prevent multiple concurrent aggregators.
# Returns true if the lock was aquired.
if (! -d $config{wikistatedir}) {
@@ -704,11 +712,11 @@ sub lockaggregate () { #{{{
return 0;
}
return 1;
-} #}}}
+}
-sub unlockaggregate () { #{{{
+sub unlockaggregate () {
return close($aggregatelock) if $aggregatelock;
return;
-} #}}}
+}
1
diff --git a/IkiWiki/Plugin/amazon_s3.pm b/IkiWiki/Plugin/amazon_s3.pm
index 597539c13..93c10b629 100644
--- a/IkiWiki/Plugin/amazon_s3.pm
+++ b/IkiWiki/Plugin/amazon_s3.pm
@@ -16,13 +16,13 @@ BEGIN {
}
};
-sub import { #{{{
+sub import {
hook(type => "getopt", id => "amazon_s3", call => \&getopt);
hook(type => "getsetup", id => "amazon_s3", call => \&getsetup);
hook(type => "checkconfig", id => "amazon_s3", call => \&checkconfig);
-} # }}}
+}
-sub getopt () { #{{{
+sub getopt () {
eval q{use Getopt::Long};
error($@) if $@;
Getopt::Long::Configure('pass_through');
@@ -38,9 +38,9 @@ sub getopt () { #{{{
debug(gettext("done"));
exit(0);
});
-} #}}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 0,
@@ -88,9 +88,9 @@ sub getsetup () { #{{{
safe => 1,
rebuild => 1,
},
-} #}}}
+}
-sub checkconfig { #{{{
+sub checkconfig {
foreach my $field (qw{amazon_s3_key_id amazon_s3_key_file
amazon_s3_bucket}) {
if (! exists $config{$field} || ! defined $config{$field}) {
@@ -101,11 +101,11 @@ sub checkconfig { #{{{
! defined $config{amazon_s3_prefix}) {
$config{amazon_s3_prefix}="wiki/";
}
-} #}}}
+}
{
my $bucket;
-sub getbucket { #{{{
+sub getbucket {
return $bucket if defined $bucket;
open(IN, "<", $config{amazon_s3_key_file}) || error($config{amazon_s3_key_file}.": ".$!);
@@ -138,11 +138,11 @@ sub getbucket { #{{{
}
return $bucket;
-} #}}}
+}
}
# Given a file, return any S3 keys associated with it.
-sub file2keys ($) { #{{{
+sub file2keys ($) {
my $file=shift;
my @keys;
@@ -162,14 +162,14 @@ sub file2keys ($) { #{{{
}
}
return @keys;
-} #}}}
+}
package IkiWiki;
use File::MimeInfo;
use Encode;
# This is a wrapper around the real writefile.
-sub writefile ($$$;$$) { #{{{
+sub writefile ($$$;$$) {
my $file=shift;
my $destdir=shift;
my $content=shift;
@@ -225,10 +225,10 @@ sub writefile ($$$;$$) { #{{{
}
return $ret;
-} #}}}
+}
# This is a wrapper around the real prune.
-sub prune ($) { #{{{
+sub prune ($) {
my $file=shift;
my @keys=IkiWiki::Plugin::amazon_s3::file2keys($file);
@@ -247,6 +247,6 @@ sub prune ($) { #{{{
}
return $IkiWiki::Plugin::amazon_s3::subs{'IkiWiki::prune'}->($file);
-} #}}}
+}
1
diff --git a/IkiWiki/Plugin/anonok.pm b/IkiWiki/Plugin/anonok.pm
index 2be983693..1cbdfe4e5 100644
--- a/IkiWiki/Plugin/anonok.pm
+++ b/IkiWiki/Plugin/anonok.pm
@@ -5,12 +5,12 @@ use warnings;
use strict;
use IkiWiki 2.00;
-sub import { #{{{
+sub import {
hook(type => "getsetup", id => "anonok", call => \&getsetup);
hook(type => "canedit", id => "anonok", call => \&canedit);
-} # }}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 1,
@@ -24,9 +24,9 @@ sub getsetup () { #{{{
safe => 1,
rebuild => 0,
},
-} #}}}
+}
-sub canedit ($$$) { #{{{
+sub canedit ($$$) {
my $page=shift;
my $cgi=shift;
my $session=shift;
@@ -45,6 +45,6 @@ sub canedit ($$$) { #{{{
else {
return "";
}
-} #}}}
+}
1
diff --git a/IkiWiki/Plugin/attachment.pm b/IkiWiki/Plugin/attachment.pm
index 44781165c..87da6cd4e 100644
--- a/IkiWiki/Plugin/attachment.pm
+++ b/IkiWiki/Plugin/attachment.pm
@@ -5,16 +5,16 @@ use warnings;
use strict;
use IkiWiki 2.00;
-sub import { #{{{
+sub import {
add_underlay("javascript");
hook(type => "getsetup", id => "attachment", call => \&getsetup);
hook(type => "checkconfig", id => "attachment", call => \&checkconfig);
hook(type => "formbuilder_setup", id => "attachment", call => \&formbuilder_setup);
hook(type => "formbuilder", id => "attachment", call => \&formbuilder);
IkiWiki::loadplugin("filecheck");
-} # }}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 1,
@@ -35,9 +35,9 @@ sub getsetup () { #{{{
safe => 0, # executed
rebuild => 0,
},
-} #}}}
+}
-sub check_canattach ($$;$) { #{{{
+sub check_canattach ($$;$) {
my $session=shift;
my $dest=shift; # where it's going to be put, under the srcdir
my $file=shift; # the path to the attachment currently
@@ -84,13 +84,13 @@ sub check_canattach ($$;$) { #{{{
else {
return 1;
}
-} #}}}
+}
-sub checkconfig () { #{{{
+sub checkconfig () {
$config{cgi_disable_uploads}=0;
-} #}}}
+}
-sub formbuilder_setup (@) { #{{{
+sub formbuilder_setup (@) {
my %params=@_;
my $form=$params{form};
my $q=$params{cgi};
@@ -153,9 +153,9 @@ sub formbuilder_setup (@) { #{{{
}
}
}
-} #}}}
+}
-sub formbuilder (@) { #{{{
+sub formbuilder (@) {
my %params=@_;
my $form=$params{form};
my $q=$params{cgi};
@@ -253,9 +253,9 @@ sub formbuilder (@) { #{{{
# Generate the attachment list only after having added any new
# attachments.
$form->tmpl_param("attachment_list" => [attachment_list($form->field('page'))]);
-} # }}}
+}
-sub attachment_location ($) { #{{{
+sub attachment_location ($) {
my $page=shift;
# Put the attachment in a subdir of the page it's attached
@@ -264,9 +264,9 @@ sub attachment_location ($) { #{{{
$page.="/" if length $page;
return $page;
-} #}}}
+}
-sub attachment_list ($) { #{{{
+sub attachment_list ($) {
my $page=shift;
my $loc=attachment_location($page);
@@ -287,6 +287,6 @@ sub attachment_list ($) { #{{{
# Sort newer attachments to the top of the list, so a newly-added
# attachment appears just before the form used to add it.
return sort { $b->{mtime_raw} <=> $a->{mtime_raw} || $a->{link} cmp $b->{link} } @ret;
-} #}}}
+}
1
diff --git a/IkiWiki/Plugin/autoindex.pm b/IkiWiki/Plugin/autoindex.pm
index d1b3edb1f..bb08091ae 100644
--- a/IkiWiki/Plugin/autoindex.pm
+++ b/IkiWiki/Plugin/autoindex.pm
@@ -6,20 +6,20 @@ use strict;
use IkiWiki 2.00;
use Encode;
-sub import { #{{{
+sub import {
hook(type => "getsetup", id => "autoindex", call => \&getsetup);
hook(type => "refresh", id => "autoindex", call => \&refresh);
-} # }}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 1,
rebuild => 0,
},
-} #}}}
+}
-sub genindex ($) { #{{{
+sub genindex ($) {
my $page=shift;
my $file=newpagefile($page, $config{default_pageext});
my $template=template("autoindex.tmpl");
@@ -28,9 +28,9 @@ sub genindex ($) { #{{{
if ($config{rcs}) {
IkiWiki::rcs_add($file);
}
-} #}}}
+}
-sub refresh () { #{{{
+sub refresh () {
eval q{use File::Find};
error($@) if $@;
@@ -107,6 +107,6 @@ sub refresh () { #{{{
IkiWiki::enable_commit_hook();
}
}
-} #}}}
+}
1
diff --git a/IkiWiki/Plugin/brokenlinks.pm b/IkiWiki/Plugin/brokenlinks.pm
index 37752dd3e..1c52099bf 100644
--- a/IkiWiki/Plugin/brokenlinks.pm
+++ b/IkiWiki/Plugin/brokenlinks.pm
@@ -6,20 +6,20 @@ use warnings;
use strict;
use IkiWiki 2.00;
-sub import { #{{{
+sub import {
hook(type => "getsetup", id => "brokenlinks", call => \&getsetup);
hook(type => "preprocess", id => "brokenlinks", call => \&preprocess);
-} # }}}
+}
-sub getsetup { #{{{
+sub getsetup {
return
plugin => {
safe => 1,
rebuild => undef,
},
-} #}}}
+}
-sub preprocess (@) { #{{{
+sub preprocess (@) {
my %params=@_;
$params{pages}="*" unless defined $params{pages};
@@ -61,6 +61,6 @@ sub preprocess (@) { #{{{
}
sort @broken)
."</ul>\n";
-} # }}}
+}
1
diff --git a/IkiWiki/Plugin/bzr.pm b/IkiWiki/Plugin/bzr.pm
index 1054f5b3e..16c959069 100644
--- a/IkiWiki/Plugin/bzr.pm
+++ b/IkiWiki/Plugin/bzr.pm
@@ -7,7 +7,7 @@ use IkiWiki;
use Encode;
use open qw{:utf8 :std};
-sub import { #{{{
+sub import {
hook(type => "checkconfig", id => "bzr", call => \&checkconfig);
hook(type => "getsetup", id => "bzr", call => \&getsetup);
hook(type => "rcs", id => "rcs_update", call => \&rcs_update);
@@ -20,18 +20,18 @@ sub import { #{{{
hook(type => "rcs", id => "rcs_recentchanges", call => \&rcs_recentchanges);
hook(type => "rcs", id => "rcs_diff", call => \&rcs_diff);
hook(type => "rcs", id => "rcs_getctime", call => \&rcs_getctime);
-} #}}}
+}
-sub checkconfig () { #{{{
+sub checkconfig () {
if (defined $config{bzr_wrapper} && length $config{bzr_wrapper}) {
push @{$config{wrappers}}, {
wrapper => $config{bzr_wrapper},
wrappermode => (defined $config{bzr_wrappermode} ? $config{bzr_wrappermode} : "06755"),
};
}
-} #}}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 0, # rcs plugin
@@ -65,9 +65,9 @@ sub getsetup () { #{{{
safe => 1,
rebuild => 1,
},
-} #}}}
+}
-sub bzr_log ($) { #{{{
+sub bzr_log ($) {
my $out = shift;
my @infos = ();
my $key = undef;
@@ -99,20 +99,20 @@ sub bzr_log ($) { #{{{
close $out;
return @infos;
-} #}}}
+}
-sub rcs_update () { #{{{
+sub rcs_update () {
my @cmdline = ("bzr", "update", "--quiet", $config{srcdir});
if (system(@cmdline) != 0) {
warn "'@cmdline' failed: $!";
}
-} #}}}
+}
-sub rcs_prepedit ($) { #{{{
+sub rcs_prepedit ($) {
return "";
-} #}}}
+}
-sub bzr_author ($$) { #{{{
+sub bzr_author ($$) {
my ($user, $ipaddr) = @_;
if (defined $user) {
@@ -124,9 +124,9 @@ sub bzr_author ($$) { #{{{
else {
return "Anonymous";
}
-} #}}}
+}
-sub rcs_commit ($$$;$$) { #{{{
+sub rcs_commit ($$$;$$) {
my ($file, $message, $rcstoken, $user, $ipaddr) = @_;
$user = bzr_author($user, $ipaddr);
@@ -143,7 +143,7 @@ sub rcs_commit ($$$;$$) { #{{{
}
return undef; # success
-} #}}}
+}
sub rcs_commit_staged ($$$) {
# Commits all staged changes. Changes can be staged using rcs_add,
@@ -164,27 +164,27 @@ sub rcs_commit_staged ($$$) {
}
return undef; # success
-} #}}}
+}
-sub rcs_add ($) { # {{{
+sub rcs_add ($) {
my ($file) = @_;
my @cmdline = ("bzr", "add", "--quiet", "$config{srcdir}/$file");
if (system(@cmdline) != 0) {
warn "'@cmdline' failed: $!";
}
-} #}}}
+}
-sub rcs_remove ($) { # {{{
+sub rcs_remove ($) {
my ($file) = @_;
my @cmdline = ("bzr", "rm", "--force", "--quiet", "$config{srcdir}/$file");
if (system(@cmdline) != 0) {
warn "'@cmdline' failed: $!";
}
-} #}}}
+}
-sub rcs_rename ($$) { # {{{
+sub rcs_rename ($$) {
my ($src, $dest) = @_;
my $parent = IkiWiki::dirname($dest);
@@ -196,9 +196,9 @@ sub rcs_rename ($$) { # {{{
if (system(@cmdline) != 0) {
warn "'@cmdline' failed: $!";
}
-} #}}}
+}
-sub rcs_recentchanges ($) { #{{{
+sub rcs_recentchanges ($) {
my ($num) = @_;
my @cmdline = ("bzr", "log", "-v", "--show-ids", "--limit", $num,
@@ -253,9 +253,9 @@ sub rcs_recentchanges ($) { #{{{
}
return @ret;
-} #}}}
+}
-sub rcs_getctime ($) { #{{{
+sub rcs_getctime ($) {
my ($file) = @_;
# XXX filename passes through the shell here, should try to avoid
@@ -274,6 +274,6 @@ sub rcs_getctime ($) { #{{{
my $ctime = str2time($log[0]->{"timestamp"});
return $ctime;
-} #}}}
+}
1
diff --git a/IkiWiki/Plugin/calendar.pm b/IkiWiki/Plugin/calendar.pm
index 6d536a91b..88303fc44 100644
--- a/IkiWiki/Plugin/calendar.pm
+++ b/IkiWiki/Plugin/calendar.pm
@@ -29,13 +29,13 @@ my %linkcache;
my $time=time;
my @now=localtime($time);
-sub import { #{{{
+sub import {
hook(type => "getsetup", id => "calendar", call => \&getsetup);
hook(type => "needsbuild", id => "calendar", call => \&needsbuild);
hook(type => "preprocess", id => "calendar", call => \&preprocess);
-} #}}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 1,
@@ -48,23 +48,23 @@ sub getsetup () { #{{{
safe => 1,
rebuild => 1,
},
-} #}}}
+}
-sub is_leap_year (@) { #{{{
+sub is_leap_year (@) {
my %params=@_;
return ($params{year} % 4 == 0 && (($params{year} % 100 != 0) || $params{year} % 400 == 0));
-} #}}}
+}
-sub month_days { #{{{
+sub month_days {
my %params=@_;
my $days_in_month = (31,28,31,30,31,30,31,31,30,31,30,31)[$params{month}-1];
if ($params{month} == 2 && is_leap_year(%params)) {
$days_in_month++;
}
return $days_in_month;
-} #}}}
+}
-sub format_month (@) { #{{{
+sub format_month (@) {
my %params=@_;
my $pagespec = $params{pages};
@@ -215,9 +215,9 @@ EOF
add_depends($params{page}, join(" or ", @list));
return $calendar;
-} #}}}
+}
-sub format_year (@) { #{{{
+sub format_year (@) {
my %params=@_;
my $pagespec = $params{pages};
@@ -318,9 +318,9 @@ EOF
EOF
return $calendar;
-} #}}}
+}
-sub preprocess (@) { #{{{
+sub preprocess (@) {
my %params=@_;
$params{pages} = "*" unless defined $params{pages};
$params{type} = "month" unless defined $params{type};
@@ -397,7 +397,7 @@ sub preprocess (@) { #{{{
return "\n<div><div class=\"calendar\">$calendar</div></div>\n";
} #}}
-sub needsbuild (@) { #{{{
+sub needsbuild (@) {
my $needsbuild=shift;
foreach my $page (keys %pagestate) {
if (exists $pagestate{$page}{calendar}{nextchange}) {
@@ -415,6 +415,6 @@ sub needsbuild (@) { #{{{
}
}
}
-} # }}}
+}
1
diff --git a/IkiWiki/Plugin/camelcase.pm b/IkiWiki/Plugin/camelcase.pm
index 7881becd5..f9ee30fe2 100644
--- a/IkiWiki/Plugin/camelcase.pm
+++ b/IkiWiki/Plugin/camelcase.pm
@@ -22,40 +22,52 @@ my $link_regexp=qr{
)
}x;
-sub import { #{{{
+sub import {
hook(type => "getsetup", id => "camelcase", call => \&getsetup);
hook(type => "linkify", id => "camelcase", call => \&linkify);
hook(type => "scan", id => "camelcase", call => \&scan);
-} # }}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 1,
rebuild => undef,
- };
-} #}}}
+ },
+ camelcase_ignore => {
+ type => "string",
+ example => [],
+ description => "list of words to not turn into links",
+ safe => 1,
+ rebuild => undef, # might change links
+ },
+}
-sub linkify (@) { #{{{
+sub linkify (@) {
my %params=@_;
my $page=$params{page};
my $destpage=$params{destpage};
$params{content}=~s{$link_regexp}{
- htmllink($page, $destpage, linkpage($1))
+ ignored($1) ? $1 : htmllink($page, $destpage, linkpage($1))
}eg;
return $params{content};
-} #}}}
+}
-sub scan (@) { #{{{
+sub scan (@) {
my %params=@_;
my $page=$params{page};
my $content=$params{content};
while ($content =~ /$link_regexp/g) {
- push @{$links{$page}}, linkpage($1);
+ push @{$links{$page}}, linkpage($1) unless ignored($1)
}
}
+sub ignored ($) {
+ my $word=lc shift;
+ grep { $word eq lc $_ } @{$config{'camelcase_ignore'}}
+}
+
1
diff --git a/IkiWiki/Plugin/color.pm b/IkiWiki/Plugin/color.pm
index ac702ff02..53d8389d2 100644
--- a/IkiWiki/Plugin/color.pm
+++ b/IkiWiki/Plugin/color.pm
@@ -7,12 +7,12 @@ use warnings;
use strict;
use IkiWiki 2.00;
-sub import { #{{{
+sub import {
hook(type => "preprocess", id => "color", call => \&preprocess);
hook(type => "format", id => "color", call => \&format);
-} #}}}
+}
-sub preserve_style ($$$) { #{{{
+sub preserve_style ($$$) {
my $foreground = shift;
my $background = shift;
my $text = shift;
@@ -37,18 +37,18 @@ sub preserve_style ($$$) { #{{{
return $preserved;
-} #}}}
+}
-sub replace_preserved_style ($) { #{{{
+sub replace_preserved_style ($) {
my $content = shift;
$content =~ s!<span class="color">((color: ([a-z]+|\#[0-9a-f]{3,6})?)?((; )?(background-color: ([a-z]+|\#[0-9a-f]{3,6})?)?)?)</span>!<span class="color" style="$1">!g;
$content =~ s!<span class="colorend">!!g;
return $content;
-} #}}}
+}
-sub preprocess (@) { #{{{
+sub preprocess (@) {
my %params = @_;
# Preprocess the text to expand any preprocessor directives
@@ -57,13 +57,13 @@ sub preprocess (@) { #{{{
IkiWiki::filter($params{page}, $params{destpage}, $params{text}));
return preserve_style($params{foreground}, $params{background}, $params{text});
-} #}}}
+}
-sub format (@) { #{{{
+sub format (@) {
my %params = @_;
$params{content} = replace_preserved_style($params{content});
return $params{content};
-} #}}}
+}
1
diff --git a/IkiWiki/Plugin/comments.pm b/IkiWiki/Plugin/comments.pm
new file mode 100644
index 000000000..d8318d3e3
--- /dev/null
+++ b/IkiWiki/Plugin/comments.pm
@@ -0,0 +1,642 @@
+#!/usr/bin/perl
+# Copyright © 2006-2008 Joey Hess <joey@ikiwiki.info>
+# Copyright © 2008 Simon McVittie <http://smcv.pseudorandom.co.uk/>
+# Licensed under the GNU GPL, version 2, or any later version published by the
+# Free Software Foundation
+package IkiWiki::Plugin::comments;
+
+use warnings;
+use strict;
+use IkiWiki 2.00;
+use Encode;
+use POSIX qw(strftime);
+
+use constant PREVIEW => "Preview";
+use constant POST_COMMENT => "Post comment";
+use constant CANCEL => "Cancel";
+
+my $postcomment;
+my %commentstate;
+
+sub import {
+ hook(type => "checkconfig", id => 'comments', call => \&checkconfig);
+ hook(type => "getsetup", id => 'comments', call => \&getsetup);
+ hook(type => "preprocess", id => '_comment', call => \&preprocess);
+ hook(type => "sessioncgi", id => 'comment', call => \&sessioncgi);
+ hook(type => "htmlize", id => "_comment", call => \&htmlize);
+ hook(type => "pagetemplate", id => "comments", call => \&pagetemplate);
+ hook(type => "cgi", id => "comments", call => \&linkcgi);
+ IkiWiki::loadplugin("inline");
+}
+
+sub getsetup () {
+ return
+ plugin => {
+ safe => 1,
+ rebuild => 1,
+ },
+ comments_pagespec => {
+ type => 'pagespec',
+ example => 'blog/* and !*/Discussion',
+ description => 'PageSpec of pages where comments are allowed',
+ link => 'ikiwiki/PageSpec',
+ safe => 1,
+ rebuild => 1,
+ },
+ comments_closed_pagespec => {
+ type => 'pagespec',
+ example => 'blog/controversial or blog/flamewar',
+ description => 'PageSpec of pages where posting new comments is not allowed',
+ link => 'ikiwiki/PageSpec',
+ safe => 1,
+ rebuild => 1,
+ },
+ comments_pagename => {
+ type => 'string',
+ default => 'comment_',
+ description => 'Base name for comments, e.g. "comment_" for pages like "sandbox/comment_12"',
+ safe => 0, # manual page moving required
+ rebuild => undef,
+ },
+ comments_allowdirectives => {
+ type => 'boolean',
+ example => 0,
+ description => 'Interpret directives in comments?',
+ safe => 1,
+ rebuild => 0,
+ },
+ comments_allowauthor => {
+ type => 'boolean',
+ example => 0,
+ description => 'Allow anonymous commenters to set an author name?',
+ safe => 1,
+ rebuild => 0,
+ },
+ comments_commit => {
+ type => 'boolean',
+ example => 1,
+ description => 'commit comments to the VCS',
+ # old uncommitted comments are likely to cause
+ # confusion if this is changed
+ safe => 0,
+ rebuild => 0,
+ },
+}
+
+sub checkconfig () {
+ $config{comments_commit} = 1
+ unless defined $config{comments_commit};
+ $config{comments_pagespec} = ''
+ unless defined $config{comments_pagespec};
+ $config{comments_closed_pagespec} = ''
+ unless defined $config{comments_closed_pagespec};
+ $config{comments_pagename} = 'comment_'
+ unless defined $config{comments_pagename};
+}
+
+sub htmlize {
+ my %params = @_;
+ return $params{content};
+}
+
+# FIXME: copied verbatim from meta
+sub safeurl ($) {
+ my $url=shift;
+ if (exists $IkiWiki::Plugin::htmlscrubber::{safe_url_regexp} &&
+ defined $IkiWiki::Plugin::htmlscrubber::safe_url_regexp) {
+ return $url=~/$IkiWiki::Plugin::htmlscrubber::safe_url_regexp/;
+ }
+ else {
+ return 1;
+ }
+}
+
+sub preprocess {
+ my %params = @_;
+ my $page = $params{page};
+
+ my $format = $params{format};
+ if (defined $format && ! exists $IkiWiki::hooks{htmlize}{$format}) {
+ error(sprintf(gettext("unsupported page format %s"), $format));
+ }
+
+ my $content = $params{content};
+ if (! defined $content) {
+ error(gettext("comment must have content"));
+ }
+ $content =~ s/\\"/"/g;
+
+ $content = IkiWiki::filter($page, $params{destpage}, $content);
+
+ if ($config{comments_allowdirectives}) {
+ $content = IkiWiki::preprocess($page, $params{destpage},
+ $content);
+ }
+
+ # no need to bother with htmlize if it's just HTML
+ $content = IkiWiki::htmlize($page, $params{destpage}, $format,
+ $content) if defined $format;
+
+ IkiWiki::run_hooks(sanitize => sub {
+ $content = shift->(
+ page => $page,
+ destpage => $params{destpage},
+ content => $content,
+ );
+ });
+
+ # set metadata, possibly overriding [[!meta]] directives from the
+ # comment itself
+
+ my $commentuser;
+ my $commentip;
+ my $commentauthor;
+ my $commentauthorurl;
+ my $commentopenid;
+ if (defined $params{username}) {
+ $commentuser = $params{username};
+
+ my $oiduser = eval { IkiWiki::openiduser($commentuser) };
+
+ if (defined $oiduser) {
+ # looks like an OpenID
+ $commentauthorurl = $commentuser;
+ $commentauthor = $oiduser;
+ $commentopenid = $commentuser;
+ }
+ else {
+ $commentauthorurl = IkiWiki::cgiurl(
+ do => 'commenter',
+ page => (length $config{userdir}
+ ? "$config{userdir}/$commentuser"
+ : "$commentuser"));
+
+ $commentauthor = $commentuser;
+ }
+ }
+ else {
+ if (defined $params{ip}) {
+ $commentip = $params{ip};
+ }
+ $commentauthor = gettext("Anonymous");
+ }
+
+ $commentstate{$page}{commentuser} = $commentuser;
+ $commentstate{$page}{commentopenid} = $commentopenid;
+ $commentstate{$page}{commentip} = $commentip;
+ $commentstate{$page}{commentauthor} = $commentauthor;
+ $commentstate{$page}{commentauthorurl} = $commentauthorurl;
+ if (! defined $pagestate{$page}{meta}{author}) {
+ $pagestate{$page}{meta}{author} = $commentauthor;
+ }
+ if (! defined $pagestate{$page}{meta}{authorurl}) {
+ $pagestate{$page}{meta}{authorurl} = $commentauthorurl;
+ }
+
+ if ($config{comments_allowauthor}) {
+ if (defined $params{claimedauthor}) {
+ $pagestate{$page}{meta}{author} = $params{claimedauthor};
+ }
+
+ if (defined $params{url}) {
+ my $url=$params{url};
+
+ eval q{use URI::Heuristic};
+ if (! $@) {
+ $url=URI::Heuristic::uf_uristr($url);
+ }
+
+ if (safeurl($url)) {
+ $pagestate{$page}{meta}{authorurl} = $url;
+ }
+ }
+ }
+ else {
+ $pagestate{$page}{meta}{author} = $commentauthor;
+ $pagestate{$page}{meta}{authorurl} = $commentauthorurl;
+ }
+
+ if (defined $params{subject}) {
+ $pagestate{$page}{meta}{title} = $params{subject};
+ }
+
+ if ($params{page} =~ m/\/(\Q$config{comments_pagename}\E\d+)$/) {
+ $pagestate{$page}{meta}{permalink} = urlto(IkiWiki::dirname($params{page}), undef, 1).
+ "#".$params{page};
+ }
+
+ eval q{use Date::Parse};
+ if (! $@) {
+ my $time = str2time($params{date});
+ $IkiWiki::pagectime{$page} = $time if defined $time;
+ }
+
+ return $content;
+}
+
+# This is exactly the same as recentchanges_link :-(
+sub linkcgi ($) {
+ my $cgi=shift;
+ if (defined $cgi->param('do') && $cgi->param('do') eq "commenter") {
+
+ my $page=decode_utf8($cgi->param("page"));
+ if (! defined $page) {
+ error("missing page parameter");
+ }
+
+ IkiWiki::loadindex();
+
+ my $link=bestlink("", $page);
+ if (! length $link) {
+ print "Content-type: text/html\n\n";
+ print IkiWiki::misctemplate(gettext(gettext("missing page")),
+ "<p>".
+ sprintf(gettext("The page %s does not exist."),
+ htmllink("", "", $page)).
+ "</p>");
+ }
+ else {
+ IkiWiki::redirect($cgi, urlto($link, undef, 1));
+ }
+
+ exit;
+ }
+}
+
+# Mostly cargo-culted from IkiWiki::plugin::editpage
+sub sessioncgi ($$) {
+ my $cgi=shift;
+ my $session=shift;
+
+ my $do = $cgi->param('do');
+ return unless $do eq 'comment';
+
+ IkiWiki::decode_cgi_utf8($cgi);
+
+ eval q{use CGI::FormBuilder};
+ error($@) if $@;
+
+ my @buttons = (POST_COMMENT, PREVIEW, CANCEL);
+ my $form = CGI::FormBuilder->new(
+ fields => [qw{do sid page subject editcontent type author url}],
+ charset => 'utf-8',
+ method => 'POST',
+ required => [qw{editcontent}],
+ javascript => 0,
+ params => $cgi,
+ action => $config{cgiurl},
+ header => 0,
+ table => 0,
+ template => scalar IkiWiki::template_params('editcomment.tmpl'),
+ );
+
+ IkiWiki::decode_form_utf8($form);
+ IkiWiki::run_hooks(formbuilder_setup => sub {
+ shift->(title => "comment", form => $form, cgi => $cgi,
+ session => $session, buttons => \@buttons);
+ });
+ IkiWiki::decode_form_utf8($form);
+
+ my $type = $form->param('type');
+ if (defined $type && length $type && $IkiWiki::hooks{htmlize}{$type}) {
+ $type = IkiWiki::possibly_foolish_untaint($type);
+ }
+ else {
+ $type = $config{default_pageext};
+ }
+ my @page_types;
+ if (exists $IkiWiki::hooks{htmlize}) {
+ @page_types = grep { ! /^_/ } keys %{$IkiWiki::hooks{htmlize}};
+ }
+
+ $form->field(name => 'do', type => 'hidden');
+ $form->field(name => 'sid', type => 'hidden', value => $session->id,
+ force => 1);
+ $form->field(name => 'page', type => 'hidden');
+ $form->field(name => 'subject', type => 'text', size => 72);
+ $form->field(name => 'editcontent', type => 'textarea', rows => 10);
+ $form->field(name => "type", value => $type, force => 1,
+ type => 'select', options => \@page_types);
+
+ $form->tmpl_param(username => $session->param('name'));
+
+ if ($config{comments_allowauthor} and
+ ! defined $session->param('name')) {
+ $form->tmpl_param(allowauthor => 1);
+ $form->field(name => 'author', type => 'text', size => '40');
+ $form->field(name => 'url', type => 'text', size => '40');
+ }
+ else {
+ $form->tmpl_param(allowauthor => 0);
+ $form->field(name => 'author', type => 'hidden', value => '',
+ force => 1);
+ $form->field(name => 'url', type => 'hidden', value => '',
+ force => 1);
+ }
+
+ # The untaint is OK (as in editpage) because we're about to pass
+ # it to file_pruned anyway
+ my $page = $form->field('page');
+ $page = IkiWiki::possibly_foolish_untaint($page);
+ if (! defined $page || ! length $page ||
+ IkiWiki::file_pruned($page, $config{srcdir})) {
+ error(gettext("bad page name"));
+ }
+
+ # FIXME: is this right? Or should we be using the candidate subpage
+ # (whatever that might mean) as the base URL?
+ my $baseurl = urlto($page, undef, 1);
+
+ $form->title(sprintf(gettext("commenting on %s"),
+ IkiWiki::pagetitle($page)));
+
+ $form->tmpl_param('helponformattinglink',
+ htmllink($page, $page, 'ikiwiki/formatting',
+ noimageinline => 1,
+ linktext => 'FormattingHelp'),
+ allowdirectives => $config{allow_directives});
+
+ if ($form->submitted eq CANCEL) {
+ # bounce back to the page they wanted to comment on, and exit.
+ # CANCEL need not be considered in future
+ IkiWiki::redirect($cgi, urlto($page, undef, 1));
+ exit;
+ }
+
+ if (not exists $pagesources{$page}) {
+ error(sprintf(gettext(
+ "page '%s' doesn't exist, so you can't comment"),
+ $page));
+ }
+
+ if (pagespec_match($page, $config{comments_closed_pagespec},
+ location => $page)) {
+ error(sprintf(gettext(
+ "comments on page '%s' are closed"),
+ $page));
+ }
+
+ # Set a flag to indicate that we're posting a comment,
+ # so that postcomment() can tell it should match.
+ $postcomment=1;
+ IkiWiki::check_canedit($page, $cgi, $session);
+ $postcomment=0;
+
+ # FIXME: rather a simplistic way to make the comments...
+ my $i = 0;
+ my $file;
+ my $location;
+ do {
+ $i++;
+ $location = "$page/$config{comments_pagename}$i";
+ } while (-e "$config{srcdir}/$location._comment");
+
+ my $content = "[[!_comment format=$type\n";
+
+ # FIXME: handling of double quotes probably wrong?
+ if (defined $session->param('name')) {
+ my $username = $session->param('name');
+ $username =~ s/"/&quot;/g;
+ $content .= " username=\"$username\"\n";
+ }
+ elsif (defined $ENV{REMOTE_ADDR}) {
+ my $ip = $ENV{REMOTE_ADDR};
+ if ($ip =~ m/^([.0-9]+)$/) {
+ $content .= " ip=\"$1\"\n";
+ }
+ }
+
+ if ($config{comments_allowauthor}) {
+ my $author = $form->field('author');
+ if (length $author) {
+ $author =~ s/"/&quot;/g;
+ $content .= " claimedauthor=\"$author\"\n";
+ }
+ my $url = $form->field('url');
+ if (length $url) {
+ $url =~ s/"/&quot;/g;
+ $content .= " url=\"$url\"\n";
+ }
+ }
+
+ my $subject = $form->field('subject');
+ if (length $subject) {
+ $subject =~ s/"/&quot;/g;
+ $content .= " subject=\"$subject\"\n";
+ }
+
+ $content .= " date=\"" . decode_utf8(strftime('%Y-%m-%dT%H:%M:%SZ', gmtime)) . "\"\n";
+
+ my $editcontent = $form->field('editcontent') || '';
+ $editcontent =~ s/\r\n/\n/g;
+ $editcontent =~ s/\r/\n/g;
+ $editcontent =~ s/"/\\"/g;
+ $content .= " content=\"\"\"\n$editcontent\n\"\"\"]]\n";
+
+ # This is essentially a simplified version of editpage:
+ # - the user does not control the page that's created, only the parent
+ # - it's always a create operation, never an edit
+ # - this means that conflicts should never happen
+ # - this means that if they do, rocks fall and everyone dies
+
+ if ($form->submitted eq PREVIEW) {
+ my $preview = IkiWiki::htmlize($location, $page, '_comment',
+ IkiWiki::linkify($location, $page,
+ IkiWiki::preprocess($location, $page,
+ IkiWiki::filter($location,
+ $page, $content),
+ 0, 1)));
+ IkiWiki::run_hooks(format => sub {
+ $preview = shift->(page => $page,
+ content => $preview);
+ });
+
+ my $template = template("comment.tmpl");
+ $template->param(content => $preview);
+ $template->param(title => $form->field('subject'));
+ $template->param(ctime => displaytime(time));
+
+ IkiWiki::run_hooks(pagetemplate => sub {
+ shift->(page => $location,
+ destpage => $page,
+ template => $template);
+ });
+
+ $form->tmpl_param(page_preview => $template->output);
+ }
+ else {
+ $form->tmpl_param(page_preview => "");
+ }
+
+ if ($form->submitted eq POST_COMMENT && $form->validate) {
+ my $file = "$location._comment";
+
+ IkiWiki::checksessionexpiry($cgi, $session);
+
+ # FIXME: could probably do some sort of graceful retry
+ # on error? Would require significant unwinding though
+ writefile($file, $config{srcdir}, $content);
+
+ my $conflict;
+
+ if ($config{rcs} and $config{comments_commit}) {
+ my $message = gettext("Added a comment");
+ if (defined $form->field('subject') &&
+ length $form->field('subject')) {
+ $message = sprintf(
+ gettext("Added a comment: %s"),
+ $form->field('subject'));
+ }
+
+ IkiWiki::rcs_add($file);
+ IkiWiki::disable_commit_hook();
+ $conflict = IkiWiki::rcs_commit_staged($message,
+ $session->param('name'), $ENV{REMOTE_ADDR});
+ IkiWiki::enable_commit_hook();
+ IkiWiki::rcs_update();
+ }
+
+ # Now we need a refresh
+ require IkiWiki::Render;
+ IkiWiki::refresh();
+ IkiWiki::saveindex();
+
+ # this should never happen, unless a committer deliberately
+ # breaks it or something
+ error($conflict) if defined $conflict;
+
+ # Jump to the new comment on the page.
+ IkiWiki::redirect($cgi, urlto($page, undef, 1)."#$location");
+ }
+ else {
+ IkiWiki::showform ($form, \@buttons, $session, $cgi,
+ forcebaseurl => $baseurl);
+ }
+
+ exit;
+}
+
+sub commentsshown ($) {
+ my $page=shift;
+
+ return ! pagespec_match($page, "*/$config{comments_pagename}*",
+ location => $page) &&
+ pagespec_match($page, $config{comments_pagespec},
+ location => $page);
+}
+
+sub commentsopen ($) {
+ my $page = shift;
+
+ return length $config{cgiurl} > 0 &&
+ (! length $config{comments_closed_pagespec} ||
+ ! pagespec_match($page, $config{comments_closed_pagespec},
+ location => $page));
+}
+
+sub pagetemplate (@) {
+ my %params = @_;
+
+ my $page = $params{page};
+ my $template = $params{template};
+ my $shown = ($template->query(name => 'commentslink') ||
+ $template->query(name => 'commentsurl') ||
+ $template->query(name => 'atomcommentsurl') ||
+ $template->query(name => 'comments')) &&
+ commentsshown($page);
+
+ if ($template->query(name => 'comments')) {
+ my $comments = undef;
+ if ($shown) {
+ $comments = IkiWiki::preprocess_inline(
+ pages => "internal($page/$config{comments_pagename}*)",
+ template => 'comment',
+ show => 0,
+ reverse => 'yes',
+ page => $page,
+ destpage => $params{destpage},
+ feedfile => 'comments',
+ emptyfeeds => 'no',
+ );
+ }
+
+ if (defined $comments && length $comments) {
+ $template->param(comments => $comments);
+ }
+
+ if ($shown && commentsopen($page)) {
+ my $addcommenturl = IkiWiki::cgiurl(do => 'comment',
+ page => $page);
+ $template->param(addcommenturl => $addcommenturl);
+ }
+ }
+
+ if ($template->query(name => 'commentsurl')) {
+ if ($shown) {
+ $template->param(commentsurl =>
+ urlto($page, undef, 1).'#comments');
+ }
+ }
+
+ if ($template->query(name => 'atomcommentsurl') && $config{usedirs}) {
+ if ($shown) {
+ # This will 404 until there are some comments, but I
+ # think that's probably OK...
+ $template->param(atomcommentsurl =>
+ urlto($page, undef, 1).'comments.atom');
+ }
+ }
+
+ if ($template->query(name => 'commentslink')) {
+ # XXX Would be nice to say how many comments there are in
+ # the link. But, to update the number, blog pages
+ # would have to update whenever comments of any inlines
+ # page are added, which is not currently done.
+ if ($shown) {
+ $template->param(commentslink =>
+ htmllink($page, $params{destpage}, $page,
+ linktext => gettext("Comments"),
+ anchor => "comments",
+ noimageinline => 1));
+ }
+ }
+
+ if ($template->query(name => 'commentuser')) {
+ $template->param(commentuser =>
+ $commentstate{$page}{commentuser});
+ }
+
+ if ($template->query(name => 'commentopenid')) {
+ $template->param(commentopenid =>
+ $commentstate{$page}{commentopenid});
+ }
+
+ if ($template->query(name => 'commentip')) {
+ $template->param(commentip =>
+ $commentstate{$page}{commentip});
+ }
+
+ if ($template->query(name => 'commentauthor')) {
+ $template->param(commentauthor =>
+ $commentstate{$page}{commentauthor});
+ }
+
+ if ($template->query(name => 'commentauthorurl')) {
+ $template->param(commentauthorurl =>
+ $commentstate{$page}{commentauthorurl});
+ }
+}
+
+package IkiWiki::PageSpec;
+
+sub match_postcomment ($$;@) {
+ my $page = shift;
+ my $glob = shift;
+
+ if (! $postcomment) {
+ return IkiWiki::FailReason->new("not posting a comment");
+ }
+ return match_glob($page, $glob);
+}
+
+1
diff --git a/IkiWiki/Plugin/conditional.pm b/IkiWiki/Plugin/conditional.pm
index e787424aa..66253e07d 100644
--- a/IkiWiki/Plugin/conditional.pm
+++ b/IkiWiki/Plugin/conditional.pm
@@ -6,20 +6,20 @@ use strict;
use IkiWiki 2.00;
use UNIVERSAL;
-sub import { #{{{
+sub import {
hook(type => "getsetup", id => "conditional", call => \&getsetup);
hook(type => "preprocess", id => "if", call => \&preprocess_if);
-} # }}}
+}
-sub getsetup { #{{{
+sub getsetup {
return
plugin => {
safe => 1,
rebuild => undef,
},
-} #}}}
+}
-sub preprocess_if (@) { #{{{
+sub preprocess_if (@) {
my %params=@_;
foreach my $param (qw{test then}) {
@@ -66,11 +66,11 @@ sub preprocess_if (@) { #{{{
}
return IkiWiki::preprocess($params{page}, $params{destpage},
IkiWiki::filter($params{page}, $params{destpage}, $ret));
-} # }}}
+}
package IkiWiki::PageSpec;
-sub match_enabled ($$;@) { #{{{
+sub match_enabled ($$;@) {
shift;
my $plugin=shift;
@@ -81,9 +81,9 @@ sub match_enabled ($$;@) { #{{{
else {
return IkiWiki::FailReason->new("$plugin is not enabled");
}
-} #}}}
+}
-sub match_sourcepage ($$;@) { #{{{
+sub match_sourcepage ($$;@) {
shift;
my $glob=shift;
my %params=@_;
@@ -95,9 +95,9 @@ sub match_sourcepage ($$;@) { #{{{
else {
return IkiWiki::FailReason->new("sourcepage does not match $glob");
}
-} #}}}
+}
-sub match_destpage ($$;@) { #{{{
+sub match_destpage ($$;@) {
shift;
my $glob=shift;
my %params=@_;
@@ -109,9 +109,9 @@ sub match_destpage ($$;@) { #{{{
else {
return IkiWiki::FailReason->new("destpage does not match $glob");
}
-} #}}}
+}
-sub match_included ($$;@) { #{{{
+sub match_included ($$;@) {
shift;
shift;
my %params=@_;
@@ -123,6 +123,6 @@ sub match_included ($$;@) { #{{{
else {
return IkiWiki::FailReason->new("page $params{sourcepage} is not included");
}
-} #}}}
+}
1
diff --git a/IkiWiki/Plugin/creole.pm b/IkiWiki/Plugin/creole.pm
index 7c729300d..3c46a48df 100644
--- a/IkiWiki/Plugin/creole.pm
+++ b/IkiWiki/Plugin/creole.pm
@@ -7,20 +7,20 @@ use warnings;
use strict;
use IkiWiki 2.00;
-sub import { #{{{
+sub import {
hook(type => "getsetup", id => "creole", call => \&getsetup);
hook(type => "htmlize", id => "creole", call => \&htmlize);
-} # }}}
+}
-sub getsetup { #{{{
+sub getsetup {
return
plugin => {
safe => 1,
rebuild => 1, # format plugin
},
-} #}}}
+}
-sub htmlize (@) { #{{{
+sub htmlize (@) {
my %params=@_;
my $content = $params{content};
@@ -32,6 +32,6 @@ sub htmlize (@) { #{{{
creole_custombarelinks();
return creole_parse($content);
-} # }}}
+}
1
diff --git a/IkiWiki/Plugin/cutpaste.pm b/IkiWiki/Plugin/cutpaste.pm
index 92667a1ef..e579c1ea2 100644
--- a/IkiWiki/Plugin/cutpaste.pm
+++ b/IkiWiki/Plugin/cutpaste.pm
@@ -7,22 +7,22 @@ use IkiWiki 2.00;
my %savedtext;
-sub import { #{{{
+sub import {
hook(type => "getsetup", id => "cutpaste", call => \&getsetup);
hook(type => "preprocess", id => "cut", call => \&preprocess_cut, scan => 1);
hook(type => "preprocess", id => "copy", call => \&preprocess_copy, scan => 1);
hook(type => "preprocess", id => "paste", call => \&preprocess_paste);
-} # }}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 1,
rebuild => undef,
},
-} #}}}
+}
-sub preprocess_cut (@) { #{{{
+sub preprocess_cut (@) {
my %params=@_;
foreach my $param (qw{id text}) {
@@ -35,9 +35,9 @@ sub preprocess_cut (@) { #{{{
$savedtext{$params{page}}->{$params{id}} = $params{text};
return "" if defined wantarray;
-} # }}}
+}
-sub preprocess_copy (@) { #{{{
+sub preprocess_copy (@) {
my %params=@_;
foreach my $param (qw{id text}) {
@@ -51,9 +51,9 @@ sub preprocess_copy (@) { #{{{
return IkiWiki::preprocess($params{page}, $params{destpage},
IkiWiki::filter($params{page}, $params{destpage}, $params{text})) if defined wantarray;
-} # }}}
+}
-sub preprocess_paste (@) { #{{{
+sub preprocess_paste (@) {
my %params=@_;
foreach my $param (qw{id}) {
@@ -71,6 +71,6 @@ sub preprocess_paste (@) { #{{{
return IkiWiki::preprocess($params{page}, $params{destpage},
IkiWiki::filter($params{page}, $params{destpage}, $savedtext{$params{page}}->{$params{id}}));
-} # }}}
+}
1;
diff --git a/IkiWiki/Plugin/ddate.pm b/IkiWiki/Plugin/ddate.pm
index c73317b2f..3470640dc 100644
--- a/IkiWiki/Plugin/ddate.pm
+++ b/IkiWiki/Plugin/ddate.pm
@@ -5,19 +5,19 @@ package IkiWiki::Plugin::ddate;
use IkiWiki 2.00;
no warnings;
-sub import { #{{{
+sub import {
hook(type => "getsetup", id => "ddate", call => \&getsetup);
-} # }}}
+}
-sub getsetup { #{{{
+sub getsetup {
return
plugin => {
safe => 1,
rebuild => 1,
},
-} #}}}
+}
-sub IkiWiki::formattime ($;$) { #{{{
+sub IkiWiki::formattime ($;$) {
my $time=shift;
my $format=shift;
if (! defined $format) {
@@ -36,6 +36,6 @@ sub IkiWiki::formattime ($;$) { #{{{
my $dt = DateTime->from_epoch(epoch => $time);
my $dd = DateTime::Calendar::Discordian->from_object(object => $dt);
return $dd->strftime($format);
-} #}}}
+}
5
diff --git a/IkiWiki/Plugin/editdiff.pm b/IkiWiki/Plugin/editdiff.pm
index f5d7837fc..068b83b3c 100644
--- a/IkiWiki/Plugin/editdiff.pm
+++ b/IkiWiki/Plugin/editdiff.pm
@@ -8,21 +8,21 @@ use IkiWiki 2.00;
use HTML::Entities;
use IPC::Open2;
-sub import { #{{{
+sub import {
hook(type => "getsetup", id => "editdiff", call => \&getsetup);
hook(type => "formbuilder_setup", id => "editdiff",
call => \&formbuilder_setup);
-} #}}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 1,
rebuild => 0,
},
-} #}}}
+}
-sub diff ($$) { #{{{
+sub diff ($$) {
my $orig=shift;
my $content=shift;
@@ -50,9 +50,9 @@ sub diff ($$) { #{{{
return "couldn't run diff\n" if $sigpipe;
return "<pre>".encode_entities($ret)."</pre>";
-} #}}}
+}
-sub formbuilder_setup { #{{{
+sub formbuilder_setup {
my %params=@_;
my $form=$params{form};
@@ -72,6 +72,6 @@ sub formbuilder_setup { #{{{
my $diff = diff(srcfile($pagesources{$page}), $content);
$form->tmpl_param("page_preview", $diff);
}
-} #}}}
+}
1
diff --git a/IkiWiki/Plugin/editpage.pm b/IkiWiki/Plugin/editpage.pm
index fe2864bac..ed994306f 100644
--- a/IkiWiki/Plugin/editpage.pm
+++ b/IkiWiki/Plugin/editpage.pm
@@ -6,19 +6,19 @@ use strict;
use IkiWiki;
use open qw{:utf8 :std};
-sub import { #{{{
+sub import {
hook(type => "getsetup", id => "editpage", call => \&getsetup);
hook(type => "refresh", id => "editpage", call => \&refresh);
hook(type => "sessioncgi", id => "editpage", call => \&IkiWiki::cgi_editpage);
-} # }}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 1,
rebuild => 1,
},
-} #}}}
+}
sub refresh () {
if (exists $wikistate{editpage} && exists $wikistate{editpage}{previews}) {
@@ -54,7 +54,7 @@ sub refresh () {
# and other plugins use the functions below.
package IkiWiki;
-sub check_canedit ($$$;$) { #{{{
+sub check_canedit ($$$;$) {
my $page=shift;
my $q=shift;
my $session=shift;
@@ -79,9 +79,9 @@ sub check_canedit ($$$;$) { #{{{
}
});
return $canedit;
-} #}}}
+}
-sub cgi_editpage ($$) { #{{{
+sub cgi_editpage ($$) {
my $q=shift;
my $session=shift;
@@ -105,7 +105,6 @@ sub cgi_editpage ($$) { #{{{
header => 0,
table => 0,
template => scalar template_params("editpage.tmpl"),
- wikiname => $config{wikiname},
);
decode_form_utf8($form);
@@ -340,16 +339,7 @@ sub cgi_editpage ($$) { #{{{
else {
# save page
check_canedit($page, $q, $session);
-
- # The session id is stored on the form and checked to
- # guard against CSRF. But only if the user is logged in,
- # as anonok can allow anonymous edits.
- if (defined $session->param("name")) {
- my $sid=$q->param('sid');
- if (! defined $sid || $sid ne $session->id) {
- error(gettext("Your login session has expired."));
- }
- }
+ checksessionexpiry($q, $session, $q->param('sid'));
my $exists=-e "$config{srcdir}/$file";
@@ -462,6 +452,6 @@ sub cgi_editpage ($$) { #{{{
}
exit;
-} #}}}
+}
1
diff --git a/IkiWiki/Plugin/edittemplate.pm b/IkiWiki/Plugin/edittemplate.pm
index 846b4e7c8..7c0e7c2f8 100644
--- a/IkiWiki/Plugin/edittemplate.pm
+++ b/IkiWiki/Plugin/edittemplate.pm
@@ -7,7 +7,7 @@ use IkiWiki 2.00;
use HTML::Template;
use Encode;
-sub import { #{{{
+sub import {
hook(type => "getsetup", id => "edittemplate",
call => \&getsetup);
hook(type => "needsbuild", id => "edittemplate",
@@ -16,17 +16,17 @@ sub import { #{{{
call => \&preprocess);
hook(type => "formbuilder", id => "edittemplate",
call => \&formbuilder);
-} #}}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 1,
rebuild => undef,
},
-} #}}}
+}
-sub needsbuild (@) { #{{{
+sub needsbuild (@) {
my $needsbuild=shift;
foreach my $page (keys %pagestate) {
@@ -40,9 +40,9 @@ sub needsbuild (@) { #{{{
}
}
}
-} #}}}
+}
-sub preprocess (@) { #{{{
+sub preprocess (@) {
my %params=@_;
return "" if $params{page} ne $params{destpage};
@@ -62,9 +62,9 @@ sub preprocess (@) { #{{{
return sprintf(gettext("edittemplate %s registered for %s"),
htmllink($params{page}, $params{destpage}, $link),
$params{match});
-} # }}}
+}
-sub formbuilder (@) { #{{{
+sub formbuilder (@) {
my %params=@_;
my $form=$params{form};
@@ -103,9 +103,9 @@ sub formbuilder (@) { #{{{
}
}
}
-} #}}}
+}
-sub filltemplate ($$) { #{{{
+sub filltemplate ($$) {
my $template_page=shift;
my $page=shift;
@@ -136,6 +136,6 @@ sub filltemplate ($$) { #{{{
$template->param(name => $page);
return $template->output;
-} #}}}
+}
1
diff --git a/IkiWiki/Plugin/embed.pm b/IkiWiki/Plugin/embed.pm
index 2a1637392..664c95763 100644
--- a/IkiWiki/Plugin/embed.pm
+++ b/IkiWiki/Plugin/embed.pm
@@ -43,35 +43,35 @@ my $safehtml=qr{(
my @embedded;
-sub import { #{{{
+sub import {
hook(type => "getsetup", id => "embed", call => \&getsetup);
hook(type => "filter", id => "embed", call => \&filter);
-} # }}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 1,
rebuild => undef,
},
-} #}}}
+}
-sub embed ($) { #{{{
+sub embed ($) {
hook(type => "format", id => "embed", call => \&format) unless @embedded;
push @embedded, shift;
return "<div class=\"embed$#embedded\"></div>";
-} #}}}
+}
-sub filter (@) { #{{{
+sub filter (@) {
my %params=@_;
$params{content} =~ s/$safehtml/embed($1)/eg;
return $params{content};
-} # }}}
+}
-sub format (@) { #{{{
+sub format (@) {
my %params=@_;
$params{content} =~ s/<div class="embed(\d+)"><\/div>/$embedded[$1]/eg;
return $params{content};
-} # }}}
+}
1
diff --git a/IkiWiki/Plugin/external.pm b/IkiWiki/Plugin/external.pm
index 4ce9c8bab..2d540143f 100644
--- a/IkiWiki/Plugin/external.pm
+++ b/IkiWiki/Plugin/external.pm
@@ -14,7 +14,7 @@ use IO::Handle;
my %plugins;
-sub import { #{{{
+sub import {
my $self=shift;
my $plugin=shift;
return unless defined $plugin;
@@ -32,17 +32,17 @@ sub import { #{{{
$RPC::XML::ENCODING="utf-8";
rpc_call($plugins{$plugin}, "import");
-} #}}}
+}
-sub rpc_write ($$) { #{{{
+sub rpc_write ($$) {
my $fh=shift;
my $string=shift;
$fh->print($string."\n");
$fh->flush;
-} #}}}
+}
-sub rpc_call ($$;@) { #{{{
+sub rpc_call ($$;@) {
my $plugin=shift;
my $command=shift;
@@ -131,12 +131,12 @@ sub rpc_call ($$;@) { #{{{
}
return undef;
-} #}}}
+}
package IkiWiki::RPC::XML;
use Memoize;
-sub getvar ($$$) { #{{{
+sub getvar ($$$) {
my $plugin=shift;
my $varname="IkiWiki::".shift;
my $key=shift;
@@ -145,9 +145,9 @@ sub getvar ($$$) { #{{{
my $ret=$varname->{$key};
use strict 'refs';
return $ret;
-} #}}}
+}
-sub setvar ($$$;@) { #{{{
+sub setvar ($$$;@) {
my $plugin=shift;
my $varname="IkiWiki::".shift;
my $key=shift;
@@ -157,18 +157,18 @@ sub setvar ($$$;@) { #{{{
my $ret=$varname->{$key}=$value;
use strict 'refs';
return $ret;
-} #}}}
+}
-sub getstate ($$$$) { #{{{
+sub getstate ($$$$) {
my $plugin=shift;
my $page=shift;
my $id=shift;
my $key=shift;
return $IkiWiki::pagestate{$page}{$id}{$key};
-} #}}}
+}
-sub setstate ($$$$;@) { #{{{
+sub setstate ($$$$;@) {
my $plugin=shift;
my $page=shift;
my $id=shift;
@@ -176,22 +176,22 @@ sub setstate ($$$$;@) { #{{{
my $value=shift;
return $IkiWiki::pagestate{$page}{$id}{$key}=$value;
-} #}}}
+}
-sub getargv ($) { #{{{
+sub getargv ($) {
my $plugin=shift;
return \@ARGV;
-} #}}}
+}
-sub setargv ($@) { #{{{
+sub setargv ($@) {
my $plugin=shift;
my $array=shift;
@ARGV=@$array;
-} #}}}
+}
-sub inject ($@) { #{{{
+sub inject ($@) {
# Bind a given perl function name to a particular RPC request.
my $plugin=shift;
my %params=@_;
@@ -213,9 +213,9 @@ sub inject ($@) { #{{{
# the injected version.
IkiWiki::inject(name => $params{name}, call => $sub);
return 1;
-} #}}}
+}
-sub hook ($@) { #{{{
+sub hook ($@) {
# the call parameter is a function name to call, since XML RPC
# cannot pass a function reference
my $plugin=shift;
@@ -227,13 +227,13 @@ sub hook ($@) { #{{{
IkiWiki::hook(%params, call => sub {
IkiWiki::Plugin::external::rpc_call($plugin, $callback, @_);
});
-} #}}}
+}
-sub pagespec_match ($@) { #{{{
+sub pagespec_match ($@) {
# convert pagespec_match's return object into a XML RPC boolean
my $plugin=shift;
return RPC::XML::boolean->new(0 + IkiWiki::pagespec_march(@_));
-} #}}}
+}
1
diff --git a/IkiWiki/Plugin/favicon.pm b/IkiWiki/Plugin/favicon.pm
index e9204dea9..68359a4aa 100644
--- a/IkiWiki/Plugin/favicon.pm
+++ b/IkiWiki/Plugin/favicon.pm
@@ -7,20 +7,20 @@ use warnings;
use strict;
use IkiWiki 2.00;
-sub import { #{{{
+sub import {
hook(type => "getsetup", id => "favicon", call => \&getsetup);
hook(type => "pagetemplate", id => "favicon", call => \&pagetemplate);
-} # }}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 1,
rebuild => 1,
},
-} #}}}
+}
-sub pagetemplate (@) { #{{{
+sub pagetemplate (@) {
my %params=@_;
my $template=$params{template};
@@ -28,6 +28,6 @@ sub pagetemplate (@) { #{{{
if ($template->query(name => "favicon")) {
$template->param(favicon => "favicon.ico");
}
-} # }}}
+}
1
diff --git a/IkiWiki/Plugin/filecheck.pm b/IkiWiki/Plugin/filecheck.pm
index 27f764e3b..5040a185c 100644
--- a/IkiWiki/Plugin/filecheck.pm
+++ b/IkiWiki/Plugin/filecheck.pm
@@ -37,9 +37,9 @@ my %units=( #{{{ # size in bytes
# ikiwiki, if you find you need larger data quantities, either modify
# yourself to add them, or travel back in time to 2008 and kill me.
# -- Joey
-); #}}}
+);
-sub parsesize ($) { #{{{
+sub parsesize ($) {
my $size=shift;
no warnings;
@@ -51,10 +51,10 @@ sub parsesize ($) { #{{{
}
}
return $base;
-} #}}}
+}
# This is provided for other plugins that want to convert back the other way.
-sub humansize ($) { #{{{
+sub humansize ($) {
my $size=shift;
foreach my $unit (reverse sort { $units{$a} <=> $units{$b} || $b cmp $a } keys %units) {
@@ -63,11 +63,11 @@ sub humansize ($) { #{{{
}
}
return $size; # near zero, or negative
-} #}}}
+}
package IkiWiki::PageSpec;
-sub match_maxsize ($$;@) { #{{{
+sub match_maxsize ($$;@) {
my $page=shift;
my $maxsize=eval{IkiWiki::Plugin::filecheck::parsesize(shift)};
if ($@) {
@@ -86,9 +86,9 @@ sub match_maxsize ($$;@) { #{{{
else {
return IkiWiki::SuccessReason->new("file not too large");
}
-} #}}}
+}
-sub match_minsize ($$;@) { #{{{
+sub match_minsize ($$;@) {
my $page=shift;
my $minsize=eval{IkiWiki::Plugin::filecheck::parsesize(shift)};
if ($@) {
@@ -107,9 +107,9 @@ sub match_minsize ($$;@) { #{{{
else {
return IkiWiki::SuccessReason->new("file not too small");
}
-} #}}}
+}
-sub match_mimetype ($$;@) { #{{{
+sub match_mimetype ($$;@) {
my $page=shift;
my $wanted=shift;
@@ -140,9 +140,9 @@ sub match_mimetype ($$;@) { #{{{
else {
return IkiWiki::SuccessReason->new("file MIME type is $mimetype");
}
-} #}}}
+}
-sub match_virusfree ($$;@) { #{{{
+sub match_virusfree ($$;@) {
my $page=shift;
my $wanted=shift;
@@ -182,9 +182,9 @@ sub match_virusfree ($$;@) { #{{{
else {
return IkiWiki::SuccessReason->new("file seems virusfree ($reason)");
}
-} #}}}
+}
-sub match_ispage ($$;@) { #{{{
+sub match_ispage ($$;@) {
my $filename=shift;
if (defined IkiWiki::pagetype($filename)) {
@@ -193,4 +193,4 @@ sub match_ispage ($$;@) { #{{{
else {
return IkiWiki::FailReason->new("file is not a wiki page");
}
-} #}}}
+}
diff --git a/IkiWiki/Plugin/format.pm b/IkiWiki/Plugin/format.pm
index 1e21a0bdc..b4d3a3c5f 100644
--- a/IkiWiki/Plugin/format.pm
+++ b/IkiWiki/Plugin/format.pm
@@ -5,11 +5,11 @@ use warnings;
use strict;
use IkiWiki 2.00;
-sub import { #{{{
+sub import {
hook(type => "preprocess", id => "format", call => \&preprocess);
-} #}}}
+}
-sub preprocess (@) { #{{{
+sub preprocess (@) {
my $format=$_[0];
shift; shift;
my $text=$_[0];
@@ -25,6 +25,6 @@ sub preprocess (@) { #{{{
return IkiWiki::htmlize($params{page}, $params{destpage}, $format,
IkiWiki::preprocess($params{page}, $params{destpage}, $text));
-} #}}}
+}
1
diff --git a/IkiWiki/Plugin/fortune.pm b/IkiWiki/Plugin/fortune.pm
index 456b63e9f..6a12f28fd 100644
--- a/IkiWiki/Plugin/fortune.pm
+++ b/IkiWiki/Plugin/fortune.pm
@@ -6,20 +6,20 @@ use warnings;
use strict;
use IkiWiki 2.00;
-sub import { #{{{
+sub import {
hook(type => "getsetup", id => "fortune", call => \&getsetup);
hook(type => "preprocess", id => "fortune", call => \&preprocess);
-} # }}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 1,
rebuild => undef,
},
-} #}}}
+}
-sub preprocess (@) { #{{{
+sub preprocess (@) {
$ENV{PATH}="$ENV{PATH}:/usr/games:/usr/local/games";
my $f = `fortune 2>/dev/null`;
@@ -29,6 +29,6 @@ sub preprocess (@) { #{{{
else {
return "<pre>$f</pre>\n";
}
-} # }}}
+}
1
diff --git a/IkiWiki/Plugin/git.pm b/IkiWiki/Plugin/git.pm
index 1a39d87e5..6a7f6c3ae 100644
--- a/IkiWiki/Plugin/git.pm
+++ b/IkiWiki/Plugin/git.pm
@@ -11,7 +11,7 @@ my $sha1_pattern = qr/[0-9a-fA-F]{40}/; # pattern to validate Git sha1sums
my $dummy_commit_msg = 'dummy commit'; # message to skip in recent changes
my $no_chdir=0;
-sub import { #{{{
+sub import {
hook(type => "checkconfig", id => "git", call => \&checkconfig);
hook(type => "getsetup", id => "git", call => \&getsetup);
hook(type => "rcs", id => "rcs_update", call => \&rcs_update);
@@ -25,9 +25,9 @@ sub import { #{{{
hook(type => "rcs", id => "rcs_diff", call => \&rcs_diff);
hook(type => "rcs", id => "rcs_getctime", call => \&rcs_getctime);
hook(type => "rcs", id => "rcs_receive", call => \&rcs_receive);
-} #}}}
+}
-sub checkconfig () { #{{{
+sub checkconfig () {
if (! defined $config{gitorigin_branch}) {
$config{gitorigin_branch}="origin";
}
@@ -49,9 +49,9 @@ sub checkconfig () { #{{{
wrappermode => (defined $config{git_wrappermode} ? $config{git_wrappermode} : "06755"),
};
}
-} #}}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 0, # rcs plugin
@@ -113,9 +113,9 @@ sub getsetup () { #{{{
safe => 0, # paranoia
rebuild => 0,
},
-} #}}}
+}
-sub safe_git (&@) { #{{{
+sub safe_git (&@) {
# Start a child process safely without resorting /bin/sh.
# Return command output or success state (in scalar context).
@@ -152,9 +152,9 @@ sub safe_git (&@) { #{{{
sub run_or_die ($@) { safe_git(\&error, @_) }
sub run_or_cry ($@) { safe_git(sub { warn @_ }, @_) }
sub run_or_non ($@) { safe_git(undef, @_) }
-#}}}
-sub merge_past ($$$) { #{{{
+
+sub merge_past ($$$) {
# Unlike with Subversion, Git cannot make a 'svn merge -rN:M file'.
# Git merge commands work with the committed changes, except in the
# implicit case of '-m' of git checkout(1). So we should invent a
@@ -246,9 +246,9 @@ sub merge_past ($$$) { #{{{
error("Git merge failed!\n$failure\n") if $failure;
return $conflict;
-} #}}}
+}
-sub parse_diff_tree ($@) { #{{{
+sub parse_diff_tree ($@) {
# Parse the raw diff tree chunk and return the info hash.
# See git-diff-tree(1) for the syntax.
@@ -358,9 +358,9 @@ sub parse_diff_tree ($@) { #{{{
}
return \%ci;
-} #}}}
+}
-sub git_commit_info ($;$) { #{{{
+sub git_commit_info ($;$) {
# Return an array of commit info hashes of num commits
# starting from the given sha1sum.
my ($sha1, $num) = @_;
@@ -381,9 +381,9 @@ sub git_commit_info ($;$) { #{{{
warn "Cannot parse commit info for '$sha1' commit" if !@ci;
return wantarray ? @ci : $ci[0];
-} #}}}
+}
-sub git_sha1 (;$) { #{{{
+sub git_sha1 (;$) {
# Return head sha1sum (of given file).
my $file = shift || q{--};
@@ -394,25 +394,25 @@ sub git_sha1 (;$) { #{{{
($sha1) = $sha1 =~ m/($sha1_pattern)/; # sha1 is untainted now
} else { debug("Empty sha1sum for '$file'.") }
return defined $sha1 ? $sha1 : q{};
-} #}}}
+}
-sub rcs_update () { #{{{
+sub rcs_update () {
# Update working directory.
if (length $config{gitorigin_branch}) {
run_or_cry('git', 'pull', $config{gitorigin_branch});
}
-} #}}}
+}
-sub rcs_prepedit ($) { #{{{
+sub rcs_prepedit ($) {
# Return the commit sha1sum of the file when editing begins.
# This will be later used in rcs_commit if a merge is required.
my ($file) = @_;
return git_sha1($file);
-} #}}}
+}
-sub rcs_commit ($$$;$$) { #{{{
+sub rcs_commit ($$$;$$) {
# Try to commit the page; returns undef on _success_ and
# a version of the page with the rcs's conflict markers on
# failure.
@@ -431,7 +431,7 @@ sub rcs_commit ($$$;$$) { #{{{
rcs_add($file);
return rcs_commit_staged($message, $user, $ipaddr);
-} #}}}
+}
sub rcs_commit_staged ($$$) {
# Commits all staged changes. Changes can be staged using rcs_add,
@@ -472,29 +472,29 @@ sub rcs_commit_staged ($$$) {
return undef; # success
}
-sub rcs_add ($) { # {{{
+sub rcs_add ($) {
# Add file to archive.
my ($file) = @_;
run_or_cry('git', 'add', $file);
-} #}}}
+}
-sub rcs_remove ($) { # {{{
+sub rcs_remove ($) {
# Remove file from archive.
my ($file) = @_;
run_or_cry('git', 'rm', '-f', $file);
-} #}}}
+}
-sub rcs_rename ($$) { # {{{
+sub rcs_rename ($$) {
my ($src, $dest) = @_;
run_or_cry('git', 'mv', '-f', $src, $dest);
-} #}}}
+}
-sub rcs_recentchanges ($) { #{{{
+sub rcs_recentchanges ($) {
# List of recent changes.
my ($num) = @_;
@@ -562,9 +562,9 @@ sub rcs_recentchanges ($) { #{{{
}
return @rets;
-} #}}}
+}
-sub rcs_diff ($) { #{{{
+sub rcs_diff ($) {
my $rev=shift;
my ($sha1) = $rev =~ /^($sha1_pattern)$/; # untaint
my @lines;
@@ -579,9 +579,9 @@ sub rcs_diff ($) { #{{{
else {
return join("", @lines);
}
-} #}}}
+}
-sub rcs_getctime ($) { #{{{
+sub rcs_getctime ($) {
my $file=shift;
# Remove srcdir prefix
$file =~ s/^\Q$config{srcdir}\E\/?//;
@@ -592,9 +592,9 @@ sub rcs_getctime ($) { #{{{
debug("ctime for '$file': ". localtime($ctime));
return $ctime;
-} #}}}
+}
-sub rcs_receive () { #{{{
+sub rcs_receive () {
# The wiki may not be the only thing in the git repo.
# Determine if it is in a subdirectory by examining the srcdir,
# and its parents, looking for the .git directory.
@@ -685,6 +685,6 @@ sub rcs_receive () { #{{{
}
return reverse @rets;
-} #}}}
+}
1
diff --git a/IkiWiki/Plugin/goodstuff.pm b/IkiWiki/Plugin/goodstuff.pm
index a18e626d4..92bc8200a 100644
--- a/IkiWiki/Plugin/goodstuff.pm
+++ b/IkiWiki/Plugin/goodstuff.pm
@@ -24,19 +24,19 @@ my @bundle=qw{
toggle
};
-sub import { #{{{
+sub import {
hook(type => "getsetup", id => "goodstuff", call => \&getsetup);
foreach my $plugin (@bundle) {
IkiWiki::loadplugin($plugin);
}
-} # }}}
+}
-sub getsetup { #{{{
+sub getsetup {
return
plugin => {
safe => 1,
rebuild => undef,
},
-} #}}}
+}
1
diff --git a/IkiWiki/Plugin/google.pm b/IkiWiki/Plugin/google.pm
index 92b9b29eb..5394c5a6f 100644
--- a/IkiWiki/Plugin/google.pm
+++ b/IkiWiki/Plugin/google.pm
@@ -8,21 +8,21 @@ use URI;
my $host;
-sub import { #{{{
+sub import {
hook(type => "getsetup", id => "google", call => \&getsetup);
hook(type => "checkconfig", id => "google", call => \&checkconfig);
hook(type => "pagetemplate", id => "google", call => \&pagetemplate);
-} # }}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 1,
rebuild => 1,
},
-} #}}}
+}
-sub checkconfig () { #{{{
+sub checkconfig () {
if (! length $config{url}) {
error(sprintf(gettext("Must specify %s when using the google search plugin"), "url"));
}
@@ -31,10 +31,10 @@ sub checkconfig () { #{{{
error(gettext("Failed to parse url, cannot determine domain name"));
}
$host=$uri->host;
-} #}}}
+}
my $form;
-sub pagetemplate (@) { #{{{
+sub pagetemplate (@) {
my %params=@_;
my $page=$params{page};
my $template=$params{template};
@@ -49,6 +49,6 @@ sub pagetemplate (@) { #{{{
$template->param(searchform => $form);
}
-} #}}}
+}
1
diff --git a/IkiWiki/Plugin/googlecalendar.pm b/IkiWiki/Plugin/googlecalendar.pm
index 81a3ad677..24c2e1527 100644
--- a/IkiWiki/Plugin/googlecalendar.pm
+++ b/IkiWiki/Plugin/googlecalendar.pm
@@ -5,24 +5,26 @@ use warnings;
use strict;
use IkiWiki 2.00;
-sub import { #{{{
+print STDERR "warning: the googlecalendar plugin is deprecated and will be removed in ikiwiki 3.0 (use the embed plugin instead)\n";
+
+sub import {
hook(type => "getsetup", id => "googlecalendar",
call => \&getsetup);
hook(type => "preprocess", id => "googlecalendar",
call => \&preprocess);
hook(type => "format", id => "googlecalendar",
call => \&format);
-} # }}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 1,
rebuild => undef,
},
-} #}}}
+}
-sub preprocess (@) { #{{{
+sub preprocess (@) {
my %params=@_;
# Parse the html, looking for the url to embed for the calendar.
@@ -35,21 +37,21 @@ sub preprocess (@) { #{{{
my ($width)=$params{html}=~m#width="(\d+)"#;
return "<div class=\"googlecalendar\" src=\"$url\" height=\"$height\" width=\"$width\"></div>";
-} # }}}
+}
-sub format (@) { #{{{
+sub format (@) {
my %params=@_;
$params{content}=~s/<div class=\"googlecalendar" src="([^"]+)" height="([^"]+)" width="([^"]+)"><\/div>/gencal($1,$2,$3)/eg;
return $params{content};
-} # }}}
+}
-sub gencal ($$$) { #{{{
+sub gencal ($$$) {
my $url=shift;
my $height=shift;
my $width=shift;
return qq{<iframe src="http://www.google.com/calendar/embed?$url" style=" border-width:0 " width="$width" frameborder="0" height="$height"></iframe>};
-} #}}}
+}
1
diff --git a/IkiWiki/Plugin/graphviz.pm b/IkiWiki/Plugin/graphviz.pm
index 20b419413..23631da30 100644
--- a/IkiWiki/Plugin/graphviz.pm
+++ b/IkiWiki/Plugin/graphviz.pm
@@ -8,24 +8,24 @@ use strict;
use IkiWiki 2.00;
use IPC::Open2;
-sub import { #{{{
+sub import {
hook(type => "getsetup", id => "graphviz", call => \&getsetup);
hook(type => "preprocess", id => "graph", call => \&graph);
-} # }}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 1,
rebuild => undef,
},
-} #}}}
+}
my %graphviz_programs = (
"dot" => 1, "neato" => 1, "fdp" => 1, "twopi" => 1, "circo" => 1
);
-sub render_graph (\%) { #{{{
+sub render_graph (\%) {
my %params = %{(shift)};
my $src = "$params{type} g {\n";
@@ -84,9 +84,9 @@ sub render_graph (\%) { #{{{
else {
return "<img src=\"".urlto($dest, $params{destpage})."\" />\n";
}
-} #}}}
+}
-sub graph (@) { #{{{
+sub graph (@) {
my %params=@_;
$params{src} = "" unless defined $params{src};
$params{type} = "digraph" unless defined $params{type};
@@ -94,6 +94,6 @@ sub graph (@) { #{{{
error gettext("prog not a valid graphviz program") unless $graphviz_programs{$params{prog}};
return render_graph(%params);
-} # }}}
+}
1
diff --git a/IkiWiki/Plugin/haiku.pm b/IkiWiki/Plugin/haiku.pm
index eb8b786e8..fe68c6eec 100644
--- a/IkiWiki/Plugin/haiku.pm
+++ b/IkiWiki/Plugin/haiku.pm
@@ -6,20 +6,20 @@ use warnings;
use strict;
use IkiWiki 2.00;
-sub import { #{{{
+sub import {
hook(type => "getsetup", id => "haiku", call => \&getsetup);
hook(type => "preprocess", id => "haiku", call => \&preprocess);
-} # }}}
+}
-sub getsetup { #{{{
+sub getsetup {
return
plugin => {
safe => 1,
rebuild => undef,
},
-} #}}}
+}
-sub preprocess (@) { #{{{
+sub preprocess (@) {
my %params=@_;
my $haiku;
@@ -54,6 +54,6 @@ sub preprocess (@) { #{{{
$haiku=~s/\n/<br \/>\n/mg;
return "\n\n<blockquote><p>$haiku</p></blockquote>\n\n";
-} # }}}
+}
1
diff --git a/IkiWiki/Plugin/hnb.pm b/IkiWiki/Plugin/hnb.pm
index 40e4f9452..d5b5ce3b4 100644
--- a/IkiWiki/Plugin/hnb.pm
+++ b/IkiWiki/Plugin/hnb.pm
@@ -13,20 +13,20 @@ use strict;
use IkiWiki 2.00;
use File::Temp qw(:mktemp);
-sub import { #{{{
+sub import {
hook(type => "getsetup", id => "hnb", call => \&getsetup);
hook(type => "htmlize", id => "hnb", call => \&htmlize);
-} #}}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 1,
rebuild => 1, # format plugin
},
-} #}}}
+}
-sub htmlize (@) { #{{{
+sub htmlize (@) {
my %params = @_;
# hnb outputs version number etc. every time to STDOUT, so
@@ -52,6 +52,6 @@ sub htmlize (@) { #{{{
$ret =~ s/<body>.*//si;
return $ret;
-} #}}}
+}
1;
diff --git a/IkiWiki/Plugin/html.pm b/IkiWiki/Plugin/html.pm
index b75207578..9b9547cca 100644
--- a/IkiWiki/Plugin/html.pm
+++ b/IkiWiki/Plugin/html.pm
@@ -6,7 +6,7 @@ use warnings;
use strict;
use IkiWiki 2.00;
-sub import { #{{{
+sub import {
hook(type => "getsetup", id => "html", call => \&getsetup);
hook(type => "htmlize", id => "html", call => \&htmlize);
hook(type => "htmlize", id => "htm", call => \&htmlize);
@@ -14,19 +14,19 @@ sub import { #{{{
# ikiwiki defaults to skipping .html files as a security measure;
# make it process them so this plugin can take effect
$config{wiki_file_prune_regexps} = [ grep { !m/\\\.x\?html\?\$/ } @{$config{wiki_file_prune_regexps}} ];
-} # }}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 1,
rebuild => 1, # format plugin
},
-} #}}}
+}
-sub htmlize (@) { #{{{
+sub htmlize (@) {
my %params=@_;
return $params{content};
-} #}}}
+}
1
diff --git a/IkiWiki/Plugin/htmlbalance.pm b/IkiWiki/Plugin/htmlbalance.pm
new file mode 100644
index 000000000..acbe40a5d
--- /dev/null
+++ b/IkiWiki/Plugin/htmlbalance.pm
@@ -0,0 +1,57 @@
+#!/usr/bin/perl
+package IkiWiki::Plugin::htmlbalance;
+
+# htmlbalance: Parse and re-serialize HTML to ensure balanced tags
+#
+# Copyright 2008 Simon McVittie <http://smcv.pseudorandom.co.uk/>
+# Licensed under the GNU GPL, version 2, or any later version published by the
+# Free Software Foundation
+
+use warnings;
+use strict;
+use IkiWiki 2.00;
+use HTML::TreeBuilder;
+use HTML::Entities;
+
+sub import {
+ hook(type => "getsetup", id => "htmlbalance", call => \&getsetup);
+ hook(type => "sanitize", id => "htmlbalance", call => \&sanitize);
+}
+
+sub getsetup () {
+ return
+ plugin => {
+ safe => 1,
+ rebuild => undef,
+ },
+}
+
+sub sanitize (@) {
+ my %params=@_;
+ my $ret = '';
+
+ my $tree = HTML::TreeBuilder->new();
+ $tree->ignore_unknown(0);
+ $tree->ignore_ignorable_whitespace(0);
+ $tree->no_space_compacting(1);
+ $tree->p_strict(1);
+ $tree->store_comments(0);
+ $tree->store_declarations(0);
+ $tree->store_pis(0);
+ $tree->parse_content($params{content});
+ my @nodes = $tree->disembowel();
+ foreach my $node (@nodes) {
+ if (ref $node) {
+ $ret .= $node->as_XML();
+ chomp $ret;
+ $node->delete();
+ }
+ else {
+ $ret .= encode_entities($node);
+ }
+ }
+ $tree->delete();
+ return $ret;
+}
+
+1
diff --git a/IkiWiki/Plugin/htmlscrubber.pm b/IkiWiki/Plugin/htmlscrubber.pm
index 7398c8478..823b3d806 100644
--- a/IkiWiki/Plugin/htmlscrubber.pm
+++ b/IkiWiki/Plugin/htmlscrubber.pm
@@ -9,7 +9,7 @@ use IkiWiki 2.00;
# Feel free to use it from other plugins.
our $safe_url_regexp;
-sub import { #{{{
+sub import {
hook(type => "getsetup", id => "htmlscrubber", call => \&getsetup);
hook(type => "sanitize", id => "htmlscrubber", call => \&sanitize);
@@ -33,9 +33,9 @@ sub import { #{{{
# data is a special case. Allow data:image/*, but
# disallow data:text/javascript and everything else.
$safe_url_regexp=qr/^(?:(?:$uri_schemes):|data:image\/|[^:]+(?:$|\/))/i;
-} # }}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 1,
@@ -49,9 +49,9 @@ sub getsetup () { #{{{
safe => 1,
rebuild => undef,
},
-} #}}}
+}
-sub sanitize (@) { #{{{
+sub sanitize (@) {
my %params=@_;
if (exists $config{htmlscrubber_skip} &&
@@ -62,10 +62,10 @@ sub sanitize (@) { #{{{
}
return scrubber()->scrub($params{content});
-} # }}}
+}
my $_scrubber;
-sub scrubber { #{{{
+sub scrubber {
return $_scrubber if defined $_scrubber;
eval q{use HTML::Scrubber};
@@ -111,6 +111,6 @@ sub scrubber { #{{{
}],
);
return $_scrubber;
-} # }}}
+}
1
diff --git a/IkiWiki/Plugin/htmltidy.pm b/IkiWiki/Plugin/htmltidy.pm
index 9ba5e9592..02438ebef 100644
--- a/IkiWiki/Plugin/htmltidy.pm
+++ b/IkiWiki/Plugin/htmltidy.pm
@@ -12,20 +12,20 @@ use strict;
use IkiWiki 2.00;
use IPC::Open2;
-sub import { #{{{
+sub import {
hook(type => "getsetup", id => "tidy", call => \&getsetup);
hook(type => "sanitize", id => "tidy", call => \&sanitize);
-} # }}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 1,
rebuild => undef,
},
-} #}}}
+}
-sub sanitize (@) { #{{{
+sub sanitize (@) {
my %params=@_;
my $pid;
@@ -49,6 +49,6 @@ sub sanitize (@) { #{{{
return "" if $sigpipe || ! defined $ret;
return $ret;
-} # }}}
+}
1
diff --git a/IkiWiki/Plugin/httpauth.pm b/IkiWiki/Plugin/httpauth.pm
index fc0cffb1e..39edff615 100644
--- a/IkiWiki/Plugin/httpauth.pm
+++ b/IkiWiki/Plugin/httpauth.pm
@@ -6,26 +6,26 @@ use warnings;
use strict;
use IkiWiki 2.00;
-sub import { #{{{
+sub import {
hook(type => "getsetup", id => "httpauth", call => \&getsetup);
hook(type => "auth", id => "httpauth", call => \&auth);
-} # }}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 1,
rebuild => 0,
},
-} #}}}
+}
-sub auth ($$) { #{{{
+sub auth ($$) {
my $cgi=shift;
my $session=shift;
if (defined $cgi->remote_user()) {
$session->param("name", $cgi->remote_user());
}
-} #}}}
+}
1
diff --git a/IkiWiki/Plugin/img.pm b/IkiWiki/Plugin/img.pm
index 7b89ab673..395890c0e 100644
--- a/IkiWiki/Plugin/img.pm
+++ b/IkiWiki/Plugin/img.pm
@@ -9,20 +9,20 @@ use IkiWiki 2.00;
my %imgdefaults;
-sub import { #{{{
+sub import {
hook(type => "getsetup", id => "img", call => \&getsetup);
hook(type => "preprocess", id => "img", call => \&preprocess, scan => 1);
-} #}}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 1,
rebuild => undef,
},
-} #}}}
+}
-sub preprocess (@) { #{{{
+sub preprocess (@) {
my ($image) = $_[0] =~ /$config{wiki_file_regexp}/; # untaint
my %params=@_;
@@ -149,6 +149,6 @@ sub preprocess (@) { #{{{
else {
return $imgtag;
}
-} #}}}
+}
1
diff --git a/IkiWiki/Plugin/inline.pm b/IkiWiki/Plugin/inline.pm
index 7fe5a4dcf..e1e57e43e 100644
--- a/IkiWiki/Plugin/inline.pm
+++ b/IkiWiki/Plugin/inline.pm
@@ -13,7 +13,7 @@ my %page_numfeeds;
my @inline;
my $nested=0;
-sub import { #{{{
+sub import {
hook(type => "getopt", id => "inline", call => \&getopt);
hook(type => "getsetup", id => "inline", call => \&getsetup);
hook(type => "checkconfig", id => "inline", call => \&checkconfig);
@@ -22,15 +22,14 @@ sub import { #{{{
call => \&IkiWiki::preprocess_inline);
hook(type => "pagetemplate", id => "inline",
call => \&IkiWiki::pagetemplate_inline);
- hook(type => "format", id => "inline", call => \&format);
+ hook(type => "format", id => "inline", call => \&format, first => 1);
# Hook to change to do pinging since it's called late.
# This ensures each page only pings once and prevents slow
# pings interrupting page builds.
- hook(type => "change", id => "inline",
- call => \&IkiWiki::pingurl);
-} # }}}
+ hook(type => "change", id => "inline", call => \&IkiWiki::pingurl);
+}
-sub getopt () { #{{{
+sub getopt () {
eval q{use Getopt::Long};
error($@) if $@;
Getopt::Long::Configure('pass_through');
@@ -43,9 +42,9 @@ sub getopt () { #{{{
push @{$config{pingurl}}, $_[1];
},
);
-} #}}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 1,
@@ -86,9 +85,9 @@ sub getsetup () { #{{{
safe => 1,
rebuild => 0,
},
-} #}}}
+}
-sub checkconfig () { #{{{
+sub checkconfig () {
if (($config{rss} || $config{atom}) && ! length $config{url}) {
error(gettext("Must specify url to wiki with --url when using --rss or --atom"));
}
@@ -101,9 +100,9 @@ sub checkconfig () { #{{{
if (! exists $config{pingurl}) {
$config{pingurl}=[];
}
-} #}}}
+}
-sub format (@) { #{{{
+sub format (@) {
my %params=@_;
# Fill in the inline content generated earlier. This is actually an
@@ -112,9 +111,9 @@ sub format (@) { #{{{
delete @inline[$1,]
}eg;
return $params{content};
-} #}}}
+}
-sub sessioncgi ($$) { #{{{
+sub sessioncgi ($$) {
my $q=shift;
my $session=shift;
@@ -149,7 +148,7 @@ package IkiWiki;
my %toping;
my %feedlinks;
-sub preprocess_inline (@) { #{{{
+sub preprocess_inline (@) {
my %params=@_;
if (! exists $params{pages}) {
@@ -161,6 +160,7 @@ sub preprocess_inline (@) { #{{{
my $atom=(($config{atom} || $config{allowatom}) && exists $params{atom}) ? yesno($params{atom}) : $config{atom};
my $quick=exists $params{quick} ? yesno($params{quick}) : 0;
my $feeds=exists $params{feeds} ? yesno($params{feeds}) : !$quick;
+ my $emptyfeeds=exists $params{emptyfeeds} ? yesno($params{emptyfeeds}) : 1;
my $feedonly=yesno($params{feedonly});
if (! exists $params{show} && ! $archive) {
$params{show}=10;
@@ -232,29 +232,51 @@ sub preprocess_inline (@) { #{{{
# that if they are removed or otherwise changed, the inline will be
# sure to be updated.
add_depends($params{page}, join(" or ", $#list >= $#feedlist ? @list : @feedlist));
-
- my $feednum="";
-
- my $feedid=join("\0", map { $_."\0".$params{$_} } sort keys %params);
- if (exists $knownfeeds{$feedid}) {
- $feednum=$knownfeeds{$feedid};
+
+ if ($feeds && exists $params{feedpages}) {
+ @feedlist=grep { pagespec_match($_, $params{feedpages}, location => $params{page}) } @feedlist;
}
- else {
- if (exists $page_numfeeds{$params{destpage}}) {
- if ($feeds) {
- $feednum=$knownfeeds{$feedid}=++$page_numfeeds{$params{destpage}};
+
+ my ($feedbase, $feednum);
+ if ($feeds) {
+ # Ensure that multiple feeds on a page go to unique files.
+
+ # Feedfile can lead to conflicts if usedirs is not enabled,
+ # so avoid supporting it in that case.
+ delete $params{feedfile} if ! $config{usedirs};
+ # Tight limits on legal feedfiles, to avoid security issues
+ # and conflicts.
+ if (defined $params{feedfile}) {
+ if ($params{feedfile} =~ /\// ||
+ $params{feedfile} !~ /$config{wiki_file_regexp}/) {
+ error("illegal feedfile");
}
+ $params{feedfile}=possibly_foolish_untaint($params{feedfile});
+ }
+ $feedbase=targetpage($params{destpage}, "", $params{feedfile});
+
+ my $feedid=join("\0", $feedbase, map { $_."\0".$params{$_} } sort keys %params);
+ if (exists $knownfeeds{$feedid}) {
+ $feednum=$knownfeeds{$feedid};
}
else {
- $feednum=$knownfeeds{$feedid}="";
- if ($feeds) {
- $page_numfeeds{$params{destpage}}=1;
+ if (exists $page_numfeeds{$params{destpage}}{$feedbase}) {
+ if ($feeds) {
+ $feednum=$knownfeeds{$feedid}=++$page_numfeeds{$params{destpage}}{$feedbase};
+ }
+ }
+ else {
+ $feednum=$knownfeeds{$feedid}="";
+ if ($feeds) {
+ $page_numfeeds{$params{destpage}}{$feedbase}=1;
+ }
}
}
}
- my $rssurl=basename(rsspage($params{destpage}).$feednum) if $feeds && $rss;
- my $atomurl=basename(atompage($params{destpage}).$feednum) if $feeds && $atom;
+ my $rssurl=basename($feedbase."rss".$feednum) if $feeds && $rss;
+ my $atomurl=basename($feedbase."atom".$feednum) if $feeds && $atom;
+
my $ret="";
if (length $config{cgiurl} && ! $params{preview} && (exists $params{rootpage} ||
@@ -285,8 +307,12 @@ sub preprocess_inline (@) { #{{{
gettext("Add a new post titled:"));
}
$ret.=$formtemplate->output;
+
+ # The post form includes the feed buttons, so
+ # emptyfeeds cannot be hidden.
+ $emptyfeeds=1;
}
- elsif ($feeds && !$params{preview}) {
+ elsif ($feeds && !$params{preview} && ($emptyfeeds || @feedlist)) {
# Add feed buttons.
my $linktemplate=template("feedlink.tmpl", blind_cache => 1);
$linktemplate->param(rssurl => $rssurl) if $rss;
@@ -314,6 +340,7 @@ sub preprocess_inline (@) { #{{{
$template->param(content => $content);
}
$template->param(pageurl => urlto(bestlink($params{page}, $page), $params{destpage}));
+ $template->param(inlinepage => $page);
$template->param(title => pagetitle(basename($page)));
$template->param(ctime => displaytime($pagectime{$page}, $params{timeformat}));
$template->param(mtime => displaytime($pagemtime{$page}, $params{timeformat}));
@@ -363,13 +390,9 @@ sub preprocess_inline (@) { #{{{
}
}
- if ($feeds) {
- if (exists $params{feedpages}) {
- @feedlist=grep { pagespec_match($_, $params{feedpages}, location => $params{page}) } @feedlist;
- }
-
+ if ($feeds && ($emptyfeeds || @feedlist)) {
if ($rss) {
- my $rssp=rsspage($params{destpage}).$feednum;
+ my $rssp=$feedbase."rss".$feednum;
will_render($params{destpage}, $rssp);
if (! $params{preview}) {
writefile($rssp, $config{destdir},
@@ -380,7 +403,7 @@ sub preprocess_inline (@) { #{{{
}
}
if ($atom) {
- my $atomp=atompage($params{destpage}).$feednum;
+ my $atomp=$feedbase."atom".$feednum;
will_render($params{destpage}, $atomp);
if (! $params{preview}) {
writefile($atomp, $config{destdir},
@@ -394,18 +417,18 @@ sub preprocess_inline (@) { #{{{
return $ret if $raw || $nested;
push @inline, $ret;
return "<div class=\"inline\" id=\"$#inline\"></div>\n\n";
-} #}}}
+}
-sub pagetemplate_inline (@) { #{{{
+sub pagetemplate_inline (@) {
my %params=@_;
my $page=$params{page};
my $template=$params{template};
$template->param(feedlinks => $feedlinks{$page})
if exists $feedlinks{$page} && $template->query(name => "feedlinks");
-} #}}}
+}
-sub get_inline_content ($$) { #{{{
+sub get_inline_content ($$) {
my $page=shift;
my $destpage=shift;
@@ -424,9 +447,9 @@ sub get_inline_content ($$) { #{{{
else {
return "";
}
-} #}}}
+}
-sub date_822 ($) { #{{{
+sub date_822 ($) {
my $time=shift;
my $lc_time=POSIX::setlocale(&POSIX::LC_TIME);
@@ -434,9 +457,9 @@ sub date_822 ($) { #{{{
my $ret=POSIX::strftime("%a, %d %b %Y %H:%M:%S %z", localtime($time));
POSIX::setlocale(&POSIX::LC_TIME, $lc_time);
return $ret;
-} #}}}
+}
-sub date_3339 ($) { #{{{
+sub date_3339 ($) {
my $time=shift;
my $lc_time=POSIX::setlocale(&POSIX::LC_TIME);
@@ -444,9 +467,9 @@ sub date_3339 ($) { #{{{
my $ret=POSIX::strftime("%Y-%m-%dT%H:%M:%SZ", gmtime($time));
POSIX::setlocale(&POSIX::LC_TIME, $lc_time);
return $ret;
-} #}}}
+}
-sub absolute_urls ($$) { #{{{
+sub absolute_urls ($$) {
# sucky sub because rss sucks
my $content=shift;
my $baseurl=shift;
@@ -467,17 +490,9 @@ sub absolute_urls ($$) { #{{{
$content=~s/(<a(?:\s+(?:class|id)\s*="?\w+"?)?)\s+href=\s*"(?!\w+:)(\/[^"]*)"/$1 href="$urltop$2"/mig;
$content=~s/(<img(?:\s+(?:class|id|width|height)\s*="?\w+"?)*)\s+src=\s*"(?!\w+:)(\/[^"]*)"/$1 src="$urltop$2"/mig;
return $content;
-} #}}}
-
-sub rsspage ($) { #{{{
- return targetpage(shift, "rss");
-} #}}}
-
-sub atompage ($) { #{{{
- return targetpage(shift, "atom");
-} #}}}
+}
-sub genfeed ($$$$$@) { #{{{
+sub genfeed ($$$$$@) {
my $feedtype=shift;
my $feedurl=shift;
my $feeddesc=shift;
@@ -562,9 +577,9 @@ sub genfeed ($$$$$@) { #{{{
});
return $template->output;
-} #}}}
+}
-sub pingurl (@) { #{{{
+sub pingurl (@) {
return unless @{$config{pingurl}} && %toping;
eval q{require RPC::XML::Client};
@@ -610,6 +625,6 @@ sub pingurl (@) { #{{{
}
exit 0; # daemon done
-} #}}}
+}
1
diff --git a/IkiWiki/Plugin/link.pm b/IkiWiki/Plugin/link.pm
index 0638d4bdd..3799209d0 100644
--- a/IkiWiki/Plugin/link.pm
+++ b/IkiWiki/Plugin/link.pm
@@ -7,23 +7,23 @@ use IkiWiki 2.00;
my $link_regexp;
-sub import { #{{{
+sub import {
hook(type => "getsetup", id => "link", call => \&getsetup);
hook(type => "checkconfig", id => "link", call => \&checkconfig);
hook(type => "linkify", id => "link", call => \&linkify);
hook(type => "scan", id => "link", call => \&scan);
hook(type => "renamepage", id => "link", call => \&renamepage);
-} # }}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 1,
rebuild => 1,
},
-} #}}}
+}
-sub checkconfig () { #{{{
+sub checkconfig () {
if ($config{prefix_directives}) {
$link_regexp = qr{
\[\[(?=[^!]) # beginning of link
@@ -58,9 +58,9 @@ sub checkconfig () { #{{{
\]\] # end of link
}x,
}
-} #}}}
+}
-sub linkify (@) { #{{{
+sub linkify (@) {
my %params=@_;
my $page=$params{page};
my $destpage=$params{destpage};
@@ -78,9 +78,9 @@ sub linkify (@) { #{{{
}eg;
return $params{content};
-} #}}}
+}
-sub scan (@) { #{{{
+sub scan (@) {
my %params=@_;
my $page=$params{page};
my $content=$params{content};
@@ -88,9 +88,9 @@ sub scan (@) { #{{{
while ($content =~ /(?<!\\)$link_regexp/g) {
push @{$links{$page}}, linkpage($2);
}
-} # }}}
+}
-sub renamepage (@) { #{{{
+sub renamepage (@) {
my %params=@_;
my $page=$params{page};
my $old=$params{oldpage};
@@ -118,6 +118,6 @@ sub renamepage (@) { #{{{
}eg;
return $params{content};
-} #}}}
+}
1
diff --git a/IkiWiki/Plugin/linkmap.pm b/IkiWiki/Plugin/linkmap.pm
index 81ee665c8..cb9f3ef41 100644
--- a/IkiWiki/Plugin/linkmap.pm
+++ b/IkiWiki/Plugin/linkmap.pm
@@ -6,24 +6,24 @@ use strict;
use IkiWiki 2.00;
use IPC::Open2;
-sub import { #{{{
+sub import {
hook(type => "getsetup", id => "linkmap", call => \&getsetup);
hook(type => "preprocess", id => "linkmap", call => \&preprocess);
hook(type => "format", id => "linkmap", call => \&format);
-} # }}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 1,
rebuild => undef,
},
-} #}}}
+}
my $mapnum=0;
my %maps;
-sub preprocess (@) { #{{{
+sub preprocess (@) {
my %params=@_;
$params{pages}="*" unless defined $params{pages};
@@ -39,17 +39,17 @@ sub preprocess (@) { #{{{
$mapnum++;
$maps{$mapnum}=\%params;
return "<div class=\"linkmap$mapnum\"></div>";
-} # }}}
+}
-sub format (@) { #{{{
+sub format (@) {
my %params=@_;
$params{content}=~s/<div class=\"linkmap(\d+)"><\/div>/genmap($1)/eg;
return $params{content};
-} # }}}
+}
-sub genmap ($) { #{{{
+sub genmap ($) {
my $mapnum=shift;
return "" unless exists $maps{$mapnum};
my %params=%{$maps{$mapnum}};
@@ -106,6 +106,6 @@ sub genmap ($) { #{{{
error gettext("failed to run dot") if $sigpipe;
return $ret;
-} #}}}
+}
1
diff --git a/IkiWiki/Plugin/listdirectives.pm b/IkiWiki/Plugin/listdirectives.pm
index 2ab3e4665..be82b0495 100644
--- a/IkiWiki/Plugin/listdirectives.pm
+++ b/IkiWiki/Plugin/listdirectives.pm
@@ -6,15 +6,15 @@ use warnings;
use strict;
use IkiWiki 2.00;
-sub import { #{{{
+sub import {
add_underlay("directives");
hook(type => "getsetup", id => "listdirectives", call => \&getsetup);
hook(type => "checkconfig", id => "listdirectives", call => \&checkconfig);
hook(type => "needsbuild", id => "listdirectives", call => \&needsbuild);
hook(type => "preprocess", id => "listdirectives", call => \&preprocess);
-} # }}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 1,
@@ -27,22 +27,22 @@ sub getsetup () { #{{{
safe => 1,
rebuild => 1,
},
-} #}}}
+}
my @fulllist;
my @shortlist;
my $pluginstring;
-sub checkconfig () { #{{{
+sub checkconfig () {
if (! defined $config{directive_description_dir}) {
$config{directive_description_dir} = "ikiwiki/directive";
}
else {
$config{directive_description_dir} =~ s/\/+$//;
}
-} #}}}
+}
-sub needsbuild (@) { #{{{
+sub needsbuild (@) {
my $needsbuild=shift;
@fulllist = sort keys %{$IkiWiki::hooks{preprocess}};
@@ -63,9 +63,9 @@ sub needsbuild (@) { #{{{
}
}
}
-} # }}}
+}
-sub preprocess (@) { #{{{
+sub preprocess (@) {
my %params=@_;
$pagestate{$params{destpage}}{listdirectives}{shown}=$pluginstring;
@@ -92,6 +92,6 @@ sub preprocess (@) { #{{{
$result .= "</ul>";
return $result;
-} # }}}
+}
1
diff --git a/IkiWiki/Plugin/lockedit.pm b/IkiWiki/Plugin/lockedit.pm
index f6cac6cdd..31a9e70cd 100644
--- a/IkiWiki/Plugin/lockedit.pm
+++ b/IkiWiki/Plugin/lockedit.pm
@@ -5,14 +5,14 @@ use warnings;
use strict;
use IkiWiki 2.00;
-sub import { #{{{
+sub import {
hook(type => "getsetup", id => "lockedit", call => \&getsetup);
hook(type => "canedit", id => "lockedit", call => \&canedit);
hook(type => "formbuilder_setup", id => "lockedit",
call => \&formbuilder_setup);
-} # }}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 1,
@@ -26,9 +26,9 @@ sub getsetup () { #{{{
safe => 1,
rebuild => 0,
},
-} #}}}
+}
-sub canedit ($$) { #{{{
+sub canedit ($$) {
my $page=shift;
my $cgi=shift;
my $session=shift;
@@ -70,9 +70,9 @@ sub canedit ($$) { #{{{
}
return undef;
-} #}}}
+}
-sub formbuilder_setup (@) { #{{{
+sub formbuilder_setup (@) {
my %params=@_;
# XXX deprecated, should be removed eventually
@@ -109,6 +109,6 @@ sub formbuilder_setup (@) { #{{{
}
}
}
-} #}}}
+}
1
diff --git a/IkiWiki/Plugin/map.pm b/IkiWiki/Plugin/map.pm
index 18c584a30..af14ef5de 100644
--- a/IkiWiki/Plugin/map.pm
+++ b/IkiWiki/Plugin/map.pm
@@ -11,20 +11,20 @@ use warnings;
use strict;
use IkiWiki 2.00;
-sub import { #{{{
+sub import {
hook(type => "getsetup", id => "map", call => \&getsetup);
hook(type => "preprocess", id => "map", call => \&preprocess);
-} # }}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 1,
rebuild => undef,
},
-} #}}}
+}
-sub preprocess (@) { #{{{
+sub preprocess (@) {
my %params=@_;
$params{pages}="*" unless defined $params{pages};
@@ -144,6 +144,6 @@ sub preprocess (@) { #{{{
}
$map .= "</div>\n";
return $map;
-} # }}}
+}
1
diff --git a/IkiWiki/Plugin/mdwn.pm b/IkiWiki/Plugin/mdwn.pm
index 6c1d2ef3c..0d5f398a0 100644
--- a/IkiWiki/Plugin/mdwn.pm
+++ b/IkiWiki/Plugin/mdwn.pm
@@ -6,12 +6,12 @@ use warnings;
use strict;
use IkiWiki 2.00;
-sub import { #{{{
+sub import {
hook(type => "getsetup", id => "mdwn", call => \&getsetup);
hook(type => "htmlize", id => "mdwn", call => \&htmlize);
-} # }}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 1,
@@ -24,10 +24,10 @@ sub getsetup () { #{{{
safe => 1,
rebuild => 1,
},
-} #}}}
+}
my $markdown_sub;
-sub htmlize (@) { #{{{
+sub htmlize (@) {
my %params=@_;
my $content = $params{content};
@@ -83,6 +83,6 @@ sub htmlize (@) { #{{{
$content=Encode::decode_utf8($content);
return $content;
-} # }}}
+}
1
diff --git a/IkiWiki/Plugin/mercurial.pm b/IkiWiki/Plugin/mercurial.pm
index 7aceebcdb..82423286d 100644
--- a/IkiWiki/Plugin/mercurial.pm
+++ b/IkiWiki/Plugin/mercurial.pm
@@ -7,7 +7,7 @@ use IkiWiki;
use Encode;
use open qw{:utf8 :std};
-sub import { #{{{
+sub import {
hook(type => "checkconfig", id => "mercurial", call => \&checkconfig);
hook(type => "getsetup", id => "mercurial", call => \&getsetup);
hook(type => "rcs", id => "rcs_update", call => \&rcs_update);
@@ -20,18 +20,18 @@ sub import { #{{{
hook(type => "rcs", id => "rcs_recentchanges", call => \&rcs_recentchanges);
hook(type => "rcs", id => "rcs_diff", call => \&rcs_diff);
hook(type => "rcs", id => "rcs_getctime", call => \&rcs_getctime);
-} #}}}
+}
-sub checkconfig () { #{{{
+sub checkconfig () {
if (exists $config{mercurial_wrapper} && length $config{mercurial_wrapper}) {
push @{$config{wrappers}}, {
wrapper => $config{mercurial_wrapper},
wrappermode => (defined $config{mercurial_wrappermode} ? $config{mercurial_wrappermode} : "06755"),
};
}
-} #}}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 0, # rcs plugin
@@ -65,9 +65,9 @@ sub getsetup () { #{{{
safe => 1,
rebuild => 1,
},
-} #}}}
+}
-sub mercurial_log ($) { #{{{
+sub mercurial_log ($) {
my $out = shift;
my @infos;
@@ -111,20 +111,20 @@ sub mercurial_log ($) { #{{{
close $out;
return @infos;
-} #}}}
+}
-sub rcs_update () { #{{{
+sub rcs_update () {
my @cmdline = ("hg", "-q", "-R", "$config{srcdir}", "update");
if (system(@cmdline) != 0) {
warn "'@cmdline' failed: $!";
}
-} #}}}
+}
-sub rcs_prepedit ($) { #{{{
+sub rcs_prepedit ($) {
return "";
-} #}}}
+}
-sub rcs_commit ($$$;$$) { #{{{
+sub rcs_commit ($$$;$$) {
my ($file, $message, $rcstoken, $user, $ipaddr) = @_;
if (defined $user) {
@@ -149,7 +149,7 @@ sub rcs_commit ($$$;$$) { #{{{
}
return undef; # success
-} #}}}
+}
sub rcs_commit_staged ($$$) {
# Commits all staged changes. Changes can be staged using rcs_add,
@@ -159,28 +159,28 @@ sub rcs_commit_staged ($$$) {
error("rcs_commit_staged not implemented for mercurial"); # TODO
}
-sub rcs_add ($) { # {{{
+sub rcs_add ($) {
my ($file) = @_;
my @cmdline = ("hg", "-q", "-R", "$config{srcdir}", "add", "$config{srcdir}/$file");
if (system(@cmdline) != 0) {
warn "'@cmdline' failed: $!";
}
-} #}}}
+}
-sub rcs_remove ($) { # {{{
+sub rcs_remove ($) {
my ($file) = @_;
error("rcs_remove not implemented for mercurial"); # TODO
-} #}}}
+}
-sub rcs_rename ($$) { # {{{
+sub rcs_rename ($$) {
my ($src, $dest) = @_;
error("rcs_rename not implemented for mercurial"); # TODO
-} #}}}
+}
-sub rcs_recentchanges ($) { #{{{
+sub rcs_recentchanges ($) {
my ($num) = @_;
my @cmdline = ("hg", "-R", $config{srcdir}, "log", "-v", "-l", $num,
@@ -225,13 +225,13 @@ sub rcs_recentchanges ($) { #{{{
}
return @ret;
-} #}}}
+}
-sub rcs_diff ($) { #{{{
+sub rcs_diff ($) {
# TODO
-} #}}}
+}
-sub rcs_getctime ($) { #{{{
+sub rcs_getctime ($) {
my ($file) = @_;
# XXX filename passes through the shell here, should try to avoid
@@ -251,6 +251,6 @@ sub rcs_getctime ($) { #{{{
my $ctime = str2time($log[0]->{"date"});
return $ctime;
-} #}}}
+}
1
diff --git a/IkiWiki/Plugin/meta.pm b/IkiWiki/Plugin/meta.pm
index 8d444109f..8c214139f 100644
--- a/IkiWiki/Plugin/meta.pm
+++ b/IkiWiki/Plugin/meta.pm
@@ -8,22 +8,22 @@ use IkiWiki 2.00;
my %metaheaders;
-sub import { #{{{
+sub import {
hook(type => "getsetup", id => "meta", call => \&getsetup);
hook(type => "needsbuild", id => "meta", call => \&needsbuild);
hook(type => "preprocess", id => "meta", call => \&preprocess, scan => 1);
hook(type => "pagetemplate", id => "meta", call => \&pagetemplate);
-} # }}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 1,
rebuild => undef,
},
-} #}}}
+}
-sub needsbuild (@) { #{{{
+sub needsbuild (@) {
my $needsbuild=shift;
foreach my $page (keys %pagestate) {
if (exists $pagestate{$page}{meta}) {
@@ -38,16 +38,17 @@ sub needsbuild (@) { #{{{
}
}
-sub scrub ($) { #{{{
+sub scrub ($$) {
if (IkiWiki::Plugin::htmlscrubber->can("sanitize")) {
- return IkiWiki::Plugin::htmlscrubber::sanitize(content => shift);
+ return IkiWiki::Plugin::htmlscrubber::sanitize(
+ content => shift, destpage => shift);
}
else {
return shift;
}
-} #}}}
+}
-sub safeurl ($) { #{{{
+sub safeurl ($) {
my $url=shift;
if (exists $IkiWiki::Plugin::htmlscrubber::{safe_url_regexp} &&
defined $IkiWiki::Plugin::htmlscrubber::safe_url_regexp) {
@@ -56,9 +57,9 @@ sub safeurl ($) { #{{{
else {
return 1;
}
-} #}}}
+}
-sub htmlize ($$$) { #{{{
+sub htmlize ($$$) {
my $page = shift;
my $destpage = shift;
@@ -67,7 +68,7 @@ sub htmlize ($$$) { #{{{
IkiWiki::preprocess($page, $destpage, shift)));
}
-sub preprocess (@) { #{{{
+sub preprocess (@) {
return "" unless @_;
my %params=@_;
my $key=shift;
@@ -120,6 +121,13 @@ sub preprocess (@) { #{{{
$pagestate{$page}{meta}{authorurl}=$value if safeurl($value);
# fallthrough
}
+ elsif ($key eq 'date') {
+ eval q{use Date::Parse};
+ if (! $@) {
+ my $time = str2time($value);
+ $IkiWiki::pagectime{$page}=$time if defined $time;
+ }
+ }
if (! defined wantarray) {
# avoid collecting duplicate data during scan pass
@@ -127,17 +135,10 @@ sub preprocess (@) { #{{{
}
# Metadata collection that happens only during preprocessing pass.
- if ($key eq 'date') {
- eval q{use Date::Parse};
- if (! $@) {
- my $time = str2time($value);
- $IkiWiki::pagectime{$page}=$time if defined $time;
- }
- }
- elsif ($key eq 'permalink') {
+ if ($key eq 'permalink') {
if (safeurl($value)) {
$pagestate{$page}{meta}{permalink}=$value;
- push @{$metaheaders{$page}}, scrub('<link rel="bookmark" href="'.encode_entities($value).'" />');
+ push @{$metaheaders{$page}}, scrub('<link rel="bookmark" href="'.encode_entities($value).'" />', $destpage);
}
}
elsif ($key eq 'stylesheet') {
@@ -206,7 +207,7 @@ sub preprocess (@) { #{{{
my $delay=int(exists $params{delay} ? $params{delay} : 0);
my $redir="<meta http-equiv=\"refresh\" content=\"$delay; URL=$value\" />";
if (! $safe) {
- $redir=scrub($redir);
+ $redir=scrub($redir, $destpage);
}
push @{$metaheaders{$page}}, $redir;
}
@@ -216,7 +217,7 @@ sub preprocess (@) { #{{{
join(" ", map {
encode_entities($_)."=\"".encode_entities(decode_entities($params{$_}))."\""
} keys %params).
- " />\n");
+ " />\n", $destpage);
}
}
elsif ($key eq 'robots') {
@@ -225,13 +226,13 @@ sub preprocess (@) { #{{{
}
else {
push @{$metaheaders{$page}}, scrub('<meta name="'.encode_entities($key).
- '" content="'.encode_entities($value).'" />');
+ '" content="'.encode_entities($value).'" />', $destpage);
}
return "";
-} # }}}
+}
-sub pagetemplate (@) { #{{{
+sub pagetemplate (@) {
my %params=@_;
my $page=$params{page};
my $destpage=$params{destpage};
@@ -259,9 +260,9 @@ sub pagetemplate (@) { #{{{
$template->param($field => htmlize($page, $destpage, $pagestate{$page}{meta}{$field}));
}
}
-} # }}}
+}
-sub match { #{{{
+sub match {
my $field=shift;
my $page=shift;
@@ -287,28 +288,28 @@ sub match { #{{{
else {
return IkiWiki::FailReason->new("$page does not have a $field");
}
-} #}}}
+}
package IkiWiki::PageSpec;
-sub match_title ($$;@) { #{{{
+sub match_title ($$;@) {
IkiWiki::Plugin::meta::match("title", @_);
-} #}}}
+}
-sub match_author ($$;@) { #{{{
+sub match_author ($$;@) {
IkiWiki::Plugin::meta::match("author", @_);
-} #}}}
+}
-sub match_authorurl ($$;@) { #{{{
+sub match_authorurl ($$;@) {
IkiWiki::Plugin::meta::match("authorurl", @_);
-} #}}}
+}
-sub match_license ($$;@) { #{{{
+sub match_license ($$;@) {
IkiWiki::Plugin::meta::match("license", @_);
-} #}}}
+}
-sub match_copyright ($$;@) { #{{{
+sub match_copyright ($$;@) {
IkiWiki::Plugin::meta::match("copyright", @_);
-} #}}}
+}
1
diff --git a/IkiWiki/Plugin/mirrorlist.pm b/IkiWiki/Plugin/mirrorlist.pm
index aab60c435..b726386f6 100644
--- a/IkiWiki/Plugin/mirrorlist.pm
+++ b/IkiWiki/Plugin/mirrorlist.pm
@@ -5,12 +5,12 @@ use warnings;
use strict;
use IkiWiki 2.00;
-sub import { #{{{
+sub import {
hook(type => "getsetup", id => "mirrorlist", call => \&getsetup);
hook(type => "pagetemplate", id => "mirrorlist", call => \&pagetemplate);
-} # }}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 1,
@@ -23,9 +23,9 @@ sub getsetup () { #{{{
safe => 1,
rebuild => 1,
},
-} #}}}
+}
-sub pagetemplate (@) { #{{{
+sub pagetemplate (@) {
my %params=@_;
my $template=$params{template};
@@ -34,9 +34,9 @@ sub pagetemplate (@) { #{{{
$value.=mirrorlist($params{page});
$template->param(extrafooter => $value);
}
-} # }}}
+}
-sub mirrorlist ($) { #{{{
+sub mirrorlist ($) {
my $page=shift;
return "<p>".
(keys %{$config{mirrorlist}} > 1 ? gettext("Mirrors") : gettext("Mirror")).
@@ -49,6 +49,6 @@ sub mirrorlist ($) { #{{{
} keys %{$config{mirrorlist}}
).
"</p>";
-} # }}}
+}
1
diff --git a/IkiWiki/Plugin/monotone.pm b/IkiWiki/Plugin/monotone.pm
index f31a8606b..38abb9a07 100644
--- a/IkiWiki/Plugin/monotone.pm
+++ b/IkiWiki/Plugin/monotone.pm
@@ -10,7 +10,7 @@ use Date::Format qw(time2str);
my $sha1_pattern = qr/[0-9a-fA-F]{40}/; # pattern to validate sha1sums
-sub import { #{{{
+sub import {
hook(type => "checkconfig", id => "monotone", call => \&checkconfig);
hook(type => "getsetup", id => "monotone", call => \&getsetup);
hook(type => "rcs", id => "rcs_update", call => \&rcs_update);
@@ -23,9 +23,9 @@ sub import { #{{{
hook(type => "rcs", id => "rcs_recentchanges", call => \&rcs_recentchanges);
hook(type => "rcs", id => "rcs_diff", call => \&rcs_diff);
hook(type => "rcs", id => "rcs_getctime", call => \&rcs_getctime);
-} #}}}
+}
-sub checkconfig () { #{{{
+sub checkconfig () {
if (!defined($config{mtnrootdir})) {
$config{mtnrootdir} = $config{srcdir};
}
@@ -61,9 +61,9 @@ sub checkconfig () { #{{{
wrappermode => (defined $config{mtn_wrappermode} ? $config{mtn_wrappermode} : "06755"),
};
}
-} #}}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 0, # rcs plugin
@@ -117,9 +117,9 @@ sub getsetup () { #{{{
safe => 0, # path
rebuild => 0,
},
-} #}}}
+}
-sub get_rev () { #{{{
+sub get_rev () {
my $sha1 = `mtn --root=$config{mtnrootdir} automate get_base_revision_id`;
($sha1) = $sha1 =~ m/($sha1_pattern)/; # sha1 is untainted now
@@ -128,9 +128,9 @@ sub get_rev () { #{{{
}
return $sha1;
-} #}}}
+}
-sub get_rev_auto ($) { #{{{
+sub get_rev_auto ($) {
my $automator=shift;
my @results = $automator->call("get_base_revision_id");
@@ -142,9 +142,9 @@ sub get_rev_auto ($) { #{{{
}
return $sha1;
-} #}}}
+}
-sub mtn_merge ($$$$) { #{{{
+sub mtn_merge ($$$$) {
my $leftRev=shift;
my $rightRev=shift;
my $branch=shift;
@@ -172,9 +172,9 @@ sub mtn_merge ($$$$) { #{{{
debug("merged $leftRev, $rightRev to make $mergeRev");
return $mergeRev;
-} #}}}
+}
-sub commit_file_to_new_rev ($$$$$$$$) { #{{{
+sub commit_file_to_new_rev ($$$$$$$$) {
my $automator=shift;
my $wsfilename=shift;
my $oldFileID=shift;
@@ -219,9 +219,9 @@ sub commit_file_to_new_rev ($$$$$$$$) { #{{{
debug("Added certs for rev: $newRevID");
return $newRevID;
-} #}}}
+}
-sub read_certs ($$) { #{{{
+sub read_certs ($$) {
my $automator=shift;
my $rev=shift;
my @results = $automator->call("certs", $rev);
@@ -239,9 +239,9 @@ sub read_certs ($$) { #{{{
}
return @ret;
-} #}}}
+}
-sub get_changed_files ($$) { #{{{
+sub get_changed_files ($$) {
my $automator=shift;
my $rev=shift;
@@ -261,9 +261,9 @@ sub get_changed_files ($$) { #{{{
}
return @ret;
-} #}}}
+}
-sub rcs_update () { #{{{
+sub rcs_update () {
chdir $config{srcdir}
or error("Cannot chdir to $config{srcdir}: $!");
@@ -278,9 +278,9 @@ sub rcs_update () { #{{{
if (system("mtn", "--root=$config{mtnrootdir}", "update", "--quiet") != 0) {
debug("monotone update failed");
}
-} #}}}
+}
-sub rcs_prepedit ($) { #{{{
+sub rcs_prepedit ($) {
my $file=shift;
chdir $config{srcdir}
@@ -289,9 +289,9 @@ sub rcs_prepedit ($) { #{{{
# For monotone, return the revision of the file when
# editing begins.
return get_rev();
-} #}}}
+}
-sub rcs_commit ($$$;$$) { #{{{
+sub rcs_commit ($$$;$$) {
# Tries to commit the page; returns undef on _success_ and
# a version of the page with the rcs's conflict markers on failure.
# The file is relative to the srcdir.
@@ -434,7 +434,7 @@ sub rcs_commit ($$$;$$) { #{{{
}
return undef # success
-} #}}}
+}
sub rcs_commit_staged ($$$) {
# Commits all staged changes. Changes can be staged using rcs_add,
@@ -466,7 +466,7 @@ sub rcs_commit_staged ($$$) {
}
}
-sub rcs_add ($) { #{{{
+sub rcs_add ($) {
my $file=shift;
chdir $config{srcdir}
@@ -476,9 +476,9 @@ sub rcs_add ($) { #{{{
$file) != 0) {
error("Monotone add failed");
}
-} #}}}
+}
-sub rcs_remove ($) { # {{{
+sub rcs_remove ($) {
my $file = shift;
chdir $config{srcdir}
@@ -495,9 +495,9 @@ sub rcs_remove ($) { # {{{
$file) != 0) {
error("Monotone remove failed");
}
-} #}}}
+}
-sub rcs_rename ($$) { # {{{
+sub rcs_rename ($$) {
my ($src, $dest) = @_;
chdir $config{srcdir}
@@ -507,9 +507,9 @@ sub rcs_rename ($$) { # {{{
$src, $dest) != 0) {
error("Monotone rename failed");
}
-} #}}}
+}
-sub rcs_recentchanges ($) { #{{{
+sub rcs_recentchanges ($) {
my $num=shift;
my @ret;
@@ -525,13 +525,12 @@ sub rcs_recentchanges ($) { #{{{
my $child = open(MTNLOG, "-|");
if (! $child) {
exec("mtn", "log", "--root=$config{mtnrootdir}", "--no-graph",
- "--brief") || error("mtn log failed to run");
+ "--brief", "--last=$num") || error("mtn log failed to run");
}
- while (($num >= 0) and (my $line = <MTNLOG>)) {
+ while (my $line = <MTNLOG>) {
if ($line =~ m/^($sha1_pattern)/) {
push @revs, $1;
- $num -= 1;
}
}
close MTNLOG || debug("mtn log exited $?");
@@ -615,9 +614,9 @@ sub rcs_recentchanges ($) { #{{{
$automator->close();
return @ret;
-} #}}}
+}
-sub rcs_diff ($) { #{{{
+sub rcs_diff ($) {
my $rev=shift;
my ($sha1) = $rev =~ /^($sha1_pattern)$/; # untaint
@@ -639,9 +638,9 @@ sub rcs_diff ($) { #{{{
else {
return join("", @lines);
}
-} #}}}
+}
-sub rcs_getctime ($) { #{{{
+sub rcs_getctime ($) {
my $file=shift;
chdir $config{srcdir}
@@ -691,6 +690,6 @@ sub rcs_getctime ($) { #{{{
$date=str2time($date, 'UTC');
debug("found ctime ".localtime($date)." for $file");
return $date;
-} #}}}
+}
1
diff --git a/IkiWiki/Plugin/more.pm b/IkiWiki/Plugin/more.pm
index 4484441c3..f1216ad3d 100644
--- a/IkiWiki/Plugin/more.pm
+++ b/IkiWiki/Plugin/more.pm
@@ -7,20 +7,20 @@ use IkiWiki 2.00;
my $linktext = gettext("more");
-sub import { #{{{
+sub import {
hook(type => "getsetup", id => "more", call => \&getsetup);
hook(type => "preprocess", id => "more", call => \&preprocess);
-} # }}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 1,
rebuild => undef,
},
-} #}}}
+}
-sub preprocess (@) { #{{{
+sub preprocess (@) {
my %params=@_;
$params{linktext} = $linktext unless defined $params{linktext};
diff --git a/IkiWiki/Plugin/norcs.pm b/IkiWiki/Plugin/norcs.pm
index 58c26b633..bfe84c0e1 100644
--- a/IkiWiki/Plugin/norcs.pm
+++ b/IkiWiki/Plugin/norcs.pm
@@ -6,7 +6,7 @@ use warnings;
use strict;
use IkiWiki;
-sub import { #{{{
+sub import {
hook(type => "getsetup", id => "norcs", call => \&getsetup);
hook(type => "rcs", id => "rcs_update", call => \&rcs_update);
hook(type => "rcs", id => "rcs_prepedit", call => \&rcs_prepedit);
@@ -18,51 +18,51 @@ sub import { #{{{
hook(type => "rcs", id => "rcs_recentchanges", call => \&rcs_recentchanges);
hook(type => "rcs", id => "rcs_diff", call => \&rcs_diff);
hook(type => "rcs", id => "rcs_getctime", call => \&rcs_getctime);
-} #}}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 0, # rcs plugin
rebuild => 0,
},
-} #}}}
+}
-sub rcs_update () { #{{{
-} #}}}
+sub rcs_update () {
+}
-sub rcs_prepedit ($) { #{{{
+sub rcs_prepedit ($) {
return ""
-} #}}}
+}
-sub rcs_commit ($$$;$$) { #{{{
+sub rcs_commit ($$$;$$) {
my ($file, $message, $rcstoken, $user, $ipaddr) = @_;
return undef # success
-} #}}}
+}
-sub rcs_commit_staged ($$$) { #{{{
+sub rcs_commit_staged ($$$) {
my ($message, $user, $ipaddr)=@_;
return undef # success
-} #}}}
+}
-sub rcs_add ($) { #{{{
-} #}}}
+sub rcs_add ($) {
+}
-sub rcs_remove ($) { #{{{
-} #}}}
+sub rcs_remove ($) {
+}
-sub rcs_rename ($$) { #{{{
-} #}}}
+sub rcs_rename ($$) {
+}
-sub rcs_recentchanges ($) { #{{{
-} #}}}
+sub rcs_recentchanges ($) {
+}
-sub rcs_diff ($) { #{{{
-} #}}}
+sub rcs_diff ($) {
+}
-sub rcs_getctime ($) { #{{{
+sub rcs_getctime ($) {
error gettext("getctime not implemented");
-} #}}}
+}
1
diff --git a/IkiWiki/Plugin/opendiscussion.pm b/IkiWiki/Plugin/opendiscussion.pm
index 96a74aee8..95220d7b3 100644
--- a/IkiWiki/Plugin/opendiscussion.pm
+++ b/IkiWiki/Plugin/opendiscussion.pm
@@ -5,20 +5,20 @@ use warnings;
use strict;
use IkiWiki 2.00;
-sub import { #{{{
+sub import {
hook(type => "getsetup", id => "opendiscussion", call => \&getsetup);
hook(type => "canedit", id => "opendiscussion", call => \&canedit);
-} # }}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 1,
rebuild => 0,
},
-} #}}}
+}
-sub canedit ($$) { #{{{
+sub canedit ($$) {
my $page=shift;
my $cgi=shift;
my $session=shift;
@@ -26,6 +26,6 @@ sub canedit ($$) { #{{{
my $discussion=gettext("discussion");
return "" if $page=~/(\/|^)\Q$discussion\E$/;
return undef;
-} #}}}
+}
1
diff --git a/IkiWiki/Plugin/openid.pm b/IkiWiki/Plugin/openid.pm
index f12cbdaa3..574c42f0e 100644
--- a/IkiWiki/Plugin/openid.pm
+++ b/IkiWiki/Plugin/openid.pm
@@ -6,22 +6,22 @@ use warnings;
use strict;
use IkiWiki 2.00;
-sub import { #{{{
+sub import {
hook(type => "getopt", id => "openid", call => \&getopt);
hook(type => "getsetup", id => "openid", call => \&getsetup);
hook(type => "auth", id => "openid", call => \&auth);
hook(type => "formbuilder_setup", id => "openid",
call => \&formbuilder_setup, last => 1);
-} # }}}
+}
-sub getopt () { #{{{
+sub getopt () {
eval q{use Getopt::Long};
error($@) if $@;
Getopt::Long::Configure('pass_through');
GetOptions("openidsignup=s" => \$config{openidsignup});
-} #}}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 1,
@@ -34,9 +34,9 @@ sub getsetup () { #{{{
safe => 1,
rebuild => 0,
},
-} #}}}
+}
-sub formbuilder_setup (@) { #{{{
+sub formbuilder_setup (@) {
my %params=@_;
my $form=$params{form};
@@ -92,7 +92,7 @@ sub formbuilder_setup (@) { #{{{
}
}
-sub validate ($$$;$) { #{{{
+sub validate ($$$;$) {
my $q=shift;
my $session=shift;
my $openid_url=shift;
@@ -121,9 +121,9 @@ sub validate ($$$;$) { #{{{
# eventually bounce them back to auth()
IkiWiki::redirect($q, $check_url);
exit 0;
-} #}}}
+}
-sub auth ($$) { #{{{
+sub auth ($$) {
my $q=shift;
my $session=shift;
@@ -147,9 +147,9 @@ sub auth ($$) { #{{{
# myopenid.com affiliate support
validate($q, $session, $q->param('openid_identifier'));
}
-} #}}}
+}
-sub getobj ($$) { #{{{
+sub getobj ($$) {
my $q=shift;
my $session=shift;
@@ -178,26 +178,28 @@ sub getobj ($$) { #{{{
consumer_secret => sub { return shift()+$secret },
required_root => $config{cgiurl},
);
-} #}}}
+}
package IkiWiki;
# This is not used by this plugin, but this seems the best place to put it.
# Used elsewhere to pretty-display the name of an openid user.
-sub openiduser ($) { #{{{
+sub openiduser ($) {
my $user=shift;
if ($user =~ m!^https?://! &&
eval q{use Net::OpenID::VerifiedIdentity; 1} && !$@) {
my $oid=Net::OpenID::VerifiedIdentity->new(identity => $user);
my $display=$oid->display;
- # Convert "user.somehost.com" to "user [somehost.com]".
+ # Convert "user.somehost.com" to "user [somehost.com]"
+ # (also "user.somehost.co.uk")
if ($display !~ /\[/) {
- $display=~s/^(.*?)\.([^.]+\.[a-z]+)$/$1 [$2]/;
+ $display=~s/^([-a-zA-Z0-9]+?)\.([-.a-zA-Z0-9]+\.[a-z]+)$/$1 [$2]/;
}
# Convert "http://somehost.com/user" to "user [somehost.com]".
+ # (also "https://somehost.com/user/")
if ($display !~ /\[/) {
- $display=~s/^https?:\/\/(.+)\/([^\/]+)$/$2 [$1]/;
+ $display=~s/^https?:\/\/(.+)\/([^\/]+)\/?$/$2 [$1]/;
}
$display=~s!^https?://!!; # make sure this is removed
eval q{use CGI 'escapeHTML'};
diff --git a/IkiWiki/Plugin/orphans.pm b/IkiWiki/Plugin/orphans.pm
index 32cbc5dd5..8e9ab0ff4 100644
--- a/IkiWiki/Plugin/orphans.pm
+++ b/IkiWiki/Plugin/orphans.pm
@@ -6,20 +6,20 @@ use warnings;
use strict;
use IkiWiki 2.00;
-sub import { #{{{
+sub import {
hook(type => "getsetup", id => "orphans", call => \&getsetup);
hook(type => "preprocess", id => "orphans", call => \&preprocess);
-} # }}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 1,
rebuild => undef,
},
-} #}}}
+}
-sub preprocess (@) { #{{{
+sub preprocess (@) {
my %params=@_;
$params{pages}="*" unless defined $params{pages};
@@ -58,6 +58,6 @@ sub preprocess (@) { #{{{
"</li>"
} sort @orphans).
"</ul>\n";
-} # }}}
+}
1
diff --git a/IkiWiki/Plugin/otl.pm b/IkiWiki/Plugin/otl.pm
index ef76d6215..280b19db0 100644
--- a/IkiWiki/Plugin/otl.pm
+++ b/IkiWiki/Plugin/otl.pm
@@ -7,22 +7,22 @@ use strict;
use IkiWiki 2.00;
use open qw{:utf8 :std};
-sub import { #{{{
+sub import {
hook(type => "getsetup", id => "otl", call => \&getsetup);
hook(type => "filter", id => "otl", call => \&filter);
hook(type => "htmlize", id => "otl", call => \&htmlize);
-} # }}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 1,
rebuild => 1, # format plugin
},
-} #}}}
+}
-sub filter (@) { #{{{
+sub filter (@) {
my %params=@_;
# Munge up check boxes to look a little bit better. This is a hack.
@@ -34,9 +34,9 @@ sub filter (@) { #{{{
$params{content}=~s/^(\s*)\[_\]\s/${1}$unchecked /mg;
return $params{content};
-} # }}}
+}
-sub htmlize (@) { #{{{
+sub htmlize (@) {
my %params=@_;
# Can't use open2 since otl2html doesn't play nice with buffering.
@@ -95,6 +95,6 @@ sub htmlize (@) { #{{{
$ret=~s/<body>.*//s;
$ret=~s/<div class="Footer">.*//s;
return $ret;
-} # }}}
+}
1
diff --git a/IkiWiki/Plugin/pagecount.pm b/IkiWiki/Plugin/pagecount.pm
index e059fa618..c08ab3931 100644
--- a/IkiWiki/Plugin/pagecount.pm
+++ b/IkiWiki/Plugin/pagecount.pm
@@ -5,20 +5,20 @@ use warnings;
use strict;
use IkiWiki 2.00;
-sub import { #{{{
+sub import {
hook(type => "getsetup", id => "pagecount", call => \&getsetup);
hook(type => "preprocess", id => "pagecount", call => \&preprocess);
-} # }}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 1,
rebuild => undef,
},
-} #}}}
+}
-sub preprocess (@) { #{{{
+sub preprocess (@) {
my %params=@_;
$params{pages}="*" unless defined $params{pages};
@@ -33,6 +33,6 @@ sub preprocess (@) { #{{{
$count++ if pagespec_match($page, $params{pages}, location => $params{page});
}
return $count;
-} # }}}
+}
1
diff --git a/IkiWiki/Plugin/pagestats.pm b/IkiWiki/Plugin/pagestats.pm
index de4b7d068..e20d0dac6 100644
--- a/IkiWiki/Plugin/pagestats.pm
+++ b/IkiWiki/Plugin/pagestats.pm
@@ -17,20 +17,20 @@ use IkiWiki 2.00;
# Names of the HTML classes to use for the tag cloud
our @classes = ('smallestPC', 'smallPC', 'normalPC', 'bigPC', 'biggestPC' );
-sub import { #{{{
+sub import {
hook(type => "getsetup", id => "pagestats", call => \&getsetup);
hook(type => "preprocess", id => "pagestats", call => \&preprocess);
-} # }}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 1,
rebuild => undef,
},
-} #}}}
+}
-sub preprocess (@) { #{{{
+sub preprocess (@) {
my %params=@_;
$params{pages}="*" unless defined $params{pages};
my $style = ($params{style} or 'cloud');
@@ -73,6 +73,6 @@ sub preprocess (@) { #{{{
return $res;
}
-} # }}}
+}
1
diff --git a/IkiWiki/Plugin/pagetemplate.pm b/IkiWiki/Plugin/pagetemplate.pm
index 99a66ee96..60db8b327 100644
--- a/IkiWiki/Plugin/pagetemplate.pm
+++ b/IkiWiki/Plugin/pagetemplate.pm
@@ -7,21 +7,21 @@ use IkiWiki 2.00;
my %templates;
-sub import { #{{{
+sub import {
hook(type => "getsetup", id => "pagetemplate", call => \&getsetup);
hook(type => "preprocess", id => "pagetemplate", call => \&preprocess);
hook(type => "templatefile", id => "pagetemplate", call => \&templatefile);
-} # }}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 1,
rebuild => undef,
},
-} #}}}
+}
-sub preprocess (@) { #{{{
+sub preprocess (@) {
my %params=@_;
if (! exists $params{template} ||
@@ -35,9 +35,9 @@ sub preprocess (@) { #{{{
}
return "";
-} # }}}
+}
-sub templatefile (@) { #{{{
+sub templatefile (@) {
my %params=@_;
if (exists $templates{$params{page}}) {
@@ -45,6 +45,6 @@ sub templatefile (@) { #{{{
}
return undef;
-} # }}}
+}
1
diff --git a/IkiWiki/Plugin/parentlinks.pm b/IkiWiki/Plugin/parentlinks.pm
index 9095dabda..866201e5e 100644
--- a/IkiWiki/Plugin/parentlinks.pm
+++ b/IkiWiki/Plugin/parentlinks.pm
@@ -6,20 +6,20 @@ use warnings;
use strict;
use IkiWiki 2.00;
-sub import { #{{{
+sub import {
hook(type => "parentlinks", id => "parentlinks", call => \&parentlinks);
hook(type => "pagetemplate", id => "parentlinks", call => \&pagetemplate);
-} # }}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 1,
rebuild => 1,
},
-} #}}}
+}
-sub parentlinks ($) { #{{{
+sub parentlinks ($) {
my $page=shift;
my @ret;
@@ -48,9 +48,9 @@ sub parentlinks ($) { #{{{
$i++;
}
return @ret;
-} #}}}
+}
-sub pagetemplate (@) { #{{{
+sub pagetemplate (@) {
my %params=@_;
my $page=$params{page};
my $template=$params{template};
@@ -58,6 +58,6 @@ sub pagetemplate (@) { #{{{
if ($template->query(name => "parentlinks")) {
$template->param(parentlinks => [parentlinks($page)]);
}
-} # }}}
+}
1
diff --git a/IkiWiki/Plugin/passwordauth.pm b/IkiWiki/Plugin/passwordauth.pm
index e0c0a3b0e..7176f0c33 100644
--- a/IkiWiki/Plugin/passwordauth.pm
+++ b/IkiWiki/Plugin/passwordauth.pm
@@ -6,14 +6,14 @@ use warnings;
use strict;
use IkiWiki 2.00;
-sub import { #{{{
+sub import {
hook(type => "getsetup", id => "passwordauth", "call" => \&getsetup);
hook(type => "formbuilder_setup", id => "passwordauth", call => \&formbuilder_setup);
hook(type => "formbuilder", id => "passwordauth", call => \&formbuilder);
hook(type => "sessioncgi", id => "passwordauth", call => \&sessioncgi);
-} # }}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 1,
@@ -33,10 +33,10 @@ sub getsetup () { #{{{
safe => 1,
rebuild => 0,
},
-} #}}}
+}
# Checks if a string matches a user's password, and returns true or false.
-sub checkpassword ($$;$) { #{{{
+sub checkpassword ($$;$) {
my $user=shift;
my $password=shift;
my $field=shift || "password";
@@ -74,9 +74,9 @@ sub checkpassword ($$;$) { #{{{
}
return $ret;
-} #}}}
+}
-sub setpassword ($$;$) { #{{{
+sub setpassword ($$;$) {
my $user=shift;
my $password=shift;
my $field=shift || "password";
@@ -94,9 +94,9 @@ sub setpassword ($$;$) { #{{{
else {
IkiWiki::userinfo_set($user, $field, $password);
}
-} #}}}
+}
-sub formbuilder_setup (@) { #{{{
+sub formbuilder_setup (@) {
my %params=@_;
my $form=$params{form};
@@ -222,7 +222,7 @@ sub formbuilder_setup (@) { #{{{
}
}
-sub formbuilder (@) { #{{{
+sub formbuilder (@) {
my %params=@_;
my $form=$params{form};
@@ -313,9 +313,9 @@ sub formbuilder (@) { #{{{
}
}
}
-} #}}}
+}
-sub sessioncgi ($$) { #{{{
+sub sessioncgi ($$) {
my $q=shift;
my $session=shift;
@@ -335,6 +335,6 @@ sub sessioncgi ($$) { #{{{
IkiWiki::cgi_prefs($q, $session);
exit;
}
-} #}}}
+}
1
diff --git a/IkiWiki/Plugin/pingee.pm b/IkiWiki/Plugin/pingee.pm
index c2f21b0cf..fcbe6b57b 100644
--- a/IkiWiki/Plugin/pingee.pm
+++ b/IkiWiki/Plugin/pingee.pm
@@ -5,20 +5,20 @@ use warnings;
use strict;
use IkiWiki 2.00;
-sub import { #{{{
+sub import {
hook(type => "getsetup", id => "pingee", call => \&getsetup);
hook(type => "cgi", id => "pingee", call => \&cgi);
-} # }}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 1,
rebuild => undef,
},
-} #}}}
+}
-sub cgi ($) { #{{{
+sub cgi ($) {
my $cgi=shift;
if (defined $cgi->param('do') && $cgi->param("do") eq "ping") {
@@ -37,6 +37,6 @@ sub cgi ($) { #{{{
IkiWiki::saveindex();
exit 0;
}
-} #}}}
+}
1
diff --git a/IkiWiki/Plugin/pinger.pm b/IkiWiki/Plugin/pinger.pm
index 043b074a7..7b4dce586 100644
--- a/IkiWiki/Plugin/pinger.pm
+++ b/IkiWiki/Plugin/pinger.pm
@@ -8,15 +8,15 @@ use IkiWiki 2.00;
my %pages;
my $pinged=0;
-sub import { #{{{
+sub import {
hook(type => "getsetup", id => "pinger", call => \&getsetup);
hook(type => "needsbuild", id => "pinger", call => \&needsbuild);
hook(type => "preprocess", id => "ping", call => \&preprocess);
hook(type => "delete", id => "pinger", call => \&ping);
hook(type => "change", id => "pinger", call => \&ping);
-} # }}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 1,
@@ -29,9 +29,9 @@ sub getsetup () { #{{{
safe => 1,
rebuild => 0,
},
-} #}}}
+}
-sub needsbuild (@) { #{{{
+sub needsbuild (@) {
my $needsbuild=shift;
foreach my $page (keys %pagestate) {
if (exists $pagestate{$page}{pinger}) {
@@ -45,9 +45,9 @@ sub needsbuild (@) { #{{{
}
}
}
-} # }}}
+}
-sub preprocess (@) { #{{{
+sub preprocess (@) {
my %params=@_;
if (! exists $params{from} || ! exists $params{to}) {
error gettext("requires 'from' and 'to' parameters");
@@ -60,7 +60,7 @@ sub preprocess (@) { #{{{
else {
return sprintf(gettext("Ignoring ping directive for wiki %s (this wiki is %s)"), $params{from}, $config{url});
}
-} # }}}
+}
sub ping {
if (! $pinged && %pages) {
diff --git a/IkiWiki/Plugin/poll.pm b/IkiWiki/Plugin/poll.pm
index fadc1773e..5ac5b818d 100644
--- a/IkiWiki/Plugin/poll.pm
+++ b/IkiWiki/Plugin/poll.pm
@@ -6,22 +6,22 @@ use strict;
use IkiWiki 2.00;
use Encode;
-sub import { #{{{
+sub import {
hook(type => "getsetup", id => "poll", call => \&getsetup);
hook(type => "preprocess", id => "poll", call => \&preprocess);
hook(type => "sessioncgi", id => "poll", call => \&sessioncgi);
-} # }}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 1,
rebuild => undef,
},
-} #}}}
+}
my %pagenum;
-sub preprocess (@) { #{{{
+sub preprocess (@) {
my %params=(open => "yes", total => "yes", percent => "yes", @_);
my $open=IkiWiki::yesno($params{open});
@@ -77,9 +77,9 @@ sub preprocess (@) { #{{{
$ret.="<span>".gettext("Total votes:")." $total</span>\n";
}
return "<div class=poll>$ret</div>";
-} # }}}
+}
-sub sessioncgi ($$) { #{{{
+sub sessioncgi ($$) {
my $cgi=shift;
my $session=shift;
if (defined $cgi->param('do') && $cgi->param('do') eq "poll") {
@@ -152,6 +152,6 @@ sub sessioncgi ($$) { #{{{
-url => urlto($page, undef, 1));
exit;
}
-} #}}}
+}
1
diff --git a/IkiWiki/Plugin/polygen.pm b/IkiWiki/Plugin/polygen.pm
index fa564aa86..a32003778 100644
--- a/IkiWiki/Plugin/polygen.pm
+++ b/IkiWiki/Plugin/polygen.pm
@@ -10,20 +10,20 @@ use strict;
use IkiWiki 2.00;
use File::Find;
-sub import { #{{{
+sub import {
hook(type => "getsetup", id => "polygen", call => \&getsetup);
hook(type => "preprocess", id => "polygen", call => \&preprocess);
-} # }}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 1,
rebuild => undef,
},
-} #}}}
+}
-sub preprocess (@) { #{{{
+sub preprocess (@) {
my %params=@_;
my $grammar = ($params{grammar} or 'polygen');
my $symbol = ($params{symbol} or undef);
@@ -64,6 +64,6 @@ sub preprocess (@) { #{{{
# markdown text
$res =~ s/\s*$//;
return $res;
-} # }}}
+}
1
diff --git a/IkiWiki/Plugin/postsparkline.pm b/IkiWiki/Plugin/postsparkline.pm
index 1f4c065c1..1753e4cf9 100644
--- a/IkiWiki/Plugin/postsparkline.pm
+++ b/IkiWiki/Plugin/postsparkline.pm
@@ -5,21 +5,21 @@ use warnings;
use strict;
use IkiWiki 2.00;
-sub import { #{{{
+sub import {
IkiWiki::loadplugin('sparkline');
hook(type => "getsetup", id => "postsparkline", call => \&getsetup);
hook(type => "preprocess", id => "postsparkline", call => \&preprocess);
-} # }}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 1,
rebuild => undef,
},
-} #}}}
+}
-sub preprocess (@) { #{{{
+sub preprocess (@) {
my %params=@_;
if (! exists $params{max}) {
@@ -78,7 +78,7 @@ sub preprocess (@) { #{{{
delete $params{color};
return IkiWiki::Plugin::sparkline::preprocess(%params,
map { $_.$color => "" } reverse @data);
-} # }}}
+}
sub perfoo ($@) {
my $sub=shift;
diff --git a/IkiWiki/Plugin/prettydate.pm b/IkiWiki/Plugin/prettydate.pm
index 0f02142b0..501f17f5d 100644
--- a/IkiWiki/Plugin/prettydate.pm
+++ b/IkiWiki/Plugin/prettydate.pm
@@ -39,12 +39,12 @@ sub default_timetable {
];
}
-sub import { #{{{
+sub import {
hook(type => "getsetup", id => "prettydate", call => \&getsetup);
hook(type => "checkconfig", id => "prettydate", call => \&checkconfig);
-} # }}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 1,
@@ -64,9 +64,9 @@ sub getsetup () { #{{{
safe => 1,
rebuild => 1,
},
-} #}}}
+}
-sub checkconfig () { #{{{
+sub checkconfig () {
if (! defined $config{prettydateformat} ||
$config{prettydateformat} eq '%c') {
$config{prettydateformat}='%X, %B %o, %Y';
@@ -82,9 +82,9 @@ sub checkconfig () { #{{{
$config{timetable}[$h] = $config{timetable}[$h - 1];
}
}
-} #}}}
+}
-sub IkiWiki::formattime ($;$) { #{{{
+sub IkiWiki::formattime ($;$) {
my $time=shift;
my $format=shift;
if (! defined $format) {
@@ -122,6 +122,6 @@ sub IkiWiki::formattime ($;$) { #{{{
$format=~s/\%X/$t/g;
return strftime($format, \@t);
-} #}}}
+}
1
diff --git a/IkiWiki/Plugin/progress.pm b/IkiWiki/Plugin/progress.pm
index e536f4e23..75da16d16 100644
--- a/IkiWiki/Plugin/progress.pm
+++ b/IkiWiki/Plugin/progress.pm
@@ -7,21 +7,21 @@ use IkiWiki 2.00;
my $percentage_pattern = qr/[0-9]+\%?/; # pattern to validate percentages
-sub import { #{{{
+sub import {
hook(type => "getsetup", id => "progress", call => \&getsetup);
hook(type => "preprocess", id => "progress", call => \&preprocess);
hook(type => "format", id => "progress", call => \&format);
-} # }}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 1,
rebuild => undef,
},
-} #}}}
+}
-sub preprocess (@) { #{{{
+sub preprocess (@) {
my %params=@_;
my $fill;
@@ -64,9 +64,9 @@ sub preprocess (@) { #{{{
<div class="progress-done" style="width: $fill">$fill</div>
</div>
EODIV
-} # }}}
+}
-sub format(@) { #{{{
+sub format(@) {
my %params = @_;
# If HTMLScrubber has removed the style attribute, then bring it back
@@ -74,6 +74,6 @@ sub format(@) { #{{{
$params{content} =~ s!<div class="progress-done">($percentage_pattern)</div>!<div class="progress-done" style="width: $1">$1</div>!g;
return $params{content};
-} #}}}
+}
1
diff --git a/IkiWiki/Plugin/rawhtml.pm b/IkiWiki/Plugin/rawhtml.pm
index 74ca13f3b..73093439d 100644
--- a/IkiWiki/Plugin/rawhtml.pm
+++ b/IkiWiki/Plugin/rawhtml.pm
@@ -6,17 +6,17 @@ use warnings;
use strict;
use IkiWiki 2.00;
-sub import { #{{{
+sub import {
hook(type => "getsetup", id => "rawhtml", call => \&getsetup);
$config{wiki_file_prune_regexps} = [ grep { !m/\\\.x\?html\?\$/ } @{$config{wiki_file_prune_regexps}} ];
-} # }}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 1,
rebuild => 1, # changes file types
},
-} #}}}
+}
1
diff --git a/IkiWiki/Plugin/recentchanges.pm b/IkiWiki/Plugin/recentchanges.pm
index 3f70664ac..7071596e6 100644
--- a/IkiWiki/Plugin/recentchanges.pm
+++ b/IkiWiki/Plugin/recentchanges.pm
@@ -5,17 +5,18 @@ use warnings;
use strict;
use IkiWiki 2.00;
use Encode;
+use HTML::Entities;
-sub import { #{{{
+sub import {
hook(type => "getsetup", id => "recentchanges", call => \&getsetup);
hook(type => "checkconfig", id => "recentchanges", call => \&checkconfig);
hook(type => "refresh", id => "recentchanges", call => \&refresh);
hook(type => "pagetemplate", id => "recentchanges", call => \&pagetemplate);
hook(type => "htmlize", id => "_change", call => \&htmlize);
hook(type => "cgi", id => "recentchanges", call => \&cgi);
-} #}}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 1,
@@ -35,14 +36,14 @@ sub getsetup () { #{{{
safe => 1,
rebuild => 0,
},
-} #}}}
+}
-sub checkconfig () { #{{{
+sub checkconfig () {
$config{recentchangespage}='recentchanges' unless defined $config{recentchangespage};
$config{recentchangesnum}=100 unless defined $config{recentchangesnum};
-} #}}}
+}
-sub refresh ($) { #{{{
+sub refresh ($) {
my %seen;
# add new changes
@@ -56,10 +57,10 @@ sub refresh ($) { #{{{
unlink($config{srcdir}.'/'.$pagesources{$page});
}
}
-} #}}}
+}
# Enable the recentchanges link on wiki pages.
-sub pagetemplate (@) { #{{{
+sub pagetemplate (@) {
my %params=@_;
my $template=$params{template};
my $page=$params{page};
@@ -70,15 +71,15 @@ sub pagetemplate (@) { #{{{
$template->param(recentchangesurl => urlto($config{recentchangespage}, $page));
$template->param(have_actions => 1);
}
-} #}}}
+}
# Pages with extension _change have plain html markup, pass through.
-sub htmlize (@) { #{{{
+sub htmlize (@) {
my %params=@_;
return $params{content};
-} #}}}
+}
-sub cgi ($) { #{{{
+sub cgi ($) {
my $cgi=shift;
if (defined $cgi->param('do') && $cgi->param('do') eq "recentchanges_link") {
# This is a link from a change page to some
@@ -94,6 +95,15 @@ sub cgi ($) { #{{{
IkiWiki::loadindex();
+ # If the page is internal (like a comment), see if it has a
+ # permalink. Comments do.
+ if (IkiWiki::isinternal($page) &&
+ defined $pagestate{$page}{meta}{permalink}) {
+ IkiWiki::redirect($cgi,
+ $pagestate{$page}{meta}{permalink});
+ exit;
+ }
+
my $link=bestlink("", $page);
if (! length $link) {
print "Content-type: text/html\n\n";
@@ -111,7 +121,7 @@ sub cgi ($) { #{{{
}
}
-sub store ($$$) { #{{{
+sub store ($$$) {
my $change=shift;
my $page="$config{recentchangespage}/change_".titlepage($change->{rev});
@@ -159,11 +169,13 @@ sub store ($$$) { #{{{
);
}
- # escape wikilinks and preprocessor stuff in commit messages
if (ref $change->{message}) {
foreach my $field (@{$change->{message}}) {
if (exists $field->{line}) {
- $field->{line} =~ s/(?<!\\)\[\[/\\\[\[/g;
+ # escape html
+ $field->{line} = encode_entities($field->{line});
+ # escape links and preprocessor stuff
+ $field->{line} = encode_entities($field->{line}, '\[\]');
}
}
}
@@ -189,6 +201,6 @@ sub store ($$$) { #{{{
utime $change->{when}, $change->{when}, "$config{srcdir}/$file";
return $page;
-} #}}}
+}
1
diff --git a/IkiWiki/Plugin/recentchangesdiff.pm b/IkiWiki/Plugin/recentchangesdiff.pm
index 36acef72e..4dea9c26b 100644
--- a/IkiWiki/Plugin/recentchangesdiff.pm
+++ b/IkiWiki/Plugin/recentchangesdiff.pm
@@ -4,25 +4,26 @@ package IkiWiki::Plugin::recentchangesdiff;
use warnings;
use strict;
use IkiWiki 2.00;
+use HTML::Entities;
my $maxlines=200;
-sub import { #{{{
+sub import {
hook(type => "getsetup", id => "recentchangesdiff",
call => \&getsetup);
hook(type => "pagetemplate", id => "recentchangesdiff",
call => \&pagetemplate);
-} #}}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 1,
rebuild => 1,
},
-} #}}}
+}
-sub pagetemplate (@) { #{{{
+sub pagetemplate (@) {
my %params=@_;
my $template=$params{template};
if ($config{rcs} && exists $params{rev} && length $params{rev} &&
@@ -38,11 +39,13 @@ sub pagetemplate (@) { #{{{
else {
$diff=join("", @lines);
}
+ # escape html
+ $diff = encode_entities($diff);
# escape links and preprocessor stuff
- $diff =~ s/(?<!\\)\[\[/\\\[\[/g;
+ $diff = encode_entities($diff, '\[\]');
$template->param(diff => $diff);
}
}
-} #}}}
+}
1
diff --git a/IkiWiki/Plugin/relativedate.pm b/IkiWiki/Plugin/relativedate.pm
index dc8f7d538..e5fa8e1a5 100644
--- a/IkiWiki/Plugin/relativedate.pm
+++ b/IkiWiki/Plugin/relativedate.pm
@@ -8,22 +8,22 @@ use IkiWiki 2.00;
use POSIX;
use Encode;
-sub import { #{{{
+sub import {
add_underlay("javascript");
hook(type => "getsetup", id => "relativedate", call => \&getsetup);
hook(type => "format", id => "relativedate", call => \&format);
inject(name => "IkiWiki::displaytime", call => \&mydisplaytime);
-} # }}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 1,
rebuild => 1,
},
-} #}}}
+}
-sub format (@) { #{{{
+sub format (@) {
my %params=@_;
if (! ($params{content}=~s!^(<body>)!$1.include_javascript($params{page})!em)) {
@@ -31,9 +31,9 @@ sub format (@) { #{{{
$params{content}=include_javascript($params{page}, 1).$params{content};
}
return $params{content};
-} # }}}
+}
-sub include_javascript ($;$) { #{{{
+sub include_javascript ($;$) {
my $page=shift;
my $absolute=shift;
@@ -41,9 +41,9 @@ sub include_javascript ($;$) { #{{{
'" type="text/javascript" charset="utf-8"></script>'."\n".
'<script src="'.urlto("relativedate.js", $page, $absolute).
'" type="text/javascript" charset="utf-8"></script>';
-} #}}}
+}
-sub mydisplaytime ($;$) { #{{{
+sub mydisplaytime ($;$) {
my $time=shift;
my $format=shift;
@@ -55,6 +55,6 @@ sub mydisplaytime ($;$) { #{{{
return '<span class="relativedate" title="'.$gmtime.'">'.
IkiWiki::formattime($time, $format).'</span>';
-} #}}}
+}
1
diff --git a/IkiWiki/Plugin/remove.pm b/IkiWiki/Plugin/remove.pm
index c512b3b97..781501662 100644
--- a/IkiWiki/Plugin/remove.pm
+++ b/IkiWiki/Plugin/remove.pm
@@ -5,23 +5,23 @@ use warnings;
use strict;
use IkiWiki 2.00;
-sub import { #{{{
+sub import {
hook(type => "getsetup", id => "remove", call => \&getsetup);
hook(type => "formbuilder_setup", id => "remove", call => \&formbuilder_setup);
hook(type => "formbuilder", id => "remove", call => \&formbuilder);
hook(type => "sessioncgi", id => "remove", call => \&sessioncgi);
-} # }}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 1,
rebuild => 0,
},
-} #}}}
+}
-sub check_canremove ($$$) { #{{{
+sub check_canremove ($$$) {
my $page=shift;
my $q=shift;
my $session=shift;
@@ -54,9 +54,9 @@ sub check_canremove ($$$) { #{{{
error("renaming of attachments is not allowed");
}
}
-} #}}}
+}
-sub formbuilder_setup (@) { #{{{
+sub formbuilder_setup (@) {
my %params=@_;
my $form=$params{form};
my $q=$params{cgi};
@@ -67,9 +67,9 @@ sub formbuilder_setup (@) { #{{{
push @{$params{buttons}}, "Remove" if $form->field("do") eq "edit";
$form->tmpl_param("field-remove" => '<input name="_submit" type="submit" value="Remove Attachments" />');
}
-} #}}}
+}
-sub confirmation_form ($$) { #{{{
+sub confirmation_form ($$) {
my $q=shift;
my $session=shift;
@@ -90,9 +90,9 @@ sub confirmation_form ($$) { #{{{
$f->field(name => "do", type => "hidden", value => "remove", force => 1);
return $f, ["Remove", "Cancel"];
-} #}}}
+}
-sub removal_confirm ($$@) { #{{{
+sub removal_confirm ($$@) {
my $q=shift;
my $session=shift;
my $attachment=shift;
@@ -122,9 +122,9 @@ sub removal_confirm ($$@) { #{{{
IkiWiki::showform($f, $buttons, $session, $q);
exit 0;
-} #}}}
+}
-sub postremove ($) { #{{{
+sub postremove ($) {
my $session=shift;
# Load saved form state and return to edit form.
@@ -132,9 +132,9 @@ sub postremove ($) { #{{{
$session->clear("postremove");
IkiWiki::cgi_savesession($session);
IkiWiki::cgi($postremove, $session);
-} #}}}
+}
-sub formbuilder (@) { #{{{
+sub formbuilder (@) {
my %params=@_;
my $form=$params{form};
@@ -154,9 +154,9 @@ sub formbuilder (@) { #{{{
removal_confirm($q, $session, 1, @selected);
}
}
-} #}}}
+}
-sub sessioncgi ($$) { #{{{
+sub sessioncgi ($$) {
my $q=shift;
if ($q->param("do") eq 'remove') {
diff --git a/IkiWiki/Plugin/rename.pm b/IkiWiki/Plugin/rename.pm
index 7e55e271c..b1bb15767 100644
--- a/IkiWiki/Plugin/rename.pm
+++ b/IkiWiki/Plugin/rename.pm
@@ -5,23 +5,23 @@ use warnings;
use strict;
use IkiWiki 2.00;
-sub import { #{{{
+sub import {
hook(type => "getsetup", id => "rename", call => \&getsetup);
hook(type => "formbuilder_setup", id => "rename", call => \&formbuilder_setup);
hook(type => "formbuilder", id => "rename", call => \&formbuilder);
hook(type => "sessioncgi", id => "rename", call => \&sessioncgi);
-} # }}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 1,
rebuild => 0,
},
-} #}}}
+}
-sub check_canrename ($$$$$$) { #{{{
+sub check_canrename ($$$$$$) {
my $src=shift;
my $srcfile=shift;
my $dest=shift;
@@ -87,9 +87,9 @@ sub check_canrename ($$$$$$) { #{{{
IkiWiki::Plugin::attachment::check_canattach($session, $dest, $srcfile);
}
}
-} #}}}
+}
-sub rename_form ($$$) { #{{{
+sub rename_form ($$$) {
my $q=shift;
my $session=shift;
my $page=shift;
@@ -111,7 +111,7 @@ sub rename_form ($$$) { #{{{
$f->field(name => "do", type => "hidden", value => "rename", force => 1);
$f->field(name => "page", type => "hidden", value => $page, force => 1);
- $f->field(name => "new_name", value => pagetitle($page), size => 60);
+ $f->field(name => "new_name", value => pagetitle($page, 1), size => 60);
if (!$q->param("attachment")) {
# insert the standard extensions
my @page_types;
@@ -145,9 +145,9 @@ sub rename_form ($$$) { #{{{
$f->field(name => "attachment", type => "hidden");
return $f, ["Rename", "Cancel"];
-} #}}}
+}
-sub rename_start ($$$$) { #{{{
+sub rename_start ($$$$) {
my $q=shift;
my $session=shift;
my $attachment=shift;
@@ -171,9 +171,9 @@ sub rename_start ($$$$) { #{{{
my ($f, $buttons)=rename_form($q, $session, $page);
IkiWiki::showform($f, $buttons, $session, $q);
exit 0;
-} #}}}
+}
-sub postrename ($;$$$) { #{{{
+sub postrename ($;$$$) {
my $session=shift;
my $src=shift;
my $dest=shift;
@@ -204,9 +204,9 @@ sub postrename ($;$$$) { #{{{
}
IkiWiki::cgi_editpage($postrename, $session);
-} #}}}
+}
-sub formbuilder (@) { #{{{
+sub formbuilder (@) {
my %params=@_;
my $form=$params{form};
@@ -229,11 +229,11 @@ sub formbuilder (@) { #{{{
rename_start($q, $session, 1, $selected[0]);
}
}
-} #}}}
+}
my $renamesummary;
-sub formbuilder_setup (@) { #{{{
+sub formbuilder_setup (@) {
my %params=@_;
my $form=$params{form};
my $q=$params{cgi};
@@ -248,9 +248,9 @@ sub formbuilder_setup (@) { #{{{
$form->tmpl_param(message => $renamesummary);
}
}
-} #}}}
+}
-sub sessioncgi ($$) { #{{{
+sub sessioncgi ($$) {
my $q=shift;
if ($q->param("do") eq 'rename') {
@@ -418,9 +418,9 @@ sub sessioncgi ($$) { #{{{
exit 0;
}
-} #}}}
+}
-sub renamepage_hook ($$$$) { #{{{
+sub renamepage_hook ($$$$) {
my ($page, $src, $dest, $content)=@_;
IkiWiki::run_hooks(renamepage => sub {
@@ -433,9 +433,9 @@ sub renamepage_hook ($$$$) { #{{{
});
return $content;
-}# }}}
+}
-sub do_rename ($$$) { #{{{
+sub do_rename ($$$) {
my $rename=shift;
my $q=shift;
my $session=shift;
@@ -460,9 +460,9 @@ sub do_rename ($$$) { #{{{
}
}
-} # }}}
+}
-sub fixlinks ($$$) { #{{{
+sub fixlinks ($$$) {
my $rename=shift;
my $session=shift;
@@ -498,6 +498,6 @@ sub fixlinks ($$$) { #{{{
}
return @fixedlinks;
-} #}}}
+}
1
diff --git a/IkiWiki/Plugin/search.pm b/IkiWiki/Plugin/search.pm
index e40f4888c..cc2130ad5 100644
--- a/IkiWiki/Plugin/search.pm
+++ b/IkiWiki/Plugin/search.pm
@@ -6,16 +6,16 @@ use warnings;
use strict;
use IkiWiki 2.00;
-sub import { #{{{
+sub import {
hook(type => "getsetup", id => "search", call => \&getsetup);
hook(type => "checkconfig", id => "search", call => \&checkconfig);
hook(type => "pagetemplate", id => "search", call => \&pagetemplate);
hook(type => "postscan", id => "search", call => \&index);
hook(type => "delete", id => "search", call => \&delete);
hook(type => "cgi", id => "search", call => \&cgi);
-} # }}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 1,
@@ -28,9 +28,9 @@ sub getsetup () { #{{{
safe => 0, # external program
rebuild => 0,
},
-} #}}}
+}
-sub checkconfig () { #{{{
+sub checkconfig () {
foreach my $required (qw(url cgiurl)) {
if (! length $config{$required}) {
error(sprintf(gettext("Must specify %s when using the search plugin"), $required));
@@ -40,10 +40,10 @@ sub checkconfig () { #{{{
if (! defined $config{omega_cgi}) {
$config{omega_cgi}="/usr/lib/cgi-bin/omega/omega";
}
-} #}}}
+}
my $form;
-sub pagetemplate (@) { #{{{
+sub pagetemplate (@) {
my %params=@_;
my $page=$params{page};
my $template=$params{template};
@@ -58,11 +58,11 @@ sub pagetemplate (@) { #{{{
$template->param(searchform => $form);
}
-} #}}}
+}
my $scrubber;
my $stemmer;
-sub index (@) { #{{{
+sub index (@) {
my %params=@_;
setupfiles();
@@ -146,17 +146,17 @@ sub index (@) { #{{{
$doc->add_term($pageterm);
$db->replace_document_by_term($pageterm, $doc);
-} #}}}
+}
-sub delete (@) { #{{{
+sub delete (@) {
my $db=xapiandb();
foreach my $page (@_) {
my $pageterm=pageterm(pagename($page));
$db->delete_document_by_term($pageterm) if defined $pageterm;
}
-} #}}}
+}
-sub cgi ($) { #{{{
+sub cgi ($) {
my $cgi=shift;
if (defined $cgi->param('P')) {
@@ -169,9 +169,9 @@ sub cgi ($) { #{{{
noimageinline => 1, linktext => "Help");
exec($config{omega_cgi}) || error("$config{omega_cgi} failed: $!");
}
-} #}}}
+}
-sub pageterm ($) { #{{{
+sub pageterm ($) {
my $page=shift;
# 240 is the number used by omindex to decide when to hash an
@@ -190,10 +190,10 @@ sub pageterm ($) { #{{{
else {
return "U:".$page;
}
-} #}}}
+}
my $db;
-sub xapiandb () { #{{{
+sub xapiandb () {
if (! defined $db) {
eval q{
use Search::Xapian;
@@ -204,11 +204,11 @@ sub xapiandb () { #{{{
Search::Xapian::DB_CREATE_OR_OPEN());
}
return $db;
-} #}}}
+}
{
my $setup=0;
-sub setupfiles () { #{{{
+sub setupfiles () {
if (! $setup and (! -e $config{wikistatedir}."/xapian" || $config{rebuild})) {
writefile("omega.conf", $config{wikistatedir}."/xapian",
"database_dir .\n".
@@ -218,7 +218,7 @@ sub setupfiles () { #{{{
readfile(IkiWiki::template_file("searchquery.tmpl"))));
$setup=1;
}
-} #}}}
+}
}
1
diff --git a/IkiWiki/Plugin/shortcut.pm b/IkiWiki/Plugin/shortcut.pm
index dec8afdb5..33d158d3e 100644
--- a/IkiWiki/Plugin/shortcut.pm
+++ b/IkiWiki/Plugin/shortcut.pm
@@ -5,21 +5,21 @@ use warnings;
use strict;
use IkiWiki 2.00;
-sub import { #{{{
+sub import {
hook(type => "getsetup", id => "shortcut", call => \&getsetup);
hook(type => "checkconfig", id => "shortcut", call => \&checkconfig);
hook(type => "preprocess", id => "shortcut", call => \&preprocess_shortcut);
-} #}}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 1,
rebuild => undef,
},
-} #}}}
+}
-sub checkconfig () { #{{{
+sub checkconfig () {
if (defined $config{srcdir}) {
# Preprocess the shortcuts page to get all the available shortcuts
# defined before other pages are rendered.
@@ -29,9 +29,9 @@ sub checkconfig () { #{{{
}
IkiWiki::preprocess("shortcuts", "shortcuts", readfile($srcfile));
}
-} # }}}
+}
-sub preprocess_shortcut (@) { #{{{
+sub preprocess_shortcut (@) {
my %params=@_;
if (! defined $params{name} || ! defined $params{url}) {
@@ -46,9 +46,9 @@ sub preprocess_shortcut (@) { #{{{
#translators: First parameter is the name of the shortcut, the second
#translators: is an URL.
return sprintf(gettext("shortcut %s points to <i>%s</i>"), $params{name}, $params{url});
-} # }}}
+}
-sub shortcut_expand ($$@) { #{{{
+sub shortcut_expand ($$@) {
my $url=shift;
my $desc=shift;
my %params=@_;
@@ -85,6 +85,6 @@ sub shortcut_expand ($$@) { #{{{
}
return "<a href=\"$url\">$desc</a>";
-} #}}}
+}
1
diff --git a/IkiWiki/Plugin/sidebar.pm b/IkiWiki/Plugin/sidebar.pm
index 9697e1198..746fa93bb 100644
--- a/IkiWiki/Plugin/sidebar.pm
+++ b/IkiWiki/Plugin/sidebar.pm
@@ -8,20 +8,20 @@ use warnings;
use strict;
use IkiWiki 2.00;
-sub import { #{{{
+sub import {
hook(type => "getsetup", id => "sidebar", call => \&getsetup);
hook(type => "pagetemplate", id => "sidebar", call => \&pagetemplate);
-} # }}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 1,
rebuild => 1,
},
-} #}}}
+}
-sub sidebar_content ($) { #{{{
+sub sidebar_content ($) {
my $page=shift;
my $sidebar_page=bestlink($page, "sidebar") || return;
@@ -42,9 +42,9 @@ sub sidebar_content ($) { #{{{
IkiWiki::filter($sidebar_page, $page, $content))));
}
-} # }}}
+}
-sub pagetemplate (@) { #{{{
+sub pagetemplate (@) {
my %params=@_;
my $page=$params{page};
@@ -56,6 +56,6 @@ sub pagetemplate (@) { #{{{
$template->param(sidebar => $content);
}
}
-} # }}}
+}
1
diff --git a/IkiWiki/Plugin/signinedit.pm b/IkiWiki/Plugin/signinedit.pm
index ef7b9b428..321c93ed5 100644
--- a/IkiWiki/Plugin/signinedit.pm
+++ b/IkiWiki/Plugin/signinedit.pm
@@ -5,21 +5,21 @@ use warnings;
use strict;
use IkiWiki 2.00;
-sub import { #{{{
+sub import {
hook(type => "getsetup", id => "signinedit", call => \&getsetup);
hook(type => "canedit", id => "signinedit", call => \&canedit,
last => 1);
-} # }}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 1,
rebuild => 0,
},
-} #}}}
+}
-sub canedit ($$$) { #{{{
+sub canedit ($$$) {
my $page=shift;
my $cgi=shift;
my $session=shift;
@@ -34,6 +34,6 @@ sub canedit ($$$) { #{{{
else {
return "";
}
-} #}}}
+}
1
diff --git a/IkiWiki/Plugin/skeleton.pm.example b/IkiWiki/Plugin/skeleton.pm.example
index f844ddb91..96c4a5d6b 100644
--- a/IkiWiki/Plugin/skeleton.pm.example
+++ b/IkiWiki/Plugin/skeleton.pm.example
@@ -8,7 +8,7 @@ use warnings;
use strict;
use IkiWiki 2.00;
-sub import { #{{{
+sub import {
hook(type => "getopt", id => "skeleton", call => \&getopt);
hook(type => "getsetup", id => "skeleton", call => \&getsetup);
hook(type => "checkconfig", id => "skeleton", call => \&checkconfig);
@@ -34,13 +34,13 @@ sub import { #{{{
hook(type => "formbuilder_setup", id => "skeleton", call => \&formbuilder_setup);
hook(type => "formbuilder", id => "skeleton", call => \&formbuilder);
hook(type => "savestate", id => "skeleton", call => \&savestate);
-} # }}}
+}
-sub getopt () { #{{{
+sub getopt () {
debug("skeleton plugin getopt");
-} #}}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 1,
@@ -53,155 +53,155 @@ sub getsetup () { #{{{
safe => 0,
rebuild => 0,
},
-} #}}}
+}
-sub checkconfig () { #{{{
+sub checkconfig () {
debug("skeleton plugin checkconfig");
-} #}}}
+}
-sub refresh () { #{{{
+sub refresh () {
debug("skeleton plugin refresh");
-} #}}}
+}
-sub needsbuild () { #{{{
+sub needsbuild () {
debug("skeleton plugin needsbuild");
-} #}}}
+}
-sub preprocess (@) { #{{{
+sub preprocess (@) {
my %params=@_;
return "skeleton plugin result";
-} # }}}
+}
-sub filter (@) { #{{{
+sub filter (@) {
my %params=@_;
debug("skeleton plugin running as filter");
return $params{content};
-} # }}}
+}
-sub linkify (@) { #{{{
+sub linkify (@) {
my %params=@_;
debug("skeleton plugin running as linkify");
return $params{content};
-} # }}}
+}
sub scan (@) { #{{{a
my %params=@_;
debug("skeleton plugin running as scan");
-} # }}}
+}
-sub htmlize (@) { #{{{
+sub htmlize (@) {
my %params=@_;
debug("skeleton plugin running as htmlize");
return $params{content};
-} # }}}
+}
-sub sanitize (@) { #{{{
+sub sanitize (@) {
my %params=@_;
debug("skeleton plugin running as a sanitizer");
return $params{content};
-} # }}}
+}
-sub postscan (@) { #{{{
+sub postscan (@) {
my %params=@_;
debug("skeleton plugin running as postscan");
-} # }}}
+}
-sub format (@) { #{{{
+sub format (@) {
my %params=@_;
debug("skeleton plugin running as a formatter");
return $params{content};
-} # }}}
+}
-sub pagetemplate (@) { #{{{
+sub pagetemplate (@) {
my %params=@_;
my $page=$params{page};
my $template=$params{template};
debug("skeleton plugin running as a pagetemplate hook");
-} # }}}
+}
-sub templatefile (@) { #{{{
+sub templatefile (@) {
my %params=@_;
my $page=$params{page};
debug("skeleton plugin running as a templatefile hook");
-} # }}}
+}
-sub delete (@) { #{{{
+sub delete (@) {
my @files=@_;
debug("skeleton plugin told that files were deleted: @files");
-} #}}}
+}
-sub change (@) { #{{{
+sub change (@) {
my @files=@_;
debug("skeleton plugin told that changed files were rendered: @files");
-} #}}}
+}
-sub cgi ($) { #{{{
+sub cgi ($) {
my $cgi=shift;
debug("skeleton plugin running in cgi");
-} #}}}
+}
-sub auth ($$) { #{{{
+sub auth ($$) {
my $cgi=shift;
my $session=shift;
debug("skeleton plugin running in auth");
-} #}}}
+}
-sub sessioncgi ($$) { #{{{
+sub sessioncgi ($$) {
my $cgi=shift;
my $session=shift;
debug("skeleton plugin running in sessioncgi");
-} #}}}
+}
-sub canedit ($$$) { #{{{
+sub canedit ($$$) {
my $page=shift;
my $cgi=shift;
my $session=shift;
debug("skeleton plugin running in canedit");
-} #}}}
+}
-sub editcontent ($$$) { #{{{
+sub editcontent ($$$) {
my %params=@_;
debug("skeleton plugin running in editcontent");
return $params{content};
-} #}}}
+}
-sub formbuilder_setup (@) { #{{{
+sub formbuilder_setup (@) {
my %params=@_;
debug("skeleton plugin running in formbuilder_setup");
-} # }}}
+}
-sub formbuilder (@) { #{{{
+sub formbuilder (@) {
my %params=@_;
debug("skeleton plugin running in formbuilder");
-} # }}}
+}
-sub savestate () { #{{{
+sub savestate () {
debug("skeleton plugin running in savestate");
-} #}}}
+}
1
diff --git a/IkiWiki/Plugin/smiley.pm b/IkiWiki/Plugin/smiley.pm
index 2633b1ea1..70b8cef74 100644
--- a/IkiWiki/Plugin/smiley.pm
+++ b/IkiWiki/Plugin/smiley.pm
@@ -8,13 +8,13 @@ use IkiWiki 2.00;
my %smileys;
my $smiley_regexp;
-sub import { #{{{
+sub import {
add_underlay("smiley");
hook(type => "getsetup", id => "smiley", call => \&getsetup);
hook(type => "sanitize", id => "smiley", call => \&sanitize);
-} # }}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 1,
@@ -22,9 +22,9 @@ sub getsetup () { #{{{
# removes the smileys, which would break links
rebuild => 1,
},
-} #}}}
+}
-sub build_regexp () { #{{{
+sub build_regexp () {
my $list=readfile(srcfile("smileys.mdwn"));
while ($list =~ m/^\s*\*\s+\\\\([^\s]+)\s+\[\[([^]]+)\]\]/mg) {
my $smiley=$1;
@@ -50,9 +50,9 @@ sub build_regexp () { #{{{
$smiley_regexp='('.join('|', map { quotemeta }
reverse sort keys %smileys).')';
#debug($smiley_regexp);
-} #}}}
+}
-sub sanitize (@) { #{{{
+sub sanitize (@) {
my %params=@_;
build_regexp() unless defined $smiley_regexp;
@@ -95,6 +95,6 @@ MATCH: while (m{(?:^|(?<=\s|>))(\\?)$smiley_regexp(?:(?=\s|<)|$)}g) {
}
return $_;
-} # }}}
+}
1
diff --git a/IkiWiki/Plugin/sparkline.pm b/IkiWiki/Plugin/sparkline.pm
index 901c2f683..dca755c63 100644
--- a/IkiWiki/Plugin/sparkline.pm
+++ b/IkiWiki/Plugin/sparkline.pm
@@ -14,20 +14,20 @@ my %locmap=(
left => 'TEXT_LEFT',
);
-sub import { #{{{
+sub import {
hook(type => "getsetup", id => "sparkline", call => \&getsetup);
hook(type => "preprocess", id => "sparkline", call => \&preprocess);
-} # }}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 1,
rebuild => undef,
},
-} #}}}
+}
-sub preprocess (@) { #{{{
+sub preprocess (@) {
my %params=@_;
my $php;
@@ -166,6 +166,6 @@ sub preprocess (@) { #{{{
}
return '<img src="'.urlto($fn, $params{destpage}).'" alt="graph" />';
-} # }}}
+}
1
diff --git a/IkiWiki/Plugin/svn.pm b/IkiWiki/Plugin/svn.pm
index d738720be..fe55e7d08 100644
--- a/IkiWiki/Plugin/svn.pm
+++ b/IkiWiki/Plugin/svn.pm
@@ -6,7 +6,7 @@ use strict;
use IkiWiki;
use POSIX qw(setlocale LC_CTYPE);
-sub import { #{{{
+sub import {
hook(type => "checkconfig", id => "svn", call => \&checkconfig);
hook(type => "getsetup", id => "svn", call => \&getsetup);
hook(type => "rcs", id => "rcs_update", call => \&rcs_update);
@@ -19,9 +19,9 @@ sub import { #{{{
hook(type => "rcs", id => "rcs_recentchanges", call => \&rcs_recentchanges);
hook(type => "rcs", id => "rcs_diff", call => \&rcs_diff);
hook(type => "rcs", id => "rcs_getctime", call => \&rcs_getctime);
-} #}}}
+}
-sub checkconfig () { #{{{
+sub checkconfig () {
if (! defined $config{svnpath}) {
$config{svnpath}="trunk";
}
@@ -37,9 +37,9 @@ sub checkconfig () { #{{{
wrappermode => (defined $config{svn_wrappermode} ? $config{svn_wrappermode} : "04755"),
};
}
-} #}}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 0, # rcs plugin
@@ -87,7 +87,7 @@ sub getsetup () { #{{{
safe => 1,
rebuild => 1,
},
-} #}}}
+}
# svn needs LC_CTYPE set to a UTF-8 locale, so try to find one. Any will do.
sub find_lc_ctype() {
@@ -107,27 +107,27 @@ sub find_lc_ctype() {
# fallback to the current locale
return $current;
-} # }}}
+}
$ENV{LC_CTYPE} = $ENV{LC_CTYPE} || find_lc_ctype();
-sub svn_info ($$) { #{{{
+sub svn_info ($$) {
my $field=shift;
my $file=shift;
my $info=`LANG=C svn info $file`;
my ($ret)=$info=~/^$field: (.*)$/m;
return $ret;
-} #}}}
+}
-sub rcs_update () { #{{{
+sub rcs_update () {
if (-d "$config{srcdir}/.svn") {
if (system("svn", "update", "--quiet", $config{srcdir}) != 0) {
warn("svn update failed\n");
}
}
-} #}}}
+}
-sub rcs_prepedit ($) { #{{{
+sub rcs_prepedit ($) {
# Prepares to edit a file under revision control. Returns a token
# that must be passed into rcs_commit when the file is ready
# for committing.
@@ -140,9 +140,9 @@ sub rcs_prepedit ($) { #{{{
my $rev=svn_info("Revision", "$config{srcdir}/$file");
return defined $rev ? $rev : "";
}
-} #}}}
+}
-sub rcs_commit ($$$;$$) { #{{{
+sub rcs_commit ($$$;$$) {
# Tries to commit the page; returns undef on _success_ and
# a version of the page with the rcs's conflict markers on failure.
# The file is relative to the srcdir.
@@ -185,7 +185,7 @@ sub rcs_commit ($$$;$$) { #{{{
}
}
return undef # success
-} #}}}
+}
sub rcs_commit_staged ($$$) {
# Commits all staged changes. Changes can be staged using rcs_add,
@@ -209,7 +209,7 @@ sub rcs_commit_staged ($$$) {
return undef # success
}
-sub rcs_add ($) { #{{{
+sub rcs_add ($) {
# filename is relative to the root of the srcdir
my $file=shift;
@@ -224,9 +224,9 @@ sub rcs_add ($) { #{{{
warn("svn add failed\n");
}
}
-} #}}}
+}
-sub rcs_remove ($) { #{{{
+sub rcs_remove ($) {
# filename is relative to the root of the srcdir
my $file=shift;
@@ -235,9 +235,9 @@ sub rcs_remove ($) { #{{{
warn("svn rm failed\n");
}
}
-} #}}}
+}
-sub rcs_rename ($$) { #{{{
+sub rcs_rename ($$) {
# filenames relative to the root of the srcdir
my ($src, $dest)=@_;
@@ -258,9 +258,9 @@ sub rcs_rename ($$) { #{{{
warn("svn rename failed\n");
}
}
-} #}}}
+}
-sub rcs_recentchanges ($) { #{{{
+sub rcs_recentchanges ($) {
my $num=shift;
my @ret;
@@ -341,14 +341,14 @@ sub rcs_recentchanges ($) { #{{{
}
return @ret;
-} #}}}
+}
-sub rcs_diff ($) { #{{{
+sub rcs_diff ($) {
my $rev=IkiWiki::possibly_foolish_untaint(int(shift));
return `svnlook diff $config{svnrepo} -r$rev --no-diff-deleted`;
-} #}}}
+}
-sub rcs_getctime ($) { #{{{
+sub rcs_getctime ($) {
my $file=shift;
my $svn_log_infoline=qr/^r\d+\s+\|\s+[^\s]+\s+\|\s+(\d+-\d+-\d+\s+\d+:\d+:\d+\s+[-+]?\d+).*/;
@@ -376,6 +376,6 @@ sub rcs_getctime ($) { #{{{
$date=str2time($date);
debug("found ctime ".localtime($date)." for $file");
return $date;
-} #}}}
+}
1
diff --git a/IkiWiki/Plugin/table.pm b/IkiWiki/Plugin/table.pm
index e782fc238..b6f53f607 100644
--- a/IkiWiki/Plugin/table.pm
+++ b/IkiWiki/Plugin/table.pm
@@ -6,20 +6,20 @@ use strict;
use Encode;
use IkiWiki 2.00;
-sub import { #{{{
+sub import {
hook(type => "getsetup", id => "table", call => \&getsetup);
hook(type => "preprocess", id => "table", call => \&preprocess);
-} # }}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 1,
rebuild => undef,
},
-} #}}}
+}
-sub preprocess (@) { #{{{
+sub preprocess (@) {
my %params =(
format => 'auto',
header => 'row',
@@ -102,16 +102,16 @@ sub preprocess (@) { #{{{
else {
return $html;
}
-} #}}}
+}
-sub is_dsv_data ($) { #{{{
+sub is_dsv_data ($) {
my $text = shift;
my ($line) = split(/\n/, $text);
return $line =~ m{.+\|};
}
-sub split_csv ($$) { #{{{
+sub split_csv ($$) {
my @text_lines = split(/\n/, shift);
my $delimiter = shift;
@@ -137,9 +137,9 @@ sub split_csv ($$) { #{{{
}
return @data;
-} #}}}
+}
-sub split_dsv ($$) { #{{{
+sub split_dsv ($$) {
my @text_lines = split(/\n/, shift);
my $delimiter = shift;
$delimiter="|" unless defined $delimiter;
@@ -150,9 +150,9 @@ sub split_dsv ($$) { #{{{
}
return @data;
-} #}}}
+}
-sub genrow ($@) { #{{{
+sub genrow ($@) {
my %params=%{shift()};
my $elt = shift;
my @data = @_;
@@ -190,6 +190,6 @@ sub genrow ($@) { #{{{
push @ret, "\t\t</tr>";
return @ret;
-} #}}}
+}
1
diff --git a/IkiWiki/Plugin/tag.pm b/IkiWiki/Plugin/tag.pm
index d725ef9b3..ecc77cbb1 100644
--- a/IkiWiki/Plugin/tag.pm
+++ b/IkiWiki/Plugin/tag.pm
@@ -8,22 +8,22 @@ use IkiWiki 2.00;
my %tags;
-sub import { #{{{
+sub import {
hook(type => "getopt", id => "tag", call => \&getopt);
hook(type => "getsetup", id => "tag", call => \&getsetup);
hook(type => "preprocess", id => "tag", call => \&preprocess_tag, scan => 1);
hook(type => "preprocess", id => "taglink", call => \&preprocess_taglink, scan => 1);
hook(type => "pagetemplate", id => "tag", call => \&pagetemplate);
-} # }}}
+}
-sub getopt () { #{{{
+sub getopt () {
eval q{use Getopt::Long};
error($@) if $@;
Getopt::Long::Configure('pass_through');
GetOptions("tagbase=s" => \$config{tagbase});
-} #}}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 1,
@@ -36,9 +36,9 @@ sub getsetup () { #{{{
safe => 1,
rebuild => 1,
},
-} #}}}
+}
-sub tagpage ($) { #{{{
+sub tagpage ($) {
my $tag=shift;
if ($tag !~ m{^\.?/} &&
@@ -48,18 +48,18 @@ sub tagpage ($) { #{{{
}
return $tag;
-} #}}}
+}
-sub taglink ($$$;@) { #{{{
+sub taglink ($$$;@) {
my $page=shift;
my $destpage=shift;
my $tag=shift;
my %opts=@_;
return htmllink($page, $destpage, tagpage($tag), %opts);
-} #}}}
+}
-sub preprocess_tag (@) { #{{{
+sub preprocess_tag (@) {
if (! @_) {
return "";
}
@@ -77,9 +77,9 @@ sub preprocess_tag (@) { #{{{
}
return "";
-} # }}}
+}
-sub preprocess_taglink (@) { #{{{
+sub preprocess_taglink (@) {
if (! @_) {
return "";
}
@@ -102,9 +102,9 @@ sub preprocess_taglink (@) { #{{{
grep {
$_ ne 'page' && $_ ne 'destpage' && $_ ne 'preview'
} keys %params);
-} # }}}
+}
-sub pagetemplate (@) { #{{{
+sub pagetemplate (@) {
my %params=@_;
my $page=$params{page};
my $destpage=$params{destpage};
@@ -123,6 +123,6 @@ sub pagetemplate (@) { #{{{
sort keys %{$tags{$page}}]);
}
}
-} # }}}
+}
1
diff --git a/IkiWiki/Plugin/template.pm b/IkiWiki/Plugin/template.pm
index c980df48f..1b7eb91bf 100644
--- a/IkiWiki/Plugin/template.pm
+++ b/IkiWiki/Plugin/template.pm
@@ -8,20 +8,20 @@ use IkiWiki 2.00;
use HTML::Template;
use Encode;
-sub import { #{{{
+sub import {
hook(type => "getsetup", id => "template", call => \&getsetup);
hook(type => "preprocess", id => "template", call => \&preprocess);
-} # }}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 1,
rebuild => undef,
},
-} #}}}
+}
-sub preprocess (@) { #{{{
+sub preprocess (@) {
my %params=@_;
if (! exists $params{id}) {
@@ -71,6 +71,6 @@ sub preprocess (@) { #{{{
return IkiWiki::preprocess($params{page}, $params{destpage},
IkiWiki::filter($params{page}, $params{destpage},
$template->output));
-} # }}}
+}
1
diff --git a/IkiWiki/Plugin/testpagespec.pm b/IkiWiki/Plugin/testpagespec.pm
index 9f9b50f01..a6e94dbbb 100644
--- a/IkiWiki/Plugin/testpagespec.pm
+++ b/IkiWiki/Plugin/testpagespec.pm
@@ -5,20 +5,20 @@ use warnings;
use strict;
use IkiWiki 2.00;
-sub import { #{{{
+sub import {
hook(type => "getsetup", id => "testpagespec", call => \&getsetup);
hook(type => "preprocess", id => "testpagespec", call => \&preprocess);
-} # }}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 1,
rebuild => undef,
},
-} #}}}
+}
-sub preprocess (@) { #{{{
+sub preprocess (@) {
my %params=@_;
foreach my $param (qw{match pagespec}) {
@@ -37,6 +37,6 @@ sub preprocess (@) { #{{{
else {
return "no match: $ret";
}
-} # }}}
+}
1
diff --git a/IkiWiki/Plugin/teximg.pm b/IkiWiki/Plugin/teximg.pm
index 661d97b1f..57b23147e 100644
--- a/IkiWiki/Plugin/teximg.pm
+++ b/IkiWiki/Plugin/teximg.pm
@@ -21,12 +21,12 @@ EOPREFIX
my $default_postfix = '\\end{document}';
-sub import { #{{{
+sub import {
hook(type => "getsetup", id => "teximg", call => \&getsetup);
hook(type => "preprocess", id => "teximg", call => \&preprocess);
-} #}}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 1,
@@ -52,9 +52,9 @@ sub getsetup () { #{{{
safe => 0, # Not sure how secure LaTeX is...
rebuild => 1,
},
-} #}}}
+}
-sub preprocess (@) { #{{{
+sub preprocess (@) {
my %params = @_;
my $height = $params{height};
@@ -76,9 +76,9 @@ sub preprocess (@) { #{{{
else {
error gettext("code includes disallowed latex commands")
}
-} #}}}
+}
-sub check_height ($) { #{{{
+sub check_height ($) {
# Since latex doesn't support unlimited scaling this function
# returns the closest supported size.
my $height =shift;
@@ -95,9 +95,9 @@ sub check_height ($) { #{{{
}
}
return $ret;
-} #}}}
+}
-sub create ($$$) { #{{{
+sub create ($$$) {
# This function calls the image generating function and returns
# the <img .. /> for the generated image.
my $code = shift;
@@ -127,9 +127,9 @@ sub create ($$$) { #{{{
else {
error qq{<a href="$logurl">}.gettext("failed to generate image from code")."</a>";
}
-} #}}}
+}
-sub gen_image ($$$$) { #{{{
+sub gen_image ($$$$) {
# Actually creates the image.
my $code = shift;
my $height = shift;
@@ -180,18 +180,18 @@ sub gen_image ($$$$) { #{{{
return 0;
}
-} #}}}
+}
-sub create_tmp_dir ($) { #{{{
+sub create_tmp_dir ($) {
# Create a temp directory, it will be removed when ikiwiki exits.
my $base = shift;
my $template = $base.".XXXXXXXXXX";
my $tmpdir = tempdir($template, TMPDIR => 1, CLEANUP => 1);
return $tmpdir;
-} #}}}
+}
-sub check ($) { #{{{
+sub check ($) {
# Check if the code is ok
my $code = shift;
@@ -219,6 +219,6 @@ sub check ($) { #{{{
}
}
return 1;
-} #}}}
+}
1
diff --git a/IkiWiki/Plugin/textile.pm b/IkiWiki/Plugin/textile.pm
index bbd282f0c..d1b927b74 100644
--- a/IkiWiki/Plugin/textile.pm
+++ b/IkiWiki/Plugin/textile.pm
@@ -9,26 +9,26 @@ use strict;
use IkiWiki 2.00;
use Encode;
-sub import { #{{{
+sub import {
hook(type => "getsetup", id => "textile", call => \&getsetup);
hook(type => "htmlize", id => "txtl", call => \&htmlize);
-} # }}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 1,
rebuild => 1, # format plugin
},
-} #}}}
+}
-sub htmlize (@) { #{{{
+sub htmlize (@) {
my %params=@_;
my $content = decode_utf8(encode_utf8($params{content}));
eval q{use Text::Textile};
return $content if $@;
return Text::Textile::textile($content);
-} # }}}
+}
1
diff --git a/IkiWiki/Plugin/tla.pm b/IkiWiki/Plugin/tla.pm
index 0a5c161b2..f4b20a6ec 100644
--- a/IkiWiki/Plugin/tla.pm
+++ b/IkiWiki/Plugin/tla.pm
@@ -5,7 +5,7 @@ use warnings;
use strict;
use IkiWiki;
-sub import { #{{{
+sub import {
hook(type => "checkconfig", id => "tla", call => \&checkconfig);
hook(type => "getsetup", id => "tla", call => \&getsetup);
hook(type => "rcs", id => "rcs_update", call => \&rcs_update);
@@ -18,18 +18,18 @@ sub import { #{{{
hook(type => "rcs", id => "rcs_recentchanges", call => \&rcs_recentchanges);
hook(type => "rcs", id => "rcs_diff", call => \&rcs_diff);
hook(type => "rcs", id => "rcs_getctime", call => \&rcs_getctime);
-} #}}}
+}
-sub checkconfig () { #{{{
+sub checkconfig () {
if (defined $config{tla_wrapper} && length $config{tla_wrapper}) {
push @{$config{wrappers}}, {
wrapper => $config{tla_wrapper},
wrappermode => (defined $config{tla_wrappermode} ? $config{tla_wrappermode} : "06755"),
};
}
-} #}}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 0, # rcs plugin
@@ -63,9 +63,9 @@ sub getsetup () { #{{{
safe => 1,
rebuild => 1,
},
-} #}}}
+}
-sub quiet_system (@) { #{{{
+sub quiet_system (@) {
# See Debian bug #385939.
open (SAVEOUT, ">&STDOUT");
close STDOUT;
@@ -75,17 +75,17 @@ sub quiet_system (@) { #{{{
open (STDOUT, ">&SAVEOUT");
close SAVEOUT;
return $ret;
-} #}}}
+}
-sub rcs_update () { #{{{
+sub rcs_update () {
if (-d "$config{srcdir}/{arch}") {
if (quiet_system("tla", "replay", "-d", $config{srcdir}) != 0) {
warn("tla replay failed\n");
}
}
-} #}}}
+}
-sub rcs_prepedit ($) { #{{{
+sub rcs_prepedit ($) {
my $file=shift;
if (-d "$config{srcdir}/{arch}") {
@@ -94,9 +94,9 @@ sub rcs_prepedit ($) { #{{{
my $rev=`tla tree-id $config{srcdir}`;
return defined $rev ? $rev : "";
}
-} #}}}
+}
-sub rcs_commit ($$$;$$) { #{{{
+sub rcs_commit ($$$;$$) {
my $file=shift;
my $message=shift;
my $rcstoken=shift;
@@ -135,7 +135,7 @@ sub rcs_commit ($$$;$$) { #{{{
}
}
return undef # success
-} #}}}
+}
sub rcs_commit_staged ($$$) {
# Commits all staged changes. Changes can be staged using rcs_add,
@@ -145,7 +145,7 @@ sub rcs_commit_staged ($$$) {
error("rcs_commit_staged not implemented for tla"); # TODO
}
-sub rcs_add ($) { #{{{
+sub rcs_add ($) {
my $file=shift;
if (-d "$config{srcdir}/{arch}") {
@@ -153,19 +153,19 @@ sub rcs_add ($) { #{{{
warn("tla add failed\n");
}
}
-} #}}}
+}
-sub rcs_remove ($) { # {{{
+sub rcs_remove ($) {
my $file = shift;
error("rcs_remove not implemented for tla"); # TODO
-} #}}}
+}
sub rcs_rename ($$) { # {{{a
my ($src, $dest) = @_;
error("rcs_rename not implemented for tla"); # TODO
-} #}}}
+}
sub rcs_recentchanges ($) {
my $num=shift;
@@ -239,7 +239,7 @@ sub rcs_recentchanges ($) {
return @ret;
}
-sub rcs_diff ($) { #{{{
+sub rcs_diff ($) {
my $rev=shift;
my $logs = `tla logs -d $config{srcdir}`;
my @changesets = reverse split(/\n/, $logs);
@@ -251,9 +251,9 @@ sub rcs_diff ($) { #{{{
my $revminusone = $changesets[$i+1];
return `tla diff -d $config{srcdir} $revminusone`;
-} #}}}
+}
-sub rcs_getctime ($) { #{{{
+sub rcs_getctime ($) {
my $file=shift;
eval q{use Date::Parse};
error($@) if $@;
@@ -281,6 +281,6 @@ sub rcs_getctime ($) { #{{{
my $date=str2time($sdate, 'UTC');
debug("found ctime ".localtime($date)." for $file");
return $date;
-} #}}}
+}
1
diff --git a/IkiWiki/Plugin/toc.pm b/IkiWiki/Plugin/toc.pm
index dff9d9aa5..460837b1d 100644
--- a/IkiWiki/Plugin/toc.pm
+++ b/IkiWiki/Plugin/toc.pm
@@ -7,23 +7,23 @@ use strict;
use IkiWiki 2.00;
use HTML::Parser;
-sub import { #{{{
+sub import {
hook(type => "getsetup", id => "toc", call => \&getsetup);
hook(type => "preprocess", id => "toc", call => \&preprocess);
hook(type => "format", id => "toc", call => \&format);
-} # }}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 1,
rebuild => undef,
},
-} #}}}
+}
my %tocpages;
-sub preprocess (@) { #{{{
+sub preprocess (@) {
my %params=@_;
if ($params{page} eq $params{destpage}) {
@@ -40,9 +40,9 @@ sub preprocess (@) { #{{{
# right.
return "";
}
-} # }}}
+}
-sub format (@) { #{{{
+sub format (@) {
my %params=@_;
my $content=$params{content};
diff --git a/IkiWiki/Plugin/toggle.pm b/IkiWiki/Plugin/toggle.pm
index 657d8d3c2..967b07fcc 100644
--- a/IkiWiki/Plugin/toggle.pm
+++ b/IkiWiki/Plugin/toggle.pm
@@ -5,7 +5,7 @@ use warnings;
use strict;
use IkiWiki 2.00;
-sub import { #{{{
+sub import {
add_underlay("javascript");
hook(type => "getsetup", id => "toggle", call => \&getsetup);
hook(type => "preprocess", id => "toggle",
@@ -13,17 +13,17 @@ sub import { #{{{
hook(type => "preprocess", id => "toggleable",
call => \&preprocess_toggleable);
hook(type => "format", id => "toggle", call => \&format);
-} # }}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 1,
rebuild => undef,
},
-} #}}}
+}
-sub genid ($$) { #{{{
+sub genid ($$) {
my $page=shift;
my $id=shift;
@@ -35,16 +35,16 @@ sub genid ($$) { #{{{
$id="id$id";
}
return $id;
-} #}}}
+}
-sub preprocess_toggle (@) { #{{{
+sub preprocess_toggle (@) {
my %params=(id => "default", text => "more", @_);
my $id=genid($params{page}, $params{id});
return "<a class=\"toggle\" href=\"#$id\">$params{text}</a>";
-} # }}}
+}
-sub preprocess_toggleable (@) { #{{{
+sub preprocess_toggleable (@) {
my %params=(id => "default", text => "", open => "no", @_);
# Preprocess the text to expand any preprocessor directives
@@ -61,9 +61,9 @@ sub preprocess_toggleable (@) { #{{{
my ($indent)=$params{text}=~/( +)$/;
$indent="" unless defined $indent;
return "<div class=\"$class\" id=\"$id\"></div>\n\n$params{text}\n$indent<div class=\"toggleableend\"></div>";
-} # }}}
+}
-sub format (@) { #{{{
+sub format (@) {
my %params=@_;
if ($params{content}=~s!(<div class="toggleable(?:-open)?" id="[^"]+">\s*)</div>!$1!g) {
@@ -74,9 +74,9 @@ sub format (@) { #{{{
}
}
return $params{content};
-} # }}}
+}
-sub include_javascript ($;$) { #{{{
+sub include_javascript ($;$) {
my $page=shift;
my $absolute=shift;
@@ -84,6 +84,6 @@ sub include_javascript ($;$) { #{{{
'" type="text/javascript" charset="utf-8"></script>'."\n".
'<script src="'.urlto("toggle.js", $page, $absolute).
'" type="text/javascript" charset="utf-8"></script>';
-} #}}}
+}
1
diff --git a/IkiWiki/Plugin/txt.pm b/IkiWiki/Plugin/txt.pm
index e157bf07e..d65bb2036 100644
--- a/IkiWiki/Plugin/txt.pm
+++ b/IkiWiki/Plugin/txt.pm
@@ -24,13 +24,13 @@ sub import {
}
}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 1,
rebuild => 1, # format plugin
},
-} #}}}
+}
# We use filter to convert raw text to HTML
# (htmlize is called after other plugins insert HTML)
diff --git a/IkiWiki/Plugin/typography.pm b/IkiWiki/Plugin/typography.pm
index 27089b390..e395b2143 100644
--- a/IkiWiki/Plugin/typography.pm
+++ b/IkiWiki/Plugin/typography.pm
@@ -6,20 +6,20 @@ use warnings;
use strict;
use IkiWiki 2.00;
-sub import { #{{{
+sub import {
hook(type => "getopt", id => "typography", call => \&getopt);
hook(type => "getsetup", id => "typography", call => \&getsetup);
IkiWiki::hook(type => "sanitize", id => "typography", call => \&sanitize);
-} # }}}
+}
-sub getopt () { #{{{
+sub getopt () {
eval q{use Getopt::Long};
error($@) if $@;
Getopt::Long::Configure('pass_through');
GetOptions("typographyattributes=s" => \$config{typographyattributes});
-} #}}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
eval q{use Text::Typography};
error($@) if $@;
@@ -36,9 +36,9 @@ sub getsetup () { #{{{
safe => 1,
rebuild => 1,
},
-} #}}}
+}
-sub sanitize (@) { #{{{
+sub sanitize (@) {
my %params=@_;
eval q{use Text::Typography};
@@ -46,6 +46,6 @@ sub sanitize (@) { #{{{
my $attributes=defined $config{typographyattributes} ? $config{typographyattributes} : '3';
return Text::Typography::typography($params{content}, $attributes);
-} # }}}
+}
1
diff --git a/IkiWiki/Plugin/version.pm b/IkiWiki/Plugin/version.pm
index 18e9613ae..3526dafde 100644
--- a/IkiWiki/Plugin/version.pm
+++ b/IkiWiki/Plugin/version.pm
@@ -6,21 +6,21 @@ use warnings;
use strict;
use IkiWiki 2.00;
-sub import { #{{{
+sub import {
hook(type => "getsetup", id => "version", call => \&getsetup);
hook(type => "needsbuild", id => "version", call => \&needsbuild);
hook(type => "preprocess", id => "version", call => \&preprocess);
-} # }}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 1,
rebuild => undef,
},
-} #}}}
+}
-sub needsbuild (@) { #{{{
+sub needsbuild (@) {
my $needsbuild=shift;
foreach my $page (keys %pagestate) {
if (exists $pagestate{$page}{version}{shown}) {
@@ -36,11 +36,11 @@ sub needsbuild (@) { #{{{
}
}
}
-} # }}}
+}
-sub preprocess (@) { #{{{
+sub preprocess (@) {
my %params=@_;
$pagestate{$params{destpage}}{version}{shown}=$IkiWiki::version;
-} # }}}
+}
1
diff --git a/IkiWiki/Plugin/websetup.pm b/IkiWiki/Plugin/websetup.pm
index 827ee3099..66dacfde3 100644
--- a/IkiWiki/Plugin/websetup.pm
+++ b/IkiWiki/Plugin/websetup.pm
@@ -5,15 +5,15 @@ use warnings;
use strict;
use IkiWiki 2.00;
-sub import { #{{{
+sub import {
hook(type => "getsetup", id => "websetup", call => \&getsetup);
hook(type => "checkconfig", id => "websetup", call => \&checkconfig);
hook(type => "sessioncgi", id => "websetup", call => \&sessioncgi);
hook(type => "formbuilder_setup", id => "websetup",
call => \&formbuilder_setup);
-} # }}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 1,
@@ -33,15 +33,15 @@ sub getsetup () { #{{{
safe => 0,
rebuild => 0,
},
-} #}}}
+}
-sub checkconfig () { #{{{
+sub checkconfig () {
if (! exists $config{websetup_show_unsafe}) {
$config{websetup_show_unsafe}=1;
}
-} #}}}
+}
-sub formatexample ($$) { #{{{
+sub formatexample ($$) {
my $example=shift;
my $value=shift;
@@ -54,9 +54,9 @@ sub formatexample ($$) { #{{{
else {
return "";
}
-} #}}}
+}
-sub showfields ($$$@) { #{{{
+sub showfields ($$$@) {
my $form=shift;
my $plugin=shift;
my $enabled=shift;
@@ -207,16 +207,16 @@ sub showfields ($$$@) { #{{{
}
return %enabledfields;
-} #}}}
+}
-sub enable_plugin ($) { #{{{
+sub enable_plugin ($) {
my $plugin=shift;
$config{disable_plugins}=[grep { $_ ne $plugin } @{$config{disable_plugins}}];
push @{$config{add_plugins}}, $plugin;
}
-sub disable_plugin ($) { #{{{
+sub disable_plugin ($) {
my $plugin=shift;
if (grep { $_ eq $plugin } @{$config{add_plugins}}) {
@@ -227,7 +227,7 @@ sub disable_plugin ($) { #{{{
}
}
-sub showform ($$) { #{{{
+sub showform ($$) {
my $cgi=shift;
my $session=shift;
@@ -441,9 +441,9 @@ sub showform ($$) { #{{{
}
IkiWiki::showform($form, $buttons, $session, $cgi);
-} #}}}
+}
-sub sessioncgi ($$) { #{{{
+sub sessioncgi ($$) {
my $cgi=shift;
my $session=shift;
@@ -451,9 +451,9 @@ sub sessioncgi ($$) { #{{{
showform($cgi, $session);
exit;
}
-} #}}}
+}
-sub formbuilder_setup (@) { #{{{
+sub formbuilder_setup (@) {
my %params=@_;
my $form=$params{form};
@@ -464,6 +464,6 @@ sub formbuilder_setup (@) { #{{{
exit;
}
}
-} #}}}
+}
1
diff --git a/IkiWiki/Plugin/wikitext.pm b/IkiWiki/Plugin/wikitext.pm
index c47ccb7b1..50571e524 100644
--- a/IkiWiki/Plugin/wikitext.pm
+++ b/IkiWiki/Plugin/wikitext.pm
@@ -6,27 +6,27 @@ use warnings;
use strict;
use IkiWiki 2.00;
-sub import { #{{{
+sub import {
hook(type => "getsetup", id => "wiki", call => \&getsetup);
hook(type => "htmlize", id => "wiki", call => \&htmlize);
-} # }}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
return
plugin => {
safe => 0, # format plugin
rebuild => undef,
},
-} #}}}
+}
-sub htmlize (@) { #{{{
+sub htmlize (@) {
my %params=@_;
my $content = $params{content};
eval q{use Text::WikiFormat};
return $content if $@;
return Text::WikiFormat::format($content, undef, { implicit_links => 0 });
-} # }}}
+}
1
diff --git a/IkiWiki/Receive.pm b/IkiWiki/Receive.pm
index 72668d26a..37b6f2a62 100644
--- a/IkiWiki/Receive.pm
+++ b/IkiWiki/Receive.pm
@@ -6,21 +6,21 @@ use warnings;
use strict;
use IkiWiki;
-sub getuser () { #{{{
+sub getuser () {
my $user=(getpwuid(exists $ENV{CALLER_UID} ? $ENV{CALLER_UID} : $<))[0];
if (! defined $user) {
error("cannot determine username for $<");
}
return $user;
-} #}}}
+}
-sub trusted () { #{{{
+sub trusted () {
my $user=getuser();
return ! ref $config{untrusted_committers} ||
! grep { $_ eq $user } @{$config{untrusted_committers}};
-} #}}}
+}
-sub gen_wrapper () { #{{{
+sub gen_wrapper () {
# Test for commits from untrusted committers in the wrapper, to
# avoid loading ikiwiki at all for trusted commits.
@@ -43,9 +43,9 @@ EOF
}
EOF
return $ret;
-} #}}}
+}
-sub test () { #{{{
+sub test () {
exit 0 if trusted();
IkiWiki::lockwiki();
@@ -130,6 +130,6 @@ sub test () { #{{{
}
exit 0;
-} #}}}
+}
1
diff --git a/IkiWiki/Render.pm b/IkiWiki/Render.pm
index 389063d46..adae9f0d5 100644
--- a/IkiWiki/Render.pm
+++ b/IkiWiki/Render.pm
@@ -10,7 +10,7 @@ use Encode;
my %backlinks;
my $backlinks_calculated=0;
-sub calculate_backlinks () { #{{{
+sub calculate_backlinks () {
return if $backlinks_calculated;
%backlinks=();
foreach my $page (keys %links) {
@@ -22,9 +22,9 @@ sub calculate_backlinks () { #{{{
}
}
$backlinks_calculated=1;
-} #}}}
+}
-sub backlinks ($) { #{{{
+sub backlinks ($) {
my $page=shift;
calculate_backlinks();
@@ -45,9 +45,9 @@ sub backlinks ($) { #{{{
push @links, { url => $href, page => pagetitle($p_trimmed) };
}
return @links;
-} #}}}
+}
-sub genpage ($$) { #{{{
+sub genpage ($$) {
my $page=shift;
my $content=shift;
@@ -131,9 +131,9 @@ sub genpage ($$) { #{{{
});
return $content;
-} #}}}
+}
-sub scan ($) { #{{{
+sub scan ($) {
my $file=shift;
my $type=pagetype($file);
@@ -165,9 +165,9 @@ sub scan ($) { #{{{
else {
will_render($file, $file, 1);
}
-} #}}}
+}
-sub fast_file_copy (@) { #{{{
+sub fast_file_copy (@) {
my $srcfile=shift;
my $destfile=shift;
my $srcfd=shift;
@@ -191,7 +191,7 @@ sub fast_file_copy (@) { #{{{
}
}
-sub render ($) { #{{{
+sub render ($) {
my $file=shift;
my $type=pagetype($file);
@@ -233,9 +233,9 @@ sub render ($) { #{{{
fast_file_copy($srcfile, $file, $srcfd, @_);
});
}
-} #}}}
+}
-sub prune ($) { #{{{
+sub prune ($) {
my $file=shift;
unlink($file);
@@ -243,9 +243,9 @@ sub prune ($) { #{{{
while (rmdir($dir)) {
$dir=dirname($dir);
}
-} #}}}
+}
-sub refresh () { #{{{
+sub refresh () {
# security check, avoid following symlinks in the srcdir path by default
my $test=$config{srcdir};
while (length $test) {
@@ -507,9 +507,9 @@ sub refresh () { #{{{
if (%rendered) {
run_hooks(change => sub { shift->(keys %rendered) });
}
-} #}}}
+}
-sub commandline_render () { #{{{
+sub commandline_render () {
lockwiki();
loadindex();
unlockwiki();
@@ -532,6 +532,6 @@ sub commandline_render () { #{{{
print genpage($page, $content);
exit 0;
-} #}}}
+}
1
diff --git a/IkiWiki/Setup.pm b/IkiWiki/Setup.pm
index 77afdd608..6ee112096 100644
--- a/IkiWiki/Setup.pm
+++ b/IkiWiki/Setup.pm
@@ -10,7 +10,7 @@ use IkiWiki;
use open qw{:utf8 :std};
use File::Spec;
-sub load ($) { # {{{
+sub load ($) {
my $setup=IkiWiki::possibly_foolish_untaint(shift);
$config{setupfile}=File::Spec->rel2abs($setup);
@@ -27,7 +27,7 @@ sub load ($) { # {{{
eval $code;
error("$setup: ".$@) if $@;
-} #}}}
+}
sub merge ($) {
# Merge setup into existing config and untaint.
@@ -71,9 +71,9 @@ sub merge ($) {
wrappermode => (defined $config{cgi_wrappermode} ? $config{cgi_wrappermode} : "06755"),
};
}
-} #}}}
+}
-sub getsetup () { #{{{
+sub getsetup () {
# Gets all available setup data from all plugins. Returns an
# ordered list of [plugin, setup] pairs.
my @ret;
@@ -105,9 +105,9 @@ sub getsetup () { #{{{
$config{syslog}=$syslog;
return @ret;
-} #}}}
+}
-sub dump ($) { #{{{
+sub dump ($) {
my $file=IkiWiki::possibly_foolish_untaint(shift);
require IkiWiki::Setup::Standard;
diff --git a/IkiWiki/Setup/Automator.pm b/IkiWiki/Setup/Automator.pm
index 88e9f3d24..9f2380d52 100644
--- a/IkiWiki/Setup/Automator.pm
+++ b/IkiWiki/Setup/Automator.pm
@@ -10,20 +10,20 @@ use IkiWiki::UserInfo;
use Term::ReadLine;
use File::Path;
-sub ask ($$) { #{{{
+sub ask ($$) {
my ($question, $default)=@_;
my $r=Term::ReadLine->new("ikiwiki");
$r->readline($question." ", $default);
-} #}}}
+}
-sub prettydir ($) { #{{{
+sub prettydir ($) {
my $dir=shift;
$dir=~s/^\Q$ENV{HOME}\E\//~\//;
return $dir;
-} #}}}
+}
-sub import (@) { #{{{
+sub import (@) {
my $this=shift;
IkiWiki::Setup::merge({@_});
@@ -142,6 +142,6 @@ sub import (@) { #{{{
print "To modify settings, edit ".prettydir($config{dumpsetup})." and then run:\n";
print " ikiwiki -setup ".prettydir($config{dumpsetup})."\n";
exit 0;
-} #}}}
+}
1
diff --git a/IkiWiki/Setup/Standard.pm b/IkiWiki/Setup/Standard.pm
index e6bff2826..951bcfc56 100644
--- a/IkiWiki/Setup/Standard.pm
+++ b/IkiWiki/Setup/Standard.pm
@@ -9,11 +9,11 @@ use warnings;
use strict;
use IkiWiki;
-sub import { #{{{
+sub import {
IkiWiki::Setup::merge($_[1]);
-} #}}}
+}
-sub dumpline ($$$$) { #{{{
+sub dumpline ($$$$) {
my $key=shift;
my $value=shift;
my $type=shift;
@@ -55,9 +55,9 @@ sub dumpline ($$$$) { #{{{
}
return "\t$prefix$key => $dumpedvalue,";
-} #}}}
+}
-sub dumpvalues ($@) { #{{{
+sub dumpvalues ($@) {
my $setup=shift;
my @ret;
while (@_) {
@@ -80,9 +80,9 @@ sub dumpvalues ($@) { #{{{
}
}
return @ret;
-} #}}}
+}
-sub gendump ($) { #{{{
+sub gendump ($) {
my $description=shift;
my %setup=(%config);
my @ret;
@@ -112,6 +112,6 @@ sub gendump ($) { #{{{
push @ret, "}";
return @ret;
-} #}}}
+}
1
diff --git a/IkiWiki/UserInfo.pm b/IkiWiki/UserInfo.pm
index dcf99da09..3423dc923 100644
--- a/IkiWiki/UserInfo.pm
+++ b/IkiWiki/UserInfo.pm
@@ -7,12 +7,12 @@ use strict;
use Storable;
use IkiWiki;
-sub userinfo_retrieve () { #{{{
+sub userinfo_retrieve () {
my $userinfo=eval{ Storable::lock_retrieve("$config{wikistatedir}/userdb") };
return $userinfo;
-} #}}}
+}
-sub userinfo_store ($) { #{{{
+sub userinfo_store ($) {
my $userinfo=shift;
my $newfile="$config{wikistatedir}/userdb.new";
@@ -26,9 +26,9 @@ sub userinfo_store ($) { #{{{
}
}
return $ret;
-} #}}}
+}
-sub userinfo_get ($$) { #{{{
+sub userinfo_get ($$) {
my $user=shift;
my $field=shift;
@@ -39,9 +39,9 @@ sub userinfo_get ($$) { #{{{
return "";
}
return $userinfo->{$user}->{$field};
-} #}}}
+}
-sub userinfo_set ($$$) { #{{{
+sub userinfo_set ($$$) {
my $user=shift;
my $field=shift;
my $value=shift;
@@ -54,9 +54,9 @@ sub userinfo_set ($$$) { #{{{
$userinfo->{$user}->{$field}=$value;
return userinfo_store($userinfo);
-} #}}}
+}
-sub userinfo_setall ($$) { #{{{
+sub userinfo_setall ($$) {
my $user=shift;
my $info=shift;
@@ -66,32 +66,32 @@ sub userinfo_setall ($$) { #{{{
}
$userinfo->{$user}=$info;
return userinfo_store($userinfo);
-} #}}}
+}
-sub is_admin ($) { #{{{
+sub is_admin ($) {
my $user_name=shift;
return grep { $_ eq $user_name } @{$config{adminuser}};
-} #}}}
+}
# XXX deprecated, should be removed eventually
-sub get_banned_users () { #{{{
+sub get_banned_users () {
my @ret;
my $userinfo=userinfo_retrieve();
foreach my $user (keys %{$userinfo}) {
push @ret, $user if $userinfo->{$user}->{banned};
}
return @ret;
-} #}}}
+}
# XXX deprecated, should be removed eventually
-sub set_banned_users (@) { #{{{
+sub set_banned_users (@) {
my %banned=map { $_ => 1 } @_;
my $userinfo=userinfo_retrieve();
foreach my $user (keys %{$userinfo}) {
$userinfo->{$user}->{banned} = $banned{$user};
}
return userinfo_store($userinfo);
-} #}}}
+}
1
diff --git a/IkiWiki/Wrapper.pm b/IkiWiki/Wrapper.pm
index 31e30ad2e..dd9971a34 100644
--- a/IkiWiki/Wrapper.pm
+++ b/IkiWiki/Wrapper.pm
@@ -8,7 +8,7 @@ use File::Spec;
use Data::Dumper;
use IkiWiki;
-sub gen_wrapper () { #{{{
+sub gen_wrapper () {
$config{srcdir}=File::Spec->rel2abs($config{srcdir});
$config{destdir}=File::Spec->rel2abs($config{destdir});
my $this=File::Spec->rel2abs($0);
@@ -173,6 +173,6 @@ EOF
#translators: The parameter is a filename.
printf(gettext("successfully generated %s"), $wrapper);
print "\n";
-} #}}}
+}
1
diff --git a/Makefile.PL b/Makefile.PL
index 2137b9dde..d92d54d1e 100755
--- a/Makefile.PL
+++ b/Makefile.PL
@@ -23,6 +23,9 @@ PROBABLE_INST_LIB=$(shell \\
fi \\
)
+# Additional configurable path variables.
+W3M_CGI_BIN?=$(PREFIX)/lib/w3m/cgi-bin
+
tflag=$(shell if [ -n "$$NOTAINT" ] && [ "$$NOTAINT" != 1 ]; then printf -- "-T"; fi)
extramodules=$(shell if [ "$$PROFILE" = 1 ]; then printf -- "-d:Profile"; fi)
@@ -94,8 +97,8 @@ extra_install:
install -d $(DESTDIR)$(PREFIX)/sbin
install ikiwiki-mass-rebuild $(DESTDIR)$(PREFIX)/sbin
- install -d $(DESTDIR)$(PREFIX)/lib/w3m/cgi-bin
- install ikiwiki-w3m.cgi $(DESTDIR)$(PREFIX)/lib/w3m/cgi-bin
+ install -d $(DESTDIR)$(W3M_CGI_BIN)
+ install ikiwiki-w3m.cgi $(DESTDIR)$(W3M_CGI_BIN)
install -d $(DESTDIR)$(PREFIX)/bin
install ikiwiki.out $(DESTDIR)$(PREFIX)/bin/ikiwiki
diff --git a/debian/changelog b/debian/changelog
index dd19c1463..7875d425b 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,46 @@
+ikiwiki (2.72) unstable; urgency=low
+
+ * Avoid comments in recentchanges being broken links (smcv)
+ * Add deprecation warning for GlobLists, which will stop working in 3.0.
+ * camelcase: Add camelcase_ignore setting.
+ * googlecalendar: Add runtime deprecation warning.
+ * comments: Deal with users entering unqualified or partial urls.
+ * inline: Run format hook first, to ensure other format hooks can affect
+ inlined content. Closes: #509710
+
+ -- Joey Hess <joeyh@debian.org> Sun, 28 Dec 2008 15:01:02 -0500
+
+ikiwiki (2.71) unstable; urgency=low
+
+ * comments: Blog-style comment support, contributed by Simon McVittie.
+ * htmlbalance: New plugin contributed by Simon McVittie.
+ * Change deb dependencies to list Text::Markdown before markdown (really
+ this time).
+ * Improve escaping of wikilinks and preprocessor directives in content
+ produced by aggregate and recentchanges.
+ * French translation update from Philippe Batailler. Closes: #506250
+ * Spanish translation update from Victor Moral.
+ * Fix handling of wrappergroup option.
+ * Correct --dumpsetup to include the srcdir in the setup file.
+ * German translation update from Kai Wasserbäch. Closes: #507056
+ * inline: Support emptyfeeds=no option to skip generating empty feeds.
+ * inline: Support feedfile option to change the filename of the feed
+ generated.
+ * meta: Pass info to htmlscrubber so htmlscrubber_skip can take effect.
+ * htmlbalance: don't compact whitespace, and set misc other options (smcv)
+ * rename: Fix double-escaping of page name in edit box.
+ * monotone: When getting the log, tell monotone how many entries
+ we want, rather than closing the pipe, which it dislikes. (thm)
+ * Coding style change: Remove explcit vim folding markers.
+ * aggregate: If a feed fails to be downloaded, try again immediatly
+ next time aggregation is run, even if the usual time has not passed.
+ Closes: #508622 (Michael Gold)
+ * meta: Process meta date during scan pass so that the date will always
+ affect sorting in inlines.
+ * Improve display of some openids (smcv)
+
+ -- Joey Hess <joeyh@debian.org> Sun, 21 Dec 2008 16:22:05 -0500
+
ikiwiki (2.70) unstable; urgency=low
* Avoid crash on malformed utf-8 discovered by intrigeri.
diff --git a/debian/control b/debian/control
index 04283532b..3becad3c9 100644
--- a/debian/control
+++ b/debian/control
@@ -12,9 +12,9 @@ Vcs-Browser: http://git.ikiwiki.info/?p=ikiwiki
Package: ikiwiki
Architecture: all
-Depends: ${perl:Depends}, markdown | libtext-markdown-perl, libhtml-scrubber-perl, libhtml-template-perl, libhtml-parser-perl, liburi-perl
+Depends: ${perl:Depends}, libtext-markdown-perl | markdown, libhtml-scrubber-perl, libhtml-template-perl, libhtml-parser-perl, liburi-perl
Recommends: gcc | c-compiler, libc6-dev | libc-dev, subversion | git-core (>= 1:1.5.0) | tla | bzr (>= 0.91) | mercurial | monotone (>= 0.38), libxml-simple-perl, libnet-openid-consumer-perl, liblwpx-paranoidagent-perl, libtimedate-perl, libcgi-formbuilder-perl (>= 3.05), libcgi-session-perl (>= 4.14-1), libmail-sendmail-perl, libauthen-passphrase-perl
-Suggests: viewvc | gitweb | viewcvs, libsearch-xapian-perl, xapian-omega (>= 1.0.5), librpc-xml-perl, libtext-wikiformat-perl, python, python-docutils, polygen, tidy, libxml-feed-perl, libmailtools-perl, perlmagick, libfile-mimeinfo-perl, libcrypt-ssleay-perl, liblocale-gettext-perl (>= 1.05-1), libtext-typography-perl, libtext-csv-perl, libdigest-sha1-perl, graphviz, libnet-amazon-s3-perl, sparkline-php, texlive, dvipng, po4a
+Suggests: viewvc | gitweb | viewcvs, libsearch-xapian-perl, xapian-omega (>= 1.0.5), librpc-xml-perl, libtext-wikiformat-perl, python, python-docutils, polygen, tidy, libhtml-tree-perl, libxml-feed-perl, libmailtools-perl, perlmagick, libfile-mimeinfo-perl, libcrypt-ssleay-perl, liblocale-gettext-perl (>= 1.05-1), libtext-typography-perl, libtext-csv-perl, libdigest-sha1-perl, graphviz, libnet-amazon-s3-perl, sparkline-php, texlive, dvipng, po4a
Conflicts: ikiwiki-plugin-table
Replaces: ikiwiki-plugin-table
Provides: ikiwiki-plugin-table
diff --git a/debian/copyright b/debian/copyright
index fe5db8af8..1f189f314 100644
--- a/debian/copyright
+++ b/debian/copyright
@@ -76,6 +76,10 @@ Files: htmltidy.pm
Copyright: © 2006 Faidon Liambotis
License: GPL-2+
+Files: htmlbalance.pm
+Copyright: © 2008 Simon McVittie <http://smcv.pseudorandom.co.uk/>
+License: GPL-2+
+
Files: polygen.pm, pagestats.pm, cutpaste.pm
Copyright: © 2006 Enrico Zini
License: GPL-2+
@@ -108,8 +112,14 @@ Files: google.pm
Copyright: Copyright (C) 2008 Peter Simons <simons@cryp.to>
License: GPL-2+
+Files: comments.pm
+Copyright:
+ © 2006-2008 Joey Hess <joey@ikiwiki.info>
+ © 2008 Simon McVittie <http://smcv.pseudorandom.co.uk/>
+License: GPL-2+
+
Files: po.pm
-Copyright: (C) 2008 intrigeri <intrigeri@boum.org>
+Copyright: © 2008 intrigeri <intrigeri@boum.org>
License: GPL-2+
Files: doc/logo/*
diff --git a/doc/bugs/Allow_overriding_of_symlink_restriction.mdwn b/doc/bugs/Allow_overriding_of_symlink_restriction.mdwn
index 07badd646..efdd9004e 100644
--- a/doc/bugs/Allow_overriding_of_symlink_restriction.mdwn
+++ b/doc/bugs/Allow_overriding_of_symlink_restriction.mdwn
@@ -34,9 +34,9 @@ Is there a huge objection to this patch?
index 990fcaa..0fb78ba 100644
--- a/IkiWiki/Render.pm
+++ b/IkiWiki/Render.pm
- @@ -260,13 +260,15 @@ sub prune ($) { #{{{
+ @@ -260,13 +260,15 @@ sub prune ($) {
- sub refresh () { #{{{
+ sub refresh () {
# security check, avoid following symlinks in the srcdir path
- my $test=$config{srcdir};
- while (length $test) {
@@ -108,7 +108,7 @@ like this being accepted before I bothered.
use IkiWiki;
+use File::Spec;
- sub gen_wrapper () { #{{{
+ sub gen_wrapper () {
- $config{srcdir}=abs_path($config{srcdir});
- $config{destdir}=abs_path($config{destdir});
- my $this=abs_path($0);
diff --git a/doc/bugs/Can__39__t_create_root_page.mdwn b/doc/bugs/Can__39__t_create_root_page.mdwn
index 60cbcd530..91c2eae60 100644
--- a/doc/bugs/Can__39__t_create_root_page.mdwn
+++ b/doc/bugs/Can__39__t_create_root_page.mdwn
@@ -33,7 +33,7 @@ This type of page name (with leading slash) also gets created by the aggregate p
index 99cead6..23d9616 100644
--- a/IkiWiki/CGI.pm
+++ b/IkiWiki/CGI.pm
- @@ -305,9 +305,11 @@ sub cgi_editpage ($$) { #{{{
+ @@ -305,9 +305,11 @@ sub cgi_editpage ($$) {
my $page=$form->field('page');
$page=possibly_foolish_untaint($page);
if (! defined $page || ! length $page ||
@@ -46,7 +46,7 @@ This type of page name (with leading slash) also gets created by the aggregate p
my $baseurl=$config{url}."/".htmlpage($page);
- @@ -425,6 +427,7 @@ sub cgi_editpage ($$) { #{{{
+ @@ -425,6 +427,7 @@ sub cgi_editpage ($$) {
$from ne $form->field('from') ||
file_pruned($from, $config{srcdir}) ||
$from=~/^\// ||
diff --git a/doc/bugs/Comments_link_is_to_index.html_if_usedirs_is_on.mdwn b/doc/bugs/Comments_link_is_to_index.html_if_usedirs_is_on.mdwn
new file mode 100644
index 000000000..6df3ccd9c
--- /dev/null
+++ b/doc/bugs/Comments_link_is_to_index.html_if_usedirs_is_on.mdwn
@@ -0,0 +1,5 @@
+When a page links to its own #comments anchor you get a link like
+"index.html#comments" rather than "./#comments". Fixed in commit 0844bd0b
+on my 'comments' branch. --[[smcv]]
+
+[[!tag patch done]]
diff --git a/doc/bugs/IkiWiki::Wrapper_should_use_destdir.mdwn b/doc/bugs/IkiWiki::Wrapper_should_use_destdir.mdwn
new file mode 100644
index 000000000..6b02c4186
--- /dev/null
+++ b/doc/bugs/IkiWiki::Wrapper_should_use_destdir.mdwn
@@ -0,0 +1,23 @@
+In IkiWiki/Wrapper.pm, the gen_wrapper function finds out what srcdir and
+destdir are set to in the config, but does not use them.
+
+Later in the sub, when a new wiki.cgi wrapper is being created when calling
+ikiwiki --setup /path/to/setup, it will only work if cgi\_wrapper in the
+config file is set to the full path. Otherwise, it creates wiki.cgi in the
+current working directory. It works with the other wrapper it sets up in
+my config - post\_update (using git), as that shows in the config with a
+full path.
+
+One workaround would be to mention in the setup file that cgi_wrapper has
+to be the full path, not just the file name, but that seems silly when
+destdir is also specified in that file and that's where it should go, and
+$config{destdir} is a known value in the Wrapper.pm file.
+
+> Nowhere in any documentation does
+> it say that cgi\_wrapper is relative to the destdir.
+> As noted in [[discussion]], there are web server setups
+> that require the cgi be located elsewhere.
+> [[done]] --[[Joey]]
+
+>> A comment in the generated setup file that all paths should be full
+>> would prevent my (admittedly dumb) error without any drawbacks.
diff --git a/doc/bugs/IkiWiki::Wrapper_should_use_destdir/discussion.mdwn b/doc/bugs/IkiWiki::Wrapper_should_use_destdir/discussion.mdwn
new file mode 100644
index 000000000..870fa7a66
--- /dev/null
+++ b/doc/bugs/IkiWiki::Wrapper_should_use_destdir/discussion.mdwn
@@ -0,0 +1,4 @@
+Just as a point of information, I do not put my cgi wrapper in the dest
+directory. Instead I configure Apache to relate a specific URI to the cgi via
+ScriptAlias. I would not like things to be changed so that the cgi was put in
+the destdir, so I'd vote instead to comment in the `setup\_file`. -- [[Jon]]
diff --git a/doc/bugs/Insecure_dependency_in_eval_while_running_with_-T_switch.mdwn b/doc/bugs/Insecure_dependency_in_eval_while_running_with_-T_switch.mdwn
index 28b48e2c6..c3beb8219 100644
--- a/doc/bugs/Insecure_dependency_in_eval_while_running_with_-T_switch.mdwn
+++ b/doc/bugs/Insecure_dependency_in_eval_while_running_with_-T_switch.mdwn
@@ -53,7 +53,7 @@ I didn't apply your following old patch against `Ikiwiki.pm` file:
+ }
+
+ return eval $newpagespec;
- } #}}}
+ }
package IkiWiki::PageSpec;
@@ -83,7 +83,7 @@ to break the code I distribute in my backport ;)
+ my $ret=eval possibly_foolish_untaint(pagespec_translate($spec));
return IkiWiki::FailReason->new("syntax error") if $@;
return $ret;
- } #}}}
+ }
>> Thanks a lot, Joey! It works :)
>>
diff --git a/doc/bugs/Meta_plugin_does_not_respect_htmlscrubber__95__skip_setting.___40__patch__41__.mdwn b/doc/bugs/Meta_plugin_does_not_respect_htmlscrubber__95__skip_setting.___40__patch__41__.mdwn
new file mode 100644
index 000000000..0e40da551
--- /dev/null
+++ b/doc/bugs/Meta_plugin_does_not_respect_htmlscrubber__95__skip_setting.___40__patch__41__.mdwn
@@ -0,0 +1,11 @@
+I have been trying to include some meta info using the link setting something like the below
+
+ meta link="http://www.example.com/" rel="command" name="Example"
+
+This gets removed by the htmlscrubber as you would expect.
+
+Setting htmlscrubber_skip to the pagespec should stop this getting scrubbed but it does not.
+
+Below is a patch to fix that. It seams to work but I am not sure of it is the correct thing to do.
+
+> [[done]], thanks for the patch --[[Joey]]
diff --git a/doc/bugs/Monotone_rcs_support.mdwn b/doc/bugs/Monotone_rcs_support.mdwn
index 3d1388312..8687e7983 100644
--- a/doc/bugs/Monotone_rcs_support.mdwn
+++ b/doc/bugs/Monotone_rcs_support.mdwn
@@ -11,7 +11,7 @@ diff --git a/IkiWiki/Rcs/monotone.pm b/IkiWiki/Rcs/monotone.pm
index cde6029..34f8f96 100644
--- a/IkiWiki/Rcs/monotone.pm
+++ b/IkiWiki/Rcs/monotone.pm
-@@ -186,8 +186,9 @@ sub rcs_update () { #{{{
+@@ -186,8 +186,9 @@ sub rcs_update () {
check_config();
if (defined($config{mtnsync}) && $config{mtnsync}) {
diff --git a/doc/bugs/No_link_for_blog_items_when_filename_contains_a_colon.mdwn b/doc/bugs/No_link_for_blog_items_when_filename_contains_a_colon.mdwn
index 019970899..bb3f92f9c 100644
--- a/doc/bugs/No_link_for_blog_items_when_filename_contains_a_colon.mdwn
+++ b/doc/bugs/No_link_for_blog_items_when_filename_contains_a_colon.mdwn
@@ -38,19 +38,19 @@ At the moment I see two possible solutions:
+++ IkiWiki.pm 2008-07-21 20:41:35.000000000 +0200
@@ -477,13 +477,13 @@
- sub titlepage ($) { #{{{
+ sub titlepage ($) {
my $title=shift;
- $title=~s/([^-[:alnum:]:+\/.])/$1 eq ' ' ? '_' : "__".ord($1)."__"/eg;
+ $title=~s/([^-[:alnum:]+\/.])/$1 eq ' ' ? '_' : "__".ord($1)."__"/eg;
return $title;
- } #}}}
+ }
- sub linkpage ($) { #{{{
+ sub linkpage ($) {
my $link=shift;
- $link=~s/([^-[:alnum:]:+\/._])/$1 eq ' ' ? '_' : "__".ord($1)."__"/eg;
+ $link=~s/([^-[:alnum:]+\/._])/$1 eq ' ' ? '_' : "__".ord($1)."__"/eg;
return $link;
- } #}}}
+ }
What do you think about that? Does the patch have any side-effects I didn't see?
diff --git a/doc/bugs/Problem_with_toc.pm_plug-in.mdwn b/doc/bugs/Problem_with_toc.pm_plug-in.mdwn
index 8ae347d42..6be5f89b5 100644
--- a/doc/bugs/Problem_with_toc.pm_plug-in.mdwn
+++ b/doc/bugs/Problem_with_toc.pm_plug-in.mdwn
@@ -9,7 +9,7 @@ Here is a patch for toc.pm for producing non-empty 'a' elements.
--- IkiWiki/Plugin/toc.pm.orig Thu Jun 7 11:53:53 2007
+++ IkiWiki/Plugin/toc.pm Thu Jun 7 13:00:00 2007
- @@ -47,7 +47,7 @@ sub format (@) { #{{{
+ @@ -47,7 +47,7 @@ sub format (@) {
if ($tagname =~ /^h(\d+)$/i) {
my $level=$1;
my $anchor="index".++$anchors{$level}."h$level";
@@ -18,7 +18,7 @@ Here is a patch for toc.pm for producing non-empty 'a' elements.
# Take the first header level seen as the topmost level,
# even if there are higher levels seen later on.
- @@ -90,6 +90,16 @@ sub format (@) { #{{{
+ @@ -90,6 +90,16 @@ sub format (@) {
"</a>\n";
$p->handler(text => undef);
}, "dtext");
diff --git a/doc/bugs/Problems_with_graphviz.pm_plug-in.mdwn b/doc/bugs/Problems_with_graphviz.pm_plug-in.mdwn
index 9a26e505a..c9f698158 100644
--- a/doc/bugs/Problems_with_graphviz.pm_plug-in.mdwn
+++ b/doc/bugs/Problems_with_graphviz.pm_plug-in.mdwn
@@ -15,7 +15,7 @@ It also generates image URLs relative to the page being rendered, which means th
--- IkiWiki/Plugin/graphviz.pm.orig 2007-07-27 11:35:05.000000000 +0200
+++ IkiWiki/Plugin/graphviz.pm 2007-07-27 11:36:02.000000000 +0200
- @@ -69,7 +69,12 @@ sub render_graph (\%) { #{{{
+ @@ -69,7 +69,12 @@ sub render_graph (\%) {
}
}
@@ -26,9 +26,9 @@ It also generates image URLs relative to the page being rendered, which means th
+ else {
+ return "<img src=\"".urlto($dest, $params{page})."\" />\n";
+ }
- } #}}}
+ }
- sub graph (@) { #{{{
+ sub graph (@) {
>> --[[HenrikBrixAndersen]]
@@ -38,7 +38,7 @@ The patch below fixes these two issues.
--- graphviz.pm.orig Thu Jun 7 15:45:16 2007
+++ graphviz.pm Fri Jun 8 12:03:38 2007
- @@ -41,7 +41,6 @@ sub render_graph (\%) { #{{{
+ @@ -41,7 +41,6 @@ sub render_graph (\%) {
$pid=open2(*IN, *OUT, "$params{prog} -Tpng");
# open2 doesn't respect "use open ':utf8'"
@@ -46,7 +46,7 @@ The patch below fixes these two issues.
binmode (OUT, ':utf8');
print OUT $src;
- @@ -70,7 +69,12 @@ sub render_graph (\%) { #{{{
+ @@ -70,7 +69,12 @@ sub render_graph (\%) {
}
}
@@ -57,6 +57,6 @@ The patch below fixes these two issues.
+ else {
+ return "<img src=\"".urlto($dest, $params{page})."\" />\n";
+ }
- } #}}}
+ }
- sub graph (@) { #{{{
+ sub graph (@) {
diff --git a/doc/bugs/RecentChanges_broken_with_empty_svnpath.mdwn b/doc/bugs/RecentChanges_broken_with_empty_svnpath.mdwn
index 836c39a71..c852df5e9 100644
--- a/doc/bugs/RecentChanges_broken_with_empty_svnpath.mdwn
+++ b/doc/bugs/RecentChanges_broken_with_empty_svnpath.mdwn
@@ -13,7 +13,7 @@ I can not see why this check is needed in the first place, so here's a patch for
diff -upr ikiwiki-1.49.orig/IkiWiki/Rcs/svn.pm ikiwiki-1.49/IkiWiki/Rcs/svn.pm
--- ikiwiki-1.49.orig/IkiWiki/Rcs/svn.pm Mon Apr 16 15:15:09 2007
+++ ikiwiki-1.49/IkiWiki/Rcs/svn.pm Mon Apr 16 15:15:47 2007
- @@ -176,7 +176,6 @@ sub rcs_recentchanges ($) { #{{{
+ @@ -176,7 +176,6 @@ sub rcs_recentchanges ($) {
}
foreach (keys %{$logentry->{paths}}) {
diff --git a/doc/bugs/Spaces_in_link_text_for_ikiwiki_links.mdwn b/doc/bugs/Spaces_in_link_text_for_ikiwiki_links.mdwn
index f6dbacad7..8aea5cd29 100644
--- a/doc/bugs/Spaces_in_link_text_for_ikiwiki_links.mdwn
+++ b/doc/bugs/Spaces_in_link_text_for_ikiwiki_links.mdwn
@@ -44,7 +44,7 @@ reported in [[index/discussion#index11h1]].
>>
>> If there was ever a future, syntax-breaking major release of ikiwiki
>> (similar to python3000) I'd like to see this fixed as part of that.
->> --[[JonDowland]]
+>> --[[users/Jon]]
>>> You can enable `prefix_directives` and get the disambiguated behavior
>>> and spaces in wikilinks today. It will become the default in 3.0.
diff --git a/doc/bugs/Titles_are_lower-cased_when_creating_a_page.mdwn b/doc/bugs/Titles_are_lower-cased_when_creating_a_page.mdwn
index cc53c0aea..f2c60309b 100644
--- a/doc/bugs/Titles_are_lower-cased_when_creating_a_page.mdwn
+++ b/doc/bugs/Titles_are_lower-cased_when_creating_a_page.mdwn
@@ -6,7 +6,7 @@ If I click on "Czars in Russia", I'd like Ikiwiki to create "Czars\_in\_Russia.m
> --- a/IkiWiki.pm
> +++ b/IkiWiki.pm
-> @@ -584,7 +584,7 @@ sub htmllink ($$$;@) { #{{{
+> @@ -584,7 +584,7 @@ sub htmllink ($$$;@) {
> return "<span class=\"createlink\"><a href=\"".
> cgiurl(
> do => "create",
diff --git a/doc/bugs/Warns_about_use_of_uninitialized_value_if_prefix__95__directives_is_on_and_a_directive_does_not_contain_a_space.mdwn b/doc/bugs/Warns_about_use_of_uninitialized_value_if_prefix__95__directives_is_on_and_a_directive_does_not_contain_a_space.mdwn
index a30f110a4..efb5c70b8 100644
--- a/doc/bugs/Warns_about_use_of_uninitialized_value_if_prefix__95__directives_is_on_and_a_directive_does_not_contain_a_space.mdwn
+++ b/doc/bugs/Warns_about_use_of_uninitialized_value_if_prefix__95__directives_is_on_and_a_directive_does_not_contain_a_space.mdwn
@@ -6,7 +6,7 @@ In `IkiWiki::preprocess`, the last capturing group in the regex used to parse di
index 241a7c0..d2c35a2 100644
--- a/IkiWiki.pm
+++ b/IkiWiki.pm
- @@ -1167,7 +1167,8 @@ sub preprocess ($$$;$$) { #{{{
+ @@ -1167,7 +1167,8 @@ sub preprocess ($$$;$$) {
}sx;
}
@@ -14,6 +14,6 @@ In `IkiWiki::preprocess`, the last capturing group in the regex used to parse di
+ # $4 can be undef if the directive was \[[!foo]]
+ $content =~ s{$regex}{$handle->($1, $2, $3, ($4 or ""))}eg;
return $content;
- } #}}}
+ }
[[cherry-picked|done]] --[[Joey]]
diff --git a/doc/bugs/beautify__95__urlpath_will_add_.__47___even_if_it_is_already_present.mdwn b/doc/bugs/beautify__95__urlpath_will_add_.__47___even_if_it_is_already_present.mdwn
new file mode 100644
index 000000000..8e96b1f56
--- /dev/null
+++ b/doc/bugs/beautify__95__urlpath_will_add_.__47___even_if_it_is_already_present.mdwn
@@ -0,0 +1,3 @@
+beautify_urlpath will prepend a useless "./" to the URL "./foo". Fixed in commit 5b1cf21a on my comments branch. --[[smcv]]
+
+[[!tag patch done]]
diff --git a/doc/bugs/bugfix_for:___34__mtn:_operation_canceled:_Broken_pipe__34_____40__patch__41__.mdwn b/doc/bugs/bugfix_for:___34__mtn:_operation_canceled:_Broken_pipe__34_____40__patch__41__.mdwn
new file mode 100644
index 000000000..b7f38fd29
--- /dev/null
+++ b/doc/bugs/bugfix_for:___34__mtn:_operation_canceled:_Broken_pipe__34_____40__patch__41__.mdwn
@@ -0,0 +1,24 @@
+When using monotone as revision control system, a "mtn: operation canceled: Broken pipe" message is printed. Reason is that, in a call to mtn, the pipe is closed before mtn has done all its output. This patch fixes the problem.
+
+ diff -up ikiwiki/IkiWiki/Plugin/monotone.pm.orig ikiwiki/IkiWiki/Plugin/monotone.pm
+ --- ikiwiki/IkiWiki/Plugin/monotone.pm.orig 2008-11-12 23:45:24.000000000 +0100
+ +++ ikiwiki/IkiWiki/Plugin/monotone.pm 2008-12-16 12:41:38.000000000 +0100
+ @@ -525,13 +525,12 @@ sub rcs_recentchanges ($) {
+ my $child = open(MTNLOG, "-|");
+ if (! $child) {
+ exec("mtn", "log", "--root=$config{mtnrootdir}", "--no-graph",
+ - "--brief") || error("mtn log failed to run");
+ + "--brief", "--last=$num") || error("mtn log failed to run");
+ }
+
+ - while (($num >= 0) and (my $line = <MTNLOG>)) {
+ + while (my $line = <MTNLOG>) {
+ if ($line =~ m/^($sha1_pattern)/) {
+ push @revs, $1;
+ - $num -= 1;
+ }
+ }
+ close MTNLOG || debug("mtn log exited $?");
+
+> Thanks for the patch, and for testing the monotone backend.
+> applied [[done]] --[[Joey]]
diff --git a/doc/bugs/comments_produce_broken_links_in_RecentChanges.mdwn b/doc/bugs/comments_produce_broken_links_in_RecentChanges.mdwn
new file mode 100644
index 000000000..dae00857b
--- /dev/null
+++ b/doc/bugs/comments_produce_broken_links_in_RecentChanges.mdwn
@@ -0,0 +1,9 @@
+Comments produce links like `sandbox/comment_1` in [[RecentChanges]], which,
+when clicked, redirect to a page that does not exist.
+
+The `recentchanges` branch in my repository contains one possible [[patch]],
+which causes the CGI to go to the [[ikiwiki/directive/meta]] `permalink`, if
+any, if the page is internal (comments do have a permalink).
+
+> [[done]].. I I had thought about not showing internal page changes at
+> all, but I like your approach better --[[Joey]]
diff --git a/doc/bugs/dumpsetup_does_not_save_destdir.mdwn b/doc/bugs/dumpsetup_does_not_save_destdir.mdwn
new file mode 100644
index 000000000..768c3fc5e
--- /dev/null
+++ b/doc/bugs/dumpsetup_does_not_save_destdir.mdwn
@@ -0,0 +1,3 @@
+Calling ikiwiki with a bunch of options, including the --dumpsetup somefile.setup option creates somefile.setup for later reuse with the --setup option. The destination dir however is not saved in the setup file, it has destdir => ''.
+
+> that broke in version 2.64 .. fixed [[done]] --[[Joey]]
diff --git a/doc/bugs/git_stderr_output_causes_problems.mdwn b/doc/bugs/git_stderr_output_causes_problems.mdwn
index 4146a5869..c25ef6927 100644
--- a/doc/bugs/git_stderr_output_causes_problems.mdwn
+++ b/doc/bugs/git_stderr_output_causes_problems.mdwn
@@ -6,7 +6,7 @@ Ikiwiki's git handling is sending a bunch of output to stderr. The following pa
index 425536f..5734bb2 100644
--- a/IkiWiki/Rcs/git.pm
+++ b/IkiWiki/Rcs/git.pm
- @@ -24,6 +24,7 @@ sub _safe_git (&@) { #{{{
+ @@ -24,6 +24,7 @@ sub _safe_git (&@) {
if (!$pid) {
# In child.
# Git commands want to be in wc.
diff --git a/doc/bugs/img_plugin_should_pass_through_class_attribute.mdwn b/doc/bugs/img_plugin_should_pass_through_class_attribute.mdwn
index 2e67d6357..f72ecade2 100644
--- a/doc/bugs/img_plugin_should_pass_through_class_attribute.mdwn
+++ b/doc/bugs/img_plugin_should_pass_through_class_attribute.mdwn
@@ -26,7 +26,7 @@ And here's a patch to implement it. Will this survive markdown munging? It seems
index 7226231..3eb1ae7 100644
--- a/Plugin/img.pm
+++ b/Plugin/img.pm
- @@ -93,9 +93,15 @@ sub preprocess (@) { #{{{
+ @@ -93,9 +93,15 @@ sub preprocess (@) {
$imgurl="$config{url}/$imglink";
}
@@ -42,7 +42,7 @@ And here's a patch to implement it. Will this survive markdown munging? It seems
+ $result .= '/></a>';
+
+ return $result;
- } #}}}
+ }
1
--
diff --git a/doc/bugs/inline_sort-by-title_issues.mdwn b/doc/bugs/inline_sort-by-title_issues.mdwn
index 884846b32..ff4555067 100644
--- a/doc/bugs/inline_sort-by-title_issues.mdwn
+++ b/doc/bugs/inline_sort-by-title_issues.mdwn
@@ -23,7 +23,7 @@ And here is a [[patch]] for this. It makes `sort=title` actually sort on the ti
index 9c336e7..99f6de3 100644
--- a/IkiWiki/Plugin/inline.pm
+++ b/IkiWiki/Plugin/inline.pm
- @@ -185,9 +185,12 @@ sub preprocess_inline (@) { #{{{
+ @@ -185,9 +185,12 @@ sub preprocess_inline (@) {
}
}
diff --git a/doc/bugs/inline_sort_order_and_meta_date_value.mdwn b/doc/bugs/inline_sort_order_and_meta_date_value.mdwn
new file mode 100644
index 000000000..d4ec8f345
--- /dev/null
+++ b/doc/bugs/inline_sort_order_and_meta_date_value.mdwn
@@ -0,0 +1,314 @@
+I have a directory containing two files. f1 (<http://alcopop.org/~jon/repro2/src/blog/debgtd.html>) has
+
+ meta date="2008-07-02 14:13:17"
+
+f2 (<http://alcopop.org/~jon/repro2/src/blog/moving.html>) has
+
+ meta date="2008-07-02 21:04:21"
+
+They have both been modified recently:
+
+ >>> stat(f1)
+ (33188, 459250L, 65027L, 1, 1000, 1000, 1686L, 1227967177, 1227966706, 1227966706)
+ >>> stat(f2)
+ (33188, 458868L, 65027L, 1, 1000, 1000, 938L, 1227967187, 1227966705, 1227966705)
+
+Note that f1 is fractionally newer than f2 in terms of ctime and mtime, but f2 is much newer in terms of the meta information.
+
+Another page includes them both via inline:
+
+ inline pages="blog/*" show=5
+
+The resulting page is rendered with f1 above f2, seemingly not using the meta directive information: <http://alcopop.org/~jon/repro2/dest/blog/>. The footer in the inline pages does use the correct time e.g. <em>Posted Wed 02 Jul 2008 14:13:17 BST</em>.
+
+If I instead include them using creation_year in the pagespec, they are ordered correctly.
+
+<http://alcopop.org/~jon/repro2/> contains the src used to reproduce this, the precise ikiwiki invocation (inside Makefile) and the results (dest).
+
+-- [[users/Jon]]
+
+
+> On Ikiwiki 2.53.3 (Debian Lenny), my inlines are also sorted using mtime
+> by default -- despite what the [[documentation|/ikiwiki/directive/inline]]
+> says -- but setting the supposed default sort order manually produces the
+> correct results. For example, the following inline sorts my blog
+> entires using their meta date or ctime:
+>
+> inline pages="blog/*" show="10" sort="age"
+>
+> I'll try to look at the code this weekend and see if age is really the
+> default sort order.
+>
+> -- [David A. Harding](http://dtrt.org), 2008-12-20
+
+Here is the code. As you can see, sort="age" is equivilant to leaving
+out the sort option. --[[Joey]]
+
+ if (exists $params{sort} && $params{sort} eq 'title') {
+ @list=sort { pagetitle(basename($a)) cmp pagetitle(basename($b)) } @list;
+ }
+ elsif (exists $params{sort} && $params{sort} eq 'mtime') {
+ @list=sort { $pagemtime{$b} <=> $pagemtime{$a} } @list;
+ }
+ elsif (! exists $params{sort} || $params{sort} eq 'age') {
+ @list=sort { $pagectime{$b} <=> $pagectime{$a} } @list;
+ }
+ else {
+ return sprintf(gettext("unknown sort type %s"), $params{sort});
+ }
+
+> On further testing, I find that the bug is limited to the first time
+> creation time should be used and has nothing to do with setting the sort
+> parameter. Revised steps to reproduce: --[David A. Harding](http://dtrt.org), 2008-12-20
+>
+> 1. Create pages that sort different by mtime and ctime
+>
+> 2. inline pages="somepages/*"
+>
+> 3. ikiwiki --setup setup_file
+>
+> 4. Pages are output incorrectly in mtime order
+>
+> 5. ikiwiki --setup setup_file
+>
+> 6. Pages are output correctly in ctime order
+>
+> 7. Create new page in somepages/, set its ctime to earlier than another
+> page in sompages/
+>
+> 8. ikiwiki --setup setup_file
+>
+> 9. All previously sorted pages output correctly in ctime order but new
+> page is output incorrectly at the top as if its mtime was its ctime
+>
+> 10. ikiwiki --setup setup_file
+>
+> 11. All pages, including new page, are output correctly in ctime order
+
+You're confusing ctime and creation time. This is perhaps not suprising, as
+ikiwiki uses the term 'ctime' to refer to creation time. However, the unix
+ctime value is not the same thing. Unix ctime can change if a file changes
+owner, or in some cases, permissions. Unix ctime also always changes
+when the file is modified. Ikiwiki wants a first creation date of the file,
+and it accomplishes this by recording the initial ctime of a file the first
+time it processes it, and *preserving* that creation time forever, ignoring
+later ctime changes.
+
+I suspect that this, coupled with the fact that ikiwiki sorts newest pages
+first, explains everything you describe. If not, please send me a shell script
+test case I can run, as instructions like "Create pages that sort different by
+mtime and ctime" are not ones that I know how to follow (given that touch sets
+*both*). --[[Joey]]
+
+> Sorry. I conflated Unix ctime and ikiwiki's creation time because I
+> didn't think the difference was important to this case. I'm a writer,
+> and I should have known better -- I appologize. Revised steps to
+> reproduce are below; feel free to delete this whole misunderstanding
+> to make the bug report more concise.
+>
+> 1. Create pages in the srcdir that should sort in one order by
+> last-modification time and in a diffent order by original creation
+> time. For example:
+>
+> $ echo -e '\[[!meta date="2007-01-01"]]\nNew.' > test/new.mdwn
+> $ echo -e '\[[!meta date="2006-01-01"]]\nOld.' > test/old.mdwn
+>
+> 2. Create a page that includes the files. For example:
+>
+>
+> $ echo '\[[!inline pages="test/*"]]' > sort-test.mdwn
+>
+> 3. Run ikiwiki. For example `ikiwiki --setup setup_file`
+>
+> 4. Pages are output incorrectly in modification time order. For example,
+> actual partial HTML of the sort-test/index.html from commands used
+> above (whitespace-only lines removed; one whitespace-only line
+> added):
+>
+> <div class="inlinepage">
+> <span class="header">
+> <a href="./../test/old/">old</a>
+> </span>
+> <p>Old.</p>
+> <span class="pagedate">
+> Posted Sun 01 Jan 2006 12:00:00 AM EST
+> </span>
+> </div>
+>
+> <div class="inlinepage">
+> <span class="header">
+> <a href="./../test/new/">new</a>
+> </span>
+> <p>New.</p>
+> <span class="pagedate">
+> Posted Mon 01 Jan 2007 12:00:00 AM EST
+> </span>
+> </div>
+>
+> 5. Run ikiwiki again with the same command line. For example: `ikiwiki --setup setup_file`
+>
+> 6. Pages are output correctly in creation time order. For example,
+> actual partial HTML of the sort-test/index.html from commands used
+> above (whitespace-only lines removed; one whitespace-only line
+> added):
+>
+> <div class="inlinepage">
+> <span class="header">
+> <a href="./../test/new/">new</a>
+> </span>
+> <p>New.</p>
+> <span class="pagedate">
+> Posted Mon 01 Jan 2007 12:00:00 AM EST
+> </span>
+> </div>
+>
+> <div class="inlinepage">
+> <span class="header">
+> <a href="./../test/old/">old</a>
+> </span>
+> <p>Old.</p>
+> <span class="pagedate">
+> Posted Sun 01 Jan 2006 12:00:00 AM EST
+> </span>
+> </div>
+>
+> 7. Create a new page with the current Unix mtime and Unix ctime, but a
+> !meta date before the most recent creation date of another page.
+> For example:
+>
+> $ echo -e '\[[!meta date="2005-01-01"]]\nOlder.' > test/older.mdwn
+>
+> 8. Run ikiwiki again with the same command line. For example: `ikiwiki --setup setup_file`
+>
+> 9. All previously sorted pages output correctly in order of their
+> creation time, but the new page is output incorrectly at the top as
+> if its modification time was its creation time. For example,
+> actual partial HTML of the sort-test/index.html from commands used
+> above (whitespace-only lines removed; two whitespace-only
+> lines added):
+>
+> <div class="inlinepage">
+> <span class="header">
+> <a href="./../test/older/">older</a>
+> </span>
+> <p>Older.</p>
+> <span class="pagedate">
+> Posted Sat 01 Jan 2005 12:00:00 AM EST
+> </span>
+> </div>
+>
+> <div class="inlinepage">
+> <span class="header">
+> <a href="./../test/new/">new</a>
+> </span>
+> <p>New.</p>
+> <span class="pagedate">
+> Posted Mon 01 Jan 2007 12:00:00 AM EST
+> </span>
+> </div>
+>
+> <div class="inlinepage">
+> <span class="header">
+> <a href="./../test/old/">old</a>
+> </span>
+> <p>Old.</p>
+> <span class="pagedate">
+> Posted Sun 01 Jan 2006 12:00:00 AM EST
+> </span>
+> </div>
+>
+> 10. Run ikiwiki again with the same command line. For example: `ikiwiki --setup setup_file`
+>
+> 11. All pages, including new page, are output correctly in creation time
+> order. For example, actual partial HTML of the sort-test/index.html
+> from commands used above (whitespace-only lines removed; two
+> whitespace-only lines added):
+>
+> <div class="inlinepage">
+> <span class="header">
+> <a href="./../test/new/">new</a>
+> </span>
+> <p>New.</p>
+> <span class="pagedate">
+> Posted Mon 01 Jan 2007 12:00:00 AM EST
+> </span>
+> </div>
+>
+> <div class="inlinepage">
+> <span class="header">
+> <a href="./../test/old/">old</a>
+> </span>
+> <p>Old.</p>
+> <span class="pagedate">
+> Posted Sun 01 Jan 2006 12:00:00 AM EST
+> </span>
+> </div>
+>
+> <div class="inlinepage">
+> <span class="header">
+> <a href="./../test/older/">older</a>
+> </span>
+> <p>Older.</p>
+> <span class="pagedate">
+> Posted Sat 01 Jan 2005 12:00:00 AM EST
+> </span>
+> </div>
+>
+> File status after all the above actions:
+>
+> $ stat test/*
+> File: `test/new.mdwn'
+> Size: 33 Blocks: 8 IO Block: 4096 regular file
+> Device: ca20h/51744d Inode: 684160 Links: 1
+> Access: (0644/-rw-r--r--) Uid: ( 1000/ harding) Gid: ( 1000/ harding)
+> Access: 2008-12-20 21:48:32.000000000 -0500
+> Modify: 2008-12-20 21:27:03.000000000 -0500
+> Change: 2008-12-20 21:27:03.000000000 -0500
+> File: `test/older.mdwn'
+> Size: 35 Blocks: 8 IO Block: 4096 regular file
+> Device: ca20h/51744d Inode: 684407 Links: 1
+> Access: (0644/-rw-r--r--) Uid: ( 1000/ harding) Gid: ( 1000/ harding)
+> Access: 2008-12-20 21:48:32.000000000 -0500
+> Modify: 2008-12-20 21:42:10.000000000 -0500
+> Change: 2008-12-20 21:42:10.000000000 -0500
+> File: `test/old.mdwn'
+> Size: 33 Blocks: 8 IO Block: 4096 regular file
+> Device: ca20h/51744d Inode: 684161 Links: 1
+> Access: (0644/-rw-r--r--) Uid: ( 1000/ harding) Gid: ( 1000/ harding)
+> Access: 2008-12-20 21:48:32.000000000 -0500
+> Modify: 2008-12-20 21:27:09.000000000 -0500
+> Change: 2008-12-20 21:27:09.000000000 -0500
+>
+> My ikiwiki configuration file (being used to port a blog from pyblosxom
+> to ikiwiki):
+>
+> harding@mail:~$ sed 's/#.*//; /^[ ]*$/d' .ikiwiki/gnuisance.setup
+> use IkiWiki::Setup::Standard {
+> wikiname => "HardingBlog",
+> adminemail => 'dave@dtrt.org',
+> srcdir => "/srv/backup/git/gnuisance.net",
+> destdir => "/srv/test.dtrt.org",
+> url => "http://srv.dtrt.org",
+> wrappers => [
+> ],
+> atom => 1,
+> syslog => 0,
+> prefix_directives => 1,
+> add_plugins => [qw{goodstuff tag}],
+> disable_plugins => [qw{passwordauth}],
+> tagbase => "tag",
+> }
+>
+> --[David A. Harding](http://dtrt.org/), 2008-12-20
+
+Thank you for a textbook excellent reproduction recipe.
+
+What appears to be going on here is that meta directives are not processed
+until the leaf pages are rendered, and thus the ctime setting is not
+available at the time that they are inlined, and the newer unix ctime is
+used. On the second build, the meta data has already been recorded.
+
+This can probably be avoided by processing meta date at scan time.
+
+Verified, fix works. [[done]]
+--[[Joey]]
diff --git a/doc/bugs/links_misparsed_in_CSV_files.mdwn b/doc/bugs/links_misparsed_in_CSV_files.mdwn
new file mode 100644
index 000000000..169c070e7
--- /dev/null
+++ b/doc/bugs/links_misparsed_in_CSV_files.mdwn
@@ -0,0 +1,17 @@
+If a link inside a CSV file contains two or more underscores (\_), then it will get mis-parsed by the table plugin.
+
+e.g. \[[single\_track\_lines]] becomes "em>lines".
+
+Links with only one underscore are OK.
+
+Update 2008-11-24: The problem only occurs if the CSV data is in an external file. If I load it using data="""...""" then it works fine.
+
+The problem appears to be the call to htmlize inside genrow. If the data is inline, then wikilinks get expanded before they get here, and are OK. If the data is from an external file, the wikilinks aren't expanded, and htmlize will expand \[[single\_track\_lines]] into \[[single&lt;em&gt;track&lt;/em&gt;lines]].
+
+Oh, wait, I see the problem. IkiWiki::linkify is only called if the external file doesn't exist. If I remove this check and always call IkiWiki::linkify, then the problem is solved.
+
+(this is inside /usr/share/perl5/IkiWiki/Plugin/table.pm).
+
+I am rather confused what this check does, and the fact the comments are very different for CSV and DSV when the code is the same doesn't seem to help.
+
+-- Brian May
diff --git a/doc/bugs/lockedit_plugin_should_alert_user_about_an_invalid_pagespec_in_preferences.mdwn b/doc/bugs/lockedit_plugin_should_alert_user_about_an_invalid_pagespec_in_preferences.mdwn
index c835d9f98..b8023ce87 100644
--- a/doc/bugs/lockedit_plugin_should_alert_user_about_an_invalid_pagespec_in_preferences.mdwn
+++ b/doc/bugs/lockedit_plugin_should_alert_user_about_an_invalid_pagespec_in_preferences.mdwn
@@ -1,4 +1,4 @@
-[[plugins/lockedit]] adds the form fields for a [[pagespec]] to preferences. This pagespec should be supplied "raw"; i.e., without quotes around it. Inexperienced users (such as [[myself|jondowland]]) may provide an invalid pagespec, such as one with quotes on it. This will be merrily accepted by the form, but will cause no locking to take place.
+[[plugins/lockedit]] adds the form fields for a [[pagespec]] to preferences. This pagespec should be supplied "raw"; i.e., without quotes around it. Inexperienced users (such as [[myself|users/jon]]) may provide an invalid pagespec, such as one with quotes on it. This will be merrily accepted by the form, but will cause no locking to take place.
Perhaps some validation should be performed on the pagespec and the form-submission return include "warning: this pagespec is invalid" or "warning: this pagespec does not match any existing pages" or similar.
@@ -15,3 +15,7 @@ Perhaps some validation should be performed on the pagespec and the form-submiss
> There are small classes of invalid pagespecs. For example, `(foo or bar`
> is invalid due to having unbalanced parens, while `foo or and bar`
> has invalid syntax. It's possible to detect these, I guess ... --[[Joey]]
+
+>> Having moved it to the .setup file makes things more obvious I think.
+>> Anyway I consider this [[done]], please de-done this if you disagree.
+>> --[[Jon]]
diff --git a/doc/bugs/login_page_should_note_cookie_requirement.mdwn b/doc/bugs/login_page_should_note_cookie_requirement.mdwn
index e2d5a352b..96686053c 100644
--- a/doc/bugs/login_page_should_note_cookie_requirement.mdwn
+++ b/doc/bugs/login_page_should_note_cookie_requirement.mdwn
@@ -4,6 +4,13 @@ At the moment, you go through the login shuffle and then are told that cookies a
> websites that have a login require cookies. Such warnings used to be
> common, but few sites bother with them anymore. --[[Joey]]
+>> Very few websites break without cookies. Even fewer lose data.
+>> Can ikiwiki avoid being below average by default? --[MJR](http://mjr.towers.org.uk)
+
+>>> Can we avoid engaging in hyperbole? (Hint: Your browser probably has a
+>>> back button. Hint 2: A username/password does not count as "lost data".
+>>> Hint 3: Now we're arguing, which is pointless.) --[[Joey]]
+
Even better would be to only display the cookie note as a warning if the login page doesn't receive a session cookie.
> I considered doing this before, but it would require running the cgi once
@@ -11,7 +18,16 @@ Even better would be to only display the cookie note as a warning if the login p
> time to check if it took, which is both complicated and probably would
> look bad.
+>> Might this be possible client-side with javascript? A quick google suggests it is possible:
+>> <http://www.javascriptkit.com/javatutors/cookiedetect.shtml>. MJR, want to try adding
+>> that? -- [[Will]]
+
Best of all would be to use URL-based or hidden-field-based session tokens if cookies are not permitted.
> This is not very doable since most of the pages the user browses are
> static pages in a static location.
+
+>> The pages that lose data without cookies (the edit pages, primarily)
+>> don't look static. Are they really? --[MJR](http://mjr.towers.org.uk)
+
+>>> As soon as you post an edit page, you are back to a static website.
diff --git a/doc/bugs/markdown_bug:_email_escaping_and_plus_addresses.mdwn b/doc/bugs/markdown_bug:_email_escaping_and_plus_addresses.mdwn
index 5c04dce03..6fccc5c86 100644
--- a/doc/bugs/markdown_bug:_email_escaping_and_plus_addresses.mdwn
+++ b/doc/bugs/markdown_bug:_email_escaping_and_plus_addresses.mdwn
@@ -8,7 +8,7 @@ compare:
It seems putting a '+' in there throws it. Maybe it's a markdown bug, or maybe the obfuscation markdown applies to email-links is being caught by the HTML sanitizer.
- -- [[JonDowland]]
+ -- [[users/Jon]]
> It's a markdown bug. For some reason, markdown doesn't recognize the email with a '+' as an email:
>
diff --git a/doc/bugs/mercurial_fail_to_add.mdwn b/doc/bugs/mercurial_fail_to_add.mdwn
index dab40d684..3bbf4e5fd 100644
--- a/doc/bugs/mercurial_fail_to_add.mdwn
+++ b/doc/bugs/mercurial_fail_to_add.mdwn
@@ -6,7 +6,7 @@ Here is a patch that's seems to work, although I'm not quite sure what's wrong w
--- mercurial.pm 2007-03-24 16:14:35.000000000 +0100
+++ /home/hbernard/mercurial.pm 2007-04-19 19:05:47.000000000 +0200
@@ -95,7 +95,7 @@
- sub rcs_add ($) { # {{{
+ sub rcs_add ($) {
my ($file) = @_;
- my @cmdline = ("hg", "-q", "-R", "$config{srcdir}", "add", "$file");
diff --git a/doc/bugs/methodResponse_in_add__95__plugins.mdwn b/doc/bugs/methodResponse_in_add__95__plugins.mdwn
index 8a88f4eda..c82b532db 100644
--- a/doc/bugs/methodResponse_in_add__95__plugins.mdwn
+++ b/doc/bugs/methodResponse_in_add__95__plugins.mdwn
@@ -26,7 +26,7 @@
index e476521..d43abd4 100644
--- a/IkiWiki.pm
+++ b/IkiWiki.pm
- @@ -471,7 +471,11 @@ sub loadplugins () { #{{{
+ @@ -471,7 +471,11 @@ sub loadplugins () {
unshift @INC, possibly_foolish_untaint($config{libdir});
}
diff --git a/doc/bugs/multiple_pages_with_same_name.mdwn b/doc/bugs/multiple_pages_with_same_name.mdwn
index 5ddfb1f6b..20c38c062 100644
--- a/doc/bugs/multiple_pages_with_same_name.mdwn
+++ b/doc/bugs/multiple_pages_with_same_name.mdwn
@@ -28,14 +28,14 @@ Suggestions welcome.
index 4e4da11..853f905 100644
--- a/IkiWiki.pm
+++ b/IkiWiki.pm
- @@ -618,7 +618,7 @@ sub pagename ($) { #{{{
+ @@ -618,7 +618,7 @@ sub pagename ($) {
my $type=pagetype($file);
my $page=$file;
- $page=~s/\Q.$type\E*$// if defined $type;
+ $page=~s/\Q.$type\E*$// if defined $type && !$hooks{htmlize}{$type}{leavesuffix};
return $page;
- } #}}}
+ }
diff --git a/t/pagename.t b/t/pagename.t
index 96e6a87..58811b9 100755
@@ -61,7 +61,7 @@ I wonder if this patch will also be useful:
index 752d176..3f1b67b 100644
--- a/IkiWiki/Render.pm
+++ b/IkiWiki/Render.pm
- @@ -279,7 +279,11 @@ sub refresh () { #{{{
+ @@ -279,7 +279,11 @@ sub refresh () {
else {
$f=~s/^\Q$config{srcdir}\E\/?//;
push @files, $f;
diff --git a/doc/bugs/output_of_successful_rename_should_list_the_full_path_to_affected_pages.mdwn b/doc/bugs/output_of_successful_rename_should_list_the_full_path_to_affected_pages.mdwn
new file mode 100644
index 000000000..2d9677e7f
--- /dev/null
+++ b/doc/bugs/output_of_successful_rename_should_list_the_full_path_to_affected_pages.mdwn
@@ -0,0 +1,12 @@
+I've just renamed a page and received the following as a result:
+
+<p>
+<b>Successfully renamed users/jondowland.mdwn to users/jon.mdwn.</b>
+</p>
+<p>
+
+The following pages have been automatically modified to update their links to users/jon.mdwn:
+<ul>
+<li><a href="./../../tips/convert_mediawiki_to_ikiwiki/discussion/">discussion</a></li><li><a href="./../../tips/untrusted_git_push/discussion/">discussion</a></li></ul>...
+
+In this situation I think the link to pages should be expanded to show the entire path, since there is quite likely to be a lot of things like "discussion". -- [[users/Jon]]
diff --git a/doc/bugs/pagespec_parsing_chokes_on_function__40____41__.mdwn b/doc/bugs/pagespec_parsing_chokes_on_function__40____41__.mdwn
index a2eba694c..78fed0e5d 100644
--- a/doc/bugs/pagespec_parsing_chokes_on_function__40____41__.mdwn
+++ b/doc/bugs/pagespec_parsing_chokes_on_function__40____41__.mdwn
@@ -54,7 +54,7 @@ case the user is given to rebuilding the wiki by hand. --Ethan
+ }
return IkiWiki::FailReason->new("syntax error") if $@;
return $ret;
- } #}}}
+ }
</pre>
> Thanks, [[done]] --[[Joey]]
diff --git a/doc/bugs/prune_causing_taint_mode_failures.mdwn b/doc/bugs/prune_causing_taint_mode_failures.mdwn
index 1876d9129..5fc1d8b75 100644
--- a/doc/bugs/prune_causing_taint_mode_failures.mdwn
+++ b/doc/bugs/prune_causing_taint_mode_failures.mdwn
@@ -11,7 +11,7 @@ I've no idea what's happening (hey, I'm a C programmer), but I've hacked prune()
<pre>
use Scalar::Util qw(tainted);
-sub prune ($) { #{{{
+sub prune ($) {
my $file=shift;
unlink($file);
@@ -25,7 +25,7 @@ sub prune ($) { #{{{
$dir = $1;
}
}
-} #}}}
+}
</pre>
> Old versions of perl are known to have bugs with taint checking.
diff --git a/doc/bugs/quieten_mercurial.mdwn b/doc/bugs/quieten_mercurial.mdwn
index 26f833e5f..3fd75ea1b 100644
--- a/doc/bugs/quieten_mercurial.mdwn
+++ b/doc/bugs/quieten_mercurial.mdwn
@@ -6,7 +6,7 @@ messages which are then taken for CGI output, causing errors and general trouble
@@ -55,7 +55,7 @@
}
- sub rcs_update () { #{{{
+ sub rcs_update () {
- my @cmdline = ("hg", "-R", "$config{srcdir}", "update");
+ my @cmdline = ("hg", "-q", "-R", "$config{srcdir}", "update");
if (system(@cmdline) != 0) {
@@ -22,7 +22,7 @@ messages which are then taken for CGI output, causing errors and general trouble
if (system(@cmdline) != 0) {
warn "'@cmdline' failed: $!";
@@ -92,7 +92,7 @@
- sub rcs_add ($) { # {{{
+ sub rcs_add ($) {
my ($file) = @_;
- my @cmdline = ("hg", "-R", "$config{srcdir}", "add", "$file");
diff --git a/doc/bugs/search_for_locale_data_in_the_installed_location.mdwn b/doc/bugs/search_for_locale_data_in_the_installed_location.mdwn
index 0a2b1efea..dace2ca19 100644
--- a/doc/bugs/search_for_locale_data_in_the_installed_location.mdwn
+++ b/doc/bugs/search_for_locale_data_in_the_installed_location.mdwn
@@ -2,7 +2,7 @@ It seems like gettext only searches for locale information in /usr/share/locale,
--- a/IkiWiki.pm
+++ b/IkiWiki.pm
- @@ -1057,6 +1057,7 @@ sub gettext { #{{{
+ @@ -1057,6 +1057,7 @@ sub gettext {
$gettext_obj=undef;
return shift;
}
diff --git a/doc/bugs/stray___60____47__p__62___tags.mdwn b/doc/bugs/stray___60____47__p__62___tags.mdwn
new file mode 100644
index 000000000..6e508ffda
--- /dev/null
+++ b/doc/bugs/stray___60____47__p__62___tags.mdwn
@@ -0,0 +1,15 @@
+When using the [[plugins/htmltidy]] plugin (and possibly in other circumstances), ikiwiki sometimes creates more `</p>` tags than `<p>` tags, causing unbalanced markup. I've previously noticed unbalanced tags when a `\[[!map]]` matches no pages. This is part of the reason I developed [[plugins/htmlbalance]].
+
+This is particularly noticeable if htmltidy is enabled when building the docwiki: on the 'contrib' plugin pages, the title becomes `foo </p> (third-party plugin)` (with the angle-brackets escaped - it seems the text gets sanitized but is then escaped anyway).
+
+I believe that this snippet in `IkiWiki.pm` might be the reason for the imbalance:
+
+ if ($oneline) {
+ # hack to get rid of enclosing junk added by markdown
+ # and other htmlizers
+ $content=~s/^<p>//i;
+ $content=~s/<\/p>$//i;
+ chomp $content;
+ }
+
+The fact that HTML in a `\[[!meta title]]` is added but then escaped might indicate that some other bug is involved.
diff --git a/doc/bugs/tbasewiki__95__brokenlinks.t_broken.mdwn b/doc/bugs/tbasewiki__95__brokenlinks.t_broken.mdwn
index ac895896a..db3917d21 100644
--- a/doc/bugs/tbasewiki__95__brokenlinks.t_broken.mdwn
+++ b/doc/bugs/tbasewiki__95__brokenlinks.t_broken.mdwn
@@ -25,12 +25,12 @@ After some digging I found that HTML::Template is being required after the new s
filter => sub {
my $text_ref = shift;
@@ -857,6 +856,7 @@
- } #}}}
+ }
- sub template ($;@) { #{{{
+ sub template ($;@) {
+ require HTML::Template;
HTML::Template->new(template_params(@_));
- } #}}}
+ }
**That** gave me:
diff --git a/doc/bugs/textile_plugin_dies_if_input_has_a_non-utf8_character.mdwn b/doc/bugs/textile_plugin_dies_if_input_has_a_non-utf8_character.mdwn
index 7ec1edc4e..bdd07210e 100644
--- a/doc/bugs/textile_plugin_dies_if_input_has_a_non-utf8_character.mdwn
+++ b/doc/bugs/textile_plugin_dies_if_input_has_a_non-utf8_character.mdwn
@@ -9,6 +9,6 @@ The first two complaints happen if textile is not loaded, the third fatal one ha
0x92 is "single quote" in the evil windows default codepage. It would be nice to handle this gracefully and not abort ikiwiki at this point, or alternatively, die fatally but mention which input page caused the error.
-Interestingly enough, in my case, the input file has several other bad windows characters (0xFC, u-umlaut) which have not caused ikiwiki to abort. ikiwiki version 2.50. -- [[JonDowland]]
+Interestingly enough, in my case, the input file has several other bad windows characters (0xFC, u-umlaut) which have not caused ikiwiki to abort. ikiwiki version 2.50. -- [[users/Jon]]
> Fixed in git. [[done]] --[[Joey]]
diff --git a/doc/download.mdwn b/doc/download.mdwn
index 86ddb46b2..1099045b5 100644
--- a/doc/download.mdwn
+++ b/doc/download.mdwn
@@ -40,6 +40,8 @@ Gentoo has an [ebuild](http://bugs.gentoo.org/show_bug.cgi?id=144453) in its bug
IkiWiki can be installed [from macports](http://www.macports.org/ports.php?by=name&substr=ikiwiki)
by running `sudo port install ikiwiki`.
+A [PKGBUILD for Arch Linux](http://aur.archlinux.org/packages.php?ID=12284) is in the AUR.
+
## revision control
Ikiwiki is developed in a [[git_repository|git]].
diff --git a/doc/examples/blog.mdwn b/doc/examples/blog.mdwn
index 3e89c4b99..ab73f0204 100644
--- a/doc/examples/blog.mdwn
+++ b/doc/examples/blog.mdwn
@@ -12,7 +12,13 @@ Some additional configuration you might want to do:
example of how to tag a post is:
\[[!tag tags/life]]
-* Enable the sidebar plugin to get a sidebar listing all the categories
- you've tagged posts with.
+* Enable the [[sidebar|plugins/sidebar]] plugin to get a sidebar listing all
+ the categories you've tagged posts with.
-* Enable the pagestats plugin to get a tag cloud display on the [[index]].
+* Enable the [[pagestats|plugins/pagestats]] plugin to get a tag cloud
+ to display on the [[index]].
+
+* Enable the [[comments|plugins/comments]] plugin and configure it to
+ enable comments to posts to the blog:
+
+ comments_pagespec => 'blog/posts/* and !*/Discussion',
diff --git a/doc/forum/discussion.mdwn b/doc/forum/discussion.mdwn
index 1e55d3f57..93cf4656e 100644
--- a/doc/forum/discussion.mdwn
+++ b/doc/forum/discussion.mdwn
@@ -1,4 +1,4 @@
-I like the idea of this forum heirarchy -- but I think a map would be clearer than inlining the sub-pages. -- [[JonDowland]]
+I like the idea of this forum heirarchy -- but I think a map would be clearer than inlining the sub-pages. -- [[users/Jon]]
> The easier way to accomplish this is to set archive=yes in the inline.
> Switching to archive view can be useful when there are a lot of long
diff --git a/doc/git.mdwn b/doc/git.mdwn
index e7f47f5a0..e9c2e040f 100644
--- a/doc/git.mdwn
+++ b/doc/git.mdwn
@@ -16,17 +16,29 @@ Or like this if your firewall only passes http traffic (slow):
The gitweb is [here](http://git.ikiwiki.info/?p=ikiwiki).
-There is also a mirror [on github](http://github.com/joeyh/ikiwiki/tree/master).
-
Commits to this git repository are fed into [CIA](http://cia.vc), and can
be browsed, subscribed to etc on its
[project page](http://cia.vc/stats/project/ikiwiki). They're also fed into
[twitter](http://twitter.com/ikiwiki).
-## branches
+## personal git repositories
You are of course free to set up your own ikiwiki git repository with your
-own [[patches|patch]].
+own [[patches|patch]]. If you list it here, the `gitremotes` script will
+automatically add it to git remotes. Your repo will automatically be pulled
+into [[Joey]]'s working tree. This is recommended. :-)
+
+<!-- Machine-parsed format: * wikilink <git:url> -->
+
+* github `git://github.com/joeyh/ikiwiki.git`
+ ([browse](http://github.com/joeyh/ikiwiki/tree/master))
+ A mirror of the main repo, automatically updated.
+* [[smcv]] `git://git.pseudorandom.co.uk/git/smcv/ikiwiki.git`
+* [[intrigeri]] `git://gaffer.ptitcanardnoir.org/ikiwiki.git`
+* [[gmcmanus]] `git://github.com/gmcmanus/ikiwiki.git`
+* [[jelmer]] `git://git.samba.org/jelmer/ikiwiki.git`
+
+## branches
Some of the branches included in the main repository include:
@@ -38,9 +50,9 @@ Some of the branches included in the main repository include:
* `wikiwyg` adds [[todo/wikiwyg]] support. It is unmerged pending some
changes.
* `darcs` is being used to add darcs support.
-* `pristine-tar` contains deltas that
- [pristine-tar](http://kitenet.net/~joey/code/pristine-tar)
- can use to recreate released tarballs of ikiwiki
* `debian-stable` is used for updates to the old version included in
Debian's stable release, and `debian-testing` is used for updates to
Debian's testing release.
+* `pristine-tar` contains deltas that
+ [pristine-tar](http://kitenet.net/~joey/code/pristine-tar)
+ can use to recreate released tarballs of ikiwiki
diff --git a/doc/ikiwiki/directive/cutpaste.mdwn b/doc/ikiwiki/directive/cutpaste.mdwn
index 012367bdf..ca580e54f 100644
--- a/doc/ikiwiki/directive/cutpaste.mdwn
+++ b/doc/ikiwiki/directive/cutpaste.mdwn
@@ -17,11 +17,11 @@ follow the paste directive that uses its text. In fact, this is quite useful
to postpone big blocks of text like long annotations and have a more natural
flow. For example:
- \[[!toggleable id="cut" text="\[[!paste id=cutlongdesc]]"]]
- \[[!toggleable id="copy" text="\[[!paste id=copylongdesc]]"]]
- \[[!toggleable id="paste" text="\[[!paste id=pastelongdesc]]"]]
+ \[[!toggleable id="cut" text="[[!paste id=cutlongdesc]]"]]
+ \[[!toggleable id="copy" text="[[!paste id=copylongdesc]]"]]
+ \[[!toggleable id="paste" text="[[!paste id=pastelongdesc]]"]]
- \[...some time later...]
+ [...some time later...]
\[[!cut id=cutlongdesc text="""
blah blah blah
@@ -40,7 +40,7 @@ Since you can paste without using double quotes, copy and paste can be used to
nest directives that require multiline parameters inside each other:
\[[!toggleable id=foo text="""
- \[[!toggleable id=bar text="\[[!paste id=baz]]"]]
+ [[!toggleable id=bar text="[[!paste id=baz]]"]]
"""]]
\[[!cut id=baz text="""
diff --git a/doc/ikiwiki/directive/inline.mdwn b/doc/ikiwiki/directive/inline.mdwn
index 9889cda11..40670e1e7 100644
--- a/doc/ikiwiki/directive/inline.mdwn
+++ b/doc/ikiwiki/directive/inline.mdwn
@@ -73,6 +73,8 @@ Here are some less often needed parameters:
configured to `allowatom`, set to "yes" to enable.
* `feeds` - controls generation of all types of feeds. Set to "no" to
disable generating any feeds.
+* `emptyfeeds` - Set to "no" to disable generation of empty feeds.
+ Has no effect if `rootpage` or `postform` is set.
* `template` - Specifies the template to fill out to display each inlined
page. By default the `inlinepage` template is used, while
the `archivepage` template is used for archives. Set this parameter to
@@ -97,11 +99,16 @@ Here are some less often needed parameters:
in the blog. The format string is passed to the strftime(3) function.
* `feedpages` - A [[PageSpec]] of inlined pages to include in the rss/atom
feeds. The default is the same as the `pages` value above, and only pages
- matches by that value are included, but some of those can be excluded by
+ matched by that value are included, but some of those can be excluded by
specifying a tighter [[PageSpec]] here.
* `guid` - If a URI is given here (perhaps a UUID prefixed with `urn:uuid:`),
the Atom feed will have this as its `<id>`. The default is to use the URL
of the page containing the `inline` directive.
+* `feedfile` - Can be used to change the name of the file generated for the
+ feed. This is particularly useful if a page contains multiple feeds.
+ For example, set "feedfile=feed" to cause it to generate `page/feed.atom`
+ and/or `page/feed.rss`. This option is not supported if the wiki is
+ configured not to use `usedirs`.
[[!meta robots="noindex, follow"]]
diff --git a/doc/ikiwiki/directive/tag.mdwn b/doc/ikiwiki/directive/tag.mdwn
index 267aee660..64736f8cd 100644
--- a/doc/ikiwiki/directive/tag.mdwn
+++ b/doc/ikiwiki/directive/tag.mdwn
@@ -21,6 +21,10 @@ located under a base directory, such as "tags/". This is a useful way to
avoid having to write the full path to tags, if you want to keep them
grouped together out of the way.
+Bear in mind that specifying a tagbase means you will need to incorporate it
+into the `link()` [[ikiwiki/PageSpec]] you use: e.g., if your tagbase is
+`tag`, you would match pages tagged "foo" with `link(tag/foo)`.
+
If you want to override the tagbase for a particular tag, you can use
something like this:
diff --git a/doc/ikiwiki/pagespec.mdwn b/doc/ikiwiki/pagespec.mdwn
index 176228e4b..d4dd265cc 100644
--- a/doc/ikiwiki/pagespec.mdwn
+++ b/doc/ikiwiki/pagespec.mdwn
@@ -47,8 +47,8 @@ Some more elaborate limits can be added to what matches using these functions:
wiki admins.
* "`ip(address)`" - tests whether a modification is being made from the
specified IP address.
-* Some additional special-purpose limits may be enabled, for matching
- [[attachments|attachment]] and [[translations|po]].
+* "`postcomment(glob)`" - matches only when comments are being
+ posted to a page matching the specified glob
For example, to match all pages in a blog that link to the page about music
and were written in 2005:
diff --git a/doc/ikiwiki/pagespec/attachment.mdwn b/doc/ikiwiki/pagespec/attachment.mdwn
index 2d33db748..344a4a734 100644
--- a/doc/ikiwiki/pagespec/attachment.mdwn
+++ b/doc/ikiwiki/pagespec/attachment.mdwn
@@ -9,7 +9,7 @@ configuration setting.
For example, to limit arbitrary files to 50 kilobytes, but allow
larger mp3 files to be uploaded by joey into a specific directory, and
-check all attachments for virii, something like this could be used:
+check all attachments for viruses, something like this could be used:
virusfree() and ((user(joey) and podcast/*.mp3 and mimetype(audio/mpeg) and maxsize(15mb)) or (!ispage() and maxsize(50kb)))
diff --git a/doc/ikiwikiusers.mdwn b/doc/ikiwikiusers.mdwn
index 2492fd211..0c45efa4f 100644
--- a/doc/ikiwikiusers.mdwn
+++ b/doc/ikiwikiusers.mdwn
@@ -101,13 +101,18 @@ Personal sites and blogs
* [Olivier Berger's professional homepage](http://www-public.it-sudparis.eu/~berger_o/)
* [Andrey Tarantsov's homepage](http://www.tarantsov.com/)
* [Don Marti's blog](http://zgp.org/~dmarti/)
-* [[JonDowland]]'s [homepage](http://jmtd.net/)
+* [[users/Jon]]'s [homepage](http://jmtd.net/)
* [[xma]] is using ikiwiki (<http://maillard.mobi/~xma/>)
* [[JanWalzer|jwalzer]]'s [homepage](http://wa.lzer.net/) -- Work in Progress
+* [[Adam_Trickett|ajt]]'s home intranet/sanbox system ([Internet site & blog](http://www.iredale.net/) -- not ikiwiki yet)
+
+Schools
+=======
+* [St Hugh of Lincoln Primary School in Surrey](http://hugh.vm.bytemark.co.uk/)
Please feel free to add your own ikiwiki site!
-See also: [Debian ikiwiki popcon graph](http://people.debian.org/~igloo/popcon-graphs/index.php?packages=ikiwiki)
+See also: [Debian ikiwiki popcon graph](http://popcon.debian.org/~igloo/popcon-graphs/index.php?packages=ikiwiki)
and [google search for ikiwiki powered sites](http://www.google.com/search?q=%22powered%20by%20ikiwiki%22).
While nothing makes me happier than knowing that ikiwiki has happy users, dropping some change in the [[TipJar]] is a nice way to show extra appreciation.
diff --git a/doc/ikiwikiusers/discussion.mdwn b/doc/ikiwikiusers/discussion.mdwn
index 2da3668d4..39a9bb921 100644
--- a/doc/ikiwikiusers/discussion.mdwn
+++ b/doc/ikiwikiusers/discussion.mdwn
@@ -29,3 +29,7 @@ Thanks, --[[Chao]]
Thanks for the reply Joey! ikiwiki is a fantastic wiki complier, though I do
not have my own machine momentarily, i will pay close attention to its development.
Hopefully I will be one of the ikiwiki users one day :) cheers --[[Chao]]
+
+----
+
+Are there automated hosting sites for ikiwiki yet? If you know one, can you add one in a new section on [[ikiwikiusers]] please? If you don't know any and you're willing to pay to set one up (shouldn't be much more expensive than a single ikiwiki IMO), [contact me](http://www.ttllp.co.uk/contact.html) and let's talk. -- MJR
diff --git a/doc/install.mdwn b/doc/install.mdwn
index d745737aa..cc3a4c29f 100644
--- a/doc/install.mdwn
+++ b/doc/install.mdwn
@@ -19,15 +19,6 @@ they are available.
Various [[plugins]] use other perl modules and utilities; see their individual
documentation for details.
-### Installing dependencies with yum
-
-Here's an example of how to install ikiwiki's dependencies using yum
-on Fedora 7:
-
- yum install perl-Text-Markdown perl-Mail-Sendmail perl-HTML-Scrubber \
- perl-XML-Simple perl-TimeDate perl-HTML-Template perl-CGI-FormBuilder \
- perl-CGI-Session perl-File-MimeInfo perl-gettext perl-Authen-Passphrase
-
### Installing dependencies by hand
If you want to install by hand from the tarball, you should make sure that
diff --git a/doc/install/discussion.mdwn b/doc/install/discussion.mdwn
index 2b88f6e66..b5757070f 100644
--- a/doc/install/discussion.mdwn
+++ b/doc/install/discussion.mdwn
@@ -172,9 +172,9 @@ Not sure how to provide proper version information for you.--[[vibrog]]
---
-I've tried a couple of times and my cpan has never recognised Bundle::IkiWiki. Is that section of the page still accurate? -- [[JonDowland]]
+I've tried a couple of times and my cpan has never recognised Bundle::IkiWiki. Is that section of the page still accurate? -- [[users/Jon]]
> Are you running perl with the environemnt settings specified on the page?
> Can you show how it fails to find the bundle? --[[Joey]]
->> I was not. Next time I build I will have to try that (I'll need to tweak it as I already override PERL5LIB; also I need to specify http proxies). Thanks for your help! -- [[JonDowland]]
+>> I was not. Next time I build I will have to try that (I'll need to tweak it as I already override PERL5LIB; also I need to specify http proxies). Thanks for your help! -- [[users/Jon]]
diff --git a/doc/news/openid/discussion.mdwn b/doc/news/openid/discussion.mdwn
index 3d5e9dc22..aa9f3f0be 100644
--- a/doc/news/openid/discussion.mdwn
+++ b/doc/news/openid/discussion.mdwn
@@ -42,7 +42,7 @@ only Apache/iptables rules for this? Maybe it's related to
> Error: /srv/web/ikiwiki.info/todo/Configurable_minimum_length_of_log_message_for_web_edits/index.html independently created, not overwriting with version from todo/Configurable_minimum_length_of_log_message_for_web_edits
-[[jondowland]]
+[[users/jon]]
----
diff --git a/doc/news/version_2.66.mdwn b/doc/news/version_2.66.mdwn
deleted file mode 100644
index 029c7a1b9..000000000
--- a/doc/news/version_2.66.mdwn
+++ /dev/null
@@ -1,39 +0,0 @@
-ikiwiki 2.66 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
- * recentchanges: Fix redirects to non-page files.
- * aggregate: Avoid uninitialized value warnings for pages with no recorded
- ctime.
- * attachment: Add admin() pagespec to test if the uploading user is a wiki
- admin.
- * git: Fix handling of utf-8 filenames in recentchanges.
- * tag: Make edit link for new tags ensure that the tags are created
- inside tagbase, when it's set.
- * template: Make edit link for new templates ensure the page is located
- under toplevel templates directory.
- * htmlscrubber: Add a config setting that can be used to disable the
- scrubber acting on a set of pages.
- * Expand usage message and add --help. Closes: #[500344](http://bugs.debian.org/500344)
- * Beautify urls used in various places. (smcv)
- * Export pagetitle, titlepage, linkpage.
- * htmltidy: Avoid returning undef if tidy fails. Also avoid returning the
- untidied content if tidy crashes. In either case, it seems best to tidy
- the content to nothing.
- * htmltidy: Avoid spewing tidy errors to stderr.
- * Reorganize index file, add a format version field. Upgrades to the new
- index format should be transparent.
- * Add %wikistate, which is like %pagestate except not specific to a given
- page, and is preserved across rebuilds.
- * editpage: Be more aggressive (and less buggy) about cleaning up
- temporary files rendered during page preview.
- * Add an indexpages option, which causes foo/index.mdwn to be the source
- for page foo when foo.mdwn doesn't exist. Also, when it's enabled,
- creating a new page will save it to foo/index.mdwn by default.
- Closes: #[474611](http://bugs.debian.org/474611)
- (Sponsored by The TOVA Company.)
- * httpauth: Document that ikiwiki.cgi has to be in a directory subject to
- authentication. Closes: #[500524](http://bugs.debian.org/500524)
- * inline: Fix handling of rootpage that doesn't exist.
- * attachment: Support adding attachments to pages even as they are being
- created.
- * remove, rename: Allow acting on attachments as a page is being created.
- * Updated French translation. Closes: #[500929](http://bugs.debian.org/500929)"""]] \ No newline at end of file
diff --git a/doc/news/version_2.67.mdwn b/doc/news/version_2.67.mdwn
deleted file mode 100644
index a0911b58f..000000000
--- a/doc/news/version_2.67.mdwn
+++ /dev/null
@@ -1,17 +0,0 @@
-ikiwiki 2.67 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
- * remove: Avoid $\_ breakage. (Stupid, stupid perl.)
- * Updated Spanish translation from Victor Moral.
- * lockedit: Support specifying which users (and IP addresses) a page
- is locked for. This supports most of the ACL type things users have been
- wanting to be done. Closes: #[443346](http://bugs.debian.org/443346) (It does not control who can read a
- page, but that's out of scope for ikiwiki.)
- * orphans: Fix unquoted page name in regexp.
- * google: Plugin provides google site search, contributed by Peter Simons.
- * Pass HTTPS variable through the wrapper so that CGI-&gt;https can be used
- by plugins. Closes: #[502047](http://bugs.debian.org/502047)
- * inline: Allow MTIME to be used in inlinepage.tmpl.
- * inline: Use the feed's description in the rss and atom links.
- Closes: #[502113](http://bugs.debian.org/502113)
- * aggregate: Avoid bug that caused immediate expiration of items
- with a date in the future."""]] \ No newline at end of file
diff --git a/doc/news/version_2.71.mdwn b/doc/news/version_2.71.mdwn
new file mode 100644
index 000000000..2c8609988
--- /dev/null
+++ b/doc/news/version_2.71.mdwn
@@ -0,0 +1,28 @@
+ikiwiki 2.71 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+ * comments: Blog-style comment support, contributed by Simon McVittie.
+ * htmlbalance: New plugin contributed by Simon McVittie.
+ * Change deb dependencies to list Text::Markdown before markdown (really
+ this time).
+ * Improve escaping of wikilinks and preprocessor directives in content
+ produced by aggregate and recentchanges.
+ * French translation update from Philippe Batailler. Closes: #[506250](http://bugs.debian.org/506250)
+ * Spanish translation update from Victor Moral.
+ * Fix handling of wrappergroup option.
+ * Correct --dumpsetup to include the srcdir in the setup file.
+ * German translation update from Kai Wasserbäch. Closes: #[507056](http://bugs.debian.org/507056)
+ * inline: Support emptyfeeds=no option to skip generating empty feeds.
+ * inline: Support feedfile option to change the filename of the feed
+ generated.
+ * meta: Pass info to htmlscrubber so htmlscrubber\_skip can take effect.
+ * htmlbalance: don't compact whitespace, and set misc other options (smcv)
+ * rename: Fix double-escaping of page name in edit box.
+ * monotone: When getting the log, tell monotone how many entries
+ we want, rather than closing the pipe, which it dislikes. (thm)
+ * Coding style change: Remove explcit vim folding markers.
+ * aggregate: If a feed fails to be downloaded, try again immediatly
+ next time aggregation is run, even if the usual time has not passed.
+ Closes: #[508622](http://bugs.debian.org/508622) (Michael Gold)
+ * meta: Process meta date during scan pass so that the date will always
+ affect sorting in inlines.
+ * Improve display of some openids (smcv)"""]] \ No newline at end of file
diff --git a/doc/news/version_2.72.mdwn b/doc/news/version_2.72.mdwn
new file mode 100644
index 000000000..26274a3c8
--- /dev/null
+++ b/doc/news/version_2.72.mdwn
@@ -0,0 +1,9 @@
+ikiwiki 2.72 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+ * Avoid comments in recentchanges being broken links (smcv)
+ * Add deprecation warning for GlobLists, which will stop working in 3.0.
+ * camelcase: Add camelcase\_ignore setting.
+ * googlecalendar: Add runtime deprecation warning.
+ * comments: Deal with users entering unqualified or partial urls.
+ * inline: Run format hook first, to ensure other format hooks can affect
+ inlined content. Closes: #[509710](http://bugs.debian.org/509710)"""]] \ No newline at end of file
diff --git a/doc/plugins/aggregate.mdwn b/doc/plugins/aggregate.mdwn
index c40a6dc22..6fc87853b 100644
--- a/doc/plugins/aggregate.mdwn
+++ b/doc/plugins/aggregate.mdwn
@@ -9,9 +9,9 @@ New users of aggregate should enable the `aggregateinternal => 1` option in the
.setup file. If you don't do so, you will need to enable the [[html]] plugin
as well as aggregate itself, since feed entries will be stored as HTML.
-The [[meta]] and [[tag]] plugins are also recommended. The
-[[htmltidy]] plugin is suggested, since feeds can easily contain html
-problems, some of which tidy can fix.
+The [[meta]] and [[tag]] plugins are also recommended. Either the
+[[htmltidy]] or [[htmlbalance]] plugin is suggested, since feeds can easily
+contain html problems, some of which these plugins can fix.
You will need to run ikiwiki periodically from a cron job, passing it the
--aggregate parameter, to make it check for new posts. Here's an example
diff --git a/doc/plugins/aggregate/discussion.mdwn b/doc/plugins/aggregate/discussion.mdwn
index 1db6240d5..1a9844577 100644
--- a/doc/plugins/aggregate/discussion.mdwn
+++ b/doc/plugins/aggregate/discussion.mdwn
@@ -35,7 +35,7 @@ Two things aren't working as I'd expect:
> problem. You can see the feed validator complain about it here:
> <http://feedvalidator.org/check.cgi?url=http%3A%2F%2Fwww.davidj.org%2Frss.xml>
>
-> It's sorta unfortunate that [[cpan XML::Feed]] doesn't just assume the
+> It's sorta unfortunate that [[!cpan XML::Feed]] doesn't just assume the
> un-esxaped html is part of the description field. Probably other feed
> parsers are more lenient. --[[Joey]]
diff --git a/doc/plugins/anonok.mdwn b/doc/plugins/anonok.mdwn
index 2a8a922cd..ab2f744e2 100644
--- a/doc/plugins/anonok.mdwn
+++ b/doc/plugins/anonok.mdwn
@@ -5,5 +5,10 @@ By default, anonymous users cannot edit the wiki. This plugin allows
anonymous web users, who have not signed in, to edit any page in the wiki
by default.
-The plugin also has a configuration setting, `anonok_pagespec`. This
+The plugin also has a configuration setting, `anonok_pages`. This
[[PageSpec]] can be used to allow anonymous editing of matching pages.
+
+If you're using the [[comments]] plugin, you can allow anonymous comments
+to be posted by setting:
+
+ anonok_pages => "postcomment(*)"
diff --git a/doc/plugins/calendar/discussion.mdwn b/doc/plugins/calendar/discussion.mdwn
index 148b83522..9d57b7a1e 100644
--- a/doc/plugins/calendar/discussion.mdwn
+++ b/doc/plugins/calendar/discussion.mdwn
@@ -2,3 +2,5 @@ It would be nice if the "month" type calendar could collect all of the
matching pages on a given date in some inline type way. --[[DavidBremner]]
Is it possible to get the calendar to link to pages based not on their timestamp (as I understand that it does now, or have I misunderstood this?) and instead on for example their location in a directory hierarchy. That way the calendar could be used as a planning / timeline device which I think would be great. --[[Alexander]]
+
+I would like the ability to specify relative previous months. This way I could have a sidebar with the last three months by specifying no month, then 'month="-1"' and 'month="-2"'. Negative numbers for the month would otherwise be invalid, so this shouldn't produce any conflicts with expected behavior. (Right?) -- [[StevenBlack]]
diff --git a/doc/plugins/comments.mdwn b/doc/plugins/comments.mdwn
new file mode 100644
index 000000000..72b11af64
--- /dev/null
+++ b/doc/plugins/comments.mdwn
@@ -0,0 +1,43 @@
+[[!template id=plugin name=comments author="[[Simon_McVittie|smcv]]"]]
+[[!tag type/useful]]
+
+This plugin adds "blog-style" comments. Unlike the wiki-style freeform
+Discussion pages, these comments are posted by a simple form, cannot later
+be edited, and rss/atom feeds are provided of each page's comments.
+
+When using this plugin, you should also enable [[htmlscrubber]] and either
+[[htmltidy]] or [[htmlbalance]]. Directives are filtered out by default, to
+avoid commenters slowing down the wiki by causing time-consuming
+processing. As long as the recommended plugins are enabled, comment
+authorship should hopefully be unforgeable by CGI users.
+
+The intention is that on a non-wiki site (like a blog) you can lock all
+pages for admin-only access, then allow otherwise unprivileged (or perhaps
+even anonymous) users to comment on posts. See the documentation of the
+[[lockedit]] and [[anonok]] pages for details on locking down a wiki so
+users can only post comments.
+
+Individual comments are stored as internal-use pages named something like
+`page/comment_1`, `page/comment_2`, etc. These pages internally use a
+`\[[!_comment]]` [[ikiwiki/directive]].
+
+There are some global options for the setup file:
+
+* `comments_pagespec`: [[ikiwiki/PageSpec]] of pages where comments are
+ allowed. The default is not to allow comments on any pages. To allow
+ comments to all posts to a blog, you could use
+ `blog/posts/* and !*/Discussion`.
+* `comments_closed_pagespec`: [[ikiwiki/PageSpec]] of pages where
+ posting of new comments is closed, but any existing comments will still
+ be displayed. Often you will list a set of individual pages here.
+ For example: `blog/controversial or blog/flamewar`
+* `comments_pagename`: if this is e.g. `comment_` (the default), then
+ comment pages will be named something like `page/comment_12`
+* `comments_allowdirectives`: if true (default false), comments may
+ contain IkiWiki [[directives|ikiwiki/directive]]
+* `comments_commit`: if true (default true), comments will be committed to
+ the version control system
+* `comments_allowauthor`: if true (default false), anonymous commenters may
+ specify a name for themselves, and the \[[!meta author]] and
+ \[[!meta authorurl]] directives will not be overridden by the comments
+ plugin
diff --git a/doc/plugins/comments/discussion.mdwn b/doc/plugins/comments/discussion.mdwn
new file mode 100644
index 000000000..2a87a3d93
--- /dev/null
+++ b/doc/plugins/comments/discussion.mdwn
@@ -0,0 +1,163 @@
+## Why internal pages? (unresolved)
+
+Comments are saved as internal pages, so they can never be edited through the CGI,
+only by direct committers.
+
+> So, why do it this way, instead of using regular wiki pages in a
+> namespace, such as `$page/comments/*`? Then you could use [[plugins/lockedit]] to
+> limit editing of comments in more powerful ways. --[[Joey]]
+
+>> Er... I suppose so. I'd assumed that these pages ought to only exist as inlines
+>> rather than as individual pages (same reasoning as aggregated posts), though.
+>>
+>> lockedit is actually somewhat insufficient, since `check_canedit()`
+>> doesn't distinguish between creation and editing; I'd have to continue to use
+>> some sort of odd hack to allow creation but not editing.
+>>
+>> I also can't think of any circumstance where you'd want a user other than
+>> admins (~= git committers) and possibly the commenter (who we can't check for
+>> at the moment anyway, I don't think?) to be able to edit comments - I think
+>> user expectations for something that looks like ordinary blog comments are
+>> likely to include "others can't put words into my mouth".
+>>
+>> My other objection to using a namespace is that I'm not particularly happy about
+>> plugins consuming arbitrary pieces of the wiki namespace - /discussion is bad
+>> enough already. Indeed, this very page would accidentally get matched by rules
+>> aiming to control comment-posting... :-) --[[smcv]]
+
+>>> Thinking about it, perhaps one way to address this would be to have the suffix
+>>> (e.g. whether commenting on Sandbox creates sandbox/comment1 or sandbox/c1 or
+>>> what) be configurable by the wiki admin, in the same way that recentchanges has
+>>> recentchangespage => 'recentchanges'? I'd like to see fewer hard-coded page
+>>> names in general, really - it seems odd to me that shortcuts and smileys
+>>> hard-code the name of the page to look at. Perhaps I could add
+>>> discussionpage => 'discussion' too? --[[smcv]]
+
+>>> (I've now implemented this in my branch. --[[smcv]])
+
+>> The best reason to keep the pages internal seems to me to be that you
+>> don't want the overhead of every comment spawning its own wiki page. --[[Joey]]
+
+## Formats (resolved)
+
+The plugin now allows multiple comment formats while still using internal
+pages; each comment is saved as a page containing one `\[[!comment]]` directive,
+which has a superset of the functionality of [[ikiwiki/directives/format]].
+
+## Access control (unresolved?)
+
+By the way, I think that who can post comments should be controllable by
+the existing plugins opendiscussion, anonok, signinedit, and lockedit. Allowing
+posting comments w/o any login, while a nice capability, can lead to
+spam problems. So, use `check_canedit` as at least a first-level check?
+--[[Joey]]
+
+> This plugin already uses `check_canedit`, but that function doesn't have a concept
+> of different actions. The hack I use is that when a user comments on, say, sandbox,
+> I call `check_canedit` for the pseudo-page "sandbox[postcomment]". The
+> special `postcomment(glob)` [[ikiwiki/pagespec]] returns true if the page ends with
+> "[postcomment]" and the part before (e.g. sandbox) matches the glob. So, you can
+> have postcomment(blog/*) or something. (Perhaps instead of taking a glob, postcomment
+> should take a pagespec, so you can have postcomment(link(tags/commentable))?)
+>
+> This is why `anonok_pages => 'postcomment(*)'` and `locked_pages => '!postcomment(*)'`
+> are necessary to allow anonymous and logged-in editing (respectively).
+>
+>> I changed that to move the flag out of the page name, and into a variable that the `match_postcomment`
+>> function checks for. Other ugliness still applies. :-) --[[Joey]]
+>
+> This is ugly - one alternative would be to add `check_permission()` that takes a
+> page and a verb (create, edit, rename, remove and maybe comment are the ones I
+> can think of so far), use that, and port the plugins you mentioned to use that
+> API too. This plugin could either call `check_can("$page/comment1", 'create')` or
+> call `check_can($page, 'comment')`.
+>
+> One odd effect of the code structure I've used is that we check for the ability to
+> create the page before we actually know what page name we're going to use - when
+> posting the comment I just increment a number until I reach an unused one - so
+> either the code needs restructuring, or the permission check for 'create' would
+> always be for 'comment1' and never 'comment123'. --[[smcv]]
+
+>> Now resolved, in fact --[[smcv]]
+
+> Another possibility is to just check for permission to edit (e.g.) `sandbox/comment1`.
+> However, this makes the "comments can only be created, not edited" feature completely
+> reliant on the fact that internal pages can't be edited. Perhaps there should be a
+> `editable_pages` pagespec, defaulting to `'*'`? --[[smcv]]
+
+## comments directive vs global setting (resolved?)
+
+When comments have been enabled generally, you still need to mark which pages
+can have comments, by including the `\[[!comments]]` directive in them. By default,
+this directive expands to a "post a comment" link plus an `\[[!inline]]` with
+the comments. [This requirement has now been removed --[[smcv]]]
+
+> I don't like this, because it's hard to explain to someone why they have
+> to insert this into every post to their blog. Seems that the model used
+> for discussion pages could work -- if comments are enabled, automatically
+> add the comment posting form and comments to the end of each page.
+> --[[Joey]]
+
+>> I don't think I'd want comments on *every* page (particularly, not the
+>> front page). Perhaps a pagespec in the setup file, where the default is "*"?
+>> Then control freaks like me could use "link(tags/comments)" and tag pages
+>> as allowing comments.
+>>
+>>> Yes, I think a pagespec is the way to go. --[[Joey]]
+
+>>>> Implemented --[[smcv]]
+
+>>
+>> The model used for discussion pages does require patching the existing
+>> page template, which I was trying to avoid - I'm not convinced that having
+>> every possible feature hard-coded there really scales (and obviously it's
+>> rather annoying while this plugin is on a branch). --[[smcv]]
+
+>>> Using the template would allow customising the html around the comments
+>>> which seems like a good thing? --[[Joey]]
+
+>>>> The \[[!comments]] directive is already template-friendly - it expands to
+>>>> the contents of the template `comments_embed.tmpl`, possibly with the
+>>>> result of an \[[!inline]] appended. I should change `comments_embed.tmpl`
+>>>> so it uses a template variable `INLINE` for the inline result rather than
+>>>> having the perl code concatenate it, which would allow a bit more
+>>>> customization (whether the "post" link was before or after the inline).
+>>>> Even if you want comments in page.tmpl, keeping the separate comments_embed.tmpl
+>>>> and having a `COMMENTS` variable in page.tmpl might be the way forward,
+>>>> since the smaller each templates is, the easier it will be for users
+>>>> to maintain a patched set of templates. (I think so, anyway, based on what happens
+>>>> with dpkg prompts in Debian packages with monolithic vs split
+>>>> conffiles.) --[[smcv]]
+
+>>>>> I've switched my branch to use page.tmpl instead; see what you think? --[[smcv]]
+
+## Raw HTML (resolved?)
+
+Raw HTML was not initially allowed by default (this was configurable).
+
+> I'm not sure that raw html should be a problem, as long as the
+> htmlsanitizer and htmlbalanced plugins are enabled. I can see filtering
+> out directives, as a special case. --[[Joey]]
+
+>> Right, if I sanitize each post individually, with htmlscrubber and either htmltidy
+>> or htmlbalance turned on, then there should be no way the user can forge a comment;
+>> I was initially wary of allowing meta directives, but I think those are OK, as long
+>> as the comment template puts the \[[!meta author]] at the *end*. Disallowing
+>> directives is more a way to avoid commenters causing expensive processing than
+>> anything else, at this point.
+>>
+>> I've rebased the plugin on master, made it sanitize individual posts' content
+>> and removed the option to disallow raw HTML. Sanitizing individual posts before
+>> they've been htmlized required me to preserve whitespace in the htmlbalance
+>> plugin, so I did that. Alternatively, we could htmlize immediately and always
+>> save out raw HTML? --[[smcv]]
+
+>>> There might be some use cases for other directives, such as img, in
+>>> comments.
+>>>
+>>> I don't know if meta is "safe" (ie, guaranteed to be inexpensive and not
+>>> allow users to do annoying things) or if it will continue to be in the
+>>> future. Hard to predict really, all that can be said with certainty is
+>>> all directives will contine to be inexpensive and safe enough that it's
+>>> sensible to allow users to (ab)use them on open wikis.
+>>> --[[Joey]]
diff --git a/doc/plugins/contrib/headinganchors.mdwn b/doc/plugins/contrib/headinganchors.mdwn
index ef2fa122a..c80cc0b49 100644
--- a/doc/plugins/contrib/headinganchors.mdwn
+++ b/doc/plugins/contrib/headinganchors.mdwn
@@ -12,9 +12,9 @@ rst and any other format that produces html. The code is available here:
use strict;
use IkiWiki 2.00;
- sub import { #{{{
+ sub import {
hook(type => "sanitize", id => "headinganchors", call => \&headinganchors);
- } # }}}
+ }
sub text_to_anchor {
my $str = shift;
@@ -26,11 +26,11 @@ rst and any other format that produces html. The code is available here:
return $str;
}
- sub headinganchors (@) { #{{{
+ sub headinganchors (@) {
my %params=@_;
my $content=$params{content};
$content=~s{<h([0-9])>([^>]*)</h([0-9])>}{'<h'.$1.' id="'.text_to_anchor($2).'">'.$2.'</h'.$3.'>'}gie;
return $content;
- } # }}}
+ }
1
diff --git a/doc/plugins/contrib/po.mdwn b/doc/plugins/contrib/po.mdwn
index 0fd06cb81..f90ffeed2 100644
--- a/doc/plugins/contrib/po.mdwn
+++ b/doc/plugins/contrib/po.mdwn
@@ -160,3 +160,6 @@ Any thoughts on this?
>>>>> I am able to do myself in this area. --[[intrigeri]]
>>>>>>
>>>>>> I came up with a patch for the WrapI18N issue --[[Joey]]
+
+I've set this plugin development aside for a while. I will be back and
+finish it at some point in the first quarter of 2009. --[[intrigeri]]
diff --git a/doc/plugins/contrib/siterel2pagerel.mdwn b/doc/plugins/contrib/siterel2pagerel.mdwn
index 956b6728f..9b09657bf 100644
--- a/doc/plugins/contrib/siterel2pagerel.mdwn
+++ b/doc/plugins/contrib/siterel2pagerel.mdwn
@@ -13,11 +13,11 @@ other format that produces html. The code is available here:
use strict;
use IkiWiki 2.00;
- sub import { #{{{
+ sub import {
hook(type => "sanitize", id => "siterel2pagerel", call => \&siterel2pagerel);
- } # }}}
+ }
- sub siterel2pagerel (@) { #{{{
+ sub siterel2pagerel (@) {
my %params=@_;
my $baseurl=IkiWiki::baseurl($params{page});
my $content=$params{content};
@@ -25,6 +25,6 @@ other format that produces html. The code is available here:
$content=~s/(<img(?:\s+(?:class|id|width|height)\s*="?\w+"?)*)\s+src=\s*"\/([^"]*)"/$1 src="$baseurl$2"/mig;
# FIXME: do <script and everything else that can have URLs in it
return $content;
- } # }}}
+ }
1
diff --git a/doc/plugins/contrib/unixauth.mdwn b/doc/plugins/contrib/unixauth.mdwn
index d91ed45f1..76a847744 100644
--- a/doc/plugins/contrib/unixauth.mdwn
+++ b/doc/plugins/contrib/unixauth.mdwn
@@ -22,7 +22,7 @@ __Security__: [As with passwordauth](/security/#index14h2), be wary of sending u
--- Wrapper.pm.orig 2008-07-29 00:09:10.000000000 -0400
+++ Wrapper.pm
- @@ -28,7 +28,7 @@ sub gen_wrapper () { #{{{
+ @@ -28,7 +28,7 @@ sub gen_wrapper () {
my @envsave;
push @envsave, qw{REMOTE_ADDR QUERY_STRING REQUEST_METHOD REQUEST_URI
CONTENT_TYPE CONTENT_LENGTH GATEWAY_INTERFACE
@@ -46,16 +46,16 @@ __Security__: [As with passwordauth](/security/#index14h2), be wary of sending u
use strict;
use IkiWiki 2.00;
- sub import { #{{{
+ sub import {
hook(type => "getsetup", id => "unixauth", call => \&getsetup);
hook(type => "formbuilder_setup", id => "unixauth",
call => \&formbuilder_setup);
hook(type => "formbuilder", id => "unixauth",
call => \&formbuilder);
hook(type => "sessioncgi", id => "unixauth", call => \&sessioncgi);
- } # }}}
+ }
- sub getsetup () { #{{{
+ sub getsetup () {
return
unixauth_type => {
type => "string",
@@ -83,10 +83,10 @@ __Security__: [As with passwordauth](/security/#index14h2), be wary of sending u
safe => 0,
rebuild => 1,
},
- } #}}}
+ }
# Checks if a string matches a user's password, and returns true or false.
- sub checkpassword ($$;$) { #{{{
+ sub checkpassword ($$;$) {
my $user=shift;
my $password=shift;
my $field=shift || "password";
@@ -131,9 +131,9 @@ __Security__: [As with passwordauth](/security/#index14h2), be wary of sending u
}
return $ret;
- } #}}}
+ }
- sub formbuilder_setup (@) { #{{{
+ sub formbuilder_setup (@) {
my %params=@_;
my $form=$params{form};
@@ -204,7 +204,7 @@ __Security__: [As with passwordauth](/security/#index14h2), be wary of sending u
}
}
- sub formbuilder (@) { #{{{
+ sub formbuilder (@) {
my %params=@_;
my $form=$params{form};
@@ -225,12 +225,12 @@ __Security__: [As with passwordauth](/security/#index14h2), be wary of sending u
my $user_name=$form->field('name');
}
}
- } #}}}
+ }
- sub sessioncgi ($$) { #{{{
+ sub sessioncgi ($$) {
my $q=shift;
my $session=shift;
- } #}}}
+ }
1
diff --git a/doc/plugins/contrib/unixauth/discussion.mdwn b/doc/plugins/contrib/unixauth/discussion.mdwn
index dfa4fe6cc..232649863 100644
--- a/doc/plugins/contrib/unixauth/discussion.mdwn
+++ b/doc/plugins/contrib/unixauth/discussion.mdwn
@@ -32,3 +32,7 @@ I've added support for [checkpassword](http://cr.yp.to/checkpwd/interface.html),
> to disentangle the two locks. --[[Joey]]
>> Ah, ok, I misunderstood your comment. I'll see what I can figure out. --[[schmonz]]
+
+>>> My time's been limited for this, but I just saw [[todo/avoid_thrashing]]. How does that interact with pwauth or checkpassword? --[[schmonz]]
+
+>>>> The DOS still happens, it just uses less memory. --[[Joey]]
diff --git a/doc/plugins/cutpaste.mdwn b/doc/plugins/cutpaste.mdwn
index 1b78e60fc..f74f8a269 100644
--- a/doc/plugins/cutpaste.mdwn
+++ b/doc/plugins/cutpaste.mdwn
@@ -1,4 +1,4 @@
-[[!template id=plugin name=toggle author="[[Enrico]]"]]
+[[!template id=plugin name=cutpaste author="[[Enrico]]"]]
[[!tag type/chrome]]
This plugin provides the [[ikiwiki/directive/cut]],
diff --git a/doc/plugins/htmlbalance.mdwn b/doc/plugins/htmlbalance.mdwn
new file mode 100644
index 000000000..f4e2298ee
--- /dev/null
+++ b/doc/plugins/htmlbalance.mdwn
@@ -0,0 +1,9 @@
+[[!template id=plugin name=htmlbalance author="[[Simon_McVittie|smcv]]"]]
+[[!tag type/html]]
+
+This plugin ensures that the HTML emitted by ikiwiki contains well-balanced
+HTML tags, by parsing it with [[!cpan HTML::TreeBuilder]] and re-serializing it. This
+acts as a lighter-weight alternative to [[plugins/htmltidy]]; it doesn't
+ensure validity, but it does at least ensure that formatting from a
+blog post pulled in by the [[ikiwiki/directive/inline]] directive doesn't
+leak into the rest of the page.
diff --git a/doc/plugins/htmlbalance/discussion.mdwn b/doc/plugins/htmlbalance/discussion.mdwn
new file mode 100644
index 000000000..c66528a4f
--- /dev/null
+++ b/doc/plugins/htmlbalance/discussion.mdwn
@@ -0,0 +1,10 @@
+Would it be possible to use [[!cpan HTML::Entities]] rather than
+`XML::Atom::Util` for encoding entities? The former is already an ikiwiki
+dependency (via [[!cpan HTML::Parser]]).
+
+> Now switched to HTML::Entities --[[Joey]]
+
+I also wonder if there's any benefit to using this plugin aside from with
+aggregate. Perhaps a small one but aggregate seems like the main case..
+wondering if it would be better to just have aggregate balanace the html
+automatically and do away with the separate plugin. --[[Joey]]
diff --git a/doc/plugins/htmlscrubber.mdwn b/doc/plugins/htmlscrubber.mdwn
index 7db372e1b..b9f7e6d22 100644
--- a/doc/plugins/htmlscrubber.mdwn
+++ b/doc/plugins/htmlscrubber.mdwn
@@ -32,7 +32,7 @@ other HTML-related functionality, such as whether [[meta]] allows
potentially unsafe HTML tags.
The `htmlscrubber_skip` configuration setting can be used to skip scrubbing
-of some pages. Set it to a [[PageSpec]], such as "!*/Discussion", and pages
+of some pages. Set it to a [[ikiwiki/PageSpec]], such as "!*/Discussion", and pages
matching that can have all the evil CSS, JavsScript, and unsafe html
elements you like. One safe way to use this is to use [[lockedit]] to lock
those pages, so only admins can edit them.
diff --git a/doc/plugins/htmltidy.mdwn b/doc/plugins/htmltidy.mdwn
index f675a01ae..580e56f59 100644
--- a/doc/plugins/htmltidy.mdwn
+++ b/doc/plugins/htmltidy.mdwn
@@ -7,4 +7,5 @@ emitted by ikiwiki. Besides being nicely formatted, this helps ensure that
even if users enter suboptimal html, your wiki generates valid html.
Note that since tidy is an external program, that is run each time a page
-is built, this plugin will slow ikiwiki down somewhat.
+is built, this plugin will slow ikiwiki down somewhat. [[plugins/htmlbalance]]
+might provide a faster alternative.
diff --git a/doc/plugins/lockedit.mdwn b/doc/plugins/lockedit.mdwn
index 71bf232ab..d2e98e07a 100644
--- a/doc/plugins/lockedit.mdwn
+++ b/doc/plugins/lockedit.mdwn
@@ -17,6 +17,10 @@ One handy thing to do if you're using ikiwiki for your blog is to lock
posts in your blog, while still letting them comment via the Discussion
pages.
+Alternatively, if you're using the [[comments]] plugin, you can lock
+"!postcomment(*)" to allow users to comment on pages, but not edit anything
+else.
+
Wiki administrators can always edit locked pages. The [[ikiwiki/PageSpec]]
can specify that some pages are not locked for some users. For example,
"important_page and !user(joey)" locks `important_page` while still
diff --git a/doc/plugins/pagecount.mdwn b/doc/plugins/pagecount.mdwn
index 6235963d3..a56027e60 100644
--- a/doc/plugins/pagecount.mdwn
+++ b/doc/plugins/pagecount.mdwn
@@ -6,5 +6,5 @@ This plugin provides the [[ikiwiki/directive/pagecount]]
currently in the wiki.
If it is turned on it can tell us that this wiki includes
-[[!pagecount pages="* and !recentchanges"]]
-pages, of which [[!pagecount pages="*/Discussion"]] are discussion pages.
+[[!pagecount ]] pages, of which
+[[!pagecount pages="*/Discussion"]] are discussion pages.
diff --git a/doc/plugins/write.mdwn b/doc/plugins/write.mdwn
index abcabbdc3..9b5cf27f7 100644
--- a/doc/plugins/write.mdwn
+++ b/doc/plugins/write.mdwn
@@ -55,8 +55,8 @@ plugin, and a "call" parameter, which tells what function to call for the
hook.
An optional "last" parameter, if set to a true value, makes the hook run
-after all other hooks of its type. Useful if the hook depends on some other
-hook being run first.
+after all other hooks of its type, and an optional "first" parameter makes
+it run first. Useful if the hook depends on some other hook being run first.
## Types of hooks
@@ -696,11 +696,15 @@ This can be called when creating a new page, to determine what filename
to save the page to. It's passed a page name, and its type, and returns
the name of the file to create, relative to the srcdir.
-#### `targetpage($$)`
+#### `targetpage($$;$)`
Passed a page and an extension, returns the filename that page will be
rendered to.
+Optionally, a third parameter can be passed, to specify the preferred
+filename of the page. For example, `targetpage("foo", "rss", "feed")`
+will yield something like `foo/feed.rss`.
+
## Miscellaneous
### Internal use pages
diff --git a/doc/plugins/write/discussion.mdwn b/doc/plugins/write/discussion.mdwn
index 9a36d7b0b..24a556ffe 100644
--- a/doc/plugins/write/discussion.mdwn
+++ b/doc/plugins/write/discussion.mdwn
@@ -43,4 +43,4 @@ distributed wiki.
---
-I would find this page clearer split up into sub-pages. Does anyone agree/disagree? -- [[JonDowland]]
+I would find this page clearer split up into sub-pages. Does anyone agree/disagree? -- [[users/Jon]]
diff --git a/doc/rcs/git.mdwn b/doc/rcs/git.mdwn
index 6ba0da894..deddfbd6d 100644
--- a/doc/rcs/git.mdwn
+++ b/doc/rcs/git.mdwn
@@ -124,8 +124,8 @@ ignores the git authorship information, and uses the username of the unix
user who made the commit. Then tests including the `locked_pages` [[PageSpec]]
are checked to see if that user can edit the pages in the commit.
-You can even set up an anonymous user, to allow anyone to push
-changes in via git rather than using the web interface.
+You can even set up an [[anonymous_user|tips/untrusted_git_push]], to allow
+anyone to push changes in via git rather than using the web interface.
## Optionally using a local wiki to preview changes
diff --git a/doc/roadmap.mdwn b/doc/roadmap.mdwn
index 488e2dec8..9ed5742eb 100644
--- a/doc/roadmap.mdwn
+++ b/doc/roadmap.mdwn
@@ -52,7 +52,7 @@ Version 3.0 will be an opportunity to make significant transitions.
It will include a vast number of new features, bugfixes, and other
improvements, far too many to list here.
-Release is planned for fall, 2008.
+Release is planned for fall^Wlate, 2008.
----
diff --git a/doc/sandbox.mdwn b/doc/sandbox.mdwn
index 986b59eac..582d46e84 100644
--- a/doc/sandbox.mdwn
+++ b/doc/sandbox.mdwn
@@ -4,7 +4,7 @@ testing 1..2..3!!
----
-Here's a paragraph. สวัสดี
+Here's a paragraph.
The following code block is pre-formatted:
@@ -78,8 +78,6 @@ The haiku will change after every save, mind you.
* [[foo]]
* WikiLink
-Test
-
-----
This SandBox is also a [[blog]]!
diff --git a/doc/sandbox/Omgwtf_a_blof_post__33____33____33____33____33__1__33__1__33__11111__33____33____33__1__33__1__33____33__1five.html b/doc/sandbox/Omgwtf_a_blof_post__33____33____33____33____33__1__33__1__33__11111__33____33____33__1__33__1__33____33__1five.html
new file mode 100644
index 000000000..fc1757d6e
--- /dev/null
+++ b/doc/sandbox/Omgwtf_a_blof_post__33____33____33____33____33__1__33__1__33__11111__33____33____33__1__33__1__33____33__1five.html
@@ -0,0 +1,31 @@
+<math xmlns="http://www.w3.org/1998/Math/MathML">
+ <mrow>
+ <msup>
+ <mfenced open="(" close=")">
+ <mrow>
+ <mi>a</mi>
+ <mo>+</mo>
+
+ <mi>b</mi>
+ </mrow>
+ </mfenced>
+ <mn>2</mn>
+ </msup>
+ <mo>-</mo>
+ <msub>
+
+ <mfenced open="{" close="}">
+ <mrow>
+ <mi>x</mi>
+ <mo>+</mo>
+ <mi>y</mi>
+ </mrow>
+ </mfenced>
+
+ <mi>i</mi>
+ </msub>
+ </mrow>
+</math>
+<br>
+test <b>test</b><abbr title="test">T.</abbr> <h1>test</h1>
+<a href="https://bugzilla.mozilla.org">øđ</a>
diff --git a/doc/sandbox/castle/discussion/jon_tests_too.mdwn b/doc/sandbox/castle/discussion/jon_tests_too.mdwn
index 864f38c0d..bc051b008 100644
--- a/doc/sandbox/castle/discussion/jon_tests_too.mdwn
+++ b/doc/sandbox/castle/discussion/jon_tests_too.mdwn
@@ -1,3 +1,3 @@
-I recall testing this too, but I'm not sure where the test went. Let's try again. -- [[JonDowland]]
+I recall testing this too, but I'm not sure where the test went. Let's try again. -- [[users/Jon]]
Context: [[todo/discussion_page_as_blog/discussion/castle]]
diff --git a/doc/setup/discussion.mdwn b/doc/setup/discussion.mdwn
index 7d8c525e7..3ec123eb5 100644
--- a/doc/setup/discussion.mdwn
+++ b/doc/setup/discussion.mdwn
@@ -138,3 +138,14 @@ Thanks for your response. You're right. Ubuntu does have ikiwiki, except that it
Anyway, I think I might be able to install it from the tarball I downloaded. I've been reading the discussions, had a look at your screencasts, etc. I will give it another bash. -- [[WillDioneda]]
----
+
+How do I set up cgi editing? In setup I have:
+
+ * cgiurl => 'http://wiki.had.co.nz/edit.cgi'
+ * cgi_wrapper => 'edit.cgi'
+
+But I don't get an edit link on my pages? What am I doing wrong?
+
+> Assuming you don't have the editpage plugin disabled, all you should need
+> to so is re-run `ikiwiki -setup` with the above config and it should
+> rebuild your wiki and add the edit links to pages. --[[Joey]]
diff --git a/doc/style.css b/doc/style.css
index 5787ef65e..81a260afd 100644
--- a/doc/style.css
+++ b/doc/style.css
@@ -12,7 +12,7 @@
display: block;
}
-.author {
+.inlineheader .author {
margin: 0;
font-size: 18px;
font-weight: bold;
@@ -372,3 +372,18 @@ legend {
span.color {
padding: 2px;
}
+
+.comment-header {
+ font-style: italic;
+ margin-top: .3em;
+}
+.comment .author {
+ font-weight: bold;
+}
+.comment-subject {
+ font-weight: bold;
+}
+.comment {
+ border: 1px solid #aaa;
+ padding: 3px;
+}
diff --git a/doc/tips/DreamHost.mdwn b/doc/tips/DreamHost.mdwn
index 6670f8090..070638e3e 100644
--- a/doc/tips/DreamHost.mdwn
+++ b/doc/tips/DreamHost.mdwn
@@ -150,6 +150,8 @@ Next, add your installed Perl module directory to the *libdir* parameter. It sh
libdir => "/home/.server/user/site/perl/lib/perl5/",
# CGI Wrapper
+The CGI wrapper file will be created automatically by "ikiwiki --setup path/to/setup", as long as you have inserted a valid filename to be created into the setup file. On DreamHost, be careful not to put the ikiwiki.cgi file in a directory that has different owner/group than the file itself (such as the main site.domain.tld/ directory): this will cause suexec to fail.
+
The wrapper mode of "06755" doesn't seem to work. "755" appears to. However, this may be completely insecure and/or buggy, so if you know better than I, edit this doc and add it here.
# Pre-created SVN repository
diff --git a/doc/tips/comments_feed.mdwn b/doc/tips/comments_feed.mdwn
new file mode 100644
index 000000000..6f8137256
--- /dev/null
+++ b/doc/tips/comments_feed.mdwn
@@ -0,0 +1,10 @@
+You've enabled the [[plugins/comments]] plugin, so a set of pages on your
+blog can have comments added to them. Pages with comments even have special
+feeds that can be used to subscribe to those comments. But you'd like to
+add a feed that contains all the comments posted to any page. Here's how:
+
+ \[[!inline pages="internal(*/comment_*)" template=comment]]
+
+The special [[ikiwiki/PageSpec]] matches all comments. The
+[[template|wikitemplates]] causes the comments to be displayed formatted
+nicely.
diff --git a/doc/tips/convert_mediawiki_to_ikiwiki/discussion.mdwn b/doc/tips/convert_mediawiki_to_ikiwiki/discussion.mdwn
index 6e5f1668a..15ddccb92 100644
--- a/doc/tips/convert_mediawiki_to_ikiwiki/discussion.mdwn
+++ b/doc/tips/convert_mediawiki_to_ikiwiki/discussion.mdwn
@@ -11,4 +11,602 @@ there are some variations on the approach that might be useful:
Also, some detail on converting mediawiki transclusion to ikiwiki inlines...
--- [[JonDowland]]
+-- [[users/Jon]]
+
+> "Who knows, the remote site might disappear.". Right now, it appears to
+> have done just that. -- [[users/Jon]]
+
+
+The iki-fast-load ruby script from the u32 page is given below:
+
+ #!/usr/bin/env ruby
+
+ # This script is called on the final sorted, de-spammed revision
+ # XML file.
+ #
+ # It doesn't currently check for no-op revisions... I believe
+ # that git-fast-load will dutifully load them even though nothing
+ # happened. I don't care to solve this by adding a file cache
+ # to this script. You can run iki-diff-next.rb to highlight any
+ # empty revisions that need to be removed.
+ #
+ # This turns each node into an equivalent file.
+ # It does not convert spaces to underscores in file names.
+ # This would break wikilinks.
+ # I suppose you could fix this with mod_speling or mod_rewrite.
+ #
+ # It replaces nodes in the Image: namespace with the files themselves.
+
+
+ require 'rubygems'
+ require 'node-callback'
+ require 'time'
+ require 'ostruct'
+
+
+ # pipe is the stream to receive the git-fast-import commands
+ # putfrom is true if this branch has existing commits on it, false if not.
+ def format_git_commit(pipe, f)
+ # Need to escape backslashes and double-quotes for git?
+ # No, git breaks when I do this.
+ # For the filename "path with \\", git sez: bad default revision 'HEAD'
+ # filename = '"' + filename.gsub('\\', '\\\\\\\\').gsub('"', '\\"') + '"'
+
+ # In the calls below, length must be the size in bytes!!
+ # TODO: I haven't figured out how this works in the land of UTF8 and Ruby 1.9.
+ pipe.puts "commit #{f.branch}"
+ pipe.puts "committer #{f.username} <#{f.email}> #{f.timestamp.rfc2822}"
+ pipe.puts "data #{f.message.length}\n#{f.message}\n"
+ pipe.puts "from #{f.branch}^0" if f.putfrom
+ pipe.puts "M 644 inline #{f.filename}"
+ pipe.puts "data #{f.content.length}\n#{f.content}\n"
+ pipe.puts
+ end
+
+
+Mediawiki.pm - A plugin which supports mediawiki format.
+
+ #!/usr/bin/perl
+ # By Scott Bronson. Licensed under the GPLv2+ License.
+ # Extends Ikiwiki to be able to handle Mediawiki markup.
+ #
+ # To use the Mediawiki Plugin:
+ # - Install Text::MediawikiFormat
+ # - Turn of prefix_directives in your setup file.
+ # (TODO: we probably don't need to do this anymore?)
+ # prefix_directives => 1,
+ # - Add this plugin on Ikiwiki's path (perl -V, look for @INC)
+ # cp mediawiki.pm something/IkiWiki/Plugin
+ # - And enable it in your setup file
+ # add_plugins => [qw{mediawiki}],
+ # - Finally, turn off the link plugin in setup (this is important)
+ # disable_plugins => [qw{link}],
+ # - Rebuild everything (actually, this should be automatic right?)
+ # - Now all files with a .mediawiki extension should be rendered properly.
+
+
+ package IkiWiki::Plugin::mediawiki;
+
+ use warnings;
+ use strict;
+ use IkiWiki 2.00;
+ use URI;
+
+
+ # This is a gross hack... We disable the link plugin so that our
+ # linkify routine is always called. Then we call the link plugin
+ # directly for all non-mediawiki pages. Ouch... Hopefully Ikiwiki
+ # will be updated soon to support multiple link plugins.
+ require IkiWiki::Plugin::link;
+
+ # Even if T:MwF is not installed, we can still handle all the linking.
+ # The user will just see Mediawiki markup rather than formatted markup.
+ eval q{use Text::MediawikiFormat ()};
+ my $markup_disabled = $@;
+
+ # Work around a UTF8 bug in Text::MediawikiFormat
+ # http://rt.cpan.org/Public/Bug/Display.html?id=26880
+ unless($markup_disabled) {
+ no strict 'refs';
+ no warnings;
+ *{'Text::MediawikiFormat::uri_escape'} = \&URI::Escape::uri_escape_utf8;
+ }
+
+ my %metaheaders; # keeps track of redirects for pagetemplate.
+ my %tags; # keeps track of tags for pagetemplate.
+
+
+ sub import { #{{{
+ hook(type => "checkconfig", id => "mediawiki", call => \&checkconfig);
+ hook(type => "scan", id => "mediawiki", call => \&scan);
+ hook(type => "linkify", id => "mediawiki", call => \&linkify);
+ hook(type => "htmlize", id => "mediawiki", call => \&htmlize);
+ hook(type => "pagetemplate", id => "mediawiki", call => \&pagetemplate);
+ } # }}}
+
+
+ sub checkconfig
+ {
+ return IkiWiki::Plugin::link::checkconfig(@_);
+ }
+
+
+ my $link_regexp = qr{
+ \[\[(?=[^!]) # beginning of link
+ ([^\n\r\]#|<>]+) # 1: page to link to
+ (?:
+ \# # '#', beginning of anchor
+ ([^|\]]+) # 2: anchor text
+ )? # optional
+
+ (?:
+ \| # followed by '|'
+ ([^\]\|]*) # 3: link text
+ )? # optional
+ \]\] # end of link
+ ([a-zA-Z]*) # optional trailing alphas
+ }x;
+
+
+ # Convert spaces in the passed-in string into underscores.
+ # If passed in undef, returns undef without throwing errors.
+ sub underscorize
+ {
+ my $var = shift;
+ $var =~ tr{ }{_} if $var;
+ return $var;
+ }
+
+
+ # Underscorize, strip leading and trailing space, and scrunch
+ # multiple runs of spaces into one underscore.
+ sub scrunch
+ {
+ my $var = shift;
+ if($var) {
+ $var =~ s/^\s+|\s+$//g; # strip leading and trailing space
+ $var =~ s/\s+/ /g; # squash multiple spaces to one
+ }
+ return $var;
+ }
+
+
+ # Translates Mediawiki paths into Ikiwiki paths.
+ # It needs to be pretty careful because Mediawiki and Ikiwiki handle
+ # relative vs. absolute exactly opposite from each other.
+ sub translate_path
+ {
+ my $page = shift;
+ my $path = scrunch(shift);
+
+ # always start from root unless we're doing relative shenanigans.
+ $page = "/" unless $path =~ /^(?:\/|\.\.)/;
+
+ my @result = ();
+ for(split(/\//, "$page/$path")) {
+ if($_ eq '..') {
+ pop @result;
+ } else {
+ push @result, $_ if $_ ne "";
+ }
+ }
+
+ # temporary hack working around http://ikiwiki.info/bugs/Can__39__t_create_root_page/index.html?updated
+ # put this back the way it was once this bug is fixed upstream.
+ # This is actually a major problem because now Mediawiki pages can't link from /Git/git-svn to /git-svn. And upstream appears to be uninterested in fixing this bug. :(
+ # return "/" . join("/", @result);
+ return join("/", @result);
+ }
+
+
+ # Figures out the human-readable text for a wikilink
+ sub linktext
+ {
+ my($page, $inlink, $anchor, $title, $trailing) = @_;
+ my $link = translate_path($page,$inlink);
+
+ # translate_path always produces an absolute link.
+ # get rid of the leading slash before we display this link.
+ $link =~ s#^/##;
+
+ my $out = "";
+ if($title) {
+ $out = IkiWiki::pagetitle($title);
+ } else {
+ $link = $inlink if $inlink =~ /^\s*\//;
+ $out = $anchor ? "$link#$anchor" : $link;
+ if(defined $title && $title eq "") {
+ # a bare pipe appeared in the link...
+ # user wants to strip namespace and trailing parens.
+ $out =~ s/^[A-Za-z0-9_-]*://;
+ $out =~ s/\s*\(.*\)\s*$//;
+ }
+ # A trailing slash suppresses the leading slash
+ $out =~ s#^/(.*)/$#$1#;
+ }
+ $out .= $trailing if defined $trailing;
+ return $out;
+ }
+
+
+ sub tagpage ($)
+ {
+ my $tag=shift;
+
+ if (exists $config{tagbase} && defined $config{tagbase}) {
+ $tag=$config{tagbase}."/".$tag;
+ }
+
+ return $tag;
+ }
+
+
+ # Pass a URL and optional text associated with it. This call turns
+ # it into fully-formatted HTML the same way Mediawiki would.
+ # Counter is used to number untitled links sequentially on the page.
+ # It should be set to 1 when you start parsing a new page. This call
+ # increments it automatically.
+ sub generate_external_link
+ {
+ my $url = shift;
+ my $text = shift;
+ my $counter = shift;
+
+ # Mediawiki trims off trailing commas.
+ # And apparently it does entity substitution first.
+ # Since we can't, we'll fake it.
+
+ # trim any leading and trailing whitespace
+ $url =~ s/^\s+|\s+$//g;
+
+ # url properly terminates on > but must special-case &gt;
+ my $trailer = "";
+ $url =~ s{(\&(?:gt|lt)\;.*)$}{ $trailer = $1, ''; }eg;
+
+ # Trim some potential trailing chars, put them outside the link.
+ my $tmptrail = "";
+ $url =~ s{([,)]+)$}{ $tmptrail .= $1, ''; }eg;
+ $trailer = $tmptrail . $trailer;
+
+ my $title = $url;
+ if(defined $text) {
+ if($text eq "") {
+ $text = "[$$counter]";
+ $$counter += 1;
+ }
+ $text =~ s/^\s+|\s+$//g;
+ $text =~ s/^\|//;
+ } else {
+ $text = $url;
+ }
+
+ return "<a href='$url' title='$title'>$text</a>$trailer";
+ }
+
+
+ # Called to handle bookmarks like [[#heading]] or <span class="createlink"><a href="http://u32.net/cgi-bin/ikiwiki.cgi?page=%20text%20&amp;from=Mediawiki_Plugin%2Fmediawiki&amp;do=create" rel="nofollow">?</a>#a</span>
+ sub generate_fragment_link
+ {
+ my $url = shift;
+ my $text = shift;
+
+ my $inurl = $url;
+ my $intext = $text;
+ $url = scrunch($url);
+
+ if(defined($text) && $text ne "") {
+ $text = scrunch($text);
+ } else {
+ $text = $url;
+ }
+
+ $url = underscorize($url);
+
+ # For some reason Mediawiki puts blank titles on all its fragment links.
+ # I don't see why we would duplicate that behavior here.
+ return "<a href='$url'>$text</a>";
+ }
+
+
+ sub generate_internal_link
+ {
+ my($page, $inlink, $anchor, $title, $trailing, $proc) = @_;
+
+ # Ikiwiki's link link plugin wrecks this line when displaying on the site.
+ # Until the code highlighter plugin can turn off link finding,
+ # always escape double brackets in double quotes: [[
+ if($inlink eq '..') {
+ # Mediawiki doesn't touch links like [[..#hi|ho]].
+ return "[[" . $inlink . ($anchor?"#$anchor":"") .
+ ($title?"|$title":"") . "]]" . $trailing;
+ }
+
+ my($linkpage, $linktext);
+ if($inlink =~ /^ (:?) \s* Category (\s* \: \s*) ([^\]]*) $/x) {
+ # Handle category links
+ my $sep = $2;
+ $inlink = $3;
+ $linkpage = IkiWiki::linkpage(translate_path($page, $inlink));
+ if($1) {
+ # Produce a link but don't add this page to the given category.
+ $linkpage = tagpage($linkpage);
+ $linktext = ($title ? '' : "Category$sep") .
+ linktext($page, $inlink, $anchor, $title, $trailing);
+ $tags{$page}{$linkpage} = 1;
+ } else {
+ # Add this page to the given category but don't produce a link.
+ $tags{$page}{$linkpage} = 1;
+ &$proc(tagpage($linkpage), $linktext, $anchor);
+ return "";
+ }
+ } else {
+ # It's just a regular link
+ $linkpage = IkiWiki::linkpage(translate_path($page, $inlink));
+ $linktext = linktext($page, $inlink, $anchor, $title, $trailing);
+ }
+
+ return &$proc($linkpage, $linktext, $anchor);
+ }
+
+
+ sub check_redirect
+ {
+ my %params=@_;
+
+ my $page=$params{page};
+ my $destpage=$params{destpage};
+ my $content=$params{content};
+
+ return "" if $page ne $destpage;
+
+ if($content !~ /^ \s* \#REDIRECT \s* \[\[ ( [^\]]+ ) \]\]/x) {
+ # this page isn't a redirect, render it normally.
+ return undef;
+ }
+
+ # The rest of this function is copied from the redir clause
+ # in meta::preprocess and actually handles the redirect.
+
+ my $value = $1;
+ $value =~ s/^\s+|\s+$//g;
+
+ my $safe=0;
+ if ($value !~ /^\w+:\/\//) {
+ # it's a local link
+ my ($redir_page, $redir_anchor) = split /\#/, $value;
+
+ add_depends($page, $redir_page);
+ my $link=bestlink($page, underscorize(translate_path($page,$redir_page)));
+ if (! length $link) {
+ return "<b>Redirect Error:</b> <nowiki>[[$redir_page]] not found.</nowiki>";
+ }
+
+ $value=urlto($link, $page);
+ $value.='#'.$redir_anchor if defined $redir_anchor;
+ $safe=1;
+
+ # redir cycle detection
+ $pagestate{$page}{mediawiki}{redir}=$link;
+ my $at=$page;
+ my %seen;
+ while (exists $pagestate{$at}{mediawiki}{redir}) {
+ if ($seen{$at}) {
+ return "<b>Redirect Error:</b> cycle found on <nowiki>[[$at]]</nowiki>";
+ }
+ $seen{$at}=1;
+ $at=$pagestate{$at}{mediawiki}{redir};
+ }
+ } else {
+ # it's an external link
+ $value = encode_entities($value);
+ }
+
+ my $redir="<meta http-equiv=\"refresh\" content=\"0; URL=$value\" />";
+ $redir=scrub($redir) if !$safe;
+ push @{$metaheaders{$page}}, $redir;
+
+ return "Redirecting to $value ...";
+ }
+
+
+ # Feed this routine a string containing <nowiki>...</nowiki> sections,
+ # this routine calls your callback for every section not within nowikis,
+ # collecting its return values and returning the rewritten string.
+ sub skip_nowiki
+ {
+ my $content = shift;
+ my $proc = shift;
+
+ my $result = "";
+ my $state = 0;
+
+ for(split(/(<nowiki[^>]*>.*?<\/nowiki\s*>)/s, $content)) {
+ $result .= ($state ? $_ : &$proc($_));
+ $state = !$state;
+ }
+
+ return $result;
+ }
+
+
+ # Converts all links in the page, wiki and otherwise.
+ sub linkify (@)
+ {
+ my %params=@_;
+
+ my $page=$params{page};
+ my $destpage=$params{destpage};
+ my $content=$params{content};
+
+ my $file=$pagesources{$page};
+ my $type=pagetype($file);
+ my $counter = 1;
+
+ if($type ne 'mediawiki') {
+ return IkiWiki::Plugin::link::linkify(@_);
+ }
+
+ my $redir = check_redirect(%params);
+ return $redir if defined $redir;
+
+ # this code was copied from MediawikiFormat.pm.
+ # Heavily changed because MF.pm screws up escaping when it does
+ # this awful hack: $uricCheat =~ tr/://d;
+ my $schemas = [qw(http https ftp mailto gopher)];
+ my $re = join "|", map {qr/\Q$_\E/} @$schemas;
+ my $schemes = qr/(?:$re)/;
+ # And this is copied from URI:
+ my $reserved = q(;/?@&=+$,); # NOTE: no colon or [] !
+ my $uric = quotemeta($reserved) . $URI::unreserved . "%#";
+
+ my $result = skip_nowiki($content, sub {
+ $_ = shift;
+
+ # Escape any anchors
+ #s/<(a[\s>\/])/&lt;$1/ig;
+ # Disabled because this appears to screw up the aggregate plugin.
+ # I guess we'll rely on Iki to post-sanitize this sort of stuff.
+
+ # Replace external links, http://blah or [http://blah]
+ s{\b($schemes:[$uric][:$uric]+)|\[($schemes:[$uric][:$uric]+)([^\]]*?)\]}{
+ generate_external_link($1||$2, $3, \$counter)
+ }eg;
+
+ # Handle links that only contain fragments.
+ s{ \[\[ \s* (\#[^|\]'"<>&;]+) (?:\| ([^\]'"<>&;]*))? \]\] }{
+ generate_fragment_link($1, $2)
+ }xeg;
+
+ # Match all internal links
+ s{$link_regexp}{
+ generate_internal_link($page, $1, $2, $3, $4, sub {
+ my($linkpage, $linktext, $anchor) = @_;
+ return htmllink($page, $destpage, $linkpage,
+ linktext => $linktext,
+ anchor => underscorize(scrunch($anchor)));
+ });
+ }eg;
+
+ return $_;
+ });
+
+ return $result;
+ }
+
+
+ # Find all WikiLinks in the page.
+ sub scan (@)
+ {
+ my %params = @_;
+ my $page=$params{page};
+ my $content=$params{content};
+
+ my $file=$pagesources{$page};
+ my $type=pagetype($file);
+
+ if($type ne 'mediawiki') {
+ return IkiWiki::Plugin::link::scan(@_);
+ }
+
+ skip_nowiki($content, sub {
+ $_ = shift;
+ while(/$link_regexp/g) {
+ generate_internal_link($page, $1, '', '', '', sub {
+ my($linkpage, $linktext, $anchor) = @_;
+ push @{$links{$page}}, $linkpage;
+ return undef;
+ });
+ }
+ return '';
+ });
+ }
+
+
+ # Convert the page to HTML.
+ sub htmlize (@)
+ {
+ my %params=@_;
+ my $page = $params{page};
+ my $content = $params{content};
+
+
+ return $content if $markup_disabled;
+
+ # Do a little preprocessing to babysit Text::MediawikiFormat
+ # If a line begins with tabs, T:MwF won't convert it into preformatted blocks.
+ $content =~ s/^\t/ /mg;
+
+ my $ret = Text::MediawikiFormat::format($content, {
+
+ allowed_tags => [#HTML
+ # MediawikiFormat default
+ qw(b big blockquote br caption center cite code dd
+ div dl dt em font h1 h2 h3 h4 h5 h6 hr i li ol p
+ pre rb rp rt ruby s samp small strike strong sub
+ sup table td th tr tt u ul var),
+ # Mediawiki Specific
+ qw(nowiki),
+ # Our additions
+ qw(del ins), # These should have been added all along.
+ qw(span), # Mediawiki allows span but that's rather scary...?
+ qw(a), # this is unfortunate; should handle links after rendering the page.
+ ],
+
+ allowed_attrs => [
+ qw(title align lang dir width height bgcolor),
+ qw(clear), # BR
+ qw(noshade), # HR
+ qw(cite), # BLOCKQUOTE, Q
+ qw(size face color), # FONT
+ # For various lists, mostly deprecated but safe
+ qw(type start value compact),
+ # Tables
+ qw(summary width border frame rules cellspacing
+ cellpadding valign char charoff colgroup col
+ span abbr axis headers scope rowspan colspan),
+ qw(id class name style), # For CSS
+ # Our additions
+ qw(href),
+ ],
+
+ }, {
+ extended => 0,
+ absolute_links => 0,
+ implicit_links => 0
+ });
+
+ return $ret;
+ }
+
+
+ # This is only needed to support the check_redirect call.
+ sub pagetemplate (@)
+ {
+ my %params = @_;
+ my $page = $params{page};
+ my $destpage = $params{destpage};
+ my $template = $params{template};
+
+ # handle metaheaders for redirects
+ if (exists $metaheaders{$page} && $template->query(name => "meta")) {
+ # avoid duplicate meta lines
+ my %seen;
+ $template->param(meta => join("\n", grep { (! $seen{$_}) && ($seen{$_}=1) } @{$metaheaders{$page}}));
+ }
+
+ $template->param(tags => [
+ map {
+ link => htmllink($page, $destpage, tagpage($_), rel => "tag")
+ }, sort keys %{$tags{$page}}
+ ]) if exists $tags{$page} && %{$tags{$page}} && $template->query(name => "tags");
+
+ # It's an rss/atom template. Add any categories.
+ if ($template->query(name => "categories")) {
+ if (exists $tags{$page} && %{$tags{$page}}) {
+ $template->param(categories => [map { category => $_ },
+ sort keys %{$tags{$page}}]);
+ }
+ }
+ }
+
+ 1
diff --git a/doc/tips/inside_dot_ikiwiki.mdwn b/doc/tips/inside_dot_ikiwiki.mdwn
index 1f76ce4bd..b81ffae8d 100644
--- a/doc/tips/inside_dot_ikiwiki.mdwn
+++ b/doc/tips/inside_dot_ikiwiki.mdwn
@@ -66,7 +66,7 @@ to do it rarely, and the data I've wanted has been different each time.
## the session database
-`.ikiwiki/sessions.db` is the session database. See the [[cpan CGI::Session]]
+`.ikiwiki/sessions.db` is the session database. See the [[!cpan CGI::Session]]
documentation for more details.
## lockfiles
diff --git a/doc/tips/inside_dot_ikiwiki/discussion.mdwn b/doc/tips/inside_dot_ikiwiki/discussion.mdwn
index c05e7a3e0..34d5b9252 100644
--- a/doc/tips/inside_dot_ikiwiki/discussion.mdwn
+++ b/doc/tips/inside_dot_ikiwiki/discussion.mdwn
@@ -16,3 +16,50 @@ No idea how this happened. I've blown it away and recreated it but, for future
>>> --getctime does. --[[Joey]]
>> Alas, I seem to have lost the bad index file to periodic /tmp wiping; I'll send it to you if it happens again. --[[sabr]]
+
+<!-- Add by Blanko -->
+
+## Lost password for an user
+
+This morning, a person has lost its password. I was able to do something to make another password. This is the way I take :
+
+> You can certianly do that, but do note that ikiwiki will offer to mail a
+> user a password reset link if they lost their password. --[[Joey]]
+
+### Locate the user database
+
+As tips show us, the user database is in the source file, for an example :
+
+ src/.ikiwiki/userdb
+
+### See which user to modify
+
+Because I don't know the real login of the user, I have to read all the database :
+
+ perl -le 'use Storable; my $index=Storable::retrieve("userdb"); use Data::Dumper; print Dumper $index'
+
+Then I was able to find this :
+
+ 'Utilisateur' => {
+ 'email' => 'user@pl.fr',
+ 'cryptresettoken' => '$2a$10$cfVeOoVbFw9VzMlgEbPMsu34pwHIFP84mWlkrs2RCKknZYPZkPffm',
+ 'password' => '',
+ 'resettoken' => '',
+ 'cryptpassword' => '$2a$10$H8bYq.dlb68wpnfJgVZQhOdsF9JQ06cteRfhPQPB5eHKnD5Y3u7au',
+ 'regdate' => '1226574052'
+ },
+
+Let's have a look to modify lines.
+
+### Modify the line
+
+When you have found the line to modify, take the user name, and change its password to **sc** (for an example) :
+
+ perl -le 'use Storable; my $userinfo=Storable::retrieve("userdb"); $userinfo->{"Utilisateur"}->{cryptpassword}=q{$2a$10$7viOHCrUkdAVL135Kr6one1mpZQ/FWYC773G1yZ0EtQciI11sSDRS}; Storable::lock_nstore($userinfo, "userdb")'
+ perl -le 'use Storable; my $userinfo=Storable::retrieve("userdb"); $userinfo->{"Utilisateur"}->{cryptresettoken}=q{}; Storable::lock_nstore($userinfo, "userdb")'
+
+Because I don't know how suppress cryptresettoken and resettoken fields, I change their content with *null*.
+
+After all these modifications, the user *Utilisateur* could connect to its account with the password **sc**, and go to Preferences, then change its password.
+
+<!-- End of Blanko's modifications -->
diff --git a/doc/tips/nearlyfreespeech.mdwn b/doc/tips/nearlyfreespeech.mdwn
index 6715f0c29..4b3b02eac 100644
--- a/doc/tips/nearlyfreespeech.mdwn
+++ b/doc/tips/nearlyfreespeech.mdwn
@@ -81,7 +81,8 @@ Here is an example of how I set up a wiki:
nano ikiwiki.setup
# Set destdir to /home/htdocs
# Set srcdir to /home/private/wiki
- # Set url to http://yoursite.nfshost.com/ , set cgiurl likewise
+ # Set url to http://yoursite.nfshost.com/
+ # Set cgiurl to http://yoursite.nfshost.com/ikiwiki.cgi
# Uncomment the `rcs => "git"` line.
# Set the cgi_wrapper path to /home/htdocs/ikiwiki.cgi
# Set the git_wrapper path to /home/private/wiki.git/hooks/post-update
diff --git a/doc/tips/untrusted_git_push/discussion.mdwn b/doc/tips/untrusted_git_push/discussion.mdwn
index e85625a1b..d95c01ecf 100644
--- a/doc/tips/untrusted_git_push/discussion.mdwn
+++ b/doc/tips/untrusted_git_push/discussion.mdwn
@@ -24,10 +24,10 @@ Note that the user for the commit is 'jon', and the link points at cgi to
create users/jon. I was wondering if that is configurable for users pushing
via git. It would be nice perhaps to specify it in some way, perhaps via a
git-config setting (user.name?). I'm not too familiar with exactly what the
-changeset contains. -- [[JonDowland]]
+changeset contains. -- [[users/Jon]]
> All ikiwiki can do it look at who git has recorded as the author of
> the change (and it looks at the username part of the email address).
> You can set `user.email` in `.git/config`. --[[Joey]]
-> > Ah, excellent. In which case this *should* DTRT... -- [[JonDowland]]
+> > Ah, excellent. In which case this *should* DTRT... -- [[users/Jon]]
diff --git a/doc/tips/using_the_web_interface_with_a_real_text_editor.mdwn b/doc/tips/using_the_web_interface_with_a_real_text_editor.mdwn
index d696bacdb..cf9327395 100644
--- a/doc/tips/using_the_web_interface_with_a_real_text_editor.mdwn
+++ b/doc/tips/using_the_web_interface_with_a_real_text_editor.mdwn
@@ -4,3 +4,10 @@ you to use a real text editor like Emacs or Vim to edit the contents of text
areas. This allows you to edit ikiwiki pages with a real text editor through
the ikiwiki web interface, rather than only with direct commit
access. --[[JoshTriplett]]
+
+For Firefox or Iceweasel users, the vimperator extension is also a good
+idea. You can press Ctrl-I in the insert mode of vimperator and switch to
+an external editor, e.g. Vim. --[[WeakishJiang]]
+
+Finally, with wikis configured to allow, [[untrusted_git_push]], you can
+ditch the browser altogether. --[[Joey]]
diff --git a/doc/tips/vim_syntax_highlighting/discussion.mdwn b/doc/tips/vim_syntax_highlighting/discussion.mdwn
index 038854b9f..72cb52aab 100644
--- a/doc/tips/vim_syntax_highlighting/discussion.mdwn
+++ b/doc/tips/vim_syntax_highlighting/discussion.mdwn
@@ -1,4 +1,4 @@
-I'm going to look at merging this with potwiki.vim (a vim-based personal wiki) so that you can follow wiki-links and auto-create pages etc., direct from vim. (I'm writing this incase I don't get around to it) -- [[JonDowland]]
+I'm going to look at merging this with potwiki.vim (a vim-based personal wiki) so that you can follow wiki-links and auto-create pages etc., direct from vim. (I'm writing this incase I don't get around to it) -- [[users/Jon]]
----
diff --git a/doc/todo/Add_DATE_parameter_for_use_in_templates.mdwn b/doc/todo/Add_DATE_parameter_for_use_in_templates.mdwn
index c908f57c8..8ecdf36d0 100644
--- a/doc/todo/Add_DATE_parameter_for_use_in_templates.mdwn
+++ b/doc/todo/Add_DATE_parameter_for_use_in_templates.mdwn
@@ -44,7 +44,7 @@ regenerate this one against that).
%config %links %renderedfiles %pagesources %destsources);
our $VERSION = 2.00; # plugin interface version, next is ikiwiki version
our $version="2.1";my $installdir="/usr";
- @@ -70,6 +70,7 @@ sub defaultconfig () { #{{{
+ @@ -70,6 +70,7 @@ sub defaultconfig () {
plugin => [qw{mdwn inline htmlscrubber passwordauth openid signinedit
lockedit conditional}],
timeformat => '%c',
@@ -52,27 +52,27 @@ regenerate this one against that).
locale => undef,
sslcookie => 0,
httpauth => 0,
- @@ -447,6 +448,15 @@ sub displaytime ($) { #{{{
+ @@ -447,6 +448,15 @@ sub displaytime ($) {
$config{timeformat}, localtime($time)));
- } #}}}
+ }
- +sub displaydate ($) { #{{{
+ +sub displaydate ($) {
+ my $time=shift;
+
+ # strftime doesn't know about encodings, so make sure
+ # its output is properly treated as utf8
+ return decode_utf8(POSIX::strftime(
+ $config{dateformat}, localtime($time)));
- +} #}}}
+ +}
+
- sub beautify_url ($) { #{{{
+ sub beautify_url ($) {
my $url=shift;
diff --git a/Plugin/inline.pm b/Plugin/inline.pm
index 8f6ab51..7bd6147 100644
--- a/Plugin/inline.pm
+++ b/Plugin/inline.pm
- @@ -148,6 +148,7 @@ sub preprocess_inline (@) { #{{{
+ @@ -148,6 +148,7 @@ sub preprocess_inline (@) {
$template->param(pageurl => urlto(bestlink($params{page}, $page), $params{destpage}));
$template->param(title => pagetitle(basename($page)));
$template->param(ctime => displaytime($pagectime{$page}));
diff --git a/doc/todo/Add_camelcase_exclusions.mdwn b/doc/todo/Add_camelcase_exclusions.mdwn
new file mode 100644
index 000000000..6b86132a0
--- /dev/null
+++ b/doc/todo/Add_camelcase_exclusions.mdwn
@@ -0,0 +1,23 @@
+Camelcase currently looks for any and call camelcase words and turns them into wiki links. This patch adds a config item called <code>camelcase_ignore</code> which is an array of camelcase words to ignore.
+
+<pre>
+--- /usr/share/perl5/IkiWiki/Plugin/camelcase.pm.orig 2008-12-24 11:49:14.000000000 +1300
++++ /usr/share/perl5/IkiWiki/Plugin/camelcase.pm 2008-12-24 12:02:21.000000000 +1300
+@@ -33,7 +33,11 @@
+ my $destpage=$params{destpage};
+
+ $params{content}=~s{$link_regexp}{
+- htmllink($page, $destpage, IkiWiki::linkpage($1))
++ if (grep {/$1/} @{ $config{'camelcase_ignore'} }) {
++ $1
++ } else {
++ htmllink($page, $destpage, IkiWiki::linkpage($1))
++ }
+ }eg;
+
+ return $params{content};
+</pre>
+
+--[[puck]]
+
+[[done]]
diff --git a/doc/todo/Add_support_for_latest_Text::Markdown_as_found_on_CPAN.mdwn b/doc/todo/Add_support_for_latest_Text::Markdown_as_found_on_CPAN.mdwn
index 222cd8c46..6b9fa0535 100644
--- a/doc/todo/Add_support_for_latest_Text::Markdown_as_found_on_CPAN.mdwn
+++ b/doc/todo/Add_support_for_latest_Text::Markdown_as_found_on_CPAN.mdwn
@@ -12,7 +12,7 @@ This patch allows IkiWiki to work with either of the two:
--- IkiWiki/Plugin/mdwn.pm.orig 2008-03-08 11:33:50.000000000 +0100
+++ IkiWiki/Plugin/mdwn.pm 2008-03-08 13:37:21.000000000 +0100
- @@ -28,14 +28,20 @@ sub htmlize (@) { #{{{
+ @@ -28,14 +28,20 @@ sub htmlize (@) {
$markdown_sub=\&Markdown::Markdown;
}
else {
diff --git a/doc/todo/Allow_change_of_wiki_file_types.mdwn b/doc/todo/Allow_change_of_wiki_file_types.mdwn
index 8a398f2e0..19574b175 100644
--- a/doc/todo/Allow_change_of_wiki_file_types.mdwn
+++ b/doc/todo/Allow_change_of_wiki_file_types.mdwn
@@ -12,7 +12,7 @@ I was hoping that the [[plugins/rename]] plugin would allow web uses to change t
index 527ee88..123b772 100644
--- a/IkiWiki/Plugin/rename.pm
+++ b/IkiWiki/Plugin/rename.pm
- @@ -43,7 +43,7 @@ sub check_canrename ($$$$$$$) { #{{{
+ @@ -43,7 +43,7 @@ sub check_canrename ($$$$$$$) {
# Dest checks can be omitted by passing undef.
if (defined $dest) {
@@ -21,7 +21,7 @@ I was hoping that the [[plugins/rename]] plugin would allow web uses to change t
error(gettext("no change to the file name was specified"));
}
- @@ -54,7 +54,7 @@ sub check_canrename ($$$$$$$) { #{{{
+ @@ -54,7 +54,7 @@ sub check_canrename ($$$$$$$) {
}
# Must not be a known source file.
@@ -30,7 +30,7 @@ I was hoping that the [[plugins/rename]] plugin would allow web uses to change t
error(sprintf(gettext("%s already exists"),
htmllink("", "", $dest, noimageinline => 1)));
}
- @@ -97,6 +97,24 @@ sub rename_form ($$$) { #{{{
+ @@ -97,6 +97,24 @@ sub rename_form ($$$) {
$f->field(name => "do", type => "hidden", value => "rename", force => 1);
$f->field(name => "page", type => "hidden", value => $page, force => 1);
$f->field(name => "new_name", value => IkiWiki::pagetitle($page), size => 60);
@@ -55,7 +55,7 @@ I was hoping that the [[plugins/rename]] plugin would allow web uses to change t
$f->field(name => "attachment", type => "hidden");
return $f, ["Rename", "Cancel"];
- @@ -223,12 +241,19 @@ sub sessioncgi ($$) { #{{{
+ @@ -223,12 +241,19 @@ sub sessioncgi ($$) {
my $dest=IkiWiki::possibly_foolish_untaint(IkiWiki::titlepage($q->param("new_name")));
# The extension of dest is the same as src if it's
diff --git a/doc/todo/Allow_disabling_edit_and_preferences_links.mdwn b/doc/todo/Allow_disabling_edit_and_preferences_links.mdwn
new file mode 100644
index 000000000..1188d1ab2
--- /dev/null
+++ b/doc/todo/Allow_disabling_edit_and_preferences_links.mdwn
@@ -0,0 +1,48 @@
+This patch allows disabling the edit and preferences link in the config file. It is backwards compatible (so peoples edit and preferences links won't suddenly vanish).
+
+To disable edit or prefs respectively, add the following to the config file:
+
+<pre>
+ 'edit' => 0,
+ 'prefs' => 0,
+</pre>
+
+Patch:
+<pre>
+--- /usr/share/perl5/IkiWiki/Render.pm.orig 2008-12-23 16:49:00.000000000 +1300
++++ /usr/share/perl5/IkiWiki/Render.pm 2008-12-23 16:55:40.000000000 +1300
+@@ -80,8 +80,10 @@
+ my $actions=0;
+
+ if (length $config{cgiurl}) {
+- $template->param(editurl => cgiurl(do => "edit", page => $page));
+- $template->param(prefsurl => cgiurl(do => "prefs"));
++ $template->param(editurl => cgiurl(do => "edit", page => $page))
++ if ! defined $config{edit} || (defined $config{edit} && $config{edit} == 1);
++ $template->param(prefsurl => cgiurl(do => "prefs"))
++ if ! defined $config{prefs} || (defined $config{prefs} && $config{prefs} == 1);
+ $actions++;
+ }
+
+</pre>
+
+> On irc, you said, "That was to allow the hack to of using wikistatedir to
+> allow me to generate two websites, one with inline editting, the other a
+> static page for public consumption."
+>
+> The edit and preferences links can already be disabled by editing
+> `page.tmpl`. (Look for PREFSURL and EDITURL).
+>
+> More to the point though, disabling those links does not disable anyone
+> consticting the urls by hand and logging in and editing a page. So you'd
+> really want to disable the editpage plugin in the setup file for the
+> public, static wiki. Sounds like you might also want to turn off cgi
+> entirely for that build. --[[Joey]]
+
+>> I want to retain the same page.tmpl for both sites (different templates
+>> will just increase the maintenance hell), so disabling the links in the
+>> config for one public site works better in my case.
+>>
+>> I do have the editpage plugin disabled for the public static wiki, but
+>> the link still appears on the site. I want to keep the cgi on, so that
+>> the site is still searchable. --[[puck]]
diff --git a/doc/todo/Allow_edittemplate_to_set_file_type.mdwn b/doc/todo/Allow_edittemplate_to_set_file_type.mdwn
index b49968c18..1b99a4e05 100644
--- a/doc/todo/Allow_edittemplate_to_set_file_type.mdwn
+++ b/doc/todo/Allow_edittemplate_to_set_file_type.mdwn
@@ -14,7 +14,7 @@ edittemplate there. --[[Joey]]
index 98308de..c381940 100644
--- a/IkiWiki/Plugin/edittemplate.pm
+++ b/IkiWiki/Plugin/edittemplate.pm
- @@ -56,8 +56,14 @@ sub preprocess (@) { #{{{
+ @@ -56,8 +56,14 @@ sub preprocess (@) {
$pagestate{$params{page}}{edittemplate}{$params{match}}=$params{template};
@@ -28,10 +28,10 @@ edittemplate there. --[[Joey]]
+
+ return sprintf(gettext("edittemplate: %s registered for %s"),
+ $linkHTML, $params{match});
- } # }}}
+ }
- sub formbuilder (@) { #{{{
- @@ -89,6 +95,9 @@ sub formbuilder (@) { #{{{
+ sub formbuilder (@) {
+ @@ -89,6 +95,9 @@ sub formbuilder (@) {
if (pagespec_match($p, $pagespec, location => $registering_page)) {
$form->field(name => "editcontent",
value => filltemplate($pagestate{$registering_page}{edittemplate}{$pagespec}, $page));
diff --git a/doc/todo/Bestdir_along_with_bestlink_in_IkiWiki.pm.mdwn b/doc/todo/Bestdir_along_with_bestlink_in_IkiWiki.pm.mdwn
index 73157a326..95c38f794 100644
--- a/doc/todo/Bestdir_along_with_bestlink_in_IkiWiki.pm.mdwn
+++ b/doc/todo/Bestdir_along_with_bestlink_in_IkiWiki.pm.mdwn
@@ -8,9 +8,9 @@ This patch adds function bestdir() which returns best directory from the directo
+++ IkiWiki.pm (working copy)
@@ -391,6 +391,35 @@
return "";
- } #}}}
+ }
- +sub bestdir ($$) { #{{{
+ +sub bestdir ($$) {
+ my $page=shift;
+ my $link=shift;
+ my $cwd=$page;
@@ -37,9 +37,9 @@ This patch adds function bestdir() which returns best directory from the directo
+ }
+
+ return "";
- +} #}}}
+ +}
+
- sub isinlinableimage ($) { #{{{
+ sub isinlinableimage ($) {
my $file=shift;
----
diff --git a/doc/todo/Default_text_for_new_pages.mdwn b/doc/todo/Default_text_for_new_pages.mdwn
index 4a17bbf8b..a904f8287 100644
--- a/doc/todo/Default_text_for_new_pages.mdwn
+++ b/doc/todo/Default_text_for_new_pages.mdwn
@@ -15,7 +15,7 @@ Inline below is a [[patch]] that implements this:
index bb21ed2..10c985c 100644
--- a/IkiWiki/Plugin/editpage.pm
+++ b/IkiWiki/Plugin/editpage.pm
- @@ -60,7 +60,7 @@ sub cgi_editpage ($$) { #{{{
+ @@ -60,7 +60,7 @@ sub cgi_editpage ($$) {
decode_cgi_utf8($q);
@@ -24,7 +24,7 @@ Inline below is a [[patch]] that implements this:
my @buttons=("Save Page", "Preview", "Cancel");
eval q{use CGI::FormBuilder};
error($@) if $@;
- @@ -117,9 +117,20 @@ sub cgi_editpage ($$) { #{{{
+ @@ -117,9 +117,20 @@ sub cgi_editpage ($$) {
}
else {
$type=$form->param('type');
@@ -45,7 +45,7 @@ Inline below is a [[patch]] that implements this:
elsif (defined $from && exists $pagesources{$from}) {
# favor the type of linking page
$type=pagetype($pagesources{$from});
- @@ -129,7 +140,7 @@ sub cgi_editpage ($$) { #{{{
+ @@ -129,7 +140,7 @@ sub cgi_editpage ($$) {
if (! $form->submitted) {
$form->field(name => "rcsinfo", value => "", force => 1);
}
@@ -58,7 +58,7 @@ Inline below is a [[patch]] that implements this:
index 8efef3f..075d7d8 100644
--- a/IkiWiki/Plugin/inline.pm
+++ b/IkiWiki/Plugin/inline.pm
- @@ -271,6 +271,7 @@ sub preprocess_inline (@) { #{{{
+ @@ -271,6 +271,7 @@ sub preprocess_inline (@) {
$rootpage=$params{page};
}
$formtemplate->param(rootpage => $rootpage);
diff --git a/doc/todo/Give_access_to_more_TMPL__95__VAR_variables_in_templates_inserted_by_the_template_plugin.mdwn b/doc/todo/Give_access_to_more_TMPL__95__VAR_variables_in_templates_inserted_by_the_template_plugin.mdwn
index a644e236b..c71250b3a 100644
--- a/doc/todo/Give_access_to_more_TMPL__95__VAR_variables_in_templates_inserted_by_the_template_plugin.mdwn
+++ b/doc/todo/Give_access_to_more_TMPL__95__VAR_variables_in_templates_inserted_by_the_template_plugin.mdwn
@@ -94,7 +94,7 @@ most possible of these pages.
> index a6e34fc..bb9dd8d 100644
> --- a/IkiWiki/Plugin/template.pm
> +++ b/IkiWiki/Plugin/template.pm
-> @@ -57,6 +57,8 @@ sub preprocess (@) { #{{{
+> @@ -57,6 +57,8 @@ sub preprocess (@) {
> }
> }
>
diff --git a/doc/todo/Improve_display_of_OpenIDs.mdwn b/doc/todo/Improve_display_of_OpenIDs.mdwn
new file mode 100644
index 000000000..e2ba1d90d
--- /dev/null
+++ b/doc/todo/Improve_display_of_OpenIDs.mdwn
@@ -0,0 +1,5 @@
+Some OpenIDs seen in the IkiWiki git history are displayed poorly in [[RecentChanges]], including mine :-) (`http://smcv.pseudorandom.co.uk/`, shown as `smcv.pseudorandom [co.uk]`)
+
+My `openid` branch on <http://git.pseudorandom.co.uk/> improves on a couple of cases and adds a regression test. --[[smcv]]
+
+[[!tag patch done]]
diff --git a/doc/todo/Inline_plugin_option_to_show_full_page_path.mdwn b/doc/todo/Inline_plugin_option_to_show_full_page_path.mdwn
index 9f52a724a..691694009 100644
--- a/doc/todo/Inline_plugin_option_to_show_full_page_path.mdwn
+++ b/doc/todo/Inline_plugin_option_to_show_full_page_path.mdwn
@@ -19,7 +19,7 @@ Cheers,
index 59eabb6..82913ba 100644
--- a/IkiWiki/Plugin/inline.pm
+++ b/IkiWiki/Plugin/inline.pm
- @@ -229,6 +229,7 @@ sub preprocess_inline (@) { #{{{
+ @@ -229,6 +229,7 @@ sub preprocess_inline (@) {
$template->param(content => $content);
}
$template->param(pageurl => urlto(bestlink($params{page}, $page), $params{destpage}));
diff --git a/doc/todo/Move_teximg_latex_preamble_to_config_file.mdwn b/doc/todo/Move_teximg_latex_preamble_to_config_file.mdwn
index d94d24ee4..3cedd5ae3 100644
--- a/doc/todo/Move_teximg_latex_preamble_to_config_file.mdwn
+++ b/doc/todo/Move_teximg_latex_preamble_to_config_file.mdwn
@@ -71,10 +71,10 @@ Happy TeXing.
+
+my $default_postfix = '\\end{document}';
+
- sub import { #{{{
+ sub import {
hook(type => "getsetup", id => "teximg", call => \&getsetup);
hook(type => "preprocess", id => "teximg", call => \&preprocess);
- @@ -21,6 +33,26 @@ sub getsetup () { #{{{
+ @@ -21,6 +33,26 @@ sub getsetup () {
safe => 1,
rebuild => undef,
},
@@ -98,10 +98,10 @@ Happy TeXing.
+ safe => 0, # Not sure how secure LaTeX is...
+ rebuild => 1,
+ },
- } #}}}
+ }
- sub preprocess (@) { #{{{
- @@ -105,25 +137,35 @@ sub gen_image ($$$$) { #{{{
+ sub preprocess (@) {
+ @@ -105,25 +137,35 @@ sub gen_image ($$$$) {
my $digest = shift;
my $imagedir = shift;
diff --git a/doc/todo/Set_arbitrary_date_to_be_used_by_calendar_plugin.mdwn b/doc/todo/Set_arbitrary_date_to_be_used_by_calendar_plugin.mdwn
index a26433919..89167c084 100644
--- a/doc/todo/Set_arbitrary_date_to_be_used_by_calendar_plugin.mdwn
+++ b/doc/todo/Set_arbitrary_date_to_be_used_by_calendar_plugin.mdwn
@@ -42,13 +42,13 @@ Longer term plans:
my %cache;
my %linkcache;
@@ -32,6 +34,7 @@
- sub import { #{{{
+ sub import {
hook(type => "needsbuild", id => "version", call => \&needsbuild);
hook(type => "preprocess", id => "calendar", call => \&preprocess);
+ hook(type => "preprocess", id => "event", call => \&preprocess_event);
- } #}}}
+ }
- sub is_leap_year (@) { #{{{
+ sub is_leap_year (@) {
@@ -58,6 +61,7 @@
my $nmonth = $params{nmonth};
my $pyear = $params{pyear};
@@ -137,9 +137,9 @@ Longer term plans:
# finish off the week
@@ -304,6 +333,18 @@
return $calendar;
- } #}}}
+ }
- +sub preprocess_event (@) { #{{{
+ +sub preprocess_event (@) {
+ my %params=@_;
+ # if now time is given, use now
+ $params{begin} = localtime($time) unless defined $params{begin};
@@ -151,7 +151,7 @@ Longer term plans:
+ return "<!-- $params{begin} -->";
+} #}}
+
- sub preprocess (@) { #{{{
+ sub preprocess (@) {
my %params=@_;
$params{pages} = "*" unless defined $params{pages};
@@ -311,6 +352,8 @@
diff --git a/doc/todo/Silence_monotone_warning.mdwn b/doc/todo/Silence_monotone_warning.mdwn
index e3f0224c2..d875900c5 100644
--- a/doc/todo/Silence_monotone_warning.mdwn
+++ b/doc/todo/Silence_monotone_warning.mdwn
@@ -4,7 +4,7 @@ A quick [[patch]] to silence a [[rcs/monotone]] warning I started seeing:
index 4b9be31..9d4e280 100644
--- a/IkiWiki/Plugin/monotone.pm
+++ b/IkiWiki/Plugin/monotone.pm
- @@ -55,7 +55,7 @@ sub checkconfig () { #{{{
+ @@ -55,7 +55,7 @@ sub checkconfig () {
error("Monotone version too old, is $version but required 0.38");
}
diff --git a/doc/todo/Support_wildcard_inside_of_link__40____41___within_a_pagespec.mdwn b/doc/todo/Support_wildcard_inside_of_link__40____41___within_a_pagespec.mdwn
index 2837634d9..8320f72a6 100644
--- a/doc/todo/Support_wildcard_inside_of_link__40____41___within_a_pagespec.mdwn
+++ b/doc/todo/Support_wildcard_inside_of_link__40____41___within_a_pagespec.mdwn
@@ -20,7 +20,7 @@ That doesn't work in ikiwiki 2.1, but I have it
index 38aa46a..cd42e8d 100644
--- a/IkiWiki.pm
+++ b/IkiWiki.pm
- @@ -1082,10 +1082,15 @@ sub match_link ($$;@) { #{{{
+ @@ -1082,10 +1082,15 @@ sub match_link ($$;@) {
my $links = $IkiWiki::links{$page} or return undef;
return IkiWiki::FailReason->new("$page has no links") unless @$links;
my $bestlink = IkiWiki::bestlink($from, $link);
@@ -38,7 +38,7 @@ That doesn't work in ikiwiki 2.1, but I have it
+ }
}
return IkiWiki::FailReason->new("$page does not link to $link");
- } #}}}
+ }
--
1.5.1.1.g6aead
diff --git a/doc/todo/Wrapper_config_with_multiline_regexp.mdwn b/doc/todo/Wrapper_config_with_multiline_regexp.mdwn
index c0311bc92..7b4323de1 100644
--- a/doc/todo/Wrapper_config_with_multiline_regexp.mdwn
+++ b/doc/todo/Wrapper_config_with_multiline_regexp.mdwn
@@ -13,12 +13,12 @@ Second, the untainting of $configstring should allow newlines.
+++ wiki-meta/perl/IkiWiki.pm Mon Jun 11 10:52:07 2007
@@ -205,7 +205,7 @@
- sub possibly_foolish_untaint ($) { #{{{
+ sub possibly_foolish_untaint ($) {
my $tainted=shift;
- my ($untainted)=$tainted=~/(.*)/;
+ my ($untainted)=$tainted=~/(.*)/s;
return $untainted;
- } #}}}
+ }
Modified: wiki-meta/perl/IkiWiki/Wrapper.pm
diff --git a/doc/todo/add_forward_age_sorting_option_to_inline.mdwn b/doc/todo/add_forward_age_sorting_option_to_inline.mdwn
index 684419f90..e91c5a42f 100644
--- a/doc/todo/add_forward_age_sorting_option_to_inline.mdwn
+++ b/doc/todo/add_forward_age_sorting_option_to_inline.mdwn
@@ -19,7 +19,7 @@ diff --git a/IkiWiki/Plugin/inline.pm b/IkiWiki/Plugin/inline.pm
index d2e5832..9e52712 100644
--- a/IkiWiki/Plugin/inline.pm
+++ b/IkiWiki/Plugin/inline.pm
-@@ -194,6 +194,9 @@ sub preprocess_inline (@) { #{{{
+@@ -194,6 +194,9 @@ sub preprocess_inline (@) {
elsif (! exists $params{sort} || $params{sort} eq 'age') {
@list=sort { $pagectime{$b} <=> $pagectime{$a} } @list;
}
diff --git a/doc/todo/apache_404_ErrorDocument_handler.mdwn b/doc/todo/apache_404_ErrorDocument_handler.mdwn
new file mode 100644
index 000000000..b200ff3b2
--- /dev/null
+++ b/doc/todo/apache_404_ErrorDocument_handler.mdwn
@@ -0,0 +1,18 @@
+Apache's ErrorDocument directive lets you write a CGI script that will be invoked for all 404s.
+IkiWiki could offer one as an optional wrapper; it would do much the same thing that the
+existing recentchanges_link (or [[generic___39__do__61__goto__39___for_CGI]]) does when
+encountering a nonexistent page.
+
+I think it'd probably have to be a separate CGI script because the environment with which
+404 handlers are invoked is somewhat odd, and because it needs to return a 404 status
+(having said that, it might make sense for `recentchanges_link` to return 404 rather than
+200 anyway if the page doesn't exist).
+
+This would give IkiWiki the behaviour of many other wikis, where visiting a page that
+does not yet exist prompts you to create it, without having to invoke the CGI for
+successful requests.
+
+Due to [a well-known MSIE misfeature](http://support.microsoft.com/default.aspx?scid=kb;en-us;Q294807),
+error output needs to be at least 512 bytes long, so some padding might also be required.
+
+I'm happy to write such a script if there is interest. --[[smcv]]
diff --git a/doc/todo/automatic_use_of_syntax_plugin_on_source_code_files/discussion.mdwn b/doc/todo/automatic_use_of_syntax_plugin_on_source_code_files/discussion.mdwn
index 467ec350e..dc6c0001e 100644
--- a/doc/todo/automatic_use_of_syntax_plugin_on_source_code_files/discussion.mdwn
+++ b/doc/todo/automatic_use_of_syntax_plugin_on_source_code_files/discussion.mdwn
@@ -17,13 +17,13 @@ Updated to use fix noted in [[bugs/multiple_pages_with_same_name]].
my %metaheaders;
- sub import { #{{{
+ sub import {
hook(type => "getsetup", id => "sourcecode", call => \&getsetup);
hook(type => "checkconfig", id => "sourcecode", call => \&checkconfig);
hook(type => "pagetemplate", id => "sourcecode", call => \&pagetemplate);
- } # }}}
+ }
- sub getsetup () { #{{{
+ sub getsetup () {
return
plugin => {
safe => 1,
@@ -57,9 +57,9 @@ Updated to use fix noted in [[bugs/multiple_pages_with_same_name]].
safe => 1,
rebuild => 1,
},
- } #}}}
+ }
- sub checkconfig () { #{{{
+ sub checkconfig () {
if (! $config{sourcecode_lang}) {
error("The sourcecode plugin requires a list of suffixes in the 'sourcecode_lang' config option");
}
@@ -97,9 +97,9 @@ Updated to use fix noted in [[bugs/multiple_pages_with_same_name]].
error("Your installation of source-highlight cannot handle sourcecode language $lang!");
}
}
- } #}}}
+ }
- sub htmlize (@) { #{{{
+ sub htmlize (@) {
my %params=@_;
my $page = $params{page};
@@ -141,9 +141,9 @@ Updated to use fix noted in [[bugs/multiple_pages_with_same_name]].
}
return '<div id="sourcecode">'."\r\n".join("\r\n",@html)."\r\n</div>\n";
- } # }}}
+ }
- sub pagetemplate (@) { #{{{
+ sub pagetemplate (@) {
my %params=@_;
my $page=$params{page};
@@ -154,6 +154,6 @@ Updated to use fix noted in [[bugs/multiple_pages_with_same_name]].
my %seen;
$template->param(meta => join("\n", grep { (! $seen{$_}) && ($seen{$_}=1) } @{$metaheaders{$page}}));
}
- } # }}}
+ }
1
diff --git a/doc/todo/blogpost_plugin.mdwn b/doc/todo/blogpost_plugin.mdwn
index 60b1e2515..bb91ffd02 100644
--- a/doc/todo/blogpost_plugin.mdwn
+++ b/doc/todo/blogpost_plugin.mdwn
@@ -51,13 +51,13 @@ Index: IkiWiki/Plugin/blogpost.pm
+use POSIX;
+use IkiWiki 2.00;
+
-+sub import { #{{{
++sub import {
+ hook(type => "checkconfig", id => "blogpost", call => \&checkconfig);
+ hook(type => "authcgi", id => "blogpost", call => \&authcgi);
+ hook(type => "canedit", id => "blogpost", call => \&canedit);
-+} # }}}
++}
+
-+sub checkconfig () { #{{{
++sub checkconfig () {
+ if (! defined $config{blogformat}){
+ $config{blogformat} = 'posts/%Y/%m/%d/$title';
+ }
@@ -72,9 +72,9 @@ Index: IkiWiki/Plugin/blogpost.pm
+ if (! defined $config{blogusers}) {
+ $config{blogusers} = (); # disallow all posting by default
+ }
-+} #}}}
++}
+
-+sub authcgi ($$) { #{{{
++sub authcgi ($$) {
+ my $cgi=shift;
+ my $session=shift;
+
@@ -115,16 +115,16 @@ Index: IkiWiki/Plugin/blogpost.pm
+ $cgi->param("page", $page);
+ }
+
-+} #}}}
++}
+
-+sub blogpage ($) { #{{{
++sub blogpage ($) {
+ my $title=shift;
+ my $page=POSIX::strftime $config{blogformat}, localtime;
+ $page =~ s/\$title/$title/;
+ return $page;
-+} #}}}
++}
+
-+sub canedit ($$$) { #{{{
++sub canedit ($$$) {
+ my $page=shift;
+ my $cgi=shift;
+ my $session=shift;
@@ -136,7 +136,7 @@ Index: IkiWiki/Plugin/blogpost.pm
+ return "" if ($config{blogusers} eq "*" ||
+ grep {$_ eq $user} $config{blogusers});
+ return ("not allowed to blog, $user");
-+} #}}}
++}
+
+1
Index: IkiWiki.pm
diff --git a/doc/todo/bzr.mdwn b/doc/todo/bzr.mdwn
index 179ea2f24..a50c58d26 100644
--- a/doc/todo/bzr.mdwn
+++ b/doc/todo/bzr.mdwn
@@ -56,15 +56,15 @@ and rcs_getctime and rcs_notify aren't written at all. --[[bma]]
return @ret;
}
- sub rcs_update () { #{{{
+ sub rcs_update () {
# Not needed.
- } #}}}
+ }
- sub rcs_prepedit ($) { #{{{
+ sub rcs_prepedit ($) {
return "";
- } #}}}
+ }
- sub rcs_commit ($$$;$$) { #{{{
+ sub rcs_commit ($$$;$$) {
my ($file, $message, $rcstoken, $user, $ipaddr) = @_;
if (defined $user) {
@@ -95,18 +95,18 @@ and rcs_getctime and rcs_notify aren't written at all. --[[bma]]
system("bzr","whoami",$olduser);
return undef; # success
- } #}}}
+ }
- sub rcs_add ($) { # {{{
+ sub rcs_add ($) {
my ($file) = @_;
my @cmdline = ("bzr", "add", "--quiet", "$config{srcdir}/$file");
if (system(@cmdline) != 0) {
warn "'@cmdline' failed: $!";
}
- } #}}}
+ }
- sub rcs_recentchanges ($) { #{{{
+ sub rcs_recentchanges ($) {
my ($num) = @_;
eval q{use CGI 'escapeHTML'};
@@ -153,15 +153,15 @@ and rcs_getctime and rcs_notify aren't written at all. --[[bma]]
}
return @ret;
- } #}}}
+ }
- sub rcs_notify () { #{{{
+ sub rcs_notify () {
# TODO
- } #}}}
+ }
- sub rcs_getctime ($) { #{{{
+ sub rcs_getctime ($) {
# TODO
- } #}}}
+ }
1
diff --git a/doc/todo/cas_authentication.mdwn b/doc/todo/cas_authentication.mdwn
index c8ffe7005..8bf7042df 100644
--- a/doc/todo/cas_authentication.mdwn
+++ b/doc/todo/cas_authentication.mdwn
@@ -43,11 +43,11 @@ follows) ?
> the use of it: `eval q{use AuthCAS}; error $@ if $@`
+
- +sub import { #{{{
+ +sub import {
+ hook(type => "getopt", id => "cas", call => \&getopt);
+ hook(type => "auth", id => "cas", call => \&auth);
+ hook(type => "formbuilder_setup", id => "cas", call => \&formbuilder_setup);
- +} # }}}
+ +}
> Could you please use tabs for indentation of program flow?
@@ -61,15 +61,15 @@ follows) ?
> Why would you want to make other auth plugins not work? Could a site not
> legitimatly chose to use this and another auth method?
- +sub getopt () { #{{{
+ +sub getopt () {
+ eval q{use Getopt::Long};
+ error($@) if $@;
+ Getopt::Long::Configure('pass_through');
+ GetOptions("cas_url=s" => \$config{cas_url});
+ GetOptions("ca_file=s" => \$config{ca_file});
- +} #}}}
+ +}
+
- +sub auth ($$) { #{{{
+ +sub auth ($$) {
+ my $q=shift;
+ my $session=shift;
+
@@ -98,11 +98,11 @@ follows) ?
+ error("CAS failure: ".&AuthCAS::get_errors());
+ }
+ }
- +} #}}}
+ +}
+
+# I use formbuilder_setup and not formbuilder type in order to bypass the
+# Logout processing done in IkiWiki::CGI::cgi_prefs()
- +sub formbuilder_setup (@) { #{{{
+ +sub formbuilder_setup (@) {
+ my %params=@_;
+
+ my $form=$params{form};
diff --git a/doc/todo/clear_page_to_delete.mdwn b/doc/todo/clear_page_to_delete.mdwn
index 50ae246bb..6bab6ef27 100644
--- a/doc/todo/clear_page_to_delete.mdwn
+++ b/doc/todo/clear_page_to_delete.mdwn
@@ -4,7 +4,7 @@ cleared to be entirely empty (or only have whitespace)? Discuss. --[[Joey]]
I'd say so; yes. A method of deleting pages via the web would be great; I
can't think of a use of keeping blank pages around. What about vandalism --
if someone blanks a page and deletes it and someone else wishes to restore
-it; or is undoing edits via the web a bigger issue? -- [[JonDowland]]
+it; or is undoing edits via the web a bigger issue? -- [[users/Jon]]
Of course there's already a way to delete pages (remove plugin). So the
question is really:
@@ -30,4 +30,4 @@ keyword and if there were no page editions since XX days. Here, I use pages that
can be empty everyday and filled all day long. It does not make sense to me to
delete these pages :). --[[xma]]
-I was not aware of [[plugins/remove]]. I don't think another method is necessary -- [[JonDowland]]
+I was not aware of [[plugins/remove]]. I don't think another method is necessary -- [[users/Jon]]
diff --git a/doc/todo/color_plugin.mdwn b/doc/todo/color_plugin.mdwn
index 69afe837d..19fba3b35 100644
--- a/doc/todo/color_plugin.mdwn
+++ b/doc/todo/color_plugin.mdwn
@@ -132,12 +132,12 @@ Of course, I'm open for discussion or exchange of ideas :) --[[Paweł|ptecza]]
+use strict;
+use IkiWiki 2.00;
+
- +sub import { #{{{
+ +sub import {
+ hook(type => "preprocess", id => "color", call => \&preprocess);
+ hook(type => "format", id => "color", call => \&format);
- +} #}}}
+ +}
+
- +sub preserve_style ($$$) { #{{{
+ +sub preserve_style ($$$) {
+ my $foreground = shift;
+ my $background = shift;
+ my $text = shift;
@@ -162,18 +162,18 @@ Of course, I'm open for discussion or exchange of ideas :) --[[Paweł|ptecza]]
+
+ return $preserved;
+
- +} #}}}
+ +}
+
- +sub replace_preserved_style ($) { #{{{
+ +sub replace_preserved_style ($) {
+ my $content = shift;
+
+ $content =~ s!<span class="color">((color: ([a-z]+|\#[0-9a-f]{3,6})?)?((; )?(background-color: ([a-z]+|\#[0-9a-f]{3,6})?)?)?)</span>!<span class="color" style="$1">!g;
+ $content =~ s!<span class="colorend">!!g;
+
+ return $content;
- +} #}}}
+ +}
+
- +sub preprocess (@) { #{{{
+ +sub preprocess (@) {
+ my %params = @_;
+
+ # Preprocess the text to expand any preprocessor directives
@@ -182,14 +182,14 @@ Of course, I'm open for discussion or exchange of ideas :) --[[Paweł|ptecza]]
+ IkiWiki::filter($params{page}, $params{destpage}, $params{text}));
+
+ return preserve_style($params{foreground}, $params{background}, $params{text});
- +} #}}}
+ +}
+
- +sub format (@) { #{{{
+ +sub format (@) {
+ my %params = @_;
+
+ $params{content} = replace_preserved_style($params{content});
+ return $params{content};
- +} #}}}
+ +}
+
+1
--- /dev/null 2008-06-21 02:02:15.000000000 +0200
diff --git a/doc/todo/comments.mdwn b/doc/todo/comments.mdwn
new file mode 100644
index 000000000..832441be1
--- /dev/null
+++ b/doc/todo/comments.mdwn
@@ -0,0 +1,149 @@
+# Known issues with the [[plugins/comments]] plugin
+
+## Unimplemented
+
+* Instead of just a link to add a comment, it could have a form to enter
+ the title, similar to the form for adding a new blog post.
+
+ > I'm not sure this is so useful? On Livejournal titles are allowed on
+ > comments, but very rarely used (and indeed usually not very useful);
+ > it's hard enough to get some people to title their blog posts :-)
+ > --[[smcv]]
+
+* If a spammer posts a comment, it is either impossible or hard to clean
+ up via the web. Would be nice to have some kind of link on the comment
+ that allows trusted users to remove it (using the remove plugin of
+ course).
+
+ > Won't the remove plugin refuse to remove internal pages? This would be
+ > a good feature to have, though. --[[smcv]]
+
+ > Here, FWIW, is the first ikiwiki comment spam I've seen:
+ > <http://waldeneffect.org/blog/Snake_bite_information/#blog/Snake_bite_information/comment_1>
+ > So that took about 10 days...
+ > --[[Joey]]
+
+## Patches pending merge
+
+* There is some common code cargo-culted from other plugins (notably inline and editpage) which
+ should probably be shared
+
+ > Actually, there's less of this now than there used to be - a lot of simple
+ > things that were shared have become unshareable as they became more
+ > complex. --[[smcv]]
+
+ > There's still goto. You have a branch for that. --[[Joey]]
+
+## Won't fix
+
+* It would be useful to have a pagespec that always matches all comments on
+ pages matching a glob. Something like `comment(blog/*)`.
+ Perhaps postcomment could also be folded into this? Then the pagespec
+ would match both existing comments, as well as new comments that are
+ being posted.
+
+ > Please see [[plugins/comments/discussion]]. If I've convinced you that
+ > internal pages are the way forward, then sure, we can do that, because
+ > people who can comment still won't be able to edit others' comments
+ > (one of my goals is that commenters can't put words into each other's
+ > mouths :-) )
+ >
+ > On the other hand, if you still want me to switch this plugin to "real"
+ > pages, or if internal pages might become editable in future, then
+ > configuring lockedit/anonok so a user X can add comments to blog pages
+ > would also let X edit/delete comments on blog pages (including those
+ > written by others) in arbitrary ways, which doesn't seem good. --[[smcv]]
+
+ > I had a look at implementing comment() and fell afoul of
+ > some optimisations that assume only internal() will be used to match
+ > internal pages. So probably this isn't worth doing. --[[Joey]]
+
+## Done
+
+* The default template should have a (?) icon next to unauthenticated users (with the IP address
+ as title) and an OpenID icon next to OpenIDs
+
+ > Done in my comments git branch, at least as a mockup (using the (?),
+ > {x} and {*} smileys for anonymous, OpenID and login respectively).
+ > --[[smcv]]
+
+ >> I've improved this to use independent icons from the wikiicons
+ >> directory (untested!) --[[smcv]]
+
+ >>> The new code produces links like /wikiisons/openid.png, which
+ >>> fail if ikiwiki is not at the root of the web server. --[[Joey]]
+
+ >>>> Sorry, I should have spotted that (the assumption failed on my demo
+ >>>> site, but the push to that site was when I was on the way out, so I
+ >>>> didn't have time to investigate). As a note for other ikiwiki hackers,
+ >>>> I should have used
+ >>>> `<img src="<TMPL_VAR NAME=BASEURL>wikiicons/openid.png" />`. --[[smcv]]
+
+ >>> I got to wondering if the icons are needed. On my comments branch
+ >>> (not master), I've dropped the icons and info can be seen by hovering
+ >>> over the author's name. Idea being that you probably don't care how
+ >>> they authenticated unless something is weird, and in that case you
+ >>> can hover to check. Does that make sense, should I merge it?
+ >>> --[[Joey]]
+
+ >>>> Yeah, go ahead. I preferred my layout with the author before the
+ >>>> comment - perhaps that's Livejournal's influence :-) - but I can always
+ >>>> edit the templates for my own site. As long as the default is something
+ >>>> reasonable and both layouts are possible, I don't really mind.
+ >>>> Minimizing the number of "resource" files in the basewiki also seems
+ >>>> a good goal. --[[smcv]]
+
+* Previews always say "unknown IP address"
+
+ > Fixed in my comments branch by commits bc66a00b and 95b3bbbf --[[smcv]]
+
+* The Comments link in the "toolbar" is to `index.html#comments`, not the
+ desired `./#comments`
+
+ > Fixed in my comments branch by commit 0844bd0b; commits 5b1cf21a
+ > and c42f174e fix another `beautify_urlpath` bug and add a regression test
+ > --[[smcv]]
+
+* Now that inline has some comments-specific functionality anyway, it would
+ be good to output `<link rel="comments">` in Atom and the equivalent in RSS.
+
+ > Fixed in my comments branch by d0d598e4, 3feebe31, 9e5f504e --[[smcv]]
+
+
+* Add `COMMENTOPENID`: the authenticated/verified user name, if and only if it was an OpenID
+
+ > Done in my comments git branch --[[smcv]]
+
+ > Not seeing it there, which branch? --[[Joey]]
+
+ >> Bah, git push --all is not the default... 'comments' branch now (I've also rebased it).
+ >> Sorry, I'm on mobile Internet at the moment... --[[smcv]]
+
+ >>> merged by [[Joey]] in commit 0f03af38 --[[smcv]]
+
+* Should the comments be visually set off more from the page above?
+ Rather than just a horizontal rule, I'm thinking put the comments
+ in a box like is used for inlined pages.
+
+ > I did put them in a box in the CSS... I agree the default template
+ > could do with visual improvement though. --[[smcv]]
+
+ >> I'll consider this solved by [[Joey]]'s changes. --[[smcv]]
+
+* One can use inline to set up a feed of all comments posted to any page.
+ Using template=comment they are displayed right. Only problem
+ is there is no indication in that template of what page each comment in the
+ feed is a comment on. So, if a comment is inlined into a different page,
+ I think it should show a link back to the page commented on.
+ (BTW, the rss feed in this situation seems ok; there the link element
+ points back to the parent page.
+
+ > done --[[Joey]]
+
+* One of Joey's commit messages says "Not ideal, it would be nicer to jump to
+ the actual comment posted, but no anchor is available". In fact there is
+ an anchor - the `\[[_comment]]` preprocessing wraps the comment in a `<div>`
+ with id="comment_123" or something. I'll fix this, unless Joey gets there
+ first. --[[smcv]]
+
+ > done --[[Joey]]
diff --git a/doc/todo/darcs.mdwn b/doc/todo/darcs.mdwn
index e5bf5ee27..882a41379 100644
--- a/doc/todo/darcs.mdwn
+++ b/doc/todo/darcs.mdwn
@@ -219,14 +219,14 @@ This is my ([bma](bma@bmalee.eu)) darcs.pm - it's messy (my Perl isn't up to muc
package IkiWiki;
- sub rcs_update () { #{{{
+ sub rcs_update () {
# Do nothing - there's nowhere to update *from*.
- } #}}}
+ }
- sub rcs_prepedit ($) { #{{{
- } #}}}
+ sub rcs_prepedit ($) {
+ }
- sub rcs_commit ($$$;$$) { #{{{
+ sub rcs_commit ($$$;$$) {
my ($file, $message, $rcstoken, $user, $ipaddr) = @_;
# $user should probably be a name and an email address, by darcs
@@ -257,16 +257,16 @@ This is my ([bma](bma@bmalee.eu)) darcs.pm - it's messy (my Perl isn't up to muc
return undef; # success
- sub rcs_add ($) { # {{{
+ sub rcs_add ($) {
my ($file) = @_;
my @cmdline = ("darcs", "add", "--repodir", "$config{srcdir}", "-a", "-q", "$file");
if (system(@cmdline) != 0) {
warn "'@cmdline' failed: $!";
}
- } #}}}
+ }
- sub rcs_recentchanges ($) { #{{{
+ sub rcs_recentchanges ($) {
# TODO: This is horrible code. It doesn't work perfectly, and uses regexes
# rather than parsing Darcs' XML output.
my $num=shift;
@@ -314,15 +314,15 @@ This is my ([bma](bma@bmalee.eu)) darcs.pm - it's messy (my Perl isn't up to muc
}
}
return @ret;
- } #}}}
+ }
- sub rcs_notify () { #{{{
+ sub rcs_notify () {
# TODO
- } #}}}
+ }
- sub rcs_getctime ($) { #{{{
+ sub rcs_getctime ($) {
error gettext("getctime not implemented");
- } #}}}
+ }
1
diff --git a/doc/todo/datearchives-plugin.mdwn b/doc/todo/datearchives-plugin.mdwn
index 5a5560d6c..5f33cde4c 100644
--- a/doc/todo/datearchives-plugin.mdwn
+++ b/doc/todo/datearchives-plugin.mdwn
@@ -17,11 +17,11 @@ Index: IkiWiki/Plugin/datearchives.pm
+use strict;
+use IkiWiki;
+
-+sub import { #{{{
++sub import {
+ hook(type => "pagetemplate", id => "datearchives", call => \&pagetemplate, scan => 1);
-+} # }}}
++}
+
-+sub pagetemplate (@) { #{{{
++sub pagetemplate (@) {
+ my %args = @_;
+ my $dt;
+ eval {
@@ -37,7 +37,7 @@ Index: IkiWiki/Plugin/datearchives.pm
+ $template->param(ctime => htmllink( $args{page}, $args{destpage}, $link, 0, 0,
+ $template->param('ctime')));
+ }
-+} # }}}
++}
+
+1
</pre>
diff --git a/doc/todo/different_search_engine.mdwn b/doc/todo/different_search_engine.mdwn
index 2f309dea5..9d0fc92c9 100644
--- a/doc/todo/different_search_engine.mdwn
+++ b/doc/todo/different_search_engine.mdwn
@@ -126,7 +126,7 @@ Index: IkiWiki/Plugin/search.pm
+ $PLUCENE_DIR = $config{wikistatedir}.'/plucene';
+}
+
- sub import { #{{{
+ sub import {
- hook(type => "getopt", id => "hyperestraier",
- call => \&amp;getopt);
- hook(type => "checkconfig", id => "hyperestraier",
@@ -142,14 +142,14 @@ Index: IkiWiki/Plugin/search.pm
call => \&amp;change);
- hook(type => "cgi", id => "hyperestraier",
- call => \&amp;cgi);
- } # }}}
+ }
--sub getopt () { #{{{
+-sub getopt () {
- eval q{use Getopt::Long};
- error($@) if $@;
- Getopt::Long::Configure('pass_through');
- GetOptions("estseek=s" => \$config{estseek});
--} #}}}
+-}
+sub writer {
+ init();
@@ -165,20 +165,20 @@ Index: IkiWiki/Plugin/search.pm
+ grep { defined pagetype($_) } @_;
+}
+
- sub checkconfig () { #{{{
+ sub checkconfig () {
foreach my $required (qw(url cgiurl)) {
if (! length $config{$required}) {
@@ -36,112 +58,55 @@
}
- } #}}}
+ }
-my $form;
--sub pagetemplate (@) { #{{{
+-sub pagetemplate (@) {
- my %params=@_;
- my $page=$params{page};
- my $template=$params{template};
+#my $form;
-+#sub pagetemplate (@) { #{{{
++#sub pagetemplate (@) {
+# my %params=@_;
+# my $page=$params{page};
+# my $template=$params{template};
@@ -193,7 +193,7 @@ Index: IkiWiki/Plugin/search.pm
+#
+# $template->param(searchform => $form);
+# }
-+#} #}}}
++#}
- # Add search box to page header.
- if ($template->query(name => "searchform")) {
@@ -205,9 +205,9 @@ Index: IkiWiki/Plugin/search.pm
-
- $template->param(searchform => $form);
- }
--} #}}}
+-}
-
- sub delete (@) { #{{{
+ sub delete (@) {
- debug(gettext("cleaning hyperestraier search index"));
- estcmd("purge -cl");
- estcfg();
@@ -219,9 +219,9 @@ Index: IkiWiki/Plugin/search.pm
+ $reader->delete_term( Plucene::Index::Term->new({ field => "id", text => $_ }));
+ }
+ $reader->close;
- } #}}}
+ }
- sub change (@) { #{{{
+ sub change (@) {
- debug(gettext("updating hyperestraier search index"));
- estcmd("gather -cm -bc -cl -sd",
- map {
@@ -250,9 +250,9 @@ Index: IkiWiki/Plugin/search.pm
+ $doc->add(Plucene::Document::Field->UnStored('text' => $data));
+ $writer->add_document($doc);
+ }
- } #}}}
+ }
-
--sub cgi ($) { #{{{
+-sub cgi ($) {
- my $cgi=shift;
-
- if (defined $cgi->param('phrase') || defined $cgi->param("navi")) {
@@ -260,10 +260,10 @@ Index: IkiWiki/Plugin/search.pm
- chdir("$config{wikistatedir}/hyperestraier") || error("chdir: $!");
- exec("./".IkiWiki::basename($config{cgiurl})) || error("estseek.cgi failed");
- }
--} #}}}
+-}
-
-my $configured=0;
--sub estcfg () { #{{{
+-sub estcfg () {
- return if $configured;
- $configured=1;
-
@@ -301,9 +301,9 @@ Index: IkiWiki/Plugin/search.pm
- unlink($cgi);
- my $estseek = defined $config{estseek} ? $config{estseek} : '/usr/lib/estraier/estseek.cgi';
- symlink($estseek, $cgi) || error("symlink $estseek $cgi: $!");
--} # }}}
+-}
-
--sub estcmd ($;@) { #{{{
+-sub estcmd ($;@) {
- my @params=split(' ', shift);
- push @params, "-cl", "$config{wikistatedir}/hyperestraier";
- if (@_) {
@@ -323,7 +323,7 @@ Index: IkiWiki/Plugin/search.pm
- open(STDOUT, "/dev/null"); # shut it up (closing won't work)
- exec("estcmd", @params) || error("can't run estcmd");
- }
--} #}}}
+-}
-
-1
+1;
diff --git a/doc/todo/directive_docs.mdwn b/doc/todo/directive_docs.mdwn
index 1f6307381..2baa61b40 100644
--- a/doc/todo/directive_docs.mdwn
+++ b/doc/todo/directive_docs.mdwn
@@ -40,15 +40,15 @@ defined them: --[[Joey]]
index e476521..afe982a 100644
--- a/IkiWiki.pm
+++ b/IkiWiki.pm
- @@ -493,6 +493,7 @@ sub loadplugins () { #{{{
+ @@ -493,6 +493,7 @@ sub loadplugins () {
return 1;
- } #}}}
+ }
+my $loading_plugin;
- sub loadplugin ($) { #{{{
+ sub loadplugin ($) {
my $plugin=shift;
- @@ -502,14 +503,18 @@ sub loadplugin ($) { #{{{
+ @@ -502,14 +503,18 @@ sub loadplugin ($) {
"$installdir/lib/ikiwiki") {
if (defined $dir && -x "$dir/plugins/$plugin") {
require IkiWiki::Plugin::external;
@@ -67,7 +67,7 @@ defined them: --[[Joey]]
if ($@) {
error("Failed to load plugin $mod: $@");
}
- @@ -1429,6 +1434,9 @@ sub hook (@) { # {{{
+ @@ -1429,6 +1434,9 @@ sub hook (@) {
return if $param{no_override} && exists $hooks{$param{type}}{$param{id}};
@@ -76,4 +76,4 @@ defined them: --[[Joey]]
+
$hooks{$param{type}}{$param{id}}=\%param;
return 1;
- } # }}}
+ }
diff --git a/doc/todo/enable-htaccess-files.mdwn b/doc/todo/enable-htaccess-files.mdwn
index b3c174fba..e3b295123 100644
--- a/doc/todo/enable-htaccess-files.mdwn
+++ b/doc/todo/enable-htaccess-files.mdwn
@@ -5,7 +5,7 @@
@@ -26,7 +26,7 @@
memoize("file_pruned");
- sub defaultconfig () { #{{{
+ sub defaultconfig () {
- wiki_file_prune_regexps => [qr/\.\./, qr/^\./, qr/\/\./,
+ wiki_file_prune_regexps => [qr/\.\./, qr/^\.(?!htaccess)/, qr/\/\.(?!htaccess)/,
qr/\.x?html?$/, qr/\.ikiwiki-new$/,
diff --git a/doc/todo/format_escape.mdwn b/doc/todo/format_escape.mdwn
index 8dfe05581..574883d1b 100644
--- a/doc/todo/format_escape.mdwn
+++ b/doc/todo/format_escape.mdwn
@@ -141,13 +141,13 @@ Index: IkiWiki/Plugin/rst.pm
print html[html.find('<body>')+6:html.find('</body>')].strip();
";
- sub import { #{{{
+ sub import {
hook(type => "htmlize", id => "rst", call => \&htmlize);
+ hook(type => "htmlescape", id => "rst", call => \&htmlescape);
+ hook(type => "htmlescapelink", id => "rst", call => \&htmlescapelink);
- } # }}}
+ }
-+sub htmlescapelink ($$;@) { #{{{
++sub htmlescapelink ($$;@) {
+ my $url = shift;
+ my $text = shift;
+ my %params = @_;
@@ -158,15 +158,15 @@ Index: IkiWiki/Plugin/rst.pm
+ else {
+ return "`$text <$url>`_";
+ }
-+} # }}}
++}
+
-+sub htmlescape ($) { #{{{
++sub htmlescape ($) {
+ my $html=shift;
+ $html=~s/^/ /mg;
+ return ".. raw:: html\n\n".$html;
-+} # }}}
++}
+
- sub htmlize (@) { #{{{
+ sub htmlize (@) {
my %params=@_;
my $content=$params{content};
Index: doc/plugins/write.mdwn
@@ -272,7 +272,7 @@ Index: IkiWiki.pm
+ return $hooks{htmlescapelink}{$type}{call}->($bestlink, $linktext);
+ }
return "<a href=\"$bestlink\">$linktext</a>";
- } #}}}
+ }
@@ -628,6 +640,14 @@
preview => $preprocess_preview,
diff --git a/doc/todo/fortune:_select_options_via_environment.mdwn b/doc/todo/fortune:_select_options_via_environment.mdwn
index f906312fe..ddacd91b5 100644
--- a/doc/todo/fortune:_select_options_via_environment.mdwn
+++ b/doc/todo/fortune:_select_options_via_environment.mdwn
@@ -14,9 +14,9 @@
package IkiWiki::Plugin::fortune;
use warnings;
- @@ -12,7 +18,13 @@ sub import { #{{{
+ @@ -12,7 +18,13 @@ sub import {
- sub preprocess (@) { #{{{
+ sub preprocess (@) {
$ENV{PATH}="$ENV{PATH}:/usr/games:/usr/local/games";
- my $f = `fortune 2>/dev/null`;
+ my $f;
diff --git a/doc/todo/generic___39__do__61__goto__39___for_CGI.mdwn b/doc/todo/generic___39__do__61__goto__39___for_CGI.mdwn
new file mode 100644
index 000000000..1828f0a7b
--- /dev/null
+++ b/doc/todo/generic___39__do__61__goto__39___for_CGI.mdwn
@@ -0,0 +1,9 @@
+The [[plugins/recentchanges]] plugin has a `do=recentchanges_link` feature that will
+redirect to a given wiki page, or an error page with a creation link.
+
+In the [[plugins/contrib/comments]] plugin I've found that it would be useful to do
+the same for users. For now I've just cloned the functionality into the comments
+plugin, but perhaps this functionality could be renamed to `do=goto` or
+something, and moved to `IkiWiki/CGI.pm`?
+
+If there's general approval I'm happy to write a patch. --[[smcv]]
diff --git a/doc/todo/httpauth_feature_parity_with_passwordauth.mdwn b/doc/todo/httpauth_feature_parity_with_passwordauth.mdwn
index 8a338ece1..eb71cf840 100644
--- a/doc/todo/httpauth_feature_parity_with_passwordauth.mdwn
+++ b/doc/todo/httpauth_feature_parity_with_passwordauth.mdwn
@@ -1,5 +1,8 @@
-The only way to have a private ikiwiki, with a shared user database for static pages and CGI authentication, is to use [[plugins/httpauth]]. It would be good for httpauth to be on par with [[plugins/passwordauth]],
-i.e. to allow registering users, resetting passwords, and changing passwords; supporting some kind of
+The only way to have a private ikiwiki, with a shared user database
+for static pages and CGI authentication, is to use
+[[plugins/httpauth]]. It would be good for httpauth to be on par with
+[[plugins/passwordauth]], i.e. to allow registering users, resetting
+passwords, and changing passwords; supporting some kind of
`account_creation_password` configuration option would be nice, too.
I'll probably propose patches implementing this at some point.
@@ -8,4 +11,18 @@ the relevant passwordauth code, instead of rewriting it completely in httpauth.
-- [[intrigeri]]
+Well, on such a private wiki, one can neither register herself nor
+reset his password: the registration page, as any other page, would be
+forbidden to non-authenticated users. Admin users should then be
+enabled to:
+
+- register a new user
+- reset someone else's password
+
+In both cases, a brand new random password is sent by e-mail to the
+new user.
+
+An authenticated user should nevertheless be able to change his
+own password. -- [[intrigeri]]
+
[[wishlist]]
diff --git a/doc/todo/index.html_allowed.mdwn b/doc/todo/index.html_allowed.mdwn
index f030f9eea..f5e6f8cd7 100644
--- a/doc/todo/index.html_allowed.mdwn
+++ b/doc/todo/index.html_allowed.mdwn
@@ -91,15 +91,15 @@ page "A/B/index.html" is treated as "A/B".
+++ ikidev/IkiWiki.pm 2007-02-25 15:05:22.328852000 -0800
@@ -192,6 +192,12 @@
return $untainted;
- } #}}}
+ }
- +sub titlename($;@) { #{{{
+ +sub titlename($;@) {
+ my $page = shift;
+ $page =~ s!/index$!!;
+ return pagetitle(basename($page), @_);
- +} #}}}
+ +}
+
- sub basename ($) { #{{{
+ sub basename ($) {
my $file=shift;
@@ -117,7 +117,7 @@ diff -ru ikiwiki-2.4/IkiWiki.pm ikiwiki/IkiWiki.pm
$page=~s/\Q.$type\E*$// if defined $type;
+ $page=~s/\/index$// if $page =~ /\/index$/;
return $page;
- } #}}}
+ }
</pre>
diff --git a/doc/todo/inline:_numerical_ordering_by_title.mdwn b/doc/todo/inline:_numerical_ordering_by_title.mdwn
index 95511d998..3f6c8b598 100644
--- a/doc/todo/inline:_numerical_ordering_by_title.mdwn
+++ b/doc/todo/inline:_numerical_ordering_by_title.mdwn
@@ -155,11 +155,11 @@ Joey, have you forgotten about that request? ;) --[[Paweł|ptecza]]
%config %links %pagestate %renderedfiles
%pagesources %destsources);
our $VERSION = 2.00; # plugin interface version, next is ikiwiki version
- @@ -835,6 +835,42 @@ sub titlepage ($) { #{{{
+ @@ -835,6 +835,42 @@ sub titlepage ($) {
return $title;
- } #}}}
+ }
- +sub titlecmp ($$) { #{{{
+ +sub titlecmp ($$) {
+ my $titleA=shift;
+ my $titleB=shift;
+
@@ -193,29 +193,29 @@ Joey, have you forgotten about that request? ;) --[[Paweł|ptecza]]
+ return -1 if (@listB);
+
+ return 0;
- +} #}}}
+ +}
+
- sub linkpage ($) { #{{{
+ sub linkpage ($) {
my $link=shift;
my $chars = defined $config{wiki_file_chars} ? $config{wiki_file_chars} : "-[:alnum:]+/.:_";
diff --git a/IkiWiki/Plugin/brokenlinks.pm b/IkiWiki/Plugin/brokenlinks.pm
index 37752dd..ccaa399 100644
--- a/IkiWiki/Plugin/brokenlinks.pm
+++ b/IkiWiki/Plugin/brokenlinks.pm
- @@ -59,7 +59,7 @@ sub preprocess (@) { #{{{
+ @@ -59,7 +59,7 @@ sub preprocess (@) {
map {
"<li>$_</li>"
}
- sort @broken)
+ sort titlecmp @broken)
."</ul>\n";
- } # }}}
+ }
diff --git a/IkiWiki/Plugin/inline.pm b/IkiWiki/Plugin/inline.pm
index 8efef3f..263e7a6 100644
--- a/IkiWiki/Plugin/inline.pm
+++ b/IkiWiki/Plugin/inline.pm
- @@ -192,7 +192,7 @@ sub preprocess_inline (@) { #{{{
+ @@ -192,7 +192,7 @@ sub preprocess_inline (@) {
}
if (exists $params{sort} && $params{sort} eq 'title') {
@@ -228,20 +228,20 @@ Joey, have you forgotten about that request? ;) --[[Paweł|ptecza]]
index b910758..10a1d87 100644
--- a/IkiWiki/Plugin/orphans.pm
+++ b/IkiWiki/Plugin/orphans.pm
- @@ -56,7 +56,7 @@ sub preprocess (@) { #{{{
+ @@ -56,7 +56,7 @@ sub preprocess (@) {
htmllink($params{page}, $params{destpage}, $_,
noimageinline => 1).
"</li>"
- } sort @orphans).
+ } sort titlecmp @orphans).
"</ul>\n";
- } # }}}
+ }
diff --git a/IkiWiki/Render.pm b/IkiWiki/Render.pm
index ceb7c84..00798e1 100644
--- a/IkiWiki/Render.pm
+++ b/IkiWiki/Render.pm
- @@ -89,7 +89,7 @@ sub genpage ($$) { #{{{
+ @@ -89,7 +89,7 @@ sub genpage ($$) {
$template->param(have_actions => 1);
}
diff --git a/doc/todo/inline_plugin:_ability_to_override_feed_name.mdwn b/doc/todo/inline_plugin:_ability_to_override_feed_name.mdwn
new file mode 100644
index 000000000..df5bf9194
--- /dev/null
+++ b/doc/todo/inline_plugin:_ability_to_override_feed_name.mdwn
@@ -0,0 +1,29 @@
+If RSS and Atom are enabled by default, the [[plugins/contrib/comments]]
+plugin generates a feed, perhaps `/sandbox/index.atom` for comments on the
+sandbox. If a blog is added to the page, the blog will steal the name
+`/sandbox/index.atom` and the comments plugin's feed will change to
+`/sandbox/index.atom2`.
+
+If `\[[!inline]]` gained a parameter `feedname` or something, the comments
+plugin could use `feedname=comments` to produce `/sandbox/comments.atom`
+instead (this would just require minor enhancements to rsspage(),
+atompage() and targetpage()).
+
+As a side benefit, [my blog](http://smcv.pseudorandom.co.uk/) could go back
+to its historical Atom feed URL of `.../feed.atom` (which is currently a
+symlink to `index.atom` :-) )
+
+On sites not using `usedirs` the current feed is `/sandbox.atom`, and we
+could perhaps change it to `/sandbox-comments.atom` or
+`/sandbox/comments.atom` if `feedname=comments` is given.
+
+--[[smcv]]
+
+> This is slightly hard to do, because you have to worry about
+> conflicting pages setting feedname, which could cause ikiwiki to blow up.
+>
+> Particularly for the non-usedirs case, where a page `sandbox/comments`
+> would produce the same feed as sandbox with `feedname=comments`.
+> --[[Joey]]
+
+> [[done]] as feedfile option --[[Joey]]
diff --git a/doc/todo/inline_plugin:_hide_feed_buttons_if_empty.mdwn b/doc/todo/inline_plugin:_hide_feed_buttons_if_empty.mdwn
new file mode 100644
index 000000000..d046c0cd0
--- /dev/null
+++ b/doc/todo/inline_plugin:_hide_feed_buttons_if_empty.mdwn
@@ -0,0 +1,7 @@
+ < joeyh> 03:49:19> also, I think it may be less visually confusing to
+ drop the rss/atom buttons for comments when there are none yet
+
+This seems to me like something that applies to the [[plugins/inline]] plugin in general, rather than the [[plugins/contrib/comments]] plugin specifically. --[[smcv]]
+
+>> [[done]] as emptyfeeds option, not on by default for inline, but I think
+>> it should be for comments --[[Joey]]
diff --git a/doc/todo/language_definition_for_the_meta_plugin.mdwn b/doc/todo/language_definition_for_the_meta_plugin.mdwn
index 33098c601..4ac4e2e25 100644
--- a/doc/todo/language_definition_for_the_meta_plugin.mdwn
+++ b/doc/todo/language_definition_for_the_meta_plugin.mdwn
@@ -54,7 +54,7 @@ This may be useful for sites with a few pages in different languages, but no ful
my %authorurl;
+my %lang;
- sub import { #{{{
+ sub import {
hook(type => "preprocess", id => "meta", call => \&preprocess, scan => 1);
@@ -100,6 +101,11 @@
$meta{$page}.='<link href="'.encode_entities($value).
@@ -75,7 +75,7 @@ This may be useful for sites with a few pages in different languages, but no ful
+ $template->param(lang => $lang{$page})
+ if exists $lang{$page} && $template->query(name => "lang");
- } # }}}
+ }
</pre>
> Please resolve lang somewhere reusable rather than within meta plugin: It is certainly usable outside
diff --git a/doc/todo/location_of_external_plugins.mdwn b/doc/todo/location_of_external_plugins.mdwn
new file mode 100644
index 000000000..c28003e74
--- /dev/null
+++ b/doc/todo/location_of_external_plugins.mdwn
@@ -0,0 +1,24 @@
+Would it be possible to make the installation location for the external
+plugins (those talked to via xmlrpc) configurable? Currently, they are
+installed into (and later expected to be in) /usr/lib/ikiwiki/plugins. For
+the Fedora package (which I maintain), I move them to
+/usr/libexec/ikiwiki/plugins. While not covered by the FHS, this seems to
+be a more appropriate place, see:
+https://fedoraproject.org/wiki/Packaging/Guidelines#Libexecdir.
+
+> This would need to be a build time configuration setting so the directory
+> is built into ikiwiki for use at runtime. --[[Joey]]
+
+As a side note, the accompanying proxy.py might better be placed into some directory on the python path.
+
+> If someone can show how to do so without needing a Setup.py and all the
+> pain that using one entails.. --[[Joey]]
+
+>> At the very least I don't think proxy.py should be on the `sys.path`
+>> under its current name. If it was renamed to ikiwiki_proxy or some such,
+>> possibly; but I think it's more appropriate to have it in an
+>> ikiwiki-specific directory (a "private module") since it's not useful for
+>> anything outside ikiwiki, and putting it in the same directory as the
+>> external plugins means it's automatically in their `sys.path` without
+>> needing special configuration. --[[smcv]]
+>> (a mostly-inactive member of Debian's Python modules packaging team)
diff --git a/doc/todo/location_of_ikiwiki-w3m.cgi.mdwn b/doc/todo/location_of_ikiwiki-w3m.cgi.mdwn
new file mode 100644
index 000000000..8ca925bee
--- /dev/null
+++ b/doc/todo/location_of_ikiwiki-w3m.cgi.mdwn
@@ -0,0 +1,3 @@
+The `ikiwiki-w3m.cgi` script is installed (hard-coded) into `/usr/lib/w3m/cgi-bin`. On Fedora however, the w3m package expects it in `/usr/libexec/w3m/cgi-bin`. So, it would be nice if the destination for this script could be configured.
+
+> You can use `W3M_CGI_BIN now`. [[done]] --[[Joey]]
diff --git a/doc/todo/mbox.mdwn b/doc/todo/mbox.mdwn
index 081d51200..f7744563c 100644
--- a/doc/todo/mbox.mdwn
+++ b/doc/todo/mbox.mdwn
@@ -14,3 +14,6 @@ I'd like to be able to drop an unmodified RFC2822 email message into ikiwiki, an
>>> to page foo). I'm not sure if this is possible and worthwhile to fix.
>> It is certainly workable
>>> to use a \[[!mailbox ]] directive. -- [[DavidBremner]]
+
+> Your gitweb doesn't tell me where I can git pull this from, which I'd
+> like to do ... --[[Joey]]
diff --git a/doc/todo/meta_rcsid.mdwn b/doc/todo/meta_rcsid.mdwn
index 81a2c1328..158edea6e 100644
--- a/doc/todo/meta_rcsid.mdwn
+++ b/doc/todo/meta_rcsid.mdwn
@@ -26,7 +26,7 @@ of CVS/SVN-style keywords (like '$Id$', etc.) from the source file in the page t
my %copyright;
+my %rcsid;
- sub import { #{{{
+ sub import {
hook(type => "preprocess", id => "meta", call => \&preprocess, scan => 1);
@@ -110,6 +111,9 @@
$meta{$page}.="<link rel=\"copyright\" href=\"#page_copyright\" />\n";
diff --git a/doc/todo/missingparents.pm.mdwn b/doc/todo/missingparents.pm.mdwn
index 0cc7137ba..c5f2ab535 100644
--- a/doc/todo/missingparents.pm.mdwn
+++ b/doc/todo/missingparents.pm.mdwn
@@ -82,15 +82,15 @@ Index: IkiWiki/Plugin/missingparents.pm
+my %ownfiles;
+my @pagespecs;
+
-+sub import { #{{{
++sub import {
+ hook(type => "checkconfig", id => "missingparents", call => \&checkconfig);
+ hook(type => "needsdelete", id => "missingparents", call => \&needsdelete);
+ hook(type => "needsbuild", id => "missingparents", call => \&needsbuild);
+ hook(type => "savestate", id => "missingparents", call => \&savestate);
+ hook(type => "preprocess", id => "missingparents", call => \&preprocess_missingparents);
-+} # }}}
++}
+
-+sub checkconfig () { #{{{
++sub checkconfig () {
+ IkiWiki::preprocess("missingparents", "missingparents",
+ readfile(srcfile("missingparents.mdwn")));
+ loadstate();
@@ -99,9 +99,9 @@ Index: IkiWiki/Plugin/missingparents.pm
+ unlink $config{srcdir}.'/'.$file;
+ }
+ }
-+} #}}}
++}
+
-+sub preprocess_missingparents (@) { #{{{
++sub preprocess_missingparents (@) {
+ my %params=@_;
+
+ if (! defined $params{pages} || ! defined $params{generate}) {
@@ -115,10 +115,10 @@ Index: IkiWiki/Plugin/missingparents.pm
+ #translators: is text for pages that match that pagespec.
+ return sprintf(gettext("missingparents in %s will be %s"),
+ '`'.$params{pages}.'`', '`\\'.$params{generate}.'`');
-+} # }}}
++}
+
+my $state_loaded=0;
-+sub loadstate() { #{{{
++sub loadstate() {
+ my $filename = "$config{wikistatedir}/missingparents";
+ if (-e $filename) {
+ open (IN, $filename) ||
@@ -132,9 +132,9 @@ Index: IkiWiki/Plugin/missingparents.pm
+
+ $state_loaded=1;
+ }
-+} #}}}
++}
+
-+sub savestate() { #{{{
++sub savestate() {
+ my $filename = "$config{wikistatedir}/missingparents.new";
+ my $cleanup = sub { unlink ($filename) };
+ open (OUT, ">$filename") || error("open $filename: $!", $cleanup);
@@ -143,9 +143,9 @@ Index: IkiWiki/Plugin/missingparents.pm
+ }
+ rename($filename, "$config{wikistatedir}/missingparents") ||
+ error("rename $filename: $!", $cleanup);
-+} #}}}
++}
+
-+sub needsdelete (@) { #{{{
++sub needsdelete (@) {
+ my $files=shift;
+
+ my @mydel;
@@ -167,9 +167,9 @@ Index: IkiWiki/Plugin/missingparents.pm
+ foreach my $page (@mydel){
+ push @{$files}, $page;
+ }
-+} #}}}
++}
+
-+sub check_matches($) { #{{{
++sub check_matches($) {
+ my $page = shift;
+ return if $IkiWiki::pagesources{$page};
+
@@ -183,9 +183,9 @@ Index: IkiWiki/Plugin/missingparents.pm
+ return $output;
+ }
+ return "";
-+} #}}}
++}
+
-+sub needsbuild ($) { #{{{
++sub needsbuild ($) {
+ my $files=shift;
+ my @new;
+
@@ -209,7 +209,7 @@ Index: IkiWiki/Plugin/missingparents.pm
+ $ownfiles{$file} = 1;
+ push @{$files}, $file;
+ }
-+} #}}}
++}
+
+1
Index: IkiWiki.pm
@@ -227,18 +227,18 @@ Index: IkiWiki.pm
our $version='unknown'; # VERSION_AUTOREPLACE done by Makefile, DNE
@@ -330,6 +336,30 @@
error("failed renaming $newfile to $destdir/$file: $!", $cleanup);
- } #}}}
+ }
-+sub newpage($$) { #{{{
++sub newpage($$) {
+ my $file=shift;
+ my $page=shift;
+
+ $pagemtime{$page} = $pagectime{$page} = time;
+ $pagesources{$page} = $file;
+ $pagecase{lc $page} = $page;
-+} #}}}
++}
+
-+sub delpage($) { #{{{
++sub delpage($) {
+ my $page=shift;
+ $links{$page}=[];
+ $renderedfiles{$page}=[];
@@ -251,10 +251,10 @@ Index: IkiWiki.pm
+ delete $destsources{$_};
+ }
+ }
-+} #}}}
++}
+
my %cleared;
- sub will_render ($$;$) { #{{{
+ sub will_render ($$;$) {
my $page=shift;
</pre>
diff --git a/doc/todo/modify_page_filename_in_plugin.mdwn b/doc/todo/modify_page_filename_in_plugin.mdwn
index 7c0a909eb..4099487a1 100644
--- a/doc/todo/modify_page_filename_in_plugin.mdwn
+++ b/doc/todo/modify_page_filename_in_plugin.mdwn
@@ -10,7 +10,7 @@ My solution is to allow plugins to provide a hook that sets the pagename. --[[/u
+++ /usr/share/perl5/IkiWiki.pm 2008-10-07 11:57:26.000000000 -0400
@@ -196,11 +196,32 @@
- sub pagename ($) { #{{{
+ sub pagename ($) {
my $file=shift;
my $type=pagetype($file);
@@ -27,7 +27,7 @@ My solution is to allow plugins to provide a hook that sets the pagename. --[[/u
$page=~s/\Q.$type\E*$// if defined $type;
return $page;
+ }
- } #}}}
+ }
- sub htmlpage ($) { #{{{
+ sub htmlpage ($) {
diff --git a/doc/todo/need_global_renamepage_hook.mdwn b/doc/todo/need_global_renamepage_hook.mdwn
new file mode 100644
index 000000000..8265497ae
--- /dev/null
+++ b/doc/todo/need_global_renamepage_hook.mdwn
@@ -0,0 +1,53 @@
+As documented in [[plugins/write]], the current `renamepage` hook is
+heavily oriented towards updating links in pages' content: it is run
+once per page linking to the renamed page.
+
+That's fine, but it can't be used to trigger more general actions on
+page rename. E.g. it won't be run at all if the page being renamed is
+an orphan one.
+
+This is a real issue for the [[plugins/contrib/po]] development: what
+I'm about to achieve is:
+
+- when a master page is renamed, the plugin takes notice of it (using
+ the `rename` hook), and later renames the translation pages
+ accordingly (in the `change` hook)
+- when a master page is deleted, the plugin deletes its translations
+ (using the `delete` hook)
+
+With the current `renamepage` hook behavior, combining these two goals
+has an annoying drawback: a plugin can't notice an orphan master page
+has been renamed, so instead of renaming (and preserving) its
+translations, it considers the oldpage as deleted, and deletes its
+translations. Game over.
+
+It may seem like a corner case, but I want to be very careful when
+deleting files automatically in `srcdir`, which is not always under
+version control.
+
+As an sad workaround, I can still disable any deletion in `srcdir`
+when it is not under version control. But I think ikiwiki deserves
+a global `renamepage` hook that would be run once per rename
+operation.
+
+My proposal is thus:
+
+- keep the documented `renamepage` hook as it is
+- use something inspired by the trick `preprocess` uses: when `hook`
+ is passed an optional "global" parameter, set to a true value, the
+ declared `renamepage` hook is run once per rename operation, and is
+ passed named parameters: `src`, `srcfile`, `dest` and `destfile`.
+
+I'm of course volunteering to implement this, or anything related that
+would solve my problem. Hmmm? --[[intrigeri]]
+
+> I think it would be better to have a different hook that is called for
+> renames, since the two hook actions are very different (unlike the
+> preprocess hook, which does a very similar thing in scan mode).
+>
+> Just calling it `rename` seems like a reasonable name, by analogy with
+> the `delete` and `change` hooks.
+>
+> It might make sense to rename `renamepage` to `renamelink` to make it
+> clearer what it does. (I'm not very worried about this breaking things, at
+> this point.) --[[Joey]]
diff --git a/doc/todo/pagespec_relative_to_a_target.mdwn b/doc/todo/pagespec_relative_to_a_target.mdwn
index f7b248670..4757988e0 100644
--- a/doc/todo/pagespec_relative_to_a_target.mdwn
+++ b/doc/todo/pagespec_relative_to_a_target.mdwn
@@ -57,7 +57,7 @@ diff -urNX ignorepats ikiwiki/IkiWiki/Plugin/relative.pm ikidev/IkiWiki/Plugin/r
+
+package IkiWiki::PageSpec;
+
-+sub match_relative($$;@) { #{{{
++sub match_relative($$;@) {
+ my $parent = shift;
+ my $spec = shift;
+ my %params = @_;
@@ -69,21 +69,21 @@ diff -urNX ignorepats ikiwiki/IkiWiki/Plugin/relative.pm ikidev/IkiWiki/Plugin/r
+ }
+ }
+ return IkiWiki::FailReason->new("$parent can't match $spec against anything");
-+} #}}}
++}
+
-+sub match_has_child($$;@) { #{{{
++sub match_has_child($$;@) {
+ my $page = shift;
+ my $childname = shift;
+ my $spec;
-+ if ($childname) { #{{{
++ if ($childname) {
+ $spec = "$page/$childname or $page/*/$childname";
-+ } #}}}
-+ else { #{{{
++ }
++ else {
+ $spec = "$page/*";
-+ } #}}}
++ }
+
+ return match_relative($page, $spec, @_);
-+} #}}}
++}
+
+1
</pre>
diff --git a/doc/todo/provide_sha1_for_git_diffurl.mdwn b/doc/todo/provide_sha1_for_git_diffurl.mdwn
index 9c8b340de..01aa512f8 100644
--- a/doc/todo/provide_sha1_for_git_diffurl.mdwn
+++ b/doc/todo/provide_sha1_for_git_diffurl.mdwn
@@ -10,7 +10,7 @@ diffurls of the following form:
index 5bef928..164210d 100644
--- a/IkiWiki/Plugin/git.pm
+++ b/IkiWiki/Plugin/git.pm
- @@ -518,6 +518,7 @@ sub rcs_recentchanges ($) { #{{{
+ @@ -518,6 +518,7 @@ sub rcs_recentchanges ($) {
my $diffurl = defined $config{'diffurl'} ? $config{'diffurl'} : "";
$diffurl =~ s/\[\[file\]\]/$file/go;
diff --git a/doc/todo/replace_HTML::Template_with_Template_Toolkit.mdwn b/doc/todo/replace_HTML::Template_with_Template_Toolkit.mdwn
index dfeacbabd..3b9f6c0fd 100644
--- a/doc/todo/replace_HTML::Template_with_Template_Toolkit.mdwn
+++ b/doc/todo/replace_HTML::Template_with_Template_Toolkit.mdwn
@@ -54,3 +54,5 @@ the templates. I'd prefer not having to touch Perl though...
-----
Yes, Template::Toolkit is very powerful. But I think it's somehow overkill for a wiki. HTML::Template can keep things simple, though. --[weakish](http://weakish.int.eu.org/blog/)
+
+I'd have to agree that Template::Toolkit is overkill and personally I'm not a fan, but it is very popular (there is even a book) and the new version (3) is alleged to be much more nimble than current version. --[[ajt]]
diff --git a/doc/todo/require_CAPTCHA_to_edit.mdwn b/doc/todo/require_CAPTCHA_to_edit.mdwn
index 110b4167f..83ba07eb0 100644
--- a/doc/todo/require_CAPTCHA_to_edit.mdwn
+++ b/doc/todo/require_CAPTCHA_to_edit.mdwn
@@ -91,15 +91,15 @@ ignored.
--- a/IkiWiki/Plugin/openid.pm
+++ b/IkiWiki/Plugin/openid.pm
-@@ -18,6 +18,7 @@ sub getopt () { #{{{
+@@ -18,6 +18,7 @@ sub getopt () {
error($@) if $@;
Getopt::Long::Configure('pass_through');
GetOptions("openidsignup=s" => \$config{openidsignup});
+ GetOptions("openidneedscaptcha=s" => \$config{openidneedscaptcha});
- } #}}}
+ }
- sub formbuilder_setup (@) { #{{{
-@@ -61,6 +62,7 @@ sub formbuilder_setup (@) { #{{{
+ sub formbuilder_setup (@) {
+@@ -61,6 +62,7 @@ sub formbuilder_setup (@) {
# Skip all other required fields in this case.
foreach my $field ($form->field) {
next if $field eq "openid_url";
@@ -107,7 +107,7 @@ ignored.
$form->field(name => $field, required => 0,
validate => '/.*/');
}
-@@ -96,6 +98,18 @@ sub validate ($$$;$) { #{{{
+@@ -96,6 +98,18 @@ sub validate ($$$;$) {
}
}
@@ -152,19 +152,19 @@ use warnings;
use strict;
use IkiWiki 2.00;
-sub import { #{{{
+sub import {
hook(type => "formbuilder_setup", id => "recaptcha", call => \&formbuilder_setup);
-} # }}}
+}
-sub getopt () { #{{{
+sub getopt () {
eval q{use Getopt::Long};
error($@) if $@;
Getopt::Long::Configure('pass_through');
GetOptions("reCaptchaPubKey=s" => \$config{reCaptchaPubKey});
GetOptions("reCaptchaPrivKey=s" => \$config{reCaptchaPrivKey});
-} #}}}
+}
-sub formbuilder_setup (@) { #{{{
+sub formbuilder_setup (@) {
my %params=@_;
my $form=$params{form};
@@ -274,7 +274,7 @@ EOTAGS
});
}
}
-} # }}}
+}
# The following function is borrowed from
# Captcha::reCAPTCHA by Andy Armstrong and are under the PERL Artistic License
diff --git a/doc/todo/source_link.mdwn b/doc/todo/source_link.mdwn
index 93791c81a..b051361a8 100644
--- a/doc/todo/source_link.mdwn
+++ b/doc/todo/source_link.mdwn
@@ -1,6 +1,6 @@
How about a direct link from the page header to the source of the latest version, to avoid the need to either use edit or navigate to the current version via the history link?
- I'd like this too (and might try to implement it). -- [[jondowland]]
+ I'd like this too (and might try to implement it). -- [[users/jon]]
I just implemented this. There is one [[patch]] to the default page template, and a new plugin. -- [[Will]]
@@ -31,13 +31,13 @@ I just implemented this. There is one [[patch]] to the default page template, a
use IkiWiki;
use open qw{:utf8 :std};
- sub import { #{{{
+ sub import {
hook(type => "getsetup", id => "getsource", call => \&getsetup);
hook(type => "pagetemplate", id => "getsource", call => \&pagetemplate);
hook(type => "sessioncgi", id => "getsource", call => \&cgi_getsource);
- } # }}}
+ }
- sub getsetup () { #{{{
+ sub getsetup () {
return
plugin => {
safe => 1,
@@ -50,9 +50,9 @@ I just implemented this. There is one [[patch]] to the default page template, a
safe => 1,
rebuild => 0,
},
- } #}}}
+ }
- sub pagetemplate (@) { #{{{
+ sub pagetemplate (@) {
my %params=@_;
my $page=$params{page};
@@ -62,9 +62,9 @@ I just implemented this. There is one [[patch]] to the default page template, a
$template->param(getsourceurl => IkiWiki::cgiurl(do => "getsource", page => $page));
$template->param(have_actions => 1);
}
- } # }}}
+ }
- sub cgi_getsource ($$) { #{{{
+ sub cgi_getsource ($$) {
my $cgi=shift;
my $session=shift;
diff --git a/doc/todo/structured_page_data.mdwn b/doc/todo/structured_page_data.mdwn
index 2a196ed23..22f67cc0a 100644
--- a/doc/todo/structured_page_data.mdwn
+++ b/doc/todo/structured_page_data.mdwn
@@ -257,21 +257,21 @@ in a large number of other cases.
use CGI::FormBuilder;
use IkiWiki 2.00;
- sub import { #{{{
+ sub import {
hook(type => "getsetup", id => "form", call => \&getsetup);
hook(type => "htmlize", id => "form", call => \&htmlize);
hook(type => "sessioncgi", id => "form", call => \&cgi_submit);
- } # }}}
+ }
- sub getsetup () { #{{{
+ sub getsetup () {
return
plugin => {
safe => 1,
rebuild => 1, # format plugin
},
- } #}}}
+ }
- sub makeFormFromYAML ($$$) { #{{{
+ sub makeFormFromYAML ($$$) {
my $page = shift;
my $YAMLString = shift;
my $q = shift;
@@ -350,9 +350,9 @@ in a large number of other cases.
# IkiWiki::decode_form_utf8($form);
return $form;
- } #}}}
+ }
- sub htmlize (@) { #{{{
+ sub htmlize (@) {
my %params=@_;
my $content = $params{content};
my $page = $params{page};
@@ -360,9 +360,9 @@ in a large number of other cases.
my $form = makeFormFromYAML($page, $content, undef);
return $form->render(submit => 'Update Form');
- } # }}}
+ }
- sub cgi_submit ($$) { #{{{
+ sub cgi_submit ($$) {
my $q=shift;
my $session=shift;
@@ -425,11 +425,11 @@ in a large number of other cases.
}
exit;
- } #}}}
+ }
package IkiWiki::PageSpec;
- sub match_form_eq ($$;@) { #{{{
+ sub match_form_eq ($$;@) {
my $page=shift;
my $argSet=shift;
my @args=split(/,/, $argSet);
@@ -460,7 +460,7 @@ in a large number of other cases.
} else {
return IkiWiki::FailReason->new("field value does not match");
}
- } #}}}
+ }
1
@@ -476,22 +476,22 @@ in a large number of other cases.
my $inTable = 0;
- sub import { #{{{
+ sub import {
hook(type => "getsetup", id => "data", call => \&getsetup);
hook(type => "needsbuild", id => "data", call => \&needsbuild);
hook(type => "preprocess", id => "data", call => \&preprocess, scan => 1);
hook(type => "preprocess", id => "datatable", call => \&preprocess_table, scan => 1); # does this need scan?
- } # }}}
+ }
- sub getsetup () { #{{{
+ sub getsetup () {
return
plugin => {
safe => 1,
rebuild => 1, # format plugin
},
- } #}}}
+ }
- sub needsbuild (@) { #{{{
+ sub needsbuild (@) {
my $needsbuild=shift;
foreach my $page (keys %pagestate) {
if (exists $pagestate{$page}{data}) {
@@ -506,7 +506,7 @@ in a large number of other cases.
}
}
- sub preprocess (@) { #{{{
+ sub preprocess (@) {
my @argslist = @_;
my %params=@argslist;
@@ -546,9 +546,9 @@ in a large number of other cases.
}
return $html;
- } # }}}
+ }
- sub preprocess_table (@) { #{{{
+ sub preprocess_table (@) {
my %params=@_;
my @lines;
@@ -568,11 +568,11 @@ in a large number of other cases.
push @lines, '</table>';
return join("\n", @lines);
- } #}}}
+ }
package IkiWiki::PageSpec;
- sub match_data_eq ($$;@) { #{{{
+ sub match_data_eq ($$;@) {
my $page=shift;
my $argSet=shift;
my @args=split(/,/, $argSet);
@@ -592,9 +592,9 @@ in a large number of other cases.
} else {
return IkiWiki::FailReason->new("value does not match");
}
- } #}}}
+ }
- sub match_data_link ($$;@) { #{{{
+ sub match_data_link ($$;@) {
my $page=shift;
my $argSet=shift;
my @params=@_;
@@ -618,6 +618,6 @@ in a large number of other cases.
}
return IkiWiki::FailReason->new("No data link on page $page with key $key matches glob $value");
- } #}}}
+ }
1
diff --git a/doc/todo/support_creole_markup.mdwn b/doc/todo/support_creole_markup.mdwn
index b0ebf5b9e..5a1e1286d 100644
--- a/doc/todo/support_creole_markup.mdwn
+++ b/doc/todo/support_creole_markup.mdwn
@@ -12,7 +12,7 @@ And there is a perl module: Text::WikiCreole
Syntax file for vim: http://www.peter-hoffmann.com/code/vim/ (Since a typical ikiwiki user usually use external editors. :))
-> Should be pretty easy to add a plugin to do it using [[cpan
+> Should be pretty easy to add a plugin to do it using [[!cpan
> Text::WikiCreole]]. --[[Joey]]
[[done]]
diff --git a/doc/todo/supporting_comments_via_disussion_pages.mdwn b/doc/todo/supporting_comments_via_disussion_pages.mdwn
index e0495c8c2..aae0b3008 100644
--- a/doc/todo/supporting_comments_via_disussion_pages.mdwn
+++ b/doc/todo/supporting_comments_via_disussion_pages.mdwn
@@ -91,14 +91,14 @@ Each comment is processed to something like this:
use strict;
use IkiWiki '1.02';
- sub import { #{{{
+ sub import {
hook(type => "formbuilder_setup", id => "comments",
call => \&formbuilder_setup);
hook(type => "preprocess", id => "blogcomment",
call => \&preprocess);
- } # }}}
+ }
- sub formbuilder_setup (@) { #{{{
+ sub formbuilder_setup (@) {
my %params=@_;
my $cgi = $params{cgi};
my $form = $params{form};
@@ -138,9 +138,9 @@ Each comment is processed to something like this:
$content.=qq{[[!blogcomment from="""$name""" timestamp="""$timestamp""" subject="""$subject""" text="""$comment"""]]\n\n};
$content=~s/\n/\r\n/g;
$form->field(name => "editcontent", value => $content, force => 1);
- } # }}}
+ }
- sub preprocess (@) { #{{{
+ sub preprocess (@) {
my %params=@_;
my ($text, $date, $from, $subject, $r);
@@ -159,7 +159,7 @@ Each comment is processed to something like this:
$r .= "</dl>\n" . $text . "</div>\n";
return $r;
- } # }}}
+ }
1;
@@ -213,3 +213,8 @@ do you think so far? Known issues include:
un-wikiish).
--[[smcv]]
+
+I've updated smcvpostcomment and publicised it as [[plugins/contrib/comments]]. --[[smcv]]
+
+> While there is still room for improvement and entirely other approaches,
+> I am calling this done since smcv's comments plugin is ready. --[[Joey]]
diff --git a/doc/todo/syntax_highlighting.mdwn b/doc/todo/syntax_highlighting.mdwn
index 2bdeb62be..d9a791c6f 100644
--- a/doc/todo/syntax_highlighting.mdwn
+++ b/doc/todo/syntax_highlighting.mdwn
@@ -7,16 +7,16 @@ pages, as well as doing syntax highlighting as a preprocessor directive
## The big list of possibilities
-* [[plugins/contrib/highlightcode]] uses [[cpan Syntax::Highlight::Engine::Kate]],
+* [[plugins/contrib/highlightcode]] uses [[!cpan Syntax::Highlight::Engine::Kate]],
operates on whole source files only, has a few bugs (see
[here](http://u32.net/Highlight_Code_Plugin/), and needs to be updated to
support [[bugs/multiple_pages_with_same_name]].
-* [[cpan IkiWiki-Plugin-syntax]] only operates as a directive.
+* [[!cpan IkiWiki-Plugin-syntax]] only operates as a directive.
Interestingly, it supports multiple highlighting backends, including Kate
and Vim.
* [[plugins/contrib/syntax]] only operates as a directive
([[not_on_source_code_files|automatic_use_of_syntax_plugin_on_source_code_files]]),
- and uses [[cpan Text::VimColor]].
+ and uses [[!cpan Text::VimColor]].
* [[plugins/contrib/sourcehighlight]] uses src-highlight, and operates on
whole source files only. Needs to be updated to
support [[bugs/multiple_pages_with_same_name]].
@@ -43,7 +43,7 @@ pages, as well as doing syntax highlighting as a preprocessor directive
inside source files. Doing this probably means post-processing the
results of the highlighting engine, to find places where it's highlighted
comments, and then running them through the ikiwiki rendering pipeline.
- This seems fairly doable with [[cpan Syntax::Highlight::Engine::Kate]],
+ This seems fairly doable with [[!cpan Syntax::Highlight::Engine::Kate]],
at least.
* The whole-file plugins tend to have a problem that things that look like
wikilinks in the source code get munged into links by ikiwiki, which can
@@ -90,7 +90,7 @@ like this:
index 8d728c9..1bd46a9 100644
--- a/IkiWiki.pm
+++ b/IkiWiki.pm
- @@ -618,6 +618,8 @@ sub pagetype ($) { #{{{
+ @@ -618,6 +618,8 @@ sub pagetype ($) {
if ($page =~ /\.([^.]+)$/) {
return $1 if exists $hooks{htmlize}{$1};
@@ -98,7 +98,7 @@ like this:
+ return $page;
}
return;
- } #}}}
+ }
## format directive
diff --git a/doc/todo/tidy_git__39__s_ctime_debug_output.mdwn b/doc/todo/tidy_git__39__s_ctime_debug_output.mdwn
index aaa040ec7..bfc130d69 100644
--- a/doc/todo/tidy_git__39__s_ctime_debug_output.mdwn
+++ b/doc/todo/tidy_git__39__s_ctime_debug_output.mdwn
@@ -10,6 +10,6 @@
+ debug("ctime for '$file': ". localtime($ctime));
return $ctime;
- } #}}}
+ }
[[!tag patch done]]
diff --git a/doc/todo/tmplvars_plugin.mdwn b/doc/todo/tmplvars_plugin.mdwn
index f7d06a579..644cf23aa 100644
--- a/doc/todo/tmplvars_plugin.mdwn
+++ b/doc/todo/tmplvars_plugin.mdwn
@@ -11,12 +11,12 @@ A simple plugin to allow per-page customization of a template by passing paramat
my %tmplvars;
- sub import { #{{{
+ sub import {
hook(type => "preprocess", id => "tmplvars", call => \&preprocess);
hook(type => "pagetemplate", id => "tmplvars", call => \&pagetemplate);
- } # }}}
+ }
- sub preprocess (@) { #{{{
+ sub preprocess (@) {
my %params=@_;
if ($params{page} eq $params{destpage}) {
@@ -34,9 +34,9 @@ A simple plugin to allow per-page customization of a template by passing paramat
}
}
- } # }}}
+ }
- sub pagetemplate (@) { #{{{
+ sub pagetemplate (@) {
my %params=@_;
my $template = $params{template};
@@ -47,6 +47,6 @@ A simple plugin to allow per-page customization of a template by passing paramat
}
return undef;
- } # }}}
+ }
1
diff --git a/doc/todo/toc_plugin:_set_a_header_ceiling___40__opposite_of_levels__61____41__.mdwn b/doc/todo/toc_plugin:_set_a_header_ceiling___40__opposite_of_levels__61____41__.mdwn
new file mode 100644
index 000000000..547c7a80a
--- /dev/null
+++ b/doc/todo/toc_plugin:_set_a_header_ceiling___40__opposite_of_levels__61____41__.mdwn
@@ -0,0 +1,3 @@
+It would be nice if the [[plugins/toc]] plugin let you specify a header level "ceiling" above which (or above and including which) the headers would not be incorporated into the toc.
+
+Currently, the levels=X parameter lets you tweak how deep it will go for small headers, but I'd like to chop off the h1's (as I use them for my page title) -- [[Jon]]
diff --git a/doc/todo/tracking_bugs_with_dependencies.mdwn b/doc/todo/tracking_bugs_with_dependencies.mdwn
index 3af0458bd..2832e37aa 100644
--- a/doc/todo/tracking_bugs_with_dependencies.mdwn
+++ b/doc/todo/tracking_bugs_with_dependencies.mdwn
@@ -194,9 +194,9 @@ account all comments above (which doesn't mean it is above reproach :) ). --[[W
index 4e4da11..8b3cdfe 100644
--- a/IkiWiki.pm
+++ b/IkiWiki.pm
- @@ -1550,7 +1550,16 @@ sub globlist_to_pagespec ($) { #{{{
+ @@ -1550,7 +1550,16 @@ sub globlist_to_pagespec ($) {
- sub is_globlist ($) { #{{{
+ sub is_globlist ($) {
my $s=shift;
- return ( $s =~ /[^\s]+\s+([^\s]+)/ && $1 ne "and" && $1 ne "or" );
+ return ! ($s =~ /
@@ -209,19 +209,19 @@ account all comments above (which doesn't mean it is above reproach :) ). --[[W
+ ) |
+ (\s and \s) | (\s or \s) # or we find 'and' or 'or' somewhere
+ /xs);
- } #}}}
+ }
- sub safequote ($) { #{{{
- @@ -1631,7 +1640,7 @@ sub pagespec_merge ($$) { #{{{
+ sub safequote ($) {
+ @@ -1631,7 +1640,7 @@ sub pagespec_merge ($$) {
return "($a) or ($b)";
- } #}}}
+ }
- -sub pagespec_translate ($) { #{{{
- +sub pagespec_makeperl ($) { #{{{
+ -sub pagespec_translate ($) {
+ +sub pagespec_makeperl ($) {
my $spec=shift;
# Support for old-style GlobLists.
- @@ -1650,12 +1659,14 @@ sub pagespec_translate ($) { #{{{
+ @@ -1650,12 +1659,14 @@ sub pagespec_translate ($) {
|
\) # )
|
@@ -238,7 +238,7 @@ account all comments above (which doesn't mean it is above reproach :) ). --[[W
my $word=$1;
if (lc $word eq 'and') {
$code.=' &&';
- @@ -1666,16 +1677,23 @@ sub pagespec_translate ($) { #{{{
+ @@ -1666,16 +1677,23 @@ sub pagespec_translate ($) {
elsif ($word eq "(" || $word eq ")" || $word eq "!") {
$code.=' '.$word;
}
@@ -265,14 +265,14 @@ account all comments above (which doesn't mean it is above reproach :) ). --[[W
}
}
- @@ -1683,8 +1701,18 @@ sub pagespec_translate ($) { #{{{
+ @@ -1683,8 +1701,18 @@ sub pagespec_translate ($) {
$code=0;
}
+ return 'sub { my $page=shift; my %params = @_; '.$code.' }';
- +} #}}}
+ +}
+
- +sub pagespec_translate ($) { #{{{
+ +sub pagespec_translate ($) {
+ my $spec=shift;
+
+ my $code = pagespec_makeperl($spec);
@@ -282,19 +282,19 @@ account all comments above (which doesn't mean it is above reproach :) ). --[[W
no warnings;
- return eval 'sub { my $page=shift; '.$code.' }';
+ return eval $code;
- } #}}}
+ }
- sub pagespec_match ($$;@) { #{{{
- @@ -1699,7 +1727,7 @@ sub pagespec_match ($$;@) { #{{{
+ sub pagespec_match ($$;@) {
+ @@ -1699,7 +1727,7 @@ sub pagespec_match ($$;@) {
my $sub=pagespec_translate($spec);
return IkiWiki::FailReason->new("syntax error in pagespec \"$spec\"") if $@;
- return $sub->($page, @params);
+ return $sub->($page, @params, specFuncs => {});
- } #}}}
+ }
- sub pagespec_valid ($) { #{{{
- @@ -1748,11 +1776,78 @@ sub new { #{{{
+ sub pagespec_valid ($) {
+ @@ -1748,11 +1776,78 @@ sub new {
package IkiWiki::PageSpec;
@@ -361,7 +361,7 @@ account all comments above (which doesn't mean it is above reproach :) ). --[[W
+ }
+}
+
- sub match_glob ($$;@) { #{{{
+ sub match_glob ($$;@) {
my $page=shift;
my $glob=shift;
my %params=@_;
@@ -373,9 +373,9 @@ account all comments above (which doesn't mean it is above reproach :) ). --[[W
my $from=exists $params{location} ? $params{location} : '';
# relative matching
- @@ -1782,11 +1877,12 @@ sub match_internal ($$;@) { #{{{
+ @@ -1782,11 +1877,12 @@ sub match_internal ($$;@) {
- sub match_link ($$;@) { #{{{
+ sub match_link ($$;@) {
my $page=shift;
- my $link=lc(shift);
+ my $fulllink=shift;
@@ -388,7 +388,7 @@ account all comments above (which doesn't mean it is above reproach :) ). --[[W
# relative matching
if ($link =~ m!^\.! && defined $from) {
$from=~s#/?[^/]+$##;
- @@ -1804,19 +1900,32 @@ sub match_link ($$;@) { #{{{
+ @@ -1804,19 +1900,32 @@ sub match_link ($$;@) {
}
else {
return IkiWiki::SuccessReason->new("$page links to page $p matching $link")
@@ -397,9 +397,9 @@ account all comments above (which doesn't mean it is above reproach :) ). --[[W
}
}
return IkiWiki::FailReason->new("$page does not link to $link");
- } #}}}
+ }
- sub match_backlink ($$;@) { #{{{
+ sub match_backlink ($$;@) {
- return match_link($_[1], $_[0], @_);
+ my $page=shift;
+ my $backlink=shift;
@@ -410,9 +410,9 @@ account all comments above (which doesn't mean it is above reproach :) ). --[[W
+ }
+
+ return match_link($backlink, $page, @params);
- } #}}}
+ }
- sub match_created_before ($$;@) { #{{{
+ sub match_created_before ($$;@) {
my $page=shift;
my $testpage=shift;
+ my @params=@_;
@@ -423,8 +423,8 @@ account all comments above (which doesn't mean it is above reproach :) ). --[[W
if (exists $IkiWiki::pagectime{$testpage}) {
if ($IkiWiki::pagectime{$page} < $IkiWiki::pagectime{$testpage}) {
- @@ -1834,6 +1943,11 @@ sub match_created_before ($$;@) { #{{{
- sub match_created_after ($$;@) { #{{{
+ @@ -1834,6 +1943,11 @@ sub match_created_before ($$;@) {
+ sub match_created_after ($$;@) {
my $page=shift;
my $testpage=shift;
+ my @params=@_;
diff --git a/doc/todo/turn_edittemplate_verbosity_off_by_default.mdwn b/doc/todo/turn_edittemplate_verbosity_off_by_default.mdwn
index 87e55685c..14bb43782 100644
--- a/doc/todo/turn_edittemplate_verbosity_off_by_default.mdwn
+++ b/doc/todo/turn_edittemplate_verbosity_off_by_default.mdwn
@@ -8,7 +8,7 @@ I think this (untested) patch might just do the trick:
--- a/IkiWiki/Plugin/edittemplate.pm
+++ b/IkiWiki/Plugin/edittemplate.pm
- @@ -46,8 +46,13 @@ sub preprocess (@) { #{{{
+ @@ -46,8 +46,13 @@ sub preprocess (@) {
$pagestate{$params{page}}{edittemplate}{$params{match}}=$params{template};
@@ -21,9 +21,9 @@ I think this (untested) patch might just do the trick:
+ else {
+ return '';
+ }
- } # }}}
+ }
- sub formbuilder (@) { #{{{
+ sub formbuilder (@) {
--[[madduck]]
diff --git a/doc/todo/using_meta_titles_for_parentlinks.html b/doc/todo/using_meta_titles_for_parentlinks.html
index d04e5a300..6da40a415 100644
--- a/doc/todo/using_meta_titles_for_parentlinks.html
+++ b/doc/todo/using_meta_titles_for_parentlinks.html
@@ -82,9 +82,9 @@ diff -c /usr/share/perl5/IkiWiki/Plugin/meta.pm.distrib /usr/share/perl5/IkiWiki
*** 289,294 ****
--- 290,319 ----
}
- } #}}}
+ }
-+ sub IkiWiki::pagetitle ($;$) { #{{{
++ sub IkiWiki::pagetitle ($;$) {
+ my $page=shift;
+ my $unescaped=shift;
+
@@ -106,11 +106,11 @@ diff -c /usr/share/perl5/IkiWiki/Plugin/meta.pm.distrib /usr/share/perl5/IkiWiki
+ }
+
+ return $page;
-+ } #}}}
++ }
+
package IkiWiki::PageSpec;
- sub match_title ($$;@) { #{{{
+ sub match_title ($$;@) {
</pre>
diff --git a/doc/todo/varioki_--_add_template_variables___40__with_closures_for_values__41___in_ikiwiki.setup.mdwn b/doc/todo/varioki_--_add_template_variables___40__with_closures_for_values__41___in_ikiwiki.setup.mdwn
index 492a32b36..b28469993 100644
--- a/doc/todo/varioki_--_add_template_variables___40__with_closures_for_values__41___in_ikiwiki.setup.mdwn
+++ b/doc/todo/varioki_--_add_template_variables___40__with_closures_for_values__41___in_ikiwiki.setup.mdwn
@@ -157,9 +157,9 @@ ManojSrivastava
+=cut
+
+
-+sub import { #{{{
++sub import {
+ hook(type => "pagetemplate", id => "varioki", call => \&pagetemplate);
-+} # }}}
++}
+
+
+=pod
@@ -175,7 +175,7 @@ ManojSrivastava
+
+=cut
+
-+sub pagetemplate (@) { #{{{
++sub pagetemplate (@) {
+ my %params=@_;
+ my $page=$params{page};
+ my $template=$params{template};
@@ -207,7 +207,7 @@ ManojSrivastava
+ $template->param("$var" =>"$value");
+ }
+ }
-+} # }}}
++}
+
+1;
+
diff --git a/doc/users/StevenBlack.mdwn b/doc/users/StevenBlack.mdwn
new file mode 100644
index 000000000..ea7a6a97a
--- /dev/null
+++ b/doc/users/StevenBlack.mdwn
@@ -0,0 +1,5 @@
+It feels like there are a lot of people named Steven Black. While I'm just one of many with my name, sometimes it is actually just me and I've forgotten that I had an account somewhere.
+
+I'm not a doctor, though I would certainly trust any doctor, dentist, or philosopher named Steven Black. (There are several.)
+
+I *am* a huge Ikiwiki fan. I've had my eye on it for many years for personal projects (though I never quite got around to installing it). Recently, however, I managed to convince my coworkers that it would be a good idea for an internal wiki. Boy was I right. The thing is practically designed to be the perfect developer-centered wiki.
diff --git a/doc/users/ajt.mdwn b/doc/users/ajt.mdwn
new file mode 100644
index 000000000..bc47040b6
--- /dev/null
+++ b/doc/users/ajt.mdwn
@@ -0,0 +1,20 @@
+[[!meta title="Adam Trickett"]]
+
+# Adam Trickett
+
+## "ajt"
+
+I'm a long time hacker of sorts, I like to program in Perl on Debian systems but work pays me to program in ABAP (COBOL) on SAP.
+
+I like wikis and I'm currently in love with ikiwiki, having moved my home intranet from a home made template solution to ikiwiki over a weekend. I'm using ikiwiki more like a web content management system (e.g. RedDot) rather than a traditional wiki.
+
+### My Links
+
+* [iredale dot net](http://www.iredale.net/) my web server and main blog
+* [ajt](http://www.perlmonks.org/index.pl?node_id=113686) my Perkmonks home node
+* [ajt](http://use.perl.org/~ajt) my use Perl home
+* [ATRICKETT](http://search.cpan.org/~atrickett/) my CPAN folder
+* [ajt](http://www.debian-administration.org/users/ajt) my Debian-Administration home (good site btw)
+* [drajt](http://www.linkedin.com/in/drajt) my LinkedIn profile
+* [drajt](http://www.slideshare.net/drajt) my "Slidespace" on SlideShare
+* [AdamTrickett](http://www.hants.lug.org.uk/cgi-bin/wiki.pl?AdamTrickett) my wiki page on my LUG's site
diff --git a/doc/users/jondowland.mdwn b/doc/users/jon.mdwn
index 8bfa3dd76..3e22ded1d 100644
--- a/doc/users/jondowland.mdwn
+++ b/doc/users/jon.mdwn
@@ -1,7 +1,10 @@
+[[!meta title="Jon Dowland"]]
I'm looking at ikiwiki both for my personal site but also as a
team-documentation management system for a small-sized group of UNIX
sysadmins.
+* my edits should appear either as 'Jon' (if I've used
+ [[tips/untrusted_git_push]]) or 'alcopop.org/me/openid/'.
* My [homepage](http://jmtd.net/) is powered by ikiwiki (replacing my [older homepage](http://alcopop.org/), which was a mess of scripts)
I gave a talk at the [UK UNIX User's Group](http://www.ukuug.org/) annual
diff --git a/doc/users/smcv.mdwn b/doc/users/smcv.mdwn
index 33ae450b2..c52aa8f0f 100644
--- a/doc/users/smcv.mdwn
+++ b/doc/users/smcv.mdwn
@@ -1 +1,10 @@
-I'm trying to add enough features/fix enough bugs to convert [smcv.pseudorandom.co.uk](http://smcv.pseudorandom.co.uk/) from Django + Python + misc hacks to ikiwiki.
+Website: [pseudorandom.co.uk](http://www.pseudorandom.co.uk/)
+
+Blog: [smcv.pseudorandom.co.uk](http://smcv.pseudorandom.co.uk/)
+
+My repository containing ikiwiki branches:
+
+* gitweb: http://git.pseudorandom.co.uk/smcv/ikiwiki.git
+* anongit: git://git.pseudorandom.co.uk/git/smcv/ikiwiki.git
+
+Currently working on the [[plugins/contrib/comments]] plugin.
diff --git a/doc/users/weakishjiang.mdwn b/doc/users/weakishjiang.mdwn
new file mode 100644
index 000000000..0cafb4653
--- /dev/null
+++ b/doc/users/weakishjiang.mdwn
@@ -0,0 +1,4 @@
+[My blog](http://millenniumdark.blog.ubuntu.org.cn)
+
+> So, you're learning haskell. You know, I want to add support for haskell
+> external plugins to ikiwiki.. :-) --[[Joey]]
diff --git a/doc/users/xma.mdwn b/doc/users/xma.mdwn
index 97a8ef869..89f2ff74c 100644
--- a/doc/users/xma.mdwn
+++ b/doc/users/xma.mdwn
@@ -9,7 +9,7 @@ Anyway, [[ikiwiki]] is really *awesome* !
## More about me
-I am CLI user living in the linux console. More precisely, I live in an [[GNU Emacs]] frame all day long. My main computer is an EeePC 901 running Slackware GNU/Linux 12.1. I do not have X installed (too lazy) but when in X, I am running an instance of [[CLFSWM]].
+I am CLI user living in the linux console. More precisely, I live in an [[GNU_Emacs]] frame all day long. My main computer is an EeePC 901 running Slackware GNU/Linux 12.1. I do not have X installed (too lazy) but when in X, I am running an instance of [[CLFSWM]].
## Contacting me
diff --git a/doc/wikitemplates.mdwn b/doc/wikitemplates.mdwn
index babd70211..dc217cd30 100644
--- a/doc/wikitemplates.mdwn
+++ b/doc/wikitemplates.mdwn
@@ -29,6 +29,10 @@ located in /usr/share/ikiwiki/templates by default.
form to wiki pages.
* `searchquery.tmpl` - This is an omega template, used by the
[[plugins/search]] plugin.
+* `comment.tmpl` - This template is used to display a comment
+ by the [[plugins/comments]] plugin.
+* `editcomment.tmpl` - This template is the comment post form for the
+ [[plugins/comments]] plugin.
The [[plugins/pagetemplate]] plugin can allow individual pages to use a
different template than `page.tmpl`.
diff --git a/gitremotes b/gitremotes
new file mode 100755
index 000000000..7b9484dd1
--- /dev/null
+++ b/gitremotes
@@ -0,0 +1,29 @@
+#!/usr/bin/perl
+# Parses list of remotes in doc/git.mdwn, configures git to use them
+# all, and fetches updates from them.
+
+my $error=0;
+
+open (IN, "doc/git.mdwn") || die "doc/git.mdwn: $!";
+while (<IN>) {
+ if (/^\*\s+\[?\[?(\w+)\]?\]?\s+`([^>]+)`/) {
+ # note that the remote name has to be a simple word (\w)
+ # for security/sanity reasons
+ my $remote=$1;
+ my $url=$2;
+
+ # check configured url to deal with it changing
+ my $info=`git remote show -n $remote`;
+ my ($oldurl)=$info=~/URL: (.*)/m;
+ if ($oldurl ne $url) {
+ system("git remote rm $remote 2>/dev/null");
+ $error |= system("git", "remote", "add", "-f", $remote, $url);
+ }
+ else {
+ $error |= system("git", "fetch", $remote);
+ }
+ }
+}
+close IN;
+
+exit $error;
diff --git a/ikiwiki.in b/ikiwiki.in
index 1a6d18a60..32a24af84 100755
--- a/ikiwiki.in
+++ b/ikiwiki.in
@@ -9,12 +9,12 @@ use strict;
use lib '.'; # For use in nonstandard directory, munged by Makefile.
use IkiWiki;
-sub usage () { #{{{
+sub usage () {
die gettext("usage: ikiwiki [options] source dest"), "\n",
gettext(" ikiwiki --setup configfile"), "\n";
-} #}}}
+}
-sub getconfig () { #{{{
+sub getconfig () {
if (! exists $ENV{WRAPPED_OPTIONS}) {
%config=defaultconfig();
eval q{use Getopt::Long};
@@ -40,6 +40,7 @@ sub getconfig () { #{{{
"post-commit" => \$config{post_commit},
"render=s" => \$config{render},
"wrappers!" => \$config{genwrappers},
+ "wrappergroup=s" => \$config{wrappergroup},
"usedirs!" => \$config{usedirs},
"prefix-directives!" => \$config{prefix_directives},
"getctime" => \$config{getctime},
@@ -122,9 +123,9 @@ sub getconfig () { #{{{
loadplugins();
checkconfig();
}
-} #}}}
+}
-sub main () { #{{{
+sub main () {
getconfig();
if ($config{setup}) {
@@ -162,7 +163,8 @@ sub main () { #{{{
}
if ($config{dumpsetup}) {
- $config{srdir}=$config{destdir}="";
+ $config{srcdir}="" if ! defined $config{srcdir};
+ $config{destdir}="" if ! defined $config{destdir};
$config{syslog}=1 if $config{setupsyslog};
require IkiWiki::Setup;
IkiWiki::Setup::dump($config{dumpsetup});
@@ -205,6 +207,6 @@ sub main () { #{{{
saveindex();
debug(gettext("done"));
}
-} #}}}
+}
main;
diff --git a/po/bg.po b/po/bg.po
index 19b0fff50..37e249012 100644
--- a/po/bg.po
+++ b/po/bg.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: ikiwiki-bg\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-10-31 16:37-0400\n"
+"POT-Creation-Date: 2008-12-20 18:07-0500\n"
"PO-Revision-Date: 2007-01-12 01:19+0200\n"
"Last-Translator: Damyan Ivanov <dam@modsodtsys.com>\n"
"Language-Team: Bulgarian <dict@fsa-bg.org>\n"
@@ -24,7 +24,7 @@ msgstr "Първо трябва да влезете."
msgid "login failed, perhaps you need to turn on cookies?"
msgstr ""
-#: ../IkiWiki/CGI.pm:163 ../IkiWiki/Plugin/editpage.pm:350
+#: ../IkiWiki/CGI.pm:163 ../IkiWiki/CGI.pm:310
msgid "Your login session has expired."
msgstr ""
@@ -49,7 +49,7 @@ msgstr "Предпочитанията са запазени."
msgid "You are banned."
msgstr "Достъпът ви е забранен."
-#: ../IkiWiki/CGI.pm:385 ../IkiWiki/CGI.pm:386 ../IkiWiki.pm:1182
+#: ../IkiWiki/CGI.pm:401 ../IkiWiki/CGI.pm:402 ../IkiWiki.pm:1204
msgid "Error"
msgstr "Грешка"
@@ -66,63 +66,63 @@ msgstr ""
msgid "missing %s parameter"
msgstr "липсващ параметър „id” на шаблона"
-#: ../IkiWiki/Plugin/aggregate.pm:250
+#: ../IkiWiki/Plugin/aggregate.pm:251
msgid "new feed"
msgstr "нов източник"
-#: ../IkiWiki/Plugin/aggregate.pm:264
+#: ../IkiWiki/Plugin/aggregate.pm:265
msgid "posts"
msgstr "съобщения"
-#: ../IkiWiki/Plugin/aggregate.pm:266
+#: ../IkiWiki/Plugin/aggregate.pm:267
msgid "new"
msgstr "ново"
-#: ../IkiWiki/Plugin/aggregate.pm:429
+#: ../IkiWiki/Plugin/aggregate.pm:431
#, perl-format
msgid "expiring %s (%s days old)"
msgstr "премахване на „%s” (на %s дни)"
-#: ../IkiWiki/Plugin/aggregate.pm:436
+#: ../IkiWiki/Plugin/aggregate.pm:438
#, perl-format
msgid "expiring %s"
msgstr "премахване на „%s”"
-#: ../IkiWiki/Plugin/aggregate.pm:463
+#: ../IkiWiki/Plugin/aggregate.pm:465
#, perl-format
msgid "last checked %s"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:467
+#: ../IkiWiki/Plugin/aggregate.pm:469
#, perl-format
msgid "checking feed %s ..."
msgstr "проверка на източника „%s”"
-#: ../IkiWiki/Plugin/aggregate.pm:472
+#: ../IkiWiki/Plugin/aggregate.pm:474
#, perl-format
msgid "could not find feed at %s"
msgstr "не е намерен източник на адрес „%s”"
-#: ../IkiWiki/Plugin/aggregate.pm:487
+#: ../IkiWiki/Plugin/aggregate.pm:493
#, fuzzy
msgid "feed not found"
msgstr "шаблонът „%s” не е намерен"
-#: ../IkiWiki/Plugin/aggregate.pm:498
+#: ../IkiWiki/Plugin/aggregate.pm:504
#, perl-format
msgid "(invalid UTF-8 stripped from feed)"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:504
+#: ../IkiWiki/Plugin/aggregate.pm:512
#, perl-format
msgid "(feed entities escaped)"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:510
+#: ../IkiWiki/Plugin/aggregate.pm:520
msgid "feed crashed XML::Feed!"
msgstr "данните от източника предизвикаха грешка в модула XML::Feed!"
-#: ../IkiWiki/Plugin/aggregate.pm:590
+#: ../IkiWiki/Plugin/aggregate.pm:601
#, perl-format
msgid "creating new page %s"
msgstr "създаване на нова страницa „%s”"
@@ -131,7 +131,7 @@ msgstr "създаване на нова страницa „%s”"
msgid "deleting bucket.."
msgstr ""
-#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:206
+#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:208
msgid "done"
msgstr "готово"
@@ -175,8 +175,8 @@ msgstr ""
msgid "automatic index generation"
msgstr ""
-#: ../IkiWiki/Plugin/brokenlinks.pm:33 ../IkiWiki/Plugin/editpage.pm:261
-#: ../IkiWiki/Plugin/inline.pm:327 ../IkiWiki/Plugin/opendiscussion.pm:26
+#: ../IkiWiki/Plugin/brokenlinks.pm:33 ../IkiWiki/Plugin/editpage.pm:260
+#: ../IkiWiki/Plugin/inline.pm:354 ../IkiWiki/Plugin/opendiscussion.pm:26
#: ../IkiWiki/Plugin/orphans.pm:37 ../IkiWiki/Render.pm:79
#: ../IkiWiki/Render.pm:149
msgid "discussion"
@@ -191,6 +191,61 @@ msgstr ""
msgid "There are no broken links!"
msgstr "Няма „счупени” връзки!"
+#: ../IkiWiki/Plugin/comments.pm:119 ../IkiWiki/Plugin/format.pm:23
+#, perl-format
+msgid "unsupported page format %s"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:124
+msgid "comment must have content"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:181
+msgid "Anonymous"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:243 ../IkiWiki/Plugin/recentchanges.pm:101
+#, fuzzy
+msgid "missing page"
+msgstr "липсващ параметър „id” на шаблона"
+
+#: ../IkiWiki/Plugin/comments.pm:245 ../IkiWiki/Plugin/recentchanges.pm:103
+#, perl-format
+msgid "The page %s does not exist."
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:334 ../IkiWiki/Plugin/editpage.pm:124
+msgid "bad page name"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:341
+#, fuzzy, perl-format
+msgid "commenting on %s"
+msgstr "създаване на %s"
+
+#: ../IkiWiki/Plugin/comments.pm:359
+#, perl-format
+msgid "page '%s' doesn't exist, so you can't comment"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:366
+#, perl-format
+msgid "comments on page '%s' are closed"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:468
+msgid "Added a comment"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:472
+#, perl-format
+msgid "Added a comment: %s"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:565
+msgid "Comments"
+msgstr ""
+
#: ../IkiWiki/Plugin/conditional.pm:27 ../IkiWiki/Plugin/cutpaste.pm:30
#: ../IkiWiki/Plugin/cutpaste.pm:45 ../IkiWiki/Plugin/cutpaste.pm:61
#: ../IkiWiki/Plugin/testpagespec.pm:26
@@ -212,23 +267,19 @@ msgstr ""
msgid "removing old preview %s"
msgstr "премахване на старата страница „%s”"
-#: ../IkiWiki/Plugin/editpage.pm:125
-msgid "bad page name"
-msgstr ""
-
-#: ../IkiWiki/Plugin/editpage.pm:141
+#: ../IkiWiki/Plugin/editpage.pm:140
#, perl-format
msgid "%s is not an editable page"
msgstr ""
-#: ../IkiWiki/Plugin/editpage.pm:317
+#: ../IkiWiki/Plugin/editpage.pm:316
#, perl-format
msgid "creating %s"
msgstr "създаване на %s"
-#: ../IkiWiki/Plugin/editpage.pm:335 ../IkiWiki/Plugin/editpage.pm:363
-#: ../IkiWiki/Plugin/editpage.pm:373 ../IkiWiki/Plugin/editpage.pm:408
-#: ../IkiWiki/Plugin/editpage.pm:453
+#: ../IkiWiki/Plugin/editpage.pm:334 ../IkiWiki/Plugin/editpage.pm:353
+#: ../IkiWiki/Plugin/editpage.pm:363 ../IkiWiki/Plugin/editpage.pm:398
+#: ../IkiWiki/Plugin/editpage.pm:443
#, perl-format
msgid "editing %s"
msgstr "промяна на %s"
@@ -253,15 +304,10 @@ msgstr ""
msgid "failed to process"
msgstr "грешка при обработване на шаблона"
-#: ../IkiWiki/Plugin/format.pm:22
+#: ../IkiWiki/Plugin/format.pm:20
msgid "must specify format and text"
msgstr ""
-#: ../IkiWiki/Plugin/format.pm:25
-#, perl-format
-msgid "unsupported page format %s"
-msgstr ""
-
#: ../IkiWiki/Plugin/fortune.pm:27
msgid "fortune failed"
msgstr "грешшка в приставката „fortune”"
@@ -330,18 +376,18 @@ msgstr "грешка при запис на файла „%s”: %s"
msgid "failed to determine size of image %s"
msgstr "грешка при запис на файла „%s”: %s"
-#: ../IkiWiki/Plugin/inline.pm:93
+#: ../IkiWiki/Plugin/inline.pm:92
msgid "Must specify url to wiki with --url when using --rss or --atom"
msgstr ""
"Когато се използва „--rss” или „--atom” трябва да се укаже и "
"местоположението на уикито посредством параметъра „--url”"
-#: ../IkiWiki/Plugin/inline.pm:139
+#: ../IkiWiki/Plugin/inline.pm:138
#, fuzzy
msgid "page editing not allowed"
msgstr "шаблонът „%s” не е намерен"
-#: ../IkiWiki/Plugin/inline.pm:156
+#: ../IkiWiki/Plugin/inline.pm:155
#, fuzzy
msgid "missing pages parameter"
msgstr "липсващ параметър „id” на шаблона"
@@ -351,20 +397,20 @@ msgstr "липсващ параметър „id” на шаблона"
msgid "unknown sort type %s"
msgstr "непознат вид сортиране „%s”"
-#: ../IkiWiki/Plugin/inline.pm:285
+#: ../IkiWiki/Plugin/inline.pm:307
msgid "Add a new post titled:"
msgstr ""
-#: ../IkiWiki/Plugin/inline.pm:301
+#: ../IkiWiki/Plugin/inline.pm:327
#, perl-format
msgid "nonexistant template %s"
msgstr ""
-#: ../IkiWiki/Plugin/inline.pm:335 ../IkiWiki/Render.pm:83
+#: ../IkiWiki/Plugin/inline.pm:362 ../IkiWiki/Render.pm:83
msgid "Discussion"
msgstr "Дискусия"
-#: ../IkiWiki/Plugin/inline.pm:572
+#: ../IkiWiki/Plugin/inline.pm:587
msgid "RPC::XML::Client not found, not pinging"
msgstr "модулът „RPC::XML::Client” не е намерен; източникът не е проверен"
@@ -390,17 +436,17 @@ msgstr ""
"грешка при зареждането на perl-модула „Markdown.pm” (%s) или „/usr/bin/"
"markdown” (%s)"
-#: ../IkiWiki/Plugin/meta.pm:150
+#: ../IkiWiki/Plugin/meta.pm:151
#, fuzzy
msgid "stylesheet not found"
msgstr "шаблонът „%s” не е намерен"
-#: ../IkiWiki/Plugin/meta.pm:184
+#: ../IkiWiki/Plugin/meta.pm:185
#, fuzzy
msgid "redir page not found"
msgstr "шаблонът „%s” не е намерен"
-#: ../IkiWiki/Plugin/meta.pm:197
+#: ../IkiWiki/Plugin/meta.pm:198
#, fuzzy
msgid "redir cycle is not allowed"
msgstr "шаблонът „%s” не е намерен"
@@ -586,17 +632,7 @@ msgstr ""
msgid "need either `percent` or `totalpages` and `donepages` parameters"
msgstr ""
-#: ../IkiWiki/Plugin/recentchanges.pm:100
-#, fuzzy
-msgid "missing page"
-msgstr "липсващ параметър „id” на шаблона"
-
-#: ../IkiWiki/Plugin/recentchanges.pm:102
-#, perl-format
-msgid "The page %s does not exist."
-msgstr ""
-
-#: ../IkiWiki/Plugin/recentchangesdiff.pm:36
+#: ../IkiWiki/Plugin/recentchangesdiff.pm:37
msgid "(Diff truncated)"
msgstr ""
@@ -946,19 +982,19 @@ msgstr "не е указан файл на обвивката"
#. translators: The first parameter is a filename, and the second is
#. translators: a (probably not translated) error message.
-#: ../IkiWiki/Wrapper.pm:79
+#: ../IkiWiki/Wrapper.pm:97
#, perl-format
msgid "failed to write %s: %s"
msgstr "грешка при запис на файла „%s”: %s"
#. translators: The parameter is a C filename.
-#: ../IkiWiki/Wrapper.pm:135
+#: ../IkiWiki/Wrapper.pm:154
#, perl-format
msgid "failed to compile %s"
msgstr "крешка при компилиране на файла %s"
#. translators: The parameter is a filename.
-#: ../IkiWiki/Wrapper.pm:155
+#: ../IkiWiki/Wrapper.pm:174
#, perl-format
msgid "successfully generated %s"
msgstr "успешно генериране на %s"
@@ -971,43 +1007,43 @@ msgstr "формат: ikiwiki [опции] източник местоназна
msgid " ikiwiki --setup configfile"
msgstr ""
-#: ../ikiwiki.in:90
+#: ../ikiwiki.in:91
msgid "usage: --set var=value"
msgstr ""
-#: ../ikiwiki.in:138
+#: ../ikiwiki.in:139
msgid "generating wrappers.."
msgstr "генериране на обвивки..."
-#: ../ikiwiki.in:195
+#: ../ikiwiki.in:197
msgid "rebuilding wiki.."
msgstr "обновяване на уики..."
-#: ../ikiwiki.in:198
+#: ../ikiwiki.in:200
msgid "refreshing wiki.."
msgstr "осъвременяване на уики..."
-#: ../IkiWiki.pm:466
+#: ../IkiWiki.pm:480
msgid "Must specify url to wiki with --url when using --cgi"
msgstr ""
"При използване на пареметъра „--cgi” е необходимо да се укаже и "
"местоположението на уикито чрез параметъра „--url”"
-#: ../IkiWiki.pm:512
+#: ../IkiWiki.pm:526
msgid "cannot use multiple rcs plugins"
msgstr ""
-#: ../IkiWiki.pm:541
+#: ../IkiWiki.pm:555
#, perl-format
msgid "failed to load external plugin needed for %s plugin: %s"
msgstr ""
-#: ../IkiWiki.pm:1165
+#: ../IkiWiki.pm:1187
#, fuzzy, perl-format
msgid "preprocessing loop detected on %s at depth %i"
msgstr "открита е циклична завидимост при %s на „%s” на дълбочина %i"
-#: ../IkiWiki.pm:1678
+#: ../IkiWiki.pm:1688
msgid "yes"
msgstr ""
diff --git a/po/cs.po b/po/cs.po
index 6cbb0c596..7ea726c5a 100644
--- a/po/cs.po
+++ b/po/cs.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: ikiwiki\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-10-31 16:37-0400\n"
+"POT-Creation-Date: 2008-12-20 18:07-0500\n"
"PO-Revision-Date: 2007-05-09 21:21+0200\n"
"Last-Translator: Miroslav Kure <kurem@debian.cz>\n"
"Language-Team: Czech <debian-l10n-czech@lists.debian.org>\n"
@@ -23,7 +23,7 @@ msgstr "Nejprve se musíte přihlásit."
msgid "login failed, perhaps you need to turn on cookies?"
msgstr "přihlášení selhalo; možná si musíte povolit cookies?"
-#: ../IkiWiki/CGI.pm:163 ../IkiWiki/Plugin/editpage.pm:350
+#: ../IkiWiki/CGI.pm:163 ../IkiWiki/CGI.pm:310
msgid "Your login session has expired."
msgstr ""
@@ -47,7 +47,7 @@ msgstr "Nastavení uloženo."
msgid "You are banned."
msgstr "Jste vyhoštěni."
-#: ../IkiWiki/CGI.pm:385 ../IkiWiki/CGI.pm:386 ../IkiWiki.pm:1182
+#: ../IkiWiki/CGI.pm:401 ../IkiWiki/CGI.pm:402 ../IkiWiki.pm:1204
msgid "Error"
msgstr "Chyba"
@@ -64,62 +64,62 @@ msgstr ""
msgid "missing %s parameter"
msgstr "chybí parametr %s"
-#: ../IkiWiki/Plugin/aggregate.pm:250
+#: ../IkiWiki/Plugin/aggregate.pm:251
msgid "new feed"
msgstr "nový zdroj"
-#: ../IkiWiki/Plugin/aggregate.pm:264
+#: ../IkiWiki/Plugin/aggregate.pm:265
msgid "posts"
msgstr "příspěvky"
-#: ../IkiWiki/Plugin/aggregate.pm:266
+#: ../IkiWiki/Plugin/aggregate.pm:267
msgid "new"
msgstr "nový"
-#: ../IkiWiki/Plugin/aggregate.pm:429
+#: ../IkiWiki/Plugin/aggregate.pm:431
#, perl-format
msgid "expiring %s (%s days old)"
msgstr "expiruji %s (stará %s dnů)"
-#: ../IkiWiki/Plugin/aggregate.pm:436
+#: ../IkiWiki/Plugin/aggregate.pm:438
#, perl-format
msgid "expiring %s"
msgstr "expiruji %s"
-#: ../IkiWiki/Plugin/aggregate.pm:463
+#: ../IkiWiki/Plugin/aggregate.pm:465
#, perl-format
msgid "last checked %s"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:467
+#: ../IkiWiki/Plugin/aggregate.pm:469
#, perl-format
msgid "checking feed %s ..."
msgstr "kontroluji zdroj %s ..."
-#: ../IkiWiki/Plugin/aggregate.pm:472
+#: ../IkiWiki/Plugin/aggregate.pm:474
#, perl-format
msgid "could not find feed at %s"
msgstr "nemohu najít zdroj na %s"
-#: ../IkiWiki/Plugin/aggregate.pm:487
+#: ../IkiWiki/Plugin/aggregate.pm:493
msgid "feed not found"
msgstr "zdroj nebyl nalezen"
-#: ../IkiWiki/Plugin/aggregate.pm:498
+#: ../IkiWiki/Plugin/aggregate.pm:504
#, perl-format
msgid "(invalid UTF-8 stripped from feed)"
msgstr "(neplatné UTF-8 bylo ze zdroje odstraněno)"
-#: ../IkiWiki/Plugin/aggregate.pm:504
+#: ../IkiWiki/Plugin/aggregate.pm:512
#, perl-format
msgid "(feed entities escaped)"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:510
+#: ../IkiWiki/Plugin/aggregate.pm:520
msgid "feed crashed XML::Feed!"
msgstr "zdroj shodil XML::Feed!"
-#: ../IkiWiki/Plugin/aggregate.pm:590
+#: ../IkiWiki/Plugin/aggregate.pm:601
#, perl-format
msgid "creating new page %s"
msgstr "vytvářím novou stránku %s"
@@ -128,7 +128,7 @@ msgstr "vytvářím novou stránku %s"
msgid "deleting bucket.."
msgstr ""
-#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:206
+#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:208
msgid "done"
msgstr "hotovo"
@@ -172,8 +172,8 @@ msgstr ""
msgid "automatic index generation"
msgstr ""
-#: ../IkiWiki/Plugin/brokenlinks.pm:33 ../IkiWiki/Plugin/editpage.pm:261
-#: ../IkiWiki/Plugin/inline.pm:327 ../IkiWiki/Plugin/opendiscussion.pm:26
+#: ../IkiWiki/Plugin/brokenlinks.pm:33 ../IkiWiki/Plugin/editpage.pm:260
+#: ../IkiWiki/Plugin/inline.pm:354 ../IkiWiki/Plugin/opendiscussion.pm:26
#: ../IkiWiki/Plugin/orphans.pm:37 ../IkiWiki/Render.pm:79
#: ../IkiWiki/Render.pm:149
msgid "discussion"
@@ -188,6 +188,61 @@ msgstr ""
msgid "There are no broken links!"
msgstr "Žádné porušené odkazy!"
+#: ../IkiWiki/Plugin/comments.pm:119 ../IkiWiki/Plugin/format.pm:23
+#, perl-format
+msgid "unsupported page format %s"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:124
+msgid "comment must have content"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:181
+msgid "Anonymous"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:243 ../IkiWiki/Plugin/recentchanges.pm:101
+#, fuzzy
+msgid "missing page"
+msgstr "chybí hodnoty"
+
+#: ../IkiWiki/Plugin/comments.pm:245 ../IkiWiki/Plugin/recentchanges.pm:103
+#, perl-format
+msgid "The page %s does not exist."
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:334 ../IkiWiki/Plugin/editpage.pm:124
+msgid "bad page name"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:341
+#, fuzzy, perl-format
+msgid "commenting on %s"
+msgstr "vytvářím %s"
+
+#: ../IkiWiki/Plugin/comments.pm:359
+#, perl-format
+msgid "page '%s' doesn't exist, so you can't comment"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:366
+#, perl-format
+msgid "comments on page '%s' are closed"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:468
+msgid "Added a comment"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:472
+#, perl-format
+msgid "Added a comment: %s"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:565
+msgid "Comments"
+msgstr ""
+
#: ../IkiWiki/Plugin/conditional.pm:27 ../IkiWiki/Plugin/cutpaste.pm:30
#: ../IkiWiki/Plugin/cutpaste.pm:45 ../IkiWiki/Plugin/cutpaste.pm:61
#: ../IkiWiki/Plugin/testpagespec.pm:26
@@ -209,23 +264,19 @@ msgstr ""
msgid "removing old preview %s"
msgstr "odstraňuji starou stránku %s"
-#: ../IkiWiki/Plugin/editpage.pm:125
-msgid "bad page name"
-msgstr ""
-
-#: ../IkiWiki/Plugin/editpage.pm:141
+#: ../IkiWiki/Plugin/editpage.pm:140
#, perl-format
msgid "%s is not an editable page"
msgstr "%s není editovatelná stránka"
-#: ../IkiWiki/Plugin/editpage.pm:317
+#: ../IkiWiki/Plugin/editpage.pm:316
#, perl-format
msgid "creating %s"
msgstr "vytvářím %s"
-#: ../IkiWiki/Plugin/editpage.pm:335 ../IkiWiki/Plugin/editpage.pm:363
-#: ../IkiWiki/Plugin/editpage.pm:373 ../IkiWiki/Plugin/editpage.pm:408
-#: ../IkiWiki/Plugin/editpage.pm:453
+#: ../IkiWiki/Plugin/editpage.pm:334 ../IkiWiki/Plugin/editpage.pm:353
+#: ../IkiWiki/Plugin/editpage.pm:363 ../IkiWiki/Plugin/editpage.pm:398
+#: ../IkiWiki/Plugin/editpage.pm:443
#, perl-format
msgid "editing %s"
msgstr "upravuji %s"
@@ -250,15 +301,10 @@ msgstr ""
msgid "failed to process"
msgstr "nepodařilo se zpracovat:"
-#: ../IkiWiki/Plugin/format.pm:22
+#: ../IkiWiki/Plugin/format.pm:20
msgid "must specify format and text"
msgstr ""
-#: ../IkiWiki/Plugin/format.pm:25
-#, perl-format
-msgid "unsupported page format %s"
-msgstr ""
-
#: ../IkiWiki/Plugin/fortune.pm:27
msgid "fortune failed"
msgstr "fortune selhal"
@@ -325,16 +371,16 @@ msgstr "nelze změnit velikost: %s"
msgid "failed to determine size of image %s"
msgstr "nelze změnit velikost: %s"
-#: ../IkiWiki/Plugin/inline.pm:93
+#: ../IkiWiki/Plugin/inline.pm:92
msgid "Must specify url to wiki with --url when using --rss or --atom"
msgstr "Při používání --rss nebo --atom musíte pomocí --url zadat url k wiki"
-#: ../IkiWiki/Plugin/inline.pm:139
+#: ../IkiWiki/Plugin/inline.pm:138
#, fuzzy
msgid "page editing not allowed"
msgstr "zdroj nebyl nalezen"
-#: ../IkiWiki/Plugin/inline.pm:156
+#: ../IkiWiki/Plugin/inline.pm:155
#, fuzzy
msgid "missing pages parameter"
msgstr "chybí parametr %s"
@@ -344,20 +390,20 @@ msgstr "chybí parametr %s"
msgid "unknown sort type %s"
msgstr "neznámý typ řazení %s"
-#: ../IkiWiki/Plugin/inline.pm:285
+#: ../IkiWiki/Plugin/inline.pm:307
msgid "Add a new post titled:"
msgstr "Přidat nový příspěvek nazvaný:"
-#: ../IkiWiki/Plugin/inline.pm:301
+#: ../IkiWiki/Plugin/inline.pm:327
#, perl-format
msgid "nonexistant template %s"
msgstr "neexistující šablona %s"
-#: ../IkiWiki/Plugin/inline.pm:335 ../IkiWiki/Render.pm:83
+#: ../IkiWiki/Plugin/inline.pm:362 ../IkiWiki/Render.pm:83
msgid "Discussion"
msgstr "Diskuse"
-#: ../IkiWiki/Plugin/inline.pm:572
+#: ../IkiWiki/Plugin/inline.pm:587
msgid "RPC::XML::Client not found, not pinging"
msgstr "RPC::XML::Client nebyl nalezen, nepinkám"
@@ -380,16 +426,16 @@ msgid "failed to load Markdown.pm perl module (%s) or /usr/bin/markdown (%s)"
msgstr ""
"selhalo nahrání perlového modulu Markdown.pm (%s) nebo /usr/bin/markdown (%s)"
-#: ../IkiWiki/Plugin/meta.pm:150
+#: ../IkiWiki/Plugin/meta.pm:151
msgid "stylesheet not found"
msgstr "styl nebyl nalezen"
-#: ../IkiWiki/Plugin/meta.pm:184
+#: ../IkiWiki/Plugin/meta.pm:185
#, fuzzy
msgid "redir page not found"
msgstr "zdroj nebyl nalezen"
-#: ../IkiWiki/Plugin/meta.pm:197
+#: ../IkiWiki/Plugin/meta.pm:198
#, fuzzy
msgid "redir cycle is not allowed"
msgstr "zdroj nebyl nalezen"
@@ -575,17 +621,7 @@ msgstr ""
msgid "need either `percent` or `totalpages` and `donepages` parameters"
msgstr ""
-#: ../IkiWiki/Plugin/recentchanges.pm:100
-#, fuzzy
-msgid "missing page"
-msgstr "chybí hodnoty"
-
-#: ../IkiWiki/Plugin/recentchanges.pm:102
-#, perl-format
-msgid "The page %s does not exist."
-msgstr ""
-
-#: ../IkiWiki/Plugin/recentchangesdiff.pm:36
+#: ../IkiWiki/Plugin/recentchangesdiff.pm:37
msgid "(Diff truncated)"
msgstr ""
@@ -927,19 +963,19 @@ msgstr "jméno souboru s obalem nebylo zadáno"
#. translators: The first parameter is a filename, and the second is
#. translators: a (probably not translated) error message.
-#: ../IkiWiki/Wrapper.pm:79
+#: ../IkiWiki/Wrapper.pm:97
#, perl-format
msgid "failed to write %s: %s"
msgstr "nelze zapsat %s: %s"
#. translators: The parameter is a C filename.
-#: ../IkiWiki/Wrapper.pm:135
+#: ../IkiWiki/Wrapper.pm:154
#, perl-format
msgid "failed to compile %s"
msgstr "nelze zkompilovat %s"
#. translators: The parameter is a filename.
-#: ../IkiWiki/Wrapper.pm:155
+#: ../IkiWiki/Wrapper.pm:174
#, perl-format
msgid "successfully generated %s"
msgstr "%s byl úspěšně vytvořen"
@@ -952,41 +988,41 @@ msgstr "použití: ikiwiki [volby] zdroj cíl"
msgid " ikiwiki --setup configfile"
msgstr ""
-#: ../ikiwiki.in:90
+#: ../ikiwiki.in:91
msgid "usage: --set var=value"
msgstr ""
-#: ../ikiwiki.in:138
+#: ../ikiwiki.in:139
msgid "generating wrappers.."
msgstr "generuji obaly..."
-#: ../ikiwiki.in:195
+#: ../ikiwiki.in:197
msgid "rebuilding wiki.."
msgstr "znovu vytvářím wiki..."
-#: ../ikiwiki.in:198
+#: ../ikiwiki.in:200
msgid "refreshing wiki.."
msgstr "obnovuji wiki..."
-#: ../IkiWiki.pm:466
+#: ../IkiWiki.pm:480
msgid "Must specify url to wiki with --url when using --cgi"
msgstr "Při použití --cgi musíte pomocí --url zadat url k wiki"
-#: ../IkiWiki.pm:512
+#: ../IkiWiki.pm:526
msgid "cannot use multiple rcs plugins"
msgstr ""
-#: ../IkiWiki.pm:541
+#: ../IkiWiki.pm:555
#, perl-format
msgid "failed to load external plugin needed for %s plugin: %s"
msgstr ""
-#: ../IkiWiki.pm:1165
+#: ../IkiWiki.pm:1187
#, fuzzy, perl-format
msgid "preprocessing loop detected on %s at depth %i"
msgstr "Byla rozpoznána smyčka direktivy %s na %s v hloubce %i"
-#: ../IkiWiki.pm:1678
+#: ../IkiWiki.pm:1688
msgid "yes"
msgstr ""
diff --git a/po/da.po b/po/da.po
index 6c3ed3e53..4a016233a 100644
--- a/po/da.po
+++ b/po/da.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: ikiwiki\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-10-31 16:37-0400\n"
+"POT-Creation-Date: 2008-12-20 18:07-0500\n"
"PO-Revision-Date: 2008-10-22 19:13+0100\n"
"Last-Translator: Jonas Smedegaard <dr@jones.dk>\n"
"Language-Team: None\n"
@@ -27,7 +27,7 @@ msgstr "Du skal først logge på."
msgid "login failed, perhaps you need to turn on cookies?"
msgstr "Pålogning mislykkedes, måske skal du tillade infokager (cookies)?"
-#: ../IkiWiki/CGI.pm:163 ../IkiWiki/Plugin/editpage.pm:350
+#: ../IkiWiki/CGI.pm:163 ../IkiWiki/CGI.pm:310
msgid "Your login session has expired."
msgstr "Din kørsel (login session) er udløbet"
@@ -51,7 +51,7 @@ msgstr "Indstillinger gemt"
msgid "You are banned."
msgstr "Du er banlyst."
-#: ../IkiWiki/CGI.pm:385 ../IkiWiki/CGI.pm:386 ../IkiWiki.pm:1182
+#: ../IkiWiki/CGI.pm:401 ../IkiWiki/CGI.pm:402 ../IkiWiki.pm:1204
msgid "Error"
msgstr "Fejl"
@@ -68,62 +68,62 @@ msgstr "Intet at gøre lige nu, alle fødninger er tidssvarende!"
msgid "missing %s parameter"
msgstr "mangler parametren %s"
-#: ../IkiWiki/Plugin/aggregate.pm:250
+#: ../IkiWiki/Plugin/aggregate.pm:251
msgid "new feed"
msgstr "ny fødning"
-#: ../IkiWiki/Plugin/aggregate.pm:264
+#: ../IkiWiki/Plugin/aggregate.pm:265
msgid "posts"
msgstr "indlæg"
-#: ../IkiWiki/Plugin/aggregate.pm:266
+#: ../IkiWiki/Plugin/aggregate.pm:267
msgid "new"
msgstr "nyt"
-#: ../IkiWiki/Plugin/aggregate.pm:429
+#: ../IkiWiki/Plugin/aggregate.pm:431
#, perl-format
msgid "expiring %s (%s days old)"
msgstr "udløber %s (%s dage gammel)"
-#: ../IkiWiki/Plugin/aggregate.pm:436
+#: ../IkiWiki/Plugin/aggregate.pm:438
#, perl-format
msgid "expiring %s"
msgstr "udløber %s"
-#: ../IkiWiki/Plugin/aggregate.pm:463
+#: ../IkiWiki/Plugin/aggregate.pm:465
#, perl-format
msgid "last checked %s"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:467
+#: ../IkiWiki/Plugin/aggregate.pm:469
#, perl-format
msgid "checking feed %s ..."
msgstr "undersøger fødning %s ..."
-#: ../IkiWiki/Plugin/aggregate.pm:472
+#: ../IkiWiki/Plugin/aggregate.pm:474
#, perl-format
msgid "could not find feed at %s"
msgstr "kunne ikke finde fødning ved %s"
-#: ../IkiWiki/Plugin/aggregate.pm:487
+#: ../IkiWiki/Plugin/aggregate.pm:493
msgid "feed not found"
msgstr "fødning ikke fundet"
-#: ../IkiWiki/Plugin/aggregate.pm:498
+#: ../IkiWiki/Plugin/aggregate.pm:504
#, perl-format
msgid "(invalid UTF-8 stripped from feed)"
msgstr "(defekt UTF-8 fjernet fra fødning)"
-#: ../IkiWiki/Plugin/aggregate.pm:504
+#: ../IkiWiki/Plugin/aggregate.pm:512
#, perl-format
msgid "(feed entities escaped)"
msgstr "(fødningselementer omgået (escaped))"
-#: ../IkiWiki/Plugin/aggregate.pm:510
+#: ../IkiWiki/Plugin/aggregate.pm:520
msgid "feed crashed XML::Feed!"
msgstr "fødning fik XML::Feed til at bryde sammen!"
-#: ../IkiWiki/Plugin/aggregate.pm:590
+#: ../IkiWiki/Plugin/aggregate.pm:601
#, perl-format
msgid "creating new page %s"
msgstr "opretter ny side %s"
@@ -132,7 +132,7 @@ msgstr "opretter ny side %s"
msgid "deleting bucket.."
msgstr "sletter bundt.."
-#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:206
+#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:208
msgid "done"
msgstr "færdig"
@@ -174,8 +174,8 @@ msgstr "vedhæftningsoplægning"
msgid "automatic index generation"
msgstr "automatisk indeks-dannelse"
-#: ../IkiWiki/Plugin/brokenlinks.pm:33 ../IkiWiki/Plugin/editpage.pm:261
-#: ../IkiWiki/Plugin/inline.pm:327 ../IkiWiki/Plugin/opendiscussion.pm:26
+#: ../IkiWiki/Plugin/brokenlinks.pm:33 ../IkiWiki/Plugin/editpage.pm:260
+#: ../IkiWiki/Plugin/inline.pm:354 ../IkiWiki/Plugin/opendiscussion.pm:26
#: ../IkiWiki/Plugin/orphans.pm:37 ../IkiWiki/Render.pm:79
#: ../IkiWiki/Render.pm:149
msgid "discussion"
@@ -190,6 +190,61 @@ msgstr "%s fra %s"
msgid "There are no broken links!"
msgstr "Ingen henvisninger der ikker fungerer!"
+#: ../IkiWiki/Plugin/comments.pm:119 ../IkiWiki/Plugin/format.pm:23
+#, fuzzy, perl-format
+msgid "unsupported page format %s"
+msgstr "revisionskontrolsystem %s ikke understøttet"
+
+#: ../IkiWiki/Plugin/comments.pm:124
+msgid "comment must have content"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:181
+msgid "Anonymous"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:243 ../IkiWiki/Plugin/recentchanges.pm:101
+msgid "missing page"
+msgstr "manglende side"
+
+#: ../IkiWiki/Plugin/comments.pm:245 ../IkiWiki/Plugin/recentchanges.pm:103
+#, perl-format
+msgid "The page %s does not exist."
+msgstr "Siden %s eksisterer ikke."
+
+#: ../IkiWiki/Plugin/comments.pm:334 ../IkiWiki/Plugin/editpage.pm:124
+#, fuzzy
+msgid "bad page name"
+msgstr "dårligt vedhæftningsfilnavn"
+
+#: ../IkiWiki/Plugin/comments.pm:341
+#, fuzzy, perl-format
+msgid "commenting on %s"
+msgstr "opretter %s"
+
+#: ../IkiWiki/Plugin/comments.pm:359
+#, perl-format
+msgid "page '%s' doesn't exist, so you can't comment"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:366
+#, perl-format
+msgid "comments on page '%s' are closed"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:468
+msgid "Added a comment"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:472
+#, perl-format
+msgid "Added a comment: %s"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:565
+msgid "Comments"
+msgstr ""
+
#: ../IkiWiki/Plugin/conditional.pm:27 ../IkiWiki/Plugin/cutpaste.pm:30
#: ../IkiWiki/Plugin/cutpaste.pm:45 ../IkiWiki/Plugin/cutpaste.pm:61
#: ../IkiWiki/Plugin/testpagespec.pm:26
@@ -211,24 +266,19 @@ msgstr "ingen tekst blev kopieret i denne side med id %s"
msgid "removing old preview %s"
msgstr "fjerner gammelt smugkig %s"
-#: ../IkiWiki/Plugin/editpage.pm:125
-#, fuzzy
-msgid "bad page name"
-msgstr "dårligt vedhæftningsfilnavn"
-
-#: ../IkiWiki/Plugin/editpage.pm:141
+#: ../IkiWiki/Plugin/editpage.pm:140
#, perl-format
msgid "%s is not an editable page"
msgstr "%s er ikke en redigérbar side"
-#: ../IkiWiki/Plugin/editpage.pm:317
+#: ../IkiWiki/Plugin/editpage.pm:316
#, perl-format
msgid "creating %s"
msgstr "opretter %s"
-#: ../IkiWiki/Plugin/editpage.pm:335 ../IkiWiki/Plugin/editpage.pm:363
-#: ../IkiWiki/Plugin/editpage.pm:373 ../IkiWiki/Plugin/editpage.pm:408
-#: ../IkiWiki/Plugin/editpage.pm:453
+#: ../IkiWiki/Plugin/editpage.pm:334 ../IkiWiki/Plugin/editpage.pm:353
+#: ../IkiWiki/Plugin/editpage.pm:363 ../IkiWiki/Plugin/editpage.pm:398
+#: ../IkiWiki/Plugin/editpage.pm:443
#, perl-format
msgid "editing %s"
msgstr "redigerer %s"
@@ -250,15 +300,10 @@ msgstr "redigeringsskabelon %s registreret for %s"
msgid "failed to process"
msgstr "dannelsen mislykkedes"
-#: ../IkiWiki/Plugin/format.pm:22
+#: ../IkiWiki/Plugin/format.pm:20
msgid "must specify format and text"
msgstr ""
-#: ../IkiWiki/Plugin/format.pm:25
-#, fuzzy, perl-format
-msgid "unsupported page format %s"
-msgstr "revisionskontrolsystem %s ikke understøttet"
-
#: ../IkiWiki/Plugin/fortune.pm:27
msgid "fortune failed"
msgstr "spådom (fortune) fejlede"
@@ -325,15 +370,15 @@ msgstr "Ændring af størrelse mislykkedes: %s"
msgid "failed to determine size of image %s"
msgstr "Vurdering af størrelse på billede mislykkedes: %s"
-#: ../IkiWiki/Plugin/inline.pm:93
+#: ../IkiWiki/Plugin/inline.pm:92
msgid "Must specify url to wiki with --url when using --rss or --atom"
msgstr "Skal angive url til wiki med --url når --rss eller --atom anvendes"
-#: ../IkiWiki/Plugin/inline.pm:139
+#: ../IkiWiki/Plugin/inline.pm:138
msgid "page editing not allowed"
msgstr "sideredigering er ikke tilladt"
-#: ../IkiWiki/Plugin/inline.pm:156
+#: ../IkiWiki/Plugin/inline.pm:155
msgid "missing pages parameter"
msgstr "mangler pages-parametren"
@@ -342,20 +387,20 @@ msgstr "mangler pages-parametren"
msgid "unknown sort type %s"
msgstr "ukendt sorteringsform %s"
-#: ../IkiWiki/Plugin/inline.pm:285
+#: ../IkiWiki/Plugin/inline.pm:307
msgid "Add a new post titled:"
msgstr "Tilføj nyt indlæg med følgende titel:"
-#: ../IkiWiki/Plugin/inline.pm:301
+#: ../IkiWiki/Plugin/inline.pm:327
#, perl-format
msgid "nonexistant template %s"
msgstr "ikke-eksisterende skabelon: %s"
-#: ../IkiWiki/Plugin/inline.pm:335 ../IkiWiki/Render.pm:83
+#: ../IkiWiki/Plugin/inline.pm:362 ../IkiWiki/Render.pm:83
msgid "Discussion"
msgstr "Diskussion"
-#: ../IkiWiki/Plugin/inline.pm:572
+#: ../IkiWiki/Plugin/inline.pm:587
msgid "RPC::XML::Client not found, not pinging"
msgstr "RPC::XML::Client ikke fundet, pinger ikke"
@@ -380,15 +425,15 @@ msgstr ""
"Indlæsning af perl-modulet Markdown.pm (%s) eller /usr/bin/markdown (%s) "
"mislykkedes"
-#: ../IkiWiki/Plugin/meta.pm:150
+#: ../IkiWiki/Plugin/meta.pm:151
msgid "stylesheet not found"
msgstr "stilsnit (stylesheet) ikke fundet"
-#: ../IkiWiki/Plugin/meta.pm:184
+#: ../IkiWiki/Plugin/meta.pm:185
msgid "redir page not found"
msgstr "henvisningsside ikke fundet"
-#: ../IkiWiki/Plugin/meta.pm:197
+#: ../IkiWiki/Plugin/meta.pm:198
msgid "redir cycle is not allowed"
msgstr "ring af henvisninger er ikke tilladt"
@@ -572,16 +617,7 @@ msgstr "ugyldigt procentværdi %s"
msgid "need either `percent` or `totalpages` and `donepages` parameters"
msgstr "Kræver enten parametre `percent` eller `totalpages og `donepages`"
-#: ../IkiWiki/Plugin/recentchanges.pm:100
-msgid "missing page"
-msgstr "manglende side"
-
-#: ../IkiWiki/Plugin/recentchanges.pm:102
-#, perl-format
-msgid "The page %s does not exist."
-msgstr "Siden %s eksisterer ikke."
-
-#: ../IkiWiki/Plugin/recentchangesdiff.pm:36
+#: ../IkiWiki/Plugin/recentchangesdiff.pm:37
msgid "(Diff truncated)"
msgstr "(Diff trunkeret)"
@@ -925,19 +961,19 @@ msgstr "wrapper-navn ikke angivet"
#. translators: The first parameter is a filename, and the second is
#. translators: a (probably not translated) error message.
-#: ../IkiWiki/Wrapper.pm:79
+#: ../IkiWiki/Wrapper.pm:97
#, perl-format
msgid "failed to write %s: %s"
msgstr "skrivning ad %s mislykkedes: %s"
#. translators: The parameter is a C filename.
-#: ../IkiWiki/Wrapper.pm:135
+#: ../IkiWiki/Wrapper.pm:154
#, perl-format
msgid "failed to compile %s"
msgstr "kompilering af %s mislykkedes"
#. translators: The parameter is a filename.
-#: ../IkiWiki/Wrapper.pm:155
+#: ../IkiWiki/Wrapper.pm:174
#, perl-format
msgid "successfully generated %s"
msgstr "Korrekt bygget %s"
@@ -950,42 +986,42 @@ msgstr "brug: ikiwiki [valg] kilde mål"
msgid " ikiwiki --setup configfile"
msgstr " ikiwiki --setup opsætningsfil"
-#: ../ikiwiki.in:90
+#: ../ikiwiki.in:91
msgid "usage: --set var=value"
msgstr "brug: --set var=værdi"
-#: ../ikiwiki.in:138
+#: ../ikiwiki.in:139
msgid "generating wrappers.."
msgstr "bygger wrappers.."
-#: ../ikiwiki.in:195
+#: ../ikiwiki.in:197
msgid "rebuilding wiki.."
msgstr "genopbygger wiki..."
-#: ../ikiwiki.in:198
+#: ../ikiwiki.in:200
msgid "refreshing wiki.."
msgstr "genopfrisker wiki..."
-#: ../IkiWiki.pm:466
+#: ../IkiWiki.pm:480
msgid "Must specify url to wiki with --url when using --cgi"
msgstr "Skal angive url til wiki med --url når der bruges --cgi"
-#: ../IkiWiki.pm:512
+#: ../IkiWiki.pm:526
msgid "cannot use multiple rcs plugins"
msgstr "kan ikke bruge flere samtidige RCS-udvidelser"
-#: ../IkiWiki.pm:541
+#: ../IkiWiki.pm:555
#, perl-format
msgid "failed to load external plugin needed for %s plugin: %s"
msgstr ""
"indlæsning af ekstern udvidelse krævet af udvidelsen %s mislykkedes: %s"
-#: ../IkiWiki.pm:1165
+#: ../IkiWiki.pm:1187
#, perl-format
msgid "preprocessing loop detected on %s at depth %i"
msgstr "forudberegningssløkke fundet på %s ved dybde %i"
-#: ../IkiWiki.pm:1678
+#: ../IkiWiki.pm:1688
msgid "yes"
msgstr "ja"
diff --git a/po/de.po b/po/de.po
index 022fbfef1..b0db15a6a 100644
--- a/po/de.po
+++ b/po/de.po
@@ -4,10 +4,10 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: ikiwiki 2.40\n"
+"Project-Id-Version: ikiwiki 2.70\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-10-31 16:37-0400\n"
-"PO-Revision-Date: 2008-03-03 21:22+0100\n"
+"POT-Creation-Date: 2008-12-20 18:07-0500\n"
+"PO-Revision-Date: 2008-11-20 19:58+0100\n"
"Last-Translator: Kai Wasserbäch <debian@carbon-project.org>\n"
"Language-Team: German <debian-l10n-german@lists.debian.org>\n"
"MIME-Version: 1.0\n"
@@ -23,9 +23,9 @@ msgid "login failed, perhaps you need to turn on cookies?"
msgstr ""
"Anmeldung fehlgeschlagen, möglicherweise müssen Sie zuvor Cookies aktivieren?"
-#: ../IkiWiki/CGI.pm:163 ../IkiWiki/Plugin/editpage.pm:350
+#: ../IkiWiki/CGI.pm:163 ../IkiWiki/CGI.pm:310
msgid "Your login session has expired."
-msgstr ""
+msgstr "Ihre Anmeldung für die aktuelle Sitzung ist abgelaufen."
#: ../IkiWiki/CGI.pm:184
msgid "Login"
@@ -47,133 +47,131 @@ msgstr "Einstellungen gespeichert."
msgid "You are banned."
msgstr "Sie sind ausgeschlossen worden."
-#: ../IkiWiki/CGI.pm:385 ../IkiWiki/CGI.pm:386 ../IkiWiki.pm:1182
+#: ../IkiWiki/CGI.pm:401 ../IkiWiki/CGI.pm:402 ../IkiWiki.pm:1204
msgid "Error"
msgstr "Fehler"
#: ../IkiWiki/Plugin/aggregate.pm:80
msgid "Aggregation triggered via web."
-msgstr ""
+msgstr "Feed-Erstellung wurde über das Web ausgelöst."
#: ../IkiWiki/Plugin/aggregate.pm:89
msgid "Nothing to do right now, all feeds are up-to-date!"
-msgstr ""
+msgstr "Derzeit nichts zu tun, alle Feeds sind auf dem neusten Stand!"
#: ../IkiWiki/Plugin/aggregate.pm:216
#, perl-format
msgid "missing %s parameter"
msgstr "Parameter %s fehlt"
-#: ../IkiWiki/Plugin/aggregate.pm:250
+#: ../IkiWiki/Plugin/aggregate.pm:251
msgid "new feed"
msgstr "neuer Feed"
-#: ../IkiWiki/Plugin/aggregate.pm:264
+#: ../IkiWiki/Plugin/aggregate.pm:265
msgid "posts"
msgstr "Beiträge"
-#: ../IkiWiki/Plugin/aggregate.pm:266
+#: ../IkiWiki/Plugin/aggregate.pm:267
msgid "new"
msgstr "neu"
-#: ../IkiWiki/Plugin/aggregate.pm:429
+#: ../IkiWiki/Plugin/aggregate.pm:431
#, perl-format
msgid "expiring %s (%s days old)"
msgstr "%s läuft aus (%s Tage alt)"
-#: ../IkiWiki/Plugin/aggregate.pm:436
+#: ../IkiWiki/Plugin/aggregate.pm:438
#, perl-format
msgid "expiring %s"
msgstr "%s läuft aus"
-#: ../IkiWiki/Plugin/aggregate.pm:463
+#: ../IkiWiki/Plugin/aggregate.pm:465
#, perl-format
msgid "last checked %s"
-msgstr ""
+msgstr "zuletzt überprüft am %s"
-#: ../IkiWiki/Plugin/aggregate.pm:467
+#: ../IkiWiki/Plugin/aggregate.pm:469
#, perl-format
msgid "checking feed %s ..."
msgstr "überprüfe Feed %s ..."
-#: ../IkiWiki/Plugin/aggregate.pm:472
+#: ../IkiWiki/Plugin/aggregate.pm:474
#, perl-format
msgid "could not find feed at %s"
msgstr "konnte Feed unter %s nicht finden"
-#: ../IkiWiki/Plugin/aggregate.pm:487
+#: ../IkiWiki/Plugin/aggregate.pm:493
msgid "feed not found"
msgstr "Feed nicht gefunden"
-#: ../IkiWiki/Plugin/aggregate.pm:498
+#: ../IkiWiki/Plugin/aggregate.pm:504
#, perl-format
msgid "(invalid UTF-8 stripped from feed)"
-msgstr "(ungültiges UTF-8 wurde aus dem Feed entfernt)"
+msgstr "(ungültiges UTF-8-Zeichen wurde aus dem Feed entfernt)"
-#: ../IkiWiki/Plugin/aggregate.pm:504
+#: ../IkiWiki/Plugin/aggregate.pm:512
#, perl-format
msgid "(feed entities escaped)"
-msgstr "(Feedentitäten maskiert)"
+msgstr "(Feed-Entitäten maskiert)"
-#: ../IkiWiki/Plugin/aggregate.pm:510
+#: ../IkiWiki/Plugin/aggregate.pm:520
msgid "feed crashed XML::Feed!"
msgstr "Feed führte zum Absturz von XML::Feed!"
-#: ../IkiWiki/Plugin/aggregate.pm:590
+#: ../IkiWiki/Plugin/aggregate.pm:601
#, perl-format
msgid "creating new page %s"
msgstr "erstelle neue Seite %s"
#: ../IkiWiki/Plugin/amazon_s3.pm:31
msgid "deleting bucket.."
-msgstr ""
+msgstr "Lösche Bucket..."
-#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:206
+#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:208
msgid "done"
msgstr "fertig"
#: ../IkiWiki/Plugin/amazon_s3.pm:97
#, perl-format
msgid "Must specify %s"
-msgstr ""
+msgstr "%s muss angegeben werden"
#: ../IkiWiki/Plugin/amazon_s3.pm:136
msgid "Failed to create bucket in S3: "
-msgstr ""
+msgstr "Konnte keinen Bucket in S3 erstellen: "
#: ../IkiWiki/Plugin/amazon_s3.pm:221
-#, fuzzy
msgid "Failed to save file to S3: "
-msgstr "Es konnte keine E-Mail versandt werden"
+msgstr "Konnte Datei nicht bei S3 speichern: "
#: ../IkiWiki/Plugin/amazon_s3.pm:243
-#, fuzzy
msgid "Failed to delete file from S3: "
-msgstr "konnte kein Bild aus dem Code erzeugen"
+msgstr "Konnte Datei nicht bei S3 löschen: "
#: ../IkiWiki/Plugin/attachment.pm:49
#, perl-format
msgid "there is already a page named %s"
-msgstr ""
+msgstr "eine Seite mit dem Namen %s existiert bereits"
#: ../IkiWiki/Plugin/attachment.pm:82
msgid "prohibited by allowed_attachments"
-msgstr ""
+msgstr "durch allowed_attachements verboten"
#: ../IkiWiki/Plugin/attachment.pm:190
msgid "bad attachment filename"
-msgstr ""
+msgstr "fehlerhafter Dateiname für Anhang"
#: ../IkiWiki/Plugin/attachment.pm:232
msgid "attachment upload"
-msgstr ""
+msgstr "Anhang hochladen"
#: ../IkiWiki/Plugin/autoindex.pm:105
msgid "automatic index generation"
-msgstr ""
+msgstr "automatische Index-Erstellung"
-#: ../IkiWiki/Plugin/brokenlinks.pm:33 ../IkiWiki/Plugin/editpage.pm:261
-#: ../IkiWiki/Plugin/inline.pm:327 ../IkiWiki/Plugin/opendiscussion.pm:26
+#: ../IkiWiki/Plugin/brokenlinks.pm:33 ../IkiWiki/Plugin/editpage.pm:260
+#: ../IkiWiki/Plugin/inline.pm:354 ../IkiWiki/Plugin/opendiscussion.pm:26
#: ../IkiWiki/Plugin/orphans.pm:37 ../IkiWiki/Render.pm:79
#: ../IkiWiki/Render.pm:149
msgid "discussion"
@@ -188,6 +186,60 @@ msgstr "%s von %s"
msgid "There are no broken links!"
msgstr "Es gibt keine ungültigen Links!"
+#: ../IkiWiki/Plugin/comments.pm:119 ../IkiWiki/Plugin/format.pm:23
+#, perl-format
+msgid "unsupported page format %s"
+msgstr "nicht unterstütztes Seitenformat %s"
+
+#: ../IkiWiki/Plugin/comments.pm:124
+msgid "comment must have content"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:181
+msgid "Anonymous"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:243 ../IkiWiki/Plugin/recentchanges.pm:101
+msgid "missing page"
+msgstr "fehlende Seite"
+
+#: ../IkiWiki/Plugin/comments.pm:245 ../IkiWiki/Plugin/recentchanges.pm:103
+#, perl-format
+msgid "The page %s does not exist."
+msgstr "Die Seite %s existiert nicht."
+
+#: ../IkiWiki/Plugin/comments.pm:334 ../IkiWiki/Plugin/editpage.pm:124
+msgid "bad page name"
+msgstr "fehlerhafter Seitenname"
+
+#: ../IkiWiki/Plugin/comments.pm:341
+#, fuzzy, perl-format
+msgid "commenting on %s"
+msgstr "erstelle %s"
+
+#: ../IkiWiki/Plugin/comments.pm:359
+#, perl-format
+msgid "page '%s' doesn't exist, so you can't comment"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:366
+#, perl-format
+msgid "comments on page '%s' are closed"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:468
+msgid "Added a comment"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:472
+#, perl-format
+msgid "Added a comment: %s"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:565
+msgid "Comments"
+msgstr ""
+
#: ../IkiWiki/Plugin/conditional.pm:27 ../IkiWiki/Plugin/cutpaste.pm:30
#: ../IkiWiki/Plugin/cutpaste.pm:45 ../IkiWiki/Plugin/cutpaste.pm:61
#: ../IkiWiki/Plugin/testpagespec.pm:26
@@ -197,35 +249,31 @@ msgstr "der Parameter %s wird benötigt"
#: ../IkiWiki/Plugin/cutpaste.pm:66
msgid "no text was copied in this page"
-msgstr ""
+msgstr "es wurde kein Text in diese Seite kopiert"
#: ../IkiWiki/Plugin/cutpaste.pm:69
#, perl-format
msgid "no text was copied in this page with id %s"
-msgstr ""
+msgstr "es wurde kein Text in die Seite mit der ID %s kopiert"
#: ../IkiWiki/Plugin/editpage.pm:40
-#, fuzzy, perl-format
+#, perl-format
msgid "removing old preview %s"
-msgstr "entferne alte Seite %s"
-
-#: ../IkiWiki/Plugin/editpage.pm:125
-msgid "bad page name"
-msgstr ""
+msgstr "entferne alte Vorschau %s"
-#: ../IkiWiki/Plugin/editpage.pm:141
+#: ../IkiWiki/Plugin/editpage.pm:140
#, perl-format
msgid "%s is not an editable page"
msgstr "%s ist keine bearbeitbare Seite"
-#: ../IkiWiki/Plugin/editpage.pm:317
+#: ../IkiWiki/Plugin/editpage.pm:316
#, perl-format
msgid "creating %s"
msgstr "erstelle %s"
-#: ../IkiWiki/Plugin/editpage.pm:335 ../IkiWiki/Plugin/editpage.pm:363
-#: ../IkiWiki/Plugin/editpage.pm:373 ../IkiWiki/Plugin/editpage.pm:408
-#: ../IkiWiki/Plugin/editpage.pm:453
+#: ../IkiWiki/Plugin/editpage.pm:334 ../IkiWiki/Plugin/editpage.pm:353
+#: ../IkiWiki/Plugin/editpage.pm:363 ../IkiWiki/Plugin/editpage.pm:398
+#: ../IkiWiki/Plugin/editpage.pm:443
#, perl-format
msgid "editing %s"
msgstr "bearbeite %s"
@@ -247,14 +295,9 @@ msgstr "»edittemplate« %s registriert für %s"
msgid "failed to process"
msgstr "Bearbeitung fehlgeschlagen"
-#: ../IkiWiki/Plugin/format.pm:22
+#: ../IkiWiki/Plugin/format.pm:20
msgid "must specify format and text"
-msgstr ""
-
-#: ../IkiWiki/Plugin/format.pm:25
-#, perl-format
-msgid "unsupported page format %s"
-msgstr ""
+msgstr "Format und Text muss spezifiziert werden"
#: ../IkiWiki/Plugin/fortune.pm:27
msgid "fortune failed"
@@ -264,25 +307,27 @@ msgstr "»fortune« fehlgeschlagen"
#: ../IkiWiki/Receive.pm:129
#, perl-format
msgid "you are not allowed to change %s"
-msgstr ""
+msgstr "es ist Ihnen nicht erlaubt, %s zu ändern"
#: ../IkiWiki/Plugin/git.pm:658
#, perl-format
msgid "you cannot act on a file with mode %s"
-msgstr ""
+msgstr "Sie können Dateien mit den Zugriffsrechten %s nicht verändern"
#: ../IkiWiki/Plugin/git.pm:662
msgid "you are not allowed to change file modes"
-msgstr ""
+msgstr "Es ist Ihnen nicht erlaubt, Dateizugriffsrechte zu ändern"
#: ../IkiWiki/Plugin/google.pm:27
-#, fuzzy, perl-format
+#, perl-format
msgid "Must specify %s when using the google search plugin"
-msgstr "%s muss angegeben werden, wenn die Sucherweiterung verwandt wird"
+msgstr ""
+"%s muss angegeben werden, wenn die Google-Sucherweiterung verwandt wird"
#: ../IkiWiki/Plugin/google.pm:31
msgid "Failed to parse url, cannot determine domain name"
msgstr ""
+"Verarbeiten der URL fehlgeschlagen, konnte Domainnamen nicht feststellen"
#: ../IkiWiki/Plugin/googlecalendar.pm:32
msgid "failed to find url in html"
@@ -297,14 +342,13 @@ msgid "prog not a valid graphviz program"
msgstr "prog ist kein gültiges graphviz-Programm"
#: ../IkiWiki/Plugin/img.pm:62
-#, fuzzy
msgid "Image::Magick is not installed"
-msgstr "polygen ist nicht installiert"
+msgstr "Image::Magick ist nicht installiert"
#: ../IkiWiki/Plugin/img.pm:69
#, perl-format
msgid "bad size \"%s\""
-msgstr "falsche Größe \"%s\""
+msgstr "falsche Größe »%s«"
#: ../IkiWiki/Plugin/img.pm:80 ../IkiWiki/Plugin/img.pm:84
#: ../IkiWiki/Plugin/img.pm:101
@@ -322,73 +366,72 @@ msgstr "Größenänderung fehlgeschlagen: %s"
msgid "failed to determine size of image %s"
msgstr "Größe des Bildes %s konnte nicht festgestellt werden."
-#: ../IkiWiki/Plugin/inline.pm:93
+#: ../IkiWiki/Plugin/inline.pm:92
msgid "Must specify url to wiki with --url when using --rss or --atom"
msgstr ""
"Die URL zum Wiki muss mit --url angegeben werden, wenn --rss oder --atom "
"genutzt wird"
-#: ../IkiWiki/Plugin/inline.pm:139
-#, fuzzy
+#: ../IkiWiki/Plugin/inline.pm:138
msgid "page editing not allowed"
-msgstr "Zyklische Umleitungen sind nicht erlaubt"
+msgstr "Seitenbearbeitungen sind nicht erlaubt"
-#: ../IkiWiki/Plugin/inline.pm:156
-#, fuzzy
+#: ../IkiWiki/Plugin/inline.pm:155
msgid "missing pages parameter"
-msgstr "Parameter %s fehlt"
+msgstr "Fehlender Seitenparameter"
#: ../IkiWiki/Plugin/inline.pm:204
#, perl-format
msgid "unknown sort type %s"
msgstr "Unbekannter Sortierungstyp %s"
-#: ../IkiWiki/Plugin/inline.pm:285
+#: ../IkiWiki/Plugin/inline.pm:307
msgid "Add a new post titled:"
msgstr "Füge einen neuen Beitrag hinzu. Titel:"
-#: ../IkiWiki/Plugin/inline.pm:301
+#: ../IkiWiki/Plugin/inline.pm:327
#, perl-format
msgid "nonexistant template %s"
msgstr "nicht-vorhandene Vorlage %s"
-#: ../IkiWiki/Plugin/inline.pm:335 ../IkiWiki/Render.pm:83
+#: ../IkiWiki/Plugin/inline.pm:362 ../IkiWiki/Render.pm:83
msgid "Discussion"
msgstr "Diskussion"
-#: ../IkiWiki/Plugin/inline.pm:572
+#: ../IkiWiki/Plugin/inline.pm:587
msgid "RPC::XML::Client not found, not pinging"
-msgstr "RPC::XML::Client nicht gefunden, pinge nicht"
+msgstr "RPC::XML::Client nicht gefunden, führe Ping nicht aus"
#: ../IkiWiki/Plugin/linkmap.pm:106
msgid "failed to run dot"
msgstr "dot konnte nicht ausgeführt werden"
#: ../IkiWiki/Plugin/lockedit.pm:49 ../IkiWiki/Plugin/lockedit.pm:66
-#, fuzzy, perl-format
+#, perl-format
msgid "%s is locked and cannot be edited"
-msgstr "%s wurde von %s gesperrt und kann nicht bearbeitet werden"
+msgstr "%s wurde gesperrt und kann nicht bearbeitet werden"
#: ../IkiWiki/Plugin/mdwn.pm:44
msgid "multimarkdown is enabled, but Text::MultiMarkdown is not installed"
msgstr ""
+"»multimarkdown« ist aktiviert, aber Text::MultiMarkdown ist nicht installiert"
#: ../IkiWiki/Plugin/mdwn.pm:67
#, perl-format
msgid "failed to load Markdown.pm perl module (%s) or /usr/bin/markdown (%s)"
msgstr ""
-"Laden des des Perl-Moduls »Markdown.pm« (%s) oder von »/usr/bin/markdown« (%s) "
+"Laden des Perl-Moduls »Markdown.pm« (%s) oder »/usr/bin/markdown« (%s) "
"fehlgeschlagen"
-#: ../IkiWiki/Plugin/meta.pm:150
+#: ../IkiWiki/Plugin/meta.pm:151
msgid "stylesheet not found"
msgstr "Stylesheet nicht gefunden"
-#: ../IkiWiki/Plugin/meta.pm:184
+#: ../IkiWiki/Plugin/meta.pm:185
msgid "redir page not found"
msgstr "Umleitungsseite nicht gefunden"
-#: ../IkiWiki/Plugin/meta.pm:197
+#: ../IkiWiki/Plugin/meta.pm:198
msgid "redir cycle is not allowed"
msgstr "Zyklische Umleitungen sind nicht erlaubt"
@@ -435,6 +478,8 @@ msgstr "Konto konnte nicht erstellt werden."
#: ../IkiWiki/Plugin/passwordauth.pm:257
msgid "No email address, so cannot email password reset instructions."
msgstr ""
+"Keine E-Mail-Adresse angegeben; deshalb können keine Anweisungen zum "
+"Zurücksetzen des Passworts via E-Mail versandt werden."
#: ../IkiWiki/Plugin/passwordauth.pm:291
msgid "Failed to send mail"
@@ -442,38 +487,37 @@ msgstr "Es konnte keine E-Mail versandt werden"
#: ../IkiWiki/Plugin/passwordauth.pm:293
msgid "You have been mailed password reset instructions."
-msgstr ""
+msgstr "Ihnen wurden Anweisungen zum Zurücksetzen des Passworts zugesandt."
#: ../IkiWiki/Plugin/passwordauth.pm:328
msgid "incorrect password reset url"
-msgstr ""
+msgstr "Fehlerhafte URL zum Zurücksetzen des Passworts"
#: ../IkiWiki/Plugin/passwordauth.pm:331
msgid "password reset denied"
-msgstr ""
+msgstr "Zurücksetzen des Passworts verboten"
#: ../IkiWiki/Plugin/pingee.pm:30
msgid "Ping received."
-msgstr ""
+msgstr "Ping empfangen."
#: ../IkiWiki/Plugin/pinger.pm:53
msgid "requires 'from' and 'to' parameters"
-msgstr ""
+msgstr "erfordert die Parameter »from« und »to«"
#: ../IkiWiki/Plugin/pinger.pm:58
-#, fuzzy, perl-format
+#, perl-format
msgid "Will ping %s"
-msgstr "bearbeite %s"
+msgstr "Werde Ping %s senden"
#: ../IkiWiki/Plugin/pinger.pm:61
#, perl-format
msgid "Ignoring ping directive for wiki %s (this wiki is %s)"
-msgstr ""
+msgstr "Ignoriere Ping-Direktiven für Wiki %s (dies ist Wiki %s)"
#: ../IkiWiki/Plugin/pinger.pm:77
-#, fuzzy
msgid "LWP not found, not pinging"
-msgstr "RPC::XML::Client nicht gefunden, pinge nicht"
+msgstr "LWP nicht gefunden, führe Ping nicht aus"
#: ../IkiWiki/Plugin/poll.pm:69
msgid "vote"
@@ -488,9 +532,8 @@ msgid "polygen not installed"
msgstr "polygen ist nicht installiert"
#: ../IkiWiki/Plugin/polygen.pm:60
-#, fuzzy
msgid "command failed"
-msgstr "»fortune« fehlgeschlagen"
+msgstr "Befehl fehlgeschlagen"
#: ../IkiWiki/Plugin/postsparkline.pm:41
msgid "missing formula"
@@ -506,11 +549,11 @@ msgstr "unbekannte Formel"
#. translators: %A- is the name of the previous day.
#: ../IkiWiki/Plugin/prettydate.pm:15
msgid "late %A- night"
-msgstr "spät am %A- in der Nacht"
+msgstr "%A- spät in der Nacht"
#: ../IkiWiki/Plugin/prettydate.pm:17
msgid "in the wee hours of %A- night"
-msgstr "in den frühen Morgenstunden %A-"
+msgstr "%A- in den frühen Morgenstunden"
#: ../IkiWiki/Plugin/prettydate.pm:20
msgid "terribly early %A morning"
@@ -562,109 +605,101 @@ msgstr "um Mitternacht"
#: ../IkiWiki/Plugin/prettydate.pm:108
msgid "at noon on %A"
-msgstr "am Nachmittag des %A"
+msgstr "%A am Nachmittag"
#: ../IkiWiki/Plugin/progress.pm:34
#, perl-format
msgid "illegal percent value %s"
-msgstr ""
+msgstr "Unzulässiger Prozentwert (%s)"
#: ../IkiWiki/Plugin/progress.pm:59
msgid "need either `percent` or `totalpages` and `donepages` parameters"
-msgstr ""
-
-#: ../IkiWiki/Plugin/recentchanges.pm:100
-msgid "missing page"
-msgstr "fehlende Seite"
+msgstr "Benötige entweder »percent«- oder »totalpages«- und »donepages«-Parameter"
-#: ../IkiWiki/Plugin/recentchanges.pm:102
-#, perl-format
-msgid "The page %s does not exist."
-msgstr "Die Seite %s exisitiert nicht."
-
-#: ../IkiWiki/Plugin/recentchangesdiff.pm:36
+#: ../IkiWiki/Plugin/recentchangesdiff.pm:37
msgid "(Diff truncated)"
-msgstr ""
+msgstr "(Diff beschnitten)"
#: ../IkiWiki/Plugin/remove.pm:31 ../IkiWiki/Plugin/rename.pm:36
-#, fuzzy, perl-format
+#, perl-format
msgid "%s does not exist"
-msgstr "Die Seite %s exisitiert nicht."
+msgstr "%s existiert nicht"
#: ../IkiWiki/Plugin/remove.pm:38
-#, fuzzy, perl-format
+#, perl-format
msgid "%s is not in the srcdir, so it cannot be deleted"
-msgstr "%s wurde von %s gesperrt und kann nicht bearbeitet werden"
+msgstr ""
+"%s ist nicht im Quellverzeichnis und kann deshalb nicht gelöscht werden"
#: ../IkiWiki/Plugin/remove.pm:41 ../IkiWiki/Plugin/rename.pm:45
-#, fuzzy, perl-format
+#, perl-format
msgid "%s is not a file"
-msgstr "%s ist keine bearbeitbare Seite"
+msgstr "%s ist keine Datei"
#: ../IkiWiki/Plugin/remove.pm:115
#, perl-format
msgid "confirm removal of %s"
-msgstr ""
+msgstr "Bestätigen Sie die Entfernung von %s"
#: ../IkiWiki/Plugin/remove.pm:152
msgid "Please select the attachments to remove."
-msgstr ""
+msgstr "Bitte wählen Sie die zu entfernenden Anhänge aus."
#: ../IkiWiki/Plugin/remove.pm:192
msgid "removed"
-msgstr ""
+msgstr "entfernt"
#: ../IkiWiki/Plugin/rename.pm:42
#, perl-format
msgid "%s is not in the srcdir, so it cannot be renamed"
msgstr ""
+"%s ist nicht im Quellverzeichnis und kann deshalb nicht umbenannt werden"
#: ../IkiWiki/Plugin/rename.pm:62
-#, fuzzy
msgid "no change to the file name was specified"
-msgstr "Dateiname des Wrappers nicht angegeben"
+msgstr "Es wurde keine Änderung des Dateinames angegeben"
#: ../IkiWiki/Plugin/rename.pm:68
#, perl-format
msgid "illegal name"
-msgstr ""
+msgstr "unzulässiger Name"
#: ../IkiWiki/Plugin/rename.pm:73
#, perl-format
msgid "%s already exists"
-msgstr ""
+msgstr "%s existiert bereits"
#: ../IkiWiki/Plugin/rename.pm:79
#, perl-format
msgid "%s already exists on disk"
-msgstr ""
+msgstr "%s existiert bereits auf der Festplatte"
#: ../IkiWiki/Plugin/rename.pm:101
-#, fuzzy, perl-format
+#, perl-format
msgid "rename %s"
-msgstr "erzeuge %s"
+msgstr "benenne %s um"
#: ../IkiWiki/Plugin/rename.pm:138
msgid "Also rename SubPages and attachments"
-msgstr ""
+msgstr "Auch SubPages und Anhänge umbenennen"
#: ../IkiWiki/Plugin/rename.pm:224
msgid "Only one attachment can be renamed at a time."
-msgstr ""
+msgstr "Es kann immer nur ein Anhang zur Zeit umbenannt werden."
#: ../IkiWiki/Plugin/rename.pm:227
msgid "Please select the attachment to rename."
-msgstr ""
+msgstr "Bitte wählen Sie den umzubenennenden Anhang aus."
#: ../IkiWiki/Plugin/rename.pm:338
#, perl-format
msgid "rename %s to %s"
-msgstr ""
+msgstr "Benenne %s in %s um"
#: ../IkiWiki/Plugin/rename.pm:490
#, perl-format
msgid "update for rename of %s to %s"
-msgstr ""
+msgstr "Aktualisierung für Umbenennung von %s in %s"
#: ../IkiWiki/Plugin/search.pm:36
#, perl-format
@@ -674,15 +709,15 @@ msgstr "%s muss angegeben werden, wenn die Sucherweiterung verwandt wird"
#: ../IkiWiki/Plugin/search.pm:182
#, perl-format
msgid "need Digest::SHA1 to index %s"
-msgstr ""
+msgstr "Benötige Digest::SHA1, um %s zu indexieren"
#: ../IkiWiki/Plugin/search.pm:217
msgid "search"
-msgstr ""
+msgstr "suchen"
#: ../IkiWiki/Plugin/shortcut.pm:28
msgid "shortcut plugin will not work without a shortcuts.mdwn"
-msgstr "das »shortcut«-Plugin funktioniert nicht ohne eine »shortcuts.mdwn«"
+msgstr "die »shortcut«-Erweiterung funktioniert nicht ohne eine »shortcuts.mdwn«"
#: ../IkiWiki/Plugin/shortcut.pm:38
msgid "missing name or url parameter"
@@ -698,11 +733,11 @@ msgstr "Shortcut %s zeigt auf <i>%s</i>"
#: ../IkiWiki/Plugin/smiley.pm:43
msgid "failed to parse any smileys"
-msgstr "Smileys konnten nicht geparst werden"
+msgstr "Smileys konnten nicht verarbeitet werden"
#: ../IkiWiki/Plugin/sparkline.pm:72
msgid "parse error"
-msgstr "Parse-Fehler"
+msgstr "Verarbeitungsfehler"
#: ../IkiWiki/Plugin/sparkline.pm:78
msgid "bad featurepoint diameter"
@@ -751,7 +786,7 @@ msgstr "Direkter Daten-Download"
#: ../IkiWiki/Plugin/table.pm:134
#, perl-format
msgid "parse fail at line %d: %s"
-msgstr "Parse-Fehler in Zeile %d: %s"
+msgstr "Verarbeitungsfehler in Zeile %d: %s"
#: ../IkiWiki/Plugin/template.pm:28
msgid "missing id parameter"
@@ -780,55 +815,59 @@ msgstr "konnte kein Bild aus dem Code erzeugen"
#: ../IkiWiki/Plugin/websetup.pm:89
msgid "plugin"
-msgstr ""
+msgstr "Erweiterung"
#: ../IkiWiki/Plugin/websetup.pm:108
#, perl-format
msgid "enable %s?"
-msgstr ""
+msgstr "%s aktivieren?"
#: ../IkiWiki/Plugin/websetup.pm:236
msgid "you are not logged in as an admin"
-msgstr ""
+msgstr "Sie sind nicht als Administrator angemeldet"
#: ../IkiWiki/Plugin/websetup.pm:240
msgid "setup file for this wiki is not known"
-msgstr ""
+msgstr "Die Einrichtungsdatei für dieses Wiki ist unbekannt"
#: ../IkiWiki/Plugin/websetup.pm:256
-#, fuzzy
msgid "main"
-msgstr "Administrator"
+msgstr "Hauptseite"
#: ../IkiWiki/Plugin/websetup.pm:257
msgid "plugins"
-msgstr ""
+msgstr "Erweiterungen"
#: ../IkiWiki/Plugin/websetup.pm:395
msgid ""
"The configuration changes shown below require a wiki rebuild to take effect."
msgstr ""
+"Die unten aufgeführten Konfigurationsänderungen erfordern eine erneute "
+"Erzeugung des Wikis, um aktiv zu werden."
#: ../IkiWiki/Plugin/websetup.pm:399
msgid ""
"For the configuration changes shown below to fully take effect, you may need "
"to rebuild the wiki."
msgstr ""
+"Damit die unten aufgeführten Konfigurationsänderungen aktiv werden, kann es "
+"erforderlich sein, das Wiki neu zu erzeugen."
#: ../IkiWiki/Plugin/websetup.pm:433
#, perl-format
msgid "<p class=\"error\">Error: %s exited nonzero (%s)"
msgstr ""
+"<p class=\"error\">Fehler: %s beendete sich mit einem Wert ungleich Null (%s)"
#: ../IkiWiki/Receive.pm:35
#, perl-format
msgid "cannot determine id of untrusted committer %s"
-msgstr ""
+msgstr "Kann ID des nicht vertrauenswürdigen Bearbeiters %s nicht feststellen"
#: ../IkiWiki/Receive.pm:85
-#, fuzzy, perl-format
+#, perl-format
msgid "bad file name %s"
-msgstr "überspringe fehlerhaften Dateinamen %s"
+msgstr "fehlerhafter Dateiname %s"
#: ../IkiWiki/Render.pm:253
#, perl-format
@@ -836,6 +875,8 @@ msgid ""
"symlink found in srcdir path (%s) -- set allow_symlinks_before_srcdir to "
"allow this"
msgstr ""
+"Symbolischer Verweis im Quellverzeichnis (%s) gefunden -- setzen Sie "
+"allow_symlinks_before_srcdir, um dies zu erlauben"
#: ../IkiWiki/Render.pm:277 ../IkiWiki/Render.pm:302
#, perl-format
@@ -845,7 +886,7 @@ msgstr "überspringe fehlerhaften Dateinamen %s"
#: ../IkiWiki/Render.pm:284
#, perl-format
msgid "%s has multiple possible source pages"
-msgstr ""
+msgstr "%s hat mehrere mögliche Quellseiten"
#: ../IkiWiki/Render.pm:360
#, perl-format
@@ -865,12 +906,12 @@ msgstr "erzeuge %s"
#: ../IkiWiki/Render.pm:426
#, perl-format
msgid "rendering %s, which links to %s"
-msgstr "erzeuge %s, was auf %s verweist"
+msgstr "erzeuge %s, die auf %s verweist"
#: ../IkiWiki/Render.pm:447
#, perl-format
msgid "rendering %s, which depends on %s"
-msgstr "erzeuge %s, das von %s abhängt"
+msgstr "erzeuge %s, die von %s abhängt"
#: ../IkiWiki/Render.pm:486
#, perl-format
@@ -897,15 +938,16 @@ msgstr "kann %s nicht lesen: %s"
#: ../IkiWiki/Setup/Automator.pm:33
msgid "you must enter a wikiname (that contains alphanumerics)"
msgstr ""
+"Sie müssen einen Wiki-Namen eingeben (der alphanumerische Zeichen enthält)"
#: ../IkiWiki/Setup/Automator.pm:67
#, perl-format
msgid "unsupported revision control system %s"
-msgstr ""
+msgstr "Nicht unterstütztes Versionskontrollsystem %s"
#: ../IkiWiki/Setup/Automator.pm:83
msgid "failed to set up the repository with ikiwiki-makerepo"
-msgstr ""
+msgstr "Erstellen des Depots mit ikiwiki-makerepo ist fehlgeschlagen"
#: ../IkiWiki/Wrapper.pm:16
#, perl-format
@@ -922,19 +964,19 @@ msgstr "Dateiname des Wrappers nicht angegeben"
#. translators: The first parameter is a filename, and the second is
#. translators: a (probably not translated) error message.
-#: ../IkiWiki/Wrapper.pm:79
+#: ../IkiWiki/Wrapper.pm:97
#, perl-format
msgid "failed to write %s: %s"
-msgstr "schreiben von %s fehlgeschlagen: %s"
+msgstr "Schreiben von %s fehlgeschlagen: %s"
#. translators: The parameter is a C filename.
-#: ../IkiWiki/Wrapper.pm:135
+#: ../IkiWiki/Wrapper.pm:154
#, perl-format
msgid "failed to compile %s"
-msgstr "erzeugen von %s fehlgeschlagen"
+msgstr "Erzeugen von %s fehlgeschlagen"
#. translators: The parameter is a filename.
-#: ../IkiWiki/Wrapper.pm:155
+#: ../IkiWiki/Wrapper.pm:174
#, perl-format
msgid "successfully generated %s"
msgstr "%s wurde erfolgreich erstellt"
@@ -945,82 +987,66 @@ msgstr "Benutzung: ikiwiki [Optionen] Quelle Ziel"
#: ../ikiwiki.in:14
msgid " ikiwiki --setup configfile"
-msgstr ""
+msgstr " ikiwiki --setup Konfigurationsdatei "
-#: ../ikiwiki.in:90
+#: ../ikiwiki.in:91
msgid "usage: --set var=value"
msgstr "Benutzung: --set Variable=Wert"
-#: ../ikiwiki.in:138
+#: ../ikiwiki.in:139
msgid "generating wrappers.."
-msgstr "erzeuge Wrapper.."
+msgstr "erzeuge Wrapper..."
-#: ../ikiwiki.in:195
+#: ../ikiwiki.in:197
msgid "rebuilding wiki.."
-msgstr "erzeuge Wiki neu.."
+msgstr "erzeuge Wiki neu..."
-#: ../ikiwiki.in:198
+#: ../ikiwiki.in:200
msgid "refreshing wiki.."
-msgstr "aktualisiere Wiki.."
+msgstr "aktualisiere Wiki..."
-#: ../IkiWiki.pm:466
+#: ../IkiWiki.pm:480
msgid "Must specify url to wiki with --url when using --cgi"
msgstr ""
"Es muss eine URL zum Wiki mit --url angegeben werden, wenn --cgi verwandt "
"wird"
-#: ../IkiWiki.pm:512
+#: ../IkiWiki.pm:526
msgid "cannot use multiple rcs plugins"
-msgstr ""
+msgstr "Kann nicht mehrere Versionskontrollsystem-Erweiterungen verwenden"
-#: ../IkiWiki.pm:541
+#: ../IkiWiki.pm:555
#, perl-format
msgid "failed to load external plugin needed for %s plugin: %s"
-msgstr ""
+msgstr "Laden der für %s benötigten externen Erweiterung fehlgeschlagen: %s"
-#: ../IkiWiki.pm:1165
-#, fuzzy, perl-format
+#: ../IkiWiki.pm:1187
+#, perl-format
msgid "preprocessing loop detected on %s at depth %i"
-msgstr "Präprozessorschleife %s auf Seite %s in Tiefe %i erkannt"
+msgstr "Präprozessorschleife auf %s in Tiefe %i erkannt"
-#: ../IkiWiki.pm:1678
+#: ../IkiWiki.pm:1688
msgid "yes"
-msgstr ""
+msgstr "ja"
#: ../auto.setup:16
msgid "What will the wiki be named?"
-msgstr ""
+msgstr "Wie soll das Wiki heißen?"
#: ../auto.setup:16
msgid "wiki"
-msgstr ""
+msgstr "Wiki"
#: ../auto.setup:18
msgid "What revision control system to use?"
-msgstr ""
+msgstr "Welches Versionskontrollsystem soll verwandt werden?"
#: ../auto.setup:20
msgid "What wiki user (or openid) will be wiki admin?"
msgstr ""
+"Welcher Wiki-Benutzer (oder welche OpenID) soll der Administrator des Wikis "
+"sein?"
#: ../auto.setup:23
msgid "What is the domain name of the web server?"
-msgstr ""
-
-#~ msgid "processed ok at %s"
-#~ msgstr "normal verarbeitet um %s"
-
-#~ msgid "Your password has been emailed to you."
-#~ msgstr "Ihr Passwort wurde Ihnen via E-Mail zugesandt."
-
-#~ msgid "polygen failed"
-#~ msgstr "polygen fehlgeschlagen"
-
-#~ msgid "cleaning hyperestraier search index"
-#~ msgstr "bereinige hyperestraier-Suchindex"
-
-#~ msgid "updating hyperestraier search index"
-#~ msgstr "aktualisiere hyperestraier-Suchindex"
-
-#~ msgid "(not toggleable in preview mode)"
-#~ msgstr "(nicht aus-/einklappbar im Vorschaumodus)"
+msgstr "Wie lautet der Domainname des Webservers?"
diff --git a/po/es.po b/po/es.po
index 8dce2940f..7966d94f9 100644
--- a/po/es.po
+++ b/po/es.po
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: es\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-10-31 16:37-0400\n"
-"PO-Revision-Date: 2008-10-22 13:54+0200\n"
+"POT-Creation-Date: 2008-12-20 18:07-0500\n"
+"PO-Revision-Date: 2008-12-19 08:10+0100\n"
"Last-Translator: Víctor Moral <victor@taquiones.net>\n"
"Language-Team: Spanish <es@li.org>\n"
"MIME-Version: 1.0\n"
@@ -24,7 +24,7 @@ msgid "login failed, perhaps you need to turn on cookies?"
msgstr ""
"registro fallido, ¿ tal vez necesita activar las cookies en el navegador ?"
-#: ../IkiWiki/CGI.pm:163 ../IkiWiki/Plugin/editpage.pm:350
+#: ../IkiWiki/CGI.pm:163 ../IkiWiki/CGI.pm:310
msgid "Your login session has expired."
msgstr "Su registro en el sistema ha expirado."
@@ -48,7 +48,7 @@ msgstr "Las preferencias se han guardado."
msgid "You are banned."
msgstr "Ha sido expulsado."
-#: ../IkiWiki/CGI.pm:385 ../IkiWiki/CGI.pm:386 ../IkiWiki.pm:1182
+#: ../IkiWiki/CGI.pm:401 ../IkiWiki/CGI.pm:402 ../IkiWiki.pm:1204
msgid "Error"
msgstr "Error"
@@ -66,62 +66,62 @@ msgstr ""
msgid "missing %s parameter"
msgstr "falta el parámetro %s"
-#: ../IkiWiki/Plugin/aggregate.pm:250
+#: ../IkiWiki/Plugin/aggregate.pm:251
msgid "new feed"
msgstr "nueva entrada"
-#: ../IkiWiki/Plugin/aggregate.pm:264
+#: ../IkiWiki/Plugin/aggregate.pm:265
msgid "posts"
msgstr "entradas"
-#: ../IkiWiki/Plugin/aggregate.pm:266
+#: ../IkiWiki/Plugin/aggregate.pm:267
msgid "new"
msgstr "nuevo"
-#: ../IkiWiki/Plugin/aggregate.pm:429
+#: ../IkiWiki/Plugin/aggregate.pm:431
#, perl-format
msgid "expiring %s (%s days old)"
msgstr "%s caducada (%s días de antigüedad)"
-#: ../IkiWiki/Plugin/aggregate.pm:436
+#: ../IkiWiki/Plugin/aggregate.pm:438
#, perl-format
msgid "expiring %s"
msgstr "%s caducada"
-#: ../IkiWiki/Plugin/aggregate.pm:463
+#: ../IkiWiki/Plugin/aggregate.pm:465
#, perl-format
msgid "last checked %s"
msgstr "última comprobación el %s"
-#: ../IkiWiki/Plugin/aggregate.pm:467
+#: ../IkiWiki/Plugin/aggregate.pm:469
#, perl-format
msgid "checking feed %s ..."
msgstr "comprobando fuente de datos %s ..."
-#: ../IkiWiki/Plugin/aggregate.pm:472
+#: ../IkiWiki/Plugin/aggregate.pm:474
#, perl-format
msgid "could not find feed at %s"
msgstr "no puedo encontrar la fuente de datos en %s"
-#: ../IkiWiki/Plugin/aggregate.pm:487
+#: ../IkiWiki/Plugin/aggregate.pm:493
msgid "feed not found"
msgstr "fuente de datos no encontrada"
-#: ../IkiWiki/Plugin/aggregate.pm:498
+#: ../IkiWiki/Plugin/aggregate.pm:504
#, perl-format
msgid "(invalid UTF-8 stripped from feed)"
msgstr "(una secuencia UTF-8 inválida ha sido eliminada de la fuente de datos)"
-#: ../IkiWiki/Plugin/aggregate.pm:504
+#: ../IkiWiki/Plugin/aggregate.pm:512
#, perl-format
msgid "(feed entities escaped)"
msgstr "(los caracteres especiales de la fuente de datos están exceptuados)"
-#: ../IkiWiki/Plugin/aggregate.pm:510
+#: ../IkiWiki/Plugin/aggregate.pm:520
msgid "feed crashed XML::Feed!"
msgstr "¡ la fuente de datos ha provocado un error fatal en XML::Feed !"
-#: ../IkiWiki/Plugin/aggregate.pm:590
+#: ../IkiWiki/Plugin/aggregate.pm:601
#, perl-format
msgid "creating new page %s"
msgstr "creando nueva página %s"
@@ -130,7 +130,7 @@ msgstr "creando nueva página %s"
msgid "deleting bucket.."
msgstr "borrando el directorio.."
-#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:206
+#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:208
msgid "done"
msgstr "completado"
@@ -172,8 +172,8 @@ msgstr "enviado el adjunto"
msgid "automatic index generation"
msgstr "creación de índice automática"
-#: ../IkiWiki/Plugin/brokenlinks.pm:33 ../IkiWiki/Plugin/editpage.pm:261
-#: ../IkiWiki/Plugin/inline.pm:327 ../IkiWiki/Plugin/opendiscussion.pm:26
+#: ../IkiWiki/Plugin/brokenlinks.pm:33 ../IkiWiki/Plugin/editpage.pm:260
+#: ../IkiWiki/Plugin/inline.pm:354 ../IkiWiki/Plugin/opendiscussion.pm:26
#: ../IkiWiki/Plugin/orphans.pm:37 ../IkiWiki/Render.pm:79
#: ../IkiWiki/Render.pm:149
msgid "discussion"
@@ -188,6 +188,60 @@ msgstr "%s desde la página %s"
msgid "There are no broken links!"
msgstr "¡ No hay enlaces rotos !"
+#: ../IkiWiki/Plugin/comments.pm:119 ../IkiWiki/Plugin/format.pm:23
+#, perl-format
+msgid "unsupported page format %s"
+msgstr "formato de página %s no soportado"
+
+#: ../IkiWiki/Plugin/comments.pm:124
+msgid "comment must have content"
+msgstr "Un comentario debe tener algún contenido"
+
+#: ../IkiWiki/Plugin/comments.pm:181
+msgid "Anonymous"
+msgstr "Anónimo"
+
+#: ../IkiWiki/Plugin/comments.pm:243 ../IkiWiki/Plugin/recentchanges.pm:101
+msgid "missing page"
+msgstr "página no encontrada"
+
+#: ../IkiWiki/Plugin/comments.pm:245 ../IkiWiki/Plugin/recentchanges.pm:103
+#, perl-format
+msgid "The page %s does not exist."
+msgstr "No existe la página %s."
+
+#: ../IkiWiki/Plugin/comments.pm:334 ../IkiWiki/Plugin/editpage.pm:124
+msgid "bad page name"
+msgstr "nombre de página erróneo"
+
+#: ../IkiWiki/Plugin/comments.pm:341
+#, perl-format
+msgid "commenting on %s"
+msgstr "creando comentarios en la página %s"
+
+#: ../IkiWiki/Plugin/comments.pm:359
+#, perl-format
+msgid "page '%s' doesn't exist, so you can't comment"
+msgstr "la página '%s' no existe, así que no se puede comentar sobre ella"
+
+#: ../IkiWiki/Plugin/comments.pm:366
+#, perl-format
+msgid "comments on page '%s' are closed"
+msgstr "los comentarios para la página '%s' están cerrados"
+
+#: ../IkiWiki/Plugin/comments.pm:468
+msgid "Added a comment"
+msgstr "Añadir un comentario"
+
+#: ../IkiWiki/Plugin/comments.pm:472
+#, perl-format
+msgid "Added a comment: %s"
+msgstr "Comentario añadido: %s"
+
+#: ../IkiWiki/Plugin/comments.pm:565
+msgid "Comments"
+msgstr "Comentarios"
+
#: ../IkiWiki/Plugin/conditional.pm:27 ../IkiWiki/Plugin/cutpaste.pm:30
#: ../IkiWiki/Plugin/cutpaste.pm:45 ../IkiWiki/Plugin/cutpaste.pm:61
#: ../IkiWiki/Plugin/testpagespec.pm:26
@@ -209,24 +263,19 @@ msgstr "no se ha copiado ningún texto con el identificador %s en esta pagina"
msgid "removing old preview %s"
msgstr "eliminando la antigua previsualización %s"
-#: ../IkiWiki/Plugin/editpage.pm:125
-#, fuzzy
-msgid "bad page name"
-msgstr "nombre de archivo adjunto erróneo"
-
-#: ../IkiWiki/Plugin/editpage.pm:141
+#: ../IkiWiki/Plugin/editpage.pm:140
#, perl-format
msgid "%s is not an editable page"
msgstr "la página %s no es modificable"
-#: ../IkiWiki/Plugin/editpage.pm:317
+#: ../IkiWiki/Plugin/editpage.pm:316
#, perl-format
msgid "creating %s"
msgstr "creando página %s"
-#: ../IkiWiki/Plugin/editpage.pm:335 ../IkiWiki/Plugin/editpage.pm:363
-#: ../IkiWiki/Plugin/editpage.pm:373 ../IkiWiki/Plugin/editpage.pm:408
-#: ../IkiWiki/Plugin/editpage.pm:453
+#: ../IkiWiki/Plugin/editpage.pm:334 ../IkiWiki/Plugin/editpage.pm:353
+#: ../IkiWiki/Plugin/editpage.pm:363 ../IkiWiki/Plugin/editpage.pm:398
+#: ../IkiWiki/Plugin/editpage.pm:443
#, perl-format
msgid "editing %s"
msgstr "modificando página %s"
@@ -248,14 +297,9 @@ msgstr "plantilla de edición %s registrada para %s"
msgid "failed to process"
msgstr "fallo en el proceso"
-#: ../IkiWiki/Plugin/format.pm:22
+#: ../IkiWiki/Plugin/format.pm:20
msgid "must specify format and text"
-msgstr ""
-
-#: ../IkiWiki/Plugin/format.pm:25
-#, fuzzy, perl-format
-msgid "unsupported page format %s"
-msgstr "el sistema de control de versiones %s no está soportado"
+msgstr "se deben especificar tanto el formato como el texto"
#: ../IkiWiki/Plugin/fortune.pm:27
msgid "fortune failed"
@@ -263,19 +307,18 @@ msgstr "el programa fortune ha fallado"
#: ../IkiWiki/Plugin/git.pm:618 ../IkiWiki/Plugin/git.pm:636
#: ../IkiWiki/Receive.pm:129
-#, fuzzy, perl-format
+#, perl-format
msgid "you are not allowed to change %s"
-msgstr "No está registrado como un administrador"
+msgstr "No puede cambiar %s"
#: ../IkiWiki/Plugin/git.pm:658
#, perl-format
msgid "you cannot act on a file with mode %s"
-msgstr ""
+msgstr "no puede actuar sobre un archivo con permisos %s"
#: ../IkiWiki/Plugin/git.pm:662
-#, fuzzy
msgid "you are not allowed to change file modes"
-msgstr "No está registrado como un administrador"
+msgstr "No puede cambiar los permisos de acceso de un archivo"
#: ../IkiWiki/Plugin/google.pm:27
#, perl-format
@@ -327,17 +370,17 @@ msgstr "redimensionado fallido: %s"
msgid "failed to determine size of image %s"
msgstr "no he podido determinar el tamaño de la imagen %s"
-#: ../IkiWiki/Plugin/inline.pm:93
+#: ../IkiWiki/Plugin/inline.pm:92
msgid "Must specify url to wiki with --url when using --rss or --atom"
msgstr ""
"Es obligatorio indicar un url al wiki cuando se usan los parámetros --rss ó "
"--atom"
-#: ../IkiWiki/Plugin/inline.pm:139
+#: ../IkiWiki/Plugin/inline.pm:138
msgid "page editing not allowed"
msgstr "no está permitida la modificación de páginas"
-#: ../IkiWiki/Plugin/inline.pm:156
+#: ../IkiWiki/Plugin/inline.pm:155
msgid "missing pages parameter"
msgstr "falta el parámetro pages"
@@ -346,20 +389,20 @@ msgstr "falta el parámetro pages"
msgid "unknown sort type %s"
msgstr "no conozco este tipo de ordenación %s"
-#: ../IkiWiki/Plugin/inline.pm:285
+#: ../IkiWiki/Plugin/inline.pm:307
msgid "Add a new post titled:"
msgstr "Añadir una entrada nueva titulada:"
-#: ../IkiWiki/Plugin/inline.pm:301
+#: ../IkiWiki/Plugin/inline.pm:327
#, perl-format
msgid "nonexistant template %s"
msgstr "la plantilla %s no existe "
-#: ../IkiWiki/Plugin/inline.pm:335 ../IkiWiki/Render.pm:83
+#: ../IkiWiki/Plugin/inline.pm:362 ../IkiWiki/Render.pm:83
msgid "Discussion"
msgstr "Comentarios"
-#: ../IkiWiki/Plugin/inline.pm:572
+#: ../IkiWiki/Plugin/inline.pm:587
msgid "RPC::XML::Client not found, not pinging"
msgstr "No he encontrado el componente RPC::XML::Client, no envío señal alguna"
@@ -384,15 +427,15 @@ msgstr ""
"no he podido cargar el módulo Perl Markdown.pm (%s) ó no he podido ejecutar "
"el programa /usr/bin/markdown (%s)"
-#: ../IkiWiki/Plugin/meta.pm:150
+#: ../IkiWiki/Plugin/meta.pm:151
msgid "stylesheet not found"
msgstr "hoja de estilo no encontrada "
-#: ../IkiWiki/Plugin/meta.pm:184
+#: ../IkiWiki/Plugin/meta.pm:185
msgid "redir page not found"
msgstr "falta la página a donde redirigir"
-#: ../IkiWiki/Plugin/meta.pm:197
+#: ../IkiWiki/Plugin/meta.pm:198
msgid "redir cycle is not allowed"
msgstr "ciclo de redirección no permitido"
@@ -579,16 +622,7 @@ msgstr "%s es un valor erróneo para un porcentaje"
msgid "need either `percent` or `totalpages` and `donepages` parameters"
msgstr "son necesarios los parámetros 'donepages' y 'percent' ó 'totalpages'"
-#: ../IkiWiki/Plugin/recentchanges.pm:100
-msgid "missing page"
-msgstr "página no encontrada"
-
-#: ../IkiWiki/Plugin/recentchanges.pm:102
-#, perl-format
-msgid "The page %s does not exist."
-msgstr "No existe la página %s."
-
-#: ../IkiWiki/Plugin/recentchangesdiff.pm:36
+#: ../IkiWiki/Plugin/recentchangesdiff.pm:37
msgid "(Diff truncated)"
msgstr "(Lista de diferencias truncada)"
@@ -831,12 +865,12 @@ msgstr "<p class=\"error\">Error: %s finaliza con código distinto de cero (%s)"
#: ../IkiWiki/Receive.pm:35
#, perl-format
msgid "cannot determine id of untrusted committer %s"
-msgstr ""
+msgstr "no puedo determinar el identificador de un usuario no fiable como %s"
#: ../IkiWiki/Receive.pm:85
-#, fuzzy, perl-format
+#, perl-format
msgid "bad file name %s"
-msgstr "ignorando el archivo %s porque su nombre no es correcto"
+msgstr "el nombre de archivo %s es erróneo"
#: ../IkiWiki/Render.pm:253
#, perl-format
@@ -935,19 +969,19 @@ msgstr "el programa envoltorio no ha sido especificado"
#. translators: The first parameter is a filename, and the second is
#. translators: a (probably not translated) error message.
-#: ../IkiWiki/Wrapper.pm:79
+#: ../IkiWiki/Wrapper.pm:97
#, perl-format
msgid "failed to write %s: %s"
msgstr "no puedo escribir en %s: %s"
#. translators: The parameter is a C filename.
-#: ../IkiWiki/Wrapper.pm:135
+#: ../IkiWiki/Wrapper.pm:154
#, perl-format
msgid "failed to compile %s"
msgstr "ha fallado la compilación del programa %s"
#. translators: The parameter is a filename.
-#: ../IkiWiki/Wrapper.pm:155
+#: ../IkiWiki/Wrapper.pm:174
#, perl-format
msgid "successfully generated %s"
msgstr "creado con éxito el programa envoltorio %s"
@@ -960,45 +994,45 @@ msgstr "uso: ikiwiki [opciones] origen destino"
msgid " ikiwiki --setup configfile"
msgstr " ikiwiki --setup archivo_de_configuración"
-#: ../ikiwiki.in:90
+#: ../ikiwiki.in:91
msgid "usage: --set var=value"
msgstr "uso: --set variable=valor"
-#: ../ikiwiki.in:138
+#: ../ikiwiki.in:139
msgid "generating wrappers.."
msgstr "generando programas auxiliares.."
-#: ../ikiwiki.in:195
+#: ../ikiwiki.in:197
msgid "rebuilding wiki.."
msgstr "reconstruyendo el wiki.."
-#: ../ikiwiki.in:198
+#: ../ikiwiki.in:200
msgid "refreshing wiki.."
msgstr "actualizando el wiki.."
-#: ../IkiWiki.pm:466
+#: ../IkiWiki.pm:480
msgid "Must specify url to wiki with --url when using --cgi"
msgstr ""
"Es obligatorio especificar un url al wiki con el parámetro --url si se "
"utiliza el parámetro --cgi"
-#: ../IkiWiki.pm:512
+#: ../IkiWiki.pm:526
msgid "cannot use multiple rcs plugins"
msgstr "no puedo emplear varios complementos rcs"
-#: ../IkiWiki.pm:541
+#: ../IkiWiki.pm:555
#, perl-format
msgid "failed to load external plugin needed for %s plugin: %s"
msgstr "no he podido cargar el complemento externo %s necesario para %s"
-#: ../IkiWiki.pm:1165
+#: ../IkiWiki.pm:1187
#, perl-format
msgid "preprocessing loop detected on %s at depth %i"
msgstr ""
"se ha detectado en la página %s un bucle de preprocesado en la iteración "
"número %i"
-#: ../IkiWiki.pm:1678
+#: ../IkiWiki.pm:1688
msgid "yes"
msgstr "si"
diff --git a/po/fr.po b/po/fr.po
index 53095c5e1..e45d19cc2 100644
--- a/po/fr.po
+++ b/po/fr.po
@@ -7,16 +7,15 @@
# Cyril Brulebois <cyril.brulebois@enst-bretagne.fr>, 2007.
msgid ""
msgstr ""
-"Project-Id-Version: \n"
+"Project-Id-Version: ikiwiki 2.70 \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-10-31 16:37-0400\n"
-"PO-Revision-Date: 2008-10-11 10:34+0200\n"
-"Last-Translator: Julien Patriarca <patriarcaj@gmail.com>\n"
+"POT-Creation-Date: 2008-12-20 18:07-0500\n"
+"PO-Revision-Date: 2008-11-19 21:53+0100\n"
+"Last-Translator: Philippe Batailler <philippe.batailler@free.fr>\n"
"Language-Team: French <debian-l10n-french@lists.debian.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: KBabel 1.11.4\n"
#: ../IkiWiki/CGI.pm:113
msgid "You need to log in first."
@@ -24,10 +23,9 @@ msgstr "Vous devez d'abord vous identifier."
#: ../IkiWiki/CGI.pm:145
msgid "login failed, perhaps you need to turn on cookies?"
-msgstr ""
-"Échec de l'identification, vous devriez peut-être autoriser les cookies."
+msgstr "Échec de l'identification, vous devez autoriser les cookies."
-#: ../IkiWiki/CGI.pm:163 ../IkiWiki/Plugin/editpage.pm:350
+#: ../IkiWiki/CGI.pm:163 ../IkiWiki/CGI.pm:310
msgid "Your login session has expired."
msgstr "Session d'authentification expirée."
@@ -51,89 +49,88 @@ msgstr "Les préférences ont été enregistrées."
msgid "You are banned."
msgstr "Vous avez été banni."
-#: ../IkiWiki/CGI.pm:385 ../IkiWiki/CGI.pm:386 ../IkiWiki.pm:1182
+#: ../IkiWiki/CGI.pm:401 ../IkiWiki/CGI.pm:402 ../IkiWiki.pm:1204
msgid "Error"
msgstr "Erreur"
#: ../IkiWiki/Plugin/aggregate.pm:80
msgid "Aggregation triggered via web."
-msgstr "Agrégation déclenchée via Internet"
+msgstr "Agrégation déclenchée par le web"
#: ../IkiWiki/Plugin/aggregate.pm:89
msgid "Nothing to do right now, all feeds are up-to-date!"
-msgstr "Rien à faire pour le moment, tous les flux sont à jour!"
+msgstr "Rien à faire pour le moment, tous les flux sont à jour !"
#: ../IkiWiki/Plugin/aggregate.pm:216
#, perl-format
msgid "missing %s parameter"
msgstr "Paramètre %s manquant"
-#: ../IkiWiki/Plugin/aggregate.pm:250
+#: ../IkiWiki/Plugin/aggregate.pm:251
msgid "new feed"
msgstr "Nouveau flux"
-#: ../IkiWiki/Plugin/aggregate.pm:264
+#: ../IkiWiki/Plugin/aggregate.pm:265
msgid "posts"
msgstr "Articles"
-#: ../IkiWiki/Plugin/aggregate.pm:266
+#: ../IkiWiki/Plugin/aggregate.pm:267
msgid "new"
msgstr "Nouveau"
-#: ../IkiWiki/Plugin/aggregate.pm:429
+#: ../IkiWiki/Plugin/aggregate.pm:431
#, perl-format
msgid "expiring %s (%s days old)"
msgstr "Fin de validité de %s (date de %s jours)"
-#: ../IkiWiki/Plugin/aggregate.pm:436
+#: ../IkiWiki/Plugin/aggregate.pm:438
#, perl-format
msgid "expiring %s"
msgstr "Fin de validité de %s"
-#: ../IkiWiki/Plugin/aggregate.pm:463
+#: ../IkiWiki/Plugin/aggregate.pm:465
#, perl-format
msgid "last checked %s"
-msgstr ""
+msgstr "dernière vérification : %s"
-#: ../IkiWiki/Plugin/aggregate.pm:467
+#: ../IkiWiki/Plugin/aggregate.pm:469
#, perl-format
msgid "checking feed %s ..."
msgstr "Vérification du flux %s..."
-#: ../IkiWiki/Plugin/aggregate.pm:472
+#: ../IkiWiki/Plugin/aggregate.pm:474
#, perl-format
msgid "could not find feed at %s"
msgstr "Impossible de trouver de flux à %s"
-#: ../IkiWiki/Plugin/aggregate.pm:487
+#: ../IkiWiki/Plugin/aggregate.pm:493
msgid "feed not found"
msgstr "Flux introuvable "
-#: ../IkiWiki/Plugin/aggregate.pm:498
+#: ../IkiWiki/Plugin/aggregate.pm:504
#, perl-format
msgid "(invalid UTF-8 stripped from feed)"
msgstr "(chaîne UTF-8 non valable supprimée du flux)"
-#: ../IkiWiki/Plugin/aggregate.pm:504
+#: ../IkiWiki/Plugin/aggregate.pm:512
#, perl-format
msgid "(feed entities escaped)"
msgstr "(échappement des entités de flux)"
-#: ../IkiWiki/Plugin/aggregate.pm:510
+#: ../IkiWiki/Plugin/aggregate.pm:520
msgid "feed crashed XML::Feed!"
msgstr "Plantage du flux XML::Feed !"
-#: ../IkiWiki/Plugin/aggregate.pm:590
+#: ../IkiWiki/Plugin/aggregate.pm:601
#, perl-format
msgid "creating new page %s"
msgstr "Création de la nouvelle page %s"
#: ../IkiWiki/Plugin/amazon_s3.pm:31
-#, fuzzy
msgid "deleting bucket.."
-msgstr "suppression du compartiment (« bucket »)..."
+msgstr "suppression du compartiment S3 (« bucket »)..."
-#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:206
+#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:208
msgid "done"
msgstr "Terminé"
@@ -143,17 +140,14 @@ msgid "Must specify %s"
msgstr "Vous devez spécifier %s"
#: ../IkiWiki/Plugin/amazon_s3.pm:136
-#, fuzzy
msgid "Failed to create bucket in S3: "
-msgstr "Échec lors de la création du compartiment sur S3 :"
+msgstr "Impossible de créer un compartiment S3 :"
#: ../IkiWiki/Plugin/amazon_s3.pm:221
-#, fuzzy
msgid "Failed to save file to S3: "
-msgstr "Échec lors de la création du fichier sur S3 :"
+msgstr "Impossible de sauvegarder le fichier dans le compartiment S3 :"
#: ../IkiWiki/Plugin/amazon_s3.pm:243
-#, fuzzy
msgid "Failed to delete file from S3: "
msgstr "Échec lors de la suppression du fichier sur S3 :"
@@ -163,13 +157,12 @@ msgid "there is already a page named %s"
msgstr "il existe déjà une page nommée %s"
#: ../IkiWiki/Plugin/attachment.pm:82
-#, fuzzy
msgid "prohibited by allowed_attachments"
msgstr "action interdite par allowed_attachments"
#: ../IkiWiki/Plugin/attachment.pm:190
msgid "bad attachment filename"
-msgstr "Mauvais nom de la pièce jointe"
+msgstr "Nom de la pièce jointe incorrect"
#: ../IkiWiki/Plugin/attachment.pm:232
msgid "attachment upload"
@@ -179,8 +172,8 @@ msgstr "envoi de la pièce jointe"
msgid "automatic index generation"
msgstr "génération de l'index automatique"
-#: ../IkiWiki/Plugin/brokenlinks.pm:33 ../IkiWiki/Plugin/editpage.pm:261
-#: ../IkiWiki/Plugin/inline.pm:327 ../IkiWiki/Plugin/opendiscussion.pm:26
+#: ../IkiWiki/Plugin/brokenlinks.pm:33 ../IkiWiki/Plugin/editpage.pm:260
+#: ../IkiWiki/Plugin/inline.pm:354 ../IkiWiki/Plugin/opendiscussion.pm:26
#: ../IkiWiki/Plugin/orphans.pm:37 ../IkiWiki/Render.pm:79
#: ../IkiWiki/Render.pm:149
msgid "discussion"
@@ -195,6 +188,60 @@ msgstr "%s sur %s"
msgid "There are no broken links!"
msgstr "Il n'existe pas de lien cassé !"
+#: ../IkiWiki/Plugin/comments.pm:119 ../IkiWiki/Plugin/format.pm:23
+#, perl-format
+msgid "unsupported page format %s"
+msgstr "format de page non reconnu %s"
+
+#: ../IkiWiki/Plugin/comments.pm:124
+msgid "comment must have content"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:181
+msgid "Anonymous"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:243 ../IkiWiki/Plugin/recentchanges.pm:101
+msgid "missing page"
+msgstr "Page manquante"
+
+#: ../IkiWiki/Plugin/comments.pm:245 ../IkiWiki/Plugin/recentchanges.pm:103
+#, perl-format
+msgid "The page %s does not exist."
+msgstr "La page %s n'existe pas."
+
+#: ../IkiWiki/Plugin/comments.pm:334 ../IkiWiki/Plugin/editpage.pm:124
+msgid "bad page name"
+msgstr "nom de page incorrect"
+
+#: ../IkiWiki/Plugin/comments.pm:341
+#, fuzzy, perl-format
+msgid "commenting on %s"
+msgstr "Création de %s"
+
+#: ../IkiWiki/Plugin/comments.pm:359
+#, perl-format
+msgid "page '%s' doesn't exist, so you can't comment"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:366
+#, perl-format
+msgid "comments on page '%s' are closed"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:468
+msgid "Added a comment"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:472
+#, perl-format
+msgid "Added a comment: %s"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:565
+msgid "Comments"
+msgstr ""
+
#: ../IkiWiki/Plugin/conditional.pm:27 ../IkiWiki/Plugin/cutpaste.pm:30
#: ../IkiWiki/Plugin/cutpaste.pm:45 ../IkiWiki/Plugin/cutpaste.pm:61
#: ../IkiWiki/Plugin/testpagespec.pm:26
@@ -212,28 +259,23 @@ msgid "no text was copied in this page with id %s"
msgstr "Aucun texte n'a été copié dans cette page avec l'identifiant %s"
#: ../IkiWiki/Plugin/editpage.pm:40
-#, fuzzy, perl-format
+#, perl-format
msgid "removing old preview %s"
msgstr "Suppression de l'ancienne prévisualisation %s"
-#: ../IkiWiki/Plugin/editpage.pm:125
-#, fuzzy
-msgid "bad page name"
-msgstr "Mauvais nom de la pièce jointe"
-
-#: ../IkiWiki/Plugin/editpage.pm:141
+#: ../IkiWiki/Plugin/editpage.pm:140
#, perl-format
msgid "%s is not an editable page"
msgstr "%s n'est pas une page éditable"
-#: ../IkiWiki/Plugin/editpage.pm:317
+#: ../IkiWiki/Plugin/editpage.pm:316
#, perl-format
msgid "creating %s"
msgstr "Création de %s"
-#: ../IkiWiki/Plugin/editpage.pm:335 ../IkiWiki/Plugin/editpage.pm:363
-#: ../IkiWiki/Plugin/editpage.pm:373 ../IkiWiki/Plugin/editpage.pm:408
-#: ../IkiWiki/Plugin/editpage.pm:453
+#: ../IkiWiki/Plugin/editpage.pm:334 ../IkiWiki/Plugin/editpage.pm:353
+#: ../IkiWiki/Plugin/editpage.pm:363 ../IkiWiki/Plugin/editpage.pm:398
+#: ../IkiWiki/Plugin/editpage.pm:443
#, perl-format
msgid "editing %s"
msgstr "Édition de %s"
@@ -255,14 +297,9 @@ msgstr "edittemplate %s enregistré pour %s"
msgid "failed to process"
msgstr "Échec du traitement"
-#: ../IkiWiki/Plugin/format.pm:22
+#: ../IkiWiki/Plugin/format.pm:20
msgid "must specify format and text"
-msgstr ""
-
-#: ../IkiWiki/Plugin/format.pm:25
-#, fuzzy, perl-format
-msgid "unsupported page format %s"
-msgstr "Système de contrôle de version non reconnu"
+msgstr "le format et le texte doivent être indiqués"
#: ../IkiWiki/Plugin/fortune.pm:27
msgid "fortune failed"
@@ -270,32 +307,31 @@ msgstr "Échec du lancement de « fortune »"
#: ../IkiWiki/Plugin/git.pm:618 ../IkiWiki/Plugin/git.pm:636
#: ../IkiWiki/Receive.pm:129
-#, fuzzy, perl-format
+#, perl-format
msgid "you are not allowed to change %s"
-msgstr "vous n'êtes pas authentifié comme administrateur"
+msgstr "vous n'êtes pas autorisé à modifier %s"
#: ../IkiWiki/Plugin/git.pm:658
#, perl-format
msgid "you cannot act on a file with mode %s"
-msgstr ""
+msgstr "Vous ne pouvez utiliser le mode %s pour les fichiers"
#: ../IkiWiki/Plugin/git.pm:662
-#, fuzzy
msgid "you are not allowed to change file modes"
-msgstr "vous n'êtes pas authentifié comme administrateur"
+msgstr "vous n'êtes pas autorisé à modifier le mode des fichiers"
#: ../IkiWiki/Plugin/google.pm:27
-#, fuzzy, perl-format
+#, perl-format
msgid "Must specify %s when using the google search plugin"
-msgstr "Vous devez indiquer %s lors de l'utilisation du greffon « search »."
+msgstr "Vous devez indiquer %s lors de l'utilisation du greffon « google »."
#: ../IkiWiki/Plugin/google.pm:31
msgid "Failed to parse url, cannot determine domain name"
-msgstr ""
+msgstr "Impossible d'analyser l'url, pas de nom de domaine"
#: ../IkiWiki/Plugin/googlecalendar.pm:32
msgid "failed to find url in html"
-msgstr "Échec dans la recherche d'une URL dans le Code HTML"
+msgstr "Impossible de trouver une URL dans le code HTML"
#: ../IkiWiki/Plugin/graphviz.pm:67
msgid "failed to run graphviz"
@@ -330,19 +366,17 @@ msgstr "Échec du redimensionnement : %s"
msgid "failed to determine size of image %s"
msgstr "Échec de la détermination de la taille de l'image : %s"
-#: ../IkiWiki/Plugin/inline.pm:93
+#: ../IkiWiki/Plugin/inline.pm:92
msgid "Must specify url to wiki with --url when using --rss or --atom"
msgstr ""
"Vous devez indiquer l'URL du wiki par --url lors de l'utilisation de --rss "
"ou --atom"
-#: ../IkiWiki/Plugin/inline.pm:139
-#, fuzzy
+#: ../IkiWiki/Plugin/inline.pm:138
msgid "page editing not allowed"
msgstr "Modification de page interdite"
-#: ../IkiWiki/Plugin/inline.pm:156
-#, fuzzy
+#: ../IkiWiki/Plugin/inline.pm:155
msgid "missing pages parameter"
msgstr "paramètre « pages » manquant"
@@ -351,20 +385,20 @@ msgstr "paramètre « pages » manquant"
msgid "unknown sort type %s"
msgstr "Type de tri %s inconnu"
-#: ../IkiWiki/Plugin/inline.pm:285
+#: ../IkiWiki/Plugin/inline.pm:307
msgid "Add a new post titled:"
msgstr "Ajouter un nouvel article dont le titre est :"
-#: ../IkiWiki/Plugin/inline.pm:301
+#: ../IkiWiki/Plugin/inline.pm:327
#, perl-format
msgid "nonexistant template %s"
-msgstr "Le modèle (« template ») %s n'existe pas"
+msgstr "Le modèle de page %s n'existe pas"
-#: ../IkiWiki/Plugin/inline.pm:335 ../IkiWiki/Render.pm:83
+#: ../IkiWiki/Plugin/inline.pm:362 ../IkiWiki/Render.pm:83
msgid "Discussion"
msgstr "Discussion"
-#: ../IkiWiki/Plugin/inline.pm:572
+#: ../IkiWiki/Plugin/inline.pm:587
msgid "RPC::XML::Client not found, not pinging"
msgstr "RPC::XML::Client introuvable, pas de réponse au ping"
@@ -388,15 +422,15 @@ msgstr ""
"Échec du chargement du module Perl Markdown.pm (%s) ou de /usr/bin/markdown "
"(%s)"
-#: ../IkiWiki/Plugin/meta.pm:150
+#: ../IkiWiki/Plugin/meta.pm:151
msgid "stylesheet not found"
msgstr "Feuille de style introuvable "
-#: ../IkiWiki/Plugin/meta.pm:184
+#: ../IkiWiki/Plugin/meta.pm:185
msgid "redir page not found"
msgstr "Page de redirection introuvable"
-#: ../IkiWiki/Plugin/meta.pm:197
+#: ../IkiWiki/Plugin/meta.pm:198
msgid "redir cycle is not allowed"
msgstr "Redirection cyclique non autorisée"
@@ -430,7 +464,7 @@ msgstr "Toutes les pages sont liées à d'autres pages."
#: ../IkiWiki/Plugin/pagetemplate.pm:30
msgid "bad or missing template"
-msgstr "Modèle incorrect ou manquant"
+msgstr "Modèle de page incorrect ou manquant"
#: ../IkiWiki/Plugin/passwordauth.pm:247
msgid "Account creation successful. Now you can Login."
@@ -448,7 +482,7 @@ msgstr ""
#: ../IkiWiki/Plugin/passwordauth.pm:291
msgid "Failed to send mail"
-msgstr "Échec de l'envoi du courriel"
+msgstr "Impossible d'envoyer un courriel"
#: ../IkiWiki/Plugin/passwordauth.pm:293
msgid "You have been mailed password reset instructions."
@@ -480,7 +514,7 @@ msgstr "va envoyer un ping à %s"
#: ../IkiWiki/Plugin/pinger.pm:61
#, perl-format
msgid "Ignoring ping directive for wiki %s (this wiki is %s)"
-msgstr "les instructions du wiki %s sont ignorées (ce wiki est %s)"
+msgstr "Les instructions du wiki %s sont ignorées (ce wiki est %s)"
#: ../IkiWiki/Plugin/pinger.pm:77
msgid "LWP not found, not pinging"
@@ -500,7 +534,7 @@ msgstr "polygen n'est pas installé"
#: ../IkiWiki/Plugin/polygen.pm:60
msgid "command failed"
-msgstr "Échec lors du lancement de la commande"
+msgstr "Échec de la commande"
#: ../IkiWiki/Plugin/postsparkline.pm:41
msgid "missing formula"
@@ -548,15 +582,15 @@ msgstr "%A après-midi"
#: ../IkiWiki/Plugin/prettydate.pm:32
msgid "late %A afternoon"
-msgstr "tard l'après-midi de %A"
+msgstr "tard dans l'après-midi de %A"
#: ../IkiWiki/Plugin/prettydate.pm:33
msgid "%A evening"
-msgstr "%A soir"
+msgstr "%A en soirée"
#: ../IkiWiki/Plugin/prettydate.pm:35
msgid "late %A evening"
-msgstr "tard %A soir"
+msgstr "tard %A en soirée"
#: ../IkiWiki/Plugin/prettydate.pm:37
msgid "%A night"
@@ -575,26 +609,16 @@ msgid "at noon on %A"
msgstr "%A, à midi"
#: ../IkiWiki/Plugin/progress.pm:34
-#, fuzzy, perl-format
+#, perl-format
msgid "illegal percent value %s"
msgstr "pourcentage %s illégal"
#: ../IkiWiki/Plugin/progress.pm:59
-#, fuzzy
msgid "need either `percent` or `totalpages` and `donepages` parameters"
msgstr ""
"L'un des paramètres « percent », « totalpages » ou « donepages » est nécessaire."
-#: ../IkiWiki/Plugin/recentchanges.pm:100
-msgid "missing page"
-msgstr "Page manquante"
-
-#: ../IkiWiki/Plugin/recentchanges.pm:102
-#, perl-format
-msgid "The page %s does not exist."
-msgstr "La page %s n'existe pas."
-
-#: ../IkiWiki/Plugin/recentchangesdiff.pm:36
+#: ../IkiWiki/Plugin/recentchangesdiff.pm:37
msgid "(Diff truncated)"
msgstr "(fichier de différences tronqué)"
@@ -638,7 +662,7 @@ msgstr "Aucun changement dans le nom du fichier n'a été spécifié"
#: ../IkiWiki/Plugin/rename.pm:68
#, perl-format
msgid "illegal name"
-msgstr "appellation non autorisé"
+msgstr "appellation non autorisée"
#: ../IkiWiki/Plugin/rename.pm:73
#, perl-format
@@ -656,13 +680,12 @@ msgid "rename %s"
msgstr "%s renommé"
#: ../IkiWiki/Plugin/rename.pm:138
-#, fuzzy
msgid "Also rename SubPages and attachments"
msgstr "« SubPages » et attachements renommés."
#: ../IkiWiki/Plugin/rename.pm:224
msgid "Only one attachment can be renamed at a time."
-msgstr "Seule une pièce jointe peut être renommée à la fois"
+msgstr "Une seule pièce jointe peut être renommée à la fois"
#: ../IkiWiki/Plugin/rename.pm:227
msgid "Please select the attachment to rename."
@@ -676,7 +699,7 @@ msgstr "renomme %s en %s"
#: ../IkiWiki/Plugin/rename.pm:490
#, perl-format
msgid "update for rename of %s to %s"
-msgstr "du nouveau nom de %s en %s"
+msgstr "mise à jour, suite au changement de %s en %s"
#: ../IkiWiki/Plugin/search.pm:36
#, perl-format
@@ -754,7 +777,7 @@ msgstr "Format de données inconnu"
#: ../IkiWiki/Plugin/table.pm:81
msgid "empty data"
-msgstr "Données vides"
+msgstr "Pas de données"
#: ../IkiWiki/Plugin/table.pm:100
msgid "Direct data download"
@@ -772,7 +795,7 @@ msgstr "Paramètre d'identification manquant"
#: ../IkiWiki/Plugin/template.pm:35
#, perl-format
msgid "template %s not found"
-msgstr "Modèle (« template ») %s introuvable "
+msgstr "Modèle de page %s introuvable"
#: ../IkiWiki/Plugin/template.pm:54
msgid "failed to process:"
@@ -797,7 +820,7 @@ msgstr "greffon"
#: ../IkiWiki/Plugin/websetup.pm:108
#, perl-format
msgid "enable %s?"
-msgstr "activer %s?"
+msgstr "activer %s ?"
#: ../IkiWiki/Plugin/websetup.pm:236
msgid "you are not logged in as an admin"
@@ -813,7 +836,7 @@ msgstr "Partie principale"
#: ../IkiWiki/Plugin/websetup.pm:257
msgid "plugins"
-msgstr "greffons"
+msgstr "Greffons"
#: ../IkiWiki/Plugin/websetup.pm:395
msgid ""
@@ -833,17 +856,19 @@ msgstr ""
#: ../IkiWiki/Plugin/websetup.pm:433
#, perl-format
msgid "<p class=\"error\">Error: %s exited nonzero (%s)"
-msgstr "<p class=\"erreur\">Erreur: %s a quitté nonzero (%s)"
+msgstr ""
+"<p class=\"erreur\">Erreur : %s s'est terminé, valeur de sortie nonzero (%s)"
#: ../IkiWiki/Receive.pm:35
#, perl-format
msgid "cannot determine id of untrusted committer %s"
msgstr ""
+"Impossible de déterminer l'identifiant de %s, (enregistrement non fiable)"
#: ../IkiWiki/Receive.pm:85
-#, fuzzy, perl-format
+#, perl-format
msgid "bad file name %s"
-msgstr "Omission du fichier au nom incorrect %s"
+msgstr "nom de fichier incorrect %s"
#: ../IkiWiki/Render.pm:253
#, perl-format
@@ -860,7 +885,7 @@ msgid "skipping bad filename %s"
msgstr "Omission du fichier au nom incorrect %s"
#: ../IkiWiki/Render.pm:284
-#, fuzzy, perl-format
+#, perl-format
msgid "%s has multiple possible source pages"
msgstr "%s peut être associé à plusieurs pages source."
@@ -895,9 +920,9 @@ msgid "rendering %s, to update its backlinks"
msgstr "Reconstruction de %s, afin de mettre à jour ses rétroliens"
#: ../IkiWiki/Render.pm:498
-#, fuzzy, perl-format
+#, perl-format
msgid "removing %s, no longer rendered by %s"
-msgstr "Suppression de %s, qui n'est plus affiché par %s"
+msgstr "Suppression de %s, qui n'est plus rendu par %s"
#: ../IkiWiki/Render.pm:522
#, perl-format
@@ -920,7 +945,7 @@ msgstr ""
#: ../IkiWiki/Setup/Automator.pm:67
#, perl-format
msgid "unsupported revision control system %s"
-msgstr "Système de contrôle de version non reconnu"
+msgstr "Système de contrôle de version non reconnu : %s"
#: ../IkiWiki/Setup/Automator.pm:83
msgid "failed to set up the repository with ikiwiki-makerepo"
@@ -942,19 +967,19 @@ msgstr "Le nom du fichier CGI n'a pas été indiqué"
#. translators: The first parameter is a filename, and the second is
#. translators: a (probably not translated) error message.
-#: ../IkiWiki/Wrapper.pm:79
+#: ../IkiWiki/Wrapper.pm:97
#, perl-format
msgid "failed to write %s: %s"
msgstr "Échec de l'écriture de %s : %s"
#. translators: The parameter is a C filename.
-#: ../IkiWiki/Wrapper.pm:135
+#: ../IkiWiki/Wrapper.pm:154
#, perl-format
msgid "failed to compile %s"
msgstr "Échec de la compilation de %s"
#. translators: The parameter is a filename.
-#: ../IkiWiki/Wrapper.pm:155
+#: ../IkiWiki/Wrapper.pm:174
#, perl-format
msgid "successfully generated %s"
msgstr "%s a été créé avec succès"
@@ -964,47 +989,45 @@ msgid "usage: ikiwiki [options] source dest"
msgstr "Syntaxe : ikiwiki [options] source destination"
#: ../ikiwiki.in:14
-#, fuzzy
msgid " ikiwiki --setup configfile"
msgstr " ikiwiki --setup fichier de configuration"
-#: ../ikiwiki.in:90
+#: ../ikiwiki.in:91
msgid "usage: --set var=value"
msgstr "Syntaxe : -- set var=valeur"
-#: ../ikiwiki.in:138
+#: ../ikiwiki.in:139
msgid "generating wrappers.."
msgstr "Création des fichiers CGI..."
-#: ../ikiwiki.in:195
+#: ../ikiwiki.in:197
msgid "rebuilding wiki.."
msgstr "Reconstruction du wiki..."
-#: ../ikiwiki.in:198
+#: ../ikiwiki.in:200
msgid "refreshing wiki.."
msgstr "Rafraîchissement du wiki..."
-#: ../IkiWiki.pm:466
+#: ../IkiWiki.pm:480
msgid "Must specify url to wiki with --url when using --cgi"
msgstr ""
-"Vous devez indiquer une URL vers le wiki par --url lors de l'utilisation de "
-"--cgi"
+"Vous devez indiquer l'URL du wiki par --url lors de l'utilisation de --cgi"
-#: ../IkiWiki.pm:512
+#: ../IkiWiki.pm:526
msgid "cannot use multiple rcs plugins"
msgstr "impossible d'utiliser plusieurs systèmes de contrôle des versions"
-#: ../IkiWiki.pm:541
-#, fuzzy, perl-format
+#: ../IkiWiki.pm:555
+#, perl-format
msgid "failed to load external plugin needed for %s plugin: %s"
msgstr "Impossible de charger le greffon externe nécessaire au greffon %s : %s"
-#: ../IkiWiki.pm:1165
+#: ../IkiWiki.pm:1187
#, perl-format
msgid "preprocessing loop detected on %s at depth %i"
msgstr "une boucle de pré traitement a été détectée sur %s à hauteur de %i"
-#: ../IkiWiki.pm:1678
+#: ../IkiWiki.pm:1688
msgid "yes"
msgstr "oui"
diff --git a/po/gu.po b/po/gu.po
index 13c68afc9..d31260c71 100644
--- a/po/gu.po
+++ b/po/gu.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: ikiwiki-gu\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-10-31 16:37-0400\n"
+"POT-Creation-Date: 2008-12-20 18:07-0500\n"
"PO-Revision-Date: 2007-01-11 16:05+0530\n"
"Last-Translator: Kartik Mistry <kartik.mistry@gmail.com>\n"
"Language-Team: Gujarati <team@utkarsh.org>\n"
@@ -23,7 +23,7 @@ msgstr "તમારે પ્રથમ લોગ ઇન થવું પડશ
msgid "login failed, perhaps you need to turn on cookies?"
msgstr "પ્રવેશ નિષ્ફળ, કદાચ તમારી કુકીઓ સક્રિય બનાવવી પડશે?"
-#: ../IkiWiki/CGI.pm:163 ../IkiWiki/Plugin/editpage.pm:350
+#: ../IkiWiki/CGI.pm:163 ../IkiWiki/CGI.pm:310
msgid "Your login session has expired."
msgstr ""
@@ -48,7 +48,7 @@ msgstr "પ્રાથમિકતાઓ સંગ્રહાઇ."
msgid "You are banned."
msgstr "તમારા પર પ્રતિબંધ છે."
-#: ../IkiWiki/CGI.pm:385 ../IkiWiki/CGI.pm:386 ../IkiWiki.pm:1182
+#: ../IkiWiki/CGI.pm:401 ../IkiWiki/CGI.pm:402 ../IkiWiki.pm:1204
msgid "Error"
msgstr "ક્ષતિ"
@@ -65,62 +65,62 @@ msgstr ""
msgid "missing %s parameter"
msgstr "ખોવાયેલ %s વિકલ્પ"
-#: ../IkiWiki/Plugin/aggregate.pm:250
+#: ../IkiWiki/Plugin/aggregate.pm:251
msgid "new feed"
msgstr "નવું ફીડ"
-#: ../IkiWiki/Plugin/aggregate.pm:264
+#: ../IkiWiki/Plugin/aggregate.pm:265
msgid "posts"
msgstr "પોસ્ટ"
-#: ../IkiWiki/Plugin/aggregate.pm:266
+#: ../IkiWiki/Plugin/aggregate.pm:267
msgid "new"
msgstr "નવું"
-#: ../IkiWiki/Plugin/aggregate.pm:429
+#: ../IkiWiki/Plugin/aggregate.pm:431
#, perl-format
msgid "expiring %s (%s days old)"
msgstr "જુનું કરે છે %s (%s દિવસો જુનું)"
-#: ../IkiWiki/Plugin/aggregate.pm:436
+#: ../IkiWiki/Plugin/aggregate.pm:438
#, perl-format
msgid "expiring %s"
msgstr "જુનું કરે છે %s"
-#: ../IkiWiki/Plugin/aggregate.pm:463
+#: ../IkiWiki/Plugin/aggregate.pm:465
#, perl-format
msgid "last checked %s"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:467
+#: ../IkiWiki/Plugin/aggregate.pm:469
#, perl-format
msgid "checking feed %s ..."
msgstr "ફીડ %s ચકાસે છે ..."
-#: ../IkiWiki/Plugin/aggregate.pm:472
+#: ../IkiWiki/Plugin/aggregate.pm:474
#, perl-format
msgid "could not find feed at %s"
msgstr "%s પર ફીડ મળી શક્યું નહી"
-#: ../IkiWiki/Plugin/aggregate.pm:487
+#: ../IkiWiki/Plugin/aggregate.pm:493
msgid "feed not found"
msgstr "ફીડ મળ્યું નહી"
-#: ../IkiWiki/Plugin/aggregate.pm:498
+#: ../IkiWiki/Plugin/aggregate.pm:504
#, fuzzy, perl-format
msgid "(invalid UTF-8 stripped from feed)"
msgstr "ફીડમાંથી અયોગ્ય રીતે UTF-8 નીકાળેલ છે"
-#: ../IkiWiki/Plugin/aggregate.pm:504
+#: ../IkiWiki/Plugin/aggregate.pm:512
#, perl-format
msgid "(feed entities escaped)"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:510
+#: ../IkiWiki/Plugin/aggregate.pm:520
msgid "feed crashed XML::Feed!"
msgstr "ફીડ ભાંગી ગયું XML::Feed!"
-#: ../IkiWiki/Plugin/aggregate.pm:590
+#: ../IkiWiki/Plugin/aggregate.pm:601
#, perl-format
msgid "creating new page %s"
msgstr "નવું પાનું %s બનાવે છે"
@@ -129,7 +129,7 @@ msgstr "નવું પાનું %s બનાવે છે"
msgid "deleting bucket.."
msgstr ""
-#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:206
+#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:208
msgid "done"
msgstr "સંપૂર્ણ"
@@ -173,8 +173,8 @@ msgstr ""
msgid "automatic index generation"
msgstr ""
-#: ../IkiWiki/Plugin/brokenlinks.pm:33 ../IkiWiki/Plugin/editpage.pm:261
-#: ../IkiWiki/Plugin/inline.pm:327 ../IkiWiki/Plugin/opendiscussion.pm:26
+#: ../IkiWiki/Plugin/brokenlinks.pm:33 ../IkiWiki/Plugin/editpage.pm:260
+#: ../IkiWiki/Plugin/inline.pm:354 ../IkiWiki/Plugin/opendiscussion.pm:26
#: ../IkiWiki/Plugin/orphans.pm:37 ../IkiWiki/Render.pm:79
#: ../IkiWiki/Render.pm:149
msgid "discussion"
@@ -189,6 +189,61 @@ msgstr ""
msgid "There are no broken links!"
msgstr "અહીં કોઇ તૂટેલ કડી નથી!"
+#: ../IkiWiki/Plugin/comments.pm:119 ../IkiWiki/Plugin/format.pm:23
+#, perl-format
+msgid "unsupported page format %s"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:124
+msgid "comment must have content"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:181
+msgid "Anonymous"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:243 ../IkiWiki/Plugin/recentchanges.pm:101
+#, fuzzy
+msgid "missing page"
+msgstr "ખોવાયેલ કિંમતો"
+
+#: ../IkiWiki/Plugin/comments.pm:245 ../IkiWiki/Plugin/recentchanges.pm:103
+#, perl-format
+msgid "The page %s does not exist."
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:334 ../IkiWiki/Plugin/editpage.pm:124
+msgid "bad page name"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:341
+#, fuzzy, perl-format
+msgid "commenting on %s"
+msgstr "%s બનાવે છે"
+
+#: ../IkiWiki/Plugin/comments.pm:359
+#, perl-format
+msgid "page '%s' doesn't exist, so you can't comment"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:366
+#, perl-format
+msgid "comments on page '%s' are closed"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:468
+msgid "Added a comment"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:472
+#, perl-format
+msgid "Added a comment: %s"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:565
+msgid "Comments"
+msgstr ""
+
#: ../IkiWiki/Plugin/conditional.pm:27 ../IkiWiki/Plugin/cutpaste.pm:30
#: ../IkiWiki/Plugin/cutpaste.pm:45 ../IkiWiki/Plugin/cutpaste.pm:61
#: ../IkiWiki/Plugin/testpagespec.pm:26
@@ -210,23 +265,19 @@ msgstr ""
msgid "removing old preview %s"
msgstr "જુનાં પાનાં દૂર કરે છે %s"
-#: ../IkiWiki/Plugin/editpage.pm:125
-msgid "bad page name"
-msgstr ""
-
-#: ../IkiWiki/Plugin/editpage.pm:141
+#: ../IkiWiki/Plugin/editpage.pm:140
#, perl-format
msgid "%s is not an editable page"
msgstr "%s એ સુધારી શકાય તેવું પાનું નથી"
-#: ../IkiWiki/Plugin/editpage.pm:317
+#: ../IkiWiki/Plugin/editpage.pm:316
#, perl-format
msgid "creating %s"
msgstr "%s બનાવે છે"
-#: ../IkiWiki/Plugin/editpage.pm:335 ../IkiWiki/Plugin/editpage.pm:363
-#: ../IkiWiki/Plugin/editpage.pm:373 ../IkiWiki/Plugin/editpage.pm:408
-#: ../IkiWiki/Plugin/editpage.pm:453
+#: ../IkiWiki/Plugin/editpage.pm:334 ../IkiWiki/Plugin/editpage.pm:353
+#: ../IkiWiki/Plugin/editpage.pm:363 ../IkiWiki/Plugin/editpage.pm:398
+#: ../IkiWiki/Plugin/editpage.pm:443
#, perl-format
msgid "editing %s"
msgstr "%s સુધારે છે"
@@ -251,15 +302,10 @@ msgstr ""
msgid "failed to process"
msgstr "ક્રિયા કરવામાં નિષ્ફળ:"
-#: ../IkiWiki/Plugin/format.pm:22
+#: ../IkiWiki/Plugin/format.pm:20
msgid "must specify format and text"
msgstr ""
-#: ../IkiWiki/Plugin/format.pm:25
-#, perl-format
-msgid "unsupported page format %s"
-msgstr ""
-
#: ../IkiWiki/Plugin/fortune.pm:27
msgid "fortune failed"
msgstr "ભવિષ્ય નિષ્ફળ"
@@ -326,16 +372,16 @@ msgstr "માપ બદલવામાં નિષ્ફળ: %s"
msgid "failed to determine size of image %s"
msgstr "માપ બદલવામાં નિષ્ફળ: %s"
-#: ../IkiWiki/Plugin/inline.pm:93
+#: ../IkiWiki/Plugin/inline.pm:92
msgid "Must specify url to wiki with --url when using --rss or --atom"
msgstr "--rss અથવા --atom ઉપયોગ કરતી વખતે વીકીમાં --url ઉપયોગ કરવું જ પડશે"
-#: ../IkiWiki/Plugin/inline.pm:139
+#: ../IkiWiki/Plugin/inline.pm:138
#, fuzzy
msgid "page editing not allowed"
msgstr "ફીડ મળ્યું નહી"
-#: ../IkiWiki/Plugin/inline.pm:156
+#: ../IkiWiki/Plugin/inline.pm:155
#, fuzzy
msgid "missing pages parameter"
msgstr "ખોવાયેલ %s વિકલ્પ"
@@ -345,20 +391,20 @@ msgstr "ખોવાયેલ %s વિકલ્પ"
msgid "unknown sort type %s"
msgstr "અજાણ્યો ગોઠવણી પ્રકાર %s"
-#: ../IkiWiki/Plugin/inline.pm:285
+#: ../IkiWiki/Plugin/inline.pm:307
msgid "Add a new post titled:"
msgstr "આ શિર્ષકથી નવું પોસ્ટ ઉમેરો:"
-#: ../IkiWiki/Plugin/inline.pm:301
+#: ../IkiWiki/Plugin/inline.pm:327
#, perl-format
msgid "nonexistant template %s"
msgstr "અસ્તિત્વમાં ન હોય તેવું ટેમ્પલેટ %s"
-#: ../IkiWiki/Plugin/inline.pm:335 ../IkiWiki/Render.pm:83
+#: ../IkiWiki/Plugin/inline.pm:362 ../IkiWiki/Render.pm:83
msgid "Discussion"
msgstr "ચર્ચા"
-#: ../IkiWiki/Plugin/inline.pm:572
+#: ../IkiWiki/Plugin/inline.pm:587
msgid "RPC::XML::Client not found, not pinging"
msgstr "RPC::XML::Client મળ્યું નહી, પિંગ કરવામાં આવતું નથી"
@@ -380,16 +426,16 @@ msgstr ""
msgid "failed to load Markdown.pm perl module (%s) or /usr/bin/markdown (%s)"
msgstr "Markdown.pm પર્લ મોડ્યુલ (%s) અથવા /usr/bin/markdown (%s) લાવવામાં નિષ્ફળ"
-#: ../IkiWiki/Plugin/meta.pm:150
+#: ../IkiWiki/Plugin/meta.pm:151
msgid "stylesheet not found"
msgstr "સ્ટાઇલશીટ મળ્યું નહી"
-#: ../IkiWiki/Plugin/meta.pm:184
+#: ../IkiWiki/Plugin/meta.pm:185
#, fuzzy
msgid "redir page not found"
msgstr "ફીડ મળ્યું નહી"
-#: ../IkiWiki/Plugin/meta.pm:197
+#: ../IkiWiki/Plugin/meta.pm:198
#, fuzzy
msgid "redir cycle is not allowed"
msgstr "ફીડ મળ્યું નહી"
@@ -576,17 +622,7 @@ msgstr ""
msgid "need either `percent` or `totalpages` and `donepages` parameters"
msgstr ""
-#: ../IkiWiki/Plugin/recentchanges.pm:100
-#, fuzzy
-msgid "missing page"
-msgstr "ખોવાયેલ કિંમતો"
-
-#: ../IkiWiki/Plugin/recentchanges.pm:102
-#, perl-format
-msgid "The page %s does not exist."
-msgstr ""
-
-#: ../IkiWiki/Plugin/recentchangesdiff.pm:36
+#: ../IkiWiki/Plugin/recentchangesdiff.pm:37
msgid "(Diff truncated)"
msgstr ""
@@ -927,19 +963,19 @@ msgstr "આવરણ ફાઇલનામ સ્પષ્ટ કરેલ ન
#. translators: The first parameter is a filename, and the second is
#. translators: a (probably not translated) error message.
-#: ../IkiWiki/Wrapper.pm:79
+#: ../IkiWiki/Wrapper.pm:97
#, perl-format
msgid "failed to write %s: %s"
msgstr "%s લખવામાં નિષ્ફળ: %s"
#. translators: The parameter is a C filename.
-#: ../IkiWiki/Wrapper.pm:135
+#: ../IkiWiki/Wrapper.pm:154
#, perl-format
msgid "failed to compile %s"
msgstr "%s કમ્પાઇલ કરવામાં નિષ્ફળ"
#. translators: The parameter is a filename.
-#: ../IkiWiki/Wrapper.pm:155
+#: ../IkiWiki/Wrapper.pm:174
#, perl-format
msgid "successfully generated %s"
msgstr "સફળતાપૂર્વક પેદા કરેલ છે %s"
@@ -952,41 +988,41 @@ msgstr "ઉપયોગ: ikiwiki [વિકલ્પો] source dest"
msgid " ikiwiki --setup configfile"
msgstr ""
-#: ../ikiwiki.in:90
+#: ../ikiwiki.in:91
msgid "usage: --set var=value"
msgstr ""
-#: ../ikiwiki.in:138
+#: ../ikiwiki.in:139
msgid "generating wrappers.."
msgstr "આવરણ બનાવે છે.."
-#: ../ikiwiki.in:195
+#: ../ikiwiki.in:197
msgid "rebuilding wiki.."
msgstr "વીકી ફરીથી બનાવે છે.."
-#: ../ikiwiki.in:198
+#: ../ikiwiki.in:200
msgid "refreshing wiki.."
msgstr "વીકીને તાજી કરે છે.."
-#: ../IkiWiki.pm:466
+#: ../IkiWiki.pm:480
msgid "Must specify url to wiki with --url when using --cgi"
msgstr "જ્યારે --cgi ઉપયોગ કરતાં હોય ત્યારે વીકીનું યુઆરએલ સ્પષ્ટ કરવું જ પડશે"
-#: ../IkiWiki.pm:512
+#: ../IkiWiki.pm:526
msgid "cannot use multiple rcs plugins"
msgstr ""
-#: ../IkiWiki.pm:541
+#: ../IkiWiki.pm:555
#, perl-format
msgid "failed to load external plugin needed for %s plugin: %s"
msgstr ""
-#: ../IkiWiki.pm:1165
+#: ../IkiWiki.pm:1187
#, fuzzy, perl-format
msgid "preprocessing loop detected on %s at depth %i"
msgstr "%s પર શોધાયેલ લુપ %s પર ચલાવે છે %i ઉંડાણ પર"
-#: ../IkiWiki.pm:1678
+#: ../IkiWiki.pm:1688
msgid "yes"
msgstr ""
diff --git a/po/ikiwiki.pot b/po/ikiwiki.pot
index feb36c742..1f59b99c7 100644
--- a/po/ikiwiki.pot
+++ b/po/ikiwiki.pot
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-11-11 20:48-0500\n"
+"POT-Creation-Date: 2008-12-28 15:01-0500\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -24,7 +24,7 @@ msgstr ""
msgid "login failed, perhaps you need to turn on cookies?"
msgstr ""
-#: ../IkiWiki/CGI.pm:163 ../IkiWiki/Plugin/editpage.pm:350
+#: ../IkiWiki/CGI.pm:163 ../IkiWiki/CGI.pm:310
msgid "Your login session has expired."
msgstr ""
@@ -48,7 +48,7 @@ msgstr ""
msgid "You are banned."
msgstr ""
-#: ../IkiWiki/CGI.pm:385 ../IkiWiki/CGI.pm:386 ../IkiWiki.pm:1189
+#: ../IkiWiki/CGI.pm:401 ../IkiWiki/CGI.pm:402 ../IkiWiki.pm:1204
msgid "Error"
msgstr ""
@@ -65,62 +65,62 @@ msgstr ""
msgid "missing %s parameter"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:250
+#: ../IkiWiki/Plugin/aggregate.pm:251
msgid "new feed"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:264
+#: ../IkiWiki/Plugin/aggregate.pm:265
msgid "posts"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:266
+#: ../IkiWiki/Plugin/aggregate.pm:267
msgid "new"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:429
+#: ../IkiWiki/Plugin/aggregate.pm:431
#, perl-format
msgid "expiring %s (%s days old)"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:436
+#: ../IkiWiki/Plugin/aggregate.pm:438
#, perl-format
msgid "expiring %s"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:463
+#: ../IkiWiki/Plugin/aggregate.pm:465
#, perl-format
msgid "last checked %s"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:467
+#: ../IkiWiki/Plugin/aggregate.pm:469
#, perl-format
msgid "checking feed %s ..."
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:472
+#: ../IkiWiki/Plugin/aggregate.pm:474
#, perl-format
msgid "could not find feed at %s"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:487
+#: ../IkiWiki/Plugin/aggregate.pm:493
msgid "feed not found"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:498
+#: ../IkiWiki/Plugin/aggregate.pm:504
#, perl-format
msgid "(invalid UTF-8 stripped from feed)"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:504
+#: ../IkiWiki/Plugin/aggregate.pm:512
#, perl-format
msgid "(feed entities escaped)"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:510
+#: ../IkiWiki/Plugin/aggregate.pm:520
msgid "feed crashed XML::Feed!"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:591
+#: ../IkiWiki/Plugin/aggregate.pm:601
#, perl-format
msgid "creating new page %s"
msgstr ""
@@ -129,7 +129,7 @@ msgstr ""
msgid "deleting bucket.."
msgstr ""
-#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:206
+#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:208
msgid "done"
msgstr ""
@@ -171,8 +171,8 @@ msgstr ""
msgid "automatic index generation"
msgstr ""
-#: ../IkiWiki/Plugin/brokenlinks.pm:33 ../IkiWiki/Plugin/editpage.pm:261
-#: ../IkiWiki/Plugin/inline.pm:327 ../IkiWiki/Plugin/opendiscussion.pm:26
+#: ../IkiWiki/Plugin/brokenlinks.pm:33 ../IkiWiki/Plugin/editpage.pm:260
+#: ../IkiWiki/Plugin/inline.pm:354 ../IkiWiki/Plugin/opendiscussion.pm:26
#: ../IkiWiki/Plugin/orphans.pm:37 ../IkiWiki/Render.pm:79
#: ../IkiWiki/Render.pm:149
msgid "discussion"
@@ -187,6 +187,60 @@ msgstr ""
msgid "There are no broken links!"
msgstr ""
+#: ../IkiWiki/Plugin/comments.pm:120 ../IkiWiki/Plugin/format.pm:23
+#, perl-format
+msgid "unsupported page format %s"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:125
+msgid "comment must have content"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:181
+msgid "Anonymous"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:252 ../IkiWiki/Plugin/recentchanges.pm:110
+msgid "missing page"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:254 ../IkiWiki/Plugin/recentchanges.pm:112
+#, perl-format
+msgid "The page %s does not exist."
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:343 ../IkiWiki/Plugin/editpage.pm:124
+msgid "bad page name"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:350
+#, perl-format
+msgid "commenting on %s"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:368
+#, perl-format
+msgid "page '%s' doesn't exist, so you can't comment"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:375
+#, perl-format
+msgid "comments on page '%s' are closed"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:483
+msgid "Added a comment"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:487
+#, perl-format
+msgid "Added a comment: %s"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:598
+msgid "Comments"
+msgstr ""
+
#: ../IkiWiki/Plugin/conditional.pm:27 ../IkiWiki/Plugin/cutpaste.pm:30
#: ../IkiWiki/Plugin/cutpaste.pm:45 ../IkiWiki/Plugin/cutpaste.pm:61
#: ../IkiWiki/Plugin/testpagespec.pm:26
@@ -208,23 +262,19 @@ msgstr ""
msgid "removing old preview %s"
msgstr ""
-#: ../IkiWiki/Plugin/editpage.pm:125
-msgid "bad page name"
-msgstr ""
-
-#: ../IkiWiki/Plugin/editpage.pm:141
+#: ../IkiWiki/Plugin/editpage.pm:140
#, perl-format
msgid "%s is not an editable page"
msgstr ""
-#: ../IkiWiki/Plugin/editpage.pm:317
+#: ../IkiWiki/Plugin/editpage.pm:316
#, perl-format
msgid "creating %s"
msgstr ""
-#: ../IkiWiki/Plugin/editpage.pm:335 ../IkiWiki/Plugin/editpage.pm:363
-#: ../IkiWiki/Plugin/editpage.pm:373 ../IkiWiki/Plugin/editpage.pm:408
-#: ../IkiWiki/Plugin/editpage.pm:453
+#: ../IkiWiki/Plugin/editpage.pm:334 ../IkiWiki/Plugin/editpage.pm:353
+#: ../IkiWiki/Plugin/editpage.pm:363 ../IkiWiki/Plugin/editpage.pm:398
+#: ../IkiWiki/Plugin/editpage.pm:443
#, perl-format
msgid "editing %s"
msgstr ""
@@ -250,11 +300,6 @@ msgstr ""
msgid "must specify format and text"
msgstr ""
-#: ../IkiWiki/Plugin/format.pm:23
-#, perl-format
-msgid "unsupported page format %s"
-msgstr ""
-
#: ../IkiWiki/Plugin/fortune.pm:27
msgid "fortune failed"
msgstr ""
@@ -283,7 +328,7 @@ msgstr ""
msgid "Failed to parse url, cannot determine domain name"
msgstr ""
-#: ../IkiWiki/Plugin/googlecalendar.pm:32
+#: ../IkiWiki/Plugin/googlecalendar.pm:34
msgid "failed to find url in html"
msgstr ""
@@ -320,15 +365,15 @@ msgstr ""
msgid "failed to determine size of image %s"
msgstr ""
-#: ../IkiWiki/Plugin/inline.pm:93
+#: ../IkiWiki/Plugin/inline.pm:92
msgid "Must specify url to wiki with --url when using --rss or --atom"
msgstr ""
-#: ../IkiWiki/Plugin/inline.pm:139
+#: ../IkiWiki/Plugin/inline.pm:138
msgid "page editing not allowed"
msgstr ""
-#: ../IkiWiki/Plugin/inline.pm:156
+#: ../IkiWiki/Plugin/inline.pm:155
msgid "missing pages parameter"
msgstr ""
@@ -337,20 +382,20 @@ msgstr ""
msgid "unknown sort type %s"
msgstr ""
-#: ../IkiWiki/Plugin/inline.pm:285
+#: ../IkiWiki/Plugin/inline.pm:307
msgid "Add a new post titled:"
msgstr ""
-#: ../IkiWiki/Plugin/inline.pm:301
+#: ../IkiWiki/Plugin/inline.pm:327
#, perl-format
msgid "nonexistant template %s"
msgstr ""
-#: ../IkiWiki/Plugin/inline.pm:335 ../IkiWiki/Render.pm:83
+#: ../IkiWiki/Plugin/inline.pm:362 ../IkiWiki/Render.pm:83
msgid "Discussion"
msgstr ""
-#: ../IkiWiki/Plugin/inline.pm:572
+#: ../IkiWiki/Plugin/inline.pm:587
msgid "RPC::XML::Client not found, not pinging"
msgstr ""
@@ -372,15 +417,15 @@ msgstr ""
msgid "failed to load Markdown.pm perl module (%s) or /usr/bin/markdown (%s)"
msgstr ""
-#: ../IkiWiki/Plugin/meta.pm:150
+#: ../IkiWiki/Plugin/meta.pm:151
msgid "stylesheet not found"
msgstr ""
-#: ../IkiWiki/Plugin/meta.pm:184
+#: ../IkiWiki/Plugin/meta.pm:185
msgid "redir page not found"
msgstr ""
-#: ../IkiWiki/Plugin/meta.pm:197
+#: ../IkiWiki/Plugin/meta.pm:198
msgid "redir cycle is not allowed"
msgstr ""
@@ -563,16 +608,7 @@ msgstr ""
msgid "need either `percent` or `totalpages` and `donepages` parameters"
msgstr ""
-#: ../IkiWiki/Plugin/recentchanges.pm:100
-msgid "missing page"
-msgstr ""
-
-#: ../IkiWiki/Plugin/recentchanges.pm:102
-#, perl-format
-msgid "The page %s does not exist."
-msgstr ""
-
-#: ../IkiWiki/Plugin/recentchangesdiff.pm:36
+#: ../IkiWiki/Plugin/recentchangesdiff.pm:37
msgid "(Diff truncated)"
msgstr ""
@@ -935,41 +971,41 @@ msgstr ""
msgid " ikiwiki --setup configfile"
msgstr ""
-#: ../ikiwiki.in:90
+#: ../ikiwiki.in:91
msgid "usage: --set var=value"
msgstr ""
-#: ../ikiwiki.in:138
+#: ../ikiwiki.in:139
msgid "generating wrappers.."
msgstr ""
-#: ../ikiwiki.in:195
+#: ../ikiwiki.in:197
msgid "rebuilding wiki.."
msgstr ""
-#: ../ikiwiki.in:198
+#: ../ikiwiki.in:200
msgid "refreshing wiki.."
msgstr ""
-#: ../IkiWiki.pm:473
+#: ../IkiWiki.pm:480
msgid "Must specify url to wiki with --url when using --cgi"
msgstr ""
-#: ../IkiWiki.pm:519
+#: ../IkiWiki.pm:526
msgid "cannot use multiple rcs plugins"
msgstr ""
-#: ../IkiWiki.pm:548
+#: ../IkiWiki.pm:555
#, perl-format
msgid "failed to load external plugin needed for %s plugin: %s"
msgstr ""
-#: ../IkiWiki.pm:1172
+#: ../IkiWiki.pm:1187
#, perl-format
msgid "preprocessing loop detected on %s at depth %i"
msgstr ""
-#: ../IkiWiki.pm:1673
+#: ../IkiWiki.pm:1695
msgid "yes"
msgstr ""
diff --git a/po/pl.po b/po/pl.po
index 6f582c71f..8951b65ce 100644
--- a/po/pl.po
+++ b/po/pl.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: ikiwiki 1.51\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-10-31 16:37-0400\n"
+"POT-Creation-Date: 2008-12-20 18:07-0500\n"
"PO-Revision-Date: 2007-04-27 22:05+0200\n"
"Last-Translator: Pawel Tecza <ptecza@net.icm.edu.pl>\n"
"Language-Team: Debian L10n Polish <debian-l10n-polish@lists.debian.org>\n"
@@ -26,7 +26,7 @@ msgstr ""
"Nieudane logowanie. Proszę sprawdzić czy w przeglądarce włączone są "
"ciasteczka (ang. cookies)"
-#: ../IkiWiki/CGI.pm:163 ../IkiWiki/Plugin/editpage.pm:350
+#: ../IkiWiki/CGI.pm:163 ../IkiWiki/CGI.pm:310
msgid "Your login session has expired."
msgstr ""
@@ -51,7 +51,7 @@ msgstr "Preferencje zapisane."
msgid "You are banned."
msgstr "Twój dostęp został zabroniony przez administratora."
-#: ../IkiWiki/CGI.pm:385 ../IkiWiki/CGI.pm:386 ../IkiWiki.pm:1182
+#: ../IkiWiki/CGI.pm:401 ../IkiWiki/CGI.pm:402 ../IkiWiki.pm:1204
msgid "Error"
msgstr "Błąd"
@@ -68,63 +68,63 @@ msgstr ""
msgid "missing %s parameter"
msgstr "brakujący parametr %s"
-#: ../IkiWiki/Plugin/aggregate.pm:250
+#: ../IkiWiki/Plugin/aggregate.pm:251
msgid "new feed"
msgstr "nowy kanał RSS"
-#: ../IkiWiki/Plugin/aggregate.pm:264
+#: ../IkiWiki/Plugin/aggregate.pm:265
msgid "posts"
msgstr "wpisy"
-#: ../IkiWiki/Plugin/aggregate.pm:266
+#: ../IkiWiki/Plugin/aggregate.pm:267
msgid "new"
msgstr "nowy wpis"
-#: ../IkiWiki/Plugin/aggregate.pm:429
+#: ../IkiWiki/Plugin/aggregate.pm:431
#, perl-format
msgid "expiring %s (%s days old)"
msgstr "wygasający wpis %s (ma już %s dni)"
-#: ../IkiWiki/Plugin/aggregate.pm:436
+#: ../IkiWiki/Plugin/aggregate.pm:438
#, perl-format
msgid "expiring %s"
msgstr "wygasający wpis %s"
-#: ../IkiWiki/Plugin/aggregate.pm:463
+#: ../IkiWiki/Plugin/aggregate.pm:465
#, perl-format
msgid "last checked %s"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:467
+#: ../IkiWiki/Plugin/aggregate.pm:469
#, perl-format
msgid "checking feed %s ..."
msgstr "sprawdzanie kanału RSS %s..."
-#: ../IkiWiki/Plugin/aggregate.pm:472
+#: ../IkiWiki/Plugin/aggregate.pm:474
#, perl-format
msgid "could not find feed at %s"
msgstr "nie znaleziono kanału RSS pod adresem %s"
-#: ../IkiWiki/Plugin/aggregate.pm:487
+#: ../IkiWiki/Plugin/aggregate.pm:493
#, fuzzy
msgid "feed not found"
msgstr "nieznaleziony kanał RSS"
-#: ../IkiWiki/Plugin/aggregate.pm:498
+#: ../IkiWiki/Plugin/aggregate.pm:504
#, fuzzy, perl-format
msgid "(invalid UTF-8 stripped from feed)"
msgstr "Nieprawidłowe kodowanie UTF-8 usunięte z kanału RSS"
-#: ../IkiWiki/Plugin/aggregate.pm:504
+#: ../IkiWiki/Plugin/aggregate.pm:512
#, perl-format
msgid "(feed entities escaped)"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:510
+#: ../IkiWiki/Plugin/aggregate.pm:520
msgid "feed crashed XML::Feed!"
msgstr "awaria kanału RSS w module XML::Feed!"
-#: ../IkiWiki/Plugin/aggregate.pm:590
+#: ../IkiWiki/Plugin/aggregate.pm:601
#, perl-format
msgid "creating new page %s"
msgstr "tworzenie nowej strony %s"
@@ -133,7 +133,7 @@ msgstr "tworzenie nowej strony %s"
msgid "deleting bucket.."
msgstr ""
-#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:206
+#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:208
msgid "done"
msgstr "gotowe"
@@ -177,8 +177,8 @@ msgstr ""
msgid "automatic index generation"
msgstr ""
-#: ../IkiWiki/Plugin/brokenlinks.pm:33 ../IkiWiki/Plugin/editpage.pm:261
-#: ../IkiWiki/Plugin/inline.pm:327 ../IkiWiki/Plugin/opendiscussion.pm:26
+#: ../IkiWiki/Plugin/brokenlinks.pm:33 ../IkiWiki/Plugin/editpage.pm:260
+#: ../IkiWiki/Plugin/inline.pm:354 ../IkiWiki/Plugin/opendiscussion.pm:26
#: ../IkiWiki/Plugin/orphans.pm:37 ../IkiWiki/Render.pm:79
#: ../IkiWiki/Render.pm:149
msgid "discussion"
@@ -193,6 +193,61 @@ msgstr ""
msgid "There are no broken links!"
msgstr "Wszystkie odnośniki są aktualne!"
+#: ../IkiWiki/Plugin/comments.pm:119 ../IkiWiki/Plugin/format.pm:23
+#, perl-format
+msgid "unsupported page format %s"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:124
+msgid "comment must have content"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:181
+msgid "Anonymous"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:243 ../IkiWiki/Plugin/recentchanges.pm:101
+#, fuzzy
+msgid "missing page"
+msgstr "brakujące wartości"
+
+#: ../IkiWiki/Plugin/comments.pm:245 ../IkiWiki/Plugin/recentchanges.pm:103
+#, perl-format
+msgid "The page %s does not exist."
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:334 ../IkiWiki/Plugin/editpage.pm:124
+msgid "bad page name"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:341
+#, fuzzy, perl-format
+msgid "commenting on %s"
+msgstr "tworzenie %s"
+
+#: ../IkiWiki/Plugin/comments.pm:359
+#, perl-format
+msgid "page '%s' doesn't exist, so you can't comment"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:366
+#, perl-format
+msgid "comments on page '%s' are closed"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:468
+msgid "Added a comment"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:472
+#, perl-format
+msgid "Added a comment: %s"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:565
+msgid "Comments"
+msgstr ""
+
#: ../IkiWiki/Plugin/conditional.pm:27 ../IkiWiki/Plugin/cutpaste.pm:30
#: ../IkiWiki/Plugin/cutpaste.pm:45 ../IkiWiki/Plugin/cutpaste.pm:61
#: ../IkiWiki/Plugin/testpagespec.pm:26
@@ -214,23 +269,19 @@ msgstr ""
msgid "removing old preview %s"
msgstr "usuwanie starej strony %s"
-#: ../IkiWiki/Plugin/editpage.pm:125
-msgid "bad page name"
-msgstr ""
-
-#: ../IkiWiki/Plugin/editpage.pm:141
+#: ../IkiWiki/Plugin/editpage.pm:140
#, perl-format
msgid "%s is not an editable page"
msgstr "Strona %s nie może być edytowana"
-#: ../IkiWiki/Plugin/editpage.pm:317
+#: ../IkiWiki/Plugin/editpage.pm:316
#, perl-format
msgid "creating %s"
msgstr "tworzenie %s"
-#: ../IkiWiki/Plugin/editpage.pm:335 ../IkiWiki/Plugin/editpage.pm:363
-#: ../IkiWiki/Plugin/editpage.pm:373 ../IkiWiki/Plugin/editpage.pm:408
-#: ../IkiWiki/Plugin/editpage.pm:453
+#: ../IkiWiki/Plugin/editpage.pm:334 ../IkiWiki/Plugin/editpage.pm:353
+#: ../IkiWiki/Plugin/editpage.pm:363 ../IkiWiki/Plugin/editpage.pm:398
+#: ../IkiWiki/Plugin/editpage.pm:443
#, perl-format
msgid "editing %s"
msgstr "edycja %s"
@@ -255,15 +306,10 @@ msgstr ""
msgid "failed to process"
msgstr "awaria w trakcie przetwarzania:"
-#: ../IkiWiki/Plugin/format.pm:22
+#: ../IkiWiki/Plugin/format.pm:20
msgid "must specify format and text"
msgstr ""
-#: ../IkiWiki/Plugin/format.pm:25
-#, perl-format
-msgid "unsupported page format %s"
-msgstr ""
-
#: ../IkiWiki/Plugin/fortune.pm:27
msgid "fortune failed"
msgstr "awaria fortunki"
@@ -332,18 +378,18 @@ msgstr "awaria w trakcie zmiany rozmiaru: %s"
msgid "failed to determine size of image %s"
msgstr "awaria w trakcie zmiany rozmiaru: %s"
-#: ../IkiWiki/Plugin/inline.pm:93
+#: ../IkiWiki/Plugin/inline.pm:92
msgid "Must specify url to wiki with --url when using --rss or --atom"
msgstr ""
"Użycie parametru --rss lub --atom wymaga podania adresu URL do wiki za "
"pomocą parametru --url"
-#: ../IkiWiki/Plugin/inline.pm:139
+#: ../IkiWiki/Plugin/inline.pm:138
#, fuzzy
msgid "page editing not allowed"
msgstr "nieznaleziony kanał RSS"
-#: ../IkiWiki/Plugin/inline.pm:156
+#: ../IkiWiki/Plugin/inline.pm:155
#, fuzzy
msgid "missing pages parameter"
msgstr "brakujący parametr %s"
@@ -353,20 +399,20 @@ msgstr "brakujący parametr %s"
msgid "unknown sort type %s"
msgstr "nieznany sposób sortowania %s"
-#: ../IkiWiki/Plugin/inline.pm:285
+#: ../IkiWiki/Plugin/inline.pm:307
msgid "Add a new post titled:"
msgstr "Tytuł nowego wpisu"
-#: ../IkiWiki/Plugin/inline.pm:301
+#: ../IkiWiki/Plugin/inline.pm:327
#, perl-format
msgid "nonexistant template %s"
msgstr "brakujący szablon %s"
-#: ../IkiWiki/Plugin/inline.pm:335 ../IkiWiki/Render.pm:83
+#: ../IkiWiki/Plugin/inline.pm:362 ../IkiWiki/Render.pm:83
msgid "Discussion"
msgstr "Dyskusja"
-#: ../IkiWiki/Plugin/inline.pm:572
+#: ../IkiWiki/Plugin/inline.pm:587
msgid "RPC::XML::Client not found, not pinging"
msgstr "Nieznaleziony moduł RPC::XML::Client, brak możliwości pingowania"
@@ -393,17 +439,17 @@ msgstr ""
"Awaria w trakcie ładowania perlowego modułu Markdown.pm (%s) lub "
"uruchamiania programu /usr/bin/markdown (%s)"
-#: ../IkiWiki/Plugin/meta.pm:150
+#: ../IkiWiki/Plugin/meta.pm:151
#, fuzzy
msgid "stylesheet not found"
msgstr "nieznaleziony szablon ze stylami CSS"
-#: ../IkiWiki/Plugin/meta.pm:184
+#: ../IkiWiki/Plugin/meta.pm:185
#, fuzzy
msgid "redir page not found"
msgstr "nieznaleziony kanał RSS"
-#: ../IkiWiki/Plugin/meta.pm:197
+#: ../IkiWiki/Plugin/meta.pm:198
#, fuzzy
msgid "redir cycle is not allowed"
msgstr "nieznaleziony kanał RSS"
@@ -590,17 +636,7 @@ msgstr ""
msgid "need either `percent` or `totalpages` and `donepages` parameters"
msgstr ""
-#: ../IkiWiki/Plugin/recentchanges.pm:100
-#, fuzzy
-msgid "missing page"
-msgstr "brakujące wartości"
-
-#: ../IkiWiki/Plugin/recentchanges.pm:102
-#, perl-format
-msgid "The page %s does not exist."
-msgstr ""
-
-#: ../IkiWiki/Plugin/recentchangesdiff.pm:36
+#: ../IkiWiki/Plugin/recentchangesdiff.pm:37
msgid "(Diff truncated)"
msgstr ""
@@ -952,19 +988,19 @@ msgstr "nieokreślona nazwa pliku osłony"
#. translators: The first parameter is a filename, and the second is
#. translators: a (probably not translated) error message.
-#: ../IkiWiki/Wrapper.pm:79
+#: ../IkiWiki/Wrapper.pm:97
#, perl-format
msgid "failed to write %s: %s"
msgstr "awaria w trakcie zapisu %s: %s"
#. translators: The parameter is a C filename.
-#: ../IkiWiki/Wrapper.pm:135
+#: ../IkiWiki/Wrapper.pm:154
#, perl-format
msgid "failed to compile %s"
msgstr "awaria w trakcie kompilowania %s"
#. translators: The parameter is a filename.
-#: ../IkiWiki/Wrapper.pm:155
+#: ../IkiWiki/Wrapper.pm:174
#, perl-format
msgid "successfully generated %s"
msgstr "pomyślnie utworzono %s"
@@ -977,43 +1013,43 @@ msgstr "użycie: ikiwiki [parametry] źródło cel"
msgid " ikiwiki --setup configfile"
msgstr ""
-#: ../ikiwiki.in:90
+#: ../ikiwiki.in:91
msgid "usage: --set var=value"
msgstr ""
-#: ../ikiwiki.in:138
+#: ../ikiwiki.in:139
msgid "generating wrappers.."
msgstr "tworzenie osłon..."
-#: ../ikiwiki.in:195
+#: ../ikiwiki.in:197
msgid "rebuilding wiki.."
msgstr "przebudowywanie wiki..."
-#: ../ikiwiki.in:198
+#: ../ikiwiki.in:200
msgid "refreshing wiki.."
msgstr "odświeżanie wiki..."
-#: ../IkiWiki.pm:466
+#: ../IkiWiki.pm:480
msgid "Must specify url to wiki with --url when using --cgi"
msgstr ""
"Użycie parametru --cgi wymaga podania adresu URL do wiki za pomocą parametru "
"--url"
-#: ../IkiWiki.pm:512
+#: ../IkiWiki.pm:526
msgid "cannot use multiple rcs plugins"
msgstr ""
-#: ../IkiWiki.pm:541
+#: ../IkiWiki.pm:555
#, perl-format
msgid "failed to load external plugin needed for %s plugin: %s"
msgstr ""
-#: ../IkiWiki.pm:1165
+#: ../IkiWiki.pm:1187
#, fuzzy, perl-format
msgid "preprocessing loop detected on %s at depth %i"
msgstr "polecenie preprocesora %s wykryte w %s na głębokości %i"
-#: ../IkiWiki.pm:1678
+#: ../IkiWiki.pm:1688
msgid "yes"
msgstr ""
diff --git a/po/sv.po b/po/sv.po
index 6d3e263ee..3b1dc3625 100644
--- a/po/sv.po
+++ b/po/sv.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: ikiwiki\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-10-31 16:37-0400\n"
+"POT-Creation-Date: 2008-12-20 18:07-0500\n"
"PO-Revision-Date: 2007-01-10 23:47+0100\n"
"Last-Translator: Daniel Nylander <po@danielnylander.se>\n"
"Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
@@ -23,7 +23,7 @@ msgstr "Du måste logga in först."
msgid "login failed, perhaps you need to turn on cookies?"
msgstr ""
-#: ../IkiWiki/CGI.pm:163 ../IkiWiki/Plugin/editpage.pm:350
+#: ../IkiWiki/CGI.pm:163 ../IkiWiki/CGI.pm:310
msgid "Your login session has expired."
msgstr ""
@@ -48,7 +48,7 @@ msgstr "Inställningar sparades."
msgid "You are banned."
msgstr "Du är bannlyst."
-#: ../IkiWiki/CGI.pm:385 ../IkiWiki/CGI.pm:386 ../IkiWiki.pm:1182
+#: ../IkiWiki/CGI.pm:401 ../IkiWiki/CGI.pm:402 ../IkiWiki.pm:1204
msgid "Error"
msgstr "Fel"
@@ -65,63 +65,63 @@ msgstr ""
msgid "missing %s parameter"
msgstr "mall saknar id-parameter"
-#: ../IkiWiki/Plugin/aggregate.pm:250
+#: ../IkiWiki/Plugin/aggregate.pm:251
msgid "new feed"
msgstr "ny kanal"
-#: ../IkiWiki/Plugin/aggregate.pm:264
+#: ../IkiWiki/Plugin/aggregate.pm:265
msgid "posts"
msgstr "inlägg"
-#: ../IkiWiki/Plugin/aggregate.pm:266
+#: ../IkiWiki/Plugin/aggregate.pm:267
msgid "new"
msgstr "ny"
-#: ../IkiWiki/Plugin/aggregate.pm:429
+#: ../IkiWiki/Plugin/aggregate.pm:431
#, perl-format
msgid "expiring %s (%s days old)"
msgstr "låter %s gå ut (%s dagar gammal)"
-#: ../IkiWiki/Plugin/aggregate.pm:436
+#: ../IkiWiki/Plugin/aggregate.pm:438
#, perl-format
msgid "expiring %s"
msgstr "låter %s gå ut"
-#: ../IkiWiki/Plugin/aggregate.pm:463
+#: ../IkiWiki/Plugin/aggregate.pm:465
#, perl-format
msgid "last checked %s"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:467
+#: ../IkiWiki/Plugin/aggregate.pm:469
#, perl-format
msgid "checking feed %s ..."
msgstr "kontrollerar kanalen %s ..."
-#: ../IkiWiki/Plugin/aggregate.pm:472
+#: ../IkiWiki/Plugin/aggregate.pm:474
#, perl-format
msgid "could not find feed at %s"
msgstr "kunde inte hitta kanalen på %s"
-#: ../IkiWiki/Plugin/aggregate.pm:487
+#: ../IkiWiki/Plugin/aggregate.pm:493
#, fuzzy
msgid "feed not found"
msgstr "mallen %s hittades inte"
-#: ../IkiWiki/Plugin/aggregate.pm:498
+#: ../IkiWiki/Plugin/aggregate.pm:504
#, perl-format
msgid "(invalid UTF-8 stripped from feed)"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:504
+#: ../IkiWiki/Plugin/aggregate.pm:512
#, perl-format
msgid "(feed entities escaped)"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:510
+#: ../IkiWiki/Plugin/aggregate.pm:520
msgid "feed crashed XML::Feed!"
msgstr "kanalen kraschade XML::Feed!"
-#: ../IkiWiki/Plugin/aggregate.pm:590
+#: ../IkiWiki/Plugin/aggregate.pm:601
#, perl-format
msgid "creating new page %s"
msgstr "skapar nya sidan %s"
@@ -130,7 +130,7 @@ msgstr "skapar nya sidan %s"
msgid "deleting bucket.."
msgstr ""
-#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:206
+#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:208
msgid "done"
msgstr "klar"
@@ -174,8 +174,8 @@ msgstr ""
msgid "automatic index generation"
msgstr ""
-#: ../IkiWiki/Plugin/brokenlinks.pm:33 ../IkiWiki/Plugin/editpage.pm:261
-#: ../IkiWiki/Plugin/inline.pm:327 ../IkiWiki/Plugin/opendiscussion.pm:26
+#: ../IkiWiki/Plugin/brokenlinks.pm:33 ../IkiWiki/Plugin/editpage.pm:260
+#: ../IkiWiki/Plugin/inline.pm:354 ../IkiWiki/Plugin/opendiscussion.pm:26
#: ../IkiWiki/Plugin/orphans.pm:37 ../IkiWiki/Render.pm:79
#: ../IkiWiki/Render.pm:149
msgid "discussion"
@@ -190,6 +190,61 @@ msgstr ""
msgid "There are no broken links!"
msgstr "Det finns inga trasiga länkar!"
+#: ../IkiWiki/Plugin/comments.pm:119 ../IkiWiki/Plugin/format.pm:23
+#, perl-format
+msgid "unsupported page format %s"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:124
+msgid "comment must have content"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:181
+msgid "Anonymous"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:243 ../IkiWiki/Plugin/recentchanges.pm:101
+#, fuzzy
+msgid "missing page"
+msgstr "mall saknar id-parameter"
+
+#: ../IkiWiki/Plugin/comments.pm:245 ../IkiWiki/Plugin/recentchanges.pm:103
+#, perl-format
+msgid "The page %s does not exist."
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:334 ../IkiWiki/Plugin/editpage.pm:124
+msgid "bad page name"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:341
+#, fuzzy, perl-format
+msgid "commenting on %s"
+msgstr "skapar %s"
+
+#: ../IkiWiki/Plugin/comments.pm:359
+#, perl-format
+msgid "page '%s' doesn't exist, so you can't comment"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:366
+#, perl-format
+msgid "comments on page '%s' are closed"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:468
+msgid "Added a comment"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:472
+#, perl-format
+msgid "Added a comment: %s"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:565
+msgid "Comments"
+msgstr ""
+
#: ../IkiWiki/Plugin/conditional.pm:27 ../IkiWiki/Plugin/cutpaste.pm:30
#: ../IkiWiki/Plugin/cutpaste.pm:45 ../IkiWiki/Plugin/cutpaste.pm:61
#: ../IkiWiki/Plugin/testpagespec.pm:26
@@ -211,23 +266,19 @@ msgstr ""
msgid "removing old preview %s"
msgstr "tar bort gammal sida %s"
-#: ../IkiWiki/Plugin/editpage.pm:125
-msgid "bad page name"
-msgstr ""
-
-#: ../IkiWiki/Plugin/editpage.pm:141
+#: ../IkiWiki/Plugin/editpage.pm:140
#, perl-format
msgid "%s is not an editable page"
msgstr ""
-#: ../IkiWiki/Plugin/editpage.pm:317
+#: ../IkiWiki/Plugin/editpage.pm:316
#, perl-format
msgid "creating %s"
msgstr "skapar %s"
-#: ../IkiWiki/Plugin/editpage.pm:335 ../IkiWiki/Plugin/editpage.pm:363
-#: ../IkiWiki/Plugin/editpage.pm:373 ../IkiWiki/Plugin/editpage.pm:408
-#: ../IkiWiki/Plugin/editpage.pm:453
+#: ../IkiWiki/Plugin/editpage.pm:334 ../IkiWiki/Plugin/editpage.pm:353
+#: ../IkiWiki/Plugin/editpage.pm:363 ../IkiWiki/Plugin/editpage.pm:398
+#: ../IkiWiki/Plugin/editpage.pm:443
#, perl-format
msgid "editing %s"
msgstr "redigerar %s"
@@ -252,15 +303,10 @@ msgstr ""
msgid "failed to process"
msgstr "misslyckades med att behandla mall:"
-#: ../IkiWiki/Plugin/format.pm:22
+#: ../IkiWiki/Plugin/format.pm:20
msgid "must specify format and text"
msgstr ""
-#: ../IkiWiki/Plugin/format.pm:25
-#, perl-format
-msgid "unsupported page format %s"
-msgstr ""
-
#: ../IkiWiki/Plugin/fortune.pm:27
msgid "fortune failed"
msgstr "fortune misslyckades"
@@ -329,16 +375,16 @@ msgstr "misslyckades med att skriva %s: %s"
msgid "failed to determine size of image %s"
msgstr "misslyckades med att skriva %s: %s"
-#: ../IkiWiki/Plugin/inline.pm:93
+#: ../IkiWiki/Plugin/inline.pm:92
msgid "Must specify url to wiki with --url when using --rss or --atom"
msgstr "Måste ange url till wiki med --url när --rss eller --atom används"
-#: ../IkiWiki/Plugin/inline.pm:139
+#: ../IkiWiki/Plugin/inline.pm:138
#, fuzzy
msgid "page editing not allowed"
msgstr "mallen %s hittades inte"
-#: ../IkiWiki/Plugin/inline.pm:156
+#: ../IkiWiki/Plugin/inline.pm:155
#, fuzzy
msgid "missing pages parameter"
msgstr "mall saknar id-parameter"
@@ -348,20 +394,20 @@ msgstr "mall saknar id-parameter"
msgid "unknown sort type %s"
msgstr "okänd sorteringstyp %s"
-#: ../IkiWiki/Plugin/inline.pm:285
+#: ../IkiWiki/Plugin/inline.pm:307
msgid "Add a new post titled:"
msgstr ""
-#: ../IkiWiki/Plugin/inline.pm:301
+#: ../IkiWiki/Plugin/inline.pm:327
#, perl-format
msgid "nonexistant template %s"
msgstr ""
-#: ../IkiWiki/Plugin/inline.pm:335 ../IkiWiki/Render.pm:83
+#: ../IkiWiki/Plugin/inline.pm:362 ../IkiWiki/Render.pm:83
msgid "Discussion"
msgstr "Diskussion"
-#: ../IkiWiki/Plugin/inline.pm:572
+#: ../IkiWiki/Plugin/inline.pm:587
msgid "RPC::XML::Client not found, not pinging"
msgstr "RPC::XML::Client hittades inte, pingar inte"
@@ -386,17 +432,17 @@ msgstr ""
"misslyckades med att läsa in Perl-modulen Markdown.pm (%s) eller /usr/bin/"
"markdown (%s)"
-#: ../IkiWiki/Plugin/meta.pm:150
+#: ../IkiWiki/Plugin/meta.pm:151
#, fuzzy
msgid "stylesheet not found"
msgstr "mallen %s hittades inte"
-#: ../IkiWiki/Plugin/meta.pm:184
+#: ../IkiWiki/Plugin/meta.pm:185
#, fuzzy
msgid "redir page not found"
msgstr "mallen %s hittades inte"
-#: ../IkiWiki/Plugin/meta.pm:197
+#: ../IkiWiki/Plugin/meta.pm:198
#, fuzzy
msgid "redir cycle is not allowed"
msgstr "mallen %s hittades inte"
@@ -582,17 +628,7 @@ msgstr ""
msgid "need either `percent` or `totalpages` and `donepages` parameters"
msgstr ""
-#: ../IkiWiki/Plugin/recentchanges.pm:100
-#, fuzzy
-msgid "missing page"
-msgstr "mall saknar id-parameter"
-
-#: ../IkiWiki/Plugin/recentchanges.pm:102
-#, perl-format
-msgid "The page %s does not exist."
-msgstr ""
-
-#: ../IkiWiki/Plugin/recentchangesdiff.pm:36
+#: ../IkiWiki/Plugin/recentchangesdiff.pm:37
msgid "(Diff truncated)"
msgstr ""
@@ -941,19 +977,19 @@ msgstr "filnamn för wrapper har inte angivits"
#. translators: The first parameter is a filename, and the second is
#. translators: a (probably not translated) error message.
-#: ../IkiWiki/Wrapper.pm:79
+#: ../IkiWiki/Wrapper.pm:97
#, perl-format
msgid "failed to write %s: %s"
msgstr "misslyckades med att skriva %s: %s"
#. translators: The parameter is a C filename.
-#: ../IkiWiki/Wrapper.pm:135
+#: ../IkiWiki/Wrapper.pm:154
#, perl-format
msgid "failed to compile %s"
msgstr "misslyckades med att kompilera %s"
#. translators: The parameter is a filename.
-#: ../IkiWiki/Wrapper.pm:155
+#: ../IkiWiki/Wrapper.pm:174
#, perl-format
msgid "successfully generated %s"
msgstr "generering av %s lyckades"
@@ -966,41 +1002,41 @@ msgstr "användning: ikiwiki [flaggor] källa mål"
msgid " ikiwiki --setup configfile"
msgstr ""
-#: ../ikiwiki.in:90
+#: ../ikiwiki.in:91
msgid "usage: --set var=value"
msgstr ""
-#: ../ikiwiki.in:138
+#: ../ikiwiki.in:139
msgid "generating wrappers.."
msgstr "genererar wrappers.."
-#: ../ikiwiki.in:195
+#: ../ikiwiki.in:197
msgid "rebuilding wiki.."
msgstr "bygger om wiki.."
-#: ../ikiwiki.in:198
+#: ../ikiwiki.in:200
msgid "refreshing wiki.."
msgstr "uppdaterar wiki.."
-#: ../IkiWiki.pm:466
+#: ../IkiWiki.pm:480
msgid "Must specify url to wiki with --url when using --cgi"
msgstr "Måste ange url till wiki med --url när --cgi används"
-#: ../IkiWiki.pm:512
+#: ../IkiWiki.pm:526
msgid "cannot use multiple rcs plugins"
msgstr ""
-#: ../IkiWiki.pm:541
+#: ../IkiWiki.pm:555
#, perl-format
msgid "failed to load external plugin needed for %s plugin: %s"
msgstr ""
-#: ../IkiWiki.pm:1165
+#: ../IkiWiki.pm:1187
#, fuzzy, perl-format
msgid "preprocessing loop detected on %s at depth %i"
msgstr "%s förbehandlingsslinga detekterades på %s, djup %i"
-#: ../IkiWiki.pm:1678
+#: ../IkiWiki.pm:1688
msgid "yes"
msgstr ""
diff --git a/po/vi.po b/po/vi.po
index 4cc16e1d8..896d3037b 100644
--- a/po/vi.po
+++ b/po/vi.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: ikiwiki\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-10-31 16:37-0400\n"
+"POT-Creation-Date: 2008-12-20 18:07-0500\n"
"PO-Revision-Date: 2007-01-13 15:31+1030\n"
"Last-Translator: Clytie Siddall <clytie@riverland.net.au>\n"
"Language-Team: Vietnamese <vi-VN@googlegroups.com>\n"
@@ -24,7 +24,7 @@ msgstr "Trước tiên bạn cần phải đăng nhập."
msgid "login failed, perhaps you need to turn on cookies?"
msgstr ""
-#: ../IkiWiki/CGI.pm:163 ../IkiWiki/Plugin/editpage.pm:350
+#: ../IkiWiki/CGI.pm:163 ../IkiWiki/CGI.pm:310
msgid "Your login session has expired."
msgstr ""
@@ -49,7 +49,7 @@ msgstr "Tùy thích đã được lưu."
msgid "You are banned."
msgstr "Bạn bị cấm ra."
-#: ../IkiWiki/CGI.pm:385 ../IkiWiki/CGI.pm:386 ../IkiWiki.pm:1182
+#: ../IkiWiki/CGI.pm:401 ../IkiWiki/CGI.pm:402 ../IkiWiki.pm:1204
msgid "Error"
msgstr "Lỗi"
@@ -66,63 +66,63 @@ msgstr ""
msgid "missing %s parameter"
msgstr "mẫu thiếu tham số id"
-#: ../IkiWiki/Plugin/aggregate.pm:250
+#: ../IkiWiki/Plugin/aggregate.pm:251
msgid "new feed"
msgstr "nguồn tin mới"
-#: ../IkiWiki/Plugin/aggregate.pm:264
+#: ../IkiWiki/Plugin/aggregate.pm:265
msgid "posts"
msgstr "bài"
-#: ../IkiWiki/Plugin/aggregate.pm:266
+#: ../IkiWiki/Plugin/aggregate.pm:267
msgid "new"
msgstr "mới"
-#: ../IkiWiki/Plugin/aggregate.pm:429
+#: ../IkiWiki/Plugin/aggregate.pm:431
#, perl-format
msgid "expiring %s (%s days old)"
msgstr "đang mãn hạn %s (cũ %s ngày)"
-#: ../IkiWiki/Plugin/aggregate.pm:436
+#: ../IkiWiki/Plugin/aggregate.pm:438
#, perl-format
msgid "expiring %s"
msgstr "đang mãn hạn %s"
-#: ../IkiWiki/Plugin/aggregate.pm:463
+#: ../IkiWiki/Plugin/aggregate.pm:465
#, perl-format
msgid "last checked %s"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:467
+#: ../IkiWiki/Plugin/aggregate.pm:469
#, perl-format
msgid "checking feed %s ..."
msgstr "đang kiểm tra nguồn tin %s ..."
-#: ../IkiWiki/Plugin/aggregate.pm:472
+#: ../IkiWiki/Plugin/aggregate.pm:474
#, perl-format
msgid "could not find feed at %s"
msgstr "không tìm thấy nguồn tin ở %s"
-#: ../IkiWiki/Plugin/aggregate.pm:487
+#: ../IkiWiki/Plugin/aggregate.pm:493
#, fuzzy
msgid "feed not found"
msgstr "không tìm thấy mẫu %s"
-#: ../IkiWiki/Plugin/aggregate.pm:498
+#: ../IkiWiki/Plugin/aggregate.pm:504
#, perl-format
msgid "(invalid UTF-8 stripped from feed)"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:504
+#: ../IkiWiki/Plugin/aggregate.pm:512
#, perl-format
msgid "(feed entities escaped)"
msgstr ""
-#: ../IkiWiki/Plugin/aggregate.pm:510
+#: ../IkiWiki/Plugin/aggregate.pm:520
msgid "feed crashed XML::Feed!"
msgstr "nguồn tin đã gây ra XML::Feed sụp đổ."
-#: ../IkiWiki/Plugin/aggregate.pm:590
+#: ../IkiWiki/Plugin/aggregate.pm:601
#, perl-format
msgid "creating new page %s"
msgstr "đang tạo trang mới %s"
@@ -131,7 +131,7 @@ msgstr "đang tạo trang mới %s"
msgid "deleting bucket.."
msgstr ""
-#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:206
+#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:208
msgid "done"
msgstr "xong"
@@ -175,8 +175,8 @@ msgstr ""
msgid "automatic index generation"
msgstr ""
-#: ../IkiWiki/Plugin/brokenlinks.pm:33 ../IkiWiki/Plugin/editpage.pm:261
-#: ../IkiWiki/Plugin/inline.pm:327 ../IkiWiki/Plugin/opendiscussion.pm:26
+#: ../IkiWiki/Plugin/brokenlinks.pm:33 ../IkiWiki/Plugin/editpage.pm:260
+#: ../IkiWiki/Plugin/inline.pm:354 ../IkiWiki/Plugin/opendiscussion.pm:26
#: ../IkiWiki/Plugin/orphans.pm:37 ../IkiWiki/Render.pm:79
#: ../IkiWiki/Render.pm:149
msgid "discussion"
@@ -191,6 +191,61 @@ msgstr ""
msgid "There are no broken links!"
msgstr "Không có liên kết bị ngắt nào."
+#: ../IkiWiki/Plugin/comments.pm:119 ../IkiWiki/Plugin/format.pm:23
+#, perl-format
+msgid "unsupported page format %s"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:124
+msgid "comment must have content"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:181
+msgid "Anonymous"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:243 ../IkiWiki/Plugin/recentchanges.pm:101
+#, fuzzy
+msgid "missing page"
+msgstr "mẫu thiếu tham số id"
+
+#: ../IkiWiki/Plugin/comments.pm:245 ../IkiWiki/Plugin/recentchanges.pm:103
+#, perl-format
+msgid "The page %s does not exist."
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:334 ../IkiWiki/Plugin/editpage.pm:124
+msgid "bad page name"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:341
+#, fuzzy, perl-format
+msgid "commenting on %s"
+msgstr "đang tạo %s"
+
+#: ../IkiWiki/Plugin/comments.pm:359
+#, perl-format
+msgid "page '%s' doesn't exist, so you can't comment"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:366
+#, perl-format
+msgid "comments on page '%s' are closed"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:468
+msgid "Added a comment"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:472
+#, perl-format
+msgid "Added a comment: %s"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:565
+msgid "Comments"
+msgstr ""
+
#: ../IkiWiki/Plugin/conditional.pm:27 ../IkiWiki/Plugin/cutpaste.pm:30
#: ../IkiWiki/Plugin/cutpaste.pm:45 ../IkiWiki/Plugin/cutpaste.pm:61
#: ../IkiWiki/Plugin/testpagespec.pm:26
@@ -212,23 +267,19 @@ msgstr ""
msgid "removing old preview %s"
msgstr "đang gỡ bỏ trang cũ %s"
-#: ../IkiWiki/Plugin/editpage.pm:125
-msgid "bad page name"
-msgstr ""
-
-#: ../IkiWiki/Plugin/editpage.pm:141
+#: ../IkiWiki/Plugin/editpage.pm:140
#, perl-format
msgid "%s is not an editable page"
msgstr ""
-#: ../IkiWiki/Plugin/editpage.pm:317
+#: ../IkiWiki/Plugin/editpage.pm:316
#, perl-format
msgid "creating %s"
msgstr "đang tạo %s"
-#: ../IkiWiki/Plugin/editpage.pm:335 ../IkiWiki/Plugin/editpage.pm:363
-#: ../IkiWiki/Plugin/editpage.pm:373 ../IkiWiki/Plugin/editpage.pm:408
-#: ../IkiWiki/Plugin/editpage.pm:453
+#: ../IkiWiki/Plugin/editpage.pm:334 ../IkiWiki/Plugin/editpage.pm:353
+#: ../IkiWiki/Plugin/editpage.pm:363 ../IkiWiki/Plugin/editpage.pm:398
+#: ../IkiWiki/Plugin/editpage.pm:443
#, perl-format
msgid "editing %s"
msgstr "đang sửa %s"
@@ -253,15 +304,10 @@ msgstr ""
msgid "failed to process"
msgstr "mẫu không xử lý được:"
-#: ../IkiWiki/Plugin/format.pm:22
+#: ../IkiWiki/Plugin/format.pm:20
msgid "must specify format and text"
msgstr ""
-#: ../IkiWiki/Plugin/format.pm:25
-#, perl-format
-msgid "unsupported page format %s"
-msgstr ""
-
#: ../IkiWiki/Plugin/fortune.pm:27
msgid "fortune failed"
msgstr "fortune bị lỗi"
@@ -330,18 +376,18 @@ msgstr "lỗi ghi %s: %s"
msgid "failed to determine size of image %s"
msgstr "lỗi ghi %s: %s"
-#: ../IkiWiki/Plugin/inline.pm:93
+#: ../IkiWiki/Plugin/inline.pm:92
msgid "Must specify url to wiki with --url when using --rss or --atom"
msgstr ""
"Cần phải xác định địa chỉ URL tới wiki với « --url » khi dùng « --rss » hay « --"
"atom »"
-#: ../IkiWiki/Plugin/inline.pm:139
+#: ../IkiWiki/Plugin/inline.pm:138
#, fuzzy
msgid "page editing not allowed"
msgstr "không tìm thấy mẫu %s"
-#: ../IkiWiki/Plugin/inline.pm:156
+#: ../IkiWiki/Plugin/inline.pm:155
#, fuzzy
msgid "missing pages parameter"
msgstr "mẫu thiếu tham số id"
@@ -351,20 +397,20 @@ msgstr "mẫu thiếu tham số id"
msgid "unknown sort type %s"
msgstr "kiểu sắp xếp không rõ %s"
-#: ../IkiWiki/Plugin/inline.pm:285
+#: ../IkiWiki/Plugin/inline.pm:307
msgid "Add a new post titled:"
msgstr ""
-#: ../IkiWiki/Plugin/inline.pm:301
+#: ../IkiWiki/Plugin/inline.pm:327
#, perl-format
msgid "nonexistant template %s"
msgstr ""
-#: ../IkiWiki/Plugin/inline.pm:335 ../IkiWiki/Render.pm:83
+#: ../IkiWiki/Plugin/inline.pm:362 ../IkiWiki/Render.pm:83
msgid "Discussion"
msgstr "Thảo luận"
-#: ../IkiWiki/Plugin/inline.pm:572
+#: ../IkiWiki/Plugin/inline.pm:587
msgid "RPC::XML::Client not found, not pinging"
msgstr "Không tìm thấy RPC::XML::Client nên không gửi gói tin ping"
@@ -387,17 +433,17 @@ msgstr ""
msgid "failed to load Markdown.pm perl module (%s) or /usr/bin/markdown (%s)"
msgstr "lỗi nạp mô-đun perl Markdown.pm (%s) hay « /usr/bin/markdown » (%s)"
-#: ../IkiWiki/Plugin/meta.pm:150
+#: ../IkiWiki/Plugin/meta.pm:151
#, fuzzy
msgid "stylesheet not found"
msgstr "không tìm thấy mẫu %s"
-#: ../IkiWiki/Plugin/meta.pm:184
+#: ../IkiWiki/Plugin/meta.pm:185
#, fuzzy
msgid "redir page not found"
msgstr "không tìm thấy mẫu %s"
-#: ../IkiWiki/Plugin/meta.pm:197
+#: ../IkiWiki/Plugin/meta.pm:198
#, fuzzy
msgid "redir cycle is not allowed"
msgstr "không tìm thấy mẫu %s"
@@ -583,17 +629,7 @@ msgstr ""
msgid "need either `percent` or `totalpages` and `donepages` parameters"
msgstr ""
-#: ../IkiWiki/Plugin/recentchanges.pm:100
-#, fuzzy
-msgid "missing page"
-msgstr "mẫu thiếu tham số id"
-
-#: ../IkiWiki/Plugin/recentchanges.pm:102
-#, perl-format
-msgid "The page %s does not exist."
-msgstr ""
-
-#: ../IkiWiki/Plugin/recentchangesdiff.pm:36
+#: ../IkiWiki/Plugin/recentchangesdiff.pm:37
msgid "(Diff truncated)"
msgstr ""
@@ -942,19 +978,19 @@ msgstr "chưa xác định tên tập tin bộ bao bọc"
#. translators: The first parameter is a filename, and the second is
#. translators: a (probably not translated) error message.
-#: ../IkiWiki/Wrapper.pm:79
+#: ../IkiWiki/Wrapper.pm:97
#, perl-format
msgid "failed to write %s: %s"
msgstr "lỗi ghi %s: %s"
#. translators: The parameter is a C filename.
-#: ../IkiWiki/Wrapper.pm:135
+#: ../IkiWiki/Wrapper.pm:154
#, perl-format
msgid "failed to compile %s"
msgstr "lỗi biên dịch %s"
#. translators: The parameter is a filename.
-#: ../IkiWiki/Wrapper.pm:155
+#: ../IkiWiki/Wrapper.pm:174
#, perl-format
msgid "successfully generated %s"
msgstr "%s đã được tạo ra"
@@ -967,41 +1003,41 @@ msgstr "cách sử dụng: ikiwiki [tùy chọn] nguồn đích"
msgid " ikiwiki --setup configfile"
msgstr ""
-#: ../ikiwiki.in:90
+#: ../ikiwiki.in:91
msgid "usage: --set var=value"
msgstr ""
-#: ../ikiwiki.in:138
+#: ../ikiwiki.in:139
msgid "generating wrappers.."
msgstr "đang tạo ra các bộ bao bọc.."
-#: ../ikiwiki.in:195
+#: ../ikiwiki.in:197
msgid "rebuilding wiki.."
msgstr "đang xây dựng lại wiki.."
-#: ../ikiwiki.in:198
+#: ../ikiwiki.in:200
msgid "refreshing wiki.."
msgstr "đang làm tươi wiki.."
-#: ../IkiWiki.pm:466
+#: ../IkiWiki.pm:480
msgid "Must specify url to wiki with --url when using --cgi"
msgstr "Cần phải xác định địa chỉ URL tới wiki với « --url » khi dùng « --cgi »"
-#: ../IkiWiki.pm:512
+#: ../IkiWiki.pm:526
msgid "cannot use multiple rcs plugins"
msgstr ""
-#: ../IkiWiki.pm:541
+#: ../IkiWiki.pm:555
#, perl-format
msgid "failed to load external plugin needed for %s plugin: %s"
msgstr ""
-#: ../IkiWiki.pm:1165
+#: ../IkiWiki.pm:1187
#, fuzzy, perl-format
msgid "preprocessing loop detected on %s at depth %i"
msgstr "vòng lặp tiền xử lý %s được phát hiện trên %s ở độ sâu %i"
-#: ../IkiWiki.pm:1678
+#: ../IkiWiki.pm:1688
msgid "yes"
msgstr ""
diff --git a/t/beautify_urlpath.t b/t/beautify_urlpath.t
new file mode 100755
index 000000000..94b923d3b
--- /dev/null
+++ b/t/beautify_urlpath.t
@@ -0,0 +1,17 @@
+#!/usr/bin/perl
+use warnings;
+use strict;
+use Test::More tests => 8;
+
+BEGIN { use_ok("IkiWiki"); }
+
+$IkiWiki::config{usedirs} = 1;
+$IkiWiki::config{htmlext} = "HTML";
+is(IkiWiki::beautify_urlpath("foo/bar"), "./foo/bar");
+is(IkiWiki::beautify_urlpath("../badger"), "../badger");
+is(IkiWiki::beautify_urlpath("./bleh"), "./bleh");
+is(IkiWiki::beautify_urlpath("foo/index.HTML"), "./foo/");
+is(IkiWiki::beautify_urlpath("index.HTML"), "./");
+is(IkiWiki::beautify_urlpath("../index.HTML"), "../");
+$IkiWiki::config{usedirs} = 0;
+is(IkiWiki::beautify_urlpath("foo/index.HTML"), "./foo/index.HTML");
diff --git a/t/htmlbalance.t b/t/htmlbalance.t
new file mode 100755
index 000000000..e5a5db0ee
--- /dev/null
+++ b/t/htmlbalance.t
@@ -0,0 +1,23 @@
+#!/usr/bin/perl
+use warnings;
+use strict;
+
+BEGIN {
+ eval q{
+ use HTML::TreeBuilder;
+ };
+ if ($@) {
+ eval q{use Test::More skip_all => "HTML::TreeBuilder not available"};
+ }
+ else {
+ eval q{use Test::More tests => 7};
+ }
+ use_ok("IkiWiki::Plugin::htmlbalance");
+}
+
+is(IkiWiki::Plugin::htmlbalance::sanitize(content => "<br></br>"), "<br />");
+is(IkiWiki::Plugin::htmlbalance::sanitize(content => "<div><p b=\"c\">hello world</div>"), "<div><p b=\"c\">hello world</p></div>");
+is(IkiWiki::Plugin::htmlbalance::sanitize(content => "<a></a></a>"), "<a></a>");
+is(IkiWiki::Plugin::htmlbalance::sanitize(content => "<b>foo <a</b>"), "<b>foo </b>");
+is(IkiWiki::Plugin::htmlbalance::sanitize(content => "<b> foo <a</a></b>"), "<b> foo </b>");
+is(IkiWiki::Plugin::htmlbalance::sanitize(content => "a>"), "a&gt;");
diff --git a/t/openiduser.t b/t/openiduser.t
new file mode 100755
index 000000000..52d879484
--- /dev/null
+++ b/t/openiduser.t
@@ -0,0 +1,37 @@
+#!/usr/bin/perl
+use warnings;
+use strict;
+
+BEGIN {
+ eval q{
+ use Net::OpenID::VerifiedIdentity;
+ };
+ if ($@) {
+ eval q{use Test::More skip_all => "Net::OpenID::VerifiedIdentity not available"};
+ }
+ else {
+ eval q{use Test::More tests => 9};
+ }
+ use_ok("IkiWiki::Plugin::openid");
+}
+
+# Some typical examples:
+
+# This test, when run by Test::Harness using perl -w, exposes a warning in
+# Net::OpenID::VerifiedIdentity. Normally that warning is not displayed, as
+# that module does not use warnings. To avoid cluttering the test output,
+# disable the -w switch temporarily.
+$^W=0;
+is(IkiWiki::openiduser('http://josephturian.blogspot.com'), 'josephturian [blogspot.com]');
+$^W=1;
+
+is(IkiWiki::openiduser('http://yam655.livejournal.com/'), 'yam655 [livejournal.com]');
+is(IkiWiki::openiduser('http://id.mayfirst.org/jamie/'), 'jamie [id.mayfirst.org]');
+
+# and some less typical ones taken from the ikiwiki commit history
+
+is(IkiWiki::openiduser('http://thm.id.fedoraproject.org/'), 'thm [id.fedoraproject.org]');
+is(IkiWiki::openiduser('http://dtrt.org/'), 'dtrt.org');
+is(IkiWiki::openiduser('http://alcopop.org/me/openid/'), 'openid [alcopop.org/me]');
+is(IkiWiki::openiduser('http://id.launchpad.net/882/bielawski1'), 'bielawski1 [id.launchpad.net/882]');
+is(IkiWiki::openiduser('http://technorati.com/people/technorati/drajt'), 'drajt [technorati.com/people/technorati]');
diff --git a/templates/atomitem.tmpl b/templates/atomitem.tmpl
index 1ff7f4f4e..768695a2c 100644
--- a/templates/atomitem.tmpl
+++ b/templates/atomitem.tmpl
@@ -39,4 +39,10 @@
<TMPL_VAR CONTENT ESCAPE=HTML>
</content>
</TMPL_IF>
+ <TMPL_IF NAME="COMMENTSURL">
+ <link rel="comments" href="<TMPL_VAR NAME="COMMENTSURL">" type="text/html" />
+ </TMPL_IF>
+ <TMPL_IF NAME="ATOMCOMMENTSURL">
+ <link rel="comments" href="<TMPL_VAR NAME="ATOMCOMMENTSURL">" type="application/atom+xml" />
+ </TMPL_IF>
</entry>
diff --git a/templates/change.tmpl b/templates/change.tmpl
index 0aebae61e..0e61a80f4 100644
--- a/templates/change.tmpl
+++ b/templates/change.tmpl
@@ -32,14 +32,14 @@
<div class=changelog>
<TMPL_LOOP NAME="MESSAGE">
<TMPL_IF NAME="LINE">
-<TMPL_VAR NAME="LINE" ESCAPE="HTML"><br />
+<TMPL_VAR NAME="LINE"><br />
</TMPL_IF>
</TMPL_LOOP>
</div>
<TMPL_IF NAME="DIFF">
<div class=diff>
<pre>
-<TMPL_VAR NAME="DIFF" ESCAPE="HTML">
+<TMPL_VAR NAME="DIFF">
</pre>
</div>
</TMPL_IF>
diff --git a/templates/comment.tmpl b/templates/comment.tmpl
new file mode 100644
index 000000000..6f2b1619e
--- /dev/null
+++ b/templates/comment.tmpl
@@ -0,0 +1,42 @@
+<div class="comment" id="<TMPL_VAR NAME=INLINEPAGE>">
+
+<div class="comment-subject"><a href="<TMPL_VAR PERMALINK>"><TMPL_VAR TITLE></a></div>
+
+<div class="inlinecontent">
+<TMPL_VAR CONTENT>
+</div>
+
+<div class="comment-header">
+Comment by
+
+<TMPL_IF NAME="COMMENTUSER">
+<TMPL_IF NAME="COMMENTOPENID">
+<span class="author" title="OpenID">
+<a href="<TMPL_VAR NAME=COMMENTOPENID>"><TMPL_VAR NAME=COMMENTAUTHOR></a>
+</span>
+<TMPL_ELSE>
+<span class="author" title="Signed in">
+<TMPL_IF NAME="COMMENTAUTHORURL">
+<a href="<TMPL_VAR NAME=COMMENTAUTHORURL>"><TMPL_VAR NAME=COMMENTAUTHOR></a>
+<TMPL_ELSE>
+<TMPL_VAR NAME=COMMENTAUTHOR>
+</TMPL_IF>
+</span>
+</TMPL_IF>
+<TMPL_ELSE><!-- !COMMENTUSER -->
+<TMPL_IF NAME=COMMENTIP>
+<span class="author" title="Unauthenticated, from <TMPL_VAR NAME=COMMENTIP>">
+<TMPL_ELSE><!-- !COMMENTIP -->
+<span class="author" title="Unauthenticated, from unknown IP address">
+</TMPL_IF>
+<TMPL_IF NAME="AUTHORURL">
+<a href="<TMPL_VAR NAME=AUTHORURL>"><TMPL_VAR NAME=AUTHOR></a>
+<TMPL_ELSE>
+<TMPL_VAR NAME=AUTHOR>
+</TMPL_IF>
+</span>
+</TMPL_IF><!-- !COMMENTUSER -->
+
+&mdash; <TMPL_VAR CTIME>
+</div>
+</div><!--.comment-->
diff --git a/templates/editcomment.tmpl b/templates/editcomment.tmpl
new file mode 100644
index 000000000..891bcae65
--- /dev/null
+++ b/templates/editcomment.tmpl
@@ -0,0 +1,29 @@
+<div class="editcomment">
+<TMPL_VAR MESSAGE>
+<TMPL_VAR FORM-START>
+<TMPL_VAR FIELD-DO>
+<TMPL_VAR FIELD-SID>
+<TMPL_VAR FIELD-PAGE>
+<TMPL_UNLESS NAME=USERNAME>
+<TMPL_IF NAME=ALLOWAUTHOR>
+Name: <TMPL_VAR NAME=FIELD-AUTHOR> (optional)<br />
+Website: <TMPL_VAR NAME=FIELD-URL> (optional)<br />
+</TMPL_IF>
+</TMPL_UNLESS>
+Subject: <TMPL_VAR FIELD-SUBJECT><br />
+<TMPL_VAR FIELD-EDITCONTENT><br />
+<TMPL_VAR FORM-SUBMIT> <TMPL_VAR FIELD-TYPE> <TMPL_VAR HELPONFORMATTINGLINK><br />
+IkiWiki directives ([[!directive]]) are <TMPL_UNLESS NAME="ALLOWDIRECTIVES">not </TMPL_UNLESS>allowed in comments on this wiki.<br />
+<TMPL_VAR NAME="FORM-END">
+
+<TMPL_IF NAME="PAGE_PREVIEW">
+<hr />
+<div class="header">
+<span>Comment preview:</span>
+</div><!-- .header -->
+<div id="preview">
+<TMPL_VAR PAGE_PREVIEW>
+</div><!-- #preview -->
+</TMPL_IF>
+
+</div><!-- .editcomment -->
diff --git a/templates/inlinepage.tmpl b/templates/inlinepage.tmpl
index 984d33cef..3c0b93315 100644
--- a/templates/inlinepage.tmpl
+++ b/templates/inlinepage.tmpl
@@ -58,9 +58,13 @@ License: <TMPL_VAR LICENSE>
<TMPL_IF NAME="EDITURL">
<li><a href="<TMPL_VAR EDITURL>" rel="nofollow">Edit</a></li>
</TMPL_IF>
+<TMPL_IF NAME="COMMENTSLINK">
+<li><TMPL_VAR COMMENTSLINK></li>
+<TMPL_ELSE>
<TMPL_IF NAME="DISCUSSIONLINK">
<li><TMPL_VAR DISCUSSIONLINK></li>
</TMPL_IF>
+</TMPL_IF>
</ul>
</div><!--.actions-->
</TMPL_IF>
diff --git a/templates/page.tmpl b/templates/page.tmpl
index 8c2ca668f..f75491127 100644
--- a/templates/page.tmpl
+++ b/templates/page.tmpl
@@ -49,9 +49,13 @@
<TMPL_IF NAME="PREFSURL">
<li><a href="<TMPL_VAR PREFSURL>">Preferences</a></li>
</TMPL_IF>
+<TMPL_IF NAME="COMMENTSLINK">
+<li><TMPL_VAR COMMENTSLINK><br /></li>
+<TMPL_ELSE>
<TMPL_IF NAME="DISCUSSIONLINK">
<li><TMPL_VAR DISCUSSIONLINK><br /></li>
</TMPL_IF>
+</TMPL_IF>
</ul>
</div>
</TMPL_IF>
@@ -67,6 +71,19 @@
<TMPL_VAR CONTENT>
</div>
+<TMPL_IF COMMENTS>
+<div id="comments">
+<TMPL_VAR COMMENTS>
+<TMPL_IF ADDCOMMENTURL>
+<div class="addcomment">
+<a href="<TMPL_VAR ADDCOMMENTURL>">Add a comment</a>
+</div>
+<TMPL_ELSE>
+<div class="addcomment">Comments on this page are closed.</div>
+</TMPL_IF>
+</div>
+</TMPL_IF>
+
<div id="footer" class="pagefooter">
<div id="pageinfo">
diff --git a/templates/rssitem.tmpl b/templates/rssitem.tmpl
index 42936a668..a61b92b61 100644
--- a/templates/rssitem.tmpl
+++ b/templates/rssitem.tmpl
@@ -23,4 +23,7 @@
<TMPL_ELSE>
<description><TMPL_VAR CONTENT ESCAPE=HTML></description>
</TMPL_IF>
+ <TMPL_IF NAME="COMMENTSURL">
+ <comments><TMPL_VAR NAME="COMMENTSURL"></comments>
+ </TMPL_IF>
</item>