Merge remote branch 'upstream/master' into prv/po
authorintrigeri <intrigeri@boum.org>
Fri, 25 Jun 2010 12:38:37 +0000 (14:38 +0200)
committerintrigeri <intrigeri@boum.org>
Fri, 25 Jun 2010 12:38:37 +0000 (14:38 +0200)
Conflicts:
IkiWiki/Plugin/po.pm

617 files changed:
.gitignore
Bundle/IkiWiki.pm
Bundle/IkiWiki/Extras.pm
IkiWiki.pm
IkiWiki/CGI.pm
IkiWiki/Plugin/404.pm
IkiWiki/Plugin/amazon_s3.pm
IkiWiki/Plugin/anonok.pm
IkiWiki/Plugin/attachment.pm
IkiWiki/Plugin/autoindex.pm
IkiWiki/Plugin/blogspam.pm
IkiWiki/Plugin/bzr.pm
IkiWiki/Plugin/calendar.pm
IkiWiki/Plugin/color.pm
IkiWiki/Plugin/comments.pm
IkiWiki/Plugin/conditional.pm
IkiWiki/Plugin/creole.pm
IkiWiki/Plugin/cutpaste.pm
IkiWiki/Plugin/cvs.pm
IkiWiki/Plugin/darcs.pm
IkiWiki/Plugin/date.pm
IkiWiki/Plugin/editdiff.pm
IkiWiki/Plugin/editpage.pm
IkiWiki/Plugin/edittemplate.pm
IkiWiki/Plugin/filecheck.pm
IkiWiki/Plugin/format.pm
IkiWiki/Plugin/fortune.pm
IkiWiki/Plugin/getsource.pm
IkiWiki/Plugin/git.pm
IkiWiki/Plugin/google.pm
IkiWiki/Plugin/goto.pm
IkiWiki/Plugin/graphviz.pm
IkiWiki/Plugin/haiku.pm
IkiWiki/Plugin/highlight.pm
IkiWiki/Plugin/hnb.pm
IkiWiki/Plugin/html.pm
IkiWiki/Plugin/htmlscrubber.pm
IkiWiki/Plugin/httpauth.pm
IkiWiki/Plugin/img.pm
IkiWiki/Plugin/inline.pm
IkiWiki/Plugin/link.pm
IkiWiki/Plugin/linkmap.pm
IkiWiki/Plugin/listdirectives.pm
IkiWiki/Plugin/lockedit.pm
IkiWiki/Plugin/map.pm
IkiWiki/Plugin/mdwn.pm
IkiWiki/Plugin/mercurial.pm
IkiWiki/Plugin/meta.pm
IkiWiki/Plugin/mirrorlist.pm
IkiWiki/Plugin/moderatedcomments.pm
IkiWiki/Plugin/monotone.pm
IkiWiki/Plugin/more.pm
IkiWiki/Plugin/norcs.pm
IkiWiki/Plugin/opendiscussion.pm
IkiWiki/Plugin/openid.pm
IkiWiki/Plugin/orphans.pm
IkiWiki/Plugin/otl.pm
IkiWiki/Plugin/pagecount.pm
IkiWiki/Plugin/pagestats.pm
IkiWiki/Plugin/parentlinks.pm
IkiWiki/Plugin/passwordauth.pm
IkiWiki/Plugin/po.pm
IkiWiki/Plugin/poll.pm
IkiWiki/Plugin/polygen.pm
IkiWiki/Plugin/postsparkline.pm
IkiWiki/Plugin/progress.pm
IkiWiki/Plugin/rawhtml.pm
IkiWiki/Plugin/recentchanges.pm
IkiWiki/Plugin/relativedate.pm
IkiWiki/Plugin/remove.pm
IkiWiki/Plugin/rename.pm
IkiWiki/Plugin/repolist.pm
IkiWiki/Plugin/search.pm
IkiWiki/Plugin/shortcut.pm
IkiWiki/Plugin/sidebar.pm
IkiWiki/Plugin/signinedit.pm
IkiWiki/Plugin/skeleton.pm.example
IkiWiki/Plugin/sortnaturally.pm [new file with mode: 0644]
IkiWiki/Plugin/sparkline.pm
IkiWiki/Plugin/svn.pm
IkiWiki/Plugin/table.pm
IkiWiki/Plugin/tag.pm
IkiWiki/Plugin/template.pm
IkiWiki/Plugin/teximg.pm
IkiWiki/Plugin/textile.pm
IkiWiki/Plugin/theme.pm [new file with mode: 0644]
IkiWiki/Plugin/tla.pm
IkiWiki/Plugin/toc.pm
IkiWiki/Plugin/toggle.pm
IkiWiki/Plugin/txt.pm
IkiWiki/Plugin/typography.pm
IkiWiki/Plugin/underlay.pm
IkiWiki/Plugin/version.pm
IkiWiki/Plugin/websetup.pm
IkiWiki/Plugin/wikitext.pm
IkiWiki/Plugin/wmd.pm
IkiWiki/Receive.pm
IkiWiki/Render.pm
IkiWiki/Setup.pm
IkiWiki/Setup/Automator.pm
IkiWiki/Setup/Standard.pm
IkiWiki/Setup/Yaml.pm [new file with mode: 0644]
IkiWiki/Wrapper.pm
Makefile.PL
README
auto-blog.setup
debian/NEWS
debian/changelog
debian/control
debian/copyright
debian/postinst
doc/bugs/2.45_Compilation_error.mdwn
doc/bugs/404_plugin_and_lighttpd.mdwn [new file with mode: 0644]
doc/bugs/Cannot_inline_pages_with_apostrophes_in_title.mdwn
doc/bugs/Comments_dissapeared.mdwn [new file with mode: 0644]
doc/bugs/Error:_Your_login_session_has_expired._.mdwn
doc/bugs/Exception:_Unknown_function___96__this__39___.mdwn [new file with mode: 0644]
doc/bugs/External_links_with_Creole.mdwn [new file with mode: 0644]
doc/bugs/Git:_changed_behavior_w.r.t._timestamps.mdwn [new file with mode: 0644]
doc/bugs/Links_to_missing_pages_should_always_be_styled.mdwn [new file with mode: 0644]
doc/bugs/Problems_with_graphviz.pm_plug-in.mdwn
doc/bugs/Problems_with_graphviz.pm_plug-in_previews.mdwn [new file with mode: 0644]
doc/bugs/SSI_include_stripped_from_mdwn.mdwn
doc/bugs/Tab_delimited_tables_don__39__t_work.mdwn [new file with mode: 0644]
doc/bugs/anonok_vs._httpauth.mdwn
doc/bugs/attachment_upload_does_not_work_for_windows_clients.mdwn [new file with mode: 0644]
doc/bugs/barfs_on_recentchange_entry_for_a_change_removing_an_invalid_pagespec.mdwn
doc/bugs/build_fails_oddly_when_older_ikiwiki_is_installed.mdwn [new file with mode: 0644]
doc/bugs/bzr_2.0_breaks_bzr_plugin.mdwn [new file with mode: 0644]
doc/bugs/clearenv_not_present_at_FreeBSD_.mdwn [new file with mode: 0644]
doc/bugs/clearenv_not_present_at_FreeBSD_/discussion.mdwn [new file with mode: 0644]
doc/bugs/comments_not_searchable.mdwn [new file with mode: 0644]
doc/bugs/comments_preview_unsafe_with_allowdirectives.mdwn [new file with mode: 0644]
doc/bugs/deletion_warnings.mdwn [new file with mode: 0644]
doc/bugs/depends_simple_mixup.mdwn [new file with mode: 0644]
doc/bugs/external_links_inside_headings_don__39__t_work.mdwn
doc/bugs/filecheck_failing_to_find_files.mdwn [new file with mode: 0644]
doc/bugs/firefox_doesn__39__t_want_to_load_updated_pages_at_ikiwiki.info.mdwn
doc/bugs/gitremotes_script_picks_up_tags_from_anywhere.mdwn [new file with mode: 0644]
doc/bugs/html5_support.mdwn
doc/bugs/html5_time_element__39__s_pubdate_wrong_when_using_xhtml5___34__mode__34__.mdwn [new file with mode: 0644]
doc/bugs/http_proxy_for_openid.mdwn
doc/bugs/ikiwiki-transition_does_not_set_perl_moduels_path_properly.mdwn [new file with mode: 0644]
doc/bugs/img_plugin_and_missing_heigth_value.mdwn [new file with mode: 0644]
doc/bugs/img_vs_align.mdwn
doc/bugs/inline_raw_broken_on_unknown_pagetype.mdwn
doc/bugs/login_page_non-obvious_with_openid.mdwn
doc/bugs/login_page_should_note_cookie_requirement.mdwn
doc/bugs/map_sorts_by_pagename_and_not_title_when_show__61__title_is_used.mdwn
doc/bugs/misctemplate_does_not_respect_the_current_page___40__if_any__41__.mdwn [new file with mode: 0644]
doc/bugs/nested_raw_included_inlines.mdwn
doc/bugs/pagemtime_in_refresh_mode.mdwn [new file with mode: 0644]
doc/bugs/pagespec:_tagged__40____41____44___globbing.mdwn [new file with mode: 0644]
doc/bugs/pagespec_error_on_refresh_but_not_rebuild.mdwn [new file with mode: 0644]
doc/bugs/pagetitle_function_does_not_respect_meta_titles.mdwn
doc/bugs/plugins__47__relativedate_depends_on_locale_at_setup_file.mdwn [new file with mode: 0644]
doc/bugs/post-update_hook_can__39__t_be_compiled_with_tcc.mdwn [new file with mode: 0644]
doc/bugs/preview_pagestate.mdwn [new file with mode: 0644]
doc/bugs/rebuild_after_changing_the_underlaydir_config_option.mdwn [new file with mode: 0644]
doc/bugs/remove_orphaned_sparkline-php_from_Suggests.mdwn
doc/bugs/removing_pages_with_utf8_characters.mdwn [new file with mode: 0644]
doc/bugs/some_but_not_all_meta_fields_are_stored_escaped.mdwn [new file with mode: 0644]
doc/bugs/stray___60____47__p__62___tags.mdwn
doc/bugs/svn_commit_failures_interpreted_as_merge_conflicts.mdwn [new file with mode: 0644]
doc/bugs/tag_plugin:_autotag_vs._staged_changes.mdwn [new file with mode: 0644]
doc/bugs/tagged__40____41___matching_wikilinks.mdwn
doc/bugs/templateForRecentChangesMissingCloseSpan.mdwn [new file with mode: 0644]
doc/bugs/the_login_page_is_unclear_when_multiple_methods_exist.mdwn
doc/bugs/underlaydir_file_expose.mdwn
doc/bugs/utf-8_bug_in_websetup.pm.mdwn
doc/bugs/wrapper_can__39__t_find_the_perl_modules.mdwn [new file with mode: 0644]
doc/css.mdwn
doc/css_market.mdwn
doc/download.mdwn
doc/examples/blog.mdwn
doc/examples/blog/archives.mdwn [new file with mode: 0644]
doc/examples/blog/comments.mdwn
doc/examples/blog/index.mdwn
doc/examples/blog/posts.mdwn
doc/examples/blog/posts/first_post.mdwn
doc/examples/blog/sidebar.mdwn
doc/examples/blog/tags/life.mdwn [deleted file]
doc/examples/blog/tags/tech.mdwn [deleted file]
doc/examples/softwaresite.mdwn
doc/examples/softwaresite/news.mdwn
doc/features.mdwn
doc/forum/Can_OpenID_users_be_adminusers__63__.mdwn
doc/forum/Error:_bad_page_name.mdwn [new file with mode: 0644]
doc/forum/How_does_ikiwiki_remember_times__63__.mdwn
doc/forum/Migrating_old_repository_to_new_ikiwiki_system__63__.mdwn
doc/forum/PERL5LIB__44___wrappers_and_homedir_install.mdwn [new file with mode: 0644]
doc/forum/Render_more_than_one_dest_page_from_same_source_page.mdwn [new file with mode: 0644]
doc/forum/The_requested_URL___47____126__jean__47__blog__47__ikiwiki.cgi_was_not_found_on_this_server..mdwn [new file with mode: 0644]
doc/forum/The_requested_URL___47____126__jean__47__blog__47__ikiwiki.cgi_was_not_found_on_this_server./comment_1_d36ce6fab90e0a086ac84369af38d205._comment [new file with mode: 0644]
doc/forum/The_requested_URL___47____126__jean__47__blog__47__ikiwiki.cgi_was_not_found_on_this_server./comment_2_5836bba08172d2ddf6a43da87ebb0332._comment [new file with mode: 0644]
doc/forum/an_alternative_approach_to_structured_data.mdwn
doc/forum/debian_backports_update_someone_please.mdwn [new file with mode: 0644]
doc/forum/double_forward_slash___39____47____47____39___in_the_address_bar.mdwn [new file with mode: 0644]
doc/forum/formating:_how_to_align_text_to_the_right.mdwn [new file with mode: 0644]
doc/forum/google_openid_broken__63__.mdwn
doc/forum/how_do_I_revert_edits_in_the_web_mode__63__.mdwn [new file with mode: 0644]
doc/forum/how_to_add_post_titles_in_ikiwiki_blog__63__.mdwn [new file with mode: 0644]
doc/forum/how_to_load_an_external_page_and_still_have_it_under_ikiwiki_template.mdwn [new file with mode: 0644]
doc/forum/how_to_login_as_admin.mdwn [new file with mode: 0644]
doc/forum/how_to_setup_ikiwiki_on_a_remote_host.mdwn [new file with mode: 0644]
doc/forum/ikiwiki_development_environment_tips.mdwn [new file with mode: 0644]
doc/forum/link_autocompletion_in_vim.mdwn [new file with mode: 0644]
doc/forum/link_to_an_image_inside_the_wiki_without_inlining_it.mdwn [new file with mode: 0644]
doc/forum/navigation_of_wiki_pages_on_local_filesystem_with_vim.mdwn [new file with mode: 0644]
doc/forum/speeding_up_ikiwiki.mdwn
doc/forum/suppressing_output_of_pages_included_only_for_their_side_effects.mdwn [new file with mode: 0644]
doc/forum/tag_plugin:_rebuilding_autocreated_pages.mdwn [new file with mode: 0644]
doc/forum/utf8_warnings_for___34____92__xAB__34__.mdwn [new file with mode: 0644]
doc/forum/what_is_the_easiest_way_to_implement_order:_disallow_all__44___allow_chosen__95__few_page_editing_policy__63__.mdwn [new file with mode: 0644]
doc/forum/where_are_the_tags.mdwn [new file with mode: 0644]
doc/forum/wiki_clones_on_dynamic_IPs.mdwn [new file with mode: 0644]
doc/forum/wiki_name_in_page_titles.mdwn
doc/forum/wishlist-discussion:_Editformular_showing_existing_tags.mdwn [new file with mode: 0644]
doc/freesoftware.mdwn
doc/git.mdwn
doc/ikiwiki-calendar.mdwn
doc/ikiwiki-makerepo.mdwn
doc/ikiwiki-makerepo/discussion.mdwn [new file with mode: 0644]
doc/ikiwiki.mdwn
doc/ikiwiki/directive/calendar.mdwn
doc/ikiwiki/directive/comment.mdwn
doc/ikiwiki/directive/date.mdwn
doc/ikiwiki/directive/edittemplate.mdwn
doc/ikiwiki/directive/format.mdwn
doc/ikiwiki/directive/img.mdwn
doc/ikiwiki/directive/inline/discussion.mdwn
doc/ikiwiki/directive/map/discussion.mdwn
doc/ikiwiki/directive/meta.mdwn
doc/ikiwiki/directive/pagestats.mdwn
doc/ikiwiki/directive/pagestats/discussion.mdwn
doc/ikiwiki/directive/pagetemplate.mdwn
doc/ikiwiki/directive/sidebar.mdwn [new file with mode: 0644]
doc/ikiwiki/directive/table.mdwn
doc/ikiwiki/directive/tag.mdwn
doc/ikiwiki/directive/template.mdwn
doc/ikiwiki/openid.mdwn
doc/ikiwiki/pagespec.mdwn
doc/ikiwiki/pagespec/attachment.mdwn
doc/ikiwiki/pagespec/discussion.mdwn
doc/ikiwiki/pagespec/po.mdwn
doc/ikiwiki/pagespec/sorting.mdwn
doc/ikiwiki/subpage.mdwn
doc/ikiwiki/wikilink.mdwn
doc/ikiwiki/wikilink/discussion.mdwn
doc/ikiwikiusers.mdwn
doc/index.mdwn
doc/news/version_3.20091031.mdwn [deleted file]
doc/news/version_3.20091113.mdwn [deleted file]
doc/news/version_3.20091202.mdwn [deleted file]
doc/news/version_3.20091218.mdwn [deleted file]
doc/news/version_3.20100102.3.mdwn [deleted file]
doc/news/version_3.20100515.mdwn [new file with mode: 0644]
doc/news/version_3.20100518.2.mdwn [new file with mode: 0644]
doc/news/version_3.20100518.mdwn [new file with mode: 0644]
doc/news/version_3.20100610.mdwn [new file with mode: 0644]
doc/news/version_3.20100623.mdwn [new file with mode: 0644]
doc/peteg.mdwn [new file with mode: 0644]
doc/plugins.mdwn
doc/plugins/404.mdwn
doc/plugins/aggregate.mdwn
doc/plugins/autoindex.mdwn
doc/plugins/calendar.mdwn
doc/plugins/calendar/discussion.mdwn
doc/plugins/color.mdwn
doc/plugins/comments.mdwn
doc/plugins/conditional.mdwn
doc/plugins/conditional/discussion.mdwn
doc/plugins/contrib.mdwn
doc/plugins/contrib/album.mdwn
doc/plugins/contrib/album/discussion.mdwn
doc/plugins/contrib/field.mdwn
doc/plugins/contrib/field/discussion.mdwn [new file with mode: 0644]
doc/plugins/contrib/flattr.mdwn [new file with mode: 0644]
doc/plugins/contrib/flattr/discussion.mdwn [new file with mode: 0644]
doc/plugins/contrib/ftemplate.mdwn [new file with mode: 0644]
doc/plugins/contrib/ftemplate/discussion.mdwn [new file with mode: 0644]
doc/plugins/contrib/ftemplate/ikiwiki/directive/ftemplate.mdwn [new file with mode: 0644]
doc/plugins/contrib/getfield.mdwn [new file with mode: 0644]
doc/plugins/contrib/getfield/discussion.mdwn [new file with mode: 0644]
doc/plugins/contrib/highlightcode.mdwn
doc/plugins/contrib/pod/discussion.mdwn [new file with mode: 0644]
doc/plugins/contrib/postal.mdwn
doc/plugins/contrib/report.mdwn [new file with mode: 0644]
doc/plugins/contrib/report/discussion.mdwn [new file with mode: 0644]
doc/plugins/contrib/report/ikiwiki/directive/report.mdwn [new file with mode: 0644]
doc/plugins/contrib/tracking.mdwn [new file with mode: 0644]
doc/plugins/contrib/xslt/discussion.mdwn
doc/plugins/contrib/ymlfront.mdwn [new file with mode: 0644]
doc/plugins/contrib/ymlfront/discussion.mdwn [new file with mode: 0644]
doc/plugins/creole/discussion.mdwn
doc/plugins/cutpaste.mdwn
doc/plugins/date.mdwn
doc/plugins/ddate.mdwn
doc/plugins/discussion.mdwn
doc/plugins/editpage.mdwn
doc/plugins/edittemplate.mdwn
doc/plugins/filecheck.mdwn
doc/plugins/format.mdwn
doc/plugins/fortune.mdwn
doc/plugins/getsource.mdwn
doc/plugins/getsource/discussion.mdwn [new file with mode: 0644]
doc/plugins/goto.mdwn
doc/plugins/graphviz.mdwn
doc/plugins/haiku.mdwn
doc/plugins/httpauth.mdwn
doc/plugins/img.mdwn
doc/plugins/inline.mdwn
doc/plugins/link.mdwn
doc/plugins/linkmap.mdwn
doc/plugins/listdirectives.mdwn
doc/plugins/lockedit.mdwn
doc/plugins/map.mdwn
doc/plugins/map/discussion.mdwn
doc/plugins/mirrorlist.mdwn
doc/plugins/moderatedcomments.mdwn
doc/plugins/more.mdwn
doc/plugins/opendiscussion.mdwn
doc/plugins/openid.mdwn
doc/plugins/orphans.mdwn
doc/plugins/pagecount.mdwn
doc/plugins/pagestats.mdwn
doc/plugins/pagetemplate.mdwn
doc/plugins/parentlinks.mdwn
doc/plugins/po.mdwn
doc/plugins/po/discussion.mdwn
doc/plugins/poll.mdwn
doc/plugins/polygen.mdwn
doc/plugins/postsparkline.mdwn
doc/plugins/prettydate.mdwn
doc/plugins/progress.mdwn
doc/plugins/recentchanges.mdwn
doc/plugins/recentchangesdiff.mdwn
doc/plugins/relativedate.mdwn
doc/plugins/rename.mdwn
doc/plugins/repolist.mdwn
doc/plugins/rsync.mdwn
doc/plugins/shortcut.mdwn
doc/plugins/sidebar.mdwn
doc/plugins/sortnaturally.mdwn [new file with mode: 0644]
doc/plugins/sparkline.mdwn
doc/plugins/table.mdwn
doc/plugins/tag.mdwn
doc/plugins/tag/discussion.mdwn
doc/plugins/template.mdwn
doc/plugins/testpagespec.mdwn
doc/plugins/teximg.mdwn
doc/plugins/theme.mdwn [new file with mode: 0644]
doc/plugins/theme/discussion.mdwn [new file with mode: 0644]
doc/plugins/toc.mdwn
doc/plugins/toggle.mdwn
doc/plugins/txt.mdwn
doc/plugins/type/chrome.mdwn
doc/plugins/type/useful.mdwn [deleted file]
doc/plugins/type/widget.mdwn [new file with mode: 0644]
doc/plugins/typography.mdwn
doc/plugins/underlay.mdwn
doc/plugins/version.mdwn
doc/plugins/websetup.mdwn
doc/plugins/wmd.mdwn
doc/plugins/write.mdwn
doc/rcs.mdwn
doc/rcs/git.mdwn
doc/rcs/svn.mdwn
doc/rcs/tla.mdwn
doc/roadmap.mdwn
doc/roadmap/discussion.mdwn
doc/sandbox.mdwn
doc/sandbox/danc.mdwn [new file with mode: 0644]
doc/sandbox/prova_blog.html [new file with mode: 0644]
doc/sandbox/sidebar.mdwn [new file with mode: 0644]
doc/security.mdwn
doc/setup.mdwn
doc/setup/byhand/discussion.mdwn [new file with mode: 0644]
doc/setup/discussion.mdwn
doc/style.css
doc/templates.mdwn
doc/templates/discussion.mdwn
doc/templates/gitbranch.mdwn
doc/templates/note.mdwn
doc/templates/plugin.mdwn
doc/templates/popup.mdwn
doc/tipjar.mdwn
doc/tips/Importing_posts_from_Wordpress.mdwn
doc/tips/add_chatterbox_to_blog.mdwn
doc/tips/comments_feed.mdwn
doc/tips/convert_mediawiki_to_ikiwiki.mdwn
doc/tips/convert_mediawiki_to_ikiwiki/discussion.mdwn
doc/tips/follow_wikilinks_from_inside_vim.mdwn [new file with mode: 0644]
doc/tips/htaccess_file.mdwn [new file with mode: 0644]
doc/tips/html5.mdwn [new file with mode: 0644]
doc/tips/inside_dot_ikiwiki.mdwn
doc/tips/inside_dot_ikiwiki/discussion.mdwn
doc/tips/laptop_wiki_with_git.mdwn
doc/tips/spam_and_softwaresites.mdwn [new file with mode: 0644]
doc/tips/switching_to_usedirs.mdwn
doc/tips/vim_syntax_highlighting.mdwn
doc/tips/yaml_setup_files.mdwn [new file with mode: 0644]
doc/todo/ACL.mdwn
doc/todo/Add_label_to_search_form_input_field.mdwn
doc/todo/Fix_selflink_in_po_plugin.mdwn
doc/todo/Google_Sitemap_protocol.mdwn
doc/todo/More_flexible_po-plugin_for_translation.mdwn [new file with mode: 0644]
doc/todo/Multiple_categorization_namespaces.mdwn [new file with mode: 0644]
doc/todo/Separate_OpenIDs_and_usernames.mdwn
doc/todo/abbreviation.mdwn
doc/todo/allow_displaying_number_of_comments.mdwn [new file with mode: 0644]
doc/todo/allow_plugins_to_add_sorting_methods.mdwn [new file with mode: 0644]
doc/todo/allow_site-wide_meta_definitions.mdwn
doc/todo/anon_push_of_comments.mdwn [new file with mode: 0644]
doc/todo/auto-create_tag_pages_according_to_a_template.mdwn
doc/todo/auto_getctime_on_fresh_build.mdwn [new file with mode: 0644]
doc/todo/auto_publish_expire.mdwn [new file with mode: 0644]
doc/todo/auto_rebuild_on_template_change.mdwn [new file with mode: 0644]
doc/todo/avatar.mdwn
doc/todo/beef_up_sidebar_to_allow_for_multiple_sidebars.mdwn
doc/todo/cdate_and_mdate_available_for_templates.mdwn [new file with mode: 0644]
doc/todo/comment_moderation_feed.mdwn [new file with mode: 0644]
doc/todo/conflict_free_comment_merges.mdwn
doc/todo/double-click_protection_for_form_buttons.mdwn [new file with mode: 0644]
doc/todo/edittemplate_should_look_in_templates_directory_by_default.mdwn [new file with mode: 0644]
doc/todo/enable-htaccess-files.mdwn
doc/todo/finer_control_over___60__object___47____62__s.mdwn [new file with mode: 0644]
doc/todo/git_attribution/discussion.mdwn
doc/todo/html.mdwn
doc/todo/htpasswd_mirror_of_the_userdb.mdwn [new file with mode: 0644]
doc/todo/http_bl_support.mdwn [new file with mode: 0644]
doc/todo/link_plugin_perhaps_too_general__63__.mdwn [new file with mode: 0644]
doc/todo/mark_edit_as_trivial__44___identify__47__filter_on_trivial_changes.mdwn [new file with mode: 0644]
doc/todo/matching_different_kinds_of_links.mdwn
doc/todo/mercurial.mdwn
doc/todo/more_flexible_inline_postform.mdwn
doc/todo/multiple_template_directories.mdwn
doc/todo/multiple_templates.mdwn
doc/todo/openid_user_filtering.mdwn
doc/todo/optional_underlaydir_prefix.mdwn [new file with mode: 0644]
doc/todo/rewrite_ikiwiki_in_haskell.mdwn
doc/todo/salmon_protocol_for_comment_sharing.mdwn [new file with mode: 0644]
doc/todo/smarter_sorting.mdwn [new file with mode: 0644]
doc/todo/structured_page_data.mdwn
doc/todo/svg.mdwn
doc/todo/tracking_bugs_with_dependencies.mdwn
doc/todo/two-way_convert_of_wikis.mdwn [new file with mode: 0644]
doc/todo/user-defined_templates_outside_the_wiki.mdwn [new file with mode: 0644]
doc/todo/wrapperuser.mdwn [new file with mode: 0644]
doc/usage.mdwn
doc/users/BerndZeimetz.mdwn [new file with mode: 0644]
doc/users/David_Riebenbauer.mdwn
doc/users/Edward_Betts.mdwn
doc/users/KarlMW/discussion.mdwn
doc/users/KathrynAndersen.mdwn
doc/users/KathrynAndersen/discussion.mdwn [new file with mode: 0644]
doc/users/NicolasLimare.mdwn
doc/users/Oblomov.mdwn [new file with mode: 0644]
doc/users/Will.mdwn
doc/users/blipvert.mdwn [new file with mode: 0644]
doc/users/ericdrechsel.mdwn [new file with mode: 0644]
doc/users/ivan_shmakov.mdwn [new file with mode: 0644]
doc/users/jasonblevins.mdwn
doc/users/jaywalk.mdwn [new file with mode: 0644]
doc/users/jeanprivat.mdwn [new file with mode: 0644]
doc/users/jerojasro.mdwn [new file with mode: 0644]
doc/users/jogo.mdwn
doc/users/jon.mdwn
doc/users/nil.mdwn [new file with mode: 0644]
doc/users/schmonz.mdwn
doc/users/simonraven.mdwn
doc/users/svend.mdwn
doc/users/tschwinge.mdwn
doc/users/tupyakov_vladimir.mdwn [new file with mode: 0644]
doc/wikitemplates.mdwn [deleted file]
doc/wikitemplates/discussion.mdwn [deleted file]
docwiki.setup
gitremotes
ikiwiki-calendar.in [moved from ikiwiki-calendar with 77% similarity]
ikiwiki-transition.in [moved from ikiwiki-transition with 99% similarity]
ikiwiki.in
ikiwiki.spec
mdwn2man
plugins/rst
po/bg.po
po/cs.po
po/da.po
po/de.po
po/es.po
po/fr.po
po/gu.po
po/ikiwiki.pot
po/it.po
po/pl.po
po/sv.po
po/tr.po
po/underlay.setup
po/underlays/basewiki/ikiwiki.de.po [new file with mode: 0644]
po/underlays/basewiki/ikiwiki/directive.de.po [new file with mode: 0644]
po/underlays/basewiki/ikiwiki/formatting.de.po [new file with mode: 0644]
po/underlays/basewiki/ikiwiki/markdown.de.po [new file with mode: 0644]
po/underlays/basewiki/ikiwiki/openid.de.po [new file with mode: 0644]
po/underlays/basewiki/ikiwiki/pagespec.de.po [new file with mode: 0644]
po/underlays/basewiki/ikiwiki/pagespec/attachment.de.po [new file with mode: 0644]
po/underlays/basewiki/ikiwiki/pagespec/po.de.po [new file with mode: 0644]
po/underlays/basewiki/ikiwiki/pagespec/sorting.de.po [new file with mode: 0644]
po/underlays/basewiki/ikiwiki/searching.de.po [new file with mode: 0644]
po/underlays/basewiki/ikiwiki/subpage.de.po [new file with mode: 0644]
po/underlays/basewiki/ikiwiki/subpage/linkingrules.de.po [new file with mode: 0644]
po/underlays/basewiki/ikiwiki/wikilink.de.po [new file with mode: 0644]
po/underlays/basewiki/index.de.po [new file with mode: 0644]
po/underlays/basewiki/recentchanges.de.po [new file with mode: 0644]
po/underlays/basewiki/sandbox.de.po [new file with mode: 0644]
po/underlays/basewiki/shortcuts.de.po [new file with mode: 0644]
po/underlays/basewiki/templates.de.po [new file with mode: 0644]
po/underlays/basewiki/templates/note.de.po [new file with mode: 0644]
po/underlays/basewiki/templates/popup.de.po [new file with mode: 0644]
po/underlays/directives/ikiwiki/directive/aggregate.de.po [new file with mode: 0644]
po/underlays/directives/ikiwiki/directive/brokenlinks.de.po [new file with mode: 0644]
po/underlays/directives/ikiwiki/directive/calendar.de.po [new file with mode: 0644]
po/underlays/directives/ikiwiki/directive/color.de.po [new file with mode: 0644]
po/underlays/directives/ikiwiki/directive/comment.de.po [new file with mode: 0644]
po/underlays/directives/ikiwiki/directive/copy.de.po [new file with mode: 0644]
po/underlays/directives/ikiwiki/directive/cut.de.po [new file with mode: 0644]
po/underlays/directives/ikiwiki/directive/cutpaste.de.po [new file with mode: 0644]
po/underlays/directives/ikiwiki/directive/date.de.po [new file with mode: 0644]
po/underlays/directives/ikiwiki/directive/edittemplate.de.po [new file with mode: 0644]
po/underlays/directives/ikiwiki/directive/format.de.po [new file with mode: 0644]
po/underlays/directives/ikiwiki/directive/fortune.de.po [new file with mode: 0644]
po/underlays/directives/ikiwiki/directive/graph.de.po [new file with mode: 0644]
po/underlays/directives/ikiwiki/directive/haiku.de.po [new file with mode: 0644]
po/underlays/directives/ikiwiki/directive/if.de.po [new file with mode: 0644]
po/underlays/directives/ikiwiki/directive/img.de.po [new file with mode: 0644]
po/underlays/directives/ikiwiki/directive/inline.de.po [new file with mode: 0644]
po/underlays/directives/ikiwiki/directive/linkmap.de.po [new file with mode: 0644]
po/underlays/directives/ikiwiki/directive/listdirectives.de.po [new file with mode: 0644]
po/underlays/directives/ikiwiki/directive/map.de.po [new file with mode: 0644]
po/underlays/directives/ikiwiki/directive/meta.de.po [new file with mode: 0644]
po/underlays/directives/ikiwiki/directive/more.de.po [new file with mode: 0644]
po/underlays/directives/ikiwiki/directive/orphans.de.po [new file with mode: 0644]
po/underlays/directives/ikiwiki/directive/pagecount.de.po [new file with mode: 0644]
po/underlays/directives/ikiwiki/directive/pagestats.de.po [new file with mode: 0644]
po/underlays/directives/ikiwiki/directive/pagetemplate.de.po [new file with mode: 0644]
po/underlays/directives/ikiwiki/directive/paste.de.po [new file with mode: 0644]
po/underlays/directives/ikiwiki/directive/ping.de.po [new file with mode: 0644]
po/underlays/directives/ikiwiki/directive/poll.de.po [new file with mode: 0644]
po/underlays/directives/ikiwiki/directive/polygen.de.po [new file with mode: 0644]
po/underlays/directives/ikiwiki/directive/postsparkline.de.po [new file with mode: 0644]
po/underlays/directives/ikiwiki/directive/progress.de.po [new file with mode: 0644]
po/underlays/directives/ikiwiki/directive/shortcut.de.po [new file with mode: 0644]
po/underlays/directives/ikiwiki/directive/sparkline.de.po [new file with mode: 0644]
po/underlays/directives/ikiwiki/directive/table.de.po [new file with mode: 0644]
po/underlays/directives/ikiwiki/directive/tag.de.po [new file with mode: 0644]
po/underlays/directives/ikiwiki/directive/taglink.de.po [new file with mode: 0644]
po/underlays/directives/ikiwiki/directive/template.de.po [new file with mode: 0644]
po/underlays/directives/ikiwiki/directive/testpagespec.de.po [new file with mode: 0644]
po/underlays/directives/ikiwiki/directive/teximg.de.po [new file with mode: 0644]
po/underlays/directives/ikiwiki/directive/toc.de.po [new file with mode: 0644]
po/underlays/directives/ikiwiki/directive/toggle.de.po [new file with mode: 0644]
po/underlays/directives/ikiwiki/directive/toggleable.de.po [new file with mode: 0644]
po/underlays/directives/ikiwiki/directive/version.de.po [new file with mode: 0644]
po/underlays/smiley/smileys.de.po [new file with mode: 0644]
po/vi.po
t/add_depends.t
t/bazaar.t
t/calculate_changed_links.t [new file with mode: 0755]
t/cvs.t
t/file_pruned.t
t/find_src_files.t [new file with mode: 0755]
t/git.t
t/index.t
t/mercurial.t
t/openiduser.t
t/pagespec_match.t
t/pagespec_match_list.t
t/parentlinks.t
t/permalink.t
t/preprocess.t
t/svn.t
t/tag.t [new file with mode: 0755]
t/template_syntax.t [new file with mode: 0755]
t/templates_documented.t [new file with mode: 0755]
templates/aggregatepost.tmpl
templates/archivepage.tmpl
templates/atomitem.tmpl
templates/atompage.tmpl
templates/autotag.tmpl [new file with mode: 0644]
templates/blogpost.tmpl
templates/calendarmonth.tmpl
templates/change.tmpl
templates/comment.tmpl
templates/commentmoderation.tmpl
templates/editcomment.tmpl
templates/editpage.tmpl
templates/feedlink.tmpl
templates/googleform.tmpl
templates/inlinepage.tmpl
templates/microblog.tmpl
templates/misc.tmpl [deleted file]
templates/openid-selector.tmpl [new file with mode: 0644]
templates/page.tmpl
templates/pocreatepage.tmpl
templates/renamesummary.tmpl
templates/rssitem.tmpl
templates/searchform.tmpl
templates/searchquery.tmpl
templates/titlepage.tmpl
themes/actiontabs/style.css [new file with mode: 0644]
themes/blueview/background_darkness.png [new file with mode: 0644]
themes/blueview/header_background.png [new file with mode: 0644]
themes/blueview/style.css [new file with mode: 0644]
underlays/basewiki/ikiwiki/pagespec/sorting.mdwn [changed from file to symlink]
underlays/javascript/ikiwiki/ikiwiki.js [moved from underlays/javascript/ikiwiki.js with 100% similarity]
underlays/javascript/ikiwiki/relativedate.js [moved from underlays/javascript/relativedate.js with 67% similarity]
underlays/javascript/ikiwiki/toggle.js [moved from underlays/javascript/toggle.js with 100% similarity]
underlays/openid-selector/ikiwiki/openid/jquery.js [new file with mode: 0644]
underlays/openid-selector/ikiwiki/openid/openid-jquery.js [new file with mode: 0644]

index 8de36e2c8df25ab30f7fadeffbcdf25f189863f3..e9ab152b6413d20385e317c7020406b01268f607 100644 (file)
@@ -5,9 +5,10 @@ blib/*
 doc/.ikiwiki/*
 html/*
 ikiwiki.out
+ikiwiki-transition.out
+ikiwiki-calendar.out
 pm_to_blib
 *.man
-build-stamp
 po/po2wiki_stamp
 po/underlays/*/*.mdwn
 po/underlays/basewiki/*/*.mdwn
index 769791d305b17ce03f6159a8d3094dbdb026cb80..d6c344d6a0a2b7b6bfacec2abb49edb77a085a09 100644 (file)
@@ -20,7 +20,7 @@ Text::Markdown
 HTML::Scrubber
 HTML::Template
 HTML::Parser
-URI
+URI 1.36
 XML::Simple
 Date::Parse
 CGI::FormBuilder
index 48bd127f1745c72459c213247cde1b3ffa3e4430..5bbd7b8c62f5e05f9e9d5434df95a94c7d1933b8 100644 (file)
@@ -35,6 +35,7 @@ Text::WikiCreole
 Term::ReadLine::Gnu
 HTML::Tree
 Sort::Naturally
+YAML
 
 =head1 AUTHOR
 
index 5d5c7f0d00af7aaab7a294c19bd3e56075f5c0f2..0457a6c611902c2ec3cfc326753596c8ec276f6f 100644 (file)
@@ -5,26 +5,26 @@ package IkiWiki;
 use warnings;
 use strict;
 use Encode;
-use HTML::Entities;
 use URI::Escape q{uri_escape_utf8};
-use POSIX;
+use POSIX ();
 use Storable;
 use open qw{:utf8 :std};
 
 use vars qw{%config %links %oldlinks %pagemtime %pagectime %pagecase
-           %pagestate %wikistate %renderedfiles %oldrenderedfiles
-           %pagesources %destsources %depends %depends_simple %hooks
-           %forcerebuild %loaded_plugins};
+       %pagestate %wikistate %renderedfiles %oldrenderedfiles
+       %pagesources %delpagesources %destsources %depends %depends_simple
+       @mass_depends %hooks %forcerebuild %loaded_plugins %typedlinks
+       %oldtypedlinks %autofiles};
 
 use Exporter q{import};
-our @EXPORT = qw(hook debug error template htmlpage deptype
-                 add_depends pagespec_match pagespec_match_list bestlink
-                htmllink readfile writefile pagetype srcfile pagename
-                displaytime will_render gettext urlto targetpage
-                add_underlay pagetitle titlepage linkpage newpagefile
-                inject add_link
-                 %config %links %pagestate %wikistate %renderedfiles
-                 %pagesources %destsources);
+our @EXPORT = qw(hook debug error htmlpage template template_depends
+       deptype add_depends pagespec_match pagespec_match_list bestlink
+       htmllink readfile writefile pagetype srcfile pagename
+       displaytime will_render gettext ngettext urlto targetpage
+       add_underlay pagetitle titlepage linkpage newpagefile
+       inject add_link add_autofile
+       %config %links %pagestate %wikistate %renderedfiles
+       %pagesources %destsources %typedlinks);
 our $VERSION = 3.00; # plugin interface version, next is ikiwiki version
 our $version='unknown'; # VERSION_AUTOREPLACE done by Makefile, DNE
 our $installdir='/usr'; # INSTALLDIR_AUTOREPLACE done by Makefile, DNE
@@ -37,6 +37,7 @@ our $DEPEND_LINKS=4;
 # Optimisation.
 use Memoize;
 memoize("abs2rel");
+memoize("sortspec_translate");
 memoize("pagespec_translate");
 memoize("template_file");
 
@@ -150,18 +151,11 @@ sub getsetup () {
        templatedir => {
                type => "string",
                default => "$installdir/share/ikiwiki/templates",
-               description => "location of template files",
+               description => "additional directory to search for template files",
                advanced => 1,
                safe => 0, # path
                rebuild => 1,
        },
-       templatedirs => {
-               type => "internal",
-               default => [],
-               description => "additional directories containing template files",
-               safe => 0,
-               rebuild => 0,
-       },
        underlaydir => {
                type => "string",
                default => "$installdir/share/ikiwiki/basewiki",
@@ -240,6 +234,14 @@ sub getsetup () {
                safe => 1,
                rebuild => 1,
        },
+       html5 => {
+               type => "boolean",
+               default => 0,
+               description => "generate HTML5? (experimental)",
+               advanced => 1,
+               safe => 1,
+               rebuild => 1,
+       },
        sslcookie => {
                type => "boolean",
                default => 0,
@@ -334,18 +336,27 @@ sub getsetup () {
                safe => 0, # paranoia
                rebuild => 0,
        },
+       include => {
+               type => "string",
+               default => undef,
+               example => '^\.htaccess$',
+               description => "regexp of normally excluded files to include",
+               advanced => 1,
+               safe => 0, # regexp
+               rebuild => 1,
+       },
        exclude => {
                type => "string",
                default => undef,
-               example => '\.wav$',
-               description => "regexp of source files to ignore",
+               example => '^(*\.private|Makefile)$',
+               description => "regexp of files that should be skipped",
                advanced => 1,
                safe => 0, # regexp
                rebuild => 1,
        },
        wiki_file_prune_regexps => {
                type => "internal",
-               default => [qr/(^|\/)\.\.(\/|$)/, qr/^\./, qr/\/\./,
+               default => [qr/(^|\/)\.\.(\/|$)/, qr/^\//, qr/^\./, qr/\/\./,
                        qr/\.x?html?$/, qr/\.ikiwiki-new$/,
                        qr/(^|\/).svn\//, qr/.arch-ids\//, qr/{arch}\//,
                        qr/(^|\/)_MTN\//, qr/(^|\/)_darcs\//,
@@ -409,6 +420,13 @@ sub getsetup () {
                safe => 0,
                rebuild => 0,
        },
+       clean => {
+               type => "internal",
+               default => 0,
+               description => "running in clean mode",
+               safe => 0,
+               rebuild => 0,
+       },
        refresh => {
                type => "internal",
                default => 0,
@@ -423,10 +441,9 @@ sub getsetup () {
                safe => 0,
                rebuild => 0,
        },
-       getctime => {
+       gettime => {
                type => "internal",
-               default => 0,
-               description => "running in getctime mode",
+               description => "running in gettime mode",
                safe => 0,
                rebuild => 0,
        },
@@ -451,6 +468,13 @@ sub getsetup () {
                safe => 0,
                rebuild => 0,
        },
+       setuptype => {
+               type => "internal",
+               default => "Standard",
+               description => "perl class to use to dump setup file",
+               safe => 0,
+               rebuild => 0,
+       },
        allow_symlinks_before_srcdir => {
                type => "boolean",
                default => 0,
@@ -568,10 +592,11 @@ sub loadplugins () {
        return 1;
 }
 
-sub loadplugin ($) {
+sub loadplugin ($;$) {
        my $plugin=shift;
+       my $force=shift;
 
-       return if grep { $_ eq $plugin} @{$config{disable_plugins}};
+       return if ! $force && grep { $_ eq $plugin} @{$config{disable_plugins}};
 
        foreach my $dir (defined $config{libdir} ? possibly_foolish_untaint($config{libdir}) : undef,
                         "$installdir/lib/ikiwiki") {
@@ -941,7 +966,12 @@ sub linkpage ($) {
 sub cgiurl (@) {
        my %params=@_;
 
-       return $config{cgiurl}."?".
+       my $cgiurl=$config{cgiurl};
+       if (exists $params{cgiurl}) {
+               $cgiurl=$params{cgiurl};
+               delete $params{cgiurl};
+       }
+       return $cgiurl."?".
                join("&amp;", map $_."=".uri_escape_utf8($params{$_}), keys %params);
 }
 
@@ -969,10 +999,18 @@ sub abs2rel ($$) {
        return $ret;
 }
 
-sub displaytime ($;$) {
+sub displaytime ($;$$) {
        # Plugins can override this function to mark up the time to
        # display.
-       return '<span class="date">'.formattime(@_).'</span>';
+       my $time=formattime($_[0], $_[1]);
+       if ($config{html5}) {
+               return '<time datetime="'.date_3339($_[0]).'"'.
+                       ($_[2] ? ' pubdate="pubdate"' : '').
+                       '>'.$time.'</time>';
+       }
+       else {
+               return '<span class="date">'.$time.'</span>';
+       }
 }
 
 sub formattime ($;$) {
@@ -988,6 +1026,16 @@ sub formattime ($;$) {
        return decode_utf8(POSIX::strftime($format, localtime($time)));
 }
 
+sub date_3339 ($) {
+       my $time=shift;
+
+       my $lc_time=POSIX::setlocale(&POSIX::LC_TIME);
+       POSIX::setlocale(&POSIX::LC_TIME, "C");
+       my $ret=POSIX::strftime("%Y-%m-%dT%H:%M:%SZ", gmtime($time));
+       POSIX::setlocale(&POSIX::LC_TIME, $lc_time);
+       return $ret;
+}
+
 sub beautify_urlpath ($) {
        my $url=shift;
 
@@ -1065,14 +1113,16 @@ sub htmllink ($$$;@) {
                $bestlink=htmlpage($bestlink);
 
                if (! $destsources{$bestlink}) {
-                       return $linktext unless length $config{cgiurl};
-                       return "<span class=\"createlink\"><a href=\"".
-                               cgiurl(
-                                       do => "create",
-                                       page => lc($link),
-                                       from => $lpage
-                               ).
-                               "\" rel=\"nofollow\">?</a>$linktext</span>"
+                       my $cgilink = "";
+                       if (length $config{cgiurl}) {
+                               $cgilink = "<a href=\"".
+                                       cgiurl(
+                                               do => "create",
+                                               page => lc($link),
+                                               from => $lpage
+                                       )."\" rel=\"nofollow\">?</a>";
+                       }
+                       return "<span class=\"createlink\">$cgilink$linktext</span>"
                }
        }
        
@@ -1097,6 +1147,11 @@ sub htmllink ($$$;@) {
        return "<a href=\"$bestlink\"@attrs>$linktext</a>";
 }
 
+sub userpage ($) {
+       my $user=shift;
+       return length $config{userdir} ? "$config{userdir}/$user" : $user;
+}
+
 sub openiduser ($) {
        my $user=shift;
 
@@ -1105,11 +1160,10 @@ sub openiduser ($) {
                my $display;
 
                if (Net::OpenID::VerifiedIdentity->can("DisplayOfURL")) {
-                       # this works in at least 2.x
                        $display = Net::OpenID::VerifiedIdentity::DisplayOfURL($user);
                }
                else {
-                       # this only works in 1.x
+                       # backcompat with old version
                        my $oid=Net::OpenID::VerifiedIdentity->new(identity => $user);
                        $display=$oid->display;
                }
@@ -1122,7 +1176,7 @@ sub openiduser ($) {
                # 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'};
@@ -1132,23 +1186,6 @@ sub openiduser ($) {
        return;
 }
 
-sub userlink ($) {
-       my $user=shift;
-
-       my $oiduser=eval { openiduser($user) };
-       if (defined $oiduser) {
-               return "<a href=\"$user\">$oiduser</a>";
-       }
-       else {
-               eval q{use CGI 'escapeHTML'};
-               error($@) if $@;
-
-               return htmllink("", "", escapeHTML(
-                       length $config{userdir} ? $config{userdir}."/".$user : $user
-               ), noimageinline => 1);
-       }
-}
-
 sub htmlize ($$$$) {
        my $page=shift;
        my $destpage=shift;
@@ -1156,7 +1193,7 @@ sub htmlize ($$$$) {
        my $content=shift;
        
        my $oneline = $content !~ /\n/;
-
+       
        if (exists $hooks{htmlize}{$type}) {
                $content=$hooks{htmlize}{$type}{call}->(
                        page => $page,
@@ -1177,10 +1214,9 @@ sub htmlize ($$$$) {
        
        if ($oneline) {
                # hack to get rid of enclosing junk added by markdown
-               # and other htmlizers
+               # and other htmlizers/sanitizers
                $content=~s/^<p>//i;
-               $content=~s/<\/p>$//i;
-               chomp $content;
+               $content=~s/<\/p>\n*$//i;
        }
 
        return $content;
@@ -1235,7 +1271,7 @@ sub preprocess ($$$;$$) {
                                (?:
                                        """(.*?)"""     # 2: triple-quoted value
                                |
-                                       "([^"]+)"       # 3: single-quoted value
+                                       "([^"]*?)"      # 3: single-quoted value
                                |
                                        (\S+)           # 4: unquoted value
                                )
@@ -1321,7 +1357,7 @@ sub preprocess ($$$;$$) {
                                        (?:
                                                """.*?"""       # triple-quoted value
                                                |
-                                               "[^"]+"         # single-quoted value
+                                               "[^"]*?"        # single-quoted value
                                                |
                                                [^"\s\]]+       # unquoted value
                                        )
@@ -1344,7 +1380,7 @@ sub preprocess ($$$;$$) {
                                        (?:
                                                """.*?"""       # triple-quoted value
                                                |
-                                               "[^"]+"         # single-quoted value
+                                               "[^"]*?"        # single-quoted value
                                                |
                                                [^"\s\]]+       # unquoted value
                                        )
@@ -1373,10 +1409,6 @@ sub filter ($$$) {
        return $content;
 }
 
-sub indexlink () {
-       return "<a href=\"$config{url}\">$config{wikiname}</a>";
-}
-
 sub check_canedit ($$$;$) {
        my $page=shift;
        my $q=shift;
@@ -1495,7 +1527,7 @@ sub loadindex () {
        if (! $config{rebuild}) {
                %pagesources=%pagemtime=%oldlinks=%links=%depends=
                %destsources=%renderedfiles=%pagecase=%pagestate=
-               %depends_simple=();
+               %depends_simple=%typedlinks=%oldtypedlinks=();
        }
        my $in;
        if (! open ($in, "<", "$config{wikistatedir}/indexdb")) {
@@ -1504,6 +1536,7 @@ sub loadindex () {
                        open ($in, "<", "$config{wikistatedir}/indexdb") || return;
                }
                else {
+                       $config{gettime}=1; # first build
                        return;
                }
        }
@@ -1527,8 +1560,8 @@ sub loadindex () {
                my $d=$pages->{$src};
                my $page=pagename($src);
                $pagectime{$page}=$d->{ctime};
+               $pagesources{$page}=$src;
                if (! $config{rebuild}) {
-                       $pagesources{$page}=$src;
                        $pagemtime{$page}=$d->{mtime};
                        $renderedfiles{$page}=$d->{dest};
                        if (exists $d->{links} && ref $d->{links}) {
@@ -1561,6 +1594,14 @@ sub loadindex () {
                        if (exists $d->{state}) {
                                $pagestate{$page}=$d->{state};
                        }
+                       if (exists $d->{typedlinks}) {
+                               $typedlinks{$page}=$d->{typedlinks};
+
+                               while (my ($type, $links) = each %{$typedlinks{$page}}) {
+                                       next unless %$links;
+                                       $oldtypedlinks{$page}{$type} = {%$links};
+                               }
+                       }
                }
                $oldrenderedfiles{$page}=[@{$d->{dest}}];
        }
@@ -1609,6 +1650,10 @@ sub saveindex () {
                        $index{page}{$src}{depends_simple} = $depends_simple{$page};
                }
 
+               if (exists $typedlinks{$page} && %{$typedlinks{$page}}) {
+                       $index{page}{$src}{typedlinks} = $typedlinks{$page};
+               }
+
                if (exists $pagestate{$page}) {
                        foreach my $id (@hookids) {
                                foreach my $key (keys %{$pagestate{$page}{$id}}) {
@@ -1636,60 +1681,124 @@ sub saveindex () {
 }
 
 sub template_file ($) {
-       my $template=shift;
+       my $name=shift;
+       
+       my $tpage=($name =~ s/^\///) ? $name : "templates/$name";
+       if ($name !~ /\.tmpl$/ && exists $pagesources{$tpage}) {
+               $tpage=$pagesources{$tpage};
+               $name.=".tmpl";
+       }
 
-       foreach my $dir ($config{templatedir}, @{$config{templatedirs}},
-                        "$installdir/share/ikiwiki/templates") {
-               return "$dir/$template" if -e "$dir/$template";
+       my $template=srcfile($tpage, 1);
+       if (defined $template) {
+               return $template, $tpage, 1 if wantarray;
+               return $template;
+       }
+       else {
+               $name=~s:/::; # avoid path traversal
+               foreach my $dir ($config{templatedir},
+                                "$installdir/share/ikiwiki/templates") {
+                       if (-e "$dir/$name") {
+                               $template="$dir/$name";
+                               last;
+                       }
+               }
+               if (defined $template) {        
+                       return $template, $tpage if wantarray;
+                       return $template;
+               }
        }
+
        return;
 }
 
-sub template_params (@) {
-       my $filename=template_file(shift);
-
-       if (! defined $filename) {
-               return if wantarray;
-               return "";
+sub template_depends ($$;@) {
+       my $name=shift;
+       my $page=shift;
+       
+       my ($filename, $tpage, $untrusted)=template_file($name);
+       if (defined $page && defined $tpage) {
+               add_depends($page, $tpage);
        }
 
-       my @ret=(
+       return unless defined $filename;
+
+       my @opts=(
                filter => sub {
                        my $text_ref = shift;
                        ${$text_ref} = decode_utf8(${$text_ref});
                },
-               filename => $filename,
                loop_context_vars => 1,
                die_on_bad_params => 0,
-               @_
+               filename => $filename,
+               @_,
+               ($untrusted ? (no_includes => 1) : ()),
        );
-       return wantarray ? @ret : {@ret};
+       return @opts if wantarray;
+
+       require HTML::Template;
+       return HTML::Template->new(@opts);
 }
 
 sub template ($;@) {
-       require HTML::Template;
-       return HTML::Template->new(template_params(@_));
+       template_depends(shift, undef, @_);
 }
 
 sub misctemplate ($$;@) {
        my $title=shift;
-       my $pagebody=shift;
+       my $content=shift;
+       my %params=@_;
        
-       my $template=template("misc.tmpl");
+       my $template=template("page.tmpl");
+
+       my $page="";
+       if (exists $params{page}) {
+               $page=delete $params{page};
+       }
+       run_hooks(pagetemplate => sub {
+               shift->(
+                       page => $page,
+                       destpage => $page,
+                       template => $template,
+               );
+       });
+       templateactions($template, "");
+
        $template->param(
+               dynamic => 1,
                title => $title,
-               indexlink => indexlink(),
                wikiname => $config{wikiname},
-               pagebody => $pagebody,
+               content => $content,
                baseurl => baseurl(),
-               @_,
+               html5 => $config{html5},
+               %params,
        );
-       run_hooks(pagetemplate => sub {
-               shift->(page => "", destpage => "", template => $template);
-       });
+       
        return $template->output;
 }
 
+sub templateactions ($$) {
+       my $template=shift;
+       my $page=shift;
+
+       my $have_actions=0;
+       my @actions;
+       run_hooks(pageactions => sub {
+               push @actions, map { { action => $_ } } 
+                       grep { defined } shift->(page => $page);
+       });
+       $template->param(actions => \@actions);
+
+       if ($config{cgiurl} && exists $hooks{auth}) {
+               $template->param(prefsurl => cgiurl(do => "prefs"));
+               $have_actions=1;
+       }
+
+       if ($have_actions || @actions) {
+               $template->param(have_actions => 1);
+       }
+}
+
 sub hook (@) {
        my %param=@_;
        
@@ -1738,11 +1847,11 @@ 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}->(@_);
 }
 
@@ -1770,6 +1879,10 @@ sub rcs_getctime ($) {
        $hooks{rcs}{rcs_getctime}{call}->(@_);
 }
 
+sub rcs_getmtime ($) {
+       $hooks{rcs}{rcs_getmtime}{call}->(@_);
+}
+
 sub rcs_receive () {
        $hooks{rcs}{rcs_receive}{call}->();
 }
@@ -1788,14 +1901,16 @@ sub add_depends ($$;$) {
 
        # Add explicit dependencies for influences.
        my $sub=pagespec_translate($pagespec);
-       return if $@;
+       return unless defined $sub;
        foreach my $p (keys %pagesources) {
                my $r=$sub->($p, location => $page);
                my $i=$r->influences;
+               my $static=$r->influences_static;
                foreach my $k (keys %$i) {
+                       next unless $r || $static || $k eq $page;
                        $depends_simple{$page}{lc $k} |= $i->{$k};
                }
-               last if $r->influences_static;
+               last if $static;
        }
 
        $depends{$page}{$pagespec} |= $deptype;
@@ -1818,44 +1933,56 @@ sub deptype (@) {
        return $deptype;
 }
 
-sub file_pruned ($;$) {
+my $file_prune_regexp;
+sub file_pruned ($) {
        my $file=shift;
-       if (@_) {
-               require File::Spec;
-               $file=File::Spec->canonpath($file);
-               my $base=File::Spec->canonpath(shift);
-               return if $file eq $base;
-               $file =~ s#^\Q$base\E/+##;
+
+       if (defined $config{include} && length $config{include}) {
+               return 0 if $file =~ m/$config{include}/;
        }
 
-       my $regexp='('.join('|', @{$config{wiki_file_prune_regexps}}).')';
-       return $file =~ m/$regexp/;
+       if (! defined $file_prune_regexp) {
+               $file_prune_regexp='('.join('|', @{$config{wiki_file_prune_regexps}}).')';
+               $file_prune_regexp=qr/$file_prune_regexp/;
+       }
+       return $file =~ m/$file_prune_regexp/;
 }
 
 sub define_gettext () {
        # If translation is needed, redefine the gettext function to do it.
        # Otherwise, it becomes a quick no-op.
-       no warnings 'redefine';
+       my $gettext_obj;
+       my $getobj;
        if ((exists $ENV{LANG} && length $ENV{LANG}) ||
            (exists $ENV{LC_ALL} && length $ENV{LC_ALL}) ||
            (exists $ENV{LC_MESSAGES} && length $ENV{LC_MESSAGES})) {
-               *gettext=sub {
-                       my $gettext_obj=eval q{
+               $getobj=sub {
+                       $gettext_obj=eval q{
                                use Locale::gettext q{textdomain};
                                Locale::gettext->domain('ikiwiki')
                        };
-
-                       if ($gettext_obj) {
-                               $gettext_obj->get(shift);
-                       }
-                       else {
-                               return shift;
-                       }
                };
        }
-       else {
-               *gettext=sub { return shift };
-       }
+
+       no warnings 'redefine';
+       *gettext=sub {
+               $getobj->() if $getobj;
+               if ($gettext_obj) {
+                       $gettext_obj->get(shift);
+               }
+               else {
+                       return shift;
+               }
+       };
+       *ngettext=sub {
+               $getobj->() if $getobj;
+               if ($gettext_obj) {
+                       $gettext_obj->nget(@_);
+               }
+               else {
+                       return ($_[2] == 1 ? $_[0] : $_[1])
+               }
+       };
 }
 
 sub gettext {
@@ -1863,6 +1990,11 @@ sub gettext {
        gettext(@_);
 }
 
+sub ngettext {
+       define_gettext();
+       ngettext(@_);
+}
+
 sub yesno ($) {
        my $val=shift;
 
@@ -1894,12 +2026,91 @@ sub inject {
        use warnings;
 }
 
-sub add_link ($$) {
+sub add_link ($$;$) {
        my $page=shift;
        my $link=shift;
+       my $type=shift;
 
        push @{$links{$page}}, $link
                unless grep { $_ eq $link } @{$links{$page}};
+
+       if (defined $type) {
+               $typedlinks{$page}{$type}{$link} = 1;
+       }
+}
+
+sub add_autofile ($$$) {
+       my $file=shift;
+       my $plugin=shift;
+       my $generator=shift;
+       
+       $autofiles{$file}{plugin}=$plugin;
+       $autofiles{$file}{generator}=$generator;
+}
+
+sub sortspec_translate ($$) {
+       my $spec = shift;
+       my $reverse = shift;
+
+       my $code = "";
+       my @data;
+       while ($spec =~ m{
+               \s*
+               (-?)            # group 1: perhaps negated
+               \s*
+               (               # group 2: a word
+                       \w+\([^\)]*\)   # command(params)
+                       |
+                       [^\s]+          # or anything else
+               )
+               \s*
+       }gx) {
+               my $negated = $1;
+               my $word = $2;
+               my $params = undef;
+
+               if ($word =~ m/^(\w+)\((.*)\)$/) {
+                       # command with parameters
+                       $params = $2;
+                       $word = $1;
+               }
+               elsif ($word !~ m/^\w+$/) {
+                       error(sprintf(gettext("invalid sort type %s"), $word));
+               }
+
+               if (length $code) {
+                       $code .= " || ";
+               }
+
+               if ($negated) {
+                       $code .= "-";
+               }
+
+               if (exists $IkiWiki::SortSpec::{"cmp_$word"}) {
+                       if (defined $params) {
+                               push @data, $params;
+                               $code .= "IkiWiki::SortSpec::cmp_$word(\$data[$#data])";
+                       }
+                       else {
+                               $code .= "IkiWiki::SortSpec::cmp_$word(undef)";
+                       }
+               }
+               else {
+                       error(sprintf(gettext("unknown sort type %s"), $word));
+               }
+       }
+
+       if (! length $code) {
+               # undefined sorting method... sort arbitrarily
+               return sub { 0 };
+       }
+
+       if ($reverse) {
+               $code="-($code)";
+       }
+
+       no warnings;
+       return eval 'sub { '.$code.' }';
 }
 
 sub pagespec_translate ($) {
@@ -1969,7 +2180,7 @@ sub pagespec_match ($$;@) {
 
        my $sub=pagespec_translate($spec);
        return IkiWiki::ErrorReason->new("syntax error in pagespec \"$spec\"")
-               if $@ || ! defined $sub;
+               if ! defined $sub;
        return $sub->($page, @params);
 }
 
@@ -1987,7 +2198,9 @@ sub pagespec_match_list ($$;@) {
 
        my $sub=pagespec_translate($pagespec);
        error "syntax error in pagespec \"$pagespec\""
-               if $@ || ! defined $sub;
+               if ! defined $sub;
+       my $sort=sortspec_translate($params{sort}, $params{reverse})
+               if defined $params{sort};
 
        my @candidates;
        if (exists $params{list}) {
@@ -2000,39 +2213,19 @@ sub pagespec_match_list ($$;@) {
                        ? grep { ! $params{filter}->($_) } keys %pagesources
                        : keys %pagesources;
        }
-
-       if (defined $params{sort}) {
-               my $f;
-               if ($params{sort} eq 'title') {
-                       $f=sub { pagetitle(basename($a)) cmp pagetitle(basename($b)) };
-               }
-               elsif ($params{sort} eq 'title_natural') {
-                       eval q{use Sort::Naturally};
-                       if ($@) {
-                               error(gettext("Sort::Naturally needed for title_natural sort"));
-                       }
-                       $f=sub { Sort::Naturally::ncmp(pagetitle(basename($a)), pagetitle(basename($b))) };
-                }
-               elsif ($params{sort} eq 'mtime') {
-                       $f=sub { $pagemtime{$b} <=> $pagemtime{$a} };
-               }
-               elsif ($params{sort} eq 'age') {
-                       $f=sub { $pagectime{$b} <=> $pagectime{$a} };
-               }
-               else {
-                       error sprintf(gettext("unknown sort type %s"), $params{sort});
-               }
-               @candidates = sort { &$f } @candidates;
-       }
-
-       @candidates=reverse(@candidates) if $params{reverse};
-       
-       $depends{$page}{$pagespec} |= ($params{deptype} || $DEPEND_CONTENT);
        
        # clear params, remainder is passed to pagespec
+       $depends{$page}{$pagespec} |= ($params{deptype} || $DEPEND_CONTENT);
        my $num=$params{num};
        delete @params{qw{num deptype reverse sort filter list}};
        
+       # when only the top matches will be returned, it's efficient to
+       # sort before matching to pagespec,
+       if (defined $num && defined $sort) {
+               @candidates=IkiWiki::SortSpec::sort_pages(
+                       $sort, @candidates);
+       }
+       
        my @matches;
        my $firstfail;
        my $count=0;
@@ -2041,6 +2234,9 @@ sub pagespec_match_list ($$;@) {
                my $r=$sub->($p, %params, location => $page);
                error(sprintf(gettext("cannot match pages: %s"), $r))
                        if $r->isa("IkiWiki::ErrorReason");
+               unless ($r || $r->influences_static) {
+                       $r->remove_influence($p);
+               }
                $accum |= $r;
                if ($r) {
                        push @matches, $p;
@@ -2054,14 +2250,21 @@ sub pagespec_match_list ($$;@) {
                $depends_simple{$page}{lc $k} |= $i->{$k};
        }
 
-       return @matches;
+       # when all matches will be returned, it's efficient to
+       # sort after matching
+       if (! defined $num && defined $sort) {
+               return IkiWiki::SortSpec::sort_pages(
+                       $sort, @matches);
+       }
+       else {
+               return @matches;
+       }
 }
 
 sub pagespec_valid ($) {
        my $spec=shift;
 
-       my $sub=pagespec_translate($spec);
-       return ! $@;
+       return defined pagespec_translate($spec);
 }
 
 sub glob2re ($) {
@@ -2119,7 +2322,7 @@ sub merge_influences {
        my $anded=shift;
 
        if (! $anded || (($this || %{$this->[1]}) &&
-                       ($other || %{$other->[1]}))) {
+                        ($other || %{$other->[1]}))) {
                foreach my $influence (keys %{$other->[1]}) {
                        $this->[1]{$influence} |= $other->[1]{$influence};
                }
@@ -2130,6 +2333,13 @@ sub merge_influences {
        }
 }
 
+sub remove_influence {
+       my $this=shift;
+       my $torm=shift;
+
+       delete $this->[1]{$torm};
+}
+
 package IkiWiki::ErrorReason;
 
 our @ISA = 'IkiWiki::FailReason';
@@ -2143,7 +2353,7 @@ sub derel ($$) {
        if ($path =~ m!^\./!) {
                $from=~s#/?[^/]+$## if defined $from;
                $path=~s#^\./##;
-               $path="$from/$path" if length $from;
+               $path="$from/$path" if defined $from && length $from;
        }
 
        return $path;
@@ -2171,7 +2381,19 @@ sub match_glob ($$;@) {
 }
 
 sub match_internal ($$;@) {
-       return match_glob($_[0], $_[1], @_, internal => 1)
+       return match_glob(shift, shift, @_, internal => 1)
+}
+
+sub match_page ($$;@) {
+       my $page=shift;
+       my $match=match_glob($page, shift, @_);
+       if ($match && ! (exists $IkiWiki::pagesources{$page}
+           && defined IkiWiki::pagetype($IkiWiki::pagesources{$page}))) {
+               return IkiWiki::FailReason->new("$page is not a page");
+       }
+       else {
+               return $match;
+       }
 }
 
 sub match_link ($$;@) {
@@ -2181,26 +2403,36 @@ sub match_link ($$;@) {
 
        $link=derel($link, $params{location});
        my $from=exists $params{location} ? $params{location} : '';
+       my $linktype=$params{linktype};
+       my $qualifier='';
+       if (defined $linktype) {
+               $qualifier=" with type $linktype";
+       }
 
        my $links = $IkiWiki::links{$page};
-       return IkiWiki::FailReason->new("$page has no links", "" => 1)
+       return IkiWiki::FailReason->new("$page has no links", $page => $IkiWiki::DEPEND_LINKS, "" => 1)
                unless $links && @{$links};
        my $bestlink = IkiWiki::bestlink($from, $link);
        foreach my $p (@{$links}) {
+               next unless (! defined $linktype || exists $IkiWiki::typedlinks{$page}{$linktype}{$p});
+
                if (length $bestlink) {
-                       return IkiWiki::SuccessReason->new("$page links to $link", $page => $IkiWiki::DEPEND_LINKS, "" => 1)
-                               if $bestlink eq IkiWiki::bestlink($page, $p);
+                       if ($bestlink eq IkiWiki::bestlink($page, $p)) {
+                               return IkiWiki::SuccessReason->new("$page links to $link$qualifier", $page => $IkiWiki::DEPEND_LINKS, "" => 1)
+                       }
                }
                else {
-                       return IkiWiki::SuccessReason->new("$page links to page $p matching $link", $page => $IkiWiki::DEPEND_LINKS, "" => 1)
-                               if match_glob($p, $link, %params);
+                       if (match_glob($p, $link, %params)) {
+                               return IkiWiki::SuccessReason->new("$page links to page $p$qualifier, matching $link", $page => $IkiWiki::DEPEND_LINKS, "" => 1)
+                       }
                        my ($p_rel)=$p=~/^\/?(.*)/;
                        $link=~s/^\///;
-                       return IkiWiki::SuccessReason->new("$page links to page $p_rel matching $link", $page => $IkiWiki::DEPEND_LINKS, "" => 1)
-                               if match_glob($p_rel, $link, %params);
+                       if (match_glob($p_rel, $link, %params)) {
+                               return IkiWiki::SuccessReason->new("$page links to page $p_rel$qualifier, matching $link", $page => $IkiWiki::DEPEND_LINKS, "" => 1)
+                       }
                }
        }
-       return IkiWiki::FailReason->new("$page does not link to $link", "" => 1);
+       return IkiWiki::FailReason->new("$page does not link to $link$qualifier", $page => $IkiWiki::DEPEND_LINKS, "" => 1);
 }
 
 sub match_backlink ($$;@) {
@@ -2250,7 +2482,7 @@ sub match_created_after ($$;@) {
 }
 
 sub match_creation_day ($$;@) {
-       if ((gmtime($IkiWiki::pagectime{shift()}))[3] == shift) {
+       if ((localtime($IkiWiki::pagectime{shift()}))[3] == shift) {
                return IkiWiki::SuccessReason->new('creation_day matched');
        }
        else {
@@ -2259,7 +2491,7 @@ sub match_creation_day ($$;@) {
 }
 
 sub match_creation_month ($$;@) {
-       if ((gmtime($IkiWiki::pagectime{shift()}))[4] + 1 == shift) {
+       if ((localtime($IkiWiki::pagectime{shift()}))[4] + 1 == shift) {
                return IkiWiki::SuccessReason->new('creation_month matched');
        }
        else {
@@ -2268,7 +2500,7 @@ sub match_creation_month ($$;@) {
 }
 
 sub match_creation_year ($$;@) {
-       if ((gmtime($IkiWiki::pagectime{shift()}))[5] + 1900 == shift) {
+       if ((localtime($IkiWiki::pagectime{shift()}))[5] + 1900 == shift) {
                return IkiWiki::SuccessReason->new('creation_year matched');
        }
        else {
@@ -2281,11 +2513,13 @@ sub match_user ($$;@) {
        my $user=shift;
        my %params=@_;
        
+       my $regexp=IkiWiki::glob2re($user);
+       
        if (! exists $params{user}) {
                return IkiWiki::ErrorReason->new("no user specified");
        }
 
-       if (defined $params{user} && lc $params{user} eq lc $user) {
+       if (defined $params{user} && $params{user}=~/^$regexp$/i) {
                return IkiWiki::SuccessReason->new("user is $user");
        }
        elsif (! defined $params{user}) {
@@ -2333,4 +2567,22 @@ sub match_ip ($$;@) {
        }
 }
 
+package IkiWiki::SortSpec;
+
+# This is in the SortSpec namespace so that the $a and $b that sort() uses
+# are easily available in this namespace, for cmp functions to use them.
+sub sort_pages {
+       my $f=shift;
+       sort $f @_
+}
+
+sub cmp_title {
+       IkiWiki::pagetitle(IkiWiki::basename($a))
+       cmp
+       IkiWiki::pagetitle(IkiWiki::basename($b))
+}
+
+sub cmp_mtime { $IkiWiki::pagemtime{$b} <=> $IkiWiki::pagemtime{$a} }
+sub cmp_age { $IkiWiki::pagectime{$b} <=> $IkiWiki::pagectime{$a} }
+
 1
index 866711a719478cd7bde8a0fb8ecdfc44e8678ef9..f2a32a9581077553d5b542fde40f428c15a5e41a 100644 (file)
@@ -15,13 +15,14 @@ sub printheader ($) {
        if ($config{sslcookie}) {
                print $session->header(-charset => 'utf-8',
                        -cookie => $session->cookie(-httponly => 1, -secure => 1));
-       } else {
+       }
+       else {
                print $session->header(-charset => 'utf-8',
                        -cookie => $session->cookie(-httponly => 1));
        }
 }
 
-sub showform ($$$$;@) {
+sub prepform {
        my $form=shift;
        my $buttons=shift;
        my $session=shift;
@@ -34,6 +35,16 @@ sub showform ($$$$;@) {
                });
        }
 
+       return $form;
+}
+
+sub showform ($$$$;@) {
+       my $form=prepform(@_);
+       shift;
+       my $buttons=shift;
+       my $session=shift;
+       my $cgi=shift;
+
        printheader($session);
        print misctemplate($form->title, $form->render(submit => $buttons), @_);
 }
@@ -52,7 +63,7 @@ sub redirect ($$) {
 }
 
 sub decode_cgi_utf8 ($) {
-       # decode_form_utf8 method is needed for 5.10
+       # decode_form_utf8 method is needed for 5.01
        if ($] < 5.01) {
                my $cgi = shift;
                foreach my $f ($cgi->param) {
@@ -65,8 +76,9 @@ sub decode_form_utf8 ($) {
        if ($] >= 5.01) {
                my $form = shift;
                foreach my $f ($form->field) {
+                       my @value=map { decode_utf8($_) } $form->field($f);
                        $form->field(name  => $f,
-                                    value => decode_utf8($form->field($f)),
+                                    value => \@value,
                                     force => 1,
                        );
                }
@@ -88,9 +100,10 @@ sub needsignin ($$) {
        }
 }
 
-sub cgi_signin ($$) {
+sub cgi_signin ($$;$) {
        my $q=shift;
        my $session=shift;
+       my $returnhtml=shift;
 
        decode_cgi_utf8($q);
        eval q{use CGI::FormBuilder};
@@ -106,13 +119,10 @@ sub cgi_signin ($$) {
                action => $config{cgiurl},
                header => 0,
                template => {type => 'div'},
-               stylesheet => baseurl()."style.css",
+               stylesheet => 1,
        );
        my $buttons=["Login"];
        
-       if ($q->param("do") ne "signin" && !$form->submitted) {
-               $form->text(gettext("You need to log in first."));
-       }
        $form->field(name => "do", type => "hidden", value => "signin",
                force => 1);
        
@@ -127,6 +137,11 @@ sub cgi_signin ($$) {
                $form->validate;
        }
 
+       if ($returnhtml) {
+               $form=prepform($form, $buttons, $session, $q);
+               return $form->render(submit => $buttons);
+       }
+
        showform($form, $buttons, $session, $q);
 }
 
@@ -185,7 +200,7 @@ sub cgi_prefs ($$) {
                params => $q,
                action => $config{cgiurl},
                template => {type => 'div'},
-               stylesheet => baseurl()."style.css",
+               stylesheet => 1,
                fieldsets => [
                        [login => gettext("Login")],
                        [preferences => gettext("Preferences")],
@@ -232,7 +247,9 @@ sub cgi_prefs ($$) {
                $form->text(gettext("Preferences saved."));
        }
        
-       showform($form, $buttons, $session, $q);
+       showform($form, $buttons, $session, $q,
+               prefsurl => "", # avoid showing the preferences link
+       );
 }
 
 sub cgi_custom_failure ($$$) {
@@ -266,7 +283,7 @@ sub check_banned ($$) {
 
        foreach my $b (@{$config{banned_users}}) {
                if (pagespec_match("", $b,
-                       ip => $ENV{REMOTE_ADDR},
+                       ip => $session->remote_addr(),
                        name => defined $name ? $name : "",
                )) {
                        $banned=1;
index 85486e559b0cdfa907d3000ed8f64a3a281d2d69..8adfd5dd99668c526168b09ba4f0fc334873d578 100644 (file)
@@ -21,6 +21,7 @@ sub getsetup () {
                        # server admin action too
                        safe => 0,
                        rebuild => 0,
+                       section => "web",
                }
 }
 
index 3571c4189e43fe5b70e1032832a6978cded1af6b..cfd8cd3477f81dd0758564994f35979419e330a0 100644 (file)
@@ -132,6 +132,10 @@ sub getbucket {
                });
        }
 
+       if (! $bucket) {
+               # Try to use existing bucket.
+               $bucket=$s3->bucket($config{amazon_s3_bucket});
+       }
        if (! $bucket) {
                error(gettext("Failed to create S3 bucket: ").
                        $s3->err.": ".$s3->errstr."\n");
@@ -178,7 +182,7 @@ sub writefile ($$$;$$) {
 
        # First, write the file to disk.
        my $ret=$IkiWiki::Plugin::amazon_s3::subs{'IkiWiki::writefile'}->($file, $destdir, $content, $binary, $writer);
-               
+
        my @keys=IkiWiki::Plugin::amazon_s3::file2keys("$destdir/$file");
 
        # Store the data in S3.
index 243b9892056028ea3cd289257c70274a54a410f6..0e74cbfadfbe71986ae2755b98d979cd3d00cb9b 100644 (file)
@@ -15,6 +15,7 @@ sub getsetup () {
                plugin => {
                        safe => 1,
                        rebuild => 0,
+                       section => "auth",
                },
                anonok_pagespec => {
                        type => "pagespec",
index cbe6efc216c07de84ff547c7edbc296a76c1d146..ee105a1709f3fe71e0e44a47782e9596791dbbf9 100644 (file)
@@ -19,6 +19,7 @@ sub getsetup () {
                plugin => {
                        safe => 1,
                        rebuild => 0,
+                       section => "web",
                },
                allowed_attachments => {
                        type => "pagespec",
@@ -57,7 +58,7 @@ sub check_canattach ($$;$) {
                        $config{allowed_attachments},
                        file => $file,
                        user => $session->param("name"),
-                       ip => $ENV{REMOTE_ADDR},
+                       ip => $session->remote_addr(),
                );
        }
 
@@ -133,10 +134,13 @@ sub formbuilder (@) {
                        }
                }
 
+               $filename=IkiWiki::basename($filename);
+               $filename=~s/.*\\+(.+)/$1/; # hello, windows
+
                $filename=linkpage(IkiWiki::possibly_foolish_untaint(
                                attachment_location($form->field('page')).
-                               IkiWiki::basename($filename)));
-               if (IkiWiki::file_pruned($filename, $config{srcdir})) {
+                               $filename));
+               if (IkiWiki::file_pruned($filename)) {
                        error(gettext("bad attachment filename"));
                }
                
@@ -179,9 +183,12 @@ sub formbuilder (@) {
                if ($config{rcs}) {
                        IkiWiki::rcs_add($filename);
                        IkiWiki::disable_commit_hook();
-                       IkiWiki::rcs_commit($filename, gettext("attachment upload"),
-                               IkiWiki::rcs_prepedit($filename),
-                               $session->param("name"), $ENV{REMOTE_ADDR});
+                       IkiWiki::rcs_commit(
+                               file => $filename,
+                               message => gettext("attachment upload"),
+                               token => IkiWiki::rcs_prepedit($filename),
+                               session => $session,
+                       );
                        IkiWiki::enable_commit_hook();
                        IkiWiki::rcs_update();
                }
@@ -194,7 +201,14 @@ sub formbuilder (@) {
                foreach my $f ($q->param("attachment_select")) {
                        $f=Encode::decode_utf8($f);
                        $f=~s/^$page\///;
-                       $add.="[[$f]]\n";
+                       if (IkiWiki::isinlinableimage($f) &&
+                           UNIVERSAL::can("IkiWiki::Plugin::img", "import")) {
+                               $add.='[[!img '.$f.' align="right" size="" alt=""]]';
+                       }
+                       else {
+                               $add.="[[$f]]";
+                       }
+                       $add.="\n";
                }
                $form->field(name => 'editcontent',
                        value => $form->field('editcontent')."\n\n".$add,
@@ -224,8 +238,7 @@ sub attachment_list ($) {
        my @ret;
        foreach my $f (values %pagesources) {
                if (! defined pagetype($f) &&
-                   $f=~m/^\Q$loc\E[^\/]+$/ &&
-                   -e "$config{srcdir}/$f") {
+                   $f=~m/^\Q$loc\E[^\/]+$/) {
                        push @ret, {
                                "field-select" => '<input type="checkbox" name="attachment_select" value="'.$f.'" />',
                                link => htmllink($page, $page, $f, noimageinline => 1),
index 555856b1189fe4508ac25997cad15669fb28ceea..11595e217cdccf6d7bb571a3bb9f6c79ef4ddd7f 100644 (file)
@@ -33,21 +33,26 @@ sub genindex ($) {
 sub refresh () {
        eval q{use File::Find};
        error($@) if $@;
+       eval q{use Cwd};
+       error($@) if $@;
+       my $origdir=getcwd();
 
        my (%pages, %dirs);
        foreach my $dir ($config{srcdir}, @{$config{underlaydirs}}, $config{underlaydir}) {
+               chdir($dir) || next;
+
                find({
                        no_chdir => 1,
                        wanted => sub {
-                               $_=decode_utf8($_);
-                               if (IkiWiki::file_pruned($_, $dir)) {
+                               my $file=decode_utf8($_);
+                               $file=~s/^\.\/?//;
+                               return unless length $file;
+                               if (IkiWiki::file_pruned($file)) {
                                        $File::Find::prune=1;
                                }
                                elsif (! -l $_) {
-                                       my ($f)=/$config{wiki_file_regexp}/; # untaint
+                                       my ($f) = $file =~ /$config{wiki_file_regexp}/; # untaint
                                        return unless defined $f;
-                                       $f=~s/^\Q$dir\E\/?//;
-                                       return unless length $f;
                                        return if $f =~ /\._([^.]+)$/; # skip internal page
                                        if (! -d _) {
                                                $pages{pagename($f)}=1;
@@ -57,12 +62,22 @@ sub refresh () {
                                        }
                                }
                        }
-               }, $dir);
+               }, '.');
+
+               chdir($origdir) || die "chdir $origdir: $!";
        }
        
        my %deleted;
-        if (ref $pagestate{index}{autoindex}{deleted}) {
-              %deleted=%{$pagestate{index}{autoindex}{deleted}};
+       if (ref $wikistate{autoindex}{deleted}) {
+               %deleted=%{$wikistate{autoindex}{deleted}};
+       }
+        elsif (ref $pagestate{index}{autoindex}{deleted}) {
+               # compatability code
+               %deleted=%{$pagestate{index}{autoindex}{deleted}};
+               delete $pagestate{index}{autoindex};
+       }
+
+       if (keys %deleted) {
                foreach my $dir (keys %deleted) {
                        # remove deleted page state if the deleted page is re-added,
                        # or if all its subpages are deleted
@@ -71,7 +86,7 @@ sub refresh () {
                                delete $deleted{$dir};
                        }
                }
-               $pagestate{index}{autoindex}{deleted}=\%deleted;
+               $wikistate{autoindex}{deleted}=\%deleted;
        }
 
        my @needed;
@@ -82,10 +97,10 @@ sub refresh () {
                                # This page must have just been deleted, so
                                # don't re-add it. And remember it was
                                # deleted.
-                               if (! ref $pagestate{index}{autoindex}{deleted}) {
-                                       $pagestate{index}{autoindex}{deleted}={};
+                               if (! ref $wikistate{autoindex}{deleted}) {
+                                       $wikistate{autoindex}{deleted}={};
                                }
-                               ${$pagestate{index}{autoindex}{deleted}}{$dir}=1;
+                               ${$wikistate{autoindex}{deleted}}{$dir}=1;
                        }
                        else {
                                push @needed, $dir;
@@ -102,8 +117,8 @@ sub refresh () {
                }
                if ($config{rcs}) {
                        IkiWiki::rcs_commit_staged(
-                               gettext("automatic index generation"),
-                               undef, undef);
+                               message => gettext("automatic index generation"),
+                       );
                        IkiWiki::enable_commit_hook();
                }
        }
index 626c8ec42acc8f69297d416ef358e66702a153b3..8db3780e8888ee9c9188881e80ae26b6715436ff 100644 (file)
@@ -18,6 +18,7 @@ sub getsetup () {
                plugin => {
                        safe => 1,
                        rebuild => 0,
+                       section => "auth",
                },
                blogspam_pagespec => {
                        type => 'pagespec',
@@ -57,6 +58,7 @@ sub checkconfig () {
 
 sub checkcontent (@) {
        my %params=@_;
+       my $session=$params{session};
        
        if (exists $config{blogspam_pagespec}) {
                return undef
@@ -87,7 +89,7 @@ sub checkcontent (@) {
        push @options, "exclude=stopwords";
 
        my %req=(
-               ip => $ENV{REMOTE_ADDR},
+               ip => $session->remote_addr(),
                comment => defined $params{diff} ? $params{diff} : $params{content},
                subject => defined $params{subject} ? $params{subject} : "",
                name => defined $params{author} ? $params{author} : "",
index 8830073672663b77d2e21fb837a15a913b7b6c0d..562d5d3893fcf5c2c0c6ba0b82e574c362f36891 100644 (file)
@@ -20,6 +20,7 @@ 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);
+       hook(type => "rcs", id => "rcs_getmtime", call => \&rcs_getmtime);
 }
 
 sub checkconfig () {
@@ -36,6 +37,7 @@ sub getsetup () {
                plugin => {
                        safe => 0, # rcs plugin
                        rebuild => undef,
+                       section => "rcs",
                },
                bzr_wrapper => {
                        type => "string",
@@ -72,31 +74,40 @@ sub bzr_log ($) {
        my @infos = ();
        my $key = undef;
 
+       my %info;
        while (<$out>) {
                my $line = $_;
                my ($value);
                if ($line =~ /^message:/) {
                        $key = "message";
-                       $infos[$#infos]{$key} = "";
+                       $info{$key} = "";
                }
                elsif ($line =~ /^(modified|added|renamed|renamed and modified|removed):/) {
                        $key = "files";
-                       unless (defined($infos[$#infos]{$key})) { $infos[$#infos]{$key} = ""; }
+                       $info{$key} = "" unless defined $info{$key};
                }
                elsif (defined($key) and $line =~ /^  (.*)/) {
-                       $infos[$#infos]{$key} .= "$1\n";
+                       $info{$key} .= "$1\n";
                }
                elsif ($line eq "------------------------------------------------------------\n") {
+                       push @infos, {%info} if keys %info;
+                       %info = ();
                        $key = undef;
-                       push (@infos, {});
                }
-               else {
+               elsif ($line =~ /: /) {
                        chomp $line;
+                       if ($line =~ /^revno: (\d+)/) {
+                           $key = "revno";
+                           $value = $1;
+                       }
+                       else {
                                ($key, $value) = split /: +/, $line, 2;
-                       $infos[$#infos]{$key} = $value;
-               } 
+                       }
+                       $info{$key} = $value;
+               }
        }
        close $out;
+       push @infos, {%info} if keys %info;
 
        return @infos;
 }
@@ -112,8 +123,13 @@ sub rcs_prepedit ($) {
        return "";
 }
 
-sub bzr_author ($$) {
-       my ($user, $ipaddr) = @_;
+sub bzr_author ($) {
+       my $session=shift;
+
+       return unless defined $session;
+
+       my $user=$session->param("name");
+       my $ipaddr=$session->remote_addr();
 
        if (defined $user) {
                return IkiWiki::possibly_foolish_untaint($user);
@@ -126,18 +142,19 @@ sub bzr_author ($$) {
        }
 }
 
-sub rcs_commit ($$$;$$) {
-       my ($file, $message, $rcstoken, $user, $ipaddr) = @_;
+sub rcs_commit (@) {
+       my %params=@_;
 
-       $user = bzr_author($user, $ipaddr);
+       my $user=bzr_author($params{session});
 
-       $message = IkiWiki::possibly_foolish_untaint($message);
-       if (! length $message) {
-               $message = "no message given";
+       $params{message} = IkiWiki::possibly_foolish_untaint($params{message});
+       if (! length $params{message}) {
+               $params{message} = "no message given";
        }
 
-       my @cmdline = ("bzr", "commit", "--quiet", "-m", $message, "--author", $user,
-                      $config{srcdir}."/".$file);
+       my @cmdline = ("bzr", "commit", "--quiet", "-m", $params{message},
+                      (defined $user ? ("--author", $user) : ()),
+                      $config{srcdir}."/".$params{file});
        if (system(@cmdline) != 0) {
                warn "'@cmdline' failed: $!";
        }
@@ -145,19 +162,18 @@ sub rcs_commit ($$$;$$) {
        return undef; # success
 }
 
-sub rcs_commit_staged ($$$) {
-       # Commits all staged changes. Changes can be staged using rcs_add,
-       # rcs_remove, and rcs_rename.
-       my ($message, $user, $ipaddr)=@_;
+sub rcs_commit_staged (@) {
+       my %params=@_;
 
-       $user = bzr_author($user, $ipaddr);
+       my $user=bzr_author($params{session});
 
-       $message = IkiWiki::possibly_foolish_untaint($message);
-       if (! length $message) {
-               $message = "no message given";
+       $params{message} = IkiWiki::possibly_foolish_untaint($params{message});
+       if (! length $params{message}) {
+               $params{message} = "no message given";
        }
 
-       my @cmdline = ("bzr", "commit", "--quiet", "-m", $message, "--author", $user,
+       my @cmdline = ("bzr", "commit", "--quiet", "-m", $params{message},
+                      (defined $user ? ("--author", $user) : ()),
                       $config{srcdir});
        if (system(@cmdline) != 0) {
                warn "'@cmdline' failed: $!";
@@ -212,7 +228,7 @@ sub rcs_recentchanges ($) {
        foreach my $info (bzr_log($out)) {
                my @pages = ();
                my @message = ();
-        
+
                foreach my $msgline (split(/\n/, $info->{message})) {
                        push @message, { line => $msgline };
                }
@@ -275,14 +291,8 @@ sub rcs_diff ($) {
        }
 }
 
-sub rcs_getctime ($) {
-       my ($file) = @_;
-
-       # XXX filename passes through the shell here, should try to avoid
-       # that just in case
-       my @cmdline = ("bzr", "log", "--limit", '1', "$config{srcdir}/$file");
-       open (my $out, "@cmdline |");
-
+sub extract_timestamp (@) {
+       open (my $out, "-|", @_);
        my @log = bzr_log($out);
 
        if (length @log < 1) {
@@ -292,8 +302,22 @@ sub rcs_getctime ($) {
        eval q{use Date::Parse};
        error($@) if $@;
        
-       my $ctime = str2time($log[0]->{"timestamp"});
-       return $ctime;
+       my $time = str2time($log[0]->{"timestamp"});
+       return $time;
+}
+
+sub rcs_getctime ($) {
+       my ($file) = @_;
+
+       my @cmdline = ("bzr", "log", "--forward", "--limit", '1', "$config{srcdir}/$file");
+       return extract_timestamp(@cmdline);
+}
+
+sub rcs_getmtime ($) {
+       my ($file) = @_;
+
+       my @cmdline = ("bzr", "log", "--limit", '1', "$config{srcdir}/$file");
+       return extract_timestamp(@cmdline);
 }
 
 1
index 2b87451ce2fc304e300fa62b98276c5bc9dd8b2c..bb995d49956e27234e5bb9b621c2caa641b93d40 100644 (file)
@@ -22,7 +22,7 @@ use warnings;
 use strict;
 use IkiWiki 3.00;
 use Time::Local;
-use POSIX;
+use POSIX ();
 
 my $time=time;
 my @now=localtime($time);
@@ -38,6 +38,7 @@ sub getsetup () {
                plugin => {
                        safe => 1,
                        rebuild => undef,
+                       section => "widget",
                },
                archivebase => {
                        type => "string",
@@ -46,6 +47,14 @@ sub getsetup () {
                        safe => 1,
                        rebuild => 1,
                },
+               archive_pagespec => {
+                       type => "pagespec",
+                       example => "page(posts/*) and !*/Discussion",
+                       description => "PageSpec of pages to include in the archives; used by ikiwiki-calendar command",
+                       link => 'ikiwiki/PageSpec',
+                       safe => 1,
+                       rebuild => 0,
+               },
 }
 
 sub is_leap_year (@) {
@@ -114,6 +123,7 @@ sub format_month (@) {
        }
 
        # Find out month names for this, next, and previous months
+       my $monthabbrev=POSIX::strftime("%b", @monthstart);
        my $monthname=POSIX::strftime("%B", @monthstart);
        my $pmonthname=POSIX::strftime("%B", localtime(timelocal(0,0,0,1,$pmonth-1,$pyear-1900)));
        my $nmonthname=POSIX::strftime("%B", localtime(timelocal(0,0,0,1,$nmonth-1,$nyear-1900)));
@@ -123,12 +133,12 @@ sub format_month (@) {
        $archivebase = $params{archivebase} if defined $params{archivebase};
   
        # Calculate URL's for monthly archives.
-       my ($url, $purl, $nurl)=("$monthname",'','');
+       my ($url, $purl, $nurl)=("$monthname $params{year}",'','');
        if (exists $pagesources{"$archivebase/$params{year}/$params{month}"}) {
                $url = htmllink($params{page}, $params{destpage}, 
                        "$archivebase/$params{year}/".$params{month},
                        noimageinline => 1,
-                       linktext => $monthname,
+                       linktext => "$monthabbrev $params{year}",
                        title => $monthname);
        }
        add_depends($params{page}, "$archivebase/$params{year}/$params{month}",
@@ -155,11 +165,11 @@ sub format_month (@) {
        # Start producing the month calendar
        $calendar=<<EOF;
 <table class="month-calendar">
-       <caption class="month-calendar-head">
-       $purl
-       $url
-       $nurl
-       </caption>
+       <tr>
+       <th class="month-calendar-arrow">$purl</th>
+       <th class="month-calendar-head" colspan="5">$url</th>
+       <th class="month-calendar-arrow">$nurl</th>
+       </tr>
        <tr>
 EOF
 
@@ -173,7 +183,7 @@ EOF
        for my $dow ($week_start_day..$week_start_day+6) {
                my @day=localtime(timelocal(0,0,0,$start_day++,$params{month}-1,$params{year}-1900));
                my $downame = POSIX::strftime("%A", @day);
-               my $dowabbr = POSIX::strftime("%a", @day);
+               my $dowabbr = substr($downame, 0, 1);
                $downame{$dow % 7}=$downame;
                $dowabbr{$dow % 7}=$dowabbr;
                $calendar.= qq{\t\t<th class="month-calendar-day-head $downame" title="$downame">$dowabbr</th>\n};
@@ -303,13 +313,14 @@ sub format_year (@) {
        add_depends($params{page}, "$archivebase/$nyear", deptype("presence"));
 
        # Start producing the year calendar
+       my $m=$params{months_per_row}-2;
        $calendar=<<EOF;
 <table class="year-calendar">
-       <caption class="year-calendar-head">
-       $purl
-       $url
-       $nurl
-       </caption>
+       <tr>
+       <th class="year-calendar-arrow">$purl</th>
+       <th class="year-calendar-head" colspan="$m">$url</th>
+       <th class="year-calendar-arrow">$nurl</th>
+       </tr>
        <tr>
                <th class="year-calendar-subhead" colspan="$params{months_per_row}">Months</th>
        </tr>
@@ -363,6 +374,16 @@ EOF
        return $calendar;
 }
 
+sub setnextchange ($$) {
+       my $page=shift;
+       my $timestamp=shift;
+
+       if (! exists $pagestate{$page}{calendar}{nextchange} ||
+           $pagestate{$page}{calendar}{nextchange} > $timestamp) {
+               $pagestate{$page}{calendar}{nextchange}=$timestamp;
+       }
+}
+
 sub preprocess (@) {
        my %params=@_;
 
@@ -376,39 +397,64 @@ sub preprocess (@) {
        $params{year}  = $thisyear      unless defined $params{year};
        $params{month} = $thismonth     unless defined $params{month};
 
+       my $relativeyear=0;
+       if ($params{year} < 1) {
+               $relativeyear=1;
+               $params{year}=$thisyear+$params{year};
+       }
+       my $relativemonth=0;
+       if ($params{month} < 1) {
+               $relativemonth=1;
+               my $monthoff=$params{month};
+               $params{month}=($thismonth+$monthoff) % 12;
+               $params{month}=12 if $params{month}==0;
+               my $yearoff=POSIX::ceil(($thismonth-$params{month}) / -12)
+                       - int($monthoff / 12);
+               $params{year}-=$yearoff;
+       }
+       
        $params{month} = sprintf("%02d", $params{month});
-                       
+       
        if ($params{type} eq 'month' && $params{year} == $thisyear
            && $params{month} == $thismonth) {
                # calendar for current month, updates next midnight
-               $pagestate{$params{destpage}}{calendar}{nextchange}=($time
+               setnextchange($params{destpage}, ($time
                        + (60 - $now[0])                # seconds
                        + (59 - $now[1]) * 60           # minutes
                        + (23 - $now[2]) * 60 * 60      # hours
-               );
+               ));
        }
        elsif ($params{type} eq 'month' &&
               (($params{year} == $thisyear && $params{month} > $thismonth) ||
                $params{year} > $thisyear)) {
                # calendar for upcoming month, updates 1st of that month
-               $pagestate{$params{destpage}}{calendar}{nextchange}=
-                       timelocal(0, 0, 0, 1, $params{month}-1, $params{year});
+               setnextchange($params{destpage},
+                       timelocal(0, 0, 0, 1, $params{month}-1, $params{year}));
        }
-       elsif ($params{type} eq 'year' && $params{year} == $thisyear) {
-               # calendar for current year, updates 1st of next month
+       elsif (($params{type} eq 'year' && $params{year} == $thisyear) ||
+              $relativemonth) {
+               # Calendar for current year updates 1st of next month.
+               # Any calendar relative to the current month also updates
+               # then.
                if ($thismonth < 12) {
-                       $pagestate{$params{destpage}}{calendar}{nextchange}=
-                               timelocal(0, 0, 0, 1, $thismonth+1-1, $params{year});
+                       setnextchange($params{destpage},
+                               timelocal(0, 0, 0, 1, $thismonth+1-1, $params{year}));
                }
                else {
-                       $pagestate{$params{destpage}}{calendar}{nextchange}=
-                               timelocal(0, 0, 0, 1, 1-1, $params{year}+1);
+                       setnextchange($params{destpage},
+                               timelocal(0, 0, 0, 1, 1-1, $params{year}+1));
                }
        }
+       elsif ($relativeyear) {
+               # Any calendar relative to the current year updates 1st
+               # of next year.
+               setnextchange($params{destpage},
+                       timelocal(0, 0, 0, 1, 1-1, $thisyear+1));
+       }
        elsif ($params{type} eq 'year' && $params{year} > $thisyear) {
                # calendar for upcoming year, updates 1st of that year
-               $pagestate{$params{destpage}}{calendar}{nextchange}=
-                       timelocal(0, 0, 0, 1, 1-1, $params{year});
+               setnextchange($params{destpage},
+                       timelocal(0, 0, 0, 1, 1-1, $params{year}));
        }
        else {
                # calendar for past month or year, does not need
@@ -416,7 +462,6 @@ sub preprocess (@) {
                delete $pagestate{$params{destpage}}{calendar};
        }
 
-       # Calculate month names for next month, and previous months
        my $calendar="";
        if ($params{type} eq 'month') {
                $calendar=format_month(%params);
index 20505893b5885847370a99c84c900d6032d72ef9..d550dd9f4b42ba7759b44b9571f0bc959e026423 100644 (file)
@@ -10,6 +10,16 @@ use IkiWiki 3.00;
 sub import {
        hook(type => "preprocess", id => "color", call => \&preprocess);
        hook(type => "format",     id => "color", call => \&format);
+       hook(type => "getsetup",   id => "color", call => \&getsetup);
+}
+
+sub getsetup () {
+       return
+               plugin => {
+                       safe => 1,
+                       rebuild => undef,
+                       section => "widget",
+               },
 }
 
 sub preserve_style ($$$) {
index 5586cca522e5cb2e43422d99c267235197985c5d..d34951570da77d1f9a423b874d362bd1b800aec8 100644 (file)
@@ -26,8 +26,11 @@ sub import {
        hook(type => "preprocess", id => '_comment', call => \&preprocess);
        hook(type => "sessioncgi", id => 'comment', call => \&sessioncgi);
        hook(type => "htmlize", id => "_comment", call => \&htmlize);
+       hook(type => "htmlize", id => "_comment_pending",
+               call => \&htmlize_pending);
        hook(type => "pagetemplate", id => "comments", call => \&pagetemplate);
-       hook(type => "formbuilder_setup", id => "comments", call => \&formbuilder_setup);
+       hook(type => "formbuilder_setup", id => "comments",
+               call => \&formbuilder_setup);
        # Load goto to fix up user page links for logged-in commenters
        IkiWiki::loadplugin("goto");
        IkiWiki::loadplugin("inline");
@@ -38,6 +41,7 @@ sub getsetup () {
                plugin => {
                        safe => 1,
                        rebuild => 1,
+                       section => "web",
                },
                comments_pagespec => {
                        type => 'pagespec',
@@ -103,6 +107,14 @@ sub htmlize {
        return $params{content};
 }
 
+sub htmlize_pending {
+       my %params = @_;
+       return sprintf(gettext("this comment needs %s"),
+               '<a href="'.
+               IkiWiki::cgiurl(do => "commentmoderation").'">'.
+               gettext("moderation").'</a>');
+}
+
 # FIXME: copied verbatim from meta
 sub safeurl ($) {
        my $url=shift;
@@ -165,15 +177,14 @@ sub preprocess {
                if (defined $oiduser) {
                        # looks like an OpenID
                        $commentauthorurl = $commentuser;
-                       $commentauthor = $oiduser;
+                       $commentauthor = (defined $params{nickname} && length $params{nickname}) ? $params{nickname} : $oiduser;
                        $commentopenid = $commentuser;
                }
                else {
                        $commentauthorurl = IkiWiki::cgiurl(
                                do => 'goto',
-                               page => (length $config{userdir}
-                                       ? "$config{userdir}/$commentuser"
-                                       : "$commentuser"));
+                               page => IkiWiki::userpage($commentuser)
+                       );
 
                        $commentauthor = $commentuser;
                }
@@ -221,7 +232,9 @@ sub preprocess {
        }
 
        if (defined $params{subject}) {
-               $pagestate{$page}{meta}{title} = $params{subject};
+               # decode title the same way meta does
+               eval q{use HTML::Entities};
+               $pagestate{$page}{meta}{title} = decode_entities($params{subject});
        }
 
        if ($params{page} =~ m/\/\Q$config{comments_pagename}\E\d+_/) {
@@ -249,6 +262,10 @@ sub sessioncgi ($$) {
        elsif ($do eq 'commentmoderation') {
                commentmoderation($cgi, $session);
        }
+       elsif ($do eq 'commentsignin') {
+               IkiWiki::cgi_signin($cgi, $session);
+               exit;
+       }
 }
 
 # Mostly cargo-culted from IkiWiki::plugin::editpage
@@ -272,7 +289,7 @@ sub editcomment ($$) {
                action => $config{cgiurl},
                header => 0,
                table => 0,
-               template => scalar IkiWiki::template_params('editcomment.tmpl'),
+               template => { template('editcomment.tmpl') },
        );
 
        IkiWiki::decode_form_utf8($form);
@@ -326,7 +343,7 @@ sub editcomment ($$) {
 
        if (! defined $session->param('name')) {
                # Make signinurl work and return here.
-               $form->tmpl_param(signinurl => IkiWiki::cgiurl(do => 'signin'));
+               $form->tmpl_param(signinurl => IkiWiki::cgiurl(do => 'commentsignin'));
                $session->param(postsignin => $ENV{QUERY_STRING});
                IkiWiki::cgi_savesession($session);
        }
@@ -336,7 +353,7 @@ sub editcomment ($$) {
        my $page = $form->field('page');
        $page = IkiWiki::possibly_foolish_untaint($page);
        if (! defined $page || ! length $page ||
-               IkiWiki::file_pruned($page, $config{srcdir})) {
+               IkiWiki::file_pruned($page)) {
                error(gettext("bad page name"));
        }
 
@@ -379,14 +396,18 @@ sub editcomment ($$) {
 
        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 (defined $session->param('nickname')) {
+               my $nickname = $session->param('nickname');
+               $nickname =~ s/"/&quot;/g;
+               $content .= " nickname=\"$nickname\"\n";
+       }
+       elsif (defined $session->remote_addr()) {
+               my $ip = $session->remote_addr();
                if ($ip =~ m/^([.0-9]+)$/) {
                        $content .= " ip=\"$1\"\n";
                }
@@ -416,7 +437,8 @@ sub editcomment ($$) {
 
        $content .= " date=\"" . decode_utf8(strftime('%Y-%m-%dT%H:%M:%SZ', gmtime)) . "\"\n";
 
-       my $editcontent = $form->field('editcontent') || '';
+       my $editcontent = $form->field('editcontent');
+       $editcontent="" if ! defined $editcontent;
        $editcontent =~ s/\r\n/\n/g;
        $editcontent =~ s/\r/\n/g;
        $editcontent =~ s/"/\\"/g;
@@ -460,9 +482,15 @@ sub editcomment ($$) {
                $postcomment=0;
 
                if (! $ok) {
-                       my $penddir=$config{wikistatedir}."/comments_pending";
-                       $location=unique_comment_location($page, $content, $penddir);
-                       writefile("$location._comment", $penddir, $content);
+                       $location=unique_comment_location($page, $content, $config{srcdir}, "._comment_pending");
+                       writefile("$location._comment_pending", $config{srcdir}, $content);
+
+                       # Refresh so anything that deals with pending
+                       # comments can be updated.
+                       require IkiWiki::Render;
+                       IkiWiki::refresh();
+                       IkiWiki::saveindex();
+
                        IkiWiki::printheader($session);
                        print IkiWiki::misctemplate(gettext(gettext("comment stored for moderation")),
                                "<p>".
@@ -489,8 +517,10 @@ sub editcomment ($$) {
 
                        IkiWiki::rcs_add($file);
                        IkiWiki::disable_commit_hook();
-                       $conflict = IkiWiki::rcs_commit_staged($message,
-                               $session->param('name'), $ENV{REMOTE_ADDR});
+                       $conflict = IkiWiki::rcs_commit_staged(
+                               message => $message,
+                               session => $session,
+                       );
                        IkiWiki::enable_commit_hook();
                        IkiWiki::rcs_update();
                }
@@ -513,7 +543,7 @@ sub editcomment ($$) {
        }
        else {
                IkiWiki::showform ($form, \@buttons, $session, $cgi,
-                       forcebaseurl => $baseurl);
+                       forcebaseurl => $baseurl, page => $page);
        }
 
        exit;
@@ -538,21 +568,24 @@ sub commentmoderation ($$) {
                my %vars=$cgi->Vars;
                my $added=0;
                foreach my $id (keys %vars) {
-                       if ($id =~ /(.*)\Q._comment\E$/) {
+                       if ($id =~ /(.*)\._comment(?:_pending)?$/) {
                                my $action=$cgi->param($id);
                                next if $action eq 'Defer' && ! $rejectalldefer;
 
                                # Make sure that the id is of a legal
-                               # pending comment before untainting.
-                               my ($f)= $id =~ /$config{wiki_file_regexp}/;
+                               # pending comment.
+                               my ($f) = $id =~ /$config{wiki_file_regexp}/;
                                if (! defined $f || ! length $f ||
-                                   IkiWiki::file_pruned($f, $config{srcdir})) {
+                                   IkiWiki::file_pruned($f)) {
                                        error("illegal file");
                                }
 
-                               my $page=IkiWiki::possibly_foolish_untaint(IkiWiki::dirname($1));
-                               my $file="$config{wikistatedir}/comments_pending/".
-                                       IkiWiki::possibly_foolish_untaint($id);
+                               my $page=IkiWiki::dirname($f);
+                               my $file="$config{srcdir}/$f";
+                               if (! -e $file) {
+                                       # old location
+                                       $file="$config{wikistatedir}/comments_pending/".$f;
+                               }
 
                                if ($action eq 'Accept') {
                                        my $content=eval { readfile($file) };
@@ -565,9 +598,6 @@ sub commentmoderation ($$) {
                                        $added++;
                                }
 
-                               # This removes empty subdirs, so the
-                               # .ikiwiki/comments_pending dir will
-                               # go away when all are moderated.
                                require IkiWiki::Render;
                                IkiWiki::prune($file);
                        }
@@ -578,8 +608,10 @@ sub commentmoderation ($$) {
                        if ($config{rcs} and $config{comments_commit}) {
                                my $message = gettext("Comment moderation");
                                IkiWiki::disable_commit_hook();
-                               $conflict=IkiWiki::rcs_commit_staged($message,
-                                       $session->param('name'), $ENV{REMOTE_ADDR});
+                               $conflict=IkiWiki::rcs_commit_staged(
+                                       message => $message,
+                                       session => $session,
+                               );
                                IkiWiki::enable_commit_hook();
                                IkiWiki::rcs_update();
                        }
@@ -594,16 +626,15 @@ sub commentmoderation ($$) {
        }
 
        my @comments=map {
-               my ($id, $ctime)=@{$_};
-               my $file="$config{wikistatedir}/comments_pending/$id";
-               my $content=readfile($file);
+               my ($id, $dir, $ctime)=@{$_};
+               my $content=readfile("$dir/$id");
                my $preview=previewcomment($content, $id,
-                       IkiWiki::dirname($_), $ctime);
+                       $id, $ctime);
                {
                        id => $id,
                        view => $preview,
-               } 
-       } sort { $b->[1] <=> $a->[1] } comments_pending();
+               }
+       } sort { $b->[2] <=> $a->[2] } comments_pending();
 
        my $template=template("commentmoderation.tmpl");
        $template->param(
@@ -633,30 +664,43 @@ sub formbuilder_setup (@) {
 }
 
 sub comments_pending () {
-       my $dir="$config{wikistatedir}/comments_pending/";
-       return unless -d $dir;
-
        my @ret;
+
        eval q{use File::Find};
        error($@) if $@;
-       find({
-               no_chdir => 1,
-               wanted => sub {
-                       $_=decode_utf8($_);
-                       if (IkiWiki::file_pruned($_, $dir)) {
-                               $File::Find::prune=1;
-                       }
-                       elsif (! -l $_ && ! -d _) {
-                               $File::Find::prune=0;
-                               my ($f)=/$config{wiki_file_regexp}/; # untaint
-                               if (defined $f && $f =~ /\Q._comment\E$/) {
-                                       my $ctime=(stat($f))[10];
-                                       $f=~s/^\Q$dir\E\/?//;
-                                        push @ret, [$f, $ctime];
+       eval q{use Cwd};
+       error($@) if $@;
+       my $origdir=getcwd();
+
+       my $find_comments=sub {
+               my $dir=shift;
+               my $extension=shift;
+               return unless -d $dir;
+
+               chdir($dir) || die "chdir $dir: $!";
+
+               find({
+                       no_chdir => 1,
+                       wanted => sub {
+                               my $file=decode_utf8($_);
+                               $file=~s/^\.\///;
+                               return if ! length $file || IkiWiki::file_pruned($file)
+                                       || -l $_ || -d _ || $file !~ /\Q$extension\E$/;
+                               my ($f) = $file =~ /$config{wiki_file_regexp}/; # untaint
+                               if (defined $f) {
+                                       my $ctime=(stat($_))[10];
+                                       push @ret, [$f, $dir, $ctime];
                                }
                        }
-               }
-       }, $dir);
+               }, ".");
+
+               chdir($origdir) || die "chdir $origdir: $!";
+       };
+       
+       $find_comments->($config{srcdir}, "._comment_pending");
+       # old location
+       $find_comments->("$config{wikistatedir}/comments_pending/",
+               "._comment");
 
        return @ret;
 }
@@ -674,7 +718,8 @@ sub previewcomment ($$$) {
 
        my $template = template("comment.tmpl");
        $template->param(content => $preview);
-       $template->param(ctime => displaytime($time));
+       $template->param(ctime => displaytime($time, undef, 1));
+       $template->param(html5 => $config{html5});
 
        IkiWiki::run_hooks(pagetemplate => sub {
                shift->(page => $location,
@@ -690,7 +735,7 @@ sub previewcomment ($$$) {
 sub commentsshown ($) {
        my $page=shift;
 
-       return ! pagespec_match($page, "internal(*/$config{comments_pagename}*)",
+       return ! pagespec_match($page, "comment(*)",
                                location => $page) &&
               pagespec_match($page, $config{comments_pagespec},
                              location => $page);
@@ -720,7 +765,7 @@ sub pagetemplate (@) {
                my $comments = undef;
                if ($shown) {
                        $comments = IkiWiki::preprocess_inline(
-                               pages => "internal($page/$config{comments_pagename}*)",
+                               pages => "comment($page)",
                                template => 'comment',
                                show => 0,
                                reverse => 'yes',
@@ -736,39 +781,43 @@ sub pagetemplate (@) {
                }
 
                if ($shown && commentsopen($page)) {
-                       my $addcommenturl = IkiWiki::cgiurl(do => 'comment',
-                               page => $page);
-                       $template->param(addcommenturl => $addcommenturl);
+                       $template->param(addcommenturl => addcommenturl($page));
                }
        }
 
-       if ($template->query(name => 'commentsurl')) {
-               if ($shown) {
+       if ($shown) {
+               if ($template->query(name => 'commentsurl')) {
                        $template->param(commentsurl =>
                                urlto($page, undef, 1).'#comments');
                }
-       }
 
-       if ($template->query(name => 'atomcommentsurl') && $config{usedirs}) {
-               if ($shown) {
+               if ($template->query(name => 'atomcommentsurl') && $config{usedirs}) {
                        # 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"),
+               if ($template->query(name => 'commentslink')) {
+                       my $num=num_comments($page, $config{srcdir});
+                       my $link;
+                       if ($num > 0) {
+                               $link = htmllink($page, $params{destpage}, $page,
+                                       linktext => sprintf(ngettext("%i comment", "%i comments", $num), $num),
                                        anchor => "comments",
-                                       noimageinline => 1));
+                                       noimageinline => 1
+                               );
+                       }
+                       elsif (commentsopen($page)) {
+                               $link = "<a href=\"".addcommenturl($page)."\">".
+                                       #translators: Here "Comment" is a verb;
+                                       #translators: the user clicks on it to
+                                       #translators: post a comment.
+                                       gettext("Comment").
+                                       "</a>";
+                       }
+                       $template->param(commentslink => $link)
+                               if defined $link;
                }
        }
 
@@ -816,43 +865,48 @@ sub pagetemplate (@) {
        }
 }
 
+sub addcommenturl ($) {
+       my $page=shift;
+
+       return IkiWiki::cgiurl(do => 'comment', page => $page);
+}
+
 sub num_comments ($$) {
        my $page=shift;
        my $dir=shift;
 
        my @comments=glob("$dir/$page/$config{comments_pagename}*._comment");
-       return @comments;
+       return int @comments;
 }
 
-sub unique_comment_location ($$$) {
+sub unique_comment_location ($$$$) {
        my $page=shift;
-
        eval q{use Digest::MD5 'md5_hex'};
        error($@) if $@;
-       my $content_md5=md5_hex(shift);
-
+       my $content_md5=md5_hex(Encode::encode_utf8(shift));
        my $dir=shift;
+       my $ext=shift || "._comment";
 
        my $location;
        my $i = num_comments($page, $dir);
        do {
                $i++;
                $location = "$page/$config{comments_pagename}${i}_${content_md5}";
-       } while (-e "$dir/$location._comment");
+       } while (-e "$dir/$location$ext");
 
        return $location;
 }
 
 sub page_to_id ($) {
        # Converts a comment page name into a unique, legal html id
-       # addtibute value, that can be used as an anchor to link to the
+       # attribute value, that can be used as an anchor to link to the
        # comment.
        my $page=shift;
 
        eval q{use Digest::MD5 'md5_hex'};
        error($@) if $@;
 
-       return "comment-".md5_hex($page);
+       return "comment-".md5_hex(Encode::encode_utf8(($page)));
 }
        
 package IkiWiki::PageSpec;
@@ -864,7 +918,39 @@ sub match_postcomment ($$;@) {
        if (! $postcomment) {
                return IkiWiki::FailReason->new("not posting a comment");
        }
-       return match_glob($page, $glob);
+       return match_glob($page, $glob, @_);
+}
+
+sub match_comment ($$;@) {
+       my $page = shift;
+       my $glob = shift;
+
+       # To see if it's a comment, check the source file type.
+       # Deal with comments that were just deleted.
+       my $source=exists $IkiWiki::pagesources{$page} ?
+               $IkiWiki::pagesources{$page} :
+               $IkiWiki::delpagesources{$page};
+       my $type=defined $source ? IkiWiki::pagetype($source) : undef;
+       if (! defined $type || $type ne "_comment") {
+               return IkiWiki::FailReason->new("$page is not a comment");
+       }
+
+       return match_glob($page, "$glob/*", internal => 1, @_);
+}
+
+sub match_comment_pending ($$;@) {
+       my $page = shift;
+       my $glob = shift;
+       
+       my $source=exists $IkiWiki::pagesources{$page} ?
+               $IkiWiki::pagesources{$page} :
+               $IkiWiki::delpagesources{$page};
+       my $type=defined $source ? IkiWiki::pagetype($source) : undef;
+       if (! defined $type || $type ne "_comment_pending") {
+               return IkiWiki::FailReason->new("$page is not a pending comment");
+       }
+
+       return match_glob($page, "$glob/*", internal => 1, @_);
 }
 
 1
index aad617812fc69229aa9ffa6979570d078f090023..8a57961491942438864c87a6ff1662b7d60a6439 100644 (file)
@@ -16,6 +16,7 @@ sub getsetup {
                plugin => {
                        safe => 1,
                        rebuild => undef,
+                       section => "widget",
                },
 }
 
@@ -29,7 +30,7 @@ sub preprocess_if (@) {
        }
 
        my $result=0;
-       if (! IkiWiki::yesno($params{all}) ||
+       if ((exists $params{all} && ! IkiWiki::yesno($params{all})) ||
            # An optimisation to avoid needless looping over every page
            # for simple uses of some of the tests.
            $params{test} =~ /^([\s\!()]*((enabled|sourcepage|destpage|included)\([^)]*\)|(and|or))[\s\!()]*)+$/) {
index 425e71043f0133f5b855c32932bc114542c83d7d..a1e4b31d326c7d5d9f2480be501a09c1f43e0bbb 100644 (file)
@@ -17,6 +17,7 @@ sub getsetup {
                plugin => {
                        safe => 1,
                        rebuild => 1, # format plugin
+                       section => "format",
                },
 }
 
index 417442f34e51d3e089186cd9f6839c001efb3bee..01e9ce043c90f2eb059f7abc6eb8093de717fb18 100644 (file)
@@ -19,6 +19,7 @@ sub getsetup () {
                plugin => {
                        safe => 1,
                        rebuild => undef,
+                       section => "widget",
                },
 }
 
index f6db8bc98b0f723feb40363eb7978ffc469c9ab9..4972efb5838724bf58bf722b96b591b34c9b6a28 100644 (file)
@@ -49,6 +49,7 @@ 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);
+       hook(type => "rcs", id => "rcs_getmtime", call => \&rcs_getmtime);
 }
 
 sub genwrapper () {
@@ -85,6 +86,7 @@ sub getsetup () {
                plugin => {
                        safe => 0, # rcs plugin
                        rebuild => undef,
+                       section => "rcs",
                },
                cvsrepo => {
                        type => "string",
@@ -181,40 +183,47 @@ sub rcs_prepedit ($) {
        return defined $rev ? $rev : "";
 }
 
-sub rcs_commit ($$$;$$) {
+sub commitmessage (@) {
+       my %params=@_;
+       
+       if (defined $params{session}) {
+               if (defined $params{session}->param("name")) {
+                       return "web commit by ".
+                               $params{session}->param("name").
+                               (length $params{message} ? ": $params{message}" : "");
+               }
+               elsif (defined $params{session}->remote_addr()) {
+                       return "web commit from ".
+                               $params{session}->remote_addr().
+                               (length $params{message} ? ": $params{message}" : "");
+               }
+       }
+       return $params{message};
+}
+
+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.
-       my $file=shift;
-       my $message=shift;
-       my $rcstoken=shift;
-       my $user=shift;
-       my $ipaddr=shift;
+       my %params=@_;
 
        return unless cvs_is_controlling;
 
-       if (defined $user) {
-               $message="web commit by $user".(length $message ? ": $message" : "");
-       }
-       elsif (defined $ipaddr) {
-               $message="web commit from $ipaddr".(length $message ? ": $message" : "");
-       }
-
        # Check to see if the page has been changed by someone
        # else since rcs_prepedit was called.
-       my ($oldrev)=$rcstoken=~/^([0-9]+)$/; # untaint
-       my $rev=cvs_info("Repository revision", "$config{srcdir}/$file");
+       my ($oldrev)=$params{token}=~/^([0-9]+)$/; # untaint
+       my $rev=cvs_info("Repository revision", "$config{srcdir}/$params{file}");
        if (defined $rev && defined $oldrev && $rev != $oldrev) {
                # Merge their changes into the file that we've
                # changed.
-               cvs_runcvs('update', $file) ||
+               cvs_runcvs('update', $params{file}) ||
                        warn("cvs merge from $oldrev to $rev failed\n");
        }
 
        if (! cvs_runcvs('commit', '-m',
-                        IkiWiki::possibly_foolish_untaint $message)) {
-               my $conflict=readfile("$config{srcdir}/$file");
-               cvs_runcvs('update', '-C', $file) ||
+                        IkiWiki::possibly_foolish_untaint(commitmessage(%params)))) {
+               my $conflict=readfile("$config{srcdir}/$params{file}");
+               cvs_runcvs('update', '-C', $params{file}) ||
                        warn("cvs revert failed\n");
                return $conflict;
        }
@@ -222,20 +231,13 @@ sub rcs_commit ($$$;$$) {
        return undef # success
 }
 
-sub rcs_commit_staged ($$$) {
+sub rcs_commit_staged (@) {
        # Commits all staged changes. Changes can be staged using rcs_add,
        # rcs_remove, and rcs_rename.
-       my ($message, $user, $ipaddr)=@_;
-
-       if (defined $user) {
-               $message="web commit by $user".(length $message ? ": $message" : "");
-       }
-       elsif (defined $ipaddr) {
-               $message="web commit from $ipaddr".(length $message ? ": $message" : "");
-       }
+       my %params=@_;
 
        if (! cvs_runcvs('commit', '-m',
-                        IkiWiki::possibly_foolish_untaint $message)) {
+                        IkiWiki::possibly_foolish_untaint(commitmessage(%params)))) {
                warn "cvs staged commit failed\n";
                return 1; # failure
        }
@@ -303,7 +305,7 @@ sub rcs_rename ($$) {
        rcs_remove($src);
 }
 
-sub rcs_recentchanges($) {
+sub rcs_recentchanges ($) {
        my $num = shift;
        my @ret;
 
@@ -459,6 +461,8 @@ sub rcs_diff ($) {
 sub rcs_getctime ($) {
        my $file=shift;
 
+       local $CWD = $config{srcdir};
+
        my $cvs_log_infoline=qr/^date: (.+);\s+author/;
 
        open CVSLOG, "cvs -Q log -r1.1 '$file' |"
@@ -484,4 +488,8 @@ sub rcs_getctime ($) {
        return $date;
 }
 
+sub rcs_getmtime ($) {
+       error "rcs_getmtime is not implemented for cvs\n"; # TODO
+}
+
 1
index 0d68f27e5874b3331cbab851b1dafdfa06d21673..0f63b8807902fbd0d3f2478b1a2c66cbf6066e24 100644 (file)
@@ -18,6 +18,7 @@ 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);
+       hook(type => "rcs", id => "rcs_getmtime", call => \&rcs_getmtime);
 }
 
 sub silentsystem (@) {
@@ -51,7 +52,7 @@ sub darcs_info ($$$) {
        return $_;
 }
 
-sub file_in_vc($$) {
+sub file_in_vc ($$) {
        my $repodir = shift;
        my $file = shift;
 
@@ -62,14 +63,14 @@ sub file_in_vc($$) {
        }
        my $found=0;
        while (<DARCS_MANIFEST>) {
-               $found = 1, last if /^(\.\/)?$file$/;
+               $found = 1 if /^(\.\/)?$file$/;
        }
        close(DARCS_MANIFEST) or error("'darcs query manifest' exited " . $?);
 
        return $found;
 }
 
-sub darcs_rev($) {
+sub darcs_rev ($) {
        my $file = shift; # Relative to the repodir.
        my $repodir = $config{srcdir};
 
@@ -78,7 +79,7 @@ sub darcs_rev($) {
        return defined $hash ? $hash : "";
 }
 
-sub checkconfig() {
+sub checkconfig () {
        if (defined $config{darcs_wrapper} && length $config{darcs_wrapper}) {
                push @{$config{wrappers}}, {
                        wrapper => $config{darcs_wrapper},
@@ -87,11 +88,12 @@ sub checkconfig() {
        }
 }
 
-sub getsetup() {
+sub getsetup () {
        return
                plugin => {
                        safe => 0, # rcs plugin
                        rebuild => undef,
+                       section => "rcs",
                },
                darcs_wrapper => {
                        type => "string",
@@ -138,14 +140,31 @@ sub rcs_prepedit ($) {
        return $rev;
 }
 
-sub rcs_commit ($$$;$$) {
+sub commitauthor (@) {
+       my %params=@_;
+       
+       my $author="anon\@web";
+       if (defined $params{session}) {
+               if (defined $params{session}->param("name")) {
+                       return $params{session}->param("name").'@web';
+               }
+               elsif (defined $params{session}->remote_addr()) {
+                       return $params{session}->remote_addr().'@web';
+               }
+       }
+       return 'anon@web';
+}
+
+sub rcs_commit (@) {
        # Commit the page.  Returns 'undef' on success and a version of the page
        # with conflict markers on failure.
+       my %params=@_;
 
-       my ($file, $message, $rcstoken, $user, $ipaddr) = @_;
+       my ($file, $message, $token) =
+               ($params{file}, $params{message}, $params{token});
 
        # Compute if the "revision" of $file changed.
-       my $changed = darcs_rev($file) ne $rcstoken;
+       my $changed = darcs_rev($file) ne $token;
 
        # Yes, the following is a bit convoluted.
        if ($changed) {
@@ -153,7 +172,7 @@ sub rcs_commit ($$$;$$) {
                rename("$config{srcdir}/$file", "$config{srcdir}/$file.save") or
                        error("failed to rename $file to $file.save: $!");
 
-               # Roll the repository back to $rcstoken.
+               # Roll the repository back to $token.
 
                # TODO.  Can we be sure that no changes are lost?  I think that
                # we can, if we make sure that the 'darcs push' below will always
@@ -164,37 +183,28 @@ sub rcs_commit ($$$;$$) {
                # TODO: 'yes | ...' needed?  Doesn't seem so.
                silentsystem('darcs', "revert", "--repodir", $config{srcdir}, "--all") == 0 ||
                        error("'darcs revert' failed");
-               # Remove all patches starting at $rcstoken.
+               # Remove all patches starting at $token.
                my $child = open(DARCS_OBLITERATE, "|-");
                if (! $child) {
                        open(STDOUT, ">/dev/null");
                        exec('darcs', "obliterate", "--repodir", $config{srcdir},
-                          "--match", "hash " . $rcstoken) and
+                          "--match", "hash " . $token) and
                           error("'darcs obliterate' failed");
                }
                1 while print DARCS_OBLITERATE "y";
                close(DARCS_OBLITERATE);
-               # Restore the $rcstoken one.
+               # Restore the $token one.
                silentsystem('darcs', "pull", "--quiet", "--repodir", $config{srcdir},
-                       "--match", "hash " . $rcstoken, "--all") == 0 ||
+                       "--match", "hash " . $token, "--all") == 0 ||
                        error("'darcs pull' failed");
        
-               # We're back at $rcstoken.  Re-install the modified file.
+               # We're back at $token.  Re-install the modified file.
                rename("$config{srcdir}/$file.save", "$config{srcdir}/$file") or
                        error("failed to rename $file.save to $file: $!");
        }
 
        # Record the changes.
-       my $author;
-       if (defined $user) {
-               $author = "$user\@web";
-       }
-       elsif (defined $ipaddr) {
-               $author = "$ipaddr\@web";
-       }
-       else {
-               $author = "anon\@web";
-       }
+       my $author=commitauthor(%params);
        if (!defined $message || !length($message)) {
                $message = "empty message";
        }
@@ -209,13 +219,13 @@ sub rcs_commit ($$$;$$) {
 
        # If this updating yields any conflicts, we'll record them now to resolve
        # them.  If nothing is recorded, there are no conflicts.
-       $rcstoken = darcs_rev($file);
+       $token = darcs_rev($file);
        # TODO: Use only the first line here, i.e. only the patch name?
        writefile("$file.log", $config{srcdir}, 'resolve conflicts: ' . $message);
        silentsystem('darcs', 'record', '--repodir', $config{srcdir}, '--all',
                '-m', 'resolve conflicts: ' . $message, '--author', $author, $file) == 0 ||
                error("'darcs record' failed");
-       my $conflicts = darcs_rev($file) ne $rcstoken;
+       my $conflicts = darcs_rev($file) ne $token;
        unlink("$config{srcdir}/$file.log") or
                error("failed to remove '$file.log'");
 
@@ -237,25 +247,18 @@ sub rcs_commit ($$$;$$) {
        }
 }
 
-sub rcs_commit_staged($$$) {
-       my ($message, $user, $ipaddr) = @_;
+sub rcs_commit_staged (@) {
+       my %params=@_;
 
-       my $author;
-       if (defined $user) {
-               $author = "$user\@web";
-       }
-       elsif (defined $ipaddr) {
-               $author = "$ipaddr\@web";
-       }
-       else {
-               $author = "anon\@web";
-       }
-       if (!defined $message || !length($message)) {
-               $message = "empty message";
+       my $author=commitauthor(%params);
+       if (!defined $params{message} || !length($params{message})) {
+               $params{message} = "empty message";
        }
 
-       silentsystem('darcs', "record", "--repodir", $config{srcdir}, "-a", "-A", $author,
-               "-m", $message) == 0 || error("'darcs record' failed");
+       silentsystem('darcs', "record", "--repodir", $config{srcdir},
+               "-a", "-A", $author,
+               "-m", $params{message},
+       ) == 0 || error("'darcs record' failed");
 
        # Push the changes to the main repository.
        silentsystem('darcs', 'push', '--quiet', '--repodir', $config{srcdir}, '--all') == 0 ||
@@ -393,14 +396,11 @@ sub rcs_getctime ($) {
        eval q{use XML::Simple};
        local $/=undef;
 
-       my $filer=substr($file, length($config{srcdir}));
-       $filer =~ s:^[/]+::;
-
        my $child = open(LOG, "-|");
        if (! $child) {
                exec("darcs", "changes", "--xml", "--reverse",
-                       "--repodir", $config{srcdir}, $filer)
-               || error("'darcs changes $filer' failed to run");
+                       "--repodir", $config{srcdir}, $file)
+               || error("'darcs changes $file' failed to run");
        }
 
        my $data;
@@ -415,7 +415,7 @@ sub rcs_getctime ($) {
        my $datestr = $log->{patch}[0]->{local_date};
 
        if (! defined $datestr) {
-               warn "failed to get ctime for $filer";
+               warn "failed to get ctime for $file";
                return 0;
        }
 
@@ -426,4 +426,8 @@ sub rcs_getctime ($) {
        return $date;
 }
 
+sub rcs_getmtime ($) {
+       error "rcs_getmtime is not implemented for darcs\n"; # TODO
+}
+
 1
index 652e6df0a67ca75aba0e2eec9bdbbc3bb6c04e45..ea5c9a9c5dae9e29ef5ca73b6a066c495405f7b9 100644 (file)
@@ -15,6 +15,7 @@ sub getsetup () {
                plugin => {
                        safe => 1,
                        rebuild => undef,
+                       section => "widget",
                },
 }
 
index 7df6a9ffb42f53960f4881b43b34b86f49f6e798..015ce9c148d554c29a3db6a04227a2a50c88f02e 100644 (file)
@@ -19,6 +19,7 @@ sub getsetup () {
                plugin => {
                        safe => 1,
                        rebuild => 0,
+                       section => "web",
                },
 }
 
@@ -70,7 +71,7 @@ sub formbuilder_setup {
                $content=~s/\r/\n/g;
 
                my $diff = diff(srcfile($pagesources{$page}), $content);
-               $form->tmpl_param("page_preview", $diff);
+               $form->tmpl_param("page_diff", $diff);
        }
 }
 
index fca970c60be3a13199298ddf736c70d14dd2528d..1a04a72b5568f2980d8a7e00d0eaaa06a62e0e0d 100644 (file)
@@ -17,6 +17,7 @@ sub getsetup () {
                plugin => {
                        safe => 1,
                        rebuild => 1,
+                       section => "core",
                },
 }
 
@@ -63,7 +64,7 @@ sub cgi_editpage ($$) {
 
        decode_cgi_utf8($q);
 
-       my @fields=qw(do rcsinfo subpage from page type editcontent comments);
+       my @fields=qw(do rcsinfo subpage from page type editcontent editmessage);
        my @buttons=("Save Page", "Preview", "Cancel");
        eval q{use CGI::FormBuilder};
        error($@) if $@;
@@ -77,7 +78,7 @@ sub cgi_editpage ($$) {
                action => $config{cgiurl},
                header => 0,
                table => 0,
-               template => scalar template_params("editpage.tmpl"),
+               template => { template("editpage.tmpl") },
        );
        
        decode_form_utf8($form);
@@ -91,9 +92,9 @@ sub cgi_editpage ($$) {
        # wiki_file_regexp.
        my ($page)=$form->field('page')=~/$config{wiki_file_regexp}/;
        $page=possibly_foolish_untaint($page);
-       my $absolute=($page =~ s#^/+##);
+       my $absolute=($page =~ s#^/+##); # absolute name used to force location
        if (! defined $page || ! length $page ||
-           file_pruned($page, $config{srcdir})) {
+           file_pruned($page)) {
                error(gettext("bad page name"));
        }
 
@@ -143,16 +144,16 @@ sub cgi_editpage ($$) {
        $form->field(name => "subpage", type => 'hidden');
        $form->field(name => "page", value => $page, force => 1);
        $form->field(name => "type", value => $type, force => 1);
-       $form->field(name => "comments", type => "text", size => 80);
+       $form->field(name => "editmessage", type => "text", size => 80);
        $form->field(name => "editcontent", type => "textarea", rows => 20,
                cols => 80);
        $form->tmpl_param("can_commit", $config{rcs});
-       $form->tmpl_param("indexlink", indexlink());
        $form->tmpl_param("helponformattinglink",
                htmllink($page, $page, "ikiwiki/formatting",
                        noimageinline => 1,
                        linktext => "FormattingHelp"));
        
+       my $previewing=0;
        if ($form->submitted eq "Cancel") {
                if ($form->field("do") eq "create" && defined $from) {
                        redirect($q, urlto($from, undef, 1));
@@ -166,11 +167,11 @@ sub cgi_editpage ($$) {
                exit;
        }
        elsif ($form->submitted eq "Preview") {
+               $previewing=1;
+
                my $new=not exists $pagesources{$page};
-               if ($new) {
-                       # temporarily record its type
-                       $pagesources{$page}=$page.".".$type;
-               }
+               # temporarily record its type
+               $pagesources{$page}=$page.".".$type if $new;
                my %wasrendered=map { $_ => 1 } @{$renderedfiles{$page}};
 
                my $content=$form->field('editcontent');
@@ -195,18 +196,17 @@ sub cgi_editpage ($$) {
                });
                $form->tmpl_param("page_preview", $preview);
                
-               if ($new) {
-                       delete $pagesources{$page};
-               }
-
                # Previewing may have created files on disk.
                # Keep a list of these to be deleted later.
                my %previews = map { $_ => 1 } @{$wikistate{editpage}{previews}};
                foreach my $f (@{$renderedfiles{$page}}) {
                        $previews{$f}=1 unless $wasrendered{$f};
                }
+
+               # Throw out any other state changes made during previewing,
+               # and save the previews list.
+               loadindex();
                @{$wikistate{editpage}{previews}} = keys %previews;
-               $renderedfiles{$page}=[keys %wasrendered];
                saveindex();
        }
        elsif ($form->submitted eq "Save Page") {
@@ -219,8 +219,7 @@ sub cgi_editpage ($$) {
                        my $best_loc;
                        if (! defined $from || ! length $from ||
                            $from ne $form->field('from') ||
-                           file_pruned($from, $config{srcdir}) ||
-                           $from=~/^\// || 
+                           file_pruned($from) ||
                            $absolute ||
                            $form->submitted) {
                                @page_locs=$best_loc=$page;
@@ -245,8 +244,9 @@ sub cgi_editpage ($$) {
                                        push @page_locs, $dir.$page;
                                }
                        
-                               push @page_locs, "$config{userdir}/$page"
-                                       if length $config{userdir};
+                               my $userpage=IkiWiki::userpage($page);
+                               push @page_locs, $userpage
+                                       if ! grep { $_ eq $userpage } @page_locs;
                        }
 
                        @page_locs = grep {
@@ -255,7 +255,7 @@ sub cgi_editpage ($$) {
                        if (! @page_locs) {
                                # hmm, someone else made the page in the
                                # meantime?
-                               if ($form->submitted eq "Preview") {
+                               if ($previewing) {
                                        # let them go ahead with the edit
                                        # and resolve the conflict at save
                                        # time
@@ -271,8 +271,10 @@ sub cgi_editpage ($$) {
                                check_canedit($_, $q, $session, 1)
                        } @page_locs;
                        if (! @editable_locs) {
-                               # let it throw an error this time
-                               map { check_canedit($_, $q, $session) } @page_locs;
+                               # now let it throw an error, or prompt for
+                               # login
+                               map { check_canedit($_, $q, $session) }
+                                       ($best_loc, @page_locs);
                        }
                        
                        my @page_types;
@@ -310,7 +312,8 @@ sub cgi_editpage ($$) {
                        $form->title(sprintf(gettext("editing %s"), pagetitle($page)));
                }
                
-               showform($form, \@buttons, $session, $q, forcebaseurl => $baseurl);
+               showform($form, \@buttons, $session, $q,
+                       forcebaseurl => $baseurl, page => $page);
        }
        else {
                # save page
@@ -327,7 +330,8 @@ sub cgi_editpage ($$) {
                        $form->field(name => "page", type => 'hidden');
                        $form->field(name => "type", type => 'hidden');
                        $form->title(sprintf(gettext("editing %s"), $page));
-                       showform($form, \@buttons, $session, $q, forcebaseurl => $baseurl);
+                       showform($form, \@buttons, $session, $q,
+                               forcebaseurl => $baseurl, page => $page);
                        exit;
                }
                elsif ($form->field("do") eq "create" && $exists) {
@@ -341,14 +345,15 @@ sub cgi_editpage ($$) {
                                value => readfile("$config{srcdir}/$file").
                                         "\n\n\n".$form->field("editcontent"),
                                force => 1);
-                       showform($form, \@buttons, $session, $q, forcebaseurl => $baseurl);
+                       showform($form, \@buttons, $session, $q,
+                               forcebaseurl => $baseurl, page => $page);
                        exit;
                }
                        
                my $message="";
-               if (defined $form->field('comments') &&
-                   length $form->field('comments')) {
-                       $message=$form->field('comments');
+               if (defined $form->field('editmessage') &&
+                   length $form->field('editmessage')) {
+                       $message=$form->field('editmessage');
                }
                
                my $content=$form->field('editcontent');
@@ -382,7 +387,7 @@ sub cgi_editpage ($$) {
                        $form->field(name => "type", type => 'hidden');
                        $form->title(sprintf(gettext("editing %s"), $page));
                        showform($form, \@buttons, $session, $q,
-                               forcebaseurl => $baseurl);
+                               forcebaseurl => $baseurl, page => $page);
                        exit;
                }
                
@@ -396,9 +401,12 @@ sub cgi_editpage ($$) {
                        # signaling to it that it should not try to
                        # do anything.
                        disable_commit_hook();
-                       $conflict=rcs_commit($file, $message,
-                               $form->field("rcsinfo"),
-                               $session->param("name"), $ENV{REMOTE_ADDR});
+                       $conflict=rcs_commit(
+                               file => $file,
+                               message => $message,
+                               token => $form->field("rcsinfo"),
+                               session => $session,
+                       );
                        enable_commit_hook();
                        rcs_update();
                }
@@ -421,7 +429,7 @@ sub cgi_editpage ($$) {
                        $form->field(name => "type", type => 'hidden');
                        $form->title(sprintf(gettext("editing %s"), $page));
                        showform($form, \@buttons, $session, $q,
-                               forcebaseurl => $baseurl);
+                               forcebaseurl => $baseurl, page => $page);
                }
                else {
                        # The trailing question mark tries to avoid broken
index a163b0d84c3b28cee03ab3eecd24744ee5a2fc65..226f83bb4bdfc6dfb11dd326fd6db9d02aae8eae 100644 (file)
@@ -23,6 +23,7 @@ sub getsetup () {
                plugin => {
                        safe => 1,
                        rebuild => undef,
+                       section => "web",
                },
 }
 
@@ -55,11 +56,17 @@ sub preprocess (@) {
        }
 
        my $link=linkpage($params{template});
+       add_depends($params{page}, $link, deptype("presence"));
        my $bestlink=bestlink($params{page}, $link);
+       if (! length $bestlink) {
+               add_depends($params{page}, "templates/$link", deptype("presence"));
+               $link="/templates/".$link;
+               $bestlink=bestlink($params{page}, $link);
+       }
        $pagestate{$params{page}}{edittemplate}{$params{match}}=$bestlink;
 
-       return "" if ($params{silent} && IkiWiki::yesno($params{silent}));
-       add_depends($params{page}, $link, deptype("presence"));
+       return "" if ($params{silent} && IkiWiki::yesno($params{silent})) &&
+               length $bestlink;
        return sprintf(gettext("edittemplate %s registered for %s"),
                htmllink($params{page}, $params{destpage}, $link),
                $params{match});
@@ -113,28 +120,18 @@ sub filltemplate ($$) {
        my $template_page=shift;
        my $page=shift;
 
-       my $template_file=$pagesources{$template_page};
-       if (! defined $template_file) {
-               return;
-       }
-
        my $template;
        eval {
-               $template=HTML::Template->new(
-                       filter => sub {
-                               my $text_ref = shift;
-                               $$text_ref=&Encode::decode_utf8($$text_ref);
-                               chomp $$text_ref;
-                       },
-                       filename => srcfile($template_file),
-                       die_on_bad_params => 0,
-                       no_includes => 1,
-               );
+               # force page name absolute so it doesn't look in templates/
+               $template=template("/".$template_page);
        };
        if ($@) {
                # Indicate that the earlier preprocessor directive set 
                # up a template that doesn't work.
-               return "[[!pagetemplate ".gettext("failed to process")." $@]]";
+               return "[[!pagetemplate ".gettext("failed to process template:")." $@]]";
+       }
+       if (! defined $template) {
+               return;
        }
 
        $template->param(name => $page);
index 01d4909612d289d905905d303af41853ef903a56..1549b82db75a9d5164c04b166a3d6d149bdb01dc 100644 (file)
@@ -5,7 +5,7 @@ use warnings;
 use strict;
 use IkiWiki 3.00;
 
-my %units=( #{{{       # size in bytes
+my %units=(            # size in bytes
        B               => 1,
        byte            => 1,
        KB              => 2 ** 10,
@@ -75,9 +75,9 @@ sub match_maxsize ($$;@) {
        }
 
        my %params=@_;
-       my $file=exists $params{file} ? $params{file} : $IkiWiki::pagesources{$page};
+       my $file=exists $params{file} ? $params{file} : IkiWiki::srcfile($IkiWiki::pagesources{$page});
        if (! defined $file) {
-               return IkiWiki::ErrorReason->new("no file specified");
+               return IkiWiki::ErrorReason->new("file does not exist");
        }
 
        if (-s $file > $maxsize) {
@@ -96,9 +96,9 @@ sub match_minsize ($$;@) {
        }
 
        my %params=@_;
-       my $file=exists $params{file} ? $params{file} : $IkiWiki::pagesources{$page};
+       my $file=exists $params{file} ? $params{file} : IkiWiki::srcfile($IkiWiki::pagesources{$page});
        if (! defined $file) {
-               return IkiWiki::ErrorReason->new("no file specified");
+               return IkiWiki::ErrorReason->new("file does not exist");
        }
 
        if (-s $file < $minsize) {
@@ -114,9 +114,9 @@ sub match_mimetype ($$;@) {
        my $wanted=shift;
 
        my %params=@_;
-       my $file=exists $params{file} ? $params{file} : $IkiWiki::pagesources{$page};
+       my $file=exists $params{file} ? $params{file} : IkiWiki::srcfile($IkiWiki::pagesources{$page});
        if (! defined $file) {
-               return IkiWiki::ErrorReason->new("no file specified");
+               return IkiWiki::ErrorReason->new("file does not exist");
        }
 
        # Use ::magic to get the mime type, the idea is to only trust
@@ -147,9 +147,9 @@ sub match_virusfree ($$;@) {
        my $wanted=shift;
 
        my %params=@_;
-       my $file=exists $params{file} ? $params{file} : $IkiWiki::pagesources{$page};
+       my $file=exists $params{file} ? $params{file} : IkiWiki::srcfile($IkiWiki::pagesources{$page});
        if (! defined $file) {
-               return IkiWiki::ErrorReason->new("no file specified");
+               return IkiWiki::ErrorReason->new("file does not exist");
        }
 
        if (! exists $IkiWiki::config{virus_checker} ||
index 1513cbed72a67447fa8bcedd9bff1f10ce076262..d54e7113198093a2a939315077f7f99d34c529a8 100644 (file)
@@ -7,6 +7,16 @@ use IkiWiki 3.00;
 
 sub import {
        hook(type => "preprocess", id => "format", call => \&preprocess);
+       hook(type => "getsetup",   id => "format", call => \&getsetup);
+}
+
+sub getsetup () {
+       return
+               plugin => {
+                       safe => 1,
+                       rebuild => undef,
+                       section => "widget",
+               },
 }
 
 sub preprocess (@) {
index 17e57dea14fccb4c3f9e1c21a5926ef4880033cd..f481c7eacea7240b3b8032311d3c4e9b307bfe63 100644 (file)
@@ -16,6 +16,7 @@ sub getsetup () {
                plugin => {
                        safe => 1,
                        rebuild => undef,
+                       section => "widget",
                },
 }
 
index d1555430e82d83bbe61064d04b335cdf48a85317..b362de7264175d9468c4207dcacf9153ade356a5 100644 (file)
@@ -17,6 +17,7 @@ sub getsetup () {
                plugin => {
                        safe => 1,
                        rebuild => 1,
+                       section => "web",
                },
                getsource_mimetype => {
                        type => "string",
index c5c83a3a7791b7723f293652b6557fc5f50b558c..992c6226b6b69f859b80458fb6b21da52a28a49c 100644 (file)
@@ -25,6 +25,7 @@ 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);
+       hook(type => "rcs", id => "rcs_getmtime", call => \&rcs_getmtime);
        hook(type => "rcs", id => "rcs_receive", call => \&rcs_receive);
 }
 
@@ -51,6 +52,9 @@ sub checkconfig () {
                        wrappermode => (defined $config{git_wrappermode} ? $config{git_wrappermode} : "06755"),
                };
        }
+
+       # Avoid notes, parser does not handle and they only slow things down.
+       $ENV{GIT_NOTES_REF}="";
        
        # Run receive test only if being called by the wrapper, and not
        # when generating same.
@@ -65,6 +69,7 @@ sub getsetup () {
                plugin => {
                        safe => 0, # rcs plugin
                        rebuild => undef,
+                       section => "rcs",
                },
                git_wrapper => {
                        type => "string",
@@ -275,11 +280,35 @@ sub merge_past ($$$) {
        return $conflict;
 }
 
-sub parse_diff_tree ($@) {
+{
+my $prefix;
+sub decode_git_file ($) {
+       my $file=shift;
+
+       # git does not output utf-8 filenames, but instead
+       # double-quotes them with the utf-8 characters
+       # escaped as \nnn\nnn.
+       if ($file =~ m/^"(.*)"$/) {
+               ($file=$1) =~ s/\\([0-7]{1,3})/chr(oct($1))/eg;
+       }
+
+       # strip prefix if in a subdir
+       if (! defined $prefix) {
+               ($prefix) = run_or_die('git', 'rev-parse', '--show-prefix');
+               if (! defined $prefix) {
+                       $prefix="";
+               }
+       }
+       $file =~ s/^\Q$prefix\E//;
+
+       return decode("utf8", $file);
+}
+}
+
+sub parse_diff_tree ($) {
        # Parse the raw diff tree chunk and return the info hash.
        # See git-diff-tree(1) for the syntax.
-
-       my ($prefix, $dt_ref) = @_;
+       my $dt_ref = shift;
 
        # End of stream?
        return if !defined @{ $dt_ref } ||
@@ -313,8 +342,9 @@ sub parse_diff_tree ($@) {
                        $ci{ "${who}_epoch" } = $epoch;
                        $ci{ "${who}_tz"    } = $tz;
 
-                       if ($name =~ m/^[^<]+\s+<([^@>]+)/) {
-                               $ci{"${who}_username"} = $1;
+                       if ($name =~ m/^([^<]+)\s+<([^@>]+)/) {
+                               $ci{"${who}_name"} = $1;
+                               $ci{"${who}_username"} = $2;
                        }
                        elsif ($name =~ m/^([^<]+)\s+<>$/) {
                                $ci{"${who}_username"} = $1;
@@ -362,16 +392,9 @@ sub parse_diff_tree ($@) {
                        my $sha1_to = shift(@tmp);
                        my $status = shift(@tmp);
 
-                       # git does not output utf-8 filenames, but instead
-                       # double-quotes them with the utf-8 characters
-                       # escaped as \nnn\nnn.
-                       if ($file =~ m/^"(.*)"$/) {
-                               ($file=$1) =~ s/\\([0-7]{1,3})/chr(oct($1))/eg;
-                       }
-                       $file =~ s/^\Q$prefix\E//;
                        if (length $file) {
                                push @{ $ci{'details'} }, {
-                                       'file'      => decode("utf8", $file),
+                                       'file'      => decode_git_file($file),
                                        'sha1_from' => $sha1_from[0],
                                        'sha1_to'   => $sha1_to,
                                        'mode_from' => $mode_from[0],
@@ -398,10 +421,9 @@ sub git_commit_info ($;$) {
        my @raw_lines = run_or_die('git', 'log', @opts,
                '--pretty=raw', '--raw', '--abbrev=40', '--always', '-c',
                '-r', $sha1, '--', '.');
-       my ($prefix) = run_or_die('git', 'rev-parse', '--show-prefix');
 
        my @ci;
-       while (my $parsed = parse_diff_tree(($prefix or ""), \@raw_lines)) {
+       while (my $parsed = parse_diff_tree(\@raw_lines)) {
                push @ci, $parsed;
        }
 
@@ -419,7 +441,10 @@ sub git_sha1 (;$) {
                '--', $file);
        if ($sha1) {
                ($sha1) = $sha1 =~ m/($sha1_pattern)/; # sha1 is untainted now
-       } else { debug("Empty sha1sum for '$file'.") }
+       }
+       else {
+               debug("Empty sha1sum for '$file'.");
+       }
        return defined $sha1 ? $sha1 : q{};
 }
 
@@ -439,43 +464,60 @@ sub rcs_prepedit ($) {
        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.
-
-       my ($file, $message, $rcstoken, $user, $ipaddr) = @_;
+       my %params=@_;
 
        # Check to see if the page has been changed by someone else since
        # rcs_prepedit was called.
-       my $cur    = git_sha1($file);
-       my ($prev) = $rcstoken =~ /^($sha1_pattern)$/; # untaint
+       my $cur    = git_sha1($params{file});
+       my ($prev) = $params{token} =~ /^($sha1_pattern)$/; # untaint
 
        if (defined $cur && defined $prev && $cur ne $prev) {
-               my $conflict = merge_past($prev, $file, $dummy_commit_msg);
+               my $conflict = merge_past($prev, $params{file}, $dummy_commit_msg);
                return $conflict if defined $conflict;
        }
 
-       rcs_add($file); 
-       return rcs_commit_staged($message, $user, $ipaddr);
+       rcs_add($params{file});
+       return rcs_commit_staged(
+               message => $params{message},
+               session => $params{session},
+       );
 }
 
-sub rcs_commit_staged ($$$) {
+sub rcs_commit_staged (@) {
        # Commits all staged changes. Changes can be staged using rcs_add,
        # rcs_remove, and rcs_rename.
-       my ($message, $user, $ipaddr)=@_;
-
-       # Set the commit author and email to the web committer.
+       my %params=@_;
+       
        my %env=%ENV;
-       if (defined $user || defined $ipaddr) {
-               my $u=encode_utf8(defined $user ? $user : $ipaddr);
-               $ENV{GIT_AUTHOR_NAME}=$u;
-               $ENV{GIT_AUTHOR_EMAIL}="$u\@web";
+
+       if (defined $params{session}) {
+               # Set the commit author and email based on web session info.
+               my $u;
+               if (defined $params{session}->param("name")) {
+                       $u=$params{session}->param("name");
+               }
+               elsif (defined $params{session}->remote_addr()) {
+                       $u=$params{session}->remote_addr();
+               }
+               if (defined $u) {
+                       $u=encode_utf8($u);
+                       $ENV{GIT_AUTHOR_NAME}=$u;
+               }
+               if (defined $params{session}->param("nickname")) {
+                       $u=encode_utf8($params{session}->param("nickname"));
+               }
+               if (defined $u) {
+                       $ENV{GIT_AUTHOR_EMAIL}="$u\@web";
+               }
        }
 
-       $message = IkiWiki::possibly_foolish_untaint($message);
+       $params{message} = IkiWiki::possibly_foolish_untaint($params{message});
        my @opts;
-       if ($message !~ /\S/) {
+       if ($params{message} !~ /\S/) {
                # Force git to allow empty commit messages.
                # (If this version of git supports it.)
                my ($version)=`git --version` =~ /git version (.*)/;
@@ -483,13 +525,13 @@ sub rcs_commit_staged ($$$) {
                        push @opts, '--cleanup=verbatim';
                }
                else {
-                       $message.=".";
+                       $params{message}.=".";
                }
        }
        push @opts, '-q';
        # git commit returns non-zero if file has not been really changed.
        # so we should ignore its exit status (hence run_or_non).
-       if (run_or_non('git', 'commit', @opts, '-m', $message)) {
+       if (run_or_non('git', 'commit', @opts, '-m', $params{message})) {
                if (length $config{gitorigin_branch}) {
                        run_or_cry('git', 'push', $config{gitorigin_branch});
                }
@@ -566,7 +608,16 @@ sub rcs_recentchanges ($) {
 
                my $user=$ci->{'author_username'};
                my $web_commit = ($ci->{'author'} =~ /\@web>/);
-               
+               my $nickname;
+
+               # Set nickname only if a non-url author_username is available,
+               # and author_name is an url.
+               if ($user !~ /:\/\// && defined $ci->{'author_name'} &&
+                   $ci->{'author_name'} =~ /:\/\//) {
+                       $nickname=$user;
+                       $user=$ci->{'author_name'};
+               }
+
                # compatability code for old web commit messages
                if (! $web_commit &&
                      defined $messages[0] &&
@@ -579,6 +630,7 @@ sub rcs_recentchanges ($) {
                push @rets, {
                        rev        => $sha1,
                        user       => $user,
+                       nickname   => $nickname,
                        committype => $web_commit ? "web" : "git",
                        when       => $when,
                        message    => [@messages],
@@ -608,23 +660,50 @@ sub rcs_diff ($) {
        }
 }
 
-sub rcs_getctime ($) {
+{
+my %time_cache;
+
+sub findtimes ($$) {
        my $file=shift;
-       # Remove srcdir prefix
-       $file =~ s/^\Q$config{srcdir}\E\/?//;
+       my $id=shift; # 0 = mtime ; 1 = ctime
+
+       if (! keys %time_cache) {
+               my $date;
+               foreach my $line (run_or_die('git', 'log',
+                               '--pretty=format:%ct',
+                               '--name-only', '--relative')) {
+                       if (! defined $date && $line =~ /^(\d+)$/) {
+                               $date=$line;
+                       }
+                       elsif (! length $line) {
+                               $date=undef;
+                       }
+                       else {
+                               my $f=decode_git_file($line);
 
-       my @raw_lines = run_or_die('git', 'log', 
-               '--follow', '--no-merges',
-               '--pretty=raw', '--raw', '--abbrev=40', '--always', '-c',
-               '-r', '--', $file);
-       my @ci;
-       while (my $parsed = parse_diff_tree("", \@raw_lines)) {
-               push @ci, $parsed;
+                               if (! $time_cache{$f}) {
+                                       $time_cache{$f}[0]=$date; # mtime
+                               }
+                               $time_cache{$f}[1]=$date; # ctime
+                       }
+               }
        }
-       my $ctime = $ci[$#ci]->{'author_epoch'};
-       debug("ctime for '$file': ". localtime($ctime));
 
-       return $ctime;
+       return exists $time_cache{$file} ? $time_cache{$file}[$id] : 0;
+}
+
+}
+
+sub rcs_getctime ($) {
+       my $file=shift;
+
+       return findtimes($file, 1);
+}
+
+sub rcs_getmtime ($) {
+       my $file=shift;
+
+       return findtimes($file, 0);
 }
 
 sub rcs_receive () {
index 483fa1707dca4dd60be7d8b3328f1a343b1fe026..68cde261c66748c5d32475657986ce9d465fbbbf 100644 (file)
@@ -17,6 +17,7 @@ sub getsetup () {
                plugin => {
                        safe => 1,
                        rebuild => 1,
+                       section => "web",
                },
 }
 
@@ -24,6 +25,10 @@ sub checkconfig () {
        if (! length $config{url}) {
                error(sprintf(gettext("Must specify %s when using the %s plugin"), "url", 'google'));
        }
+       
+       # This is a mass dependency, so if the search form template
+       # changes, every page is rebuilt.
+       add_depends("", "templates/googleform.tmpl");
 }
 
 my $form;
@@ -37,6 +42,7 @@ sub pagetemplate (@) {
                if (! defined $form) {
                        my $searchform = template("googleform.tmpl", blind_cache => 1);
                        $searchform->param(url => $config{url});
+                       $searchform->param(html5 => $config{html5});
                        $form=$searchform->output;
                }
 
index 439552f62f9d5b3fe97c33d8397a559118e25b71..669211691028b90f748f0d1489e0380a7d97b253 100644 (file)
@@ -14,6 +14,7 @@ sub getsetup () {
                plugin => {
                        safe => 1,
                        rebuild => 0,
+                       section => "web",
                }
 }
 
@@ -40,14 +41,15 @@ sub cgi_goto ($;$) {
 
        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($q, $pagestate{$page}{meta}{permalink});
+       my $link;
+       if (! IkiWiki::isinternal($page)) {
+               $link = bestlink("", $page);
+       }
+       elsif (defined $pagestate{$page}{meta}{permalink}) {
+               # Can only redirect to an internal page if it has a
+               # permalink.
+               IkiWiki::redirect($q, $pagestate{$page}{meta}{permalink});
        }
-
-       my $link = bestlink("", $page);
 
        if (! length $link) {
                IkiWiki::cgi_custom_failure(
index 32e994d6b96c4d10dce2998db005ac22729a7ce5..dfd66a03e2250723132caa75c2f9d5da2e2c4fc2 100644 (file)
@@ -18,6 +18,7 @@ sub getsetup () {
                plugin => {
                        safe => 1,
                        rebuild => undef,
+                       section => "widget",
                },
 }
 
@@ -70,7 +71,8 @@ sub render_graph (\%) {
                        writefile($dest, $config{destdir}, $png, 1);
                }
                else {
-                       # can't write the file, so embed it in a data uri
+                       # in preview mode, embed the image in a data uri
+                       # to avoid temp file clutter
                        eval q{use MIME::Base64};
                        error($@) if $@;
                        return "<img src=\"data:image/png;base64,".
@@ -78,12 +80,7 @@ sub render_graph (\%) {
                }
        }
 
-       if ($params{preview}) {
-               return "<img src=\"".urlto($dest, "")."\" />\n";
-       }
-       else {
-               return "<img src=\"".urlto($dest, $params{destpage})."\" />\n";
-       }
+       return "<img src=\"".urlto($dest, $params{destpage})."\" />\n";
 }
 
 sub graph (@) {
index 5a062a27606be6a0cb8d9a5a4f06ce8c0ec5cd6a..bf23dce673f4b93a264545a4ab4c4156ef869eef 100644 (file)
@@ -16,6 +16,7 @@ sub getsetup {
                plugin => {
                        safe => 1,
                        rebuild => undef,
+                       section => "widget",
                },
 }
 
index 9bdde85ae3bfd725ee83265b923eb445021a15c4..e517ac5c06aa425771dcac7256a8e3127da8d3bb 100644 (file)
@@ -23,6 +23,7 @@ sub getsetup () {
                plugin => {
                        safe => 1,
                        rebuild => 1, # format plugin
+                       section => "format",
                },
                tohighlight => {
                        type => "string",
@@ -79,7 +80,7 @@ my %highlighters;
 
 # Parse highlight's config file to get extension => language mappings.
 sub read_filetypes () {
-       open (IN, $filetypes);
+       open (IN, $filetypes) || error("$filetypes: $!");
        while (<IN>) {
                chomp;
                if (/^\$ext\((.*)\)=(.*)$/) {
index bd2177a06a1217de57700c40de641e9794133b5f..32c9cf3ada5b1ed3ed65114177fbcade05d0eaf2 100644 (file)
@@ -23,6 +23,7 @@ sub getsetup () {
                plugin => {
                        safe => 1,
                        rebuild => 1, # format plugin
+                       section => "format",
                },
 }
 
index a7d5e8ce91af28d9053b9b831564e9b1fc13a7b3..4dbae081bd9476c154728d32efe4c054e1e954f9 100644 (file)
@@ -21,6 +21,7 @@ sub getsetup () {
                plugin => {
                        safe => 1,
                        rebuild => 1, # format plugin
+                       section => "format",
                },
 }
 
index a249cdf7a43b2986b5ca519f88c01cc6fcf85141..8475181780db55cfd1b0e0846f277e44fa87e156 100644 (file)
@@ -30,9 +30,9 @@ sub import {
                "msnim", "notes", "rsync", "secondlife", "skype", "ssh",
                "sftp", "smb", "sms", "snews", "webcal", "ymsgr",
        );
-       # 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;
+       # data is a special case. Allow a few data:image/ types,
+       # but disallow data:text/javascript and everything else.
+       $safe_url_regexp=qr/^(?:(?:$uri_schemes):|data:image\/(?:png|jpeg|gif)|[^:]+(?:$|[\/\?]))/i;
 }
 
 sub getsetup () {
@@ -40,6 +40,7 @@ sub getsetup () {
                plugin => {
                        safe => 1,
                        rebuild => undef,
+                       section => "core",
                },
                htmlscrubber_skip => {
                        type => "pagespec",
@@ -71,7 +72,7 @@ sub scrubber {
        eval q{use HTML::Scrubber};
        error($@) if $@;
        # Lists based on http://feedparser.org/docs/html-sanitization.html
-       # With html 5 video and audio tags added.
+       # With html5 tags added.
        $_scrubber = HTML::Scrubber->new(
                allow => [qw{
                        a abbr acronym address area b big blockquote br br/
@@ -81,7 +82,10 @@ sub scrubber {
                        menu ol optgroup option p p/ pre q s samp select small
                        span strike strong sub sup table tbody td textarea
                        tfoot th thead tr tt u ul var
-                       video audio
+
+                       video audio source section nav article aside hgroup
+                       header footer figure figcaption time mark canvas
+                       datalist progress meter ruby rt rp details summary
                }],
                default => [undef, { (
                        map { $_ => 1 } qw{
@@ -97,13 +101,19 @@ sub scrubber {
                                selected shape size span start summary
                                tabindex target title type valign
                                value vspace width
-                               autoplay loopstart loopend end
-                               playcount controls 
+
+                               autofocus autoplay preload loopstart
+                               loopend end playcount controls pubdate
+                               placeholder min max step low high optimum
+                               form required autocomplete novalidate pattern
+                               list formenctype formmethod formnovalidate
+                               formtarget reversed spellcheck open hidden
                        } ),
                        "/" => 1, # emit proper <hr /> XHTML
                        href => $safe_url_regexp,
                        src => $safe_url_regexp,
                        action => $safe_url_regexp,
+                       formaction => $safe_url_regexp,
                        cite => $safe_url_regexp,
                        longdesc => $safe_url_regexp,
                        poster => $safe_url_regexp,
index 127c321f0491978c9b88760685963f785cd1062e..478f6744656f5bdbd4baa00f79cadb9a74ebd255 100644 (file)
@@ -9,6 +9,10 @@ use IkiWiki 3.00;
 sub import {
        hook(type => "getsetup", id => "httpauth", call => \&getsetup);
        hook(type => "auth", id => "httpauth", call => \&auth);
+       hook(type => "formbuilder_setup", id => "httpauth",
+               call => \&formbuilder_setup);
+       hook(type => "canedit", id => "httpauth", call => \&canedit,
+               first => 1);
 }
 
 sub getsetup () {
@@ -16,6 +20,7 @@ sub getsetup () {
                plugin => {
                        safe => 1,
                        rebuild => 0,
+                       section => "auth",
                },
                cgiauthurl => {
                        type => "string",
@@ -24,6 +29,23 @@ sub getsetup () {
                        safe => 1,
                        rebuild => 0,
                },
+               httpauth_pagespec => {
+                       type => "pagespec",
+                       example => "!*/Discussion",
+                       description => "PageSpec of pages where only httpauth will be used for authentication",
+                       safe => 0,
+                       rebuild => 0,
+               },
+}
+                       
+sub redir_cgiauthurl ($;@) {
+       my $cgi=shift;
+
+       IkiWiki::redirect($cgi, 
+               @_ > 1 ? IkiWiki::cgiurl(cgiurl => $config{cgiauthurl}, @_)
+                      : $config{cgiauthurl}."?@_"
+       );
+       exit;
 }
 
 sub auth ($$) {
@@ -33,9 +55,53 @@ sub auth ($$) {
        if (defined $cgi->remote_user()) {
                $session->param("name", $cgi->remote_user());
        }
-       elsif (defined $config{cgiauthurl}) {
-               IkiWiki::redirect($cgi, $config{cgiauthurl}.'?'.$cgi->query_string());
-               exit;
+}
+
+sub formbuilder_setup (@) {
+       my %params=@_;
+
+       my $form=$params{form};
+       my $session=$params{session};
+       my $cgi=$params{cgi};
+       my $buttons=$params{buttons};
+
+       if ($form->title eq "signin" &&
+           ! defined $cgi->remote_user() && defined $config{cgiauthurl}) {
+               my $button_text="Login with HTTP auth";
+               push @$buttons, $button_text;
+
+               if ($form->submitted && $form->submitted eq $button_text) {
+                       # bounce thru cgiauthurl and then back to
+                       # the stored postsignin action
+                       redir_cgiauthurl($cgi, do => "postsignin");
+               }
+       }
+}
+
+sub test_httpauth_pagespec ($) {
+       my $page=shift;
+
+       return (
+       );
+}
+
+sub canedit ($$$) {
+       my $page=shift;
+       my $cgi=shift;
+       my $session=shift;
+
+       if (! defined $cgi->remote_user() &&
+           defined $config{httpauth_pagespec} &&
+           length $config{httpauth_pagespec} &&
+           defined $config{cgiauthurl} &&
+           pagespec_match($page, $config{httpauth_pagespec})) {
+               return sub {
+                       # bounce thru cgiauthurl and back to edit action
+                       redir_cgiauthurl($cgi, $cgi->query_string());
+               };
+       }
+       else {
+               return undef;
        }
 }
 
index c1048d3c927c3fad75c9a7b88b32dbe3833aa814..eb1b6812482dab4065f40dbe6b8a4ebc96726a49 100644 (file)
@@ -19,6 +19,7 @@ sub getsetup () {
                plugin => {
                        safe => 1,
                        rebuild => undef,
+                       section => "widget",
                },
 }
 
@@ -26,6 +27,10 @@ sub preprocess (@) {
        my ($image) = $_[0] =~ /$config{wiki_file_regexp}/; # untaint
        my %params=@_;
 
+       if (! defined $image) {
+               error("bad image filename");
+       }
+
        if (exists $imgdefaults{$params{page}}) {
                foreach my $key (keys %{$imgdefaults{$params{page}}}) {
                        if (! exists $params{$key}) {
@@ -34,7 +39,7 @@ sub preprocess (@) {
                }
        }
 
-       if (! exists $params{size}) {
+       if (! exists $params{size} || ! length $params{size}) {
                $params{size}='full';
        }
 
@@ -110,16 +115,14 @@ sub preprocess (@) {
                                $im = Image::Magick->new;
                                $r = $im->Read($outfile);
                                error sprintf(gettext("failed to read %s: %s"), $outfile, $r) if $r;
-               
-                               $dwidth = $im->Get("width");
-                               $dheight = $im->Get("height");
                        }
                        else {
                                ($dwidth, $dheight)=($w, $h);
                                $r = $im->Resize(geometry => "${w}x${h}");
                                error sprintf(gettext("failed to resize: %s"), $r) if $r;
 
-                               # don't actually write file in preview mode
+                               # don't actually write resized file in preview mode;
+                               # rely on width and height settings
                                if (! $params{preview}) {
                                        my @blob = $im->ImageToBlob();
                                        writefile($imglink, $config{destdir}, $blob[0], 1);
@@ -128,6 +131,9 @@ sub preprocess (@) {
                                        $imglink = $file;
                                }
                        }
+                       
+                       $dwidth = $im->Get("width") unless defined $dwidth;
+                       $dheight = $im->Get("height") unless defined $dheight;
                }
        }
        else {
@@ -150,14 +156,18 @@ sub preprocess (@) {
                $imgurl="$config{url}/$imglink";
        }
 
+       my $attrs='';
+       foreach my $attr (qw{alt title class id hspace vspace}) {
+               if (exists $params{$attr}) {
+                       $attrs.=" $attr=\"$params{$attr}\"";
+               }
+       }
+       
        my $imgtag='<img src="'.$imgurl.
                '" width="'.$dwidth.
                '" height="'.$dheight.'"'.
-               (exists $params{alt} ? ' alt="'.$params{alt}.'"' : '').
-               (exists $params{title} ? ' title="'.$params{title}.'"' : '').
-               (exists $params{class} ? ' class="'.$params{class}.'"' : '').
+               $attrs.
                (exists $params{align} && ! exists $params{caption} ? ' align="'.$params{align}.'"' : '').
-               (exists $params{id} ? ' id="'.$params{id}.'"' : '').
                ' />';
 
        my $link;
index 401852513d1fbe8d14fe4ebfbf38cadd781c410d..715a3d6523cfcee4e57c125425d19cfdab110298 100644 (file)
@@ -49,6 +49,7 @@ sub getsetup () {
                plugin => {
                        safe => 1,
                        rebuild => undef,
+                       section => "core",
                },
                rss => {
                        type => "boolean",
@@ -159,7 +160,7 @@ sub preprocess_inline (@) {
        my $rss=(($config{rss} || $config{allowrss}) && exists $params{rss}) ? yesno($params{rss}) : $config{rss};
        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=! $nested && (exists $params{feeds} ? yesno($params{feeds}) : !$quick);
+       my $feeds=! $nested && (exists $params{feeds} ? yesno($params{feeds}) : !$quick && ! $raw);
        my $emptyfeeds=exists $params{emptyfeeds} ? yesno($params{emptyfeeds}) : 1;
        my $feedonly=yesno($params{feedonly});
        if (! exists $params{show} && ! $archive) {
@@ -298,7 +299,7 @@ sub preprocess_inline (@) {
            (exists $params{postform} && yesno($params{postform}))) &&
            IkiWiki->can("cgi_editpage")) {
                # Add a blog post form, with feed buttons.
-               my $formtemplate=template("blogpost.tmpl", blind_cache => 1);
+               my $formtemplate=template_depends("blogpost.tmpl", $params{page}, blind_cache => 1);
                $formtemplate->param(cgiurl => $config{cgiurl});
                $formtemplate->param(rootpage => rootpage(%params));
                $formtemplate->param(rssurl => $rssurl) if $feeds && $rss;
@@ -319,19 +320,28 @@ sub preprocess_inline (@) {
        }
        elsif ($feeds && !$params{preview} && ($emptyfeeds || @feedlist)) {
                # Add feed buttons.
-               my $linktemplate=template("feedlink.tmpl", blind_cache => 1);
+               my $linktemplate=template_depends("feedlink.tmpl", $params{page}, blind_cache => 1);
                $linktemplate->param(rssurl => $rssurl) if $rss;
                $linktemplate->param(atomurl => $atomurl) if $atom;
                $ret.=$linktemplate->output;
        }
        
        if (! $feedonly) {
-               require HTML::Template;
-               my @params=IkiWiki::template_params($params{template}.".tmpl", blind_cache => 1);
-               if (! @params) {
-                       error sprintf(gettext("nonexistant template %s"), $params{template});
+               my $template;
+               if (! $raw) {
+                       # cannot use wiki pages as templates; template not sanitized due to
+                       # format hook hack
+                       eval {
+                               $template=template_depends($params{template}.".tmpl", $params{page},
+                                       blind_cache => 1);
+                       };
+                       if ($@) {
+                               error gettext("failed to process template:")." $@";
+                       }
+                       if (! $template) {
+                               error sprintf(gettext("template %s not found"), $params{template}.".tmpl");
+                       }
                }
-               my $template=HTML::Template->new(@params) unless $raw;
                my $needcontent=$raw || (!($archive && $quick) && $template->query(name => 'content'));
        
                foreach my $page (@list) {
@@ -348,10 +358,11 @@ sub preprocess_inline (@) {
                                $template->param(pageurl => urlto($page, $params{destpage}));
                                $template->param(inlinepage => $page);
                                $template->param(title => pagetitle(basename($page)));
-                               $template->param(ctime => displaytime($pagectime{$page}, $params{timeformat}));
+                               $template->param(ctime => displaytime($pagectime{$page}, $params{timeformat}, 1));
                                $template->param(mtime => displaytime($pagemtime{$page}, $params{timeformat}));
                                $template->param(first => 1) if $page eq $list[0];
                                $template->param(last => 1) if $page eq $list[$#list];
+                               $template->param(html5 => $config{html5});
        
                                if ($actions) {
                                        my $file = $pagesources{$page};
@@ -465,6 +476,13 @@ sub get_inline_content ($$) {
                       filter($page, $destpage,
                       readfile(srcfile($file))))));
                $nested--;
+               if (isinternal($page)) {
+                       # make inlined text of internal pages searchable
+                       run_hooks(indexhtml => sub {
+                               shift->(page => $page, destpage => $page,
+                                       content => $ret);
+                       });
+               }
        }
        
        if ($cached_destpage ne $destpage) {
@@ -490,16 +508,6 @@ sub date_822 ($) {
        return $ret;
 }
 
-sub date_3339 ($) {
-       my $time=shift;
-
-       my $lc_time=POSIX::setlocale(&POSIX::LC_TIME);
-       POSIX::setlocale(&POSIX::LC_TIME, "C");
-       my $ret=POSIX::strftime("%Y-%m-%dT%H:%M:%SZ", gmtime($time));
-       POSIX::setlocale(&POSIX::LC_TIME, $lc_time);
-       return $ret;
-}
-
 sub absolute_urls ($$) {
        # sucky sub because rss sucks
        my $content=shift;
@@ -533,7 +541,7 @@ sub genfeed ($$$$$@) {
        
        my $url=URI->new(encode_utf8(urlto($page,"",1)));
        
-       my $itemtemplate=template($feedtype."item.tmpl", blind_cache => 1);
+       my $itemtemplate=template_depends($feedtype."item.tmpl", $page, blind_cache => 1);
        my $content="";
        my $lasttime = 0;
        foreach my $p (@pages) {
@@ -552,7 +560,8 @@ sub genfeed ($$$$$@) {
 
                if (exists $pagestate{$p}) {
                        if (exists $pagestate{$p}{meta}{guid}) {
-                               $itemtemplate->param(guid => $pagestate{$p}{meta}{guid});
+                               eval q{use HTML::Entities};
+                               $itemtemplate->param(guid => HTML::Entities::encode_numeric($pagestate{$p}{meta}{guid}));
                        }
 
                        if (exists $pagestate{$p}{meta}{updated}) {
@@ -596,7 +605,7 @@ sub genfeed ($$$$$@) {
                $lasttime = $pagemtime{$p} if $pagemtime{$p} > $lasttime;
        }
 
-       my $template=template($feedtype."page.tmpl", blind_cache => 1);
+       my $template=template_depends($feedtype."page.tmpl", $page, blind_cache => 1);
        $template->param(
                title => $page ne "index" ? pagetitle($page) : $config{wikiname},
                wikiname => $config{wikiname},
index 4c1add9853a3b4053f34b8d927e52ea0e7e4d1f4..f6c3573f75f5508dc810464162e9fb9a1ad8f527 100644 (file)
@@ -7,6 +7,9 @@ use IkiWiki 3.00;
 
 my $link_regexp;
 
+my $email_regexp = qr/^.+@.+$/;
+my $url_regexp = qr/^(?:[^:]+:\/\/|mailto:).*/i;
+
 sub import {
        hook(type => "getsetup", id => "link", call => \&getsetup);
        hook(type => "checkconfig", id => "link", call => \&checkconfig);
@@ -20,6 +23,7 @@ sub getsetup () {
                plugin => {
                        safe => 1,
                        rebuild => 1,
+                       section => "core",
                },
 }
 
@@ -56,10 +60,56 @@ sub checkconfig () {
                        )?                      # optional
 
                        \]\]                    # end of link
-               }x,
+               }x;
        }
 }
 
+sub is_externallink ($$;$$) {
+       my $page = shift;
+       my $url = shift;
+       my $anchor = shift;
+       my $force = shift;
+       
+       if (defined $anchor) {
+               $url.="#".$anchor;
+       }
+
+       if (! $force && $url =~ /$email_regexp/) {
+               # url looks like an email address, so we assume it
+               # is supposed to be an external link if there is no
+               # page with that name.
+               return (! (bestlink($page, linkpage($url))))
+       }
+
+       return ($url =~ /$url_regexp/)
+}
+
+sub externallink ($$;$) {
+       my $url = shift;
+       my $anchor = shift;
+       my $pagetitle = shift;
+
+       if (defined $anchor) {
+               $url.="#".$anchor;
+       }
+
+       # build pagetitle
+       if (! $pagetitle) {
+               $pagetitle = $url;
+               # use only the email address as title for mailto: urls
+               if ($pagetitle =~ /^mailto:.*/) {
+                       $pagetitle =~ s/^mailto:([^?]+).*/$1/;
+               }
+       }
+
+       if ($url !~ /$url_regexp/) {
+               # handle email addresses (without mailto:)
+               $url = "mailto:" . $url;
+       }
+
+       return "<a href=\"$url\">$pagetitle</a>";
+}
+
 sub linkify (@) {
        my %params=@_;
        my $page=$params{page};
@@ -68,13 +118,17 @@ sub linkify (@) {
        $params{content} =~ s{(\\?)$link_regexp}{
                defined $2
                        ? ( $1 
-                               ? "[[$2|$3".($4 ? "#$4" : "")."]]" 
-                               : htmllink($page, $destpage, linkpage($3),
-                                       anchor => $4, linktext => pagetitle($2)))
+                               ? "[[$2|$3".(defined $4 ? "#$4" : "")."]]" 
+                               : is_externallink($page, $3, $4)
+                                       ? externallink($3, $4, $2)
+                                       : htmllink($page, $destpage, linkpage($3),
+                                               anchor => $4, linktext => pagetitle($2)))
                        : ( $1 
-                               ? "[[$3".($4 ? "#$4" : "")."]]"
-                               : htmllink($page, $destpage, linkpage($3),
-                                       anchor => $4))
+                               ? "[[$3".(defined $4 ? "#$4" : "")."]]"
+                               : is_externallink($page, $3, $4)
+                                       ? externallink($3, $4)
+                                       : htmllink($page, $destpage, linkpage($3),
+                                               anchor => $4))
        }eg;
        
        return $params{content};
@@ -86,7 +140,9 @@ sub scan (@) {
        my $content=$params{content};
 
        while ($content =~ /(?<!\\)$link_regexp/g) {
-               add_link($page, linkpage($2));
+               if (! is_externallink($page, $2, $3, 1)) {
+                       add_link($page, linkpage($2));
+               }
        }
 }
 
@@ -97,24 +153,26 @@ sub renamepage (@) {
        my $new=$params{newpage};
 
        $params{content} =~ s{(?<!\\)$link_regexp}{
-               my $linktext=$2;
-               my $link=$linktext;
-               if (bestlink($page, linkpage($linktext)) eq $old) {
-                       $link=pagetitle($new, 1);
-                       $link=~s/ /_/g;
-                       if ($linktext =~ m/.*\/*?[A-Z]/) {
-                               # preserve leading cap of last component
-                               my @bits=split("/", $link);
-                               $link=join("/", @bits[0..$#bits-1], ucfirst($bits[$#bits]));
-                       }
-                       if (index($linktext, "/") == 0) {
-                               # absolute link
-                               $link="/$link";
+               if (! is_externallink($page, $2, $3)) {
+                       my $linktext=$2;
+                       my $link=$linktext;
+                       if (bestlink($page, linkpage($linktext)) eq $old) {
+                               $link=pagetitle($new, 1);
+                               $link=~s/ /_/g;
+                               if ($linktext =~ m/.*\/*?[A-Z]/) {
+                                       # preserve leading cap of last component
+                                       my @bits=split("/", $link);
+                                       $link=join("/", @bits[0..$#bits-1], ucfirst($bits[$#bits]));
+                               }
+                               if (index($linktext, "/") == 0) {
+                                       # absolute link
+                                       $link="/$link";
+                               }
                        }
+                       defined $1
+                               ? ( "[[$1|$link".($3 ? "#$3" : "")."]]" )
+                               : ( "[[$link".   ($3 ? "#$3" : "")."]]" )
                }
-               defined $1
-                       ? ( "[[$1|$link".($3 ? "#$3" : "")."]]" )
-                       : ( "[[$link".   ($3 ? "#$3" : "")."]]" )
        }eg;
 
        return $params{content};
index 28acbda32abdbb4a9abd022d96a9906b81e987b7..ac26e072e9dc7afa18ad33d5fa2049d347f291bb 100644 (file)
@@ -9,7 +9,6 @@ use IPC::Open2;
 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 () {
@@ -17,38 +16,18 @@ sub getsetup () {
                plugin => {
                        safe => 1,
                        rebuild => undef,
+                       section => "widget",
                },
 }
 
 my $mapnum=0;
-my %maps;
 
 sub preprocess (@) {
        my %params=@_;
 
        $params{pages}="*" unless defined $params{pages};
        
-       # Can't just return the linkmap here, since the htmlscrubber
-       # scrubs out all <object> tags (with good reason!)
-       # Instead, insert a placeholder tag, which will be expanded during
-       # formatting.
        $mapnum++;
-       $maps{$mapnum}=\%params;
-       return "<div class=\"linkmap$mapnum\"></div>";
-}
-
-sub format (@) {
-        my %params=@_;
-
-       $params{content}=~s/<div class=\"linkmap(\d+)"><\/div>/genmap($1)/eg;
-
-        return $params{content};
-}
-
-sub genmap ($) {
-       my $mapnum=shift;
-       return "" unless exists $maps{$mapnum};
-       my %params=%{$maps{$mapnum}};
        my $connected=IkiWiki::yesno($params{connected});
 
        # Get all the items to map.
@@ -102,10 +81,10 @@ sub genmap ($) {
        close OUT || error gettext("failed to run dot");
 
        local $/=undef;
-       my $ret="<object data=\"".urlto($dest, $params{destpage}).
-              "\" type=\"image/png\" usemap=\"#linkmap$mapnum\">\n".
-               <IN>.
-               "</object>";
+       my $ret="<img src=\"".urlto($dest, $params{destpage}).
+              "\" alt=\"".gettext("linkmap").
+              "\" usemap=\"#linkmap$mapnum\" />\n".
+               <IN>;
        close IN || error gettext("failed to run dot");
        
        waitpid $pid, 0;
index 09f08c5671ad82a7562a558342723669e5614641..8a67f716026003e8b00135f4de5f1f7da60794a2 100644 (file)
@@ -19,6 +19,7 @@ sub getsetup () {
                plugin => {
                        safe => 1,
                        rebuild => undef,
+                       section => "widget",
                },
                directive_description_dir => {
                        type => "string",
index 74ddbb1537929189206f675fdb49bfbf9247837c..5b50fd11509c07cf301b6f9a500331bff4392f93 100644 (file)
@@ -15,6 +15,7 @@ sub getsetup () {
                plugin => {
                        safe => 1,
                        rebuild => 0,
+                       section => "auth",
                },
                locked_pages => {
                        type => "pagespec",
@@ -37,7 +38,7 @@ sub canedit ($$) {
        if (defined $config{locked_pages} && length $config{locked_pages} &&
            pagespec_match($page, $config{locked_pages},
                    user => $session->param("name"),
-                   ip => $ENV{REMOTE_ADDR},
+                   ip => $session->remote_addr(),
            )) {
                if ((! defined $user ||
                    ! IkiWiki::userinfo_get($session->param("name"), "regdate")) &&
index 788b9682706c9e3a303b0920267e8ea20061305e..ce3ac1d24e93be888ca9e81f597f55d8b2f41424 100644 (file)
@@ -21,6 +21,7 @@ sub getsetup () {
                plugin => {
                        safe => 1,
                        rebuild => undef,
+                       section => "widget",
                },
 }
 
index 3de59ef3d036d56f7fa4876f8a1020ad59d994aa..b892eabee29be50387fa493baafd5dbd6d1024a8 100644 (file)
@@ -16,6 +16,7 @@ sub getsetup () {
                plugin => {
                        safe => 1,
                        rebuild => 1, # format plugin
+                       section => "format",
                },
                multimarkdown => {
                        type => "boolean",
index 11fdec529373c6b430a8e77bebb2c0a3aa6972b7..59dc63b4e994511e2d0c67893fb91f7dc098b36d 100644 (file)
@@ -20,6 +20,7 @@ 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);
+       hook(type => "rcs", id => "rcs_getmtime", call => \&rcs_getmtime);
 }
 
 sub checkconfig () {
@@ -36,6 +37,7 @@ sub getsetup () {
                plugin => {
                        safe => 0, # rcs plugin
                        rebuild => undef,
+                       section => "rcs",
                },
                mercurial_wrapper => {
                        type => "string",
@@ -124,26 +126,26 @@ sub rcs_prepedit ($) {
        return "";
 }
 
-sub rcs_commit ($$$;$$) {
-       my ($file, $message, $rcstoken, $user, $ipaddr) = @_;
+sub rcs_commit (@) {
+       my %params=@_;
 
-       if (defined $user) {
-               $user = IkiWiki::possibly_foolish_untaint($user);
-       }
-       elsif (defined $ipaddr) {
-               $user = "Anonymous from ".IkiWiki::possibly_foolish_untaint($ipaddr);
-       }
-       else {
-               $user = "Anonymous";
+       my $user="Anonymous";
+       if (defined $params{session}) {
+               if (defined $params{session}->param("name")) {
+                       $user = $params{session}->param("name");
+               }
+               elsif (defined $params{session}->remote_addr()) {
+                       $user = "Anonymous from ".$params{session}->remote_addr();
+               }
        }
 
-       $message = IkiWiki::possibly_foolish_untaint($message);
-       if (! length $message) {
-               $message = "no message given";
+       if (! length $params{message}) {
+               $params{message} = "no message given";
        }
 
        my @cmdline = ("hg", "-q", "-R", $config{srcdir}, "commit", 
-                      "-m", $message, "-u", $user);
+                      "-m", IkiWiki::possibly_foolish_untaint($params{message}),
+                      "-u", IkiWiki::possibly_foolish_untaint($user));
        if (system(@cmdline) != 0) {
                warn "'@cmdline' failed: $!";
        }
@@ -151,10 +153,10 @@ sub rcs_commit ($$$;$$) {
        return undef; # success
 }
 
-sub rcs_commit_staged ($$$) {
+sub rcs_commit_staged (@) {
        # Commits all staged changes. Changes can be staged using rcs_add,
        # rcs_remove, and rcs_rename.
-       my ($message, $user, $ipaddr)=@_;
+       my %params=@_;
        
        error("rcs_commit_staged not implemented for mercurial"); # TODO
 }
@@ -234,15 +236,13 @@ sub rcs_diff ($) {
 sub rcs_getctime ($) {
        my ($file) = @_;
 
-       # XXX filename passes through the shell here, should try to avoid
-       # that just in case
        my @cmdline = ("hg", "-R", $config{srcdir}, "log", "-v",
                "--style", "default", "$config{srcdir}/$file");
-       open (my $out, "@cmdline |");
+       open (my $out, "-|", @cmdline);
 
-       my @log = mercurial_log($out);
+       my @log = (mercurial_log($out));
 
-       if (length @log < 1) {
+       if (@log < 1) {
                return 0;
        }
 
@@ -253,4 +253,8 @@ sub rcs_getctime ($) {
        return $ctime;
 }
 
+sub rcs_getmtime ($) {
+       error "rcs_getmtime is not implemented for mercurial\n"; # TODO
+}
+
 1
index 55c9ddbd1482f8d47007c4e1b66cf2ea6d2f2332..7d68a9b2dc4a9adc990042d07e12205850c5e3fd 100644 (file)
@@ -20,6 +20,7 @@ sub getsetup () {
                plugin => {
                        safe => 1,
                        rebuild => undef,
+                       section => "core",
                },
 }
 
@@ -87,15 +88,21 @@ sub preprocess (@) {
 
        # Metadata collection that needs to happen during the scan pass.
        if ($key eq 'title') {
-               $pagestate{$page}{meta}{title}=HTML::Entities::encode_numeric($value);
+               $pagestate{$page}{meta}{title}=$value;
+               if (exists $params{sortas}) {
+                       $pagestate{$page}{meta}{titlesort}=$params{sortas};
+               }
+               else {
+                       delete $pagestate{$page}{meta}{titlesort};
+               }
                return "";
        }
        elsif ($key eq 'description') {
-               $pagestate{$page}{meta}{description}=HTML::Entities::encode_numeric($value);
+               $pagestate{$page}{meta}{description}=$value;
                # fallthrough
        }
        elsif ($key eq 'guid') {
-               $pagestate{$page}{meta}{guid}=HTML::Entities::encode_numeric($value);
+               $pagestate{$page}{meta}{guid}=$value;
                # fallthrough
        }
        elsif ($key eq 'license') {
@@ -115,6 +122,12 @@ sub preprocess (@) {
        }
        elsif ($key eq 'author') {
                $pagestate{$page}{meta}{author}=$value;
+               if (exists $params{sortas}) {
+                       $pagestate{$page}{meta}{authorsort}=$params{sortas};
+               }
+               else {
+                       delete $pagestate{$page}{meta}{authorsort};
+               }
                # fallthorough
        }
        elsif ($key eq 'authorurl') {
@@ -263,15 +276,20 @@ sub pagetemplate (@) {
                $template->param(meta => join("\n", grep { (! $seen{$_}) && ($seen{$_}=1) } @{$metaheaders{$page}}));
        }
        if (exists $pagestate{$page}{meta}{title} && $template->query(name => "title")) {
-               $template->param(title => $pagestate{$page}{meta}{title});
+               $template->param(title => HTML::Entities::encode_numeric($pagestate{$page}{meta}{title}));
                $template->param(title_overridden => 1);
        }
 
-       foreach my $field (qw{author authorurl description permalink}) {
+       foreach my $field (qw{author authorurl permalink}) {
                $template->param($field => $pagestate{$page}{meta}{$field})
                        if exists $pagestate{$page}{meta}{$field} && $template->query(name => $field);
        }
 
+       foreach my $field (qw{description}) {
+               $template->param($field => HTML::Entities::encode_numeric($pagestate{$page}{meta}{$field}))
+                       if exists $pagestate{$page}{meta}{$field} && $template->query(name => $field);
+       }
+
        foreach my $field (qw{license copyright}) {
                if (exists $pagestate{$page}{meta}{$field} && $template->query(name => $field) &&
                    ($page eq $destpage || ! exists $pagestate{$destpage}{meta}{$field} ||
@@ -281,6 +299,33 @@ sub pagetemplate (@) {
        }
 }
 
+sub get_sort_key {
+       my $page = shift;
+       my $meta = shift;
+
+       # e.g. titlesort (also makes sense for author)
+       my $key = $pagestate{$page}{meta}{$meta . "sort"};
+       return $key if defined $key;
+
+       # e.g. title
+       $key = $pagestate{$page}{meta}{$meta};
+       return $key if defined $key;
+
+       # fall back to closer-to-core things
+       if ($meta eq 'title') {
+               return pagetitle(IkiWiki::basename($page));
+       }
+       elsif ($meta eq 'date') {
+               return $IkiWiki::pagectime{$page};
+       }
+       elsif ($meta eq 'updated') {
+               return $IkiWiki::pagemtime{$page};
+       }
+       else {
+               return '';
+       }
+}
+
 sub match {
        my $field=shift;
        my $page=shift;
@@ -301,11 +346,11 @@ sub match {
                        return IkiWiki::SuccessReason->new("$re matches $field of $page", $page => $IkiWiki::DEPEND_CONTENT, "" => 1);
                }
                else {
-                       return IkiWiki::FailReason->new("$re does not match $field of $page", "" => 1);
+                       return IkiWiki::FailReason->new("$re does not match $field of $page", $page => $IkiWiki::DEPEND_CONTENT, "" => 1);
                }
        }
        else {
-               return IkiWiki::FailReason->new("$page does not have a $field", "" => 1);
+               return IkiWiki::FailReason->new("$page does not have a $field", $page => $IkiWiki::DEPEND_CONTENT);
        }
 }
 
@@ -331,4 +376,31 @@ sub match_copyright ($$;@) {
        IkiWiki::Plugin::meta::match("copyright", @_);
 }
 
+sub match_guid ($$;@) {
+       IkiWiki::Plugin::meta::match("guid", @_);
+}
+
+package IkiWiki::SortSpec;
+
+sub cmp_meta {
+       my $meta = shift;
+       error(gettext("sort=meta requires a parameter")) unless defined $meta;
+
+       if ($meta eq 'updated' || $meta eq 'date') {
+               return IkiWiki::Plugin::meta::get_sort_key($a, $meta)
+                       <=>
+                       IkiWiki::Plugin::meta::get_sort_key($b, $meta);
+       }
+
+       return IkiWiki::Plugin::meta::get_sort_key($a, $meta)
+               cmp
+               IkiWiki::Plugin::meta::get_sort_key($b, $meta);
+}
+
+# A prototype of how sort=title could behave in 4.0 or something
+sub cmp_meta_title {
+       $_[0] = 'title';
+       return cmp_meta(@_);
+}
+
 1
index d0a6107efe8baa6cadd540eb710f5f8f422c6778..f54d94ad52366110e29f20575672bcd0fcc4413c 100644 (file)
@@ -15,6 +15,7 @@ sub getsetup () {
                plugin => {
                        safe => 1,
                        rebuild => 1,
+                       section => "web",
                },
                mirrorlist => {
                        type => "string",
@@ -39,7 +40,7 @@ sub pagetemplate (@) {
 
 sub mirrorlist ($) {
        my $page=shift;
-       return "<p>".
+       return ($config{html5} ? '<nav id="mirrorlist">' : '<div>').
                (keys %{$config{mirrorlist}} > 1 ? gettext("Mirrors") : gettext("Mirror")).
                ": ".
                join(", ",
@@ -49,7 +50,7 @@ sub mirrorlist ($) {
                                qq{">$_</a>}
                        } keys %{$config{mirrorlist}}
                ).
-               "</p>";
+               ($config{html5} ? '</nav>' : '</div>');
 }
 
 1
index 2555927b7992fb8e042a9f145ce1a82cded5fcb4..5957833fc2de44dc20484f616f8813ff0306400b 100644 (file)
@@ -15,11 +15,13 @@ sub getsetup () {
                plugin => {
                        safe => 1,
                        rebuild => 0,
+                       section => "auth",
                },
-               moderate_users => {
-                       type => 'boolean',
-                       example => 1,
-                       description => 'Moderate comments of logged-in users?',
+               moderate_pagespec => {
+                       type => 'pagespec',
+                       example => '*',
+                       description => 'PageSpec matching users or comment locations to moderate',
+                       link => 'ikiwiki/PageSpec',
                        safe => 1,
                        rebuild => 0,
                },
@@ -31,14 +33,32 @@ sub checkcontent (@) {
        # only handle comments  
        return undef unless pagespec_match($params{page}, "postcomment(*)",
                                location => $params{page});
+       
+       # backwards compatability
+       if (exists $config{moderate_users} &&
+           ! exists $config{moderate_pagespec}) {
+               $config{moderate_pagespec} = $config{moderate_users}
+                       ? "!admin()"
+                       : "!user(*)";
+       }
 
-       # admins and maybe users can comment w/o moderation
-       my $session=$params{session};
-       my $user=$session->param("name") if $session;
-       return undef if defined $user && (IkiWiki::is_admin($user) ||
-               (exists $config{moderate_users} && ! $config{moderate_users}));
+       # default is to moderate all except admins
+       if (! exists $config{moderate_pagespec}) {
+               $config{moderate_pagespec}="!admin()";
+       }
 
-       return gettext("comment needs moderation");
+       my $session=$params{session};
+       my $user=$session->param("name");
+       if (pagespec_match($params{page}, $config{moderate_pagespec},
+                       location => $params{page},
+                       (defined $user ? (user => $user) : ()),
+                       (defined $session->remote_addr() ? (ip => $session->remote_addr()) : ()),
+       )) {
+               return gettext("comment needs moderation");
+       }
+       else {
+               return undef;
+       }
 }
 
 1
index c717ceefb71b2ffc24c432711400a7548aa03a40..95fbcee7648c56c0825d714d15ad7bea37e93621 100644 (file)
@@ -23,6 +23,7 @@ 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);
+       hook(type => "rcs", id => "rcs_getmtime", call => \&rcs_getmtime);
 }
 
 sub checkconfig () {
@@ -68,6 +69,7 @@ sub getsetup () {
                plugin => {
                        safe => 0, # rcs plugin
                        rebuild => undef,
+                       section => "rcs",
                },
                mtn_wrapper => {
                        type => "string",
@@ -291,31 +293,33 @@ sub rcs_prepedit ($) {
        return get_rev();
 }
 
-sub rcs_commit ($$$;$$) {
+sub commitauthor (@) {
+       my %params=@_;
+
+       if (defined $params{session}) {
+               if (defined $params{session}->param("name")) {
+                       return "Web user: " . $params{session}->param("name");
+               }
+               elsif (defined $params{session}->remote_addr()) {
+                       return "Web IP: " . $params{session}->remote_addr();
+               }
+       }
+       return "Web: Anonymous";
+}
+
+
+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.
-       my $file=shift;
-       my $message=shift;
-       my $rcstoken=shift;
-       my $user=shift;
-       my $ipaddr=shift;
-       my $author;
+       my %params=@_;
 
-       if (defined $user) {
-               $author="Web user: " . $user;
-       }
-       elsif (defined $ipaddr) {
-               $author="Web IP: " . $ipaddr;
-       }
-       else {
-               $author="Web: Anonymous";
-       }
+       my $author=IkiWiki::possibly_foolish_untaint(commitauthor(%params)),
 
        chdir $config{srcdir}
            or error("Cannot chdir to $config{srcdir}: $!");
 
-       my ($oldrev)= $rcstoken=~ m/^($sha1_pattern)$/; # untaint
+       my ($oldrev) = $params{token} =~ m/^($sha1_pattern)$/; # untaint
        my $rev = get_rev();
        if (defined $rev && defined $oldrev && $rev ne $oldrev) {
                my $automator = Monotone->new();
@@ -324,8 +328,8 @@ sub rcs_commit ($$$;$$) {
                # Something has been committed, has this file changed?
                my ($out, $err);
                $automator->setOpts("r", $oldrev, "r", $rev);
-               ($out, $err) = $automator->call("content_diff", $file);
-               debug("Problem committing $file") if ($err ne "");
+               ($out, $err) = $automator->call("content_diff", $params{file});
+               debug("Problem committing $params{file}") if ($err ne "");
                my $diff = $out;
                
                if ($diff) {
@@ -334,11 +338,11 @@ sub rcs_commit ($$$;$$) {
                        #
                        # first get the contents
                        debug("File changed: forming branch");
-                       my $newfile=readfile("$config{srcdir}/$file");
+                       my $newfile=readfile("$config{srcdir}/$params{file}");
                        
                        # then get the old content ID from the diff
-                       if ($diff !~ m/^---\s$file\s+($sha1_pattern)$/m) {
-                               error("Unable to find previous file ID for $file");
+                       if ($diff !~ m/^---\s$params{file}\s+($sha1_pattern)$/m) {
+                               error("Unable to find previous file ID for $params{file}");
                        }
                        my $oldFileID = $1;
 
@@ -349,13 +353,13 @@ sub rcs_commit ($$$;$$) {
                        my $branch = $1;
 
                        # then put the new content into the DB (and record the new content ID)
-                       my $newRevID = commit_file_to_new_rev($automator, $file, $oldFileID, $newfile, $oldrev, $branch, $author, $message);
+                       my $newRevID = commit_file_to_new_rev($automator, $params{file}, $oldFileID, $newfile, $oldrev, $branch, $author, $params{message});
 
                        $automator->close();
 
                        # if we made it to here then the file has been committed... revert the local copy
-                       if (system("mtn", "--root=$config{mtnrootdir}", "revert", $file) != 0) {
-                               debug("Unable to revert $file after merge on conflicted commit!");
+                       if (system("mtn", "--root=$config{mtnrootdir}", "revert", $params{file}) != 0) {
+                               debug("Unable to revert $params{file} after merge on conflicted commit!");
                        }
                        debug("Divergence created! Attempting auto-merge.");
 
@@ -404,7 +408,7 @@ sub rcs_commit ($$$;$$) {
                                # for cleanup note, this relies on the fact
                                # that ikiwiki seems to call rcs_prepedit()
                                # again after we return
-                               return readfile("$config{srcdir}/$file");
+                               return readfile("$config{srcdir}/$params{file}");
                        }
                        return undef;
                }
@@ -416,11 +420,12 @@ sub rcs_commit ($$$;$$) {
 
        if (system("mtn", "--root=$config{mtnrootdir}", "commit", "--quiet",
                   "--author", $author, "--key", $config{mtnkey}, "-m",
-                  IkiWiki::possibly_foolish_untaint($message), $file) != 0) {
+                  IkiWiki::possibly_foolish_untaint($params{message}),
+                  $params{file}) != 0) {
                debug("Traditional commit failed! Returning data as conflict.");
-               my $conflict=readfile("$config{srcdir}/$file");
+               my $conflict=readfile("$config{srcdir}/$params{file}");
                if (system("mtn", "--root=$config{mtnrootdir}", "revert",
-                          "--quiet", $file) != 0) {
+                          "--quiet", $params{file}) != 0) {
                        debug("monotone revert failed");
                }
                return $conflict;
@@ -436,32 +441,21 @@ sub rcs_commit ($$$;$$) {
        return undef # success
 }
 
-sub rcs_commit_staged ($$$) {
+sub rcs_commit_staged (@) {
        # Commits all staged changes. Changes can be staged using rcs_add,
        # rcs_remove, and rcs_rename.
-       my ($message, $user, $ipaddr)=@_;
-       
+       my %params=@_;
+
        # Note - this will also commit any spurious changes that happen to be
        # lying around in the working copy.  There shouldn't be any, but...
        
        chdir $config{srcdir}
            or error("Cannot chdir to $config{srcdir}: $!");
 
-       my $author;
-
-       if (defined $user) {
-               $author="Web user: " . $user;
-       }
-       elsif (defined $ipaddr) {
-               $author="Web IP: " . $ipaddr;
-       }
-       else {
-               $author="Web: Anonymous";
-       }
-
        if (system("mtn", "--root=$config{mtnrootdir}", "commit", "--quiet",
-                  "--author", $author, "--key", $config{mtnkey}, "-m",
-                  IkiWiki::possibly_foolish_untaint($message)) != 0) {
+                  "--author", IkiWiki::possibly_foolish_untaint(commitauthor(%params)),
+                  "--key", $config{mtnkey}, "-m",
+                  IkiWiki::possibly_foolish_untaint($params{message})) != 0) {
                error("Monotone commit failed");
        }
 }
@@ -558,7 +552,8 @@ sub rcs_recentchanges ($) {
                                        # from the changelog
                                        if ($cert->{key} eq $config{mtnkey}) {
                                                $committype = "web";
-                                       } else {
+                                       }
+                                       else {
                                                $committype = "mtn";
                                        }
                                } elsif ($cert->{name} eq "date") {
@@ -691,4 +686,8 @@ sub rcs_getctime ($) {
        return $date;
 }
 
+sub rcs_getmtime ($) {
+       error "rcs_getmtime is not implemented for monotone\n"; # TODO
+}
+
 1
index 77d5fb0772846dde323fd78a809f936365224fa5..266c8e1d0937dc9aefc677d536cc26a8d18e66c7 100644 (file)
@@ -17,6 +17,7 @@ sub getsetup () {
                plugin => {
                        safe => 1,
                        rebuild => undef,
+                       section => "widget",
                },
 }
 
index bfe84c0e1ebc15961986ce57a59be9fc26c53290..a3bb6240ef3024e2f33b855137a79083936b4e42 100644 (file)
@@ -18,6 +18,7 @@ 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);
+       hook(type => "rcs", id => "rcs_getmtime", call => \&rcs_getmtime);
 }
 
 sub getsetup () {
@@ -25,6 +26,7 @@ sub getsetup () {
                plugin => {
                        safe => 0, # rcs plugin
                        rebuild => 0,
+                       section => "rcs",
                },
 }
 
@@ -36,13 +38,11 @@ sub rcs_prepedit ($) {
        return ""
 }
 
-sub rcs_commit ($$$;$$) {
-       my ($file, $message, $rcstoken, $user, $ipaddr) = @_;
+sub rcs_commit (@) {
        return undef # success
 }
 
-sub rcs_commit_staged ($$$) {
-       my ($message, $user, $ipaddr)=@_;
+sub rcs_commit_staged (@) {
        return undef # success
 }
 
@@ -62,7 +62,11 @@ sub rcs_diff ($) {
 }
 
 sub rcs_getctime ($) {
-       error gettext("getctime not implemented");
+       return 0;
+}
+
+sub rcs_getmtime ($) {
+       return 0;
 }
 
 1
index 4517ff88b6086964421324216d0a536b1bda771f..2805f60efdb6d415a19aeb17195df8ff2543487b 100644 (file)
@@ -7,7 +7,8 @@ use IkiWiki 3.00;
 
 sub import {
        hook(type => "getsetup", id => "opendiscussion", call => \&getsetup);
-       hook(type => "canedit", id => "opendiscussion", call => \&canedit);
+       hook(type => "canedit", id => "opendiscussion", call => \&canedit,
+               first => 1);
 }
 
 sub getsetup () {
@@ -15,6 +16,7 @@ sub getsetup () {
                plugin => {
                        safe => 1,
                        rebuild => 0,
+                       section => "auth",
                },
 }
 
@@ -24,6 +26,7 @@ sub canedit ($$) {
        my $session=shift;
 
        return "" if $page=~/(\/|^)\Q$config{discussionpage}\E$/i;
+       return "" if pagespec_match($page, "postcomment(*)");
        return undef;
 }
 
index dc0e0f48ee98e70313abce4d195092989e5537c6..d393afd2363be34a455d76f9b4442a54d00366ce 100644 (file)
@@ -7,18 +7,30 @@ use strict;
 use IkiWiki 3.00;
 
 sub import {
-       hook(type => "getopt", id => "openid", call => \&getopt);
+       add_underlay("openid-selector");
+       hook(type => "checkconfig", id => "openid", call => \&checkconfig);
        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 () {
-       eval q{use Getopt::Long};
-       error($@) if $@;
-       Getopt::Long::Configure('pass_through');
-       GetOptions("openidsignup=s" => \$config{openidsignup});
+sub checkconfig () {
+       if ($config{cgi}) {
+               # Intercept normal signin form, so the openid selector
+               # can be displayed.
+               # 
+               # When other auth hooks are registered, give the selector
+               # a reference to the normal signin form.
+               require IkiWiki::CGI;
+               my $real_cgi_signin;
+               if (keys %{$IkiWiki::hooks{auth}} > 1) {
+                       $real_cgi_signin=\&IkiWiki::cgi_signin;
+               }
+               inject(name => "IkiWiki::cgi_signin", call => sub ($$) {
+                       openid_selector($real_cgi_signin, @_);
+               });
+       }
 }
 
 sub getsetup () {
@@ -26,16 +38,56 @@ sub getsetup () {
                plugin => {
                        safe => 1,
                        rebuild => 0,
+                       section => "auth",
                },
-               openidsignup => {
+               openid_realm => {
                        type => "string",
-                       example => "http://myopenid.com/",
-                       description => "an url where users can signup for an OpenID",
-                       safe => 1,
+                       description => "url pattern of openid realm (default is cgiurl)",
+                       safe => 0,
+                       rebuild => 0,
+               },
+               openid_cgiurl => {
+                       type => "string",
+                       description => "url to ikiwiki cgi to use for openid authentication (default is cgiurl)",
+                       safe => 0,
                        rebuild => 0,
                },
 }
 
+sub openid_selector {
+       my $real_cgi_signin=shift;
+        my $q=shift;
+        my $session=shift;
+
+       my $openid_url=$q->param('openid_identifier');
+       my $openid_error;
+
+       if (! load_openid_module()) {
+               if ($real_cgi_signin) {
+                       $real_cgi_signin->($q, $session);
+                       exit;
+               }
+               error(sprintf(gettext("failed to load openid module: "), @_));
+       }
+       elsif (defined $q->param("action") && $q->param("action") eq "verify") {
+               validate($q, $session, $openid_url, sub {
+                       $openid_error=shift;
+               });
+       }
+
+       my $template=IkiWiki::template("openid-selector.tmpl");
+       $template->param(
+               cgiurl => $config{cgiurl},
+               (defined $openid_error ? (openid_error => $openid_error) : ()),
+               (defined $openid_url ? (openid_url => $openid_url) : ()),
+               ($real_cgi_signin ? (nonopenidform => $real_cgi_signin->($q, $session, 1)) : ()),
+       );
+
+       IkiWiki::printheader($session);
+       print IkiWiki::misctemplate("signin", $template->output);
+       exit;
+}
+
 sub formbuilder_setup (@) {
        my %params=@_;
 
@@ -43,52 +95,14 @@ sub formbuilder_setup (@) {
        my $session=$params{session};
        my $cgi=$params{cgi};
        
-       if ($form->title eq "signin") {
-               # Give up if module is unavailable to avoid
-               # needing to depend on it.
-               eval q{use Net::OpenID::Consumer};
-               if ($@) {
-                       debug("unable to load Net::OpenID::Consumer, not enabling OpenID login ($@)");
-                       return;
-               }
-
-               # This avoids it displaying a redundant label for the
-               # OpenID fieldset.
-               $form->fieldsets("OpenID");
-
-               $form->field(
-                       name => "openid_url",
-                       label => gettext("Log in with")." ".htmllink("", "", "ikiwiki/OpenID", noimageinline => 1),
-                       fieldset => "OpenID",
-                       size => 30,
-                       comment => ($config{openidsignup} ? " | <a href=\"$config{openidsignup}\">".gettext("Get an OpenID")."</a>" : "")
-               );
-
-               # Handle submission of an OpenID as validation.
-               if ($form->submitted && $form->submitted eq "Login" &&
-                   defined $form->field("openid_url") && 
-                   length $form->field("openid_url")) {
-                       $form->field(
-                               name => "openid_url",
-                               validate => sub {
-                                       validate($cgi, $session, shift, $form);
-                               },
-                       );
-                       # Skip all other required fields in this case.
-                       foreach my $field ($form->field) {
-                               next if $field eq "openid_url";
-                               $form->field(name => $field, required => 0,
-                                       validate => '/.*/');
-                       }
-               }
-       }
-       elsif ($form->title eq "preferences") {
-               if (! defined $form->field(name => "name")) {
-                       $form->field(name => "OpenID", disabled => 1,
-                               value => $session->param("name"), 
-                               size => 50, force => 1,
-                               fieldset => "login");
-               }
+       if ($form->title eq "preferences" &&
+              IkiWiki::openiduser($session->param("name"))) {
+               $form->field(name => "openid_identifier", disabled => 1,
+                       label => htmllink("", "", "ikiwiki/OpenID", noimageinline => 1),
+                       value => $session->param("name"), 
+                       size => length($session->param("name")), force => 1,
+                       fieldset => "login");
+               $form->field(name => "email", type => "hidden");
        }
 }
 
@@ -96,15 +110,14 @@ sub validate ($$$;$) {
        my $q=shift;
        my $session=shift;
        my $openid_url=shift;
-       my $form=shift;
+       my $errhandler=shift;
 
        my $csr=getobj($q, $session);
 
        my $claimed_identity = $csr->claimed_identity($openid_url);
        if (! $claimed_identity) {
-               if ($form) {
-                       # Put the error in the form and fail validation.
-                       $form->field(name => "openid_url", comment => $csr->err);
+               if ($errhandler) {
+                       $errhandler->($csr->err);
                        return 0;
                }
                else {
@@ -112,9 +125,37 @@ sub validate ($$$;$) {
                }
        }
 
+       # Ask for client to provide a name and email, if possible.
+       # Try sreg and ax
+       if ($claimed_identity->can("set_extension_args")) {
+               $claimed_identity->set_extension_args(
+                       'http://openid.net/extensions/sreg/1.1',
+                       {
+                               optional => 'email,fullname,nickname',
+                       },
+               );
+               $claimed_identity->set_extension_args(
+                       'http://openid.net/srv/ax/1.0',
+                       {
+                               mode => 'fetch_request',
+                               'required' => 'email,fullname,nickname,firstname',
+                               'type.email' => "http://schema.openid.net/contact/email",
+                               'type.fullname' => "http://axschema.org/namePerson",
+                               'type.nickname' => "http://axschema.org/namePerson/friendly",
+                               'type.firstname' => "http://axschema.org/namePerson/first",
+                       },
+               );
+       }
+
+       my $cgiurl=$config{openid_cgiurl};
+       $cgiurl=$config{cgiurl} if ! defined $cgiurl;
+
+       my $trust_root=$config{openid_realm};
+       $trust_root=$cgiurl if ! defined $trust_root;
+
        my $check_url = $claimed_identity->check_url(
-               return_to => IkiWiki::cgiurl(do => "postsignin"),
-               trust_root => $config{cgiurl},
+               return_to => "$cgiurl?do=postsignin",
+               trust_root => $trust_root,
                delayed_return => 1,
        );
        # Redirect the user to the OpenID server, which will
@@ -138,6 +179,41 @@ sub auth ($$) {
                }
                elsif (my $vident = $csr->verified_identity) {
                        $session->param(name => $vident->url);
+
+                       my @extensions;
+                       if ($vident->can("signed_extension_fields")) {
+                               @extensions=grep { defined } (
+                                       $vident->signed_extension_fields('http://openid.net/extensions/sreg/1.1'),
+                                       $vident->signed_extension_fields('http://openid.net/srv/ax/1.0'),
+                               );
+                       }
+                       my $nickname;
+                       foreach my $ext (@extensions) {
+                               foreach my $field (qw{value.email email}) {
+                                       if (exists $ext->{$field} &&
+                                           defined $ext->{$field} &&
+                                           length $ext->{$field}) {
+                                               $session->param(email => $ext->{$field});
+                                               if (! defined $nickname &&
+                                                   $ext->{$field}=~/(.+)@.+/) {
+                                                       $nickname = $1;
+                                               }
+                                               last;
+                                       }
+                               }
+                               foreach my $field (qw{value.nickname nickname value.fullname fullname value.firstname}) {
+                                       if (exists $ext->{$field} &&
+                                           defined $ext->{$field} &&
+                                           length $ext->{$field}) {
+                                               $nickname=$ext->{$field};
+                                               last;
+                                       }
+                               }
+                       }
+                       if (defined $nickname) {
+                               $nickname=~s/\s+/_/g;
+                               $session->param(nickname => $nickname);
+                       }
                }
                else {
                        error("OpenID failure: ".$csr->err);
@@ -171,13 +247,26 @@ sub getobj ($$) {
                $secret=rand;
                $session->param(openid_secret => $secret);
        }
+       
+       my $cgiurl=$config{openid_cgiurl};
+       $cgiurl=$config{cgiurl} if ! defined $cgiurl;
 
        return Net::OpenID::Consumer->new(
                ua => $ua,
                args => $q,
                consumer_secret => sub { return shift()+$secret },
-               required_root => $config{cgiurl},
+               required_root => $cgiurl,
        );
 }
 
+sub load_openid_module {
+       # Give up if module is unavailable to avoid needing to depend on it.
+       eval q{use Net::OpenID::Consumer};
+       if ($@) {
+               debug("unable to load Net::OpenID::Consumer, not enabling OpenID login ($@)");
+               return;
+       }
+       return 1;
+}
+
 1
index 702943f87d1cb96927270a2b609de192a7488aa7..e3cc3c940882dd27ec7576f8ff8ee63eb8dd845e 100644 (file)
@@ -16,6 +16,7 @@ sub getsetup () {
                plugin => {
                        safe => 1,
                        rebuild => undef,
+                       section => "widget",
                },
 }
 
index 3ab2441bf7be971ab9a11e7f4469b9cba1809193..3801a6ec2417d225f3cf541a505ff79adedec8ef 100644 (file)
@@ -17,6 +17,7 @@ sub getsetup () {
                plugin => {
                        safe => 1,
                        rebuild => 1, # format plugin
+                       section => "format",
                },
 }
 
index 8d36f057eb0820a62c9704988d66fde75ccf6c4b..dd5de3c83102aac6b806eae75a2517c622ac10e2 100644 (file)
@@ -15,6 +15,7 @@ sub getsetup () {
                plugin => {
                        safe => 1,
                        rebuild => undef,
+                       section => "widget",
                },
 }
 
index 4313aa271e2f55259b04df7b7abfbd1a447ba1cb..17b26f7baa75ed3b3e68c95f310f6821227d0c89 100644 (file)
@@ -27,6 +27,7 @@ sub getsetup () {
                plugin => {
                        safe => 1,
                        rebuild => undef,
+                       section => "widget",
                },
 }
 
@@ -74,7 +75,7 @@ sub preprocess (@) {
        }
 
        if ($style eq 'table') {
-               return "<table class='pageStats'>\n".
+               return "<table class='".(exists $params{class} ? $params{class} : "pageStats")."'>\n".
                        join("\n", map {
                                "<tr><td>".
                                htmllink($params{page}, $params{destpage}, $_, noimageinline => 1).
@@ -86,16 +87,31 @@ sub preprocess (@) {
        else {
                # In case of misspelling, default to a page cloud
 
-               my $res = "<div class='pagecloud'>\n";
+               my $res;
+               if ($style eq 'list') {
+                       $res = "<ul class='".(exists $params{class} ? $params{class} : "list")."'>\n";
+               }
+               else {
+                       $res = "<div class='".(exists $params{class} ? $params{class} : "pagecloud")."'>\n";
+               }
                foreach my $page (sort keys %counts) {
                        next unless $counts{$page} > 0;
 
                        my $class = $classes[$counts{$page} * scalar(@classes) / ($max + 1)];
+                       
+                       $res.="<li>" if $style eq 'list';
                        $res .= "<span class=\"$class\">".
                                htmllink($params{page}, $params{destpage}, $page).
                                "</span>\n";
+                       $res.="</li>" if $style eq 'list';
+
+               }
+               if ($style eq 'list') {
+                       $res .= "</ul>\n";
+               }
+               else {
+                       $res .= "</div>\n";
                }
-               $res .= "</div>\n";
 
                return $res;
        }
index e678a057d2bdf9a03aa741f8bd019f39e8667bca..432613ddfe92ff1b25d2069db246e49ed72a2222 100644 (file)
@@ -16,12 +16,21 @@ sub getsetup () {
                plugin => {
                        safe => 1,
                        rebuild => 1,
+                       section => "core",
                },
 }
 
 sub parentlinks ($) {
        my $page=shift;
 
+       if (! length $page) {
+               # dynamic page
+               return {
+                       url => $config{url},
+                       page => $config{wikiname},
+               };
+       }
+
        my @ret;
        my $path="";
        my $title=$config{wikiname};
@@ -52,12 +61,11 @@ sub parentlinks ($) {
 
 sub pagetemplate (@) {
        my %params=@_;
-        my $page=$params{page};
         my $template=$params{template};
 
        if ($template->query(name => "parentlinks") ||
           $template->query(name => "has_parentlinks")) {
-               my @links=parentlinks($page);
+               my @links=parentlinks($params{page});
                $template->param(parentlinks => \@links);
                $template->param(has_parentlinks => (@links > 0));
        }
index 8cf5af51ed03d47ff90963dd1aece3c9ea773cbb..35ebd961f53e8da8e2a012d970f8d309d135a307 100644 (file)
@@ -19,6 +19,7 @@ sub getsetup () {
                plugin => {
                        safe => 1,
                        rebuild => 0,
+                       section => "auth",
                },
                account_creation_password => {
                        type => "string",
@@ -104,11 +105,13 @@ sub formbuilder_setup (@) {
        my $session=$params{session};
        my $cgi=$params{cgi};
 
-       if ($form->title eq "signin" || $form->title eq "register") {
+       my $do_register=defined $cgi->param("do") && $cgi->param("do") eq "register";
+
+       if ($form->title eq "signin" || $form->title eq "register" || $do_register) {
                $form->field(name => "name", required => 0);
                $form->field(name => "password", type => "password", required => 0);
                
-               if ($form->submitted eq "Register" || $form->submitted eq "Create Account") {
+               if ($form->submitted eq "Register" || $form->submitted eq "Create Account" || $do_register) {
                        $form->field(name => "confirm_password", type => "password");
                        $form->field(name => "account_creation_password", type => "password")
                                 if (defined $config{account_creation_password} &&
@@ -207,19 +210,34 @@ sub formbuilder_setup (@) {
                }
        }
        elsif ($form->title eq "preferences") {
-               $form->field(name => "name", disabled => 1, 
-                       value => $session->param("name"), force => 1,
-                       fieldset => "login");
-               $form->field(name => "password", type => "password",
-                       fieldset => "login",
-                       validate => sub {
-                               shift eq $form->field("confirm_password");
-                       }),
-               $form->field(name => "confirm_password", type => "password",
-                       fieldset => "login",
-                       validate => sub {
-                               shift eq $form->field("password");
-                       }),
+               my $user=$session->param("name");
+               if (! IkiWiki::openiduser($user)) {
+                       $form->field(name => "name", disabled => 1, 
+                               value => $user, force => 1,
+                               fieldset => "login");
+                       $form->field(name => "password", type => "password",
+                               fieldset => "login",
+                               validate => sub {
+                                       shift eq $form->field("confirm_password");
+                               });
+                       $form->field(name => "confirm_password", type => "password",
+                               fieldset => "login",
+                               validate => sub {
+                                       shift eq $form->field("password");
+                               });
+                       
+                       my $userpage=IkiWiki::userpage($user);
+                       if (exists $pagesources{$userpage}) {
+                               $form->text(gettext("Your user page: ").
+                                       htmllink("", "", $userpage,
+                                               noimageinline => 1));
+                       }
+                       else {
+                               $form->text("<a href=\"".
+                                       IkiWiki::cgiurl(do => "edit", page => $userpage).
+                                       "\">".gettext("Create your user page")."</a>");
+                       }
+               }
        }
 }
 
@@ -231,8 +249,10 @@ sub formbuilder (@) {
        my $cgi=$params{cgi};
        my $buttons=$params{buttons};
 
+       my $do_register=defined $cgi->param("do") && $cgi->param("do") eq "register";
+
        if ($form->title eq "signin" || $form->title eq "register") {
-               if ($form->submitted && $form->validate) {
+               if (($form->submitted && $form->validate) || $do_register) {
                        if ($form->submitted eq 'Login') {
                                $session->param("name", $form->field("name"));
                                IkiWiki::cgi_postsignin($cgi, $session);
@@ -277,7 +297,7 @@ sub formbuilder (@) {
                                        ),
                                        wikiurl => $config{url},
                                        wikiname => $config{wikiname},
-                                       REMOTE_ADDR => $ENV{REMOTE_ADDR},
+                                       remote_addr => $session->remote_addr(),
                                );
                                
                                eval q{use Mail::Sendmail};
@@ -295,7 +315,7 @@ sub formbuilder (@) {
                                $form->field(name => "name", required => 0);
                                push @$buttons, "Reset Password";
                        }
-                       elsif ($form->submitted eq "Register") {
+                       elsif ($form->submitted eq "Register" || $do_register) {
                                @$buttons="Create Account";
                        }
                }
@@ -336,6 +356,14 @@ sub sessioncgi ($$) {
                IkiWiki::cgi_prefs($q, $session);
                exit;
        }
+       elsif ($q->param("do") eq "register") {
+               # After registration, need to go somewhere, so show prefs page.
+               $session->param(postsignin => "do=prefs");
+               # Due to do=register, this will run in registration-only
+               # mode.
+               IkiWiki::cgi_signin($q, $session);
+               exit;
+       }
 }
 
 sub auth ($$) {
index bbbb3b870ad5d31db565349a185174824879d025..3023fd7f938e423bc20b42a579004084f4a6d8a0 100644 (file)
@@ -51,20 +51,22 @@ sub import {
        hook(type => "formbuilder_setup", id => "po", call => \&formbuilder_setup, last => 1);
        hook(type => "formbuilder", id => "po", call => \&formbuilder);
 
-       $origsubs{'bestlink'}=\&IkiWiki::bestlink;
-       inject(name => "IkiWiki::bestlink", call => \&mybestlink);
-       $origsubs{'beautify_urlpath'}=\&IkiWiki::beautify_urlpath;
-       inject(name => "IkiWiki::beautify_urlpath", call => \&mybeautify_urlpath);
-       $origsubs{'targetpage'}=\&IkiWiki::targetpage;
-       inject(name => "IkiWiki::targetpage", call => \&mytargetpage);
-       $origsubs{'urlto'}=\&IkiWiki::urlto;
-       inject(name => "IkiWiki::urlto", call => \&myurlto);
-       $origsubs{'cgiurl'}=\&IkiWiki::cgiurl;
-       inject(name => "IkiWiki::cgiurl", call => \&mycgiurl);
-       $origsubs{'rootpage'}=\&IkiWiki::rootpage;
-       inject(name => "IkiWiki::rootpage", call => \&myrootpage);
-       $origsubs{'isselflink'}=\&IkiWiki::isselflink;
-       inject(name => "IkiWiki::isselflink", call => \&myisselflink);
+       if (! %origsubs) {
+               $origsubs{'bestlink'}=\&IkiWiki::bestlink;
+               inject(name => "IkiWiki::bestlink", call => \&mybestlink);
+               $origsubs{'beautify_urlpath'}=\&IkiWiki::beautify_urlpath;
+               inject(name => "IkiWiki::beautify_urlpath", call => \&mybeautify_urlpath);
+               $origsubs{'targetpage'}=\&IkiWiki::targetpage;
+               inject(name => "IkiWiki::targetpage", call => \&mytargetpage);
+               $origsubs{'urlto'}=\&IkiWiki::urlto;
+               inject(name => "IkiWiki::urlto", call => \&myurlto);
+               $origsubs{'cgiurl'}=\&IkiWiki::cgiurl;
+               inject(name => "IkiWiki::cgiurl", call => \&mycgiurl);
+               $origsubs{'rootpage'}=\&IkiWiki::rootpage;
+               inject(name => "IkiWiki::rootpage", call => \&myrootpage);
+               $origsubs{'isselflink'}=\&IkiWiki::isselflink;
+               inject(name => "IkiWiki::isselflink", call => \&myisselflink);
+       }
 }
 
 
@@ -87,7 +89,8 @@ sub getsetup () {
        return
                plugin => {
                        safe => 0,
-                       rebuild => 1,
+                       rebuild => 1, # format plugin
+                       section => "format",
                },
                po_master_language => {
                        type => "string",
@@ -134,6 +137,7 @@ sub checkconfig () {
                                      $field, 'po'));
                }
        }
+       delete $config{po_slave_languages}{$config{po_master_language}{code}};;
 
        map {
                islanguagecode($_)
@@ -175,7 +179,8 @@ sub checkconfig () {
                if ($config{po_master_language}{code} ne 'en') {
                        # Add underlay containing translated source files
                        # for the master language.
-                       add_underlay("locale/$config{po_master_language}{code}/$underlay");
+                       add_underlay("locale/$config{po_master_language}{code}/$underlay")
+                               if -d "$config{underlaydirbase}/locale/$config{po_master_language}{code}/$underlay";
                }
        }
 }
@@ -309,7 +314,7 @@ sub pagetemplate (@) {
        if (ishomepage($page) && $template->query(name => "title")) {
                $template->param(title => $config{wikiname});
        }
-} # }}}
+}
 
 # Add the renamed page translations to the list of to-be-renamed pages.
 sub renamepages (@) {
@@ -426,8 +431,7 @@ sub change (@) {
 
        if ($updated_po_files) {
                commit_and_refresh(
-                       gettext("updated PO files"),
-                       "IkiWiki::Plugin::po::change");
+                       gettext("updated PO files"));
        }
 }
 
@@ -566,7 +570,7 @@ sub mybestlink ($$) {
        my $link=shift;
 
        return $origsubs{'bestlink'}->($page, $link)
-               if $config{po_link_to} eq "default";
+               if defined $config{po_link_to} && $config{po_link_to} eq "default";
 
        my $res=$origsubs{'bestlink'}->(masterpage($page), $link);
        my @caller = caller(1);
@@ -584,7 +588,7 @@ sub mybeautify_urlpath ($) {
        my $url=shift;
 
        my $res=$origsubs{'beautify_urlpath'}->($url);
-       if ($config{po_link_to} eq "negotiated") {
+       if (defined $config{po_link_to} && $config{po_link_to} eq "negotiated") {
                $res =~ s!/\Qindex.$config{po_master_language}{code}.$config{htmlext}\E$!/!;
                $res =~ s!/\Qindex.$config{htmlext}\E$!/!;
                map {
@@ -739,6 +743,7 @@ sub istranslatablefile ($) {
        my $type=pagetype($file);
        return 0 if ! defined $type || $type eq 'po';
        return 0 if $file =~ /\.pot$/;
+       return 0 if ! defined $config{po_translatable_pages};
        return 1 if pagespec_match(pagename($file), $config{po_translatable_pages});
        return;
 }
@@ -1042,17 +1047,18 @@ sub deletetranslations ($) {
 
        if (@todelete) {
                commit_and_refresh(
-                       gettext("removed obsolete PO files"),
-                       "IkiWiki::Plugin::po::deletetranslations");
+                       gettext("removed obsolete PO files"));
        }
 }
 
-sub commit_and_refresh ($$) {
-       my ($msg, $author) = (shift, shift);
+sub commit_and_refresh ($) {
+       my $msg = shift;
 
        if ($config{rcs}) {
                IkiWiki::disable_commit_hook();
-               IkiWiki::rcs_commit_staged($msg, $author, "127.0.0.1");
+               IkiWiki::rcs_commit_staged(
+                       message => $msg,
+               );
                IkiWiki::enable_commit_hook();
                IkiWiki::rcs_update();
        }
@@ -1070,11 +1076,8 @@ sub commit_and_refresh ($$) {
        IkiWiki::saveindex();
 }
 
-# on success, returns the filtered content.
-# on error, if $nonfatal, warn and return undef; else, error out.
-sub po_to_markup ($$;$) {
+sub po_to_markup ($$) {
        my ($page, $content) = (shift, shift);
-       my $nonfatal = shift;
 
        $content = '' unless defined $content;
        $content = decode_utf8(encode_utf8($content));
@@ -1097,10 +1100,6 @@ sub po_to_markup ($$;$) {
 
        my $fail = sub ($) {
                my $msg = "po(po_to_markup) - $page : " . shift;
-               if ($nonfatal) {
-                       warn $msg;
-                       return undef;
-               }
                error($msg, sub { unlink $infile, $outfile});
        };
 
@@ -1121,8 +1120,7 @@ sub po_to_markup ($$;$) {
        $doc->write($outfile)
                or return $fail->(sprintf(gettext("failed to write %s"), $outfile));
 
-       $content = readfile($outfile)
-               or return $fail->(sprintf(gettext("failed to read %s"), $outfile));
+       $content = readfile($outfile);
 
        # Unlinking should happen automatically, thanks to File::Temp,
        # but it does not work here, probably because of the way writefile()
index bc1e3501e5e6b7c9c4a0d1568367e5d60bbf61cb..b333e2cdcff485edd81f4df426e1865c261a1199 100644 (file)
@@ -17,6 +17,7 @@ sub getsetup () {
                plugin => {
                        safe => 1,
                        rebuild => undef,
+                       section => "widget",
                },
 }
 
@@ -133,9 +134,12 @@ sub sessioncgi ($$) {
                $oldchoice=$session->param($choice_param);
                if ($config{rcs}) {
                        IkiWiki::disable_commit_hook();
-                       IkiWiki::rcs_commit($pagesources{$page}, "poll vote ($choice)",
-                               IkiWiki::rcs_prepedit($pagesources{$page}),
-                               $session->param("name"), $ENV{REMOTE_ADDR});
+                       IkiWiki::rcs_commit(
+                               file => $pagesources{$page},
+                               message => "poll vote ($choice)",
+                               token => IkiWiki::rcs_prepedit($pagesources{$page}),
+                               session => $session,
+                       );
                        IkiWiki::enable_commit_hook();
                        IkiWiki::rcs_update();
                }
index bc21d71c725f892d3432dfa5ac22feb1241cfd97..78e3611e1c1aa9a592ff6f156d3b796a01b9a5bd 100644 (file)
@@ -20,6 +20,7 @@ sub getsetup () {
                plugin => {
                        safe => 1,
                        rebuild => undef,
+                       section => "widget",
                },
 }
 
index 0d5a12e33c5c2f918181784b2dd8784f54353ff7..2fae9c5fee90ab266aa0be0d0b2fb4a5267afbb3 100644 (file)
@@ -16,6 +16,7 @@ sub getsetup () {
                plugin => {
                        safe => 1,
                        rebuild => undef,
+                       section => "widget",
                },
 }
 
index fe64b40b1da13fe9b21936e2f5098c7bcc225c79..d27df5ca894b3aacf77fb441901fb5e47cf359b9 100644 (file)
@@ -18,6 +18,7 @@ sub getsetup () {
                plugin => {
                        safe => 1,
                        rebuild => undef,
+                       section => "widget",
                },
 }
 
index ad8a610c1420f73a3ce0eabf30f9300afcdff5a4..0838bcb225a538c5c21cf05d26bad778860d0fdd 100644 (file)
@@ -16,6 +16,7 @@ sub getsetup () {
                plugin => {
                        safe => 1,
                        rebuild => 1, # changes file types
+                       section => "format",
                },
 }
 
index fa851e46678f208efa04def72e988366df6ea87d..758b98348d126aa572a537f9f0b359e5baffbb5e 100644 (file)
@@ -60,15 +60,15 @@ sub refresh ($) {
        }
 }
 
-# Enable the recentchanges link on wiki pages.
+# Enable the recentchanges link.
 sub pagetemplate (@) {
        my %params=@_;
        my $template=$params{template};
        my $page=$params{page};
 
        if (defined $config{recentchangespage} && $config{rcs} &&
-           $page ne $config{recentchangespage} &&
-           $template->query(name => "recentchangesurl")) {
+           $template->query(name => "recentchangesurl") &&
+           $page ne $config{recentchangespage}) {
                $template->param(recentchangesurl => urlto($config{recentchangespage}, $page));
                $template->param(have_actions => 1);
        }
@@ -114,17 +114,16 @@ sub store ($$$) {
        ];
        push @{$change->{pages}}, { link => '...' } if $is_excess;
 
-       # See if the committer is an openid.
        $change->{author}=$change->{user};
        my $oiduser=eval { IkiWiki::openiduser($change->{user}) };
        if (defined $oiduser) {
                $change->{authorurl}=$change->{user};
-               $change->{user}=$oiduser;
+               $change->{user}=defined $change->{nickname} ? $change->{nickname} : $oiduser;
        }
        elsif (length $config{cgiurl}) {
                $change->{authorurl} = IkiWiki::cgiurl(
                        do => "goto",
-                       page => (length $config{userdir} ? "$config{userdir}/" : "").$change->{author},
+                       page => IkiWiki::userpage($change->{author}),
                );
        }
 
index 06df2efd58cba5697a20f99be8730bd61a06e702..c9280ef14799dbecdba10c0bcc259027a245d2fc 100644 (file)
@@ -5,7 +5,7 @@ use warnings;
 no warnings 'redefine';
 use strict;
 use IkiWiki 3.00;
-use POSIX;
+use POSIX ();
 use Encode;
 
 sub import {
@@ -37,24 +37,36 @@ sub include_javascript ($;$) {
        my $page=shift;
        my $absolute=shift;
        
-       return '<script src="'.urlto("ikiwiki.js", $page, $absolute).
+       return '<script src="'.urlto("ikiwiki/ikiwiki.js", $page, $absolute).
                '" type="text/javascript" charset="utf-8"></script>'."\n".
-               '<script src="'.urlto("relativedate.js", $page, $absolute).
+               '<script src="'.urlto("ikiwiki/relativedate.js", $page, $absolute).
                '" type="text/javascript" charset="utf-8"></script>';
 }
 
-sub mydisplaytime ($;$) {
+sub mydisplaytime ($;$$) {
        my $time=shift;
        my $format=shift;
+       my $pubdate=shift;
 
        # This needs to be in a form that can be parsed by javascript.
-       # Being fairly human readable is also nice, as it will be exposed
-       # as the title if javascript is not available.
+       # (Being fairly human readable is also nice, as it will be exposed
+       # as the title if javascript is not available.)
+       my $lc_time=POSIX::setlocale(&POSIX::LC_TIME);
+       POSIX::setlocale(&POSIX::LC_TIME, "C");
        my $gmtime=decode_utf8(POSIX::strftime("%a, %d %b %Y %H:%M:%S %z",
                        localtime($time)));
+       POSIX::setlocale(&POSIX::LC_TIME, $lc_time);
 
-       return '<span class="relativedate" title="'.$gmtime.'">'.
-               IkiWiki::formattime($time, $format).'</span>';
+       my $mid=' class="relativedate" title="'.$gmtime.'">'.
+               IkiWiki::formattime($time, $format);
+
+       if ($config{html5}) {
+               return '<time datetime="'.IkiWiki::date_3339($time).'"'.
+                       ($pubdate ? ' pubdate="pubdate"' : '').$mid.'</time>';
+       }
+       else {
+               return '<span'.$mid.'</span>';
+       }
 }
 
 1
index 2b8cf0414aa9198624c2f91e238a6fbf3c446d44..95f148183cba558be65a95a9687992293d122839 100644 (file)
@@ -18,6 +18,7 @@ sub getsetup () {
                plugin => {
                        safe => 1,
                        rebuild => 0,
+                       section => "web",
                },
 }
 
@@ -48,10 +49,10 @@ sub check_canremove ($$$) {
        # This is sorta overkill, but better safe than sorry.
        if (! defined pagetype($pagesources{$page})) {
                if (IkiWiki::Plugin::attachment->can("check_canattach")) {
-                       IkiWiki::Plugin::attachment::check_canattach($session, $page, $file);
+                       IkiWiki::Plugin::attachment::check_canattach($session, $page, "$config{srcdir}/$file");
                }
                else {
-                       error("renaming of attachments is not allowed");
+                       error("removal of attachments is not allowed");
                }
        }
 
@@ -102,10 +103,12 @@ sub confirmation_form ($$) {
                javascript => 0,
                params => $q,
                action => $config{cgiurl},
-               stylesheet => IkiWiki::baseurl()."style.css",
+               stylesheet => 1,
                fields => [qw{do page}],
        );
        
+       $f->field(name => "sid", type => "hidden", value => $session->id,
+               force => 1);
        $f->field(name => "do", type => "hidden", value => "remove", force => 1);
 
        return $f, ["Remove", "Cancel"];
@@ -187,6 +190,8 @@ sub sessioncgi ($$) {
                        postremove($session);
                }
                elsif ($form->submitted eq 'Remove' && $form->validate) {
+                       IkiWiki::checksessionexpiry($q, $session, $q->param('sid'));
+
                        my @pages=$form->field("page");
        
                        # Validate removal by checking that the page exists,
@@ -208,8 +213,10 @@ sub sessioncgi ($$) {
                                foreach my $file (@files) {
                                        IkiWiki::rcs_remove($file);
                                }
-                               IkiWiki::rcs_commit_staged(gettext("removed"),
-                                       $session->param("name"), $ENV{REMOTE_ADDR});
+                               IkiWiki::rcs_commit_staged(
+                                       message => gettext("removed"),
+                                       session => $session,
+                               );
                                IkiWiki::enable_commit_hook();
                                IkiWiki::rcs_update();
                        }
index 8213d21f60c902985f06ae644d0d1633d7a58ce7..61d39d4b568d74b3766984f585862ae698b9957b 100644 (file)
@@ -18,6 +18,7 @@ sub getsetup () {
                plugin => {
                        safe => 1,
                        rebuild => 0,
+                       section => "web",
                },
 }
 
@@ -49,7 +50,7 @@ sub check_canrename ($$$$$$) {
        IkiWiki::check_canedit($src, $q, $session);
        if ($attachment) {
                if (IkiWiki::Plugin::attachment->can("check_canattach")) {
-                       IkiWiki::Plugin::attachment::check_canattach($session, $src, $srcfile);
+                       IkiWiki::Plugin::attachment::check_canattach($session, $src, "$config{srcdir}/$srcfile");
                }
                else {
                        error("renaming of attachments is not allowed");
@@ -62,9 +63,8 @@ sub check_canrename ($$$$$$) {
                        error(gettext("no change to the file name was specified"));
                }
 
-               # Must be a legal filename, and not absolute.
-               if (IkiWiki::file_pruned($destfile, $config{srcdir}) || 
-                   $destfile=~/^\//) {
+               # Must be a legal filename.
+               if (IkiWiki::file_pruned($destfile)) {
                        error(sprintf(gettext("illegal name")));
                }
 
@@ -84,7 +84,7 @@ sub check_canrename ($$$$$$) {
                if ($attachment) {
                        # Note that $srcfile is used here, not $destfile,
                        # because it wants the current file, to check it.
-                       IkiWiki::Plugin::attachment::check_canattach($session, $dest, $srcfile);
+                       IkiWiki::Plugin::attachment::check_canattach($session, $dest, "$config{srcdir}/$srcfile");
                }
        }
 
@@ -126,11 +126,13 @@ sub rename_form ($$$) {
                javascript => 0,
                params => $q,
                action => $config{cgiurl},
-               stylesheet => IkiWiki::baseurl()."style.css",
+               stylesheet => 1,
                fields => [qw{do page new_name attachment}],
        );
        
        $f->field(name => "do", type => "hidden", value => "rename", force => 1);
+       $f->field(name => "sid", type => "hidden", value => $session->id,
+               force => 1);
        $f->field(name => "page", type => "hidden", value => $page, force => 1);
        $f->field(name => "new_name", value => pagetitle($page, 1), size => 60);
        if (!$q->param("attachment")) {
@@ -286,6 +288,8 @@ sub sessioncgi ($$) {
                        postrename($session);
                }
                elsif ($form->submitted eq 'Rename' && $form->validate) {
+                       IkiWiki::checksessionexpiry($q, $session, $q->param('sid'));
+
                        # Queue of rename actions to perfom.
                        my @torename;
 
@@ -345,8 +349,9 @@ sub sessioncgi ($$) {
                                $pagesources{$rename->{src}}=$rename->{destfile};
                        }
                        IkiWiki::rcs_commit_staged(
-                               sprintf(gettext("rename %s to %s"), $srcfile, $destfile),
-                               $session->param("name"), $ENV{REMOTE_ADDR}) if $config{rcs};
+                               message => sprintf(gettext("rename %s to %s"), $srcfile, $destfile),
+                               session => $session,
+                       ) if $config{rcs};
 
                        # Then link fixups.
                        foreach my $rename (@torename) {
@@ -571,8 +576,8 @@ sub fixlinks ($$$) {
                                        $file,
                                        sprintf(gettext("update for rename of %s to %s"), $rename->{srcfile}, $rename->{destfile}),
                                        $token,
-                                       $session->param("name"), 
-                                       $ENV{REMOTE_ADDR}
+                                       $session->param("name"),
+                                       $session->remote_addr(),
                                );
                                push @fixedlinks, $page if ! defined $conflict;
                        }
index f69ec398880d4b2955e6e298ddc1d37cfd9141c3..ba7c5f0aa0e895087d9d1cba08d031cd29bc8764 100644 (file)
@@ -15,6 +15,7 @@ sub getsetup () {
                plugin => {
                        safe => 1,
                        rebuild => undef,
+                       section => "web",
                },
                repositories => {
                        type => "string",
index 393c17e0fe8cf6b9ec137ba7cfc8ac64e008cd4b..ff5d0ccbe616379b0a7efdadbd1858e4a8cf098e 100644 (file)
@@ -10,7 +10,7 @@ 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 => "indexhtml", id => "search", call => \&indexhtml);
        hook(type => "delete", id => "search", call => \&delete);
        hook(type => "cgi", id => "search", call => \&cgi);
 }
@@ -20,6 +20,7 @@ sub getsetup () {
                plugin => {
                        safe => 1,
                        rebuild => 1,
+                       section => "web",
                },
                omega_cgi => {
                        type => "string",
@@ -40,6 +41,10 @@ sub checkconfig () {
        if (! defined $config{omega_cgi}) {
                $config{omega_cgi}="/usr/lib/cgi-bin/omega/omega";
        }
+
+       # This is a mass dependency, so if the search form template
+       # changes, every page is rebuilt.
+       add_depends("", "templates/searchform.tmpl");
 }
 
 my $form;
@@ -53,6 +58,7 @@ sub pagetemplate (@) {
                if (! defined $form) {
                        my $searchform = template("searchform.tmpl", blind_cache => 1);
                        $searchform->param(searchaction => $config{cgiurl});
+                       $searchform->param(html5 => $config{html5});
                        $form=$searchform->output;
                }
 
@@ -62,14 +68,14 @@ sub pagetemplate (@) {
 
 my $scrubber;
 my $stemmer;
-sub index (@) {
+sub indexhtml (@) {
        my %params=@_;
 
        setupfiles();
 
        # A unique pageterm is used to identify the document for a page.
        my $pageterm=pageterm($params{page});
-       return $params{content} unless defined $pageterm;
+       return unless defined $pageterm;
        
        my $db=xapiandb();
        my $doc=Search::Xapian::Document->new();
@@ -106,11 +112,17 @@ sub index (@) {
        }
        $sample=~s/\n/ /g;
        
+       my $url=urlto($params{destpage}, "");
+       if (defined $pagestate{$params{page}}{meta}{permalink}) {
+               $url=$pagestate{$params{page}}{meta}{permalink}
+       }
+
        # data used by omega
        # Decode html entities in it, since omega re-encodes them.
        eval q{use HTML::Entities};
+       error $@ if $@;
        $doc->set_data(
-               "url=".urlto($params{page}, "")."\n".
+               "url=".$url."\n".
                "sample=".decode_entities($sample)."\n".
                "caption=".decode_entities($caption)."\n".
                "modtime=$IkiWiki::pagemtime{$params{page}}\n".
@@ -213,9 +225,21 @@ sub setupfiles () {
                writefile("omega.conf", $config{wikistatedir}."/xapian",
                        "database_dir .\n".
                        "template_dir ./templates\n");
+               
+               # Avoid omega interpreting anything in the misctemplate
+               # as an omegascript command.
+               my $misctemplate=IkiWiki::misctemplate(gettext("search"), "\0",
+                       searchform => "", # avoid showing the small search form
+               );
+               eval q{use HTML::Entities};
+               error $@ if $@;
+               $misctemplate=encode_entities($misctemplate, '\$');
+
+               my $querytemplate=readfile(IkiWiki::template_file("searchquery.tmpl"));
+               $misctemplate=~s/\0/$querytemplate/;
+
                writefile("query", $config{wikistatedir}."/xapian/templates",
-                       IkiWiki::misctemplate(gettext("search"),
-                               readfile(IkiWiki::template_file("searchquery.tmpl"))));
+                       $misctemplate);
                $setup=1;
        }
 }
index 1840a5722a6300d7ce30d14cd4534ef2bc16a48d..0cedbe447480f7f7e01a24476c1cc40e856bccc5 100644 (file)
@@ -16,6 +16,7 @@ sub getsetup () {
                plugin => {
                        safe => 1,
                        rebuild => undef,
+                       section => "widget",
                },
 }
 
index 41812e1c1f671da84be1a06a5821695fc5dc6f11..2d495db2cc0d02e1bc1abbc3653627374a8179ba 100644 (file)
@@ -10,6 +10,7 @@ use IkiWiki 3.00;
 
 sub import {
        hook(type => "getsetup", id => "sidebar", call => \&getsetup);
+       hook(type => "preprocess", id => "sidebar", call => \&preprocess);
        hook(type => "pagetemplate", id => "sidebar", call => \&pagetemplate);
 }
 
@@ -19,11 +20,51 @@ sub getsetup () {
                        safe => 1,
                        rebuild => 1,
                },
+               global_sidebars => {
+                       type => "boolean",
+                       example => 1,
+                       description => "show sidebar page on all pages?",
+                       safe => 1,
+                       rebuild => 1,
+               },
+}
+
+my %pagesidebar;
+
+sub preprocess (@) {
+       my %params=@_;
+
+       my $page=$params{page};
+       return "" unless $page eq $params{destpage};
+       
+       if (! defined $params{content}) {
+               $pagesidebar{$page}=undef;
+       }
+       else {
+               my $file = $pagesources{$page};
+               my $type = pagetype($file);
+
+               $pagesidebar{$page}=
+                       IkiWiki::htmlize($page, $page, $type,
+                       IkiWiki::linkify($page, $page,
+                       IkiWiki::preprocess($page, $page,
+                       IkiWiki::filter($page, $page, $params{content}))));
+       }
+
+       return "";
 }
 
+my $oldfile;
+my $oldcontent;
+
 sub sidebar_content ($) {
        my $page=shift;
        
+       return delete $pagesidebar{$page} if defined $pagesidebar{$page};
+
+       return if ! exists $pagesidebar{$page} && 
+               defined $config{global_sidebars} && ! $config{global_sidebars};
+
        my $sidebar_page=bestlink($page, "sidebar") || return;
        my $sidebar_file=$pagesources{$sidebar_page} || return;
        my $sidebar_type=pagetype($sidebar_file);
@@ -34,7 +75,16 @@ sub sidebar_content ($) {
                # currently requires a wiki rebuild.
                add_depends($page, $sidebar_page);
 
-               my $content=readfile(srcfile($sidebar_file));
+               my $content;
+               if (defined $oldfile && $sidebar_file eq $oldfile) {
+                       $content=$oldcontent;
+               }
+               else {
+                       $content=readfile(srcfile($sidebar_file));
+                       $oldcontent=$content;
+                       $oldfile=$sidebar_file;
+               }
+
                return unless length $content;
                return IkiWiki::htmlize($sidebar_page, $page, $sidebar_type,
                       IkiWiki::linkify($sidebar_page, $page,
@@ -47,11 +97,10 @@ sub sidebar_content ($) {
 sub pagetemplate (@) {
        my %params=@_;
 
-       my $page=$params{page};
        my $template=$params{template};
-       
-       if ($template->query(name => "sidebar")) {
-               my $content=sidebar_content($page);
+       if ($params{destpage} eq $params{page} &&
+           $template->query(name => "sidebar")) {
+               my $content=sidebar_content($params{destpage});
                if (defined $content && length $content) {
                        $template->param(sidebar => $content);
                }
index 8b44a68f725230118d7fe71619793a1bac3199b2..31160c02ffb581ad28da533e42737db8761295fe 100644 (file)
@@ -16,6 +16,7 @@ sub getsetup () {
                plugin => {
                        safe => 1,
                        rebuild => 0,
+                       section => "auth",
                },
 }
 
index ddf2996d64ace9c2dce9a6f9e6222f041de85e98..adffc91c9e64d9296baaedf5bd5ffe67acd24e44 100644 (file)
@@ -20,10 +20,11 @@ sub import {
        hook(type => "scan", id => "skeleton", call => \&scan);
        hook(type => "htmlize", id => "skeleton", call => \&htmlize);
        hook(type => "sanitize", id => "skeleton", call => \&sanitize);
-       hook(type => "postscan", id => "skeleton", call => \&postscan);
+       hook(type => "indexhtml", id => "skeleton", call => \&indexhtml);
        hook(type => "format", id => "skeleton", call => \&format);
        hook(type => "pagetemplate", id => "skeleton", call => \&pagetemplate);
        hook(type => "templatefile", id => "skeleton", call => \&templatefile);
+       hook(type => "pageactions", id => "skeleton", call => \&pageactions);
        hook(type => "delete", id => "skeleton", call => \&delete);
        hook(type => "change", id => "skeleton", call => \&change);
        hook(type => "cgi", id => "skeleton", call => \&cgi);
@@ -69,7 +70,7 @@ sub refresh () {
        debug("skeleton plugin refresh");
 }
 
-sub needsbuild () {
+sub needsbuild ($) {
        debug("skeleton plugin needsbuild");
 }
 
@@ -117,10 +118,10 @@ sub sanitize (@) {
        return $params{content};
 }
 
-sub postscan (@) {
+sub indexhtml (@) {
        my %params=@_;
        
-       debug("skeleton plugin running as postscan");
+       debug("skeleton plugin running as indexhtml");
 }
 
 sub format (@) {
@@ -146,6 +147,14 @@ sub templatefile (@) {
        debug("skeleton plugin running as a templatefile hook");
 }
 
+sub pageactions (@) {
+       my %params=@_;
+       my $page=$params{page};
+
+       debug("skeleton plugin running as a pageactions hook");
+       return ();
+}
+
 sub delete (@) {
        my @files=@_;
 
diff --git a/IkiWiki/Plugin/sortnaturally.pm b/IkiWiki/Plugin/sortnaturally.pm
new file mode 100644 (file)
index 0000000..62e4276
--- /dev/null
@@ -0,0 +1,32 @@
+#!/usr/bin/perl
+# Sort::Naturally-powered title_natural sort order for IkiWiki
+package IkiWiki::Plugin::sortnaturally;
+
+use IkiWiki 3.00;
+no warnings;
+
+sub import {
+       hook(type => "getsetup", id => "sortnaturally", call => \&getsetup);
+}
+
+sub getsetup {
+       return
+               plugin => {
+                       safe => 1,
+                       rebuild => undef,
+               },
+}
+
+sub checkconfig () {
+       eval q{use Sort::Naturally};
+       error $@ if $@;
+}
+
+package IkiWiki::SortSpec;
+
+sub cmp_title_natural {
+       Sort::Naturally::ncmp(IkiWiki::pagetitle(IkiWiki::basename($a)),
+               IkiWiki::pagetitle(IkiWiki::basename($b)))
+}
+
+1;
index fb4849492eb0e20aad9045bae2d51902885abfb5..1b1d04cba6e7c2e2510a51758a9cfd5439eb4ce5 100644 (file)
@@ -24,6 +24,7 @@ sub getsetup () {
                plugin => {
                        safe => 1,
                        rebuild => undef,
+                       section => "widget",
                },
 }
 
@@ -157,7 +158,8 @@ sub preprocess (@) {
                        writefile($fn, $config{destdir}, $png, 1);
                }
                else {
-                       # can't write the file, so embed it in a data uri
+                       # in preview mode, embed the image in a data uri
+                       # to avoid temp file clutter
                        eval q{use MIME::Base64};
                        error($@) if $@;
                        return "<img src=\"data:image/png;base64,".
index 06b987f51ce756676aa977c2c95af0aa4628e952..9cf82b5db3c4ce663a552cee9acd7cd22e665c3c 100644 (file)
@@ -19,6 +19,7 @@ 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);
+       hook(type => "rcs", id => "rcs_getmtime", call => \&rcs_getmtime);
 }
 
 sub checkconfig () {
@@ -44,6 +45,7 @@ sub getsetup () {
                plugin => {
                        safe => 0, # rcs plugin
                        rebuild => undef,
+                       section => "rcs",
                },
                svnrepo => {
                        type => "string",
@@ -142,43 +144,50 @@ sub rcs_prepedit ($) {
        }
 }
 
-sub rcs_commit ($$$;$$) {
+sub commitmessage (@) {
+       my %params=@_;
+
+       if (defined $params{session}) {
+               if (defined $params{session}->param("name")) {
+                       return "web commit by ".
+                               $params{session}->param("name").
+                               (length $params{message} ? ": $params{message}" : "");
+               }
+               elsif (defined $params{session}->remote_addr()) {
+                       return "web commit from ".
+                               $params{session}->remote_addr().
+                               (length $params{message} ? ": $params{message}" : "");
+               }
+       }
+       return $params{message};
+}
+
+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.
-       my $file=shift;
-       my $message=shift;
-       my $rcstoken=shift;
-       my $user=shift;
-       my $ipaddr=shift;
-
-       if (defined $user) {
-               $message="web commit by $user".(length $message ? ": $message" : "");
-       }
-       elsif (defined $ipaddr) {
-               $message="web commit from $ipaddr".(length $message ? ": $message" : "");
-       }
+       my %params=@_;
 
        if (-d "$config{srcdir}/.svn") {
                # Check to see if the page has been changed by someone
                # else since rcs_prepedit was called.
-               my ($oldrev)=$rcstoken=~/^([0-9]+)$/; # untaint
-               my $rev=svn_info("Revision", "$config{srcdir}/$file");
+               my ($oldrev)=$params{token}=~/^([0-9]+)$/; # untaint
+               my $rev=svn_info("Revision", "$config{srcdir}/$params{file}");
                if (defined $rev && defined $oldrev && $rev != $oldrev) {
                        # Merge their changes into the file that we've
                        # changed.
                        if (system("svn", "merge", "--quiet", "-r$oldrev:$rev",
-                                  "$config{srcdir}/$file", "$config{srcdir}/$file") != 0) {
+                                  "$config{srcdir}/$params{file}", "$config{srcdir}/$params{file}") != 0) {
                                warn("svn merge -r$oldrev:$rev failed\n");
                        }
                }
 
                if (system("svn", "commit", "--quiet", 
                           "--encoding", "UTF-8", "-m",
-                          IkiWiki::possibly_foolish_untaint($message),
+                          IkiWiki::possibly_foolish_untaint(commitmessage(%params)),
                           $config{srcdir}) != 0) {
-                       my $conflict=readfile("$config{srcdir}/$file");
-                       if (system("svn", "revert", "--quiet", "$config{srcdir}/$file") != 0) {
+                       my $conflict=readfile("$config{srcdir}/$params{file}");
+                       if (system("svn", "revert", "--quiet", "$config{srcdir}/$params{file}") != 0) {
                                warn("svn revert failed\n");
                        }
                        return $conflict;
@@ -187,21 +196,14 @@ sub rcs_commit ($$$;$$) {
        return undef # success
 }
 
-sub rcs_commit_staged ($$$) {
+sub rcs_commit_staged (@) {
        # Commits all staged changes. Changes can be staged using rcs_add,
        # rcs_remove, and rcs_rename.
-       my ($message, $user, $ipaddr)=@_;
-       
-       if (defined $user) {
-               $message="web commit by $user".(length $message ? ": $message" : "");
-       }
-       elsif (defined $ipaddr) {
-               $message="web commit from $ipaddr".(length $message ? ": $message" : "");
-       }
+       my %params=@_;
        
        if (system("svn", "commit", "--quiet",
                   "--encoding", "UTF-8", "-m",
-                  IkiWiki::possibly_foolish_untaint($message),
+                  IkiWiki::possibly_foolish_untaint(commitmessage(%params)),
                   $config{srcdir}) != 0) {
                warn("svn commit failed\n");
                return 1; # failure     
@@ -348,34 +350,58 @@ sub rcs_diff ($) {
        return `svnlook diff $config{svnrepo} -r$rev --no-diff-deleted`;
 }
 
-sub rcs_getctime ($) {
+{
+
+my ($lastfile, $lastmtime, $lastctime);
+
+sub findtimes ($) {
        my $file=shift;
 
+       if (defined $lastfile && $lastfile eq $file) {
+               return $lastmtime, $lastctime;
+       }
+       $lastfile=$file;
+
        my $svn_log_infoline=qr/^r\d+\s+\|\s+[^\s]+\s+\|\s+(\d+-\d+-\d+\s+\d+:\d+:\d+\s+[-+]?\d+).*/;
                
        my $child = open(SVNLOG, "-|");
        if (! $child) {
-               exec("svn", "log", $file) || error("svn log $file failed to run");
+               exec("svn", "log", "$config{srcdir}/$file") || error("svn log failed to run");
        }
 
-       my $date;
+       my ($cdate, $mdate);
        while (<SVNLOG>) {
                if (/$svn_log_infoline/) {
-                       $date=$1;
+                       $cdate=$1;
+                       $mdate=$1 unless defined $mdate;
                }
        }
-       close SVNLOG || warn "svn log $file exited $?";
+       close SVNLOG || error "svn log exited $?";
 
-       if (! defined $date) {
-               warn "failed to parse svn log for $file\n";
-               return 0;
+       if (! defined $cdate) {
+               error "failed to parse svn log for $file";
        }
                
        eval q{use Date::Parse};
        error($@) if $@;
-       $date=str2time($date);
-       debug("found ctime ".localtime($date)." for $file");
-       return $date;
+       
+       $lastctime=str2time($cdate);
+       $lastmtime=str2time($mdate);
+       return $lastmtime, $lastctime;
+}
+
+}
+
+sub rcs_getctime ($) {
+       my $file=shift;
+
+       return (findtimes($file))[1];
+}
+
+sub rcs_getmtime ($) {
+       my $file=shift;
+
+       return (findtimes($file))[0];
 }
 
 1
index 96d63f455f886e9111f0e7bd26558b020c1de61b..2edd1eacd11a329d71d81add93c431462685ef03 100644 (file)
@@ -16,6 +16,7 @@ sub getsetup () {
                plugin => {
                        safe => 1,
                        rebuild => undef,
+                       section => "widget",
                },
 }
 
index cdcfaf536082825444b3e8d3f27b406bc413cd53..55064a9a3cef72c92f3ebc3cb43fa9ef7646d256 100644 (file)
@@ -6,8 +6,6 @@ use warnings;
 use strict;
 use IkiWiki 3.00;
 
-my %tags;
-
 sub import {
        hook(type => "getopt", id => "tag", call => \&getopt);
        hook(type => "getsetup", id => "tag", call => \&getsetup);
@@ -36,12 +34,19 @@ sub getsetup () {
                        safe => 1,
                        rebuild => 1,
                },
+               tag_autocreate => {
+                       type => "boolean",
+                       example => 1,
+                       description => "autocreate new tag pages?",
+                       safe => 1,
+                       rebuild => undef,
+               },
 }
 
-sub tagpage ($) {
+sub taglink ($) {
        my $tag=shift;
-                       
-       if ($tag !~ m{^\.?/} &&
+       
+       if ($tag !~ m{^/} &&
            defined $config{tagbase}) {
                $tag="/".$config{tagbase}."/".$tag;
                $tag=~y#/#/#s; # squash dups
@@ -50,13 +55,46 @@ sub tagpage ($) {
        return $tag;
 }
 
-sub taglink ($$$;@) {
+sub htmllink_tag ($$$;@) {
        my $page=shift;
        my $destpage=shift;
        my $tag=shift;
        my %opts=@_;
 
-       return htmllink($page, $destpage, tagpage($tag), %opts);
+       return htmllink($page, $destpage, taglink($tag), %opts);
+}
+
+sub gentag ($) {
+       my $tag=shift;
+
+       if ($config{tag_autocreate} ||
+           ($config{tagbase} && ! defined $config{tag_autocreate})) {
+               my $tagpage=taglink($tag);
+               if ($tagpage=~/^\.\/(.*)/) {
+                       $tagpage=$1;
+               }
+               else {
+                       $tagpage=~s/^\///;
+               }
+
+               my $tagfile = newpagefile($tagpage, $config{default_pageext});
+
+               add_autofile($tagfile, "tag", sub {
+                       my $message=sprintf(gettext("creating tag page %s"), $tagpage);
+                       debug($message);
+
+                       my $template=template("autotag.tmpl");
+                       $template->param(tagname => IkiWiki::basename($tag));
+                       $template->param(tag => $tag);
+                       writefile($tagfile, $config{srcdir}, $template->output);
+                       if ($config{rcs}) {
+                               IkiWiki::disable_commit_hook();
+                               IkiWiki::rcs_add($tagfile);
+                               IkiWiki::rcs_commit_staged(message => $message);
+                               IkiWiki::enable_commit_hook();
+                       }
+               });
+       }
 }
 
 sub preprocess_tag (@) {
@@ -71,9 +109,11 @@ sub preprocess_tag (@) {
 
        foreach my $tag (keys %params) {
                $tag=linkpage($tag);
-               $tags{$page}{$tag}=1;
+               
                # hidden WikiLink
-               add_link($page, tagpage($tag));
+               add_link($page, taglink($tag), 'tag');
+               
+               gentag($tag);
        }
                
        return "";
@@ -87,16 +127,16 @@ sub preprocess_taglink (@) {
        return join(" ", map {
                if (/(.*)\|(.*)/) {
                        my $tag=linkpage($2);
-                       $tags{$params{page}}{$tag}=1;
-                       add_link($params{page}, tagpage($tag));
-                       return taglink($params{page}, $params{destpage}, $tag,
+                       add_link($params{page}, taglink($tag), 'tag');
+                       gentag($tag);
+                       return htmllink_tag($params{page}, $params{destpage}, $tag,
                                linktext => pagetitle($1));
                }
                else {
                        my $tag=linkpage($_);
-                       $tags{$params{page}}{$tag}=1;
-                       add_link($params{page}, tagpage($tag));
-                       return taglink($params{page}, $params{destpage}, $tag);
+                       add_link($params{page}, taglink($tag), 'tag');
+                       gentag($tag);
+                       return htmllink_tag($params{page}, $params{destpage}, $tag);
                }
        }
        grep {
@@ -110,17 +150,19 @@ sub pagetemplate (@) {
        my $destpage=$params{destpage};
        my $template=$params{template};
 
+       my $tags = $typedlinks{$page}{tag};
+
        $template->param(tags => [
                map { 
-                       link => taglink($page, $destpage, $_, rel => "tag")
-               }, sort keys %{$tags{$page}}
-       ]) if exists $tags{$page} && %{$tags{$page}} && $template->query(name => "tags");
+                       link => htmllink_tag($page, $destpage, $_, rel => "tag")
+               }, sort keys %$tags
+       ]) if defined $tags && %$tags && $template->query(name => "tags");
 
        if ($template->query(name => "categories")) {
                # It's an rss/atom template. Add any categories.
-               if (exists $tags{$page} && %{$tags{$page}}) {
+               if (defined $tags && %$tags) {
                        $template->param(categories => [map { category => $_ },
-                               sort keys %{$tags{$page}}]);
+                               sort keys %$tags]);
                }
        }
 }
@@ -128,9 +170,9 @@ sub pagetemplate (@) {
 package IkiWiki::PageSpec;
 
 sub match_tagged ($$;@) {
-       my $page = shift;
-       my $glob = shift;
-       return match_link($page, IkiWiki::Plugin::tag::tagpage($glob));
+       my $page=shift;
+       my $glob=IkiWiki::Plugin::tag::taglink(shift);
+       return match_link($page, $glob, linktype => 'tag', @_);
 }
 
 1
index b6097bb49d26133a54dc2fa27c3fc98e59d657bb..b8c2f05b29ab4492453a91b16dff76f8d1521228 100644 (file)
@@ -5,7 +5,6 @@ package IkiWiki::Plugin::template;
 use warnings;
 use strict;
 use IkiWiki 3.00;
-use HTML::Template;
 use Encode;
 
 sub import {
@@ -19,63 +18,59 @@ sub getsetup () {
                plugin => {
                        safe => 1,
                        rebuild => undef,
+                       section => "widget",
                },
 }
 
 sub preprocess (@) {
        my %params=@_;
 
+       # This needs to run even in scan mode, in order to process
+       # links and other metadata included via the template.
+       my $scan=! defined wantarray;
+
        if (! exists $params{id}) {
                error gettext("missing id parameter")
        }
 
-       my $template_page="templates/$params{id}";
-       add_depends($params{page}, $template_page);
-
-       my $template_file=$pagesources{$template_page};
-       return sprintf(gettext("template %s not found"),
-               htmllink($params{page}, $params{destpage}, "/".$template_page))
-                       unless defined $template_file;
-
+       # The bare id is used, so a page templates/$id can be used as 
+       # the template.
        my $template;
        eval {
-               $template=HTML::Template->new(
-                       filter => sub {
-                               my $text_ref = shift;
-                               $$text_ref=&Encode::decode_utf8($$text_ref);
-                               chomp $$text_ref;
-                       },
-                       filename => srcfile($template_file),
-                               die_on_bad_params => 0,
-                       no_includes => 1,
-                       blind_cache => 1,
-               );
+               $template=template_depends($params{id}, $params{page},
+                       blind_cache => 1);
        };
        if ($@) {
-               error gettext("failed to process:")." $@"
+               error gettext("failed to process template:")." $@";
+       }
+       if (! $template) {
+               error sprintf(gettext("%s not found"),
+                       htmllink($params{page}, $params{destpage},
+                               "/templates/$params{id}"))
        }
 
        $params{basename}=IkiWiki::basename($params{page});
 
        foreach my $param (keys %params) {
+               my $value=IkiWiki::preprocess($params{page}, $params{destpage},
+                         IkiWiki::filter($params{page}, $params{destpage},
+                         $params{$param}), $scan);
                if ($template->query(name => $param)) {
-                       $template->param($param =>
-                               IkiWiki::htmlize($params{page}, $params{destpage},
+                       my $htmlvalue=IkiWiki::htmlize($params{page}, $params{destpage},
                                        pagetype($pagesources{$params{page}}),
-                                       $params{$param}));
+                                       $value);
+                       chomp $htmlvalue;
+                       $template->param($param => $htmlvalue);
                }
                if ($template->query(name => "raw_$param")) {
-                       $template->param("raw_$param" => $params{$param});
+                       chomp $value;
+                       $template->param("raw_$param" => $value);
                }
        }
 
-       # This needs to run even in scan mode, in order to process
-       # links and other metadata includes via the template.
-       my $scan=! defined wantarray;
-
        return IkiWiki::preprocess($params{page}, $params{destpage},
-               IkiWiki::filter($params{page}, $params{destpage},
-               $template->output), $scan);
+              IkiWiki::filter($params{page}, $params{destpage},
+              $template->output), $scan);
 }
 
 1
index f92ed01326b7df203b59e4e05e423ce4f6f8209f..521af499fc77323870951883b49736509081cd8f 100644 (file)
@@ -8,6 +8,7 @@ use strict;
 use Digest::MD5 qw(md5_hex);
 use File::Temp qw(tempdir);
 use HTML::Entities;
+use Encode;
 use IkiWiki 3.00;
 
 my $default_prefix = <<EOPREFIX;
@@ -31,6 +32,7 @@ sub getsetup () {
                plugin => {
                        safe => 1,
                        rebuild => undef,
+                       section => "widget",
                },
                teximg_dvipng => {
                        type => "boolean",
@@ -102,7 +104,7 @@ sub create ($$$) {
                $height = 12;
        }
 
-       my $digest = md5_hex($code, $height);
+       my $digest = md5_hex(Encode::encode_utf8($code), $height);
 
        my $imglink= $params->{page} . "/$digest.png";
        my $imglog =  $params->{page} .  "/$digest.log";
index 8cc5a7951d3575e67b221ca312993fff158bae20..56bb4bffce83bf9fa47b1ad731f46c8dc8d9f652 100644 (file)
@@ -19,6 +19,7 @@ sub getsetup () {
                plugin => {
                        safe => 1,
                        rebuild => 1, # format plugin
+                       section => "format",
                },
 }
 
diff --git a/IkiWiki/Plugin/theme.pm b/IkiWiki/Plugin/theme.pm
new file mode 100644 (file)
index 0000000..03b0816
--- /dev/null
@@ -0,0 +1,65 @@
+#!/usr/bin/perl
+package IkiWiki::Plugin::theme;
+
+use warnings;
+use strict;
+use IkiWiki 3.00;
+
+sub import {
+       hook(type => "getsetup", id => "theme", call => \&getsetup);
+       hook(type => "checkconfig", id => "theme", call => \&checkconfig);
+       hook(type => "needsbuild", id => "theme", call => \&needsbuild);
+}
+
+sub getsetup () {
+       return
+               plugin => {
+                       safe => 1,
+                       rebuild => 0,
+                       section => "web",
+               },
+               theme => {
+                       type => "string",
+                       example => "actiontabs",
+                       description => "name of theme to enable",
+                       safe => 1,
+                       rebuild => 0,
+               },
+}
+
+my $added=0;
+sub checkconfig () {
+       if (! $added && exists $config{theme} && $config{theme} =~ /^\w+$/) {
+               add_underlay("themes/".$config{theme});
+               $added=1;
+       }
+}
+
+sub needsbuild ($) {
+       my $needsbuild=shift;
+       if (($config{theme} || '') ne ($wikistate{theme}{currenttheme} || '')) {
+               # theme changed; ensure all files in the theme are built
+               my %needsbuild=map { $_ => 1 } @$needsbuild;
+               if ($config{theme}) {
+                       foreach my $file (glob("$config{underlaydirbase}/themes/$config{theme}/*")) {
+                               if (-f $file) {
+                                       my $f=IkiWiki::basename($file);
+                                       push @$needsbuild, $f
+                                               unless $needsbuild{$f};
+                               }
+                       }
+               }
+               elsif ($wikistate{theme}{currenttheme}) {
+                       foreach my $file (glob("$config{underlaydirbase}/themes/$wikistate{theme}{currenttheme}/*")) {
+                               my $f=IkiWiki::basename($file);
+                               if (-f $file && defined eval { srcfile($f) }) {
+                                       push @$needsbuild, $f;
+                               }
+                       }
+               }
+               
+               $wikistate{theme}{currenttheme}=$config{theme};
+       }
+}
+
+1
index f4b20a6ec2b27681b98b92fa4d787cb9d8cb1fe1..da4385446412635d3b4843e4b439e07cd399195b 100644 (file)
@@ -18,6 +18,7 @@ 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);
+       hook(type => "rcs", id => "rcs_getmtime", call => \&rcs_getmtime);
 }
 
 sub checkconfig () {
@@ -34,6 +35,7 @@ sub getsetup () {
                plugin => {
                        safe => 0, # rcs plugin
                        rebuild => undef,
+                       section => "rcs",
                },
                tla_wrapper => {
                        type => "string",
@@ -96,18 +98,23 @@ sub rcs_prepedit ($) {
        }
 }
 
-sub rcs_commit ($$$;$$) {
-       my $file=shift;
-       my $message=shift;
-       my $rcstoken=shift;
-       my $user=shift;
-       my $ipaddr=shift;
+sub rcs_commit (@) {
+       my %params=@_;
 
-       if (defined $user) {
-               $message="web commit by $user".(length $message ? ": $message" : "");
-       }
-       elsif (defined $ipaddr) {
-               $message="web commit from $ipaddr".(length $message ? ": $message" : "");
+       my ($file, $message, $rcstoken)=
+               ($params{file}, $params{message}, $params{token});
+
+       if (defined $params{session}) {
+               if (defined $params{session}->param("name")) {
+                       $message="web commit by ".
+                               $params{session}->param("name").
+                               (length $message ? ": $message" : "");
+               }
+               elsif (defined $params{session}->remote_addr()) {
+                       $message="web commit from ".
+                               $params{session}->remote_addr().
+                               (length $message ? ": $message" : "");
+               }
        }
 
        if (-d "$config{srcdir}/{arch}") {
@@ -137,10 +144,10 @@ sub rcs_commit ($$$;$$) {
        return undef # success
 }
 
-sub rcs_commit_staged ($$$) {
+sub rcs_commit_staged (@) {
        # Commits all staged changes. Changes can be staged using rcs_add,
        # rcs_remove, and rcs_rename.
-       my ($message, $user, $ipaddr)=@_;
+       my %params=@_;
        
        error("rcs_commit_staged not implemented for tla"); # TODO
 }
@@ -161,7 +168,7 @@ sub rcs_remove ($) {
        error("rcs_remove not implemented for tla"); # TODO
 }
 
-sub rcs_rename ($$) { # {{{a
+sub rcs_rename ($$) {
        my ($src, $dest) = @_;
 
        error("rcs_rename not implemented for tla"); # TODO
@@ -283,4 +290,8 @@ sub rcs_getctime ($) {
        return $date;
 }
 
+sub rcs_getmtime ($) {
+       error "rcs_getmtime is not implemented for tla\n"; # TODO
+}
+
 1
index b8537d3eb02ac47e74fa13e8ca81b5df56fad424..ac07b9af6b860f0e5a36909197b4d98d0388fa41 100644 (file)
@@ -18,6 +18,7 @@ sub getsetup () {
                plugin => {
                        safe => 1,
                        rebuild => undef,
+                       section => "widget",
                },
 }
 
index ef066a42ff198212903474c6bc82f1140c879ba9..3319421d923d56c3489b7374edb912be7493027b 100644 (file)
@@ -20,6 +20,7 @@ sub getsetup () {
                plugin => {
                        safe => 1,
                        rebuild => undef,
+                       section => "widget",
                },
 }
 
@@ -80,9 +81,9 @@ sub include_javascript ($;$) {
        my $page=shift;
        my $absolute=shift;
        
-       return '<script src="'.urlto("ikiwiki.js", $page, $absolute).
+       return '<script src="'.urlto("ikiwiki/ikiwiki.js", $page, $absolute).
                '" type="text/javascript" charset="utf-8"></script>'."\n".
-               '<script src="'.urlto("toggle.js", $page, $absolute).
+               '<script src="'.urlto("ikiwiki/toggle.js", $page, $absolute).
                '" type="text/javascript" charset="utf-8"></script>';
 }
 
index 8599bdc8ec881429472ef19f760113f27d0a678f..0d9a0b35bd8abf6be895c4d1ce85f64a6077ded1 100644 (file)
@@ -29,6 +29,7 @@ sub getsetup () {
                plugin => {
                        safe => 1,
                        rebuild => 1, # format plugin
+                       section => "format",
                },
 }
 
@@ -38,7 +39,14 @@ sub filter (@) {
        my %params = @_;
        my $content = $params{content};
 
-       if (defined $pagesources{$params{page}} && $pagesources{$params{page}} =~ /\.txt$/) {
+       if (defined $pagesources{$params{page}} &&
+           $pagesources{$params{page}} =~ /\.txt$/) {
+               if ($pagesources{$params{page}} eq 'robots.txt' &&
+                   $params{page} eq $params{destpage}) {
+                       will_render($params{page}, 'robots.txt');
+                       writefile('robots.txt', $config{destdir}, $content);
+               }
+
                encode_entities($content, "<>&");
                if ($findurl) {
                        my $finder = URI::Find->new(sub {
index f62be82bbea849090876053a4d81ee6c558260c6..9389b24d428ba092915babf5f3cf7c98c3664058 100644 (file)
@@ -9,7 +9,7 @@ use IkiWiki 3.00;
 sub import {
        hook(type => "getopt", id => "typography", call => \&getopt);
        hook(type => "getsetup", id => "typography", call => \&getsetup);
-       IkiWiki::hook(type => "sanitize", id => "typography", call => \&sanitize);
+       hook(type => "sanitize", id => "typography", call => \&sanitize);
 }
 
 sub getopt () {
index 116fe7324e5d3b4a770acd6876067eb020cf4ae8..3ea19c63519bdecf6cd7331d21d722b3e0bc72de 100644 (file)
@@ -27,14 +27,6 @@ sub getsetup () {
                        safe => 0,
                        rebuild => 1,
                },
-               add_templates => {
-                       type => "string",
-                       example => ["$ENV{HOME}/.ikiwiki/templates"],
-                       description => "extra template directories to add",
-                       advanced => 1,
-                       safe => 0,
-                       rebuild => 1,
-               },
 }
 
 sub checkconfig () {
@@ -43,9 +35,6 @@ sub checkconfig () {
                        add_underlay($dir);
                }
        }
-       if ($config{add_templates}) {
-               push @{$config{templatedirs}}, @{$config{add_templates}};
-       }
 }
 
 1;
index 587cd55fa8f608fc2309d23eaa91ad1e32539c62..c13643478ab25012c5aacab3f0c9ca43aa2b2689 100644 (file)
@@ -17,6 +17,7 @@ sub getsetup () {
                plugin => {
                        safe => 1,
                        rebuild => undef,
+                       section => "widget",
                },
 }
 
index 9edd22d2625ddf474fc419d84b6bc544ba6c3270..11b4428e3fc0a55f6637516c56b2dca8a7460163 100644 (file)
@@ -18,6 +18,7 @@ sub getsetup () {
                plugin => {
                        safe => 1,
                        rebuild => 0,
+                       section => "web",
                },
                websetup_force_plugins => {
                        type => "string",
@@ -26,6 +27,13 @@ sub getsetup () {
                        safe => 0,
                        rebuild => 0,
                },
+               websetup_unsafe => {
+                       type => "string",
+                       example => [],
+                       description => "list of additional setup field keys to treat as unsafe",
+                       safe => 0,
+                       rebuild => 0,
+               },
                websetup_show_unsafe => {
                        type => "boolean",
                        example => 1,
@@ -56,6 +64,12 @@ sub formatexample ($$) {
        }
 }
 
+sub issafe ($) {
+       my $key=shift;
+
+       return ! grep { $_ eq $key } @{$config{websetup_unsafe}};
+}
+
 sub showfields ($$$@) {
        my $form=shift;
        my $plugin=shift;
@@ -66,27 +80,30 @@ sub showfields ($$$@) {
        while (@_) {
                my $key=shift;
                my %info=%{shift()};
+               
+               if ($key eq 'plugin') {
+                       %plugininfo=%info;
+                       next;
+               }
 
                # skip internal settings
                next if defined $info{type} && $info{type} eq "internal";
                # XXX hashes not handled yet
                next if ref $config{$key} && ref $config{$key} eq 'HASH' || ref $info{example} eq 'HASH';
                # maybe skip unsafe settings
-               next if ! $info{safe} && ! ($config{websetup_show_unsafe} && $config{websetup_advanced});
+               next if ! ($config{websetup_show_unsafe} && $config{websetup_advanced}) &&
+                       (! $info{safe} || ! issafe($key));
                # maybe skip advanced settings
                next if $info{advanced} && ! $config{websetup_advanced};
                # these are handled specially, so don't show
                next if $key eq 'add_plugins' || $key eq 'disable_plugins';
 
-               if ($key eq 'plugin') {
-                       %plugininfo=%info;
-                       next;
-               }
-               
                push @show, $key, \%info;
        }
 
-       my $section=defined $plugin ? $plugin." ".gettext("plugin") : "main";
+       my $section=defined $plugin
+               ? sprintf(gettext("%s plugin:"), $plugininfo{section})." ".$plugin
+               : "main";
        my %enabledfields;
        my $shownfields=0;
        
@@ -97,6 +114,16 @@ sub showfields ($$$@) {
                @show=();
        }
 
+       my $section_fieldset;
+       if (defined $plugin) {
+               # Define the combined fieldset for the plugin's section.
+               # This ensures that this fieldset comes first.
+               $section_fieldset=sprintf(gettext("%s plugins"), $plugininfo{section});
+               $form->field(name => "placeholder.$plugininfo{section}",
+                       type => "hidden",
+                       fieldset => $section_fieldset);
+       }
+
        # show plugin toggle
        if (defined $plugin && (! $plugin_forced || $config{websetup_advanced})) {
                my $name="enable.$plugin";
@@ -137,9 +164,16 @@ sub showfields ($$$@) {
                my $name=defined $plugin ? $plugin.".".$key : $section.".".$key;
 
                my $value=$config{$key};
+               if (! defined $value) {
+                       $value="";
+               }
 
-               if ($info{safe} && (ref $value eq 'ARRAY' || ref $info{example} eq 'ARRAY')) {
-                       $value=[(ref $value eq 'ARRAY' ? @{$value} : ""), "", ""]; # blank items for expansion
+               if (ref $value eq 'ARRAY' || ref $info{example} eq 'ARRAY') {
+                       $value=[(ref $value eq 'ARRAY' ? map { Encode::encode_utf8($_) }  @{$value} : "")];
+                       push @$value, "", "" if $info{safe} && issafe($key); # blank items for expansion
+               }
+               else {
+                       $value=Encode::encode_utf8($value);
                }
 
                if ($info{type} eq "string") {
@@ -190,7 +224,7 @@ sub showfields ($$$@) {
                        }
                }
                
-               if (! $info{safe}) {
+               if (! $info{safe} || ! issafe($key)) {
                        $form->field(name => $name, disabled => 1);
                }
                else {
@@ -199,11 +233,11 @@ sub showfields ($$$@) {
                $shownfields++;
        }
        
-       # if no fields were shown for the plugin, drop it into the
-       # plugins fieldset
+       # if no fields were shown for the plugin, drop it into a combined
+       # fieldset for its section
        if (defined $plugin && (! $plugin_forced || $config{websetup_advanced}) &&
            ! $shownfields) {
-               $form->field(name => "enable.$plugin", fieldset => "plugins");
+               $form->field(name => "enable.$plugin", fieldset => $section_fieldset);
        }
 
        return %enabledfields;
@@ -219,18 +253,16 @@ sub enable_plugin ($) {
 sub disable_plugin ($) {
        my $plugin=shift;
 
-       if (grep { $_ eq $plugin } @{$config{add_plugins}}) {
-               $config{add_plugins}=[grep { $_ ne $plugin } @{$config{add_plugins}}];
-       }
-       else {
-               push @{$config{disable_plugins}}, $plugin;
-       }
+       $config{add_plugins}=[grep { $_ ne $plugin } @{$config{add_plugins}}];
+       push @{$config{disable_plugins}}, $plugin;
 }
 
 sub showform ($$) {
        my $cgi=shift;
        my $session=shift;
 
+       IkiWiki::needsignin($cgi, $session);
+
        if (! defined $session->param("name") || 
            ! IkiWiki::is_admin($session->param("name"))) {
                error(gettext("you are not logged in as an admin"));
@@ -254,11 +286,10 @@ sub showform ($$) {
                params => $cgi,
                fieldsets => [
                        [main => gettext("main")], 
-                       [plugins => gettext("plugins")]
                ],
                action => $config{cgiurl},
                template => {type => 'div'},
-               stylesheet => IkiWiki::baseurl()."style.css",
+               stylesheet => 1,
        );
        
        $form->field(name => "do", type => "hidden", value => "setup",
@@ -290,7 +321,6 @@ sub showform ($$) {
                shift->(form => $form, cgi => $cgi, session => $session,
                        buttons => $buttons);
        });
-       IkiWiki::decode_form_utf8($form);
 
        my %fields=showfields($form, undef, undef, IkiWiki::getsetup());
        
@@ -308,6 +338,8 @@ sub showform ($$) {
                        $fields{$_}=$shown{$_} foreach keys %shown;
                }
        }
+
+       IkiWiki::decode_form_utf8($form);
        
        if ($form->submitted eq "Cancel") {
                IkiWiki::redirect($cgi, $config{url});
@@ -326,7 +358,7 @@ sub showform ($$) {
                                @value=0;
                        }
                
-                       if (! $info{safe}) {
+                       if (! $info{safe} || ! issafe($key)) {
                                error("unsafe field $key"); # should never happen
                        }
                
@@ -357,7 +389,11 @@ sub showform ($$) {
                                @value=sort grep { length $_ } @value;
                                my @oldvalue=sort grep { length $_ }
                                        (defined $config{$key} ? @{$config{$key}} : ());
-                               if ((@oldvalue) == (@value)) {
+                               my $same=(@oldvalue) == (@value);
+                               for (my $x=0; $same && $x < @value; $x++) {
+                                       $same=0 if $value[$x] ne $oldvalue[$x];
+                               }
+                               if ($same) {
                                        delete $rebuild{$field};
                                }
                                else {
@@ -410,8 +446,8 @@ sub showform ($$) {
                        IkiWiki::unlockwiki();
 
                        # Print the top part of a standard misctemplate,
-                       # then show the rebuild or refresh.
-                       my $divider="xxx";
+                       # then show the rebuild or refresh, live.
+                       my $divider="\0";
                        my $html=IkiWiki::misctemplate("setup", $divider);
                        IkiWiki::printheader($session);
                        my ($head, $tail)=split($divider, $html, 2);
@@ -463,9 +499,10 @@ sub formbuilder_setup (@) {
        my %params=@_;
 
        my $form=$params{form};
-       if ($form->title eq "preferences") {
-               push @{$params{buttons}}, "Wiki Setup";
-               if ($form->submitted && $form->submitted eq "Wiki Setup") {
+       if ($form->title eq "preferences" &&
+           IkiWiki::is_admin($params{session}->param("name"))) {
+               push @{$params{buttons}}, "Setup";
+               if ($form->submitted && $form->submitted eq "Setup") {
                        showform($params{cgi}, $params{session});
                        exit;
                }
index accb03bbef8317cad028d95fe36a68b466d9bd0f..b24630b15bf9c380e2b68af44f59bcffaaf5bb70 100644 (file)
@@ -16,6 +16,7 @@ sub getsetup () {
                plugin => {
                        safe => 0, # format plugin
                        rebuild => undef,
+                       section => "format",
                },
 }
 
index 9ddd237abf7e992f0e0d2dfdfa3daf3ed1c59baa..71d7c9d17f51e49ec17aee087e984f3e8a7b9b79 100644 (file)
@@ -4,8 +4,6 @@ package IkiWiki::Plugin::wmd;
 use warnings;
 use strict;
 use IkiWiki 3.00;
-use POSIX;
-use Encode;
 
 sub import {
        add_underlay("wmd");
@@ -17,6 +15,8 @@ sub getsetup () {
        return
                plugin => {
                        safe => 1,
+                       rebuild => 0,
+                       section => "web",
                },
 }
 
index cd94d093853023b0c7e2c6f29649c4b6d920c220..fdd463025457f918458168a2671f7c97dd2a37ab 100644 (file)
@@ -57,7 +57,6 @@ sub test () {
        eval q{use CGI};
        error($@) if $@;
        my $cgi=CGI->new;
-       $ENV{REMOTE_ADDR}='unknown' unless exists $ENV{REMOTE_ADDR};
 
        # And dummy up a session object.
        require IkiWiki::CGI;
@@ -82,7 +81,7 @@ sub test () {
                my ($file)=$change->{file}=~/$config{wiki_file_regexp}/;
                $file=IkiWiki::possibly_foolish_untaint($file);
                if (! defined $file || ! length $file ||
-                   IkiWiki::file_pruned($file, $config{srcdir})) {
+                   IkiWiki::file_pruned($file)) {
                        error(gettext("bad file name %s"), $file);
                }
 
index 3ebb1a324d8a3118b54f0d7c6360587892917b65..a653ab2da02e542828349c3d9f3ac200340608f4 100644 (file)
@@ -43,7 +43,7 @@ sub backlinks ($) {
        my @links;
        foreach my $p (backlink_pages($page)) {
                my $href=urlto($p, $page);
-                
+
                # Trim common dir prefixes from both pages.
                my $p_trimmed=$p;
                my $page_trimmed=$page;
@@ -62,8 +62,8 @@ sub genpage ($$) {
        my $page=shift;
        my $content=shift;
        
-       run_hooks(postscan => sub {
-               shift->(page => $page, content => $content);
+       run_hooks(indexhtml => sub {
+               shift->(page => $page, destpage => $page, content => $content);
        });
 
        my $templatefile;
@@ -74,20 +74,24 @@ sub genpage ($$) {
                        $templatefile=$file;
                }
        });
-       my $template=template(defined $templatefile ? $templatefile : 'page.tmpl', blind_cache => 1);
-       my $actions=0;
+       my $template;
+       if (defined $templatefile) {
+               $template=template_depends($templatefile, $page,
+                       blind_cache => 1);
+       }
+       else {
+               # no explicit depends as special case
+               $template=template('page.tmpl', 
+                       blind_cache => 1);
+       }
 
+       my $actions=0;
        if (length $config{cgiurl}) {
                if (IkiWiki->can("cgi_editpage")) {
                        $template->param(editurl => cgiurl(do => "edit", page => $page));
                        $actions++;
                }
-               if (exists $hooks{auth}) {
-                       $template->param(prefsurl => cgiurl(do => "prefs"));
-                       $actions++;
-               }
        }
-               
        if (defined $config{historyurl} && length $config{historyurl}) {
                my $u=$config{historyurl};
                $u=~s/\[\[file\]\]/$pagesources{$page}/g;
@@ -102,10 +106,10 @@ sub genpage ($$) {
                        $actions++;
                }
        }
-
        if ($actions) {
                $template->param(have_actions => 1);
        }
+       templateactions($template, $page);
 
        my @backlinks=sort { $a->{page} cmp $b->{page} } backlinks($page);
        my ($backlinks, $more_backlinks);
@@ -127,8 +131,9 @@ sub genpage ($$) {
                backlinks => $backlinks,
                more_backlinks => $more_backlinks,
                mtime => displaytime($pagemtime{$page}),
-               ctime => displaytime($pagectime{$page}),
+               ctime => displaytime($pagectime{$page}, undef, 1),
                baseurl => baseurl($page),
+               html5 => $config{html5},
        );
 
        run_hooks(pagetemplate => sub {
@@ -167,6 +172,7 @@ sub scan ($) {
                else {
                        $links{$page}=[];
                }
+               delete $typedlinks{$page};
 
                run_hooks(scan => sub {
                        shift->(
@@ -285,64 +291,68 @@ sub find_src_files () {
        my %pages;
        eval q{use File::Find};
        error($@) if $@;
-       find({
-               no_chdir => 1,
-               wanted => sub {
-                       my $file=decode_utf8($_);
-                       $file=~s/^\Q$config{srcdir}\E\/?//;
-                       return if -l $_ || -d _ || ! length $file;
-                       my $page = pagename($file);
-                       if (! exists $pagesources{$page} &&
-                           file_pruned($file)) {
-                               $File::Find::prune=1;
-                               return;
-                       }
 
-                       my ($f) = $file =~ /$config{wiki_file_regexp}/; # untaint
-                       if (! defined $f) {
-                               warn(sprintf(gettext("skipping bad filename %s"), $file)."\n");
-                       }
-                       else {
-                               push @files, $f;
-                               if ($pages{$page}) {
-                                       debug(sprintf(gettext("%s has multiple possible source pages"), $page));
+       eval q{use Cwd};
+       die $@ if $@;
+       my $origdir=getcwd();
+       my $abssrcdir=Cwd::abs_path($config{srcdir});
+
+       my ($page, $underlay);
+       my $helper=sub {
+               my $file=decode_utf8($_);
+
+               return if -l $file || -d _;
+               $file=~s/^\.\///;
+               return if ! length $file;
+               $page = pagename($file);
+               if (! exists $pagesources{$page} &&
+                   file_pruned($file)) {
+                       $File::Find::prune=1;
+                       return;
+               }
+
+               my ($f) = $file =~ /$config{wiki_file_regexp}/; # untaint
+               if (! defined $f) {
+                       warn(sprintf(gettext("skipping bad filename %s"), $file)."\n");
+                       return;
+               }
+       
+               if ($underlay) {
+                       # avoid underlaydir override attacks; see security.mdwn
+                       if (! -l "$abssrcdir/$f" && ! -e _) {
+                               if (! $pages{$page}) {
+                                       push @files, $f;
+                                       $pages{$page}=1;
                                }
-                               $pages{$page}=1;
                        }
-               },
-       }, $config{srcdir});
-       foreach my $dir (@{$config{underlaydirs}}, $config{underlaydir}) {
-               find({
-                       no_chdir => 1,
-                       wanted => sub {
-                               my $file=decode_utf8($_);
-                               $file=~s/^\Q$dir\E\/?//;
-                               return if -l $_ || -d _ || ! length $file;
-                               my $page=pagename($file);
-                               if (! exists $pagesources{$page} &&
-                                   file_pruned($file)) {
-                                       $File::Find::prune=1;
-                                       return;
-                               }
+               }
+               else {
+                       push @files, $f;
+                       if ($pages{$page}) {
+                               debug(sprintf(gettext("%s has multiple possible source pages"), $page));
+                       }
+                       $pages{$page}=1;
+               }
+       };
 
-                               my ($f) = $file =~ /$config{wiki_file_regexp}/; # untaint
-                               if (! defined $f) {
-                                       warn(sprintf(gettext("skipping bad filename %s"), $file)."\n");
-                               }
-                               else {
-                                       # avoid underlaydir override
-                                       # attacks; see security.mdwn
-                                       if (! -l "$config{srcdir}/$f" && 
-                                           ! -e _) {
-                                               if (! $pages{$page}) {
-                                                       push @files, $f;
-                                                       $pages{$page}=1;
-                                               }
-                                       }
-                               }
-                       },
-               }, $dir);
+       chdir($config{srcdir}) || die "chdir $config{srcdir}: $!";
+       find({
+               no_chdir => 1,
+               wanted => $helper,
+       }, '.');
+       chdir($origdir) || die "chdir $origdir: $!";
+
+       $underlay=1;
+       foreach (@{$config{underlaydirs}}, $config{underlaydir}) {
+               if (chdir($_)) {
+                       find({
+                               no_chdir => 1,
+                               wanted => $helper,
+                       }, '.');
+                       chdir($origdir) || die "chdir: $!";
+               }
        };
+
        return \@files, \%pages;
 }
 
@@ -351,8 +361,39 @@ sub find_new_files ($) {
        my @new;
        my @internal_new;
 
+       my $times_noted;
+
        foreach my $file (@$files) {
                my $page=pagename($file);
+
+               if ($config{rcs} && $config{gettime} &&
+                   -e "$config{srcdir}/$file") {
+                       if (! $times_noted) {
+                               debug(sprintf(gettext("querying %s for file creation and modification times.."), $config{rcs}));
+                               $times_noted=1;
+                       }
+
+                       eval {
+                               my $ctime=rcs_getctime($file);
+                               if ($ctime > 0) {
+                                       $pagectime{$page}=$ctime;
+                               }
+                       };
+                       if ($@) {
+                               print STDERR $@;
+                       }
+                       my $mtime;
+                       eval {
+                               $mtime=rcs_getmtime($file);
+                       };
+                       if ($@) {
+                               print STDERR $@;
+                       }
+                       elsif ($mtime > 0) {
+                               utime($mtime, $mtime, "$config{srcdir}/$file");
+                       }
+               }
+
                if (exists $pagesources{$page} && $pagesources{$page} ne $file) {
                        # the page has changed its type
                        $forcerebuild{$page}=1;
@@ -364,15 +405,6 @@ sub find_new_files ($) {
                        }
                        else {
                                push @new, $file;
-                               if ($config{getctime} && -e "$config{srcdir}/$file") {
-                                       eval {
-                                               my $time=rcs_getctime("$config{srcdir}/$file");
-                                               $pagectime{$page}=$time;
-                                       };
-                                       if ($@) {
-                                               print STDERR $@;
-                                       }
-                               }
                        }
                        $pagecase{lc $page}=$page;
                        if (! exists $pagectime{$page}) {
@@ -389,7 +421,7 @@ sub find_del_files ($) {
        my @del;
        my @internal_del;
 
-       foreach my $page (keys %pagemtime) {
+       foreach my $page (keys %pagesources) {
                if (! $pages->{$page}) {
                        if (isinternal($page)) {
                                push @internal_del, $pagesources{$page};
@@ -398,6 +430,7 @@ sub find_del_files ($) {
                                push @del, $pagesources{$page};
                        }
                        $links{$page}=[];
+                       delete $typedlinks{$page};
                        $renderedfiles{$page}=[];
                        $pagemtime{$page}=0;
                }
@@ -410,7 +443,7 @@ sub remove_del (@) {
        foreach my $file (@_) {
                my $page=pagename($file);
                if (! isinternal($page)) {
-                       debug(sprintf(gettext("removing old page %s"), $page));
+                       debug(sprintf(gettext("removing obsolete %s"), $page));
                }
        
                foreach my $old (@{$oldrenderedfiles{$page}}) {
@@ -424,6 +457,7 @@ sub remove_del (@) {
                }
        
                delete $pagecase{lc $page};
+               $delpagesources{$page}=$pagesources{$page};
                delete $pagesources{$page};
        }
 }
@@ -499,6 +533,29 @@ sub remove_unrendered () {
        }
 }
 
+sub link_types_changed ($$) {
+       # each is of the form { type => { link => 1 } }
+       my $new = shift;
+       my $old = shift;
+
+       return 0 if !defined $new && !defined $old;
+       return 1 if (!defined $new && %$old) || (!defined $old && %$new);
+
+       while (my ($type, $links) = each %$new) {
+               foreach my $link (keys %$links) {
+                       return 1 unless exists $old->{$type}{$link};
+               }
+       }
+
+       while (my ($type, $links) = each %$old) {
+               foreach my $link (keys %$links) {
+                       return 1 unless exists $new->{$type}{$link};
+               }
+       }
+
+       return 0;
+}
+
 sub calculate_changed_links ($$$) {
        my ($changed, $del, $oldlink_targets)=@_;
 
@@ -525,6 +582,14 @@ sub calculate_changed_links ($$$) {
                        }
                        $linkchangers{lc($page)}=1;
                }
+
+               # we currently assume that changing the type of a link doesn't
+               # change backlinks
+               if (!exists $linkchangers{lc($page)}) {
+                       if (link_types_changed($typedlinks{$page}, $oldtypedlinks{$page})) {
+                               $linkchangers{lc($page)}=1;
+                       }
+               }
        }
 
        return \%backlinkchanged, \%linkchangers;
@@ -539,13 +604,23 @@ sub render_dependent ($$$$$$$) {
        
        my %lc_changed = map { lc(pagename($_)) => 1 } @changed;
        my %lc_exists_changed = map { lc(pagename($_)) => 1 } @exists_changed;
+
+       foreach my $p ("templates/page.tmpl", keys %{$depends_simple{""}}) {
+               if ($rendered{$p} || grep { $_ eq $p } @$del) {
+                       foreach my $f (@$files) {
+                               next if $rendered{$f};
+                               render($f, sprintf(gettext("building %s, which depends on %s"), $f, $p));
+                       }
+                       return 0;
+               }
+       }
         
        foreach my $f (@$files) {
                next if $rendered{$f};
                my $p=pagename($f);
                my $reason = undef;
-       
-               if (exists $depends_simple{$p}) {
+
+               if (exists $depends_simple{$p} && ! defined $reason) {
                        foreach my $d (keys %{$depends_simple{$p}}) {
                                if (($depends_simple{$p}{$d} & $IkiWiki::DEPEND_CONTENT &&
                                     $lc_changed{$d})
@@ -565,12 +640,12 @@ sub render_dependent ($$$$$$$) {
                if (exists $depends{$p} && ! defined $reason) {
                        foreach my $dep (keys %{$depends{$p}}) {
                                my $sub=pagespec_translate($dep);
-                               next if $@ || ! defined $sub;
+                               next unless defined $sub;
 
                                # only consider internal files
                                # if the page explicitly depends
                                # on such files
-                               my $internal_dep=$dep =~ /internal\(/;
+                               my $internal_dep=$dep =~ /(?:internal|comment|comment_pending)\(/;
 
                                my $in=sub {
                                        my $list=shift;
@@ -582,34 +657,35 @@ sub render_dependent ($$$$$$$) {
                                                        if ($type == $IkiWiki::DEPEND_LINKS) {
                                                                next unless $linkchangers->{lc($page)};
                                                        }
-                                                       return $page;
+                                                       $reason=$page;
+                                                       return 1;
                                                }
                                        }
                                        return undef;
                                };
 
                                if ($depends{$p}{$dep} & $IkiWiki::DEPEND_CONTENT) {
-                                       last if $reason =
-                                               $in->(\@changed, $IkiWiki::DEPEND_CONTENT);
-                                       last if $internal_dep && ($reason =
+                                       last if $in->(\@changed, $IkiWiki::DEPEND_CONTENT);
+                                       last if $internal_dep && (
                                                $in->($internal_new, $IkiWiki::DEPEND_CONTENT) ||
                                                $in->($internal_del, $IkiWiki::DEPEND_CONTENT) ||
-                                               $in->($internal_changed, $IkiWiki::DEPEND_CONTENT));
+                                               $in->($internal_changed, $IkiWiki::DEPEND_CONTENT)
+                                       );
                                }
                                if ($depends{$p}{$dep} & $IkiWiki::DEPEND_PRESENCE) {
-                                       last if $reason = 
-                                               $in->(\@exists_changed, $IkiWiki::DEPEND_PRESENCE);
-                                       last if $internal_dep && ($reason =
+                                       last if $in->(\@exists_changed, $IkiWiki::DEPEND_PRESENCE);
+                                       last if $internal_dep && (
                                                $in->($internal_new, $IkiWiki::DEPEND_PRESENCE) ||
-                                               $in->($internal_del, $IkiWiki::DEPEND_PRESENCE));
+                                               $in->($internal_del, $IkiWiki::DEPEND_PRESENCE)
+                                       );
                                }
                                if ($depends{$p}{$dep} & $IkiWiki::DEPEND_LINKS) {
-                                       last if $reason =
-                                               $in->(\@changed, $IkiWiki::DEPEND_LINKS);
-                                       last if $internal_dep && ($reason =
+                                       last if $in->(\@changed, $IkiWiki::DEPEND_LINKS);
+                                       last if $internal_dep && (
                                                $in->($internal_new, $IkiWiki::DEPEND_LINKS) ||
                                                $in->($internal_del, $IkiWiki::DEPEND_LINKS) ||
-                                               $in->($internal_changed, $IkiWiki::DEPEND_LINKS));
+                                               $in->($internal_changed, $IkiWiki::DEPEND_LINKS)
+                                       );
                                }
                        }
                }
@@ -633,6 +709,49 @@ sub render_backlinks ($) {
        }
 }
 
+sub gen_autofile ($$$) {
+       my $autofile=shift;
+       my $pages=shift;
+       my $del=shift;
+
+       if (file_pruned($autofile)) {
+               return;
+       }
+
+       my ($file)="$config{srcdir}/$autofile" =~ /$config{wiki_file_regexp}/; # untaint
+       if (! defined $file) {
+               return;
+       }
+
+       # Remember autofiles that were tried, and never try them again later.
+       if (exists $wikistate{$autofiles{$autofile}{plugin}}{autofile}{$autofile}) {
+               return;
+       }
+       $wikistate{$autofiles{$autofile}{plugin}}{autofile}{$autofile}=1;
+
+       if (srcfile($autofile, 1) || file_pruned($autofile)) {
+               return;
+       }
+       
+       if (-l $file || -d _ || -e _) {
+               return;
+       }
+
+       my $page = pagename($file);
+       if ($pages->{$page}) {
+               return;
+       }
+
+       if (grep { $_ eq $autofile } @$del) {
+               return;
+       }
+
+       $autofiles{$autofile}{generator}->();
+       $pages->{$page}=1;
+       return 1;
+}
+
+
 sub refresh () {
        srcdir_check();
        run_hooks(refresh => sub { shift->() });
@@ -647,6 +766,16 @@ sub refresh () {
                scan($file);
        }
 
+       foreach my $autofile (keys %autofiles) {
+               if (gen_autofile($autofile, $pages, $del)) {
+                       push @{$files}, $autofile;
+                       push @{$new}, $autofile if find_new_files([$autofile]);
+                       push @{$changed}, $autofile if find_changed([$autofile]);
+                       
+                       scan($autofile);
+               }
+       }
+
        calculate_links();
        
        remove_del(@$del, @$internal_del);
@@ -664,7 +793,7 @@ sub refresh () {
        foreach my $file (@$new, @$del) {
                render_linkers($file);
        }
-       
+
        if (@$changed || @$internal_changed ||
            @$del || @$internal_del || @$internal_new) {
                1 while render_dependent($files, $new, $internal_new,
@@ -675,14 +804,25 @@ sub refresh () {
        render_backlinks($backlinkchanged);
        remove_unrendered();
 
-       if (@$del) {
-               run_hooks(delete => sub { shift->(@$del) });
+       if (@$del || @$internal_del) {
+               run_hooks(delete => sub { shift->(@$del, @$internal_del) });
        }
        if (%rendered) {
                run_hooks(change => sub { shift->(keys %rendered) });
        }
 }
 
+sub clean_rendered {
+       lockwiki();
+       loadindex();
+       remove_unrendered();
+       foreach my $page (keys %oldrenderedfiles) {
+               foreach my $file (@{$oldrenderedfiles{$page}}) {
+                       prune($config{destdir}."/".$file);
+               }
+       }
+}
+
 sub commandline_render () {
        lockwiki();
        loadindex();
index 8a25ecc575da894711d27e4583e6ab491b350a45..2b0259e2ac0e9b258d6537c48399547dba921e1d 100644 (file)
@@ -1,6 +1,8 @@
 #!/usr/bin/perl
-# Ikiwiki setup files are perl files that 'use IkiWiki::Setup::foo',
-# passing it some sort of configuration data.
+# Ikiwiki setup files can be perl files that 'use IkiWiki::Setup::foo',
+# passing it some sort of configuration data. Or, they can contain
+# the module name at the top, without the 'use', and the whole file is
+# then fed into that module.
 
 package IkiWiki::Setup;
 
@@ -10,24 +12,59 @@ use IkiWiki;
 use open qw{:utf8 :std};
 use File::Spec;
 
-sub load ($) {
-       my $setup=IkiWiki::possibly_foolish_untaint(shift);
-       $config{setupfile}=File::Spec->rel2abs($setup);
+sub load ($;$) {
+       my $file=IkiWiki::possibly_foolish_untaint(shift);
+       my $safemode=shift;
+
+       $config{setupfile}=File::Spec->rel2abs($file);
 
        #translators: The first parameter is a filename, and the second
        #translators: is a (probably not translated) error message.
-       open (IN, $setup) || error(sprintf(gettext("cannot read %s: %s"), $setup, $!));
-       my $code;
+       open (IN, $file) || error(sprintf(gettext("cannot read %s: %s"), $file, $!));
+       my $content;
        {
                local $/=undef;
-               $code=<IN> || error("$setup: $!");
+               $content=<IN> || error("$file: $!");
        }
-       
-       ($code)=$code=~/(.*)/s;
        close IN;
 
-       eval $code;
-       error("$setup: ".$@) if $@;
+       if ($content=~/((?:use|require)\s+)?IkiWiki::Setup::(\w+)/) {
+               $config{setuptype}=$2;
+               if ($1) {
+                       error sprintf(gettext("cannot load %s in safe mode"), $file)
+                               if $safemode;
+                       no warnings;
+                       eval IkiWiki::possibly_foolish_untaint($content);
+                       error("$file: ".$@) if $@;
+               }
+               else {
+                       eval qq{require IkiWiki::Setup::$config{setuptype}};
+                       error $@ if $@;
+                       "IkiWiki::Setup::$config{setuptype}"->loaddump(IkiWiki::possibly_foolish_untaint($content));
+               }
+       }
+       else {
+               error sprintf(gettext("failed to parse %s"), $file);
+       }
+}
+
+sub dump ($) {
+       my $file=IkiWiki::possibly_foolish_untaint(shift);
+       
+       eval qq{require IkiWiki::Setup::$config{setuptype}};
+       error $@ if $@;
+       my @dump="IkiWiki::Setup::$config{setuptype}"->gendump(
+               "Setup file for ikiwiki.",
+               "",
+               "Passing this to ikiwiki --setup will make ikiwiki generate",
+               "wrappers and build the wiki.",
+               "",
+               "Remember to re-run ikiwiki --setup any time you edit this file.",
+       );
+
+       open (OUT, ">", $file) || die "$file: $!";
+       print OUT "$_\n" foreach @dump;
+       close OUT;
 }
 
 sub merge ($) {
@@ -77,7 +114,6 @@ sub merge ($) {
 sub getsetup () {
        # Gets all available setup data from all plugins. Returns an
        # ordered list of [plugin, setup] pairs.
-       my @ret;
 
         # disable logging to syslog while dumping, broken plugins may
        # whine when loaded
@@ -85,38 +121,116 @@ sub getsetup () {
         $config{syslog}=undef;
 
        # Load all plugins, so that all setup options are available.
-       my @plugins=grep { $_ ne $config{rcs} } sort(IkiWiki::listplugins());
-       unshift @plugins, $config{rcs} if $config{rcs}; # rcs plugin 1st
+       my @plugins=IkiWiki::listplugins();
        foreach my $plugin (@plugins) {
-               eval { IkiWiki::loadplugin($plugin) };
+               eval { IkiWiki::loadplugin($plugin, 1) };
                if (exists $IkiWiki::hooks{checkconfig}{$plugin}{call}) {
                        my @s=eval { $IkiWiki::hooks{checkconfig}{$plugin}{call}->() };
                }
        }
-
+       
+       my %sections;
        foreach my $plugin (@plugins) {
                if (exists $IkiWiki::hooks{getsetup}{$plugin}{call}) {
                        # use an array rather than a hash, to preserve order
                        my @s=eval { $IkiWiki::hooks{getsetup}{$plugin}{call}->() };
                        next unless @s;
-                       push @ret, [ $plugin, \@s ],
+
+                       # set default section value (note use of shared
+                       # hashref between array and hash)
+                       my %s=@s;
+                       if (! exists $s{plugin} || ! $s{plugin}->{section}) {
+                               $s{plugin}->{section}="other";
+                       }
+
+                       # only the selected rcs plugin is included
+                       if ($config{rcs} && $plugin eq $config{rcs}) {
+                               $s{plugin}->{section}="core";
+                       }
+                       elsif ($s{plugin}->{section} eq "rcs") {
+                               next;
+                       }
+
+                       push @{$sections{$s{plugin}->{section}}}, [ $plugin, \@s ];
                }
        }
        
         $config{syslog}=$syslog;
 
-       return @ret;
+       return map { sort { $a->[0] cmp $b->[0] } @{$sections{$_}} }
+               sort { # core first, other last, otherwise alphabetical
+                       ($b eq "core") <=> ($a eq "core")
+                          ||
+                       ($a eq "other") <=> ($b eq "other")
+                          ||
+                       $a cmp $b
+               } keys %sections;
 }
 
-sub dump ($) {
-       my $file=IkiWiki::possibly_foolish_untaint(shift);
+sub commented_dump ($$) {
+       my $dumpline=shift;
+       my $indent=shift;
+
+       my %setup=(%config);
+       my @ret;
        
-       require IkiWiki::Setup::Standard;
-       my @dump=IkiWiki::Setup::Standard::gendump("Setup file for ikiwiki.");
+       # disable logging to syslog while dumping
+       $config{syslog}=undef;
 
-       open (OUT, ">", $file) || die "$file: $!";
-       print OUT "$_\n" foreach @dump;
-       close OUT;
+       eval q{use Text::Wrap};
+       die $@ if $@;
+
+       my %section_plugins;
+       push @ret, commented_dumpvalues($dumpline, $indent, \%setup, IkiWiki::getsetup());
+       foreach my $pair (IkiWiki::Setup::getsetup()) {
+               my $plugin=$pair->[0];
+               my $setup=$pair->[1];
+               my %s=@{$setup};
+               my $section=$s{plugin}->{section};
+               push @{$section_plugins{$section}}, $plugin;
+               if (@{$section_plugins{$section}} == 1) {
+                       push @ret, "", $indent.("#" x 70), "$indent# $section plugins",
+                               sub {
+                                       wrap("$indent#   (", "$indent#    ",
+                                               join(", ", @{$section_plugins{$section}})).")"
+                               },
+                               $indent.("#" x 70);
+               }
+
+               my @values=commented_dumpvalues($dumpline, $indent, \%setup, @{$setup});
+               if (@values) {
+                       push @ret, "", "$indent# $plugin plugin", @values;
+               }
+       }
+
+       return map { ref $_ ? $_->() : $_ } @ret;
+}
+
+sub commented_dumpvalues ($$$@) {
+       my $dumpline=shift;
+       my $indent=shift;
+       my $setup=shift;
+       my @ret;
+       while (@_) {
+               my $key=shift;
+               my %info=%{shift()};
+
+               next if $key eq "plugin" || $info{type} eq "internal";
+               
+               push @ret, "$indent# ".$info{description} if exists $info{description};
+               
+               if (exists $setup->{$key} && defined $setup->{$key}) {
+                       push @ret, $dumpline->($key, $setup->{$key}, $info{type}, "");
+                       delete $setup->{$key};
+               }
+               elsif (exists $info{example}) {
+                       push @ret, $dumpline->($key, $info{example}, $info{type}, "#");
+               }
+               else {
+                       push @ret, $dumpline->($key, "", $info{type}, "#");
+               }
+       }
+       return @ret;
 }
 
 1
index 7af93e73c35ee0328590d6c7e37e36a09e72f99a..2dcb424e56c57826900a50a413243a48ce840132 100644 (file)
@@ -15,6 +15,7 @@ sub ask ($$) {
        my ($question, $default)=@_;
 
        my $r=Term::ReadLine->new("ikiwiki");
+       $r->ornaments("md,me");
        $r->readline(encode_utf8($question)." ", $default);
 }
 
@@ -37,19 +38,22 @@ sub sanitize_wikiname ($) {
 
 sub import (@) {
        my $this=shift;
+       $config{setuptype}='Standard';
        IkiWiki::Setup::merge({@_});
 
-       # Avoid overwriting any existing files.
-       foreach my $key (qw{srcdir destdir repository dumpsetup}) {
-               next unless exists $config{$key};
-               my $add="";
-               my $dir=IkiWiki::dirname($config{$key})."/";
-               my $base=IkiWiki::basename($config{$key});
-               while (-e $dir.$add.$base) {
-                       $add=1 if ! $add;
-                       $add++;
+       if (! $config{force_overwrite}) {
+               # Avoid overwriting any existing files.
+               foreach my $key (qw{srcdir destdir repository dumpsetup}) {
+                       next unless exists $config{$key};
+                       my $add="";
+                       my $dir=IkiWiki::dirname($config{$key})."/";
+                       my $base=IkiWiki::basename($config{$key});
+                       while (-e $dir.$add.$base) {
+                               $add=1 if ! $add;
+                               $add++;
+                       }
+                       $config{$key}=$dir.$add.$base;
                }
-               $config{$key}=$dir.$add.$base;
        }
        
        # Set up wrapper
@@ -68,9 +72,15 @@ sub import (@) {
                }
                elsif ($config{rcs} eq 'bzr') {
                        # TODO
+                       print STDERR "warning: do not know how to set up the bzr_wrapper hook!\n";
                }
                elsif ($config{rcs} eq 'mercurial') {
                        # TODO
+                       print STDERR "warning: do not know how to set up the mercurial_wrapper hook!\n";
+               }
+               elsif ($config{rcs} eq 'tla') {
+                       # TODO
+                       print STDERR "warning: do not know how to set up the tla_wrapper hook!\n";
                }
                elsif ($config{rcs} eq 'cvs') {
                        $config{cvs_wrapper}=$config{repository}."/CVSROOT/post-commit";
@@ -120,9 +130,10 @@ sub import (@) {
                                IkiWiki::run_hooks(checkconfig => sub { shift->() });
                        };
                        if ($@) {
+                               my $err=$@;
                                print STDERR sprintf(gettext("** Disabling plugin %s, since it is failing with this message:"),
                                        $plugin)."\n";
-                               print STDERR "$@\n";
+                               print STDERR "$err\n";
                                push @{$bakconfig{disable_plugins}}, $plugin;
                        }
                }
@@ -141,7 +152,7 @@ sub import (@) {
 
        # Create admin user(s).
        foreach my $admin (@{$config{adminuser}}) {
-               next if $admin=~/^http\?:\/\//; # openid
+               next if defined IkiWiki::openiduser($admin);
                
                # Prompt for password w/o echo.
                my ($password, $password2);
index 951bcfc56febfce724d82c652f96468c227709d2..c8506930475a0c28ead9e613e7cde64d982b6db9 100644 (file)
@@ -1,7 +1,4 @@
 #!/usr/bin/perl
-# Standard ikiwiki setup module.
-# Parameters to import should be all the standard ikiwiki config stuff,
-# plus an array of wrappers to set up.
 
 package IkiWiki::Setup::Standard;
 
@@ -9,10 +6,22 @@ use warnings;
 use strict;
 use IkiWiki;
 
+# Parameters to import should be all the standard ikiwiki config, in a hash.
 sub import {
        IkiWiki::Setup::merge($_[1]);
 }
 
+sub gendump ($@) {
+       my $class=shift;
+
+       "#!/usr/bin/perl",
+       "#",
+       (map { "# $_" } @_),
+       "use IkiWiki::Setup::Standard {",
+       IkiWiki::Setup::commented_dump(\&dumpline, "\t"),
+       "}"
+}
+
 sub dumpline ($$$$) {
        my $key=shift;
        my $value=shift;
@@ -57,61 +66,4 @@ sub dumpline ($$$$) {
        return "\t$prefix$key => $dumpedvalue,";
 }
 
-sub dumpvalues ($@) {
-       my $setup=shift;
-       my @ret;
-       while (@_) {
-               my $key=shift;
-               my %info=%{shift()};
-
-               next if $key eq "plugin" || $info{type} eq "internal";
-               
-               push @ret, "\t# ".$info{description} if exists $info{description};
-               
-               if (exists $setup->{$key} && defined $setup->{$key}) {
-                       push @ret, dumpline($key, $setup->{$key}, $info{type}, "");
-                       delete $setup->{$key};
-               }
-               elsif (exists $info{example}) {
-                       push @ret, dumpline($key, $info{example}, $info{type}, "#");
-               }
-               else {
-                       push @ret, dumpline($key, "", $info{type}, "#");
-               }
-       }
-       return @ret;
-}
-
-sub gendump ($) {
-       my $description=shift;
-       my %setup=(%config);
-       my @ret;
-       
-       # disable logging to syslog while dumping
-       $config{syslog}=undef;
-
-       push @ret, dumpvalues(\%setup, IkiWiki::getsetup());
-       foreach my $pair (IkiWiki::Setup::getsetup()) {
-               my $plugin=$pair->[0];
-               my $setup=$pair->[1];
-               my @values=dumpvalues(\%setup, @{$setup});
-               if (@values) {
-                       push @ret, "", "\t# $plugin plugin", @values;
-               }
-       }
-
-       unshift @ret,
-               "#!/usr/bin/perl",
-               "# $description",
-               "#",
-               "# Passing this to ikiwiki --setup will make ikiwiki generate",
-               "# wrappers and build the wiki.",
-               "#",
-               "# Remember to re-run ikiwiki --setup any time you edit this file.",
-               "use IkiWiki::Setup::Standard {";
-       push @ret, "}";
-
-       return @ret;
-}
-
 1
diff --git a/IkiWiki/Setup/Yaml.pm b/IkiWiki/Setup/Yaml.pm
new file mode 100644 (file)
index 0000000..9047847
--- /dev/null
@@ -0,0 +1,50 @@
+#!/usr/bin/perl
+
+package IkiWiki::Setup::Yaml;
+
+use warnings;
+use strict;
+use IkiWiki;
+
+sub loaddump ($$) {
+       my $class=shift;
+       my $content=shift;
+
+       eval q{use YAML::Any};
+       eval q{use YAML} if $@;
+       die $@ if $@;
+       $YAML::Syck::ImplicitUnicode=1;
+       IkiWiki::Setup::merge(Load($content));
+}
+
+sub gendump ($@) {
+       my $class=shift;
+       
+       "# IkiWiki::Setup::Yaml - YAML formatted setup file",
+       "#",
+       (map { "# $_" } @_),
+       "#",
+       IkiWiki::Setup::commented_dump(\&dumpline, "")
+}
+
+
+sub dumpline ($$$$) {
+       my $key=shift;
+       my $value=shift;
+       my $type=shift;
+       my $prefix=shift;
+       
+       eval q{use YAML::Old};
+       eval q{use YAML} if $@;
+       die $@ if $@;
+       $YAML::UseHeader=0;
+
+       my $dump=Dump({$key => $value});
+       chomp $dump;
+       if (length $prefix) {
+               $dump=join("\n", map { $prefix.$_ } split(/\n/, $dump));
+       }
+       return $dump;
+}
+
+1
index 5427a5c80b1f0762775231eadb9663b6f8841d2f..73f0896e8cd161cce0166dd2d0ff247316d7be41 100644 (file)
@@ -76,8 +76,8 @@ EOF
        {
                int fd=open("$config{wikistatedir}/cgilock", O_CREAT | O_RDWR, 0666);
                if (fd != -1 && flock(fd, LOCK_EX) == 0) {
-                       char *fd_s;
-                       asprintf(&fd_s, "%i", fd);
+                       char *fd_s=malloc(8);
+                       sprintf(fd_s, "%i", fd);
                        setenv("IKIWIKI_CGILOCK_FD", fd_s, 1);
                }
        }
@@ -105,7 +105,7 @@ extern char **environ;
 char *newenviron[$#envsave+6];
 int i=0;
 
-addenv(char *var, char *val) {
+void addenv(char *var, char *val) {
        char *s=malloc(strlen(var)+1+strlen(val)+1);
        if (!s)
                perror("malloc");
@@ -121,8 +121,19 @@ $check_commit_hook
 $envsave
        newenviron[i++]="HOME=$ENV{HOME}";
        newenviron[i++]="WRAPPED_OPTIONS=$configstring";
+
+#ifdef __TINYC__
+       /* old tcc versions do not support modifying environ directly */
+       if (clearenv() != 0) {
+               perror("clearenv");
+               exit(1);
+       }
+       for (; i>0; i--)
+               putenv(newenviron[i-1]);
+#else
        newenviron[i]=NULL;
        environ=newenviron;
+#endif
 
        if (setregid(getegid(), -1) != 0 &&
            setregid(getegid(), -1) != 0) {
index 462f7364d57ce1c465db2b9ff0c2368a1279b3c2..4b2e2854485de200f9ccebabd6b80686795f5f97 100755 (executable)
@@ -28,15 +28,17 @@ 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:NYTProf"; fi)
+outprogs=ikiwiki.out ikiwiki-transition.out ikiwiki-calendar.out
+scripts=ikiwiki-update-wikilist ikiwiki-makerepo
 
-ikiwiki.out: ikiwiki.in
-       ./pm_filter $(PREFIX) $(VER) $(PROBABLE_INST_LIB) < ikiwiki.in > ikiwiki.out
-       chmod +x ikiwiki.out
+%.out: %.in
+       ./pm_filter $(PREFIX) $(VER) $(PROBABLE_INST_LIB) < $< > $@
+       chmod +x $@
 
-ikiwiki.setup: ikiwiki.out
-       HOME=/home/me $(PERL) -Iblib/lib $(extramodules) $(tflag) ikiwiki.out -libdir . -dumpsetup ikiwiki.setup
+ikiwiki.setup:
+       HOME=/home/me $(PERL) -Iblib/lib $(extramodules) $(tflag) ikiwiki.in -dumpsetup ikiwiki.setup
 
-extra_build: ikiwiki.out ikiwiki.setup docwiki
+extra_build: $(outprogs) ikiwiki.setup docwiki
        ./mdwn2man ikiwiki 1 doc/usage.mdwn > ikiwiki.man
        ./mdwn2man ikiwiki-mass-rebuild 8 doc/ikiwiki-mass-rebuild.mdwn > ikiwiki-mass-rebuild.man
        ./mdwn2man ikiwiki-makerepo 1 doc/ikiwiki-makerepo.mdwn > ikiwiki-makerepo.man
@@ -47,14 +49,18 @@ extra_build: ikiwiki.out ikiwiki.setup docwiki
        sed -i.bkp "s/Version:.*/Version: $$(perl -e '$$_=<>;print m/\((.*?)\)/'<debian/changelog)/" ikiwiki.spec
        rm -f ikiwiki.spec.bkp
        
-docwiki: ikiwiki.out
-       $(PERL) -Iblib/lib $(extramodules) $(tflag) ikiwiki.out -libdir . -setup docwiki.setup -refresh
+docwiki:
+       $(PERL) -Iblib/lib $(extramodules) $(tflag) ikiwiki.in -setup docwiki.setup -refresh
 
 extra_clean:
-       rm -rf html doc/.ikiwiki
-       rm -f *.man ikiwiki.out ikiwiki.setup plugins/*.pyc
+       $(PERL) -Iblib/lib $(extramodules) $(tflag) ikiwiki.in -setup docwiki.setup -clean
+       rm -f *.man $(outprogs) ikiwiki.setup plugins/*.pyc
        $(MAKE) -C po clean
 
+# Joey uses this before committing.
+myclean: clean
+       git checkout po ikiwiki.spec
+
 underlay_install:
        install -d $(DESTDIR)$(PREFIX)/share/ikiwiki
        for dir in `cd underlays && find . -follow -type d ! -regex '.*\.svn.*'`; do \
@@ -69,10 +75,24 @@ underlay_install:
        install -d $(DESTDIR)$(PREFIX)/share/ikiwiki/directives/ikiwiki/directive
        for file in doc/ikiwiki/directive/*; do \
                if [ -f "$$file" ]; then \
+                       cp -aL $$file $(DESTDIR)$(PREFIX)/share/ikiwiki/directives/ikiwiki/directive 2>/dev/null || \
                        install -m 644 $$file $(DESTDIR)$(PREFIX)/share/ikiwiki/directives/ikiwiki/directive; \
                fi \
        done
-       
+
+       # Themes have their style.css appended to the normal one.
+       for theme in themes/*; do \
+               install -d $(DESTDIR)$(PREFIX)/share/ikiwiki/$$theme; \
+               for file in $$theme/*; do \
+                       if echo "$$file" | grep -q style.css; then \
+                               (cat doc/style.css; cat $$file) >> $(DESTDIR)$(PREFIX)/share/ikiwiki/$$theme/style.css; \
+                       elif [ -f "$$file" ]; then \
+                               cp -aL $$file $(DESTDIR)$(PREFIX)/share/ikiwiki/$$file 2>/dev/null || \
+                               install -m 644 $$file $(DESTDIR)$(PREFIX)/share/ikiwiki/$$file; \
+                       fi \
+               done; \
+       done
+
 extra_install: underlay_install
        # Install example sites.
        for dir in `cd doc/examples; find . -type d ! -regex '.*\.svn.*'`; do \
@@ -115,8 +135,9 @@ extra_install: underlay_install
        install ikiwiki-w3m.cgi $(DESTDIR)$(W3M_CGI_BIN)
 
        install -d $(DESTDIR)$(PREFIX)/bin
-       install ikiwiki.out $(DESTDIR)$(PREFIX)/bin/ikiwiki
-       install ikiwiki-makerepo ikiwiki-transition ikiwiki-update-wikilist ikiwiki-calendar $(DESTDIR)$(PREFIX)/bin/
+       for prog in $(outprogs) $(scripts); do \
+               install $$prog $(DESTDIR)$(PREFIX)/bin/$$(echo $$prog | sed 's/\.out//'); \
+       done
 
        $(MAKE) -C po install DESTDIR=$(DESTDIR) PREFIX=$(PREFIX)
        
diff --git a/README b/README
index a4dc0d641dbfd7a7bf13995f5ef111f0977563aa..7efc59a519626c77439cb9afcb4894068e9e394e 100644 (file)
--- a/README
+++ b/README
@@ -5,7 +5,7 @@ All other documentation is in the ikiwiki documentation wiki, which is also
 available online at <http://ikiwiki.info/>
 
 
-A few special variables you can set while using the Makefile:
+A few special variables you can set while using the Makefile.PL:
 
   PROFILE=1 turns on profiling for the build of the doc wiki.
   (Uses Devel::NYTProf)
index 82aa8d4155fa54b7e180f7629fbe807097992096..980074ec3affe8a7426586166903a1c9884361ed 100644 (file)
@@ -36,7 +36,7 @@ IkiWiki::Setup::Automator->import(
        cgiurl => "http://$domain/~$ENV{USER}/$wikiname_short/ikiwiki.cgi",
        cgi_wrapper => "$ENV{HOME}/public_html/$wikiname_short/ikiwiki.cgi",
        adminemail => "$ENV{USER}\@$domain",
-       add_plugins => [qw{goodstuff websetup comments blogspam}],
+       add_plugins => [qw{goodstuff websetup comments opendiscussion blogspam calendar sidebar}],
        disable_plugins => [qw{}],
        libdir => "$ENV{HOME}/.ikiwiki",
        rss => 1,
@@ -46,5 +46,9 @@ IkiWiki::Setup::Automator->import(
        example => "blog",
        comments_pagespec => "posts/* and !*/Discussion",
        blogspam_pagespec => "postcomment(*)",
+       archive_pagespec => "page(posts/*) and !*/Discussion",
+       global_sidebars => 0,
        discussion => 0,
+       locked_pages => "*",
+       tagbase => "tags",
 )
index 50332670ff96bf3e0b36f6073835e8af831f6da0..f73ac9c3d1c2d3901662a83ce4a288ad3408f074 100644 (file)
@@ -1,3 +1,73 @@
+ikiwiki (3.20100515) unstable; urgency=low
+
+  There are two significant changes to the page.tmpl template in this version.
+  If you have a locally modified version of that template, you will need to
+  update it at least to contain the following in the HTML <head>:
+
+    <TMPL_IF DYNAMIC>
+    <TMPL_IF FORCEBASEURL><base href="<TMPL_VAR FORCEBASEURL>" /><TMPL_ELSE>
+    <TMPL_IF BASEURL><base href="<TMPL_VAR BASEURL>" /></TMPL_IF>
+    </TMPL_IF>
+    </TMPL_IF>
+
+  Also, the footer should be wrapped in <TMPL_UNLESS DYNAMIC> ... </TMPL_UNLESS>
+  
+  There is a new "comment()" pagespec, that can be used to match a
+  comment on a page. It is recommended it be used instead of the old
+  method of using a pagespec such as "internal(comment_*)" to match
+  things that looked like comments. The old pagespec will now also match
+  comments that are held for moderation; likely not what you want.
+
+  There have also been some changes to the style.css in this version,
+  particularly to support the new openid selector. If you have a modified
+  version, of style.css, updating it (or moving it to local.css) is
+  recommended.
+
+ -- Joey Hess <joeyh@debian.org>  Wed, 05 May 2010 21:47:08 -0400
+
+ikiwiki (3.20100427) unstable; urgency=low
+
+  This version of ikiwiki has a lot of changes that you need to know about.
+
+  Now you can include customised versions of templates in the source
+  of your wiki. (For example, templates/page.tmpl.) When these templates
+  are changed, ikiwiki will automatically rebuild pages that use them.
+
+  Allowing untrusted users to upload attachments with the ".tmpl"
+  extension is not recommended, as that allows anyone to change
+  a wiki's templates.
+
+  The --getctime switch is renamed to --gettime, and it also gets the 
+  file modification time. And it's a lot faster (when using git). But
+  the really important change is, you don't have to remember to use this
+  switch. Now ikiwiki will do it when it needs to.
+
+  At last, the "tagged()" pagespec only matches tags, not regular wikilinks.
+  If your wiki accidentially relied on the old, buggy behavior, you might
+  need to change its pagespecs to use "link()".
+
+  Many of your wishes have been answered: Now tag pages can automatically be
+  created when new tags are used. This feature is enabled by default if you
+  have configured a tagbase. It can be turned on or off using the
+  tag_autocreate setting.
+
+  These changes may also affect some users:
+
+  * The title_natural sort method (as used by the inline directive, etc)
+    has been moved to the new sortnaturally plugin, which is not enabled
+    by default since it requires the Sort::Naturally perl module.
+
+  * The add_templates option has been removed from the underlay plugin.
+    If you used this option, you can instead use templates/ subdirectories
+    inside underlay directories added by the add_underlays option.
+
+  Due to the above and other changes, all wikis need to be rebuilt on
+  upgrade to this version. If you listed your wiki in /etc/ikiwiki/wikilist
+  this will be done automatically when the Debian package is upgraded. Or
+  use ikiwiki-mass-rebuild to force a rebuild.
+
+ -- Joey Hess <joeyh@debian.org>  Tue, 27 Apr 2010 00:00:00 -0400
+
 ikiwiki (3.20091017) unstable; urgency=low
 
   To take advantage of significant performance improvements, all
index 4f7c1a60ccfe59cac215bef7e7f312410908cad2..ae1d23479a0004a497f167fa88fc1ded1f46d811 100644 (file)
@@ -1,4 +1,346 @@
-ikiwiki (3.20100104) UNRELEASED; urgency=low
+ikiwiki (3.20100624) UNRELEASED; urgency=low
+
+  * Changes to avoid display of ugly google openids, by displaying
+    a username taken from openid.
+  * API: Add new optional field nickname to rcs_recentchanges.
+  * API: rcs_commit and rcs_commit_staged are now passed named
+    parameters.
+  * openid: Store nickname based on username or email provided from
+    openid provider.
+  * git: Record the nickname from openid in the git author email.
+  * comment: Record the username from openid in the comment page.
+  * Fixed some confusion and bugginess about whether
+    rcs_getctime/rcs_getmtime were passed absolute or relative filenames.
+    (Make it relative like everything else.)
+
+ -- Joey Hess <joeyh@debian.org>  Wed, 23 Jun 2010 15:30:04 -0400
+
+ikiwiki (3.20100623) unstable; urgency=low
+
+  * openid: Add openid_realm and openid_cgiurl configuration options,
+    useful in a few edge case setups.
+  * attachment: Show files from underlay in attachments list.
+  * img: Support hspace and vspace attributes.
+  * editpage: Rename "comments" field to avoid CSS conflict with the
+    comments div.
+  * edittemplate: Make silent mode not disable display when the template
+    page does not exist, so it can be easily created.
+  * edittemplate: Look for template pages under templates/ like everything
+    else (still looks in old location for backwards compatibility).
+  * attachment: When inserting links, insert img directives for images,
+    if that plugin is enabled.
+  * websetup: Allow enabling plugins listed in disable_plugins.
+  * editpage, comments: Fix broken links in sidebar (due to forcebaseurl).
+    (Thanks, privat)
+  * calendar: Tune archive_pagespec to only match pages, not other files.
+  * Fix issues with combining unicode srcdirs and source files.
+    (Workaround bug #586045)
+  * Make --gettime be honored after initial setup.
+  * git: Fix --gettime to properly support utf8 filenames.
+  * attachment: Support Windows paths when taking basename of client-supplied
+    file name.
+  * theme: New plugin, allows easily themeing a site via the underlay.
+  * Added actiontabs theme by Svend Sorensen.
+  * Added blueview theme by Bernd Zeimetz.
+  * mercurial: Fix buggy getctime code. Closes: #586279
+  * link: Enhanced to handle URLs and email addresses. (Bernd Zeimetz)
+
+ -- Joey Hess <joeyh@debian.org>  Wed, 23 Jun 2010 14:10:26 -0400
+
+ikiwiki (3.20100610) unstable; urgency=low
+
+  * creation_day() etc use local time, not gmtime. To match calendars, which
+    use local time.
+  * img: Fill in missing height or width when scaling image.
+  * Remove example blog tag pages; allow autotag creation to create them
+    when used.
+  * Fix support for globbing in tagged() pagespecs.
+  * Fix display of sidebar when previewing page edit. (Thanks, privat)
+  * relativedate: Fix problem with localised dates not working.
+  * editpage: Avoid storing accidental state changes when previewing pages.
+  * page.tmpl: Add a div around the page content, and comments, to aide in
+    sidebar styling.
+  * style.css: Improvements to make floating sidebar fit much better on
+    pages with inlines.
+  * calendar: Shorten day names, and improve styling of month calendar.
+  * style.css: Reduced sidebar width back to 20ex from 30; the month calendar
+    will now fit in the smaller width, and 30 was feeling too large.
+
+ -- Joey Hess <joeyh@debian.org>  Thu, 10 Jun 2010 14:24:05 -0400
+
+ikiwiki (3.20100518.2) unstable; urgency=low
+
+  * Fix a typo in the last release.
+
+ -- Joey Hess <joeyh@debian.org>  Tue, 18 May 2010 14:17:01 -0400
+
+ikiwiki (3.20100518) unstable; urgency=low
+
+  * page.tmpl: Accidentially broke po plugin's otherlanguages list styling
+    when modifying for html5; now fixed.
+  * Fix a bug that prevented matching deleted comments, and so did not update
+    pages that had contained them.
+
+ -- Joey Hess <joeyh@debian.org>  Tue, 18 May 2010 13:37:39 -0400
+
+ikiwiki (3.20100515) unstable; urgency=low
+
+  * Removed misc.tmpl. Now to theme ikiwiki, you only need to customise
+    a single template, page.tmpl.
+  * If you have a locally customised page.tmpl, it needs to be updated
+    to set <base> when BASEURL or FORCEBASEURL is set.
+  * comments: Comments pending moderation are now stored in the srcdir
+    alongside accepted comments, but with a `._comment_pending` extension.
+    This allows easier byhand moderation, as the "_pending" need
+    only be stripped off and the comment be committed to version control.
+  * The `comment_pending()` pagespec can be used to match such unmoderated
+    comments, which makes it easy to add a feed of them, or a counter
+    indicating how many there are.
+  * Belatedly added a `comment()` pagespec.
+  * Gave comment and page editing forms some CSS and accessability love.
+  * Renamed postscan hook to indexhtml, to reflect its changed position,
+    and typical use.
+  * inline: Call indexhtml when inlining internal pages, so their
+    text can be indexed for searching.
+  * Delete hooks are passed deleted internal pages. 
+  * openid: Incorporated a fancy openid-selector signin form.
+    (Based on http://code.google.com/p/openid-selector/)
+  * openid: Use "openid_identifier" as the form field, as required
+    by OpenID Authentication v2.0 spec.
+  * Removed the openidsignup option. Instead, my recommendation is to
+    leave passwordauth enabled and let people who don't have an openid use it.
+    The openid selector form avoids the UI annoyance of having both openid
+    and passwordauth on one form.
+  * calendar: Allow negative month to be specified. -1 is last month, etc.
+    (And also negative years.)
+  * calendar: Display year in title of month calendar.
+  * Use xhtml friendly pubdate setting.
+  * remove, rename: Add guards against XSRF attacks.
+
+ -- Joey Hess <joeyh@debian.org>  Sat, 15 May 2010 21:00:45 -0400
+
+ikiwiki (3.20100504) unstable; urgency=low
+
+  * Add parameter to displaytime to specify that it is a pubdate,
+    and in html5 mode, use time tag.
+  * Add placeholder text in search form (in html5 mode only).
+  * In html5 mode, use all the nice new semantic tags. Care was taken
+    to not change the id/class named used in the CSS, so only CSS
+    that refers to tag types needed to be changed.
+  * Add ACTIONS variable to page.tmpl, which allows plugins to add arbitrary
+    links to the action bar without modifying the template further.
+    (COMMENTSLINK and DISCUSSIONLINK could be folded into this, but
+    are kept separate for now to avoid breaking modified templates.)
+  * websetup: Only display Setup button on admins' preferences page. 
+  * graphviz: Fix display of preexisting images in preview mode.
+  * Fixes a bug in skipping of illegal source files introduced in 
+    3.20100427.
+
+ -- Joey Hess <joeyh@debian.org>  Tue, 04 May 2010 20:26:20 -0400
+
+ikiwiki (3.20100501) unstable; urgency=low
+
+  * TMPL_INCLUDE re-enabled for templates read from the templatedir.
+    (But not in-wiki templates.)
+  * Version dependency on liburi-perl to >= 1.36; previous versions
+    did not support building urls from utf-8 strings. Closes: #579713
+  * Ikiwiki can be configured to generate html5 instead of the default xhtml
+    1.0. The html5 output mode is experimental, not yet fully standards
+    compliant, and will be subject to rapid change.
+  * htmlscrubber: Allow html5 semantic tags: section, nav, article, aside
+    hgroup, header, footer, figure, figcaption, time, mark
+  * htmlscrubber: Also allow some other html5 tags: canvas, progress, meter,
+    ruby, rt, rp, details, summary, datalist.
+  * htmlscrubber: Round out html5 video support with the preload
+    attribute and the source tag.
+  * htmlscrubber: Allow the html5 form attributes: placeholder, autofocus,
+    min, max, step, required, autocomplete, novalidate, pattern, list,
+    and form. (Also the form* override attributes for input and buttons.)
+  * htmlscrubber: Allow additional misc html5 attributes: reversed,
+    spellcheck, and hidden.
+  * template: Fix typo.
+
+ -- Joey Hess <joeyh@debian.org>  Sat, 01 May 2010 20:49:28 -0400
+
+ikiwiki (3.20100427) unstable; urgency=low
+
+  [ Joey Hess ]
+  * tag: Automatic creation of tag pages can now be enabled using
+    the tag_autocreate setting. (David Riebenbauer)
+  * Customised templates can now be included in the source of wikis
+    (and also in underlays), and dependencies on them are tracked.
+  * TMPL_INCLUDE is no longer supported in any template.
+  * underlay: Removed the add_templates option.
+  * Add template_depends function to plugin API.
+  * bzr: Fix bzr log parsing to work with bzr 2.0. (liw)
+  * comments: Fix missing entity encoding in title.
+  * txt: Add a special case for robots.txt.
+
+  [ Simon McVittie ]
+  * Add support for link types, and make the the tagged() pagespec only
+    match tags, not regular links (a bugfix).
+  * Rebuild wikis on upgrade to this version to get tag link types recorded
+    correctly.
+  * Revamp sorting system; allow new sort methods to be added by plugins,
+    and add a "sortspec" syntax that can combine, reverse, etc sort methods.
+  * meta: Add `meta(author)`, `meta(title)` etc sortspecs to allow sorting
+    by metadata.
+  * meta: Add optional sortas parameter to author and title meta directives.
+    This can be used to get names sorted by last name without displaying
+    them last name first.
+  * sortnaturally: New plugin; the title_natural sort method has moved here.
+  * meta: store fields consistently unescaped, and escape on use.
+    (A wiki rebuild is also needed due to this change.)
+
+  [ Joey Hess ]
+  * Update dependency for git-core to git transition.
+  * po: Check that translated underlay directories exist before using them
+    for master language.
+  * po: Configuring the same language as master and slave confuses processing;
+    so filter out such a misconfiguration.
+  * calendar: Add archive_pagespec, which is used by ikiwiki-calendar to
+    specify which pages to include on the calendar archive pages.
+    (The pagespec can still also be specified on the ikiwiki-calendar command
+    line.)
+  * pagestats: Class parameter can be used to override default class for
+    custom styling.
+  * pagestats: Use style=list to get a list of tags, scaled by use like
+    in a tag cloud. This is useful to put in a sidebar.
+  * Rework example blog front page.
+  * CSS and templates for sidebar changed to use a class, not an id.
+  * sidebar: Now a sidebar directive can be used to override the sidebar
+    shown on a page.
+  * Enable calendar and sidebar in auto-blog.setup.
+  * sidebar: Add global_sidebars setting.
+  * conditional: Fix bug that forced "all" mode off by default.
+  * calendarmonth.tmpl: The month calendar is now put in a sidebar.
+  * calendar: Improved display of arrows.
+  * Rename --getctime to --gettime. (The old name still works for
+    backwards compatibility.)
+  * --gettime now also looks up last modification time.
+  * Automatically run --gettime the first time ikiwiki is run on 
+    a given srcdir. (Use --no-gettime to disable.)
+  * Add rcs_getmtime to plugin API; currently only implemented
+    for git and svn.
+  * Optimise --gettime for git, so it's appropriately screamingly
+    fast. (This could be done for most other backends too.)
+  * However, --gettime for git no longer follows renames. That would
+    be slow, and whether a renamed wiki page is the same page is really
+    an iffy thing.
+  * Use above to fix up timestamps on docwiki, as well as ensure that
+    timestamps on basewiki files shipped in the deb are sane.
+  * autoindex: Switch to using %wikistate instead of abusing
+    $pagestate{index}.
+  * bzr: Support rcs_getmtime, and fix rcs_getctime implementation
+    (Jelmer Vernooij)
+  * Quite a lot of new optimisations, and one major fix to a recent
+    performance regression.
+  * Moved javascript files under the ikiwiki/ directory, to avoid cluttering
+    the top of the web root. This is another things that requires a wiki
+    rebuild on upgrade to this version.
+  * Fix removal of rendered files in rebuild mode.
+  * Add page() PageSpec, which is like glob() but matches only pages, 
+    not other files.
+
+ -- Joey Hess <joeyh@debian.org>  Tue, 27 Apr 2010 00:00:00 -0400
+
+ikiwiki (3.20100403) unstable; urgency=low
+
+  * websetup: Add websetup_unsafe to allow marking other settings
+    as unsafe.
+  * Improve openid url munging; do not display anchors and cgi parameters,
+    as used by yahoo and google urls.
+  * Add complete German basewiki and directives translation done by
+    Sebastian Kuhnert.
+  * Add a include setting, which can be used to make ikiwiki process
+    wiki source files, such as .htaccess, that would normally be skipped
+    for security or other reasons. Closes: #447267
+    (Thanks to Aaron Wilson for the original patch.)
+  * Add support for setup files written in YAML.
+  * Add --set-yaml switch for setting more complex config file options.
+  * filecheck: Fix bugs that prevented the pagespecs from matching when
+    not called by attachment plugin.
+  * Fix incorrect influence info returned by a failing link() pagespec,
+    that could lead to bad dependency handling in certian situations.
+  * Add preprocessed 'use lib' line to ikiwiki-transition and ikiwiki-calendar
+    if necessary for unusual install.
+  * auto-blog.setup: Set tagbase by default, since most bloggers will want it.
+  * Allow wrappers to be built using tcc. (Workaround #452876)
+  * openid: Use Openid Simple Registration or OpenID Attribute Exchange
+    to get the user's email address and username. (Neither is yet
+    used, but they are available in the session object now.)
+  * page.tmpl: Add Cache-Control must-revalidate to ensure that users
+    (especially of Firefox) see fresh page content.
+  * htmlscrubber: Allow colons in urls after '?'
+  * template: Search for templates in the templatedir, if they are not
+    found as pages in the wiki.
+
+ -- Joey Hess <joeyh@debian.org>  Sat, 03 Apr 2010 14:17:28 -0400
+
+ikiwiki (3.20100312) unstable; urgency=HIGH
+
+  * Fix utf8 issues in calls to md5_hex.
+  * moderatedcomments: Added moderate_pagespec that can be used
+    to control which users or comment locations are moderated.
+    This can be used, just for example, to moderate "user(http://myopenid.com/*)"
+    if you're getting a lot of spammers from one particular openid
+    provider (who should perhaps answer your emails about them),
+    while not moderating other users.
+  * moderatedcomments: The moderate_users setting is deprecated. Instead,
+    set moderate_pagespec to "!admin()" or "user(*)".
+  * Fix missing span on recentchanges page template.
+  * search: Avoid '$' in the wikiname appearing unescaped on omega's
+    query template, where it might crash omega.
+  * htmlscrubber: Security fix: In data:image/* uris, only allow a few
+    whitelisted image types. No svg.
+
+ -- Joey Hess <joeyh@debian.org>  Tue, 09 Mar 2010 19:46:35 -0500
+
+ikiwiki (3.20100302) unstable; urgency=low
+
+  * comments: Display number of comments in comment action link.
+  * Rebuild wikis on upgrade to this version to get the comment counts
+    added to existing pages.
+  * Loosen regexp, to allow empty quoted parameters in directives.
+  * Add force_overwrite setting to make setup automator overwrite existing
+    files/directories.
+  * Fix admin openid detection in setup automator, and avoid prompting
+    for a password.
+  * Add new --clean option; this makes ikiwiki remove all built
+    files in the destdir, as well as wrappers and the .ikiwiki directory.
+
+ -- Joey Hess <joeyh@debian.org>  Tue, 02 Mar 2010 22:17:30 -0500
+
+ikiwiki (3.20100212) unstable; urgency=low
+
+  * template: Preprocess parameters before htmlizing.
+  * img: Fix a bug that could taint @links with undef values.
+  * setup automator: Configure Term::Readline to use bold for prompt, rather
+    than default underline. Closes: #517656
+  * Allow jumping directly into account registration process by going to 
+    ikiwiki.cgi?do=register
+  * Improve display of openid in preferences page.
+  * Add link to userpage (or creation link) to top of preferences page.
+  * opendiscussion: This plugin will also now allow posting comments
+    to otherwise locked-down sites. 
+  * auto-blog.setup: Lock all pages, so only admin can post to the blog
+    by default, and enable opendiscussion so others can comment.
+  * Fix color and format plugins to appear in the websetup interface.
+  * amazon_s3: Fix to support the EU S3 datacenter, which is more picky
+    about attempts to create already existing buckets.
+  * httpauth: When cgiauthurl is configured, httpauth can now be used
+    alongside other authentication methods (like openid or anonok). Rather
+    than always redirect to the cgiauthurl for authentication, there is now
+    a button on the login form to use it.
+  * httpauth: Add httpauth_pagespec setting that can be used to limit
+    pages to only being edited via users authed with httpauth.
+  * Allow globs to be used in user() pagespecs.
+  * Group related plugins into sections in the setup file, and drop
+    unused rcs plugins from the setup file.
+
+ -- Joey Hess <joeyh@debian.org>  Fri, 12 Feb 2010 16:45:50 -0500
+
+ikiwiki (3.20100122) unstable; urgency=low
 
   * inline: Avoid showing edit links if page editing is disabled.
     (Sjoerd)
@@ -6,8 +348,15 @@ ikiwiki (3.20100104) UNRELEASED; urgency=low
     are disabled.
   * comments: Fix permalinks for comments using new conflict-free filenames.
   * img: Support alignment of images with captions. (Giuseppe Bilotta)
+  * websetup: Fix utf-8 problems.
+  * websetup: Fix bug in array change detection.
+  * linkmap: Simplify and improve browser compatibility by using an img, 
+    not object tag.
+  * git: The new git-notes feature in git 1.6.6 changes git log output
+    in a way that broke ikiwiki's parser if notes are added to commits.
+  * po: Avoid crash when a page is empty.
 
- -- Joey Hess <joeyh@debian.org>  Mon, 04 Jan 2010 12:53:24 -0500
+ -- Joey Hess <joeyh@debian.org>  Fri, 22 Jan 2010 16:02:36 -0500
 
 ikiwiki (3.20100102.3) unstable; urgency=low
 
@@ -258,7 +607,7 @@ ikiwiki (3.141592) unstable; urgency=low
 
   * Add new hooks: canremove, canrename, rename. (intrigeri)
   * rename: Refactor subpage rename handling code into rename hook. (intrigeri)
-  * po: New plugin<F11>, suporting translation of wiki pages using po files.
+  * po: New plugin, suporting translation of wiki pages using po files.
     (intrigeri)
   * Add build machinery to build po files to translate the underlay wikis,
   * Add further build machinery to generate translated underlays from
@@ -976,7 +1325,7 @@ ikiwiki (2.55) unstable; urgency=low
   * attachment: Do not escape _ when determining attachment filenames.
   * Rebuild pages that change their type. (Gabriel McManus)
   * monotone: Add support for rename, delete, and also diff. (William Uther)
-  * toggle: Fix incompatability between javascript and webkit.
+  * toggle: Fix incompatibility between javascript and webkit.
   * bzr: Add support for rename and delete. (Jelmer Vernooij)
   * attachment: Use relative paths when inserting links.
   * toggle: Fix for when html got tidied. Closes: #492529 (Enrico Zini)
@@ -1963,7 +2312,7 @@ ikiwiki (2.6) unstable; urgency=low
     - relax asumption about the possible submit values (use "Save Page"
       explicitly);
     - de-hardcode the submit buttons from the editpage template
-      (This was needed for compatability with a bug in CGI::FormBuilder
+      (This was needed for compatibility with a bug in CGI::FormBuilder
       3.0401, but ikiwiki already needs a newer version.)
   * Pass buttons to all other formbuilder_setup hooks too.
   * Add color parameter to postsparkline. Closes: #438900
@@ -2012,7 +2361,7 @@ ikiwiki (2.4) unstable; urgency=low
 
   * Make the toc plugin use html-compatible anchors. This is necessary since
     most web sites serve ikiwiki xhtml files as text/html and mozilla browsers
-    get confused. So it's best for ikiwiki to follow the compatability
+    get confused. So it's best for ikiwiki to follow the compatibility
     recommendations in appendix C of the XHTML spec. Closes: #432045
   * Support building on systems that lack asprintf.
   * mercurial getctime is currently broken, apparently by some change in
@@ -2510,7 +2859,7 @@ ikiwiki (1.41) unstable; urgency=low
   * Gettext 1.04 or up is needed for the OO interface that ikiwiki needs,
     if an older version is installed, just don't gettext strings, instead of
     crashing.
-  * Added smileys for Moin Moin compatability.
+  * Added smileys for Moin Moin compatibility.
   * Fix handling of discussion links on discussion pages when l10n is used.
   * Make gitorigin_branch and gitmaster_branch configurable via the setup
     file. Closes: #408599
@@ -2818,7 +3167,7 @@ ikiwiki (1.29) unstable; urgency=low
   * Note that plugins that accessed this variable will need to be updated!
     The plugin interface has been increased to version 1.01 for this change.
     As few plugins use %renderedfiles I haven't done anything else to ensure
-    compatability of old plugins.
+    compatibility of old plugins.
   * Add will_render function to the plugin interface, used to register that a
     page renders a destination file, and do some security checks. Previously
     but no longer rendered files will be cleaned up.
@@ -3156,7 +3505,7 @@ ikiwiki (1.13) unstable; urgency=low
     treating the GlobList as a very limited microlanguage that is transformed
     to perl code that does the matching.
   * The old GlobList format is deprecated, and I encourage users to switch to
-    using the new PageSpec format. Compatability with the old format will be
+    using the new PageSpec format. Compatibility with the old format will be
     removed at some point, possibly by 2.0.
   * Wiki rebuild needed on upgrade to this version due to PageSpec change.
   * Add support for creation_month and creation_year to PageSpec.
@@ -3215,7 +3564,7 @@ ikiwiki (1.11) unstable; urgency=low
     This will be the page that a source page will be part of, which is
     different than the source page for inlined pages.
   * Audited all plugins to endure they pass (page, destpage) to htmllink
-    appropriatly. This means inlining of various plugins will not work
+    appropriately. This means inlining of various plugins will not work
     properly, with correct links generated.
 
  -- Joey Hess <joeyh@debian.org>  Thu, 27 Jul 2006 20:51:23 -0400
index 172e1b23db3bc217d4967ded3a36ffe6adcf87fb..bba89d82e3373d5d49f159f700f26a141592d599 100644 (file)
@@ -6,11 +6,11 @@ Build-Depends-Indep: dpkg-dev (>= 1.9.0), libxml-simple-perl,
   libtext-markdown-perl | markdown, 
   libtimedate-perl, libhtml-template-perl,
   libhtml-scrubber-perl, wdg-html-validator,
-  libhtml-parser-perl, liburi-perl, perlmagick, po4a (>= 0.34),
-  libfile-chdir-perl
+  libhtml-parser-perl, liburi-perl (>= 1.36), perlmagick, po4a (>= 0.34),
+  libfile-chdir-perl,
 Maintainer: Joey Hess <joeyh@debian.org>
 Uploaders: Josh Triplett <josh@freedesktop.org>
-Standards-Version: 3.8.3
+Standards-Version: 3.8.4
 Homepage: http://ikiwiki.info/
 Vcs-Git: git://git.ikiwiki.info/
 Vcs-Browser: http://git.ikiwiki.info/?p=ikiwiki
@@ -20,10 +20,10 @@ Architecture: all
 Depends: ${misc:Depends}, ${perl:Depends}, ${python:Depends}, 
   libtext-markdown-perl | markdown,
   libhtml-scrubber-perl, libhtml-template-perl,
-  libhtml-parser-perl, liburi-perl
+  libhtml-parser-perl, liburi-perl (>= 1.36)
 Recommends: gcc | c-compiler, 
   libc6-dev | libc-dev,
-  subversion | git-core (>= 1:1.5.0) | tla | bzr (>= 0.91) | mercurial | monotone (>= 0.38) | darcs,
+  subversion | git-core (>= 1:1.5.0) | git (>= 1:1.7) | tla | bzr (>= 0.91) | mercurial | monotone (>= 0.38) | darcs,
   libxml-simple-perl, libnet-openid-consumer-perl,
   liblwpx-paranoidagent-perl, libtimedate-perl,
   libcgi-formbuilder-perl (>= 3.05), libcgi-session-perl (>= 4.14-1),
@@ -35,24 +35,24 @@ Suggests: viewvc | gitweb | viewcvs, libsearch-xapian-perl,
   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, libtext-wikicreole-perl,
+  libsparkline-php, texlive, dvipng, libtext-wikicreole-perl,
   libsort-naturally-perl, libtext-textile-perl, libhighlight-perl,
-  po4a (>= 0.35-1), gettext
+  po4a (>= 0.35-1), gettext, libyaml-perl
 Conflicts: ikiwiki-plugin-table
 Replaces: ikiwiki-plugin-table
 Provides: ikiwiki-plugin-table
 Description: a wiki compiler
ikiwiki converts a directory full of wiki pages into HTML pages suitable
Ikiwiki converts a directory full of wiki pages into HTML pages suitable
  for publishing on a website. Unlike many wikis, ikiwiki does not have its
  own ad-hoc means of storing page history, and instead uses a revision control
  system such as Subversion or Git.
  .
ikiwiki implements all of the other standard features of a wiki, including
Ikiwiki implements all of the other standard features of a wiki, including
  web-based page editing, user registration and logins, a RecentChanges
  page, BackLinks, search, Discussion pages, tags, smart merging and conflict
  resolution, and page locking.
  .
ikiwiki also supports generating news feeds (RSS and Atom) and blogging.
Ikiwiki also supports generating news feeds (RSS and Atom) and blogging.
  ikiwiki provides a plugin system which allows many other features to be
  added. Some of the plugins have additional dependencies, found among the
  Recommends and Suggests of this package.
index 050a4dd61d98670c45c5196790c55d842f3fa545..74391e2cfe6dc870339dd35ff66e4ffc22bd520e 100644 (file)
@@ -1,11 +1,11 @@
 Files: *
-Copyright: © 2006-2008 Joey Hess <joey@ikiwiki.info>
+Copyright: © 2006-2010 Joey Hess <joey@ikiwiki.info>
 License: GPL-2+
  The full text of the GPL is distributed as doc/GPL in ikiwiki's source,
  and is distributed in /usr/share/common-licenses/GPL-2 on Debian systems.
 
 Files: templates/*, underlays/basewiki/*, doc/ikiwiki/directive/*, ikiwiki.setup, po/underlay/*
-Copyright: © 2006-2008 Joey Hess <joey@ikiwiki.info>
+Copyright: © 2006-2010 Joey Hess <joey@ikiwiki.info>
 License: other
  Redistribution and use in source and compiled forms, with or without
  modification, are permitted under any circumstances. No warranty.
@@ -163,6 +163,7 @@ Copyright:
   2007 Cyril Brulebois <cyril.brulebois@enst-bretagne.fr>
   2007 Daniel Nylander <po@danielnylander.se>
   2009 Fernando González de Requena <fgrequena@gmail.com>
+  2010 Sebastian Kuhnert <mail@sebastian-kuhnert.de>
 License: 
  Redistribution and use in source and compiled forms, with or without
  modification, are permitted under any circumstances. No warranty.
@@ -190,6 +191,29 @@ License: GPL-2+
 
 Files: cvs.pm
 Copyright: © 2009 Amitai Schlair
+License: BSD-C2
+
+Files: underlays/openid-selector/ikiwiki/openid/*
+Copyright: © 2008-2010 andyjm, david.j.boden
+License: BSD-C2
+  From http://code.google.com/p/openid-selector/
+
+Files: underlays/openid-selector/ikiwiki/openid/jquery.js
+Copyright: © 2005-2008 by John Resig, Branden Aaron & Jörn Zaefferer
+License: GPL-2
+
+Files: underlays/themes/blueview/style.css
+Copyright: 
+ © 2009,2010 Bernd Zeimetz
+ © 2008 Yahoo! Inc.
+License: GPL-2+
+  Parts derived from BSD-C3 licensed YUI library.
+  http://developer.yahoo.com/yui/license.html
+
+Files: underlays/themes/blueview/*
+Copyright: © 2009,2010 Bernd Zeimetz
+License: GPL-2+
+
 License: BSD-C2
  Redistribution and use in source and binary forms, with or without
  modification, are permitted provided that the following conditions
index bf1825ab7b1ca5239fe1e831d44e2dd08dcafbf5..76ad115ac0ddc6512832997ea20d66e2d05fc10a 100755 (executable)
@@ -4,7 +4,7 @@ set -e
 
 # Change this when some incompatible change is made that requires
 # rebuilding all wikis.
-firstcompat=3.20091010
+firstcompat=3.20100424
 
 if [ "$1" = configure ] && \
    dpkg --compare-versions "$2" lt "$firstcompat"; then
index c69c2fc2567e5a1b85116fc6a4b63742f117b06e..63147b6560ced3a9a24478196b0d003919b590b2 100644 (file)
@@ -189,3 +189,10 @@ Would you suggest I try rebuilding perl without this patch? Debian has a huge pe
 it's not straightforward for me to see if they do something similar to Arch.
 
 > I think Debian has a similar patch.
+
+---
+
+[[done]] -- apparently this was a problem due to a distribution's
+customisation to perl, or something. Seems to late now to track down what,
+unfortunatly. And ikiwiki's Makefile no longer uses the "-libdir" switch
+that seemed to trigger the bug. --[[Joey]]
diff --git a/doc/bugs/404_plugin_and_lighttpd.mdwn b/doc/bugs/404_plugin_and_lighttpd.mdwn
new file mode 100644 (file)
index 0000000..ffbad8a
--- /dev/null
@@ -0,0 +1,35 @@
+Lighttpd apparently sets REDIRECT_STATUS=200 for the server.error-handler-404 page. This breaks the 404 plugin which checks this variable for 404 before processing the URI. It also doesn't seem to set REDIRECT_URL.
+
+I was able to fix my server to check the REQUEST_URI for ikiwiki.cgi and to continue processing if it was not found, passing $ENV{SEVER_NAME} . $ENV{REQUEST_URI} as the first parameter to cgi_page_from_404. However, my perl is terrible and I just made it work rather than figuring out exactly what to do to get it to work on both lighttpd and apache.
+
+This is with lighttpd 1.4.19 on Debian.
+
+> /cgi-bin/ikiwiki.cgi?do=goto also provides redirection in the same way,
+> if that's any help? You might need to set the lighttpd 404 handler to
+> that, then compose REDIRECT_URL from other variables if necessary.
+>
+> I originally wrote the plugin for Apache; [[weakish]] contributed the
+> lighttpd docs and might know more about how to make it work there.
+> --[[smcv]]
+
+>> As I said, I got it working for me, but somebody who knows perl should probably look at it with the aim of making it work for everyone.
+>> I considered having lighttpd construct a proper url for the 404 redirect itself, but I don't know if it can do something like that or not.
+>> For what it's worth, here's the change I made to the module:
+
+    sub cgi ($) {
+            my $cgi=shift;
+            if ($ENV{REQUEST_URI} !~ /ikiwiki\.cgi/) {
+                    my $page = cgi_page_from_404(
+                            Encode::decode_utf8($ENV{SERVER_NAME} . $ENV{REQUEST_URI}),
+                            $config{url}, $config{usedirs});
+                    IkiWiki::Plugin::goto::cgi_goto($cgi, $page);
+            }
+    
+    #       if (exists $ENV{REDIRECT_STATUS} &&
+    #           $ENV{REDIRECT_STATUS} eq '404') {
+    #               my $page = cgi_page_from_404(
+    #                       Encode::decode_utf8($ENV{REDIRECT_URL}),
+    #                       $config{url}, $config{usedirs});
+    #               IkiWiki::Plugin::goto::cgi_goto($cgi, $page);
+    #       }
+    }
index 7daf52f2ae6db775b58e26e189e8b89817eeb766..3e1fe823ebd4ac161bdae2df02fc6bc21cb9ea73 100644 (file)
@@ -3,3 +3,5 @@ page produces nothing.  It looks like the inline plugin is failing to do
 the translation from apostrophe to `_39_` that other parts of the system do, so although one can make wikilinks to such pages and have them detected as existing (for instance, by the conditional plugin), inline looks in the wrong place and doesn't see the page.
 
 > I can't reproduce that (btw, an apostrophe would be `__39__`) --[[Joey]]
+
+[[done]]
diff --git a/doc/bugs/Comments_dissapeared.mdwn b/doc/bugs/Comments_dissapeared.mdwn
new file mode 100644 (file)
index 0000000..787f18c
--- /dev/null
@@ -0,0 +1,69 @@
+Although I have comments enabled and I have been using them successfully for ages now, I've come to notice that they have stopped working in the last week or two.
+
+I am running version 3.20100312 with the following configuration:
+
+<http://static.natalian.org/2010-03-27/natalian.txt>
+
+In my (HTML5 modified page.tmpl) it doesn't seem to enter the "TMPL_IF COMMENTS" block anymore. I tried the stock page.tmpl and they didn't seem to work either, so the variable name hasn't changed has it?
+
+Any other ideas? With thanks,
+
+       comments_pagespec => 'archives/* and !*/Discussion',
+
+> Your setup file only allows comments to pages under archives. That 
+> seems unlikely to be right, so I guess it is causing your problem.
+> --[[Joey]] 
+
+That's the only place where I want comments. <http://natalian.org/archives/>
+Has the pagespec changed? Is it `archives/*/*` or something like that?
+
+It worked just fine with this configuration. I swear I have not modified it. :) -- [[Kai Hendry]]
+
+> No changes that I can think of. 'archives/*' will match *all* pages under
+> archives. Anyway, I can see in your site's rss feed that comments are
+> enabled for posts, since they have comments tags there. And
+> in fact I see comments on eg
+> <http://natalian.org/archives/2010/03/25/BBC_News_complaints/>.
+> 
+> So I suspect you have simply not rebuilt your wiki after making some
+> change that fixed the comments, and so only newer pages are getting them.
+> --[[Joey]]
+
+I have tried rebuilding on my squeeze system and still comments don't appear. Any clues how to debug this?
+<http://natalian.org/comments/>
+
+I was worried is was due to a time skew problem I was experiencing on my VPS in the last month, though the time is right now and still comments do not appear on blog posts like <http://natalian.org/archives/2010/03/25/BBC_News_complaints/>
+
+# Debugging templates
+
+`sudo apt-get install libhtml-template-compiled-perl`
+
+    hendry@webconverger templates$ cat test-template.perl
+    #!/usr/bin/perl
+    use HTML::Template::Compiled;
+    local $HTML::Template::Compiled::DEBUG = 1;
+    my $htc = HTML::Template::Compiled->new(
+             filename => "$ARGV[0]",
+    );
+    eval {  
+            print $htc->output;
+    };
+    if ($@) {
+            # reports as text
+            my $msg = $htc->debug_code;
+            # reports as a html table
+            my $msg_html = $htc->debug_code('html');
+    }
+    hendry@webconverger templates$ ./test-template.perl page.tmpl
+    Missing closing tag for 'IF' atend of page.tmpl line 159
+
+
+I think the problem was before that it was `<TMPL_IF COMMENTS>` and now it is `<TMPL_IF NAME="COMMENTS">` ?
+
+
+
+# Solved
+
+A merge with the templates in master with my [html5](http://git.webconverger.org/?p=ikiwiki;a=shortlog;h=refs/heads/html5) branch looks like it has solved the problem. Also see [[bugs/html5_support]].
+
+[[bugs/done]]
index 046d6e10d30b7eecd5177b7d2eb4695233b6a163..b993cd8e73c8fc98e9d70d294cf77c8e30b39636 100644 (file)
@@ -41,4 +41,6 @@ Whilst trying to edit http://hugh.vm.bytemark.co.uk/ikiwiki.cgi via OpenID. Any
 
 Thanks for you excellent analysis. The bug was due to old pre-3.0 **templates** laying about. After deleting them, ikiwiki defaults to its own templates. Clever. :-)
 
+Great, this saved me big time! It is a google 1st hit. I had the same with accidentally using old templates. Thanks! --[[cstamas]]
+
 [[bugs/done]]
diff --git a/doc/bugs/Exception:_Unknown_function___96__this__39___.mdwn b/doc/bugs/Exception:_Unknown_function___96__this__39___.mdwn
new file mode 100644 (file)
index 0000000..189ba74
--- /dev/null
@@ -0,0 +1,70 @@
+I'm very excited to try out ikiwiki, since it should fit my purposes extremely well, but I'm having trouble with the search plugin. I'm pretty sure that right after I installed ikiwiki and needed dependencies, the search plugin was working fine. However, now when I try to use search, I get "Exception: Unknown function `this'" error on a blank page. I'm not sure how I should go about debugging this issue - my server's (I use Lighttpd 1.4.22) error log has no mention of the exception and there's nothing in /var/log/syslog either.
+
+What might be causing this exception and how I might go about debugging exceptions?
+
+> Appears to be coming from your xapian omega cgi binary. If you
+> run `strings /usr/lib/cgi-bin/omega/omega` you can see it has
+> "Exception: " in it, and I have found some similar (but not identical)
+> error messages from xapian in a web search.
+> 
+> I don´t know what to suggest, other than upgrade/downgrade/reinstall
+> xapian-omega, and contacting the xapian developers for debugging.
+> You could try rebuilding your wiki in case it is somehow
+> caused by a problem with the xapian database. Failing everything, you
+> could switch to [[google_search_plugin|plugins/google]]. --[[Joey]] 
+
+>> Thanks, Joey. With your help I was able to figure out what was wrong. It's a fun little bug (or feature): the title of my wiki had string `$this` in title and that's what was causing the omega binary to choke. My wiki's title was inserted without escaping into the query template used by omega. Omega treated `$this` in the title as a function name and threw an exception because no such function was defined. To avoid this behavior, I used an html entity in the title, so `$this` became `&#36;this`. I don't think that the wiki title should be inserted into the template without escaping - it can produce an error that's not trivial to debug. If users want to modify the html in the title, they should be editing respective templates, not typing html in the wiki title input. What do you think? --[[dkobozev]]
+
+>>> Sounds like a bug in omega, and one that probably would affect other
+>>> users of omega too. Ikiwiki could work around it by pre-escaping
+>>> data before passing it to xapian. I have not quite managed to reproduce it though;
+>>> tried setting a page title to '$this' and 'foo $this'.
+>>> That's with version 1.0.18 of omega.
+>>> --[[Joey]]
+
+>>>> I tried it with both omega 1.0.13 and omega 1.0.18 and the issue is present in both. If I view the contents of {$srcdir}/.ikiwiki/xapian/templates/query, I can see that the wiki title is inserted verbatim and there are calls to `$setmap`, `$set` and `$def` etc in the template. --[[dkobozev]]
+
+>>>>> I don't see how that's relevant. It would help if you showed me
+>>>>> exactly something that could be inserted into a page to cause the
+>>>>> problem. --[[Joey]] 
+
+>>>>>> Correct me if I'm wrong: ikiwiki generates an Omega template from its own templates, such as searchquery.tmpl and puts it into {$srcdir}/.ikiwiki/xapian/templates/query. Omega has its own template syntax, where function names are prefixed with dollar signs (`$`). So, when I call my wiki `$foobar`, ikiwiki generates an Omega template that looks like this snippet:
+
+    <div id="container">
+        <div class="pageheader">
+            <div class="header">
+            <span>
+            <a href="http://example.com">$foobar</    a>/search
+            </span>
+            </div>
+        </div> <!-- .pageheader -->
+    
+        <div id="content">
+            $setmap{prefix,title,S}
+    $setmap{prefix,link,XLINK}
+    $set{thousand,$.}$set{decimal,.}$setmap{BN,,Any Country,uk,England,fr,France}
+    ${
+    $def{PREV,
+    $if{$ne{$topdoc,0},<INPUT TYPE=image NAME="&lt;" ALT="&lt;"
+    SRC="/images/xapian-omega/prev.png" BORDER=0 HEIGHT=30 WIDTH=30>,
+    <IMG ALT="" SRC="/images/xapian-omega/prevoff.png" HEIGHT=30 WIDTH=30>}
+
+>>>>>> So `$foobar` clashes with Omega's template tags. Does this help?
+
+>>>>>>> Ahh. I had somehow gotten it into my head that you were talking
+>>>>>>> about the title of a single page, not of the whole wiki. But
+>>>>>>> you were clear all along it was the wiki title. Sorry for
+>>>>>>> misunderstanding. I've put in a complete fix for this problem.
+>>>>>>> if this was in [[bugs]], I'd close it. :) --[[Joey]] 
+
+>>>>>>>> Rather than escaping `$` as an HTML entity, it would be more natural
+>>>>>>>> to escape it as `$$` (since you are escaping it for Omega, not for
+>>>>>>>> the web browser.
+>>>>>>>>
+>>>>>>>> Also if ikiwiki can put arbitrary text inside the parameters of an
+>>>>>>>> OmegaScript command, you should also escape `{`, `}` and `,` as
+>>>>>>>> `$(`, `$)` and `$.`.  It's only necessary to do so inside the
+>>>>>>>> parameters of a command, but it will work and be easier to escape
+>>>>>>>> them in any substituted text. --OllyBetts
+
+[[done]]
diff --git a/doc/bugs/External_links_with_Creole.mdwn b/doc/bugs/External_links_with_Creole.mdwn
new file mode 100644 (file)
index 0000000..3d800b0
--- /dev/null
@@ -0,0 +1,3 @@
+When using Creole for markup, creating an external link appears to be impossible. Neither \[[Outside URL|http://example.com]] nor <<http://example.com>> nor \[Outside URL]\(http://example.com) work. The first gets rendered as a broken WikiLink, the second get eaten and the last is not parsed in anyway so you end up with that exact text in your page. 
+
+I'd have made this as a Creole page as a practical demonstration, but that doesn't seem possible here. Here's a page with an example: <https://www.icanttype.org//demo/CreoleExternalLinks>
diff --git a/doc/bugs/Git:_changed_behavior_w.r.t._timestamps.mdwn b/doc/bugs/Git:_changed_behavior_w.r.t._timestamps.mdwn
new file mode 100644 (file)
index 0000000..164e620
--- /dev/null
@@ -0,0 +1,214 @@
+After some months, I just updated my local ikiwiki sources, and rebuilt
+the Hurd web pages, <http://git.savannah.gnu.org/cgit/hurd/web.git/>.
+
+I was confused, having switched to the new automatic (thanks!) --gettime
+mechanism, why on some pages the timestamps had changed compared to my
+previous use of --getctime and setting files' mtimes (using a script)
+according to the last Git commit.  For example:
+
+community/weblogs/ArneBab/2008-08-02-gnu_hurd_and_x.html
+
+old:
+
+    Last edited <span class="date">2008-09-11 18:11:53 UTC</span>
+    <!-- Created <span class="date">2008-09-11 17:47:08 UTC</span> -->
+
+new:
+
+    Last edited <span class="date">2008-09-11 18:12:22 UTC</span>
+    <!-- Created <span class="date">2008-09-11 17:47:50 UTC</span> -->
+
+
+I had a look at what git.pm is doing, and began to manually replay /
+investigate:
+
+    $ git log --pretty=fuller --name-only --relative -- community/weblogs/ArneBab/2008-08-02-gnu_hurd_and_x.mdwn
+    commit 8f1b97bfe45b2f173e3a7d55dee226a9e289a695
+    Author:     arnebab <arne_bab@web.de>
+    AuthorDate: Thu Sep 11 20:11:53 2008 +0200
+    Commit:     arnebab <arne_bab@web.de>
+    CommitDate: Thu Sep 11 20:11:53 2008 +0200
+    
+        Added a link to the X.org guide in this wiki.
+    
+    community/weblogs/ArneBab/2008-08-02-gnu_hurd_and_x.mdwn
+    
+    commit 3ef8b7d80d80572c436c4c60c71879bc74409816
+    Author:     arnebab <arne_bab@web.de>
+    AuthorDate: Thu Sep 11 19:47:08 2008 +0200
+    Commit:     arnebab <arne_bab@web.de>
+    CommitDate: Thu Sep 11 19:47:08 2008 +0200
+    
+        Minor update on the enty trying to get X working -> 'watch this place for updates'
+    
+    community/weblogs/ArneBab/2008-08-02-gnu_hurd_and_x.mdwn
+
+OK, these are my old dates.
+
+    $ git log --pretty=format:%ci --name-only --relative -- community/weblogs/ArneBab/2008-08-02-gnu_hurd_and_x.mdwn 
+    2008-09-11 20:11:53 +0200
+    community/weblogs/ArneBab/2008-08-02-gnu_hurd_and_x.mdwn
+    
+    2008-09-11 19:47:08 +0200
+    community/weblogs/ArneBab/2008-08-02-gnu_hurd_and_x.mdwn
+    
+    $ git log --pretty=format:%ct --name-only --relative -- community/weblogs/ArneBab/2008-08-02-gnu_hurd_and_x.mdwn 
+    1221156713
+    community/weblogs/ArneBab/2008-08-02-gnu_hurd_and_x.mdwn
+    
+    1221155228
+    community/weblogs/ArneBab/2008-08-02-gnu_hurd_and_x.mdwn
+    
+    $ date -d @1221156713
+    Thu Sep 11 18:11:53 UTC 2008
+    $ date -d @1221155228
+    Thu Sep 11 17:47:08 UTC 2008
+
+That's all consistent.
+
+
+But:
+
+    $ perl -le 'use Storable; my $index=Storable::retrieve("indexdb"); use Data::Dumper; print Dumper $index'
+    [...]
+                          'community/weblogs/ArneBab/2008-08-02-gnu_hurd_and_x.mdwn' => {
+                                                                                        'ctime' => '1221155270',
+                                                                                        'dest' => [
+                                                                                                    'community/weblogs/ArneBab/2008-08-02-gnu_hurd_and_x.html'
+                                                                                                  ],
+                                                                                        'typedlinks' => {
+                                                                                                          'tag' => {}
+                                                                                                        },
+                                                                                        'mtime' => 1221156742,
+                                                                                        'depends_simple' => {
+                                                                                                              'sidebar' => 1
+                                                                                                            },
+                                                                                        'links' => [
+                                                                                                     'community/weblogs/ArneBab/2008-08-02-gnu_hurd_and_x/discussion',
+                                                                                                     'Hurd/DebianXorg'
+                                                                                                   ],
+                                                                                        'state' => {
+    [...]
+
+    $ date -d @1221156742
+    Thu Sep 11 18:12:22 UTC 2008
+    $ date -d @1221155270
+    Thu Sep 11 17:47:50 UTC 2008
+
+That's different, and it matches what the new ikiwiki writes into the
+HTML file.
+
+
+Back to Git again, this time without specifying the file:
+
+    $ git log --pretty=format:%ct --name-only --relative
+    [...]
+    1221255713
+    1221255655
+    unsorted/PortingIssues.mdwn
+    
+    1221156742 [Thu Sep 11 18:12:22 UTC 2008]
+    1221156713 [Thu Sep 11 18:11:53 UTC 2008]
+    community/weblogs/ArneBab/2008-08-02-gnu_hurd_and_x.mdwn
+    
+    1221156267
+    1221156235
+    index.mdwn
+    
+    1221156122
+    1221156091
+    index.mdwn
+    
+    1221155942
+    1221155910
+    index.mdwn
+    
+    1221155270 [Thu Sep 11 17:47:50 UTC 2008]
+    1221155228 [Thu Sep 11 17:47:08 UTC 2008]
+    community/weblogs/ArneBab/2008-08-02-gnu_hurd_and_x.mdwn
+    
+    1221154986
+    community/gsoc.mdwn
+    community/gsoc/project_ideas.mdwn
+    
+    1221147244
+    whatsnew.html
+    [...]
+
+Aha!
+
+... and some more detail:
+
+    $ git log --pretty=fuller --name-only --relative
+    [...]
+    commit e4e89e1683012c879012522105a3471a00714613
+    Author:     Samuel Thibault <samuel.thibault@ens-lyon.org>
+    AuthorDate: Fri Sep 12 23:40:55 2008 +0200
+    Commit:     Samuel Thibault <samuel.thibault@ens-lyon.org>
+    CommitDate: Fri Sep 12 23:40:55 2008 +0200
+    
+        MSG_NOSIGNAL and IPV6_PKTINFO got fixed
+    
+    unsorted/PortingIssues.mdwn
+    
+    commit c389fae98dff86527be62f895ff7272e4ab1932c
+    Merge: 0339e3e 8f1b97b
+    Author:     GNU Hurd wiki engine <web-hurd@gnu.org>
+    AuthorDate: Thu Sep 11 18:12:22 2008 +0000
+    Commit:     GNU Hurd wiki engine <web-hurd@gnu.org>
+    CommitDate: Thu Sep 11 18:12:22 2008 +0000
+    
+        Merge branch 'master' of wiki@192.168.10.50:wiki
+    
+    commit 8f1b97bfe45b2f173e3a7d55dee226a9e289a695
+    Author:     arnebab <arne_bab@web.de>
+    AuthorDate: Thu Sep 11 20:11:53 2008 +0200
+    Commit:     arnebab <arne_bab@web.de>
+    CommitDate: Thu Sep 11 20:11:53 2008 +0200
+    
+        Added a link to the X.org guide in this wiki.
+    
+    community/weblogs/ArneBab/2008-08-02-gnu_hurd_and_x.mdwn
+    [...]
+
+So, merges are involved there.
+
+What (the new) ikiwiki code does, is use the timestamp when the merge was
+done instead of the timestamp when the commit was done.  Is this
+intentional?  Otherwise I could supply a patch.
+
+--[[tschwinge]]
+
+> In order to be nice and fast, the git backend runs git log once
+> and records data for all files. Rather than looking at the log for a
+> given file. So amoung other things, it does not follow renames.
+> 
+> AFAICS, git log only shows merges modifying files if it was a conflicted
+> merge. As the file is then actually modified to resolve the merge
+> I think it makes sense to count the merge as the last modification in
+> that case. --[[Joey]] 
+
+>> That'd be reasonable, but `git log` will also show merges that are not
+>> conflicting (as in my case).
+
+>>> Actually when displaying a merge, `git log --stat` only lists files that
+>>> were actually modified in a new way as part of the merge resolution.
+>>> Ie, if the merge resolution only joins together some of the parent
+>>> hunks, the file is not listed as having been modified.
+>>>
+>>> So, no, ikiwiki's use of git log will not show files modified in
+>>> non-conflicting merges.
+>>> --[[Joey]]
+
+>> Yet, I'm not totally disagreeing with your choice.  With this `git
+>> log` invocation, you're not able to tell from its output whether a
+>> conflict was resolved or not.
+
+>> Also, it's a bit like the *should we use the **author timestamp** or
+>> **commit timestamp*** discussion.  Your code will always use the
+>> latest timestamp.
+
+>> I guess I'll get my head wrapped around that, and it's fine, so this is
+>> [[done]].
+
+>> --[[tschwinge]]
diff --git a/doc/bugs/Links_to_missing_pages_should_always_be_styled.mdwn b/doc/bugs/Links_to_missing_pages_should_always_be_styled.mdwn
new file mode 100644 (file)
index 0000000..7321320
--- /dev/null
@@ -0,0 +1,5 @@
+When the CGI URL is not defined, links to missing pages appear as plain, unstyled text. I think the 'createlink' span should always wrap this text, even when the actual question mark linking to the CGI for the create action is missing. This ensures consistent styling regardless of whether the CGI is available or not (and is thus useful for example when the same wiki has clones with the CGI link and clones without).
+
+A proposed patch is available [on my ikiwiki clone](http://git.oblomov.eu/ikiwiki/patch/290d1b498f00f63e6d41218ddb76d87e68ed5081)
+
+[[!tag patch cgi done]]
index c9f6981589fae57958abdb774034175adb83b385..bc80125adfce797334d845e269d53172dcd27d73 100644 (file)
@@ -9,31 +9,12 @@ The graphviz.pm plug-in currently attempts to read PNG data in UTF-8 mode, which
 
 It also generates image URLs relative to the page being rendered, which means the URLs wont work when previewing a graph from the CGI script.
 
+(preview bug split to [[Problems_with_graphviz.pm_plug-in_previews]])
+
 >> Here is an updated patch againt ikiwiki-2.5:
 
 >>> [[Applied|done]], thanks. --[[Joey]]
 
-    --- 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 (\%) {
-               }
-       }
-     
-    -  return "<img src=\"".urlto($dest, $params{page})."\" />\n";
-    +  if ($params{preview}) {
-    +          return "<img src=\"".urlto($dest, "")."\" />\n";
-    +  }
-    +  else {
-    +          return "<img src=\"".urlto($dest, $params{page})."\" />\n";
-    +  }
-     }
-     
-     sub graph (@) {
-
-
->> --[[HenrikBrixAndersen]]
-
-
 The patch below fixes these two issues.
 
     --- graphviz.pm.orig       Thu Jun  7 15:45:16 2007
diff --git a/doc/bugs/Problems_with_graphviz.pm_plug-in_previews.mdwn b/doc/bugs/Problems_with_graphviz.pm_plug-in_previews.mdwn
new file mode 100644 (file)
index 0000000..c77bbee
--- /dev/null
@@ -0,0 +1,54 @@
+(split from [[Problems_with_graphviz.pm_plug-in]])
+
+[graphviz] generates image URLs relative to the page being rendered, which means the URLs wont work when previewing a graph from the CGI script.
+
+>> Here is an updated patch againt ikiwiki-2.5:
+
+>>> Applied, thanks. --[[Joey]]
+
+    --- 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 (\%) {
+               }
+       }
+     
+    -  return "<img src=\"".urlto($dest, $params{page})."\" />\n";
+    +  if ($params{preview}) {
+    +          return "<img src=\"".urlto($dest, "")."\" />\n";
+    +  }
+    +  else {
+    +          return "<img src=\"".urlto($dest, $params{page})."\" />\n";
+    +  }
+     }
+     
+     sub graph (@) {
+
+
+>> --[[HenrikBrixAndersen]]
+
+>>> Despite this patch I am still experiencing the problem. Normal page source for a graph contains:
+
+    <div id="content">
+    <p><img src="./graph-c9fd2a197322feb417bdedbca5e99f5aa65b3f06.png" /></p>
+    
+    </div>
+
+>>> preview contains
+
+    <div id="preview">
+    <p><img src="./demo/diagrams/graph-c9fd2a197322feb417bdedbca5e99f5aa65b3f06.png" /></p>
+    
+    </div>
+
+>>> I don't quite understand why, this makes sense from the CGI path (in my
+>>> case from the root of the site). The browsers appear to be trying to fetch
+>>> `/demo/diagrams/demo/diagrams/graph-c9fd2a197322feb417bdedbca5e99f5aa65b3f06.png`
+>>> (i.e., prepending the required relpath twice). -- [[Jon]]
+
+>>>> Yeah, that patch may have been right once, but it's wrong now;
+>>>> preview mode uses `<base>` to make urls work the same as they would
+>>>> when viewing the html page. 
+>>>>
+>>>> Perhaps this was not noticed for a while while because it only
+>>>> shows up if previewing an *unchanged* graph on a page that has already
+>>>> been built before. Fixed now. [[done]] --[[Joey]] 
index 5519e45c682a450d5d5c027fb0b2a70398739736..270da86d34dda6af43e724d6382c25d0e5dcc44c 100644 (file)
@@ -10,7 +10,7 @@ If I have a &lt;--#include virtual="foo" --&gt; in some file, it gets stripped,
 > Anyway, it makes sense for the htmlscrubber to strip server-side
 > includes because otherwise your wiki could be attacked
 > by them being added to it. If you want to use both the htmlscrubber and
-> SSI together, I'd suggest you modify the [[wikitemplates]]
+> SSI together, I'd suggest you modify the [[templates]]
 > and put the SSI on there.
 > 
 > Ie, `page.tmpl` has a 
diff --git a/doc/bugs/Tab_delimited_tables_don__39__t_work.mdwn b/doc/bugs/Tab_delimited_tables_don__39__t_work.mdwn
new file mode 100644 (file)
index 0000000..39d57a4
--- /dev/null
@@ -0,0 +1,22 @@
+Table directive should support tab-delimited data, especially important since this is the format you will get if copy/pasting from an HTML table or spreadsheet (Gnumeric, OO Calc, Excel). Test case which fails:
+
+[[!table format=dsv delimiter="\t" data="""
+1      2
+2      4
+"""]]
+
+> They do work, but C-style backslash escapes aren't recognised,
+> so the syntax `delimiter="\t"` (as in your test case) looks
+> for the literal string `\t`. Replacing `\t` with a literal
+> tab character makes it work - here's a test (I changed the data
+> to make the table layout more obvious):
+>
+> [[!table format=dsv delimiter="      " data="""
+left   2
+2      right
+alpha  beta
+"""]]
+>
+> So, I think this can be considered [[not_a_bug|done]]? --[[smcv]]
+
+>> I've clarified the documentation. --[[smcv]]
index e386a8d964b37d4362486b0bd22becd44894ff63..bff37e18bc7f2bad326e997d7a08f7ed79a415f1 100644 (file)
@@ -54,3 +54,65 @@ and a whitelist of OpenIDs in `locked_pages`...)
 >>>>>> change. And then the Edit link for Discussion subpages could do
 >>>>>> as you suggest, adding one click for the httpauth user, who won't
 >>>>>> often need to edit those subpages. --[[schmonz]]
+
+>> On reflection, I've stopped being bothered by the
+>> redirect-to-signin-page approach. (It only needs to happen once per
+>> browser session, anyway.) Can we try that? --[[schmonz]]
+
+Here is an attempt. With this httpauth will only redirect to the
+`cgiauth_url` when a page is edited, and it will defer to other plugins
+like anonok first. I have not tested this. --[[Joey]] 
+
+<pre>
+diff --git a/IkiWiki/Plugin/httpauth.pm b/IkiWiki/Plugin/httpauth.pm
+index 127c321..a18f8ca 100644
+--- a/IkiWiki/Plugin/httpauth.pm
++++ b/IkiWiki/Plugin/httpauth.pm
+@@ -9,6 +9,8 @@ use IkiWiki 3.00;
+ sub import {
+       hook(type => "getsetup", id => "httpauth", call => \&getsetup);
+       hook(type => "auth", id => "httpauth", call => \&auth);
++      hook(type => "canedit", id => "httpauth", call => \&canedit,
++              last => 1);
+ }
+ sub getsetup () {
+@@ -33,9 +35,21 @@ sub auth ($$) {
+       if (defined $cgi->remote_user()) {
+               $session->param("name", $cgi->remote_user());
+       }
+-      elsif (defined $config{cgiauthurl}) {
+-              IkiWiki::redirect($cgi, $config{cgiauthurl}.'?'.$cgi->query_string());
+-              exit;
++}
++
++sub canedit ($$$) {
++      my $page=shift;
++      my $cgi=shift;
++      my $session=shift;
++
++      if (! defined $cgi->remote_user() && defined $config{cgiauthurl}) {
++              return sub {
++                      IkiWiki::redirect($cgi, $config{cgiauthurl}.'?'.$cgi->query_string());
++                      exit;
++              };
++      }
++      else {
++              return undef;
+       }
+ }
+</pre>
+
+> With `anonok` enabled, this works for anonymous editing of an
+> existing Discussion page. auth is still needed to create one. --[[schmonz]]
+
+>> Refreshed above patch to fix that. --[[Joey]] 
+
+>> Remaining issue: This patch will work with anonok, but not openid or
+>> passwordauth, both of which want to display a login page at the same
+>> time that httpauth is redirecting to the cgiauthurl. As mentioned above,
+>> the only way to deal with that would be to add a link to the signin page
+>> that does the httpauth signin. --[[Joey]] 
+
+>>> That's dealt with in final version. [[done]] --[[Joey]] 
diff --git a/doc/bugs/attachment_upload_does_not_work_for_windows_clients.mdwn b/doc/bugs/attachment_upload_does_not_work_for_windows_clients.mdwn
new file mode 100644 (file)
index 0000000..4e8c7bd
--- /dev/null
@@ -0,0 +1,34 @@
+It seems as if windows clients (IE) submit filenames with backslash as directory separator.
+(no surprise :-).
+
+But the attachment plugin translates these backslashes to underscore, making the
+whole path a filename.
+
+> As far as I can see, that just means that the file will be saved with
+> a filename something like `c:__92__My_Documents__92__somefile`.
+> I don't see any "does not work" here. Error message?
+> 
+> Still, I don't mind adding a special case, though obviously not in
+> `basename`. [[done]] --[[Joey]] 
+
+>> Well, it's probably something else also, I get **bad attachment filename**.
+>> Now, that could really be a bad filename, problem is that it wasn't. I even
+>> tried applying the **wiki_file_prune_regexps** one by one to see what was
+>> causing it. No problem there. The strange thing is that the error shows up
+>> when using firefox on windows too. But the backslash hack fixes at least the
+>> incorrect filename from IE (firefox on windows gave me the correct filename.
+>> I'll do some more digging... :-)  /jh
+
+This little hack fixed the backslash problem, although I wonder if that
+really is the problem?
+(Everything works perfectly from linux clients of course. :-)
+
+       sub basename ($) {
+               my $file=shift;
+
+               $file=~s!.*/+!!;
+               $file=~s!.*\\+!!;
+               return $file;
+       }
+
+Should probably be `$file=~s!.*[/\\]+!!` :-)
index 42e6b9e27eaa6296b5452c33ddc1bf35ea4a8bde..c3cbff43e97379a55aebac3f6a9a093082d90ee0 100644 (file)
@@ -39,3 +39,6 @@ a year ago in September 2007.
 > ikiwiki. (Doesn't quite seem to be version 2.53.x either) Try with a current
 > version, and see if you can send me a source tree that can reproduce the
 > problem? --[[Joey]]
+
+Did not hear back, so calling this [[done]], unless I hear differently.
+--[[Joey]]
diff --git a/doc/bugs/build_fails_oddly_when_older_ikiwiki_is_installed.mdwn b/doc/bugs/build_fails_oddly_when_older_ikiwiki_is_installed.mdwn
new file mode 100644 (file)
index 0000000..7b25203
--- /dev/null
@@ -0,0 +1,31 @@
+I got this failure when trying to build ikiwiki version 3.20100403:
+
+       $ perl Makefile.PL INSTALL_BASE=/opt/ikiwiki PREFIX=
+       Writing Makefile for IkiWiki
+       $ make
+
+*...snip...*
+
+       ./pm_filter /opt/ikiwiki 3.20100403 /opt/ikiwiki/lib/perl5 < ikiwiki.in > ikiwiki.out
+       chmod +x ikiwiki.out
+       ./pm_filter /opt/ikiwiki 3.20100403 /opt/ikiwiki/lib/perl5 < ikiwiki-transition.in > ikiwiki-transition.out
+       chmod +x ikiwiki-transition.out
+       ./pm_filter /opt/ikiwiki 3.20100403 /opt/ikiwiki/lib/perl5 < ikiwiki-calendar.in > ikiwiki-calendar.out
+       chmod +x ikiwiki-calendar.out
+       HOME=/home/me /usr/bin/perl -Iblib/lib   ikiwiki.out -libdir . -dumpsetup ikiwiki.setup
+       Use of uninitialized value $IkiWiki::Setup::config{"setuptype"} in concatenation (.) or string at IkiWiki/Setup.pm line 53.
+       Can't locate IkiWiki/Setup/.pm in @INC (@INC contains: . /opt/ikiwiki/lib/perl5/i486-linux-gnu-thread-multi /opt/ikiwiki/lib/perl5 blib/lib /etc/perl /usr/local/lib/perl/5.10.1 /usr/local/share/perl/5.10.1 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.10 /usr/share/perl/5.10 /usr/local/lib/site_perl .) at (eval 35) line 3.
+
+       make: *** [ikiwiki.setup] Error 2
+
+Note that I had been trying to upgrade with an installed ikiwiki 3.20091114
+already in place under /opt/ikiwiki.  The build does not fail for me
+if I first remove the old ikiwiki installation, nor does it fail with
+3.20100403 or newer installed at /opt/ikiwiki.  Hence this is not
+really a critical bug, although it's somewhat perplexing to me why it
+ought to make a difference.
+
+> So, using INSTALL_BASE causes a 'use lib' to be hardcoded into the `.out`
+> files; which overrides the -libdir and the -I, and so the old version
+> of IkiWiki.pm is used.
+> [[fixed|done]] --[[Joey]] 
diff --git a/doc/bugs/bzr_2.0_breaks_bzr_plugin.mdwn b/doc/bugs/bzr_2.0_breaks_bzr_plugin.mdwn
new file mode 100644 (file)
index 0000000..39500af
--- /dev/null
@@ -0,0 +1,87 @@
+Version 2.0 of bzr seems to break the bzr plugin.
+
+I traced this to the bzr_log method in the plugin, and patching that seems to fix it. The plugin just needs to parse the input little bit differently.
+--liw
+
+> Patch applied, [[done]] (but, it would be good if it could be tested with
+> an older bzr, and it's a pity bzr's human-targeted log has to be parsed,
+> I assume there is no machine-targeted version?) --[[Joey]] 
+
+    From fb897114124e627fd3acf5af8e784c9a77419a81 Mon Sep 17 00:00:00 2001
+    From: Lars Wirzenius <liw@liw.fi>
+    Date: Sun, 4 Apr 2010 21:05:07 +1200
+    Subject: [PATCH] Fix bzr plugin to work with bzr 2.0.
+
+    The output of "bzr log" seems to have changed a bit, so we change the
+    parsing accordingly. This has not been tested with earlier versions of
+    bzr.
+
+    Several problems seemed to occur, all in the bzr_log subroutine:
+
+    1. The @infos list would contain an empty hash, which would confuse the
+       rest of the program.
+    2. This was because bzr_log would push an empty anonymous hash to the
+       list whenever it thought a new record would start.
+    3. However, a new record marker (now?) also happens at th end of bzr log
+       output.
+    4. Now we collect the record to a hash that gets pushed to the list only
+       if it is not empty.
+    5. Also, sometimes bzr log outputs "revno: 1234 [merge]", so we catch only
+       the revision number.
+    6. Finally, there may be non-headers at the of the output, so we ignore
+       those.
+    ---
+     IkiWiki/Plugin/bzr.pm |   23 ++++++++++++++++-------
+     1 files changed, 16 insertions(+), 7 deletions(-)
+
+    diff --git a/IkiWiki/Plugin/bzr.pm b/IkiWiki/Plugin/bzr.pm
+    index 1ffdc23..e813331 100644
+    --- a/IkiWiki/Plugin/bzr.pm
+    +++ b/IkiWiki/Plugin/bzr.pm
+    @@ -73,28 +73,37 @@ sub bzr_log ($) {
+       my @infos = ();
+       my $key = undef;
+     
+    +    my $hash = {};
+       while (<$out>) {
+               my $line = $_;
+               my ($value);
+               if ($line =~ /^message:/) {
+                       $key = "message";
+    -                  $infos[$#infos]{$key} = "";
+    +                  $$hash{$key} = "";
+               }
+               elsif ($line =~ /^(modified|added|renamed|renamed and modified|removed):/) {
+                       $key = "files";
+    -                  unless (defined($infos[$#infos]{$key})) { $infos[$#infos]{$key} = ""; }
+    +                  unless (defined($$hash{$key})) { $$hash{$key} = ""; }
+               }
+               elsif (defined($key) and $line =~ /^  (.*)/) {
+    -                  $infos[$#infos]{$key} .= "$1\n";
+    +                  $$hash{$key} .= "$1\n";
+               }
+               elsif ($line eq "------------------------------------------------------------\n") {
+    +              if (keys %$hash) {
+    +                      push (@infos, $hash);
+    +              }
+    +                  $hash = {};
+                       $key = undef;
+    -                  push (@infos, {});
+               }
+    -          else {
+    +          elsif ($line =~ /: /) {
+                       chomp $line;
+    -                          ($key, $value) = split /: +/, $line, 2;
+    -                  $infos[$#infos]{$key} = $value;
+    +                  if ($line =~ /^revno: (\d+)/) {
+    +                      $key = "revno";
+    +                      $value = $1;
+    +                  } else {
+    +                          ($key, $value) = split /: +/, $line, 2;
+    +                  }
+    +                  $$hash{$key} = $value;
+               } 
+       }
+       close $out;
+    -- 
+    1.7.0
diff --git a/doc/bugs/clearenv_not_present_at_FreeBSD_.mdwn b/doc/bugs/clearenv_not_present_at_FreeBSD_.mdwn
new file mode 100644 (file)
index 0000000..f38c86e
--- /dev/null
@@ -0,0 +1,5 @@
+When build wrapper on FreeBSD system, is error occured with clearenv reference. clearenv() das not exists at FreeBSD system, use workaround environ[0]=NULL;
+P.S. new git instalation, FreeBSD 7.x
+
+> `#include <stupid-standards.h>` fixed with nasty ifdefs to handle tcc w/o
+> breaking everything else. [[done]] --[[Joey]] 
diff --git a/doc/bugs/clearenv_not_present_at_FreeBSD_/discussion.mdwn b/doc/bugs/clearenv_not_present_at_FreeBSD_/discussion.mdwn
new file mode 100644 (file)
index 0000000..713198b
--- /dev/null
@@ -0,0 +1 @@
+Mmmm... i see. But it not setup under FreeBSD without magic manual passes.
diff --git a/doc/bugs/comments_not_searchable.mdwn b/doc/bugs/comments_not_searchable.mdwn
new file mode 100644 (file)
index 0000000..6fda89b
--- /dev/null
@@ -0,0 +1,19 @@
+The text of comments (and other internal pages) does not get indexed by the
+search plugin.
+
+Search indexes content passed to the postscan hook.
+Comments are inlined, but inline's speed hack avoids adding inlined
+content to the page until the format hook.
+
+And hmm, that's somewhat desirable, because we don't want searches
+to find content that is inlined onto another page.
+
+That suggests that the fix could be to call the postscan hook
+for internal pages. 
+
+However, the search postscan hook tells xapian the page url,
+and uses `urlto($page)` to do it. And that won't work for
+an internal page. Guess it could be modified to tell xapian the
+permalink. --[[Joey]] 
+
+> [[done]] --[[Joey]] 
diff --git a/doc/bugs/comments_preview_unsafe_with_allowdirectives.mdwn b/doc/bugs/comments_preview_unsafe_with_allowdirectives.mdwn
new file mode 100644 (file)
index 0000000..7f9fb67
--- /dev/null
@@ -0,0 +1,8 @@
+If `comments_allowdirectives` is set, previewing a comment can run
+directives that create files. (Eg, img.) Unlike editpage, it does not
+keep track of those files and expire them. So the files will linger in
+destdir forever.
+
+Probably when the user then tries to save the comment, ikiwiki will refuse
+to overwrite the unknown file, and will crash.
+--[[Joey]]
diff --git a/doc/bugs/deletion_warnings.mdwn b/doc/bugs/deletion_warnings.mdwn
new file mode 100644 (file)
index 0000000..668626b
--- /dev/null
@@ -0,0 +1,89 @@
+Seen while deleting a blog's calendar pages:
+
+--[[Joey]] 
+
+[[done]] -- the new `page()` pagespec needed to check if there was a source
+file for the page, and was leaking undef.
+
+<pre>
+   427250f..ff6c054  master     -> origin/master
+Use of uninitialized value $file in pattern match (m//) at /usr/share/perl5/IkiWiki.pm line 688.
+Use of uninitialized value $file in substitution (s///) at /usr/share/perl5/IkiWiki.pm line 668.
+Use of uninitialized value $base in exists at /usr/share/perl5/IkiWiki.pm line 692.
+Use of uninitialized value $file in pattern match (m//) at /usr/share/perl5/IkiWiki.pm line 688.
+Use of uninitialized value $file in substitution (s///) at /usr/share/perl5/IkiWiki.pm line 668.
+Use of uninitialized value $base in exists at /usr/share/perl5/IkiWiki.pm line 692.
+Use of uninitialized value $file in pattern match (m//) at /usr/share/perl5/IkiWiki.pm line 688.
+Use of uninitialized value $file in substitution (s///) at /usr/share/perl5/IkiWiki.pm line 668.
+Use of uninitialized value $base in exists at /usr/share/perl5/IkiWiki.pm line 692.
+Use of uninitialized value $file in pattern match (m//) at /usr/share/perl5/IkiWiki.pm line 688.
+Use of uninitialized value $file in substitution (s///) at /usr/share/perl5/IkiWiki.pm line 668.
+Use of uninitialized value $base in exists at /usr/share/perl5/IkiWiki.pm line 692.
+Use of uninitialized value $file in pattern match (m//) at /usr/share/perl5/IkiWiki.pm line 688.
+Use of uninitialized value $file in substitution (s///) at /usr/share/perl5/IkiWiki.pm line 668.
+Use of uninitialized value $base in exists at /usr/share/perl5/IkiWiki.pm line 692.
+Use of uninitialized value $file in pattern match (m//) at /usr/share/perl5/IkiWiki.pm line 688.
+Use of uninitialized value $file in substitution (s///) at /usr/share/perl5/IkiWiki.pm line 668.
+Use of uninitialized value $base in exists at /usr/share/perl5/IkiWiki.pm line 692.
+Use of uninitialized value $file in pattern match (m//) at /usr/share/perl5/IkiWiki.pm line 688.
+Use of uninitialized value $file in substitution (s///) at /usr/share/perl5/IkiWiki.pm line 668.
+Use of uninitialized value $base in exists at /usr/share/perl5/IkiWiki.pm line 692.
+Use of uninitialized value $file in pattern match (m//) at /usr/share/perl5/IkiWiki.pm line 688.
+Use of uninitialized value $file in substitution (s///) at /usr/share/perl5/IkiWiki.pm line 668.
+Use of uninitialized value $base in exists at /usr/share/perl5/IkiWiki.pm line 692.
+Use of uninitialized value $file in pattern match (m//) at /usr/share/perl5/IkiWiki.pm line 688.
+Use of uninitialized value $file in substitution (s///) at /usr/share/perl5/IkiWiki.pm line 668.
+Use of uninitialized value $base in exists at /usr/share/perl5/IkiWiki.pm line 692.
+Use of uninitialized value $file in pattern match (m//) at /usr/share/perl5/IkiWiki.pm line 688.
+Use of uninitialized value $file in substitution (s///) at /usr/share/perl5/IkiWiki.pm line 668.
+Use of uninitialized value $base in exists at /usr/share/perl5/IkiWiki.pm line 692.
+Use of uninitialized value $file in pattern match (m//) at /usr/share/perl5/IkiWiki.pm line 688.
+Use of uninitialized value $file in substitution (s///) at /usr/share/perl5/IkiWiki.pm line 668.
+Use of uninitialized value $base in exists at /usr/share/perl5/IkiWiki.pm line 692.
+Use of uninitialized value $file in pattern match (m//) at /usr/share/perl5/IkiWiki.pm line 688.
+Use of uninitialized value $file in substitution (s///) at /usr/share/perl5/IkiWiki.pm line 668.
+Use of uninitialized value $base in exists at /usr/share/perl5/IkiWiki.pm line 692.
+Use of uninitialized value $file in pattern match (m//) at /usr/share/perl5/IkiWiki.pm line 688.
+Use of uninitialized value $file in substitution (s///) at /usr/share/perl5/IkiWiki.pm line 668.
+Use of uninitialized value $base in exists at /usr/share/perl5/IkiWiki.pm line 692.
+Use of uninitialized value $file in pattern match (m//) at /usr/share/perl5/IkiWiki.pm line 688.
+Use of uninitialized value $file in substitution (s///) at /usr/share/perl5/IkiWiki.pm line 668.
+Use of uninitialized value $base in exists at /usr/share/perl5/IkiWiki.pm line 692.
+Use of uninitialized value $file in pattern match (m//) at /usr/share/perl5/IkiWiki.pm line 688.
+Use of uninitialized value $file in substitution (s///) at /usr/share/perl5/IkiWiki.pm line 668.
+Use of uninitialized value $base in exists at /usr/share/perl5/IkiWiki.pm line 692.
+Use of uninitialized value $file in pattern match (m//) at /usr/share/perl5/IkiWiki.pm line 688.
+Use of uninitialized value $file in substitution (s///) at /usr/share/perl5/IkiWiki.pm line 668.
+Use of uninitialized value $base in exists at /usr/share/perl5/IkiWiki.pm line 692.
+Use of uninitialized value $file in pattern match (m//) at /usr/share/perl5/IkiWiki.pm line 688.
+Use of uninitialized value $file in substitution (s///) at /usr/share/perl5/IkiWiki.pm line 668.
+Use of uninitialized value $base in exists at /usr/share/perl5/IkiWiki.pm line 692.
+Use of uninitialized value $file in pattern match (m//) at /usr/share/perl5/IkiWiki.pm line 688.
+Use of uninitialized value $file in substitution (s///) at /usr/share/perl5/IkiWiki.pm line 668.
+Use of uninitialized value $base in exists at /usr/share/perl5/IkiWiki.pm line 692.
+Use of uninitialized value $file in pattern match (m//) at /usr/share/perl5/IkiWiki.pm line 688.
+Use of uninitialized value $file in substitution (s///) at /usr/share/perl5/IkiWiki.pm line 668.
+Use of uninitialized value $base in exists at /usr/share/perl5/IkiWiki.pm line 692.
+Use of uninitialized value $file in pattern match (m//) at /usr/share/perl5/IkiWiki.pm line 688.
+Use of uninitialized value $file in substitution (s///) at /usr/share/perl5/IkiWiki.pm line 668.
+Use of uninitialized value $base in exists at /usr/share/perl5/IkiWiki.pm line 692.
+Use of uninitialized value $file in pattern match (m//) at /usr/share/perl5/IkiWiki.pm line 688.
+Use of uninitialized value $file in substitution (s///) at /usr/share/perl5/IkiWiki.pm line 668.
+Use of uninitialized value $base in exists at /usr/share/perl5/IkiWiki.pm line 692.
+Use of uninitialized value $file in pattern match (m//) at /usr/share/perl5/IkiWiki.pm line 688.
+Use of uninitialized value $file in substitution (s///) at /usr/share/perl5/IkiWiki.pm line 668.
+Use of uninitialized value $base in exists at /usr/share/perl5/IkiWiki.pm line 692.
+Use of uninitialized value $file in pattern match (m//) at /usr/share/perl5/IkiWiki.pm line 688.
+Use of uninitialized value $file in substitution (s///) at /usr/share/perl5/IkiWiki.pm line 668.
+Use of uninitialized value $base in exists at /usr/share/perl5/IkiWiki.pm line 692.
+Use of uninitialized value $file in pattern match (m//) at /usr/share/perl5/IkiWiki.pm line 688.
+Use of uninitialized value $file in substitution (s///) at /usr/share/perl5/IkiWiki.pm line 668.
+Use of uninitialized value $base in exists at /usr/share/perl5/IkiWiki.pm line 692.
+Use of uninitialized value $file in pattern match (m//) at /usr/share/perl5/IkiWiki.pm line 688.
+Use of uninitialized value $file in substitution (s///) at /usr/share/perl5/IkiWiki.pm line 668.
+Use of uninitialized value $base in exists at /usr/share/perl5/IkiWiki.pm line 692.
+Use of uninitialized value $file in pattern match (m//) at /usr/share/perl5/IkiWiki.pm line 688.
+Use of uninitialized value $file in substitution (s///) at /usr/share/perl5/IkiWiki.pm line 668.
+Use of uninitialized value $base in exists at /usr/share/perl5/IkiWiki.pm line 692.
+</pre>
+
diff --git a/doc/bugs/depends_simple_mixup.mdwn b/doc/bugs/depends_simple_mixup.mdwn
new file mode 100644 (file)
index 0000000..a5910d0
--- /dev/null
@@ -0,0 +1,88 @@
+The [[bugs]] page, at least before I commit this, has a bug at the top that
+has been modified to link to done, and ikiwiki's dependency calculations
+failed to notice and update the bugs page. Looking at the indexdb, I saw
+that the page was not included in the `depends_simple` of the bugs page. 
+
+I was able to replicate the problem locally by starting off with the page
+marked done (when it did appear in the bugs page `depends_simple`
+(appropriatly as a link dependency, since a change to the page removing the
+link would make it match)), then removing the done link. 
+
+At that point, it vanished from `depends_simple`. Presumably because
+the main (pagespec) depends for the bugs page now matched it, as a content
+dependency. But, it seems to me it should still be listed in
+`depends_simple` here. This, I think, is the cause of the bug.
+
+Then re-add the done link, and the dependency calc code breaks down,
+not noticing that bugs dependeded on the page and needs to be updated.
+
+Ok.. Turns out this was not a problem with the actual influences
+calculation or dependency calculation code. Whew! `match_link`
+just didn't set the influence correctly when failing. fixed
+
+--[[Joey]]
+
+---
+
+Update: Reopening this because the fix for it rather sucks.
+
+I made `match_link` return on failure an influence of
+type DEPEND_LINKS. So, a tag page that inlines `tagged(foo)`
+gets a `depends_simple` built up that contains link dependencies for
+*every* page in the wiki. A very bloaty way to represent the dependency!
+
+Per [[todo/dependency_types]], `link(done)` only needs to list in
+`depends_simple` the pages that currently match. If a page is modified
+to add the link, the regular dependency calculation code notices that
+a new page matches. If a page that had the link is modified to remove it,
+the `depends_simple` lets ikiwiki remember that the now non-matching page
+matched before.
+
+Where that fell down was `!link(done)`. A page matching that was not added
+to `depends_simple`, because the `link(done)` did not match it. If the page
+is modified to add the link, the regular dependency calculation code
+didn't notice, since the pagespec no longer matched.
+
+In this case, `depends_simple` needs to contain all pages
+that do *not* match `link(done)`, but before my change, it contained
+all pages that *do* match. After my change, it contained all pages.
+
+----
+
+So, seems what is needed is a way for influence info to be manipulated by
+the boolean operations that are applied. One way would be to have two
+sets of influences be returned, one for successful matches, and one for
+failed matches. Normally, these would be the same. For successful
+`match_link`, the successful influence would be the page.
+For failed `match_link`, the failed influence would be the page.
+
+Then, when NOTting a `*Reason`, swap the two sets of influences.
+When ANDing/ORing, combine the individual sets. Querying the object for
+influences should return only the successful influences.
+
+----
+
+Would it be possible to avoid the complication of maintianing two sets of
+influence info? 
+
+Well, notice that the influence of `pagespec_match($page, "link(done)")`
+is $page. Iff the match succeeds.
+
+Also, the influence of `pagespec_match($page, "!link(done)")` is
+$page. Iff the (overall) match succeeds.
+
+Does that hold for all cases? If so, the code that populates
+`depends_simple` could just test if the pagespec was successful, and
+if not, avoid adding $page influences, while still adding any other, 
+non-$page influences.
+
+----
+
+Hmm, commit f2b3d1341447cbf29189ab490daae418fbe5d02d seems
+thuroughly wrong. So, what about influence info for other matches
+like `!author(foo)` etc? Currently, none is returned, but it should
+be a content influence. (Backlink influence data seems ok.)
+
+----
+
+[[done]] again!
index 5bab283fd65677c31d3d8294726b92757bfa8e29..51d6ad4757b53e3d5cc97a5497851b3af262273a 100644 (file)
@@ -21,4 +21,4 @@ It works fine with h2 and deeper.  The square brackets also appear in the output
 
 > [[done]] --[[Joey]]
 
->> It works here but it definitely does *not* work on my wiki; but on further experimentation, I believe my problem is being caused by JasonBlevins' [h1title](http://code.jblevins.org/ikiwiki/plugins.git/plain/h1title.pm) plugin.
+>> It works here but it definitely does *not* work on my wiki; but on further experimentation, I believe my problem is being caused by JasonBlevins' [h1title](http://jblevins.org/git/ikiwiki/plugins.git/plain/h1title.pm) plugin.
diff --git a/doc/bugs/filecheck_failing_to_find_files.mdwn b/doc/bugs/filecheck_failing_to_find_files.mdwn
new file mode 100644 (file)
index 0000000..6501508
--- /dev/null
@@ -0,0 +1,65 @@
+Using the attachment plugin, when filecheck was checking the mime-type of the attachment before allowing the attachment to be removed, it was returning with an error saying that the mime-type of the file was "unknown" (when the mime-type definitely was known!)
+
+It turns out that the filecheck plugin couldn't find the file, because it was merely using the $pagesources hash, rather than finding the absolute path of the file in question.
+
+> I don't understand why the file was not in `%pagesources`. Do you?
+> --[[Joey]]
+
+>> The file *was* in `%pagesources`, but what returns from that is the filename relative to the `srcdir` directory; for example, `foo/bar.gif`.
+>> When File::MimeInfo::Magic::magic is given that, it can't find the file.
+>> But if it is given `/path/to/srcdir/foo/bar.gif` instead, then it *can* find the file, and returns the mime-type correctly.
+>> --[[KathrynAndersen]]
+
+>>> Ok, so it's not removal specific, can in fact be triggered by using
+>>> testpagespec (or really anything besides attachment, which passes
+>>> the filename parameter). Nor is it limited to mimetype, all the tests in 
+>>> filecheck have the problem. --[[Joey]] 
+
+>>>> Alas, not fixed.  It seems I was mistaken in some of my assumptions.
+>>>> It still happens when attempting to remove attachments.
+>>>> With your fix, the `IkiWiki::srcfile` function is only called when the filename is not passed in, but it appears that in the case of removing attachments, the filename IS passed in, but it is the relative filename as mentioned above.  Thus, the file is still not found, and the mime-type comes back as unknown.
+>>>> The reason my patch worked is because, rather than checking whether a filename was passed in before applying IkiWiki::srcfile to the filename, it checks whether the file can be found, and if it cannot be found, then it applies IkiWiki::srcfile to the filename.
+>>>> --[[KathrynAndersen]]
+
+>>>>> Can you test if this patch fixes that? --[[Joey]]
+
+>>>>>> Yes, it works! --[[KathrynAndersen]]
+
+applied && [[done]]
+
+<pre>
+diff --git a/IkiWiki/Plugin/remove.pm b/IkiWiki/Plugin/remove.pm
+index f59d026..0fc180f 100644
+--- a/IkiWiki/Plugin/remove.pm
++++ b/IkiWiki/Plugin/remove.pm
+@@ -49,7 +49,7 @@ sub check_canremove ($$$) {
+       # This is sorta overkill, but better safe than sorry.
+       if (! defined pagetype($pagesources{$page})) {
+               if (IkiWiki::Plugin::attachment->can("check_canattach")) {
+-                      IkiWiki::Plugin::attachment::check_canattach($session, $page, $file);
++                      IkiWiki::Plugin::attachment::check_canattach($session, $page, "$config{srcdir}/$file");
+               }
+               else {
+                       error("removal of attachments is not allowed");
+diff --git a/IkiWiki/Plugin/rename.pm b/IkiWiki/Plugin/rename.pm
+index 3908443..1a9da63 100644
+--- a/IkiWiki/Plugin/rename.pm
++++ b/IkiWiki/Plugin/rename.pm
+@@ -50,7 +50,7 @@ sub check_canrename ($$$$$$) {
+       IkiWiki::check_canedit($src, $q, $session);
+       if ($attachment) {
+               if (IkiWiki::Plugin::attachment->can("check_canattach")) {
+-                      IkiWiki::Plugin::attachment::check_canattach($session, $src, $srcfile);
++                      IkiWiki::Plugin::attachment::check_canattach($session, $src, "$config{srcdir}/$srcfile");
+               }
+               else {
+                       error("renaming of attachments is not allowed");
+@@ -85,7 +85,7 @@ sub check_canrename ($$$$$$) {
+               if ($attachment) {
+                       # Note that $srcfile is used here, not $destfile,
+                       # because it wants the current file, to check it.
+-                      IkiWiki::Plugin::attachment::check_canattach($session, $dest, $srcfile);
++                      IkiWiki::Plugin::attachment::check_canattach($session, $dest, "$config{srcdir}/$srcfile");
+               }
+       }
+</pre>
index 46e77a265af72a7c7a4f74df7994efd17eb053b1..558eb90c8cb7565ff94e747146c217a0a4f3a48d 100644 (file)
@@ -5,3 +5,10 @@ Only explicitly pressing "reload" helps.
 Is it a bug? I haven't been noticing such problems usually on other sites. --Ivan Z.
 
 This remains to be true now, with Epiphany 2.26.3 (Mozilla/5.0 (X11; U; Linux i686; en; rv:1.9.1.4pre) Gecko/20080528 Epiphany/2.22 Firefox/3.5). --Ivan Z.
+
+> In the most recent ikiwiki release, I added a Cache-Control hack
+> explicitly to work around firefox's broken over-caching.
+> 
+> (When I tested epiphany and chromium, neither had firefox's problem.)
+>
+> [[!tag done]]
diff --git a/doc/bugs/gitremotes_script_picks_up_tags_from_anywhere.mdwn b/doc/bugs/gitremotes_script_picks_up_tags_from_anywhere.mdwn
new file mode 100644 (file)
index 0000000..9bd8938
--- /dev/null
@@ -0,0 +1,22 @@
+[[!tag patch]]
+[[!template id=gitbranch branch=smcv/ready/no-tags author="[[smcv]]"]]
+
+The `gitremotes` script picks up tags from any repository, including those
+used for local .debs that were never actually present in Debian:
+
+    smcv@reptile% git tag | grep -c nmu
+    52
+
+This can be avoided with the `tagopt = --no-tags` option in .git/config;
+see <http://git.pseudorandom.co.uk/smcv/ikiwiki.git?a=shortlog;h=refs/heads/ready/no-tags>
+
+> *done* thanks. Also cleared propigated tags out of origin. 
+> 
+> Hmm, in testing I still see tags get pulled the first time a remote
+> is added. If those are then locally deleted, it doesn't pull them again
+> with the `--no-tags`.
+> --[[Joey]] 
+
+>> Oh, I see why. Try the same branch again... --[[smcv]]
+
+>>> [[done]] --[[Joey]] 
index 23947427588dc9a325708c5cd72b8ca5f9d48736..ba67d532b86cb957d86e20cbd73d7b9c8cdc64f9 100644 (file)
@@ -9,10 +9,59 @@ HTML5](http://www.w3.org/TR/html5-diff/).
 * [ikiwiki instance with HTML5 templates](http://natalian.org)
 * [HTML5 outliner tool](http://gsnedders.html5.org/outliner/) -- to check you have the structure of your markup correct
 
+> Kai, thanks enormously for working on this. I switched a page to 
+> the html5 doctype today, and was rather pleasently suprised that it
+> validated, except for the new Cache-Control meta tag. Now I see you're
+> well ahead of me. --[[Joey]] 
+> 
+> So, how should ikiwiki support html5? There are basically 3 approaches:
+> 
+> 1. Allow users to add html5 tags to their existing xhtml pages.
+>    What has been done so far, can be extended. Basically works 
+>    in browsers, if you don't care about standards. A good prerequisite
+>    for anything else, anyway.
+> 2. Have both a html5 and a xhtml mode, allow user to select.
+> 3. Switch to html5 in eg, ikiwiki 4; users have to deal with
+>    any custom markup on their pages/templates that breaks then.
+> 
+> The second option seems fairly tractable from what I see here and in 
+> your branch. You made only relatively minor changes to 10 templates.
+> It would probably not be too dreadful to put them in ifdefs. I've made a
+> small start at doing that.
+> 
+> I've made ikiwiki use the time element and all the new semantic elements
+> in html5 mode.
+> 
+> Other ideas:
+>  
+> * Use details tag instead of the javascript in the toggle plugin. 
+>   (Need to wait on browser support probably.)
+> * Use figure and figcaption for captions in img. However, I have not 
+>   managed to style it to look as good as the current table+caption
+>   approach.
+> 
+> --[[Joey]] 
+
 # htmlscrubber.pm needs to not scrub new HTML5 elements
 
 * [new elements](http://www.w3.org/TR/html5-diff/#new-elements)
 
+> Many added now.
+>
+> Things I left out, too hard to understand today:
+> Attributes contenteditable,
+> data-\*, draggable, role, aria-\*.
+> Tags command, keygen, output.
+> 
+> Clearly unsafe: embed.
+> 
+> Apparently cannot be used w/o javascript: menu.
+> 
+> I have not added the new `ping` attribute, because parsing a
+> space-separeated list of urls to avoid javascript injection is annoying, 
+> and the attribute seems generally dubious.
+>  --[[Joey]] 
+
 # HTML5 Validation and t/html.t
 
 [validator.nu](http://validator.nu/) is the authorative HTML5 validator,
@@ -25,6 +74,9 @@ In the future, hopefully ikiwiki can test for valid HTML5 using [Relax NG
 schema](http://syntax.whattf.org/) using a Debian package tool
 [rnv](http://packages.qa.debian.org/r/rnv.html).
 
+> Validation in the test suite is nice, but I am willing to lose those
+> tests for a while. --[[Joey]] 
+
 # HTML5 migration issues
 
 # [article](http://www.whatwg.org/specs/web-apps/current-work/multipage/semantics.html#the-article-element) element
@@ -37,6 +89,8 @@ This element is poorly supported by browsers. As a workaround, `style.css` needs
 
 Internet Explorer will display it as a block, though you can't seem to be able to further control the style.
 
+> done  (needed for header too) --[[Joey]] 
+
 ## Time element
 
 The [time element](http://www.whatwg.org/specs/web-apps/current-work/multipage/text-level-semantics.html#the-time-element) ideally needs the datatime= attribute set by a template variable with what [HTML5 defines as a valid datetime string](http://www.whatwg.org/specs/web-apps/current-work/multipage/infrastructure.html#valid-global-date-and-time-string).
@@ -45,3 +99,19 @@ As a workaround:
 
        au:~% grep timeformat natalian.setup
        timeformat => '%Y-%m-%d',
+
+> Also, the [[plugins/relativedate]] plugin needs to be updated to 
+> support relatatizing the contents of time elements. --[[Joey]] 
+
+> Done and done; in html5 mode it uses the time tag, and even 
+> adds pubdate when displaying ctimes. --[[Joey]]
+
+## tidy plugin
+
+Will reformat html5 to html4.
+
+----
+
+
+Ok, I consider this [[done]], at least as a first pass. Html5 mode
+is experimental, but complete enough. --[[Joey]] 
diff --git a/doc/bugs/html5_time_element__39__s_pubdate_wrong_when_using_xhtml5___34__mode__34__.mdwn b/doc/bugs/html5_time_element__39__s_pubdate_wrong_when_using_xhtml5___34__mode__34__.mdwn
new file mode 100644 (file)
index 0000000..def5bcc
--- /dev/null
@@ -0,0 +1,46 @@
+Hi,
+
+XML error:
+
+    Created <time datetime="2009-03-24T18:02:14Z" pubdate class="relativedate" title="Tue, 24 Mar 2009 14:02:14 -0400">2009-03-24</time>
+
+The pubdate REQUIRES a date, so e.g. `pubdate="2009-03-24T18:02:14Z"`
+
+> No, `pubdate="pubdate"`. It's a boolean attribute. applied && [[done]]
+> --[[Joey]] 
+>> awesome, thanks for fixing my fix ;) --[[simonraven]]
+
+Otherwise the XML parser chokes.
+
+<http://www.whatwg.org/specs/web-apps/current-work/multipage/text-level-semantics.html#attr-time-pubdate>
+
+(indented exactly 4 spaces)
+
+<pre>
+    diff --git a/IkiWiki.pm b/IkiWiki.pm
+    index 1f2ab07..6ab5b56 100644
+    --- a/IkiWiki.pm
+    +++ b/IkiWiki.pm
+    @@ -1004,7 +1004,7 @@ sub displaytime ($;$$) {
+        my $time=formattime($_[0], $_[1]);
+        if ($config{html5}) {
+            return '&lt;time datetime="'.date_3339($_[0]).'"'.
+    -         ($_[2] ? ' pubdate' : '').
+    +           ($_[2] ? ' pubdate="'.date_3339($_[0]).'"' : '').
+                '>'.$time.'&lt;/time&gt;';
+        }
+        else {
+    diff --git a/IkiWiki/Plugin/relativedate.pm b/IkiWiki/Plugin/relativedate.pm
+    index fe8ef09..8c4a1b4 100644
+    --- a/IkiWiki/Plugin/relativedate.pm
+    +++ b/IkiWiki/Plugin/relativedate.pm
+    @@ -59,7 +59,7 @@ sub mydisplaytime ($;$$) {
+     
+        if ($config{html5}) {
+            return '&lt;time datetime="'.IkiWiki::date_3339($time).'"'.
+    -         ($pubdate ? ' pubdate' : '').$mid.'&lt;/time&gt;';
+    +           ($pubdate ? ' pubdate="'.IkiWiki::date_3339($time).'"' : '').$mid.'&lt;/time&gt;';
+        }
+        else {
+            return '&lt;span'.$mid.'&lt;/span&gt;';
+</pre>
index 3d0c99b83bb7ecc5c484b25c2eb0ea7c76921e65..dac4d2736949c9fdb957e58358c78252fbb103d6 100644 (file)
@@ -22,8 +22,7 @@ Note that using $ua->proxy(['https'], ...); won't work, you get a "Not Implement
 
 Also note that the proxy won't work with liblwpx-paranoidagent-perl, I had to remove liblwpx-paranoidagent-perl first.
 
-Please get the patch from the *.mdwn source.
-
+<pre>
 louie:/usr/share/perl5/IkiWiki/Plugin# diff -u openid.pm.old openid.pm
 --- openid.pm.old      2008-10-26 12:18:58.094489360 +1100
 +++ openid.pm  2008-10-26 12:40:05.763429880 +1100
@@ -42,6 +41,11 @@ louie:/usr/share/perl5/IkiWiki/Plugin# diff -u openid.pm.old openid.pm
        # Store the secret in the session.
        my $secret=$session->param("openid_secret");
        if (! defined $secret) {
-
+</pre>
 
 Brian May
+
+> Rather than adding config file settings for every useful environment 
+> variable, there is a ENV config file setting that can be used to set
+> any environment variables you like. So, no changed needed. [[done]]
+> --[[Joey]] 
diff --git a/doc/bugs/ikiwiki-transition_does_not_set_perl_moduels_path_properly.mdwn b/doc/bugs/ikiwiki-transition_does_not_set_perl_moduels_path_properly.mdwn
new file mode 100644 (file)
index 0000000..b3e87b5
--- /dev/null
@@ -0,0 +1,17 @@
+When installing ikiwiki the perl module path is setup correctly
+
+    use lib '/usr/local/ikiwiki-3.20100312/share/perl/5.10.0';
+
+This is not true for ikiwiki-transition:
+
+    $ PATH=/usr/local/ikiwiki-3.20100312/bin ikiwiki-transition prefix_directives ikiwiki.setup
+    Can't locate IkiWiki.pm in @INC (@INC contains: /etc/perl /usr/local/lib/perl/5.10.0
+     /usr/local/share/perl/5.10.0 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.10 /usr/share/perl/5.10 /usr/local/lib/site_perl .)
+     at /usr/local/ikiwiki-3.20100312/bin/ikiwiki-transition line 4.
+    BEGIN failed--compilation aborted at /usr/local/ikiwiki-3.20100312/bin/ikiwiki-transition line 4.
+
+The missing line should be added.
+
+Thanks!
+
+[[done]] --[[Joey]] 
diff --git a/doc/bugs/img_plugin_and_missing_heigth_value.mdwn b/doc/bugs/img_plugin_and_missing_heigth_value.mdwn
new file mode 100644 (file)
index 0000000..4bc070c
--- /dev/null
@@ -0,0 +1,7 @@
+When I set up my picture page with `\[[!img  defaults size=300x]]` then the html validator complains that the value for height is missing and the IE browsers won't show the pictures up at all; no problems with ff tho. If I set up my picture page with `\[[!img  defaults size=300x300]]` then all the images are funny stretched. What am I doing wrong?
+
+> This is a bug. --[[Joey]]
+
+> And .. [[fixed|done]] --[[Joey]] 
+
+>> Not quite; For some reason it requires me to update wiki pages twice before the height value shows up.
index 6eff4617862c5b4c9776c9d65c5cf61c72d407ed..c78465a37441b232483f12226d86c2d3178e0014 100644 (file)
@@ -29,3 +29,10 @@ almost of my CSS foo again ;-) it seems.) --[[tschwinge]]
 >> scripts again...
 >> 
 >> --[[tschwinge]]
+
+>>> It seems, the 'align=right' parameter gets filtered in my installation
+>>> Are there other plugins, that could throw the parameter away?
+>>> --[[jwalzer]]
+
+>>>> Can't think of anything. htmlscrubber doesn't; tidy doesn't.
+>>>> --[[Joey]] 
index e43540c657fe7f601ec99013cf0ecd126dff8ebe..19aa94e7efce67a3a409989eda487f09b4a8fb0c 100644 (file)
@@ -25,3 +25,5 @@ types, ikiwiki should output a better error message.
 > It does allow including binary files right into a page, but nothing is
 > stopping you pasting binary data right into the edit form either, so
 > while annoying I don't think that will be a security problem. --[[Joey]] 
+
+[[done]]
index 1d087985a241d6603a0fae88377953a624a11291..9aa702037ba34a94ba5133f5fe68db991da3de46 100644 (file)
@@ -36,7 +36,7 @@ If you want to keep it as one form, then perhaps using some javascript to disabl
 > that allows modifying that form, but does not allow creating a separate
 > form. The best way to make it obvious how to use it currently is to just
 > disable password auth, then it's nice and simple. :-) Javascript is an
-> interesting idea. It's also possible to write a custom [[signin.tmpl wikitemplates]] that
+> interesting idea. It's also possible to write a custom [[templates]] that
 > is displayed instead of the regular signin form, and it should be
 > possible to use that to manually lay it out better than FormBuilder
 > manages with its automatic layout. --[[Joey]]
@@ -44,4 +44,4 @@ If you want to keep it as one form, then perhaps using some javascript to disabl
 > I've improved the form, I think it's more obvious now that the openid
 > stuff is separate. Good enough to call this [[done]]. I think. --[[Joey]]
 
->> Looks good, thanks!  :-) -- [[AdamShand]]
\ No newline at end of file
+>> Looks good, thanks!  :-) -- [[AdamShand]]
index 96686053ce2bacd44dab08ea7653f2f8da07421a..17ac12b3497f580b9d92de5d3145d3bbf85de3a8 100644 (file)
@@ -31,3 +31,9 @@ Best of all would be to use URL-based or hidden-field-based session tokens if co
 >> 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.
+
+>>> It is impossible to get to an edit page w/o a cookie, unless
+>>> anonymous edits are allowed, in which case it will save. No data loss.
+>>> Since noone is working on this, and the nonsense above has pissed me
+>>> off to the point that I will certianly never work on it, I'm going to
+>>> close it. --[[Joey]] [[done]]
index f8e257dafb59544210e41acbebc73df9e07f4642..d12414d5548ea9b18dcfdeaa76be4c0307eb7302 100644 (file)
@@ -1,4 +1,4 @@
-The [[directive/map]] directive sorty by pagename. That looks kind of odd, when used together with show=title. I would expect it to sort by title then.
+The [[ikiwiki/directive/map]] directive sort by pagename. That looks kind of odd, when used together with show=title. I would expect it to sort by title then.
 
 > This would be quite hard to fix. Map sorts the pages it displays by page
 > name, which has the happy effect of making "foo/bar" come after "foo";
@@ -6,3 +6,15 @@ The [[directive/map]] directive sorty by pagename. That looks kind of odd, when
 > it's located in. If sorting by title, that wouldn't hold. So, map
 > would have to be effectively totally rewritten, to build up each group
 > of child pages, and then re-sort those. --[[Joey]] 
+
+>> Ok, you are right, that does would break the tree. This made me think that I do not
+>> need to generate a tree for my particular use case just a list, so i thought i could use [[ikiwiki/directive/inline]] instead.
+>> This created two new issues:
+>>
+>> 1. inline also does sort by pagename even when explicitly told to sort by title.
+>>
+>> 2. I cannot get inline to create a list when the htmltidy plugin is switched on. I have a template which is enclosed in an li tag, and i put the ul tag around the inline manually, but htmltidy breaks this. --martin
+
+>>>> You might want to check if the [[plugins/contrib/report]] plugin solves your problem.  It can sort by title, among other things. --[[KathrynAndersen]]
+
+>> See also: [[todo/sort_parameter_for_map_plugin_and_directive]] --[[smcv]]
diff --git a/doc/bugs/misctemplate_does_not_respect_the_current_page___40__if_any__41__.mdwn b/doc/bugs/misctemplate_does_not_respect_the_current_page___40__if_any__41__.mdwn
new file mode 100644 (file)
index 0000000..3b0347f
--- /dev/null
@@ -0,0 +1,101 @@
+I really like the new approach to having only one main template "page.tmpl". For instance, it improves previews during edits.
+But it causes some nasty bugs for plugins that use the pagetemplate hook. It is especially visible with the [[plugins/sidebar]] plugin.
+
+## Some examples
+
+### A first example
+
+* activate sidebars globally and cgi
+* create "/sidebar.mdwn" with "[<span></span>[foo]]" inside
+* create "/foo.mdwn" with "hello!" inside
+* create "/bar.mdwn"
+* run ikiwiki
+* with the web browser, go to the page "bar"
+* notice the sidebar, click on "foo"
+* notice the page "foo" is now displayed (hello!)
+* return the the page "bar" and click "edit"
+* notice the sidebar is still here, click on the "foo"
+* -> Problem: 404, the browser goes to "/bar/foo" 
+* -> Was expected: the browser goes to "/foo"
+
+> You must have a locally modified `page.tmpl` that omits the "TMPL_IF DYNAMIC"
+> that adds a `<base>` tag. That is needed to make all links displayed by
+> cgis work reliably. Not just in this page editing case.
+> The [[version_3.20100515]] announcment mentions that you need to
+> update old `page.tmpl` files to include that on upgrade. --[[Joey]]
+
+>> I followed the anouncment. I also disabled my custom page.tmpl to confirm the bug. I even produced a step-by-step example to reproduce the bug.
+>> In fact, the base tag work for the page links (the content part) but did not works for the sidebar links (the sidebar part) since the sidebar links are generated in the context of the root page.
+>> In the examble above:
+>>
+>> * base="http://www.example.com/bar" relative_link_in_bar=''something" -> absolute_link_in_bar = "http://www.example.com/bar/something" (that is fine)
+>> * base="http://www.example.com/bar" relative_link_in_sidebar="foo" (because generated in the context of the root page) -> absolute_link_in_sidebar = "http://www.example.com/bar/foo" (that is not fine)
+>>
+>> The fix commited work for previewing, but not in other cases : links are still broken. Please juste follow the example step-by-step to reproduce it (I just retried it with a "fixed" version: Debian 3.20100610). If you cannot reproduce, please say it explicitely instead of guessing about my innability to read changelogs. -- [[JeanPrivat]]
+
+>>> Sorry if my not seeing the bug offended you. [[Fixed|done]] --[[Joey]] 
+
+>>>> Thanks! --[[JeanPrivat]] (I'm not offended)
+
+### A second example
+
+* create "/bar/sidebar.mdwn" with "world"
+* run ikiwiki
+* with the web browser, go to the page "bar"
+* notice the sidebar displays "world"
+* click "edit"
+* -> Problem: the sidebar now shows the foo link (it is the root sidebar!)
+* -> Was expecte : the sidebar displays "world"
+
+> I think it's a misconception to think that the page editing page is the same
+> as the page it's editing. If you were deleting that page, would you expect
+> the "are you sure" confirmation page to display the page's sidebar?
+> --[[Joey]]
+
+>> It is a very good point and could be argued:
+>>
+>> * for dynamic page, is the root context more legitimate than the current page context?
+>> * when clicking the Edit link, does the user expect to remain in the "same page"?
+>>
+>> But, as far as something sensible is displayed and that the links work. I'm OK with any choice. -- [[JeanPrivat]]
+
+### A last example
+
+* with the web browser edit the page "bar"
+* type <code>[<span></span>[!sidebar content="goodby"]]</code>
+* click preview
+* -> Problem: the sidebar still displays the foo link
+* -> Was expected: the sidebar display "goodby"
+
+> In the specific case of previewing, it is indeed a bug that the
+> right sidebar is not displayed. And replacing the regular sidebar 
+> with the one from the previewed page is probably the best we can do..
+> displaying 2 sidebars would be confusing, and the `page.tmpl` can
+> put the sidebar anywhere so we can't just display the preview sidebar
+> next to the rest of the page preview. --[[Joey]]
+
+>> The behavior is fine for me. However, some nitpicking (fell free to ingore) :
+>>
+>> * If the sidebar is replaced (making the previewing in-place), for consitency, should not the previewed content also shown in-place ? i.e. above the form part
+>> * there is no way to come back (without saving or canceling) to the root context (e.g. displaying the root sidebar) i.e. some sort of unpreviewing.
+>>
+>> -- [[JeanPrivat]]
+
+## Some superficial hacking
+
+With the following workaround hacks, I manage to solve the 3 examples shown above:
+
+1- edit IkiWiki/Plugin/editpage.pm and call showform with additional page and destpage parameters:
+<pre>showform($form, \@buttons, $session, $q, forcebaseurl => $baseurl, page => $page, destpage => $page);</pre>
+
+2- edit /usr/share/perl5/IkiWiki.pm and modify the misctemplate function to use the given page and destpage:
+<pre>my %params=@_;
+shift->(page => $params{page}, destpage => $params{destpage}, template => $template);</pre>
+
+I do not guarantee (I do not even expect) that it is the proper way to solve
+this bug but it may help developers to find and solve the real problem. 
+
+> Oh, it's pretty reasonable. I don't think it breaks anything. :)
+> I modified it a bit, and explicitly made it *not* "fix" the second example.
+> --[[Joey]] 
+>> I removed the done tag (I suspect it is the way to reopen bugs) -- [[JeanPrivat]]
index 33433e235de7330b39c3d2949128d8c6f9217329..92ea4c4ef412f6efd2d8a023e6747c61cede3667 100644 (file)
@@ -32,3 +32,20 @@ Am I missing something? Is this a bug or Ikiwiki not supposed to support this us
 > currently merges pagespecs, though - maybe the patches I suggested for
 > [[separating_and_uniquifying_pagespecs|todo/should_optimise_pagespecs]]
 > would help? --[[smcv]]
+
+>> That, or something seems to have helped in the meantime...
+>> Actually, I think it was the [[transitive_dependencies]] support
+>> that did it, though smcv's pagespec stuff was also a crucial improvement.
+>> 
+>> Anyhoo:
+
+       joey@gnu:~/tmp>touch testcase/page2.mdwn 
+       joey@gnu:~/tmp>ikiwiki -v testcase html 
+       refreshing wiki..
+       scanning page2.mdwn
+       building page2.mdwn
+       building page1.mdwn, which depends on page2
+       building page0.mdwn, which depends on page1
+       done
+
+>> I happily think this is [[done]] --[[Joey]]
diff --git a/doc/bugs/pagemtime_in_refresh_mode.mdwn b/doc/bugs/pagemtime_in_refresh_mode.mdwn
new file mode 100644 (file)
index 0000000..f926ec8
--- /dev/null
@@ -0,0 +1,28 @@
+I'd like a way to always ask the RCS (Git) to update a file's mtime in
+refresh mode.  This is currently only done on the first build, and later
+for `--gettime --rebuild`.  But always rebuilding is too heavy-weight for
+this use-case.  My options are to either manually set the mtime before
+refreshing, or to have ikiwiki do it at command.  I used to do the
+former, but would now like the latter, as ikiwiki now generally does this
+timestamp handling.
+
+From a quick look, the code in `IkiWiki/Render.pm:find_new_files` is
+relevant: `if (! $pagemtime{$page}) { [...]`.
+
+How would you like to tackle this?
+
+--[[tschwinge]]
+
+> This could be done via a `needsbuild` hook. The hook is passed 
+> the list of changed files, and it should be safe to call `rcs_getmtime`
+> and update the `pagemtime` for each.
+> 
+> That lets the feature be done by a plugin, which seems good, since
+> `rcs_getmtime` varies between very slow and not very fast, depending on 
+> VCS.
+> 
+> AFAICS, the only use case for doing this is if you commit changes and
+> then delay pushing them to a DVCS repo. Since then the file mtime will
+> be when the change was pushed, not when it was committed. But I've
+> generally felt that recording when a change was published to the repo
+> of a wiki as its mtime is good enough. --[[Joey]] 
diff --git a/doc/bugs/pagespec:_tagged__40____41____44___globbing.mdwn b/doc/bugs/pagespec:_tagged__40____41____44___globbing.mdwn
new file mode 100644 (file)
index 0000000..f9cb374
--- /dev/null
@@ -0,0 +1,36 @@
+With the current HEAD (b10d353490197b576ef7bf2e8bf8016039efbd2d),
+globbing in `tagged()` pagespecs doesn't work for me.  For example,
+`tagged(*)` doesn't match any pages.  (It does in this wiki installation
+here, though.)
+
+I did not yet do any testing to figure out when this broke.
+
+--[[tschwinge]]
+
+[[!map pages="*/a* and tagged(*ose)"]]
+
+> Are you sure that `tagged()` ever matches pages there? Take globbing
+> out of the equasion.
+> 
+> This could be as simple as you having not rebuilt the wiki 
+> on upgrade to the version that tracks tagged links. --[[Joey]]
+
+>> Yes, it is a globbing issue:
+
+>>     \[[!map pages="tagged(open_i*ue_gdb)" show=title]]
+
+>> ... doesn't show anything.
+
+>>     \[[!map pages="tagged(open_issue_gdb)" show=title]]
+
+>> ... does show a map of eight pages.  Also, it's working fine on the
+>> autotags pages.
+
+>> --[[tschwinge]]
+
+>>> Only way I can reproduce something like this is if tagbase is not set.
+>>> I have fixed a bug there, see if it works for you?
+>>> --[[Joey]]
+
+>>>> This is now indeed [[fixed|done]] (thanks!) -- even though I already
+>>>> did have tagbase set.
diff --git a/doc/bugs/pagespec_error_on_refresh_but_not_rebuild.mdwn b/doc/bugs/pagespec_error_on_refresh_but_not_rebuild.mdwn
new file mode 100644 (file)
index 0000000..e895459
--- /dev/null
@@ -0,0 +1,32 @@
+I'm getting this error message when I refresh my wiki:
+
+    $ hg commit -u me -m "Minor corrections"
+    refreshing wiki..
+    scanning htmletc/moco-conf-rooms.mdwn
+    building htmletc/moco-conf-rooms.mdwn
+    Use of uninitialized value in concatenation (.) or string at /usr/local/lib/perl5/site_perl/5.8.9/Text/Typography.pm line 542.
+    building sidebar.mdwn, which depends on htmletc/moco-conf-rooms
+    building contact.mdwn, which depends on sidebar
+    building 500.mdwn, which depends on sidebar
+    Use of uninitialized value in concatenation (.) or string at /usr/local/lib/perl5/site_perl/5.8.9/Text/Typography.pm line 542.
+    building ceramics.mdwn, which depends on sidebar
+    building glossary.mdwn, which depends on sidebar
+    syntax error in pagespec "internal(glossary/comment_*)"
+    warning: post-commit hook exited with status 2
+
+But there is no error if I use `ikiwiki --rebuild` to regenerate the whole thing.
+
+> You neglect to say what version of ikiwiki this is,
+> or give any information to reproduce the bug.
+> 
+> My guess: A version older than 3.20100403, which  included
+> [this bugfix](http://git.ikiwiki.info/?p=ikiwiki;a=commitdiff;h=799b93d258bad917262ac160df74136f05d4a451),
+> which could lead to incorrect "syntax error in pagespec"
+> that only happened some of the time.
+> 
+> (The Text::Typography warning seems probably unrelated.)
+> --[[Joey]]
+
+>> I'm sorry, I don't know what I was thinking there.  It's ikiwiki 3.20100212, and manually applying the patch you linked to made the bug go away.  (Upgrading ikiwiki is a pain on nearlyfreespeech, especially if you don't want to keep the build directory around -- please consider making ikiwiki runnable directly from a git clone.)
+
+[[!meta link="done"]]
index be14e5126eae8d2d67168741222b6c525bddd5c4..c6e3cd4fd3326c09c08e629ab795318e7cb1a67f 100644 (file)
@@ -144,7 +144,7 @@ So, looking at your meta branch: --[[Joey]]
   has no title, then A will display the link as "B". Now page B is modified
   and a title is added. Nothing updates "A".
   The added overhead of rebuilding every page that links to B when B is
-  changed (as the `postscan` hook of the po plugin does) is IMHO a killer.
+  changed (as the `indexhtml` hook of the po plugin does) is IMHO a killer.
   That could be hundreds or thousands of pages, making interactive editing
   way slow. This is probably the main reason I had not attempted this whole
   thing myself. IMHO this calls for some kind of intellegent dependency
diff --git a/doc/bugs/plugins__47__relativedate_depends_on_locale_at_setup_file.mdwn b/doc/bugs/plugins__47__relativedate_depends_on_locale_at_setup_file.mdwn
new file mode 100644 (file)
index 0000000..a9a39ac
--- /dev/null
@@ -0,0 +1,16 @@
+[[plugins/relativedate]] does not works when russian locale defined at setup file (locale => 'ru_RU.UTF-8'). This is happen because javascript for this plugin takes either elements title or content itself. If russian locale is turned on then title generated on russian language and JS can't convert it into Date object. innerHTML is language independent (YYYY-MM-DD HH:mm) always.
+
+If I switch locale to en_US.UTF-8 then this plugin correctly parses text date and print relative date. But when I mouseover on date I see unusual formating of the date (it uses AM/PM format while russians use 24-h notation).
+
+P.S. All pages but RecentChanges show well-formated date. RecentChanges show date formated using locale. Anyway, plugin does not work without en_US locale.
+
+> [[Fixed|done]]. Now it uses C locale for the date put in the title,
+> that is used by relativedate. The mouseover will display the date in your
+> native locale. 
+> 
+> Only exception is that when javascript is disabled... then
+> relativedate can't work, so instead you will see your localized date
+> displayed; but on mouseover you will get shown the C locale date.
+> --[[Joey]] 
+
+>> Thanks. 
diff --git a/doc/bugs/post-update_hook_can__39__t_be_compiled_with_tcc.mdwn b/doc/bugs/post-update_hook_can__39__t_be_compiled_with_tcc.mdwn
new file mode 100644 (file)
index 0000000..a8fb198
--- /dev/null
@@ -0,0 +1,19 @@
+Thinking that any c compiler would do the job, I tried to use tcc with ikiwiki, as explicitely allowed by the Debian package dependencies.
+
+I installed `tcc` and `libc6-dev` (for `libcrt1`). The wrapper compilation was OK, but the wrapper fails to run correctly and dies with
+
+    usage: ikiwiki [options] source dest
+       ikiwiki --setup configfile
+
+Everything works fine with gcc.
+
+versions: Debian lenny + backports
+
+> Seems that tcc does not respect changing where `environ` points as a way
+> to change the environment seen after `exec`
+> 
+> Given that the man page for `clearenv` suggests using `environ=NULL`
+> if `clearenv` is not available, I would be lerry or using tcc to compile
+> stuff, since that could easily lead to a security compromise of code that
+> expects that to work. However, I have fixed ikiwiki to use `clearenv`.
+> --[[Joey]] [[done]]
diff --git a/doc/bugs/preview_pagestate.mdwn b/doc/bugs/preview_pagestate.mdwn
new file mode 100644 (file)
index 0000000..7f7ec09
--- /dev/null
@@ -0,0 +1,13 @@
+If a change to a page is previewed, but not saved, `%pagestate` and
+`%wikistate` can be changed, and saved. Actually, it's not limited to
+those. Seems that spurious dependencies can be added, though existing
+dependencies will at least not be removed.
+
+It calls saveindex to record state about files created on disk for the
+preview. Those files will expire later. However, saveindex also
+saves other state changes.
+
+Seems like it needs to isolate all state changes when previewing... ugh.
+--[[Joey]] 
+
+[[done]]
diff --git a/doc/bugs/rebuild_after_changing_the_underlaydir_config_option.mdwn b/doc/bugs/rebuild_after_changing_the_underlaydir_config_option.mdwn
new file mode 100644 (file)
index 0000000..8613ef0
--- /dev/null
@@ -0,0 +1,12 @@
+It seems that rebuild a wiki (`ikiwiki --rebuild`) after changing the `underlaydir` config option doesn't remove the pages coming from the previous underlaydir. 
+
+I've noticed this with the debian package version 3.20100102.3~bpo50+1.
+
+Perhaps it is possible to improve this or mention it in the manual page?
+
+--prosper
+
+> --rebuild causes ikiwiki to throw away all its info about what it built
+> before, so it will never clean up pages that have been removed, by any
+> means. Suggest you do a --refresh, possibly followed by a --rebuild
+> if that is really necessary. --[[Joey]]
index b4e2a1501f57e121bf03eb876caf772d90819353..ab08c0b26c10781e8bbec407c21ec58b962bbf5d 100644 (file)
@@ -18,3 +18,5 @@ Thanks
 > rewriting the ikiwiki code to use it, *and* packaging that alternative
 > and maintaining it in Debian. So your suggestion doesn't make a lot of
 > sense; Debian should just find a maintainer for sparkline-php. --[[Joey]]
+
+[[done]]
diff --git a/doc/bugs/removing_pages_with_utf8_characters.mdwn b/doc/bugs/removing_pages_with_utf8_characters.mdwn
new file mode 100644 (file)
index 0000000..0d96aa7
--- /dev/null
@@ -0,0 +1,51 @@
+I have a page with the name "umläute". When I try to remove it, ikiwiki says:
+
+Error: ?umläute does not exist 
+
+> I'm curious about the '?' in the "?umläute" message. Suggests that the
+> filename starts with another strange character. Can I get a copy of a
+> git repository or tarball containing this file? --[[Joey]] 
+
+I wrote the following patch, which seems to work on my machine. I'm running on FreeBSD 6.3-RELEASE with ikiwiki-3.20100102.3 and perl-5.8.9_3.
+
+    --- remove.pm.orig      2009-12-14 23:26:20.000000000 +0100
+    +++ remove.pm   2010-01-18 17:49:39.000000000 +0100
+    @@ -193,6 +193,7 @@
+                            # and that the user is allowed to edit(/remove) it.
+                            my @files;
+                            foreach my $page (@pages) {
+    +                               $page = Encode::decode_utf8($page);
+                                    check_canremove($page, $q, $session);
+     
+                                    # This untaint is safe because of the
+
+
+> The problem with this patch is that, in a recent fix to the same
+> plugin, I made `@pages` come from `$form->field("page")`, and
+> that, in turn is already run through `decode_form_utf8` just above the
+> code you patched. So I need to understand why that is apparently not
+> working for you. (It works fine for me, even when deleting a file named 
+> "umläute" --[[Joey]] 
+
+----
+
+> Update, having looked at the file in the src of the wiki that
+> is causing trouble for remove, it is: `uml\303\203\302\244ute.mdwn`  
+> And that is not utf-8 encoded, which, represented the same
+> would be: `uml\303\244ute.mdwn`
+> 
+> I think it's doubly-utf-8 encoded, which perhaps explains why the above
+> patch works around the problem (since the page name gets doubly-decoded
+> with it). The patch doesn't fix related problems when using remove, etc.
+> 
+> Apparently, on apoca's system, perl encodes filenames differently
+> depending on locale settings. On mine, it does not. Ie, this perl
+> program always creates a file named `uml\303\244ute`, no matter
+> whether I run it with LANG="" or LANG="en_US.UTF-8":
+> 
+>      perl -e 'use IkiWiki; writefile("umläute", "./", "baz")'
+> 
+> Remains to be seen if this is due to the older version of perl used
+> there, or perhaps FreeBSD itself. --[[Joey]] 
+> 
+> Update: Perl 5.10 fixed the problem. --[[Joey]] 
diff --git a/doc/bugs/some_but_not_all_meta_fields_are_stored_escaped.mdwn b/doc/bugs/some_but_not_all_meta_fields_are_stored_escaped.mdwn
new file mode 100644 (file)
index 0000000..587771b
--- /dev/null
@@ -0,0 +1,44 @@
+[[!template id=gitbranch branch=smcv/unescaped-meta author="[[Simon_McVittie|smcv]]"]]
+[[!tag patch]]
+(Warning: this branch has not been tested thoroughly.)
+
+While discussing the [[plugins/meta]] plugin on IRC, Joey pointed out that
+it stores most meta fields unescaped, but 'title', 'guid' and 'description'
+are special-cased and stored escaped (with numeric XML/HTML entities). This
+is to avoid emitting markup in the `<title>` of a HTML page, or in an RSS/Atom
+feed, neither of which are subject to the [[plugins/htmlscrubber]].
+
+However, having the meta fields "partially escaped" like this is somewhat
+error-prone. Joey suggested that perhaps everything should be stored
+unescaped, and the escaping should be done on output; this branch
+implements that.
+
+Points of extra subtlety:
+
+* The title given to the [[plugins/search]] plugin was previously HTML;
+  now it's plain text, potentially containing markup characters. I suspect
+  that that's what Xapian wants anyway (which is why I didn't change it),
+  but I could be wrong...
+
+  > AFAICS, this if anything, fixes a bug, xapian definitely expects
+  > unescaped text here. --[[Joey]] 
+
+* Page descriptions in the HTML `<head>` were previously double-escaped:
+  the description was stored escaped with numeric entities, then that was
+  output with a second layer of escaping! In this branch, I just emit
+  the page description escaped once, as was presumably the intention.
+
+* It's safe to apply this change to a wiki and neglect to rebuild it
+  (assuming I implemented it correctly!), but until the wiki is rebuilt,
+  titles, descriptions and GUIDs for unchanged pages will appear
+  double-escaped on any page that inlines them in `quick=yes` mode, and
+  is rebuilt for some other reason. The failure mode is too much escaping
+  rather than too little, so it shouldn't be a security problem.
+
+* Reverting this change, if applied, is more dangerous; until the wiki is
+  rebuilt, any titles, descriptions and GUIDs on unchanged pages that
+  contained markup could appear unescaped on any page that inlines them
+  in `quick=yes` mode, and is rebuilt for some other reason. The failure
+  mode here would be too little escaping, i.e. cross-site scripting.
+
+[[!tag done]]
index 6e508ffda97ab28f7bf45b6c320fff0c0f3a1fe2..99d6fe09f36640ee0135401d50a65999a43cc089 100644 (file)
@@ -13,3 +13,5 @@ I believe that this snippet in `IkiWiki.pm` might be the reason for the imbalanc
         }
 
 The fact that HTML in a `\[[!meta title]]` is added but then escaped might indicate that some other bug is involved.
+
+> [[done]] --[[Joey]] 
diff --git a/doc/bugs/svn_commit_failures_interpreted_as_merge_conflicts.mdwn b/doc/bugs/svn_commit_failures_interpreted_as_merge_conflicts.mdwn
new file mode 100644 (file)
index 0000000..0c9bce4
--- /dev/null
@@ -0,0 +1,21 @@
+I'm attempting a merge with the SVN plugin via the web interface
+with ikiwiki-3.20100403 and subversion 1.6.11.
+
+The web interface says
+
+    Your changes conflict with other changes made to the page.
+    
+    Conflict markers have been inserted into the page content. Reconcile the conflict and commit again to save your changes.
+
+However there are no merge conflict markers in the page. My apache error log says:
+
+    [Fri Apr 30 16:43:57 2010] [error] [client 10.64.64.42] svn: Commit failed (details follow):, referer: https://unixwiki.ncl.ac.uk/ikiwiki.cgi
+    [Fri Apr 30 16:43:57 2010] [error] [client 10.64.64.42] svn: Authorization failed, referer: https://unixwiki.ncl.ac.uk/ikiwiki.cgi
+
+-- [[Jon]]
+
+> Only way for this to be improved would be for the svn plugin to
+> explicitly check the file for conflict markers. I guess it could
+> change the error message then, but the actual behavior of putting the
+> changed file back in the editor so the user can recommit is about right
+> as far as error recovery goes. --[[Joey]] 
diff --git a/doc/bugs/tag_plugin:_autotag_vs._staged_changes.mdwn b/doc/bugs/tag_plugin:_autotag_vs._staged_changes.mdwn
new file mode 100644 (file)
index 0000000..e5526be
--- /dev/null
@@ -0,0 +1,17 @@
+The autotag functionality of the tag plugin committed (when doing its
+first commit) all changes that have been staged (in Git).  I suggest it
+should be restricted to the specific file only.  --[[tschwinge]]
+
+> This is not specific to the tag plugin. Same can happen
+> if you rename a file, or post a comment, or remove a file
+> via web interface. All of these use `rcs_commit_staged`.
+> 
+> This is why ikiwiki is supposed to have a checkout of 
+> the repository that it uses for its own purposes, and nobody else
+> should mess with. There are various notes about that being needed here
+> and there; you're free to not give ikiwiki its own repo, but you have to
+> be aware that it can fight with you if you're making changes to the same
+> repo. [[done]] --[[Joey]] 
+
+>> Ack, that is reasonable.  (And it's only been a very minor problem
+>> during manual testing.)  --[[tschwinge]]
index e7e4af7c3267b155b0b45141968746d08b5aa79a..a211654f14337f4a4fb96002325cf66da2961b1f 100644 (file)
@@ -28,6 +28,8 @@ rationale on this, or what am I doing wrong, and how to achieve what I want?
 >> is valid. [[todo/matching_different_kinds_of_links]] is probably
 >> how it will eventually be solved. --[[Joey]] 
 
+>>> [[Done]]: `tagged` no longer matches other wikilinks. --[[smcv]]
+
 > And this is an illustration why a clean work-around (without changing the software) is not possible: while thinking about [[todo/matching_different_kinds_of_links]], I thought one could work around the problem by simply explicitly including the kind of the relation into the link target (like the tagbase in tags), and by having a separate page without the "tagbase" to link to when one wants simply to refer to the tag without tagging. But this won't work: one has to at least once refer to the real tag page if one wants to talk about it, and this reference will count as tagging (unwanted). --Ivan Z.
 
 > But well, perhaps there is a workaround without introducing different kinds of links. One could modify the [[tag plugin|plugins/tag]] so that it adds 2 links to a page: for tagging -- `tagbase/TAG`, and for navigation -- `tagdescription/TAG` (displayed at the bottom). Then the `tagdescription/TAG` page would hold whatever list one wishes (with `tagged(TAG)` in the pagespec), and whenever one wants to merely refer to the tag, one should link to `tagdescription/TAG`--this link won't count as tagging. So, `tagbase/TAG` would become completely auxiliary (internal) link targets for ikiwiki, the users would edit or link to only `tagdescription/TAG`. --Ivan Z.
diff --git a/doc/bugs/templateForRecentChangesMissingCloseSpan.mdwn b/doc/bugs/templateForRecentChangesMissingCloseSpan.mdwn
new file mode 100644 (file)
index 0000000..5c32299
--- /dev/null
@@ -0,0 +1,26 @@
+In the template for ikiwiki's recent changes page
+
+     /usr/share/ikiwiki/templates/change.tmpl
+
+there is a missing </span> tag after the
+
+     <span class="changedate"><TMPL_VAR COMMITDATE>
+
+This results in the recentchanges/ page being invalid and rendering quite horrifyingly in Internet Exploder.
+
+[I'm running](http://wiki.shlrm.org) (linked so you can see the one I'm running if you need to) the latest version of ikiwiki, and I note that it's broken on [ikiwiki.info](http://validator.w3.org/check?uri=http%3A%2F%2Fikiwiki.info%2Frecentchanges%2F&charset=%28detect+automatically%29&doctype=Inline&group=0&user-agent=W3C_Validator%2F1.767) too :)
+
+[This one on debian](https://www.icanttype.org/recentchanges/) is somehow [valid](http://validator.w3.org/check?uri=https%3A%2F%2Fwww.icanttype.org%2F%2Frecentchanges%2F&charset=%28detect+automatically%29&doctype=Inline&group=0&user-agent=W3C_Validator%2F1.767), although it's using the same template. Perhaps there's an additional scrubbing going on his end.
+
+Thanks,
+David
+
+PS: I have fixed the template by hand on my server, so it will validate, however ikiwiki.info will not.
+
+> [[!template id="gitbranch" branch=smcv/trivia author="[[smcv]]"]] [[!tag patch]]
+> Enabling either [[plugins/htmltidy]] or [[plugins/htmlbalance]] will automatically fix unbalanced
+> markup like this; using [[plugins/comments]] without having one or other of those is a bad idea
+> from the point of view of avoiding comment forgery, which is probably why icanttype.org works
+> correctly. Anyway, I've fixed this in a branch: Joey, care to review smcv/trivia? --[[smcv]]
+
+[[done]], thanks guys --[[Joey]]
index 9985c13a0228b8ff82bb9dee2aa0e0db98d5e160..70266c49c8c7c58688f5c5650e1f7286f4d22a01 100644 (file)
@@ -12,3 +12,5 @@ Followed by the "login" button underneath. It's not obvious to anyone unfamiliar
 > it visually distinct from the rest of the form. I'm sure the styling
 > could be improved, but the current form does not seem too non-obvious
 > to me, or to naive users in the field. --[[Joey]]
+
+>> [[done]], better fixed by new fancy openid login form. --[[Joey]] 
index c827c6dd85b8b8d4cf7ffec25849d80df4000393..4ee30e39d9cac966e319b8619c127cda4d9e3aaf 100644 (file)
@@ -1,4 +1,13 @@
 If a file in the srcdir is removed, exposing a file in the underlaydir,
-ikiwiki will notice the removal and delete the page from the destdir. The
+ikiwiki will not notice the removal, and the
 page from the underlay will not be built. (However, it will be if the wiki
 gets rebuilt.)
+
+> This problem is caused by ikiwiki storing only filenames relative to
+> the srcdir or underlay, and mtime comparison not handling this case.
+
+> A related problem occurs if changing a site's theme with the
+> [[plugins/theme]] plugin. The style.css of the old and new theme
+> often has the same mtime, so ikiwiki does not update it w/o a rebuild.
+> This is worked around in theme.pm with a special-purpose needsbuild hook.
+> --[[Joey]]
index efa2c9ffe9f33e346ce09e25609cdf29e7f89316..debedb01c4773354e2ab652906ffdc6b592040cd 100644 (file)
@@ -1,9 +1,11 @@
-[[!tag patch]]
+[[!tag patch bugs]]
 
 I type chinese characters into the fields. After press "save setup" button the characters turn into gibberish.
 
 I submit a patch that solve the problem for me.  --Lingo
 
+> Fully fixing it is slightly more complex, but now [[done]] --[[Joey]] 
+
 ----
 
     --- websetup.pm    2009-12-02 05:07:46.000000000 +0800
diff --git a/doc/bugs/wrapper_can__39__t_find_the_perl_modules.mdwn b/doc/bugs/wrapper_can__39__t_find_the_perl_modules.mdwn
new file mode 100644 (file)
index 0000000..9804d86
--- /dev/null
@@ -0,0 +1,16 @@
+If i intsall perl modules in my custom directory, cgi wrapper can't find them. I found clearing enviroment variables in code  of wrapper. But information about custom directories put to perl with PERL5LIB variable.
+
+Workaround: add newenviron variable PERL5LIB
+
+My additional question - what wrapper do? I'am russian hosting provider. I am interesting with ikiwiki.
+
+> The wrapper allows ikiwiki to run as the user who owns the wiki, which
+> is generally not the same as the user that runs the web server.
+> (It also handles some other things, like some locking.)
+> 
+> As a suid program, the wrapper cannot safely let environment variables
+> pass through.
+> 
+> If you want to install ikiwiki's perl modules in a nonstandard location,
+> you can set `INSTALL_BASE` when running `Makefile.PL`. ikiwiki will then
+> be built to look in that location. --[[Joey]]  [[!tag done]]
index 29a3355965d5cc9762e5752dcbb104351f5578ba..35db57b0c05a6e12bc439308a4016ad1e54af910 100644 (file)
@@ -9,6 +9,9 @@ defining brand new rendering rules.
 While ikiwiki's default use of stylesheets is intentionally quite plain and
 minimalistic, CSS allows creating any kind of look you can dream up.
 
+The [[theme_plugin|plugins/theme]] provides some prepackaged themes in an
+easy to use way.
+
 The [[css_market]] page is an attempt to collect user contributed local.css
 files.
 
index a0943547c9d8f68681dea0577ac44cd07c09a6b4..0e5a687406eb15ba4f855e3577d260da59e9393d 100644 (file)
@@ -5,7 +5,8 @@ these style sheets can be installed by copying them into your wiki's source
 dir with a filename of `local.css`.
 
 Feel free to add your own stylesheets here. (Upload as wiki pages; wiki
-gnomes will convert them to css files..)
+gnomes will convert them to css files..) Selected ones from here are
+included in the [[theme_plugin|plugins/theme]].
 
 * **[[css_market/zack.css]]**, contributed by [[StefanoZacchiroli]],
   customized mostly for *blogging purposes*, can be seen in action on 
index 45d0d78707a675bdd807d52879ab793ca21acf5e..92c8a4f759810ee7f5a02b41900f9f884947a28b 100644 (file)
@@ -35,7 +35,7 @@ own RPM.
 
 ## BSD ports
 
-IkiWiki can be installed [from macports](http://www.macports.org/ports.php?by=name&substr=ikiwiki)
+Ikiwiki can be installed [from macports](http://www.macports.org/ports.php?by=name&substr=ikiwiki)
 by running `sudo port install ikiwiki`.
 
 NetBSD and many other platforms: pkgsrc has an [ikiwiki package](ftp://ftp.netbsd.org/pub/pkgsrc/current/pkgsrc/www/ikiwiki/README.html).
index f542cad0cc7f0eda437975610f804d284f552a43..b25601227b41ae39e51728d8e7747ee03e27db98 100644 (file)
@@ -5,24 +5,21 @@ Or, run this command to set up a blog with ikiwiki.
 
        % ikiwiki -setup /etc/ikiwiki/auto-blog.setup
 
-Some additional configuration you might want to do:
+Some additional configuration you might want to do, if not using
+`auto-blog.setup`:
 
 * Make sure to configure ikiwiki to generate RSS or Atom feeds.
 
-* Make sure you have the tag plugin enabled, and tag posts using it. An
-  example of how to tag a post is:
-       \[[!tag tags/life]]
-
-* Enable the [[sidebar|plugins/sidebar]] plugin to get a sidebar listing all
-  the categories you've tagged posts with.
+* Make sure you have the tag plugin enabled, and the `tagbase` set to
+  "tags". Tag pages will then automatically be created.
+  An example of how to tag a post is:
+       \[[!tag life]]
 
 * 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',
+* Enable the [[comments|plugins/comments]] plugin to
+  enable comments to posts to the blog.
 
 * Enable the [[calendar|plugins/calendar]] plugin and run the
   [[ikiwiki-calendar]] command from cron daily to get an interlinked
diff --git a/doc/examples/blog/archives.mdwn b/doc/examples/blog/archives.mdwn
new file mode 100644 (file)
index 0000000..d07b73b
--- /dev/null
@@ -0,0 +1,8 @@
+[[!if test="archives/*" then="""
+Browse through blog archives by year:
+[[!map pages="./archives/* and !./archives/*/* and !*/Discussion"]]
+"""
+else="""
+You need to use the `ikiwiki-calendar` program to generate calendar-based
+archive pages.
+"""]]
index 4735dea08f8c87813a56a340f3c0bb55d8b09ff6..f59b44390adbd497cd08583d8d1207570ade74c3 100644 (file)
@@ -1,3 +1,9 @@
-This page will show all comments made to posts in my [[blog|index]].
+[[!sidebar content="""
+[[!inline pages="comment_pending(./posts/*)" feedfile=pendingmoderation
+description="comments pending moderation" show=-1]]
+Comments in the moderation queue:
+[[!pagecount pages="comment_pending(./posts/*)"]]
+"""]]
 
-[[!inline pages="./posts/*/Discussion or internal(./posts/*/comment_*)"]]
+Recent comments on posts in the [[blog|index]]:
+[[!inline pages="./posts/*/Discussion or comment(./posts/*)"]]
index 01b714fcdfbcd6744a962bbe9f5bdf24f8dd021e..7914cd203a43eb6b48665a2d225327c5ade01d2c 100644 (file)
@@ -1,13 +1,11 @@
-[[!pagestats pages="./tags/*" among="./posts/*"]]
+[[!if test="enabled(sidebar)" then="""
+[[!sidebar]]
+""" else="""
+[[!inline pages=sidebar raw=yes]]
+"""]]
 
-Welcome to my blog.
-
-Have a look at the most recent posts below, or browse the tag cloud on the
-right. Archives of all [[posts]] and all [[comments]] are also available.
-
-[[!inline pages="./posts/* and !*/Discussion" show="10"
+[[!inline pages="page(./posts/*) and !*/Discussion" show="10"
 actions=yes rootpage="posts"]]
 
-----
 
 This blog is powered by [ikiwiki](http://ikiwiki.info).
index 4b2939120ef75b2b3a505d6290109d102de9c008..08e014838008bc1c31adb7ccbc2cc69980ec390b 100644 (file)
@@ -1,3 +1,3 @@
-Here is a full list of posts to my [[blog|index]].
+Here is a full list of posts to the [[blog|index]].
 
-[[!inline pages="./posts/* and !*/Discussion" archive=yes feedshow=10 quick=yes]]
+[[!inline pages="page(./posts/*) and !*/Discussion" archive=yes feedshow=10 quick=yes]]
index d4943234109a3cef652c1303dd118772d54b0434..343497d1834f209bb0afc1bb68943fe01a3a0bdd 100644 (file)
@@ -1,4 +1,2 @@
 This is the first post to this example blog. To add new posts, just add
 files to the posts/ subdirectory, or use the web form.
-
-[[!tag tags/tech]]
index a9fac388ea953f6f973dedde8e247e31c441721c..e0895f63f3781f6b2588edb3b66acea984b5f3f2 100644 (file)
@@ -1,7 +1,10 @@
-Example sidebar
+[[!if test="enabled(calendar)" then="""
+[[!calendar pages="page(./posts/*) and !*/Discussion"]]
+"""]]
 
-* [[Blog|index]]
-* [[Archive|posts]]
+[[Recent Comments|comments]]
 
-Categories:
-[[!map pages="./tags/* and !*/Discussion"]]
+[[Archives]]
+
+[[Tags]]:
+[[!pagestats style="list" pages="./tags/*" among="./posts/*"]]
diff --git a/doc/examples/blog/tags/life.mdwn b/doc/examples/blog/tags/life.mdwn
deleted file mode 100644 (file)
index 719f2b1..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-This feed contains pages in the "life" category.
-
-[[!inline pages="link(tags/life) and !*/Discussion"
-show="10" actions=yes]]
diff --git a/doc/examples/blog/tags/tech.mdwn b/doc/examples/blog/tags/tech.mdwn
deleted file mode 100644 (file)
index e811cac..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-This feed contains pages in the "tech" category.
-
-[[!inline pages="link(tags/tech) and !*/Discussion" show=10 actions=yes]]
index e43a9d1165dd987c33d21af222b97bcef8d995bc..99f791177e6ccddb8cb03a86a8dd9370c875ebaf 100644 (file)
@@ -14,3 +14,6 @@ Some additional configuration you might want to do:
 
 * Read the [[tips/integrated_issue_tracking_with_ikiwiki]] article for tips
   about how to use ikiwiki as a BTS.
+
+* Read [[tips/spam_and_softwaresites]] for information on how to keep spam
+  and spam-fighting commits out of your main version control history.
index 9b53c7d99c186b288441e7863d4588afd3facf27..20efba6e00ba8711c02775528c24237c6446b094 100644 (file)
@@ -1,4 +1,4 @@
-This is where annoucements of new releases, features, and other news is
+This is where announcements of new releases, features, and other news is
 posted. FooBar users are recommended to subscribe to this page's RSS
 feed.
 
index 3925d78ef41089dd3cc5dc1c93f957adff6bc340..1f81687036187bba170aea03a7b8c1b921ad589a 100644 (file)
@@ -13,7 +13,7 @@ Instead of editing pages in a stupid web form, you can use vim and commit
 changes via [[Subversion|rcs/svn]], [[rcs/git]], or any of a number of other
 [[Revision_Control_Systems|rcs]].
 
-ikiwiki can be run from a [[post-commit]] hook to update your wiki
+Ikiwiki can be run from a [[post-commit]] hook to update your wiki
 immediately whenever you commit a change using the RCS.
 
 It's even possible to securely let
@@ -25,7 +25,7 @@ run a simple wiki without page history, it can do that too.
 
 ## A wiki compiler
 
-ikiwiki is a wiki compiler; it builds a static website for your wiki, and
+Ikiwiki is a wiki compiler; it builds a static website for your wiki, and
 updates it as pages are edited. It is fast and smart about updating a wiki,
 it only builds pages that have changed (and tracks things like creation of
 new pages and links that can indirectly cause a page to need a rebuild)
@@ -45,7 +45,7 @@ easily be added by [[plugins]]. For example it also supports traditional
 [[plugins/HTML]], or pages written in [[reStructuredText|plugins/rst]]
 or [[Textile|plugins/textile]].
 
-ikiwiki also supports files of any other type, including plain text,
+Ikiwiki also supports files of any other type, including plain text,
 images, etc. These are not converted to wiki pages, they are just copied
 unchanged by ikiwiki as it builds your wiki. So you can check in an image,
 program, or other special file and link to it from your wiki pages.
@@ -70,9 +70,11 @@ you would care to syndicate.
 
 ## Valid html and [[css]]
 
-ikiwiki aims to produce 
-[valid XHTML 1.0](http://validator.w3.org/check?url=referer). ikiwiki
-generates html using [[templates|wikitemplates]], and uses [[css]], so you
+Ikiwiki aims to produce 
+[valid XHTML 1.0](http://validator.w3.org/check?url=referer).
+(Experimental [[tips/HTML5]] support is also available.)
+
+Ikiwiki generates html using [[templates]], and uses [[css]], so you
 can change the look and layout of all pages in any way you would like.
 
 ## [[Plugins]]
@@ -163,7 +165,7 @@ Well, sorta. Rather than implementing YA history browser, it can link to
 
 ### Full text search
 
-ikiwiki can use the xapian search engine to add powerful
+Ikiwiki can use the xapian search engine to add powerful
 full text [[plugins/search]] capabilities to your wiki.
 
 ### Translation via po files
index 7599e71e5c10ce60a6e3bd8032cb2c69bb95882d..17c60c4239b798f9d6f88483617588446b5e7e34 100644 (file)
@@ -62,7 +62,7 @@ index 0bf100a..77b467a 100644
 
 >>>> So you can see if the two usernames/openids match. If the end is "0",
 >>>> they don't match. If nothing is logged, you have not enabled the websetup plugin.
->>>> If the end if "1" you should see the "Wiki Setup" button, if not the
+>>>> If the end if "1" you should see the "Setup" button, if not the
 >>>> problem is not in determining if you're an admin, but elsewhere..
 >>>> --[[Joey]]
 
diff --git a/doc/forum/Error:_bad_page_name.mdwn b/doc/forum/Error:_bad_page_name.mdwn
new file mode 100644 (file)
index 0000000..70277a1
--- /dev/null
@@ -0,0 +1,46 @@
+I'm trying to use ikiwiki for the first time. In the start, I had problems
+with installing the package, because I don't have a root account on my
+server.
+
+When I solved this, I finally set up my wiki, but whenever I try to edit a
+page, I get an error: “Error: bad page name”.
+
+What am I doing wrong? The wiki is at
+<http://atrey.karlin.mff.cuni.cz/~onderka/wiki/>, the setupfile I used at
+<http://atrey.karlin.mff.cuni.cz/~onderka/wiki/ikiwiki.setup>.
+
+> This means that one of the checks that ikiwiki uses to prevent
+> editing files with strange or insecure names has fired incorrectly.
+> Your setup file seems fine.
+> We can figure out what is going wrong through a series of tests:
+> 
+> * Test if your perl has a problem with matching alphanumerics:
+>   `perl -le 'print int "index"=~/^([-[:alnum:]+\/.:_]+)$/'`
+> * Check if something is breaking pruning of disallowed files:
+>   `perl -le 'use IkiWiki; %config=IkiWiki::defaultconfig(); print ! IkiWiki::file_pruned("index")'`
+> --[[Joey]] 
+
+>>Both seem to run fine:
+
+    onderka@atrey:~$ perl -le 'print int "index"=~/^([-[:alnum:]+\/.:_]+)$/'
+    1
+    onderka@atrey:~$ perl -le 'use IkiWiki; %config=IkiWiki::defaultconfig(); print ! IkiWiki::file_pruned("index")'
+    1
+
+>>> Try installing this [instrumented
+>>> version](http://kitenet.net/~joey/tmp/editpage.pm) of
+>>> `IkiWiki/Plugin/editpage.pm`, which will add some debugging info
+>>> to the error message. --[[Joey]] 
+
+>>>>When I tried to `make` ikiwiki with this file, I got the error
+
+    ../IkiWiki/Plugin/editpage.pm:101: invalid variable interpolation at "$"
+
+>>>>> Sorry about that, I've corrected the above file. --[[Joey]] 
+
+>>>>>> Hmm, funny. Now that I reinstalled it with your changed file, it started working. I didn't remember how exactly did I install it the last time, so this time, it seems I did it correctly. Thank you very much for your help.
+
+>>>>>>> Well, this makes me suspect you installed an older version of
+>>>>>>> ikiwiki and my file, which is from the latest version, included a
+>>>>>>> fix for whatever bug you were seeing. If I were you, I'd ensure
+>>>>>>> that I have a current version of ikiwiki installed. --[[Joey]] 
index 6ce576db118cb1153c43cce898e3ec524aeb8b02..6b7739fd005abd7443264a86162d133667864d71 100644 (file)
@@ -20,15 +20,17 @@ Do I have it right?
 > Some VCS, like git, set the file mtimes to the current time
 > when making a new checkout, so they will be lost if you do that.
 > The creation times can be retrived using the `--getctime` option.
-> I suppose it might be nice if there were a `--getmtime` that pulled
-> true modification times out of the VCS, but I haven't found it a big
-> deal in practice for the last modification times to be updated to the
-> current time when rebuilding a wiki like this. --[[Joey]] 
+> --[[Joey]] 
 >
 > > Thanks for the clarification. I ran some tests of my own to make sure I understand it right, and I'm satisfied
 > > that the order of posts in my blog can be retrieved from the VCS using the `--getctime` option, at least if I
 > > choose to order my posts by creation time rather than modification time. But I now know that I can't rely on
 > > page modification times in ikiwiki as these can be lost permanently.
+> 
+> > > Update: It's now renamed to `--gettime`, and pulls both the creation
+> > > and modification times. Also, per [[todo/auto_getctime_on_fresh_build]],
+> > > this is now done automatically the first time ikiwiki builds a
+> > > srcdir. So, no need to worry about this any more! --[[Joey]] 
 > >
 > > I would suggest that there should at least be a `--getmtime` option like you describe, and perhaps that 
 > > `--getctime` and `--getmtime` be _on by default_. In my opinion the creation times and modification times of 
@@ -91,19 +93,6 @@ Do I have it right?
 > A quick workaround for me to get modification times right is the following
 > little zsh script, which unfortunately only works for git:
 
-    #!/usr/bin/env zsh
-    
-    set +x
-    
-    for FILE in **/*(.); do
-      TIMES="`git log --pretty=format:%ai $FILE`"
-      MTIME="`echo $TIMES | head -n1`"
-    
-      if [ ! -z $MTIME ]; then
-        echo  touch -m -d "$MTIME" $FILE
-        touch -m -d "$MTIME" $FILE
-      fi
-    
-    done
+>> Elided; no longer needed since --gettime does that, and much faster! --[[Joey]] 
 
 > --[[David_Riebenbauer]]
index fe67e6abacead20d42b1876ea534fee24d25b3f3..d7a33b526a24f1afa13c8e563e362e782b69dfe1 100644 (file)
@@ -20,10 +20,6 @@ How do I set up an ikiwiki system using a pre-existing repository (instead of cr
 >    recreate the ikiwiki srcdir
 > 3. `git clone` from the bare git repository a second time,
 >    to create a checkout you can manually edit (optional)
-> 4. run `ikiwiki --getctime --setup your.setup`
->    The getctime will ensure page creation times are accurate
->    by putting the info out of the git history,
->    and only needs to be done once.
 >
 > If you preserved your repository, but not the setup file,
 > the easiest way to make one is probably to run
diff --git a/doc/forum/PERL5LIB__44___wrappers_and_homedir_install.mdwn b/doc/forum/PERL5LIB__44___wrappers_and_homedir_install.mdwn
new file mode 100644 (file)
index 0000000..fba941e
--- /dev/null
@@ -0,0 +1,38 @@
+What is the way to tell wrappers that PERL5LIB should include ~/bin directories?
+
+Having this in the wiki.setup doesn't help anymore:
+
+        # environment variables
+        ENV => {
+          PATH => '/home/user/bin/bin:/usr/local/bin:/usr/bin:/bin:/usr/games:/home/user/ikiwiki/usr/bin/:/home/user/ikiwiki/usr/sbin/:/home/user/bin/bin/:~/bin/bin/',
+          PERL5LIB => '/home/user/bin/share/perl/5.10.0:/home/user/bin/lib/perl/5.10.0'
+        },
+
+Or at least I get CGI errors and running ikiwiki.cgi manually fails too:
+
+        Use of uninitialized value $tainted in pattern match (m//) at /usr/share/perl5/IkiWiki.pm line 233.
+        Argument "" isn't numeric in umask at /usr/share/perl5/IkiWiki.pm line 139.
+        Undefined subroutine &IkiWiki::cgierror called at /home/user/bin/bin/ikiwiki line 199.
+
+Server has an older ikiwiki installed but I'd like to use a newer version from git, and I don't have root access.
+
+> You can't set `PERL5LIB` in `ENV` in a setup file, because ikiwiki is already
+> running before it reads that, and so it has little effect. Your error
+> messages do look like a new bin/ikiwiki is using an old version of
+> `IkiWiki.pm`.
+> 
+> The thing to do is set `INSTALL_BASE` when you're installing ikiwiki from
+> source. Like so:
+
+        cd ikiwiki
+        perl Makefile.PL INSTALL_BASE=$HOME PREFIX=
+        make install
+
+> Then `$HOME/bin/ikiwiki` will have hardcoded into it to look
+> for ikiwiki's perl modules in `$HOME/lib/perl5/`
+> (This is documented in the README file by the way.) --[[Joey]] 
+
+>> Ok, *perl Makefile.PL INSTALL_BASE=$HOME/bin PREFIX=* finally did it for me. I tried too many things with
+>> these paths so I wasn't sure which actually worked. After that I did 
+>> *$ ikiwiki --setup www.setup --wrappers --rebuild*. Somehow in this update mess I seem to have lost the user
+>> accounts, maybe the --rebuild was too much.
diff --git a/doc/forum/Render_more_than_one_dest_page_from_same_source_page.mdwn b/doc/forum/Render_more_than_one_dest_page_from_same_source_page.mdwn
new file mode 100644 (file)
index 0000000..e7362c9
--- /dev/null
@@ -0,0 +1,51 @@
+Is it possible to render more than one destination page from the same source page?
+That is, same source, slightly different presentation at the other end, needing a different output file.
+
+> It's possible to render more than one output _file_ from a given source
+> page. See, for example, the inline plugin's generation of rss files.
+> This is done by calling `will_render()` and using `writefile()` to
+> generate the additional files. Probably in a format hook if you want
+> to generate html files.
+
+>> Thanks for the tip, I'll take a look at that. -- [[KathrynAndersen]]
+> It's not possible for one source file to represent multiple wiki pages.
+> There is a 1:1 mapping between source filenames and page names. The
+> difference between wiki pages and output files is that you can use
+> wikilinks to link to wiki pages, etc. --[[Joey]] 
+
+I have two problems that would be solved by being able to do this.
+
+[[!toc startlevel=2]]
+
+##"full" and "print" versions of a page.
+
+One has a page "foo", which is rendered into foo.html.
+One also wants a foo-print.html page, which uses "page-print.tmpl" rather than "page.tmpl" as its template.
+
+I want to do this for every page on the site, automatically, so it isn't feasible to do it by hand.
+
+> Did you know that ikiwiki's `style.css` arranges for pages to display
+> differently when printed out? Things like the Action bar are hidden in
+> printouts (search for `@media print`). So I don't see a reason to need
+> whole files for printing when you can use these style sheet tricks.
+> --[[Joey]] 
+
+>>Fair enough. --[[KathrynAndersen]]
+
+##"en" and "en-us" versions of a page.
+
+My site is in non-US English.  However, I want US-English people to find my site when they search for it when they use US spelling on certain search terms (such as "optimise" versus "optimize").  This requires a (crude) US-English version of the site where the spellings are changed automatically, and the LANG is "en-us" rather than "en".  (No, don't tell me to use keywords; Google ignores keywords and has for a number of years).
+
+So I want the page "foo" to render to "foo.en.html" and "foo.en-us.html" where the content is the same, just some automated word-substitution applied before foo.en-us.html is written.  And do this for every page on the site.
+
+I can't do this with the "po" plugin, as it considers "en-us" not to be a valid language.  And the "po" plugin is probably overkill for what I want anyway.
+
+But I'm not sure how to achieve the result I need.
+
+-- [[KathrynAndersen]]
+
+> Sounds like this could be considered a single page that generates two
+> html files, so could be handled per above. --[[Joey]] 
+
+>>Thanks! --[[KathrynAndersen]]
diff --git a/doc/forum/The_requested_URL___47____126__jean__47__blog__47__ikiwiki.cgi_was_not_found_on_this_server..mdwn b/doc/forum/The_requested_URL___47____126__jean__47__blog__47__ikiwiki.cgi_was_not_found_on_this_server..mdwn
new file mode 100644 (file)
index 0000000..4061a73
--- /dev/null
@@ -0,0 +1,11 @@
+Hi,
+Installed ikiwiki on my ubuntu (04.10) box; after creating a blog according to your setup instructions I cannot edit files on the web interface, and I get this errer «The requested URL /~jean/blog/ikiwiki.cgi was not found on this server.»
+I have no idea what to do (sorry for my ignorance)
+
+tia,
+
+> Make sure you have a `~/public_html/ikiwiki.cgi`. Your setup
+> file should generate that via the `cgi_wrapper` option.
+> 
+> Maybe you need to follow the [[tips/dot_cgi]] tip to make apache see it.
+> --[[Joey]]
diff --git a/doc/forum/The_requested_URL___47____126__jean__47__blog__47__ikiwiki.cgi_was_not_found_on_this_server./comment_1_d36ce6fab90e0a086ac84369af38d205._comment b/doc/forum/The_requested_URL___47____126__jean__47__blog__47__ikiwiki.cgi_was_not_found_on_this_server./comment_1_d36ce6fab90e0a086ac84369af38d205._comment
new file mode 100644 (file)
index 0000000..f95972c
--- /dev/null
@@ -0,0 +1,16 @@
+[[!comment format=mdwn
+ username="jeanm"
+ subject="comment 1"
+ date="2010-06-19T13:35:37Z"
+ content="""
+OK, I followed the dot cgi tip and this error diappears, thanks a lot! So ubuntu doesn't provide a \"working out of the box\" ikiwiki.
+
+But I get a new error message now when trying to edit a page:
+
+Error: \"do\" parameter missing
+
+My plugins now:
+add_plugins => [qw{goodstuff websetup comments blogspam 404 muse}],
+
+
+"""]]
diff --git a/doc/forum/The_requested_URL___47____126__jean__47__blog__47__ikiwiki.cgi_was_not_found_on_this_server./comment_2_5836bba08172d2ddf6a43da87ebb0332._comment b/doc/forum/The_requested_URL___47____126__jean__47__blog__47__ikiwiki.cgi_was_not_found_on_this_server./comment_2_5836bba08172d2ddf6a43da87ebb0332._comment
new file mode 100644 (file)
index 0000000..0a544ee
--- /dev/null
@@ -0,0 +1,7 @@
+[[!comment format=mdwn
+ username="http://joey.kitenet.net/"
+ subject="do parameter missing"
+ date="2010-06-23T17:03:12Z"
+ content="""
+That's an unusual problem. Normally the url or form that calls ikiwiki.cgi includes a \"do\" parameter, like \"do=edit\". I'd have to see the site to debug why it is missing for you.
+"""]]
index fb007f7e96fd349cab2036f366814dacf56f967f..6e6af8adbec413ff9c7405484735cf85520d47bc 100644 (file)
@@ -1,3 +1,5 @@
+## First Pass
+
 Looking at the discussion about [[todo/structured_page_data]], it looks a bit like folks are bogged down in figuring out what *markup* to use for structured page data, something I doubt that people will really agree on.  And thus, little progress is made.
 
 I propose that, rather than worry about what the data looks like, that we take a similar approach
@@ -15,3 +17,47 @@ I think it could be really powerful and useful, especially if it becomes part of
 --[[KathrynAndersen]]
 
 > It looks like an interesting idea.  I don't have time right now to look at it in depth, but it looks interesting. -- [[Will]]
+
+> I agree such a separation makes some sense. But note that the discussion on [[todo/structured_page_data]]
+> talks about associating data types with fields for a good reason: It's hard to later develop a good UI for
+> querying or modifying a page's data if all the data has an implicit type "string". --[[Joey]]
+
+>> I'm not sure that having an implicit type of "string" is really such a bad thing.  After all, Perl itself manages with just string and number, and easily converts from one to the other.  Strong typing is generally used to (a) restrict what can be done with the data and/or (b) restrict how the data is input.  The latter could be done with some sort of validated form, but that, too, could be decoupled from looking up and returning the value of a field. --[[KathrynAndersen]]
+
+## Second Pass
+
+I have written additional plugins which integrate with the [[plugins/contrib/field]] plugin to both set and get structured page data.
+
+* [[plugins/contrib/getfield]] - query field values inside a page using {{$*fieldname*}} markup
+* [[plugins/contrib/ftemplate]] - like [[plugins/template]] but uses "field" data as well as passed-in data
+* [[plugins/contrib/ymlfront]] - looks for YAML-format data at the front of a page; this is just one possible back-end for the structured data
+
+--[[KathrynAndersen]]
+
+> I'm not an IkiWiki committer ([[Joey]] is the only one I think)
+> but I really like the look of this scheme. In particular,
+> having `getfield` interop with `field` without being *part of*
+> `field` makes me happy, since I'm not very keen on `getfield`'s
+> syntax (i.e. "ugh, yet another mini-markup-language without a
+> proper escaping mechanism"), but this way people can experiment
+> with different syntaxes while keeping `field` for the
+> behind-the-scenes bits.
+>
+>> I've started using `field` on a private site and it's working
+>> well for me; I'll try to do some code review on its
+>> [[plugins/contrib/field/discussion]] page. --s
+>
+> My [[plugins/contrib/album]] plugin could benefit from
+> integration with `field` for photos' captions and so on,
+> probably... I'll try to work on that at some point.
+>
+> [[plugins/contrib/report]] may be doing too much, though:
+> it seems to be an variation on `\[[inline archive="yes"]]`,
+> with an enhanced version of sorting, a mini version of
+> [[todo/wikitrails]], and some other misc. I suspect it could
+> usefully be divided up into discrete features? One good way
+> to do that might be to shuffle bits of its functionality into
+> the IkiWiki distribution and/or separate plugins, until there's
+> nothing left in `report` itself and it can just go away.
+>
+> --[[smcv]]
diff --git a/doc/forum/debian_backports_update_someone_please.mdwn b/doc/forum/debian_backports_update_someone_please.mdwn
new file mode 100644 (file)
index 0000000..7102d12
--- /dev/null
@@ -0,0 +1,18 @@
+I'm just in the process of deploying ikiwiki and I'd love to use it in the html5 mode instead of in XHTML. Any chance that the ikiwiki's .deb in debian backports will be updated any time soon?
+
+> Formerer does a good job keeping the backport up-to-date with whatever is in Debian testing. 
+> Which is the policy of what Backports should contain. So, I just need to stop releasing ikiwiki
+> for 2 weeks. :) --[[Joey]]
+
+>> And are there any chances you doing it... or rather not doing it?
+
+>>> Sure, I'm busily not doing it right now. Should reach testing in 3
+>>> days. I generally schedule things so a new ikiwiki reaches testing
+>>> every 2 weeks to month. Getting important new features and bugfixes out
+>>> can take priority though. --[[Joey]] 
+
+>>>> Great! Thanks.
+
+>>>> Still not available in the backports; did you break the silence on the wire and got back to work [[Joey]]? 
+
+>>>> I was blinded by my stupidity... thanks!
diff --git a/doc/forum/double_forward_slash___39____47____47____39___in_the_address_bar.mdwn b/doc/forum/double_forward_slash___39____47____47____39___in_the_address_bar.mdwn
new file mode 100644 (file)
index 0000000..b5fb2aa
--- /dev/null
@@ -0,0 +1,3 @@
+Why do all the pages are preceded with a double forward slash in the address bar... ie. http://example.org//ikiwiki/pagespec/ .. maybe someone knows?
+
+> Sorted, base url in the .setup file had the unnecessary '/' suffix.
diff --git a/doc/forum/formating:_how_to_align_text_to_the_right.mdwn b/doc/forum/formating:_how_to_align_text_to_the_right.mdwn
new file mode 100644 (file)
index 0000000..2b56bd7
--- /dev/null
@@ -0,0 +1,15 @@
+as in title, how to align text to the right?
+
+> Add to your local.css a class that aligns text to the right:
+
+       .alignright { text-align: right; }
+
+> And then you just just use `<span class="alignright">` around
+> other html.
+> 
+> You can refine that, and allow right-aligning markdowned text
+> by using the [[ikiwiki/directive/template]]
+> directive, with a template that contains the html. The 
+> [[templates/note]] template does something similar. --[[Joey]]
+
+>> Thanks!
index 68b44f2c1e94252a040ebd6f0b5f4b0836d87e63..96ba2d79145adbc9c2fdcaba05201a380b57ce6c 100644 (file)
@@ -50,3 +50,30 @@ The openid is
 <https://www.google.com/accounts/o8/id?id=AItOawltlTwUCL_Fr1siQn94GV65-XwQH5XSku4>
 (what a mouthfull!), and I don't know who that is or how to use it since it
 points to a fairly useless xml document, rather than a web page. --[[Joey]]
+
+> That string is what's received via the discovery protocol. The user logging in with a Google account is not supposed to write that when logging in, but rather <https://www.google.com/accounts/o8/id>. The OpenID client library will accept that and redirect the user to a sign in page, which will return that string as the OpenID. It's not really usable as an identifier for edits and whatnots, but an alternative would be to use the attribute exchange extension to get the email address and display that. See <http://code.google.com/apis/accounts/docs/OpenID.html#Parameters>.
+
+> Yahoo's OpenID implementation works alike, but I haven't looked at it as much. It uses <https://me.yahoo.com/> to receive the endpoint.
+
+> I've added buttons that submit the two above URLs for logging in with a Google and Yahoo OpenID, respectively, to my locally changed OpenID login plugin.
+
+> Using the Google profile page as the OpenID is really orthogonal to the above. --[[kaol]]
+
+>> First, I don't accept that the openid google returns from their 
+>> generic signin url *has* to be so freaking ugly. For contrast, 
+>> look at the openid you log in as if you use the yahoo url.
+>> <https://me.yahoo.com/joeyhess#35f22>. Nice and clean, now
+>> munged by ikiwiki to "joeyhess [me.yahoo.com]".
+>> 
+>> Displaying email addresses is not really an option, because ikiwiki
+>> can't leak user email addresses like that. Displaying nicknames or
+>> usernames is, see [[todo/Separate_OpenIDs_and_usernames]].
+>>
+>> It would probably be good if the openid plugin could be configured with
+>> a list of generic openid urls, so it can add quick login buttons using
+>> those urls.
+>>
+>> The ugly google url will still be exposed here and there where
+>> a unique user id is needed. That can be avoided by not using the generic
+>> <https://www.google.com/accounts/o8/id>, but instead your own profile
+>> like <http://www.google.com/profiles/joeyhess>. --[[Joey]] 
diff --git a/doc/forum/how_do_I_revert_edits_in_the_web_mode__63__.mdwn b/doc/forum/how_do_I_revert_edits_in_the_web_mode__63__.mdwn
new file mode 100644 (file)
index 0000000..7686a7a
--- /dev/null
@@ -0,0 +1,35 @@
+Puzzled a bit :-/
+
+> There is no explicit interface for reverting edits. Most of us use `git revert`. --[[Joey]]
+
+>> That's a blow; I was planning on appointing no techies to keep law and order on our pages :-/ Is there a plugin or at least a plan to add such a 'in demand' feature?
+
+>>> A lot of things complicate adding that feature to the web interface.
+>>>
+>>> First, ikiwiki happily uses whatever the VCS's best of breed web
+>>> history interface is. (ie, viewvcs, gitweb). To allow reverting
+>>> past the bottom of the RecentChanges page, it would need to have its 
+>>> own history browser. Not sure I want to go there.
+>>>
+>>> And the mechanics of handling reverting can quickly get complex. 
+>>> Web reverting should only allow users to revert things they can edit,
+>>> but reverting a whole commit in git might touch multiple files.
+>>> Some files may not be editable over the web at all. (The
+>>> [[tips/untrusted_git_push]] also has to deal with those issues.)
+>>> Finally, a revert can fail with a conflict. The revert could touch 
+>>> multiple files, and multiple ones could conflict. The conflict may
+>>> involve non-page files that can't be diffed. So an interface for
+>>> resolving such a conflict could be hard.
+>>> 
+>>> Probably web-based reverting would need to be limited to reverting 
+>>> single file changes, not whole commits, and not having very good
+>>> conflict handling. And maybe only being accessible for changes
+>>> still visible on RecentChanges. With those limitations, it's certianly
+>>> doable (as a plugin even), but given how excellent `git revert` is in
+>>> comparison, I have not had a real desire to do so. --[[Joey]]
+
+>>>> Web edits are single-file anyway, so I wouldn't expect web reverts
+>>>> to handle the multi-file case. OTOH, I've sometimes wished ikiwiki
+>>>> had its own history browser (somewhere down my todo list). --[[schmonz]]
+
+>>>> Yup, having a possibility to revert a single file would suffice.
diff --git a/doc/forum/how_to_add_post_titles_in_ikiwiki_blog__63__.mdwn b/doc/forum/how_to_add_post_titles_in_ikiwiki_blog__63__.mdwn
new file mode 100644 (file)
index 0000000..68eb06c
--- /dev/null
@@ -0,0 +1,28 @@
+Look at these two blogs:
+
+1) http://ciffer.net/~svend/blog/
+
+2) http://upsilon.cc/~zack/blog/
+
+Well, i set up successfully my blog (i am using inline function in a wiki page) but i have manually to insert blog pos titles and the result is that of blog #2.
+Instead i would like to have blog post titles automatically inserted like blog #1 (and they are links too! I want them that way).
+I looked in git repo of the two blogs but i couldn't find the answer.
+Any help would be really appreciated.
+
+Thanks!
+
+Raf
+
+> Either name the blog post files with the full title you want them to 
+> have, or use [[ikiwiki/directive/meta]] title to set the title of a blog post.
+> 
+>      \[[!meta title="this is my blog post"]]
+> 
+> Either way, the title will automatically be displayed, clickable, at the top.
+> (zack has hacked his templates not to do that). --[[Joey]] 
+
+>> Thanks for your answer.<br/>
+>> I looked in the [templates](http://git.upsilon.cc/cgi-bin/gitweb.cgi?p=zack-homepage.git;a=tree;f=templates;h=824100e62a06cee41b582ba84fcb9cdd982fe4be;hb=HEAD) folder of zack but couldn't see any hack of that kind.<br/>
+>> Anyway, I didn't hack my template...<br/>
+>> I will follow your suggestion of using \[[ikiwiki/directive/meta]] title to set titles.<br/>
+>> Thanks a lot. --Raf
diff --git a/doc/forum/how_to_load_an_external_page_and_still_have_it_under_ikiwiki_template.mdwn b/doc/forum/how_to_load_an_external_page_and_still_have_it_under_ikiwiki_template.mdwn
new file mode 100644 (file)
index 0000000..a747911
--- /dev/null
@@ -0,0 +1,3 @@
+OK, probably title is bit confusing. Basically I'd like to be able to keep my left hand side menu, which is part of the template, and at the same time load let's say forum on the right hand side, which sits on a separate domain. Is it possible then to construct template that for some special links it runs as lets say in *frameset* mode?
+
+> I think I'll have to use [[ikiwiki/directive/pagetemplate]] and this <http://stackoverflow.com/questions/153152/resizing-an-iframe-based-on-content> solution
diff --git a/doc/forum/how_to_login_as_admin.mdwn b/doc/forum/how_to_login_as_admin.mdwn
new file mode 100644 (file)
index 0000000..807f825
--- /dev/null
@@ -0,0 +1,18 @@
+I even managed to set up ikiwiki so it works fine with git; but how on earth do
+I log in as an administrator? In the .setup file the admin user is set to
+'zimek' but when I go and register 'zimek' on the web it appears as normal user
+not the administrator. What am I missing?
+
+> That's really all there is to it. The [[automatic_setup|setup]] script
+> registers the admin user for you before the wiki goes live. If you didn't
+> use it, registering the right account name will get you the admin account.
+> 
+> The name is case sensative, perhaps you really spelled one of them `Zimek`?
+> 
+> Or maybe you're the admin, and don't know it? Everything looks the same for the admin,
+> except they can edit even locked pages, and can access the websetup interface from their
+> Preferences page, if you have that plugin enabled. --[[Joey]] 
+
+>> Maybe I'm indeed. I know that I've disabled all the plugins while installing ikiwiki. Checking it now ;-)
+
+>> Yup, I'm the God of my ikiwiki. (Thanks)
diff --git a/doc/forum/how_to_setup_ikiwiki_on_a_remote_host.mdwn b/doc/forum/how_to_setup_ikiwiki_on_a_remote_host.mdwn
new file mode 100644 (file)
index 0000000..1c0f8f5
--- /dev/null
@@ -0,0 +1,35 @@
+Hi all!
+I really like ikiwiki and i tested it on my local machine but i have one question that i can't answer reading documentation (my fault of course)...
+I have an account and some space on a free hosting service.
+Now, i want to put my ikiwiki on this remote web space so that i can browse it from wherever i want.
+I have my source dir and my git dir on my local machine.
+How can i upload my ikiwiki on the remote host and manage it via git as i can do when i test it locally?
+Where is specified? Where can i find documentation about it?
+
+Thanks in advance!
+
+Pab
+
+> There are several ways to accomplish this, depending on what you really
+> want to do.
+> 
+> If your goal is to continue generating the site locally, but then
+> transfer it to the remote host for serving, you could use the 
+> [[plugins/rsync]] plugin.
+> 
+> If your goal is to install and run the ikiwiki software on the remote host,
+> then you would follow a similar path to the ones described in these tips:
+> [[tips/nearlyfreespeech]] [[tips/DreamHost]]. Or even [[install]] ikiwiki
+> from a regular package if you have that kind of access. Then you could
+> push changes from your local git to git on the remote host to update the
+> wiki. [[tips/Laptop_wiki_with_git]] explains one way to do that.
+> --[[Joey]] 
+
+Thanks a lot for your answer.
+rsync plugin would be perfect but... how would i manage blog post?
+I mean... is it possible to manage ikiwiki blog too with rsync plugin in the way you told me? --Pab
+
+> If you want to allow people to make comments on your blog, no, the rsync plugin will not help, since it will upload a completely static site where nobody can make comments.  Comments require a full IkiWiki setup with CGI enabled, so that people add content (comments) from the web. --[[KathrynAndersen]]
+
+Ok, i understand, thanks.
+Is there any hosting service that permits to have a full installation of iwkiwiki or i am forced to get a vps or to mantain a personal server for that? --Pab
diff --git a/doc/forum/ikiwiki_development_environment_tips.mdwn b/doc/forum/ikiwiki_development_environment_tips.mdwn
new file mode 100644 (file)
index 0000000..91ccc6d
--- /dev/null
@@ -0,0 +1,44 @@
+I haven't settled on a comfortable/flexible/quick development environment for hacking on ikiwiki.  The VM I host my web pages on is not fast enough to use for RAD and ikiwiki. For developing plugins, it seems a bit heavy-weight to clone the entire ikiwiki repository. I haven't managed to get into a habit of running a cloned version of ikiwiki from it's own dir, rather than installing it (If that's even possible).  The ikiwiki site source (source ./doc) is quite large and not a great testbed for hacking (e.g. if you are working on a plugin you need a tailored test suite for that plugin).
+
+Does anyone have a comfortable setup or tips they would like to share? -- [[Jon]]
+
+> I've just been setting `libdir` in an existing wiki's setup file. When the plugin's in a decent state, I copy it over to a git checkout and commit. For the plugins I've been working on (auth and VCS), this has been just fine. Are you looking for something more? --[[schmonz]]
+
+>> I think this suffers from two problems. Firstly, unless you are tracking git
+>> master in your existing wiki, there's the possibility that your plugin will
+>> not work with a more modern version of ikiwiki (or that it would benefit
+>> from using a newly added utility subroutine or similar). 
+
+>>> Unlikely. I don't make changes to the plugin interface that break
+>>> existing plugins. (Might change non-exported `IkiWiki::` things
+>>> from time to time.) --[[Joey]] 
+
+>> Second, sometimes I
+>> find that even writing a plugin can involve making minor changes outside of
+>> the plugin code (bug fixes, or moving functionality about). So, I think
+>> having some kind of environment built around a git checkout is best.
+>> 
+>> However, this does not address the issue of the tedium writing/maintaining a
+>> setup file for testing things.
+>>
+>> I think I might personally benefit from a more consistent environment (I
+>> move from machine-to-machine frequently). -- [[Jon]]
+
+> If you set `libdir` to point to a checkout of ikiwiki's git repository,
+> it will override use of the installed version of ikiwiki, so ikiwiki will
+> immediatly use any changed or new `.pm` files (with the exception of
+> IkiWiki.pm), and you can use git to manage it all without an installation
+> step. If I am modifying IkiWiki.pm, I generally symlink it from
+> `/usr/share/perl5/IkiWiki.pm` to my git reporisitory. Granted, not ideal.
+> 
+> I often use my laptop's local version of my personal wiki for testing.
+> It has enough stuff that I can easily test most things, and if I need
+> a test page I just dump test cases on the sandbox. I can make
+> any changes necessary during testing and then `git reset --hard
+> origin/master` to avoid publishing them.
+> 
+> If the thing I'm testing involves templates, or underlays, 
+> I will instead use ikiwiki's `docwiki.setup` for testing, modifying it as
+> needed, since it is preconfigured to use the templates and underlays
+> from ikiwiki's source repository.
+> --[[Joey]]
diff --git a/doc/forum/link_autocompletion_in_vim.mdwn b/doc/forum/link_autocompletion_in_vim.mdwn
new file mode 100644 (file)
index 0000000..7d3ed8b
--- /dev/null
@@ -0,0 +1,17 @@
+I extended the functionality of the [ikiwiki-nav plugin](http://www.vim.org/scripts/script.php?script_id=2968)
+(see [[here|tips/follow_wikilinks_from_inside_vim]]) to allow completion of
+wikilinks from inside vim, through the omnicompletion mechanism.
+
+It still has some bugs, but is usable, and will not destroy your data. It can
+only complete links whose definition (text) is on a single line, and still can't
+handle "named links" (`\[\[text|link\]\]`).
+
+I'd love to hear suggestions for improvement for it, and bug reports ;) For
+example, regarding how are sorted and presented the available completions
+(dates, alphabetically, etc).
+
+You can find a tarball for it
+[here](http://devnull.li/~jerojasro/ikiwiki-nav-dev.tar.gz). To install it,
+extract the tarball contents in your `.vim` directory.
+
+--[[jerojasro]]
diff --git a/doc/forum/link_to_an_image_inside_the_wiki_without_inlining_it.mdwn b/doc/forum/link_to_an_image_inside_the_wiki_without_inlining_it.mdwn
new file mode 100644 (file)
index 0000000..e92cc1b
--- /dev/null
@@ -0,0 +1,69 @@
+how can I create a link to an image which is part of the wiki, without having it inserted in my page?
+
+I tought this:
+
+    \[[look at this|img/lolcat.png]] 
+
+would work, but it doesn't.
+
+Any hints? --[[jerojasro]]
+
+> Well, currently the syntax above will display the image
+> inline with the specified link text used as an alt attribute. Although
+> that does not seem to be documented anywhere.
+> 
+> A few places that use that (found with `git grep '\[\[' | egrep 'png|gif|jpeg|jpg' |grep \|`):
+> 
+> * [[logo]] uses it to provide useful alt texts for the logos. (This
+>   could easily be changed to use [[ikiwiki/directive/img]] though.)
+> * The `change.tmpl` template uses it to display 
+>   the [[diff|wikiicons/diff.png]] with a very useful "diff" alt text.
+>   Using [[ikiwiki/directive/img]] here would mean that the
+>   [[plugins/recentchanges]] plugin would depend upon the img
+>   plugin.
+> 
+> I do like your suggestion, it makes more sense than the current behavior.
+> I'm not sure the transition pain to get from here to there is worth it,
+> though.
+> 
+> More broadly, if I were writing ikiwiki now, I might choose to leave out the
+> auto-inlining of images altogether. In practice, it has added a certian level
+> of complexity to ikiwiki, with numerous plugins needing to specify
+> `noimageinline` to avoid accidentially inlining an image. And there has not
+> been a lot of payoff from having the auto-inlining feature implicitly
+> available most places. And the img directive allows much needed control over
+> display, so it would be better for users to not have to worry about its
+> lesser cousin. But the transition from here to *there* would be another order
+> of pain.
+> 
+> Anyway, the cheap and simple answer to your question is to use html
+> or markdown instead of a [[ikiwiki/wikilink]]. Ie, 
+> `[look at this](img/lolcat.jpg)`. --[[Joey]]
+
+> > thanks a lot, that's a quite straightforward solution. I actually wrote a
+> > broken plugin to do that, and now I can ditch it --[[jerojasro]]
+
+>>> The plugin approach is not a bad idea if you want either the ability
+>>> to:
+>>>
+>>> * Have things that are wikilink-aware (like [[plugins/brokenlinks]]
+>>>   treat your link to the image as a wikilink. 
+>>> * Use standard wikilink path stuff (and not have to worry about 
+>>>   a relative html link breaking if the page it's on is inlined, for
+>>>   example).
+>>>
+>>> I can help you bang that plugin into shape if need be. --[[Joey]] 
+
+>>>> both my plugin and your suggestion yield broken html links when inlining the page (although probably that's what is expected from your suggestion (`[]()`))
+>>>>
+>>>> I thought using the `bestlink` function would take care of that, but alas, it doesn't.
+>>>> Get the "plugin" [here](http://devnull.li/~jerojasro/files/linktoimgonly.pm), see the broken 
+>>>> links generated [here](http://devnull.li/~jerojasro/blog/posts/job_offers/) and the source 
+>>>> file for that page [here](http://git.devnull.li/cgi-bin/gitweb.cgi?p=blog-jerojasro.git;a=blob;f=posts/job_offers.mdwn;hb=HEAD) --[[jerojasro]]
+
+>>>>> Use this --[[Joey]] 
+
+       return htmllink($params{page}, $params{destpage}, $params{"img"},
+           linktext => $params{text},
+           noimageinline => 1);
+
diff --git a/doc/forum/navigation_of_wiki_pages_on_local_filesystem_with_vim.mdwn b/doc/forum/navigation_of_wiki_pages_on_local_filesystem_with_vim.mdwn
new file mode 100644 (file)
index 0000000..7bc0329
--- /dev/null
@@ -0,0 +1,127 @@
+**UPDATE** I have created a [[page|tips/follow_wikilinks_from_inside_vim]] in
+the tips section about the plugin, how to get it, install it and use it. Check
+that out. --[[jerojasro]]
+
+I wrote a vim function to help me navigate the wiki when I'm editing it. It extends the 'gf' (goto file) functionality. Once installed, you place the cursor on a wiki page name and press 'gf' (without the quotes); if the file exists, it gets loaded.
+
+This function takes into account the ikiwiki linking rules when deciding which file to go to.
+
+> 'gf' gets in the way when there are directories with the same name of a wiki page. The 
+> function below doesn't implement the linking rules properly (test the link (ignoring case),
+> if there is no match ascend the dir. hierarchy and start over, until we reach the root of
+> the wiki). I'm rewriting it to follow these rules properly
+> 
+> I think the page for [[LinkingRules|ikiwiki/subpage/linkingrules]] should say that ikiwiki **ascends**
+> the dir. hierarchy when looking for a wikilink, not that it **descends** it. Am I correct? --[[jerojasro]]
+
+>> Conventionally, the root directory is considered to be lower than other
+>> directories, so I think the current wording is correct. --[[Joey]]
+
+let me know what you think
+
+>         " NOTE: the root of the wiki is considered the first directory that contains a
+>         " .ikiwiki folder, except $HOME/.ikiwiki (the usual ikiwiki libdir)
+> 
+> That's not going to work in all situations; for example, with an ikiwiki which uses git as the backend, the normal setup is that one has
+> 
+> * a bare git repository
+> * a git repository which ikiwiki builds the wiki from (which has a .ikiwiki directory in it)
+> * an *additional* git repository cloned from the bare repository, which is used for making changes from the command-line rather than the web.  It is this repository in which one would be editing files with vim, and *this* repository does not have a .ikiwiki directory in it.  It does have a .git directory in the root, however, so I suppose you could use that as a method of detection of a root directory, but of course that would only work for git repositories.
+> 
+> -- [[KathrynAndersen]]
+> 
+>> You are completely right; all of my wikis are compiled both locally and
+>> remotely, and so the local repo also has a `.ikiwiki` folder. And that's not the
+>> "usual" setup.
+>> 
+>> checking for a `.git` dir would not work when the wiki's source files aren't
+>> located at the root of the repo.
+>> 
+>> So, besides of doing a `touch .ikiwiki` at the root of the wiki in your local
+>> repo, do you see any alternative?
+>> 
+>> -- [[jerojasro]]
+
+well. I've rewritten the whole thing, to take into account:
+  
+  * file matching ignoring case (MyPage matches mypage.mdwn)
+  * checking all the way down (up) to the root of the wiki (if there is a link `\[[foo]]` on `a/b/page`),
+  try `a/b/page/foo`, then `a/b/foo`, and so on, up to `foo`
+  * the alternate name for a page: when looking for the file for `\[[foo]]`, try both `foo.mdwn` and `foo/index.mdwn`
+
+you can find the file [here](http://git.devnull.li/cgi-bin/gitweb.cgi?p=vim-jerojasro.git;a=blob;f=.vim/ftplugin/ikiwiki_nav.vim;hb=HEAD). To use it, place it in `$HOME/.vim/ftplugin`. After that, hitting `<CR>` (Enter) in normal mode over a wikilink will take you to that page, if it exists.
+
+the plugin has, as of now, two problems:
+  * doesn't work with wikilinks that take more than one line (though this isn't really that bad)
+  * it assumes that the root of the wiki is the first directory down the filesystem hierarchy that 
+  has a `.ikiwiki` folder on it. If your copy of the wiki doesn't have it, you must create it for 
+  the plugin to work
+
+-- [[jerojasro]]
+
+> Interesting. I was at one point looking at "potwiki.vim", which implements a local wiki and follows CamelCase links, creating new files where necessary etc., to see if it could be adapted for ikiwiki (See [[tips/vim syntax highlighting/discussion]]). I didn't get anywhere. -- [[Jon]]
+
+>> when I wrote the plugin I also considered the possibility of creating files (and their dirs, if necessary) 
+>> from new wikilinks; the changes needed to get that working are fairly small -- [[jerojasro]]
+
+> Seems about ready for me to think about pulling it into ikiwiki
+> alongside [[tips/vim_syntax_highlighting/ikiwiki.vim]]. If you'll
+> please slap a license on it. :) --[[Joey]] 
+>
+>> GPL version 2 or later (if that doesn't cause any problems here). I'll add it
+>> to the file --[[jerojasro]]
+>>
+>>> I see you've put the plugin on vim.org. Do you think it makes sense to
+>>> also include a copy in ikiwiki? --[[Joey]] 
+>>> 
+>>>> mmm, no. There would be two copies of it, and the git repo. I'd rather have 
+>>>> a unique place for the "official" version (vim.org), and another for the dev 
+>>>> version (its git repo).
+>>>> 
+>>>> actually, I would also suggest to upload the [[`ikiwiki.vim`|tips/vim_syntax_highlighting]] file to vim.org --[[jerojasro]]
+>>>>>
+>>>>> If you have any interest in maintaining the syntax highlighting
+>>>>> plugin and putting it there, I'd be fine with that. I think it needs
+>>>>> some slight work to catch up with changes to ikiwiki's directives
+>>>>> (!-prefixed now), and wikilinks (able to have spaces now). --[[Joey]]
+>>>>> 
+>>>>>> I don't really know too much about syntax definitions in vim. But I'll give it a stab. I know it fails when there are 2 \[[my text|link]] wikilinks in the same page.
+>>>>>> I'm not promising anything, though ;) --[[jerojasro]]
+>
+> Also, I have a possible other approach for finding ikiwiki's root. One
+> could consider that any subdirectory of an ikiwiki wiki is itself
+> a standalone wiki, though probably one missing a toplevel index page.
+> The relative wikilinks work such that this assumption makes sense;
+> you can build any subdirectory with ikiwiki and probably get something
+> reasonable with links that work, etc.
+> 
+> So, if that's the case, then one could say that the directory that the
+> user considers to be the toplevel of their wiki is really also a subwiki,
+> enclosed in a succession of parents that go all the way down to the root
+> directory (or alternatively, to the user's home directory). I think that
+> logically makes some sense.
+> 
+> And if that's the case, you can resolve an absolute link by looking for
+> the page closest to the root that matches the link.
+>
+>> I like your idea; it doesn't alter the matching of the relative links, and
+>> should work fine with absolute links too. I'll implement it, though I see
+>> some potential (but small) issues with it --[[jerojasro]]
+> 
+> It may even make sense to change ikiwiki's own handling of "absolute"
+> links to work that way. But even without changing ikiwiki, I think it
+> would be a reasonable thing for vim to do. It would only fail in two
+> unusual circumstances:
+> 
+> 1. There is a file further down, outside what the user considers
+>    the wiki, that matches. Say a `$HOME/index.mdwn`
+> 2. An absolute link is broken in that the page linked to does
+>    not exist in the root of the wiki. But it does exist in a subdir, 
+>    and vim would go to that file.
+> 
+> --[[Joey]] 
+>
+>> your approach will add more noise when the plugin grows the page-creation
+>> feature, since there will be no real root to limit the possible locations for
+>> the new page. But it is far better than demanding for a `.ikiwiki` dir --[[jerojasro]]
index 2c2ac240ec125e2f8a2de951507219dde5bf5987..799186cf89898241fe1fbbfc3648dd954169f353 100644 (file)
@@ -56,7 +56,7 @@ number is still too large to really visualize: the graphviz PNG and PDF output
 engines segfault for me, the PS one works but I can't get any PS software to
 render it without exploding.
 
-Now, the relations in the links hash are not the same thing as IkiWiki's notion of dependencies. Can anyone point me at  that data structure / where I might be able to add some debugging foo to generate a graph of it?
+Now, the relations in the links hash are not the same thing as Ikiwiki's notion of dependencies. Can anyone point me at  that data structure / where I might be able to add some debugging foo to generate a graph of it?
 
 Once I've figured out that I might be able to optimize some pagespecs. I
 understand pagespecs are essentially translated into sequential perl code. I
diff --git a/doc/forum/suppressing_output_of_pages_included_only_for_their_side_effects.mdwn b/doc/forum/suppressing_output_of_pages_included_only_for_their_side_effects.mdwn
new file mode 100644 (file)
index 0000000..99784cd
--- /dev/null
@@ -0,0 +1,16 @@
+In particular, it's kind of annoying that using the sidebar plugin results in the creation of a free-standing sidebar.html (which in the simplest case of course includes a copy of *its own content* as a sidebar).  It would be nice if there were a way to tell Ikiwiki to treat a file like sidebar.mdwn as "inline only": allow its content to be inlined but not to render it separately nor allow linking to it.
+
+In reading through the code and associated docs, it appears that the ideal method is for the file to be removed from the $changed array by plugin's "needsbuild" hook.  Either the sidebar plugin could define such a hook, or perhaps a more general solution is the creation of a meta variable or config file regexp that would handle it according to the user's wishes.
+
+I'm about ready to code up such a change but want to find out if I'm thinking along the right lines.  --[[blipvert]]
+
+> Internal pages should be able to be used for this, as they are used for
+> comments. So you'd have
+> `sidebar._mdwn`. However, mwdn would need to be changed to register a
+> htmlize hook for the `_mdwn` extension for that to really work.
+> 
+> But, if there's no rendered sidebar page, how can users easily edit the page
+> in the web interface? In the specific case of the sidebar, It seems
+> better to have the page display something different when built standalone
+> than when built as the sidebar.
+> --[[Joey]]
diff --git a/doc/forum/tag_plugin:_rebuilding_autocreated_pages.mdwn b/doc/forum/tag_plugin:_rebuilding_autocreated_pages.mdwn
new file mode 100644 (file)
index 0000000..1148370
--- /dev/null
@@ -0,0 +1,11 @@
+I have a bunch of tag pages autogenerated by the tag plugin. As part of a redesign for my wiki, I have changed the `autotag.tmpl` template, but IkiWiki refuses to rebuild existing tag pages using the updated template. I understand that existing tag pages are not rebuilt because they have been marked as "created" in `.ikiwiki/indexdb`. Is there a way to purge all tag pages from `indexdb`? --dkobozev
+
+> Well, you can delete the indexdb and rebuild, and that will do it.
+> The tag plugin is careful not to replace existing pages or even recreate
+> tag pages if you delete them, which does cause a problem if you need to
+> update them. --[[Joey]]
+
+>> Thanks. I thought about deleting `indexdb`, but hesitated to do that. According to [[tips/inside dot ikiwiki]], `indexdb` stores "all persistent state about pages". I didn't know if it's harmless to lose all persistent state. --dkobozev
+
+>>> The persistant state is best thought of as a cache,
+>>> so it's safe to delete it. --[[Joey]] 
diff --git a/doc/forum/utf8_warnings_for___34____92__xAB__34__.mdwn b/doc/forum/utf8_warnings_for___34____92__xAB__34__.mdwn
new file mode 100644 (file)
index 0000000..72f2d38
--- /dev/null
@@ -0,0 +1,47 @@
+# getting Warnings about UTF8-Chars.
+
+I'm  getting multiple warnings:
+
+      utf8 "\xAB" does not map to Unicode at /usr/share/perl5/IkiWiki.pm line 774, <$in> chunk 1.
+
+
+I'm assuming this is once per File, but even in verbose mode, it doesn't tell me which file is a problem.
+It first reads all the files, and afterwards when parsing/compiling them, it outputs the warning, so I can't
+deduce the offending files.
+
+Is there a way to have ikiwiki output the position, where it encounters the character?
+
+Probably all this has to do with locale-settings, and usage of mixed locales in a distributed setup ...
+I'd rather cleanup some of the file(name)s  of unexpected characters. --[[jwalzer]]
+
+--------
+
+**Update** : So I took the chance to insert debug into ikiwiki.pm:
+
+     root@novalis:/usr/share/perl5# diff -p /tmp/IkiWiki.orig.pm IkiWiki.pm 
+     *** /tmp/IkiWiki.orig.pm        Sun Feb 14 15:16:08 2010
+     --- IkiWiki.pm  Sun Feb 14 15:16:28 2010
+     *************** sub readfile ($;$$) {
+     *** 768,773 ****
+     --- 768,774 ----
+             }
+       
+             local $/=undef;
+     +       debug("opening File: $file:");
+             open (my $in, "<", $file) || error("failed to read $file: $!");
+             binmode($in) if ($binary);
+             return \*$in if $wantfd;
+
+
+But what I see now is not quite helpful, as it seems, STDERR and DEBUG are asyncronous, so they mix up in a way, that I can't really see, whats the problem ...  Maybe I'm better off for troubleshooting, to insert an printf to strerr to have it in the same stream.. --[[jwalzer]]
+
+
+----
+
+**Update:** The "print STDERR $file;"-Trick did it .. I was able to find a mdwn-file, that (was generated by a script of me) had \0xAB in it.
+
+Nevertheless I still wonder if this should be a problem. This character happend to be in an *\[\[meta title='$CHAR'\]\]-tag* and an *\[$CHAR\]http://foo)-Link*
+
+Should this throw an warning? Maybe this warning could be catched an reported inclusively the containing filename? maybe even with an override, if one knows that it is correct that way? --[[jwalzer]]
+
+[[!tag solved]]
diff --git a/doc/forum/what_is_the_easiest_way_to_implement_order:_disallow_all__44___allow_chosen__95__few_page_editing_policy__63__.mdwn b/doc/forum/what_is_the_easiest_way_to_implement_order:_disallow_all__44___allow_chosen__95__few_page_editing_policy__63__.mdwn
new file mode 100644 (file)
index 0000000..fbc5c58
--- /dev/null
@@ -0,0 +1,3 @@
+As in title, I'd like to allow editing only some pages on my wiki. Rest by default is not editable by users except admin. Thanks
+
+> See [[plugins/lockedit]]. --[[schmonz]]
diff --git a/doc/forum/where_are_the_tags.mdwn b/doc/forum/where_are_the_tags.mdwn
new file mode 100644 (file)
index 0000000..ecb49fe
--- /dev/null
@@ -0,0 +1,9 @@
+Where is the tag cloud/tag listing of all the tags used in this wiki? I know we
+have tags enabled. --[[jerojasro]]
+
+> This wiki does not use one global toplevel set of tags (`tagbase` is not
+> set).
+> 
+> There are tags used for the [[plugins]], and a tag cloud of those
+> there. [[wishlist]] and [[patch]] are tags too, but I don't see the point
+> of a tag cloud for such tags. --[[Joey]]
diff --git a/doc/forum/wiki_clones_on_dynamic_IPs.mdwn b/doc/forum/wiki_clones_on_dynamic_IPs.mdwn
new file mode 100644 (file)
index 0000000..f69f650
--- /dev/null
@@ -0,0 +1,10 @@
+OK, this is not really a ikiwiki problem... but ikiwiki makes wiki clones
+really easy to setup, and this is related to having a website cloned at
+different places and pulling from the servers which are online.
+
+My setup is like this: I have a server at home and another at my dorm
+which will serve as a wiki clone. Each of them has a dynamic IP with DynDNS
+set up. Now the problem lies in linking my domain to these two DynDNS addresses.
+Multiple CNAMEs are not supported, and I don't know if there's any utility
+which can update the A records on the DNS to point directly point to the
+two separate IPs.
index 01ff8d81729e22c3eaadd62c19b1f900ef584da3..4e9e51835e3047aa0aff62ed0e1b40be796bf964 100644 (file)
@@ -23,4 +23,10 @@ that provides a `IS_HOMEPAGE` template variable? --[[JasonBlevins]]
 >> few other small plugins brewing so I'll try to put up some contrib
 >> pages for them soon. --[[JasonBlevins]]
 
-[path]: http://code.jblevins.org/ikiwiki/plugins.git/plain/path.pm
+[path]: http://jblevins.org/git/ikiwiki/plugins.git/plain/path.pm
+
+> I used the following trick in some page.tmpl:
+>
+>     <title><TMPL_VAR WIKINAME><TMPL_IF NAME="PARENTLINKS">: <TMPL_VAR TITLE></TMPL_IF></title>
+>
+> --[[JeanPrivat]]
diff --git a/doc/forum/wishlist-discussion:_Editformular_showing_existing_tags.mdwn b/doc/forum/wishlist-discussion:_Editformular_showing_existing_tags.mdwn
new file mode 100644 (file)
index 0000000..49c55e2
--- /dev/null
@@ -0,0 +1,15 @@
+# How about:
+
+having a list of all existing tags in the Edit-Formular as a selectionbox?
+
+Assume I have tagbase=/tags/ and for every tag I have given to articles an existing page there.
+
+Would it be possible to list all these tags together with the Formular, as selectionbox.
+Maybe even with parsing of the content and preselecting the tags, that are given in the article and vice-versa when selecting the fields then also generating the \[\[\!tag\]\]-sourcecode ?
+
+this would need a bit JS-work and somehow on compiletime we need to put the list of tags somewhere, where the cgi could read them from.
+This way, even a pagespec would suffice to determine the usable list of tags and not only the tagbase-variable.
+
+> I think this would be very hard to achieve with the current tag plugin, due to the nature of its implementation.
+> 
+> I've had a "tag2" plugin on the go for a while which supports this. It's in a very rough stage but I'll try to find it and upload it somewhere. -- [[Jon]]
index 7ac1ac6b44e8663cd5d443db9d46a66c7fa7307d..2243d9b1f02c0a1192c2dcf2e22a8ddb87b775b2 100644 (file)
@@ -4,7 +4,7 @@ ikiwiki, and this documentation wiki, are licensed under the terms of the
 GNU [[GPL]], version 2 or later.
 
 The parts of ikiwiki that become part of your own wiki (the [[basewiki]]
-pages (but not the smilies) and the [[templates|wikitemplates]]) are licensed
+pages (but not the smilies) and the [[templates]]) are licensed
 as follows: 
 
 > Redistribution and use in source and compiled forms, with or without
index 5167ad0044cec22b24b060f3fcb7eb8d0540dda6..88608d4b550dc0e3e8969ef053a0c67c06fb2836 100644 (file)
@@ -26,7 +26,8 @@ be browsed, subscribed to etc on its
 You are of course free to set up your own ikiwiki git repository with your
 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. :-)
+into [[Joey]]'s working repository where he can see your branches and
+think about merging them. This is recommended. :-)
 
 <!-- Machine-parsed format: * wikilink <git:url> -->
 
@@ -56,17 +57,26 @@ into [[Joey]]'s working tree. This is recommended. :-)
 * [[ktf]] `git://github.com/ktf/ikiwiki.git`
 * [[tove]] `git://github.com/tove/ikiwiki.git`
 * [[GiuseppeBilotta]] `git://git.oblomov.eu/ikiwiki`
-
+* [[roktas]] `git://github.com/roktas/ikiwiki.git`
+* [[davrieb|David_Riebenbauer]] `git://git.liegesta.at/git/ikiwiki`
+  ([browse](http://git.liegesta.at/?p=ikiwiki.git;a=summary))
+* [[GustafThorslund]] `http://gustaf.thorslund.org/src/ikiwiki.git`
+* [[peteg]] `git://git.hcoop.net/git/peteg/ikiwiki.git`
+* [[privat]] `git://github.com/privat/ikiwiki.git`
+* [[blipvert]] `git://github.com/blipvert/ikiwiki.git`
+* [[bzed|BerndZeimetz]] `git://git.recluse.de/users/bzed/ikiwiki.git`
 
 ## branches
 
+In order to refer to a branch in one of the above git repositories, for
+example when submitting a [[patch]], you can use the
+[[templates/gitbranch]] template.
+
 Some of the branches included in the main repository include:
 
 * `gallery` contains the [[todo/Gallery]] plugin. It's not yet merged
   due to license issues.  Also some bits need to be tweaked to make it
   work with the current *master* branch again.
-* `html` is an unfinished attempt at making ikiwiki output HTML 4.01
-  instead of xhtml.
 * `wikiwyg` adds [[todo/wikiwyg]] support. It is unmerged pending some
   changes.
 * `debian-stable` is used for updates to the old version included in
index 982892fca25a21ec62458b11f3e98602ec5602b6..03cbdd86c1c66fdec8126ede029897036f9d8727 100644 (file)
@@ -16,9 +16,11 @@ You must specify the setup file for your wiki. The pages will
 be created inside its `srcdir`, beneath the `archivebase`
 directory used by the calendar plugin (default "archives").
 
-You will probably want to specify a [[ikiwiki/PageSpec]]
-to control which pages are included on the calendars. The
-default is all pages. To limit it to only posts in a blog,
+To control which pages are included on the calendars,
+a [[ikiwiki/PageSpec]] can be specified. The default is
+all pages, or the pages specified by the `comments_pagespec`
+setting in the config file. A pagespec can also be specified
+on the command line. To limit it to only posts in a blog,
 use something like "posts/* and !*/Discussion".
 
 It defaults to creating calendar pages for the current
@@ -41,7 +43,7 @@ An example crontab:
 
 # TEMPLATES
 
-This command uses two [[template|wikitemplates]] to generate
+This command uses two [[templates]] to generate
 the pages, `calendarmonth.tmpl` and `calendaryear.tmpl`.
 
 # AUTHOR
index 9e742c211e36edf498e62923b14a7715d47a917f..acb1211de76f787e800f58b43b47bdc9a0d56c83 100644 (file)
@@ -24,6 +24,14 @@ ikiwiki wrapper.
 Note that for monotone, you are assumed to already have run "mtn genkey"
 to generate a key.
 
+
+# EXAMPLE 
+
+`ikiwiki-makerepo git /var/www/wiki /home/user/wiki/`
+
+The above command creates a new git repo in /home/user/wiki as well as a new git repo in the /var/www/wiki directory. 
+It then initializes the /home/user/wiki git repo and makes the /var/www/wiki a clone. 
+
 # AUTHOR
 
 Joey Hess <joey@ikiwiki.info>
diff --git a/doc/ikiwiki-makerepo/discussion.mdwn b/doc/ikiwiki-makerepo/discussion.mdwn
new file mode 100644 (file)
index 0000000..660823f
--- /dev/null
@@ -0,0 +1 @@
+Not sure how well I described the example. :-/ -- Jeremiah
index e0a971d96b631cc48a39b39f6dc9d27fee52bc6e..4d840696c592771d8ce09db40118e79226d89214 100644 (file)
@@ -14,3 +14,4 @@ Some documentation on using ikiwiki:
 * [[ikiwiki/markdown]]
 * [[ikiwiki/openid]]
 * [[ikiwiki/searching]]
+* [[templates]]
index b2ac75b11694eed8cc67178cf2508814ee30f96d..e9216e11fd5f8b8e691db473b92a2d1b05e88f10 100644 (file)
@@ -40,18 +40,21 @@ An example crontab:
   "month" or "year". The default is a month view calendar.
 * `pages` - Specifies the [[ikiwiki/PageSpec]] of pages to link to from the
   month calendar. Defaults to "*".
-* `archivebase` - Configures the base of the archives hierarchy. The
-  default is "archives". Note that this default can also be overridden
+* `archivebase` - Configures the base of the archives hierarchy. 
+  The default is "archives". Note that this default can also be overridden
   for the whole wiki by setting `archivebase` in ikiwiki's setup file.
+  Calendars link to pages under here, with names like "2010/04" and
+  "2010". These pages can be automatically created using the
+  `ikiwiki-calendar` program. 
 * `year` - The year for which the calendar is requested. Defaults to the
-  current year.
+  current year. Can also use -1 to refer to last year, and so on.
 * `month` - The numeric month for which the calendar is requested, in the
   range 1..12. Used only for the month view calendar, and defaults to the
-  current month.
+  current month. Can also use -1 to refer to last month, and so on.
 * `week_start_day` - A number, in the range 0..6, which represents the day
   of the week that the month calendar starts with. 0 is Sunday, 1 is Monday,
   and so on. Defaults to 0, which is Sunday.
-* `months_per_row` - In the annual calendar, number of months to place in
+* `months_per_row` - In the year calendar, number of months to place in
   each row. Defaults to 3.
 
 [[!meta robots="noindex, follow"]]
index 693a927706f605ffa50b3e57c42d4006316f6884..398130e2e820059f7498d71b2ce89d4246649dc4 100644 (file)
@@ -29,6 +29,8 @@ metadata of the comment.
   nearly any format, since it's parsed by [[!cpan TimeDate]]
 * `username` - Used to record the username (or OpenID)
   of a logged in commenter.
+* `nickname` - Name to display for a logged in commenter.
+  (Optional; used for OpenIDs.)
 * `ip` - Can be used to record the IP address of a commenter,
   if they posted anonymously.
 * `claimedauthor` - Records the name that the user entered,
index df45fa84091b753efc707a363e9d3323cd08be2d..b89241e4c3cf944d62fdf21097bf7e42b1c9b4e9 100644 (file)
@@ -12,3 +12,5 @@ For example, an update to a page with an embedded date stamp could look
 like:
 
        Updated \[[!date "Wed, 25 Nov 2009 01:11:55 -0500"]]: mumble mumble
+
+[[!meta robots="noindex, follow"]]
index d731bdb4708727d4515fc223321a841cbfacc5bf..c486e821b0fc3ddd66d61226cb53f56ab18ad6bc 100644 (file)
@@ -21,7 +21,7 @@ something like:
        Details:
 
 The template page can also contain [[!cpan HTML::Template]] directives,
-similar to other ikiwiki [[templates]]. Currently only one variable is
+like other ikiwiki [[templates]]. Currently only one variable is
 set: `<TMPL_VAR name>` is replaced with the name of the page being
 created.
 
index 23830e9cd59e69d04217287627b221770b3908e3..7d11d225f23cc4987964894e23f5ace370234d1e 100644 (file)
@@ -22,7 +22,7 @@ Note that if the highlight plugin is enabled, this directive can also be
 used to display syntax highlighted code. Many languages and formats are
 supported. For example:
 
-       \[[format perl """
+       \[[!format perl """
        print "hello, world\n";
        """]]
 
index 94cc754bd8dc5152bb638ec8957337ecc724c423..cda62b58f04cdad190f2b9a72b28546416185652 100644 (file)
@@ -18,7 +18,8 @@ making the image smaller than the specified size. You can also specify only
 the width or the height, and the other value will be calculated based on
 it: "200x", "x200"
 
-You can also pass `alt`, `title`, `class`, `align` and `id` parameters.
+You can also pass `alt`, `title`, `class`, `align`, `id`, `hspace`, and
+`vspace` parameters.
 These are passed through unchanged to the html img tag. If you include a
 `caption` parameter, the caption will be displayed centered beneath the image.
 
index 998ba642b77c0f9e50304700aa0c267d1f6496ed..6a186cd93ec33ff72501e2dcc999803a1047a3bc 100644 (file)
@@ -1,3 +1,10 @@
+## Combine inline and toggle
+
+Is it possible to combine the behaviour of toggle and inline? ie, have it present of list of 'headlines' which are created from seperate subpages which can be clicked to expand to the body of the inlined page. Thanks.
+
+-- Thiana
+
+---
 ## How do you provide the per post discussion links in your own blog?
 
 > That's configured by the "actions" parameter to the inline directive. See
index 062b4267a6f97ec63991c47ac14159946391f633..b7ac17b1a9e19f685f24934c14533cbf750f7996 100644 (file)
@@ -1,3 +1,14 @@
+### Sorting
+
+Is there a way to have the generated maps sorted by *title* instead of *filename* when show=title is used?
+Thanks 
+
+-- Thiana
+
+> [[bugs/map_sorts_by_pagename_and_not_title_when_show__61__title_is_used]] --[[Joey]] 
+
+----
+
 Question: Is there a way to generate a listing that shows *both* title and description meta information? Currently, a \[\[!map ...]] shows only one of the two, but I'd like to generate a navigation that looks like a description list. For example:
 
  * This is the title meta information.
@@ -72,3 +83,15 @@ Is there any way to do that?  I don't mind mucking around with `\[[!meta]]` on e
 >>> I think that the ideas and code in
 >>> [[todo/tracking_bugs_with_dependencies]] might also handle this case.
 >>> --[[Joey]]
+
+----
+
+I feel like this should be obvious, but I can't figure out how to sort numerically. 
+
+I have `map pages="./* and !*/Discussion and !*/sidebar"`  and a bunch of pages with names like 1, 2, 3, 11, 12, 1/1.1, 12/12.3 etc. I want to sort them numerically. I see lots of conversation implying there's a simple way to do it, but not how.
+
+> No, you can't: map can't currently use a non-default sort order. If it
+> could, then you could use [[plugins/sortnaturally]]. There's a
+> [[feature_request|todo/sort_parameter_for_map_plugin_and_directive]];
+> [[a_bug_references_it|bugs/map_sorts_by_pagename_and_not_title_when_show=title_is_used]].
+> --[[smcv]]
index 557441c0b8dbe424a62657d38b156a36fba92482..5a3919dea63aeee57271fca7af4f84deff84952e 100644 (file)
@@ -23,6 +23,13 @@ Supported fields:
   be set to a true value in the template; this can be used to format things
   differently in this case.
 
+  An optional `sortas` parameter will be used preferentially when
+  [[ikiwiki/pagespec/sorting]] by `meta(title)`:
+
+       \[[!meta title="The Beatles" sortas="Beatles, The"]]
+
+       \[[!meta title="David Bowie" sortas="Bowie, David"]]
+
 * license
 
   Specifies a license for the page, for example, "GPL". Can contain
@@ -37,6 +44,11 @@ Supported fields:
 
   Specifies the author of a page.
 
+  An optional `sortas` parameter will be used preferentially when
+  [[ikiwiki/pagespec/sorting]] by `meta(author)`:
+
+       \[[!meta author="Joey Hess" sortas="Hess, Joey"]]
+
 * authorurl
 
   Specifies an url for the author of a page.
index 68f4d2734ad06f1be5c2c379a8953a3a7ac0bb51..d0e0e7be720b738859b8d6788f721b3d410ab722 100644 (file)
@@ -4,10 +4,16 @@ This directive can generate stats about how pages link to each other. It can
 produce either a tag cloud, or a table counting the number of links to each
 page.
 
-Here's how to use it to create a [[tag]] cloud:
+Here's how to use it to create a [[tag]] cloud, with tags sized based
+on frequency of use:
 
        \[[!pagestats pages="tags/*"]]
 
+Here's how to create a list of tags, sized by use as they would be in a
+cloud.
+       
+       \[[!pagestats style="list" pages="tags/*"]]
+
 And here's how to create a table of all the pages on the wiki:
 
        \[[!pagestats style="table"]]
@@ -28,4 +34,7 @@ links:
 
        \[[!pagestats style="table" show="10"]]
 
+The optional `class` parameter can be used to control the class
+of the generated tag cloud `div` or page stats `table`.
+
 [[!meta robots="noindex, follow"]]
index d72b4058db015282a51026f5bea2cbe21b1cc4b5..99029e88e6661a7d0a827300c0cdb907efa82b16 100644 (file)
@@ -13,3 +13,6 @@ Thanks
 
 > The approach that [PmWiki](http://www.pmwiki.org) takes is that it enables the optional auto-creation of (empty) pages which match a particular "group" (set of sub-pages); thus one could set all the "tags/*" pages to be auto-created, creating a new tags/foo page the first time the \[[!tag foo]] directive is used. See [[todo/auto-create_tag_pages_according_to_a_template]] for more discussion on this idea.
 > -- [[KathrynAndersen]]
+
+> Update: Ikiwiki can auto-create tags now, though it only defaults to
+> doing so when tagbase is set. --[[Joey]] 
index 8ad901c1a93b53816b444c1b3a55a9e07376ba82..401b38099b33a3c8638e3f4018b7ef4d89a82bc1 100644 (file)
@@ -1,17 +1,13 @@
 The `pagetemplate` directive is supplied by the [[!iki plugins/pagetemplate desc=pagetemplate]] plugin.
 
-This directive allows a page to be displayed using a different template than
-the default `page.tmpl` template.
+This directive allows a page to be displayed using a different
+[[template|templates]] than the default `page.tmpl` template.
 
 The page text is inserted into the template, so the template controls the
 overall look and feel of the wiki page. This is in contrast to the
 [[ikiwiki/directive/template]] directive, which allows inserting templates
 _into_ the body of a page.
 
-This directive can only reference templates that are already installed
-by the system administrator, typically into the
-`/usr/share/ikiwiki/templates` directory. Example:
-
        \[[!pagetemplate template="my_fancy.tmpl"]]
 
 [[!meta robots="noindex, follow"]]
diff --git a/doc/ikiwiki/directive/sidebar.mdwn b/doc/ikiwiki/directive/sidebar.mdwn
new file mode 100644 (file)
index 0000000..599695d
--- /dev/null
@@ -0,0 +1,20 @@
+The `sidebar` directive is supplied by the [[!iki plugins/sidebar desc=sidebar]] plugin.
+
+This directive can specify a custom sidebar to display on the page,
+overriding any sidebar that is displayed globally.
+
+If no custom sidebar content is specified, it forces the sidebar page to
+be used as the sidebar, even if the `global_sidebars` setting has been
+used to disable use of the sidebar page by default.
+
+## examples
+
+       \[[!sidebar content="""
+       This is my custom sidebar for this page.
+
+       \[[!calendar pages="posts/*"]]
+       """]]
+
+       \[[!sidebar]]
+
+[[!meta robots="noindex, follow"]]
index e27a94b7cbd2ef1868f13b0c4e2dcadf513ed71b..a6692f92c59eaa24a3414c6774e17ea1426af055 100644 (file)
@@ -6,8 +6,8 @@ or DSV (delimiter-separated values) format.
 ## examples
 
        \[[!table data="""
-       Customer|Amount
-       Fulanito|134,34
+       Customer |Amount
+       Fulanito |134,34
        Menganito|234,56
        Menganito|234,56
        """]]
@@ -42,4 +42,9 @@ cells. For example:
   as the table header. Set it to "no" to make a table without a header, or
   "column" to make the first column be the header.
 
+For tab-delimited tables (often obtained by copying and pasting from HTML
+or a spreadsheet), `delimiter` must be set to a literal tab character. These
+are difficult to type in most web browsers - copying and pasting one from
+the table data is likely to be the easiest way.
+
 [[!meta robots="noindex, follow"]]
index 64736f8cddfd0ec31ad05231a19f01e7df28dfc6..c8d9b98169fd7055b71a785786f747fea2ebc7c7 100644 (file)
@@ -19,7 +19,8 @@ instead:
 Note that if the wiki is configured to use a tagbase, then the tags will be
 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.
+grouped together out of the way. Also, since ikiwiki then knows where to put
+tags, it will automatically create tag pages when new tags are used.
 
 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
@@ -28,7 +29,7 @@ into the `link()` [[ikiwiki/PageSpec]] you use: e.g., if your tagbase is
 If you want to override the tagbase for a particular tag, you can use
 something like this:
 
-       \[[!tag ./foo]]
+       \[[!tag /foo]]
        \[[!taglink /foo]]
 
 [[!meta robots="noindex, follow"]]
index d538b69b1c5b8ae0f63f54515a17dd6f45d63bb8..6c50fa32e45e370af28c94c0a027633aa9accc21 100644 (file)
@@ -1,18 +1,87 @@
 The `template` directive is supplied by the [[!iki plugins/template desc=template]] plugin.
 
-[[Templates]] are files that can be filled out and inserted into pages in the
-wiki, by using the template directive. The directive has an `id` parameter
+The template directive allows wiki pages to be used as templates.
+These templates can be filled out and inserted into other pages in the
+wiki using the directive. The [[templates]] page lists templates
+that can be used with this directive.
+
+The directive has an `id` parameter
 that identifies the template to use. The remaining parameters are used to
 fill out the template.
 
-Example:
+## Example
 
        \[[!template id=note text="""Here is the text to insert into my note."""]]
 
 This fills out the `note` template, filling in the `text` field with
 the specified value, and inserts the result into the page.
 
-For a list of available templates, and details about how to create more,
-see the [[templates]] page.
+## Using a template
+
+Generally, a value can include any markup that would be allowed in the wiki
+page outside the template. Triple-quoting the value even allows quotes to
+be included in it. Combined with multi-line quoted values, this allows for
+large chunks of marked up text to be embedded into a template:
+
+        \[[!template id=foo name="Sally" color="green" age=8 notes="""
+        * \[[Charley]]'s sister.
+        * "I want to be an astronaut when I grow up."
+        * Really 8 and a half.
+        """]]
+
+## Creating a template
+
+The template is a regular wiki page, located in the `templates/`
+subdirectory inside the source directory of the wiki.
+
+(Alternatively, templates can be stored in a directory outside the wiki,
+as files with the extension ".tmpl".
+By default, these are searched for in `/usr/share/ikiwiki/templates`;
+the `templatedir` setting can be used to make another directory be searched
+first.)
+
+The template uses the syntax used by the [[!cpan HTML::Template]] perl
+module, which allows for some fairly complex things to be done. Consult its
+documentation for the full syntax, but all you really need to know are a
+few things:
+
+* Each parameter you pass to the template directive will generate a 
+  template variable. There are also some pre-defined variables like PAGE
+  and BASENAME.
+* To insert the value of a variable, use `<TMPL_VAR variable>`. Wiki markup
+  in the value will first be converted to html.
+* To insert the raw value of a variable, with wiki markup not yet converted
+  to html, use `<TMPL_VAR raw_variable>`.
+* To make a block of text conditional on a variable being set use
+  `<TMPL_IF variable>text</TMPL_IF>`.
+* To use one block of text if a variable is set and a second if it's not,
+  use `<TMPL_IF variable>text<TMPL_ELSE>other text</TMPL_IF>`
+
+Here's a sample template:
+
+        <span class="infobox">
+        Name: \[[<TMPL_VAR raw_name>]]<br />
+        Age: <TMPL_VAR age><br />
+        <TMPL_IF color>
+        Favorite color: <TMPL_VAR color><br />
+        <TMPL_ELSE>
+        No favorite color.<br />
+        </TMPL_IF>
+        <TMPL_IF notes>
+        <hr />
+        <TMPL_VAR notes>
+        </TMPL_IF>
+        </span>
+
+The filled out template will be formatted the same as the rest of the page
+that contains it, so you can include WikiLinks and all other forms of wiki
+markup in the template. Note though that such WikiLinks will not show up as
+backlinks to the page that uses the template.
+
+Note the use of "raw_name" inside the [[ikiwiki/WikiLink]] generator in the
+example above. This ensures that if the name contains something that might
+be mistaken for wiki markup, it's not converted to html before being
+processed as a [[ikiwiki/WikiLink]].
+
 
 [[!meta robots="noindex, follow"]]
index 3189281394192af96420536870176c2161dfbae7..2fa972ede2f72c03d758901ababb95387be5387c 100644 (file)
@@ -9,15 +9,10 @@
 that allows you to have one login that you can use on a growing number of
 websites.
 
-To sign up for an OpenID, visit one of the following identity providers:
+If you have an account with some of the larger web service providers,
+you might already have an OpenID. 
+[Directory of OpenID providers](http://openiddirectory.com/openid-providers-c-1.html)
 
-* [MyOpenID](https://www.myopenid.com/)
-* [GetOpenID](https://getopenid.com/)
-* [LiveJournal](http://www.livejournal.com/openid/)
-* [TrustBearer](https://openid.trustbearer.com/)
-* or any of the [many others out there](http://openiddirectory.com/openid-providers-c-1.html)
-
-Your OpenID is the URL that you are given when you sign up.
 [[!if test="enabled(openid)" then="""
 To sign in to this wiki using OpenID, just enter it in the OpenID field in the
 signin form. You do not need to give this wiki a password or go through any
index 5f0f44e2ebe6cf847bfe2b6c8b73d8e62ad4969b..c66395f8441397764124e4fe693a17f18dc5767a 100644 (file)
@@ -24,31 +24,35 @@ match all pages except for Discussion pages and the SandBox:
 
 Some more elaborate limits can be added to what matches using these functions:
 
+* "`glob(someglob)`" - matches pages and other files that match the given glob.
+  Just writing the glob by itself is actually a shorthand for this function.
+* "`page(glob)`" - like `glob()`, but only matches pages, not other files
 * "`link(page)`" - matches only pages that link to a given page (or glob)
 * "`tagged(tag)`" - matches pages that are tagged or link to the given tag (or
   tags matched by a glob)
 * "`backlink(page)`" - matches only pages that a given page links to
-* "`creation_month(month)`" - matches only pages created on the given month
+* "`creation_month(month)`" - matches only files created on the given month
 * "`creation_day(mday)`" - or day of the month
 * "`creation_year(year)`" - or year
-* "`created_after(page)`" - matches only pages created after the given page
+* "`created_after(page)`" - matches only files created after the given page
   was created
-* "`created_before(page)`" - matches only pages created before the given page
+* "`created_before(page)`" - matches only files created before the given page
   was created
-* "`glob(someglob)`" - matches pages that match the given glob. Just writing
-  the glob by itself is actually a shorthand for this function.
 * "`internal(glob)`" - like `glob()`, but matches even internal-use 
   pages that globs do not usually match.
 * "`title(glob)`", "`author(glob)`", "`authorurl(glob)`",
-  "`license(glob)`", "`copyright(glob)`" - match pages that have the given
-  metadata, matching the specified glob.
+  "`license(glob)`", "`copyright(glob)`", "`guid(glob)`" 
+  - match pages that have the given metadata, matching the specified glob.
 * "`user(username)`" - tests whether a modification is being made by a
   user with the specified username. If openid is enabled, an openid can also
-  be put here.
+  be put here. Glob patterns can be used in the username. For example, 
+  to match all openid users, use `user(*://*)`
 * "`admin()`" - tests whether a modification is being made by one of the
   wiki admins.
 * "`ip(address)`" - tests whether a modification is being made from the
   specified IP address.
+* "`comment(glob)`" - matches comments to a page matching the glob.
+* "`comment_pending(glob)`" - matches unmoderated, pending comments.
 * "`postcomment(glob)`" - matches only when comments are being 
   posted to a page matching the specified glob
 
index 419f00ee4284f3a0bae6305e290a1ef8d5cef95a..fa2bc58679afd9044bdab4c4b8bf1a5b16702770 100644 (file)
@@ -7,11 +7,12 @@ If attachments are enabled, the wiki admin can control what types of
 attachments will be accepted, via the `allowed_attachments`
 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 viruses, something like this could be used:
+For example, to limit most users to uploading small images, and nothing else,
+while allowing larger mp3 files to be uploaded by joey into a specific
+directory, and 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)))
+       virusfree() and ((user(joey) and podcast/*.mp3 and mimetype(audio/mpeg) and maxsize(15mb)) or (mimetype(image/*) and maxsize(50kb)))
 
 The regular [[ikiwiki/PageSpec]] syntax is expanded with the following
 additional tests:
index 4eed3722ccc744595fc8380e68e69dc9e1ad6450..4c553925a9fafbcc9df4a4c66936210e5439db7e 100644 (file)
@@ -92,3 +92,14 @@ does not seem suitable for this, as
 > \[[!map pages="./*"]]
 
 also lists the current page and all its siblings.
+
+---
+
+I am a little lost. I want to match the start page `/index.mdwn`. So I use
+
+    \[[!inline pages="/index"]]
+
+which does not work though. I also tried it in this Wiki. Just take a look at the end of the [[SandBox|sandbox]]. --[[PaulePanter]]
+
+> Unlike wikilinks, pagespecs match relative to the top of the wiki by
+> default. So lose the "/" and it will work. --[[Joey]]
index e0264dd502e4f772eda54e17df9580cd8570b62c..40ed9efb663be68814f68e46b66887dbd9b4aa55 100644 (file)
@@ -14,3 +14,5 @@ wiki:
 
 Note that every non-po page is considered to be written in
 `po_master_language`, as specified in `ikiwiki.setup`.
+
+[[!meta robots="noindex, follow"]]
index 41aa58151c20bb44ba0ee16b6e1b93eaa70cadf0..ccd7f7eaa84dc773a57003d2e38d332cc97e1a05 100644 (file)
@@ -4,8 +4,23 @@ specifying the order that matching pages are shown in. The following sort
 orders can be specified.
 
 * `age` - List pages from the most recently created to the oldest.
+
 * `mtime` - List pages with the most recently modified first.
-* `title` - Order by title.
-* `title_natural` - Only available if [[!cpan Sort::Naturally]] is
-  installed. Orders by title, but numbers in the title are treated
+
+* `title` - Order by title (page name).
+[[!if test="enabled(sortnaturally)" then="""
+* `title_natural` - Orders by title, but numbers in the title are treated
   as such, ("1 2 9 10 20" instead of "1 10 2 20 9")
+"""]]
+[[!if test="enabled(meta)" then="""
+* `meta(title)` - Order according to the `\[[!meta title="foo" sortas="bar"]]`
+  or `\[[!meta title="foo"]]` [[ikiwiki/directive]], or the page name if no
+  full title was set. `meta(author)`, `meta(date)`, `meta(updated)`, etc.
+  also work.
+"""]]
+
+In addition, you can combine several sort orders and/or reverse the order of
+sorting, with a string like `age -title` (which would sort by age, then by
+title in reverse order if two pages have the same age).
+
+[[!meta robots="noindex, follow"]]
index e047b860cabe4207b6c4385ea2611635b4633819..862f45ec1d8121ddfd8400f9feda22ebc9f3729a 100644 (file)
@@ -5,8 +5,8 @@ this page, [[SubPage]] has some related pages placed under it, like
 wiki rather than just having a great big directory full of pages.
 
 To add a SubPage, just make a subdirectory and put pages in it. For
-example, this page is SubPage.mdwn in this wiki's source, and there is also
-a SubPage subdirectory, which contains SubPage/LinkingRules.mdwn. Subpages
+example, this page is subpage.mdwn in this wiki's source, and there is also
+a subpage subdirectory, which contains subpage/linkingrules.mdwn. Subpages
 can be nested as deeply as you'd like.
 
 Linking to and from a SubPage is explained in [[LinkingRules]].
index f561d58505ee9262e8c875324d1fad4aa4fd5a93..cf3b89c763d9c2dc1feec52bc69cf05a817d13f6 100644 (file)
@@ -9,9 +9,6 @@ wikilink, just prefix it with a `\`, like `\\[[WikiLink]]`.
 There are some special [[SubPage/LinkingRules]] that come into play when
 linking between [[SubPages|SubPage]].
 
-Also, if the file linked to by a WikiLink looks like an image, it will
-be displayed inline on the page.
-
 WikiLinks are matched with page names in a case-insensitive manner, so you
 don't need to worry about getting the case the same, and can capitalise
 links at the start of a sentence, and so on.
@@ -23,14 +20,10 @@ page, but the link will appear like this: [[foo_bar|SandBox]].
 To link to an anchor inside a page, you can use something like
 `\[[WikiLink#foo]]` .
 
-## Directives and WikiLinks
-
-ikiwiki has two syntaxes for
-[[directives|directive]].  The older syntax
-used spaces to distinguish between directives and
-wikilinks; as a result, with that syntax in use, you cannot use spaces
-in WikiLinks, and must replace spaces with underscores.  The newer
-syntax, enabled with the `prefix_directives` option in an ikiwiki
-setup file, prefixes directives with `!`, and thus does not prevent
-links with spaces.  Future versions of ikiwiki will turn this option
-on by default.
+If the file linked to by a WikiLink looks like an image, it will
+be displayed inline on the page.
+
+---
+
+You can also put an url in a WikiLink, to link to an external page.
+Email addresses can also be used to generate a mailto link.
index d6df4cbf686cf551c049abfafa78673239e29aa1..89affc50273ff642bb53ce9c19feff231b5a92a6 100644 (file)
@@ -84,3 +84,8 @@ Is it possible to refer to a page, say \[[foobar]], such that the link text is t
 > Not yet. :-) Any suggestion for a syntax for it? Maybe something like \[[|foobar]] ? --[[Joey]]
 
 I like your suggestion because it's short and conscise. However, it would be nice to be able to refer to more or less arbitrary meta tags in links, not just "title". To do that, the link needs two parameters: the page name and the tag name, i.e. \[[pagename!metatag]]. Any sufficiently weird separater can be used instead of '!', of course. I like \[[pagename->metatag]], too, because it reminds me of accessing a data member of a structure (which is what referencing a meta tag is, really). --Peter
+
+> I dislike \[[pagename->metatag]] because other wikis use that as their normal link/label syntax.
+> I'm not sure that it is a good idea to refer to arbitrary meta tags in links in the first place - what other meta tags would you really be interested in?  Description?  Author?  It makes sense to me to refer to the title, because that is a "label" for a page.
+> As for syntax, I do like the \[[|foobar]] idea, or perhaps something like what <a href="http://www.pmwiki.org">PmWiki</a> does - they have their links the other way around, so they go \[[page|label]] and for link-text-as-title, they have \[[page|+]].  So for IkiWiki, that would be \[[+|page]] I guess.
+> --[[KathrynAndersen]]
index 0ebab313d0d47168b9bb2d427a2913b039e2f85c..8fb348c3d96b9565da7474efa351c08818fb9e7e 100644 (file)
@@ -40,9 +40,7 @@ Projects & Organizations
 * [Chaos Computer Club Düsseldorf](https://www.chaosdorf.de)
 * [monkeysphere](http://web.monkeysphere.info/)
 * [The Walden Effect](http://www.waldeneffect.org/)
-* The support pages for [Trinity Centre for High Performance Computing](http://www.tchpc.tcd.ie/support/)
 * [St Hugh of Lincoln Catholic Primary School in Surrey](http://www.sthugh-of-lincoln.surrey.sch.uk/)
-* [Pigro Network](http://www.pigro.net) is running a hg based ikiwiki. (And provides ikiwiki hosting for $10/m.)
 * [Cosin Homepage](http://cosin.ch) uses an Ikiwiki with a subversion repository.
 * [Bosco Free Orienteering Software](http://bosco.durcheinandertal.ch)
 * [MIT Student Information Processing Board](http://sipb.mit.edu/)
@@ -50,6 +48,12 @@ Projects & Organizations
 * [The XCB library](http://xcb.freedesktop.org/)
 * [The Philolexian Society of Columbia University](http://www.columbia.edu/cu/philo/)
 * [Fachschaft Informatik HU Berlin](http://fachschaft.informatik.hu-berlin.de/)
+* [Wetknee Books](http://www.wetknee.com/)
+* [IPOL Image Processing On Line](http://www.ipol.im)
+* [Debian Costa Rica](http://cr.debian.net/)
+* [Fvwm Wiki](http://fvwmwiki.xteddy.org)
+* [Serialist](http://serialist.net/)'s static pages (documentation, blog).  We actually have ikiwiki generate its static content as HTML fragments using a modified page.tmpl template, and then the FastCGI powering our site grabs those fragments and embeds them in the standard dynamic site template.
+* [Apua IT](http://apua.se/)
 
 Personal sites and blogs
 ========================
@@ -81,7 +85,6 @@ Personal sites and blogs
 * [Proper Treatment 正當作法](http://conway.rutgers.edu/~ccshan/wiki/)
 * [lost scraps](http://web.mornfall.net), pages/blog of Petr Ročkai aka mornfall
 * [Ronan Le Hy's blog](http://bayesien.org), in French.
-* <http://iainmclaren.com>.
 * [formorers blog and website](http://www.formorer.de/webwiki/)
 * [Mark Jaroski's blog](http://movemearound.org/)
 * I keep my personal project notes and specs in a private ikiwiki - it's the perfect tool for this task. - [the daniel](http://neoglam.com)
@@ -117,7 +120,7 @@ Personal sites and blogs
 * [[Adam_Trickett|ajt]]'s home intranet/sanbox system ([Internet site & blog](http://www.iredale.net/) -- not ikiwiki yet)
 * [[Simon_McVittie|smcv]]'s [website](http://www.pseudorandom.co.uk/) and
   [blog](http://smcv.pseudorandom.co.uk/)
-* Svend's [website](http://www.ciffer.net/~svend/) and [blog](http://www.ciffer.net/~svend/blog/)
+* Svend's [website](http://ciffer.net/~svend/) and [blog](http://ciffer.net/~svend/blog/)
 * [muammar's site](http://muammar.me)
 * [Per Bothner's blog](http://per.bothner.com/blog/)
 * [Bernd Zeimetz (bzed)](http://bzed.de/)
@@ -131,6 +134,19 @@ Personal sites and blogs
 * [Jimmy Tang - personal blog and wiki](http://www.sgenomics.org/~jtang)
 * [Nico Schottelius' homepage](http://www.nico.schottelius.org)
 * [Andreas Zwinkaus homepage](http://beza1e1.tuxen.de)
+* [Salient Dream](http://salient.dre.am)
+* [Walden Effect](http://waldeneffect.org)
+* [Avian Aqua Miser](http://www.avianaquamiser.com/)
+* [Cosmic Cookout](http://www.cosmiccookout.com/)
+* [Backyard Deer](http://www.backyarddeer.com/)
+* [Alex Ghitza homepage and blog](http://aghitza.org/)
+* [Andreas's homepage](http://0x7.ch/) - Ikiwiki, Subversion and CSS template
+* [Chris Dombroski's boring bliki](https://www.icanttype.org/)
+* [Josh Triplett's homepage](http://joshtriplett.org/) - Git backend with the CGI disabled, to publish a static site with the convenience of ikiwiki.
+* [Gustaf Thorslund's blog](http://blog.thorslund.org)
+* [Ertug Karamatli](http://pages.karamatli.com)
+* [Jonatan Walck](http://jonatan.walck.i2p/) a weblog + wiki over [I2P](http://i2p2.de/). Also [mirrored](http://jonatan.walck.se/) to the Internet a few times per day.
+* [Daniel Wayne Armstrong](http://circuidipity.com/)
 
 Please feel free to add your own ikiwiki site!
 
index 732cf7a894f96166239ef016dcfc1d36610ea5b1..06acc9cecf56ee178b488e06a136009f9f1e0938 100644 (file)
@@ -24,5 +24,5 @@ The [[forum]] is open for discussions.
 [[Bugs]], [[TODO]] items, [[wishlist]] items, and [[patches|patch]]
 can be submitted and tracked using this wiki.
 
-ikiwiki is developed by [[Joey]] and many contributors,
+Ikiwiki is developed by [[Joey]] and many contributors,
 and is [[FreeSoftware]].
diff --git a/doc/news/version_3.20091031.mdwn b/doc/news/version_3.20091031.mdwn
deleted file mode 100644 (file)
index bb77bfa..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-ikiwiki 3.20091031 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
-   * po: Fix breakage caused by changes to render code.
-   * mdwn: Avoid trying to use multimarkdown if it is not installed.
-   * moderatedcomments: New plugin to allow comment moderation w/o relying
-     on blogspam.net.
-   * When redirecting to a page, ie, after editing, ensure that the
-     url is uri-encoded. Most browsers other than MSIE don't care, but it's
-     the right thing to do.
-   * Add a spec file to allow building rpm from the source package.
-   * google: Pass the whole wiki url to google, not just the domain,
-     so that search works correctly for wikis that are located in
-     subdirectories of domains."""]]
\ No newline at end of file
diff --git a/doc/news/version_3.20091113.mdwn b/doc/news/version_3.20091113.mdwn
deleted file mode 100644 (file)
index 5791740..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-ikiwiki 3.20091113 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
-   * underlay: Fix example values put in setup file to be array
-     references.
-   * underlay: Avoid crashing if lists of underlays (or template
-     directories) are not configured.
-   * Moved the postscan hook to run on the raw html of a page, before
-     the template is filled out. This improves the search plugin's indexing,
-     since it will not include navigational elements from the page template
-     or sidebar.
-   * localstyle: New plugin, allows overrding the toplevel local.css
-     with one that is closer to a page.
-   * httpauth: Add cgiauthurl setting that can be used to do http basic auth
-     only when ikiwiki needs authentication, rather than for any access to
-     the cgi/wiki.
-   * inline: Do not generate feeds for nested inlines.
-   * inline: Allow direct inclusion of non-page files in raw mode.
-   * inline: Fix display of all pages when archive=yes or show=0 are used."""]]
diff --git a/doc/news/version_3.20091202.mdwn b/doc/news/version_3.20091202.mdwn
deleted file mode 100644 (file)
index 60f17fe..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-ikiwiki 3.20091202 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
-   * meta: Generate meta description tags even when the html scrubber is
-     enabled.
-   * meta: Allow use of DESCRIPTION in templates to get at the meta description
-     value. (Thanks, NicolasLimare)
-   * inline: Use caching of inlined pages to speed up builds of inlines that
-     include feeds. Speedup of about 25% for small inlines; could be much
-     larger for inlines of many, or complex pages.
-   * Added (incomplete) Turkish po file. Closes: #[556744](http://bugs.debian.org/556744)
-     Thanks, Recai Oktaş
-   * date: New plugin that allows inserting date directives that expand to
-     pretty-printed dates, using the same formatting as used for page
-     modification date display, etc.
-   * htmllink: Allow a title attribute to be specified.
-   * calendar: Add title attributes for all links in the calendars.
-   * calendar: Fix month wraparound error that broke in December."""]]
\ No newline at end of file
diff --git a/doc/news/version_3.20091218.mdwn b/doc/news/version_3.20091218.mdwn
deleted file mode 100644 (file)
index 224e81c..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-ikiwiki 3.20091218 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
-   * Add complete Spanish basewiki translation done by Fernando Gonzalez de
-     Requena.
-   * Improve javascript onload handling.
-   * monotone: Deal with format change in version 0.45.
-     (Thanks, Richard Levitte)
-   * cvs: Add missing bit to Automator.
-   * attachment: Fix reversion in attachment sorting by age.
-   * Fix utf-8 problems in rename, remove, attachment, 404, sourcepage, and
-     goto."""]]
\ No newline at end of file
diff --git a/doc/news/version_3.20100102.3.mdwn b/doc/news/version_3.20100102.3.mdwn
deleted file mode 100644 (file)
index b8f6197..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-ikiwiki 3.20100102.3 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
-   Happy palindrome day!
-
-   * pagestats: Add show parameter. Closes: #[562129](http://bugs.debian.org/562129) (David Paleino)
-   * toc: Add startlevel parameter. (kerravonsen)
-   * Remove example ikiwiki setup file from the Debian package. This
-     re-enables linking to /usr/share/ikiwiki/examples which has the
-     example sites also used by auto-blog.setup. The example setup file
-     can be generated at any time using ikiwiki --dumpsetup so I do
-     not see a reason to ship it. Closes: #[562183](http://bugs.debian.org/562183)
-   * Use env hack in python scripts.
-   * comments: Add a checksum to the name of comment pages, to
-     avoid merge conflicts when comments are posted to two branches of a
-     site.
-   * linkmap: Add option to omit disconnected pages from the map.
-   * inline: Fix bug that limited displayed pages when feedshow was
-     specified w/o show.
-   * Fix several places that did not properly handle capitalization of
-     the discussionpage setting. Specifically, fixes discussion actions
-     on discussion pages, and unbreaks the opendiscussion plugin."""]]
diff --git a/doc/news/version_3.20100515.mdwn b/doc/news/version_3.20100515.mdwn
new file mode 100644 (file)
index 0000000..043346c
--- /dev/null
@@ -0,0 +1,58 @@
+News for ikiwiki 3.20100515:
+
+   There are two significant changes to the page.tmpl template in this version.
+   If you have a locally modified version of that template, you will need to
+   update it at least to contain the following in the HTML `<head>`:
+
+       <TMPL_IF DYNAMIC>
+       <TMPL_IF FORCEBASEURL><base href="<TMPL_VAR FORCEBASEURL>" /><TMPL_ELSE>
+       <TMPL_IF BASEURL><base href="<TMPL_VAR BASEURL>" /></TMPL_IF>
+       </TMPL_IF>
+       </TMPL_IF>
+
+   Also, the footer should be wrapped in `<TMPL_UNLESS DYNAMIC> ... </TMPL_UNLESS>`
+
+   There is a new "comment()" pagespec, that can be used to match a
+   comment on a page. It is recommended to use it instead of the old
+   method of using a pagespec such as "internal(comment\_*)" to match
+   things that looked like comments. The old pagespec will now also match
+   comments that are held for moderation; likely not what you want.
+
+   There have also been some changes to the style.css in this version,
+   particularly to support the new openid selector. If you have a modified
+   version, of style.css, updating it (or moving it to local.css) is
+   recommended.
+
+ikiwiki 3.20100515 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+   * Removed misc.tmpl. Now to theme ikiwiki, you only need to customise
+     a single template, page.tmpl.
+   * If you have a locally customised page.tmpl, it needs to be updated
+     to set &lt;base&gt; when BASEURL or FORCEBASEURL is set.
+   * comments: Comments pending moderation are now stored in the srcdir
+     alongside accepted comments, but with a `._comment_pending` extension.
+     This allows easier byhand moderation, as the "\_pending" need
+     only be stripped off and the comment be committed to version control.
+   * The `comment_pending()` pagespec can be used to match such unmoderated
+     comments, which makes it easy to add a feed of them, or a counter
+     indicating how many there are.
+   * Belatedly added a `comment()` pagespec.
+   * Gave comment and page editing forms some CSS and accessability love.
+   * Renamed postscan hook to indexhtml, to reflect its changed position,
+     and typical use.
+   * inline: Call indexhtml when inlining internal pages, so their
+     text can be indexed for searching.
+   * Delete hooks are passed deleted internal pages.
+   * openid: Incorporated a fancy openid-selector signin form.
+     (Based on <http://code.google.com/p/openid-selector/>)
+   * openid: Use "openid\_identifier" as the form field, as required
+     by OpenID Authentication v2.0 spec.
+   * Removed the openidsignup option. Instead, my recommendation is to
+     leave passwordauth enabled and let people who don't have an openid use it.
+     The openid selector form avoids the UI annoyance of having both openid
+     and passwordauth on one form.
+   * calendar: Allow negative month to be specified. -1 is last month, etc.
+     (And also negative years.)
+   * calendar: Display year in title of month calendar.
+   * Use xhtml friendly pubdate setting.
+   * remove, rename: Add guards against XSRF attacks."""]]
diff --git a/doc/news/version_3.20100518.2.mdwn b/doc/news/version_3.20100518.2.mdwn
new file mode 100644 (file)
index 0000000..64ce3f8
--- /dev/null
@@ -0,0 +1,3 @@
+ikiwiki 3.20100518.2 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+   * Fix a typo in the last release."""]]
\ No newline at end of file
diff --git a/doc/news/version_3.20100518.mdwn b/doc/news/version_3.20100518.mdwn
new file mode 100644 (file)
index 0000000..f622a4b
--- /dev/null
@@ -0,0 +1,6 @@
+ikiwiki 3.20100518 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+   * page.tmpl: Accidentially broke po plugin's otherlanguages list styling
+     when modifying for html5; now fixed.
+   * Fix a bug that prevented matching deleted comments, and so did not update
+     pages that had contained them."""]]
\ No newline at end of file
diff --git a/doc/news/version_3.20100610.mdwn b/doc/news/version_3.20100610.mdwn
new file mode 100644 (file)
index 0000000..ee7c86d
--- /dev/null
@@ -0,0 +1,18 @@
+ikiwiki 3.20100610 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+   * creation\_day() etc use local time, not gmtime. To match calendars, which
+     use local time.
+   * img: Fill in missing height or width when scaling image.
+   * Remove example blog tag pages; allow autotag creation to create them
+     when used.
+   * Fix support for globbing in tagged() pagespecs.
+   * Fix display of sidebar when previewing page edit. (Thanks, privat)
+   * relativedate: Fix problem with localised dates not working.
+   * editpage: Avoid storing accidental state changes when previewing pages.
+   * page.tmpl: Add a div around the page content, and comments, to aide in
+     sidebar styling.
+   * style.css: Improvements to make floating sidebar fit much better on
+     pages with inlines.
+   * calendar: Shorten day names, and improve styling of month calendar.
+   * style.css: Reduced sidebar width back to 20ex from 30; the month calendar
+     will now fit in the smaller width, and 30 was feeling too large."""]]
\ No newline at end of file
diff --git a/doc/news/version_3.20100623.mdwn b/doc/news/version_3.20100623.mdwn
new file mode 100644 (file)
index 0000000..684217e
--- /dev/null
@@ -0,0 +1,29 @@
+ikiwiki 3.20100623 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+   * openid: Add openid\_realm and openid\_cgiurl configuration options,
+     useful in a few edge case setups.
+   * attachment: Show files from underlay in attachments list.
+   * img: Support hspace and vspace attributes.
+   * editpage: Rename "comments" field to avoid CSS conflict with the
+     comments div.
+   * edittemplate: Make silent mode not disable display when the template
+     page does not exist, so it can be easily created.
+   * edittemplate: Look for template pages under templates/ like everything
+     else (still looks in old location for backwards compatibility).
+   * attachment: When inserting links, insert img directives for images,
+     if that plugin is enabled.
+   * websetup: Allow enabling plugins listed in disable\_plugins.
+   * editpage, comments: Fix broken links in sidebar (due to forcebaseurl).
+     (Thanks, privat)
+   * calendar: Tune archive\_pagespec to only match pages, not other files.
+   * Fix issues with combining unicode srcdirs and source files.
+     (Workaround bug #586045)
+   * Make --gettime be honored after initial setup.
+   * git: Fix --gettime to properly support utf8 filenames.
+   * attachment: Support Windows paths when taking basename of client-supplied
+     file name.
+   * theme: New plugin, allows easily themeing a site via the underlay.
+   * Added actiontabs theme by Svend Sorensen.
+   * Added blueview theme by Bernd Zeimetz.
+   * mercurial: Fix buggy getctime code. Closes: #[586279](http://bugs.debian.org/586279)
+   * link: Enhanced to handle URLs and email addresses. (Bernd Zeimetz)"""]]
\ No newline at end of file
diff --git a/doc/peteg.mdwn b/doc/peteg.mdwn
new file mode 100644 (file)
index 0000000..4e2face
--- /dev/null
@@ -0,0 +1,7 @@
+I'm adding some plugins to Ikiwiki to support a bioacoustic wiki. See here:
+
+<http://bioacoustics.cse.unsw.edu.au/wiki/>
+
+Personal home page:
+
+<http://peteg.org/>
index 697b4a21964c884703bf616c6626fb82ba4b1f1d..0bea3359237992fa1e3ddd57322e8f2986d6c74a 100644 (file)
@@ -14,4 +14,4 @@ will fit most uses of ikiwiki.
 ## Plugin directory
 
 [[!map pages="plugins/* and !plugins/type/* and !plugins/write and 
-!plugins/write/* and !plugins/contrib and !plugins/install and !*/Discussion"]]
+!plugins/write/* and !plugins/contrib and !plugins/contrib/*/* and !plugins/install and !*/Discussion"]]
index ad332ee04341ad189ff01c7f4786f7a335553441..53dace3c90800c4aa3e5c9d1807c70fadc9c7b43 100644 (file)
@@ -1,5 +1,5 @@
 [[!template id=plugin name=404 author="[[Simon_McVittie|smcv]]"]]
-[[!tag type/useful]]
+[[!tag type/web]]
 
 This plugin lets you use the IkiWiki CGI script as an Apache 404 handler,
 to give the behaviour of various other wiki engines where visiting a
index e2efcd83f1d67dc17481f5cd2b2534329290a445..bb828b05ca6a660ba9abe260d6c91f6feb0c07e6 100644 (file)
@@ -1,5 +1,5 @@
 [[!template id=plugin name=aggregate author="[[Joey]]"]]
-[[!tag type/useful]]
+[[!tag type/special-purpose]]
 
 This plugin allows content from other feeds to be aggregated into the
 wiki. To specify feeds to aggregate, use the
index 03e2d12f3bac00a47942441420b28c3cf12a1821..7c4e40419a6d8b6bd792a92300e520e08ed73c7a 100644 (file)
@@ -1,7 +1,7 @@
 [[!template id=plugin name=autoindex core=0 author="[[Joey]]"]]
-[[!tag type/useful]]
+[[!tag type/special-purpose]]
 
 This plugin searches for [[SubPages|ikiwiki/subpage]] with a missing parent
 page, and generates the parent pages. The generated page content is
-controlled by the `autoindex.tmpl` [[template|wikitemplates]], which by
+controlled by the `autoindex.tmpl` [[template|templates]], which by
 default, uses a [[map]] to list the SubPages.
index bc1bc6c716b6101ecd36c1bab472e8d03668b042..76e718a3b231d70c3e1b8c28d608c49be225e4fc 100644 (file)
@@ -1,5 +1,5 @@
 [[!template id=plugin name=calendar author="[[ManojSrivastava]]"]]
-[[!tag type/chrome]]
+[[!tag type/widget]]
 
 This plugin provides a [[ikiwiki/directive/calendar]] [[ikiwiki/directive]].
 The directive displays a calendar, similar to the typical calendars shown on
@@ -14,6 +14,7 @@ customization.
 
 * `month-calendar` - The month calendar as a whole.
 * `month-calendar-head` - The head of the month calendar (ie,"March").
+* `month-calendar-arrow` - Arrow pointing to previous/next month.
 * `month-calendar-day-head` - A column head in the month calendar (ie, a
   day-of-week abbreviation).
 * `month-calendar-day-noday`, `month-calendar-day-link`,
@@ -27,6 +28,7 @@ customization.
   weekends.
 * `year-calendar` - The year calendar as a whole.
 * `year-calendar-head` - The head of the year calendar (ie, "2007").
+* `year-calendar-arrow` - Arrow pointing to previous/next year.
 * `year-calendar-subhead` - For example, "Months".
 * `year-calendar-month-link`, `year-calendar-month-nolink`,
   `year-calendar-month-future`, `year-calendar-this-month` - The month
index 9d57b7a1e6526d12846816f71531808be10940dd..bb76a9d8be426418815074aa0c0ae5db3ac68658 100644 (file)
@@ -1,6 +1,15 @@
 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]]
 
+> I agree, but I have not come up with good html to display them. Seems 
+> it might need some sort of popup.
+
 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]]
+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]]
+
+> Great idea! Just implemented that and also relative years. --[[Joey]] 
index dbb8b870cd66f216598f4bc46333a47724feff35..d639bf56377b14855b9e71d9ff8d631d31b4b243 100644 (file)
@@ -1,5 +1,5 @@
 [[!template id=plugin name=color core=0 author="[[ptecza]]"]]
-[[!tag type/chrome]]
+[[!tag type/widget]]
 
 This plugin provides a [[ikiwiki/directive/color]] [[ikiwiki/directive]].
 The directive can be used to color a piece of text on a page.
index b6d4d252bd3954265405a9e16815593b0d443e07..14bd28a048cb3f1ba4ee6eb66cd9772723e3ea17 100644 (file)
@@ -1,5 +1,5 @@
 [[!template id=plugin name=comments author="[[Simon_McVittie|smcv]]"]]
-[[!tag type/useful]]
+[[!tag type/web]]
 
 This plugin adds "blog-style" comments. Unlike the wiki-style freeform 
 Discussion pages, these comments are posted by a simple form, cannot later
@@ -14,8 +14,8 @@ 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.
+[[opendiscussion]], [[lockedit]] and [[anonok]] pages for details on locking
+down a wiki so readers 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
@@ -49,5 +49,5 @@ held for moderation. (Or with the [[moderatedcomments]] plugin, all
 comments will be held.) Wiki admins can access the comment moderation queue
 via a button on their Preferences page.
 
-The comments are stored in `.ikiwiki/comments_pending/`, and can be
-deleted, or moved into the wiki's srcdir to be posted.
+The unmoderated comments are stored in the `srcdir` with a filename ending
+in "._comment_pending". They are not checked into revision control.
index 95ffb2764ebc7f2fcba3ec0cd6ad28d079f7c361..27a99bb7cc0ce0ab77973077c8f05822cfcf7d97 100644 (file)
@@ -1,5 +1,5 @@
 [[!template id=plugin name=conditional core=1 author="[[Joey]]"]]
-[[!tag type/format]]
+[[!tag type/special-purpose]]
 
 This plugin provides the [[ikiwiki/directive/if]] [[ikiwiki/directive]].
 With this directive, you can make text be conditionally displayed on a page.
index 629d05940e438c1d4ced78fc3b6cc39d7a35caa2..6e84fdfc1907eb46c3ed376a58f29b38d30d6039 100644 (file)
@@ -1,3 +1,28 @@
+## Conditional broken?
+
+Using \[\[!if test="tagged(plugin)" then="= Tagged as plugin =" else="*No plugins found*"]] on this wiki *should* present the 'Tagged as plugin' heading, instead it emits 'no plugins found'. Is the conditional plugin currently broken for tags or am I misusing it? Thanks.
+
+-- Thiana
+
+> This wiki has no page named "plugin", so nothing links to it; tags are a species of link
+> so tagging a large number of pages with a tag that doesn't exist (which change has
+> been reverted) doesn't make the pagespec match. It would if the tag's page existed. --[[Joey]]
+
+>> So if I understand this correctly... Assuming the tags Tag_A and Tag_B, the existence of 
+>> @wiki-home@/tags/Tag_A.creole, and a number of files with a \[\[!tag Tag_A Tag_B]] the 
+>> following is correct?
+>>
+>> * \[\[!if test="tagged(Tag_A)" then="OK" else="Fail"]] => OK
+>> * \[\[!if test="tagged(Tag_B)" then="OK" else="Fail"]] => Fail
+>> * \[\[!if test="tagged(Tag_A) and tagged(Tag_B)" then="OK" else="Fail"]] => Fail
+>>
+>> Is that the expected behaviour? If so, that's not what I'm seeing here since they all result 
+>> in a Fail. If not, what exactly is wrong with those conditionals? Thanks.
+>>
+>> -- Thiana 
+
+----
+
 Would there be a way for this plugin to emit fewer blank lines (i.e. *none at all*)?
 
 For example, having a look at [this page](http://www.bddebian.com/~wiki/Hurd/)'s sidebar.
index ac6c1b75134d65c035c22642a82e19d72c0ff3eb..d8199a756ec7447dee42de248869e2d4a0af7e54 100644 (file)
@@ -1,4 +1,4 @@
 These plugins are provided by third parties and are not currently
 included in ikiwiki. See [[install]] for installation help.
 
-[[!map pages="plugins/contrib/* and !*/Discussion"]]
+[[!map pages="plugins/contrib/* and !plugins/contrib/*/* and !*/Discussion"]]
index 395c99bcecdc57b626c2c175bb166a6e3d5173da..3cfcb68d4095e1817e4d335f85256ffb27083683 100644 (file)
@@ -9,9 +9,11 @@ thoughts about this plugin).
 This plugin formats a collection of images into a photo album,
 in the same way as many websites: good examples include the
 PHP application [Gallery](http://gallery.menalto.com/), Flickr,
-and Facebook's Photos "application". I've called it `album`
-to distinguish it from [[contrib/gallery|plugins/contrib/gallery]],
-although `gallery` might well be a better name for this functionality.
+and Facebook's Photos "application".
+
+I've called it `album` to distinguish it from
+[[contrib/gallery|plugins/contrib/gallery]], although `gallery` might well be
+a better name for this functionality.
 
 The web UI I'm trying to achieve consists of one
 [HTML page of thumbnails](http://www.pseudorandom.co.uk/2008/2008-03-08-panic-cell-gig/)
@@ -26,83 +28,129 @@ individual photos can't be bookmarked in a meaningful way, and
 the best it can do as a fallback for non-Javascript browsers
 is to provide a direct link to the image.)
 
-## Writing the viewers
+<h2 id="album"><code>album</code> directive</h2>
+
+Each page containing an `album` directive is treated as a photo album.
+
+Every image attached to an album or its subpages is considered to be part of
+the album. A "viewer" page, with the wiki's default page extension, will be
+generated to display the image, if there isn't already a page of the same
+name as the image: for instance, if `debconf` is an album and
+`debconf/tuesday/p100.jpg` exists, then `debconf/tuesday/p100.mdwn` might
+be created.
+
+There's currently a hard-coded list of extensions that are treated as images:
+`png`, `gif`, `jpg`, `jpeg` or `mov` files. More image and video types could
+be added in future. Videos aren't currently handled very well;
+ideally, something like totem-video-thumbnailer would be used.
+
+The `album` directive also produces an [[ikiwiki/directive/inline]] which
+automatically includes all the viewers for this album, except those that
+will appear in an <a href="#albumsection">albumsection</a> (if every image
+is in a section, then the `album` directive won't have any visible effect).
 
-    \[[!albumimage image=foo.jpg album=myalbum
-        title=...
-        caption=...
-        copyright=...
-        size=...
-        viewertemplate=...
-    ]]
+The `inline` is in `archive` and `quick` mode, but can include some
+extra information about the images, including file size and a thumbnail made
+using [[ikiwiki/directive/img]]). The default template is `albumitem.tmpl`,
+which takes advantage of these things.
 
-Each viewer contains one `\[[!albumimage]]` directive. This
-sets the `image` filename, the `album` in which this image appears,
-and an optional `caption`, and can override the `size` at which to
-display the image and the `viewertemplate` to use to display the
-image.
+<h2 id="albumsection"><code>albumsection</code> directive</h2>
 
-It can also have `title`, `copyright` and `date` parameters, which
-are short-cuts for [[ikiwiki/directive/meta]] directives.
+The `albumsection` directive is used to split an album into sections. It can
+only appear on a page that also has the <a href="#album">album</a> directive.
+
+The `filter` parameter is a [[ikiwiki/PageSpec]] against which viewer pages
+are matched. The `albumsection` directive displays all the images that match
+the filter, and the `album` directive displays any leftover images, like
+this:
+
+    # Holiday photos
+
+    \[[!album]]
+    <!-- replaced with a list of any uncategorized photos, which might be
+         empty -->
 
-The viewer can also have any other content, but typically the
-directive will be the only thing there.
+    ## People
 
-Eventually, there will be a specialized CGI user interface to
-edit all the photos of an album at once, upload a new photo
-(which will attach the photo but also write out a viewer page
-for it), or mark an already-uploaded photo as a member of an
-album (which is done by writing out a viewer page for it).
+    \[[!albumsection filter="tagged(people)"]]
+    <!-- replaced with a list of photos tagged 'people', including
+         any that are also tagged 'landscapes' -->
 
-The `\[[!albumimage]]` directive is replaced by an
+    ## Landscapes
+
+    \[[!albumsection filter="tagged(landscapes)"]]
+    <!-- replaced with a list of photos tagged 'landscapes', including
+         any that are also tagged 'people' -->
+
+<h2 id="albumimage"><code>albumimage</code> directive</h2>
+
+Each viewer page produced by the <a href="#album">album</a> directive
+contains an `albumimage` directive, which is replaced by an
 [[ikiwiki/directive/img]], wrapped in some formatting using a
-template (by default `albumviewer.tmpl`). The template can (and
-should) also include "next photo", "previous photo" and
-"up to gallery" links.
+template (by default it's `albumviewer.tmpl`). That template can also include
+links to the next photo, the previous photo and the album it's in; the default
+template has all of these.
 
-The next/previous links are themselves implemented by
-[[inlining|ikiwiki/directive/inline]] the next or previous
-photo, using a special template (by default `albumnext.tmpl`
-or `albumprev.tmpl`), in `archive`/`quick` mode.
+The next/previous links are themselves implemented by evaluating a template,
+either `albumnext.tmpl` or `albumprev.tmpl` by default.
 
-> With hindsight, using an inline here is wrong - I should just
-> run hooks and fill in the template within the album plugin.
-> inline has some specialized functionality that's overkill
-> here, and its delayed HTML substitution breaks the ability
-> to have previous/up/next links both above and below the
-> photo, for instance. --[[smcv]]
+The directive can also have parameters:
 
-## Writing the album
+* `title`, `copyright` and `date` are short-cuts for the corresponding
+  [[ikiwiki/directive/meta]] directives
 
-The album contains one `\[[!album]]` directive. It may also
-contain any number of `\[[!albumsection]]` directives, for
-example the demo album linked above could look like:
+* `caption` sets a caption which is displayed in the album and viewer
+  pages
 
-    \[[!album]]
-    <!-- replaced with one uncategorized photo -->
+The viewer page can also have other contents before or after the actual
+image viewer.
+
+## Bugs
+
+* The plugin doesn't do anything special to handle albums that are subpages
+  of each other. If, say, `debconf` and `debconf/monday` are both albums,
+  then `debconf/monday/p100.jpg` will currently be assigned to one or the
+  other, arbitrarily.
+
+* The plugin doesn't do anything special to handle photos with similar names.
+  If you have `p100.jpg` and `p100.png`, one will get a viewer page called
+  `p100` and the other will be ignored.
+
+* If there's no `albumimage` in a viewer page, one should probably be appended
+  automatically.
 
-    ## Gamarra
+## TODO
 
-    \[[!albumsection filter="link(gamarra)"]]
-    <!-- all the Gamarra photos -->
+* The documentation should mention how to replicate the appearance of
+  `album` and `albumsection` using an `inline` of viewer pages.
 
-    ## Smokescreen
+* The documentation should mention all the template variables and
+  all the parameters.
 
-    \[[!albumsection filter="link(smokescreen)"]]
-    <!-- all the Smokescreen photos -->
+* The generated viewer page should include most or all of the possible
+  parameters to the `albumimage` directive, with empty values, as a
+  template for editing.
 
-    ...
+* The generated viewer page should extract as much metadata as possible from
+  the photo's EXIF tags (creation/modification dates, author, title, caption,
+  copyright). [[smcv]] has a half-written implementation which runs
+  `scanimage` hooks, and has an `exiftool` plugin using [[!cpan Image::ExifTool]]
+  as a reference implementation of that hook.
 
-The `\[[!album]]` directive is replaced by an
-[[ikiwiki/directive/inline]] which automatically includes every
-page that has an `\[[!albumimage]]` directive linking it to this
-album, except those that will appear in an `\[[!albumsection]]`.
+* There should be an option to reduce the size of photos and write them into
+  an underlay, for this workflow:
 
-The `inline` is in `archive`/`quick` mode, but includes some
-extra information about the images, including file size and a
-thumbnail (again, made using [[ikiwiki/directive/img]]). The
-default template is `albumitem.tmpl`, which takes advantage
-of these things.
+  * your laptop's local ikiwiki has two underlays, `photos` and `webphotos`
+  * `photos` contains full resolution photos with EXIF tags
+  * for each photo that exists in `photos` but not in `webphotos`, the album
+    plugin automatically resamples it down to a web-compatible resolution
+    ([[smcv]] uses up to 640x640), optimizes it with `jpegoptim`, strips out
+    all EXIF tags, and and writes it into the corresponding location
+    in `webphotos`
+  * `webphotos` is what you rsync to the web server
+  * the web server's ikiwiki only has `webphotos` as an underlay
 
-Each `\[[!albumsection]]` is replaced by a similar inline, which
-selects a subset of the photos in the album.
+* Eventually, there could be a specialized CGI user interface to batch-edit
+  all the photos of an album (so for each photo, you get an edit box each for
+  title, author, copyright etc.) - this would work by making programmatic
+  edits to all the `albumimage` directives.
index 9720589b46cf4c488a552b4c4678cddf160274d2..0356860d8302389156a6b0a2d639645284dd8570 100644 (file)
@@ -46,6 +46,10 @@ secondly: barring the CGI interface for editing the album, which would be great,
 >
 > --[[smcv]]
 
+>> In the current version of the branch, the viewer pages are
+>> generated automatically if you didn't generate them yourself,
+>> so `ikiwiki-album` is no longer needed. --[[smcv]]
+
 i'm new to ikiwiki, apologies if this is dealt with elsewhere.  -brush
 
 > This plugin is pretty ambitious, and is unfinished, so I'd recommend
@@ -80,6 +84,10 @@ code or tried it yet, but here goes. --[[Joey]]
 >> an image with a strange extension to a differing target filename
 >> with the normal extension, respectively). -s
 
+>>> Now that we have `add_autofile` I can just create viewer pages
+>>> whenever there's an image to view. The current version of the
+>>> branch does that. -s
+
 * With each viewer page having next/prev links, I can see how you
   were having the scalability issues with ikiwiki's data structures
   earlier! -J
@@ -94,6 +102,8 @@ code or tried it yet, but here goes. --[[Joey]]
 >> (Unless you use img to make the thumbnails for those links, then it
 >> would rebuild the thumbnails anyway. Have not looked at the code.) --[[Joey]]
 
+>>> I do use img. -s
+
 * And doesn't each viewer page really depend on every other page in the
   same albumsection? If a new page is added, the next/prev links
   may need to be updated, for example. If so, there will be much
@@ -142,13 +152,20 @@ code or tried it yet, but here goes. --[[Joey]]
 > one album: if they're subpages of 2+ nested albums then they're only
 > considered to be in the deepest-nested one (i.e. longest URL), and if
 > they're not in any album then that's a usage error. This would
-> also make prev/next links sane.
->
+> also make prev/next links sane. -s
+
+>> The current version constrains images to be in at most one album,
+>> choosing one arbitrarily (dependent on scan order) if albums are
+>> nested. -s
+
 > If you want to reference images from elsewhere in the wiki and display
 > them as if in an album, then you can use an ordinary inline with
 > the same template that the album would use, and I'll make sure the
-> templates are set up so this works.
->
+> templates are set up so this works. -s
+
+>> Still needs documenting, I've put it on the TODO list on the main
+>> page. -s
+
 > (Implementation detail: this means that an image X/Y/Z/W/V, where X and
 > Y are albums, Z does not exist and W exists but is not an album,
 > would have a content dependency on Y, a presence dependency on Z
@@ -158,6 +175,12 @@ code or tried it yet, but here goes. --[[Joey]]
 > subpages of the album, although that would mean breaking some URLs
 > on the existing website I'm doing all this work for... -s
 
+>> The current version of the branch doesn't have this restriction;
+>> perhaps it's a worthwhile simplification, or perhaps it's too
+>> restrictive? I fairly often use directory hierarchies like
+>> `a_festival/saturday/foo.jpg` within an album, which makes
+>> it very easy to write `albumsection` filters. -s
+
 * Putting a few of the above thoughts together, my ideal album system
   seems to be one where I can just drop the images into a directory and
   have them appear in the album index, as well as each generate their own wiki
@@ -195,6 +218,10 @@ code or tried it yet, but here goes. --[[Joey]]
 >> upload-and-rename.
 >> -s
 
+>>> I believe the current branch meets your requirements, by having
+>>> first-class wiki pages spring into existence using `add_autofile`
+>>> to be viewer pages for photos. -s
+
 > In a way, what you really want for metadata is to have it in the album
 > page, so you can batch-edit the whole lot by editing one file (this
 > does mean that editing the album necessarily causes each of its viewers
@@ -214,6 +241,9 @@ code or tried it yet, but here goes. --[[Joey]]
 >> (That's apparently good enough for Bugzilla, but not really
 >> for ikiwiki). -s
 
+>>> This is now in the main page's TODO list; if/when I implement this,
+>>> I intend to make it a specialized CGI interface. -s
+
 >> Yes, [all metadata in one file] would make some sense.. It also allows putting one image in
 >> two albums, with different caption etc. (Maybe for different audiences.)
 >> --[[Joey]]
@@ -229,7 +259,8 @@ code or tried it yet, but here goes. --[[Joey]]
 
 ----
 
-Trying to use the "special extension" design:
+'''I think the "special extension" design is a dead-end, but here's what
+happened when I tried to work out how it would work. --[[smcv]]'''
 
 Suppose that each viewer is a JPEG-or-GIF-or-something, with extension
 ".albumimage". We have a gallery "memes" with three images, badger,
index a43bf24b29007e63b1b00ada8a4b7deba67ab94a..dce2d891c9083c9da9e24a2ecadf41ab32a3214a 100644 (file)
@@ -13,6 +13,22 @@ IkiWiki::Plugin::field - front-end for per-page record fields.
     # simple registration
     field_register => [qw{meta}],
 
+    # simple registration with priority
+    field_register => {
+       meta => 'last'
+       foo => 'DD'
+    },
+
+    # allow the config to be queried as a field
+    field_allow_config => 1,
+
+    # flag certain fields as "tags"
+    field_tags => {
+       BookAuthor => '/books/authors',
+       BookGenre => '/books/genres',
+       MovieGenre => '/movies/genres',
+    }
+
 ## DESCRIPTION
 
 This plugin is meant to be used in conjunction with other plugins
@@ -22,35 +38,99 @@ are fields in that record.  This can include the meta-data for that page,
 such as the page title.
 
 Plugins can register a function which will return the value of a "field" for
-a given page.  This can be used in three ways:
+a given page.  This can be used in a few ways:
 
 * In page templates; all registered fields will be passed to the page template in the "pagetemplate" processing.
 * In PageSpecs; the "field" function can be used to match the value of a field in a page.
+* In SortSpecs; the "field" function can be used for sorting pages by the value of a field in a page.
 * By other plugins, using the field_get_value function, to get the value of a field for a page, and do with it what they will.
 
-## OPTIONS
+## CONFIGURATION OPTIONS
 
 The following options can be set in the ikiwiki setup file.
 
+**field_allow_config**
+
+    field_allow_config => 1,
+
+Allow the $config hash to be queried like any other field; the 
+keys of the config hash are the field names.
+
 **field_register**
 
-A list of plugin-IDs to register.  This assumes that the plugins in
-question store data in the %pagestatus hash using the ID of that plugin,
-and thus the field values are looked for there.
+    field_register => [qw{meta}],
+
+    field_register => {
+       meta => 'last'
+       foo => 'DD'
+    },
+
+A hash of plugin-IDs to register.  The keys of the hash are the names of the
+plugins, and the values of the hash give the order of lookup of the field
+values.  The order can be 'first', 'last', 'middle', or an explicit order
+sequence between 'AA' and 'ZZ'.  If the simpler type of registration is used,
+then the order will be 'middle'.
+
+This assumes that the plugins in question store data in the %pagestatus hash
+using the ID of that plugin, and thus the field values are looked for there.
 
 This is the simplest form of registration, but the advantage is that it
 doesn't require the plugin to be modified in order for it to be
 registered with the "field" plugin.
 
-## PageSpec
+**field_tags**
+
+    field_tags => {
+       BookAuthor => '/books/authors',
+       BookGenre => '/books/genres',
+       MovieGenre => '/movies/genres',
+    }
 
-The "field" PageSpec function can be used to match the value of a field for a page.
+A hash of fields and their associated pages.  This provides a faceted
+tagging system.
 
-field(*name* *glob*)
+The way this works is that a given field-name will be associated with a given
+page, and the values of that field will be linked to sub-pages of that page.
 
 For example:
 
-field(bar Foo*) will match if the "bar" field starts with "Foo".
+       BookGenre: SF
+
+will link to "/books/genres/SF", with a link-type of "bookgenre".
+
+## PageSpec
+
+The `field` plugin provides a few PageSpec functions to match values
+of fields for pages.
+
+* field
+  * **field(*name* *glob*)**
+  * field(bar Foo\*) will match if the "bar" field starts with "Foo".
+* destfield
+  * **destfield(*name* *glob*)**
+  * as for "field" but matches against the destination page (i.e when the source page is being included in another page).
+* field_item
+  * **field_item(*name* *glob*)**
+  * field_item(bar Foo) will match if one of the values of the "bar" field is "Foo".
+* destfield_item
+  * **destfield_item(*name* *glob*)**
+  * as for "field_item" but matches against the destination page.
+* field_tagged
+  * **field_tagged(*name* *glob*)**
+  * like `tagged`, but this uses the tag-bases and link-types defined in the `field_tags` configuration option.
+* destfield_tagged
+  * **destfield_tagged(*name* *glob*)**
+  * as for "field_tagged" but matches against the destination page.
+
+## SortSpec
+
+The "field" SortSpec function can be used to sort a page depending on the value of a field for that page.  This is used for directives that take sort parameters, such as **inline** or **report**.
+
+field(*name*)
+
+For example:
+
+sort="field(bar)" will sort by the value og the "bar" field.
 
 ## FUNCTIONS
 
@@ -58,16 +138,18 @@ field(bar Foo*) will match if the "bar" field starts with "Foo".
 
 field_register(id=>$id);
 
-Register a plugin as having field data.  The above form is the simplest, where the field value
-is looked up in the %pagestatus hash under the plugin-id.
+Register a plugin as having field data.  The above form is the simplest, where
+the field value is looked up in the %pagestatus hash under the plugin-id.
 
 Additional Options:
 
 **call=>&myfunc**
 
-A reference to a function to call rather than just looking up the value in the %pagestatus hash.
-It takes two arguments: the name of the field, and the name of the page.  It is expected to return
-the value of that field, or undef if there is no field by that name.
+A reference to a function to call rather than just looking up the value in the
+%pagestatus hash.  It takes two arguments: the name of the field, and the name
+of the page.  It is expected to return (a) an array of the values of that field
+if "wantarray" is true, or (b) a concatenation of the values of that field
+if "wantarray" is not true, or (c) undef if there is no field by that name.
 
     sub myfunc ($$) {
        my $field = shift;
@@ -75,22 +157,38 @@ the value of that field, or undef if there is no field by that name.
 
        ...
 
-       return $value;
+       return (wantarray ? @values : $value);
     }
 
 **first=>1**
 
-Set this to be called first in the sequence of calls looking for values.  Since the first found
-value is the one which is returned, ordering is significant.
+Set this to be called first in the sequence of calls looking for values.  Since
+the first found value is the one which is returned, ordering is significant.
+This is equivalent to "order=>'first'".
 
 **last=>1**
 
-Set this to be called last in the sequence of calls looking for values.  Since the first found
-value is the one which is returned, ordering is significant.
+Set this to be called last in the sequence of calls looking for values.  Since
+the first found value is the one which is returned, ordering is significant.
+This is equivalent to "order=>'last'".
+
+**order=>$order**
+
+Set the explicit ordering in the sequence of calls looking for values.  Since
+the first found value is the one which is returned, ordering is significant.
+
+The values allowed for this are "first", "last", "middle", or a two-character
+ordering-sequence between 'AA' and 'ZZ'.
 
 ### field_get_value($field, $page)
 
-Returns the value of the field for that page, or undef if none is found.
+    my @values = field_get_value($field, $page);
+
+    my $value = field_get_value($field, $page);
+
+Returns the values of the field for that page, or undef if none is found.
+Note that it will return an array of values if you ask for an array,
+and a scalar value if you ask for a scalar.
 
 ## DOWNLOAD
 
diff --git a/doc/plugins/contrib/field/discussion.mdwn b/doc/plugins/contrib/field/discussion.mdwn
new file mode 100644 (file)
index 0000000..103e061
--- /dev/null
@@ -0,0 +1,326 @@
+Having tried out `field`, some comments (from [[smcv]]):
+
+The general concept looks great.
+
+The `pagetemplate` hook seems quite namespace-polluting: on a site containing
+a list of books, I'd like to have an `author` field, but that would collide
+with IkiWiki's use of `<TMPL_VAR AUTHOR>` for the author of the *page*
+(i.e. me). Perhaps it'd be better if the pagetemplate hook was only active for
+`<TMPL_VAR FIELD_AUTHOR>` or something? (For those who want the current
+behaviour, an auxiliary plugin would be easy.)
+
+> No, please.  The idea is to be *able* to override field names if one wishes to, and choose, for yourself, non-colliding field names if one wishes not to.  I don't wish to lose the power of being able to, say, define a page title with YAML format if I want to, or to write a site-specific plugin which calculates a page title, or other nifty things.
+>It's not like one is going to lose the fields defined by the meta plugin; if "author" is defined by \[[!meta author=...]] then that's what will be found by "field" (provided the "meta" plugin is registered; that's what the "field_register" option is for).
+>--[[KathrynAndersen]]
+
+>> Hmm. I suppose if you put the title (or whatever) in the YAML, then
+>> "almost" all the places in IkiWiki that respect titles will do the
+>> right thing due to the pagetemplate hook, with the exception being
+>> anything that has special side-effects inside `meta` (like `date`),
+>> or anything that looks in `$pagestate{foo}{meta}` directly
+>> (like `map`). Is your plan that `meta` should register itself by
+>> default, and `map` and friends should be adapted to
+>> work based on `getfield()` instead of `$pagestate{foo}{meta}`, then?
+
+>>> Based on `field_get_value()`, yes.  That would be my ideal.  Do you think I should implement that as an ikiwiki branch? --[[KathrynAndersen]]
+
+>>>> This doesn't solve cases where certain fields are treated specially; for
+>>>> instance, putting a `\[[!meta permalink]]` on a page is not the same as
+>>>> putting it in `ymlfront` (in the latter case you won't get your
+>>>> `<link>` header), and putting `\[[!meta date]]` is not the same as putting
+>>>> `date` in `ymlfront` (in the latter case, `%pagectime` won't be changed).
+>>>>
+>>>> One way to resolve that would be to have `ymlfront`, or similar, be a
+>>>> front-end for `meta` rather than for `field`, and call
+>>>> `IkiWiki::Plugin::meta::preprocess` (or a refactored-out function that's
+>>>> similar).
+>>>>
+>>>> There are also some cross-site scripting issues (see below)... --[[smcv]]
+
+>> (On the site I mentioned, I'm using an unmodified version of `field`,
+>> and currently working around the collision by tagging books' pages
+>> with `bookauthor` instead of `author` in the YAML.) --s
+
+>> Revisiting this after more thought, the problem here is similar to the
+>> possibility that a wiki user adds a `meta` shortcut
+>> to [[shortcuts]], or conversely, that a plugin adds a `cpan` directive
+>> that conflicts with the `cpan` shortcut that pages already use. (In the
+>> case of shortcuts, this is resolved by having plugin-defined directives
+>> always win.) For plugin-defined meta keywords this is the plugin
+>> author's/wiki admin's problem - just don't enable conflicting plugins! -
+>> but it gets scary when you start introducing things like `ymlfront`, which
+>> allow arbitrary, wiki-user-defined fields, even ones that subvert
+>> other plugins' assumptions.
+>>
+>> The `pagetemplate` hook is particularly alarming because page templates are
+>> evaluated in many contexts, not all of which are subject to the
+>> htmlscrubber or escaping; because the output from `field` isn't filtered,
+>> prefixed or delimited, when combined with an arbitrary-key-setting plugin
+>> like `ymlfront` it can interfere with other plugins' expectations
+>> and potentially cause cross-site scripting exploits. For instance, `inline`
+>> has a `pagetemplate` hook which defines the `FEEDLINKS` template variable
+>> to be a blob of HTML to put in the `<head>` of the page. As a result, this
+>> YAML would be bad:
+>>
+>>     ---
+>>     FEEDLINKS: <script>alert('code injection detected')</script>
+>>     ---
+>>
+>> (It might require a different case combination due to implementation
+>> details, I'm not sure.)
+>>
+>> It's difficult for `field` to do anything about this, because it doesn't
+>> know whether a field is meant to be plain text, HTML, a URL, or something
+>> else.
+>>
+>> If `field`'s `pagetemplate` hook did something more limiting - like
+>> only emitting template variables starting with `field_`, or from some
+>> finite set, or something - then this would cease to be a problem, I think?
+>>
+>> `ftemplate` and `getfield` don't have this problem, as far as I can see,
+>> because their output is in contexts where the user could equally well have
+>> written raw HTML directly; the user can cause themselves confusion, but
+>> can't cause harmful output. --[[smcv]]
+
+From a coding style point of view, the `$CamelCase` variable names aren't
+IkiWiki style, and the `match_foo` functions look as though they could benefit
+from being thin wrappers around a common `&IkiWiki::Plugin::field::match`
+function (see `meta` for a similar approach).
+
+I think the documentation would probably be clearer in a less manpage-like
+and more ikiwiki-like style?
+
+> I don't think ikiwiki *has* a "style" for docs, does it?  So I followed the Perl Module style. And I'm rather baffled as to why having the docs laid out in clear sections... make them less clear. --[[KathrynAndersen]]
+
+>> I keep getting distracted by the big shouty headings :-)
+>> I suppose what I was really getting at was that when this plugin
+>> is merged, its docs will end up split between its plugin
+>> page, [[plugins/write]] and [[ikiwiki/PageSpec]]; on some of the
+>> contrib plugins I've added I've tried to separate the docs
+>> according to how they'll hopefully be laid out after merge. --s
+
+If one of my branches from [[todo/allow_plugins_to_add_sorting_methods]] is
+accepted, a `field()` cmp type would mean that [[plugins/contrib/report]] can
+stop reimplementing sorting. Here's the implementation I'm using, with
+your "sortspec" concept (a sort-hook would be very similar): if merged,
+I think it should just be part of `field` rather than a separate plugin.
+
+       # Copyright © 2010 Simon McVittie, released under GNU GPL >= 2
+       package IkiWiki::Plugin::fieldsort;
+       use warnings;
+       use strict;
+       use IkiWiki 3.00;
+       use IkiWiki::Plugin::field;
+
+       sub import {
+               hook(type => "getsetup", id => "fieldsort",  call => \&getsetup);
+       }
+
+       sub getsetup () {
+               return
+                       plugin => {
+                               safe => 1,
+                               rebuild => undef,
+                       },
+       }
+
+       package IkiWiki::SortSpec;
+
+       sub cmp_field {
+               if (!length $_[0]) {
+                       error("sort=field requires a parameter");
+               }
+
+               my $left = IkiWiki::Plugin::field::field_get_value($_[0], $a);
+               my $right = IkiWiki::Plugin::field::field_get_value($_[0], $b);
+
+               $left = "" unless defined $left;
+               $right = "" unless defined $right;
+               return $left cmp $right;
+       }
+
+       1;
+
+----
+
+Disclaimer: I've only looked at this plugin and ymlfront, not other related
+stuff yet. (I quite like ymlfront, so I looked at this as its dependency. :)
+I also don't want to annoy you with a lot of design discussion 
+if your main goal was to write a plugin that did exactly what you wanted.
+
+My first question is: Why we need another plugin storing metadata
+about the page, when we already have the meta plugin? Much of the
+complication around the field plugin has to do with it accessing info
+belonging to the meta plugin, and generalizing that to be able to access
+info stored by other plugins too. (But I don't see any other plugins that
+currently store such info). Then too, it raises points of confusion like
+smcv's discuission of field author vs meta author above. --[[Joey]] 
+
+> The point is exactly in the generalization, to provide a uniform interface for accessing structured data, no matter what the source of it, whether that be the meta plugin or some other plugin.
+
+> There were a few reasons for this:
+
+>1. In converting my site over from PmWiki, I needed something that was equivalent to PmWiki's Page-Text-Variables (which is how PmWiki implements structured data).
+>2. I also wanted an equivalent of PmWiki's Page-Variables, which, rather than being simple variables, are the return-value of a function.  This gives one a lot of power, because one can do calculations, derive one thing from another.  Heck, just being able to have a "basename" variable is useful.
+>3. I noticed that in the discussion about structured data, it was mired down in disagreements about what form the structured data should take; I wanted to overcome that hurdle by decoupling the form from the content.
+>4. I actually use this to solve (1), because, while I do use ymlfront, initially my pages were in PmWiki format (I wrote (another) unreleased plugin which parses PmWiki format) including PmWiki's Page-Text-Variables for structured data.  So I needed something that could deal with multiple formats.
+
+> So, yes, it does cater to mostly my personal needs, but I think it is more generally useful, also.
+> --[[KathrynAndersen]]
+
+>> Is it fair to say, then, that `field`'s purpose is to take other
+>> plugins' arbitrary per-page data, and present it as a single
+>> merged/flattened string => string map per page? From the plugins
+>> here, things you then use that merged map for include:
+>>
+>> * sorting - stolen by [[todo/allow_plugins_to_add_sorting_methods]]
+>> * substitution into pages with Perl-like syntax - `getfield`
+>> * substitution into wiki-defined templates - the `pagetemplate`
+>>   hook
+>> * substitution into user-defined templates - `ftemplate`
+>>
+>> As I mentioned above, the flattening can cause collisions (and in the
+>> `pagetemplate` case, even security problems).
+>>
+>> I wonder whether conflating Page Text Variables with Page Variables
+>> causes `field` to be more general than it needs to be?
+>> To define a Page Variable (function-like field), you need to write
+>> a plugin containing that Perl function; if we assume that `field`
+>> or something resembling it gets merged into ikiwiki, then it's
+>> reasonable to expect third-party plugins to integrate with whatever
+>> scaffolding there is for these (either in an enabled-by-default
+>> plugin that most people are expected to leave enabled, like `meta`
+>> now, or in the core), and it doesn't seem onerous to expect each
+>> plugin that wants to participate in this mechanism to have code to
+>> do so. While it's still contrib, `field` could just have a special case
+>> for the meta plugin, rather than the converse?
+>>
+>> If Page Text Variables are limited to being simple strings as you
+>> suggest over in [[forum/an_alternative_approach_to_structured_data]],
+>> then they're functionally similar to `meta` fields, so one way to
+>> get their functionality would be to extend `meta` so that
+>>
+>>     \[[!meta badger="mushroom"]]
+>>
+>> (for an unrecognised keyword `badger`) would store
+>> `$pagestate{$page}{meta}{badger} = "mushroom"`? Getting this to
+>> appear in templates might be problematic, because a naive
+>> `pagetemplate` hook would have the same problem that `field` combined
+>> with `ymlfront` currently does.
+>>
+>> One disadvantage that would appear if the function-like and
+>> meta-like fields weren't in the same namespace would be that it
+>> wouldn't be possible to switch a field from being meta-like to being
+>> function-like without changing any wiki content that referenced it.
+>>
+>> Perhaps meta-like fields should just *be* `meta` (with the above
+>> enhancement), as a trivial case of function-like fields? That would
+>> turn `ymlfront` into an alternative syntax for `meta`, I think?
+>> That, in turn, would hopefully solve the special-fields problem,
+>> by just delegating it to meta. I've been glad of the ability to define
+>> new ad-hoc fields with this plugin without having to write an extra plugin
+>> to do so (listing books with a `bookauthor` and sorting them by
+>> `"field(bookauthor) title"`), but that'd be just as easy if `meta`
+>> accepted ad-hoc fields?
+>>
+>> --[[smcv]]
+
+>>> Your point above about cross-site scripting is a valid one, and something I
+>>> hadn't thought of (oops).
+
+>>> I still want to be able to populate pagetemplate templates with field, because I
+>>> use it for a number of things, such as setting which CSS files to use for a
+>>> given page, and, as I said, for titles.  But apart from the titles, I
+>>> realize I've been setting them in places other than the page data itself.
+>>> (Another unreleased plugin, `concon`, uses Config::Context to be able to
+>>> set variables on a per-site, per-directory and a per-page basis).
+
+>>> The first possible solution is what you suggested above: for field to only
+>>> set values in pagetemplate which are prefixed with *field_*.  I don't think
+>>> this is quite satisfactory, since that would still mean that people could
+>>> put un-scrubbed values into a pagetemplate, albeit they would be values
+>>> named field_foo, etc. --[[KathrynAndersen]]
+
+>>>> They can already do similar; `PERMALINK` is pre-sanitized to
+>>>> ensure that it's a "safe" URL, but if an extremely confused wiki admin was
+>>>> to put `COPYRIGHT` in their RSS/Atom feed's `<link>`, a malicious user
+>>>> could put an unsafe (e.g. Javascript) URL in there (`COPYRIGHT` *is*
+>>>> HTML-scrubbed, but "javascript:alert('pwned!')" is just text as far as a
+>>>> HTML sanitizer is concerned, so it passes straight through). The solution
+>>>> is to not use variables in situations where that variable would be
+>>>> inappropriate. Because `field` is so generic, the definition of what's
+>>>> appropriate is difficult. --[[smcv]]
+
+>>> An alternative solution would be to classify field registration as "secure"
+>>> and "insecure".  Sources such as ymlfront would be insecure, sources such
+>>> as concon (or the $config hash) would be secure, since they can't be edited
+>>> as pages.  Then, when doing pagetemplate substitution (but not ftemplate
+>>> substitution) the insecure sources could be HTML-escaped.
+>>> --[[KathrynAndersen]]
+
+>>>> Whether you trust the supplier of data seems orthogonal to whether its value
+>>>> is (meant to be) interpreted as plain text, HTML, a URL or what?
+>>>>
+>>>> Even in cases where you trust the supplier, you need to escape things
+>>>> suitably for the context, not for security but for correctness. The
+>>>> definition of the value, and the context it's being used in, changes the
+>>>> processing you need to do. An incomplete list:
+>>>>
+>>>> * HTML used as HTML needs to be html-scrubbed if and only if untrusted
+>>>> * URLs used as URLs need to be put through `safeurl()` if and only if
+>>>>   untrusted
+>>>> * HTML used as plain text needs tags removed regardless
+>>>> * URLs used as plain text are safe
+>>>> * URLs or plain text used in HTML need HTML-escaping (and URLs also need
+>>>>   `safeurl()` if untrusted)
+>>>> * HTML or plain text used in URLs need URL-escaping (and the resulting
+>>>>   URL might need sanitizing too?)
+>>>>
+>>>> I can't immediately think of other data types we'd be interested in beyond
+>>>> text, HTML and URL, but I'm sure there are plenty.
+
+>>>>> But isn't this a problem with anything that uses pagetemplates?  Or is
+>>>>> the point that, with plugins other than `field`, they all know,
+>>>>> beforehand, the names of all the fields that they are dealing with, and
+>>>>> thus the writer of the plugin knows which treatment each particular field
+>>>>> needs?  For example, that `meta` knows that `title` needs to be
+>>>>> HTML-escaped, and that `baseurl` doesn't.  In that case, yes, I see the problem.
+>>>>> It's a tricky one.  It isn't as if there's only ever going to be a fixed set of fields that need different treatment, either.  Because the site admin is free to add whatever fields they like to the page template (if they aren't using the default one, that is.  I'm not using the default one myself).
+>>>>> Mind you, for trusted sources, since the person writing the page template and the person providing the variable are the same, they themselves would know whether the value will be treated as HTML, plain text, or a URL, and thus could do the needed escaping themselves when writing down the value.
+
+>>>>> Looking at the content of the default `page.tmpl` let's see what variables fall into which categories:
+
+>>>>> * **Used as URL:** BASEURL, EDITURL, PARENTLINKS->URL, RECENTCHANGESURL, HISTORYURL, GETSOURCEURL, PREFSURL, OTHERLANGUAGES->URL, ADDCOMMENTURL, BACKLINKS->URL, MORE_BACKLINKS->URL
+>>>>> * **Used as part of a URL:** FAVICON, LOCAL_CSS
+>>>>> * **Needs to be HTML-escaped:** TITLE
+>>>>> * **Used as-is (as HTML):** FEEDLINKS, RELVCS, META, PERCENTTRANSLATED, SEARCHFORM, COMMENTSLINK, DISCUSSIONLINK, OTHERLANGUAGES->PERCENT, SIDEBAR, CONTENT, COMMENTS, TAGS->LINK, COPYRIGHT, LICENSE, MTIME, EXTRAFOOTER
+
+>>>>> This looks as if only TITLE needs HTML-escaping all the time, and that the URLS all end with "URL" in their name.  Unfortunately the FAVICON and LOCAL_CSS which are part of URLS don't have "URL" in their name, though that's fair enough, since they aren't full URLs.
+
+>>>>>  --K.A.
+
+>>>> One reasonable option would be to declare that `field` takes text-valued
+>>>> fields, in which case either consumers need to escape
+>>>> it with `<TMPL_VAR FIELD_FOO ESCAPE=HTML>`, and not interpret it as a URL
+>>>> without first checking `safeurl`), or the pagetemplate hook needs to
+>>>> pre-escape.
+
+>>>>> Since HTML::Template does have the ability to do ESCAPE=HTML/URL/JS, why not take advantage of that? Some things, like TITLE, probably should have ESCAPE=HTML all the time; that would solve the "to escape or not to escape" problem that `meta` has with titles. After all, when one *sorts* by title, one doesn't really want HTML-escaping in it; only when one uses it in a template. -- K.A.
+
+>>>> Another reasonable option would be to declare that `field` takes raw HTML,
+>>>> in which case consumers need to only use it in contexts that will be
+>>>> HTML-scrubbed (but it becomes unsuitable for using as text - problematic
+>>>> for text-based things like sorting or URLs, and not ideal for searching).
+>>>>
+>>>> You could even let each consumer choose how it's going to use the field,
+>>>> by having the `foo` field generate `TEXT_FOO` and `HTML_FOO` variables?
+>>>> --[[smcv]]
+
+>>>>> Something similar is already done in `template` and `ftemplate` with the `raw_` prefix, which determines whether the variable should have `htmlize` run over it first before the value is applied to the template.  Of course, that isn't scrubbing or escaping, because with those templates, the scrubbing is done afterwards as part of the normal processing.
+
+>>> Another problem, as you point out, is special-case fields, such as a number of
+>>> those defined by `meta`, which have side-effects associated with them, more
+>>> than just providing a value to pagetemplate.  Perhaps `meta` should deal with
+>>> the side-effects, but use `field` as an interface to get the values of those special fields.
+
+>>> --[[KathrynAndersen]]
diff --git a/doc/plugins/contrib/flattr.mdwn b/doc/plugins/contrib/flattr.mdwn
new file mode 100644 (file)
index 0000000..f8f005c
--- /dev/null
@@ -0,0 +1,45 @@
+[[!template id=plugin name=flattr author="[[jaywalk]]"]]
+
+[flattr.com](http://flattr.com/) is a flatrate micropayment service, which revolves around the idea of having flattr buttons everywhere that people visiting your site can use to "flattr" you.
+
+This plugin makes it easier to put flattr buttons in ikiwiki. It supports both the static kind as well as the counting dynamic javascript version. The dynamic version does not work if [[htmlscrubber|/plugins/htmlscrubber]] is active on the page.
+
+The dynamic button does not require creation of the page on flattr before being added to a page, the static one does.
+
+I wrote some notes on [jonatan.walck.se](http://jonatan.walck.se/software/ikiwiki/plugin/flattr/) and put the source here: [flattr.pm](http://jonatan.walck.se/software/ikiwiki/flattr.pm)
+
+This plugin is licensed under [CC0](http://creativecommons.org/publicdomain/zero/1.0/) (public domain).
+
+# Usage #
+
+    # [[!flattr args]] where args are in the form of arg=value.
+    # Possible args:
+    # type - static or dynamic. Defaults to static.
+
+    # vars in static mode:
+    # --------------------
+    # Required:
+    # url - URL to flattr page,
+    # e.g. http://flattr.com/thing/1994/jaywalks-weblog
+    # Optional: 
+    # style - Set to compact for compact button.
+
+    # vars in dynamic mode:
+    # ---------------------
+    # Required:
+    # None.
+    # Optional:
+    # uid - Set the default in the plugin, override if needed.
+    # title - The title defaults to $wikiname/some/path (like on the top of
+    #   the wiki).
+    # desc - A description of the content. Defaults to " ".
+    # cat - Category, this can be text, images, video, audio, software or
+    #   rest. Defaults to text.
+    # lang - Language, list of available choises is on
+    #   https://flattr.com/support/integrate/languages. Defaults to en_GB.
+    # tag - A list of comma separated tags. Empty per default.
+    # url - URL to thing to flattred,
+    #   e.g. http://jonatan.walck.se/weblog
+    # style - Set it to compact to get the small button, big for any other
+    #   value including empty.
+    
diff --git a/doc/plugins/contrib/flattr/discussion.mdwn b/doc/plugins/contrib/flattr/discussion.mdwn
new file mode 100644 (file)
index 0000000..586139e
--- /dev/null
@@ -0,0 +1,9 @@
+FWIW, it is possible for a plugin like this to add javascript to pages that
+are protected by htmlscrubber. Just return a token in your preprocess hook,
+and then have a format hook that replaces the token with the javascript.
+--[[Joey]] 
+
+> Thanks, That's good to know. I'll try to continue the development of this
+> plugin later, for now I just needed it to work. :) It will most likely
+> evolve as my page does too.
+> --[[jaywalk]]
diff --git a/doc/plugins/contrib/ftemplate.mdwn b/doc/plugins/contrib/ftemplate.mdwn
new file mode 100644 (file)
index 0000000..d82867f
--- /dev/null
@@ -0,0 +1,25 @@
+[[!template id=plugin name=ftemplate author="[[rubykat]]"]]
+[[!tag type/meta type/format]]
+
+This plugin provides the [[ikiwiki/directive/ftemplate]] directive.
+
+This is like the [[ikiwiki/directive/template]] directive, with the addition
+that one does not have to provide all the values in the call to the template,
+because ftemplate can query structured data ("fields") using the [[field]]
+plugin.
+
+## Activate the plugin
+
+    add_plugins => [qw{goodstuff ftemplate ....}],
+
+## PREREQUISITES
+
+    IkiWiki
+    IkiWiki::Plugin::field
+    HTML::Template
+    Encode
+
+## DOWNLOAD
+
+* browse at GitHub: <http://github.com/rubykat/ikiplugins/blob/master/IkiWiki/Plugin/ftemplate.pm>
+* git repo at git://github.com/rubykat/ikiplugins.git
diff --git a/doc/plugins/contrib/ftemplate/discussion.mdwn b/doc/plugins/contrib/ftemplate/discussion.mdwn
new file mode 100644 (file)
index 0000000..1e0bca5
--- /dev/null
@@ -0,0 +1,33 @@
+I initially thought this wasn't actually necessary - the combination
+of [[plugins/template]] with [[plugins/contrib/field]]'s `pagetemplate`
+hook ought to provide the same functionality. However, `template`
+doesn't run `pagetemplate` hooks; a more general version of this
+plugin would be to have a variant of `template` that runs `pagetemplate`
+hooks (probably easiest to just patch `template` to implement a
+second directive, or have a special parameter `run_hooks="yes"`,
+or something).
+
+> I got the impression that `pagetemplate` hooks are intended to be completely independent of `template` variables; page-template is for the actual `page.tmpl` template, while `template` is for other templates which are used inside the page content.  So I don't understand why one would need a run_hooks option. --[[KathrynAndersen]]
+
+>> `Render`, `inline`, `comments` and `recentchanges` run `pagetemplate`
+>> hooks, as does anything that uses `IkiWiki::misctemplate`. From that
+>> quick survey, it seems as though `template` is the only thing that
+>> uses `HTML::Template` but *doesn't* run `pagetemplate` hooks?
+>>
+>> It just seems strange to me that `field` needs to have its own
+>> variant of `template` (this), its own variant of `inline` (`report`),
+>> and so on - I'd tend to lean more towards having `field`
+>> enhance the existing plugins. I'm not an ikiwiki committer,
+>> mind... Joey, your opinion would be appreciated! --[[smcv]]
+
+>>> I did it that way basically because I needed the functionality ASAP, and I didn't want to step on anyone's toes, so I made them as separate plugins.  If Joey wants to integrate the functionality into IkiWiki proper, I would be very happy, but I don't want to put pressure on him. --[[KathrynAndersen]]
+
+Another missing thing is that `ftemplate` looks in
+the "system" templates directories, not just in the wiki, but that
+seems orthogonal (and might be a good enhancement to `template` anyway).
+--[[smcv]]
+
+> Yes, I added that because I wanted the option of not having to make all my templates work as wiki pages also. --[[KathrynAndersen]]
+
+>> Joey has added support for
+>> [[todo/user-defined_templates_outside_the_wiki]] now. --s
diff --git a/doc/plugins/contrib/ftemplate/ikiwiki/directive/ftemplate.mdwn b/doc/plugins/contrib/ftemplate/ikiwiki/directive/ftemplate.mdwn
new file mode 100644 (file)
index 0000000..3009fc8
--- /dev/null
@@ -0,0 +1,106 @@
+The `ftemplate` directive is supplied by the [[!iki plugins/contrib/ftemplate desc=ftemplate]] plugin.
+
+This is like the [[ikiwiki/directive/template]] directive, with the addition
+that one does not have to provide all the values in the call to the template,
+because ftemplate can query structured data ("fields") using the
+[[plugins/contrib/field]] plugin.
+
+Templates are files that can be filled out and inserted into pages in
+the wiki, by using the ftemplate directive. The directive has an id
+parameter that identifies the template to use.
+
+Additional parameters can be used to fill out the template, in
+addition to the "field" values.  Passed-in values override the
+"field" values.
+
+There are two places where template files can live.  One is in the /templates
+directory on the wiki.  These templates are wiki pages, and can be edited from
+the web like other wiki pages.
+
+The second place where template files can live is in the global
+templates directory (the same place where the page.tmpl template lives).
+This is a useful place to put template files if you want to prevent
+them being edited from the web, and you don't want to have to make
+them work as wiki pages.
+
+### EXAMPLES
+
+#### Example 1
+
+PageA:
+
+    \[[!meta title="I Am Page A"]]
+    \[[!meta description="A is for Apple."]]
+    \[[!meta author="Fred Nurk"]]
+    \[[!ftemplate id="mytemplate"]]
+
+Template "mytemplate":
+
+    # <TMPL_VAR NAME="TITLE">
+    by <TMPL_VAR NAME="AUTHOR">
+
+    **Summary:** <TMPL_VAR NAME="DESCRIPTION">
+
+This will give:
+
+    <h1>I Am Page A</h1>
+    <p>by Fred Nurk</p>
+    <p><strong>Summary:</strong> A is for Apple.
+
+#### Example 2: Overriding values
+
+PageB:
+
+    \[[!meta title="I Am Page B"]]
+    \[[!meta description="B is for Banana."]]
+    \[[!meta author="Fred Nurk"]]
+    \[[!ftemplate id="mytemplate" title="Bananananananas"]]
+
+This will give:
+
+    <h1>Bananananananas</h1>
+    <p>by Fred Nurk</p>
+    <p><strong>Summary:</strong> B is for Banana.
+
+#### Example 3: Loops
+
+(this example uses the [[plugins/contrib/ymlfront]] plugin)
+
+Page C:
+
+    ---
+    BookAuthor: Georgette Heyer
+    BookTitle: Black Sheep
+    BookGenre:
+      - Historical
+      - Romance
+    ---
+    \[[ftemplate id="footemplate"]]
+
+    I like this book.
+
+Template "footemplate":
+
+    # <TMPL_VAR BOOKTITLE>
+    by <TMPL_VAR BOOKAUTHOR>
+
+    <TMPL_IF BOOKGENRE>(
+    <TMPL_LOOP GENRE_LOOP><TMPL_VAR BOOKGENRE>
+    <TMPL_UNLESS __last__>, </TMPL_UNLESS>
+    </TMPL_LOOP>
+    )</TMPL_IF>
+
+This will give:
+
+    <h1>Black Sheep</h1>
+    <p>by Georgette Heyer</p>
+
+    <p>(Historical, Romance)</p>
+
+    <p>I like this book.</p>
+
+### LIMITATIONS
+
+One cannot query the values of fields on pages other than the current
+page.  If you want to do that, check out the [[plugins/contrib/report]]
+plugin.
diff --git a/doc/plugins/contrib/getfield.mdwn b/doc/plugins/contrib/getfield.mdwn
new file mode 100644 (file)
index 0000000..0a92894
--- /dev/null
@@ -0,0 +1,131 @@
+[[!template id=plugin name=getfield author="[[rubykat]]"]]
+[[!tag type/meta type/format]]
+[[!toc]]
+## NAME
+
+IkiWiki::Plugin::getfield - query the values of fields
+
+## SYNOPSIS
+
+    # activate the plugin
+    add_plugins => [qw{goodstuff getfield ....}],
+
+## DESCRIPTION
+
+This plugin provides a way of querying the meta-data (data fields) of a page
+inside the page content (rather than inside a template) This provides a way to
+use per-page structured data, where each page is treated like a record, and the
+structured data are fields in that record.  This can include the meta-data for
+that page, such as the page title.
+
+This plugin is meant to be used in conjunction with the [[field]] plugin.
+
+### USAGE
+
+One can get the value of a field by using special markup in the page.
+This does not use directive markup, in order to make it easier to
+use the markup inside other directives.  There are four forms:
+
+* {{$*fieldname*}}
+
+  This queries the value of *fieldname* for the source page.
+
+  For example:
+
+       \[[!meta title="My Long and Complicated Title With Potential For Spelling Mistakes"]]
+       # {{$title}}
+
+  When the page is processed, this will give you:
+
+       <h1>My Long and Complicated Title With Potential For Spelling Mistakes</h1>
+
+* {{$*pagename*#*fieldname*}}
+
+  This queries the value of *fieldname* for the page *pagename*.
+
+  For example:
+
+  On PageFoo:
+
+    \[[!meta title="I Am Page Foo"]]
+
+    Stuff about Foo.
+
+  On PageBar:
+
+    For more info, see \[[{{$PageFoo#title}}|PageFoo]].
+
+  When PageBar is displayed:
+
+    &lt;p&gt;For more info, see &lt;a href="PageFoo"&gt;I Am Page Foo&lt;/a&gt;.&lt;/p&gt;
+
+* {{+$*fieldname*+}}
+
+  This queries the value of *fieldname* for the destination page; that is,
+  the value when this page is included inside another page.
+
+  For example:
+
+  On PageA:
+
+       \[[!meta title="I Am Page A"]]
+       # {{+$title+}}
+
+       Stuff about A.
+
+  On PageB:
+
+       \[[!meta title="I Am Page B"]]
+       \[[!inline pagespec="PageA"]]
+
+  When PageA is displayed:
+
+       <h1>I Am Page A</h1>
+       <p>Stuff about A.</p>
+
+  When PageB is displayed:
+
+       <h1>I Am Page B</h1>
+       <p>Stuff about A.</p>
+
+* {{+$*pagename*#*fieldname*+}}
+
+  This queries the value of *fieldname* for the page *pagename*; the
+  only difference between this and {{$*pagename*#*fieldname*}} is
+  that the full name of *pagename* is calculated relative to the
+  destination page rather than the source page.
+
+  I can't really think of a reason why this should be needed, but
+  this format has been added for completeness.
+
+### No Value Found
+
+If no value is found for the given field, then the field name is returned.
+
+For example:
+
+On PageFoo:
+
+    \[[!meta title="Foo"]]
+    My title is {{$title}}.
+    
+    My description is {{$description}}.
+
+When PageFoo is displayed:
+
+    <p>My title is Foo.</p>
+    
+    <p>My description is description.</p>
+
+This is because "description" hasn't been defined for that page.
+
+### More Examples
+
+Listing all the sub-pages of the current page:
+
+    \[[!map pages="{{$page}}/*"]]
+
+## DOWNLOAD
+
+* browse at GitHub: <http://github.com/rubykat/ikiplugins/blob/master/IkiWiki/Plugin/getfield.pm>
+* git repo at git://github.com/rubykat/ikiplugins.git
diff --git a/doc/plugins/contrib/getfield/discussion.mdwn b/doc/plugins/contrib/getfield/discussion.mdwn
new file mode 100644 (file)
index 0000000..5f7fffe
--- /dev/null
@@ -0,0 +1,32 @@
+## Templating, and other uses
+
+Like you mentioned in [[ftemplate]] IIRC, it'll only work on the same page. If it can be made to work anywhere, or from a specific place in the wiki - configurable, possibly - you'll have something very similar to mediawiki's templates. I can already think of a few uses for this combined with [[template]] ;) . --[[SR|users/simonraven]]
+
+> Yes, I mentioned "only current page" in the "LIMITATIONS" section.
+
+> What do you think would be a good syntax for querying other pages?
+> It needs to resolve to a single page, though I guess using "bestlink" to find the closest page would mean that one didn't have to spell out the whole page.
+
+>> I don't know the internals very well, I think that's how other plugins do it. *goes to check* Usually it's a `foreach` loop, and use a `pagestate{foo}` to check the page's status/state. There's also some stuff like 'pagespec_match_list($params{page}` ... they do slightly different thing depending on need. --[[SR|users/simonraven]]
+
+>>> No, I meant what markup I should use; the actual implementation probably wouldn't be too difficult.
+
+>>> The current markup is {{$*fieldname*}}; what you're wanting, perhaps it should be represented like {{$*pagename*:*fieldname*}}, or {{$*pagename*::*fieldname*}} or something else...
+>>> -- [[KathrynAndersen]]
+
+>>>> Oh. Hmm. I like your idea actually, or alternately, in keeping more with other plugins, doing it like {{pagename/fieldname}}. The meaning of the separator is less clear with /, but avoids potential issues with filename clashes that have a colon in them. It also keeps a certain logic - at least to me. Either way, I think both are good choices. [[SR|users/simonraven]]
+
+>>>>> What about using {{pagename#fieldname}}? The meaning of the hash in URLs sort of fits with what is needed here (reference to a 'named' thing within the page) and it won't conflict with actual hash usages (unless we expect different named parts of pages to define different values for the same field ...)
+>>>>> -- [[Oblomov]]
+>>>>>> That's a good one too. --[[simonraven]]
+>>>>>>> Done!  I used {{$*pagename*#*fieldname*}} for the format. -- [[users/KathrynAndersen]]
+
+
+> I'm also working on a "report" plugin, which will basically apply a template like [[ftemplate]] does, but to a list of pages given from a pagespec, rather than the current page.
+
+> -- [[users/KathrynAndersen]]
+
+>> Ooh, sounds nice :) . --[[SR|users/simonraven]]
+
+>>> I've now released the [[plugins/contrib/report]] plugin.  I've been using it on my site; the holdup on releasing was because I hadn't yet written the docs for it. I hope you find it useful.
+>>> -- [[users/KathrynAndersen]]
index 8abb76583b58f156986d7d00d0c3dcb15d603538..f1df204bb75cd7c2e436bfa7e75e9b0bb2a4419c 100644 (file)
@@ -1,6 +1,8 @@
 [[!template id=plugin name=highlightcode author="[[sabr]]"]]
 [[!tag type/format]]
 
+(An alternative to this plugin, [[plugins/highlight]], is now provided with IkiWiki. --[[smcv]])
+
 A small plugin to allow Ikiwiki to display source files complete with syntax highlighting. Files with recognized extensions (i.e. my-file.cpp) are be rendered just like any other Ikiwiki page. You can even edit your source files with Ikiwiki's editor.
 
 It uses the Syntax::Highlight::Engine::Kate Perl module to do the highlighting.
diff --git a/doc/plugins/contrib/pod/discussion.mdwn b/doc/plugins/contrib/pod/discussion.mdwn
new file mode 100644 (file)
index 0000000..9187b13
--- /dev/null
@@ -0,0 +1,14 @@
+My one concern about this plugin is the `=for` markup in POD.
+
+> Some format names that formatters currently are known to
+> accept include "roff", "man", "latex", "tex", "text", and "html".
+
+I don't know which of these [[!cpan Pod::Xhtml]] supports. If it currently
+supports, or later support latex, that could be problimatic since that
+could maybe be used to include files or run code. --[[Joey]]
+
+> I don't know, either; the documentation for [[!cpan Pod:Xhtml]] is silent on this subject. --[[KathrynAndersen]]
+
+>> I'm afraid the only approach is to audit the existing code in the perl
+>> module(s), and then hope nothing is added to them later that opens a
+>> security hole. --[[Joey]] 
index b2f875393a5ed4376c5ce0896545fb0e2d0527b4..c522f8bcbfa94a27d9d549afbb1869ffd12a8736 100644 (file)
@@ -1,5 +1,5 @@
 [[!template id=plugin name=postal author="[[DavidBremner]]"]]
-[[!tag type/useful]]
+[[!tag type/special-purpose]]
 
 The `postal` plugin allows users to send mail to
 a special address to comment on a page. It uses the [[mailbox]]
diff --git a/doc/plugins/contrib/report.mdwn b/doc/plugins/contrib/report.mdwn
new file mode 100644 (file)
index 0000000..0bd5392
--- /dev/null
@@ -0,0 +1,26 @@
+[[!template id=plugin name=report author="[[rubykat]]"]]
+[[!tag type/meta type/format]]
+IkiWiki::Plugin::report - Produce templated reports from page field data.
+
+This plugin provides the [[ikiwiki/directive/report]] directive.  This enables
+one to report on the structured data ("field" values) of multiple pages; the
+output is formatted via a template.  This depends on the
+[[plugins/contrib/field]] plugin.
+
+
+## Activate the plugin
+
+    # activate the plugin
+    add_plugins => [qw{goodstuff report ....}],
+
+## PREREQUISITES
+
+    IkiWiki
+    IkiWiki::Plugin::field
+    HTML::Template
+    Encode
+
+## DOWNLOAD
+
+* browse at GitHub: <http://github.com/rubykat/ikiplugins/blob/master/IkiWiki/Plugin/report.pm>
+* git repo at git://github.com/rubykat/ikiplugins.git
diff --git a/doc/plugins/contrib/report/discussion.mdwn b/doc/plugins/contrib/report/discussion.mdwn
new file mode 100644 (file)
index 0000000..e23a4ce
--- /dev/null
@@ -0,0 +1,75 @@
+Wow, this plugin does a lot... it seems to be `inline` (but without the feeds
+or the ability to not have `archive="yes"`), plus part of
+[[plugins/contrib/trail]], plus some sorting, plus an ingenious workaround
+for template evaluation being relatively stateless.
+
+A large part of this plugin would just fall off if one of the versions of
+"[[todo/allow_plugins_to_add_sorting_methods]]" was merged, which was a
+large part of the idea of that feature request :-) To make use of that
+you'd have to use `pagespec_match_list` in the trail case too, but that's
+easy enough - just add `list => [@the_trail_pages]` to the arguments.
+
+Another large part would fall off if this plugin required, and internally
+invoked, `inline` (like my `comments` plugin does) - `inline` runs
+`pagetemplate` hooks, and in particular, it'll run the `field` hook.
+Alternatively, this plugin could invoke `pagetemplate` hooks itself,
+removing the special case for `field`.
+
+Perhaps the `headers` thing could migrate into inline somehow? That might
+lead to making inline too big, though.
+
+> I think inline is *already* too big, honestly. --[[KathrynAndersen]]
+
+>> A fair point; perhaps my complaint should be that *inline* does
+>> too many orthogonal things. I suppose the headers feature wouldn't
+>> really make sense in an inline that didn't have `archive="yes"`,
+>> so it'd make sense to recommend this plugin as a replacement
+>> for inlining with archive=yes (for which I now realise "inline"
+>> is the wrong verb anyway :-) ) --s
+
+>>> I think *inline* would be a bit less unwieldy if there was some way of factoring out the feed stuff into a separate plugin, but I don't know if that's possible. --K.A.
+
+Is the intention that the `trail` part is a performance hack, or a way
+to select pages? How does it relate to [[todo/wikitrails]] or
+[[plugins/contrib/trail]]? --[[smcv]]
+
+> The `trail` part is *both* a performance hack, and a way to select pages.  I have over 5000 pages on my site, I need all the performance hacks I can get.
+> For the performance hack, it is a way of reducing the need to iterate through every single page in the wiki in order to find matching pages.
+> For the way-to-select-pages, yes, it is intended to be similar to [[todo/wikitrails]] and [[plugins/contrib/trail]] (and will be more similar with the new release which will be happening soon; it will add prev_* and next_* variables).
+> The idea is that, rather than having to add special "trail" links on PageA to indicate that a page is part of the trail,
+> it takes advantage of the `%links` hash, which already contains, for each page, an array of the links from that page to other pages.  No need for special markup, just use what's there; a trail is defined as "all the pages linked to from page X", and since it's an array, it has an order already.
+> But to avoid that being too limiting, one can use a `pages=...` pagespec to filter that list to a subset; only the pages one is interested in.
+> And one can also sort it, if one so desires.
+> --[[KathrynAndersen]] 
+
+>> That's an interesting approach to trails; I'd missed the fact that
+>> links are already ordered.
+>>
+>> This does have the same problems as tags, though: see
+>> [[bugs/tagged()_matching_wikilinks]] and
+>> [[todo/matching_different_kinds_of_links]]. I suppose the question
+>> now is whether new code should be consistent with `tag` (and
+>> potentially be fixed at the same time as tag itself), or try to
+>> avoid those problems?
+>>
+>> The combination of `trail` with another pagespec in this plugin
+>> does provide a neat way for it to work around having unwanted
+>> pages in the report, by limiting by a suitable tag or subdirectory
+>> or something. --s
+
+>>> Either that, or somehow combine tagging with fields, such that one could declare a tag, and it would create both a link and a field with a given value.  (I've been working on something like that, but it still has bugs).
+>>> That way, the test for whether something is tagged would be something like "link(tag/foo) and field(tag foo)".
+>>> --K.A.
+
+>>>> I can see that this'd work well for 1:1 relationships like next
+>>>> and previous, but I don't think that'd work for pages with more than
+>>>> one tag - as far as I can see, `field`'s data model is that each
+>>>> page has no more than one value for each field?
+>>>> [[todo/Matching_different_kinds_of_links]] has some thoughts about
+>>>> how it could be implemented, though. --s
+
+>>>>> You have a point there.  I'm not sure what would be better: to add the concept of arrays/sets to `field`, or to think of tags as a special case.  Problem is, I find tags as they currently exist to be too limiting.  I prefer something that can be used for Faceted Tagging <http://en.wikipedia.org/wiki/Faceted_classification>; that is, things like Author:Fred Nurk, Genre:Historical, Rating:Good, and so on.  Of course, that doesn't mean that each tag is limited to only one value, either; just to take the above examples, something might have more than one author, or have multiple genres (such as Historical + Romance).
+
+>>>>> It might be that adding arrays to the `field` plugin is a good way to go: after all, even though field=value is the most common, with the flexibility of things like YAML, one could define all sorts of things.  What I'm not so sure about is how to return the values when queried, since some things would be expecting scalars all the time.  Ah, perhaps I could use wantarray?
+>>>>> Is there a way of checking a HTML::Template template to see if it expecting an array for a particular value?
+>>>>> --[[KathrynAndersen]]
diff --git a/doc/plugins/contrib/report/ikiwiki/directive/report.mdwn b/doc/plugins/contrib/report/ikiwiki/directive/report.mdwn
new file mode 100644 (file)
index 0000000..8f8e6b4
--- /dev/null
@@ -0,0 +1,149 @@
+[[!toc]]
+The `report` directive is supplied by the [[!iki plugins/contrib/report desc=report]] plugin.
+
+This enables one to report on the structured data ("field" values) of
+multiple pages; the output is formatted via a template.  This depends
+on the [[plugins/contrib/field]] plugin.
+
+The pages to report on are selected by a PageSpec given by the "pages"
+parameter.  The template is given by the "template" parameter.
+The template expects the data from a single page; it is applied
+to each matching page separately, one after the other.
+
+Additional parameters can be used to fill out the template, in
+addition to the "field" values.  Passed-in values override the
+"field" values.
+
+There are two places where template files can live.  One is in the
+/templates directory on the wiki.  These templates are wiki pages, and
+can be edited from the web like other wiki pages.
+
+The second place where template files can live is in the global
+templates directory (the same place where the page.tmpl template lives).
+This is a useful place to put template files if you want to prevent
+them being edited from the web, and you don't want to have to make
+them work as wiki pages.
+
+## OPTIONS
+
+**template**: The template to use for the report.
+
+**pages**: A PageSpec to determine the pages to report on.
+
+**trail**: A page or pages to use as a "trail" page.
+
+When a trail page is used, the matching pages are limited to (a subset
+of) the pages which that page links to; the "pages" pagespec in this
+case, rather than selecting pages from the entire wiki, will select
+pages from within the set of pages given by the trail page.
+
+Additional space-separated trail pages can be given in this option.
+For example:
+
+    trail="animals/cats animals/dogs"
+
+This will take the links from both the "animals/cats" page and the
+"animals/dogs" page as the set of pages to apply the PageSpec to.
+
+**sort**: A SortSpec to determine how the matching pages should be sorted.
+
+**here_only**: Report on the current page only.
+
+This is useful in combination with "prev_" and "next_" variables to
+make a navigation trail.
+If the current page doesn't match the pagespec, then no pages will
+be reported on.
+
+### Headers
+
+An additional option is the "headers" option.  This is a space-separated
+list of field names which are to be used as headers in the report.  This
+is a way of getting around one of the limitations of HTML::Template, that
+is, not being able to do tests such as
+"if this-header is not equal to previous-header".
+
+Instead, that logic is performed inside the plugin.  The template is
+given parameters "HEADER1", "HEADER2" and so on, for each header.
+If the value of a header field is the same as the previous value,
+then HEADER**N** is set to be empty, but if the value of the header
+field is new, then HEADER**N** is given that value.
+
+#### Example
+
+Suppose you're writing a blog in which you record "moods", and you
+want to display your blog posts by mood.
+
+    \[[!report template="mood_summary"
+    pages="blog/*"
+    sort="Mood Date title"
+    headers="Mood"]]
+
+The "mood_summary" template might be like this:
+
+    <TMPL_IF NAME="HEADER1">
+    ## <TMPL_VAR NAME="HEADER1">
+    </TMPL_IF>
+    ### <TMPL_VAR NAME="TITLE">
+    (<TMPL_VAR NAME="DATE">) \[[<TMPL_VAR NAME="PAGE">]]
+    <TMPL_VAR NAME="DESCRIPTION">
+    
+### Advanced Options
+
+The following options are used to improve efficiency when dealing
+with large numbers of pages; most people probably won't need them.
+
+**doscan**:
+
+Whether this report should be called in "scan" mode; if it is, then
+the pages which match the pagespec are added to the list of links from
+this page.  This can be used by *another* report by setting this
+page to be a "trail" page in *that* report.
+It is not possible to use "trail" and "doscan" at the same time.
+By default, "doscan" is false.
+
+## TEMPLATE PARAMETERS
+
+The templates are in HTML::Template format, just as [[plugins/template]] and
+[[ftemplate]] are.  The parameters passed in to the template are as follows:
+
+### Fields
+
+The structured data from the current matching page.  This includes
+"title" and "description" if they are defined.
+
+### Common values
+
+Values known for all pages: "page", "destpage".  Also "basename" (the
+base name of the page).
+
+### Passed-in values
+
+Any additional parameters to the report directive are passed to the
+template; a parameter will override the matching "field" value.
+For example, if you have a "Mood" field, and you pass Mood="bad" to
+the report, then that will be the Mood which is given for the whole
+report.
+
+Generally this is useful if one wishes to make a more generic
+template and hide or show portions of it depending on what
+values are passed in the report directive call.
+
+For example, one could have a "hide_mood" parameter which would hide
+the "Mood" section of your template when it is true, which one could
+use when the Mood is one of the headers.
+
+### Prev_ And Next_ Items
+
+Any of the above variables can be prefixed with "prev_" or "next_"
+and that will give the previous or next value of that variable; that is,
+the value from the previous or next page that this report is reporting on.
+This is mainly useful for a "here_only" report.
+
+### Headers
+
+See the section on Headers.
+
+### First and Last
+
+If this is the first page-record in the report, then "first" is true.
+If this is the last page-record in the report, then "last" is true.
diff --git a/doc/plugins/contrib/tracking.mdwn b/doc/plugins/contrib/tracking.mdwn
new file mode 100644 (file)
index 0000000..06d4120
--- /dev/null
@@ -0,0 +1,30 @@
+[[!template id=plugin name=tracking author="[[BerndZeimetz]]"]]
+[[!toc]]
+[[!tag plugins]] [[!tag patch]] [[!tag wishlist]]
+
+## NAME
+
+IkiWiki::Plugin::tracking - enable google/piwik visitor tracking
+
+## SYNOPSIS
+
+    # activate the plugin
+    add_plugins => [qw{goodstuff tracking ....}],
+
+    # to use Piwik:
+    piwik_id => '1',
+    piwik_https_url => "https://ssl.example.com/piwik/",
+    piwik_http_url => "http://www.example.com/piwik/",
+
+    # to use Google Analytics:
+    google_analytics_id => "UA-xxxxxx-x"
+
+## DESCRIPTION
+
+This plugin includes the necessary tracking codes for Piwik and/or Google Analytics on all pages. Tracking codes will only be included if the necessary config options are set. The plugin could be enhanced to support goals/profiles and similar things, but I do not plan to do so.
+
+## DOWNLOAD
+
+* single files: [tracking.pm](http://git.recluse.de/?p=users/bzed/ikiwiki.git;a=blob;f=IkiWiki/Plugin/tracking.pm;hb=refs/heads/tracking) [piwik.tmpl](http://git.recluse.de/?p=users/bzed/ikiwiki.git;a=blob;f=templates/piwik.tmpl;hb=refs/heads/tracking) [google_analytics.tmpl](http://git.recluse.de/?p=users/bzed/ikiwiki.git;a=blob;f=templates/google_analytics.tmpl;hb=refs/heads/tracking)
+* browse repository: <http://git.recluse.de/?p=users/bzed/ikiwiki.git;a=shortlog;h=refs/heads/tracking>
+* git repo: `git://git.recluse.de/users/bzed/ikiwiki.git` or <http://git.recluse.de/repos/users/bzed/ikiwiki.git> (Use the tracking branch)
index 9cda02f880c06ec7bd08852a2c777b1f0ec6eedd..72cce083c2f263bc8a3eef04c01496104228a4cf 100644 (file)
@@ -20,3 +20,30 @@ possible. Can it also read other arbitrary files, run other programs, etc?
 > For the second point, I think the main concern would be resource usage.  XSLT is a pretty limited language; it can read other XML files, but it can't run other programs so far as I know.
 
 > -- [[KathrynAndersen]]
+
+>> XSLT is, indeed, a Turing-complete programming language.
+   However, [XML::LibXSLT][] provides a set of functions to help
+   to minimize the damage that may be caused by running a random
+   program.
+
+>> In particular, `max_depth ()` allows for the maximum
+   recursion depth to be set, while
+   `read_file ()`, `write_file ()`, `create_dir ()`,
+   `read_net ()` and `write_net ()`
+   are the callbacks that allow any of the possible file
+   operations to be denied.
+
+>> To be honest, I'd prefer for the `read_file ()` callback to
+   only grant access to the files below the Ikiwiki source
+   directory, and for all the `write_`&hellip; and
+   &hellip;`_net` callbacks to deny the access unconditionally.
+
+>> One more wishlist item: allow the set of locations to take
+   `.xsl` files from to be preconfigured, so that, e.&nbsp;g.,
+   one could allow (preasumably trusted) system stylesheets,
+   while disallowing any stylesheets that are placed on the Wiki
+   itself.
+
+>> &mdash;&nbsp;Ivan Shmakov, 2010-03-28Z.
+
+[XML::LibXSLT]: http://search.cpan.org/~PAJAS/XML-LibXSLT/LibXSLT.pm
diff --git a/doc/plugins/contrib/ymlfront.mdwn b/doc/plugins/contrib/ymlfront.mdwn
new file mode 100644 (file)
index 0000000..6dd8ed5
--- /dev/null
@@ -0,0 +1,103 @@
+[[!template id=plugin name=ymlfront author="[[rubykat]]"]]
+[[!tag type/meta]]
+[[!toc]]
+## NAME
+
+IkiWiki::Plugin::ymlfront - add YAML-format data to a page
+
+## SYNOPSIS
+
+    # activate the plugin
+    add_plugins => [qw{goodstuff ymlfront ....}],
+
+## DESCRIPTION
+
+This plugin provides a way of adding arbitrary meta-data (data fields) to any
+page by prefixing the page with a YAML-format document.  This provides a way to
+create per-page structured data, where each page is treated like a record, and
+the structured data are fields in that record.  This can include the meta-data
+for that page, such as the page title.
+
+This plugin is meant to be used in conjunction with the [[field]] plugin.
+
+## DETAILS
+
+The YAML-format data in a page must be placed at the start of the page
+and delimited by lines containing precisely three dashes.  The "normal"
+content of the page then follows.
+
+For example:
+
+    ---
+    title: Foo does not work
+    Urgency: High
+    Status: Assigned
+    AssignedTo: Fred Nurk
+    Version: 1.2.3
+    ---
+    When running on the Sprongle system, the Foo function returns incorrect data.
+
+What will normally be displayed is everything following the second line of dashes.
+That will be htmlized using the page-type of the page-file.
+
+### Accessing the Data
+
+There are a few ways to access the data given in the YAML section.
+
+* [[getfield]] plugin
+
+  The **getfield** plugin can display the data as individual variable values.
+
+  For example:
+
+       ---
+       title: Foo does not work
+       Urgency: High
+       Status: Assigned
+       AssignedTo: Fred Nurk
+       Version: 1.2.3
+       ---
+       # {{$title}}
+
+       **Urgency:** {{$Urgency}}\\
+       **Status:** {{$Status}}\\
+       **Assigned To:** {{$AssignedTo}}\\
+       **Version:** {{$Version}}
+
+    When running on the Sprongle system, the Foo function returns incorrect data.
+
+* [[ftemplate]] plugin
+
+  The **ftemplate** plugin is like the [[plugins/template]] plugin, but it is also aware of [[field]] values.
+
+  For example:
+
+       ---
+       title: Foo does not work
+       Urgency: High
+       Status: Assigned
+       AssignedTo: Fred Nurk
+       Version: 1.2.3
+       ---
+       \[[!ftemplate id="bug_display_template"]]
+
+       When running on the Sprongle system, the Foo function returns incorrect data.
+
+* [[report]] plugin
+
+  The **report** plugin is like the [[ftemplate]] plugin, but it reports on multiple pages, rather than just the current page.
+
+* write your own plugin
+
+  In conjunction with the [[field]] plugin, you can write your own plugin to access the data.
+
+## PREREQUISITES
+
+    IkiWiki
+    IkiWiki::Plugin::field
+    YAML::Any
+
+## DOWNLOAD
+
+* browse at GitHub: <http://github.com/rubykat/ikiplugins/blob/master/IkiWiki/Plugin/ymlfront.pm>
+* git repo at git://github.com/rubykat/ikiplugins.git
diff --git a/doc/plugins/contrib/ymlfront/discussion.mdwn b/doc/plugins/contrib/ymlfront/discussion.mdwn
new file mode 100644 (file)
index 0000000..b5c08fe
--- /dev/null
@@ -0,0 +1,13 @@
+My field-etc branch in git://git.pseudorandom.co.uk/git/smcv/ikiwiki.git (gitweb:
+<http://git.pseudorandom.co.uk/smcv/ikiwiki.git?a=shortlog;h=refs/heads/field-etc>)
+has some fixes for compatibility with old YAML modules, mostly done by imitating
+Joey's code in IkiWiki::Setup::Yaml. Please consider merging :-) --[[smcv]]
+
+> I would if I could *find* it.  I checked out the "field-etc" branch, but I can't find the plugins in question under IkiWiki/Plugin; am I looking in the wrong place, or what?
+> --[[KathrynAndersen]]
+
+>> Sorry, I accidentally removed `field-etc` by pushing with `--mirror` from a
+>> different checkout. I've put it back; it's a branch from your `ikiplugins.git`,
+>> so yes, the code should be in `IkiWiki/Plugin`. --[[smcv]]
+
+>>> Done a while back, but now I've actually pushed to my repo. --[[KathrynAndersen]]
index 38ee2bd7808334356cce60b690f620260131aef6..7f47c2c97a81b4dbfb13e93164c835df9ba25881 100644 (file)
@@ -12,4 +12,11 @@ I've installed Text::WikiCreole 0.05 and enabled the plugin, but I get an error
 
 >>> forgot, done now --[[Joey]] 
 
+---
+## External Links
+
 I'm moving over a really stinkingly old UseMod and creole seems the nearest match. I've worked out that Bare /Subpage links need to become \[\[Subpage\]\], and Top/Sub links need to be \[\[Top/Sub\]\] (or \[\[Top/Sub|Top/Sub\]\], to display in exactly the same way), but I'm stuck on generic hyperlinks. The creole cheat sheet says I should be able to do \[\[http://url.path/foo|LinkText\]\], but that comes out as a link to create the "linktext" page, and Markdown-style \[Link Text\](http://url.path/foo) just gets rendered as is. Any suggestions? --[[schmonz]]
+
+> Was this problem ever solved? -- Thiana
+
+>> Not by me. If I were looking at the problem now, with fresh eyes, I'd probably bite the bullet and just convert everything to Markdown. --[[schmonz]]
index f74f8a269a8f0069e0c59b745bea363b4ef54230..ea3665c4407d19cb011b0506dcc99d36e27cf92b 100644 (file)
@@ -1,5 +1,5 @@
 [[!template id=plugin name=cutpaste author="[[Enrico]]"]]
-[[!tag type/chrome]]
+[[!tag type/widget]]
 
 This plugin provides the [[ikiwiki/directive/cut]],
 [[ikiwiki/directive/copy]] and [[ikiwiki/directive/paste]]
index b8dbdfee5778ad7f29393481fb31dcd31ded4b83..2a33f014c83a1b9a9b016c0c9571f8da60cd3b32 100644 (file)
@@ -1,5 +1,5 @@
 [[!template id=plugin name=date author="[[Joey]]"]]
-[[!tag type/meta]]
+[[!tag type/widget]]
 
 This plugin provides the [[ikiwiki/directive/date]]
 [[ikiwiki/directive]], which provides a way to display an arbitrary date
index 741606a6e71d184df8e2b5f1b8e70a56f7900848..17bb16cff4b537e5227235fa69eb2f39092dceda 100644 (file)
@@ -1,6 +1,7 @@
 [[!template id=plugin name=ddate author="[[Joey]]"]]
 [[!tag type/fun]]
 [[!tag type/date]]
+[[!tag type/chrome]]
 
 Enables use of Discordian dates. `--timeformat` can be used to change
 the date format; see `ddate(1)`.
index 854307a98ad971b7659adb271871a0dcb192e0ca..d47fa471897f906bf9c1133b0602d7d2867c5c7b 100644 (file)
@@ -34,3 +34,9 @@ Any objections to listing plugins alphabetically rather than by creation date?
 >> "recently changed" list with the 10 most recently changed plugins
 >> at the top.  That would allow what you suggested, but still allow
 >> the main list to be alphabetical. -- [[Will]]
+
+### `themes.pm` instead of `themes.mdwn`
+
+Could someone please change the filename. I cannot fix this using the Web interface. Somebody step in please. --[[PaulePanter]]
+
+> Oops, not the first time I've made that mistake! --[[Joey]] 
index b830e51aa98c6717c4b0a8d4c550357b9358905b..346ee7c781e0005b5023f7b4559869a623b52733 100644 (file)
@@ -1,4 +1,5 @@
 [[!template id=plugin name=editpage core=1 author="[[Joey]]"]]
+[[!tag type/web]]
 
 This plugin allows editing wiki pages in the web interface. It's enabled by
 default if [[cgi]] is enabled; disable it if you want cgi for other things
index 85dfdfc2d23aa5ecb6ea57014a57cdbca8e99d9a..c19ecd8586940da51ccf0d3433beebfa3392f9ec 100644 (file)
@@ -2,5 +2,5 @@
 [[!tag type/web]]
 
 This plugin provides the [[ikiwiki/directive/edittemplate]] [[ikiwiki/directive]].
-This directive allows registering template pages, that provide default
-content for new pages created using the web frontend.
+This directive allows registering [[template|templates]] pages, that
+provide default content for new pages created using the web frontend.
index f4563d58e62169e9664fb0ed66390e8e6a7a7dce..e5f68b29c317d1ae854bc0a28661be3b953446db 100644 (file)
@@ -1,5 +1,5 @@
 [[!template id=plugin name=filecheck core=0 author="[[Joey]]"]]
-[[!tag type/useful]]
+[[!tag type/special-purpose]]
 
 This plugin enhances the regular [[ikiwiki/PageSpec]] syntax with
 some additional tests, for things like file size, mime type, and virus
index 91e707fcf286c2d59da227f89b48fe0a6e162ee2..b41d365aa120d4dfbeacf0563a3b94a5bf8598ce 100644 (file)
@@ -1,5 +1,5 @@
 [[!template id=plugin name=format core=0 author="[[Joey]]"]]
-[[!tag type/format]]
+[[!tag type/widget]]
 
 This plugin allows mixing different page formats together, by embedding
 text formatted one way inside a page formatted another way. This is done
index 9966f456da05b35a00fba722b338d8eb8edfffdb..3cb125ac12eeee4b20f789f107bab862d983e948 100644 (file)
@@ -1,5 +1,6 @@
 [[!template id=plugin name=fortune author="[[Joey]]"]]
 [[!tag type/fun]]
+[[!tag type/widget]]
 
 This plugin implements the [[ikiwiki/directive/fortune]] [[ikiwiki/directive]].
 This directive  uses the `fortune` program to insert a fortune into the page.
index 20040ccee6438b0ca0667bdfba2de4d0ad23082a..d5404a6286d2472c2f146003044709c68b4212a9 100644 (file)
@@ -1,4 +1,5 @@
 [[!template id=plugin name=getsource author="[[Will_Uther|Will]]"]]
+[[!tag type/web]]
 
 This plugin adds a "Source" link to the top of each page that uses
 the CGI to display the page's source.
diff --git a/doc/plugins/getsource/discussion.mdwn b/doc/plugins/getsource/discussion.mdwn
new file mode 100644 (file)
index 0000000..45a1d62
--- /dev/null
@@ -0,0 +1 @@
+It would be very cool if this plugin was enabled by default.  One of the best ways to learn how to do various advanced things is to be able to "view source" on other wiki's which do things you like.  -- [[AdamShand]]
index 9c401c5d2b8fe864726e4bee7cfa33bb365f74be..8e1de7a10a51902812062a9bc84526b8c521b5ec 100644 (file)
@@ -1,5 +1,5 @@
 [[!template id=plugin name=goto author="[[Simon_McVittie|smcv]]"]]
-[[!tag type/useful]]
+[[!tag type/web]]
 
 This plugin adds a `do=goto` mode for the IkiWiki CGI script. It's mainly
 for internal use by the [[404]], [[comments]] and [[recentchanges]]
index b89f16b59512092fb9512462bd5bd2e1c09d1a6e..65130ae8c65fcf0fab149ab87551f7ba82d4c211 100644 (file)
@@ -1,5 +1,5 @@
 [[!template id=plugin name=graphviz author="[[JoshTriplett]]"]]
-[[!tag type/chrome type/format]]
+[[!tag type/widget]]
 
 This plugin provides the [[ikiwiki/directive/graph]] [[ikiwiki/directive]].
 This directive allows embedding [graphviz](http://www.graphviz.org/) graphs in a
index 74eac1c29679961c96ec2c9329cd8be81296b7a3..448733d957b1f2b6b440c3d558419b8b174cab67 100644 (file)
@@ -1,5 +1,6 @@
 [[!template id=plugin name=haiku author="[[Joey]]"]]
 [[!tag type/fun]]
+[[!tag type/widget]]
 
 This plugin provides a [[ikiwiki/directive/haiku]] [[ikiwiki/directive]].
 The directive allows inserting a randomly generated haiku into a wiki page.
index 77796a3d7fda5a86d1e861c9e3d6a00dd3c292f0..0eda5554f452ea41b2e6f7eb451d5fa04e9e62dd 100644 (file)
@@ -14,12 +14,22 @@ signed into the wiki. This method is suitable only for private wikis.
 ## separate cgiauthurl
 
 To use httpauth for a wiki where the content is public, and where
-the `ikiwiki.cgi` needs to be usable without authentication (for searching
-and so on), you can configure a separate url that is used for
-authentication, via the `cgiauthurl` option in the setup file. This
-url will then be redirected to whenever authentication is needed.
+the `ikiwiki.cgi` needs to be usable without authentication (for searching,
+or logging in using other methods, and so on), you can configure a separate
+url that is used for authentication, via the `cgiauthurl` option in the setup
+file. This url will then be redirected to when a user chooses to log in using
+httpauth.
 
 A typical setup is to make an `auth` subdirectory, and symlink `ikiwiki.cgi` 
 into it. Then configure the web server to require authentication only for
 access to the `auth` subdirectory. Then `cgiauthurl` is pointed at this
 symlink.
+
+## using only httpauth for some pages
+
+If you want to only use httpauth for editing some pages, while allowing
+other authentication methods to be used for other pages, you can
+configure `httpauth_pagespec` in the setup file. This makes Edit
+links on pages that match the [[ikiwiki/PageSpec]] automatically use
+the `cgiauthurl`, and prevents matching pages from being edited by
+users authentication via other methods.
index 114438765d058a50b0e9a4efaebb19d3926ddc8a..a6cd90f28d1595207132a7590c327294a1536004 100644 (file)
@@ -1,5 +1,5 @@
 [[!template id=plugin name=img author="Christian Mock"]]
-[[!tag type/chrome]]
+[[!tag type/widget]]
 
 This plugin provides the [[ikiwiki/directive/img]] [[ikiwiki/directive]].
 While ikiwiki supports inlining full-size images by making a
index 6c3282576538e62eff77601cbae106da9c04e7f7..3eb849fdbcc237ae5bc6706e24d4cc6ac23db49c 100644 (file)
@@ -1,4 +1,5 @@
 [[!template id=plugin name=inline core=1 author="[[Joey]]"]]
+[[!tag type/widget]]
 
 This plugin provides the [[ikiwiki/directive/inline]]
 [[ikiwiki/directive]], which allows including one wiki page
index 6adbf3eae06e724e0ee768da3ab80c09bc2b0831..7dfa50de4fc7259250a800629c9f850e90b1456e 100644 (file)
@@ -1,4 +1,5 @@
 [[!template id=plugin name=link core=1 author="[[Joey]]"]]
 [[!tag type/link]]
 
-This plugin implements standard [[WikiLinks|ikiwiki/wikilink]].
+This plugin implements standard [[WikiLinks|ikiwiki/wikilink]] and links to
+external pages.
index 89cb9d8aeb5ff8735ca1dd551bc6787c483f3673..7e51cd935db00a9540c0600410d506c6ebb22f74 100644 (file)
@@ -1,5 +1,6 @@
 [[!template id=plugin name=linkmap author="[[Joey]]"]]
 [[!tag type/meta]]
+[[!tag type/widget]]
 [[!tag type/slow]]
 
 This plugin provides the [[ikiwiki/directive/linkmap]] [[ikiwiki/directive]].
index 2d9bce01d383c24cb21f41320c8d930a0fd969ab..df854de52ecc78bd120e0f00606f2461608ff7b5 100644 (file)
@@ -1,5 +1,6 @@
 [[!template id=plugin name=listdirectives author="Will"]]
 [[!tag type/meta]]
+[[!tag type/widget]]
 
 This plugin provides the [[ikiwiki/directive/listdirectives]]
 [[ikiwiki/directive]], which inserts a list of currently available
index c8f64ea47a6b35579bed329da4da902952920eb3..6811632038953fca491d896c07768a9e3f0ea1ee 100644 (file)
@@ -12,14 +12,9 @@ to lock. For example, you could choose to lock all pages created before
 2006, or all pages that are linked to from the page named "locked". More
 usually though, you'll just list some names of pages to lock.
 
-One handy thing to do if you're using ikiwiki for your blog is to lock
-"* and !*/Discussion". This prevents others from adding to or modifying
-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.
+If you want to lock down a blog so only you can post to it, you can just
+lock "*", and enable the [[opendiscussion]] plugin, so readers can still post
+[[comments]].
 
 Wiki administrators can always edit locked pages. The [[ikiwiki/PageSpec]]
 can specify that some pages are not locked for some users. For example,
index 8f5a9f15e23cb2477fcaffe26d36c0cb99b6d1ac..b164d5ca82bc8fc454aa2fdbf460f0188797115a 100644 (file)
@@ -1,5 +1,5 @@
 [[!template id=plugin name=map author="Alessandro Dotti Contra"]]
-[[!tag type/meta]]
+[[!tag type/meta type/widget]]
 
 This plugin provides the [[ikiwiki/directive/map]] [[ikiwiki/directive]],
 which generates a hierarchical page map for the wiki.
index 2f7b140d6e6859369dd89d3fcf6a59ac63de7bc7..54c921b0fc46a4cf2ab8a414f49597d49658154d 100644 (file)
@@ -1,7 +1,7 @@
 I'm wanting a [[map]] (with indentation levels) showing page _titles_
 instead of page 'names'.  As far as I can see, this is not an option with
 existing plugins - I can get a list of pages using [[inline]] and
-appropriate [[wikitemplates]], but that has no indentation and therefore
+appropriate [[templates]], but that has no indentation and therefore
 doesn't show structure well.
 
 The quick way is to modify the map plugin to have a 'titles' option.  The
index b371e8eb7f9a36f4462f49077a41e5d0ae7a2754..aedc1f4a063b6ba346c16031d51c4e31fcc61229 100644 (file)
@@ -1,5 +1,5 @@
 [[!template id=plugin name=mirror author="[[Joey]]"]]
-[[!tag type/special-purpose]]
+[[!tag type/web]]
 
 This plugin allows adding links a list of mirrors to each page in the
 wiki. For each mirror, a name and an url should be specified. Pages are
index 97924d742a1ea5d7184ef8ab44d6f2adb30cbea4..f9466e833f49c446e95e8d38d572f3a682269141 100644 (file)
@@ -5,6 +5,8 @@ This plugin causes [[comments]] to be held for manual moderation.
 Admins can access the comment moderation queue via their preferences page.
 
 By default, all comments made by anyone who is not an admin will be held
-for moderation. The `moderate_users` setting can be set to false to avoid
-moderating comments of logged-in users, while still moderating anonymous
-comments.
+for moderation. The `moderate_pagespec` setting can be used to specify a
+[[ikiwiki/PageSpec]] to match comments and users who should be moderated.
+For example, to avoid moderating comments from logged-in users, set
+`moderate_pagespec` to "`!user(*)`". Or to moderate everyone except for
+admins, set it to "`!admin(*)`".
index e9a971289b0a0bdf39a0f885f59cd6e3c5e8d3c6..a0664e843b2f0be4e7188e5f751ed58ff7fa401b 100644 (file)
@@ -1,5 +1,5 @@
 [[!template id=plugin name=more author="Ben"]]
-[[!tag type/format]]
+[[!tag type/widget]]
 
 This plugin provides the [[ikiwiki/directive/more]] [[ikiwiki/directive]],
 which is a way to have a "more" link on a post in a blog, that leads to the
index b2ba68bf7796a23d85d7cba5c7f403448e349f09..3b5ab4858dcde5b2aebf23f85b869b34e6acd63b 100644 (file)
@@ -1,5 +1,6 @@
 [[!template id=plugin name=opendiscussion author="[[Joey]]"]]
 [[!tag type/auth]]
 
-This plugin allows editing of Discussion pages by anonymous users who have
-not logged into the wiki.
+This plugin allows editing of Discussion pages, and posting of comments,
+even when the [[lockedit]] plugin has been configured to otherwise prevent
+editing.
index 91fc7cddc0a26da6707d5e7ccc47c7adfa1e6a72..f3b3abfbb6cd8af0203d522ca13d07201a3d540b 100644 (file)
@@ -11,17 +11,22 @@ The [[!cpan LWPx::ParanoidAgent]] perl module is used if available, for
 added security. Finally, the [[!cpan Crypt::SSLeay]] perl module is needed
 to support users entering "https" OpenID urls.
 
-This plugin has a configuration option. You can set `--openidsignup`
-to the url of a third-party site where users can sign up for an OpenID. If
-it's set, the signin page will link to that site.
-
-This plugin supports the
-[myopenid.com affiliate program](http://myopenid.com/affiliate_welcome),
-which can be used to help users sign up for an OpenID and log into your
-site in a single, unified process. When you create the affiliate, specify a
-login url like `http://example.com/ikiwiki.cgi?do=continue`. Once the
-affiliate is created, set `openidsignup` to point to the affiliate's signup
-url.
-
 This plugin is enabled by default, but can be turned off if you want to
 only use some other form of authentication, such as [[passwordauth]].
+
+## options
+
+These options do not normally need to be set, but can be useful in
+certian setups.
+
+* `openid_realm` can be used to control the scope of the openid request.
+  It defaults to the `cgiurl` (or `openid_cgiurl` if set); only allowing
+  ikiwiki's [[CGI]] to authenticate. If you have multiple ikiwiki instances,
+  or other things using openid on the same site, you may choose to put them
+  all in the same realm to improve the user's openid experience. It is an
+  url pattern, so can be set to eg "http://*.example.com/"
+
+* `openid_cgiurl` can be used to cause a different than usual `cgiurl`
+  to be used when doing openid authentication. The `openid_cgiurl` must
+  point to an ikiwiki [[CGI]], and it will need to match the `openid_realm`
+  to work.
index e403c2d189249f8bd6069ab06d594cab3a177253..09ad0a51d695ffc81b627bfde74d3f45348ccc78 100644 (file)
@@ -1,5 +1,6 @@
 [[!template id=plugin name=orphans author="[[Joey]]"]]
 [[!tag type/meta]]
+[[!tag type/widget]]
 
 This plugin provides the [[ikiwiki/directive/orphans]]
 [[ikiwiki/directive]], which generates a list of possibly orphaned pages --
index a56027e607958364045fbc613b5bda53352fb082..71872fae804f3d77bbea6bafb491bd2c6e0bf737 100644 (file)
@@ -1,5 +1,6 @@
 [[!template id=plugin name=pagecount author="[[Joey]]"]]
 [[!tag type/meta]]
+[[!tag type/widget]]
 
 This plugin provides the [[ikiwiki/directive/pagecount]]
 [[ikiwiki/directive]], which displays the number of pages
index c3eba63637b81b1257f3c17f2591ea4a99700865..347e39a89ed02340b9406ac002cd49251fc1aaf2 100644 (file)
@@ -1,5 +1,5 @@
 [[!template id=plugin name=pagestats author="Enrico Zini"]]
-[[!tag type/meta type/tags]]
+[[!tag type/meta type/tags type/widget]]
 
 This plugin provides the [[ikiwiki/directive/pagestats]]
 [[ikiwiki/directive]], which can generate stats about how pages link to
index 53f069d0d578980f49bc4f7c36cea7ea5e31db5f..8254e14c5170c20a38aced748437112c67d61c82 100644 (file)
@@ -3,8 +3,4 @@
 
 This plugin provides the [[ikiwiki/directive/pagetemplate]]
 [[ikiwiki/directive]], which allows a page to be displayed
-using a different [[template|wikitemplates]] than the default.
-
-This plugin can only use templates that are already installed in
-`/usr/share/ikiwiki/templates` (or wherever ikiwiki is configured to look for
-them). You can choose to use any .tmpl files in that directory.
+using a different [[template|templates]] than the default.
index ef262a30c1230b1f04feeb77a4ee04ca14da50c5..c2d364befa79300f1ad77e20b7ee1b626bd16bec 100644 (file)
@@ -1,5 +1,5 @@
 [[!template id=plugin name=parentlinks core=1 author="[[intrigeri]]"]]
-[[!tag type/link]]
+[[!tag type/link type/chrome]]
 
 This plugin generates the links to a page's parents that typically appear
 at the top of a wiki page.
index f3b70b5f786b5f244d8e3ba4ef6a8af0b0f8db2e..576d36ec17a51fc38e344a5162895e76f5c6dd4b 100644 (file)
@@ -129,11 +129,12 @@ For details, see [Apache's documentation](http://httpd.apache.org/docs/2.2/conte
 lighttpd
 --------
 
-lighttpd unfortunately does not support content negotiation.
+Recent versions of lighttpd should be able to use
+`$HTTP["language"]` to configure the translatted pages to be served.
 
-**FIXME**: does `mod_magnet` provide the functionality needed to
- emulate this?
+See [Lighttpd Issue](http://redmine.lighttpd.net/issues/show/1119)
 
+TODO: Example
 
 Usage
 =====
index ab822e76cca14c6bfd066bdb386791aa16c40285..27683f1eae22ddce2fca8c01155fee976f35c273 100644 (file)
@@ -513,7 +513,7 @@ finish it at some point in the first quarter of 2009. --[[intrigeri]]
 >>>>
 >>>>> Done. --[[intrigeri]]
 >>> 
-> * I'm very fearful of the `add_depends` in `postscan`. 
+> * I'm very fearful of the `add_depends` in `indexhtml`. 
 >   Does this make every page depend on every page that links
 >   to it? Won't this absurdly bloat the dependency pagespecs
 >   and slow everything down? And since nicepagetitle is given
index 510f67798caf22183fd0dccf489022b9b4eb784f..099cb399c5103d752d65d75c3fd2e58937e124cf 100644 (file)
@@ -1,5 +1,5 @@
 [[!template id=plugin name=poll author="[[Joey]]"]]
-[[!tag type/web]]
+[[!tag type/widget]]
 
 This plugin provides the [[ikiwiki/directive/poll]] [[ikiwiki/directive]],
 which allows inserting an online poll into a page.
index 6045c1ec91dc23f99c737b622fb2846a672f26bf..f9cea1f4dce7a9d325bd6a5e8e7344ddd008ac34 100644 (file)
@@ -1,5 +1,6 @@
 [[!template id=plugin name=polygen author="Enrico Zini"]]
 [[!tag type/fun]]
+[[!tag type/widget]]
 
 This plugin provides the [[ikiwiki/directive/polygen]] [[ikiwiki/directive]],
 which allows inserting text generated by polygen into a wiki page.
index c81f91bdc51d46dfecffb8550a53edd3af88322a..b0733e34390e05ea0be7765fd763d75b28d373f3 100644 (file)
@@ -1,5 +1,5 @@
 [[!template id=plugin name=postsparkline author="[[Joey]]"]]
-[[!tag type/chrome]]
+[[!tag type/widget]]
 
 This plugin provides the [[ikiwiki/directive/postsparkline]] [[ikiwiki/directive]].
 It uses the [[sparkline]] plugin to create a sparkline of
index 11ad4252fb16b1862b1a0bb0474de957eb5ec350..149b7c29c59439b796957ebd3043da38a2508982 100644 (file)
@@ -1,5 +1,6 @@
 [[!template id=plugin name=prettydate author="[[Joey]]"]]
 [[!tag type/date]]
+[[!tag type/chrome]]
 
 Enabling this plugin changes the dates displayed on pages in the wiki to
 a format that is nice and easy to read. Examples: "late Wednesday evening, 
index e1b560cc8424b4db0cbbfbb5477b04512a092367..20736d18cd4ef6cae435c2c7419faefbe1c6c362 100644 (file)
@@ -1,5 +1,5 @@
 [[!template id=plugin name=progress author="[[Will]]"]]
-[[!tag type/meta]]
+[[!tag type/widget]]
 
 This plugin provides the [[ikiwiki/directive/progress]]
 [[ikiwiki/directive]], which generates a progress bar.
index 9375296a4d81158f737a59f408b66ab124372885..823f685024102c070dd1285b6509376fbdb64159 100644 (file)
@@ -1,4 +1,5 @@
 [[!template id=plugin name=recentchanges core=1 author="[[Joey]]"]]
+[[!tag type/meta]]
 
 This plugin examines the [[revision_control_system|rcs]] history and
 generates a page describing each recent change made to the wiki. These
index a7b113ade60fc2ab6176c4028baf9c4c4383f4c7..57299f92dd17c0e2fc9e9ac236cdc7a2ca90090d 100644 (file)
@@ -1,4 +1,5 @@
 [[!template id=plugin name=recentchangesdiff core=0 author="[[Joey]]"]]
+[[!tag type/meta]]
 
 This plugin extends the [[recentchanges]] plugin, adding a diff for each
 change. The diffs are by default hidden from display on the recentchanges
index 50c96c5d7e7789b8830b2df756e7d049aa689be0..d6e8eb08bdb6a00d39f88368e066d0f838200c11 100644 (file)
@@ -1,5 +1,6 @@
 [[!template id=plugin name=relativedate author="[[Joey]]"]]
 [[!tag type/date]]
+[[!tag type/chrome]]
 
 This plugin lets dates be displayed in relative form. Examples: "2 days ago", 
 "1 month and 3 days ago", "30 minutes ago". Hovering over the date will
index ddaede8b06b1eebd340a57e416d295f85b20c2eb..abb3613296a46cb5b533ef23565aa60c565090c2 100644 (file)
@@ -2,7 +2,8 @@
 [[!tag type/web]]
 
 This plugin allows pages or other files to be renamed using the web
-interface.
+interface. Following Unix tradition, renaming also allows moving to a
+different directory.
 
 Users can only rename things that they are allowed to edit or upload.
 
index 9b3a7575eda52528170ee60b24a4fbaeeb3a46c9..efd9c93521c4cd856dbb21127d8fd9b3068d9e20 100644 (file)
@@ -1,5 +1,5 @@
 [[!template id=plugin name=repolist author="[[Joey]]"]]
-[[!tag type/useful]]
+[[!tag type/web]]
 
 This plugin allows you to configure ikiwiki with the location of
 [[rcs]] repositories for your wiki's source. This is done via the
index 315b663c0269b6c83c32754254c34310ebe174cc..e488861684241949dd8efa7e89ec007c3817b348 100644 (file)
@@ -1,4 +1,5 @@
 [[!template id=plugin name=rsync author="[[schmonz]]"]]
+[[!tag type/special-purpose]]
 
 This plugin allows ikiwiki to push generated pages to another host
 by running a command such as `rsync`.
index cca1f4bdd18d4875074a058b061945971c549020..1e8e85ed85fa6adb7c496f9f89e78d0a64355ec8 100644 (file)
@@ -1,5 +1,5 @@
 [[!template id=plugin name=shortcut author="[[Joey]]"]]
-[[!tag type/format]]
+[[!tag type/widget]]
 
 This plugin provides the [[ikiwiki/directive/shortcut]] [[ikiwiki/directive]].
 It allows external links to commonly linked to sites to be made
index 4e356d65a8984885a256788f82f1f2173ffeaa67..01273345630233b49720490af9867beaff46f8b5 100644 (file)
@@ -1,24 +1,27 @@
 [[!template id=plugin name=sidebar author="Tuomo Valkonen"]]
 [[!tag type/chrome]]
 
-If this plugin is enabled, then a sidebar is added to pages in the wiki.
-The content of the sidebar is simply the content of a page named
-"sidebar" (ie, create a "sidebar.mdwn").
+This plugin allows adding a sidebar to pages in the wiki.
+
+By default, and unless the `global_sidebars` setting is turned off,
+a sidebar is added to all pages in the wiki. The content of the sidebar
+is simply the content of a page named "sidebar" (ie, create a "sidebar.mdwn").
 
 Typically this will be a page in the root of the wiki, but it can also be a
 [[ikiwiki/SubPage]]. In fact, this page,
 [[plugins/sidebar|plugins/sidebar]], will be treated as a sidebar for the
 [[plugins]] page, and of all of its SubPages, if the plugin is enabled.
 
-Note that to disable a sidebar for a [[ikiwiki/SubPage]] of a page that has
-a sidebar, you can create a sidebar page that is completely empty. This
-will turn off the sidebar altogether.
+There is also a [[ikiwiki/directive/sidebar]] directive that can be used
+to provide a custom sidebar content for a page.
+
+----
 
-Warning: Any change to the sidebar will cause a rebuild of the whole wiki,
-since every page includes a copy that has to be updated. This can
-especially be a problem if the sidebar includes an [[ikiwiki/directive/inline]]
-directive, since any changes to pages inlined into the sidebar
-will change the sidebar and cause a full wiki rebuild.
+Warning: Any change to the sidebar page will cause a rebuild of the whole
+wiki, since every page includes a copy that has to be updated. This can
+especially be a problem if the sidebar includes an
+[[ikiwiki/directive/inline]] directive, since any changes to pages inlined
+into the sidebar will change the sidebar and cause a full wiki rebuild.
 
 Instead, if you include a [[ikiwiki/directive/map]] directive on the sidebar,
 and it does not use the `show` parameter, only adding or removing pages
diff --git a/doc/plugins/sortnaturally.mdwn b/doc/plugins/sortnaturally.mdwn
new file mode 100644 (file)
index 0000000..a163819
--- /dev/null
@@ -0,0 +1,6 @@
+[[!template id=plugin name=sortnaturally core=1 author="[[chrysn]], [[smcv]]"]]
+[[!tag type/meta]]
+
+This plugin provides the `title_natural` [[ikiwiki/pagespec/sorting]]
+order, which uses [[!cpan Sort::Naturally]] to sort numbered pages in a
+more natural order.
index bcc5daec60668443444f6f55a48bb9d2f11a6614..ee3928d7ed4835df89a9731381e381ac737bb684 100644 (file)
@@ -1,5 +1,5 @@
 [[!template id=plugin name=sparkline author="[[Joey]]"]]
-[[!tag type/chrome]]
+[[!tag type/widget]]
 
 This plugin provides the [[ikiwiki/directive/sparkline]]
 [[ikiwiki/directive]], which allows for easily embedding sparklines into
index 10a85bb2cd03a89f17aa06138a2777af58225da0..fe66f90a8d7563bfc11f6f196168e3868fbcb8ce 100644 (file)
@@ -1,5 +1,5 @@
 [[!template id=plugin name=table author="[[VictorMoral]]"]]
-[[!tag type/format]]
+[[!tag type/widget]]
 
 This plugin provides the [[ikiwiki/directive/table]] [[ikiwiki/directive]].
 It can build HTML tables from data in CSV (comma-separated values)
index 8ff70a069ce666cc9fc909878b2a7e93518d8296..8e1286e6272b5adffc5598d88b529fc4dfcd5ab0 100644 (file)
@@ -8,6 +8,13 @@ These directives allow tagging pages.
 It also provides the `tagged()` [[ikiwiki/PageSpec]], which can be used to
 match pages that are tagged with a specific tag.
 
+The `tagbase` setting can be used to make tags default to being put in a
+particular subdirectory.
+
+The `tag_autocreate` setting can be used to control whether new tag pages
+are created as needed. It defaults to being done only if a `tagbase` is
+set.
+
 [[!if test="enabled(tag)" then="""
 This wiki has the tag plugin enabled, so you'll see a note below that this
 page is tagged with the "tags" tag.
index 03dcb7b2fc6075f3b524bd54f74dcd0e009bd445..dfd749252280561639bfdd4c3087fdc6b84cd15a 100644 (file)
@@ -28,3 +28,4 @@ See [[todo/auto-create tag pages according to a template]]
 
 -- Jeremy Schultz <jeremy.schultz@uleth.ca>
 
+`tag_autocreate` can now enable this. --[[Joey]] 
index 3485fe64ce51953438ec661ec3276ee56572d267..8d17e2825ebbd4bd34141b8e622ba835b4bb572c 100644 (file)
@@ -1,7 +1,7 @@
 [[!template id=plugin name=template author="[[Joey]]"]]
-[[!tag type/format]]
+[[!tag type/widget]]
 
 This plugin provides the [[ikiwiki/directive/template]] [[ikiwiki/directive]].
 With this plugin, you can set up templates, and cause them to be filled out
-and inserted into pages in the wiki. It's documented and existing templates
-are listed in the [[templates]] page.
+and inserted into pages in the wiki. Existing templates are listed in the
+[[templates]] page.
index dabcb0becd9c68410d9a285cbcf0a17dba936728..8180d5d4b5b374050301c4591ef7848b4e62157b 100644 (file)
@@ -1,5 +1,5 @@
 [[!template id=plugin name=testpagespec author="[[Joey]]"]]
-[[!tag type/useful]]
+[[!tag type/special-purpose]]
 
 This plugin provides a [[ikiwiki/directive/testpagespec]] [[ikiwiki/directive]].
 The directive allows testing a [[ikiwiki/PageSpec]] to see if it matches a
index ae052837fa6fecf88303730ba28bb7519ea458f4..f3cade85fed00d37dd5df5dd80421247c1ce55f7 100644 (file)
@@ -1,5 +1,5 @@
 [[!template id=plugin name=teximg author="[[PatrickWinnertz]]"]]
-[[!tag type/chrome type/slow]]
+[[!tag type/widget type/slow]]
 
 This plugin provides a [[ikiwiki/directive/teximg]] [[ikiwiki/directive]],
 that renders LaTeX formulas into images.
diff --git a/doc/plugins/theme.mdwn b/doc/plugins/theme.mdwn
new file mode 100644 (file)
index 0000000..7149cc1
--- /dev/null
@@ -0,0 +1,11 @@
+[[!template id=plugin name=theme author="[[Joey]]"]]
+[[!tag type/web]]
+
+The theme plugin allows easily applying a theme to your wiki, by
+configuring the `theme` setting in the setup file with the name of a theme
+to use. The themes you can choose from are all subdirectories, typically
+inside `/usr/share/ikiwiki/themes/`.
+
+A theme provides, via the underlay, an enhanced version of the regular
+[[style.css]]. This leaves [[local.css]] free for you to further
+customise. Themes can also provide header and background images.
diff --git a/doc/plugins/theme/discussion.mdwn b/doc/plugins/theme/discussion.mdwn
new file mode 100644 (file)
index 0000000..091aa97
--- /dev/null
@@ -0,0 +1,18 @@
+### What license do themes need to have for distribution?
+
+Could someone specify what license the themes need to have to get
+distributed in ikiwiki or Debian? The current included theme seem to be
+under the GPLv2. Does the [Creative Commons Attribution 3.0 Unported
+License](http://creativecommons.org/licenses/by/3.0/) also work. This way a
+lot of free CSS templates could be included, e. g. from
+[freecsstemplates.org](http://www.freecsstemplates.org/). --PaulePanter
+
+> Paule, I'd love it if you did that! The only hard requirement on themes
+> included in ikiwiki is that they need to be licensed with a [DFSG
+> compatable license](https://wiki.debian.org/DFSGLicenses). CC-BY-SA 3.0
+> is DFSG; CC-BY is apparently being accepted by Debian too.
+> 
+> As a soft requirement, I may exersise some discretion about themes that
+> require obtrusive attributions links be included on every page of a
+> site using the theme. While probably DFSG, that adds a requirement
+> that ikiwiki itself does not require. --[[Joey]]
index 2b7686681ee110072fd8576da0a98e30b1fff91d..a0ad3a5d06af4746007b0b96ba71b750cedbdd99 100644 (file)
@@ -1,5 +1,5 @@
 [[!template id=plugin name=toc author="[[Joey]]"]]
-[[!tag type/chrome]]
+[[!tag type/widget]]
 
 This plugin provides the [[ikiwiki/directive/toc]] [[ikiwiki/directive]],
 which adds a table of contents to a page.
index 69ac613e01e63eada17f05ef4f9da4adbcf06a0c..d1500eba01f004632f4bb5ba1f300893183efa37 100644 (file)
@@ -1,5 +1,5 @@
 [[!template id=plugin name=toggle author="[[Joey]]"]]
-[[!tag type/chrome]]
+[[!tag type/widget]]
 
 This plugin provides the [[ikiwiki/directive/toggle]] and
 [[ikiwiki/directive/toggleable]] [[directives|ikiwiki/directive]].
index 420898d095b2a7e8b8aed8f303da66515eb3d541..a3087c9e036138994df7107933771f8a9df47b68 100644 (file)
@@ -12,3 +12,8 @@ The only exceptions are that [[WikiLinks|ikiwiki/WikiLink]] and
 [[directives|ikiwiki/directive]] are still expanded by
 ikiwiki, and that, if the [[!cpan URI::Find]] perl module is installed, URLs
 in the txt file are converted to hyperlinks.
+
+----
+
+As a special case, a file `robots.txt` will be copied intact into the
+`destdir`, as well as creating a wiki page named "robots".
index d3f0eb3d384801fa293aefdbe7b6f0f1ba59de7e..a1c6d07283c66623e2c533b349c5375f47cdae20 100644 (file)
@@ -1 +1 @@
-These plugins affect the look and feel of the wiki.
+These plugins affect the look and feel of the overall wiki.
diff --git a/doc/plugins/type/useful.mdwn b/doc/plugins/type/useful.mdwn
deleted file mode 100644 (file)
index 92fcf5a..0000000
+++ /dev/null
@@ -1 +0,0 @@
-These plugins perform various miscellaneous useful functions.
diff --git a/doc/plugins/type/widget.mdwn b/doc/plugins/type/widget.mdwn
new file mode 100644 (file)
index 0000000..875829d
--- /dev/null
@@ -0,0 +1,2 @@
+These plugins allow inserting various things into pages via a
+[[ikiwiki/directive]].
index 030ef80526d2110e14a067fb7930457a89e5a6d5..9ff6c4ffdcb87ccbc74c81a30f5bd6438b041bc4 100644 (file)
@@ -1,5 +1,5 @@
 [[!template id=plugin name=typography author="[[Roktas]]"]]
-[[!tag type/format]]
+[[!tag type/chrome]]
 
 This plugin, also known as
 [SmartyPants](http://daringfireball.net/projects/smartypants/), translates
index f7eafee7cd7017c319fa6c63f82e4fb70a8a660e..0cf819472238c6700ef2b1482fbea79170ffa22c 100644 (file)
@@ -1,20 +1,14 @@
 [[!template id=plugin name=underlay author="[[Simon_McVittie|smcv]]"]]
-[[!tag type/useful]]
+[[!tag type/special-purpose]]
 
-This plugin adds an `add_underlays` option to the setup file.
-Its value is a list of underlay directories whose content is added to the wiki.
+This plugin adds an `add_underlays` option to the setup file. Its value is
+a list of underlay directories whose content is added to the wiki.
 
 Multiple underlays are normally set up automatically by other plugins (for
-instance, the images used by the [[plugins/smiley]] plugin), but they can also be
-used as a way to pull in external files that you don't want in revision control,
-like photos or software releases.
+instance, the images used by the [[plugins/smiley]] plugin), but they can
+also be used as a way to pull in external files that you don't want in
+revision control, like photos or software releases.
 
-Directories in `add_underlays` should usually be absolute. If relative, they're
-interpreted as relative to the parent directory of the basewiki underlay, which
-is probably not particularly useful in this context.
-
---
-
-This plugin also adds an `add_templates` option to the setup file.
-Its value is a list of template directories to look for template files in,
-if they are not present in the `templatedir`.
+Directories in `add_underlays` should usually be absolute. If relative,
+they're interpreted as relative to the parent directory of the basewiki
+underlay, which is probably not particularly useful in this context.
index 43027bdd72797223f52a2cfda995c00b24d6f139..326a2e7ce8ee0b306b2304f0f115f4574c40e50b 100644 (file)
@@ -1,5 +1,6 @@
 [[!template id=plugin name=version author="[[Joey]]"]]
 [[!tag type/meta]]
+[[!tag type/widget]]
 
 This plugin provides the [[ikiwiki/directive/version]]
 [[ikiwiki/directive]], which inserts the current version
index f1756ba8ff9675d27a394688a09728e432cc4996..a20a3248945780b22b3673c7653a3aa99e58f83b 100644 (file)
@@ -2,7 +2,7 @@
 [[!tag type/web]]
 
 This plugin allows wiki admins to configure the wiki using a web interface,
-rather than editing the setup file directly. A "Wiki Setup" button is added
+rather than editing the setup file directly. A "Setup" button is added
 to the admins' preferences page.
 
 Warning: This plugin rewrites your setup file. Any comments or unusual
@@ -16,7 +16,8 @@ enabled and disabled using it too. Some settings are not considered safe
 enough to be manipulated over the web; these are still shown, by default,
 but cannot be modified. To hide them, set `websetup_show_unsafe` to false
 in the setup file. A few settings have too complex a data type to be
-configured via the web.
+configured via the web. To mark additional settings as unsafe, you can
+list them in `websetup_unsafe`.
 
 Plugins that should not be enabled/disabled via the web interface can be
 listed in `websetup_force_plugins` in the setup file.
index dc9a307032b12c8dbe7113d359e4cdbf242ff50b..96c6e2e6c24c3c66144e979403b77346d819c663 100644 (file)
@@ -1,5 +1,5 @@
 [[!template id=plugin name=wmd author="[[Will]]"]]
-[[!tag type/chrome]]
+[[!tag type/web]]
 
 [WMD](http://wmd-editor.com/) is a What You See Is What You Mean editor for
 [[mdwn]]. This plugin makes WMD be used for editing pages in the wiki.
index 45f083b423ca5b88117ce604ba5248431d6b32a3..a921b9a0272098e191987c80066c6e7931cafa2e 100644 (file)
@@ -3,8 +3,84 @@ written to extend ikiwiki in many ways. Despite the length of this page,
 it's not really hard. This page is a complete reference to everything a
 plugin might want to do. There is also a quick [[tutorial]].
 
+[[!template id="note" text="""
+Ikiwiki is a compiler
+
+One thing to keep in mind when writing a plugin is that ikiwiki is a wiki
+*compiler*. So plugins influence pages when they are built, not when they
+are loaded. A plugin that inserts the current time into a page, for
+example, will insert the build time.
+
+Also, as a compiler, ikiwiki avoids rebuilding pages unless they have
+changed, so a plugin that prints some random or changing thing on a page
+will generate a static page that won't change until ikiwiki rebuilds the
+page for some other reason, like the page being edited.
+
+The [[tutorial]] has some other examples of ways that ikiwiki being a
+compiler may trip up the unwary.
+"""]]
+
 [[!toc levels=2]]
 
+## Highlevel view of ikiwiki
+
+Ikiwiki mostly has two modes of operation. It can either be running
+as a compiler, building or updating a wiki; or as a cgi program, providing
+user interface for editing pages, etc. Almost everything ikiwiki does
+is accomplished by calling various hooks provided by plugins.
+
+### compiler
+
+As a compiler, ikiwiki starts by calling the `refresh` hook. Then it checks
+the wiki's source to find new or changed pages. The `needsbuild` hook is
+then called to allow manipulation of the list of pages that need to be
+built. 
+
+Now that it knows what pages it needs to build, ikiwiki runs two
+compile passes. First, it runs `scan` hooks, which collect metadata about
+the pages. Then it runs a page rendering pipeline, by calling in turn these
+hooks: `filter`, `preprocess`, `linkify`, `htmlize`, `indexhtml`,
+`pagetemplate`, `sanitize`, `format`.
+
+After all necessary pages are built, it calls the `change` hook. Finally,
+if a page is was deleted, the `delete` hook is called, and the files that
+page had previously produced are removed.
+
+### cgi
+
+The flow between hooks when ikiwiki is run as a cgi is best illustrated by
+an example.
+
+Alice browses to a page and clicks Edit.
+
+* Ikiwiki is run as a cgi. It assigns Alice a session cookie, and,
+  by calling the `auth` hooks, sees that she is not yet logged in.
+* The `sessioncgi` hooks are then called, and one of them,
+  from the [[editpage]] plugin, notices that the cgi has been told "do=edit".
+* The [[editpage]] plugin calls the `canedit` hook to check if this
+  page edit is allowed. The [[signinedit]] plugin has a hook that says not:
+  Alice is not signed in.
+* The [[signinedit]] plugin then launches the signin process. A signin
+  page is built by calling the `formbuilder_setup` hook.
+
+Alice signs in with her openid.
+
+* The [[openid]] plugin's `formbuilder` hook sees that an openid was
+  entered in the signin form, and redirects to Alice's openid provider.
+* Alice's openid provider calls back to ikiwiki. The [[openid]] plugin
+  has an `auth` hook that finishes the openid signin process.
+* Signin complete, ikiwiki returns to what Alice was doing before; editing
+  a page.
+* Now all the `canedit` hooks are happy. The [[editpage]] plugin calls
+  `formbuilder_setup` to display the page editing form.
+
+Alice saves her change to the page.
+
+* The [[editpage]] plugin's `formbuilder` hook sees that the Save button
+  was pressed, and calls the `checkcontent` and `editcontent` hooks.
+  Then it saves the page to disk, and branches into the compiler part
+  of ikiwiki to refresh the wiki.
+
 ## Types of plugins
 
 Most ikiwiki [[plugins]] are written in perl, like ikiwiki. This gives the
@@ -31,16 +107,20 @@ they're the same as far as how they hook into ikiwiki. This document will
 explain how to write both sorts of plugins, albeit with an emphasis on perl
 plugins.
 
-## Considerations
+## Plugin interface
 
-One thing to keep in mind when writing a plugin is that ikiwiki is a wiki
-*compiler*. So plugins influence pages when they are built, not when they
-are loaded. A plugin that inserts the current time into a page, for
-example, will insert the build time. Also, as a compiler, ikiwiki avoids
-rebuilding pages unless they have changed, so a plugin that prints some
-random or changing thing on a page will generate a static page that won't
-change until ikiwiki rebuilds the page for some other reason, like the page
-being edited.
+To import the ikiwiki plugin interface:
+
+       use IkiWiki '3.00';
+
+This will import several variables and functions into your plugin's
+namespace. These variables and functions are the ones most plugins need,
+and a special effort will be made to avoid changing them in incompatible
+ways, and to document any changes that have to be made in the future.
+
+Note that IkiWiki also provides other variables and functions that are not
+exported by default. No guarantee is made about these in the future, so if
+it's not exported, the wise choice is to not use it.
 
 ## Registering plugins
 
@@ -68,20 +148,21 @@ In roughly the order they are called.
 
 This allows for plugins to perform their own processing of command-line
 options and so add options to the ikiwiki command line. It's called during
-command line processing, with @ARGV full of any options that ikiwiki was
+command line processing, with `@ARGV` full of any options that ikiwiki was
 not able to process on its own. The function should process any options it
-can, removing them from @ARGV, and probably recording the configuration
-settings in %config. It should take care not to abort if it sees
+can, removing them from `@ARGV`, and probably recording the configuration
+settings in `%config`. It should take care not to abort if it sees
 an option it cannot process, and should just skip over those options and
-leave them in @ARGV.
+leave them in `@ARGV`.
 
 ### checkconfig
 
        hook(type => "checkconfig", id => "foo", call => \&checkconfig);
 
 This is useful if the plugin needs to check for or modify ikiwiki's
-configuration. It's called early in the startup process. The
-function is passed no values. It's ok for the function to call
+configuration. It's called early in the startup process. `%config`
+is populated at this point, but other state has not yet been loaded.
+The function is passed no values. It's ok for the function to call
 `error()` if something isn't configured right.
 
 ### refresh
@@ -201,22 +282,22 @@ like `Makefile` that have no extension.
 If `hook` is passed an optional "longname" parameter, this value is used
 when prompting a user to choose a page type on the edit page form.
 
-### postscan
+### indexhtml
 
-       hook(type => "postscan", id => "foo", call => \&postscan);
+       hook(type => "indexhtml", id => "foo", call => \&indexhtml);
 
 This hook is called once the page has been converted to html (but before
 the generated html is put in a template). The most common use is to
 update search indexes. Added in ikiwiki 2.54.
 
-The function is passed named parameters "page" and "content". Its return
-value is ignored.
+The function is passed named parameters "page", "destpage", and "content".
+Its return value is ignored.
 
 ### pagetemplate
 
        hook(type => "pagetemplate", id => "foo", call => \&pagetemplate);
 
-[[Templates|wikitemplates]] are filled out for many different things in
+[[Templates]] are filled out for many different things in
 ikiwiki, like generating a page, or part of a blog page, or an rss feed, or
 a cgi. This hook allows modifying the variables available on those
 templates. The function is passed named parameters. The "page" and
@@ -232,11 +313,20 @@ a new custom parameter to the template.
 
        hook(type => "templatefile", id => "foo", call => \&templatefile);
 
-This hook allows plugins to change the [[template|wikitemplates]] that is
+This hook allows plugins to change the [[template|templates]] that is
 used for a page in the wiki. The hook is passed a "page" parameter, and
-should return the name of the template file to use, or undef if it doesn't
-want to change the default ("page.tmpl"). Template files are looked for in
-/usr/share/ikiwiki/templates by default.
+should return the name of the template file to use (relative to the
+template directory), or undef if it doesn't want to change the default
+("page.tmpl").
+
+### pageactions
+
+       hook(type => "pageactions", id => "foo", call => \&pageactions);
+
+This hook allows plugins to add arbitrary actions to the action bar on a
+page (next to Edit, RecentChanges, etc). The hook is passed a "page"
+parameter, and can return a list of html fragments to add to the action
+bar.
 
 ### sanitize
 
@@ -455,7 +545,13 @@ The data returned is a list of `%config` options, followed by a hash
 describing the option. There can also be an item named "plugin", which
 describes the plugin as a whole. For example:
 
-                return
+               return
+                       plugin => {
+                               description => "description of this plugin",
+                               safe => 1,
+                               rebuild => 1,
+                               section => "misc",
+                       },
                        option_foo => {
                                type => "boolean",
                                description => "enable foo?",
@@ -470,11 +566,6 @@ describes the plugin as a whole. For example:
                                safe => 1,
                                rebuild => 0,
                        },
-                       plugin => {
-                               description => "description of this plugin",
-                               safe => 1,
-                               rebuild => 1,
-                       },
 
 * `type` can be "boolean", "string", "integer", "pagespec",
   or "internal" (used for values that are not user-visible). The type is
@@ -495,6 +586,9 @@ describes the plugin as a whole. For example:
   the plugin) will require a wiki rebuild, false if no rebuild is needed,
   and undef if a rebuild could be needed in some circumstances, but is not
   strictly required.
+* `section` can optionally specify which section in the config file
+  the plugin fits in. The convention is to name the sections the
+  same as the tags used for [[plugins|plugin]] on this wiki.
 
 ### genwrapper
 
@@ -503,28 +597,17 @@ describes the plugin as a whole. For example:
 This hook is used to inject C code (which it returns) into the `main`
 function of the ikiwiki wrapper when it is being generated.
 
-## Plugin interface
-
-To import the ikiwiki plugin interface:
-
-       use IkiWiki '3.00';
-
-This will import several variables and functions into your plugin's
-namespace. These variables and functions are the ones most plugins need,
-and a special effort will be made to avoid changing them in incompatible
-ways, and to document any changes that have to be made in the future.
+## Exported variables
 
-Note that IkiWiki also provides other variables and functions that are not
-exported by default. No guarantee is made about these in the future, so if
-it's not exported, the wise choice is to not use it.
+Several variables are exported to your plugin when you `use IkiWiki;`
 
-### %config
+### `%config`
 
 A plugin can access the wiki's configuration via the `%config`
 hash. The best way to understand the contents of the hash is to look at
 your ikiwiki setup file, which sets the hash content to configure the wiki.
 
-### %pagestate
+### `%pagestate`
 
 The `%pagestate` hash can be used by plugins to save state that they will need
 next time ikiwiki is run. The hash holds per-page state, so to set a value,
@@ -542,7 +625,7 @@ When pages are deleted, ikiwiki automatically deletes their pagestate too.
 Note that page state does not persist across wiki rebuilds, only across
 wiki updates.
 
-### %wikistate
+### `%wikistate`
 
 The `%wikistate` hash can be used by a plugin to store persistant state
 that is not bound to any one page. To set a value, use
@@ -551,23 +634,53 @@ serialize, `$key` is any string you like, and `$id` must be the same as the
 "id" parameter passed to `hook()` when registering the plugin, so that the
 state can be dropped if the plugin is no longer used.
 
-### Other variables
+### `%links`
+
+The `%links` hash can be used to look up the names of each page that
+a page links to. The name of the page is the key; the value is an array
+reference. Do not modify this hash directly; call `add_link()`.
 
-If your plugin needs to access data about other pages in the wiki. It can
-use the following hashes, using a page name as the key:
+       $links{"foo"} = ["bar", "baz"];
 
-* `%links` lists the names of each page that a page links to, in an array
-  reference.
-* `%destsources` contains the name of the source file used to create each
-  destination file.
-* `%pagesources` contains the name of the source file for each page.
+### `%typedlinks`
 
-Also, the `%IkiWiki::version` variable contains the version number for the
-ikiwiki program.
+The `%typedlinks` hash records links of specific types. Do not modify this
+hash directly; call `add_link()`. The keys are page names, and the values
+are hash references. In each page's hash reference, the keys are link types
+defined by plugins, and the values are hash references with link targets
+as keys, and 1 as a dummy value, something like this:
 
-### Library functions
+       $typedlinks{"foo"} = {
+               tag => { short_word => 1, metasyntactic_variable => 1 },
+               next_page => { bar => 1 },
+       };
 
-#### `hook(@)`
+Ordinary [[WikiLinks|ikiwiki/WikiLink]] appear in `%links`, but not in
+`%typedlinks`.
+
+### `%pagesources`
+
+The `%pagesources` has can be used to look up the source filename
+of a page. So the key is the page name, and the value is the source
+filename. Do not modify this hash.
+
+       $pagesources{"foo"} = "foo.mdwn";
+
+### `%destsources`
+
+The `%destsources` hash records the name of the source file used to
+create each destination file. The key is the output filename (ie,
+"foo/index.html"), and the value is the source filename that it was built
+from (eg, "foo.mdwn"). Note that a single source file may create multiple
+destination files. Do not modify this hash directly; call `will_render()`.
+       
+       $destsources{"foo/index.html"} = "foo.mdwn";
+
+## Library functions
+
+Several functions are exported to your plugin when you `use IkiWiki;`
+
+### `hook(@)`
 
 Hook into ikiwiki's processing. See the discussion of hooks above.
 
@@ -576,12 +689,12 @@ named `no_override` is supported, If it's set to a true value, then this hook
 will not override any existing hook with the same id. This is useful if
 the id can be controled by the user.
 
-#### `debug($)`
+### `debug($)`
 
 Logs a debugging message. These are supressed unless verbose mode is turned
 on.
 
-#### `error($;$)`
+### `error($;$)`
 
 Aborts with an error message. If the second parameter is passed, it is a
 function that is called after the error message is printed, to do any final
@@ -595,37 +708,40 @@ In other hooks, error() is a fatal error, so use with care. Try to avoid
 dying on bad input when building a page, as that will halt
 the entire wiki build and make the wiki unusable.
 
-#### `template($;@)`
+### `template($;@)`
 
-Creates and returns a [[!cpan HTML::Template]] object. The first parameter
-is the name of the file in the template directory. The optional remaining
+Creates and returns a [[!cpan HTML::Template]] object. (In a list context,
+returns the parameters needed to construct the obhect.) 
+
+The first parameter is the name of the template file. The optional remaining
 parameters are passed to `HTML::Template->new`.
 
-#### `htmlpage($)`
+Normally, the template file is first looked for in the templates/ subdirectory
+of the srcdir. Failing that, it is looked for in the templatedir.
 
-Passed a page name, returns the base name that will be used for a the html
-page created from it. (Ie, it appends ".html".)
+Wiki pages can be used as templates. This should be done only for templates
+which it is safe to let wiki users edit. Enable it by passing a filename
+with no ".tmpl" extension. Template pages are normally looked for in
+the templates/ directory. If the page name starts with "/", a page
+elsewhere in the wiki can be used.
 
-Use this when constructing the filename of a html file. Use `urlto` when
-generating a link to a page.
+### `template_depends($$;@)`
 
-### `deptype(@)`
+Use this instead of `template()` if the content of a template is being
+included into a page. This causes the page to depend on the template,
+so it will be updated if the template is modified.
 
-Use this function to generate ikiwiki's internal representation of a
-dependency type from one or more of these keywords:
+Like `template()`, except the second parameter is the page.
 
-* `content` is the default. Any change to the content
-  of a page triggers the dependency.
-* `presence` is only triggered by a change to the presence
-  of a page.
-* `links` is only triggered by a change to the links of a page.
-  This includes when a link is added, removed, or changes what
-  it points to due to other changes. It does not include the
-  addition or removal of a duplicate link.
+### `htmlpage($)`
 
-If multiple types are specified, they are combined.
+Passed a page name, returns the base name that will be used for a the html
+page created from it. (Ie, it appends ".html".)
+
+Use this when constructing the filename of a html file. Use `urlto` when
+generating a link to a page.
 
-#### `pagespec_match_list($$;@)`
+### `pagespec_match_list($$;@)`
 
 Passed a page name, and [[ikiwiki/PageSpec]], returns a list of pages
 in the wiki that match the [[ikiwiki/PageSpec]]. 
@@ -646,7 +762,10 @@ Additional named parameters can be specified:
 * `filter` is a reference to a function, that is called and passed a page,
   and returns true if the page should be filtered out of the list.
 * `sort` specifies a sort order for the list. See
-  [[ikiwiki/PageSpec/sorting]] for the avilable sort methods.
+  [[ikiwiki/PageSpec/sorting]] for the avilable sort methods. Note that
+  if a sort method is specified that depends on the
+  page content (such as 'meta(foo)'), the deptype needs to be set to
+  a content dependency.
 * `reverse` if true, sorts in reverse.
 * `num` if nonzero, specifies the maximum number of matching pages that
   will be returned.
@@ -656,7 +775,7 @@ Additional named parameters can be specified:
 Any other named parameters are passed on to `pagespec_match`, to further
 limit the match.
 
-#### `add_depends($$;$)`
+### `add_depends($$;$)`
 
 Makes the specified page depend on the specified [[ikiwiki/PageSpec]].
 
@@ -664,7 +783,7 @@ By default, dependencies are full content dependencies, meaning that the
 page will be updated whenever anything matching the PageSpec is modified.
 This can be overridden by passing a `deptype` value as the third parameter.
 
-#### `pagespec_match($$;@)`
+### `pagespec_match($$;@)`
 
 Passed a page name, and [[ikiwiki/PageSpec]], returns a true value if the
 [[ikiwiki/PageSpec]] matches the page.
@@ -678,7 +797,23 @@ The most often used is "location", which specifies the location the
 PageSpec should match against. If not passed, relative PageSpecs will match
 relative to the top of the wiki.
 
-#### `bestlink($$)`
+### `deptype(@)`
+
+Use this function to generate ikiwiki's internal representation of a
+dependency type from one or more of these keywords:
+
+* `content` is the default. Any change to the content
+  of a page triggers the dependency.
+* `presence` is only triggered by a change to the presence
+  of a page.
+* `links` is only triggered by a change to the links of a page.
+  This includes when a link is added, removed, or changes what
+  it points to due to other changes. It does not include the
+  addition or removal of a duplicate link.
+
+If multiple types are specified, they are combined.
+
+### `bestlink($$)`
 
 Given a page and the text of a link on the page, determine which
 existing page that link best points to. Prefers pages under a
@@ -686,7 +821,7 @@ subdirectory with the same name as the source page, failing that
 goes down the directory tree to the base looking for matching
 pages, as described in [[ikiwiki/SubPage/LinkingRules]].
 
-#### `htmllink($$$;@)`
+### `htmllink($$$;@)`
 
 Many plugins need to generate html links and add them to a page. This is
 done by using the `htmllink` function. The usual way to call
@@ -714,7 +849,7 @@ control some options. These are:
 * class - set to add a css class to the link
 * title - set to add a title attribute to the link
 
-#### `readfile($;$)`
+### `readfile($;$)`
 
 Given a filename, reads and returns the entire file.
 
@@ -723,7 +858,7 @@ in binary mode.
 
 A failure to read the file will result in it dying with an error.
 
-#### `writefile($$$;$$)`
+### `writefile($$$;$$)`
 
 Given a filename, a directory to put it in, and the file's content,
 writes a file. 
@@ -751,7 +886,7 @@ generally the directory parameter is a trusted toplevel directory like
 the srcdir or destdir, and any subdirectories of this are included in the
 filename parameter.
 
-#### `will_render($$)`
+### `will_render($$)`
 
 Given a page name and a destination file name (not including the base
 destination directory), register that the page will result in that file
@@ -767,34 +902,34 @@ Ikiwiki uses this information to automatically clean up rendered files when
 the page that rendered them goes away or is changed to no longer render
 them. will_render also does a few important security checks.
 
-#### `pagetype($)`
+### `pagetype($)`
 
 Given the name of a source file, returns the type of page it is, if it's
 a type that ikiwiki knowns how to htmlize. Otherwise, returns undef.
 
-#### `pagename($)`
+### `pagename($)`
 
 Given the name of a source file, returns the name of the wiki page
 that corresponds to that file.
 
-#### `pagetitle($)`
+### `pagetitle($)`
 
 Give the name of a wiki page, returns a version suitable to be displayed as
 the page's title. This is accomplished by de-escaping escaped characters in
 the page name. "_" is replaced with a space, and '__NN__' is replaced by 
 the UTF character with code NN.
 
-#### `titlepage($)`
+### `titlepage($)`
 
 This performs the inverse of `pagetitle`, ie, it converts a page title into
 a wiki page name.
 
-#### `linkpage($)`
+### `linkpage($)`
 
 This converts text that could have been entered by the user as a
 [[ikiwiki/WikiLink]] into a wiki page name.
 
-#### `srcfile($;$)`
+### `srcfile($;$)`
 
 Given the name of a source file in the wiki, searches for the file in
 the source directory and the underlay directories (most recently added
@@ -804,7 +939,7 @@ Normally srcfile will fail with an error message if the source file cannot
 be found. The second parameter can be set to a true value to make it return
 undef instead.
 
-#### `add_underlay($)`
+### `add_underlay($)`
 
 Adds a directory to the set of underlay directories that ikiwiki will
 search for files.
@@ -812,18 +947,25 @@ search for files.
 If the directory name is not absolute, ikiwiki will assume it is in
 the parent directory of the configured underlaydir.
 
-#### `displaytime($;$)`
+### `displaytime($;$$)`
 
 Given a time, formats it for display.
 
 The optional second parameter is a strftime format to use to format the
 time.
 
-#### `gettext`
+If the third parameter is true, this is the publication time of a page.
+(Ie, set the html5 pubdate attribute.)
+
+### `gettext`
 
 This is the standard gettext function, although slightly optimised.
 
-#### `urlto($$;$)`
+### `ngettext`
+
+This is the standard ngettext function, although slightly optimised.
+
+### `urlto($$;$)`
 
 Construct a relative url to the first parameter from the page named by the
 second. The first parameter can be either a page name, or some other
@@ -832,13 +974,13 @@ destination file, as registered by `will_render`.
 If the third parameter is passed and is true, an absolute url will be
 constructed instead of the default relative url.
 
-#### `newpagefile($$)`
+### `newpagefile($$)`
 
 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.
@@ -847,11 +989,31 @@ 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`.
 
-#### `add_link($$)`
+### `add_link($$;$)`
 
 This adds a link to `%links`, ensuring that duplicate links are not
 added. Pass it the page that contains the link, and the link text.
 
+An optional third parameter sets the link type. If not specified,
+it is an ordinary [[ikiwiki/WikiLink]].
+
+### `add_autofile($$$)`
+
+Sometimes you may want to add a file to the `srcdir` as a result of content
+of other pages. For example, [[plugins/tag]] pages can be automatically
+created as needed. This function can be used to do that. 
+
+The three parameters are the filename to create (relative to the `srcdir`),
+the name of the plugin, and a callback function. The callback will be
+called if it is appropriate to automatically add the file, and should then
+take care of creating it, and doing anything else it needs to (such as
+checking it into revision control). Note that the callback may not always
+be called. For example, if an automatically added file is deleted by the
+user, ikiwiki will avoid re-adding it again.
+
+This function needs to be called during the scan hook, or earlier in the
+build process, in order to add the file early enough for it to be built.
+
 ## Miscellaneous
 
 ### Internal use pages
@@ -889,16 +1051,20 @@ token, that will be passed into `rcs_commit` when committing. For example,
 it might return the current revision ID of the file, and use that
 information later when merging changes.
 
-#### `rcs_commit($$$;$$)`
+#### `rcs_commit(@)`
+
+Passed named parameters: `file`, `message`, `token` (from `rcs_prepedit`),
+and `session` (optional).
 
-Passed a file, message, token (from `rcs_prepedit`), user, and ip address.
 Should try to commit the file. Returns `undef` on *success* and a version
 of the page with the rcs's conflict markers on failure.
 
-#### `rcs_commit_staged($$$)`
+#### `rcs_commit_staged(@)`
+
+Passed named parameters: `message`, and `session` (optional).
 
-Passed a message, user, and ip address. Should commit all staged changes.
-Returns undef on success, and an error message on failure.
+Should commit all staged changes. Returns undef on success, and an
+error message on failure.
 
 Changes can be staged by calls to `rcs_add`, `rcs_remove`, and
 `rcs_rename`.
@@ -941,7 +1107,9 @@ The data structure returned for each change is:
 
        {
                rev => # the RCSs id for this commit
-               user => # name of user who made the change,
+               user => # user who made the change (may be an openid),
+               nickname => # short name for user (optional; not an openid),
+               
                committype => # either "web" or the name of the rcs,
                when => # time when the change was made,
                message => [
@@ -971,6 +1139,17 @@ it up in the history.
 
 It's ok if this is not implemented, and throws an error.
 
+If the RCS cannot determine a ctime for the file, return 0.
+
+#### `rcs_getmtime($)`
+
+This is used to get the page modification time for a file from the RCS, by
+looking it up in the history.
+
+It's ok if this is not implemented, and throws an error.
+
+If the RCS cannot determine a mtime for the file, return 0.
+
 #### `rcs_receive()`
 
 This is called when ikiwiki is running as a pre-receive hook (or
@@ -1018,6 +1197,24 @@ For example, "backlink(foo)" is influenced by the contents of page foo;
 they match; "created_before(foo)" is influenced by the metadata of foo;
 while "glob(*)" is not influenced by the contents of any page.
 
+### Sorting plugins
+
+Similarly, it's possible to write plugins that add new functions as
+[[ikiwiki/pagespec/sorting]] methods. To achieve this, add a function to
+the IkiWiki::SortSpec package named `cmp_foo`, which will be used when sorting
+by `foo` or `foo(...)` is requested.
+
+The names of pages to be compared are in the global variables `$a` and `$b`
+in the IkiWiki::SortSpec package. The function should return the same thing
+as Perl's `cmp` and `<=>` operators: negative if `$a` is less than `$b`,
+positive if `$a` is greater, or zero if they are considered equal. It may
+also raise an error using `error`, for instance if it needs a parameter but
+one isn't provided.
+
+The function will also be passed one or more parameters. The first is
+`undef` if invoked as `foo`, or the parameter `"bar"` if invoked as `foo(bar)`;
+it may also be passed additional, named parameters.
+
 ### Setup plugins
 
 The ikiwiki setup file is loaded using a pluggable mechanism. If you look
index f66b854954e57f85b221fc1d9df5504e2701e663..83c6910d07252f59c98cf6d15bbd74f0139cfb61 100644 (file)
@@ -6,11 +6,37 @@ histories.
 Ikiwiki started out supporting only [[Subversion|svn]], but the interface
 ikiwiki uses to a revision control system is sufficiently simple and
 generic that it can be adapted to work with many systems by writing a
-[[plugin|plugins/write]]. [[Subversion|svn]] is still a recommended choice;
-[[git]] is another well-tested option.
+[[plugin|plugins/write]]. These days, most people use [[git]].
 
-These are all the supported revision control systems:
-[[!inline pages="rcs/* and !*/Discussion and !rcs/details" archive=yes]]
+While all supported revision control systems work well enough for basic
+use, some advanced or special features are not supported in all of them.
+The table below summarises this for each revision control system and
+links to more information about each.
+
+[[!table data="""
+feature             |[[git]]|[[svn]]|[[bzr]]   |[[monotone]]|[[mercurial]]|[[darcs]]|[[tla]]   |[[cvs]]
+[[ikiwiki-makerepo]]|yes    |yes    |yes       |yes         |yes          |yes      |no        |yes
+auto.setup          |yes    |yes    |incomplete|yes         |incomplete   |yes      |incomplete|yes
+`rcs_commit_staged` |yes    |yes    |yes       |yes         |no           |yes      |no        |yes
+`rcs_rename`        |yes    |yes    |yes       |yes         |no           |yes      |no        |yes
+`rcs_remove`        |yes    |yes    |yes       |yes         |no           |yes      |no        |yes
+`rcs_diff`          |yes    |yes    |yes       |yes         |no           |yes      |yes       |yes
+`rcs_getctime`      |fast   |slow   |slow      |slow        |slow         |slow     |slow      |slow
+`rcs_getmtime`      |fast   |slow   |slow      |no          |no           |no       |no        |no
+anonymous push      |yes    |no     |no        |no          |no           |no       |no        |no
+conflict handling   |yes    |yes    |yes       |buggy       |yes          |yes      |yes       |yes
+openid username     |yes    |no     |no        |no          |no           |no       |no        |no
+"""]]
+
+Notes:
+
+* Lack of support in [[ikiwiki-makerepo]] or auto.setup can make it harder to
+  set up a wiki using that revision control system.
+* The `rcs_commit_staged` hook is needed to use [[attachments|plugins/attachment]]
+  or [[plugins/comments]].
+* `rcs_getctime` and `rcs_getmtime` may be implemented in a fast way (ie, one log
+  lookup for all files), or very slowly (one lookup per file).
+* Openid username support allows avoiding display of Google's ugly openids.
 
 There is a page with [[details]] about how the different systems work with
 ikiwiki, for the curious.
index 000eb0b3cd6282b78c56cbec462782b74c116679..c627792d7bb858e67885b1fc3fac087efd09ca00 100644 (file)
@@ -28,12 +28,7 @@ updates the published  wiki itself.
 
 The other (optional) leaf node repositories are meant for you to work
 on, and commit to, changes should then be pushed to the bare root
-repository.  In theory, you could work on the same leaf node repository
-that ikiwiki uses to compile the wiki from, and the [[cgi]] commits
-to, as long as you ensure that permissions and ownership don't hinder
-the working of the [[cgi]]. This can be done, for example, by using
-ACL's, in practice, it is easier to just setup separate clones for
-yourself.
+repository.
 
 So, to reiterate, when using Git, you probably want to set up three
 repositories:
@@ -41,9 +36,9 @@ repositories:
 * The root repository. This should be a bare repository (meaning that
   it does not have a working tree checked out), which the other
   repositories will push to/pull from.  It is a bare repository, since
-  there are problems pushing to a repository that has a working
+  git does not support pushing to a repository that has a working
   directory. This is called _repository_ in [[ikiwiki-makerepo]]'s
-  manual page. Nominally, this bare repository has a `post-update` hook
+  manual page. This bare repository has a `post-update` hook
   that either is or calls ikiwiki's git wrapper, which changes to the
   working directory for ikiwiki, does a `git pull`, and refreshes ikiwiki
   to regenerate the wiki with any new content. The [[setup]] page describes
@@ -51,10 +46,11 @@ repositories:
 
 * The second repository is a clone of the bare root repository, and
   has a working tree which is used as ikiwiki's srcdir for compiling
-  the wiki. **Never** push to this repository. When running as a
-  [[cgi]], the changes are committed to this repository, and pushed to
-  the master repository above. This is called _srcdir_ in
-  [[ikiwiki-makerepo]]'s manual page.
+  the wiki. **Never** push to this repository. It is wise to not make
+  changes or commits directly to this repository, to avoid conflicting
+  with ikiwiki's own changes. When running as a [[cgi]], the changes
+  are committed to this repository, and pushed to the master repository
+  above. This is called _srcdir_ in [[ikiwiki-makerepo]]'s manual page.
 
 * The other (third, fourth, fifth, sixth -- however many pleases you)
   repositories are also clones of the bare root repository above --
@@ -87,8 +83,8 @@ It can be tricky to get the permissions right to allow multiple people to
 commit to an ikiwiki git repository. As the [[security]] page mentions,
 for a secure ikiwiki installation, only one person should be able to write
 to ikiwiki's srcdir. When other committers make commits, their commits
-should go to the bare repository, which has a `post-update` hook that uses
-ikiwiki to pull the changes to the srcdir.
+should be pushed to the bare repository, which has a `post-update` hook
+that uses ikiwiki to pull the changes to the srcdir.
 
 One setup that will work is to put all committers in a group (say,
 "ikiwiki"), and use permissions to allow that group to commit to the bare git
index f8c44b6eb41806b32bf96d27acd6cdf97994bcd6..7aa682978759cd7415fd824f97c3b32275b9643f 100644 (file)
@@ -1,4 +1,4 @@
-[Subversion](http://subversion.tigris.org/) is a revision control system. While ikiwiki is relatively
+[Subversion](http://subversion.tigris.org/) is a [[revision control system|rcs]]. While ikiwiki is relatively
 independent of the underlying revision control system, and can easily be
 used without one, using it with Subversion or another revision control
 system is recommended.
index cad5d51f4e96edee1bed08611a38bad007180db0..79eecd6277ff5ba77e22ff2bafbea95e4870efbd 100644 (file)
@@ -2,6 +2,9 @@
 [GNU](http://www.gnu.org/) [Arch](http://www.gnuarch.org/) revision control
 system. Ikiwiki supports storing a wiki in tla.
 
+Warning: Since tla is not being maintained, neither is this plugin, and
+using ikiwiki with tla is not recommended.
+
 Ikiwiki can run as a [[post-commit]] hook to update a wiki whenever commits
 come in. When running as a [[cgi]] with tla, ikiwiki automatically
 commits edited pages to the Arch repostory, and uses the Arch
index a701a26855f7cc548fb83d62da5a08d0ad2a9c8d..134ebcb7b11b63360ba65483141ee6778ff096c4 100644 (file)
@@ -69,6 +69,26 @@ backwards compatability.
 
 ----
 
+# compatability breaking changes
+
+Probably incomplete list:
+
+* Drop old `--getctime` option.
+* Remove compatability code in `loadindex` to handle old index data layouts.
+* Make pagespecs match relative by default? (see [[discussion]])
+* Flip wikilinks? (see [[todo/link_plugin_perhaps_too_general?]])
+* YADA format setup files per default?
+* Enable tagbase by default (so that tag autocreation will work by default).
+  Note that this is already done for wikis created by `auto-blog.setup`.
+* [[tips/html5]] on by default (some day..)
+* Remove support for old `.ikiwiki/comments_pending` from comment plugin.
+* Use yaml formatted setup files by default. (Not too compatability breaking
+  really.)
+
+In general, we try to use [[ikiwiki-transition]] or forced rebuilds on
+upgrade to deal with changes that break compatability. Some things that
+can't help with.
+
 # future goals
 
 * Conversion support for existing other wikis.
index 0b69867bfb53285b0d6619361cd5864bde2befe8..8233b199046ce3e806f918f240a970d8074c2f89 100644 (file)
@@ -3,6 +3,7 @@ backwards compatibility problems. Should this be marked as a future plan, perhap
 major version number like 2.0? --Ethan
 
 Yes, I'm looking at making this kind of change at 2.0, added to the list.
+(Update: Didn't make it in 2.0 or 3.0...)
 However, I have doubts that it makes good sense to go relative by default.
 While it's not consitent with links, it seems to work better overall to
 have pagespecs be absolute by default, IMHO. --[[Joey]]
index afd7dbeab3d3c7d8eb972b4b214ad350e24b88e8..8ecaf1cb9d4347fa717174197cf83c9cdcb68942 100644 (file)
@@ -1,9 +1,8 @@
 This is the [[SandBox]], a page anyone can edit to try out ikiwiki (version [[!version  ]]).
 
-
 # Header
 
-## Subheader
+## Subheader2
 
 > This is a blockquote.
 >
@@ -32,6 +31,8 @@ Bulleted list
 * item
 * one
   * footballs; runner; unices
+  * Cool !
+
 
 ----
 
@@ -48,32 +49,8 @@ Bulleted list
 * <http://www.gnu.org/>
 * [GNU](http://www.gnu.org/)
 
------
-
-[[!progress percent=27]]
-
-[[!progress percent=78]]
-
------
+----
 
 This **SandBox** is also a [[blog]]!
 
 [[!inline pages="sandbox/* and !*/Discussion" rootpage="sandbox" show="4" archive="yes"]]
-
-----
-
-What about [relative urls](../setup/byhand)?
-
-[[!toggleable  id="foobar" text="""
-foo
-"""]]
-
-[[!toggleable  id="foobar" text="""
-bar
-"""]]
-
-[[!toggle  id="foobar" text="foo/bar"]]
-
-Hmm, can I dig it?
-
-Test
diff --git a/doc/sandbox/danc.mdwn b/doc/sandbox/danc.mdwn
new file mode 100644 (file)
index 0000000..9766475
--- /dev/null
@@ -0,0 +1 @@
+ok
diff --git a/doc/sandbox/prova_blog.html b/doc/sandbox/prova_blog.html
new file mode 100644 (file)
index 0000000..d69937e
--- /dev/null
@@ -0,0 +1,8 @@
+Questa è una prova.
+Vediamo se funziona
+
+<pre>
+#!/bin/bash
+
+echo "ciao"
+</pre>
diff --git a/doc/sandbox/sidebar.mdwn b/doc/sandbox/sidebar.mdwn
new file mode 100644 (file)
index 0000000..9daeafb
--- /dev/null
@@ -0,0 +1 @@
+test
index 3924186c2120c9371b1f55b648c4a760a0a5d6d3..34a0052397fa857552051fc7e06cef84a1ccab01 100644 (file)
@@ -162,10 +162,11 @@ closed though.
 
 ## HTML::Template security
 
-If the [[plugins/template]] plugin is enabled, users can modify templates
-like any other part of the wiki. This assumes that HTML::Template is secure
+If the [[plugins/template]] plugin is enabled, all users can modify templates
+like any other part of the wiki. Some trusted users can modify templates
+without it too. This assumes that HTML::Template is secure
 when used with untrusted/malicious templates. (Note that includes are not
-allowed, so that's not a problem.)
+allowed.)
 
 ----
 
@@ -427,3 +428,15 @@ enabling TeX configuration options that disallow unsafe TeX commands.
 The fix was released on 30 Aug 2009 in version 3.1415926, and was
 backported to stable in version 2.53.4. If you use the teximg plugin,
 I recommend upgrading. ([[!cve CVE-2009-2944]])
+
+## javascript insertion via svg uris
+
+Ivan Shmakov pointed out that the htmlscrubber allowed `data:image/*` urls,
+including `data:image/svg+xml`. But svg can contain javascript, so that is
+unsafe.
+
+This hole was discovered on 12 March 2010 and fixed the same day
+with the release of ikiwiki 3.20100312.
+A fix was also backported to Debian etch, as version 2.53.5. I recommend
+upgrading to one of these versions if your wiki can be edited by third
+parties.
index 2d4da553615cc52c71c053e81dd23b8deeafa3a7..03fed3aa900d67019aa8a44472e5b6d927fc1636 100644 (file)
@@ -47,7 +47,7 @@ Now you can go to the url it told you, and edit pages in your new wiki
 using the web interface.
 
 (If the web interface doesn't seem to allow editing or login, you may
-need to configure [[configure_the_web_server|tips/dot_cgi]].)
+need to [[configure_the_web_server|tips/dot_cgi]].)
 
 ## Checkout and edit wiki source
 
@@ -89,7 +89,7 @@ These range from changing the wiki's name, to enabling [[plugins]],
 to banning users and locking pages.
 
 If you log in as the admin user you configured earlier, and go to
-your Preferences page, you can click on "Wiki Setup" to customize many
+your Preferences page, you can click on "Setup" to customize many
 wiki settings and plugins.
 
 Some settings cannot be configured on the web, for security reasons or
diff --git a/doc/setup/byhand/discussion.mdwn b/doc/setup/byhand/discussion.mdwn
new file mode 100644 (file)
index 0000000..9419767
--- /dev/null
@@ -0,0 +1,7 @@
+What directory is the 'working copy'? There can be two interpretations: the current dir and the .git dir.
+
+> It is fairly common terminology amoung all version control systems to use
+> "working copy" to refer to a checkout from version control, including
+> copies of all the versioned files, and whatever VCS-specific cruft that
+> entails. So, a working copy is everything you get when you `git clone`
+> a repository. --[[Joey]]
index b71263dae42580f7cf8f32fa6e87d131d0fe47f3..74f7740dbae53b71814aaa24970f27f00343073c 100644 (file)
@@ -245,3 +245,16 @@ Thank you! I'm not a Perl programmer, so what's your opinion: is this behavior a
 
 I am experiencing the same problem "/etc/ikiwiki/custom: failed to set up the repository with ikiwiki-makerepo
 " on Debian squeeze with perl5.10.0. Upgrading to ikiwiki 3.10 fixes it. -- [Albert](http://www.docunext.com/)
+
+----
+
+Just a note, perl 5.10 isn't packaged as part of RHEL or thus CentOS nor EPEL,
+so it's not especially trivial to satisfy that requirement for ikiwiki on
+those platforms, without backporting it from Fedora or building from source.
+However, I have an ikiwiki 3.20100403 running on RHEL-4 supplied 5.8.8 without
+(seemingly too much) complaint.  How strong is the 5.10 requirement? what
+precicely breaks without it? -- [[Jon]]
+
+> I don't remember what was the specific problem with perl 5.8.8. All I can
+> find is some taint checking bugs, which are currently worked around by
+> taint checking being disabled. --[[Joey]]
index 317d4c7aacbb3efb76b52a8c664d11a4cdfdb163..bf000dae189ac8d7c12a6780837a422a3773873c 100644 (file)
@@ -4,6 +4,14 @@
  * local.css and use it to override or change settings in this one.
  */
 
+/* html5 compat */
+article,
+header,
+footer,
+nav {
+       display: block;
+}
+
 .header {
        margin: 0;
        font-size: 22px;
 
 .actions ul {
        margin: 0;
-       padding: 6px;
+       padding: 6px .4em;
+       height: 1em;
        list-style-type: none;
 }
 .actions li {
        display: inline;
-       padding: .2em .4em;
+       padding: .2em;
 }
 .pageheader .actions ul {
        border-bottom: 1px solid #000;
        border-bottom: 1px solid #000;
 }
 
-div.inlinecontent {
+.inlinecontent {
        margin-top: .4em;
 }
 
-.pagefooter {
-       clear: both;
-}
-.inlinefooter {
+.pagefooter,
+.inlinefooter,
+.comments {
        clear: both;
 }
 
-.tags {
-}
-
 #pageinfo {
        margin: 1em 0;
        border-top: 1px solid #000;
 }
 
-div.tags {
+.tags {
        margin-top: 1em;
 }
 
+.inlinepage .tags {
+        display: inline;
+}
+
 .mapparent {
        text-decoration: none;
 }
@@ -100,19 +109,28 @@ div.tags {
 }
 
 #editcontent {
-       width: 100%;
+       width: 98%;
+}
+
+.editcontentdiv {
+       width: auto;
+       overflow: auto;
 }
 
 img {
        border-style: none;
 }
 
+pre {
+       overflow: auto;
+}
+
 div.recentchanges {
        border-style: solid;
        border-width: 1px;
        overflow: auto;
-       clear: both;
-       width: 100%;
+       width: auto;
+       clear: none;
        background: #eee;
        color: black !important;
 }
@@ -156,17 +174,19 @@ div.recentchanges {
        width: 60%;
 }
 
-/* Used for adding a blog page. */
 #blogform {
        padding: 10px 10px;
        border: 1px solid #aaa;
        background: #eee;
        color: black !important;
+       width: auto;
+       overflow: auto;
 }
 
 .inlinepage {
        padding: 10px 10px;
        border: 1px solid #aaa;
+       overflow: auto;
 }
 
 .pagedate,
@@ -181,90 +201,18 @@ div.recentchanges {
        color: #C00;
 }
 
-/* Used for invalid form fields. */
-.fb_invalid {
-       color: red;
-       background: white !important;
-}
-
-/* Used for required form fields. */
-.fb_required {
-       font-weight: bold;
-}
-
-/* Orange feed button. */
-.feedbutton {
-       background: #ff6600;
-       color: white !important;
-       border-left: 1px solid #cc9966;
-       border-top: 1px solid #ccaa99;
-       border-right: 1px solid #993300;
-       border-bottom: 1px solid #331100;
-       padding: 0px 0.5em 0px 0.5em;
-       font-family: sans-serif;
-       font-weight: bold;
-       font-size: small;
-       text-decoration: none;
-       margin-top: 1em;
-}
-.feedbutton:hover {
-       color: white !important;
-       background: #ff9900;
-}
-
-/* Tag cloud. */
-.pagecloud {
-       float: right;
-       width: 30%;
-       text-align: center;
-       padding: 10px 10px;
-       border: 1px solid #aaa;
-       background: #eee;
-       color: black !important;
-}
-.smallestPC { font-size: 70%; }
-.smallPC { font-size: 85%; }
-.normalPC { font-size: 100%; }
-.bigPC { font-size: 115%; }
-.biggestPC { font-size: 130%; }
-
-#sidebar {
-       line-height: 3ex;
+.sidebar {
        width: 20ex;
        float: right;
-       margin-left: 40px;
-       margin-bottom: 40px;
-       padding: 2ex 2ex;
+       margin-left: 4px;
+       margin-bottom: 4px;
+       margin-top: -1px;
+       padding: 0ex 2ex;
        background: white;
+       border: 1px solid black;
        color: black !important;
 }
 
-/* outlines */
-li.L1 {
-       list-style: upper-roman;
-}
-li.L2 {
-       list-style: decimal;
-}
-li.L3 {
-       list-style: lower-alpha;
-}
-li.L4 {
-       list-style: disc;
-}
-li.L5 {
-       list-style: square;
-}
-li.L6 {
-       list-style: circle;
-}
-li.L7 {
-       list-style: lower-roman;
-}
-li.L8 {
-       list-style: upper-alpha;
-}
-
 hr.poll {
        height: 10pt;
        color: white !important;
@@ -278,6 +226,27 @@ div.poll {
        border: 1px solid #aaa;
 }
 
+span.color {
+       padding: 2px;
+}
+
+.comment-header,
+.microblog-header {
+       font-style: italic;
+       margin-top: .3em;
+}
+.comment .author,
+.microblog .author {
+       font-weight: bold;
+}
+.comment-subject {
+       font-weight: bold;
+}
+.comment {
+       border: 1px solid #aaa;
+       padding: 3px;
+}
+
 div.progress {
        margin-top: 1ex;
        margin-bottom: 1ex;
@@ -294,23 +263,7 @@ div.progress-done {
        padding: 1px;
 }
 
-input#openid_url {
-       background: url(wikiicons/openidlogin-bg.gif) no-repeat;
-       background-color: #fff;
-       background-position: 0 50%;
-       color: #000;
-       padding-left: 18px;
-}
-
-input#searchbox {
-       background: url(wikiicons/search-bg.gif) no-repeat;
-       background-color: #fff;
-       background-position: 100% 50%;
-       color: #000;
-       padding-right: 16px;
-}
-
-/* Things to hide in printouts. */
+/* things to hide in printouts */
 @media print {
        .actions { display: none; }
        .tags { display: none; }
@@ -320,7 +273,7 @@ input#searchbox {
        #backlinks { display: none; }
 }
 
-/* Provided for use by template plugin for floating info boxes. */
+/* infobox template */
 .infobox {
        float: right;
        margin-left: 2ex;
@@ -332,7 +285,7 @@ input#searchbox {
        color: black !important;
 }
 
-/* Provided for use by template plugin for floating note boxes. */
+/* notebox template */
 .notebox {
        float: right;
        margin-left: 2ex;
@@ -345,7 +298,7 @@ input#searchbox {
        color: black !important;
 }
 
-/* Used by the popup template and for backlinks hiding. */
+/* popup template and backlinks hiding */
 .popup {
        border-bottom: 1px dotted #366;
        color: #366;
@@ -366,7 +319,7 @@ input#searchbox {
        color: black;
 }
 
-/* Formbuilder styling */
+/* form styling */
 fieldset {
        margin: 1ex 0;
        border: 1px solid black;
@@ -378,39 +331,37 @@ legend {
        float: left;
        margin: 2px 0;
 }
-#signin_openid_url_label {
-       float: left;
-       margin-right: 1ex;
+label.block {    
+       display: block;   
 }
-#signin_openid {
-       padding: 10px 10px;
-       border: 1px solid #aaa;
-       background: #eee; 
-       color: black !important;
+label.inline {    
+       display: inline;
 }
-
-span.color {
-       padding: 2px;
+input#openid_identifier {
+       background: url(wikiicons/openidlogin-bg.gif) no-repeat;
+       background-color: #fff;
+       background-position: 0 50%;
+       color: #000;
+       padding-left: 18px;
 }
-
-.comment-header,
-.microblog-header {
-       font-style: italic;
-       margin-top: .3em;
+input#searchbox {
+       background: url(wikiicons/search-bg.gif) no-repeat;
+       background-color: #fff;
+       background-position: 100% 50%;
+       color: #000;
+       padding-right: 16px;
 }
-.comment .author,
-.microblog .author {
-       font-weight: bold;
+/* invalid form fields */
+.fb_invalid {
+       color: red;
+       background: white !important;
 }
-.comment-subject {
+/* required form fields */
+.fb_required {
        font-weight: bold;
 }
-.comment {
-       border: 1px solid #aaa;
-       padding: 3px;
-}
 
-/* Used by the highlight plugin. */
+/* highlight plugin */
 pre.hl { color:#000000; background-color:#ffffff; }
 .hl.num { color:#2928ff; }
 .hl.esc { color:#ff00ff; }
@@ -427,6 +378,106 @@ pre.hl { color:#000000; background-color:#ffffff; }
 .hl.kwc { color:#000000; font-weight:bold; }
 .hl.kwd { color:#010181; }
 
-/* For the calendar plugin. */
-.month-calendar-day-this-day { background-color: #eee; }
-.year-calendar-this-month { background-color: #eee; }
+/* calendar plugin */
+.month-calendar-day-this-day,
+.year-calendar-this-month {
+       background-color: #eee;
+}
+.month-calendar-day-head,
+.month-calendar-day-nolink,
+.month-calendar-day-link,
+.month-calendar-day-this-day,
+.month-calendar-day-future {
+       text-align: right;
+}
+.month-calendar-arrow A:link,
+.year-calendar-arrow A:link,
+.month-calendar-arrow A:visited,
+.year-calendar-arrow A:visited {
+       text-decoration: none;
+       font-weight: normal;
+       font-size: 150%;
+}
+
+/* outlines */
+li.L1 { list-style: upper-roman; }
+li.L2 { list-style: decimal; }
+li.L3 { list-style: lower-alpha; }
+li.L4 { list-style: disc; }
+li.L5 { list-style: square; }
+li.L6 { list-style: circle; }
+li.L7 { list-style: lower-roman; }
+li.L8 { list-style: upper-alpha; }
+
+/* tag cloud */
+.pagecloud {
+       float: right;
+       width: 30%;
+       text-align: center;
+       padding: 10px 10px;
+       border: 1px solid #aaa;
+       background: #eee;
+       color: black !important;
+}
+.smallestPC { font-size: 70%; }
+.smallPC { font-size: 85%; }
+.normalPC { font-size: 100%; }
+.bigPC { font-size: 115%; }
+.biggestPC { font-size: 130%; }
+
+/* orange feed button */
+.feedbutton {
+       background: #ff6600;
+       color: white !important;
+       border-left: 1px solid #cc9966;
+       border-top: 1px solid #ccaa99;
+       border-right: 1px solid #993300;
+       border-bottom: 1px solid #331100;
+       padding: 0px 0.5em 0px 0.5em;
+       font-family: sans-serif;
+       font-weight: bold;
+       font-size: small;
+       text-decoration: none;
+       margin-top: 1em;
+}
+.feedbutton:hover {
+       color: white !important;
+       background: #ff9900;
+}
+
+/* openid selector */
+#openid_choice {
+       display: none;
+}
+#openid_input_area {
+       clear: both;
+       padding: 10px;
+}
+#openid_btns, #openid_btns br {
+       clear: both;
+}
+#openid_highlight {
+       background-color: black;
+       float: left;
+}
+.openid_large_btn {
+       padding: 1em 1.5em;
+       border: 1px solid #DDD;
+       margin: 3px;
+       float: left;
+}
+.openid_small_btn {
+       padding: 4px 4px;
+       border: 1px solid #DDD;
+       margin: 3px;
+       float: left;
+}
+a.openid_large_btn:focus {
+       outline: none;
+}
+a.openid_large_btn:focus {
+       -moz-outline-style: none;
+}
+.openid_selected {
+       border: 4px solid #DDD;
+}
index eff0e15e93d5930821677833ce4de8619658fb44..9eb12e81915a271d3675640dd691ede3e3bb080f 100644 (file)
@@ -1,87 +1,80 @@
-[[!meta robots="noindex, follow"]]
-[[!if test="enabled(template)"
-then="This wiki has templates **enabled**."
-else="This wiki has templates **disabled**."
-]]
-
-Templates are files that can be filled out and inserted into pages in the
-wiki.
-
-[[!if test="enabled(template) and enabled(inline)" then="""
-
-These templates are available for inclusion onto other pages in this
-wiki:
-
-[[!inline pages="templates/* and !*/discussion" feeds=no archive=yes
-sort=title template=titlepage]]
-"""]]
-
-## Using a template
-
-Using a template works like this:
-
-       \[[!template id=note text="""Here is the text to insert into my note."""]]
+[[Ikiwiki]] uses many templates for many purposes. By editing its templates,
+you can fully customise this site.
 
-This fills out the [[note]] template, filling in the `text` field with
-the specified value, and inserts the result into the page.
+Templates are located in `/usr/share/ikiwiki/templates` by default;
+the `templatedir` setting can be used to make another directory be
+searched first. Customised templates can also be placed inside the
+"templates/" directory in your wiki's source.
 
-Generally, a value can include any markup that would be allowed in the wiki
-page outside the template. Triple-quoting the value even allows quotes to
-be included in it. Combined with multi-line quoted values, this allows for
-large chunks of marked up text to be embedded into a template:
+Ikiwiki uses the HTML::Template module as its template engine. This
+supports things like conditionals and loops in templates and is pretty
+easy to learn. All you really need to know to modify templates is this:
 
-        \[[!template id=foo name="Sally" color="green" age=8 notes="""
-        * \[[Charley]]'s sister.
-        * "I want to be an astronaut when I grow up."
-        * Really 8 and a half.
-        """]]
+* To insert the value of a template variable, use `<TMPL_VAR variable>`.
+* To make a block of text conditional on a variable being set use
+  `<TMPL_IF variable>text</TMPL_IF>`.
+* To use one block of text if a variable is set and a second if it's not,
+  use `<TMPL_IF variable>text<TMPL_ELSE>other text</TMPL_IF>`
 
-## Creating a template
+[[!if test="enabled(template)" then="""
+## template pages
 
-To create a template, simply add a template directive to a page, and the 
-page will provide a link that can be used to create the template. The template
-is a regular wiki page, located in the `templates/` subdirectory inside
-the source directory of the wiki.
+The [[!iki ikiwiki/directive/template desc="template directive"]] allows
+wiki pages to be used as templates, filled out and inserted into other
+pages in the wiki.
+"""]]
 
-The template uses the syntax used by the [[!cpan HTML::Template]] perl
-module, which allows for some fairly complex things to be done. Consult its
-documentation for the full syntax, but all you really need to know are a
-few things:
+[[!if test="enabled(edittemplate)" then="""
+## default content for new pages
 
-* Each parameter you pass to the template directive will generate a 
-  template variable. There are also some pre-defined variables like PAGE
-  and BASENAME.
-* To insert the value of a variable, use `<TMPL_VAR variable>`. Wiki markup
-  in the value will first be converted to html.
-* To insert the raw value of a variable, with wiki markup not yet converted
-  to html, use `<TMPL_VAR raw_variable>`.
-* To make a block of text conditional on a variable being set use
-  `<TMPL_IF NAME="variable">text</TMPL_IF>`.
-* To use one block of text if a variable is set and a second if it's not,
-  use `<TMPL_IF NAME="variable">text<TMPL_ELSE>other text</TMPL_IF>`
-
-Here's a sample template:
+The [[!iki ikiwiki/directive/edittemplate desc="edittemplate directive"]] can
+be used to make new pages default to containing text from a template
+page, which can be filled as out the page is edited.
+"""]]
 
-        <span class="infobox">
-        Name: \[[<TMPL_VAR raw_name>]]<br />
-        Age: <TMPL_VAR age><br />
-        <TMPL_IF NAME="color">
-        Favorite color: <TMPL_VAR color><br />
-        <TMPL_ELSE>
-        No favorite color.<br />
-        </TMPL_IF>
-        <TMPL_IF NAME="notes">
-        <hr />
-        <TMPL_VAR notes>
-        </TMPL_IF>
-        </span>
+[[!if test="(enabled(template) or enabled(edittemplate))
+and enabled(inline)" then="""
+[[!inline pages="templates/* and !*.tmpl and !templates/*/* and !*/discussion"
+feeds=no archive=yes sort=title template=titlepage
+rootpage=templates postformtext="Add a new template named:"]]
+"""]]
 
-The filled out template will be formatted the same as the rest of the page
-that contains it, so you can include WikiLinks and all other forms of wiki
-markup in the template. Note though that such WikiLinks will not show up as
-backlinks to the page that uses the template.
+## wiki templates
+
+These templates are used to build the wiki. The aim is to keep almost all
+html out of ikiwiki and in the templates.
+
+* `page.tmpl` - Used for displaying all regular wiki pages. This is the
+  key template to customise. [[!if test="enabled(pagetemplate)" then="""
+  (The [[!iki ikiwiki/directive/pagetemplate desc="pagetemplate directive"]]
+  can be used to make a page use a different template than `page.tmpl`.)"""]]
+* `rsspage.tmpl` - Used for generating rss feeds for blogs.
+* `rssitem.tmpl` - Used for generating individual items on rss feeds.
+* `atompage.tmpl` - Used for generating atom feeds for blogs.
+* `atomitem.tmpl` - Used for generating individual items on atom feeds.
+* `inlinepage.tmpl` - Used for displaying a post in a blog.
+* `archivepage.tmpl` - Used for listing a page in a blog archive page.
+* `titlepage.tmpl` - Used for listing a page by title in a blog archive page.
+* `microblog.tmpl` - Used for showing a microblogging post inline.
+* `blogpost.tmpl` - Used for a form to add a post to a blog (and a rss/atom links)
+* `feedlink.tmpl` - Used to add rss/atom links if `blogpost.tmpl` is not used.
+* `aggregatepost.tmpl` - Used by the aggregate plugin to create
+  a page for a post.
+* `searchform.tmpl`, `googleform.tmpl` - Used by the search plugin 
+  and google plugin to add search forms to wiki pages.
+* `searchquery.tmpl` - This is a Omega template, used by the
+  search plugin.
+* `comment.tmpl` - Used by the comments plugin to display a comment.
+* `change.tmpl` - Used to create a page describing a change made to the wiki.
+* `recentchanges.tmpl` - Used for listing a change on the RecentChanges page.
+* `autoindex.tmpl` - Filled in by the autoindex plugin to make index pages.
+* `autotag.tmpl` - Filled in by the tag plugin to make tag pages.
+* `calendarmonth.tmpl`, `calendaryear.tmpl` - Used by ikiwiki-calendar to
+  make calendar archive pages.
+* `editpage.tmpl`, `editconflict.tmpl`, `editcreationconflict.tmpl`,
+  `editfailedsave.tmpl`, `editpagegone.tmpl`, `pocreatepage.tmpl`,
+  `editcomment.tmpl` `commentmoderation.tmpl`, `renamesummary.tmpl`,
+  `passwordmail.tmpl`, `openid-selector.tmpl` - Parts of ikiwiki's user
+  interface; do not normally need to be customised.
 
-Note the use of "raw_name" inside the [[ikiwiki/WikiLink]] generator. This
-ensures that if the name contains something that might be mistaken for wiki
-markup, it's not converted to html before being processed as a
-[[ikiwiki/WikiLink]].
+[[!meta robots="noindex, follow"]]
index 220d3645571befa3e353c3c869723f4bdf6b0901..4ddc48ac36092949c4edc2f30fca7f9892d41bef 100644 (file)
@@ -6,3 +6,14 @@ note and popups are templates? But they're not in the templates directory, and i
 > your personal wiki sources. The note and popup template pages are
 > installed there, typically in `/usr/share/ikiwiki/basewiki/templates/`
 > --[[Joey]]
+
+
+Is there a list of the TMPL_VAR-Variables that are defined by ikiwiki?
+
+What I'm trying to achieve is to print the URL of every page on the page itself and therefore I would need the corresponding value in the Template.
+
+Am I missing something?  --[[jwalzer]]
+
+> If there isn't a suitable variable (I don't think there is a list at
+> the moment), a [[plugin|plugins/write]] to add one would be about 10
+> lines of perl - you'd just need to define a `pagetemplate` hook. --[[smcv]]
index fcce925d94b5be169ee6f677bcb5853749f94a7a..9624209401d8d55e2aa955c8f40076ed8a9d0dfc 100644 (file)
@@ -3,7 +3,7 @@ Available in a [[!taglink /git]] repository.<br />
 Branch: <TMPL_VAR branch><br />
 Author: <TMPL_VAR author><br />
 </span>
-<TMPL_UNLESS NAME="branch">
+<TMPL_UNLESS branch>
 This template is used to create an infobox for a git branch. It uses
 these parameters:
 
index 4cc323c0e037204f170ae06596e1cb85efe93eb7..9ef5ad9421abcdb730996dc51a621ea5e74340fa 100644 (file)
@@ -1,7 +1,7 @@
 <div class="notebox">
 <TMPL_VAR text>
 </div>
-<TMPL_UNLESS NAME="text">
+<TMPL_UNLESS text>
 Use this template to insert a note into a page. The note will be styled to
 float to the right of other text on the page. This template has one
 parameter:
index c1d1974d6420b38b185e10587be65932661b751b..322c494457af3768e54dbeaa56b6884902a42d3b 100644 (file)
@@ -8,7 +8,7 @@ Currently enabled: [[!if test="enabled(<TMPL_VAR name>)" then="yes" else="no"]]<
 </span>
 [[!if test="sourcepage(plugins/contrib/*)" then="""[[!meta title="<TMPL_VAR name> (third party plugin)"]]"""]]
 <TMPL_IF core>[[!tag plugins/type/core]]</TMPL_IF>
-<TMPL_UNLESS NAME="name">
+<TMPL_UNLESS name>
 This template is used to create an infobox for an ikiwiki plugin. It uses
 these parameters:
 <ul>
index b355daa2e6443952d72cae7ec8682074ebfe1d40..92455eb216acf1df2250dd8d14026bb743179b64 100644 (file)
@@ -1,4 +1,4 @@
-<TMPL_UNLESS NAME="mouseover">
+<TMPL_UNLESS mouseover>
 Use this template to create a popup window that is displayed when the mouse
 is over part of the page. This template has two parameters:
 <ul>
index 87a497fd12e3933ccc4c8a64332793f3fa7d96df..b725a2eff18128e83e104153c365e994b7c9eb52 100644 (file)
@@ -15,6 +15,7 @@ Thanks to the following people for their kind contributions:
 * Mick Pollard
 * Nico Schottelius
 * Jon Dowland
+* Amitai Schlair
 
 (Note that this page is locked to prevent anyone from tampering with the PayPal button.
 If you prefer your donation *not* be listed here, let [[Joey]] know.)
index 59330caa49ab626954af203b52b816b57b036416..af8e4005da57f0749161f17d51fb45db2e4a3ba2 100644 (file)
@@ -1,9 +1,13 @@
 Use case: You want to move away from Wordpress to Ikiwiki as your blogging/website platform, but you want to retain your old posts.
 
-[This](http://git.chris-lamb.co.uk/?p=ikiwiki-wordpress-import.git) is a simple tool that generates [git-fast-import](http://www.kernel.org/pub/software/scm/git/docs/git-fast-import.html)-compatible data from a WordPress export XML file. It retains creation time of each post, so you can use Ikiwiki's <tt>--getctime</tt> to get the preserve creation times on checkout. 
+[This](http://git.chris-lamb.co.uk/?p=ikiwiki-wordpress-import.git) is a simple tool that generates [git-fast-import](http://www.kernel.org/pub/software/scm/git/docs/git-fast-import.html)-compatible data from a WordPress export XML file.
 
 WordPress categories are mapped onto Ikiwiki tags. The ability to import comments is planned.
 
+The script uses the [BeautifulSoup][] module.
+
+[BeautifulSoup]: http://www.crummy.com/software/BeautifulSoup/
+
 -----
 
 I include a modified version of this script. This version includes the ability to write \[[!tag foo]] directives, which the original intended, but didn't actually do.
index aa35b933177d135691509b30a110c5cd92d7768e..e07e36b07805e6545bafce3a88f48ca621273ce0 100644 (file)
@@ -18,4 +18,7 @@ from there, like I have on [my blog](http://kitenet.net/~joey/blog/)
        show=5 feeds=no]]
        """]]
 
+* To filter out `@-replies`, append "and !*@*" to the [[ikiwiki/PageSpec]].
+  The same technique can be used for other filtering.
+
 Note: Works best with ikiwiki 3.10 or better.
index 6f8137256e54ba8b0068a62bbd20080f01ec6ac7..3d6a8c449289913dc0fd60323be7626f688ec3fd 100644 (file)
@@ -3,8 +3,15 @@ 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]]
+       \[[!inline pages="comment(*)" template=comment]]
 
 The special [[ikiwiki/PageSpec]] matches all comments. The
-[[template|wikitemplates]] causes the comments to be displayed formatted
+[[template|templates]] causes the comments to be displayed formatted
 nicely.
+
+---
+
+It's also possible to make a feed of comments that are held pending
+moderation.
+
+       \[[!inline pages="comment_pending(*)" template=comment]]
index 9719d9a7e86a5430b820be7ee035c8238238ea68..38de01109e0a6404f3776e64f37264b964b631e2 100644 (file)
@@ -48,10 +48,7 @@ in HTML, you may need to add further processing to the last line.
 
 Note that by default, `Special:Allpages` will only list pages in the main
 namespace. You need to add a `&namespace=XX` argument to get pages in a
-different namespace. The following numbers correspond to common namespaces:
-
- * 10 - templates (`Template:foo`)
- * 14 - categories (`Category:bar`)
+different namespace. (See below for the default list of namespaces)
 
 Note that the page names obtained this way will not include any namespace
 specific prefix: e.g. `Category:` will be stripped off.
@@ -59,7 +56,28 @@ specific prefix: e.g. `Category:` will be stripped off.
 ### Querying the database
 
 If you have access to the relational database in which your mediawiki data is
-stored, it is possible to derive a list of page names from this.
+stored, it is possible to derive a list of page names from this. With mediawiki's
+MySQL backend, the page table is, appropriately enough, called `table`:
+
+    SELECT page_namespace, page_title FROM page;
+
+As with the previous method, you will need to do some filtering based on the
+namespace.
+
+### namespaces
+
+The list of default namespaces in mediawiki is available from <http://www.mediawiki.org/wiki/Manual:Namespace#Built-in_namespaces>. Here are reproduced the ones you are most likely to encounter if you are running a small mediawiki install for your own purposes:
+
+[[!table data="""
+Index   | Name         | Example
+0       | Main         | Foo
+1       | Talk         | Talk:Foo
+2       | User         | User:Jon
+3       | User talk    | User_talk:Jon
+6       | File         | File:Barack_Obama_signature.svg
+10      | Template     | Template:Prettytable
+14      | Category     | Category:Pages_needing_review
+"""]]
 
 ## Step 2: fetching the page data
 
index 683a3f8ac031abf6f048ffee4334f95b5a305132..d67a9131b8110bb51c6104f475113bbe3d741adf 100644 (file)
@@ -1,3 +1,11 @@
+20100428 - I just wrote a simple ruby script which will connect to a mysql server and then recreate the pages and their revision histories with Grit. It also does one simple conversion of equals titles to pounds. Enjoy! 
+
+<http://github.com/docunext/mediawiki2gitikiwiki>
+
+-- [[users/Albert]]
+
+----
+
 The u32 page is excellent, but I wonder if documenting the procedure here
 would be worthwhile. Who knows, the remote site might disappear. But also
 there are some variations on the approach that might be useful:
@@ -649,3 +657,9 @@ page.--[[users/Chadius]]
 > on mediawiki in general. It seems to produce output that could be
 > used by the [[plugins/contrib/mediawiki]] plugin, if the filenames
 > were fixed to use the right extension.  --[[Joey]] 
+
+>> Here's another I found while browsing around starting from the link you gave Joey<br />
+>> <http://github.com/scy/levitation><br />
+>> As I don't run mediawiki anymore, but I still have my xz/gzip-compressed XML dumps,
+>> it's certainly easier for me to do it this way; also a file or a set of files is easier to lug
+>> around on some medium than a full mysqld or postgres master and relevant databases.
diff --git a/doc/tips/follow_wikilinks_from_inside_vim.mdwn b/doc/tips/follow_wikilinks_from_inside_vim.mdwn
new file mode 100644 (file)
index 0000000..015a4ec
--- /dev/null
@@ -0,0 +1,47 @@
+The [ikiwiki-nav](http://www.vim.org/scripts/script.php?script_id=2968) plugin
+for vim eases the editing of IkiWiki wikis, by letting you "follow" the
+wikilinks on your file (page), by loading the file associated with a given
+wikilink in vim. The plugin takes care of following the ikiwiki linking rules
+to figure out which file a wikilink points to 
+
+The plugin also includes commands (and mappings) to make the cursor jump to the
+previous/next wikilink in the current file 
+
+##  Jumping to pages 
+
+To open the file associated to a wikilink, place the cursor over its text, and
+hit Enter (`<CR>`). This functionality is also available through the
+`:IkiJumpToPage` command 
+
+## Moving to next/previous wikilink in current file 
+
+`Ctrl-j` will move the cursor to the next wikilink. `Ctrl-k` will move it to the
+previous wikilink. This functionality is also available through the
+`:IkiNextWikiLink` command. This command takes one argument, the direction to
+move into 
+
+  * `:IkiNextWikiLink 0` will look forward for the wikilink 
+  * `:IkiNextWikiLink 1` will look backwards for the wikilink 
+
+## Installation
+
+Copy the `ikiwiki_nav.vim` file to your `.vim/ftplugin` directory.
+
+## Current issues: 
+
+  * The plugin only works for wikilinks contained in a single text line;
+    multiline wikilinks are not (yet) seen as such 
+
+## Notes 
+
+The official releases of the plugin are in the
+[vim.org script page](http://www.vim.org/scripts/script.php?script_id=2968)
+
+The latest version of this script can be found in the following location 
+
+<http://git.devnull.li/cgi-bin/gitweb.cgi?p=ikiwiki-nav.git;a=blob;f=ftplugin/ikiwiki_nav.vim;hb=HEAD>
+
+Any feedback you can provide is appreciated; the contact details can be found
+inside the plugin
+
+[[!tag vim]]
diff --git a/doc/tips/htaccess_file.mdwn b/doc/tips/htaccess_file.mdwn
new file mode 100644 (file)
index 0000000..6964cf2
--- /dev/null
@@ -0,0 +1,27 @@
+If you try to include a `.htaccess` file in your wiki's source, in order to
+configure the web server, you'll find that ikiwiki excludes it from
+processing. In fact, ikiwiki excludes any file starting with a dot, as well
+as a lot of other files, for good security reasons.
+
+You can tell ikiwiki not to exclude the .htaccess file by adding this to
+your setup file:
+
+       include => '^\.htaccess$',
+
+Caution! Before you do that, please think for a minute about who can edit
+your wiki. Are attachment uploads enabled? Can users commit changes
+directly to the version control system? Do you trust everyone who can
+make a change to not do Bad Things with the htaccess file? Do you trust
+everyone who *might* be able to make a change in the future? Note that a
+determined attacker who can write to the htaccess file can probably get a
+shell on your web server.
+
+If any of these questions have given you pause, I suggest you find a
+different way to configure the web server. One way is to not put the
+`.htaccess` file under ikiwiki's control, and just manually install it
+in the destdir. --[[Joey]]
+
+[Apache's documentation](http://httpd.apache.org/docs/2.2/howto/htaccess.html)
+says:
+> In general, you should never use .htaccess files unless you don't have
+> access to the main server configuration file.
diff --git a/doc/tips/html5.mdwn b/doc/tips/html5.mdwn
new file mode 100644 (file)
index 0000000..945efc4
--- /dev/null
@@ -0,0 +1,26 @@
+First, if you just want to embed videos using the html5 `<video>` tag,
+you can do that without switching anything else to html5.
+However, if you want to fully enter the brave new world of html5, read on..
+
+Currently, ikiwiki does not use html5 by default. There is a `html5`
+setting that can be turned on, in your setup file. Rebuild with it set, and
+lots of fancy new semantic tags will be used all over the place.
+
+You may need to adapt your CSS for html5. While all the class and id names
+are the same, some of the `div` elements are changed to other things.
+Ikiwiki's default CSS will work in both modes.
+
+The html5 support is still experimental, and may break in some browsers.
+No care is taken to add backwards compatability hacks for browsers that
+are not html5 aware (like MSIE). If you want to include the javascript with
+those hacks, you can edit `page.tmpl` to do so. 
+[Dive Into HTML5](http://diveintohtml5.org/) is a good reference for
+current compatability issues and workarounds with html5.
+
+---
+
+Known ikiwiki-specific issues:
+
+* [[plugins/htmltidy]] uses `tidy`, which is not html5 aware, so if you
+  have that enabled, it will mangle it back to html4.
+* [[plugins/toc]] does not understand the html5 outline algorithm.
index b81ffae8d74c8008d3b519047014b73d8932bba4..a74d00f473416b28512b769fa3239e0f551ea02e 100644 (file)
@@ -6,9 +6,10 @@ you need/want to.
 
 ## the index
 
-`.ikiwiki/indexdb` contains a cache of information about pages, as well
-as all persisitant state about pages. It used to be a (semi) human-readable
-text file, but is not anymore.
+`.ikiwiki/indexdb` contains a cache of information about pages.
+This information can always be recalculated by rebuilding the wiki.
+(So the file is safe to delete and need not be backed up.)
+It used to be a (semi) human-readable text file, but is not anymore.
 
 To dump the contents of the file, enter a perl command like this.
 
index 34d5b92520e0c40bfccf9357769ae8f8e6e848b4..69df369ec59f7d5b7c38451c01acf7620040567a 100644 (file)
@@ -6,14 +6,15 @@ My database appears corrupted:
 No idea how this happened.  I've blown it away and recreated it but, for future reference, is there any less violent way to recover from this situation?  I miss having the correct created and last edited times.  --[[sabr]]
 > update: fixed ctimes and mtimes using [these instructions](http://u32.net/Mediawiki_Conversion/Git_Import/#Correct%20Creation%20and%20Last%20Edited%20time) --[[sabr]]
 
-> That's overly complex. Just run `ikiwiki -setup your.setup -getctime`. 
+> That's overly complex. Just run `ikiwiki -setup your.setup -gettime`. 
 > BTW, I'd be interested in examining such a corrupt storable file to try
 > to see what happened to it. --[[Joey]]
 
->> --getctime appears to only set the last edited date.  It's not supposed to set the creation date, is it?  The only place that info is stored is in the git repo.
+>> --gettime appears to only set the last edited date.  It's not supposed to set the creation date, is it?  The only place that info is stored is in the git repo.
 
 >>> Pulling the page creation date out of the git history is exactly what
->>> --getctime does. --[[Joey]]
+>>> --gettime does. (It used to be called --getctime, and only do that; now
+>>> it also pulls out the last modified date). --[[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]]
 
index 85e26c729a07178c9027795f6f81d33936d019dc..cfa565d1a4b317bd7666b4ab3c701339ea167d37 100644 (file)
@@ -67,6 +67,5 @@ as many times as you want (thus being able to have a repository which is
 used by the ikiwiki CGI, and another which you can use for updating via
 git).
 
-When you want to update the server from the laptop, do a `git push` from
-within the laptop's bare repository, and likewise do a `git pull` to update
-the laptop from the server.
+Use standard git commands, run in the laptop's bare git repository
+to handle pulling from and pushing to the server.
diff --git a/doc/tips/spam_and_softwaresites.mdwn b/doc/tips/spam_and_softwaresites.mdwn
new file mode 100644 (file)
index 0000000..a07889e
--- /dev/null
@@ -0,0 +1,87 @@
+Any wiki with a form of web-editing enabled will have to deal with
+spam. (See the [[plugins/blogspam]] plugin for one defensive tool you
+can deploy).
+
+If:
+
+ * you are using ikiwiki to manage the website for a [[examples/softwaresite]]
+ * you allow web-based commits, to let people correct documentation, or report
+   bugs, etc.
+ * the documentation is stored in the same revision control repository as your
+   software
+
+It is undesirable to have your software's VCS history tainted by spam and spam
+clean-up commits. Here is one approach you can use to prevent this. This
+example is for the [[git]] version control system, but the principles should
+apply to others.
+
+## Isolate web commits to a specific branch
+
+Create a separate branch to contain web-originated edits (named `doc` in this
+example):
+
+    $ git checkout -b doc
+
+Adjust your setup file accordingly:
+
+    gitmaster_branch => 'doc',
+
+## merging good web commits into the master branch
+
+You will want to periodically merge legitimate web-based commits back into
+your master branch. Ensure that there is no spam in the documentation
+branch. If there is, see 'erase spam from the commit history', below, first.
+
+Once you are confident it's clean:
+
+    # ensure you are on the master branch
+    $ git branch
+      doc
+    * master
+    $ git merge --ff doc
+
+## removing spam
+
+### short term
+
+In the short term, just revert the spammy commit.
+
+If the spammy commit was the top-most:
+
+    $ git revert HEAD
+
+This will clean the spam out of the files, but it will leave both the spam
+commit and the revert commit in the history.
+
+### erase spam from the commit history
+
+Git allows you to rewrite your commit history.  We will take advantage of this
+to eradicate spam from the history of the doc branch.
+
+This is a useful tool, but it is considered bad practise to rewrite the
+history of public repositories. If your software's repository is public, you
+should make it clear that the history of the `doc` branch in your repository
+is unstable.
+
+Once you have been spammed, use `git rebase` to remove the spam commits from
+the history.  Assuming that your `doc` branch was split off from a branch
+called `master`:
+
+    # ensure you are on the doc branch
+    $ git branch
+    * doc
+      master
+    $ git rebase --interactive master
+
+In your editor session, you will see a series of lines for each commit made to
+the `doc` branch since it was branched from `master` (or since the last merge
+back into `master`). Delete the lines corresponding to spammy commits, then
+save and exit your editor.
+
+Caveat: if there are no commits you want to keep (i.e. all the commits since
+the last merge into master are either spam or spam reverts) then `git rebase`
+will abort. Therefore, this approach only works if you have at least one
+non-spam commit to the documentation since the last merge into `master`. For
+this reason, it's best to wait until you have at least one
+commit you want merged back into the main history before doing a rebase,
+and until then, tackle spam with reverts.
index 183ce00ac9744bac71e9ff5d9fb473a88f65733a..92871439fe4d75f648b0a744db3fde2b28f0527a 100644 (file)
@@ -8,9 +8,7 @@ to usedirs, or edit your setup file and turn usedirs back off.
   or manually.
 * Since usedirs is enabled, ikiwiki will have created a bunch of new
   html files. Where before ikiwiki generated a `dest/foo.html`, now it will
-  generate `dest/foo/index.html`. But, the old html files will still be
-  present too. Remove them:
-       find dest -name \*.html -not -name index.html -exec rm {} \;
+  generate `dest/foo/index.html`. The old html files will be removed.
 * If you have a blog that is aggregated on a Planet or similar, all the
   items in the RSS or atom feed will seem like new posts, since their URLs
   have changed. See [[howto_avoid_flooding_aggregators]] for a workaround.
index 172b763c34ae96ff879742d34965a1b5a090474d..18b2f1c92fd43a20316da5ad0c52fad03f61de0a 100644 (file)
@@ -1,4 +1,7 @@
 [[ikiwiki.vim]] is a vim syntax highlighting file for ikiwiki
-[[ikiwiki/markdown]] files. 
+[[ikiwiki/markdown]] files.
 
 Installation instructions are at the top of the file.
+
+See also: [[follow_wikilinks_from_inside_vim]]
+[[!tag vim]]
diff --git a/doc/tips/yaml_setup_files.mdwn b/doc/tips/yaml_setup_files.mdwn
new file mode 100644 (file)
index 0000000..e8ab4f1
--- /dev/null
@@ -0,0 +1,12 @@
+Here's how to convert your existing standard format ikiwiki setup file into
+the new YAML format recently added to ikiwiki.
+
+1. First, make sure you have the [[!cpan YAML]] perl module installed.
+   (Run: `apt-get install libyaml-perl`)
+2. Run: `ikiwiki -setup my.setup -dumpsetup my.setup --set setuptype=Yaml`
+
+The format of the YAML setup file should be fairly self-explanatory.
+
+(To convert the other way, use "setuptype=Standard" instead.)
+
+--[[Joey]]
index d40701d60c95d40d3eca8cb5ee19454d2890e5ca..dd97932335a293524d6f72b9f94068c1e4aca6ad 100644 (file)
@@ -21,6 +21,11 @@ something, that I think is very valuable.
 >>>> Which would rule out openid, or other fun forms of auth. And routing all access
 >>>> through the CGI sort of defeats the purpose of ikiwiki. --[[Ethan]]
 
+>>>>> I think what Joey is suggesting is to use apache ACLs in conjunction
+>>>>> with basic HTTP auth to control read access, and ikiwiki can use the
+>>>>> information via the httpauth plugin for other ACLs (write, admin). But
+>>>>> yes, that would rule out non-httpauth mechanisms. -- [[Jon]]
+
 Also see [[!debbug 443346]].
 
 > Just a few quick thoughts about this:
@@ -76,3 +81,18 @@ Any idea when this is going to be finished?  If you want, I am happy to beta tes
 > Example of use to only allow two users to edit the tipjar page:
 >      locked_pages => 'tipjar and !(user(joey) or user(bob))',
 > --[[Joey]] 
+
+> > Thank you for the hint but I am being still confused (read: dense)...  What I am trying to do is this:
+
+> >  * No anonymous access.
+> >  * Logged in users can edit and create pages.
+> >  * Users can set who can edit their pages. 
+> >  * Some pages are only viewable by admins. 
+
+> > Is it possible?  If so how?...
+
+>>> I don't believe this is currently possible. What is missing is the concept
+>>> of page 'ownership'. -- [[Jon]]
+
+>>>> GAH! That is really a shame... Any chance of adding that?  No, I do not really expect it to be added, after all my requirements are pushing the boundary of what a wikiwiki
+ should be.  Nonetheless, thanks for your help! 
index 51b34927d864f52a09a275c86e517f67a5e0f1c9..514108fbad772fd5779e4b3d0d2b166b344a939c 100644 (file)
@@ -51,4 +51,6 @@ The patch below adds a label for the field to improve usability:
 > element. already works in eg, chromium. However, ikiwiki does not use
 > html5 yet. --[[Joey]] 
 
-[[!tag wishlist html5]]
+>> [[Done]], placeholder added, in html5 mode only.
+
+[[!tag wishlist bugs/html5_support]]
index ae59e14c25211448b12675aa8d24c3817fa340bb..87fa38911aa8b4890fe9a4c9558caeff04262a74 100644 (file)
@@ -2,3 +2,7 @@ Using the po plugin, a link to /bla is present in the sidebar.
 When viewing /bla in the default language, this link is detected as
 a selflink. When viewing a translation of /bla, it
 isn't. --[[intrigeri]]
+
+Fixed in my po branch. --[[intrigeri]]
+
+[[!tag patch]]
index 057a88b72e9d016d28bc9298610a9dca845c188f..ea8ee7f031eb5cc9f9aa8cb1e13c04b7a98f1af6 100644 (file)
@@ -34,6 +34,9 @@ for an example.  You will probably need to strip out the metadata variables I
 >>>[xtermin.us rather than localhost](http://xtermin.us/git/?p=website.git;a=blob;f=plugins/googlesitemap.pm) is 404 now.
 >>> -- weakish
 
+
+Although it is not able to read the meta-data from files, using google-sitemapgen [works well for me](http://bzed.de/posts/2010/06/creating_a_google_sitemap_for_ikiwiki/) to create a sitemap for my ikiwiki installation. -- [[bzed|BerndZeimetz]]
+
 There is a [sitemap XML standard](http://www.sitemaps.org/protocol.php) that ikiwiki needs to generate for. 
 
 # Google Webmaster tools and RSS
@@ -45,3 +48,13 @@ On [Google Webmaster tools](https://www.google.com/webmasters/tools) you can sub
 [Google should grok feeds as sitemaps.](http://www.google.com/support/webmasters/bin/answer.py?answer=34654) Or rather [[plugins/inline]] should be improved to support the [sitemap protocol](http://sitemaps.org/protocol.php) natively.
 
 -- [[Hendry]]
+
+
+Took me a minute to figure this out so I figured I'd share the steps I took:
+
+* Added rss=>1 and allowrss=>1 to my setup file
+* Created a new page where the RSS would be created with this content, replacing "first_page" with the page in my wiki with the earliest date:
+
+<pre>
+\[[!inline  pages="* and !*/Discussion and created_after(first_page)" archive="yes" rss="yes" ]]
+</pre>
diff --git a/doc/todo/More_flexible_po-plugin_for_translation.mdwn b/doc/todo/More_flexible_po-plugin_for_translation.mdwn
new file mode 100644 (file)
index 0000000..3399f78
--- /dev/null
@@ -0,0 +1,5 @@
+I have a website with multi-language content, where some content is only in English, some in German, and some is available in both languages.
+
+The po-module currently has only one master-language, with slave languages, and a  PageSpec should be considered.
+
+It would be nice to flag the content which should have a translation on a file-by-file basis (with some inline directive?) which could contain the information of the master-language for that file and the desired target-languages.
diff --git a/doc/todo/Multiple_categorization_namespaces.mdwn b/doc/todo/Multiple_categorization_namespaces.mdwn
new file mode 100644 (file)
index 0000000..3e9f8fe
--- /dev/null
@@ -0,0 +1,103 @@
+I came across this when working on converting my old blog into an ikiwiki, but I think it could be of more general use.
+
+The background: I have a (currently suspended, waiting to be converted) blog on the [il Cannocchiale](http://www.ilcannocchiale.it) hosting platform. Aside from the usual metatadata (title, author), il Cannocchiale also provides tags and two additional categorization namespaces: a blog-specific user-defind "column" (Rubrica) and a platform-wide "category" (Categoria). The latter is used to group and label a couple of platform-wide lists of latest posts, the former may be used in many different ways (e.g. multi-author blogs could have one column per author or so, or as a form of 'macro-tagging'). Columns are also a little more sophisticated than classical tags because you can assign them a subtitle too.
+
+When I started working on the conversion, my first idea was to convert Rubriche to subdirectories of an ikiwiki blog. However, this left me with a few annoying things: when rebuilding links from the import, I had to (programmatically) dive into each subdirectory to see where each post was; this would also be problematic for future posting, too. It also meant that moving a post from a Rubrica to the other would break all links (unless ikiwiki has a way to fix this automagically). And I wasn't too keen on the fact that the Rubrica would come up in the URL of the post. And finally, of course, I couldn't use this to preserve the Categoria metadata.
+
+Another solution I thought about was to use special deeper tags for the Rubrica and Categoria (like: `\[[!tag "Rubrica/Some name"]]`), but this is horrible, clumsy, and makes special treatment of these tags a PITN (for example you wouldn't want the Rubrica to be displayed together with the other tags, and you would want it displayed somewhere else like next to the title of the post). This solution however looks to me as the proper path, as long as tags could support totally separate namespaces. I have a tentative implementation of this `tagtype` feature at [my git clone of ikiwiki](http://git.oblomov.eu/ikiwiki).
+
+The feature is currently implemented as follows: a `tagtypes` config options takes an array of strings: the tag types to be defined _aside from the usual tags_. Each tag type automatically provides a new directive which sets up tags that different from standard tags by having a different tagbase (the same as the tagtype) and link type (again, the same as the tagtype) (a TODO item for this would to make the directive, tagbase and link type customizable). For example, for my imported blog I would define
+
+    tagtypes => [qw{Categoria Rubrica}]
+
+and then in the blog posts I would have stuff like
+
+    \[[!Categoria "LAVORO/Vita da impiegato"]]
+    \[[!Rubrica "Il mio mondo"]]
+    \[[!meta title="Blah blah"]]
+    \[[!meta author="oblomov"]]
+
+    The body of the article
+
+    \[[!tag a bunch of tags]]
+
+and the tags would appear at the bottom of the post, the Rubrica next to the title, etc. All of this information would end up as categories in the feeds (although I would like to rework that code to make use of namespaces, terms and labels in a different way).
+
+> Note [[plugins/contrib/report/discussion]].  To quote myself from the latter page:
+> *I find tags as they currently exist to be too limiting. I prefer something that can be used for Faceted Tagging http://en.wikipedia.org/wiki/Faceted_classification; that is, things like Author:Fred Nurk, Genre:Historical, Rating:Good, and so on. Of course, that doesn't mean that each tag is limited to only one value, either; just to take the above examples, something might have more than one author, or have multiple genres (such as Historical + Romance).*
+
+> So you aren't the only one who wants to do more with tags, but I don't think that adding a new directive for each tag type is the way to go; I think it would be simpler to just have one directive, and take advantage of the new [[matching different kinds of links]] functionality, and enhance the tag directive.
+> Perhaps something like this:
+
+            \[[!tag categorica="LAVORO/Vita da impiegato" rubrica="Il mio mondo"]]
+
+> Part of my thinking in this is to also combine tags with [[plugins/contrib/field]], so that the tags for a page could be queried and displayed; that way, one could put them wherever you wanted on the page, using any of [[plugins/contrib/getfield]], [[plugins/contrib/ftemplate]], or [[plugins/contrib/report]].
+> --[[KathrynAndersen]]
+
+>> A very generic metadata framework could cover all possible usages of fields, tags, and related metadata, but keeping its _user interface_ generic would only make it hard to use. Note that this is not an objection to the idea of collapsing the fields and tags functionality (at quick glance, I cannot see a real difference between single-valued custom tagtypes and fields, but see below), but more about the syntax.
+
+>> I had thought about the `\[[!tag type1=value1 type2=value2]]` syntax myself, but ultimately decided against it for a number of reasons, most importantly the fact that (1) it's harder to type, (2) it's harder to spot errors in the tag types (so for example if one misspelled `categoria` as `categorica`, he might not notice it as quickly as seeing the un-parsed `\[[!categorica ]]` directive in the output html) and (3) it encourages collapsing possibly unrelated metadata together (for example, I would never consider putting the categoria information together with the rubrica  one; of course with your syntax it's perfectly possible to keep them separate as well).
+
+>> Point (2) may be considered a downside as well as an upside, depending on perspective, of course. And it would be possible to have a set of predefined tag types to match against, like in my tagtype directive approach but with your syntax.
+
+>>> You seem to have answered your own objections already. -- K.A.
+
+>>Point (3) is of course entirely in the hands of the user, but that's exactly what syntax should be about. There is nothing functionally wrong with e.g. `\[[!meta tag=sometag author=someauthor title=sometitle rubrica=somecolumn]]`, but I honestly find it horrible.
+
+>>> So, really, point 3 comes down to differing aesthetics. -- K.A.
+
+>> A solution could be to allow both syntaxes, getting to have for example `\[[!sometagtype "blah"]]` as a shortcut for `\[[!tag sometagtype="blah"]]` (or, in the more general case, `\[[!somefieldname "blah"]]` as a shortcut for `\[[!meta fieldname="blah"]]`).
+
+>> I would like to point out however that there are some functional differences between categorization metadata vs other metadata that might suggest to keep fields and (my extended) tags separate. For examples, in feeds you'd want all categorization metadata to fall in one place, with some appropriate manipulation (which I still have to implement, by the way), while things like author or title would go to the corresponding feed item properties. Although it all would be possible with appropriate report or template juggling, having such default metadata handled natively looks like a bonus to me.
+
+>>> Whereas I prefer being able to control such things with templates, because it gives more flexibility AND control. - K.A.
+
+>>>> Flexibility and control is good for tuning and power-usage, but sensible defaults are a must for a platform to be usable out of the box without much intervention. Moreover, there's a possible problem with what kind of data must be passed over to templates.
+
+Aside from the name of the plugin (and thus of the main directive), which could be `tag`, `meta`, `field` or whatever (maybe extending `meta` would be the most sensible choice), the features we want are
+
+1. allow multiple values per type/attribute/field/whatever (fields currently only allows one)
+   * Agreed about multiple values; I've been considering whether I should add that to `field`. -- K.A.
+2. allow both hidden and visible references (a la tag vs taglink)
+   * Hidden and visible references; that's fair enough too.  My approach with `ymlfront` and `getfield` is that the YAML code is hidden, and the display is done with `getfield`, but there's no reason not to use additional approaches. -- K.A.
+3. allow each type/attribute/field to be exposed under multiple queries (e.g. tags and categories; this is mostly important for backwards compatibility, not sure if it might have other uses too)
+   * I'm not sure what you mean here. -- K.A.
+     * Typical example is tags: they are accessible both as `tags` and as `categories`, although the way they are presented changes a little -- G.B.
+4. allow arbitrary types/attributes/fields/whatever (even 'undefined' ones)
+   * Are you saying that these must be typed, or are you saying that they can be user-defined? -- K.A.
+     * I am saying that the user should be able to define (e.g. in the config) some set of types/fields/attributes/whatever, following the specification illustrated below, but also be able to use something like `\[[!meta somefield="somevalue"]]` where `somefield` was never defined before. In this case `somefield` will have some default values for the properties described in the spec below. -- G.B.
+
+Each type/attribute/field/whatever (predefined, user-defined, arbitrary) would thus have the following parameters:
+
+* `directive` : the name of the directive that can be used to set the value as a hidden reference; we can discuss whether, for pre- or user-defined types, it being undef means no directive or a default directive matching the attribute name would be defined.
+  * I still want there to be able to be enough flexibility in the concept to enable plugins such as `yamlfront`, which sets the data using YAML format, rather than using directives. -- K.A.
+     * The possibility to use a directive does not preclude other ways of defining the field values. IOW, even if the directive `somefield` is defined, the user would still be able to use the syntax `\[[!meta somefield="somevalue"]]`, or any other syntax (such as YAML). -- G.B.
+* `linkdirective` : the name of the directive that can be used for a visible reference; no such directive would be defined by default
+* `linktype` : link type for (hidden and visible) references
+  * Is this the equivalent to "field name"? -- K.A.
+     * This would be such by default, but it could be set to something different. [[Typed links|matching_different_kinds_of_links]] is a very recent ikiwiki feature. -- G.B.
+* `linkbase` : akin to the tagbase parameter
+  * Is this a field-name -> directory mapping? -- K.A.
+     * yes, with each directory having one page per value. It might not make sense for all fields, of course -- G.B.
+         * (nods) I've been working on something similar with my unreleased `tagger` module. In that, by default, the field-name maps to the closest wiki-page of the same name.  Thus, if one had the field "genre=poetry" on the page fiction/stories/mary/lamb, then that would map to fiction/genre/poetry if fiction/genre existed. --K.A.
+             * that's the idea. In your case you could have the linkbase of genre be fiction/genre, and it would be created if it was missing. -- G.B.
+* `queries` : list of template queries this type/attribute/field/whatever is exposed to
+  * I'm not sure what you mean here. -- K.A.
+     * as mentioned before, some fields may be made accessible through different template queries, in different form. This is the case already for tags, that also come up in the `categories` query (used by Atom and RSS feeds). -- G.B.
+         * Ah, do you mean that the input value is the same, but the output format is different?  Like the difference between TMPL_VAR NAME="FOO" and TMPL_VAR NAME="raw_FOO"; one is htmlized, and the other is not. -- K.A.
+              * Actually this is about the same information appearing in different queries (e.g. NAME="FOO" and NAME="BAR"). Example: say that I defined a "Rubrica" field. I would want both tags and categories to appear in `categories` template query, but only tags would appear in the `tags` query, and only Rubrica values to appear in `rubrica` queries. The issue of different output formats was presented in the next paragraph instead. -- G.B.
+
+Where this approach is limiting is on the kind of data that is passed to (template) queries. The value of the metadata fields might need some massaging (e.g. compare how tags are passed to tags queries vs cateogires queries, or also see what is done with the fields in the current `meta` plugin). I have problems on picturing an easy way to make this possible user-side (i.e. via templates and not in Perl modules). Suggestions welcome.
+
+One possibility could be to have the `queries` configuration allow a hash mapping query names to functions that would transform the data. Lacking that possibility, we might have to leave some predefined fields to have custom Perl-side treatment and leave custom fields to be untransformable.
+
+-----
+
+I've now updated the [[plugins/contrib/field]] plugin to have:
+
+* arrays (multi-valued fields)
+* the "linkbase" option as mentioned above (called field_tags), where the linktype is the field name.
+
+I've also updated [[plugins/contrib/ftemplate]] and [[plugins/contrib/report]] to be able to use multi-valued fields, and [[plugins/contrib/ymlfront]] to correctly return multi-valued fields when they are requested.
+
+--[[KathrynAndersen]]
index 2cd52e8c48469d4ec8b9dc11c1994da9d7afbf77..a4940220adef0fabdbc10175f27c5bfe5e198df9 100644 (file)
@@ -6,6 +6,48 @@ I see this being implemented in one of two possible ways. The easiest seems like
 
 A slightly more complex next step would be to request sreg from the provider and, if provided, automatically set the identity's username and email address from the provided persona. If username login to accounts with blank passwords is disabled, then you have the best of both worlds. Passwordless signin, human-friendly attribution, automatic setting of preferences.
 
+> Given that openids are a global user identifier, that can look as pretty
+> as the user cares to make it look via delegation, I am not a fan of 
+> having a site-local identifier that layered on top of that. Perhaps
+> partly because every site that I have seen that does that has openid
+> implemented as a badly-done wart on the side of their regular login
+> system.
+> 
+> The openid plugin now attempts to get an email and a username, and stores
+> them in the session database for later use (ie, when the user edits a
+> page).
+> 
+> I am considering displaying the userid or fullname, if available,
+> instead of the munged openid url in recentchanges and comments.
+> It would be nice for those nasty [[google_openids|forum/google_openid_broken?]].
+> But, I first have to find a way to encode the name in the VCS commit log,
+> while still keeping the openid of the committer in there too.
+> Perhaps something like this (for git): --[[Joey]] 
+> 
+>      Author: Joey Hess &lt;http://joey.kitenet.net/@web&gt;
+> 
+> Only problem with the above is that the openid will still be displayed
+> by CIA. Other option is this, which solves that, but at the expense of
+> having to munge the username to fit inside the email address,
+> and generally seems backwards: --[[Joey]] 
+> 
+>      Author: http://joey.kitenet.net/ &lt;Joey_Hess@web&gt;
+> 
+> So, what needs to be done:
+> 
+> * Change `rcs_commit` and `rcs_commit_staged` to take a session object,
+>   instead of just a userid. (For back-compat, if the parameter is 
+>   not an object, it's a userid.) Bump ikiwiki plugin interface version.
+>   (done)
+> * Modify all RCS plugins to include the session username somewhere
+>   in the commit, and parse it back out in `rcs_recentchanges`.
+>   (done for git only so far)
+> * Modify recentchanges plugin to display the username instead of the
+>   `openiduser`.
+>   (done)
+> * Modify comment plugin to put the session username in the comment
+>   template instead of the `openiduser`. (done)
+
 Unfortunately I don't speak Perl, so hopefully someone thinks these suggestions are good enough to code up. I've hacked on openid code in Ruby before, so hopefully these changes aren't all that difficult to implement. Even if you don't get any data via sreg, you're no worse off than where you are now, so I don't think there'd need to be much in the way of error/sanity-checking of returned data. If it's null or not available then no big deal, typing in a username is no sweat.
 
-[[!tag wishlist]]
+[[!tag wishlist done]]
index d24166710b96e5da4bdcd2aadb2e4f8cb5a554e8..f2880091c5a61553867919d4c3eb66ea0b0932b7 100644 (file)
@@ -2,4 +2,6 @@ We might want some kind of abbreviation and acronym plugin. --[[JoshTriplett]]
 
  * Not sure if this is what you mean, but I'd love a way to make works which match existing page names automatically like (eg. if there is a page called "MySQL" then any time the word MySQL is mentioned it should become a link to that page).  -- [[AdamShand]]
 
+ * The python-markdown-extras package has support for [abbreviations](http://www.freewisdom.org/projects/python-markdown/Abbreviations), with the syntax that you just use the abbreviation in text (e.g. HTML) and then define the abbreviations at the end (like "footnote-style" links). For consistency, it might be good to use the same syntax, which apparently derives from [PHP-markdown-extra](http://michelf.com/projects/php-markdown/extra/#abbr).
+
 [[wishlist]]
diff --git a/doc/todo/allow_displaying_number_of_comments.mdwn b/doc/todo/allow_displaying_number_of_comments.mdwn
new file mode 100644 (file)
index 0000000..02d55fc
--- /dev/null
@@ -0,0 +1,30 @@
+My `numcomments` Git branch adds a `NUMCOMMENTS` `TMPL_VAR`, which is
+useful to add to the `forumpage.tmpl` template to emulate (the nice
+bits of) a more usual webforum.
+
+Please review... and pull :)
+
+-- [[intrigeri]]
+> How is having this variable for showing a count of the comments 
+> better (or more forum-ish) than the COMMENTSLINK variable which
+> includes a count and a link to the comments, and is already displayed
+> in inlinepage.tmpl?
+> 
+> `num_comments` will never return undef.
+> 
+> I see no need to add a second pagetemplate hook.
+> The existing one can be added to. Probably inside its `if ($shown)`
+> block.
+> 
+> It may also be a good idea to either combine the calls to `num_comments`
+> used for this and for the commentslink, 
+> or to memoize it. I'm thinking generally memoizing it may be a good idea
+> since the comments for a page will typically be counted twice when it's
+> inlined.
+> --[[Joey]] 
+
+[[patch]]
+
+>> Well, the COMMENTSLINK variable fits my needs. Sorry for
+>> the disturbance. [[done]] --[[intrigeri]]
diff --git a/doc/todo/allow_plugins_to_add_sorting_methods.mdwn b/doc/todo/allow_plugins_to_add_sorting_methods.mdwn
new file mode 100644 (file)
index 0000000..b523cd1
--- /dev/null
@@ -0,0 +1,304 @@
+[[!tag patch]]
+
+The available [[ikiwiki/pagespec/sorting]] methods are currently hard-coded in
+IkiWiki.pm, making it difficult to add any extra sorting mechanisms. I've
+prepared a branch which adds 'sort' as a hook type and uses it to implement a
+new `meta_title` sort type.
+
+Someone could use this hook to make `\[[!inline sort=title]]` prefer the meta
+title over the page name, but for compatibility, I'm not going to (I do wonder
+whether it would be worth making sort=name an alias for the current sort=title,
+and changing the meaning of sort=title in 4.0, though).
+
+> What compatability concerns, exactly, are there that prevent making that
+> change now? --[[Joey]] 
+
+*[sort-hooks branch now withdrawn in favour of sort-package --s]*
+
+I briefly tried to turn *all* the current sort types into hook functions, and
+have some of them pre-registered, but decided that probably wasn't a good idea.
+That earlier version of the branch is also available for comparison:
+
+*[also withdrawn in favour of sort-package --s]*
+
+>> I wonder if IkiWiki would benefit from the concept of a "sortspec", like a [[ikiwiki/PageSpec]] but dedicated to sorting lists of pages rather than defining lists of pages?  Rather than defining a sort-hook, define a SortSpec class, and enable people to add their own sort methods as functions defined inside that class, similarly to the way they can add their own pagespec definitions. --[[KathrynAndersen]]
+
+>>> [[!template id=gitbranch branch=smcv/ready/sort-package author="[[Simon_McVittie|smcv]]"]]
+>>> I'd be inclined to think that's overkill, but it wasn't very hard to
+>>> implement, and in a way is more elegant. I set it up so sort mechanisms
+>>> share the `IkiWiki::PageSpec` package, but with a `cmp_` prefix. Gitweb:
+>>> <http://git.pseudorandom.co.uk/smcv/ikiwiki.git?a=shortlog;h=refs/heads/sort-package>
+
+>>>> I agree it seems more elegant, so I have focused on it.
+>>>>
+>>>> I don't know about reusing `IkiWiki::PageSpec` for this.
+>>>> --[[Joey]]
+
+>>>>> Fair enough, `IkiWiki::SortSpec::cmp_foo` would be just
+>>>>> as easy, or `IkiWiki::Sorting::cmp_foo` if you don't like
+>>>>> introducing "sort spec" in the API. I took a cue from
+>>>>> [[ikiwiki/pagespec/sorting]] being a subpage of
+>>>>> [[ikiwiki/pagespec]], and decided that yes, sorting is
+>>>>> a bit like a pagespec :-) Which name would you prefer? --s
+
+>>>>>> `SortSpec` --[[Joey]] 
+
+>>>>>>> [[Done]]. --s
+
+>>>> I would be inclined to drop the `check_` stuff. --[[Joey]] 
+
+>>>>> It basically exists to support `title_natural`, to avoid
+>>>>> firing up the whole import mechanism on every `cmp`
+>>>>> (although I suppose that could just be a call to a
+>>>>> memoized helper function). It also lets sort specs that
+>>>>> *must* have a parameter, like
+>>>>> [[field|plugins/contrib/field/discussion]], fail early
+>>>>> (again, not so valuable).
+>>>>>
+>>>>>> AFAIK, `use foo` has very low overhead when the module is already
+>>>>>> loaded. There could be some evalation overhead in `eval q{use foo}`,
+>>>>>> if so it would be worth addressing across the whole codebase.
+>>>>>> --[[Joey]] 
+>>>>>>
+>>>>>>> check_cmp_foo now dropped. --s
+>>>>>
+>>>>> The former function could be achieved at a small
+>>>>> compatibility cost by putting `title_natural` in a new
+>>>>> `sortnatural` plugin (that fails to load if you don't
+>>>>> have `title_natural`), if you'd prefer - that's what would
+>>>>> have happened if `title_natural` was written after this
+>>>>> code had been merged, I suspect. Would you prefer this? --s
+
+>>>>>> Yes! (Assuming it does not make sense to support
+>>>>>> natural order sort of other keys than the title, at least..)
+>>>>>>  --[[Joey]]
+
+>>>>>>> Done. I added some NEWS.Debian for it, too. --s
+
+>>>> Wouldn't it make sense to have `meta(title)` instead
+>>>> of `meta_title`? --[[Joey]]
+
+>>>>> Yes, you're right. I added parameters to support `field`,
+>>>>> and didn't think about making `meta` use them too.
+>>>>> However, `title` does need a special case to make it
+>>>>> default to the basename instead of the empty string.
+>>>>>
+>>>>> Another special case for `title` is to use `titlesort`
+>>>>> first (the name `titlesort` is derived from Ogg/FLAC
+>>>>> tags, which can have `titlesort` and `artistsort`).
+>>>>> I could easily extend that to other metas, though;
+>>>>> in fact, for e.g. book lists it would be nice for
+>>>>> `field(bookauthor)` to behave similarly, so you can
+>>>>> display "Douglas Adams" but sort by "Adams, Douglas".
+>>>>>
+>>>>> `meta_title` is also meant to be a prototype of how
+>>>>> `sort=title` could behave in 4.0 or something - sorting
+>>>>> by page name (which usually sorts in approximately the
+>>>>> same place as the meta-title, but occasionally not), while
+>>>>> displaying meta-titles, does look quite odd. --s
+
+>>>>>> Agreed. --[[Joey]]
+
+>>>>>>> I've implemented meta(title). meta(author) also has the
+>>>>>>> `sortas` special case; meta(updated) and meta(date)
+>>>>>>> should also work how you'd expect them to (but they're
+>>>>>>> earliest-first, unlike age). --s
+
+>>>> As I read the regexp in `cmpspec_translate`, the "command"
+>>>> is required to have params. They should be optional, 
+>>>> to match the documentation and because most sort methods
+>>>> do not need parameters. --[[Joey]]
+
+>>>>> No, `$2` is either `\w+\([^\)]*\)` or `[^\s]+` (with the
+>>>>> latter causing an error later if it doesn't also match `\w+`).
+>>>>> This branch doesn't add any parameterized sort methods,
+>>>>> in fact, although I did provide one on
+>>>>> [[field's_discussion_page|plugins/contrib/report/discussion]]. --s
+
+>>>> I wonder if it would make sense to add some combining keywords, so
+>>>> a sortspec reads like `sort="age then ascending title"`
+>>>> In a way, this reduces the amount of syntax that needs to be learned.
+>>>> I like the "then" (and it could allow other operations than
+>>>> simple combination, if any others make sense). Not so sure about the
+>>>> "ascending", which could be "reverse" instead, but "descending age" and
+>>>> "ascending age" both seem useful to be able to explicitly specify.
+>>>> --[[Joey]]
+
+>>>>> Perhaps. I do like the simplicity of [[KathrynAndersen]]'s syntax
+>>>>> from [[plugins/contrib/report]] (which I copied verbatim, except for
+>>>>> turning sort-by-`field` into a parameterized spec).
+>>>>>
+>>>>> If we're getting into English-like (or at least SQL-like) queries,
+>>>>> it might make sense to change the signature of the hook function
+>>>>> so it's a function to return a key, e.g.
+>>>>> `sub key_age { return -%pagemtime{$_[0]) }`. Then we could sort like
+>>>>> this:
+>>>>>
+>>>>>     field(artistsort) or field(artist) or constant(Various Artists) then meta(titlesort) or meta(title) or title
+>>>>>
+>>>>> with "or" binding more closely than "then". Does this seem valuable?
+>>>>> I think the implementation would be somewhat more difficult. and
+>>>>> it's probably getting too complicated to be worthwhile, though?
+>>>>> (The keys that actually benefit from this could just
+>>>>> have smarter cmp functions, I think.)
+>>>>>
+>>>>> If the hooks return keys rather than cmp results, then we could even
+>>>>> have "lowercase" as an adjective used like "ascending"... maybe.
+>>>>> However, there are two types of adjective here: "lowercase"
+>>>>> really applies to the keys, whereas "ascending" applies to the "cmp"
+>>>>> result. Again, I think this is getting too complex, and could just
+>>>>> be solved with smarter cmp functions.
+>>>>>
+>>>>>> I agree. (Also, I think returning keys may make it harder to write
+>>>>>> smarter cmp functions.) --[[Joey]] 
+>>>>>
+>>>>> Unfortunately, `sort="ascending mtime"` actually sorts by *descending*
+>>>>> timestamp (but`sort=age` is fine, because `age` could be defined as
+>>>>> now minus `ctime`). `sort=freshness` isn't right either, because
+>>>>> "sort by freshness" seems as though it ought to mean freshest first,
+>>>>> but "sort by ascending freshness" means put the least fresh first. If
+>>>>> we have ascending and descending keywords which are optional, I don't
+>>>>> think we really want different sort types to have different default
+>>>>> directions - it seems clearer to have `ascending` always be a no-op,
+>>>>> and `descending` always negate.
+>>>>>
+>>>>>> I think you've convinced me that ascending/descending impose too
+>>>>>> much semantics on it, so "-" is better. --[[Joey]]
+
+>>>>>>> I've kept the semantics from `report` as-is, then:
+>>>>>>> e.g. `sort="age -title"`. --s
+
+>>>>> Perhaps we could borrow from `meta updated` and use `update_age`?
+>>>>> `updateage` would perhaps be a more normal IkiWiki style - but that
+>>>>> makes me think that updateage is a quantity analagous to tonnage or
+>>>>> voltage, with more or less recently updated pages being said to have
+>>>>> more or less updateage. I don't know whether that's good or bad :-)
+>>>>>
+>>>>> I'm sure there's a much better word, but I can't see it. Do you have
+>>>>> a better idea? --s
+
+[Regarding the `meta title=foo sort=bar` special case]
+
+> I feel it sould be clearer to call that "sortas", since "sort=" is used
+> to specify a sort method in other directives. --[[Joey]]
+>> Done. --[[smcv]]
+
+## speed
+
+I notice the implementation does not use the magic `$a` and `$b` globals.
+That nasty perl optimisation is still worthwhile:
+
+       perl -e 'use warnings; use strict; use Benchmark; sub a { $a <=> $b } sub b ($$) { $_[0] <=> $_[1] }; my @list=reverse(1..9999); timethese(10000, {a => sub {my @f=sort a @list}, b => sub {my @f=sort b  @list}, c => => sub {my @f=sort { b($a,$b) } @list}})'
+       Benchmark: timing 10000 iterations of a, b, c...
+                a: 80 wallclock secs (76.74 usr +  0.05 sys = 76.79 CPU) @ 130.23/s (n=10000)
+                b: 112 wallclock secs (106.14 usr +  0.20 sys = 106.34 CPU) @ 94.04/s (n=10000)
+                c: 330 wallclock secs (320.25 usr +  0.17 sys = 320.42 CPU) @ 31.21/s (n=10000)
+
+Unfortunatly, I think that c is closest to the new implementation.
+--[[Joey]]
+
+> Unfortunately, `$a` isn't always `$main::a` - it's `$Package::a` where
+> `Package` is the call site of the sort call. This was a showstopper when
+> `sort` was a hook implemented in many packages, but now that it's a
+> `SortSpec`, I may be able to fix this by putting a `sort` wrapper in the
+> `SortSpec` namespace, so it's like this:
+>
+>     sub sort ($@)
+>     {
+>         my $cmp = shift;
+>         return sort $cmp @_;
+>     }
+>
+> which would mean that the comparison used `$IkiWiki::SortSpec::a`.
+> --s
+
+>> I've now done this. On a wiki with many [[plugins/contrib/album]]s
+>> (a full rebuild takes half an hour!), I tested a refresh after
+>> `touch tags/*.mdwn` (my tag pages contain inlines of the form
+>> `tagged(foo)` sorted by date, so they exercise sorting).
+>> I also tried removing sorting from `pagespec_match_list`
+>> altogether, as an upper bound for how fast we can possibly make it.
+>>
+>> * `master` at branch point: 63.72user 0.29system
+>> * `master` at branch point: 63.91user 0.37system
+>> * my branch, with `@_`: 65.28user 0.29system
+>> * my branch, with `@_`: 65.21user 0.28system
+>> * my branch, with `$a`: 64.09user 0.28system
+>> * my branch, with `$a`: 63.83user 0.36system
+>> * not sorted at all: 58.99user 0.29system
+>> * not sorted at all: 58.92user 0.29system
+>>
+>> --s
+
+> I do notice that `pagespec_match_list` performs the sort before the
+> filter by pagespec. Is this a deliberate design choice, or
+> coincidence? I can see that when `limit` is used, this could be
+> used to only run the pagespec match function until `limit` pages
+> have been selected, but the cost is that every page in the wiki
+> is sorted. Or, it might be useful to do the filtering first, then
+> sort the sub-list thus produced, then finally apply the limit? --s
+
+>> Yes, it was deliberate, pagespec matching can be expensive enough that
+>> needing to sort a lot of pages seems likely to be less work. (I don't
+>> remember what benchmarking was done though.) --[[Joey]]
+
+>>> We discussed this on IRC and Joey pointed out that this also affects
+>>> dependency calculation, so I'm not going to get into this now... --s
+
+Joey pointed out on IRC that the `titlesort` feature duplicates all the
+meta titles. I did that in order to sort by the unescaped version, but
+I've now changed the branch to only store that if it makes a difference.
+--s
+
+## Documentation from sort-package branch
+
+### advanced sort orders (conditionally added to [[ikiwiki/pagespec/sorting]])
+
+* `title_natural` - Orders by title, but numbers in the title are treated
+  as such, ("1 2 9 10 20" instead of "1 10 2 20 9")
+* `meta(title)` - Order according to the `\[[!meta title="foo" sortas="bar"]]`
+  or `\[[!meta title="foo"]]` [[ikiwiki/directive]], or the page name if no
+  full title was set. `meta(author)`, `meta(date)`, `meta(updated)`, etc.
+  also work.
+
+### Multiple sort orders (added to [[ikiwiki/pagespec/sorting]])
+
+In addition, you can combine several sort orders and/or reverse the order of
+sorting, with a string like `age -title` (which would sort by age, then by
+title in reverse order if two pages have the same age).
+
+### meta sortas parameter (added to [[ikiwiki/directive/meta]])
+
+[in title]
+
+An optional `sort` parameter will be used preferentially when
+[[ikiwiki/pagespec/sorting]] by `meta(title)`:
+
+       \[[!meta title="The Beatles" sort="Beatles, The"]]
+
+       \[[!meta title="David Bowie" sort="Bowie, David"]]
+
+[in author]
+
+  An optional `sortas` parameter will be used preferentially when
+  [[ikiwiki/pagespec/sorting]] by `meta(author)`:
+
+        \[[!meta author="Joey Hess" sortas="Hess, Joey"]]
+
+### Sorting plugins (added to [[plugins/write]])
+
+Similarly, it's possible to write plugins that add new functions as
+[[ikiwiki/pagespec/sorting]] methods. To achieve this, add a function to
+the IkiWiki::SortSpec package named `cmp_foo`, which will be used when sorting
+by `foo` or `foo(...)` is requested.
+
+The names of pages to be compared are in the global variables `$a` and `$b`
+in the IkiWiki::SortSpec package. The function should return the same thing
+as Perl's `cmp` and `<=>` operators: negative if `$a` is less than `$b`,
+positive if `$a` is greater, or zero if they are considered equal. It may
+also raise an error using `error`, for instance if it needs a parameter but
+one isn't provided.
+
+The function will also be passed one or more parameters. The first is
+`undef` if invoked as `foo`, or the parameter `"bar"` if invoked as `foo(bar)`;
+it may also be passed additional, named parameters.
index 99a9cf1e2b4d073fe37f75480090499810a547f4..82670250e54df00b79d8419fe1cbdf3dc5ae6311 100644 (file)
@@ -36,6 +36,30 @@ definitions essentially.
 >> I've made may not be acceptable, though -- I'd appreciate someone providing
 >> some feedback on that hunk!
 
+>>> Well, re that hunk, taint checking is currently disabled, but
+>>> if the perl bug that disallows it is fixed and it is turned back on,
+>>> the hash values will remain tainted, which will probably lead to
+>>> problems.
+>>>
+>>> I'm also leery of using such a complex data structure in config.
+>>> The websetup plugin would be hard pressed to provide a UI for such a
+>>> data structure. (It lacks even UI for a single hash ref yet, let alone
+>>> a list.)
+>>> 
+>>> Also, it seems sorta wrong to have two so very different syntaxes to 
+>>> represent the same meta data. A user without a lot of experience will
+>>> be hard pressed to map from a directive to this in the setup file.
+>>>
+>>> All of which leads me to think the setup file could just contain
+>>> a text that could hold meta directives. Which generalizes really to
+>>> a text that contains any directives, and is, perhaps appended to the
+>>> top of every page. Which nearly generalizes to the sidebar plugin,
+>>> or perhaps something more general than that... 
+>>>
+>>> However, excessive generalization is the root of all evil, so 
+>>> I'm not necessarily saying that's a good idea. Indeed, my memory
+>>> concerns below invalidate this idea pretty well. --[[Joey]] 
+
     diff --git a/IkiWiki/Plugin/meta.pm b/IkiWiki/Plugin/meta.pm
     index 6fe9cda..2f8c098 100644
     --- a/IkiWiki/Plugin/meta.pm
@@ -125,6 +149,10 @@ definitions essentially.
 >> are only relevant to defined fields that you wouldn't want to specify a
 >> global default for anyway.
 >>
+>>> I generally agree with this. It is *possible* that meta would have a new
+>>> field added, that takes parameters and make sense to use globally.
+>>> --[[Joey]] 
+>>
 >> Due to this, and the added complexity of the second patch (having to adjust
 >> `IkiWiki/Setup.pm`), I think the first patch makes more sense. I've thus
 >> reverted to it here.
@@ -183,3 +211,36 @@ definitions essentially.
 >>> ikiwiki for the break, and now I've returned to watching recentchanges.
 >>> Hopefully I'll be back in the mix soon, too. In the meantime, Joey, have
 >>> you had a chance to look at this yet? -- [[Jon]]
+
+>>>> Ping :) Hi.  [[Joey]], would you consider this patch for the next
+>>>> ikiwiki release? -- [[Jon]]
+
+>>> For this to work with websetup and --dumpsetup, it needs to define the
+>>> `meta_*` settings in the getsetup function.
+>>>> 
+>>>> I think this will be problematic with the current implementation of this
+>>>> patch. The datatype here is an array of hash references, with each hash
+>>>> having a variable (and arbitrary) number of key/value pairs.  I can't
+>>>> think of an intuitive way of implementing a way of editing such a
+>>>> datatype in the web interface, let alone registering the option in
+>>>> getsetup.
+>>>> 
+>>>> Perhaps a limited set of defined meta values could be exposed via
+>>>> websetup (the obvious ones: author, copyright, license, etc.) -- [[Jon]]
+>>>
+>>> I also have some concerns about both these patches, since both throw
+>>> a lot of redundant data at meta, which then stores it in a very redundant
+>>> way. Specifically, meta populates a per-page `%metaheaders` hash
+>>> as well as storing per-page metadata in `%pagestate`. So, if you have
+>>> a wiki with 10 thousand pages, and you add a 1k site-wide license text,
+>>> that will bloat the memory usage of ikiwiki by in excess of 2
+>>> megabytes. It will also cause ikiwiki to write a similar amount more data
+>>> to its state file which has to be loaded back in each
+>>> run.
+>>>
+>>> Seems that this could be managed much more efficiently by having
+>>> meta special-case the site-wide settings, not store them in these
+>>> per-page data structures, and just make them be used if no per-page
+>>> metadata of the given type is present. --[[Joey]]
+>>>> 
+>>>> that should be easy enough to do. I will work on a patch. -- [[Jon]]
diff --git a/doc/todo/anon_push_of_comments.mdwn b/doc/todo/anon_push_of_comments.mdwn
new file mode 100644 (file)
index 0000000..b472ea1
--- /dev/null
@@ -0,0 +1,14 @@
+It should be possible to use anonymous git push to post comments
+(created, say, by a ikiwiki-comment program). Currently, that is not
+allowed, because users cannot edit, or create internal page files.
+But, comments in allowed locations are an exception to that rule, and 
+that exception should be communicated somehow to `IkiWiki::Receive`.
+--[[Joey]] 
+
+> Complications include: 
+> 
+> * Hard to see a way to prevent users from committing a comment that
+>   claims to be written by someone else.
+> * `checkcontent` hooks need to be run, but can't accept a comment
+>   for later moderation, since it's coming in as part of a commit.
+>   Best they could do is reject the commit.
index f1d33114ff7518b6e0eab6af2601cbfa8930da99..7eb4049104ce20a9cdac056344778453140e50cc 100644 (file)
@@ -4,7 +4,7 @@ Tags are mainly specific to the object to which they’re stuck. However, I ofte
 
 Also see: <http://madduck.net/blog/2008.01.06:new-blog/> and <http://users.itk.ppke.hu/~cstamas/code/ikiwiki/autocreatetagpage/>
 
-[[!tag wishlist plugins/tag patch]]
+[[!tag wishlist plugins/tag patch patch/core]]
 
 I would love to see this as well. -- dato
 
@@ -15,88 +15,9 @@ A new setting is used to enable or disable auto-create tag pages, `tag_autocreat
 The new tag file is created during the preprocess phase. 
 The new tag file is then complied during the change phase.
 
-_tag.pm from version 3.01_
-
-
-       --- tag.pm      2009-02-06 10:26:03.000000000 -0700
-       +++ tag_new.pm  2009-02-06 12:17:19.000000000 -0700
-       @@ -14,6 +14,7 @@
-                       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);
-       +       hook(type => "change", id => "tag", call => \&change);
-        }
-        
-        sub getopt () {
-       @@ -36,6 +37,36 @@
-                                                       safe => 1,
-                                                       rebuild => 1,
-                                       },
-       +               tag_autocreate => {
-       +                       type => "boolean",
-       +                       example => 0,
-       +                       description => "Auto-create the new tag pages, uses autotagpage.tmpl ",
-       +                       safe => 1,
-       +                       rebulid => 1,
-       +               },
-       +}
-       +
-       +my $autocreated_page = 0;
-       +
-       +sub gen_tag_page($)    {
-       +       my $tag=shift;
-       +
-       +       my $tag_file=$tag.'.'.$config{default_pageext};
-       +       return if (-f $config{srcdir}.$tag_file);
-       +
-       +       my $template=template("autotagpage.tmpl");
-       +       $template->param(tag => $tag);
-       +       writefile($tag_file, $config{srcdir}, $template->output);
-       +       $autocreated_page = 1;
-       +
-       +       if ($config{rcs}) {
-       +               IkiWiki::disable_commit_hook();
-       +               IkiWiki::rcs_add($tag_file);
-       +               IkiWiki::rcs_commit_staged(
-       +                       gettext("Automatic tag page generation"),
-       +                       undef, undef);
-       +               IkiWiki::enable_commit_hook();
-       +       }
-        }
-        
-        sub tagpage ($) {
-       @@ -47,6 +78,10 @@
-                                       $tag=~y#/#/#s; # squash dups
-                       }
-        
-       +       if (defined $config{tag_autocreate} && $config{tag_autocreate} ) {
-       +               gen_tag_page($tag);
-       +       }
-       +
-                       return $tag;
-        }
-        
-       @@ -125,4 +160,18 @@
-                       }
-        }
-        
-       +sub change(@) {
-       +       return unless($autocreated_page);
-       +       $autocreated_page = 0;
-       +
-       +       # This refresh/saveindex is to complie the autocreated tag pages
-       +       IkiWiki::refresh();
-       +       IkiWiki::saveindex();
-       +
-       +       # This refresh/saveindex is to fix the Tags link
-       +       # With out this additional refresh/saveindex the tag link displays ?tag
-       +       IkiWiki::refresh();
-       +       IkiWiki::saveindex();
-       +}
-       +
+*see git history of this page if you want the patch --[[smcv]]*
 
-
-This uses a [[template|wikitemplates]] called `autotagpage.tmpl`, here is my template file:
+This uses a [[template|templates]] called `autotagpage.tmpl`, here is my template file:
 
     \[[!inline pages="link(<TMPL_VAR TAG>)" archive="yes"]]
 
@@ -123,3 +44,208 @@ On the second extra pass, it doesn't notice that it has to update the "?"-link.
                 }
 
 is not satisfied for the newly created tag page. I shall put debug msgs into Render.pm to find out better how it works. --Ivan Z.
+
+---
+
+I've made another attempt at fixing this
+
+The current progress can be found at my [git repository][gitweb] on branch
+`autotag`:
+
+       git://git.liegesta.at/git/ikiwiki
+
+[gitweb]: http://git.liegesta.at/?p=ikiwiki.git;a=shortlog;h=refs/heads/autotag (gitweb for branch autotag)
+
+It's not entirely finished yet, but already quite usable. Testing and comments
+on code quality, implementation details, as well as other patches would be
+appreciated.
+
+Here's what it does right now:
+
+* enabled by setting `tag_autocreate=1` in the configuration.
+* Tag pages will be created in `tagbase` from the template `autotag.tmpl`.
+* Will correctly render all links, and dependencies. Well, AFAIK.
+* When a tag page is deleted it will automatically recreated from template. (I
+consider this a feature, not a bug)
+* Requires a rebuild on first use.
+* Adds a function `add_autofile()` to the plugin API, to do all this.
+
+Todo/Bugs:
+
+* Will still create a page even if there's a page other than `$tag` under
+`tagbase` satisfying the tag link. (details? --[[Joey]])
+* Call from `IkiWiki.pm` to `Render.pm`, which adds a module dependency in the
+wrong direction. (fixed --[[Joey]] )
+* Add files to RCS.
+* Unit tests.
+* Proper documentation. (fixed (mostly) --[[Joey]])
+
+--[[David_Riebenbauer]]
+
+> Starting review of this. Some of your commits are to very delicate,
+> optimised, and security-sensitive ground, so I have to look at them very
+> carefully. --[[Joey]]
+
+>> First of, sorry that it took me so damn long to answer. I didn't lose
+>> interest but it took a while for me to find the time and motivation
+>> to address you suggestions. --[[David_Riebenbauer]]
+
+> * In the refactoring in [f3abeac919c4736429bd3362af6edf51ede8e7fe][],
+>   you introduced at least 2 bugs, one a possible security hole.
+>   Now one part of the code tests `if ($file)` and the other
+>   caller tests `if ($f)`. These two tests both tested `if (! defined $f)`
+>   before. Notice that the variable needs to be the untainted variable
+>   for both. Also notice that `if ($f)` fails if `$f` contains `0`,
+>   which is a very common perl gotcha.
+> * Your refactored code changes `-l $_ || -d _` to `-l $file || -d $file`.
+>   The latter makes one more stat system call; note the use of a
+>   bare `_` in the first to make perl reuse the stat buffer.
+> * (As a matter of style, could you put a space after the commas in your
+>   perl?)
+
+>> The first two points should be addressed in
+>> [da5d29f95f6e693e8c14be1b896cf25cf4fdb3c0][]. And sure, I can add the
+>> spaces. --[[David_Riebenbauer]]
+
+> I'd like to cherry-pick the above commit, once it's in shape, before
+> looking at the rest in detail. So just a few other things that stood out.
+> 
+> * Commit [4af4d26582f0c2b915d7102fb4a604b176385748][] seems unnecessary.
+>   `srcfile($file, 1)` already is documented to return undef if the
+>   file does not exist. (But without the second parameter, it throws
+>   an error.)
+
+>> You're right. I must have been some confused by some other promplem I
+>> introduced then. Reverted. --[[David_Riebenbauer]]
+
+> * Commit [f58f3e1bec41ccf9316f37b014ce0b373c8e49e1][] adds a line
+>   that is intented by a space, not a tab.
+
+>> Sorry, That one was reverted anyway. --[[David_Riebenbauer]]
+
+> * Commit [f58f3e1bec41ccf9316f37b014ce0b373c8e49e1][] says that auto-added
+>   files will be recreated if the user deletes them. That seems bad.
+>   `autoindex` goes to some trouble to not recreate deleted files.
+
+>> I reverted the commit and addressed the issue in
+>> [a358d74bef51dae31332ff27e897fe04834571e6][] and
+>> [981400177d68a279f485727be3f013e68f0bf691][].
+ --[[David_Riebenbauer]]
+
+>>> This doesn't seem to have all the refinements that autoindex has:
+>>>
+>>> * `autoindex` attaches the record of deletions to the `index` page, which
+>>>   is (nearly) guaranteed to exist; this one attaches the record of
+>>>   deletions to the deleted page's page state. Won't that tend to result
+>>>   in losing the record along with the deleted page?
+
+>>>> This is probably on of the harder things to do, 'cause there are (most of the
+>>>> time) several pages that are responsible for the creation of a single tag page.
+>>>> Of course I could attach the info to all of them.
+
+>>>> With current behaviour I think the information in `%pagestate` is kept around
+>>>> regardless whether the corresponding page exists or not.
+>>>> --[[David_Riebenbauer]]
+
+>>>>> Sorry, I'll try to be clearer: `autoindex` hard-codes that the [[index]] page
+>>>>> of the entire wiki is the one responsible for storing the page state. That
+>>>>> page isn't responsible for the creation of the tag page, it's just an
+>>>>> arbitrary page that's (more or less) guaranteed to exist. --[[smcv]]
+
+>>>>> I don't like that [[plugins/autoindex]] has to do that,
+>>>>> but `%pagestate` values are only stored for pages that exist,
+>>>>> so it was necessary. (Another way to look at this is that
+>>>>> `%pagestate` is not the ideal data structure.) --[[Joey]]
+
+>>>>>> Aha! Having looked at [[plugins/write]] again, it turns out that what this
+>>>>>> feature should really use is `%wikistate`, I think? :-) --[[smcv]]
+
+>>>>>>> Ah, indeed, that came after I wrote autoindex. I've fixed autoindex to
+>>>>>>> use it. --[[Joey]]
+
+>>>>> Ok, now I know what you mean. --[[David_Riebenbauer]]
+
+>>> * `autoindex` forgets that a page was deleted when that page is
+>>>   re-created
+
+>>>> Yes, I forgot about that and that is a bug. I'll fix that.
+>>>> --[[David_Riebenbauer]]
+
+>>>>> In my branch, it keeps a list of autofiles that were created,
+>>>>> not deleted. And I think that turns out to be necessary, really.
+>>>>> However, I see no way to clean out that list on deletion and
+>>>>> manual recreation -- it still needs to remember it was once an autofile,
+>>>>> in order to avoid recreating it if it's deleted yet again. --[[Joey]]
+
+>>>>>> Are these really the semantics we want? It seems strange to me
+>>>>>> that this:
+>>>>>>
+>>>>>> * tag a page as foo
+>>>>>> * tags/foo automatically appears
+>>>>>> * delete tags/foo
+>>>>>> * create tags/foo manually
+>>>>>> * delete tags/foo again
+>>>>>> * tags/foo isn't automatically created
+>>>>>>
+>>>>>> isn't the same as this:
+>>>>>>
+>>>>>> * create tags/foo
+>>>>>> * delete tags/foo
+>>>>>> * tag a page as foo
+>>>>>> * tags/foo automatically appears
+>>>>>>
+>>>>>> or even this:
+>>>>>>
+>>>>>> * create tags/foo
+>>>>>> * tag a page as foo
+>>>>>> * delete tags/foo
+>>>>>> * tags/foo automatically appears (?)
+>>>>>>
+>>>>>> --[[smcv]]
+
+>>>>>>> I agree that the last of these is not desired. It could be avoided
+>>>>>>> by extending the list of autofiles to include those that were not
+>>>>>>> created due to the file/page already existing.
+>>>>>>> 
+>>>>>>> Hmm, that would fix the previous scenario too. --[[Joey]] 
+
+>>> * `autoindex` forgets that a page was deleted when it's no longer needed
+>>>   anyway (this may be harder for `autotag`?)
+
+>>>> I don't think so. AFAIK ikiwiki can detect whether there are taglinks to a page
+>>>> anyway, so it should be quite easy. I'll try to implement that too.
+>>>> --[[David_Riebenbauer]]
+
+>>> It'd probably be an interesting test of the core change to port
+>>> `autoindex` to use it? (Adding the file to the RCS would be
+>>> necessary to get parity with `autoindex`.) --[[smcv]]
+
+>>>> Good suggestion. Adding the files to RCS is on my todo list anyway.
+>>>> --[[David_Riebenbauer]]
+
+>>>>> I think it may be better to allow the `add_autofile` caller
+>>>>> to specify if it is added to RCS. In my branch, it can do
+>>>>> so by just making the callback it registers call `rcs_add`; 
+>>>>> and I have tag do this. Other plugins might want autofiles
+>>>>> that do not get checked in, conceivably.
+>>>>> --[[Joey]] 
+
+> Regarding the call from `IkiWiki.pm` to `Render.pm`, wouldn't this be
+> quite easy to solve by moving `verify_src_file` to IkiWiki.pm? --[[smcv]]
+
+>> True. I'll do that. --[[David_Riebenbauer]]
+>> Fixed in my branch --[[Joey]]
+
+[[!template id=gitbranch branch=origin/autotag author="[[Joey]]"]]
+I've pushed an autotag branch of my own, which refactors
+things a bit and fixes bugs around deletion/recreation.
+I've tested it fairly thouroughly. --[[Joey]]
+
+[f3abeac919c4736429bd3362af6edf51ede8e7fe]: http://git.liegesta.at/?p=ikiwiki.git;a=commitdiff;h=f3abeac919c4736429bd3362af6edf51ede8e7fe (commitdiff for f3abeac919c4736429bd3362af6edf51ede8e7fe)
+[4af4d26582f0c2b915d7102fb4a604b176385748]: http://git.liegesta.at/?p=ikiwiki.git;a=commitdiff;h=4af4d26582f0c2b915d7102fb4a604b176385748 (commitdiff for 4af4d26582f0c2b915d7102fb4a604b176385748)
+[f58f3e1bec41ccf9316f37b014ce0b373c8e49e1]: http://git.liegesta.at/?p=ikiwiki.git;a=commitdiff;h=f58f3e1bec41ccf9316f37b014ce0b373c8e49e1 (commitdiff for f58f3e1bec41ccf9316f37b014ce0b373c8e49e1)
+[da5d29f95f6e693e8c14be1b896cf25cf4fdb3c0]: http://git.liegesta.at/?p=ikiwiki.git;a=commitdiff;h=da5d29f95f6e693e8c14be1b896cf25cf4fdb3c0 (commitdiff for da5d29f95f6e693e8c14be1b896cf25cf4fdb3c0)
+[a358d74bef51dae31332ff27e897fe04834571e6]: http://git.liegesta.at/?p=ikiwiki.git;a=commitdiff;h=a358d74bef51dae31332ff27e897fe04834571e6 (commitdiff for a358d74bef51dae31332ff27e897fe04834571e6)
+[981400177d68a279f485727be3f013e68f0bf691]: http://git.liegesta.at/?p=ikiwiki.git;a=commitdiff;h=981400177d68a279f485727be3f013e68f0bf691 (commitdiff for 981400177d68a279f485727be3f013e68f0bf691)
+
+[[!tag done]]
diff --git a/doc/todo/auto_getctime_on_fresh_build.mdwn b/doc/todo/auto_getctime_on_fresh_build.mdwn
new file mode 100644 (file)
index 0000000..760c56f
--- /dev/null
@@ -0,0 +1,13 @@
+[[!tag wishlist]]
+
+It might be a good idea to enable --gettime when `.ikiwiki` does not
+exist. This way a new checkout of a `srcdir` would automatically get
+ctimes right. (Running --gettime whenever a rebuild is done would be too
+slow.) --[[Joey]] 
+
+Could this be too annoying in some cases, eg, checking out a large wiki
+that needs to get set up right away? --[[Joey]] 
+
+> Not for git with the new, optimised --getctime. For other VCS.. well,
+> pity they're not as fast as git ;), but it is a one-time expense...
+> [[done]] --[[Joey]]
diff --git a/doc/todo/auto_publish_expire.mdwn b/doc/todo/auto_publish_expire.mdwn
new file mode 100644 (file)
index 0000000..7a5a175
--- /dev/null
@@ -0,0 +1,33 @@
+It could be nice to mark some page such that:
+
+* the page is automatically published on some date (i.e. build, linked, syndicated, inlined/mapped, etc.)
+* the page is automatically unpublished at some other date (i.e. removed)
+
+I know that ikiwiki is a wiki compiler so that something has to refresh the wiki periodically to enforce the rules (a cronjob for instance). It seems to me that the calendar plugin rely on something similar.
+
+The date for publishing and expiring could be set be using some new directives; an alternative could be to expand the [[plugin/meta]] plugin with [<span/>[!meta date="auto publish date"]] and [<span/>[!meta expires="auto expire date"]].
+
+--[[JeanPrivat]]
+
+> This is a duplicate, and expansion, of
+> [[todo/tagging_with_a_publication_date]].
+> There, I suggest using a branch to develop
+> prepublication versions of a site, and merge from it
+> when the thing is published. 
+> 
+> Another approach I've seen used is to keep such pages in a pending/
+> directory, and move them via cron job when their publication time comes.
+> But that requires some familiarity with, and access to, cron.
+> 
+> On [[todo/tagging_with_a_publication_date]], I also suggested using meta 
+> date to set a page's date into the future,
+> and adding a pagespec that matches only pages with dates in the past,
+> which would allow filtering out the unpublished ones.
+> Sounds like you are thinking along these lines, but possibly using
+> something other than the page's creation or modification date to do it.
+> 
+> I do think the general problem with that approach is that you have to be
+> careful to prevent the unpublished pages from leaking out in any
+> inlines, maps, etc. --[[Joey]] 
+
+[[!tag wishlist]]
diff --git a/doc/todo/auto_rebuild_on_template_change.mdwn b/doc/todo/auto_rebuild_on_template_change.mdwn
new file mode 100644 (file)
index 0000000..ea990b8
--- /dev/null
@@ -0,0 +1,78 @@
+If `page.tmpl` is changed, it would be nice if ikiwiki automatically
+noticed, and rebuilt all pages. If `inlinepage.tmpl` is changed, a rebuild
+of all pages using it in an inline would be stellar.
+
+This would allow setting:
+
+       templatedir => "$srcdir/templates",
+
+.. and then the [[templates]] are managed like other wiki files; and
+like other wiki files, a change to them automatically updates dependent
+pages.
+
+Originally, it made good sense not to have the templatedir inside the wiki.
+Those templates can be used to bypass the htmlscrubber, and you don't want
+just anyone to edit them. But the same can be said of `style.css` and
+`ikiwiki.js`, which *are* in the wiki. We rely on `allowed_attachments`
+being set to secure those to prevent users uploading replacements. And we
+assume that users who can directly (non-anon) commit *can* edit them, and
+that's ok.
+
+So, perhaps the easiest way to solve this [[wishlist]] would be to
+make templatedir *default* to "$srcdir/templates/, and make ikiwiki
+register dependencies on `page.tmpl`, `inlinepage.tmpl`, etc, as they're
+used. Although, having every page declare an explicit dep on `page.tmpl`
+is perhaps a bit much; might be better to implement a special case for that
+one. Also, having the templates be copied to `destdir` is not desirable.
+In a sense, these template would be like internal pages, except not wiki
+pages, but raw files.
+
+The risk is that a site might have `allowed_attachments` set to
+`templates/*` or `*.tmpl` something like that. I think such a configuration
+is the *only* risk, and it's unlikely enough that a NEWS warning should
+suffice.
+
+(This would also help to clear up the tricky disctinction between
+wikitemplates and in-wiki templates.)
+
+Note also that when using templates from "$srcdir/templates/", `no_includes`
+needs to be set. Currently this is done by the two plugins that use
+such templates, while includes are allowed in `templatedir`.
+
+Have started working on this.
+[[!template id=gitbranch branch=origin/templatemove author="[[Joey]]"]]
+
+> But would this require that templates be parseable as wiki pages?  Because that would be a nuisance. --[[KathrynAndersen]]
+
+>> It would be better for them not to be rendered separately at all.
+>> --[[Joey]]  
+
+>>> I don't follow you. --[[KathrynAndersen]]
+
+>>>> If they don't render to output files, they clearly don't
+>>>> need to be treated as wiki pages. (They need to be treated
+>>>> as raw files anyway, because you don't want random users editing them 
+>>>> in the online editor.) --[[Joey]] 
+
+>>>>> Just to be clear, the raw files would not be copied across to the output
+>>>>> directory? -- [[Jon]]
+
+>>>>>> Without modifying ikiwiki, they'd be copied to the output directory as
+>>>>>> (e.g.) http://ikiwiki.info/templates/inlinepage.tmpl; to not copy them,
+>>>>>> it'd either be necessary to make them be internal pages
+>>>>>> (templates/inlinepage._tmpl) or special-case them in some other way.
+>>>>>> --[[smcv]]
+
+>>>>>>> In my branch, I left in support for the templatedir, and also
+>>>>>>> /usr/share/ikiwiki/templates. So, users do not have to put their
+>>>>>>> custom templates in templates/ in the wiki. If they do, 
+>>>>>>> the templates are copied to the destdir like other non-wiki page files
+>>>>>>> are. The templates are not wiki pages, except those used by a few
+>>>>>>> things like the [[plugins/template]] plugin.
+>>>>>>> 
+>>>>>>> That seems acceptable, since users probably don't need to modify
+>>>>>>> many templates, so the clutter is small. (Especially when
+>>>>>>> compared to the other clutter the basewiki always puts in destdir.)
+>>>>>>> This could be revisted later. --[[Joey]] 
+
+[[done]]
index b8aa2327f972ed828fe5f0e0b2495c9b58985e9e..f0599e4ed94fdf8695272753d5f3708814b8cf21 100644 (file)
@@ -1,38 +1,19 @@
 [[!tag wishlist]]
 
 It would be nice if ikiwiki, particularly [[plugins/comments]]
-supported user avatar icons. I was considering adding a directive for this,
-as designed below.
+(but also, ideally, recentchanges) supported user avatar icons.
 
-However, there is no *good* service for mapping openids to avatars --
-openavatar has many issues, including not supporting delegated openids, and
-after trying it, I don't trust it to push users toward. 
-Perhaps instead ikiwiki could get the email address from the openid
-provider, though I think the perl openid modules don't support the openid
-2.x feature that allows that.
-
-At the moment, working on this doesn't feel like a good use of my time.
---[[Joey]]
-
-Hmm.. unless is just always used a single provider (gravatar) and hashed
-the openid. Then wavatars could be used to get a unique avatar per openid
-at least. --[[Joey]] 
-
-----
-
-The directive displays a small avatar image for a user. Pass it the
-email address, openid, or wiki username of the user.
+Idea is to add a directive that displays a small avatar image for a user.
+Pass it a user's the email address, openid, username, or the md5 hash
+of their email address:
 
        \[[!avatar user@example.com]]
        \[[!avatar http://joey.kitenet.net/]]
        \[[!avatar user]]
+       \[[!avatar hash]]
 
-The avatars are provided by various sites. For email addresses, it uses a
-[gravatar](http://gravatar.com/). For openid,
-[openavatar](http://www.openvatar.com/) is used. For a wiki username, the
-user's email address is looked up and the gravatar for that user is
-displayed. (Of course, the user has to have filled in their email address
-on their Preferences page for that to work.)
+These directives can then be hand-inserted onto pages, or more likely,
+included in eg, a comment post via a template.
 
 An optional second parameter can be included, containing additional
 options to pass in the 
@@ -45,3 +26,35 @@ not have a gravatar, uses a cute auto-generated "wavatar" avatar.
 The `gravitar_options` setting in the setup file can be used to
 specify additional options to pass. So for example if you want
 to use wavatars everywhere, set it to "default=wavatar".
+
+The avatars are provided by various sites. For email addresses, it uses a
+[gravatar](http://gravatar.com/). For a wiki username, the
+user's email address is looked up and the gravatar for that user is
+displayed. (Of course, the user has to have filled in their email address
+on their Preferences page for that to work. Also, when the user changes
+their email address in Preferences, the gravatar won't change until the
+wiki is rebuilt.)
+
+For openid, openavatar sucked and is now dead. So we need to use an email
+address instead, I guess. Problem is that the email address of a given
+openid is only known when that user is logged in and making a change.
+And we don't want to leak an openid user's email into a page either.
+Hmm. Suppose the gravatar hash could be calculated from the email address
+and embedded instead of the openid? That would work for comments,
+but not if the directive were used elsewhere.
+
+Or, for openid, could use <http://paulisageek.com/openidavatar>. Which
+works fine, but users are not likely to figure out what they need to do to
+get an avatar associated with their openid.
+
+---
+
+Alternative, not overdesigned approach:
+
+Modify comments plugin to have an option to display avatars.
+
+When posting a comment, fill in the avatarhash field in the template.
+The hash is calculated from the user's email address. If the user's email
+is not known, skip it. 
+
+End. :P
index fb942a49552246a0d56ca5e32c6e75d2a85ea0c1..fdaa09f26fac39d797367b7c9c53808000a54c03 100644 (file)
@@ -13,5 +13,113 @@ those contents instead.
 
 > In mine I just copied sidebar out and made some extra "sidebars", but they go elsewhere. Ugly hack, but it works. --[[simonraven]]
 
+>> Here a simple [[patch]] for multiple sidebars. Not too fancy but better than having multiple copies of the sidebar plugin. --[[jeanprivat]]
+
+>>> I made a [[git]] branch for it [[!template id=gitbranch branch="privat/multiple_sidebars" author="[[jeanprivat]]"]] --[[jeanprivat]]
+
+>>>> Ping for [[Joey]]. Do you have any comment? I could improve it if there is things you do not like. I prefer to have such a feature integrated upstream. --[[JeanPrivat]]
+
+>>>>> The code is fine.
+>>>>>
+>>>>> I did think about having it examine
+>>>>> the `page.tmpl` for parameters with names like `FOO_SIDEBAR`
+>>>>> and automatically enable page `foo` as a sidebar in that case,
+>>>>> instead of using the setup file to enable. But I'm not sure about
+>>>>> that idea..
+>>>>> 
+>>>>> The full compliment of sidebars would be a header, a footer,
+>>>>> a left, and a right sidebar. It would make sense to go ahead
+>>>>> and add the parameters to `page.tmpl` so enabling each just works,
+>>>>> and add whatever basic CSS makes sense. Although I don't know
+>>>>> if I want to try to get a 3 column CSS going, so perhaps leave the
+>>>>> left sidebar out of that.
+
+-------------------
+
+<pre>
+--- /usr/share/perl5/IkiWiki/Plugin/sidebar.pm 2010-02-11 22:53:17.000000000 -0500
++++ plugins/IkiWiki/Plugin/sidebar.pm  2010-02-27 09:54:12.524412391 -0500
+@@ -19,12 +19,20 @@
+                       safe => 1,
+                       rebuild => 1,
+               },
++              active_sidebars => {
++                      type => "string",
++                      example => qw(sidebar banner footer),
++                      description => "Which sidebars must be activated and processed.",
++                      safe => 1,
++                      rebuild => 1
++              },
+ }
+-sub sidebar_content ($) {
++sub sidebar_content ($$) {
+       my $page=shift;
++      my $sidebar=shift;
+       
+-      my $sidebar_page=bestlink($page, "sidebar") || return;
++      my $sidebar_page=bestlink($page, $sidebar) || return;
+       my $sidebar_file=$pagesources{$sidebar_page} || return;
+       my $sidebar_type=pagetype($sidebar_file);
+       
+@@ -49,11 +57,17 @@
+       my $page=$params{page};
+       my $template=$params{template};
+-      
+-      if ($template->query(name => "sidebar")) {
+-              my $content=sidebar_content($page);
+-              if (defined $content && length $content) {
+-                      $template->param(sidebar => $content);
++
++      my @sidebars;
++      if (defined $config{active_sidebars} && length $config{active_sidebars}) { @sidebars = @{$config{active_sidebars}}; }
++      else { @sidebars = qw(sidebar); }
++
++      foreach my $sidebar (@sidebars) {
++              if ($template->query(name => $sidebar)) {
++                      my $content=sidebar_content($page, $sidebar);
++                      if (defined $content && length $content) {
++                              $template->param($sidebar => $content);
++                      }
+               }
+       }
+ }
+</pre>
+
+----------------------------------------
+## Further thoughts about this
+
+(since the indentation level was getting rather high.)
+
+What about using pagespecs in the config to map pages and sidebar pages together?  Something like this:
+
+<pre>
+       sidebar_pagespec => {
+           "foo/*" => 'sidebars/foo_sidebar',
+           "bar/* and !bar/*/*' => 'bar/bar_top_sidebar',
+           "* and !foo/* and !bar/*" => 'sidebars/general_sidebar',
+       },
+</pre>
+
+One could do something similar for *pageheader*, *pagefooter* and *rightbar* if desired.
+
+Another thing which I find compelling - but probably because I am using [[plugins/contrib/field]] - is to be able to treat the included page as if it were *part* of the page it was included into, rather than as an included page.  I mean things like \[[!if ...]] would test against the page name of the page it's included into rather than the name of the sidebar/header/footer page.  It's even more powerful if one combines this with field/getfield/ftemplate/report, since one could make "generic" headers and footers that could apply to a whole set of pages.
+
+Header example:
+<pre>
+#{{$title}}
+\[[!ftemplate id="nice_data_table"]]
+</pre>
+
+Footer example:
+<pre>
+------------
+\[[!report template="footer_trail" trail="trailpage" here_only=1]]
+</pre>
+
+(Yes, I am already doing something like this on my own site.  It's like the PmWiki concept of GroupHeader/GroupFooter)
+
+-- [[KathrynAndersen]]
 
 [[!tag wishlist]]
diff --git a/doc/todo/cdate_and_mdate_available_for_templates.mdwn b/doc/todo/cdate_and_mdate_available_for_templates.mdwn
new file mode 100644 (file)
index 0000000..70d8fc8
--- /dev/null
@@ -0,0 +1,15 @@
+[[!tag wishlist]]
+
+`CDATE_3339`, `CDATE_822`, `MDATE_3339` and `MDATE_822` template variables would be useful for evey page, at least for my templates with Dublin Core metadata.
+
+I tried to pick the relevant lines of the [[inline|plugins/inline]] plugin and hack it into a custom plugin, but it failed miserably because of my obvious lack of perl litteracy...
+
+Anyway, I'm sure this is almost nothing...
+
+* `sub date_822 ($) {}`
+* `sub date_3339 ($) {}`
+* and something like `$template->param('cdate_822' => date_822($IkiWiki::pagectime{$page}));`
+
+Anyone can fill the missing lines?
+
+-- [[nil]]
diff --git a/doc/todo/comment_moderation_feed.mdwn b/doc/todo/comment_moderation_feed.mdwn
new file mode 100644 (file)
index 0000000..267706b
--- /dev/null
@@ -0,0 +1,9 @@
+There should be a way to generate a feed that is updated whenever a new
+comment needs moderation. Otherwise, it can be hard to remember to check
+sites, which may rarely get comments.
+
+The feed should not include the comment subject or body, but could mention
+the author. It would be especially handy if it was generated statically.
+One way would be to generate internal pages corresponding to each comment
+that needs moderation; then the feed could be constructed via a usual
+inline.
index 2cef0ee8cd3285f687c52f46b615d3e5aa07157b..e84400c172a3a8635bd7e33178b81c3b750aff06 100644 (file)
@@ -20,4 +20,4 @@ What do you think [[smcv]]? --[[Joey]]
 > are quite low since it modifies the input text and adds a date stamp to
 > it.
 >
-> Anyway, I think it's good, [[[done]] --[[Joey]] 
+> Anyway, I think it's good, [[done]] --[[Joey]] 
diff --git a/doc/todo/double-click_protection_for_form_buttons.mdwn b/doc/todo/double-click_protection_for_form_buttons.mdwn
new file mode 100644 (file)
index 0000000..501be44
--- /dev/null
@@ -0,0 +1,5 @@
+A small piece of JS to prevent double-submitting forms would be quite nice. I seem to have developed a habit of doing this and having to resolve a merge conflict for two initial commits. -- [[Jon]]
+
+> By the time you see that merge conflict, the first commit has
+> already successfully happened, so you can just hit cancel
+> and throw away the second submit. --[[Joey]] 
diff --git a/doc/todo/edittemplate_should_look_in_templates_directory_by_default.mdwn b/doc/todo/edittemplate_should_look_in_templates_directory_by_default.mdwn
new file mode 100644 (file)
index 0000000..4bc10e4
--- /dev/null
@@ -0,0 +1,8 @@
+[[plugins/edittemplate]] looks for the specified template relative to the
+page the directive appears on. Which can be handy, eg, make a
+blog/mytemplate and put the directive on blog, and it will find
+"mytemplate". However, it can also be confusing, since other templates
+always are looked for in `templates/`.
+
+I think it should probably fall back to looking for `templates/$foo`.
+--[[Joey]] 
index 412cb5eba30337f032c3033ffc09237c76757d0e..3b9721d50aac5a95dacd7b1d89f9741c8917e3d9 100644 (file)
                     qr/(^|\/).svn\//, qr/.arch-ids\//, qr/{arch}\//],
            wiki_link_regexp => qr/\[\[(?:([^\]\|]+)\|)?([^\s\]#]+)(?:#([^\s\]]+))?\]\]/,
 
+> Note that the above patch is **completely broken**. 
+> It removes the crucial excludes of all files starting with a dot.
+> The negative regexps for htaccess have no effect, so the whole
+> thing only "works" because it allows *any* file starting with a dot.
+> If you applied this patch to your ikiwiki, you opened a huge security
+> hole. --[[Joey]] 
+
 [[!tag patch patch/core]]
 
 This lets the site administrator have a `.htaccess` file in their underlay
@@ -57,7 +64,17 @@ It should be off by default of course. --Max
 ---
 +1 I want `.htaccess` so I can rewrite some old Wordpress URLs to make feeds work again. --[[hendry]]
 
+> Unless you cannot modify apache's configuration, you do not need htaccess
+> to do that. Apache's documentation recommends against using htaccess
+> unless you're a user who cannot modify the main server configuration.
+> --[[Joey]] 
+
 ---
 +1 for various purposes (but sometimes the filename isn't `.htaccess`, so please make it configurable) --[[schmonz]]
 
 > I've described a workaround for one use case at the [[plugins/rsync]] [[plugins/rsync/discussion]] page. --[[schmonz]]
+
+---
+
+[[done]], you can use the `include` setting to override the default
+excludes now. Please use extreme caution when doing so. --[[Joey]] 
diff --git a/doc/todo/finer_control_over___60__object___47____62__s.mdwn b/doc/todo/finer_control_over___60__object___47____62__s.mdwn
new file mode 100644 (file)
index 0000000..50c4d43
--- /dev/null
@@ -0,0 +1,98 @@
+IIUC, the current version of [HTML::Scrubber][] allows for the `object` tags to be either enabled or disabled entirely.  However, while `object` can be used to add *code* (which is indeed a potential security hole) to a document, reading [Objects, Images, and Applets in HTML documents][objects-html] reveals that the &ldquo;dangerous&rdquo; are not all the `object`s, but rather those having the following attributes:
+
+    classid     %URI;          #IMPLIED  -- identifies an implementation --
+    codebase    %URI;          #IMPLIED  -- base URI for classid, data, archive--
+    codetype    %ContentType;  #IMPLIED  -- content type for code --
+    archive     CDATA          #IMPLIED  -- space-separated list of URIs --
+
+It seems that the following attributes are, OTOH, safe:
+
+    declare     (declare)      #IMPLIED  -- declare but don't instantiate flag --
+    data        %URI;          #IMPLIED  -- reference to object's data --
+    type        %ContentType;  #IMPLIED  -- content type for data --
+    standby     %Text;         #IMPLIED  -- message to show while loading --
+    height      %Length;       #IMPLIED  -- override height --
+    width       %Length;       #IMPLIED  -- override width --
+    usemap      %URI;          #IMPLIED  -- use client-side image map --
+    name        CDATA          #IMPLIED  -- submit as part of form --
+    tabindex    NUMBER         #IMPLIED  -- position in tabbing order --
+
+Should the former attributes be *scrubbed* while the latter left intact, the use of the `object` tag would seemingly become safe.
+
+Note also that allowing `object` (either restricted in such a way or not) automatically solves the [[/todo/svg]] issue.
+
+For Ikiwiki, it may be nice to be able to restrict [URI's][URI] (as required by the `data` and `usemap` attributes) to, say, relative and `data:` (as per [RFC 2397][]) ones as well, though it requires some more consideration.
+
+&mdash;&nbsp;[[Ivan_Shmakov]], 2010-03-12Z.
+
+[[wishlist]]
+
+> SVG can contain embedded javascript.
+
+>> Indeed.
+
+>> So, a more general tool (`XML::Scrubber`?) will be necessary to
+>> refine both [XHTML][] and SVG.
+
+>> &hellip; And to leave [MathML][] as is (?.)
+
+>> &mdash;&nbsp;[[Ivan_Shmakov]], 2010-03-12Z.
+
+> The spec that you link to contains
+> examples of objects that contain python scripts, Microsoft OLE 
+> objects, and Java. And then there's flash. I don't think ikiwiki can
+> assume all the possibilities are handled securely, particularly WRT XSS
+> attacks.
+> --[[Joey]]
+
+>> I've scanned over all the `object` examples in the specification and
+>> all of those that hold references to code (as opposed to data) have a
+>> distinguishing `classid` attribute.
+
+>> While I won't assert that it's impossible to reference code with
+>> `data` (and, thanks to `text/xhtml+xml` and `image/svg+xml`, it is
+>> *not* impossible), throwing away any of the &ldquo;insecure&rdquo;
+>> attributes listed above together with limiting the possible URI's
+>> (i.&nbsp;e., only *local* and certain `data:` ones for `data` and
+>> `usemap`) should make `object` almost as harmless as, say, `img`.
+
+>>> But with local data, one could not embed youtube videos, which surely
+>>> is the most obvious use case?
+
+>>>> Allowing a &ldquo;remote&rdquo; object to render on one's page is a
+     security issue by itself.
+     Though, of course, having an explicit whitelist of URI's may make
+     this issue more tolerable.
+     &mdash;&nbsp;[[Ivan_Shmakov]], 2010-03-12Z.
+
+>>> Note that youtube embedding uses an
+>>> object element with no classid. The swf file is provided via an
+>>> enclosed param element. --[[Joey]]
+
+>>>> I've just checked a random video on YouTube and I see that the
+     `.swf` file is provided via an enclosed `embed` element.  Whether
+     to allow those or not is a different issue.
+     &mdash;&nbsp;[[Ivan_Shmakov]], 2010-03-12Z.
+
+>> (Though it certainly won't solve the [[SVG_problem|/todo/SVG]] being
+>> restricted in such a way.)
+
+>> Of the remaining issues I could only think of recursive
+>> `object` &mdash; the one that references its container document.
+
+>> &mdash;&nbsp;[[Ivan_Shmakov]], 2010-03-12Z.
+
+## See also
+
+* [Objects, Images, and Applets in HTML documents][objects-html]
+* [[plugins/htmlscrubber|/plugins/htmlscrubber]]
+* [[todo/svg|/todo/svg]]
+* [RFC 2397: The &ldquo;data&rdquo; URL scheme. L.&nbsp;Masinter. August 1998.][RFC 2397]
+* [Uniform Resource Identifier &mdash; the free encyclopedia][URI]
+
+[HTML::Scrubber]: http://search.cpan.org/~podmaster/HTML-Scrubber-0.08/Scrubber.pm
+[MathML]: http://en.wikipedia.org/wiki/MathML
+[objects-html]: http://www.w3.org/TR/1999/REC-html401-19991224/struct/objects.html
+[RFC 2397]: http://tools.ietf.org/html/rfc2397
+[URI]: http://en.wikipedia.org/wiki/Uniform_Resource_Identifier
+[XHTML]: http://en.wikipedia.org/wiki/XHTML
index dfb490bc21e18b4f67b7b4b511ddc82d25bd309c..6905d9b4bc3baba28114670f583abdcb1756d29a 100644 (file)
@@ -72,7 +72,7 @@ no determination of uniqueness)
 > GIT_AUTHOR_EMAIL can also be set.
 > 
 > There is one thing yet to be solved, and that is how to tell the
-> difference between a web commit by 'Joey Hess <joey@kitenet.net>',
+> difference between a web commit by 'Joey Hess <joey\@kitenet.net>',
 > and a git commit by the same. I think we do want to differentiate these,
 > and the best way to do it seems to be to add a line to the end of the
 > commit message. Something like: "\n\nWeb-commit: true"
@@ -94,5 +94,5 @@ no determination of uniqueness)
 > * github pushes to twitter ;-)
 > 
 > So while I tried that way at first, I'm now leaning toward encoding the
-> username in the email address. Like "user <user@web>", or
-> "joey <http://joey.kitenet.net/@web>".
+> username in the email address. Like "user <user\@web>", or
+> "joey <http://joey.kitenet.net/\@web>".
index 44f20c8763f030970b67d40a2c8bce3657374186..4f4542be21233eed3ab54a199dcf954674dc4d49 100644 (file)
@@ -1,6 +1,6 @@
 Create some nice(r) stylesheets.
 
 Should be doable w/o touching a single line of code, just
-editing the [[wikitemplates]] and/or editing [[style.css]].
+editing the [[templates]] and/or editing [[style.css]].
 
 [[done]] ([[css_market]] ..)
diff --git a/doc/todo/htpasswd_mirror_of_the_userdb.mdwn b/doc/todo/htpasswd_mirror_of_the_userdb.mdwn
new file mode 100644 (file)
index 0000000..e4a4117
--- /dev/null
@@ -0,0 +1,29 @@
+[[!tag wishlist]]
+
+Ikiwiki is static, so access control for viewing the wiki must be
+implemented on the web server side. Managing wiki users and access
+together, we can currently
+
+* use [[httpauth|plugins/httpauth/]], but some [[passwordauth|plugins/passwordauth]] functionnality [[is missing|todo/httpauth_feature_parity_with_passwordauth/]];
+* use [[passwordauth|plugins/passwordauth]] plus [[an Apache `mod_perl` authentication mechanism|plugins/passwordauth/discussion/]], but this is Apache-centric and enabling `mod_perl` just for auth seems overkill.
+
+Moreover, when ikiwiki is just a part of a wider web project, we may want
+to use the same userdb for the other parts of this project.
+
+I think an ikiwiki plugin which would (re)generate an htpasswd version of
+the user/passwd base (better, two htpasswd files, one with only the wiki
+admins and one with everyone) each time an user is added or modified would
+solve this problem:
+
+* access control can be managed from the web server
+* user management is handled by the passwordauth plugin
+* htpasswd format is understood by various servers (Apache, lighttpd, nginx, ...) and languages commonly used for web development (perl, python, ruby)
+* htpasswd files can be mirrored on other machines when the web site is distributed
+
+-- [[nil]] 
+
+> I think this is a good idea. Although unless the password hashes that
+> are stored in the userdb are compatible with htpasswd hashes, 
+> the htpasswd hashes will need to be stored in the userdb too. Then
+> any userdb change can just regenerate the htpasswd file, dumping out
+> the right kind of hashes. --[[Joey]] 
diff --git a/doc/todo/http_bl_support.mdwn b/doc/todo/http_bl_support.mdwn
new file mode 100644 (file)
index 0000000..f7a46ee
--- /dev/null
@@ -0,0 +1,67 @@
+[Project Honeypot](http://projecthoneypot.org/) has an HTTP:BL API available to subscribed (it's free, accept donations) people/orgs. There's a basic perl package someone wrote, I'm including a copy here.
+
+[from here](http://projecthoneypot.org/board/read.php?f=10&i=112&t=112)
+
+> The [[plugins/blogspam]] service already checks urls against
+> the surbl, and has its own IP blacklist. The best way to
+> support the HTTP:BL may be to add a plugin
+> [there](http://blogspam.repository.steve.org.uk/file/cc858e497cae/server/plugins/).
+> --[[Joey]] 
+
+<pre>
+package Honeypot;
+
+use Socket qw/inet_ntoa/;
+
+my $dns = 'dnsbl.httpbl.org';
+my %types = (
+0      => 'Search Engine',
+1      => 'Suspicious',
+2      => 'Harvester',
+4      => 'Comment Spammer'
+);
+sub query {
+my $key = shift || die 'You need a key for this, you get one at http://www.projecthoneypot.org';
+my $ip = shift || do {
+warn 'no IP for request in Honeypot::query().';
+return;
+};
+
+my @parts = reverse split /\./, $ip;
+my $lookup_name = join'.', $key, @parts, $dns;
+
+my $answer = gethostbyname ($lookup_name);
+return unless $answer;
+$answer = inet_ntoa($answer);
+my(undef, $days, $threat, $type) = split /\./, $answer;
+my @types;
+while(my($bit, $typename) = each %types) {
+push @types, $typename if $bit & $type;
+}
+return {
+days => $days,
+threat => $threat,
+type => join ',', @types
+};
+
+}
+1;
+</pre>
+
+From the page:
+
+> The usage is simple:
+
+> use Honeypot;
+> my $key = 'XXXXXXX'; # your key
+> my $ip = '....'; the IP you want to check
+> my $q = Honeypot::query($key, $ip);
+
+> use Data::Dumper;
+> print Dumper $q;
+
+Any chance of having this as a plugin?
+
+I could give it a go, too. Would be fun to try my hand at Perl. --[[simonraven]]
+
+[[!tag wishlist]]
diff --git a/doc/todo/link_plugin_perhaps_too_general__63__.mdwn b/doc/todo/link_plugin_perhaps_too_general__63__.mdwn
new file mode 100644 (file)
index 0000000..8a5fd50
--- /dev/null
@@ -0,0 +1,25 @@
+[[!tag wishlist blue-sky]]
+(This isn't important to me - I don't use MediaWiki or Creole syntax myself -
+but just thinking out loud...)
+
+The [[ikiwiki/wikilink]] syntax IkiWiki uses sometimes conflicts with page
+languages' syntax (notably, [[plugins/contrib/MediaWiki]] and [[plugins/Creole]]
+want their wikilinks the other way round, like
+`\[[plugins/write|how to write a plugin]]`). It would be nice if there was
+some way for page language plugins to opt in/out of the normal wiki link
+processing - then MediaWiki and Creole could have their own `linkify` hook
+that was only active for *their* page types, and used the appropriate
+syntax.
+
+In [[todo/matching_different_kinds_of_links]] I wondered about adding a
+`\[[!typedlink to="foo" type="bar"]]` directive. This made me wonder whether
+a core `\[[!link]]` directive would be useful; this could be a fallback for
+page types where a normal wikilink can't be done for whatever reason, and
+could also provide extension points more easily than WikiLinks' special
+syntax with extra punctuation, which doesn't really scale?
+
+Straw-man:
+
+    \[[!link to="ikiwiki/wikilink" desc="WikiLinks"]]
+
+--[[smcv]]
diff --git a/doc/todo/mark_edit_as_trivial__44___identify__47__filter_on_trivial_changes.mdwn b/doc/todo/mark_edit_as_trivial__44___identify__47__filter_on_trivial_changes.mdwn
new file mode 100644 (file)
index 0000000..2b2b024
--- /dev/null
@@ -0,0 +1,11 @@
+One feature of mediawiki which I quite like is the ability to mark a change as 'minor', or 'trivial'. This can then be used to filter the 'recentchanges' page, to only show substantial edits.
+
+The utility of this depends entirely on whether the editors use it properly.
+
+I currently use an inline on the front page of my personal homepage to show the most recent pages (by creation date) within a subsection of my site (a blog). Blog posts are rarely modified much after they are 'created' (or published - I bodge the creation time via meta when I publish a post. It might sit in draft form indefinitely), so this effectively shows only non-trivial changes.
+
+I would like to have a short list of the most recent modifications to the site on the front page. I therefore want to sort by modified time rather than creation time, but exclude edits that I self-identify as minor. I also only want to take a short number of items, the top 5, and display only their titles (which may be derived from filename, or set via meta again).
+
+I'm still thinking through how this might be achieved in an ikiwiki-suitable fashion, but I think I need a scheme to identify certain edits as trivial. This would have to work via web edits (easier: could add a check box to the edit form) and plain changes in the VCS (harder: scan for keywords in a commit message? in a VCS-agnostic fashion?)
+
+[[!tag wishlist]]
index 26c5a072bf3cb205b238a4e6fd0882583a0b7609..da3ea49f6e99ad8d2d807b8a06bc9fbf6424c027 100644 (file)
@@ -36,6 +36,11 @@ Besides pagespecs, the `rel=` attribute could be used for styles. --Ivan Z.
 > normal links.) Might be better to go ahead and add the variable to
 > core though. --[[Joey]] 
 
+>> I've implemented this with the data structure you suggested, except that
+>> I called it `%typedlinks` instead of `%linktype` (it seemed to make more
+>> sense that way). I also ported `tag` to it, and added a `tagged_is_strict`
+>> config option. See below! --[[smcv]]
+
 I saw somewhere else here some suggestions for the wiki-syntax for specifying the relation name of a link. One more suggestion---[the syntax used in Semantic MediaWiki](http://en.wikipedia.org/wiki/Semantic_MediaWiki#Basic_usage), like this:
 
 <pre>
@@ -45,3 +50,147 @@ I saw somewhere else here some suggestions for the wiki-syntax for specifying th
 So a part of the effect of [[`\[[!taglink TAG\]\]`|plugins/tag]] could be represented as something like `\[[tag::TAG]]` or (more understandable relation name in what concerns the direction) `\[[tagged::TAG]]`.
 
 I don't have any opinion on this syntax (whether it's good or not)...--Ivan Z.
+
+-------
+
+>> [[!template id=gitbranch author="[[Simon_McVittie|smcv]]" branch=smcv/ready/link-types]]
+>> [[!tag patch]]
+
+## Documentation for smcv's branch
+
+### added to [[ikiwiki/pagespec]]
+
+* "`typedlink(type glob)`" - matches pages that link to a given page (or glob)
+  with a given link type. Plugins can create links with a specific type:
+  for instance, the tag plugin creates links of type `tag`.
+
+### added to [[plugins/tag]]
+
+If the `tagged_is_strict` config option is set, `tagged()` will only match
+tags explicitly set with [[ikiwiki/directive/tag]] or
+[[ikiwiki/directive/taglink]]; if not (the default), it will also match
+any other [[WikiLinks|ikiwiki/WikiLink]] to the tag page.
+
+### added to [[plugins/write]]
+
+#### `%typedlinks`
+
+The `%typedlinks` hash records links of specific types. Do not modify this
+hash directly; call `add_link()`. The keys are page names, and the values
+are hash references. In each page's hash reference, the keys are link types
+defined by plugins, and the values are hash references with link targets
+as keys, and 1 as a dummy value, something like this:
+
+       $typedlinks{"foo"} = {
+               tag => { short_word => 1, metasyntactic_variable => 1 },
+               next_page => { bar => 1 },
+       };
+
+Ordinary [[WikiLinks|ikiwiki/WikiLink]] appear in `%links`, but not in
+`%typedlinks`.
+
+#### `add_link($$;$)`
+ This adds a link to `%links`, ensuring that duplicate links are not
+ added. Pass it the page that contains the link, and the link text.
+An optional third parameter sets the link type (`undef` produces an ordinary
+[[ikiwiki/WikiLink]]).
+
+## Review
+
+Some code refers to `oldtypedlinks`, and other to `oldlinktypes`. --[[Joey]]
+
+> Oops, I'll fix that. That must mean missing test coverage, too :-(
+> --s
+
+>> A test suite for the dependency resolver *would* be nice. --[[Joey]]
+
+>>> Bug fixed, I think. A test suite for the dependency resolver seems
+>>> more ambitious than I want to get into right now, but I added a
+>>> unit test for this part of it... --s
+
+I'm curious what your reasoning was for adding a new variable
+rather than using `pagestate`. Was it only because you needed
+the `old` version to detect change, or was there other complexity?
+--J
+
+> You seemed to be more in favour of adding it to the core in
+> your proposal above, so I assumed that'd be more likely to be
+> accepted :-) I don't mind one way or the other - `%typedlinks`
+> costs one core variable, but saves one level of hash nesting. If
+> you're not sure either, then I think the decision should come down
+> to which one is easier to document clearly - I'm still unhappy with
+> my docs for `%typedlinks`, so I'll try to write docs for it as
+> `pagestate` and see if they work any better. --s
+
+>> On reflection, I don't think it's any better as a pagestate, and
+>> the contents of pagestates (so far) aren't documented for other
+>> plugins' consumption, so I'm inclined to leave it as-is, unless
+>> you want to veto that. Loose rationale: it needs special handling
+>> in the core to be a dependency type (I re-used the existing link
+>> type), it's API beyond a single plugin, and it's really part of
+>> the core parallel to pagestate rather than being tied to a
+>> specific plugin. Also, I'd need to special-case it to have
+>> ikiwiki not delete it from the index, unless I introduced a
+>> dummy typedlinks plugin (or just hook) that did nothing... --s
+
+I have not convinced myself this is a real problem, but..
+If a page has a typed link, there seems to be no way to tell
+if it also has a separate, regular link. `add_link` will add
+to `@links` when adding a typed, or untyped link. If only untyped
+links were recorded there, one could tell the difference. But then
+typed links would not show up at all in eg, a linkmap,
+unless it was changed to check for typed links too.
+(Or, regular links could be recorded in typedlinks too,
+with a empty type. (Bloaty.)) --J
+
+> I think I like the semantics as-is - I can't think of any
+> reason why you'd want to ask the question "does A link to B,
+> not counting tags and other typed links?". A typed link is
+> still a link, in my mind at least. --s
+
+>> Me neither, let's not worry about it. --[[Joey]] 
+
+I suspect we could get away without having `tagged_is_strict`
+without too much transitional trouble. --[[Joey]]
+
+> If you think so, I can delete about 5 LoC. I don't particularly
+> care either way; [[Jon]] expressed concern about people relying
+> on the current semantics, on one of the pages requesting this
+> change. --s
+
+>> Removed in a newer version of the branch. --s
+
+I might have been wrong to introduce `typedlink(tag foo)`. It's not
+very user-friendly, and is more useful as a backend for other plugins
+that as a feature in its own right - any plugin introducing a link
+type will probably also want to have its own preprocessor directive
+to set that link type, and its own pagespec function to match it.
+I wonder whether to make a `typedlink` plugin that has the typedlink
+pagespec match function and a new `\[[!typedlink to="foo" type="bar"]]`
+though... --[[smcv]]
+
+> I agree, per-type matchers are more friendly and I'm not enamored of the
+> multi-parameter pagespec syntax. --[[Joey]]
+
+>> Removed in a newer version of the branch. I re-introduced it as a
+>> plugin in `smcv/typedlink`, but I don't think we really need it. --s
+
+----
+
+I am ready to merge this, but I noticed one problem -- since `match_tagged`
+now only matches pages with the tag linktype, a wiki will need to be
+rebuilt on upgrade in order to get the linktype of existing tags in it
+recorded. So there needs to be a NEWS item about this and
+the postinst modified to force the rebuild.
+
+> Done, although you'll need to plug in an appropriate version number when
+> you release it. Is there a distinctive reminder string you grep for
+> during releases? I've used `UNRELEASED` for now. --[[smcv]]
+
+Also, the ready branch adds `typedlink()` to [[ikiwiki/pagespec]],
+but you removed that feature as documented above.
+--[[Joey]]
+
+> [[Done]]. --s
index e71c8106adc832fb30203868174cd857a79450e3..de1f148e5a030763d1c65b281f6397252aafa206 100644 (file)
@@ -119,3 +119,11 @@ I have a few notes on mercurial usage after trying it out for a while:
 >> I think the ideal solution would be to build `$destdir/recentchanges/*` directly from the output of `hg log`. --[[buo]]
 
 >>>> That would be 100 times as slow, so I chose not to do that. --[[Joey]]
+
+>>>> Since this is confusing people, allow me to clarify: Ikiwiki's
+>>>> recentchanges generation pulls log information directly out of the VCS as
+>>>> needed. It caches it in recentchanges/* in the `scrdir`. These cache
+>>>> files need not be preserved, should never be checked into VCS, and if
+>>>> you want to you can configure your VCSignore file to ignore them,
+>>>> just as you can configure it to ignore the `.ikiwiki` directory in the
+>>>> `scrdir`. --[[Joey]] 
index bc8bc08097591380e0b5256a27d8c8afb3541f3a..414476bd7f4ffbfd4d1655b64405ce6ab6a67269 100644 (file)
@@ -16,3 +16,8 @@ logical first step towards doing comment-like things with inlined pages).
 > Perhaps what we need is a `postform` plugin/directive that inline depends
 > on (automatically enables); its preprocess method could automatically be
 > invoked from preprocess_inline when needed. --[[smcv]]
+
+>> I've been looking at this stuff again. I think you are right, this would
+>> be the right approach. The comments plugin could use it similarly, allowing
+>> sites which desire it to have an inline comment submission form on all
+>> pages with comments enabled. I'm going to take a look. -- [[Jon]]
index c09a9595f86069aa7055079edabaac6b7f9b30a8..6a474b4f3e6671b0b7b4ae12b1cdfc52bba6dd01 100644 (file)
@@ -11,3 +11,63 @@ ought to do the trick.
 > global dir when it cannot find a template. For me, this is good enough.
 > And it is even documented in the man page. Sigh. I guess this could be 
 > considered [[done]].  
+
+I have a use case for this, a site composed of blogs and wikis, templates divided in three categories : common, blog and wiki. The only solution I found is maintaining hard links, being able to have multiple template dirs would obviously be better. -- Changaco
+
+> [[plugins/underlay]] used to allow adding extra templatedirs, but Joey
+> removed that functionality when he made templates search the wiki's
+> own `templates` directory.
+>
+> You can get a 3-level hierarchy like this:
+>
+> * instance-specific overrides: $srcdir/templates
+> * common to the entire site: a directory that is the value of all
+>   instances' `templatedir` parameters
+> * common to every ikiwiki in the world: /usr/share/ikiwiki/templates
+>   (implicitly searched)
+>
+> (by "instance" I mean an instance of ikiwiki - a .setup file, basically.)
+>
+> For a more complex hierarchy you'd need the old [[plugins/underlay]]
+> functionality, i.e. you'd need to (ask Joey to) revert the patch that
+> removed it. For instance, if anyone has a hierarchy like this, then
+> they need the old functionality back in order to split the template
+> search path for the things marked `(???)`:
+>
+>     every ikiwiki in the world (/usr/share/ikiwiki/templates)
+>     \--- your site (???)
+>         \--- your blogs (???)
+>              \--- travel blog ($srcdir/templates)
+>              \--- code blog ($srcdir/templates)
+>         \--- your wikis (???)
+>              \--- travel wiki ($srcdir/templates)
+>              \--- code wiki ($srcdir/templates)
+>
+> This looks pretty hypothetical to me, though...
+> --[[smcv]]
+
+>> The reason I removed it is because the same functionality of having
+>> multiple template directories is still present. Just put them in 
+>> the templates/ subdirectory of multiple underlay directories instead.
+>> --[[Joey]]
+
+>>>Thanks, I didn't realize this was possible. Problem solved. -- Changaco
+
+>>>> We can consider this [[done]], then. For reference, the solution
+>>>> to the hierarchy I mentioned above would be:
+>>>>
+>>>>     all your sites have $your_underlay as an underlay
+>>>>
+>>>>     the blogs and wikis all have $blog_underlay or $wiki_underlay
+>>>>     (as appropriate) as a higher priority underlay
+>>>>
+>>>>     every ikiwiki in the world (/usr/share/ikiwiki/templates)
+>>>>     \--- your site ($your_underlay/templates, or templatedir)
+>>>>         \--- your blogs ($blog_underlay/templates)
+>>>>              \--- travel blog ($srcdir/templates)
+>>>>              \--- code blog ($srcdir/templates)
+>>>>         \--- your wikis ($wiki_underlay/templates)
+>>>>              \--- travel wiki ($srcdir/templates)
+>>>>              \--- code wiki ($srcdir/templates)
+>>>>
+>>>> --[[smcv]]
index 72783c556d3ddcaeeb6dfa616de918cefdcd312e..30fb8d6ee74b1cbfb56f1fcceb6cbf5b71bcedef 100644 (file)
@@ -1,4 +1,4 @@
-> Another useful feature might be to be able to choose a different [[template|wikitemplates]]
+> Another useful feature might be to be able to choose a different [[template|templates]]
 > file for some pages; [[blog]] pages would use a template different from the
 > home page, even if both are managed in the same repository, etc.
 
index 8b2d0082e6de182dff63286afdc8c49eb5ae7aee..6a318c4c0c14895474b77eac197986086c8605ed 100644 (file)
@@ -7,3 +7,7 @@ So I suggest an ikiwiki configuration like:
      users => ["*.webvm.net"],
 
 Would only allow edits from openIDs of that form.
+
+> This kind of thing can be [[done]] now: --[[Joey]] 
+> 
+>      locked_pages => "* and !user(http://*.webvm.net/)"
diff --git a/doc/todo/optional_underlaydir_prefix.mdwn b/doc/todo/optional_underlaydir_prefix.mdwn
new file mode 100644 (file)
index 0000000..06900a9
--- /dev/null
@@ -0,0 +1,46 @@
+For security reasons, symlinks are disabled in IkiWiki.  That's fair enough, but that means that some problems, which one could otherwise solve by using a symlink, cannot be solved. The specfic problem in this case is that all underlays are placed at the root of the wiki, when it could be more convenient to place some underlays in specific sub-directories.
+
+Use-case 1 (to keep things tidy):
+
+Currently IkiWiki has some javascript files in `underlays/javascript`; that directory is given as one of the underlay directories.  Thus, all the javascript files appear in the root of the generated site.  But it would be tidier if one could say "put the contents of *this* underlaydir under the `js` directory".
+
+> Of course, this could be accomplished, if we wanted to, by moving the
+> files to `underlays/javascript/js`. --[[Joey]] 
+
+Use-case 2 (a read-only external dir):
+
+Suppose I want to include a subset of `/usr/local/share/docs` on my wiki, say the docs about `foo`.  But I want them to be under the `docs/foo` sub-directory on the generated site.  Currently I can't do that.  If I give `/usr/local/share/docs/foo` as an underlaydir, then the contents of that will be in the root of the site, rather than under `docs/foo`.  And if I give `/usr/local/share/docs` as an underlaydir, then the contents of the `foo` dir will be under `foo`, but it will also include every other thing in `/usr/local/share/docs`.
+
+Since we can't use symlinks in an underlay dir to link to these directories, then perhaps one could give a specific underlay dir a specific prefix, which defines the sub-directory that the underlay should appear in.
+
+I'm not sure how this would be implemented, but I guess it could be configured something like this:
+
+    prefixed_underlay => {
+         'js' => '/usr/local/share/ikiwiki/javascript',
+         'docs/foo' => '/usr/local/share/docs/foo',
+    }
+
+> So, let me review why symlinks are an issue. For normal, non-underlay
+> pages, users who do not have filesystem access to the server may have 
+> commit access, and so could commit eg, a symlink to `/etc/passwd` (or
+> to `/` !). The guards are there to prevent ikiwiki either exposing the
+> symlink target's contents, or potentially overwriting it.
+> 
+> Is this a concern for underlays? Most of the time, certianly not;
+> the underlay tends to be something only the site admin controls.
+> Not all the security checks that are done on the srcdir are done
+> on the underlays, either. Most checks done on files in the underlay
+> are only done because the same code handles srcdir files. The one
+> exception is the test that skips processing symlinks in the underlay dir.
+> (But note that the underlay directory can be a symlinkt to elsewhere
+> which the srcdir, by default, cannot.)
+> 
+> So, one way to approach this is to make ikiwiki follow directory symlinks
+> inside the underlay directory. Just a matter of passing `follow => 1` to
+> find. (This would still not allow individual files to be symlinks, because
+> `readfile` does not allow reading symlinks. But I don't see much need
+> for that.) --[[Joey]]
+
+>> If you think that enabling symlinks in underlay directories wouldn't be a security issue, then I'm all for it!  That would be much simpler to implement, I'm sure. --[[KathrynAndersen]]
+
+[[!taglink wishlist]]
index 204c48cd7d5acf18ac5ed5388c367d0c6c2f97f6..48ed744b165c045aee15635de6465ea05f9ef648 100644 (file)
@@ -29,6 +29,7 @@ It's appealing for a lot of reasons, including:
     edit in html editors currently.
   - This would be a chance to make WikiLinks with link texts read
     "the right way round" (ie, vaguely wiki creole compatably).
+    *[See also [[todo/link_plugin_perhaps_too_general?]] --[[smcv]]]*
   - The data structures would probably be quite different.
   - I might want to drop a lot of the command-line flags, either
     requiring a setup file be used for those things, or leaving the
diff --git a/doc/todo/salmon_protocol_for_comment_sharing.mdwn b/doc/todo/salmon_protocol_for_comment_sharing.mdwn
new file mode 100644 (file)
index 0000000..1e56b0a
--- /dev/null
@@ -0,0 +1,21 @@
+The <a href="http://www.salmon-protocol.org/home">Salmon protocol</a>
+provides for aggregating comments across sites.  If a site that syndicates
+a feed receives a comment on an item in that feed, it can re-post the
+comment to the original source.
+
+> Ikiwiki does not allow comments to be posted on items it aggregates.
+> So salmon protocol support would only need to handle the comment
+> receiving side of the protocol.
+> 
+> The current draft protocol document confuses me when it starts talking
+> about using OAuth in the abuse prevention section, since their example
+> does not show use of OAuth, and it's not at all clear to me where the
+> OAuth relationship between aggregator and original source is supposed
+> to come from.
+> 
+> Their security model, which goes on to include Webfinger,
+> thirdparty validation services, XRD, and Magic Signatures, looks sorta
+> like they kept throwing technology,  at it, hoping something will stick. :-P
+> --[[Joey]]
+
+[[!tag wishlist]]
diff --git a/doc/todo/smarter_sorting.mdwn b/doc/todo/smarter_sorting.mdwn
new file mode 100644 (file)
index 0000000..901e143
--- /dev/null
@@ -0,0 +1,141 @@
+I benchmarked a build of a large wiki (my home wiki), and it was spending
+quite a lot of time sorting; `CORE::sort` was called only 1138 times, but
+still flagged as the #1 time sink. (I'm not sure I trust NYTProf fully
+about that FWIW, since it also said 27238263 calls to `cmp_age` were
+the #3 timesink, and I suspect it may not entirely accurately measure
+the overhead of so many short function calls.)
+
+`pagespec_match_list` currently always sorts *all* pages first, and then
+finds the top M that match the pagespec. That's innefficient when M is
+small (as for example in a typical blog, where only 20 posts are shown,
+out of maybe thousands).
+
+As [[smcv]] noted, It could be flipped, so the pagespec is applied first,
+and then sort the smaller matching set. But, checking pagespecs is likely
+more expensive than sorting. (Also, influence calculation complicates
+doing that.)
+
+Another option, when there is a limit on M pages to return, might be to
+cull the M top pages without sorting the rest.
+
+> The patch below implements this.
+> 
+> But, I have not thought enough about influence calculation.
+> I need to figure out which pagespec matches influences need to be
+> accumulated for in order to determine all possible influences of a
+> pagespec are known.
+> 
+> The old code accumulates influences from matching all successful pages
+> up to the num cutoff, as well as influences from an arbitrary (sometimes
+> zero) number of failed matches. New code does not accumulate influences
+> from all the top successful matches, only an arbitrary group of
+> successes and some failures.
+> 
+> Also, by the time I finished this, it was not measuarably faster than 
+> the old method. At least not with a few thousand pages; it
+> might be worth revisiting this sometime for many more pages? [[done]]
+> --[[Joey]] 
+
+<pre>
+diff --git a/IkiWiki.pm b/IkiWiki.pm
+index 1730e47..bc8b23d 100644
+--- a/IkiWiki.pm
++++ b/IkiWiki.pm
+@@ -2122,36 +2122,54 @@ sub pagespec_match_list ($$;@) {
+       my $num=$params{num};
+       delete @params{qw{num deptype reverse sort filter list}};
+       
+-      # when only the top matches will be returned, it's efficient to
+-      # sort before matching to pagespec,
+-      if (defined $num && defined $sort) {
+-              @candidates=IkiWiki::SortSpec::sort_pages(
+-                      $sort, @candidates);
+-      }
+-      
++      # Find the first num matches (or all), before sorting.
+       my @matches;
+-      my $firstfail;
+       my $count=0;
+       my $accum=IkiWiki::SuccessReason->new();
+-      foreach my $p (@candidates) {
+-              my $r=$sub->($p, %params, location => $page);
++      my $i;
++      for ($i=0; $i < @candidates; $i++) {
++              my $r=$sub->($candidates[$i], %params, location => $page);
+               error(sprintf(gettext("cannot match pages: %s"), $r))
+                       if $r->isa("IkiWiki::ErrorReason");
+               $accum |= $r;
+               if ($r) {
+-                      push @matches, $p;
++                      push @matches, $candidates[$i];
+                       last if defined $num && ++$count == $num;
+               }
+       }
++      # We have num natches, but they may not be the best.
++      # Efficiently find and add the rest, without sorting the full list of
++      # candidates.
++      if (defined $num && defined $sort) {
++              @matches=IkiWiki::SortSpec::sort_pages($sort, @matches);
++
++              for ($i++; $i < @candidates; $i++) {
++                      # Comparing candidate with lowest match is cheaper,
++                      # so it's done before testing against pagespec.
++                      if (IkiWiki::SortSpec::cmptwo($candidates[$i], $matches[-1], $sort) < 0 &&
++                          $sub->($candidates[$i], %params, location => $page)
++                      ) {
++                              # this could be done less expensively
++                              # using a binary search
++                              for (my $j=0; $j < @matches; $j++) {
++                                      if (IkiWiki::SortSpec::cmptwo($candidates[$i], $matches[$j], $sort) < 0) {
++                                              splice @matches, $j, $#matches-$j+1, $candidates[$i],
++                                                      @matches[$j..$#matches-1];
++                                              last;
++                                      }
++                              }
++                      }
++              }
++      }
++
+       # Add simple dependencies for accumulated influences.
+-      my $i=$accum->influences;
+-      foreach my $k (keys %$i) {
+-              $depends_simple{$page}{lc $k} |= $i->{$k};
++      my $inf=$accum->influences;
++      foreach my $k (keys %$inf) {
++              $depends_simple{$page}{lc $k} |= $inf->{$k};
+       }
+-      # when all matches will be returned, it's efficient to
+-      # sort after matching
++      # Sort if we didn't already.
+       if (! defined $num && defined $sort) {
+               return IkiWiki::SortSpec::sort_pages(
+                       $sort, @matches);
+@@ -2455,6 +2473,12 @@ sub sort_pages {
+       sort $f @_
+ }
++sub cmptwo {
++      $a=$_[0];
++      $b=$_[1];
++      $_[2]->();
++}
++
+ sub cmp_title {
+       IkiWiki::pagetitle(IkiWiki::basename($a))
+       cmp
+</pre>
+
+This would be bad when M is very large, and particularly, of course, when
+there is no limit and all pages are being matched on. (For example, an
+archive page shows all pages that match a pagespec specifying a creation
+date range.) Well, in this case, it *does* make sense to flip it, limit by
+pagespe first, and do a (quick)sort second. (No influence complications,
+either.)
+
+> Flipping when there's no limit implemented, and it knocked 1/3 off
+> the rebuild time of my blog's archive pages. --[[Joey]] 
+
+Adding these special cases will be more complicated, but I think the best
+of both worlds. --[[Joey]]
index da9da9663e2163b13e1d74f1333ee05316725ca3..9f21fab7fa6488b53cb0e5f8b8d918724bd6e475 100644 (file)
@@ -253,6 +253,9 @@ in a large number of other cases.
 > dependencies between bugs from arbitrary links.
 >> This issue (the need for distinguished kinds of links) has also been brought up in other discussions: [[tracking_bugs_with_dependencies#another_kind_of_links]] (deps vs. links) and [[tag_pagespec_function]] (tags vs. links). --Ivan Z.
 
+>>> And multiple link types are now supported; plugins can set the link
+>>> type when registering a link, and pagespec functions can match on them. --[[Joey]] 
+
 ----
 
     #!/usr/bin/perl
index 0a15af4cd66d0171ebe2b63ec269e6f4e4f1c00e..274ebf3e3402bbaa9ba50c408f56a8330a724ca3 100644 (file)
@@ -3,6 +3,7 @@ We should support SVG.  In particular:
 * We could support rendering SVGs to PNGs when compiling the wiki.  Not all browsers support SVG yet.
 
 * We could support editing SVGs via the web interface.  SVG can contain unsafe content such as scripting, so we would need to whitelist safe markup.
+  * I am interested in seeing [svg-edit](http://code.google.com/p/svg-edit/) integrated -- [[EricDrechsel]]
 
 --[[JoshTriplett]]
 
@@ -56,3 +57,21 @@ in the trunk if other people think it's useful.
 
 [htmlscrubber.pm]:http://xbeta.org/gitweb/?p=xbeta/ikiwiki.git;a=blob;f=IkiWiki/Plugin/htmlscrubber.pm;h=3c0ddc8f25bd8cb863634a9d54b40e299e60f7df;hb=fe333c8e5b4a5f374a059596ee698dacd755182d
 [diff]: http://xbeta.org/gitweb/?p=xbeta/ikiwiki.git;a=blobdiff;f=IkiWiki/Plugin/htmlscrubber.pm;h=3c0ddc8f25bd8cb863634a9d54b40e299e60f7df;hp=3bdaccea119ec0e1b289a0da2f6d90e2219b8d66;hb=fe333c8e5b4a5f374a059596ee698dacd755182d;hpb=be0b4f603f918444b906e42825908ddac78b7073
+
+> Unfortuantly these links are broken. --[[Joey]]
+
+* * *
+
+Actually, there's a way to embed SVG into MarkDown sources using the [data: URI scheme][rfc2397], [like this](data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/Pgo8c3ZnIHdpZHRoPSIxOTIiIGhlaWdodD0iMTkyIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KIDwhLS0gQ3JlYXRlZCB3aXRoIFNWRy1lZGl0IC0gaHR0cDovL3N2Zy1lZGl0Lmdvb2dsZWNvZGUuY29tLyAtLT4KIDx0aXRsZT5IZWxsbywgd29ybGQhPC90aXRsZT4KIDxnPgogIDx0aXRsZT5MYXllciAxPC90aXRsZT4KICA8ZyB0cmFuc2Zvcm09InJvdGF0ZSgtNDUsIDk3LjY3MTksIDk3LjY2OCkiIGlkPSJzdmdfNyI+CiAgIDxyZWN0IHN0cm9rZS13aWR0aD0iNSIgc3Ryb2tlPSIjMDAwMDAwIiBmaWxsPSIjRkYwMDAwIiBpZD0ic3ZnXzUiIGhlaWdodD0iNTYuMDAwMDAzIiB3aWR0aD0iMTc1IiB5PSI2OS42Njc5NjkiIHg9IjEwLjE3MTg3NSIvPgogICA8dGV4dCB4bWw6c3BhY2U9InByZXNlcnZlIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LWZhbWlseT0ic2VyaWYiIGZvbnQtc2l6ZT0iMjQiIHN0cm9rZS13aWR0aD0iMCIgc3Ryb2tlPSIjMDAwMDAwIiBmaWxsPSIjZmZmZjAwIiBpZD0ic3ZnXzYiIHk9IjEwNS42NjgiIHg9Ijk5LjY3MTkiPkhlbGxvLCB3b3JsZCE8L3RleHQ+CiAgPC9nPgogPC9nPgo8L3N2Zz4=).
+Of course, this way to display an image one needs to click a link, but it may be considered a feature.
+&mdash;&nbsp;[[Ivan_Shmakov]], 2010-03-12Z.
+
+[rfc2397]: http://tools.ietf.org/html/rfc2397
+
+> You can do the same with img src actually.
+> 
+> If svg markup allows unsafe elements (ie, javascript),
+> which it appears to, 
+> then this is a security hole, and the htmlscrubber
+> needs to lock it down more. Darn, now I have to spend my afternoon making
+> security releases! --[[Joey]] 
index 5f3ece29094c8cb2b49e48f0d130946c234c4b2b..456dadad08be2de7c02a3ac6aad6e1efd0dee548 100644 (file)
@@ -81,6 +81,9 @@ I like the idea of [[tips/integrated_issue_tracking_with_ikiwiki]], and I do so
 
 >> I saw that this issue is targeted at by the work on [[structured page data#another_kind_of_links]]. --Ivan Z.
 
+>>> It's fixed now; links can have a type, such as "tag", or "dependency", 
+>>> and pagespecs can match links of a given typo. --[[Joey]] 
+
 Okie - I've had a quick attempt at this.  Initial patch attached.  This one doesn't quite work.
 And there is still a lot of debugging stuff in there.
 
diff --git a/doc/todo/two-way_convert_of_wikis.mdwn b/doc/todo/two-way_convert_of_wikis.mdwn
new file mode 100644 (file)
index 0000000..61f02a3
--- /dev/null
@@ -0,0 +1,15 @@
+
+[[!tag wishlist]]
+
+Ok, the vision is this: Some of you will know git-svn. I want something like
+git-svn,, but for wikis. I want to be able to do the following:
+
+1. Convert a moinmoin (or whatever) wiki to a local ikiwiki on my laptop.
+2. Edit my local copy (offline).
+3. Preview the changes with my local ikiwki installation + browser.
+4. Push the changes back to moinmoin (or whatever) wiki.
+
+I know, I know, ikiwiki wasn't designed for that, but it would be really cool,
+and useful and people ask for that kind of thing too.
+
+--[[David_Riebenbauer]]
diff --git a/doc/todo/user-defined_templates_outside_the_wiki.mdwn b/doc/todo/user-defined_templates_outside_the_wiki.mdwn
new file mode 100644 (file)
index 0000000..1d72aa6
--- /dev/null
@@ -0,0 +1,10 @@
+[[!tag wishlist]]
+
+The [[plugins/contrib/ftemplate]] plugin looks for templates inside the wiki
+source, but also looks in the system templates directory (the one with
+`page.tmpl`). This means the wiki admin can provide templates that can be
+invoked via `\[[!template]]`, but don't have to "work" as wiki pages in their
+own right. I think the normal [[plugins/template]] plugin could benefit from
+this functionality.
+
+[[done]] --[[Joey]] 
diff --git a/doc/todo/wrapperuser.mdwn b/doc/todo/wrapperuser.mdwn
new file mode 100644 (file)
index 0000000..4c42b04
--- /dev/null
@@ -0,0 +1,7 @@
+ikiwiki's .setup file can specify wrappergroup, and ikiwiki will set the group
+of the wrappers accordingly.  Having had people encounter difficulty before
+when trying to do the same thing with users (for instance, making all wrappers
+6755 ikiwiki:ikiwiki), I think it would help to have "wrapperuser".  This could
+only actually take effect if building the wrappers as root (not really the best
+plan), but ikiwiki could at least warn if wrapperuser does not match the user
+the wrapper will end up with.
index e4808d4c256dc6a6d9472dcca21b9c623f01a71f..2f87d60d5080a925ec8b4f98f3a992a3b217a192 100644 (file)
@@ -50,6 +50,14 @@ These options control the mode that ikiwiki operates in.
   If used with --setup --refresh, this makes it also update any configured
   wrappers.
 
+* --clean
+
+  This makes ikiwiki clean up by removing any files it denerated in the 
+  `destination` directory, as well as any configured wrappers, and the
+  `.ikiwiki` state directory. This is mostly useful if you're running
+  ikiwiki in a Makefile to build documentation and want a corresponding
+  `clean` target.
+
 * --cgi
 
   Enable [[CGI]] mode. In cgi mode ikiwiki runs as a cgi script, and
@@ -112,10 +120,11 @@ also be configured using a setup file.
 
 * --templatedir dir
 
-  Specify the directory that the page [[templates|wikitemplates]] are stored in.
+  Specify the directory that [[templates|templates]] are stored in.
   Default is `/usr/share/ikiwiki/templates`, or another location as configured at
   build time. If the templatedir is changed, missing templates will still
-  be searched for in the default location as a fallback.
+  be searched for in the default location as a fallback. Templates can also be
+  placed in the "templates/" subdirectory of the srcdir.
 
   Note that if you choose to copy and modify ikiwiki's templates, you will need
   to be careful to keep them up to date when upgrading to new versions of
@@ -226,6 +235,12 @@ also be configured using a setup file.
   Specifies a rexexp of source files to exclude from processing.
   May be specified multiple times to add to exclude list.
 
+* --include regexp
+
+  Specifies a rexexp of source files, that would normally be excluded,
+  but that you wish to include in processing.
+  May be specified multiple times to add to include list.
+
 * --adminuser name
 
   Specifies a username of a user (or, if openid is enabled, an openid) 
@@ -306,20 +321,22 @@ also be configured using a setup file.
   intercepted. If you enable this option then you must run at least the 
   CGI portion of ikiwiki over SSL.
 
-* --getctime
+* --gettime, --no-gettime
 
-  Pull creation time for each new page out of the revision control
-  system. This rarely used option provides a way to get the real creation
-  times of items in weblogs, such as when building a wiki from a new
-  VCS checkout. It is unoptimised and quite slow. It is best used
-  with --rebuild, to force ikiwiki to get the ctime for all pages.
+  Extract creation and modification times for each new page from the
+  the revision control's log. This is done automatically when building a
+  wiki for the first time, so you normally do not need to use this option.
 
 * --set var=value
   
   This allows setting an arbitrary configuration variable, the same as if it
-  were set via a setup file. Since most options can be configured
-  using command-line switches, you will rarely need to use this, but it can be
-  useful for the odd option that lacks a command-line switch.
+  were set via a setup file. Since most commonly used options can be
+  configured using command-line switches, you will rarely need to use this.
+
+* --set-yaml var=value
+
+  This is like --set, but it allows setting configuration variables that
+  use complex data structures, by passing in a YAML document.
 
 # EXAMPLES
 
diff --git a/doc/users/BerndZeimetz.mdwn b/doc/users/BerndZeimetz.mdwn
new file mode 100644 (file)
index 0000000..cf21dc5
--- /dev/null
@@ -0,0 +1,8 @@
+See [wiki.debian.org/BerndZeimetz](http://wiki.debian.org/BerndZeimetz) for details.
+
+<pre>
+ Bernd Zeimetz                            Debian GNU/Linux Developer
+ http://bzed.de                                http://www.debian.org
+ GPG Fingerprints: 06C8 C9A2 EAAD E37E 5B2C BE93 067A AD04 C93B FF79
+                   ECA1 E3F2 8E11 2432 D485 DD95 EB36 171A 6FF9 435F
+</pre>
index 372a28588aececd3c344df57a6f80cb5b26f8fef..d7469696e177f16277887506515d54850a8ee2c0 100644 (file)
@@ -1,2 +1,8 @@
 Runs ikiwiki on his [homepage](http://liegesta.at/) and can be reached through
 <davrieb@liegesta.at>
+
+## Branches in his [[git]] repository ##
+
+* `autotag`
+([browse](http://git.liegesta.at/?p=ikiwiki.git;a=shortlog;h=refs/heads/autotag))
+See [[todo/auto-create_tag_pages_according_to_a_template]]
index b32927a1c312b13f632506deaf3fbcd09baf5a7f..61d6150ef21dcd092cb11b94bcbb27eb2d843eca 100644 (file)
@@ -1,9 +1,4 @@
 My watchlist:
 
-[[!inline archive="yes" sort="mtime" atom="yes" pages="
-todo/allow_wiki_syntax_in_commit_messages*
-todo/shortcut_with_different_link_text*
-todo/structured_page_data*
-tips/convert_mediawiki_to_ikiwiki*
-"]]
+[[!inline archive="yes" sort="mtime" atom="yes" pages="todo/allow_wiki_syntax_in_commit_messages* or todo/shortcut_with_different_link_text* or todo/structured_page_data* or tips/convert_mediawiki_to_ikiwiki*"]]
 
index 9117abcabfce2375266bffff2e27a7490677971b..4a111a3f9c1c00fcf77e18df10d0810cd0068ee5 100644 (file)
@@ -23,3 +23,5 @@ things that need changing then I will probably need help/guidance.
 >> I suspect that asciidoc can't really be made to play nice to the extent that I would want casual users/abusers to have it as a markup option on a live wiki - it's fine for a personal site where you can look at the output before putting it online, but I think it would be a hideously gaping integrity hole for anything more than that.  However, for a personal site (as I am using it), it does seem to have its uses.
 
 >> I'll keep an eye on the format_escape plugin, and assuming it is accepted into ikiwiki, will see if I can apply it to asciidoc. --[[KarlMW]]
+
+Is there any way to enable latexmath rendering? It semes that ikiwiki strips the necessary javascript and/or style sheet information from the HTML page generated by asciidoc. --Peter
index 14fabbb01d5e0ff32d3acc91253759ad83fe9912..8e827b0da19697d252546396d66f08a123f8276f 100644 (file)
@@ -1,7 +1,8 @@
 * aka [[rubykat]]
-* Currently an active [PmWiki](http://www.pmwiki.org) user, but investigating changing over to ikiwiki (if I can write the plugins I need).
 * <http://kerravonsen.dreamwidth.org>
+* <http://www.katspace.org> (uses IkiWiki!)
 * <http://github.com/rubykat>
+* Also an active [PmWiki](http://www.pmwiki.org) user, interested in having the best of both worlds.
 
 Has written the following plugins:
 [[!map pages="!*/Discussion and ((link(users/KathrynAndersen) or link(users/rubykat)) and plugins/*) "]]
diff --git a/doc/users/KathrynAndersen/discussion.mdwn b/doc/users/KathrynAndersen/discussion.mdwn
new file mode 100644 (file)
index 0000000..4f2790c
--- /dev/null
@@ -0,0 +1,20 @@
+Had a look at your site. Sprawling, individualistic, using ikiwiki in lots of
+ways. Makes me happy. :) I see that I have let a lot of contrib plugins
+pile up. I will try to get to these. I'm particularly interested in
+your use of yaml+fields. Encourage you to go ahead with any others you
+have not submitted here, like pmap. (Unless it makes more sense to submit
+that as a patch to the existing map plugin.) --[[Joey]] 
+
+> Thanks.  I would have put more up, but I didn't want to until they were properly documented, and other things have taken a higher priority.
+
+> I think pmap is probably better as a separate plugin, because it has additional dependencies (HTML::LinkList) which people might not want to have to install.
+
+>> One approach commonly used in ikiwiki is to make such optional features
+>> be enabled by a switch somewhere, and 'eval q{use Foo}` so the module
+>> does not have to be loaded unless the feature is used. --[[Joey]]
+
+>>> Unfortunately, HTML::LinkList isn't an optional feature for pmap; that's what it uses to create the HTML for the map. --[[KathrynAndersen]]
+
+> The "includepage" plugin I'm not sure whether it is worth releasing or not; it's basically a cut-down version of "inline", because the inline plugin is so complicated and has so many options, I felt more at ease to have something simpler.
+
+> --[[KathrynAndersen]]
index 003449d40e89a5a3029832c22b266cf627f8073a..56a950f7e097d4f21b17259516e30e712f8fad59 100644 (file)
@@ -1,9 +1 @@
-Nicolas (nil) uses ikiwiki on a site/wiki/blog/something... and feels this approach much more comfortable than the usual web-only ones.
-
-He didn't touch any perl code before using ikiwiki, ant that was the first opportunity to propose tiny patches.
-
-Actualy, he would have felt much more comfortable with a python ikiwiki... :)
-
-Can be reached at nicolas at limare.net
-
-By the way, I can make translations to french if needed. And maybe to japanese.
\ No newline at end of file
+[[!meta redir="nil"]]
diff --git a/doc/users/Oblomov.mdwn b/doc/users/Oblomov.mdwn
new file mode 100644 (file)
index 0000000..be6e666
--- /dev/null
@@ -0,0 +1 @@
+Getting started with Ikiwiki, like the git backend a lot, would like to see a dynamic version of it.
index f5effdbe3d75d6e813063bb3e6dc576160a90542..1956263e0815eefc69ad9cd2bf70d2a08c1499b7 100644 (file)
@@ -13,14 +13,16 @@ Unless otherwise specified, any code that I post to this wiki I release under th
 
 ------
 
+Disabling these as I'm not using them much any more...
+
 ### Open Bugs:
 
-[[!inline pages="link(users/Will) and bugs/* and !bugs/done and !bugs/discussion and !link(patch) and !link(bugs/done) and !bugs/*/*" archive="yes" feeds="no" ]]
+\[[!inline pages="link(users/Will) and bugs/* and !bugs/done and !bugs/discussion and !link(patch) and !link(bugs/done) and !bugs/*/*" archive="yes" feeds="no" ]]
 
 ### Open ToDos:
 
-[[!inline pages="link(users/Will) and todo/* and !todo/done and !todo/discussion and !link(patch) and !link(todo/done) and !bugs/*/*" archive="yes" feeds="no" ]]
+\[[!inline pages="link(users/Will) and todo/* and !todo/done and !todo/discussion and !link(patch) and !link(todo/done) and !bugs/*/*" archive="yes" feeds="no" ]]
 
 ### Unapplied Patches:
 
-[[!inline pages="link(users/Will) and (todo/* or bugs/*) and !bugs/done and !bugs/discussion and !todo/done and !todo/discussion and link(patch) and !link(bugs/done) and !link(todo/done) and !bugs/*/*" archive="yes" feeds="no" ]]
+\[[!inline pages="link(users/Will) and (todo/* or bugs/*) and !bugs/done and !bugs/discussion and !todo/done and !todo/discussion and link(patch) and !link(bugs/done) and !link(todo/done) and !bugs/*/*" archive="yes" feeds="no" ]]
diff --git a/doc/users/blipvert.mdwn b/doc/users/blipvert.mdwn
new file mode 100644 (file)
index 0000000..7c4a24b
--- /dev/null
@@ -0,0 +1 @@
+<http://github.com/blipvert>
diff --git a/doc/users/ericdrechsel.mdwn b/doc/users/ericdrechsel.mdwn
new file mode 100644 (file)
index 0000000..2efb703
--- /dev/null
@@ -0,0 +1 @@
+[My homewiki profile](http://wiki.shared.dre.am/people/eric/)
diff --git a/doc/users/ivan_shmakov.mdwn b/doc/users/ivan_shmakov.mdwn
new file mode 100644 (file)
index 0000000..4123e0f
--- /dev/null
@@ -0,0 +1,50 @@
+&hellip; To put it short: an Ikiwiki newbie.
+
+[Emacs]: http://www.gnu.org/software/emacs/
+[Lynx]: http://lynx.isc.org/
+
+## Wikis
+
+Currently, I run a couple of Ikiwiki instances.  Namely:
+
+* <http://lhc.am-1.org/lhc/>
+  &mdash; to hold random stuff written by me, my colleagues,
+  students, etc.
+
+* <http://rsdesne.am-1.org/rsdesne-2010/>
+  &mdash; for some of the materials related to the
+  &ldquo;Remote Sensing in Education, Science and National
+  Economy&rdquo; (2010-03-29 &hellip; 2010-04-10, Altai State
+  University) program I've recently participated in as
+  an instructor.
+
+## Preferences
+
+I prefer to use [Lynx][] along with [Emacs][] (via
+`emacsclient`) to work with the wikis.  (Note the &ldquo;Local
+variables&rdquo; section below.)
+
+The things I dislike in the wiki engines are:
+
+* the use of home-brew specialized version control systems
+  &mdash; while there're a lot of much more developed general
+  purpose ones;
+
+* oversimplified syntax
+  &mdash; which (to some extent) precludes more sophisticated
+  forms of automated processing; in particular, this forces one
+  to reformat the material, once complete, to, say, prepare a
+  book, or an article, or slides.
+
+Out of all the wiki engines I'm familiar with, only Ikiwiki is
+free of the first of these.  I hope that it will support more
+elaborate syntaxes eventually.
+
+----
+
+    Local variables:
+    mode: markdown
+    coding: utf-8
+    fill-column: 64
+    ispell-dictionary: "american"
+    End: 
index b50e4844a04f30a21fd3c3d9e2b00fb94a3ca3d6..e4a459e30763b64615bfbb6d890bd550fec8aed6 100644 (file)
@@ -1,66 +1,46 @@
 [[!meta title="Jason Blevins"]]
 
-I'm currently hosting a private ikiwiki for keeping research notes
-which, with some patches and a plugin (below), will
-convert inline [[todo/LaTeX]] expressions to [[MathML]].  I'm working towards a
-patchset and instructions for others to do the same.
-
-I've setup a test ikiwiki [here](http://xbeta.org/colab/) where I've
-started keeping a few notes on my progress.  There is an example of
-inline [[todo/SVG]] on the homepage (note that the logo scales along with the
-font size).  There are a few example mathematical expressions in the
-[sandbox](http://xbeta.org/colab/sandbox/).  The MathML is generated
-automatically from inline LaTeX expressions using an experimental
-plugin I'm working on.
-
-My (also MathML-enabled) homepage: <http://jblevins.org/> (still using
-Blosxom...maybe one day I'll convert it to ikiwiki...)
-
-Current ikiwki issues of interest:
-
- * [[bugs/recentchanges_feed_links]]
- * [[bugs/HTML_inlined_into_Atom_not_necessarily_well-formed]]
- * [[plugins/toc/discussion]]
- * [[todo/BibTeX]]
- * [[todo/svg]]
- * [[todo/Option_to_make_title_an_h1?]]
- * [[bugs/SVG_files_not_recognized_as_images]]
+I am a former Ikiwiki user who wrote several plugins and patches
+related to MathML, [[SVG|todo/svg]], and [[todo/syntax highlighting]].
+Some related links and notes are archived below.
+
+Homepage: <http://jblevins.org/>
 
 ## Plugins
 
-These plugins are experimental.  Use them at your own risk.  Read the
-perldoc documentation for more details.  Patches and suggestions are
-welcome.
+The following [plugins](http://jblevins.org/projects/ikiwiki/)
+are no longer maintained, but please feel free to use, modify, and
+redistribute them.  Read the corresponding perldoc documentation for
+more details.
 
- * [mdwn_itex][] - Works with the [[`mdwn`|plugins/mdwn]] plugin to convert inline [[todo/LaTeX]]
-   expressions to [[MathML]] using `itex2MML`.
+ * [mdwn_itex][] - Works with the [[`mdwn`|plugins/mdwn]] plugin to convert
+   inline [[todo/LaTeX]] expressions to MathML using `itex2MML`.
 
  * [h1title][] - If present, use the leading level 1 Markdown header to
    set the page title and remove it from the page body.
 
  * [code][] - Whole file and inline code snippet [[todo/syntax highlighting]]
    via GNU Source-highlight.  The list of supported file extensions is
-   configurable.  There is also some preliminary [documentation][code-doc].
-   See the [FortranWiki](http://fortranwiki.org) for examples.
+   configurable.
 
- * [metamail][] - a plugin for loading metadata from [[email]]-style
+ * [metamail][] - a plugin for loading metadata from email-style
    headers at top of a file (e.g., `title: Page Title` or
    `date: November 2, 2008 11:14 EST`).
 
- * [pandoc][] - [[ikiwiki/Markdown]] page processing via [Pandoc](http://johnmacfarlane.net/pandoc/) (a Haskell library for converting from one markup format to another).  [[todo/LaTeX]] and
+ * [pandoc][] - [[ikiwiki/Markdown]] page processing via
+   [Pandoc](http://johnmacfarlane.net/pandoc/) (a Haskell library for
+   converting from one markup format to another).  [[todo/LaTeX]] and
    [[reStructuredText|plugins/rst]] are optional.
 
  * [path][] - Provides path-specific template conditionals such as
    `IS_HOMEPAGE` and `IN_DIR_SUBDIR`.
 
- [mdwn_itex]: http://code.jblevins.org/ikiwiki/plugins.git/plain/mdwn_itex.pm
- [h1title]: http://code.jblevins.org/ikiwiki/plugins.git/plain/h1title.pm
- [code]: http://code.jblevins.org/ikiwiki/plugins.git/plain/code.pm
- [code-doc]: http://code.jblevins.org/ikiwiki/plugins.git/plain/code.text
- [metamail]: http://code.jblevins.org/ikiwiki/plugins.git/plain/metamail.pm
- [pandoc]: http://code.jblevins.org/ikiwiki/plugins.git/plain/pandoc.pm
- [path]: http://code.jblevins.org/ikiwiki/plugins.git/plain/path.pm
-
+ [mdwn_itex]: http://jblevins.org/git/ikiwiki/plugins.git/plain/mdwn_itex.pm
+ [h1title]: http://jblevins.org/git/ikiwiki/plugins.git/plain/h1title.pm
+ [code]: http://jblevins.org/projects/ikiwiki/code
+ [metamail]: http://jblevins.org/git/ikiwiki/plugins.git/plain/metamail.pm
+ [pandoc]: http://jblevins.org/git/ikiwiki/plugins.git/plain/pandoc.pm
+ [path]: http://jblevins.org/git/ikiwiki/plugins.git/plain/path.pm
 
 ## MathML and SVG support
 
@@ -105,5 +85,5 @@ optimal solution is to force users to preview the page before saving.
 That way if someone introduces invalid XHTML then they can't save the
 page in the first place (unless they post directly to the right URL).
 
- [template-patch]: http://xbeta.org/gitweb/?p=xbeta/ikiwiki.git;a=blobdiff;f=templates/page.tmpl;h=380ef699fa72223744eb5c1ee655fb79aa6bce5b;hp=9084ba7e11e92a10528b2ab12c9b73cf7b0f40a7;hb=416d5d1b15b94e604442e4e209a30dee4b77b684;hpb=ececf4fb8766a4ff7eff943b3ef600be81a0df49
- [cgi-patch]: http://xbeta.org/gitweb/?p=xbeta/ikiwiki.git;a=commitdiff;h=fa538c375250ab08f396634135f7d79fce2a9d36
+ [template-patch]: http://jblevins.org/git/ikiwiki.git/commit/?h=xbeta&id=416d5d1b15b94e604442e4e209a30dee4b77b684
+ [cgi-patch]: http://jblevins.org/git/ikiwiki.git/commit/?id=fa538c375250ab08f396634135f7d79fce2a9d36
diff --git a/doc/users/jaywalk.mdwn b/doc/users/jaywalk.mdwn
new file mode 100644 (file)
index 0000000..31b3e0c
--- /dev/null
@@ -0,0 +1,5 @@
+Jonatan Walck. Home page: [jonatan.walck.se](http://jonatan.walck.se)
+
+## Contact ##
+* jonatan at walck dot se
+* [I2P-Bote key](http://jonatan.walck.i2p/docs/i2p-bote.txt) [what is this?](http://i2pbote.i2p.to/)
diff --git a/doc/users/jeanprivat.mdwn b/doc/users/jeanprivat.mdwn
new file mode 100644 (file)
index 0000000..4d75a98
--- /dev/null
@@ -0,0 +1 @@
+Jean Privat is <jean@pryen.org>.
diff --git a/doc/users/jerojasro.mdwn b/doc/users/jerojasro.mdwn
new file mode 100644 (file)
index 0000000..e2e620d
--- /dev/null
@@ -0,0 +1,3 @@
+Javier Rojas
+
+I keep a personal [wiki](http://devnull.li/~jerojasro/wiki) and my [blog](http://devnull.li/~jerojasro/blog) in ikiwiki.
index 6f87cbc454fd703ee8f23052ac951beecdb04094..e8068a10ffc930a860ddf8683567c99697f7c814 100644 (file)
@@ -1,5 +1,5 @@
  * An [economic game](http://sef.matabio.net/) in french, which [use](http://sef.matabio.net/wiki/) IkiWiki.
- * Some [plugins](http://kimya.matabio.net/tcgi/hg/IkiPlugins/file/).
- * An alternative [base wiki](http://kimya.matabio.net/tcgi/hg/FrIkiWiki/file/) in french.
+ * Some [plugins](http://www.matabio.net/tcgi/hg/IkiPlugins/file/).
+ * An alternative [base wiki](http://www.matabio.net/tcgi/hg/FrIkiWiki/file/) in french.
 
 email: `jogo matabio net`.
index f08076c2a3e464351117cee5eddc39c4c9a36853..eb01821ff029a6f8b337fb18485e733626600e0f 100644 (file)
@@ -45,9 +45,16 @@ The following I have been looking at, but are on the back-burner:
   bugs such as [[bugs/tagged() matching wikilinks]]. Code for this lives
   in my github `tag2` branch: <http://github.com/jmtd/ikiwiki>
 
-Finally, the following are merely half-formed thoughts:
+Penultimately, the following are merely half-formed thoughts:
 
  * adding and removing tags to pages via the edit form by ticking and
    unticking checkboxes next to a tag name (rather than entering the 
    directive into the text of the page directly)
  * perhaps the same for meta
+ * I'd like to make profiling ikiwiki in action very easy for newcomers.
+   Perhaps even a plugin that created a file /profile or similar on build.
+
+Finally, backlinks (since I have issues with the current backlinks
+implementation, see [[bugs/backlinks onhover thing can go weird]]):
+
+[[!inline pages="link(users/Jon)" archive="yes" feeds="no"]]
diff --git a/doc/users/nil.mdwn b/doc/users/nil.mdwn
new file mode 100644 (file)
index 0000000..e1826ce
--- /dev/null
@@ -0,0 +1,8 @@
+nil first used ikiwiki on a site/wiki/blog/something... and felt this approach much more comfortable than the usual web-only ones.
+Since then, ikiwiki is a kind of swiss army knife when it comes to build anything for the web.
+
+Can be reached at nicolas at limare.net
+
+The current big ikiwiki-powered project is <http://www.ipol.im> 
+
+TODO: document "how to split public/edition interfaces"
index 7ebd8311c118c2da9805e8b415956fc70a4aeb96..ed3332bf90f5c804a6fd1ef42b6e0bd4c42cd855 100644 (file)
@@ -1,3 +1,5 @@
-[Amitai Schlair](http://www.columbia.edu/~ays2105/) recently discovered ikiwiki and finds himself using it for all sorts of things. His attempts at contributing:
+[Amitai Schlair](http://www.netbsd.org/~schmonz/) recently discovered ikiwiki and finds himself using it for all sorts of things. His attempts at contributing:
 
 [[!map pages="!*/Discussion and ((link(users/schmonz) and plugins/*) or rcs/cvs)"]]
+
+In progress: a plugin for [WIND authentication](http://www.columbia.edu/acis/rad/authmethods/wind/).
index 5fc24711e4bc7e19f5c09a7e58b4769ce3dd488f..13681a6747ea54bd5ec3848e851050c155840381 100644 (file)
@@ -1,8 +1,7 @@
 ## personal/site info
 
-New ikiwiki site at my web site, blog, kisikew.org home site, for indigenews, and our indigenous-centric wiki (mostly East Coast/Woodlands area). Mediawiki stuff was imported successfully (as noted on this web site).
-
+Have several ikiwiki-based sites at my web site, blog, kisikew.org home site, for indigenews, and our indigenous-centric wiki (mostly East Coast/Woodlands area).
 ## ikiwiki branch at github
 
-Maintain my own branch, partly to learn about VCS, git, ikiwiki, Debian packaging, and Perl. I don't recommend anyone pull from it, as I use third-party plugins included on this site that people may not want in a default installation of ikiwiki. This is why I don't push to Joey's -- so it's nothing personal, I just don't want to mess things up for other people, from my mistakes and stumbles.
+Maintain my own branch, partly to learn about VCS, git, ikiwiki, Debian packaging, and Perl. Thinking of removing most 3rd-party plugins (found in contrib/). Have some custom plugins to support dual bottom-of-the-page "sidebars" and an attempt at supporting HTTPBL (see projecthoneypot.org).
 
index 69d83584fd105e00233372b08d9b493c1b4f01ac..712a0d3e7d42d3ef27a264c48110faf477ece6e0 100644 (file)
@@ -1,4 +1,4 @@
 [[!meta title="Svend Sorensen"]]
 
-* [website](http://www.ciffer.net/~svend/)
-* [blog](http://www.ciffer.net/~svend/blog/)
+* [website](http://ciffer.net/~svend/)
+* [blog](http://ciffer.net/~svend/blog/)
index 20d8d16a85c884fb55ae7bdcceddf005a318ab8a..414612affd93f203b18148c8f6c93453694c6757 100644 (file)
@@ -99,12 +99,6 @@ page that uses \[[!meta redir]].
 
 ## [[bugs/Broken Parentlinks]]
 
-## Discussion Pages of Discussion Pages of...
-
-Is it useful to have Discussion pages of Discussion pages (etc.)?  -- On
-<http://www.gnu.org/software/hurd/hurd/building/cross-compiling/discussion.html>,
-this possibility is offered.
-
 ## Modifying [[plugins/inline]] for showing only an *appetizer*
 
 Currently ikiwiki's inline plugin will either show the full page or nothing of
diff --git a/doc/users/tupyakov_vladimir.mdwn b/doc/users/tupyakov_vladimir.mdwn
new file mode 100644 (file)
index 0000000..95f85ad
--- /dev/null
@@ -0,0 +1 @@
+всем привет!
diff --git a/doc/wikitemplates.mdwn b/doc/wikitemplates.mdwn
deleted file mode 100644 (file)
index 6c0480c..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-ikiwiki uses the HTML::Template module as its template engine. This
-supports things like conditionals and loops in templates and is pretty easy
-to learn.
-
-The aim is to keep almost all html out of ikiwiki and in the templates.
-
-It ships with some basic templates which can be customised. These are
-located in /usr/share/ikiwiki/templates by default.
-
-* `page.tmpl` - Used for displaying all regular wiki pages.
-* `misc.tmpl` - Generic template used for any page that doesn't
-  have a custom template.
-* `editpage.tmpl` - Create/edit page.
-* `change.tmpl` - Used to create a page describing a change made to the wiki.
-* `passwordmail.tmpl` - Not a html template, this is used to
-  generate a mail with an url the user can use to reset their password.
-* `rsspage.tmpl` - Used for generating rss feeds for [[blogs|blog]].
-* `rssitem.tmpl` - Used for generating individual items on rss feeds.
-* `atompage.tmpl` - Used for generating atom feeds for blogs.
-* `atomitem.tmpl` - Used for generating individual items on atom feeds.
-* `inlinepage.tmpl` - Used for adding a page inline in a blog
-  page.
-* `archivepage.tmpl` - Used for listing a page in a blog archive page.
-* `microblog.tmpl` - Used for showing a microblogging post inline.
-* `blogpost.tmpl` - Used for a form to add a post to a blog (and a rss/atom links)
-* `feedlink.tmpl` - Used to add rss/atom links if blogpost.tmpl is not used.
-* `aggregatepost.tmpl` - Used by the [[plugins/aggregate]] plugin to create
-  a page for a post.
-* `searchform.tmpl` - Used by the [[plugins/search]] plugin to add a search
-  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.
-* `commentmoderation.tmpl` - This template is used to produce the comment
-  moderation form.
-* `recentchanges.tmpl` - This template is used for listing a change
-  on the RecentChanges page.
-
-The [[plugins/pagetemplate]] plugin can allow individual pages to use a
-different template than `page.tmpl`.
-
-The [[plugins/template]] plugin also uses templates, though those
-[[templates]] are stored in the wiki and inserted into pages.
-
-The [[plugins/edittemplate]] plugin is used to make new pages default to
-containing text from a template, which can be filled as out the page is
-edited.
diff --git a/doc/wikitemplates/discussion.mdwn b/doc/wikitemplates/discussion.mdwn
deleted file mode 100644 (file)
index f97444e..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-## Place for local templates
-Where does one put any locally modified templates for an individual ikiwiki? --Ivan Z.
-
-> You can put them whereever you like; the `templatedir` controls
-> where ikiwiki looks for them. --[[Joey]] 
-
-Thank you for your response! My question arose out of my intention to make
-custom templates for a wiki--specifically suited for the kind of  content
-it will have--so, that would mean I would want to distribute them through
-git together with other content of the wiki. So, for this case the
-separation of conceptually ONE thing (the content, the templates, and the
-config option which orders to use these templates) into THREE separate
-files/repos (the main content repo, the repo with templates, and the config
-file) is not convenient: instead of distributing a single repo, I have to
-tell people to take three things if they want to replicate this wiki. How
-would you solve this inconvenience? Perhaps, a default location of the
-templates *inside* the source repo would do?--Ivan Z.
-
-> I would avoid putting the templates in a subdirectory of the ikiwiki srcdir.
-> (I'd also avoid putting the ikiwiki setup file there.)
-> While it's safe to do either in some cases, there are configurations where
-> it's unsafe. For example, a malicious user could use attachment handling to
-> replace those files with their own, bad versions.
-> 
-> So, two ideas for where to put the templatedir and ikiwiki setup. 
-
-> * The easiest option is to put your wiki content in a subdirectory
->   ("wiki", say) and point `srcdir` at that.
->   then you can have another subdirectory for the wikitemplates,
->   and put the setup file at the top.
-> * Another option if using git would be to have a separate branch,
->   in the same git repository, that holds wikitemplates and the setup file.
->   Then you check out the repository once to make the `srcdir` available,
->   and have a second checkout, of the other branch, to make the other stuff
->   available.
-> 
-> Note that with either of these methods, you have to watch out if
-> giving other direct commit access to the repository. They could
-> still edit the setup file and templates, so only trusted users should
-> be given access. (It is, however, perfectly safe to let people edit
-> the wiki via the web, and is even safe to configure
-> [[tips/untrusted_git_push]] to such a repository.) --[[Joey]]
-
-Thanks, that's a nice and simple idea: to have a subdirectory! I'll try it. --Ivan Z.
-
-A [[!taglink wish|wishlist]]: the ikiwiki program could be improved so that it follows the same logic as git in looking for its config: it could ascend directories until it finds an `.ikiwiki/` directory with `.ikiwiki/setup` and then uses that configuration. Now I'm tired to always type `ikiwiki --setup path/to/the/setup --refresh` when working in my working clone of the sources; I'd like to simply type `ikiwiki` instead, and let it find the setup file. The default location to look for templates could also be made to be a sibling of the setup file: `.ikiwiki/templates/`. --Ivan Z.
index 86f012c50ac281fb1506c4392bb316d49d673900..8b898f61928bb5af36c501586caf4596c0a896ce 100644 (file)
@@ -1,6 +1,18 @@
 #!/usr/bin/perl
 # Configuration file for ikiwiki to build its documentation wiki.
 
+# Use git during the build, if it's available and if we're building
+# from a git checkout. This ensures ikiwiki gets the right mtimes and
+# ctimes for files in the doc wiki.
+our $rcs="norcs";
+BEGIN {
+       my $git=`which git 2>&1`;
+       chomp $git;
+       if (-x $git && -d ".git") {
+               $rcs="git";
+       }
+}
+
 use IkiWiki::Setup::Standard {
        wikiname => "ikiwiki",
        srcdir => "doc",
@@ -9,12 +21,16 @@ use IkiWiki::Setup::Standard {
        underlaydirbase => "underlays",
        underlaydir => "underlays/basewiki",
        discussion => 0,
-       exclude => qr/\/discussion|bugs\/*|todo\/*|forum\/*/,
+       exclude => qr/\/discussion|bugs\/*|todo\/*|forum\/*/, # save space
        locale => '',
        verbose => 1,
        syslog => 0,
        userdir => "users",
        usedirs => 0,
        prefix_directives => 1,
-       add_plugins => [qw{goodstuff version haiku polygen fortune}],
+       add_plugins => [qw{goodstuff version haiku polygen fortune table}],
+       # not appropriate for doc dir
+       disable_plugins => [qw{recentchanges openid}],
+       rcs => $rcs,
+       gitorigin_branch => '', # don't pull during build
 }
index f596c650f56f1a96b2b53ec5aeb7ad85f818b6d3..5cafad1b8dcb550c694567b7815978a7861fc6fe 100755 (executable)
@@ -16,7 +16,10 @@ while (<IN>) {
                my ($oldurl)=$info=~/URL: (.*)/m;
                if ($oldurl ne $url) {
                        system("git remote rm $remote 2>/dev/null");
-                       system("git", "remote", "add", "-f", $remote, $url)
+                       system("git", "remote", "add", $remote, $url);
+                       system("git", "config", "remote.$remote.tagopt",
+                               "--no-tags");
+                       system("git", "fetch", $remote);
                }
        }
 }
similarity index 77%
rename from ikiwiki-calendar
rename to ikiwiki-calendar.in
index a9548d6ec63813d2c150938f1df82ae5da2d6b4a..60df99855df63a8a248b78616911359035477a1a 100755 (executable)
@@ -1,6 +1,7 @@
 #!/usr/bin/perl
 use warnings;
 use strict;
+use lib '.'; # For use in nonstandard directory, munged by Makefile.
 use IkiWiki;
 use IkiWiki::Setup;
 use Getopt::Long;
@@ -14,7 +15,10 @@ GetOptions(
        "force" => \$force,
 ) || usage();
 my $setup=shift                || usage();
-my $pagespec=shift     || "*";
+my $pagespec;
+if (@ARGV && $ARGV[0] !~ /^\d+$/) {
+       $pagespec=shift;
+}
 my $startyear=shift    || 1900+(localtime(time))[5];
 my $endyear=shift      || $startyear;
 
@@ -26,6 +30,10 @@ IkiWiki::checkconfig();
 my $archivebase = 'archives';
 $archivebase = $config{archivebase} if defined $config{archivebase};
 
+if (! defined $pagespec) {
+       $pagespec=$config{archive_pagespec} || "*";
+}
+
 sub writearchive ($$;$) {
        my $template=template(shift);
        my $year=shift;
@@ -51,7 +59,8 @@ foreach my $y ($startyear..$endyear) {
        }
 }
 
-IkiWiki::rcs_commit_staged(gettext("calendar update"), undef, undef)
+IkiWiki::rcs_commit_staged(message => gettext("calendar update"))
        if $config{rcs};
 
-system("ikiwiki", "-setup", $setup, "-refresh");
+exec("ikiwiki", "-setup", $setup, "-refresh");
+die "failed to run ikiwiki -setup $setup -refresh\n";
similarity index 99%
rename from ikiwiki-transition
rename to ikiwiki-transition.in
index 1bebb1176d99569341a6735e83c4cb51c14e1ffc..e3be645ccc5e150125ed1ba500f858b044b97eb8 100755 (executable)
@@ -1,6 +1,7 @@
 #!/usr/bin/perl
 use warnings;
 use strict;
+use lib '.'; # For use in nonstandard directory, munged by Makefile.
 use IkiWiki;
 use HTML::Entities;
 
index b8581d880eea398ac10a697c311f36428a18a67c..ac43044dfcbb6b927de2f83081f9cb67ce6bd384 100755 (executable)
@@ -7,7 +7,7 @@ package IkiWiki;
 use warnings;
 use strict;
 use lib '.'; # For use in nonstandard directory, munged by Makefile.
-use IkiWiki;
+use IkiWiki 3.00;
 
 sub usage () {
        die gettext("usage: ikiwiki [options] source dest"), "\n",
@@ -37,13 +37,15 @@ sub getconfig () {
                        "syslog!" => \$config{syslog},
                        "rebuild!" => \$config{rebuild},
                        "refresh!" => \$config{refresh},
+                       "clean!" => \$config{clean},
                        "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},
+                       "getctime" => \$config{gettime},
+                       "gettime!" => \$config{gettime},
                        "numbacklinks=i" => \$config{numbacklinks},
                        "rcs=s" => \$config{rcs},
                        "no-rcs" => sub { $config{rcs}="" },
@@ -64,6 +66,9 @@ sub getconfig () {
                        "exclude=s@" => sub {
                                push @{$config{wiki_file_prune_regexps}}, $_[1];
                        },
+                       "include=s@" => sub {
+                               $config{include}=defined $config{include} && length $config{include} ? "$config{include}|$_[1]" : $_[1];
+                       },
                        "adminuser=s@" => sub {
                                push @{$config{adminuser}}, $_[1]
                        },
@@ -92,6 +97,17 @@ sub getconfig () {
                                }
                                $config{$var}=$val;
                        },
+                       "set-yaml=s" => sub {
+                               my ($var, $val)=split('=', $_[1], 2);
+                               if (! defined $var || ! defined $val) {
+                                       die gettext("usage: --set-yaml var=value"), "\n";
+                               }
+                               eval q{use YAML::Any};
+                               eval q{use YAML} if $@;
+                               die $@ if $@;
+                               eval q{$YAML::Syck::ImplicitUnicode=1};
+                               $config{$var}=Load($val."\n");
+                       },
                        "version" => sub {
                                print "ikiwiki version $IkiWiki::version\n";
                                exit;
@@ -135,6 +151,7 @@ sub main () {
 
                if (@{$config{wrappers}} && 
                    ! $config{render} && ! $config{dumpsetup} &&
+                   ! $config{clean} &&
                    ((! $config{refresh} && ! $config{post_commit})
                     || $config{genwrappers})) {
                        debug(gettext("generating wrappers.."));
@@ -159,7 +176,7 @@ sub main () {
                
                # setup implies a wiki rebuild by default
                if (! $config{refresh} && ! $config{render} &&
-                   ! $config{post_commit}) {
+                   ! $config{post_commit} && ! $config{clean}) {
                        $config{rebuild}=1;
                }
        }
@@ -190,6 +207,14 @@ sub main () {
        elsif ($config{post_commit} && ! commit_hook_enabled()) {
                # do nothing
        }
+       elsif ($config{clean}) {
+               require IkiWiki::Render;
+               foreach my $wrapper (@{$config{wrappers}}) {
+                       prune($wrapper->{wrapper});
+               }
+               clean_rendered();
+               system("rm", "-rf", $config{wikistatedir});
+       }
        else {
                if ($config{rebuild}) {
                        debug(gettext("rebuilding wiki.."));
index 78c32b962e886338a4d57f654753650d29e8afa5..9644fd396b9fbcdb4c4dec46ce29b1b05e5d2380 100644 (file)
@@ -1,5 +1,5 @@
 Name:           ikiwiki
-Version: 3.20100102.3
+Version: 3.20100624
 Release:        1%{?dist}
 Summary:        A wiki compiler
 
index e4ba5aadfea3a04a00552a5cb90b81d34963aa9b..090174534d48e7cc056a5be13def89db80df6717 100755 (executable)
--- a/mdwn2man
+++ b/mdwn2man
@@ -9,7 +9,7 @@ print ".TH $prog $section\n";
 while (<>) {
        s{(\\?)\[\[([^\s\|\]]+)(\|[^\s\]]+)?\]\]}{$1 ? "[[$2]]" : $2}eg;
        s/\`//g;
-       s/^\./\\&./g;
+       s/^\s*\./\\&./g;
        if (/^#\s/) {
                s/^#\s/.SH /;
                <>; # blank;
index 9f64b33a0aa3224fd371224ec54f6f28ffb2e355..8386675079bf6de787ad18731addf532cc142435 100755 (executable)
@@ -33,7 +33,7 @@ def _to_dict(args):
     return dict((k, v) for k, v in zip(*[iter(args)]*2))
 
 def getsetup(proxy, *kwargs):
-    return 'plugin', { 'safe' : 1, 'rebuild' : 1 }
+    return 'plugin', { 'safe' : 1, 'rebuild' : 1, 'section' : 'format' }
 
 import sys
 def debug(s):
index 8f62d4652e1699264b24bc45108a20651e9c02b3..49dddee2b94d27d132384ba58f1fc4e422b47acf 100644 (file)
--- a/po/bg.po
+++ b/po/bg.po
@@ -7,55 +7,52 @@ msgid ""
 msgstr ""
 "Project-Id-Version: ikiwiki-bg\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-10-31 18:31-0400\n"
+"POT-Creation-Date: 2010-05-18 14:18-0400\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"
+"Language: bg\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:114
-msgid "You need to log in first."
-msgstr "Първо трябва да влезете."
-
-#: ../IkiWiki/CGI.pm:147
+#: ../IkiWiki/CGI.pm:162
 msgid ""
 "probable misconfiguration: sslcookie is set, but you are attempting to login "
 "via http, not https"
 msgstr ""
 
-#: ../IkiWiki/CGI.pm:150
+#: ../IkiWiki/CGI.pm:165
 msgid "login failed, perhaps you need to turn on cookies?"
 msgstr ""
 
-#: ../IkiWiki/CGI.pm:169 ../IkiWiki/CGI.pm:314
+#: ../IkiWiki/CGI.pm:184 ../IkiWiki/CGI.pm:335
 msgid "Your login session has expired."
 msgstr ""
 
-#: ../IkiWiki/CGI.pm:190
+#: ../IkiWiki/CGI.pm:205
 msgid "Login"
 msgstr ""
 
-#: ../IkiWiki/CGI.pm:191
+#: ../IkiWiki/CGI.pm:206
 #, fuzzy
 msgid "Preferences"
 msgstr "Предпочитанията са запазени."
 
-#: ../IkiWiki/CGI.pm:192
+#: ../IkiWiki/CGI.pm:207
 msgid "Admin"
 msgstr ""
 
-#: ../IkiWiki/CGI.pm:232
+#: ../IkiWiki/CGI.pm:247
 msgid "Preferences saved."
 msgstr "Предпочитанията са запазени."
 
-#: ../IkiWiki/CGI.pm:278
+#: ../IkiWiki/CGI.pm:299
 msgid "You are banned."
 msgstr "Достъпът ви е забранен."
 
-#: ../IkiWiki/CGI.pm:405 ../IkiWiki/CGI.pm:406 ../IkiWiki.pm:1282
+#: ../IkiWiki/CGI.pm:426 ../IkiWiki/CGI.pm:427 ../IkiWiki.pm:1316
 msgid "Error"
 msgstr "Грешка"
 
@@ -137,7 +134,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:231
 msgid "done"
 msgstr "готово"
 
@@ -146,43 +143,43 @@ msgstr "готово"
 msgid "Must specify %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:136
+#: ../IkiWiki/Plugin/amazon_s3.pm:140
 #, fuzzy
 msgid "Failed to create S3 bucket: "
 msgstr "Грешка при изпращане на поща"
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:221
+#: ../IkiWiki/Plugin/amazon_s3.pm:225
 #, fuzzy
 msgid "Failed to save file to S3: "
 msgstr "Грешка при изпращане на поща"
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:243
+#: ../IkiWiki/Plugin/amazon_s3.pm:247
 #, fuzzy
 msgid "Failed to delete file from S3: "
 msgstr "грешка при запис на файла „%s”: %s"
 
-#: ../IkiWiki/Plugin/attachment.pm:49
+#: ../IkiWiki/Plugin/attachment.pm:50
 #, perl-format
 msgid "there is already a page named %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/attachment.pm:65
+#: ../IkiWiki/Plugin/attachment.pm:66
 msgid "prohibited by allowed_attachments"
 msgstr ""
 
-#: ../IkiWiki/Plugin/attachment.pm:140
+#: ../IkiWiki/Plugin/attachment.pm:141
 msgid "bad attachment filename"
 msgstr ""
 
-#: ../IkiWiki/Plugin/attachment.pm:182
+#: ../IkiWiki/Plugin/attachment.pm:183
 msgid "attachment upload"
 msgstr ""
 
-#: ../IkiWiki/Plugin/autoindex.pm:105
+#: ../IkiWiki/Plugin/autoindex.pm:117
 msgid "automatic index generation"
 msgstr ""
 
-#: ../IkiWiki/Plugin/blogspam.pm:108
+#: ../IkiWiki/Plugin/blogspam.pm:109
 msgid ""
 "Sorry, but that looks like spam to <a href=\"http://blogspam.net/"
 "\">blogspam</a>: "
@@ -197,198 +194,218 @@ msgstr ""
 msgid "There are no broken links!"
 msgstr "Няма „счупени” връзки!"
 
-#: ../IkiWiki/Plugin/comments.pm:124 ../IkiWiki/Plugin/format.pm:38
+#: ../IkiWiki/Plugin/comments.pm:112
+#, fuzzy, perl-format
+msgid "this comment needs %s"
+msgstr "създаване на %s"
+
+#: ../IkiWiki/Plugin/comments.pm:115
+msgid "moderation"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:136 ../IkiWiki/Plugin/format.pm:48
 #, perl-format
 msgid "unsupported page format %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:129
+#: ../IkiWiki/Plugin/comments.pm:141
 msgid "comment must have content"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:185
+#: ../IkiWiki/Plugin/comments.pm:196
 msgid "Anonymous"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:340 ../IkiWiki/Plugin/editpage.pm:97
+#: ../IkiWiki/Plugin/comments.pm:357 ../IkiWiki/Plugin/editpage.pm:98
 msgid "bad page name"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:345
+#: ../IkiWiki/Plugin/comments.pm:362
 #, fuzzy, perl-format
 msgid "commenting on %s"
 msgstr "създаване на %s"
 
-#: ../IkiWiki/Plugin/comments.pm:363
+#: ../IkiWiki/Plugin/comments.pm:380
 #, perl-format
 msgid "page '%s' doesn't exist, so you can't comment"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:370
+#: ../IkiWiki/Plugin/comments.pm:387
 #, perl-format
 msgid "comments on page '%s' are closed"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:464
+#: ../IkiWiki/Plugin/comments.pm:490
 msgid "comment stored for moderation"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:466
+#: ../IkiWiki/Plugin/comments.pm:492
 msgid "Your comment will be posted after moderator review"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:479
+#: ../IkiWiki/Plugin/comments.pm:505
 msgid "Added a comment"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:483
+#: ../IkiWiki/Plugin/comments.pm:509
 #, perl-format
 msgid "Added a comment: %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:525 ../IkiWiki/Plugin/websetup.pm:236
+#: ../IkiWiki/Plugin/comments.pm:551 ../IkiWiki/Plugin/websetup.pm:272
 msgid "you are not logged in as an admin"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:576
+#: ../IkiWiki/Plugin/comments.pm:602
 msgid "Comment moderation"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:615
+#: ../IkiWiki/Plugin/comments.pm:640
 msgid "comment moderation"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:766
-msgid "Comments"
+#: ../IkiWiki/Plugin/comments.pm:789
+#, perl-format
+msgid "%i comment"
+msgid_plural "%i comments"
+msgstr[0] ""
+msgstr[1] ""
+
+#. translators: Here "Comment" is a verb;
+#. translators: the user clicks on it to
+#. translators: post a comment.
+#: ../IkiWiki/Plugin/comments.pm:799
+msgid "Comment"
 msgstr ""
 
-#: ../IkiWiki/Plugin/conditional.pm:27 ../IkiWiki/Plugin/cutpaste.pm:30
-#: ../IkiWiki/Plugin/cutpaste.pm:45 ../IkiWiki/Plugin/cutpaste.pm:61
+#: ../IkiWiki/Plugin/conditional.pm:28 ../IkiWiki/Plugin/cutpaste.pm:31
+#: ../IkiWiki/Plugin/cutpaste.pm:46 ../IkiWiki/Plugin/cutpaste.pm:62
 #: ../IkiWiki/Plugin/testpagespec.pm:26
 #, perl-format
 msgid "%s parameter is required"
 msgstr ""
 
-#: ../IkiWiki/Plugin/cutpaste.pm:66
+#: ../IkiWiki/Plugin/cutpaste.pm:67
 msgid "no text was copied in this page"
 msgstr ""
 
-#: ../IkiWiki/Plugin/cutpaste.pm:69
+#: ../IkiWiki/Plugin/cutpaste.pm:70
 #, perl-format
 msgid "no text was copied in this page with id %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/editpage.pm:40
+#: ../IkiWiki/Plugin/editpage.pm:41
 #, fuzzy, perl-format
 msgid "removing old preview %s"
 msgstr "премахване на старата страница „%s”"
 
-#: ../IkiWiki/Plugin/editpage.pm:113
+#: ../IkiWiki/Plugin/editpage.pm:114
 #, perl-format
 msgid "%s is not an editable page"
 msgstr ""
 
-#: ../IkiWiki/Plugin/editpage.pm:292
+#: ../IkiWiki/Plugin/editpage.pm:294
 #, perl-format
 msgid "creating %s"
 msgstr "създаване на %s"
 
-#: ../IkiWiki/Plugin/editpage.pm:310 ../IkiWiki/Plugin/editpage.pm:329
-#: ../IkiWiki/Plugin/editpage.pm:339 ../IkiWiki/Plugin/editpage.pm:383
-#: ../IkiWiki/Plugin/editpage.pm:422
+#: ../IkiWiki/Plugin/editpage.pm:312 ../IkiWiki/Plugin/editpage.pm:331
+#: ../IkiWiki/Plugin/editpage.pm:341 ../IkiWiki/Plugin/editpage.pm:385
+#: ../IkiWiki/Plugin/editpage.pm:424
 #, perl-format
 msgid "editing %s"
 msgstr "промяна на %s"
 
-#: ../IkiWiki/Plugin/edittemplate.pm:51
+#: ../IkiWiki/Plugin/edittemplate.pm:52
 #, fuzzy
 msgid "template not specified"
 msgstr "шаблонът „%s” не е намерен"
 
-#: ../IkiWiki/Plugin/edittemplate.pm:54
+#: ../IkiWiki/Plugin/edittemplate.pm:55
 #, fuzzy
 msgid "match not specified"
 msgstr "не е указан файл на обвивката"
 
-#: ../IkiWiki/Plugin/edittemplate.pm:63
+#: ../IkiWiki/Plugin/edittemplate.pm:64
 #, perl-format
 msgid "edittemplate %s registered for %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/edittemplate.pm:137
+#: ../IkiWiki/Plugin/edittemplate.pm:125 ../IkiWiki/Plugin/inline.pm:339
+#: ../IkiWiki/Plugin/template.pm:44
 #, fuzzy
-msgid "failed to process"
+msgid "failed to process template:"
 msgstr "грешка при обработване на шаблона"
 
-#: ../IkiWiki/Plugin/format.pm:20
+#: ../IkiWiki/Plugin/format.pm:30
 msgid "must specify format and text"
 msgstr ""
 
-#: ../IkiWiki/Plugin/fortune.pm:27
+#: ../IkiWiki/Plugin/fortune.pm:28
 msgid "fortune failed"
 msgstr "грешшка в приставката „fortune”"
 
-#: ../IkiWiki/Plugin/getsource.pm:62 ../IkiWiki/Plugin/goto.pm:55
+#: ../IkiWiki/Plugin/getsource.pm:64 ../IkiWiki/Plugin/goto.pm:58
 #, fuzzy
 msgid "missing page"
 msgstr "липсващ параметър „id” на шаблона"
 
-#: ../IkiWiki/Plugin/getsource.pm:64 ../IkiWiki/Plugin/goto.pm:57
+#: ../IkiWiki/Plugin/getsource.pm:66 ../IkiWiki/Plugin/goto.pm:60
 #, perl-format
 msgid "The page %s does not exist."
 msgstr ""
 
-#: ../IkiWiki/Plugin/getsource.pm:73
+#: ../IkiWiki/Plugin/getsource.pm:75
 #, fuzzy
 msgid "not a page"
 msgstr "грешка при четене на „%s”: %s"
 
-#: ../IkiWiki/Plugin/getsource.pm:75
+#: ../IkiWiki/Plugin/getsource.pm:77
 #, perl-format
 msgid "%s is an attachment, not a page."
 msgstr ""
 
-#: ../IkiWiki/Plugin/git.pm:651 ../IkiWiki/Plugin/git.pm:669
+#: ../IkiWiki/Plugin/git.pm:687 ../IkiWiki/Plugin/git.pm:705
 #: ../IkiWiki/Receive.pm:130
 #, perl-format
 msgid "you are not allowed to change %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/git.pm:691
+#: ../IkiWiki/Plugin/git.pm:727
 #, perl-format
 msgid "you cannot act on a file with mode %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/git.pm:695
+#: ../IkiWiki/Plugin/git.pm:731
 msgid "you are not allowed to change file modes"
 msgstr ""
 
-#: ../IkiWiki/Plugin/google.pm:25 ../IkiWiki/Plugin/po.pm:131
-#: ../IkiWiki/Plugin/search.pm:36
+#: ../IkiWiki/Plugin/google.pm:26 ../IkiWiki/Plugin/po.pm:134
+#: ../IkiWiki/Plugin/search.pm:37
 #, fuzzy, perl-format
 msgid "Must specify %s when using the %s plugin"
 msgstr "При използване на приеставката „search” е необходимо е да се укаже %s"
 
-#: ../IkiWiki/Plugin/graphviz.pm:67
+#: ../IkiWiki/Plugin/graphviz.pm:68
 #, fuzzy
 msgid "failed to run graphviz"
 msgstr "приставката „linkmap”: грешка при изпълнение на „dot”"
 
-#: ../IkiWiki/Plugin/graphviz.pm:94
+#: ../IkiWiki/Plugin/graphviz.pm:90
 msgid "prog not a valid graphviz program"
 msgstr ""
 
-#: ../IkiWiki/Plugin/highlight.pm:47
+#: ../IkiWiki/Plugin/highlight.pm:48
 #, perl-format
 msgid "tohighlight contains unknown file type '%s'"
 msgstr ""
 
-#: ../IkiWiki/Plugin/highlight.pm:58
+#: ../IkiWiki/Plugin/highlight.pm:59
 #, perl-format
 msgid "Source code: %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/highlight.pm:123
+#: ../IkiWiki/Plugin/highlight.pm:124
 msgid ""
 "warning: highlight perl module not available; falling back to pass through"
 msgstr ""
@@ -398,111 +415,120 @@ msgstr ""
 msgid "htmltidy failed to parse this html"
 msgstr "няма разпознати усмивки; изключване на приставката „smiley”"
 
-#: ../IkiWiki/Plugin/img.pm:64
+#: ../IkiWiki/Plugin/img.pm:69
 #, fuzzy
 msgid "Image::Magick is not installed"
 msgstr "не е инсталиран polygen"
 
-#: ../IkiWiki/Plugin/img.pm:68 ../IkiWiki/Plugin/img.pm:112
+#: ../IkiWiki/Plugin/img.pm:73 ../IkiWiki/Plugin/img.pm:117
 #, fuzzy, perl-format
 msgid "failed to read %s: %s"
 msgstr "грешка при запис на файла „%s”: %s"
 
-#: ../IkiWiki/Plugin/img.pm:74
+#: ../IkiWiki/Plugin/img.pm:79
 #, perl-format
 msgid "wrong size format \"%s\" (should be WxH)"
 msgstr ""
 
-#: ../IkiWiki/Plugin/img.pm:120
+#: ../IkiWiki/Plugin/img.pm:125
 #, fuzzy, perl-format
 msgid "failed to resize: %s"
 msgstr "грешка при запис на файла „%s”: %s"
 
-#: ../IkiWiki/Plugin/img.pm:140
+#: ../IkiWiki/Plugin/img.pm:145
 #, fuzzy, perl-format
 msgid "failed to determine size of image %s"
 msgstr "грешка при запис на файла „%s”: %s"
 
-#: ../IkiWiki/Plugin/inline.pm:92
+#: ../IkiWiki/Plugin/inline.pm:93
 msgid "Must specify url to wiki with --url when using --rss or --atom"
 msgstr ""
 "Когато се използва „--rss” или „--atom” трябва да се укаже и "
 "местоположението на уикито посредством параметъра „--url”"
 
-#: ../IkiWiki/Plugin/inline.pm:138
+#: ../IkiWiki/Plugin/inline.pm:139
 #, fuzzy
 msgid "page editing not allowed"
 msgstr "шаблонът „%s” не е намерен"
 
-#: ../IkiWiki/Plugin/inline.pm:155
+#: ../IkiWiki/Plugin/inline.pm:156
 #, fuzzy
 msgid "missing pages parameter"
 msgstr "липсващ параметър „id” на шаблона"
 
-#: ../IkiWiki/Plugin/inline.pm:191
+#: ../IkiWiki/Plugin/inline.pm:192
 #, perl-format
 msgid "the %s and %s parameters cannot be used together"
 msgstr ""
 
-#: ../IkiWiki/Plugin/inline.pm:312
+#: ../IkiWiki/Plugin/inline.pm:313
 msgid "Add a new post titled:"
 msgstr ""
 
-#: ../IkiWiki/Plugin/inline.pm:332
+#: ../IkiWiki/Plugin/inline.pm:342
 #, perl-format
-msgid "nonexistant template %s"
-msgstr ""
+msgid "template %s not found"
+msgstr "шаблонът „%s” не е намерен"
 
-#: ../IkiWiki/Plugin/inline.pm:598
+#: ../IkiWiki/Plugin/inline.pm:633
 msgid "RPC::XML::Client not found, not pinging"
 msgstr "модулът „RPC::XML::Client” не е намерен; източникът не е проверен"
 
-#: ../IkiWiki/Plugin/linkmap.pm:101
+#: ../IkiWiki/Plugin/linkmap.pm:81 ../IkiWiki/Plugin/linkmap.pm:88
+#: ../IkiWiki/Plugin/linkmap.pm:92 ../IkiWiki/Plugin/linkmap.pm:95
 #, fuzzy
 msgid "failed to run dot"
 msgstr "приставката „linkmap”: грешка при изпълнение на „dot”"
 
-#: ../IkiWiki/Plugin/lockedit.pm:47
+#: ../IkiWiki/Plugin/linkmap.pm:85
+msgid "linkmap"
+msgstr ""
+
+#: ../IkiWiki/Plugin/lockedit.pm:49
 #, fuzzy, perl-format
 msgid "%s is locked and cannot be edited"
 msgstr ""
 "Страницата „%s” е заключена от потребителя „%s” и не може да бъде променяна"
 
-#: ../IkiWiki/Plugin/mdwn.pm:44
+#: ../IkiWiki/Plugin/mdwn.pm:45
 msgid "multimarkdown is enabled, but Text::MultiMarkdown is not installed"
 msgstr ""
 
-#: ../IkiWiki/Plugin/mdwn.pm:69
+#: ../IkiWiki/Plugin/mdwn.pm:70
 #, perl-format
 msgid "failed to load Markdown.pm perl module (%s) or /usr/bin/markdown (%s)"
 msgstr ""
 "грешка при зареждането на perl-модула „Markdown.pm” (%s) или „/usr/bin/"
 "markdown” (%s)"
 
-#: ../IkiWiki/Plugin/meta.pm:161
+#: ../IkiWiki/Plugin/meta.pm:174
 #, fuzzy
 msgid "stylesheet not found"
 msgstr "шаблонът „%s” не е намерен"
 
-#: ../IkiWiki/Plugin/meta.pm:199
+#: ../IkiWiki/Plugin/meta.pm:212
 #, fuzzy
 msgid "redir page not found"
 msgstr "шаблонът „%s” не е намерен"
 
-#: ../IkiWiki/Plugin/meta.pm:213
+#: ../IkiWiki/Plugin/meta.pm:226
 #, fuzzy
 msgid "redir cycle is not allowed"
 msgstr "шаблонът „%s” не е намерен"
 
-#: ../IkiWiki/Plugin/mirrorlist.pm:43
+#: ../IkiWiki/Plugin/meta.pm:387
+msgid "sort=meta requires a parameter"
+msgstr ""
+
+#: ../IkiWiki/Plugin/mirrorlist.pm:44
 msgid "Mirrors"
 msgstr "Огледала"
 
-#: ../IkiWiki/Plugin/mirrorlist.pm:43
+#: ../IkiWiki/Plugin/mirrorlist.pm:44
 msgid "Mirror"
 msgstr "Огледало"
 
-#: ../IkiWiki/Plugin/moderatedcomments.pm:41
+#: ../IkiWiki/Plugin/moderatedcomments.pm:57
 msgid "comment needs moderation"
 msgstr ""
 
@@ -510,19 +536,12 @@ msgstr ""
 msgid "more"
 msgstr ""
 
-#: ../IkiWiki/Plugin/norcs.pm:65
-msgid "getctime not implemented"
-msgstr "функцията „getctime” не е реализирана"
-
-#: ../IkiWiki/Plugin/openid.pm:61
-msgid "Log in with"
-msgstr ""
-
-#: ../IkiWiki/Plugin/openid.pm:64
-msgid "Get an OpenID"
-msgstr "Получаване на OpenID номер"
+#: ../IkiWiki/Plugin/openid.pm:58
+#, fuzzy, perl-format
+msgid "failed to load openid module: "
+msgstr "крешка при компилиране на файла %s"
 
-#: ../IkiWiki/Plugin/orphans.pm:55
+#: ../IkiWiki/Plugin/orphans.pm:56
 #, fuzzy
 msgid "All pages have other pages linking to them."
 msgstr "Всички страници имат връзки от други страници."
@@ -531,31 +550,39 @@ msgstr "Всички страници имат връзки от други ст
 msgid "bad or missing template"
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:248
+#: ../IkiWiki/Plugin/passwordauth.pm:231
+msgid "Your user page: "
+msgstr ""
+
+#: ../IkiWiki/Plugin/passwordauth.pm:238
+msgid "Create your user page"
+msgstr ""
+
+#: ../IkiWiki/Plugin/passwordauth.pm:268
 msgid "Account creation successful. Now you can Login."
 msgstr "Акаунтът е създаден. Можете да влезете."
 
-#: ../IkiWiki/Plugin/passwordauth.pm:251
+#: ../IkiWiki/Plugin/passwordauth.pm:271
 msgid "Error creating account."
 msgstr "Грешка при създаване на акаунта."
 
-#: ../IkiWiki/Plugin/passwordauth.pm:258
+#: ../IkiWiki/Plugin/passwordauth.pm:278
 msgid "No email address, so cannot email password reset instructions."
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:292
+#: ../IkiWiki/Plugin/passwordauth.pm:312
 msgid "Failed to send mail"
 msgstr "Грешка при изпращане на поща"
 
-#: ../IkiWiki/Plugin/passwordauth.pm:294
+#: ../IkiWiki/Plugin/passwordauth.pm:314
 msgid "You have been mailed password reset instructions."
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:329
+#: ../IkiWiki/Plugin/passwordauth.pm:349
 msgid "incorrect password reset url"
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:332
+#: ../IkiWiki/Plugin/passwordauth.pm:352
 msgid "password reset denied"
 msgstr ""
 
@@ -586,124 +613,119 @@ msgstr "модулът „RPC::XML::Client” не е намерен; източ
 msgid "warning: Old po4a detected! Recommend upgrade to 0.35."
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:138
+#: ../IkiWiki/Plugin/po.pm:142
 #, perl-format
 msgid "%s is not a valid language code"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:150
+#: ../IkiWiki/Plugin/po.pm:154
 #, perl-format
 msgid ""
 "%s is not a valid value for po_link_to, falling back to po_link_to=default"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:155
+#: ../IkiWiki/Plugin/po.pm:159
 msgid ""
 "po_link_to=negotiated requires usedirs to be enabled, falling back to "
 "po_link_to=default"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:385
+#: ../IkiWiki/Plugin/po.pm:390
 #, perl-format
 msgid "rebuilding all pages to fix meta titles"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:389 ../IkiWiki/Render.pm:638
+#: ../IkiWiki/Plugin/po.pm:394 ../IkiWiki/Render.pm:769
 #, fuzzy, perl-format
 msgid "building %s"
 msgstr "промяна на %s"
 
-#: ../IkiWiki/Plugin/po.pm:427
+#: ../IkiWiki/Plugin/po.pm:432
 msgid "updated PO files"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:451
+#: ../IkiWiki/Plugin/po.pm:456
 msgid ""
 "Can not remove a translation. If the master page is removed, however, its "
 "translations will be removed as well."
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:471
+#: ../IkiWiki/Plugin/po.pm:476
 msgid ""
 "Can not rename a translation. If the master page is renamed, however, its "
 "translations will be renamed as well."
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:870
+#: ../IkiWiki/Plugin/po.pm:876
 #, perl-format
 msgid "POT file (%s) does not exist"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:884
+#: ../IkiWiki/Plugin/po.pm:890
 #, fuzzy, perl-format
 msgid "failed to copy underlay PO file to %s"
 msgstr "крешка при компилиране на файла %s"
 
-#: ../IkiWiki/Plugin/po.pm:893
+#: ../IkiWiki/Plugin/po.pm:899
 #, fuzzy, perl-format
 msgid "failed to update %s"
 msgstr "крешка при компилиране на файла %s"
 
-#: ../IkiWiki/Plugin/po.pm:899
+#: ../IkiWiki/Plugin/po.pm:905
 #, fuzzy, perl-format
 msgid "failed to copy the POT file to %s"
 msgstr "крешка при компилиране на файла %s"
 
-#: ../IkiWiki/Plugin/po.pm:935
+#: ../IkiWiki/Plugin/po.pm:941
 msgid "N/A"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:948
+#: ../IkiWiki/Plugin/po.pm:954
 #, fuzzy, perl-format
 msgid "failed to translate %s"
 msgstr "грешка при запис на файла „%s”: %s"
 
-#: ../IkiWiki/Plugin/po.pm:1032
+#: ../IkiWiki/Plugin/po.pm:1038
 msgid "removed obsolete PO files"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:1095 ../IkiWiki/Plugin/po.pm:1109
-#: ../IkiWiki/Plugin/po.pm:1149
+#: ../IkiWiki/Plugin/po.pm:1094 ../IkiWiki/Plugin/po.pm:1108
+#: ../IkiWiki/Plugin/po.pm:1147
 #, fuzzy, perl-format
 msgid "failed to write %s"
 msgstr "грешка при запис на файла „%s”: %s"
 
-#: ../IkiWiki/Plugin/po.pm:1107
+#: ../IkiWiki/Plugin/po.pm:1106
 #, fuzzy
 msgid "failed to translate"
 msgstr "приставката „linkmap”: грешка при изпълнение на „dot”"
 
-#: ../IkiWiki/Plugin/po.pm:1112
-#, fuzzy, perl-format
-msgid "failed to read %s"
-msgstr "грешка при запис на файла „%s”: %s"
-
-#: ../IkiWiki/Plugin/po.pm:1161
+#: ../IkiWiki/Plugin/po.pm:1159
 msgid "invalid gettext data, go back to previous page to continue edit"
 msgstr ""
 
-#: ../IkiWiki/Plugin/poll.pm:69
+#: ../IkiWiki/Plugin/poll.pm:70
 msgid "vote"
 msgstr "гласуване"
 
-#: ../IkiWiki/Plugin/poll.pm:77
+#: ../IkiWiki/Plugin/poll.pm:78
 msgid "Total votes:"
 msgstr "Общо гласове:"
 
-#: ../IkiWiki/Plugin/polygen.pm:41
+#: ../IkiWiki/Plugin/polygen.pm:42
 msgid "polygen not installed"
 msgstr "не е инсталиран polygen"
 
-#: ../IkiWiki/Plugin/polygen.pm:60
+#: ../IkiWiki/Plugin/polygen.pm:61
 #, fuzzy
 msgid "command failed"
 msgstr "грешшка в приставката „fortune”"
 
-#: ../IkiWiki/Plugin/postsparkline.pm:46
+#: ../IkiWiki/Plugin/postsparkline.pm:47
 msgid "missing formula"
 msgstr ""
 
-#: ../IkiWiki/Plugin/postsparkline.pm:53
+#: ../IkiWiki/Plugin/postsparkline.pm:54
 msgid "unknown formula"
 msgstr ""
 
@@ -771,12 +793,12 @@ msgstr ""
 msgid "at noon on %A"
 msgstr ""
 
-#: ../IkiWiki/Plugin/progress.pm:34
+#: ../IkiWiki/Plugin/progress.pm:35
 #, perl-format
 msgid "illegal percent value %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/progress.pm:55
+#: ../IkiWiki/Plugin/progress.pm:56
 msgid "need either `percent` or `totalpages` and `donepages` parameters"
 msgstr ""
 
@@ -784,41 +806,41 @@ msgstr ""
 msgid "(Diff truncated)"
 msgstr ""
 
-#: ../IkiWiki/Plugin/remove.pm:31 ../IkiWiki/Plugin/rename.pm:36
+#: ../IkiWiki/Plugin/remove.pm:32 ../IkiWiki/Plugin/rename.pm:37
 #, perl-format
 msgid "%s does not exist"
 msgstr ""
 
-#: ../IkiWiki/Plugin/remove.pm:38
+#: ../IkiWiki/Plugin/remove.pm:39
 #, fuzzy, perl-format
 msgid "%s is not in the srcdir, so it cannot be deleted"
 msgstr ""
 "Страницата „%s” е заключена от потребителя „%s” и не може да бъде променяна"
 
-#: ../IkiWiki/Plugin/remove.pm:41 ../IkiWiki/Plugin/rename.pm:45
+#: ../IkiWiki/Plugin/remove.pm:42 ../IkiWiki/Plugin/rename.pm:46
 #, perl-format
 msgid "%s is not a file"
 msgstr ""
 
-#: ../IkiWiki/Plugin/remove.pm:134
+#: ../IkiWiki/Plugin/remove.pm:137
 #, perl-format
 msgid "confirm removal of %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/remove.pm:171
+#: ../IkiWiki/Plugin/remove.pm:174
 msgid "Please select the attachments to remove."
 msgstr ""
 
-#: ../IkiWiki/Plugin/remove.pm:211
+#: ../IkiWiki/Plugin/remove.pm:216
 msgid "removed"
 msgstr ""
 
-#: ../IkiWiki/Plugin/rename.pm:42
+#: ../IkiWiki/Plugin/rename.pm:43
 #, perl-format
 msgid "%s is not in the srcdir, so it cannot be renamed"
 msgstr ""
 
-#: ../IkiWiki/Plugin/rename.pm:62
+#: ../IkiWiki/Plugin/rename.pm:63
 #, fuzzy
 msgid "no change to the file name was specified"
 msgstr "не е указан файл на обвивката"
@@ -843,24 +865,24 @@ msgstr ""
 msgid "rename %s"
 msgstr "обновяване на страницата „%s”"
 
-#: ../IkiWiki/Plugin/rename.pm:161
+#: ../IkiWiki/Plugin/rename.pm:163
 msgid "Also rename SubPages and attachments"
 msgstr ""
 
-#: ../IkiWiki/Plugin/rename.pm:247
+#: ../IkiWiki/Plugin/rename.pm:250
 msgid "Only one attachment can be renamed at a time."
 msgstr ""
 
-#: ../IkiWiki/Plugin/rename.pm:250
+#: ../IkiWiki/Plugin/rename.pm:253
 msgid "Please select the attachment to rename."
 msgstr ""
 
-#: ../IkiWiki/Plugin/rename.pm:347
+#: ../IkiWiki/Plugin/rename.pm:352
 #, perl-format
 msgid "rename %s to %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/rename.pm:571
+#: ../IkiWiki/Plugin/rename.pm:576
 #, fuzzy, perl-format
 msgid "update for rename of %s to %s"
 msgstr "обновяване на страниците от уики „%s”: %s от потребител „%s”"
@@ -875,21 +897,21 @@ msgstr "грешка при запис на файла „%s”: %s"
 msgid "rsync_command exited %d"
 msgstr ""
 
-#: ../IkiWiki/Plugin/search.pm:182
+#: ../IkiWiki/Plugin/search.pm:194
 #, perl-format
 msgid "need Digest::SHA1 to index %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/search.pm:217
+#: ../IkiWiki/Plugin/search.pm:231
 msgid "search"
 msgstr ""
 
-#: ../IkiWiki/Plugin/shortcut.pm:31
+#: ../IkiWiki/Plugin/shortcut.pm:32
 #, perl-format
 msgid "shortcut plugin will not work without %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/shortcut.pm:44
+#: ../IkiWiki/Plugin/shortcut.pm:45
 #, fuzzy
 msgid "missing name or url parameter"
 msgstr "препратката няма указани параметрите „name” или „url”"
@@ -897,7 +919,7 @@ msgstr "препратката няма указани параметрите 
 #. translators: This is used to display what shortcuts are defined.
 #. translators: First parameter is the name of the shortcut, the second
 #. translators: is an URL.
-#: ../IkiWiki/Plugin/shortcut.pm:54
+#: ../IkiWiki/Plugin/shortcut.pm:55
 #, fuzzy, perl-format
 msgid "shortcut %s points to <i>%s</i>"
 msgstr "препратката „%s” сочи към „%s”"
@@ -907,121 +929,123 @@ msgstr "препратката „%s” сочи към „%s”"
 msgid "failed to parse any smileys"
 msgstr "няма разпознати усмивки; изключване на приставката „smiley”"
 
-#: ../IkiWiki/Plugin/sparkline.pm:72
+#: ../IkiWiki/Plugin/sparkline.pm:73
 #, fuzzy
 msgid "parse error"
 msgstr "приставката „linkmap”: грешка при изпълнение на „dot”"
 
-#: ../IkiWiki/Plugin/sparkline.pm:78
+#: ../IkiWiki/Plugin/sparkline.pm:79
 msgid "invalid featurepoint diameter"
 msgstr ""
 
-#: ../IkiWiki/Plugin/sparkline.pm:88
+#: ../IkiWiki/Plugin/sparkline.pm:89
 msgid "invalid featurepoint location"
 msgstr ""
 
-#: ../IkiWiki/Plugin/sparkline.pm:99
+#: ../IkiWiki/Plugin/sparkline.pm:100
 msgid "missing values"
 msgstr ""
 
-#: ../IkiWiki/Plugin/sparkline.pm:104
+#: ../IkiWiki/Plugin/sparkline.pm:105
 #, fuzzy
 msgid "invalid height value"
 msgstr "приставката „linkmap”: грешка при изпълнение на „dot”"
 
-#: ../IkiWiki/Plugin/sparkline.pm:111
+#: ../IkiWiki/Plugin/sparkline.pm:112
 #, fuzzy
 msgid "missing width parameter"
 msgstr "липсващ параметър „id” на шаблона"
 
-#: ../IkiWiki/Plugin/sparkline.pm:115
+#: ../IkiWiki/Plugin/sparkline.pm:116
 #, fuzzy
 msgid "invalid width value"
 msgstr "приставката „linkmap”: грешка при изпълнение на „dot”"
 
-#: ../IkiWiki/Plugin/sparkline.pm:153
+#: ../IkiWiki/Plugin/sparkline.pm:154
 #, fuzzy
 msgid "failed to run php"
 msgstr "приставката „linkmap”: грешка при изпълнение на „dot”"
 
-#: ../IkiWiki/Plugin/table.pm:31
+#: ../IkiWiki/Plugin/table.pm:32
 msgid "cannot find file"
 msgstr ""
 
-#: ../IkiWiki/Plugin/table.pm:87
+#: ../IkiWiki/Plugin/table.pm:88
 msgid "unknown data format"
 msgstr ""
 
-#: ../IkiWiki/Plugin/table.pm:95
+#: ../IkiWiki/Plugin/table.pm:96
 msgid "empty data"
 msgstr ""
 
-#: ../IkiWiki/Plugin/table.pm:114
+#: ../IkiWiki/Plugin/table.pm:115
 msgid "Direct data download"
 msgstr ""
 
-#: ../IkiWiki/Plugin/table.pm:148
+#: ../IkiWiki/Plugin/table.pm:149
 #, fuzzy, perl-format
 msgid "parse fail at line %d: %s"
 msgstr "грешка при запис на файла „%s”: %s"
 
-#: ../IkiWiki/Plugin/template.pm:29
+#: ../IkiWiki/Plugin/tag.pm:83
+#, fuzzy, perl-format
+msgid "creating tag page %s"
+msgstr "създаване на нова страницa „%s”"
+
+#: ../IkiWiki/Plugin/template.pm:33
 #, fuzzy
 msgid "missing id parameter"
 msgstr "липсващ параметър „id” на шаблона"
 
-#: ../IkiWiki/Plugin/template.pm:36
-#, perl-format
-msgid "template %s not found"
+#: ../IkiWiki/Plugin/template.pm:47
+#, fuzzy, perl-format
+msgid "%s not found"
 msgstr "шаблонът „%s” не е намерен"
 
-#: ../IkiWiki/Plugin/template.pm:55
-#, fuzzy
-msgid "failed to process:"
-msgstr "грешка при обработване на шаблона"
-
-#: ../IkiWiki/Plugin/teximg.pm:70
+#: ../IkiWiki/Plugin/teximg.pm:72
 msgid "missing tex code"
 msgstr ""
 
-#: ../IkiWiki/Plugin/teximg.pm:122
+#: ../IkiWiki/Plugin/teximg.pm:124
 #, fuzzy
 msgid "failed to generate image from code"
 msgstr "грешка при запис на файла „%s”: %s"
 
-#: ../IkiWiki/Plugin/websetup.pm:89
-msgid "plugin"
+#: ../IkiWiki/Plugin/websetup.pm:105
+#, perl-format
+msgid "%s plugin:"
+msgstr ""
+
+#: ../IkiWiki/Plugin/websetup.pm:121
+#, perl-format
+msgid "%s plugins"
 msgstr ""
 
-#: ../IkiWiki/Plugin/websetup.pm:108
+#: ../IkiWiki/Plugin/websetup.pm:135
 #, perl-format
 msgid "enable %s?"
 msgstr ""
 
-#: ../IkiWiki/Plugin/websetup.pm:240
+#: ../IkiWiki/Plugin/websetup.pm:276
 msgid "setup file for this wiki is not known"
 msgstr ""
 
-#: ../IkiWiki/Plugin/websetup.pm:256
+#: ../IkiWiki/Plugin/websetup.pm:292
 msgid "main"
 msgstr ""
 
-#: ../IkiWiki/Plugin/websetup.pm:257
-msgid "plugins"
-msgstr ""
-
-#: ../IkiWiki/Plugin/websetup.pm:395
+#: ../IkiWiki/Plugin/websetup.pm:435
 msgid ""
 "The configuration changes shown below require a wiki rebuild to take effect."
 msgstr ""
 
-#: ../IkiWiki/Plugin/websetup.pm:399
+#: ../IkiWiki/Plugin/websetup.pm:439
 msgid ""
 "For the configuration changes shown below to fully take effect, you may need "
 "to rebuild the wiki."
 msgstr ""
 
-#: ../IkiWiki/Plugin/websetup.pm:436
+#: ../IkiWiki/Plugin/websetup.pm:476
 #, perl-format
 msgid "Error: %s exited nonzero (%s). Discarding setup changes."
 msgstr ""
@@ -1036,79 +1060,94 @@ msgstr ""
 msgid "bad file name %s"
 msgstr "пропускане на невалидното име на файл „%s”"
 
-#: ../IkiWiki/Render.pm:150
+#: ../IkiWiki/Render.pm:158
 #, perl-format
 msgid "scanning %s"
 msgstr "сканиране на „%s”"
 
-#: ../IkiWiki/Render.pm:271
+#: ../IkiWiki/Render.pm:280
 #, perl-format
 msgid ""
 "symlink found in srcdir path (%s) -- set allow_symlinks_before_srcdir to "
 "allow this"
 msgstr ""
 
-#: ../IkiWiki/Render.pm:300 ../IkiWiki/Render.pm:327
+#: ../IkiWiki/Render.pm:311
 #, perl-format
 msgid "skipping bad filename %s"
 msgstr "пропускане на невалидното име на файл „%s”"
 
-#: ../IkiWiki/Render.pm:305
+#: ../IkiWiki/Render.pm:327
 #, perl-format
 msgid "%s has multiple possible source pages"
 msgstr ""
 
-#: ../IkiWiki/Render.pm:395
+#: ../IkiWiki/Render.pm:369
 #, perl-format
-msgid "removing old page %s"
+msgid "querying %s for file creation and modification times.."
+msgstr ""
+
+#: ../IkiWiki/Render.pm:431
+#, fuzzy, perl-format
+msgid "removing obsolete %s"
 msgstr "премахване на старата страница „%s”"
 
-#: ../IkiWiki/Render.pm:471
+#: ../IkiWiki/Render.pm:505
 #, fuzzy, perl-format
 msgid "building %s, which links to %s"
 msgstr "обновяване на страницата „%s”, съдържаща препратки към „%s”"
 
-#: ../IkiWiki/Render.pm:480
+#: ../IkiWiki/Render.pm:514
 #, fuzzy, perl-format
 msgid "removing %s, no longer built by %s"
 msgstr "премахване на „%s” понеже не се генерира от „%s”"
 
-#: ../IkiWiki/Render.pm:603
+#: ../IkiWiki/Render.pm:597 ../IkiWiki/Render.pm:679
 #, fuzzy, perl-format
 msgid "building %s, which depends on %s"
 msgstr "обновяване на страницата „%s”, зависеща от „%s”"
 
-#: ../IkiWiki/Render.pm:616
+#: ../IkiWiki/Render.pm:692
 #, fuzzy, perl-format
 msgid "building %s, to update its backlinks"
 msgstr "обновяване на „%s” и осъвременяване на обратните връзки"
 
-#: ../IkiWiki/Render.pm:679
+#: ../IkiWiki/Render.pm:821
 #, fuzzy, perl-format
 msgid "ikiwiki: cannot build %s"
 msgstr "ikiwiki: неуспех при обновяване на страницата „%s”"
 
 #. translators: The first parameter is a filename, and the second
 #. translators: is a (probably not translated) error message.
-#: ../IkiWiki/Setup.pm:19
+#: ../IkiWiki/Setup.pm:23
 #, perl-format
 msgid "cannot read %s: %s"
 msgstr "грешка при четене на „%s”: %s"
 
-#: ../IkiWiki/Setup/Automator.pm:33
+#: ../IkiWiki/Setup.pm:34
+#, fuzzy, perl-format
+msgid "cannot load %s in safe mode"
+msgstr "грешка при четене на „%s”: %s"
+
+#: ../IkiWiki/Setup.pm:46
+#, fuzzy, perl-format
+msgid "failed to parse %s"
+msgstr "крешка при компилиране на файла %s"
+
+#: ../IkiWiki/Setup/Automator.pm:34
 msgid "you must enter a wikiname (that contains alphanumerics)"
 msgstr ""
 
-#: ../IkiWiki/Setup/Automator.pm:76
+#: ../IkiWiki/Setup/Automator.pm:89
 #, perl-format
 msgid "unsupported revision control system %s"
 msgstr ""
 
-#: ../IkiWiki/Setup/Automator.pm:102
+#: ../IkiWiki/Setup/Automator.pm:115
 msgid "failed to set up the repository with ikiwiki-makerepo"
 msgstr ""
 
-#: ../IkiWiki/Setup/Automator.pm:120
+#: ../IkiWiki/Setup/Automator.pm:134
 #, perl-format
 msgid "** Disabling plugin %s, since it is failing with this message:"
 msgstr ""
@@ -1127,13 +1166,13 @@ msgid "wrapper filename not specified"
 msgstr "не е указан файл на обвивката"
 
 #. translators: The parameter is a C filename.
-#: ../IkiWiki/Wrapper.pm:149
+#: ../IkiWiki/Wrapper.pm:160
 #, perl-format
 msgid "failed to compile %s"
 msgstr "крешка при компилиране на файла %s"
 
 #. translators: The parameter is a filename.
-#: ../IkiWiki/Wrapper.pm:169
+#: ../IkiWiki/Wrapper.pm:180
 #, perl-format
 msgid "successfully generated %s"
 msgstr "успешно генериране на %s"
@@ -1146,60 +1185,65 @@ msgstr "формат: ikiwiki [опции] източник местоназна
 msgid "       ikiwiki --setup configfile"
 msgstr ""
 
-#: ../ikiwiki.in:91
+#: ../ikiwiki.in:96
 msgid "usage: --set var=value"
 msgstr ""
 
-#: ../ikiwiki.in:140
+#: ../ikiwiki.in:103
+msgid "usage: --set-yaml var=value"
+msgstr ""
+
+#: ../ikiwiki.in:157
 msgid "generating wrappers.."
 msgstr "генериране на обвивки..."
 
-#: ../ikiwiki.in:195
+#: ../ikiwiki.in:220
 msgid "rebuilding wiki.."
 msgstr "обновяване на уики..."
 
-#: ../ikiwiki.in:198
+#: ../ikiwiki.in:223
 msgid "refreshing wiki.."
 msgstr "осъвременяване на уики..."
 
-#: ../IkiWiki.pm:238
+#: ../IkiWiki.pm:232
 msgid "Discussion"
 msgstr "Дискусия"
 
-#: ../IkiWiki.pm:507
+#: ../IkiWiki.pm:531
 msgid "Must specify url to wiki with --url when using --cgi"
 msgstr ""
 "При използване на пареметъра „--cgi” е необходимо да се укаже и "
 "местоположението на уикито чрез параметъра „--url”"
 
-#: ../IkiWiki.pm:553
+#: ../IkiWiki.pm:577
 msgid "cannot use multiple rcs plugins"
 msgstr ""
 
-#: ../IkiWiki.pm:582
+#: ../IkiWiki.pm:606
 #, perl-format
 msgid "failed to load external plugin needed for %s plugin: %s"
 msgstr ""
 
-#: ../IkiWiki.pm:1264
+#: ../IkiWiki.pm:1298
 #, fuzzy, perl-format
 msgid "preprocessing loop detected on %s at depth %i"
 msgstr "открита е циклична завидимост при %s на „%s” на дълбочина %i"
 
-#: ../IkiWiki.pm:1863
+#: ../IkiWiki.pm:1984
 msgid "yes"
 msgstr ""
 
-#: ../IkiWiki.pm:2006
-msgid "Sort::Naturally needed for title_natural sort"
-msgstr ""
+#: ../IkiWiki.pm:2061
+#, fuzzy, perl-format
+msgid "invalid sort type %s"
+msgstr "непознат вид сортиране „%s”"
 
-#: ../IkiWiki.pm:2017
+#: ../IkiWiki.pm:2082
 #, perl-format
 msgid "unknown sort type %s"
 msgstr "непознат вид сортиране „%s”"
 
-#: ../IkiWiki.pm:2036
+#: ../IkiWiki.pm:2218
 #, fuzzy, perl-format
 msgid "cannot match pages: %s"
 msgstr "грешка при четене на „%s”: %s"
@@ -1224,6 +1268,23 @@ msgstr ""
 msgid "What is the domain name of the web server?"
 msgstr ""
 
+#~ msgid "You need to log in first."
+#~ msgstr "Първо трябва да влезете."
+
+#~ msgid "Get an OpenID"
+#~ msgstr "Получаване на OpenID номер"
+
+#, fuzzy
+#~ msgid "failed to process"
+#~ msgstr "грешка при обработване на шаблона"
+
+#~ msgid "getctime not implemented"
+#~ msgstr "функцията „getctime” не е реализирана"
+
+#, fuzzy
+#~ msgid "failed to read %s"
+#~ msgstr "грешка при запис на файла „%s”: %s"
+
 #~ msgid "discussion"
 #~ msgstr "дискусия"
 
@@ -1278,10 +1339,6 @@ msgstr ""
 #~ "изпълнява като „svn post-commit hook”. Няма да бъдат разпратени "
 #~ "известявания"
 
-#, fuzzy
-#~ msgid "%s not found"
-#~ msgstr "шаблонът „%s” не е намерен"
-
 #~ msgid "What's this?"
 #~ msgstr "Какво е това?"
 
index 37374be28b1dacad68c1232c0a029cceccf36795..c3fb1f83252803c6ce0991db6ecb8a097d547743 100644 (file)
--- a/po/cs.po
+++ b/po/cs.po
@@ -7,19 +7,16 @@ msgid ""
 msgstr ""
 "Project-Id-Version: ikiwiki\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-10-31 18:31-0400\n"
+"POT-Creation-Date: 2010-05-18 14:18-0400\n"
 "PO-Revision-Date: 2009-09-11 20:23+0200\n"
 "Last-Translator: Miroslav Kure <kurem@debian.cz>\n"
 "Language-Team: Czech <debian-l10n-czech@lists.debian.org>\n"
+"Language: cs\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: ../IkiWiki/CGI.pm:114
-msgid "You need to log in first."
-msgstr "Nejprve se musíte přihlásit."
-
-#: ../IkiWiki/CGI.pm:147
+#: ../IkiWiki/CGI.pm:162
 msgid ""
 "probable misconfiguration: sslcookie is set, but you are attempting to login "
 "via http, not https"
@@ -27,35 +24,35 @@ msgstr ""
 "pravděpodobná chyba konfigurace: je nastavena proměnná sslcookie, ale "
 "Ezkoušíte se přihlásit přes http a ne přes https"
 
-#: ../IkiWiki/CGI.pm:150
+#: ../IkiWiki/CGI.pm:165
 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:169 ../IkiWiki/CGI.pm:314
+#: ../IkiWiki/CGI.pm:184 ../IkiWiki/CGI.pm:335
 msgid "Your login session has expired."
 msgstr "Vaše sezení expirovalo."
 
-#: ../IkiWiki/CGI.pm:190
+#: ../IkiWiki/CGI.pm:205
 msgid "Login"
 msgstr "Přihlášení"
 
-#: ../IkiWiki/CGI.pm:191
+#: ../IkiWiki/CGI.pm:206
 msgid "Preferences"
 msgstr "Předvolby"
 
-#: ../IkiWiki/CGI.pm:192
+#: ../IkiWiki/CGI.pm:207
 msgid "Admin"
 msgstr "Správce"
 
-#: ../IkiWiki/CGI.pm:232
+#: ../IkiWiki/CGI.pm:247
 msgid "Preferences saved."
 msgstr "Nastavení uloženo."
 
-#: ../IkiWiki/CGI.pm:278
+#: ../IkiWiki/CGI.pm:299
 msgid "You are banned."
 msgstr "Jste vyhoštěni."
 
-#: ../IkiWiki/CGI.pm:405 ../IkiWiki/CGI.pm:406 ../IkiWiki.pm:1282
+#: ../IkiWiki/CGI.pm:426 ../IkiWiki/CGI.pm:427 ../IkiWiki.pm:1316
 msgid "Error"
 msgstr "Chyba"
 
@@ -136,7 +133,7 @@ msgstr "vytvářím novou stránku %s"
 msgid "deleting bucket.."
 msgstr "mažu bucket..."
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:206
+#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:231
 msgid "done"
 msgstr "hotovo"
 
@@ -145,40 +142,40 @@ msgstr "hotovo"
 msgid "Must specify %s"
 msgstr "Musíte zadat %s"
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:136
+#: ../IkiWiki/Plugin/amazon_s3.pm:140
 msgid "Failed to create S3 bucket: "
 msgstr "Nepodařilo se vytvořit S3 bucket:"
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:221
+#: ../IkiWiki/Plugin/amazon_s3.pm:225
 msgid "Failed to save file to S3: "
 msgstr "Nepodařilo se uložit soubor na S3:"
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:243
+#: ../IkiWiki/Plugin/amazon_s3.pm:247
 msgid "Failed to delete file from S3: "
 msgstr "Nelze smazat soubor z S3:"
 
-#: ../IkiWiki/Plugin/attachment.pm:49
+#: ../IkiWiki/Plugin/attachment.pm:50
 #, perl-format
 msgid "there is already a page named %s"
 msgstr "stránka nazvaná %s již existuje"
 
-#: ../IkiWiki/Plugin/attachment.pm:65
+#: ../IkiWiki/Plugin/attachment.pm:66
 msgid "prohibited by allowed_attachments"
 msgstr "zakázáno proměnnou allowed_attachments"
 
-#: ../IkiWiki/Plugin/attachment.pm:140
+#: ../IkiWiki/Plugin/attachment.pm:141
 msgid "bad attachment filename"
 msgstr "chybné jméno souboru s přílohou"
 
-#: ../IkiWiki/Plugin/attachment.pm:182
+#: ../IkiWiki/Plugin/attachment.pm:183
 msgid "attachment upload"
 msgstr "příloha nahrána"
 
-#: ../IkiWiki/Plugin/autoindex.pm:105
+#: ../IkiWiki/Plugin/autoindex.pm:117
 msgid "automatic index generation"
 msgstr "automatické vytváření indexu"
 
-#: ../IkiWiki/Plugin/blogspam.pm:108
+#: ../IkiWiki/Plugin/blogspam.pm:109
 msgid ""
 "Sorry, but that looks like spam to <a href=\"http://blogspam.net/"
 "\">blogspam</a>: "
@@ -195,192 +192,215 @@ msgstr "%s z %s"
 msgid "There are no broken links!"
 msgstr "Žádné porušené odkazy!"
 
-#: ../IkiWiki/Plugin/comments.pm:124 ../IkiWiki/Plugin/format.pm:38
+#: ../IkiWiki/Plugin/comments.pm:112
+#, fuzzy, perl-format
+msgid "this comment needs %s"
+msgstr "komentář k %s"
+
+#: ../IkiWiki/Plugin/comments.pm:115
+#, fuzzy
+msgid "moderation"
+msgstr "Schvalování komentářů"
+
+#: ../IkiWiki/Plugin/comments.pm:136 ../IkiWiki/Plugin/format.pm:48
 #, perl-format
 msgid "unsupported page format %s"
 msgstr "nepodporovaný formát stránky %s"
 
-#: ../IkiWiki/Plugin/comments.pm:129
+#: ../IkiWiki/Plugin/comments.pm:141
 msgid "comment must have content"
 msgstr "komentář musí mít obsah"
 
-#: ../IkiWiki/Plugin/comments.pm:185
+#: ../IkiWiki/Plugin/comments.pm:196
 msgid "Anonymous"
 msgstr "Anonym"
 
-#: ../IkiWiki/Plugin/comments.pm:340 ../IkiWiki/Plugin/editpage.pm:97
+#: ../IkiWiki/Plugin/comments.pm:357 ../IkiWiki/Plugin/editpage.pm:98
 msgid "bad page name"
 msgstr "chybný název stránky"
 
-#: ../IkiWiki/Plugin/comments.pm:345
+#: ../IkiWiki/Plugin/comments.pm:362
 #, perl-format
 msgid "commenting on %s"
 msgstr "komentář k %s"
 
-#: ../IkiWiki/Plugin/comments.pm:363
+#: ../IkiWiki/Plugin/comments.pm:380
 #, perl-format
 msgid "page '%s' doesn't exist, so you can't comment"
 msgstr "stránka „%s“ neexistuje, takže nemůžete komentovat"
 
-#: ../IkiWiki/Plugin/comments.pm:370
+#: ../IkiWiki/Plugin/comments.pm:387
 #, perl-format
 msgid "comments on page '%s' are closed"
 msgstr "komentáře na stránce „%s“ jsou uzamčeny"
 
-#: ../IkiWiki/Plugin/comments.pm:464
+#: ../IkiWiki/Plugin/comments.pm:490
 msgid "comment stored for moderation"
 msgstr "komentář uložen pro schválení"
 
-#: ../IkiWiki/Plugin/comments.pm:466
+#: ../IkiWiki/Plugin/comments.pm:492
 msgid "Your comment will be posted after moderator review"
 msgstr "Váš komentář bude zobrazen po schválení moderátorem"
 
-#: ../IkiWiki/Plugin/comments.pm:479
+#: ../IkiWiki/Plugin/comments.pm:505
 msgid "Added a comment"
 msgstr "Přidán komentář"
 
-#: ../IkiWiki/Plugin/comments.pm:483
+#: ../IkiWiki/Plugin/comments.pm:509
 #, perl-format
 msgid "Added a comment: %s"
 msgstr "Přidán komentář: %s"
 
-#: ../IkiWiki/Plugin/comments.pm:525 ../IkiWiki/Plugin/websetup.pm:236
+#: ../IkiWiki/Plugin/comments.pm:551 ../IkiWiki/Plugin/websetup.pm:272
 msgid "you are not logged in as an admin"
 msgstr "nejste přihlášeni jako správce"
 
-#: ../IkiWiki/Plugin/comments.pm:576
+#: ../IkiWiki/Plugin/comments.pm:602
 msgid "Comment moderation"
 msgstr "Schvalování komentářů"
 
-#: ../IkiWiki/Plugin/comments.pm:615
+#: ../IkiWiki/Plugin/comments.pm:640
 msgid "comment moderation"
 msgstr "schvalování komentářů"
 
-#: ../IkiWiki/Plugin/comments.pm:766
-msgid "Comments"
+#: ../IkiWiki/Plugin/comments.pm:789
+#, fuzzy, perl-format
+msgid "%i comment"
+msgid_plural "%i comments"
+msgstr[0] "Komentáře"
+msgstr[1] "Komentáře"
+
+#. translators: Here "Comment" is a verb;
+#. translators: the user clicks on it to
+#. translators: post a comment.
+#: ../IkiWiki/Plugin/comments.pm:799
+#, fuzzy
+msgid "Comment"
 msgstr "Komentáře"
 
-#: ../IkiWiki/Plugin/conditional.pm:27 ../IkiWiki/Plugin/cutpaste.pm:30
-#: ../IkiWiki/Plugin/cutpaste.pm:45 ../IkiWiki/Plugin/cutpaste.pm:61
+#: ../IkiWiki/Plugin/conditional.pm:28 ../IkiWiki/Plugin/cutpaste.pm:31
+#: ../IkiWiki/Plugin/cutpaste.pm:46 ../IkiWiki/Plugin/cutpaste.pm:62
 #: ../IkiWiki/Plugin/testpagespec.pm:26
 #, perl-format
 msgid "%s parameter is required"
 msgstr "parametr %s je povinný"
 
-#: ../IkiWiki/Plugin/cutpaste.pm:66
+#: ../IkiWiki/Plugin/cutpaste.pm:67
 msgid "no text was copied in this page"
 msgstr "na této stránce nebyl zkopírován žádný text"
 
-#: ../IkiWiki/Plugin/cutpaste.pm:69
+#: ../IkiWiki/Plugin/cutpaste.pm:70
 #, perl-format
 msgid "no text was copied in this page with id %s"
 msgstr "na této stránce nebyl zkopírován žádný text s id %s"
 
-#: ../IkiWiki/Plugin/editpage.pm:40
+#: ../IkiWiki/Plugin/editpage.pm:41
 #, perl-format
 msgid "removing old preview %s"
 msgstr "odstraňuji starý náhled %s"
 
-#: ../IkiWiki/Plugin/editpage.pm:113
+#: ../IkiWiki/Plugin/editpage.pm:114
 #, perl-format
 msgid "%s is not an editable page"
 msgstr "%s není editovatelná stránka"
 
-#: ../IkiWiki/Plugin/editpage.pm:292
+#: ../IkiWiki/Plugin/editpage.pm:294
 #, perl-format
 msgid "creating %s"
 msgstr "vytvářím %s"
 
-#: ../IkiWiki/Plugin/editpage.pm:310 ../IkiWiki/Plugin/editpage.pm:329
-#: ../IkiWiki/Plugin/editpage.pm:339 ../IkiWiki/Plugin/editpage.pm:383
-#: ../IkiWiki/Plugin/editpage.pm:422
+#: ../IkiWiki/Plugin/editpage.pm:312 ../IkiWiki/Plugin/editpage.pm:331
+#: ../IkiWiki/Plugin/editpage.pm:341 ../IkiWiki/Plugin/editpage.pm:385
+#: ../IkiWiki/Plugin/editpage.pm:424
 #, perl-format
 msgid "editing %s"
 msgstr "upravuji %s"
 
-#: ../IkiWiki/Plugin/edittemplate.pm:51
+#: ../IkiWiki/Plugin/edittemplate.pm:52
 msgid "template not specified"
 msgstr "nebyl zadán parametr template"
 
-#: ../IkiWiki/Plugin/edittemplate.pm:54
+#: ../IkiWiki/Plugin/edittemplate.pm:55
 msgid "match not specified"
 msgstr "nebyl zadán parametr match"
 
-#: ../IkiWiki/Plugin/edittemplate.pm:63
+#: ../IkiWiki/Plugin/edittemplate.pm:64
 #, perl-format
 msgid "edittemplate %s registered for %s"
 msgstr "edittemplate %s byla zaregistrována pro %s"
 
-#: ../IkiWiki/Plugin/edittemplate.pm:137
-msgid "failed to process"
-msgstr "nepodařilo se zpracovat"
+#: ../IkiWiki/Plugin/edittemplate.pm:125 ../IkiWiki/Plugin/inline.pm:339
+#: ../IkiWiki/Plugin/template.pm:44
+#, fuzzy
+msgid "failed to process template:"
+msgstr "nepodařilo se zpracovat:"
 
-#: ../IkiWiki/Plugin/format.pm:20
+#: ../IkiWiki/Plugin/format.pm:30
 msgid "must specify format and text"
 msgstr "musíte zadat formát a text"
 
-#: ../IkiWiki/Plugin/fortune.pm:27
+#: ../IkiWiki/Plugin/fortune.pm:28
 msgid "fortune failed"
 msgstr "fortune selhal"
 
-#: ../IkiWiki/Plugin/getsource.pm:62 ../IkiWiki/Plugin/goto.pm:55
+#: ../IkiWiki/Plugin/getsource.pm:64 ../IkiWiki/Plugin/goto.pm:58
 msgid "missing page"
 msgstr "chybějící stránka"
 
-#: ../IkiWiki/Plugin/getsource.pm:64 ../IkiWiki/Plugin/goto.pm:57
+#: ../IkiWiki/Plugin/getsource.pm:66 ../IkiWiki/Plugin/goto.pm:60
 #, perl-format
 msgid "The page %s does not exist."
 msgstr "Stránka %s neexistuje."
 
-#: ../IkiWiki/Plugin/getsource.pm:73
+#: ../IkiWiki/Plugin/getsource.pm:75
 msgid "not a page"
 msgstr "není stránkou"
 
-#: ../IkiWiki/Plugin/getsource.pm:75
+#: ../IkiWiki/Plugin/getsource.pm:77
 #, perl-format
 msgid "%s is an attachment, not a page."
 msgstr "%s není ani příloha, ani stránka."
 
-#: ../IkiWiki/Plugin/git.pm:651 ../IkiWiki/Plugin/git.pm:669
+#: ../IkiWiki/Plugin/git.pm:687 ../IkiWiki/Plugin/git.pm:705
 #: ../IkiWiki/Receive.pm:130
 #, perl-format
 msgid "you are not allowed to change %s"
 msgstr "nejste oprávněni měnit %s"
 
-#: ../IkiWiki/Plugin/git.pm:691
+#: ../IkiWiki/Plugin/git.pm:727
 #, perl-format
 msgid "you cannot act on a file with mode %s"
 msgstr "nemůžete pracovat se souborem s přístupovým oprávněními %s"
 
-#: ../IkiWiki/Plugin/git.pm:695
+#: ../IkiWiki/Plugin/git.pm:731
 msgid "you are not allowed to change file modes"
 msgstr "nejste oprávněni měnit přístupová oprávnění souborů"
 
-#: ../IkiWiki/Plugin/google.pm:25 ../IkiWiki/Plugin/po.pm:131
-#: ../IkiWiki/Plugin/search.pm:36
+#: ../IkiWiki/Plugin/google.pm:26 ../IkiWiki/Plugin/po.pm:134
+#: ../IkiWiki/Plugin/search.pm:37
 #, perl-format
 msgid "Must specify %s when using the %s plugin"
 msgstr "%s musíte zadat při každém použití modulu %s"
 
-#: ../IkiWiki/Plugin/graphviz.pm:67
+#: ../IkiWiki/Plugin/graphviz.pm:68
 msgid "failed to run graphviz"
 msgstr "nepodařilo se spustit graphviz"
 
-#: ../IkiWiki/Plugin/graphviz.pm:94
+#: ../IkiWiki/Plugin/graphviz.pm:90
 msgid "prog not a valid graphviz program"
 msgstr "program není platným programem graphviz"
 
-#: ../IkiWiki/Plugin/highlight.pm:47
+#: ../IkiWiki/Plugin/highlight.pm:48
 #, perl-format
 msgid "tohighlight contains unknown file type '%s'"
 msgstr "tohighlight obsahuje neznámý typ souboru „%s“"
 
-#: ../IkiWiki/Plugin/highlight.pm:58
+#: ../IkiWiki/Plugin/highlight.pm:59
 #, perl-format
 msgid "Source code: %s"
 msgstr "Zdrojový kód: %s"
 
-#: ../IkiWiki/Plugin/highlight.pm:123
+#: ../IkiWiki/Plugin/highlight.pm:124
 msgid ""
 "warning: highlight perl module not available; falling back to pass through"
 msgstr "varování: perlový modul highlight není dostupný; pokračuji bez něj"
@@ -389,100 +409,110 @@ msgstr "varování: perlový modul highlight není dostupný; pokračuji bez ně
 msgid "htmltidy failed to parse this html"
 msgstr "htmltidy se nepodařilo zpracovat toto html"
 
-#: ../IkiWiki/Plugin/img.pm:64
+#: ../IkiWiki/Plugin/img.pm:69
 msgid "Image::Magick is not installed"
 msgstr "Image::Magick není nainstalován"
 
-#: ../IkiWiki/Plugin/img.pm:68 ../IkiWiki/Plugin/img.pm:112
+#: ../IkiWiki/Plugin/img.pm:73 ../IkiWiki/Plugin/img.pm:117
 #, perl-format
 msgid "failed to read %s: %s"
 msgstr "nelze číst %s: %s"
 
-#: ../IkiWiki/Plugin/img.pm:74
+#: ../IkiWiki/Plugin/img.pm:79
 #, perl-format
 msgid "wrong size format \"%s\" (should be WxH)"
 msgstr "chybné rozměry „%s“ (formát má být ŠxV)"
 
-#: ../IkiWiki/Plugin/img.pm:120
+#: ../IkiWiki/Plugin/img.pm:125
 #, perl-format
 msgid "failed to resize: %s"
 msgstr "nelze změnit velikost: %s"
 
-#: ../IkiWiki/Plugin/img.pm:140
+#: ../IkiWiki/Plugin/img.pm:145
 #, perl-format
 msgid "failed to determine size of image %s"
 msgstr "nelze určit velikost obrázku %s"
 
-#: ../IkiWiki/Plugin/inline.pm:92
+#: ../IkiWiki/Plugin/inline.pm:93
 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:138
+#: ../IkiWiki/Plugin/inline.pm:139
 msgid "page editing not allowed"
 msgstr "úprava stránky není povolena"
 
-#: ../IkiWiki/Plugin/inline.pm:155
+#: ../IkiWiki/Plugin/inline.pm:156
 msgid "missing pages parameter"
 msgstr "chybí parametr pages"
 
-#: ../IkiWiki/Plugin/inline.pm:191
+#: ../IkiWiki/Plugin/inline.pm:192
 #, perl-format
 msgid "the %s and %s parameters cannot be used together"
 msgstr "parametry %s a %s nelze použít zároveň"
 
-#: ../IkiWiki/Plugin/inline.pm:312
+#: ../IkiWiki/Plugin/inline.pm:313
 msgid "Add a new post titled:"
 msgstr "Přidat nový příspěvek nazvaný:"
 
-#: ../IkiWiki/Plugin/inline.pm:332
+#: ../IkiWiki/Plugin/inline.pm:342
 #, perl-format
-msgid "nonexistant template %s"
-msgstr "neexistující šablona %s"
+msgid "template %s not found"
+msgstr "šablona %s nebyla nalezena"
 
-#: ../IkiWiki/Plugin/inline.pm:598
+#: ../IkiWiki/Plugin/inline.pm:633
 msgid "RPC::XML::Client not found, not pinging"
 msgstr "RPC::XML::Client nebyl nalezen, nepinkám"
 
-#: ../IkiWiki/Plugin/linkmap.pm:101
+#: ../IkiWiki/Plugin/linkmap.pm:81 ../IkiWiki/Plugin/linkmap.pm:88
+#: ../IkiWiki/Plugin/linkmap.pm:92 ../IkiWiki/Plugin/linkmap.pm:95
 msgid "failed to run dot"
 msgstr "nepodařilo se spustit dot"
 
-#: ../IkiWiki/Plugin/lockedit.pm:47
+#: ../IkiWiki/Plugin/linkmap.pm:85
+msgid "linkmap"
+msgstr ""
+
+#: ../IkiWiki/Plugin/lockedit.pm:49
 #, perl-format
 msgid "%s is locked and cannot be edited"
 msgstr "Stránka %s je zamknutá a nelze ji měnit"
 
-#: ../IkiWiki/Plugin/mdwn.pm:44
+#: ../IkiWiki/Plugin/mdwn.pm:45
 msgid "multimarkdown is enabled, but Text::MultiMarkdown is not installed"
 msgstr "je povolen multimarkdown, ale Text::MultiMarkdown není nainstalován"
 
-#: ../IkiWiki/Plugin/mdwn.pm:69
+#: ../IkiWiki/Plugin/mdwn.pm:70
 #, perl-format
 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:161
+#: ../IkiWiki/Plugin/meta.pm:174
 msgid "stylesheet not found"
 msgstr "styl nebyl nalezen"
 
-#: ../IkiWiki/Plugin/meta.pm:199
+#: ../IkiWiki/Plugin/meta.pm:212
 msgid "redir page not found"
 msgstr "stránka, na kterou vede přesměrování, nebyla nalezena"
 
-#: ../IkiWiki/Plugin/meta.pm:213
+#: ../IkiWiki/Plugin/meta.pm:226
 msgid "redir cycle is not allowed"
 msgstr "cykly nejsou v přesměrování povoleny"
 
-#: ../IkiWiki/Plugin/mirrorlist.pm:43
+#: ../IkiWiki/Plugin/meta.pm:387
+#, fuzzy
+msgid "sort=meta requires a parameter"
+msgstr "vyžaduje parametry „from“ a „to“"
+
+#: ../IkiWiki/Plugin/mirrorlist.pm:44
 msgid "Mirrors"
 msgstr "Zrcadla"
 
-#: ../IkiWiki/Plugin/mirrorlist.pm:43
+#: ../IkiWiki/Plugin/mirrorlist.pm:44
 msgid "Mirror"
 msgstr "Zrcadlo"
 
-#: ../IkiWiki/Plugin/moderatedcomments.pm:41
+#: ../IkiWiki/Plugin/moderatedcomments.pm:57
 #, fuzzy
 msgid "comment needs moderation"
 msgstr "schvalování komentářů"
@@ -491,19 +521,12 @@ msgstr "schvalování komentářů"
 msgid "more"
 msgstr "více"
 
-#: ../IkiWiki/Plugin/norcs.pm:65
-msgid "getctime not implemented"
-msgstr "getctime není implementováno"
-
-#: ../IkiWiki/Plugin/openid.pm:61
-msgid "Log in with"
-msgstr "Přihlásit pomocí"
-
-#: ../IkiWiki/Plugin/openid.pm:64
-msgid "Get an OpenID"
-msgstr "Získat OpenID"
+#: ../IkiWiki/Plugin/openid.pm:58
+#, fuzzy, perl-format
+msgid "failed to load openid module: "
+msgstr "nelze zkompilovat %s"
 
-#: ../IkiWiki/Plugin/orphans.pm:55
+#: ../IkiWiki/Plugin/orphans.pm:56
 msgid "All pages have other pages linking to them."
 msgstr "Na každou stránku vede odkaz z jiné stránky."
 
@@ -511,31 +534,39 @@ msgstr "Na každou stránku vede odkaz z jiné stránky."
 msgid "bad or missing template"
 msgstr "chybná nebo chybějící šablona"
 
-#: ../IkiWiki/Plugin/passwordauth.pm:248
+#: ../IkiWiki/Plugin/passwordauth.pm:231
+msgid "Your user page: "
+msgstr ""
+
+#: ../IkiWiki/Plugin/passwordauth.pm:238
+msgid "Create your user page"
+msgstr ""
+
+#: ../IkiWiki/Plugin/passwordauth.pm:268
 msgid "Account creation successful. Now you can Login."
 msgstr "Vytvoření účtu bylo úspěšné. Nyní se můžete přihlásit."
 
-#: ../IkiWiki/Plugin/passwordauth.pm:251
+#: ../IkiWiki/Plugin/passwordauth.pm:271
 msgid "Error creating account."
 msgstr "Chyba při vytváření účtu."
 
-#: ../IkiWiki/Plugin/passwordauth.pm:258
+#: ../IkiWiki/Plugin/passwordauth.pm:278
 msgid "No email address, so cannot email password reset instructions."
 msgstr "Bez e-mailové adresy nelze zaslat postup na resetování hesla."
 
-#: ../IkiWiki/Plugin/passwordauth.pm:292
+#: ../IkiWiki/Plugin/passwordauth.pm:312
 msgid "Failed to send mail"
 msgstr "Nepodařilo se odeslat email."
 
-#: ../IkiWiki/Plugin/passwordauth.pm:294
+#: ../IkiWiki/Plugin/passwordauth.pm:314
 msgid "You have been mailed password reset instructions."
 msgstr "Postup na resetování hesla vám byl odeslán na e-mail."
 
-#: ../IkiWiki/Plugin/passwordauth.pm:329
+#: ../IkiWiki/Plugin/passwordauth.pm:349
 msgid "incorrect password reset url"
 msgstr "chybné URL pro resetování hesla"
 
-#: ../IkiWiki/Plugin/passwordauth.pm:332
+#: ../IkiWiki/Plugin/passwordauth.pm:352
 msgid "password reset denied"
 msgstr "resetování hesla bylo zamítnuto"
 
@@ -565,40 +596,40 @@ msgstr "LWP nebyl nalezen, nepinkám"
 msgid "warning: Old po4a detected! Recommend upgrade to 0.35."
 msgstr "varování: rozpoznána stará verze po4a, doporučen přechod na 0.35."
 
-#: ../IkiWiki/Plugin/po.pm:138
+#: ../IkiWiki/Plugin/po.pm:142
 #, perl-format
 msgid "%s is not a valid language code"
 msgstr "%s není platným kódem jazyka"
 
-#: ../IkiWiki/Plugin/po.pm:150
+#: ../IkiWiki/Plugin/po.pm:154
 #, perl-format
 msgid ""
 "%s is not a valid value for po_link_to, falling back to po_link_to=default"
 msgstr ""
 "%s není platnou hodnotou parametru po_link_to, používám po_link_to=default"
 
-#: ../IkiWiki/Plugin/po.pm:155
+#: ../IkiWiki/Plugin/po.pm:159
 msgid ""
 "po_link_to=negotiated requires usedirs to be enabled, falling back to "
 "po_link_to=default"
 msgstr ""
 "po_link_to=negotiated vyžaduje zapnuté usedirs, používám po_link_to=default"
 
-#: ../IkiWiki/Plugin/po.pm:385
+#: ../IkiWiki/Plugin/po.pm:390
 #, perl-format
 msgid "rebuilding all pages to fix meta titles"
 msgstr "znovusestavuji všechny stránky, aby se opravily meta nadpisy"
 
-#: ../IkiWiki/Plugin/po.pm:389 ../IkiWiki/Render.pm:638
+#: ../IkiWiki/Plugin/po.pm:394 ../IkiWiki/Render.pm:769
 #, perl-format
 msgid "building %s"
 msgstr "sestavuji %s"
 
-#: ../IkiWiki/Plugin/po.pm:427
+#: ../IkiWiki/Plugin/po.pm:432
 msgid "updated PO files"
 msgstr "aktualizovány PO soubory"
 
-#: ../IkiWiki/Plugin/po.pm:451
+#: ../IkiWiki/Plugin/po.pm:456
 msgid ""
 "Can not remove a translation. If the master page is removed, however, its "
 "translations will be removed as well."
@@ -606,7 +637,7 @@ msgstr ""
 "Nemohu odstranit překlad. Nicméně pokud bude odstraněna hlavní stránka, "
 "budou odstraněny také její překlady."
 
-#: ../IkiWiki/Plugin/po.pm:471
+#: ../IkiWiki/Plugin/po.pm:476
 msgid ""
 "Can not rename a translation. If the master page is renamed, however, its "
 "translations will be renamed as well."
@@ -614,81 +645,76 @@ msgstr ""
 "Nemohu přejmenovat překlad. Nicméně pokud bude přejmenována hlavní stránka, "
 "budou přejmenovány také její překlady."
 
-#: ../IkiWiki/Plugin/po.pm:870
+#: ../IkiWiki/Plugin/po.pm:876
 #, perl-format
 msgid "POT file (%s) does not exist"
 msgstr "POT soubor (%s) neexistuje"
 
-#: ../IkiWiki/Plugin/po.pm:884
+#: ../IkiWiki/Plugin/po.pm:890
 #, perl-format
 msgid "failed to copy underlay PO file to %s"
 msgstr "nepodařilo se zkopírovat PO soubor na %s"
 
-#: ../IkiWiki/Plugin/po.pm:893
+#: ../IkiWiki/Plugin/po.pm:899
 #, perl-format
 msgid "failed to update %s"
 msgstr "nepodařilo se aktualizovat %s"
 
-#: ../IkiWiki/Plugin/po.pm:899
+#: ../IkiWiki/Plugin/po.pm:905
 #, perl-format
 msgid "failed to copy the POT file to %s"
 msgstr "nepodařilo se zkopírovat POT soubor na %s"
 
-#: ../IkiWiki/Plugin/po.pm:935
+#: ../IkiWiki/Plugin/po.pm:941
 msgid "N/A"
 msgstr "N/A"
 
-#: ../IkiWiki/Plugin/po.pm:948
+#: ../IkiWiki/Plugin/po.pm:954
 #, perl-format
 msgid "failed to translate %s"
 msgstr "nepodařilo se přeložit %s"
 
-#: ../IkiWiki/Plugin/po.pm:1032
+#: ../IkiWiki/Plugin/po.pm:1038
 msgid "removed obsolete PO files"
 msgstr "odstraněny zastaralé PO soubory"
 
-#: ../IkiWiki/Plugin/po.pm:1095 ../IkiWiki/Plugin/po.pm:1109
-#: ../IkiWiki/Plugin/po.pm:1149
+#: ../IkiWiki/Plugin/po.pm:1094 ../IkiWiki/Plugin/po.pm:1108
+#: ../IkiWiki/Plugin/po.pm:1147
 #, perl-format
 msgid "failed to write %s"
 msgstr "nepodařilo se zapsat %s"
 
-#: ../IkiWiki/Plugin/po.pm:1107
+#: ../IkiWiki/Plugin/po.pm:1106
 msgid "failed to translate"
 msgstr "překlad se nezdařil"
 
-#: ../IkiWiki/Plugin/po.pm:1112
-#, perl-format
-msgid "failed to read %s"
-msgstr "nepodařilo se přečíst %s"
-
-#: ../IkiWiki/Plugin/po.pm:1161
+#: ../IkiWiki/Plugin/po.pm:1159
 msgid "invalid gettext data, go back to previous page to continue edit"
 msgstr ""
 "neplatná gettext data, pro pokračování v úpravách se vraťte na předchozí "
 "stránku"
 
-#: ../IkiWiki/Plugin/poll.pm:69
+#: ../IkiWiki/Plugin/poll.pm:70
 msgid "vote"
 msgstr "hlasovat"
 
-#: ../IkiWiki/Plugin/poll.pm:77
+#: ../IkiWiki/Plugin/poll.pm:78
 msgid "Total votes:"
 msgstr "Celkem hlasů:"
 
-#: ../IkiWiki/Plugin/polygen.pm:41
+#: ../IkiWiki/Plugin/polygen.pm:42
 msgid "polygen not installed"
 msgstr "polygen není nainstalován"
 
-#: ../IkiWiki/Plugin/polygen.pm:60
+#: ../IkiWiki/Plugin/polygen.pm:61
 msgid "command failed"
 msgstr "příkaz selhal"
 
-#: ../IkiWiki/Plugin/postsparkline.pm:46
+#: ../IkiWiki/Plugin/postsparkline.pm:47
 msgid "missing formula"
 msgstr "chybí vzorec"
 
-#: ../IkiWiki/Plugin/postsparkline.pm:53
+#: ../IkiWiki/Plugin/postsparkline.pm:54
 msgid "unknown formula"
 msgstr "neznámý vzorec"
 
@@ -756,12 +782,12 @@ msgstr "o půlnoci"
 msgid "at noon on %A"
 msgstr "%A o poledni"
 
-#: ../IkiWiki/Plugin/progress.pm:34
+#: ../IkiWiki/Plugin/progress.pm:35
 #, perl-format
 msgid "illegal percent value %s"
 msgstr "neplatná procentuální hodnota %s"
 
-#: ../IkiWiki/Plugin/progress.pm:55
+#: ../IkiWiki/Plugin/progress.pm:56
 msgid "need either `percent` or `totalpages` and `donepages` parameters"
 msgstr "potřebuji buď parametr `percent`, nebo `totalpages` a `donepages`"
 
@@ -769,40 +795,40 @@ msgstr "potřebuji buď parametr `percent`, nebo `totalpages` a `donepages`"
 msgid "(Diff truncated)"
 msgstr "(Diff oříznut)"
 
-#: ../IkiWiki/Plugin/remove.pm:31 ../IkiWiki/Plugin/rename.pm:36
+#: ../IkiWiki/Plugin/remove.pm:32 ../IkiWiki/Plugin/rename.pm:37
 #, perl-format
 msgid "%s does not exist"
 msgstr "%s neexistuje"
 
-#: ../IkiWiki/Plugin/remove.pm:38
+#: ../IkiWiki/Plugin/remove.pm:39
 #, perl-format
 msgid "%s is not in the srcdir, so it cannot be deleted"
 msgstr "%s není ve zdrojovém adresáři a proto nelze smazat"
 
-#: ../IkiWiki/Plugin/remove.pm:41 ../IkiWiki/Plugin/rename.pm:45
+#: ../IkiWiki/Plugin/remove.pm:42 ../IkiWiki/Plugin/rename.pm:46
 #, perl-format
 msgid "%s is not a file"
 msgstr "%s není souborem"
 
-#: ../IkiWiki/Plugin/remove.pm:134
+#: ../IkiWiki/Plugin/remove.pm:137
 #, perl-format
 msgid "confirm removal of %s"
 msgstr "potvrďte odstranění %s"
 
-#: ../IkiWiki/Plugin/remove.pm:171
+#: ../IkiWiki/Plugin/remove.pm:174
 msgid "Please select the attachments to remove."
 msgstr "Vyberte prosím přílohy, které se mají odstranit."
 
-#: ../IkiWiki/Plugin/remove.pm:211
+#: ../IkiWiki/Plugin/remove.pm:216
 msgid "removed"
 msgstr "odstraněno"
 
-#: ../IkiWiki/Plugin/rename.pm:42
+#: ../IkiWiki/Plugin/rename.pm:43
 #, perl-format
 msgid "%s is not in the srcdir, so it cannot be renamed"
 msgstr "%s není ve zdrojovém adresáři a proto nelze přejmenovat"
 
-#: ../IkiWiki/Plugin/rename.pm:62
+#: ../IkiWiki/Plugin/rename.pm:63
 msgid "no change to the file name was specified"
 msgstr "jméno souboru nebylo změněno"
 
@@ -826,24 +852,24 @@ msgstr "%s již na disku existuje"
 msgid "rename %s"
 msgstr "přejmenování %s"
 
-#: ../IkiWiki/Plugin/rename.pm:161
+#: ../IkiWiki/Plugin/rename.pm:163
 msgid "Also rename SubPages and attachments"
 msgstr "Také přejmenovat podstránky a přílohy"
 
-#: ../IkiWiki/Plugin/rename.pm:247
+#: ../IkiWiki/Plugin/rename.pm:250
 msgid "Only one attachment can be renamed at a time."
 msgstr "Najednou lze přejmenovat pouze jednu přílohu."
 
-#: ../IkiWiki/Plugin/rename.pm:250
+#: ../IkiWiki/Plugin/rename.pm:253
 msgid "Please select the attachment to rename."
 msgstr "Vyberte přílohu, kterou chcete přejmenovat."
 
-#: ../IkiWiki/Plugin/rename.pm:347
+#: ../IkiWiki/Plugin/rename.pm:352
 #, perl-format
 msgid "rename %s to %s"
 msgstr "přejmenování %s na %s"
 
-#: ../IkiWiki/Plugin/rename.pm:571
+#: ../IkiWiki/Plugin/rename.pm:576
 #, perl-format
 msgid "update for rename of %s to %s"
 msgstr "aktualizace pro přejmenování %s na %s"
@@ -858,28 +884,28 @@ msgstr "nepodařilo se přečíst %s"
 msgid "rsync_command exited %d"
 msgstr ""
 
-#: ../IkiWiki/Plugin/search.pm:182
+#: ../IkiWiki/Plugin/search.pm:194
 #, perl-format
 msgid "need Digest::SHA1 to index %s"
 msgstr "pro indexování %s je potřeba Digest::SHA1"
 
-#: ../IkiWiki/Plugin/search.pm:217
+#: ../IkiWiki/Plugin/search.pm:231
 msgid "search"
 msgstr "hledání"
 
-#: ../IkiWiki/Plugin/shortcut.pm:31
+#: ../IkiWiki/Plugin/shortcut.pm:32
 #, perl-format
 msgid "shortcut plugin will not work without %s"
 msgstr "Modul shortcut nebude pracovat bez %s"
 
-#: ../IkiWiki/Plugin/shortcut.pm:44
+#: ../IkiWiki/Plugin/shortcut.pm:45
 msgid "missing name or url parameter"
 msgstr "chybí parametr jméno nebo url"
 
 #. translators: This is used to display what shortcuts are defined.
 #. translators: First parameter is the name of the shortcut, the second
 #. translators: is an URL.
-#: ../IkiWiki/Plugin/shortcut.pm:54
+#: ../IkiWiki/Plugin/shortcut.pm:55
 #, perl-format
 msgid "shortcut %s points to <i>%s</i>"
 msgstr "zkratka %s odkazuje na <i>%s</i>"
@@ -888,107 +914,110 @@ msgstr "zkratka %s odkazuje na <i>%s</i>"
 msgid "failed to parse any smileys"
 msgstr "nepodařilo se rozpoznat žádné smajlíky"
 
-#: ../IkiWiki/Plugin/sparkline.pm:72
+#: ../IkiWiki/Plugin/sparkline.pm:73
 msgid "parse error"
 msgstr "chyba syntaktického rozboru"
 
-#: ../IkiWiki/Plugin/sparkline.pm:78
+#: ../IkiWiki/Plugin/sparkline.pm:79
 msgid "invalid featurepoint diameter"
 msgstr "chybný průměr zvýrazněného bodu"
 
-#: ../IkiWiki/Plugin/sparkline.pm:88
+#: ../IkiWiki/Plugin/sparkline.pm:89
 msgid "invalid featurepoint location"
 msgstr "chybné umístění zvýrazněného bodu"
 
-#: ../IkiWiki/Plugin/sparkline.pm:99
+#: ../IkiWiki/Plugin/sparkline.pm:100
 msgid "missing values"
 msgstr "chybí hodnoty"
 
-#: ../IkiWiki/Plugin/sparkline.pm:104
+#: ../IkiWiki/Plugin/sparkline.pm:105
 msgid "invalid height value"
 msgstr "chybná výška"
 
-#: ../IkiWiki/Plugin/sparkline.pm:111
+#: ../IkiWiki/Plugin/sparkline.pm:112
 msgid "missing width parameter"
 msgstr "chybí parametr šířka (width)"
 
-#: ../IkiWiki/Plugin/sparkline.pm:115
+#: ../IkiWiki/Plugin/sparkline.pm:116
 msgid "invalid width value"
 msgstr "chybná šířka"
 
-#: ../IkiWiki/Plugin/sparkline.pm:153
+#: ../IkiWiki/Plugin/sparkline.pm:154
 msgid "failed to run php"
 msgstr "nepodařilo se spustit php"
 
-#: ../IkiWiki/Plugin/table.pm:31
+#: ../IkiWiki/Plugin/table.pm:32
 msgid "cannot find file"
 msgstr "nemohu najít soubor"
 
-#: ../IkiWiki/Plugin/table.pm:87
+#: ../IkiWiki/Plugin/table.pm:88
 msgid "unknown data format"
 msgstr "neznámý formát dat"
 
-#: ../IkiWiki/Plugin/table.pm:95
+#: ../IkiWiki/Plugin/table.pm:96
 msgid "empty data"
 msgstr "prázdná data"
 
-#: ../IkiWiki/Plugin/table.pm:114
+#: ../IkiWiki/Plugin/table.pm:115
 msgid "Direct data download"
 msgstr "Stáhnout zdrojová data"
 
-#: ../IkiWiki/Plugin/table.pm:148
+#: ../IkiWiki/Plugin/table.pm:149
 #, perl-format
 msgid "parse fail at line %d: %s"
 msgstr "zpracovávání selhalo na řádku %d: %s"
 
-#: ../IkiWiki/Plugin/template.pm:29
+#: ../IkiWiki/Plugin/tag.pm:83
+#, fuzzy, perl-format
+msgid "creating tag page %s"
+msgstr "vytvářím novou stránku %s"
+
+#: ../IkiWiki/Plugin/template.pm:33
 msgid "missing id parameter"
 msgstr "chybí parametr id"
 
-#: ../IkiWiki/Plugin/template.pm:36
+#: ../IkiWiki/Plugin/template.pm:47
 #, perl-format
-msgid "template %s not found"
-msgstr "šablona %s nebyla nalezena"
+msgid "%s not found"
+msgstr "%s nenalezen"
 
-#: ../IkiWiki/Plugin/template.pm:55
-msgid "failed to process:"
-msgstr "nepodařilo se zpracovat:"
-
-#: ../IkiWiki/Plugin/teximg.pm:70
+#: ../IkiWiki/Plugin/teximg.pm:72
 msgid "missing tex code"
 msgstr "chybí TeXový kód"
 
-#: ../IkiWiki/Plugin/teximg.pm:122
+#: ../IkiWiki/Plugin/teximg.pm:124
 msgid "failed to generate image from code"
 msgstr "z kódu se nepodařilo vygenerovat obrázek"
 
-#: ../IkiWiki/Plugin/websetup.pm:89
-msgid "plugin"
+#: ../IkiWiki/Plugin/websetup.pm:105
+#, fuzzy, perl-format
+msgid "%s plugin:"
 msgstr "modul"
 
-#: ../IkiWiki/Plugin/websetup.pm:108
+#: ../IkiWiki/Plugin/websetup.pm:121
+#, fuzzy, perl-format
+msgid "%s plugins"
+msgstr "moduly"
+
+#: ../IkiWiki/Plugin/websetup.pm:135
 #, perl-format
 msgid "enable %s?"
 msgstr "povolit %s?"
 
-#: ../IkiWiki/Plugin/websetup.pm:240
+#: ../IkiWiki/Plugin/websetup.pm:276
 msgid "setup file for this wiki is not known"
 msgstr "konfigurační soubor této wiki je neznámý"
 
-#: ../IkiWiki/Plugin/websetup.pm:256
+#: ../IkiWiki/Plugin/websetup.pm:292
 msgid "main"
 msgstr "hlavní"
 
-#: ../IkiWiki/Plugin/websetup.pm:257
-msgid "plugins"
-msgstr "moduly"
-
-#: ../IkiWiki/Plugin/websetup.pm:395
+#: ../IkiWiki/Plugin/websetup.pm:435
 msgid ""
 "The configuration changes shown below require a wiki rebuild to take effect."
 msgstr "Níže uvedené změny v konfiguraci se projeví až po znovusestavení wiki."
 
-#: ../IkiWiki/Plugin/websetup.pm:399
+#: ../IkiWiki/Plugin/websetup.pm:439
 msgid ""
 "For the configuration changes shown below to fully take effect, you may need "
 "to rebuild the wiki."
@@ -996,7 +1025,7 @@ msgstr ""
 "Aby se níže uvedené změny v konfiguraci zcela projevily, budete možná muset "
 "znovusestavit wiki."
 
-#: ../IkiWiki/Plugin/websetup.pm:436
+#: ../IkiWiki/Plugin/websetup.pm:476
 #, perl-format
 msgid "Error: %s exited nonzero (%s). Discarding setup changes."
 msgstr ""
@@ -1013,12 +1042,12 @@ msgstr "nemohu určit identitu nedůvěryhodného uživatele %s"
 msgid "bad file name %s"
 msgstr "chybné jméno souboru %s"
 
-#: ../IkiWiki/Render.pm:150
+#: ../IkiWiki/Render.pm:158
 #, perl-format
 msgid "scanning %s"
 msgstr "prohledávám %s"
 
-#: ../IkiWiki/Render.pm:271
+#: ../IkiWiki/Render.pm:280
 #, perl-format
 msgid ""
 "symlink found in srcdir path (%s) -- set allow_symlinks_before_srcdir to "
@@ -1027,67 +1056,82 @@ msgstr ""
 "v cestě ke zdrojovému adresáři (%s) byl nalezen symbolický odkaz -- chcete-"
 "li to povolit, nastavte proměnnou allow_symlinks_before_srcdir"
 
-#: ../IkiWiki/Render.pm:300 ../IkiWiki/Render.pm:327
+#: ../IkiWiki/Render.pm:311
 #, perl-format
 msgid "skipping bad filename %s"
 msgstr "přeskakuji chybné jméno souboru %s"
 
-#: ../IkiWiki/Render.pm:305
+#: ../IkiWiki/Render.pm:327
 #, perl-format
 msgid "%s has multiple possible source pages"
 msgstr "%s má několik možných zdrojových stránek"
 
-#: ../IkiWiki/Render.pm:395
+#: ../IkiWiki/Render.pm:369
 #, perl-format
-msgid "removing old page %s"
+msgid "querying %s for file creation and modification times.."
+msgstr ""
+
+#: ../IkiWiki/Render.pm:431
+#, fuzzy, perl-format
+msgid "removing obsolete %s"
 msgstr "odstraňuji starou stránku %s"
 
-#: ../IkiWiki/Render.pm:471
+#: ../IkiWiki/Render.pm:505
 #, perl-format
 msgid "building %s, which links to %s"
 msgstr "sestavuji %s, která odkazuje na %s"
 
-#: ../IkiWiki/Render.pm:480
+#: ../IkiWiki/Render.pm:514
 #, perl-format
 msgid "removing %s, no longer built by %s"
 msgstr "odstraňuji %s, již není sestavována pomocí %s"
 
-#: ../IkiWiki/Render.pm:603
+#: ../IkiWiki/Render.pm:597 ../IkiWiki/Render.pm:679
 #, perl-format
 msgid "building %s, which depends on %s"
 msgstr "sestavuji %s, která závisí na %s"
 
-#: ../IkiWiki/Render.pm:616
+#: ../IkiWiki/Render.pm:692
 #, perl-format
 msgid "building %s, to update its backlinks"
 msgstr "sestavuji %s, aby se aktualizovaly zpětné odkazy"
 
-#: ../IkiWiki/Render.pm:679
+#: ../IkiWiki/Render.pm:821
 #, perl-format
 msgid "ikiwiki: cannot build %s"
 msgstr "ikiwiki: nelze sestavit %s"
 
 #. translators: The first parameter is a filename, and the second
 #. translators: is a (probably not translated) error message.
-#: ../IkiWiki/Setup.pm:19
+#: ../IkiWiki/Setup.pm:23
 #, perl-format
 msgid "cannot read %s: %s"
 msgstr "nemohu číst %s: %s"
 
-#: ../IkiWiki/Setup/Automator.pm:33
+#: ../IkiWiki/Setup.pm:34
+#, fuzzy, perl-format
+msgid "cannot load %s in safe mode"
+msgstr "nemohu číst %s: %s"
+
+#: ../IkiWiki/Setup.pm:46
+#, fuzzy, perl-format
+msgid "failed to parse %s"
+msgstr "nepodařilo se aktualizovat %s"
+
+#: ../IkiWiki/Setup/Automator.pm:34
 msgid "you must enter a wikiname (that contains alphanumerics)"
 msgstr "musíte zadat název wiki (který obsahuje alfanumerické znaky)"
 
-#: ../IkiWiki/Setup/Automator.pm:76
+#: ../IkiWiki/Setup/Automator.pm:89
 #, perl-format
 msgid "unsupported revision control system %s"
 msgstr "nepodporovaný systém pro správu verzí: %s"
 
-#: ../IkiWiki/Setup/Automator.pm:102
+#: ../IkiWiki/Setup/Automator.pm:115
 msgid "failed to set up the repository with ikiwiki-makerepo"
 msgstr "nepodařilo se nastavit repositář pomocí ikiwiki-makerepo"
 
-#: ../IkiWiki/Setup/Automator.pm:120
+#: ../IkiWiki/Setup/Automator.pm:134
 #, perl-format
 msgid "** Disabling plugin %s, since it is failing with this message:"
 msgstr "** Deaktivuji modul %s, protože selhává s touto hláškou:"
@@ -1106,13 +1150,13 @@ msgid "wrapper filename not specified"
 msgstr "jméno souboru s obalem nebylo zadáno"
 
 #. translators: The parameter is a C filename.
-#: ../IkiWiki/Wrapper.pm:149
+#: ../IkiWiki/Wrapper.pm:160
 #, perl-format
 msgid "failed to compile %s"
 msgstr "nelze zkompilovat %s"
 
 #. translators: The parameter is a filename.
-#: ../IkiWiki/Wrapper.pm:169
+#: ../IkiWiki/Wrapper.pm:180
 #, perl-format
 msgid "successfully generated %s"
 msgstr "%s byl úspěšně vytvořen"
@@ -1125,58 +1169,64 @@ msgstr "použití: ikiwiki [volby] zdroj cíl"
 msgid "       ikiwiki --setup configfile"
 msgstr "       ikiwiki --setup konfigurační.soubor"
 
-#: ../ikiwiki.in:91
+#: ../ikiwiki.in:96
 msgid "usage: --set var=value"
 msgstr "použití: --set proměnná=hodnota"
 
-#: ../ikiwiki.in:140
+#: ../ikiwiki.in:103
+#, fuzzy
+msgid "usage: --set-yaml var=value"
+msgstr "použití: --set proměnná=hodnota"
+
+#: ../ikiwiki.in:157
 msgid "generating wrappers.."
 msgstr "generuji obaly..."
 
-#: ../ikiwiki.in:195
+#: ../ikiwiki.in:220
 msgid "rebuilding wiki.."
 msgstr "znovusestavuji wiki..."
 
-#: ../ikiwiki.in:198
+#: ../ikiwiki.in:223
 msgid "refreshing wiki.."
 msgstr "obnovuji wiki..."
 
-#: ../IkiWiki.pm:238
+#: ../IkiWiki.pm:232
 msgid "Discussion"
 msgstr "Diskuse"
 
-#: ../IkiWiki.pm:507
+#: ../IkiWiki.pm:531
 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:553
+#: ../IkiWiki.pm:577
 msgid "cannot use multiple rcs plugins"
 msgstr "nelze použít několik rcs modulů"
 
-#: ../IkiWiki.pm:582
+#: ../IkiWiki.pm:606
 #, perl-format
 msgid "failed to load external plugin needed for %s plugin: %s"
 msgstr "nepodařilo se nahrát externí modul vyžadovaný modulem %s: %s"
 
-#: ../IkiWiki.pm:1264
+#: ../IkiWiki.pm:1298
 #, perl-format
 msgid "preprocessing loop detected on %s at depth %i"
 msgstr "Byla rozpoznána smyčka na %s v hloubce %i"
 
-#: ../IkiWiki.pm:1863
+#: ../IkiWiki.pm:1984
 msgid "yes"
 msgstr "ano"
 
-#: ../IkiWiki.pm:2006
-msgid "Sort::Naturally needed for title_natural sort"
-msgstr "Pro řazení pomocí title_natural je nutný modul Sort::Naturally"
+#: ../IkiWiki.pm:2061
+#, fuzzy, perl-format
+msgid "invalid sort type %s"
+msgstr "neznámý typ řazení %s"
 
-#: ../IkiWiki.pm:2017
+#: ../IkiWiki.pm:2082
 #, perl-format
 msgid "unknown sort type %s"
 msgstr "neznámý typ řazení %s"
 
-#: ../IkiWiki.pm:2036
+#: ../IkiWiki.pm:2218
 #, perl-format
 msgid "cannot match pages: %s"
 msgstr "nelze vybrat stránky: %s"
@@ -1201,6 +1251,30 @@ msgstr "Který uživatel (wiki účet nebo openid) bude správce?"
 msgid "What is the domain name of the web server?"
 msgstr "Jaké je doménové jméno webového serveru?"
 
+#~ msgid "You need to log in first."
+#~ msgstr "Nejprve se musíte přihlásit."
+
+#~ msgid "Log in with"
+#~ msgstr "Přihlásit pomocí"
+
+#~ msgid "Get an OpenID"
+#~ msgstr "Získat OpenID"
+
+#~ msgid "failed to process"
+#~ msgstr "nepodařilo se zpracovat"
+
+#~ msgid "nonexistant template %s"
+#~ msgstr "neexistující šablona %s"
+
+#~ msgid "getctime not implemented"
+#~ msgstr "getctime není implementováno"
+
+#~ msgid "Sort::Naturally needed for title_natural sort"
+#~ msgstr "Pro řazení pomocí title_natural je nutný modul Sort::Naturally"
+
+#~ msgid "failed to read %s"
+#~ msgstr "nepodařilo se přečíst %s"
+
 #~ msgid "Failed to parse url, cannot determine domain name"
 #~ msgstr "Nepodařilo se syntakticky rozebrat url, nelze určit doménová jméno."
 
@@ -1245,9 +1319,6 @@ msgstr "Jaké je doménové jméno webového serveru?"
 #~ "REV není nastavena, není spuštěna ze svn post-commit, nemohu zaslat "
 #~ "oznámení"
 
-#~ msgid "%s not found"
-#~ msgstr "%s nenalezen"
-
 #~ msgid "What's this?"
 #~ msgstr "Co to je?"
 
index 9801ca011e3a9e225ea32949f99667823aeaecda..fb0ec754d377526209e6558df07830d2016b9ec0 100644 (file)
--- a/po/da.po
+++ b/po/da.po
@@ -7,10 +7,11 @@ msgid ""
 msgstr ""
 "Project-Id-Version: ikiwiki 3.14159\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-10-31 18:31-0400\n"
+"POT-Creation-Date: 2010-05-18 14:18-0400\n"
 "PO-Revision-Date: 2009-07-23 01:07+0200\n"
 "Last-Translator: Jonas Smedegaard <dr@jones.dk>\n"
 "Language-Team: None\n"
+"Language: \n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
@@ -19,11 +20,7 @@ msgstr ""
 "X-Poedit-Country: DENMARK\n"
 "X-Poedit-SourceCharset: utf-8\n"
 
-#: ../IkiWiki/CGI.pm:114
-msgid "You need to log in first."
-msgstr "Du skal først logge på."
-
-#: ../IkiWiki/CGI.pm:147
+#: ../IkiWiki/CGI.pm:162
 msgid ""
 "probable misconfiguration: sslcookie is set, but you are attempting to login "
 "via http, not https"
@@ -31,35 +28,35 @@ msgstr ""
 "mulig opsætningsfejl: sslcookie er sat, men du forsøger at logge på via "
 "http, ikke https"
 
-#: ../IkiWiki/CGI.pm:150
+#: ../IkiWiki/CGI.pm:165
 msgid "login failed, perhaps you need to turn on cookies?"
 msgstr "Pålogning mislykkedes, måske skal du tillade infokager (cookies)?"
 
-#: ../IkiWiki/CGI.pm:169 ../IkiWiki/CGI.pm:314
+#: ../IkiWiki/CGI.pm:184 ../IkiWiki/CGI.pm:335
 msgid "Your login session has expired."
 msgstr "Din kørsel (login session) er udløbet"
 
-#: ../IkiWiki/CGI.pm:190
+#: ../IkiWiki/CGI.pm:205
 msgid "Login"
 msgstr "Pålogning"
 
-#: ../IkiWiki/CGI.pm:191
+#: ../IkiWiki/CGI.pm:206
 msgid "Preferences"
 msgstr "Indstillinger"
 
-#: ../IkiWiki/CGI.pm:192
+#: ../IkiWiki/CGI.pm:207
 msgid "Admin"
 msgstr "Admin"
 
-#: ../IkiWiki/CGI.pm:232
+#: ../IkiWiki/CGI.pm:247
 msgid "Preferences saved."
 msgstr "Indstillinger gemt"
 
-#: ../IkiWiki/CGI.pm:278
+#: ../IkiWiki/CGI.pm:299
 msgid "You are banned."
 msgstr "Du er banlyst."
 
-#: ../IkiWiki/CGI.pm:405 ../IkiWiki/CGI.pm:406 ../IkiWiki.pm:1282
+#: ../IkiWiki/CGI.pm:426 ../IkiWiki/CGI.pm:427 ../IkiWiki.pm:1316
 msgid "Error"
 msgstr "Fejl"
 
@@ -140,7 +137,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:231
 msgid "done"
 msgstr "færdig"
 
@@ -149,43 +146,43 @@ msgstr "færdig"
 msgid "Must specify %s"
 msgstr "Skal angive %s"
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:136
+#: ../IkiWiki/Plugin/amazon_s3.pm:140
 #, fuzzy
 msgid "Failed to create S3 bucket: "
 msgstr "Oprettelse af bundt i S3 mislykkedes: "
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:221
+#: ../IkiWiki/Plugin/amazon_s3.pm:225
 #, fuzzy
 msgid "Failed to save file to S3: "
 msgstr "Arkivering af fil i S3 mislykkedes: "
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:243
+#: ../IkiWiki/Plugin/amazon_s3.pm:247
 #, fuzzy
 msgid "Failed to delete file from S3: "
 msgstr "Sletning af fil fra S3 mislykkedes: "
 
-#: ../IkiWiki/Plugin/attachment.pm:49
+#: ../IkiWiki/Plugin/attachment.pm:50
 #, perl-format
 msgid "there is already a page named %s"
 msgstr "der er allerede en side ved navn %s"
 
-#: ../IkiWiki/Plugin/attachment.pm:65
+#: ../IkiWiki/Plugin/attachment.pm:66
 msgid "prohibited by allowed_attachments"
 msgstr "forhindret af allowed_attachments"
 
-#: ../IkiWiki/Plugin/attachment.pm:140
+#: ../IkiWiki/Plugin/attachment.pm:141
 msgid "bad attachment filename"
 msgstr "dårligt vedhæftningsfilnavn"
 
-#: ../IkiWiki/Plugin/attachment.pm:182
+#: ../IkiWiki/Plugin/attachment.pm:183
 msgid "attachment upload"
 msgstr "vedhæftningsoplægning"
 
-#: ../IkiWiki/Plugin/autoindex.pm:105
+#: ../IkiWiki/Plugin/autoindex.pm:117
 msgid "automatic index generation"
 msgstr "automatisk indeks-dannelse"
 
-#: ../IkiWiki/Plugin/blogspam.pm:108
+#: ../IkiWiki/Plugin/blogspam.pm:109
 msgid ""
 "Sorry, but that looks like spam to <a href=\"http://blogspam.net/"
 "\">blogspam</a>: "
@@ -202,193 +199,216 @@ msgstr "%s fra %s"
 msgid "There are no broken links!"
 msgstr "Ingen henvisninger der ikker fungerer!"
 
-#: ../IkiWiki/Plugin/comments.pm:124 ../IkiWiki/Plugin/format.pm:38
+#: ../IkiWiki/Plugin/comments.pm:112
+#, fuzzy, perl-format
+msgid "this comment needs %s"
+msgstr "kommenterer på %s"
+
+#: ../IkiWiki/Plugin/comments.pm:115
+#, fuzzy
+msgid "moderation"
+msgstr "Kommentarmoderering"
+
+#: ../IkiWiki/Plugin/comments.pm:136 ../IkiWiki/Plugin/format.pm:48
 #, perl-format
 msgid "unsupported page format %s"
 msgstr "Ikke-understøttet sideformat %s"
 
-#: ../IkiWiki/Plugin/comments.pm:129
+#: ../IkiWiki/Plugin/comments.pm:141
 msgid "comment must have content"
 msgstr "kommentar skal have indhold"
 
-#: ../IkiWiki/Plugin/comments.pm:185
+#: ../IkiWiki/Plugin/comments.pm:196
 msgid "Anonymous"
 msgstr "Anonym"
 
-#: ../IkiWiki/Plugin/comments.pm:340 ../IkiWiki/Plugin/editpage.pm:97
+#: ../IkiWiki/Plugin/comments.pm:357 ../IkiWiki/Plugin/editpage.pm:98
 msgid "bad page name"
 msgstr "dårligt sidenavn"
 
-#: ../IkiWiki/Plugin/comments.pm:345
+#: ../IkiWiki/Plugin/comments.pm:362
 #, perl-format
 msgid "commenting on %s"
 msgstr "kommenterer på %s"
 
-#: ../IkiWiki/Plugin/comments.pm:363
+#: ../IkiWiki/Plugin/comments.pm:380
 #, perl-format
 msgid "page '%s' doesn't exist, so you can't comment"
 msgstr "siden '%s' eksisterer ikke, så du kan ikke kommentere"
 
-#: ../IkiWiki/Plugin/comments.pm:370
+#: ../IkiWiki/Plugin/comments.pm:387
 #, perl-format
 msgid "comments on page '%s' are closed"
 msgstr "kommentarer på side '%s' er lukket"
 
-#: ../IkiWiki/Plugin/comments.pm:464
+#: ../IkiWiki/Plugin/comments.pm:490
 msgid "comment stored for moderation"
 msgstr "kommentar gemt for moderering"
 
-#: ../IkiWiki/Plugin/comments.pm:466
+#: ../IkiWiki/Plugin/comments.pm:492
 msgid "Your comment will be posted after moderator review"
 msgstr "Din kommentar vil blive tilføjet efter moderatorgenemsyn"
 
-#: ../IkiWiki/Plugin/comments.pm:479
+#: ../IkiWiki/Plugin/comments.pm:505
 msgid "Added a comment"
 msgstr "Tilføjede en kommentar"
 
-#: ../IkiWiki/Plugin/comments.pm:483
+#: ../IkiWiki/Plugin/comments.pm:509
 #, perl-format
 msgid "Added a comment: %s"
 msgstr "Tilføjede en kommentar: %s"
 
-#: ../IkiWiki/Plugin/comments.pm:525 ../IkiWiki/Plugin/websetup.pm:236
+#: ../IkiWiki/Plugin/comments.pm:551 ../IkiWiki/Plugin/websetup.pm:272
 msgid "you are not logged in as an admin"
 msgstr "du er ikke logget på som en administrator"
 
-#: ../IkiWiki/Plugin/comments.pm:576
+#: ../IkiWiki/Plugin/comments.pm:602
 msgid "Comment moderation"
 msgstr "Kommentarmoderering"
 
-#: ../IkiWiki/Plugin/comments.pm:615
+#: ../IkiWiki/Plugin/comments.pm:640
 msgid "comment moderation"
 msgstr "kommentarkoderering"
 
-#: ../IkiWiki/Plugin/comments.pm:766
-msgid "Comments"
+#: ../IkiWiki/Plugin/comments.pm:789
+#, fuzzy, perl-format
+msgid "%i comment"
+msgid_plural "%i comments"
+msgstr[0] "Kommentarer"
+msgstr[1] "Kommentarer"
+
+#. translators: Here "Comment" is a verb;
+#. translators: the user clicks on it to
+#. translators: post a comment.
+#: ../IkiWiki/Plugin/comments.pm:799
+#, fuzzy
+msgid "Comment"
 msgstr "Kommentarer"
 
-#: ../IkiWiki/Plugin/conditional.pm:27 ../IkiWiki/Plugin/cutpaste.pm:30
-#: ../IkiWiki/Plugin/cutpaste.pm:45 ../IkiWiki/Plugin/cutpaste.pm:61
+#: ../IkiWiki/Plugin/conditional.pm:28 ../IkiWiki/Plugin/cutpaste.pm:31
+#: ../IkiWiki/Plugin/cutpaste.pm:46 ../IkiWiki/Plugin/cutpaste.pm:62
 #: ../IkiWiki/Plugin/testpagespec.pm:26
 #, perl-format
 msgid "%s parameter is required"
 msgstr "parametren %s er krævet"
 
-#: ../IkiWiki/Plugin/cutpaste.pm:66
+#: ../IkiWiki/Plugin/cutpaste.pm:67
 msgid "no text was copied in this page"
 msgstr "ingen tekst blev kopieret i denne side"
 
-#: ../IkiWiki/Plugin/cutpaste.pm:69
+#: ../IkiWiki/Plugin/cutpaste.pm:70
 #, perl-format
 msgid "no text was copied in this page with id %s"
 msgstr "ingen tekst blev kopieret i denne side med id %s"
 
-#: ../IkiWiki/Plugin/editpage.pm:40
+#: ../IkiWiki/Plugin/editpage.pm:41
 #, perl-format
 msgid "removing old preview %s"
 msgstr "fjerner gammelt smugkig %s"
 
-#: ../IkiWiki/Plugin/editpage.pm:113
+#: ../IkiWiki/Plugin/editpage.pm:114
 #, perl-format
 msgid "%s is not an editable page"
 msgstr "%s er ikke en redigérbar side"
 
-#: ../IkiWiki/Plugin/editpage.pm:292
+#: ../IkiWiki/Plugin/editpage.pm:294
 #, perl-format
 msgid "creating %s"
 msgstr "opretter %s"
 
-#: ../IkiWiki/Plugin/editpage.pm:310 ../IkiWiki/Plugin/editpage.pm:329
-#: ../IkiWiki/Plugin/editpage.pm:339 ../IkiWiki/Plugin/editpage.pm:383
-#: ../IkiWiki/Plugin/editpage.pm:422
+#: ../IkiWiki/Plugin/editpage.pm:312 ../IkiWiki/Plugin/editpage.pm:331
+#: ../IkiWiki/Plugin/editpage.pm:341 ../IkiWiki/Plugin/editpage.pm:385
+#: ../IkiWiki/Plugin/editpage.pm:424
 #, perl-format
 msgid "editing %s"
 msgstr "redigerer %s"
 
-#: ../IkiWiki/Plugin/edittemplate.pm:51
+#: ../IkiWiki/Plugin/edittemplate.pm:52
 msgid "template not specified"
 msgstr "skabelon %s ikke angivet"
 
-#: ../IkiWiki/Plugin/edittemplate.pm:54
+#: ../IkiWiki/Plugin/edittemplate.pm:55
 msgid "match not specified"
 msgstr "sammenligning ikke angivet"
 
-#: ../IkiWiki/Plugin/edittemplate.pm:63
+#: ../IkiWiki/Plugin/edittemplate.pm:64
 #, perl-format
 msgid "edittemplate %s registered for %s"
 msgstr "redigeringsskabelon %s registreret for %s"
 
-#: ../IkiWiki/Plugin/edittemplate.pm:137
-msgid "failed to process"
-msgstr "dannelsen mislykkedes"
+#: ../IkiWiki/Plugin/edittemplate.pm:125 ../IkiWiki/Plugin/inline.pm:339
+#: ../IkiWiki/Plugin/template.pm:44
+#, fuzzy
+msgid "failed to process template:"
+msgstr "dannelsen mislykkedes:"
 
-#: ../IkiWiki/Plugin/format.pm:20
+#: ../IkiWiki/Plugin/format.pm:30
 msgid "must specify format and text"
 msgstr "skal angive format og tekst"
 
-#: ../IkiWiki/Plugin/fortune.pm:27
+#: ../IkiWiki/Plugin/fortune.pm:28
 msgid "fortune failed"
 msgstr "spådom (fortune) fejlede"
 
-#: ../IkiWiki/Plugin/getsource.pm:62 ../IkiWiki/Plugin/goto.pm:55
+#: ../IkiWiki/Plugin/getsource.pm:64 ../IkiWiki/Plugin/goto.pm:58
 msgid "missing page"
 msgstr "manglende side"
 
-#: ../IkiWiki/Plugin/getsource.pm:64 ../IkiWiki/Plugin/goto.pm:57
+#: ../IkiWiki/Plugin/getsource.pm:66 ../IkiWiki/Plugin/goto.pm:60
 #, perl-format
 msgid "The page %s does not exist."
 msgstr "Siden %s eksisterer ikke."
 
-#: ../IkiWiki/Plugin/getsource.pm:73
+#: ../IkiWiki/Plugin/getsource.pm:75
 #, fuzzy
 msgid "not a page"
 msgstr "kan ikke få sider til at passe sammen: %s"
 
-#: ../IkiWiki/Plugin/getsource.pm:75
+#: ../IkiWiki/Plugin/getsource.pm:77
 #, fuzzy, perl-format
 msgid "%s is an attachment, not a page."
 msgstr "%s er ikke en redigérbar side"
 
-#: ../IkiWiki/Plugin/git.pm:651 ../IkiWiki/Plugin/git.pm:669
+#: ../IkiWiki/Plugin/git.pm:687 ../IkiWiki/Plugin/git.pm:705
 #: ../IkiWiki/Receive.pm:130
 #, perl-format
 msgid "you are not allowed to change %s"
 msgstr "Du har ikke lov til at ændre %s"
 
-#: ../IkiWiki/Plugin/git.pm:691
+#: ../IkiWiki/Plugin/git.pm:727
 #, perl-format
 msgid "you cannot act on a file with mode %s"
 msgstr "du kan ikke påvirke en fil med modus %s"
 
-#: ../IkiWiki/Plugin/git.pm:695
+#: ../IkiWiki/Plugin/git.pm:731
 msgid "you are not allowed to change file modes"
 msgstr "du har ikke lov til at ændre modus for filer"
 
-#: ../IkiWiki/Plugin/google.pm:25 ../IkiWiki/Plugin/po.pm:131
-#: ../IkiWiki/Plugin/search.pm:36
+#: ../IkiWiki/Plugin/google.pm:26 ../IkiWiki/Plugin/po.pm:134
+#: ../IkiWiki/Plugin/search.pm:37
 #, perl-format
 msgid "Must specify %s when using the %s plugin"
 msgstr "Skal angive %s når udvidelsen %s bruges"
 
-#: ../IkiWiki/Plugin/graphviz.pm:67
+#: ../IkiWiki/Plugin/graphviz.pm:68
 msgid "failed to run graphviz"
 msgstr "graphviz-kørsel mislykkedes"
 
-#: ../IkiWiki/Plugin/graphviz.pm:94
+#: ../IkiWiki/Plugin/graphviz.pm:90
 msgid "prog not a valid graphviz program"
 msgstr "prog er ikke et gyldigt graphviz-program"
 
-#: ../IkiWiki/Plugin/highlight.pm:47
+#: ../IkiWiki/Plugin/highlight.pm:48
 #, perl-format
 msgid "tohighlight contains unknown file type '%s'"
 msgstr "tohighlight indeholder ukendt filtype '%s'"
 
-#: ../IkiWiki/Plugin/highlight.pm:58
+#: ../IkiWiki/Plugin/highlight.pm:59
 #, perl-format
 msgid "Source code: %s"
 msgstr "Kildekode: %s"
 
-#: ../IkiWiki/Plugin/highlight.pm:123
+#: ../IkiWiki/Plugin/highlight.pm:124
 msgid ""
 "warning: highlight perl module not available; falling back to pass through"
 msgstr ""
@@ -400,102 +420,112 @@ msgstr ""
 msgid "htmltidy failed to parse this html"
 msgstr "afkodning af smileys mislykkedes"
 
-#: ../IkiWiki/Plugin/img.pm:64
+#: ../IkiWiki/Plugin/img.pm:69
 msgid "Image::Magick is not installed"
 msgstr "Image::Magick ikke installeret"
 
-#: ../IkiWiki/Plugin/img.pm:68 ../IkiWiki/Plugin/img.pm:112
+#: ../IkiWiki/Plugin/img.pm:73 ../IkiWiki/Plugin/img.pm:117
 #, perl-format
 msgid "failed to read %s: %s"
 msgstr "læsning af %s mislykkedes: %s"
 
-#: ../IkiWiki/Plugin/img.pm:74
+#: ../IkiWiki/Plugin/img.pm:79
 #, perl-format
 msgid "wrong size format \"%s\" (should be WxH)"
 msgstr "forkert størrelsesformat \"%s\" (burde være WxH)"
 
-#: ../IkiWiki/Plugin/img.pm:120
+#: ../IkiWiki/Plugin/img.pm:125
 #, perl-format
 msgid "failed to resize: %s"
 msgstr "Ændring af størrelse mislykkedes: %s"
 
-#: ../IkiWiki/Plugin/img.pm:140
+#: ../IkiWiki/Plugin/img.pm:145
 #, perl-format
 msgid "failed to determine size of image %s"
 msgstr "Vurdering af billedstørrelse mislykkedes: %s"
 
-#: ../IkiWiki/Plugin/inline.pm:92
+#: ../IkiWiki/Plugin/inline.pm:93
 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:138
+#: ../IkiWiki/Plugin/inline.pm:139
 msgid "page editing not allowed"
 msgstr "sideredigering er ikke tilladt"
 
-#: ../IkiWiki/Plugin/inline.pm:155
+#: ../IkiWiki/Plugin/inline.pm:156
 msgid "missing pages parameter"
 msgstr "mangler pages-parametren"
 
-#: ../IkiWiki/Plugin/inline.pm:191
+#: ../IkiWiki/Plugin/inline.pm:192
 #, perl-format
 msgid "the %s and %s parameters cannot be used together"
 msgstr ""
 
-#: ../IkiWiki/Plugin/inline.pm:312
+#: ../IkiWiki/Plugin/inline.pm:313
 msgid "Add a new post titled:"
 msgstr "Tilføj nyt indlæg med følgende titel:"
 
-#: ../IkiWiki/Plugin/inline.pm:332
+#: ../IkiWiki/Plugin/inline.pm:342
 #, perl-format
-msgid "nonexistant template %s"
-msgstr "ikke-eksisterende skabelon: %s"
+msgid "template %s not found"
+msgstr "skabelon %s ikke fundet"
 
-#: ../IkiWiki/Plugin/inline.pm:598
+#: ../IkiWiki/Plugin/inline.pm:633
 msgid "RPC::XML::Client not found, not pinging"
 msgstr "RPC::XML::Client ikke fundet, pinger ikke"
 
-#: ../IkiWiki/Plugin/linkmap.pm:101
+#: ../IkiWiki/Plugin/linkmap.pm:81 ../IkiWiki/Plugin/linkmap.pm:88
+#: ../IkiWiki/Plugin/linkmap.pm:92 ../IkiWiki/Plugin/linkmap.pm:95
 msgid "failed to run dot"
 msgstr "dot-kørsel mislykkedes"
 
-#: ../IkiWiki/Plugin/lockedit.pm:47
+#: ../IkiWiki/Plugin/linkmap.pm:85
+msgid "linkmap"
+msgstr ""
+
+#: ../IkiWiki/Plugin/lockedit.pm:49
 #, perl-format
 msgid "%s is locked and cannot be edited"
 msgstr "%s er låst og kan ikke redigeres"
 
-#: ../IkiWiki/Plugin/mdwn.pm:44
+#: ../IkiWiki/Plugin/mdwn.pm:45
 msgid "multimarkdown is enabled, but Text::MultiMarkdown is not installed"
 msgstr ""
 "multimarkdown er aktiveret, men Text::MultiMarkdown er ikke installeret"
 
-#: ../IkiWiki/Plugin/mdwn.pm:69
+#: ../IkiWiki/Plugin/mdwn.pm:70
 #, perl-format
 msgid "failed to load Markdown.pm perl module (%s) or /usr/bin/markdown (%s)"
 msgstr ""
 "Indlæsning af perl-modulet Markdown.pm (%s) eller /usr/bin/markdown (%s) "
 "mislykkedes"
 
-#: ../IkiWiki/Plugin/meta.pm:161
+#: ../IkiWiki/Plugin/meta.pm:174
 msgid "stylesheet not found"
 msgstr "stilsnit (stylesheet) ikke fundet"
 
-#: ../IkiWiki/Plugin/meta.pm:199
+#: ../IkiWiki/Plugin/meta.pm:212
 msgid "redir page not found"
 msgstr "henvisningsside ikke fundet"
 
-#: ../IkiWiki/Plugin/meta.pm:213
+#: ../IkiWiki/Plugin/meta.pm:226
 msgid "redir cycle is not allowed"
 msgstr "ring af henvisninger er ikke tilladt"
 
-#: ../IkiWiki/Plugin/mirrorlist.pm:43
+#: ../IkiWiki/Plugin/meta.pm:387
+#, fuzzy
+msgid "sort=meta requires a parameter"
+msgstr "kræver 'from'- og 'to'-parametre"
+
+#: ../IkiWiki/Plugin/mirrorlist.pm:44
 msgid "Mirrors"
 msgstr "Spejle"
 
-#: ../IkiWiki/Plugin/mirrorlist.pm:43
+#: ../IkiWiki/Plugin/mirrorlist.pm:44
 msgid "Mirror"
 msgstr "Spejl"
 
-#: ../IkiWiki/Plugin/moderatedcomments.pm:41
+#: ../IkiWiki/Plugin/moderatedcomments.pm:57
 #, fuzzy
 msgid "comment needs moderation"
 msgstr "kommentarkoderering"
@@ -504,19 +534,12 @@ msgstr "kommentarkoderering"
 msgid "more"
 msgstr "mere"
 
-#: ../IkiWiki/Plugin/norcs.pm:65
-msgid "getctime not implemented"
-msgstr "getctime ikke implementeret"
-
-#: ../IkiWiki/Plugin/openid.pm:61
-msgid "Log in with"
-msgstr "Log på med"
-
-#: ../IkiWiki/Plugin/openid.pm:64
-msgid "Get an OpenID"
-msgstr "Skaf en OpenID"
+#: ../IkiWiki/Plugin/openid.pm:58
+#, fuzzy, perl-format
+msgid "failed to load openid module: "
+msgstr "kompilering af %s mislykkedes"
 
-#: ../IkiWiki/Plugin/orphans.pm:55
+#: ../IkiWiki/Plugin/orphans.pm:56
 msgid "All pages have other pages linking to them."
 msgstr "Alle sider har henvisninger fra andre sider."
 
@@ -524,32 +547,40 @@ msgstr "Alle sider har henvisninger fra andre sider."
 msgid "bad or missing template"
 msgstr "dårlig eller manglende skabelon"
 
-#: ../IkiWiki/Plugin/passwordauth.pm:248
+#: ../IkiWiki/Plugin/passwordauth.pm:231
+msgid "Your user page: "
+msgstr ""
+
+#: ../IkiWiki/Plugin/passwordauth.pm:238
+msgid "Create your user page"
+msgstr ""
+
+#: ../IkiWiki/Plugin/passwordauth.pm:268
 msgid "Account creation successful. Now you can Login."
 msgstr "Konto korrekt oprettet. Nu kan du logge på."
 
-#: ../IkiWiki/Plugin/passwordauth.pm:251
+#: ../IkiWiki/Plugin/passwordauth.pm:271
 msgid "Error creating account."
 msgstr "Fejl ved kontooprettelse."
 
-#: ../IkiWiki/Plugin/passwordauth.pm:258
+#: ../IkiWiki/Plugin/passwordauth.pm:278
 msgid "No email address, so cannot email password reset instructions."
 msgstr ""
 "Ingen emailadresse, så kan ikke sende adgangskodenulstillingsinstruktioner."
 
-#: ../IkiWiki/Plugin/passwordauth.pm:292
+#: ../IkiWiki/Plugin/passwordauth.pm:312
 msgid "Failed to send mail"
 msgstr "Afsendelse af mail mislykkedes"
 
-#: ../IkiWiki/Plugin/passwordauth.pm:294
+#: ../IkiWiki/Plugin/passwordauth.pm:314
 msgid "You have been mailed password reset instructions."
 msgstr "Du har fået tilsendt adgangskodenulstillingsinstruktioner."
 
-#: ../IkiWiki/Plugin/passwordauth.pm:329
+#: ../IkiWiki/Plugin/passwordauth.pm:349
 msgid "incorrect password reset url"
 msgstr "Ukorrekt adgangskodenumstillings-URL"
 
-#: ../IkiWiki/Plugin/passwordauth.pm:332
+#: ../IkiWiki/Plugin/passwordauth.pm:352
 msgid "password reset denied"
 msgstr "adgangskodenulstilling afvist"
 
@@ -579,12 +610,12 @@ msgstr "LWP ikke fundet, pinger ikke"
 msgid "warning: Old po4a detected! Recommend upgrade to 0.35."
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:138
+#: ../IkiWiki/Plugin/po.pm:142
 #, perl-format
 msgid "%s is not a valid language code"
 msgstr "%s er ikke en gyldig sprogkode"
 
-#: ../IkiWiki/Plugin/po.pm:150
+#: ../IkiWiki/Plugin/po.pm:154
 #, perl-format
 msgid ""
 "%s is not a valid value for po_link_to, falling back to po_link_to=default"
@@ -592,7 +623,7 @@ msgstr ""
 "%s er ikke en gyldig værdi for po_link_to, falder tilbage til "
 "po_link_to=default"
 
-#: ../IkiWiki/Plugin/po.pm:155
+#: ../IkiWiki/Plugin/po.pm:159
 msgid ""
 "po_link_to=negotiated requires usedirs to be enabled, falling back to "
 "po_link_to=default"
@@ -600,21 +631,21 @@ msgstr ""
 "po_link_to=negotiated kræver at usedirs er aktiveret, falder tilbage til "
 "po_link_to=default"
 
-#: ../IkiWiki/Plugin/po.pm:385
+#: ../IkiWiki/Plugin/po.pm:390
 #, perl-format
 msgid "rebuilding all pages to fix meta titles"
 msgstr "gendanner alle sider for at korrigere meta titler"
 
-#: ../IkiWiki/Plugin/po.pm:389 ../IkiWiki/Render.pm:638
+#: ../IkiWiki/Plugin/po.pm:394 ../IkiWiki/Render.pm:769
 #, perl-format
 msgid "building %s"
 msgstr "danner %s"
 
-#: ../IkiWiki/Plugin/po.pm:427
+#: ../IkiWiki/Plugin/po.pm:432
 msgid "updated PO files"
 msgstr "opdaterer PO-filer"
 
-#: ../IkiWiki/Plugin/po.pm:451
+#: ../IkiWiki/Plugin/po.pm:456
 msgid ""
 "Can not remove a translation. If the master page is removed, however, its "
 "translations will be removed as well."
@@ -622,7 +653,7 @@ msgstr ""
 "Kan ikke fjerne en oversættelse. Fjern i stedet hovedsiden, så fjernes dens "
 "oversættelser også."
 
-#: ../IkiWiki/Plugin/po.pm:471
+#: ../IkiWiki/Plugin/po.pm:476
 msgid ""
 "Can not rename a translation. If the master page is renamed, however, its "
 "translations will be renamed as well."
@@ -630,80 +661,75 @@ msgstr ""
 "Kan ikke omdøbe en oversættelse. Omdøb i stedet hovedsiden, så omdøbes dens "
 "oversættelser også."
 
-#: ../IkiWiki/Plugin/po.pm:870
+#: ../IkiWiki/Plugin/po.pm:876
 #, perl-format
 msgid "POT file (%s) does not exist"
 msgstr "POT-filen %s eksisterer ikke"
 
-#: ../IkiWiki/Plugin/po.pm:884
+#: ../IkiWiki/Plugin/po.pm:890
 #, fuzzy, perl-format
 msgid "failed to copy underlay PO file to %s"
 msgstr "kopiering af POT-filen til %s mislykkedes"
 
-#: ../IkiWiki/Plugin/po.pm:893
+#: ../IkiWiki/Plugin/po.pm:899
 #, perl-format
 msgid "failed to update %s"
 msgstr "opdatering af %s mislykkedes"
 
-#: ../IkiWiki/Plugin/po.pm:899
+#: ../IkiWiki/Plugin/po.pm:905
 #, perl-format
 msgid "failed to copy the POT file to %s"
 msgstr "kopiering af POT-filen til %s mislykkedes"
 
-#: ../IkiWiki/Plugin/po.pm:935
+#: ../IkiWiki/Plugin/po.pm:941
 msgid "N/A"
 msgstr "N/A"
 
-#: ../IkiWiki/Plugin/po.pm:948
+#: ../IkiWiki/Plugin/po.pm:954
 #, perl-format
 msgid "failed to translate %s"
 msgstr "oversættelse af %s mislykkedes"
 
-#: ../IkiWiki/Plugin/po.pm:1032
+#: ../IkiWiki/Plugin/po.pm:1038
 msgid "removed obsolete PO files"
 msgstr "forældede PO filer fjernet"
 
-#: ../IkiWiki/Plugin/po.pm:1095 ../IkiWiki/Plugin/po.pm:1109
-#: ../IkiWiki/Plugin/po.pm:1149
+#: ../IkiWiki/Plugin/po.pm:1094 ../IkiWiki/Plugin/po.pm:1108
+#: ../IkiWiki/Plugin/po.pm:1147
 #, perl-format
 msgid "failed to write %s"
 msgstr "skrivning af %s mislykkedes"
 
-#: ../IkiWiki/Plugin/po.pm:1107
+#: ../IkiWiki/Plugin/po.pm:1106
 msgid "failed to translate"
 msgstr "oversættelse mislykkedes"
 
-#: ../IkiWiki/Plugin/po.pm:1112
-#, perl-format
-msgid "failed to read %s"
-msgstr "læsning af %s mislykkedes"
-
-#: ../IkiWiki/Plugin/po.pm:1161
+#: ../IkiWiki/Plugin/po.pm:1159
 msgid "invalid gettext data, go back to previous page to continue edit"
 msgstr ""
 "forkert gettext-data, gå tilbage til forrige side og fortsæt redigering"
 
-#: ../IkiWiki/Plugin/poll.pm:69
+#: ../IkiWiki/Plugin/poll.pm:70
 msgid "vote"
 msgstr "stem"
 
-#: ../IkiWiki/Plugin/poll.pm:77
+#: ../IkiWiki/Plugin/poll.pm:78
 msgid "Total votes:"
 msgstr "Samlede stemmer:"
 
-#: ../IkiWiki/Plugin/polygen.pm:41
+#: ../IkiWiki/Plugin/polygen.pm:42
 msgid "polygen not installed"
 msgstr "polygen ikke installeret"
 
-#: ../IkiWiki/Plugin/polygen.pm:60
+#: ../IkiWiki/Plugin/polygen.pm:61
 msgid "command failed"
 msgstr "kommando fejlede"
 
-#: ../IkiWiki/Plugin/postsparkline.pm:46
+#: ../IkiWiki/Plugin/postsparkline.pm:47
 msgid "missing formula"
 msgstr "manglende formular"
 
-#: ../IkiWiki/Plugin/postsparkline.pm:53
+#: ../IkiWiki/Plugin/postsparkline.pm:54
 msgid "unknown formula"
 msgstr "ukendt formular"
 
@@ -771,12 +797,12 @@ msgstr "ved midnat"
 msgid "at noon on %A"
 msgstr "midt på dagen %A"
 
-#: ../IkiWiki/Plugin/progress.pm:34
+#: ../IkiWiki/Plugin/progress.pm:35
 #, perl-format
 msgid "illegal percent value %s"
 msgstr "ugyldig procentværdi %s"
 
-#: ../IkiWiki/Plugin/progress.pm:55
+#: ../IkiWiki/Plugin/progress.pm:56
 msgid "need either `percent` or `totalpages` and `donepages` parameters"
 msgstr "Kræver enten parametre `percent` eller `totalpages og `donepages`"
 
@@ -784,40 +810,40 @@ msgstr "Kræver enten parametre `percent` eller `totalpages og `donepages`"
 msgid "(Diff truncated)"
 msgstr "(Diff trunkeret)"
 
-#: ../IkiWiki/Plugin/remove.pm:31 ../IkiWiki/Plugin/rename.pm:36
+#: ../IkiWiki/Plugin/remove.pm:32 ../IkiWiki/Plugin/rename.pm:37
 #, perl-format
 msgid "%s does not exist"
 msgstr "%s eksisterer ikke"
 
-#: ../IkiWiki/Plugin/remove.pm:38
+#: ../IkiWiki/Plugin/remove.pm:39
 #, perl-format
 msgid "%s is not in the srcdir, so it cannot be deleted"
 msgstr "%s er ikke i srcdir, så kan ikke blive slettet"
 
-#: ../IkiWiki/Plugin/remove.pm:41 ../IkiWiki/Plugin/rename.pm:45
+#: ../IkiWiki/Plugin/remove.pm:42 ../IkiWiki/Plugin/rename.pm:46
 #, perl-format
 msgid "%s is not a file"
 msgstr "%s er ikke en fil"
 
-#: ../IkiWiki/Plugin/remove.pm:134
+#: ../IkiWiki/Plugin/remove.pm:137
 #, perl-format
 msgid "confirm removal of %s"
 msgstr "bekræft at %s bliver fjernet"
 
-#: ../IkiWiki/Plugin/remove.pm:171
+#: ../IkiWiki/Plugin/remove.pm:174
 msgid "Please select the attachments to remove."
 msgstr "Vælg vedhæftning der skal slettes."
 
-#: ../IkiWiki/Plugin/remove.pm:211
+#: ../IkiWiki/Plugin/remove.pm:216
 msgid "removed"
 msgstr "fjernet"
 
-#: ../IkiWiki/Plugin/rename.pm:42
+#: ../IkiWiki/Plugin/rename.pm:43
 #, perl-format
 msgid "%s is not in the srcdir, so it cannot be renamed"
 msgstr "%s er ikke i srcdir, så kan ikke blive omdøbt"
 
-#: ../IkiWiki/Plugin/rename.pm:62
+#: ../IkiWiki/Plugin/rename.pm:63
 msgid "no change to the file name was specified"
 msgstr "ingen ændring til filnavnet blev angivet"
 
@@ -841,24 +867,24 @@ msgstr "%s eksisterer allerede på disken"
 msgid "rename %s"
 msgstr "omdøb %s"
 
-#: ../IkiWiki/Plugin/rename.pm:161
+#: ../IkiWiki/Plugin/rename.pm:163
 msgid "Also rename SubPages and attachments"
 msgstr "Omdøb også UnderSider og vedhæftninger"
 
-#: ../IkiWiki/Plugin/rename.pm:247
+#: ../IkiWiki/Plugin/rename.pm:250
 msgid "Only one attachment can be renamed at a time."
 msgstr "Kun en vedhæftning kan blive omdøbt ad gangen."
 
-#: ../IkiWiki/Plugin/rename.pm:250
+#: ../IkiWiki/Plugin/rename.pm:253
 msgid "Please select the attachment to rename."
 msgstr "Vælg vedhæftningen som skal omdøbes."
 
-#: ../IkiWiki/Plugin/rename.pm:347
+#: ../IkiWiki/Plugin/rename.pm:352
 #, perl-format
 msgid "rename %s to %s"
 msgstr "omdøb %s til %s"
 
-#: ../IkiWiki/Plugin/rename.pm:571
+#: ../IkiWiki/Plugin/rename.pm:576
 #, perl-format
 msgid "update for rename of %s to %s"
 msgstr "opdatering til omdøbning af %s til %s"
@@ -873,28 +899,28 @@ msgstr "læsning af %s mislykkedes"
 msgid "rsync_command exited %d"
 msgstr ""
 
-#: ../IkiWiki/Plugin/search.pm:182
+#: ../IkiWiki/Plugin/search.pm:194
 #, perl-format
 msgid "need Digest::SHA1 to index %s"
 msgstr "behøver Digest::SHA1 til indeks %s"
 
-#: ../IkiWiki/Plugin/search.pm:217
+#: ../IkiWiki/Plugin/search.pm:231
 msgid "search"
 msgstr "søg"
 
-#: ../IkiWiki/Plugin/shortcut.pm:31
+#: ../IkiWiki/Plugin/shortcut.pm:32
 #, perl-format
 msgid "shortcut plugin will not work without %s"
 msgstr "genvejsudvidelsen vil ikke fungere uden %s"
 
-#: ../IkiWiki/Plugin/shortcut.pm:44
+#: ../IkiWiki/Plugin/shortcut.pm:45
 msgid "missing name or url parameter"
 msgstr "manglende navn eller url parameter"
 
 #. translators: This is used to display what shortcuts are defined.
 #. translators: First parameter is the name of the shortcut, the second
 #. translators: is an URL.
-#: ../IkiWiki/Plugin/shortcut.pm:54
+#: ../IkiWiki/Plugin/shortcut.pm:55
 #, perl-format
 msgid "shortcut %s points to <i>%s</i>"
 msgstr "genvej %s viser til <i>%s</i>"
@@ -903,109 +929,112 @@ msgstr "genvej %s viser til <i>%s</i>"
 msgid "failed to parse any smileys"
 msgstr "afkodning af smileys mislykkedes"
 
-#: ../IkiWiki/Plugin/sparkline.pm:72
+#: ../IkiWiki/Plugin/sparkline.pm:73
 msgid "parse error"
 msgstr "afkodningsfejl"
 
-#: ../IkiWiki/Plugin/sparkline.pm:78
+#: ../IkiWiki/Plugin/sparkline.pm:79
 msgid "invalid featurepoint diameter"
 msgstr "forkert featurepoint-parameter diameter"
 
-#: ../IkiWiki/Plugin/sparkline.pm:88
+#: ../IkiWiki/Plugin/sparkline.pm:89
 msgid "invalid featurepoint location"
 msgstr "forkert featurepoint-parameter location"
 
-#: ../IkiWiki/Plugin/sparkline.pm:99
+#: ../IkiWiki/Plugin/sparkline.pm:100
 msgid "missing values"
 msgstr "manglende værdier"
 
-#: ../IkiWiki/Plugin/sparkline.pm:104
+#: ../IkiWiki/Plugin/sparkline.pm:105
 msgid "invalid height value"
 msgstr "forkert højdeværdi"
 
-#: ../IkiWiki/Plugin/sparkline.pm:111
+#: ../IkiWiki/Plugin/sparkline.pm:112
 msgid "missing width parameter"
 msgstr "manglende breddeparameter"
 
-#: ../IkiWiki/Plugin/sparkline.pm:115
+#: ../IkiWiki/Plugin/sparkline.pm:116
 msgid "invalid width value"
 msgstr "forkert breddeværdi"
 
-#: ../IkiWiki/Plugin/sparkline.pm:153
+#: ../IkiWiki/Plugin/sparkline.pm:154
 msgid "failed to run php"
 msgstr "php-kørsel mislykkedes"
 
-#: ../IkiWiki/Plugin/table.pm:31
+#: ../IkiWiki/Plugin/table.pm:32
 msgid "cannot find file"
 msgstr "kan ikke finde fil"
 
-#: ../IkiWiki/Plugin/table.pm:87
+#: ../IkiWiki/Plugin/table.pm:88
 msgid "unknown data format"
 msgstr "ukendt dataformat"
 
-#: ../IkiWiki/Plugin/table.pm:95
+#: ../IkiWiki/Plugin/table.pm:96
 msgid "empty data"
 msgstr "blanke data"
 
-#: ../IkiWiki/Plugin/table.pm:114
+#: ../IkiWiki/Plugin/table.pm:115
 msgid "Direct data download"
 msgstr "Direkte datanedlastning"
 
-#: ../IkiWiki/Plugin/table.pm:148
+#: ../IkiWiki/Plugin/table.pm:149
 #, perl-format
 msgid "parse fail at line %d: %s"
 msgstr "afkodningsfejl på linje %d: %s"
 
-#: ../IkiWiki/Plugin/template.pm:29
+#: ../IkiWiki/Plugin/tag.pm:83
+#, fuzzy, perl-format
+msgid "creating tag page %s"
+msgstr "opretter ny side %s"
+
+#: ../IkiWiki/Plugin/template.pm:33
 msgid "missing id parameter"
 msgstr "manglende id-parameter"
 
-#: ../IkiWiki/Plugin/template.pm:36
-#, perl-format
-msgid "template %s not found"
-msgstr "skabelon %s ikke fundet"
-
-#: ../IkiWiki/Plugin/template.pm:55
-msgid "failed to process:"
-msgstr "dannelsen mislykkedes:"
+#: ../IkiWiki/Plugin/template.pm:47
+#, fuzzy, perl-format
+msgid "%s not found"
+msgstr "fødning ikke fundet"
 
-#: ../IkiWiki/Plugin/teximg.pm:70
+#: ../IkiWiki/Plugin/teximg.pm:72
 msgid "missing tex code"
 msgstr "manglende tex-kode"
 
-#: ../IkiWiki/Plugin/teximg.pm:122
+#: ../IkiWiki/Plugin/teximg.pm:124
 msgid "failed to generate image from code"
 msgstr "billedopbygning fra kode mislykkedes"
 
-#: ../IkiWiki/Plugin/websetup.pm:89
-msgid "plugin"
+#: ../IkiWiki/Plugin/websetup.pm:105
+#, fuzzy, perl-format
+msgid "%s plugin:"
 msgstr "udvidelse"
 
-#: ../IkiWiki/Plugin/websetup.pm:108
+#: ../IkiWiki/Plugin/websetup.pm:121
+#, fuzzy, perl-format
+msgid "%s plugins"
+msgstr "udvidelser"
+
+#: ../IkiWiki/Plugin/websetup.pm:135
 #, perl-format
 msgid "enable %s?"
 msgstr "aktivér %s?"
 
-#: ../IkiWiki/Plugin/websetup.pm:240
+#: ../IkiWiki/Plugin/websetup.pm:276
 msgid "setup file for this wiki is not known"
 msgstr "opsætningsfilen for denne wiki er ukendt"
 
-#: ../IkiWiki/Plugin/websetup.pm:256
+#: ../IkiWiki/Plugin/websetup.pm:292
 msgid "main"
 msgstr "primær"
 
-#: ../IkiWiki/Plugin/websetup.pm:257
-msgid "plugins"
-msgstr "udvidelser"
-
-#: ../IkiWiki/Plugin/websetup.pm:395
+#: ../IkiWiki/Plugin/websetup.pm:435
 msgid ""
 "The configuration changes shown below require a wiki rebuild to take effect."
 msgstr ""
 "Opsætningsændringerne vist nedenfor kræver wiki-genopbygning for at træde i "
 "kraft."
 
-#: ../IkiWiki/Plugin/websetup.pm:399
+#: ../IkiWiki/Plugin/websetup.pm:439
 msgid ""
 "For the configuration changes shown below to fully take effect, you may need "
 "to rebuild the wiki."
@@ -1013,7 +1042,7 @@ msgstr ""
 "For at opsætningsændringerne vist nedenfor træder fuldt ud i kraft, skal du "
 "muligvis genopbygge wikien."
 
-#: ../IkiWiki/Plugin/websetup.pm:436
+#: ../IkiWiki/Plugin/websetup.pm:476
 #, perl-format
 msgid "Error: %s exited nonzero (%s). Discarding setup changes."
 msgstr "Fejl: %s returnerede ikke-nul (%s). Dropper opsætningsændringer."
@@ -1028,12 +1057,12 @@ msgstr "kan ikke afgøre id for ikke-tillidsfulde skribent %s"
 msgid "bad file name %s"
 msgstr "dårligt filnavn %s"
 
-#: ../IkiWiki/Render.pm:150
+#: ../IkiWiki/Render.pm:158
 #, perl-format
 msgid "scanning %s"
 msgstr "gennemlæser %s"
 
-#: ../IkiWiki/Render.pm:271
+#: ../IkiWiki/Render.pm:280
 #, perl-format
 msgid ""
 "symlink found in srcdir path (%s) -- set allow_symlinks_before_srcdir to "
@@ -1042,67 +1071,82 @@ msgstr ""
 "symbolsk lænke fundet i srcdir-sti (%s) -- sæt allow_symlinks_before_srcdir "
 "for at tillade dette"
 
-#: ../IkiWiki/Render.pm:300 ../IkiWiki/Render.pm:327
+#: ../IkiWiki/Render.pm:311
 #, perl-format
 msgid "skipping bad filename %s"
 msgstr "udelader forkert filnavn %s"
 
-#: ../IkiWiki/Render.pm:305
+#: ../IkiWiki/Render.pm:327
 #, perl-format
 msgid "%s has multiple possible source pages"
 msgstr "%s har flere mulige kildesider"
 
-#: ../IkiWiki/Render.pm:395
+#: ../IkiWiki/Render.pm:369
 #, perl-format
-msgid "removing old page %s"
+msgid "querying %s for file creation and modification times.."
+msgstr ""
+
+#: ../IkiWiki/Render.pm:431
+#, fuzzy, perl-format
+msgid "removing obsolete %s"
 msgstr "fjerner gammel side %s"
 
-#: ../IkiWiki/Render.pm:471
+#: ../IkiWiki/Render.pm:505
 #, perl-format
 msgid "building %s, which links to %s"
 msgstr "danner %s, som henviser til %s"
 
-#: ../IkiWiki/Render.pm:480
+#: ../IkiWiki/Render.pm:514
 #, perl-format
 msgid "removing %s, no longer built by %s"
 msgstr "fjerner %s, ikke længere dannet af %s"
 
-#: ../IkiWiki/Render.pm:603
+#: ../IkiWiki/Render.pm:597 ../IkiWiki/Render.pm:679
 #, perl-format
 msgid "building %s, which depends on %s"
 msgstr "danner %s, som afhænger af %s"
 
-#: ../IkiWiki/Render.pm:616
+#: ../IkiWiki/Render.pm:692
 #, perl-format
 msgid "building %s, to update its backlinks"
 msgstr "danner %s, for at opdatere dens krydshenvisninger (backlinks)"
 
-#: ../IkiWiki/Render.pm:679
+#: ../IkiWiki/Render.pm:821
 #, perl-format
 msgid "ikiwiki: cannot build %s"
 msgstr "ikiwiki: kan ikke danne %s"
 
 #. translators: The first parameter is a filename, and the second
 #. translators: is a (probably not translated) error message.
-#: ../IkiWiki/Setup.pm:19
+#: ../IkiWiki/Setup.pm:23
 #, perl-format
 msgid "cannot read %s: %s"
 msgstr "kan ikke læse %s: %s"
 
-#: ../IkiWiki/Setup/Automator.pm:33
+#: ../IkiWiki/Setup.pm:34
+#, fuzzy, perl-format
+msgid "cannot load %s in safe mode"
+msgstr "kan ikke læse %s: %s"
+
+#: ../IkiWiki/Setup.pm:46
+#, fuzzy, perl-format
+msgid "failed to parse %s"
+msgstr "opdatering af %s mislykkedes"
+
+#: ../IkiWiki/Setup/Automator.pm:34
 msgid "you must enter a wikiname (that contains alphanumerics)"
 msgstr "du skal angive et wikinavn (som indeholder alfanumeriske tegn)"
 
-#: ../IkiWiki/Setup/Automator.pm:76
+#: ../IkiWiki/Setup/Automator.pm:89
 #, perl-format
 msgid "unsupported revision control system %s"
 msgstr "revisionskontrolsystem %s ikke understøttet"
 
-#: ../IkiWiki/Setup/Automator.pm:102
+#: ../IkiWiki/Setup/Automator.pm:115
 msgid "failed to set up the repository with ikiwiki-makerepo"
 msgstr "opsætning af depotet med ikiwiki-makerepo mislykkedes"
 
-#: ../IkiWiki/Setup/Automator.pm:120
+#: ../IkiWiki/Setup/Automator.pm:134
 #, perl-format
 msgid "** Disabling plugin %s, since it is failing with this message:"
 msgstr "** Deaktiverer udvidelse %s, da den fejler med denne besked:"
@@ -1121,13 +1165,13 @@ msgid "wrapper filename not specified"
 msgstr "wrapper-navn ikke angivet"
 
 #. translators: The parameter is a C filename.
-#: ../IkiWiki/Wrapper.pm:149
+#: ../IkiWiki/Wrapper.pm:160
 #, perl-format
 msgid "failed to compile %s"
 msgstr "kompilering af %s mislykkedes"
 
 #. translators: The parameter is a filename.
-#: ../IkiWiki/Wrapper.pm:169
+#: ../IkiWiki/Wrapper.pm:180
 #, perl-format
 msgid "successfully generated %s"
 msgstr "Korrekt bygget %s"
@@ -1140,59 +1184,65 @@ msgstr "brug: ikiwiki [valg] kilde mål"
 msgid "       ikiwiki --setup configfile"
 msgstr "       ikiwiki --setup opsætningsfil"
 
-#: ../ikiwiki.in:91
+#: ../ikiwiki.in:96
 msgid "usage: --set var=value"
 msgstr "brug: --set var=værdi"
 
-#: ../ikiwiki.in:140
+#: ../ikiwiki.in:103
+#, fuzzy
+msgid "usage: --set-yaml var=value"
+msgstr "brug: --set var=værdi"
+
+#: ../ikiwiki.in:157
 msgid "generating wrappers.."
 msgstr "bygger wrappers.."
 
-#: ../ikiwiki.in:195
+#: ../ikiwiki.in:220
 msgid "rebuilding wiki.."
 msgstr "genopbygger wiki..."
 
-#: ../ikiwiki.in:198
+#: ../ikiwiki.in:223
 msgid "refreshing wiki.."
 msgstr "genopfrisker wiki..."
 
-#: ../IkiWiki.pm:238
+#: ../IkiWiki.pm:232
 msgid "Discussion"
 msgstr "Diskussion"
 
-#: ../IkiWiki.pm:507
+#: ../IkiWiki.pm:531
 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:553
+#: ../IkiWiki.pm:577
 msgid "cannot use multiple rcs plugins"
 msgstr "kan ikke bruge flere samtidige RCS-udvidelser"
 
-#: ../IkiWiki.pm:582
+#: ../IkiWiki.pm:606
 #, 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:1264
+#: ../IkiWiki.pm:1298
 #, perl-format
 msgid "preprocessing loop detected on %s at depth %i"
 msgstr "forudberegningssløkke fundet på %s ved dybde %i"
 
-#: ../IkiWiki.pm:1863
+#: ../IkiWiki.pm:1984
 msgid "yes"
 msgstr "ja"
 
-#: ../IkiWiki.pm:2006
-msgid "Sort::Naturally needed for title_natural sort"
-msgstr "Sort::Naturally krævet for title_natural sortering"
+#: ../IkiWiki.pm:2061
+#, fuzzy, perl-format
+msgid "invalid sort type %s"
+msgstr "ukendt sorteringsform %s"
 
-#: ../IkiWiki.pm:2017
+#: ../IkiWiki.pm:2082
 #, perl-format
 msgid "unknown sort type %s"
 msgstr "ukendt sorteringsform %s"
 
-#: ../IkiWiki.pm:2036
+#: ../IkiWiki.pm:2218
 #, perl-format
 msgid "cannot match pages: %s"
 msgstr "kan ikke få sider til at passe sammen: %s"
@@ -1217,6 +1267,30 @@ msgstr "Hvilken bruger (wiki konto eller openid) skal være administrator?"
 msgid "What is the domain name of the web server?"
 msgstr "Hvad er webserverens domænenavn?"
 
+#~ msgid "You need to log in first."
+#~ msgstr "Du skal først logge på."
+
+#~ msgid "Log in with"
+#~ msgstr "Log på med"
+
+#~ msgid "Get an OpenID"
+#~ msgstr "Skaf en OpenID"
+
+#~ msgid "failed to process"
+#~ msgstr "dannelsen mislykkedes"
+
+#~ msgid "nonexistant template %s"
+#~ msgstr "ikke-eksisterende skabelon: %s"
+
+#~ msgid "getctime not implemented"
+#~ msgstr "getctime ikke implementeret"
+
+#~ msgid "Sort::Naturally needed for title_natural sort"
+#~ msgstr "Sort::Naturally krævet for title_natural sortering"
+
+#~ msgid "failed to read %s"
+#~ msgstr "læsning af %s mislykkedes"
+
 #~ msgid "Failed to parse url, cannot determine domain name"
 #~ msgstr "Tolkning af URL mislykkedes, kan ikke afgøre domænenavn"
 
index e4b5ed9c4ecd14450d72332d3801fc2a0e2e4a14..1cfc57886dc253e59182df93d648c341d0de387f 100644 (file)
--- a/po/de.po
+++ b/po/de.po
@@ -7,19 +7,16 @@ msgid ""
 msgstr ""
 "Project-Id-Version: ikiwiki 3.14159\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-10-31 18:31-0400\n"
-"PO-Revision-Date: 2009-07-23 01:07+0100\n"
-"Last-Translator: Kurt Gramlich <kurt@skolelinux.de>\n"
+"POT-Creation-Date: 2010-05-18 14:18-0400\n"
+"PO-Revision-Date: 2010-03-14 16:09+0530\n"
+"Last-Translator: Sebastian Kuhnert <mail@sebastian-kuhnert.de>\n"
 "Language-Team: German <debian-l10n-german@lists.debian.org>\n"
+"Language: de\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: ../IkiWiki/CGI.pm:114
-msgid "You need to log in first."
-msgstr "Sie müssen sich zuerst anmelden."
-
-#: ../IkiWiki/CGI.pm:147
+#: ../IkiWiki/CGI.pm:162
 msgid ""
 "probable misconfiguration: sslcookie is set, but you are attempting to login "
 "via http, not https"
@@ -27,36 +24,36 @@ msgstr ""
 "vermutliche Fehlkonfiguration: sslcookie ist gesetzt, aber Sie versuchen "
 "sich via http anzumelden, nicht https"
 
-#: ../IkiWiki/CGI.pm:150
+#: ../IkiWiki/CGI.pm:165
 msgid "login failed, perhaps you need to turn on cookies?"
 msgstr ""
 "Anmeldung fehlgeschlagen, möglicherweise müssen Sie zuvor Cookies aktivieren?"
 
-#: ../IkiWiki/CGI.pm:169 ../IkiWiki/CGI.pm:314
+#: ../IkiWiki/CGI.pm:184 ../IkiWiki/CGI.pm:335
 msgid "Your login session has expired."
 msgstr "Ihre Anmeldezeit ist abgelaufen."
 
-#: ../IkiWiki/CGI.pm:190
+#: ../IkiWiki/CGI.pm:205
 msgid "Login"
 msgstr "Anmelden"
 
-#: ../IkiWiki/CGI.pm:191
+#: ../IkiWiki/CGI.pm:206
 msgid "Preferences"
 msgstr "Einstellungen"
 
-#: ../IkiWiki/CGI.pm:192
+#: ../IkiWiki/CGI.pm:207
 msgid "Admin"
 msgstr "Administrator"
 
-#: ../IkiWiki/CGI.pm:232
+#: ../IkiWiki/CGI.pm:247
 msgid "Preferences saved."
 msgstr "Einstellungen gespeichert."
 
-#: ../IkiWiki/CGI.pm:278
+#: ../IkiWiki/CGI.pm:299
 msgid "You are banned."
 msgstr "Sie sind ausgeschlossen worden."
 
-#: ../IkiWiki/CGI.pm:405 ../IkiWiki/CGI.pm:406 ../IkiWiki.pm:1282
+#: ../IkiWiki/CGI.pm:426 ../IkiWiki/CGI.pm:427 ../IkiWiki.pm:1316
 msgid "Error"
 msgstr "Fehler"
 
@@ -137,7 +134,7 @@ msgstr "erstelle neue Seite %s"
 msgid "deleting bucket.."
 msgstr "lösche Behälter (bucket)..."
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:206
+#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:231
 msgid "done"
 msgstr "fertig"
 
@@ -146,43 +143,41 @@ msgstr "fertig"
 msgid "Must specify %s"
 msgstr "%s muss angegeben werden"
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:136
+#: ../IkiWiki/Plugin/amazon_s3.pm:140
 #, fuzzy
 msgid "Failed to create S3 bucket: "
 msgstr "Konnte Behälter (bucket) in S3 nicht anlegen: "
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:221
-#, fuzzy
+#: ../IkiWiki/Plugin/amazon_s3.pm:225
 msgid "Failed to save file to S3: "
 msgstr "Konnte die Datei nicht in S3 speichern: "
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:243
-#, fuzzy
+#: ../IkiWiki/Plugin/amazon_s3.pm:247
 msgid "Failed to delete file from S3: "
 msgstr "Konnte die Datei nicht in S3 löschen: "
 
-#: ../IkiWiki/Plugin/attachment.pm:49
+#: ../IkiWiki/Plugin/attachment.pm:50
 #, perl-format
 msgid "there is already a page named %s"
 msgstr "eine Seite mit dem Namen %s existiert bereits"
 
-#: ../IkiWiki/Plugin/attachment.pm:65
+#: ../IkiWiki/Plugin/attachment.pm:66
 msgid "prohibited by allowed_attachments"
 msgstr "durch allowed_attachements verboten"
 
-#: ../IkiWiki/Plugin/attachment.pm:140
+#: ../IkiWiki/Plugin/attachment.pm:141
 msgid "bad attachment filename"
 msgstr "fehlerhafter Dateiname für Anhang"
 
-#: ../IkiWiki/Plugin/attachment.pm:182
+#: ../IkiWiki/Plugin/attachment.pm:183
 msgid "attachment upload"
 msgstr "Anhang hochladen"
 
-#: ../IkiWiki/Plugin/autoindex.pm:105
+#: ../IkiWiki/Plugin/autoindex.pm:117
 msgid "automatic index generation"
 msgstr "automatische Index-Erstellung"
 
-#: ../IkiWiki/Plugin/blogspam.pm:108
+#: ../IkiWiki/Plugin/blogspam.pm:109
 msgid ""
 "Sorry, but that looks like spam to <a href=\"http://blogspam.net/"
 "\">blogspam</a>: "
@@ -199,194 +194,215 @@ msgstr "%s von %s"
 msgid "There are no broken links!"
 msgstr "Es gibt keine ungültigen Verweise!"
 
-#: ../IkiWiki/Plugin/comments.pm:124 ../IkiWiki/Plugin/format.pm:38
+#: ../IkiWiki/Plugin/comments.pm:112
+#, fuzzy, perl-format
+msgid "this comment needs %s"
+msgstr "kommentiere %s"
+
+#: ../IkiWiki/Plugin/comments.pm:115
+#, fuzzy
+msgid "moderation"
+msgstr "Kommentar-Moderation"
+
+#: ../IkiWiki/Plugin/comments.pm:136 ../IkiWiki/Plugin/format.pm:48
 #, perl-format
 msgid "unsupported page format %s"
 msgstr "nicht unterstütztes Seitenformat %s"
 
-#: ../IkiWiki/Plugin/comments.pm:129
+#: ../IkiWiki/Plugin/comments.pm:141
 msgid "comment must have content"
 msgstr "ein Kommentar sollte Inhalt haben"
 
-#: ../IkiWiki/Plugin/comments.pm:185
+#: ../IkiWiki/Plugin/comments.pm:196
 msgid "Anonymous"
 msgstr "Anonym"
 
-#: ../IkiWiki/Plugin/comments.pm:340 ../IkiWiki/Plugin/editpage.pm:97
+#: ../IkiWiki/Plugin/comments.pm:357 ../IkiWiki/Plugin/editpage.pm:98
 msgid "bad page name"
 msgstr "fehlerhafter Seitenname"
 
-#: ../IkiWiki/Plugin/comments.pm:345
+#: ../IkiWiki/Plugin/comments.pm:362
 #, perl-format
 msgid "commenting on %s"
 msgstr "kommentiere %s"
 
-#: ../IkiWiki/Plugin/comments.pm:363
+#: ../IkiWiki/Plugin/comments.pm:380
 #, perl-format
 msgid "page '%s' doesn't exist, so you can't comment"
 msgstr ""
 "Seite %s existiert nicht, Sie können sie deshalb auch nicht kommentieren"
 
-#: ../IkiWiki/Plugin/comments.pm:370
+#: ../IkiWiki/Plugin/comments.pm:387
 #, perl-format
 msgid "comments on page '%s' are closed"
 msgstr "Kommentare zur Seite %s sind gesperrt"
 
-#: ../IkiWiki/Plugin/comments.pm:464
+#: ../IkiWiki/Plugin/comments.pm:490
 msgid "comment stored for moderation"
 msgstr "Der Kommentar wurde zur Moderation gespeichert"
 
-#: ../IkiWiki/Plugin/comments.pm:466
+#: ../IkiWiki/Plugin/comments.pm:492
 msgid "Your comment will be posted after moderator review"
 msgstr "Ihr Kommentar wird nach Moderation verschickt"
 
-#: ../IkiWiki/Plugin/comments.pm:479
+#: ../IkiWiki/Plugin/comments.pm:505
 msgid "Added a comment"
 msgstr "Kommentar hinzugefügt"
 
-#: ../IkiWiki/Plugin/comments.pm:483
+#: ../IkiWiki/Plugin/comments.pm:509
 #, perl-format
 msgid "Added a comment: %s"
 msgstr "Kommentar hinzugefügt: %s"
 
-#: ../IkiWiki/Plugin/comments.pm:525 ../IkiWiki/Plugin/websetup.pm:236
+#: ../IkiWiki/Plugin/comments.pm:551 ../IkiWiki/Plugin/websetup.pm:272
 msgid "you are not logged in as an admin"
 msgstr "Sie sind nicht als Administrator angemeldet"
 
-#: ../IkiWiki/Plugin/comments.pm:576
+#: ../IkiWiki/Plugin/comments.pm:602
 msgid "Comment moderation"
 msgstr "Kommentar-Moderation"
 
-#: ../IkiWiki/Plugin/comments.pm:615
+#: ../IkiWiki/Plugin/comments.pm:640
 msgid "comment moderation"
 msgstr "Kommentar-Moderation"
 
-#: ../IkiWiki/Plugin/comments.pm:766
-msgid "Comments"
-msgstr "Kommentare"
+#: ../IkiWiki/Plugin/comments.pm:789
+#, perl-format
+msgid "%i comment"
+msgid_plural "%i comments"
+msgstr[0] "%i Kommentar"
+msgstr[1] "%i Kommentare"
+
+#. translators: Here "Comment" is a verb;
+#. translators: the user clicks on it to
+#. translators: post a comment.
+#: ../IkiWiki/Plugin/comments.pm:799
+msgid "Comment"
+msgstr "Kommentieren"
 
-#: ../IkiWiki/Plugin/conditional.pm:27 ../IkiWiki/Plugin/cutpaste.pm:30
-#: ../IkiWiki/Plugin/cutpaste.pm:45 ../IkiWiki/Plugin/cutpaste.pm:61
+#: ../IkiWiki/Plugin/conditional.pm:28 ../IkiWiki/Plugin/cutpaste.pm:31
+#: ../IkiWiki/Plugin/cutpaste.pm:46 ../IkiWiki/Plugin/cutpaste.pm:62
 #: ../IkiWiki/Plugin/testpagespec.pm:26
 #, perl-format
 msgid "%s parameter is required"
 msgstr "der Parameter %s wird benötigt"
 
-#: ../IkiWiki/Plugin/cutpaste.pm:66
+#: ../IkiWiki/Plugin/cutpaste.pm:67
 msgid "no text was copied in this page"
 msgstr "es wurde kein Text in diese Seite kopiert"
 
-#: ../IkiWiki/Plugin/cutpaste.pm:69
+#: ../IkiWiki/Plugin/cutpaste.pm:70
 #, perl-format
 msgid "no text was copied in this page with id %s"
 msgstr "es wurde kein Text in diese Seite mit der id %s kopiert"
 
-#: ../IkiWiki/Plugin/editpage.pm:40
+#: ../IkiWiki/Plugin/editpage.pm:41
 #, perl-format
 msgid "removing old preview %s"
 msgstr "entferne alte Vorschau %s"
 
-#: ../IkiWiki/Plugin/editpage.pm:113
+#: ../IkiWiki/Plugin/editpage.pm:114
 #, perl-format
 msgid "%s is not an editable page"
 msgstr "Seite %s kann nicht bearbeitet werden"
 
-#: ../IkiWiki/Plugin/editpage.pm:292
+#: ../IkiWiki/Plugin/editpage.pm:294
 #, perl-format
 msgid "creating %s"
 msgstr "erstelle %s"
 
-#: ../IkiWiki/Plugin/editpage.pm:310 ../IkiWiki/Plugin/editpage.pm:329
-#: ../IkiWiki/Plugin/editpage.pm:339 ../IkiWiki/Plugin/editpage.pm:383
-#: ../IkiWiki/Plugin/editpage.pm:422
+#: ../IkiWiki/Plugin/editpage.pm:312 ../IkiWiki/Plugin/editpage.pm:331
+#: ../IkiWiki/Plugin/editpage.pm:341 ../IkiWiki/Plugin/editpage.pm:385
+#: ../IkiWiki/Plugin/editpage.pm:424
 #, perl-format
 msgid "editing %s"
 msgstr "bearbeite %s"
 
-#: ../IkiWiki/Plugin/edittemplate.pm:51
+#: ../IkiWiki/Plugin/edittemplate.pm:52
 msgid "template not specified"
 msgstr "Vorlage nicht angegeben"
 
-#: ../IkiWiki/Plugin/edittemplate.pm:54
+#: ../IkiWiki/Plugin/edittemplate.pm:55
 msgid "match not specified"
 msgstr "Übereinstimmung nicht angegeben"
 
-#: ../IkiWiki/Plugin/edittemplate.pm:63
+#: ../IkiWiki/Plugin/edittemplate.pm:64
 #, perl-format
 msgid "edittemplate %s registered for %s"
 msgstr "edittemplate %s für %s registriert"
 
-#: ../IkiWiki/Plugin/edittemplate.pm:137
-msgid "failed to process"
-msgstr "Ablauf fehlgeschlagen"
+#: ../IkiWiki/Plugin/edittemplate.pm:125 ../IkiWiki/Plugin/inline.pm:339
+#: ../IkiWiki/Plugin/template.pm:44
+#, fuzzy
+msgid "failed to process template:"
+msgstr "Fehler beim Ablauf:"
 
-#: ../IkiWiki/Plugin/format.pm:20
+#: ../IkiWiki/Plugin/format.pm:30
 msgid "must specify format and text"
 msgstr "Format und Text müssen spezifiziert werden"
 
-#: ../IkiWiki/Plugin/fortune.pm:27
+#: ../IkiWiki/Plugin/fortune.pm:28
 msgid "fortune failed"
 msgstr "fortune fehlgeschlagen"
 
-#: ../IkiWiki/Plugin/getsource.pm:62 ../IkiWiki/Plugin/goto.pm:55
+#: ../IkiWiki/Plugin/getsource.pm:64 ../IkiWiki/Plugin/goto.pm:58
 msgid "missing page"
 msgstr "fehlende Seite"
 
-#: ../IkiWiki/Plugin/getsource.pm:64 ../IkiWiki/Plugin/goto.pm:57
+#: ../IkiWiki/Plugin/getsource.pm:66 ../IkiWiki/Plugin/goto.pm:60
 #, perl-format
 msgid "The page %s does not exist."
 msgstr "Die Seite %s existiert nicht."
 
-#: ../IkiWiki/Plugin/getsource.pm:73
-#, fuzzy
+#: ../IkiWiki/Plugin/getsource.pm:75
 msgid "not a page"
-msgstr "Kann die Seiten nicht zuordnen: %s"
+msgstr "Keine Seite"
 
-#: ../IkiWiki/Plugin/getsource.pm:75
-#, fuzzy, perl-format
+#: ../IkiWiki/Plugin/getsource.pm:77
+#, perl-format
 msgid "%s is an attachment, not a page."
-msgstr "Seite %s kann nicht bearbeitet werden"
+msgstr "Seite %s ist ein Anhang und keine Seite."
 
-#: ../IkiWiki/Plugin/git.pm:651 ../IkiWiki/Plugin/git.pm:669
+#: ../IkiWiki/Plugin/git.pm:687 ../IkiWiki/Plugin/git.pm:705
 #: ../IkiWiki/Receive.pm:130
 #, perl-format
 msgid "you are not allowed to change %s"
 msgstr "Sie dürfen %s nicht verändern"
 
-#: ../IkiWiki/Plugin/git.pm:691
+#: ../IkiWiki/Plugin/git.pm:727
 #, perl-format
 msgid "you cannot act on a file with mode %s"
 msgstr "Sie können eine Datei mit den Zugriffsrechten %s nicht nutzen"
 
-#: ../IkiWiki/Plugin/git.pm:695
+#: ../IkiWiki/Plugin/git.pm:731
 msgid "you are not allowed to change file modes"
 msgstr "Sie dürfen die Zugriffsrechte der Datei nicht ändern"
 
-#: ../IkiWiki/Plugin/google.pm:25 ../IkiWiki/Plugin/po.pm:131
-#: ../IkiWiki/Plugin/search.pm:36
+#: ../IkiWiki/Plugin/google.pm:26 ../IkiWiki/Plugin/po.pm:134
+#: ../IkiWiki/Plugin/search.pm:37
 #, perl-format
 msgid "Must specify %s when using the %s plugin"
 msgstr "%s muss angegeben werden, wenn die %s Erweiterung verwandt wird"
 
-#: ../IkiWiki/Plugin/graphviz.pm:67
+#: ../IkiWiki/Plugin/graphviz.pm:68
 msgid "failed to run graphviz"
 msgstr "graphviz konnte nicht ausgeführt werden"
 
-#: ../IkiWiki/Plugin/graphviz.pm:94
+#: ../IkiWiki/Plugin/graphviz.pm:90
 msgid "prog not a valid graphviz program"
 msgstr "prog ist kein gültiges graphviz-Programm"
 
-#: ../IkiWiki/Plugin/highlight.pm:47
+#: ../IkiWiki/Plugin/highlight.pm:48
 #, perl-format
 msgid "tohighlight contains unknown file type '%s'"
 msgstr "tohighlight enteilt unbekannten Dateityp '%s'"
 
-#: ../IkiWiki/Plugin/highlight.pm:58
+#: ../IkiWiki/Plugin/highlight.pm:59
 #, perl-format
 msgid "Source code: %s"
 msgstr "Quellcode: %s"
 
-#: ../IkiWiki/Plugin/highlight.pm:123
+#: ../IkiWiki/Plugin/highlight.pm:124
 msgid ""
 "warning: highlight perl module not available; falling back to pass through"
 msgstr ""
@@ -394,165 +410,173 @@ msgstr ""
 "through"
 
 #: ../IkiWiki/Plugin/htmltidy.pm:50
-#, fuzzy
 msgid "htmltidy failed to parse this html"
-msgstr "Smileys konnten nicht ausgewertet werden"
+msgstr "htmltidy konnte dieses HTML nicht auswerten"
 
-#: ../IkiWiki/Plugin/img.pm:64
+#: ../IkiWiki/Plugin/img.pm:69
 msgid "Image::Magick is not installed"
 msgstr "Image::Magick ist nicht installiert"
 
-#: ../IkiWiki/Plugin/img.pm:68 ../IkiWiki/Plugin/img.pm:112
+#: ../IkiWiki/Plugin/img.pm:73 ../IkiWiki/Plugin/img.pm:117
 #, perl-format
 msgid "failed to read %s: %s"
 msgstr "Lesen von %s fehlgeschlagen: %s"
 
-#: ../IkiWiki/Plugin/img.pm:74
+#: ../IkiWiki/Plugin/img.pm:79
 #, perl-format
 msgid "wrong size format \"%s\" (should be WxH)"
 msgstr "falsches Format in \"%s\" für size (sollte BxH sein)"
 
-#: ../IkiWiki/Plugin/img.pm:120
+#: ../IkiWiki/Plugin/img.pm:125
 #, perl-format
 msgid "failed to resize: %s"
 msgstr "Größenänderung fehlgeschlagen: %s"
 
-#: ../IkiWiki/Plugin/img.pm:140
+#: ../IkiWiki/Plugin/img.pm:145
 #, perl-format
 msgid "failed to determine size of image %s"
 msgstr "Größe des Bildes %s konnte nicht festgestellt werden."
 
-#: ../IkiWiki/Plugin/inline.pm:92
+#: ../IkiWiki/Plugin/inline.pm:93
 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:138
+#: ../IkiWiki/Plugin/inline.pm:139
 msgid "page editing not allowed"
 msgstr "bearbeiten der Seiten nicht erlaubt"
 
-#: ../IkiWiki/Plugin/inline.pm:155
+#: ../IkiWiki/Plugin/inline.pm:156
 msgid "missing pages parameter"
 msgstr "fehlender Seitenparameter"
 
-#: ../IkiWiki/Plugin/inline.pm:191
+#: ../IkiWiki/Plugin/inline.pm:192
 #, perl-format
 msgid "the %s and %s parameters cannot be used together"
-msgstr ""
+msgstr "die Parameter %s und %s können nicht zusammen benutzt werden"
 
-#: ../IkiWiki/Plugin/inline.pm:312
+#: ../IkiWiki/Plugin/inline.pm:313
 msgid "Add a new post titled:"
 msgstr "Füge einen neuen Beitrag hinzu. Titel:"
 
-#: ../IkiWiki/Plugin/inline.pm:332
+#: ../IkiWiki/Plugin/inline.pm:342
 #, perl-format
-msgid "nonexistant template %s"
-msgstr "nicht-vorhandene Vorlage %s"
+msgid "template %s not found"
+msgstr "Vorlage %s nicht gefunden"
 
-#: ../IkiWiki/Plugin/inline.pm:598
+#: ../IkiWiki/Plugin/inline.pm:633
 msgid "RPC::XML::Client not found, not pinging"
 msgstr "RPC::XML::Client nicht gefunden, führe Ping nicht aus"
 
-#: ../IkiWiki/Plugin/linkmap.pm:101
+#: ../IkiWiki/Plugin/linkmap.pm:81 ../IkiWiki/Plugin/linkmap.pm:88
+#: ../IkiWiki/Plugin/linkmap.pm:92 ../IkiWiki/Plugin/linkmap.pm:95
 msgid "failed to run dot"
 msgstr "dot konnte nicht ausgeführt werden"
 
-#: ../IkiWiki/Plugin/lockedit.pm:47
+#: ../IkiWiki/Plugin/linkmap.pm:85
+msgid "linkmap"
+msgstr "Verknüpfungskarte"
+
+#: ../IkiWiki/Plugin/lockedit.pm:49
 #, perl-format
 msgid "%s is locked and cannot be edited"
 msgstr "%s ist gesperrt und kann nicht bearbeitet werden"
 
-#: ../IkiWiki/Plugin/mdwn.pm:44
+#: ../IkiWiki/Plugin/mdwn.pm:45
 msgid "multimarkdown is enabled, but Text::MultiMarkdown is not installed"
 msgstr ""
 "multimarkdown ist eingeschaltet, aber Text::MultiMarkdown ist nicht "
 "installiert"
 
-#: ../IkiWiki/Plugin/mdwn.pm:69
+#: ../IkiWiki/Plugin/mdwn.pm:70
 #, perl-format
 msgid "failed to load Markdown.pm perl module (%s) or /usr/bin/markdown (%s)"
 msgstr ""
 "laden des Perlmoduls Markdown.pm (%s) oder /usr/bin/markdown (%s) "
 "fehlgeschlagen"
 
-#: ../IkiWiki/Plugin/meta.pm:161
+#: ../IkiWiki/Plugin/meta.pm:174
 msgid "stylesheet not found"
 msgstr "Stylesheet nicht gefunden"
 
-#: ../IkiWiki/Plugin/meta.pm:199
+#: ../IkiWiki/Plugin/meta.pm:212
 msgid "redir page not found"
 msgstr "Umleitungsseite nicht gefunden"
 
-#: ../IkiWiki/Plugin/meta.pm:213
+#: ../IkiWiki/Plugin/meta.pm:226
 msgid "redir cycle is not allowed"
 msgstr "Zyklische Umleitungen sind nicht erlaubt"
 
-#: ../IkiWiki/Plugin/mirrorlist.pm:43
+#: ../IkiWiki/Plugin/meta.pm:387
+#, fuzzy
+msgid "sort=meta requires a parameter"
+msgstr "erfordert die Parameter 'from' und 'to'"
+
+#: ../IkiWiki/Plugin/mirrorlist.pm:44
 msgid "Mirrors"
 msgstr "Spiegel"
 
-#: ../IkiWiki/Plugin/mirrorlist.pm:43
+#: ../IkiWiki/Plugin/mirrorlist.pm:44
 msgid "Mirror"
 msgstr "Spiegel"
 
-#: ../IkiWiki/Plugin/moderatedcomments.pm:41
-#, fuzzy
+#: ../IkiWiki/Plugin/moderatedcomments.pm:57
 msgid "comment needs moderation"
-msgstr "Kommentar-Moderation"
+msgstr "Kommentar muss moderiert werden"
 
 #: ../IkiWiki/Plugin/more.pm:8
 msgid "more"
 msgstr "mehr"
 
-#: ../IkiWiki/Plugin/norcs.pm:65
-msgid "getctime not implemented"
-msgstr "getctime ist nicht implementiert"
-
-#: ../IkiWiki/Plugin/openid.pm:61
-msgid "Log in with"
-msgstr "Anmelden mit"
-
-#: ../IkiWiki/Plugin/openid.pm:64
-msgid "Get an OpenID"
-msgstr "Eine OpenID anfordern"
+#: ../IkiWiki/Plugin/openid.pm:58
+#, fuzzy, perl-format
+msgid "failed to load openid module: "
+msgstr "erzeugen von %s fehlgeschlagen"
 
-#: ../IkiWiki/Plugin/orphans.pm:55
-#, fuzzy
+#: ../IkiWiki/Plugin/orphans.pm:56
 msgid "All pages have other pages linking to them."
-msgstr "Alle Seiten haben mindenstens einen Verweis von einer anderen Seite."
+msgstr "Alle Seiten haben mindestens einen Verweis von einer anderen Seite."
 
 #: ../IkiWiki/Plugin/pagetemplate.pm:30
 msgid "bad or missing template"
 msgstr "fehlerhafte oder fehlende Vorlage"
 
-#: ../IkiWiki/Plugin/passwordauth.pm:248
+#: ../IkiWiki/Plugin/passwordauth.pm:231
+msgid "Your user page: "
+msgstr "Ihre Benutzerseite: "
+
+#: ../IkiWiki/Plugin/passwordauth.pm:238
+msgid "Create your user page"
+msgstr "Benutzerseite erstellen"
+
+#: ../IkiWiki/Plugin/passwordauth.pm:268
 msgid "Account creation successful. Now you can Login."
 msgstr "Kontoerstellung erfolgreich. Sie können sich jetzt anmelden."
 
-#: ../IkiWiki/Plugin/passwordauth.pm:251
+#: ../IkiWiki/Plugin/passwordauth.pm:271
 msgid "Error creating account."
 msgstr "Konto konnte nicht erstellt werden."
 
-#: ../IkiWiki/Plugin/passwordauth.pm:258
+#: ../IkiWiki/Plugin/passwordauth.pm:278
 msgid "No email address, so cannot email password reset instructions."
 msgstr ""
 "es gibt keine E-Mail Adresse, deshalb kann keine Anweisung zum Zurücksetzen "
 "des Passwortes zugeschickt werden."
 
-#: ../IkiWiki/Plugin/passwordauth.pm:292
+#: ../IkiWiki/Plugin/passwordauth.pm:312
 msgid "Failed to send mail"
 msgstr "Es konnte keine E-Mail versandt werden"
 
-#: ../IkiWiki/Plugin/passwordauth.pm:294
+#: ../IkiWiki/Plugin/passwordauth.pm:314
 msgid "You have been mailed password reset instructions."
 msgstr "Ihnen wurden Anweisungen zum Zurücksetzen des Passworts zugesandt."
 
-#: ../IkiWiki/Plugin/passwordauth.pm:329
+#: ../IkiWiki/Plugin/passwordauth.pm:349
 msgid "incorrect password reset url"
 msgstr "fehlerhafte URL zum Zurücksetzen des Passworts"
 
-#: ../IkiWiki/Plugin/passwordauth.pm:332
+#: ../IkiWiki/Plugin/passwordauth.pm:352
 msgid "password reset denied"
 msgstr "zurücksetzen des Passworts abgelehnt"
 
@@ -580,14 +604,14 @@ msgstr "LWP nicht gefunden, führe Ping nicht aus"
 
 #: ../IkiWiki/Plugin/po.pm:15
 msgid "warning: Old po4a detected! Recommend upgrade to 0.35."
-msgstr ""
+msgstr "Warnung: Altes po4a erkannt! Empfehle Aktualisierung auf 0.35"
 
-#: ../IkiWiki/Plugin/po.pm:138
+#: ../IkiWiki/Plugin/po.pm:142
 #, perl-format
 msgid "%s is not a valid language code"
 msgstr "%s ist keine gültige Sprachkodierung"
 
-#: ../IkiWiki/Plugin/po.pm:150
+#: ../IkiWiki/Plugin/po.pm:154
 #, perl-format
 msgid ""
 "%s is not a valid value for po_link_to, falling back to po_link_to=default"
@@ -595,7 +619,7 @@ msgstr ""
 "%s ist kein gültiger Wert für po_link_to, greife zurück auf "
 "po_link_to=default"
 
-#: ../IkiWiki/Plugin/po.pm:155
+#: ../IkiWiki/Plugin/po.pm:159
 msgid ""
 "po_link_to=negotiated requires usedirs to be enabled, falling back to "
 "po_link_to=default"
@@ -603,21 +627,21 @@ msgstr ""
 "po_link_to=negotiated benötigt usedirs eingeschaltet, greife zurück auf "
 "po_link_to=default"
 
-#: ../IkiWiki/Plugin/po.pm:385
+#: ../IkiWiki/Plugin/po.pm:390
 #, perl-format
 msgid "rebuilding all pages to fix meta titles"
 msgstr "um die meta-titeln zu reparieren werden alle Seiten neu erstellt"
 
-#: ../IkiWiki/Plugin/po.pm:389 ../IkiWiki/Render.pm:638
+#: ../IkiWiki/Plugin/po.pm:394 ../IkiWiki/Render.pm:769
 #, perl-format
 msgid "building %s"
 msgstr "erzeuge %s"
 
-#: ../IkiWiki/Plugin/po.pm:427
+#: ../IkiWiki/Plugin/po.pm:432
 msgid "updated PO files"
 msgstr "PO-Dateien aktualisiert"
 
-#: ../IkiWiki/Plugin/po.pm:451
+#: ../IkiWiki/Plugin/po.pm:456
 msgid ""
 "Can not remove a translation. If the master page is removed, however, its "
 "translations will be removed as well."
@@ -625,7 +649,7 @@ msgstr ""
 "Übersetzung kann nicht entfernt werden. Wenn die Master Seite entfernt wird, "
 "werden auch ihre Übersetzungen entfernt."
 
-#: ../IkiWiki/Plugin/po.pm:471
+#: ../IkiWiki/Plugin/po.pm:476
 msgid ""
 "Can not rename a translation. If the master page is renamed, however, its "
 "translations will be renamed as well."
@@ -633,81 +657,76 @@ msgstr ""
 "Eine Übersetzung kann nicht umbenannt werden. Wenn die Master Seite "
 "unbenannt wird, werden auch ihre Übersetzungen unbenannt."
 
-#: ../IkiWiki/Plugin/po.pm:870
+#: ../IkiWiki/Plugin/po.pm:876
 #, perl-format
 msgid "POT file (%s) does not exist"
 msgstr "POT-Datei (%s) existiert nicht"
 
-#: ../IkiWiki/Plugin/po.pm:884
-#, fuzzy, perl-format
+#: ../IkiWiki/Plugin/po.pm:890
+#, perl-format
 msgid "failed to copy underlay PO file to %s"
-msgstr "kopieren der POT-Datei nach %s fehlgeschlagen"
+msgstr "konnte die PO-Datei nicht aus dem Underlay nach %s kopieren"
 
-#: ../IkiWiki/Plugin/po.pm:893
+#: ../IkiWiki/Plugin/po.pm:899
 #, perl-format
 msgid "failed to update %s"
 msgstr "aktualisieren von %s fehlgeschlagen"
 
-#: ../IkiWiki/Plugin/po.pm:899
+#: ../IkiWiki/Plugin/po.pm:905
 #, perl-format
 msgid "failed to copy the POT file to %s"
 msgstr "kopieren der POT-Datei nach %s fehlgeschlagen"
 
-#: ../IkiWiki/Plugin/po.pm:935
+#: ../IkiWiki/Plugin/po.pm:941
 msgid "N/A"
 msgstr "N/A"
 
-#: ../IkiWiki/Plugin/po.pm:948
+#: ../IkiWiki/Plugin/po.pm:954
 #, perl-format
 msgid "failed to translate %s"
 msgstr "übersetzen von %s fehlgeschlagen"
 
-#: ../IkiWiki/Plugin/po.pm:1032
+#: ../IkiWiki/Plugin/po.pm:1038
 msgid "removed obsolete PO files"
 msgstr "überflüssige PO-Dateien wurden entfernt"
 
-#: ../IkiWiki/Plugin/po.pm:1095 ../IkiWiki/Plugin/po.pm:1109
-#: ../IkiWiki/Plugin/po.pm:1149
+#: ../IkiWiki/Plugin/po.pm:1094 ../IkiWiki/Plugin/po.pm:1108
+#: ../IkiWiki/Plugin/po.pm:1147
 #, perl-format
 msgid "failed to write %s"
 msgstr "schreiben von %s fehlgeschlagen"
 
-#: ../IkiWiki/Plugin/po.pm:1107
+#: ../IkiWiki/Plugin/po.pm:1106
 msgid "failed to translate"
 msgstr "übersetzen fehlgeschlagen"
 
-#: ../IkiWiki/Plugin/po.pm:1112
-#, perl-format
-msgid "failed to read %s"
-msgstr "lesen von %s fehlgeschlagen"
-
-#: ../IkiWiki/Plugin/po.pm:1161
+#: ../IkiWiki/Plugin/po.pm:1159
 msgid "invalid gettext data, go back to previous page to continue edit"
 msgstr ""
 "ungültige gettext Datei, gehe zurück zur vorherigen Seite um weiter zu "
 "arbeiten"
 
-#: ../IkiWiki/Plugin/poll.pm:69
+#: ../IkiWiki/Plugin/poll.pm:70
 msgid "vote"
 msgstr "abstimmen"
 
-#: ../IkiWiki/Plugin/poll.pm:77
+#: ../IkiWiki/Plugin/poll.pm:78
 msgid "Total votes:"
 msgstr "Alle Stimmen:"
 
-#: ../IkiWiki/Plugin/polygen.pm:41
+#: ../IkiWiki/Plugin/polygen.pm:42
 msgid "polygen not installed"
 msgstr "polygen ist nicht installiert"
 
-#: ../IkiWiki/Plugin/polygen.pm:60
+#: ../IkiWiki/Plugin/polygen.pm:61
 msgid "command failed"
 msgstr "Befehl fehlgeschlagen"
 
-#: ../IkiWiki/Plugin/postsparkline.pm:46
+#: ../IkiWiki/Plugin/postsparkline.pm:47
 msgid "missing formula"
 msgstr "fehlende Formel"
 
-#: ../IkiWiki/Plugin/postsparkline.pm:53
+#: ../IkiWiki/Plugin/postsparkline.pm:54
 msgid "unknown formula"
 msgstr "unbekannte Formel"
 
@@ -775,12 +794,12 @@ msgstr "um Mitternacht"
 msgid "at noon on %A"
 msgstr "am Nachmittag des %A"
 
-#: ../IkiWiki/Plugin/progress.pm:34
+#: ../IkiWiki/Plugin/progress.pm:35
 #, perl-format
 msgid "illegal percent value %s"
 msgstr "unzulässiger Prozentwert %s"
 
-#: ../IkiWiki/Plugin/progress.pm:55
+#: ../IkiWiki/Plugin/progress.pm:56
 msgid "need either `percent` or `totalpages` and `donepages` parameters"
 msgstr ""
 "es werden entweder `percent` oder `totalpages` und `donepages` Parameter "
@@ -790,40 +809,40 @@ msgstr ""
 msgid "(Diff truncated)"
 msgstr "(Diff wurde gekürzt)"
 
-#: ../IkiWiki/Plugin/remove.pm:31 ../IkiWiki/Plugin/rename.pm:36
+#: ../IkiWiki/Plugin/remove.pm:32 ../IkiWiki/Plugin/rename.pm:37
 #, perl-format
 msgid "%s does not exist"
 msgstr "%s existiert nicht"
 
-#: ../IkiWiki/Plugin/remove.pm:38
+#: ../IkiWiki/Plugin/remove.pm:39
 #, perl-format
 msgid "%s is not in the srcdir, so it cannot be deleted"
 msgstr "%s ist nicht im srcdir und kann deshalb nicht gelöscht werden"
 
-#: ../IkiWiki/Plugin/remove.pm:41 ../IkiWiki/Plugin/rename.pm:45
+#: ../IkiWiki/Plugin/remove.pm:42 ../IkiWiki/Plugin/rename.pm:46
 #, perl-format
 msgid "%s is not a file"
 msgstr "%s ist keine Datei"
 
-#: ../IkiWiki/Plugin/remove.pm:134
+#: ../IkiWiki/Plugin/remove.pm:137
 #, perl-format
 msgid "confirm removal of %s"
 msgstr "bestätigen Sie die Entfernung von %s"
 
-#: ../IkiWiki/Plugin/remove.pm:171
+#: ../IkiWiki/Plugin/remove.pm:174
 msgid "Please select the attachments to remove."
 msgstr "Bitte wählen Sie die zu entfernenden Anhänge aus."
 
-#: ../IkiWiki/Plugin/remove.pm:211
+#: ../IkiWiki/Plugin/remove.pm:216
 msgid "removed"
 msgstr "entfernt"
 
-#: ../IkiWiki/Plugin/rename.pm:42
+#: ../IkiWiki/Plugin/rename.pm:43
 #, perl-format
 msgid "%s is not in the srcdir, so it cannot be renamed"
 msgstr "%s ist nicht im srcdir und kann deshalb nicht umbenannt werden"
 
-#: ../IkiWiki/Plugin/rename.pm:62
+#: ../IkiWiki/Plugin/rename.pm:63
 msgid "no change to the file name was specified"
 msgstr "es wurde keine Änderung des Dateinamens angegeben"
 
@@ -847,60 +866,60 @@ msgstr "%s existiert bereits auf der Festplatte"
 msgid "rename %s"
 msgstr "benenne %s um"
 
-#: ../IkiWiki/Plugin/rename.pm:161
+#: ../IkiWiki/Plugin/rename.pm:163
 msgid "Also rename SubPages and attachments"
 msgstr "Auch Unterseiten (SubPages) und Anhänge umbenennen"
 
-#: ../IkiWiki/Plugin/rename.pm:247
+#: ../IkiWiki/Plugin/rename.pm:250
 msgid "Only one attachment can be renamed at a time."
 msgstr "Es kann immer nur ein Anhang gleichzeitig umbenannt werden."
 
-#: ../IkiWiki/Plugin/rename.pm:250
+#: ../IkiWiki/Plugin/rename.pm:253
 msgid "Please select the attachment to rename."
 msgstr "Bitte wählen Sie den Anhang aus, der umbenannt werden soll."
 
-#: ../IkiWiki/Plugin/rename.pm:347
+#: ../IkiWiki/Plugin/rename.pm:352
 #, perl-format
 msgid "rename %s to %s"
 msgstr "benenne %s in %s um"
 
-#: ../IkiWiki/Plugin/rename.pm:571
+#: ../IkiWiki/Plugin/rename.pm:576
 #, perl-format
 msgid "update for rename of %s to %s"
 msgstr "aktualisiert zum Umbenennen von %s nach %s"
 
 #: ../IkiWiki/Plugin/rsync.pm:37
-#, fuzzy, perl-format
+#, perl-format
 msgid "failed to execute rsync_command: %s"
-msgstr "lesen von %s fehlgeschlagen"
+msgstr "konnte das rsync_command nicht ausführen: %s"
 
 #: ../IkiWiki/Plugin/rsync.pm:40
 #, perl-format
 msgid "rsync_command exited %d"
-msgstr ""
+msgstr "rsync_command gibt Fehler %d zurück"
 
-#: ../IkiWiki/Plugin/search.pm:182
+#: ../IkiWiki/Plugin/search.pm:194
 #, perl-format
 msgid "need Digest::SHA1 to index %s"
 msgstr "benötige Digest::SHA1 um einen Index von %s zu erstellen"
 
-#: ../IkiWiki/Plugin/search.pm:217
+#: ../IkiWiki/Plugin/search.pm:231
 msgid "search"
 msgstr "suchen"
 
-#: ../IkiWiki/Plugin/shortcut.pm:31
+#: ../IkiWiki/Plugin/shortcut.pm:32
 #, perl-format
 msgid "shortcut plugin will not work without %s"
 msgstr "die shortcut Erweiterung wird ohne %s nicht funktionieren"
 
-#: ../IkiWiki/Plugin/shortcut.pm:44
+#: ../IkiWiki/Plugin/shortcut.pm:45
 msgid "missing name or url parameter"
 msgstr "fehlender Name oder URL-Parameter"
 
 #. translators: This is used to display what shortcuts are defined.
 #. translators: First parameter is the name of the shortcut, the second
 #. translators: is an URL.
-#: ../IkiWiki/Plugin/shortcut.pm:54
+#: ../IkiWiki/Plugin/shortcut.pm:55
 #, perl-format
 msgid "shortcut %s points to <i>%s</i>"
 msgstr "Tastenkürzel %s verweist nach <i>%s</i>"
@@ -909,109 +928,112 @@ msgstr "Tastenkürzel %s verweist nach <i>%s</i>"
 msgid "failed to parse any smileys"
 msgstr "Smileys konnten nicht ausgewertet werden"
 
-#: ../IkiWiki/Plugin/sparkline.pm:72
+#: ../IkiWiki/Plugin/sparkline.pm:73
 msgid "parse error"
 msgstr "Auswertungsfehler"
 
-#: ../IkiWiki/Plugin/sparkline.pm:78
+#: ../IkiWiki/Plugin/sparkline.pm:79
 msgid "invalid featurepoint diameter"
 msgstr "ungültiger featurepoint diameter"
 
-#: ../IkiWiki/Plugin/sparkline.pm:88
+#: ../IkiWiki/Plugin/sparkline.pm:89
 msgid "invalid featurepoint location"
 msgstr "ungültige featurepoint location"
 
-#: ../IkiWiki/Plugin/sparkline.pm:99
+#: ../IkiWiki/Plugin/sparkline.pm:100
 msgid "missing values"
 msgstr "fehlende Werte"
 
-#: ../IkiWiki/Plugin/sparkline.pm:104
+#: ../IkiWiki/Plugin/sparkline.pm:105
 msgid "invalid height value"
 msgstr "ungültige Wert für height"
 
-#: ../IkiWiki/Plugin/sparkline.pm:111
+#: ../IkiWiki/Plugin/sparkline.pm:112
 msgid "missing width parameter"
 msgstr "fehlender Parameter für width"
 
-#: ../IkiWiki/Plugin/sparkline.pm:115
+#: ../IkiWiki/Plugin/sparkline.pm:116
 msgid "invalid width value"
 msgstr "ungültige Wert für width"
 
-#: ../IkiWiki/Plugin/sparkline.pm:153
+#: ../IkiWiki/Plugin/sparkline.pm:154
 msgid "failed to run php"
 msgstr "konnte PHP nicht ausführen"
 
-#: ../IkiWiki/Plugin/table.pm:31
+#: ../IkiWiki/Plugin/table.pm:32
 msgid "cannot find file"
 msgstr "konnte Datei nicht finden"
 
-#: ../IkiWiki/Plugin/table.pm:87
+#: ../IkiWiki/Plugin/table.pm:88
 msgid "unknown data format"
 msgstr "unbekanntes Datenformat"
 
-#: ../IkiWiki/Plugin/table.pm:95
+#: ../IkiWiki/Plugin/table.pm:96
 msgid "empty data"
 msgstr "keine Daten"
 
-#: ../IkiWiki/Plugin/table.pm:114
+#: ../IkiWiki/Plugin/table.pm:115
 msgid "Direct data download"
 msgstr "Direkter Daten-Download"
 
-#: ../IkiWiki/Plugin/table.pm:148
+#: ../IkiWiki/Plugin/table.pm:149
 #, perl-format
 msgid "parse fail at line %d: %s"
 msgstr "Auswertungsfehler in Zeile %d: %s"
 
-#: ../IkiWiki/Plugin/template.pm:29
+#: ../IkiWiki/Plugin/tag.pm:83
+#, fuzzy, perl-format
+msgid "creating tag page %s"
+msgstr "erstelle neue Seite %s"
+
+#: ../IkiWiki/Plugin/template.pm:33
 msgid "missing id parameter"
 msgstr "fehlender Parameter id"
 
-#: ../IkiWiki/Plugin/template.pm:36
-#, perl-format
-msgid "template %s not found"
-msgstr "Vorlage %s nicht gefunden"
-
-#: ../IkiWiki/Plugin/template.pm:55
-msgid "failed to process:"
-msgstr "Fehler beim Ablauf:"
+#: ../IkiWiki/Plugin/template.pm:47
+#, fuzzy, perl-format
+msgid "%s not found"
+msgstr "Vorlage (feed) nicht gefunden"
 
-#: ../IkiWiki/Plugin/teximg.pm:70
+#: ../IkiWiki/Plugin/teximg.pm:72
 msgid "missing tex code"
 msgstr "fehlender TeX-Code"
 
-#: ../IkiWiki/Plugin/teximg.pm:122
+#: ../IkiWiki/Plugin/teximg.pm:124
 msgid "failed to generate image from code"
 msgstr "konnte kein Bild aus dem Code erzeugen"
 
-#: ../IkiWiki/Plugin/websetup.pm:89
-msgid "plugin"
-msgstr "Erweiterung"
+#: ../IkiWiki/Plugin/websetup.pm:105
+#, perl-format
+msgid "%s plugin:"
+msgstr "%s-Erweiterung:"
+
+#: ../IkiWiki/Plugin/websetup.pm:121
+#, fuzzy, perl-format
+msgid "%s plugins"
+msgstr "%s-Erweiterungen"
 
-#: ../IkiWiki/Plugin/websetup.pm:108
+#: ../IkiWiki/Plugin/websetup.pm:135
 #, perl-format
 msgid "enable %s?"
 msgstr "%s aktivieren?"
 
-#: ../IkiWiki/Plugin/websetup.pm:240
+#: ../IkiWiki/Plugin/websetup.pm:276
 msgid "setup file for this wiki is not known"
 msgstr "Die Einrichtungsdatei für dieses Wiki ist unbekannt"
 
-#: ../IkiWiki/Plugin/websetup.pm:256
+#: ../IkiWiki/Plugin/websetup.pm:292
 msgid "main"
 msgstr "Hauptseite"
 
-#: ../IkiWiki/Plugin/websetup.pm:257
-msgid "plugins"
-msgstr "Erweiterungen"
-
-#: ../IkiWiki/Plugin/websetup.pm:395
+#: ../IkiWiki/Plugin/websetup.pm:435
 msgid ""
 "The configuration changes shown below require a wiki rebuild to take effect."
 msgstr ""
 "Die unten aufgeführten Konfigurationsänderungen erfordern ein Neubau des "
 "Wikis, um wirksam zu werden."
 
-#: ../IkiWiki/Plugin/websetup.pm:399
+#: ../IkiWiki/Plugin/websetup.pm:439
 msgid ""
 "For the configuration changes shown below to fully take effect, you may need "
 "to rebuild the wiki."
@@ -1019,7 +1041,7 @@ msgstr ""
 "Damit die unten aufgeführten Konfigurationsänderungen insgesamt wirksam "
 "werden, kann es notwendig sein, das Wikis neu zu bauen."
 
-#: ../IkiWiki/Plugin/websetup.pm:436
+#: ../IkiWiki/Plugin/websetup.pm:476
 #, perl-format
 msgid "Error: %s exited nonzero (%s). Discarding setup changes."
 msgstr ""
@@ -1037,12 +1059,12 @@ msgstr ""
 msgid "bad file name %s"
 msgstr "fehlerhafter Dateiname %s"
 
-#: ../IkiWiki/Render.pm:150
+#: ../IkiWiki/Render.pm:158
 #, perl-format
 msgid "scanning %s"
 msgstr "durchsuche %s"
 
-#: ../IkiWiki/Render.pm:271
+#: ../IkiWiki/Render.pm:280
 #, perl-format
 msgid ""
 "symlink found in srcdir path (%s) -- set allow_symlinks_before_srcdir to "
@@ -1051,68 +1073,83 @@ msgstr ""
 "symbolischer Verweis im srcdir Pfad (%s) gefunden -- setzen Sie "
 "allow_symlinks_before_srcdir, um dies zu erlauben"
 
-#: ../IkiWiki/Render.pm:300 ../IkiWiki/Render.pm:327
+#: ../IkiWiki/Render.pm:311
 #, perl-format
 msgid "skipping bad filename %s"
 msgstr "überspringe fehlerhaften Dateinamen %s"
 
-#: ../IkiWiki/Render.pm:305
+#: ../IkiWiki/Render.pm:327
 #, perl-format
 msgid "%s has multiple possible source pages"
 msgstr "%s hat mehrere mögliche Quellseiten"
 
-#: ../IkiWiki/Render.pm:395
+#: ../IkiWiki/Render.pm:369
 #, perl-format
-msgid "removing old page %s"
+msgid "querying %s for file creation and modification times.."
+msgstr ""
+
+#: ../IkiWiki/Render.pm:431
+#, fuzzy, perl-format
+msgid "removing obsolete %s"
 msgstr "entferne alte Seite %s"
 
-#: ../IkiWiki/Render.pm:471
+#: ../IkiWiki/Render.pm:505
 #, perl-format
 msgid "building %s, which links to %s"
 msgstr "erzeuge %s, die auf %s verweist"
 
-#: ../IkiWiki/Render.pm:480
+#: ../IkiWiki/Render.pm:514
 #, perl-format
 msgid "removing %s, no longer built by %s"
 msgstr "entferne %s, wird nicht länger von %s erzeugt"
 
-#: ../IkiWiki/Render.pm:603
+#: ../IkiWiki/Render.pm:597 ../IkiWiki/Render.pm:679
 #, perl-format
 msgid "building %s, which depends on %s"
 msgstr "erzeuge %s, die von %s abhängt"
 
-#: ../IkiWiki/Render.pm:616
+#: ../IkiWiki/Render.pm:692
 #, perl-format
 msgid "building %s, to update its backlinks"
 msgstr "erzeuge %s, um dessen Rückverweise zu aktualisieren"
 
-#: ../IkiWiki/Render.pm:679
+#: ../IkiWiki/Render.pm:821
 #, perl-format
 msgid "ikiwiki: cannot build %s"
 msgstr "ikiwiki: kann %s nicht erzeugen"
 
 #. translators: The first parameter is a filename, and the second
 #. translators: is a (probably not translated) error message.
-#: ../IkiWiki/Setup.pm:19
+#: ../IkiWiki/Setup.pm:23
 #, perl-format
 msgid "cannot read %s: %s"
 msgstr "kann %s nicht lesen: %s"
 
-#: ../IkiWiki/Setup/Automator.pm:33
+#: ../IkiWiki/Setup.pm:34
+#, fuzzy, perl-format
+msgid "cannot load %s in safe mode"
+msgstr "kann %s nicht lesen: %s"
+
+#: ../IkiWiki/Setup.pm:46
+#, fuzzy, perl-format
+msgid "failed to parse %s"
+msgstr "aktualisieren von %s fehlgeschlagen"
+
+#: ../IkiWiki/Setup/Automator.pm:34
 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:76
+#: ../IkiWiki/Setup/Automator.pm:89
 #, perl-format
 msgid "unsupported revision control system %s"
 msgstr "nicht unterstütztes Versionskontrollsystem %s"
 
-#: ../IkiWiki/Setup/Automator.pm:102
+#: ../IkiWiki/Setup/Automator.pm:115
 msgid "failed to set up the repository with ikiwiki-makerepo"
 msgstr "erstellen des Depots mit ikiwiki-makerepo ist fehlgeschlagen"
 
-#: ../IkiWiki/Setup/Automator.pm:120
+#: ../IkiWiki/Setup/Automator.pm:134
 #, perl-format
 msgid "** Disabling plugin %s, since it is failing with this message:"
 msgstr ""
@@ -1133,13 +1170,13 @@ msgid "wrapper filename not specified"
 msgstr "Dateiname des Wrappers nicht angegeben"
 
 #. translators: The parameter is a C filename.
-#: ../IkiWiki/Wrapper.pm:149
+#: ../IkiWiki/Wrapper.pm:160
 #, perl-format
 msgid "failed to compile %s"
 msgstr "erzeugen von %s fehlgeschlagen"
 
 #. translators: The parameter is a filename.
-#: ../IkiWiki/Wrapper.pm:169
+#: ../IkiWiki/Wrapper.pm:180
 #, perl-format
 msgid "successfully generated %s"
 msgstr "%s wurde erfolgreich erstellt"
@@ -1152,61 +1189,67 @@ msgstr "Aufruf: ikiwiki [Optionen] Quelle Ziel"
 msgid "       ikiwiki --setup configfile"
 msgstr "       ikiwiki --setup Konfigurationsdatei"
 
-#: ../ikiwiki.in:91
+#: ../ikiwiki.in:96
 msgid "usage: --set var=value"
 msgstr "Aufruf: --set Variable=Wert"
 
-#: ../ikiwiki.in:140
+#: ../ikiwiki.in:103
+#, fuzzy
+msgid "usage: --set-yaml var=value"
+msgstr "Aufruf: --set Variable=Wert"
+
+#: ../ikiwiki.in:157
 msgid "generating wrappers.."
 msgstr "erzeuge Wrapper.."
 
-#: ../ikiwiki.in:195
+#: ../ikiwiki.in:220
 msgid "rebuilding wiki.."
 msgstr "erzeuge Wiki neu.."
 
-#: ../ikiwiki.in:198
+#: ../ikiwiki.in:223
 msgid "refreshing wiki.."
 msgstr "aktualisiere Wiki.."
 
-#: ../IkiWiki.pm:238
+#: ../IkiWiki.pm:232
 msgid "Discussion"
 msgstr "Diskussion"
 
-#: ../IkiWiki.pm:507
+#: ../IkiWiki.pm:531
 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:553
+#: ../IkiWiki.pm:577
 msgid "cannot use multiple rcs plugins"
 msgstr ""
 "Es können nicht mehrere Versionskontrollsystem-Erweiterungen verwandt werden"
 
-#: ../IkiWiki.pm:582
+#: ../IkiWiki.pm:606
 #, perl-format
 msgid "failed to load external plugin needed for %s plugin: %s"
 msgstr "Laden der für %s benötigten externen Erweiterung fehlgeschlagen: %s"
 
-#: ../IkiWiki.pm:1264
+#: ../IkiWiki.pm:1298
 #, perl-format
 msgid "preprocessing loop detected on %s at depth %i"
 msgstr "Präprozessorschleife auf %s in Tiefe %i erkannt"
 
-#: ../IkiWiki.pm:1863
+#: ../IkiWiki.pm:1984
 msgid "yes"
 msgstr "ja"
 
-#: ../IkiWiki.pm:2006
-msgid "Sort::Naturally needed for title_natural sort"
-msgstr "Sort::Naturally wird benötigt für title_natural sort"
+#: ../IkiWiki.pm:2061
+#, fuzzy, perl-format
+msgid "invalid sort type %s"
+msgstr "Unbekannter Sortierungstyp %s"
 
-#: ../IkiWiki.pm:2017
+#: ../IkiWiki.pm:2082
 #, perl-format
 msgid "unknown sort type %s"
 msgstr "Unbekannter Sortierungstyp %s"
 
-#: ../IkiWiki.pm:2036
+#: ../IkiWiki.pm:2218
 #, perl-format
 msgid "cannot match pages: %s"
 msgstr "Kann die Seiten nicht zuordnen: %s"
@@ -1231,6 +1274,30 @@ msgstr "Wer (Wiki-Konto oder OpenID) soll Administrator sein?"
 msgid "What is the domain name of the web server?"
 msgstr "Wie lautet der Domainname des Webservers?"
 
+#~ msgid "You need to log in first."
+#~ msgstr "Sie müssen sich zuerst anmelden."
+
+#~ msgid "Log in with"
+#~ msgstr "Anmelden mit"
+
+#~ msgid "Get an OpenID"
+#~ msgstr "Eine OpenID anfordern"
+
+#~ msgid "failed to process"
+#~ msgstr "Ablauf fehlgeschlagen"
+
+#~ msgid "nonexistant template %s"
+#~ msgstr "nicht-vorhandene Vorlage %s"
+
+#~ msgid "getctime not implemented"
+#~ msgstr "getctime ist nicht implementiert"
+
+#~ msgid "Sort::Naturally needed for title_natural sort"
+#~ msgstr "Sort::Naturally wird benötigt für title_natural sort"
+
+#~ msgid "failed to read %s"
+#~ msgstr "lesen von %s fehlgeschlagen"
+
 #~ msgid "Failed to parse url, cannot determine domain name"
 #~ msgstr ""
 #~ "auswerten der URL fehlgeschlagen, konnte Domainnamen nicht feststellen"
index ca26b0bf6b1c1ee99009c9695c75686b7fac32ee..34c70423872fb0ee2aba0d27241581c5c0658ce1 100644 (file)
--- a/po/es.po
+++ b/po/es.po
@@ -9,20 +9,17 @@ msgid ""
 msgstr ""
 "Project-Id-Version: es\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-10-31 18:31-0400\n"
+"POT-Creation-Date: 2010-05-18 14:18-0400\n"
 "PO-Revision-Date: 2009-06-14 12:32+0200\n"
 "Last-Translator: Victor Moral <victor@taquiones.net>\n"
 "Language-Team:  <en@li.org>\n"
+"Language: \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:114
-msgid "You need to log in first."
-msgstr "Antes es necesario identificarse."
-
-#: ../IkiWiki/CGI.pm:147
+#: ../IkiWiki/CGI.pm:162
 msgid ""
 "probable misconfiguration: sslcookie is set, but you are attempting to login "
 "via http, not https"
@@ -31,36 +28,36 @@ msgstr ""
 "activa, pero está intentando registrarse en el sistema vía el protocolo "
 "'http' y no 'https'"
 
-#: ../IkiWiki/CGI.pm:150
+#: ../IkiWiki/CGI.pm:165
 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:169 ../IkiWiki/CGI.pm:314
+#: ../IkiWiki/CGI.pm:184 ../IkiWiki/CGI.pm:335
 msgid "Your login session has expired."
 msgstr "Su registro en el sistema ha expirado."
 
-#: ../IkiWiki/CGI.pm:190
+#: ../IkiWiki/CGI.pm:205
 msgid "Login"
 msgstr "Identificación"
 
-#: ../IkiWiki/CGI.pm:191
+#: ../IkiWiki/CGI.pm:206
 msgid "Preferences"
 msgstr "Preferencias"
 
-#: ../IkiWiki/CGI.pm:192
+#: ../IkiWiki/CGI.pm:207
 msgid "Admin"
 msgstr "Administración"
 
-#: ../IkiWiki/CGI.pm:232
+#: ../IkiWiki/CGI.pm:247
 msgid "Preferences saved."
 msgstr "Las preferencias se han guardado."
 
-#: ../IkiWiki/CGI.pm:278
+#: ../IkiWiki/CGI.pm:299
 msgid "You are banned."
 msgstr "Ha sido expulsado."
 
-#: ../IkiWiki/CGI.pm:405 ../IkiWiki/CGI.pm:406 ../IkiWiki.pm:1282
+#: ../IkiWiki/CGI.pm:426 ../IkiWiki/CGI.pm:427 ../IkiWiki.pm:1316
 msgid "Error"
 msgstr "Error"
 
@@ -142,7 +139,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:231
 msgid "done"
 msgstr "completado"
 
@@ -151,43 +148,43 @@ msgstr "completado"
 msgid "Must specify %s"
 msgstr "Debe especificar %s"
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:136
+#: ../IkiWiki/Plugin/amazon_s3.pm:140
 #, fuzzy
 msgid "Failed to create S3 bucket: "
 msgstr "Creación de directorio en S3 fallida: "
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:221
+#: ../IkiWiki/Plugin/amazon_s3.pm:225
 #, fuzzy
 msgid "Failed to save file to S3: "
 msgstr "No puedo guardar el archivo en S3: "
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:243
+#: ../IkiWiki/Plugin/amazon_s3.pm:247
 #, fuzzy
 msgid "Failed to delete file from S3: "
 msgstr "No puedo borrar archivo en S3: "
 
-#: ../IkiWiki/Plugin/attachment.pm:49
+#: ../IkiWiki/Plugin/attachment.pm:50
 #, perl-format
 msgid "there is already a page named %s"
 msgstr "ya existe una página de nombre %s"
 
-#: ../IkiWiki/Plugin/attachment.pm:65
+#: ../IkiWiki/Plugin/attachment.pm:66
 msgid "prohibited by allowed_attachments"
 msgstr "prohibido por la claúsula allowed_attachments"
 
-#: ../IkiWiki/Plugin/attachment.pm:140
+#: ../IkiWiki/Plugin/attachment.pm:141
 msgid "bad attachment filename"
 msgstr "nombre de archivo adjunto erróneo"
 
-#: ../IkiWiki/Plugin/attachment.pm:182
+#: ../IkiWiki/Plugin/attachment.pm:183
 msgid "attachment upload"
 msgstr "enviado el adjunto"
 
-#: ../IkiWiki/Plugin/autoindex.pm:105
+#: ../IkiWiki/Plugin/autoindex.pm:117
 msgid "automatic index generation"
 msgstr "creación de índice automática"
 
-#: ../IkiWiki/Plugin/blogspam.pm:108
+#: ../IkiWiki/Plugin/blogspam.pm:109
 msgid ""
 "Sorry, but that looks like spam to <a href=\"http://blogspam.net/"
 "\">blogspam</a>: "
@@ -204,193 +201,216 @@ msgstr "%s desde la página %s"
 msgid "There are no broken links!"
 msgstr "¡ No hay enlaces rotos !"
 
-#: ../IkiWiki/Plugin/comments.pm:124 ../IkiWiki/Plugin/format.pm:38
+#: ../IkiWiki/Plugin/comments.pm:112
+#, fuzzy, perl-format
+msgid "this comment needs %s"
+msgstr "creando comentarios en la página %s"
+
+#: ../IkiWiki/Plugin/comments.pm:115
+#, fuzzy
+msgid "moderation"
+msgstr "Aprobación de comentarios"
+
+#: ../IkiWiki/Plugin/comments.pm:136 ../IkiWiki/Plugin/format.pm:48
 #, perl-format
 msgid "unsupported page format %s"
 msgstr "formato de página %s no soportado"
 
-#: ../IkiWiki/Plugin/comments.pm:129
+#: ../IkiWiki/Plugin/comments.pm:141
 msgid "comment must have content"
 msgstr "Un comentario debe tener algún contenido"
 
-#: ../IkiWiki/Plugin/comments.pm:185
+#: ../IkiWiki/Plugin/comments.pm:196
 msgid "Anonymous"
 msgstr "Anónimo"
 
-#: ../IkiWiki/Plugin/comments.pm:340 ../IkiWiki/Plugin/editpage.pm:97
+#: ../IkiWiki/Plugin/comments.pm:357 ../IkiWiki/Plugin/editpage.pm:98
 msgid "bad page name"
 msgstr "nombre de página erróneo"
 
-#: ../IkiWiki/Plugin/comments.pm:345
+#: ../IkiWiki/Plugin/comments.pm:362
 #, perl-format
 msgid "commenting on %s"
 msgstr "creando comentarios en la página %s"
 
-#: ../IkiWiki/Plugin/comments.pm:363
+#: ../IkiWiki/Plugin/comments.pm:380
 #, 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:370
+#: ../IkiWiki/Plugin/comments.pm:387
 #, perl-format
 msgid "comments on page '%s' are closed"
 msgstr "los comentarios para la página '%s' están cerrados"
 
-#: ../IkiWiki/Plugin/comments.pm:464
+#: ../IkiWiki/Plugin/comments.pm:490
 msgid "comment stored for moderation"
 msgstr "comentario guardado a la espera de aprobación"
 
-#: ../IkiWiki/Plugin/comments.pm:466
+#: ../IkiWiki/Plugin/comments.pm:492
 msgid "Your comment will be posted after moderator review"
 msgstr "Su comentario será publicado después de que el moderador lo revise"
 
-#: ../IkiWiki/Plugin/comments.pm:479
+#: ../IkiWiki/Plugin/comments.pm:505
 msgid "Added a comment"
 msgstr "Añadir un comentario"
 
-#: ../IkiWiki/Plugin/comments.pm:483
+#: ../IkiWiki/Plugin/comments.pm:509
 #, perl-format
 msgid "Added a comment: %s"
 msgstr "Comentario añadido: %s"
 
-#: ../IkiWiki/Plugin/comments.pm:525 ../IkiWiki/Plugin/websetup.pm:236
+#: ../IkiWiki/Plugin/comments.pm:551 ../IkiWiki/Plugin/websetup.pm:272
 msgid "you are not logged in as an admin"
 msgstr "No está registrado como un administrador"
 
-#: ../IkiWiki/Plugin/comments.pm:576
+#: ../IkiWiki/Plugin/comments.pm:602
 msgid "Comment moderation"
 msgstr "Aprobación de comentarios"
 
-#: ../IkiWiki/Plugin/comments.pm:615
+#: ../IkiWiki/Plugin/comments.pm:640
 msgid "comment moderation"
 msgstr "aprobación de comentarios"
 
-#: ../IkiWiki/Plugin/comments.pm:766
-msgid "Comments"
+#: ../IkiWiki/Plugin/comments.pm:789
+#, fuzzy, perl-format
+msgid "%i comment"
+msgid_plural "%i comments"
+msgstr[0] "Comentarios"
+msgstr[1] "Comentarios"
+
+#. translators: Here "Comment" is a verb;
+#. translators: the user clicks on it to
+#. translators: post a comment.
+#: ../IkiWiki/Plugin/comments.pm:799
+#, fuzzy
+msgid "Comment"
 msgstr "Comentarios"
 
-#: ../IkiWiki/Plugin/conditional.pm:27 ../IkiWiki/Plugin/cutpaste.pm:30
-#: ../IkiWiki/Plugin/cutpaste.pm:45 ../IkiWiki/Plugin/cutpaste.pm:61
+#: ../IkiWiki/Plugin/conditional.pm:28 ../IkiWiki/Plugin/cutpaste.pm:31
+#: ../IkiWiki/Plugin/cutpaste.pm:46 ../IkiWiki/Plugin/cutpaste.pm:62
 #: ../IkiWiki/Plugin/testpagespec.pm:26
 #, perl-format
 msgid "%s parameter is required"
 msgstr "el parámetro %s es obligatorio"
 
-#: ../IkiWiki/Plugin/cutpaste.pm:66
+#: ../IkiWiki/Plugin/cutpaste.pm:67
 msgid "no text was copied in this page"
 msgstr "no se ha copiado ningún texto en esta página"
 
-#: ../IkiWiki/Plugin/cutpaste.pm:69
+#: ../IkiWiki/Plugin/cutpaste.pm:70
 #, perl-format
 msgid "no text was copied in this page with id %s"
 msgstr "no se ha copiado ningún texto con el identificador %s en esta pagina"
 
-#: ../IkiWiki/Plugin/editpage.pm:40
+#: ../IkiWiki/Plugin/editpage.pm:41
 #, perl-format
 msgid "removing old preview %s"
 msgstr "eliminando la antigua previsualización %s"
 
-#: ../IkiWiki/Plugin/editpage.pm:113
+#: ../IkiWiki/Plugin/editpage.pm:114
 #, perl-format
 msgid "%s is not an editable page"
 msgstr "la página %s no es modificable"
 
-#: ../IkiWiki/Plugin/editpage.pm:292
+#: ../IkiWiki/Plugin/editpage.pm:294
 #, perl-format
 msgid "creating %s"
 msgstr "creando página %s"
 
-#: ../IkiWiki/Plugin/editpage.pm:310 ../IkiWiki/Plugin/editpage.pm:329
-#: ../IkiWiki/Plugin/editpage.pm:339 ../IkiWiki/Plugin/editpage.pm:383
-#: ../IkiWiki/Plugin/editpage.pm:422
+#: ../IkiWiki/Plugin/editpage.pm:312 ../IkiWiki/Plugin/editpage.pm:331
+#: ../IkiWiki/Plugin/editpage.pm:341 ../IkiWiki/Plugin/editpage.pm:385
+#: ../IkiWiki/Plugin/editpage.pm:424
 #, perl-format
 msgid "editing %s"
 msgstr "modificando página %s"
 
-#: ../IkiWiki/Plugin/edittemplate.pm:51
+#: ../IkiWiki/Plugin/edittemplate.pm:52
 msgid "template not specified"
 msgstr "falta indicar la plantilla (template)"
 
-#: ../IkiWiki/Plugin/edittemplate.pm:54
+#: ../IkiWiki/Plugin/edittemplate.pm:55
 msgid "match not specified"
 msgstr "falta indicar la coincidencia de páginas (match)"
 
-#: ../IkiWiki/Plugin/edittemplate.pm:63
+#: ../IkiWiki/Plugin/edittemplate.pm:64
 #, perl-format
 msgid "edittemplate %s registered for %s"
 msgstr "plantilla de edición %s registrada para %s"
 
-#: ../IkiWiki/Plugin/edittemplate.pm:137
-msgid "failed to process"
-msgstr "fallo en el proceso"
+#: ../IkiWiki/Plugin/edittemplate.pm:125 ../IkiWiki/Plugin/inline.pm:339
+#: ../IkiWiki/Plugin/template.pm:44
+#, fuzzy
+msgid "failed to process template:"
+msgstr "se ha producido un error fatal mientras procesaba la plantilla:"
 
-#: ../IkiWiki/Plugin/format.pm:20
+#: ../IkiWiki/Plugin/format.pm:30
 msgid "must specify format and text"
 msgstr "se deben especificar tanto el formato como el texto"
 
-#: ../IkiWiki/Plugin/fortune.pm:27
+#: ../IkiWiki/Plugin/fortune.pm:28
 msgid "fortune failed"
 msgstr "el programa fortune ha fallado"
 
-#: ../IkiWiki/Plugin/getsource.pm:62 ../IkiWiki/Plugin/goto.pm:55
+#: ../IkiWiki/Plugin/getsource.pm:64 ../IkiWiki/Plugin/goto.pm:58
 msgid "missing page"
 msgstr "página no encontrada"
 
-#: ../IkiWiki/Plugin/getsource.pm:64 ../IkiWiki/Plugin/goto.pm:57
+#: ../IkiWiki/Plugin/getsource.pm:66 ../IkiWiki/Plugin/goto.pm:60
 #, perl-format
 msgid "The page %s does not exist."
 msgstr "No existe la página %s."
 
-#: ../IkiWiki/Plugin/getsource.pm:73
+#: ../IkiWiki/Plugin/getsource.pm:75
 #, fuzzy
 msgid "not a page"
 msgstr "no encuentro páginas coincidentes: %s"
 
-#: ../IkiWiki/Plugin/getsource.pm:75
+#: ../IkiWiki/Plugin/getsource.pm:77
 #, fuzzy, perl-format
 msgid "%s is an attachment, not a page."
 msgstr "la página %s no es modificable"
 
-#: ../IkiWiki/Plugin/git.pm:651 ../IkiWiki/Plugin/git.pm:669
+#: ../IkiWiki/Plugin/git.pm:687 ../IkiWiki/Plugin/git.pm:705
 #: ../IkiWiki/Receive.pm:130
 #, perl-format
 msgid "you are not allowed to change %s"
 msgstr "No puede cambiar %s"
 
-#: ../IkiWiki/Plugin/git.pm:691
+#: ../IkiWiki/Plugin/git.pm:727
 #, perl-format
 msgid "you cannot act on a file with mode %s"
 msgstr "no puede actuar sobre un archivo con permisos %s"
 
-#: ../IkiWiki/Plugin/git.pm:695
+#: ../IkiWiki/Plugin/git.pm:731
 msgid "you are not allowed to change file modes"
 msgstr "No puede cambiar los permisos de acceso de un archivo"
 
-#: ../IkiWiki/Plugin/google.pm:25 ../IkiWiki/Plugin/po.pm:131
-#: ../IkiWiki/Plugin/search.pm:36
+#: ../IkiWiki/Plugin/google.pm:26 ../IkiWiki/Plugin/po.pm:134
+#: ../IkiWiki/Plugin/search.pm:37
 #, fuzzy, perl-format
 msgid "Must specify %s when using the %s plugin"
 msgstr "Es obligatorio indicar %s cuando se utiliza el complemento de búsqueda"
 
-#: ../IkiWiki/Plugin/graphviz.pm:67
+#: ../IkiWiki/Plugin/graphviz.pm:68
 msgid "failed to run graphviz"
 msgstr "no he podido ejecutar el programa graphviz "
 
-#: ../IkiWiki/Plugin/graphviz.pm:94
+#: ../IkiWiki/Plugin/graphviz.pm:90
 msgid "prog not a valid graphviz program"
 msgstr "prog no es un programa graphviz válido "
 
-#: ../IkiWiki/Plugin/highlight.pm:47
+#: ../IkiWiki/Plugin/highlight.pm:48
 #, perl-format
 msgid "tohighlight contains unknown file type '%s'"
 msgstr "la directiva tohighlight contiene el tipo de archivo desconocido '%s' "
 
-#: ../IkiWiki/Plugin/highlight.pm:58
+#: ../IkiWiki/Plugin/highlight.pm:59
 #, perl-format
 msgid "Source code: %s"
 msgstr "Código fuente: %s"
 
-#: ../IkiWiki/Plugin/highlight.pm:123
+#: ../IkiWiki/Plugin/highlight.pm:124
 msgid ""
 "warning: highlight perl module not available; falling back to pass through"
 msgstr ""
@@ -402,104 +422,114 @@ msgstr ""
 msgid "htmltidy failed to parse this html"
 msgstr "Algunos emoticonos tienen errores"
 
-#: ../IkiWiki/Plugin/img.pm:64
+#: ../IkiWiki/Plugin/img.pm:69
 msgid "Image::Magick is not installed"
 msgstr "El complemento Image::Magick no ha sido instalado"
 
-#: ../IkiWiki/Plugin/img.pm:68 ../IkiWiki/Plugin/img.pm:112
+#: ../IkiWiki/Plugin/img.pm:73 ../IkiWiki/Plugin/img.pm:117
 #, perl-format
 msgid "failed to read %s: %s"
 msgstr "no puedo leer de %s: %s "
 
-#: ../IkiWiki/Plugin/img.pm:74
+#: ../IkiWiki/Plugin/img.pm:79
 #, perl-format
 msgid "wrong size format \"%s\" (should be WxH)"
 msgstr ""
 
-#: ../IkiWiki/Plugin/img.pm:120
+#: ../IkiWiki/Plugin/img.pm:125
 #, perl-format
 msgid "failed to resize: %s"
 msgstr "dimensionamiento fallido: %s"
 
-#: ../IkiWiki/Plugin/img.pm:140
+#: ../IkiWiki/Plugin/img.pm:145
 #, perl-format
 msgid "failed to determine size of image %s"
 msgstr "no he podido determinar el tamaño de la imagen %s"
 
-#: ../IkiWiki/Plugin/inline.pm:92
+#: ../IkiWiki/Plugin/inline.pm:93
 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:138
+#: ../IkiWiki/Plugin/inline.pm:139
 msgid "page editing not allowed"
 msgstr "no está permitida la modificación de páginas"
 
-#: ../IkiWiki/Plugin/inline.pm:155
+#: ../IkiWiki/Plugin/inline.pm:156
 msgid "missing pages parameter"
 msgstr "falta el parámetro pages"
 
-#: ../IkiWiki/Plugin/inline.pm:191
+#: ../IkiWiki/Plugin/inline.pm:192
 #, perl-format
 msgid "the %s and %s parameters cannot be used together"
 msgstr ""
 
-#: ../IkiWiki/Plugin/inline.pm:312
+#: ../IkiWiki/Plugin/inline.pm:313
 msgid "Add a new post titled:"
 msgstr "Añadir una entrada nueva titulada:"
 
-#: ../IkiWiki/Plugin/inline.pm:332
+#: ../IkiWiki/Plugin/inline.pm:342
 #, perl-format
-msgid "nonexistant template %s"
-msgstr "la plantilla %s no existe "
+msgid "template %s not found"
+msgstr "no he encontrado la plantilla %s"
 
-#: ../IkiWiki/Plugin/inline.pm:598
+#: ../IkiWiki/Plugin/inline.pm:633
 msgid "RPC::XML::Client not found, not pinging"
 msgstr "No he encontrado el componente RPC::XML::Client, no envío señal alguna"
 
-#: ../IkiWiki/Plugin/linkmap.pm:101
+#: ../IkiWiki/Plugin/linkmap.pm:81 ../IkiWiki/Plugin/linkmap.pm:88
+#: ../IkiWiki/Plugin/linkmap.pm:92 ../IkiWiki/Plugin/linkmap.pm:95
 msgid "failed to run dot"
 msgstr "no he podido ejecutar el programa dot"
 
-#: ../IkiWiki/Plugin/lockedit.pm:47
+#: ../IkiWiki/Plugin/linkmap.pm:85
+msgid "linkmap"
+msgstr ""
+
+#: ../IkiWiki/Plugin/lockedit.pm:49
 #, perl-format
 msgid "%s is locked and cannot be edited"
 msgstr "La página %s está bloqueada y no puede modificarse"
 
-#: ../IkiWiki/Plugin/mdwn.pm:44
+#: ../IkiWiki/Plugin/mdwn.pm:45
 msgid "multimarkdown is enabled, but Text::MultiMarkdown is not installed"
 msgstr ""
 "el modo multimarkdown está activo, pero no está instalado Text::MultiMarkdown"
 
-#: ../IkiWiki/Plugin/mdwn.pm:69
+#: ../IkiWiki/Plugin/mdwn.pm:70
 #, perl-format
 msgid "failed to load Markdown.pm perl module (%s) or /usr/bin/markdown (%s)"
 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:161
+#: ../IkiWiki/Plugin/meta.pm:174
 msgid "stylesheet not found"
 msgstr "hoja de estilo no encontrada "
 
-#: ../IkiWiki/Plugin/meta.pm:199
+#: ../IkiWiki/Plugin/meta.pm:212
 msgid "redir page not found"
 msgstr "falta la página a donde redirigir"
 
-#: ../IkiWiki/Plugin/meta.pm:213
+#: ../IkiWiki/Plugin/meta.pm:226
 msgid "redir cycle is not allowed"
 msgstr "ciclo de redirección no permitido"
 
-#: ../IkiWiki/Plugin/mirrorlist.pm:43
+#: ../IkiWiki/Plugin/meta.pm:387
+#, fuzzy
+msgid "sort=meta requires a parameter"
+msgstr "los parámetros 'from' y 'to' son obligatorios"
+
+#: ../IkiWiki/Plugin/mirrorlist.pm:44
 msgid "Mirrors"
 msgstr "Réplicas"
 
-#: ../IkiWiki/Plugin/mirrorlist.pm:43
+#: ../IkiWiki/Plugin/mirrorlist.pm:44
 msgid "Mirror"
 msgstr "Réplica"
 
-#: ../IkiWiki/Plugin/moderatedcomments.pm:41
+#: ../IkiWiki/Plugin/moderatedcomments.pm:57
 #, fuzzy
 msgid "comment needs moderation"
 msgstr "aprobación de comentarios"
@@ -508,19 +538,12 @@ msgstr "aprobación de comentarios"
 msgid "more"
 msgstr "ver más"
 
-#: ../IkiWiki/Plugin/norcs.pm:65
-msgid "getctime not implemented"
-msgstr "la funcionalidad getctime no está incluida"
-
-#: ../IkiWiki/Plugin/openid.pm:61
-msgid "Log in with"
-msgstr "Identificarse mediante "
-
-#: ../IkiWiki/Plugin/openid.pm:64
-msgid "Get an OpenID"
-msgstr "Consiga un identificador OpenID"
+#: ../IkiWiki/Plugin/openid.pm:58
+#, fuzzy, perl-format
+msgid "failed to load openid module: "
+msgstr "ha fallado la compilación del programa %s"
 
-#: ../IkiWiki/Plugin/orphans.pm:55
+#: ../IkiWiki/Plugin/orphans.pm:56
 #, fuzzy
 msgid "All pages have other pages linking to them."
 msgstr "Todas las páginas están referenciadas entre sí."
@@ -529,35 +552,43 @@ msgstr "Todas las páginas están referenciadas entre sí."
 msgid "bad or missing template"
 msgstr "plantilla errónea ó no existente"
 
-#: ../IkiWiki/Plugin/passwordauth.pm:248
+#: ../IkiWiki/Plugin/passwordauth.pm:231
+msgid "Your user page: "
+msgstr ""
+
+#: ../IkiWiki/Plugin/passwordauth.pm:238
+msgid "Create your user page"
+msgstr ""
+
+#: ../IkiWiki/Plugin/passwordauth.pm:268
 msgid "Account creation successful. Now you can Login."
 msgstr "Cuenta de usuario creada con éxito. Ahora puede identificarse."
 
-#: ../IkiWiki/Plugin/passwordauth.pm:251
+#: ../IkiWiki/Plugin/passwordauth.pm:271
 msgid "Error creating account."
 msgstr "Error creando la cuenta de usuario."
 
-#: ../IkiWiki/Plugin/passwordauth.pm:258
+#: ../IkiWiki/Plugin/passwordauth.pm:278
 msgid "No email address, so cannot email password reset instructions."
 msgstr ""
 "No tengo dirección de correo electrónica, así que no puedo enviar "
 "instrucciones para reiniciar la contraseña"
 
-#: ../IkiWiki/Plugin/passwordauth.pm:292
+#: ../IkiWiki/Plugin/passwordauth.pm:312
 msgid "Failed to send mail"
 msgstr "No he podido enviar el mensaje de correo electrónico"
 
-#: ../IkiWiki/Plugin/passwordauth.pm:294
+#: ../IkiWiki/Plugin/passwordauth.pm:314
 msgid "You have been mailed password reset instructions."
 msgstr ""
 "Las instrucciones para reiniciar la contraseña se le han enviado por correo "
 "electrónico"
 
-#: ../IkiWiki/Plugin/passwordauth.pm:329
+#: ../IkiWiki/Plugin/passwordauth.pm:349
 msgid "incorrect password reset url"
 msgstr "el url para reiniciar la contraseña es incorrecto"
 
-#: ../IkiWiki/Plugin/passwordauth.pm:332
+#: ../IkiWiki/Plugin/passwordauth.pm:352
 msgid "password reset denied"
 msgstr "reinicio de contraseña denegado"
 
@@ -587,123 +618,118 @@ msgstr "No he encontrado el componente LWP, no envío señal alguna"
 msgid "warning: Old po4a detected! Recommend upgrade to 0.35."
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:138
+#: ../IkiWiki/Plugin/po.pm:142
 #, fuzzy, perl-format
 msgid "%s is not a valid language code"
 msgstr "%s no es un archivo"
 
-#: ../IkiWiki/Plugin/po.pm:150
+#: ../IkiWiki/Plugin/po.pm:154
 #, perl-format
 msgid ""
 "%s is not a valid value for po_link_to, falling back to po_link_to=default"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:155
+#: ../IkiWiki/Plugin/po.pm:159
 msgid ""
 "po_link_to=negotiated requires usedirs to be enabled, falling back to "
 "po_link_to=default"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:385
+#: ../IkiWiki/Plugin/po.pm:390
 #, perl-format
 msgid "rebuilding all pages to fix meta titles"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:389 ../IkiWiki/Render.pm:638
+#: ../IkiWiki/Plugin/po.pm:394 ../IkiWiki/Render.pm:769
 #, fuzzy, perl-format
 msgid "building %s"
 msgstr "Informaremos a %s"
 
-#: ../IkiWiki/Plugin/po.pm:427
+#: ../IkiWiki/Plugin/po.pm:432
 msgid "updated PO files"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:451
+#: ../IkiWiki/Plugin/po.pm:456
 msgid ""
 "Can not remove a translation. If the master page is removed, however, its "
 "translations will be removed as well."
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:471
+#: ../IkiWiki/Plugin/po.pm:476
 msgid ""
 "Can not rename a translation. If the master page is renamed, however, its "
 "translations will be renamed as well."
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:870
+#: ../IkiWiki/Plugin/po.pm:876
 #, fuzzy, perl-format
 msgid "POT file (%s) does not exist"
 msgstr "No existe la página %s."
 
-#: ../IkiWiki/Plugin/po.pm:884
+#: ../IkiWiki/Plugin/po.pm:890
 #, fuzzy, perl-format
 msgid "failed to copy underlay PO file to %s"
 msgstr "ha fallado la compilación del programa %s"
 
-#: ../IkiWiki/Plugin/po.pm:893
+#: ../IkiWiki/Plugin/po.pm:899
 #, fuzzy, perl-format
 msgid "failed to update %s"
 msgstr "ha fallado la compilación del programa %s"
 
-#: ../IkiWiki/Plugin/po.pm:899
+#: ../IkiWiki/Plugin/po.pm:905
 #, fuzzy, perl-format
 msgid "failed to copy the POT file to %s"
 msgstr "ha fallado la compilación del programa %s"
 
-#: ../IkiWiki/Plugin/po.pm:935
+#: ../IkiWiki/Plugin/po.pm:941
 msgid "N/A"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:948
+#: ../IkiWiki/Plugin/po.pm:954
 #, fuzzy, perl-format
 msgid "failed to translate %s"
 msgstr "dimensionamiento fallido: %s"
 
-#: ../IkiWiki/Plugin/po.pm:1032
+#: ../IkiWiki/Plugin/po.pm:1038
 msgid "removed obsolete PO files"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:1095 ../IkiWiki/Plugin/po.pm:1109
-#: ../IkiWiki/Plugin/po.pm:1149
+#: ../IkiWiki/Plugin/po.pm:1094 ../IkiWiki/Plugin/po.pm:1108
+#: ../IkiWiki/Plugin/po.pm:1147
 #, fuzzy, perl-format
 msgid "failed to write %s"
 msgstr "dimensionamiento fallido: %s"
 
-#: ../IkiWiki/Plugin/po.pm:1107
+#: ../IkiWiki/Plugin/po.pm:1106
 #, fuzzy
 msgid "failed to translate"
 msgstr "no he podido ejecutar el programa dot"
 
-#: ../IkiWiki/Plugin/po.pm:1112
-#, fuzzy, perl-format
-msgid "failed to read %s"
-msgstr "no puedo leer de %s: %s "
-
-#: ../IkiWiki/Plugin/po.pm:1161
+#: ../IkiWiki/Plugin/po.pm:1159
 msgid "invalid gettext data, go back to previous page to continue edit"
 msgstr ""
 
-#: ../IkiWiki/Plugin/poll.pm:69
+#: ../IkiWiki/Plugin/poll.pm:70
 msgid "vote"
 msgstr "Votar"
 
-#: ../IkiWiki/Plugin/poll.pm:77
+#: ../IkiWiki/Plugin/poll.pm:78
 msgid "Total votes:"
 msgstr "Recuento de votos:"
 
-#: ../IkiWiki/Plugin/polygen.pm:41
+#: ../IkiWiki/Plugin/polygen.pm:42
 msgid "polygen not installed"
 msgstr "El complemento polygen no ha sido instalado"
 
-#: ../IkiWiki/Plugin/polygen.pm:60
+#: ../IkiWiki/Plugin/polygen.pm:61
 msgid "command failed"
 msgstr "la ejecución del programa ha fallado"
 
-#: ../IkiWiki/Plugin/postsparkline.pm:46
+#: ../IkiWiki/Plugin/postsparkline.pm:47
 msgid "missing formula"
 msgstr "falta la fórmula"
 
-#: ../IkiWiki/Plugin/postsparkline.pm:53
+#: ../IkiWiki/Plugin/postsparkline.pm:54
 msgid "unknown formula"
 msgstr "fórmula desconocida "
 
@@ -771,12 +797,12 @@ msgstr "a medianoche"
 msgid "at noon on %A"
 msgstr "el %A a media tarde"
 
-#: ../IkiWiki/Plugin/progress.pm:34
+#: ../IkiWiki/Plugin/progress.pm:35
 #, perl-format
 msgid "illegal percent value %s"
 msgstr "%s es un valor erróneo para un porcentaje"
 
-#: ../IkiWiki/Plugin/progress.pm:55
+#: ../IkiWiki/Plugin/progress.pm:56
 msgid "need either `percent` or `totalpages` and `donepages` parameters"
 msgstr "son necesarios los parámetros 'donepages' y 'percent' ó 'totalpages'"
 
@@ -784,40 +810,40 @@ msgstr "son necesarios los parámetros 'donepages' y 'percent' ó 'totalpages'"
 msgid "(Diff truncated)"
 msgstr "(Lista de diferencias truncada)"
 
-#: ../IkiWiki/Plugin/remove.pm:31 ../IkiWiki/Plugin/rename.pm:36
+#: ../IkiWiki/Plugin/remove.pm:32 ../IkiWiki/Plugin/rename.pm:37
 #, perl-format
 msgid "%s does not exist"
 msgstr "No existe la página %s."
 
-#: ../IkiWiki/Plugin/remove.pm:38
+#: ../IkiWiki/Plugin/remove.pm:39
 #, perl-format
 msgid "%s is not in the srcdir, so it cannot be deleted"
 msgstr "%s no está en el directorio fuente por lo que no puede ser borrada"
 
-#: ../IkiWiki/Plugin/remove.pm:41 ../IkiWiki/Plugin/rename.pm:45
+#: ../IkiWiki/Plugin/remove.pm:42 ../IkiWiki/Plugin/rename.pm:46
 #, perl-format
 msgid "%s is not a file"
 msgstr "%s no es un archivo"
 
-#: ../IkiWiki/Plugin/remove.pm:134
+#: ../IkiWiki/Plugin/remove.pm:137
 #, perl-format
 msgid "confirm removal of %s"
 msgstr "confirme el borrado de %s"
 
-#: ../IkiWiki/Plugin/remove.pm:171
+#: ../IkiWiki/Plugin/remove.pm:174
 msgid "Please select the attachments to remove."
 msgstr "Por favor seleccione los adjuntos que serán borrados."
 
-#: ../IkiWiki/Plugin/remove.pm:211
+#: ../IkiWiki/Plugin/remove.pm:216
 msgid "removed"
 msgstr "borrado"
 
-#: ../IkiWiki/Plugin/rename.pm:42
+#: ../IkiWiki/Plugin/rename.pm:43
 #, perl-format
 msgid "%s is not in the srcdir, so it cannot be renamed"
 msgstr "%s no está en el directorio fuente por lo que no puede ser renombrado"
 
-#: ../IkiWiki/Plugin/rename.pm:62
+#: ../IkiWiki/Plugin/rename.pm:63
 msgid "no change to the file name was specified"
 msgstr "no se ha indicado cambio alguno en el nombre del archivo"
 
@@ -841,24 +867,24 @@ msgstr "%s ya existe en el disco"
 msgid "rename %s"
 msgstr "cambiando de nombre %s"
 
-#: ../IkiWiki/Plugin/rename.pm:161
+#: ../IkiWiki/Plugin/rename.pm:163
 msgid "Also rename SubPages and attachments"
 msgstr "También cambia de nombre las subpáginas y los adjuntos"
 
-#: ../IkiWiki/Plugin/rename.pm:247
+#: ../IkiWiki/Plugin/rename.pm:250
 msgid "Only one attachment can be renamed at a time."
 msgstr "Únicamente un adjunto puede ser renombrado a la vez."
 
-#: ../IkiWiki/Plugin/rename.pm:250
+#: ../IkiWiki/Plugin/rename.pm:253
 msgid "Please select the attachment to rename."
 msgstr "Por favor, seleccione el adjunto al que cambiar el nombre."
 
-#: ../IkiWiki/Plugin/rename.pm:347
+#: ../IkiWiki/Plugin/rename.pm:352
 #, perl-format
 msgid "rename %s to %s"
 msgstr "%s cambia de nombre a %s"
 
-#: ../IkiWiki/Plugin/rename.pm:571
+#: ../IkiWiki/Plugin/rename.pm:576
 #, perl-format
 msgid "update for rename of %s to %s"
 msgstr "actualizado el cambio de nombre de %s a %s"
@@ -873,28 +899,28 @@ msgstr "no puedo leer de %s: %s "
 msgid "rsync_command exited %d"
 msgstr ""
 
-#: ../IkiWiki/Plugin/search.pm:182
+#: ../IkiWiki/Plugin/search.pm:194
 #, perl-format
 msgid "need Digest::SHA1 to index %s"
 msgstr "se necesita la instalación de Digest::SHA1 para indexar %s"
 
-#: ../IkiWiki/Plugin/search.pm:217
+#: ../IkiWiki/Plugin/search.pm:231
 msgid "search"
 msgstr "buscar"
 
-#: ../IkiWiki/Plugin/shortcut.pm:31
+#: ../IkiWiki/Plugin/shortcut.pm:32
 #, perl-format
 msgid "shortcut plugin will not work without %s"
 msgstr "el complemento shortcut no funcionará si no existe la página %s"
 
-#: ../IkiWiki/Plugin/shortcut.pm:44
+#: ../IkiWiki/Plugin/shortcut.pm:45
 msgid "missing name or url parameter"
 msgstr "shortcut necesita el parámetro 'name' ó el parámetro 'url'"
 
 #. translators: This is used to display what shortcuts are defined.
 #. translators: First parameter is the name of the shortcut, the second
 #. translators: is an URL.
-#: ../IkiWiki/Plugin/shortcut.pm:54
+#: ../IkiWiki/Plugin/shortcut.pm:55
 #, perl-format
 msgid "shortcut %s points to <i>%s</i>"
 msgstr "El atajo %s apunta a <i>%s</i>"
@@ -903,113 +929,116 @@ msgstr "El atajo %s apunta a <i>%s</i>"
 msgid "failed to parse any smileys"
 msgstr "Algunos emoticonos tienen errores"
 
-#: ../IkiWiki/Plugin/sparkline.pm:72
+#: ../IkiWiki/Plugin/sparkline.pm:73
 msgid "parse error"
 msgstr "error de análisis "
 
-#: ../IkiWiki/Plugin/sparkline.pm:78
+#: ../IkiWiki/Plugin/sparkline.pm:79
 #, fuzzy
 msgid "invalid featurepoint diameter"
 msgstr "diámetro inválido "
 
-#: ../IkiWiki/Plugin/sparkline.pm:88
+#: ../IkiWiki/Plugin/sparkline.pm:89
 #, fuzzy
 msgid "invalid featurepoint location"
 msgstr "localización errónea "
 
-#: ../IkiWiki/Plugin/sparkline.pm:99
+#: ../IkiWiki/Plugin/sparkline.pm:100
 msgid "missing values"
 msgstr "faltan valores"
 
-#: ../IkiWiki/Plugin/sparkline.pm:104
+#: ../IkiWiki/Plugin/sparkline.pm:105
 #, fuzzy
 msgid "invalid height value"
 msgstr "valor incorrecto para la altura"
 
-#: ../IkiWiki/Plugin/sparkline.pm:111
+#: ../IkiWiki/Plugin/sparkline.pm:112
 msgid "missing width parameter"
 msgstr "falta el parámetro que indica el ancho"
 
-#: ../IkiWiki/Plugin/sparkline.pm:115
+#: ../IkiWiki/Plugin/sparkline.pm:116
 #, fuzzy
 msgid "invalid width value"
 msgstr "valor incorrecto para el ancho"
 
-#: ../IkiWiki/Plugin/sparkline.pm:153
+#: ../IkiWiki/Plugin/sparkline.pm:154
 msgid "failed to run php"
 msgstr "error fatal invocando el programa php"
 
-#: ../IkiWiki/Plugin/table.pm:31
+#: ../IkiWiki/Plugin/table.pm:32
 msgid "cannot find file"
 msgstr "no puedo encontrar el archivo"
 
-#: ../IkiWiki/Plugin/table.pm:87
+#: ../IkiWiki/Plugin/table.pm:88
 msgid "unknown data format"
 msgstr "formato de datos desconocido"
 
-#: ../IkiWiki/Plugin/table.pm:95
+#: ../IkiWiki/Plugin/table.pm:96
 msgid "empty data"
 msgstr "sin datos"
 
-#: ../IkiWiki/Plugin/table.pm:114
+#: ../IkiWiki/Plugin/table.pm:115
 msgid "Direct data download"
 msgstr "Enlace directo para descarga"
 
-#: ../IkiWiki/Plugin/table.pm:148
+#: ../IkiWiki/Plugin/table.pm:149
 #, perl-format
 msgid "parse fail at line %d: %s"
 msgstr "error de análisis en la línea %d: %s"
 
-#: ../IkiWiki/Plugin/template.pm:29
+#: ../IkiWiki/Plugin/tag.pm:83
+#, fuzzy, perl-format
+msgid "creating tag page %s"
+msgstr "creando nueva página %s"
+
+#: ../IkiWiki/Plugin/template.pm:33
 msgid "missing id parameter"
 msgstr "falta el parámetro \"id\""
 
-#: ../IkiWiki/Plugin/template.pm:36
-#, perl-format
-msgid "template %s not found"
-msgstr "no he encontrado la plantilla %s"
-
-#: ../IkiWiki/Plugin/template.pm:55
-msgid "failed to process:"
-msgstr "se ha producido un error fatal mientras procesaba la plantilla:"
+#: ../IkiWiki/Plugin/template.pm:47
+#, fuzzy, perl-format
+msgid "%s not found"
+msgstr "fuente de datos no encontrada"
 
-#: ../IkiWiki/Plugin/teximg.pm:70
+#: ../IkiWiki/Plugin/teximg.pm:72
 msgid "missing tex code"
 msgstr "falta el código tex"
 
-#: ../IkiWiki/Plugin/teximg.pm:122
+#: ../IkiWiki/Plugin/teximg.pm:124
 msgid "failed to generate image from code"
 msgstr "no he podido crear la imagen desde el código"
 
-#: ../IkiWiki/Plugin/websetup.pm:89
-msgid "plugin"
+#: ../IkiWiki/Plugin/websetup.pm:105
+#, fuzzy, perl-format
+msgid "%s plugin:"
 msgstr "complemento"
 
-#: ../IkiWiki/Plugin/websetup.pm:108
+#: ../IkiWiki/Plugin/websetup.pm:121
+#, fuzzy, perl-format
+msgid "%s plugins"
+msgstr "complementos"
+
+#: ../IkiWiki/Plugin/websetup.pm:135
 #, perl-format
 msgid "enable %s?"
 msgstr "¿ activar %s ?"
 
-#: ../IkiWiki/Plugin/websetup.pm:240
+#: ../IkiWiki/Plugin/websetup.pm:276
 msgid "setup file for this wiki is not known"
 msgstr "El archivo de configuración para este wiki es desconocido"
 
-#: ../IkiWiki/Plugin/websetup.pm:256
+#: ../IkiWiki/Plugin/websetup.pm:292
 msgid "main"
 msgstr "principal"
 
-#: ../IkiWiki/Plugin/websetup.pm:257
-msgid "plugins"
-msgstr "complementos"
-
-#: ../IkiWiki/Plugin/websetup.pm:395
+#: ../IkiWiki/Plugin/websetup.pm:435
 msgid ""
 "The configuration changes shown below require a wiki rebuild to take effect."
 msgstr ""
 "Los cambios en la configuración que se muestran más abajo precisan una "
 "reconstrucción del wiki para tener efecto."
 
-#: ../IkiWiki/Plugin/websetup.pm:399
+#: ../IkiWiki/Plugin/websetup.pm:439
 msgid ""
 "For the configuration changes shown below to fully take effect, you may need "
 "to rebuild the wiki."
@@ -1017,7 +1046,7 @@ msgstr ""
 "Para que los cambios en la configuración mostrados más abajo tengan efecto, "
 "es posible que necesite reconstruir el wiki."
 
-#: ../IkiWiki/Plugin/websetup.pm:436
+#: ../IkiWiki/Plugin/websetup.pm:476
 #, perl-format
 msgid "Error: %s exited nonzero (%s). Discarding setup changes."
 msgstr ""
@@ -1034,12 +1063,12 @@ msgstr "no puedo determinar el identificador de un usuario no fiable como %s"
 msgid "bad file name %s"
 msgstr "el nombre de archivo %s es erróneo"
 
-#: ../IkiWiki/Render.pm:150
+#: ../IkiWiki/Render.pm:158
 #, perl-format
 msgid "scanning %s"
 msgstr "explorando %s"
 
-#: ../IkiWiki/Render.pm:271
+#: ../IkiWiki/Render.pm:280
 #, perl-format
 msgid ""
 "symlink found in srcdir path (%s) -- set allow_symlinks_before_srcdir to "
@@ -1048,69 +1077,84 @@ msgstr ""
 "encontrado un enlace simbólico en la ruta del directorio fuente (%s) -- use "
 "la directiva allow_symlinks_before_srcdir para permitir la acción"
 
-#: ../IkiWiki/Render.pm:300 ../IkiWiki/Render.pm:327
+#: ../IkiWiki/Render.pm:311
 #, perl-format
 msgid "skipping bad filename %s"
 msgstr "ignorando el archivo %s porque su nombre no es correcto"
 
-#: ../IkiWiki/Render.pm:305
+#: ../IkiWiki/Render.pm:327
 #, perl-format
 msgid "%s has multiple possible source pages"
 msgstr "%s tiene mútiples páginas fuente posibles"
 
-#: ../IkiWiki/Render.pm:395
+#: ../IkiWiki/Render.pm:369
 #, perl-format
-msgid "removing old page %s"
+msgid "querying %s for file creation and modification times.."
+msgstr ""
+
+#: ../IkiWiki/Render.pm:431
+#, fuzzy, perl-format
+msgid "removing obsolete %s"
 msgstr "eliminando la antigua página %s"
 
-#: ../IkiWiki/Render.pm:471
+#: ../IkiWiki/Render.pm:505
 #, fuzzy, perl-format
 msgid "building %s, which links to %s"
 msgstr "convirtiendo la página %s, la cual referencia a %s"
 
-#: ../IkiWiki/Render.pm:480
+#: ../IkiWiki/Render.pm:514
 #, fuzzy, perl-format
 msgid "removing %s, no longer built by %s"
 msgstr "eliminando la página %s puesto que ya no se deriva de %s"
 
-#: ../IkiWiki/Render.pm:603
+#: ../IkiWiki/Render.pm:597 ../IkiWiki/Render.pm:679
 #, fuzzy, perl-format
 msgid "building %s, which depends on %s"
 msgstr "convirtiendo la página %s, la cual depende de %s"
 
-#: ../IkiWiki/Render.pm:616
+#: ../IkiWiki/Render.pm:692
 #, fuzzy, perl-format
 msgid "building %s, to update its backlinks"
 msgstr ""
 "convirtiendo la página %s para actualizar la lista de páginas que hacen "
 "referencia a ella."
 
-#: ../IkiWiki/Render.pm:679
+#: ../IkiWiki/Render.pm:821
 #, fuzzy, perl-format
 msgid "ikiwiki: cannot build %s"
 msgstr "ikiwiki: no puedo convertir la página %s"
 
 #. translators: The first parameter is a filename, and the second
 #. translators: is a (probably not translated) error message.
-#: ../IkiWiki/Setup.pm:19
+#: ../IkiWiki/Setup.pm:23
 #, perl-format
 msgid "cannot read %s: %s"
 msgstr "no puedo leer el archivo %s: %s"
 
-#: ../IkiWiki/Setup/Automator.pm:33
+#: ../IkiWiki/Setup.pm:34
+#, fuzzy, perl-format
+msgid "cannot load %s in safe mode"
+msgstr "no puedo leer el archivo %s: %s"
+
+#: ../IkiWiki/Setup.pm:46
+#, fuzzy, perl-format
+msgid "failed to parse %s"
+msgstr "ha fallado la compilación del programa %s"
+
+#: ../IkiWiki/Setup/Automator.pm:34
 msgid "you must enter a wikiname (that contains alphanumerics)"
 msgstr "debe escribir un nombre wiki (que contiene caracteres alfanuméricos)"
 
-#: ../IkiWiki/Setup/Automator.pm:76
+#: ../IkiWiki/Setup/Automator.pm:89
 #, perl-format
 msgid "unsupported revision control system %s"
 msgstr "el sistema de control de versiones %s no está soportado"
 
-#: ../IkiWiki/Setup/Automator.pm:102
+#: ../IkiWiki/Setup/Automator.pm:115
 msgid "failed to set up the repository with ikiwiki-makerepo"
 msgstr "no he podido crear un repositorio con el programa ikiwiki-makerepo"
 
-#: ../IkiWiki/Setup/Automator.pm:120
+#: ../IkiWiki/Setup/Automator.pm:134
 #, perl-format
 msgid "** Disabling plugin %s, since it is failing with this message:"
 msgstr ""
@@ -1131,13 +1175,13 @@ msgid "wrapper filename not specified"
 msgstr "el programa envoltorio no ha sido especificado"
 
 #. translators: The parameter is a C filename.
-#: ../IkiWiki/Wrapper.pm:149
+#: ../IkiWiki/Wrapper.pm:160
 #, 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:169
+#: ../IkiWiki/Wrapper.pm:180
 #, perl-format
 msgid "successfully generated %s"
 msgstr "creado con éxito el programa envoltorio %s"
@@ -1150,64 +1194,68 @@ msgstr "uso: ikiwiki [opciones] origen destino"
 msgid "       ikiwiki --setup configfile"
 msgstr "       ikiwiki --setup archivo_de_configuración"
 
-#: ../ikiwiki.in:91
+#: ../ikiwiki.in:96
 msgid "usage: --set var=value"
 msgstr "uso: --set variable=valor"
 
-#: ../ikiwiki.in:140
+#: ../ikiwiki.in:103
+#, fuzzy
+msgid "usage: --set-yaml var=value"
+msgstr "uso: --set variable=valor"
+
+#: ../ikiwiki.in:157
 msgid "generating wrappers.."
 msgstr "generando programas auxiliares.."
 
-#: ../ikiwiki.in:195
+#: ../ikiwiki.in:220
 msgid "rebuilding wiki.."
 msgstr "reconstruyendo el wiki.."
 
-#: ../ikiwiki.in:198
+#: ../ikiwiki.in:223
 msgid "refreshing wiki.."
 msgstr "actualizando el wiki.."
 
-#: ../IkiWiki.pm:238
+#: ../IkiWiki.pm:232
 msgid "Discussion"
 msgstr "Comentarios"
 
-#: ../IkiWiki.pm:507
+#: ../IkiWiki.pm:531
 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:553
+#: ../IkiWiki.pm:577
 msgid "cannot use multiple rcs plugins"
 msgstr "no puedo emplear varios complementos rcs"
 
-#: ../IkiWiki.pm:582
+#: ../IkiWiki.pm:606
 #, 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:1264
+#: ../IkiWiki.pm:1298
 #, 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:1863
+#: ../IkiWiki.pm:1984
 msgid "yes"
 msgstr "si"
 
-#: ../IkiWiki.pm:2006
-msgid "Sort::Naturally needed for title_natural sort"
-msgstr ""
-"Se necesita el módulo Sort::Naturally para el tipo de ordenación "
-"title_natural"
+#: ../IkiWiki.pm:2061
+#, fuzzy, perl-format
+msgid "invalid sort type %s"
+msgstr "no conozco este tipo de ordenación %s"
 
-#: ../IkiWiki.pm:2017
+#: ../IkiWiki.pm:2082
 #, perl-format
 msgid "unknown sort type %s"
 msgstr "no conozco este tipo de ordenación %s"
 
-#: ../IkiWiki.pm:2036
+#: ../IkiWiki.pm:2218
 #, perl-format
 msgid "cannot match pages: %s"
 msgstr "no encuentro páginas coincidentes: %s"
@@ -1235,6 +1283,33 @@ msgstr ""
 msgid "What is the domain name of the web server?"
 msgstr "¿ Cuál es el dominio para el servidor web ?"
 
+#~ msgid "You need to log in first."
+#~ msgstr "Antes es necesario identificarse."
+
+#~ msgid "Log in with"
+#~ msgstr "Identificarse mediante "
+
+#~ msgid "Get an OpenID"
+#~ msgstr "Consiga un identificador OpenID"
+
+#~ msgid "failed to process"
+#~ msgstr "fallo en el proceso"
+
+#~ msgid "nonexistant template %s"
+#~ msgstr "la plantilla %s no existe "
+
+#~ msgid "getctime not implemented"
+#~ msgstr "la funcionalidad getctime no está incluida"
+
+#~ msgid "Sort::Naturally needed for title_natural sort"
+#~ msgstr ""
+#~ "Se necesita el módulo Sort::Naturally para el tipo de ordenación "
+#~ "title_natural"
+
+#, fuzzy
+#~ msgid "failed to read %s"
+#~ msgstr "no puedo leer de %s: %s "
+
 #~ msgid "Failed to parse url, cannot determine domain name"
 #~ msgstr ""
 #~ "Error en el análisis del URL, no puedo determinar el nombre del dominio"
index fbfb49a8817f73c28922db77d8d19df221eead75..ec21d51ab15a7a52dc67a602a4e545b8a815d293 100644 (file)
--- a/po/fr.po
+++ b/po/fr.po
@@ -9,19 +9,16 @@ msgid ""
 msgstr ""
 "Project-Id-Version: ikiwiki 3.141\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-10-31 18:31-0400\n"
+"POT-Creation-Date: 2010-05-18 14:18-0400\n"
 "PO-Revision-Date: 2009-08-17 10:06+0200\n"
 "Last-Translator: Philippe Batailler <philippe.batailler@free.fr>\n"
 "Language-Team: French <debian-l10n-french@lists.debian.org>\n"
+"Language: fr\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: ../IkiWiki/CGI.pm:114
-msgid "You need to log in first."
-msgstr "Vous devez d'abord vous identifier."
-
-#: ../IkiWiki/CGI.pm:147
+#: ../IkiWiki/CGI.pm:162
 msgid ""
 "probable misconfiguration: sslcookie is set, but you are attempting to login "
 "via http, not https"
@@ -29,35 +26,35 @@ msgstr ""
 "Erreur de configuration probable : sslcookie est positionné mais vous tentez "
 "de vous connecter avec http au lieu de https"
 
-#: ../IkiWiki/CGI.pm:150
+#: ../IkiWiki/CGI.pm:165
 msgid "login failed, perhaps you need to turn on cookies?"
 msgstr "Échec de l'identification, vous devez autoriser les cookies."
 
-#: ../IkiWiki/CGI.pm:169 ../IkiWiki/CGI.pm:314
+#: ../IkiWiki/CGI.pm:184 ../IkiWiki/CGI.pm:335
 msgid "Your login session has expired."
 msgstr "Session d'authentification expirée."
 
-#: ../IkiWiki/CGI.pm:190
+#: ../IkiWiki/CGI.pm:205
 msgid "Login"
 msgstr "S’identifier"
 
-#: ../IkiWiki/CGI.pm:191
+#: ../IkiWiki/CGI.pm:206
 msgid "Preferences"
 msgstr "Préférences"
 
-#: ../IkiWiki/CGI.pm:192
+#: ../IkiWiki/CGI.pm:207
 msgid "Admin"
 msgstr "Administrateur"
 
-#: ../IkiWiki/CGI.pm:232
+#: ../IkiWiki/CGI.pm:247
 msgid "Preferences saved."
 msgstr "Les préférences ont été enregistrées."
 
-#: ../IkiWiki/CGI.pm:278
+#: ../IkiWiki/CGI.pm:299
 msgid "You are banned."
 msgstr "Vous avez été banni."
 
-#: ../IkiWiki/CGI.pm:405 ../IkiWiki/CGI.pm:406 ../IkiWiki.pm:1282
+#: ../IkiWiki/CGI.pm:426 ../IkiWiki/CGI.pm:427 ../IkiWiki.pm:1316
 msgid "Error"
 msgstr "Erreur"
 
@@ -138,7 +135,7 @@ msgstr "Création de la nouvelle page %s"
 msgid "deleting bucket.."
 msgstr "Suppression du compartiment S3 (« bucket »)..."
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:206
+#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:231
 msgid "done"
 msgstr "Terminé"
 
@@ -147,40 +144,40 @@ msgstr "Terminé"
 msgid "Must specify %s"
 msgstr "Vous devez spécifier %s"
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:136
+#: ../IkiWiki/Plugin/amazon_s3.pm:140
 msgid "Failed to create S3 bucket: "
 msgstr "Impossible de créer un compartiment S3 :"
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:221
+#: ../IkiWiki/Plugin/amazon_s3.pm:225
 msgid "Failed to save file to S3: "
 msgstr "Impossible de sauvegarder le fichier dans le compartiment S3 :"
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:243
+#: ../IkiWiki/Plugin/amazon_s3.pm:247
 msgid "Failed to delete file from S3: "
 msgstr "Échec lors de la suppression du fichier sur S3 :"
 
-#: ../IkiWiki/Plugin/attachment.pm:49
+#: ../IkiWiki/Plugin/attachment.pm:50
 #, perl-format
 msgid "there is already a page named %s"
 msgstr "Il existe déjà une page nommée %s"
 
-#: ../IkiWiki/Plugin/attachment.pm:65
+#: ../IkiWiki/Plugin/attachment.pm:66
 msgid "prohibited by allowed_attachments"
 msgstr "Action interdite par allowed_attachments"
 
-#: ../IkiWiki/Plugin/attachment.pm:140
+#: ../IkiWiki/Plugin/attachment.pm:141
 msgid "bad attachment filename"
 msgstr "Nom de la pièce jointe incorrect"
 
-#: ../IkiWiki/Plugin/attachment.pm:182
+#: ../IkiWiki/Plugin/attachment.pm:183
 msgid "attachment upload"
 msgstr "Envoi de la pièce jointe"
 
-#: ../IkiWiki/Plugin/autoindex.pm:105
+#: ../IkiWiki/Plugin/autoindex.pm:117
 msgid "automatic index generation"
 msgstr "Génération de l'index automatique"
 
-#: ../IkiWiki/Plugin/blogspam.pm:108
+#: ../IkiWiki/Plugin/blogspam.pm:109
 msgid ""
 "Sorry, but that looks like spam to <a href=\"http://blogspam.net/"
 "\">blogspam</a>: "
@@ -197,192 +194,215 @@ msgstr "%s sur %s"
 msgid "There are no broken links!"
 msgstr "Aucun lien cassé !"
 
-#: ../IkiWiki/Plugin/comments.pm:124 ../IkiWiki/Plugin/format.pm:38
+#: ../IkiWiki/Plugin/comments.pm:112
+#, fuzzy, perl-format
+msgid "this comment needs %s"
+msgstr "Faire un commentaire sur %s"
+
+#: ../IkiWiki/Plugin/comments.pm:115
+#, fuzzy
+msgid "moderation"
+msgstr "Modération du commentaire"
+
+#: ../IkiWiki/Plugin/comments.pm:136 ../IkiWiki/Plugin/format.pm:48
 #, perl-format
 msgid "unsupported page format %s"
 msgstr "Format de page non reconnu %s"
 
-#: ../IkiWiki/Plugin/comments.pm:129
+#: ../IkiWiki/Plugin/comments.pm:141
 msgid "comment must have content"
 msgstr "Un commentaire doit avoir un contenu."
 
-#: ../IkiWiki/Plugin/comments.pm:185
+#: ../IkiWiki/Plugin/comments.pm:196
 msgid "Anonymous"
 msgstr "Anonyme"
 
-#: ../IkiWiki/Plugin/comments.pm:340 ../IkiWiki/Plugin/editpage.pm:97
+#: ../IkiWiki/Plugin/comments.pm:357 ../IkiWiki/Plugin/editpage.pm:98
 msgid "bad page name"
 msgstr "Nom de page incorrect"
 
-#: ../IkiWiki/Plugin/comments.pm:345
+#: ../IkiWiki/Plugin/comments.pm:362
 #, perl-format
 msgid "commenting on %s"
 msgstr "Faire un commentaire sur %s"
 
-#: ../IkiWiki/Plugin/comments.pm:363
+#: ../IkiWiki/Plugin/comments.pm:380
 #, perl-format
 msgid "page '%s' doesn't exist, so you can't comment"
 msgstr "La page '%s' n'existe pas, commentaire impossible."
 
-#: ../IkiWiki/Plugin/comments.pm:370
+#: ../IkiWiki/Plugin/comments.pm:387
 #, perl-format
 msgid "comments on page '%s' are closed"
 msgstr "Le commentaire pour la page '%s' est terminé."
 
-#: ../IkiWiki/Plugin/comments.pm:464
+#: ../IkiWiki/Plugin/comments.pm:490
 msgid "comment stored for moderation"
 msgstr "Le commentaire a été enregistré, en attente de « modération »"
 
-#: ../IkiWiki/Plugin/comments.pm:466
+#: ../IkiWiki/Plugin/comments.pm:492
 msgid "Your comment will be posted after moderator review"
 msgstr "Votre commentaire sera publié après vérification par le modérateur"
 
-#: ../IkiWiki/Plugin/comments.pm:479
+#: ../IkiWiki/Plugin/comments.pm:505
 msgid "Added a comment"
 msgstr "Commentaire ajouté"
 
-#: ../IkiWiki/Plugin/comments.pm:483
+#: ../IkiWiki/Plugin/comments.pm:509
 #, perl-format
 msgid "Added a comment: %s"
 msgstr "Commentaire ajouté : %s"
 
-#: ../IkiWiki/Plugin/comments.pm:525 ../IkiWiki/Plugin/websetup.pm:236
+#: ../IkiWiki/Plugin/comments.pm:551 ../IkiWiki/Plugin/websetup.pm:272
 msgid "you are not logged in as an admin"
 msgstr "Vous n'êtes pas authentifié comme administrateur"
 
-#: ../IkiWiki/Plugin/comments.pm:576
+#: ../IkiWiki/Plugin/comments.pm:602
 msgid "Comment moderation"
 msgstr "Modération du commentaire"
 
-#: ../IkiWiki/Plugin/comments.pm:615
+#: ../IkiWiki/Plugin/comments.pm:640
 msgid "comment moderation"
 msgstr "modération du commentaire"
 
-#: ../IkiWiki/Plugin/comments.pm:766
-msgid "Comments"
+#: ../IkiWiki/Plugin/comments.pm:789
+#, fuzzy, perl-format
+msgid "%i comment"
+msgid_plural "%i comments"
+msgstr[0] "Commentaires"
+msgstr[1] "Commentaires"
+
+#. translators: Here "Comment" is a verb;
+#. translators: the user clicks on it to
+#. translators: post a comment.
+#: ../IkiWiki/Plugin/comments.pm:799
+#, fuzzy
+msgid "Comment"
 msgstr "Commentaires"
 
-#: ../IkiWiki/Plugin/conditional.pm:27 ../IkiWiki/Plugin/cutpaste.pm:30
-#: ../IkiWiki/Plugin/cutpaste.pm:45 ../IkiWiki/Plugin/cutpaste.pm:61
+#: ../IkiWiki/Plugin/conditional.pm:28 ../IkiWiki/Plugin/cutpaste.pm:31
+#: ../IkiWiki/Plugin/cutpaste.pm:46 ../IkiWiki/Plugin/cutpaste.pm:62
 #: ../IkiWiki/Plugin/testpagespec.pm:26
 #, perl-format
 msgid "%s parameter is required"
 msgstr "Le paramètre %s est obligatoire"
 
-#: ../IkiWiki/Plugin/cutpaste.pm:66
+#: ../IkiWiki/Plugin/cutpaste.pm:67
 msgid "no text was copied in this page"
 msgstr "Aucun texte n'a été copié dans cette page"
 
-#: ../IkiWiki/Plugin/cutpaste.pm:69
+#: ../IkiWiki/Plugin/cutpaste.pm:70
 #, perl-format
 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
+#: ../IkiWiki/Plugin/editpage.pm:41
 #, perl-format
 msgid "removing old preview %s"
 msgstr "Suppression de l'ancienne prévisualisation %s"
 
-#: ../IkiWiki/Plugin/editpage.pm:113
+#: ../IkiWiki/Plugin/editpage.pm:114
 #, perl-format
 msgid "%s is not an editable page"
 msgstr "%s n'est pas une page éditable"
 
-#: ../IkiWiki/Plugin/editpage.pm:292
+#: ../IkiWiki/Plugin/editpage.pm:294
 #, perl-format
 msgid "creating %s"
 msgstr "Création de %s"
 
-#: ../IkiWiki/Plugin/editpage.pm:310 ../IkiWiki/Plugin/editpage.pm:329
-#: ../IkiWiki/Plugin/editpage.pm:339 ../IkiWiki/Plugin/editpage.pm:383
-#: ../IkiWiki/Plugin/editpage.pm:422
+#: ../IkiWiki/Plugin/editpage.pm:312 ../IkiWiki/Plugin/editpage.pm:331
+#: ../IkiWiki/Plugin/editpage.pm:341 ../IkiWiki/Plugin/editpage.pm:385
+#: ../IkiWiki/Plugin/editpage.pm:424
 #, perl-format
 msgid "editing %s"
 msgstr "Édition de %s"
 
-#: ../IkiWiki/Plugin/edittemplate.pm:51
+#: ../IkiWiki/Plugin/edittemplate.pm:52
 msgid "template not specified"
 msgstr "modèle (« template ») non indiqué"
 
-#: ../IkiWiki/Plugin/edittemplate.pm:54
+#: ../IkiWiki/Plugin/edittemplate.pm:55
 msgid "match not specified"
 msgstr "correspondance non indiquée"
 
-#: ../IkiWiki/Plugin/edittemplate.pm:63
+#: ../IkiWiki/Plugin/edittemplate.pm:64
 #, perl-format
 msgid "edittemplate %s registered for %s"
 msgstr "edittemplate %s enregistré pour %s"
 
-#: ../IkiWiki/Plugin/edittemplate.pm:137
-msgid "failed to process"
-msgstr "Échec du traitement"
+#: ../IkiWiki/Plugin/edittemplate.pm:125 ../IkiWiki/Plugin/inline.pm:339
+#: ../IkiWiki/Plugin/template.pm:44
+#, fuzzy
+msgid "failed to process template:"
+msgstr "Échec du traitement :"
 
-#: ../IkiWiki/Plugin/format.pm:20
+#: ../IkiWiki/Plugin/format.pm:30
 msgid "must specify format and text"
 msgstr "le format et le texte doivent être indiqués"
 
-#: ../IkiWiki/Plugin/fortune.pm:27
+#: ../IkiWiki/Plugin/fortune.pm:28
 msgid "fortune failed"
 msgstr "Échec du lancement de « fortune »"
 
-#: ../IkiWiki/Plugin/getsource.pm:62 ../IkiWiki/Plugin/goto.pm:55
+#: ../IkiWiki/Plugin/getsource.pm:64 ../IkiWiki/Plugin/goto.pm:58
 msgid "missing page"
 msgstr "Page manquante"
 
-#: ../IkiWiki/Plugin/getsource.pm:64 ../IkiWiki/Plugin/goto.pm:57
+#: ../IkiWiki/Plugin/getsource.pm:66 ../IkiWiki/Plugin/goto.pm:60
 #, perl-format
 msgid "The page %s does not exist."
 msgstr "La page %s n'existe pas."
 
-#: ../IkiWiki/Plugin/getsource.pm:73
+#: ../IkiWiki/Plugin/getsource.pm:75
 msgid "not a page"
 msgstr "Ce n'est pas une page."
 
-#: ../IkiWiki/Plugin/getsource.pm:75
+#: ../IkiWiki/Plugin/getsource.pm:77
 #, perl-format
 msgid "%s is an attachment, not a page."
 msgstr "%s est une pièce jointe, pas une page."
 
-#: ../IkiWiki/Plugin/git.pm:651 ../IkiWiki/Plugin/git.pm:669
+#: ../IkiWiki/Plugin/git.pm:687 ../IkiWiki/Plugin/git.pm:705
 #: ../IkiWiki/Receive.pm:130
 #, perl-format
 msgid "you are not allowed to change %s"
 msgstr "Vous n'êtes pas autorisé à modifier %s"
 
-#: ../IkiWiki/Plugin/git.pm:691
+#: ../IkiWiki/Plugin/git.pm:727
 #, perl-format
 msgid "you cannot act on a file with mode %s"
 msgstr "Vous ne pouvez pas modifier un fichier dont le mode est %s"
 
-#: ../IkiWiki/Plugin/git.pm:695
+#: ../IkiWiki/Plugin/git.pm:731
 msgid "you are not allowed to change file modes"
 msgstr "Vous n'êtes pas autorisé à modifier le mode des fichiers"
 
-#: ../IkiWiki/Plugin/google.pm:25 ../IkiWiki/Plugin/po.pm:131
-#: ../IkiWiki/Plugin/search.pm:36
+#: ../IkiWiki/Plugin/google.pm:26 ../IkiWiki/Plugin/po.pm:134
+#: ../IkiWiki/Plugin/search.pm:37
 #, perl-format
 msgid "Must specify %s when using the %s plugin"
 msgstr "Vous devez indiquer %s lors de l'utilisation du greffon %s."
 
-#: ../IkiWiki/Plugin/graphviz.pm:67
+#: ../IkiWiki/Plugin/graphviz.pm:68
 msgid "failed to run graphviz"
 msgstr "Échec du lancement de graphviz"
 
-#: ../IkiWiki/Plugin/graphviz.pm:94
+#: ../IkiWiki/Plugin/graphviz.pm:90
 msgid "prog not a valid graphviz program"
 msgstr "Ce programme n'est pas un programme graphviz valable"
 
-#: ../IkiWiki/Plugin/highlight.pm:47
+#: ../IkiWiki/Plugin/highlight.pm:48
 #, perl-format
 msgid "tohighlight contains unknown file type '%s'"
 msgstr "tohighlight contient un type de fichier inconnu : '%s'"
 
-#: ../IkiWiki/Plugin/highlight.pm:58
+#: ../IkiWiki/Plugin/highlight.pm:59
 #, perl-format
 msgid "Source code: %s"
 msgstr "Code source : %s"
 
-#: ../IkiWiki/Plugin/highlight.pm:123
+#: ../IkiWiki/Plugin/highlight.pm:124
 msgid ""
 "warning: highlight perl module not available; falling back to pass through"
 msgstr ""
@@ -394,103 +414,113 @@ msgstr ""
 msgid "htmltidy failed to parse this html"
 msgstr "Aucun smiley n'a pu être analysé"
 
-#: ../IkiWiki/Plugin/img.pm:64
+#: ../IkiWiki/Plugin/img.pm:69
 msgid "Image::Magick is not installed"
 msgstr "Image::Magick n'est pas installé"
 
-#: ../IkiWiki/Plugin/img.pm:68 ../IkiWiki/Plugin/img.pm:112
+#: ../IkiWiki/Plugin/img.pm:73 ../IkiWiki/Plugin/img.pm:117
 #, perl-format
 msgid "failed to read %s: %s"
 msgstr "Échec de la lecture de %s : %s"
 
-#: ../IkiWiki/Plugin/img.pm:74
+#: ../IkiWiki/Plugin/img.pm:79
 #, perl-format
 msgid "wrong size format \"%s\" (should be WxH)"
 msgstr "Format de la taille incorrect \"%s\", (devrait être LxH)"
 
-#: ../IkiWiki/Plugin/img.pm:120
+#: ../IkiWiki/Plugin/img.pm:125
 #, perl-format
 msgid "failed to resize: %s"
 msgstr "Échec du redimensionnement : %s"
 
-#: ../IkiWiki/Plugin/img.pm:140
+#: ../IkiWiki/Plugin/img.pm:145
 #, perl-format
 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:92
+#: ../IkiWiki/Plugin/inline.pm:93
 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:138
+#: ../IkiWiki/Plugin/inline.pm:139
 msgid "page editing not allowed"
 msgstr "Modification de page interdite"
 
-#: ../IkiWiki/Plugin/inline.pm:155
+#: ../IkiWiki/Plugin/inline.pm:156
 msgid "missing pages parameter"
 msgstr "Paramètre « pages » manquant"
 
-#: ../IkiWiki/Plugin/inline.pm:191
+#: ../IkiWiki/Plugin/inline.pm:192
 #, perl-format
 msgid "the %s and %s parameters cannot be used together"
 msgstr "Les paramètres %s et %s ne peuvent être utilisés ensemble."
 
-#: ../IkiWiki/Plugin/inline.pm:312
+#: ../IkiWiki/Plugin/inline.pm:313
 msgid "Add a new post titled:"
 msgstr "Ajouter un nouvel article dont le titre est :"
 
-#: ../IkiWiki/Plugin/inline.pm:332
+#: ../IkiWiki/Plugin/inline.pm:342
 #, perl-format
-msgid "nonexistant template %s"
-msgstr "Le modèle de page %s n'existe pas"
+msgid "template %s not found"
+msgstr "Modèle de page %s introuvable"
 
-#: ../IkiWiki/Plugin/inline.pm:598
+#: ../IkiWiki/Plugin/inline.pm:633
 msgid "RPC::XML::Client not found, not pinging"
 msgstr "RPC::XML::Client introuvable, pas de réponse au ping"
 
-#: ../IkiWiki/Plugin/linkmap.pm:101
+#: ../IkiWiki/Plugin/linkmap.pm:81 ../IkiWiki/Plugin/linkmap.pm:88
+#: ../IkiWiki/Plugin/linkmap.pm:92 ../IkiWiki/Plugin/linkmap.pm:95
 msgid "failed to run dot"
 msgstr "Échec du lancement de dot"
 
-#: ../IkiWiki/Plugin/lockedit.pm:47
+#: ../IkiWiki/Plugin/linkmap.pm:85
+msgid "linkmap"
+msgstr ""
+
+#: ../IkiWiki/Plugin/lockedit.pm:49
 #, perl-format
 msgid "%s is locked and cannot be edited"
 msgstr "%s est verrouillé et ne peut être modifié"
 
-#: ../IkiWiki/Plugin/mdwn.pm:44
+#: ../IkiWiki/Plugin/mdwn.pm:45
 msgid "multimarkdown is enabled, but Text::MultiMarkdown is not installed"
 msgstr "mulitmarkdown est activé mais Text::Multimarkdown n'est pas installé"
 
-#: ../IkiWiki/Plugin/mdwn.pm:69
+#: ../IkiWiki/Plugin/mdwn.pm:70
 #, perl-format
 msgid "failed to load Markdown.pm perl module (%s) or /usr/bin/markdown (%s)"
 msgstr ""
 "Échec du chargement du module Perl Markdown.pm (%s) ou de /usr/bin/markdown "
 "(%s)"
 
-#: ../IkiWiki/Plugin/meta.pm:161
+#: ../IkiWiki/Plugin/meta.pm:174
 msgid "stylesheet not found"
 msgstr "Feuille de style introuvable "
 
-#: ../IkiWiki/Plugin/meta.pm:199
+#: ../IkiWiki/Plugin/meta.pm:212
 msgid "redir page not found"
 msgstr "Page de redirection introuvable"
 
-#: ../IkiWiki/Plugin/meta.pm:213
+#: ../IkiWiki/Plugin/meta.pm:226
 msgid "redir cycle is not allowed"
 msgstr "Redirection cyclique non autorisée"
 
-#: ../IkiWiki/Plugin/mirrorlist.pm:43
+#: ../IkiWiki/Plugin/meta.pm:387
+#, fuzzy
+msgid "sort=meta requires a parameter"
+msgstr "les paramètres « from » et « to » sont nécessaires."
+
+#: ../IkiWiki/Plugin/mirrorlist.pm:44
 msgid "Mirrors"
 msgstr "Miroirs"
 
-#: ../IkiWiki/Plugin/mirrorlist.pm:43
+#: ../IkiWiki/Plugin/mirrorlist.pm:44
 msgid "Mirror"
 msgstr "Miroir"
 
-#: ../IkiWiki/Plugin/moderatedcomments.pm:41
+#: ../IkiWiki/Plugin/moderatedcomments.pm:57
 #, fuzzy
 msgid "comment needs moderation"
 msgstr "modération du commentaire"
@@ -499,19 +529,12 @@ msgstr "modération du commentaire"
 msgid "more"
 msgstr "lire la suite"
 
-#: ../IkiWiki/Plugin/norcs.pm:65
-msgid "getctime not implemented"
-msgstr "getctime n'est pas implémenté"
-
-#: ../IkiWiki/Plugin/openid.pm:61
-msgid "Log in with"
-msgstr "S'identifier en tant que"
-
-#: ../IkiWiki/Plugin/openid.pm:64
-msgid "Get an OpenID"
-msgstr "Obtenir un compte OpenID"
+#: ../IkiWiki/Plugin/openid.pm:58
+#, fuzzy, perl-format
+msgid "failed to load openid module: "
+msgstr "Échec de la compilation de %s"
 
-#: ../IkiWiki/Plugin/orphans.pm:55
+#: ../IkiWiki/Plugin/orphans.pm:56
 msgid "All pages have other pages linking to them."
 msgstr "Toutes les pages sont liées à d'autres pages."
 
@@ -519,35 +542,43 @@ msgstr "Toutes les pages sont liées à d'autres pages."
 msgid "bad or missing template"
 msgstr "Modèle de page incorrect ou manquant"
 
-#: ../IkiWiki/Plugin/passwordauth.pm:248
+#: ../IkiWiki/Plugin/passwordauth.pm:231
+msgid "Your user page: "
+msgstr ""
+
+#: ../IkiWiki/Plugin/passwordauth.pm:238
+msgid "Create your user page"
+msgstr ""
+
+#: ../IkiWiki/Plugin/passwordauth.pm:268
 msgid "Account creation successful. Now you can Login."
 msgstr "Le compte a été créé. Vous pouvez maintenant vous identifier."
 
-#: ../IkiWiki/Plugin/passwordauth.pm:251
+#: ../IkiWiki/Plugin/passwordauth.pm:271
 msgid "Error creating account."
 msgstr "Erreur lors de la création du compte."
 
-#: ../IkiWiki/Plugin/passwordauth.pm:258
+#: ../IkiWiki/Plugin/passwordauth.pm:278
 msgid "No email address, so cannot email password reset instructions."
 msgstr ""
 "Aucune adresse indiquée. Impossible d'envoyer les instructions pour "
 "réinitialiser le mot de passe."
 
-#: ../IkiWiki/Plugin/passwordauth.pm:292
+#: ../IkiWiki/Plugin/passwordauth.pm:312
 msgid "Failed to send mail"
 msgstr "Impossible d'envoyer un courriel"
 
-#: ../IkiWiki/Plugin/passwordauth.pm:294
+#: ../IkiWiki/Plugin/passwordauth.pm:314
 msgid "You have been mailed password reset instructions."
 msgstr ""
 "Vous avez reçu un message contenant les instructions pour réinitialiser le "
 "mot de passe"
 
-#: ../IkiWiki/Plugin/passwordauth.pm:329
+#: ../IkiWiki/Plugin/passwordauth.pm:349
 msgid "incorrect password reset url"
 msgstr "Adresse pour la réinitialisation du mot de passe incorrecte"
 
-#: ../IkiWiki/Plugin/passwordauth.pm:332
+#: ../IkiWiki/Plugin/passwordauth.pm:352
 msgid "password reset denied"
 msgstr "réinitialisation du mot de passe refusée"
 
@@ -579,12 +610,12 @@ msgstr ""
 "Note : ancienne version de po4a détectée. Il est recommandé d'installer la "
 "version 0.35."
 
-#: ../IkiWiki/Plugin/po.pm:138
+#: ../IkiWiki/Plugin/po.pm:142
 #, perl-format
 msgid "%s is not a valid language code"
 msgstr "%s n'est pas un code de langue valable"
 
-#: ../IkiWiki/Plugin/po.pm:150
+#: ../IkiWiki/Plugin/po.pm:154
 #, perl-format
 msgid ""
 "%s is not a valid value for po_link_to, falling back to po_link_to=default"
@@ -592,7 +623,7 @@ msgstr ""
 "%s n'est pas une valeur correcte pour po_link_to, retour à la valeur par "
 "défaut."
 
-#: ../IkiWiki/Plugin/po.pm:155
+#: ../IkiWiki/Plugin/po.pm:159
 msgid ""
 "po_link_to=negotiated requires usedirs to be enabled, falling back to "
 "po_link_to=default"
@@ -600,23 +631,23 @@ msgstr ""
 "po_link_to=negotiated nécessite que usedirs soit activé, retour à "
 "po_link_to=default."
 
-#: ../IkiWiki/Plugin/po.pm:385
+#: ../IkiWiki/Plugin/po.pm:390
 #, perl-format
 msgid "rebuilding all pages to fix meta titles"
 msgstr ""
 "Reconstruction de toutes les pages pour corriger les titres (greffon "
 "« meta »)."
 
-#: ../IkiWiki/Plugin/po.pm:389 ../IkiWiki/Render.pm:638
+#: ../IkiWiki/Plugin/po.pm:394 ../IkiWiki/Render.pm:769
 #, perl-format
 msgid "building %s"
 msgstr "construction de %s"
 
-#: ../IkiWiki/Plugin/po.pm:427
+#: ../IkiWiki/Plugin/po.pm:432
 msgid "updated PO files"
 msgstr "Fichiers PO mis à jour."
 
-#: ../IkiWiki/Plugin/po.pm:451
+#: ../IkiWiki/Plugin/po.pm:456
 msgid ""
 "Can not remove a translation. If the master page is removed, however, its "
 "translations will be removed as well."
@@ -624,7 +655,7 @@ msgstr ""
 "Impossible de supprimer cette traduction. Si la page maître est supprimée, "
 "alors ses traductions seront supprimées."
 
-#: ../IkiWiki/Plugin/po.pm:471
+#: ../IkiWiki/Plugin/po.pm:476
 msgid ""
 "Can not rename a translation. If the master page is renamed, however, its "
 "translations will be renamed as well."
@@ -632,81 +663,76 @@ msgstr ""
 "Impossible de renommer cette traduction. Si la page maître est renommée, "
 "alors ses traductions pourront être renommées."
 
-#: ../IkiWiki/Plugin/po.pm:870
+#: ../IkiWiki/Plugin/po.pm:876
 #, perl-format
 msgid "POT file (%s) does not exist"
 msgstr "Le fichier POT %s n'existe pas."
 
-#: ../IkiWiki/Plugin/po.pm:884
+#: ../IkiWiki/Plugin/po.pm:890
 #, perl-format
 msgid "failed to copy underlay PO file to %s"
 msgstr "Impossible de copier le fichier PO underlay dans %s"
 
-#: ../IkiWiki/Plugin/po.pm:893
+#: ../IkiWiki/Plugin/po.pm:899
 #, perl-format
 msgid "failed to update %s"
 msgstr "Impossible de mettre à jour %s"
 
-#: ../IkiWiki/Plugin/po.pm:899
+#: ../IkiWiki/Plugin/po.pm:905
 #, perl-format
 msgid "failed to copy the POT file to %s"
 msgstr "Impossible de copier le fichier POT dans %s"
 
-#: ../IkiWiki/Plugin/po.pm:935
+#: ../IkiWiki/Plugin/po.pm:941
 msgid "N/A"
 msgstr "N/A"
 
-#: ../IkiWiki/Plugin/po.pm:948
+#: ../IkiWiki/Plugin/po.pm:954
 #, perl-format
 msgid "failed to translate %s"
 msgstr "Impossible de traduire %s"
 
-#: ../IkiWiki/Plugin/po.pm:1032
+#: ../IkiWiki/Plugin/po.pm:1038
 msgid "removed obsolete PO files"
 msgstr "Fichiers PO obsolètes supprimés."
 
-#: ../IkiWiki/Plugin/po.pm:1095 ../IkiWiki/Plugin/po.pm:1109
-#: ../IkiWiki/Plugin/po.pm:1149
+#: ../IkiWiki/Plugin/po.pm:1094 ../IkiWiki/Plugin/po.pm:1108
+#: ../IkiWiki/Plugin/po.pm:1147
 #, perl-format
 msgid "failed to write %s"
 msgstr "Impossible de modifier %s"
 
-#: ../IkiWiki/Plugin/po.pm:1107
+#: ../IkiWiki/Plugin/po.pm:1106
 msgid "failed to translate"
 msgstr "Impossible de traduire"
 
-#: ../IkiWiki/Plugin/po.pm:1112
-#, perl-format
-msgid "failed to read %s"
-msgstr "Impossible de lire %s"
-
-#: ../IkiWiki/Plugin/po.pm:1161
+#: ../IkiWiki/Plugin/po.pm:1159
 msgid "invalid gettext data, go back to previous page to continue edit"
 msgstr ""
 "Données gettext incorrectes, retour à la page précédente pour la poursuite "
 "des modifications."
 
-#: ../IkiWiki/Plugin/poll.pm:69
+#: ../IkiWiki/Plugin/poll.pm:70
 msgid "vote"
 msgstr "Voter"
 
-#: ../IkiWiki/Plugin/poll.pm:77
+#: ../IkiWiki/Plugin/poll.pm:78
 msgid "Total votes:"
 msgstr "Total des suffrages :"
 
-#: ../IkiWiki/Plugin/polygen.pm:41
+#: ../IkiWiki/Plugin/polygen.pm:42
 msgid "polygen not installed"
 msgstr "polygen n'est pas installé"
 
-#: ../IkiWiki/Plugin/polygen.pm:60
+#: ../IkiWiki/Plugin/polygen.pm:61
 msgid "command failed"
 msgstr "Échec de la commande"
 
-#: ../IkiWiki/Plugin/postsparkline.pm:46
+#: ../IkiWiki/Plugin/postsparkline.pm:47
 msgid "missing formula"
 msgstr "formule manquante"
 
-#: ../IkiWiki/Plugin/postsparkline.pm:53
+#: ../IkiWiki/Plugin/postsparkline.pm:54
 msgid "unknown formula"
 msgstr "formule inconnue"
 
@@ -774,54 +800,55 @@ msgstr "à minuit"
 msgid "at noon on %A"
 msgstr "%A, à midi"
 
-#: ../IkiWiki/Plugin/progress.pm:34
+#: ../IkiWiki/Plugin/progress.pm:35
 #, perl-format
 msgid "illegal percent value %s"
 msgstr "pourcentage %s illégal"
 
-#: ../IkiWiki/Plugin/progress.pm:55
+#: ../IkiWiki/Plugin/progress.pm:56
 msgid "need either `percent` or `totalpages` and `donepages` parameters"
 msgstr ""
-"L'un des paramètres « percent », « totalpages » ou « donepages » est nécessaire."
+"L'un des paramètres « percent », « totalpages » ou « donepages » est "
+"nécessaire."
 
 #: ../IkiWiki/Plugin/recentchangesdiff.pm:37
 msgid "(Diff truncated)"
 msgstr "(fichier de différences tronqué)"
 
-#: ../IkiWiki/Plugin/remove.pm:31 ../IkiWiki/Plugin/rename.pm:36
+#: ../IkiWiki/Plugin/remove.pm:32 ../IkiWiki/Plugin/rename.pm:37
 #, perl-format
 msgid "%s does not exist"
 msgstr "%s n'existe pas"
 
-#: ../IkiWiki/Plugin/remove.pm:38
+#: ../IkiWiki/Plugin/remove.pm:39
 #, perl-format
 msgid "%s is not in the srcdir, so it cannot be deleted"
 msgstr "%s n'est pas dans srcdir et ne peut donc pas être supprimé"
 
-#: ../IkiWiki/Plugin/remove.pm:41 ../IkiWiki/Plugin/rename.pm:45
+#: ../IkiWiki/Plugin/remove.pm:42 ../IkiWiki/Plugin/rename.pm:46
 #, perl-format
 msgid "%s is not a file"
 msgstr "%s n'est pas un fichier"
 
-#: ../IkiWiki/Plugin/remove.pm:134
+#: ../IkiWiki/Plugin/remove.pm:137
 #, perl-format
 msgid "confirm removal of %s"
 msgstr "Suppression de %s confirmée"
 
-#: ../IkiWiki/Plugin/remove.pm:171
+#: ../IkiWiki/Plugin/remove.pm:174
 msgid "Please select the attachments to remove."
 msgstr "Veuillez choisir la pièce jointe à supprimer"
 
-#: ../IkiWiki/Plugin/remove.pm:211
+#: ../IkiWiki/Plugin/remove.pm:216
 msgid "removed"
 msgstr "supprimé"
 
-#: ../IkiWiki/Plugin/rename.pm:42
+#: ../IkiWiki/Plugin/rename.pm:43
 #, perl-format
 msgid "%s is not in the srcdir, so it cannot be renamed"
 msgstr "%s n'est pas dans srcdir. Impossible de le renommer"
 
-#: ../IkiWiki/Plugin/rename.pm:62
+#: ../IkiWiki/Plugin/rename.pm:63
 msgid "no change to the file name was specified"
 msgstr "Aucun changement dans le nom du fichier n'a été spécifié"
 
@@ -845,24 +872,24 @@ msgstr "%s existe déjà sur le disque"
 msgid "rename %s"
 msgstr "%s renommé"
 
-#: ../IkiWiki/Plugin/rename.pm:161
+#: ../IkiWiki/Plugin/rename.pm:163
 msgid "Also rename SubPages and attachments"
 msgstr "« SubPages » et attachements renommés."
 
-#: ../IkiWiki/Plugin/rename.pm:247
+#: ../IkiWiki/Plugin/rename.pm:250
 msgid "Only one attachment can be renamed at a time."
 msgstr "Modification de pièce jointe : une seule à la fois"
 
-#: ../IkiWiki/Plugin/rename.pm:250
+#: ../IkiWiki/Plugin/rename.pm:253
 msgid "Please select the attachment to rename."
 msgstr "Veuillez sélectionner la pièce jointe à renommer"
 
-#: ../IkiWiki/Plugin/rename.pm:347
+#: ../IkiWiki/Plugin/rename.pm:352
 #, perl-format
 msgid "rename %s to %s"
 msgstr "Renomme %s en %s"
 
-#: ../IkiWiki/Plugin/rename.pm:571
+#: ../IkiWiki/Plugin/rename.pm:576
 #, perl-format
 msgid "update for rename of %s to %s"
 msgstr "mise à jour, suite au changement de %s en %s"
@@ -877,28 +904,28 @@ msgstr "Impossible de lire %s"
 msgid "rsync_command exited %d"
 msgstr ""
 
-#: ../IkiWiki/Plugin/search.pm:182
+#: ../IkiWiki/Plugin/search.pm:194
 #, perl-format
 msgid "need Digest::SHA1 to index %s"
 msgstr "Digest::SHA1 est nécessaire pour indexer %s"
 
-#: ../IkiWiki/Plugin/search.pm:217
+#: ../IkiWiki/Plugin/search.pm:231
 msgid "search"
 msgstr "recherche"
 
-#: ../IkiWiki/Plugin/shortcut.pm:31
+#: ../IkiWiki/Plugin/shortcut.pm:32
 #, perl-format
 msgid "shortcut plugin will not work without %s"
 msgstr "Le greffon « shortcut » ne fonctionnera pas sans %s"
 
-#: ../IkiWiki/Plugin/shortcut.pm:44
+#: ../IkiWiki/Plugin/shortcut.pm:45
 msgid "missing name or url parameter"
 msgstr "Il manque le paramètre nom ou URL."
 
 #. translators: This is used to display what shortcuts are defined.
 #. translators: First parameter is the name of the shortcut, the second
 #. translators: is an URL.
-#: ../IkiWiki/Plugin/shortcut.pm:54
+#: ../IkiWiki/Plugin/shortcut.pm:55
 #, perl-format
 msgid "shortcut %s points to <i>%s</i>"
 msgstr "Le raccourci %s pointe vers <i>%s</i>"
@@ -907,109 +934,112 @@ msgstr "Le raccourci %s pointe vers <i>%s</i>"
 msgid "failed to parse any smileys"
 msgstr "Aucun smiley n'a pu être analysé"
 
-#: ../IkiWiki/Plugin/sparkline.pm:72
+#: ../IkiWiki/Plugin/sparkline.pm:73
 msgid "parse error"
 msgstr "Erreur d'analyse"
 
-#: ../IkiWiki/Plugin/sparkline.pm:78
+#: ../IkiWiki/Plugin/sparkline.pm:79
 msgid "invalid featurepoint diameter"
 msgstr "Diamètre du point incorrect"
 
-#: ../IkiWiki/Plugin/sparkline.pm:88
+#: ../IkiWiki/Plugin/sparkline.pm:89
 msgid "invalid featurepoint location"
 msgstr "Emplacement du point incorrect"
 
-#: ../IkiWiki/Plugin/sparkline.pm:99
+#: ../IkiWiki/Plugin/sparkline.pm:100
 msgid "missing values"
 msgstr "Il manque des valeurs"
 
-#: ../IkiWiki/Plugin/sparkline.pm:104
+#: ../IkiWiki/Plugin/sparkline.pm:105
 msgid "invalid height value"
 msgstr "Hauteur incorrecte"
 
-#: ../IkiWiki/Plugin/sparkline.pm:111
+#: ../IkiWiki/Plugin/sparkline.pm:112
 msgid "missing width parameter"
 msgstr "Le paramètre largeur manque"
 
-#: ../IkiWiki/Plugin/sparkline.pm:115
+#: ../IkiWiki/Plugin/sparkline.pm:116
 msgid "invalid width value"
 msgstr "Largeur incorrecte"
 
-#: ../IkiWiki/Plugin/sparkline.pm:153
+#: ../IkiWiki/Plugin/sparkline.pm:154
 msgid "failed to run php"
 msgstr "Échec du lancement de php"
 
-#: ../IkiWiki/Plugin/table.pm:31
+#: ../IkiWiki/Plugin/table.pm:32
 msgid "cannot find file"
 msgstr "Fichier introuvable"
 
-#: ../IkiWiki/Plugin/table.pm:87
+#: ../IkiWiki/Plugin/table.pm:88
 msgid "unknown data format"
 msgstr "Format de données inconnu"
 
-#: ../IkiWiki/Plugin/table.pm:95
+#: ../IkiWiki/Plugin/table.pm:96
 msgid "empty data"
 msgstr "Pas de données"
 
-#: ../IkiWiki/Plugin/table.pm:114
+#: ../IkiWiki/Plugin/table.pm:115
 msgid "Direct data download"
 msgstr "Téléchargement direct des données"
 
-#: ../IkiWiki/Plugin/table.pm:148
+#: ../IkiWiki/Plugin/table.pm:149
 #, perl-format
 msgid "parse fail at line %d: %s"
 msgstr "Erreur d'analyse à la ligne %d : %s"
 
-#: ../IkiWiki/Plugin/template.pm:29
+#: ../IkiWiki/Plugin/tag.pm:83
+#, fuzzy, perl-format
+msgid "creating tag page %s"
+msgstr "Création de la nouvelle page %s"
+
+#: ../IkiWiki/Plugin/template.pm:33
 msgid "missing id parameter"
 msgstr "Paramètre d'identification manquant"
 
-#: ../IkiWiki/Plugin/template.pm:36
-#, perl-format
-msgid "template %s not found"
-msgstr "Modèle de page %s introuvable"
-
-#: ../IkiWiki/Plugin/template.pm:55
-msgid "failed to process:"
-msgstr "Échec du traitement :"
+#: ../IkiWiki/Plugin/template.pm:47
+#, fuzzy, perl-format
+msgid "%s not found"
+msgstr "Flux introuvable "
 
-#: ../IkiWiki/Plugin/teximg.pm:70
+#: ../IkiWiki/Plugin/teximg.pm:72
 msgid "missing tex code"
 msgstr "Il manque le code TeX"
 
-#: ../IkiWiki/Plugin/teximg.pm:122
+#: ../IkiWiki/Plugin/teximg.pm:124
 msgid "failed to generate image from code"
 msgstr "Échec de la création de l'image à partir du code"
 
-#: ../IkiWiki/Plugin/websetup.pm:89
-msgid "plugin"
+#: ../IkiWiki/Plugin/websetup.pm:105
+#, fuzzy, perl-format
+msgid "%s plugin:"
 msgstr "greffon"
 
-#: ../IkiWiki/Plugin/websetup.pm:108
+#: ../IkiWiki/Plugin/websetup.pm:121
+#, fuzzy, perl-format
+msgid "%s plugins"
+msgstr "Greffons"
+
+#: ../IkiWiki/Plugin/websetup.pm:135
 #, perl-format
 msgid "enable %s?"
 msgstr "activer %s ?"
 
-#: ../IkiWiki/Plugin/websetup.pm:240
+#: ../IkiWiki/Plugin/websetup.pm:276
 msgid "setup file for this wiki is not known"
 msgstr "Le fichier de configuration de ce wiki n'est pas connu"
 
-#: ../IkiWiki/Plugin/websetup.pm:256
+#: ../IkiWiki/Plugin/websetup.pm:292
 msgid "main"
 msgstr "Partie principale"
 
-#: ../IkiWiki/Plugin/websetup.pm:257
-msgid "plugins"
-msgstr "Greffons"
-
-#: ../IkiWiki/Plugin/websetup.pm:395
+#: ../IkiWiki/Plugin/websetup.pm:435
 msgid ""
 "The configuration changes shown below require a wiki rebuild to take effect."
 msgstr ""
 "Les changements de configuration ci-dessous nécessitent une recompilation du "
 "wiki pour prendre effet"
 
-#: ../IkiWiki/Plugin/websetup.pm:399
+#: ../IkiWiki/Plugin/websetup.pm:439
 msgid ""
 "For the configuration changes shown below to fully take effect, you may need "
 "to rebuild the wiki."
@@ -1017,7 +1047,7 @@ msgstr ""
 "Pour que les changements de configuration ci-dessous prennent effet vous "
 "devez recompiler le wiki"
 
-#: ../IkiWiki/Plugin/websetup.pm:436
+#: ../IkiWiki/Plugin/websetup.pm:476
 #, perl-format
 msgid "Error: %s exited nonzero (%s). Discarding setup changes."
 msgstr "Erreur : %s s'est terminé anormalement (%s). Modifications ignorées."
@@ -1033,12 +1063,12 @@ msgstr ""
 msgid "bad file name %s"
 msgstr "Nom de fichier incorrect %s"
 
-#: ../IkiWiki/Render.pm:150
+#: ../IkiWiki/Render.pm:158
 #, perl-format
 msgid "scanning %s"
 msgstr "Examen de %s"
 
-#: ../IkiWiki/Render.pm:271
+#: ../IkiWiki/Render.pm:280
 #, perl-format
 msgid ""
 "symlink found in srcdir path (%s) -- set allow_symlinks_before_srcdir to "
@@ -1047,69 +1077,84 @@ msgstr ""
 "Lien symbolique trouvé dans l'adresse de srcdir (%s) -- pour l'autoriser, "
 "activez le paramètre « allow_symlinks_before_srcdir »."
 
-#: ../IkiWiki/Render.pm:300 ../IkiWiki/Render.pm:327
+#: ../IkiWiki/Render.pm:311
 #, perl-format
 msgid "skipping bad filename %s"
 msgstr "Omission du fichier au nom incorrect %s"
 
-#: ../IkiWiki/Render.pm:305
+#: ../IkiWiki/Render.pm:327
 #, perl-format
 msgid "%s has multiple possible source pages"
 msgstr "%s peut être associé à plusieurs pages source."
 
-#: ../IkiWiki/Render.pm:395
+#: ../IkiWiki/Render.pm:369
 #, perl-format
-msgid "removing old page %s"
+msgid "querying %s for file creation and modification times.."
+msgstr ""
+
+#: ../IkiWiki/Render.pm:431
+#, fuzzy, perl-format
+msgid "removing obsolete %s"
 msgstr "Suppression de l'ancienne page %s"
 
-#: ../IkiWiki/Render.pm:471
+#: ../IkiWiki/Render.pm:505
 #, perl-format
 msgid "building %s, which links to %s"
 msgstr "Reconstruction de %s, qui est lié à %s"
 
-#: ../IkiWiki/Render.pm:480
+#: ../IkiWiki/Render.pm:514
 #, perl-format
 msgid "removing %s, no longer built by %s"
 msgstr "Suppression de %s, qui n'est plus rendu par %s"
 
-#: ../IkiWiki/Render.pm:603
+#: ../IkiWiki/Render.pm:597 ../IkiWiki/Render.pm:679
 #, perl-format
 msgid "building %s, which depends on %s"
 msgstr "Reconstruction de %s, qui dépend de %s"
 
-#: ../IkiWiki/Render.pm:616
+#: ../IkiWiki/Render.pm:692
 #, perl-format
 msgid "building %s, to update its backlinks"
 msgstr "Reconstruction de %s, afin de mettre à jour ses rétroliens"
 
-#: ../IkiWiki/Render.pm:679
+#: ../IkiWiki/Render.pm:821
 #, perl-format
 msgid "ikiwiki: cannot build %s"
 msgstr "ikiwiki : impossible de reconstruire %s"
 
 #. translators: The first parameter is a filename, and the second
 #. translators: is a (probably not translated) error message.
-#: ../IkiWiki/Setup.pm:19
+#: ../IkiWiki/Setup.pm:23
 #, perl-format
 msgid "cannot read %s: %s"
 msgstr "Lecture impossible de %s : %s"
 
-#: ../IkiWiki/Setup/Automator.pm:33
+#: ../IkiWiki/Setup.pm:34
+#, fuzzy, perl-format
+msgid "cannot load %s in safe mode"
+msgstr "Lecture impossible de %s : %s"
+
+#: ../IkiWiki/Setup.pm:46
+#, fuzzy, perl-format
+msgid "failed to parse %s"
+msgstr "Impossible de mettre à jour %s"
+
+#: ../IkiWiki/Setup/Automator.pm:34
 msgid "you must enter a wikiname (that contains alphanumerics)"
 msgstr ""
 "Vous devez spécifier un nom de wiki (contenant des caractères "
 "alphanumériques)"
 
-#: ../IkiWiki/Setup/Automator.pm:76
+#: ../IkiWiki/Setup/Automator.pm:89
 #, perl-format
 msgid "unsupported revision control system %s"
 msgstr "Système de contrôle de version non reconnu : %s"
 
-#: ../IkiWiki/Setup/Automator.pm:102
+#: ../IkiWiki/Setup/Automator.pm:115
 msgid "failed to set up the repository with ikiwiki-makerepo"
 msgstr "Échec lors de la création du dépôt avec ikiwiki-makerepo"
 
-#: ../IkiWiki/Setup/Automator.pm:120
+#: ../IkiWiki/Setup/Automator.pm:134
 #, perl-format
 msgid "** Disabling plugin %s, since it is failing with this message:"
 msgstr ""
@@ -1131,13 +1176,13 @@ msgid "wrapper filename not specified"
 msgstr "Le nom du fichier CGI n'a pas été indiqué"
 
 #. translators: The parameter is a C filename.
-#: ../IkiWiki/Wrapper.pm:149
+#: ../IkiWiki/Wrapper.pm:160
 #, perl-format
 msgid "failed to compile %s"
 msgstr "Échec de la compilation de %s"
 
 #. translators: The parameter is a filename.
-#: ../IkiWiki/Wrapper.pm:169
+#: ../IkiWiki/Wrapper.pm:180
 #, perl-format
 msgid "successfully generated %s"
 msgstr "%s a été créé avec succès"
@@ -1150,59 +1195,65 @@ msgstr "Syntaxe : ikiwiki [options] source destination"
 msgid "       ikiwiki --setup configfile"
 msgstr "       ikiwiki --setup fichier de configuration"
 
-#: ../ikiwiki.in:91
+#: ../ikiwiki.in:96
 msgid "usage: --set var=value"
 msgstr "Syntaxe : -- set var=valeur"
 
-#: ../ikiwiki.in:140
+#: ../ikiwiki.in:103
+#, fuzzy
+msgid "usage: --set-yaml var=value"
+msgstr "Syntaxe : -- set var=valeur"
+
+#: ../ikiwiki.in:157
 msgid "generating wrappers.."
 msgstr "Création des fichiers CGI..."
 
-#: ../ikiwiki.in:195
+#: ../ikiwiki.in:220
 msgid "rebuilding wiki.."
 msgstr "Reconstruction du wiki..."
 
-#: ../ikiwiki.in:198
+#: ../ikiwiki.in:223
 msgid "refreshing wiki.."
 msgstr "Rafraîchissement du wiki..."
 
-#: ../IkiWiki.pm:238
+#: ../IkiWiki.pm:232
 msgid "Discussion"
 msgstr "Discussion"
 
-#: ../IkiWiki.pm:507
+#: ../IkiWiki.pm:531
 msgid "Must specify url to wiki with --url when using --cgi"
 msgstr ""
 "Vous devez indiquer l'URL du wiki par --url lors de l'utilisation de --cgi"
 
-#: ../IkiWiki.pm:553
+#: ../IkiWiki.pm:577
 msgid "cannot use multiple rcs plugins"
 msgstr "Impossible d'utiliser plusieurs systèmes de contrôle des versions"
 
-#: ../IkiWiki.pm:582
+#: ../IkiWiki.pm:606
 #, 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:1264
+#: ../IkiWiki.pm:1298
 #, 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:1863
+#: ../IkiWiki.pm:1984
 msgid "yes"
 msgstr "oui"
 
-#: ../IkiWiki.pm:2006
-msgid "Sort::Naturally needed for title_natural sort"
-msgstr "Sort::Naturally est nécessaire pour un tri « title_natural »"
+#: ../IkiWiki.pm:2061
+#, fuzzy, perl-format
+msgid "invalid sort type %s"
+msgstr "Type de tri %s inconnu"
 
-#: ../IkiWiki.pm:2017
+#: ../IkiWiki.pm:2082
 #, perl-format
 msgid "unknown sort type %s"
 msgstr "Type de tri %s inconnu"
 
-#: ../IkiWiki.pm:2036
+#: ../IkiWiki.pm:2218
 #, perl-format
 msgid "cannot match pages: %s"
 msgstr "Impossible de trouver les pages %s"
@@ -1227,6 +1278,30 @@ msgstr "Identifiant de l'administrateur (utilisateur du wiki ou openid) :"
 msgid "What is the domain name of the web server?"
 msgstr "Nom de domaine du serveur HTTP :"
 
+#~ msgid "You need to log in first."
+#~ msgstr "Vous devez d'abord vous identifier."
+
+#~ msgid "Log in with"
+#~ msgstr "S'identifier en tant que"
+
+#~ msgid "Get an OpenID"
+#~ msgstr "Obtenir un compte OpenID"
+
+#~ msgid "failed to process"
+#~ msgstr "Échec du traitement"
+
+#~ msgid "nonexistant template %s"
+#~ msgstr "Le modèle de page %s n'existe pas"
+
+#~ msgid "getctime not implemented"
+#~ msgstr "getctime n'est pas implémenté"
+
+#~ msgid "Sort::Naturally needed for title_natural sort"
+#~ msgstr "Sort::Naturally est nécessaire pour un tri « title_natural »"
+
+#~ msgid "failed to read %s"
+#~ msgstr "Impossible de lire %s"
+
 #~ msgid "Failed to parse url, cannot determine domain name"
 #~ msgstr "Impossible d'analyser l'URL, pas de nom de domaine"
 
@@ -1247,5 +1322,5 @@ msgstr "Nom de domaine du serveur HTTP :"
 
 #~ msgid "<p class=\"error\">Error: %s exited nonzero (%s)"
 #~ msgstr ""
-#~ "<p class=\"erreur\">Erreur : %s s'est terminé, valeur de sortie nonzero (%"
-#~ "s)"
+#~ "<p class=\"erreur\">Erreur : %s s'est terminé, valeur de sortie nonzero "
+#~ "(%s)"
index 96e9ad1847d62d30aa2ac00abaa9e2fa9e40d9f2..c0dfb145b2d733aae815f87cbe747597998bd0ec 100644 (file)
--- a/po/gu.po
+++ b/po/gu.po
@@ -7,54 +7,51 @@ msgid ""
 msgstr ""
 "Project-Id-Version: ikiwiki-gu\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-10-31 18:31-0400\n"
+"POT-Creation-Date: 2010-06-10 15:02-0400\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"
+"Language: gu\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: ../IkiWiki/CGI.pm:114
-msgid "You need to log in first."
-msgstr "તમારે પ્રથમ લોગ ઇન થવું પડશે."
-
-#: ../IkiWiki/CGI.pm:147
+#: ../IkiWiki/CGI.pm:162
 msgid ""
 "probable misconfiguration: sslcookie is set, but you are attempting to login "
 "via http, not https"
 msgstr ""
 
-#: ../IkiWiki/CGI.pm:150
+#: ../IkiWiki/CGI.pm:165
 msgid "login failed, perhaps you need to turn on cookies?"
 msgstr "પ્રવેશ નિષ્ફળ, કદાચ તમારી કુકીઓ સક્રિય બનાવવી પડશે?"
 
-#: ../IkiWiki/CGI.pm:169 ../IkiWiki/CGI.pm:314
+#: ../IkiWiki/CGI.pm:184 ../IkiWiki/CGI.pm:335
 msgid "Your login session has expired."
 msgstr ""
 
-#: ../IkiWiki/CGI.pm:190
+#: ../IkiWiki/CGI.pm:205
 msgid "Login"
 msgstr ""
 
-#: ../IkiWiki/CGI.pm:191
+#: ../IkiWiki/CGI.pm:206
 #, fuzzy
 msgid "Preferences"
 msgstr "પ્રાથમિકતાઓ સંગ્રહાઇ."
 
-#: ../IkiWiki/CGI.pm:192
+#: ../IkiWiki/CGI.pm:207
 msgid "Admin"
 msgstr ""
 
-#: ../IkiWiki/CGI.pm:232
+#: ../IkiWiki/CGI.pm:247
 msgid "Preferences saved."
 msgstr "પ્રાથમિકતાઓ સંગ્રહાઇ."
 
-#: ../IkiWiki/CGI.pm:278
+#: ../IkiWiki/CGI.pm:299
 msgid "You are banned."
 msgstr "તમારા પર પ્રતિબંધ છે."
 
-#: ../IkiWiki/CGI.pm:405 ../IkiWiki/CGI.pm:406 ../IkiWiki.pm:1282
+#: ../IkiWiki/CGI.pm:426 ../IkiWiki/CGI.pm:427 ../IkiWiki.pm:1316
 msgid "Error"
 msgstr "ક્ષતિ"
 
@@ -135,7 +132,7 @@ msgstr "નવું પાનું %s બનાવે છે"
 msgid "deleting bucket.."
 msgstr ""
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:206
+#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:231
 msgid "done"
 msgstr "સંપૂર્ણ"
 
@@ -144,43 +141,43 @@ msgstr "સંપૂર્ણ"
 msgid "Must specify %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:136
+#: ../IkiWiki/Plugin/amazon_s3.pm:140
 #, fuzzy
 msgid "Failed to create S3 bucket: "
 msgstr "મેઇલ મોકલવામાં નિષ્ફળ"
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:221
+#: ../IkiWiki/Plugin/amazon_s3.pm:225
 #, fuzzy
 msgid "Failed to save file to S3: "
 msgstr "મેઇલ મોકલવામાં નિષ્ફળ"
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:243
+#: ../IkiWiki/Plugin/amazon_s3.pm:247
 #, fuzzy
 msgid "Failed to delete file from S3: "
 msgstr "માપ બદલવામાં નિષ્ફળ: %s"
 
-#: ../IkiWiki/Plugin/attachment.pm:49
+#: ../IkiWiki/Plugin/attachment.pm:50
 #, perl-format
 msgid "there is already a page named %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/attachment.pm:65
+#: ../IkiWiki/Plugin/attachment.pm:66
 msgid "prohibited by allowed_attachments"
 msgstr ""
 
-#: ../IkiWiki/Plugin/attachment.pm:140
+#: ../IkiWiki/Plugin/attachment.pm:141
 msgid "bad attachment filename"
 msgstr ""
 
-#: ../IkiWiki/Plugin/attachment.pm:182
+#: ../IkiWiki/Plugin/attachment.pm:183
 msgid "attachment upload"
 msgstr ""
 
-#: ../IkiWiki/Plugin/autoindex.pm:105
+#: ../IkiWiki/Plugin/autoindex.pm:117
 msgid "automatic index generation"
 msgstr ""
 
-#: ../IkiWiki/Plugin/blogspam.pm:108
+#: ../IkiWiki/Plugin/blogspam.pm:109
 msgid ""
 "Sorry, but that looks like spam to <a href=\"http://blogspam.net/"
 "\">blogspam</a>: "
@@ -195,197 +192,217 @@ msgstr ""
 msgid "There are no broken links!"
 msgstr "અહીં કોઇ તૂટેલ કડી નથી!"
 
-#: ../IkiWiki/Plugin/comments.pm:124 ../IkiWiki/Plugin/format.pm:38
+#: ../IkiWiki/Plugin/comments.pm:112
+#, fuzzy, perl-format
+msgid "this comment needs %s"
+msgstr "%s બનાવે છે"
+
+#: ../IkiWiki/Plugin/comments.pm:115
+msgid "moderation"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:136 ../IkiWiki/Plugin/format.pm:48
 #, perl-format
 msgid "unsupported page format %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:129
+#: ../IkiWiki/Plugin/comments.pm:141
 msgid "comment must have content"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:185
+#: ../IkiWiki/Plugin/comments.pm:196
 msgid "Anonymous"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:340 ../IkiWiki/Plugin/editpage.pm:97
+#: ../IkiWiki/Plugin/comments.pm:357 ../IkiWiki/Plugin/editpage.pm:98
 msgid "bad page name"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:345
+#: ../IkiWiki/Plugin/comments.pm:362
 #, fuzzy, perl-format
 msgid "commenting on %s"
 msgstr "%s બનાવે છે"
 
-#: ../IkiWiki/Plugin/comments.pm:363
+#: ../IkiWiki/Plugin/comments.pm:380
 #, perl-format
 msgid "page '%s' doesn't exist, so you can't comment"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:370
+#: ../IkiWiki/Plugin/comments.pm:387
 #, perl-format
 msgid "comments on page '%s' are closed"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:464
+#: ../IkiWiki/Plugin/comments.pm:491
 msgid "comment stored for moderation"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:466
+#: ../IkiWiki/Plugin/comments.pm:493
 msgid "Your comment will be posted after moderator review"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:479
+#: ../IkiWiki/Plugin/comments.pm:506
 msgid "Added a comment"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:483
+#: ../IkiWiki/Plugin/comments.pm:510
 #, perl-format
 msgid "Added a comment: %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:525 ../IkiWiki/Plugin/websetup.pm:236
+#: ../IkiWiki/Plugin/comments.pm:552 ../IkiWiki/Plugin/websetup.pm:272
 msgid "you are not logged in as an admin"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:576
+#: ../IkiWiki/Plugin/comments.pm:603
 msgid "Comment moderation"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:615
+#: ../IkiWiki/Plugin/comments.pm:641
 msgid "comment moderation"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:766
-msgid "Comments"
+#: ../IkiWiki/Plugin/comments.pm:790
+#, perl-format
+msgid "%i comment"
+msgid_plural "%i comments"
+msgstr[0] ""
+msgstr[1] ""
+
+#. translators: Here "Comment" is a verb;
+#. translators: the user clicks on it to
+#. translators: post a comment.
+#: ../IkiWiki/Plugin/comments.pm:800
+msgid "Comment"
 msgstr ""
 
-#: ../IkiWiki/Plugin/conditional.pm:27 ../IkiWiki/Plugin/cutpaste.pm:30
-#: ../IkiWiki/Plugin/cutpaste.pm:45 ../IkiWiki/Plugin/cutpaste.pm:61
+#: ../IkiWiki/Plugin/conditional.pm:28 ../IkiWiki/Plugin/cutpaste.pm:31
+#: ../IkiWiki/Plugin/cutpaste.pm:46 ../IkiWiki/Plugin/cutpaste.pm:62
 #: ../IkiWiki/Plugin/testpagespec.pm:26
 #, fuzzy, perl-format
 msgid "%s parameter is required"
 msgstr "\"test\" અને \"then\" વિકલ્પો જરૂરી છે"
 
-#: ../IkiWiki/Plugin/cutpaste.pm:66
+#: ../IkiWiki/Plugin/cutpaste.pm:67
 msgid "no text was copied in this page"
 msgstr ""
 
-#: ../IkiWiki/Plugin/cutpaste.pm:69
+#: ../IkiWiki/Plugin/cutpaste.pm:70
 #, perl-format
 msgid "no text was copied in this page with id %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/editpage.pm:40
+#: ../IkiWiki/Plugin/editpage.pm:41
 #, fuzzy, perl-format
 msgid "removing old preview %s"
 msgstr "જુનાં પાનાં દૂર કરે છે %s"
 
-#: ../IkiWiki/Plugin/editpage.pm:113
+#: ../IkiWiki/Plugin/editpage.pm:114
 #, perl-format
 msgid "%s is not an editable page"
 msgstr "%s એ સુધારી શકાય તેવું પાનું નથી"
 
-#: ../IkiWiki/Plugin/editpage.pm:292
+#: ../IkiWiki/Plugin/editpage.pm:294
 #, perl-format
 msgid "creating %s"
 msgstr "%s બનાવે છે"
 
-#: ../IkiWiki/Plugin/editpage.pm:310 ../IkiWiki/Plugin/editpage.pm:329
-#: ../IkiWiki/Plugin/editpage.pm:339 ../IkiWiki/Plugin/editpage.pm:383
-#: ../IkiWiki/Plugin/editpage.pm:422
+#: ../IkiWiki/Plugin/editpage.pm:312 ../IkiWiki/Plugin/editpage.pm:334
+#: ../IkiWiki/Plugin/editpage.pm:345 ../IkiWiki/Plugin/editpage.pm:390
+#: ../IkiWiki/Plugin/editpage.pm:429
 #, perl-format
 msgid "editing %s"
 msgstr "%s સુધારે છે"
 
-#: ../IkiWiki/Plugin/edittemplate.pm:51
+#: ../IkiWiki/Plugin/edittemplate.pm:52
 #, fuzzy
 msgid "template not specified"
 msgstr "ટેમ્પલેટ %s મળ્યું નહી"
 
-#: ../IkiWiki/Plugin/edittemplate.pm:54
+#: ../IkiWiki/Plugin/edittemplate.pm:55
 #, fuzzy
 msgid "match not specified"
 msgstr "આવરણ ફાઇલનામ સ્પષ્ટ કરેલ નથી"
 
-#: ../IkiWiki/Plugin/edittemplate.pm:63
+#: ../IkiWiki/Plugin/edittemplate.pm:64
 #, perl-format
 msgid "edittemplate %s registered for %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/edittemplate.pm:137
+#: ../IkiWiki/Plugin/edittemplate.pm:125 ../IkiWiki/Plugin/inline.pm:339
+#: ../IkiWiki/Plugin/template.pm:44
 #, fuzzy
-msgid "failed to process"
+msgid "failed to process template:"
 msgstr "ક્રિયા કરવામાં નિષ્ફળ:"
 
-#: ../IkiWiki/Plugin/format.pm:20
+#: ../IkiWiki/Plugin/format.pm:30
 msgid "must specify format and text"
 msgstr ""
 
-#: ../IkiWiki/Plugin/fortune.pm:27
+#: ../IkiWiki/Plugin/fortune.pm:28
 msgid "fortune failed"
 msgstr "ભવિષ્ય નિષ્ફળ"
 
-#: ../IkiWiki/Plugin/getsource.pm:62 ../IkiWiki/Plugin/goto.pm:55
+#: ../IkiWiki/Plugin/getsource.pm:64 ../IkiWiki/Plugin/goto.pm:58
 #, fuzzy
 msgid "missing page"
 msgstr "ખોવાયેલ કિંમતો"
 
-#: ../IkiWiki/Plugin/getsource.pm:64 ../IkiWiki/Plugin/goto.pm:57
+#: ../IkiWiki/Plugin/getsource.pm:66 ../IkiWiki/Plugin/goto.pm:60
 #, perl-format
 msgid "The page %s does not exist."
 msgstr ""
 
-#: ../IkiWiki/Plugin/getsource.pm:73
+#: ../IkiWiki/Plugin/getsource.pm:75
 #, fuzzy
 msgid "not a page"
 msgstr "વાંચી શકાતી નથી %s: %s"
 
-#: ../IkiWiki/Plugin/getsource.pm:75
+#: ../IkiWiki/Plugin/getsource.pm:77
 #, fuzzy, perl-format
 msgid "%s is an attachment, not a page."
 msgstr "%s એ સુધારી શકાય તેવું પાનું નથી"
 
-#: ../IkiWiki/Plugin/git.pm:651 ../IkiWiki/Plugin/git.pm:669
+#: ../IkiWiki/Plugin/git.pm:687 ../IkiWiki/Plugin/git.pm:705
 #: ../IkiWiki/Receive.pm:130
 #, perl-format
 msgid "you are not allowed to change %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/git.pm:691
+#: ../IkiWiki/Plugin/git.pm:727
 #, perl-format
 msgid "you cannot act on a file with mode %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/git.pm:695
+#: ../IkiWiki/Plugin/git.pm:731
 msgid "you are not allowed to change file modes"
 msgstr ""
 
-#: ../IkiWiki/Plugin/google.pm:25 ../IkiWiki/Plugin/po.pm:131
-#: ../IkiWiki/Plugin/search.pm:36
+#: ../IkiWiki/Plugin/google.pm:26 ../IkiWiki/Plugin/po.pm:134
+#: ../IkiWiki/Plugin/search.pm:37
 #, fuzzy, perl-format
 msgid "Must specify %s when using the %s plugin"
 msgstr "જ્યારે શોધ પ્લગઇન ઉપયોગ કરતા હોવ ત્યારે %s સ્પષ્ટ કરવું જ પડશે"
 
-#: ../IkiWiki/Plugin/graphviz.pm:67
+#: ../IkiWiki/Plugin/graphviz.pm:68
 msgid "failed to run graphviz"
 msgstr "ગ્રાફવિઝ ચલાવવામાં નિષ્ફળ"
 
-#: ../IkiWiki/Plugin/graphviz.pm:94
+#: ../IkiWiki/Plugin/graphviz.pm:91
 msgid "prog not a valid graphviz program"
 msgstr "કાર્યક્રમએ યોગ્ય ગ્રાફવિઝ કાર્યક્રમ નથી"
 
-#: ../IkiWiki/Plugin/highlight.pm:47
+#: ../IkiWiki/Plugin/highlight.pm:48
 #, perl-format
 msgid "tohighlight contains unknown file type '%s'"
 msgstr ""
 
-#: ../IkiWiki/Plugin/highlight.pm:58
+#: ../IkiWiki/Plugin/highlight.pm:59
 #, perl-format
 msgid "Source code: %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/highlight.pm:123
+#: ../IkiWiki/Plugin/highlight.pm:124
 msgid ""
 "warning: highlight perl module not available; falling back to pass through"
 msgstr ""
@@ -395,104 +412,113 @@ msgstr ""
 msgid "htmltidy failed to parse this html"
 msgstr "કોઇપણ સ્માઇલીઓ ઉકેલવામાં નિષ્ફળ"
 
-#: ../IkiWiki/Plugin/img.pm:64
+#: ../IkiWiki/Plugin/img.pm:69
 #, fuzzy
 msgid "Image::Magick is not installed"
 msgstr "પોલિગોન સ્થાપિત નથી"
 
-#: ../IkiWiki/Plugin/img.pm:68 ../IkiWiki/Plugin/img.pm:112
+#: ../IkiWiki/Plugin/img.pm:73 ../IkiWiki/Plugin/img.pm:117
 #, perl-format
 msgid "failed to read %s: %s"
 msgstr "%s વાંચવામાં નિષ્ફળ: %s"
 
-#: ../IkiWiki/Plugin/img.pm:74
+#: ../IkiWiki/Plugin/img.pm:79
 #, perl-format
 msgid "wrong size format \"%s\" (should be WxH)"
 msgstr ""
 
-#: ../IkiWiki/Plugin/img.pm:120
+#: ../IkiWiki/Plugin/img.pm:122
 #, perl-format
 msgid "failed to resize: %s"
 msgstr "માપ બદલવામાં નિષ્ફળ: %s"
 
-#: ../IkiWiki/Plugin/img.pm:140
+#: ../IkiWiki/Plugin/img.pm:146
 #, fuzzy, perl-format
 msgid "failed to determine size of image %s"
 msgstr "માપ બદલવામાં નિષ્ફળ: %s"
 
-#: ../IkiWiki/Plugin/inline.pm:92
+#: ../IkiWiki/Plugin/inline.pm:93
 msgid "Must specify url to wiki with --url when using --rss or --atom"
 msgstr "--rss અથવા --atom ઉપયોગ કરતી વખતે વીકીમાં --url ઉપયોગ કરવું જ પડશે"
 
-#: ../IkiWiki/Plugin/inline.pm:138
+#: ../IkiWiki/Plugin/inline.pm:139
 #, fuzzy
 msgid "page editing not allowed"
 msgstr "ફીડ મળ્યું નહી"
 
-#: ../IkiWiki/Plugin/inline.pm:155
+#: ../IkiWiki/Plugin/inline.pm:156
 #, fuzzy
 msgid "missing pages parameter"
 msgstr "ખોવાયેલ %s વિકલ્પ"
 
-#: ../IkiWiki/Plugin/inline.pm:191
+#: ../IkiWiki/Plugin/inline.pm:192
 #, perl-format
 msgid "the %s and %s parameters cannot be used together"
 msgstr ""
 
-#: ../IkiWiki/Plugin/inline.pm:312
+#: ../IkiWiki/Plugin/inline.pm:313
 msgid "Add a new post titled:"
 msgstr "આ શિર્ષકથી નવું પોસ્ટ ઉમેરો:"
 
-#: ../IkiWiki/Plugin/inline.pm:332
+#: ../IkiWiki/Plugin/inline.pm:342
 #, perl-format
-msgid "nonexistant template %s"
-msgstr "àª\85સà«\8dતિતà«\8dવમાàª\82 àª¨ àª¹à«\8bય àª¤à«\87વà«\81àª\82 àª\9fà«\87મà«\8dપલà«\87àª\9f %s"
+msgid "template %s not found"
+msgstr "àª\9fà«\87મà«\8dપલà«\87àª\9f %s àª®àª³à«\8dયà«\81àª\82 àª¨àª¹à«\80"
 
-#: ../IkiWiki/Plugin/inline.pm:598
+#: ../IkiWiki/Plugin/inline.pm:633
 msgid "RPC::XML::Client not found, not pinging"
 msgstr "RPC::XML::Client મળ્યું નહી, પિંગ કરવામાં આવતું નથી"
 
-#: ../IkiWiki/Plugin/linkmap.pm:101
+#: ../IkiWiki/Plugin/linkmap.pm:81 ../IkiWiki/Plugin/linkmap.pm:88
+#: ../IkiWiki/Plugin/linkmap.pm:92 ../IkiWiki/Plugin/linkmap.pm:95
 msgid "failed to run dot"
 msgstr "ડોટ ચલાવવામાં નિષ્ફળ"
 
-#: ../IkiWiki/Plugin/lockedit.pm:47
+#: ../IkiWiki/Plugin/linkmap.pm:85
+msgid "linkmap"
+msgstr ""
+
+#: ../IkiWiki/Plugin/lockedit.pm:49
 #, fuzzy, perl-format
 msgid "%s is locked and cannot be edited"
 msgstr "%s એ %s દ્વારા તાળું મરાયેલ છે અને તેમાં સુધારો કરી શકાશે નહી"
 
-#: ../IkiWiki/Plugin/mdwn.pm:44
+#: ../IkiWiki/Plugin/mdwn.pm:45
 msgid "multimarkdown is enabled, but Text::MultiMarkdown is not installed"
 msgstr ""
 
-#: ../IkiWiki/Plugin/mdwn.pm:69
+#: ../IkiWiki/Plugin/mdwn.pm:70
 #, perl-format
 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:161
+#: ../IkiWiki/Plugin/meta.pm:174
 msgid "stylesheet not found"
 msgstr "સ્ટાઇલશીટ મળ્યું નહી"
 
-#: ../IkiWiki/Plugin/meta.pm:199
+#: ../IkiWiki/Plugin/meta.pm:212
 #, fuzzy
 msgid "redir page not found"
 msgstr "ફીડ મળ્યું નહી"
 
-#: ../IkiWiki/Plugin/meta.pm:213
+#: ../IkiWiki/Plugin/meta.pm:226
 #, fuzzy
 msgid "redir cycle is not allowed"
 msgstr "ફીડ મળ્યું નહી"
 
-#: ../IkiWiki/Plugin/mirrorlist.pm:43
+#: ../IkiWiki/Plugin/meta.pm:387
+msgid "sort=meta requires a parameter"
+msgstr ""
+
+#: ../IkiWiki/Plugin/mirrorlist.pm:44
 msgid "Mirrors"
 msgstr "મિરરો"
 
-#: ../IkiWiki/Plugin/mirrorlist.pm:43
+#: ../IkiWiki/Plugin/mirrorlist.pm:44
 msgid "Mirror"
 msgstr "મિરર"
 
-#: ../IkiWiki/Plugin/moderatedcomments.pm:41
+#: ../IkiWiki/Plugin/moderatedcomments.pm:57
 msgid "comment needs moderation"
 msgstr ""
 
@@ -500,19 +526,12 @@ msgstr ""
 msgid "more"
 msgstr "વધુ"
 
-#: ../IkiWiki/Plugin/norcs.pm:65
-msgid "getctime not implemented"
-msgstr "getctime અમલમાં મૂકાયેલ નથી"
-
-#: ../IkiWiki/Plugin/openid.pm:61
-msgid "Log in with"
-msgstr ""
-
-#: ../IkiWiki/Plugin/openid.pm:64
-msgid "Get an OpenID"
-msgstr "ઓપનઆઇડી મેળવો"
+#: ../IkiWiki/Plugin/openid.pm:58
+#, fuzzy, perl-format
+msgid "failed to load openid module: "
+msgstr "%s કમ્પાઇલ કરવામાં નિષ્ફળ"
 
-#: ../IkiWiki/Plugin/orphans.pm:55
+#: ../IkiWiki/Plugin/orphans.pm:56
 #, fuzzy
 msgid "All pages have other pages linking to them."
 msgstr "બધા પાનાંઓ બીજા પાનાંઓ વડે જોડાયેલ છે."
@@ -521,31 +540,39 @@ msgstr "બધા પાનાંઓ બીજા પાનાંઓ વડે 
 msgid "bad or missing template"
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:248
+#: ../IkiWiki/Plugin/passwordauth.pm:231
+msgid "Your user page: "
+msgstr ""
+
+#: ../IkiWiki/Plugin/passwordauth.pm:238
+msgid "Create your user page"
+msgstr ""
+
+#: ../IkiWiki/Plugin/passwordauth.pm:268
 msgid "Account creation successful. Now you can Login."
 msgstr "ખાતું બનાવવાનું સફળ. તમે હવે લોગઇન કરી શકો છો."
 
-#: ../IkiWiki/Plugin/passwordauth.pm:251
+#: ../IkiWiki/Plugin/passwordauth.pm:271
 msgid "Error creating account."
 msgstr "ખાતું બનાવવામાં ક્ષતિ."
 
-#: ../IkiWiki/Plugin/passwordauth.pm:258
+#: ../IkiWiki/Plugin/passwordauth.pm:278
 msgid "No email address, so cannot email password reset instructions."
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:292
+#: ../IkiWiki/Plugin/passwordauth.pm:312
 msgid "Failed to send mail"
 msgstr "મેઇલ મોકલવામાં નિષ્ફળ"
 
-#: ../IkiWiki/Plugin/passwordauth.pm:294
+#: ../IkiWiki/Plugin/passwordauth.pm:314
 msgid "You have been mailed password reset instructions."
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:329
+#: ../IkiWiki/Plugin/passwordauth.pm:349
 msgid "incorrect password reset url"
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:332
+#: ../IkiWiki/Plugin/passwordauth.pm:352
 msgid "password reset denied"
 msgstr ""
 
@@ -576,124 +603,119 @@ msgstr "RPC::XML::Client મળ્યું નહી, પિંગ કરવા
 msgid "warning: Old po4a detected! Recommend upgrade to 0.35."
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:138
+#: ../IkiWiki/Plugin/po.pm:142
 #, fuzzy, perl-format
 msgid "%s is not a valid language code"
 msgstr "%s એ સુધારી શકાય તેવું પાનું નથી"
 
-#: ../IkiWiki/Plugin/po.pm:150
+#: ../IkiWiki/Plugin/po.pm:154
 #, perl-format
 msgid ""
 "%s is not a valid value for po_link_to, falling back to po_link_to=default"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:155
+#: ../IkiWiki/Plugin/po.pm:159
 msgid ""
 "po_link_to=negotiated requires usedirs to be enabled, falling back to "
 "po_link_to=default"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:385
+#: ../IkiWiki/Plugin/po.pm:390
 #, perl-format
 msgid "rebuilding all pages to fix meta titles"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:389 ../IkiWiki/Render.pm:638
+#: ../IkiWiki/Plugin/po.pm:394 ../IkiWiki/Render.pm:769
 #, fuzzy, perl-format
 msgid "building %s"
 msgstr "%s સુધારે છે"
 
-#: ../IkiWiki/Plugin/po.pm:427
+#: ../IkiWiki/Plugin/po.pm:432
 msgid "updated PO files"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:451
+#: ../IkiWiki/Plugin/po.pm:456
 msgid ""
 "Can not remove a translation. If the master page is removed, however, its "
 "translations will be removed as well."
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:471
+#: ../IkiWiki/Plugin/po.pm:476
 msgid ""
 "Can not rename a translation. If the master page is renamed, however, its "
 "translations will be renamed as well."
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:870
+#: ../IkiWiki/Plugin/po.pm:876
 #, perl-format
 msgid "POT file (%s) does not exist"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:884
+#: ../IkiWiki/Plugin/po.pm:890
 #, fuzzy, perl-format
 msgid "failed to copy underlay PO file to %s"
 msgstr "%s કમ્પાઇલ કરવામાં નિષ્ફળ"
 
-#: ../IkiWiki/Plugin/po.pm:893
+#: ../IkiWiki/Plugin/po.pm:899
 #, fuzzy, perl-format
 msgid "failed to update %s"
 msgstr "%s કમ્પાઇલ કરવામાં નિષ્ફળ"
 
-#: ../IkiWiki/Plugin/po.pm:899
+#: ../IkiWiki/Plugin/po.pm:905
 #, fuzzy, perl-format
 msgid "failed to copy the POT file to %s"
 msgstr "%s કમ્પાઇલ કરવામાં નિષ્ફળ"
 
-#: ../IkiWiki/Plugin/po.pm:935
+#: ../IkiWiki/Plugin/po.pm:941
 msgid "N/A"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:948
+#: ../IkiWiki/Plugin/po.pm:954
 #, fuzzy, perl-format
 msgid "failed to translate %s"
 msgstr "માપ બદલવામાં નિષ્ફળ: %s"
 
-#: ../IkiWiki/Plugin/po.pm:1032
+#: ../IkiWiki/Plugin/po.pm:1038
 msgid "removed obsolete PO files"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:1095 ../IkiWiki/Plugin/po.pm:1109
-#: ../IkiWiki/Plugin/po.pm:1149
+#: ../IkiWiki/Plugin/po.pm:1094 ../IkiWiki/Plugin/po.pm:1108
+#: ../IkiWiki/Plugin/po.pm:1147
 #, fuzzy, perl-format
 msgid "failed to write %s"
 msgstr "%s લખવામાં નિષ્ફળ: %s"
 
-#: ../IkiWiki/Plugin/po.pm:1107
+#: ../IkiWiki/Plugin/po.pm:1106
 #, fuzzy
 msgid "failed to translate"
 msgstr "ડોટ ચલાવવામાં નિષ્ફળ"
 
-#: ../IkiWiki/Plugin/po.pm:1112
-#, fuzzy, perl-format
-msgid "failed to read %s"
-msgstr "%s વાંચવામાં નિષ્ફળ: %s"
-
-#: ../IkiWiki/Plugin/po.pm:1161
+#: ../IkiWiki/Plugin/po.pm:1159
 msgid "invalid gettext data, go back to previous page to continue edit"
 msgstr ""
 
-#: ../IkiWiki/Plugin/poll.pm:69
+#: ../IkiWiki/Plugin/poll.pm:70
 msgid "vote"
 msgstr "મત"
 
-#: ../IkiWiki/Plugin/poll.pm:77
+#: ../IkiWiki/Plugin/poll.pm:78
 msgid "Total votes:"
 msgstr "કુલ મત:"
 
-#: ../IkiWiki/Plugin/polygen.pm:41
+#: ../IkiWiki/Plugin/polygen.pm:42
 msgid "polygen not installed"
 msgstr "પોલિગોન સ્થાપિત નથી"
 
-#: ../IkiWiki/Plugin/polygen.pm:60
+#: ../IkiWiki/Plugin/polygen.pm:61
 #, fuzzy
 msgid "command failed"
 msgstr "ભવિષ્ય નિષ્ફળ"
 
-#: ../IkiWiki/Plugin/postsparkline.pm:46
+#: ../IkiWiki/Plugin/postsparkline.pm:47
 msgid "missing formula"
 msgstr "ખોવાયેલ સૂત્ર"
 
-#: ../IkiWiki/Plugin/postsparkline.pm:53
+#: ../IkiWiki/Plugin/postsparkline.pm:54
 msgid "unknown formula"
 msgstr "અજાણ્યું સૂત્ર"
 
@@ -762,12 +784,12 @@ msgstr "મધ્યરાત્રે"
 msgid "at noon on %A"
 msgstr "બપોરે %A પર"
 
-#: ../IkiWiki/Plugin/progress.pm:34
+#: ../IkiWiki/Plugin/progress.pm:35
 #, perl-format
 msgid "illegal percent value %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/progress.pm:55
+#: ../IkiWiki/Plugin/progress.pm:56
 msgid "need either `percent` or `totalpages` and `donepages` parameters"
 msgstr ""
 
@@ -775,40 +797,40 @@ msgstr ""
 msgid "(Diff truncated)"
 msgstr ""
 
-#: ../IkiWiki/Plugin/remove.pm:31 ../IkiWiki/Plugin/rename.pm:36
+#: ../IkiWiki/Plugin/remove.pm:32 ../IkiWiki/Plugin/rename.pm:37
 #, perl-format
 msgid "%s does not exist"
 msgstr ""
 
-#: ../IkiWiki/Plugin/remove.pm:38
+#: ../IkiWiki/Plugin/remove.pm:39
 #, fuzzy, perl-format
 msgid "%s is not in the srcdir, so it cannot be deleted"
 msgstr "%s એ %s દ્વારા તાળું મરાયેલ છે અને તેમાં સુધારો કરી શકાશે નહી"
 
-#: ../IkiWiki/Plugin/remove.pm:41 ../IkiWiki/Plugin/rename.pm:45
+#: ../IkiWiki/Plugin/remove.pm:42 ../IkiWiki/Plugin/rename.pm:46
 #, fuzzy, perl-format
 msgid "%s is not a file"
 msgstr "%s એ સુધારી શકાય તેવું પાનું નથી"
 
-#: ../IkiWiki/Plugin/remove.pm:134
+#: ../IkiWiki/Plugin/remove.pm:137
 #, perl-format
 msgid "confirm removal of %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/remove.pm:171
+#: ../IkiWiki/Plugin/remove.pm:174
 msgid "Please select the attachments to remove."
 msgstr ""
 
-#: ../IkiWiki/Plugin/remove.pm:211
+#: ../IkiWiki/Plugin/remove.pm:216
 msgid "removed"
 msgstr ""
 
-#: ../IkiWiki/Plugin/rename.pm:42
+#: ../IkiWiki/Plugin/rename.pm:43
 #, perl-format
 msgid "%s is not in the srcdir, so it cannot be renamed"
 msgstr ""
 
-#: ../IkiWiki/Plugin/rename.pm:62
+#: ../IkiWiki/Plugin/rename.pm:63
 #, fuzzy
 msgid "no change to the file name was specified"
 msgstr "આવરણ ફાઇલનામ સ્પષ્ટ કરેલ નથી"
@@ -833,24 +855,24 @@ msgstr ""
 msgid "rename %s"
 msgstr "રેન્ડર કરે છે %s"
 
-#: ../IkiWiki/Plugin/rename.pm:161
+#: ../IkiWiki/Plugin/rename.pm:163
 msgid "Also rename SubPages and attachments"
 msgstr ""
 
-#: ../IkiWiki/Plugin/rename.pm:247
+#: ../IkiWiki/Plugin/rename.pm:250
 msgid "Only one attachment can be renamed at a time."
 msgstr ""
 
-#: ../IkiWiki/Plugin/rename.pm:250
+#: ../IkiWiki/Plugin/rename.pm:253
 msgid "Please select the attachment to rename."
 msgstr ""
 
-#: ../IkiWiki/Plugin/rename.pm:347
+#: ../IkiWiki/Plugin/rename.pm:352
 #, perl-format
 msgid "rename %s to %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/rename.pm:571
+#: ../IkiWiki/Plugin/rename.pm:576
 #, fuzzy, perl-format
 msgid "update for rename of %s to %s"
 msgstr "%s નો સુધારો %s નાં %s વડે"
@@ -865,28 +887,28 @@ msgstr "%s વાંચવામાં નિષ્ફળ: %s"
 msgid "rsync_command exited %d"
 msgstr ""
 
-#: ../IkiWiki/Plugin/search.pm:182
+#: ../IkiWiki/Plugin/search.pm:194
 #, perl-format
 msgid "need Digest::SHA1 to index %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/search.pm:217
+#: ../IkiWiki/Plugin/search.pm:231
 msgid "search"
 msgstr ""
 
-#: ../IkiWiki/Plugin/shortcut.pm:31
+#: ../IkiWiki/Plugin/shortcut.pm:32
 #, perl-format
 msgid "shortcut plugin will not work without %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/shortcut.pm:44
+#: ../IkiWiki/Plugin/shortcut.pm:45
 msgid "missing name or url parameter"
 msgstr "ખોવાયેલ નામ અથવા યુઆરએલ વિકલ્પ"
 
 #. translators: This is used to display what shortcuts are defined.
 #. translators: First parameter is the name of the shortcut, the second
 #. translators: is an URL.
-#: ../IkiWiki/Plugin/shortcut.pm:54
+#: ../IkiWiki/Plugin/shortcut.pm:55
 #, perl-format
 msgid "shortcut %s points to <i>%s</i>"
 msgstr "ટુંકોરસ્તો %s એ <i>%s</i> નો નિર્દેશ કરે છે"
@@ -895,119 +917,122 @@ msgstr "ટુંકોરસ્તો %s એ <i>%s</i> નો નિર્દ
 msgid "failed to parse any smileys"
 msgstr "કોઇપણ સ્માઇલીઓ ઉકેલવામાં નિષ્ફળ"
 
-#: ../IkiWiki/Plugin/sparkline.pm:72
+#: ../IkiWiki/Plugin/sparkline.pm:73
 msgid "parse error"
 msgstr "ઉકેલવામાં ક્ષતિ"
 
-#: ../IkiWiki/Plugin/sparkline.pm:78
+#: ../IkiWiki/Plugin/sparkline.pm:79
 #, fuzzy
 msgid "invalid featurepoint diameter"
 msgstr "ખરાબ લાક્ષણિકબિંદુ વ્યાસ"
 
-#: ../IkiWiki/Plugin/sparkline.pm:88
+#: ../IkiWiki/Plugin/sparkline.pm:89
 #, fuzzy
 msgid "invalid featurepoint location"
 msgstr "ખરાબ લાક્ષણિકબિંદુ સ્થિતિ"
 
-#: ../IkiWiki/Plugin/sparkline.pm:99
+#: ../IkiWiki/Plugin/sparkline.pm:100
 msgid "missing values"
 msgstr "ખોવાયેલ કિંમતો"
 
-#: ../IkiWiki/Plugin/sparkline.pm:104
+#: ../IkiWiki/Plugin/sparkline.pm:105
 #, fuzzy
 msgid "invalid height value"
 msgstr "ખરાબ ઉંચાઇ કિંમત"
 
-#: ../IkiWiki/Plugin/sparkline.pm:111
+#: ../IkiWiki/Plugin/sparkline.pm:112
 msgid "missing width parameter"
 msgstr "ખોવાયેલ પહોળાઇ વિકલ્પ"
 
-#: ../IkiWiki/Plugin/sparkline.pm:115
+#: ../IkiWiki/Plugin/sparkline.pm:116
 #, fuzzy
 msgid "invalid width value"
 msgstr "ખરાબ પહોળાઇ કિંમત"
 
-#: ../IkiWiki/Plugin/sparkline.pm:153
+#: ../IkiWiki/Plugin/sparkline.pm:154
 msgid "failed to run php"
 msgstr "php ચલાવવામાં નિષ્ફળ"
 
-#: ../IkiWiki/Plugin/table.pm:31
+#: ../IkiWiki/Plugin/table.pm:32
 msgid "cannot find file"
 msgstr "ફાઇલ મળી શકી નહી"
 
-#: ../IkiWiki/Plugin/table.pm:87
+#: ../IkiWiki/Plugin/table.pm:88
 msgid "unknown data format"
 msgstr "અજાણ્યો માહિતી પ્રકાર"
 
-#: ../IkiWiki/Plugin/table.pm:95
+#: ../IkiWiki/Plugin/table.pm:96
 msgid "empty data"
 msgstr "ખાલી માહિતી"
 
-#: ../IkiWiki/Plugin/table.pm:114
+#: ../IkiWiki/Plugin/table.pm:115
 msgid "Direct data download"
 msgstr "સીધી માહિતી ડાઉનલોડ"
 
-#: ../IkiWiki/Plugin/table.pm:148
+#: ../IkiWiki/Plugin/table.pm:149
 #, perl-format
 msgid "parse fail at line %d: %s"
 msgstr "ઉકેલવાનું લીટી %d પર નિષ્ફળ: %s"
 
-#: ../IkiWiki/Plugin/template.pm:29
+#: ../IkiWiki/Plugin/tag.pm:83
+#, fuzzy, perl-format
+msgid "creating tag page %s"
+msgstr "નવું પાનું %s બનાવે છે"
+
+#: ../IkiWiki/Plugin/template.pm:33
 msgid "missing id parameter"
 msgstr "ખોવાયેલ આઇડી વિકલ્પ"
 
-#: ../IkiWiki/Plugin/template.pm:36
+#: ../IkiWiki/Plugin/template.pm:47
 #, perl-format
-msgid "template %s not found"
+msgid "%s not found"
 msgstr "ટેમ્પલેટ %s મળ્યું નહી"
 
-#: ../IkiWiki/Plugin/template.pm:55
-msgid "failed to process:"
-msgstr "ક્રિયા કરવામાં નિષ્ફળ:"
-
-#: ../IkiWiki/Plugin/teximg.pm:70
+#: ../IkiWiki/Plugin/teximg.pm:72
 #, fuzzy
 msgid "missing tex code"
 msgstr "ખોવાયેલ કિંમતો"
 
-#: ../IkiWiki/Plugin/teximg.pm:122
+#: ../IkiWiki/Plugin/teximg.pm:124
 #, fuzzy
 msgid "failed to generate image from code"
 msgstr "માપ બદલવામાં નિષ્ફળ: %s"
 
-#: ../IkiWiki/Plugin/websetup.pm:89
-msgid "plugin"
+#: ../IkiWiki/Plugin/websetup.pm:105
+#, perl-format
+msgid "%s plugin:"
 msgstr ""
 
-#: ../IkiWiki/Plugin/websetup.pm:108
+#: ../IkiWiki/Plugin/websetup.pm:121
+#, perl-format
+msgid "%s plugins"
+msgstr ""
+
+#: ../IkiWiki/Plugin/websetup.pm:135
 #, perl-format
 msgid "enable %s?"
 msgstr ""
 
-#: ../IkiWiki/Plugin/websetup.pm:240
+#: ../IkiWiki/Plugin/websetup.pm:276
 msgid "setup file for this wiki is not known"
 msgstr ""
 
-#: ../IkiWiki/Plugin/websetup.pm:256
+#: ../IkiWiki/Plugin/websetup.pm:292
 msgid "main"
 msgstr ""
 
-#: ../IkiWiki/Plugin/websetup.pm:257
-msgid "plugins"
-msgstr ""
-
-#: ../IkiWiki/Plugin/websetup.pm:395
+#: ../IkiWiki/Plugin/websetup.pm:435
 msgid ""
 "The configuration changes shown below require a wiki rebuild to take effect."
 msgstr ""
 
-#: ../IkiWiki/Plugin/websetup.pm:399
+#: ../IkiWiki/Plugin/websetup.pm:439
 msgid ""
 "For the configuration changes shown below to fully take effect, you may need "
 "to rebuild the wiki."
 msgstr ""
 
-#: ../IkiWiki/Plugin/websetup.pm:436
+#: ../IkiWiki/Plugin/websetup.pm:476
 #, perl-format
 msgid "Error: %s exited nonzero (%s). Discarding setup changes."
 msgstr ""
@@ -1022,79 +1047,94 @@ msgstr ""
 msgid "bad file name %s"
 msgstr "ખરાબ ફાઇલ નામ છોડી દે છે %s"
 
-#: ../IkiWiki/Render.pm:150
+#: ../IkiWiki/Render.pm:158
 #, perl-format
 msgid "scanning %s"
 msgstr "%s શોધે છે"
 
-#: ../IkiWiki/Render.pm:271
+#: ../IkiWiki/Render.pm:280
 #, perl-format
 msgid ""
 "symlink found in srcdir path (%s) -- set allow_symlinks_before_srcdir to "
 "allow this"
 msgstr ""
 
-#: ../IkiWiki/Render.pm:300 ../IkiWiki/Render.pm:327
+#: ../IkiWiki/Render.pm:311
 #, perl-format
 msgid "skipping bad filename %s"
 msgstr "ખરાબ ફાઇલ નામ છોડી દે છે %s"
 
-#: ../IkiWiki/Render.pm:305
+#: ../IkiWiki/Render.pm:327
 #, perl-format
 msgid "%s has multiple possible source pages"
 msgstr ""
 
-#: ../IkiWiki/Render.pm:395
+#: ../IkiWiki/Render.pm:369
 #, perl-format
-msgid "removing old page %s"
+msgid "querying %s for file creation and modification times.."
+msgstr ""
+
+#: ../IkiWiki/Render.pm:431
+#, fuzzy, perl-format
+msgid "removing obsolete %s"
 msgstr "જુનાં પાનાં દૂર કરે છે %s"
 
-#: ../IkiWiki/Render.pm:471
+#: ../IkiWiki/Render.pm:505
 #, fuzzy, perl-format
 msgid "building %s, which links to %s"
 msgstr "રેન્ડર કરે છે %s, જે %s સાથે જોડાણ ધરાવે છે"
 
-#: ../IkiWiki/Render.pm:480
+#: ../IkiWiki/Render.pm:514
 #, fuzzy, perl-format
 msgid "removing %s, no longer built by %s"
 msgstr "દૂર કરે છે %s, હવે %s વડે રેન્ડર કરાતું નથી"
 
-#: ../IkiWiki/Render.pm:603
+#: ../IkiWiki/Render.pm:597 ../IkiWiki/Render.pm:679
 #, fuzzy, perl-format
 msgid "building %s, which depends on %s"
 msgstr "રેન્ડર કરે છે %s, જે %s પર આધારિત છે"
 
-#: ../IkiWiki/Render.pm:616
+#: ../IkiWiki/Render.pm:692
 #, fuzzy, perl-format
 msgid "building %s, to update its backlinks"
 msgstr "રેન્ડર કરે છે %s, તેનાં પાછળનાં જોડાણો સુધારવા માટે"
 
-#: ../IkiWiki/Render.pm:679
+#: ../IkiWiki/Render.pm:821
 #, fuzzy, perl-format
 msgid "ikiwiki: cannot build %s"
 msgstr "ikiwiki: %s રેન્ડર કરી શકાતું નથી"
 
 #. translators: The first parameter is a filename, and the second
 #. translators: is a (probably not translated) error message.
-#: ../IkiWiki/Setup.pm:19
+#: ../IkiWiki/Setup.pm:23
 #, perl-format
 msgid "cannot read %s: %s"
 msgstr "વાંચી શકાતી નથી %s: %s"
 
-#: ../IkiWiki/Setup/Automator.pm:33
+#: ../IkiWiki/Setup.pm:34
+#, fuzzy, perl-format
+msgid "cannot load %s in safe mode"
+msgstr "વાંચી શકાતી નથી %s: %s"
+
+#: ../IkiWiki/Setup.pm:47
+#, fuzzy, perl-format
+msgid "failed to parse %s"
+msgstr "%s કમ્પાઇલ કરવામાં નિષ્ફળ"
+
+#: ../IkiWiki/Setup/Automator.pm:34
 msgid "you must enter a wikiname (that contains alphanumerics)"
 msgstr ""
 
-#: ../IkiWiki/Setup/Automator.pm:76
+#: ../IkiWiki/Setup/Automator.pm:89
 #, perl-format
 msgid "unsupported revision control system %s"
 msgstr ""
 
-#: ../IkiWiki/Setup/Automator.pm:102
+#: ../IkiWiki/Setup/Automator.pm:115
 msgid "failed to set up the repository with ikiwiki-makerepo"
 msgstr ""
 
-#: ../IkiWiki/Setup/Automator.pm:120
+#: ../IkiWiki/Setup/Automator.pm:134
 #, perl-format
 msgid "** Disabling plugin %s, since it is failing with this message:"
 msgstr ""
@@ -1113,13 +1153,13 @@ msgid "wrapper filename not specified"
 msgstr "આવરણ ફાઇલનામ સ્પષ્ટ કરેલ નથી"
 
 #. translators: The parameter is a C filename.
-#: ../IkiWiki/Wrapper.pm:149
+#: ../IkiWiki/Wrapper.pm:160
 #, perl-format
 msgid "failed to compile %s"
 msgstr "%s કમ્પાઇલ કરવામાં નિષ્ફળ"
 
 #. translators: The parameter is a filename.
-#: ../IkiWiki/Wrapper.pm:169
+#: ../IkiWiki/Wrapper.pm:180
 #, perl-format
 msgid "successfully generated %s"
 msgstr "સફળતાપૂર્વક પેદા કરેલ છે %s"
@@ -1132,58 +1172,63 @@ msgstr "ઉપયોગ: ikiwiki [વિકલ્પો] source dest"
 msgid "       ikiwiki --setup configfile"
 msgstr ""
 
-#: ../ikiwiki.in:91
+#: ../ikiwiki.in:96
 msgid "usage: --set var=value"
 msgstr ""
 
-#: ../ikiwiki.in:140
+#: ../ikiwiki.in:103
+msgid "usage: --set-yaml var=value"
+msgstr ""
+
+#: ../ikiwiki.in:157
 msgid "generating wrappers.."
 msgstr "આવરણ બનાવે છે.."
 
-#: ../ikiwiki.in:195
+#: ../ikiwiki.in:220
 msgid "rebuilding wiki.."
 msgstr "વીકી ફરીથી બનાવે છે.."
 
-#: ../ikiwiki.in:198
+#: ../ikiwiki.in:223
 msgid "refreshing wiki.."
 msgstr "વીકીને તાજી કરે છે.."
 
-#: ../IkiWiki.pm:238
+#: ../IkiWiki.pm:232
 msgid "Discussion"
 msgstr "ચર્ચા"
 
-#: ../IkiWiki.pm:507
+#: ../IkiWiki.pm:531
 msgid "Must specify url to wiki with --url when using --cgi"
 msgstr "જ્યારે --cgi ઉપયોગ કરતાં હોય ત્યારે વીકીનું યુઆરએલ સ્પષ્ટ કરવું જ પડશે"
 
-#: ../IkiWiki.pm:553
+#: ../IkiWiki.pm:577
 msgid "cannot use multiple rcs plugins"
 msgstr ""
 
-#: ../IkiWiki.pm:582
+#: ../IkiWiki.pm:606
 #, perl-format
 msgid "failed to load external plugin needed for %s plugin: %s"
 msgstr ""
 
-#: ../IkiWiki.pm:1264
+#: ../IkiWiki.pm:1298
 #, fuzzy, perl-format
 msgid "preprocessing loop detected on %s at depth %i"
 msgstr "%s પર શોધાયેલ લુપ  %s પર ચલાવે છે %i ઉંડાણ પર"
 
-#: ../IkiWiki.pm:1863
+#: ../IkiWiki.pm:1993
 msgid "yes"
 msgstr ""
 
-#: ../IkiWiki.pm:2006
-msgid "Sort::Naturally needed for title_natural sort"
-msgstr ""
+#: ../IkiWiki.pm:2070
+#, fuzzy, perl-format
+msgid "invalid sort type %s"
+msgstr "અજાણ્યો ગોઠવણી પ્રકાર %s"
 
-#: ../IkiWiki.pm:2017
+#: ../IkiWiki.pm:2091
 #, perl-format
 msgid "unknown sort type %s"
 msgstr "અજાણ્યો ગોઠવણી પ્રકાર %s"
 
-#: ../IkiWiki.pm:2036
+#: ../IkiWiki.pm:2227
 #, fuzzy, perl-format
 msgid "cannot match pages: %s"
 msgstr "વાંચી શકાતી નથી %s: %s"
@@ -1208,6 +1253,26 @@ msgstr ""
 msgid "What is the domain name of the web server?"
 msgstr ""
 
+#~ msgid "You need to log in first."
+#~ msgstr "તમારે પ્રથમ લોગ ઇન થવું પડશે."
+
+#~ msgid "Get an OpenID"
+#~ msgstr "ઓપનઆઇડી મેળવો"
+
+#, fuzzy
+#~ msgid "failed to process"
+#~ msgstr "ક્રિયા કરવામાં નિષ્ફળ:"
+
+#~ msgid "nonexistant template %s"
+#~ msgstr "અસ્તિત્વમાં ન હોય તેવું ટેમ્પલેટ %s"
+
+#~ msgid "getctime not implemented"
+#~ msgstr "getctime અમલમાં મૂકાયેલ નથી"
+
+#, fuzzy
+#~ msgid "failed to read %s"
+#~ msgstr "%s વાંચવામાં નિષ્ફળ: %s"
+
 #~ msgid "discussion"
 #~ msgstr "ચર્ચા"
 
@@ -1257,9 +1322,6 @@ msgstr ""
 #~ msgstr ""
 #~ "REV ગોઠવેલ નથી, svn post-commit hook માંથી ચાલતું નથી, નોંધ મોકલી શકાશે નહી"
 
-#~ msgid "%s not found"
-#~ msgstr "ટેમ્પલેટ %s મળ્યું નહી"
-
 #~ msgid "What's this?"
 #~ msgstr "આ શું છે?"
 
index 38a464141b0597383ba404d2a3370c05d029c413..e50fa0f68ff4ba13f385074f6876f4b46d2884b2 100644 (file)
@@ -8,53 +8,51 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-01-02 21:47-0500\n"
+"POT-Creation-Date: 2010-06-23 17:10-0400\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"
+"Language: \n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=CHARSET\n"
 "Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
 
-#: ../IkiWiki/CGI.pm:114
-msgid "You need to log in first."
-msgstr ""
-
-#: ../IkiWiki/CGI.pm:147
+#: ../IkiWiki/CGI.pm:162
 msgid ""
 "probable misconfiguration: sslcookie is set, but you are attempting to login "
 "via http, not https"
 msgstr ""
 
-#: ../IkiWiki/CGI.pm:150
+#: ../IkiWiki/CGI.pm:165
 msgid "login failed, perhaps you need to turn on cookies?"
 msgstr ""
 
-#: ../IkiWiki/CGI.pm:169 ../IkiWiki/CGI.pm:318
+#: ../IkiWiki/CGI.pm:184 ../IkiWiki/CGI.pm:335
 msgid "Your login session has expired."
 msgstr ""
 
-#: ../IkiWiki/CGI.pm:190
+#: ../IkiWiki/CGI.pm:205
 msgid "Login"
 msgstr ""
 
-#: ../IkiWiki/CGI.pm:191
+#: ../IkiWiki/CGI.pm:206
 msgid "Preferences"
 msgstr ""
 
-#: ../IkiWiki/CGI.pm:192
+#: ../IkiWiki/CGI.pm:207
 msgid "Admin"
 msgstr ""
 
-#: ../IkiWiki/CGI.pm:232
+#: ../IkiWiki/CGI.pm:247
 msgid "Preferences saved."
 msgstr ""
 
-#: ../IkiWiki/CGI.pm:282
+#: ../IkiWiki/CGI.pm:299
 msgid "You are banned."
 msgstr ""
 
-#: ../IkiWiki/CGI.pm:409 ../IkiWiki/CGI.pm:410 ../IkiWiki.pm:1281
+#: ../IkiWiki/CGI.pm:426 ../IkiWiki/CGI.pm:427 ../IkiWiki.pm:1317
 msgid "Error"
 msgstr ""
 
@@ -135,7 +133,7 @@ msgstr ""
 msgid "deleting bucket.."
 msgstr ""
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:206
+#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:231
 msgid "done"
 msgstr ""
 
@@ -144,40 +142,40 @@ msgstr ""
 msgid "Must specify %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:136
+#: ../IkiWiki/Plugin/amazon_s3.pm:140
 msgid "Failed to create S3 bucket: "
 msgstr ""
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:221
+#: ../IkiWiki/Plugin/amazon_s3.pm:225
 msgid "Failed to save file to S3: "
 msgstr ""
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:243
+#: ../IkiWiki/Plugin/amazon_s3.pm:247
 msgid "Failed to delete file from S3: "
 msgstr ""
 
-#: ../IkiWiki/Plugin/attachment.pm:49
+#: ../IkiWiki/Plugin/attachment.pm:50
 #, perl-format
 msgid "there is already a page named %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/attachment.pm:65
+#: ../IkiWiki/Plugin/attachment.pm:66
 msgid "prohibited by allowed_attachments"
 msgstr ""
 
-#: ../IkiWiki/Plugin/attachment.pm:140
+#: ../IkiWiki/Plugin/attachment.pm:144
 msgid "bad attachment filename"
 msgstr ""
 
-#: ../IkiWiki/Plugin/attachment.pm:182
+#: ../IkiWiki/Plugin/attachment.pm:188
 msgid "attachment upload"
 msgstr ""
 
-#: ../IkiWiki/Plugin/autoindex.pm:105
+#: ../IkiWiki/Plugin/autoindex.pm:120
 msgid "automatic index generation"
 msgstr ""
 
-#: ../IkiWiki/Plugin/blogspam.pm:108
+#: ../IkiWiki/Plugin/blogspam.pm:110
 msgid ""
 "Sorry, but that looks like spam to <a href=\"http://blogspam.net/"
 "\">blogspam</a>: "
@@ -192,192 +190,212 @@ msgstr ""
 msgid "There are no broken links!"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:124 ../IkiWiki/Plugin/format.pm:38
+#: ../IkiWiki/Plugin/comments.pm:112
+#, perl-format
+msgid "this comment needs %s"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:115
+msgid "moderation"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:136 ../IkiWiki/Plugin/format.pm:48
 #, perl-format
 msgid "unsupported page format %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:129
+#: ../IkiWiki/Plugin/comments.pm:141
 msgid "comment must have content"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:185
+#: ../IkiWiki/Plugin/comments.pm:196
 msgid "Anonymous"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:340 ../IkiWiki/Plugin/editpage.pm:97
+#: ../IkiWiki/Plugin/comments.pm:357 ../IkiWiki/Plugin/editpage.pm:98
 msgid "bad page name"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:345
+#: ../IkiWiki/Plugin/comments.pm:362
 #, perl-format
 msgid "commenting on %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:363
+#: ../IkiWiki/Plugin/comments.pm:380
 #, perl-format
 msgid "page '%s' doesn't exist, so you can't comment"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:370
+#: ../IkiWiki/Plugin/comments.pm:387
 #, perl-format
 msgid "comments on page '%s' are closed"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:467
+#: ../IkiWiki/Plugin/comments.pm:491
 msgid "comment stored for moderation"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:469
+#: ../IkiWiki/Plugin/comments.pm:493
 msgid "Your comment will be posted after moderator review"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:482
+#: ../IkiWiki/Plugin/comments.pm:506
 msgid "Added a comment"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:486
+#: ../IkiWiki/Plugin/comments.pm:510
 #, perl-format
 msgid "Added a comment: %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:528 ../IkiWiki/Plugin/websetup.pm:236
+#: ../IkiWiki/Plugin/comments.pm:554 ../IkiWiki/Plugin/websetup.pm:268
 msgid "you are not logged in as an admin"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:579
+#: ../IkiWiki/Plugin/comments.pm:605
 msgid "Comment moderation"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:618
+#: ../IkiWiki/Plugin/comments.pm:645
 msgid "comment moderation"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:769
-msgid "Comments"
+#: ../IkiWiki/Plugin/comments.pm:802
+#, perl-format
+msgid "%i comment"
+msgid_plural "%i comments"
+msgstr[0] ""
+msgstr[1] ""
+
+#. translators: Here "Comment" is a verb;
+#. translators: the user clicks on it to
+#. translators: post a comment.
+#: ../IkiWiki/Plugin/comments.pm:812
+msgid "Comment"
 msgstr ""
 
-#: ../IkiWiki/Plugin/conditional.pm:27 ../IkiWiki/Plugin/cutpaste.pm:30
-#: ../IkiWiki/Plugin/cutpaste.pm:45 ../IkiWiki/Plugin/cutpaste.pm:61
+#: ../IkiWiki/Plugin/conditional.pm:28 ../IkiWiki/Plugin/cutpaste.pm:31
+#: ../IkiWiki/Plugin/cutpaste.pm:46 ../IkiWiki/Plugin/cutpaste.pm:62
 #: ../IkiWiki/Plugin/testpagespec.pm:26
 #, perl-format
 msgid "%s parameter is required"
 msgstr ""
 
-#: ../IkiWiki/Plugin/cutpaste.pm:66
+#: ../IkiWiki/Plugin/cutpaste.pm:67
 msgid "no text was copied in this page"
 msgstr ""
 
-#: ../IkiWiki/Plugin/cutpaste.pm:69
+#: ../IkiWiki/Plugin/cutpaste.pm:70
 #, perl-format
 msgid "no text was copied in this page with id %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/editpage.pm:40
+#: ../IkiWiki/Plugin/editpage.pm:41
 #, perl-format
 msgid "removing old preview %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/editpage.pm:113
+#: ../IkiWiki/Plugin/editpage.pm:114
 #, perl-format
 msgid "%s is not an editable page"
 msgstr ""
 
-#: ../IkiWiki/Plugin/editpage.pm:292
+#: ../IkiWiki/Plugin/editpage.pm:294
 #, perl-format
 msgid "creating %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/editpage.pm:310 ../IkiWiki/Plugin/editpage.pm:329
-#: ../IkiWiki/Plugin/editpage.pm:339 ../IkiWiki/Plugin/editpage.pm:383
-#: ../IkiWiki/Plugin/editpage.pm:422
+#: ../IkiWiki/Plugin/editpage.pm:312 ../IkiWiki/Plugin/editpage.pm:332
+#: ../IkiWiki/Plugin/editpage.pm:343 ../IkiWiki/Plugin/editpage.pm:388
+#: ../IkiWiki/Plugin/editpage.pm:430
 #, perl-format
 msgid "editing %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/edittemplate.pm:51
+#: ../IkiWiki/Plugin/edittemplate.pm:52
 msgid "template not specified"
 msgstr ""
 
-#: ../IkiWiki/Plugin/edittemplate.pm:54
+#: ../IkiWiki/Plugin/edittemplate.pm:55
 msgid "match not specified"
 msgstr ""
 
-#: ../IkiWiki/Plugin/edittemplate.pm:63
+#: ../IkiWiki/Plugin/edittemplate.pm:70
 #, perl-format
 msgid "edittemplate %s registered for %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/edittemplate.pm:137
-msgid "failed to process"
+#: ../IkiWiki/Plugin/edittemplate.pm:131 ../IkiWiki/Plugin/inline.pm:339
+#: ../IkiWiki/Plugin/template.pm:44
+msgid "failed to process template:"
 msgstr ""
 
-#: ../IkiWiki/Plugin/format.pm:20
+#: ../IkiWiki/Plugin/format.pm:30
 msgid "must specify format and text"
 msgstr ""
 
-#: ../IkiWiki/Plugin/fortune.pm:27
+#: ../IkiWiki/Plugin/fortune.pm:28
 msgid "fortune failed"
 msgstr ""
 
-#: ../IkiWiki/Plugin/getsource.pm:63 ../IkiWiki/Plugin/goto.pm:56
+#: ../IkiWiki/Plugin/getsource.pm:64 ../IkiWiki/Plugin/goto.pm:58
 msgid "missing page"
 msgstr ""
 
-#: ../IkiWiki/Plugin/getsource.pm:65 ../IkiWiki/Plugin/goto.pm:58
+#: ../IkiWiki/Plugin/getsource.pm:66 ../IkiWiki/Plugin/goto.pm:60
 #, perl-format
 msgid "The page %s does not exist."
 msgstr ""
 
-#: ../IkiWiki/Plugin/getsource.pm:74
+#: ../IkiWiki/Plugin/getsource.pm:75
 msgid "not a page"
 msgstr ""
 
-#: ../IkiWiki/Plugin/getsource.pm:76
+#: ../IkiWiki/Plugin/getsource.pm:77
 #, perl-format
 msgid "%s is an attachment, not a page."
 msgstr ""
 
-#: ../IkiWiki/Plugin/git.pm:651 ../IkiWiki/Plugin/git.pm:669
-#: ../IkiWiki/Receive.pm:130
+#: ../IkiWiki/Plugin/git.pm:724 ../IkiWiki/Plugin/git.pm:742
+#: ../IkiWiki/Receive.pm:129
 #, perl-format
 msgid "you are not allowed to change %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/git.pm:691
+#: ../IkiWiki/Plugin/git.pm:764
 #, perl-format
 msgid "you cannot act on a file with mode %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/git.pm:695
+#: ../IkiWiki/Plugin/git.pm:768
 msgid "you are not allowed to change file modes"
 msgstr ""
 
-#: ../IkiWiki/Plugin/google.pm:25 ../IkiWiki/Plugin/po.pm:131
-#: ../IkiWiki/Plugin/search.pm:36
+#: ../IkiWiki/Plugin/google.pm:26 ../IkiWiki/Plugin/po.pm:134
+#: ../IkiWiki/Plugin/search.pm:37
 #, perl-format
 msgid "Must specify %s when using the %s plugin"
 msgstr ""
 
-#: ../IkiWiki/Plugin/graphviz.pm:67
+#: ../IkiWiki/Plugin/graphviz.pm:68
 msgid "failed to run graphviz"
 msgstr ""
 
-#: ../IkiWiki/Plugin/graphviz.pm:94
+#: ../IkiWiki/Plugin/graphviz.pm:91
 msgid "prog not a valid graphviz program"
 msgstr ""
 
-#: ../IkiWiki/Plugin/highlight.pm:47
+#: ../IkiWiki/Plugin/highlight.pm:48
 #, perl-format
 msgid "tohighlight contains unknown file type '%s'"
 msgstr ""
 
-#: ../IkiWiki/Plugin/highlight.pm:58
+#: ../IkiWiki/Plugin/highlight.pm:59
 #, perl-format
 msgid "Source code: %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/highlight.pm:123
+#: ../IkiWiki/Plugin/highlight.pm:124
 msgid ""
 "warning: highlight perl module not available; falling back to pass through"
 msgstr ""
@@ -386,100 +404,108 @@ msgstr ""
 msgid "htmltidy failed to parse this html"
 msgstr ""
 
-#: ../IkiWiki/Plugin/img.pm:64
+#: ../IkiWiki/Plugin/img.pm:69
 msgid "Image::Magick is not installed"
 msgstr ""
 
-#: ../IkiWiki/Plugin/img.pm:68 ../IkiWiki/Plugin/img.pm:112
+#: ../IkiWiki/Plugin/img.pm:73 ../IkiWiki/Plugin/img.pm:117
 #, perl-format
 msgid "failed to read %s: %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/img.pm:74
+#: ../IkiWiki/Plugin/img.pm:79
 #, perl-format
 msgid "wrong size format \"%s\" (should be WxH)"
 msgstr ""
 
-#: ../IkiWiki/Plugin/img.pm:120
+#: ../IkiWiki/Plugin/img.pm:122
 #, perl-format
 msgid "failed to resize: %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/img.pm:140
+#: ../IkiWiki/Plugin/img.pm:146
 #, perl-format
 msgid "failed to determine size of image %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/inline.pm:92
+#: ../IkiWiki/Plugin/inline.pm:93
 msgid "Must specify url to wiki with --url when using --rss or --atom"
 msgstr ""
 
-#: ../IkiWiki/Plugin/inline.pm:138
+#: ../IkiWiki/Plugin/inline.pm:139
 msgid "page editing not allowed"
 msgstr ""
 
-#: ../IkiWiki/Plugin/inline.pm:155
+#: ../IkiWiki/Plugin/inline.pm:156
 msgid "missing pages parameter"
 msgstr ""
 
-#: ../IkiWiki/Plugin/inline.pm:191
+#: ../IkiWiki/Plugin/inline.pm:192
 #, perl-format
 msgid "the %s and %s parameters cannot be used together"
 msgstr ""
 
-#: ../IkiWiki/Plugin/inline.pm:312
+#: ../IkiWiki/Plugin/inline.pm:313
 msgid "Add a new post titled:"
 msgstr ""
 
-#: ../IkiWiki/Plugin/inline.pm:332
+#: ../IkiWiki/Plugin/inline.pm:342
 #, perl-format
-msgid "nonexistant template %s"
+msgid "template %s not found"
 msgstr ""
 
-#: ../IkiWiki/Plugin/inline.pm:621
+#: ../IkiWiki/Plugin/inline.pm:633
 msgid "RPC::XML::Client not found, not pinging"
 msgstr ""
 
-#: ../IkiWiki/Plugin/linkmap.pm:102 ../IkiWiki/Plugin/linkmap.pm:109
-#: ../IkiWiki/Plugin/linkmap.pm:113 ../IkiWiki/Plugin/linkmap.pm:116
+#: ../IkiWiki/Plugin/linkmap.pm:81 ../IkiWiki/Plugin/linkmap.pm:88
+#: ../IkiWiki/Plugin/linkmap.pm:92 ../IkiWiki/Plugin/linkmap.pm:95
 msgid "failed to run dot"
 msgstr ""
 
-#: ../IkiWiki/Plugin/lockedit.pm:47
+#: ../IkiWiki/Plugin/linkmap.pm:85
+msgid "linkmap"
+msgstr ""
+
+#: ../IkiWiki/Plugin/lockedit.pm:49
 #, perl-format
 msgid "%s is locked and cannot be edited"
 msgstr ""
 
-#: ../IkiWiki/Plugin/mdwn.pm:44
+#: ../IkiWiki/Plugin/mdwn.pm:45
 msgid "multimarkdown is enabled, but Text::MultiMarkdown is not installed"
 msgstr ""
 
-#: ../IkiWiki/Plugin/mdwn.pm:69
+#: ../IkiWiki/Plugin/mdwn.pm:70
 #, perl-format
 msgid "failed to load Markdown.pm perl module (%s) or /usr/bin/markdown (%s)"
 msgstr ""
 
-#: ../IkiWiki/Plugin/meta.pm:161
+#: ../IkiWiki/Plugin/meta.pm:174
 msgid "stylesheet not found"
 msgstr ""
 
-#: ../IkiWiki/Plugin/meta.pm:199
+#: ../IkiWiki/Plugin/meta.pm:212
 msgid "redir page not found"
 msgstr ""
 
-#: ../IkiWiki/Plugin/meta.pm:213
+#: ../IkiWiki/Plugin/meta.pm:226
 msgid "redir cycle is not allowed"
 msgstr ""
 
-#: ../IkiWiki/Plugin/mirrorlist.pm:43
+#: ../IkiWiki/Plugin/meta.pm:387
+msgid "sort=meta requires a parameter"
+msgstr ""
+
+#: ../IkiWiki/Plugin/mirrorlist.pm:44
 msgid "Mirrors"
 msgstr ""
 
-#: ../IkiWiki/Plugin/mirrorlist.pm:43
+#: ../IkiWiki/Plugin/mirrorlist.pm:44
 msgid "Mirror"
 msgstr ""
 
-#: ../IkiWiki/Plugin/moderatedcomments.pm:41
+#: ../IkiWiki/Plugin/moderatedcomments.pm:57
 msgid "comment needs moderation"
 msgstr ""
 
@@ -487,51 +513,52 @@ msgstr ""
 msgid "more"
 msgstr ""
 
-#: ../IkiWiki/Plugin/norcs.pm:65
-msgid "getctime not implemented"
+#: ../IkiWiki/Plugin/openid.pm:70
+#, perl-format
+msgid "failed to load openid module: "
 msgstr ""
 
-#: ../IkiWiki/Plugin/openid.pm:61
-msgid "Log in with"
+#: ../IkiWiki/Plugin/orphans.pm:56
+msgid "All pages have other pages linking to them."
 msgstr ""
 
-#: ../IkiWiki/Plugin/openid.pm:64
-msgid "Get an OpenID"
+#: ../IkiWiki/Plugin/pagetemplate.pm:30
+msgid "bad or missing template"
 msgstr ""
 
-#: ../IkiWiki/Plugin/orphans.pm:55
-msgid "All pages have other pages linking to them."
+#: ../IkiWiki/Plugin/passwordauth.pm:231
+msgid "Your user page: "
 msgstr ""
 
-#: ../IkiWiki/Plugin/pagetemplate.pm:30
-msgid "bad or missing template"
+#: ../IkiWiki/Plugin/passwordauth.pm:238
+msgid "Create your user page"
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:248
+#: ../IkiWiki/Plugin/passwordauth.pm:268
 msgid "Account creation successful. Now you can Login."
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:251
+#: ../IkiWiki/Plugin/passwordauth.pm:271
 msgid "Error creating account."
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:258
+#: ../IkiWiki/Plugin/passwordauth.pm:278
 msgid "No email address, so cannot email password reset instructions."
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:292
+#: ../IkiWiki/Plugin/passwordauth.pm:312
 msgid "Failed to send mail"
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:294
+#: ../IkiWiki/Plugin/passwordauth.pm:314
 msgid "You have been mailed password reset instructions."
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:329
+#: ../IkiWiki/Plugin/passwordauth.pm:349
 msgid "incorrect password reset url"
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:332
+#: ../IkiWiki/Plugin/passwordauth.pm:352
 msgid "password reset denied"
 msgstr ""
 
@@ -561,122 +588,117 @@ msgstr ""
 msgid "warning: Old po4a detected! Recommend upgrade to 0.35."
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:138
+#: ../IkiWiki/Plugin/po.pm:142
 #, perl-format
 msgid "%s is not a valid language code"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:150
+#: ../IkiWiki/Plugin/po.pm:154
 #, perl-format
 msgid ""
 "%s is not a valid value for po_link_to, falling back to po_link_to=default"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:155
+#: ../IkiWiki/Plugin/po.pm:159
 msgid ""
 "po_link_to=negotiated requires usedirs to be enabled, falling back to "
 "po_link_to=default"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:385
+#: ../IkiWiki/Plugin/po.pm:390
 #, perl-format
 msgid "rebuilding all pages to fix meta titles"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:389 ../IkiWiki/Render.pm:652
+#: ../IkiWiki/Plugin/po.pm:394 ../IkiWiki/Render.pm:784
 #, perl-format
 msgid "building %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:427
+#: ../IkiWiki/Plugin/po.pm:432
 msgid "updated PO files"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:451
+#: ../IkiWiki/Plugin/po.pm:455
 msgid ""
 "Can not remove a translation. If the master page is removed, however, its "
 "translations will be removed as well."
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:471
+#: ../IkiWiki/Plugin/po.pm:475
 msgid ""
 "Can not rename a translation. If the master page is renamed, however, its "
 "translations will be renamed as well."
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:870
+#: ../IkiWiki/Plugin/po.pm:875
 #, perl-format
 msgid "POT file (%s) does not exist"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:884
+#: ../IkiWiki/Plugin/po.pm:889
 #, perl-format
 msgid "failed to copy underlay PO file to %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:893
+#: ../IkiWiki/Plugin/po.pm:898
 #, perl-format
 msgid "failed to update %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:899
+#: ../IkiWiki/Plugin/po.pm:904
 #, perl-format
 msgid "failed to copy the POT file to %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:935
+#: ../IkiWiki/Plugin/po.pm:940
 msgid "N/A"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:948
+#: ../IkiWiki/Plugin/po.pm:953
 #, perl-format
 msgid "failed to translate %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:1032
+#: ../IkiWiki/Plugin/po.pm:1037
 msgid "removed obsolete PO files"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:1095 ../IkiWiki/Plugin/po.pm:1109
-#: ../IkiWiki/Plugin/po.pm:1149
+#: ../IkiWiki/Plugin/po.pm:1094 ../IkiWiki/Plugin/po.pm:1108
+#: ../IkiWiki/Plugin/po.pm:1147
 #, perl-format
 msgid "failed to write %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:1107
+#: ../IkiWiki/Plugin/po.pm:1106
 msgid "failed to translate"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:1112
-#, perl-format
-msgid "failed to read %s"
-msgstr ""
-
-#: ../IkiWiki/Plugin/po.pm:1161
+#: ../IkiWiki/Plugin/po.pm:1159
 msgid "invalid gettext data, go back to previous page to continue edit"
 msgstr ""
 
-#: ../IkiWiki/Plugin/poll.pm:69
+#: ../IkiWiki/Plugin/poll.pm:70
 msgid "vote"
 msgstr ""
 
-#: ../IkiWiki/Plugin/poll.pm:77
+#: ../IkiWiki/Plugin/poll.pm:78
 msgid "Total votes:"
 msgstr ""
 
-#: ../IkiWiki/Plugin/polygen.pm:41
+#: ../IkiWiki/Plugin/polygen.pm:42
 msgid "polygen not installed"
 msgstr ""
 
-#: ../IkiWiki/Plugin/polygen.pm:60
+#: ../IkiWiki/Plugin/polygen.pm:61
 msgid "command failed"
 msgstr ""
 
-#: ../IkiWiki/Plugin/postsparkline.pm:46
+#: ../IkiWiki/Plugin/postsparkline.pm:47
 msgid "missing formula"
 msgstr ""
 
-#: ../IkiWiki/Plugin/postsparkline.pm:53
+#: ../IkiWiki/Plugin/postsparkline.pm:54
 msgid "unknown formula"
 msgstr ""
 
@@ -744,12 +766,12 @@ msgstr ""
 msgid "at noon on %A"
 msgstr ""
 
-#: ../IkiWiki/Plugin/progress.pm:34
+#: ../IkiWiki/Plugin/progress.pm:35
 #, perl-format
 msgid "illegal percent value %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/progress.pm:55
+#: ../IkiWiki/Plugin/progress.pm:56
 msgid "need either `percent` or `totalpages` and `donepages` parameters"
 msgstr ""
 
@@ -757,40 +779,40 @@ msgstr ""
 msgid "(Diff truncated)"
 msgstr ""
 
-#: ../IkiWiki/Plugin/remove.pm:31 ../IkiWiki/Plugin/rename.pm:36
+#: ../IkiWiki/Plugin/remove.pm:32 ../IkiWiki/Plugin/rename.pm:37
 #, perl-format
 msgid "%s does not exist"
 msgstr ""
 
-#: ../IkiWiki/Plugin/remove.pm:38
+#: ../IkiWiki/Plugin/remove.pm:39
 #, perl-format
 msgid "%s is not in the srcdir, so it cannot be deleted"
 msgstr ""
 
-#: ../IkiWiki/Plugin/remove.pm:41 ../IkiWiki/Plugin/rename.pm:45
+#: ../IkiWiki/Plugin/remove.pm:42 ../IkiWiki/Plugin/rename.pm:46
 #, perl-format
 msgid "%s is not a file"
 msgstr ""
 
-#: ../IkiWiki/Plugin/remove.pm:134
+#: ../IkiWiki/Plugin/remove.pm:137
 #, perl-format
 msgid "confirm removal of %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/remove.pm:171
+#: ../IkiWiki/Plugin/remove.pm:174
 msgid "Please select the attachments to remove."
 msgstr ""
 
-#: ../IkiWiki/Plugin/remove.pm:211
+#: ../IkiWiki/Plugin/remove.pm:217
 msgid "removed"
 msgstr ""
 
-#: ../IkiWiki/Plugin/rename.pm:42
+#: ../IkiWiki/Plugin/rename.pm:43
 #, perl-format
 msgid "%s is not in the srcdir, so it cannot be renamed"
 msgstr ""
 
-#: ../IkiWiki/Plugin/rename.pm:62
+#: ../IkiWiki/Plugin/rename.pm:63
 msgid "no change to the file name was specified"
 msgstr ""
 
@@ -814,24 +836,24 @@ msgstr ""
 msgid "rename %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/rename.pm:161
+#: ../IkiWiki/Plugin/rename.pm:163
 msgid "Also rename SubPages and attachments"
 msgstr ""
 
-#: ../IkiWiki/Plugin/rename.pm:248
+#: ../IkiWiki/Plugin/rename.pm:250
 msgid "Only one attachment can be renamed at a time."
 msgstr ""
 
-#: ../IkiWiki/Plugin/rename.pm:251
+#: ../IkiWiki/Plugin/rename.pm:253
 msgid "Please select the attachment to rename."
 msgstr ""
 
-#: ../IkiWiki/Plugin/rename.pm:348
+#: ../IkiWiki/Plugin/rename.pm:352
 #, perl-format
 msgid "rename %s to %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/rename.pm:572
+#: ../IkiWiki/Plugin/rename.pm:577
 #, perl-format
 msgid "update for rename of %s to %s"
 msgstr ""
@@ -846,28 +868,28 @@ msgstr ""
 msgid "rsync_command exited %d"
 msgstr ""
 
-#: ../IkiWiki/Plugin/search.pm:182
+#: ../IkiWiki/Plugin/search.pm:194
 #, perl-format
 msgid "need Digest::SHA1 to index %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/search.pm:217
+#: ../IkiWiki/Plugin/search.pm:231
 msgid "search"
 msgstr ""
 
-#: ../IkiWiki/Plugin/shortcut.pm:31
+#: ../IkiWiki/Plugin/shortcut.pm:32
 #, perl-format
 msgid "shortcut plugin will not work without %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/shortcut.pm:44
+#: ../IkiWiki/Plugin/shortcut.pm:45
 msgid "missing name or url parameter"
 msgstr ""
 
 #. translators: This is used to display what shortcuts are defined.
 #. translators: First parameter is the name of the shortcut, the second
 #. translators: is an URL.
-#: ../IkiWiki/Plugin/shortcut.pm:54
+#: ../IkiWiki/Plugin/shortcut.pm:55
 #, perl-format
 msgid "shortcut %s points to <i>%s</i>"
 msgstr ""
@@ -876,113 +898,116 @@ msgstr ""
 msgid "failed to parse any smileys"
 msgstr ""
 
-#: ../IkiWiki/Plugin/sparkline.pm:72
+#: ../IkiWiki/Plugin/sparkline.pm:73
 msgid "parse error"
 msgstr ""
 
-#: ../IkiWiki/Plugin/sparkline.pm:78
+#: ../IkiWiki/Plugin/sparkline.pm:79
 msgid "invalid featurepoint diameter"
 msgstr ""
 
-#: ../IkiWiki/Plugin/sparkline.pm:88
+#: ../IkiWiki/Plugin/sparkline.pm:89
 msgid "invalid featurepoint location"
 msgstr ""
 
-#: ../IkiWiki/Plugin/sparkline.pm:99
+#: ../IkiWiki/Plugin/sparkline.pm:100
 msgid "missing values"
 msgstr ""
 
-#: ../IkiWiki/Plugin/sparkline.pm:104
+#: ../IkiWiki/Plugin/sparkline.pm:105
 msgid "invalid height value"
 msgstr ""
 
-#: ../IkiWiki/Plugin/sparkline.pm:111
+#: ../IkiWiki/Plugin/sparkline.pm:112
 msgid "missing width parameter"
 msgstr ""
 
-#: ../IkiWiki/Plugin/sparkline.pm:115
+#: ../IkiWiki/Plugin/sparkline.pm:116
 msgid "invalid width value"
 msgstr ""
 
-#: ../IkiWiki/Plugin/sparkline.pm:153
+#: ../IkiWiki/Plugin/sparkline.pm:154
 msgid "failed to run php"
 msgstr ""
 
-#: ../IkiWiki/Plugin/table.pm:31
+#: ../IkiWiki/Plugin/table.pm:32
 msgid "cannot find file"
 msgstr ""
 
-#: ../IkiWiki/Plugin/table.pm:87
+#: ../IkiWiki/Plugin/table.pm:88
 msgid "unknown data format"
 msgstr ""
 
-#: ../IkiWiki/Plugin/table.pm:95
+#: ../IkiWiki/Plugin/table.pm:96
 msgid "empty data"
 msgstr ""
 
-#: ../IkiWiki/Plugin/table.pm:114
+#: ../IkiWiki/Plugin/table.pm:115
 msgid "Direct data download"
 msgstr ""
 
-#: ../IkiWiki/Plugin/table.pm:148
+#: ../IkiWiki/Plugin/table.pm:149
 #, perl-format
 msgid "parse fail at line %d: %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/template.pm:29
-msgid "missing id parameter"
+#: ../IkiWiki/Plugin/tag.pm:83
+#, perl-format
+msgid "creating tag page %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/template.pm:36
-#, perl-format
-msgid "template %s not found"
+#: ../IkiWiki/Plugin/template.pm:33
+msgid "missing id parameter"
 msgstr ""
 
-#: ../IkiWiki/Plugin/template.pm:55
-msgid "failed to process:"
+#: ../IkiWiki/Plugin/template.pm:47
+#, perl-format
+msgid "%s not found"
 msgstr ""
 
-#: ../IkiWiki/Plugin/teximg.pm:70
+#: ../IkiWiki/Plugin/teximg.pm:72
 msgid "missing tex code"
 msgstr ""
 
-#: ../IkiWiki/Plugin/teximg.pm:122
+#: ../IkiWiki/Plugin/teximg.pm:124
 msgid "failed to generate image from code"
 msgstr ""
 
-#: ../IkiWiki/Plugin/websetup.pm:89
-msgid "plugin"
+#: ../IkiWiki/Plugin/websetup.pm:105
+#, perl-format
+msgid "%s plugin:"
+msgstr ""
+
+#: ../IkiWiki/Plugin/websetup.pm:121
+#, perl-format
+msgid "%s plugins"
 msgstr ""
 
-#: ../IkiWiki/Plugin/websetup.pm:108
+#: ../IkiWiki/Plugin/websetup.pm:135
 #, perl-format
 msgid "enable %s?"
 msgstr ""
 
-#: ../IkiWiki/Plugin/websetup.pm:240
+#: ../IkiWiki/Plugin/websetup.pm:272
 msgid "setup file for this wiki is not known"
 msgstr ""
 
-#: ../IkiWiki/Plugin/websetup.pm:256
+#: ../IkiWiki/Plugin/websetup.pm:288
 msgid "main"
 msgstr ""
 
-#: ../IkiWiki/Plugin/websetup.pm:257
-msgid "plugins"
-msgstr ""
-
-#: ../IkiWiki/Plugin/websetup.pm:395
+#: ../IkiWiki/Plugin/websetup.pm:431
 msgid ""
 "The configuration changes shown below require a wiki rebuild to take effect."
 msgstr ""
 
-#: ../IkiWiki/Plugin/websetup.pm:399
+#: ../IkiWiki/Plugin/websetup.pm:435
 msgid ""
 "For the configuration changes shown below to fully take effect, you may need "
 "to rebuild the wiki."
 msgstr ""
 
-#: ../IkiWiki/Plugin/websetup.pm:436
+#: ../IkiWiki/Plugin/websetup.pm:472
 #, perl-format
 msgid "Error: %s exited nonzero (%s). Discarding setup changes."
 msgstr ""
@@ -992,84 +1017,99 @@ msgstr ""
 msgid "cannot determine id of untrusted committer %s"
 msgstr ""
 
-#: ../IkiWiki/Receive.pm:86
+#: ../IkiWiki/Receive.pm:85
 #, perl-format
 msgid "bad file name %s"
 msgstr ""
 
-#: ../IkiWiki/Render.pm:150
+#: ../IkiWiki/Render.pm:158
 #, perl-format
 msgid "scanning %s"
 msgstr ""
 
-#: ../IkiWiki/Render.pm:271
+#: ../IkiWiki/Render.pm:280
 #, perl-format
 msgid ""
 "symlink found in srcdir path (%s) -- set allow_symlinks_before_srcdir to "
 "allow this"
 msgstr ""
 
-#: ../IkiWiki/Render.pm:300 ../IkiWiki/Render.pm:327
+#: ../IkiWiki/Render.pm:316
 #, perl-format
 msgid "skipping bad filename %s"
 msgstr ""
 
-#: ../IkiWiki/Render.pm:305
+#: ../IkiWiki/Render.pm:332
 #, perl-format
 msgid "%s has multiple possible source pages"
 msgstr ""
 
-#: ../IkiWiki/Render.pm:410
+#: ../IkiWiki/Render.pm:372
 #, perl-format
-msgid "removing old page %s"
+msgid "querying %s for file creation and modification times.."
 msgstr ""
 
-#: ../IkiWiki/Render.pm:483
+#: ../IkiWiki/Render.pm:446
+#, perl-format
+msgid "removing obsolete %s"
+msgstr ""
+
+#: ../IkiWiki/Render.pm:520
 #, perl-format
 msgid "building %s, which links to %s"
 msgstr ""
 
-#: ../IkiWiki/Render.pm:492
+#: ../IkiWiki/Render.pm:529
 #, perl-format
 msgid "removing %s, no longer built by %s"
 msgstr ""
 
-#: ../IkiWiki/Render.pm:615
+#: ../IkiWiki/Render.pm:612 ../IkiWiki/Render.pm:694
 #, perl-format
 msgid "building %s, which depends on %s"
 msgstr ""
 
-#: ../IkiWiki/Render.pm:628
+#: ../IkiWiki/Render.pm:707
 #, perl-format
 msgid "building %s, to update its backlinks"
 msgstr ""
 
-#: ../IkiWiki/Render.pm:693
+#: ../IkiWiki/Render.pm:836
 #, perl-format
 msgid "ikiwiki: cannot build %s"
 msgstr ""
 
 #. translators: The first parameter is a filename, and the second
 #. translators: is a (probably not translated) error message.
-#: ../IkiWiki/Setup.pm:19
+#: ../IkiWiki/Setup.pm:23
 #, perl-format
 msgid "cannot read %s: %s"
 msgstr ""
 
-#: ../IkiWiki/Setup/Automator.pm:33
+#: ../IkiWiki/Setup.pm:34
+#, perl-format
+msgid "cannot load %s in safe mode"
+msgstr ""
+
+#: ../IkiWiki/Setup.pm:47
+#, perl-format
+msgid "failed to parse %s"
+msgstr ""
+
+#: ../IkiWiki/Setup/Automator.pm:34
 msgid "you must enter a wikiname (that contains alphanumerics)"
 msgstr ""
 
-#: ../IkiWiki/Setup/Automator.pm:79
+#: ../IkiWiki/Setup/Automator.pm:89
 #, perl-format
 msgid "unsupported revision control system %s"
 msgstr ""
 
-#: ../IkiWiki/Setup/Automator.pm:105
+#: ../IkiWiki/Setup/Automator.pm:115
 msgid "failed to set up the repository with ikiwiki-makerepo"
 msgstr ""
 
-#: ../IkiWiki/Setup/Automator.pm:123
+#: ../IkiWiki/Setup/Automator.pm:134
 #, perl-format
 msgid "** Disabling plugin %s, since it is failing with this message:"
 msgstr ""
@@ -1088,13 +1128,13 @@ msgid "wrapper filename not specified"
 msgstr ""
 
 #. translators: The parameter is a C filename.
-#: ../IkiWiki/Wrapper.pm:149
+#: ../IkiWiki/Wrapper.pm:160
 #, perl-format
 msgid "failed to compile %s"
 msgstr ""
 
 #. translators: The parameter is a filename.
-#: ../IkiWiki/Wrapper.pm:169
+#: ../IkiWiki/Wrapper.pm:180
 #, perl-format
 msgid "successfully generated %s"
 msgstr ""
@@ -1107,58 +1147,63 @@ msgstr ""
 msgid "       ikiwiki --setup configfile"
 msgstr ""
 
-#: ../ikiwiki.in:91
+#: ../ikiwiki.in:96
 msgid "usage: --set var=value"
 msgstr ""
 
-#: ../ikiwiki.in:140
+#: ../ikiwiki.in:103
+msgid "usage: --set-yaml var=value"
+msgstr ""
+
+#: ../ikiwiki.in:157
 msgid "generating wrappers.."
 msgstr ""
 
-#: ../ikiwiki.in:195
+#: ../ikiwiki.in:220
 msgid "rebuilding wiki.."
 msgstr ""
 
-#: ../ikiwiki.in:198
+#: ../ikiwiki.in:223
 msgid "refreshing wiki.."
 msgstr ""
 
-#: ../IkiWiki.pm:238
+#: ../IkiWiki.pm:232
 msgid "Discussion"
 msgstr ""
 
-#: ../IkiWiki.pm:507
+#: ../IkiWiki.pm:531
 msgid "Must specify url to wiki with --url when using --cgi"
 msgstr ""
 
-#: ../IkiWiki.pm:553
+#: ../IkiWiki.pm:577
 msgid "cannot use multiple rcs plugins"
 msgstr ""
 
-#: ../IkiWiki.pm:582
+#: ../IkiWiki.pm:607
 #, perl-format
 msgid "failed to load external plugin needed for %s plugin: %s"
 msgstr ""
 
-#: ../IkiWiki.pm:1263
+#: ../IkiWiki.pm:1299
 #, perl-format
 msgid "preprocessing loop detected on %s at depth %i"
 msgstr ""
 
-#: ../IkiWiki.pm:1862
+#: ../IkiWiki.pm:1994
 msgid "yes"
 msgstr ""
 
-#: ../IkiWiki.pm:2005
-msgid "Sort::Naturally needed for title_natural sort"
+#: ../IkiWiki.pm:2071
+#, perl-format
+msgid "invalid sort type %s"
 msgstr ""
 
-#: ../IkiWiki.pm:2016
+#: ../IkiWiki.pm:2092
 #, perl-format
 msgid "unknown sort type %s"
 msgstr ""
 
-#: ../IkiWiki.pm:2035
+#: ../IkiWiki.pm:2228
 #, perl-format
 msgid "cannot match pages: %s"
 msgstr ""
index 7e0d3dd90e2c7b9634e289e0d9abc1d3536c9255..e6fd4b42f1ab32a24d6603b9aa3912cdac540eac 100644 (file)
--- a/po/it.po
+++ b/po/it.po
@@ -5,19 +5,16 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Ikiwiki\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-10-31 18:31-0400\n"
+"POT-Creation-Date: 2010-06-10 15:02-0400\n"
 "PO-Revision-Date: 2009-08-16 11:01+0100\n"
 "Last-Translator: Luca Bruno <lucab@debian.org>\n"
 "Language-Team: Italian TP <tp@lists.linux.it>\n"
+"Language: \n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=utf-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: ../IkiWiki/CGI.pm:114
-msgid "You need to log in first."
-msgstr "Occorre prima effettuare l'accesso."
-
-#: ../IkiWiki/CGI.pm:147
+#: ../IkiWiki/CGI.pm:162
 msgid ""
 "probable misconfiguration: sslcookie is set, but you are attempting to login "
 "via http, not https"
@@ -25,35 +22,35 @@ msgstr ""
 "possibile errore di configurazione: sslcookie è impostato, ma si sta "
 "tentando un accesso via http, non https"
 
-#: ../IkiWiki/CGI.pm:150
+#: ../IkiWiki/CGI.pm:165
 msgid "login failed, perhaps you need to turn on cookies?"
 msgstr "errore nell'accesso, probabilmente i cookie sono disabilitati?"
 
-#: ../IkiWiki/CGI.pm:169 ../IkiWiki/CGI.pm:314
+#: ../IkiWiki/CGI.pm:184 ../IkiWiki/CGI.pm:335
 msgid "Your login session has expired."
 msgstr "La sessione è scaduta."
 
-#: ../IkiWiki/CGI.pm:190
+#: ../IkiWiki/CGI.pm:205
 msgid "Login"
 msgstr "Entra"
 
-#: ../IkiWiki/CGI.pm:191
+#: ../IkiWiki/CGI.pm:206
 msgid "Preferences"
 msgstr "Preferenze"
 
-#: ../IkiWiki/CGI.pm:192
+#: ../IkiWiki/CGI.pm:207
 msgid "Admin"
 msgstr "Amministrazione"
 
-#: ../IkiWiki/CGI.pm:232
+#: ../IkiWiki/CGI.pm:247
 msgid "Preferences saved."
 msgstr "Preferenze salvate."
 
-#: ../IkiWiki/CGI.pm:278
+#: ../IkiWiki/CGI.pm:299
 msgid "You are banned."
 msgstr "Avete ricevuto un ban."
 
-#: ../IkiWiki/CGI.pm:405 ../IkiWiki/CGI.pm:406 ../IkiWiki.pm:1282
+#: ../IkiWiki/CGI.pm:426 ../IkiWiki/CGI.pm:427 ../IkiWiki.pm:1316
 msgid "Error"
 msgstr "Errore"
 
@@ -135,7 +132,7 @@ msgstr "creazione nuova pagina %s"
 msgid "deleting bucket.."
 msgstr "eliminazione contenitore..."
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:206
+#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:231
 msgid "done"
 msgstr "fatto"
 
@@ -144,40 +141,40 @@ msgstr "fatto"
 msgid "Must specify %s"
 msgstr "Occorre specificare %s"
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:136
+#: ../IkiWiki/Plugin/amazon_s3.pm:140
 msgid "Failed to create S3 bucket: "
 msgstr "Impossibile creare il contenitore S3: "
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:221
+#: ../IkiWiki/Plugin/amazon_s3.pm:225
 msgid "Failed to save file to S3: "
 msgstr "Impossibile salvare il file sul S3: "
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:243
+#: ../IkiWiki/Plugin/amazon_s3.pm:247
 msgid "Failed to delete file from S3: "
 msgstr "Impossibile eliminare il file dal S3: "
 
-#: ../IkiWiki/Plugin/attachment.pm:49
+#: ../IkiWiki/Plugin/attachment.pm:50
 #, perl-format
 msgid "there is already a page named %s"
 msgstr "esiste già una pagina chiamata %s"
 
-#: ../IkiWiki/Plugin/attachment.pm:65
+#: ../IkiWiki/Plugin/attachment.pm:66
 msgid "prohibited by allowed_attachments"
 msgstr "non permesso da allowed_attachments"
 
-#: ../IkiWiki/Plugin/attachment.pm:140
+#: ../IkiWiki/Plugin/attachment.pm:141
 msgid "bad attachment filename"
 msgstr "nome file dell'allegato non valido"
 
-#: ../IkiWiki/Plugin/attachment.pm:182
+#: ../IkiWiki/Plugin/attachment.pm:183
 msgid "attachment upload"
 msgstr "carica allegato"
 
-#: ../IkiWiki/Plugin/autoindex.pm:105
+#: ../IkiWiki/Plugin/autoindex.pm:117
 msgid "automatic index generation"
 msgstr "generazione automatica dell'indice"
 
-#: ../IkiWiki/Plugin/blogspam.pm:108
+#: ../IkiWiki/Plugin/blogspam.pm:109
 msgid ""
 "Sorry, but that looks like spam to <a href=\"http://blogspam.net/"
 "\">blogspam</a>: "
@@ -194,192 +191,215 @@ msgstr "%s da %s"
 msgid "There are no broken links!"
 msgstr "Non ci sono collegamenti rotti."
 
-#: ../IkiWiki/Plugin/comments.pm:124 ../IkiWiki/Plugin/format.pm:38
+#: ../IkiWiki/Plugin/comments.pm:112
+#, fuzzy, perl-format
+msgid "this comment needs %s"
+msgstr "commento su %s"
+
+#: ../IkiWiki/Plugin/comments.pm:115
+#, fuzzy
+msgid "moderation"
+msgstr "Moderazione commenti"
+
+#: ../IkiWiki/Plugin/comments.pm:136 ../IkiWiki/Plugin/format.pm:48
 #, perl-format
 msgid "unsupported page format %s"
 msgstr "formato pagina %s non supportato"
 
-#: ../IkiWiki/Plugin/comments.pm:129
+#: ../IkiWiki/Plugin/comments.pm:141
 msgid "comment must have content"
 msgstr "i commenti devono avere un contenuto"
 
-#: ../IkiWiki/Plugin/comments.pm:185
+#: ../IkiWiki/Plugin/comments.pm:196
 msgid "Anonymous"
 msgstr "Anonimo"
 
-#: ../IkiWiki/Plugin/comments.pm:340 ../IkiWiki/Plugin/editpage.pm:97
+#: ../IkiWiki/Plugin/comments.pm:357 ../IkiWiki/Plugin/editpage.pm:98
 msgid "bad page name"
 msgstr "nome pagina non valido"
 
-#: ../IkiWiki/Plugin/comments.pm:345
+#: ../IkiWiki/Plugin/comments.pm:362
 #, perl-format
 msgid "commenting on %s"
 msgstr "commento su %s"
 
-#: ../IkiWiki/Plugin/comments.pm:363
+#: ../IkiWiki/Plugin/comments.pm:380
 #, perl-format
 msgid "page '%s' doesn't exist, so you can't comment"
 msgstr "la pagina «%s» non esiste, impossibile commentarla"
 
-#: ../IkiWiki/Plugin/comments.pm:370
+#: ../IkiWiki/Plugin/comments.pm:387
 #, perl-format
 msgid "comments on page '%s' are closed"
 msgstr "i commenti per la pagina «%s» sono chiusi"
 
-#: ../IkiWiki/Plugin/comments.pm:464
+#: ../IkiWiki/Plugin/comments.pm:491
 msgid "comment stored for moderation"
 msgstr "commento trattenuto per moderazione"
 
-#: ../IkiWiki/Plugin/comments.pm:466
+#: ../IkiWiki/Plugin/comments.pm:493
 msgid "Your comment will be posted after moderator review"
 msgstr "Il commento sarà pubblicato dopo la verifica del moderatore"
 
-#: ../IkiWiki/Plugin/comments.pm:479
+#: ../IkiWiki/Plugin/comments.pm:506
 msgid "Added a comment"
 msgstr "Aggiunto commento"
 
-#: ../IkiWiki/Plugin/comments.pm:483
+#: ../IkiWiki/Plugin/comments.pm:510
 #, perl-format
 msgid "Added a comment: %s"
 msgstr "Aggiunto commento: %s"
 
-#: ../IkiWiki/Plugin/comments.pm:525 ../IkiWiki/Plugin/websetup.pm:236
+#: ../IkiWiki/Plugin/comments.pm:552 ../IkiWiki/Plugin/websetup.pm:272
 msgid "you are not logged in as an admin"
 msgstr "non siete autenticati come amministratore"
 
-#: ../IkiWiki/Plugin/comments.pm:576
+#: ../IkiWiki/Plugin/comments.pm:603
 msgid "Comment moderation"
 msgstr "Moderazione commenti"
 
-#: ../IkiWiki/Plugin/comments.pm:615
+#: ../IkiWiki/Plugin/comments.pm:641
 msgid "comment moderation"
 msgstr "moderazione commento"
 
-#: ../IkiWiki/Plugin/comments.pm:766
-msgid "Comments"
+#: ../IkiWiki/Plugin/comments.pm:790
+#, fuzzy, perl-format
+msgid "%i comment"
+msgid_plural "%i comments"
+msgstr[0] "Commenti"
+msgstr[1] "Commenti"
+
+#. translators: Here "Comment" is a verb;
+#. translators: the user clicks on it to
+#. translators: post a comment.
+#: ../IkiWiki/Plugin/comments.pm:800
+#, fuzzy
+msgid "Comment"
 msgstr "Commenti"
 
-#: ../IkiWiki/Plugin/conditional.pm:27 ../IkiWiki/Plugin/cutpaste.pm:30
-#: ../IkiWiki/Plugin/cutpaste.pm:45 ../IkiWiki/Plugin/cutpaste.pm:61
+#: ../IkiWiki/Plugin/conditional.pm:28 ../IkiWiki/Plugin/cutpaste.pm:31
+#: ../IkiWiki/Plugin/cutpaste.pm:46 ../IkiWiki/Plugin/cutpaste.pm:62
 #: ../IkiWiki/Plugin/testpagespec.pm:26
 #, perl-format
 msgid "%s parameter is required"
 msgstr "parametro %s necessario"
 
-#: ../IkiWiki/Plugin/cutpaste.pm:66
+#: ../IkiWiki/Plugin/cutpaste.pm:67
 msgid "no text was copied in this page"
 msgstr "nessun testo è stato copiato in questa pagina"
 
-#: ../IkiWiki/Plugin/cutpaste.pm:69
+#: ../IkiWiki/Plugin/cutpaste.pm:70
 #, perl-format
 msgid "no text was copied in this page with id %s"
 msgstr "nessun testo è stato copiato in questa pagina con l'id %s"
 
-#: ../IkiWiki/Plugin/editpage.pm:40
+#: ../IkiWiki/Plugin/editpage.pm:41
 #, perl-format
 msgid "removing old preview %s"
 msgstr "rimozione vecchia anteprima %s"
 
-#: ../IkiWiki/Plugin/editpage.pm:113
+#: ../IkiWiki/Plugin/editpage.pm:114
 #, perl-format
 msgid "%s is not an editable page"
 msgstr "%s non è una pagina modificabile"
 
-#: ../IkiWiki/Plugin/editpage.pm:292
+#: ../IkiWiki/Plugin/editpage.pm:294
 #, perl-format
 msgid "creating %s"
 msgstr "creazione %s"
 
-#: ../IkiWiki/Plugin/editpage.pm:310 ../IkiWiki/Plugin/editpage.pm:329
-#: ../IkiWiki/Plugin/editpage.pm:339 ../IkiWiki/Plugin/editpage.pm:383
-#: ../IkiWiki/Plugin/editpage.pm:422
+#: ../IkiWiki/Plugin/editpage.pm:312 ../IkiWiki/Plugin/editpage.pm:334
+#: ../IkiWiki/Plugin/editpage.pm:345 ../IkiWiki/Plugin/editpage.pm:390
+#: ../IkiWiki/Plugin/editpage.pm:429
 #, perl-format
 msgid "editing %s"
 msgstr "modifica %s"
 
-#: ../IkiWiki/Plugin/edittemplate.pm:51
+#: ../IkiWiki/Plugin/edittemplate.pm:52
 msgid "template not specified"
 msgstr "modello non specificato"
 
-#: ../IkiWiki/Plugin/edittemplate.pm:54
+#: ../IkiWiki/Plugin/edittemplate.pm:55
 msgid "match not specified"
 msgstr "corrispondenza non specificata"
 
-#: ../IkiWiki/Plugin/edittemplate.pm:63
+#: ../IkiWiki/Plugin/edittemplate.pm:64
 #, perl-format
 msgid "edittemplate %s registered for %s"
 msgstr "edittemplate %s registrato per %s"
 
-#: ../IkiWiki/Plugin/edittemplate.pm:137
-msgid "failed to process"
-msgstr "errore nell'elaborazione"
+#: ../IkiWiki/Plugin/edittemplate.pm:125 ../IkiWiki/Plugin/inline.pm:339
+#: ../IkiWiki/Plugin/template.pm:44
+#, fuzzy
+msgid "failed to process template:"
+msgstr "errore nell'elaborazione:"
 
-#: ../IkiWiki/Plugin/format.pm:20
+#: ../IkiWiki/Plugin/format.pm:30
 msgid "must specify format and text"
 msgstr "occorre specificare formato e testo"
 
-#: ../IkiWiki/Plugin/fortune.pm:27
+#: ../IkiWiki/Plugin/fortune.pm:28
 msgid "fortune failed"
 msgstr "errore nel fortune"
 
-#: ../IkiWiki/Plugin/getsource.pm:62 ../IkiWiki/Plugin/goto.pm:55
+#: ../IkiWiki/Plugin/getsource.pm:64 ../IkiWiki/Plugin/goto.pm:58
 msgid "missing page"
 msgstr "pagina mancante"
 
-#: ../IkiWiki/Plugin/getsource.pm:64 ../IkiWiki/Plugin/goto.pm:57
+#: ../IkiWiki/Plugin/getsource.pm:66 ../IkiWiki/Plugin/goto.pm:60
 #, perl-format
 msgid "The page %s does not exist."
 msgstr "La pagina %s non esiste."
 
-#: ../IkiWiki/Plugin/getsource.pm:73
+#: ../IkiWiki/Plugin/getsource.pm:75
 msgid "not a page"
 msgstr "non è una pagina"
 
-#: ../IkiWiki/Plugin/getsource.pm:75
+#: ../IkiWiki/Plugin/getsource.pm:77
 #, perl-format
 msgid "%s is an attachment, not a page."
 msgstr "%s è un allegato, non una pagina."
 
-#: ../IkiWiki/Plugin/git.pm:651 ../IkiWiki/Plugin/git.pm:669
+#: ../IkiWiki/Plugin/git.pm:687 ../IkiWiki/Plugin/git.pm:705
 #: ../IkiWiki/Receive.pm:130
 #, perl-format
 msgid "you are not allowed to change %s"
 msgstr "non è permesso modificare %s"
 
-#: ../IkiWiki/Plugin/git.pm:691
+#: ../IkiWiki/Plugin/git.pm:727
 #, perl-format
 msgid "you cannot act on a file with mode %s"
 msgstr "non è permesso lavorare su un file in modalità %s"
 
-#: ../IkiWiki/Plugin/git.pm:695
+#: ../IkiWiki/Plugin/git.pm:731
 msgid "you are not allowed to change file modes"
 msgstr "non è permesso cambiare la modalità del file"
 
-#: ../IkiWiki/Plugin/google.pm:25 ../IkiWiki/Plugin/po.pm:131
-#: ../IkiWiki/Plugin/search.pm:36
+#: ../IkiWiki/Plugin/google.pm:26 ../IkiWiki/Plugin/po.pm:134
+#: ../IkiWiki/Plugin/search.pm:37
 #, perl-format
 msgid "Must specify %s when using the %s plugin"
 msgstr "Occorre specificare %s quando si usa il plugin %s"
 
-#: ../IkiWiki/Plugin/graphviz.pm:67
+#: ../IkiWiki/Plugin/graphviz.pm:68
 msgid "failed to run graphviz"
 msgstr "errore nell'eseguire graphviz"
 
-#: ../IkiWiki/Plugin/graphviz.pm:94
+#: ../IkiWiki/Plugin/graphviz.pm:91
 msgid "prog not a valid graphviz program"
 msgstr "prog non è un programma graphviz valido"
 
-#: ../IkiWiki/Plugin/highlight.pm:47
+#: ../IkiWiki/Plugin/highlight.pm:48
 #, perl-format
 msgid "tohighlight contains unknown file type '%s'"
 msgstr "tohighlight contiene il tipo di file sconosciuto «%s»"
 
-#: ../IkiWiki/Plugin/highlight.pm:58
+#: ../IkiWiki/Plugin/highlight.pm:59
 #, perl-format
 msgid "Source code: %s"
 msgstr "Sorgente: %s"
 
-#: ../IkiWiki/Plugin/highlight.pm:123
+#: ../IkiWiki/Plugin/highlight.pm:124
 msgid ""
 "warning: highlight perl module not available; falling back to pass through"
 msgstr ""
@@ -390,102 +410,112 @@ msgstr ""
 msgid "htmltidy failed to parse this html"
 msgstr "impossibile interpretare gli smile"
 
-#: ../IkiWiki/Plugin/img.pm:64
+#: ../IkiWiki/Plugin/img.pm:69
 msgid "Image::Magick is not installed"
 msgstr "Image::Magick non è installato"
 
-#: ../IkiWiki/Plugin/img.pm:68 ../IkiWiki/Plugin/img.pm:112
+#: ../IkiWiki/Plugin/img.pm:73 ../IkiWiki/Plugin/img.pm:117
 #, perl-format
 msgid "failed to read %s: %s"
 msgstr "impossibile leggere %s: %s"
 
-#: ../IkiWiki/Plugin/img.pm:74
+#: ../IkiWiki/Plugin/img.pm:79
 #, perl-format
 msgid "wrong size format \"%s\" (should be WxH)"
 msgstr "Formato dimensione «%s» non valido (dovrebbe essere LxA)"
 
-#: ../IkiWiki/Plugin/img.pm:120
+#: ../IkiWiki/Plugin/img.pm:122
 #, perl-format
 msgid "failed to resize: %s"
 msgstr "impossibile ridimensionare: %s"
 
-#: ../IkiWiki/Plugin/img.pm:140
+#: ../IkiWiki/Plugin/img.pm:146
 #, perl-format
 msgid "failed to determine size of image %s"
 msgstr "impossibile determinare la dimensione dell'immagine %s"
 
-#: ../IkiWiki/Plugin/inline.pm:92
+#: ../IkiWiki/Plugin/inline.pm:93
 msgid "Must specify url to wiki with --url when using --rss or --atom"
 msgstr ""
 "Occorre specificare l'url del wiki tramite --url quando si usa --rss o --atom"
 
-#: ../IkiWiki/Plugin/inline.pm:138
+#: ../IkiWiki/Plugin/inline.pm:139
 msgid "page editing not allowed"
 msgstr "modifica della pagina non ammessa"
 
-#: ../IkiWiki/Plugin/inline.pm:155
+#: ../IkiWiki/Plugin/inline.pm:156
 msgid "missing pages parameter"
 msgstr "parametro pagine mancante"
 
-#: ../IkiWiki/Plugin/inline.pm:191
+#: ../IkiWiki/Plugin/inline.pm:192
 #, perl-format
 msgid "the %s and %s parameters cannot be used together"
 msgstr "i parametri %s e %s non possono essere usati insieme"
 
-#: ../IkiWiki/Plugin/inline.pm:312
+#: ../IkiWiki/Plugin/inline.pm:313
 msgid "Add a new post titled:"
 msgstr "Aggiungere un nuovo articolo dal titolo:"
 
-#: ../IkiWiki/Plugin/inline.pm:332
+#: ../IkiWiki/Plugin/inline.pm:342
 #, perl-format
-msgid "nonexistant template %s"
-msgstr "modello %s non esistente"
+msgid "template %s not found"
+msgstr "modello %s non trovato"
 
-#: ../IkiWiki/Plugin/inline.pm:598
+#: ../IkiWiki/Plugin/inline.pm:633
 msgid "RPC::XML::Client not found, not pinging"
 msgstr "RPC::XML::Client non trovato, impossibile inviare ping"
 
-#: ../IkiWiki/Plugin/linkmap.pm:101
+#: ../IkiWiki/Plugin/linkmap.pm:81 ../IkiWiki/Plugin/linkmap.pm:88
+#: ../IkiWiki/Plugin/linkmap.pm:92 ../IkiWiki/Plugin/linkmap.pm:95
 msgid "failed to run dot"
 msgstr "impossibile eseguire dot"
 
-#: ../IkiWiki/Plugin/lockedit.pm:47
+#: ../IkiWiki/Plugin/linkmap.pm:85
+msgid "linkmap"
+msgstr ""
+
+#: ../IkiWiki/Plugin/lockedit.pm:49
 #, perl-format
 msgid "%s is locked and cannot be edited"
 msgstr "%s è bloccata e non può essere modificata"
 
-#: ../IkiWiki/Plugin/mdwn.pm:44
+#: ../IkiWiki/Plugin/mdwn.pm:45
 msgid "multimarkdown is enabled, but Text::MultiMarkdown is not installed"
 msgstr ""
 "multimarkdown è stato abilitato, ma Text::MultiMarkdown non è aggiornato"
 
-#: ../IkiWiki/Plugin/mdwn.pm:69
+#: ../IkiWiki/Plugin/mdwn.pm:70
 #, perl-format
 msgid "failed to load Markdown.pm perl module (%s) or /usr/bin/markdown (%s)"
 msgstr ""
 "impossibile caricare il modulo perl Markdown.pm (%s) o /usr/bin/markdown (%s)"
 
-#: ../IkiWiki/Plugin/meta.pm:161
+#: ../IkiWiki/Plugin/meta.pm:174
 msgid "stylesheet not found"
 msgstr "foglio di stile non trovato"
 
-#: ../IkiWiki/Plugin/meta.pm:199
+#: ../IkiWiki/Plugin/meta.pm:212
 msgid "redir page not found"
 msgstr "pagina di reindirizzamento non trovata"
 
-#: ../IkiWiki/Plugin/meta.pm:213
+#: ../IkiWiki/Plugin/meta.pm:226
 msgid "redir cycle is not allowed"
 msgstr "ciclo di reindirizzamento non ammesso"
 
-#: ../IkiWiki/Plugin/mirrorlist.pm:43
+#: ../IkiWiki/Plugin/meta.pm:387
+#, fuzzy
+msgid "sort=meta requires a parameter"
+msgstr "sono richiesti i parametri \"to\" e \"from\""
+
+#: ../IkiWiki/Plugin/mirrorlist.pm:44
 msgid "Mirrors"
 msgstr "Mirror"
 
-#: ../IkiWiki/Plugin/mirrorlist.pm:43
+#: ../IkiWiki/Plugin/mirrorlist.pm:44
 msgid "Mirror"
 msgstr "Mirror"
 
-#: ../IkiWiki/Plugin/moderatedcomments.pm:41
+#: ../IkiWiki/Plugin/moderatedcomments.pm:57
 #, fuzzy
 msgid "comment needs moderation"
 msgstr "moderazione commento"
@@ -494,19 +524,12 @@ msgstr "moderazione commento"
 msgid "more"
 msgstr "altro"
 
-#: ../IkiWiki/Plugin/norcs.pm:65
-msgid "getctime not implemented"
-msgstr "getctime non implementata"
-
-#: ../IkiWiki/Plugin/openid.pm:61
-msgid "Log in with"
-msgstr "Accedi tramite"
-
-#: ../IkiWiki/Plugin/openid.pm:64
-msgid "Get an OpenID"
-msgstr "Ottieni un OpenID"
+#: ../IkiWiki/Plugin/openid.pm:58
+#, fuzzy, perl-format
+msgid "failed to load openid module: "
+msgstr "errore nel compilare %s"
 
-#: ../IkiWiki/Plugin/orphans.pm:55
+#: ../IkiWiki/Plugin/orphans.pm:56
 msgid "All pages have other pages linking to them."
 msgstr "Tutte le pagine hanno collegamenti in entrata da altre pagine."
 
@@ -514,34 +537,42 @@ msgstr "Tutte le pagine hanno collegamenti in entrata da altre pagine."
 msgid "bad or missing template"
 msgstr "modello errato o mancante"
 
-#: ../IkiWiki/Plugin/passwordauth.pm:248
+#: ../IkiWiki/Plugin/passwordauth.pm:231
+msgid "Your user page: "
+msgstr ""
+
+#: ../IkiWiki/Plugin/passwordauth.pm:238
+msgid "Create your user page"
+msgstr ""
+
+#: ../IkiWiki/Plugin/passwordauth.pm:268
 msgid "Account creation successful. Now you can Login."
 msgstr "Account creato con successo. È ora possibile effettuare l'accesso."
 
-#: ../IkiWiki/Plugin/passwordauth.pm:251
+#: ../IkiWiki/Plugin/passwordauth.pm:271
 msgid "Error creating account."
 msgstr "Errore nella creazione dell'account."
 
-#: ../IkiWiki/Plugin/passwordauth.pm:258
+#: ../IkiWiki/Plugin/passwordauth.pm:278
 msgid "No email address, so cannot email password reset instructions."
 msgstr ""
 "Nessun indirizzo email, impossibile inviare per email le istruzioni per "
 "reimpostare la password."
 
-#: ../IkiWiki/Plugin/passwordauth.pm:292
+#: ../IkiWiki/Plugin/passwordauth.pm:312
 msgid "Failed to send mail"
 msgstr "Impossibile spedire il messaggio"
 
-#: ../IkiWiki/Plugin/passwordauth.pm:294
+#: ../IkiWiki/Plugin/passwordauth.pm:314
 msgid "You have been mailed password reset instructions."
 msgstr ""
 "Il messaggio con le istruzioni per reimpostare la password è stato inviato."
 
-#: ../IkiWiki/Plugin/passwordauth.pm:329
+#: ../IkiWiki/Plugin/passwordauth.pm:349
 msgid "incorrect password reset url"
 msgstr "url per il reset della password non corretto"
 
-#: ../IkiWiki/Plugin/passwordauth.pm:332
+#: ../IkiWiki/Plugin/passwordauth.pm:352
 msgid "password reset denied"
 msgstr "reset della password non permesso"
 
@@ -573,19 +604,19 @@ msgstr ""
 "attenzione: è presente un vecchio po4a. Si raccomanda di aggiornare almeno "
 "alla versione 0.35."
 
-#: ../IkiWiki/Plugin/po.pm:138
+#: ../IkiWiki/Plugin/po.pm:142
 #, perl-format
 msgid "%s is not a valid language code"
 msgstr "%s non è una codifica di lingua valida"
 
-#: ../IkiWiki/Plugin/po.pm:150
+#: ../IkiWiki/Plugin/po.pm:154
 #, perl-format
 msgid ""
 "%s is not a valid value for po_link_to, falling back to po_link_to=default"
 msgstr ""
 "%s non è un valore per po_link_to valido, verrà utilizzato po_link_to=default"
 
-#: ../IkiWiki/Plugin/po.pm:155
+#: ../IkiWiki/Plugin/po.pm:159
 msgid ""
 "po_link_to=negotiated requires usedirs to be enabled, falling back to "
 "po_link_to=default"
@@ -593,21 +624,21 @@ msgstr ""
 "po_link_to=negotiated richiede che venga abilitato usedirs, verrà utilizzato "
 "po_link_to=default"
 
-#: ../IkiWiki/Plugin/po.pm:385
+#: ../IkiWiki/Plugin/po.pm:390
 #, perl-format
 msgid "rebuilding all pages to fix meta titles"
 msgstr "rigenerazione di tutte le pagine per sistemare i meta-titoli"
 
-#: ../IkiWiki/Plugin/po.pm:389 ../IkiWiki/Render.pm:638
+#: ../IkiWiki/Plugin/po.pm:394 ../IkiWiki/Render.pm:769
 #, perl-format
 msgid "building %s"
 msgstr "compilazione di %s"
 
-#: ../IkiWiki/Plugin/po.pm:427
+#: ../IkiWiki/Plugin/po.pm:432
 msgid "updated PO files"
 msgstr "file PO aggiornati"
 
-#: ../IkiWiki/Plugin/po.pm:451
+#: ../IkiWiki/Plugin/po.pm:456
 msgid ""
 "Can not remove a translation. If the master page is removed, however, its "
 "translations will be removed as well."
@@ -615,7 +646,7 @@ msgstr ""
 "Impossibile eliminare una traduzione. Tuttavia, se la pagina principale è "
 "stata eliminata anche le traduzioni lo saranno."
 
-#: ../IkiWiki/Plugin/po.pm:471
+#: ../IkiWiki/Plugin/po.pm:476
 msgid ""
 "Can not rename a translation. If the master page is renamed, however, its "
 "translations will be renamed as well."
@@ -623,81 +654,76 @@ msgstr ""
 "Impossibile rinominare una traduzione. Tuttavia, se la pagina principale è "
 "stata rinominata anche le traduzioni lo saranno."
 
-#: ../IkiWiki/Plugin/po.pm:870
+#: ../IkiWiki/Plugin/po.pm:876
 #, perl-format
 msgid "POT file (%s) does not exist"
 msgstr "Il file POT (%s) non esiste"
 
-#: ../IkiWiki/Plugin/po.pm:884
+#: ../IkiWiki/Plugin/po.pm:890
 #, perl-format
 msgid "failed to copy underlay PO file to %s"
 msgstr "impossibile copiare il file PO di underlay in %s"
 
-#: ../IkiWiki/Plugin/po.pm:893
+#: ../IkiWiki/Plugin/po.pm:899
 #, perl-format
 msgid "failed to update %s"
 msgstr "impossibile aggiornare %s"
 
-#: ../IkiWiki/Plugin/po.pm:899
+#: ../IkiWiki/Plugin/po.pm:905
 #, perl-format
 msgid "failed to copy the POT file to %s"
 msgstr "impossibile copiare il file POT in %s"
 
-#: ../IkiWiki/Plugin/po.pm:935
+#: ../IkiWiki/Plugin/po.pm:941
 msgid "N/A"
 msgstr "N/D"
 
-#: ../IkiWiki/Plugin/po.pm:948
+#: ../IkiWiki/Plugin/po.pm:954
 #, perl-format
 msgid "failed to translate %s"
 msgstr "impossibile tradurre %s"
 
-#: ../IkiWiki/Plugin/po.pm:1032
+#: ../IkiWiki/Plugin/po.pm:1038
 msgid "removed obsolete PO files"
 msgstr "file PO obsoleti rimossi"
 
-#: ../IkiWiki/Plugin/po.pm:1095 ../IkiWiki/Plugin/po.pm:1109
-#: ../IkiWiki/Plugin/po.pm:1149
+#: ../IkiWiki/Plugin/po.pm:1094 ../IkiWiki/Plugin/po.pm:1108
+#: ../IkiWiki/Plugin/po.pm:1147
 #, perl-format
 msgid "failed to write %s"
 msgstr "impossibile scrivere %s"
 
-#: ../IkiWiki/Plugin/po.pm:1107
+#: ../IkiWiki/Plugin/po.pm:1106
 msgid "failed to translate"
 msgstr "impossibile tradurre"
 
-#: ../IkiWiki/Plugin/po.pm:1112
-#, perl-format
-msgid "failed to read %s"
-msgstr "impossibile leggere %s"
-
-#: ../IkiWiki/Plugin/po.pm:1161
+#: ../IkiWiki/Plugin/po.pm:1159
 msgid "invalid gettext data, go back to previous page to continue edit"
 msgstr ""
 "dati gettext non validi, tornare alle pagina precedente per continuare le "
 "modifiche"
 
-#: ../IkiWiki/Plugin/poll.pm:69
+#: ../IkiWiki/Plugin/poll.pm:70
 msgid "vote"
 msgstr "voto"
 
-#: ../IkiWiki/Plugin/poll.pm:77
+#: ../IkiWiki/Plugin/poll.pm:78
 msgid "Total votes:"
 msgstr "Voti totali:"
 
-#: ../IkiWiki/Plugin/polygen.pm:41
+#: ../IkiWiki/Plugin/polygen.pm:42
 msgid "polygen not installed"
 msgstr "polygen non è installato"
 
-#: ../IkiWiki/Plugin/polygen.pm:60
+#: ../IkiWiki/Plugin/polygen.pm:61
 msgid "command failed"
 msgstr "errore nel comando"
 
-#: ../IkiWiki/Plugin/postsparkline.pm:46
+#: ../IkiWiki/Plugin/postsparkline.pm:47
 msgid "missing formula"
 msgstr "formula mancante"
 
-#: ../IkiWiki/Plugin/postsparkline.pm:53
+#: ../IkiWiki/Plugin/postsparkline.pm:54
 msgid "unknown formula"
 msgstr "formula sconosciuta"
 
@@ -765,12 +791,12 @@ msgstr "a mezzanotte"
 msgid "at noon on %A"
 msgstr "%A a mezzogiorno"
 
-#: ../IkiWiki/Plugin/progress.pm:34
+#: ../IkiWiki/Plugin/progress.pm:35
 #, perl-format
 msgid "illegal percent value %s"
 msgstr "valore percentuale %s non ammesso"
 
-#: ../IkiWiki/Plugin/progress.pm:55
+#: ../IkiWiki/Plugin/progress.pm:56
 msgid "need either `percent` or `totalpages` and `donepages` parameters"
 msgstr ""
 "occorrono alternativamente i parametri \"percent\" o \"totalpages\" e "
@@ -780,40 +806,40 @@ msgstr ""
 msgid "(Diff truncated)"
 msgstr "(Diff troncato)"
 
-#: ../IkiWiki/Plugin/remove.pm:31 ../IkiWiki/Plugin/rename.pm:36
+#: ../IkiWiki/Plugin/remove.pm:32 ../IkiWiki/Plugin/rename.pm:37
 #, perl-format
 msgid "%s does not exist"
 msgstr "%s non esiste"
 
-#: ../IkiWiki/Plugin/remove.pm:38
+#: ../IkiWiki/Plugin/remove.pm:39
 #, perl-format
 msgid "%s is not in the srcdir, so it cannot be deleted"
 msgstr "%s non è in src, quindi non può essere eliminato"
 
-#: ../IkiWiki/Plugin/remove.pm:41 ../IkiWiki/Plugin/rename.pm:45
+#: ../IkiWiki/Plugin/remove.pm:42 ../IkiWiki/Plugin/rename.pm:46
 #, perl-format
 msgid "%s is not a file"
 msgstr "%s non è un file"
 
-#: ../IkiWiki/Plugin/remove.pm:134
+#: ../IkiWiki/Plugin/remove.pm:137
 #, perl-format
 msgid "confirm removal of %s"
 msgstr "conferma rimozione di %s"
 
-#: ../IkiWiki/Plugin/remove.pm:171
+#: ../IkiWiki/Plugin/remove.pm:174
 msgid "Please select the attachments to remove."
 msgstr "Selezionare l'allegato da rimuovere."
 
-#: ../IkiWiki/Plugin/remove.pm:211
+#: ../IkiWiki/Plugin/remove.pm:216
 msgid "removed"
 msgstr "rimosso"
 
-#: ../IkiWiki/Plugin/rename.pm:42
+#: ../IkiWiki/Plugin/rename.pm:43
 #, perl-format
 msgid "%s is not in the srcdir, so it cannot be renamed"
 msgstr "%s non è in src, quindi non può essere rinominato"
 
-#: ../IkiWiki/Plugin/rename.pm:62
+#: ../IkiWiki/Plugin/rename.pm:63
 msgid "no change to the file name was specified"
 msgstr "non è stata specificata nessuna modifica al nome del file"
 
@@ -837,24 +863,24 @@ msgstr "%s già presente su disco"
 msgid "rename %s"
 msgstr "rinomina di %s"
 
-#: ../IkiWiki/Plugin/rename.pm:161
+#: ../IkiWiki/Plugin/rename.pm:163
 msgid "Also rename SubPages and attachments"
 msgstr "Rinomina anche SottoPagine e allegati"
 
-#: ../IkiWiki/Plugin/rename.pm:247
+#: ../IkiWiki/Plugin/rename.pm:250
 msgid "Only one attachment can be renamed at a time."
 msgstr "Si può rinominare un solo allegato alla volta."
 
-#: ../IkiWiki/Plugin/rename.pm:250
+#: ../IkiWiki/Plugin/rename.pm:253
 msgid "Please select the attachment to rename."
 msgstr "Selezionare l'allegato da rinominare."
 
-#: ../IkiWiki/Plugin/rename.pm:347
+#: ../IkiWiki/Plugin/rename.pm:352
 #, perl-format
 msgid "rename %s to %s"
 msgstr "rinomina %s in %s"
 
-#: ../IkiWiki/Plugin/rename.pm:571
+#: ../IkiWiki/Plugin/rename.pm:576
 #, perl-format
 msgid "update for rename of %s to %s"
 msgstr "aggiornamento per rinomina di %s in %s"
@@ -869,28 +895,28 @@ msgstr "impossibile leggere %s"
 msgid "rsync_command exited %d"
 msgstr ""
 
-#: ../IkiWiki/Plugin/search.pm:182
+#: ../IkiWiki/Plugin/search.pm:194
 #, perl-format
 msgid "need Digest::SHA1 to index %s"
 msgstr "è necessario Digest::SHA1 per l'indice di %s"
 
-#: ../IkiWiki/Plugin/search.pm:217
+#: ../IkiWiki/Plugin/search.pm:231
 msgid "search"
 msgstr "cerca"
 
-#: ../IkiWiki/Plugin/shortcut.pm:31
+#: ../IkiWiki/Plugin/shortcut.pm:32
 #, perl-format
 msgid "shortcut plugin will not work without %s"
 msgstr "il plugin scorciatoia non può funzionare senza %s"
 
-#: ../IkiWiki/Plugin/shortcut.pm:44
+#: ../IkiWiki/Plugin/shortcut.pm:45
 msgid "missing name or url parameter"
 msgstr "parametro nome o url mancante"
 
 #. translators: This is used to display what shortcuts are defined.
 #. translators: First parameter is the name of the shortcut, the second
 #. translators: is an URL.
-#: ../IkiWiki/Plugin/shortcut.pm:54
+#: ../IkiWiki/Plugin/shortcut.pm:55
 #, perl-format
 msgid "shortcut %s points to <i>%s</i>"
 msgstr "la scorciatoia %s punta a <i>%s</i>"
@@ -899,109 +925,112 @@ msgstr "la scorciatoia %s punta a <i>%s</i>"
 msgid "failed to parse any smileys"
 msgstr "impossibile interpretare gli smile"
 
-#: ../IkiWiki/Plugin/sparkline.pm:72
+#: ../IkiWiki/Plugin/sparkline.pm:73
 msgid "parse error"
 msgstr "errore nell'interpretazione"
 
-#: ../IkiWiki/Plugin/sparkline.pm:78
+#: ../IkiWiki/Plugin/sparkline.pm:79
 msgid "invalid featurepoint diameter"
 msgstr "Diametro featurepoint non valido"
 
-#: ../IkiWiki/Plugin/sparkline.pm:88
+#: ../IkiWiki/Plugin/sparkline.pm:89
 msgid "invalid featurepoint location"
 msgstr "Posizione featurepoint non valida"
 
-#: ../IkiWiki/Plugin/sparkline.pm:99
+#: ../IkiWiki/Plugin/sparkline.pm:100
 msgid "missing values"
 msgstr "valori mancanti"
 
-#: ../IkiWiki/Plugin/sparkline.pm:104
+#: ../IkiWiki/Plugin/sparkline.pm:105
 msgid "invalid height value"
 msgstr "valore altezza non valido"
 
-#: ../IkiWiki/Plugin/sparkline.pm:111
+#: ../IkiWiki/Plugin/sparkline.pm:112
 msgid "missing width parameter"
 msgstr "parametro larghezza mancante"
 
-#: ../IkiWiki/Plugin/sparkline.pm:115
+#: ../IkiWiki/Plugin/sparkline.pm:116
 msgid "invalid width value"
 msgstr "valore larghezza non valido"
 
-#: ../IkiWiki/Plugin/sparkline.pm:153
+#: ../IkiWiki/Plugin/sparkline.pm:154
 msgid "failed to run php"
 msgstr "impossibile eseguire php"
 
-#: ../IkiWiki/Plugin/table.pm:31
+#: ../IkiWiki/Plugin/table.pm:32
 msgid "cannot find file"
 msgstr "impossibile trovare il file"
 
-#: ../IkiWiki/Plugin/table.pm:87
+#: ../IkiWiki/Plugin/table.pm:88
 msgid "unknown data format"
 msgstr "formato dati sconosiuto"
 
-#: ../IkiWiki/Plugin/table.pm:95
+#: ../IkiWiki/Plugin/table.pm:96
 msgid "empty data"
 msgstr "nessun dato"
 
-#: ../IkiWiki/Plugin/table.pm:114
+#: ../IkiWiki/Plugin/table.pm:115
 msgid "Direct data download"
 msgstr "Scaricamento diretto dei dati"
 
-#: ../IkiWiki/Plugin/table.pm:148
+#: ../IkiWiki/Plugin/table.pm:149
 #, perl-format
 msgid "parse fail at line %d: %s"
 msgstr "errore di interpretazione alla riga %d: %s"
 
-#: ../IkiWiki/Plugin/template.pm:29
+#: ../IkiWiki/Plugin/tag.pm:83
+#, fuzzy, perl-format
+msgid "creating tag page %s"
+msgstr "creazione nuova pagina %s"
+
+#: ../IkiWiki/Plugin/template.pm:33
 msgid "missing id parameter"
 msgstr "parametro id mancante"
 
-#: ../IkiWiki/Plugin/template.pm:36
-#, perl-format
-msgid "template %s not found"
-msgstr "modello %s non trovato"
-
-#: ../IkiWiki/Plugin/template.pm:55
-msgid "failed to process:"
-msgstr "errore nell'elaborazione:"
+#: ../IkiWiki/Plugin/template.pm:47
+#, fuzzy, perl-format
+msgid "%s not found"
+msgstr "notiziario non trovato"
 
-#: ../IkiWiki/Plugin/teximg.pm:70
+#: ../IkiWiki/Plugin/teximg.pm:72
 msgid "missing tex code"
 msgstr "codice tex mancante"
 
-#: ../IkiWiki/Plugin/teximg.pm:122
+#: ../IkiWiki/Plugin/teximg.pm:124
 msgid "failed to generate image from code"
 msgstr "impossibile generare l'immagine dal codice"
 
-#: ../IkiWiki/Plugin/websetup.pm:89
-msgid "plugin"
+#: ../IkiWiki/Plugin/websetup.pm:105
+#, fuzzy, perl-format
+msgid "%s plugin:"
+msgstr "plugin"
+
+#: ../IkiWiki/Plugin/websetup.pm:121
+#, fuzzy, perl-format
+msgid "%s plugins"
 msgstr "plugin"
 
-#: ../IkiWiki/Plugin/websetup.pm:108
+#: ../IkiWiki/Plugin/websetup.pm:135
 #, perl-format
 msgid "enable %s?"
 msgstr "abilitare %s?"
 
-#: ../IkiWiki/Plugin/websetup.pm:240
+#: ../IkiWiki/Plugin/websetup.pm:276
 msgid "setup file for this wiki is not known"
 msgstr "il file di setup di questo wiki non è noto"
 
-#: ../IkiWiki/Plugin/websetup.pm:256
+#: ../IkiWiki/Plugin/websetup.pm:292
 msgid "main"
 msgstr "principale"
 
-#: ../IkiWiki/Plugin/websetup.pm:257
-msgid "plugins"
-msgstr "plugin"
-
-#: ../IkiWiki/Plugin/websetup.pm:395
+#: ../IkiWiki/Plugin/websetup.pm:435
 msgid ""
 "The configuration changes shown below require a wiki rebuild to take effect."
 msgstr ""
 "Le sottostanti modifiche alla configurazione richiedono la ricompilazione "
 "del wiki."
 
-#: ../IkiWiki/Plugin/websetup.pm:399
+#: ../IkiWiki/Plugin/websetup.pm:439
 msgid ""
 "For the configuration changes shown below to fully take effect, you may need "
 "to rebuild the wiki."
@@ -1009,7 +1038,7 @@ msgstr ""
 "Affinché le sottostanti modifiche alla configurazione abbiano effetto, "
 "occorre ricostruire il wiki."
 
-#: ../IkiWiki/Plugin/websetup.pm:436
+#: ../IkiWiki/Plugin/websetup.pm:476
 #, perl-format
 msgid "Error: %s exited nonzero (%s). Discarding setup changes."
 msgstr "Errore: %s è terminato con errore (%s). Modifiche al setup scartate."
@@ -1024,12 +1053,12 @@ msgstr "impossibile determinare l'id del committer non fidato %s"
 msgid "bad file name %s"
 msgstr "nome file %s scorretto"
 
-#: ../IkiWiki/Render.pm:150
+#: ../IkiWiki/Render.pm:158
 #, perl-format
 msgid "scanning %s"
 msgstr "scansione %s"
 
-#: ../IkiWiki/Render.pm:271
+#: ../IkiWiki/Render.pm:280
 #, perl-format
 msgid ""
 "symlink found in srcdir path (%s) -- set allow_symlinks_before_srcdir to "
@@ -1038,67 +1067,82 @@ msgstr ""
 "collegamento simbolico trovato nel percorso srcdir (%s) -- impostare "
 "allow_symlinks_before_srcdir per abilitare questa configurazione"
 
-#: ../IkiWiki/Render.pm:300 ../IkiWiki/Render.pm:327
+#: ../IkiWiki/Render.pm:311
 #, perl-format
 msgid "skipping bad filename %s"
 msgstr "ignorato il file dal nome scorretto %s"
 
-#: ../IkiWiki/Render.pm:305
+#: ../IkiWiki/Render.pm:327
 #, perl-format
 msgid "%s has multiple possible source pages"
 msgstr "%s ha diverse pagine sorgenti possibili"
 
-#: ../IkiWiki/Render.pm:395
+#: ../IkiWiki/Render.pm:369
 #, perl-format
-msgid "removing old page %s"
+msgid "querying %s for file creation and modification times.."
+msgstr ""
+
+#: ../IkiWiki/Render.pm:431
+#, fuzzy, perl-format
+msgid "removing obsolete %s"
 msgstr "rimozione della vecchia pagina %s"
 
-#: ../IkiWiki/Render.pm:471
+#: ../IkiWiki/Render.pm:505
 #, perl-format
 msgid "building %s, which links to %s"
 msgstr "compilazione di %s, che è collegato a %s"
 
-#: ../IkiWiki/Render.pm:480
+#: ../IkiWiki/Render.pm:514
 #, perl-format
 msgid "removing %s, no longer built by %s"
 msgstr "rimozione di %s, non più richiesto da %s"
 
-#: ../IkiWiki/Render.pm:603
+#: ../IkiWiki/Render.pm:597 ../IkiWiki/Render.pm:679
 #, perl-format
 msgid "building %s, which depends on %s"
 msgstr "compilazione di %s, che dipende da %s"
 
-#: ../IkiWiki/Render.pm:616
+#: ../IkiWiki/Render.pm:692
 #, perl-format
 msgid "building %s, to update its backlinks"
 msgstr "compilazione di %s, per aggiornare i collegamenti ai precedenti"
 
-#: ../IkiWiki/Render.pm:679
+#: ../IkiWiki/Render.pm:821
 #, perl-format
 msgid "ikiwiki: cannot build %s"
 msgstr "ikiwiki: impossibile compilare %s"
 
 #. translators: The first parameter is a filename, and the second
 #. translators: is a (probably not translated) error message.
-#: ../IkiWiki/Setup.pm:19
+#: ../IkiWiki/Setup.pm:23
 #, perl-format
 msgid "cannot read %s: %s"
 msgstr "impossibile leggere %s: %s"
 
-#: ../IkiWiki/Setup/Automator.pm:33
+#: ../IkiWiki/Setup.pm:34
+#, fuzzy, perl-format
+msgid "cannot load %s in safe mode"
+msgstr "impossibile leggere %s: %s"
+
+#: ../IkiWiki/Setup.pm:47
+#, fuzzy, perl-format
+msgid "failed to parse %s"
+msgstr "impossibile aggiornare %s"
+
+#: ../IkiWiki/Setup/Automator.pm:34
 msgid "you must enter a wikiname (that contains alphanumerics)"
 msgstr "occorre inserire un wikiname (contente caratteri alfanumerici)"
 
-#: ../IkiWiki/Setup/Automator.pm:76
+#: ../IkiWiki/Setup/Automator.pm:89
 #, perl-format
 msgid "unsupported revision control system %s"
 msgstr "sistema di controllo di revisione %s non supportato"
 
-#: ../IkiWiki/Setup/Automator.pm:102
+#: ../IkiWiki/Setup/Automator.pm:115
 msgid "failed to set up the repository with ikiwiki-makerepo"
 msgstr "impossibile creare un repository tramite ikiwiki-makerepo"
 
-#: ../IkiWiki/Setup/Automator.pm:120
+#: ../IkiWiki/Setup/Automator.pm:134
 #, perl-format
 msgid "** Disabling plugin %s, since it is failing with this message:"
 msgstr ""
@@ -1118,13 +1162,13 @@ msgid "wrapper filename not specified"
 msgstr "nome del file del contenitore non specificato"
 
 #. translators: The parameter is a C filename.
-#: ../IkiWiki/Wrapper.pm:149
+#: ../IkiWiki/Wrapper.pm:160
 #, perl-format
 msgid "failed to compile %s"
 msgstr "errore nel compilare %s"
 
 #. translators: The parameter is a filename.
-#: ../IkiWiki/Wrapper.pm:169
+#: ../IkiWiki/Wrapper.pm:180
 #, perl-format
 msgid "successfully generated %s"
 msgstr "%s generato con successo"
@@ -1137,58 +1181,64 @@ msgstr "utilizzo: ikiwiki [opzioni] sorgente destinazione"
 msgid "       ikiwiki --setup configfile"
 msgstr "       ikiwiki --setup configfile"
 
-#: ../ikiwiki.in:91
+#: ../ikiwiki.in:96
 msgid "usage: --set var=value"
 msgstr "utilizzo: --set var=valore"
 
-#: ../ikiwiki.in:140
+#: ../ikiwiki.in:103
+#, fuzzy
+msgid "usage: --set-yaml var=value"
+msgstr "utilizzo: --set var=valore"
+
+#: ../ikiwiki.in:157
 msgid "generating wrappers.."
 msgstr "generazione contenitori..."
 
-#: ../ikiwiki.in:195
+#: ../ikiwiki.in:220
 msgid "rebuilding wiki.."
 msgstr "ricostruzione wiki..."
 
-#: ../ikiwiki.in:198
+#: ../ikiwiki.in:223
 msgid "refreshing wiki.."
 msgstr "aggiornamento wiki..."
 
-#: ../IkiWiki.pm:238
+#: ../IkiWiki.pm:232
 msgid "Discussion"
 msgstr "Discussione"
 
-#: ../IkiWiki.pm:507
+#: ../IkiWiki.pm:531
 msgid "Must specify url to wiki with --url when using --cgi"
 msgstr "Occorre specificare l'url del wiki tramite --url quando si usa --cgi"
 
-#: ../IkiWiki.pm:553
+#: ../IkiWiki.pm:577
 msgid "cannot use multiple rcs plugins"
 msgstr "impossibile usare più plugin rcs"
 
-#: ../IkiWiki.pm:582
+#: ../IkiWiki.pm:606
 #, perl-format
 msgid "failed to load external plugin needed for %s plugin: %s"
 msgstr "impossibile caricare il plugin esterno per il plugin %s: %s"
 
-#: ../IkiWiki.pm:1264
+#: ../IkiWiki.pm:1298
 #, perl-format
 msgid "preprocessing loop detected on %s at depth %i"
 msgstr "ciclo del preprocessore individuato su %s alla profondità %i"
 
-#: ../IkiWiki.pm:1863
+#: ../IkiWiki.pm:1993
 msgid "yes"
 msgstr "sì"
 
-#: ../IkiWiki.pm:2006
-msgid "Sort::Naturally needed for title_natural sort"
-msgstr "Sort::Naturally è richiesto per l'ordinamento title_natural"
+#: ../IkiWiki.pm:2070
+#, fuzzy, perl-format
+msgid "invalid sort type %s"
+msgstr "ordinamento %s sconosciuto"
 
-#: ../IkiWiki.pm:2017
+#: ../IkiWiki.pm:2091
 #, perl-format
 msgid "unknown sort type %s"
 msgstr "ordinamento %s sconosciuto"
 
-#: ../IkiWiki.pm:2036
+#: ../IkiWiki.pm:2227
 #, perl-format
 msgid "cannot match pages: %s"
 msgstr "impossibile trovare pagine corrispondenti: %s"
@@ -1213,6 +1263,30 @@ msgstr "Quale utente (openid o del wiki) sarà l'amministratore?"
 msgid "What is the domain name of the web server?"
 msgstr "Qual è il nome del dominio del server web?"
 
+#~ msgid "You need to log in first."
+#~ msgstr "Occorre prima effettuare l'accesso."
+
+#~ msgid "Log in with"
+#~ msgstr "Accedi tramite"
+
+#~ msgid "Get an OpenID"
+#~ msgstr "Ottieni un OpenID"
+
+#~ msgid "failed to process"
+#~ msgstr "errore nell'elaborazione"
+
+#~ msgid "nonexistant template %s"
+#~ msgstr "modello %s non esistente"
+
+#~ msgid "getctime not implemented"
+#~ msgstr "getctime non implementata"
+
+#~ msgid "Sort::Naturally needed for title_natural sort"
+#~ msgstr "Sort::Naturally è richiesto per l'ordinamento title_natural"
+
+#~ msgid "failed to read %s"
+#~ msgstr "impossibile leggere %s"
+
 #~ msgid "Failed to parse url, cannot determine domain name"
 #~ msgstr ""
 #~ "Errore nell'interpretazione dell'URL, impossibile determinare il nome del "
index 81addd8d97da6cd08b6e4a7e1f799553ed6d0163..299c22e7f36360763f7921e759ff919d6363bab8 100644 (file)
--- a/po/pl.po
+++ b/po/pl.po
@@ -8,56 +8,53 @@ msgid ""
 msgstr ""
 "Project-Id-Version: ikiwiki 1.51\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-10-31 18:31-0400\n"
+"POT-Creation-Date: 2010-06-10 15:02-0400\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"
+"Language: \n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: ../IkiWiki/CGI.pm:114
-msgid "You need to log in first."
-msgstr "Proszę najpierw zalogować się."
-
-#: ../IkiWiki/CGI.pm:147
+#: ../IkiWiki/CGI.pm:162
 msgid ""
 "probable misconfiguration: sslcookie is set, but you are attempting to login "
 "via http, not https"
 msgstr ""
 
-#: ../IkiWiki/CGI.pm:150
+#: ../IkiWiki/CGI.pm:165
 msgid "login failed, perhaps you need to turn on cookies?"
 msgstr ""
 "Nieudane logowanie. Proszę sprawdzić czy w przeglądarce włączone są "
 "ciasteczka (ang. cookies)"
 
-#: ../IkiWiki/CGI.pm:169 ../IkiWiki/CGI.pm:314
+#: ../IkiWiki/CGI.pm:184 ../IkiWiki/CGI.pm:335
 msgid "Your login session has expired."
 msgstr ""
 
-#: ../IkiWiki/CGI.pm:190
+#: ../IkiWiki/CGI.pm:205
 msgid "Login"
 msgstr ""
 
-#: ../IkiWiki/CGI.pm:191
+#: ../IkiWiki/CGI.pm:206
 #, fuzzy
 msgid "Preferences"
 msgstr "Preferencje zapisane."
 
-#: ../IkiWiki/CGI.pm:192
+#: ../IkiWiki/CGI.pm:207
 msgid "Admin"
 msgstr ""
 
-#: ../IkiWiki/CGI.pm:232
+#: ../IkiWiki/CGI.pm:247
 msgid "Preferences saved."
 msgstr "Preferencje zapisane."
 
-#: ../IkiWiki/CGI.pm:278
+#: ../IkiWiki/CGI.pm:299
 msgid "You are banned."
 msgstr "Twój dostęp został zabroniony przez administratora."
 
-#: ../IkiWiki/CGI.pm:405 ../IkiWiki/CGI.pm:406 ../IkiWiki.pm:1282
+#: ../IkiWiki/CGI.pm:426 ../IkiWiki/CGI.pm:427 ../IkiWiki.pm:1316
 msgid "Error"
 msgstr "Błąd"
 
@@ -139,7 +136,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:231
 msgid "done"
 msgstr "gotowe"
 
@@ -148,43 +145,43 @@ msgstr "gotowe"
 msgid "Must specify %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:136
+#: ../IkiWiki/Plugin/amazon_s3.pm:140
 #, fuzzy
 msgid "Failed to create S3 bucket: "
 msgstr "Awaria w trakcie wysyłania wiadomości"
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:221
+#: ../IkiWiki/Plugin/amazon_s3.pm:225
 #, fuzzy
 msgid "Failed to save file to S3: "
 msgstr "Awaria w trakcie wysyłania wiadomości"
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:243
+#: ../IkiWiki/Plugin/amazon_s3.pm:247
 #, fuzzy
 msgid "Failed to delete file from S3: "
 msgstr "awaria w trakcie zmiany rozmiaru: %s"
 
-#: ../IkiWiki/Plugin/attachment.pm:49
+#: ../IkiWiki/Plugin/attachment.pm:50
 #, perl-format
 msgid "there is already a page named %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/attachment.pm:65
+#: ../IkiWiki/Plugin/attachment.pm:66
 msgid "prohibited by allowed_attachments"
 msgstr ""
 
-#: ../IkiWiki/Plugin/attachment.pm:140
+#: ../IkiWiki/Plugin/attachment.pm:141
 msgid "bad attachment filename"
 msgstr ""
 
-#: ../IkiWiki/Plugin/attachment.pm:182
+#: ../IkiWiki/Plugin/attachment.pm:183
 msgid "attachment upload"
 msgstr ""
 
-#: ../IkiWiki/Plugin/autoindex.pm:105
+#: ../IkiWiki/Plugin/autoindex.pm:117
 msgid "automatic index generation"
 msgstr ""
 
-#: ../IkiWiki/Plugin/blogspam.pm:108
+#: ../IkiWiki/Plugin/blogspam.pm:109
 msgid ""
 "Sorry, but that looks like spam to <a href=\"http://blogspam.net/"
 "\">blogspam</a>: "
@@ -199,198 +196,218 @@ msgstr ""
 msgid "There are no broken links!"
 msgstr "Wszystkie odnośniki są aktualne!"
 
-#: ../IkiWiki/Plugin/comments.pm:124 ../IkiWiki/Plugin/format.pm:38
+#: ../IkiWiki/Plugin/comments.pm:112
+#, fuzzy, perl-format
+msgid "this comment needs %s"
+msgstr "tworzenie %s"
+
+#: ../IkiWiki/Plugin/comments.pm:115
+msgid "moderation"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:136 ../IkiWiki/Plugin/format.pm:48
 #, perl-format
 msgid "unsupported page format %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:129
+#: ../IkiWiki/Plugin/comments.pm:141
 msgid "comment must have content"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:185
+#: ../IkiWiki/Plugin/comments.pm:196
 msgid "Anonymous"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:340 ../IkiWiki/Plugin/editpage.pm:97
+#: ../IkiWiki/Plugin/comments.pm:357 ../IkiWiki/Plugin/editpage.pm:98
 msgid "bad page name"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:345
+#: ../IkiWiki/Plugin/comments.pm:362
 #, fuzzy, perl-format
 msgid "commenting on %s"
 msgstr "tworzenie %s"
 
-#: ../IkiWiki/Plugin/comments.pm:363
+#: ../IkiWiki/Plugin/comments.pm:380
 #, perl-format
 msgid "page '%s' doesn't exist, so you can't comment"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:370
+#: ../IkiWiki/Plugin/comments.pm:387
 #, perl-format
 msgid "comments on page '%s' are closed"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:464
+#: ../IkiWiki/Plugin/comments.pm:491
 msgid "comment stored for moderation"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:466
+#: ../IkiWiki/Plugin/comments.pm:493
 msgid "Your comment will be posted after moderator review"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:479
+#: ../IkiWiki/Plugin/comments.pm:506
 msgid "Added a comment"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:483
+#: ../IkiWiki/Plugin/comments.pm:510
 #, perl-format
 msgid "Added a comment: %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:525 ../IkiWiki/Plugin/websetup.pm:236
+#: ../IkiWiki/Plugin/comments.pm:552 ../IkiWiki/Plugin/websetup.pm:272
 msgid "you are not logged in as an admin"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:576
+#: ../IkiWiki/Plugin/comments.pm:603
 msgid "Comment moderation"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:615
+#: ../IkiWiki/Plugin/comments.pm:641
 msgid "comment moderation"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:766
-msgid "Comments"
+#: ../IkiWiki/Plugin/comments.pm:790
+#, perl-format
+msgid "%i comment"
+msgid_plural "%i comments"
+msgstr[0] ""
+msgstr[1] ""
+
+#. translators: Here "Comment" is a verb;
+#. translators: the user clicks on it to
+#. translators: post a comment.
+#: ../IkiWiki/Plugin/comments.pm:800
+msgid "Comment"
 msgstr ""
 
-#: ../IkiWiki/Plugin/conditional.pm:27 ../IkiWiki/Plugin/cutpaste.pm:30
-#: ../IkiWiki/Plugin/cutpaste.pm:45 ../IkiWiki/Plugin/cutpaste.pm:61
+#: ../IkiWiki/Plugin/conditional.pm:28 ../IkiWiki/Plugin/cutpaste.pm:31
+#: ../IkiWiki/Plugin/cutpaste.pm:46 ../IkiWiki/Plugin/cutpaste.pm:62
 #: ../IkiWiki/Plugin/testpagespec.pm:26
 #, fuzzy, perl-format
 msgid "%s parameter is required"
 msgstr "Parametry \"test\" i \"then\" są wymagane"
 
-#: ../IkiWiki/Plugin/cutpaste.pm:66
+#: ../IkiWiki/Plugin/cutpaste.pm:67
 msgid "no text was copied in this page"
 msgstr ""
 
-#: ../IkiWiki/Plugin/cutpaste.pm:69
+#: ../IkiWiki/Plugin/cutpaste.pm:70
 #, perl-format
 msgid "no text was copied in this page with id %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/editpage.pm:40
+#: ../IkiWiki/Plugin/editpage.pm:41
 #, fuzzy, perl-format
 msgid "removing old preview %s"
 msgstr "usuwanie starej strony %s"
 
-#: ../IkiWiki/Plugin/editpage.pm:113
+#: ../IkiWiki/Plugin/editpage.pm:114
 #, perl-format
 msgid "%s is not an editable page"
 msgstr "Strona %s nie może być edytowana"
 
-#: ../IkiWiki/Plugin/editpage.pm:292
+#: ../IkiWiki/Plugin/editpage.pm:294
 #, perl-format
 msgid "creating %s"
 msgstr "tworzenie %s"
 
-#: ../IkiWiki/Plugin/editpage.pm:310 ../IkiWiki/Plugin/editpage.pm:329
-#: ../IkiWiki/Plugin/editpage.pm:339 ../IkiWiki/Plugin/editpage.pm:383
-#: ../IkiWiki/Plugin/editpage.pm:422
+#: ../IkiWiki/Plugin/editpage.pm:312 ../IkiWiki/Plugin/editpage.pm:334
+#: ../IkiWiki/Plugin/editpage.pm:345 ../IkiWiki/Plugin/editpage.pm:390
+#: ../IkiWiki/Plugin/editpage.pm:429
 #, perl-format
 msgid "editing %s"
 msgstr "edycja %s"
 
-#: ../IkiWiki/Plugin/edittemplate.pm:51
+#: ../IkiWiki/Plugin/edittemplate.pm:52
 #, fuzzy
 msgid "template not specified"
 msgstr "nieznaleziony szablon %s"
 
-#: ../IkiWiki/Plugin/edittemplate.pm:54
+#: ../IkiWiki/Plugin/edittemplate.pm:55
 #, fuzzy
 msgid "match not specified"
 msgstr "nieokreślona nazwa pliku osłony"
 
-#: ../IkiWiki/Plugin/edittemplate.pm:63
+#: ../IkiWiki/Plugin/edittemplate.pm:64
 #, perl-format
 msgid "edittemplate %s registered for %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/edittemplate.pm:137
+#: ../IkiWiki/Plugin/edittemplate.pm:125 ../IkiWiki/Plugin/inline.pm:339
+#: ../IkiWiki/Plugin/template.pm:44
 #, fuzzy
-msgid "failed to process"
+msgid "failed to process template:"
 msgstr "awaria w trakcie przetwarzania:"
 
-#: ../IkiWiki/Plugin/format.pm:20
+#: ../IkiWiki/Plugin/format.pm:30
 msgid "must specify format and text"
 msgstr ""
 
-#: ../IkiWiki/Plugin/fortune.pm:27
+#: ../IkiWiki/Plugin/fortune.pm:28
 msgid "fortune failed"
 msgstr "awaria fortunki"
 
-#: ../IkiWiki/Plugin/getsource.pm:62 ../IkiWiki/Plugin/goto.pm:55
+#: ../IkiWiki/Plugin/getsource.pm:64 ../IkiWiki/Plugin/goto.pm:58
 #, fuzzy
 msgid "missing page"
 msgstr "brakujące wartości"
 
-#: ../IkiWiki/Plugin/getsource.pm:64 ../IkiWiki/Plugin/goto.pm:57
+#: ../IkiWiki/Plugin/getsource.pm:66 ../IkiWiki/Plugin/goto.pm:60
 #, perl-format
 msgid "The page %s does not exist."
 msgstr ""
 
-#: ../IkiWiki/Plugin/getsource.pm:73
+#: ../IkiWiki/Plugin/getsource.pm:75
 #, fuzzy
 msgid "not a page"
 msgstr "awaria w trakcie odczytu %s: %s"
 
-#: ../IkiWiki/Plugin/getsource.pm:75
+#: ../IkiWiki/Plugin/getsource.pm:77
 #, fuzzy, perl-format
 msgid "%s is an attachment, not a page."
 msgstr "Strona %s nie może być edytowana"
 
-#: ../IkiWiki/Plugin/git.pm:651 ../IkiWiki/Plugin/git.pm:669
+#: ../IkiWiki/Plugin/git.pm:687 ../IkiWiki/Plugin/git.pm:705
 #: ../IkiWiki/Receive.pm:130
 #, perl-format
 msgid "you are not allowed to change %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/git.pm:691
+#: ../IkiWiki/Plugin/git.pm:727
 #, perl-format
 msgid "you cannot act on a file with mode %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/git.pm:695
+#: ../IkiWiki/Plugin/git.pm:731
 msgid "you are not allowed to change file modes"
 msgstr ""
 
-#: ../IkiWiki/Plugin/google.pm:25 ../IkiWiki/Plugin/po.pm:131
-#: ../IkiWiki/Plugin/search.pm:36
+#: ../IkiWiki/Plugin/google.pm:26 ../IkiWiki/Plugin/po.pm:134
+#: ../IkiWiki/Plugin/search.pm:37
 #, fuzzy, perl-format
 msgid "Must specify %s when using the %s plugin"
 msgstr "Wtyczka do wyszukiwarka wymaga podania %s"
 
-#: ../IkiWiki/Plugin/graphviz.pm:67
+#: ../IkiWiki/Plugin/graphviz.pm:68
 #, fuzzy
 msgid "failed to run graphviz"
 msgstr "awaria w trakcie uruchamiania wtyczki graphviz"
 
-#: ../IkiWiki/Plugin/graphviz.pm:94
+#: ../IkiWiki/Plugin/graphviz.pm:91
 msgid "prog not a valid graphviz program"
 msgstr "prog nie jest poprawnym programem graphviz"
 
-#: ../IkiWiki/Plugin/highlight.pm:47
+#: ../IkiWiki/Plugin/highlight.pm:48
 #, perl-format
 msgid "tohighlight contains unknown file type '%s'"
 msgstr ""
 
-#: ../IkiWiki/Plugin/highlight.pm:58
+#: ../IkiWiki/Plugin/highlight.pm:59
 #, perl-format
 msgid "Source code: %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/highlight.pm:123
+#: ../IkiWiki/Plugin/highlight.pm:124
 msgid ""
 "warning: highlight perl module not available; falling back to pass through"
 msgstr ""
@@ -400,112 +417,121 @@ msgstr ""
 msgid "htmltidy failed to parse this html"
 msgstr "awaria w trakcie przetwarzania emitoikonki"
 
-#: ../IkiWiki/Plugin/img.pm:64
+#: ../IkiWiki/Plugin/img.pm:69
 #, fuzzy
 msgid "Image::Magick is not installed"
 msgstr "wtyczka polygen nie jest zainstalowana"
 
-#: ../IkiWiki/Plugin/img.pm:68 ../IkiWiki/Plugin/img.pm:112
+#: ../IkiWiki/Plugin/img.pm:73 ../IkiWiki/Plugin/img.pm:117
 #, fuzzy, perl-format
 msgid "failed to read %s: %s"
 msgstr "awaria w trakcie odczytu %s: %s"
 
-#: ../IkiWiki/Plugin/img.pm:74
+#: ../IkiWiki/Plugin/img.pm:79
 #, perl-format
 msgid "wrong size format \"%s\" (should be WxH)"
 msgstr ""
 
-#: ../IkiWiki/Plugin/img.pm:120
+#: ../IkiWiki/Plugin/img.pm:122
 #, fuzzy, perl-format
 msgid "failed to resize: %s"
 msgstr "awaria w trakcie zmiany rozmiaru: %s"
 
-#: ../IkiWiki/Plugin/img.pm:140
+#: ../IkiWiki/Plugin/img.pm:146
 #, fuzzy, perl-format
 msgid "failed to determine size of image %s"
 msgstr "awaria w trakcie zmiany rozmiaru: %s"
 
-#: ../IkiWiki/Plugin/inline.pm:92
+#: ../IkiWiki/Plugin/inline.pm:93
 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:138
+#: ../IkiWiki/Plugin/inline.pm:139
 #, fuzzy
 msgid "page editing not allowed"
 msgstr "nieznaleziony kanał RSS"
 
-#: ../IkiWiki/Plugin/inline.pm:155
+#: ../IkiWiki/Plugin/inline.pm:156
 #, fuzzy
 msgid "missing pages parameter"
 msgstr "brakujący parametr %s"
 
-#: ../IkiWiki/Plugin/inline.pm:191
+#: ../IkiWiki/Plugin/inline.pm:192
 #, perl-format
 msgid "the %s and %s parameters cannot be used together"
 msgstr ""
 
-#: ../IkiWiki/Plugin/inline.pm:312
+#: ../IkiWiki/Plugin/inline.pm:313
 msgid "Add a new post titled:"
 msgstr "Tytuł nowego wpisu"
 
-#: ../IkiWiki/Plugin/inline.pm:332
+#: ../IkiWiki/Plugin/inline.pm:342
 #, perl-format
-msgid "nonexistant template %s"
-msgstr "brakujący szablon %s"
+msgid "template %s not found"
+msgstr "nieznaleziony szablon %s"
 
-#: ../IkiWiki/Plugin/inline.pm:598
+#: ../IkiWiki/Plugin/inline.pm:633
 msgid "RPC::XML::Client not found, not pinging"
 msgstr "Nieznaleziony moduł RPC::XML::Client, brak możliwości pingowania"
 
-#: ../IkiWiki/Plugin/linkmap.pm:101
+#: ../IkiWiki/Plugin/linkmap.pm:81 ../IkiWiki/Plugin/linkmap.pm:88
+#: ../IkiWiki/Plugin/linkmap.pm:92 ../IkiWiki/Plugin/linkmap.pm:95
 #, fuzzy
 msgid "failed to run dot"
 msgstr "awaria w trakcie uruchamiania dot"
 
-#: ../IkiWiki/Plugin/lockedit.pm:47
+#: ../IkiWiki/Plugin/linkmap.pm:85
+msgid "linkmap"
+msgstr ""
+
+#: ../IkiWiki/Plugin/lockedit.pm:49
 #, fuzzy, perl-format
 msgid "%s is locked and cannot be edited"
 msgstr ""
 "strona %s jest tymczasowo zablokowana przez użytkownika %s i nie może być "
 "teraz edytowana"
 
-#: ../IkiWiki/Plugin/mdwn.pm:44
+#: ../IkiWiki/Plugin/mdwn.pm:45
 msgid "multimarkdown is enabled, but Text::MultiMarkdown is not installed"
 msgstr ""
 
-#: ../IkiWiki/Plugin/mdwn.pm:69
+#: ../IkiWiki/Plugin/mdwn.pm:70
 #, perl-format
 msgid "failed to load Markdown.pm perl module (%s) or /usr/bin/markdown (%s)"
 msgstr ""
 "Awaria w trakcie ładowania perlowego modułu Markdown.pm (%s) lub "
 "uruchamiania programu /usr/bin/markdown (%s)"
 
-#: ../IkiWiki/Plugin/meta.pm:161
+#: ../IkiWiki/Plugin/meta.pm:174
 #, fuzzy
 msgid "stylesheet not found"
 msgstr "nieznaleziony szablon ze stylami CSS"
 
-#: ../IkiWiki/Plugin/meta.pm:199
+#: ../IkiWiki/Plugin/meta.pm:212
 #, fuzzy
 msgid "redir page not found"
 msgstr "nieznaleziony kanał RSS"
 
-#: ../IkiWiki/Plugin/meta.pm:213
+#: ../IkiWiki/Plugin/meta.pm:226
 #, fuzzy
 msgid "redir cycle is not allowed"
 msgstr "nieznaleziony kanał RSS"
 
-#: ../IkiWiki/Plugin/mirrorlist.pm:43
+#: ../IkiWiki/Plugin/meta.pm:387
+msgid "sort=meta requires a parameter"
+msgstr ""
+
+#: ../IkiWiki/Plugin/mirrorlist.pm:44
 msgid "Mirrors"
 msgstr "Kopie lustrzane"
 
-#: ../IkiWiki/Plugin/mirrorlist.pm:43
+#: ../IkiWiki/Plugin/mirrorlist.pm:44
 msgid "Mirror"
 msgstr "Kopia lustrzana"
 
-#: ../IkiWiki/Plugin/moderatedcomments.pm:41
+#: ../IkiWiki/Plugin/moderatedcomments.pm:57
 msgid "comment needs moderation"
 msgstr ""
 
@@ -513,19 +539,12 @@ msgstr ""
 msgid "more"
 msgstr "więcej"
 
-#: ../IkiWiki/Plugin/norcs.pm:65
-msgid "getctime not implemented"
-msgstr "niedostępna funkcja getctime"
-
-#: ../IkiWiki/Plugin/openid.pm:61
-msgid "Log in with"
-msgstr ""
-
-#: ../IkiWiki/Plugin/openid.pm:64
-msgid "Get an OpenID"
-msgstr "Pobierz OpenID"
+#: ../IkiWiki/Plugin/openid.pm:58
+#, fuzzy, perl-format
+msgid "failed to load openid module: "
+msgstr "awaria w trakcie kompilowania %s"
 
-#: ../IkiWiki/Plugin/orphans.pm:55
+#: ../IkiWiki/Plugin/orphans.pm:56
 #, fuzzy
 msgid "All pages have other pages linking to them."
 msgstr "Dla każdej strony istnieje odnośnik z innej strony"
@@ -534,31 +553,39 @@ msgstr "Dla każdej strony istnieje odnośnik z innej strony"
 msgid "bad or missing template"
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:248
+#: ../IkiWiki/Plugin/passwordauth.pm:231
+msgid "Your user page: "
+msgstr ""
+
+#: ../IkiWiki/Plugin/passwordauth.pm:238
+msgid "Create your user page"
+msgstr ""
+
+#: ../IkiWiki/Plugin/passwordauth.pm:268
 msgid "Account creation successful. Now you can Login."
 msgstr "Konto założone pomyślnie. Teraz można zalogować się."
 
-#: ../IkiWiki/Plugin/passwordauth.pm:251
+#: ../IkiWiki/Plugin/passwordauth.pm:271
 msgid "Error creating account."
 msgstr "Błąd w trakcie zakładania konta."
 
-#: ../IkiWiki/Plugin/passwordauth.pm:258
+#: ../IkiWiki/Plugin/passwordauth.pm:278
 msgid "No email address, so cannot email password reset instructions."
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:292
+#: ../IkiWiki/Plugin/passwordauth.pm:312
 msgid "Failed to send mail"
 msgstr "Awaria w trakcie wysyłania wiadomości"
 
-#: ../IkiWiki/Plugin/passwordauth.pm:294
+#: ../IkiWiki/Plugin/passwordauth.pm:314
 msgid "You have been mailed password reset instructions."
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:329
+#: ../IkiWiki/Plugin/passwordauth.pm:349
 msgid "incorrect password reset url"
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:332
+#: ../IkiWiki/Plugin/passwordauth.pm:352
 msgid "password reset denied"
 msgstr ""
 
@@ -589,124 +616,119 @@ msgstr "Nieznaleziony moduł RPC::XML::Client, brak możliwości pingowania"
 msgid "warning: Old po4a detected! Recommend upgrade to 0.35."
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:138
+#: ../IkiWiki/Plugin/po.pm:142
 #, fuzzy, perl-format
 msgid "%s is not a valid language code"
 msgstr "Strona %s nie może być edytowana"
 
-#: ../IkiWiki/Plugin/po.pm:150
+#: ../IkiWiki/Plugin/po.pm:154
 #, perl-format
 msgid ""
 "%s is not a valid value for po_link_to, falling back to po_link_to=default"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:155
+#: ../IkiWiki/Plugin/po.pm:159
 msgid ""
 "po_link_to=negotiated requires usedirs to be enabled, falling back to "
 "po_link_to=default"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:385
+#: ../IkiWiki/Plugin/po.pm:390
 #, perl-format
 msgid "rebuilding all pages to fix meta titles"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:389 ../IkiWiki/Render.pm:638
+#: ../IkiWiki/Plugin/po.pm:394 ../IkiWiki/Render.pm:769
 #, fuzzy, perl-format
 msgid "building %s"
 msgstr "edycja %s"
 
-#: ../IkiWiki/Plugin/po.pm:427
+#: ../IkiWiki/Plugin/po.pm:432
 msgid "updated PO files"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:451
+#: ../IkiWiki/Plugin/po.pm:456
 msgid ""
 "Can not remove a translation. If the master page is removed, however, its "
 "translations will be removed as well."
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:471
+#: ../IkiWiki/Plugin/po.pm:476
 msgid ""
 "Can not rename a translation. If the master page is renamed, however, its "
 "translations will be renamed as well."
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:870
+#: ../IkiWiki/Plugin/po.pm:876
 #, perl-format
 msgid "POT file (%s) does not exist"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:884
+#: ../IkiWiki/Plugin/po.pm:890
 #, fuzzy, perl-format
 msgid "failed to copy underlay PO file to %s"
 msgstr "awaria w trakcie kompilowania %s"
 
-#: ../IkiWiki/Plugin/po.pm:893
+#: ../IkiWiki/Plugin/po.pm:899
 #, fuzzy, perl-format
 msgid "failed to update %s"
 msgstr "awaria w trakcie kompilowania %s"
 
-#: ../IkiWiki/Plugin/po.pm:899
+#: ../IkiWiki/Plugin/po.pm:905
 #, fuzzy, perl-format
 msgid "failed to copy the POT file to %s"
 msgstr "awaria w trakcie kompilowania %s"
 
-#: ../IkiWiki/Plugin/po.pm:935
+#: ../IkiWiki/Plugin/po.pm:941
 msgid "N/A"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:948
+#: ../IkiWiki/Plugin/po.pm:954
 #, fuzzy, perl-format
 msgid "failed to translate %s"
 msgstr "awaria w trakcie zmiany rozmiaru: %s"
 
-#: ../IkiWiki/Plugin/po.pm:1032
+#: ../IkiWiki/Plugin/po.pm:1038
 msgid "removed obsolete PO files"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:1095 ../IkiWiki/Plugin/po.pm:1109
-#: ../IkiWiki/Plugin/po.pm:1149
+#: ../IkiWiki/Plugin/po.pm:1094 ../IkiWiki/Plugin/po.pm:1108
+#: ../IkiWiki/Plugin/po.pm:1147
 #, fuzzy, perl-format
 msgid "failed to write %s"
 msgstr "awaria w trakcie zapisu %s: %s"
 
-#: ../IkiWiki/Plugin/po.pm:1107
+#: ../IkiWiki/Plugin/po.pm:1106
 #, fuzzy
 msgid "failed to translate"
 msgstr "awaria w trakcie uruchamiania dot"
 
-#: ../IkiWiki/Plugin/po.pm:1112
-#, fuzzy, perl-format
-msgid "failed to read %s"
-msgstr "awaria w trakcie odczytu %s: %s"
-
-#: ../IkiWiki/Plugin/po.pm:1161
+#: ../IkiWiki/Plugin/po.pm:1159
 msgid "invalid gettext data, go back to previous page to continue edit"
 msgstr ""
 
-#: ../IkiWiki/Plugin/poll.pm:69
+#: ../IkiWiki/Plugin/poll.pm:70
 msgid "vote"
 msgstr "głosuj"
 
-#: ../IkiWiki/Plugin/poll.pm:77
+#: ../IkiWiki/Plugin/poll.pm:78
 msgid "Total votes:"
 msgstr "Oddane głosy:"
 
-#: ../IkiWiki/Plugin/polygen.pm:41
+#: ../IkiWiki/Plugin/polygen.pm:42
 msgid "polygen not installed"
 msgstr "wtyczka polygen nie jest zainstalowana"
 
-#: ../IkiWiki/Plugin/polygen.pm:60
+#: ../IkiWiki/Plugin/polygen.pm:61
 #, fuzzy
 msgid "command failed"
 msgstr "awaria fortunki"
 
-#: ../IkiWiki/Plugin/postsparkline.pm:46
+#: ../IkiWiki/Plugin/postsparkline.pm:47
 msgid "missing formula"
 msgstr "brakująca reguła"
 
-#: ../IkiWiki/Plugin/postsparkline.pm:53
+#: ../IkiWiki/Plugin/postsparkline.pm:54
 msgid "unknown formula"
 msgstr "nieznana reguła"
 
@@ -775,12 +797,12 @@ msgstr "o północy"
 msgid "at noon on %A"
 msgstr "w południe w %A"
 
-#: ../IkiWiki/Plugin/progress.pm:34
+#: ../IkiWiki/Plugin/progress.pm:35
 #, perl-format
 msgid "illegal percent value %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/progress.pm:55
+#: ../IkiWiki/Plugin/progress.pm:56
 msgid "need either `percent` or `totalpages` and `donepages` parameters"
 msgstr ""
 
@@ -788,42 +810,42 @@ msgstr ""
 msgid "(Diff truncated)"
 msgstr ""
 
-#: ../IkiWiki/Plugin/remove.pm:31 ../IkiWiki/Plugin/rename.pm:36
+#: ../IkiWiki/Plugin/remove.pm:32 ../IkiWiki/Plugin/rename.pm:37
 #, perl-format
 msgid "%s does not exist"
 msgstr ""
 
-#: ../IkiWiki/Plugin/remove.pm:38
+#: ../IkiWiki/Plugin/remove.pm:39
 #, fuzzy, perl-format
 msgid "%s is not in the srcdir, so it cannot be deleted"
 msgstr ""
 "strona %s jest tymczasowo zablokowana przez użytkownika %s i nie może być "
 "teraz edytowana"
 
-#: ../IkiWiki/Plugin/remove.pm:41 ../IkiWiki/Plugin/rename.pm:45
+#: ../IkiWiki/Plugin/remove.pm:42 ../IkiWiki/Plugin/rename.pm:46
 #, fuzzy, perl-format
 msgid "%s is not a file"
 msgstr "Strona %s nie może być edytowana"
 
-#: ../IkiWiki/Plugin/remove.pm:134
+#: ../IkiWiki/Plugin/remove.pm:137
 #, perl-format
 msgid "confirm removal of %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/remove.pm:171
+#: ../IkiWiki/Plugin/remove.pm:174
 msgid "Please select the attachments to remove."
 msgstr ""
 
-#: ../IkiWiki/Plugin/remove.pm:211
+#: ../IkiWiki/Plugin/remove.pm:216
 msgid "removed"
 msgstr ""
 
-#: ../IkiWiki/Plugin/rename.pm:42
+#: ../IkiWiki/Plugin/rename.pm:43
 #, perl-format
 msgid "%s is not in the srcdir, so it cannot be renamed"
 msgstr ""
 
-#: ../IkiWiki/Plugin/rename.pm:62
+#: ../IkiWiki/Plugin/rename.pm:63
 #, fuzzy
 msgid "no change to the file name was specified"
 msgstr "nieokreślona nazwa pliku osłony"
@@ -848,24 +870,24 @@ msgstr ""
 msgid "rename %s"
 msgstr "renderowanie %s"
 
-#: ../IkiWiki/Plugin/rename.pm:161
+#: ../IkiWiki/Plugin/rename.pm:163
 msgid "Also rename SubPages and attachments"
 msgstr ""
 
-#: ../IkiWiki/Plugin/rename.pm:247
+#: ../IkiWiki/Plugin/rename.pm:250
 msgid "Only one attachment can be renamed at a time."
 msgstr ""
 
-#: ../IkiWiki/Plugin/rename.pm:250
+#: ../IkiWiki/Plugin/rename.pm:253
 msgid "Please select the attachment to rename."
 msgstr ""
 
-#: ../IkiWiki/Plugin/rename.pm:347
+#: ../IkiWiki/Plugin/rename.pm:352
 #, perl-format
 msgid "rename %s to %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/rename.pm:571
+#: ../IkiWiki/Plugin/rename.pm:576
 #, fuzzy, perl-format
 msgid "update for rename of %s to %s"
 msgstr "aktualizacja stron wiki %s: %s przez użytkownika %s"
@@ -880,21 +902,21 @@ msgstr "awaria w trakcie odczytu %s: %s"
 msgid "rsync_command exited %d"
 msgstr ""
 
-#: ../IkiWiki/Plugin/search.pm:182
+#: ../IkiWiki/Plugin/search.pm:194
 #, perl-format
 msgid "need Digest::SHA1 to index %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/search.pm:217
+#: ../IkiWiki/Plugin/search.pm:231
 msgid "search"
 msgstr ""
 
-#: ../IkiWiki/Plugin/shortcut.pm:31
+#: ../IkiWiki/Plugin/shortcut.pm:32
 #, perl-format
 msgid "shortcut plugin will not work without %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/shortcut.pm:44
+#: ../IkiWiki/Plugin/shortcut.pm:45
 #, fuzzy
 msgid "missing name or url parameter"
 msgstr "brakujący parametr name lub url"
@@ -902,7 +924,7 @@ msgstr "brakujący parametr name lub url"
 #. translators: This is used to display what shortcuts are defined.
 #. translators: First parameter is the name of the shortcut, the second
 #. translators: is an URL.
-#: ../IkiWiki/Plugin/shortcut.pm:54
+#: ../IkiWiki/Plugin/shortcut.pm:55
 #, fuzzy, perl-format
 msgid "shortcut %s points to <i>%s</i>"
 msgstr "skrót %s wskazuje na adres <i>%s</i>"
@@ -912,124 +934,126 @@ msgstr "skrót %s wskazuje na adres <i>%s</i>"
 msgid "failed to parse any smileys"
 msgstr "awaria w trakcie przetwarzania emitoikonki"
 
-#: ../IkiWiki/Plugin/sparkline.pm:72
+#: ../IkiWiki/Plugin/sparkline.pm:73
 #, fuzzy
 msgid "parse error"
 msgstr "błąd w trakcie przetwarzania"
 
-#: ../IkiWiki/Plugin/sparkline.pm:78
+#: ../IkiWiki/Plugin/sparkline.pm:79
 #, fuzzy
 msgid "invalid featurepoint diameter"
 msgstr "nieprawidłowa średnica dla featurepoint"
 
-#: ../IkiWiki/Plugin/sparkline.pm:88
+#: ../IkiWiki/Plugin/sparkline.pm:89
 #, fuzzy
 msgid "invalid featurepoint location"
 msgstr "nieprawidłowe położenie dla featurepoint"
 
-#: ../IkiWiki/Plugin/sparkline.pm:99
+#: ../IkiWiki/Plugin/sparkline.pm:100
 msgid "missing values"
 msgstr "brakujące wartości"
 
-#: ../IkiWiki/Plugin/sparkline.pm:104
+#: ../IkiWiki/Plugin/sparkline.pm:105
 #, fuzzy
 msgid "invalid height value"
 msgstr "nieprawidłowa wysokość"
 
-#: ../IkiWiki/Plugin/sparkline.pm:111
+#: ../IkiWiki/Plugin/sparkline.pm:112
 #, fuzzy
 msgid "missing width parameter"
 msgstr "brakujący parametr width"
 
-#: ../IkiWiki/Plugin/sparkline.pm:115
+#: ../IkiWiki/Plugin/sparkline.pm:116
 #, fuzzy
 msgid "invalid width value"
 msgstr "nieprawidłowa szerokość"
 
-#: ../IkiWiki/Plugin/sparkline.pm:153
+#: ../IkiWiki/Plugin/sparkline.pm:154
 #, fuzzy
 msgid "failed to run php"
 msgstr "awaria w trakcie uruchamiania php"
 
-#: ../IkiWiki/Plugin/table.pm:31
+#: ../IkiWiki/Plugin/table.pm:32
 msgid "cannot find file"
 msgstr "nie można znaleźć pliku"
 
-#: ../IkiWiki/Plugin/table.pm:87
+#: ../IkiWiki/Plugin/table.pm:88
 msgid "unknown data format"
 msgstr "nieznany format danych"
 
-#: ../IkiWiki/Plugin/table.pm:95
+#: ../IkiWiki/Plugin/table.pm:96
 msgid "empty data"
 msgstr "brak danych"
 
-#: ../IkiWiki/Plugin/table.pm:114
+#: ../IkiWiki/Plugin/table.pm:115
 msgid "Direct data download"
 msgstr "Bezpośrednie pobieranie danych"
 
-#: ../IkiWiki/Plugin/table.pm:148
+#: ../IkiWiki/Plugin/table.pm:149
 #, fuzzy, perl-format
 msgid "parse fail at line %d: %s"
 msgstr "awaria w trakcie przetwarzania linii %d: %s"
 
-#: ../IkiWiki/Plugin/template.pm:29
+#: ../IkiWiki/Plugin/tag.pm:83
+#, fuzzy, perl-format
+msgid "creating tag page %s"
+msgstr "tworzenie nowej strony %s"
+
+#: ../IkiWiki/Plugin/template.pm:33
 #, fuzzy
 msgid "missing id parameter"
 msgstr "brakujący parametr id"
 
-#: ../IkiWiki/Plugin/template.pm:36
-#, perl-format
-msgid "template %s not found"
-msgstr "nieznaleziony szablon %s"
-
-#: ../IkiWiki/Plugin/template.pm:55
-#, fuzzy
-msgid "failed to process:"
-msgstr "awaria w trakcie przetwarzania:"
+#: ../IkiWiki/Plugin/template.pm:47
+#, fuzzy, perl-format
+msgid "%s not found"
+msgstr "nie znaleziono %s"
 
-#: ../IkiWiki/Plugin/teximg.pm:70
+#: ../IkiWiki/Plugin/teximg.pm:72
 #, fuzzy
 msgid "missing tex code"
 msgstr "brakujące wartości"
 
-#: ../IkiWiki/Plugin/teximg.pm:122
+#: ../IkiWiki/Plugin/teximg.pm:124
 #, fuzzy
 msgid "failed to generate image from code"
 msgstr "awaria w trakcie zmiany rozmiaru: %s"
 
-#: ../IkiWiki/Plugin/websetup.pm:89
-msgid "plugin"
+#: ../IkiWiki/Plugin/websetup.pm:105
+#, perl-format
+msgid "%s plugin:"
+msgstr ""
+
+#: ../IkiWiki/Plugin/websetup.pm:121
+#, perl-format
+msgid "%s plugins"
 msgstr ""
 
-#: ../IkiWiki/Plugin/websetup.pm:108
+#: ../IkiWiki/Plugin/websetup.pm:135
 #, perl-format
 msgid "enable %s?"
 msgstr ""
 
-#: ../IkiWiki/Plugin/websetup.pm:240
+#: ../IkiWiki/Plugin/websetup.pm:276
 msgid "setup file for this wiki is not known"
 msgstr ""
 
-#: ../IkiWiki/Plugin/websetup.pm:256
+#: ../IkiWiki/Plugin/websetup.pm:292
 msgid "main"
 msgstr ""
 
-#: ../IkiWiki/Plugin/websetup.pm:257
-msgid "plugins"
-msgstr ""
-
-#: ../IkiWiki/Plugin/websetup.pm:395
+#: ../IkiWiki/Plugin/websetup.pm:435
 msgid ""
 "The configuration changes shown below require a wiki rebuild to take effect."
 msgstr ""
 
-#: ../IkiWiki/Plugin/websetup.pm:399
+#: ../IkiWiki/Plugin/websetup.pm:439
 msgid ""
 "For the configuration changes shown below to fully take effect, you may need "
 "to rebuild the wiki."
 msgstr ""
 
-#: ../IkiWiki/Plugin/websetup.pm:436
+#: ../IkiWiki/Plugin/websetup.pm:476
 #, perl-format
 msgid "Error: %s exited nonzero (%s). Discarding setup changes."
 msgstr ""
@@ -1044,79 +1068,94 @@ msgstr ""
 msgid "bad file name %s"
 msgstr "pomijanie nieprawidłowej nazwy pliku %s"
 
-#: ../IkiWiki/Render.pm:150
+#: ../IkiWiki/Render.pm:158
 #, perl-format
 msgid "scanning %s"
 msgstr "skanowanie %s"
 
-#: ../IkiWiki/Render.pm:271
+#: ../IkiWiki/Render.pm:280
 #, perl-format
 msgid ""
 "symlink found in srcdir path (%s) -- set allow_symlinks_before_srcdir to "
 "allow this"
 msgstr ""
 
-#: ../IkiWiki/Render.pm:300 ../IkiWiki/Render.pm:327
+#: ../IkiWiki/Render.pm:311
 #, perl-format
 msgid "skipping bad filename %s"
 msgstr "pomijanie nieprawidłowej nazwy pliku %s"
 
-#: ../IkiWiki/Render.pm:305
+#: ../IkiWiki/Render.pm:327
 #, perl-format
 msgid "%s has multiple possible source pages"
 msgstr ""
 
-#: ../IkiWiki/Render.pm:395
+#: ../IkiWiki/Render.pm:369
 #, perl-format
-msgid "removing old page %s"
+msgid "querying %s for file creation and modification times.."
+msgstr ""
+
+#: ../IkiWiki/Render.pm:431
+#, fuzzy, perl-format
+msgid "removing obsolete %s"
 msgstr "usuwanie starej strony %s"
 
-#: ../IkiWiki/Render.pm:471
+#: ../IkiWiki/Render.pm:505
 #, fuzzy, perl-format
 msgid "building %s, which links to %s"
 msgstr "renderowanie %s z odnośnikiem do %s"
 
-#: ../IkiWiki/Render.pm:480
+#: ../IkiWiki/Render.pm:514
 #, fuzzy, perl-format
 msgid "removing %s, no longer built by %s"
 msgstr "usuwanie %s nie tworzonego już przez %s"
 
-#: ../IkiWiki/Render.pm:603
+#: ../IkiWiki/Render.pm:597 ../IkiWiki/Render.pm:679
 #, fuzzy, perl-format
 msgid "building %s, which depends on %s"
 msgstr "renderowanie %s zależącego od %s"
 
-#: ../IkiWiki/Render.pm:616
+#: ../IkiWiki/Render.pm:692
 #, fuzzy, perl-format
 msgid "building %s, to update its backlinks"
 msgstr "renderowanie %s w celu aktualizacji powrotnych odnośników"
 
-#: ../IkiWiki/Render.pm:679
+#: ../IkiWiki/Render.pm:821
 #, fuzzy, perl-format
 msgid "ikiwiki: cannot build %s"
 msgstr "ikiwiki: awaria w trakcie tworzenia %s"
 
 #. translators: The first parameter is a filename, and the second
 #. translators: is a (probably not translated) error message.
-#: ../IkiWiki/Setup.pm:19
+#: ../IkiWiki/Setup.pm:23
 #, perl-format
 msgid "cannot read %s: %s"
 msgstr "awaria w trakcie odczytu %s: %s"
 
-#: ../IkiWiki/Setup/Automator.pm:33
+#: ../IkiWiki/Setup.pm:34
+#, fuzzy, perl-format
+msgid "cannot load %s in safe mode"
+msgstr "awaria w trakcie odczytu %s: %s"
+
+#: ../IkiWiki/Setup.pm:47
+#, fuzzy, perl-format
+msgid "failed to parse %s"
+msgstr "awaria w trakcie kompilowania %s"
+
+#: ../IkiWiki/Setup/Automator.pm:34
 msgid "you must enter a wikiname (that contains alphanumerics)"
 msgstr ""
 
-#: ../IkiWiki/Setup/Automator.pm:76
+#: ../IkiWiki/Setup/Automator.pm:89
 #, perl-format
 msgid "unsupported revision control system %s"
 msgstr ""
 
-#: ../IkiWiki/Setup/Automator.pm:102
+#: ../IkiWiki/Setup/Automator.pm:115
 msgid "failed to set up the repository with ikiwiki-makerepo"
 msgstr ""
 
-#: ../IkiWiki/Setup/Automator.pm:120
+#: ../IkiWiki/Setup/Automator.pm:134
 #, perl-format
 msgid "** Disabling plugin %s, since it is failing with this message:"
 msgstr ""
@@ -1135,13 +1174,13 @@ msgid "wrapper filename not specified"
 msgstr "nieokreślona nazwa pliku osłony"
 
 #. translators: The parameter is a C filename.
-#: ../IkiWiki/Wrapper.pm:149
+#: ../IkiWiki/Wrapper.pm:160
 #, perl-format
 msgid "failed to compile %s"
 msgstr "awaria w trakcie kompilowania %s"
 
 #. translators: The parameter is a filename.
-#: ../IkiWiki/Wrapper.pm:169
+#: ../IkiWiki/Wrapper.pm:180
 #, perl-format
 msgid "successfully generated %s"
 msgstr "pomyślnie utworzono %s"
@@ -1154,60 +1193,65 @@ msgstr "użycie: ikiwiki [parametry] źródło cel"
 msgid "       ikiwiki --setup configfile"
 msgstr ""
 
-#: ../ikiwiki.in:91
+#: ../ikiwiki.in:96
 msgid "usage: --set var=value"
 msgstr ""
 
-#: ../ikiwiki.in:140
+#: ../ikiwiki.in:103
+msgid "usage: --set-yaml var=value"
+msgstr ""
+
+#: ../ikiwiki.in:157
 msgid "generating wrappers.."
 msgstr "tworzenie osłon..."
 
-#: ../ikiwiki.in:195
+#: ../ikiwiki.in:220
 msgid "rebuilding wiki.."
 msgstr "przebudowywanie wiki..."
 
-#: ../ikiwiki.in:198
+#: ../ikiwiki.in:223
 msgid "refreshing wiki.."
 msgstr "odświeżanie wiki..."
 
-#: ../IkiWiki.pm:238
+#: ../IkiWiki.pm:232
 msgid "Discussion"
 msgstr "Dyskusja"
 
-#: ../IkiWiki.pm:507
+#: ../IkiWiki.pm:531
 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:553
+#: ../IkiWiki.pm:577
 msgid "cannot use multiple rcs plugins"
 msgstr ""
 
-#: ../IkiWiki.pm:582
+#: ../IkiWiki.pm:606
 #, perl-format
 msgid "failed to load external plugin needed for %s plugin: %s"
 msgstr ""
 
-#: ../IkiWiki.pm:1264
+#: ../IkiWiki.pm:1298
 #, 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:1863
+#: ../IkiWiki.pm:1993
 msgid "yes"
 msgstr ""
 
-#: ../IkiWiki.pm:2006
-msgid "Sort::Naturally needed for title_natural sort"
-msgstr ""
+#: ../IkiWiki.pm:2070
+#, fuzzy, perl-format
+msgid "invalid sort type %s"
+msgstr "nieznany sposób sortowania %s"
 
-#: ../IkiWiki.pm:2017
+#: ../IkiWiki.pm:2091
 #, perl-format
 msgid "unknown sort type %s"
 msgstr "nieznany sposób sortowania %s"
 
-#: ../IkiWiki.pm:2036
+#: ../IkiWiki.pm:2227
 #, fuzzy, perl-format
 msgid "cannot match pages: %s"
 msgstr "awaria w trakcie odczytu %s: %s"
@@ -1232,6 +1276,26 @@ msgstr ""
 msgid "What is the domain name of the web server?"
 msgstr ""
 
+#~ msgid "You need to log in first."
+#~ msgstr "Proszę najpierw zalogować się."
+
+#~ msgid "Get an OpenID"
+#~ msgstr "Pobierz OpenID"
+
+#, fuzzy
+#~ msgid "failed to process"
+#~ msgstr "awaria w trakcie przetwarzania:"
+
+#~ msgid "nonexistant template %s"
+#~ msgstr "brakujący szablon %s"
+
+#~ msgid "getctime not implemented"
+#~ msgstr "niedostępna funkcja getctime"
+
+#, fuzzy
+#~ msgid "failed to read %s"
+#~ msgstr "awaria w trakcie odczytu %s: %s"
+
 #~ msgid "discussion"
 #~ msgstr "dyskusja"
 
@@ -1285,10 +1349,6 @@ msgstr ""
 #~ "Brak możliwości wysłania powiadomień od Subversion przez \"haczyk\" post-"
 #~ "commit z powodu nieustawionego parametru REV"
 
-#, fuzzy
-#~ msgid "%s not found"
-#~ msgstr "nie znaleziono %s"
-
 #~ msgid "What's this?"
 #~ msgstr "Więcej o OpenID"
 
index 21a65ae5db4e02af1fb0e87040b162d94abc7170..6288101e84ef11f766f9f3fb00013a9b04e1e74a 100644 (file)
--- a/po/sv.po
+++ b/po/sv.po
@@ -7,54 +7,51 @@ msgid ""
 msgstr ""
 "Project-Id-Version: ikiwiki\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-10-31 18:31-0400\n"
+"POT-Creation-Date: 2010-06-10 15:02-0400\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"
+"Language: sv\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=utf-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: ../IkiWiki/CGI.pm:114
-msgid "You need to log in first."
-msgstr "Du måste logga in först."
-
-#: ../IkiWiki/CGI.pm:147
+#: ../IkiWiki/CGI.pm:162
 msgid ""
 "probable misconfiguration: sslcookie is set, but you are attempting to login "
 "via http, not https"
 msgstr ""
 
-#: ../IkiWiki/CGI.pm:150
+#: ../IkiWiki/CGI.pm:165
 msgid "login failed, perhaps you need to turn on cookies?"
 msgstr ""
 
-#: ../IkiWiki/CGI.pm:169 ../IkiWiki/CGI.pm:314
+#: ../IkiWiki/CGI.pm:184 ../IkiWiki/CGI.pm:335
 msgid "Your login session has expired."
 msgstr ""
 
-#: ../IkiWiki/CGI.pm:190
+#: ../IkiWiki/CGI.pm:205
 msgid "Login"
 msgstr ""
 
-#: ../IkiWiki/CGI.pm:191
+#: ../IkiWiki/CGI.pm:206
 #, fuzzy
 msgid "Preferences"
 msgstr "Inställningar sparades."
 
-#: ../IkiWiki/CGI.pm:192
+#: ../IkiWiki/CGI.pm:207
 msgid "Admin"
 msgstr ""
 
-#: ../IkiWiki/CGI.pm:232
+#: ../IkiWiki/CGI.pm:247
 msgid "Preferences saved."
 msgstr "Inställningar sparades."
 
-#: ../IkiWiki/CGI.pm:278
+#: ../IkiWiki/CGI.pm:299
 msgid "You are banned."
 msgstr "Du är bannlyst."
 
-#: ../IkiWiki/CGI.pm:405 ../IkiWiki/CGI.pm:406 ../IkiWiki.pm:1282
+#: ../IkiWiki/CGI.pm:426 ../IkiWiki/CGI.pm:427 ../IkiWiki.pm:1316
 msgid "Error"
 msgstr "Fel"
 
@@ -136,7 +133,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:231
 msgid "done"
 msgstr "klar"
 
@@ -145,43 +142,43 @@ msgstr "klar"
 msgid "Must specify %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:136
+#: ../IkiWiki/Plugin/amazon_s3.pm:140
 #, fuzzy
 msgid "Failed to create S3 bucket: "
 msgstr "Misslyckades med att skicka e-post"
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:221
+#: ../IkiWiki/Plugin/amazon_s3.pm:225
 #, fuzzy
 msgid "Failed to save file to S3: "
 msgstr "Misslyckades med att skicka e-post"
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:243
+#: ../IkiWiki/Plugin/amazon_s3.pm:247
 #, fuzzy
 msgid "Failed to delete file from S3: "
 msgstr "misslyckades med att skriva %s: %s"
 
-#: ../IkiWiki/Plugin/attachment.pm:49
+#: ../IkiWiki/Plugin/attachment.pm:50
 #, perl-format
 msgid "there is already a page named %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/attachment.pm:65
+#: ../IkiWiki/Plugin/attachment.pm:66
 msgid "prohibited by allowed_attachments"
 msgstr ""
 
-#: ../IkiWiki/Plugin/attachment.pm:140
+#: ../IkiWiki/Plugin/attachment.pm:141
 msgid "bad attachment filename"
 msgstr ""
 
-#: ../IkiWiki/Plugin/attachment.pm:182
+#: ../IkiWiki/Plugin/attachment.pm:183
 msgid "attachment upload"
 msgstr ""
 
-#: ../IkiWiki/Plugin/autoindex.pm:105
+#: ../IkiWiki/Plugin/autoindex.pm:117
 msgid "automatic index generation"
 msgstr ""
 
-#: ../IkiWiki/Plugin/blogspam.pm:108
+#: ../IkiWiki/Plugin/blogspam.pm:109
 msgid ""
 "Sorry, but that looks like spam to <a href=\"http://blogspam.net/"
 "\">blogspam</a>: "
@@ -196,198 +193,218 @@ msgstr ""
 msgid "There are no broken links!"
 msgstr "Det finns inga trasiga länkar!"
 
-#: ../IkiWiki/Plugin/comments.pm:124 ../IkiWiki/Plugin/format.pm:38
+#: ../IkiWiki/Plugin/comments.pm:112
+#, fuzzy, perl-format
+msgid "this comment needs %s"
+msgstr "skapar %s"
+
+#: ../IkiWiki/Plugin/comments.pm:115
+msgid "moderation"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:136 ../IkiWiki/Plugin/format.pm:48
 #, perl-format
 msgid "unsupported page format %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:129
+#: ../IkiWiki/Plugin/comments.pm:141
 msgid "comment must have content"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:185
+#: ../IkiWiki/Plugin/comments.pm:196
 msgid "Anonymous"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:340 ../IkiWiki/Plugin/editpage.pm:97
+#: ../IkiWiki/Plugin/comments.pm:357 ../IkiWiki/Plugin/editpage.pm:98
 msgid "bad page name"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:345
+#: ../IkiWiki/Plugin/comments.pm:362
 #, fuzzy, perl-format
 msgid "commenting on %s"
 msgstr "skapar %s"
 
-#: ../IkiWiki/Plugin/comments.pm:363
+#: ../IkiWiki/Plugin/comments.pm:380
 #, perl-format
 msgid "page '%s' doesn't exist, so you can't comment"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:370
+#: ../IkiWiki/Plugin/comments.pm:387
 #, perl-format
 msgid "comments on page '%s' are closed"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:464
+#: ../IkiWiki/Plugin/comments.pm:491
 msgid "comment stored for moderation"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:466
+#: ../IkiWiki/Plugin/comments.pm:493
 msgid "Your comment will be posted after moderator review"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:479
+#: ../IkiWiki/Plugin/comments.pm:506
 msgid "Added a comment"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:483
+#: ../IkiWiki/Plugin/comments.pm:510
 #, perl-format
 msgid "Added a comment: %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:525 ../IkiWiki/Plugin/websetup.pm:236
+#: ../IkiWiki/Plugin/comments.pm:552 ../IkiWiki/Plugin/websetup.pm:272
 msgid "you are not logged in as an admin"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:576
+#: ../IkiWiki/Plugin/comments.pm:603
 msgid "Comment moderation"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:615
+#: ../IkiWiki/Plugin/comments.pm:641
 msgid "comment moderation"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:766
-msgid "Comments"
+#: ../IkiWiki/Plugin/comments.pm:790
+#, perl-format
+msgid "%i comment"
+msgid_plural "%i comments"
+msgstr[0] ""
+msgstr[1] ""
+
+#. translators: Here "Comment" is a verb;
+#. translators: the user clicks on it to
+#. translators: post a comment.
+#: ../IkiWiki/Plugin/comments.pm:800
+msgid "Comment"
 msgstr ""
 
-#: ../IkiWiki/Plugin/conditional.pm:27 ../IkiWiki/Plugin/cutpaste.pm:30
-#: ../IkiWiki/Plugin/cutpaste.pm:45 ../IkiWiki/Plugin/cutpaste.pm:61
+#: ../IkiWiki/Plugin/conditional.pm:28 ../IkiWiki/Plugin/cutpaste.pm:31
+#: ../IkiWiki/Plugin/cutpaste.pm:46 ../IkiWiki/Plugin/cutpaste.pm:62
 #: ../IkiWiki/Plugin/testpagespec.pm:26
 #, perl-format
 msgid "%s parameter is required"
 msgstr ""
 
-#: ../IkiWiki/Plugin/cutpaste.pm:66
+#: ../IkiWiki/Plugin/cutpaste.pm:67
 msgid "no text was copied in this page"
 msgstr ""
 
-#: ../IkiWiki/Plugin/cutpaste.pm:69
+#: ../IkiWiki/Plugin/cutpaste.pm:70
 #, perl-format
 msgid "no text was copied in this page with id %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/editpage.pm:40
+#: ../IkiWiki/Plugin/editpage.pm:41
 #, fuzzy, perl-format
 msgid "removing old preview %s"
 msgstr "tar bort gammal sida %s"
 
-#: ../IkiWiki/Plugin/editpage.pm:113
+#: ../IkiWiki/Plugin/editpage.pm:114
 #, perl-format
 msgid "%s is not an editable page"
 msgstr ""
 
-#: ../IkiWiki/Plugin/editpage.pm:292
+#: ../IkiWiki/Plugin/editpage.pm:294
 #, perl-format
 msgid "creating %s"
 msgstr "skapar %s"
 
-#: ../IkiWiki/Plugin/editpage.pm:310 ../IkiWiki/Plugin/editpage.pm:329
-#: ../IkiWiki/Plugin/editpage.pm:339 ../IkiWiki/Plugin/editpage.pm:383
-#: ../IkiWiki/Plugin/editpage.pm:422
+#: ../IkiWiki/Plugin/editpage.pm:312 ../IkiWiki/Plugin/editpage.pm:334
+#: ../IkiWiki/Plugin/editpage.pm:345 ../IkiWiki/Plugin/editpage.pm:390
+#: ../IkiWiki/Plugin/editpage.pm:429
 #, perl-format
 msgid "editing %s"
 msgstr "redigerar %s"
 
-#: ../IkiWiki/Plugin/edittemplate.pm:51
+#: ../IkiWiki/Plugin/edittemplate.pm:52
 #, fuzzy
 msgid "template not specified"
 msgstr "mallen %s hittades inte"
 
-#: ../IkiWiki/Plugin/edittemplate.pm:54
+#: ../IkiWiki/Plugin/edittemplate.pm:55
 #, fuzzy
 msgid "match not specified"
 msgstr "filnamn för wrapper har inte angivits"
 
-#: ../IkiWiki/Plugin/edittemplate.pm:63
+#: ../IkiWiki/Plugin/edittemplate.pm:64
 #, perl-format
 msgid "edittemplate %s registered for %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/edittemplate.pm:137
+#: ../IkiWiki/Plugin/edittemplate.pm:125 ../IkiWiki/Plugin/inline.pm:339
+#: ../IkiWiki/Plugin/template.pm:44
 #, fuzzy
-msgid "failed to process"
+msgid "failed to process template:"
 msgstr "misslyckades med att behandla mall:"
 
-#: ../IkiWiki/Plugin/format.pm:20
+#: ../IkiWiki/Plugin/format.pm:30
 msgid "must specify format and text"
 msgstr ""
 
-#: ../IkiWiki/Plugin/fortune.pm:27
+#: ../IkiWiki/Plugin/fortune.pm:28
 msgid "fortune failed"
 msgstr "fortune misslyckades"
 
-#: ../IkiWiki/Plugin/getsource.pm:62 ../IkiWiki/Plugin/goto.pm:55
+#: ../IkiWiki/Plugin/getsource.pm:64 ../IkiWiki/Plugin/goto.pm:58
 #, fuzzy
 msgid "missing page"
 msgstr "mall saknar id-parameter"
 
-#: ../IkiWiki/Plugin/getsource.pm:64 ../IkiWiki/Plugin/goto.pm:57
+#: ../IkiWiki/Plugin/getsource.pm:66 ../IkiWiki/Plugin/goto.pm:60
 #, perl-format
 msgid "The page %s does not exist."
 msgstr ""
 
-#: ../IkiWiki/Plugin/getsource.pm:73
+#: ../IkiWiki/Plugin/getsource.pm:75
 #, fuzzy
 msgid "not a page"
 msgstr "kan inte läsa %s: %s"
 
-#: ../IkiWiki/Plugin/getsource.pm:75
+#: ../IkiWiki/Plugin/getsource.pm:77
 #, perl-format
 msgid "%s is an attachment, not a page."
 msgstr ""
 
-#: ../IkiWiki/Plugin/git.pm:651 ../IkiWiki/Plugin/git.pm:669
+#: ../IkiWiki/Plugin/git.pm:687 ../IkiWiki/Plugin/git.pm:705
 #: ../IkiWiki/Receive.pm:130
 #, perl-format
 msgid "you are not allowed to change %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/git.pm:691
+#: ../IkiWiki/Plugin/git.pm:727
 #, perl-format
 msgid "you cannot act on a file with mode %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/git.pm:695
+#: ../IkiWiki/Plugin/git.pm:731
 msgid "you are not allowed to change file modes"
 msgstr ""
 
-#: ../IkiWiki/Plugin/google.pm:25 ../IkiWiki/Plugin/po.pm:131
-#: ../IkiWiki/Plugin/search.pm:36
+#: ../IkiWiki/Plugin/google.pm:26 ../IkiWiki/Plugin/po.pm:134
+#: ../IkiWiki/Plugin/search.pm:37
 #, fuzzy, perl-format
 msgid "Must specify %s when using the %s plugin"
 msgstr "Måste ange %s när sökinsticket används"
 
-#: ../IkiWiki/Plugin/graphviz.pm:67
+#: ../IkiWiki/Plugin/graphviz.pm:68
 #, fuzzy
 msgid "failed to run graphviz"
 msgstr "linkmap misslyckades att köra dot"
 
-#: ../IkiWiki/Plugin/graphviz.pm:94
+#: ../IkiWiki/Plugin/graphviz.pm:91
 msgid "prog not a valid graphviz program"
 msgstr ""
 
-#: ../IkiWiki/Plugin/highlight.pm:47
+#: ../IkiWiki/Plugin/highlight.pm:48
 #, perl-format
 msgid "tohighlight contains unknown file type '%s'"
 msgstr ""
 
-#: ../IkiWiki/Plugin/highlight.pm:58
+#: ../IkiWiki/Plugin/highlight.pm:59
 #, perl-format
 msgid "Source code: %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/highlight.pm:123
+#: ../IkiWiki/Plugin/highlight.pm:124
 msgid ""
 "warning: highlight perl module not available; falling back to pass through"
 msgstr ""
@@ -397,108 +414,117 @@ msgstr ""
 msgid "htmltidy failed to parse this html"
 msgstr "misslyckades med att tolka smilisar, inaktiverar instick"
 
-#: ../IkiWiki/Plugin/img.pm:64
+#: ../IkiWiki/Plugin/img.pm:69
 #, fuzzy
 msgid "Image::Magick is not installed"
 msgstr "polygen inte installerad"
 
-#: ../IkiWiki/Plugin/img.pm:68 ../IkiWiki/Plugin/img.pm:112
+#: ../IkiWiki/Plugin/img.pm:73 ../IkiWiki/Plugin/img.pm:117
 #, fuzzy, perl-format
 msgid "failed to read %s: %s"
 msgstr "misslyckades med att skriva %s: %s"
 
-#: ../IkiWiki/Plugin/img.pm:74
+#: ../IkiWiki/Plugin/img.pm:79
 #, perl-format
 msgid "wrong size format \"%s\" (should be WxH)"
 msgstr ""
 
-#: ../IkiWiki/Plugin/img.pm:120
+#: ../IkiWiki/Plugin/img.pm:122
 #, fuzzy, perl-format
 msgid "failed to resize: %s"
 msgstr "misslyckades med att skriva %s: %s"
 
-#: ../IkiWiki/Plugin/img.pm:140
+#: ../IkiWiki/Plugin/img.pm:146
 #, fuzzy, perl-format
 msgid "failed to determine size of image %s"
 msgstr "misslyckades med att skriva %s: %s"
 
-#: ../IkiWiki/Plugin/inline.pm:92
+#: ../IkiWiki/Plugin/inline.pm:93
 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:138
+#: ../IkiWiki/Plugin/inline.pm:139
 #, fuzzy
 msgid "page editing not allowed"
 msgstr "mallen %s hittades inte"
 
-#: ../IkiWiki/Plugin/inline.pm:155
+#: ../IkiWiki/Plugin/inline.pm:156
 #, fuzzy
 msgid "missing pages parameter"
 msgstr "mall saknar id-parameter"
 
-#: ../IkiWiki/Plugin/inline.pm:191
+#: ../IkiWiki/Plugin/inline.pm:192
 #, perl-format
 msgid "the %s and %s parameters cannot be used together"
 msgstr ""
 
-#: ../IkiWiki/Plugin/inline.pm:312
+#: ../IkiWiki/Plugin/inline.pm:313
 msgid "Add a new post titled:"
 msgstr ""
 
-#: ../IkiWiki/Plugin/inline.pm:332
+#: ../IkiWiki/Plugin/inline.pm:342
 #, perl-format
-msgid "nonexistant template %s"
-msgstr ""
+msgid "template %s not found"
+msgstr "mallen %s hittades inte"
 
-#: ../IkiWiki/Plugin/inline.pm:598
+#: ../IkiWiki/Plugin/inline.pm:633
 msgid "RPC::XML::Client not found, not pinging"
 msgstr "RPC::XML::Client hittades inte, pingar inte"
 
-#: ../IkiWiki/Plugin/linkmap.pm:101
+#: ../IkiWiki/Plugin/linkmap.pm:81 ../IkiWiki/Plugin/linkmap.pm:88
+#: ../IkiWiki/Plugin/linkmap.pm:92 ../IkiWiki/Plugin/linkmap.pm:95
 #, fuzzy
 msgid "failed to run dot"
 msgstr "linkmap misslyckades att köra dot"
 
-#: ../IkiWiki/Plugin/lockedit.pm:47
+#: ../IkiWiki/Plugin/linkmap.pm:85
+msgid "linkmap"
+msgstr ""
+
+#: ../IkiWiki/Plugin/lockedit.pm:49
 #, fuzzy, perl-format
 msgid "%s is locked and cannot be edited"
 msgstr "%s är låst av %s och kan inte redigeras"
 
-#: ../IkiWiki/Plugin/mdwn.pm:44
+#: ../IkiWiki/Plugin/mdwn.pm:45
 msgid "multimarkdown is enabled, but Text::MultiMarkdown is not installed"
 msgstr ""
 
-#: ../IkiWiki/Plugin/mdwn.pm:69
+#: ../IkiWiki/Plugin/mdwn.pm:70
 #, perl-format
 msgid "failed to load Markdown.pm perl module (%s) or /usr/bin/markdown (%s)"
 msgstr ""
 "misslyckades med att läsa in Perl-modulen Markdown.pm (%s) eller /usr/bin/"
 "markdown (%s)"
 
-#: ../IkiWiki/Plugin/meta.pm:161
+#: ../IkiWiki/Plugin/meta.pm:174
 #, fuzzy
 msgid "stylesheet not found"
 msgstr "mallen %s hittades inte"
 
-#: ../IkiWiki/Plugin/meta.pm:199
+#: ../IkiWiki/Plugin/meta.pm:212
 #, fuzzy
 msgid "redir page not found"
 msgstr "mallen %s hittades inte"
 
-#: ../IkiWiki/Plugin/meta.pm:213
+#: ../IkiWiki/Plugin/meta.pm:226
 #, fuzzy
 msgid "redir cycle is not allowed"
 msgstr "mallen %s hittades inte"
 
-#: ../IkiWiki/Plugin/mirrorlist.pm:43
+#: ../IkiWiki/Plugin/meta.pm:387
+msgid "sort=meta requires a parameter"
+msgstr ""
+
+#: ../IkiWiki/Plugin/mirrorlist.pm:44
 msgid "Mirrors"
 msgstr "Speglar"
 
-#: ../IkiWiki/Plugin/mirrorlist.pm:43
+#: ../IkiWiki/Plugin/mirrorlist.pm:44
 msgid "Mirror"
 msgstr "Spegel"
 
-#: ../IkiWiki/Plugin/moderatedcomments.pm:41
+#: ../IkiWiki/Plugin/moderatedcomments.pm:57
 msgid "comment needs moderation"
 msgstr ""
 
@@ -506,19 +532,12 @@ msgstr ""
 msgid "more"
 msgstr ""
 
-#: ../IkiWiki/Plugin/norcs.pm:65
-msgid "getctime not implemented"
-msgstr "getctime inte implementerad"
-
-#: ../IkiWiki/Plugin/openid.pm:61
-msgid "Log in with"
-msgstr ""
-
-#: ../IkiWiki/Plugin/openid.pm:64
-msgid "Get an OpenID"
-msgstr "Skaffa ett OpenID"
+#: ../IkiWiki/Plugin/openid.pm:58
+#, fuzzy, perl-format
+msgid "failed to load openid module: "
+msgstr "misslyckades med att kompilera %s"
 
-#: ../IkiWiki/Plugin/orphans.pm:55
+#: ../IkiWiki/Plugin/orphans.pm:56
 #, fuzzy
 msgid "All pages have other pages linking to them."
 msgstr "Alla sidor länkas till av andra sidor."
@@ -527,31 +546,39 @@ msgstr "Alla sidor länkas till av andra sidor."
 msgid "bad or missing template"
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:248
+#: ../IkiWiki/Plugin/passwordauth.pm:231
+msgid "Your user page: "
+msgstr ""
+
+#: ../IkiWiki/Plugin/passwordauth.pm:238
+msgid "Create your user page"
+msgstr ""
+
+#: ../IkiWiki/Plugin/passwordauth.pm:268
 msgid "Account creation successful. Now you can Login."
 msgstr "Kontot har skapats. Du kan nu logga in."
 
-#: ../IkiWiki/Plugin/passwordauth.pm:251
+#: ../IkiWiki/Plugin/passwordauth.pm:271
 msgid "Error creating account."
 msgstr "Fel vid skapandet av konto."
 
-#: ../IkiWiki/Plugin/passwordauth.pm:258
+#: ../IkiWiki/Plugin/passwordauth.pm:278
 msgid "No email address, so cannot email password reset instructions."
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:292
+#: ../IkiWiki/Plugin/passwordauth.pm:312
 msgid "Failed to send mail"
 msgstr "Misslyckades med att skicka e-post"
 
-#: ../IkiWiki/Plugin/passwordauth.pm:294
+#: ../IkiWiki/Plugin/passwordauth.pm:314
 msgid "You have been mailed password reset instructions."
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:329
+#: ../IkiWiki/Plugin/passwordauth.pm:349
 msgid "incorrect password reset url"
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:332
+#: ../IkiWiki/Plugin/passwordauth.pm:352
 msgid "password reset denied"
 msgstr ""
 
@@ -582,124 +609,119 @@ msgstr "RPC::XML::Client hittades inte, pingar inte"
 msgid "warning: Old po4a detected! Recommend upgrade to 0.35."
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:138
+#: ../IkiWiki/Plugin/po.pm:142
 #, perl-format
 msgid "%s is not a valid language code"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:150
+#: ../IkiWiki/Plugin/po.pm:154
 #, perl-format
 msgid ""
 "%s is not a valid value for po_link_to, falling back to po_link_to=default"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:155
+#: ../IkiWiki/Plugin/po.pm:159
 msgid ""
 "po_link_to=negotiated requires usedirs to be enabled, falling back to "
 "po_link_to=default"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:385
+#: ../IkiWiki/Plugin/po.pm:390
 #, perl-format
 msgid "rebuilding all pages to fix meta titles"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:389 ../IkiWiki/Render.pm:638
+#: ../IkiWiki/Plugin/po.pm:394 ../IkiWiki/Render.pm:769
 #, fuzzy, perl-format
 msgid "building %s"
 msgstr "redigerar %s"
 
-#: ../IkiWiki/Plugin/po.pm:427
+#: ../IkiWiki/Plugin/po.pm:432
 msgid "updated PO files"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:451
+#: ../IkiWiki/Plugin/po.pm:456
 msgid ""
 "Can not remove a translation. If the master page is removed, however, its "
 "translations will be removed as well."
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:471
+#: ../IkiWiki/Plugin/po.pm:476
 msgid ""
 "Can not rename a translation. If the master page is renamed, however, its "
 "translations will be renamed as well."
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:870
+#: ../IkiWiki/Plugin/po.pm:876
 #, perl-format
 msgid "POT file (%s) does not exist"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:884
+#: ../IkiWiki/Plugin/po.pm:890
 #, fuzzy, perl-format
 msgid "failed to copy underlay PO file to %s"
 msgstr "misslyckades med att kompilera %s"
 
-#: ../IkiWiki/Plugin/po.pm:893
+#: ../IkiWiki/Plugin/po.pm:899
 #, fuzzy, perl-format
 msgid "failed to update %s"
 msgstr "misslyckades med att kompilera %s"
 
-#: ../IkiWiki/Plugin/po.pm:899
+#: ../IkiWiki/Plugin/po.pm:905
 #, fuzzy, perl-format
 msgid "failed to copy the POT file to %s"
 msgstr "misslyckades med att kompilera %s"
 
-#: ../IkiWiki/Plugin/po.pm:935
+#: ../IkiWiki/Plugin/po.pm:941
 msgid "N/A"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:948
+#: ../IkiWiki/Plugin/po.pm:954
 #, fuzzy, perl-format
 msgid "failed to translate %s"
 msgstr "misslyckades med att skriva %s: %s"
 
-#: ../IkiWiki/Plugin/po.pm:1032
+#: ../IkiWiki/Plugin/po.pm:1038
 msgid "removed obsolete PO files"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:1095 ../IkiWiki/Plugin/po.pm:1109
-#: ../IkiWiki/Plugin/po.pm:1149
+#: ../IkiWiki/Plugin/po.pm:1094 ../IkiWiki/Plugin/po.pm:1108
+#: ../IkiWiki/Plugin/po.pm:1147
 #, fuzzy, perl-format
 msgid "failed to write %s"
 msgstr "misslyckades med att skriva %s: %s"
 
-#: ../IkiWiki/Plugin/po.pm:1107
+#: ../IkiWiki/Plugin/po.pm:1106
 #, fuzzy
 msgid "failed to translate"
 msgstr "linkmap misslyckades att köra dot"
 
-#: ../IkiWiki/Plugin/po.pm:1112
-#, fuzzy, perl-format
-msgid "failed to read %s"
-msgstr "misslyckades med att skriva %s: %s"
-
-#: ../IkiWiki/Plugin/po.pm:1161
+#: ../IkiWiki/Plugin/po.pm:1159
 msgid "invalid gettext data, go back to previous page to continue edit"
 msgstr ""
 
-#: ../IkiWiki/Plugin/poll.pm:69
+#: ../IkiWiki/Plugin/poll.pm:70
 msgid "vote"
 msgstr "röst"
 
-#: ../IkiWiki/Plugin/poll.pm:77
+#: ../IkiWiki/Plugin/poll.pm:78
 msgid "Total votes:"
 msgstr "Antal röster:"
 
-#: ../IkiWiki/Plugin/polygen.pm:41
+#: ../IkiWiki/Plugin/polygen.pm:42
 msgid "polygen not installed"
 msgstr "polygen inte installerad"
 
-#: ../IkiWiki/Plugin/polygen.pm:60
+#: ../IkiWiki/Plugin/polygen.pm:61
 #, fuzzy
 msgid "command failed"
 msgstr "fortune misslyckades"
 
-#: ../IkiWiki/Plugin/postsparkline.pm:46
+#: ../IkiWiki/Plugin/postsparkline.pm:47
 msgid "missing formula"
 msgstr ""
 
-#: ../IkiWiki/Plugin/postsparkline.pm:53
+#: ../IkiWiki/Plugin/postsparkline.pm:54
 msgid "unknown formula"
 msgstr ""
 
@@ -767,12 +789,12 @@ msgstr ""
 msgid "at noon on %A"
 msgstr ""
 
-#: ../IkiWiki/Plugin/progress.pm:34
+#: ../IkiWiki/Plugin/progress.pm:35
 #, perl-format
 msgid "illegal percent value %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/progress.pm:55
+#: ../IkiWiki/Plugin/progress.pm:56
 msgid "need either `percent` or `totalpages` and `donepages` parameters"
 msgstr ""
 
@@ -780,40 +802,40 @@ msgstr ""
 msgid "(Diff truncated)"
 msgstr ""
 
-#: ../IkiWiki/Plugin/remove.pm:31 ../IkiWiki/Plugin/rename.pm:36
+#: ../IkiWiki/Plugin/remove.pm:32 ../IkiWiki/Plugin/rename.pm:37
 #, perl-format
 msgid "%s does not exist"
 msgstr ""
 
-#: ../IkiWiki/Plugin/remove.pm:38
+#: ../IkiWiki/Plugin/remove.pm:39
 #, fuzzy, perl-format
 msgid "%s is not in the srcdir, so it cannot be deleted"
 msgstr "%s är låst av %s och kan inte redigeras"
 
-#: ../IkiWiki/Plugin/remove.pm:41 ../IkiWiki/Plugin/rename.pm:45
+#: ../IkiWiki/Plugin/remove.pm:42 ../IkiWiki/Plugin/rename.pm:46
 #, perl-format
 msgid "%s is not a file"
 msgstr ""
 
-#: ../IkiWiki/Plugin/remove.pm:134
+#: ../IkiWiki/Plugin/remove.pm:137
 #, perl-format
 msgid "confirm removal of %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/remove.pm:171
+#: ../IkiWiki/Plugin/remove.pm:174
 msgid "Please select the attachments to remove."
 msgstr ""
 
-#: ../IkiWiki/Plugin/remove.pm:211
+#: ../IkiWiki/Plugin/remove.pm:216
 msgid "removed"
 msgstr ""
 
-#: ../IkiWiki/Plugin/rename.pm:42
+#: ../IkiWiki/Plugin/rename.pm:43
 #, perl-format
 msgid "%s is not in the srcdir, so it cannot be renamed"
 msgstr ""
 
-#: ../IkiWiki/Plugin/rename.pm:62
+#: ../IkiWiki/Plugin/rename.pm:63
 #, fuzzy
 msgid "no change to the file name was specified"
 msgstr "filnamn för wrapper har inte angivits"
@@ -838,24 +860,24 @@ msgstr ""
 msgid "rename %s"
 msgstr "ritar upp %s"
 
-#: ../IkiWiki/Plugin/rename.pm:161
+#: ../IkiWiki/Plugin/rename.pm:163
 msgid "Also rename SubPages and attachments"
 msgstr ""
 
-#: ../IkiWiki/Plugin/rename.pm:247
+#: ../IkiWiki/Plugin/rename.pm:250
 msgid "Only one attachment can be renamed at a time."
 msgstr ""
 
-#: ../IkiWiki/Plugin/rename.pm:250
+#: ../IkiWiki/Plugin/rename.pm:253
 msgid "Please select the attachment to rename."
 msgstr ""
 
-#: ../IkiWiki/Plugin/rename.pm:347
+#: ../IkiWiki/Plugin/rename.pm:352
 #, perl-format
 msgid "rename %s to %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/rename.pm:571
+#: ../IkiWiki/Plugin/rename.pm:576
 #, fuzzy, perl-format
 msgid "update for rename of %s to %s"
 msgstr "uppdatering av %s, %s av %s"
@@ -870,21 +892,21 @@ msgstr "misslyckades med att skriva %s: %s"
 msgid "rsync_command exited %d"
 msgstr ""
 
-#: ../IkiWiki/Plugin/search.pm:182
+#: ../IkiWiki/Plugin/search.pm:194
 #, perl-format
 msgid "need Digest::SHA1 to index %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/search.pm:217
+#: ../IkiWiki/Plugin/search.pm:231
 msgid "search"
 msgstr ""
 
-#: ../IkiWiki/Plugin/shortcut.pm:31
+#: ../IkiWiki/Plugin/shortcut.pm:32
 #, perl-format
 msgid "shortcut plugin will not work without %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/shortcut.pm:44
+#: ../IkiWiki/Plugin/shortcut.pm:45
 #, fuzzy
 msgid "missing name or url parameter"
 msgstr "genväg saknar parameter för namn eller url"
@@ -892,7 +914,7 @@ msgstr "genväg saknar parameter för namn eller url"
 #. translators: This is used to display what shortcuts are defined.
 #. translators: First parameter is the name of the shortcut, the second
 #. translators: is an URL.
-#: ../IkiWiki/Plugin/shortcut.pm:54
+#: ../IkiWiki/Plugin/shortcut.pm:55
 #, fuzzy, perl-format
 msgid "shortcut %s points to <i>%s</i>"
 msgstr "genvägen %s pekar på %s"
@@ -902,121 +924,123 @@ msgstr "genvägen %s pekar på %s"
 msgid "failed to parse any smileys"
 msgstr "misslyckades med att tolka smilisar, inaktiverar instick"
 
-#: ../IkiWiki/Plugin/sparkline.pm:72
+#: ../IkiWiki/Plugin/sparkline.pm:73
 #, fuzzy
 msgid "parse error"
 msgstr "linkmap misslyckades att köra dot"
 
-#: ../IkiWiki/Plugin/sparkline.pm:78
+#: ../IkiWiki/Plugin/sparkline.pm:79
 msgid "invalid featurepoint diameter"
 msgstr ""
 
-#: ../IkiWiki/Plugin/sparkline.pm:88
+#: ../IkiWiki/Plugin/sparkline.pm:89
 msgid "invalid featurepoint location"
 msgstr ""
 
-#: ../IkiWiki/Plugin/sparkline.pm:99
+#: ../IkiWiki/Plugin/sparkline.pm:100
 msgid "missing values"
 msgstr ""
 
-#: ../IkiWiki/Plugin/sparkline.pm:104
+#: ../IkiWiki/Plugin/sparkline.pm:105
 #, fuzzy
 msgid "invalid height value"
 msgstr "linkmap misslyckades att köra dot"
 
-#: ../IkiWiki/Plugin/sparkline.pm:111
+#: ../IkiWiki/Plugin/sparkline.pm:112
 #, fuzzy
 msgid "missing width parameter"
 msgstr "mall saknar id-parameter"
 
-#: ../IkiWiki/Plugin/sparkline.pm:115
+#: ../IkiWiki/Plugin/sparkline.pm:116
 #, fuzzy
 msgid "invalid width value"
 msgstr "linkmap misslyckades att köra dot"
 
-#: ../IkiWiki/Plugin/sparkline.pm:153
+#: ../IkiWiki/Plugin/sparkline.pm:154
 #, fuzzy
 msgid "failed to run php"
 msgstr "linkmap misslyckades att köra dot"
 
-#: ../IkiWiki/Plugin/table.pm:31
+#: ../IkiWiki/Plugin/table.pm:32
 msgid "cannot find file"
 msgstr ""
 
-#: ../IkiWiki/Plugin/table.pm:87
+#: ../IkiWiki/Plugin/table.pm:88
 msgid "unknown data format"
 msgstr ""
 
-#: ../IkiWiki/Plugin/table.pm:95
+#: ../IkiWiki/Plugin/table.pm:96
 msgid "empty data"
 msgstr ""
 
-#: ../IkiWiki/Plugin/table.pm:114
+#: ../IkiWiki/Plugin/table.pm:115
 msgid "Direct data download"
 msgstr ""
 
-#: ../IkiWiki/Plugin/table.pm:148
+#: ../IkiWiki/Plugin/table.pm:149
 #, fuzzy, perl-format
 msgid "parse fail at line %d: %s"
 msgstr "misslyckades med att skriva %s: %s"
 
-#: ../IkiWiki/Plugin/template.pm:29
+#: ../IkiWiki/Plugin/tag.pm:83
+#, fuzzy, perl-format
+msgid "creating tag page %s"
+msgstr "skapar nya sidan %s"
+
+#: ../IkiWiki/Plugin/template.pm:33
 #, fuzzy
 msgid "missing id parameter"
 msgstr "mall saknar id-parameter"
 
-#: ../IkiWiki/Plugin/template.pm:36
-#, perl-format
-msgid "template %s not found"
+#: ../IkiWiki/Plugin/template.pm:47
+#, fuzzy, perl-format
+msgid "%s not found"
 msgstr "mallen %s hittades inte"
 
-#: ../IkiWiki/Plugin/template.pm:55
-#, fuzzy
-msgid "failed to process:"
-msgstr "misslyckades med att behandla mall:"
-
-#: ../IkiWiki/Plugin/teximg.pm:70
+#: ../IkiWiki/Plugin/teximg.pm:72
 msgid "missing tex code"
 msgstr ""
 
-#: ../IkiWiki/Plugin/teximg.pm:122
+#: ../IkiWiki/Plugin/teximg.pm:124
 #, fuzzy
 msgid "failed to generate image from code"
 msgstr "misslyckades med att skriva %s: %s"
 
-#: ../IkiWiki/Plugin/websetup.pm:89
-msgid "plugin"
+#: ../IkiWiki/Plugin/websetup.pm:105
+#, perl-format
+msgid "%s plugin:"
+msgstr ""
+
+#: ../IkiWiki/Plugin/websetup.pm:121
+#, perl-format
+msgid "%s plugins"
 msgstr ""
 
-#: ../IkiWiki/Plugin/websetup.pm:108
+#: ../IkiWiki/Plugin/websetup.pm:135
 #, perl-format
 msgid "enable %s?"
 msgstr ""
 
-#: ../IkiWiki/Plugin/websetup.pm:240
+#: ../IkiWiki/Plugin/websetup.pm:276
 msgid "setup file for this wiki is not known"
 msgstr ""
 
-#: ../IkiWiki/Plugin/websetup.pm:256
+#: ../IkiWiki/Plugin/websetup.pm:292
 msgid "main"
 msgstr ""
 
-#: ../IkiWiki/Plugin/websetup.pm:257
-msgid "plugins"
-msgstr ""
-
-#: ../IkiWiki/Plugin/websetup.pm:395
+#: ../IkiWiki/Plugin/websetup.pm:435
 msgid ""
 "The configuration changes shown below require a wiki rebuild to take effect."
 msgstr ""
 
-#: ../IkiWiki/Plugin/websetup.pm:399
+#: ../IkiWiki/Plugin/websetup.pm:439
 msgid ""
 "For the configuration changes shown below to fully take effect, you may need "
 "to rebuild the wiki."
 msgstr ""
 
-#: ../IkiWiki/Plugin/websetup.pm:436
+#: ../IkiWiki/Plugin/websetup.pm:476
 #, perl-format
 msgid "Error: %s exited nonzero (%s). Discarding setup changes."
 msgstr ""
@@ -1031,79 +1055,94 @@ msgstr ""
 msgid "bad file name %s"
 msgstr "hoppar över felaktigt filnamn %s"
 
-#: ../IkiWiki/Render.pm:150
+#: ../IkiWiki/Render.pm:158
 #, perl-format
 msgid "scanning %s"
 msgstr "söker av %s"
 
-#: ../IkiWiki/Render.pm:271
+#: ../IkiWiki/Render.pm:280
 #, perl-format
 msgid ""
 "symlink found in srcdir path (%s) -- set allow_symlinks_before_srcdir to "
 "allow this"
 msgstr ""
 
-#: ../IkiWiki/Render.pm:300 ../IkiWiki/Render.pm:327
+#: ../IkiWiki/Render.pm:311
 #, perl-format
 msgid "skipping bad filename %s"
 msgstr "hoppar över felaktigt filnamn %s"
 
-#: ../IkiWiki/Render.pm:305
+#: ../IkiWiki/Render.pm:327
 #, perl-format
 msgid "%s has multiple possible source pages"
 msgstr ""
 
-#: ../IkiWiki/Render.pm:395
+#: ../IkiWiki/Render.pm:369
 #, perl-format
-msgid "removing old page %s"
+msgid "querying %s for file creation and modification times.."
+msgstr ""
+
+#: ../IkiWiki/Render.pm:431
+#, fuzzy, perl-format
+msgid "removing obsolete %s"
 msgstr "tar bort gammal sida %s"
 
-#: ../IkiWiki/Render.pm:471
+#: ../IkiWiki/Render.pm:505
 #, fuzzy, perl-format
 msgid "building %s, which links to %s"
 msgstr "ritar upp %s, vilken länkar till %s"
 
-#: ../IkiWiki/Render.pm:480
+#: ../IkiWiki/Render.pm:514
 #, fuzzy, perl-format
 msgid "removing %s, no longer built by %s"
 msgstr "tar bort %s, som inte längre ritas upp av %s"
 
-#: ../IkiWiki/Render.pm:603
+#: ../IkiWiki/Render.pm:597 ../IkiWiki/Render.pm:679
 #, fuzzy, perl-format
 msgid "building %s, which depends on %s"
 msgstr "ritar upp %s, vilken är beroende av %s"
 
-#: ../IkiWiki/Render.pm:616
+#: ../IkiWiki/Render.pm:692
 #, fuzzy, perl-format
 msgid "building %s, to update its backlinks"
 msgstr "ritar upp %s, för att uppdatera dess bakåtlänkar"
 
-#: ../IkiWiki/Render.pm:679
+#: ../IkiWiki/Render.pm:821
 #, fuzzy, perl-format
 msgid "ikiwiki: cannot build %s"
 msgstr "ikiwiki: kan inte rita upp %s"
 
 #. translators: The first parameter is a filename, and the second
 #. translators: is a (probably not translated) error message.
-#: ../IkiWiki/Setup.pm:19
+#: ../IkiWiki/Setup.pm:23
 #, perl-format
 msgid "cannot read %s: %s"
 msgstr "kan inte läsa %s: %s"
 
-#: ../IkiWiki/Setup/Automator.pm:33
+#: ../IkiWiki/Setup.pm:34
+#, fuzzy, perl-format
+msgid "cannot load %s in safe mode"
+msgstr "kan inte läsa %s: %s"
+
+#: ../IkiWiki/Setup.pm:47
+#, fuzzy, perl-format
+msgid "failed to parse %s"
+msgstr "misslyckades med att kompilera %s"
+
+#: ../IkiWiki/Setup/Automator.pm:34
 msgid "you must enter a wikiname (that contains alphanumerics)"
 msgstr ""
 
-#: ../IkiWiki/Setup/Automator.pm:76
+#: ../IkiWiki/Setup/Automator.pm:89
 #, perl-format
 msgid "unsupported revision control system %s"
 msgstr ""
 
-#: ../IkiWiki/Setup/Automator.pm:102
+#: ../IkiWiki/Setup/Automator.pm:115
 msgid "failed to set up the repository with ikiwiki-makerepo"
 msgstr ""
 
-#: ../IkiWiki/Setup/Automator.pm:120
+#: ../IkiWiki/Setup/Automator.pm:134
 #, perl-format
 msgid "** Disabling plugin %s, since it is failing with this message:"
 msgstr ""
@@ -1122,13 +1161,13 @@ msgid "wrapper filename not specified"
 msgstr "filnamn för wrapper har inte angivits"
 
 #. translators: The parameter is a C filename.
-#: ../IkiWiki/Wrapper.pm:149
+#: ../IkiWiki/Wrapper.pm:160
 #, perl-format
 msgid "failed to compile %s"
 msgstr "misslyckades med att kompilera %s"
 
 #. translators: The parameter is a filename.
-#: ../IkiWiki/Wrapper.pm:169
+#: ../IkiWiki/Wrapper.pm:180
 #, perl-format
 msgid "successfully generated %s"
 msgstr "generering av %s lyckades"
@@ -1141,58 +1180,63 @@ msgstr "användning: ikiwiki [flaggor] källa mål"
 msgid "       ikiwiki --setup configfile"
 msgstr ""
 
-#: ../ikiwiki.in:91
+#: ../ikiwiki.in:96
 msgid "usage: --set var=value"
 msgstr ""
 
-#: ../ikiwiki.in:140
+#: ../ikiwiki.in:103
+msgid "usage: --set-yaml var=value"
+msgstr ""
+
+#: ../ikiwiki.in:157
 msgid "generating wrappers.."
 msgstr "genererar wrappers.."
 
-#: ../ikiwiki.in:195
+#: ../ikiwiki.in:220
 msgid "rebuilding wiki.."
 msgstr "bygger om wiki.."
 
-#: ../ikiwiki.in:198
+#: ../ikiwiki.in:223
 msgid "refreshing wiki.."
 msgstr "uppdaterar wiki.."
 
-#: ../IkiWiki.pm:238
+#: ../IkiWiki.pm:232
 msgid "Discussion"
 msgstr "Diskussion"
 
-#: ../IkiWiki.pm:507
+#: ../IkiWiki.pm:531
 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:553
+#: ../IkiWiki.pm:577
 msgid "cannot use multiple rcs plugins"
 msgstr ""
 
-#: ../IkiWiki.pm:582
+#: ../IkiWiki.pm:606
 #, perl-format
 msgid "failed to load external plugin needed for %s plugin: %s"
 msgstr ""
 
-#: ../IkiWiki.pm:1264
+#: ../IkiWiki.pm:1298
 #, fuzzy, perl-format
 msgid "preprocessing loop detected on %s at depth %i"
 msgstr "%s förbehandlingsslinga detekterades på %s, djup %i"
 
-#: ../IkiWiki.pm:1863
+#: ../IkiWiki.pm:1993
 msgid "yes"
 msgstr ""
 
-#: ../IkiWiki.pm:2006
-msgid "Sort::Naturally needed for title_natural sort"
-msgstr ""
+#: ../IkiWiki.pm:2070
+#, fuzzy, perl-format
+msgid "invalid sort type %s"
+msgstr "okänd sorteringstyp %s"
 
-#: ../IkiWiki.pm:2017
+#: ../IkiWiki.pm:2091
 #, perl-format
 msgid "unknown sort type %s"
 msgstr "okänd sorteringstyp %s"
 
-#: ../IkiWiki.pm:2036
+#: ../IkiWiki.pm:2227
 #, fuzzy, perl-format
 msgid "cannot match pages: %s"
 msgstr "kan inte läsa %s: %s"
@@ -1217,6 +1261,23 @@ msgstr ""
 msgid "What is the domain name of the web server?"
 msgstr ""
 
+#~ msgid "You need to log in first."
+#~ msgstr "Du måste logga in först."
+
+#~ msgid "Get an OpenID"
+#~ msgstr "Skaffa ett OpenID"
+
+#, fuzzy
+#~ msgid "failed to process"
+#~ msgstr "misslyckades med att behandla mall:"
+
+#~ msgid "getctime not implemented"
+#~ msgstr "getctime inte implementerad"
+
+#, fuzzy
+#~ msgid "failed to read %s"
+#~ msgstr "misslyckades med att skriva %s: %s"
+
 #~ msgid "discussion"
 #~ msgstr "diskussion"
 
@@ -1267,10 +1328,6 @@ msgstr ""
 #~ "REV är inte inställt, kör inte från svn post-commit-hook, kan inte skicka "
 #~ "notifieringar"
 
-#, fuzzy
-#~ msgid "%s not found"
-#~ msgstr "mallen %s hittades inte"
-
 #~ msgid "What's this?"
 #~ msgstr "Vad är det här?"
 
index f3bce9f4f67a62ab5f7f6289e4c23a8ae644d41d..165dfc59f37628f396c2a0c27a07d29d82e9cad1 100644 (file)
--- a/po/tr.po
+++ b/po/tr.po
@@ -5,53 +5,50 @@ msgid ""
 msgstr ""
 "Project-Id-Version: ikiwiki 3.20091031\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-12-02 13:10-0500\n"
+"POT-Creation-Date: 2010-06-10 15:02-0400\n"
 "PO-Revision-Date: 2009-11-08 03:04+0200\n"
 "Last-Translator: Recai Oktaş <roktas@debian.org>\n"
 "Language-Team: Turkish <debian-l10n-turkish@lists.debian.org>\n"
+"Language: tr\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: ../IkiWiki/CGI.pm:114
-msgid "You need to log in first."
-msgstr "Önce sisteme giriş yapmanız gerekiyor."
-
-#: ../IkiWiki/CGI.pm:147
+#: ../IkiWiki/CGI.pm:162
 msgid ""
 "probable misconfiguration: sslcookie is set, but you are attempting to login "
 "via http, not https"
 msgstr ""
 
-#: ../IkiWiki/CGI.pm:150
+#: ../IkiWiki/CGI.pm:165
 msgid "login failed, perhaps you need to turn on cookies?"
 msgstr ""
 
-#: ../IkiWiki/CGI.pm:169 ../IkiWiki/CGI.pm:314
+#: ../IkiWiki/CGI.pm:184 ../IkiWiki/CGI.pm:335
 msgid "Your login session has expired."
 msgstr ""
 
-#: ../IkiWiki/CGI.pm:190
+#: ../IkiWiki/CGI.pm:205
 msgid "Login"
 msgstr "Giriş"
 
-#: ../IkiWiki/CGI.pm:191
+#: ../IkiWiki/CGI.pm:206
 msgid "Preferences"
 msgstr "Tercihler"
 
-#: ../IkiWiki/CGI.pm:192
+#: ../IkiWiki/CGI.pm:207
 msgid "Admin"
 msgstr "Yönet"
 
-#: ../IkiWiki/CGI.pm:232
+#: ../IkiWiki/CGI.pm:247
 msgid "Preferences saved."
 msgstr "Tercihler kaydedildi."
 
-#: ../IkiWiki/CGI.pm:278
+#: ../IkiWiki/CGI.pm:299
 msgid "You are banned."
 msgstr ""
 
-#: ../IkiWiki/CGI.pm:405 ../IkiWiki/CGI.pm:406 ../IkiWiki.pm:1281
+#: ../IkiWiki/CGI.pm:426 ../IkiWiki/CGI.pm:427 ../IkiWiki.pm:1316
 msgid "Error"
 msgstr "Hata"
 
@@ -132,7 +129,7 @@ msgstr "%s için yeni sayfa oluşturuluyor"
 msgid "deleting bucket.."
 msgstr ""
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:206
+#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:231
 msgid "done"
 msgstr ""
 
@@ -141,40 +138,40 @@ msgstr ""
 msgid "Must specify %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:136
+#: ../IkiWiki/Plugin/amazon_s3.pm:140
 msgid "Failed to create S3 bucket: "
 msgstr ""
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:221
+#: ../IkiWiki/Plugin/amazon_s3.pm:225
 msgid "Failed to save file to S3: "
 msgstr ""
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:243
+#: ../IkiWiki/Plugin/amazon_s3.pm:247
 msgid "Failed to delete file from S3: "
 msgstr ""
 
-#: ../IkiWiki/Plugin/attachment.pm:49
+#: ../IkiWiki/Plugin/attachment.pm:50
 #, perl-format
 msgid "there is already a page named %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/attachment.pm:65
+#: ../IkiWiki/Plugin/attachment.pm:66
 msgid "prohibited by allowed_attachments"
 msgstr ""
 
-#: ../IkiWiki/Plugin/attachment.pm:140
+#: ../IkiWiki/Plugin/attachment.pm:141
 msgid "bad attachment filename"
 msgstr ""
 
-#: ../IkiWiki/Plugin/attachment.pm:182
+#: ../IkiWiki/Plugin/attachment.pm:183
 msgid "attachment upload"
 msgstr ""
 
-#: ../IkiWiki/Plugin/autoindex.pm:105
+#: ../IkiWiki/Plugin/autoindex.pm:117
 msgid "automatic index generation"
 msgstr ""
 
-#: ../IkiWiki/Plugin/blogspam.pm:108
+#: ../IkiWiki/Plugin/blogspam.pm:109
 msgid ""
 "Sorry, but that looks like spam to <a href=\"http://blogspam.net/"
 "\">blogspam</a>: "
@@ -189,192 +186,212 @@ msgstr ""
 msgid "There are no broken links!"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:124 ../IkiWiki/Plugin/format.pm:38
+#: ../IkiWiki/Plugin/comments.pm:112
+#, perl-format
+msgid "this comment needs %s"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:115
+msgid "moderation"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:136 ../IkiWiki/Plugin/format.pm:48
 #, perl-format
 msgid "unsupported page format %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:129
+#: ../IkiWiki/Plugin/comments.pm:141
 msgid "comment must have content"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:185
+#: ../IkiWiki/Plugin/comments.pm:196
 msgid "Anonymous"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:340 ../IkiWiki/Plugin/editpage.pm:97
+#: ../IkiWiki/Plugin/comments.pm:357 ../IkiWiki/Plugin/editpage.pm:98
 msgid "bad page name"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:345
+#: ../IkiWiki/Plugin/comments.pm:362
 #, perl-format
 msgid "commenting on %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:363
+#: ../IkiWiki/Plugin/comments.pm:380
 #, perl-format
 msgid "page '%s' doesn't exist, so you can't comment"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:370
+#: ../IkiWiki/Plugin/comments.pm:387
 #, perl-format
 msgid "comments on page '%s' are closed"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:464
+#: ../IkiWiki/Plugin/comments.pm:491
 msgid "comment stored for moderation"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:466
+#: ../IkiWiki/Plugin/comments.pm:493
 msgid "Your comment will be posted after moderator review"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:479
+#: ../IkiWiki/Plugin/comments.pm:506
 msgid "Added a comment"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:483
+#: ../IkiWiki/Plugin/comments.pm:510
 #, perl-format
 msgid "Added a comment: %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:525 ../IkiWiki/Plugin/websetup.pm:236
+#: ../IkiWiki/Plugin/comments.pm:552 ../IkiWiki/Plugin/websetup.pm:272
 msgid "you are not logged in as an admin"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:576
+#: ../IkiWiki/Plugin/comments.pm:603
 msgid "Comment moderation"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:615
+#: ../IkiWiki/Plugin/comments.pm:641
 msgid "comment moderation"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:766
-msgid "Comments"
+#: ../IkiWiki/Plugin/comments.pm:790
+#, perl-format
+msgid "%i comment"
+msgid_plural "%i comments"
+msgstr[0] ""
+msgstr[1] ""
+
+#. translators: Here "Comment" is a verb;
+#. translators: the user clicks on it to
+#. translators: post a comment.
+#: ../IkiWiki/Plugin/comments.pm:800
+msgid "Comment"
 msgstr ""
 
-#: ../IkiWiki/Plugin/conditional.pm:27 ../IkiWiki/Plugin/cutpaste.pm:30
-#: ../IkiWiki/Plugin/cutpaste.pm:45 ../IkiWiki/Plugin/cutpaste.pm:61
+#: ../IkiWiki/Plugin/conditional.pm:28 ../IkiWiki/Plugin/cutpaste.pm:31
+#: ../IkiWiki/Plugin/cutpaste.pm:46 ../IkiWiki/Plugin/cutpaste.pm:62
 #: ../IkiWiki/Plugin/testpagespec.pm:26
 #, perl-format
 msgid "%s parameter is required"
 msgstr ""
 
-#: ../IkiWiki/Plugin/cutpaste.pm:66
+#: ../IkiWiki/Plugin/cutpaste.pm:67
 msgid "no text was copied in this page"
 msgstr ""
 
-#: ../IkiWiki/Plugin/cutpaste.pm:69
+#: ../IkiWiki/Plugin/cutpaste.pm:70
 #, perl-format
 msgid "no text was copied in this page with id %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/editpage.pm:40
+#: ../IkiWiki/Plugin/editpage.pm:41
 #, perl-format
 msgid "removing old preview %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/editpage.pm:113
+#: ../IkiWiki/Plugin/editpage.pm:114
 #, perl-format
 msgid "%s is not an editable page"
 msgstr ""
 
-#: ../IkiWiki/Plugin/editpage.pm:292
+#: ../IkiWiki/Plugin/editpage.pm:294
 #, perl-format
 msgid "creating %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/editpage.pm:310 ../IkiWiki/Plugin/editpage.pm:329
-#: ../IkiWiki/Plugin/editpage.pm:339 ../IkiWiki/Plugin/editpage.pm:383
-#: ../IkiWiki/Plugin/editpage.pm:422
+#: ../IkiWiki/Plugin/editpage.pm:312 ../IkiWiki/Plugin/editpage.pm:334
+#: ../IkiWiki/Plugin/editpage.pm:345 ../IkiWiki/Plugin/editpage.pm:390
+#: ../IkiWiki/Plugin/editpage.pm:429
 #, perl-format
 msgid "editing %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/edittemplate.pm:51
+#: ../IkiWiki/Plugin/edittemplate.pm:52
 msgid "template not specified"
 msgstr ""
 
-#: ../IkiWiki/Plugin/edittemplate.pm:54
+#: ../IkiWiki/Plugin/edittemplate.pm:55
 msgid "match not specified"
 msgstr ""
 
-#: ../IkiWiki/Plugin/edittemplate.pm:63
+#: ../IkiWiki/Plugin/edittemplate.pm:64
 #, perl-format
 msgid "edittemplate %s registered for %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/edittemplate.pm:137
-msgid "failed to process"
+#: ../IkiWiki/Plugin/edittemplate.pm:125 ../IkiWiki/Plugin/inline.pm:339
+#: ../IkiWiki/Plugin/template.pm:44
+msgid "failed to process template:"
 msgstr ""
 
-#: ../IkiWiki/Plugin/format.pm:20
+#: ../IkiWiki/Plugin/format.pm:30
 msgid "must specify format and text"
 msgstr ""
 
-#: ../IkiWiki/Plugin/fortune.pm:27
+#: ../IkiWiki/Plugin/fortune.pm:28
 msgid "fortune failed"
 msgstr ""
 
-#: ../IkiWiki/Plugin/getsource.pm:62 ../IkiWiki/Plugin/goto.pm:55
+#: ../IkiWiki/Plugin/getsource.pm:64 ../IkiWiki/Plugin/goto.pm:58
 msgid "missing page"
 msgstr ""
 
-#: ../IkiWiki/Plugin/getsource.pm:64 ../IkiWiki/Plugin/goto.pm:57
+#: ../IkiWiki/Plugin/getsource.pm:66 ../IkiWiki/Plugin/goto.pm:60
 #, perl-format
 msgid "The page %s does not exist."
 msgstr ""
 
-#: ../IkiWiki/Plugin/getsource.pm:73
+#: ../IkiWiki/Plugin/getsource.pm:75
 msgid "not a page"
 msgstr ""
 
-#: ../IkiWiki/Plugin/getsource.pm:75
+#: ../IkiWiki/Plugin/getsource.pm:77
 #, perl-format
 msgid "%s is an attachment, not a page."
 msgstr ""
 
-#: ../IkiWiki/Plugin/git.pm:651 ../IkiWiki/Plugin/git.pm:669
+#: ../IkiWiki/Plugin/git.pm:687 ../IkiWiki/Plugin/git.pm:705
 #: ../IkiWiki/Receive.pm:130
 #, perl-format
 msgid "you are not allowed to change %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/git.pm:691
+#: ../IkiWiki/Plugin/git.pm:727
 #, perl-format
 msgid "you cannot act on a file with mode %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/git.pm:695
+#: ../IkiWiki/Plugin/git.pm:731
 msgid "you are not allowed to change file modes"
 msgstr ""
 
-#: ../IkiWiki/Plugin/google.pm:25 ../IkiWiki/Plugin/po.pm:131
-#: ../IkiWiki/Plugin/search.pm:36
+#: ../IkiWiki/Plugin/google.pm:26 ../IkiWiki/Plugin/po.pm:134
+#: ../IkiWiki/Plugin/search.pm:37
 #, perl-format
 msgid "Must specify %s when using the %s plugin"
 msgstr ""
 
-#: ../IkiWiki/Plugin/graphviz.pm:67
+#: ../IkiWiki/Plugin/graphviz.pm:68
 msgid "failed to run graphviz"
 msgstr ""
 
-#: ../IkiWiki/Plugin/graphviz.pm:94
+#: ../IkiWiki/Plugin/graphviz.pm:91
 msgid "prog not a valid graphviz program"
 msgstr ""
 
-#: ../IkiWiki/Plugin/highlight.pm:47
+#: ../IkiWiki/Plugin/highlight.pm:48
 #, perl-format
 msgid "tohighlight contains unknown file type '%s'"
 msgstr ""
 
-#: ../IkiWiki/Plugin/highlight.pm:58
+#: ../IkiWiki/Plugin/highlight.pm:59
 #, perl-format
 msgid "Source code: %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/highlight.pm:123
+#: ../IkiWiki/Plugin/highlight.pm:124
 msgid ""
 "warning: highlight perl module not available; falling back to pass through"
 msgstr ""
@@ -383,99 +400,108 @@ msgstr ""
 msgid "htmltidy failed to parse this html"
 msgstr ""
 
-#: ../IkiWiki/Plugin/img.pm:64
+#: ../IkiWiki/Plugin/img.pm:69
 msgid "Image::Magick is not installed"
 msgstr ""
 
-#: ../IkiWiki/Plugin/img.pm:68 ../IkiWiki/Plugin/img.pm:112
+#: ../IkiWiki/Plugin/img.pm:73 ../IkiWiki/Plugin/img.pm:117
 #, perl-format
 msgid "failed to read %s: %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/img.pm:74
+#: ../IkiWiki/Plugin/img.pm:79
 #, perl-format
 msgid "wrong size format \"%s\" (should be WxH)"
 msgstr ""
 
-#: ../IkiWiki/Plugin/img.pm:120
+#: ../IkiWiki/Plugin/img.pm:122
 #, perl-format
 msgid "failed to resize: %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/img.pm:140
+#: ../IkiWiki/Plugin/img.pm:146
 #, perl-format
 msgid "failed to determine size of image %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/inline.pm:92
+#: ../IkiWiki/Plugin/inline.pm:93
 msgid "Must specify url to wiki with --url when using --rss or --atom"
 msgstr ""
 
-#: ../IkiWiki/Plugin/inline.pm:138
+#: ../IkiWiki/Plugin/inline.pm:139
 msgid "page editing not allowed"
 msgstr ""
 
-#: ../IkiWiki/Plugin/inline.pm:155
+#: ../IkiWiki/Plugin/inline.pm:156
 msgid "missing pages parameter"
 msgstr ""
 
-#: ../IkiWiki/Plugin/inline.pm:191
+#: ../IkiWiki/Plugin/inline.pm:192
 #, perl-format
 msgid "the %s and %s parameters cannot be used together"
 msgstr ""
 
-#: ../IkiWiki/Plugin/inline.pm:312
+#: ../IkiWiki/Plugin/inline.pm:313
 msgid "Add a new post titled:"
 msgstr ""
 
-#: ../IkiWiki/Plugin/inline.pm:332
+#: ../IkiWiki/Plugin/inline.pm:342
 #, perl-format
-msgid "nonexistant template %s"
+msgid "template %s not found"
 msgstr ""
 
-#: ../IkiWiki/Plugin/inline.pm:621
+#: ../IkiWiki/Plugin/inline.pm:633
 msgid "RPC::XML::Client not found, not pinging"
 msgstr ""
 
-#: ../IkiWiki/Plugin/linkmap.pm:101
+#: ../IkiWiki/Plugin/linkmap.pm:81 ../IkiWiki/Plugin/linkmap.pm:88
+#: ../IkiWiki/Plugin/linkmap.pm:92 ../IkiWiki/Plugin/linkmap.pm:95
 msgid "failed to run dot"
 msgstr ""
 
-#: ../IkiWiki/Plugin/lockedit.pm:47
+#: ../IkiWiki/Plugin/linkmap.pm:85
+msgid "linkmap"
+msgstr ""
+
+#: ../IkiWiki/Plugin/lockedit.pm:49
 #, perl-format
 msgid "%s is locked and cannot be edited"
 msgstr ""
 
-#: ../IkiWiki/Plugin/mdwn.pm:44
+#: ../IkiWiki/Plugin/mdwn.pm:45
 msgid "multimarkdown is enabled, but Text::MultiMarkdown is not installed"
 msgstr ""
 
-#: ../IkiWiki/Plugin/mdwn.pm:69
+#: ../IkiWiki/Plugin/mdwn.pm:70
 #, perl-format
 msgid "failed to load Markdown.pm perl module (%s) or /usr/bin/markdown (%s)"
 msgstr ""
 
-#: ../IkiWiki/Plugin/meta.pm:161
+#: ../IkiWiki/Plugin/meta.pm:174
 msgid "stylesheet not found"
 msgstr ""
 
-#: ../IkiWiki/Plugin/meta.pm:199
+#: ../IkiWiki/Plugin/meta.pm:212
 msgid "redir page not found"
 msgstr ""
 
-#: ../IkiWiki/Plugin/meta.pm:213
+#: ../IkiWiki/Plugin/meta.pm:226
 msgid "redir cycle is not allowed"
 msgstr ""
 
-#: ../IkiWiki/Plugin/mirrorlist.pm:43
+#: ../IkiWiki/Plugin/meta.pm:387
+msgid "sort=meta requires a parameter"
+msgstr ""
+
+#: ../IkiWiki/Plugin/mirrorlist.pm:44
 msgid "Mirrors"
 msgstr ""
 
-#: ../IkiWiki/Plugin/mirrorlist.pm:43
+#: ../IkiWiki/Plugin/mirrorlist.pm:44
 msgid "Mirror"
 msgstr ""
 
-#: ../IkiWiki/Plugin/moderatedcomments.pm:41
+#: ../IkiWiki/Plugin/moderatedcomments.pm:57
 msgid "comment needs moderation"
 msgstr ""
 
@@ -483,51 +509,52 @@ msgstr ""
 msgid "more"
 msgstr ""
 
-#: ../IkiWiki/Plugin/norcs.pm:65
-msgid "getctime not implemented"
+#: ../IkiWiki/Plugin/openid.pm:58
+#, perl-format
+msgid "failed to load openid module: "
 msgstr ""
 
-#: ../IkiWiki/Plugin/openid.pm:61
-msgid "Log in with"
+#: ../IkiWiki/Plugin/orphans.pm:56
+msgid "All pages have other pages linking to them."
 msgstr ""
 
-#: ../IkiWiki/Plugin/openid.pm:64
-msgid "Get an OpenID"
+#: ../IkiWiki/Plugin/pagetemplate.pm:30
+msgid "bad or missing template"
 msgstr ""
 
-#: ../IkiWiki/Plugin/orphans.pm:55
-msgid "All pages have other pages linking to them."
+#: ../IkiWiki/Plugin/passwordauth.pm:231
+msgid "Your user page: "
 msgstr ""
 
-#: ../IkiWiki/Plugin/pagetemplate.pm:30
-msgid "bad or missing template"
+#: ../IkiWiki/Plugin/passwordauth.pm:238
+msgid "Create your user page"
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:248
+#: ../IkiWiki/Plugin/passwordauth.pm:268
 msgid "Account creation successful. Now you can Login."
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:251
+#: ../IkiWiki/Plugin/passwordauth.pm:271
 msgid "Error creating account."
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:258
+#: ../IkiWiki/Plugin/passwordauth.pm:278
 msgid "No email address, so cannot email password reset instructions."
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:292
+#: ../IkiWiki/Plugin/passwordauth.pm:312
 msgid "Failed to send mail"
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:294
+#: ../IkiWiki/Plugin/passwordauth.pm:314
 msgid "You have been mailed password reset instructions."
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:329
+#: ../IkiWiki/Plugin/passwordauth.pm:349
 msgid "incorrect password reset url"
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:332
+#: ../IkiWiki/Plugin/passwordauth.pm:352
 msgid "password reset denied"
 msgstr ""
 
@@ -557,122 +584,117 @@ msgstr ""
 msgid "warning: Old po4a detected! Recommend upgrade to 0.35."
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:138
+#: ../IkiWiki/Plugin/po.pm:142
 #, perl-format
 msgid "%s is not a valid language code"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:150
+#: ../IkiWiki/Plugin/po.pm:154
 #, perl-format
 msgid ""
 "%s is not a valid value for po_link_to, falling back to po_link_to=default"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:155
+#: ../IkiWiki/Plugin/po.pm:159
 msgid ""
 "po_link_to=negotiated requires usedirs to be enabled, falling back to "
 "po_link_to=default"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:385
+#: ../IkiWiki/Plugin/po.pm:390
 #, perl-format
 msgid "rebuilding all pages to fix meta titles"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:389 ../IkiWiki/Render.pm:652
+#: ../IkiWiki/Plugin/po.pm:394 ../IkiWiki/Render.pm:769
 #, perl-format
 msgid "building %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:427
+#: ../IkiWiki/Plugin/po.pm:432
 msgid "updated PO files"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:451
+#: ../IkiWiki/Plugin/po.pm:456
 msgid ""
 "Can not remove a translation. If the master page is removed, however, its "
 "translations will be removed as well."
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:471
+#: ../IkiWiki/Plugin/po.pm:476
 msgid ""
 "Can not rename a translation. If the master page is renamed, however, its "
 "translations will be renamed as well."
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:870
+#: ../IkiWiki/Plugin/po.pm:876
 #, perl-format
 msgid "POT file (%s) does not exist"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:884
+#: ../IkiWiki/Plugin/po.pm:890
 #, perl-format
 msgid "failed to copy underlay PO file to %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:893
+#: ../IkiWiki/Plugin/po.pm:899
 #, perl-format
 msgid "failed to update %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:899
+#: ../IkiWiki/Plugin/po.pm:905
 #, perl-format
 msgid "failed to copy the POT file to %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:935
+#: ../IkiWiki/Plugin/po.pm:941
 msgid "N/A"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:948
+#: ../IkiWiki/Plugin/po.pm:954
 #, perl-format
 msgid "failed to translate %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:1032
+#: ../IkiWiki/Plugin/po.pm:1038
 msgid "removed obsolete PO files"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:1095 ../IkiWiki/Plugin/po.pm:1109
-#: ../IkiWiki/Plugin/po.pm:1149
+#: ../IkiWiki/Plugin/po.pm:1094 ../IkiWiki/Plugin/po.pm:1108
+#: ../IkiWiki/Plugin/po.pm:1147
 #, perl-format
 msgid "failed to write %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:1107
+#: ../IkiWiki/Plugin/po.pm:1106
 msgid "failed to translate"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:1112
-#, perl-format
-msgid "failed to read %s"
-msgstr ""
-
-#: ../IkiWiki/Plugin/po.pm:1161
+#: ../IkiWiki/Plugin/po.pm:1159
 msgid "invalid gettext data, go back to previous page to continue edit"
 msgstr ""
 
-#: ../IkiWiki/Plugin/poll.pm:69
+#: ../IkiWiki/Plugin/poll.pm:70
 msgid "vote"
 msgstr ""
 
-#: ../IkiWiki/Plugin/poll.pm:77
+#: ../IkiWiki/Plugin/poll.pm:78
 msgid "Total votes:"
 msgstr ""
 
-#: ../IkiWiki/Plugin/polygen.pm:41
+#: ../IkiWiki/Plugin/polygen.pm:42
 msgid "polygen not installed"
 msgstr ""
 
-#: ../IkiWiki/Plugin/polygen.pm:60
+#: ../IkiWiki/Plugin/polygen.pm:61
 msgid "command failed"
 msgstr ""
 
-#: ../IkiWiki/Plugin/postsparkline.pm:46
+#: ../IkiWiki/Plugin/postsparkline.pm:47
 msgid "missing formula"
 msgstr ""
 
-#: ../IkiWiki/Plugin/postsparkline.pm:53
+#: ../IkiWiki/Plugin/postsparkline.pm:54
 msgid "unknown formula"
 msgstr ""
 
@@ -740,12 +762,12 @@ msgstr "geceyarısında"
 msgid "at noon on %A"
 msgstr "%A öğleyin"
 
-#: ../IkiWiki/Plugin/progress.pm:34
+#: ../IkiWiki/Plugin/progress.pm:35
 #, perl-format
 msgid "illegal percent value %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/progress.pm:55
+#: ../IkiWiki/Plugin/progress.pm:56
 msgid "need either `percent` or `totalpages` and `donepages` parameters"
 msgstr ""
 
@@ -753,40 +775,40 @@ msgstr ""
 msgid "(Diff truncated)"
 msgstr ""
 
-#: ../IkiWiki/Plugin/remove.pm:31 ../IkiWiki/Plugin/rename.pm:36
+#: ../IkiWiki/Plugin/remove.pm:32 ../IkiWiki/Plugin/rename.pm:37
 #, perl-format
 msgid "%s does not exist"
 msgstr ""
 
-#: ../IkiWiki/Plugin/remove.pm:38
+#: ../IkiWiki/Plugin/remove.pm:39
 #, perl-format
 msgid "%s is not in the srcdir, so it cannot be deleted"
 msgstr ""
 
-#: ../IkiWiki/Plugin/remove.pm:41 ../IkiWiki/Plugin/rename.pm:45
+#: ../IkiWiki/Plugin/remove.pm:42 ../IkiWiki/Plugin/rename.pm:46
 #, perl-format
 msgid "%s is not a file"
 msgstr ""
 
-#: ../IkiWiki/Plugin/remove.pm:134
+#: ../IkiWiki/Plugin/remove.pm:137
 #, perl-format
 msgid "confirm removal of %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/remove.pm:171
+#: ../IkiWiki/Plugin/remove.pm:174
 msgid "Please select the attachments to remove."
 msgstr ""
 
-#: ../IkiWiki/Plugin/remove.pm:211
+#: ../IkiWiki/Plugin/remove.pm:216
 msgid "removed"
 msgstr ""
 
-#: ../IkiWiki/Plugin/rename.pm:42
+#: ../IkiWiki/Plugin/rename.pm:43
 #, perl-format
 msgid "%s is not in the srcdir, so it cannot be renamed"
 msgstr ""
 
-#: ../IkiWiki/Plugin/rename.pm:62
+#: ../IkiWiki/Plugin/rename.pm:63
 msgid "no change to the file name was specified"
 msgstr ""
 
@@ -810,24 +832,24 @@ msgstr ""
 msgid "rename %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/rename.pm:161
+#: ../IkiWiki/Plugin/rename.pm:163
 msgid "Also rename SubPages and attachments"
 msgstr ""
 
-#: ../IkiWiki/Plugin/rename.pm:247
+#: ../IkiWiki/Plugin/rename.pm:250
 msgid "Only one attachment can be renamed at a time."
 msgstr ""
 
-#: ../IkiWiki/Plugin/rename.pm:250
+#: ../IkiWiki/Plugin/rename.pm:253
 msgid "Please select the attachment to rename."
 msgstr ""
 
-#: ../IkiWiki/Plugin/rename.pm:347
+#: ../IkiWiki/Plugin/rename.pm:352
 #, perl-format
 msgid "rename %s to %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/rename.pm:571
+#: ../IkiWiki/Plugin/rename.pm:576
 #, perl-format
 msgid "update for rename of %s to %s"
 msgstr ""
@@ -842,28 +864,28 @@ msgstr ""
 msgid "rsync_command exited %d"
 msgstr ""
 
-#: ../IkiWiki/Plugin/search.pm:182
+#: ../IkiWiki/Plugin/search.pm:194
 #, perl-format
 msgid "need Digest::SHA1 to index %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/search.pm:217
+#: ../IkiWiki/Plugin/search.pm:231
 msgid "search"
 msgstr ""
 
-#: ../IkiWiki/Plugin/shortcut.pm:31
+#: ../IkiWiki/Plugin/shortcut.pm:32
 #, perl-format
 msgid "shortcut plugin will not work without %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/shortcut.pm:44
+#: ../IkiWiki/Plugin/shortcut.pm:45
 msgid "missing name or url parameter"
 msgstr ""
 
 #. translators: This is used to display what shortcuts are defined.
 #. translators: First parameter is the name of the shortcut, the second
 #. translators: is an URL.
-#: ../IkiWiki/Plugin/shortcut.pm:54
+#: ../IkiWiki/Plugin/shortcut.pm:55
 #, perl-format
 msgid "shortcut %s points to <i>%s</i>"
 msgstr ""
@@ -872,113 +894,116 @@ msgstr ""
 msgid "failed to parse any smileys"
 msgstr ""
 
-#: ../IkiWiki/Plugin/sparkline.pm:72
+#: ../IkiWiki/Plugin/sparkline.pm:73
 msgid "parse error"
 msgstr ""
 
-#: ../IkiWiki/Plugin/sparkline.pm:78
+#: ../IkiWiki/Plugin/sparkline.pm:79
 msgid "invalid featurepoint diameter"
 msgstr ""
 
-#: ../IkiWiki/Plugin/sparkline.pm:88
+#: ../IkiWiki/Plugin/sparkline.pm:89
 msgid "invalid featurepoint location"
 msgstr ""
 
-#: ../IkiWiki/Plugin/sparkline.pm:99
+#: ../IkiWiki/Plugin/sparkline.pm:100
 msgid "missing values"
 msgstr ""
 
-#: ../IkiWiki/Plugin/sparkline.pm:104
+#: ../IkiWiki/Plugin/sparkline.pm:105
 msgid "invalid height value"
 msgstr ""
 
-#: ../IkiWiki/Plugin/sparkline.pm:111
+#: ../IkiWiki/Plugin/sparkline.pm:112
 msgid "missing width parameter"
 msgstr ""
 
-#: ../IkiWiki/Plugin/sparkline.pm:115
+#: ../IkiWiki/Plugin/sparkline.pm:116
 msgid "invalid width value"
 msgstr ""
 
-#: ../IkiWiki/Plugin/sparkline.pm:153
+#: ../IkiWiki/Plugin/sparkline.pm:154
 msgid "failed to run php"
 msgstr ""
 
-#: ../IkiWiki/Plugin/table.pm:31
+#: ../IkiWiki/Plugin/table.pm:32
 msgid "cannot find file"
 msgstr ""
 
-#: ../IkiWiki/Plugin/table.pm:87
+#: ../IkiWiki/Plugin/table.pm:88
 msgid "unknown data format"
 msgstr ""
 
-#: ../IkiWiki/Plugin/table.pm:95
+#: ../IkiWiki/Plugin/table.pm:96
 msgid "empty data"
 msgstr ""
 
-#: ../IkiWiki/Plugin/table.pm:114
+#: ../IkiWiki/Plugin/table.pm:115
 msgid "Direct data download"
 msgstr ""
 
-#: ../IkiWiki/Plugin/table.pm:148
+#: ../IkiWiki/Plugin/table.pm:149
 #, perl-format
 msgid "parse fail at line %d: %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/template.pm:29
-msgid "missing id parameter"
-msgstr ""
+#: ../IkiWiki/Plugin/tag.pm:83
+#, fuzzy, perl-format
+msgid "creating tag page %s"
+msgstr "%s için yeni sayfa oluşturuluyor"
 
-#: ../IkiWiki/Plugin/template.pm:36
-#, perl-format
-msgid "template %s not found"
+#: ../IkiWiki/Plugin/template.pm:33
+msgid "missing id parameter"
 msgstr ""
 
-#: ../IkiWiki/Plugin/template.pm:55
-msgid "failed to process:"
-msgstr ""
+#: ../IkiWiki/Plugin/template.pm:47
+#, fuzzy, perl-format
+msgid "%s not found"
+msgstr "özet akışı bulunamadı"
 
-#: ../IkiWiki/Plugin/teximg.pm:70
+#: ../IkiWiki/Plugin/teximg.pm:72
 msgid "missing tex code"
 msgstr ""
 
-#: ../IkiWiki/Plugin/teximg.pm:122
+#: ../IkiWiki/Plugin/teximg.pm:124
 msgid "failed to generate image from code"
 msgstr ""
 
-#: ../IkiWiki/Plugin/websetup.pm:89
-msgid "plugin"
+#: ../IkiWiki/Plugin/websetup.pm:105
+#, perl-format
+msgid "%s plugin:"
 msgstr ""
 
-#: ../IkiWiki/Plugin/websetup.pm:108
+#: ../IkiWiki/Plugin/websetup.pm:121
+#, perl-format
+msgid "%s plugins"
+msgstr ""
+
+#: ../IkiWiki/Plugin/websetup.pm:135
 #, perl-format
 msgid "enable %s?"
 msgstr ""
 
-#: ../IkiWiki/Plugin/websetup.pm:240
+#: ../IkiWiki/Plugin/websetup.pm:276
 msgid "setup file for this wiki is not known"
 msgstr ""
 
-#: ../IkiWiki/Plugin/websetup.pm:256
+#: ../IkiWiki/Plugin/websetup.pm:292
 msgid "main"
 msgstr ""
 
-#: ../IkiWiki/Plugin/websetup.pm:257
-msgid "plugins"
-msgstr ""
-
-#: ../IkiWiki/Plugin/websetup.pm:395
+#: ../IkiWiki/Plugin/websetup.pm:435
 msgid ""
 "The configuration changes shown below require a wiki rebuild to take effect."
 msgstr ""
 
-#: ../IkiWiki/Plugin/websetup.pm:399
+#: ../IkiWiki/Plugin/websetup.pm:439
 msgid ""
 "For the configuration changes shown below to fully take effect, you may need "
 "to rebuild the wiki."
 msgstr ""
 
-#: ../IkiWiki/Plugin/websetup.pm:436
+#: ../IkiWiki/Plugin/websetup.pm:476
 #, perl-format
 msgid "Error: %s exited nonzero (%s). Discarding setup changes."
 msgstr ""
@@ -993,79 +1018,94 @@ msgstr ""
 msgid "bad file name %s"
 msgstr ""
 
-#: ../IkiWiki/Render.pm:150
+#: ../IkiWiki/Render.pm:158
 #, perl-format
 msgid "scanning %s"
 msgstr ""
 
-#: ../IkiWiki/Render.pm:271
+#: ../IkiWiki/Render.pm:280
 #, perl-format
 msgid ""
 "symlink found in srcdir path (%s) -- set allow_symlinks_before_srcdir to "
 "allow this"
 msgstr ""
 
-#: ../IkiWiki/Render.pm:300 ../IkiWiki/Render.pm:327
+#: ../IkiWiki/Render.pm:311
 #, perl-format
 msgid "skipping bad filename %s"
 msgstr ""
 
-#: ../IkiWiki/Render.pm:305
+#: ../IkiWiki/Render.pm:327
 #, perl-format
 msgid "%s has multiple possible source pages"
 msgstr ""
 
-#: ../IkiWiki/Render.pm:410
+#: ../IkiWiki/Render.pm:369
+#, perl-format
+msgid "querying %s for file creation and modification times.."
+msgstr ""
+
+#: ../IkiWiki/Render.pm:431
 #, perl-format
-msgid "removing old page %s"
+msgid "removing obsolete %s"
 msgstr ""
 
-#: ../IkiWiki/Render.pm:483
+#: ../IkiWiki/Render.pm:505
 #, perl-format
 msgid "building %s, which links to %s"
 msgstr ""
 
-#: ../IkiWiki/Render.pm:492
+#: ../IkiWiki/Render.pm:514
 #, perl-format
 msgid "removing %s, no longer built by %s"
 msgstr ""
 
-#: ../IkiWiki/Render.pm:615
+#: ../IkiWiki/Render.pm:597 ../IkiWiki/Render.pm:679
 #, perl-format
 msgid "building %s, which depends on %s"
 msgstr ""
 
-#: ../IkiWiki/Render.pm:628
+#: ../IkiWiki/Render.pm:692
 #, perl-format
 msgid "building %s, to update its backlinks"
 msgstr ""
 
-#: ../IkiWiki/Render.pm:693
+#: ../IkiWiki/Render.pm:821
 #, perl-format
 msgid "ikiwiki: cannot build %s"
 msgstr ""
 
 #. translators: The first parameter is a filename, and the second
 #. translators: is a (probably not translated) error message.
-#: ../IkiWiki/Setup.pm:19
+#: ../IkiWiki/Setup.pm:23
 #, perl-format
 msgid "cannot read %s: %s"
 msgstr ""
 
-#: ../IkiWiki/Setup/Automator.pm:33
+#: ../IkiWiki/Setup.pm:34
+#, perl-format
+msgid "cannot load %s in safe mode"
+msgstr ""
+
+#: ../IkiWiki/Setup.pm:47
+#, perl-format
+msgid "failed to parse %s"
+msgstr ""
+
+#: ../IkiWiki/Setup/Automator.pm:34
 msgid "you must enter a wikiname (that contains alphanumerics)"
 msgstr ""
 
-#: ../IkiWiki/Setup/Automator.pm:76
+#: ../IkiWiki/Setup/Automator.pm:89
 #, perl-format
 msgid "unsupported revision control system %s"
 msgstr ""
 
-#: ../IkiWiki/Setup/Automator.pm:102
+#: ../IkiWiki/Setup/Automator.pm:115
 msgid "failed to set up the repository with ikiwiki-makerepo"
 msgstr ""
 
-#: ../IkiWiki/Setup/Automator.pm:120
+#: ../IkiWiki/Setup/Automator.pm:134
 #, perl-format
 msgid "** Disabling plugin %s, since it is failing with this message:"
 msgstr ""
@@ -1084,13 +1124,13 @@ msgid "wrapper filename not specified"
 msgstr ""
 
 #. translators: The parameter is a C filename.
-#: ../IkiWiki/Wrapper.pm:149
+#: ../IkiWiki/Wrapper.pm:160
 #, perl-format
 msgid "failed to compile %s"
 msgstr ""
 
 #. translators: The parameter is a filename.
-#: ../IkiWiki/Wrapper.pm:169
+#: ../IkiWiki/Wrapper.pm:180
 #, perl-format
 msgid "successfully generated %s"
 msgstr ""
@@ -1103,58 +1143,63 @@ msgstr ""
 msgid "       ikiwiki --setup configfile"
 msgstr ""
 
-#: ../ikiwiki.in:91
+#: ../ikiwiki.in:96
 msgid "usage: --set var=value"
 msgstr ""
 
-#: ../ikiwiki.in:140
+#: ../ikiwiki.in:103
+msgid "usage: --set-yaml var=value"
+msgstr ""
+
+#: ../ikiwiki.in:157
 msgid "generating wrappers.."
 msgstr ""
 
-#: ../ikiwiki.in:195
+#: ../ikiwiki.in:220
 msgid "rebuilding wiki.."
 msgstr ""
 
-#: ../ikiwiki.in:198
+#: ../ikiwiki.in:223
 msgid "refreshing wiki.."
 msgstr ""
 
-#: ../IkiWiki.pm:238
+#: ../IkiWiki.pm:232
 msgid "Discussion"
 msgstr ""
 
-#: ../IkiWiki.pm:507
+#: ../IkiWiki.pm:531
 msgid "Must specify url to wiki with --url when using --cgi"
 msgstr ""
 
-#: ../IkiWiki.pm:553
+#: ../IkiWiki.pm:577
 msgid "cannot use multiple rcs plugins"
 msgstr ""
 
-#: ../IkiWiki.pm:582
+#: ../IkiWiki.pm:606
 #, perl-format
 msgid "failed to load external plugin needed for %s plugin: %s"
 msgstr ""
 
-#: ../IkiWiki.pm:1263
+#: ../IkiWiki.pm:1298
 #, perl-format
 msgid "preprocessing loop detected on %s at depth %i"
 msgstr ""
 
-#: ../IkiWiki.pm:1862
+#: ../IkiWiki.pm:1993
 msgid "yes"
 msgstr ""
 
-#: ../IkiWiki.pm:2005
-msgid "Sort::Naturally needed for title_natural sort"
+#: ../IkiWiki.pm:2070
+#, perl-format
+msgid "invalid sort type %s"
 msgstr ""
 
-#: ../IkiWiki.pm:2016
+#: ../IkiWiki.pm:2091
 #, perl-format
 msgid "unknown sort type %s"
 msgstr ""
 
-#: ../IkiWiki.pm:2035
+#: ../IkiWiki.pm:2227
 #, perl-format
 msgid "cannot match pages: %s"
 msgstr ""
@@ -1178,3 +1223,6 @@ msgstr ""
 #: ../auto.setup:24
 msgid "What is the domain name of the web server?"
 msgstr ""
+
+#~ msgid "You need to log in first."
+#~ msgstr "Önce sisteme giriş yapmanız gerekiyor."
index 333d331d1e6a35a65617aa6d2cef836ceff02f69..8d3516cff14a789341e25ae6c08d56feb397809e 100644 (file)
@@ -8,7 +8,7 @@ use IkiWiki::Setup::Standard {
        # will excessively bloat things.
         po_slave_languages => {
                'es' => 'Español',
-               #'de' => 'Deutsch',
+               'de' => 'Deutsch',
                'fr' => 'Français',
                'da' => 'Dansk',
                'cs' => 'česky',
@@ -24,6 +24,7 @@ use IkiWiki::Setup::Standard {
        # we don't want to pull in the normal underlays
        underlaydirbase => "underlays/empty",
        underlaydir => "underlays/empty",
+       disable_plugins => [qw{openid}], # needs special underlay
        discussion => 0,
        locale => '',
        verbose => 1,
diff --git a/po/underlays/basewiki/ikiwiki.de.po b/po/underlays/basewiki/ikiwiki.de.po
new file mode 100644 (file)
index 0000000..1eb8429
--- /dev/null
@@ -0,0 +1,69 @@
+# German translation of basewiki/ikiwiki page for ikiwiki.
+# Copyright © 2010 Sebastian Kuhnert <mail@sebastian-kuhnert.de>
+# Redistribution and use in source and compiled forms, with or without
+# modification, are permitted under any circumstances. No warranty.
+msgid ""
+msgstr ""
+"POT-Creation-Date: 2010-03-12 09:29+0530\n"
+"PO-Revision-Date: 2010-03-12 09:37+0530\n"
+"Last-Translator: Sebastian Kuhnert <mail@sebastian-kuhnert.de>\n"
+"Language-Team: None\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!meta robots=\"noindex, follow\"]]\n"
+msgstr "[[!meta robots=\"noindex, follow\"]]\n"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"This wiki is powered by [ikiwiki](http://ikiwiki.info/).\n"
+"[[!if test=\"enabled(version)\"\n"
+"     then=\"(Currently running version [[!version ]].)\"\n"
+"]]\n"
+msgstr ""
+"Dieses Wiki basiert auf [ikiwiki](http://ikiwiki.info/).\n"
+"[[!if test=\"enabled(version)\"\n"
+"     then=\"(Es läuft Version [[!version ]].)\"\n"
+"]]\n"
+
+#. type: Plain text
+msgid "Some documentation on using ikiwiki:"
+msgstr "Dokumentation zur Verwendung von ikiwiki:"
+
+#. type: Bullet: '* '
+msgid "[[ikiwiki/formatting]]"
+msgstr "[[Formatierung|ikiwiki/formatting]]"
+
+#. type: Bullet: '* '
+msgid "[[ikiwiki/wikilink]]"
+msgstr "[[ikiwiki/wikilink]]"
+
+#. type: Bullet: '* '
+msgid "[[ikiwiki/subpage]]"
+msgstr "[[Unterseiten|ikiwiki/subpage]]"
+
+#. type: Bullet: '* '
+msgid "[[ikiwiki/pagespec]]"
+msgstr "[[ikiwiki/pagespec]]"
+
+#. type: Bullet: '* '
+msgid "[[ikiwiki/directive]]"
+msgstr "[[Anweisungen|ikiwiki/directive]]"
+
+#. type: Bullet: '* '
+msgid "[[ikiwiki/markdown]]"
+msgstr "[[ikiwiki/markdown]]"
+
+#. type: Bullet: '* '
+msgid "[[ikiwiki/openid]]"
+msgstr "[[ikiwiki/openid]]"
+
+#. type: Bullet: '* '
+msgid "[[ikiwiki/searching]]"
+msgstr "[[Suchen|ikiwiki/searching]]"
+
diff --git a/po/underlays/basewiki/ikiwiki/directive.de.po b/po/underlays/basewiki/ikiwiki/directive.de.po
new file mode 100644 (file)
index 0000000..d969f81
--- /dev/null
@@ -0,0 +1,137 @@
+# German translation of basewiki/ikiwiki/directive page for ikiwiki.
+# Copyright © 2010 Sebastian Kuhnert <mail@sebastian-kuhnert.de>
+# Redistribution and use in source and compiled forms, with or without
+# modification, are permitted under any circumstances. No warranty.
+msgid ""
+msgstr ""
+"POT-Creation-Date: 2010-03-12 09:29+0530\n"
+"PO-Revision-Date: 2010-03-14 15:16+0530\n"
+"Last-Translator: Sebastian Kuhnert <mail@sebastian-kuhnert.de>\n"
+"Language-Team: None\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!meta robots=\"noindex, follow\"]]\n"
+msgstr ""
+"[[!meta title=\"Anweisungen\"]]\n"
+"[[!meta robots=\"noindex, follow\"]]\n"
+
+#. type: Plain text
+msgid ""
+"Directives are similar to a [[ikiwiki/WikiLink]] in form, except they begin "
+"with `!` and may contain parameters. The general form is:"
+msgstr ""
+"Anweisungen haben eine ähnliche Form wie ein [[ikiwiki/WikiLink]], "
+"allerdings beginnen sie mit `!` und sie können Parameter enthalten. "
+"Die allgemeine Form ist:"
+
+#. type: Plain text
+#, no-wrap
+msgid "\t\\[[!directive param=\"value\" param=\"value\"]]\n"
+msgstr "\t\\[[!anweisung param=\"Wert\" param=\"Wert\"]]\n"
+
+#. type: Plain text
+msgid ""
+"This gets expanded before the rest of the page is processed, and can be used "
+"to transform the page in various ways."
+msgstr ""
+"Dies wird expandiert, bevor der Rest der Seite verarbeitet wird, und kann "
+"auf unterschiedliche Weise genutzt werden, die Seite zu verändern."
+
+#. type: Plain text
+msgid ""
+"The quotes around values can be omitted if the value is a simple word.  "
+"Also, some directives may use parameters without values, for example:"
+msgstr ""
+"Die Anführungszeichen um die Werte können weggelassen werden, "
+"wenn der Wert ein einfaches Wort ist. Einige Anweisungen verwenden "
+"auch Parameter ohne Wert, zum Beispiel:"
+
+#. type: Plain text
+#, no-wrap
+msgid "\t\\[[!tag foo]]\n"
+msgstr "\t\\[[!tag foo]]\n"
+
+#. type: Plain text
+msgid ""
+"A directive does not need to all be on one line, it can be wrapped to "
+"multiple lines if you like:"
+msgstr ""
+"Eine Anweisung muss nicht ganz in einer einzelnen Zeile stehen, "
+"sie kann auch auf mehrere Zeilen verteilt werden:"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"\t\\[[!directive foo=\"baldersnatch\"\n"
+"\tbar=\"supercalifragilisticexpialidocious\" baz=11]]\n"
+msgstr ""
+"\t\\[[!anweisung foo=\"baldersnatch\"\n"
+"\tbar=\"supercalifragilisticexpialidocious\" baz=11]]\n"
+
+#. type: Plain text
+msgid ""
+"Also, multiple lines of *quoted* text can be used for a value.  To allow "
+"quote marks inside the quoted text, delimit the block of text with "
+"triple-quotes:"
+msgstr ""
+"Außerdem können mehrere Zeilen Text *in Anführungszeichen* für einen "
+"Wert verwendet werden. Um Anführungszeichen innerhalb des Werts zu "
+"ermöglichen, trenne den Textblock durch dreifache Anführungszeichen ab:"
+
+#. type: Plain text
+#, no-wrap
+msgid "\t\\[[!directive text=\"\"\"\n"
+msgstr "\t\\[[!anweisung text=\"\"\"\n"
+
+#. type: Bullet: '     1. '
+msgid "\"foo\""
+msgstr "\"foo\""
+
+#. type: Bullet: '     2. '
+msgid "\"bar\""
+msgstr "\"bar\""
+
+#. type: Bullet: '     3. '
+msgid "\"baz\""
+msgstr "\"baz\""
+
+#. type: Plain text
+msgid ""
+"ikiwiki also has an older syntax for directives, which requires a space in "
+"directives to distinguish them from [[wikilinks|ikiwiki/wikilink]]. This "
+"syntax has several disadvantages: it requires a space after directives with "
+"no parameters (such as `\\[[pagecount ]]`), and it prohibits spaces in "
+"[[wikilinks|ikiwiki/wikilink]].  ikiwiki now provides the `!`-prefixed "
+"syntax shown above as default.  However, ikiwiki still supports wikis using "
+"the older syntax, if the `prefix_directives` option is disabled."
+msgstr ""
+"Es gibt in ikiwiki auch eine ältere Syntax für Anweisungen, die ein "
+"Leerzeichen in erfordert, um sie von [[Wiki-Links|ikiwiki/wikilink]] zu "
+"unterscheiden. Diese Syntax hat mehrere Nachteile: Sie erfordert ein "
+"Leerzeichen nach Anweisungen ohne Parameter (so wie "
+"`\\[[pagecount ]]`), and sie verbietet Leerzeichen in "
+"[[Wiki-Links|ikiwiki/wikilink]]. Die oben gezeigte Syntax mit `!`-Präfix "
+"ist nun der Standard in ikiwiki. Die alte Syntax wird allerdings auch "
+"noch unterstützt, wenn die Option `prefix_directives` deaktiviert wird."
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!if test=\"enabled(listdirectives)\" then=\"\"\"\n"
+msgstr "[[!if test=\"enabled(listdirectives)\" then=\"\"\"\n"
+
+#. type: Plain text
+msgid "Here is a list of currently available directives in this wiki:"
+msgstr ""
+"Hier ist eine Liste der aktuell verfügbaren Anweisungen in diesem Wiki:"
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!listdirectives ]]\n"
+msgstr "[[!listdirectives ]]\n"
+
+
diff --git a/po/underlays/basewiki/ikiwiki/formatting.de.po b/po/underlays/basewiki/ikiwiki/formatting.de.po
new file mode 100644 (file)
index 0000000..a0171c3
--- /dev/null
@@ -0,0 +1,299 @@
+# German translation of basewiki/ikiwiki/formatting page for ikiwiki.
+# Copyright © 2010 Sebastian Kuhnert <mail@sebastian-kuhnert.de>
+# Redistribution and use in source and compiled forms, with or without
+# modification, are permitted under any circumstances. No warranty.
+msgid ""
+msgstr ""
+"POT-Creation-Date: 2010-03-12 09:29+0530\n"
+"PO-Revision-Date: 2010-03-14 13:35+0530\n"
+"Last-Translator: Sebastian Kuhnert <mail@sebastian-kuhnert.de>\n"
+"Language-Team: None\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!meta title=\"Formatting wiki pages\"]]\n"
+msgstr "[[!meta title=\"Wiki-Seiten formatieren\"]]\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!meta robots=\"noindex, follow\"]]\n"
+msgstr "[[!meta robots=\"noindex, follow\"]]\n"
+
+#. type: Plain text
+msgid ""
+"Text on this wiki is, by default, written in a form very close to how you "
+"might write text for an email message. This style of text formatting is "
+"called [[MarkDown]], and it works like this:"
+msgstr ""
+"Text wird in diesem Wiki standardmäßig in einer Form geschrieben, die "
+"sehr stark dem ähnelt, wie man eine E-Mail schreibt. Dieser "
+"Formatierungs-Stil wird [[MarkDown]] genannt und funktioniert folgendermaßen:"
+
+#. type: Plain text
+msgid "Leave blank lines between paragraphs."
+msgstr "Lasse Leerzeilen zwischen Absätzen."
+
+#. type: Plain text
+msgid ""
+"You can *\\*emphasise\\** or **\\*\\*strongly emphasise\\*\\*** text by "
+"placing it in single or double asterisks."
+msgstr ""
+"Man kann Text *\\*hervorheben\\** oder **\\*\\*stark hervorheben\\*\\***, "
+"indem man ihn zwischen einfache oder doppelte Sternchen setzt."
+
+#. type: Plain text
+msgid "To create a list, start each line with an asterisk:"
+msgstr "Um eine Liste zu erstellen, beginne jede Zeile mit einem Sternchen:"
+
+#. type: Bullet: '* '
+msgid "\"* this is my list\""
+msgstr "\"* Dies ist meine Liste\""
+
+#. type: Bullet: '* '
+msgid "\"* another item\""
+msgstr "\"* Noch ein Eintrag.\""
+
+#. type: Plain text
+msgid ""
+"To make a numbered list, start each line with a number (any number will do) "
+"followed by a period:"
+msgstr ""
+"Um eine nummerierte Liste zu erhalten, beginne jede Zeile mit einer Zahl "
+"(welche ist egal), auf die ein Punkt folgt:"
+
+#. type: Bullet: '1. '
+msgid "\"1. first line\""
+msgstr "\"1. Erste Zeile\""
+
+#. type: Bullet: '2. '
+msgid "\"2. second line\""
+msgstr "\"2. Zweite Zeile\""
+
+#. type: Bullet: '2. '
+msgid "\"2. third line\""
+msgstr "\"2. Dritte Zeile\""
+
+#. type: Plain text
+msgid ""
+"To create a header, start a line with one or more `#` characters followed by "
+"a space and the header text. The number of `#` characters controls the size "
+"of the header:"
+msgstr ""
+"Um eine Überschrift zu erstellen, beginne eine Zeile mit einem oder mehreren "
+"`#`-Zeichen gefolgt von einem Leerzeichen und dem Text der Überschrift. "
+"Die Anzahl der `#` steuert die Größe der Überschriften:"
+
+#. type: Title #
+#, no-wrap
+msgid "# h1"
+msgstr "# h1 "
+
+#. type: Title ##
+#, no-wrap
+msgid "## h2"
+msgstr "## h2"
+
+#. type: Title ###
+#, no-wrap
+msgid "### h3"
+msgstr "### h3"
+
+#. type: Title ####
+#, no-wrap
+msgid "#### h4"
+msgstr "#### h4"
+
+#. type: Title #####
+#, no-wrap
+msgid "##### h5"
+msgstr "##### h5"
+
+#. type: Title ######
+#, no-wrap
+msgid "###### h6"
+msgstr "###### h6"
+
+#. type: Plain text
+msgid ""
+"To create a horizontal rule, just write three or more dashes or stars on "
+"their own line:"
+msgstr ""
+"Um eine horizontale Linie zu erzeugen, schreibe einfach drei oder mehr "
+"Bindestriche oder Sternchen allein in eine Zeile:"
+
+#. type: Plain text
+#, no-wrap
+msgid "To quote someone, prefix the quote with \">\":\n"
+msgstr "Um jemanden zu zitieren, stelle dem Zitat `>` voran:\n"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"> To be or not to be,\n"
+"> that is the question.\n"
+msgstr ""
+"> Sein oder nicht sein,\n"
+"> das ist die Frage.\n"
+
+#. type: Plain text
+msgid "To write a code block, indent each line with a tab or 4 spaces:"
+msgstr ""
+"Um einen Block mit Programmcode zu schreiben, rücke jede Zeile mit "
+"einem Tabulatorzeichen oder 4 Leerzeichen ein:"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"\t10 PRINT \"Hello, world!\"\n"
+"\t20 GOTO 10\n"
+msgstr ""
+"\t10 PRINT \"Hallo, Welt!\"\n"
+"\t20 GOTO 10\n"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"To link to an url or email address, you can just put the\n"
+"url in angle brackets: <<http://ikiwiki.info>>, or you can use the\n"
+"form \\[link text\\]\\(url\\)\n"
+msgstr ""
+"Um eine URL oder E-Mail-Adresse zu verlinken, kann man die\n"
+"URL einfach ein spitze Klammern schreiben: <<http://ikiwiki.info>>; "
+"man kann auch die Form \\[Link-Text\\]\\(URL)\\) verwenden.\n"
+
+#. type: Plain text
+msgid ""
+"In addition to basic html formatting using [[MarkDown]], this wiki lets you "
+"use the following additional features:"
+msgstr ""
+"Zusätzlich zu der einfachen HTML-Formatierung mit [[MarkDown]] können "
+"in diesem Wiki die folgenden zusätzlichen Funktionen verwenden werden:"
+
+#. type: Bullet: '* '
+msgid ""
+"To link to another page on the wiki, place the page's name inside double "
+"square brackets. So you would use `\\[[WikiLink]]` to link to [[WikiLink]]."
+msgstr ""
+"Um eine andere Seite des Wikis zu verlinken, schreibe den Namen dieser "
+"Seite in doppelte eckige Klammern. Zum Beispiel kann man mit "
+"`\\[[WikiLink]]` auf [[WikiLink]] verweisen."
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!if test=\"enabled(smiley) and smileys\" then=\"\"\"\n"
+msgstr "[[!if test=\"enabled(smiley) and smileys\" then=\"\"\"\n"
+
+#. type: Bullet: '* '
+msgid "Insert [[smileys]] and some other useful symbols. :-)"
+msgstr "[[Smileys|smileys]] und einige andere nützliche Symbole einfügen. :-)"
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!if test=\"enabled(shortcut) and shortcuts\" then=\"\"\"\n"
+msgstr "[[!if test=\"enabled(shortcut) and shortcuts\" then=\"\"\"\n"
+
+#. type: Bullet: '* '
+msgid "Use [[shortcuts]] to link to common resources."
+msgstr ""
+"[[Abkürzungen|shortcuts]] verwenden, um auf gängige Quellen zu verweisen."
+
+#. type: Plain text
+#, no-wrap
+msgid "\t\\[[!wikipedia War\\_of\\_1812]]\n"
+msgstr "\t\\[[!wikipedia War\\_of\\_1812]]\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!if test=\"enabled(template) and templates\" then=\"\"\"\n"
+msgstr "[[!if test=\"enabled(template) and templates\" then=\"\"\"\n"
+
+#. type: Bullet: '* '
+msgid ""
+"Create and fill out [[templates]] for repeated chunks of parameterized wiki "
+"text."
+msgstr ""
+"[[Vorlagen|templates]] erstellen und ausfüllen für wiederholte Blöcke "
+"von parametrisiertem Wiki-Text."
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"* Insert various [[directives|directive]] onto a page to perform useful\n"
+"  actions.\n"
+"[[!if test=\"enabled(toc) or enabled(meta) or enabled(inline)\" "
+"then=\"\"\"\n"
+msgstr ""
+"* Unterschiedliche [[Anweisungen|directives]] in eine Seite einfügen,\n"
+"  die nützliche Aktionen durchführen.\n"
+"[[!if test=\"enabled(toc) or enabled(meta) or enabled(inline)\" "
+"then=\"\"\"\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "  For example, you can:\n"
+msgstr "  Zum Beispiel kann man:\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!if test=\"enabled(toc)\" then=\"\"\"\n"
+msgstr "[[!if test=\"enabled(toc)\" then=\"\"\"\n"
+
+#. type: Bullet: '  * '
+msgid "Add a table of contents to a page:"
+msgstr "Ein Inhaltsverzeichnis zu einer Seite hinzufügen:"
+
+#. type: Plain text
+#, no-wrap
+msgid "\t\\[[!toc]]\n"
+msgstr "\t\\[[!toc]]\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!if test=\"enabled(meta)\" then=\"\"\"\n"
+msgstr "[[!if test=\"enabled(meta)\" then=\"\"\"\n"
+
+#. type: Bullet: '  * '
+msgid "Change the title of a page:"
+msgstr "Den Titel einer Seite verändern:"
+
+#. type: Plain text
+#, no-wrap
+msgid "\t\\[[!meta title=\"full page title\"]]\n"
+msgstr "\t\\[[!meta title=\"Vollständiger Titel der Seite\"]]\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!if test=\"enabled(inline)\" then=\"\"\"\n"
+msgstr "[[!if test=\"enabled(inline)\" then=\"\"\"\n"
+
+#. type: Bullet: '  * '
+msgid "Create a blog by inlining a set of pages:"
+msgstr "Einen Blog durch Einbetten mehrerer Seiten erstellen:"
+
+#. type: Plain text
+#, no-wrap
+msgid "\t\\[[!inline pages=\"blog/*\"]]\n"
+msgstr "\t\\[[!inline pages=\"blog/*\"]]\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!if test=\"enabled(listdirectives)\" then=\"\"\"\n"
+msgstr "[[!if test=\"enabled(listdirectives)\" then=\"\"\"\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "  Full list of [[directives|directive]] enabled for this wiki:\n"
+msgstr ""
+"  Eine vollständige Liste der in diesem Wiki aktivierten "
+"[[Anweisungen|directive]]:\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "  [[!listdirectives ]]\n"
+msgstr "  [[!listdirectives ]]\n"
+
+
diff --git a/po/underlays/basewiki/ikiwiki/markdown.de.po b/po/underlays/basewiki/ikiwiki/markdown.de.po
new file mode 100644 (file)
index 0000000..1d1d849
--- /dev/null
@@ -0,0 +1,52 @@
+# German translation of basewiki/ikiwiki/markdown page for ikiwiki.
+# Copyright © 2010 Sebastian Kuhnert <mail@sebastian-kuhnert.de>
+# Redistribution and use in source and compiled forms, with or without
+# modification, are permitted under any circumstances. No warranty.
+msgid ""
+msgstr ""
+"POT-Creation-Date: 2010-03-12 09:29+0530\n"
+"PO-Revision-Date: 2010-03-14 13:36+0530\n"
+"Last-Translator: Sebastian Kuhnert <mail@sebastian-kuhnert.de>\n"
+"Language-Team: None\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!meta robots=\"noindex, follow\"]]\n"
+msgstr "[[!meta robots=\"noindex, follow\"]]\n"
+
+#. type: Plain text
+msgid ""
+"[Markdown](http://daringfireball.net/projects/markdown/)  is a minimal "
+"markup language that resembles plain text as used in email messages. It is "
+"the markup language used by this wiki by default."
+msgstr ""
+"[Markdown](http://daringfireball.net/projects/markdown/) ist eine minimale "
+"Sprache für Hervorhebungen, die sich an einfachem Text orientiert, wie er "
+"in "
+"E-Mail-Nachrichten verwendet wird. Diese Hervorhebungssprache wird "
+"standardmäßig in diesem Wiki verwendet."
+
+#. type: Plain text
+msgid ""
+"For documentation about the markdown syntax, see [[formatting]] and "
+"[Markdown: syntax](http://daringfireball.net/projects/markdown/syntax)."
+msgstr ""
+"Für die Dokumentation der Markdown-Syntax siehe "
+"[[Formatierung|formatting]] "
+"und [Markdown: Syntax](http://daringfireball.net/projects/markdown/syntax)."
+
+#. type: Plain text
+msgid ""
+"Note that [[WikiLinks|WikiLink]] and [[directives|directive]] are not part "
+"of the markdown syntax, and are the only bit of markup that this wiki "
+"handles internally."
+msgstr ""
+"Beachte dabei, dass [[WikiLinks|WikiLink]] und [[Anweisungen|directive]] "
+"nicht Teil der Markdown-Syntax sind: Sie sind die einzigen "
+"Formatierungsanweisungen, die dieses Wiki intern verarbeitet."
+
+
diff --git a/po/underlays/basewiki/ikiwiki/openid.de.po b/po/underlays/basewiki/ikiwiki/openid.de.po
new file mode 100644 (file)
index 0000000..27c7467
--- /dev/null
@@ -0,0 +1,115 @@
+# German translation of basewiki/ikiwiki/openid page for ikiwiki.
+# Copyright © 2010 Sebastian Kuhnert <mail@sebastian-kuhnert.de>
+# Redistribution and use in source and compiled forms, with or without
+# modification, are permitted under any circumstances. No warranty.
+msgid ""
+msgstr ""
+"POT-Creation-Date: 2010-03-12 09:29+0530\n"
+"PO-Revision-Date: 2010-03-12 22:29+0530\n"
+"Last-Translator: Sebastian Kuhnert <mail@sebastian-kuhnert.de>\n"
+"Language-Team: None\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!meta title=\"OpenID\"]]\n"
+msgstr "[[!meta title=\"OpenID\"]]\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!meta robots=\"noindex, follow\"]]\n"
+msgstr "[[!meta robots=\"noindex, follow\"]]\n"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"[[!if test=\"enabled(openid)\"\n"
+"     then=\"This wiki has OpenID **enabled**.\"\n"
+"     else=\"This wiki has OpenID **disabled**.\"]]\n"
+msgstr ""
+"[[!if test=\"enabled(openid)\"\n"
+"     then=\"In diesem Wiki ist OpenID **aktiviert**.\"\n"
+"     else=\"In diesem Wiki ist OpenID **deaktiviert**.\"]]\n"
+
+#. type: Plain text
+msgid ""
+"[OpenID](http://openid.net) is a decentralized authentication mechanism that "
+"allows you to have one login that you can use on a growing number of "
+"websites."
+msgstr ""
+"[OpenID](http://openid.net) ist ein Mechanismus zur dezentralen "
+"Authentifizierung, der es erlaubt, sich mit einem einzigen Benutzerkonto bei "
+"einer wachsenden Anzahl von Webseiten anzumelden."
+
+#. type: Plain text
+msgid "To sign up for an OpenID, visit one of the following identity providers:"
+msgstr ""
+"Eine OpenID kann man bei einem der folgenden Identitäts-Anbieter erhalten:"
+
+#. type: Bullet: '* '
+msgid "[MyOpenID](https://www.myopenid.com/)"
+msgstr "[MyOpenID](https://www.myopenid.com/)"
+
+#. type: Bullet: '* '
+msgid "[GetOpenID](https://getopenid.com/)"
+msgstr "[GetOpenID](https://getopenid.com/)"
+
+#. type: Bullet: '* '
+msgid "[LiveJournal](http://www.livejournal.com/openid/)"
+msgstr "[LiveJournal](http://www.livejournal.com/openid/)"
+
+#. type: Bullet: '* '
+msgid "[TrustBearer](https://openid.trustbearer.com/)"
+msgstr "[TrustBearer](https://openid.trustbearer.com/)"
+
+#. type: Bullet: '* '
+msgid ""
+"or any of the [many others out "
+"there](http://openiddirectory.com/openid-providers-c-1.html)"
+msgstr ""
+"oder einem der [vielen anderen](http://openiddirectory."
+"com/openid-providers-c-1.html)."
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"Your OpenID is the URL that you are given when you sign up.\n"
+"[[!if test=\"enabled(openid)\" then=\"\"\"\n"
+msgstr ""
+"Eine OpenID ist eine URL, die man bei der Anmeldung von seinem Anbieter "
+"erhält.\n"
+"[[!if test=\"enabled(openid)\" then=\"\"\"\n"
+
+#. type: Plain text
+msgid ""
+"To sign in to this wiki using OpenID, just enter it in the OpenID field in "
+"the signin form. You do not need to give this wiki a password or go through "
+"any registration process when using OpenID."
+msgstr ""
+"In diesem Wiki kann man sich per OpenID anmelden, indem man einfach seine "
+"OpenID im entsprechenden Feld des Anmeldeformulars eingibt. Man muss in "
+"diesem Wiki kein Passwort setzen und auch keinen Registrierungsprozess "
+"durchlaufen, wenn man OpenID verwendet."
+
+#. type: Plain text
+msgid ""
+"It's also possible to make a page in the wiki usable as an OpenID url, by "
+"delegating it to an openid server. Here's an example of how to do that:"
+msgstr ""
+"Außerdem ist es möglich, eine Seite dieses Wikis als OpenID-URL verwendbar zu "
+"machen, indem sie an einen OpenID-Server weitergereicht wird. Hier ist ein "
+"Beispiel, wie dies gemacht wird:"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"\t\\[[!meta openid=\"http://yourid.myopenid.com/\"\n"
+"\t       server=\"http://www.myopenid.com/server\"]]\n"
+msgstr ""
+"\t\\[[!meta openid=\"http://yourid.myopenid.com/\"\n"
+"\t       server=\"http://www.myopenid.com/server\"]]\n"
+
+
diff --git a/po/underlays/basewiki/ikiwiki/pagespec.de.po b/po/underlays/basewiki/ikiwiki/pagespec.de.po
new file mode 100644 (file)
index 0000000..401b4f4
--- /dev/null
@@ -0,0 +1,258 @@
+# German translation of basewiki/ikiwiki/pagespec page for ikiwiki.
+# Copyright © 2010 Sebastian Kuhnert <mail@sebastian-kuhnert.de>
+# Redistribution and use in source and compiled forms, with or without
+# modification, are permitted under any circumstances. No warranty.
+msgid ""
+msgstr ""
+"POT-Creation-Date: 2010-03-12 09:29+0530\n"
+"PO-Revision-Date: 2010-03-14 13:39+0530\n"
+"Last-Translator: Sebastian Kuhnert <mail@sebastian-kuhnert.de>\n"
+"Language-Team: None\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!meta robots=\"noindex, follow\"]]\n"
+msgstr "[[!meta robots=\"noindex, follow\"]]\n"
+
+#. type: Plain text
+msgid ""
+"To select a set of pages, such as pages that are locked, pages whose commit "
+"emails you want subscribe to, or pages to combine into a blog, the wiki uses "
+"a PageSpec. This is an expression that matches a set of pages."
+msgstr ""
+"Um eine Menge von Seiten auszuwählen (etwa Seiten, die gesperrt werden sollen, "
+"deren Einrechungs-Mails man abonnieren will, oder die man zu einem Blog "
+"kombinieren will), verwendet das Wiki eine PageSpec. Dies ist ein Ausdruck, "
+"der auf bestimmte Seiten passt."
+
+#. type: Plain text
+msgid ""
+"The simplest PageSpec is a simple list of pages. For example, this matches "
+"any of the three listed pages:"
+msgstr ""
+"Die einfachste PageSpec ist eine einfache Liste von Seiten. Zum Beispiel passt "
+"dies "
+"auf jede der drei aufgezählten Seiten:"
+
+#. type: Plain text
+#, no-wrap
+msgid "\tfoo or bar or baz\n"
+msgstr "\tfoo or bar or baz\n"
+
+#. type: Plain text
+msgid ""
+"More often you will want to match any pages that have a particular thing in "
+"their name. You can do this using a glob pattern. \"`*`\" stands for any "
+"part of a page name, and \"`?`\" for any single letter of a page name. So "
+"this matches all pages about music, and any [[SubPage]]s of the SandBox, but "
+"does not match the SandBox itself:"
+msgstr ""
+"Häufiger wird es vorkommen, dass man Seiten erfassen will, deren Name etwas "
+"bestimmtes enthält. Man kann dies mit einem Muster tun: \"`*`\" steht für "
+"einen beliebigen Teil eines Seitennamens und \"`?`\" steht für einen beliebigen "
+"Buchstaben eines Seitennamens. Also passt dies alle Seiten über Musik, und alle "
+"[[Unterseiten|SubPage]] des Sandkastens, aber nicht auf den Sandkasten selbst:"
+
+#. type: Plain text
+#, no-wrap
+msgid "\t*music* or SandBox/*\n"
+msgstr "\t*music* or SandBox/*\n"
+
+#. type: Plain text
+msgid ""
+"You can also prefix an item with \"`!`\" to skip pages that match it. So to "
+"match all pages except for Discussion pages and the SandBox:"
+msgstr ""
+"Man kann einem Eintrag ein \"`!`\" voranstellen, um die betreffenden Seiten "
+"auszuschließen. Auf diese Weise können alle Seiten außer Diskussionsseiten und "
+"Sandkasten erfasst werden:"
+
+#. type: Bullet: '     * '
+msgid "and !SandBox and !*/Discussion"
+msgstr "and !SandBox and !*/Discussion"
+
+#. type: Plain text
+msgid ""
+"Some more elaborate limits can be added to what matches using these "
+"functions:"
+msgstr ""
+"Einige weitergehende Einschränkungen können hinzugefügt werden, indem die "
+"folgenden Funktionen verwendet werden:"
+
+#. type: Bullet: '* '
+msgid "\"`link(page)`\" - matches only pages that link to a given page (or glob)"
+msgstr ""
+"\"`link(page)`\" - passt nur auf Seiten, die einen Link auf die angegebene Seite "
+"(oder das angegebene Muster) enthalten"
+
+#. type: Bullet: '* '
+msgid ""
+"\"`tagged(tag)`\" - matches pages that are tagged or link to the given tag "
+"(or tags matched by a glob)"
+msgstr ""
+"\"`tagged(tag)`\" - passt nur auf Seiten, die mit dem angegebenen Tag versehen "
+"sind oder auf diesen verweisen (auch hier kann ein Muster verwendet werden)"
+
+#. type: Bullet: '* '
+msgid "\"`backlink(page)`\" - matches only pages that a given page links to"
+msgstr ""
+"\"`backlink(page)`\" - passt nur auf Seiten, auf die von der angegebenen Seite "
+"verwiesen wird"
+
+#. type: Bullet: '* '
+msgid "\"`creation_month(month)`\" - matches only pages created on the given month"
+msgstr ""
+"\"`creation_month(month)`\" - passt nur auf Seiten, die im angegebenen Monat "
+"erstellt wurden"
+
+#. type: Bullet: '* '
+msgid "\"`creation_day(mday)`\" - or day of the month"
+msgstr "\"`creation_day(mday)`\" - genauso für einen Tag im Monat"
+
+#. type: Bullet: '* '
+msgid "\"`creation_year(year)`\" - or year"
+msgstr "\"`creation_year(year)`\" - der ein Jahr"
+
+#. type: Bullet: '* '
+msgid ""
+"\"`created_after(page)`\" - matches only pages created after the given page "
+"was created"
+msgstr ""
+"\"`created_after(page)`\" - passt nur auf Seiten, die nach der angegebenen Seite "
+"angelegt wurden"
+
+#. type: Bullet: '* '
+msgid ""
+"\"`created_before(page)`\" - matches only pages created before the given "
+"page was created"
+msgstr ""
+"\"`created_before(page)`\" - passt nur auf Seiten, die vor der angegebenen Seite "
+"angelegt wurden."
+
+#. type: Bullet: '* '
+msgid ""
+"\"`glob(someglob)`\" - matches pages that match the given glob. Just writing "
+"the glob by itself is actually a shorthand for this function."
+msgstr ""
+"\"`glob(someglob)`\" - passt nur auf Seiten, auf die das angegebene Muster passt."
+" "
+"Das Muster direkt anzugeben ist eine Abkürzung für diese Funktion."
+
+#. type: Bullet: '* '
+msgid ""
+"\"`internal(glob)`\" - like `glob()`, but matches even internal-use pages "
+"that globs do not usually match."
+msgstr ""
+"\"`internal(glob)`\" - wie `glob()`, aber es werden auch intern verwendete "
+"Seiten "
+"erfasst, auf die normale Muster nicht passen."
+
+#. type: Bullet: '* '
+msgid ""
+"\"`title(glob)`\", \"`author(glob)`\", \"`authorurl(glob)`\", "
+"\"`license(glob)`\", \"`copyright(glob)`\" - match pages that have the given "
+"metadata, matching the specified glob."
+msgstr ""
+"\"`title(glob)`\", \"`author(glob)`\", \"`authorurl(glob)`\", "
+"\"`license(glob)`\", \"`copyright(glob)`\" - passt auf Seiten, deren Metadaten "
+"auf die angegebenen Muster passen."
+
+#. type: Bullet: '* '
+msgid ""
+"\"`user(username)`\" - tests whether a modification is being made by a user "
+"with the specified username. If openid is enabled, an openid can also be put "
+"here. Glob patterns can be used in the username. For example, to match all "
+"openid users, use `user(*://*)`"
+msgstr ""
+"\"`user(username)`\" - prüft ob eine Änderung von einem Benutzer mit dem "
+"angegebenen Namen gemacht wird. Wenn OpenID aktiviert ist, kann auch eine "
+"OpenID angegeben werden. Muster können im Benutzernamen verwendet werden. "
+"zum Beispiel können alle OpenID-Nutzer mit `user(*://*)` erfasst werden."
+
+#. type: Bullet: '* '
+msgid ""
+"\"`admin()`\" - tests whether a modification is being made by one of the "
+"wiki admins."
+msgstr ""
+"\"`admin()`\" - prüft ob eine Änderung durch einen der Wiki-Administratoren "
+"gemacht wird."
+
+#. type: Bullet: '* '
+msgid ""
+"\"`ip(address)`\" - tests whether a modification is being made from the "
+"specified IP address."
+msgstr ""
+"\"`ip(address)`\" - prüft ob eine Änderung von der angegebenen IP-Adresse aus "
+"gemacht wird."
+
+#. type: Bullet: '* '
+msgid ""
+"\"`postcomment(glob)`\" - matches only when comments are being posted to a "
+"page matching the specified glob"
+msgstr ""
+"\"`postcomment(glob)`\" - passt nur, wenn ein Kommentar zu einer durch das "
+"Muster angegebenen Seite gemacht wird"
+
+#. type: Plain text
+msgid ""
+"For example, to match all pages in a blog that link to the page about music "
+"and were written in 2005:"
+msgstr ""
+"Zum Beispiel können alle Seiten eines Blogs ausgewählt werden, die einen Link "
+"zu einer Seite über Musik enthalten und 2005 geschrieben wurden:"
+
+#. type: Plain text
+#, no-wrap
+msgid "\tblog/* and link(music) and creation_year(2005)\n"
+msgstr "\tblog/* and link(music) and creation_year(2005)\n"
+
+#. type: Plain text
+msgid ""
+"Note the use of \"and\" in the above example, that means that only pages "
+"that match each of the three expressions match the whole. Use \"and\" when "
+"you want to combine expression like that; \"or\" when it's enough for a page "
+"to match one expression. Note that it doesn't make sense to say \"index and "
+"SandBox\", since no page can match both expressions."
+msgstr ""
+"Beachte die Verwendung von `and` im obigen Beispiel: Dies bewirkt, dass "
+"nur die Seiten auf den gesamten Ausdruck passen, die auf alle drei "
+"Teilausdrücke passen. Verwende `and` um Ausdrücke so zu kombinieren "
+"und `or` wenn eine Seite nur auf einen der Ausdrücke passen soll. Beachte "
+"dass es sinnlos ist, `index and SandBox` zu sagen, da keine Seite auf beide "
+"Ausdrücke passen kann."
+
+#. type: Plain text
+msgid ""
+"More complex expressions can also be created, by using parentheses for "
+"grouping. For example, to match pages in a blog that are tagged with either "
+"of two tags, use:"
+msgstr ""
+"Es können auch komplexere Ausdrücke erstellt werden, indem Klammern "
+"zur Gruppierung verwendet werden. Zum Beispiel passt der folgende "
+"Ausdruck auf Blog-Seiten, die mit einem der beiden angegebenen Tags "
+"versehen sind:"
+
+#. type: Plain text
+#, no-wrap
+msgid "\tblog/* and (tagged(foo) or tagged(bar))\n"
+msgstr "\tblog/* and (tagged(foo) or tagged(bar))\n"
+
+#. type: Plain text
+msgid ""
+"Note that page names in PageSpecs are matched against the absolute filenames "
+"of the pages in the wiki, so a pagespec \"foo\" used on page \"a/b\" will "
+"not match a page named \"a/foo\" or \"a/b/foo\". To match relative to the "
+"directory of the page containing the pagespec, you can use \"./\". For "
+"example, \"./foo\" on page \"a/b\" matches page \"a/foo\"."
+msgstr ""
+"Beachte, dass Seitennamen in PageSpecs auf den absoluten Dateinamen "
+"der Seiten im Wiki passen müssen: Die PageSpec `foo` auf der Seite `a/b` "
+"wird weder auf `a/foo` noch auf `a/b/foo` passen. Um relative Pfade zum "
+"Verzeichnis der Seite, die die PageSpec enthält, zu verwenden, kannst du "
+"`./` verwenden. Zum Beispiel passt `./foo` auf der Seite `a/b` auf `a/foo`."
+
+
diff --git a/po/underlays/basewiki/ikiwiki/pagespec/attachment.de.po b/po/underlays/basewiki/ikiwiki/pagespec/attachment.de.po
new file mode 100644 (file)
index 0000000..1a20a5f
--- /dev/null
@@ -0,0 +1,122 @@
+# German translation of basewiki/ikiwiki/pagespec/attachment page for ikiwiki.
+# Copyright © 2010 Sebastian Kuhnert <mail@sebastian-kuhnert.de>
+# Redistribution and use in source and compiled forms, with or without
+# modification, are permitted under any circumstances. No warranty.
+msgid ""
+msgstr ""
+"POT-Creation-Date: 2010-03-12 09:29+0530\n"
+"PO-Revision-Date: 2010-03-14 15:17+0530\n"
+"Last-Translator: Sebastian Kuhnert <mail@sebastian-kuhnert.de>\n"
+"Language-Team: None\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!meta robots=\"noindex, follow\"]]\n"
+msgstr ""
+"[[!meta title=\"Anhänge\"]]\n"
+"[[!meta robots=\"noindex, follow\"]]\n"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"[[!if test=\"enabled(attachment)\"\n"
+"     then=\"This wiki has attachments **enabled**.\"\n"
+"     else=\"This wiki has attachments **disabled**.\"]]\n"
+msgstr ""
+"[[!if test=\"enabled(attachment)\"\n"
+"     then=\"In diesem Wiki sind Anhänge **aktiviert**.\"\n"
+"     else=\"In diesem Wiki sind Anhänge **deaktiviert**.\"]]\n"
+
+#. type: Plain text
+msgid ""
+"If attachments are enabled, the wiki admin can control what types of "
+"attachments will be accepted, via the `allowed_attachments` configuration "
+"setting."
+msgstr ""
+"Wenn Anhänge aktiviert sind, kann der Administrator des Wikis bestimmen, "
+"welche Arten von Anhängen akzeptiert werden, indem er die Einstellung "
+"`allowed_attachments` verändert."
+
+#. type: Plain text
+msgid ""
+"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 viruses, something like this could be used:"
+msgstr ""
+"Zum Beispiel können beliebige Dateien auf 50 Kilobyte beschränkt, "
+"aber größere mp3-Dateien von joey in einem bestimmten Verzeichnis erlaubt, "
+"und alle Anhänge nach Viren durchsucht werden, indem etwas wie "
+"das Folgende verwendet wird:"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"\tvirusfree() and ((user(joey) and podcast/*.mp3 and mimetype(audio/mpeg) "
+"and maxsize(15mb)) or (!ispage() and maxsize(50kb)))\n"
+msgstr ""
+"\tvirusfree() and ((user(joey) and podcast/*.mp3 and mimetype(audio/mpeg) "
+"and maxsize(15mb)) or (!ispage() and maxsize(50kb)))\n"
+
+#. type: Plain text
+msgid ""
+"The regular [[ikiwiki/PageSpec]] syntax is expanded with the following "
+"additional tests:"
+msgstr ""
+"Die reguläre [[ikiwiki/PageSpec]]-Syntax ist um die folgenden zusätzlichen "
+"Tests erweitert:"
+
+#. type: Bullet: '* '
+msgid ""
+"\"`maxsize(size)`\" - tests whether the attachment is no larger than the "
+"specified size. The size defaults to being in bytes, but \"kb\", \"mb\", "
+"\"gb\" etc can be used to specify the units."
+msgstr ""
+"\"`maxsize(size)`\" - prüft ob der Anhang nicht größer ist als angegeben. "
+"Die Größe wird standardmäßig in Bytes angegeben, aber `kb`, `mb`, "
+"`gb` und so weiter kann verwendet werden, um die Einheit anzugeben."
+
+#. type: Bullet: '* '
+msgid ""
+"\"`minsize(size)`\" - tests whether the attachment is no smaller than the "
+"specified size."
+msgstr ""
+"\"`minsize(size)`\" - prüft ob der Anhang nicht kleiner ist als angegeben."
+
+#. type: Bullet: '* '
+msgid ""
+"\"`ispage()`\" - tests whether the attachment will be treated by ikiwiki as "
+"a wiki page. (Ie, if it has an extension of \".mdwn\", or of any other "
+"enabled page format)."
+msgstr ""
+"\"`ispage()`\" - prüft ob der Anhang von ikiwiki als Wiki-Seite behandelt "
+"wird. Dies ist der Fall, wenn er die Endung `.mdwn` oder die eines anderen "
+"aktivierten Seitenformats hat."
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"  So, if you don't want to allow wiki pages to be uploaded as attachments,\n"
+"  use `!ispage()` ; if you only want to allow wiki pages to be uploaded\n"
+"  as attachments, use `ispage()`.\n"
+msgstr ""
+"  Wenn man also verhindern will, dass Wiki-Seiten als Anhang hochgeladen\n"
+"  werden, kann `!ispage()` verwendet werden; wenn nur Wiki-Seiten\n"
+"  hochgeladen werden können sollen, geht dies mit `ispage()`.\n"
+
+#. type: Bullet: '* '
+msgid ""
+"\"`mimetype(foo/bar)`\" - checks the MIME type of the attachment. You can "
+"include a glob in the type, for example `mimetype(image/*)`."
+msgstr ""
+"\"`mimetype(foo/bar)`\" - prüft den MIME-Typ des Anhangs. Man kann ein "
+"Muster für den Typen verwenden, zum Beispiel `mimetype(image/*)`."
+
+#. type: Bullet: '* '
+msgid "\"`virusfree()`\" - checks the attachment with an antiviral program."
+msgstr "\"`virusfree()`\" - prüft den Anhang mit einem Virenscanner."
+
+
diff --git a/po/underlays/basewiki/ikiwiki/pagespec/po.de.po b/po/underlays/basewiki/ikiwiki/pagespec/po.de.po
new file mode 100644 (file)
index 0000000..785b16f
--- /dev/null
@@ -0,0 +1,70 @@
+# German translation of basewiki/ikiwiki/pagespec/po page for ikiwiki.
+# Copyright © 2010 Sebastian Kuhnert <mail@sebastian-kuhnert.de>
+# Redistribution and use in source and compiled forms, with or without
+# modification, are permitted under any circumstances. No warranty.
+msgid ""
+msgstr ""
+"POT-Creation-Date: 2010-03-12 09:29+0530\n"
+"PO-Revision-Date: 2010-03-14 13:55+0530\n"
+"Last-Translator: Sebastian Kuhnert <mail@sebastian-kuhnert.de>\n"
+"Language-Team: None\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"[[!if test=\"enabled(po)\"\n"
+"     then=\"This wiki has po support **enabled**.\"\n"
+"     else=\"This wiki has po support **disabled**.\"]]\n"
+msgstr ""
+"[[!if test=\"enabled(po)\"\n"
+"     then=\"In diesem Wiki ist die po-Unterstützung **aktiviert**.\"\n"
+"     else=\"In diesem Wiki ist die po-Unterstützung **deaktiviert**.\"]]\n"
+
+#. type: Plain text
+msgid ""
+"If the [[!iki plugins/po desc=po]] plugin is enabled, the regular "
+"[[ikiwiki/PageSpec]] syntax is expanded with the following additional tests "
+"that can be used to improve user navigation in a multi-lingual wiki:"
+msgstr ""
+"Wenn die [[!iki plugins/po desc=po]]-Erweiterung aktiviert ist, ist die "
+"reguläre "
+"[[ikiwiki/PageSpec]]-Syntax um die folgenden zusätzlichen Tests erweitert, "
+"die zur Verbesserung der Benutzernavigation in mehrsprachigen Wikis "
+"verwendet werden kann:"
+
+#. type: Bullet: '* '
+msgid ""
+"\"`lang(LL)`\" - tests whether a page is written in the language specified "
+"as a ISO639-1 (two-letter) language code."
+msgstr ""
+"\"`lang(LL)`\" - prüft ob eine Seite in der angegebenen Sprache geschrieben "
+"ist. "
+"Die Sprache wird als (zweibuchstabiger) Sprachcode nach ISO639-1 angegeben."
+
+#. type: Bullet: '* '
+msgid ""
+"\"`currentlang()`\" - tests whether a page is written in the same language "
+"as the current page."
+msgstr ""
+"\"`currentlang()`\" - prüft, ob eine Seite in der gleichen Sprache "
+"geschrieben ist wie "
+"die aktuelle Seite."
+
+#. type: Plain text
+msgid ""
+"Note that every non-po page is considered to be written in "
+"`po_master_language`, as specified in `ikiwiki.setup`."
+msgstr ""
+"Beachte, dass als Sprache jeder nicht-po-Seite `po_master_language` "
+" angenommen wird, wie in `ikiwiki.setup` angegeben."
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!meta robots=\"noindex, follow\"]]\n"
+msgstr "[[!meta robots=\"noindex, follow\"]]\n"
+
+
diff --git a/po/underlays/basewiki/ikiwiki/pagespec/sorting.de.po b/po/underlays/basewiki/ikiwiki/pagespec/sorting.de.po
new file mode 100644 (file)
index 0000000..dbc6dbb
--- /dev/null
@@ -0,0 +1,48 @@
+# German translation of basewiki/ikiwiki/pagespec/sorting page for ikiwiki.
+# Copyright © 2010 Sebastian Kuhnert <mail@sebastian-kuhnert.de>
+# Redistribution and use in source and compiled forms, with or without
+# modification, are permitted under any circumstances. No warranty.
+msgid ""
+msgstr ""
+"POT-Creation-Date: 2010-03-12 09:29+0530\n"
+"PO-Revision-Date: 2010-03-14 15:19+0530\n"
+"Last-Translator: Sebastian Kuhnert <mail@sebastian-kuhnert.de>\n"
+"Language-Team: None\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#. type: Plain text
+msgid ""
+"Some [[directives|ikiwiki/directive]] that use "
+"[[PageSpecs|ikiwiki/pagespec]] allow specifying the order that matching "
+"pages are shown in. The following sort orders can be specified."
+msgstr ""
+"[[!meta title=\"Sortierung\"]]\n"
+"Bei einigen der [[Anweisungen|ikiwiki/directive]], die [[PageSpecs|ikiwiki/pagespec]] verwenden, kann eine Reihenfolge angegeben werden, in der die ausgewählten Seiten angezeigt werden. Die folgenden Sortierreihenfolgen können angegeben werden:"
+
+#. type: Bullet: '* '
+msgid "`age` - List pages from the most recently created to the oldest."
+msgstr "`age` - Zeige die Seiten von der zuletzt angelegten zur ältesten."
+
+#. type: Bullet: '* '
+msgid "`mtime` - List pages with the most recently modified first."
+msgstr "`mtime` - Zeige die Seiten mit der zuletzt veränderten zuerst."
+
+#. type: Bullet: '* '
+msgid "`title` - Order by title."
+msgstr "`title` - Sortiere nach Titel."
+
+#. type: Bullet: '* '
+msgid ""
+"`title_natural` - Only available if [[!cpan Sort::Naturally]] is "
+"installed. Orders by title, but numbers in the title are treated as such, "
+"(\"1 2 9 10 20\" instead of \"1 10 2 20 9\")"
+msgstr ""
+"`title_natural` - Nur verfügbar, wenn [[!cpan Sort::Naturally]] "
+"installiert ist. "
+"Sortiert nach Titel, aber Zahlen im Titel werden als solche behandelt"
+"(\"1 2 9 10 20\" statt \"1 10 2 20 9\")."
+
+
diff --git a/po/underlays/basewiki/ikiwiki/searching.de.po b/po/underlays/basewiki/ikiwiki/searching.de.po
new file mode 100644 (file)
index 0000000..ca50e05
--- /dev/null
@@ -0,0 +1,92 @@
+# German translation of basewiki/ikiwiki/searching page for ikiwiki.
+# Copyright © 2010 Sebastian Kuhnert <mail@sebastian-kuhnert.de>
+# Redistribution and use in source and compiled forms, with or without
+# modification, are permitted under any circumstances. No warranty.
+msgid ""
+msgstr ""
+"POT-Creation-Date: 2010-03-12 09:29+0530\n"
+"PO-Revision-Date: 2010-03-14 15:14+0530\n"
+"Last-Translator: Sebastian Kuhnert <mail@sebastian-kuhnert.de>\n"
+"Language-Team: None\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!meta robots=\"noindex, follow\"]]\n"
+msgstr ""
+"[[!meta robots=\"noindex, follow\"]]\n"
+"[[!meta title=\"Suchen\"]]\n"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"[[!if test=\"enabled(search)\"\n"
+"then=\"This wiki has searching **enabled**.\"\n"
+"else=\"This wiki has searching **disabled**.\"]]\n"
+msgstr ""
+"[[!if test=\"enabled(search)\"\n"
+"then=\"In diesem Wiki ist Suchen **aktiviert**.\"\n"
+"else=\"In diesem Wiki ist Suchen **deaktiviert**.\"]]\n"
+
+#. type: Plain text
+msgid ""
+"If searching is enabled, you can enter search terms in the search field, as "
+"you'd expect. There are a few special things you can do to construct more "
+"powerful searches."
+msgstr ""
+"Wenn Suchen aktiviert ist, kann man wie erwartet Suchausdrücke in das "
+"Suchfeld eintragen. Es gibt einige spezielle Ausdrücke, um mächtigere "
+"Suchen zu erstellen."
+
+#. type: Bullet: '* '
+msgid "To match a phrase, enclose it in double quotes."
+msgstr ""
+"Um nach einer Phrase aus mehreren Wörtern zu suchen, schreibe sie in "
+"Anführungszeichen."
+
+#. type: Bullet: '* '
+msgid "`AND` can be used to search for documents containing two expressions."
+msgstr ""
+"`AND` kann verwendet werden, um nach Dokumenten mit zwei Ausdrücken zu "
+"suchen."
+
+#. type: Bullet: '* '
+msgid ""
+"`OR` can be used to search for documents containing either one of two "
+"expressions."
+msgstr ""
+"`OR` kann verwendet werden, um nach Dokumenten mit einem der beiden "
+"Ausdrücke zu suchen."
+
+#. type: Bullet: '* '
+msgid ""
+"Parentheses can be used to build up complicated search expressions. For "
+"example, \"(foo AND bar) OR (me AND you)\""
+msgstr ""
+"Klammern können verwendet werden, um komplexere Suchausdrücke aufzubauen. "
+"Zum Beispiel `(foo AND bar) OR (ich AND du)`."
+
+#. type: Bullet: '* '
+msgid ""
+"Prefix a search term with \"-\" to avoid it from appearing in the results.  "
+"For example, \"-discussion\" will omit \"discussion\"."
+msgstr ""
+"Stelle einem Suchausdruck `-` voran, damit er nicht in den Ergebnissen "
+"auftaucht. "
+"Zum Beispiel wird `-Diskussion`alle Seiten mit \"Diskussion\" ausschließen."
+
+#. type: Bullet: '* '
+msgid "To search for a page with a given title, use \"title:foo\"."
+msgstr ""
+"Um nach einer Seite mit einem bestimmten Titel zu suchen, verwende "
+"`title:foo`."
+
+#. type: Bullet: '* '
+msgid "To search for pages that contain a \"bar\" link, use \"link:bar\"."
+msgstr ""
+"Um nach Seiten mit einem Link auf \"bar\" zu suchen, verwende `link:bar`."
+
+
diff --git a/po/underlays/basewiki/ikiwiki/subpage.de.po b/po/underlays/basewiki/ikiwiki/subpage.de.po
new file mode 100644 (file)
index 0000000..184144c
--- /dev/null
@@ -0,0 +1,54 @@
+# German translation of basewiki/ikiwiki/subpage page for ikiwiki.
+# Copyright © 2010 Sebastian Kuhnert <mail@sebastian-kuhnert.de>
+# Redistribution and use in source and compiled forms, with or without
+# modification, are permitted under any circumstances. No warranty.
+msgid ""
+msgstr ""
+"POT-Creation-Date: 2010-03-12 09:29+0530\n"
+"PO-Revision-Date: 2010-03-14 15:19+0530\n"
+"Last-Translator: Sebastian Kuhnert <mail@sebastian-kuhnert.de>\n"
+"Language-Team: None\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!meta robots=\"noindex, follow\"]]\n"
+msgstr ""
+"[[!meta title=\"Unterseiten\"]]\n"
+"[[!meta robots=\"noindex, follow\"]]\n"
+
+#. type: Plain text
+msgid ""
+"ikiwiki supports placing pages in a directory hierarchy. For example, this "
+"page, [[SubPage]] has some related pages placed under it, like "
+"[[SubPage/LinkingRules]]. This is a useful way to add some order to your "
+"wiki rather than just having a great big directory full of pages."
+msgstr ""
+"In ikiwiki werden Seiten in einem Verzeichnisbaum angeordnet. Zum Beispiel "
+"gibt es unterhalb dieser Seite, [[SubPage]], einige verwandte Seiten, etwa "
+"[[SubPage/LinkingRules]]. Dies ist eine nützliche Möglichkeit, Ordnung in "
+"ein Wiki zu bringen und nicht nur ein riesiges Verzeichnis voller Seiten zu "
+"haben."
+
+#. type: Plain text
+msgid ""
+"To add a SubPage, just make a subdirectory and put pages in it. For example, "
+"this page is SubPage.mdwn in this wiki's source, and there is also a SubPage "
+"subdirectory, which contains SubPage/LinkingRules.mdwn. Subpages can be "
+"nested as deeply as you'd like."
+msgstr ""
+"Um eine Unterseite hinzuzufügen, legt man einfach ein Unterverzeichnis an "
+"und erstellt darin Seiten. Zum Beispiel ist diese Seite `SubPage.mdwn` in "
+"der Quelle dieses Wikis und es existiert auch ein Unterverzeichnis "
+"`SubPage`, das `SubPage/LinkingRules.mdwn` enthält. Unterseiten können "
+"beliebig tief verschachtelt werden."
+
+#. type: Plain text
+msgid "Linking to and from a SubPage is explained in [[LinkingRules]]."
+msgstr ""
+"Wie Links auf Unterseiten gesetzt werden, wird in [[LinkingRules]] erklärt."
+
+
diff --git a/po/underlays/basewiki/ikiwiki/subpage/linkingrules.de.po b/po/underlays/basewiki/ikiwiki/subpage/linkingrules.de.po
new file mode 100644 (file)
index 0000000..08ffd8c
--- /dev/null
@@ -0,0 +1,109 @@
+# German translation of basewiki/ikiwiki/subpage/linkingrules page for ikiwiki.
+# Copyright © 2010 Sebastian Kuhnert <mail@sebastian-kuhnert.de>
+# Redistribution and use in source and compiled forms, with or without
+# modification, are permitted under any circumstances. No warranty.
+msgid ""
+msgstr ""
+"POT-Creation-Date: 2010-03-12 09:29+0530\n"
+"PO-Revision-Date: 2010-03-14 15:21+0530\n"
+"Last-Translator: Sebastian Kuhnert <mail@sebastian-kuhnert.de>\n"
+"Language-Team: None\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!meta robots=\"noindex, follow\"]]\n"
+msgstr ""
+"[[!meta title=\"Regeln für Links\"]]\n"
+"[[!meta robots=\"noindex, follow\"]]\n"
+
+#. type: Plain text
+msgid ""
+"To link to or from a [[SubPage]], you can normally use a regular "
+"[[WikiLink]] that does not contain the name of the parent directory of the "
+"[[SubPage]]. Ikiwiki descends the directory hierarchy looking for a page "
+"that matches your link."
+msgstr ""
+"Um einen Link von oder zu einer [[Unterseite|SubPage]] anzulegen, kann man "
+"normalerweise einfache WikiLinks verwenden, ohne dass diese den Namen des "
+"Verzeichnisses enthalten, in dem die [[Unterseite|SubPage]] liegt. "
+"Ikiwiki läuft dann die Verzeichnishierarchie ab und sucht nach einer Seite, "
+"die zu dem angegebenen Link passt."
+
+#. type: Plain text
+msgid ""
+"For example, if FooBar/SubPage links to \"OtherPage\", ikiwiki will first "
+"prefer pointing the link to FooBar/SubPage/OtherPage if it exists, next to "
+"FooBar/OtherPage and finally to OtherPage in the root of the wiki."
+msgstr ""
+"Wenn zum Beispiel `FooBar/UnterSeite` einen Link auf `AndereSeite` enthält, "
+"wird ikiwiki bevorzugt auf `FooBar/UnterSeite/AndereSeite` verweisen, wenn "
+"diese existiert, dann auf `FooBar/AndereSeite` und schließlich auf "
+"`AndereSeite` im Wurzelverzeichnis des Wikis."
+
+#. type: Plain text
+msgid ""
+"Note that this means that if a link on FooBar/SomePage to \"OtherPage\" "
+"currently links to OtherPage, in the root of the wiki, and FooBar/OtherPage "
+"is created, the link will _change_ to point to FooBar/OtherPage. On the "
+"other hand, a link from BazBar to \"OtherPage\" would be unchanged by this "
+"creation of a [[SubPage]] of FooBar."
+msgstr ""
+"Insbesondere bedeutet dies, dass wenn ein Link auf `FooBar/EineSeite` auf "
+"`AndereSeite` momentan auf `AndereSeite` im Wurzelverzeichnis des Wikis "
+"verweist, und `FooBar/AndereSeite` erstellt wird, dann _ändert_ sich das "
+"Ziel des Links auf `FooBar/AndereSeite`. Andererseits würde ein Link von "
+"`BazBar` auf `AndereSeite` durch das Anlegen einer [[Unterseite|SubPage]] "
+"von `FooBar` unverändert bleiben."
+
+#. type: Plain text
+msgid ""
+"You can also specify a link that contains a directory name, like "
+"\"FooBar/OtherPage\" to more exactly specify what page to link to. This is "
+"the only way to link to an unrelated [[SubPage]]."
+msgstr ""
+"Man kann auch einen Link mit Verzeichnisnamen angeben, etwa "
+"`FooBar/AndereSeite`, um genauer anzugeben auf welche Seite verwiesen werden "
+"soll. Nur so kann auf eine [[Unterseite|SubPage]] einer anderen Seite "
+"verwiesen werden."
+
+#. type: Plain text
+msgid ""
+"You can use this to, for example, to link from BazBar to \"FooBar/SubPage\", "
+"or from BazBar/SubPage to \"FooBar/SubPage\"."
+msgstr ""
+"Man kann dies zum Beispiel dazu verwenden, um einen Link von `BazBar` auf "
+"`FooBar/UnterSeite` oder von `BazBar/UnterSeite` auf `FooBar/UnterSeite` "
+"anzulegen."
+
+#. type: Plain text
+msgid ""
+"You can also use \"/\" at the start of a link, to specify exactly which page "
+"to link to, when there are multiple pages with similar names and the link "
+"goes to the wrong page by default. For example, linking from "
+"\"FooBar/SubPage\" to \"/OtherPage\" will link to the \"OtherPage\" in the "
+"root of the wiki, even if there is a \"FooBar/OtherPage\"."
+msgstr ""
+"Man kann auch `/` am Anfang des Links verwenden, um die Zielseite genau zu "
+"spezifizieren, wenn es mehrere Seiten mit ähnlichen Namen gibt und der Link "
+"standardmäßig zur falschen geht. Zum Beispiel zeigt der Link `/AndereSeite` "
+"auf der Seite `FooBar/UnterSeite` auf `AndereSeite` im Wurzelverzeichnis des "
+"Wikis, selbst wenn es eine `FooBar/AndereSeite` gibt."
+
+#. type: Plain text
+msgid ""
+"Also, if the wiki is configured with a userdir, you can link to pages within "
+"the userdir without specifying a path to them. This is to allow for easy "
+"linking to a user's page in the userdir, to sign a comment. These links are "
+"checked for last of all."
+msgstr ""
+"Wenn das Wiki mit einem `userdir` konfiguriert ist, kann man außerdem "
+"die Seiten im Benutzerverzeichnis direkt verlinken, ohne einen Pfad "
+"anzugeben. Dadurch können leichter Links auf die Seite eines Benutzers "
+"gesetzt werden, etwa beim Signieren eines Kommentars. Diese Links "
+"werden als letzte von allen in Betracht gezogen."
+
+
diff --git a/po/underlays/basewiki/ikiwiki/wikilink.de.po b/po/underlays/basewiki/ikiwiki/wikilink.de.po
new file mode 100644 (file)
index 0000000..ccdd203
--- /dev/null
@@ -0,0 +1,111 @@
+# German translation of basewiki/ikiwiki/wikilink page for ikiwiki.
+# Copyright © 2010 Sebastian Kuhnert <mail@sebastian-kuhnert.de>
+# Redistribution and use in source and compiled forms, with or without
+# modification, are permitted under any circumstances. No warranty.
+msgid ""
+msgstr ""
+"POT-Creation-Date: 2010-03-12 09:29+0530\n"
+"PO-Revision-Date: 2010-03-14 13:41+0530\n"
+"Last-Translator: Sebastian Kuhnert <mail@sebastian-kuhnert.de>\n"
+"Language-Team: None\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!meta robots=\"noindex, follow\"]]\n"
+msgstr "[[!meta robots=\"noindex, follow\"]]\n"
+
+#. type: Plain text
+msgid ""
+"WikiLinks provide easy linking between pages of the wiki. To create a "
+"[[WikiLink]], just put the name of the page to link to in double brackets.  "
+"For example `\\[[WikiLink]]`."
+msgstr ""
+"WikiLinks ermöglichen es, auf einfache Weise Links zwischen Seiten im Wiki "
+"zu setzen. "
+"Um einen [[WikiLink]] zu erstellen, setze einfach den Namen der Zielseite in "
+"doppelte eckige Klammern, zum Beispiel `\\[[WikiLink]]`."
+
+#. type: Plain text
+msgid ""
+"If you ever need to write something like `\\[[WikiLink]]` without creating a "
+"wikilink, just prefix it with a `\\`, like `\\\\[[WikiLink]]`."
+msgstr ""
+"Wenn man irgendwann einmal etwas wie `\\[[WikiLink]]` schreiben will, "
+"ohne einen WikiLink zu erzeugen, stellt man einfach ein `\\` voran, wie in "
+"`\\\\[[WikiLink]]`."
+
+#. type: Plain text
+msgid ""
+"There are some special [[SubPage/LinkingRules]] that come into play when "
+"linking between [[SubPages|SubPage]]."
+msgstr ""
+"Es gibt einige spezielle [[Regeln für Links|SubPage/LinkingRules]], die beim "
+"setzen von Links zwischen [[Unterseiten|SubPage]] ins Spiel kommen."
+
+#. type: Plain text
+msgid ""
+"Also, if the file linked to by a WikiLink looks like an image, it will be "
+"displayed inline on the page."
+msgstr ""
+"Wenn das Ziel eines WikiLinks nach einem Bild aussieht, wird dieses "
+"innerhalb der Seite angezeigt."
+
+#. type: Plain text
+msgid ""
+"WikiLinks are matched with page names in a case-insensitive manner, so you "
+"don't need to worry about getting the case the same, and can capitalise "
+"links at the start of a sentence, and so on."
+msgstr ""
+"WikiLinks werden unabhängig von der Groß- und Kleinschreibung gefunden, "
+"man braucht sich also keine Gedanken über identische Schreibweise zu machen "
+"und kann zum Beispiel das erste Wort eines Satzes groß schreiben."
+
+#. type: Plain text
+msgid ""
+"It's also possible to write a WikiLink that uses something other than the "
+"page name as the link text. For example `\\[[foo_bar|SandBox]]` links to the "
+"SandBox page, but the link will appear like this: [[foo_bar|SandBox]]."
+msgstr ""
+"Es ist auch möglich einen WikiLink zu schreiben, der etwas anderes als den "
+"Seitennamen als Text für den Link verwendet. Zum Beispiel verweist "
+"`\\[[foo_bar|SandBox]]` auf die Sandkasten-Seite, aber der Link erscheint "
+"als [[foo_bar|SandBox]]."
+
+#. type: Plain text
+msgid ""
+"To link to an anchor inside a page, you can use something like "
+"`\\[[WikiLink#foo]]` ."
+msgstr ""
+"Um auf ein Ziel innerhalb einer Seite zu verweisen, kann man etwas wie "
+"`\\[[WikiLink#foo]]` verwenden."
+
+#. type: Title ##
+#, no-wrap
+msgid "Directives and WikiLinks"
+msgstr "Anweisungen und WikiLinks"
+
+#. type: Plain text
+msgid ""
+"ikiwiki has two syntaxes for [[directives|directive]].  The older syntax "
+"used spaces to distinguish between directives and wikilinks; as a result, "
+"with that syntax in use, you cannot use spaces in WikiLinks, and must "
+"replace spaces with underscores.  The newer syntax, enabled with the "
+"`prefix_directives` option in an ikiwiki setup file, prefixes directives "
+"with `!`, and thus does not prevent links with spaces.  Future versions of "
+"ikiwiki will turn this option on by default."
+msgstr ""
+"Es gibt in ikiwiki zwei Syntaxen für [[Anweisungen|directive]]. Die ältere "
+"Syntax verwendete Leerzeichen, um zwischen Anweisungen und WikiLinks "
+"zu unterscheiden; mit dem Ergebnis, dass bei Verwendung dieser Syntax "
+"keine Leerzeichen in WikiLinks verwendet werden können und durch "
+"Unterstriche ersetzt werden müssen. Die neuere Syntax, aktiviert durch "
+"die Option `prefix_directives` in einer ikiwiki-Setup-Datei, stellt "
+"Anweisungen `!` voran und ermöglicht so Links mit Leerzeichen. "
+"Zukünftige Versionen von ikiwiki werden diese Option standardmäßig "
+"aktivieren."
+
+
diff --git a/po/underlays/basewiki/index.de.po b/po/underlays/basewiki/index.de.po
new file mode 100644 (file)
index 0000000..c2dcdd3
--- /dev/null
@@ -0,0 +1,29 @@
+# German translation of basewiki/index page for ikiwiki.
+# Copyright © 2010 Sebastian Kuhnert <mail@sebastian-kuhnert.de>
+# Redistribution and use in source and compiled forms, with or without
+# modification, are permitted under any circumstances. No warranty.
+msgid ""
+msgstr ""
+"POT-Creation-Date: 2010-03-12 09:29+0530\n"
+"PO-Revision-Date: 2010-03-12 09:40+0530\n"
+"Last-Translator: Sebastian Kuhnert <mail@sebastian-kuhnert.de>\n"
+"Language-Team: None\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#. type: Plain text
+msgid "Welcome to your new wiki."
+msgstr "Willkommen in Ihrem neuen Wiki."
+
+#. type: Plain text
+msgid "All wikis are supposed to have a [[SandBox]], so this one does too."
+msgstr ""
+"Alle Wikis sollten einen [[Sandkasten|SandBox]] haben, also hat dieses "
+"auch einen."
+
+#. type: Plain text
+msgid "This wiki is powered by [[ikiwiki]]."
+msgstr "Dieses Wiki wird mit [[ikiwiki]] betrieben."
+
diff --git a/po/underlays/basewiki/recentchanges.de.po b/po/underlays/basewiki/recentchanges.de.po
new file mode 100644 (file)
index 0000000..88ff46f
--- /dev/null
@@ -0,0 +1,38 @@
+# German translation of basewiki/recentchanges page for ikiwiki.
+# Copyright © 2010 Sebastian Kuhnert <mail@sebastian-kuhnert.de>
+# Redistribution and use in source and compiled forms, with or without
+# modification, are permitted under any circumstances. No warranty.
+msgid ""
+msgstr ""
+"POT-Creation-Date: 2010-03-12 09:29+0530\n"
+"PO-Revision-Date: 2010-03-12 09:41+0530\n"
+"Last-Translator: Sebastian Kuhnert <mail@sebastian-kuhnert.de>\n"
+"Language-Team: None\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!if test=\"enabled(meta)\" then=\"\"\"\n"
+msgstr "[[!if test=\"enabled(meta)\" then=\"\"\"\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!meta title=\"RecentChanges\"]]\n"
+msgstr "[[!meta title=\"Letzte Änderungen\"]]\n"
+
+#. type: Plain text
+msgid "Recent changes to this wiki:"
+msgstr "Die letzten Änderungen an diesem Wiki:"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"[[!inline pages=\"internal(recentchanges/change_*) and !*/Discussion\" \n"
+"template=recentchanges show=0]]\n"
+msgstr ""
+"[[!inline pages=\"internal(recentchanges/change_*) and !*/Discussion\" \n"
+"template=recentchanges show=0]]\n"
+
diff --git a/po/underlays/basewiki/sandbox.de.po b/po/underlays/basewiki/sandbox.de.po
new file mode 100644 (file)
index 0000000..bb1b837
--- /dev/null
@@ -0,0 +1,91 @@
+# German translation of basewiki/sandbox page for ikiwiki.
+# Copyright © 2010 Sebastian Kuhnert <mail@sebastian-kuhnert.de>
+# Redistribution and use in source and compiled forms, with or without
+# modification, are permitted under any circumstances. No warranty.
+msgid ""
+msgstr ""
+"POT-Creation-Date: 2010-03-12 09:29+0530\n"
+"PO-Revision-Date: 2010-03-14 15:14+0530\n"
+"Last-Translator: Sebastian Kuhnert <mail@sebastian-kuhnert.de>\n"
+"Language-Team: None\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#. type: Plain text
+#, fuzzy
+msgid "This is the SandBox, a page anyone can edit to learn how to use the wiki."
+msgstr ""
+"[[!meta title=\"Sandkasten\"]]\n"
+"Dies ist der Sandkasten: Eine Seite die jeder bearbeiten kann, um zu lernen wie man das Wiki benutzt."
+
+#. type: Plain text
+msgid "Here's a paragraph."
+msgstr "Dies ist ein Absatz."
+
+#. type: Plain text
+msgid "Here's another one with *emphasised* text."
+msgstr "Dies ist noch ein Absatz mit *hervorgehobenem* Text."
+
+#. type: Title #
+#, no-wrap
+msgid "Header"
+msgstr "Überschrift"
+
+#. type: Title ##
+#, no-wrap
+msgid "Subheader"
+msgstr "Unterüberschrift"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"> This is a blockquote.\n"
+">\n"
+"> This is the first level of quoting.\n"
+">\n"
+"> > This is nested blockquote.\n"
+">\n"
+"> Back to the first level.\n"
+msgstr ""
+"> Dies ist ein zitierter Absatz.\n"
+">\n"
+"> Dies ist die erste Zitatebene.\n"
+">\n"
+"> > Dies ist ein verschachteltes Zitat.\n"
+">\n"
+"> Zurück zur ersten Ebene.\n"
+
+#. type: Plain text
+msgid "Numbered list"
+msgstr "Nummerierte Aufzählung"
+
+#. type: Bullet: '1. '
+msgid "First item."
+msgstr "Erster Eintrag"
+
+#. type: Bullet: '1. '
+msgid "Another."
+msgstr "Noch einer."
+
+#. type: Bullet: '1. '
+msgid "And another.."
+msgstr "Und noch einer ..."
+
+#. type: Plain text
+msgid "Bulleted list"
+msgstr "Einfache Aufzählung"
+
+#. type: Bullet: '* '
+msgid "*item*"
+msgstr "*Eintrag*"
+
+#. type: Bullet: '* '
+msgid "item"
+msgstr "Eintrag"
+
+#. type: Plain text
+msgid "[[ikiwiki/WikiLink]]"
+msgstr "[[ikiwiki/WikiLink]]"
+
diff --git a/po/underlays/basewiki/shortcuts.de.po b/po/underlays/basewiki/shortcuts.de.po
new file mode 100644 (file)
index 0000000..abfa26b
--- /dev/null
@@ -0,0 +1,287 @@
+# German translation of basewiki/shortcuts page for ikiwiki.
+# Copyright © 2010 Sebastian Kuhnert <mail@sebastian-kuhnert.de>
+# Redistribution and use in source and compiled forms, with or without
+# modification, are permitted under any circumstances. No warranty.
+msgid ""
+msgstr ""
+"POT-Creation-Date: 2010-03-12 09:29+0530\n"
+"PO-Revision-Date: 2010-03-14 15:14+0530\n"
+"Last-Translator: Sebastian Kuhnert <mail@sebastian-kuhnert.de>\n"
+"Language-Team: None\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"[[!if test=\"enabled(shortcut)\"\n"
+"     then=\"This wiki has shortcuts **enabled**.\"\n"
+"     else=\"This wiki has shortcuts **disabled**.\"]]\n"
+msgstr ""
+"[[!meta title=\"Abkürzungen\"]]\n"
+"[[!if test=\"enabled(shortcut)\"\n"
+"     then=\"In diesem Wiki sind Abkürzungen **aktiviert**.\"\n"
+"     else=\"In diesem Wiki sind Abkürzungen **deaktiviert**.\"]]\n"
+
+#. type: Plain text
+msgid "Some examples of using shortcuts include:"
+msgstr "Abkürzungen können unter anderem so benutzt werden:"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"\t\\[[!google foo]]\n"
+"\t\\[[!wikipedia War_of_1812]]\n"
+"\t\\[[!debbug 12345]]\n"
+"\tCheck the \\[[!cia ikiwiki desc=\"CIA page for %s\"]].\n"
+msgstr ""
+"\t\\[[!google foo]]\n"
+"\t\\[[!wikipedia War_of_1812]]\n"
+"\t\\[[!debbug 12345]]\n"
+"\tBetrachte die \\[[!cia ikiwiki desc=\"CIA-Seite für %s\"]].\n"
+
+#. type: Plain text
+msgid "This page controls what shortcut links the wiki supports."
+msgstr "Diese Seite bestimmt, welche Abkürzungen das Wiki unterstützt."
+
+#. type: Bullet: '* '
+msgid "[[!shortcut name=google url=\"http://www.google.com/search?q=%s\"]]"
+msgstr "[[!shortcut name=google url=\"http://www.google.com/search?q=%s\"]]"
+
+#. type: Bullet: '* '
+msgid "[[!shortcut name=archive url=\"http://web.archive.org/*/%S\"]]"
+msgstr "[[!shortcut name=archive url=\"http://web.archive.org/*/%S\"]]"
+
+#. type: Bullet: '* '
+msgid "[[!shortcut name=gmap url=\"http://maps.google.com/maps?q=%s\"]]"
+msgstr "[[!shortcut name=gmap url=\"http://maps.google.com/maps?q=%s\"]]"
+
+#. type: Bullet: '* '
+msgid "[[!shortcut name=gmsg url=\"http://groups.google.com/groups?selm=%s\"]]"
+msgstr "[[!shortcut name=gmsg url=\"http://groups.google.com/groups?selm=%s\"]]"
+
+#. type: Bullet: '* '
+msgid "[[!shortcut name=wikipedia url=\"http://en.wikipedia.org/wiki/%s\"]]"
+msgstr "[[!shortcut name=wikipedia url=\"http://en.wikipedia.org/wiki/%s\"]]"
+
+#. type: Bullet: '* '
+msgid "[[!shortcut name=wikitravel url=\"http://wikitravel.org/en/%s\"]]"
+msgstr "[[!shortcut name=wikitravel url=\"http://wikitravel.org/en/%s\"]]"
+
+#. type: Bullet: '* '
+msgid "[[!shortcut name=wiktionary url=\"http://en.wiktionary.org/wiki/%s\"]]"
+msgstr "[[!shortcut name=wiktionary url=\"http://en.wiktionary.org/wiki/%s\"]]"
+
+#. type: Bullet: '* '
+msgid ""
+"[[!shortcut name=debbug url=\"http://bugs.debian.org/%S\" desc=\"Debian bug "
+"#%s\"]]"
+msgstr ""
+"[[!shortcut name=debbug url=\"http://bugs.debian.org/%S\" desc=\"Debian bug "
+"#%s\"]]"
+
+#. type: Bullet: '* '
+msgid ""
+"[[!shortcut name=deblist url=\"http://lists.debian.org/debian-%s\" "
+"desc=\"debian-%s@lists.debian.org\"]]"
+msgstr ""
+"[[!shortcut name=deblist url=\"http://lists.debian.org/debian-%s\" "
+"desc=\"debian-%s@lists.debian.org\"]]"
+
+#. type: Bullet: '* '
+msgid "[[!shortcut name=debpkg url=\"http://packages.debian.org/%s\"]]"
+msgstr "[[!shortcut name=debpkg url=\"http://packages.debian.org/%s\"]]"
+
+#. type: Bullet: '* '
+msgid "[[!shortcut name=debpkgsid url=\"http://packages.debian.org/sid/%s\"]]"
+msgstr "[[!shortcut name=debpkgsid url=\"http://packages.debian.org/sid/%s\"]]"
+
+#. type: Bullet: '* '
+msgid "[[!shortcut name=debpts url=\"http://packages.qa.debian.org/%s\"]]"
+msgstr "[[!shortcut name=debpts url=\"http://packages.qa.debian.org/%s\"]]"
+
+#. type: Bullet: '* '
+msgid "[[!shortcut name=debmsg url=\"http://lists.debian.org/msgid-search/%s\"]]"
+msgstr "[[!shortcut name=debmsg url=\"http://lists.debian.org/msgid-search/%s\"]]"
+
+#. type: Bullet: '* '
+msgid ""
+"[[!shortcut name=debrt "
+"url=\"https://rt.debian.org/Ticket/Display.html?id=%s\"]]"
+msgstr ""
+"[[!shortcut name=debrt "
+"url=\"https://rt.debian.org/Ticket/Display.html?id=%s\"]]"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"* [[!shortcut name=debss url=\"http://snapshot.debian.net/package/%s\"]]\n"
+"  * Usage: `\\[[!debss package]]`, `\\[[!debss package#version]]`, or "
+"`\\[[!debss package/version]]`.  See http://snapshot.debian.net for "
+"details.\n"
+"* [[!shortcut name=debwiki url=\"http://wiki.debian.org/%s\"]]\n"
+"* [[!shortcut name=fdobug "
+"url=\"https://bugs.freedesktop.org/show_bug.cgi?id=%s\" "
+"desc=\"freedesktop.org bug #%s\"]]\n"
+"* [[!shortcut name=fdolist "
+"url=\"http://lists.freedesktop.org/mailman/listinfo/%s\" "
+"desc=\"%s@lists.freedesktop.org\"]]\n"
+"* [[!shortcut name=gnomebug "
+"url=\"http://bugzilla.gnome.org/show_bug.cgi?id=%s\" desc=\"GNOME bug "
+"#%s\"]]\n"
+"* [[!shortcut name=linuxbug "
+"url=\"http://bugzilla.kernel.org/show_bug.cgi?id=%s\" desc=\"Linux bug "
+"#%s\"]]\n"
+"* [[!shortcut name=mozbug "
+"url=\"https://bugzilla.mozilla.org/show_bug.cgi?id=%s\" desc=\"Mozilla bug "
+"#%s\"]]\n"
+"* [[!shortcut name=gnulist url=\"http://lists.gnu.org/mailman/listinfo/%s\" "
+"desc=\"%s@gnu.org\"]]\n"
+"* [[!shortcut name=marcmsg url=\"http://marc.info/?i=%s\"]]\n"
+"* [[!shortcut name=marclist url=\"http://marc.info/?l=%s\"]]\n"
+"* [[!shortcut name=gmane url=\"http://dir.gmane.org/gmane.%s\" "
+"desc=\"gmane.%s\"]]\n"
+"* [[!shortcut name=gmanemsg url=\"http://mid.gmane.org/%s\"]]\n"
+"* [[!shortcut name=cpan "
+"url=\"http://search.cpan.org/search?mode=dist&query=%s\"]]\n"
+"* [[!shortcut name=ctan "
+"url=\"http://tug.ctan.org/cgi-bin/ctanPackageInformation.py?id=%s\"]]\n"
+"* [[!shortcut name=hoogle url=\"http://haskell.org/hoogle/?q=%s\"]]\n"
+"* [[!shortcut name=iki url=\"http://ikiwiki.info/%S/\"]]\n"
+"* [[!shortcut name=ljuser url=\"http://%s.livejournal.com/\"]]\n"
+"* [[!shortcut name=rfc url=\"http://www.ietf.org/rfc/rfc%s.txt\" desc=\"RFC "
+"%s\"]]\n"
+"* [[!shortcut name=c2 url=\"http://c2.com/cgi/wiki?%s\"]]\n"
+"* [[!shortcut name=meatballwiki "
+"url=\"http://www.usemod.com/cgi-bin/mb.pl?%s\"]]\n"
+"* [[!shortcut name=emacswiki "
+"url=\"http://www.emacswiki.org/cgi-bin/wiki/%s\"]]\n"
+"* [[!shortcut name=haskellwiki url=\"http://haskell.org/haskellwiki/%s\"]]\n"
+"* [[!shortcut name=dict "
+"url=\"http://www.dict.org/bin/Dict?Form=Dict1&Strategy=*&Database=*&Query=%s\"]]\n"
+"* [[!shortcut name=imdb url=\"http://imdb.com/find?q=%s\"]]\n"
+"* [[!shortcut name=gpg "
+"url=\"http://pgpkeys.mit.edu:11371/pks/lookup?op=vindex&exact=on&search=0x%s\"]]\n"
+"* [[!shortcut name=perldoc "
+"url=\"http://perldoc.perl.org/search.html?q=%s\"]]\n"
+"* [[!shortcut name=whois "
+"url=\"http://reports.internic.net/cgi/whois?whois_nic=%s&type=domain\"]]\n"
+"* [[!shortcut name=cve "
+"url=\"http://cve.mitre.org/cgi-bin/cvename.cgi?name=%s\"]]\n"
+"* [[!shortcut name=cia url=\"http://cia.vc/stats/project/%s\"]]\n"
+"* [[!shortcut name=ciauser url=\"http://cia.vc/stats/user/%s\"]]\n"
+"* [[!shortcut name=flickr url=\"http://www.flickr.com/photos/%s\"]]\n"
+"* [[!shortcut name=man url=\"http://linux.die.net/man/%s\"]]\n"
+"* [[!shortcut name=ohloh url=\"http://www.ohloh.net/projects/%s\"]]\n"
+"* [[!shortcut name=cpanrt "
+"url=\"https://rt.cpan.org/Ticket/Display.html?id=%s\" desc=\"CPAN "
+"RT#%s\"]]\n"
+"* [[!shortcut name=novellbug "
+"url=\"https://bugzilla.novell.com/show_bug.cgi?id=%s\" desc=\"bug %s\"]]\n"
+msgstr ""
+"* [[!shortcut name=debss url=\"http://snapshot.debian.net/package/%s\"]]\n"
+"  * Verwendung: `\\[[!debss Paket]]`, `\\[[!debss Paket#Version]]`, or "
+"`\\[[!debss Paket/Version]]`.  Details unter http://snapshot.debian.net.\n"
+"* [[!shortcut name=debwiki url=\"http://wiki.debian.org/%s\"]]\n"
+"* [[!shortcut name=fdobug "
+"url=\"https://bugs.freedesktop.org/show_bug.cgi?id=%s\" "
+"desc=\"freedesktop.org bug #%s\"]]\n"
+"* [[!shortcut name=fdolist "
+"url=\"http://lists.freedesktop.org/mailman/listinfo/%s\" "
+"desc=\"%s@lists.freedesktop.org\"]]\n"
+"* [[!shortcut name=gnomebug "
+"url=\"http://bugzilla.gnome.org/show_bug.cgi?id=%s\" desc=\"GNOME bug "
+"#%s\"]]\n"
+"* [[!shortcut name=linuxbug "
+"url=\"http://bugzilla.kernel.org/show_bug.cgi?id=%s\" desc=\"Linux bug "
+"#%s\"]]\n"
+"* [[!shortcut name=mozbug "
+"url=\"https://bugzilla.mozilla.org/show_bug.cgi?id=%s\" desc=\"Mozilla bug "
+"#%s\"]]\n"
+"* [[!shortcut name=gnulist url=\"http://lists.gnu.org/mailman/listinfo/%s\" "
+"desc=\"%s@gnu.org\"]]\n"
+"* [[!shortcut name=marcmsg url=\"http://marc.info/?i=%s\"]]\n"
+"* [[!shortcut name=marclist url=\"http://marc.info/?l=%s\"]]\n"
+"* [[!shortcut name=gmane url=\"http://dir.gmane.org/gmane.%s\" "
+"desc=\"gmane.%s\"]]\n"
+"* [[!shortcut name=gmanemsg url=\"http://mid.gmane.org/%s\"]]\n"
+"* [[!shortcut name=cpan "
+"url=\"http://search.cpan.org/search?mode=dist&query=%s\"]]\n"
+"* [[!shortcut name=ctan "
+"url=\"http://tug.ctan.org/cgi-bin/ctanPackageInformation.py?id=%s\"]]\n"
+"* [[!shortcut name=hoogle url=\"http://haskell.org/hoogle/?q=%s\"]]\n"
+"* [[!shortcut name=iki url=\"http://ikiwiki.info/%S/\"]]\n"
+"* [[!shortcut name=ljuser url=\"http://%s.livejournal.com/\"]]\n"
+"* [[!shortcut name=rfc url=\"http://www.ietf.org/rfc/rfc%s.txt\" desc=\"RFC "
+"%s\"]]\n"
+"* [[!shortcut name=c2 url=\"http://c2.com/cgi/wiki?%s\"]]\n"
+"* [[!shortcut name=meatballwiki "
+"url=\"http://www.usemod.com/cgi-bin/mb.pl?%s\"]]\n"
+"* [[!shortcut name=emacswiki "
+"url=\"http://www.emacswiki.org/cgi-bin/wiki/%s\"]]\n"
+"* [[!shortcut name=haskellwiki url=\"http://haskell.org/haskellwiki/%s\"]]\n"
+"* [[!shortcut name=dict "
+"url=\"http://www.dict.org/bin/Dict?Form=Dict1&Strategy=*&Database=*&Query=%s\"]]\n"
+"* [[!shortcut name=imdb url=\"http://imdb.com/find?q=%s\"]]\n"
+"* [[!shortcut name=gpg "
+"url=\"http://pgpkeys.mit.edu:11371/pks/lookup?op=vindex&exact=on&search=0x%s\"]]\n"
+"* [[!shortcut name=perldoc "
+"url=\"http://perldoc.perl.org/search.html?q=%s\"]]\n"
+"* [[!shortcut name=whois "
+"url=\"http://reports.internic.net/cgi/whois?whois_nic=%s&type=domain\"]]\n"
+"* [[!shortcut name=cve "
+"url=\"http://cve.mitre.org/cgi-bin/cvename.cgi?name=%s\"]]\n"
+"* [[!shortcut name=cia url=\"http://cia.vc/stats/project/%s\"]]\n"
+"* [[!shortcut name=ciauser url=\"http://cia.vc/stats/user/%s\"]]\n"
+"* [[!shortcut name=flickr url=\"http://www.flickr.com/photos/%s\"]]\n"
+"* [[!shortcut name=man url=\"http://linux.die.net/man/%s\"]]\n"
+"* [[!shortcut name=ohloh url=\"http://www.ohloh.net/projects/%s\"]]\n"
+"* [[!shortcut name=cpanrt "
+"url=\"https://rt.cpan.org/Ticket/Display.html?id=%s\" desc=\"CPAN "
+"RT#%s\"]]\n"
+"* [[!shortcut name=novellbug "
+"url=\"https://bugzilla.novell.com/show_bug.cgi?id=%s\" desc=\"bug %s\"]]\n"
+
+#. type: Plain text
+msgid ""
+"To add a new shortcut, use the `shortcut` [[ikiwiki/directive]]. In the url, "
+"\"%s\" is replaced with the text passed to the named shortcut, after "
+"[[!wikipedia url_encoding]] it, and '%S' is replaced with the raw, "
+"non-encoded text. The optional `desc` parameter controls the description of "
+"the link."
+msgstr ""
+"Um eine neue Abkürzung hinzuzufügen, verwende die "
+"shortcut-[[Anweisung|ikiwiki/directive]]. "
+"In der URL wird `%s` durch den der Abkürzung übergebenen Text in "
+"URL-Kodierung ersetzt. Außerdem wird `%S` durch den unveränderten Text ersetzt. "
+"Der optionale Parameter  `desc` steuert die Beschriftung der Verknüpfung."
+
+#. type: Plain text
+msgid ""
+"Remember that the `name` you give the shortcut will become a new "
+"[[ikiwiki/directive]].  Avoid using a `name` that conflicts with an existing "
+"directive.  These directives also accept a `desc` parameter that will "
+"override the one provided at definition time."
+msgstr ""
+"Denke daran, dass der angegebene `name` eine neue "
+"[[Anweisung|ikiwiki/directive]] wird.  Deshalb sollte man es vermeiden, "
+"einen Namen zu verwenden, der mit einer bestehenden "
+"[[Anweisung|ikiwiki/directive]] in Konflikt steht. Diese Anweisungen akzeptieren "
+"einen optionalen Parameter `desc`, der statt des Werts aus der Definition "
+"verwendet wird."
+
+#. type: Plain text
+msgid ""
+"If you come up with a shortcut that you think others might find useful, "
+"consider contributing it to the [shortcuts page on the ikiwiki "
+"wiki](http://ikiwiki.info/shortcuts/), so that future versions of ikiwiki "
+"will include your shortcut in the standard underlay."
+msgstr ""
+"Wenn Sie eine Idee für eine Abkürzung haben, die auch andere nützlich "
+"finden könnten, können Sie diese auf der [Abkürzungs-Seite des "
+"ikiwiki-Wiki](http://ikiwiki.info/shortcuts/) eintragen, damit künftige "
+"Versionen von ikiwiki diese Abkürzung standardmäßig zur Verfügung stellen."
+
+
diff --git a/po/underlays/basewiki/templates.de.po b/po/underlays/basewiki/templates.de.po
new file mode 100644 (file)
index 0000000..beb92b4
--- /dev/null
@@ -0,0 +1,256 @@
+# German translation of basewiki/templates page for ikiwiki.
+# Copyright © 2010 Sebastian Kuhnert <mail@sebastian-kuhnert.de>
+# Redistribution and use in source and compiled forms, with or without
+# modification, are permitted under any circumstances. No warranty.
+msgid ""
+msgstr ""
+"POT-Creation-Date: 2010-03-12 09:29+0530\n"
+"PO-Revision-Date: 2010-03-14 15:15+0530\n"
+"Last-Translator: Sebastian Kuhnert <mail@sebastian-kuhnert.de>\n"
+"Language-Team: None\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!meta robots=\"noindex, follow\"]]\n"
+msgstr "[[!meta robots=\"noindex, follow\"]]\n"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"[[!if test=\"enabled(template)\"\n"
+"then=\"This wiki has templates **enabled**.\"\n"
+"else=\"This wiki has templates **disabled**.\"\n"
+"]]\n"
+msgstr ""
+"[[!meta title=\"Vorlagen\"]]\n"
+"[[!if test=\"enabled(template)\"\n"
+"then=\"In diesem Wiki sind Vorlagen **aktiviert**.\"\n"
+"else=\"In diesem Wiki sind Vorlagen **deaktiviert**.\"\n"
+"]]\n"
+
+#. type: Plain text
+msgid ""
+"Templates are files that can be filled out and inserted into pages in the "
+"wiki."
+msgstr ""
+"Vorlagen sind Dateien, die ausgefüllt und in Wiki-Seiten eingefügt werden "
+"können."
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!if test=\"enabled(template) and enabled(inline)\" then=\"\"\"\n"
+msgstr "[[!if test=\"enabled(template) and enabled(inline)\" then=\"\"\"\n"
+
+#. type: Plain text
+msgid "These templates are available for inclusion onto other pages in this wiki:"
+msgstr ""
+"Diese Vorlagen sind verfügbar und können in andere Seiten dieses "
+"Wikis eingebettet werden:"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"[[!inline pages=\"templates/* and !*/discussion\" feeds=no archive=yes\n"
+"sort=title template=titlepage]]\n"
+msgstr ""
+"[[!inline pages=\"templates/* and !*/discussion\" feeds=no archive=yes\n"
+"sort=title template=titlepage]]\n"
+
+#. type: Title ##
+#, no-wrap
+msgid "Using a template"
+msgstr "Verwenden einer Vorlage"
+
+#. type: Plain text
+msgid "Using a template works like this:"
+msgstr "Eine Vorlage kann folgendermaßen verwendet werden:"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"\t\\[[!template id=note text=\"\"\"Here is the text to insert into my "
+"note.\"\"\"]]\n"
+msgstr ""
+"\t\\[[!template id=note text=\"\"\"Hier ist der Text, der in meine "
+"Notiz eingefügt werden soll.\"\"\"]]\n"
+
+#. type: Plain text
+msgid ""
+"This fills out the [[note]] template, filling in the `text` field with the "
+"specified value, and inserts the result into the page."
+msgstr ""
+"Dies verwendet die Vorlage [[note]], wobei das `text`-Feld mit dem "
+"angegebenen Wert gefüllt wird, und fügt das Ergebnis in die Seite ein."
+
+#. type: Plain text
+msgid ""
+"Generally, a value can include any markup that would be allowed in the wiki "
+"page outside the template. Triple-quoting the value even allows quotes to be "
+"included in it. Combined with multi-line quoted values, this allows for "
+"large chunks of marked up text to be embedded into a template:"
+msgstr ""
+"Ein Wert kann im allgemeinen beliebige Formatierungsanweisungen enthalten, "
+"die im Wiki außerhalb der Vorlage zulässig sind. Durch die Verwendung dreier "
+"Anführungszeichen können sogar Anführungszeichen enthalten sein. In Kombination "
+"mit mehrzeiligen Werten in Anführungszeichen können so große Mengen an "
+"zu formatierendem Text in die Vorlage eingefügt werden:"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"        \\[[!template id=foo name=\"Sally\" color=\"green\" age=8 "
+"notes=\"\"\"\n"
+msgstr ""
+"        \\[[!template id=foo name=\"Anna\" color=\"grün\" age=8 "
+"notes=\"\"\"\n"
+
+#. type: Bullet: '        * '
+msgid "\\[[Charley]]'s sister."
+msgstr "\\[[Thomas]] Schwester."
+
+#. type: Bullet: '        * '
+msgid "\"I want to be an astronaut when I grow up.\""
+msgstr "\"Ich will ein Astronaut werden, wenn ich erwachsen bin.\""
+
+#. type: Bullet: '        * '
+msgid "Really 8 and a half."
+msgstr "Wirklich achteinhalb."
+
+#. type: Title ##
+#, no-wrap
+msgid "Creating a template"
+msgstr "Erstellen einer Vorlage"
+
+#. type: Plain text
+msgid ""
+"To create a template, simply add a template directive to a page, and the "
+"page will provide a link that can be used to create the template. The "
+"template is a regular wiki page, located in the `templates/` subdirectory "
+"inside the source directory of the wiki."
+msgstr ""
+"Um eine Vorlage zu erstellen, füge einfach die Anweisung  `template` zu "
+"einer Seite hinzu. Diese Seite bietet dann einen Link zur Erstellung der "
+"Vorlage an. Die Vorlage ist eine normale Wiki-Seite, die im Unterverzeichnis "
+"`templates/` des Wiki-Quellverzeichnisses liegt."
+
+#. type: Plain text
+msgid ""
+"The template uses the syntax used by the [[!cpan HTML::Template]] perl "
+"module, which allows for some fairly complex things to be done. Consult its "
+"documentation for the full syntax, but all you really need to know are a few "
+"things:"
+msgstr ""
+"Die Vorlage verwendet die Syntax des Perl-Moduls [[!cpan HTML::Template]], "
+"das die Umsetzung auch komplexer Vorhaben ermöglicht. In seiner Dokumentation "
+"ist die vollständige Syntax beschrieben, zur Verwendung muss man aber nur "
+"das Folgende wirklich wissen:"
+
+#. type: Bullet: '* '
+msgid ""
+"Each parameter you pass to the template directive will generate a template "
+"variable. There are also some pre-defined variables like PAGE and BASENAME."
+msgstr ""
+"Jeder Parameter, der der template-Anweisung übergeben wird, erzeugt eine "
+"Variable, die in der Vorlage verwendet werden kann. Es gibt auch einige "
+"vordefinierte Variablen wie PAGE und BASENAME."
+
+#. type: Bullet: '* '
+msgid ""
+"To insert the value of a variable, use `<TMPL_VAR variable>`. Wiki markup in "
+"the value will first be converted to html."
+msgstr ""
+"Um den Wert einer Variable einzufügen, verwende `<TMPL_VAR Variable>`. "
+"Wiki-Formatierung im Wert wird zuvor zu HTML konvertiert werden."
+
+#. type: Bullet: '* '
+msgid ""
+"To insert the raw value of a variable, with wiki markup not yet converted to "
+"html, use `<TMPL_VAR raw_variable>`."
+msgstr ""
+"Um den unformatierten Wert einer Variable einzufügen, der die unveränderten "
+"Wiki-Formatierungsanweisungen enthält, verwende `<TMPL_VAR raw_Variable>`."
+
+#. type: Bullet: '* '
+msgid ""
+"To make a block of text conditional on a variable being set use `<TMPL_IF "
+"NAME=\"variable\">text</TMPL_IF>`."
+msgstr ""
+"Wenn ein Textblock nur dann angezeigt werden soll, wenn eine Variable gesetzt "
+"ist, "
+"verwende `<TMPL_IF NAME=\"Variable\">Text</TMPL_IF>`."
+
+#. type: Bullet: '* '
+msgid ""
+"To use one block of text if a variable is set and a second if it's not, use "
+"`<TMPL_IF NAME=\"variable\">text<TMPL_ELSE>other text</TMPL_IF>`"
+msgstr ""
+"Um einen Textblock anzuzeigen, wenn eine Variable gesetzt ist, und einen "
+"anderen, wenn sie es nicht ist, verwende `<TMPL_IF "
+"NAME=\"Variable\">Text<TMPL_ELSE>anderer Text</TMPL_IF>`."
+
+#. type: Plain text
+msgid "Here's a sample template:"
+msgstr "Hier ist eine Beispiel-Vorlage:"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"        <span class=\"infobox\">\n"
+"        Name: \\[[<TMPL_VAR raw_name>]]<br />\n"
+"        Age: <TMPL_VAR age><br />\n"
+"        <TMPL_IF NAME=\"color\">\n"
+"        Favorite color: <TMPL_VAR color><br />\n"
+"        <TMPL_ELSE>\n"
+"        No favorite color.<br />\n"
+"        </TMPL_IF>\n"
+"        <TMPL_IF NAME=\"notes\">\n"
+"        <hr />\n"
+"        <TMPL_VAR notes>\n"
+"        </TMPL_IF>\n"
+"        </span>\n"
+msgstr ""
+"   <span class=\"infobox\">\n"
+"        Name: \\[[<TMPL_VAR raw_name>]]<br />\n"
+"        Alter: <TMPL_VAR age><br />\n"
+"        <TMPL_IF NAME=\"color\">\n"
+"        Lieblingsfarbe: <TMPL_VAR color><br />\n"
+"        <TMPL_ELSE>\n"
+"        Keine Lieblingsfarbe.<br />\n"
+"        </TMPL_IF>\n"
+"        <TMPL_IF NAME=\"notes\">\n"
+"        <hr />\n"
+"        <TMPL_VAR notes>\n"
+"        </TMPL_IF>\n"
+"        </span>\n"
+
+#. type: Plain text
+msgid ""
+"The filled out template will be formatted the same as the rest of the page "
+"that contains it, so you can include WikiLinks and all other forms of wiki "
+"markup in the template. Note though that such WikiLinks will not show up as "
+"backlinks to the page that uses the template."
+msgstr ""
+"Die ausgefüllte Vorlage wird genauso formatiert wie der Rest der Seite, die "
+"sie enthält, man kann also WikiLinks und alle anderen Arten von "
+"Wiki-Formatierung in der Vorlage verwenden. Zu beachten ist aber, dass "
+"solche WikiLinks nicht als Rückwärts-Links zu der Seite auftauchen, die "
+"die Vorlage verwendet."
+
+#. type: Plain text
+msgid ""
+"Note the use of \"raw_name\" inside the [[ikiwiki/WikiLink]] generator. This "
+"ensures that if the name contains something that might be mistaken for wiki "
+"markup, it's not converted to html before being processed as a "
+"[[ikiwiki/WikiLink]]."
+msgstr ""
+"Beachte auch die Verwendung von `raw_name` innerhalb des Generators für "
+"den [[ikiwiki/WikiLink]]. Dies stellt sicher, dass der Name nicht nach HTML "
+"konvertiert wird, selbst wenn er etwas enthält, was für eine "
+"Wiki-Formatierungsanweisung gehalten werden könnte, bevor er als "
+"[[ikiwiki/WikiLink]] verarbeitet wird."
+
+
diff --git a/po/underlays/basewiki/templates/note.de.po b/po/underlays/basewiki/templates/note.de.po
new file mode 100644 (file)
index 0000000..c408d11
--- /dev/null
@@ -0,0 +1,42 @@
+# German translation of basewiki/templates/note page for ikiwiki.
+# Copyright © 2010 Sebastian Kuhnert <mail@sebastian-kuhnert.de>
+# Redistribution and use in source and compiled forms, with or without
+# modification, are permitted under any circumstances. No warranty.
+msgid ""
+msgstr ""
+"POT-Creation-Date: 2010-03-12 09:29+0530\n"
+"PO-Revision-Date: 2010-03-12 20:04+0530\n"
+"Last-Translator: Sebastian Kuhnert <mail@sebastian-kuhnert.de>\n"
+"Language-Team: None\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"<div class=\"notebox\">\n"
+"<TMPL_VAR text>\n"
+"</div>\n"
+"<TMPL_UNLESS NAME=\"text\">\n"
+"Use this template to insert a note into a page. The note will be styled to\n"
+"float to the right of other text on the page. This template has one\n"
+"parameter:\n"
+"<ul>\n"
+"<li>`text` - the text to display in the note\n"
+"</ul>\n"
+"</TMPL_UNLESS>\n"
+msgstr ""
+"<div class=\"notebox\">\n"
+"<TMPL_VAR text>\n"
+"</div>\n"
+"<TMPL_UNLESS NAME=\"text\">\n"
+"Verwende diese Vorlage, um eine Notiz in eine Seite einzufügen. Die Notiz\n"
+"wird rechts vom restlichen Text der Seite schwebend angezeigt werden.\n"
+"Diese Vorlage hat einen Parameter:"
+"<ul>\n"
+"<li>`text` - der Text, der in der Notiz angezeigt werden soll.\n"
+"</ul>\n"
+"</TMPL_UNLESS>\n"
+
diff --git a/po/underlays/basewiki/templates/popup.de.po b/po/underlays/basewiki/templates/popup.de.po
new file mode 100644 (file)
index 0000000..c75b79d
--- /dev/null
@@ -0,0 +1,59 @@
+# German translation of basewiki/templates/popup page for ikiwiki.
+# Copyright © 2010 Sebastian Kuhnert <mail@sebastian-kuhnert.de>
+# Redistribution and use in source and compiled forms, with or without
+# modification, are permitted under any circumstances. No warranty.
+msgid ""
+msgstr ""
+"POT-Creation-Date: 2010-03-12 09:29+0530\n"
+"PO-Revision-Date: 2010-03-12 20:08+0530\n"
+"Last-Translator: Sebastian Kuhnert <mail@sebastian-kuhnert.de>\n"
+"Language-Team: None\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"<TMPL_UNLESS NAME=\"mouseover\">\n"
+"Use this template to create a popup window that is displayed when the "
+"mouse\n"
+"is over part of the page. This template has two parameters:\n"
+"<ul>\n"
+"<li>`mouseover` - This is the text or other content that triggers the\n"
+"popup.\n"
+"<li>`popup` - This should be the content of the popup window. It can be\n"
+"anything, even images or a whole little wiki page, but should not be too\n"
+"large for good usability.\n"
+"</ul>\n"
+"Note that browsers that do not support the CSS will display the popup\n"
+"inline in the page, inside square brackets.\n"
+"</TMPL_UNLESS>\n"
+"<span class=\"popup\"><TMPL_VAR mouseover>\n"
+"<span class=\"paren\">[</span><span class=\"balloon\"><TMPL_VAR "
+"popup></span><span class=\"paren\">]</span>\n"
+"</span>\n"
+msgstr ""
+"<TMPL_UNLESS NAME=\"mouseover\">\n"
+"Verwende diese Vorlage, um ein Popup-Fenster anzuzeigen, wenn sich die "
+"Maus\n"
+"über diesem Teil der Seite befindet. Dies Vorlage hat zwei Parameter:\n"
+"<ul>\n"
+"<li>`mouseover` - Dies ist der Text oder andere Inhalt, der das "
+"Popup-Fenster\n"
+"auslöst.\n"
+"<li>`popup` - Dies ist der Inhalt des Popup-Fensters. Er kann beliebig "
+"sein,\n"
+"sogar Bilder oder eine ganze kleine Wiki-Seite. Im Interesse guter "
+"Benutzbarkeit\n"
+"sollte er aber nicht zu groß sein."
+"</ul>\n"
+"Beachte, dass Browser, die CSS nicht unterstützen, das Popup innerhalb\n"
+"der Seite anzeigen, eingerahmt durch eckige Klammern.\n"
+"</TMPL_UNLESS>\n"
+"<span class=\"popup\"><TMPL_VAR mouseover>\n"
+"<span class=\"paren\">[</span><span class=\"balloon\"><TMPL_VAR "
+"popup></span><span class=\"paren\">]</span>\n"
+"</span>\n"
+
diff --git a/po/underlays/directives/ikiwiki/directive/aggregate.de.po b/po/underlays/directives/ikiwiki/directive/aggregate.de.po
new file mode 100644 (file)
index 0000000..07803ff
--- /dev/null
@@ -0,0 +1,189 @@
+# German translation of directives/ikiwiki/directive/aggregate page for ikiwiki.
+# Copyright © 2010 Sebastian Kuhnert <mail@sebastian-kuhnert.de>
+# Redistribution and use in source and compiled forms, with or without
+# modification, are permitted under any circumstances. No warranty.
+msgid ""
+msgstr ""
+"POT-Creation-Date: 2010-03-12 09:29+0530\n"
+"PO-Revision-Date: 2010-03-14 13:56+0530\n"
+"Last-Translator: Sebastian Kuhnert <mail@sebastian-kuhnert.de>\n"
+"Language-Team: None\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#. type: Plain text
+msgid ""
+"The `aggregate` directive is supplied by the [[!iki plugins/aggregate "
+"desc=aggregate]] plugin.  This plugin requires extra setup, specifically, a "
+"cron job. See the plugin's documentation for details."
+msgstr ""
+"Die `aggregate`-Anweisung wird durch die [[!iki plugins/aggregate "
+"desc=aggregate]]-Erweiterung zur Verfügung gestellt. Diese Erweiterung erfordert "
+"zusätzliche Konfiguration, insbesondere einen cron-Job. Für Details siehe die "
+"Dokumentation der Erweiterung."
+
+#. type: Plain text
+msgid ""
+"This directive allows content from other feeds to be aggregated into the "
+"wiki.  Aggregate a feed as follows:"
+msgstr ""
+"Diese Anweisung erlaubt es, Inhalt von anderen Feeds in diesem Wiki "
+"gesammelt zur Verfügung zu stellen. Dies funktioniert wie folgt:"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"\t\\[[!aggregate name=\"example blog\" dir=\"example\"\n"
+"\tfeedurl=\"http://example.com/index.rss\"\n"
+"\turl=\"http://example.com/\" updateinterval=\"15\"]]\n"
+msgstr ""
+"\t\\[[!aggregate name=\"Beispiel-Blog\" dir=\"beispiel\"\n"
+"\tfeedurl=\"http://beispiel.de/index.rss\"\n"
+"\turl=\"http://beispiel.de/\" updateinterval=\"15\"]]\n"
+
+#. type: Plain text
+msgid ""
+"That example aggregates posts from the specified RSS feed, updating no more "
+"frequently than once every 15 minutes (though possibly less frequently, if "
+"the cron job runs less frequently than that), and puts a page per post under "
+"the example/ directory in the wiki."
+msgstr ""
+"In diesem Beispiel werden Beiträge aus dem angegebenen RSS-Feed "
+"eingesammelt, und zwar nicht öfter als alle 15 Minuten (möglicherweise "
+"aber seltener, wenn der cron-Job seltener läuft), und dann als eine Seite "
+"pro Beitrag im Verzeichnis `beispiel/` des Wikis gespeichert."
+
+#. type: Plain text
+msgid ""
+"You can then use ikiwiki's [[inline]] directive to create a blog of one or "
+"more aggregated feeds. For example:"
+msgstr ""
+"Man kann dann ikiwikis [[inline]]-Anweisun nutzen, um einen Blog aus "
+"einem oder mehreren eingesammelten Feeds zu erstellen. Zum Beispiel:"
+
+#. type: Plain text
+#, no-wrap
+msgid "\t\\[[!inline pages=\"internal(example/*)\"]]\n"
+msgstr "\t\\[[!inline pages=\"internal(beispiel/*)\"]]\n"
+
+#. type: Plain text
+msgid ""
+"Note the use of `internal()` in the [[ikiwiki/PageSpec]] to match aggregated "
+"pages. By default, aggregated pages are internal pages, which prevents them "
+"from showing up directly in the wiki, and so this special [[PageSpec]] is "
+"needed to match them."
+msgstr ""
+"Dabei ist es wichtig, `internal()` in der [[ikiwiki/PageSpec]] zur Erfassung der "
+"eingesammelten Seiten zu verwenden. Diese werden standardmäßig als interne "
+"Seiten gespeichert: Dies verhindert, dass sie direkt im Wiki auftauchen. Deshalb "
+"ist diese spezielle [[ikiwiki/PageSpec]] nötig, um sie zu erfassen."
+
+#. type: Title ##
+#, no-wrap
+msgid "usage"
+msgstr "Verwendung"
+
+#. type: Plain text
+msgid ""
+"Here are descriptions of all the supported parameters to the `aggregate` "
+"directive:"
+msgstr ""
+"Hier die Beschreibung aller unterstützter Parameter der "
+"`aggregate`-Anweisung:"
+
+#. type: Bullet: '* '
+msgid "`name` - A name for the feed. Each feed must have a unique name.  Required."
+msgstr ""
+"`name` - Ein Name für den Feed. Jeder Feed muss einen nur einmal vergebenen "
+"Namen haben. Erforderlich."
+
+#. type: Bullet: '* '
+msgid ""
+"`url` - The url to the web page for the feed that's being aggregated.  "
+"Required."
+msgstr ""
+"`url` - Die URL mit der Webseite des Feeds, der eingesammelt werden soll. "
+"Erforderlich."
+
+#. type: Bullet: '* '
+msgid ""
+"`dir` - The directory in the wiki where pages should be saved. Optional, if "
+"not specified, the directory is based on the name of the feed."
+msgstr ""
+"`dir` - Das Verzeichnis im Wiki, in dem die Seiten gespeichert werden sollen. "
+"Optional, wenn nicht angegeben, wird der Verzeichnisname vom Namen des Feeds "
+"abgeleitet."
+
+#. type: Bullet: '* '
+msgid ""
+"`feedurl` - The url to the feed. Optional, if it's not specified ikiwiki "
+"will look for feeds on the `url`. RSS and atom feeds are supported."
+msgstr ""
+"`feedurl` - Die URL des Feeds. Optional, wenn nicht angegeben, sucht ikiwiki in "
+"unter der `url` nach feeds. Unterstützt werden RSS- und Atom-Feeds."
+
+#. type: Bullet: '* '
+msgid ""
+"`updateinterval` - How often to check for new posts, in minutes. Default is "
+"15 minutes."
+msgstr ""
+"`updateinterval` - Wie oft nach neuen Beiträgen geschaut werden soll. "
+"Voreingestellt sind 15 Minuten."
+
+#. type: Bullet: '* '
+msgid ""
+"`expireage` - Expire old items from this feed if they are older than a "
+"specified number of days. Default is to never expire on age."
+msgstr ""
+"`expireage` - Entferne alte Einträge aus diesem Feed, wenn sie älter sind als "
+"die angegebene Anzahl von Tagen. Voreingestellt ist, niemals Einträge aufgrund "
+"ihres Alters zu entfernen."
+
+#. type: Bullet: '* '
+msgid ""
+"`expirecount` - Expire old items from this feed if there are more than the "
+"specified number total. Oldest items will be expired first. Default is to "
+"never expire on count."
+msgstr ""
+"`expirecount` - Entferne alte Einträge aus diesem Feed, wenn es insgesamt mehr "
+"als die angegebene Anzahl von Beiträgen gibt. Die ältesten Einträge werden "
+"zuerst entfernt. Voreingestellt ist, niemals Einträge aufgrund der Anzahl zu "
+"entfernen."
+
+#. type: Bullet: '* '
+msgid ""
+"`tag` - A tag to tag each post from the feed with. A good tag to use is the "
+"name of the feed. Can be repeated multiple times. The [[tag]] plugin must be "
+"enabled for this to work."
+msgstr ""
+"`tag` - Ein Tag, mit dem alle Beiträge dieses Feeds versehen werden. Gut eignet "
+"sich der Name des Feeds. Kann mehrmals angegeben werden. Die [[tag]]-Erweiterung "
+"muss "
+"aktiviert sein, damit dies funktioniert."
+
+#. type: Bullet: '* '
+msgid ""
+"`template` - Template to use for creating the aggregated pages. Defaults to "
+"aggregatepost."
+msgstr ""
+"`template` - Vorlage, die bei der Erstellung der eingesammelten Seiten verwendet "
+"wird. Voreingestellt ist `aggregatepost`."
+
+#. type: Plain text
+msgid ""
+"Note that even if you are using subversion or another revision control "
+"system, pages created by aggregation will *not* be checked into revision "
+"control."
+msgstr ""
+"Dabei ist zu beachten, dass die beim Einsammeln erstellten Seiten nicht in der "
+"Versionsverwaltung registriert werden, selbst wenn subversion oder ein "
+"anderes solches System verwendet wird."
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!meta robots=\"noindex, follow\"]]\n"
+msgstr "[[!meta robots=\"noindex, follow\"]]\n"
+
+
diff --git a/po/underlays/directives/ikiwiki/directive/brokenlinks.de.po b/po/underlays/directives/ikiwiki/directive/brokenlinks.de.po
new file mode 100644 (file)
index 0000000..773eb95
--- /dev/null
@@ -0,0 +1,57 @@
+# German translation of directives/ikiwiki/directive/brokenlinks page for ikiwiki.
+# Copyright © 2010 Sebastian Kuhnert <mail@sebastian-kuhnert.de>
+# Redistribution and use in source and compiled forms, with or without
+# modification, are permitted under any circumstances. No warranty.
+msgid ""
+msgstr ""
+"POT-Creation-Date: 2010-03-12 09:29+0530\n"
+"PO-Revision-Date: 2010-03-14 13:57+0530\n"
+"Last-Translator: Sebastian Kuhnert <mail@sebastian-kuhnert.de>\n"
+"Language-Team: None\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#. type: Plain text
+msgid ""
+"The `brokenlinks` directive is supplied by the [[!iki plugins/brokenlinks "
+"desc=brokenlinks]] plugin."
+msgstr ""
+"Die `brokenlinks`-Anweisung wird durch die [[!iki plugins/brokenlinks "
+"desc=brokenlinks]]-Erweiterung bereitgestellt."
+
+#. type: Plain text
+msgid ""
+"This directive generates a list of broken links on pages in the wiki. This "
+"is a useful way to find pages that still need to be written, or links that "
+"are written wrong."
+msgstr ""
+"Diese Anweisung erzeugt eine Liste aller defekter Links im Wiki. Dies ist "
+"ein nützlicher Weg zu erfahren, welche Seiten noch geschrieben werden "
+"müssen und welche Links Fehler enthalten."
+
+#. type: Plain text
+msgid ""
+"The optional parameter \"pages\" can be a [[ikiwiki/PageSpec]] specifying "
+"the pages to search for broken links, default is search them all."
+msgstr ""
+"Der optionale Parameter `pages` kann eine [[ikiwiki/PageSpec]] enthalten, "
+"die angibt welche Seiten nach defekten Links durchsucht werden sollen. "
+"Standardmäßig werden alle durchsucht."
+
+#. type: Plain text
+msgid "Example:"
+msgstr "Beispiel:"
+
+#. type: Plain text
+#, no-wrap
+msgid "\t\\[[!brokenlinks pages=\"* and !recentchanges\"]]\n"
+msgstr "\t\\[[!brokenlinks pages=\"* and !recentchanges\"]]\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!meta robots=\"noindex, follow\"]]\n"
+msgstr "[[!meta robots=\"noindex, follow\"]]\n"
+
+
diff --git a/po/underlays/directives/ikiwiki/directive/calendar.de.po b/po/underlays/directives/ikiwiki/directive/calendar.de.po
new file mode 100644 (file)
index 0000000..56a8c7e
--- /dev/null
@@ -0,0 +1,183 @@
+# German translation of directives/ikiwiki/directive/calendar page for ikiwiki.
+# Copyright © 2010 Sebastian Kuhnert <mail@sebastian-kuhnert.de>
+# Redistribution and use in source and compiled forms, with or without
+# modification, are permitted under any circumstances. No warranty.
+msgid ""
+msgstr ""
+"POT-Creation-Date: 2010-03-12 09:29+0530\n"
+"PO-Revision-Date: 2010-03-14 13:57+0530\n"
+"Last-Translator: Sebastian Kuhnert <mail@sebastian-kuhnert.de>\n"
+"Language-Team: None\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#. type: Plain text
+msgid ""
+"The `calendar` directive is supplied by the [[!iki plugins/calendar "
+"desc=calendar]] plugin."
+msgstr ""
+"Die `calendar`-Anweisung wird durch die [[!iki plugins/calendar "
+"desc=calendar]]-Erweiterung bereitgestellt."
+
+#. type: Plain text
+msgid ""
+"This directive displays a calendar, similar to the typical calendars shown "
+"on some blogs."
+msgstr ""
+"Diese Anweisung zeigt einen Kalender, ähnlich denen, die auf manchen Blogs "
+"angezeigt werden."
+
+#. type: Title #
+#, no-wrap
+msgid "examples"
+msgstr "Beispiele"
+
+#. type: Plain text
+#, no-wrap
+msgid "\t\\[[!calendar ]]\n"
+msgstr "\t\\[[!calendar ]]\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "\t\\[[!calendar type=\"month\" pages=\"blog/* and !*/Discussion\"]]\n"
+msgstr "\t\\[[!calendar type=\"month\" pages=\"blog/* and !*/Discussion\"]]\n"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"\t\\[[!calendar type=\"year\" year=\"2005\" pages=\"blog/* and "
+"!*/Discussion\"]]\n"
+msgstr ""
+"\t\\[[!calendar type=\"year\" year=\"2005\" pages=\"blog/* and "
+"!*/Discussion\"]]\n"
+
+#. type: Title ##
+#, no-wrap
+msgid "setup"
+msgstr "Einrichtung"
+
+#. type: Plain text
+msgid ""
+"The calendar is essentially a fancy front end to archives of previous pages, "
+"usually used for blogs. It can produce a calendar for a given month, or a "
+"list of months for a given year. The month format calendar simply links to "
+"any page posted on each day of the month. The year format calendar links to "
+"archive pages, with names like `archives/2007` (for all of 2007)  and "
+"`archives/2007/01` (for January, 2007)."
+msgstr ""
+"Der Kalender ist im Wesentlichen eine schicke Schnittstelle zu einem Archiv mit "
+"früheren Seiten und wird normalerweise für Blogs verwendet. Er kann einen "
+"Kalender für einen angegebenen Monat erzeugen, oder eine Liste der Monate eines "
+"angegebenen Jahres. Der Kalender im Jahresformat enthält einfach Links zu den "
+"Archivseiten mit Namen wie `archiv/2007` (für ganz 2007) und `archiv/2007/01` "
+"(für Januar 2007)."
+
+#. type: Plain text
+msgid ""
+"While you can insert calendar directives anywhere on your wiki, including in "
+"the sidebar, you'll also need to create these archive pages. They typically "
+"use this directive to display a calendar, and also use [[inline]] to display "
+"or list pages created in the given time frame."
+msgstr ""
+"Während `calendar`-Anweisungen überall im Wiki verwendet werden können, auch in "
+"der Sidebar, muss man auch die Archiv-Seiten anlegen. Dort wird typischerweise "
+"diese Anweisung verwendet, um einen Kalender anzuzeigen, und außerdem die Seiten "
+"aus dem entsprechenden Zeitraum über [[inline]] eingebunden."
+
+#. type: Plain text
+msgid ""
+"The `ikiwiki-calendar` command can be used to automatically generate the "
+"archive pages. It also refreshes the wiki, updating the calendars to "
+"highlight the current day. This command is typically run at midnight from "
+"cron. An example crontab:"
+msgstr ""
+"Der `ikiwiki-calendar`-Befehl kann verwendet werden, um die Archivseiten "
+"automatisch zu erzeugen. Es aktualisiert auch das Wiki und hebt in den Kalendern "
+"den aktuellen Tag hervor. Dieser Befehl wird typischerweise um Mitternacht von "
+"cron ausgeführt, beispielsweise durch folgenden crontab-Eintrag:"
+
+#. type: Plain text
+msgid "An example crontab:"
+msgstr "Ein Beispiel-Eintrag in crontab:"
+
+#. type: Plain text
+#, no-wrap
+msgid "\t0 0 * * * ikiwiki-calendar ~/ikiwiki.setup \"posts/* and !*/Discussion\"\n"
+msgstr ""
+"\t0 0 * * * ikiwiki-calendar ~/ikiwiki.setup \"posts/* and !*/Discussion\"\n"
+
+#. type: Title ##
+#, no-wrap
+msgid "usage"
+msgstr "Verwendung"
+
+#. type: Bullet: '* '
+msgid ""
+"`type` - Used to specify the type of calendar wanted. Can be one of "
+"\"month\" or \"year\". The default is a month view calendar."
+msgstr ""
+"`type` - Hiermit wird die Art des zu erzeugenden Kalenders angegeben. Kann "
+"entweder \"month\" oder \"year\" sein. Vorgeingestellt ist die Monatsansicht."
+
+#. type: Bullet: '* '
+msgid ""
+"`pages` - Specifies the [[ikiwiki/PageSpec]] of pages to link to from the "
+"month calendar. Defaults to \"*\"."
+msgstr ""
+"`pages` - Gibt die [[ikiwiki/PageSpec]] der Seiten an, auf die aus dem "
+"Monatskalender verwiesen werden soll. Voreingestellt ist \"*\"."
+
+#. type: Bullet: '* '
+msgid ""
+"`archivebase` - Configures the base of the archives hierarchy. The default "
+"is \"archives\". Note that this default can also be overridden for the whole "
+"wiki by setting `archivebase` in ikiwiki's setup file."
+msgstr ""
+"`archivebase` - Konfiguriert die Basis der Archiv-Hierarchie. Voreingestellt ist "
+"\"archives\". Dies kann auch für das gesamte Wiki geändert werden, indem "
+"`archivebase` in der Setup-Datei von ikiwiki gesetzt wird."
+
+#. type: Bullet: '* '
+msgid ""
+"`year` - The year for which the calendar is requested. Defaults to the "
+"current year."
+msgstr ""
+"`year` - Das Jahr, für das der Kalender angezeigt werden soll. Voreingestellt ist "
+"das aktuelle Jahr."
+
+#. type: Bullet: '* '
+msgid ""
+"`month` - The numeric month for which the calendar is requested, in the "
+"range 1..12. Used only for the month view calendar, and defaults to the "
+"current month."
+msgstr ""
+"`month` - Der Monat, für den der Kalender angezeigt werden soll, als Zahl von 1 "
+"bis 12. Wird nur für Monatskalender verwendet. Voreingestellt ist der aktuelle "
+"Monat."
+
+#. type: Bullet: '* '
+msgid ""
+"`week_start_day` - A number, in the range 0..6, which represents the day of "
+"the week that the month calendar starts with. 0 is Sunday, 1 is Monday, and "
+"so on. Defaults to 0, which is Sunday."
+msgstr ""
+"`week_start_day` - Eine Zahl aus dem Bereich 0 bis 6, die den Wochentag angibt, "
+"mit dem ein Monatskalender anfängt. 0 ist Sonntag, 1 ist Montag, und so weiter. "
+"Voreingestellt ist 0, also Sonntag."
+
+#. type: Bullet: '* '
+msgid ""
+"`months_per_row` - In the annual calendar, number of months to place in each "
+"row. Defaults to 3."
+msgstr ""
+"`months_per_row` - Anzahl der Monate, die in einem Jahreskalender in einer Zeile "
+"platziert werden. Voreingestellt ist 3."
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!meta robots=\"noindex, follow\"]]\n"
+msgstr "[[!meta robots=\"noindex, follow\"]]\n"
+
+
diff --git a/po/underlays/directives/ikiwiki/directive/color.de.po b/po/underlays/directives/ikiwiki/directive/color.de.po
new file mode 100644 (file)
index 0000000..48cd573
--- /dev/null
@@ -0,0 +1,97 @@
+# German translation of directives/ikiwiki/directive/color page for ikiwiki.
+# Copyright © 2010 Sebastian Kuhnert <mail@sebastian-kuhnert.de>
+# Redistribution and use in source and compiled forms, with or without
+# modification, are permitted under any circumstances. No warranty.
+msgid ""
+msgstr ""
+"POT-Creation-Date: 2010-03-12 09:29+0530\n"
+"PO-Revision-Date: 2010-03-14 13:58+0530\n"
+"Last-Translator: Sebastian Kuhnert <mail@sebastian-kuhnert.de>\n"
+"Language-Team: None\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#. type: Plain text
+msgid ""
+"The `color` directive is supplied by the [[!iki plugins/color desc=color]] "
+"plugin."
+msgstr ""
+"Die `color`-Anweisung wird durch die [[!iki plugins/color "
+"desc=color]]-Erweiterung bereitgestellt."
+
+#. type: Plain text
+msgid ""
+"This directive can be used to color a piece of text on a page.  It can be "
+"used to set the foreground and/or background color of the text."
+msgstr ""
+"Diese Anweisung kann verwendet werden, um ein Stück Text auf einer Seite zu "
+"färben. Sie kann die Schrift- und/oder Hintergrundfarbe verändern."
+
+#. type: Plain text
+msgid ""
+"You can use a color name (e.g. `white`) or HTML code (e.g. `#ffffff`)  to "
+"define colors."
+msgstr ""
+"Man kann einen Farbnamen (z.B. `white`) oder HTML-Code (z.B. `#ffffff`) "
+"verwenden, um eine Farbe zu definieren."
+
+#. type: Title ##
+#, no-wrap
+msgid "examples"
+msgstr "Beispiele"
+
+#. type: Plain text
+msgid ""
+"Here the foreground color is defined as a word, while the background color "
+"is defined as a HTML color code:"
+msgstr ""
+"Hier wird die Schriftfarbe durch ein Wort und die Hintergrundfarbe durch eine "
+"HTML-Farbe definiert:"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"\t\\[[!color foreground=white background=#ff0000 text=\"White text on red "
+"background\"]]\n"
+msgstr ""
+"\t\\[[!color foreground=white background=#ff0000 text=\"Weißer Text auf rotem "
+"Hintergrund\"]]\n"
+
+#. type: Plain text
+msgid ""
+"The background color is missing, so the text is displayed on default "
+"background:"
+msgstr ""
+"Die Hintergrundfarbe fehlt, also wird der Text auf dem Standardhintergrund "
+"dargestellt:"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"\t\\[[!color foreground=white text=\"White text on default color "
+"background\"]]\n"
+msgstr ""
+"\t\\[[!color foreground=white text=\"Weißer Text auf Hintergrund in "
+"Standardfarbe\"]]\n"
+
+#. type: Plain text
+msgid "The foreground is missing, so the text has the default foreground color:"
+msgstr "Die Schriftfarbe fehlt, also wird hierfür die Standardfarbe verwendet:"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"\t\\[[!color background=#ff0000 text=\"Default color text on red "
+"background\"]]\n"
+msgstr ""
+"\t\\[[!color background=#ff0000 text=\"Schrift in Standardfarbe auf rotem "
+"Hintergrund\"]]\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!meta robots=\"noindex, follow\"]]\n"
+msgstr "[[!meta robots=\"noindex, follow\"]]\n"
+
+
diff --git a/po/underlays/directives/ikiwiki/directive/comment.de.po b/po/underlays/directives/ikiwiki/directive/comment.de.po
new file mode 100644 (file)
index 0000000..fed27cf
--- /dev/null
@@ -0,0 +1,133 @@
+# German translation of directives/ikiwiki/directive/comment page for ikiwiki.
+# Copyright © 2010 Sebastian Kuhnert <mail@sebastian-kuhnert.de>
+# Redistribution and use in source and compiled forms, with or without
+# modification, are permitted under any circumstances. No warranty.
+msgid ""
+msgstr ""
+"POT-Creation-Date: 2010-03-12 09:29+0530\n"
+"PO-Revision-Date: 2010-03-14 13:58+0530\n"
+"Last-Translator: Sebastian Kuhnert <mail@sebastian-kuhnert.de>\n"
+"Language-Team: None\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#. type: Plain text
+msgid ""
+"The `comment` directive is supplied by the [[!iki plugins/comments "
+"desc=comments]] plugin, and is used to add a comment to a page. Typically, "
+"the directive is the only thing on a comment page, and is filled out by the "
+"comment plugin when a user posts a comment."
+msgstr ""
+"Die `comment`-Anweisung wird durch die [[!iki plugins/comments "
+"desc=comments]]-Erweiterung bereitgestellt, und wird zum Hinzufügen von "
+"Kommentaren zu einer Seite verwendet. Typischerweise ist diese Anweisung "
+"das Einzige auf einer Kommentarseite, und wird von der comment-Erweiterung "
+"ausgefüllt, wenn ein Benutzer einen Kommentar veröffentlicht."
+
+#. type: Plain text
+msgid "Example:"
+msgstr "Beispiel:"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"\t\\[[!comment format=mdwn\n"
+"\tusername=\"foo\"\n"
+"\tsubject=\"Bar\"\n"
+"\tdate=\"2009-06-02T19:05:01Z\"\n"
+"\tcontent=\"\"\"\n"
+msgstr ""
+"\t\\[[!comment format=mdwn\n"
+"\tusername=\"foo\"\n"
+"\tsubject=\"Bar\"\n"
+"\tdate=\"2009-06-02T19:05:01Z\"\n"
+"\tcontent=\"\"\"\n"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"\tBlah blah.\n"
+"\t\"\"\"\n"
+msgstr ""
+"\tBla bla.\n"
+"\t\"\"\"\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "\t]]\n"
+msgstr "\t]]\n"
+
+#. type: Title ##
+#, no-wrap
+msgid "usage"
+msgstr "Verwendung"
+
+#. type: Plain text
+msgid ""
+"The only required parameter is `content`, the others just add or override "
+"metadata of the comment."
+msgstr ""
+"Der einzige erforderliche Parameter ist `content`, die übrigen fügen nur "
+"Metadaten zu dem Kommentar hinzu oder ändern diese."
+
+#. type: Bullet: '* '
+msgid ""
+"`content` - Text to display for the comment.  Note that "
+"[[directives|ikiwiki/directive]] may not be allowed, depending on the "
+"configuration of the comment plugin."
+msgstr ""
+"`content` - Text, der in diesem Kommentar angezeigt werden soll. "
+"[[Anweisungen|ikiwiki/directive]] sind hier unter Umständen nicht erlaubt, "
+"abhängig von der Konfiguration der comment-Erweiterung."
+
+#. type: Bullet: '* '
+msgid "`format` - Specifies the markup used for the content."
+msgstr ""
+"`format` - Gibt die Formatierungssprache an, die für den Inhalt verwendet "
+"wird."
+
+#. type: Bullet: '* '
+msgid "`subject` - Subject for the comment."
+msgstr "`subject` - Betreff des Kommentars."
+
+#. type: Bullet: '* '
+msgid ""
+"`date` - Date the comment was posted. Can be entered in nearly any format, "
+"since it's parsed by [[!cpan TimeDate]]"
+msgstr ""
+"`date` - Datum, an dem der Kommentar veröffentlicht wurde. Kann in beinahe "
+"beliebigem Format angegeben werden, da es von [[!cpan TimeDate]] "
+"ausgewertet wird."
+
+#. type: Bullet: '* '
+msgid ""
+"`username` - Used to record the username (or OpenID)  of a logged in "
+"commenter."
+msgstr ""
+"`username` - Hier wird der Benutzername (oder die OpenID) eines "
+"angemeldeten Kommentators gespeichert."
+
+#. type: Bullet: '* '
+msgid ""
+"`ip` - Can be used to record the IP address of a commenter, if they posted "
+"anonymously."
+msgstr ""
+"`ip` - Hier kann die IP-Adresse eines Kommentators gespeichert werden, wenn "
+"der Kommentar anonym abgegeben wurde."
+
+#. type: Bullet: '* '
+msgid ""
+"`claimedauthor` - Records the name that the user entered, if anonymous "
+"commenters are allowed to enter their (unverified)  name."
+msgstr ""
+"`claimedauthor` - Speichert den Namen, den der Benutzer angegeben hat, wenn "
+"anonyme Kommentatoren ihren (nicht verifizierten) Namen angeben dürfen."
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!meta robots=\"noindex, follow\"]]\n"
+msgstr "[[!meta robots=\"noindex, follow\"]]\n"
+
+
diff --git a/po/underlays/directives/ikiwiki/directive/copy.de.po b/po/underlays/directives/ikiwiki/directive/copy.de.po
new file mode 100644 (file)
index 0000000..54f7cae
--- /dev/null
@@ -0,0 +1,25 @@
+# German translation of directives/ikiwiki/directive/copy page for ikiwiki.
+# Copyright © 2010 Sebastian Kuhnert <mail@sebastian-kuhnert.de>
+# Redistribution and use in source and compiled forms, with or without
+# modification, are permitted under any circumstances. No warranty.
+msgid ""
+msgstr ""
+"POT-Creation-Date: 2010-03-12 09:29+0530\n"
+"PO-Revision-Date: 2010-03-12 22:05+0530\n"
+"Last-Translator: Sebastian Kuhnert <mail@sebastian-kuhnert.de>\n"
+"Language-Team: None\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!meta redir=/ikiwiki/directive/cutpaste]]\n"
+msgstr "[[!meta redir=/ikiwiki/directive/cutpaste]]\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!meta robots=\"noindex, follow\"]]\n"
+msgstr "[[!meta robots=\"noindex, follow\"]]\n"
+
diff --git a/po/underlays/directives/ikiwiki/directive/cut.de.po b/po/underlays/directives/ikiwiki/directive/cut.de.po
new file mode 100644 (file)
index 0000000..54f7cae
--- /dev/null
@@ -0,0 +1,25 @@
+# German translation of directives/ikiwiki/directive/copy page for ikiwiki.
+# Copyright © 2010 Sebastian Kuhnert <mail@sebastian-kuhnert.de>
+# Redistribution and use in source and compiled forms, with or without
+# modification, are permitted under any circumstances. No warranty.
+msgid ""
+msgstr ""
+"POT-Creation-Date: 2010-03-12 09:29+0530\n"
+"PO-Revision-Date: 2010-03-12 22:05+0530\n"
+"Last-Translator: Sebastian Kuhnert <mail@sebastian-kuhnert.de>\n"
+"Language-Team: None\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!meta redir=/ikiwiki/directive/cutpaste]]\n"
+msgstr "[[!meta redir=/ikiwiki/directive/cutpaste]]\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!meta robots=\"noindex, follow\"]]\n"
+msgstr "[[!meta robots=\"noindex, follow\"]]\n"
+
diff --git a/po/underlays/directives/ikiwiki/directive/cutpaste.de.po b/po/underlays/directives/ikiwiki/directive/cutpaste.de.po
new file mode 100644 (file)
index 0000000..b99826e
--- /dev/null
@@ -0,0 +1,153 @@
+# German translation of directives/ikiwiki/directive/cutpaste page for ikiwiki.
+# Copyright © 2010 Sebastian Kuhnert <mail@sebastian-kuhnert.de>
+# Redistribution and use in source and compiled forms, with or without
+# modification, are permitted under any circumstances. No warranty.
+msgid ""
+msgstr ""
+"POT-Creation-Date: 2010-03-12 09:29+0530\n"
+"PO-Revision-Date: 2010-03-14 13:59+0530\n"
+"Last-Translator: Sebastian Kuhnert <mail@sebastian-kuhnert.de>\n"
+"Language-Team: None\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#. type: Plain text
+msgid ""
+"The `copy`, `cut` and `paste` directives are supplied by the [[!iki "
+"plugins/cutpaste desc=cutpaste]] plugin."
+msgstr ""
+"Die `copy`- `cut`- und `paste`-Anweisungen werden durch die [[!iki "
+"plugins/cutpaste desc=cutpaste]]-Erweiterung bereitgestellt."
+
+#. type: Plain text
+msgid "With these directives you can store and recall pieces of text in a page:"
+msgstr ""
+"Mit diesen Anweisungen kann man Textabschnitte innerhalb einer Seite "
+"speichern und wieder abrufen:"
+
+#. type: Bullet: ' * '
+msgid ""
+"`\\[[!cut id=name text=\"text\"]]` memorizes the text allowing to recall it "
+"using the given ID.  The text being cut is not included in the output."
+msgstr ""
+"`\\[[!cut id=name text=\"text\"]]` merkt sich den Text und erlaubt es, ihn "
+"über die angegebene id wieder abzurufen. Der Text taucht an dieser Stelle "
+"nicht in der Ausgabe auf."
+
+#. type: Bullet: ' * '
+msgid ""
+"`\\[[!copy id=name text=\"text\"]]` memorizes the text allowing to recall it "
+"using the given ID.  The text being cut *is* included in the output."
+msgstr ""
+"`\\[[!copy id=name text=\"text\"]]` merkt sich den Text und erlaubt es, ihn "
+"über die angegebene id wieder abzurufen. Der Text *wird* an dieser Stelle "
+"ausgegeben."
+
+#. type: Bullet: ' * '
+msgid "`\\[[!paste id=name]]` is replaced by the previously memorized text."
+msgstr "`\\[[!paste id=name]]` wird durch den zuvor gemerkten Text ersetzt."
+
+#. type: Plain text
+msgid ""
+"The text being cut, copied and pasted can freely include wiki markup, "
+"including more calls to cut, copy and paste."
+msgstr ""
+"Der ausgeschnittene, kopierte und eingefügte Text kann beliebige "
+"Wiki-Formatierungsanweisungen enthalten, inklusive weiterer Aufrufe von "
+"`cut`, `copy` und `paste`."
+
+#. type: Plain text
+msgid ""
+"You do not need to memorize the text before using it: a cut directive can "
+"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:"
+msgstr ""
+"Man muss sich einen Text nicht vor seiner Verwendung merken: Eine "
+"`cut`-Anweisung kann auch erst nach der `paste`-Anweisung kommen, die ihren "
+"Text verwendet. Dies ist ein durchaus nützlich, um größere Blöcke von Text "
+"wie lange Anmerkungen erst später anzugeben und so für einen natürlicheren "
+"Textfluss zu sorgen. Zum Beispiel:"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"\t\\[[!toggleable id=\"cut\" text=\"[[!paste id=cutlongdesc]]\"]]\n"
+"\t\\[[!toggleable id=\"copy\" text=\"[[!paste id=copylongdesc]]\"]]\n"
+"\t\\[[!toggleable id=\"paste\" text=\"[[!paste id=pastelongdesc]]\"]]\n"
+msgstr ""
+"\t\\[[!toggleable id=\"cut\" text=\"[[!paste id=beschreibungcut]]\"]]\n"
+"\t\\[[!toggleable id=\"copy\" text=\"[[!paste id=beschreibungcopy]]\"]]\n"
+"\t\\[[!toggleable id=\"paste\" text=\"[[!paste id=beschreibungpaste]]\"]]\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "\t[...some time later...]\n"
+msgstr "\t[&hellip; und später &hellip;]\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "\t\\[[!cut id=cutlongdesc text=\"\"\"\n"
+msgstr "\t\\[[!cut id=beschreibungcut text=\"\"\"\n"
+
+#. type: Plain text
+#:
+#, no-wrap
+msgid "\t   blah blah blah\n"
+msgstr "\t   bla bla bla\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "\t\\[[!cut id=copylongdesc text=\"\"\"\n"
+msgstr "\t\\[[!cut id=beschreibungcopy text=\"\"\"\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "\t\\[[!cut id=pastelongdesc text=\"\"\"\n"
+msgstr "\t\\[[!cut id=beschreibungpaste text=\"\"\"\n"
+
+#. type: Plain text
+msgid ""
+"This can potentially be used to create loops, but ikiwiki is clever and "
+"breaks them."
+msgstr ""
+"Auf diese Weise können möglicherweise Schleifen erzeugt werden, aber ikiwiki "
+"ist schlau und bricht diese auf."
+
+#. type: Plain text
+msgid ""
+"Since you can paste without using double quotes, copy and paste can be used "
+"to nest directives that require multiline parameters inside each other:"
+msgstr ""
+"Da man `paste` ohne Anführungszeichen verwenden kann, können mit `copy` und "
+"`paste` Anweisungen ineinander geschachtelt werden, die mehrzeilige Parameter "
+"benötigen:"
+
+#. type: Plain text
+#, no-wrap
+msgid "\t\\[[!toggleable id=foo text=\"\"\"\n"
+msgstr "\t\\[[!toggleable id=foo text=\"\"\"\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "\t  [[!toggleable id=bar text=\"[[!paste id=baz]]\"]]\n"
+msgstr "\t  [[!toggleable id=bar text=\"[[!paste id=baz]]\"]]\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "\t\\[[!cut id=baz text=\"\"\"\n"
+msgstr "\t\\[[!cut id=baz text=\"\"\"\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "\tmultiline parameter!\n"
+msgstr "\tmehrzeiliger Parameter!\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!meta robots=\"noindex, follow\"]]\n"
+msgstr "[[!meta robots=\"noindex, follow\"]]\n"
+
+
diff --git a/po/underlays/directives/ikiwiki/directive/date.de.po b/po/underlays/directives/ikiwiki/directive/date.de.po
new file mode 100644 (file)
index 0000000..517af75
--- /dev/null
@@ -0,0 +1,64 @@
+# German translation of directives/ikiwiki/directive/date page for ikiwiki.
+# Copyright © 2010 Sebastian Kuhnert <mail@sebastian-kuhnert.de>
+# Redistribution and use in source and compiled forms, with or without
+# modification, are permitted under any circumstances. No warranty.
+msgid ""
+msgstr ""
+"POT-Creation-Date: 2010-03-12 09:29+0530\n"
+"PO-Revision-Date: 2010-03-14 13:59+0530\n"
+"Last-Translator: Sebastian Kuhnert <mail@sebastian-kuhnert.de>\n"
+"Language-Team: None\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#. type: Plain text
+msgid ""
+"The `date` directive is supplied by the [[!iki plugins/date desc=date]] "
+"plugin."
+msgstr ""
+"Die `date`-Anweisung wird durch die [[!iki plugins/date desc=date]]-Erweiterung "
+"bereitgestellt."
+
+#. type: Plain text
+msgid ""
+"This directive can be used to display a date on a page, using the same "
+"display method that is used to display the modification date in the page "
+"footer, and other dates in the wiki. This can be useful for consistency of "
+"display, or if you want to embed parseable dates into the page source."
+msgstr ""
+"Diese Anweisung kann verwendet werden, um ein Datum auf einer Seite anzuzeigen, "
+"und verwendet dieselbe Methode, die auch zur Anzeige des Datums der letzten "
+"Änderung im Seitenfuß und anderer Daten im Wiki verwendet wird. Dies ist "
+"nützlich für die Konsistenz der Ausgabe, oder wenn der Seitenquelltext ein "
+"maschinenlesbares Datum enthalten soll."
+
+#. type: Plain text
+msgid ""
+"Like the dates used by the [[meta]] directive, the date can be entered in "
+"nearly any format, since it's parsed by [[!cpan TimeDate]]."
+msgstr ""
+"Wie auch in der [[meta]]-Anweisung kann das Datum in nahezu beliebigem Format "
+"angegeben werden, da es durch [[!cpan TimeDate]] interpretiert wird."
+
+#. type: Plain text
+msgid ""
+"For example, an update to a page with an embedded date stamp could look "
+"like:"
+msgstr ""
+"Zum Beispiel könnte eine Seite mit eingebettetem Zeitstempel folgendermaßen "
+"aussehen:"
+
+#. type: Plain text
+#, no-wrap
+msgid "\tUpdated \\[[!date \"Wed, 25 Nov 2009 01:11:55 -0500\"]]: mumble mumble\n"
+msgstr ""
+"\tAktualisiert \\[[!date \"Wed, 25 Nov 2009 01:11:55 -0500\"]]: murmel murmel\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!meta robots=\"noindex, follow\"]]\n"
+msgstr "[[!meta robots=\"noindex, follow\"]]\n"
+
+
diff --git a/po/underlays/directives/ikiwiki/directive/edittemplate.de.po b/po/underlays/directives/ikiwiki/directive/edittemplate.de.po
new file mode 100644 (file)
index 0000000..d2ca0c2
--- /dev/null
@@ -0,0 +1,99 @@
+# German translation of directives/ikiwiki/directive/edittemplate page for ikiwiki.
+# Copyright © 2010 Sebastian Kuhnert <mail@sebastian-kuhnert.de>
+# Redistribution and use in source and compiled forms, with or without
+# modification, are permitted under any circumstances. No warranty.
+msgid ""
+msgstr ""
+"POT-Creation-Date: 2010-03-12 09:29+0530\n"
+"PO-Revision-Date: 2010-03-14 13:59+0530\n"
+"Last-Translator: Sebastian Kuhnert <mail@sebastian-kuhnert.de>\n"
+"Language-Team: None\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#. type: Plain text
+msgid ""
+"The `edittemplate` directive is supplied by the [[!iki plugins/edittemplate "
+"desc=edittemplate]] plugin."
+msgstr ""
+"Die `edittemplate`-Anweisung wird durch die [[!iki plugins/edittemplate "
+"desc=edittemplate]]-Erweiterung bereitgestellt."
+
+#. type: Plain text
+msgid ""
+"This directive allows registering template pages, that provide default "
+"content for new pages created using the web frontend. To register a "
+"template, insert a [[ikiwiki/directive/template]] directive on some other "
+"page."
+msgstr ""
+"Diese Anweisung erlaubt es, Vorlagen-Seiten zu registrieren, die einen "
+"Standardinhalt für neue Seiten bereitstellen, die über das Webfrontend "
+"angelegt werden. Um eine Vorlage zu registrieren, fügt man eine "
+"[[ikiwiki/directive/template]]-Anweisung auf einer anderen Seite ein."
+
+#. type: Plain text
+#, no-wrap
+msgid "\t\\[[!edittemplate template=\"bugtemplate\" match=\"bugs/*\"]]\n"
+msgstr "\t\\[[!edittemplate template=\"bugtemplate\" match=\"bugs/*\"]]\n"
+
+#. type: Plain text
+msgid ""
+"In the above example, the page named \"bugtemplate\" is registered as a "
+"template to be used when any page named \"bugs/*\" is created. To avoid the "
+"directive displaying a note about the template being registered, add "
+"\"silent=yes\"."
+msgstr ""
+"Im obigen Beispiel wird die Seite mit Namen \"bugtemplate\" für alle Seiten "
+"als Vorlage registriert, die mit Namen \"bugs/*\" angelegt werden. Um den "
+"Hinweis über die Registrierung der Vorlage zu unterdrücken, kann man "
+"`silent=yes` hinzufügen."
+
+#. type: Plain text
+msgid ""
+"Often the template page contains a simple skeleton for a particular type of "
+"page. For the bug report pages in the above example, it might look something "
+"like:"
+msgstr ""
+"Oft enthält eine Vorlagen-Seite ein einfaches Skelett für einen bestimmten "
+"Seitentyp. Für die Fehlerberichte aus dem obigen Beispiel könnte sie "
+"folgendermaßen aussehen:"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"\tPackage: \n"
+"\tVersion: \n"
+"\tReproducible: y/n\n"
+"\tDetails:\n"
+msgstr ""
+"\tPaket: \n"
+"\tVersion: \n"
+"\tReproduzierbar: ja/nein\n"
+"\tDetails:\n"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"The template page can also contain [[!cpan HTML::Template]] directives,\n"
+"similar to other ikiwiki [[templates]]. Currently only one variable is\n"
+"set: `<TMPL_VAR name>` is replaced with the name of the page being\n"
+"created.\n"
+msgstr ""
+
+#. type: Plain text
+msgid ""
+"It's generally not a good idea to put the `edittemplate` directive in the "
+"template page itself, since the directive would then be included as part of "
+"the template on new pages, which would then in turn be registered as "
+"templates. If multiple pages are registered as templates for a new page, an "
+"arbitrary one is chosen, so that could get confusing."
+msgstr ""
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!meta robots=\"noindex, follow\"]]\n"
+msgstr ""
+
+
diff --git a/po/underlays/directives/ikiwiki/directive/format.de.po b/po/underlays/directives/ikiwiki/directive/format.de.po
new file mode 100644 (file)
index 0000000..499816a
--- /dev/null
@@ -0,0 +1,93 @@
+# German translation of directives/ikiwiki/directive/format page for ikiwiki.
+# Copyright © 2010 Sebastian Kuhnert <mail@sebastian-kuhnert.de>
+# Redistribution and use in source and compiled forms, with or without
+# modification, are permitted under any circumstances. No warranty.
+msgid ""
+msgstr ""
+"POT-Creation-Date: 2010-03-12 09:29+0530\n"
+"PO-Revision-Date: 2010-03-14 14:00+0530\n"
+"Last-Translator: Sebastian Kuhnert <mail@sebastian-kuhnert.de>\n"
+"Language-Team: None\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#. type: Plain text
+msgid ""
+"The `format` directive is supplied by the [[!iki plugins/format "
+"desc=format]] plugin."
+msgstr ""
+"Die `format`-Anweisung wird durch die [[!iki plugins/format "
+"desc=format]]-Erweiterung bereitgestellt."
+
+#. type: Plain text
+msgid ""
+"The directive allows formatting a chunk of text using any available page "
+"format. It takes two parameters. First is the type of format to use, ie the "
+"extension that would be used for a standalone file of this type.  Second is "
+"the text to format."
+msgstr ""
+"Die Anweisung erlaubt es, einen Textabschnitt mit einem beliebigen "
+"Seitenformat zu formatieren. Sie hat zwei Parameter. Der erste ist das zu "
+"verwendende Seitenformat &ndash; also die Erweiterung, die für eine "
+"eigenständige Seite dieses Typs verwendet würde. Der zweite ist der zu "
+"formatierende Text."
+
+#. type: Plain text
+msgid ""
+"For example, this will embed an otl outline inside a page using mdwn or some "
+"other format:"
+msgstr ""
+"Zum Beispiel bettet dies eine otl-Gliederung in eine Seite ein, die mdwn "
+"oder ein anderes Format verwendet:"
+
+#. type: Plain text
+#, no-wrap
+msgid "\t\\[[!format otl \"\"\"\n"
+msgstr "\t\\[[!format otl \"\"\"\n"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"\tfoo\n"
+"\t\t1\n"
+"\t\t2\n"
+"\tbar\n"
+"\t\t3\n"
+"\t\t4\n"
+msgstr ""
+"\tfoo\n"
+"\t\t1\n"
+"\t\t2\n"
+"\tbar\n"
+"\t\t3\n"
+"\t\t4\n"
+
+#. type: Plain text
+msgid ""
+"Note that if the highlight plugin is enabled, this directive can also be "
+"used to display syntax highlighted code. Many languages and formats are "
+"supported. For example:"
+msgstr ""
+"Wenn die highlight-Erweiterung installiert ist, kann diese Anweisung auch "
+"zur "
+"Anzeige von Programmcode mit Syntaxhervorhebung verwendet werden. Viele "
+"Sprachen und Formate werden unterstützt. Zum Beispiel:"
+
+#. type: Plain text
+#, no-wrap
+msgid "\t\\[[!format perl \"\"\"\n"
+msgstr "\t\\[[!format perl \"\"\"\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "\tprint \"hello, world\\n\";\n"
+msgstr "\tprint \"hello, world\\n\";\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!meta robots=\"noindex, follow\"]]\n"
+msgstr "[[!meta robots=\"noindex, follow\"]]\n"
+
+
diff --git a/po/underlays/directives/ikiwiki/directive/fortune.de.po b/po/underlays/directives/ikiwiki/directive/fortune.de.po
new file mode 100644 (file)
index 0000000..1e63609
--- /dev/null
@@ -0,0 +1,42 @@
+# German translation of directives/ikiwiki/directive/fortune page for ikiwiki.
+# Copyright © 2010 Sebastian Kuhnert <mail@sebastian-kuhnert.de>
+# Redistribution and use in source and compiled forms, with or without
+# modification, are permitted under any circumstances. No warranty.
+msgid ""
+msgstr ""
+"POT-Creation-Date: 2010-03-12 09:29+0530\n"
+"PO-Revision-Date: 2010-03-14 14:00+0530\n"
+"Last-Translator: Sebastian Kuhnert <mail@sebastian-kuhnert.de>\n"
+"Language-Team: None\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#. type: Plain text
+msgid ""
+"The `fortune` directive is supplied by the [[!iki plugins/fortune "
+"desc=fortune]] plugin."
+msgstr ""
+"Die `fortune`-Anweisung wird durch die [[!iki plugins/fortune "
+"desc=fortune]]-Erweiterung bereitgestellt."
+
+#. type: Plain text
+msgid ""
+"This just uses the `fortune` program to insert a fortune cookie into the "
+"page.  Usage:"
+msgstr ""
+"Sie verwendet einfach das Programm `fortune`, um einen Spruch (engl. "
+"*fortune cookie*) in die Seite einzubinden. Verwendung:"
+
+#. type: Plain text
+#, no-wrap
+msgid "\t\\[[!fortune ]]\n"
+msgstr "\t\\[[!fortune ]]\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!meta robots=\"noindex, follow\"]]\n"
+msgstr "[[!meta robots=\"noindex, follow\"]]\n"
+
+
diff --git a/po/underlays/directives/ikiwiki/directive/graph.de.po b/po/underlays/directives/ikiwiki/directive/graph.de.po
new file mode 100644 (file)
index 0000000..0d62a55
--- /dev/null
@@ -0,0 +1,88 @@
+# German translation of directives/ikiwiki/directive/graph page for ikiwiki.
+# Copyright © 2010 Sebastian Kuhnert <mail@sebastian-kuhnert.de>
+# Redistribution and use in source and compiled forms, with or without
+# modification, are permitted under any circumstances. No warranty.
+msgid ""
+msgstr ""
+"POT-Creation-Date: 2010-03-12 09:29+0530\n"
+"PO-Revision-Date: 2010-03-14 14:01+0530\n"
+"Last-Translator: Sebastian Kuhnert <mail@sebastian-kuhnert.de>\n"
+"Language-Team: None\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#. type: Plain text
+msgid ""
+"The `graph` directive is supplied by the [[!iki plugins/graphviz "
+"desc=graphviz]] plugin."
+msgstr ""
+"Die `graph`-Anweisung wird durch die [[!iki plugins/graphviz "
+"desc=graphviz]]-Erweiterung bereitgestellt."
+
+#. type: Plain text
+msgid ""
+"This directive allows embedding [graphviz](http://www.graphviz.org/) graphs "
+"in a page.  Example usage:"
+msgstr ""
+"Diese Anweisung erlaubt es, von [graphviz](http://www.graphviz.org/) "
+"erzeugte Graphen in eine Seite einzubinden. Verwendungsbeispiel:"
+
+#. type: Plain text
+#, no-wrap
+msgid "\t\\[[!graph src=\"a -> b -> c; a -> c;\"]]\n"
+msgstr "\t\\[[!graph src=\"a -> b -> c; a -> c;\"]]\n"
+
+#. type: Plain text
+msgid ""
+"Note that graphs will only show up in previews if your browser has "
+"[[!wikipedia data: URI]] support, or if the same graph already exists on "
+"that page."
+msgstr ""
+"Zu beachten ist, dass der Graph nur dann in der Vorschau auftaucht, wenn der "
+"verwendete Browser [[!wikipedia data: URI]] unterstützt, oder wenn derselbe "
+"Graph bereits auf der Seite existiert."
+
+#. type: Plain text
+msgid "The `graph` directive supports the following parameters:"
+msgstr "Die `graph`-Anweisung unterstützt die folgenden Parameter:"
+
+#. type: Bullet: '- '
+msgid "`src` - The graphviz source to render."
+msgstr "`src` - Der graphviz-Quelltext des zu erzeugenden Graphen."
+
+#. type: Bullet: '- '
+msgid ""
+"`type` - The type of graph to render: `graph` or `digraph`.  Defaults to "
+"`digraph`."
+msgstr ""
+"`type` - Die Art des zu erzeugenden Graphen: `graph` oder `digraph`. "
+"Voreingestellt ist `digraph`."
+
+#. type: Bullet: '- '
+msgid ""
+"`prog` - The graphviz program to render with: `dot`, `neato`, `fdp`, "
+"`twopi`, or `circo`.  Defaults to `dot`."
+msgstr ""
+"`prog` - Das graphviz-Programm, mit dem der Graph erzeugt werden soll: "
+"`dot`, `neato`, `fdp`, "
+"`twopi` oder `circo`.  Voreingestellt ist `dot`."
+
+#. type: Bullet: '- '
+msgid ""
+"`height`, `width` - Limit the size of the graph to a given height and width, "
+"in inches. You must specify both to limit the size; otherwise, graphviz will "
+"choose a size, without any limit."
+msgstr ""
+"`height`, `width` - Begrenzt die Größe des erzeugten Graphen durch die in "
+"Inch angegebene Höhe und Breite. Es müssen beide angegeben werden, um die "
+"Größe zu beschränken, graphviz sucht sich sonst selbst eine Größe aus, ohne "
+"jede Beschränkung."
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!meta robots=\"noindex, follow\"]]\n"
+msgstr "[[!meta robots=\"noindex, follow\"]]\n"
+
+
diff --git a/po/underlays/directives/ikiwiki/directive/haiku.de.po b/po/underlays/directives/ikiwiki/directive/haiku.de.po
new file mode 100644 (file)
index 0000000..7796216
--- /dev/null
@@ -0,0 +1,60 @@
+# German translation of directives/ikiwiki/directive/haiku page for ikiwiki.
+# Copyright © 2010 Sebastian Kuhnert <mail@sebastian-kuhnert.de>
+# Redistribution and use in source and compiled forms, with or without
+# modification, are permitted under any circumstances. No warranty.
+msgid ""
+msgstr ""
+"POT-Creation-Date: 2010-03-12 09:29+0530\n"
+"PO-Revision-Date: 2010-03-14 14:01+0530\n"
+"Last-Translator: Sebastian Kuhnert <mail@sebastian-kuhnert.de>\n"
+"Language-Team: None\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#. type: Plain text
+msgid ""
+"The `haiku` directive is supplied by the [[!iki plugins/haiku desc=haiku]] "
+"plugin."
+msgstr ""
+"Die `haiku`-Anweisung wird durch die [[!iki plugins/haiku "
+"desc=haiku]]-Erweiterung bereitgestellt."
+
+#. type: Plain text
+msgid ""
+"This directive allows inserting a randomly generated haiku into a wiki "
+"page.  Just type:"
+msgstr ""
+"Diese Anweisung erlaubt es, ein zufällig erzeugtes Haiku in eine Wiki-Seite "
+"einzufügen. Dafür genügt:"
+
+#. type: Plain text
+#, no-wrap
+msgid "\t\\[[!haiku hint=\"argument\"]]\n"
+msgstr "\t\\[[!haiku hint=\"argument\"]]\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!haiku hint=\"argument test\"]]\n"
+msgstr "[[!haiku hint=\"argument test\"]]\n"
+
+#. type: Plain text
+msgid ""
+"The hint parameter can be omitted, it only provides the generator a hint of "
+"what to write the haiku about. If no hint is given, it might base it on the "
+"page name. Since the vocabulary it knows is very small, many hints won't "
+"affect the result at all."
+msgstr ""
+"Der `hint`-Parameter kann weggelassen werden, er gibt dem Generator nur "
+"einen Hinweis, worüber er das Haiku schreiben soll. Wenn kein solcher "
+"Hinweis gegeben wird, könnte er den Seitennamen verwenden. Da das ihm "
+"bekannte Vokabular sehr klein ist, werden viele Hinweise das Ergebnis in "
+"keiner Weise beeinflussen."
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!meta robots=\"noindex, follow\"]]\n"
+msgstr "[[!meta robots=\"noindex, follow\"]]\n"
+
+
diff --git a/po/underlays/directives/ikiwiki/directive/if.de.po b/po/underlays/directives/ikiwiki/directive/if.de.po
new file mode 100644 (file)
index 0000000..337a84b
--- /dev/null
@@ -0,0 +1,145 @@
+# German translation of directives/ikiwiki/directive/if page for ikiwiki.
+# Copyright © 2010 Sebastian Kuhnert <mail@sebastian-kuhnert.de>
+# Redistribution and use in source and compiled forms, with or without
+# modification, are permitted under any circumstances. No warranty.
+msgid ""
+msgstr ""
+"POT-Creation-Date: 2010-03-12 09:29+0530\n"
+"PO-Revision-Date: 2010-03-14 14:02+0530\n"
+"Last-Translator: Sebastian Kuhnert <mail@sebastian-kuhnert.de>\n"
+"Language-Team: None\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#. type: Plain text
+msgid ""
+"The `if` directive is supplied by the [[!iki plugins/conditional "
+"desc=conditional]] plugin."
+msgstr ""
+"Die `if`-Anweisung wird durch die [[!iki plugins/conditional "
+"desc=conditional]]-Erweiterung bereitgestellt."
+
+#. type: Plain text
+msgid ""
+"With this directive, you can make text be conditionally displayed on a "
+"page.  For example:"
+msgstr ""
+"Mit dieser Anweisung kann die Anzeige von Text an bestimmte Bedingungen "
+"geknüpft werden. Zum Beispiel:"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"\t\\[[!if test=\"enabled(smiley)\"\n"
+"\t      then=\"The smiley plugin is enabled :-)\"\n"
+"\t      else=\"No smiley plugin here..\"]]\n"
+msgstr ""
+"\t\\[[!if test=\"enabled(smiley)\"\n"
+"\t      then=\"Die smiley-Erweiterung ist aktiviert :-)\"\n"
+"\t      else=\"Hier gibt es keine smiley-Erweiterung &hellip;\"]]\n"
+
+#. type: Plain text
+msgid ""
+"If the specified `test` succeeds, the `then` text will be displayed, "
+"otherwise the `else` text will be displayed. The `else` part is optional."
+msgstr ""
+"Wenn der angegebene `test` erfolgreich ist, wird der `then`-Text angezeigt, "
+"sonst der `else`-Text. Der `else`-Teil ist optional."
+
+#. type: Plain text
+msgid ""
+"The `then` and `else` values can include any markup that would be allowed in "
+"the wiki page outside the template. Triple-quoting the values even allows "
+"quotes to be included."
+msgstr ""
+"Die Werte für `then` und `else` können beliebige Formatierungsanweisungen "
+"enthalten, die außerhalb der Anweisung erlaubt wären. Werten die Werte durch "
+"dreifache Anführungszeichen abgetrennt, können sie sogar Anführungszeichen "
+"enthalten."
+
+#. type: Plain text
+msgid ""
+"The `test` is a [[ikiwiki/PageSpec]]; if it matches any page in the wiki "
+"then it succeeds. So you can do things like testing for the existence of a "
+"page or pages, testing to see if any pages were created in a given month, "
+"and so on."
+msgstr ""
+"Der `test` ist eine [[ikiwiki/PageSpec]]; wenn sie auf irgendeine Seite im "
+"Wiki passt, hat der Test Erfolg. Dadurch kann man die Existenz einer oder "
+"mehrerer Seiten überprüfen, überprüfen ob in einem bestimmten Monat Seiten "
+"angelegt wurden, und so weiter."
+
+#. type: Plain text
+msgid ""
+"If you want the [[ikiwiki/PageSpec]] to only match against the page that "
+"contains the conditional, rather than matching against all pages in the "
+"wiki, set the \"all\" parameter to \"no\"."
+msgstr ""
+"Wenn die [[ikiwiki/PageSpec]] nur auf die aktuelle Seite angewendet werden "
+"soll, die die Bedingung enthält (und nicht auf alle Seiten im Wiki), kann "
+"der optionale `all`-Parameter auf `no` gesetzt werden."
+
+#. type: Plain text
+msgid ""
+"In an `if` directive, the regular [[ikiwiki/PageSpec]] syntax is expanded "
+"with the following additional tests:"
+msgstr ""
+"In einer `if`-Anweisung sind neben der regulären [[ikiwiki/PageSpec]]-Syntax "
+"die folgenden zusätzlichen Test verfügbar:"
+
+#. type: Bullet: '* '
+msgid "enabled(plugin)"
+msgstr "enabled(plugin)"
+
+#. type: Plain text
+#, no-wrap
+msgid "  Tests whether the specified plugin is enabled.\n"
+msgstr "  Prüft, ob die angegebene Erweiterung aktiviert ist.\n"
+
+#. type: Bullet: '* '
+msgid "sourcepage(glob)"
+msgstr "sourcepage(glob)"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"  Tests whether the glob matches the name of the page that contains the\n"
+"  conditional.\n"
+msgstr ""
+"  Prüft, ob das angegebene Muster auf den Namen der Seite passt, die die\n"
+"  Bedingung enthält.\n"
+
+#. type: Bullet: '* '
+msgid "destpage(glob)"
+msgstr "destpage(glob)"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"  Tests whether the glob matches the name of the page that is being built.\n"
+"  That might be different than the name of the page that contains the\n"
+"  conditional, if it's being inlined into another page.\n"
+msgstr ""
+"  Prüft, ob das Muster auf den namen der Seite passt, die gerade erzeugt\n"
+"  wird. Dies kann ein anderer Name sein als der der Seite, die die "
+"Bedingung\n"
+"  enthält, wenn diese über [[inline]] in eine andere Seite eingebunden wird."
+"\n"
+
+#. type: Bullet: '* '
+msgid "included()"
+msgstr "included()"
+
+#. type: Plain text
+#, no-wrap
+msgid "  Tests whether the page is being included onto another page.\n"
+msgstr "  Prüft, ob die Seite gerade in eine andere eingebunden wird.\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!meta robots=\"noindex, follow\"]]\n"
+msgstr "[[!meta robots=\"noindex, follow\"]]\n"
+
+
diff --git a/po/underlays/directives/ikiwiki/directive/img.de.po b/po/underlays/directives/ikiwiki/directive/img.de.po
new file mode 100644 (file)
index 0000000..9ebdae5
--- /dev/null
@@ -0,0 +1,115 @@
+# German translation of directives/ikiwiki/directive/img page for ikiwiki.
+# Copyright © 2010 Sebastian Kuhnert <mail@sebastian-kuhnert.de>
+# Redistribution and use in source and compiled forms, with or without
+# modification, are permitted under any circumstances. No warranty.
+msgid ""
+msgstr ""
+"POT-Creation-Date: 2010-03-12 09:29+0530\n"
+"PO-Revision-Date: 2010-03-14 14:02+0530\n"
+"Last-Translator: Sebastian Kuhnert <mail@sebastian-kuhnert.de>\n"
+"Language-Team: None\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#. type: Plain text
+msgid "The `img` directive is supplied by the [[!iki plugins/img desc=img]] plugin."
+msgstr ""
+"Die `img`-Anweisung wird durch die [[!iki plugins/img desc=img]]-Erweiterung "
+"bereitgestellt."
+
+#. type: Plain text
+msgid ""
+"This is an image handling directive.  While ikiwiki supports inlining "
+"full-size images by making a [[ikiwiki/WikiLink]] that points to the image, "
+"using this directive you can easily scale down an image for inclusion onto a "
+"page, providing a link to a full-size version."
+msgstr ""
+"Diese Anweisung verarbeitet Bilder. Während ikiwiki das Einbinden von Bildern in "
+"voller Größe durch einen [[ikiwiki/WikiLink]] auf das Bild unterstützt, kann man "
+"mit dieser Anweisung ein Bild einfach herunterskalieren, um es in eine Seite "
+"einzubinden, und einen Link auf das Bild in Originalgröße setzen."
+
+#. type: Title ##
+#, no-wrap
+msgid "usage"
+msgstr "Verwendung"
+
+#. type: Plain text
+#, no-wrap
+msgid "\t\\[[!img image1.jpg size=\"200x200\" alt=\"clouds\"]]\n"
+msgstr "\t\\[[!img image1.jpeg size=\"200x200\" alt=\"Wolken\"]]\n"
+
+#. type: Plain text
+msgid ""
+"The image file will be searched for using the same rules as used to find the "
+"file pointed to by a [[ikiwiki/WikiLink]]."
+msgstr ""
+"Diese Bilddatei wird nach den gleichen Regeln gesucht wie das Ziel eines "
+"[[ikiwiki/WikiLink]]."
+
+#. type: Plain text
+msgid ""
+"The `size` parameter is optional, defaulting to full size. Note that the "
+"original image's aspect ratio is always preserved, even if this means making "
+"the image smaller than the specified size. You can also specify only the "
+"width or the height, and the other value will be calculated based on it: "
+"\"200x\", \"x200\""
+msgstr ""
+"Der Parameter `size` ist optional, voreingestellt ist die volle Größe. Das "
+"Seitenverhältnis des Originalbildes wird immer bewahrt, auch wenn das Bild "
+"dadurch kleiner wird als angegeben. Man kann auch nur die Breite oder nur die "
+"Höhe angeben, dann wird der jeweils andere Wert automatisch berechnet: `200x`, "
+"`x200`."
+
+#. type: Plain text
+msgid ""
+"You can also pass `alt`, `title`, `class`, `align` and `id` parameters.  "
+"These are passed through unchanged to the html img tag. If you include a "
+"`caption` parameter, the caption will be displayed centered beneath the "
+"image."
+msgstr ""
+"Man kann auch die Parameter `alt`, `title`, `class`, `align` und `id` übergeben. "
+"Diese werden an den img-Tag im erzeugten HTML-Code weitergereicht. Wird der "
+"Parameter `caption` angegeben, wird sein Wert unter dem Bild zentriert angezeigt."
+
+#. type: Plain text
+msgid ""
+"The `link` parameter is used to control whether the scaled image links to "
+"the full size version. By default it does; set \"link=somepage\" to link to "
+"another page instead, or \"link=no\" to disable the link, or "
+"\"link=http://url\" to link to a given url."
+msgstr ""
+"Der Parameter `link` steuert, ob herunterskalierte Bilder mit dem Originalbild "
+"verlinkt werden. In der Voreinstellung ist dies der Fall; mit `link=AndereSeite` "
+"zeigt der Link auf eine andere Seite, mit `link=no` wird der Link deaktiviert, "
+"mit `link=http://url` zeigt er auf die angegebene URL."
+
+#. type: Plain text
+msgid ""
+"You can also set default values that will be applied to all later images on "
+"the page, unless overridden. Useful when including many images on a page."
+msgstr ""
+"Man kann auch die Voreinstellung für die weiter unten auf der Seite eingebundenen "
+"Bilder verändern. Dies ist nützlich, wenn es auf einer Seite viele Bilder gibt."
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"\t\\[[!img defaults size=200x200 alt=\"wedding photo\"]]\n"
+"\t\\[[!img photo1.jpg]]\n"
+"\t\\[[!img photo2.jpg]]\n"
+"\t\\[[!img photo3.jpg size=200x600]]\n"
+msgstr ""
+"\t\\[[!img defaults size=200x200 alt=\"Hochzeitsfoto\"]]\n"
+"\t\\[[!img photo1.jpg]]\n"
+"\t\\[[!img photo2.jpg]]\n"
+"\t\\[[!img photo3.jpg size=200x600]]\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!meta robots=\"noindex, follow\"]]\n"
+msgstr "[[!meta robots=\"noindex, follow\"]]\n"
+
+
diff --git a/po/underlays/directives/ikiwiki/directive/inline.de.po b/po/underlays/directives/ikiwiki/directive/inline.de.po
new file mode 100644 (file)
index 0000000..429ea59
--- /dev/null
@@ -0,0 +1,385 @@
+# German translation of directives/ikiwiki/directive/inline page for ikiwiki.
+# Copyright © 2010 Sebastian Kuhnert <mail@sebastian-kuhnert.de>
+# Redistribution and use in source and compiled forms, with or without
+# modification, are permitted under any circumstances. No warranty.
+msgid ""
+msgstr ""
+"POT-Creation-Date: 2010-03-12 09:29+0530\n"
+"PO-Revision-Date: 2010-03-14 14:02+0530\n"
+"Last-Translator: Sebastian Kuhnert <mail@sebastian-kuhnert.de>\n"
+"Language-Team: None\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#. type: Plain text
+msgid ""
+"The `inline` directive is supplied by the [[!iki plugins/inline "
+"desc=inline]] plugin."
+msgstr ""
+"Die `inline`-Anweisung wird durch die [[!iki plugins/inline "
+"desc=inline]]-Erweiterung bereitgestellt."
+
+#. type: Plain text
+msgid ""
+"This is a directive that allows including one wiki page inside another.  The "
+"most common use of inlining is generating blogs and RSS or Atom feeds."
+msgstr ""
+"Diese Anweisung erlaubt das Einbinden einer Wiki-Seite in eine andere. Die "
+"häufigste Verwendung ist das Erzeugen von Blogs und RSS- oder Atom-Feeds."
+
+#. type: Plain text
+msgid "Example:"
+msgstr "Beispiel:"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"\t\\[[!inline pages=\"blog/* and !*/Discussion\" show=\"10\" "
+"rootpage=\"blog\"]]\n"
+msgstr ""
+"\t\\[[!inline pages=\"blog/* and !*/Discussion\" show=\"10\" "
+"rootpage=\"blog\"]]\n"
+
+#. type: Plain text
+msgid ""
+"Any pages that match the specified [[PageSpec]] (in the example, any "
+"[[SubPage]] of \"blog\") will be part of the blog, and the newest 10 of them "
+"will appear in the page. Note that if files that are not pages match the "
+"[[PageSpec]], they will be included in the feed using RSS enclosures, which "
+"is useful for podcasting."
+msgstr ""
+"Es wird jede Seite Teil des Blogs, die auf die angegebene [[PageSpec]] passt "
+"(im Beispiel jede [[Unterseite|subpage]] von \"blog\"), und die zehn neusten "
+"davon erscheinen auf der Seite. Übrigens werden Dateien, die keine Seiten sind "
+"und auf die [[PageSpec]] passen, als RSS-Einbettungen Teil des Feeds: Dies ist "
+"nützlich für Podcasts."
+
+#. type: Plain text
+msgid ""
+"The optional `rootpage` parameter tells the wiki that new posts to this blog "
+"should default to being [[SubPages|SubPage]] of \"blog\", and enables a form "
+"at the top of the blog that can be used to add new items."
+msgstr ""
+"Der optionale Parameter `rootpage` teilt dem Wiki mit, dass neue Einträge in "
+"diesem Blog [[Unterseiten|subpage]] von \"blog\" sein sollen; in diesem Fall "
+"wird ein Formular zum Hinzufügen neuer Beiträge am Anfang der Seite angezeigt."
+
+#. type: Plain text
+msgid ""
+"If you want your blog to have an archive page listing every post ever made "
+"to it, you can accomplish that like this:"
+msgstr ""
+"Wenn es zu einem Blog eine Archivseite mit allen bisherigen Einträgen geben "
+"soll, kann dies wie folgt erreicht werden:"
+
+#. type: Plain text
+#, no-wrap
+msgid "\t\\[[!inline pages=\"blog/* and !*/Discussion\" archive=\"yes\"]]\n"
+msgstr "\t\\[[!inline pages=\"blog/* and !*/Discussion\" archive=\"yes\"]]\n"
+
+#. type: Plain text
+msgid ""
+"You can even create an automatically generated list of all the pages on the "
+"wiki, with the most recently added at the top, like this:"
+msgstr ""
+"Mit dem folgenden Code kann man sogar eine automatisch erzeugte Liste mit "
+"allen Seiten des Wikis erstellen (die neuesten erscheinen oben):"
+
+#. type: Plain text
+#, no-wrap
+msgid "\t\\[[!inline pages=\"* and !*/Discussion\" archive=\"yes\"]]\n"
+msgstr "\t\\[[!inline pages=\"* and !*/Discussion\" archive=\"yes\"]]\n"
+
+#. type: Plain text
+msgid ""
+"If you want to be able to add pages to a given blog feed by tagging them, "
+"you can do that too. To tag a page, just make it link to a page or pages "
+"that represent its tags. Then use the special `link()` [[PageSpec]] to match "
+"all pages that have a given tag:"
+msgstr ""
+"Es ist auch möglich, dass Seiten durch das Hinzufügen eines Tags Teil des "
+"Blogs werden. Hierzu kann auf der betreffenden Seite einfach ein Link auf die "
+"Seite (oder die Seiten) erstellt, die die Tags repräsentieren. Dann kann die "
+"spezielle `link()`-[[PageSpec]] verwendet werden, um alle Seiten mit einem "
+"gegebenen Tag zu erfassen:"
+
+#. type: Plain text
+#, no-wrap
+msgid "\t\\[[!inline pages=\"link(life)\"]]\n"
+msgstr "\t\\[[!inline pages=\"link(life)\"]]\n"
+
+#. type: Plain text
+msgid "Or include some tags and exclude others:"
+msgstr ""
+"Es ist auch möglich, bestimmte Tags inzuschließen, während andere "
+"ausgeschlossen werden:"
+
+#. type: Plain text
+#, no-wrap
+msgid "\t\\[[!inline pages=\"link(debian) and !link(social)\"]]\n"
+msgstr "\t\\[[!inline pages=\"link(debian) and !link(social)\"]]\n"
+
+#. type: Title ##
+#, no-wrap
+msgid "usage"
+msgstr "Verwendung"
+
+#. type: Plain text
+msgid ""
+"There are many parameters you can use with the `inline` directive. These are "
+"the commonly used ones:"
+msgstr ""
+"Es gibt viele Parameter, die man mit der `inline`-Anweisung verwenden kann. "
+"Dies sind die am häufigsten benutzten:"
+
+#. type: Bullet: '* '
+msgid "`pages` - A [[PageSpec]] of the pages to inline."
+msgstr "`pages` - Eine [[PageSpec]] der einzubindenden Seiten."
+
+#. type: Bullet: '* '
+msgid ""
+"`show` - Specify the maximum number of matching pages to inline.  Default is "
+"10, unless archiving, when the default is to show all.  Set to 0 to show all "
+"matching pages."
+msgstr ""
+"`show` - Gibt die maximale Anzahl von Seiten an, die eingebunden werden sollen."
+" Voreingestellt sind 10, außer wenn archiviert wird, dass sind es alle. Ist "
+"der Wert 0, werden alle passenden Seiten angezeigt."
+
+#. type: Bullet: '* '
+msgid ""
+"`archive` - If set to \"yes\", only list page titles and some metadata, not "
+"full contents."
+msgstr ""
+"`archive` - Hat dieser Parameter den Wert `yes`, werden nur der Titel und "
+"einige Metadaten angezeigt, aber nicht der komplette Inhalt."
+
+#. type: Bullet: '* '
+msgid ""
+"`description` - Sets the description of the rss feed if one is generated.  "
+"Defaults to the name of the wiki."
+msgstr ""
+"`description` - Setzt die Beschreibung des RSS-Feeds, wenn einer erzeugt wird. "
+"Voreingestellt ist der Name des Wikis."
+
+#. type: Bullet: '* '
+msgid ""
+"`skip` - Specify a number of pages to skip displaying. Can be useful to "
+"produce a feed that only shows archived pages."
+msgstr ""
+"`skip` - Gibt die Anzahl von Seiten an, die bei der Anzeige übersprungen "
+"werden. Dies kann nützlich sein, um einen Feed zu erstellen, der nur "
+"archivierte Seiten enthält."
+
+#. type: Bullet: '* '
+msgid "`postform` - Set to \"yes\" to enable a form to post new pages to a blog."
+msgstr ""
+"`postform` - Bei dem Wert `yes`, wird ein Formular zum Erstellen neuer "
+"Einträge in dem Blog angezeigt."
+
+#. type: Bullet: '* '
+msgid "`postformtext` - Set to specify text that is displayed in a postform."
+msgstr "`postformtext` - Gibt an, welcher Text im 'postform' angezeigt wird."
+
+#. type: Bullet: '* '
+msgid ""
+"`rootpage` - Enables the postform, and allows controling where newly posted "
+"pages should go, by specifiying the page that they should be a [[SubPage]] "
+"of."
+msgstr ""
+"`rootpage` - Aktiviert `postform` und erlaubt gleichzeitig die Kontrolle "
+"darüber, wo neu erstellte Seiten landen sollen, indem eine Seite angegeben "
+"wird, deren [[Unterseite|subpage]] die neuen Seiten werden sollen."
+
+#. type: Plain text
+msgid "Here are some less often needed parameters:"
+msgstr "Hier sind einige weniger häufig benötigte Parameter:"
+
+#. type: Bullet: '* '
+msgid ""
+"`actions` - If set to \"yes\" add links to the bottom of the inlined pages "
+"for editing and discussion (if they would be shown at the top of the page "
+"itself)."
+msgstr ""
+"`actions` - Wenn `yes`, füge Links zum Bearbeiten und zur Diskussion am "
+"unteren Ende jeder eingebundenen Seite ein (wenn sie im Kopf der jeweiligen "
+"Seite angezeigt werden würden)."
+
+#. type: Bullet: '* '
+msgid ""
+"`rss` - controls generation of an rss feed. If the wiki is configured to "
+"generate rss feeds by default, set to \"no\" to disable. If the wiki is "
+"configured to `allowrss`, set to \"yes\" to enable."
+msgstr ""
+"`rss` - Steuert die Erzeugung eines RSS-Feeds. Wenn das Wiki so konfiguriert "
+"ist, dass es standardmäßig RSS-Feeds erzeugt, kann dies durch den Wert `no` "
+"verhindert werden. Wenn das Wiki RSS erlaubt (`allowrss` in der "
+"Konfigurationsdatei), dann kann der RSS-Feed mit `yes` aktiviert werden."
+
+#. type: Bullet: '* '
+msgid ""
+"`atom` - controls generation of an atom feed. If the wiki is configured to "
+"generate atom feeds by default, set to \"no\" to disable. If the wiki is "
+"configured to `allowatom`, set to \"yes\" to enable."
+msgstr ""
+"`atom` - Steuert die Erzeugung eines Atom-Feeds. Wenn das Wiki so konfiguriert "
+"ist, dass es standardmäßig Atom-Feeds erzeugt, kann dies durch den Wert `no` "
+"verhindert werden. Wenn das Wiki Atom erlaubt (`allowatom` in der "
+"Konfigurationsdatei), dann kann der Atom-Feed mit `yes` aktiviert werden."
+
+#. type: Bullet: '* '
+msgid ""
+"`feeds` - controls generation of all types of feeds. Set to \"no\" to "
+"disable generating any feeds."
+msgstr ""
+"`feeds` - Steuert die Erzeugung aller Feed-Typen. Ein Wert von `no` "
+"unterdrückt alle Feeds."
+
+#. type: Bullet: '* '
+msgid ""
+"`emptyfeeds` - Set to \"no\" to disable generation of empty feeds.  Has no "
+"effect if `rootpage` or `postform` is set."
+msgstr ""
+"`emptyfeeds` - Bei  `no` werden keine leeren Feeds erzeugt. Dies hat keine "
+"Auswirkung, wenn `rootpage` oder `postform` aktiv sind."
+
+#. type: Bullet: '* '
+msgid ""
+"`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 use some other, custom "
+"template, such as the `titlepage` template that only shows post titles or "
+"the `microblog` template, optimised for microblogging. Note that you should "
+"still set `archive=yes` if your custom template does not include the page "
+"content."
+msgstr ""
+"`template` - Gibt die Vorlage an, die für die Anzeige der einzelnen "
+"eingebundenen Seiten verwendet wird. Voreingestellt ist die "
+"`inlinepage`-Vorlage, für Archive wird `archivepage` verwendet. Es können auch "
+"andere, angepasste Vorlagen verwendet werden, etwa `titlepage` (zeigt nur die "
+"Titel der Blog-Einträge) oder `microblog` (optimiert für Microblogging). Wenn "
+"die angepasste Vorlage den Seiteninhalt nicht einbindet, kann zusätzlich "
+"`archive=yes` gesetzt werden."
+
+#. type: Bullet: '* '
+msgid ""
+"`raw` - Rather than the default behavior of creating a blog, if raw is set "
+"to \"yes\", the page will be included raw, without additional markup around "
+"it, as if it were a literal part of the source of the inlining page."
+msgstr ""
+"`raw` - Statt des voreingestellten Verhaltens, einen Blog zu erzeugen, wird "
+"bei `raw=yes` die Seite ohne zusätzliches Drumherum eingebunden, als ob sie "
+"ein Teil des Quelltextes der einbindenden Seite wäre."
+
+#. type: Bullet: '* '
+msgid ""
+"`sort` - Controls how inlined pages are [[sorted|pagespec/sorting]].  The "
+"default is to sort the newest created pages first."
+msgstr ""
+"`sort` - Steuert wie die eingebundenen Seiten [[sortiert|pagespec/sorting]] "
+"werden. In der Voreinstellung kommen die zuletzt angelegten Seiten zuerst."
+
+#. type: Bullet: '* '
+msgid "`reverse` - If set to \"yes\", causes the sort order to be reversed."
+msgstr "`reverse` - Bei `yes` wird die Sortierung umgekehrt."
+
+#. type: Bullet: '* '
+msgid ""
+"`feedshow` - Specify the maximum number of matching pages to include in the "
+"rss/atom feeds. The default is the same as the `show` value above."
+msgstr ""
+"`feedshow` - Gibt an, wie viele Seiten höchstens in den RSS- und Atom-Feeds "
+"eingebunden werden. Voreingestellt ist der Wert von `show`."
+
+#. type: Bullet: '* '
+msgid ""
+"`feedonly` - Only generate the feed, do not display the pages inline on the "
+"page."
+msgstr ""
+"`feedonly` - Erzeuge nur den Feed, zeige die Seiten nicht eingebettet auf der "
+"Seite an."
+
+#. type: Bullet: '* '
+msgid ""
+"`quick` - Build archives in quick mode, without reading page contents for "
+"metadata. This also turns off generation of any feeds."
+msgstr ""
+"`quick` - Erzeuge Archive im Schnelldurchlauf, ohne im Seiteninhalt nach "
+"Metadaten zu suchen. Dies deaktiviert auch das Erzeugen von Feeds."
+
+#. type: Bullet: '* '
+msgid ""
+"`timeformat` - Use this to specify how to display the time or date for pages "
+"in the blog. The format string is passed to the strftime(3) function."
+msgstr ""
+"`timeformat` - Hiermit kann gesteuert werden, wie die Zeit oder das Datum der "
+"Blogeinträge dargestellt wird. Der Wert wird an die Funktion strftime(3) "
+"weitergereicht."
+
+#. type: Bullet: '* '
+msgid ""
+"`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 "
+"matched by that value are included, but some of those can be excluded by "
+"specifying a tighter [[PageSpec]] here."
+msgstr ""
+"`feedpages` - Eine [[PageSpec]] mit Seiten, die im RSS- bzw. Atom-Feed "
+"auftachen sollen. Voreingestellt ist der Wert von `pages`, und nur Seiten die "
+"darauf passen werden eingebunden, aber einige davon können ausgeschlossen "
+"werden, indem hier eine striktere [[PageSpec]] angegeben wird."
+
+#. type: Bullet: '* '
+msgid ""
+"`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."
+msgstr ""
+"`guid` - Wenn hier eine URI angegeben wird (möglicherweise eine UUID mit "
+"Präfix `urn:uuid:`), dann hat der Atom-Feed diese als seine `<id>`. "
+"Voreingestellt ist der Name der Seite, die die inline-Anweisung enthält."
+
+#. type: Bullet: '* '
+msgid ""
+"`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`."
+msgstr ""
+"`feedfile` - Hiermit kann der Name der Datei verändert werden, die für den "
+"Feed erzeugt wird. Dies ist insbesondere dann nützlich, wenn eine Seite "
+"mehrere Feeds enthält. Zum Beispiel kann man `feedfile=feed` setzen, um "
+"`page/feed.atom` und/oder `page/feed.rss` zu erzeugen. Diese Option ist nicht "
+"verfügbar, wenn das Wiki die Option `usedirs` nicht verwendet."
+
+#. type: Bullet: '* '
+msgid ""
+"`pagenames` - If given instead of `pages`, this is interpreted as a "
+"space-separated list of links to pages (with the same "
+"[[SubPage/LinkingRules]] as in a [[ikiwiki/WikiLink]]), and they are inlined "
+"in exactly the order given: the `sort` and `pages` parameters cannot be used "
+"in conjunction with this one."
+msgstr ""
+"`pagenames` - Kann anstelle von `pages` angegeben werden und wird als "
+"Leerzeichen-separierte Liste von Links zu Seiten interpretiert (mit den "
+"gleichen [[Verlinkungsregeln|SubPage/LinkingRules]] wie in einem "
+"[[ikiwiki/WikiLink]]), und werden dann genau in der angegebenen Reihenfolge "
+"eingebunden. Die Parameter `sort` und `pages` können nicht in Kombination mit "
+"diesem verwendet werden."
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!meta robots=\"noindex, follow\"]]\n"
+msgstr "[[!meta robots=\"noindex, follow\"]]\n"
+
+#. type: Plain text
+msgid ""
+"A related directive is the [[ikiwiki/directive/edittemplate]] directive, "
+"which allows default text for a new page to be specified."
+msgstr ""
+"Eine verwandte Anweisung ist die [[ikiwiki/directive/edittemplate]]-Anweisung, "
+"mit der für eine neue Seite ein voreingestellter Text angegeben werden kann."
+
+
diff --git a/po/underlays/directives/ikiwiki/directive/linkmap.de.po b/po/underlays/directives/ikiwiki/directive/linkmap.de.po
new file mode 100644 (file)
index 0000000..e06368e
--- /dev/null
@@ -0,0 +1,99 @@
+# German translation of directives/ikiwiki/directive/linkmap page for ikiwiki.
+# Copyright © 2010 Sebastian Kuhnert <mail@sebastian-kuhnert.de>
+# Redistribution and use in source and compiled forms, with or without
+# modification, are permitted under any circumstances. No warranty.
+msgid ""
+msgstr ""
+"POT-Creation-Date: 2010-03-12 09:29+0530\n"
+"PO-Revision-Date: 2010-03-14 14:03+0530\n"
+"Last-Translator: Sebastian Kuhnert <mail@sebastian-kuhnert.de>\n"
+"Language-Team: None\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#. type: Plain text
+msgid ""
+"The `linkmap` directive is supplied by the [[!iki plugins/linkmap "
+"desc=linkmap]] plugin."
+msgstr ""
+"Die `linkmap`-Anweisung wird durch die [[!iki plugins/linkmap "
+"desc=linkmap]]-Erweiterung bereitgestellt."
+
+#. type: Plain text
+msgid ""
+"This directive uses [graphviz](http://www.graphviz.org/) to generate a graph "
+"showing the links between a set of pages in the wiki. Example usage:"
+msgstr ""
+"Diese Anweisung verwendet [graphviz](http://www.graphviz.org/), um einen "
+"Graph mit den Links zwischen den Seiten im Wiki zu erstellen. Beispiel:"
+
+#. type: Plain text
+#, no-wrap
+msgid "\t\\[[!linkmap pages=\"* and !blog/* and !*/Discussion\"]]\n"
+msgstr "\t\\[[!linkmap pages=\"* and !blog/* and !*/Discussion\"]]\n"
+
+#. type: Plain text
+msgid ""
+"Only links between mapped pages will be shown; links pointing to or from "
+"unmapped pages will be omitted. If the pages to include are not specified, "
+"the links between all pages (and other files) in the wiki are mapped."
+msgstr ""
+"Nur Links zwischen den angegebenen Seiten werden angezeigt; Links die auf "
+"andere Seiten zeigen werden ausgelassen. Wenn die einzuschließenden Seiten "
+"nicht angegeben werden, werden Links zwischen allen Seiten (und anderen "
+"Dateien) im Wiki angezeigt."
+
+#. type: Plain text
+msgid ""
+"Here are descriptions of all the supported parameters to the `linkmap` "
+"directive:"
+msgstr ""
+"Hier die Beschreibung aller unterstützter Parameter der `linkmap`-Anweisung:"
+
+#. type: Bullet: '* '
+msgid "`pages` - A [[ikiwiki/PageSpec]] of the pages to map."
+msgstr "`pages` - Eine [[ikiwiki/PageSpec]] der darzustellenden Seiten."
+
+#. type: Bullet: '* '
+msgid ""
+"`height`, `width` - Limit the size of the map to a given height and width, "
+"in inches. Both must be specified for the limiting to take effect, otherwise "
+"the map's size is not limited."
+msgstr ""
+"`height`, `width` - Begrenzt die Größe der erzeugten Graphik auf die (in "
+"Inch) angegebene Breite und Höne. Beide müssen angegeben werden, damit die "
+"Beschränkung wirksam wird."
+
+#. type: Bullet: '* '
+msgid ""
+"`connected` - Controls whether to include pages on the map that link to no "
+"other pages (connected=no, the default), or to only show pages that link to "
+"others (connected=yes)."
+msgstr ""
+"`connected` - Steuert ob auch Seiten dargestellt werden, die keinen Link zu "
+"anderen Seiten enthalten (`connected=no`, die Voreinstellung), oder ob nur "
+"Seiten angezeigt werden, die auf andere verlinken (`connected=yes`)."
+
+#. type: Plain text
+msgid ""
+"For best results, only a small set of pages should be mapped, since "
+"otherwise the map can become very large, unwieldy, and complicated.  If too "
+"many pages are included, the map may get so large that graphviz cannot "
+"render it. Using the `connected` parameter is a good way to prune out pages "
+"that clutter the map."
+msgstr ""
+"Um die besten Ergebnisse zu erzielen, sollte nur eine kleine Teilmenge der "
+"Seiten angegeben werden, da die erzeugte Karte sonst groß, unhandlich und "
+"kompliziert wird. Wenn zu viele Seiten angegeben werden, kann die Karte zu "
+"kompliziert werden, als dass graphviz sie noch rendern könnte. Der Parameter "
+"`connected` ist ein guter Weg Seiten loszuwerden, die die Karte "
+"unübersichtlich machen."
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!meta robots=\"noindex, follow\"]]\n"
+msgstr "[[!meta robots=\"noindex, follow\"]]\n"
+
+
diff --git a/po/underlays/directives/ikiwiki/directive/listdirectives.de.po b/po/underlays/directives/ikiwiki/directive/listdirectives.de.po
new file mode 100644 (file)
index 0000000..2c92058
--- /dev/null
@@ -0,0 +1,72 @@
+# German translation of directives/ikiwiki/directive/listdirectives page for ikiwiki.
+# Copyright © 2010 Sebastian Kuhnert <mail@sebastian-kuhnert.de>
+# Redistribution and use in source and compiled forms, with or without
+# modification, are permitted under any circumstances. No warranty.
+msgid ""
+msgstr ""
+"POT-Creation-Date: 2010-03-12 09:29+0530\n"
+"PO-Revision-Date: 2010-03-14 14:03+0530\n"
+"Last-Translator: Sebastian Kuhnert <mail@sebastian-kuhnert.de>\n"
+"Language-Team: None\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#. type: Plain text
+msgid ""
+"The `listdirectives` directive is supplied by the [[!iki "
+"plugins/listdirectives desc=listdirectives]] plugin."
+msgstr ""
+"Die `listdirectives`-Anweisung wird durch die [[!iki "
+"plugins/listdirectives desc=listdirectives]]-Erweiterung bereitgestellt."
+
+#. type: Plain text
+msgid ""
+"This directive generates a list of available "
+"[[directives|ikiwiki/directive]]."
+msgstr ""
+"Diese Anweisung erzeugt eine Liste der verfügbaren "
+"[[Anweisungen|ikiwiki/directives]]."
+
+#. type: Plain text
+#, no-wrap
+msgid "\t\\[[!listdirectives]]\n"
+msgstr "\t\\[[!listdirectives]]\n"
+
+#. type: Plain text
+msgid ""
+"There is one optional keyword argument, `generated`.  Normally the "
+"`listdirectives` directive will list all built in directives and directives "
+"directly registered by plugins.  With this keyword, `listdirectives` will "
+"also list directives generated later.  For example, all [[shortcuts]] are "
+"directives generated in turn by the `shortcut` directive.  They will only be "
+"listed if the `generated` argument is supplied."
+msgstr ""
+"Es gibt nur ein optionales Argument, `generated`. Normalerweise zeigt die "
+"`listdirectives`-Anweisung alle eingebauten und alle durch eine Erweiterung "
+"registrierten Anweisungen an. Mit diesem Schlüsselwort zeigt "
+"`listdirectives` auch Anweisungen an, die erst später erzeugt wurden. Zum "
+"Beispiel werden alle [[Abkürzungen|shortcuts]] durch die "
+"`shortcut`-Anweisung erzeugt und werden nur aufgelistet, wenn das Argument "
+"`generated` angegeben wird."
+
+#. type: Plain text
+#, no-wrap
+msgid "    \\[[!listdirectives generated]]\n"
+msgstr "    \\[[!listdirectives generated]]\n"
+
+#. type: Plain text
+msgid ""
+"This extended list is often quite long, and often contains many undocumented "
+"directives."
+msgstr ""
+"Diese erweiterte Liste ist oft ziemlich lang und enthält oft viele "
+"undokumentierte Anweisungen."
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!meta robots=\"noindex, follow\"]]\n"
+msgstr "[[!meta robots=\"noindex, follow\"]]\n"
+
+
diff --git a/po/underlays/directives/ikiwiki/directive/map.de.po b/po/underlays/directives/ikiwiki/directive/map.de.po
new file mode 100644 (file)
index 0000000..f095982
--- /dev/null
@@ -0,0 +1,77 @@
+# German translation of directives/ikiwiki/directive/map page for ikiwiki.
+# Copyright © 2010 Sebastian Kuhnert <mail@sebastian-kuhnert.de>
+# Redistribution and use in source and compiled forms, with or without
+# modification, are permitted under any circumstances. No warranty.
+msgid ""
+msgstr ""
+"POT-Creation-Date: 2010-03-12 09:29+0530\n"
+"PO-Revision-Date: 2010-03-14 14:03+0530\n"
+"Last-Translator: Sebastian Kuhnert <mail@sebastian-kuhnert.de>\n"
+"Language-Team: None\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#. type: Plain text
+msgid "The `map` directive is supplied by the [[!iki plugins/map desc=map]] plugin."
+msgstr ""
+"Die `map`-Anweisung wird durch die [[!iki plugins/map desc=map]]-Erweiterung "
+"bereitgestellt."
+
+#. type: Plain text
+msgid ""
+"This directive generates a hierarchical page map for the wiki. Example "
+"usage:"
+msgstr ""
+"Diese Anweisung erzeugt eine hierarchische Liste der Seiten im Wiki. Beispiel für "
+"die Verwendung:"
+
+#. type: Plain text
+#, no-wrap
+msgid "\t\\[[!map pages=\"* and !blog/* and !*/Discussion\"]]\n"
+msgstr "\t\\[[!map pages=\"* and !blog/* and !*/Discussion\"]]\n"
+
+#. type: Plain text
+msgid ""
+"If the pages to include are not specified, all pages (and other files) in "
+"the wiki are mapped."
+msgstr ""
+"Wenn die anzuzeigenden Seiten nicht angegeben werden, kommen alle Seiten (und "
+"andere Dateien) in die Liste."
+
+#. type: Plain text
+msgid ""
+"By default, the names of pages are shown in the map. The `show` parameter "
+"can be used to show the titles or descriptions of pages instead (as set by "
+"the [[meta]] directive). For example:"
+msgstr ""
+"In der Voreinstellung werden in der Liste die Namen der Seiten angezeigt. Mit dem "
+"Parameter `show` können stattdessen der Titel (`title`) oder die Beschreibung "
+"(`description`) verwendet werden, die mit der [[meta]]-Anweisung gesetzt wurden. "
+"Zum Beispiel:"
+
+#. type: Plain text
+#, no-wrap
+msgid "\t\\[[!map pages=\"* and !blog/* and !*/Discussion\" show=title]]\n"
+msgstr "\t\\[[!map pages=\"* and !blog/* and !*/Discussion\" show=title]]\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "\t\\[[!map pages=\"* and !blog/* and !*/Discussion\" show=description]]\n"
+msgstr "\t\\[[!map pages=\"* and !blog/* and !*/Discussion\" show=description]]\n"
+
+#. type: Plain text
+msgid ""
+"Hint: To limit the map to displaying pages less than a certain level deep, "
+"use a [[ikiwiki/PageSpec]] like this: `pages=\"* and !*/*/*\"`"
+msgstr ""
+"Tipp: Um nur Seiten bis zu einer bestimmten Ebene anzuzeigen, kann eine "
+"[[ikiwiki/PageSpec]] wie `pages=\"* and !*/*/*\"` verwendet werden."
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!meta robots=\"noindex, follow\"]]\n"
+msgstr "[[!meta robots=\"noindex, follow\"]]\n"
+
+
diff --git a/po/underlays/directives/ikiwiki/directive/meta.de.po b/po/underlays/directives/ikiwiki/directive/meta.de.po
new file mode 100644 (file)
index 0000000..47415c3
--- /dev/null
@@ -0,0 +1,455 @@
+# German translation of directives/ikiwiki/directive/meta page for ikiwiki.
+# Copyright © 2010 Sebastian Kuhnert <mail@sebastian-kuhnert.de>
+# Redistribution and use in source and compiled forms, with or without
+# modification, are permitted under any circumstances. No warranty.
+msgid ""
+msgstr ""
+"POT-Creation-Date: 2010-03-12 09:29+0530\n"
+"PO-Revision-Date: 2010-03-14 14:04+0530\n"
+"Last-Translator: Sebastian Kuhnert <mail@sebastian-kuhnert.de>\n"
+"Language-Team: None\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#. type: Plain text
+msgid ""
+"The `meta` directive is supplied by the [[!iki plugins/meta desc=meta]] "
+"plugin."
+msgstr ""
+"Die `meta`-Anweisung wird durch die [[!iki plugins/meta desc=meta]]-Erweiterung "
+"bereitgestellt."
+
+#. type: Plain text
+msgid ""
+"This directive allows inserting arbitrary metadata into the source of a "
+"page.  Enter the metadata as follows:"
+msgstr ""
+"Diese Anweisung erlaubt es, beliebige Metadaten in den Quelltext einer Seite "
+"einzufügen. Dies geschieht wie folgt:"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"\t\\[[!meta field=\"value\"]]\n"
+"\t\\[[!meta field=\"value\" param=\"value\" param=\"value\"]]\n"
+msgstr ""
+"\t\\[[!meta field=\"value\"]]\n"
+"\t\\[[!meta field=\"value\" param=\"value\" param=\"value\"]]\n"
+
+#. type: Plain text
+msgid ""
+"The first form sets a given field to a given value, while the second form "
+"also specifies some additional sub-parameters."
+msgstr ""
+"In der ersten Form wird das angegebene Feld auf den angegebenen Wert gesetzt. In "
+"der zweiten Form werden zusätzlich einige Unter-Parameter angegeben."
+
+#. type: Plain text
+msgid ""
+"The field values are treated as HTML entity-escaped text, so you can include "
+"a quote in the text by writing `&quot;` and so on."
+msgstr ""
+"Die Feldwerte können HTML-Entities enthalten, zum Beispiel kann durch `&quot;` "
+"ein Anführungszeichen eingefügt werden."
+
+#. type: Plain text
+msgid "Supported fields:"
+msgstr "Unterstützte Felder:"
+
+#. type: Bullet: '* '
+msgid "title"
+msgstr "`title` "
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"  Overrides the title of the page, which is generally the same as the\n"
+"  page name.\n"
+msgstr ""
+"  Überschreibt den Titel der Seite, der normalerweise dem Namen\n"
+"  der Seite entspricht."
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"  Note that if the title is overridden, a \"title_overridden\" variable "
+"will\n"
+"  be set to a true value in the template; this can be used to format "
+"things\n"
+"  differently in this case.\n"
+msgstr ""
+"  Wenn der Titel so überschrieben wird, wird die Template-Variable\n"
+"  `title_overridden` auf wahr gesetzt. Eine Vorlage kann in diesem\n"
+"  Fall eine andere Darstellung wählen.\n"
+
+#. type: Bullet: '* '
+msgid "license"
+msgstr "`license`"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"  Specifies a license for the page, for example, \"GPL\". Can contain\n"
+"  WikiLinks and arbitrary markup.\n"
+msgstr ""
+"  Gibt eine Lizenz für die Seite an, etwa `GPL`. Kann WikiLinks und\n"
+"  beliebige Formatierungsanweisungen enhalten.\n"
+
+#. type: Bullet: '* '
+msgid "copyright"
+msgstr "`copyright`"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"  Specifies the copyright of the page, for example, \"Copyright 2007 by\n"
+"  Joey Hess\". Can contain WikiLinks and arbitrary markup.\n"
+msgstr ""
+"  Gibt die Urheberrechte der Seite an, zum Beispiel `Copyright 2007\n"
+"  by Joey Hess`. Kann WikiLinks und beliebige\n"
+"  Formatierungsanweisungen enhalten.\n"
+
+#. type: Bullet: '* '
+msgid "author"
+msgstr "`author`"
+
+#. type: Plain text
+#, no-wrap
+msgid "  Specifies the author of a page.\n"
+msgstr "  Gibt den Autor der Seite an.\n"
+
+#. type: Bullet: '* '
+msgid "authorurl"
+msgstr "`authorurl`"
+
+#. type: Plain text
+#, no-wrap
+msgid "  Specifies an url for the author of a page.\n"
+msgstr "  Gibt eine URL für den Autor der Seite an.\n"
+
+#. type: Bullet: '* '
+msgid "description"
+msgstr "`description`"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"  Specifies a short description for the page. This will be put in\n"
+"  the html header, and can also be displayed by eg, the [[map]] directive.\n"
+msgstr ""
+"  Gibt eine kurze Beschreibung der Seite an. Diese wird im\n"
+"  HTML-Header angegeben und kann zum Beispiel auch durch die\n"
+"  [[map]]-Anweisung ausgegeben werden.\n"
+
+#. type: Bullet: '* '
+msgid "permalink"
+msgstr "`permalink`"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"  Specifies a permanent link to the page, if different than the page\n"
+"  generated by ikiwiki.\n"
+msgstr ""
+"  Gibt einen dauerhaften Link zu der Seite an, wenn dieser anders ist\n"
+"  als die von ikiwiki generierte Seite.\n"
+
+#. type: Bullet: '* '
+msgid "date"
+msgstr "`date`"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"  Specifies the creation date of the page. The date can be entered in\n"
+"  nearly any format, since it's parsed by [[!cpan TimeDate]].\n"
+msgstr ""
+"  Gibt das Erstellungsdatum der Seite an. Das Datum kann in\n"
+"  nahezu beliebigem Format angegeben werden, da es durch\n"
+"  [[!cpan TimeDate]] interpretiert wird.\n"
+
+#. type: Bullet: '* '
+msgid "stylesheet"
+msgstr "`stylesheet`"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"  Adds a stylesheet to a page. The stylesheet is treated as a wiki link to\n"
+"  a `.css` file in the wiki, so it cannot be used to add links to external\n"
+"  stylesheets. Example:\n"
+msgstr ""
+"  Fügt ein Stylesheet zu der Seite hinzu. Der angegebene Name wird als\n"
+"  WikiLink zu einer `.css`-Datei im Wiki behandelt, es können also keine\n"
+"  externen Stylesheets eingebunden werden. Beispiel:\n"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"\t\\[[!meta stylesheet=somestyle rel=\"alternate stylesheet\"\n"
+"\ttitle=\"somestyle\"]]\n"
+msgstr ""
+"\t\\[[!meta stylesheet=somestyle rel=\"alternate stylesheet\"\n"
+"\ttitle=\"somestyle\"]]\n"
+
+#. type: Bullet: '* '
+msgid "openid"
+msgstr "`openid`"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"  Adds html &lt;link&gt; tags to perform OpenID delegation to an external\n"
+"  OpenID server. This lets you use an ikiwiki page as your OpenID.\n"
+msgstr ""
+"  Fügt die nötigen &lt;link&gt;-Tags für die Weiterleitung an einen externen\n"
+"  OpenID-Server ein. Dadurch kann eine ikiwiki-Seite als OpenID\n"
+"  verwendet werden.\n"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"  By default this will delegate for both `openid` and `openid2`. To only\n"
+"  delegate for one, add a parameter such as `delegate=openid`.\n"
+msgstr ""
+"  Standardmäßig werden sowohl `openid` als auch `openid2`\n"
+"  weitergeleitet. Um nur eines davon weiterzuleiten, kann ein\n"
+"  Parameter wie `delegate=openid` verwendet werden.\n"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"  An optional `xrds-location`\n"
+"  parameter lets you specify the location of any [eXtensible Resource\n"
+"  DescriptorS](http://www.windley.com/archives/2007/05/using_xrds.shtml).\n"
+msgstr ""
+"  Der optionale Parameter `xrds-location` erlaubt es, den Ort eines\n"
+"  [eXtensible Resource\n"
+"  DescriptorS](http://www.windley.com/archives/2007/05/using_xrds.shtml)\n"
+"  anzugeben.\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "  Example:\n"
+msgstr "  Beispiel:\n"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"\t\\\\[[!meta openid=\"http://joeyh.myopenid.com/\"\n"
+"\tserver=\"http://www.myopenid.com/server\"\n"
+"\txrds-location=\"http://www.myopenid.com/xrds?username=joeyh.myopenid.com\"\"]]\n"
+msgstr ""
+"\t\\\\[[!meta openid=\"http://joeyh.myopenid.com/\"\n"
+"\tserver=\"http://www.myopenid.com/server\"\n"
+"\txrds-location=\"http://www.myopenid.com/xrds?username=joeyh.myopenid.com\"\"]]\n"
+
+#. type: Bullet: '* '
+msgid "link"
+msgstr "`link`"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"  Specifies a link to another page. This can be used as a way to make the\n"
+"  wiki treat one page as linking to another without displaying a "
+"user-visible\n"
+"  [[ikiwiki/WikiLink]]:\n"
+msgstr ""
+"  Gibt einen Link zu einer anderen Seite an. Auf diese Weise kann das Wiki\n"
+"  dazu gebracht werden, eine Seite so zu behandeln, als ob sie einen Link\n"
+"  auf eine andere enthält, ohne dass die Benutzer einen [[ikiwiki/WikiLink]]\n"
+"  zu Gesicht bekommen:\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "       \\[[!meta link=otherpage]]\n"
+msgstr "       \\[[!meta link=andereseite]]\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "  It can also be used to insert a html &lt;link&gt; tag. For example:\n"
+msgstr ""
+"  Es kann auch ein HTML &lt;link&gt;-Tag eingefügt werden, zum\n"
+"  Beispiel:\n"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"       \\[[!meta link=\"http://joeyh.myopenid.com/\" "
+"rel=\"openid.delegate\"]]\n"
+msgstr ""
+"       \\[[!meta link=\"http://joeyh.myopenid.com/\" "
+"rel=\"openid.delegate\"]]\n"
+
+#. type: Plain text
+#:
+#, no-wrap
+msgid ""
+"  However, this latter syntax won't be allowed if the \n"
+"  [[!iki plugins/htmlscrubber desc=htmlscrubber]] plugin is enabled, since "
+"it can be used to\n"
+"  insert unsafe content.\n"
+msgstr ""
+"  Allerdings ist diese zweite Syntax nicht erlaubt, wenn die\n"
+"  [[!iki plugins/htmlscrubber desc=htmlscrubber]]-Erweiterung aktiviert ist,\n"
+"  weil auf diese Weise unsichere Inhalte eingefügt werden können.\n"
+
+#. type: Bullet: '* '
+msgid "redir"
+msgstr "`redir`"
+
+#. type: Plain text
+#, no-wrap
+msgid "  Causes the page to redirect to another page in the wiki.\n"
+msgstr "  Lässt die Seite auf eine andere Seite im Wiki weiterleiten.\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "  \t\\[[!meta redir=otherpage]]\n"
+msgstr "  \t\\[[!meta redir=andereseite]]\n"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"  Optionally, a delay (in seconds) can be specified. The default is to\n"
+"  redirect without delay.\n"
+msgstr ""
+"  Es kann optional eine Verzögerung (`delay=seconds`) angegeben\n"
+"  werden. Voreingestellt ist, ohne Verzögerung weiterzuleiten.\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "  It can also be used to redirect to an external url. For example:\n"
+msgstr ""
+"  Es kann auch auf eine externe URL weitergeleitet werden. Zum\n"
+"  Beispiel:\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "  \t\\[[!meta redir=\"http://example.com/\"]]\n"
+msgstr "  \t\\[[!meta redir=\"http://beispiel.de/\"]]\n"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"  For both cases, an anchor to jump to inside the destination page may also "
+"be\n"
+"  specified using the common `#ANCHOR` syntax.\n"
+msgstr ""
+"  In beiden Fällen kann ein anzuspringender Anker auf der Zielseite\n"
+"  angegeben werden, indem die übliche `#ANKER`-Syntax verwendet wird.\n "
+
+#. type: Bullet: '* '
+msgid "robots"
+msgstr "`robots`"
+
+#. type: Plain text
+#, no-wrap
+msgid "  Causes the robots meta tag to be written:\n"
+msgstr "  Schreibt den robots-Meta-Tag:\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "        \\[[!meta robots=\"index, nofollow\"]]\n"
+msgstr "        \\[[!meta robots=\"index, nofollow\"]]\n"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"  Valid values for the attribute are: \"index\", \"noindex\", \"follow\", "
+"and\n"
+"  \"nofollow\". Multiple comma-separated values are allowed, but obviously "
+"only\n"
+"  some combinations make sense. If there is no robots meta tag, \"index,\n"
+"  follow\" is used as the default.\n"
+msgstr ""
+"  Zulässige Werte sind `index`, `noindex`, `follow` und `nofollow`. Es\n"
+"  können mehrere Werte durch Kommas getrennt angegeben werden, aber\n"
+"  offensichtlich ergeben nur einige Kombinationen Sinn. Wenn der\n"
+"  robots-Meta-Tag nicht explizit angegeben wird, wird als Voreinstellung\n"
+"  \"index,follow\" angenommen.\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "  The value is escaped, but its contents are not otherwise checked.\n"
+msgstr "  Der Wert wird nicht auf Zulässigkeit geprüft.\n"
+
+#. type: Bullet: '* '
+msgid "guid"
+msgstr "`guid`"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"  Specifies a globally unique ID for a page. This guid should be a URI\n"
+"  (in particular, it can be `urn:uuid:` followed by a UUID, as per\n"
+"  [[!rfc 4122]]), and it will be used to identify the page's entry in RSS\n"
+"  and Atom feeds. If not given, the default is to use the page's URL as "
+"its\n"
+"  guid.\n"
+msgstr ""
+"  Gibt eine global einmalige ID für die Seite an. Diese guid sollte eine\n"
+"  URI sein (insbesondere kann sie nach [[!rfc 4122]] `urn:uuid:`\n"
+"  gefolgt von einer UUID sein). Sie wird verwendet, um den Eintrag der\n"
+"  Seite in RSS- und Atom-Feeds zu identifizieren. Wird keine guid\n"
+"  angegeben, wird an dieser Stelle die URL der Seite verwendet.\n"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"  This is mostly useful when a page has moved, to keep the guids for\n"
+"  pages unchanged and avoid_flooding_aggregators\n"
+"  (see [[!iki tips/howto_avoid_flooding_aggregators]]).\n"
+msgstr ""
+"  Diese Angabe ist in erster Linie dann nützlich, wenn eine Seite\n"
+"  verschoben wurde: Indem die guids unverändert gelassen werden,\n"
+"  kann das Fluten von Aggregatoren vermieden werden (siehe\n"
+"  [[!iki tips/howto_avoid_flooding_aggregators]]).\n"
+
+#. type: Bullet: '* '
+msgid "updated"
+msgstr "`updated`"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"  Specifies a fake modification time for a page, to be output into RSS and\n"
+"  Atom feeds. This is useful to avoid flooding aggregators that sort by\n"
+"  modification time, like Planet: for instance, when editing an old blog "
+"post\n"
+"  to add tags, you could set `updated` to be one second later than the "
+"original\n"
+"  value. The date/time can be given in any format that\n"
+"  [[!cpan TimeDate]] can understand, just like the `date` field.\n"
+msgstr ""
+"  Gibt eine gefälschte Änderungszeit für die Seite an, die dann von RSS-\n"
+"  und Atom-Feeds ausgegeben wird. Dies ist nützlich, um Aggregatoren\n"
+"  nicht zu fluten, die nach Änderungszeit sortieren, wie etwa Planet:\n"
+"  Wenn man zum Beispiel einen alten Blog-Eintrag bearbeitet (etwa um\n"
+"  Tags hinzuzufügen), kann man `updated` auf eine Sekunde später als\n"
+"  den ursprünglichen Wert setzen. Das Datum mit Uhrzeit kann in jedem\n"
+"  Format angegeben werden, das von [[!cpan TimeDate]] verstanden\n"
+"  wird, genauso wie im Feld `date`.\n"
+
+#. type: Plain text
+msgid ""
+"If the field is not one of the above predefined fields, the metadata will be "
+"written to the generated html page as a &lt;meta&gt; header. However, this "
+"won't be allowed if the [[!iki plugins/htmlscrubber desc=htmlscrubber]] "
+"plugin is enabled, since it can be used to insert unsafe content."
+msgstr ""
+"Wenn das Feld nicht eines der oben vordefinierten ist, werden die Metadaten als "
+"&lt;meta&gt;-Header in die generierte Seite geschrieben. Dies ist allerdings "
+"nicht erlaubt, wenn die [[!iki plugins/htmlscrubber "
+"desc=htmlscrubber]]-Erweiterung aktiv ist, da auf diese Weise unsichere Inhalte "
+"eingefügt werden können."
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!meta robots=\"noindex, follow\"]]\n"
+msgstr "[[!meta robots=\"noindex, follow\"]]\n"
+
+
diff --git a/po/underlays/directives/ikiwiki/directive/more.de.po b/po/underlays/directives/ikiwiki/directive/more.de.po
new file mode 100644 (file)
index 0000000..6561504
--- /dev/null
@@ -0,0 +1,63 @@
+# German translation of directives/ikiwiki/directive/more page for ikiwiki.
+# Copyright © 2010 Sebastian Kuhnert <mail@sebastian-kuhnert.de>
+# Redistribution and use in source and compiled forms, with or without
+# modification, are permitted under any circumstances. No warranty.
+msgid ""
+msgstr ""
+"POT-Creation-Date: 2010-03-12 09:29+0530\n"
+"PO-Revision-Date: 2010-03-14 14:04+0530\n"
+"Last-Translator: Sebastian Kuhnert <mail@sebastian-kuhnert.de>\n"
+"Language-Team: None\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#. type: Plain text
+msgid ""
+"The `more` directive is supplied by the [[!iki plugins/more desc=more]] "
+"plugin."
+msgstr ""
+"Die `more`-Anweisung wird durch die [[!iki plugins/more desc=more]]-Erweiterung "
+"bereitgestellt."
+
+#. type: Plain text
+msgid ""
+"This directive provides a way to have a \"more\" link on a post in a blog, "
+"that leads to the full version of the page. Use it like this:"
+msgstr ""
+"Diese Anweise stellt eine Möglichkeit zur Verfügung, einen \"mehr\"-Link in "
+"einem Blogeintrag anzuzeigen, der zur kompletten Version der Seite führt. "
+"Benutzt wird sie folgendermaßen:"
+
+#. type: Plain text
+#, no-wrap
+msgid "\t\\[[!more linktext=\"click for more\" text=\"\"\"\n"
+msgstr "\t\\[[!more linktext=\"mehr &hellip;\" text=\"\"\"\n"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"\tThis is the rest of my post. Not intended for people catching up on\n"
+"\ttheir blogs at 30,000 feet. Because I like to make things\n"
+"\tdifficult.\n"
+msgstr ""
+"\tDies ist der Rest meines Blog-Eintrags. Er ist nicht für Leute\n"
+"\tgedacht, die auf 10000m Blogs lesen, weil ich es gerne kompliziert\n"
+"\tmache.\n"
+
+#. type: Plain text
+msgid "If the `linktext` parameter is omitted it defaults to just \"more\"."
+msgstr ""
+"Wenn der Parameter `linktext` weggelassen wird, wird einfach \"more\" angezeigt."
+
+#. type: Plain text
+msgid "Note that you can accomplish something similar using a [[toggle]] instead."
+msgstr "Etwas ähnliches kann auch mit einem [[toggle]] erreicht werden."
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!meta robots=\"noindex, follow\"]]\n"
+msgstr "[[!meta robots=\"noindex, follow\"]]\n"
+
+
diff --git a/po/underlays/directives/ikiwiki/directive/orphans.de.po b/po/underlays/directives/ikiwiki/directive/orphans.de.po
new file mode 100644 (file)
index 0000000..aeaebdf
--- /dev/null
@@ -0,0 +1,60 @@
+# German translation of directives/ikiwiki/directive/orphans page for ikiwiki.
+# Copyright © 2010 Sebastian Kuhnert <mail@sebastian-kuhnert.de>
+# Redistribution and use in source and compiled forms, with or without
+# modification, are permitted under any circumstances. No warranty.
+msgid ""
+msgstr ""
+"POT-Creation-Date: 2010-03-12 09:29+0530\n"
+"PO-Revision-Date: 2010-03-14 14:04+0530\n"
+"Last-Translator: Sebastian Kuhnert <mail@sebastian-kuhnert.de>\n"
+"Language-Team: None\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#. type: Plain text
+msgid ""
+"The `orphans` directive is supplied by the [[!iki plugins/orphans "
+"desc=orphans]] plugin."
+msgstr ""
+"Die `orphans`-Anweisung wird durch die [[!iki plugins/orphans "
+"desc=orphans]]-Erweiterung bereitgestellt."
+
+#. type: Plain text
+msgid ""
+"This directive generates a list of possibly orphaned pages -- pages that no "
+"other page links to. Example:"
+msgstr ""
+"Diese Anweisung erzeugt eine Liste von möglicherweise verwaisten Seiten "
+"&ndash; Seiten auf die von keiner anderen aus verlinkt wird. Beispiel:"
+
+#. type: Plain text
+#, no-wrap
+msgid "\t\\[[!orphans pages=\"* and !blog/*\"]]\n"
+msgstr "\t\\[[!orphans pages=\"* and !blog/*\"]]\n"
+
+#. type: Plain text
+msgid ""
+"The optional parameter \"pages\" can be a [[ikiwiki/PageSpec]] specifying "
+"the pages to check for orphans, default is search them all."
+msgstr ""
+"Im optionalen Parameter `pages` kann durch eine [[ikiwiki/PageSpec]] "
+"angegeben werden, welche Seiten auf Verwaistheit überprüft werden. In der "
+"Voreinstellung werden alle geprüft."
+
+#. type: Plain text
+msgid ""
+"Note that it takes backlinks into account, but does not count inlining a "
+"page as linking to it, so will generally count many blog-type pages as "
+"orphans."
+msgstr ""
+"Dabei werden backlinks berücksichtigt, nicht aber Einbetten mit [[inline]]. "
+"Viele blogartige Seiten werden also als Waisen eingestuft werden."
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!meta robots=\"noindex, follow\"]]\n"
+msgstr "[[!meta robots=\"noindex, follow\"]]\n"
+
+
diff --git a/po/underlays/directives/ikiwiki/directive/pagecount.de.po b/po/underlays/directives/ikiwiki/directive/pagecount.de.po
new file mode 100644 (file)
index 0000000..5f2db30
--- /dev/null
@@ -0,0 +1,48 @@
+# German translation of directives/ikiwiki/directive/pagecount page for ikiwiki.
+# Copyright © 2010 Sebastian Kuhnert <mail@sebastian-kuhnert.de>
+# Redistribution and use in source and compiled forms, with or without
+# modification, are permitted under any circumstances. No warranty.
+msgid ""
+msgstr ""
+"POT-Creation-Date: 2010-03-12 09:29+0530\n"
+"PO-Revision-Date: 2010-03-14 14:05+0530\n"
+"Last-Translator: Sebastian Kuhnert <mail@sebastian-kuhnert.de>\n"
+"Language-Team: None\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#. type: Plain text
+msgid ""
+"The `pagecount` directive is supplied by the [[!iki plugins/pagecount "
+"desc=pagecount]] plugin."
+msgstr ""
+"Die `pagecount`-Anweisung wird durch die [[!iki plugins/pagecount "
+"desc=pagecount]]-Erweiterung bereitgestellt."
+
+#. type: Plain text
+msgid "This directive counts pages currently in the wiki. Example:"
+msgstr ""
+"Diese Anweisung zählt die Seiten, die es gerade im Wiki gibt. Beispiel:"
+
+#. type: Plain text
+#, no-wrap
+msgid "\t\\[[!pagecount pages=\"*\"]]\n"
+msgstr "\t\\[[!pagecount pages=\"*\"]]\n"
+
+#. type: Plain text
+msgid ""
+"The optional parameter \"pages\" can be a [[ikiwiki/PageSpec]] specifying "
+"the pages to count, default is to count them all."
+msgstr ""
+"Im optionalen Parameter `pages` kann mit einer [[ikiwiki/PageSpec]] "
+"angegeben werden, welche Seiten gezählt werden sollen, ein der "
+"Voreinstellung werden alle gezählt."
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!meta robots=\"noindex, follow\"]]\n"
+msgstr "[[!meta robots=\"noindex, follow\"]]\n"
+
+
diff --git a/po/underlays/directives/ikiwiki/directive/pagestats.de.po b/po/underlays/directives/ikiwiki/directive/pagestats.de.po
new file mode 100644 (file)
index 0000000..86ce00d
--- /dev/null
@@ -0,0 +1,99 @@
+# German translation of directives/ikiwiki/directive/pagestats page for ikiwiki.
+# Copyright © 2010 Sebastian Kuhnert <mail@sebastian-kuhnert.de>
+# Redistribution and use in source and compiled forms, with or without
+# modification, are permitted under any circumstances. No warranty.
+msgid ""
+msgstr ""
+"POT-Creation-Date: 2010-03-12 09:29+0530\n"
+"PO-Revision-Date: 2010-03-14 14:05+0530\n"
+"Last-Translator: Sebastian Kuhnert <mail@sebastian-kuhnert.de>\n"
+"Language-Team: None\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#. type: Plain text
+msgid ""
+"The `pagestats` directive is supplied by the [[!iki plugins/pagestats "
+"desc=pagestats]] plugin."
+msgstr ""
+"Die `pagestats`-Anweisung wird durch die [[!iki plugins/pagestats "
+"desc=pagestats]]-Erweiterung bereitgestellt."
+
+#. type: Plain text
+msgid ""
+"This directive can generate stats about how pages link to each other. It can "
+"produce either a tag cloud, or a table counting the number of links to each "
+"page."
+msgstr ""
+"Diese Anweisung kann Statistiken darüber erzeugen, wie Seiten aufeinander "
+"verlinken. Sie kann entweder eine Tag-Wolke erzeugen oder eine Tabelle mit "
+"den Häufigkeiten, wie oft auf die einzelnen Seiten verwiesen wurde."
+
+#. type: Plain text
+msgid "Here's how to use it to create a [[tag]] cloud:"
+msgstr "So kann eine [[tag]]-Wolke erzeugt werden:"
+
+#. type: Plain text
+#, no-wrap
+msgid "\t\\[[!pagestats pages=\"tags/*\"]]\n"
+msgstr "\t\\[[!pagestats pages=\"tags/*\"]]\n"
+
+#. type: Plain text
+msgid "And here's how to create a table of all the pages on the wiki:"
+msgstr "Und so kann eine Tabelle mit allen Seiten im Wiki erzeugt werden:"
+
+#. type: Plain text
+#, no-wrap
+msgid "\t\\[[!pagestats style=\"table\"]]\n"
+msgstr "\t\\[[!pagestats style=\"table\"]]\n"
+
+#. type: Plain text
+msgid ""
+"The optional `among` parameter limits the pages whose outgoing links are "
+"considered. For instance, to display a cloud of tags used on blog entries, "
+"while ignoring other pages that use those tags, you could use:"
+msgstr ""
+"Der optionale Parameter `among` beschränkt die Seiten, deren ausgehende "
+"Links berücksichtigt werden. Zum Beispiel kann folgendermaßen eine Tag-Wolke "
+"erzeugt werden, die nur Vorkommen in Blogeinträgen berücksichtigt:"
+
+#. type: Plain text
+#, no-wrap
+msgid "\t\\[[!pagestats pages=\"tags/*\" among=\"blog/posts/*\"]]\n"
+msgstr "\t\\[[!pagestats pages=\"tags/*\" among=\"blog/posts/*\"]]\n"
+
+#. type: Plain text
+msgid "Or to display a cloud of tags related to Linux, you could use:"
+msgstr "Oder um eine Wolke mit Tags anzuzeigen, die mit Linux verwandt sind:"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"\t\\[[!pagestats pages=\"tags/* and not tags/linux\" "
+"among=\"tagged(linux)\"]]\n"
+msgstr ""
+"\t\\[[!pagestats pages=\"tags/* and not tags/linux\" "
+"among=\"tagged(linux)\"]]\n"
+
+#. type: Plain text
+msgid ""
+"The optional `show` parameter limits display to the specified number of "
+"pages. For instance, to show a table of the top ten pages with the most "
+"links:"
+msgstr ""
+"Der optionale Parameter `show` zeigt nur die angegebene Anzahl von Seiten an."
+" Zum Beispiel kann man eine Tabelle mit den zehn häufigsten Links anzeigen:"
+
+#. type: Plain text
+#, no-wrap
+msgid "\t\\[[!pagestats style=\"table\" show=\"10\"]]\n"
+msgstr "\t\\[[!pagestats style=\"table\" show=\"10\"]]\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!meta robots=\"noindex, follow\"]]\n"
+msgstr "[[!meta robots=\"noindex, follow\"]]\n"
+
+
diff --git a/po/underlays/directives/ikiwiki/directive/pagetemplate.de.po b/po/underlays/directives/ikiwiki/directive/pagetemplate.de.po
new file mode 100644 (file)
index 0000000..71ea68e
--- /dev/null
@@ -0,0 +1,64 @@
+# German translation of directives/ikiwiki/directive/pagetemplate page for ikiwiki.
+# Copyright © 2010 Sebastian Kuhnert <mail@sebastian-kuhnert.de>
+# Redistribution and use in source and compiled forms, with or without
+# modification, are permitted under any circumstances. No warranty.
+msgid ""
+msgstr ""
+"POT-Creation-Date: 2010-03-12 09:29+0530\n"
+"PO-Revision-Date: 2010-03-14 14:05+0530\n"
+"Last-Translator: Sebastian Kuhnert <mail@sebastian-kuhnert.de>\n"
+"Language-Team: None\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#. type: Plain text
+msgid ""
+"The `pagetemplate` directive is supplied by the [[!iki plugins/pagetemplate "
+"desc=pagetemplate]] plugin."
+msgstr ""
+"Die `pagetemplate`-Anweisung wird durch die [[!iki plugins/pagetemplate "
+"desc=pagetemplate]]-Erweiterung bereitgestellt."
+
+#. type: Plain text
+msgid ""
+"This directive allows a page to be displayed using a different template than "
+"the default `page.tmpl` template."
+msgstr ""
+"Diese Anweisung erlaubt es, für eine Seite eine andere als die "
+"voreingestellte Vorlage `page.tmpl` zu verwenden."
+
+#. type: Plain text
+msgid ""
+"The page text is inserted into the template, so the template controls the "
+"overall look and feel of the wiki page. This is in contrast to the "
+"[[ikiwiki/directive/template]] directive, which allows inserting templates "
+"_into_ the body of a page."
+msgstr ""
+"Der Seiteninhalt wird in die Vorlage eingefügt, die Vorlage steuert also das "
+"allgemeine Erscheinungsbild der Seite. Im Gegensatz dazu erlaubt die "
+"[[ikiwiki/directive/template]]-Anweisung, Vorlagen _in_ den Text einer Seite "
+"einzufügen."
+
+#. type: Plain text
+msgid ""
+"This directive can only reference templates that are already installed by "
+"the system administrator, typically into the `/usr/share/ikiwiki/templates` "
+"directory. Example:"
+msgstr ""
+"Diese Anweisung kann nur auf Vorlagen zurückgreifen, die bereits durch den "
+"Systemadministrator installiert wurden, typischerweise im Verzeichnis "
+"`/usr/share/ikiwiki/templates`. Beispiel:"
+
+#. type: Plain text
+#, no-wrap
+msgid "\t\\[[!pagetemplate template=\"my_fancy.tmpl\"]]\n"
+msgstr "\t\\[[!pagetemplate template=\"my_fancy.tmpl\"]]\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!meta robots=\"noindex, follow\"]]\n"
+msgstr "[[!meta robots=\"noindex, follow\"]]\n"
+
+
diff --git a/po/underlays/directives/ikiwiki/directive/paste.de.po b/po/underlays/directives/ikiwiki/directive/paste.de.po
new file mode 100644 (file)
index 0000000..390d6e9
--- /dev/null
@@ -0,0 +1,25 @@
+# German translation of directives/ikiwiki/directive/paste page for ikiwiki.
+# Copyright © 2010 Sebastian Kuhnert <mail@sebastian-kuhnert.de>
+# Redistribution and use in source and compiled forms, with or without
+# modification, are permitted under any circumstances. No warranty.
+msgid ""
+msgstr ""
+"POT-Creation-Date: 2010-03-12 09:29+0530\n"
+"PO-Revision-Date: 2010-03-13 23:32+0530\n"
+"Last-Translator: Sebastian Kuhnert <mail@sebastian-kuhnert.de>\n"
+"Language-Team: None\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!meta redir=/ikiwiki/directive/cutpaste]]\n"
+msgstr "[[!meta redir=/ikiwiki/directive/cutpaste]]\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!meta robots=\"noindex, follow\"]]\n"
+msgstr "[[!meta robots=\"noindex, follow\"]]\n"
+
diff --git a/po/underlays/directives/ikiwiki/directive/ping.de.po b/po/underlays/directives/ikiwiki/directive/ping.de.po
new file mode 100644 (file)
index 0000000..9276d69
--- /dev/null
@@ -0,0 +1,69 @@
+# German translation of directives/ikiwiki/directive/ping page for ikiwiki.
+# Copyright © 2010 Sebastian Kuhnert <mail@sebastian-kuhnert.de>
+# Redistribution and use in source and compiled forms, with or without
+# modification, are permitted under any circumstances. No warranty.
+msgid ""
+msgstr ""
+"POT-Creation-Date: 2010-03-12 09:29+0530\n"
+"PO-Revision-Date: 2010-03-14 14:06+0530\n"
+"Last-Translator: Sebastian Kuhnert <mail@sebastian-kuhnert.de>\n"
+"Language-Team: None\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#. type: Plain text
+msgid ""
+"The `ping` directive is supplied by the [[!iki plugins/pinger desc=pinger]] "
+"plugin."
+msgstr ""
+"Die `ping`-Anweisung wird durch die [[!iki plugins/pinger "
+"desc=pinger]]-Erweiterung bereitgestellt."
+
+#. type: Plain text
+msgid ""
+"This directive allows ikiwiki to be configured to hit a URL each time it "
+"updates the wiki. One way to use this is in conjunction with the [[!iki "
+"plugins/pingee desc=pingee]] plugin to set up a loosely coupled mirror "
+"network, or a branched version of a wiki. By pinging the mirror or branch "
+"each time the main wiki changes, it can be kept up-to-date."
+msgstr ""
+"Diese Anweisung erlaubt es ikiwiki so zu konfigurieren, dass eine bestimmte "
+"URL jedes mal aufgerufen wird, wenn das Wiki aktualisiert wird. Dies kann "
+"in Kombination mit der [[!iki plugins/pingee desc=pingee]]-Erweiterung dazu "
+"verwendet werden, ein eng gekoppeltes Netzwerk mit gespiegelten oder "
+"abgeleiteten Wikis einzurichten. Durch das Anpingen kann bei jeder Änderung "
+"der Spiegel oder das abgeleitete Wiki aktuell gehalten werden."
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"        \\[[!ping from=\"http://mywiki.com/\"\n"
+"        to=\"http://otherwiki.com/ikiwiki.cgi?do=ping\"]]\n"
+msgstr ""
+"        \\[[!ping from=\"http://mywiki.com/\"\n"
+"        to=\"http://otherwiki.com/ikiwiki.cgi?do=ping\"]]\n"
+
+#. type: Plain text
+msgid ""
+"The \"from\" parameter must be identical to the url of the wiki that is "
+"doing the pinging. This is used to prevent ping loops."
+msgstr ""
+"Der Parameter `from` muss identisch zur URL des Wikis sein, dass den Ping "
+"durchführt. Dies wird verwendet, um Schleifen zu verhindern."
+
+#. type: Plain text
+msgid ""
+"The \"to\" parameter is the url to ping. The example shows how to ping "
+"another ikiwiki instance."
+msgstr ""
+"Der Parameter `to` ist die URL, die aufgerufen werden soll. Das Beispiel "
+"zeigt, wie eine andere ikiwiki-Instanz angepingt werden kann."
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!meta robots=\"noindex, follow\"]]\n"
+msgstr "[[!meta robots=\"noindex, follow\"]]\n"
+
+
diff --git a/po/underlays/directives/ikiwiki/directive/poll.de.po b/po/underlays/directives/ikiwiki/directive/poll.de.po
new file mode 100644 (file)
index 0000000..680bc18
--- /dev/null
@@ -0,0 +1,87 @@
+# German translation of directives/ikiwiki/directive/poll page for ikiwiki.
+# Copyright © 2010 Sebastian Kuhnert <mail@sebastian-kuhnert.de>
+# Redistribution and use in source and compiled forms, with or without
+# modification, are permitted under any circumstances. No warranty.
+msgid ""
+msgstr ""
+"POT-Creation-Date: 2010-03-12 09:29+0530\n"
+"PO-Revision-Date: 2010-03-14 14:06+0530\n"
+"Last-Translator: Sebastian Kuhnert <mail@sebastian-kuhnert.de>\n"
+"Language-Team: None\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#. type: Plain text
+msgid ""
+"The `poll` directive is supplied by the [[!iki plugins/poll desc=poll]] "
+"plugin."
+msgstr ""
+"Die `poll`-Anweisung wird durch die [[!iki plugins/poll desc=poll]]-Erweiterung "
+"bereitgestellt."
+
+#. type: Plain text
+msgid ""
+"This directive allows you to create online polls in the wiki. Here's an "
+"example use:"
+msgstr ""
+"Diese Anweisung erlaubt es, Online-Umfragen im Wiki durchzuführen. Zum Beispiel:"
+
+#. type: Plain text
+#, no-wrap
+msgid "\t\\[[!poll 0 \"red\" 0 \"green\" 0 \"blue\"]]\n"
+msgstr "\t\\[[!poll 0 \"red\" 0 \"green\" 0 \"blue\"]]\n"
+
+#. type: Plain text
+msgid ""
+"The numbers indicate how many users voted for that choice. When a user votes "
+"for a choice in the poll, the page is modified and the number incremented."
+msgstr ""
+"Die Zahlen geben an, wie viele Benutzer für diese Möglichkeit gestimmt haben. "
+"Wenn ein Benutzer seine Stimme abgibt, wird die Seite modifiziert und die "
+"entsprechende Zahl hochgezählt."
+
+#. type: Plain text
+msgid ""
+"While some basic precautions are taken to prevent users from accidentially "
+"voting twice, this sort of poll should not be counted on to be very "
+"accurate; all the usual concerns about web based polling apply. Unless the "
+"page that the poll is in is locked, users can even edit the page and change "
+"the numbers!"
+msgstr ""
+"Obwohl einige einfache Vorsichtsmaßnahmen getroffen wurden, damit Benutzer nicht "
+"ausversehen mehrmals abstimmen, sollte diese Art Umfrage nicht als besonders "
+"verlässlich angesehen werden; alle üblichen Bedenken bezüglich webbasierten "
+"Abstimmungen treffen zu. Wenn die Seite mit der Abstimmung nicht zum Bearbeiten "
+"gesperrt ist, können Benutzer sogar direkt die Zahlen verändern!"
+
+#. type: Plain text
+msgid "Parameters:"
+msgstr "Parameter:"
+
+#. type: Bullet: '* '
+msgid ""
+"`open` - Whether voting is still open. Set to \"no\" to close the poll to "
+"voting."
+msgstr ""
+"`open` - Ob die Abstimmung noch offen ist. Beim Wert `no` werden keine weiteren "
+"Stimmen angenommen."
+
+#. type: Bullet: '* '
+msgid "`total` - Show total number of votes at bottom of poll. Default is \"yes\"."
+msgstr ""
+"`total` - Zeige die bisherige Anzahl der Stimmen unterhalb des "
+"Abstimmungsformulars an. Voreingestellt ist `yes`."
+
+#. type: Bullet: '* '
+msgid "`percent` - Whether to display percents. Default is \"yes\"."
+msgstr ""
+"`percent` - Ob Prozentzahlen angezeigt werden sollen. Voreingestellt ist `yes`."
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!meta robots=\"noindex, follow\"]]\n"
+msgstr "[[!meta robots=\"noindex, follow\"]]\n"
+
+
diff --git a/po/underlays/directives/ikiwiki/directive/polygen.de.po b/po/underlays/directives/ikiwiki/directive/polygen.de.po
new file mode 100644 (file)
index 0000000..8acb983
--- /dev/null
@@ -0,0 +1,50 @@
+# German translation of directives/ikiwiki/directive/polygen page for ikiwiki.
+# Copyright © 2010 Sebastian Kuhnert <mail@sebastian-kuhnert.de>
+# Redistribution and use in source and compiled forms, with or without
+# modification, are permitted under any circumstances. No warranty.
+msgid ""
+msgstr ""
+"POT-Creation-Date: 2010-03-12 09:29+0530\n"
+"PO-Revision-Date: 2010-03-14 14:06+0530\n"
+"Last-Translator: Sebastian Kuhnert <mail@sebastian-kuhnert.de>\n"
+"Language-Team: None\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#. type: Plain text
+msgid ""
+"The `polygen` directive is supplied by the [[!iki plugins/polygen "
+"desc=polygen]] plugin."
+msgstr ""
+"Die `polygen`-Anweisung wird durch die [[!iki plugins/polygen "
+"desc=polygen]]-Erweiterung bereitgestellt."
+
+#. type: Plain text
+msgid ""
+"This directive allows inserting text generated by polygen into a wiki page.  "
+"For example:"
+msgstr ""
+"Diese Anweisung erlaubt es, durch *polygen* erzeugten Text in eine "
+"Wiki-Seite einzubinden. Zum Beispiel:"
+
+#. type: Plain text
+#, no-wrap
+msgid "\t\\[[!polygen grammar=\"genius\"]]\n"
+msgstr "\t\\[[!polygen grammar=\"genius\"]]\n"
+
+#. type: Plain text
+msgid ""
+"It's also possible to specify a starting nonterminal for the grammar by "
+"including `symbol=\"text\"` in the directive."
+msgstr ""
+"Es ist auch möglich, ein Start-Nichtterminal für die Grammatik anzugeben, "
+"indem `symbol=\"text\"` mit in der Anweisung angegeben wird."
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!meta robots=\"noindex, follow\"]]\n"
+msgstr "[[!meta robots=\"noindex, follow\"]]\n"
+
+
diff --git a/po/underlays/directives/ikiwiki/directive/postsparkline.de.po b/po/underlays/directives/ikiwiki/directive/postsparkline.de.po
new file mode 100644 (file)
index 0000000..e857d10
--- /dev/null
@@ -0,0 +1,149 @@
+# German translation of directives/ikiwiki/directive/postsparkline page for ikiwiki.
+# Copyright © 2010 Sebastian Kuhnert <mail@sebastian-kuhnert.de>
+# Redistribution and use in source and compiled forms, with or without
+# modification, are permitted under any circumstances. No warranty.
+msgid ""
+msgstr ""
+"POT-Creation-Date: 2010-03-12 09:29+0530\n"
+"PO-Revision-Date: 2010-03-14 14:07+0530\n"
+"Last-Translator: Sebastian Kuhnert <mail@sebastian-kuhnert.de>\n"
+"Language-Team: None\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#. type: Plain text
+msgid ""
+"The `postsparkline` directive is supplied by the [[!iki "
+"plugins/postsparkline desc=postsparkline]] plugin."
+msgstr ""
+"Die `postsparkline`-Anweisung wird durch die [[!iki "
+"plugins/postsparkline desc=postsparkline]]-Erweiterung bereitgestellt."
+
+#. type: Plain text
+msgid ""
+"This directive uses the [[!iki plugins/sparkline desc=sparkline]] plugin to "
+"create a [[sparkline]] of statistics about a set of pages, such as posts to "
+"a blog."
+msgstr ""
+"Diese Anweisung verwendet die [[!iki plugins/sparkline "
+"desc=sparkline]]-Erweiterung, um eine [[sparkline]] mit Statistiken über "
+"bestimmte Seiten anzuzeigen, etwa über Einträge in einem Blog."
+
+#. type: Title #
+#, no-wrap
+msgid "examples"
+msgstr "Beispiele"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"\tPost interval: \n"
+"\t\\[[!postsparkline pages=\"blog/* and !*/Discussion\" max=100\n"
+"\tformula=interval style=bar barwidth=2 barspacing=1 height=13]]\n"
+msgstr ""
+"\tIntervall der Einträge: \n"
+"\t\\[[!postsparkline pages=\"blog/* and !*/Discussion\" max=100\n"
+"\tformula=interval style=bar barwidth=2 barspacing=1 height=13]]\n"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"\tPosts per month this year: \n"
+"\t\\[[!postsparkline pages=\"blog/* and !*/Discussion\" max=12\n"
+"\tformula=permonth style=bar barwidth=2 barspacing=1 height=13]]\n"
+msgstr ""
+"\tEinträge pro Monat in diesem Jahr: \n"
+"\t\\[[!postsparkline pages=\"blog/* and !*/Discussion\" max=12\n"
+"\tformula=permonth style=bar barwidth=2 barspacing=1 height=13]]\n"
+
+#. type: Title #
+#, no-wrap
+msgid "usage"
+msgstr "Verwendung"
+
+#. type: Plain text
+msgid ""
+"All options aside from the `pages`, `max`, `formula`, `time`, and `color` "
+"options are the same as in [[sparkline]] directive."
+msgstr ""
+"Alle Parameter außer `pages`, `max`, `formula`, `time` und `color` sind die "
+"gleichen wie in der [[sparkline]]-Anweisung."
+
+#. type: Plain text
+msgid ""
+"You don't need to specify any data points (though you can if you want to).  "
+"Instead, data points are automatically generated based on the creation times "
+"of pages matched by the specified `pages` [[ikiwiki/PageSpec]]. A maximum of "
+"`max` data points will be generated."
+msgstr ""
+"Es müssen keine Datenpunkte angegeben werden (auch wenn dies möglich ist). "
+"Stattdessen werden die Datenpunkte ausgehend vom Erstellungsdatum der durch "
+"`pages` angegebenen Seiten (eine [[ikiwiki/PageSpec]]) automatisch generiert."
+" Es werden höchstens `max` Datenpunkte erzeugt."
+
+#. type: Plain text
+msgid ""
+"The `formula` parameter controls the formula used to generate data points.  "
+"Available formulae:"
+msgstr ""
+"Der Parameter `formula` steuert die Formel, mit der die Datenpunkte erzeugt "
+"werden. Verfügbare Formeln:"
+
+#. type: Bullet: '* '
+msgid ""
+"`interval` - The height of each point represents how long it has been since "
+"the previous post."
+msgstr ""
+"`interval` - Die Höhe jedes Punkts steht für den zeitlichen Abstand zum "
+"vorherigen Eintrag."
+
+#. type: Bullet: '* '
+msgid ""
+"`perday` - Each point represents a day; the height represents how many posts "
+"were made that day."
+msgstr ""
+"`perday` - Jeder Punkt entspricht einem Tag; die Höhe stellt die Anzahl der "
+"an diesem Tag gemachten Einträge dar."
+
+#. type: Bullet: '* '
+msgid ""
+"`permonth` - Each point represents a month; the height represents how many "
+"posts were made that month."
+msgstr ""
+"`permonth` - Jeder Punkt entspricht einem Monat; die Höhe stellt die Anzahl "
+"der in diesem Monat gemachten Einträge dar."
+
+#. type: Bullet: '* '
+msgid ""
+"`peryear` - Each point represents a year; the height represents how many "
+"posts were made that year."
+msgstr ""
+"`peryear` -  Jeder Punkt entspricht einem Jahr; die Höhe stellt die Anzahl "
+"der in diesem Jahr gemachten Einträge dar."
+
+#. type: Plain text
+msgid ""
+"The `time` parameter has a default value of \"ctime\", since formulae use "
+"the creation times of pages by default. If you instead want them to use the "
+"modification times of pages, set it to \"mtime\"."
+msgstr ""
+"Der Parameter `time` hat standardmäßig den Wert `ctime` und es werden die "
+"Erstellungszeiten der Seiten verwendet. Sollen stattdessen die "
+"Änderungszeiten verwendet werden, kann `mtime` angegeben werden."
+
+#. type: Plain text
+msgid ""
+"To change the color used to draw the sparkline, use the `color` parameter.  "
+"For example, \"color=red\"."
+msgstr ""
+"Die Farbe der sparkline kann mit dem Parameter `color` verändert werden, "
+"etwa durch `color=red`."
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!meta robots=\"noindex, follow\"]]\n"
+msgstr "[[!meta robots=\"noindex, follow\"]]\n"
+
+
diff --git a/po/underlays/directives/ikiwiki/directive/progress.de.po b/po/underlays/directives/ikiwiki/directive/progress.de.po
new file mode 100644 (file)
index 0000000..5f10f99
--- /dev/null
@@ -0,0 +1,68 @@
+# German translation of directives/ikiwiki/directive/progress page for ikiwiki.
+# Copyright © 2010 Sebastian Kuhnert <mail@sebastian-kuhnert.de>
+# Redistribution and use in source and compiled forms, with or without
+# modification, are permitted under any circumstances. No warranty.
+msgid ""
+msgstr ""
+"POT-Creation-Date: 2010-03-12 09:29+0530\n"
+"PO-Revision-Date: 2010-03-14 14:07+0530\n"
+"Last-Translator: Sebastian Kuhnert <mail@sebastian-kuhnert.de>\n"
+"Language-Team: None\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#. type: Plain text
+msgid ""
+"The `progress` directive is supplied by the [[!iki plugins/progress "
+"desc=progress]] plugin."
+msgstr ""
+"Die `progress`-Anweisung wird durch die [[!iki plugins/progress "
+"desc=progress]]-Erweiterung bereitgestellt."
+
+#. type: Plain text
+msgid "This directive generates a progress bar."
+msgstr "Diese Anweisung erzeugt einen Fortschrittsbalken."
+
+#. type: Plain text
+msgid ""
+"There are two possible parameter sets.  The first is a single parameter "
+"\"percent\" which holds a percentage figure of how complete the progress bar "
+"is."
+msgstr ""
+"Es gibt zwei mögliche Parameter-Mengen. Die erste besteht aus dem einzelnen "
+"Parameter `percent`, der die Prozentzahl enthält, wie vollständig der "
+"Fortschrittsbalken ist."
+
+#. type: Plain text
+msgid ""
+"The second possible set of parameters is a pair of [[ikiwiki/PageSpec]]s, "
+"`totalpages` and `donepages`. The directive counts the number of pages in "
+"each pagespec and shows the percentage of the total pages that are done."
+msgstr ""
+"Die zweite mögliche Parameter-Menge ist ein Paar von [[ikiwiki/PageSpec]]s, "
+"`totalpages` und `donepages`. Die Anweisung zählt dann jeweils die passenden "
+"Seiten und zeigt an, welcher Anteil der Seiten fertig ist."
+
+#. type: Plain text
+msgid "For example, to show what percentage of pages have discussion pages:"
+msgstr ""
+"Zum Beispiel kann man anzeigen, welcher Anteil der Seiten eine "
+"Diskussionsseite haben:"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"\t\\[[!progress totalpages=\"* and !*/Discussion\" "
+"donepages=\"*/Discussion\"]]\n"
+msgstr ""
+"\t\\[[!progress totalpages=\"* and !*/Discussion\" "
+"donepages=\"*/Discussion\"]]\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!meta robots=\"noindex, follow\"]]\n"
+msgstr "[[!meta robots=\"noindex, follow\"]]\n"
+
+
diff --git a/po/underlays/directives/ikiwiki/directive/shortcut.de.po b/po/underlays/directives/ikiwiki/directive/shortcut.de.po
new file mode 100644 (file)
index 0000000..50ffebc
--- /dev/null
@@ -0,0 +1,46 @@
+# German translation of directives/ikiwiki/directive/shortcut page for ikiwiki.
+# Copyright © 2010 Sebastian Kuhnert <mail@sebastian-kuhnert.de>
+# Redistribution and use in source and compiled forms, with or without
+# modification, are permitted under any circumstances. No warranty.
+msgid ""
+msgstr ""
+"POT-Creation-Date: 2010-03-12 09:29+0530\n"
+"PO-Revision-Date: 2010-03-14 14:07+0530\n"
+"Last-Translator: Sebastian Kuhnert <mail@sebastian-kuhnert.de>\n"
+"Language-Team: None\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#. type: Plain text
+msgid ""
+"The `shortcut` directive is supplied by the [[!iki plugins/shortcut "
+"desc=shortcut]] plugin."
+msgstr ""
+"Die `shortcut`-Anweisung wird durch die [[!iki plugins/shortcut "
+"desc=shortcut]]-Erweiterung bereitgestellt."
+
+#. type: Plain text
+msgid ""
+"This directive allows external links to commonly linked to sites to be made "
+"more easily using shortcuts."
+msgstr ""
+"Diese Anweisung erlaubt es, Links auf häufig verwendete externe Seiten "
+"einfacher zu setzen."
+
+#. type: Plain text
+msgid ""
+"The available shortcuts are defined on the [[shortcuts]] page in the "
+"wiki. The `shortcut` directive can only be used on that page."
+msgstr ""
+"Die verfügbaren Abkürzungen werden im Wiki auf der Seite [[shortcuts]] "
+"definiert. Die `shortcut`-Anweisung kann nur auf dieser Seite verwendet "
+"werden."
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!meta robots=\"noindex, follow\"]]\n"
+msgstr "[[!meta robots=\"noindex, follow\"]]\n"
+
+
diff --git a/po/underlays/directives/ikiwiki/directive/sparkline.de.po b/po/underlays/directives/ikiwiki/directive/sparkline.de.po
new file mode 100644 (file)
index 0000000..3223b88
--- /dev/null
@@ -0,0 +1,178 @@
+# German translation of directives/ikiwiki/directive/sparkline page for ikiwiki.
+# Copyright © 2010 Sebastian Kuhnert <mail@sebastian-kuhnert.de>
+# Redistribution and use in source and compiled forms, with or without
+# modification, are permitted under any circumstances. No warranty.
+msgid ""
+msgstr ""
+"POT-Creation-Date: 2010-03-12 09:29+0530\n"
+"PO-Revision-Date: 2010-03-14 14:08+0530\n"
+"Last-Translator: Sebastian Kuhnert <mail@sebastian-kuhnert.de>\n"
+"Language-Team: None\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#. type: Plain text
+msgid ""
+"The `sparkline` directive is supplied by the [[!iki plugins/sparkline "
+"desc=sparkline]] plugin."
+msgstr ""
+"Die `sparkline`-Anweisung wird durch die [[!iki plugins/sparkline "
+"desc=sparkline]]-Erweiterung bereitgestellt."
+
+#. type: Plain text
+msgid ""
+"This directive allows for embedding sparklines into wiki pages. A sparkline "
+"is a small word-size graphic chart, that is designed to be displayed "
+"alongside text."
+msgstr ""
+"Diese Anweisung erlaubt es, sparklines in Wiki-Seiten einzubetten. Eine "
+"sparkline ist eine kleine Graphik, die so groß wie ein Wort ist und sich "
+"deshalb zur Anzeige neben Text eignet."
+
+#. type: Title #
+#, no-wrap
+msgid "examples"
+msgstr "Beispiele"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"\t\\[[!sparkline 1 3 5 -3 10 0 width=40 height=16\n"
+"\tfeaturepoint=\"4,-3,red,3\" featurepoint=\"5,10,green,3\"]]\n"
+msgstr ""
+"\t\\[[!sparkline 1 3 5 -3 10 0 width=40 height=16\n"
+"\tfeaturepoint=\"4,-3,red,3\" featurepoint=\"5,10,green,3\"]]\n"
+
+#. type: Plain text
+msgid ""
+"This creates a simple line graph, graphing several points.  It will be drawn "
+"40 pixels wide and 16 pixels high. The high point in the line has a green "
+"marker, and the low point has a red marker."
+msgstr ""
+"Dies erzeugt eine einfache Liniengrafik, die aus mehreren Punkten besteht. "
+"Sie wird mit 40 Pixel Breite und 16 Pixel Höhe erzeugt. Der hohe Punkt auf "
+"der Linie hat eine grüne Markierung, der niedrige eine rote."
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"\t\\[[!sparkline 1 -1(red) 1 -1(red) 1 1 1 -1(red) -1(red) style=bar "
+"barwidth=2\n"
+"\tbarspacing=1 height=13]]\n"
+msgstr ""
+"\t\\[[!sparkline 1 -1(red) 1 -1(red) 1 1 1 -1(red) -1(red) style=bar "
+"barwidth=2\n"
+"\tbarspacing=1 height=13]]\n"
+
+#. type: Plain text
+msgid ""
+"This more complex example generates a bar graph.  The bars are 2 pixels "
+"wide, and separated by one pixel, and the graph is 13 pixels tall. Width is "
+"determined automatically for bar graphs. The points with negative values are "
+"colored red, instead of the default black."
+msgstr ""
+"Dies ist ein komplexeres Beispiel, das eine Balkengrafik erzeugt. Die Balken "
+"sind 2 Pixel breit und werden durch ein Pixel getrennt; die Grafik ist 14 "
+"Pixel hoch. Die Breite für Balkengrafiken automatisch bestimmt. Punkte mit "
+"negativen Werten haben abweichend vom voreingestellten Schwarz die Farbe rot."
+
+#. type: Title #
+#, no-wrap
+msgid "usage"
+msgstr "Verwendung"
+
+#. type: Plain text
+msgid ""
+"The form for the data points is \"x,y\", or just \"y\" if the x values don't "
+"matter. Bar graphs can also add \"(color)\" to specify a color for that bar."
+msgstr ""
+"Die Form für Datenpunkte ist `x,y`, oder einfach nur `y`, wenn die x-Werte "
+"unerheblich sind. Balkengrafiken können auch `(color)` hinzufügen, um eine "
+"Farbe für den Balken anzugeben."
+
+#. type: Plain text
+msgid ""
+"The following named parameters are recognised. Most of these are the same as "
+"those used by the underlying sparkline library, which is documented in more "
+"detail in [its wiki](http://sparkline.wikispaces.com/usage)."
+msgstr ""
+"Die folgenden benannten Parameter werden erkannt. Die meisten entsprechen "
+"denen der zugrundeliegenden sparkline-Bibliothek, die [in ihrem "
+"Wiki](http://sparkline.wikispaces.com/usage) genauer beschrieben wird."
+
+#. type: Bullet: '* '
+msgid "`style` - Either \"line\" (the default) or \"bar\"."
+msgstr "`style` - Entweder `line` (die Voreinstellung) oder `bar`."
+
+#. type: Bullet: '* '
+msgid "`width` - Width of the graph in pixels. Only needed for line graphs."
+msgstr ""
+"`width` - Die Breite der Grafik in Pixeln. Wird nur für Linien-Grafiken "
+"benötigt."
+
+#. type: Bullet: '* '
+msgid "`height` - Height of the graph in pixels. Defaults to 16."
+msgstr "`height` - Höhe des Grafen in Pixeln. Voreingestellt sind 16."
+
+#. type: Bullet: '* '
+msgid "`barwidth` - Width of bars in a bar graph. Default is 1 pixel."
+msgstr ""
+"`barwidth` - Breite der Balken in einer Balkengrafik. Voreingestellt ist 1 "
+"Pixel."
+
+#. type: Bullet: '* '
+msgid ""
+"`barspacing` - Spacing between bars in a bar graph, in pixels. Default is 1 "
+"pixel."
+msgstr ""
+"`barspacing` - Abstand zwischen den Balken einer Balkengrafik in Pixeln. "
+"Voreingestellt ist 1 Pixel."
+
+#. type: Bullet: '* '
+msgid ""
+"`ymin`, `ymax` - Minimum and maximum values for the Y axis. This is normally "
+"calculated automatically, but can be explicitly specified to get the same "
+"values for multiple related graphs."
+msgstr ""
+"`ymin`, `ymax` - Minimaler und maximaler Wert für die y-Achse. Dies wird "
+"normalerweise automatisch berechnet, kann aber auch explizit angegeben "
+"werden, um mehrere verwandte Grafiken zu erhalten."
+
+#. type: Bullet: '* '
+msgid ""
+"`featurepoint` - Adds a circular marker to a line graph, with optional "
+"text. This can be used to label significant points."
+msgstr ""
+"`featurepoint` - Fügt eine kreisförmige Markierung zu einer Liniengrafik "
+"hinzu, mit optionalem Text. So können bedeutsame Punkte beschriftet werden."
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"  The value is a comma-delimited list of parameters specifying the feature\n"
+"  point: X value, Y value, color name, circle diameter, text (optional),\n"
+"  and text location (optional). Example: `featurepoint=\"3,5,blue,3\"`\n"
+msgstr ""
+"  Der Wert ist eine Komma-separierte Liste von Parametern, die den\n"
+"  hervorzuhebenden Punkt angeben: x-Wert, y-Wert, Farbname,\n"
+"  Kreisdurchmesser, Text (optional) und Platzierung des Textes (optional).\n"
+"  Beispiel: `featurepoint=\"3,5,blue,3\"`\n"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"  Available values for the text location are: \"top\", \"right\", "
+"\"bottom\", and\n"
+"  \"left\".\n"
+msgstr ""
+"  Verfügbare Werte für die Platzierung des Textes sind `top`,\n"
+"  `right`, `bottom` und `left`.\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!meta robots=\"noindex, follow\"]]\n"
+msgstr "[[!meta robots=\"noindex, follow\"]]\n"
+
+
diff --git a/po/underlays/directives/ikiwiki/directive/table.de.po b/po/underlays/directives/ikiwiki/directive/table.de.po
new file mode 100644 (file)
index 0000000..6aaeef7
--- /dev/null
@@ -0,0 +1,147 @@
+# German translation of directives/ikiwiki/directive/table page for ikiwiki.
+# Copyright © 2010 Sebastian Kuhnert <mail@sebastian-kuhnert.de>
+# Redistribution and use in source and compiled forms, with or without
+# modification, are permitted under any circumstances. No warranty.
+msgid ""
+msgstr ""
+"POT-Creation-Date: 2010-03-12 09:29+0530\n"
+"PO-Revision-Date: 2010-03-14 14:08+0530\n"
+"Last-Translator: Sebastian Kuhnert <mail@sebastian-kuhnert.de>\n"
+"Language-Team: None\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#. type: Plain text
+msgid ""
+"The `table` directive is supplied by the [[!iki plugins/table desc=table]] "
+"plugin."
+msgstr ""
+"Die `table`-Anweisung wird durch die [[!iki plugins/table "
+"desc=table]]-Erweiterung bereitgestellt."
+
+#. type: Plain text
+msgid ""
+"This directive can build HTML tables from data in CSV (comma-separated "
+"values)  or DSV (delimiter-separated values) format."
+msgstr ""
+"Diese Anweisung kann HTML-Tabellen aus Daten im CSV-Format (Komma-separierte "
+"Werte) oder DSV-Format (Trennzeichen-separierte Werte) erzeugen."
+
+#. type: Title ##
+#, no-wrap
+msgid "examples"
+msgstr "Beispiele"
+
+#. type: Plain text
+#:
+#, no-wrap
+msgid "\t\\[[!table data=\"\"\"\n"
+msgstr "\t\\[[!table data=\"\"\"\n"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"\tCustomer|Amount\n"
+"\tFulanito|134,34\n"
+"\tMenganito|234,56\n"
+"\tMenganito|234,56\n"
+msgstr ""
+"\tKunde|Betrag\n"
+"\tFulanito|134,34\n"
+"\tMenganito|234,56\n"
+"\tMenganito|234,56\n"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"\t\\[[!table class=\"book_record\" format=csv "
+"file=\"data/books/record1\"]]\n"
+msgstr ""
+"\t\\[[!table class=\"book_record\" format=csv "
+"file=\"data/books/record1\"]]\n"
+
+#. type: Plain text
+msgid "In this second example the `record1` page should be similar to:"
+msgstr ""
+"Im zweiten Beispiel sollte die `record1`-Seite ähnlich wie das Folgende "
+"aussehen:"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"\t\"Title\",\"Perl Best Practices\"\n"
+"\t\"Author\",\"Damian Conway\"\n"
+"\t\"Publisher\",\"O’Reilly\"\n"
+msgstr ""
+"\t\"Title\",\"Perl Best Practices\"\n"
+"\t\"Author\",\"Damian Conway\"\n"
+"\t\"Publisher\",\"O’Reilly\"\n"
+
+#. type: Plain text
+msgid ""
+"To make a cell span multiple columns, follow it with one or more empty "
+"cells. For example:"
+msgstr ""
+"Um eine Zelle zu erhalten, die über mehrere Spalten geht, kann man die "
+"folgenden Zellen leer lassen. Zum Beispiel:"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"\tleft||right|\n"
+"\ta|b|c|d\n"
+"\tthis cell spans 4 columns|||\n"
+msgstr ""
+"\tlinks||rechts|\n"
+"\ta|b|c|d\n"
+"\tdiese Zelle geht über 4 Spalten|||\n"
+
+#. type: Title ##
+#, no-wrap
+msgid "usage"
+msgstr "Verwendung"
+
+#. type: Bullet: '* '
+msgid "`data` - Values for the table."
+msgstr "`data` - Werte für die Tabelle."
+
+#. type: Bullet: '* '
+msgid "`file` - A file in the wiki containing the data."
+msgstr "`file` - Eine Datei im Wiki, die die Daten enthält."
+
+#. type: Bullet: '* '
+msgid ""
+"`format` - The format of the data, either \"csv\", \"dsv\", or \"auto\" (the "
+"default)."
+msgstr ""
+"`format` - Das Format der Daten, entweder `csv`, `dsv` oder `auto` "
+"(letzteres ist voreingestellt)."
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"* `delimiter` - The character used to separate fields. By default,\n"
+"   DSV format uses a pipe (`|`), and CSV uses a comma (`,`).\n"
+"* `class` - A CSS class for the table html element.\n"
+"* `header` - By default, or if set to \"row\", the first data line is used\n"
+"  as the table header. Set it to \"no\" to make a table without a header, "
+"or\n"
+"  \"column\" to make the first column be the header.\n"
+msgstr ""
+"* `delimiter` - Das Zeichen, durch das die Zellen getrennt werden.\n"
+"  Im DSV-Format ist der senkrechte Strich (`|`) voreingestellt, im\n"
+"  CSV-Format das Komma (`,`).\n"
+"* `class` - Eine CSS-Klasse für das HTML-Element &lt;table&gt;.\n"
+"* `header` - In der Voreinstellung, oder wenn `row` angegeben wird,\n"
+"  wird die erste Zeile der Daten als Tabellenüberschrift verwendet.\n"
+"  Mit `no` wird eine Tabelle ohne Überschrift erzeugt, mit `column`\n"
+"  wird die erste Spalte als Überschrift verwendet.\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!meta robots=\"noindex, follow\"]]\n"
+msgstr "[[!meta robots=\"noindex, follow\"]]\n"
+
+
diff --git a/po/underlays/directives/ikiwiki/directive/tag.de.po b/po/underlays/directives/ikiwiki/directive/tag.de.po
new file mode 100644 (file)
index 0000000..b33c3bc
--- /dev/null
@@ -0,0 +1,112 @@
+# German translation of directives/ikiwiki/directive/tag page for ikiwiki.
+# Copyright © 2010 Sebastian Kuhnert <mail@sebastian-kuhnert.de>
+# Redistribution and use in source and compiled forms, with or without
+# modification, are permitted under any circumstances. No warranty.
+msgid ""
+msgstr ""
+"POT-Creation-Date: 2010-03-12 09:29+0530\n"
+"PO-Revision-Date: 2010-03-14 14:08+0530\n"
+"Last-Translator: Sebastian Kuhnert <mail@sebastian-kuhnert.de>\n"
+"Language-Team: None\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#. type: Plain text
+msgid ""
+"The `tag` and `taglink` directives are supplied by the [[!iki plugins/tag "
+"desc=tag]] plugin."
+msgstr ""
+"Die `tag`- und `taglink`-Anweisungen werden durch die [[!iki plugins/tag "
+"desc=tag]]-Erweiterung bereitgestellt."
+
+#. type: Plain text
+msgid "These directives allow tagging pages. List tags as follows:"
+msgstr ""
+"Diese Anweisungen erlauben es, Seiten mit einer Markierung (englisch *tag*) "
+"zu versehen. Diese werden wie folgt angegeben:"
+
+#. type: Plain text
+#, no-wrap
+msgid "\t\\[[!tag tech life linux]]\n"
+msgstr "\t\\[[!tag tech life linux]]\n"
+
+#. type: Plain text
+msgid ""
+"The tags work the same as if you had put a (hidden) [[ikiwiki/WikiLink]] on "
+"the page for each tag, so you can use a [[ikiwiki/PageSpec]] match all pages "
+"that are tagged with a given tag, for example. The tags will also show up on "
+"blog entries and at the bottom of the tagged pages, as well as in RSS and "
+"Atom feeds."
+msgstr ""
+"Die Markierungen verhalten sich genauso, wie wenn ein (versteckter) "
+"[[ikiwiki/WikiLink]] für jede Markierung vorhanden wäre. Man kann also zum "
+"Beispiel eine [[ikiwiki/PageSpec]] verwenden, um alle Seiten zu erfassen, "
+"die eine bestimmte Markierung tragen. In Blogeinträgen werden die "
+"Markierungen auch am Ende der markierten Seiten und in RSS- und Atom-Feeds "
+"angezeigt."
+
+#. type: Plain text
+msgid ""
+"If you want a visible [[ikiwiki/WikiLink]] along with the tag, use taglink "
+"instead:"
+msgstr ""
+"Wenn gleichzeitig mit dem Tag ein sichtbarer [[ikiwiki/WikiLink]] erzeugt "
+"werden soll, kann stattdessen `taglink` verwendet werden:"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"\t\\[[!taglink foo]]\n"
+"\t\\[[!taglink tagged_as_foo|foo]]\n"
+msgstr ""
+"\t\\[[!taglink foo]]\n"
+"\t\\[[!taglink markiert_als_foo|foo]]\n"
+
+#. type: Plain text
+msgid ""
+"Note that if the wiki is configured to use a tagbase, then the tags will be "
+"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."
+msgstr ""
+"Wenn im Wiki eine zu verwendende `tagbase` konfiguriert ist, tauchen die "
+"Markierungen unterhalb dieses Verzeichnisses auf, etwa unter \"tags/\". Auf "
+"diese Weise muss man nicht den kompletten Pfad zu den Markierungen angeben, "
+"wenn man sie gruppieren und getrennt von den restlichen Seiten halten will."
+
+#. type: Plain text
+msgid ""
+"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)`."
+msgstr ""
+"In der `link()`-[[ikiwiki/PageSpec]] muss diese `tagbase` allerdings "
+"angegeben werden. Wenn zum Beispiel `tag` als `tagbase` verwendet wird, "
+"können die mit \"foo\" markierten Seiten durch `link(tag/foo)` ausgewählt "
+"werden."
+
+#. type: Plain text
+msgid ""
+"If you want to override the tagbase for a particular tag, you can use "
+"something like this:"
+msgstr ""
+"Wenn für eine einzelne Markierung eine abweichende `tagbase` verwendet "
+"werden soll, kann etwas wie das Folgende verwendet werden:"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"\t\\[[!tag ./foo]]\n"
+"\t\\[[!taglink /foo]]\n"
+msgstr ""
+"\t\\[[!tag ./foo]]\n"
+"\t\\[[!taglink /foo]]\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!meta robots=\"noindex, follow\"]]\n"
+msgstr "[[!meta robots=\"noindex, follow\"]]\n"
+
+
diff --git a/po/underlays/directives/ikiwiki/directive/taglink.de.po b/po/underlays/directives/ikiwiki/directive/taglink.de.po
new file mode 100644 (file)
index 0000000..4ae84ec
--- /dev/null
@@ -0,0 +1,25 @@
+# German translation of directives/ikiwiki/directive/taglink page for ikiwiki.
+# Copyright © 2010 Sebastian Kuhnert <mail@sebastian-kuhnert.de>
+# Redistribution and use in source and compiled forms, with or without
+# modification, are permitted under any circumstances. No warranty.
+msgid ""
+msgstr ""
+"POT-Creation-Date: 2010-03-12 09:29+0530\n"
+"PO-Revision-Date: 2010-03-14 11:31+0530\n"
+"Last-Translator: Sebastian Kuhnert <mail@sebastian-kuhnert.de>\n"
+"Language-Team: None\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!meta redir=/ikiwiki/directive/tag]]\n"
+msgstr "[[!meta redir=/ikiwiki/directive/tag]]\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!meta robots=\"noindex, follow\"]]\n"
+msgstr "[[!meta robots=\"noindex, follow\"]]\n"
+
diff --git a/po/underlays/directives/ikiwiki/directive/template.de.po b/po/underlays/directives/ikiwiki/directive/template.de.po
new file mode 100644 (file)
index 0000000..faa2be6
--- /dev/null
@@ -0,0 +1,71 @@
+# German translation of directives/ikiwiki/directive/template page for ikiwiki.
+# Copyright © 2010 Sebastian Kuhnert <mail@sebastian-kuhnert.de>
+# Redistribution and use in source and compiled forms, with or without
+# modification, are permitted under any circumstances. No warranty.
+msgid ""
+msgstr ""
+"POT-Creation-Date: 2010-03-12 09:29+0530\n"
+"PO-Revision-Date: 2010-03-14 14:09+0530\n"
+"Last-Translator: Sebastian Kuhnert <mail@sebastian-kuhnert.de>\n"
+"Language-Team: None\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#. type: Plain text
+msgid ""
+"The `template` directive is supplied by the [[!iki plugins/template "
+"desc=template]] plugin."
+msgstr ""
+"Die `template`-Anweisung wird durch die [[!iki plugins/template "
+"desc=template]]-Erweiterung bereitgestellt."
+
+#. type: Plain text
+msgid ""
+"[[Templates]] are files that can be filled out and inserted into pages in "
+"the wiki, by using the template directive. The directive has an `id` "
+"parameter that identifies the template to use. The remaining parameters are "
+"used to fill out the template."
+msgstr ""
+"[[Vorlagen|templates]] sind Dateien, die ausgefüllt und in Wiki-Seiten "
+"eingefügt werden können, indem die template-Anweisung verwendet wird. Die "
+"Anweisung hat einen `id`-Parameter, der die zu verwendende Vorlage "
+"identifiziert. Die restlichen Parameter werden verwendet, um die Vorlage "
+"auszufüllen."
+
+#. type: Plain text
+msgid "Example:"
+msgstr "Beispiel:"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"\t\\[[!template id=note text=\"\"\"Here is the text to insert into my "
+"note.\"\"\"]]\n"
+msgstr ""
+"\t\\[[!template id=note text=\"\"\"Hier ist der Text, der in meine Notiz "
+"eingefügt werden soll.\"\"\"]]\n"
+
+#. type: Plain text
+msgid ""
+"This fills out the `note` template, filling in the `text` field with the "
+"specified value, and inserts the result into the page."
+msgstr ""
+"Dies füllt die Vorlage `note` aus, wobei das Feld `text` mit dem angegebenen "
+"Wert gefüllt wird, und fügt das Ergebnis in die Seite ein."
+
+#. type: Plain text
+msgid ""
+"For a list of available templates, and details about how to create more, see "
+"the [[templates]] page."
+msgstr ""
+"Auf der [[Vorlagen|templates]]-Seite gibt es eine Liste der verfügbaren "
+"Vorlagen und auch eine Anleitung, wie weitere angelegt werden können."
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!meta robots=\"noindex, follow\"]]\n"
+msgstr "[[!meta robots=\"noindex, follow\"]]\n"
+
+
diff --git a/po/underlays/directives/ikiwiki/directive/testpagespec.de.po b/po/underlays/directives/ikiwiki/directive/testpagespec.de.po
new file mode 100644 (file)
index 0000000..f936d7e
--- /dev/null
@@ -0,0 +1,84 @@
+# German translation of directives/ikiwiki/directive/testpagespec page for ikiwiki.
+# Copyright © 2010 Sebastian Kuhnert <mail@sebastian-kuhnert.de>
+# Redistribution and use in source and compiled forms, with or without
+# modification, are permitted under any circumstances. No warranty.
+msgid ""
+msgstr ""
+"POT-Creation-Date: 2010-03-12 09:29+0530\n"
+"PO-Revision-Date: 2010-03-14 14:09+0530\n"
+"Last-Translator: Sebastian Kuhnert <mail@sebastian-kuhnert.de>\n"
+"Language-Team: None\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#. type: Plain text
+msgid ""
+"The `testpagespec` directive is supplied by the [[!iki plugins/testpagespec "
+"desc=testpagespec]] plugin."
+msgstr ""
+"Die `testpagespec`-Anweisung wird durch die [[!iki plugins/testpagespec "
+"desc=testpagespec]]-Erweiterung bereitgestellt."
+
+#. type: Plain text
+msgid ""
+"This directive allows testing a [[ikiwiki/PageSpec]] to see if it matches a "
+"page, and to see the part that matches, or causes the match to fail."
+msgstr ""
+"Mit dieser Anweisung kann geprüft werden, ob eine [[ikiwiki/PageSpec]] auf eine "
+"Seite passt. Sie zeigt außerdem an, welcher Teil das Passen oder Nicht-Passen "
+"verursacht."
+
+#. type: Plain text
+msgid "Example uses:"
+msgstr "Beispiele zur Verwendung:"
+
+#. type: Plain text
+#, no-wrap
+msgid "\t\\[[!testpagespec pagespec=\"foopage and barpage\" match=\"foopage\"]]\n"
+msgstr ""
+"\t\\[[!testpagespec pagespec=\"foopage and barpage\" match=\"foopage\"]]\n"
+
+#. type: Plain text
+msgid ""
+"This will print out something like \"no match: barpage does not match "
+"foopage\", highlighting which part of the [[ikiwiki/PageSpec]] is causing "
+"the match to fail."
+msgstr ""
+"Dies wird etwas wie \"no match: barpage does not match foopage\" anzeigen und "
+"damit darauf hinweisen, welcher Teil der [[ikiwiki/PageSpec]] ein Passen "
+"verhindert."
+
+#. type: Plain text
+#, no-wrap
+msgid "\t\\[[!testpagespec pagespec=\"foopage or !bar*\" match=\"barpage\"]]\n"
+msgstr "\t\\[[!testpagespec pagespec=\"foopage or !bar*\" match=\"barpage\"]]\n"
+
+#. type: Plain text
+msgid ""
+"This will print out something like \"no match: bar* matches barpage\", since "
+"the part of the [[ikiwiki/PageSpec]] that fails is this negated match."
+msgstr ""
+"Dies wird etwas wie \"no match: bar* matches barpage\" anzeigen, weil der Teil "
+"der das Passen verhindert negiert ist."
+
+#. type: Plain text
+#, no-wrap
+msgid "\t\\[[!testpagespec pagespec=\"foopage or barpage\" match=\"barpage\"]]\n"
+msgstr "\t\\[[!testpagespec pagespec=\"foopage or barpage\" match=\"barpage\"]]\n"
+
+#. type: Plain text
+msgid ""
+"This will print out something like \"match: barpage matches barpage\", "
+"indicating the part of the [[ikiwiki/PageSpec]] that caused it to match."
+msgstr ""
+"Dies wird etwas wie \"match: barpage matches barpage\" anzeigen und damit "
+"angeben, welcher Teil der [[ikiwiki/PageSpec]] passt."
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!meta robots=\"noindex, follow\"]]\n"
+msgstr "[[!meta robots=\"noindex, follow\"]]\n"
+
+
diff --git a/po/underlays/directives/ikiwiki/directive/teximg.de.po b/po/underlays/directives/ikiwiki/directive/teximg.de.po
new file mode 100644 (file)
index 0000000..fc2ffab
--- /dev/null
@@ -0,0 +1,84 @@
+# German translation of directives/ikiwiki/directive/teximg page for ikiwiki.
+# Copyright © 2010 Sebastian Kuhnert <mail@sebastian-kuhnert.de>
+# Redistribution and use in source and compiled forms, with or without
+# modification, are permitted under any circumstances. No warranty.
+msgid ""
+msgstr ""
+"POT-Creation-Date: 2010-03-12 09:29+0530\n"
+"PO-Revision-Date: 2010-03-14 14:09+0530\n"
+"Last-Translator: Sebastian Kuhnert <mail@sebastian-kuhnert.de>\n"
+"Language-Team: None\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#. type: Plain text
+msgid ""
+"The `teximg` directive is supplied by the [[!iki plugins/teximg "
+"desc=teximg]] plugin."
+msgstr ""
+"Die `teximg`-Anweisung wird durch die [[!iki plugins/teximg "
+"desc=teximg]]-Erweiterung bereitgestellt."
+
+#. type: Plain text
+msgid "This directive renders LaTeX formulas into images."
+msgstr "Diese Anweisung wandelt LaTeX-Formeln in Bilder um."
+
+#. type: Title ##
+#, no-wrap
+msgid "examples"
+msgstr "Beispiele"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"\t\\[[!teximg code=\"\\frac{1}{2}\"]]\n"
+"\t\\[[!teximg code=\"E = - \\frac{Z^2 \\cdot  \\mu \\cdot e^4}{32\\pi^2 "
+"\\epsilon_0^2 \\hbar^2 n^2}\" ]]\n"
+msgstr ""
+"\t\\[[!teximg code=\"\\frac{1}{2}\"]]\n"
+"\t\\[[!teximg code=\"E = - \\frac{Z^2 \\cdot  \\mu \\cdot e^4}{32\\pi^2 "
+"\\epsilon_0^2 \\hbar^2 n^2}\" ]]\n"
+
+#. type: Plain text
+msgid "To scale the image, use height=x:"
+msgstr ""
+"Um die Größe des Bilds zu verändern, kann `height=y` angegeben werden:"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"\t\\[[!teximg code=\"\\frac{1}{2}\" height=\"17\"]]\n"
+"\t\\[[!teximg code=\"\\frac{1}{2}\" height=\"8\"]]\n"
+msgstr ""
+"\t\\[[!teximg code=\"\\frac{1}{2}\" height=\"17\"]]\n"
+"\t\\[[!teximg code=\"\\frac{1}{2}\" height=\"8\"]]\n"
+
+#. type: Plain text
+msgid ""
+"If no height is chosen the default height 12 is used. Valid heights are: 8, "
+"9, 10, 11, 12, 14, 17, 20. If another height is entered, the closest "
+"available height is used."
+msgstr ""
+"Wenn keine Höhe angegeben wird, wird 12 verwendet. Zulässige Höhen sind 8, "
+"9, 10, 11, 12, 14, 17 und 20. Wird eine andere Höhe angegeben, wird "
+"stattdessen die nächste zulässige verwendet."
+
+#. type: Plain text
+msgid "To add an alt text to the image, use alt=\"text\":"
+msgstr ""
+"Um einen `alt`-Text zu dem Bild hinzuzufügen, kann `alt=\"Text\"` verwendet "
+"werden:"
+
+#. type: Plain text
+#, no-wrap
+msgid "\t\\[[!teximg code=\"\\frac{1}{2}\" alt=\"1/2\"]]\n"
+msgstr "\t\\[[!teximg code=\"\\frac{1}{2}\" alt=\"1/2\"]]\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!meta robots=\"noindex, follow\"]]\n"
+msgstr "[[!meta robots=\"noindex, follow\"]]\n"
+
+
diff --git a/po/underlays/directives/ikiwiki/directive/toc.de.po b/po/underlays/directives/ikiwiki/directive/toc.de.po
new file mode 100644 (file)
index 0000000..55906e0
--- /dev/null
@@ -0,0 +1,85 @@
+# German translation of directives/ikiwiki/directive/toc page for ikiwiki.
+# Copyright © 2010 Sebastian Kuhnert <mail@sebastian-kuhnert.de>
+# Redistribution and use in source and compiled forms, with or without
+# modification, are permitted under any circumstances. No warranty.
+msgid ""
+msgstr ""
+"POT-Creation-Date: 2010-03-12 09:29+0530\n"
+"PO-Revision-Date: 2010-03-14 14:10+0530\n"
+"Last-Translator: Sebastian Kuhnert <mail@sebastian-kuhnert.de>\n"
+"Language-Team: None\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#. type: Plain text
+msgid "The `toc` directive is supplied by the [[!iki plugins/toc desc=toc]] plugin."
+msgstr ""
+"Die `toc`-Anweisung wird durch die [[!iki plugins/toc desc=toc]]-Erweiterung "
+"bereitgestellt."
+
+#. type: Plain text
+msgid "Add a table of contents to a page:"
+msgstr "Sie fügt ein Inhaltsverzeichnis in eine Seite ein:"
+
+#. type: Plain text
+#, no-wrap
+msgid "\t\\[[!toc ]]\n"
+msgstr "\t\\[[!toc ]]\n"
+
+#. type: Plain text
+msgid ""
+"The table of contents will be automatically generated based on the headers "
+"of the page. By default only the largest headers present on the page will be "
+"shown; to control how many levels of headers are shown, use the `levels` "
+"parameter:"
+msgstr ""
+"Das Inhaltsverzeichnis wird automatisch ausgehend von den Überschriften der Seite "
+"erzeugt. In der Voreinstellung werden nur die größten Überschriften der Seite "
+"angezeigt; mit dem Parameter `levels` kann aber die Anzahl der angezeigten "
+"Überschriftsebenen gesteuert werden:"
+
+#. type: Plain text
+#, no-wrap
+msgid "\t\\[[!toc levels=2]]\n"
+msgstr "\t\\[[!toc levels=2]]\n"
+
+#. type: Plain text
+msgid ""
+"The toc directive will take the level of the first header as the topmost "
+"level, even if there are higher levels seen later in the file."
+msgstr ""
+"Die `toc`-Anweisung verwendet die Ebene der ersten Überschrift als die oberste, "
+"selbst wenn es weiter unten in der Datei höhere Überschriften gibt."
+
+#. type: Plain text
+msgid ""
+"To create a table of contents that only shows headers starting with a given "
+"level, use the `startlevel` parameter. For example, to show only h2 and "
+"smaller headers:"
+msgstr ""
+"Um in einem Inhaltsverzeichnis nur die Überschriften beginnend mit einer "
+"bestimmten Ebene anzuzeigen, kann der `startlevel`-Parameter verwendet werden. "
+"Zum Beispiel, um nur &lt;h2&gt;- und kleinere Überschriften anzuzeigen:"
+
+#. type: Plain text
+#, no-wrap
+msgid "\t\\[[!toc startlevel=2]]\n"
+msgstr "\t\\[[!toc startlevel=2]]\n"
+
+#. type: Plain text
+msgid ""
+"The table of contents will be created as an ordered list. If you want an "
+"unordered list instead, you can change the list-style in your local style "
+"sheet."
+msgstr ""
+"Das Inhaltsverzeichnis wird als nummerierte Liste erzeugt. Um eine ungeordnete "
+"Liste zu erhalten, kann `list-style` im lokalen Stylesheet verändert werden."
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!meta robots=\"noindex, follow\"]]\n"
+msgstr "[[!meta robots=\"noindex, follow\"]]\n"
+
+
diff --git a/po/underlays/directives/ikiwiki/directive/toggle.de.po b/po/underlays/directives/ikiwiki/directive/toggle.de.po
new file mode 100644 (file)
index 0000000..5cb83aa
--- /dev/null
@@ -0,0 +1,113 @@
+# German translation of directives/ikiwiki/directive/toggle page for ikiwiki.
+# Copyright © 2010 Sebastian Kuhnert <mail@sebastian-kuhnert.de>
+# Redistribution and use in source and compiled forms, with or without
+# modification, are permitted under any circumstances. No warranty.
+msgid ""
+msgstr ""
+"POT-Creation-Date: 2010-03-12 09:29+0530\n"
+"PO-Revision-Date: 2010-03-14 14:10+0530\n"
+"Last-Translator: Sebastian Kuhnert <mail@sebastian-kuhnert.de>\n"
+"Language-Team: None\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#. type: Plain text
+msgid ""
+"The `toggle` and `toggleable` directives are supplied by the [[!iki "
+"plugins/toggle desc=toggle]] plugin."
+msgstr ""
+"Die `toggle`- und `toggleable`-Anweisungen werden durch die [[!iki "
+"plugins/toggle desc=toggle]]-Erweiterung bereitgestellt."
+
+#. type: Plain text
+msgid ""
+"With these directives you can create links on pages that, when clicked, "
+"toggle display of other parts of the page."
+msgstr ""
+"Mit diesen Anweisungen kann man auf Seiten Links erstellen, die beim "
+"Anklicken andere Teile der Seite anzeigen."
+
+#. type: Plain text
+msgid ""
+"It uses javascript to accomplish this; browsers without javascript will "
+"always see the full page content."
+msgstr ""
+"Um dies zu erreichen, wird Javascript verwendet; Browser ohne Javascript "
+"sehen immer den kompletten Inhalt."
+
+#. type: Plain text
+msgid "Example use:"
+msgstr "Beispiel für die Benutzung:"
+
+#. type: Plain text
+#, no-wrap
+msgid "\t\\[[!toggle id=\"ipsum\" text=\"show\"]]\n"
+msgstr "\t\\[[!toggle id=\"ipsum\" text=\"anzeigen\"]]\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "\t\\[[!toggleable id=\"ipsum\" text=\"\"\"\n"
+msgstr "\t\\[[!toggleable id=\"ipsum\" text=\"\"\"\n"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"\tLorem ipsum dolor sit amet, consectetur adipisicing elit, sed do\n"
+"\teiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim\n"
+"\tad minim veniam, quis nostrud exercitation ullamco laboris nisi ut\n"
+"\taliquip ex ea commodo consequat.\n"
+msgstr ""
+"\tLorem ipsum dolor sit amet, consectetur adipisicing elit, sed do\n"
+"\teiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim\n"
+"\tad minim veniam, quis nostrud exercitation ullamco laboris nisi ut\n"
+"\taliquip ex ea commodo consequat.\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "\t[[!toggle id=\"ipsum\" text=\"hide\"]]\n"
+msgstr "\t[[!toggle id=\"ipsum\" text=\"verbergen\"]]\n"
+
+#. type: Plain text
+msgid ""
+"Note that you can include wiki markup in the toggleable text, including even "
+"additional toggles, as shown in the above example."
+msgstr ""
+"In dem umschaltbaren Text können beliebige Wiki-Formatierungen verwendet "
+"werden, sogar wie im obigen Beispiel weitere `toggle`-Anweisungen."
+
+#. type: Plain text
+msgid ""
+"Also, the toggle and the togglable definitions do not need to be next to "
+"each other, but can be located anywhere on the page. There can also be "
+"mutiple toggles that all toggle a single togglable."
+msgstr ""
+"Außerdem müssen die Definitionen von `toggle` und `toggleable` nicht "
+"nebeneinander stehen, sondern können beliebig über die Seite verteilt werden."
+" Es kann auch mehrere `toggle` geben, die das gleiche `toggleable` "
+"umschalten."
+
+#. type: Plain text
+msgid ""
+"The id has a default value of \"default\", so can be omitted in simple "
+"cases."
+msgstr ""
+"Als `id` ist \"default\" voreingestellt, sodass diese Angabe in einfachen "
+"Fällen weggelassen werden kann."
+
+#. type: Plain text
+msgid ""
+"If you'd like a toggleable to be displayed by default, and toggle to hidden, "
+"then pass a parameter \"open=yes\" when setting up the toggleable."
+msgstr ""
+"Wenn ein `toggleable` zu Beginn angezeigt werden soll (um es dann verbergen "
+"zu können), kann bei seiner Einrichtung der Parameter `open=yes` angegeben "
+"werden."
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!meta robots=\"noindex, follow\"]]\n"
+msgstr "[[!meta robots=\"noindex, follow\"]]\n"
+
+
diff --git a/po/underlays/directives/ikiwiki/directive/toggleable.de.po b/po/underlays/directives/ikiwiki/directive/toggleable.de.po
new file mode 100644 (file)
index 0000000..03fe46f
--- /dev/null
@@ -0,0 +1,25 @@
+# German translation of directives/ikiwiki/directive/toggleable page for ikiwiki.
+# Copyright © 2010 Sebastian Kuhnert <mail@sebastian-kuhnert.de>
+# Redistribution and use in source and compiled forms, with or without
+# modification, are permitted under any circumstances. No warranty.
+msgid ""
+msgstr ""
+"POT-Creation-Date: 2010-03-12 09:29+0530\n"
+"PO-Revision-Date: 2010-03-14 11:52+0530\n"
+"Last-Translator: Sebastian Kuhnert <mail@sebastian-kuhnert.de>\n"
+"Language-Team: None\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!meta redir=/ikiwiki/directive/toggle]]\n"
+msgstr "[[!meta redir=/ikiwiki/directive/toggle]]\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!meta robots=\"noindex, follow\"]]\n"
+msgstr "[[!meta robots=\"noindex, follow\"]]\n"
+
diff --git a/po/underlays/directives/ikiwiki/directive/version.de.po b/po/underlays/directives/ikiwiki/directive/version.de.po
new file mode 100644 (file)
index 0000000..7080a1a
--- /dev/null
@@ -0,0 +1,50 @@
+# German translation of directives/ikiwiki/directive/version page for ikiwiki.
+# Copyright © 2010 Sebastian Kuhnert <mail@sebastian-kuhnert.de>
+# Redistribution and use in source and compiled forms, with or without
+# modification, are permitted under any circumstances. No warranty.
+msgid ""
+msgstr ""
+"POT-Creation-Date: 2010-03-12 09:29+0530\n"
+"PO-Revision-Date: 2010-03-14 14:11+0530\n"
+"Last-Translator: Sebastian Kuhnert <mail@sebastian-kuhnert.de>\n"
+"Language-Team: None\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#. type: Plain text
+msgid ""
+"The `version` directive is supplied by the [[!iki plugins/version "
+"desc=version]] plugin."
+msgstr ""
+"Die `version`-Anweisung wird durch die [[!iki plugins/version "
+"desc=version]]-Erweiterung bereitgestellt."
+
+#. type: Plain text
+msgid "This directive allows inserting the version of ikiwiki onto a page."
+msgstr "Diese Anweisung fügt die Version von ikiwiki in eine Seite ein."
+
+#. type: Plain text
+msgid ""
+"Whenever ikiwiki is upgraded to a new version, the page will be rebuilt, "
+"updating the version number."
+msgstr ""
+"Immer wenn ikiwiki auf eine neue Version aktualisiert wird, wird diese "
+"Seite erneuert, um die Versionsnummer zu aktualisieren."
+
+#. type: Plain text
+msgid "Use is simple:"
+msgstr "Die Verwendung ist einfach:"
+
+#. type: Plain text
+#, no-wrap
+msgid "\t\\[[!version ]]\n"
+msgstr "\t\\[[!version ]]\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!meta robots=\"noindex, follow\"]]\n"
+msgstr "[[!meta robots=\"noindex, follow\"]]\n"
+
+
diff --git a/po/underlays/smiley/smileys.de.po b/po/underlays/smiley/smileys.de.po
new file mode 100644 (file)
index 0000000..35ae5b9
--- /dev/null
@@ -0,0 +1,211 @@
+# German translation of smiley/smileys page for ikiwiki.
+# Copyright © 2010 Sebastian Kuhnert <mail@sebastian-kuhnert.de>
+# Redistribution and use in source and compiled forms, with or without
+# modification, are permitted under any circumstances. No warranty.
+msgid ""
+msgstr ""
+"POT-Creation-Date: 2010-03-12 09:29+0530\n"
+"PO-Revision-Date: 2010-03-12 20:57+0530\n"
+"Last-Translator: Sebastian Kuhnert <mail@sebastian-kuhnert.de>\n"
+"Language-Team: None\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#. type: Plain text
+msgid ""
+"This page is used to control what smileys are supported by the wiki.  Just "
+"write the text of a smiley to display it."
+msgstr ""
+"Diese Seite steuert, welche Smileys von ikiwiki unterstützt werden. "
+"Schreibe einfach den Text eines Smileys in den Text, um es anzuzeigen."
+
+#. type: Bullet: '* '
+msgid "\\\\:)\t[[smileys/smile.png]]"
+msgstr "\\\\:)\t[[smileys/smile.png]]"
+
+#. type: Bullet: '* '
+msgid "\\\\:-)\t[[smileys/smile.png]]"
+msgstr "\\\\:-)\t[[smileys/smile.png]]"
+
+#. type: Bullet: '* '
+msgid "\\\\:D\t[[smileys/biggrin.png]]"
+msgstr "\\\\:D\t[[smileys/biggrin.png]]"
+
+#. type: Bullet: '* '
+msgid "\\\\:-D\t[[smileys/biggrin.png]]"
+msgstr "\\\\:-D\t[[smileys/biggrin.png]]"
+
+#. type: Bullet: '* '
+msgid "\\\\B)\t[[smileys/smile2.png]]"
+msgstr "\\\\B)\t[[smileys/smile2.png]]"
+
+#. type: Bullet: '* '
+msgid "\\\\B-)\t[[smileys/smile2.png]]"
+msgstr "\\\\B-)\t[[smileys/smile2.png]]"
+
+#. type: Bullet: '* '
+msgid "\\\\:))\t[[smileys/smile3.png]]"
+msgstr "\\\\:))\t[[smileys/smile3.png]]"
+
+#. type: Bullet: '* '
+msgid "\\\\:-))\t[[smileys/smile3.png]]"
+msgstr "\\\\:-))\t[[smileys/smile3.png]]"
+
+#. type: Bullet: '* '
+msgid "\\\\;)\t[[smileys/smile4.png]]"
+msgstr "\\\\;)\t[[smileys/smile4.png]]"
+
+#. type: Bullet: '* '
+msgid "\\\\;-)\t[[smileys/smile4.png]]"
+msgstr "\\\\;-)\t[[smileys/smile4.png]]"
+
+#. type: Bullet: '* '
+msgid "\\\\:\\\t[[smileys/ohwell.png]]"
+msgstr "\\\\:\\\t[[smileys/ohwell.png]]"
+
+#. type: Bullet: '* '
+msgid "\\\\:-\\\t[[smileys/ohwell.png]]"
+msgstr "\\\\:-\\\t[[smileys/ohwell.png]]"
+
+#. type: Bullet: '* '
+msgid "\\\\:/\t[[smileys/ohwell.png]]"
+msgstr "\\\\:/\t[[smileys/ohwell.png]]"
+
+#. type: Bullet: '* '
+msgid "\\\\:-/\t[[smileys/ohwell.png]]"
+msgstr "\\\\:-/\t[[smileys/ohwell.png]]"
+
+#. type: Bullet: '* '
+msgid "\\\\:|\t[[smileys/neutral.png]]"
+msgstr "\\\\:|\t[[smileys/neutral.png]]"
+
+#. type: Bullet: '* '
+msgid "\\\\:-|\t[[smileys/neutral.png]]"
+msgstr "\\\\:-|\t[[smileys/neutral.png]]"
+
+#. type: Bullet: '* '
+msgid "\\\\>:>\t[[smileys/devil.png]]"
+msgstr "\\\\>:>\t[[smileys/devil.png]]"
+
+#. type: Bullet: '* '
+msgid "\\\\X-(\t[[smileys/angry.png]]"
+msgstr "\\\\X-(\t[[smileys/angry.png]]"
+
+#. type: Bullet: '* '
+msgid "\\\\<:(\t[[smileys/frown.png]]"
+msgstr "\\\\<:(\t[[smileys/frown.png]]"
+
+#. type: Bullet: '* '
+msgid "\\\\:(\t[[smileys/sad.png]]"
+msgstr "\\\\:(\t[[smileys/sad.png]]"
+
+#. type: Bullet: '* '
+msgid "\\\\:-(\t[[smileys/sad.png]]"
+msgstr "\\\\:-(\t[[smileys/sad.png]]"
+
+#. type: Bullet: '* '
+msgid "\\\\:-?\t[[smileys/tongue.png]]"
+msgstr "\\\\:-?\t[[smileys/tongue.png]]"
+
+#. type: Bullet: '* '
+msgid "\\\\:-P\t[[smileys/tongue.png]]"
+msgstr "\\\\:-P\t[[smileys/tongue.png]]"
+
+#. type: Bullet: '* '
+msgid "\\\\:o\t[[smileys/redface.png]]"
+msgstr "\\\\:o\t[[smileys/redface.png]]"
+
+#. type: Bullet: '* '
+msgid "\\\\|)\t[[smileys/tired.png]]"
+msgstr "\\\\|)\t[[smileys/tired.png]]"
+
+#. type: Bullet: '* '
+msgid "\\\\|-)\t[[smileys/tired.png]]"
+msgstr "\\\\|-)\t[[smileys/tired.png]]"
+
+#. type: Bullet: '* '
+msgid "\\\\{OK}\t[[smileys/thumbs-up.png]]"
+msgstr "\\\\{OK}\t[[smileys/thumbs-up.png]]"
+
+#. type: Bullet: '* '
+msgid "\\\\{X}\t[[smileys/icon-error.png]]"
+msgstr "\\\\{X}\t[[smileys/icon-error.png]]"
+
+#. type: Bullet: '* '
+msgid "\\\\{i}\t[[smileys/icon-info.png]]"
+msgstr "\\\\{i}\t[[smileys/icon-info.png]]"
+
+#. type: Bullet: '* '
+msgid "\\\\(./)\t[[smileys/checkmark.png]]"
+msgstr "\\\\(./)\t[[smileys/checkmark.png]]"
+
+#. type: Bullet: '* '
+msgid "\\\\(!)\t[[smileys/idea.png]]"
+msgstr "\\\\(!)\t[[smileys/idea.png]]"
+
+#. type: Bullet: '* '
+msgid "\\\\[!]\t[[smileys/attention.png]]"
+msgstr "\\\\[!]\t[[smileys/attention.png]]"
+
+#. type: Bullet: '* '
+msgid "\\\\/!\\\t[[smileys/alert.png]]"
+msgstr "\\\\/!\\\t[[smileys/alert.png]]"
+
+#. type: Bullet: '* '
+msgid "\\\\(?)\t[[smileys/question.png]]"
+msgstr "\\\\(?)\t[[smileys/question.png]]"
+
+#. type: Bullet: '* '
+msgid "\\\\{x}\t[[smileys/star_on.png]]"
+msgstr "\\\\{x}\t[[smileys/star_on.png]]"
+
+#. type: Bullet: '* '
+msgid "\\\\{*}\t[[smileys/star_on.png]]"
+msgstr "\\\\{*}\t[[smileys/star_on.png]]"
+
+#. type: Bullet: '* '
+msgid "\\\\{o}\t[[smileys/star_off.png]]"
+msgstr "\\\\{o}\t[[smileys/star_off.png]]"
+
+#. type: Bullet: '* '
+msgid "\\\\{1}\t[[smileys/prio1.png]]"
+msgstr "\\\\{1}\t[[smileys/prio1.png]]"
+
+#. type: Bullet: '* '
+msgid "\\\\{2}\t[[smileys/prio2.png]]"
+msgstr "\\\\{2}\t[[smileys/prio2.png]]"
+
+#. type: Bullet: '* '
+msgid "\\\\{3}\t[[smileys/prio3.png]]"
+msgstr "\\\\{3}\t[[smileys/prio3.png]]"
+
+#. type: Plain text
+msgid "For example: {x} B) {x}"
+msgstr "Zum Beispiel: {x} B) {x}"
+
+#. type: Plain text
+msgid ""
+"To change the supported smileys, just edit the lists on this page.  Note "
+"that the format is important; each list item should start with the text that "
+"is turned into the smiley, escaped so that users can see what produces it, "
+"followed by a [[ikiwiki/WikiLink]] to the image to display."
+msgstr ""
+"Um die unterstützten Simleys zu verändern, bearbeite einfach diese Seite. "
+"Beachte dass das Format wichtig ist: Jeder Eintrag in der Liste sollte mit "
+"dem Text zum Anzeige des Smileys beginnen (geschützt sodass Benutzer "
+"sehen können, wodurch ein Smiley erzeugt wird), gefolgt von einem "
+"[[ikiwiki/WikiLink]] auf das anzuzeigende Bild."
+
+#. type: Plain text
+msgid ""
+"/!\\ Bear in mind that the link to the image needs to be written in a way "
+"that will work if it's copied to other pages on the wiki. So be sure to "
+"include the smileys directory in the path to the file."
+msgstr ""
+"/!\\ Denke daran, dass der Link auf das Bild so geschrieben sein muss, dass "
+"er auch dann funktioniert, wenn er in andere Teile des Wikis kopiert wird. "
+"Stelle also sicher, dass das Verzeichnis der Smiley-Datei mit angegeben wird."
+
+
index 03ff3bf76e530b1ff10fa9d867591d7911bcc36d..a1aa8db55da6ad4fc65818530987f23f0b16178f 100644 (file)
--- a/po/vi.po
+++ b/po/vi.po
@@ -6,56 +6,53 @@ msgid ""
 msgstr ""
 "Project-Id-Version: ikiwiki\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-10-31 18:31-0400\n"
+"POT-Creation-Date: 2010-06-10 15:02-0400\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"
+"Language: vi\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
 "X-Generator: LocFactoryEditor 1.6fc1\n"
 
-#: ../IkiWiki/CGI.pm:114
-msgid "You need to log in first."
-msgstr "Trước tiên bạn cần phải đăng nhập."
-
-#: ../IkiWiki/CGI.pm:147
+#: ../IkiWiki/CGI.pm:162
 msgid ""
 "probable misconfiguration: sslcookie is set, but you are attempting to login "
 "via http, not https"
 msgstr ""
 
-#: ../IkiWiki/CGI.pm:150
+#: ../IkiWiki/CGI.pm:165
 msgid "login failed, perhaps you need to turn on cookies?"
 msgstr ""
 
-#: ../IkiWiki/CGI.pm:169 ../IkiWiki/CGI.pm:314
+#: ../IkiWiki/CGI.pm:184 ../IkiWiki/CGI.pm:335
 msgid "Your login session has expired."
 msgstr ""
 
-#: ../IkiWiki/CGI.pm:190
+#: ../IkiWiki/CGI.pm:205
 msgid "Login"
 msgstr ""
 
-#: ../IkiWiki/CGI.pm:191
+#: ../IkiWiki/CGI.pm:206
 #, fuzzy
 msgid "Preferences"
 msgstr "Tùy thích đã được lưu."
 
-#: ../IkiWiki/CGI.pm:192
+#: ../IkiWiki/CGI.pm:207
 msgid "Admin"
 msgstr ""
 
-#: ../IkiWiki/CGI.pm:232
+#: ../IkiWiki/CGI.pm:247
 msgid "Preferences saved."
 msgstr "Tùy thích đã được lưu."
 
-#: ../IkiWiki/CGI.pm:278
+#: ../IkiWiki/CGI.pm:299
 msgid "You are banned."
 msgstr "Bạn bị cấm ra."
 
-#: ../IkiWiki/CGI.pm:405 ../IkiWiki/CGI.pm:406 ../IkiWiki.pm:1282
+#: ../IkiWiki/CGI.pm:426 ../IkiWiki/CGI.pm:427 ../IkiWiki.pm:1316
 msgid "Error"
 msgstr "Lỗi"
 
@@ -137,7 +134,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:231
 msgid "done"
 msgstr "xong"
 
@@ -146,43 +143,43 @@ msgstr "xong"
 msgid "Must specify %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:136
+#: ../IkiWiki/Plugin/amazon_s3.pm:140
 #, fuzzy
 msgid "Failed to create S3 bucket: "
 msgstr "Lỗi gửi thư"
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:221
+#: ../IkiWiki/Plugin/amazon_s3.pm:225
 #, fuzzy
 msgid "Failed to save file to S3: "
 msgstr "Lỗi gửi thư"
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:243
+#: ../IkiWiki/Plugin/amazon_s3.pm:247
 #, fuzzy
 msgid "Failed to delete file from S3: "
 msgstr "lỗi ghi %s: %s"
 
-#: ../IkiWiki/Plugin/attachment.pm:49
+#: ../IkiWiki/Plugin/attachment.pm:50
 #, perl-format
 msgid "there is already a page named %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/attachment.pm:65
+#: ../IkiWiki/Plugin/attachment.pm:66
 msgid "prohibited by allowed_attachments"
 msgstr ""
 
-#: ../IkiWiki/Plugin/attachment.pm:140
+#: ../IkiWiki/Plugin/attachment.pm:141
 msgid "bad attachment filename"
 msgstr ""
 
-#: ../IkiWiki/Plugin/attachment.pm:182
+#: ../IkiWiki/Plugin/attachment.pm:183
 msgid "attachment upload"
 msgstr ""
 
-#: ../IkiWiki/Plugin/autoindex.pm:105
+#: ../IkiWiki/Plugin/autoindex.pm:117
 msgid "automatic index generation"
 msgstr ""
 
-#: ../IkiWiki/Plugin/blogspam.pm:108
+#: ../IkiWiki/Plugin/blogspam.pm:109
 msgid ""
 "Sorry, but that looks like spam to <a href=\"http://blogspam.net/"
 "\">blogspam</a>: "
@@ -197,198 +194,217 @@ msgstr ""
 msgid "There are no broken links!"
 msgstr "Không có liên kết bị ngắt nào."
 
-#: ../IkiWiki/Plugin/comments.pm:124 ../IkiWiki/Plugin/format.pm:38
+#: ../IkiWiki/Plugin/comments.pm:112
+#, fuzzy, perl-format
+msgid "this comment needs %s"
+msgstr "đang tạo %s"
+
+#: ../IkiWiki/Plugin/comments.pm:115
+msgid "moderation"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:136 ../IkiWiki/Plugin/format.pm:48
 #, perl-format
 msgid "unsupported page format %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:129
+#: ../IkiWiki/Plugin/comments.pm:141
 msgid "comment must have content"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:185
+#: ../IkiWiki/Plugin/comments.pm:196
 msgid "Anonymous"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:340 ../IkiWiki/Plugin/editpage.pm:97
+#: ../IkiWiki/Plugin/comments.pm:357 ../IkiWiki/Plugin/editpage.pm:98
 msgid "bad page name"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:345
+#: ../IkiWiki/Plugin/comments.pm:362
 #, fuzzy, perl-format
 msgid "commenting on %s"
 msgstr "đang tạo %s"
 
-#: ../IkiWiki/Plugin/comments.pm:363
+#: ../IkiWiki/Plugin/comments.pm:380
 #, perl-format
 msgid "page '%s' doesn't exist, so you can't comment"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:370
+#: ../IkiWiki/Plugin/comments.pm:387
 #, perl-format
 msgid "comments on page '%s' are closed"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:464
+#: ../IkiWiki/Plugin/comments.pm:491
 msgid "comment stored for moderation"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:466
+#: ../IkiWiki/Plugin/comments.pm:493
 msgid "Your comment will be posted after moderator review"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:479
+#: ../IkiWiki/Plugin/comments.pm:506
 msgid "Added a comment"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:483
+#: ../IkiWiki/Plugin/comments.pm:510
 #, perl-format
 msgid "Added a comment: %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:525 ../IkiWiki/Plugin/websetup.pm:236
+#: ../IkiWiki/Plugin/comments.pm:552 ../IkiWiki/Plugin/websetup.pm:272
 msgid "you are not logged in as an admin"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:576
+#: ../IkiWiki/Plugin/comments.pm:603
 msgid "Comment moderation"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:615
+#: ../IkiWiki/Plugin/comments.pm:641
 msgid "comment moderation"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:766
-msgid "Comments"
+#: ../IkiWiki/Plugin/comments.pm:790
+#, perl-format
+msgid "%i comment"
+msgid_plural "%i comments"
+msgstr[0] ""
+
+#. translators: Here "Comment" is a verb;
+#. translators: the user clicks on it to
+#. translators: post a comment.
+#: ../IkiWiki/Plugin/comments.pm:800
+msgid "Comment"
 msgstr ""
 
-#: ../IkiWiki/Plugin/conditional.pm:27 ../IkiWiki/Plugin/cutpaste.pm:30
-#: ../IkiWiki/Plugin/cutpaste.pm:45 ../IkiWiki/Plugin/cutpaste.pm:61
+#: ../IkiWiki/Plugin/conditional.pm:28 ../IkiWiki/Plugin/cutpaste.pm:31
+#: ../IkiWiki/Plugin/cutpaste.pm:46 ../IkiWiki/Plugin/cutpaste.pm:62
 #: ../IkiWiki/Plugin/testpagespec.pm:26
 #, perl-format
 msgid "%s parameter is required"
 msgstr ""
 
-#: ../IkiWiki/Plugin/cutpaste.pm:66
+#: ../IkiWiki/Plugin/cutpaste.pm:67
 msgid "no text was copied in this page"
 msgstr ""
 
-#: ../IkiWiki/Plugin/cutpaste.pm:69
+#: ../IkiWiki/Plugin/cutpaste.pm:70
 #, perl-format
 msgid "no text was copied in this page with id %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/editpage.pm:40
+#: ../IkiWiki/Plugin/editpage.pm:41
 #, fuzzy, perl-format
 msgid "removing old preview %s"
 msgstr "đang gỡ bỏ trang cũ %s"
 
-#: ../IkiWiki/Plugin/editpage.pm:113
+#: ../IkiWiki/Plugin/editpage.pm:114
 #, perl-format
 msgid "%s is not an editable page"
 msgstr ""
 
-#: ../IkiWiki/Plugin/editpage.pm:292
+#: ../IkiWiki/Plugin/editpage.pm:294
 #, perl-format
 msgid "creating %s"
 msgstr "đang tạo %s"
 
-#: ../IkiWiki/Plugin/editpage.pm:310 ../IkiWiki/Plugin/editpage.pm:329
-#: ../IkiWiki/Plugin/editpage.pm:339 ../IkiWiki/Plugin/editpage.pm:383
-#: ../IkiWiki/Plugin/editpage.pm:422
+#: ../IkiWiki/Plugin/editpage.pm:312 ../IkiWiki/Plugin/editpage.pm:334
+#: ../IkiWiki/Plugin/editpage.pm:345 ../IkiWiki/Plugin/editpage.pm:390
+#: ../IkiWiki/Plugin/editpage.pm:429
 #, perl-format
 msgid "editing %s"
 msgstr "đang sửa %s"
 
-#: ../IkiWiki/Plugin/edittemplate.pm:51
+#: ../IkiWiki/Plugin/edittemplate.pm:52
 #, fuzzy
 msgid "template not specified"
 msgstr "không tìm thấy mẫu %s"
 
-#: ../IkiWiki/Plugin/edittemplate.pm:54
+#: ../IkiWiki/Plugin/edittemplate.pm:55
 #, fuzzy
 msgid "match not specified"
 msgstr "chưa xác định tên tập tin bộ bao bọc"
 
-#: ../IkiWiki/Plugin/edittemplate.pm:63
+#: ../IkiWiki/Plugin/edittemplate.pm:64
 #, perl-format
 msgid "edittemplate %s registered for %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/edittemplate.pm:137
+#: ../IkiWiki/Plugin/edittemplate.pm:125 ../IkiWiki/Plugin/inline.pm:339
+#: ../IkiWiki/Plugin/template.pm:44
 #, fuzzy
-msgid "failed to process"
+msgid "failed to process template:"
 msgstr "mẫu không xử lý được:"
 
-#: ../IkiWiki/Plugin/format.pm:20
+#: ../IkiWiki/Plugin/format.pm:30
 msgid "must specify format and text"
 msgstr ""
 
-#: ../IkiWiki/Plugin/fortune.pm:27
+#: ../IkiWiki/Plugin/fortune.pm:28
 msgid "fortune failed"
 msgstr "fortune bị lỗi"
 
-#: ../IkiWiki/Plugin/getsource.pm:62 ../IkiWiki/Plugin/goto.pm:55
+#: ../IkiWiki/Plugin/getsource.pm:64 ../IkiWiki/Plugin/goto.pm:58
 #, fuzzy
 msgid "missing page"
 msgstr "mẫu thiếu tham số id"
 
-#: ../IkiWiki/Plugin/getsource.pm:64 ../IkiWiki/Plugin/goto.pm:57
+#: ../IkiWiki/Plugin/getsource.pm:66 ../IkiWiki/Plugin/goto.pm:60
 #, perl-format
 msgid "The page %s does not exist."
 msgstr ""
 
-#: ../IkiWiki/Plugin/getsource.pm:73
+#: ../IkiWiki/Plugin/getsource.pm:75
 #, fuzzy
 msgid "not a page"
 msgstr "không thể đọc %s: %s"
 
-#: ../IkiWiki/Plugin/getsource.pm:75
+#: ../IkiWiki/Plugin/getsource.pm:77
 #, perl-format
 msgid "%s is an attachment, not a page."
 msgstr ""
 
-#: ../IkiWiki/Plugin/git.pm:651 ../IkiWiki/Plugin/git.pm:669
+#: ../IkiWiki/Plugin/git.pm:687 ../IkiWiki/Plugin/git.pm:705
 #: ../IkiWiki/Receive.pm:130
 #, perl-format
 msgid "you are not allowed to change %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/git.pm:691
+#: ../IkiWiki/Plugin/git.pm:727
 #, perl-format
 msgid "you cannot act on a file with mode %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/git.pm:695
+#: ../IkiWiki/Plugin/git.pm:731
 msgid "you are not allowed to change file modes"
 msgstr ""
 
-#: ../IkiWiki/Plugin/google.pm:25 ../IkiWiki/Plugin/po.pm:131
-#: ../IkiWiki/Plugin/search.pm:36
+#: ../IkiWiki/Plugin/google.pm:26 ../IkiWiki/Plugin/po.pm:134
+#: ../IkiWiki/Plugin/search.pm:37
 #, fuzzy, perl-format
 msgid "Must specify %s when using the %s plugin"
 msgstr "Cần phải xác định %s khi dùng bổ sung tìm kiếm"
 
-#: ../IkiWiki/Plugin/graphviz.pm:67
+#: ../IkiWiki/Plugin/graphviz.pm:68
 #, fuzzy
 msgid "failed to run graphviz"
 msgstr "linkmap không chạy dot được"
 
-#: ../IkiWiki/Plugin/graphviz.pm:94
+#: ../IkiWiki/Plugin/graphviz.pm:91
 msgid "prog not a valid graphviz program"
 msgstr ""
 
-#: ../IkiWiki/Plugin/highlight.pm:47
+#: ../IkiWiki/Plugin/highlight.pm:48
 #, perl-format
 msgid "tohighlight contains unknown file type '%s'"
 msgstr ""
 
-#: ../IkiWiki/Plugin/highlight.pm:58
+#: ../IkiWiki/Plugin/highlight.pm:59
 #, perl-format
 msgid "Source code: %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/highlight.pm:123
+#: ../IkiWiki/Plugin/highlight.pm:124
 msgid ""
 "warning: highlight perl module not available; falling back to pass through"
 msgstr ""
@@ -398,108 +414,117 @@ msgstr ""
 msgid "htmltidy failed to parse this html"
 msgstr "lỗi phân tách hình cười nào nên tắt bổ sung"
 
-#: ../IkiWiki/Plugin/img.pm:64
+#: ../IkiWiki/Plugin/img.pm:69
 #, fuzzy
 msgid "Image::Magick is not installed"
 msgstr "chưa cài đặt polygen"
 
-#: ../IkiWiki/Plugin/img.pm:68 ../IkiWiki/Plugin/img.pm:112
+#: ../IkiWiki/Plugin/img.pm:73 ../IkiWiki/Plugin/img.pm:117
 #, fuzzy, perl-format
 msgid "failed to read %s: %s"
 msgstr "lỗi ghi %s: %s"
 
-#: ../IkiWiki/Plugin/img.pm:74
+#: ../IkiWiki/Plugin/img.pm:79
 #, perl-format
 msgid "wrong size format \"%s\" (should be WxH)"
 msgstr ""
 
-#: ../IkiWiki/Plugin/img.pm:120
+#: ../IkiWiki/Plugin/img.pm:122
 #, fuzzy, perl-format
 msgid "failed to resize: %s"
 msgstr "lỗi ghi %s: %s"
 
-#: ../IkiWiki/Plugin/img.pm:140
+#: ../IkiWiki/Plugin/img.pm:146
 #, fuzzy, perl-format
 msgid "failed to determine size of image %s"
 msgstr "lỗi ghi %s: %s"
 
-#: ../IkiWiki/Plugin/inline.pm:92
+#: ../IkiWiki/Plugin/inline.pm:93
 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 »"
+"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:138
+#: ../IkiWiki/Plugin/inline.pm:139
 #, fuzzy
 msgid "page editing not allowed"
 msgstr "không tìm thấy mẫu %s"
 
-#: ../IkiWiki/Plugin/inline.pm:155
+#: ../IkiWiki/Plugin/inline.pm:156
 #, fuzzy
 msgid "missing pages parameter"
 msgstr "mẫu thiếu tham số id"
 
-#: ../IkiWiki/Plugin/inline.pm:191
+#: ../IkiWiki/Plugin/inline.pm:192
 #, perl-format
 msgid "the %s and %s parameters cannot be used together"
 msgstr ""
 
-#: ../IkiWiki/Plugin/inline.pm:312
+#: ../IkiWiki/Plugin/inline.pm:313
 msgid "Add a new post titled:"
 msgstr ""
 
-#: ../IkiWiki/Plugin/inline.pm:332
+#: ../IkiWiki/Plugin/inline.pm:342
 #, perl-format
-msgid "nonexistant template %s"
-msgstr ""
+msgid "template %s not found"
+msgstr "không tìm thấy mẫu %s"
 
-#: ../IkiWiki/Plugin/inline.pm:598
+#: ../IkiWiki/Plugin/inline.pm:633
 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"
 
-#: ../IkiWiki/Plugin/linkmap.pm:101
+#: ../IkiWiki/Plugin/linkmap.pm:81 ../IkiWiki/Plugin/linkmap.pm:88
+#: ../IkiWiki/Plugin/linkmap.pm:92 ../IkiWiki/Plugin/linkmap.pm:95
 #, fuzzy
 msgid "failed to run dot"
 msgstr "linkmap không chạy dot được"
 
-#: ../IkiWiki/Plugin/lockedit.pm:47
+#: ../IkiWiki/Plugin/linkmap.pm:85
+msgid "linkmap"
+msgstr ""
+
+#: ../IkiWiki/Plugin/lockedit.pm:49
 #, fuzzy, perl-format
 msgid "%s is locked and cannot be edited"
 msgstr "%s bị %s khoá nên không thể sửa được"
 
-#: ../IkiWiki/Plugin/mdwn.pm:44
+#: ../IkiWiki/Plugin/mdwn.pm:45
 msgid "multimarkdown is enabled, but Text::MultiMarkdown is not installed"
 msgstr ""
 
-#: ../IkiWiki/Plugin/mdwn.pm:69
+#: ../IkiWiki/Plugin/mdwn.pm:70
 #, perl-format
 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:161
+#: ../IkiWiki/Plugin/meta.pm:174
 #, fuzzy
 msgid "stylesheet not found"
 msgstr "không tìm thấy mẫu %s"
 
-#: ../IkiWiki/Plugin/meta.pm:199
+#: ../IkiWiki/Plugin/meta.pm:212
 #, fuzzy
 msgid "redir page not found"
 msgstr "không tìm thấy mẫu %s"
 
-#: ../IkiWiki/Plugin/meta.pm:213
+#: ../IkiWiki/Plugin/meta.pm:226
 #, fuzzy
 msgid "redir cycle is not allowed"
 msgstr "không tìm thấy mẫu %s"
 
-#: ../IkiWiki/Plugin/mirrorlist.pm:43
+#: ../IkiWiki/Plugin/meta.pm:387
+msgid "sort=meta requires a parameter"
+msgstr ""
+
+#: ../IkiWiki/Plugin/mirrorlist.pm:44
 msgid "Mirrors"
 msgstr "Nhân bản"
 
-#: ../IkiWiki/Plugin/mirrorlist.pm:43
+#: ../IkiWiki/Plugin/mirrorlist.pm:44
 msgid "Mirror"
 msgstr "Nhân bản"
 
-#: ../IkiWiki/Plugin/moderatedcomments.pm:41
+#: ../IkiWiki/Plugin/moderatedcomments.pm:57
 msgid "comment needs moderation"
 msgstr ""
 
@@ -507,19 +532,12 @@ msgstr ""
 msgid "more"
 msgstr ""
 
-#: ../IkiWiki/Plugin/norcs.pm:65
-msgid "getctime not implemented"
-msgstr "chưa thực hiện getctime"
-
-#: ../IkiWiki/Plugin/openid.pm:61
-msgid "Log in with"
-msgstr ""
-
-#: ../IkiWiki/Plugin/openid.pm:64
-msgid "Get an OpenID"
-msgstr "Lấy OpenID"
+#: ../IkiWiki/Plugin/openid.pm:58
+#, fuzzy, perl-format
+msgid "failed to load openid module: "
+msgstr "lỗi biên dịch %s"
 
-#: ../IkiWiki/Plugin/orphans.pm:55
+#: ../IkiWiki/Plugin/orphans.pm:56
 #, fuzzy
 msgid "All pages have other pages linking to them."
 msgstr "Mọi trang được liên kết với trang khác."
@@ -528,31 +546,39 @@ msgstr "Mọi trang được liên kết với trang khác."
 msgid "bad or missing template"
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:248
+#: ../IkiWiki/Plugin/passwordauth.pm:231
+msgid "Your user page: "
+msgstr ""
+
+#: ../IkiWiki/Plugin/passwordauth.pm:238
+msgid "Create your user page"
+msgstr ""
+
+#: ../IkiWiki/Plugin/passwordauth.pm:268
 msgid "Account creation successful. Now you can Login."
 msgstr "Tài khoản đã được tạo. Lúc bây giờ bạn có thể đăng nhập."
 
-#: ../IkiWiki/Plugin/passwordauth.pm:251
+#: ../IkiWiki/Plugin/passwordauth.pm:271
 msgid "Error creating account."
 msgstr "Gặp lỗi khi tạo tài khoản."
 
-#: ../IkiWiki/Plugin/passwordauth.pm:258
+#: ../IkiWiki/Plugin/passwordauth.pm:278
 msgid "No email address, so cannot email password reset instructions."
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:292
+#: ../IkiWiki/Plugin/passwordauth.pm:312
 msgid "Failed to send mail"
 msgstr "Lỗi gửi thư"
 
-#: ../IkiWiki/Plugin/passwordauth.pm:294
+#: ../IkiWiki/Plugin/passwordauth.pm:314
 msgid "You have been mailed password reset instructions."
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:329
+#: ../IkiWiki/Plugin/passwordauth.pm:349
 msgid "incorrect password reset url"
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:332
+#: ../IkiWiki/Plugin/passwordauth.pm:352
 msgid "password reset denied"
 msgstr ""
 
@@ -583,124 +609,119 @@ msgstr "Không tìm thấy RPC::XML::Client nên không gửi gói tin ping"
 msgid "warning: Old po4a detected! Recommend upgrade to 0.35."
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:138
+#: ../IkiWiki/Plugin/po.pm:142
 #, perl-format
 msgid "%s is not a valid language code"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:150
+#: ../IkiWiki/Plugin/po.pm:154
 #, perl-format
 msgid ""
 "%s is not a valid value for po_link_to, falling back to po_link_to=default"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:155
+#: ../IkiWiki/Plugin/po.pm:159
 msgid ""
 "po_link_to=negotiated requires usedirs to be enabled, falling back to "
 "po_link_to=default"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:385
+#: ../IkiWiki/Plugin/po.pm:390
 #, perl-format
 msgid "rebuilding all pages to fix meta titles"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:389 ../IkiWiki/Render.pm:638
+#: ../IkiWiki/Plugin/po.pm:394 ../IkiWiki/Render.pm:769
 #, fuzzy, perl-format
 msgid "building %s"
 msgstr "đang sửa %s"
 
-#: ../IkiWiki/Plugin/po.pm:427
+#: ../IkiWiki/Plugin/po.pm:432
 msgid "updated PO files"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:451
+#: ../IkiWiki/Plugin/po.pm:456
 msgid ""
 "Can not remove a translation. If the master page is removed, however, its "
 "translations will be removed as well."
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:471
+#: ../IkiWiki/Plugin/po.pm:476
 msgid ""
 "Can not rename a translation. If the master page is renamed, however, its "
 "translations will be renamed as well."
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:870
+#: ../IkiWiki/Plugin/po.pm:876
 #, perl-format
 msgid "POT file (%s) does not exist"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:884
+#: ../IkiWiki/Plugin/po.pm:890
 #, fuzzy, perl-format
 msgid "failed to copy underlay PO file to %s"
 msgstr "lỗi biên dịch %s"
 
-#: ../IkiWiki/Plugin/po.pm:893
+#: ../IkiWiki/Plugin/po.pm:899
 #, fuzzy, perl-format
 msgid "failed to update %s"
 msgstr "lỗi biên dịch %s"
 
-#: ../IkiWiki/Plugin/po.pm:899
+#: ../IkiWiki/Plugin/po.pm:905
 #, fuzzy, perl-format
 msgid "failed to copy the POT file to %s"
 msgstr "lỗi biên dịch %s"
 
-#: ../IkiWiki/Plugin/po.pm:935
+#: ../IkiWiki/Plugin/po.pm:941
 msgid "N/A"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:948
+#: ../IkiWiki/Plugin/po.pm:954
 #, fuzzy, perl-format
 msgid "failed to translate %s"
 msgstr "lỗi ghi %s: %s"
 
-#: ../IkiWiki/Plugin/po.pm:1032
+#: ../IkiWiki/Plugin/po.pm:1038
 msgid "removed obsolete PO files"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:1095 ../IkiWiki/Plugin/po.pm:1109
-#: ../IkiWiki/Plugin/po.pm:1149
+#: ../IkiWiki/Plugin/po.pm:1094 ../IkiWiki/Plugin/po.pm:1108
+#: ../IkiWiki/Plugin/po.pm:1147
 #, fuzzy, perl-format
 msgid "failed to write %s"
 msgstr "lỗi ghi %s: %s"
 
-#: ../IkiWiki/Plugin/po.pm:1107
+#: ../IkiWiki/Plugin/po.pm:1106
 #, fuzzy
 msgid "failed to translate"
 msgstr "linkmap không chạy dot được"
 
-#: ../IkiWiki/Plugin/po.pm:1112
-#, fuzzy, perl-format
-msgid "failed to read %s"
-msgstr "lỗi ghi %s: %s"
-
-#: ../IkiWiki/Plugin/po.pm:1161
+#: ../IkiWiki/Plugin/po.pm:1159
 msgid "invalid gettext data, go back to previous page to continue edit"
 msgstr ""
 
-#: ../IkiWiki/Plugin/poll.pm:69
+#: ../IkiWiki/Plugin/poll.pm:70
 msgid "vote"
 msgstr "bỏ phiếu"
 
-#: ../IkiWiki/Plugin/poll.pm:77
+#: ../IkiWiki/Plugin/poll.pm:78
 msgid "Total votes:"
 msgstr "Tổng số phiếu :"
 
-#: ../IkiWiki/Plugin/polygen.pm:41
+#: ../IkiWiki/Plugin/polygen.pm:42
 msgid "polygen not installed"
 msgstr "chưa cài đặt polygen"
 
-#: ../IkiWiki/Plugin/polygen.pm:60
+#: ../IkiWiki/Plugin/polygen.pm:61
 #, fuzzy
 msgid "command failed"
 msgstr "fortune bị lỗi"
 
-#: ../IkiWiki/Plugin/postsparkline.pm:46
+#: ../IkiWiki/Plugin/postsparkline.pm:47
 msgid "missing formula"
 msgstr ""
 
-#: ../IkiWiki/Plugin/postsparkline.pm:53
+#: ../IkiWiki/Plugin/postsparkline.pm:54
 msgid "unknown formula"
 msgstr ""
 
@@ -768,12 +789,12 @@ msgstr ""
 msgid "at noon on %A"
 msgstr ""
 
-#: ../IkiWiki/Plugin/progress.pm:34
+#: ../IkiWiki/Plugin/progress.pm:35
 #, perl-format
 msgid "illegal percent value %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/progress.pm:55
+#: ../IkiWiki/Plugin/progress.pm:56
 msgid "need either `percent` or `totalpages` and `donepages` parameters"
 msgstr ""
 
@@ -781,40 +802,40 @@ msgstr ""
 msgid "(Diff truncated)"
 msgstr ""
 
-#: ../IkiWiki/Plugin/remove.pm:31 ../IkiWiki/Plugin/rename.pm:36
+#: ../IkiWiki/Plugin/remove.pm:32 ../IkiWiki/Plugin/rename.pm:37
 #, perl-format
 msgid "%s does not exist"
 msgstr ""
 
-#: ../IkiWiki/Plugin/remove.pm:38
+#: ../IkiWiki/Plugin/remove.pm:39
 #, fuzzy, perl-format
 msgid "%s is not in the srcdir, so it cannot be deleted"
 msgstr "%s bị %s khoá nên không thể sửa được"
 
-#: ../IkiWiki/Plugin/remove.pm:41 ../IkiWiki/Plugin/rename.pm:45
+#: ../IkiWiki/Plugin/remove.pm:42 ../IkiWiki/Plugin/rename.pm:46
 #, perl-format
 msgid "%s is not a file"
 msgstr ""
 
-#: ../IkiWiki/Plugin/remove.pm:134
+#: ../IkiWiki/Plugin/remove.pm:137
 #, perl-format
 msgid "confirm removal of %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/remove.pm:171
+#: ../IkiWiki/Plugin/remove.pm:174
 msgid "Please select the attachments to remove."
 msgstr ""
 
-#: ../IkiWiki/Plugin/remove.pm:211
+#: ../IkiWiki/Plugin/remove.pm:216
 msgid "removed"
 msgstr ""
 
-#: ../IkiWiki/Plugin/rename.pm:42
+#: ../IkiWiki/Plugin/rename.pm:43
 #, perl-format
 msgid "%s is not in the srcdir, so it cannot be renamed"
 msgstr ""
 
-#: ../IkiWiki/Plugin/rename.pm:62
+#: ../IkiWiki/Plugin/rename.pm:63
 #, fuzzy
 msgid "no change to the file name was specified"
 msgstr "chưa xác định tên tập tin bộ bao bọc"
@@ -839,24 +860,24 @@ msgstr ""
 msgid "rename %s"
 msgstr "đang vẽ %s"
 
-#: ../IkiWiki/Plugin/rename.pm:161
+#: ../IkiWiki/Plugin/rename.pm:163
 msgid "Also rename SubPages and attachments"
 msgstr ""
 
-#: ../IkiWiki/Plugin/rename.pm:247
+#: ../IkiWiki/Plugin/rename.pm:250
 msgid "Only one attachment can be renamed at a time."
 msgstr ""
 
-#: ../IkiWiki/Plugin/rename.pm:250
+#: ../IkiWiki/Plugin/rename.pm:253
 msgid "Please select the attachment to rename."
 msgstr ""
 
-#: ../IkiWiki/Plugin/rename.pm:347
+#: ../IkiWiki/Plugin/rename.pm:352
 #, perl-format
 msgid "rename %s to %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/rename.pm:571
+#: ../IkiWiki/Plugin/rename.pm:576
 #, fuzzy, perl-format
 msgid "update for rename of %s to %s"
 msgstr "cập nhật %2$s của %1$s bởi %3$s"
@@ -871,21 +892,21 @@ msgstr "lỗi ghi %s: %s"
 msgid "rsync_command exited %d"
 msgstr ""
 
-#: ../IkiWiki/Plugin/search.pm:182
+#: ../IkiWiki/Plugin/search.pm:194
 #, perl-format
 msgid "need Digest::SHA1 to index %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/search.pm:217
+#: ../IkiWiki/Plugin/search.pm:231
 msgid "search"
 msgstr ""
 
-#: ../IkiWiki/Plugin/shortcut.pm:31
+#: ../IkiWiki/Plugin/shortcut.pm:32
 #, perl-format
 msgid "shortcut plugin will not work without %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/shortcut.pm:44
+#: ../IkiWiki/Plugin/shortcut.pm:45
 #, fuzzy
 msgid "missing name or url parameter"
 msgstr "lối tắt thiếu tên hay tham số url"
@@ -893,7 +914,7 @@ msgstr "lối tắt thiếu tên hay tham số url"
 #. translators: This is used to display what shortcuts are defined.
 #. translators: First parameter is the name of the shortcut, the second
 #. translators: is an URL.
-#: ../IkiWiki/Plugin/shortcut.pm:54
+#: ../IkiWiki/Plugin/shortcut.pm:55
 #, fuzzy, perl-format
 msgid "shortcut %s points to <i>%s</i>"
 msgstr "lối tắt %s chỉ tới %s"
@@ -903,121 +924,123 @@ msgstr "lối tắt %s chỉ tới %s"
 msgid "failed to parse any smileys"
 msgstr "lỗi phân tách hình cười nào nên tắt bổ sung"
 
-#: ../IkiWiki/Plugin/sparkline.pm:72
+#: ../IkiWiki/Plugin/sparkline.pm:73
 #, fuzzy
 msgid "parse error"
 msgstr "linkmap không chạy dot được"
 
-#: ../IkiWiki/Plugin/sparkline.pm:78
+#: ../IkiWiki/Plugin/sparkline.pm:79
 msgid "invalid featurepoint diameter"
 msgstr ""
 
-#: ../IkiWiki/Plugin/sparkline.pm:88
+#: ../IkiWiki/Plugin/sparkline.pm:89
 msgid "invalid featurepoint location"
 msgstr ""
 
-#: ../IkiWiki/Plugin/sparkline.pm:99
+#: ../IkiWiki/Plugin/sparkline.pm:100
 msgid "missing values"
 msgstr ""
 
-#: ../IkiWiki/Plugin/sparkline.pm:104
+#: ../IkiWiki/Plugin/sparkline.pm:105
 #, fuzzy
 msgid "invalid height value"
 msgstr "linkmap không chạy dot được"
 
-#: ../IkiWiki/Plugin/sparkline.pm:111
+#: ../IkiWiki/Plugin/sparkline.pm:112
 #, fuzzy
 msgid "missing width parameter"
 msgstr "mẫu thiếu tham số id"
 
-#: ../IkiWiki/Plugin/sparkline.pm:115
+#: ../IkiWiki/Plugin/sparkline.pm:116
 #, fuzzy
 msgid "invalid width value"
 msgstr "linkmap không chạy dot được"
 
-#: ../IkiWiki/Plugin/sparkline.pm:153
+#: ../IkiWiki/Plugin/sparkline.pm:154
 #, fuzzy
 msgid "failed to run php"
 msgstr "linkmap không chạy dot được"
 
-#: ../IkiWiki/Plugin/table.pm:31
+#: ../IkiWiki/Plugin/table.pm:32
 msgid "cannot find file"
 msgstr ""
 
-#: ../IkiWiki/Plugin/table.pm:87
+#: ../IkiWiki/Plugin/table.pm:88
 msgid "unknown data format"
 msgstr ""
 
-#: ../IkiWiki/Plugin/table.pm:95
+#: ../IkiWiki/Plugin/table.pm:96
 msgid "empty data"
 msgstr ""
 
-#: ../IkiWiki/Plugin/table.pm:114
+#: ../IkiWiki/Plugin/table.pm:115
 msgid "Direct data download"
 msgstr ""
 
-#: ../IkiWiki/Plugin/table.pm:148
+#: ../IkiWiki/Plugin/table.pm:149
 #, fuzzy, perl-format
 msgid "parse fail at line %d: %s"
 msgstr "lỗi ghi %s: %s"
 
-#: ../IkiWiki/Plugin/template.pm:29
+#: ../IkiWiki/Plugin/tag.pm:83
+#, fuzzy, perl-format
+msgid "creating tag page %s"
+msgstr "đang tạo trang mới %s"
+
+#: ../IkiWiki/Plugin/template.pm:33
 #, fuzzy
 msgid "missing id parameter"
 msgstr "mẫu thiếu tham số id"
 
-#: ../IkiWiki/Plugin/template.pm:36
-#, perl-format
-msgid "template %s not found"
+#: ../IkiWiki/Plugin/template.pm:47
+#, fuzzy, perl-format
+msgid "%s not found"
 msgstr "không tìm thấy mẫu %s"
 
-#: ../IkiWiki/Plugin/template.pm:55
-#, fuzzy
-msgid "failed to process:"
-msgstr "mẫu không xử lý được:"
-
-#: ../IkiWiki/Plugin/teximg.pm:70
+#: ../IkiWiki/Plugin/teximg.pm:72
 msgid "missing tex code"
 msgstr ""
 
-#: ../IkiWiki/Plugin/teximg.pm:122
+#: ../IkiWiki/Plugin/teximg.pm:124
 #, fuzzy
 msgid "failed to generate image from code"
 msgstr "lỗi ghi %s: %s"
 
-#: ../IkiWiki/Plugin/websetup.pm:89
-msgid "plugin"
+#: ../IkiWiki/Plugin/websetup.pm:105
+#, perl-format
+msgid "%s plugin:"
+msgstr ""
+
+#: ../IkiWiki/Plugin/websetup.pm:121
+#, perl-format
+msgid "%s plugins"
 msgstr ""
 
-#: ../IkiWiki/Plugin/websetup.pm:108
+#: ../IkiWiki/Plugin/websetup.pm:135
 #, perl-format
 msgid "enable %s?"
 msgstr ""
 
-#: ../IkiWiki/Plugin/websetup.pm:240
+#: ../IkiWiki/Plugin/websetup.pm:276
 msgid "setup file for this wiki is not known"
 msgstr ""
 
-#: ../IkiWiki/Plugin/websetup.pm:256
+#: ../IkiWiki/Plugin/websetup.pm:292
 msgid "main"
 msgstr ""
 
-#: ../IkiWiki/Plugin/websetup.pm:257
-msgid "plugins"
-msgstr ""
-
-#: ../IkiWiki/Plugin/websetup.pm:395
+#: ../IkiWiki/Plugin/websetup.pm:435
 msgid ""
 "The configuration changes shown below require a wiki rebuild to take effect."
 msgstr ""
 
-#: ../IkiWiki/Plugin/websetup.pm:399
+#: ../IkiWiki/Plugin/websetup.pm:439
 msgid ""
 "For the configuration changes shown below to fully take effect, you may need "
 "to rebuild the wiki."
 msgstr ""
 
-#: ../IkiWiki/Plugin/websetup.pm:436
+#: ../IkiWiki/Plugin/websetup.pm:476
 #, perl-format
 msgid "Error: %s exited nonzero (%s). Discarding setup changes."
 msgstr ""
@@ -1032,79 +1055,94 @@ msgstr ""
 msgid "bad file name %s"
 msgstr "đang bỏ qua tên tập tin sai %s"
 
-#: ../IkiWiki/Render.pm:150
+#: ../IkiWiki/Render.pm:158
 #, perl-format
 msgid "scanning %s"
 msgstr "đang quét %s"
 
-#: ../IkiWiki/Render.pm:271
+#: ../IkiWiki/Render.pm:280
 #, perl-format
 msgid ""
 "symlink found in srcdir path (%s) -- set allow_symlinks_before_srcdir to "
 "allow this"
 msgstr ""
 
-#: ../IkiWiki/Render.pm:300 ../IkiWiki/Render.pm:327
+#: ../IkiWiki/Render.pm:311
 #, perl-format
 msgid "skipping bad filename %s"
 msgstr "đang bỏ qua tên tập tin sai %s"
 
-#: ../IkiWiki/Render.pm:305
+#: ../IkiWiki/Render.pm:327
 #, perl-format
 msgid "%s has multiple possible source pages"
 msgstr ""
 
-#: ../IkiWiki/Render.pm:395
+#: ../IkiWiki/Render.pm:369
 #, perl-format
-msgid "removing old page %s"
+msgid "querying %s for file creation and modification times.."
+msgstr ""
+
+#: ../IkiWiki/Render.pm:431
+#, fuzzy, perl-format
+msgid "removing obsolete %s"
 msgstr "đang gỡ bỏ trang cũ %s"
 
-#: ../IkiWiki/Render.pm:471
+#: ../IkiWiki/Render.pm:505
 #, fuzzy, perl-format
 msgid "building %s, which links to %s"
 msgstr "đang vẽ %s mà liên kết tới %s"
 
-#: ../IkiWiki/Render.pm:480
+#: ../IkiWiki/Render.pm:514
 #, fuzzy, perl-format
 msgid "removing %s, no longer built by %s"
 msgstr "đang gỡ bỏ %s, không còn được vẽ lại bởi %s"
 
-#: ../IkiWiki/Render.pm:603
+#: ../IkiWiki/Render.pm:597 ../IkiWiki/Render.pm:679
 #, fuzzy, perl-format
 msgid "building %s, which depends on %s"
 msgstr "đang vẽ %s mà phụ thuộc vào %s"
 
-#: ../IkiWiki/Render.pm:616
+#: ../IkiWiki/Render.pm:692
 #, fuzzy, perl-format
 msgid "building %s, to update its backlinks"
 msgstr "đang vẽ %s để cập nhật các liên kết ngược của nó"
 
-#: ../IkiWiki/Render.pm:679
+#: ../IkiWiki/Render.pm:821
 #, fuzzy, perl-format
 msgid "ikiwiki: cannot build %s"
 msgstr "ikiwiki: không thể vẽ %s"
 
 #. translators: The first parameter is a filename, and the second
 #. translators: is a (probably not translated) error message.
-#: ../IkiWiki/Setup.pm:19
+#: ../IkiWiki/Setup.pm:23
 #, perl-format
 msgid "cannot read %s: %s"
 msgstr "không thể đọc %s: %s"
 
-#: ../IkiWiki/Setup/Automator.pm:33
+#: ../IkiWiki/Setup.pm:34
+#, fuzzy, perl-format
+msgid "cannot load %s in safe mode"
+msgstr "không thể đọc %s: %s"
+
+#: ../IkiWiki/Setup.pm:47
+#, fuzzy, perl-format
+msgid "failed to parse %s"
+msgstr "lỗi biên dịch %s"
+
+#: ../IkiWiki/Setup/Automator.pm:34
 msgid "you must enter a wikiname (that contains alphanumerics)"
 msgstr ""
 
-#: ../IkiWiki/Setup/Automator.pm:76
+#: ../IkiWiki/Setup/Automator.pm:89
 #, perl-format
 msgid "unsupported revision control system %s"
 msgstr ""
 
-#: ../IkiWiki/Setup/Automator.pm:102
+#: ../IkiWiki/Setup/Automator.pm:115
 msgid "failed to set up the repository with ikiwiki-makerepo"
 msgstr ""
 
-#: ../IkiWiki/Setup/Automator.pm:120
+#: ../IkiWiki/Setup/Automator.pm:134
 #, perl-format
 msgid "** Disabling plugin %s, since it is failing with this message:"
 msgstr ""
@@ -1123,13 +1161,13 @@ msgid "wrapper filename not specified"
 msgstr "chưa xác định tên tập tin bộ bao bọc"
 
 #. translators: The parameter is a C filename.
-#: ../IkiWiki/Wrapper.pm:149
+#: ../IkiWiki/Wrapper.pm:160
 #, perl-format
 msgid "failed to compile %s"
 msgstr "lỗi biên dịch %s"
 
 #. translators: The parameter is a filename.
-#: ../IkiWiki/Wrapper.pm:169
+#: ../IkiWiki/Wrapper.pm:180
 #, perl-format
 msgid "successfully generated %s"
 msgstr "%s đã được tạo ra"
@@ -1142,58 +1180,64 @@ msgstr "cách sử dụng: ikiwiki [tùy chọn] nguồn đích"
 msgid "       ikiwiki --setup configfile"
 msgstr ""
 
-#: ../ikiwiki.in:91
+#: ../ikiwiki.in:96
 msgid "usage: --set var=value"
 msgstr ""
 
-#: ../ikiwiki.in:140
+#: ../ikiwiki.in:103
+msgid "usage: --set-yaml var=value"
+msgstr ""
+
+#: ../ikiwiki.in:157
 msgid "generating wrappers.."
 msgstr "đang tạo ra các bộ bao bọc.."
 
-#: ../ikiwiki.in:195
+#: ../ikiwiki.in:220
 msgid "rebuilding wiki.."
 msgstr "đang xây dựng lại wiki.."
 
-#: ../ikiwiki.in:198
+#: ../ikiwiki.in:223
 msgid "refreshing wiki.."
 msgstr "đang làm tươi wiki.."
 
-#: ../IkiWiki.pm:238
+#: ../IkiWiki.pm:232
 msgid "Discussion"
 msgstr "Thảo luận"
 
-#: ../IkiWiki.pm:507
+#: ../IkiWiki.pm:531
 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 »"
+msgstr ""
+"Cần phải xác định địa chỉ URL tới wiki với « --url » khi dùng « --cgi »"
 
-#: ../IkiWiki.pm:553
+#: ../IkiWiki.pm:577
 msgid "cannot use multiple rcs plugins"
 msgstr ""
 
-#: ../IkiWiki.pm:582
+#: ../IkiWiki.pm:606
 #, perl-format
 msgid "failed to load external plugin needed for %s plugin: %s"
 msgstr ""
 
-#: ../IkiWiki.pm:1264
+#: ../IkiWiki.pm:1298
 #, 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:1863
+#: ../IkiWiki.pm:1993
 msgid "yes"
 msgstr ""
 
-#: ../IkiWiki.pm:2006
-msgid "Sort::Naturally needed for title_natural sort"
-msgstr ""
+#: ../IkiWiki.pm:2070
+#, fuzzy, perl-format
+msgid "invalid sort type %s"
+msgstr "kiểu sắp xếp không rõ %s"
 
-#: ../IkiWiki.pm:2017
+#: ../IkiWiki.pm:2091
 #, perl-format
 msgid "unknown sort type %s"
 msgstr "kiểu sắp xếp không rõ %s"
 
-#: ../IkiWiki.pm:2036
+#: ../IkiWiki.pm:2227
 #, fuzzy, perl-format
 msgid "cannot match pages: %s"
 msgstr "không thể đọc %s: %s"
@@ -1218,6 +1262,23 @@ msgstr ""
 msgid "What is the domain name of the web server?"
 msgstr ""
 
+#~ msgid "You need to log in first."
+#~ msgstr "Trước tiên bạn cần phải đăng nhập."
+
+#~ msgid "Get an OpenID"
+#~ msgstr "Lấy OpenID"
+
+#, fuzzy
+#~ msgid "failed to process"
+#~ msgstr "mẫu không xử lý được:"
+
+#~ msgid "getctime not implemented"
+#~ msgstr "chưa thực hiện getctime"
+
+#, fuzzy
+#~ msgid "failed to read %s"
+#~ msgstr "lỗi ghi %s: %s"
+
 #~ msgid "discussion"
 #~ msgstr "thảo luận"
 
@@ -1265,10 +1326,6 @@ msgstr ""
 #~ msgstr ""
 #~ "Chưa đặt REV, không chạy từ móc sau gài vào nên không thể gửi thông báo"
 
-#, fuzzy
-#~ msgid "%s not found"
-#~ msgstr "không tìm thấy mẫu %s"
-
 #~ msgid "What's this?"
 #~ msgstr "Cái này là gì?"
 
index 9b074818c1f7a133e1c30c3c5583bfa4190efe27..aa58fb0ffdc9e18c87b2206a26ab3ecb78e733b3 100755 (executable)
@@ -1,7 +1,7 @@
 #!/usr/bin/perl
 use warnings;
 use strict;
-use Test::More tests => 38;
+use Test::More tests => 40;
 
 BEGIN { use_ok("IkiWiki"); }
 %config=IkiWiki::defaultconfig();
@@ -60,3 +60,11 @@ ok(! ($IkiWiki::depends{foo0}{"*"} & $IkiWiki::DEPEND_PRESENCE));
 ok(add_depends("foo9", "*", deptype("monkey")));
 ok($IkiWiki::depends{foo9}{"*"} & $IkiWiki::DEPEND_CONTENT);
 ok(! ($IkiWiki::depends{foo9}{"*"} & ($IkiWiki::DEPEND_PRESENCE | $IkiWiki::DEPEND_LINKS)));
+
+# Influences are added for dependencies involving links.
+$pagesources{"foo"}="foo.mdwn";
+$links{foo}=[qw{bar}]; 
+$pagesources{"bar"}="bar.mdwn";
+$links{bar}=[qw{}];
+ok(add_depends("foo", "link(bar) and backlink(meep)"));
+ok($IkiWiki::depends_simple{foo}{foo} == $IkiWiki::DEPEND_LINKS);
index 2ca44a65e084ce1395855ae177f4fa8632ba3e5c..3e54ec4dc8f57ee7601f572d090a5dd66f04a822 100755 (executable)
@@ -12,7 +12,7 @@ BEGIN {
                }
        }
 }
-use Test::More tests => 16;
+use Test::More tests => 17;
 
 BEGIN { use_ok("IkiWiki"); }
 
@@ -24,11 +24,19 @@ IkiWiki::checkconfig();
 
 system "bzr init $config{srcdir}";
 
+use CGI::Session;
+my $session=CGI::Session->new;
+$session->param("name", "Joe User");
+
 # Web commit
 my $test1 = readfile("t/test1.mdwn");
 writefile('test1.mdwn', $config{srcdir}, $test1);
 IkiWiki::rcs_add("test1.mdwn");
-IkiWiki::rcs_commit("test1.mdwn", "Added the first page", "moo", "Joe User");
+IkiWiki::rcs_commit(
+       file => "test1.mdwn",
+       message => "Added the first page",
+       token => "moo",
+       session => $session);
 
 my @changes;
 @changes = IkiWiki::rcs_recentchanges(3);
@@ -60,10 +68,16 @@ is($changes[1]{pages}[0]{"page"}, "test1");
 my $ctime = IkiWiki::rcs_getctime("test2.mdwn");
 ok($ctime >= time() - 20);
 
+my $mtime = IkiWiki::rcs_getmtime("test2.mdwn");
+ok($mtime >= time() - 20);
+
 writefile('test3.mdwn', $config{srcdir}, $test1);
 IkiWiki::rcs_add("test3.mdwn");
 IkiWiki::rcs_rename("test3.mdwn", "test4.mdwn");
-IkiWiki::rcs_commit_staged("Added the 4th page", "moo", "Joe User");
+IkiWiki::rcs_commit_staged(
+       message => "Added the 4th page",
+       session => $session,
+);
 
 @changes = IkiWiki::rcs_recentchanges(4);
 
@@ -72,7 +86,10 @@ is($changes[0]{pages}[0]{"page"}, "test4");
 
 ok(mkdir($config{srcdir}."/newdir"));
 IkiWiki::rcs_rename("test4.mdwn", "newdir/test5.mdwn");
-IkiWiki::rcs_commit_staged("Added the 5th page", "moo", "Joe User");
+IkiWiki::rcs_commit_staged(
+       message => "Added the 5th page",
+       session => $session,
+);
 
 @changes = IkiWiki::rcs_recentchanges(4);
 
@@ -80,6 +97,9 @@ is($#changes, 3);
 is($changes[0]{pages}[0]{"page"}, "newdir/test5");
 
 IkiWiki::rcs_remove("newdir/test5.mdwn");
-IkiWiki::rcs_commit_staged("Remove the 5th page", "moo", "Joe User");
+IkiWiki::rcs_commit_staged(
+       message => "Remove the 5th page",
+       session => $session,
+);
 
 system "rm -rf $dir";
diff --git a/t/calculate_changed_links.t b/t/calculate_changed_links.t
new file mode 100755 (executable)
index 0000000..bf6e2af
--- /dev/null
@@ -0,0 +1,58 @@
+#!/usr/bin/perl
+package IkiWiki;
+
+use warnings;
+use strict;
+use Test::More tests => 5;
+
+BEGIN { use_ok("IkiWiki"); }
+BEGIN { use_ok("IkiWiki::Render"); }
+%config=IkiWiki::defaultconfig();
+$config{srcdir}=$config{destdir}="/dev/null";
+
+%oldrenderedfiles=%pagectime=();
+%pagesources=%pagemtime=%oldlinks=%links=%depends=%typedlinks=%oldtypedlinks=
+%destsources=%renderedfiles=%pagecase=%pagestate=();
+
+IkiWiki::checkconfig();
+
+foreach my $page (qw(tags/a tags/b Reorder Add Remove TypeAdd TypeRemove)) {
+       $pagesources{$page} = "$page.mdwn";
+       $pagemtime{$page} = $pagectime{$page} = 1000000;
+}
+
+$oldlinks{Reorder} = [qw{tags/a tags/b}];
+$links{Reorder} = [qw{tags/b tags/a}];
+
+$oldlinks{Add} = [qw{tags/b}];
+$links{Add} = [qw{tags/a tags/b}];
+
+$oldlinks{Remove} = [qw{tags/a}];
+$links{Remove} = [];
+
+$oldlinks{TypeAdd} = [qw{tags/a tags/b}];
+$links{TypeAdd} = [qw{tags/a tags/b}];
+# This causes TypeAdd to be rebuilt, but isn't a backlink change, so it doesn't
+# cause tags/b to be rebuilt.
+$oldtypedlinks{TypeAdd}{tag} = { "tags/a" => 1 };
+$typedlinks{TypeAdd}{tag} = { "tags/a" => 1, "tags/b" => 1 };
+
+$oldlinks{TypeRemove} = [qw{tags/a tags/b}];
+$links{TypeRemove} = [qw{tags/a tags/b}];
+# This causes TypeRemove to be rebuilt, but isn't a backlink change, so it
+# doesn't cause tags/b to be rebuilt.
+$oldtypedlinks{TypeRemove}{tag} = { "tags/a" => 1 };
+$typedlinks{TypeRemove}{tag} = { "tags/a" => 1, "tags/b" => 1 };
+
+my $oldlink_targets = calculate_old_links([keys %pagesources], []);
+is_deeply($oldlink_targets, {
+               Reorder => { "tags/a" => "tags/a", "tags/b" => "tags/b" },
+               Add => { "tags/b" => "tags/b" },
+               Remove => { "tags/a" => "tags/a" },
+               TypeAdd => { "tags/a" => "tags/a", "tags/b" => "tags/b" },
+               TypeRemove => { "tags/a" => "tags/a", "tags/b" => "tags/b" },
+       });
+my ($backlinkchanged, $linkchangers) = calculate_changed_links([keys %pagesources], [], $oldlink_targets);
+
+is_deeply($backlinkchanged, { "tags/a" => 1 });
+is_deeply($linkchangers, { add => 1, remove => 1, typeadd => 1, typeremove => 1 });
diff --git a/t/cvs.t b/t/cvs.t
index 2808973be55a1819c65d2178cab3cf5e76841872..96359ab6e2a6bb9773af99179cf567da8732b3b1 100755 (executable)
--- a/t/cvs.t
+++ b/t/cvs.t
@@ -46,7 +46,11 @@ system "cvs -d $cvsrepo co -d $config{srcdir} ikiwiki >/dev/null";
 my $test1 = readfile("t/test1.mdwn");
 writefile('test1.mdwn', $config{srcdir}, $test1);
 IkiWiki::rcs_add("test1.mdwn");
-IkiWiki::rcs_commit("test1.mdwn", "Added the first page", "moo");
+IkiWiki::rcs_commit(
+       files => "test1.mdwn",
+       message => "Added the first page",
+       token => "moo"
+);
 
 my @changes;
 @changes = IkiWiki::rcs_recentchanges(3);
index 00542d58016e5f2a2a76b89d65c9d3bb8aa806be..34f3666101b122f20b225dd23ed6582d024ca78a 100755 (executable)
@@ -1,40 +1,40 @@
 #!/usr/bin/perl
 use warnings;
 use strict;
-use Test::More tests => 26;
+use Test::More tests => 27;
 
 BEGIN { use_ok("IkiWiki"); }
 
 %config=IkiWiki::defaultconfig();
 
-ok(IkiWiki::file_pruned("src/.ikiwiki/", "src"));
-ok(IkiWiki::file_pruned("src/.ikiwiki/index", "src"));
-ok(IkiWiki::file_pruned("src/CVS/foo", "src"));
-ok(IkiWiki::file_pruned("src/subdir/CVS/foo", "src"));
-ok(IkiWiki::file_pruned("src/.svn", "src"));
-ok(IkiWiki::file_pruned("src/subdir/.svn", "src"));
-ok(IkiWiki::file_pruned("src/subdir/.svn/foo", "src"));
-ok(IkiWiki::file_pruned("src/.git", "src"));
-ok(IkiWiki::file_pruned("src/subdir/.git", "src"));
-ok(IkiWiki::file_pruned("src/subdir/.git/foo", "src"));
-ok(! IkiWiki::file_pruned("src/svn/fo", "src"));
-ok(! IkiWiki::file_pruned("src/git", "src"));
-ok(! IkiWiki::file_pruned("src/index.mdwn", "src"));
-ok(! IkiWiki::file_pruned("src/index.", "src"));
+ok(IkiWiki::file_pruned(".htaccess"));
+ok(IkiWiki::file_pruned(".ikiwiki/"));
+ok(IkiWiki::file_pruned(".ikiwiki/index"));
+ok(IkiWiki::file_pruned("CVS/foo"));
+ok(IkiWiki::file_pruned("subdir/CVS/foo"));
+ok(IkiWiki::file_pruned(".svn"));
+ok(IkiWiki::file_pruned("subdir/.svn"));
+ok(IkiWiki::file_pruned("subdir/.svn/foo"));
+ok(IkiWiki::file_pruned(".git"));
+ok(IkiWiki::file_pruned("subdir/.git"));
+ok(IkiWiki::file_pruned("subdir/.git/foo"));
+ok(! IkiWiki::file_pruned("svn/fo"));
+ok(! IkiWiki::file_pruned("git"));
+ok(! IkiWiki::file_pruned("index.mdwn"));
+ok(! IkiWiki::file_pruned("index."));
+ok(IkiWiki::file_pruned("."));
+ok(IkiWiki::file_pruned("./"));
 
-# these are ok because while the filename starts with ".", the canonpathed
-# version does not
-ok(! IkiWiki::file_pruned("src/.", "src"));
-ok(! IkiWiki::file_pruned("src/./", "src"));
+# absolute filenames are not allowed.
+ok(IkiWiki::file_pruned("/etc/passwd"));
+ok(IkiWiki::file_pruned("//etc/passwd"));
+ok(IkiWiki::file_pruned("/"));
+ok(IkiWiki::file_pruned("//"));
+ok(IkiWiki::file_pruned("///"));
 
-ok(IkiWiki::file_pruned("src/..", "src"));
-ok(IkiWiki::file_pruned("src/../", "src"));
-ok(IkiWiki::file_pruned("src/../", "src"));
 
-ok(! IkiWiki::file_pruned("src", "src"));
-ok(! IkiWiki::file_pruned("/.foo/src", "/.foo/src"));
-ok(IkiWiki::file_pruned("/.foo/src/.foo/src", "/.foo/src"));
-ok(! IkiWiki::file_pruned("/.foo/src/index.mdwn", "/.foo/src/index.mdwn"));
+ok(IkiWiki::file_pruned(".."));
+ok(IkiWiki::file_pruned("../"));
 
-ok(IkiWiki::file_pruned("x/y/foo.dpkg-tmp", "src"));
-ok(IkiWiki::file_pruned("x/y/foo.ikiwiki-new", "src"));
+ok(IkiWiki::file_pruned("y/foo.dpkg-tmp"));
+ok(IkiWiki::file_pruned("y/foo.ikiwiki-new"));
diff --git a/t/find_src_files.t b/t/find_src_files.t
new file mode 100755 (executable)
index 0000000..a3742db
--- /dev/null
@@ -0,0 +1,97 @@
+#!/usr/bin/perl
+use warnings;
+use strict;
+use Test::More tests => 20;
+
+BEGIN { use_ok("IkiWiki"); }
+BEGIN { use_ok("IkiWiki::Render"); }
+
+%config=IkiWiki::defaultconfig();
+$config{srcdir}="t/tmp/srcdir";
+$config{underlaydir}="t/tmp/underlaydir";
+IkiWiki::checkconfig();
+
+sub cleanup {
+       ok(! system("rm -rf t/tmp"));
+}
+
+sub setup_underlay {
+       foreach my $file (@_) {
+               writefile($file, $config{underlaydir}, "test content");
+       }
+       return @_;
+}
+
+sub setup_srcdir {
+       foreach my $file (@_) {
+               writefile($file, $config{srcdir}, "test content");
+       }
+       return @_;
+}
+
+sub test_src_files {
+       my %expected=map { $_ => 1 } @{shift()}; # the input list may have dups
+       my $desc=shift;
+
+       close STDERR; # find_src_files prints warnings about bad files
+
+       my ($files, $pages)=IkiWiki::find_src_files();
+       is_deeply([sort @$files], [sort keys %expected], $desc);
+}
+
+cleanup();
+
+my @list=setup_underlay(qw{index.mdwn sandbox.mdwn smiley.png ikiwiki.mdwn ikiwiki/directive.mdwn ikiwiki/directive/foo.mdwn});
+push @list, setup_srcdir(qw{index.mdwn foo.mwdn icon.jpeg blog/archive/1/2/3/foo.mdwn blog/archive/1/2/4/bar.mdwn blog/archive.mdwn});
+test_src_files(\@list, "simple test");
+
+setup_srcdir(".badfile");
+test_src_files(\@list, "srcdir dotfile is skipped");
+
+setup_underlay(".badfile");
+test_src_files(\@list, "underlay dotfile is skipped");
+
+setup_srcdir(".ikiwiki/index");
+test_src_files(\@list, "srcdir dotdir is skipped");
+
+setup_underlay(".ikiwiki/index");
+test_src_files(\@list, "underlay dotdir is skipped");
+
+setup_srcdir("foo>.mdwn");
+test_src_files(\@list, "illegal srcdir filename skipped");
+
+setup_underlay("foo>.mdwn");
+test_src_files(\@list, "illegal underlay filename skipped");
+
+system("mkdir -p $config{srcdir}/empty");
+test_src_files(\@list, "empty srcdir directory ignored");
+
+system("mkdir -p $config{underlaydir}/empty");
+test_src_files(\@list, "empty underlay directory ignored");
+
+setup_underlay("bad.mdwn");
+system("ln -sf /etc/passwd $config{srcdir}/bad.mdwn");
+test_src_files(\@list, "underlaydir override attack foiled");
+
+system("ln -sf /etc/passwd $config{srcdir}/symlink.mdwn");
+test_src_files(\@list, "file symlink in srcdir skipped");
+
+system("ln -sf /etc/passwd $config{underlaydir}/symlink.mdwn");
+test_src_files(\@list, "file symlink in underlaydir skipped");
+
+system("ln -sf /etc/ $config{srcdir}/symdir");
+test_src_files(\@list, "dir symlink in srcdir skipped");
+
+system("ln -sf /etc/ $config{underlaydir}/symdir");
+test_src_files(\@list, "dir symlink in underlaydir skipped");
+
+system("ln -sf /etc/ $config{srcdir}/blog/symdir");
+test_src_files(\@list, "deep dir symlink in srcdir skipped");
+
+system("ln -sf /etc/ $config{underlaydir}/ikiwiki/symdir");
+test_src_files(\@list, "deep dir symlink in underlaydir skipped");
+
+
+
+
+cleanup();
diff --git a/t/git.t b/t/git.t
index f1c24b3598e1709d9d58a9f962df4fef1f12a3f1..ee778ebf0ab38050eabd52f8528c25d1fe392058 100755 (executable)
--- a/t/git.t
+++ b/t/git.t
@@ -38,7 +38,11 @@ is($changes[0]{pages}[0]{"page"}, ".gitignore");
 my $test1 = readfile("t/test1.mdwn");
 writefile('test1.mdwn', $config{srcdir}, $test1);
 IkiWiki::rcs_add("test1.mdwn");
-IkiWiki::rcs_commit("test1.mdwn", "Added the first page", "moo");
+IkiWiki::rcs_commit(
+       file => "test1.mdwn",
+       message => "Added the first page",
+       token => "moo",
+);
 
 @changes = IkiWiki::rcs_recentchanges(3);
 
@@ -68,7 +72,7 @@ is($changes[1]{pages}[0]{"page"}, "test1");
 writefile('test3.mdwn', $config{srcdir}, $test1);
 IkiWiki::rcs_add("test3.mdwn");
 IkiWiki::rcs_rename("test3.mdwn", "test4.mdwn");
-IkiWiki::rcs_commit_staged("Added the 4th page", "moo", "Joe User");
+IkiWiki::rcs_commit_staged(message => "Added the 4th page");
 
 @changes = IkiWiki::rcs_recentchanges(4);
 
@@ -77,7 +81,7 @@ is($changes[0]{pages}[0]{"page"}, "test4");
 
 ok(mkdir($config{srcdir}."/newdir"));
 IkiWiki::rcs_rename("test4.mdwn", "newdir/test5.mdwn");
-IkiWiki::rcs_commit_staged("Added the 5th page", "moo", "Joe User");
+IkiWiki::rcs_commit_staged(message => "Added the 5th page");
 
 @changes = IkiWiki::rcs_recentchanges(4);
 
@@ -85,6 +89,6 @@ is($#changes, 3);
 is($changes[0]{pages}[0]{"page"}, "newdir/test5");
 
 IkiWiki::rcs_remove("newdir/test5.mdwn");
-IkiWiki::rcs_commit_staged("Remove the 5th page", "moo", "Joe User");
+IkiWiki::rcs_commit_staged(message => "Remove the 5th page");
 
 system "rm -rf $dir";
index 2f23524a7cc987cf82329a2035370840d36ee3ef..392a167e9747131dbcd065b022a725ebf35f16d2 100755 (executable)
--- a/t/index.t
+++ b/t/index.t
@@ -4,7 +4,7 @@ use strict;
 use IkiWiki;
 
 package IkiWiki; # use internal variables
-use Test::More tests => 27;
+use Test::More tests => 31;
 
 $config{wikistatedir}="/tmp/ikiwiki-test.$$";
 system "rm -rf $config{wikistatedir}";
@@ -31,6 +31,7 @@ $renderedfiles{"bar"}=["bar.html", "bar.rss", "sparkline-foo.gif"];
 $renderedfiles{"bar.png"}=["bar.png"];
 $links{"Foo"}=["bar.png"];
 $links{"bar"}=["Foo", "new-page"];
+$typedlinks{"bar"}={tag => {"Foo" => 1}};
 $links{"bar.png"}=[];
 $depends{"Foo"}={};
 $depends{"bar"}={"foo*" => 1};
@@ -45,7 +46,7 @@ ok(-s "$config{wikistatedir}/indexdb", "index file created");
 
 # Clear state.
 %oldrenderedfiles=%pagectime=();
-%pagesources=%pagemtime=%oldlinks=%links=%depends=
+%pagesources=%pagemtime=%oldlinks=%links=%depends=%typedlinks=%oldtypedlinks=
 %destsources=%renderedfiles=%pagecase=%pagestate=();
 
 ok(loadindex(), "load index");
@@ -104,17 +105,26 @@ is_deeply(\%destsources, {
        "sparkline-foo.gif" => "bar",
        "bar.png" => "bar.png",
 }, "%destsources generated correctly");
+is_deeply(\%typedlinks, {
+       bar => {tag => {"Foo" => 1}},
+}, "%typedlinks loaded correctly");
+is_deeply(\%oldtypedlinks, {
+       bar => {tag => {"Foo" => 1}},
+}, "%oldtypedlinks loaded correctly");
 
 # Clear state.
 %oldrenderedfiles=%pagectime=();
-%pagesources=%pagemtime=%oldlinks=%links=%depends=
+%pagesources=%pagemtime=%oldlinks=%links=%depends=%typedlinks=%oldtypedlinks=
 %destsources=%renderedfiles=%pagecase=%pagestate=();
 
-# When state is loaded for a wiki rebuild, only ctime and oldrenderedfiles
-# are retained.
+# When state is loaded for a wiki rebuild, only ctime, oldrenderedfiles,
+# and pagesources are retained.
 $config{rebuild}=1;
 ok(loadindex(), "load index");
 is_deeply(\%pagesources, {
+       Foo => "Foo.mdwn",
+       bar => "bar.mdwn",
+       "bar.png" => "bar.png",
 }, "%pagesources loaded correctly");
 is_deeply(\%pagemtime, {
 }, "%pagemtime loaded correctly");
@@ -136,9 +146,16 @@ is_deeply(\%depends, {
 }, "%depends loaded correctly");
 is_deeply(\%pagestate, {
 }, "%pagestate loaded correctly");
-is_deeply(\%pagecase, {
+is_deeply(\%pagecase, { # generated implicitly since pagesources is loaded
+       foo => "Foo",
+       bar => "bar",
+       "bar.png" => "bar.png"
 }, "%pagecase generated correctly");
 is_deeply(\%destsources, {
 }, "%destsources generated correctly");
+is_deeply(\%typedlinks, {
+}, "%typedlinks cleared correctly");
+is_deeply(\%oldtypedlinks, {
+}, "%oldtypedlinks cleared correctly");
 
 system "rm -rf $config{wikistatedir}";
index 954b17526bd31c987fa21a0c77fa64e98b4d3139..b64ea8e563a0a0f6a683fa095374712c194a2c38 100755 (executable)
@@ -22,13 +22,22 @@ $config{srcdir} = "$dir/repo";
 IkiWiki::loadplugins();
 IkiWiki::checkconfig();
 
+use CGI::Session;
+my $session=CGI::Session->new;
+$session->param("name", "Joe User");
+
 system "hg init $config{srcdir}";
 
 # Web commit
 my $test1 = readfile("t/test1.mdwn");
 writefile('test1.mdwn', $config{srcdir}, $test1);
 IkiWiki::rcs_add("test1.mdwn");
-IkiWiki::rcs_commit("test1.mdwn", "Added the first page", "moo", "Joe User");
+IkiWiki::rcs_commit(
+       file => "test1.mdwn",
+       message => "Added the first page",
+       token => "moo",
+       session => $session,
+);
 
 my @changes;
 @changes = IkiWiki::rcs_recentchanges(3);
index 52d879484ce235d55c242d1b2a8d4505fa34f38f..74609010311bab89aec092215aa5a8e21663d298 100755 (executable)
@@ -10,9 +10,9 @@ BEGIN {
                eval q{use Test::More skip_all => "Net::OpenID::VerifiedIdentity not available"};
        }
        else {
-               eval q{use Test::More tests => 9};
+               eval q{use Test::More tests => 11};
        }
-       use_ok("IkiWiki::Plugin::openid");
+       use_ok("IkiWiki");
 }
 
 # Some typical examples:
@@ -28,6 +28,11 @@ $^W=1;
 is(IkiWiki::openiduser('http://yam655.livejournal.com/'), 'yam655 [livejournal.com]');
 is(IkiWiki::openiduser('http://id.mayfirst.org/jamie/'), 'jamie [id.mayfirst.org]');
 
+# yahoo has an anchor in the url
+is(IkiWiki::openiduser('https://me.yahoo.com/joeyhess#35f22'), 'joeyhess [me.yahoo.com]');
+# google urls are horrendous, but the worst bit is after a ?, so can be dropped
+is(IkiWiki::openiduser('https://www.google.com/accounts/o8/id?id=AItOawm-ebiIfxbKD3KNa-Cu9LvvD9edMLW7BAo'), 'id [www.google.com/accounts/o8]');
+
 # and some less typical ones taken from the ikiwiki commit history
 
 is(IkiWiki::openiduser('http://thm.id.fedoraproject.org/'), 'thm [id.fedoraproject.org]');
index b96947407b44838a39ade2dd89cd90b6788bd3f3..97bcc969c4068a958024658dc90f1801304dd2fd 100755 (executable)
@@ -1,7 +1,7 @@
 #!/usr/bin/perl
 use warnings;
 use strict;
-use Test::More tests => 64;
+use Test::More tests => 85;
 
 BEGIN { use_ok("IkiWiki"); }
 
@@ -40,11 +40,21 @@ ok(! pagespec_match("foo", "foo and bar"), "foo and bar");
 ok(pagespec_match("{f}oo", "{*}*"), "curly match");
 ok(! pagespec_match("foo", "{*}*"), "curly !match");
 
+ok(pagespec_match("somepage", "user(frodo)", user => "frodo"));
+ok(pagespec_match("somepage", "user(frodo)", user => "Frodo"));
+ok(! pagespec_match("somepage", "user(frodo)", user => "Sam"));
+ok(pagespec_match("somepage", "user(*o)", user => "Bilbo"));
+ok(pagespec_match("somepage", "user(*o)", user => "frodo"));
+ok(! pagespec_match("somepage", "user(*o)", user => "Sam"));
+ok(pagespec_match("somepage", "user(http://*.myopenid.com/)", user => "http://foo.myopenid.com/"));
+ok(pagespec_match("somepage", "user(*://*)", user => "http://foo.myopenid.com/"));
+
 # The link and backlink stuff needs this.
 $config{userdir}="";
 $links{foo}=[qw{bar baz}];
 $links{bar}=[];
 $links{baz}=[];
+$links{meh}=[];
 $links{"bugs/foo"}=[qw{bugs/done}];
 $links{"bugs/done"}=[];
 $links{"bugs/bar"}=[qw{done}];
@@ -56,7 +66,21 @@ $links{"ook"}=[qw{/blog/tags/foo}];
 foreach my $p (keys %links) {
        $pagesources{$p}="$p.mdwn";
 }
+$pagesources{"foo.png"}="foo.png";
+$pagesources{"foo"}="foo.mdwn";
+$IkiWiki::hooks{htmlize}{mdwn}={};
 
+ok(pagespec_match("foo", "foo"), "simple");
+ok(! pagespec_match("foo", "bar"), "simple fail");
+ok(pagespec_match("foo", "foo"), "simple glob");
+ok(pagespec_match("foo", "f*"), "simple glob fail");
+ok(pagespec_match("foo", "page(foo)"), "page()");
+print pagespec_match("foo", "page(foo)")."\n";
+ok(! pagespec_match("foo", "page(bar)"), "page() fail");
+ok(! pagespec_match("foo.png", "page(foo.png)"), "page() fails on non-page");
+ok(! pagespec_match("foo.png", "page(foo*)"), "page() fails on non-page glob");
+ok(pagespec_match("foo", "page(foo)"), "page() glob");
+ok(pagespec_match("foo", "page(f*)"), "page() glob fail");
 ok(pagespec_match("foo", "link(bar)"), "link");
 ok(pagespec_match("foo", "link(ba?)"), "glob link");
 ok(! pagespec_match("foo", "link(quux)"), "failed link");
@@ -73,6 +97,7 @@ ok(! pagespec_match("bar", ""), "empty pagespec should match nothing");
 ok(! pagespec_match("bar", "           "), "blank pagespec should match nothing");
 ok(pagespec_match("ook", "link(blog/tags/foo)"), "link internal absolute success");
 ok(pagespec_match("ook", "link(/blog/tags/foo)"), "link explicit absolute success");
+ok(pagespec_match("meh", "!link(done)"), "negated failing match is a success");
 
 $IkiWiki::pagectime{foo}=1154532692; # Wed Aug  2 11:26 EDT 2006
 $IkiWiki::pagectime{bar}=1154532695; # after
@@ -113,3 +138,7 @@ $i=pagespec_match("foo", "link(baz) and created_after(bar)")->influences;
 is(join(",", sort keys %$i), 'bar,foo', "influences add up over OR");
 $i=pagespec_match("foo", "!link(baz) and !created_after(bar)")->influences;
 is(join(",", sort keys %$i), 'bar,foo', "influences unaffected by negation");
+$i=pagespec_match("foo", "!link(baz) and !created_after(bar)")->influences;
+is(join(",", sort keys %$i), 'bar,foo', "influences unaffected by negation");
+$i=pagespec_match("meh", "!link(done)")->influences;
+is(join(",", sort keys %$i), 'meh', "a negated, failing link test is successful, so the page is a link influence");
index dd5dcc5b087bcff878b9c35e1904fdee856edb7c..244ad915991dfc622d01273f4cac6c2ad4fcdcc1 100755 (executable)
@@ -1,7 +1,7 @@
 #!/usr/bin/perl
 use warnings;
 use strict;
-use Test::More tests => 88;
+use Test::More tests => 126;
 
 BEGIN { use_ok("IkiWiki"); }
 
@@ -9,6 +9,12 @@ BEGIN { use_ok("IkiWiki"); }
 $config{srcdir}=$config{destdir}="/dev/null";
 IkiWiki::checkconfig();
 
+{
+       package IkiWiki::SortSpec;
+
+       sub cmp_path { $a cmp $b }
+}
+
 %pagesources=(
        foo => "foo.mdwn",
        foo2 => "foo2.mdwn",
@@ -18,6 +24,15 @@ IkiWiki::checkconfig();
        "post/2" => "post/2.mdwn",
        "post/3" => "post/3.mdwn",
 );
+$IkiWiki::pagectime{foo} = 2;
+$IkiWiki::pagectime{foo2} = 2;
+$IkiWiki::pagectime{foo3} = 1;
+$IkiWiki::pagectime{foo4} = 1;
+$IkiWiki::pagectime{foo5} = 1;
+$IkiWiki::pagectime{bar} = 3;
+$IkiWiki::pagectime{"post/1"} = 6;
+$IkiWiki::pagectime{"post/2"} = 6;
+$IkiWiki::pagectime{"post/3"} = 6;
 $links{foo}=[qw{post/1 post/2}];
 $links{foo2}=[qw{bar}];
 $links{foo3}=[qw{bar}];
@@ -25,15 +40,24 @@ $links{foo3}=[qw{bar}];
 is_deeply([pagespec_match_list("foo", "bar")], ["bar"]);
 is_deeply([sort(pagespec_match_list("foo", "* and !post/*"))], ["bar", "foo", "foo2", "foo3"]);
 is_deeply([sort(pagespec_match_list("foo", "post/*"))], ["post/1", "post/2", "post/3"]);
+is_deeply([pagespec_match_list("foo", "post/*", sort => "title")],
+       ["post/1", "post/2", "post/3"]);
 is_deeply([pagespec_match_list("foo", "post/*", sort => "title", reverse => 1)],
        ["post/3", "post/2", "post/1"]);
 is_deeply([pagespec_match_list("foo", "post/*", sort => "title", num => 2)],
        ["post/1", "post/2"]);
 is_deeply([pagespec_match_list("foo", "post/*", sort => "title", num => 50)],
        ["post/1", "post/2", "post/3"]);
+is_deeply([pagespec_match_list("foo", "post/*", sort => "title", num => 50, reverse => 1)],
+       ["post/3", "post/2", "post/1"]);
 is_deeply([pagespec_match_list("foo", "post/*", sort => "title",
                          filter => sub { $_[0] =~ /3/}) ],
        ["post/1", "post/2"]);
+is_deeply([pagespec_match_list("foo", "*", sort => "path", num => 2)],
+       ["bar", "foo"]);
+is_deeply([pagespec_match_list("foo", "foo* or bar*",
+               sort => "-age title")], # oldest first, break ties by title
+       ["foo3", "foo", "foo2", "bar"]);
 my $r=eval { pagespec_match_list("foo", "beep") };
 ok(eval { pagespec_match_list("foo", "beep") } == 0);
 ok(! $@, "does not fail with error when unable to match anything");
@@ -57,18 +81,44 @@ foreach my $spec ("* and link(bar)", "* or link(bar)") {
        %IkiWiki::depends=();
 }
 
+# A link pagespec is influenced by the pages that currently contain the link.
+# It is not influced by pages that do not currently contain the link,
+# because if those pages were changed to contain it, regular dependency
+# handling would be triggered.
+foreach my $spec ("* and link(bar)", "link(bar)", "no_such_page or link(bar)") {
+       pagespec_match_list("foo2", $spec);
+       ok($IkiWiki::depends_simple{foo2}{foo2} == $IkiWiki::DEPEND_LINKS);
+       ok(! exists $IkiWiki::depends_simple{foo2}{foo}, $spec);
+       %IkiWiki::depends_simple=();
+       %IkiWiki::depends=();
+}
+
+# Oppositely, a pagespec that tests for pages that do not have a link
+# is not influenced by pages that currently contain the link, but
+# is instead influenced by pages that currently do not (but that
+# could be changed to have it).
+foreach my $spec ("* and !link(bar)", "* and !(!(!link(bar)))") {
+       pagespec_match_list("foo2", $spec);
+       ok(! exists $IkiWiki::depends_simple{foo2}{foo2});
+       ok($IkiWiki::depends_simple{foo2}{foo} == $IkiWiki::DEPEND_LINKS, $spec);
+       %IkiWiki::depends_simple=();
+       %IkiWiki::depends=();
+}
+
 # a pagespec with backlinks() will add as an influence the page with the links
-foreach my $spec ("bar or (backlink(foo) and !*.png)", "backlink(foo)") {
+foreach my $spec ("bar or (backlink(foo) and !*.png)", "backlink(foo)", "!backlink(foo)") {
        pagespec_match_list("foo2", $spec, deptype => deptype("presence"));
        ok($IkiWiki::depends{foo2}{$spec} & $IkiWiki::DEPEND_PRESENCE);
        ok(! ($IkiWiki::depends{foo2}{$spec} & ($IkiWiki::DEPEND_CONTENT | $IkiWiki::DEPEND_LINKS)));
        ok($IkiWiki::depends_simple{foo2}{foo} == $IkiWiki::DEPEND_LINKS);
+       ok(! exists $IkiWiki::depends_simple{foo2}{foo2});
        %IkiWiki::depends_simple=();
        %IkiWiki::depends=();
        pagespec_match_list("foo2", $spec, deptype => deptype("links"));
        ok($IkiWiki::depends{foo2}{$spec} & $IkiWiki::DEPEND_LINKS);
        ok(! ($IkiWiki::depends{foo2}{$spec} & ($IkiWiki::DEPEND_PRESENCE | $IkiWiki::DEPEND_CONTENT)));
        ok($IkiWiki::depends_simple{foo2}{foo} == $IkiWiki::DEPEND_LINKS);
+       ok(! exists $IkiWiki::depends_simple{foo2}{foo2});
        %IkiWiki::depends_simple=();
        %IkiWiki::depends=();
        pagespec_match_list("foo2", $spec, deptype => deptype("presence", "links"));
@@ -76,6 +126,7 @@ foreach my $spec ("bar or (backlink(foo) and !*.png)", "backlink(foo)") {
        ok($IkiWiki::depends{foo2}{$spec} & $IkiWiki::DEPEND_LINKS);
        ok(! ($IkiWiki::depends{foo2}{$spec} & $IkiWiki::DEPEND_CONTENT));
        ok($IkiWiki::depends_simple{foo2}{foo} == $IkiWiki::DEPEND_LINKS);
+       ok(! exists $IkiWiki::depends_simple{foo2}{foo2});
        %IkiWiki::depends_simple=();
        %IkiWiki::depends=();
        pagespec_match_list("foo2", $spec);
@@ -110,3 +161,14 @@ foreach my $spec ("nosuchpage or link(bar)", "link(bar) or nosuchpage",
        %IkiWiki::depends_simple=();
        %IkiWiki::depends=();
 }
+
+my @ps;
+foreach my $p (100..500) {
+       $IkiWiki::pagectime{"p/$p"} = $p;
+       $pagesources{"p/$p"} = "p/$p.mdwn";
+       unshift @ps, "p/$p";
+}
+is_deeply([pagespec_match_list("foo", "p/*", sort => "age")],
+       [@ps]);
+is_deeply([pagespec_match_list("foo", "p/*", sort => "age", num => 20)],
+       [@ps[0..19]]);
index 593937a97f2c7878150080d3af789f86472b8d89..9b46549038c12b8bc86c316cf7cb3369ded0f77d 100755 (executable)
@@ -21,7 +21,6 @@ IkiWiki::checkconfig();
 # Test data
 $expected{'parentlinks'} =
   {
-   "" => [],
    "ikiwiki" => [],
    "ikiwiki/pagespec" =>
      [ {depth => 0, height => 2, },
index b49b9833813468597e269ab0b9af38ae9920dc0b..adb8648b4aa6ec9aea50ec31f0197ab6d16d03fd 100755 (executable)
@@ -5,7 +5,7 @@ use Test::More 'no_plan';
 
 ok(! system("mkdir t/tmp"));
 ok(! system("make -s ikiwiki.out"));
-ok(! system("perl -I. ./ikiwiki.out -plugin inline -url=http://example.com -cgiurl=http://example.com/ikiwiki.cgi -rss -atom -underlaydir=underlays/basewiki -templatedir=templates t/tinyblog t/tmp/out"));
+ok(! system("perl -I. ./ikiwiki.out -plugin inline -url=http://example.com -cgiurl=http://example.com/ikiwiki.cgi -rss -atom -underlaydir=underlays/basewiki -set underlaydirbase=underlays -templatedir=templates t/tinyblog t/tmp/out"));
 # This guid should never, ever change, for any reason whatsoever!
 my $guid="http://example.com/post/";
 ok(length `grep '<guid>$guid</guid>' t/tmp/out/index.rss`);
index e5026ed64b575ba8ed2215e468bb322d4086f020..7bb9878d0fdbfd16d2db04af6190bf11209c50c2 100755 (executable)
@@ -1,7 +1,7 @@
 #!/usr/bin/perl
 use warnings;
 use strict;
-use Test::More tests => 21;
+use Test::More tests => 31;
 
 BEGIN { use_ok("IkiWiki"); }
 
@@ -26,6 +26,16 @@ is(IkiWiki::preprocess("foo", "foo", "[[foo ]]", 0, 0), "foo()", "simple");
 is(IkiWiki::preprocess("foo", "foo", "[[!foo ]]", 0, 0), "foo()", "prefixed");
 is(IkiWiki::preprocess("foo", "foo", "[[!foo]]", 0, 0), "[[!foo]]", "prefixed, no space");
 is(IkiWiki::preprocess("foo", "foo", "[[foo a=1]]", 0, 0), "foo(a => 1)");
+is(IkiWiki::preprocess("foo", "foo", q{[[foo a="1"]]}, 0, 0), "foo(a => 1)");
+is(IkiWiki::preprocess("foo", "foo", q{[[foo a="""1"""]]}, 0, 0), "foo(a => 1)");
+is(IkiWiki::preprocess("foo", "foo", q{[[foo a=""]]}, 0, 0), "foo(a)");
+is(IkiWiki::preprocess("foo", "foo", q{[[foo a="" b="1"]]}, 0, 0), "foo(a, b => 1)");
+is(IkiWiki::preprocess("foo", "foo", q{[[foo a=""""""]]}, 0, 0), "foo(a)");
+is(IkiWiki::preprocess("foo", "foo", q{[[foo a="""""" b="1"]]}, 0, 0), "foo(a, b => 1)");
+is(IkiWiki::preprocess("foo", "foo", q{[[foo a="""""" b="""1"""]]}, 0, 0), "foo(a, b => 1)");
+is(IkiWiki::preprocess("foo", "foo", q{[[foo a="""""" b=""""""]]}, 0, 0), "foo(a, b)");
+is(IkiWiki::preprocess("foo", "foo", q{[[foo a="" b=""""""]]}, 0, 0), "foo(a, b)");
+is(IkiWiki::preprocess("foo", "foo", q{[[foo a="" b="""1"""]]}, 0, 0), "foo(a, b => 1)");
 is(IkiWiki::preprocess("foo", "foo", "[[foo a=\"1 2 3 4\"]]", 0, 0), "foo(a => 1 2 3 4)");
 is(IkiWiki::preprocess("foo", "foo", "[[foo ]] then [[foo a=2]]", 0, 0),
        "foo() then foo(a => 2)");
diff --git a/t/svn.t b/t/svn.t
index 5223b4409416911276974a57a823224cc4912df6..82b71b5fc1a404fc81159b6585c47997e9a4eb10 100755 (executable)
--- a/t/svn.t
+++ b/t/svn.t
@@ -36,7 +36,11 @@ system "svn co file://$svnrepo/trunk $config{srcdir} >/dev/null";
 my $test1 = readfile("t/test1.mdwn");
 writefile('test1.mdwn', $config{srcdir}, $test1);
 IkiWiki::rcs_add("test1.mdwn");
-IkiWiki::rcs_commit("test1.mdwn", "Added the first page", "moo");
+IkiWiki::rcs_commit(
+       file => "test1.mdwn",
+       message => "Added the first page",
+       token => "moo",
+);
 
 my @changes;
 @changes = IkiWiki::rcs_recentchanges(3);
diff --git a/t/tag.t b/t/tag.t
new file mode 100755 (executable)
index 0000000..fe547d8
--- /dev/null
+++ b/t/tag.t
@@ -0,0 +1,39 @@
+#!/usr/bin/perl
+package IkiWiki;
+
+use warnings;
+use strict;
+use Test::More tests => 7;
+
+BEGIN { use_ok("IkiWiki"); }
+BEGIN { use_ok("IkiWiki::Plugin::tag"); }
+
+ok(! system("rm -rf t/tmp; mkdir t/tmp"));
+
+$config{userdir} = "users";
+$config{tagbase} = "tags";
+
+%oldrenderedfiles=%pagectime=();
+%pagesources=%pagemtime=%oldlinks=%links=%depends=%typedlinks=%oldtypedlinks=
+%destsources=%renderedfiles=%pagecase=%pagestate=();
+
+foreach my $page (qw(tags/numbers tags/letters one two alpha beta)) {
+       $pagesources{$page} = "$page.mdwn";
+       $pagemtime{$page} = $pagectime{$page} = 1000000;
+}
+
+$links{one}=[qw(tags/numbers alpha tags/letters)];
+$links{two}=[qw(tags/numbers)];
+$links{alpha}=[qw(tags/letters one)];
+$links{beta}=[qw(tags/letters)];
+$typedlinks{one}={tag => {"tags/numbers" => 1 }};
+$typedlinks{two}={tag => {"tags/numbers" => 1 }};
+$typedlinks{alpha}={tag => {"tags/letters" => 1 }};
+$typedlinks{beta}={tag => {"tags/letters" => 1 }};
+
+ok(pagespec_match("one", "tagged(numbers)"));
+ok(!pagespec_match("two", "tagged(alpha)"));
+ok(pagespec_match("one", "link(tags/numbers)"));
+ok(pagespec_match("one", "link(alpha)"));
+
+1;
diff --git a/t/template_syntax.t b/t/template_syntax.t
new file mode 100755 (executable)
index 0000000..1e156ee
--- /dev/null
@@ -0,0 +1,15 @@
+#!/usr/bin/perl
+use warnings;
+use strict;
+use Test::More;
+
+my @templates=glob("templates/*.tmpl"), glob("doc/templates/*.mdwn");
+plan(tests => 2*@templates);
+
+use HTML::Template;
+
+foreach my $template (@templates) {
+       my $obj=eval {HTML::Template->new(filename => $template)};
+       ok(! $@, $template." $@");
+       ok($obj, $template);
+}
diff --git a/t/templates_documented.t b/t/templates_documented.t
new file mode 100755 (executable)
index 0000000..826c51d
--- /dev/null
@@ -0,0 +1,14 @@
+#!/usr/bin/perl
+use warnings;
+use strict;
+use Test::More 'no_plan';
+
+$/=undef;
+open(IN, "doc/templates.mdwn") || die "doc/templates.mdwn: $!";
+my $page=<IN>;
+close IN;
+
+foreach my $file (glob("templates/*.tmpl")) {
+       $file=~s/templates\///;
+       ok($page =~ /\Q$file\E/, "$file documented on doc/templates.mdwn");
+}
index 8b893673323114e98a749b0b21a4a5b1afdd7da0..4e89efe3282082faf98f654294a31357422ff34b 100644 (file)
@@ -1,15 +1,15 @@
 <TMPL_VAR CONTENT>
-<TMPL_LOOP NAME="TAGS">
+<TMPL_LOOP TAGS>
 [[!tag <TMPL_VAR TAG>]]
 </TMPL_LOOP>
-<TMPL_IF NAME="TITLE">
-[[!meta title="<TMPL_VAR NAME="TITLE" ESCAPE=HTML>"]]
+<TMPL_IF TITLE>
+[[!meta title="<TMPL_VAR TITLE ESCAPE=HTML>"]]
 </TMPL_IF>
-<TMPL_IF NAME="PERMALINK">
-[[!meta permalink="<TMPL_VAR NAME="PERMALINK" ESCAPE=HTML>"]]
+<TMPL_IF PERMALINK>
+[[!meta permalink="<TMPL_VAR PERMALINK ESCAPE=HTML>"]]
 </TMPL_IF>
-<TMPL_IF NAME="COPYRIGHT">
-[[!meta copyright="<TMPL_VAR NAME="COPYRIGHT" ESCAPE=HTML>"]]
+<TMPL_IF COPYRIGHT>
+[[!meta copyright="<TMPL_VAR COPYRIGHT ESCAPE=HTML>"]]
 </TMPL_IF>
-[[!meta author="<TMPL_VAR NAME="NAME" ESCAPE=HTML>"]]
-[[!meta authorurl="<TMPL_VAR NAME="URL" ESCAPE=HTML>"]]
+[[!meta author="<TMPL_VAR NAME ESCAPE=HTML>"]]
+[[!meta authorurl="<TMPL_VAR URL ESCAPE=HTML>"]]
index 28800e7632150329df26bc5e324b16a33a70d1ef..93bdd9ce0e50135eec16dd4b7b6a9c5c5969a190 100644 (file)
@@ -1,14 +1,14 @@
 <p>
-<TMPL_IF NAME="PERMALINK">
+<TMPL_IF PERMALINK>
 <a href="<TMPL_VAR PERMALINK>"><TMPL_VAR TITLE></a><br />
 <TMPL_ELSE>
 <a href="<TMPL_VAR PAGEURL>"><TMPL_VAR TITLE></a><br />
 </TMPL_IF>
 <i>
 Posted <TMPL_VAR CTIME>
-<TMPL_IF NAME="AUTHOR">
+<TMPL_IF AUTHOR>
 by <span class="author">
-<TMPL_IF NAME="AUTHORURL">
+<TMPL_IF AUTHORURL>
 <a href="<TMPL_VAR AUTHORURL>"><TMPL_VAR AUTHOR></a>
 <TMPL_ELSE>
 <TMPL_VAR AUTHOR>
index 768695a2ca0d434e376cdf1b1de7325376b5aa49..4ed17bc62070756b16e2dc1c6de3d10d0058de5e 100644 (file)
@@ -1,48 +1,48 @@
 <entry>
        <title><TMPL_VAR TITLE></title>
-       <TMPL_IF NAME="GUID">
-         <id><TMPL_VAR GUID></id>
-       <TMPL_ELSE>
-         <id><TMPL_VAR URL></id>
-       </TMPL_IF>
+<TMPL_IF GUID>
+       <id><TMPL_VAR GUID></id>
+<TMPL_ELSE>
+       <id><TMPL_VAR URL></id>
+</TMPL_IF>
        <link href="<TMPL_VAR PERMALINK>"/>
-       <TMPL_IF NAME="AUTHOR">
-        <author><name><TMPL_VAR AUTHOR ESCAPE=HTML></name></author>
-       </TMPL_IF>
-       <TMPL_IF NAME="COPYRIGHT">
-        <rights type="html" xml:lang="en">
-          <TMPL_IF NAME="LICENSE">
-           <TMPL_VAR LICENSE ESCAPE=HTML>
-           <TMPL_VAR COPYRIGHT ESCAPE=HTML>
-          <TMPL_ELSE>
-           <TMPL_VAR COPYRIGHT ESCAPE=HTML>
-          </TMPL_IF>
-        </rights>
-       <TMPL_ELSE>
-        <TMPL_IF NAME="LICENSE">
-         <rights type="html" xml:lang="en">
-           <TMPL_VAR LICENSE ESCAPE=HTML>
-         </rights>
-        </TMPL_IF>
-       </TMPL_IF>
-       <TMPL_IF NAME="CATEGORIES">
-        <TMPL_LOOP NAME="CATEGORIES">
-         <category term="<TMPL_VAR CATEGORY>" />
-        </TMPL_LOOP>
-       </TMPL_IF>
+<TMPL_IF AUTHOR>
+       <author><name><TMPL_VAR AUTHOR ESCAPE=HTML></name></author>
+</TMPL_IF>
+<TMPL_IF COPYRIGHT>
+       <rights type="html" xml:lang="en">
+<TMPL_IF LICENSE>
+               <TMPL_VAR LICENSE ESCAPE=HTML>
+               <TMPL_VAR COPYRIGHT ESCAPE=HTML>
+<TMPL_ELSE>
+               <TMPL_VAR COPYRIGHT ESCAPE=HTML>
+</TMPL_IF>
+       </rights>
+<TMPL_ELSE>
+<TMPL_IF LICENSE>
+       <rights type="html" xml:lang="en">
+       <TMPL_VAR LICENSE ESCAPE=HTML>
+       </rights>
+</TMPL_IF>
+</TMPL_IF>
+<TMPL_IF CATEGORIES>
+<TMPL_LOOP CATEGORIES>
+       <category term="<TMPL_VAR CATEGORY>" />
+</TMPL_LOOP>
+</TMPL_IF>
        <updated><TMPL_VAR MDATE_3339></updated>
        <published><TMPL_VAR CDATE_3339></published>
-       <TMPL_IF NAME="ENCLOSURE">
-        <link rel="enclosure" type="<TMPL_VAR TYPE>" href="<TMPL_VAR ENCLOSURE>" length="<TMPL_VAR LENGTH>" />
-       <TMPL_ELSE>
-        <content type="html" xml:lang="en">
-         <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>
+<TMPL_IF ENCLOSURE>
+       <link rel="enclosure" type="<TMPL_VAR TYPE>" href="<TMPL_VAR ENCLOSURE>" length="<TMPL_VAR LENGTH>" />
+<TMPL_ELSE>
+       <content type="html" xml:lang="en">
+       <TMPL_VAR CONTENT ESCAPE=HTML>
+       </content>
+</TMPL_IF>
+<TMPL_IF COMMENTSURL>
+       <link rel="comments" href="<TMPL_VAR COMMENTSURL>" type="text/html" />
+</TMPL_IF>
+<TMPL_IF ATOMCOMMENTSURL>
+       <link rel="comments" href="<TMPL_VAR ATOMCOMMENTSURL>" type="application/atom+xml" />
+</TMPL_IF>
 </entry>
index dcb89ab5cfac9ed6f26ca1e15a20caf58e6f9491..e82b59827c0c68c1ec2a9ce813fce1c367cfb995 100644 (file)
@@ -5,32 +5,32 @@
 <link href="<TMPL_VAR PAGEURL>"/>
 <link href="<TMPL_VAR FEEDURL>" rel="self" type="application/atom+xml"/>
 <author>
-<TMPL_IF NAME="AUTHOR">
- <name><TMPL_VAR AUTHOR></name>
+<TMPL_IF AUTHOR>
+<name><TMPL_VAR AUTHOR></name>
 <TMPL_ELSE>
- <name><TMPL_VAR WIKINAME></name>
+<name><TMPL_VAR WIKINAME></name>
 </TMPL_IF>
 </author>
-<TMPL_IF NAME="COPYRIGHT">
- <rights type="html" xml:lang="en">
-   <TMPL_IF NAME="LICENSE">
-    <TMPL_VAR LICENSE>
-    <TMPL_VAR COPYRIGHT ESCAPE=HTML>
-   <TMPL_ELSE>
-    <TMPL_VAR COPYRIGHT ESCAPE=HTML>
-   </TMPL_IF>
- </rights>
+<TMPL_IF COPYRIGHT>
+<rights type="html" xml:lang="en">
+<TMPL_IF LICENSE>
+       <TMPL_VAR LICENSE>
+       <TMPL_VAR COPYRIGHT ESCAPE=HTML>
 <TMPL_ELSE>
- <TMPL_IF NAME="LICENSE">
-  <rights type="html">
-    <TMPL_VAR LICENSE ESCAPE=HTML>
-  </rights>
- </TMPL_IF>
+       <TMPL_VAR COPYRIGHT ESCAPE=HTML>
 </TMPL_IF>
-<TMPL_IF NAME="GUID">
-  <id><TMPL_VAR GUID></id>
+</rights>
 <TMPL_ELSE>
-  <id><TMPL_VAR PAGEURL></id>
+<TMPL_IF LICENSE>
+<rights type="html">
+       <TMPL_VAR LICENSE ESCAPE=HTML>
+</rights>
+</TMPL_IF>
+</TMPL_IF>
+<TMPL_IF GUID>
+<id><TMPL_VAR GUID></id>
+<TMPL_ELSE>
+<id><TMPL_VAR PAGEURL></id>
 </TMPL_IF>
 <subtitle type="html"><TMPL_VAR FEEDDESC ESCAPE=HTML></subtitle>
 <generator uri="http://ikiwiki.info/" version="<TMPL_VAR VERSION>">ikiwiki</generator>
diff --git a/templates/autotag.tmpl b/templates/autotag.tmpl
new file mode 100644 (file)
index 0000000..9162e9e
--- /dev/null
@@ -0,0 +1,4 @@
+[[!meta title="pages tagged <TMPL_VAR TAGNAME>"]]
+
+[[!inline pages="tagged(<TMPL_VAR TAG>)" actions="no" archive="yes"
+feedshow=10]]
index 7eeede6038b64c16520dcc506c3198ffe42ecd85..5a31e3f8a6a3e833985242e006117db772aa4531 100644 (file)
@@ -1,10 +1,10 @@
 <form action="<TMPL_VAR CGIURL>" method="get">
 <div id="blogform">
-<TMPL_IF NAME="RSSURL">
-<a class="feedbutton" type="application/rss+xml" href="<TMPL_VAR NAME=RSSURL>">RSS</a>
+<TMPL_IF RSSURL>
+<a class="feedbutton" type="application/rss+xml" href="<TMPL_VAR RSSURL>">RSS</a>
 </TMPL_IF>
-<TMPL_IF NAME="ATOMURL">
-<a class="feedbutton" type="application/atom+xml" href="<TMPL_VAR NAME=ATOMURL>">Atom</a>
+<TMPL_IF ATOMURL>
+<a class="feedbutton" type="application/atom+xml" href="<TMPL_VAR ATOMURL>">Atom</a>
 </TMPL_IF>
 <input type="hidden" name="do" value="blog" />
 <input type="hidden" name="from" value="<TMPL_VAR ROOTPAGE>" />
index 37ad78c5cd8947a06dd1b9f485bfe0bcaff051d5..23cd95430843d22cffdf3e27d2770e927fa8fb3a 100644 (file)
@@ -1,3 +1,5 @@
+[[!sidebar content="""
 [[!calendar type=month month=<TMPL_VAR MONTH> year=<TMPL_VAR YEAR> pages="<TMPL_VAR PAGESPEC>"]]
+"""]]
 
 [[!inline pages="creation_month(<TMPL_VAR MONTH>) and creation_year(<TMPL_VAR YEAR>) and <TMPL_VAR PAGESPEC>" show=0 feeds=no reverse=yes]]
index 0e61a80f4efc2d1fc173d031b827006bfce69cef..671b9e48358445260ce6d0db200c0d5750625993 100644 (file)
@@ -2,15 +2,15 @@
 <TMPL_IF AUTHORURL>
 [[!meta authorurl="""<TMPL_VAR AUTHORURL>"""]]
 </TMPL_IF>
-[[!meta title="""change to<TMPL_LOOP NAME="PAGES"> <TMPL_VAR PAGE></TMPL_LOOP> on <TMPL_VAR WIKINAME>"""]]
+[[!meta title="""change to<TMPL_LOOP PAGES> <TMPL_VAR PAGE></TMPL_LOOP> on <TMPL_VAR WIKINAME>"""]]
 <TMPL_IF PERMALINK>
 [[!meta permalink="<TMPL_VAR PERMALINK>"]]
 </TMPL_IF>
 <div id="change-<TMPL_VAR REV>" class="metadata">
 <span class="desc"><br />Changed pages:</span>
 <span class="pagelinks">
-<TMPL_LOOP NAME="PAGES">
-<TMPL_IF NAME="DIFFURL"><a href="<TMPL_VAR DIFFURL>">[[diff|wikiicons/diff.png]]</a><TMPL_VAR LINK>
+<TMPL_LOOP PAGES>
+<TMPL_IF DIFFURL><a href="<TMPL_VAR DIFFURL>">[[diff|wikiicons/diff.png]]</a><TMPL_VAR LINK>
 <TMPL_ELSE>
 <TMPL_VAR LINK>
 </TMPL_IF>
@@ -18,7 +18,7 @@
 </span>
 <span class="desc"><br />Changed by:</span>
 <span class="committer">
-<TMPL_IF NAME="AUTHORURL">
+<TMPL_IF AUTHORURL>
 <a href="<TMPL_VAR AUTHORURL>" rel="nofollow"><TMPL_VAR USER></a>
 <TMPL_ELSE>
 <TMPL_VAR USER>
 <span class="desc"><br />Commit type:</span>
 <span class="committype"><TMPL_VAR COMMITTYPE></span>
 <span class="desc"><br />Date:</span>
-<span class="changedate"><TMPL_VAR COMMITDATE>
+<span class="changedate"><TMPL_VAR COMMITDATE></span>
 </div>
-<div class=changelog>
-<TMPL_LOOP NAME="MESSAGE">
-<TMPL_IF NAME="LINE">
-<TMPL_VAR NAME="LINE"><br />
+<div class="changelog">
+<TMPL_LOOP MESSAGE>
+<TMPL_IF LINE>
+<TMPL_VAR LINE><br />
 </TMPL_IF>
 </TMPL_LOOP>
 </div>
-<TMPL_IF NAME="DIFF">
-<div class=diff>
+<TMPL_IF DIFF>
+<div class="diff">
 <pre>
-<TMPL_VAR NAME="DIFF">
+<TMPL_VAR DIFF>
 </pre>
 </div>
 </TMPL_IF>
index fb76ea00494880863a8973b1942ae11a2e4e5a87..fa90e6d26f87d756339dd1773a79fb43fc137da5 100644 (file)
@@ -1,59 +1,58 @@
-<div class="comment" id="<TMPL_VAR NAME=COMMENTID>">
+<TMPL_IF HTML5><article class="comment" id="<TMPL_VAR COMMENTID>">
+<TMPL_ELSE><div class="comment" id="<TMPL_VAR COMMENTID>"></TMPL_IF>
 
-<div class="comment-subject">
+<TMPL_IF HTML5><header class="comment-subject"><TMPL_ELSE><div class="comment-subject"></TMPL_IF>
 <TMPL_IF PERMALINK>
 <a href="<TMPL_VAR PERMALINK>"><TMPL_VAR TITLE></a>
 <TMPL_ELSE>
 <TMPL_VAR TITLE>
 </TMPL_IF>
-</div>
+<TMPL_IF HTML5></header><TMPL_ELSE></div></TMPL_IF>
 
-<div class="inlinecontent">
+<TMPL_IF HTML5><section class="inlinecontent"><TMPL_ELSE><div class="inlinecontent"></TMPL_IF>
 <TMPL_VAR CONTENT>
-</div>
+<TMPL_IF HTML5></section><TMPL_ELSE></div></TMPL_IF>
 
-<div class="comment-header">
+<TMPL_IF HTML5><header class="comment-header"><TMPL_ELSE><div class="comment-header"></TMPL_IF>
 Comment by
-
-<TMPL_IF NAME="COMMENTUSER">
-<TMPL_IF NAME="COMMENTOPENID">
+<TMPL_IF COMMENTUSER>
+<TMPL_IF COMMENTOPENID>
 <span class="author" title="OpenID">
-<a href="<TMPL_VAR NAME=COMMENTOPENID>"><TMPL_VAR NAME=COMMENTAUTHOR></a>
+<a href="<TMPL_VAR COMMENTOPENID>"><TMPL_VAR 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_IF COMMENTAUTHORURL>
+<a href="<TMPL_VAR COMMENTAUTHORURL>"><TMPL_VAR COMMENTAUTHOR></a>
 <TMPL_ELSE>
-<TMPL_VAR NAME=COMMENTAUTHOR>
+<TMPL_VAR 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 -->
+<TMPL_ELSE>
+<TMPL_IF COMMENTIP>
+<span class="author" title="Unauthenticated, from <TMPL_VAR COMMENTIP>">
+<TMPL_ELSE>
 <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_IF AUTHORURL>
+<a href="<TMPL_VAR AUTHORURL>"><TMPL_VAR AUTHOR></a>
 <TMPL_ELSE>
-<TMPL_VAR NAME=AUTHOR>
+<TMPL_VAR AUTHOR>
 </TMPL_IF>
 </span>
-</TMPL_IF><!-- !COMMENTUSER -->
-
+</TMPL_IF>
 &mdash; <TMPL_VAR CTIME>
-</div>
+<TMPL_IF HTML5></header><TMPL_ELSE></div></TMPL_IF>
 
-<TMPL_IF NAME="HAVE_ACTIONS">
-<div class="actions">
+<TMPL_IF HAVE_ACTIONS>
+<TMPL_IF HTML5><nav class="actions"><TMPL_ELSE><div class="actions"></TMPL_IF>
 <ul>
-<TMPL_IF NAME="REMOVEURL">
+<TMPL_IF REMOVEURL>
 <li><a href="<TMPL_VAR REMOVEURL>" rel="nofollow">Remove comment</a></li>
 </TMPL_IF>
 </ul>
-</div><!--.actions-->
+<TMPL_IF HTML5></nav><TMPL_ELSE></div></TMPL_IF>
 </TMPL_IF>
 
-</div><!--.comment-->
+<TMPL_IF HTML5></article><TMPL_ELSE></div></TMPL_IF>
index e91d3146d511cc6aa4edd1f9ddf61802cdaeef41..dfa63c20bdd17b21005c5f31ce6af76be2b2cd9c 100644 (file)
@@ -1,26 +1,29 @@
-<TMPL_IF NAME="COMMENTS">
+<TMPL_IF COMMENTS>
 <br />
 <form action="<TMPL_VAR CGIURL>" method="post">
 <input type="hidden" name="do" value="commentmoderation" />
 <input type="hidden" name="sid" value="<TMPL_VAR SID>" />
 <input type="submit" value="Submit" />
-<input type="checkbox" name="rejectalldefer" value="1" />Reject
-all comments marked <em>Defer</em>
-<br />  
-<TMPL_LOOP NAME="COMMENTS">
+<input id="rejectalldefer" type="checkbox" name="rejectalldefer" value="1" />
+<label for="rejectalldefer">Reject all comments marked <em>Defer</em></label>
+<br />
+<TMPL_LOOP COMMENTS>
 <div>
 <div>
 <TMPL_VAR VIEW>
 </div>
-<input type="radio" value="Defer" name="<TMPL_VAR ID>" checked />Defer
-<input type="radio" value="Accept" name="<TMPL_VAR ID>" />Accept
-<input type="radio" value="Reject" name="<TMPL_VAR ID>" />Reject
+<input id="defer_<TMPL_VAR ID>" type="radio" value="Defer" name="<TMPL_VAR ID>" checked="checked" />
+<label for="defer_<TMPL_VAR ID>">Defer</label>
+<input id="dccept_<TMPL_VAR ID>" type="radio" value="Accept" name="<TMPL_VAR ID>" />
+<label for="dccept_<TMPL_VAR ID>">Accept</label>
+<input id="reject_<TMPL_VAR ID>" type="radio" value="Reject" name="<TMPL_VAR ID>" />
+<label for="reject_<TMPL_VAR ID>">Reject</label>
 </div>
 <br />
 </TMPL_LOOP>
 <input type="submit" value="Submit" />
-<input type="checkbox" name="rejectalldefer" value="1" />Reject
-all comments marked <em>Defer</em>
+<input id="rejectalldefer2" type="checkbox" name="rejectalldefer" value="1" />
+<label for="rejectalldefer2">Reject all comments marked <em>Defer</em></label>
 </form>
 <TMPL_ELSE>
 <p>
index 32e8c392d548c1d04fd3d12962588b39b7e34dc0..a2edc691e7cf98dedbfe6195f10791f678842f07 100644 (file)
@@ -1,19 +1,26 @@
 <div class="editcomment">
 <TMPL_VAR MESSAGE>
+<br />
 <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, or
-<a href="<TMPL_VAR SIGNINURL>">signin</a>)<br />
-Website: <TMPL_VAR NAME=FIELD-URL> (optional)<br />
+<label for="author" class="block">Name:</label>
+<TMPL_VAR NAME=FIELD-AUTHOR> (optional, or <a href="<TMPL_VAR SIGNINURL>">signin</a>)
+<br/>
+<label for="url" class="block">Website:</label>
+<TMPL_VAR NAME=FIELD-URL> (optional)
+<br />
 <TMPL_ELSE>
-(You might want to <a href="<TMPL_VAR SIGNINURL>">Signin</a> first?)<br />
+(You might want to <a href="<TMPL_VAR SIGNINURL>">Signin</a> first?)
+<br />
 </TMPL_IF>
 </TMPL_UNLESS>
-Subject: <TMPL_VAR FIELD-SUBJECT><br />
+<label for="subject" class="block">Subject:</label>
+<TMPL_VAR FIELD-SUBJECT><br />
+<label for="editcontent" class="block">Comment:</label>
 <TMPL_VAR FIELD-EDITCONTENT><br />
 <TMPL_VAR FORM-SUBMIT> <TMPL_VAR FIELD-TYPE> <TMPL_VAR HELPONFORMATTINGLINK><br />
 <TMPL_VAR NAME="FORM-END">
index b1cf015a2b2aa67adbc3b568d68102632a0a832f..d6ad8061420f2c8056b6c1d12f3da6223ba0582f 100644 (file)
@@ -1,6 +1,6 @@
-<br />
 <TMPL_VAR JAVASCRIPT>
 <TMPL_VAR MESSAGE>
+<br />
 <TMPL_VAR FORM-START>
 <TMPL_VAR FIELD-DO>
 <TMPL_VAR FIELD-SID>
@@ -8,17 +8,18 @@
 <TMPL_VAR FIELD-RCSINFO>
 <TMPL_VAR FIELD-NEWFILE>
 <TMPL_IF NAME="PAGE_SELECT">
-Page location: <TMPL_VAR FIELD-PAGE>
-Page type: <TMPL_VAR FIELD-TYPE>
+<label for="page" class="inline">Page location:</label><TMPL_VAR FIELD-PAGE>
+<label for="type" class="inline">Page type:</label><TMPL_VAR FIELD-TYPE>
 <TMPL_ELSE>
-<br />
 <TMPL_VAR FIELD-PAGE>
 <TMPL_VAR FIELD-TYPE>
 </TMPL_IF>
+<div class="editcontentdiv">
 <TMPL_VAR FIELD-EDITCONTENT><br />
+</div>
 <TMPL_IF NAME="CAN_COMMIT">
-Optional comment about this change:<br />
-<TMPL_VAR FIELD-COMMENTS><br />
+<label for="editmessage" class="block">Optional comment about this change:</label>
+<TMPL_VAR FIELD-EDITMESSAGE><br />
 </TMPL_IF>
 <TMPL_VAR FORM-SUBMIT>
 <TMPL_VAR HELPONFORMATTINGLINK>
@@ -48,3 +49,12 @@ Optional comment about this change:<br />
 <TMPL_VAR PAGE_PREVIEW>
 </div>
 </TMPL_IF>
+<TMPL_IF NAME="PAGE_DIFF">
+<hr />
+<div class="header">
+<span>Diff:</span>
+</div>
+<div id="diff">
+<TMPL_VAR PAGE_DIFF>
+</div>
+</TMPL_IF>
index 2963156c1b6200cfdd06099ecc94df8764a8656c..be8637f0f6f2c67f120dd45aef31270f525fd2c6 100644 (file)
@@ -1,8 +1,8 @@
 <div id="feedlink">
-<TMPL_IF NAME="RSSURL">
-<a class="feedbutton" type="application/rss+xml" href="<TMPL_VAR NAME=RSSURL>">RSS</a>
+<TMPL_IF RSSURL>
+<a class="feedbutton" type="application/rss+xml" href="<TMPL_VAR RSSURL>">RSS</a>
 </TMPL_IF>
-<TMPL_IF NAME="ATOMURL">
-<a class="feedbutton" type="application/atom+xml" href="<TMPL_VAR NAME=ATOMURL>">Atom</a>
+<TMPL_IF ATOMURL>
+<a class="feedbutton" type="application/atom+xml" href="<TMPL_VAR ATOMURL>">Atom</a>
 </TMPL_IF>
 </div>
index bcf1004a46cf8bd908f1c548c7fcfc8f67448531..9468e062ab19a381f6dadb339480796efae827f5 100644 (file)
@@ -1,6 +1,8 @@
+
 <form method="get" action="http://www.google.com/search" id="searchform">
  <div>
   <input name="sitesearch" value="<TMPL_VAR URL>" type="hidden" />
-  <input name="q" value="" id="searchbox" size="16" maxlength="255" type="text" />
+  <input name="q" value="" id="searchbox" size="16" maxlength="255" type="text"
+  <TMPL_IF HTML5>placeholder="search"</TMPL_IF> />
  </div>
 </form>
index 3c0b933159b168fe94119a51258b0d0f49baec06..b0b53d0416db76d2dc24bb606c5e86755dee93ef 100644 (file)
@@ -1,43 +1,41 @@
-<div class="inlinepage">
+<TMPL_IF HTML5><article class="inlinepage"><TMPL_ELSE><div class="inlinepage"></TMPL_IF>
 
-<div class="inlineheader">
-
-<TMPL_IF NAME="AUTHOR">
+<TMPL_IF HTML5><section class="inlineheader"><TMPL_ELSE><div class="inlineheader"></TMPL_IF>
+<TMPL_IF AUTHOR>
 <span class="author">
-<TMPL_IF NAME="AUTHORURL">
+<TMPL_IF AUTHORURL>
 <a href="<TMPL_VAR AUTHORURL>"><TMPL_VAR AUTHOR></a>
 <TMPL_ELSE>
 <TMPL_VAR AUTHOR>
 </TMPL_IF>
 </span>
 </TMPL_IF>
-<span class="header">
-<TMPL_IF NAME="PERMALINK">
+<TMPL_IF HTML5><header class="header"><TMPL_ELSE><span class="header"></TMPL_IF>
+<TMPL_IF PERMALINK>
 <a href="<TMPL_VAR PERMALINK>"><TMPL_VAR TITLE></a>
 <TMPL_ELSE>
 <a href="<TMPL_VAR PAGEURL>"><TMPL_VAR TITLE></a>
 </TMPL_IF>
-</span>
+<TMPL_IF HTML5></header><TMPL_ELSE></span></TMPL_IF>
+<TMPL_IF HTML5></section><TMPL_ELSE></div></TMPL_IF>
 
-</div><!--.inlineheader-->
-
-<div class="inlinecontent">
+<TMPL_IF HTML5><section class="inlinecontent"><TMPL_ELSE><div class="inlinecontent"></TMPL_IF>
 <TMPL_VAR CONTENT>
-</div><!--.inlinecontent-->
+<TMPL_IF HTML5></section><TMPL_ELSE></div></TMPL_IF>
 
-<div class="inlinefooter">
+<TMPL_IF HTML5><footer class="inlinefooter"><TMPL_ELSE><div class="inlinefooter"></TMPL_IF>
 
 <span class="pagedate">
 Posted <TMPL_VAR CTIME>
 </span>
 
-<TMPL_IF NAME="TAGS">
-<span class="tags">
+<TMPL_IF TAGS>
+<TMPL_IF HTML5><nav class="tags"><TMPL_ELSE><span class="tags"></TMPL_IF>
 Tags:
-<TMPL_LOOP NAME="TAGS">
+<TMPL_LOOP TAGS>
 <TMPL_VAR LINK>
 </TMPL_LOOP>
-</span>
+<TMPL_IF HTML5></nav><TMPL_ELSE></span></TMPL_IF>
 </TMPL_IF>
 
 <TMPL_IF COPYRIGHT>
@@ -52,23 +50,23 @@ License: <TMPL_VAR LICENSE>
 </div>
 </TMPL_IF>
 
-<TMPL_IF NAME="HAVE_ACTIONS">
-<div class="actions">
+<TMPL_IF HAVE_ACTIONS>
+<TMPL_IF HTML5><nav class="actions"><TMPL_ELSE><div class="actions"></TMPL_IF>
 <ul>
-<TMPL_IF NAME="EDITURL">
+<TMPL_IF EDITURL>
 <li><a href="<TMPL_VAR EDITURL>" rel="nofollow">Edit</a></li>
 </TMPL_IF>
-<TMPL_IF NAME="COMMENTSLINK">
+<TMPL_IF COMMENTSLINK>
 <li><TMPL_VAR COMMENTSLINK></li>
 <TMPL_ELSE>
-<TMPL_IF NAME="DISCUSSIONLINK">
+<TMPL_IF DISCUSSIONLINK>
 <li><TMPL_VAR DISCUSSIONLINK></li>
 </TMPL_IF>
 </TMPL_IF>
 </ul>
-</div><!--.actions-->
+<TMPL_IF HTML5></nav><TMPL_ELSE></div></TMPL_IF>
 </TMPL_IF>
 
-</div><!--.inlinefooter-->
+<TMPL_IF HTML5></footer><TMPL_ELSE></div></TMPL_IF>
 
-</div><!--.inlinepage-->
+<TMPL_IF HTML5></article><TMPL_ELSE></div></TMPL_IF>
index 2e84441cc1dd419eb67c38e1199e0b05b8b4deee..e22d65cce32c4eebeaa5d6eb16b85939a5fc3e47 100644 (file)
@@ -6,9 +6,9 @@
 
 <div class="microblog-header">
 
-<TMPL_IF NAME="AUTHOR">
+<TMPL_IF AUTHOR>
 <span class="author">
-<TMPL_IF NAME="AUTHORURL">
+<TMPL_IF AUTHORURL>
 <a href="<TMPL_VAR AUTHORURL>"><TMPL_VAR AUTHOR></a>
 <TMPL_ELSE>
 <TMPL_VAR AUTHOR>
diff --git a/templates/misc.tmpl b/templates/misc.tmpl
deleted file mode 100644 (file)
index 9ec9a59..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<TMPL_IF NAME="FORCEBASEURL">
-<base href="<TMPL_VAR FORCEBASEURL>" />
-<TMPL_ELSE>
-<base href="<TMPL_VAR BASEURL>" />
-</TMPL_IF>
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-<title><TMPL_VAR TITLE></title>
-<link rel="stylesheet" href="<TMPL_VAR BASEURL>style.css" type="text/css" />
-<link rel="stylesheet" href="<TMPL_VAR BASEURL>local.css" type="text/css" />
-<TMPL_IF NAME="FAVICON">
-<link rel="icon" href="<TMPL_VAR BASEURL><TMPL_VAR FAVICON>" type="image/x-icon" />
-</TMPL_IF>
-</head>
-<body>
-
-<div class="pageheader">
-<div class="header">
-<span>
-<TMPL_VAR INDEXLINK>/
-<span class="title">
-<TMPL_VAR TITLE>
-</span>
-</span>
-</div>
-</div> <!-- .pageheader -->
-
-<div id="content">
-<TMPL_VAR PAGEBODY>
-</div>
-
-<div id="footer">
-<!-- from <TMPL_VAR NAME=WIKINAME> -->
-</div>
-
-</body>
-</html>
diff --git a/templates/openid-selector.tmpl b/templates/openid-selector.tmpl
new file mode 100644 (file)
index 0000000..0659ee5
--- /dev/null
@@ -0,0 +1,43 @@
+<script type="text/javascript" src="ikiwiki/openid/jquery.js"></script>
+<script type="text/javascript" src="ikiwiki/openid/openid-jquery.js"></script>
+<script type="text/javascript">
+$(document).ready(function() {
+       openid.init('openid_identifier','<TMPL_IF NONOPENIDFORM>nonopenidform</TMPL_IF>');
+});
+</script>
+
+<noscript>
+<h2>OpenID:</h2>
+</noscript>
+
+<form action="<TMPL_VAR CGIURL>" method="get" id="openid_form">
+       <fieldset>
+               <script>
+               $('fieldset').append("<legend>Select your account provider</legend>");
+               </script>
+               
+               <input type="hidden" name="do" value="signin" />
+               <input type="hidden" name="action" value="verify" />
+               <div id="openid_choice">
+                       <div id="openid_btns"></div>
+               </div>
+               <div id="openid_input_area">
+                       <label for="openid_identifier" class="block">Enter your OpenID:</label>
+                       <input id="openid_identifier" name="openid_identifier" type="text" value="<TMPL_VAR OPENID_URL>"/>
+                       <input id="openid_submit" type="submit" value="Login"/>
+               </div>
+               <TMPL_IF OPENID_ERROR>
+               <div class="error"><TMPL_VAR OPENID_ERROR></div>
+               </TMPL_IF>
+       </fieldset>
+</form>
+
+<div id="nonopenidform">
+<TMPL_IF NONOPENIDFORM>
+<br />
+<noscript>
+<h2>Other:</h2>
+</noscript>
+</TMPL_IF>
+<TMPL_VAR NONOPENIDFORM>
+</div>
index 968066a19e8e0db5a045fa3a9f1ea04bdb3f979a..da8c2940f8cc74b98498ed6759e54ddfe5b1b5cb 100644 (file)
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+<TMPL_IF HTML5><!DOCTYPE html>
+<html>
+<TMPL_ELSE><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml">
+</TMPL_IF>
 <head>
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<TMPL_IF DYNAMIC>
+<TMPL_IF FORCEBASEURL><base href="<TMPL_VAR FORCEBASEURL>" /><TMPL_ELSE>
+<TMPL_IF BASEURL><base href="<TMPL_VAR BASEURL>" /></TMPL_IF>
+</TMPL_IF>
+</TMPL_IF>
+<TMPL_IF HTML5><meta charset="utf-8" /><TMPL_ELSE><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></TMPL_IF>
+<meta http-equiv="Cache-Control" content="must-revalidate" />
 <title><TMPL_VAR TITLE></title>
-<TMPL_IF NAME="FAVICON">
+<TMPL_IF FAVICON>
 <link rel="icon" href="<TMPL_VAR BASEURL><TMPL_VAR FAVICON>" type="image/x-icon" />
 </TMPL_IF>
 <link rel="stylesheet" href="<TMPL_VAR BASEURL>style.css" type="text/css" />
-<TMPL_IF NAME="LOCAL_CSS">
+<TMPL_IF LOCAL_CSS>
 <link rel="stylesheet" href="<TMPL_VAR BASEURL><TMPL_VAR LOCAL_CSS>" type="text/css" />
 <TMPL_ELSE>
 <link rel="stylesheet" href="<TMPL_VAR BASEURL>local.css" type="text/css" />
 </TMPL_IF>
-<TMPL_IF NAME="EDITURL">
+<TMPL_IF EDITURL>
 <link rel="alternate" type="application/x-wiki" title="Edit this page" href="<TMPL_VAR EDITURL>" />
 </TMPL_IF>
-<TMPL_IF NAME="FEEDLINKS"><TMPL_VAR FEEDLINKS></TMPL_IF>
-<TMPL_IF NAME="RELVCS"><TMPL_VAR RELVCS></TMPL_IF>
-<TMPL_IF NAME="META"><TMPL_VAR META></TMPL_IF>
+<TMPL_IF FEEDLINKS><TMPL_VAR FEEDLINKS></TMPL_IF>
+<TMPL_IF RELVCS><TMPL_VAR RELVCS></TMPL_IF>
+<TMPL_IF META><TMPL_VAR META></TMPL_IF>
 </head>
 <body>
 
-<div class="pageheader">
-<div class="header">
+<TMPL_IF HTML5><article class="page"><TMPL_ELSE><div class="page"></TMPL_IF>
+
+<TMPL_IF HTML5><section class="pageheader"><TMPL_ELSE><div class="pageheader"></TMPL_IF>
+<TMPL_IF HTML5><header class="header"><TMPL_ELSE><div class="header"></TMPL_IF>
 <span>
 <span class="parentlinks">
-<TMPL_LOOP NAME="PARENTLINKS">
+<TMPL_LOOP PARENTLINKS>
 <a href="<TMPL_VAR URL>"><TMPL_VAR PAGE></a>/ 
 </TMPL_LOOP>
 </span>
 <span class="title">
 <TMPL_VAR TITLE>
-<TMPL_IF NAME="ISTRANSLATION">
-&nbsp;(<TMPL_VAR NAME="PERCENTTRANSLATED">%)
+<TMPL_IF ISTRANSLATION>
+&nbsp;(<TMPL_VAR PERCENTTRANSLATED>%)
 </TMPL_IF>
 </span>
-</span><!--.header-->
-<TMPL_IF NAME="SEARCHFORM">
+</span>
+<TMPL_IF SEARCHFORM>
 <TMPL_VAR SEARCHFORM>
 </TMPL_IF>
-</div>
+<TMPL_IF HTML5></header><TMPL_ELSE></div></TMPL_IF>
 
-<TMPL_IF NAME="HAVE_ACTIONS">
-<div class="actions">
+<TMPL_IF HAVE_ACTIONS>
+<TMPL_IF HTML5><nav class="actions"><TMPL_ELSE><div class="actions"></TMPL_IF>
 <ul>
-<TMPL_IF NAME="EDITURL">
+<TMPL_IF EDITURL>
 <li><a href="<TMPL_VAR EDITURL>" rel="nofollow">Edit</a></li>
 </TMPL_IF>
-<TMPL_IF NAME="RECENTCHANGESURL">
+<TMPL_IF RECENTCHANGESURL>
 <li><a href="<TMPL_VAR RECENTCHANGESURL>">RecentChanges</a></li>
 </TMPL_IF>
-<TMPL_IF NAME="HISTORYURL">
+<TMPL_IF HISTORYURL>
 <li><a href="<TMPL_VAR HISTORYURL>">History</a></li>
 </TMPL_IF>
-<TMPL_IF NAME="GETSOURCEURL">
+<TMPL_IF GETSOURCEURL>
 <li><a href="<TMPL_VAR GETSOURCEURL>">Source</a></li>
 </TMPL_IF>
-<TMPL_IF NAME="PREFSURL">
+<TMPL_IF PREFSURL>
 <li><a href="<TMPL_VAR PREFSURL>">Preferences</a></li>
 </TMPL_IF>
-<TMPL_IF NAME="COMMENTSLINK">
-<li><TMPL_VAR COMMENTSLINK><br /></li>
+<TMPL_IF ACTIONS>
+<TMPL_LOOP ACTIONS>
+<li><TMPL_VAR ACTION></li>
+</TMPL_LOOP>
+</TMPL_IF>
+<TMPL_IF COMMENTSLINK>
+<li><TMPL_VAR COMMENTSLINK></li>
 <TMPL_ELSE>
-<TMPL_IF NAME="DISCUSSIONLINK">
-<li><TMPL_VAR DISCUSSIONLINK><br /></li>
+<TMPL_IF DISCUSSIONLINK>
+<li><TMPL_VAR DISCUSSIONLINK></li>
 </TMPL_IF>
 </TMPL_IF>
 </ul>
-</div>
+<TMPL_IF HTML5></nav><TMPL_ELSE></div></TMPL_IF>
 </TMPL_IF>
 
-<TMPL_IF NAME="OTHERLANGUAGES">
-<div id="otherlanguages">
+<TMPL_IF OTHERLANGUAGES>
+<TMPL_IF HTML5><nav id="otherlanguages"><TMPL_ELSE><div id="otherlanguages"></TMPL_IF>
 <ul>
-<TMPL_LOOP NAME="OTHERLANGUAGES">
+<TMPL_LOOP OTHERLANGUAGES>
 <li>
-<a href="<TMPL_VAR NAME="URL">"><TMPL_VAR NAME="LANGUAGE"></a>
-<TMPL_IF NAME="MASTER">
+<a href="<TMPL_VAR URL>"><TMPL_VAR LANGUAGE></a>
+<TMPL_IF MASTER>
 (master)
 <TMPL_ELSE>
-&nbsp;(<TMPL_VAR NAME="PERCENT">%)
+&nbsp;(<TMPL_VAR PERCENT>%)
 </TMPL_IF>
 </li>
 </TMPL_LOOP>
 </ul>
-</div> <!-- #otherlanguages -->
+<TMPL_IF HTML5></nav><TMPL_ELSE></div></TMPL_IF>
 </TMPL_IF>
 
-</div> <!-- .pageheader -->
+<TMPL_IF HTML5></section><TMPL_ELSE></div></TMPL_IF>
 
 <TMPL_IF SIDEBAR>
-<div id="sidebar">
+<TMPL_IF HTML5><aside class="sidebar"><TMPL_ELSE><div class="sidebar"></TMPL_IF>
 <TMPL_VAR SIDEBAR>
-</div>
+<TMPL_IF HTML5></aside><TMPL_ELSE></div></TMPL_IF>
 </TMPL_IF>
 
-<div id="content">
+<div id="pagebody">
+
+<TMPL_IF HTML5><section id="content"><TMPL_ELSE><div id="content"></TMPL_IF>
 <TMPL_VAR CONTENT>
-</div>
+<TMPL_IF HTML5></section><TMPL_ELSE></div></TMPL_IF>
 
 <TMPL_IF COMMENTS>
-<div id="comments">
+<TMPL_IF HTML5><section id="comments"><TMPL_ELSE><div id="comments"></TMPL_IF>
 <TMPL_VAR COMMENTS>
 <TMPL_IF ADDCOMMENTURL>
 <div class="addcomment">
 <TMPL_ELSE>
 <div class="addcomment">Comments on this page are closed.</div>
 </TMPL_IF>
-</div>
+<TMPL_IF HTML5></section><TMPL_ELSE></div></TMPL_IF>
 </TMPL_IF>
 
-<div id="footer" class="pagefooter">
-<div id="pageinfo">
+</div>
+
+<TMPL_IF HTML5><footer id="footer" class="pagefooter"><TMPL_ELSE><div id="footer" class="pagefooter"></TMPL_IF>
+<TMPL_UNLESS DYNAMIC>
+<TMPL_IF HTML5><nav id="pageinfo"><TMPL_ELSE><div id="pageinfo"></TMPL_IF>
 
-<TMPL_IF NAME="TAGS">
-<div class="tags">
+<TMPL_IF TAGS>
+<TMPL_IF HTML5><nav class="tags"><TMPL_ELSE><div class="tags"></TMPL_IF>
 Tags:
-<TMPL_LOOP NAME="TAGS">
+<TMPL_LOOP TAGS>
 <TMPL_VAR LINK>
 </TMPL_LOOP>
-</div>
+<TMPL_IF HTML5></nav><TMPL_ELSE></div></TMPL_IF>
 </TMPL_IF>
 
-<TMPL_IF NAME="BACKLINKS">
-<div id="backlinks">
+<TMPL_IF BACKLINKS>
+<TMPL_IF HTML5><nav id="backlinks"><TMPL_ELSE><div id="backlinks"></TMPL_IF>
 Links:
-<TMPL_LOOP NAME="BACKLINKS">
+<TMPL_LOOP BACKLINKS>
 <a href="<TMPL_VAR URL>"><TMPL_VAR PAGE></a>
 </TMPL_LOOP>
-<TMPL_IF NAME="MORE_BACKLINKS">
+<TMPL_IF MORE_BACKLINKS>
 <span class="popup">...
 <span class="balloon">
-<TMPL_LOOP NAME="MORE_BACKLINKS">
+<TMPL_LOOP MORE_BACKLINKS>
 <a href="<TMPL_VAR URL>"><TMPL_VAR PAGE></a>
 </TMPL_LOOP>
 </span>
 </span>
 </TMPL_IF>
-</div><!-- #backlinks -->
+<TMPL_IF HTML5></nav><TMPL_ELSE></div></TMPL_IF>
 </TMPL_IF>
 
 <TMPL_IF COPYRIGHT>
@@ -162,10 +183,13 @@ Last edited <TMPL_VAR MTIME>
 <!-- Created <TMPL_VAR CTIME> -->
 </div>
 
-</div><!-- #pageinfo -->
+<TMPL_IF HTML5></nav><TMPL_ELSE></div></TMPL_IF>
 <TMPL_IF EXTRAFOOTER><TMPL_VAR EXTRAFOOTER></TMPL_IF>
+</TMPL_UNLESS>
 <!-- from <TMPL_VAR WIKINAME> -->
-</div><!-- .pagefooter #footer -->
+<TMPL_IF HTML5></footer><TMPL_ELSE></div></TMPL_IF>
+
+<TMPL_IF HTML5></article><TMPL_ELSE></div></TMPL_IF>
 
 </body>
 </html>
index 96c8fdd78e88a6b4ba61705051db96a1639ffa44..f22ee5092b388616f4405e4c704a14159a157e9c 100644 (file)
@@ -1,3 +1,3 @@
 <p>
-<b>WARNING</b> this page must be written in <TMPL_VAR NAME="LANG">.
-</p>
\ No newline at end of file
+<b>WARNING</b> this page must be written in <TMPL_VAR LANG>.
+</p>
index 60f81b35b9e948c0f1674ef5d7452b8c39c1fca4..7a8dc922957cba8e830902bcaffba6d5e114ce45 100644 (file)
 <TMPL_IF FIXEDLINKS>
 The following pages have been automatically modified to update their links to <TMPL_VAR DEST>:
 <ul>
-<TMPL_LOOP NAME=FIXEDLINKS><li><TMPL_VAR PAGE></li></TMPL_LOOP>
+<TMPL_LOOP FIXEDLINKS><li><TMPL_VAR PAGE></li></TMPL_LOOP>
 </ul>
 </TMPL_IF>
 <TMPL_IF BROKENLINKS_CHECKED>
 <TMPL_IF BROKENLINKS>
 The following pages still link to <TMPL_VAR SRC>:
 <ul>
-<TMPL_LOOP NAME=BROKENLINKS><li><TMPL_VAR PAGE></li></TMPL_LOOP>
+<TMPL_LOOP BROKENLINKS><li><TMPL_VAR PAGE></li></TMPL_LOOP>
 </ul>
 </TMPL_IF>
 </TMPL_IF>
index a61b92b6127505e3f61b068d046e3f706a956d9a..a64a4ebd79273ceac6c62081efee655e40b9c449 100644 (file)
@@ -1,29 +1,29 @@
 <item>
-       <TMPL_IF NAME="AUTHOR">
+<TMPL_IF AUTHOR>
        <title><TMPL_VAR AUTHOR ESCAPE=HTML>: <TMPL_VAR TITLE></title>
        <dcterms:creator><TMPL_VAR AUTHOR ESCAPE=HTML></dcterms:creator>
-       <TMPL_ELSE>
+<TMPL_ELSE>
        <title><TMPL_VAR TITLE></title>
-       </TMPL_IF>
-       <TMPL_IF NAME="GUID">
-         <guid isPermaLink="no"><TMPL_VAR GUID></guid>
-       <TMPL_ELSE>
-         <guid><TMPL_VAR URL></guid>
-       </TMPL_IF>
+</TMPL_IF>
+<TMPL_IF GUID>
+       <guid isPermaLink="no"><TMPL_VAR GUID></guid>
+<TMPL_ELSE>
+       <guid><TMPL_VAR URL></guid>
+</TMPL_IF>
        <link><TMPL_VAR PERMALINK></link>
-       <TMPL_IF NAME="CATEGORIES">
-       <TMPL_LOOP NAME="CATEGORIES">
+<TMPL_IF CATEGORIES>
+<TMPL_LOOP CATEGORIES>
        <category><TMPL_VAR CATEGORY></category>
-       </TMPL_LOOP>
-       </TMPL_IF>
+</TMPL_LOOP>
+</TMPL_IF>
        <pubDate><TMPL_VAR CDATE_822></pubDate>
        <dcterms:modified><TMPL_VAR MDATE_3339></dcterms:modified>
-       <TMPL_IF NAME="ENCLOSURE">
+<TMPL_IF ENCLOSURE>
        <enclosure url="<TMPL_VAR ENCLOSURE>" type="<TMPL_VAR TYPE>" length="<TMPL_VAR LENGTH>" />
-       <TMPL_ELSE>
+<TMPL_ELSE>
        <description><TMPL_VAR CONTENT ESCAPE=HTML></description>
-       </TMPL_IF>
-       <TMPL_IF NAME="COMMENTSURL">
-       <comments><TMPL_VAR NAME="COMMENTSURL"></comments>
-       </TMPL_IF>
+</TMPL_IF>
+<TMPL_IF COMMENTSURL>
+       <comments><TMPL_VAR COMMENTSURL></comments>
+</TMPL_IF>
 </item>
index afae2ebf5d711b60fb87dbb9020cdcd98de4f98c..cb65d124ca9d543b762bbfb5e40100e09c5e1436 100644 (file)
@@ -1,5 +1,6 @@
 <form method="get" action="<TMPL_VAR SEARCHACTION>" id="searchform">
 <div>
-<input type="text" id="searchbox" name="P" value="" size="16" />
+<input type="text" id="searchbox" name="P" value="" size="16"
+<TMPL_IF HTML5>placeholder="search"</TMPL_IF> />
 </div>
 </form>
index 782b12cab0cee051ed41eda88bfdaf2e3b1e8187..5b9fbbf7fa75b28e00a9939a79f7a53e1bde4958 100644 (file)
@@ -33,7 +33,7 @@ $def{NEXT,$if{$ne{$last,$msize},<INPUT TYPE=submit NAME="&gt;" VALUE="Next">}}
 
 <FORM NAME=P METHOD=GET 
 ACTION="$html{$env{CGIURL}}" TARGET="_top">
-<center>
+<div style="text-align:center">
 <INPUT NAME=P VALUE="$html{$query}" SIZE=65>
 <INPUT TYPE=SUBMIT VALUE="Search">
 $env{HELPLINK}
@@ -54,7 +54,7 @@ $if{$not{$msizeexact},
   $nice{$add{$topdoc,1}}$if{$ne{$add{$topdoc,1},$last},-$nice{$last}} of exactly $nice{$msize} matches}
 }
 <hr>
-</center>
+</div>
 $list{$map{$queryterms,$list{$html{$uniq{$unstem{$_}}},<b>,</b>/<b>,</b>}:&nbsp;$nice{$freq{$_}}},Term frequencies: ,$. ,}
 <br><small>Search took $time seconds</small>
 <table>
@@ -77,8 +77,9 @@ $percentage% relevant$. matching:
 <i>$list{$map{$terms,$html{$prettyterm{$_}}},$. ,</i> and <i>}</i></small>${for lynx:}<p></td></tr>}
 </table>
 
-<br><center>
+<br />
 
+<div style="text-align:center">
 ${suppress next, prev, and page links if there's only one page}
 $if{$ne{$lastpage,1},
 $set{a,$if{$opt{pagelink_height}, HEIGHT=$opt{pagelink_height}}$if{$opt{pagelink_width}, WIDTH=$opt{pagelink_width}}}
@@ -97,7 +98,7 @@ $if{$ne{$opt{y},$lastpage},...}
 $NEXT
 }
 }}
-</center><br>
+</div><br />
 $if{$dbname,<INPUT TYPE=hidden NAME=DB VALUE="$html{$dbname}">}
 $if{$ne{$topdoc,0},<INPUT TYPE=hidden NAME=TOPDOC VALUE=$topdoc>}
 $if{$ne{$hitsperpage,10},<INPUT TYPE=hidden NAME=HITSPERPAGE VALUE=$hitsperpage>}
index 8a11e693ebfe08602a003f01bda55ff8dec316bf..6326bab72d147aab216f3ee5040020ec4ba1511d 100644 (file)
@@ -1,5 +1,5 @@
 <p>
-<TMPL_IF NAME="PERMALINK">
+<TMPL_IF PERMALINK>
 <a href="<TMPL_VAR PERMALINK>"><TMPL_VAR TITLE></a>
 <TMPL_ELSE>
 <a href="<TMPL_VAR PAGEURL>"><TMPL_VAR TITLE></a>
diff --git a/themes/actiontabs/style.css b/themes/actiontabs/style.css
new file mode 100644 (file)
index 0000000..c5925ce
--- /dev/null
@@ -0,0 +1,145 @@
+/* actiontabs theme for ikiwiki
+ *
+ * by svend
+ */
+
+a {
+       text-decoration: none;
+       color: #005a9c;
+}
+
+a:hover {
+       text-decoration: underline;
+}
+
+
+hr {
+       border-style: none;
+       background-color: #999;
+       height: 1px;
+}
+
+code, pre {
+       background: #eee;
+}
+
+pre {
+       padding: .5em;
+}
+
+body {
+       margin: 0;
+       padding: 0;
+       font-family: sans-serif;
+       color: black;
+       background: white;
+}
+
+.pageheader {
+       margin: 0;
+       padding: 1em 2em;
+       position: relative;
+       overflow: hidden;
+       background: #eee;
+       border-color: #999;
+       border-style: none none solid none;
+       border-width: 1px;
+}
+
+.pageheader .header {
+       float: left;
+       font-size: 120%;
+}
+
+.header {
+       font-weight: normal;
+}
+
+.title {
+       display: block;
+       margin-top: .2em;
+       font: 140% sans-serif;
+}
+
+#searchform {
+       position: absolute;
+       top: 0.5em;
+       right: 2em;
+}
+
+.pageheader .actions {
+       position: absolute;
+       bottom: 5px;
+       right: 2em;
+       width: 100%;
+       text-align: right;
+       padding: 0;
+}
+
+#content, #comments, #footer {
+       margin: 1em 2em;
+}
+
+#pageinfo {
+       border-color: #999;
+}
+
+.inlinepage {
+       margin: .4em 0;
+       padding: .4em 0;
+       border-style: none;
+       border-top: 1px solid #aaa;
+}
+
+.inlineheader {
+       font-size: 120%;
+}
+
+h1 { font: 120% sans-serif }
+h2 { font: bold 100% sans-serif }
+h3 { font: italic 100% sans-serif }
+h4, h5, h6 { font: small-caps 100% sans-serif }
+
+/* Smaller headings for inline pages */
+.inlinepage h1 { font-size: 110% }
+.inlinepage h2 { font-size: 100% }
+.inlinepage h3 { font-size: 100% }
+
+.pageheader .actions ul {
+       border-style: none
+}
+
+.actions ul {
+       padding: 0;
+       border-style: none;
+}
+
+.actions ul li a {
+       text-decoration: none;
+}
+
+.pageheader .actions ul li {
+       margin: 0;
+       padding: .1em .5em 0 .5em;
+       background: white;
+       border-color: #999;
+       border-style: solid solid none solid;
+       border-width: 1px;
+}
+
+div.recentchanges {
+       border-style: none;
+}
+
+.pagecloud {
+       width: auto;
+}
+
+.sidebar {
+        border-bottom: 0;
+       border-right: 0;
+       border-top: 0;
+       margin-top: 0.5em;
+       padding: 0 0 0 2ex;
+       border-color: #999;
+}
diff --git a/themes/blueview/background_darkness.png b/themes/blueview/background_darkness.png
new file mode 100644 (file)
index 0000000..0a1cb4e
Binary files /dev/null and b/themes/blueview/background_darkness.png differ
diff --git a/themes/blueview/header_background.png b/themes/blueview/header_background.png
new file mode 100644 (file)
index 0000000..4712ffb
Binary files /dev/null and b/themes/blueview/header_background.png differ
diff --git a/themes/blueview/style.css b/themes/blueview/style.css
new file mode 100644 (file)
index 0000000..540cac4
--- /dev/null
@@ -0,0 +1,280 @@
+/*    bzed theme for ikiwiki
+ *
+ *    Copyright (C) 2010 Bernd Zeimetz
+ *       Licensed under same license as ikiwiki: GPL v2 or later
+ *
+ *     Parts of this file are based on the awesome YUI,
+ *     these parts will stay under the BSD license,
+ *     but you're free to apply the GPLv2 to them, of course.
+ */
+
+
+
+/* -------------------------------------------------------------------------------------------------
+Based on reset-fonts-grids.css from yui.
+Copyright (c) 2008, Yahoo! Inc. All rights reserved.
+Code licensed under the BSD License:
+http://developer.yahoo.net/yui/license.txt
+version: 2.5.1
+*/
+body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,legend,p,blockquote,th,td{margin:0;padding:0;}
+table{border-collapse:collapse;border-spacing:0;}
+img{border:0;}
+address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal;}
+li{list-style:none;}
+caption,th{text-align:left;}
+h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal;}
+q:before,q:after{content:'';}
+abbr,acronym {border:0;font-variant:normal;}
+sup {vertical-align:text-top;}
+sub {vertical-align:text-bottom;}
+input,textarea,select{font-family:inherit;font-size: 13px/1.23;font-weight:normal;}
+input,textarea,select{*font-size:100%;}
+legend{color:#000;}
+/* body {font:13px/1.231 arial,helvetica,clean,sans-serif;*font-size:small;*font:x-small;} */
+body {font:13px/1.231 "Lucida Grande",Verdana,Lucida,Helvetica,Arial,sans-serif;*font-size:small;*font:x-small;}
+table {font-size:inherit;font:100%;}
+pre,code,kbd,samp,tt{font-family:monospace;}
+
+
+body{text-align:left;}
+.inlinefooter{clear:both;}
+
+/* #doc,#doc2,#doc3,#doc4,.yui-t1,.yui-t2,.yui-t3,.yui-t4,.yui-t5,.yui-t6,.yui-t7{margin:auto;text-align:left;width:57.69em;*width:56.25em;min-width:750px;} */
+.page {margin:auto;text-align:left;width:57.69em;*width:56.25em;min-width:750px;}
+
+/* #doc3{margin:auto 10px;width:auto;} */
+.page {margin:auto 10px;width:auto;}
+
+#pagebody, .sidebar{position:relative;}
+#pagebody, .sidebar{_position:static;}
+#pagebody {position:static;}
+.sidebar {float:right;width:16.5em;*width:16em;}
+#pagebody {margin-right:19em;*margin-right:18.5em;}
+/* #content {float:none;width:auto;} */
+#pagebody:after, .sidebar:after, .page:after{content:".";display:block;height:0;clear:both;visibility:hidden;}
+.page f{zoom:1;}
+
+/* ------------------------------------------------------------------------------------------------
+ * Taken from base.css, part of YUI's CSS Foundation
+ * Copyright (c) 2008, Yahoo! Inc. All rights reserved.
+ * Code licensed under the BSD License:
+ * http://developer.yahoo.net/yui/license.txt
+ * version: 2.5.1
+*/
+h1 {
+       /*18px via YUI Fonts CSS foundation*/
+       font-size:138.5%;
+}
+h2 {
+       /*16px via YUI Fonts CSS foundation*/
+       font-size:123.1%;
+}
+h3 {
+       /*14px via YUI Fonts CSS foundation*/
+       font-size:108%;
+}
+h1,h2,h3 {
+       /* top & bottom margin based on font size */
+       margin:1em 0;
+}
+h1,h2,h3,h4,h5,h6,strong {
+       /*bringing boldness back to headers and the strong element*/
+       font-weight:bold;
+}
+abbr,acronym {
+       /*indicating to users that more info is available */
+       border-bottom:1px dotted #000;
+       cursor:help;
+}
+em {
+       /*bringing italics back to the em element*/
+       font-style:italic;
+}
+blockquote,ul,ol,dl {
+       /*giving blockquotes and lists room to breath*/
+       margin:1em;
+}
+ol,ul,dl {
+       /*bringing lists on to the page with breathing room */
+       margin-left:2em;
+}
+ol li {
+       /*giving OL's LIs generated numbers*/
+       list-style: decimal outside;
+}
+ul li {
+       /*giving UL's LIs generated disc markers*/
+       list-style: disc outside;
+}
+dl dd {
+       /*giving UL's LIs generated numbers*/
+       margin-left:1em;
+}
+th,td {
+       /*borders and padding to make the table readable*/
+       border:1px solid #000;
+       padding:.5em;
+}
+th {
+       /*distinguishing table headers from data cells*/
+       font-weight:bold;
+       text-align:center;
+}
+caption {
+       /*coordinated margin to match cell's padding*/
+       margin-bottom:.5em;
+       /*centered so it doesn't blend in to other content*/
+       text-align:center;
+}
+p,fieldset,table,pre {
+       /*so things don't run into each other*/
+       margin-bottom:1em;
+}
+
+#searchbox {
+       width:21.5em;*width:21em;
+}
+
+
+
+/* ------------------------------------------------------------------------------------------------
+ * All CSS below is
+ * Copyright (C) 2010 Bernd Zeimetz
+ * Licensed under same license as ikiwiki: GPL v2 or later */
+
+.page, .pageheader, .sidebar, #content, #comments, .inlinepage, .recentchanges, .pageheader .actions ul, #pagebody {
+       border: none;
+}
+
+html, body {
+       color:#000;
+       /* background-image: url('body_background.png');
+       background-repeat: repeat; */
+       background-color: #8da1b8;
+}
+
+body {
+       padding-left: 5%;
+       padding-right: 5%;
+       padding-top: 1em;
+       padding-bottom: 1em;
+}
+
+.page {
+       background: #fff;
+       border: outset #ccc;
+       padding-left: 1em;
+       padding-right: 1em;
+       padding-top: 1em;
+}
+
+.pageheader {
+       background-image: url('header_background.png');
+       background-repeat: repeat-x;
+       height: 100px;
+       padding-left: 1em;
+       padding-right: 1em;
+       padding-bottom: 1em;
+       padding-top: 1em;
+}
+
+.pageheader .header {
+       text-align: top;
+       clear: both;
+}
+
+.pageheader .header form {
+       padding: 0em 0em 0em 0em;
+       float: right;
+       margin-top: 0.5em;
+}
+
+.pageheader .header .title, .pageheader .header .parentlinks,
+ .inlinepage .inlineheader,
+ h1, h2, h3, h4, h5, h6 {
+       margin-top: 1em;
+       font-weight: bold;
+}
+
+.pageheader .header .title, .pageheader .header .parentlinks, .pageheader .actions ul li, .pageheader .header span {
+       padding: 0.25em 0.25em 0.25em 0.25em;
+       background-image: url('background_darkness.png');
+       background-repeat: repeat;
+       color: white;
+}
+
+.pageheader .header span a, .pageheader .actions ul li a, .pageheader .header .parentlinks a {
+       color: white;
+       text-decoration: none;
+}
+
+.pageheader .actions {
+       text-align: right;
+       vertical-align: bottom;
+       clear: both;
+}
+
+#pagebody {
+       padding-right: 1em;
+       padding-bottom: 2em;
+       border-right: ridge #eee;
+       clear: none;
+}
+
+#content a, #comments a, .sidebar a {
+       color: #315485;
+       text-decoration: none;
+       font-weight: bold;
+}
+
+.sidebar h2 {
+       border-bottom: ridge #eee;
+       padding-right: 0;
+}
+
+.sidebar .menu {
+       margin-left: 1em;
+}
+
+
+.inlinepage, .recentchanges, div.recentchanges {
+       clear: none !important;
+       margin-bottom: 2em;
+}
+
+.inlinefooter {
+       border-top: 1px dotted #315485;
+}
+
+.inlinefooter .pagedate, .inlinefooter .tags {
+       display: inline;
+       clear: none;
+       margin-right: 2em;
+}
+
+.calendar .month-calendar th, .calendar .month-calendar td {
+       padding: 0.22em;
+}
+
+@media print {
+       .sidebar, .page .pageheader .header .parentlinks {
+               content:".";
+               display:block;
+               height:0;
+               visibility:hidden;
+       }
+       .page {
+               padding: 1em 1em 1em 1em;
+       }
+       .pageheader .header span a, .pageheader .actions ul li a, .pageheader .header .parentlinks a {
+               color #315485;
+       }
+       #content, #comments, #pagebody {
+               margin-right: 0;
+               *margin-right: 0;
+               border-right: none;
+       }
+
+}
+
deleted file mode 100644 (file)
index 41aa58151c20bb44ba0ee16b6e1b93eaa70cadf0..0000000000000000000000000000000000000000
+++ /dev/null
@@ -1,11 +0,0 @@
-Some [[directives|ikiwiki/directive]] that use
-[[PageSpecs|ikiwiki/pagespec]] allow
-specifying the order that matching pages are shown in. The following sort
-orders can be specified.
-
-* `age` - List pages from the most recently created to the oldest.
-* `mtime` - List pages with the most recently modified first.
-* `title` - Order by title.
-* `title_natural` - Only available if [[!cpan Sort::Naturally]] is
-  installed. Orders by title, but numbers in the title are treated
-  as such, ("1 2 9 10 20" instead of "1 10 2 20 9")
new file mode 120000 (symlink)
index 0000000000000000000000000000000000000000..93ccbb18dda0c017a80fe851101c2d84e2048018
--- /dev/null
@@ -0,0 +1 @@
+../../../../doc/ikiwiki/pagespec/sorting.mdwn
\ No newline at end of file
similarity index 67%
rename from underlays/javascript/relativedate.js
rename to underlays/javascript/ikiwiki/relativedate.js
index 5142332f1132b833fe119764a5c0055519551790..2a270d627abd45c706d9de78224f681dc96fd7d1 100644 (file)
@@ -32,13 +32,13 @@ function showDates() {
        setTimeout(showDates,30000); // keep updating every 30s
 }
 
-var timeUnits = new Array;
-timeUnits['minute'] = 60;
-timeUnits['hour'] = timeUnits['minute'] * 60;
-timeUnits['day'] = timeUnits['hour'] * 24;
-timeUnits['month'] = timeUnits['day'] * 30;
-timeUnits['year'] = timeUnits['day'] * 364;
-var timeUnitOrder = ['year', 'month', 'day', 'hour', 'minute'];
+var timeUnits = [
+       { unit: 'year',         seconds: 60 * 60 * 24 * 364 },
+       { unit: 'month',        seconds: 60 * 60 * 24 * 30 },
+       { unit: 'day',          seconds: 60 * 60 * 24 },
+       { unit: 'hour',         seconds: 60 * 60 },
+       { unit: 'minute',       seconds: 60 },
+];
 
 function relativeDate(date) {
        var now = new Date();
@@ -47,20 +47,19 @@ function relativeDate(date) {
 
        // hack to avoid reading just in the future if there is a minor
        // amount of clock slip
-       if (offset >= 0 && seconds < 30 * timeUnits['minute']) {
+       if (offset >= 0 && seconds < 30 * 60 * 60) {
                return "just now";
        }
 
        var ret = "";
        var shown = 0;
-       for (i = 0; i < timeUnitOrder.length; i++) {
-               var unit = timeUnitOrder[i];
-               if (seconds >= timeUnits[unit]) {
-                       var num = Math.floor(seconds / timeUnits[unit]);
-                       seconds -= num * timeUnits[unit];
+       for (i = 0; i < timeUnits.length; i++) {
+               if (seconds >= timeUnits[i].seconds) {
+                       var num = Math.floor(seconds / timeUnits[i].seconds);
+                       seconds -= num * timeUnits[i].seconds;
                        if (ret)
                                ret += "and ";
-                       ret += num + " " + unit + (num > 1 ? "s" : "") + " ";
+                       ret += num + " " + timeUnits[i].unit + (num > 1 ? "s" : "") + " ";
 
                        if (++shown == 2)
                                break;
diff --git a/underlays/openid-selector/ikiwiki/openid/jquery.js b/underlays/openid-selector/ikiwiki/openid/jquery.js
new file mode 100644 (file)
index 0000000..82b98e1
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ * jQuery 1.2.6 - New Wave Javascript
+ *
+ * Copyright (c) 2008 John Resig (jquery.com)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * $Date: 2008-05-24 14:22:17 -0400 (Sat, 24 May 2008) $
+ * $Rev: 5685 $
+ */
+(function(){var _jQuery=window.jQuery,_$=window.$;var jQuery=window.jQuery=window.$=function(selector,context){return new jQuery.fn.init(selector,context);};var quickExpr=/^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/,isSimple=/^.[^:#\[\.]*$/,undefined;jQuery.fn=jQuery.prototype={init:function(selector,context){selector=selector||document;if(selector.nodeType){this[0]=selector;this.length=1;return this;}if(typeof selector=="string"){var match=quickExpr.exec(selector);if(match&&(match[1]||!context)){if(match[1])selector=jQuery.clean([match[1]],context);else{var elem=document.getElementById(match[3]);if(elem){if(elem.id!=match[3])return jQuery().find(selector);return jQuery(elem);}selector=[];}}else
+return jQuery(context).find(selector);}else if(jQuery.isFunction(selector))return jQuery(document)[jQuery.fn.ready?"ready":"load"](selector);return this.setArray(jQuery.makeArray(selector));},jquery:"1.2.6",size:function(){return this.length;},length:0,get:function(num){return num==undefined?jQuery.makeArray(this):this[num];},pushStack:function(elems){var ret=jQuery(elems);ret.prevObject=this;return ret;},setArray:function(elems){this.length=0;Array.prototype.push.apply(this,elems);return this;},each:function(callback,args){return jQuery.each(this,callback,args);},index:function(elem){var ret=-1;return jQuery.inArray(elem&&elem.jquery?elem[0]:elem,this);},attr:function(name,value,type){var options=name;if(name.constructor==String)if(value===undefined)return this[0]&&jQuery[type||"attr"](this[0],name);else{options={};options[name]=value;}return this.each(function(i){for(name in options)jQuery.attr(type?this.style:this,name,jQuery.prop(this,options[name],type,i,name));});},css:function(key,value){if((key=='width'||key=='height')&&parseFloat(value)<0)value=undefined;return this.attr(key,value,"curCSS");},text:function(text){if(typeof text!="object"&&text!=null)return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(text));var ret="";jQuery.each(text||this,function(){jQuery.each(this.childNodes,function(){if(this.nodeType!=8)ret+=this.nodeType!=1?this.nodeValue:jQuery.fn.text([this]);});});return ret;},wrapAll:function(html){if(this[0])jQuery(html,this[0].ownerDocument).clone().insertBefore(this[0]).map(function(){var elem=this;while(elem.firstChild)elem=elem.firstChild;return elem;}).append(this);return this;},wrapInner:function(html){return this.each(function(){jQuery(this).contents().wrapAll(html);});},wrap:function(html){return this.each(function(){jQuery(this).wrapAll(html);});},append:function(){return this.domManip(arguments,true,false,function(elem){if(this.nodeType==1)this.appendChild(elem);});},prepend:function(){return this.domManip(arguments,true,true,function(elem){if(this.nodeType==1)this.insertBefore(elem,this.firstChild);});},before:function(){return this.domManip(arguments,false,false,function(elem){this.parentNode.insertBefore(elem,this);});},after:function(){return this.domManip(arguments,false,true,function(elem){this.parentNode.insertBefore(elem,this.nextSibling);});},end:function(){return this.prevObject||jQuery([]);},find:function(selector){var elems=jQuery.map(this,function(elem){return jQuery.find(selector,elem);});return this.pushStack(/[^+>] [^+>]/.test(selector)||selector.indexOf("..")>-1?jQuery.unique(elems):elems);},clone:function(events){var ret=this.map(function(){if(jQuery.browser.msie&&!jQuery.isXMLDoc(this)){var clone=this.cloneNode(true),container=document.createElement("div");container.appendChild(clone);return jQuery.clean([container.innerHTML])[0];}else
+return this.cloneNode(true);});var clone=ret.find("*").andSelf().each(function(){if(this[expando]!=undefined)this[expando]=null;});if(events===true)this.find("*").andSelf().each(function(i){if(this.nodeType==3)return;var events=jQuery.data(this,"events");for(var type in events)for(var handler in events[type])jQuery.event.add(clone[i],type,events[type][handler],events[type][handler].data);});return ret;},filter:function(selector){return this.pushStack(jQuery.isFunction(selector)&&jQuery.grep(this,function(elem,i){return selector.call(elem,i);})||jQuery.multiFilter(selector,this));},not:function(selector){if(selector.constructor==String)if(isSimple.test(selector))return this.pushStack(jQuery.multiFilter(selector,this,true));else
+selector=jQuery.multiFilter(selector,this);var isArrayLike=selector.length&&selector[selector.length-1]!==undefined&&!selector.nodeType;return this.filter(function(){return isArrayLike?jQuery.inArray(this,selector)<0:this!=selector;});},add:function(selector){return this.pushStack(jQuery.unique(jQuery.merge(this.get(),typeof selector=='string'?jQuery(selector):jQuery.makeArray(selector))));},is:function(selector){return!!selector&&jQuery.multiFilter(selector,this).length>0;},hasClass:function(selector){return this.is("."+selector);},val:function(value){if(value==undefined){if(this.length){var elem=this[0];if(jQuery.nodeName(elem,"select")){var index=elem.selectedIndex,values=[],options=elem.options,one=elem.type=="select-one";if(index<0)return null;for(var i=one?index:0,max=one?index+1:options.length;i<max;i++){var option=options[i];if(option.selected){value=jQuery.browser.msie&&!option.attributes.value.specified?option.text:option.value;if(one)return value;values.push(value);}}return values;}else
+return(this[0].value||"").replace(/\r/g,"");}return undefined;}if(value.constructor==Number)value+='';return this.each(function(){if(this.nodeType!=1)return;if(value.constructor==Array&&/radio|checkbox/.test(this.type))this.checked=(jQuery.inArray(this.value,value)>=0||jQuery.inArray(this.name,value)>=0);else if(jQuery.nodeName(this,"select")){var values=jQuery.makeArray(value);jQuery("option",this).each(function(){this.selected=(jQuery.inArray(this.value,values)>=0||jQuery.inArray(this.text,values)>=0);});if(!values.length)this.selectedIndex=-1;}else
+this.value=value;});},html:function(value){return value==undefined?(this[0]?this[0].innerHTML:null):this.empty().append(value);},replaceWith:function(value){return this.after(value).remove();},eq:function(i){return this.slice(i,i+1);},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments));},map:function(callback){return this.pushStack(jQuery.map(this,function(elem,i){return callback.call(elem,i,elem);}));},andSelf:function(){return this.add(this.prevObject);},data:function(key,value){var parts=key.split(".");parts[1]=parts[1]?"."+parts[1]:"";if(value===undefined){var data=this.triggerHandler("getData"+parts[1]+"!",[parts[0]]);if(data===undefined&&this.length)data=jQuery.data(this[0],key);return data===undefined&&parts[1]?this.data(parts[0]):data;}else
+return this.trigger("setData"+parts[1]+"!",[parts[0],value]).each(function(){jQuery.data(this,key,value);});},removeData:function(key){return this.each(function(){jQuery.removeData(this,key);});},domManip:function(args,table,reverse,callback){var clone=this.length>1,elems;return this.each(function(){if(!elems){elems=jQuery.clean(args,this.ownerDocument);if(reverse)elems.reverse();}var obj=this;if(table&&jQuery.nodeName(this,"table")&&jQuery.nodeName(elems[0],"tr"))obj=this.getElementsByTagName("tbody")[0]||this.appendChild(this.ownerDocument.createElement("tbody"));var scripts=jQuery([]);jQuery.each(elems,function(){var elem=clone?jQuery(this).clone(true)[0]:this;if(jQuery.nodeName(elem,"script"))scripts=scripts.add(elem);else{if(elem.nodeType==1)scripts=scripts.add(jQuery("script",elem).remove());callback.call(obj,elem);}});scripts.each(evalScript);});}};jQuery.fn.init.prototype=jQuery.fn;function evalScript(i,elem){if(elem.src)jQuery.ajax({url:elem.src,async:false,dataType:"script"});else
+jQuery.globalEval(elem.text||elem.textContent||elem.innerHTML||"");if(elem.parentNode)elem.parentNode.removeChild(elem);}function now(){return+new Date;}jQuery.extend=jQuery.fn.extend=function(){var target=arguments[0]||{},i=1,length=arguments.length,deep=false,options;if(target.constructor==Boolean){deep=target;target=arguments[1]||{};i=2;}if(typeof target!="object"&&typeof target!="function")target={};if(length==i){target=this;--i;}for(;i<length;i++)if((options=arguments[i])!=null)for(var name in options){var src=target[name],copy=options[name];if(target===copy)continue;if(deep&&copy&&typeof copy=="object"&&!copy.nodeType)target[name]=jQuery.extend(deep,src||(copy.length!=null?[]:{}),copy);else if(copy!==undefined)target[name]=copy;}return target;};var expando="jQuery"+now(),uuid=0,windowData={},exclude=/z-?index|font-?weight|opacity|zoom|line-?height/i,defaultView=document.defaultView||{};jQuery.extend({noConflict:function(deep){window.$=_$;if(deep)window.jQuery=_jQuery;return jQuery;},isFunction:function(fn){return!!fn&&typeof fn!="string"&&!fn.nodeName&&fn.constructor!=Array&&/^[\s[]?function/.test(fn+"");},isXMLDoc:function(elem){return elem.documentElement&&!elem.body||elem.tagName&&elem.ownerDocument&&!elem.ownerDocument.body;},globalEval:function(data){data=jQuery.trim(data);if(data){var head=document.getElementsByTagName("head")[0]||document.documentElement,script=document.createElement("script");script.type="text/javascript";if(jQuery.browser.msie)script.text=data;else
+script.appendChild(document.createTextNode(data));head.insertBefore(script,head.firstChild);head.removeChild(script);}},nodeName:function(elem,name){return elem.nodeName&&elem.nodeName.toUpperCase()==name.toUpperCase();},cache:{},data:function(elem,name,data){elem=elem==window?windowData:elem;var id=elem[expando];if(!id)id=elem[expando]=++uuid;if(name&&!jQuery.cache[id])jQuery.cache[id]={};if(data!==undefined)jQuery.cache[id][name]=data;return name?jQuery.cache[id][name]:id;},removeData:function(elem,name){elem=elem==window?windowData:elem;var id=elem[expando];if(name){if(jQuery.cache[id]){delete jQuery.cache[id][name];name="";for(name in jQuery.cache[id])break;if(!name)jQuery.removeData(elem);}}else{try{delete elem[expando];}catch(e){if(elem.removeAttribute)elem.removeAttribute(expando);}delete jQuery.cache[id];}},each:function(object,callback,args){var name,i=0,length=object.length;if(args){if(length==undefined){for(name in object)if(callback.apply(object[name],args)===false)break;}else
+for(;i<length;)if(callback.apply(object[i++],args)===false)break;}else{if(length==undefined){for(name in object)if(callback.call(object[name],name,object[name])===false)break;}else
+for(var value=object[0];i<length&&callback.call(value,i,value)!==false;value=object[++i]){}}return object;},prop:function(elem,value,type,i,name){if(jQuery.isFunction(value))value=value.call(elem,i);return value&&value.constructor==Number&&type=="curCSS"&&!exclude.test(name)?value+"px":value;},className:{add:function(elem,classNames){jQuery.each((classNames||"").split(/\s+/),function(i,className){if(elem.nodeType==1&&!jQuery.className.has(elem.className,className))elem.className+=(elem.className?" ":"")+className;});},remove:function(elem,classNames){if(elem.nodeType==1)elem.className=classNames!=undefined?jQuery.grep(elem.className.split(/\s+/),function(className){return!jQuery.className.has(classNames,className);}).join(" "):"";},has:function(elem,className){return jQuery.inArray(className,(elem.className||elem).toString().split(/\s+/))>-1;}},swap:function(elem,options,callback){var old={};for(var name in options){old[name]=elem.style[name];elem.style[name]=options[name];}callback.call(elem);for(var name in options)elem.style[name]=old[name];},css:function(elem,name,force){if(name=="width"||name=="height"){var val,props={position:"absolute",visibility:"hidden",display:"block"},which=name=="width"?["Left","Right"]:["Top","Bottom"];function getWH(){val=name=="width"?elem.offsetWidth:elem.offsetHeight;var padding=0,border=0;jQuery.each(which,function(){padding+=parseFloat(jQuery.curCSS(elem,"padding"+this,true))||0;border+=parseFloat(jQuery.curCSS(elem,"border"+this+"Width",true))||0;});val-=Math.round(padding+border);}if(jQuery(elem).is(":visible"))getWH();else
+jQuery.swap(elem,props,getWH);return Math.max(0,val);}return jQuery.curCSS(elem,name,force);},curCSS:function(elem,name,force){var ret,style=elem.style;function color(elem){if(!jQuery.browser.safari)return false;var ret=defaultView.getComputedStyle(elem,null);return!ret||ret.getPropertyValue("color")=="";}if(name=="opacity"&&jQuery.browser.msie){ret=jQuery.attr(style,"opacity");return ret==""?"1":ret;}if(jQuery.browser.opera&&name=="display"){var save=style.outline;style.outline="0 solid black";style.outline=save;}if(name.match(/float/i))name=styleFloat;if(!force&&style&&style[name])ret=style[name];else if(defaultView.getComputedStyle){if(name.match(/float/i))name="float";name=name.replace(/([A-Z])/g,"-$1").toLowerCase();var computedStyle=defaultView.getComputedStyle(elem,null);if(computedStyle&&!color(elem))ret=computedStyle.getPropertyValue(name);else{var swap=[],stack=[],a=elem,i=0;for(;a&&color(a);a=a.parentNode)stack.unshift(a);for(;i<stack.length;i++)if(color(stack[i])){swap[i]=stack[i].style.display;stack[i].style.display="block";}ret=name=="display"&&swap[stack.length-1]!=null?"none":(computedStyle&&computedStyle.getPropertyValue(name))||"";for(i=0;i<swap.length;i++)if(swap[i]!=null)stack[i].style.display=swap[i];}if(name=="opacity"&&ret=="")ret="1";}else if(elem.currentStyle){var camelCase=name.replace(/\-(\w)/g,function(all,letter){return letter.toUpperCase();});ret=elem.currentStyle[name]||elem.currentStyle[camelCase];if(!/^\d+(px)?$/i.test(ret)&&/^\d/.test(ret)){var left=style.left,rsLeft=elem.runtimeStyle.left;elem.runtimeStyle.left=elem.currentStyle.left;style.left=ret||0;ret=style.pixelLeft+"px";style.left=left;elem.runtimeStyle.left=rsLeft;}}return ret;},clean:function(elems,context){var ret=[];context=context||document;if(typeof context.createElement=='undefined')context=context.ownerDocument||context[0]&&context[0].ownerDocument||document;jQuery.each(elems,function(i,elem){if(!elem)return;if(elem.constructor==Number)elem+='';if(typeof elem=="string"){elem=elem.replace(/(<(\w+)[^>]*?)\/>/g,function(all,front,tag){return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?all:front+"></"+tag+">";});var tags=jQuery.trim(elem).toLowerCase(),div=context.createElement("div");var wrap=!tags.indexOf("<opt")&&[1,"<select multiple='multiple'>","</select>"]||!tags.indexOf("<leg")&&[1,"<fieldset>","</fieldset>"]||tags.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"<table>","</table>"]||!tags.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!tags.indexOf("<td")||!tags.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||!tags.indexOf("<col")&&[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"]||jQuery.browser.msie&&[1,"div<div>","</div>"]||[0,"",""];div.innerHTML=wrap[1]+elem+wrap[2];while(wrap[0]--)div=div.lastChild;if(jQuery.browser.msie){var tbody=!tags.indexOf("<table")&&tags.indexOf("<tbody")<0?div.firstChild&&div.firstChild.childNodes:wrap[1]=="<table>"&&tags.indexOf("<tbody")<0?div.childNodes:[];for(var j=tbody.length-1;j>=0;--j)if(jQuery.nodeName(tbody[j],"tbody")&&!tbody[j].childNodes.length)tbody[j].parentNode.removeChild(tbody[j]);if(/^\s/.test(elem))div.insertBefore(context.createTextNode(elem.match(/^\s*/)[0]),div.firstChild);}elem=jQuery.makeArray(div.childNodes);}if(elem.length===0&&(!jQuery.nodeName(elem,"form")&&!jQuery.nodeName(elem,"select")))return;if(elem[0]==undefined||jQuery.nodeName(elem,"form")||elem.options)ret.push(elem);else
+ret=jQuery.merge(ret,elem);});return ret;},attr:function(elem,name,value){if(!elem||elem.nodeType==3||elem.nodeType==8)return undefined;var notxml=!jQuery.isXMLDoc(elem),set=value!==undefined,msie=jQuery.browser.msie;name=notxml&&jQuery.props[name]||name;if(elem.tagName){var special=/href|src|style/.test(name);if(name=="selected"&&jQuery.browser.safari)elem.parentNode.selectedIndex;if(name in elem&&notxml&&!special){if(set){if(name=="type"&&jQuery.nodeName(elem,"input")&&elem.parentNode)throw"type property can't be changed";elem[name]=value;}if(jQuery.nodeName(elem,"form")&&elem.getAttributeNode(name))return elem.getAttributeNode(name).nodeValue;return elem[name];}if(msie&&notxml&&name=="style")return jQuery.attr(elem.style,"cssText",value);if(set)elem.setAttribute(name,""+value);var attr=msie&&notxml&&special?elem.getAttribute(name,2):elem.getAttribute(name);return attr===null?undefined:attr;}if(msie&&name=="opacity"){if(set){elem.zoom=1;elem.filter=(elem.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(value)+''=="NaN"?"":"alpha(opacity="+value*100+")");}return elem.filter&&elem.filter.indexOf("opacity=")>=0?(parseFloat(elem.filter.match(/opacity=([^)]*)/)[1])/100)+'':"";}name=name.replace(/-([a-z])/ig,function(all,letter){return letter.toUpperCase();});if(set)elem[name]=value;return elem[name];},trim:function(text){return(text||"").replace(/^\s+|\s+$/g,"");},makeArray:function(array){var ret=[];if(array!=null){var i=array.length;if(i==null||array.split||array.setInterval||array.call)ret[0]=array;else
+while(i)ret[--i]=array[i];}return ret;},inArray:function(elem,array){for(var i=0,length=array.length;i<length;i++)if(array[i]===elem)return i;return-1;},merge:function(first,second){var i=0,elem,pos=first.length;if(jQuery.browser.msie){while(elem=second[i++])if(elem.nodeType!=8)first[pos++]=elem;}else
+while(elem=second[i++])first[pos++]=elem;return first;},unique:function(array){var ret=[],done={};try{for(var i=0,length=array.length;i<length;i++){var id=jQuery.data(array[i]);if(!done[id]){done[id]=true;ret.push(array[i]);}}}catch(e){ret=array;}return ret;},grep:function(elems,callback,inv){var ret=[];for(var i=0,length=elems.length;i<length;i++)if(!inv!=!callback(elems[i],i))ret.push(elems[i]);return ret;},map:function(elems,callback){var ret=[];for(var i=0,length=elems.length;i<length;i++){var value=callback(elems[i],i);if(value!=null)ret[ret.length]=value;}return ret.concat.apply([],ret);}});var userAgent=navigator.userAgent.toLowerCase();jQuery.browser={version:(userAgent.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[])[1],safari:/webkit/.test(userAgent),opera:/opera/.test(userAgent),msie:/msie/.test(userAgent)&&!/opera/.test(userAgent),mozilla:/mozilla/.test(userAgent)&&!/(compatible|webkit)/.test(userAgent)};var styleFloat=jQuery.browser.msie?"styleFloat":"cssFloat";jQuery.extend({boxModel:!jQuery.browser.msie||document.compatMode=="CSS1Compat",props:{"for":"htmlFor","class":"className","float":styleFloat,cssFloat:styleFloat,styleFloat:styleFloat,readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing"}});jQuery.each({parent:function(elem){return elem.parentNode;},parents:function(elem){return jQuery.dir(elem,"parentNode");},next:function(elem){return jQuery.nth(elem,2,"nextSibling");},prev:function(elem){return jQuery.nth(elem,2,"previousSibling");},nextAll:function(elem){return jQuery.dir(elem,"nextSibling");},prevAll:function(elem){return jQuery.dir(elem,"previousSibling");},siblings:function(elem){return jQuery.sibling(elem.parentNode.firstChild,elem);},children:function(elem){return jQuery.sibling(elem.firstChild);},contents:function(elem){return jQuery.nodeName(elem,"iframe")?elem.contentDocument||elem.contentWindow.document:jQuery.makeArray(elem.childNodes);}},function(name,fn){jQuery.fn[name]=function(selector){var ret=jQuery.map(this,fn);if(selector&&typeof selector=="string")ret=jQuery.multiFilter(selector,ret);return this.pushStack(jQuery.unique(ret));};});jQuery.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(name,original){jQuery.fn[name]=function(){var args=arguments;return this.each(function(){for(var i=0,length=args.length;i<length;i++)jQuery(args[i])[original](this);});};});jQuery.each({removeAttr:function(name){jQuery.attr(this,name,"");if(this.nodeType==1)this.removeAttribute(name);},addClass:function(classNames){jQuery.className.add(this,classNames);},removeClass:function(classNames){jQuery.className.remove(this,classNames);},toggleClass:function(classNames){jQuery.className[jQuery.className.has(this,classNames)?"remove":"add"](this,classNames);},remove:function(selector){if(!selector||jQuery.filter(selector,[this]).r.length){jQuery("*",this).add(this).each(function(){jQuery.event.remove(this);jQuery.removeData(this);});if(this.parentNode)this.parentNode.removeChild(this);}},empty:function(){jQuery(">*",this).remove();while(this.firstChild)this.removeChild(this.firstChild);}},function(name,fn){jQuery.fn[name]=function(){return this.each(fn,arguments);};});jQuery.each(["Height","Width"],function(i,name){var type=name.toLowerCase();jQuery.fn[type]=function(size){return this[0]==window?jQuery.browser.opera&&document.body["client"+name]||jQuery.browser.safari&&window["inner"+name]||document.compatMode=="CSS1Compat"&&document.documentElement["client"+name]||document.body["client"+name]:this[0]==document?Math.max(Math.max(document.body["scroll"+name],document.documentElement["scroll"+name]),Math.max(document.body["offset"+name],document.documentElement["offset"+name])):size==undefined?(this.length?jQuery.css(this[0],type):null):this.css(type,size.constructor==String?size:size+"px");};});function num(elem,prop){return elem[0]&&parseInt(jQuery.curCSS(elem[0],prop,true),10)||0;}var chars=jQuery.browser.safari&&parseInt(jQuery.browser.version)<417?"(?:[\\w*_-]|\\\\.)":"(?:[\\w\u0128-\uFFFF*_-]|\\\\.)",quickChild=new RegExp("^>\\s*("+chars+"+)"),quickID=new RegExp("^("+chars+"+)(#)("+chars+"+)"),quickClass=new RegExp("^([#.]?)("+chars+"*)");jQuery.extend({expr:{"":function(a,i,m){return m[2]=="*"||jQuery.nodeName(a,m[2]);},"#":function(a,i,m){return a.getAttribute("id")==m[2];},":":{lt:function(a,i,m){return i<m[3]-0;},gt:function(a,i,m){return i>m[3]-0;},nth:function(a,i,m){return m[3]-0==i;},eq:function(a,i,m){return m[3]-0==i;},first:function(a,i){return i==0;},last:function(a,i,m,r){return i==r.length-1;},even:function(a,i){return i%2==0;},odd:function(a,i){return i%2;},"first-child":function(a){return a.parentNode.getElementsByTagName("*")[0]==a;},"last-child":function(a){return jQuery.nth(a.parentNode.lastChild,1,"previousSibling")==a;},"only-child":function(a){return!jQuery.nth(a.parentNode.lastChild,2,"previousSibling");},parent:function(a){return a.firstChild;},empty:function(a){return!a.firstChild;},contains:function(a,i,m){return(a.textContent||a.innerText||jQuery(a).text()||"").indexOf(m[3])>=0;},visible:function(a){return"hidden"!=a.type&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden";},hidden:function(a){return"hidden"==a.type||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden";},enabled:function(a){return!a.disabled;},disabled:function(a){return a.disabled;},checked:function(a){return a.checked;},selected:function(a){return a.selected||jQuery.attr(a,"selected");},text:function(a){return"text"==a.type;},radio:function(a){return"radio"==a.type;},checkbox:function(a){return"checkbox"==a.type;},file:function(a){return"file"==a.type;},password:function(a){return"password"==a.type;},submit:function(a){return"submit"==a.type;},image:function(a){return"image"==a.type;},reset:function(a){return"reset"==a.type;},button:function(a){return"button"==a.type||jQuery.nodeName(a,"button");},input:function(a){return/input|select|textarea|button/i.test(a.nodeName);},has:function(a,i,m){return jQuery.find(m[3],a).length;},header:function(a){return/h\d/i.test(a.nodeName);},animated:function(a){return jQuery.grep(jQuery.timers,function(fn){return a==fn.elem;}).length;}}},parse:[/^(\[) *@?([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/,/^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/,new RegExp("^([:.#]*)("+chars+"+)")],multiFilter:function(expr,elems,not){var old,cur=[];while(expr&&expr!=old){old=expr;var f=jQuery.filter(expr,elems,not);expr=f.t.replace(/^\s*,\s*/,"");cur=not?elems=f.r:jQuery.merge(cur,f.r);}return cur;},find:function(t,context){if(typeof t!="string")return[t];if(context&&context.nodeType!=1&&context.nodeType!=9)return[];context=context||document;var ret=[context],done=[],last,nodeName;while(t&&last!=t){var r=[];last=t;t=jQuery.trim(t);var foundToken=false,re=quickChild,m=re.exec(t);if(m){nodeName=m[1].toUpperCase();for(var i=0;ret[i];i++)for(var c=ret[i].firstChild;c;c=c.nextSibling)if(c.nodeType==1&&(nodeName=="*"||c.nodeName.toUpperCase()==nodeName))r.push(c);ret=r;t=t.replace(re,"");if(t.indexOf(" ")==0)continue;foundToken=true;}else{re=/^([>+~])\s*(\w*)/i;if((m=re.exec(t))!=null){r=[];var merge={};nodeName=m[2].toUpperCase();m=m[1];for(var j=0,rl=ret.length;j<rl;j++){var n=m=="~"||m=="+"?ret[j].nextSibling:ret[j].firstChild;for(;n;n=n.nextSibling)if(n.nodeType==1){var id=jQuery.data(n);if(m=="~"&&merge[id])break;if(!nodeName||n.nodeName.toUpperCase()==nodeName){if(m=="~")merge[id]=true;r.push(n);}if(m=="+")break;}}ret=r;t=jQuery.trim(t.replace(re,""));foundToken=true;}}if(t&&!foundToken){if(!t.indexOf(",")){if(context==ret[0])ret.shift();done=jQuery.merge(done,ret);r=ret=[context];t=" "+t.substr(1,t.length);}else{var re2=quickID;var m=re2.exec(t);if(m){m=[0,m[2],m[3],m[1]];}else{re2=quickClass;m=re2.exec(t);}m[2]=m[2].replace(/\\/g,"");var elem=ret[ret.length-1];if(m[1]=="#"&&elem&&elem.getElementById&&!jQuery.isXMLDoc(elem)){var oid=elem.getElementById(m[2]);if((jQuery.browser.msie||jQuery.browser.opera)&&oid&&typeof oid.id=="string"&&oid.id!=m[2])oid=jQuery('[@id="'+m[2]+'"]',elem)[0];ret=r=oid&&(!m[3]||jQuery.nodeName(oid,m[3]))?[oid]:[];}else{for(var i=0;ret[i];i++){var tag=m[1]=="#"&&m[3]?m[3]:m[1]!=""||m[0]==""?"*":m[2];if(tag=="*"&&ret[i].nodeName.toLowerCase()=="object")tag="param";r=jQuery.merge(r,ret[i].getElementsByTagName(tag));}if(m[1]==".")r=jQuery.classFilter(r,m[2]);if(m[1]=="#"){var tmp=[];for(var i=0;r[i];i++)if(r[i].getAttribute("id")==m[2]){tmp=[r[i]];break;}r=tmp;}ret=r;}t=t.replace(re2,"");}}if(t){var val=jQuery.filter(t,r);ret=r=val.r;t=jQuery.trim(val.t);}}if(t)ret=[];if(ret&&context==ret[0])ret.shift();done=jQuery.merge(done,ret);return done;},classFilter:function(r,m,not){m=" "+m+" ";var tmp=[];for(var i=0;r[i];i++){var pass=(" "+r[i].className+" ").indexOf(m)>=0;if(!not&&pass||not&&!pass)tmp.push(r[i]);}return tmp;},filter:function(t,r,not){var last;while(t&&t!=last){last=t;var p=jQuery.parse,m;for(var i=0;p[i];i++){m=p[i].exec(t);if(m){t=t.substring(m[0].length);m[2]=m[2].replace(/\\/g,"");break;}}if(!m)break;if(m[1]==":"&&m[2]=="not")r=isSimple.test(m[3])?jQuery.filter(m[3],r,true).r:jQuery(r).not(m[3]);else if(m[1]==".")r=jQuery.classFilter(r,m[2],not);else if(m[1]=="["){var tmp=[],type=m[3];for(var i=0,rl=r.length;i<rl;i++){var a=r[i],z=a[jQuery.props[m[2]]||m[2]];if(z==null||/href|src|selected/.test(m[2]))z=jQuery.attr(a,m[2])||'';if((type==""&&!!z||type=="="&&z==m[5]||type=="!="&&z!=m[5]||type=="^="&&z&&!z.indexOf(m[5])||type=="$="&&z.substr(z.length-m[5].length)==m[5]||(type=="*="||type=="~=")&&z.indexOf(m[5])>=0)^not)tmp.push(a);}r=tmp;}else if(m[1]==":"&&m[2]=="nth-child"){var merge={},tmp=[],test=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(m[3]=="even"&&"2n"||m[3]=="odd"&&"2n+1"||!/\D/.test(m[3])&&"0n+"+m[3]||m[3]),first=(test[1]+(test[2]||1))-0,last=test[3]-0;for(var i=0,rl=r.length;i<rl;i++){var node=r[i],parentNode=node.parentNode,id=jQuery.data(parentNode);if(!merge[id]){var c=1;for(var n=parentNode.firstChild;n;n=n.nextSibling)if(n.nodeType==1)n.nodeIndex=c++;merge[id]=true;}var add=false;if(first==0){if(node.nodeIndex==last)add=true;}else if((node.nodeIndex-last)%first==0&&(node.nodeIndex-last)/first>=0)add=true;if(add^not)tmp.push(node);}r=tmp;}else{var fn=jQuery.expr[m[1]];if(typeof fn=="object")fn=fn[m[2]];if(typeof fn=="string")fn=eval("false||function(a,i){return "+fn+";}");r=jQuery.grep(r,function(elem,i){return fn(elem,i,m,r);},not);}}return{r:r,t:t};},dir:function(elem,dir){var matched=[],cur=elem[dir];while(cur&&cur!=document){if(cur.nodeType==1)matched.push(cur);cur=cur[dir];}return matched;},nth:function(cur,result,dir,elem){result=result||1;var num=0;for(;cur;cur=cur[dir])if(cur.nodeType==1&&++num==result)break;return cur;},sibling:function(n,elem){var r=[];for(;n;n=n.nextSibling){if(n.nodeType==1&&n!=elem)r.push(n);}return r;}});jQuery.event={add:function(elem,types,handler,data){if(elem.nodeType==3||elem.nodeType==8)return;if(jQuery.browser.msie&&elem.setInterval)elem=window;if(!handler.guid)handler.guid=this.guid++;if(data!=undefined){var fn=handler;handler=this.proxy(fn,function(){return fn.apply(this,arguments);});handler.data=data;}var events=jQuery.data(elem,"events")||jQuery.data(elem,"events",{}),handle=jQuery.data(elem,"handle")||jQuery.data(elem,"handle",function(){if(typeof jQuery!="undefined"&&!jQuery.event.triggered)return jQuery.event.handle.apply(arguments.callee.elem,arguments);});handle.elem=elem;jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];handler.type=parts[1];var handlers=events[type];if(!handlers){handlers=events[type]={};if(!jQuery.event.special[type]||jQuery.event.special[type].setup.call(elem)===false){if(elem.addEventListener)elem.addEventListener(type,handle,false);else if(elem.attachEvent)elem.attachEvent("on"+type,handle);}}handlers[handler.guid]=handler;jQuery.event.global[type]=true;});elem=null;},guid:1,global:{},remove:function(elem,types,handler){if(elem.nodeType==3||elem.nodeType==8)return;var events=jQuery.data(elem,"events"),ret,index;if(events){if(types==undefined||(typeof types=="string"&&types.charAt(0)=="."))for(var type in events)this.remove(elem,type+(types||""));else{if(types.type){handler=types.handler;types=types.type;}jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];if(events[type]){if(handler)delete events[type][handler.guid];else
+for(handler in events[type])if(!parts[1]||events[type][handler].type==parts[1])delete events[type][handler];for(ret in events[type])break;if(!ret){if(!jQuery.event.special[type]||jQuery.event.special[type].teardown.call(elem)===false){if(elem.removeEventListener)elem.removeEventListener(type,jQuery.data(elem,"handle"),false);else if(elem.detachEvent)elem.detachEvent("on"+type,jQuery.data(elem,"handle"));}ret=null;delete events[type];}}});}for(ret in events)break;if(!ret){var handle=jQuery.data(elem,"handle");if(handle)handle.elem=null;jQuery.removeData(elem,"events");jQuery.removeData(elem,"handle");}}},trigger:function(type,data,elem,donative,extra){data=jQuery.makeArray(data);if(type.indexOf("!")>=0){type=type.slice(0,-1);var exclusive=true;}if(!elem){if(this.global[type])jQuery("*").add([window,document]).trigger(type,data);}else{if(elem.nodeType==3||elem.nodeType==8)return undefined;var val,ret,fn=jQuery.isFunction(elem[type]||null),event=!data[0]||!data[0].preventDefault;if(event){data.unshift({type:type,target:elem,preventDefault:function(){},stopPropagation:function(){},timeStamp:now()});data[0][expando]=true;}data[0].type=type;if(exclusive)data[0].exclusive=true;var handle=jQuery.data(elem,"handle");if(handle)val=handle.apply(elem,data);if((!fn||(jQuery.nodeName(elem,'a')&&type=="click"))&&elem["on"+type]&&elem["on"+type].apply(elem,data)===false)val=false;if(event)data.shift();if(extra&&jQuery.isFunction(extra)){ret=extra.apply(elem,val==null?data:data.concat(val));if(ret!==undefined)val=ret;}if(fn&&donative!==false&&val!==false&&!(jQuery.nodeName(elem,'a')&&type=="click")){this.triggered=true;try{elem[type]();}catch(e){}}this.triggered=false;}return val;},handle:function(event){var val,ret,namespace,all,handlers;event=arguments[0]=jQuery.event.fix(event||window.event);namespace=event.type.split(".");event.type=namespace[0];namespace=namespace[1];all=!namespace&&!event.exclusive;handlers=(jQuery.data(this,"events")||{})[event.type];for(var j in handlers){var handler=handlers[j];if(all||handler.type==namespace){event.handler=handler;event.data=handler.data;ret=handler.apply(this,arguments);if(val!==false)val=ret;if(ret===false){event.preventDefault();event.stopPropagation();}}}return val;},fix:function(event){if(event[expando]==true)return event;var originalEvent=event;event={originalEvent:originalEvent};var props="altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target timeStamp toElement type view wheelDelta which".split(" ");for(var i=props.length;i;i--)event[props[i]]=originalEvent[props[i]];event[expando]=true;event.preventDefault=function(){if(originalEvent.preventDefault)originalEvent.preventDefault();originalEvent.returnValue=false;};event.stopPropagation=function(){if(originalEvent.stopPropagation)originalEvent.stopPropagation();originalEvent.cancelBubble=true;};event.timeStamp=event.timeStamp||now();if(!event.target)event.target=event.srcElement||document;if(event.target.nodeType==3)event.target=event.target.parentNode;if(!event.relatedTarget&&event.fromElement)event.relatedTarget=event.fromElement==event.target?event.toElement:event.fromElement;if(event.pageX==null&&event.clientX!=null){var doc=document.documentElement,body=document.body;event.pageX=event.clientX+(doc&&doc.scrollLeft||body&&body.scrollLeft||0)-(doc.clientLeft||0);event.pageY=event.clientY+(doc&&doc.scrollTop||body&&body.scrollTop||0)-(doc.clientTop||0);}if(!event.which&&((event.charCode||event.charCode===0)?event.charCode:event.keyCode))event.which=event.charCode||event.keyCode;if(!event.metaKey&&event.ctrlKey)event.metaKey=event.ctrlKey;if(!event.which&&event.button)event.which=(event.button&1?1:(event.button&2?3:(event.button&4?2:0)));return event;},proxy:function(fn,proxy){proxy.guid=fn.guid=fn.guid||proxy.guid||this.guid++;return proxy;},special:{ready:{setup:function(){bindReady();return;},teardown:function(){return;}},mouseenter:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseover",jQuery.event.special.mouseenter.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseover",jQuery.event.special.mouseenter.handler);return true;},handler:function(event){if(withinElement(event,this))return true;event.type="mouseenter";return jQuery.event.handle.apply(this,arguments);}},mouseleave:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseout",jQuery.event.special.mouseleave.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseout",jQuery.event.special.mouseleave.handler);return true;},handler:function(event){if(withinElement(event,this))return true;event.type="mouseleave";return jQuery.event.handle.apply(this,arguments);}}}};jQuery.fn.extend({bind:function(type,data,fn){return type=="unload"?this.one(type,data,fn):this.each(function(){jQuery.event.add(this,type,fn||data,fn&&data);});},one:function(type,data,fn){var one=jQuery.event.proxy(fn||data,function(event){jQuery(this).unbind(event,one);return(fn||data).apply(this,arguments);});return this.each(function(){jQuery.event.add(this,type,one,fn&&data);});},unbind:function(type,fn){return this.each(function(){jQuery.event.remove(this,type,fn);});},trigger:function(type,data,fn){return this.each(function(){jQuery.event.trigger(type,data,this,true,fn);});},triggerHandler:function(type,data,fn){return this[0]&&jQuery.event.trigger(type,data,this[0],false,fn);},toggle:function(fn){var args=arguments,i=1;while(i<args.length)jQuery.event.proxy(fn,args[i++]);return this.click(jQuery.event.proxy(fn,function(event){this.lastToggle=(this.lastToggle||0)%i;event.preventDefault();return args[this.lastToggle++].apply(this,arguments)||false;}));},hover:function(fnOver,fnOut){return this.bind('mouseenter',fnOver).bind('mouseleave',fnOut);},ready:function(fn){bindReady();if(jQuery.isReady)fn.call(document,jQuery);else
+jQuery.readyList.push(function(){return fn.call(this,jQuery);});return this;}});jQuery.extend({isReady:false,readyList:[],ready:function(){if(!jQuery.isReady){jQuery.isReady=true;if(jQuery.readyList){jQuery.each(jQuery.readyList,function(){this.call(document);});jQuery.readyList=null;}jQuery(document).triggerHandler("ready");}}});var readyBound=false;function bindReady(){if(readyBound)return;readyBound=true;if(document.addEventListener&&!jQuery.browser.opera)document.addEventListener("DOMContentLoaded",jQuery.ready,false);if(jQuery.browser.msie&&window==top)(function(){if(jQuery.isReady)return;try{document.documentElement.doScroll("left");}catch(error){setTimeout(arguments.callee,0);return;}jQuery.ready();})();if(jQuery.browser.opera)document.addEventListener("DOMContentLoaded",function(){if(jQuery.isReady)return;for(var i=0;i<document.styleSheets.length;i++)if(document.styleSheets[i].disabled){setTimeout(arguments.callee,0);return;}jQuery.ready();},false);if(jQuery.browser.safari){var numStyles;(function(){if(jQuery.isReady)return;if(document.readyState!="loaded"&&document.readyState!="complete"){setTimeout(arguments.callee,0);return;}if(numStyles===undefined)numStyles=jQuery("style, link[rel=stylesheet]").length;if(document.styleSheets.length!=numStyles){setTimeout(arguments.callee,0);return;}jQuery.ready();})();}jQuery.event.add(window,"load",jQuery.ready);}jQuery.each(("blur,focus,load,resize,scroll,unload,click,dblclick,"+"mousedown,mouseup,mousemove,mouseover,mouseout,change,select,"+"submit,keydown,keypress,keyup,error").split(","),function(i,name){jQuery.fn[name]=function(fn){return fn?this.bind(name,fn):this.trigger(name);};});var withinElement=function(event,elem){var parent=event.relatedTarget;while(parent&&parent!=elem)try{parent=parent.parentNode;}catch(error){parent=elem;}return parent==elem;};jQuery(window).bind("unload",function(){jQuery("*").add(document).unbind();});jQuery.fn.extend({_load:jQuery.fn.load,load:function(url,params,callback){if(typeof url!='string')return this._load(url);var off=url.indexOf(" ");if(off>=0){var selector=url.slice(off,url.length);url=url.slice(0,off);}callback=callback||function(){};var type="GET";if(params)if(jQuery.isFunction(params)){callback=params;params=null;}else{params=jQuery.param(params);type="POST";}var self=this;jQuery.ajax({url:url,type:type,dataType:"html",data:params,complete:function(res,status){if(status=="success"||status=="notmodified")self.html(selector?jQuery("<div/>").append(res.responseText.replace(/<script(.|\s)*?\/script>/g,"")).find(selector):res.responseText);self.each(callback,[res.responseText,status,res]);}});return this;},serialize:function(){return jQuery.param(this.serializeArray());},serializeArray:function(){return this.map(function(){return jQuery.nodeName(this,"form")?jQuery.makeArray(this.elements):this;}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password/i.test(this.type));}).map(function(i,elem){var val=jQuery(this).val();return val==null?null:val.constructor==Array?jQuery.map(val,function(val,i){return{name:elem.name,value:val};}):{name:elem.name,value:val};}).get();}});jQuery.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(i,o){jQuery.fn[o]=function(f){return this.bind(o,f);};});var jsc=now();jQuery.extend({get:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data=null;}return jQuery.ajax({type:"GET",url:url,data:data,success:callback,dataType:type});},getScript:function(url,callback){return jQuery.get(url,null,callback,"script");},getJSON:function(url,data,callback){return jQuery.get(url,data,callback,"json");},post:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data={};}return jQuery.ajax({type:"POST",url:url,data:data,success:callback,dataType:type});},ajaxSetup:function(settings){jQuery.extend(jQuery.ajaxSettings,settings);},ajaxSettings:{url:location.href,global:true,type:"GET",timeout:0,contentType:"application/x-www-form-urlencoded",processData:true,async:true,data:null,username:null,password:null,accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(s){s=jQuery.extend(true,s,jQuery.extend(true,{},jQuery.ajaxSettings,s));var jsonp,jsre=/=\?(&|$)/g,status,data,type=s.type.toUpperCase();if(s.data&&s.processData&&typeof s.data!="string")s.data=jQuery.param(s.data);if(s.dataType=="jsonp"){if(type=="GET"){if(!s.url.match(jsre))s.url+=(s.url.match(/\?/)?"&":"?")+(s.jsonp||"callback")+"=?";}else if(!s.data||!s.data.match(jsre))s.data=(s.data?s.data+"&":"")+(s.jsonp||"callback")+"=?";s.dataType="json";}if(s.dataType=="json"&&(s.data&&s.data.match(jsre)||s.url.match(jsre))){jsonp="jsonp"+jsc++;if(s.data)s.data=(s.data+"").replace(jsre,"="+jsonp+"$1");s.url=s.url.replace(jsre,"="+jsonp+"$1");s.dataType="script";window[jsonp]=function(tmp){data=tmp;success();complete();window[jsonp]=undefined;try{delete window[jsonp];}catch(e){}if(head)head.removeChild(script);};}if(s.dataType=="script"&&s.cache==null)s.cache=false;if(s.cache===false&&type=="GET"){var ts=now();var ret=s.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+ts+"$2");s.url=ret+((ret==s.url)?(s.url.match(/\?/)?"&":"?")+"_="+ts:"");}if(s.data&&type=="GET"){s.url+=(s.url.match(/\?/)?"&":"?")+s.data;s.data=null;}if(s.global&&!jQuery.active++)jQuery.event.trigger("ajaxStart");var remote=/^(?:\w+:)?\/\/([^\/?#]+)/;if(s.dataType=="script"&&type=="GET"&&remote.test(s.url)&&remote.exec(s.url)[1]!=location.host){var head=document.getElementsByTagName("head")[0];var script=document.createElement("script");script.src=s.url;if(s.scriptCharset)script.charset=s.scriptCharset;if(!jsonp){var done=false;script.onload=script.onreadystatechange=function(){if(!done&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){done=true;success();complete();head.removeChild(script);}};}head.appendChild(script);return undefined;}var requestDone=false;var xhr=window.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest();if(s.username)xhr.open(type,s.url,s.async,s.username,s.password);else
+xhr.open(type,s.url,s.async);try{if(s.data)xhr.setRequestHeader("Content-Type",s.contentType);if(s.ifModified)xhr.setRequestHeader("If-Modified-Since",jQuery.lastModified[s.url]||"Thu, 01 Jan 1970 00:00:00 GMT");xhr.setRequestHeader("X-Requested-With","XMLHttpRequest");xhr.setRequestHeader("Accept",s.dataType&&s.accepts[s.dataType]?s.accepts[s.dataType]+", */*":s.accepts._default);}catch(e){}if(s.beforeSend&&s.beforeSend(xhr,s)===false){s.global&&jQuery.active--;xhr.abort();return false;}if(s.global)jQuery.event.trigger("ajaxSend",[xhr,s]);var onreadystatechange=function(isTimeout){if(!requestDone&&xhr&&(xhr.readyState==4||isTimeout=="timeout")){requestDone=true;if(ival){clearInterval(ival);ival=null;}status=isTimeout=="timeout"&&"timeout"||!jQuery.httpSuccess(xhr)&&"error"||s.ifModified&&jQuery.httpNotModified(xhr,s.url)&&"notmodified"||"success";if(status=="success"){try{data=jQuery.httpData(xhr,s.dataType,s.dataFilter);}catch(e){status="parsererror";}}if(status=="success"){var modRes;try{modRes=xhr.getResponseHeader("Last-Modified");}catch(e){}if(s.ifModified&&modRes)jQuery.lastModified[s.url]=modRes;if(!jsonp)success();}else
+jQuery.handleError(s,xhr,status);complete();if(s.async)xhr=null;}};if(s.async){var ival=setInterval(onreadystatechange,13);if(s.timeout>0)setTimeout(function(){if(xhr){xhr.abort();if(!requestDone)onreadystatechange("timeout");}},s.timeout);}try{xhr.send(s.data);}catch(e){jQuery.handleError(s,xhr,null,e);}if(!s.async)onreadystatechange();function success(){if(s.success)s.success(data,status);if(s.global)jQuery.event.trigger("ajaxSuccess",[xhr,s]);}function complete(){if(s.complete)s.complete(xhr,status);if(s.global)jQuery.event.trigger("ajaxComplete",[xhr,s]);if(s.global&&!--jQuery.active)jQuery.event.trigger("ajaxStop");}return xhr;},handleError:function(s,xhr,status,e){if(s.error)s.error(xhr,status,e);if(s.global)jQuery.event.trigger("ajaxError",[xhr,s,e]);},active:0,httpSuccess:function(xhr){try{return!xhr.status&&location.protocol=="file:"||(xhr.status>=200&&xhr.status<300)||xhr.status==304||xhr.status==1223||jQuery.browser.safari&&xhr.status==undefined;}catch(e){}return false;},httpNotModified:function(xhr,url){try{var xhrRes=xhr.getResponseHeader("Last-Modified");return xhr.status==304||xhrRes==jQuery.lastModified[url]||jQuery.browser.safari&&xhr.status==undefined;}catch(e){}return false;},httpData:function(xhr,type,filter){var ct=xhr.getResponseHeader("content-type"),xml=type=="xml"||!type&&ct&&ct.indexOf("xml")>=0,data=xml?xhr.responseXML:xhr.responseText;if(xml&&data.documentElement.tagName=="parsererror")throw"parsererror";if(filter)data=filter(data,type);if(type=="script")jQuery.globalEval(data);if(type=="json")data=eval("("+data+")");return data;},param:function(a){var s=[];if(a.constructor==Array||a.jquery)jQuery.each(a,function(){s.push(encodeURIComponent(this.name)+"="+encodeURIComponent(this.value));});else
+for(var j in a)if(a[j]&&a[j].constructor==Array)jQuery.each(a[j],function(){s.push(encodeURIComponent(j)+"="+encodeURIComponent(this));});else
+s.push(encodeURIComponent(j)+"="+encodeURIComponent(jQuery.isFunction(a[j])?a[j]():a[j]));return s.join("&").replace(/%20/g,"+");}});jQuery.fn.extend({show:function(speed,callback){return speed?this.animate({height:"show",width:"show",opacity:"show"},speed,callback):this.filter(":hidden").each(function(){this.style.display=this.oldblock||"";if(jQuery.css(this,"display")=="none"){var elem=jQuery("<"+this.tagName+" />").appendTo("body");this.style.display=elem.css("display");if(this.style.display=="none")this.style.display="block";elem.remove();}}).end();},hide:function(speed,callback){return speed?this.animate({height:"hide",width:"hide",opacity:"hide"},speed,callback):this.filter(":visible").each(function(){this.oldblock=this.oldblock||jQuery.css(this,"display");this.style.display="none";}).end();},_toggle:jQuery.fn.toggle,toggle:function(fn,fn2){return jQuery.isFunction(fn)&&jQuery.isFunction(fn2)?this._toggle.apply(this,arguments):fn?this.animate({height:"toggle",width:"toggle",opacity:"toggle"},fn,fn2):this.each(function(){jQuery(this)[jQuery(this).is(":hidden")?"show":"hide"]();});},slideDown:function(speed,callback){return this.animate({height:"show"},speed,callback);},slideUp:function(speed,callback){return this.animate({height:"hide"},speed,callback);},slideToggle:function(speed,callback){return this.animate({height:"toggle"},speed,callback);},fadeIn:function(speed,callback){return this.animate({opacity:"show"},speed,callback);},fadeOut:function(speed,callback){return this.animate({opacity:"hide"},speed,callback);},fadeTo:function(speed,to,callback){return this.animate({opacity:to},speed,callback);},animate:function(prop,speed,easing,callback){var optall=jQuery.speed(speed,easing,callback);return this[optall.queue===false?"each":"queue"](function(){if(this.nodeType!=1)return false;var opt=jQuery.extend({},optall),p,hidden=jQuery(this).is(":hidden"),self=this;for(p in prop){if(prop[p]=="hide"&&hidden||prop[p]=="show"&&!hidden)return opt.complete.call(this);if(p=="height"||p=="width"){opt.display=jQuery.css(this,"display");opt.overflow=this.style.overflow;}}if(opt.overflow!=null)this.style.overflow="hidden";opt.curAnim=jQuery.extend({},prop);jQuery.each(prop,function(name,val){var e=new jQuery.fx(self,opt,name);if(/toggle|show|hide/.test(val))e[val=="toggle"?hidden?"show":"hide":val](prop);else{var parts=val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),start=e.cur(true)||0;if(parts){var end=parseFloat(parts[2]),unit=parts[3]||"px";if(unit!="px"){self.style[name]=(end||1)+unit;start=((end||1)/e.cur(true))*start;self.style[name]=start+unit;}if(parts[1])end=((parts[1]=="-="?-1:1)*end)+start;e.custom(start,end,unit);}else
+e.custom(start,val,"");}});return true;});},queue:function(type,fn){if(jQuery.isFunction(type)||(type&&type.constructor==Array)){fn=type;type="fx";}if(!type||(typeof type=="string"&&!fn))return queue(this[0],type);return this.each(function(){if(fn.constructor==Array)queue(this,type,fn);else{queue(this,type).push(fn);if(queue(this,type).length==1)fn.call(this);}});},stop:function(clearQueue,gotoEnd){var timers=jQuery.timers;if(clearQueue)this.queue([]);this.each(function(){for(var i=timers.length-1;i>=0;i--)if(timers[i].elem==this){if(gotoEnd)timers[i](true);timers.splice(i,1);}});if(!gotoEnd)this.dequeue();return this;}});var queue=function(elem,type,array){if(elem){type=type||"fx";var q=jQuery.data(elem,type+"queue");if(!q||array)q=jQuery.data(elem,type+"queue",jQuery.makeArray(array));}return q;};jQuery.fn.dequeue=function(type){type=type||"fx";return this.each(function(){var q=queue(this,type);q.shift();if(q.length)q[0].call(this);});};jQuery.extend({speed:function(speed,easing,fn){var opt=speed&&speed.constructor==Object?speed:{complete:fn||!fn&&easing||jQuery.isFunction(speed)&&speed,duration:speed,easing:fn&&easing||easing&&easing.constructor!=Function&&easing};opt.duration=(opt.duration&&opt.duration.constructor==Number?opt.duration:jQuery.fx.speeds[opt.duration])||jQuery.fx.speeds.def;opt.old=opt.complete;opt.complete=function(){if(opt.queue!==false)jQuery(this).dequeue();if(jQuery.isFunction(opt.old))opt.old.call(this);};return opt;},easing:{linear:function(p,n,firstNum,diff){return firstNum+diff*p;},swing:function(p,n,firstNum,diff){return((-Math.cos(p*Math.PI)/2)+0.5)*diff+firstNum;}},timers:[],timerId:null,fx:function(elem,options,prop){this.options=options;this.elem=elem;this.prop=prop;if(!options.orig)options.orig={};}});jQuery.fx.prototype={update:function(){if(this.options.step)this.options.step.call(this.elem,this.now,this);(jQuery.fx.step[this.prop]||jQuery.fx.step._default)(this);if(this.prop=="height"||this.prop=="width")this.elem.style.display="block";},cur:function(force){if(this.elem[this.prop]!=null&&this.elem.style[this.prop]==null)return this.elem[this.prop];var r=parseFloat(jQuery.css(this.elem,this.prop,force));return r&&r>-10000?r:parseFloat(jQuery.curCSS(this.elem,this.prop))||0;},custom:function(from,to,unit){this.startTime=now();this.start=from;this.end=to;this.unit=unit||this.unit||"px";this.now=this.start;this.pos=this.state=0;this.update();var self=this;function t(gotoEnd){return self.step(gotoEnd);}t.elem=this.elem;jQuery.timers.push(t);if(jQuery.timerId==null){jQuery.timerId=setInterval(function(){var timers=jQuery.timers;for(var i=0;i<timers.length;i++)if(!timers[i]())timers.splice(i--,1);if(!timers.length){clearInterval(jQuery.timerId);jQuery.timerId=null;}},13);}},show:function(){this.options.orig[this.prop]=jQuery.attr(this.elem.style,this.prop);this.options.show=true;this.custom(0,this.cur());if(this.prop=="width"||this.prop=="height")this.elem.style[this.prop]="1px";jQuery(this.elem).show();},hide:function(){this.options.orig[this.prop]=jQuery.attr(this.elem.style,this.prop);this.options.hide=true;this.custom(this.cur(),0);},step:function(gotoEnd){var t=now();if(gotoEnd||t>this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var done=true;for(var i in this.options.curAnim)if(this.options.curAnim[i]!==true)done=false;if(done){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(jQuery.css(this.elem,"display")=="none")this.elem.style.display="block";}if(this.options.hide)this.elem.style.display="none";if(this.options.hide||this.options.show)for(var p in this.options.curAnim)jQuery.attr(this.elem.style,p,this.options.orig[p]);}if(done)this.options.complete.call(this.elem);return false;}else{var n=t-this.startTime;this.state=n/this.options.duration;this.pos=jQuery.easing[this.options.easing||(jQuery.easing.swing?"swing":"linear")](this.state,n,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update();}return true;}};jQuery.extend(jQuery.fx,{speeds:{slow:600,fast:200,def:400},step:{scrollLeft:function(fx){fx.elem.scrollLeft=fx.now;},scrollTop:function(fx){fx.elem.scrollTop=fx.now;},opacity:function(fx){jQuery.attr(fx.elem.style,"opacity",fx.now);},_default:function(fx){fx.elem.style[fx.prop]=fx.now+fx.unit;}}});jQuery.fn.offset=function(){var left=0,top=0,elem=this[0],results;if(elem)with(jQuery.browser){var parent=elem.parentNode,offsetChild=elem,offsetParent=elem.offsetParent,doc=elem.ownerDocument,safari2=safari&&parseInt(version)<522&&!/adobeair/i.test(userAgent),css=jQuery.curCSS,fixed=css(elem,"position")=="fixed";if(elem.getBoundingClientRect){var box=elem.getBoundingClientRect();add(box.left+Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),box.top+Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));add(-doc.documentElement.clientLeft,-doc.documentElement.clientTop);}else{add(elem.offsetLeft,elem.offsetTop);while(offsetParent){add(offsetParent.offsetLeft,offsetParent.offsetTop);if(mozilla&&!/^t(able|d|h)$/i.test(offsetParent.tagName)||safari&&!safari2)border(offsetParent);if(!fixed&&css(offsetParent,"position")=="fixed")fixed=true;offsetChild=/^body$/i.test(offsetParent.tagName)?offsetChild:offsetParent;offsetParent=offsetParent.offsetParent;}while(parent&&parent.tagName&&!/^body|html$/i.test(parent.tagName)){if(!/^inline|table.*$/i.test(css(parent,"display")))add(-parent.scrollLeft,-parent.scrollTop);if(mozilla&&css(parent,"overflow")!="visible")border(parent);parent=parent.parentNode;}if((safari2&&(fixed||css(offsetChild,"position")=="absolute"))||(mozilla&&css(offsetChild,"position")!="absolute"))add(-doc.body.offsetLeft,-doc.body.offsetTop);if(fixed)add(Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));}results={top:top,left:left};}function border(elem){add(jQuery.curCSS(elem,"borderLeftWidth",true),jQuery.curCSS(elem,"borderTopWidth",true));}function add(l,t){left+=parseInt(l,10)||0;top+=parseInt(t,10)||0;}return results;};jQuery.fn.extend({position:function(){var left=0,top=0,results;if(this[0]){var offsetParent=this.offsetParent(),offset=this.offset(),parentOffset=/^body|html$/i.test(offsetParent[0].tagName)?{top:0,left:0}:offsetParent.offset();offset.top-=num(this,'marginTop');offset.left-=num(this,'marginLeft');parentOffset.top+=num(offsetParent,'borderTopWidth');parentOffset.left+=num(offsetParent,'borderLeftWidth');results={top:offset.top-parentOffset.top,left:offset.left-parentOffset.left};}return results;},offsetParent:function(){var offsetParent=this[0].offsetParent;while(offsetParent&&(!/^body|html$/i.test(offsetParent.tagName)&&jQuery.css(offsetParent,'position')=='static'))offsetParent=offsetParent.offsetParent;return jQuery(offsetParent);}});jQuery.each(['Left','Top'],function(i,name){var method='scroll'+name;jQuery.fn[method]=function(val){if(!this[0])return;return val!=undefined?this.each(function(){this==window||this==document?window.scrollTo(!i?val:jQuery(window).scrollLeft(),i?val:jQuery(window).scrollTop()):this[method]=val;}):this[0]==window||this[0]==document?self[i?'pageYOffset':'pageXOffset']||jQuery.boxModel&&document.documentElement[method]||document.body[method]:this[0][method];};});jQuery.each(["Height","Width"],function(i,name){var tl=i?"Left":"Top",br=i?"Right":"Bottom";jQuery.fn["inner"+name]=function(){return this[name.toLowerCase()]()+num(this,"padding"+tl)+num(this,"padding"+br);};jQuery.fn["outer"+name]=function(margin){return this["inner"+name]()+num(this,"border"+tl+"Width")+num(this,"border"+br+"Width")+(margin?num(this,"margin"+tl)+num(this,"margin"+br):0);};});})();
\ No newline at end of file
diff --git a/underlays/openid-selector/ikiwiki/openid/openid-jquery.js b/underlays/openid-selector/ikiwiki/openid/openid-jquery.js
new file mode 100644 (file)
index 0000000..f22f577
--- /dev/null
@@ -0,0 +1,272 @@
+/*
+Simple OpenID Plugin
+http://code.google.com/p/openid-selector/
+
+This code is licenced under the New BSD License.
+*/
+
+var providers_large = {
+    google: {
+        name: 'Google',
+       icon: 'http://google.com/favicon.ico',
+        url: 'https://www.google.com/accounts/o8/id'
+    },
+    yahoo: {
+        name: 'Yahoo',      
+       icon: 'http://yahoo.com/favicon.ico',
+        url: 'http://me.yahoo.com/'
+    },    
+    openid: {
+        name: 'OpenID',     
+       icon: 'wikiicons/openidlogin-bg.gif',
+        label: 'Enter your OpenID:',
+        url: null
+    },
+};
+var providers_small = {
+    livejournal: {
+        name: 'LiveJournal',
+       icon: 'http://livejournal.com/favicon.ico',
+        label: 'Enter your Livejournal username:',
+        url: 'http://{username}.livejournal.com/'
+    },
+    flickr: {
+       name: 'Flickr',        
+       icon: 'http://flickr.com/favicon.ico',
+       label: 'Enter your Flickr username:',
+       url: 'http://flickr.com/photos/{username}/'
+    },
+    wordpress: {
+        name: 'Wordpress',
+       icon: 'https://ddgw.s3.amazonaws.com/wordpress.org.ico',
+        label: 'Enter your Wordpress.com username:',
+        url: 'http://{username}.wordpress.com/'
+    },
+    myopenid: {
+        name: 'MyOpenID',
+       icon: 'http://myopenid.com/favicon.ico',
+        label: 'Enter your MyOpenID username:',
+        url: 'http://{username}.myopenid.com/'
+    },
+    claimid: {
+        name: 'ClaimID',
+       icon: 'http://claimid.com/favicon.ico',
+        label: 'Enter your ClaimID username:',
+        url: 'http://claimid.com/{username}'
+    },
+    aol: {
+        name: 'AOL',     
+       icon: 'http://aol.com/favicon.ico',
+        label: 'Enter your AOL username:',
+        url: 'http://openid.aol.com/{username}'
+    },
+    verisign: {
+        name: 'Verisign',
+       icon: 'http://verisign.com/favicon.ico',
+        label: 'Enter your Verisign username:',
+        url: 'http://{username}.pip.verisignlabs.com/'
+    },
+};
+var providers = $.extend({}, providers_large, providers_small);
+
+var openid = {
+
+       demo: false,
+       ajaxHandler: null,
+       cookie_expires: 6*30,   // 6 months.
+       cookie_name: 'openid_provider',
+       cookie_path: '/',
+       
+       img_path: 'images/',
+       
+       input_id: null,
+       provider_url: null,
+       provider_id: null,
+       localsignin_id: null,
+       
+    init: function(input_id, localsignin_id) {
+        
+        var openid_btns = $('#openid_btns');
+        
+        this.input_id = input_id;
+        
+        $('#openid_choice').show();
+        $('#openid_input_area').empty();
+        
+        // add box for each provider
+        for (id in providers_large) {
+               openid_btns.append(this.getBoxHTML(providers_large[id], 'large'));
+        }
+
+        if (providers_small) {
+               openid_btns.append('<br/>');
+               
+               for (id in providers_small) {
+               
+                       openid_btns.append(this.getBoxHTML(providers_small[id], 'small'));
+               }
+        }
+       if (localsignin_id != "") {
+               this.localsignin_id=localsignin_id;
+               openid_btns.append(
+                       '<a href="javascript: openid.signin(\'localsignin\');"' +
+                       ' style="background: #FFF" ' +
+                       'class="localsignin openid_small_btn">' +
+                       '<img alt="" width="16" height="16" src="favicon.ico" />' +
+                       ' other' +
+                       '</a>'
+               );
+               $('#'+this.localsignin_id).hide();
+       }
+        
+        $('#openid_form').submit(this.submit);
+        
+        var box_id = this.readCookie();
+        if (box_id) {
+               this.signin(box_id, true);
+        }
+    },
+    getBoxHTML: function(provider, box_size) {
+       var label="";
+       var title=""
+       if (box_size == 'large') {
+               label=' ' + provider["name"];
+       }
+       else {
+               title=' title="'+provider["name"]+'"';
+       }
+        var box_id = provider["name"].toLowerCase();
+        return '<a' + title +' href="javascript: openid.signin(\''+ box_id +'\');"' +
+                       ' style="background: #FFF" ' + 
+                       'class="' + box_id + ' openid_' + box_size + '_btn">' +
+                       '<img alt="" width="16" height="16" src="' + provider["icon"] + '" />' +
+                       label +
+                       '</a>';
+    
+    },
+    /* Provider image click */
+    signin: function(box_id, onload) {
+
+       if (box_id == 'localsignin') {
+               this.highlight(box_id);
+               $('#openid_input_area').empty();
+               $('#'+this.localsignin_id).show();
+               this.setCookie(box_id);
+               return;
+       }
+       else {
+               if (this.localsignin_id) {
+                       $('#'+this.localsignin_id).hide();
+               }
+       }
+
+       var provider = providers[box_id];
+               if (! provider) {
+                       return;
+               }
+               
+               this.highlight(box_id);
+               
+               this.provider_id = box_id;
+               this.provider_url = provider['url'];
+               
+               // prompt user for input?
+               if (provider['label']) {
+                       this.setCookie(box_id);
+                       this.useInputBox(provider);
+               } else {
+                       this.setCookie('');
+                       $('#openid_input_area').empty();
+                       if (! onload) {
+                               $('#openid_form').submit();
+                       }
+               }
+    },
+    /* Sign-in button click */
+    submit: function() {
+        
+       var url = openid.provider_url; 
+       if (url) {
+               url = url.replace('{username}', $('#openid_username').val());
+               openid.setOpenIdUrl(url);
+       }
+       if(openid.ajaxHandler) {
+               openid.ajaxHandler(openid.provider_id, document.getElementById(openid.input_id).value);
+               return false;
+       }
+       if(openid.demo) {
+               alert("In client demo mode. Normally would have submitted OpenID:\r\n" + document.getElementById(openid.input_id).value);
+               return false;
+       }
+       return true;
+    },
+    setOpenIdUrl: function (url) {
+    
+       var hidden = $('#'+this.input_id);
+       if (hidden.length > 0) {
+               hidden.value = url;
+       } else {
+               $('#openid_form').append('<input style="display:none" id="' + this.input_id + '" name="' + this.input_id + '" value="'+url+'"/>');
+       }
+    },
+    highlight: function (box_id) {
+       
+       // remove previous highlight.
+       var highlight = $('#openid_highlight');
+       if (highlight) {
+               highlight.replaceWith($('#openid_highlight a')[0]);
+       }
+       // add new highlight.
+       $('.'+box_id).wrap('<div id="openid_highlight"></div>');
+    },
+    setCookie: function (value) {
+    
+               var date = new Date();
+               date.setTime(date.getTime()+(this.cookie_expires*24*60*60*1000));
+               var expires = "; expires="+date.toGMTString();
+               
+               document.cookie = this.cookie_name+"="+value+expires+"; path=" + this.cookie_path;
+    },
+    readCookie: function () {
+               var nameEQ = this.cookie_name + "=";
+               var ca = document.cookie.split(';');
+               for(var i=0;i < ca.length;i++) {
+                       var c = ca[i];
+                       while (c.charAt(0)==' ') c = c.substring(1,c.length);
+                       if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
+               }
+               return null;
+    },
+    useInputBox: function (provider) {
+       
+               var input_area = $('#openid_input_area');
+               
+               var html = '';
+               var id = 'openid_username';
+               var value = '';
+               var label = provider['label'];
+               var style = '';
+               
+               if (provider['name'] == 'OpenID') {
+                       id = this.input_id;
+                       value = '';
+                       style = 'background:#FFF url(wikiicons/openidlogin-bg.gif) no-repeat scroll 0 50%; padding-left:18px;';
+               }
+               if (label) {
+                       html = '<label for="'+ id +'" class="block">' + label + '</label>';
+               }
+               html += '<input id="'+id+'" type="text" style="'+style+'" name="'+id+'" value="'+value+'" />' + 
+                                       '<input id="openid_submit" type="submit" value="Login"/>';
+               
+               input_area.empty();
+               input_area.append(html);
+
+               $('#'+id).focus();
+    },
+    setDemoMode: function (demoMode) {
+       this.demo = demoMode;
+    },
+    setAjaxHandler: function (ajaxFunction) {
+       this.ajaxHandler = ajaxFunction;
+    }
+};