]> sipb.mit.edu Git - ikiwiki.git/commitdiff
Merge branch 'ready/chrysn/linkmapenhancement'
authorSimon McVittie <smcv@debian.org>
Fri, 12 Sep 2014 20:57:04 +0000 (21:57 +0100)
committerSimon McVittie <smcv@debian.org>
Fri, 12 Sep 2014 20:57:04 +0000 (21:57 +0100)
777 files changed:
.gitignore
IkiWiki.pm
IkiWiki/CGI.pm
IkiWiki/Plugin/aggregate.pm
IkiWiki/Plugin/amazon_s3.pm
IkiWiki/Plugin/attachment.pm
IkiWiki/Plugin/blogspam.pm
IkiWiki/Plugin/bzr.pm
IkiWiki/Plugin/calendar.pm
IkiWiki/Plugin/comments.pm
IkiWiki/Plugin/conditional.pm
IkiWiki/Plugin/cvs.pm
IkiWiki/Plugin/editpage.pm
IkiWiki/Plugin/edittemplate.pm
IkiWiki/Plugin/filecheck.pm
IkiWiki/Plugin/git.pm
IkiWiki/Plugin/graphviz.pm
IkiWiki/Plugin/highlight.pm
IkiWiki/Plugin/htmlscrubber.pm
IkiWiki/Plugin/httpauth.pm
IkiWiki/Plugin/inline.pm
IkiWiki/Plugin/link.pm
IkiWiki/Plugin/map.pm
IkiWiki/Plugin/mdwn.pm
IkiWiki/Plugin/meta.pm
IkiWiki/Plugin/mirrorlist.pm
IkiWiki/Plugin/notifyemail.pm [new file with mode: 0644]
IkiWiki/Plugin/opendiscussion.pm
IkiWiki/Plugin/openid.pm
IkiWiki/Plugin/osm.pm
IkiWiki/Plugin/passwordauth.pm
IkiWiki/Plugin/pinger.pm
IkiWiki/Plugin/po.pm
IkiWiki/Plugin/poll.pm
IkiWiki/Plugin/recentchanges.pm
IkiWiki/Plugin/recentchangesdiff.pm
IkiWiki/Plugin/remove.pm
IkiWiki/Plugin/rename.pm
IkiWiki/Plugin/rsync.pm
IkiWiki/Plugin/search.pm
IkiWiki/Plugin/skeleton.pm.example
IkiWiki/Plugin/template.pm
IkiWiki/Plugin/theme.pm
IkiWiki/Plugin/trail.pm [new file with mode: 0644]
IkiWiki/Plugin/transient.pm
IkiWiki/Plugin/underlay.pm
IkiWiki/Render.pm
IkiWiki/Setup.pm
IkiWiki/Wrapper.pm
Makefile.PL
auto-blog.setup
debian/changelog
debian/compat
debian/control
debian/copyright
doc/anchor.mdwn
doc/basewiki/sandbox.mdwn
doc/branches.mdwn
doc/bugs/Attachment_plug-in_not_committing_files.mdwn [new file with mode: 0644]
doc/bugs/CGI_wrapper_doesn__39__t_store_PERL5LIB_environment_variable.mdwn [new file with mode: 0644]
doc/bugs/CamelCase_and_Recent_Changes_create_spurious_Links.mdwn [new file with mode: 0644]
doc/bugs/Error:_OpenID_failure:_time_bad_sig:.mdwn
doc/bugs/Error:_no_text_was_copied_in_this_page_--_missing_page_dependencies.mdwn
doc/bugs/Existing_Discussion_pages_appear_as_non-existing.mdwn [new file with mode: 0644]
doc/bugs/FormattingHelp_links_to_MarkDown_help_page_regardless_of_page_format.mdwn [new file with mode: 0644]
doc/bugs/Inlining_adds_newlines_which_can_break_markdown.mdwn [new file with mode: 0644]
doc/bugs/Linkmap_doesn__39__t_support_multiple_linkmaps_on_a_single_page.mdwn [new file with mode: 0644]
doc/bugs/Navbar_does_not_link_to_page_being_commented_on_while_commenting.mdwn [new file with mode: 0644]
doc/bugs/Please_update_highlight_plugin_for_highlight_3.18.mdwn [new file with mode: 0644]
doc/bugs/Remove_redirect_pages_from_inline_pages.mdwn [new file with mode: 0644]
doc/bugs/Slow_Filecheck_attachments___34__snails_it_all__34__.mdwn [new file with mode: 0644]
doc/bugs/Slow_Filecheck_attachments___34__snails_it_all__34__/discussion.mdwn [new file with mode: 0644]
doc/bugs/Spurious___60__p__62___elements_added_to_tags_in_inliine_pages.mdwn
doc/bugs/Underscores_in_links_don__39__t_appear.mdwn [new file with mode: 0644]
doc/bugs/W3MMode_still_uses_http:__47____47__localhost__63__.mdwn
doc/bugs/Webedits_without_comment_don__39__t_make_it_through_git.mdwn [new file with mode: 0644]
doc/bugs/__91____91____33__inline_postform__61__no__93____93___doesn__39__t_disable_it.mdwn [new file with mode: 0644]
doc/bugs/aggregate_plugin_should_honour_a_post__39__s_mctime.mdwn
doc/bugs/assumes___34__git_push_origin__34___is_sufficient.mdwn [new file with mode: 0644]
doc/bugs/blogspam_marks_me_as_spam_on_ipv6.mdwn [new file with mode: 0644]
doc/bugs/bug_in_cgiurl_port.mdwn [new file with mode: 0644]
doc/bugs/can__39__t_upload_a_simple_png_image:_prohibited_by_allowed__95__attachments___40__file_MIME_type_is_application__47__octet-stream....mdwn [new file with mode: 0644]
doc/bugs/cannot_clone_documented_git_repo.mdwn [new file with mode: 0644]
doc/bugs/cannot_decode_wide_characters_error_with_utf-8_encoding.mdwn [new file with mode: 0644]
doc/bugs/capitalized_attachment_names.mdwn [new file with mode: 0644]
doc/bugs/changes_from_the_web_interface_fail_to_get_committed.mdwn [new file with mode: 0644]
doc/bugs/conditional_preprocess_during_scan.mdwn
doc/bugs/crashes_in_the_python_proxy_even_if_disabled.mdwn [new file with mode: 0644]
doc/bugs/cutpaste.pm:_missing_filter_call.mdwn
doc/bugs/debwiki_shortcut_creates_buggy_URLs_to_subpages.mdwn [new file with mode: 0644]
doc/bugs/definition_lists_should_be_bold.mdwn [new file with mode: 0644]
doc/bugs/do_not_let_big_brother_spy_on_our_users_on_login.mdwn [new file with mode: 0644]
doc/bugs/editing_gitbranch_template_is_really_slow.mdwn [new file with mode: 0644]
doc/bugs/empty_div_element.mdwn [new file with mode: 0644]
doc/bugs/enabling_or_disabling_plugin_x_does_not_rebuild_pages_that_use_enabled__40__x__41__.mdwn [new file with mode: 0644]
doc/bugs/encoding_issue_in_blogspam_plugin.mdwn [new file with mode: 0644]
doc/bugs/error_handlers_with_gettext_can_clobber___36____64__.mdwn [new file with mode: 0644]
doc/bugs/feedpages_does_not_prevent_tags_from_being_aggregated.mdwn [new file with mode: 0644]
doc/bugs/feeds_get_removed_in_strange_conditions.mdwn [new file with mode: 0644]
doc/bugs/garbled_non-ascii_characters_in_body_in_web_interface.mdwn [new file with mode: 0644]
doc/bugs/graphviz_demo_generates_empty_graph.mdwn [new file with mode: 0644]
doc/bugs/http_proxy_for_openid.mdwn
doc/bugs/image_rescaling_distorts_with_small_pictures.mdwn [new file with mode: 0644]
doc/bugs/images_in_inlined_pages_have_wrong_relative_URL.mdwn
doc/bugs/ipv6_address_in_comments.mdwn [new file with mode: 0644]
doc/bugs/linkmap_displays_underscore_escapes.mdwn [new file with mode: 0644]
doc/bugs/linkmap_displays_underscore_escapes/the_patch.pl [new file with mode: 0644]
doc/bugs/listdirectives_doesn__39__t_register_a_link.mdwn [new file with mode: 0644]
doc/bugs/map_generates_malformed_HTML.mdwn [new file with mode: 0644]
doc/bugs/must_save_before_uploading_more_than_one_attachment.mdwn
doc/bugs/nonexistent_pages_in_inline_pagenames_do_not_add_a_dependency.mdwn [new file with mode: 0644]
doc/bugs/notifyemail_fails_with_some_openid_providers.mdwn [new file with mode: 0644]
doc/bugs/opendiscussion_should_respect_the_discussion_option.mdwn
doc/bugs/opendiscussion_should_respect_the_discussion_option/discussion.mdwn [new file with mode: 0644]
doc/bugs/openid_login_fails_wirth_Could_not_determine_ID_provider_from_URL.mdwn [new file with mode: 0644]
doc/bugs/osm_KML_maps_do_not_display_properly_on_google_maps.mdwn [new file with mode: 0644]
doc/bugs/osm_KML_maps_icon_path_have_a_trailing_slash.mdwn [new file with mode: 0644]
doc/bugs/osm_linkto__40____41___usage_breaks_map_rendering.mdwn [new file with mode: 0644]
doc/bugs/osm_plugin_error_TypeError:_mapProjection_is_null.mdwn [new file with mode: 0644]
doc/bugs/osm_sometimes_looses_some_nodes.mdwn [new file with mode: 0644]
doc/bugs/pages_under_templates_are_invalid.mdwn
doc/bugs/pagetitle_function_does_not_respect_meta_titles.mdwn
doc/bugs/password_reset_fails_with___34__Wide_character_in_subroutine_entry__34__.mdwn [new file with mode: 0644]
doc/bugs/po:_po4a_too_strict_on_html_pages.mdwn
doc/bugs/poll_in_inline.mdwn [new file with mode: 0644]
doc/bugs/possible_to_post_comments_that_will_not_be_displayed.mdwn [new file with mode: 0644]
doc/bugs/possibly_po_related_error.mdwn [new file with mode: 0644]
doc/bugs/preprocessing_loop_control_too_tight.mdwn [new file with mode: 0644]
doc/bugs/proxy.py_utf8_troubles.mdwn [new file with mode: 0644]
doc/bugs/pythonproxy-utf8_again.mdwn [new file with mode: 0644]
doc/bugs/recentchanges_sets_has__95__diffurl__61__1_when_diffurl_is_empty.mdwn [new file with mode: 0644]
doc/bugs/redirect.mdwn [new file with mode: 0644]
doc/bugs/removal_of_transient_pages.mdwn
doc/bugs/renaming_a_page_destroyed_some_links.mdwn [new file with mode: 0644]
doc/bugs/rst_plugin_fails_with___34__uncaught_exception:___39__ascii__39___codec_can__39__t_encode_character__34__.mdwn [new file with mode: 0644]
doc/bugs/rst_plugin_hangs_when_used_with_Python_3.mdwn [new file with mode: 0644]
doc/bugs/search_plugin_finds_no_results_with_xapian_1.2.7.mdwn
doc/bugs/sidebar_not_updated_in_unedited_subpages.mdwn [new file with mode: 0644]
doc/bugs/structured_config_data_is_mangled.mdwn [new file with mode: 0644]
doc/bugs/svg_and_pdf_conversion_fails.mdwn [new file with mode: 0644]
doc/bugs/syslog_fails_with_non-ASCII_wikinames.mdwn [new file with mode: 0644]
doc/bugs/template__95__syntax_test_is_incomplete.mdwn [new file with mode: 0644]
doc/bugs/template_creation_error.mdwn [new file with mode: 0644]
doc/bugs/template_evaluation_oddities.mdwn [new file with mode: 0644]
doc/bugs/toc_displays_headings_from_sidebar.mdwn [new file with mode: 0644]
doc/bugs/trail_excess_dependencies.mdwn [new file with mode: 0644]
doc/bugs/trail_shows_on_cgi_pages.mdwn [new file with mode: 0644]
doc/bugs/trail_test_suite_failures.mdwn [new file with mode: 0644]
doc/bugs/trails_depend_on_everything.mdwn [new file with mode: 0644]
doc/bugs/transient_autocreated_tagbase_is_not_transient_autoindexed.mdwn
doc/bugs/undefined_value_as_a_HASH_reference.mdwn [new file with mode: 0644]
doc/bugs/utf8_warnings_are_meaningless.mdwn [new file with mode: 0644]
doc/bugs/wiki_links_still_processed_inside_code_blocks.mdwn
doc/bugs/wrong_link_in_recentchanges_when_reverting_an_ikiwiki_outside_git_root.mdwn
doc/bugs/yaml:xs_codependency_not_listed.mdwn [new file with mode: 0644]
doc/contact.mdwn
doc/convert.mdwn
doc/css_market.mdwn
doc/download.mdwn
doc/examples/blog/posts.mdwn
doc/examples/softwaresite/bugs/hghg.mdwn [new file with mode: 0644]
doc/features.mdwn
doc/forum/Adding_a_custom_header_and_footer.mdwn [new file with mode: 0644]
doc/forum/Adding_a_custom_header_and_footer/comment_1_e82dbfef77ff222a7fa07aab0a19fb18._comment [new file with mode: 0644]
doc/forum/Anyone_mirroring_ikiwiki_inline_feed_to_identi.ca__63__.mdwn [new file with mode: 0644]
doc/forum/Anyone_mirroring_ikiwiki_inline_feed_to_identi.ca__63__/comment_1_8a5acbb6234104b607c8c4cf16124ae4._comment [new file with mode: 0644]
doc/forum/Anyone_mirroring_ikiwiki_inline_feed_to_identi.ca__63__/comment_2_155e5823860a91989647ede8b5c9224a._comment [new file with mode: 0644]
doc/forum/Anyone_mirroring_ikiwiki_inline_feed_to_identi.ca__63__/comment_3_317f1202a3da1bfc845d4becbac4bba8._comment [new file with mode: 0644]
doc/forum/Attachment_and_sub-directory.mdwn [new file with mode: 0644]
doc/forum/Background_picture_and_css.mdwn [new file with mode: 0644]
doc/forum/CGI_script_and_HTTPS.mdwn [new file with mode: 0644]
doc/forum/CGI_script_and_HTTPS/comment_1_3f8ef438ca7de11635d4e40080e7baa9._comment [new file with mode: 0644]
doc/forum/Calendar:_listing_multiple_entries_per_day.mdwn
doc/forum/Calendar:_listing_multiple_entries_per_day/comment_5_de545ebb6376066674ef2aaae4757b9c._comment [new file with mode: 0644]
doc/forum/Can_I_have_different_favicons_for_each_folder__63__/comment_2_b8ccd3c29249eca73766f567bce12569._comment [new file with mode: 0644]
doc/forum/Can__39__t_call_method___34__distribution__34___on_an_undefined_value_at_FirstTime.pm.html [new file with mode: 0644]
doc/forum/Can_ikiwiki_be_configured_as_multi_user_blog__63__.mdwn [new file with mode: 0644]
doc/forum/Can_ikiwiki_be_configured_as_multi_user_blog__63__/comment_1_8e34b10699bed1b53b6c929ed1e9f19c._comment [new file with mode: 0644]
doc/forum/Can_ikiwiki_be_configured_as_multi_user_blog__63__/comment_2_6083e16f72e12c03bdf739b84bd2f352._comment [new file with mode: 0644]
doc/forum/Can_not_advance_past_first_page_of_results_using_search_plugin.mdwn [new file with mode: 0644]
doc/forum/Can_someone_update_ikiwki_in_Macports__63__.mdwn [new file with mode: 0644]
doc/forum/Can_someone_update_ikiwki_in_Macports__63__/comment_1_87365ded9b202607d6431daf4e76e3c1._comment [new file with mode: 0644]
doc/forum/Cannot_write_to_commitlock.mdwn
doc/forum/Commiting_all_moderated_comments_into_special_branch__63__/comment_1_8403e8ff9c5c8dddb6d744632322f7bc._comment [new file with mode: 0644]
doc/forum/Dot_CGI_pointing_to_localhost._What_happened__63__.mdwn [new file with mode: 0644]
doc/forum/Dot_CGI_pointing_to_localhost._What_happened__63__/comment_1_cbab9b95923124b39cfccf5d2e88070c._comment [new file with mode: 0644]
doc/forum/Email_notifications_for_comment_moderation.mdwn [new file with mode: 0644]
doc/forum/Email_notifications_for_comment_moderation/comment_1_668bf6a21310dcc8b882bc60a130ba06._comment [new file with mode: 0644]
doc/forum/Empty_sha1sum_messages.mdwn [new file with mode: 0644]
doc/forum/Empty_sha1sum_messages/comment_1_b260b5e6b4c4f4c203b01183fee9fd69._comment [new file with mode: 0644]
doc/forum/Empty_sha1sum_messages/comment_2_d6a47838a3c81d0a75e6fc22e786c976._comment [new file with mode: 0644]
doc/forum/Error:_CGI::tmpFileName_failed_to_return_the_uploaded_file_name.mdwn [new file with mode: 0644]
doc/forum/Error:_CGI::tmpFileName_failed_to_return_the_uploaded_file_name/comment_1_66c321b9eb618d20872cee7d6ca9e44c._comment [new file with mode: 0644]
doc/forum/Error:_CGI::tmpFileName_failed_to_return_the_uploaded_file_name/comment_2_80296d67c7f1dd75b56b85c14f5efa3b._comment [new file with mode: 0644]
doc/forum/Error:___34__do__34___parameter_missing.mdwn [new file with mode: 0644]
doc/forum/Error:___34__do__34___parameter_missing/comment_1_3a51c303ba1670f1567f323349b53837._comment [new file with mode: 0644]
doc/forum/Error:___34__do__34___parameter_missing/comment_2_c5f24a8c4d2de0267cf0de1908480e82._comment [new file with mode: 0644]
doc/forum/Error___34__is_locked_and_cannot_be_edited__34__.mdwn [new file with mode: 0644]
doc/forum/Error___34__is_locked_and_cannot_be_edited__34__/comment_1_dc99a921813d4f8adf797a900ee0a2c1._comment [new file with mode: 0644]
doc/forum/Error___34__is_locked_and_cannot_be_edited__34__/comment_2_48daf77f097ed94bf78cf97b0c027129._comment [new file with mode: 0644]
doc/forum/Everyone_can_remove_comments.mdwn [new file with mode: 0644]
doc/forum/Export_images_when_building_the_wiki.mdwn [new file with mode: 0644]
doc/forum/Export_images_when_building_the_wiki/comment_1_f7328be9b201f3eea6b90c269781fd0b._comment [new file with mode: 0644]
doc/forum/Export_images_when_building_the_wiki/comment_2_99a592c8ff9d2c2094132edd27356922._comment [new file with mode: 0644]
doc/forum/Export_images_when_building_the_wiki/comment_3_7f5a1ef639453c83748405d2b3b0b880._comment [new file with mode: 0644]
doc/forum/Export_images_when_building_the_wiki/comment_4_bd3b37fbee54f1bf510ef5fc6ba27e55._comment [new file with mode: 0644]
doc/forum/File_wiki.setup.mdwn [new file with mode: 0644]
doc/forum/Force_rebuild_of_page_using_some_plugin.mdwn [new file with mode: 0644]
doc/forum/Formatting_algorithms.mdwn [new file with mode: 0644]
doc/forum/Forward_slashes_being_escaped_as_252F/comment_1_7702cf6d354ab600d6643b075b9f09da._comment [new file with mode: 0644]
doc/forum/Google_searches_of_ikiwiki.info_are_broken._:__40__.mdwn [new file with mode: 0644]
doc/forum/How_can_I_invert_the_banned__95__user_check__63__.mdwn [new file with mode: 0644]
doc/forum/How_can_I_prevent_spam__63__.mdwn [new file with mode: 0644]
doc/forum/How_can_I_prevent_spam__63__/comment_1_fd26fb7f1569e8c44ba8262794f938db._comment [new file with mode: 0644]
doc/forum/How_can_I_prevent_spam__63__/comment_2_d098124f005976ee815d25c883bc9106._comment [new file with mode: 0644]
doc/forum/How_can_I_prevent_spam__63__/comment_3_deb434d01aaefa18d2791e48d6c824ae._comment [new file with mode: 0644]
doc/forum/How_do_I_enable_OpenID__63__.mdwn [new file with mode: 0644]
doc/forum/How_to_add_additional_links_to_the_gray_horizontable_bar_under_page_title__63__.mdwn [new file with mode: 0644]
doc/forum/How_to_add_additional_links_to_the_gray_horizontable_bar_under_page_title__63__/comment_1_f2e52d38f60888c7d5142de853123540._comment [new file with mode: 0644]
doc/forum/How_to_add_link_to_previous_and_next_blog_on_blog_pages__63__.mdwn [new file with mode: 0644]
doc/forum/How_to_add_link_to_previous_and_next_blog_on_blog_pages__63__/comment_1_aad510f45be505efaabcb6fb860665a4._comment [new file with mode: 0644]
doc/forum/How_to_add_link_to_previous_and_next_blog_on_blog_pages__63__/comment_2_ee65792a5b796caa216f4e7a653fc668._comment [new file with mode: 0644]
doc/forum/How_to_create_a_WikiLink_to_a_page_in_a_subdirectory__63__.mdwn [new file with mode: 0644]
doc/forum/How_to_create_a_WikiLink_to_a_page_in_a_subdirectory__63__/comment_1_d20ee1d8d7a3e77a445f8b887e807119._comment [new file with mode: 0644]
doc/forum/How_to_disable___34__Add_a_new_post_titled:__34___submission_form__63__.mdwn [new file with mode: 0644]
doc/forum/How_to_disable___34__Add_a_new_post_titled:__34___submission_form__63__/comment_1_3dfa9ac6473d0d5ebc9d99ec39e96216._comment [new file with mode: 0644]
doc/forum/How_to_generate_blog_archive_pages_in___47__blog_subdir_but_not_ikiwiki_root_path__63__.mdwn [new file with mode: 0644]
doc/forum/How_to_inline_a_page_from_another_git_repository.mdwn [new file with mode: 0644]
doc/forum/How_to_properly_create_--_in_a_wiki_--____39__page__47__index.html__39___files.mdwn [new file with mode: 0644]
doc/forum/How_to_properly_create_--_in_a_wiki_--____39__page__47__index.html__39___files/comment_1_d9ee358ded5d5307ba73a8c11f81549d._comment [new file with mode: 0644]
doc/forum/How_to_remove_the_linebreak_in_license.mdwn [new file with mode: 0644]
doc/forum/How_to_rename_all_markdown_files_from___42__.mdwn_to___42__.md__63__.mdwn [new file with mode: 0644]
doc/forum/How_to_rename_all_markdown_files_from___42__.mdwn_to___42__.md__63__/comment_1_c2720ebfe56ad816f241693d9e2e5072._comment [new file with mode: 0644]
doc/forum/How_to_set_the_meta_author_field_from_user_name__63__.mdwn [new file with mode: 0644]
doc/forum/How_to_set_the_meta_author_field_from_user_name__63__/comment_1_0906e1f3eb8b826a7730233b95cb5ddd._comment [new file with mode: 0644]
doc/forum/How_to_set_up_a_page_as_internal__63__.mdwn [new file with mode: 0644]
doc/forum/How_to_set_up_git_repository_hook___63__.mdwn [new file with mode: 0644]
doc/forum/How_to_style_main_sidebar_and_SubPage_sidebar_differently_using_CSS__63__.mdwn [new file with mode: 0644]
doc/forum/How_to_suppress_sidebar_for_a_particular_page__63__.mdwn [new file with mode: 0644]
doc/forum/Howto_add_tag_from_plugin_code.mdwn [new file with mode: 0644]
doc/forum/Howto_add_tag_from_plugin_code/comment_1_c61454825874a6fe1905cb549386deb0._comment [new file with mode: 0644]
doc/forum/I_do_not_know_anything_abut_git.mdwn [new file with mode: 0644]
doc/forum/I_do_not_know_anything_abut_git/comment_1_2efdf8563bcdeba73b11282157aba72d._comment [new file with mode: 0644]
doc/forum/I_do_not_know_anything_abut_git/comment_2_3dd0fa0612a5fac785cc7d5ea23d42a5._comment [new file with mode: 0644]
doc/forum/Ikiwiki_themes_for_mobile_devices__63__.mdwn [new file with mode: 0644]
doc/forum/Include_attachment_in_a_page.mdwn [new file with mode: 0644]
doc/forum/Include_attachment_in_a_page/comment_1_275aad6ca3b2972749b7f6636b130035._comment [new file with mode: 0644]
doc/forum/Multiple_urls.mdwn [new file with mode: 0644]
doc/forum/Multiple_urls/comment_1_e4c1256346d5a421161c20e344d8bada._comment [new file with mode: 0644]
doc/forum/Need_something_more_powerful_than_Exclude/comment_5_39b01857f7e0b388a6e7a3c1cf5388d5._comment [new file with mode: 0644]
doc/forum/Need_something_more_powerful_than_Exclude/comment_6_1dccdfebad31446200213a2cae25f0e2._comment [new file with mode: 0644]
doc/forum/Parent_Links_all_link_to_root.mdwn [new file with mode: 0644]
doc/forum/Parent_Links_all_link_to_root/comment_1_4b5ed25cceb7740f64ee08aba00a1d91._comment [new file with mode: 0644]
doc/forum/Problem_with_gitweb/comment_3_6a5b96f7e0d6b169c090e3df7281d938._comment [new file with mode: 0644]
doc/forum/Problem_with_gitweb/comment_5_8a79b879205bd265d54e30f0eee2ac63._comment [new file with mode: 0644]
doc/forum/Problem_with_local_git_commit.mdwn [new file with mode: 0644]
doc/forum/Refresh_or_recreate_style.css__63__.mdwn [new file with mode: 0644]
doc/forum/Refresh_or_recreate_style.css__63__/comment_1_3274be931d0b543c7f7cf641810817aa._comment [new file with mode: 0644]
doc/forum/Remove_tags_and_backlinks_on_particular_pages__63__.mdwn [new file with mode: 0644]
doc/forum/Right-to-left_support.mdwn [new file with mode: 0644]
doc/forum/Right-to-left_support/comment_1_5b2bf4d037ae8db940296e6f58884927._comment [new file with mode: 0644]
doc/forum/See_rendered_old_revisions_via_pagehistory.mdwn [new file with mode: 0644]
doc/forum/Setting_http__95__proxy.mdwn [new file with mode: 0644]
doc/forum/Setting_http__95__proxy/comment_1_350a7c4834c9f422e107b646cdbae3b0._comment [new file with mode: 0644]
doc/forum/Slow_ikiwiki_after_first_run.mdwn [new file with mode: 0644]
doc/forum/Spaces_in_URLs.mdwn [new file with mode: 0644]
doc/forum/Template_variables.mdwn [new file with mode: 0644]
doc/forum/Template_variables/comment_1_6a2ab9450dbfb8c4ef78e7af2a1b51eb._comment [new file with mode: 0644]
doc/forum/Template_variables/comment_2_9b366736171e45d5afd8247ff38501d1._comment [new file with mode: 0644]
doc/forum/Template_variables/comment_3_727f8a407dc57e4abf48cdcec4ead666._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_8_098bb7a3112751a7e6167483dde626bb._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_9_fbf403255c38da93caa5b98589fbb285._comment [new file with mode: 0644]
doc/forum/Trail_plugin_links_with_Actiontabs_theme.mdwn [new file with mode: 0644]
doc/forum/Translating_ikiwiki_interface.mdwn [new file with mode: 0644]
doc/forum/Using_reverse_proxy__59___base_URL_is_http_instead_of_https.mdwn [new file with mode: 0644]
doc/forum/Using_reverse_proxy__59___base_URL_is_http_instead_of_https/comment_1_ef4be9e70bd6d8c970fd8982f525d2d0._comment [new file with mode: 0644]
doc/forum/Using_reverse_proxy__59___base_URL_is_http_instead_of_https/comment_2_00fee67cc30b7c337710b37c27216a68._comment [new file with mode: 0644]
doc/forum/Using_reverse_proxy__59___base_URL_is_http_instead_of_https/comment_3_f402fb426e0460ce927b7847246f699f._comment [new file with mode: 0644]
doc/forum/Using_reverse_proxy__59___base_URL_is_http_instead_of_https/comment_4_db726bc81ec5feac76d17ea81f0f80a5._comment [new file with mode: 0644]
doc/forum/Using_reverse_proxy__59___base_URL_is_http_instead_of_https/comment_5_674f56100c0682eba36cc5327fbdae4a._comment [new file with mode: 0644]
doc/forum/What__39__s_the_difference_between_tag_and_taglink__63__.mdwn [new file with mode: 0644]
doc/forum/What__39__s_the_difference_between_tag_and_taglink__63__/comment_1_b3553d65d12af4c4a87f1f66f961c8d9._comment [new file with mode: 0644]
doc/forum/When_do_tags_like_a__47__b_get_listed_as_a__47__b_and_not_only_b__63__.mdwn [new file with mode: 0644]
doc/forum/When_do_tags_like_a__47__b_get_listed_as_a__47__b_and_not_only_b__63__/comment_1_cd5ea3aac8a59793ece5bf01a6190b53._comment [new file with mode: 0644]
doc/forum/Xapian_search:_empty_postlist_table/comment_4_40479ac2cfbca609f5f423e539a20ee0._comment [new file with mode: 0644]
doc/forum/Xapian_search:_empty_postlist_table/comment_5_397443138da276e11c2e9b9fa7b51406._comment [new file with mode: 0644]
doc/forum/Xapian_search:_empty_postlist_table/comment_6_3cd94b9a141ebbf96fcba4ebe99e1453._comment [new file with mode: 0644]
doc/forum/Your_local_changes_to_the_following_files_would_be_overwritten_by_merge:.mdwn [new file with mode: 0644]
doc/forum/Your_local_changes_to_the_following_files_would_be_overwritten_by_merge:/comment_1_2223c8b463b22a9dab53b71c01b67209._comment [new file with mode: 0644]
doc/forum/Your_local_changes_to_the_following_files_would_be_overwritten_by_merge:/comment_2_2466ce4303f5b8145bdfae23b6dbddda._comment [new file with mode: 0644]
doc/forum/__34__Error:_cannot_decode_string_with_wide_characters__34___on_Mageia_Linux_x86-64_Cauldron.mdwn [new file with mode: 0644]
doc/forum/__34__Error:_cannot_decode_string_with_wide_characters__34___on_Mageia_Linux_x86-64_Cauldron/comment_1_abf7ec7c378ab0908685d72d159e9fd2._comment [new file with mode: 0644]
doc/forum/access_restrictions:_for_extranet.mdwn [new file with mode: 0644]
doc/forum/access_restrictions:_for_extranet/comment_1_a0666c3c15661fb0fff70f313cd0d47d._comment [new file with mode: 0644]
doc/forum/access_restrictions:_for_extranet/comment_2_563040aa099c9366dc5701eb4bc9c10d._comment [new file with mode: 0644]
doc/forum/blocked_by_blogspam.mdwn [new file with mode: 0644]
doc/forum/build_error:_Cannot_decode_string_with_wide_characters/comment_3_d62173d0ae220ab7b063631952856587._comment [new file with mode: 0644]
doc/forum/build_error:_Cannot_decode_string_with_wide_characters/comment_4_d5d0174e09a94359c23fd9c006a22bbc._comment [new file with mode: 0644]
doc/forum/build_error:_Cannot_decode_string_with_wide_characters/comment_5_e652027a8f90ebef6f21613b5784ded2._comment [new file with mode: 0644]
doc/forum/build_error:_Cannot_decode_string_with_wide_characters/comment_6_ba76f7f8ef46fb58d36fb2cda4b242ff._comment [new file with mode: 0644]
doc/forum/build_error:_Cannot_decode_string_with_wide_characters/comment_7_e4f7c1da09571085070275e12c09b12f._comment [new file with mode: 0644]
doc/forum/converting_binary_files.mdwn [new file with mode: 0644]
doc/forum/copyright_and_license_template_variables___40__where_are_they_set__63____41__.mdwn [new file with mode: 0644]
doc/forum/creating_redirect_index.mdwn__63___.mdwn [new file with mode: 0644]
doc/forum/creating_redirect_index.mdwn__63___/comment_1_6d609c3a2ba50da4129e15b60362c6d9._comment [new file with mode: 0644]
doc/forum/cutpaste.pm_not_only_file-local.mdwn
doc/forum/debconf13_ikiwiki_bof.mdwn [new file with mode: 0644]
doc/forum/default_paths._Are_there_better_defaults__63__.mdwn [new file with mode: 0644]
doc/forum/default_paths._Are_there_better_defaults__63__/comment_1_3db622152a8ab53841cc13280ca31da4._comment [new file with mode: 0644]
doc/forum/download_links_for_attachments.mdwn [new file with mode: 0644]
doc/forum/download_links_for_attachments/comment_1_19fe525281e38d3bbe45b31248ca7880._comment [new file with mode: 0644]
doc/forum/download_links_for_attachments/comment_2_06231e4ddc271260e51bc371637540de._comment [new file with mode: 0644]
doc/forum/download_links_for_attachments/comment_3_64d12928bc24c48d6f0b5fbb2dfd8f6d._comment [new file with mode: 0644]
doc/forum/download_links_for_attachments/comment_4_7612923064284646c2ed59e2cd52845d._comment [new file with mode: 0644]
doc/forum/formating:_how_to_align_text_to_the_right.mdwn
doc/forum/google_openid_broken__63__.mdwn
doc/forum/how_could_i_generate_a_flat_textfile_from_metadata_in_multiple_pages.mdwn [new file with mode: 0644]
doc/forum/how_to_have_a_plugin_delete_a_file.mdwn [new file with mode: 0644]
doc/forum/how_to_have_a_plugin_delete_a_file/comment_1_061c8bca174f7155d4065dd200c0c8db._comment [new file with mode: 0644]
doc/forum/how_to_have_a_plugin_delete_a_file/comment_2_864a20147885642ad3bbcf8400d8ee46._comment [new file with mode: 0644]
doc/forum/how_to_login_as_admin/comment_1_295e130c6400a2d7336758e82bcd5647._comment [new file with mode: 0644]
doc/forum/howto_install_the_pagedown_plugin.mdwn [new file with mode: 0644]
doc/forum/howto_install_the_pagedown_plugin/comment_1_158fbcef24d20920c40968da8f10442a._comment [new file with mode: 0644]
doc/forum/ikiwiki.info_blogspam_problem.mdwn [new file with mode: 0644]
doc/forum/ikiwiki.info_blogspam_problem/comment_1_893a2f561ead36b531e2d6c887e6aaba._comment [new file with mode: 0644]
doc/forum/ikiwiki_+_mathjax/comment_4_873adec726e9b70394643ff28094ad39._comment [new file with mode: 0644]
doc/forum/ikiwiki_+_mathjax/comment_5_f601e3f1c78345e4d80ec3ce62784e6f._comment [new file with mode: 0644]
doc/forum/ikiwiki_+_mathjax/comment_6_305fddcd1e264b92d7ed7153ba27ce07._comment [new file with mode: 0644]
doc/forum/ikiwiki_--setup_creates_tmp__47___directory_in_destdir.mdwn [new file with mode: 0644]
doc/forum/ikiwiki_and_big_files/comment_1_df8a9f4249af435cc335f77768a3278d._comment [new file with mode: 0644]
doc/forum/ikiwiki_and_big_files/comment_2_2d996f1124aedc10f345139c3d8b11df._comment [new file with mode: 0644]
doc/forum/ikiwiki_and_big_files/comment_3_dfbd38e2b457ea3c4f70266dbf8fbeab._comment [new file with mode: 0644]
doc/forum/ikiwiki_and_big_files/comment_4_fd8a0cb8872d9de55465e8db93d67619._comment [new file with mode: 0644]
doc/forum/ikiwiki_and_big_files/comment_5_3532b14ee10775dac634792c75a30e89._comment [new file with mode: 0644]
doc/forum/ikiwiki_not_usable_when_installed_with_toast___40__because_of_symlinks__41__.mdwn [new file with mode: 0644]
doc/forum/ikiwiki_with_album___38___underlay_plugins.mdwn [new file with mode: 0644]
doc/forum/ikiwiki_with_album___38___underlay_plugins/comment_1_ea4faa2b5bb9216c0a0427f2071584ef._comment [new file with mode: 0644]
doc/forum/ikiwiki_with_album___38___underlay_plugins/comment_2_f38b4f9191d42c3d1a9651820b36a2ee._comment [new file with mode: 0644]
doc/forum/ikiwiki_with_album___38___underlay_plugins/comment_3_46d4c9cecc5d9a19693966820dd18380._comment [new file with mode: 0644]
doc/forum/inject__95__preprocess__95__tag.mdwn [new file with mode: 0644]
doc/forum/missing_pages_redirected_to_search-SOLVED/comment_1_aa03c337b31d7acb95761eb51caab1ef._comment [new file with mode: 0644]
doc/forum/po_plugin_doesn__39__t_create_po_files___40__only_pot__41__..mdwn [new file with mode: 0644]
doc/forum/possible_utf-8_problem__63__.mdwn [new file with mode: 0644]
doc/forum/problem_with_git_after_a_commit_of_ikiwiki.mdwn [new file with mode: 0644]
doc/forum/problem_with_git_after_a_commit_of_ikiwiki/comment_1_2b9986717769419a8ae0f730c36b7e65._comment [new file with mode: 0644]
doc/forum/search_plugin_questions.mdwn [new file with mode: 0644]
doc/forum/search_plugin_questions/comment_1_d634b00ab758c9fbc43528b9a3176257._comment [new file with mode: 0644]
doc/forum/search_plugin_questions/comment_2_b731c664d314afd1d45485716f39ac3b._comment [new file with mode: 0644]
doc/forum/web_service_API__44___fastcgi_support.mdwn
doc/forum/what_generates_user_name_for_recent_changes_page__63__.mdwn [new file with mode: 0644]
doc/forum/what_generates_user_name_for_recent_changes_page__63__/comment_1_e90085a9d61cdf623c20dfe57005472e._comment [new file with mode: 0644]
doc/forum/which_file_ikiwiki_--setup_is_processing_right_now__63__.mdwn [new file with mode: 0644]
doc/forum/which_file_ikiwiki_--setup_is_processing_right_now__63__/comment_1_4f52f8fc083982bd5a572742cf35c74f._comment [new file with mode: 0644]
doc/forum/wmd_editor_double_preview/comment_1_0d3acf67f3c35f8c4156228f96dcd975._comment [moved from doc/forum/Problem_with_gitweb/comment_1_c505be6a13651c397fb803dd4117acce._comment with 75% similarity]
doc/git.mdwn
doc/ikiwiki-calendar/discussion.mdwn
doc/ikiwiki-update-wikilist.mdwn
doc/ikiwiki/directive/edittemplate.mdwn
doc/ikiwiki/directive/edittemplate/discussion.mdwn [new file with mode: 0644]
doc/ikiwiki/directive/format.mdwn
doc/ikiwiki/directive/graph.mdwn
doc/ikiwiki/directive/graph/discussion.mdwn [new file with mode: 0644]
doc/ikiwiki/directive/img/discussion.mdwn
doc/ikiwiki/directive/inline.mdwn
doc/ikiwiki/directive/map/discussion.mdwn
doc/ikiwiki/directive/meta.mdwn
doc/ikiwiki/directive/meta/discussion.mdwn [new file with mode: 0644]
doc/ikiwiki/directive/osm.mdwn
doc/ikiwiki/directive/osm/discussion.mdwn [new file with mode: 0644]
doc/ikiwiki/directive/poll.mdwn
doc/ikiwiki/directive/sidebar/discussion.mdwn [new file with mode: 0644]
doc/ikiwiki/directive/table.mdwn
doc/ikiwiki/directive/tag/discussion.mdwn [new file with mode: 0644]
doc/ikiwiki/directive/toggle/discussion.mdwn [new file with mode: 0644]
doc/ikiwiki/directive/trailitem.mdwn [moved from doc/plugins/contrib/ikiwiki/directive/trailitem.mdwn with 75% similarity]
doc/ikiwiki/directive/trailitems.mdwn [moved from doc/plugins/contrib/ikiwiki/directive/trailitems.mdwn with 72% similarity]
doc/ikiwiki/directive/traillink.mdwn [moved from doc/plugins/contrib/ikiwiki/directive/traillink.mdwn with 93% similarity]
doc/ikiwiki/directive/trailoptions.mdwn [moved from doc/plugins/contrib/ikiwiki/directive/trailoptions.mdwn with 88% similarity]
doc/ikiwiki/markdown/discussion.mdwn [new file with mode: 0644]
doc/ikiwiki/pagespec.mdwn
doc/ikiwikiusers.mdwn
doc/index.mdwn
doc/install.mdwn
doc/logo.mdwn
doc/news/cia.mdwn [deleted file]
doc/news/openid.mdwn
doc/news/openid/discussion.mdwn
doc/news/version_3.20111107.mdwn [deleted file]
doc/news/version_3.20111229.mdwn [deleted file]
doc/news/version_3.20120109.mdwn [deleted file]
doc/news/version_3.20120115.mdwn [deleted file]
doc/news/version_3.20120202.mdwn [deleted file]
doc/news/version_3.20140125.mdwn [new file with mode: 0644]
doc/news/version_3.20140227.mdwn [new file with mode: 0644]
doc/news/version_3.20140613.mdwn [new file with mode: 0644]
doc/news/version_3.20140815.mdwn [new file with mode: 0644]
doc/news/version_3.20140831.mdwn [new file with mode: 0644]
doc/pagehistory.mdwn
doc/plugins/anonok.mdwn
doc/plugins/blogspam.mdwn
doc/plugins/camelcase.mdwn
doc/plugins/comments.mdwn
doc/plugins/comments/discussion.mdwn
doc/plugins/contrib/addtag.mdwn [new file with mode: 0644]
doc/plugins/contrib/album.mdwn
doc/plugins/contrib/album/discussion.mdwn
doc/plugins/contrib/asymptote.mdwn [new file with mode: 0644]
doc/plugins/contrib/asymptote/ikiwiki/directive/asymptote.mdwn [new file with mode: 0644]
doc/plugins/contrib/cowsay.mdwn [new file with mode: 0644]
doc/plugins/contrib/created_in_future.mdwn [new file with mode: 0644]
doc/plugins/contrib/created_in_future/discussion.mdwn [new file with mode: 0644]
doc/plugins/contrib/datetime_cmp.mdwn [new file with mode: 0644]
doc/plugins/contrib/default_content_for___42__copyright__42___and___42__license__42__/discussion.mdwn [new file with mode: 0644]
doc/plugins/contrib/getfield/discussion.mdwn
doc/plugins/contrib/googlemaps.mdwn
doc/plugins/contrib/ikiwiki/directive/trailinline.mdwn [deleted file]
doc/plugins/contrib/ikiwiki/directive/ymlfront/discussion.mdwn [new file with mode: 0644]
doc/plugins/contrib/irclog.mdwn [new file with mode: 0644]
doc/plugins/contrib/jscalendar.mdwn [new file with mode: 0644]
doc/plugins/contrib/livefyre.mdwn [new file with mode: 0644]
doc/plugins/contrib/localfavicon.mdwn [new file with mode: 0644]
doc/plugins/contrib/mathjax.mdwn [new file with mode: 0644]
doc/plugins/contrib/mediawiki/discussion.mdwn
doc/plugins/contrib/monthcalendar.mdwn [new file with mode: 0644]
doc/plugins/contrib/navbar.mdwn
doc/plugins/contrib/nimble.mdwn [new file with mode: 0644]
doc/plugins/contrib/pandoc.mdwn
doc/plugins/contrib/parenttag.mdwn [new file with mode: 0644]
doc/plugins/contrib/poetry.mdwn [new file with mode: 0644]
doc/plugins/contrib/purge.mdwn [new file with mode: 0644]
doc/plugins/contrib/report/discussion.mdwn
doc/plugins/contrib/sidebar2.mdwn [new file with mode: 0644]
doc/plugins/contrib/syntax.mdwn
doc/plugins/contrib/taskreport.mdwn [new file with mode: 0644]
doc/plugins/contrib/todo.mdwn [new file with mode: 0644]
doc/plugins/contrib/trail.mdwn [deleted file]
doc/plugins/contrib/wordcount.mdwn [new file with mode: 0644]
doc/plugins/google.mdwn
doc/plugins/headinganchors/discussion.mdwn
doc/plugins/highlight/discussion.mdwn
doc/plugins/httpauth.mdwn
doc/plugins/lockedit.mdwn
doc/plugins/mirrorlist.mdwn
doc/plugins/moderatedcomments.mdwn
doc/plugins/notifyemail.mdwn [new file with mode: 0644]
doc/plugins/notifyemail/discussion.mdwn [new file with mode: 0644]
doc/plugins/osm.mdwn
doc/plugins/osm/discussion.mdwn [new file with mode: 0644]
doc/plugins/otl.mdwn
doc/plugins/pinger/discussion.mdwn [new file with mode: 0644]
doc/plugins/po.mdwn
doc/plugins/poll/discussion.mdwn [new file with mode: 0644]
doc/plugins/recentchangesdiff.mdwn
doc/plugins/recentchangesdiff/discussion.mdwn [new file with mode: 0644]
doc/plugins/search.mdwn
doc/plugins/sidebar/discussion.mdwn
doc/plugins/teximg.mdwn
doc/plugins/theme.mdwn
doc/plugins/toc/discussion.mdwn
doc/plugins/trail.mdwn [new file with mode: 0644]
doc/plugins/trail/discussion.mdwn [new file with mode: 0644]
doc/plugins/transient.mdwn
doc/plugins/type/auth.mdwn
doc/plugins/type/bundle.mdwn
doc/plugins/type/chrome.mdwn
doc/plugins/type/comments.mdwn [new file with mode: 0644]
doc/plugins/type/core.mdwn
doc/plugins/type/date.mdwn
doc/plugins/type/format.mdwn
doc/plugins/type/fun.mdwn
doc/plugins/type/html.mdwn
doc/plugins/type/link.mdwn
doc/plugins/type/meta.mdwn
doc/plugins/type/slow.mdwn
doc/plugins/type/special-purpose.mdwn
doc/plugins/type/tags.mdwn
doc/plugins/type/web.mdwn
doc/plugins/type/widget.mdwn
doc/plugins/websetup.mdwn
doc/plugins/wmd.mdwn
doc/plugins/wmd/discussion.mdwn
doc/plugins/write.mdwn
doc/plugins/write/names.mdwn [new file with mode: 0644]
doc/plugins/write/tutorial.mdwn
doc/plugins/write/tutorial/discussion.mdwn [new file with mode: 0644]
doc/podcast.mdwn [new file with mode: 0644]
doc/rcs/cvs/discussion.mdwn
doc/rcs/git.mdwn
doc/rcs/git/wiki_edit_flow.svg
doc/roadmap.mdwn
doc/sandbox.mdwn
doc/sandbox/Fantasia.mdwn [deleted file]
doc/sandbox/Hey__33__.mdwn [deleted file]
doc/sandbox/Just_a_new_post_with_non-latin_characters:_日本語.mdwn [deleted file]
doc/sandbox/Mooooo.mdwn [deleted file]
doc/sandbox/NewPage.mdwn [new file with mode: 0644]
doc/sandbox/New_blog_entry.mdwn [new file with mode: 0644]
doc/sandbox/Nur_so..mdwn [deleted file]
doc/sandbox/Nyus_of_se_däi.mdwn [deleted file]
doc/sandbox/Test.py [new file with mode: 0644]
doc/sandbox/Test_it.mdwn [deleted file]
doc/sandbox/Testing_blog_entry.mdwn [deleted file]
doc/sandbox/adding_a_new_post.mdwn [deleted file]
doc/sandbox/ainvyu.mdwn [deleted file]
doc/sandbox/bullet_list_and_code_test.mdwn [deleted file]
doc/sandbox/danc.mdwn [deleted file]
doc/sandbox/dateenumeration.mdwn [deleted file]
doc/sandbox/discussion.mdwn [new file with mode: 0644]
doc/sandbox/hey.mdwn [deleted file]
doc/sandbox/new__95__test.mdwn [new file with mode: 0644]
doc/sandbox/plop.mdwn [deleted file]
doc/sandbox/revert_me.mdwn [deleted file]
doc/sandbox/sandbocen.mdwn [deleted file]
doc/sandbox/sidebar.mdwn [deleted file]
doc/sandbox/testostereone.mdwn [new file with mode: 0644]
doc/security.mdwn
doc/setup.mdwn
doc/setup/byhand.mdwn
doc/shortcuts.mdwn
doc/soc/application.mdwn
doc/spam_fighting.mdwn [new file with mode: 0644]
doc/style.css
doc/templates.mdwn
doc/templates/discussion.mdwn
doc/templates/gitbranch.mdwn
doc/templates/links.mdwn
doc/theme_market.mdwn
doc/themes.mdwn
doc/themes/discussion.mdwn
doc/themes/monochrome_small.png [new file with mode: 0644]
doc/tipjar.mdwn
doc/tips/Adding_Disqus_to_your_wiki.mdwn
doc/tips/DreamHost.mdwn
doc/tips/Git_repository_and_web_server_on_different_hosts.mdwn
doc/tips/Git_repository_and_web_server_on_different_hosts/separate-webserver.svg [new file with mode: 0644]
doc/tips/Hosting_Ikiwiki_and_master_git_repository_on_different_machines.mdwn [new file with mode: 0644]
doc/tips/Hosting_Ikiwiki_and_master_git_repository_on_different_machines/discussion.mdwn [new file with mode: 0644]
doc/tips/Hosting_Ikiwiki_and_master_git_repository_on_different_machines/separate-web-git-servers.svg [new file with mode: 0644]
doc/tips/Ikiwiki_with_git-annex__44___the_album_and_the_underlay_plugins.mdwn [new file with mode: 0644]
doc/tips/Importing_posts_from_Wordpress/discussion.mdwn
doc/tips/JavaScript_to_add_index.html_to_file:_links/discussion.mdwn [new file with mode: 0644]
doc/tips/Make_calendar_start_week_on_Monday/discussion.mdwn [new file with mode: 0644]
doc/tips/Movable_Type_to_ikiwiki.mdwn [new file with mode: 0644]
doc/tips/Right-to-left___40__RTL__41___page_text.mdwn [new file with mode: 0644]
doc/tips/convert_MoinMoin_and_TWiki_to_ikiwiki.mdwn [deleted file]
doc/tips/convert_blogger_blogs_to_ikiwiki.mdwn
doc/tips/convert_mediawiki_to_ikiwiki.mdwn
doc/tips/convert_moinmoin_to_ikiwiki.mdwn [new file with mode: 0644]
doc/tips/convert_moinmoin_to_ikiwiki/discussion.mdwn [new file with mode: 0644]
doc/tips/distributed_wikis.mdwn
doc/tips/distributed_wikis/decentralized_wikis.svg [new file with mode: 0644]
doc/tips/distributed_wikis/discussion.mdwn
doc/tips/distributed_wikis/ping-setup.svg [new file with mode: 0644]
doc/tips/dot_cgi.mdwn
doc/tips/dot_cgi/discussion.mdwn
doc/tips/ikiwiki_on_mac_os_x.mdwn
doc/tips/ikiwiki_on_mac_os_x/discussion.mdwn [new file with mode: 0644]
doc/tips/ikiwiki_via_gopher/discussion.mdwn [new file with mode: 0644]
doc/tips/importing_posts_from_wordpress/ikiwiki-wordpress-import.mdwn
doc/tips/laptop_wiki_with_git.mdwn
doc/tips/mailman_subscription_form.mdwn [new file with mode: 0644]
doc/tips/migrating_podcast_to_ikiwiki.mdwn [new file with mode: 0644]
doc/tips/monitor_page_changes_through_IRC.mdwn [new file with mode: 0644]
doc/tips/optimising_ikiwiki.mdwn
doc/todo/Add_basename_in_edittemplate.mdwn [new file with mode: 0644]
doc/todo/Add_nicer_math_formatting.mdwn
doc/todo/Add_space_before_slash_in_parent_links.mdwn
doc/todo/BTS_integration.mdwn
doc/todo/Calendar:_listing_multiple_entries_per_day_.mdwn [new file with mode: 0644]
doc/todo/Fenced_code_blocks___40__from_GitHub_Flavored_Markdown__41__.mdwn [new file with mode: 0644]
doc/todo/FormattingHelp_should_open_new_window.mdwn [new file with mode: 0644]
doc/todo/Javascript_calendar.mdwn [deleted file]
doc/todo/Option_linktext_for_pagestats_directive.mdwn [new file with mode: 0644]
doc/todo/Protocol_relative_urls_for_stylesheet_linking.mdwn [new file with mode: 0644]
doc/todo/Render_multiple_destinations_from_one_source.mdwn
doc/todo/Restrict_formats_allowed_for_comments.mdwn [new file with mode: 0644]
doc/todo/Restrict_page_viewing.mdwn
doc/todo/Separate_OpenIDs_and_usernames.mdwn
doc/todo/Set_templates_for_whole_sections_of_the_site.mdwn
doc/todo/Support_clipboard_copy__47__paste_of_images.mdwn [new file with mode: 0644]
doc/todo/Track_Markdown_Standardisation_Efforts.mdwn [new file with mode: 0644]
doc/todo/Using_page_titles_in_internal_links.mdwn [new file with mode: 0644]
doc/todo/Zoned_ikiwiki.mdwn [new file with mode: 0644]
doc/todo/__42__forward__42__ing_functionality_for_the_meta_plugin.mdwn
doc/todo/ad-hoc_plugins.mdwn [new file with mode: 0644]
doc/todo/add_remove_to_actionlist.mdwn [new file with mode: 0644]
doc/todo/allow_TMPL__95__LOOP_in_template_directives.mdwn [new file with mode: 0644]
doc/todo/allow_banning_a_user_when_moderating_a_comment.mdwn [new file with mode: 0644]
doc/todo/allow_option_for_requiring_description_when_editing_page.mdwn [new file with mode: 0644]
doc/todo/anti-spam_protection.mdwn
doc/todo/assumes_system_perl.mdwn
doc/todo/attachments.mdwn
doc/todo/auto_publish_expire.mdwn
doc/todo/avatar/discussion.mdwn [new file with mode: 0644]
doc/todo/beef_up_sidebar_to_allow_for_multiple_sidebars.mdwn
doc/todo/bitcoin_URI_scheme.mdwn [new file with mode: 0644]
doc/todo/break_up_page_template_into_subfiles.mdwn [new file with mode: 0644]
doc/todo/bugs-everywhere_integration.mdwn [new file with mode: 0644]
doc/todo/calendar_autocreate.mdwn [new file with mode: 0644]
doc/todo/calendar_with___34__create__34___links.mdwn [new file with mode: 0644]
doc/todo/calendar_with___34__create__34___links/incomplete_patch.pl [new file with mode: 0644]
doc/todo/clear_page_to_delete.mdwn
doc/todo/concatenating_or_compiling_CSS.mdwn [new file with mode: 0644]
doc/todo/custom_location_for_openlayers.mdwn [new file with mode: 0644]
doc/todo/do_not_make_links_backwards.mdwn
doc/todo/document_dependency_influences_in_code.mdwn [new file with mode: 0644]
doc/todo/ease_archivepage_styling.mdwn [new file with mode: 0644]
doc/todo/edittemplate_should_support_uuid__44___date_variables.mdwn [new file with mode: 0644]
doc/todo/etherpad_support.mdwn [new file with mode: 0644]
doc/todo/expose_html_language_and_direction.mdwn [new file with mode: 0644]
doc/todo/fancypodcast.mdwn [new file with mode: 0644]
doc/todo/fancypodcast/discussion.mdwn [new file with mode: 0644]
doc/todo/fastcgi_or_modperl_installation_instructions.mdwn
doc/todo/feed_enhancements_for_inline_pages.mdwn
doc/todo/flexible_relationships_between_pages.mdwn [new file with mode: 0644]
doc/todo/flexible_relationships_between_pages/blocks.pm.mdwn [new file with mode: 0644]
doc/todo/git-annex_support.mdwn [new file with mode: 0644]
doc/todo/git-annex_support/discussion.mdwn [new file with mode: 0644]
doc/todo/headless_git_branches.mdwn
doc/todo/hook_to_detect_markdown_links_to_wiki_pages.mdwn [new file with mode: 0644]
doc/todo/improve_decentralised_wikis_documentation_and_graphics.mdwn [new file with mode: 0644]
doc/todo/improved_mediawiki_support.mdwn [new file with mode: 0644]
doc/todo/inband_acl_data.mdwn [new file with mode: 0644]
doc/todo/inline_directive_should_support_pagination.mdwn [new file with mode: 0644]
doc/todo/inline_postform_autotitles.mdwn
doc/todo/internal_definition_list_support.mdwn
doc/todo/linkbase.mdwn [new file with mode: 0644]
doc/todo/lucene_search_engine.mdwn [new file with mode: 0644]
doc/todo/manpages.mdwn
doc/todo/mdwn_preview.mdwn
doc/todo/mirrorlist_with_per-mirror_usedirs_settings.mdwn
doc/todo/missingparents.pm.mdwn
doc/todo/monochrome_theme.mdwn [new file with mode: 0644]
doc/todo/optimisation_via_git_log.mdwn [new file with mode: 0644]
doc/todo/option_to_send_only_the_diff_in_notifyemail.mdwn [new file with mode: 0644]
doc/todo/org_mode.mdwn
doc/todo/osm__95__optimisations__95__and__95__fixes.mdwn [new file with mode: 0644]
doc/todo/osm_arbitrary_layers.mdwn [new file with mode: 0644]
doc/todo/osm_plugin_GeoJSON_popup_patch.mdwn [new file with mode: 0644]
doc/todo/osm_plugin_icon_patch.mdwn [new file with mode: 0644]
doc/todo/outbound_proxy.mdwn [new file with mode: 0644]
doc/todo/pagedown_plugin/discussion.mdwn [new file with mode: 0644]
doc/todo/pagespec__95__match__95__list_can_result_in_excessive_dependencies.mdwn [new file with mode: 0644]
doc/todo/passwordauth:_sendmail_interface.mdwn
doc/todo/per-page_comment_control.mdwn [new file with mode: 0644]
doc/todo/per_page_ACLs.mdwn [new file with mode: 0644]
doc/todo/pick_a_new_canonical_name_for_equivalent_of_SQL_limit.mdwn [new file with mode: 0644]
doc/todo/please_add_some_table_styles.mdwn [new file with mode: 0644]
doc/todo/po:_better_translation_interface.mdwn
doc/todo/po:_remove_po_files_when_disabling_plugin.mdwn
doc/todo/polltrails.mdwn [new file with mode: 0644]
doc/todo/provide_inline_diffs_in_recentchanges.mdwn
doc/todo/publishing_in_the_future.mdwn [new file with mode: 0644]
doc/todo/recentchanges_feed_with_comment.mdwn [new file with mode: 0644]
doc/todo/send_only_one_mail_per_page_in_notifyemail.mdwn [new file with mode: 0644]
doc/todo/should_use_a_standard_encoding_for_utf_chars_in_filenames.mdwn
doc/todo/sort_parameter_for_map_plugin_and_directive.mdwn
doc/todo/sort_parameter_for_map_plugin_and_directive/incomplete_patch.pl.pl [new file with mode: 0644]
doc/todo/sort_parameter_for_map_plugin_and_directive/python_algorithms.py [new file with mode: 0644]
doc/todo/sortable_tables.mdwn [new file with mode: 0644]
doc/todo/support_linking_to_cgit.mdwn [new file with mode: 0644]
doc/todo/support_multi-row_table_headers.mdwn [new file with mode: 0644]
doc/todo/tagging_with_a_publication_date.mdwn
doc/todo/toc-with-human-readable-anchors.mdwn [new file with mode: 0644]
doc/todo/translation_links.mdwn [new file with mode: 0644]
doc/todo/upload__95__figure.mdwn [new file with mode: 0644]
doc/todo/usedirs__95__redir_proposed_additional_module.mdwn [new file with mode: 0644]
doc/todo/vCard_rendering.mdwn [new file with mode: 0644]
doc/todo/wikitrails.mdwn
doc/todo/wikiwyg.mdwn
doc/todo/wikiwyg/discussion.mdwn
doc/todo/xapian_omega_same_lang_when_indexing_and_searching.mdwn [new file with mode: 0644]
doc/translation/discussion.mdwn
doc/users/GiuseppeBilotta.mdwn [new file with mode: 0644]
doc/users/JoshBBall.mdwn [new file with mode: 0644]
doc/users/LucaCapello.mdwn [new file with mode: 0644]
doc/users/Olea.mdwn [new file with mode: 0644]
doc/users/OscarMorante.mdwn [new file with mode: 0644]
doc/users/Ramsey.mdwn [new file with mode: 0644]
doc/users/RickOwens.mdwn [new file with mode: 0644]
doc/users/acodispo.mdwn [new file with mode: 0644]
doc/users/adamshand.mdwn
doc/users/anarcat.mdwn
doc/users/cbaines.mdwn [new file with mode: 0644]
doc/users/chrysn.mdwn
doc/users/chrysn/interests.mdwn [new file with mode: 0644]
doc/users/fr33domlover.mdwn [new file with mode: 0644]
doc/users/hb/discussion.mdwn
doc/users/holger.mdwn [new file with mode: 0644]
doc/users/ivan_shmakov.mdwn
doc/users/joshtriplett/discussion.mdwn
doc/users/kjs.mdwn [new file with mode: 0644]
doc/users/mathdesc.mdwn [new file with mode: 0644]
doc/users/mhameed.mdwn [new file with mode: 0644]
doc/users/pdurbin.mdwn [new file with mode: 0644]
doc/users/schmonz.mdwn
doc/users/smcv.mdwn
doc/users/smcv/ready.mdwn [new file with mode: 0644]
doc/users/spalax.mdwn [new file with mode: 0644]
doc/users/ssm.mdwn [new file with mode: 0644]
doc/users/svend.mdwn
doc/users/tbm.mdwn [new file with mode: 0644]
doc/users/undx.mdwn [new file with mode: 0644]
doc/users/wiebel.mdwn [new file with mode: 0644]
doc/wishlist/watched_pages.mdwn [new file with mode: 0644]
icons/aol.svg [new file with mode: 0644]
icons/livejournal.svg [new file with mode: 0644]
icons/verisign.svg [new file with mode: 0644]
ikiwiki-update-wikilist
ikiwiki.spec
plugins/proxy.py [changed mode: 0644->0755]
plugins/rst
po/Makefile
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/vi.po
t/cvs.t
t/git.t
t/index.t
t/inline.t [new file with mode: 0755]
t/map.t [new file with mode: 0755]
t/permalink.t
t/po.t
t/podcast.t [new file with mode: 0755]
t/prune.t [new file with mode: 0755]
t/syntax.t
t/syslog.t [new file with mode: 0644]
t/template_syntax.t
t/tinypodcast/attempted_multiple_enclosures.mdwn [new file with mode: 0644]
t/tinypodcast/fancy.mdwn [new file with mode: 0644]
t/tinypodcast/piano.mp3 [new file with mode: 0644]
t/tinypodcast/pianopost.mdwn [new file with mode: 0644]
t/tinypodcast/scroll.3gp [new file with mode: 0644]
t/tinypodcast/simple.mdwn [new file with mode: 0644]
t/tinypodcast/simplepost.mdwn [new file with mode: 0644]
t/tinypodcast/walter.ogg [new file with mode: 0644]
t/trail.t [new file with mode: 0755]
templates/aggregatepost.tmpl
templates/archivepage.tmpl
templates/atomitem.tmpl
templates/change.tmpl
templates/editcomment.tmpl
templates/editpage.tmpl
templates/inlinepage.tmpl
templates/notifyemail.tmpl [new file with mode: 0644]
templates/page.tmpl
templates/rssitem.tmpl
templates/rsspage.tmpl
templates/trails.tmpl [new file with mode: 0644]
themes/actiontabs/style.css
themes/blueview/style.css
themes/goldtype/style.css
themes/monochrome/gradient.png [new file with mode: 0644]
themes/monochrome/style.css [new file with mode: 0644]
underlays/attachment/ikiwiki/jquery-ui.css [moved from underlays/attachment/ikiwiki/jquery-ui.full.css with 100% similarity]
underlays/attachment/ikiwiki/jquery-ui.js [moved from underlays/attachment/ikiwiki/jquery-ui.full.js with 100% similarity]
underlays/attachment/ikiwiki/jquery.tmpl.js [moved from underlays/attachment/ikiwiki/jquery.tmpl.full.js with 100% similarity]
underlays/jquery/ikiwiki/jquery.js [moved from underlays/jquery/ikiwiki/jquery.full.js with 100% similarity]
underlays/openid-selector/ikiwiki/openid/aol.png [new file with mode: 0644]
underlays/openid-selector/ikiwiki/openid/goa-account-flickr.png [new file with mode: 0644]
underlays/openid-selector/ikiwiki/openid/goa-account-google.png [new file with mode: 0644]
underlays/openid-selector/ikiwiki/openid/goa-account-yahoo.png [new file with mode: 0644]
underlays/openid-selector/ikiwiki/openid/livejournal.png [new file with mode: 0644]
underlays/openid-selector/ikiwiki/openid/openid-jquery.js
underlays/openid-selector/ikiwiki/openid/verisign.png [new file with mode: 0644]
underlays/openid-selector/ikiwiki/openid/wordpress.png [new file with mode: 0644]
underlays/osm/ikiwiki/osm.js

index fe1c3d441cc362d12390c70d8e3c9266f1ac5021..8528fe9bed7336175e4315f610c96a2d6880af6a 100644 (file)
@@ -9,6 +9,8 @@ ikiwiki.out
 ikiwiki-transition.out
 ikiwiki-calendar.out
 pm_to_blib
+/MYMETA.json
+/MYMETA.yml
 *.man
 /po/cover_db
 po/po2wiki_stamp
index 2a83777e6574ec74e9ebb878f0964a88b0118639..49ac9719658496953dc5f32c920e27ee5ba9d20c 100644 (file)
@@ -14,7 +14,7 @@ use vars qw{%config %links %oldlinks %pagemtime %pagectime %pagecase
        %pagestate %wikistate %renderedfiles %oldrenderedfiles
        %pagesources %delpagesources %destsources %depends %depends_simple
        @mass_depends %hooks %forcerebuild %loaded_plugins %typedlinks
-       %oldtypedlinks %autofiles};
+       %oldtypedlinks %autofiles @underlayfiles $lastrev};
 
 use Exporter q{import};
 our @EXPORT = qw(hook debug error htmlpage template template_depends
@@ -22,7 +22,7 @@ our @EXPORT = qw(hook debug error htmlpage template template_depends
        htmllink readfile writefile pagetype srcfile pagename
        displaytime strftime_utf8 will_render gettext ngettext urlto targetpage
        add_underlay pagetitle titlepage linkpage newpagefile
-       inject add_link add_autofile
+       inject add_link add_autofile useragent
        %config %links %pagestate %wikistate %renderedfiles
        %pagesources %destsources %typedlinks);
 our $VERSION = 3.00; # plugin interface version, next is ikiwiki version
@@ -118,6 +118,29 @@ sub getsetup () {
                safe => 0,
                rebuild => 0,
        },
+       cgi_overload_delay => {
+               type => "string",
+               default => '',
+               example => "10",
+               description => "number of seconds to delay CGI requests when overloaded",
+               safe => 1,
+               rebuild => 0,
+       },
+       cgi_overload_message => {
+               type => "string",
+               default => '',
+               example => "Please wait",
+               description => "message to display when overloaded (may contain html)",
+               safe => 1,
+               rebuild => 0,
+       },
+       only_committed_changes => {
+               type => "boolean",
+               default => 0,
+               description => "enable optimization of only refreshing committed changes?",
+               safe => 1,
+               rebuild => 0,
+       },
        rcs => {
                type => "string",
                default => '',
@@ -497,6 +520,21 @@ sub getsetup () {
                safe => 0,
                rebuild => 0,
        },
+       cookiejar => {
+               type => "string",
+               default => { file => "$ENV{HOME}/.ikiwiki/cookies" },
+               description => "cookie control",
+               safe => 0, # hooks into perl module internals
+               rebuild => 0,
+       },
+       useragent => {
+               type => "string",
+               default => undef,
+               example => "Wget/1.13.4 (linux-gnu)",
+               description => "set custom user agent string for outbound HTTP requests e.g. when fetching aggregated RSS feeds",
+               safe => 0,
+               rebuild => 0,
+       },
 }
 
 sub defaultconfig () {
@@ -705,6 +743,7 @@ sub debug ($) {
 }
 
 my $log_open=0;
+my $log_failed=0;
 sub log_message ($$) {
        my $type=shift;
 
@@ -715,9 +754,18 @@ sub log_message ($$) {
                        Sys::Syslog::openlog('ikiwiki', '', 'user');
                        $log_open=1;
                }
-               return eval {
-                       Sys::Syslog::syslog($type, "[$config{wikiname}] %s", join(" ", @_));
+               eval {
+                       # keep a copy to avoid editing the original config repeatedly
+                       my $wikiname = $config{wikiname};
+                       utf8::encode($wikiname);
+                       Sys::Syslog::syslog($type, "[$wikiname] %s", join(" ", @_));
                };
+                if ($@) {
+                    print STDERR "failed to syslog: $@" unless $log_failed;
+                    $log_failed=1;
+                    print STDERR "@_\n";
+                }
+                return $@;
        }
        elsif (! $config{cgi}) {
                return print "@_\n";
@@ -1092,6 +1140,11 @@ sub cgiurl (@) {
                join("&amp;", map $_."=".uri_escape_utf8($params{$_}), keys %params);
 }
 
+sub cgiurl_abs (@) {
+       eval q{use URI};
+       URI->new_abs(cgiurl(@_), $config{cgiurl});
+}
+
 sub baseurl (;$) {
        my $page=shift;
 
@@ -1412,7 +1465,7 @@ sub preprocess ($$$;$$) {
                        # consider it significant.
                        my @params;
                        while ($params =~ m{
-                               (?:([-\w]+)=)?          # 1: named parameter key?
+                               (?:([-.\w]+)=)?         # 1: named parameter key?
                                (?:
                                        """(.*?)"""     # 2: triple-quoted value
                                |
@@ -1455,7 +1508,7 @@ sub preprocess ($$$;$$) {
                                        push @params, $val, '';
                                }
                        }
-                       if ($preprocessing{$page}++ > 3) {
+                       if ($preprocessing{$page}++ > 8) {
                                # Avoid loops of preprocessed pages preprocessing
                                # other pages that preprocess them, etc.
                                return "[[!$command <span class=\"error\">".
@@ -1509,7 +1562,7 @@ sub preprocess ($$$;$$) {
                        (               # 4: the parameters..
                                \s+     # Must have space if parameters present
                                (?:
-                                       (?:[-\w]+=)?            # named parameter key?
+                                       (?:[-.\w]+=)?           # named parameter key?
                                        (?:
                                                """.*?"""       # triple-quoted value
                                                |
@@ -1537,7 +1590,7 @@ sub preprocess ($$$;$$) {
                        \s+
                        (               # 4: the parameters..
                                (?:
-                                       (?:[-\w]+=)?            # named parameter key?
+                                       (?:[-.\w]+=)?           # named parameter key?
                                        (?:
                                                """.*?"""       # triple-quoted value
                                                |
@@ -1753,7 +1806,8 @@ sub enable_commit_hook () {
 
 sub loadindex () {
        %oldrenderedfiles=%pagectime=();
-       if (! $config{rebuild}) {
+       my $rebuild=$config{rebuild};
+       if (! $rebuild) {
                %pagesources=%pagemtime=%oldlinks=%links=%depends=
                %destsources=%renderedfiles=%pagecase=%pagestate=
                %depends_simple=%typedlinks=%oldtypedlinks=();
@@ -1765,7 +1819,8 @@ sub loadindex () {
                        open ($in, "<", "$config{wikistatedir}/indexdb") || return;
                }
                else {
-                       $config{gettime}=1; # first build
+                       # gettime on first build
+                       $config{gettime}=1 unless defined $config{gettime};
                        return;
                }
        }
@@ -1793,10 +1848,16 @@ sub loadindex () {
 
        foreach my $src (keys %$pages) {
                my $d=$pages->{$src};
-               my $page=pagename($src);
+               my $page;
+               if (exists $d->{page} && ! $rebuild) {
+                       $page=$d->{page};
+               }
+               else {
+                       $page=pagename($src);
+               }
                $pagectime{$page}=$d->{ctime};
                $pagesources{$page}=$src;
-               if (! $config{rebuild}) {
+               if (! $rebuild) {
                        $pagemtime{$page}=$d->{mtime};
                        $renderedfiles{$page}=$d->{dest};
                        if (exists $d->{links} && ref $d->{links}) {
@@ -1846,6 +1907,8 @@ sub loadindex () {
        foreach my $page (keys %renderedfiles) {
                $destsources{$_}=$page foreach @{$renderedfiles{$page}};
        }
+       $lastrev=$index->{lastrev};
+       @underlayfiles=@{$index->{underlayfiles}} if ref $index->{underlayfiles};
        return close($in);
 }
 
@@ -1867,6 +1930,7 @@ sub saveindex () {
                my $src=$pagesources{$page};
 
                $index{page}{$src}={
+                       page => $page,
                        ctime => $pagectime{$page},
                        mtime => $pagemtime{$page},
                        dest => $renderedfiles{$page},
@@ -1886,11 +1950,7 @@ sub saveindex () {
                }
 
                if (exists $pagestate{$page}) {
-                       foreach my $id (@plugins) {
-                               foreach my $key (keys %{$pagestate{$page}{$id}}) {
-                                       $index{page}{$src}{state}{$id}{$key}=$pagestate{$page}{$id}{$key};
-                               }
-                       }
+                       $index{page}{$src}{state}=$pagestate{$page};
                }
        }
 
@@ -1902,6 +1962,9 @@ sub saveindex () {
                }
        }
        
+       $index{lastrev}=$lastrev;
+       $index{underlayfiles}=\@underlayfiles;
+
        $index{version}="3";
        my $ret=Storable::nstore_fd(\%index, $out);
        return if ! defined $ret || ! $ret;
@@ -2253,6 +2316,14 @@ sub add_autofile ($$$) {
        $autofiles{$file}{generator}=$generator;
 }
 
+sub useragent () {
+       return LWP::UserAgent->new(
+               cookie_jar => $config{cookiejar},
+               env_proxy => 1,         # respect proxy env vars
+               agent => $config{useragent},
+       );
+}
+
 sub sortspec_translate ($$) {
        my $spec = shift;
        my $reverse = shift;
@@ -2389,6 +2460,19 @@ sub pagespec_match ($$;@) {
        return $sub->($page, @params);
 }
 
+# e.g. @pages = sort_pages("title", \@pages, reverse => "yes")
+#
+# Not exported yet, but could be in future if it is generally useful.
+# Note that this signature is not the same as IkiWiki::SortSpec::sort_pages,
+# which is "more internal".
+sub sort_pages ($$;@) {
+       my $sort = shift;
+       my $list = shift;
+       my %params = @_;
+       $sort = sortspec_translate($sort, $params{reverse});
+       return IkiWiki::SortSpec::sort_pages($sort, @$list);
+}
+
 sub pagespec_match_list ($$;@) {
        my $page=shift;
        my $pagespec=shift;
@@ -2755,12 +2839,12 @@ sub match_user ($$;@) {
        my $user=shift;
        my %params=@_;
        
-       my $regexp=IkiWiki::glob2re($user);
-       
        if (! exists $params{user}) {
                return IkiWiki::ErrorReason->new("no user specified");
        }
 
+       my $regexp=IkiWiki::glob2re($user);
+       
        if (defined $params{user} && $params{user}=~$regexp) {
                return IkiWiki::SuccessReason->new("user is $user");
        }
@@ -2800,8 +2884,10 @@ sub match_ip ($$;@) {
        if (! exists $params{ip}) {
                return IkiWiki::ErrorReason->new("no IP specified");
        }
+       
+       my $regexp=IkiWiki::glob2re(lc $ip);
 
-       if (defined $params{ip} && lc $params{ip} eq lc $ip) {
+       if (defined $params{ip} && lc $params{ip}=~$regexp) {
                return IkiWiki::SuccessReason->new("IP is $ip");
        }
        else {
index 62383b6fd22cf3ca6bed2dc3571f5cafb3c10715..cb83319e62ee893d92fd1d5f64695c23144d2614 100644 (file)
@@ -110,11 +110,23 @@ sub decode_cgi_utf8 ($) {
        }
 }
 
+sub safe_decode_utf8 ($) {
+    my $octets = shift;
+    # call decode_utf8 on >= 5.20 only if it's not already decoded,
+    # otherwise it balks, on < 5.20, always call it
+    if ($] < 5.02 || !Encode::is_utf8($octets)) {
+        return decode_utf8($octets);
+    }
+    else {
+        return $octets;
+    }
+}
+
 sub decode_form_utf8 ($) {
        if ($] >= 5.01) {
                my $form = shift;
                foreach my $f ($form->field) {
-                       my @value=map { decode_utf8($_) } $form->field($f);
+                       my @value=map { safe_decode_utf8($_) } $form->field($f);
                        $form->field(name  => $f,
                                     value => \@value,
                                     force => 1,
@@ -131,7 +143,7 @@ sub needsignin ($$) {
 
        if (! defined $session->param("name") ||
            ! userinfo_get($session->param("name"), "regdate")) {
-               $session->param(postsignin => $ENV{QUERY_STRING});
+               $session->param(postsignin => $q->query_string);
                cgi_signin($q, $session);
                cgi_savesession($session);
                exit;
@@ -351,7 +363,8 @@ sub cgi_getsession ($) {
                        { FileName => "$config{wikistatedir}/sessions.db" })
        };
        if (! $session || $@) {
-               error($@." ".CGI::Session->errstr());
+               my $error = $@;
+               error($error." ".CGI::Session->errstr());
        }
        
        umask($oldmask);
index 5e22609c9b354a2b2770762a17cd60bcd5c36535..fbf88c62738d783c210d27cf6aa57c1b81c71fef 100644 (file)
@@ -58,21 +58,12 @@ sub getsetup () {
                        safe => 1,
                        rebuild => 0,
                },
-               cookiejar => {
-                       type => "string",
-                       example => { file => "$ENV{HOME}/.ikiwiki/cookies" },
-                       safe => 0, # hooks into perl module internals
-                       description => "cookie control",
-               },
 }
 
 sub checkconfig () {
        if (! defined $config{aggregateinternal}) {
                $config{aggregateinternal}=1;
        }
-       if (! defined $config{cookiejar}) {
-               $config{cookiejar}={ file => "$ENV{HOME}/.ikiwiki/cookies" };
-       }
 
        # This is done here rather than in a refresh hook because it
        # needs to run before the wiki is locked.
@@ -113,8 +104,7 @@ sub launchaggregation () {
        my @feeds=needsaggregate();
        return unless @feeds;
        if (! lockaggregate()) {
-               debug("an aggregation process is already running");
-               return;
+               error("an aggregation process is already running");
        }
        # force a later rebuild of source pages
        $IkiWiki::forcerebuild{$_->{sourcepage}}=1
@@ -201,7 +191,7 @@ sub migrate_to_internal {
                if (-e $oldoutput) {
                        require IkiWiki::Render;
                        debug("removing output file $oldoutput");
-                       IkiWiki::prune($oldoutput);
+                       IkiWiki::prune($oldoutput, $config{destdir});
                }
        }
        
@@ -523,11 +513,8 @@ sub aggregate (@) {
                        }
                        $feed->{feedurl}=pop @urls;
                }
-               my $res=URI::Fetch->fetch($feed->{feedurl},
-                       UserAgent => LWP::UserAgent->new(
-                               cookie_jar => $config{cookiejar},
-                       ),
-               );
+               my $ua=useragent();
+               my $res=URI::Fetch->fetch($feed->{feedurl}, UserAgent=>$ua);
                if (! $res) {
                        $feed->{message}=URI::Fetch->errstr;
                        $feed->{error}=1;
@@ -566,7 +553,9 @@ sub aggregate (@) {
                        };
                }
                if ($@) {
-                       $feed->{message}=gettext("feed crashed XML::Feed!")." ($@)";
+                       # gettext can clobber $@
+                       my $error = $@;
+                       $feed->{message}=gettext("feed crashed XML::Feed!")." ($error)";
                        $feed->{error}=1;
                        debug($feed->{message});
                        next;
@@ -594,6 +583,7 @@ sub aggregate (@) {
                                feed => $feed,
                                copyright => $f->copyright,
                                title => defined $entry->title ? decode_entities($entry->title) : "untitled",
+                               author => defined $entry->author ? decode_entities($entry->author) : "",
                                link => $entry->link,
                                content => (defined $c && defined $c->body) ? $c->body : "",
                                guid => defined $entry->id ? $entry->id : time."_".$feed->{name},
@@ -640,12 +630,12 @@ sub add_page (@) {
                       -e "$config{srcdir}/".htmlfn($page.$c)) {
                        $c++
                }
+               $page=$page.$c;
 
                $guid->{page}=$page;
                eval { write_page($feed, $guid, $mtime, \%params) };
                if ($@) {
                        # assume failure was due to a too long filename
-                       # (or o
                        $c="";
                        $page=$feed->{dir}."/item";
                        while (exists $IkiWiki::pagecase{lc $page.$c} ||
@@ -653,6 +643,7 @@ sub add_page (@) {
                              -e "$config{srcdir}/".htmlfn($page.$c)) {
                                $c++
                        }
+                       $page=$page.$c;
 
                        $guid->{page}=$page;
                        write_page($feed, $guid, $mtime, \%params);
@@ -686,11 +677,16 @@ sub write_page ($$$$$) {
                $template=template($feed->{template}, blind_cache => 1);
        };
        if ($@) {
-               print STDERR gettext("failed to process template:")." $@";
+               # gettext can clobber $@
+               my $error = $@;
+               print STDERR gettext("failed to process template:")." $error";
                return;
        }
        $template->param(title => $params{title})
                if defined $params{title} && length($params{title});
+       $template->param(author => $params{author})
+               if defined $params{author} && length($params{author}
+                       && $params{author} ne $feed->{name});
        $template->param(content => wikiescape(htmlabs($params{content},
                defined $params{base} ? $params{base} : $feed->{feedurl})));
        $template->param(name => $feed->{name});
index cfd8cd3477f81dd0758564994f35979419e330a0..a9da6bf12b69dc62f2ee05f22aaaef2c88fe7dde 100644 (file)
@@ -232,8 +232,9 @@ sub writefile ($$$;$$) {
 }
 
 # This is a wrapper around the real prune.
-sub prune ($) {
+sub prune ($;$) {
        my $file=shift;
+       my $up_to=shift;
 
        my @keys=IkiWiki::Plugin::amazon_s3::file2keys($file);
 
@@ -250,7 +251,7 @@ sub prune ($) {
                }
        }
 
-       return $IkiWiki::Plugin::amazon_s3::subs{'IkiWiki::prune'}->($file);
+       return $IkiWiki::Plugin::amazon_s3::subs{'IkiWiki::prune'}->($file, $up_to);
 }
 
 1
index 5a180cd5cf3c3eaac5282ef267982327e49eba8d..d56dd18ad8ded90e3dd6f46598e7bc632359d4b5 100644 (file)
@@ -148,7 +148,7 @@ sub formbuilder (@) {
                        $f=Encode::decode_utf8($f);
                        $f=~s/^$page\///;
                        if (IkiWiki::isinlinableimage($f) &&
-                           UNIVERSAL::can("IkiWiki::Plugin::img", "import")) {
+                           IkiWiki::Plugin::img->can("import")) {
                                $add.='[[!img '.$f.' align="right" size="" alt=""]]';
                        }
                        else {
@@ -229,8 +229,10 @@ sub attachment_store {
                check_canattach($session, $final_filename, $tempfile);
        };
        if ($@) {
-               json_response($q, $form, $dest."/".$filename, $@);
-               error $@;
+               # save error in case called functions clobber $@
+               my $error = $@;
+               json_response($q, $form, $dest."/".$filename, $error);
+               error $error;
        }
 
        # Move the attachment into holding directory.
@@ -274,19 +276,19 @@ sub attachments_save {
        foreach my $filename (glob("$dir/*")) {
                $filename=Encode::decode_utf8($filename);
                next unless -f $filename;
-               my $destdir=$config{srcdir}."/".
-                       linkpage(IkiWiki::possibly_foolish_untaint(
-                               attachment_location($form->field('page'))));
+               my $destdir=linkpage(IkiWiki::possibly_foolish_untaint(
+                       attachment_location($form->field('page'))));
+               my $absdestdir=$config{srcdir}."/".$destdir;
                my $destfile=IkiWiki::basename($filename);
-               my $dest=$destdir.$destfile;
+               my $dest=$absdestdir.$destfile;
                unlink($dest);
-               IkiWiki::prep_writefile($destfile, $destdir);
+               IkiWiki::prep_writefile($destfile, $absdestdir);
                rename($filename, $dest);
-               push @attachments, $dest;
+               push @attachments, $destdir.$destfile;
        }
        return unless @attachments;
        require IkiWiki::Render;
-       IkiWiki::prune($dir);
+       IkiWiki::prune($dir, $config{wikistatedir}."/attachments");
 
        # Check the attachments in and trigger a wiki refresh.
        if ($config{rcs}) {
index d32c2f169d643a7db9e9fffc292201a4bf93276e..e48ed729f5439f148e7f70e0d228990cbbe2a0f2 100644 (file)
@@ -53,6 +53,7 @@ sub checkconfig () {
        eval q{
                use RPC::XML;
                use RPC::XML::Client;
+               $RPC::XML::ENCODING = 'utf-8';
        };
        error $@ if $@;
 }
index 72552abccaa96212c5f71d48cefcbb1b21e4498b..e2b102dee9403014271edc26e6683eb7a1933e5a 100644 (file)
@@ -195,7 +195,7 @@ sub rcs_add ($) {
 sub rcs_remove ($) {
        my ($file) = @_;
 
-       my @cmdline = ("bzr", "rm", "--force", "--quiet", "$config{srcdir}/$file");
+       my @cmdline = ("bzr", "rm", "--quiet", "$config{srcdir}/$file");
        if (system(@cmdline) != 0) {
                warn "'@cmdline' failed: $!";
        }
@@ -302,7 +302,7 @@ sub extract_timestamp (@) {
        open (my $out, "-|", @_);
        my @log = bzr_log($out);
 
-       if (length @log < 1) {
+       if (length(scalar(@log)) < 1) {
                return 0;
        }
 
index d443198f69618f28e37821766731b50bc2599306..682bfb6fb8f1e2fb789d5735353f609a163930ee 100644 (file)
@@ -86,8 +86,10 @@ sub format_month (@) {
                my $year  = $date[5] + 1900;
                my $mtag  = sprintf("%02d", $month);
 
-               # Only one posting per day is being linked to.
-               $linkcache{"$year/$mtag/$mday"} = $p;
+               if (! $linkcache{"$year/$mtag/$mday"}) {
+                       $linkcache{"$year/$mtag/$mday"} = [];
+               }
+               push(@{$linkcache{"$year/$mtag/$mday"}}, $p);
        }
                
        my $pmonth = $params{month} - 1;
@@ -221,11 +223,27 @@ EOF
                                $tag='month-calendar-day-link';
                        }
                        $calendar.=qq{\t\t<td class="$tag $downame{$wday}">};
-                       $calendar.=htmllink($params{page}, $params{destpage}, 
-                               $linkcache{$key},
-                               noimageinline => 1,
-                               linktext => $day,
-                               title => pagetitle(IkiWiki::basename($linkcache{$key})));
+                       $calendar.=qq{<div class='popup'>$day<div class='balloon'>};
+                       # Several postings on this page
+                       $calendar.=qq{<ul>};
+                       foreach my $page (@{$linkcache{$key}}) {
+                               $calendar.= qq{\n\t\t\t<li>};
+                               my $title;
+                               if (exists $pagestate{$page}{meta}{title}) {
+                                       $title = "$pagestate{$page}{meta}{title}";
+                               }
+                               else {
+                                       $title = pagetitle(IkiWiki::basename($page));
+                               }
+                               $calendar.=htmllink($params{page}, $params{destpage}, 
+                                       $page,
+                                       noimageinline => 1,
+                                       linktext => $title,
+                                       title => $title);
+                               $calendar.= '</li>';
+                       }
+                       $calendar.=qq{\n\t\t</ul>};
+                       $calendar.=qq{</div></div>};
                        $calendar.=qq{</td>\n};
                }
                else {
index 91a482ed6660059ed3a77f30b5236dbd891303a8..98ae13810200269a34fbfb8b24093e26dc5ad4bb 100644 (file)
@@ -35,6 +35,7 @@ sub import {
        # Load goto to fix up user page links for logged-in commenters
        IkiWiki::loadplugin("goto");
        IkiWiki::loadplugin("inline");
+       IkiWiki::loadplugin("transient");
 }
 
 sub getsetup () {
@@ -90,17 +91,31 @@ sub getsetup () {
                        safe => 0,
                        rebuild => 0,
                },
+               comments_allowformats => {
+                       type => 'string',
+                       default => '',
+                       example => 'mdwn txt',
+                       description => 'Restrict formats for comments to (no restriction if empty)',
+                       safe => 1,
+                       rebuild => 0,
+               },
+
 }
 
 sub checkconfig () {
        $config{comments_commit} = 1
                unless defined $config{comments_commit};
+       if (! $config{comments_commit}) {
+               $config{only_committed_changes}=0;
+       }
        $config{comments_pagespec} = ''
                unless defined $config{comments_pagespec};
        $config{comments_closed_pagespec} = ''
                unless defined $config{comments_closed_pagespec};
        $config{comments_pagename} = 'comment_'
                unless defined $config{comments_pagename};
+       $config{comments_allowformats} = ''
+               unless defined $config{comments_allowformats};
 }
 
 sub htmlize {
@@ -128,12 +143,18 @@ sub safeurl ($) {
        }
 }
 
+sub isallowed ($) {
+    my $format = shift;
+    return ! $config{comments_allowformats} || $config{comments_allowformats} =~ /\b$format\b/;
+}
+
 sub preprocess {
        my %params = @_;
        my $page = $params{page};
 
        my $format = $params{format};
-       if (defined $format && ! exists $IkiWiki::hooks{htmlize}{$format}) {
+       if (defined $format && (! exists $IkiWiki::hooks{htmlize}{$format} ||
+                               ! isallowed($format))) {
                error(sprintf(gettext("unsupported page format %s"), $format));
        }
 
@@ -301,7 +322,8 @@ sub editcomment ($$) {
 
        my @buttons = (POST_COMMENT, PREVIEW, CANCEL);
        my $form = CGI::FormBuilder->new(
-               fields => [qw{do sid page subject editcontent type author url}],
+               fields => [qw{do sid page subject editcontent type author
+                       email url subscribe anonsubscribe}],
                charset => 'utf-8',
                method => 'POST',
                required => [qw{editcontent}],
@@ -331,7 +353,7 @@ sub editcomment ($$) {
 
        my @page_types;
        if (exists $IkiWiki::hooks{htmlize}) {
-               foreach my $key (grep { !/^_/ } keys %{$IkiWiki::hooks{htmlize}}) {
+               foreach my $key (grep { !/^_/ && isallowed($_) } keys %{$IkiWiki::hooks{htmlize}}) {
                        push @page_types, [$key, $IkiWiki::hooks{htmlize}{$key}{longname} || $key];
                }
        }
@@ -346,18 +368,35 @@ sub editcomment ($$) {
        $form->field(name => "type", value => $type, force => 1,
                type => 'select', options => \@page_types);
 
-       $form->tmpl_param(username => $session->param('name'));
+       my $username=$session->param('name');
+       $form->tmpl_param(username => $username);
+               
+       $form->field(name => "subscribe", type => 'hidden');
+       $form->field(name => "anonsubscribe", type => 'hidden');
+       if (IkiWiki::Plugin::notifyemail->can("subscribe")) {
+               if (defined $username) {
+                       $form->field(name => "subscribe", type => "checkbox",
+                               options => [gettext("email replies to me")]);
+               }
+               elsif (IkiWiki::Plugin::passwordauth->can("anonuser")) {
+                       $form->field(name => "anonsubscribe", type => "checkbox",
+                               options => [gettext("email replies to me")]);
+               }
+       }
 
        if ($config{comments_allowauthor} and
            ! defined $session->param('name')) {
                $form->tmpl_param(allowauthor => 1);
                $form->field(name => 'author', type => 'text', size => '40');
+               $form->field(name => 'email', type => 'text', size => '40');
                $form->field(name => 'url', type => 'text', size => '40');
        }
        else {
                $form->tmpl_param(allowauthor => 0);
                $form->field(name => 'author', type => 'hidden', value => '',
                        force => 1);
+               $form->field(name => 'email', type => 'hidden', value => '',
+                       force => 1);
                $form->field(name => 'url', type => 'hidden', value => '',
                        force => 1);
        }
@@ -399,6 +438,16 @@ sub editcomment ($$) {
                        $page));
        }
 
+       # There's no UI to get here, but someone might construct the URL,
+       # leading to a comment that exists in the repository but isn't
+       # shown
+       if (!pagespec_match($page, $config{comments_pagespec},
+               location => $page)) {
+               error(sprintf(gettext(
+                       "comments on page '%s' are not allowed"),
+                       $page));
+       }
+
        if (pagespec_match($page, $config{comments_closed_pagespec},
                location => $page)) {
                error(sprintf(gettext(
@@ -425,10 +474,7 @@ sub editcomment ($$) {
                $content .= " nickname=\"$nickname\"\n";
        }
        elsif (defined $session->remote_addr()) {
-               my $ip = $session->remote_addr();
-               if ($ip =~ m/^([.0-9]+)$/) {
-                       $content .= " ip=\"$1\"\n";
-               }
+               $content .= " ip=\"".$session->remote_addr()."\"\n";
        }
 
        if ($config{comments_allowauthor}) {
@@ -490,6 +536,20 @@ sub editcomment ($$) {
 
        if ($form->submitted eq POST_COMMENT && $form->validate) {
                IkiWiki::checksessionexpiry($cgi, $session);
+
+               if (IkiWiki::Plugin::notifyemail->can("subscribe")) {
+                       my $subspec="comment($page)";
+                       if (defined $username &&
+                           length $form->field("subscribe")) {
+                               IkiWiki::Plugin::notifyemail::subscribe(
+                                       $username, $subspec);
+                       }
+                       elsif (length $form->field("email") &&
+                              length $form->field("anonsubscribe")) {
+                               IkiWiki::Plugin::notifyemail::anonsubscribe(
+                                       $form->field("email"), $subspec);
+                       }
+               }
                
                $postcomment=1;
                my $ok=IkiWiki::check_content(content => $form->field('editcontent'),
@@ -506,8 +566,8 @@ sub editcomment ($$) {
                $postcomment=0;
 
                if (! $ok) {
-                       $location=unique_comment_location($page, $content, $config{srcdir}, "._comment_pending");
-                       writefile("$location._comment_pending", $config{srcdir}, $content);
+                       $location=unique_comment_location($page, $content, $IkiWiki::Plugin::transient::transientdir, "._comment_pending");
+                       writefile("$location._comment_pending", $IkiWiki::Plugin::transient::transientdir, $content);
 
                        # Refresh so anything that deals with pending
                        # comments can be updated.
@@ -575,7 +635,8 @@ sub editcomment ($$) {
 
 sub getavatar ($) {
        my $user=shift;
-       
+       return undef unless defined $user;
+
        my $avatar;
        eval q{use Libravatar::URL};
        if (! $@) {
@@ -631,10 +692,17 @@ sub commentmoderation ($$) {
                                }
 
                                my $page=IkiWiki::dirname($f);
-                               my $file="$config{srcdir}/$f";
+                               my $filedir=$IkiWiki::Plugin::transient::transientdir;
+                               my $file="$filedir/$f";
                                if (! -e $file) {
                                        # old location
-                                       $file="$config{wikistatedir}/comments_pending/".$f;
+                                       $file="$config{srcdir}/$f";
+                                       $filedir=$config{srcdir};
+                                       if (! -e $file) {
+                                               # older location
+                                               $file="$config{wikistatedir}/comments_pending/".$f;
+                                               $filedir="$config{wikistatedir}/comments_pending";
+                                       }
                                }
 
                                if ($action eq 'Accept') {
@@ -649,7 +717,7 @@ sub commentmoderation ($$) {
                                }
 
                                require IkiWiki::Render;
-                               IkiWiki::prune($file);
+                               IkiWiki::prune($file, $filedir);
                        }
                }
 
@@ -748,6 +816,8 @@ sub comments_pending () {
                chdir($origdir) || die "chdir $origdir: $!";
        };
        
+       $find_comments->($IkiWiki::Plugin::transient::transientdir, "._comment_pending");
+       # old location
        $find_comments->($config{srcdir}, "._comment_pending");
        # old location
        $find_comments->("$config{wikistatedir}/comments_pending/",
index 026078b3ccf6751c26418d329a62f715b1bb5252..b450f1a0a1cea267e3e2791376142c67438f03b9 100644 (file)
@@ -4,7 +4,6 @@ package IkiWiki::Plugin::conditional;
 use warnings;
 use strict;
 use IkiWiki 3.00;
-use UNIVERSAL;
 
 sub import {
        hook(type => "getsetup", id => "conditional", call => \&getsetup);
@@ -34,11 +33,15 @@ sub preprocess_if (@) {
            # 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\!()]*)+$/) {
-               add_depends($params{page}, "($params{test}) and $params{page}");
                $result=pagespec_match($params{page}, $params{test},
                                location => $params{page},
                                sourcepage => $params{page},
                                destpage => $params{destpage});
+               my $i = $result->influences;
+               foreach my $k (keys %$i) {
+                       # minor optimization: influences are always simple dependencies
+                       $IkiWiki::depends_simple{$params{page}}{lc $k} |= $i->{$k};
+               }
        }
        else {
                $result=pagespec_match_list($params{page}, $params{test},
index 788f5116786f291d1543944c55522b6a758439e7..841aec914f7208df52036379319f4bdfda7ddc01 100644 (file)
@@ -216,14 +216,12 @@ sub rcs_add ($) {
 
        while ($file = pop @files_to_add) {
                if (@files_to_add == 0) {
-                       # file
                        cvs_runcvs('add', cvs_keyword_subst_args($file)) ||
-                               warn("cvs add $file failed\n");
+                               warn("cvs add file $file failed\n");
                }
                else {
-                       # directory
                        cvs_runcvs('add', $file) ||
-                               warn("cvs add $file failed\n");
+                               warn("cvs add dir $file failed\n");
                }
        }
 }
@@ -316,7 +314,9 @@ sub rcs_recentchanges ($) {
                        $oldrev =~ s/INITIAL/0/;
                        $newrev =~ s/\(DEAD\)//;
                        my $diffurl = defined $config{diffurl} ? $config{diffurl} : "";
-                       my $epage = uri_escape_utf8($page);
+                       my $epage = join('/',
+                               map { uri_escape_utf8($_) } split('/', $page)
+                       );
                        $diffurl=~s/\[\[file\]\]/$epage/g;
                        $diffurl=~s/\[\[r1\]\]/$oldrev/g;
                        $diffurl=~s/\[\[r2\]\]/$newrev/g;
@@ -396,11 +396,15 @@ sub rcs_diff ($;$) {
        my @cvsps = `env TZ=UTC cvsps -q --cvs-direct -z 30 -g -s $rev`;
        my $blank_lines_seen = 0;
 
+       # skip log, get to the diff
        while (my $line = shift @cvsps) {
                $blank_lines_seen++ if ($line =~ /^$/);
                last if $blank_lines_seen == 2;
        }
 
+       @cvsps = @cvsps[0..$maxlines-1]
+               if defined $maxlines && @cvsps > $maxlines;
+
        if (wantarray) {
                return @cvsps;
        }
@@ -491,24 +495,53 @@ sub cvs_keyword_subst_args ($) {
        my $filemime = File::MimeInfo::default($file);
        # if (-T $file) {
 
-       if (defined($filemime) && $filemime eq 'text/plain') {
-               return ($file);
-       }
-       else {
-               return ('-kb', $file);
-       }
+       defined($filemime) && $filemime eq 'text/plain'
+               ? return ('-kkv', $file)
+               : return ('-kb', $file);
 }
 
 sub cvs_runcvs(@) {
        my @cmd = @_;
        unshift @cmd, 'cvs', '-Q';
 
-       local $CWD = $config{srcdir};
+       # CVS can't operate outside a srcdir, so we're always setting $CWD.
+       # "local $CWD" restores the previous value when we go out of scope.
+       # Usually that's correct. But if we're removing the last file from
+       # a directory, the post-commit hook will exec in a working directory
+       # that's about to not exist (CVS will prune it).
+       #
+       # chdir() manually here, so we can selectively not chdir() back.
+
+       my $oldcwd = $CWD;
+       chdir($config{srcdir});
+
+       eval q{
+               use IPC::Open3;
+               use Symbol qw(gensym);
+               use IO::File;
+       };
+       error($@) if $@;
+
+       my $cvsout = '';
+       my $cvserr = '';
+       local *CATCHERR = IO::File->new_tmpfile;
+       my $pid = open3(gensym(), \*CATCHOUT, ">&CATCHERR", @cmd);
+       while (my $l = <CATCHOUT>) {
+               $cvsout .= $l
+                       unless 1;
+       }
+       waitpid($pid, 0);
+       my $ret = $? >> 8;
+       seek CATCHERR, 0, 0;
+       while (my $l = <CATCHERR>) {
+               $cvserr .= $l
+                       unless $l =~ /^cvs commit: changing keyword expansion /;
+       }
+
+       print STDOUT $cvsout;
+       print STDERR $cvserr;
 
-       open(my $savedout, ">&STDOUT");
-       open(STDOUT, ">", "/dev/null");
-       my $ret = system(@cmd);
-       open(STDOUT, ">&", $savedout);
+       chdir($oldcwd) if -d $oldcwd;
 
        return ($ret == 0) ? 1 : 0;
 }
index 54051c58c2cf836e258c110d0ec4a47d6ff1e0a2..3047869c4a0ad4da75f715937b8fff185dc80970 100644 (file)
@@ -39,7 +39,7 @@ sub refresh () {
                                }
                                if ($delete) {
                                        debug(sprintf(gettext("removing old preview %s"), $file));
-                                       IkiWiki::prune("$config{destdir}/$file");
+                                       IkiWiki::prune("$config{destdir}/$file", $config{destdir});
                                }
                        }
                        elsif (defined $mtime) {
@@ -64,7 +64,8 @@ sub cgi_editpage ($$) {
 
        decode_cgi_utf8($q);
 
-       my @fields=qw(do rcsinfo subpage from page type editcontent editmessage);
+       my @fields=qw(do rcsinfo subpage from page type editcontent
+               editmessage subscribe);
        my @buttons=("Save Page", "Preview", "Cancel");
        eval q{use CGI::FormBuilder};
        error($@) if $@;
@@ -157,6 +158,17 @@ sub cgi_editpage ($$) {
                        noimageinline => 1,
                        linktext => "FormattingHelp"));
        
+       my $cansubscribe=IkiWiki::Plugin::notifyemail->can("subscribe")
+               && IkiWiki::Plugin::comments->can("import")
+               && defined $session->param('name');
+       if ($cansubscribe) {
+               $form->field(name => "subscribe", type => "checkbox",
+                       options => [gettext("email comments to me")]);
+       }
+       else {
+               $form->field(name => "subscribe", type => 'hidden');
+       }
+       
        my $previewing=0;
        if ($form->submitted eq "Cancel") {
                if ($form->field("do") eq "create" && defined $from) {
@@ -388,10 +400,12 @@ sub cgi_editpage ($$) {
                eval { writefile($file, $config{srcdir}, $content) };
                $config{cgi}=1;
                if ($@) {
+                       # save $@ in case a called function clobbers it
+                       my $error = $@;
                        $form->field(name => "rcsinfo", value => rcs_prepedit($file),
                                force => 1);
                        my $mtemplate=template("editfailedsave.tmpl");
-                       $mtemplate->param(error_message => $@);
+                       $mtemplate->param(error_message => $error);
                        $form->tmpl_param("message", $mtemplate->output);
                        $form->field("editcontent", value => $content, force => 1);
                        $form->tmpl_param("page_select", 0);
@@ -448,6 +462,12 @@ sub cgi_editpage ($$) {
                        # caches and get the most recent version of the page.
                        redirect($q, $baseurl."?updated");
                }
+
+               if ($cansubscribe && length $form->field("subscribe")) {
+                       my $subspec="comment($page)";
+                       IkiWiki::Plugin::notifyemail::subscribe(
+                               $session->param('name'), $subspec);
+               }
        }
 
        exit;
index 061242fd82c1f1a76251dac12f8017821688a2a1..c2a8da29f853ec5f13e8fab959773751cc86ada9 100644 (file)
@@ -130,13 +130,34 @@ sub filltemplate ($$) {
                $template=template("/".$template_page);
        };
        if ($@) {
+               # gettext can clobber $@
+               my $error = $@;
                # Indicate that the earlier preprocessor directive set 
                # up a template that doesn't work.
-               return "[[!pagetemplate ".gettext("failed to process template:")." $@]]";
+               return "[[!edittemplate ".gettext("failed to process template:")." $error]]";
        }
 
        $template->param(name => $page);
 
+       if ($template->query(name => 'uuid')) {
+               my $uuid;
+               if (open(my $fh, "<", "/proc/sys/kernel/random/uuid")) {
+                       $uuid = <$fh>;
+                       chomp $uuid;
+                       close $fh;
+               }
+               else {
+                       eval {
+                               require UUID::Tiny;
+                               $uuid = UUID::Tiny::create_uuid_as_string(UUID::Tiny::UUID_V4());
+                       };
+               }
+               $template->param(uuid => $uuid);
+       }
+
+       my $time = time();
+       $template->param(time => IkiWiki::date_3339($time));
+
        return $template->output;
 }
 
index 4f4e67489a41c51ecae344119362f0ea611d481a..cdea5c706f4085686bf20b5e7a09283792137c31 100644 (file)
@@ -48,7 +48,6 @@ sub getsetup () {
                plugin => {
                        safe => 1,
                        rebuild => undef,
-                       section => "misc",
                },
 }
 
@@ -140,7 +139,7 @@ sub match_mimetype ($$;@) {
        my $mimeinfo_ok=! $@;
        my $mimetype;
        if ($mimeinfo_ok) {
-               my $mimetype=File::MimeInfo::Magic::magic($file);
+               $mimetype=File::MimeInfo::Magic::magic($file);
        }
 
        # Fall back to using file, which has a more complete
index 535cd5fe0f64d23d46a233a388264f88912e1c6d..75b89e476bbb4bf1da262385a8e390994489f0e9 100644 (file)
@@ -29,6 +29,8 @@ sub import {
        hook(type => "rcs", id => "rcs_receive", call => \&rcs_receive);
        hook(type => "rcs", id => "rcs_preprevert", call => \&rcs_preprevert);
        hook(type => "rcs", id => "rcs_revert", call => \&rcs_revert);
+       hook(type => "rcs", id => "rcs_find_changes", call => \&rcs_find_changes);
+       hook(type => "rcs", id => "rcs_get_current_rev", call => \&rcs_get_current_rev);
 }
 
 sub checkconfig () {
@@ -341,8 +343,8 @@ sub parse_diff_tree ($) {
        my $dt_ref = shift;
 
        # End of stream?
-       return if !defined @{ $dt_ref } ||
-                 !defined @{ $dt_ref }[0] || !length @{ $dt_ref }[0];
+       return if ! @{ $dt_ref } ||
+                 !defined $dt_ref->[0] || !length $dt_ref->[0];
 
        my %ci;
        # Header line.
@@ -462,20 +464,63 @@ sub git_commit_info ($;$) {
        return wantarray ? @ci : $ci[0];
 }
 
-sub git_sha1 (;$) {
-       # Return head sha1sum (of given file).
-       my $file = shift || q{--};
+sub rcs_find_changes ($) {
+       my $oldrev=shift;
 
+       # Note that git log will sometimes show files being added that
+       # don't exist. Particularly, git merge -s ours can result in a
+       # merge commit where some files were not really added.
+       # This is why the code below verifies that the files really
+       # exist.
+       my @raw_lines = run_or_die('git', 'log',
+               '--pretty=raw', '--raw', '--abbrev=40', '--always', '-c',
+               '--no-renames', , '--reverse',
+               '-r', "$oldrev..HEAD", '--', '.');
+
+       # Due to --reverse, we see changes in chronological order.
+       my %changed;
+       my %deleted;
+       my $nullsha = 0 x 40;
+       my $newrev=$oldrev;
+       while (my $ci = parse_diff_tree(\@raw_lines)) {
+               $newrev=$ci->{sha1};
+               foreach my $i (@{$ci->{details}}) {
+                       my $file=$i->{file};
+                       if ($i->{sha1_to} eq $nullsha) {
+                               if (! -e "$config{srcdir}/$file") {
+                                       delete $changed{$file};
+                                       $deleted{$file}=1;
+                               }
+                       }
+                       else {
+                               if (-e "$config{srcdir}/$file") {
+                                       delete $deleted{$file};
+                                       $changed{$file}=1;
+                               }
+                       }
+               }
+       }
+
+       return (\%changed, \%deleted, $newrev);
+}
+
+sub git_sha1_file ($) {
+       my $file=shift;
+       git_sha1("--", $file);
+}
+
+sub git_sha1 (@) {
        # Ignore error since a non-existing file might be given.
        my ($sha1) = run_or_non('git', 'rev-list', '--max-count=1', 'HEAD',
-               '--', $file);
-       if ($sha1) {
+               '--', @_);
+       if (defined $sha1) {
                ($sha1) = $sha1 =~ m/($sha1_pattern)/; # sha1 is untainted now
        }
-       else {
-               debug("Empty sha1sum for '$file'.");
-       }
-       return defined $sha1 ? $sha1 : q{};
+       return defined $sha1 ? $sha1 : '';
+}
+
+sub rcs_get_current_rev () {
+       git_sha1();
 }
 
 sub rcs_update () {
@@ -491,7 +536,7 @@ sub rcs_prepedit ($) {
        # This will be later used in rcs_commit if a merge is required.
        my ($file) = @_;
 
-       return git_sha1($file);
+       return git_sha1_file($file);
 }
 
 sub rcs_commit (@) {
@@ -502,7 +547,7 @@ sub rcs_commit (@) {
 
        # Check to see if the page has been changed by someone else since
        # rcs_prepedit was called.
-       my $cur    = git_sha1($params{file});
+       my $cur    = git_sha1_file($params{file});
        my ($prev) = $params{token} =~ /^($sha1_pattern)$/; # untaint
 
        if (defined $cur && defined $prev && $cur ne $prev) {
@@ -553,7 +598,13 @@ sub rcs_commit_helper (@) {
                # Force git to allow empty commit messages.
                # (If this version of git supports it.)
                my ($version)=`git --version` =~ /git version (.*)/;
-               if ($version ge "1.5.4") {
+               if ($version ge "1.7.8") {
+                       push @opts, "--allow-empty-message", "--no-edit";
+               }
+               if ($version ge "1.7.2") {
+                       push @opts, "--allow-empty-message";
+               }
+               elsif ($version ge "1.5.4") {
                        push @opts, '--cleanup=verbatim';
                }
                else {
@@ -567,7 +618,7 @@ sub rcs_commit_helper (@) {
        # So we should ignore its exit status (hence run_or_non).
        if (run_or_non('git', 'commit', '-m', $params{message}, '-q', @opts)) {
                if (length $config{gitorigin_branch}) {
-                       run_or_cry('git', 'push', $config{gitorigin_branch});
+                       run_or_cry('git', 'push', $config{gitorigin_branch}, $config{gitmaster_branch});
                }
        }
        
@@ -618,7 +669,9 @@ sub rcs_recentchanges ($) {
                my @pages;
                foreach my $detail (@{ $ci->{'details'} }) {
                        my $file = $detail->{'file'};
-                       my $efile = uri_escape_utf8($file);
+                       my $efile = join('/',
+                               map { uri_escape_utf8($_) } split('/', $file)
+                       );
 
                        my $diffurl = defined $config{'diffurl'} ? $config{'diffurl'} : "";
                        $diffurl =~ s/\[\[file\]\]/$efile/go;
index b9f997e04b123a11a50aa9dddac82d982fb2fbf7..d4018edaaf9dad384818488356a3e7e8c4d8841c 100644 (file)
@@ -132,6 +132,7 @@ sub graph (@) {
                }, "text");
                $p->parse($src);
                $p->eof;
+               $s=~s/\[ href= \]//g; # handle self-links
                $params{src}=$s;
        }
        else {
index 4e86207f101224cfb216dfbff8609ac5973bdbd5..ce919748a4d10c6308cea7c1ea6559c47c608534 100644 (file)
@@ -60,14 +60,22 @@ sub checkconfig () {
        }
 
        if (! exists $config{filetypes_conf}) {
-               $config{filetypes_conf}= 
-                    ($data_dir ? $data_dir->getConfDir() : "/etc/highlight/")
-                         . "filetypes.conf";
+         if (! $data_dir ) {
+               $config{filetypes_conf}= "/etc/highlight/filetypes.conf";
+             } elsif ( $data_dir -> can('searchFile') ) {
+               # 3.18 +
+               $config{filetypes_conf}=
+                 $data_dir -> searchFile("filetypes.conf");
+             } else {
+               # 3.9 +
+               $config{filetypes_conf}=
+                 $data_dir -> getConfDir() . "/filetypes.conf";
+             }
        }
+       # note that this is only used for old versions of highlight
+       # where $data_dir will not be defined.
        if (! exists $config{langdefdir}) {
-               $config{langdefdir}=
-                    ($data_dir ? $data_dir->getLangPath("")
-                     : "/usr/share/highlight/langDefs");
+               $config{langdefdir}= "/usr/share/highlight/langDefs";
 
        }
        if (exists $config{tohighlight} && read_filetypes()) {
@@ -89,7 +97,7 @@ sub checkconfig () {
                                id => $file,
                                call => sub {
                                        my %params=@_;
-                                       highlight($langfile, $params{content});
+                                       highlight($langfile, $file, $params{content});
                                },
                                longname => sprintf(gettext("Source code: %s"), $file),
                                @opts,
@@ -106,7 +114,7 @@ sub htmlizeformat {
                return;
        }
 
-       return Encode::decode_utf8(highlight($langfile, shift));
+       return Encode::decode_utf8(highlight($langfile, $format, shift));
 }
 
 my %ext2lang;
@@ -147,17 +155,27 @@ sub read_filetypes () {
 }
 
 
+sub searchlangdef {
+  my $lang=shift;
+
+  if ($data_dir) {
+    return $data_dir->getLangPath($lang . ".lang");
+  } else {
+    return "$config{langdefdir}/$lang.lang";
+  }
+
+}
 # Given a filename extension, determines the language definition to
 # use to highlight it.
 sub ext2langfile ($) {
        my $ext=shift;
 
-       my $langfile="$config{langdefdir}/$ext.lang";
+       my $langfile=searchlangdef($ext);
        return $langfile if exists $highlighters{$langfile};
 
        read_filetypes() unless $filetypes_read;
        if (exists $ext2lang{$ext}) {
-               return "$config{langdefdir}/$ext2lang{$ext}.lang";
+               return searchlangdef($ext2lang{$ext});
        }
        # If a language only has one common extension, it will not
        # be listed in filetypes, so check the langfile.
@@ -172,6 +190,7 @@ sub ext2langfile ($) {
 # Interface to the highlight C library.
 sub highlight ($$) {
        my $langfile=shift;
+       my $extorfile=shift;
        my $input=shift;
 
        eval q{use highlight};
@@ -200,7 +219,7 @@ sub highlight ($$) {
                $gen=$highlighters{$langfile};
        }
 
-       return $gen->generateString($input);
+       return "<div class=\"highlight-$extorfile\">".$gen->generateString($input)."</div>";
 }
 
 1
index a58a27d5221acc50e932057b9fabaffcf38c7b97..36c012c73cdc17743231e79a24f3806151d58d20 100644 (file)
@@ -29,6 +29,7 @@ sub import {
                "irc", "ircs", "lastfm", "ldaps", "magnet", "mms",
                "msnim", "notes", "rsync", "secondlife", "skype", "ssh",
                "sftp", "smb", "sms", "snews", "webcal", "ymsgr",
+               "bitcoin", "git", "svn", "bzr", "darcs", "hg"
        );
        # data is a special case. Allow a few data:image/ types,
        # but disallow data:text/javascript and everything else.
index cb488449dd680b2ae36aefde23636ba3fdfe6ab8..76d574b2a899df7e77cb71f2a4f27ee078e76b43 100644 (file)
@@ -7,6 +7,7 @@ use strict;
 use IkiWiki 3.00;
 
 sub import {
+       hook(type => "checkconfig", id => "httpauth", call => \&checkconfig);
        hook(type => "getsetup", id => "httpauth", call => \&getsetup);
        hook(type => "auth", id => "httpauth", call => \&auth);
        hook(type => "formbuilder_setup", id => "httpauth",
@@ -37,6 +38,19 @@ sub getsetup () {
                        rebuild => 0,
                },
 }
+
+sub checkconfig () {
+       if ($config{cgi} && defined $config{cgiauthurl} &&
+           keys %{$IkiWiki::hooks{auth}} < 2) {
+               # There are no other auth hooks registered, so avoid
+               # the normal signin form, and jump right to httpauth.
+               require IkiWiki::CGI;
+               inject(name => "IkiWiki::cgi_signin", call => sub ($$) {
+                       my $cgi=shift;
+                       redir_cgiauthurl($cgi, $cgi->query_string());
+               });
+       }
+}
                        
 sub redir_cgiauthurl ($;@) {
        my $cgi=shift;
index bdab5793b7c8a611ebb4bbfb7c1ff0951218712c..f578526cc0da9fe1c369c5d1e709fe21f5154341 100644 (file)
@@ -19,14 +19,14 @@ sub import {
        hook(type => "checkconfig", id => "inline", call => \&checkconfig);
        hook(type => "sessioncgi", id => "inline", call => \&sessioncgi);
        hook(type => "preprocess", id => "inline", 
-               call => \&IkiWiki::preprocess_inline);
+               call => \&IkiWiki::preprocess_inline, scan => 1);
        hook(type => "pagetemplate", id => "inline",
                call => \&IkiWiki::pagetemplate_inline);
        hook(type => "format", id => "inline", call => \&format, first => 1);
        # Hook to change to do pinging since it's called late.
        # This ensures each page only pings once and prevents slow
        # pings interrupting page builds.
-       hook(type => "change", id => "inline", call => \&IkiWiki::pingurl);
+       hook(type => "rendered", id => "inline", call => \&IkiWiki::pingurl);
 }
 
 sub getopt () {
@@ -155,6 +155,23 @@ sub preprocess_inline (@) {
        if (! exists $params{pages} && ! exists $params{pagenames}) {
                error gettext("missing pages parameter");
        }
+
+       if (! defined wantarray) {
+               # Running in scan mode: only do the essentials
+
+               if (yesno($params{trail}) && IkiWiki::Plugin::trail->can("preprocess_trailitems")) {
+                       # default to sorting age, the same as inline itself,
+                       # but let the params override that
+                       IkiWiki::Plugin::trail::preprocess_trailitems(sort => 'age', %params);
+               }
+
+               return;
+       }
+
+       if (yesno($params{trail}) && IkiWiki::Plugin::trail->can("preprocess_trailitems")) {
+               scalar IkiWiki::Plugin::trail::preprocess_trailitems(sort => 'age', %params);
+       }
+
        my $raw=yesno($params{raw});
        my $archive=yesno($params{archive});
        my $rss=(($config{rss} || $config{allowrss}) && exists $params{rss}) ? yesno($params{rss}) : $config{rss};
@@ -169,6 +186,13 @@ sub preprocess_inline (@) {
        if (! exists $params{feedshow} && exists $params{show}) {
                $params{feedshow}=$params{show};
        }
+       my $title;
+       if (exists $params{title}) {
+               $title = $params{title};
+       }
+       else {
+               $title = $params{page} ne "index" ? pagetitle($params{page}) : $config{wikiname};
+       }
        my $desc;
        if (exists $params{description}) {
                $desc = $params{description} 
@@ -194,8 +218,7 @@ sub preprocess_inline (@) {
                        }
                }
 
-               @list = map { bestlink($params{page}, $_) }
-                       split ' ', $params{pagenames};
+               @list = split ' ', $params{pagenames};
 
                if (yesno($params{reverse})) {
                        @list=reverse(@list);
@@ -204,6 +227,8 @@ sub preprocess_inline (@) {
                foreach my $p (@list) {
                        add_depends($params{page}, $p, deptype($quick ? "presence" : "content"));
                }
+
+               @list = grep { exists $pagesources{$_} } @list;
        }
        else {
                my $num=0;
@@ -304,8 +329,12 @@ sub preprocess_inline (@) {
 
        my $ret="";
 
-       if (length $config{cgiurl} && ! $params{preview} && (exists $params{rootpage} ||
-           (exists $params{postform} && yesno($params{postform}))) &&
+       my $postform = (exists $params{rootpage});
+       if (exists $params{postform}) {
+               $postform = yesno($params{postform});
+       }
+
+       if (length $config{cgiurl} && ! $params{preview} && $postform &&
            IkiWiki->can("cgi_editpage")) {
                # Add a blog post form, with feed buttons.
                my $formtemplate=template_depends("blogpost.tmpl", $params{page}, blind_cache => 1);
@@ -366,7 +395,9 @@ sub preprocess_inline (@) {
                                        blind_cache => 1);
                        };
                        if ($@) {
-                               error sprintf(gettext("failed to process template %s"), $params{template}.".tmpl").": $@";
+                               # gettext can clobber $@
+                               my $error = $@;
+                               error sprintf(gettext("failed to process template %s"), $params{template}.".tmpl").": $error";
                        }
                }
                my $needcontent=$raw || (!($archive && $quick) && $template->query(name => 'content'));
@@ -447,7 +478,7 @@ sub preprocess_inline (@) {
                        if (! $params{preview}) {
                                writefile($rssp, $config{destdir},
                                        genfeed("rss",
-                                               $config{url}."/".$rssp, $desc, $params{guid}, $params{page}, @feedlist));
+                                               $config{url}."/".$rssp, $title, $desc, $params{guid}, $params{page}, @feedlist));
                                $toping{$params{destpage}}=1 unless $config{rebuild};
                                $feedlinks{$params{destpage}}.=qq{<link rel="alternate" type="application/rss+xml" title="$rssdesc" href="$rssurl" />};
                        }
@@ -457,7 +488,7 @@ sub preprocess_inline (@) {
                        will_render($params{destpage}, $atomp);
                        if (! $params{preview}) {
                                writefile($atomp, $config{destdir},
-                                       genfeed("atom", $config{url}."/".$atomp, $desc, $params{guid}, $params{page}, @feedlist));
+                                       genfeed("atom", $config{url}."/".$atomp, $title, $desc, $params{guid}, $params{page}, @feedlist));
                                $toping{$params{destpage}}=1 unless $config{rebuild};
                                $feedlinks{$params{destpage}}.=qq{<link rel="alternate" type="application/atom+xml" title="$atomdesc" href="$atomurl" />};
                        }
@@ -593,9 +624,30 @@ sub absolute_urls ($$) {
        return $ret;
 }
 
+sub genenclosure {
+       my $itemtemplate=shift;
+       my $url=shift;
+       my $file=shift;
+
+       return unless $itemtemplate->query(name => "enclosure");
+
+       my $size=(srcfile_stat($file))[8];
+       my $mime="unknown";
+       eval q{use File::MimeInfo};
+       if (! $@) {
+               $mime = mimetype($file);
+       }
+       $itemtemplate->param(
+               enclosure => $url,
+               type => $mime,
+               length => $size,
+       );
+}
+
 sub genfeed ($$$$$@) {
        my $feedtype=shift;
        my $feedurl=shift;
+        my $feedtitle=shift;
        my $feeddesc=shift;
        my $guid=shift;
        my $page=shift;
@@ -609,6 +661,7 @@ sub genfeed ($$$$$@) {
        foreach my $p (@pages) {
                my $u=URI->new(encode_utf8(urlto($p, "", 1)));
                my $pcontent = absolute_urls(get_inline_content($p, $page), $url);
+               my $fancy_enclosure_seen = 0;
 
                $itemtemplate->param(
                        title => pagetitle(basename($p)),
@@ -630,32 +683,23 @@ sub genfeed ($$$$$@) {
                                $itemtemplate->param(mdate_822 => date_822($pagestate{$p}{meta}{updated}));
                                $itemtemplate->param(mdate_3339 => date_3339($pagestate{$p}{meta}{updated}));
                        }
-               }
 
-               if ($itemtemplate->query(name => "enclosure")) {
-                       my $file=$pagesources{$p};
-                       my $type=pagetype($file);
-                       if (defined $type) {
-                               $itemtemplate->param(content => $pcontent);
-                       }
-                       else {
-                               my $size=(srcfile_stat($file))[8];
-                               my $mime="unknown";
-                               eval q{use File::MimeInfo};
-                               if (! $@) {
-                                       $mime = mimetype($file);
-                               }
-                               $itemtemplate->param(
-                                       enclosure => $u,
-                                       type => $mime,
-                                       length => $size,
-                               );
+                       if (exists $pagestate{$p}{meta}{enclosure}) {
+                               my $absurl = $pagestate{$p}{meta}{enclosure};
+                               my $file = $pagestate{$p}{meta}{enclosurefile};
+                               genenclosure($itemtemplate, $absurl, $file);
+                               $fancy_enclosure_seen = 1;
                        }
                }
-               else {
-                       $itemtemplate->param(content => $pcontent);
+
+               my $file=$pagesources{$p};
+               unless ($fancy_enclosure_seen || defined(pagetype($file))) {
+                       genenclosure($itemtemplate, $u, $file);
+                       $itemtemplate->param(simplepodcast => 1);
                }
 
+               $itemtemplate->param(content => $pcontent);
+
                run_hooks(pagetemplate => sub {
                        shift->(page => $p, destpage => $page,
                                template => $itemtemplate);
@@ -669,13 +713,14 @@ sub genfeed ($$$$$@) {
 
        my $template=template_depends($feedtype."page.tmpl", $page, blind_cache => 1);
        $template->param(
-               title => $page ne "index" ? pagetitle($page) : $config{wikiname},
+               title => $feedtitle,
                wikiname => $config{wikiname},
                pageurl => $url,
                content => $content,
                feeddesc => $feeddesc,
                guid => $guid,
                feeddate => date_3339($lasttime),
+               feeddate_822 => date_822($lasttime),
                feedurl => $feedurl,
        );
        run_hooks(pagetemplate => sub {
index ef01f110702228fb71356d7d76437161f134b156..1ba28eafd6d4912f16d8aa7fa5c16e01ca9f8dea 100644 (file)
@@ -144,9 +144,9 @@ sub renamepage (@) {
        my $old=$params{oldpage};
        my $new=$params{newpage};
 
-       $params{content} =~ s{(?<!\\)$link_regexp}{
-               if (! is_externallink($page, $2, $3)) {
-                       my $linktext=$2;
+       $params{content} =~ s{(?<!\\)($link_regexp)}{
+               if (! is_externallink($page, $3, $4)) {
+                       my $linktext=$3;
                        my $link=$linktext;
                        if (bestlink($page, linkpage($linktext)) eq $old) {
                                $link=pagetitle($new, 1);
@@ -161,9 +161,12 @@ sub renamepage (@) {
                                        $link="/$link";
                                }
                        }
-                       defined $1
-                               ? ( "[[$1|$link".($3 ? "#$3" : "")."]]" )
-                               : ( "[[$link".   ($3 ? "#$3" : "")."]]" )
+                       defined $2
+                               ? ( "[[$2|$link".($4 ? "#$4" : "")."]]" )
+                               : ( "[[$link".   ($4 ? "#$4" : "")."]]" )
+               }
+               else {
+                       $1
                }
        }eg;
 
index 38f090ff782f8799edbe074b9778477809f9d045..4a9bf58dbc1a446ae72f37f13089af05fdc7b221 100644 (file)
@@ -72,6 +72,9 @@ sub preprocess (@) {
                $common_prefix=IkiWiki::dirname($common_prefix);
        }
 
+       # Set this to 1 or more spaces to pretty-print maps for debugging
+       my $spaces = "";
+
        # Create the map.
        my $parent="";
        my $indent=0;
@@ -94,33 +97,37 @@ sub preprocess (@) {
                        if defined $common_prefix && length $common_prefix;
                my $depth = ($item =~ tr/\//\//) + 1;
                my $baseitem=IkiWiki::dirname($item);
-               my $parentbase=IkiWiki::dirname($parent);
-               while (length $parentbase && length $baseitem && $baseitem !~ /^\Q$parentbase\E(\/|$)/) {
-                       $parentbase=IkiWiki::dirname($parentbase);
+               while (length $parent && length $baseitem && $baseitem !~ /^\Q$parent\E(\/|$)/) {
+                       $parent=IkiWiki::dirname($parent);
                        last if length $addparent && $baseitem =~ /^\Q$addparent\E(\/|$)/;
                        $addparent="";
-                       $indent--;
-                       $map .= "</li>\n";
-                       if ($indent > 0) {
-                               $map .= "</ul>\n";
+                       $map .= ($spaces x $indent) . "</li>\n";
+                       if ($indent > 1) {
+                               $map .= ($spaces x $indent) . "</ul><map:collapse>\n";
                        }
+                       $indent--;
                }
                while ($depth < $indent) {
-                       $indent--;
-                       $map .= "</li>\n";
-                       if ($indent > 0) {
-                               $map .= "</ul>\n";
+                       $map .= ($spaces x $indent) . "</li>\n";
+                       if ($indent > 1) {
+                               $map .= ($spaces x $indent) . "</ul>\n";
                        }
+                       $indent--;
                }
                my @bits=split("/", $item);
                my $p="";
-               $indent++  unless length $parent;
                $p.="/".shift(@bits) for 1..$indent;
                while ($depth > $indent) {
-                       if (@bits && !(length $parent && "/$parent" eq $p)) {
+                       $indent++;
+                       if ($indent > 1) {
+                               $map .= ($spaces x $indent) . "<ul><map:collapse>\n";
+                       }
+                       if ($depth > $indent) {
+                               $p.="/".shift(@bits);
                                $addparent=$p;
                                $addparent=~s/^\///;
-                               $map .= "<li>"
+                               $map .= ($spaces x $indent) . "<li>\n";
+                               $map .= ($spaces x $indent)
                                        .htmllink($params{page}, $params{destpage},
                                                 "/".$common_prefix.$p, class => "mapparent",
                                                 noimageinline => 1)
@@ -130,14 +137,10 @@ sub preprocess (@) {
                        else {
                                $openli=0;
                        }
-                       $indent++;
-                       $p.="/".shift(@bits) if @bits;
-                       if ($indent > 1) {
-                               $map .= "<ul>\n";
-                       }
                }
-               $map .= "</li>\n" if $openli;
-               $map .= "<li>"
+               $map .= ($spaces x $indent) . "</li>\n" if $openli;
+               $map .= ($spaces x $indent) . "<li>\n";
+               $map .= ($spaces x $indent)
                        .htmllink($params{page}, $params{destpage}, 
                                "/".$common_prefix."/".$item,
                                @linktext,
@@ -147,9 +150,12 @@ sub preprocess (@) {
                $parent=$item;
        }
        while ($indent > 0) {
+               $map .= ($spaces x $indent) . "</li>\n";
                $indent--;
-               $map .= "</li>\n</ul>\n";
+               $map .= ($spaces x $indent) . "</ul>\n";
        }
+       $map =~ s{\n *</ul><map:collapse>\n *<ul><map:collapse>\n}{\n}gs;
+       $map =~ s{<map:collapse>}{}g;
        $map .= "</div>\n";
        return $map;
 }
index 430194bffdcc6444f34036709d9dc3767187af85..014e78eea124604e249d35d42a6b9ccf6524c254 100644 (file)
@@ -92,8 +92,9 @@ sub htmlize (@) {
                                        $markdown_sub=\&Markdown::Markdown;
                                }
                                else {
+                                       my $error = $@;
                                        do "/usr/bin/markdown" ||
-                                               error(sprintf(gettext("failed to load Markdown.pm perl module (%s) or /usr/bin/markdown (%s)"), $@, $!));
+                                               error(sprintf(gettext("failed to load Markdown.pm perl module (%s) or /usr/bin/markdown (%s)"), $error, $!));
                                        $markdown_sub=\&Markdown::Markdown;
                                }
                        }
index 220fff9dccaa547824ccb0bc7a19ddbe583f516d..e7b96bdf142f47e221e321b4ecb8ce68ab4989f8 100644 (file)
@@ -107,12 +107,12 @@ sub preprocess (@) {
                # fallthrough
        }
        elsif ($key eq 'license') {
-               push @{$metaheaders{$page}}, '<link rel="license" href="#page_license" />';
+               push @{$metaheaders{$page}}, '<link rel="license" href="#pagelicense" />';
                $pagestate{$page}{meta}{license}=$value;
                return "";
        }
        elsif ($key eq 'copyright') {
-               push @{$metaheaders{$page}}, '<link rel="copyright" href="#page_copyright" />';
+               push @{$metaheaders{$page}}, '<link rel="copyright" href="#pagecopyright" />';
                $pagestate{$page}{meta}{copyright}=$value;
                return "";
        }
@@ -121,6 +121,18 @@ sub preprocess (@) {
                add_link($page, $value);
                return "";
        }
+       elsif ($key eq 'enclosure') {
+               my $link=bestlink($page, $value);
+               if (! length $link) {
+                       error gettext("enclosure not found")
+               }
+               add_depends($page, $link, deptype("presence"));
+
+               $value=urlto($link, $page, 1);
+               $pagestate{$page}{meta}{enclosure}=$value;
+               $pagestate{$page}{meta}{enclosurefile}=$link;
+               # fallthrough
+       }
        elsif ($key eq 'author') {
                $pagestate{$page}{meta}{author}=$value;
                if (exists $params{sortas}) {
@@ -275,17 +287,23 @@ sub preprocess (@) {
                push @{$metaheaders{$page}}, '<meta name="robots"'.
                        ' content="'.encode_entities($value).'" />';
        }
-       elsif ($key eq 'description') {
-               push @{$metaheaders{$page}}, '<meta name="'.
-                       encode_entities($key).
+       elsif ($key eq 'description' || $key eq 'author') {
+               push @{$metaheaders{$page}}, '<meta name="'.$key.
                        '" content="'.encode_entities($value).'" />';
        }
        elsif ($key eq 'name') {
-               push @{$metaheaders{$page}}, scrub('<meta '.$key.'="'.
+               push @{$metaheaders{$page}}, scrub('<meta name="'.
                        encode_entities($value).
                        join(' ', map { "$_=\"$params{$_}\"" } keys %params).
                        ' />', $page, $destpage);
        }
+       elsif ($key eq 'keywords') {
+               # Make sure the keyword string is safe: only allow alphanumeric
+               # characters, space and comma and strip the rest.
+               $value =~ s/[^[:alnum:], ]+//g;
+               push @{$metaheaders{$page}}, '<meta name="keywords"'.
+                       ' content="'.encode_entities($value).'" />';
+       }
        else {
                push @{$metaheaders{$page}}, scrub('<meta name="'.
                        encode_entities($key).'" content="'.
@@ -312,8 +330,13 @@ sub pagetemplate (@) {
                $template->param(title_overridden => 1);
        }
 
-       foreach my $field (qw{author authorurl}) {
-               $template->param($field => $pagestate{$page}{meta}{$field})
+       if (exists $pagestate{$page}{meta}{enclosure}) {
+               $template->param(enclosure => HTML::Entities::encode_entities(IkiWiki::urlabs($pagestate{$page}{meta}{enclosure}, $config{url})));
+       }
+
+       foreach my $field (qw{authorurl}) {
+               eval q{use HTML::Entities};
+               $template->param($field => HTML::Entities::encode_entities($pagestate{$page}{meta}{$field}))
                        if exists $pagestate{$page}{meta}{$field} && $template->query(name => $field);
        }
 
@@ -324,7 +347,7 @@ sub pagetemplate (@) {
                }
        }
 
-       foreach my $field (qw{description}) {
+       foreach my $field (qw{description author}) {
                eval q{use HTML::Entities};
                $template->param($field => HTML::Entities::encode_numeric($pagestate{$page}{meta}{$field}))
                        if exists $pagestate{$page}{meta}{$field} && $template->query(name => $field);
index f54d94ad52366110e29f20575672bcd0fcc4413c..b7e53248500d8a31337e582e81d24a5870ebb074 100644 (file)
@@ -24,6 +24,19 @@ sub getsetup () {
                        safe => 1,
                        rebuild => 1,
                },
+               mirrorlist_use_cgi => {
+                       type => 'boolean',
+                       example => 1,
+                       description => "generate links that point to the mirrors' ikiwiki CGI",
+                       safe => 1,
+                       rebuild => 1,
+               },
+}
+
+sub checkconfig () {
+       if (! defined $config{mirrorlist_use_cgi}) {
+               $config{mirrorlist_use_cgi}=0;
+       }
 }
 
 sub pagetemplate (@) {
@@ -46,7 +59,9 @@ sub mirrorlist ($) {
                join(", ",
                        map { 
                                qq{<a href="}.
-                               $config{mirrorlist}->{$_}."/".urlto($page, "").
+                               ( $config{mirrorlist_use_cgi} ?
+                                 $config{mirrorlist}->{$_}."?do=goto&page=$page" :
+                                 $config{mirrorlist}->{$_}."/".urlto($page, "") ).
                                qq{">$_</a>}
                        } keys %{$config{mirrorlist}}
                ).
diff --git a/IkiWiki/Plugin/notifyemail.pm b/IkiWiki/Plugin/notifyemail.pm
new file mode 100644 (file)
index 0000000..b50a22a
--- /dev/null
@@ -0,0 +1,169 @@
+#!/usr/bin/perl
+package IkiWiki::Plugin::notifyemail;
+
+use warnings;
+use strict;
+use IkiWiki 3.00;
+
+sub import {
+       hook(type => "formbuilder", id => "notifyemail", call => \&formbuilder);
+       hook(type => "getsetup", id => "notifyemail",  call => \&getsetup);
+       hook(type => "changes", id => "notifyemail", call => \&notify);
+}
+
+sub getsetup () {
+       return
+               plugin => {
+                       safe => 1,
+                       rebuild => 0,
+               },
+}
+
+sub formbuilder (@) {
+       my %params=@_;
+       my $form=$params{form};
+       return unless $form->title eq "preferences";
+       my $session=$params{session};
+       my $username=$session->param("name");
+       $form->field(name => "subscriptions", size => 50,
+               fieldset => "preferences",
+               comment => "(".htmllink("", "", "ikiwiki/PageSpec", noimageinline => 1).")");
+       if (! $form->submitted) {
+               $form->field(name => "subscriptions", force => 1,
+                       value => getsubscriptions($username));
+       }
+       elsif ($form->submitted eq "Save Preferences" && $form->validate &&
+              defined $form->field("subscriptions")) {
+               setsubscriptions($username, $form->field('subscriptions'));
+       }
+}
+
+sub getsubscriptions ($) {
+       my $user=shift;
+       eval q{use IkiWiki::UserInfo};
+       error $@ if $@;
+       IkiWiki::userinfo_get($user, "subscriptions");
+}
+
+sub setsubscriptions ($$) {
+       my $user=shift;
+       my $subscriptions=shift;
+       eval q{use IkiWiki::UserInfo};
+       error $@ if $@;
+       IkiWiki::userinfo_set($user, "subscriptions", $subscriptions);
+}
+
+# Called by other plugins to subscribe the user to a pagespec.
+sub subscribe ($$) {
+       my $user=shift;
+       my $addpagespec=shift;
+       my $pagespec=getsubscriptions($user);
+       setsubscriptions($user,
+               length $pagespec ? $pagespec." or ".$addpagespec : $addpagespec);
+}
+
+# Called by other plugins to subscribe an email to a pagespec.
+sub anonsubscribe ($$) {
+       my $email=shift;
+       my $addpagespec=shift;
+       if (IkiWiki::Plugin::passwordauth->can("anonuser")) {
+               my $user=IkiWiki::Plugin::passwordauth::anonuser($email);
+               if (! defined $user) {
+                       error(gettext("Cannot subscribe your email address without logging in."));
+               }
+               subscribe($user, $addpagespec);
+       }
+}
+
+sub notify (@) {
+       my @files=@_;
+       return unless @files;
+       return if $config{rebuild};
+
+       eval q{use Mail::Sendmail};
+       error $@ if $@;
+       eval q{use IkiWiki::UserInfo};
+       error $@ if $@;
+       eval q{use URI};
+       error($@) if $@;
+
+       # Daemonize, in case the mail sending takes a while.
+       defined(my $pid = fork) or error("Can't fork: $!");
+       return if $pid; # parent
+       chdir '/';
+       open STDIN, '/dev/null';
+       open STDOUT, '>/dev/null';
+       POSIX::setsid() or error("Can't start a new session: $!");
+       open STDERR, '>&STDOUT' or error("Can't dup stdout: $!");
+
+       # Don't need to keep a lock on the wiki as a daemon.
+       IkiWiki::unlockwiki();
+
+       my $userinfo=IkiWiki::userinfo_retrieve();
+       exit 0 unless defined $userinfo;
+
+       foreach my $user (keys %$userinfo) {
+               my $pagespec=$userinfo->{$user}->{"subscriptions"};
+               next unless defined $pagespec && length $pagespec;
+               my $email=$userinfo->{$user}->{email};
+               next unless defined $email && length $email;
+
+               foreach my $file (@files) {
+                       my $page=pagename($file);
+                       next unless pagespec_match($page, $pagespec);
+                       my $content="";
+                       my $showcontent=defined pagetype($file);
+                       if ($showcontent) {
+                               $content=eval { readfile(srcfile($file)) };
+                               $showcontent=0 if $@;
+                       }
+                       my $url;
+                       if (! IkiWiki::isinternal($page)) {
+                               $url=urlto($page, undef, 1);
+                       }
+                       elsif (defined $pagestate{$page}{meta}{permalink}) {
+                               # need to use permalink for an internal page
+                               $url=URI->new_abs($pagestate{$page}{meta}{permalink}, $config{url});
+                       }
+                       else {
+                               $url=$config{url}; # crummy fallback url
+                       }
+                       my $pagedesc=$page;
+                       if (defined $pagestate{$page}{meta}{title} &&
+                           length $pagestate{$page}{meta}{title}) {
+                               $pagedesc=qq{"$pagestate{$page}{meta}{title}"};
+                       }
+                       my $subject=gettext("change notification:")." ".$pagedesc;
+                       if (pagetype($file) eq '_comment') {
+                               $subject=gettext("comment notification:")." ".$pagedesc;
+                       }
+                       my $prefsurl=IkiWiki::cgiurl_abs(do => 'prefs');
+                       if (IkiWiki::Plugin::passwordauth->can("anonusertoken")) {
+                               my $token=IkiWiki::Plugin::passwordauth::anonusertoken($userinfo->{$user});
+                               $prefsurl=IkiWiki::cgiurl_abs(
+                                       do => 'tokenauth',
+                                       name => $user,
+                                       token => $token,
+                               ) if defined $token;
+                       }
+                       my $template=template("notifyemail.tmpl");
+                       $template->param(
+                               wikiname => $config{wikiname},
+                               url => $url,
+                               prefsurl => $prefsurl,
+                               showcontent => $showcontent,
+                               content => $content,
+                       );
+                       sendmail(
+                               To => $email,
+                               From => "$config{wikiname} <$config{adminemail}>",
+                               Subject => $subject,
+                               Message => $template->output,
+                       );
+               }
+       }
+
+       exit 0; # daemon child
+}
+
+1
index 2805f60efdb6d415a19aeb17195df8ff2543487b..808d3cd2bd730c3847a876e016df9145c4bb32a9 100644 (file)
@@ -25,7 +25,7 @@ sub canedit ($$) {
        my $cgi=shift;
        my $session=shift;
 
-       return "" if $page=~/(\/|^)\Q$config{discussionpage}\E$/i;
+       return "" if $config{discussion} && $page=~/(\/|^)\Q$config{discussionpage}\E$/i;
        return "" if pagespec_match($page, "postcomment(*)");
        return undef;
 }
index b6642619ac29330944da4af8b3e3c90ffcf21e9a..3b96e4b8e411c5f29afc25b58e15cdfd9f70121d 100644 (file)
@@ -100,9 +100,10 @@ sub formbuilder_setup (@) {
               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");
+                       value => "", 
+                       size => 1, force => 1,
+                       fieldset => "login",
+                       comment => $session->param("name"));
                $form->field(name => "email", type => "hidden");
        }
 }
@@ -155,8 +156,8 @@ sub validate ($$$;$) {
        $trust_root=$cgiurl if ! defined $trust_root;
 
        my $check_url = $claimed_identity->check_url(
-               return_to => "$cgiurl?do=postsignin",
-               trust_root => $trust_root,
+               return_to => auto_upgrade_https($q, "$cgiurl?do=postsignin"),
+               trust_root => auto_upgrade_https($q, $trust_root),
                delayed_return => 1,
        );
        # Redirect the user to the OpenID server, which will
@@ -237,10 +238,10 @@ sub getobj ($$) {
        my $ua;
        eval q{use LWPx::ParanoidAgent};
        if (! $@) {
-               $ua=LWPx::ParanoidAgent->new;
+               $ua=LWPx::ParanoidAgent->new(agent => $config{useragent});
        }
        else {
-               $ua=LWP::UserAgent->new;
+               $ua=useragent();
        }
 
        # Store the secret in the session.
@@ -257,10 +258,19 @@ sub getobj ($$) {
                ua => $ua,
                args => $q,
                consumer_secret => sub { return shift()+$secret },
-               required_root => $cgiurl,
+               required_root => auto_upgrade_https($q, $cgiurl),
        );
 }
 
+sub auto_upgrade_https {
+       my $q=shift;
+       my $url=shift;
+       if ($q->https()) {
+               $url=~s/^http:/https:/i;
+       }
+       return $url;
+}
+
 sub load_openid_module {
        # Give up if module is unavailable to avoid needing to depend on it.
        eval q{use Net::OpenID::Consumer};
index be499495c4f7e65722773c73974b12e8eba3fcb2..472e26945a75575215218294c2a01cc68748bbf3 100644 (file)
@@ -60,37 +60,66 @@ sub getsetup () {
                        safe => 0,
                        rebuild => 1,
                },
+               osm_openlayers_url => {
+                       type => "string",
+                       example => "http://www.openlayers.org/api/OpenLayers.js",
+                       description => "Url for the OpenLayers.js file",
+                       safe => 0,
+                       rebuild => 1,
+               },
+               osm_layers => {
+                       type => "string",
+                       example => { 'OSM', 'GoogleSatellite' },
+                       description => "Layers to use in the map. Can be either the 'OSM' string or a type option for Google maps (GoogleNormal, GoogleSatellite, GoogleHybrid or GooglePhysical). It can also be an arbitrary URL in a syntax acceptable for OpenLayers.Layer.OSM.url parameter.",
+                       safe => 0,
+                       rebuild => 1,
+               },
+               osm_google_apikey => {
+                       type => "string",
+                       example => "",
+                       description => "Google maps API key, Google layer not used if missing, see https://code.google.com/apis/console/ to get an API key",
+                       safe => 1,
+                       rebuild => 1,
+               },
+}
+
+sub register_rendered_files {
+       my $map = shift;
+       my $page = shift;
+       my $dest = shift;
+
+       if ($page eq $dest) {
+               my %formats = get_formats();
+               if ($formats{'GeoJSON'}) {
+                       will_render($page, "$map/pois.json");
+               }
+               if ($formats{'CSV'}) {
+                       will_render($page, "$map/pois.txt");
+               }
+               if ($formats{'KML'}) {
+                       will_render($page, "$map/pois.kml");
+               }
+       }
 }
 
 sub preprocess {
        my %params=@_;
-       my $page = $params{'page'};
-       my $dest = $params{'destpage'};
-       my $loc = $params{'loc'}; # sanitized below
-       my $lat = $params{'lat'}; # sanitized below
-       my $lon = $params{'lon'}; # sanitized below
-       my $href = $params{'href'};
+       my $page = $params{page};
+       my $dest = $params{destpage};
+       my $loc = $params{loc}; # sanitized below
+       my $lat = $params{lat}; # sanitized below
+       my $lon = $params{lon}; # sanitized below
+       my $href = $params{href};
 
-       my $fullscreen = defined($params{'fullscreen'}); # sanitized here
        my ($width, $height, $float);
-       if ($fullscreen) {
-               $height = '100%';
-               $width = '100%';
-               $float = 0;
-       }
-       else {
-               $height = scrub($params{'height'} || "300px", $page, $dest); # sanitized here
-               $width = scrub($params{'width'} || "500px", $page, $dest); # sanitized here
-               $float = (defined($params{'right'}) && 'right') || (defined($params{'left'}) && 'left'); # sanitized here
-       }
+       $height = scrub($params{'height'} || "300px", $page, $dest); # sanitized here
+       $width = scrub($params{'width'} || "500px", $page, $dest); # sanitized here
+       $float = (defined($params{'right'}) && 'right') || (defined($params{'left'}) && 'left'); # sanitized here
+       
        my $zoom = scrub($params{'zoom'} // $config{'osm_default_zoom'} // 15, $page, $dest); # sanitized below
        my $map;
-       if ($fullscreen) {
-               $map = $params{'map'} || $page;
-       }
-       else {
-               $map = $params{'map'} || 'map';
-       }
+       $map = $params{'map'} || 'map';
+       
        $map = scrub($map, $page, $dest); # sanitized here
        my $name = scrub($params{'name'} || $map, $page, $dest);
 
@@ -101,16 +130,27 @@ sub preprocess {
        if ($zoom !~ /^\d\d?$/ || $zoom < 2 || $zoom > 18) {
                error("Bad zoom");
        }
+
+       if (! defined $href || ! length $href) {
+               $href=IkiWiki::cgiurl(
+                       do => "osm",
+                       map => $map,
+               );
+       }
+
+       register_rendered_files($map, $page, $dest);
+
        $pagestate{$page}{'osm'}{$map}{'displays'}{$name} = {
                height => $height,
                width => $width,
                float => $float,
                zoom => $zoom,
-               fullscreen => $fullscreen,
+               fullscreen => 0,
                editable => defined($params{'editable'}),
                lat => $lat,
                lon => $lon,
                href => $href,
+               google_apikey => $config{'osm_google_apikey'},
        };
        return "<div id=\"mapdiv-$name\"></div>";
 }
@@ -152,33 +192,9 @@ sub process_waypoint {
                }
        }
        $icon = urlto($icon, $dest, 1);
+       $icon =~ s!/*$!!; # hack - urlto shouldn't be appending a slash in the first place
        $tag = '' unless $tag;
-       if ($page eq $dest) {
-               if (!defined($config{'osm_format'}) || !$config{'osm_format'}) {
-                       $config{'osm_format'} = 'KML';
-               }
-               my %formats = map { $_ => 1 } split(/, */, $config{'osm_format'});
-               if ($formats{'GeoJSON'}) {
-                       will_render($page,$config{destdir} . "/$map/pois.json");
-               }
-               if ($formats{'CSV'}) {
-                       will_render($page,$config{destdir} . "/$map/pois.txt");
-               }
-               if ($formats{'KML'}) {
-                       will_render($page,$config{destdir} . "/$map/pois.kml");
-               }
-       }
-       my $href = IkiWiki::cgiurl(
-               do => "osm",
-               map => $map,
-               lat => $lat,
-               lon => $lon,
-               zoom => $zoom,
-       );
-       if (defined($destsources{htmlpage($map)})) {
-               $href = urlto($map,$page) . "?lat=$lat&amp;lon=$lon&amp;zoom=$zoom";
-               $href =~ s!&!&amp;!g;
-       }
+       register_rendered_files($map, $page, $dest);
        $pagestate{$page}{'osm'}{$map}{'waypoints'}{$name} = {
                page => $page,
                desc => $desc,
@@ -186,18 +202,28 @@ sub process_waypoint {
                tag => $tag,
                lat => $lat,
                lon => $lon,
-               # how to link back to the page from the map, not to be
+               # How to link back to the page from the map, not to be
                # confused with the URL of the map itself sent to the
-               # embeded map below
-               href => urlto($page,$map),
+               # embeded map below. Note: used in generated KML etc file,
+               # so must be absolute.
+               href => urlto($page),
        };
+
+       my $mapurl = IkiWiki::cgiurl(
+               do => "osm",
+               map => $map,
+               lat => $lat,
+               lon => $lon,
+               zoom => $zoom,
+       );
        my $output = '';
        if (defined($params{'embed'})) {
-               $params{'href'} = $href; # propagate down to embeded
-               $output .= preprocess(%params);
+               $output .= preprocess(%params,
+                       href => $mapurl,
+               );
        }
        if (!$hidden) {
-               $output .= "<a href=\"$href\"><img class=\"img\" src=\"$icon\" $alt /></a>";
+               $output .= "<a href=\"$mapurl\"><img class=\"img\" src=\"$icon\" $alt /></a>";
        }
        return $output;
 }
@@ -292,10 +318,7 @@ sub savestate {
                }
        }
 
-       if (!defined($config{'osm_format'}) || !$config{'osm_format'}) {
-               $config{'osm_format'} = 'KML';
-       }
-       my %formats = map { $_ => 1 } split(/, */, $config{'osm_format'});
+       my %formats = get_formats();
        if ($formats{'GeoJSON'}) {
                writejson(\%waypoints, \%linestrings);
        }
@@ -335,59 +358,31 @@ sub writekml($;$) {
        eval q{use XML::Writer};
        error $@ if $@;
        foreach my $map (keys %waypoints) {
-
-=pod
-Sample placemark:
-
-<?xml version="1.0" encoding="UTF-8"?>
-<kml xmlns="http://www.opengis.net/kml/2.2">
-  <Placemark>
-    <name>Simple placemark</name>
-    <description>Attached to the ground. Intelligently places itself 
-       at the height of the underlying terrain.</description>
-    <Point>
-      <coordinates>-122.0822035425683,37.42228990140251,0</coordinates>
-    </Point>
-  </Placemark>
-</kml>
-
-Sample style:
-
-
-        <Style id="sh_sunny_copy69">
-                <IconStyle>
-                        <scale>1.4</scale>
-                        <Icon>
-                                <href>http://waypoints.google.com/mapfiles/kml/shapes/sunny.png</href>
-                        </Icon>
-                        <hotSpot x="0.5" y="0.5" xunits="fraction" yunits="fraction"/>
-                </IconStyle>
-                <LabelStyle>
-                        <color>ff00aaff</color>
-                </LabelStyle>
-        </Style>
-
-
-=cut
-
                my $output;
                my $writer = XML::Writer->new( OUTPUT => \$output,
-                       DATA_MODE => 1, ENCODING => 'UTF-8');
+                       DATA_MODE => 1, DATA_INDENT => ' ', ENCODING => 'UTF-8');
                $writer->xmlDecl();
                $writer->startTag("kml", "xmlns" => "http://www.opengis.net/kml/2.2");
+               $writer->startTag("Document");
 
                # first pass: get the icons
+               my %tags_map = (); # keep track of tags seen
                foreach my $name (keys %{$waypoints{$map}}) {
                        my %options = %{$waypoints{$map}{$name}};
-                       $writer->startTag("Style", id => $options{tag});
-                       $writer->startTag("IconStyle");
-                       $writer->startTag("Icon");
-                       $writer->startTag("href");
-                       $writer->characters($options{icon});
-                       $writer->endTag();
-                       $writer->endTag();
-                       $writer->endTag();
-                       $writer->endTag();
+                       if (!$tags_map{$options{tag}}) {
+                           debug("found new style " . $options{tag});
+                           $tags_map{$options{tag}} = ();
+                           $writer->startTag("Style", id => $options{tag});
+                           $writer->startTag("IconStyle");
+                           $writer->startTag("Icon");
+                           $writer->startTag("href");
+                           $writer->characters($options{icon});
+                           $writer->endTag();
+                           $writer->endTag();
+                           $writer->endTag();
+                           $writer->endTag();
+                       }
+                       $tags_map{$options{tag}}{$name} = \%options;
                }
        
                foreach my $name (keys %{$waypoints{$map}}) {
@@ -434,9 +429,10 @@ Sample style:
                        $writer->endTag();
                }
                $writer->endTag();
+               $writer->endTag();
                $writer->end();
 
-               writefile("pois.kmp", $config{destdir} . "/$map", $output);
+               writefile("pois.kml", $config{destdir} . "/$map", $output);
        }
 }
 
@@ -484,7 +480,7 @@ sub format (@) {
        return $params{content};
 }
 
-sub prefered_format() {
+sub preferred_format() {
        if (!defined($config{'osm_format'}) || !$config{'osm_format'}) {
                $config{'osm_format'} = 'KML';
        }
@@ -492,24 +488,26 @@ sub prefered_format() {
        return shift @spl;
 }
 
+sub get_formats() {
+       if (!defined($config{'osm_format'}) || !$config{'osm_format'}) {
+               $config{'osm_format'} = 'KML';
+       }
+       map { $_ => 1 } split(/, */, $config{'osm_format'});
+}
+
 sub include_javascript ($) {
        my $page=shift;
        my $loader;
 
-       eval q{use JSON};
-       error $@ if $@;
        if (exists $pagestate{$page}{'osm'}) {
                foreach my $map (keys %{$pagestate{$page}{'osm'}}) {
                        foreach my $name (keys %{$pagestate{$page}{'osm'}{$map}{'displays'}}) {
-                               my %options = %{$pagestate{$page}{'osm'}{$map}{'displays'}{$name}};
-                               $options{'map'} = $map;
-                               $options{'format'} = prefered_format();
-                               $loader .= "mapsetup(\"mapdiv-$name\", " . to_json(\%options) . ");\n";
+                               $loader .= map_setup_code($map, $name, %{$pagestate{$page}{'osm'}{$map}{'displays'}{$name}});
                        }
                }
        }
        if ($loader) {
-               return embed_map_code($page) . "<script type=\"text/javascript\" charset=\"utf-8\">$loader</script>";
+               return embed_map_code($page) . "<script type=\"text/javascript\">$loader</script>";
        }
        else {
                return '';
@@ -521,6 +519,8 @@ sub cgi($) {
 
        return unless defined $cgi->param('do') &&
                $cgi->param("do") eq "osm";
+       
+       IkiWiki::loadindex();
 
        IkiWiki::decode_cgi_utf8($cgi);
 
@@ -534,7 +534,16 @@ sub cgi($) {
        print "<html><body>";
        print "<div id=\"mapdiv-$map\"></div>";
        print embed_map_code();
-       print "<script type=\"text/javascript\" charset=\"utf-8\">mapsetup( 'mapdiv-$map', { 'map': '$map', 'lat': urlParams['lat'], 'lon': urlParams['lon'], 'zoom': urlParams['zoom'], 'fullscreen': 1, 'editable': 1, 'format': '" . prefered_format() . "'});</script>";
+       print "<script type=\"text/javascript\">";
+       print map_setup_code($map, $map,
+               lat => "urlParams['lat']",
+               lon => "urlParams['lon']",
+               zoom => "urlParams['zoom']",
+               fullscreen => 1,
+               editable => 1,
+               google_apikey => $config{'osm_google_apikey'},
+       );
+       print "</script>";
        print "</body></html>";
 
        exit 0;
@@ -542,9 +551,46 @@ sub cgi($) {
 
 sub embed_map_code(;$) {
        my $page=shift;
-       return '<script src="http://www.openlayers.org/api/OpenLayers.js" type="text/javascript" charset="utf-8"></script>'.
+       my $olurl = $config{osm_openlayers_url} || "http://www.openlayers.org/api/OpenLayers.js";
+       my $code = '<script src="'.$olurl.'" type="text/javascript" charset="utf-8"></script>'."\n".
                '<script src="'.urlto("ikiwiki/osm.js", $page).
                '" type="text/javascript" charset="utf-8"></script>'."\n";
+       if ($config{'osm_google_apikey'}) {
+           $code .= '<script src="http://maps.google.com/maps?file=api&amp;v=2&amp;key='.$config{'osm_google_apikey'}.'&sensor=false" type="text/javascript" charset="utf-8"></script>';
+       }
+       return $code;
+}
+
+sub map_setup_code($;@) {
+       my $map=shift;
+       my $name=shift;
+       my %options=@_;
+
+       my $mapurl = $config{osm_map_url};
+
+       eval q{use JSON};
+       error $@ if $@;
+                               
+       $options{'format'} = preferred_format();
+
+       my %formats = get_formats();
+       if ($formats{'GeoJSON'}) {
+               $options{'jsonurl'} = urlto($map."/pois.json");
+       }
+       if ($formats{'CSV'}) {
+               $options{'csvurl'} = urlto($map."/pois.txt");
+       }
+       if ($formats{'KML'}) {
+               $options{'kmlurl'} = urlto($map."/pois.kml");
+       }
+
+       if ($mapurl) {
+               $options{'mapurl'} = $mapurl;
+       }
+        $options{'layers'} = $config{osm_layers};
+
+       $name=~s/'//g; # $name comes from user input
+       return "mapsetup('mapdiv-$name', " . to_json(\%options) . ");";
 }
 
 1;
index 35ebd961f53e8da8e2a012d970f8d309d135a307..0cf2a26ea99380b6dd395824945bfcebd42c33b9 100644 (file)
@@ -96,6 +96,72 @@ sub setpassword ($$;$) {
        else {
                IkiWiki::userinfo_set($user, $field, $password);
        }
+
+       # Setting the password clears any passwordless login token.
+       if ($field ne 'passwordless') {
+               IkiWiki::userinfo_set($user, "passwordless", "");
+       }
+}
+
+# Generates a token that can be used to log the user in.
+# This needs to be hard to guess. Generating a cgi session id will
+# make it as hard to guess as any cgi session.
+sub gentoken ($$;$) {
+       my $user=shift;
+       my $tokenfield=shift;
+       my $reversable=shift;
+
+       eval q{use CGI::Session};
+       error($@) if $@;
+       my $token = CGI::Session->new->id;
+       if (! $reversable) {
+               setpassword($user, $token, $tokenfield);
+       }
+       else {
+               IkiWiki::userinfo_set($user, $tokenfield, $token);
+       }
+       return $token;
+}
+
+# An anonymous user has no normal password, only a passwordless login
+# token. Given an email address, this sets up such a user for that email,
+# unless one already exists, and returns the username.
+sub anonuser ($) {
+       my $email=shift;
+
+       # Want a username for this email that won't overlap with any other.
+       my $user=$email;
+       $user=~s/@/_/g;
+
+       my $userinfo=IkiWiki::userinfo_retrieve();
+       if (! exists $userinfo->{$user} || ! ref $userinfo->{$user}) {
+               if (IkiWiki::userinfo_setall($user, {
+                       'email' => $email,
+                       'regdate' => time})) {
+                       gentoken($user, "passwordless", 1);
+                       return $user;
+               }
+               else {
+                       error(gettext("Error creating account."));
+               }
+       }
+       elsif (defined anonusertoken($userinfo->{$user})) {
+               return $user;
+       }
+       else {
+               return undef;
+       }
+}
+
+sub anonusertoken ($) {
+       my $userhash=shift;
+       if (exists $userhash->{passwordless} &&
+           length $userhash->{passwordless}) {
+               return $userhash->{passwordless};
+       }
+       else {
+               return undef;
+       }
 }
 
 sub formbuilder_setup (@) {
@@ -277,20 +343,13 @@ sub formbuilder (@) {
                                if (! length $email) {
                                        error(gettext("No email address, so cannot email password reset instructions."));
                                }
-                               
-                               # Store a token that can be used once
-                               # to log the user in. This needs to be hard
-                               # to guess. Generating a cgi session id will
-                               # make it as hard to guess as any cgi session.
-                               eval q{use CGI::Session};
-                               error($@) if $@;
-                               my $token = CGI::Session->new->id;
-                               setpassword($user_name, $token, "resettoken");
+
+                               my $token=gentoken($user_name, "resettoken");
                                
                                my $template=template("passwordmail.tmpl");
                                $template->param(
                                        user_name => $user_name,
-                                       passwordurl => IkiWiki::cgiurl(
+                                       passwordurl => IkiWiki::cgiurl_abs(
                                                'do' => "reset",
                                                'name' => $user_name,
                                                'token' => $token,
@@ -329,7 +388,7 @@ sub formbuilder (@) {
        elsif ($form->title eq "preferences") {
                if ($form->submitted eq "Save Preferences" && $form->validate) {
                        my $user_name=$form->field('name');
-                       if ($form->field("password") && length $form->field("password")) {
+                       if (defined $form->field("password") && length $form->field("password")) {
                                setpassword($user_name, $form->field('password'));
                        }
                }
@@ -356,6 +415,22 @@ sub sessioncgi ($$) {
                IkiWiki::cgi_prefs($q, $session);
                exit;
        }
+       elsif ($q->param('do') eq 'tokenauth') {
+               my $name=$q->param("name");
+               my $token=$q->param("token");
+
+               if (! defined $name || ! defined $token ||
+                   ! length $name  || ! length $token) {
+                       error(gettext("incorrect url"));
+               }
+               if (! checkpassword($name, $token, "passwordless")) {
+                       error(gettext("access denied"));
+               }
+
+               $session->param("name", $name);
+               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");
index ea4f3e0dc563bac69a999ed42b4884f48b1892a7..b2d54af8ac269cd63e95913073919cfd2b496052 100644 (file)
@@ -13,7 +13,7 @@ sub import {
        hook(type => "needsbuild", id => "pinger", call => \&needsbuild);
        hook(type => "preprocess", id => "ping", call => \&preprocess);
        hook(type => "delete", id => "pinger", call => \&ping);
-       hook(type => "change", id => "pinger", call => \&ping);
+       hook(type => "rendered", id => "pinger", call => \&ping);
 }
 
 sub getsetup () {
@@ -72,7 +72,7 @@ sub ping {
                my $ua;
                eval q{use LWPx::ParanoidAgent};
                if (!$@) {
-                       $ua=LWPx::ParanoidAgent->new;
+                       $ua=LWPx::ParanoidAgent->new(agent => $config{useragent});
                }
                else {
                        eval q{use LWP};
@@ -80,7 +80,7 @@ sub ping {
                                debug(gettext("LWP not found, not pinging"));
                                return;
                        }
-                       $ua=LWP::UserAgent->new;
+                       $ua=useragent();
                }
                $ua->timeout($config{pinger_timeout} || 15);
                
index 6410a1c663ceba0b615a6d3959bb27c3dd20b609..6107a4a2252c256e715a3b0bd210eb28d45371b3 100644 (file)
@@ -23,7 +23,6 @@ use File::Copy;
 use File::Spec;
 use File::Temp;
 use Memoize;
-use UNIVERSAL;
 
 my ($master_language_code, $master_language_name);
 my %translations;
@@ -48,7 +47,7 @@ sub import {
        hook(type => "pagetemplate", id => "po", call => \&pagetemplate, last => 1);
        hook(type => "rename", id => "po", call => \&renamepages, first => 1);
        hook(type => "delete", id => "po", call => \&mydelete);
-       hook(type => "change", id => "po", call => \&change);
+       hook(type => "rendered", id => "po", call => \&rendered);
        hook(type => "checkcontent", id => "po", call => \&checkcontent);
        hook(type => "canremove", id => "po", call => \&canremove);
        hook(type => "canrename", id => "po", call => \&canrename);
@@ -347,6 +346,12 @@ sub pagetemplate (@) {
        if ($template->query(name => "lang_code")) {
                $template->param(lang_code => $lang_code);
        }
+       if ($template->query(name => "html_lang_code")) {
+               $template->param(html_lang_code => htmllangcode($lang_code));
+       }
+       if ($template->query(name => "html_lang_dir")) {
+               $template->param(html_lang_dir => htmllangdir($lang_code));
+       }
        if ($template->query(name => "lang_name")) {
                $template->param(lang_name => languagename($lang_code));
        }
@@ -428,7 +433,7 @@ sub mydelete (@) {
        map { deletetranslations($_) } grep istranslatablefile($_), @deleted;
 }
 
-sub change (@) {
+sub rendered (@) {
        my @rendered=@_;
 
        my $updated_po_files=0;
@@ -858,6 +863,19 @@ sub lang ($) {
        return $master_language_code;
 }
 
+sub htmllangcode ($) {
+       (my $lang = shift) =~ tr/_/-/;
+       return $lang;
+}
+
+sub htmllangdir ($) {
+       my $lang = shift;
+       if ($lang =~ /^(ar|fa|he)/) {
+               return 'rtl';
+       }
+       return 'ltr';
+}
+
 sub islanguagecode ($) {
        my $code=shift;
 
@@ -1054,6 +1072,8 @@ sub otherlanguagesloop ($) {
                push @ret, {
                        url => urlto_with_orig_beautiful_urlpath(masterpage($page), $page),
                        code => $master_language_code,
+                       html_code => htmllangcode($master_language_code),
+                       html_dir => htmllangdir($master_language_code),
                        language => $master_language_name,
                        master => 1,
                };
@@ -1064,6 +1084,8 @@ sub otherlanguagesloop ($) {
                push @ret, {
                        url => urlto_with_orig_beautiful_urlpath($otherpage, $page),
                        code => $lang,
+                       html_code => htmllangcode($lang),
+                       html_dir => htmllangdir($lang),
                        language => languagename($lang),
                        percent => percenttranslated($otherpage),
                }
@@ -1103,7 +1125,7 @@ sub deletetranslations ($) {
                        IkiWiki::rcs_remove($_);
                }
                else {
-                       IkiWiki::prune("$config{srcdir}/$_");
+                       IkiWiki::prune("$config{srcdir}/$_", $config{srcdir});
                }
        } @todelete;
 
index 2773486a6c69560fdd0a2236607b800dc88b15e6..3bd4af2060111ed4dbe12e3262c0f1e200ca6ba7 100644 (file)
@@ -23,12 +23,14 @@ sub getsetup () {
 
 my %pagenum;
 sub preprocess (@) {
-       my %params=(open => "yes", total => "yes", percent => "yes", @_);
+       my %params=(open => "yes", total => "yes", percent => "yes",
+               expandable => "no", @_);
 
        my $open=IkiWiki::yesno($params{open});
        my $showtotal=IkiWiki::yesno($params{total});
        my $showpercent=IkiWiki::yesno($params{percent});
-       $pagenum{$params{page}}++;
+       my $expandable=IkiWiki::yesno($params{expandable});
+       my $num=++$pagenum{$params{page}}{$params{destpage}};
 
        my %choices;
        my @choices;
@@ -64,7 +66,7 @@ sub preprocess (@) {
                }
                if ($open && exists $config{cgiurl}) {
                        $ret.="<input type=\"hidden\" name=\"do\" value=\"poll\" />\n";
-                       $ret.="<input type=\"hidden\" name=\"num\" value=\"$pagenum{$params{page}}\" />\n";
+                       $ret.="<input type=\"hidden\" name=\"num\" value=\"$num\" />\n";
                        $ret.="<input type=\"hidden\" name=\"page\" value=\"$params{page}\" />\n";
                        $ret.="<input type=\"hidden\" name=\"choice\" value=\"$choice\" />\n";
                        $ret.="<input type=\"submit\" value=\"".gettext("vote")."\" />\n";
@@ -74,6 +76,19 @@ sub preprocess (@) {
                        $ret.="</form>\n";
                }
        }
+       
+       if ($expandable && $open && exists $config{cgiurl}) {
+               $ret.="<p>\n";
+               $ret.="<form method=\"POST\" action=\"".IkiWiki::cgiurl()."\">\n";
+               $ret.="<input type=\"hidden\" name=\"do\" value=\"poll\" />\n";
+               $ret.="<input type=\"hidden\" name=\"num\" value=\"$num\" />\n";
+               $ret.="<input type=\"hidden\" name=\"page\" value=\"$params{page}\" />\n";
+               $ret.=gettext("Write in").": <input name=\"choice\" size=50 />\n";
+               $ret.="<input type=\"submit\" value=\"".gettext("vote")."\" />\n";
+               $ret.="</form>\n";
+               $ret.="</p>\n";
+       }
+
        if ($showtotal) {
                $ret.="<span>".gettext("Total votes:")." $total</span>\n";
        }
@@ -85,7 +100,7 @@ sub sessioncgi ($$) {
        my $session=shift;
        if (defined $cgi->param('do') && $cgi->param('do') eq "poll") {
                my $choice=decode_utf8($cgi->param('choice'));
-               if (! defined $choice) {
+               if (! defined $choice || not length $choice) {
                        error("no choice specified");
                }
                my $num=$cgi->param('num');
@@ -118,7 +133,14 @@ sub sessioncgi ($$) {
                        my $params=shift;
                        return "\\[[$prefix $params]]" if $escape;
                        if (--$num == 0) {
-                               $params=~s/(^|\s+)(\d+)\s+"?\Q$choice\E"?(\s+|$)/$1.($2+1)." \"$choice\"".$3/se;
+                               if ($params=~s/(^|\s+)(\d+)\s+"?\Q$choice\E"?(\s+|$)/$1.($2+1)." \"$choice\"".$3/se) {
+                               }
+                               elsif ($params=~/expandable=(\w+)/
+                                   & &IkiWiki::yesno($1)) {
+                                       $choice=~s/["\]\n\r]//g;
+                                       $params.=" 1 \"$choice\""
+                                               if length $choice;
+                               }
                                if (defined $oldchoice) {
                                        $params=~s/(^|\s+)(\d+)\s+"?\Q$oldchoice\E"?(\s+|$)/$1.($2-1 >=0 ? $2-1 : 0)." \"$oldchoice\"".$3/se;
                                }
index 8ce9474be631dbd8ae428304e25d1d1d2adac3df..eec9803be1397dc0a473b5c4287a0b8cdfa25ac7 100644 (file)
@@ -165,6 +165,7 @@ sub store ($$$) {
        # Limit pages to first 10, and add links to the changed pages.
        my $is_excess = exists $change->{pages}[10];
        delete @{$change->{pages}}[10 .. @{$change->{pages}}] if $is_excess;
+       my $has_diffurl=0;
        $change->{pages} = [
                map {
                        if (length $config{cgiurl}) {
@@ -180,6 +181,9 @@ sub store ($$$) {
                        else {
                                $_->{link} = pagetitle($_->{page});
                        }
+                       if (defined $_->{diffurl} && length($_->{diffurl})) {
+                               $has_diffurl=1;
+                       }
 
                        $_;
                } @{$change->{pages}}
@@ -227,6 +231,8 @@ sub store ($$$) {
                wikiname => $config{wikiname},
        );
        
+       $template->param(has_diffurl => 1) if $has_diffurl;
+
        $template->param(permalink => urlto($config{recentchangespage})."#change-".titlepage($change->{rev}))
                if exists $config{url};
        
index 41882279331f8b1a2171bb98197602197ba64190..eb358be67bef0e8a87146846857d5bc24cfdc396 100644 (file)
@@ -9,10 +9,12 @@ use HTML::Entities;
 my $maxlines=200;
 
 sub import {
+       add_underlay("javascript");
        hook(type => "getsetup", id => "recentchangesdiff",
                call => \&getsetup);
        hook(type => "pagetemplate", id => "recentchangesdiff",
                call => \&pagetemplate);
+       hook(type => "format", id => "recentchangesdiff.pm", call => \&format);
 }
 
 sub getsetup () {
@@ -55,4 +57,24 @@ sub pagetemplate (@) {
        }
 }
 
+sub format (@) {
+        my %params=@_;
+
+       if (! ($params{content}=~s!^(<body[^>]*>)!$1.include_javascript($params{page})!em)) {
+               # no <body> tag, probably in preview mode
+               $params{content}=include_javascript(undef).$params{content};
+       }
+       return $params{content};
+}
+
+# taken verbatim from toggle.pm
+sub include_javascript ($) {
+       my $from=shift;
+       
+       return '<script src="'.urlto("ikiwiki/ikiwiki.js", $from).
+               '" type="text/javascript" charset="utf-8"></script>'."\n".
+               '<script src="'.urlto("ikiwiki/toggle.js", $from).
+               '" type="text/javascript" charset="utf-8"></script>';
+}
+
 1
index 14ac01c9bcfc390f370f1a8fca74c3b51d7f0baa..d48b28f955043ec347dd87879a789c0830dfa5ab 100644 (file)
@@ -22,6 +22,13 @@ sub getsetup () {
                },
 }
 
+sub allowed_dirs {
+       return grep { defined $_ } (
+               $config{srcdir},
+               $IkiWiki::Plugin::transient::transientdir,
+       );
+}
+
 sub check_canremove ($$$) {
        my $page=shift;
        my $q=shift;
@@ -33,12 +40,22 @@ sub check_canremove ($$$) {
                        htmllink("", "", $page, noimageinline => 1)));
        }
 
-       # Must exist on disk, and be a regular file.
+       # Must exist in either the srcdir or a suitable underlay (e.g.
+       # transient underlay), and be a regular file.
        my $file=$pagesources{$page};
-       if (! -e "$config{srcdir}/$file") {
+       my $dir;
+
+       foreach my $srcdir (allowed_dirs()) {
+               if (-e "$srcdir/$file") {
+                       $dir = $srcdir;
+                       last;
+               }
+       }
+
+       if (! defined $dir) {
                error(sprintf(gettext("%s is not in the srcdir, so it cannot be deleted"), $file));
        }
-       elsif (-l "$config{srcdir}/$file" && ! -f _) {
+       elsif (-l "$dir/$file" && ! -f _) {
                error(sprintf(gettext("%s is not a file"), $file));
        }
        
@@ -46,7 +63,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, "$config{srcdir}/$file");
+                       IkiWiki::Plugin::attachment::check_canattach($session, $page, "$dir/$file");
                }
                else {
                        error("removal of attachments is not allowed");
@@ -124,7 +141,7 @@ sub removal_confirm ($$@) {
                        my $f=IkiWiki::Plugin::attachment::is_held_attachment($page);
                        if (defined $f) {
                                require IkiWiki::Render;
-                               IkiWiki::prune($f);
+                               IkiWiki::prune($f, "$config{wikistatedir}/attachments");
                        }
                }
        }
@@ -223,21 +240,34 @@ sub sessioncgi ($$) {
                        require IkiWiki::Render;
                        if ($config{rcs}) {
                                IkiWiki::disable_commit_hook();
-                               foreach my $file (@files) {
-                                       IkiWiki::rcs_remove($file);
+                       }
+                       my $rcs_removed = 1;
+
+                       foreach my $file (@files) {
+                               foreach my $srcdir (allowed_dirs()) {
+                                       if (-e "$srcdir/$file") {
+                                               if ($srcdir eq $config{srcdir} && $config{rcs}) {
+                                                       IkiWiki::rcs_remove($file);
+                                                       $rcs_removed = 1;
+                                               }
+                                               else {
+                                                       IkiWiki::prune("$srcdir/$file", $srcdir);
+                                               }
+                                       }
                                }
-                               IkiWiki::rcs_commit_staged(
-                                       message => gettext("removed"),
-                                       session => $session,
-                               );
-                               IkiWiki::enable_commit_hook();
-                               IkiWiki::rcs_update();
                        }
-                       else {
-                               foreach my $file (@files) {
-                                       IkiWiki::prune("$config{srcdir}/$file");
+
+                       if ($config{rcs}) {
+                               if ($rcs_removed) {
+                                       IkiWiki::rcs_commit_staged(
+                                               message => gettext("removed"),
+                                               session => $session,
+                                       );
                                }
+                               IkiWiki::enable_commit_hook();
+                               IkiWiki::rcs_update();
                        }
+
                        IkiWiki::refresh();
                        IkiWiki::saveindex();
 
index 8e32d41aecfd58934fc7353612c680162abd2914..8387a1e32446753f749887ba5655d23c2dfce462 100644 (file)
@@ -206,14 +206,22 @@ sub rename_start ($$$$) {
        exit 0;
 }
 
-sub postrename ($;$$$) {
+sub postrename ($$$;$$) {
+       my $cgi=shift;
        my $session=shift;
        my $src=shift;
        my $dest=shift;
        my $attachment=shift;
 
-       # Load saved form state and return to edit page.
-       my $postrename=CGI->new($session->param("postrename"));
+       # Load saved form state and return to edit page, using stored old
+       # cgi state. Or, if the rename was not started on the edit page, 
+       # return to the renamed page.
+       my $postrename=$session->param("postrename");
+       if (! defined $postrename) {
+               IkiWiki::redirect($cgi, urlto(defined $dest ? $dest : $src));
+               exit;
+       }
+       my $oldcgi=CGI->new($postrename);
        $session->clear("postrename");
        IkiWiki::cgi_savesession($session);
 
@@ -222,21 +230,21 @@ sub postrename ($;$$$) {
                        # They renamed the page they were editing. This requires
                        # fixups to the edit form state.
                        # Tweak the edit form to be editing the new page.
-                       $postrename->param("page", $dest);
+                       $oldcgi->param("page", $dest);
                }
 
                # Update edit form content to fix any links present
                # on it.
-               $postrename->param("editcontent",
+               $oldcgi->param("editcontent",
                        renamepage_hook($dest, $src, $dest,
-                                $postrename->param("editcontent")));
+                                $oldcgi->param("editcontent")));
 
                # Get a new edit token; old was likely invalidated.
-               $postrename->param("rcsinfo",
+               $oldcgi->param("rcsinfo",
                        IkiWiki::rcs_prepedit($pagesources{$dest}));
        }
 
-       IkiWiki::cgi_editpage($postrename, $session);
+       IkiWiki::cgi_editpage($oldcgi, $session);
 }
 
 sub formbuilder (@) {
@@ -291,16 +299,16 @@ sub sessioncgi ($$) {
                my $session=shift;
                my ($form, $buttons)=rename_form($q, $session, Encode::decode_utf8($q->param("page")));
                IkiWiki::decode_form_utf8($form);
+               my $src=$form->field("page");
 
                if ($form->submitted eq 'Cancel') {
-                       postrename($session);
+                       postrename($q, $session, $src);
                }
                elsif ($form->submitted eq 'Rename' && $form->validate) {
                        IkiWiki::checksessionexpiry($q, $session, $q->param('sid'));
 
                        # These untaints are safe because of the checks
                        # performed in check_canrename later.
-                       my $src=$form->field("page");
                        my $srcfile=IkiWiki::possibly_foolish_untaint($pagesources{$src})
                                if exists $pagesources{$src};
                        my $dest=IkiWiki::possibly_foolish_untaint(titlepage($form->field("new_name")));
@@ -324,7 +332,7 @@ sub sessioncgi ($$) {
                                IkiWiki::Plugin::attachment::is_held_attachment($src);
                        if ($held) {
                                rename($held, IkiWiki::Plugin::attachment::attachment_holding_location($dest));
-                               postrename($session, $src, $dest, $q->param("attachment"))
+                               postrename($q, $session, $src, $dest, $q->param("attachment"))
                                        unless defined $srcfile;
                        }
                        
@@ -430,7 +438,7 @@ sub sessioncgi ($$) {
                                $renamesummary.=$template->output;
                        }
 
-                       postrename($session, $src, $dest, $q->param("attachment"));
+                       postrename($q, $session, $src, $dest, $q->param("attachment"));
                }
                else {
                        IkiWiki::showform($form, $buttons, $session, $q);
index e38801e4a110b0b9e4790935de65f08bce30441e..1b85ea000120846ca5426e97be3603425e83cb1f 100644 (file)
@@ -7,7 +7,7 @@ use IkiWiki 3.00;
 
 sub import {
        hook(type => "getsetup", id => "rsync", call => \&getsetup);
-       hook(type => "change", id => "rsync", call => \&postrefresh);
+       hook(type => "rendered", id => "rsync", call => \&postrefresh);
        hook(type => "delete", id => "rsync", call => \&postrefresh);
 }
 
index 42d2e0d3009d9e190fa78790f581c536355a8d70..24b16fe2a78c4607f89788cd78ea1d7e5a1ac137 100644 (file)
@@ -33,6 +33,13 @@ sub getsetup () {
                        safe => 0, # external program
                        rebuild => 0,
                },
+               google_search => {
+                       type => "booblean",
+                       example => 1,
+                       description => "use google site search rather than internal xapian index?",
+                       safe => 1,
+                       rebuild => 0,
+               },
 }
 
 sub checkconfig () {
@@ -75,6 +82,8 @@ my $stemmer;
 sub indexhtml (@) {
        my %params=@_;
 
+       return if $config{google_search};
+
        setupfiles();
 
        # A unique pageterm is used to identify the document for a page.
@@ -165,6 +174,8 @@ sub indexhtml (@) {
 }
 
 sub delete (@) {
+       return if $config{google_search};
+
        my $db=xapiandb();
        foreach my $page (@_) {
                my $pageterm=pageterm(pagename($page));
@@ -176,14 +187,20 @@ sub cgi ($) {
        my $cgi=shift;
 
        if (defined $cgi->param('P')) {
-               # only works for GET requests
-               chdir("$config{wikistatedir}/xapian") || error("chdir: $!");
-               $ENV{OMEGA_CONFIG_FILE}="./omega.conf";
-               $ENV{CGIURL}=IkiWiki::cgiurl();
-               IkiWiki::loadindex();
-               $ENV{HELPLINK}=htmllink("", "", "ikiwiki/searching",
-                       noimageinline => 1, linktext => "Help");
-               exec($config{omega_cgi}) || error("$config{omega_cgi} failed: $!");
+               if ($config{google_search}) {
+                       print $cgi->redirect("https://www.google.com/search?sitesearch=$config{url}&q=".$cgi->param('P'));
+                       exit 0;
+               }
+               else {
+                       # only works for GET requests
+                       chdir("$config{wikistatedir}/xapian") || error("chdir: $!");
+                       $ENV{OMEGA_CONFIG_FILE}="./omega.conf";
+                       $ENV{CGIURL}=IkiWiki::cgiurl();
+                       IkiWiki::loadindex();
+                       $ENV{HELPLINK}=htmllink("", "", "ikiwiki/searching",
+                               noimageinline => 1, linktext => "Help");
+                       exec($config{omega_cgi}) || error("$config{omega_cgi} failed: $!");
+               }
        }
 }
 
index 7974d5e5325f396a6bd90cc446e239bed9a0c44f..f9caef40c1f44b9c6a14d0f9b67bd3a251be5ec6 100644 (file)
@@ -26,7 +26,8 @@ sub import {
        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 => "rendered", id => "skeleton", call => \&rendered);
+       hook(type => "changes", id => "skeleton", call => \&changes);
        hook(type => "cgi", id => "skeleton", call => \&cgi);
        hook(type => "auth", id => "skeleton", call => \&auth);
        hook(type => "sessioncgi", id => "skeleton", call => \&sessioncgi);
@@ -53,7 +54,6 @@ sub getsetup () {
                plugin => {
                        safe => 1,
                        rebuild => undef,
-                       section => "misc",
                },
                skeleton => {
                        type => "boolean",
@@ -167,10 +167,16 @@ sub delete (@) {
        debug("skeleton plugin told that files were deleted: @files");
 }
 
-sub change (@) {
+sub rendered (@) {
        my @files=@_;
 
-       debug("skeleton plugin told that changed files were rendered: @files");
+       debug("skeleton plugin told that files were rendered: @files");
+}
+
+sub changes (@) {
+       my @files=@_;
+
+       debug("skeleton plugin told that files were changed: @files");
 }
 
 sub cgi ($) {
index 3df06e652eeee285d51690b9d2178d6e0fb2b8ca..ccc9cb6664e5617c514ba6715107a2c4d1ddc448 100644 (file)
@@ -41,9 +41,11 @@ sub preprocess (@) {
                        blind_cache => 1);
        };
        if ($@) {
+               # gettext can clobber $@
+               my $error = $@;
                error sprintf(gettext("failed to process template %s"),
                        htmllink($params{page}, $params{destpage},
-                               "/templates/$params{id}"))." $@";
+                               "/templates/$params{id}"))." $error";
        }
 
        $params{basename}=IkiWiki::basename($params{page});
index ee94547e90c51dad608b020e1be6bc0a434d38d7..9b84ea7f023d10c6db947f136adb4ed8b8ec72e0 100644 (file)
@@ -9,6 +9,7 @@ sub import {
        hook(type => "getsetup", id => "theme", call => \&getsetup);
        hook(type => "checkconfig", id => "theme", call => \&checkconfig);
        hook(type => "needsbuild", id => "theme", call => \&needsbuild);
+       hook(type => "pagetemplate", id => "theme", call => \&pagetemplate);
 }
 
 sub getsetup () {
@@ -63,4 +64,12 @@ sub needsbuild ($) {
        return $needsbuild;
 }
 
+sub pagetemplate (@) {
+       my %params=@_;
+       my $template=$params{template};
+       if (exists $config{theme} && length $config{theme})  {
+               $template->param("theme_$config{theme}" => 1);
+       }
+}
+
 1
diff --git a/IkiWiki/Plugin/trail.pm b/IkiWiki/Plugin/trail.pm
new file mode 100644 (file)
index 0000000..476db4d
--- /dev/null
@@ -0,0 +1,466 @@
+#!/usr/bin/perl
+# Copyright © 2008-2011 Joey Hess
+# Copyright © 2009-2012 Simon McVittie <http://smcv.pseudorandom.co.uk/>
+# Licensed under the GNU GPL, version 2, or any later version published by the
+# Free Software Foundation
+package IkiWiki::Plugin::trail;
+
+use warnings;
+use strict;
+use IkiWiki 3.00;
+
+sub import {
+       hook(type => "getsetup", id => "trail", call => \&getsetup);
+       hook(type => "needsbuild", id => "trail", call => \&needsbuild);
+       hook(type => "preprocess", id => "trailoptions", call => \&preprocess_trailoptions, scan => 1);
+       hook(type => "preprocess", id => "trailitem", call => \&preprocess_trailitem, scan => 1);
+       hook(type => "preprocess", id => "trailitems", call => \&preprocess_trailitems, scan => 1);
+       hook(type => "preprocess", id => "traillink", call => \&preprocess_traillink, scan => 1);
+       hook(type => "pagetemplate", id => "trail", call => \&pagetemplate);
+       hook(type => "build_affected", id => "trail", call => \&build_affected);
+}
+
+# Page state
+# 
+# If a page $T is a trail, then it can have
+# 
+# * $pagestate{$T}{trail}{contents} 
+#   Reference to an array of lists each containing either:
+#     - [pagenames => "page1", "page2"]
+#       Those literal pages
+#     - [link => "link"]
+#       A link specification, pointing to the same page that [[link]]
+#       would select
+#     - [pagespec => "posts/*", "age", 0]
+#       A match by pagespec; the third array element is the sort order
+#       and the fourth is whether to reverse sorting
+# 
+# * $pagestate{$T}{trail}{sort}
+#   A sorting order; if absent or undef, the trail is in the order given
+#   by the links that form it
+#
+# * $pagestate{$T}{trail}{circular}
+#   True if this trail is circular (i.e. going "next" from the last item is
+#   allowed, and takes you back to the first)
+#
+# * $pagestate{$T}{trail}{reverse}
+#   True if C<sort> is to be reversed.
+# 
+# If a page $M is a member of a trail $T, then it has
+#
+# * $pagestate{$M}{trail}{item}{$T}[0]
+#   The page before this one in C<$T> at the last rebuild, or undef.
+#
+# * $pagestate{$M}{trail}{item}{$T}[1]
+#   The page after this one in C<$T> at the last refresh, or undef.
+
+sub getsetup () {
+       return
+               plugin => {
+                       safe => 1,
+                       rebuild => undef,
+               },
+}
+
+# Cache of pages' old titles, so we can tell whether they changed
+my %old_trail_titles;
+
+sub needsbuild (@) {
+       my $needsbuild=shift;
+
+       foreach my $page (keys %pagestate) {
+               if (exists $pagestate{$page}{trail}) {
+                       if (exists $pagesources{$page} &&
+                           grep { $_ eq $pagesources{$page} } @$needsbuild) {
+                               # Remember its title, so we can know whether
+                               # it changed.
+                               $old_trail_titles{$page} = title_of($page);
+
+                               # Remove state, it will be re-added
+                               # if the preprocessor directive is still
+                               # there during the rebuild. {item} is the
+                               # only thing that's added for items, not
+                               # trails, and it's harmless to delete that -
+                               # the item is being rebuilt anyway.
+                               delete $pagestate{$page}{trail};
+                       }
+               }
+       }
+
+       return $needsbuild;
+}
+
+my $scanned = 0;
+
+sub preprocess_trailoptions (@) {
+       my %params = @_;
+
+       if (exists $params{circular}) {
+               $pagestate{$params{page}}{trail}{circular} =
+                       IkiWiki::yesno($params{circular});
+       }
+
+       if (exists $params{sort}) {
+               $pagestate{$params{page}}{trail}{sort} = $params{sort};
+       }
+
+       if (exists $params{reverse}) {
+               $pagestate{$params{page}}{trail}{reverse} = $params{reverse};
+       }
+
+       return "";
+}
+
+sub preprocess_trailitem (@) {
+       my $link = shift;
+       shift;
+
+       # avoid collecting everything in the preprocess stage if we already
+       # did in the scan stage
+       if (defined wantarray) {
+               return "" if $scanned;
+       }
+       else {
+               $scanned = 1;
+       }
+
+       my %params = @_;
+       my $trail = $params{page};
+
+       $link = linkpage($link);
+
+       add_link($params{page}, $link, 'trail');
+       push @{$pagestate{$params{page}}{trail}{contents}}, [link => $link];
+
+       return "";
+}
+
+sub preprocess_trailitems (@) {
+       my %params = @_;
+
+       # avoid collecting everything in the preprocess stage if we already
+       # did in the scan stage
+       if (defined wantarray) {
+               return "" if $scanned;
+       }
+       else {
+               $scanned = 1;
+       }
+
+       # trail members from a pagespec ought to be in some sort of order,
+       # and path is a nice obvious default
+       $params{sort} = 'path' unless exists $params{sort};
+       $params{reverse} = 'no' unless exists $params{reverse};
+
+       if (exists $params{pages}) {
+               push @{$pagestate{$params{page}}{trail}{contents}},
+                       ["pagespec" => $params{pages}, $params{sort},
+                               IkiWiki::yesno($params{reverse})];
+       }
+
+       if (exists $params{pagenames}) {
+               push @{$pagestate{$params{page}}{trail}{contents}},
+                       [pagenames => (split ' ', $params{pagenames})];
+       }
+
+       return "";
+}
+
+sub preprocess_traillink (@) {
+       my $link = shift;
+       shift;
+
+       my %params = @_;
+       my $trail = $params{page};
+
+       $link =~ qr{
+                       (?:
+                               ([^\|]+)        # 1: link text
+                               \|              # followed by |
+                       )?                      # optional
+
+                       (.+)                    # 2: page to link to
+               }x;
+
+       my $linktext = $1;
+       $link = linkpage($2);
+
+       add_link($params{page}, $link, 'trail');
+
+       # avoid collecting everything in the preprocess stage if we already
+       # did in the scan stage
+       my $already;
+       if (defined wantarray) {
+               $already = $scanned;
+       }
+       else {
+               $scanned = 1;
+       }
+
+       push @{$pagestate{$params{page}}{trail}{contents}}, [link => $link] unless $already;
+
+       if (defined $linktext) {
+               $linktext = pagetitle($linktext);
+       }
+
+       if (exists $params{text}) {
+               $linktext = $params{text};
+       }
+
+       if (defined $linktext) {
+               return htmllink($trail, $params{destpage},
+                       $link, linktext => $linktext);
+       }
+
+       return htmllink($trail, $params{destpage}, $link);
+}
+
+# trail => [member1, member2]
+my %trail_to_members;
+# member => { trail => [prev, next] }
+# e.g. if %trail_to_members = (
+#      trail1 => ["member1", "member2"],
+#      trail2 => ["member0", "member1"],
+# )
+#
+# then $member_to_trails{member1} = {
+#      trail1 => [undef, "member2"],
+#      trail2 => ["member0", undef],
+# }
+my %member_to_trails;
+
+# member => 1
+my %rebuild_trail_members;
+
+sub trails_differ {
+       my ($old, $new) = @_;
+
+       foreach my $trail (keys %$old) {
+               if (! exists $new->{$trail}) {
+                       return 1;
+               }
+
+               if (exists $old_trail_titles{$trail} &&
+                       title_of($trail) ne $old_trail_titles{$trail}) {
+                       return 1;
+               }
+
+               my ($old_p, $old_n) = @{$old->{$trail}};
+               my ($new_p, $new_n) = @{$new->{$trail}};
+               $old_p = "" unless defined $old_p;
+               $old_n = "" unless defined $old_n;
+               $new_p = "" unless defined $new_p;
+               $new_n = "" unless defined $new_n;
+               if ($old_p ne $new_p) {
+                       return 1;
+               }
+
+               if (exists $old_trail_titles{$old_p} &&
+                       title_of($old_p) ne $old_trail_titles{$old_p}) {
+                       return 1;
+               }
+
+               if ($old_n ne $new_n) {
+                       return 1;
+               }
+
+               if (exists $old_trail_titles{$old_n} &&
+                       title_of($old_n) ne $old_trail_titles{$old_n}) {
+                       return 1;
+               }
+       }
+
+       foreach my $trail (keys %$new) {
+               if (! exists $old->{$trail}) {
+                       return 1;
+               }
+       }
+
+       return 0;
+}
+
+my $done_prerender = 0;
+
+sub prerender {
+       return if $done_prerender;
+
+       %trail_to_members = ();
+       %member_to_trails = ();
+
+       foreach my $trail (keys %pagestate) {
+               next unless exists $pagestate{$trail}{trail}{contents};
+
+               my $members = [];
+               my @contents = @{$pagestate{$trail}{trail}{contents}};
+
+               foreach my $c (@contents) {
+                       if ($c->[0] eq 'pagespec') {
+                               push @$members, pagespec_match_list($trail,
+                                       $c->[1], sort => $c->[2],
+                                       reverse => $c->[3]);
+                       }
+                       elsif ($c->[0] eq 'pagenames') {
+                               my @pagenames = @$c;
+                               shift @pagenames;
+                               foreach my $page (@pagenames) {
+                                       if (exists $pagesources{$page}) {
+                                               push @$members, $page;
+                                       }
+                                       else {
+                                               # rebuild trail if it turns up
+                                               add_depends($trail, $page, deptype("presence"));
+                                       }
+                               }
+                       }
+                       elsif ($c->[0] eq 'link') {
+                               my $best = bestlink($trail, $c->[1]);
+                               push @$members, $best if length $best;
+                       }
+               }
+
+               if (defined $pagestate{$trail}{trail}{sort}) {
+                       @$members = IkiWiki::sort_pages(
+                               $pagestate{$trail}{trail}{sort},
+                               $members);
+               }
+
+               if (IkiWiki::yesno $pagestate{$trail}{trail}{reverse}) {
+                       @$members = reverse @$members;
+               }
+
+               # uniquify
+               my %seen;
+               my @tmp;
+               foreach my $member (@$members) {
+                       push @tmp, $member unless $seen{$member};
+                       $seen{$member} = 1;
+               }
+               $members = [@tmp];
+
+               for (my $i = 0; $i <= $#$members; $i++) {
+                       my $member = $members->[$i];
+                       my $prev;
+                       $prev = $members->[$i - 1] if $i > 0;
+                       my $next = $members->[$i + 1];
+
+                       $member_to_trails{$member}{$trail} = [$prev, $next];
+               }
+
+               if ((scalar @$members) > 1 && $pagestate{$trail}{trail}{circular}) {
+                       $member_to_trails{$members->[0]}{$trail}[0] = $members->[$#$members];
+                       $member_to_trails{$members->[$#$members]}{$trail}[1] = $members->[0];
+               }
+
+               $trail_to_members{$trail} = $members;
+       }
+
+       foreach my $member (keys %pagestate) {
+               if (exists $pagestate{$member}{trail}{item} &&
+                       ! exists $member_to_trails{$member}) {
+                       $rebuild_trail_members{$member} = 1;
+                       delete $pagestate{$member}{trail}{item};
+               }
+       }
+
+       foreach my $member (keys %member_to_trails) {
+               if (! exists $pagestate{$member}{trail}{item}) {
+                       $rebuild_trail_members{$member} = 1;
+               }
+               else {
+                       if (trails_differ($pagestate{$member}{trail}{item},
+                                       $member_to_trails{$member})) {
+                               $rebuild_trail_members{$member} = 1;
+                       }
+               }
+
+               $pagestate{$member}{trail}{item} = $member_to_trails{$member};
+       }
+
+       $done_prerender = 1;
+}
+
+sub build_affected {
+       my %affected;
+
+       # In principle we might not have done this yet, although in practice
+       # at least the trail itself has probably changed, and its template
+       # almost certainly contains TRAILS or TRAILLOOP, triggering our
+       # prerender as a side-effect.
+       prerender();
+
+       foreach my $member (keys %rebuild_trail_members) {
+               $affected{$member} = sprintf(gettext("building %s, its previous or next page has changed"), $member);
+       }
+
+       return %affected;
+}
+
+sub title_of ($) {
+       my $page = shift;
+       if (defined ($pagestate{$page}{meta}{title})) {
+               return $pagestate{$page}{meta}{title};
+       }
+       return pagetitle(IkiWiki::basename($page));
+}
+
+my $recursive = 0;
+
+sub pagetemplate (@) {
+       my %params = @_;
+       my $page = $params{page};
+       my $template = $params{template};
+
+       return unless length $page;
+
+       if ($template->query(name => 'trails') && ! $recursive) {
+               prerender();
+
+               $recursive = 1;
+               my $inner = template("trails.tmpl", blind_cache => 1);
+               IkiWiki::run_hooks(pagetemplate => sub {
+                               shift->(%params, template => $inner)
+                       });
+               $template->param(trails => $inner->output);
+               $recursive = 0;
+       }
+
+       if ($template->query(name => 'trailloop')) {
+               prerender();
+
+               my @trails;
+
+               # sort backlinks by page name to have a consistent order
+               foreach my $trail (sort keys %{$member_to_trails{$page}}) {
+
+                       my $members = $trail_to_members{$trail};
+                       my ($prev, $next) = @{$member_to_trails{$page}{$trail}};
+                       my ($prevurl, $nexturl, $prevtitle, $nexttitle);
+
+                       if (defined $prev) {
+                               $prevurl = urlto($prev, $page);
+                               $prevtitle = title_of($prev);
+                       }
+
+                       if (defined $next) {
+                               $nexturl = urlto($next, $page);
+                               $nexttitle = title_of($next);
+                       }
+
+                       push @trails, {
+                               prevpage => $prev,
+                               prevtitle => $prevtitle,
+                               prevurl => $prevurl,
+                               nextpage => $next,
+                               nexttitle => $nexttitle,
+                               nexturl => $nexturl,
+                               trailpage => $trail,
+                               trailtitle => title_of($trail),
+                               trailurl => urlto($trail, $page),
+                       };
+               }
+
+               $template->param(trailloop => \@trails);
+       }
+}
+
+1;
index c0ad5fc11476ef4442cb64e81c7f5580e3795942..d4eb005ea2485374410396b5323c3db0c6e6b191 100644 (file)
@@ -8,7 +8,7 @@ use IkiWiki 3.00;
 sub import {
        hook(type => "getsetup", id => "transient",  call => \&getsetup);
        hook(type => "checkconfig", id => "transient", call => \&checkconfig);
-       hook(type => "change", id => "transient", call => \&change);
+       hook(type => "rendered", id => "transient", call => \&rendered);
 }
 
 sub getsetup () {
@@ -33,7 +33,7 @@ sub checkconfig () {
        }
 }
 
-sub change (@) {
+sub rendered (@) {
        foreach my $file (@_) {
                # If the corresponding file exists in the transient underlay
                # and isn't actually being used, we can get rid of it.
@@ -43,7 +43,7 @@ sub change (@) {
                my $casualty = "$transientdir/$file";
                if (srcfile($file) ne $casualty && -e $casualty) {
                        debug(sprintf(gettext("removing transient version of %s"), $file));
-                       IkiWiki::prune($casualty);
+                       IkiWiki::prune($casualty, $transientdir);
                }
        }
 }
index 3ea19c63519bdecf6cd7331d21d722b3e0bc72de..2967761c8d3dab055bb52c098b40cb6762e68f3e 100644 (file)
@@ -18,6 +18,7 @@ sub getsetup () {
                plugin => {
                        safe => 0,
                        rebuild => undef,
+                       section => "special-purpose",
                },
                add_underlays => {
                        type => "string",
index 05132a8a81560a3ce0039b748ce0458d5742ad53..fa2940b01ce23e5f988f9c9176c4a775c2171e53 100644 (file)
@@ -262,12 +262,13 @@ sub render ($$) {
        }
 }
 
-sub prune ($) {
+sub prune ($;$) {
        my $file=shift;
+       my $up_to=shift;
 
        unlink($file);
        my $dir=dirname($file);
-       while (rmdir($dir)) {
+       while ((! defined $up_to || $dir =~ m{^\Q$up_to\E\/}) && rmdir($dir)) {
                $dir=dirname($dir);
        }
 }
@@ -286,9 +287,22 @@ sub srcdir_check () {
        
 }
 
-sub find_src_files () {
+# Finds all files in the srcdir, and the underlaydirs.
+# Returns the files, and their corresponding pages.
+#
+# When run in only_underlay mode, adds only the underlay files to
+# the files and pages passed in.
+sub find_src_files (;$$$) {
+       my $only_underlay=shift;
        my @files;
+       if (defined $_[0]) {
+               @files=@{shift()};
+       }
        my %pages;
+       if (defined $_[0]) {
+               %pages=%{shift()};
+       }
+
        eval q{use File::Find};
        error($@) if $@;
 
@@ -296,6 +310,8 @@ sub find_src_files () {
        die $@ if $@;
        my $origdir=getcwd();
        my $abssrcdir=Cwd::abs_path($config{srcdir});
+       
+       @IkiWiki::underlayfiles=();
 
        my ($page, $underlay);
        my $helper=sub {
@@ -322,6 +338,7 @@ sub find_src_files () {
                        if (! -l "$abssrcdir/$f" && ! -e _) {
                                if (! $pages{$page}) {
                                        push @files, $f;
+                                       push @IkiWiki::underlayfiles, $f;
                                        $pages{$page}=1;
                                }
                        }
@@ -335,12 +352,14 @@ sub find_src_files () {
                }
        };
 
-       chdir($config{srcdir}) || die "chdir $config{srcdir}: $!";
-       find({
-               no_chdir => 1,
-               wanted => $helper,
-       }, '.');
-       chdir($origdir) || die "chdir $origdir: $!";
+       unless ($only_underlay) {
+               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}) {
@@ -356,6 +375,50 @@ sub find_src_files () {
        return \@files, \%pages;
 }
 
+# Given a hash of files that have changed, and a hash of files that were
+# deleted, should return the same results as find_src_files, with the same
+# sanity checks. But a lot faster!
+sub process_changed_files ($$) {
+       my $changed_raw=shift;
+       my $deleted_raw=shift;
+
+       my @files;
+       my %pages;
+
+       foreach my $file (keys %$changed_raw) {
+               my $page = pagename($file);
+               next if ! exists $pagesources{$page} && file_pruned($file);
+               my ($f) = $file =~ /$config{wiki_file_regexp}/; # untaint
+               if (! defined $f) {
+                       warn(sprintf(gettext("skipping bad filename %s"), $file)."\n");
+                       next;
+               }
+               push @files, $f;
+               if ($pages{$page}) {
+                       debug(sprintf(gettext("%s has multiple possible source pages"), $page));
+               }
+               $pages{$page}=1;
+       }
+
+       # So far, we only have the changed files. Now add in all the old
+       # files that were not changed or deleted, excluding ones that came
+       # from the underlay.
+       my %old_underlay;
+       foreach my $f (@IkiWiki::underlayfiles) {
+               $old_underlay{$f}=1;
+       }
+       foreach my $page (keys %pagesources) {
+               my $f=$pagesources{$page};
+               unless ($old_underlay{$f} || exists $pages{$page} || exists $deleted_raw->{$f}) {
+                       $pages{$page}=1;
+                       push @files, $f;
+               }
+       }
+
+       # add in the underlay
+       find_src_files(1, \@files, \%pages);
+}
+
 sub find_new_files ($) {
        my $files=shift;
        my @new;
@@ -447,7 +510,7 @@ sub remove_del (@) {
                }
        
                foreach my $old (@{$oldrenderedfiles{$page}}) {
-                       prune($config{destdir}."/".$old);
+                       prune($config{destdir}."/".$old, $config{destdir});
                }
 
                foreach my $source (keys %destsources) {
@@ -537,7 +600,7 @@ sub remove_unrendered () {
                foreach my $file (@{$oldrenderedfiles{$page}}) {
                        if (! grep { $_ eq $file } @{$renderedfiles{$page}}) {
                                debug(sprintf(gettext("removing %s, no longer built by %s"), $file, $page));
-                               prune($config{destdir}."/".$file);
+                               prune($config{destdir}."/".$file, $config{destdir});
                        }
                }
        }
@@ -761,17 +824,40 @@ sub gen_autofile ($$$) {
        return 1;
 }
 
-
 sub refresh () {
        srcdir_check();
        run_hooks(refresh => sub { shift->() });
-       my ($files, $pages)=find_src_files();
-       my ($new, $internal_new)=find_new_files($files);
-       my ($del, $internal_del)=find_del_files($pages);
-       my ($changed, $internal_changed)=find_changed($files);
+       my ($files, $pages, $new, $internal_new, $del, $internal_del, $changed, $internal_changed);
+       my $want_find_changes=$config{only_committed_changes} &&
+               exists $IkiWiki::hooks{rcs}{rcs_find_changes} &&
+               exists $IkiWiki::hooks{rcs}{rcs_get_current_rev};
+       if (! $config{rebuild} && $want_find_changes && defined $IkiWiki::lastrev && length $IkiWiki::lastrev) {
+               my ($changed_raw, $del_raw);
+               ($changed_raw, $del_raw, $IkiWiki::lastrev) = $IkiWiki::hooks{rcs}{rcs_find_changes}{call}->($IkiWiki::lastrev);
+               ($files, $pages)=process_changed_files($changed_raw, $del_raw);
+       }
+       else {
+               ($files, $pages)=find_src_files();
+       }
+       if ($want_find_changes) {
+               if (! defined($IkiWiki::lastrev) || ! length $IkiWiki::lastrev) {
+                       $IkiWiki::lastrev=$IkiWiki::hooks{rcs}{rcs_get_current_rev}{call}->();
+               }
+       }
+       ($new, $internal_new)=find_new_files($files);
+       ($del, $internal_del)=find_del_files($pages);
+       ($changed, $internal_changed)=find_changed($files);
+       my %existingfiles;
        run_hooks(needsbuild => sub {
                my $ret=shift->($changed, [@$del, @$internal_del]);
-               $changed=$ret if ref $ret eq 'ARRAY';
+               if (ref $ret eq 'ARRAY' && $ret != $changed) {
+                       if (! %existingfiles) {
+                               foreach my $f (@$files) {
+                                       $existingfiles{$f}=1;
+                               }
+                       }
+                       @$changed=grep $existingfiles{$_}, @$ret;
+               }
        });
        my $oldlink_targets=calculate_old_links($changed, $del);
 
@@ -800,6 +886,14 @@ sub refresh () {
                derender_internal($file);
        }
 
+       run_hooks(build_affected => sub {
+               my %affected = shift->();
+               while (my ($page, $message) = each %affected) {
+                       next unless exists $pagesources{$page};
+                       render($pagesources{$page}, $message);
+               }
+       });
+
        my ($backlinkchanged, $linkchangers)=calculate_changed_links($changed,
                $del, $oldlink_targets);
 
@@ -821,8 +915,13 @@ sub refresh () {
                run_hooks(delete => sub { shift->(@$del, @$internal_del) });
        }
        if (%rendered) {
-               run_hooks(change => sub { shift->(keys %rendered) });
+               run_hooks(rendered => sub { shift->(keys %rendered) });
+               run_hooks(change => sub { shift->(keys %rendered) }); # back-compat
        }
+       my %all_changed = map { $_ => 1 }
+               @$new, @$changed, @$del,
+               @$internal_new, @$internal_changed, @$internal_del;
+       run_hooks(changes => sub { shift->(keys %all_changed) });
 }
 
 sub clean_rendered {
@@ -831,7 +930,7 @@ sub clean_rendered {
        remove_unrendered();
        foreach my $page (keys %oldrenderedfiles) {
                foreach my $file (@{$oldrenderedfiles{$page}}) {
-                       prune($config{destdir}."/".$file);
+                       prune($config{destdir}."/".$file, $config{destdir});
                }
        }
 }
index 48f3d4634da0371f988ba16ae1107849fcd24172..453d19670d2bfc6113c2d87b3d0af44242823754 100644 (file)
@@ -172,6 +172,11 @@ sub getsetup () {
                        my @s=eval { $IkiWiki::hooks{getsetup}{$plugin}{call}->() };
                        next unless @s;
 
+                       if (scalar(@s) % 2 != 0) {
+                               print STDERR "warning: plugin $plugin has a broken getsetup; ignoring\n";
+                               next;
+                       }
+
                        # set default section value (note use of shared
                        # hashref between array and hash)
                        my %s=@s;
@@ -223,6 +228,10 @@ sub commented_dump ($$) {
                my $setup=$pair->[1];
                my %s=@{$setup};
                my $section=$s{plugin}->{section};
+               if (! defined $section) {
+                       print STDERR "warning: missing section in $plugin\n";
+                       $section="other";
+               }
                push @{$section_plugins{$section}}, $plugin;
                if (@{$section_plugins{$section}} == 1) {
                        push @ret, "", $indent.("#" x 70), "$indent# $section plugins",
index c39aa2ef7d678207ef86c938baef3f7af1933c30..b46bc6aa9794abdca46f68c8dc753e88daf7019b 100644 (file)
@@ -28,10 +28,11 @@ sub gen_wrappers () {
        %config=(%origconfig);
 }
 
+our $program_to_wrap = $0;
 sub gen_wrapper () {
        $config{srcdir}=File::Spec->rel2abs($config{srcdir});
        $config{destdir}=File::Spec->rel2abs($config{destdir});
-       my $this=File::Spec->rel2abs($0);
+       my $this=File::Spec->rel2abs($program_to_wrap);
        if (! -x $this) {
                error(sprintf(gettext("%s doesn't seem to be executable"), $this));
        }
@@ -93,12 +94,53 @@ EOF
                # memory, a pile up of processes could cause thrashing
                # otherwise. The fd of the lock is stored in
                # IKIWIKI_CGILOCK_FD so unlockwiki can close it.
-               $pre_exec=<<"EOF";
+               #
+               # A lot of cgi wrapper processes can potentially build
+               # up and clog an otherwise unloaded web server. To
+               # partially avoid this, when a GET comes in and the lock
+               # is already held, rather than blocking a html page is
+               # constructed that retries. This is enabled by setting
+               # cgi_overload_delay.
+               if (defined $config{cgi_overload_delay} &&
+                   $config{cgi_overload_delay} =~/^[0-9]+/) {
+                       my $i=int($config{cgi_overload_delay});
+                       $pre_exec.="#define CGI_OVERLOAD_DELAY $i\n"
+                               if $i > 0;
+                       my $msg=gettext("Please wait");
+                       $msg=~s/"/\\"/g;
+                       $pre_exec.='#define CGI_PLEASE_WAIT_TITLE "'.$msg."\"\n";
+                       if (defined $config{cgi_overload_message} && length $config{cgi_overload_message}) {
+                               $msg=$config{cgi_overload_message};
+                               $msg=~s/"/\\"/g;
+                       }
+                       $pre_exec.='#define CGI_PLEASE_WAIT_BODY "'.$msg."\"\n";
+               }
+               $pre_exec.=<<"EOF";
        lockfd=open("$config{wikistatedir}/cgilock", O_CREAT | O_RDWR, 0666);
-       if (lockfd != -1 && lockf(lockfd, F_LOCK, 0) == 0) {
-               char *fd_s=malloc(8);
-               sprintf(fd_s, "%i", lockfd);
-               setenv("IKIWIKI_CGILOCK_FD", fd_s, 1);
+       if (lockfd != -1) {
+#ifdef CGI_OVERLOAD_DELAY
+               char *request_method = getenv("REQUEST_METHOD");
+               if (request_method && strcmp(request_method, "GET") == 0) {
+                       if (lockf(lockfd, F_TLOCK, 0) == 0) {
+                               set_cgilock_fd(lockfd);
+                       }
+                       else {
+                               printf("Content-Type: text/html\\nRefresh: %i; URL=%s\\n\\n<html><head><title>%s</title><head><body><p>%s</p></body></html>",
+                                       CGI_OVERLOAD_DELAY,
+                                       getenv("REQUEST_URI"),
+                                       CGI_PLEASE_WAIT_TITLE,
+                                       CGI_PLEASE_WAIT_BODY);
+                               exit(0);
+                       }
+               }
+               else if (lockf(lockfd, F_LOCK, 0) == 0) {
+                       set_cgilock_fd(lockfd);
+               }
+#else
+               if (lockf(lockfd, F_LOCK, 0) == 0) {
+                       set_cgilock_fd(lockfd);
+               }
+#endif
        }
 EOF
        }
@@ -140,6 +182,12 @@ void addenv(char *var, char *val) {
        newenviron[i++]=s;
 }
 
+void set_cgilock_fd (int lockfd) {
+       char *fd_s=malloc(8);
+       sprintf(fd_s, "%i", lockfd);
+       setenv("IKIWIKI_CGILOCK_FD", fd_s, 1);
+}
+
 int main (int argc, char **argv) {
        int lockfd=-1;
        char *s;
@@ -214,7 +262,7 @@ $set_background_command
 EOF
 
        my @cc=exists $ENV{CC} ? possibly_foolish_untaint($ENV{CC}) : 'cc';
-       push @cc, possibly_foolish_untaint($ENV{CFLAGS}) if exists $ENV{CFLAGS};
+       push @cc, split(' ', possibly_foolish_untaint($ENV{CFLAGS})) if exists $ENV{CFLAGS};
        if (system(@cc, "$wrapper.c", "-o", "$wrapper.new") != 0) {
                #translators: The parameter is a C filename.
                error(sprintf(gettext("failed to compile %s"), "$wrapper.c"));
index ef29a950c777b8e3c7b74821790a1b184be28c3b..ad3e4623c8a9acf41c58a1301964d50dec8f31fa 100755 (executable)
@@ -75,7 +75,7 @@ underlay_install:
        install -d $(DESTDIR)$(PREFIX)/share/ikiwiki
        for dir in `cd underlays && $(FIND) . -follow -type d`; do \
                install -d $(DESTDIR)$(PREFIX)/share/ikiwiki/$$dir; \
-               for file in `$(FIND) underlays/$$dir -follow -maxdepth 1 -type f ! -name \\*.full.js ! -name \\*.full.css`; do \
+               for file in `$(FIND) underlays/$$dir -follow -maxdepth 1 -type f ! -name jquery.js ! -name jquery-ui.css ! -name jquery-ui.js ! -name jquery.tmpl.js`; do \
                        cp -pRL $$file $(DESTDIR)$(PREFIX)/share/ikiwiki/$$dir 2>/dev/null || \
                        install -m 644 $$file $(DESTDIR)$(PREFIX)/share/ikiwiki/$$dir; \
                done; \
@@ -96,7 +96,7 @@ underlay_install:
                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 $$theme/base.css 2>/dev/null; cat $$file) >> $(DESTDIR)$(PREFIX)/share/ikiwiki/$$theme/style.css; \
+                               (cat doc/style.css; cat $$theme/base.css 2>/dev/null; cat $$file) > $(DESTDIR)$(PREFIX)/share/ikiwiki/$$theme/style.css; \
                        elif echo "$$file" | grep -q base.css; then \
                                :; \
                        elif [ -f "$$file" ]; then \
@@ -187,5 +187,6 @@ WriteMakefile(
                'HTML::Parser'          => "0",
                'URI'                   => "0",
                'Data::Dumper'          => "2.11",
+               'YAML::XS'              => "0",
        },
 );
index 0eb83ded614a2b4e2b2397bf8d2db897984317db..5617daf9e6a30dece748037dd6bebcfa8550dda6 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 calendar sidebar}],
+       add_plugins => [qw{goodstuff websetup comments blogspam calendar sidebar trail}],
        disable_plugins => [qw{}],
        libdir => "$ENV{HOME}/.ikiwiki",
        rss => 1,
index d6b71eaa3f39cb95d826f6684b6601d6938006a0..e2b5ac5236dd78a692b13e46bde7696320432175 100644 (file)
-ikiwiki (3.20120203) UNRELEASED; urgency=low
+ikiwiki (3.20140912) UNRELEASED; urgency=medium
+
+  * Don't double-decode CGI submissions with Encode.pm >= 2.53,
+    fixing "Error: Cannot decode string with wide characters".
+    Thanks, Antoine Beaupré
+  * Avoid making trails depend on everything in the wiki by giving them
+    a better way to sort the pages
+  * Don't let users post comments that won't be displayed
+  * Fix encoding of Unicode strings in Python plugins.
+    Thanks, chrysn
+  * Improve performance and correctness of the [[!if]] directive
+  * Let [[!inline rootpage=foo postform=no]] disable the posting form
+  * Switch default [[!man]] shortcut to manpages.debian.org. Closes: #700322
+
+ -- Simon McVittie <smcv@debian.org>  Fri, 12 Sep 2014 21:23:58 +0100
+
+ikiwiki (3.20140831) unstable; urgency=medium
+
+  * Make --no-gettime work in initial build. Closes: #755075
+
+ -- Joey Hess <joeyh@debian.org>  Sun, 31 Aug 2014 14:17:24 -0700
+
+ikiwiki (3.20140815) unstable; urgency=medium
+
+  * Add google back to openid selector. Apparently this has gotten a stay
+    of execution until April 2015. (It may continue to work until 2017.)
+  * highlight: Add compatibility with highlight 3.18, while still supporting
+    3.9+. Closes: #757679
+    Thanks, David Bremner
+  * highlight: Add support for multiple language definition directories
+    Closes: #757680
+    Thanks, David Bremner
+
+ -- Joey Hess <joeyh@debian.org>  Fri, 15 Aug 2014 12:58:08 -0400
+
+ikiwiki (3.20140613) unstable; urgency=medium
+
+  * only_committed_changes could fail in a git repository merged
+    with git merge -s ours.
+  * Remove google from openid selector, per http://xkcd.com/1361/
+
+ -- Joey Hess <joeyh@debian.org>  Fri, 13 Jun 2014 10:09:10 -0400
+
+ikiwiki (3.20140227) unstable; urgency=medium
+
+  * Added useragent config setting. Closes: #737121
+    Thanks, Tuomas Jormola
+  * po: Add html_lang_code and html_lang_dir template variables
+    for the language code and direction of text.
+    Thanks, Mesar Hameed
+  * Allow up to 8 levels of nested directives, rather than previous 3
+    in directive infinite loop guard.
+  * git diffurl: Do not escape / in paths to changed files, in order to
+    interoperate with cgit (gitweb works either way)
+    Thanks, intrigeri.
+  * git: Explicity push master branch, as will be needed by git 2.0's
+    change to push.default=matching by default.
+    Thanks, smcv
+  * Deal with nasty issue with gettext clobbering $@ while printing
+    error message containing it.
+    Thanks, smcv
+  * Cleanup of the openid login widget, including replacing of hotlinked
+    images from openid providers with embedded, freely licensed artwork.
+    Thanks, smcv
+  * Improve templates testing.
+    Thanks, smcv
+  * python proxy: Avoid utf-8 related crash.
+    Thanks, Antoine Beaupré
+  * Special thanks to Simon McVittie for being the patchmeister for this
+    release.
+
+ -- Joey Hess <joeyh@debian.org>  Thu, 27 Feb 2014 11:55:35 -0400
+
+ikiwiki (3.20140125) unstable; urgency=medium
+
+  * inline: Allow overriding the title of the feed. Closes: #735123
+    Thanks, Christophe Rhodes
+  * osm: Escape name parameter. Closes: #731797
+
+ -- Joey Hess <joeyh@debian.org>  Sat, 25 Jan 2014 16:40:32 -0400
 
+ikiwiki (3.20140102) unstable; urgency=low
+
+  * aggregate: Improve display of post author.
+  * poll: Fix behavior of poll buttons when inlined.
+  * Fixed unncessary tight loop hash copy in saveindex where a pointer
+    can be used instead. Can speed up refreshes by nearly 50% in some
+    circumstances.
+  * Optimized loadindex by caching the page name in the index.
+  * Added only_committed_changes config setting, which speeds up wiki
+    refresh by querying git to find the files that were changed, rather
+    than looking at the work tree. Not enabled by default as it can
+    break some setups where not all files get committed to git.
+  * comments: Write pending moderation comments to the transient underlay
+    to avoid conflict with only_committed_changes.
+  * search: Added google_search option, which makes it search google
+    rather than using the internal xapain database.
+    (googlesearch plugin is too hard to turn on when xapain databases
+    corrupt themselves, which happens all too frequently).
+  * osm: Remove invalid use of charset on embedded javascript tags.
+    Closes: #731197
+  * style.css: Add compatibility definitions for more block-level
+    html5 elements. Closes: #731199
+  * aggregrate: Fix several bugs in handling of empty and colliding
+    titles when generating filenames.
+
+ -- Joey Hess <joeyh@debian.org>  Thu, 02 Jan 2014 12:22:22 -0400
+
+ikiwiki (3.20130904.1) unstable; urgency=low
+
+  * Fix cookiejar default setting.
+
+ -- Joey Hess <joeyh@debian.org>  Wed, 04 Sep 2013 10:15:37 -0400
+
+ikiwiki (3.20130904) unstable; urgency=low
+
+  * calendar: Display the popup mouseover when there is only 1 page for a
+    given day, for better UI consistency.
+  * meta: Can now be used to add an enclosure to a page, which is a fancier
+    way to do podcasting than just inlining the media files directly;
+    this way you can write a post about the podcast episode with show notes,
+    author information, etc.
+    (schmonz)
+  * aggregate: Show author in addition to feedname, if different.
+    (schmonz)
+  * Consistently configure LWP::UserAgent to allow use of http_proxy
+    and no_proxy environment variables, as well as ~/.ikiwiki/cookies
+    (schmonz)
+  * Fix test suite to work with perl 5.18. Closes: #719969
+
+ -- Joey Hess <joeyh@debian.org>  Wed, 04 Sep 2013 08:54:31 -0400
+
+ikiwiki (3.20130711) unstable; urgency=low
+
+  * Deal with git behavior change in 1.7.2 and newer that broke support
+    for commits with an empty commit message.
+  * Pass --no-edit when used with git 1.7.8 and newer.
+
+ -- Joey Hess <joeyh@debian.org>  Wed, 10 Jul 2013 21:49:23 -0400
+
+ikiwiki (3.20130710) unstable; urgency=low
+
+  * blogspam: Fix encoding issue in RPC::XML call.
+    Thanks, Changaco
+  * comments: The formats allowed to be used in comments can be configured
+    using comments_allowformats.
+    Thanks, Michal Sojka
+  * calendar: When there are multiple pages for a given day, they're
+    displayed in a popup on mouseover.
+    Thanks, Louis
+  * osm: Remove trailing slash from KML maps icon.
+  * page.tmpl: omit searchform, trails, sidebar and most metadata in CGI
+    (smcv)
+  * openid: Automatically upgrade openid_realm to https when
+    accessed via https.
+  * The ip() pagespec can now contain glob characters to match eg, a subnet
+    full of spammers.
+  * Fix crash that could occur when a needsbuild hook returned a file
+    that does not exist.
+  * Fix python proxy to not crash when fed unicode data in getstate
+    and setstate.
+    Thanks, chrysn
+  * Fix committing attachments when using svn.
+
+ -- Joey Hess <joeyh@debian.org>  Wed, 10 Jul 2013 17:45:40 -0400
+
+ikiwiki (3.20130518) unstable; urgency=low
+
+  * Fix test suite to not fail when XML::Twig is not installed.
+    Closes: #707436
+  * theme: Now <TMPL_IF THEME_$NAME> can be used in all templates when
+    a theme is enabled.
+  * notifyemail: Fix bug that caused duplicate emails to be sent when
+    site was rebuilt.
+  * bzr: bzr rm no longer has a --force option, remove
+
+ -- Joey Hess <joeyh@debian.org>  Sat, 18 May 2013 16:28:21 -0400
+
+ikiwiki (3.20130504) unstable; urgency=low
+
+  * Allow dots in directive parameter names. (tango)
+  * Add missing plugin section, and deal with missing sections with a warning.
+  * Detect plugins with a broken getsetup and warn.
+  * map: Correct reversion introduced in version 3.20110225 that could
+    generate invalid html. (smcv)
+  * Makefile.PL: overwrite theme style.css instead of appending
+    (Thanks, Mikko Rapeli)
+  * meta: Fix anchors used to link to the page's license and copyright.
+    Closes: #706437
+
+ -- Joey Hess <joeyh@debian.org>  Sat, 04 May 2013 23:47:21 -0400
+
+ikiwiki (3.20130212) unstable; urgency=low
+
+  * htmlscrubber: Allow the bitcoin URI scheme.
+  * htmlscrubber: Allow the URI schemes of major VCS's.
+  * aggregate: When run with --aggregate, if an aggregation is already
+    running, don't go on and --refresh.
+  * trail: Avoid excess dependencies between pages in the trail
+    and the page defining the trail. Thanks, smcv.
+  * opendiscussion: Don't allow editing discussion pages if discussion pages
+    are disabled. (smcv)
+  * poll: Add expandable option to allow users to easily add new choices to
+    a poll.
+  * trail: Avoid massive slowdown caused by pagetemplate hook when displaying
+    dynamic cgi pages, which cannot use trail anyway.
+  * Deal with empty diffurl in configuration.
+  * cvs: Various fixes. (schmonz)
+  * highlight: Now adds a span with class highlight-<extension> around
+    highlighted content, allowing for language-specific css styling.
+
+ -- Joey Hess <joeyh@debian.org>  Tue, 12 Feb 2013 21:48:02 -0400
+
+ikiwiki (3.20121212) unstable; urgency=low
+
+  * filecheck: Fix bug that prevented File::MimeInfo::Magic from ever
+    being used.
+  * openid: Display openid in Preferences page as a comment, so it can be
+    selected in all browsers.
+
+ -- Joey Hess <joeyh@debian.org>  Tue, 11 Dec 2012 12:12:12 -0400
+
+ikiwiki (3.20121017) unstable; urgency=low
+
+  * recentchangesdiff: fix further breakage to the template from 3.20120725 
+
+ -- Joey Hess <joeyh@debian.org>  Tue, 16 Oct 2012 20:49:27 -0400
+
+ikiwiki (3.20121016) unstable; urgency=low
+
+  * monochrome: New theme, contributed by Jon Dowland.
+  * rst: Ported to python 3, while still also being valid python 2.
+    Thanks, W. Trevor King
+  * Try to avoid a situation in which so many ikiwiki cgi wrapper programs
+    are running, all waiting on some long-running thing like a site rebuild,
+    that it prevents the web server from doing anything else. The current
+    approach only avoids this problem for GET requests; if multiple cgi's
+    run GETs on a site at the same time, one will display a "please wait"
+    page for a configurable number of seconds, which then redirects to retry.
+    To enable this protection, set cgi_overload_delay to the number of
+    seconds to wait. This is not enabled by default.
+  * Add back a 1em margin between archivepage divs.
+  * recentchangesdiff: Correct broken template that resulted in duplicate
+    diff icons being displayed, and bloated the recentchanges page with
+    inline diffs when the configuration should have not allowed them.
+
+ -- Joey Hess <joeyh@debian.org>  Tue, 16 Oct 2012 15:14:19 -0400
+
+ikiwiki (3.20120725) unstable; urgency=low
+
+  * recentchangesdiff: When diffurl is not set, provide inline diffs
+    in the recentchanges page, with visibility toggleable via javascript.
+    Thanks, Antoine Beaupré
+  * Split CFLAGS into words when building wrapper. Closes: #682237
+  * osm: Avoid calling urlto before generated files are registered.
+    Thanks, Philippe Gauthier and Antoine Beaupré
+  * osm: Add osm_openlayers_url configuration setting.
+    Thanks, Genevieve
+  * osm: osm_layers can be used to configured the layers displayed on the map.
+    Thanks, Antoine Beaupré
+  * comments: Remove ipv6 address specific code.
+
+ -- Joey Hess <joeyh@debian.org>  Sat, 25 Aug 2012 10:58:42 -0400
+
+ikiwiki (3.20120629) unstable; urgency=low
+
+  * mirrorlist: Add mirrorlist_use_cgi setting that avoids usedirs or
+    other config differences by linking to the mirror's CGI. (intrigeri)
+
+ -- Joey Hess <joeyh@debian.org>  Fri, 29 Jun 2012 10:16:08 -0400
+
+ikiwiki (3.20120516) unstable; urgency=high
+
+  * meta: Security fix; add missing sanitization of author and authorurl.
+    CVE-2012-0220 Thanks, Raúl Benencia
+
+ -- Joey Hess <joeyh@debian.org>  Wed, 16 May 2012 19:51:27 -0400
+
+ikiwiki (3.20120419) unstable; urgency=low
+
+  * Remove dead link from plugins/teximg. Closes: #664885
+  * inline: When the pagenames list includes pages that do not exist, skip
+    them.
+  * meta: Export author information in html <meta> tag. Closes: #664779
+    Thanks, Martin Michlmayr
+  * notifyemail: New plugin, sends email notifications about new and 
+    changed pages, and allows subscribing to comments.
+  * Added a "changes" hook. Renamed the "change" hook to "rendered", but
+    the old hook name is called for now for back-compat.
+  * meta: Support keywords header. Closes: #664780
+    Thanks, Martin Michlmayr
+  * passwordauth: Fix url in password recovery email to be absolute.
+  * httpauth: When it's the only auth method, avoid a pointless and
+    confusing signin form, and go right to the httpauthurl.
+  * rename: Allow rename to be started not from the edit page; return to
+    the renamed page in this case.
+  * remove: Support removing of pages in the transient underlay. (smcv)
+  * inline, trail: The pagenames parameter is now a list of absolute
+    pagenames, not relative wikilink type names. This is necessary to fix
+    a bug, and makes pagenames more consistent with the pagespec used
+    in the pages parameter. (smcv)
+  * link: Fix renaming wikilinks that contain embedded urls.
+  * graphviz: Handle self-links.
+  * trail: Improve CSS, also display trail links at bottom of page,
+    and a bug fix. (smcv)
+
+ -- Joey Hess <joeyh@debian.org>  Thu, 19 Apr 2012 15:32:07 -0400
+
+ikiwiki (3.20120319) unstable; urgency=low
+
+  * osm: New plugin to embed an OpenStreetMap into a wiki page.
+    Supports waypoints, tags, and can even draw paths matching
+    wikilinks between pages containing waypoints.
+    Thanks to Blars Blarson and Antoine Beaupré, as well as the worldwide
+    OpenStreetMap community for this utter awesomeness.
+  * trail: New plugin to add navigation trails through pages via Next and
+    Previous links. Trails can easily be added to existing inlines by setting
+    trail=yes in the inline.
+    Thanks to Simon McVittie for his persistance developing this feature.
   * Fix a snail mail address. Closes: #659158
   * openid-jquery.js: Update URL of Wordpress favicon. Closes: #660549
   * Drop the version attribute on the generator tag in Atom feeds
     to make builds more reproducible. Closes: #661569 (Paul Wise)
   * shortcut: Support Wikipedia's form of url-encoding for unicode
     characters, which involves mojibake. Closes: #661198
-  * osm: New plugin to embed an OpenStreetMap into a wiki page.
-    Supports waypoints, tags, and can even draw paths matching
-    wikilinks between pages containing waypoints.
-    Thanks to Blars Blarson and Antoine Beaupré, as well as the worldwide
-    OpenStreetMap community for this utter awesomeness.
   * Add a few missing jquery UI icons to attachment upload widget underlay.
   * URI escape filename when generating the diffurl.
+  * Add build-affected hook. Used by trail.
 
- -- Joey Hess <joeyh@debian.org>  Wed, 08 Feb 2012 16:07:00 -0400
+ -- Joey Hess <joeyh@debian.org>  Mon, 19 Mar 2012 14:24:43 -0400
 
 ikiwiki (3.20120202) unstable; urgency=low
 
index 7f8f011eb73d6043d2e6db9d2c101195ae2801f2..ec635144f60048986bc560c5576355344005e6e7 100644 (file)
@@ -1 +1 @@
-7
+9
index 54cbd0f7bef122ec7185295989b4513eb8c56f7e..2ab6207e038ea3e9ee50bf7652d4498eea161e5f 100644 (file)
@@ -1,22 +1,23 @@
 Source: ikiwiki
 Section: web
 Priority: optional
-Build-Depends: perl, debhelper (>= 7.0.50)
+Build-Depends: perl, debhelper (>= 9)
 Build-Depends-Indep: dpkg-dev (>= 1.9.0), libxml-simple-perl,
   libtext-markdown-discount-perl,
   libtimedate-perl, libhtml-template-perl,
   libhtml-scrubber-perl, wdg-html-validator,
   libhtml-parser-perl, liburi-perl (>= 1.36), perlmagick, po4a (>= 0.34),
-  libfile-chdir-perl, libyaml-libyaml-perl, python-support
+  libfile-chdir-perl, libyaml-libyaml-perl, python-support, librpc-xml-perl,
+  libcgi-session-perl
 Maintainer: Joey Hess <joeyh@debian.org>
 Uploaders: Josh Triplett <josh@freedesktop.org>
-Standards-Version: 3.9.2
+Standards-Version: 3.9.5
 Homepage: http://ikiwiki.info/
 Vcs-Git: git://git.ikiwiki.info/
 
 Package: ikiwiki
 Architecture: all
-Depends: ${misc:Depends}, ${perl:Depends}, ${python:Depends}, 
+Depends: ${misc:Depends}, ${perl:Depends},
   libtext-markdown-discount-perl,
   libhtml-scrubber-perl, libhtml-template-perl,
   libhtml-parser-perl, liburi-perl (>= 1.36), libyaml-libyaml-perl, libjson-perl
@@ -45,8 +46,8 @@ Provides: ikiwiki-plugin-table
 Description: a wiki compiler
  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.
+ 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
  web-based page editing, user registration and logins, a RecentChanges
index 8fddb682b74d6bee7d721d60ee2b2b6b8af5c2ea..f3ea9e740d4ad50d46008ea5890360996596f9f8 100644 (file)
@@ -157,6 +157,10 @@ Files: IkiWiki/Plugin/osm.pm
 Copyright: © 2011 Blars Blarson, Antoine Beaupré
 License: GPL-2
 
+Files: IkiWiki/Plugin/trail.pm
+Copyright: 2009-2012 Simon McVittie <http://smcv.pseudorandom.co.uk/>
+License: GPL-2+
+
 Files: doc/logo/*
 Copyright: © 2006 Recai Oktaş <roktas@debian.org>
 License: GPL-2+
@@ -207,6 +211,34 @@ Comment:
  From http://code.google.com/p/openid-selector/
 License: BSD-2-clause
 
+Files: underlays/openid-selector/ikiwiki/openid/goa-*
+Copyright:
+ © 2011 Red Hat, Inc.
+License: LGPL-2.1+
+Comment:
+ taken from data/icons/16x16/ in gnome-online-accounts git
+
+Files: underlays/openid-selector/ikiwiki/openid/wordpress.png
+Copyright:
+ © 2003-2013 "the contributors"
+License: GPL-2+
+Comment:
+ taken from wp-admin/images/w-logo-blue.png in wordpress/3.8.1+dfsg1-1
+ and trivially modified (resized to 16x16, placed on a white background)
+
+Files:
+ icons/aol.svg
+ icons/livejournal.svg
+ icons/verisign.svg
+ underlays/openid-selector/ikiwiki/openid/aol.png
+ underlays/openid-selector/ikiwiki/openid/livejournal.png
+ underlays/openid-selector/ikiwiki/openid/verisign.png
+Copyright:
+ © 2014 Simon McVittie
+License: other
+ Redistribution and use in source and compiled forms, with or without
+ modification, are permitted under any circumstances. No warranty.
+
 Files: underlays/jquery/*
 Copyright: © 2005-2011 by John Resig, Branden Aaron & Jörn Zaefferer
            © 2011 The Dojo Foundation
@@ -244,6 +276,10 @@ Files: underlays/themes/goldtype/*
 Copyright: © Lars Wirzenius
 License: GPL-2+
 
+Files: underlays/themes/monochrome/*
+Copyright: © 2012 Jon Dowland
+License: GPL-2+
+
 License: BSD-2-clause
  Redistribution and use in source and binary forms, with or without
  modification, are permitted provided that the following conditions
@@ -293,3 +329,20 @@ License: Expat
  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  SOFTWARE. 
+
+License: LGPL-2.1+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+ .
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ Lesser General Public License for more details.
+ .
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ .
+ On Debian systems, the complete text of the GNU Lesser General
+ Public License can be found in `/usr/share/common-licenses/LGPL-2.1'.
index 012e52fa0a1e9b6017b02319f01a0262a3ea79be..12d193fe9a3af99e14441cd62df4e77e7db3fbcc 100644 (file)
@@ -1,3 +1,11 @@
 ikiwiki works with anchors in various situations.
 
+You can insert anchors directly in the body of a page and it will be used on the resulting HTML, for example:
+
+    <a name="anchor"></a>
+
+... will make the link [[anchor#anchor]] work..
+
+<a name="anchor"></a>
+
 This page accumulates links to the concept of anchors.
index e76bdb8d1b5aceaf23058561a030b4e281bfe9d5..c66534fc28a9e3fdb145ec62c7440d5872794ef7 100644 (file)
@@ -30,5 +30,3 @@ Bulleted list
 * item
 
 [[ikiwiki/WikiLink]]
-
-[[!calendar type="month" pages="blog/*"]]
index b7b9164acd0c8bcbc3cc96e5e0e2134af1933b56..232f2ce6a71f1cd14ca2b85d4d8dad2baf7c5e02 100644 (file)
@@ -20,6 +20,6 @@ Long-lived branches in the main git repository:
 * `ignore` gets various branches merged to it that [[Joey]] wishes to ignore
   when looking at everyone's unmerged changes.
 * `pristine-tar` contains deltas that
-  [pristine-tar](http://kitenet.net/~joey/code/pristine-tar)
+  [pristine-tar](http://joeyh.name/code/pristine-tar)
   can use to recreate released tarballs of ikiwiki
 * `setup` contains the ikiwiki.setup file for this site
diff --git a/doc/bugs/Attachment_plug-in_not_committing_files.mdwn b/doc/bugs/Attachment_plug-in_not_committing_files.mdwn
new file mode 100644 (file)
index 0000000..aaba133
--- /dev/null
@@ -0,0 +1,18 @@
+I've added the attachment plug-in to our wiki. I am able to add files to the working copy of the website on the server, but none of the file are being checked into the SVN repository. Using logging I've tracked the problem to line 293 of attachment.pm:
+
+  IkiWiki::rcs_add($_) foreach @attachments;
+
+Here it is trying to add an absolute path to the file when rcs_add is expecting a path relative to the SVN root.
+
+From this code it looks like $dest needs to be absolute and that a relative path needs to be pushed to @attachments:
+
+    rename($filename, $dest);
+    push @attachments, $dest;
+
+I'm using ikiwiki version 3.20120202ubuntu1.
+
+> I don't think this affects git, just because it happens to 
+> allow adding with an absolute path.
+> 
+> So, this is an interesting way svn support can bit rot if nothing
+> is testing it! [[fixed|done]] --[[Joey]]  
diff --git a/doc/bugs/CGI_wrapper_doesn__39__t_store_PERL5LIB_environment_variable.mdwn b/doc/bugs/CGI_wrapper_doesn__39__t_store_PERL5LIB_environment_variable.mdwn
new file mode 100644 (file)
index 0000000..81a5abf
--- /dev/null
@@ -0,0 +1,28 @@
+If you wish to install ikiwiki in your home directory (for example because you don't have root access), you need to set environment variables (such as PATH and PERL5LIB) to point to these directories that contain your personal copy of IkiWiki.
+
+The CGI wrapper remembers PATH, but not the environment variable PERL5LIB. Consequently, it will look for plugins and so on in the usual system directories, not in your personal copy. This is particularly insidious if you have a system copy of a different version installed, as your CGI wrapper may then load in code from this version.
+
+I think the CGI wrapper should remember PERL5LIB too.
+
+-- Martin
+
+Thank's a lot for pointing me to this location in the code. I was looking it for some time.
+
+This brutal patch implement your solution as a temporary fix.
+
+    *** Wrapper.pm.old      2012-08-25 16:41:41.000000000 +0200
+    --- Wrapper.pm  2012-10-01 17:33:17.582956524 +0200
+    ***************
+    *** 149,154 ****
+    --- 149,155 ----
+      $envsave
+            newenviron[i++]="HOME=$ENV{HOME}";
+            newenviron[i++]="PATH=$ENV{PATH}";
+    +       newenviron[i++]="PERL5LIB=$ENV{PERL5LIB}";
+            newenviron[i++]="WRAPPED_OPTIONS=$configstring";
+      
+      #ifdef __TINYC__
+
+As I am not sure that remembering `PERL5LIB` is a good idea, I think that a prettier solution will be to add a config variable (let's say `cgi_wrapper_perllib`) which, if fixed, contains the `PERL5LIB` value to include in the wrapper, or another (let's say `cgi_wrapper_remember_libdir`), which, if fixed, remember the current `PERL5LIB`.
+
+-- Bruno
diff --git a/doc/bugs/CamelCase_and_Recent_Changes_create_spurious_Links.mdwn b/doc/bugs/CamelCase_and_Recent_Changes_create_spurious_Links.mdwn
new file mode 100644 (file)
index 0000000..de95fb7
--- /dev/null
@@ -0,0 +1,11 @@
+Hi folks,
+
+This is a fairly fresh wiki.  I recently noticed the Links: section the the bottom looked like this:
+
+Links: index recentchanges/change 0b2f03d3d21a3bb21f6de75d8711c73df227e17c recentchanges/change 1c5b830b15c4f2f0cc97ecc0adfd60a1f1578918 recentchanges/change 20b20b91b90b28cdf2563eb959a733c6dfebea7a recentchanges/change 3377cedd66380ed416f59076d69f546bf12ae1e4 recentchanges/change 4c53d778870ea368931e7df2a40ea67d00130202 recentchanges/change 7a9f3c441a9ec7e189c9df322851afa21fd8b00c recentchanges/change 7dcaea1be47308ee27a18f893ff232a8370e348a recentchanges/change 963245d4e127159e12da436dea30941ec371c6be recentchanges/change cd489ff4abde8dd611f7e42596b93953b38b9e1c ... 
+
+All of those "recentchanges/ change xxxxxxx" links are clickable, but all yield 404 when clicked.
+
+When I disable the CamelCase plugin and rebuild the wiki, all the Links other than index disappear, as they should.  Re-enable CamelCase, and they're back.
+
+This is a very simple wiki.  Just fresh, only one page other than index (this one), and nothing at all fancy/weird about it.
index 2fa4a475917263959fc123f0a9cbc771c3d068a1..bc46302b095a4833c68797909af14f83afe3355c 100644 (file)
@@ -81,3 +81,7 @@ Please tell me if you need more info.  The same openid worked fine to login to *
 
 >>>>> Investigation revealed it was a bug in the freebsd patch, which I
 >>>>> understand is going to be dealt with. [[done]] --[[Joey]] 
+
+I am getting the same error here with ikiwiki 3.20120629 (wheezy). I had trouble with ikiwiki-hosting configurations of OpenID, basically related to the `openid_realm` parameter - which I had to comment out. But now it seems to fail regardless. --[[anarcat]]
+
+> Nevermind, this was because I was blocking cookie on the CGI (!!). Message *could* be improved though, it's not the first time i stumble upon this... --[[anarcat]]
index 0082eed4d11d23c7184e6231798b894f0bb287c4..0bbf6096fd9122abd40b739a4f37332c187f9d9a 100644 (file)
@@ -2,7 +2,7 @@ That one has bitten me for some time; here is the minimal testcase.  There is
 also an equivalent (I suppose) problem when using another plugin, but I hope
 it's enough to track it down for this one.
 
-    $ tar -xj < [bug-dep_order.tar.bz2](http://schwinge.homeip.net/~thomas/tmp/bug-dep_order.tar.bz2)
+    $ tar -xj < [bug-dep_order.tar.bz2](http://nic-nac-project.de/~schwinge/ikiwiki/bug-dep_order.tar.bz2)
     $ cd bug-dep_order/
     $ ./render_locally
     [...]
diff --git a/doc/bugs/Existing_Discussion_pages_appear_as_non-existing.mdwn b/doc/bugs/Existing_Discussion_pages_appear_as_non-existing.mdwn
new file mode 100644 (file)
index 0000000..9ba4ede
--- /dev/null
@@ -0,0 +1,5 @@
+If you look at [[todo/org mode]], the link to the Discussion page is not there (has a question mark), as if it didn't exist. But--through the search--I discovered that the Discussion page does exist actually: [[todo/org mode/Discussion]]. 
+
+So, there is a bug that prevents a link to the existing Discussion page from appearing in the correct way on the corresponding main page. --Ivan Z.
+
+Perhaps, this has something to do with the same piece of code/logic (concerning case-sensitivity) as the fixed [[bugs/unwanted discussion links on discussion pages]]? --Ivan Z.
diff --git a/doc/bugs/FormattingHelp_links_to_MarkDown_help_page_regardless_of_page_format.mdwn b/doc/bugs/FormattingHelp_links_to_MarkDown_help_page_regardless_of_page_format.mdwn
new file mode 100644 (file)
index 0000000..04e7e90
--- /dev/null
@@ -0,0 +1,3 @@
+The `FormattingHelp` link in the edit form of any page points to the same [ikiwiki/formatting](/ikiwiki/formatting) help text for Markdown, regardless of page type (which could be HTML, reStructuredText, etc.)  On the wiki I run, this is confusing users.  
+
+What I would like is that either the `FormattingHelp` link changes with page type (requires Javascript, if one is going to change the page type for new pages), or that the [ikiwiki/formatting](/ikiwiki/formatting) page is an index of supported page types with a further link to help text for each one (less user-friendly but likely easier to implement).
diff --git a/doc/bugs/Inlining_adds_newlines_which_can_break_markdown.mdwn b/doc/bugs/Inlining_adds_newlines_which_can_break_markdown.mdwn
new file mode 100644 (file)
index 0000000..eb71994
--- /dev/null
@@ -0,0 +1,43 @@
+I'm trying to put a list of tags in a table, so I carefully make a newline-free taglist.tmpl and then do:
+
+    | \[[!inline pages="link(/category/env)" feeds=no archive=yes sort=title template=taglist]] |
+
+but there's a line in `inline.pm` that does:
+
+    return "&lt;div class=\"inline\" id=\"$#inline\"&gt;&lt;/div&gt;\n\n";
+
+And the extra newlines break the table.  Can they be safely removed?
+
+> If you want an HTML table, I would suggest using an HTML table, which
+> should pass through Markdown without being interpreted further:
+>
+>     <table><tr>
+>     \[[!inline pages="link(/category/env)" feeds=no archive=yes sort=title template=tagtd]]
+>     </tr></table>
+>
+> where tagtd.tmpl is of the form `<td>your markup here</td>`; or even just
+>
+>     \[[!inline pages="link(/category/env)" feeds=no archive=yes sort=title template=tagtable]]
+>
+> where tagtable.tmpl looks like
+>
+>     <TMPL_IF FIRST>
+>     <table><tr>
+>     </TMPL_IF>
+>
+>     <td>your tag here</td>
+>
+>     <TMPL_IF LAST>
+>     </tr></table>
+>     </TMPL_IF>
+>
+> I don't think you're deriving much benefit from Markdown's table syntax
+> if you have to mix it with HTML::Template and ikiwiki directives,
+> and be pathologically careful with whitespace. "Right tool for the job"
+> and all that :-)
+>
+> When I edited this page I was amused to find that you used HTML,
+> not Markdown, as its format. It seems oddly appropriate to my answer, but
+> I've converted it to Markdown and adjusted the formatting, for easier
+> commenting.
+> --[[smcv]]
diff --git a/doc/bugs/Linkmap_doesn__39__t_support_multiple_linkmaps_on_a_single_page.mdwn b/doc/bugs/Linkmap_doesn__39__t_support_multiple_linkmaps_on_a_single_page.mdwn
new file mode 100644 (file)
index 0000000..a064547
--- /dev/null
@@ -0,0 +1,3 @@
+If I use the linkmap directive twice on a single page, I get the same image appearing in both locations, even though the parameters for the two directives may have been different.
+
+-- Martin
diff --git a/doc/bugs/Navbar_does_not_link_to_page_being_commented_on_while_commenting.mdwn b/doc/bugs/Navbar_does_not_link_to_page_being_commented_on_while_commenting.mdwn
new file mode 100644 (file)
index 0000000..4c7b12e
--- /dev/null
@@ -0,0 +1,11 @@
+Say you are commenting on this report. The Navbar on top will look like
+
+[ikiwiki](http://ikiwiki.info/)/ [bugs](http://ikiwiki.info/bugs/)/ commenting on Navbar does not link to page being commented on while commenting
+
+while either of those two options would be better:
+
+[ikiwiki](http://ikiwiki.info/)/ [bugs](http://ikiwiki.info/bugs/)/ commenting on [Navbar does not link to page being commented on while commenting](http://ikiwiki.info/bugs/Navbar_does_not_link_to_page_being_commented_on_while_commenting/)
+
+[ikiwiki](http://ikiwiki.info/)/ [bugs](http://ikiwiki.info/bugs/)/ [Navbar does not link to page being commented on while commenting](http://ikiwiki.info/bugs/Navbar_does_not_link_to_page_being_commented_on_while_commenting/) / New comment
+
+-- RichiH
diff --git a/doc/bugs/Please_update_highlight_plugin_for_highlight_3.18.mdwn b/doc/bugs/Please_update_highlight_plugin_for_highlight_3.18.mdwn
new file mode 100644 (file)
index 0000000..e98f668
--- /dev/null
@@ -0,0 +1,12 @@
+I have put two patches 
+
+     git://pivot.cs.unb.ca/ikiwiki.git -b master
+
+The first works around a highlight API change, and the second supports the new(ish) 
+feature of having multiple directories with language defintions for highlight.
+
+The corresponding version of libhighlight-perl is in Debian experimental if you want to test.
+
+[[!tag patch]] 
+
+> [[done]] thanks --[[Joey]]
diff --git a/doc/bugs/Remove_redirect_pages_from_inline_pages.mdwn b/doc/bugs/Remove_redirect_pages_from_inline_pages.mdwn
new file mode 100644 (file)
index 0000000..a43bd40
--- /dev/null
@@ -0,0 +1,15 @@
+[[!tag bugs wishlist]]
+
+
+I accidentally made a typo spelling "surprises" and changed my URL from
+
+<http://natalian.org/archives/2012/12/04/Singapore_banking_suprises/>
+to
+<http://natalian.org/archives/2012/12/04/Singapore_banking_suprises/>
+
+Using the meta redir. However the meta redir now appears in the index of <http://natalian.org/>
+
+Any ideas how to handle this situation?
+
+> Well, you can adjust the inline's pagespec to exclude it, or even tag it
+> with a tag that the pagespec is adjusted to exclude. --[[Joey]]
diff --git a/doc/bugs/Slow_Filecheck_attachments___34__snails_it_all__34__.mdwn b/doc/bugs/Slow_Filecheck_attachments___34__snails_it_all__34__.mdwn
new file mode 100644 (file)
index 0000000..e93f4e5
--- /dev/null
@@ -0,0 +1,47 @@
+Saving a wiki page in ikwiki or 
+<tt>ikiwiki --setup wiki.setup --rebuild</tt> takes a **dozen minutes** on a tiny tiny wiki (10 user-added pages)!
+
+I profiled ikiwiki with [[!cpan Devel::SmallProf]] : see [[users/mathdesc]] for details.
+
+And I came to the conclusion that [[plugins/filecheck]] on attachment was the only cause.
+It always go the fallback code using time-consuming file even there it's look like it's
+not successful. 
+
+<pre>
+ # Get the mime type.
+        #
+        # First, try File::Mimeinfo. This is fast, but doesn't recognise
+        # all files.
+        eval q{use File::MimeInfo::Magic};                    
+        my $mimeinfo_ok=! $@;                                     
+        my $mimetype;
+        if ($mimeinfo_ok) {
+                my $mimetype=File::MimeInfo::Magic::magic($file);
+        }                                                         
+        
+        # Fall back to using file, which has a more complete
+        # magic database.
+        if (! defined $mimetype) {
+                open(my $file_h, "-|", "file", "-bi", $file); 
+                $mimetype=<$file_h>;                                 
+                chomp $mimetype;                            
+                close $file_h;                   
+        }
+        if (! defined $mimetype || $mimetype !~s /;.*//) {
+                # Fall back to default value.
+                $mimetype=File::MimeInfo::Magic::default($file)
+                        if $mimeinfo_ok; 
+                if (! defined $mimetype) {
+                        $mimetype="unknown";
+                }                                                  
+        }        
+</pre>
+
+I found on [[plugins/filecheck/discussion/]] what [[users/DavidBremner/]] described as :
+> no way to detect text/plain using File::MimeInfo::Magic::magic()
+But I can't figure out if my issue is boarder and includes this or not.. 
+
+Any ideas , solve :) more that welcome.
+
+> [[done]], as isbear noted in [[discussion]], there was a bug that
+> prevented File::MimeInfo::Magic from ever being used. --[[Joey]]
diff --git a/doc/bugs/Slow_Filecheck_attachments___34__snails_it_all__34__/discussion.mdwn b/doc/bugs/Slow_Filecheck_attachments___34__snails_it_all__34__/discussion.mdwn
new file mode 100644 (file)
index 0000000..629aba7
--- /dev/null
@@ -0,0 +1,141 @@
+##Foreword :
+Disabling of filecheck is not actually possible because btw it cause the attachment.pm to malfunction and
+any of pagespec that could contain a *mimetype* condition.
+
+attachment.pm imports "statically"  filecheck so actually disabling it should be *interdicted* .
+
+<pre>
+sub import {
+        add_underlay("attachment");
+        add_underlay("javascript");
+        add_underlay("jquery");
+        hook(type => "getsetup", id => "attachment", call => \&getsetup);
+        hook(type => "checkconfig", id => "attachment", call => \&checkconfig);
+        hook(type => "formbuilder_setup", id => "attachment", call => \&formbuilder_setup);
+        hook(type => "formbuilder", id => "attachment", call => \&formbuilder, last => 1);
+        IkiWiki::loadplugin("filecheck");
+}
+</pre>
+
+----
+
+## How bad is it ?
+
+So I tried on three pages to inline <tt>!mimetype(image/*)</tt> while I allowed attachment of <tt>mimetype(image/*)</tt>
+
+My profiling tests in the bug report shows that most of the time is spend in the "Fallback using file" block code,
+I tried to comment that block and see how it'll perform. Obviously this is much much faster ... but is the mimetype
+discovered using only *File::MimeInfo* ?
+
+
+Dumping some strings before return to STDERR, rebuilding . This is just a  [[!toggle  id="code-test" text="dumpdebug adding"]] 
+
+[[!toggleable  id="code-test" text="""
+<pre>
+sub match_mimetype ($$;@) {
+        my $page=shift;
+        my $wanted=shift;
+
+        my %params=@_;
+        my $file=exists $params{file} ? $params{file} : IkiWiki::srcfile($IkiWiki::pagesources{$page});
+        if (! defined $file) {
+                return IkiWiki::ErrorReason->new("file does not exist");
+        }
+
+        # Get the mime type.
+        #
+        # First, try File::Mimeinfo. This is fast, but doesn't recognise
+        # all files.
+        eval q{use File::MimeInfo::Magic};
+        my $mimeinfo_ok=! $@;
+        my $mimetype;
+        print STDERR " --- match_mimetype (".$file.")\n";
+        if ($mimeinfo_ok) {
+                my $mimetype=File::MimeInfo::Magic::magic($file);
+        }
+
+        # Fall back to using file, which has a more complete
+        # magic database.
+        #if (! defined $mimetype) {
+        #       open(my $file_h, "-|", "file", "-bi", $file);
+        #       $mimetype=<$file_h>;
+        #       chomp $mimetype;
+        #       close $file_h;
+        #}
+
+        if (! defined $mimetype || $mimetype !~s /;.*//) {
+                # Fall back to default value.
+                $mimetype=File::MimeInfo::Magic::default($file)
+                        if $mimeinfo_ok;
+                if (! defined $mimetype) {
+                        $mimetype="unknown";
+                }
+        }
+
+        my $regexp=IkiWiki::glob2re($wanted);
+        if ($mimetype!~$regexp) {
+                 print STDERR " xxx MIME unknown ($mimetype - $wanted - $regexp ) \n";
+                return IkiWiki::FailReason->new("file MIME type is $mimetype, not $wanted");
+        }
+        else {
+                print STDERR " vvv MIME found\n";
+                return IkiWiki::SuccessReason->new("file MIME type is $mimetype");
+        }
+}
+</pre>
+"""]]
+
+The results dump to stderr (or a file called... 'say *mime*) looks like this :
+<pre>
+--- match_mimetype (/usr/share/ikiwiki/attachment/ikiwiki/jquery.fileupload-ui.js)
+ xxx MIME unknown (text/plain - image/* - (?i-xsm:^image\/.*$) )
+ --- match_mimetype (/usr/share/ikiwiki/locale/fr/directives/ikiwiki/directive/fortune.mdwn)
+ xxx MIME unknown (text/plain - image/* - (?i-xsm:^image\/.*$) )
+ --- match_mimetype (/usr/share/ikiwiki/locale/fr/basewiki/shortcuts.mdwn)
+ xxx MIME unknown (text/plain - image/* - (?i-xsm:^image\/.*$) 
+ --- match_mimetype (/usr/share/ikiwiki/smiley/smileys/alert.png)
+ xxx MIME unknown (application/octet-stream - image/* - (?i-xsm:^image\/.*$) )
+ --- match_mimetype (/usr/share/ikiwiki/attachment/ikiwiki/images/ui-bg_flat_75_ffffff_40x100.png)
+ xxx MIME unknown (application/octet-stream - image/* - (?i-xsm:^image\/.*$) 
+</pre>
+
+<tt>---</tt> prepend signals the file on analysis<br/>
+<tt>xxx</tt> prepend signals a returns failure : mime is unknown, the match is a failure<br/>
+<tt>vvv</tt> prepend signals a return success.<br/>
+
+
+This is nasty-scary results ! Something missed me or this mime-filecheck is plain nuts ?
+
+*Question 1* : How many files have been analysed : **3055** (yet on a tiny tiny wiki)
+<pre>grep "^ --- " mime | wc -l
+3055
+</pre>
+
+*Question 2* : How many time it fails : *all the time*
+<pre>
+ grep "^ xxx " mime | wc -l
+3055
+</pre>
+
+*Question 1bis*  : Doh btw , how many files have been re-analysed ?  ** 2835 ** OMG !!
+<pre>grep "^ --- " mime | sort -u | wc -l
+220
+</pre>
+
+## Conclusion
+
+- Only the system command *file -bi* works. While it is **should** be easy on the cpu , it's also hard on the I/O -> VM :( 
+- Something nasty with the mime  implementation and/or my system configuration -> Hints ? :D
+- Need to cache during the rebuild : a same page needs not being rechecked for its mime while it's locked !
+
+
+--mathdesc
+
+> >        if ($mimeinfo_ok) {
+> >                my $mimetype=File::MimeInfo::Magic::magic($file);
+> >        }
+> 
+> That seems strange to me, `my` restricts scope of $mimetype to enclosing if block, thus, assigned value will be dropped - I think, it is the problem.
+> Try removing that stray `my`.
+>
+> --isbear
index e3b1d858dff019cea76b5f6485904281bdb751dc..15f74c497dfeaf7e9053ee0abf20ff3d7a90ecdc 100644 (file)
@@ -41,3 +41,19 @@ A fix is to change inlinepage.tmpl to remove new lines around tag links, as foll
 > 
 > I don't have the prerequisites for the syntax plugin installed here
 > to debug it myself. --[[Joey]]
+
+> I don't think that this is specific to the [[syntax_(3rd_party)_plugin|plugins/contrib/syntax]].
+> It's happening on my pages that just use ordinary templates.
+> I've documented my versions below. --[[daveloyall]]
+>
+>     ikiwiki: 3.20140125
+>     libtext-markdown-discount-perl: 0.11-1
+>     libtext-multimarkdown-perl: 1.000034-1
+>     libhtml-template-perl: 2.95-1
+
+>> Can you show us the source code and output for a page that has this
+>> bug?
+>>
+>> If you enable [[plugins/htmlbalance]], does the problem go away?
+>> (If it does, then I think I might know what the bug is.)
+>> --[[smcv]]
diff --git a/doc/bugs/Underscores_in_links_don__39__t_appear.mdwn b/doc/bugs/Underscores_in_links_don__39__t_appear.mdwn
new file mode 100644 (file)
index 0000000..b3cacdb
--- /dev/null
@@ -0,0 +1,20 @@
+Observed behavior:
+
+When I create a link like \[[cmd_test]] , the link appears as 'cmd test'.
+
+Expected behavior:
+
+I would like to be able to create links with underscores. I realize this is a feature, and I searched for ways to escape the underscore so it would appear, but I didn't find any.
+
+> as a workaround, you can use \[[cmd\_\_95\_\_test|cmd_test]] (which will link to a page named "cmd test" at the url location "cmd\_test") or \[[cmd\_\_95\_\_test]] (which will link to a page named "cmd\_test" at the url location "cmd\_\_95\_\_test"). i would, from my limited understanding of ikiwiki internals, consider the bug valid, and suggest that
+>
+> * explicit link text be not subject to de-escaping (why should it; this would be the short term solution)
+> * escaped page names never be used in user visible parts of ikiwiki (in my opinion, a user should not need to know about those internals, especially as they are configuration dependant (wiki_file_regexp))
+>
+> note that in [[ikiwiki/wikilink]], that very behavior is documented; it says that "\[[foo\_bar|Sandbox]]" will show as "foo bar". (although you can't tell that apart from "foo\_bar" easily because it's a hyperlink).
+>
+> i assume that this behavior stems from times when wikilinks and [[ikiwiki/directive]]s were not distinguished by \[[ vs \[[! but by the use of whitespace in directives, so whitespace had to be avoided in wikilinks.
+>
+> --[[chrysn]]
+
+> having hacked around in the [[plugins/link]] plugin, i can confirm that the link texts are explicitly de-escaped, and that when no pipe is inside the link (ie links like `\[[cmd_test]]`), the string `"cmd_test"` is regarded as a link (that will subsequently be converted to a readable text) rather than as a readable text (for which a suitable link target is found automatically). --[[chrysn]]
index 3c28e379bdd7fdbeb758e0bf6d87aa9cd9e95086..34eecef8c59db55b775792cb64e90d2cf2b2ea4c 100644 (file)
@@ -22,3 +22,13 @@ Of course, the next time I rerun ikiwiki --setup, it will overwrite my wrapper-w
 I made a logfile of all the args, env, and stdin/stdout to/from my wrapper.  If you're interested, I'll email it to you.  I wasn't able to attach it here.
 
 -- [[terry|tjgolubi]]
+
+I confirm that the supplied w3mmode setup appears not to work. When I try to edit a page and save it, w3m tries to access an URL beginning http://localhost/ . The HTML source of the edit page contains a BASE URL beginning with http://localhost. It should not. Maybe this is a result of changes a while back, where use of absolute URLs was enforced in various places in Ikiwiki.
+
+-- Martin
+
+The problem is that IkiWiki::CGI::cgitemplate() and IkiWiki::CGI::redirect() use Perl's CGI::url() to determine the absolute URL of the CGI script when it is being executed. url() generates an URL beginning http://localhost. As w3m's serverless CGI mode is rather unusual, presumably there's no provision for the URL of a CGI script beginning file:///, even if there's a way to specify that.
+
+A quick workaround might be to force the use of $config{url} instead of $cgi->url as a base for URLs when w3mmode is set.
+
+-- Martin
diff --git a/doc/bugs/Webedits_without_comment_don__39__t_make_it_through_git.mdwn b/doc/bugs/Webedits_without_comment_don__39__t_make_it_through_git.mdwn
new file mode 100644 (file)
index 0000000..f0fc047
--- /dev/null
@@ -0,0 +1,53 @@
+If you edit via web, and don't enter a comment, the commit message for the ensuing Git commit is empty.  Git by default will not commit with a blank commit message, so the edited file is still there in the working files for Ikiwiki but not committed into Git.
+
+A subsequent commit (including another web page edit with comments) will pull this change in with any new editing.  We found this by having spam edits suddenly appear on various pages with no corresponding commits to match.
+
+IkiWiki/plugin/git.pm checks for a version of git greater than 1.5.4, and if greater, commits with a blank message and '--cleanup=verbatim'.  The cleanup option doesn't let the message get committed.  Relatively new versions of git support '--allow-empty-message' but I haven't been able to identify when that feature was added.  Instead I opted for a default message.
+
+    544,545d543
+    <  # git will not commit with a blank comment, though this 
+    <  # can be overridden in later versions.  
+    547c545,553
+    <          $params{message}.="No commit message specified.";
+    ---
+    >          # Force git to allow empty commit messages.
+    >          # (If this version of git supports it.)
+    >          my ($version)=`git --version` =~ /git version (.*)/;
+    >          if ($version ge "1.5.4") {
+    >                  push @opts, '--cleanup=verbatim';
+    >          }
+    >          else {
+    >                  $params{message}.=".";
+    >          }
+
+The other option would be to change only line 549:
+
+    push @opts, '--cleanup=verbatim';
+
+to
+
+    push @opts, '--allow-empty-message';
+
+[[!tag  bugs patch]]
+
+> This is already [[fixed|done]] since 3.20130711. git versions since 1.7.2
+> are affected. Here's the commit if you want to backport it:
+> [[b162563|http://source.ikiwiki.branchable.com/?p=source.git;a=commitdiff;h=b162563dc1c6126953e66cdcc508f389b9d39d8e]].
+>
+> As a general comment on synthesizing commit messages, I personally don't
+> think ikiwiki should invent an untranslated English commit message
+> if the user didn't provide one - using an obviously trivial commit message,
+> ".", seems more honest. OTOH, the `bzr` and `mercurial` plugins both use
+> an untranslated "no message given", and `darcs` uses "empty message".
+> It should either consistently use ".", or consistently use gettext(x)
+> for some standardized value of x, perhaps "no message given". Joey,
+> any preference?
+>
+> The other RCS plugins (`cvs`, `svn`, `tla`) never need to deal with an
+> empty commit message because they prepend something like "web commit
+> from smcv", so the message can never be empty.
+>
+> (Patches are usually easier to read/apply if you use "unified diff"
+> (`diff -u` or `git diff`), by the way.)
+>
+> --[[smcv]]
diff --git a/doc/bugs/__91____91____33__inline_postform__61__no__93____93___doesn__39__t_disable_it.mdwn b/doc/bugs/__91____91____33__inline_postform__61__no__93____93___doesn__39__t_disable_it.mdwn
new file mode 100644 (file)
index 0000000..7b97b40
--- /dev/null
@@ -0,0 +1,24 @@
+[[!tag patch users/smcv/ready]]
+[[!template id=gitbranch branch=smcv/ready/postform-no
+author="[[Simon McVittie|smcv]]"
+browse=http://git.pseudorandom.co.uk/smcv/ikiwiki.git/shortlog/refs/heads/ready/postform-no]]
+
+The [[ikiwiki/directive/inline]] directive generates a form if
+it has either rootpage, or postform with a "yes-like" value. This
+means that
+
+    \[[!inline pages=... rootpage=sandbox postform=no]]
+
+does have a form. I would expect it not to (although
+mentioning rootpage there is useless).
+
+See also [[forum/How_to_disable_"Add_a_new_post_titled:"_submission_form?]].
+
+My `ready/postform-no` branch also contains a trivial regression test for
+`inline`. So far the only thing it really tests is that this bug was fixed,
+not the actual inlining of pages, but it's a start.
+
+--[[smcv]]
+
+>> this looks simple, straightforward and good to me --[[chrysn]]
+>>> [[merged|done]] --[[smcv]]
index 865637ea4428c7204965b51c0c71699ef50e571e..0bfbad5ceb71a88e053df7d0b6307f1f0f8ee681 100644 (file)
@@ -13,3 +13,5 @@ appropriately, so that ikiwiki reflects the actual time of the post via the
 >> I'll have to debug this, it's not working here... and this is an ikiwiki aggregator scraping another ikiwiki site.
 
 >>> Any news about this? --[[Joey]]
+
+>>>> That would be useful to avoid "flooding" with old content when something new is added with aggregate and then listed with the inline directive. -- [hugo](https://hroy.eu/hugo)
diff --git a/doc/bugs/assumes___34__git_push_origin__34___is_sufficient.mdwn b/doc/bugs/assumes___34__git_push_origin__34___is_sufficient.mdwn
new file mode 100644 (file)
index 0000000..369be82
--- /dev/null
@@ -0,0 +1,18 @@
+[[!template id=gitbranch branch=smcv/ready/git-push-origin-master
+  browse="http://git.pseudorandom.co.uk/smcv/ikiwiki.git/shortlog/refs/heads/ready/git-push-origin-master"
+  author="[[smcv]]"]]
+[[!tag patch]]
+
+git's behaviour when doing "git push origin" is configurable, and the
+default is going to change in 2.0. In particular, if you've set
+push.default to "nothing" (the "explicit is better than implicit" option),
+the regression test will warn:
+
+    fatal: You didn't specify any refspecs to push, and push.default
+    is "nothing".
+    'git push origin' failed:  at .../lib/IkiWiki/Plugin/git.pm line 220.
+
+The solution is to do "git push origin master" instead (but with the
+configured remote and branch names). --[[smcv]]
+
+> [[fixed|done]] --[[Joey]]
diff --git a/doc/bugs/blogspam_marks_me_as_spam_on_ipv6.mdwn b/doc/bugs/blogspam_marks_me_as_spam_on_ipv6.mdwn
new file mode 100644 (file)
index 0000000..9b415a8
--- /dev/null
@@ -0,0 +1,8 @@
+I just got this message trying to post to this wiki:
+
+    Error: Sorry, but that looks like spam to blogspam: No reverse DNS entry for 2001:1928:1:9::1
+
+So yeah, it seems I have no reverse DNS for my IPv6 address, which may
+be quite common for emerging IPv6 deployments...
+
+This may be related to [[blogspam_options whitelist vs. IPv6?]].
diff --git a/doc/bugs/bug_in_cgiurl_port.mdwn b/doc/bugs/bug_in_cgiurl_port.mdwn
new file mode 100644 (file)
index 0000000..3736578
--- /dev/null
@@ -0,0 +1,15 @@
+I think there's a bug in the code that determines if the cgiurl is relative
+to the url. If one has a different port than the other, they're not
+relative, and I hear Fil encountered an issue where the wrong port was then
+used. --[[Joey]] 
+
+> I tested, setting cgiurl to a nonstandard port. After rebuilding,
+> pages used the full url. So I don't see a bug here, or am missing
+> something from my memory of the report (which was done the bad way, on
+> IRC). [[done]] --[[Joey]] 
+
+> > Sorry about wittering on IRC instead of reporting proper bugs.
+> > 
+> > The setup I have is nginx in front of apache, so that nginx is listening on port 80, apache is on port 81, and ikiwiki is being served by apache. After upgrading to 3.20120203 (backported to squeeze) I found that the URLs in the edit page all have the port set as :81 ... but now that I look at it more closely, that is the case for several ikiwiki-hosting controlled sites, but not for a few other sites that are also on the same machine, so it must be some difference between the settings for the sites, either in ikiwiki, or apache, or perhaps even nginx.  Anyway, on the affected sites, explicitly including a port :80 in the cgiurl fixes the problem.
+
+> > So, for the moment, this bug report is a bit useless, until I find out what is causing the ikiwiki-hosting sites to be beffuddled, so it should probably stay closed -[[fil]]
diff --git a/doc/bugs/can__39__t_upload_a_simple_png_image:_prohibited_by_allowed__95__attachments___40__file_MIME_type_is_application__47__octet-stream....mdwn b/doc/bugs/can__39__t_upload_a_simple_png_image:_prohibited_by_allowed__95__attachments___40__file_MIME_type_is_application__47__octet-stream....mdwn
new file mode 100644 (file)
index 0000000..627b2c8
--- /dev/null
@@ -0,0 +1,91 @@
+When uploading a PNG file on the wiki, through the webinterface or anonymous git, i get:
+
+    icon.png           prohibited by allowed_attachments (file MIME type is application/octet-stream, not application/vnd.oasis.opendocument.*)
+
+`attachment_allowed_attachments` is set to:
+
+    virusfree() and (mimetype(image/*) or mimetype(text/*) or mimetype(application/x-gzip) or mimetype(application/vnd.oasis.opendocument.*)) and maxsize(2048kb)
+
+Maybe a bug in the [[plugins/filecheck]] plugin?
+
+This is ikiwiki 3.20130904.1~bpo70+1 on Debian wheezy, with some patches applied, namely:
+
+ * [[todo/option_to_send_only_the_diff_in_notifyemail]]
+ * [[bugs/syslog_fails_with_non-ASCII_wikinames]]
+ * [[bugs/notifyemail_fails_with_some_openid_providers]]
+ * [[bugs/crashes_in_the_python_proxy_even_if_disabled]]
+
+Weird... --[[anarcat]]
+
+> Well, the pagespec seems to be matching correctly, given that it thinks the mime type is application/octet-stream.
+> If File::MimeInfo::Magic is installed, ikiwiki uses it. If not, or if it fails to find any mime type, it falls back to using `file -bi`,
+> and if that fails, it falls back to a default of application/octet-stream. --[[Joey]]
+
+> > File::MimeInfo::Magic is installed:
+> > 
+> >     ii  libfile-mimeinfo-perl    0.16-1                 all           Perl module to determine file types
+> > 
+> > it turns out there's (still) a problem with the way we use the module. This test code:
+> > 
+> >     #!/usr/bin/perl -w
+> >     my $file='icon.png';
+> >     use File::MimeInfo::Magic;
+> >     print "mime::magic: " . File::MimeInfo::Magic::magic($file) . "\n";
+> >     print "mime::default: " . File::MimeInfo::Magic::default($file) . "\n";
+> > 
+> > ...returns:
+> > 
+> >     mime::magic: image/png
+> >     mime::default: application/octet-stream
+> > 
+> > `file -ib` returns the right thing (`image/png; charset=binary`).
+> > 
+> > So it *should* work: it seems that the `::default` code kicks in even if the `::magic` one actually works.
+> > 
+> > I have traced down the problem to this block of code:
+> > 
+> >         if (! defined $mimetype || $mimetype !~s /;.*//) {
+> >                 # Fall back to default value.
+> >                 $mimetype=File::MimeInfo::Magic::default($file)
+> > 
+> > If you take a look deeply, this will fire up the default if there's no semicolon in the mimetype, which is expected for `file` calls, but not for `::magic()` calls. So `::magic()` works, but then the `::default` kicks in anyways.
+> >
+> > [[!template  id=gitbranch branch=anarcat/dev/magic-fails author="[[anarcat]]"]]
+> > 
+> > I have a stupid [[patch]] in my git repo which just appends a semicolon to the `::magic()` output, but maybe this should be done in another way...
+> > 
+> > --[[anarcat]]
+
+> > > [[!template  id=gitbranch branch=ready/more-magic author="[[smcv]]" browse=http://git.pseudorandom.co.uk/smcv/ikiwiki.git/commitdiff/ready/more-magic]]
+> > > If the regex match isn't necessary and it's just about deleting the
+> > > parameters, I think I'd prefer
+> > >
+> > >     if (! defined $mimetype) {
+> > >         ...
+> > >     }
+> > >     $mimetype =~ s/;.*//;
+> > >
+> > > as done in my `ready/more-magic` branch.
+> > >
+> > > I'm a little hesitant to do that without knowing why Joey implemented it
+> > > the way it is, but as far as I can tell it's just an oversight.
+> > >
+> > > Or, if the result of the s/// is checked for a reason, and it's
+> > > about catching a result from file(1) that
+> > > is not, in fact, a MIME type at all (empty string or error message
+> > > or something), maybe something more like this?
+> > >
+> > >     if (! defined $mimetype || $mimetype !~ s{[-\w]+/[-\w]+(?:;.*)?}{})
+> > >
+> > > (or whatever the allowed characters in MIME types are). --[[smcv]]
+
+> > > > I don't mind either way, but i feel this should be fixed for the next release, as I need to reapply this patch at every upgrade now. -- [[anarcat]]
+
+> > > > > This is still a problem in 3.20140831. -- [[anarcat]]
+
+> > > > > > I still don't think appending a semicolon is the right answer:
+> > > > > > at best it's equivalent to what I suggested, and at worst it's
+> > > > > > disabling a check that does have some reason behind it.
+> > > > > > I've turned the version I suggested above into a proper branch.
+> > > > > > Review by someone who can commit to ikiwiki.git would be appreciated.
+> > > > > > --[[smcv]]
diff --git a/doc/bugs/cannot_clone_documented_git_repo.mdwn b/doc/bugs/cannot_clone_documented_git_repo.mdwn
new file mode 100644 (file)
index 0000000..4f2ec66
--- /dev/null
@@ -0,0 +1,16 @@
+    smcv@vasks:~$ git clone git://git.ikiwiki.info/
+    Cloning into git.ikiwiki.info...
+    fatal: read error: Connection reset by peer
+
+I tried this from a UK consumer ISP, my virtual server in the
+UK, and vasks (aka alioth.debian.org) in the Netherlands,
+with the same results. I can't update my clone from `origin`
+either; for the moment I'm using the github mirror instead.
+--[[smcv]]
+
+> Strange.. The git-daemon was not running, but one child was running
+> waiting on an upload-pack, but not accepting new connections. Nothing
+> in the logs about what happened to the parent. The monitor that checks
+> services are running was satisfied with the child.. I've made it
+> restart if the parent pid is no longer running, which should avoid
+> this problem in the future. --[[Joey]] [[done]]
diff --git a/doc/bugs/cannot_decode_wide_characters_error_with_utf-8_encoding.mdwn b/doc/bugs/cannot_decode_wide_characters_error_with_utf-8_encoding.mdwn
new file mode 100644 (file)
index 0000000..2b02f3b
--- /dev/null
@@ -0,0 +1,7 @@
+During creation the new page with utf-8 codepage and non-Latin characters, 
+Pressing on either `Save Page` or `Preview` button results in  
+> `Error: cannot decode with wide characters at /usr/lib/perl5/vendor_perl/5.16.1/i686-linux/Encode.pm line 215`  
+
+Editing the wiki page with non-Latin characters using webinterface also fails with the same error.  
+Additionally, embedding graphviz graphs non-Latin, leads to he same error.
+Observed in ikiwiki versions 3.20130904 and version 3.20140102
diff --git a/doc/bugs/capitalized_attachment_names.mdwn b/doc/bugs/capitalized_attachment_names.mdwn
new file mode 100644 (file)
index 0000000..b10781b
--- /dev/null
@@ -0,0 +1,14 @@
+Given an uploaded image via: \[\[!img NAME.svg alt="image"\]\]
+
+Viewing the generated page shows the following error:
+
+"\[\[!img Error: failed to read name.svg: Exception 420: no decode delegate for this image format `/home/user/path/name.svg' @ error/svg.c/ReadSVGImage/2815\]\]"
+
+The caps in the image title were somehow converted to small letters and then the image is saved as a directory.  Very puzzling.  
+I get the same error when image names are small letters.
+
+The error also occurs with png images.  
+
+How do I fix this?
+
+Later investigation ... I got around the problem by creating the mark-up in a new directory.  However, if I try to create a new directory with the same name as the directory containing the problem code, the problem re-emerges -- the old directory is apparently not overwritten.  Perhaps this is an issue with the git storage.    
diff --git a/doc/bugs/changes_from_the_web_interface_fail_to_get_committed.mdwn b/doc/bugs/changes_from_the_web_interface_fail_to_get_committed.mdwn
new file mode 100644 (file)
index 0000000..67a48a2
--- /dev/null
@@ -0,0 +1,71 @@
+For some reason, on a wiki hosted locally using [ikiwiki-hosting](http://ikiwiki-hosting.branchable.com), web edits do not get committed and pushed to the central repository anymore.
+
+For example, I just did an edit on the web interface, which went on without error, but then the modified files are not committed:
+
+[[!format txt """
+o-cats@marcos:~/source$ git status
+# On branch master
+# Changes not staged for commit:
+#   (use "git add <file>..." to update what will be committed)
+#   (use "git checkout -- <file>..." to discard changes in working directory)
+#
+#       modified:   2014/summer.mdwn
+#
+no changes added to commit (use "git add" and/or "git commit -a")
+"""]]
+
+The files and the .cgi are owned by the right user:
+
+[[!format txt """
+o-cats@marcos:~/source$ ls -al 2014/summer.mdwn
+-rw-r--r-- 1 o-cats o-cats 2812 Nov 28 23:35 2014/summer.mdwn
+o-cats@marcos:~/source$ ls -al  /var/www/o-cats/ikiwiki.cgi
+-rwxr-xr-x 1 o-cats o-cats 15596 Oct  4 12:16 /var/www/o-cats/ikiwiki.cgi
+"""]]
+
+The virtual host is configured to run as the right user:
+
+[[!format txt """
+<VirtualHost *:80>
+        ServerAdmin root@localhost
+        ServerName foo.example.com
+
+        SuexecUserGroup o-cats o-cats
+
+        UserDir disabled
+
+        DocumentRoot /home/o-cats/public_html
+        <Directory />
+                DirectoryIndex index.html index
+                AllowOverride None
+        </Directory>
+        <Directory /home/o-cats/public_html>
+                Options Indexes MultiViews
+                AllowOverride None
+                Order allow,deny
+                allow from all
+        </Directory>
+        <Directory /var/www>
+                Options ExecCGI
+                AllowOverride None
+                Order allow,deny
+                allow from all
+        </Directory>
+        ScriptAlias /ikiwiki.cgi /var/www/o-cats/ikiwiki.cgi
+
+        ErrorLog /var/log/ikiwiki-hosting/o-cats/error.log
+        LogLevel warn
+        CustomLog /var/log/ikiwiki-hosting/o-cats/access.log combined
+
+
+        ErrorDocument 404 "/ikiwiki.cgi"
+</VirtualHost>
+"""]]
+
+What's going on all of a sudden? This is Debian wheezy. --[[anarcat]]
+
+> Oh... it seems like this is related yet again to the disruptive git upgrade:
+> 
+>     [Thu Nov 28 23:35:01 2013] [error] [client 2001:1928:1:9::1] Aborting commit due to empty commit message., referer: http://foo.example.com
+>
+> So this is [[fixed|done]] as of 3.20130711. Shouldn't we backport to wheezy now? :) --[[anarcat]]
index 23b9fd2ccc3435ae143deb5aaaa9a28c01daa901..739be82863fa4c7984046548ffc4b6d71e731c66 100644 (file)
@@ -1,4 +1,4 @@
-[[!template id=gitbranch branch=GiuseppeBilotta/scanif author="Giuseppe Bilotta"]]
+[[!template id=gitbranch branch=GiuseppeBilotta/scanif author="[[GiuseppeBilotta]]"]]
 
 When a directive that should be run during scan preprocessing is inside
 an if directive, it doesn't get called because the if preprocessing does
@@ -55,3 +55,58 @@ reprocessed is done so in the same conditions as the original call.
 >> with vicious conditional dependency circles that would break/unbreak
 >> depending on which pass we are in. And I believe this is an intrinsic
 >> limitation of the system, which cannot be solved at all.
+
+>>> One way forward that I can think of for this issue is to
+>>> have a way to tell `\[[!if]]` which answer it should assume for
+>>> scanning purposes, so it would assume that answer when running
+>>> in the scan phase, and really evaluate the pagespec when running
+>>> in the render phase. For instance:
+>>>
+>>>     \[[!if test="enabled(foo)" scan_assume=yes then="""
+>>>     \[[!foo]]
+>>>     """]]
+>>>
+>>> could maybe scan \[[!foo]] unconditionally.
+>>>
+>>> This makes me wonder whether `\[[!if]]` was too general: by having
+>>> the full generality of pagespecs, it reduces its possible uses to
+>>> "those contexts where pagespecs work".
+>>>
+>>> Another possibility might be to have "complex" pagespecs and sort
+>>> orders (those whose correct answer requires scanning to have completed,
+>>> like `link()` and sorting by `meta(title)`) throw an error when used in
+>>> the scan phase, but simple pagespecs like `enabled()` and `glob()`, and
+>>> simple sort orders like `title` and `path`, could continue to work?
+>>> My `wip-too-soon` work-in-progress branch is heading in this direction,
+>>> although it currently makes `pagespec_match` fail completely and does
+>>> not even allow "simple" pagespecs and sort orders.
+>>>
+>>> At the moment, if a pagespec cannot be evaluated, `\[[!if]]` will
+>>> produce neither the `then` clause nor the `else` clause. This could
+>>> get pretty confusing if it is run during the scan phase and produces
+>>> an error, then run during the render phase and succeeds: if you had,
+>>> say,
+>>>
+>>>     \[[!if run_during_scan=1 test="link(foo)" then="""
+>>>     there is a link to foo
+>>>     \[[!tag there_is_a_link_to_foo]]
+>>>     """ else="""
+>>>     there is no link to foo
+>>>     \[[!tag there_is_no_link_to_foo]]
+>>>     """]]
+>>>
+>>> then the resulting page would contain one of the snippets of text,
+>>> but its metadata would contain neither of the tags. Perhaps the plugin
+>>> would have to remember that it failed during the scan phase, so that
+>>> it could warn about the failure during the render phase instead of,
+>>> or in addition to, producing its normal output?
+>>>
+>>> Of the conditional-specific tests, `included()` and `destpage(glob)`
+>>> can never match during scan.
+>>>
+>>> Does anyone actually use `\[[!if]]` in ways that they would want to
+>>> be active during scan, other than an `enabled(foo)` test?
+>>> I'm increasingly tempted to add `\[[!ifenabled foo]]` to solve
+>>> that single case, and call that a solution to this bug...
+>>>
+>>> --[[smcv]]
diff --git a/doc/bugs/crashes_in_the_python_proxy_even_if_disabled.mdwn b/doc/bugs/crashes_in_the_python_proxy_even_if_disabled.mdwn
new file mode 100644 (file)
index 0000000..3d5b056
--- /dev/null
@@ -0,0 +1,74 @@
+[[!template  id=gitbranch branch=anarcat/dev/proxy-utf8-fail author="[[anarcat]]"]]
+
+ikiwiki 3.20130904.1~bpo70+1
+
+rebuilding the whole wiki:
+
+[[!format txt """
+anarcat@marcos:ikiwiki*$ sudo ikisite changesetup wiki.anarc.at --rebuild
+Subroutine import redefined at /usr/share/perl5/IkiWiki/Plugin/translinks.pm line 19.
+Subroutine getsetup redefined at /usr/share/perl5/IkiWiki/Plugin/translinks.pm line 29.
+Subroutine pagetemplate redefined at /usr/share/perl5/IkiWiki/Plugin/translinks.pm line 38.
+Subroutine otherlanguagesloop redefined at /usr/share/perl5/IkiWiki/Plugin/translinks.pm line 51.
+Use of uninitialized value $body in split at /usr/share/perl5/Text/MultiMarkdown.pm line 1131.
+uncaught exception: 'ascii' codec can't encode character u'\xe9' in position 289: ordinal not in range(128)
+Traceback (most recent call last):
+  File "/usr/lib/ikiwiki/plugins/proxy.py", line 309, in run
+    self._in_fd, self._out_fd)
+  File "/usr/lib/ikiwiki/plugins/proxy.py", line 192, in handle_rpc
+    ret = self._dispatcher.dispatch(method, params)
+  File "/usr/lib/ikiwiki/plugins/proxy.py", line 84, in dispatch
+    return self._dispatch(method, params)
+  File "/usr/lib/python2.7/SimpleXMLRPCServer.py", line 420, in _dispatch
+    return func(*params)
+  File "/usr/lib/ikiwiki/plugins/proxy.py", line 253, in hook_proxy
+    "{0} hook `{1}' returned: [{2}]".format(type, name, ret))
+UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 289: ordinal not in range(128)
+
+Traceback (most recent call last):
+  File "/usr/lib/ikiwiki/plugins/rst", line 86, in <module>
+    proxy.run()
+  File "/usr/lib/ikiwiki/plugins/proxy.py", line 317, in run
+    self.error('uncaught exception: {0}\n{1}'.format(e, tb))
+  File "/usr/lib/ikiwiki/plugins/proxy.py", line 298, in error
+    self.rpc('error', msg)
+  File "/usr/lib/ikiwiki/plugins/proxy.py", line 233, in rpc
+    *args, **kwargs)
+  File "/usr/lib/ikiwiki/plugins/proxy.py", line 173, in send_rpc
+    raise GoingDown()
+proxy.py.GoingDown
+error: ikiwiki failed
+"""]]
+
+\xe9 is "é" in latin1, it may be the last letter of my name. no clue how it got there. suspecting this is related to the fix in [[bugs/proxy.py_utf8_troubles]], since this was not happening before the upgrade from squeeze. --[[anarcat]]
+
+> Ooops... turns out the plugin *was* enabled, through the `rst` plugin. After disabling it, the crash is gone, but one page isn't rendered anymore:
+> 
+>     removing art/histoireinternet/index.html, no longer built by art/histoireinternet.rst
+> 
+> Here is that source file: http://anarc.at/art/histoireinternet.rst - and it seems encoded properly:
+>
+>     $ curl -s http://anarc.at/art/histoireinternet.rst | iconv -f utf8 -t latin1 | iconv -f latin1 -t utf8 > /dev/null
+>     $
+> 
+> So I am not sure what is going on here... --[[anarcat]]
+
+>> Python is decoding what it receives from IkiWiki using the default `ascii`
+>> codec. To match IkiWiki's "all source text is UTF-8" assumption, the
+>> Python proxy should explicitly decode incoming text from bytes
+>> (`str`) to `unicode` using the `utf8` codec instead.
+>>
+>> Python's conservative default is "`ascii`, regardless of locale" -
+>> this minimizes the chance of silently incorrect decoding, but
+>> unfortunately also maximizes the chance of crashing. --[[smcv]]
+
+> > > Right, I know that. The trick is to find the rabbit hole. :P
+> > > 
+> > > And I found it. With my dev/proxy-utf8-fail, this doesn't fail anymore. Yay, a [[patch]] ready for commit! --[[anarcat]]
+
+> > > > I don't see that branch in your git repo, could you repost it please?
+> > > > (I'm trying to review some of the pending patches.) --[[smcv]]
+
+>>>>> Ooops.. I forgot to push the branch, it should be good now! --[[anarcat]]
+
+>>>>>> [[merged|done]] --[[Joey]]
index 4b22fd06c18492d1ff70ac9bd6c8c226d7326315..de42960004944b472e781525c4a8fc908895211d 100644 (file)
@@ -1,7 +1,7 @@
 Consider this:
 
-    $ wget http://schwinge.homeip.net/~thomas/tmp/cutpaste_filter.tar.bz2
-    $ wget http://schwinge.homeip.net/~thomas/tmp/cutpaste_filter.patch
+    $ wget http://nic-nac-project.de/~schwinge/ikiwiki/cutpaste_filter.tar.bz2
+    $ wget http://nic-nac-project.de/~schwinge/ikiwiki/0001-cutpaste.pm-missing-filter-call.patch
     
     $ tar -xj < cutpaste_filter.tar.bz2
     $ cd cutpaste_filter/
diff --git a/doc/bugs/debwiki_shortcut_creates_buggy_URLs_to_subpages.mdwn b/doc/bugs/debwiki_shortcut_creates_buggy_URLs_to_subpages.mdwn
new file mode 100644 (file)
index 0000000..f83f960
--- /dev/null
@@ -0,0 +1,5 @@
+E.g. [[!debwiki Derivatives/Guidelines]].
+
+Maybe we should use `%S` instead of `%s` in the shortcut definition?
+
+> seems reasonable, [[done]] --[[smcv]]
diff --git a/doc/bugs/definition_lists_should_be_bold.mdwn b/doc/bugs/definition_lists_should_be_bold.mdwn
new file mode 100644 (file)
index 0000000..a72206b
--- /dev/null
@@ -0,0 +1,27 @@
+Definition lists do not look great here...
+
+Here is an example.
+
+<dl>
+<dt>this is a term</dt>
+<dd>and this is its definition.</dd>
+</dl>
+
+(This wiki doesn't support Markdown's extended definition lists, but still, this is valid markup.)
+
+I believe `<dt>` should be made bold. I have added this to my `local.css`, and I would hate to add this all the time forever:
+
+    /* definition lists look better with the term in bold */
+    dt
+    {
+        font-weight: bold;
+    }
+
+:) How does that look? I can provide a patch for the base wiki if you guys really want... ;) -- [[anarcat]]
+
+> What you dislike seems to be the default rendering of definition lists by
+> browsers. I don't think it's ikiwiki's place to override browser defaults
+> for standard markup in the document body, at least not in the default
+> antitheme. --[[Joey]] 
+
+> > How about in the actiontab theme then? :)
diff --git a/doc/bugs/do_not_let_big_brother_spy_on_our_users_on_login.mdwn b/doc/bugs/do_not_let_big_brother_spy_on_our_users_on_login.mdwn
new file mode 100644 (file)
index 0000000..6d259d0
--- /dev/null
@@ -0,0 +1,79 @@
+In the login page, the icons of:
+
+ * livejournal.com
+ * myopenid.com - which is [closing](http://tech.slashdot.org/story/13/09/04/228229/myopenid-to-shut-down-in-february)
+ * verisign.com
+ * yahoo.com
+ * aol.com
+ * claimid.com
+ * flickr.com - which should be the same as yahoo
+ * wordpress.com
+ * google.com
+
+... are all hotlinked. Which means that on every ikiwiki out there, whenever someone logs in, the web browser of that person actually report backs to all those entities, some of which are known to collaborate with the US government in illegal spying of american citizens and, well, the world at large (see [[!wikipedia PRISM]], but also the patriot act and various warrantless wiretapping provisions established since 2001).
+
+In the old days, we used to call those [[!wikipedia web bugs]]. Nowadays, they seem so pervasive that we don't even notice. Nevertheless, I think it would be important to remove those snitches from the ikiwiki home page.
+
+A simple fix would be to ship those icons with ikiwiki and serve them locally, but there may be legal issues with redistributing those icons in the source code... Would it be covered by fair use? The [upstream library](https://code.google.com/p/openid-selector/) doesn't actually exhibit that problem, and ships those icons directly as a [PNG sprite](https://code.google.com/p/openid-selector/source/browse/#svn%2Ftrunk%2Fimages). -- [[anarcat]]
+
+> it's not exactly about OpenID, but the german heise newspaper group has
+> switched away from directly including like/+1 buttons on their websites, and
+> replaced them with locally hosted buttons which have to be clicked once to
+> enable the buttons themselves and a second time to effect anything.
+> [here's the article](http://www.h-online.com/features/Two-clicks-for-more-privacy-1783256.html).
+> they've had [trouble with facebook (german)](http://www.heise.de/newsticker/meldung/Facebook-beschwert-sich-ueber-datenschutzfreundlichen-2-Klick-Button-2-Update-1335658.html)
+> -- <abbr title="too long, didn't translate">tl;dt</abbr>: facebook complained
+> about them using their "like"-button logo for something that's not a like
+> button, they replaced the whole facebook logo there with a plain-text "F" (as
+> you see on the bottom of the page). google's +1 seems not to have been an
+> issue. i assume it will need case-by-case decisions to fully comply with all
+> legal stuff involved. (from a practical point of view, things are not that
+> strict, as `apt-file find facebook.png` and `apt-file find flickr.png`
+> reveal.) --[[chrysn]]
+
+>> The fundamental problem here is that we want to balance these
+>> somewhat incompatible goals:
+>>
+>> * show users a provider icon that they'll recognise at a glance
+>> * don't infringe copyright
+>> * don't distribute non-DFSG-licensed things in the source package
+>> * don't let miscellaneous OpenID providers track our users
+>>
+>> A "quick hack" version of removing these would be to have an option to
+>> disable the friendly JavaScript OpenID selector and go back to a simple
+>> input box. I might implement that option anyway - on websites mainly used
+>> by technologists, the OpenID selector is a bit of a waste of time.
+>>
+>>> Not done yet. -s
+>>>
+>>>> FWIW, I don't think we should implement this. The current selector is 
+>>>> fine: if elite technologists don't want the selector, they can just 
+>>>> turn off javascript. :) -- [[anarcat]]
+>> 
+>> One way to have recognisable icons would be to ship DFSG imitations of
+>> the "real" logos in the underlay. Between gnome-online-accounts and
+>> Empathy, we can probably find most of them (mostly or perhaps all done by
+>> Jakub Steiner).
+>>
+>>> [[!template id=gitbranch branch=smcv/ready/openid author="[[smcv]]"]]
+>>> [[!tag patch]]
+>>> Here's a git branch. I deleted the shut-down ClaimID and MyOpenID providers,
+>>> used icons from GNOME Online Accounts and Wordpress where available, and
+>>> drew my own for the rest.
+>>> [See it in use here](http://blueview.hosted.pseudorandom.co.uk/ikiwiki.cgi?do=prefs)
+>>> -s
+>>>>
+>>>> Awesome work Simon! I owe you a beer. [[merged|done]] --[[Joey]] 
+>>>>
+>>>> Same here, thanks for this!!! -- [[anarcat]]
+>>
+>> If people want the "real" logos, we could have some code to make IkiWiki
+>> download the favicons into transient underlay (which I think is
+>> higher-priority?), or into a higher-priority underlay if necessary,
+>> during the wiki build, so they'll be served from the wiki's own server.
+>>
+>>> Not done yet. I'm not sure whether I'm going to bother, but I'd review
+>>> someone else's implementation. -s
+>>
+>>>> Doesn't seem to be a priority to me either. --[[anarcat]]
+>> --[[smcv]]
diff --git a/doc/bugs/editing_gitbranch_template_is_really_slow.mdwn b/doc/bugs/editing_gitbranch_template_is_really_slow.mdwn
new file mode 100644 (file)
index 0000000..22733e6
--- /dev/null
@@ -0,0 +1,67 @@
+On this wiki, editing `templates/gitbranch.mdwn` causes a really slow
+refresh, orders of magnitude slower than a full rebuild: a large number of
+pages depend on that template, or link to a page that embeds that template,
+and so on.
+
+I suspect that, as with my optimization pass for `album`'s benefit, the
+costly thing is evaluating lots of pagespecs. I'm profiling it to see
+whether the problem is there are any low-hanging fruit.
+
+Easy to reproduce offline:
+
+* comment out the `exclude` option in `docwiki.setup`
+* `/usr/bin/perl -Iblib/lib ikiwiki.in -setup docwiki.setup -rebuild`
+* `touch templates/gitbranch.mdwn`
+* `/usr/bin/perl -Iblib/lib ikiwiki.in -setup docwiki.setup -refresh`
+
+NYTProf says:
+
+    # spent 279s (237+41.8) within IkiWiki::bestlink which was called 13988949 times, avg 20µs/call:
+    # 13150827 times (222s+37.2s) by IkiWiki::PageSpec::match_link at line 2692, avg 20µs/call
+    # 829606 times (14.9s+4.51s) by IkiWiki::PageSpec::match_link at line 2687, avg 23µs/call
+    ...
+    sub bestlink ($$) {
+
+which is about half the execution time (458s on my laptop).
+
+Adding code to log each call to match_backlink indicates that a large part
+of the problem is that it evaluates the pagespec
+`backlink(plugins/goodstuff)` up to a million times, with various pages and locations.
+
+--[[smcv]]
+
+> [[!template id=gitbranch branch=smcv/ready/perf
+author="[[Simon McVittie|smcv]]"
+browse=http://git.pseudorandom.co.uk/smcv/ikiwiki.git/shortlog/refs/heads/ready/perf]]
+> [[!tag patch users/smcv/ready]]
+>
+> Previously, if a page like `plugins/trail` contained a conditional like
+>
+>     \[[!if test="backlink(plugins/goodstuff)" all=no]]
+>
+> (which it gets via `templates/gitbranch`), then the
+> [[plugins/conditional]] plugin would give `plugins/trail` a dependency on
+> `(backlink(plugins/goodstuff)) and plugins/trail`. This dependency is
+> useless: that pagespec can never match any page other than
+> `plugins/trail`, but if `plugins/trail` has been modified or deleted,
+> then it's going to be rendered or deleted *anyway*, so there's no point
+> in spending time evaluating match_backlink for it.
+>
+> Conversely, the influences from the result were not taken into account,
+> so `plugins/trail` did not have the
+> `{ "plugins/goodstuff" => $DEPEND_LINKS }` dependency that it should.
+>
+> We should invert that, depending on the influences but not on the test.
+>
+> This is at least an order of magnitude faster: when I edit the docwiki
+> as described above, a refresh takes 37s with nytprof overhead, compared
+> with 458s with nytprof overhead before this change. Without nytprof,
+> that refresh takes 14s, which is faster than the 24s rebuild again.
+> I didn't record how long the refresh took without nytprof before this
+> change, but it was something like 200s.
+>
+> `bestlink` is still the single most expensive function in this refresh
+> at ~ 9.5s, with `match_glob` at ~ 5.2s as the runner-up.
+> --[[smcv]]
+
+>> [[merged|done]] --[[smcv]]
diff --git a/doc/bugs/empty_div_element.mdwn b/doc/bugs/empty_div_element.mdwn
new file mode 100644 (file)
index 0000000..7e28730
--- /dev/null
@@ -0,0 +1,35 @@
+For some more flexibility in creating a stylesheet for ikiwiki, it would be nice if there were a few unused elements on the page that one can move around and assign content to using CSS.
+
+For instance, something like this:
+
+    <div class='aux' id='aux1'></div>
+    <div class='aux' id='aux2'></div>
+
+etc. For bonus points, the number could be configurable. To avoid empty content, style.css should have something like this:
+
+    .aux {
+        display: none;
+    }
+
+This can then be used to move things around. For instance, I have on my website's CSS stylesheet the following:
+
+    #aux1 {
+        position: fixed;
+        width: 150px;
+        height: 150px;
+        bottom: 0px;
+        left: 0px;
+        background-image: url("wouter3.png");
+        background-position: top right;
+        background-repeat: no-repeat;
+        background-origin: content-box;
+        display-block;
+    }
+
+which adds my hackergochi to the bottom left of the webpage, with some margin.
+
+I tried looking for something like this, but I couldn't find it. Perhaps I just didn't look in the right places, though; apologies if that is the case.
+
+> This can easily be achieved by modifying [[templates]]. Simply copy the default page template to the template directory of your wiki, and modify it to add your empty divs.
+>
+> -- [[Louis|spalax]]
diff --git a/doc/bugs/enabling_or_disabling_plugin_x_does_not_rebuild_pages_that_use_enabled__40__x__41__.mdwn b/doc/bugs/enabling_or_disabling_plugin_x_does_not_rebuild_pages_that_use_enabled__40__x__41__.mdwn
new file mode 100644 (file)
index 0000000..4b4adb2
--- /dev/null
@@ -0,0 +1,11 @@
+If you have a page like
+
+    \[[!if test="enabled(smileys)" then=":-P"]]
+
+then enabling or disabling the smileys plugin will not rebuild it.
+
+Unfortunately, I can't think of a good way to solve this without
+introducing a special case for `enabled()` in Render.pm, either a
+new dependency type `"enabled(smileys)" => $DEPENDS_ENABLED`
+or a special case that treats `"enabled(smileys)" => $DEPENDS_PRESENCE`
+differently. --[[smcv]]
diff --git a/doc/bugs/encoding_issue_in_blogspam_plugin.mdwn b/doc/bugs/encoding_issue_in_blogspam_plugin.mdwn
new file mode 100644 (file)
index 0000000..92318d1
--- /dev/null
@@ -0,0 +1,34 @@
+[[!tag patch]]
+
+<pre>
+From 5ad35b2805ca50478f07d810e57e7c9b8f4eddea Mon Sep 17 00:00:00 2001
+From: Changaco &lt;changaco@changaco.net>
+Date: Tue, 4 Jun 2013 02:54:35 +0200
+Subject: [PATCH] fix encoding issue in blogspam plugin
+
+RPC::XML uses ascii as default encoding, we have to tell it to use utf8.
+
+Without this, ikiwiki returns "failed to get response from blogspam server"
+every time a non-ascii character is used in a content that needs checking.
+
+---
+ IkiWiki/Plugin/blogspam.pm | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/IkiWiki/Plugin/blogspam.pm b/IkiWiki/Plugin/blogspam.pm
+index d32c2f1..e48ed72 100644
+--- a/IkiWiki/Plugin/blogspam.pm
++++ b/IkiWiki/Plugin/blogspam.pm
+@@ -53,6 +53,7 @@ sub checkconfig () {
+       eval q{
+               use RPC::XML;
+               use RPC::XML::Client;
++              $RPC::XML::ENCODING = 'utf-8';
+       };
+       error $@ if $@;
+ }
+-- 
+1.8.3
+</pre>
+
+[[done]] --[[Joey]] 
diff --git a/doc/bugs/error_handlers_with_gettext_can_clobber___36____64__.mdwn b/doc/bugs/error_handlers_with_gettext_can_clobber___36____64__.mdwn
new file mode 100644 (file)
index 0000000..719c1ef
--- /dev/null
@@ -0,0 +1,29 @@
+[[!template id=gitbranch branch=smcv/ready/careful-eval author="[[smcv]]"
+  browse="http://git.pseudorandom.co.uk/smcv/ikiwiki.git/shortlog/refs/heads/ready/careful-eval"]]
+[[!tag patch]]
+
+As noted in the [[!cpan Try::Tiny]] man page, eval/$@ can be quite
+awkward in corner cases, because $@ has the same properties and problems
+as C's errno. While writing a regression test for definetemplate
+in which it couldn't find an appropriate template, I received
+    
+    <span class="error">Error: failed to process template
+    <span class="createlink">deftmpl</span> </span>
+    
+instead of the intended
+    
+    <span class="error">Error: failed to process template
+    <span class="createlink">deftmpl</span> template deftmpl not
+    found</span>
+    
+which turned out to be because the "catch"-analogous block called
+gettext before it used $@, and gettext can call define_gettext,
+which uses eval.
+
+Fixed in my branch smcv/ready/careful-eval. Another possibility
+for fixing this would be to depend on something like Try::Tiny,
+which is already indirectly recommended by ikiwiki, because
+[[!cpan RPC::XML]], [[!cpan XML::Feed]], etc., depend on it.
+--[[smcv]]
+
+[[fixed in 3.20140227|done]] --s
diff --git a/doc/bugs/feedpages_does_not_prevent_tags_from_being_aggregated.mdwn b/doc/bugs/feedpages_does_not_prevent_tags_from_being_aggregated.mdwn
new file mode 100644 (file)
index 0000000..a004154
--- /dev/null
@@ -0,0 +1,32 @@
+I added a feedpages directive to `blog/index.mdwn` to not pick up anything tagged `tags/random/hidden` yet that still happenend.
+
+    ~git/richardhartmann.de/blog % grep hidden index.mdwn
+    \[[!inline pages="./posts/*/*/* and !*/Discussion" feedpages="./posts/*/*/* and !*/Discussion and not tagged(tags/random/hidden)" show="10" actions=yes rootpage="blog"]]
+    ~git/richardhartmann.de/blog % grep hidden posts/2013/05/17-Debian_Release_Critical_Bug_report_for_Week_20.mdwn
+    \[[!tag tags/tech/floss/debian tags/tech/floss/debian/rc-stats/8.0-jessie tags/random/hidden]]
+    ~git/richardhartmann.de/blog %
+
+If you need more information, please let me know.
+
+Richard
+
+> I don't think this is a bug. You have a syntax error in your pagespec:
+> "not" is not a recognised keyword in [[pagespecs|ikiwiki/pagespec]],
+> so `and not tagged(...)` should be `and !tagged(...)`. Presumably inline
+> falls back to `pages` when `feedpages` doesn't work.
+>
+> By posting the pagespec here with insufficient escaping (which I've fixed)
+> you caused *this* ikiwiki instance's HTML to contain an error message
+> illustrating that syntax error :-)
+>
+>     <span class="error">Error: syntax error in pagespec "(./posts/*/*/* and !*/Discussion) and (./posts/*/*/* and !*/Discussion and not tagged(tags/random/hidden))"</span>
+>
+> [[done]]. --[[smcv]]
+
+> > As per IRC: Thanks. As an aside, shouldn't this ikiwiki instance ignore directives in normal text? The problem may be non-trivial, but still... -- Richard
+
+>>> "Normal text" is exactly where directives go, so, not really.
+>>> If you mean verbatim text (e.g. indentation in Markdown): the fact that
+>>> directives still expand to HTML, which is then treated as verbatim, is an
+>>> unfortunate result of how ikiwiki interacts with pages' markup languages
+>>> (directives and wikilinks happen before markup is converted to HTML). --[[smcv]]
diff --git a/doc/bugs/feeds_get_removed_in_strange_conditions.mdwn b/doc/bugs/feeds_get_removed_in_strange_conditions.mdwn
new file mode 100644 (file)
index 0000000..deec208
--- /dev/null
@@ -0,0 +1,57 @@
+For some time now, in circumstances that I've had enormous troubles
+trying to track, I've seen feeds getting removed by ikiwiki when
+apparently unrelated pages got changed, with the message:
+
+> removing somepath/somepage/somefeed, no longer built by some/unrelated/page
+
+I've finally been able to find how and why it happens. The situation is
+the following:
+
+* page A has an inline directive that (directly) generates a feed F
+* page B inlines A, thus (indirectly) generating F again
+* page B is rendered after page A
+
+The feed removal happens when changes are made to prevent B from
+inlining A; for example, because B is a tag page and A is untagged B, or
+because B includes A through a pagespec that no longer matches A. In
+this case, this happens:
+
+* page A is built, rendering F
+* page B is built, _not_ rendering F, which it used to render
+* F is removed because it is not built by B anymore
+
+Note that although this issue is triggered (for me) from the changes I
+proposed last year to allow feed generation from nested inlines
+coalescing it to be page-based instead of destpage-based
+(bb8f76a4a04686def8cc6f21bcca80cb2cc3b2c9 and
+72c8f01b36c841b0e83a2ad7ad1365b9116075c5) there is potential for it
+popping up in other cases.
+
+Specifically, the logic for the removal of dependent pages currently
+relies on the assumption that each output has a single generator. My
+changes caused this assumption to be violated, hence the error, but
+other cases may pop up for other plugins in the future.
+
+I have a [patch] fixing this issue (for feeds specifically, i.e. only
+the problem I am actually having) on top of my `mystuff` branch, but
+since that also has heaps of other unrelated stuff, you may want to just
+[pick it from my gitweb][gw].
+
+[gw]: (http://git.oblomov.eu/ikiwiki/patch/671cb26cf50643827f258270d9ac8ad0b1388a65)
+
+The patch changes the `will_render()` for feeds to be based on the page
+rather than on the destpage, matching the fact that for nested inlines
+it's the inner page that is ultimately responsible for generating the
+feed.
+
+I've noticed that it requires at least _two_ full rebuilds before the
+index is again in a sensible state. (On the first rebuild, all feeds
+from nested inlines are actually _removed_.)
+
+While the patch is needed because there are legitimate cases in which
+nested feeds are needed (for example, I have an index page that inlines
+index pages for subsection of my site, and I want _those_ feed from
+being visible), there are other cases when one may want to skip feed
+generation from nested inlines.
+
+--[[GiuseppeBilotta]]
diff --git a/doc/bugs/garbled_non-ascii_characters_in_body_in_web_interface.mdwn b/doc/bugs/garbled_non-ascii_characters_in_body_in_web_interface.mdwn
new file mode 100644 (file)
index 0000000..657b86b
--- /dev/null
@@ -0,0 +1,126 @@
+since my latest jessie upgrade here, charsets are all broken when editing a page. the page i'm trying to edit is [this wishlist](http://anarc.at/wishlist/), and it used to work fine. now, instead of:
+
+`Voici des choses que vous pouvez m'acheter si vous êtes le Père Nowel (yeah right):`
+
+... as we see in the rendered body right now, when i edit the page i see:
+
+`Voici des choses que vous pouvez m'acheter si vous �tes le P�re Nowel (yeah right):`
+
+... a typical double-encoding nightmare. The actual binary data is this for the word "Père" according to `hd`:
+
+~~~~
+anarcat@marcos:ikiwiki$ echo "Père" | hd
+00000000  50 c3 a8 72 65 0a                                 |P..re.|
+00000006
+anarcat@marcos:ikiwiki$ echo "P�re" | hd
+00000000  50 ef bf bd 72 65 0a                              |P...re.|
+00000007
+~~~~
+
+> I don't know what that is, but it isn't the usual double-UTF-8 encoding:
+>
+>     >>> u'è'.encode('utf-8')
+>     '\xc3\xa8'
+>     >>> u'è'.encode('utf-8').decode('latin-1').encode('utf-8')
+>     '\xc3\x83\xc2\xa8'
+>
+> A packet capture of the incorrect HTTP request/response headers and body
+> might be enlightening? --[[smcv]]
+>
+> > Here are the headers according to chromium:
+> > 
+> > ~~~~
+> > GET /ikiwiki.cgi?do=edit&page=wishlist HTTP/1.1
+> > Host: anarc.at
+> > Connection: keep-alive
+> > Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
+> > User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36
+> > Referer: http://anarc.at/wishlist/
+> > Accept-Encoding: gzip,deflate,sdch
+> > Accept-Language: fr,en-US;q=0.8,en;q=0.6
+> > Cookie: openid_provider=openid; ikiwiki_session_anarcat=XXXXXXXXXXXXXXXXXXXXXXX
+> > 
+> > HTTP/1.1 200 OK
+> > Date: Mon, 08 Sep 2014 21:22:24 GMT
+> > Server: Apache/2.4.10 (Debian)
+> > Set-Cookie: ikiwiki_session_anarcat=XXXXXXXXXXXXXXXXXXXXXXX; path=/; HttpOnly
+> > Vary: Accept-Encoding
+> > Content-Encoding: gzip
+> > Content-Length: 4093
+> > Keep-Alive: timeout=5, max=100
+> > Connection: Keep-Alive
+> > Content-Type: text/html; charset=utf-8
+> > ~~~~
+> > 
+> > ... which seem fairly normal... getting more data than this is a little inconvenient since the data is gzip-encoded and i'm kind of lazy extracting that from the stream. Chromium does seem to auto-detect it as utf8 according to the menus however... not sure what's going on here. I would focus on the following error however, since it's clearly emanating from the CGI... --[[anarcat]]
+
+Clicking on the Cancel button yields the following warning:
+
+~~~~
+Error: Cannot decode string with wide characters at /usr/lib/x86_64-linux-gnu/perl/5.20/Encode.pm line 215.
+~~~~
+
+> Looks as though you might be able to get a Python-style backtrace for this
+> by setting `$Carp::Verbose = 1`.
+>
+> The error is that we're taking some string (which string? only a backtrace
+> would tell you) that is already flagged as Unicode, and trying to decode
+> it from byte-blob to Unicode again, analogous to this Python:
+>
+>     some_bytes.decode('utf-8').decode('utf-8')
+>
+> --[[smcv]]
+> > 
+> > I couldn't figure out where to set that Carp thing - it doesn't work simply by setting it in /usr/bin/ikiwiki - so i am not sure how to use this. However, with some debugging code in Encode.pm, i was able to find a case of double-encoding - in the left menu, for example, which is the source of the Encode.pm crash.
+> > 
+> > It seems that some unicode semantics changed in Perl 5.20, or more precisely, in Encode.pm 2.53, according to [this](https://code.activestate.com/lists/perl-unicode/3314/). 5.20 does have significant Unicode changes, but I am not sure they are related (see [perldelta](https://metacpan.org/pod/distribution/perl/pod/perldelta.pod)). Doing more archeology, it seems that Encode.pm is indeed where the problem started, all the way back in [commit 8005a82](https://github.com/dankogai/p5-encode/commit/8005a82d8aa83024d72b14e66d9eb97d82029eeb#diff-f3330aa405ffb7e3fec2395c1fc953ac) (august 2013), taken from [pull request #11](https://github.com/dankogai/p5-encode/pull/11) which expressively forbids double-decoding, in effect failing like python does in the above example you gave (Perl used to silently succeed instead, a rather big change if you ask me).
+> > 
+> > So stepping back, it seems that this would be a bug in Ikiwiki. It could be in any of those places:
+> > 
+> > ~~~~
+> > anarcat@marcos:ikiwiki$ grep -r decode_utf8 IkiWiki* | wc -l
+> > 31
+> > ~~~~
+> > 
+> > Now the fun part is to determine which one should be turned off... or should we duplicate the logic that was removed in decode_utf8, or make a safe_decode_utf8 for ourselves? --[[anarcat]]
+
+The apache logs yield:
+
+~~~~
+[Mon Sep 08 16:17:43.995827 2014] [cgi:error] [pid 2609] [client 192.168.0.3:47445] AH01215: Died at /usr/share/perl5/IkiWiki/CGI.pm line 467., referer: http://anarc.at/ikiwiki.cgi?do=edit&page=wishlist
+~~~~
+
+Interestingly enough, I can't reproduce the bug here (at least in this page). Also, editing the page through git works fine.
+
+I had put ikiwiki on hold during the last upgrade, so it was upgraded separately. The bug happens both with 3.20140613 and 3.20140831. The major thing that happened today is the upgrade from perl 5.18 to 5.20. Here's the output of `egrep '[0-9] (remove|purge|install|upgrade)' /var/log/dpkg.log | pastebinit -b paste.debian.net` to give an idea of what was upgraded today:
+
+http://paste.debian.net/plain/119944
+
+This is a major bug which should probably be fixed before jessie, yet i can't seem to find a severity statement in reportbug that would justify blocking the release based on this - unless we consider non-english speakers as "most" users (i don't know the demographics well enough). It certainly makes ikiwiki completely unusable for my users that operate on the web interface in french... --[[anarcat]]
+
+Note that on this one page, i can't even get the textarea to display and i immediately get `Error: Cannot decode string with wide characters at /usr/lib/x86_64-linux-gnu/perl/5.20/Encode.pm line 215`: http://anarc.at/ikiwiki.cgi?do=edit&page=hardware%2Fserver%2Fmarcos.
+
+Also note that this is the same as [[forum/"Error: cannot decode string with wide characters" on Mageia Linux x86-64 Cauldron]], I believe. The backtrace I get here is:
+
+~~~~
+Error: Cannot decode string with wide characters at /usr/lib/x86_64-linux-gnu/perl/5.20/Encode.pm line 215. Encode::decode_utf8("**Menu**\x{d}\x{a}\x{d}\x{a} * [[\x{fffd} propos|index]]\x{d}\x{a} * [[Logiciels|software]]"...)
+called at /usr/share/perl5/IkiWiki/CGI.pm line 117 IkiWiki::decode_form_utf8(CGI::FormBuilder=HASH(0x2ad63b8))
+called at /usr/share/perl5/IkiWiki/Plugin/editpage.pm line 90 IkiWiki::cgi_editpage(CGI=HASH(0xd514f8), CGI::Session=HASH(0x27797e0))
+called at /usr/share/perl5/IkiWiki/CGI.pm line 443 IkiWiki::__ANON__(CODE(0xfaa460))
+called at /usr/share/perl5/IkiWiki.pm line 2101 IkiWiki::run_hooks("sessioncgi", CODE(0x2520138))
+called at /usr/share/perl5/IkiWiki/CGI.pm line 443 IkiWiki::cgi()
+called at /usr/bin/ikiwiki line 192 eval {...}
+called at /usr/bin/ikiwiki line 192 IkiWiki::main()
+called at /usr/bin/ikiwiki line 231
+~~~~
+
+so this would explain the error on cancel, but doesn't explain the weird encoding i get when editing the page... <sigh>...
+
+... and that leads me to this crazy patch which fixes all the above issue, by avoiding double-decoding... go figure that shit out...
+
+[[!template  id=gitbranch branch=anarcat/dev/safe_unicode author="[[anarcat]]"]] 
+
+> [[Looks good to me|users/smcv/ready]] although I'm not sure how valuable
+> the `$] < 5.02 || ` test is - I'd be tempted to just call `is_utf8`. --[[smcv]]
+
+>> [[merged|done]] --[[smcv]]
diff --git a/doc/bugs/graphviz_demo_generates_empty_graph.mdwn b/doc/bugs/graphviz_demo_generates_empty_graph.mdwn
new file mode 100644 (file)
index 0000000..5b96f14
--- /dev/null
@@ -0,0 +1,15 @@
+The following code in our sandbox generates an empty graph:
+
+    [[!graph  src=""""
+    google [ href="http://google.com/" ]
+    sandbox [ href=\[[SandBox]] ]
+    help [ href=\[[ikiwiki/formatting]] ]
+    newpage [ href=\[[NewPage]] ]
+    
+    google -> sandbox -> help -> newpage -> help -> google;
+    """"]]
+
+It is the exact same thing that on the [[ikiwiki/directive/graph/]] directive documentation, from the [[plugins/graphviz]] plugin. This is ikiwiki 3.20120203 on Debian wheezy and graphviz is installed (2.26.3-10). Note that the first demo actually works. See <http://mesh.openisp.ca/sandbox>  --[[anarcat]]
+
+> Looking at the example shows too many double quoted. [[fixed|done]]
+> --[[Joey]] 
index 566896ec328de870f4b698a4c55669f3aec7c8f0..4a9c1b3ebbfd09f86106afeaa0ce061abc0a575c 100644 (file)
@@ -79,8 +79,7 @@ Brian May
 >>>>> installed, even with the above commit, `openid` won't be able to 
 >>>>> traverse a proxy. --[[schmonz]]
 
-[[!template id=gitbranch branch=schmonz/proxies author="[[schmonz]]"]]
+[[!template id=gitbranch branch=schmonz/proxy author="[[schmonz]]"]]
 
->>>>> I bollixed up my git, recloned, and reapplied the diffs, so
->>>>> that commit won't exist anymore. My proxy-related changes are
->>>>> now on a branch. --[[schmonz]]
+>>>>>> I've redone this from scratch, much more simply, on a new
+>>>>>> branch. --[[schmonz]].
diff --git a/doc/bugs/image_rescaling_distorts_with_small_pictures.mdwn b/doc/bugs/image_rescaling_distorts_with_small_pictures.mdwn
new file mode 100644 (file)
index 0000000..6425c1e
--- /dev/null
@@ -0,0 +1,49 @@
+If you use the rescaling feature of the directive [[ikiwiki/directive/img/]] with a smaller image it will distort. E.g. an image with 150x250 rescaled into size=200x200. --bastla
+
+> More specifically: `img` normally preserves aspect ratio:
+> `size=200x200` normally means "as large as possible, keeping
+> the width 200px or less, the height 200px or less, and the
+> aspect ratio correct". So a 4:3 image with `size=200x200`
+> would actually come out 200px wide and 150px tall.
+>
+> However, when (desired width is specified) && (desired height is specified)
+> && ((width > desired width) || (height > desired height)),
+> it uses exactly the desired size, without preserving aspect ratio.
+> --smcv
+
+>> [[!template id=gitbranch branch=chrysn/imgforpdf-and-more author="[[chrysn]]"]]
+>>
+>> [[!tag patch]]
+>>
+>> i've implemented a fix for this along with a unit test.
+>>
+>> the patch branch is based on the imgforpdf branch
+>> ([[bugs/svg and pdf conversion fails]]), because it would not cleanly merge.
+>> the  branch also enhances on how images are handled in preview, falling back
+>> to data: urls if the image has not been rendered in a saved version. please
+>> review. --[[chrysn]]
+
+>>> Mostly [[looks good to me|users/smcv/ready]].
+>>>
+>>> Minor things, which wouldn't stop me merging it if I could:
+>>>
+>>> * `$imgdatalink = "data:image/".$im->Get("magick").";base64,".encode_base64($blob[0]);`:
+>>>   is the ImageMagick file type always valid as the second part of
+>>>   a MIME type?
+>>> * In this code:
+>>>
+>>>       +open (my $outhtmlfd, "<", "$outpath.html");
+>>>       +local $/=undef;
+>>>       +my $outhtml = <$outhtmlfd>;
+>>>       +close $outhtmlfd;
+>>>
+>>>   no block is closed, so the "local" is ineffective, so the `<>` operator
+>>>   remains in read-entire-file mode afterwards. To avoid odd side-effects,
+>>>   I would suggest using `readfile()` like `t/trail.t` does.
+>>>
+>>> [[!template id=gitbranch branch=smcv/ready/imgforpdf-and-more author="[[chrysn]], [[smcv]]"
+      browse=http://git.pseudorandom.co.uk/smcv/ikiwiki.git/shortlog/refs/heads/ready/imgforpdf-and-more]]
+>>> I've used `readfile()` (but not done anything about the ImageMagick file type)
+>>> in my copy of the branch.
+>>>
+>>> --[[smcv]]
index 8cda7a70fc89f65f0985c280153ce2bac05801f8..e73c7e662b19cb8db59261323f65a770402fe492 100644 (file)
@@ -12,4 +12,11 @@ If I then inline that page, the (relative) URL no longer points to the right pla
 > However, there is a simple way to avoid both problems: Use WikiLinks
 > and/or the [[img_directive|ikiwiki/directive/img]]. --[[Joey]]
 
+> > For some inline HTML (e.g. SVG embedded with `<object>` tags, it
+> > would be nice to have a URL directive for URL-only WikiLinks.
+> > Something like:
+> > `<object type="image/svg+xml" data="[[!url image.svg]]"></object>`.
+> > This would be a more general solution than an [[SVG-specific
+> > fix|todo/svg]]. --[[wtk]]
+
 [[!tag done]]
diff --git a/doc/bugs/ipv6_address_in_comments.mdwn b/doc/bugs/ipv6_address_in_comments.mdwn
new file mode 100644 (file)
index 0000000..9039165
--- /dev/null
@@ -0,0 +1,19 @@
+If I make a comment from an ipv4 address
+I see the commenter's ipv4 address logged in the comment file.
+
+If I make a comment from an ipv6 address
+I see nothing.
+
+There is a sanity check in /usr/share/perl5/IkiWiki/Plugin/comments.pm
+line 447 (according to today's version) there is an ipv4 specific regexp.
+
+I removed the regexp and used the value without this added check and it fixed
+the problem for me. Not sure if this is the best solution. --[[cstamas]]
+
+[[patch]]
+
+[[!tag ipv6]]
+
+> [[done]] --[[Joey]] 
+
+> > Thank you! --[[cstamas]]
diff --git a/doc/bugs/linkmap_displays_underscore_escapes.mdwn b/doc/bugs/linkmap_displays_underscore_escapes.mdwn
new file mode 100644 (file)
index 0000000..14164d0
--- /dev/null
@@ -0,0 +1,35 @@
+[[!template id=gitbranch branch=chrysn/linkmapenhancement author="[[chrysn]]"]]
+
+[[ikiwiki/directive/linkmap]]s display the file name instead of the pagetitle, showing unsightly underscore escapes and underscores instead of blanks to users.
+
+the attached [[!taglink patch]] fixes this; from its commit message:
+
+    display the pagetitle() in linkmaps
+    
+    without this patch, linkmaps display underscores and underscore escape
+    sequences in the rendered output.
+    
+    this introduces a pageescape function, which invoces pagetitle() to get
+    rid of underscore escapes and wraps the resulting utf8 string
+    appropriately for inclusion in a dot file (using dot's html encoding
+    because it can represent the '\"' dyad properly, and because it doesn't
+    need special-casing of newlines).
+
+the output will look much better (at least in my wikis) with the "[[bugs/pagetitle function does not respect meta titles]]" issue fixed.
+
+> [[Looks good to me|users/smcv/ready]].
+>
+> I don't think it's correct for `pagetitle()` to output `\[[!meta title]]`
+> though, as discussed on the linked bug: it appears in an assortment of
+> contexts where the full formal title of the page seems inappropriate.
+> If you want linkmap to use `\[[!meta title]]`, I think it would be
+> better to give it a `show` parameter, like `\[[!map]]` has?
+> --[[smcv]]
+
+>> sounds good; i'll have a look at it the next time i touch the linkmap
+>> plugin. the patch at hand would be a starting point for that. --[[chrysn]]
+
+the patch is stored in [[the patch.pl]] as created by git-format-patch, and can
+be pulled from the abovementioned branch.
+
+> update 2014-06-29: branch still merges cleanly and works. --[[chrysn]]
diff --git a/doc/bugs/linkmap_displays_underscore_escapes/the_patch.pl b/doc/bugs/linkmap_displays_underscore_escapes/the_patch.pl
new file mode 100644 (file)
index 0000000..6b56c55
--- /dev/null
@@ -0,0 +1,68 @@
+From efbb1121ffdc146f5c9a481a51f23ad151b9f240 Mon Sep 17 00:00:00 2001
+From: chrysn <chrysn@fsfe.org>
+Date: Thu, 15 Mar 2012 14:38:42 +0100
+Subject: [PATCH] display the pagetitle() in linkmaps
+
+without this patch, linkmaps display underscores and underscore escape
+sequences in the rendered output.
+
+this introduces a pageescape function, which invoces pagetitle() to get
+rid of underscore escapes and wraps the resulting utf8 string
+appropriately for inclusion in a dot file (using dot's html encoding
+because it can represent the '\"' dyad properly, and because it doesn't
+need special-casing of newlines).
+---
+ IkiWiki/Plugin/linkmap.pm |   17 +++++++++++++++--
+ 1 files changed, 15 insertions(+), 2 deletions(-)
+
+diff --git a/IkiWiki/Plugin/linkmap.pm b/IkiWiki/Plugin/linkmap.pm
+index ac26e07..b5ef1a1 100644
+--- a/IkiWiki/Plugin/linkmap.pm
++++ b/IkiWiki/Plugin/linkmap.pm
+@@ -5,6 +5,7 @@ use warnings;
+ use strict;
+ use IkiWiki 3.00;
+ use IPC::Open2;
++use HTML::Entities;
+ sub import {
+        hook(type => "getsetup", id => "linkmap", call => \&getsetup);
+@@ -22,6 +23,18 @@ sub getsetup () {
+ my $mapnum=0;
++sub pageescape {
++       my $item = shift;
++       # encoding explicitly in case ikiwiki is configured to accept <> or &
++       # in file names
++       my $title = pagetitle($item, 1);
++       # it would not be necessary to encode *all* the html entities (<> would
++       # be sufficient, &" probably a good idea), as dot accepts utf8, but it
++       # isn't bad either
++       $title = encode_entities($title);
++       return("<$title>");
++}
++
+ sub preprocess (@) {
+        my %params=@_;
+@@ -63,7 +76,7 @@ sub preprocess (@) {
+        my $show=sub {
+                my $item=shift;
+                if (! $shown{$item}) {
+-                       print OUT "\"$item\" [shape=box,href=\"$mapitems{$item}\"];\n";
++                       print OUT pageescape($item)." [shape=box,href=\"$mapitems{$item}\"];\n";
+                        $shown{$item}=1;
+                }
+        };
+@@ -74,7 +87,7 @@ sub preprocess (@) {
+                        foreach my $endpoint ($item, $link) {
+                                $show->($endpoint);
+                        }
+-                       print OUT "\"$item\" -> \"$link\";\n";
++                       print OUT pageescape($item)." -> ".pageescape($link).";\n";
+                }
+        }
+        print OUT "}\n";
+-- 
+1.7.9.1
diff --git a/doc/bugs/listdirectives_doesn__39__t_register_a_link.mdwn b/doc/bugs/listdirectives_doesn__39__t_register_a_link.mdwn
new file mode 100644 (file)
index 0000000..ad52d78
--- /dev/null
@@ -0,0 +1,114 @@
+The [[ikiwiki/directive/listdirectives]]` directive doesn't register a link between the page and the subpages. This is a problem because then the [[ikiwiki/directive/orphans]] directive then marks the directives as orphans... Maybe it is a but with the orphans directive however... A simple workaround is to exclude those files from the orphans call... --[[anarcat]]
+
+> There's a distinction between wikilinks (matched by `link()`,
+> `backlink()` etc.) and other constructs that produce a
+> hyperlink. Some directives count as a wikilink (like `tag`)
+> but many don't (notably `inline`, `map`, `listdirectives`,
+> and `orphans` itself). As documented in
+> [[ikiwiki/directive/orphans]], orphans will tend to list
+> pages that are only matched by inlines/maps, too.
+>
+> The rule of thumb seems to be that a link to a particular
+> page counts as a wikilink, but a directive that lists
+> pages matching some pattern does not; so I think
+> `listdirectives` is working as intended here.
+> `orphans` itself obviously shouldn't count as a wikilink,
+> because that would defeat the point of it :-)
+>
+> Anything that uses a [[ikiwiki/pagespec]] to generate links,
+> like `inline` and `map`, can't generate wikilinks, because
+> wikilinks are gathered during the scan phase, and pagespecs
+> can't be matched until after the scan phase has finished
+> (otherwise, it'd be non-deterministic whether all wikilinks
+> had been seen yet, and `link()` in pagespecs wouldn't work
+> predictably).
+>
+> I suggest just using something like:
+>
+>     \[[!orphans pages="* and !blog/* and !ikiwiki/directive/*"]]
+>
+> This wiki's example of listing [[plugins/orphans]] has a
+> more elaborate pagespec, which avoids bugs, todo items etc.
+> as well.
+>
+> --[[smcv]]
+
+> No follow-up or objection for a while, so considering this to
+> be working as designed. --[[smcv]]
+
+> > Seems I'm a bit late to butt in, but would it be possible to have two
+> > further phases after the scan phase, the first running map and inline 
+> > and the second orphan? Then map and inline could log or register their 
+> > links (obviously somewhere were it won't change the result of the link function)
+> > and orphan could take them into account. This logging could be
+> > turned on by parameter to not waste time for users not needing this and 
+> > make it tunable (i.e. so that the user can decide which map directives count and which don't)
+> > 
+> > For someone using map and especially autoindex the output of the orphans directive
+> > is simply wrong/useless (at least it is for me). And there is no easy workaround like for listdirectives
+> > -- [[holger]]
+
+>>> Hmm. I think this can be done without introducing any "phases",
+>>> even, but it would require each plugin that generates links according
+>>> to a pagespec to have either a conditional call into the orphans plugin,
+>>> or a call to a new core function in ikiwiki that exists solely to
+>>> support the orphans plugin. Something like this, maybe:
+>>>
+>>>     # in map.pm, inline.pm, pagestats.pm etc., at scan time
+>>>     if (IkiWiki::Plugin::orphans->can("add_reachable")) {
+>>>         IkiWiki::Plugin::orphans::add_reachable($page, $pagespec);
+>>>     }
+>>>
+>>>     # in orphans.pm (pseudocode; note that this does not *evaluate*
+>>>     # $pagespec, only stores it, so it's OK to do this at scan time)
+>>>     sub needsbuild ($pages)
+>>>         for each page in $pages
+>>>             clear $pagestate{location}{orphans}{reachable}
+>>>     sub reachable ($location, $pagespec)
+>>>         add $pagespec to @{$pagestate{location}{orphans}{reachable}}
+>>>
+>>>     # in preprocess function in orphans.pm (pseudocode)
+>>>     # executed at build time, not at scan time, so pagespecs work
+>>>
+>>>     for each maybe_orphan with no links to it
+>>>         for each location with a list of reachable pagespecs
+>>>             make the page with the orphans directive depend on \
+>>>                 the page that is the location
+>>>             for each of those pagespecs
+>>>                 if pagespec matches orphan
+>>>                     take orphan off the list
+>>>                     go to next orphan
+>>>     output list of orphans
+>>>
+>>> (Maybe parentlinks should also annotate the parent/ancestors of
+>>> each page as reachable from that page.)
+>>>
+>>> Do other people (mainly Joey) think that'd be acceptable, or
+>>> too intrusive?
+>>>
+>>> Taking this off the list of resolved bugs again while we think about it.
+>>>
+>>> I suspect that in the presence of autoindex, what you really want might
+>>> be less "there's a link to it" and more "there's a path to it from
+>>> the root of the wiki", which is why I called the proposed function
+>>> "add_reachable". On the other hand, maybe that's too computationally
+>>> intensive to actually do; I haven't tried it.
+>>> --[[smcv]]
+>>>> 
+>>>> (I'll interpet Joeys silence as a good sign ;-). Is there a difference between "link to it" and "path to it"? If we assume autoindex produces bonafide "first class" links there shouldn't be one!?
+>>>>
+>>>> So far your idea sounds great, says me without any knowledge of the source. I'll try to grok it. Is there a medium for silly questions, a wiki seems not the right fit for that? -- [[holger]]
+>>>>> Yes, there *has* to be a difference between a first class wikilink
+>>>>> and the thing to which `map` and `inline` can contribute.
+>>>>> `map` and `inline` use a pagespec to decide what they include,
+>>>>> and pagespecs can't be evaluated and get a correct answer until the
+>>>>> set of links has been collected, because their results often depend
+>>>>> on the set of links. Otherwise, suppose you had a page `foo` whose only
+>>>>> contents were this:
+>>>>>
+>>>>>     \[[!inline pages="!backlink(foo)"]]
+>>>>>
+>>>>> If `inline` generated links, it would inline exactly those pages that
+>>>>> it doesn't inline. That's never going to end well :-) --[[smcv]]
+>>>>>> We have to differentiate between what users of ikiwiki consider first class links and what internally is happening. For the user any link contributing to the structured access tree is first class. The code on the other hand has to differentiate between the static links, then generated links, then orphan links. Three "passes", even your proposed solution could be seen as adding another pass since the orphan plugin has to run after all the plugins generating (first class user) links.   -- [[holger]]
+
diff --git a/doc/bugs/map_generates_malformed_HTML.mdwn b/doc/bugs/map_generates_malformed_HTML.mdwn
new file mode 100644 (file)
index 0000000..890a6ef
--- /dev/null
@@ -0,0 +1,36 @@
+[[!template id=gitbranch branch=smcv/ready/map author="[[Simon McVittie|smcv]]"]]
+[[!tag patch]]
+
+`\[[!map]]` can generate bad HTML with unbalanced open/close tags
+(in XML terms: "not well-formed") in certain situations. This
+appears to be a regression caused by fixing
+[[maps with nested directories sometimes make ugly lists]], which
+suppressed some redundant `</ul><ul>` pairs, but appears not to
+have the ideal logic for this, leading to malformed HTML.
+
+In particular, on a site with these pages:
+
+* alpha
+    * 1
+        * i
+        * ii
+        * iii
+        * iv
+    * 2
+        * a
+        * b
+    * 3
+* beta
+
+the maps "`alpha/1 or beta`", "`alpha/1/i* or alpha/2/a or beta`" and
+"`alpha/1/i* or alpha/2/a`" have malformed HTML.
+
+My `ready/map` branch adds a regression test and makes it pass.
+
+The fix is not particularly elegant - it generates the previous
+HTML with redundant `</ul><ul>` pairs, marks the redundant
+pairs, and edits them out afterwards - but it works. If anyone can come
+up with a cleaner algorithm that avoids generating the redundant tags
+in the first place, that would be even better. --[[smcv]]
+
+> [[merged|done]] (not thrilled at this solution, but it works) --[[Joey]] 
index 20d5dc8e64407fd88a7b03b4b08049f1d15df47b..bd5ddc6d5a0dc2b3ff4f5d4c7e2c14e016092396 100644 (file)
@@ -26,7 +26,19 @@ Is this a problem on my site or does anyone else see this?
 
 >>> The right fix would probably be for `do=create` to allow replacing a page
 >>> in the transient underlay without complaining (like the behaviour that
->>> `do=edit` normally has). That wouldn't help you unless [[plugins/autoindex]]
+>>> `do=edit` normally has).
+
+>>>> ... which it turns out it already does. --[[smcv]]
+
+>>> That wouldn't help you unless [[plugins/autoindex]]
 >>> defaulted to making transient pages (`autoindex_commit => 0`), but if we
 >>> can fix [[removal_of_transient_pages]] then maybe that default can change?
 >>> --[[smcv]]
+
+>>>> It turns out that with `autoindex_commit => 0`, the failure mode is
+>>>> different. The transient map is created when you attach the
+>>>> attachment. When you save the page, it's written into the srcdir,
+>>>> the map is deleted from the transientdir, and the ctime/mtime
+>>>> in the indexdb are those of the file in the srcdir, but for some
+>>>> reason the HTML output isn't re-generated (despite a refresh
+>>>> happening). --[[smcv]]
diff --git a/doc/bugs/nonexistent_pages_in_inline_pagenames_do_not_add_a_dependency.mdwn b/doc/bugs/nonexistent_pages_in_inline_pagenames_do_not_add_a_dependency.mdwn
new file mode 100644 (file)
index 0000000..486be03
--- /dev/null
@@ -0,0 +1,44 @@
+In commit aaa72a3a8, Joey noted:
+
+> bestlink returns '' if no existing page matches a link. This propigated
+> through inline and other plugins, causing uninitialized value warnings, and
+> in some cases (when filecheck was enabled) making the whole directive fail.
+>   
+> Skipping the empty results fixes that, but this is papering over another
+> problem: If the missing page is later added, there is not dependency
+> information to know that the inline needs to be updated. Perhaps smcv will
+> fix that later.
+
+Potential ways this could be addressed:
+
+* Add a presence dependency on everything the reference could match:
+  so if the `inline` is on `a/b/c` and the missing page is `m`,
+  add a `$depends_simple` `$DEPEND_PRESENCE` dependency on `a/b/c/m`,
+  `a/b/m`, `a/m`, `m` and (if configured) `$config{userdir}/m`
+
+* Make the page names in `\[[!inline pagenames=...]]` count as wikilinks,
+  changing the behaviour of `link()` and backlinks, but causing appropriate
+  rebuilds via the special cases in `IkiWiki::Render`
+
+* Extend the special cases in `IkiWiki::Render` to consider a superset of
+  wikilinks, to which `pagenames` would add its named pages, without
+  affecting `link()` and backlinks
+
+(Note that `\[[!inline pages=...]]` cannot count as wikilinks, because
+pagespecs can contain `link()`, so can't be evaluated until we know what
+wikilinks exist, at which point it's too late to add more wikilinks.)
+
+I think the presence dependency is probably the cleanest approach?
+--[[smcv]]
+
+> I think it was possibly a mistake to use wikilink style lookup for
+> `pagenames`. --[[Joey]]
+
+[[!tag patch]] [[!template id=gitbranch branch=smcv/literal-pagenames author="[[smcv]]"]]
+>> I used the linking rules to make references to
+>> "nearby" pages convenient, but if you'd prefer "absolute"
+>> semantics, my `ready/literal-pagenames` branch does that. For
+>> my main use-case for `pagenames` ([[plugins/contrib/album]])
+>> it's fine either way. --[[smcv]]
+
+>>> Ok, [[merged|done]]. I think it's more consistent this way. --[[Joey]]
diff --git a/doc/bugs/notifyemail_fails_with_some_openid_providers.mdwn b/doc/bugs/notifyemail_fails_with_some_openid_providers.mdwn
new file mode 100644 (file)
index 0000000..dd50166
--- /dev/null
@@ -0,0 +1,91 @@
+[[!template  id=gitbranch branch=anarcat/dev/openid_email author="[[anarcat]]"]]
+
+This bug affects [[plugins/notifyemail]] but is probably caused more by [[plugins/openid]]. When using OpenID to login to a site, no email notification is sent to the user (pagespec set to `*`) when a modification is done on the wiki. I believe this is because the OpenID plugin assumes the email comes from the OpenID provider - which is not necessarily going to succeed if, for privacy reason, the OpenID provider refuses to transmit the email to ikiwiki.
+
+In the OpenID plugin, the email is actually fetched when authenticating and is stored in the session, like so:
+
+[[!format perl """
+sub auth ($$) {
+# [...]
+                       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;
+                                       }
+                               }
+
+"""]]
+
+This is based on the assumption that the openid provider supports "sreg" or "ax" extensions, which is not mandatory, and even then, the provider is not forced to provide the email.
+
+Earlier in the plugin, the email field is actually hidden:
+
+[[!format perl """
+sub formbuilder_setup (@) {
+       my %params=@_;
+
+       my $form=$params{form};
+       my $session=$params{session};
+       my $cgi=$params{cgi};
+       
+       if ($form->title eq "preferences" &&
+              IkiWiki::openiduser($session->param("name"))) {
+               $form->field(name => "openid_identifier", disabled => 1,
+                       label => htmllink("", "", "ikiwiki/OpenID", noimageinline => 1),
+                       value => "", 
+                       size => 1, force => 1,
+                       fieldset => "login",
+                       comment => $session->param("name"));
+               $form->field(name => "email", type => "hidden");
+       }
+}
+"""]]
+
+I believe this could be worked around simply by re-enabling that field and allowing the user to specify an email there by hand, making a note that the OpenID provider's email is used by default.
+
+The dumbest [[!taglink patch]] that actually fixes the problem for me is in the branch mentionned above.
+
+It would probably be better to add a comment on the field as indicated above, but it's a good proof of concept.
+
+Any other ideas? --[[anarcat]]
+
+> Note: it seems that my email *is* given by my OpenID provider, no idea why this is not working, but the fix proposed in my branch works. --[[anarcat]]
+
+>> Note: this is one of two patches i need to apply at every upgrade. The other being [[can__39__t_upload_a_simple_png_image:_prohibited_by_allowed__95__attachments___40__file_MIME_type_is_application__47__octet-stream...]]. --[[anarcat]]
+
+>>> Is there any sort of check that the owner of the given email address
+>>> wants to receive email from us, or way for the owner of that email
+>>> address to stop getting the emails?
+>>>
+>>> With passwordauth, if someone maliciously subscribes my email
+>>> address to high-traffic pages or something (by using it as the
+>>> email address of their wiki login), I can at least use
+>>> password-recovery to hijack their account and unsubscribe myself.
+>>> If they're signing in with an OpenID not associated with my
+>>> email address and then changing the email address in the userdb
+>>> to point to me, I don't think I can do that.
+>>>
+>>> With OpenID, I think we're just trusting that the OpenID provider
+>>> wouldn't give us an unverified email address, which also seems
+>>> a little unwise.
+>>>
+>>> It might be better to give ikiwiki a concept of verifying an
+>>> email address (the usual send-magic-token flow) and only be
+>>> willing to send notifications to a verified address?
+>>>
+>>> --[[smcv]]
index e4bc736e3c3b73a71a6a0288f4049cf92b36d8cb..cacd2b73b946c92e628163e06f2b13db6416bdb5 100644 (file)
@@ -1,6 +1,11 @@
+[[!template id=gitbranch branch=smcv/ready/less-open author="[[smcv]]"]]
+[[!tag patch]]
+
 The [[plugins/opendiscussion]] plugin allows pages named according to
 the `discussionpage` setting to be edited anonymously, even if
 `discussion => 0` is set.
 
 (If it respected the `discussion` option, the combination of
 `opendiscussion` and `moderatedcomments` might be good for blogs.)
+
+[[done]] --[[smcv]]
diff --git a/doc/bugs/opendiscussion_should_respect_the_discussion_option/discussion.mdwn b/doc/bugs/opendiscussion_should_respect_the_discussion_option/discussion.mdwn
new file mode 100644 (file)
index 0000000..a5c9516
--- /dev/null
@@ -0,0 +1,26 @@
+This would be great to see fixed. It's perplexing to have discussion => 0 in my configuration, not have any discussion links on my site, but still be able to add a discussion page by URL hacking something like this: /cgi-bin/ikiwiki/ikiwiki.cgi?page=posts%2Fdiscussion&do=edit.
+
+spammers have figured that little trick out so I am consitently getting spammed checked into my git repository.
+
+I'm not really sure if this patch introduced other problems, but it seems to have fixed my site:
+
+               0 mcclelland@chavez:~/.ikiwiki/IkiWiki/Plugin$ diff -u /usr/share/perl5/IkiWiki/Plugin/opendiscussion.pm opendiscussion.pm 
+               --- /usr/share/perl5/IkiWiki/Plugin/opendiscussion.pm   2012-05-07 11:31:24.000000000 -0400
+               +++ opendiscussion.pm   2012-07-29 17:49:28.000000000 -0400
+               @@ -25,7 +25,7 @@
+                       my $cgi=shift;
+                       my $session=shift;
+                
+               -       return "" if $page=~/(\/|^)\Q$config{discussionpage}\E$/i;
+               +       return "" if $page=~/(\/|^)\Q$config{discussionpage}\E$/i && $config{discussion};
+                       return "" if pagespec_match($page, "postcomment(*)");
+                       return undef;
+                }
+               1 mcclelland@chavez:~/.ikiwiki/IkiWiki/Plugin$  
+
+If libdir is configured to be ~/.ikiwiki in your ikiwiki.settings file, and you are running Debian, you can do the following:
+
+               mkdir -p ~/.ikiwiki/IkiWiki/Plugin
+               cp /usr/share/perl5/IkiWiki/Plugin/opendiscussion.pm ~/.ikiwiki/IkiWiki/Plugin/
+
+And then apply the patch above to ~/.ikiwiki/Ikiwiki/Plugin/opendiscussion.pm.
diff --git a/doc/bugs/openid_login_fails_wirth_Could_not_determine_ID_provider_from_URL.mdwn b/doc/bugs/openid_login_fails_wirth_Could_not_determine_ID_provider_from_URL.mdwn
new file mode 100644 (file)
index 0000000..073c10d
--- /dev/null
@@ -0,0 +1,200 @@
+On some ikiwikis that I run, I get the following error on OpenID logins:
+
+    no_identity_server: Could not determine ID provider from URL.
+
+> Is this fixed now that [[!debbug 738493]] has been fixed? --[[smcv]]
+
+> > No, it isn't. I still get: `no_identity_server: Could not determine ID provider from URL.` from the latest ikiwiki in jessie (3.20140831), with liblwpx-paranoidagent-perl 1.10-3. Debugging tells me it's still related to the `500 Can't verify SSL peers without knowing which Certificate Authorities to trust` error, so probably because `Mozilla::CA` is not packaged ([[!debbug 702124]]). I still had to apply the patch to disable SSL verification at the end of this file. However, setting `$ENV{PERL_LWP_SSL_CA_PATH} = '/etc/ssl/certs';` seems to work now, so the following dumb patch works:
+> > 
+> > ~~~~
+> > --- /usr/bin/ikiwiki.orig       2014-09-08 15:48:35.715868902 -0400
+> > +++ /usr/bin/ikiwiki    2014-09-08 15:50:29.666779878 -0400
+> > @@ -225,4 +225,5 @@
+> >         }
+> >  }
+> > 
+> > +$ENV{PERL_LWP_SSL_CA_PATH} = '/etc/ssl/certs';
+> >  main;
+> > ~~~~
+> > 
+> > may not be the best place to fiddle around with this, but then again it makes sense that it applies to the whole program. it should probably be reported upstream as well. also in my git repo. -- [[anarcat]]
+> >
+> > > This seems Debian-specific. I would be inclined to consider this to be
+> > > a packaging/system-integration (i.e. non-upstream) bug in
+> > > `liblwpx-paranoidagent-perl` rather than an upstream bug in IkiWiki;
+> > > it certainly seems inappropriate to put this Debian-specific path
+> > > in upstream IkiWiki. If it can't be fixed in LWPX::ParanoidAgent for
+> > > whatever reason, applying it via some sort of sed in ikiwiki's
+> > > `debian/rules` might be more reasonable? --[[smcv]]
+> > >
+> > > > by "upstream", i did mean `liblwpx-paranoidagent-perl`. so yeah, maybe this should be punted back into that package's court again. :( --[[anarcat]]
+> > > > 
+> > > > done, by bumping the severity of [[!debbug 744404]] to release-criticial. --[[anarcat]]
+> > > > 
+> > > > > ooh cool, the bug was fixed already with an upload, so this should probably be considered [[done]] at this point, even without the patch below! great! -- [[anarcat]]
+
+[[!template  id=gitbranch branch=anarcat/dev/ssl_ca_path author="[[anarcat]]"]] 
+
+I seem recall having that error before, and fixing it, but it always seems to come back and I forget how to fix it. So I'll just open this bug and document it if i can figure it out... -- [[users/anarcat]]
+
+The Perl module manual says:
+
+>            "no_identity_server"
+>               (CV) Tried to do discovery on a URL that does not seem to have any providers at all.
+
+Yet on the server side, I see no request coming in on the OpenID provider... 
+
+Adding debugging helps in figuring out wtf is going on:
+
+~~~~
+anarcat@marcos:~$ diff -u ~/src/ikiwiki/IkiWiki/Plugin/openid.pm /usr/share/perl5/IkiWiki/Plugin/openid.pm
+--- /home/anarcat/src/ikiwiki/IkiWiki/Plugin/openid.pm  2014-02-03 20:21:09.502878631 -0500
++++ /usr/share/perl5/IkiWiki/Plugin/openid.pm   2014-04-13 11:45:25.413297420 -0400
+@@ -257,6 +256,7 @@
+        return Net::OpenID::Consumer->new(
+                ua => $ua,
+                args => $q,
++               debug => 1,
+                consumer_secret => sub { return shift()+$secret },
+                required_root => auto_upgrade_https($q, $cgiurl),
+        );
+~~~~
+
+In my case, I see:
+
+
+~~~~
+[Sun Apr 13 11:45:35.796531 2014] [cgi:error] [pid 7299] [client 162.223.3.24:39547] AH01215: [DEBUG Net::OpenID::Consumer] Cache MISS for https://id.koumbit.net/anarcat, referer: http://cats.orangeseeds.org/ikiwiki.cgi?do=signin&action=verify&openid_identifier=https%3A%2F%2Fid.koumbit.net%2Fanarcat
+[Sun Apr 13 11:45:35.842520 2014] [cgi:error] [pid 7299] [client 162.223.3.24:39547] AH01215: [DEBUG Net::OpenID::Consumer] Cache MISS for https://id.koumbit.net/anarcat, referer: http://cats.orangeseeds.org/ikiwiki.cgi?do=signin&action=verify&openid_identifier=https%3A%2F%2Fid.koumbit.net%2Fanarcat
+[Sun Apr 13 11:45:35.845603 2014] [cgi:error] [pid 7299] [client 162.223.3.24:39547] AH01215: [DEBUG Net::OpenID::Consumer] semantic info (https://id.koumbit.net/anarcat) = , referer: http://cats.orangeseeds.org/ikiwiki.cgi?do=signin&action=verify&openid_identifier=https%3A%2F%2Fid.koumbit.net%2Fanarcat
+[Sun Apr 13 11:45:35.845672 2014] [cgi:error] [pid 7299] [client 162.223.3.24:39547] AH01215: [DEBUG Net::OpenID::Consumer] fail(no_identity_server) Could not determine ID provider from URL., referer: http://cats.orangeseeds.org/ikiwiki.cgi?do=signin&action=verify&openid_identifier=https%3A%2F%2Fid.koumbit.net%2Fanarcat
+~~~~
+
+There are three places in the code the original error message happens:
+
+* Net::OpenID::claimed_identity
+* Net::OpenID::verified_identity
+* Net::OpenID::_find_openid_server
+
+We'll look at the last one because it's where the URL data is actually fetched.
+
+[[!format perl """
+sub _find_openid_server {
+    my Net::OpenID::Consumer $self = shift;
+    my $url = shift;
+    my $final_url_ref = shift;
+
+    my $sem_info = $self->_find_semantic_info($url, $final_url_ref) or
+        return;
+
+    return $self->_fail("no_identity_server") unless $sem_info->{"openid.server"};
+    $sem_info->{"openid.server"};
+}
+"""]]
+
+From there we look at `_find_semantic_info()`, which is supposed to hit the OpenID server, but doesn't somehow.... By cranking up debugging, we can see that the consumer fails to verify the HTTPS signature on the host:
+
+~~~~
+[Sun Apr 13 11:58:30.284511 2014] [cgi:error] [pid 11141] [client 162.223.3.24:39563] AH01215: [DEBUG Net::OpenID::Consumer] url dump (https://id.koumbit.net/anarcat, SCALAR(0x3275ac0)) = 500 Can't verify SSL peers without knowing which Certificate Authorities to trust, referer: http://cats.orangeseeds.org/ikiwiki.cgi?do=signin&action=verify&openid_identifier=https%3A%2F%2Fid.koumbit.net%2Fanarcat
+[Sun Apr 13 11:58:30.284551 2014] [cgi:error] [pid 11141] [client 162.223.3.24:39563] AH01215: , referer: http://cats.orangeseeds.org/ikiwiki.cgi?do=signin&action=verify&openid_identifier=https%3A%2F%2Fid.koumbit.net%2Fanarcat
+[Sun Apr 13 11:58:30.284573 2014] [cgi:error] [pid 11141] [client 162.223.3.24:39563] AH01215: This problem can be fixed by either setting the PERL_LWP_SSL_CA_FILE, referer: http://cats.orangeseeds.org/ikiwiki.cgi?do=signin&action=verify&openid_identifier=https%3A%2F%2Fid.koumbit.net%2Fanarcat
+[Sun Apr 13 11:58:30.284593 2014] [cgi:error] [pid 11141] [client 162.223.3.24:39563] AH01215: envirionment variable or by installing the Mozilla::CA module., referer: http://cats.orangeseeds.org/ikiwiki.cgi?do=signin&action=verify&openid_identifier=https%3A%2F%2Fid.koumbit.net%2Fanarcat
+[Sun Apr 13 11:58:30.284597 2014] [cgi:error] [pid 11141] [client 162.223.3.24:39563] AH01215: , referer: http://cats.orangeseeds.org/ikiwiki.cgi?do=signin&action=verify&openid_identifier=https%3A%2F%2Fid.koumbit.net%2Fanarcat
+~~~~
+
+To get this little wonder, I had to change the `_find_semantic_info()` as followed:
+
+[[!format perl """
+sub _find_semantic_info {
+    my Net::OpenID::Consumer $self = shift;
+    my $url = shift;
+    my $final_url_ref = shift;
+
+    my $doc = $self->_get_url_contents($url, $final_url_ref);
+    $self->_debug("url dump ($url, $final_url_ref) = " . $doc) if $self->{debug};
+    my $info = _document_to_semantic_info($doc);
+    $self->_debug("semantic info ($url) = " . join(", ", map { $_.' => '.$info->{$_} } keys %$info)) if $self->{debug};
+
+    return $info;
+}
+"""]]
+
+A minimal test case would be:
+
+~~~~
+perl -e 'use LWPx::ParanoidAgent;
+  print $LWPx::ParanoidAgent::VERSION, " $]: ";
+  print length(LWPx::ParanoidAgent->new->get
+      ("https://id.koumbit.net/anarcat")
+      ->decoded_content), "\n";'
+~~~~
+
+And the results vary according to the version of perl:
+
+* wheezy: 1.07 5.014002: 5720
+* jessie: 1.10 5.018002: 398
+
+Thanks [jwz](http://www.jwz.org/blog/2014/03/apple-broke-lwp-in-a-new-and-exciting-way-on-10-9-2/) for that.. Mozilla::CA *could* have been packaged in Debian, except it overlaps with the `ca-certificates` package, so it was [basically barred entry](https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=702124).
+
+I tried the workaround of hardcoding the path to the CA root, using `PERL_LWP_SSL_CA_PATH=/etc/ssl/certs`, but then I hit *another* bug in LWP: [#738493](https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=738493).
+
+Note that this bug is similar to [[bugs/ssl_certificates_not_checked_with_openid/]], but backwards: it checks the SSL certs but then fails to verify.
+
+I filed this bug in the Debian BTS as [#702124](https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=702124). Downgrading to wheezy's version of LWPx::ParanoidAgent doesn't fix the problem, instead i get this error:
+
+    500 Can't read entity body: Resource temporarily unavailable
+
+... yet the commandline client works fine... I'm out of ideas for this sucker.
+
+Update: i found a way to reproduce the problem even with LWPx::ParanoidAgent 1.07:
+
+~~~~
+$ perl -e 'use LWPx::ParanoidAgent;
+  print $LWPx::ParanoidAgent::VERSION, " $]\n";
+  $ua = new LWPx::ParanoidAgent; for (my $i = 0; $i< 10 ; $i++) { $c = LWPx::ParanoidAgent->new->get
+      ("https://id.koumbit.net/anarcat")
+      ->decoded_content; if (length($c) < 100) { print $c; } else { print length($c),"\n";}}'
+1.07 5.018002
+5720
+500 Can't read entity body: Ressource temporairement non disponible
+500 Can't read entity body: Ressource temporairement non disponible
+500 Can't read entity body: Ressource temporairement non disponible
+500 Can't read entity body: Ressource temporairement non disponible
+500 Can't read entity body: Ressource temporairement non disponible
+500 Can't read entity body: Ressource temporairement non disponible
+500 Can't read entity body: Ressource temporairement non disponible
+500 Can't read entity body: Ressource temporairement non disponible
+500 Can't read entity body: Ressource temporairement non disponible
+~~~~
+
+Workaround - disable error checking:
+
+~~~~
+--- /home/anarcat/src/ikiwiki/IkiWiki/Plugin/openid.pm  2014-02-03 20:21:09.502878631 -0500
++++ /usr/share/perl5/IkiWiki/Plugin/openid.pm   2014-04-13 16:00:06.875744596 -0400
+@@ -237,7 +237,7 @@
+
+        my $ua;
+        eval q{use LWPx::ParanoidAgent};
+-       if (! $@) {
++       if (! $@ && 0) {
+                $ua=LWPx::ParanoidAgent->new;
+        }
+        else {
+~~~~
+
+> I get the same trouble with OpenID and some locally installed versions of IkiWiki on Debian wheezy (server) as well as on 13.10 Ubuntu (laptop). To be precise I hit the *other* bug in LWP: [#738493](https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=738493).
+>
+> My only workaround for now was to fix `PERL_LWP_SSL_VERIFY_HOSTNAME` to 0 directly in `ikiwiki` :-(  -- [[users/bbb]]
+
+~~~~
+--- /usr/bin/ikiwiki.orig       2014-09-08 15:48:35.715868902 -0400
++++ /usr/bin/ikiwiki    2014-09-08 15:48:38.895947911 -0400
+@@ -225,4 +225,5 @@
+        }
+ }
+
++$ENV{PERL_LWP_SSL_VERIFY_HOSTNAME} = 0;
+ main;
+~~~~
+
diff --git a/doc/bugs/osm_KML_maps_do_not_display_properly_on_google_maps.mdwn b/doc/bugs/osm_KML_maps_do_not_display_properly_on_google_maps.mdwn
new file mode 100644 (file)
index 0000000..2b20240
--- /dev/null
@@ -0,0 +1,14 @@
+[[!template  id=gitbranch branch=anarcat/master author="[[anarcat]]"]]
+
+I know this sounds backwards, but it seems to me that the KML-generated map should be displayable on google maps. KML is the standard Google uses for google maps, and since we use it, we should interoperate with them. God knows why this is failing, but it is and should probably be fixed for the sake of interoperability: <https://maps.google.ca/maps?q=http:%2F%2Fwiki.reseaulibre.ca%2Fmap%2Fpois.kml> -- [[users/anarcat]]
+
+> The KML only needs a Document tag because it uses "shared styles" -- don't ask me what this is. Here is a [[patch]]: [[https://reseaulibre.deuxpi.ca/0001-Add-Document-tag-to-OSM-plugin-KML-output.patch]] --[[deuxpi]]
+
+> > I applied the patch to my master branch and tested it on the above URL: it works... mostly. The icons for the elements on the actual map seem incorrect (some are the proper icons, some others are the ugly default blue pin of google maps, weird) but I think this is a step in the right direction. Thus, this should be merged. -- [[anarcat]]
+
+>>> I've cherry-picked this patch, but from the description it does not
+>>> sound "fixed" enough to close this bug. (OTOH, perhaps only google can
+>>> fix it, so it people are happy with the state of affairs I won't insist
+>>> this bug be left open.) --[[Joey]]
+
+> > > > I am happy with this right now, so let's mark this as [[done]]. I do agree this seems like a google bug, so let's move on. --[[anarcat]]
diff --git a/doc/bugs/osm_KML_maps_icon_path_have_a_trailing_slash.mdwn b/doc/bugs/osm_KML_maps_icon_path_have_a_trailing_slash.mdwn
new file mode 100644 (file)
index 0000000..a3a88d1
--- /dev/null
@@ -0,0 +1,34 @@
+This is not a problem on Apache webservers because they, oddly enough, ignore trailing slashes on paths (maybe some `PATH_INFO` magic, no idea). But basically, in our wiki, the paths to the icon tags are generated with a trailing slash. An excerpt of our [KML file](http://wiki.reseaulibre.ca/map/pois.kml):
+
+    <Style id="/tag/up">
+    <IconStyle>
+    <Icon>
+    <href>http://wiki.reseaulibre.ca//tag/up/icon.png/</href>
+    </Icon>
+    </IconStyle>
+    </Style>
+
+Notice the trailing `/` after the `icon.png`. This breaks display on nginx - the file that gets served isn't the icon, but the frontpage for some reason. I followed the [[setup instructions|tips/dot cgi]] for Nginx that I just had to write because there weren't any, so maybe I screwed up some part, but it does seem to me that the trailing slash is wrong regardless.
+
+(Also notice how the style tag is being turned over backwards by the HTML sanitizer here, cute. :P)
+
+I wrote a crude hack for this, but this strikes me as a similar problem to the one we found in [[bugs/osm linkto() usage breaks map rendering]]. However, I am at a loss how to fix this cleanly because we cannot `will_render()` the tag icons, as they are already generated out there! Weird. Anyways, here's the stupid [[patch]]:
+
+[[!format diff """
+diff --git a/IkiWiki/Plugin/osm.pm b/IkiWiki/Plugin/osm.pm
+index a7baa5f..c9650d0 100644
+--- a/IkiWiki/Plugin/osm.pm
++++ b/IkiWiki/Plugin/osm.pm
+@@ -192,6 +192,7 @@ sub process_waypoint {
+                }
+        }
+        $icon = urlto($icon, $dest, 1);
++       $icon =~ s!/*$!!; # hack - urlto shouldn't be appending a slash in the first place
+        $tag = '' unless $tag;
+        register_rendered_files($map, $page, $dest);
+        $pagestate{$page}{'osm'}{$map}{'waypoints'}{$name} = {
+"""]]
+
+I'm not writing this to a branch out of sheer shame of my misunderstanding. ;) There also may be a workaround that could be done in Nginx too. --[[anarcat]]
+
+> [[applied|done]], but I'm not happy with this either --[[Joey]]
diff --git a/doc/bugs/osm_linkto__40____41___usage_breaks_map_rendering.mdwn b/doc/bugs/osm_linkto__40____41___usage_breaks_map_rendering.mdwn
new file mode 100644 (file)
index 0000000..89c08b7
--- /dev/null
@@ -0,0 +1,23 @@
+[[!template  id=gitbranch branch=anarcat/master author="[[anarcat]]"]]
+
+Under some circumstances that remain unclear to me, the usage of `urlto()` in the revised version of the [[plugins/osm]] plugin break the map totally. The javascript console in Chromium tells me the following:
+
+    GET http://mesh.openisp.ca/map/pois.kml/ 404 (Not Found)
+
+Indeed, that URL yields a 404. The proper URL is <http://mesh.openisp.ca/map/pois.kml>. --[[anarcat]]
+
+## Proposed solution
+
+The problem seems to be caused by `urlto()` being called for the `osm`
+directive before the generated files are registered with `will_render()`
+from the `waypoint` directive. Proposed patch adds a function that is
+called from the `preprocess` hook for both directives that registers the
+files.
+
+Here is a [[patch]] to IkiWiki/Plugin/osm.pm: <https://reseaulibre.deuxpi.ca/0000-Fix-incorrect-URL-pointing-to-the-generated-waypoint.patch>
+
+--[[deuxpi]]
+
+I confirm the patch works, and I added it to my master branch. --[[anarcat]]
+
+> [[applied|done]]. Thanks guys. --[[Joey]]
diff --git a/doc/bugs/osm_plugin_error_TypeError:_mapProjection_is_null.mdwn b/doc/bugs/osm_plugin_error_TypeError:_mapProjection_is_null.mdwn
new file mode 100644 (file)
index 0000000..42e2edb
--- /dev/null
@@ -0,0 +1,8 @@
+[[!template  id=gitbranch branch=cbaines/osm-layers-patch author="[[cbaines]]"]]
+
+Using the osm plugin with a simple \[[!osm]] directive does not seem to work, a "TypeError: mapProjection is null" is given. I believe this is because the client side Javascript uses the options.layers, which is always Null. 
+
+[[!tag patch]]
+I have produced a patch for this issue, but beware, while it appears to fix the problem for me, I have little understanding of perl and the existing code base.
+
+> It looks sound, but I have yet to test it. --[[anarcat]]
diff --git a/doc/bugs/osm_sometimes_looses_some_nodes.mdwn b/doc/bugs/osm_sometimes_looses_some_nodes.mdwn
new file mode 100644 (file)
index 0000000..9de1b4e
--- /dev/null
@@ -0,0 +1,5 @@
+I have heard repeated reports on <http://mesh.openisp.ca/> that editing a page that has a waypoint in it will sometimes make that waypoint disappear from the main map. I have yet to understand why that happens or how, but multiple users have reported that.
+
+A workaround is to rebuild the whole wiki, although sometimes re-editing the same page will bring the waypoint back on the map.
+
+I have been able to reproduce this by simply creating a new node. It will not show up on the map until the wiki is rebuilt or the node is resaved. -- [[anarcat]]
index f7e115d48feb5d7cecc5204e2dbd1a744b9a8f7e..c031543c111d5ee0ec9c662379d50eef9eb57164 100644 (file)
@@ -14,3 +14,6 @@ Maybe just encode all &lt; and &gt; when compling pages within the templates fol
 
 > I never noticed this bug, since it only happens if the htmlscrubber is
 > disabled. --[[Joey]]
+
+>> My `templatebody` branch on [[template creation error]] fixes this.
+>> --[[smcv]]
index c6e3cd4fd3326c09c08e629ab795318e7cb1a67f..15d28f9893865855c5817ca4ab860acffdf3c341 100644 (file)
@@ -279,3 +279,11 @@ So, looking at your meta branch: --[[Joey]]
 >>>> for the po plugin, because I want to merge the po plugin soon.
 >>>> If #2 gets tackled later, we will certianly have all kinds of fun.
 >>>> no matter what is done for the po plugin. --[[Joey]] 
+
+>>>>> For the record: I've gotten used to the lack of this feature,
+>>>>> and it now seems much less important to me than it was when
+>>>>> initially developing the po plugin. So, I'm hereby officially
+>>>>> removing this from my plate. If anyone else wants to start from
+>>>>> scratch, or from my initial work, I'm happy to review the
+>>>>> po-related part of things -- just drop me an email in this
+>>>>> case. --[[intrigeri]]
diff --git a/doc/bugs/password_reset_fails_with___34__Wide_character_in_subroutine_entry__34__.mdwn b/doc/bugs/password_reset_fails_with___34__Wide_character_in_subroutine_entry__34__.mdwn
new file mode 100644 (file)
index 0000000..b9452a5
--- /dev/null
@@ -0,0 +1,29 @@
+Similar to [[bugs/syslog_fails_with_non-ASCII_wikinames]], this bug happens when the wiki name has non-ascii characters in the site name. In my case, it has the "CⒶTS" string.
+
+We get the following error in a password reset:
+
+    Error: Wide character in subroutine entry at /usr/share/perl5/Mail/Sendmail.pm line 308.
+
+Help! :) --[[anarcat]]
+
+> I assume this means Mail::Sendmail doesn't know how to send Unicode
+> strings, so any string passed to it (or any message body, or something?)
+> will need to be passed through `encode_utf8()`. It looks as though
+> Mail::Sendmail also defaults to
+>
+>     Content-Type: 'text/plain; charset="iso-8859-1"'
+>
+> so it'll need a `'Content-Type' => 'text/plain; charset="utf-8"'`
+> too.
+>
+> I'm disappointed to see how many of the library modules used by ikiwiki
+> are not Unicode-clean... but then again, Mail::Sendmail was last released
+> in 2003 so it's hardly surprising. I wonder whether [[!cpan Email::Sender]]
+> is any better?
+>
+> (If you know Python 2, the analogous situation would be "doesn't
+> know how to send unicode objects, so you have to get a str object
+> with `a_unicode_object.encode('utf-8')`".) --[[smcv]]
+
+>> Shameless plug: [[todo/passwordauth:_sendmail_interface]].  Though, I have
+>> no idea whether that is UTF-8-safe.  --[[tschwinge]]
index eba59a682e9c988dd37df7d231ca9acd05f6c96c..d672d1c046a835f8597053d00c453afa86223c5b 100644 (file)
@@ -20,3 +20,5 @@ enabled: inserting a html tag without closing it is enough.
 > will be releasing that soon. I will cherry-pick the fix into at least
 > my debian-stable branch too. I don't know if this is worth doing a whole
 > security advisory for. --[[Joey]]
+
+[[done]]
diff --git a/doc/bugs/poll_in_inline.mdwn b/doc/bugs/poll_in_inline.mdwn
new file mode 100644 (file)
index 0000000..61c1449
--- /dev/null
@@ -0,0 +1,6 @@
+When the poll directive appears in an inline, clicking on the button is
+supposed to vote and go to the page for that poll. Instead, I see it always
+apparantly skip counting my vote, and redirect to the page for that poll.
+--[[Joey]]
+
+> [[fixed|done]] --[[Joey]]
diff --git a/doc/bugs/possible_to_post_comments_that_will_not_be_displayed.mdwn b/doc/bugs/possible_to_post_comments_that_will_not_be_displayed.mdwn
new file mode 100644 (file)
index 0000000..83d662c
--- /dev/null
@@ -0,0 +1,34 @@
+[[!template id=gitbranch branch=smcv/ready/comments author="[[smcv]]"
+browse="http://git.pseudorandom.co.uk/smcv/ikiwiki.git/shortlog/refs/heads/ready/comments"]]
+[[!tag patch users/smcv/ready]]
+
+The ability to post comments depends on several factors:
+
+* `comments_pagespec` controls whether comments on a particular
+  page will be displayed
+* `comments_closed_pagespec` controls whether comments on
+  a particular page are allowed
+* the `check_canedit` call controls whether comments are allowed
+  for a particular combination of page and user
+
+If `check_canedit` says that a user can post a comment
+(in particular, if [[plugins/opendiscussion]] is enabled or
+[[plugins/lockedit]] is disabled or permissive),
+and `comments_closed_pagespec` does not contradict it,
+then users who construct a `do=comment` CGI URL manually
+can post comments that will not be displayed. I don't think
+this is a security flaw as such, which is why I'm not
+reporting it privately, but it violates least-astonishment.
+
+My `ready/comments` branch fixes this, by changing the test
+at submission time from (pseudocode)
+
+    !comments_closed_pagespec && check_canedit
+
+to
+
+    comments_pagespec && !comments_closed_pagespec && check_canedit
+
+--[[smcv]]
+
+> [[merged|done]] --[[smcv]]
diff --git a/doc/bugs/possibly_po_related_error.mdwn b/doc/bugs/possibly_po_related_error.mdwn
new file mode 100644 (file)
index 0000000..2a65ae6
--- /dev/null
@@ -0,0 +1,20 @@
+A site got stuck like this:
+
+<pre>
+/home/b-fusioninventory/public_html/documentation/index.es.html independently created, not overwriting with version from documentation.es
+</pre>
+
+I tried rebuilding it, and the rebuild failed like this:
+
+<pre>
+building recentchanges/change_ef4b9f92821335d96732c4b2c93ed96bc84c2f0d._change, which depends on templates/page.tmpl
+removing recentchanges/change_9ca1de878ea654566ce4a8a031d1ad8ed135ea1c/index.html, no longer built by recentchanges/change_9ca1de878ea654566ce4a8a031d1ad8ed135ea1c
+internal error: recentchanges/change_9ca1de878ea654566ce4a8a031d1ad8ed135ea1c._change cannot be found in /home/b-fusioninventory/source or underlay
+</pre>
+
+This internal error seems like the root cause of the original failure.
+ikiwiki crashed and did not record that it wrote the index.es.html file.
+
+Deleting the indexdb and rebuilding cleaned up the problem.
+
+This needs more investigation. --[[Joey]]
diff --git a/doc/bugs/preprocessing_loop_control_too_tight.mdwn b/doc/bugs/preprocessing_loop_control_too_tight.mdwn
new file mode 100644 (file)
index 0000000..7cf92af
--- /dev/null
@@ -0,0 +1,23 @@
+the preprocessing hook makes sure that no infinite loops occur by restricting the depth of nested directives to 3.
+
+this is insufficient in some situations in which sidebars are conditionally assembled from templates.
+
+given there are no limits on the number of directives per page and the number of edits a user can do in a particular time frame, i assume that raising that limit slightly won't make the DoS attacks that can be done against ikiwiki too much worse.
+
+i'd like to suggest 8 as a new value for recursion depth limit. most people can wrap their minds around a depth 3 nested directive setup, but when you reach a depth of 8, it's likely to be easier to write a dedicated plugin.
+
+<code><pre>
+diff --git a/IkiWiki.pm b/IkiWiki.pm
+index 75c9579..ad0f8b0 100644
+--- a/IkiWiki.pm
++++ b/IkiWiki.pm
+@@ -1487 +1487 @@ sub preprocess ($$$;$$) {
+-                       if ($preprocessing{$page}++ > 3) {
++                       if ($preprocessing{$page}++ > 8) {
+</pre></code>
+
+[[!tag patch]]
+
+> [[Seems reasonable|users/smcv/ready]] --smcv
+
+>> [[done]] --[[Joey]]
diff --git a/doc/bugs/proxy.py_utf8_troubles.mdwn b/doc/bugs/proxy.py_utf8_troubles.mdwn
new file mode 100644 (file)
index 0000000..7e8f70e
--- /dev/null
@@ -0,0 +1,35 @@
+when writing an external plugin using `proxy.py`, the getstate and setstate
+functions don't accept unicode data:
+
+    uncaught exception: 'ascii' codec can't encode character u'\xe4' in position 25: ordinal not in range(128)
+    Traceback (most recent call last):
+      File "proxy.py", line 309, in run
+        self._in_fd, self._out_fd)
+      File "proxy.py", line 192, in handle_rpc
+        ret = self._dispatcher.dispatch(method, params)
+      File "proxy.py", line 84, in dispatch
+        return self._dispatch(method, params)
+      File "/usr/lib/python2.7/SimpleXMLRPCServer.py", line 420, in _dispatch
+        return func(*params)
+      File "proxy.py", line 251, in hook_proxy
+        ret = function(self, *args)
+      File "/home/chrysn/git/ikiwiki-plugins//plugins/my_plugin", line 49, in data2html
+        proxy.setstate(kwargs['page'], 'meta', 'title', unicode_containing_umlauts)
+      File "proxy.py", line 291, in setstate
+        return self.rpc('setstate', page, id, key, value)
+      File "proxy.py", line 233, in rpc
+        *args, **kwargs)
+      File "proxy.py", line 178, in send_rpc
+        cmd, data))
+    UnicodeEncodeError: 'ascii' codec can't encode character u'\xe4' in position 25: ordinal not in range(128)
+
+the culprit is the last `_debug_fn` invocation in `send_rpc` (line 178), where
+unicode data is format-fed into a string. while this could be circumvented by
+making the formatting string a unicode string, that would cause trouble with
+python3 and we'd just move the problem to the stderr writing later on; instead,
+"`cmd, data))`" should become "`cmd, repr(data)))`" and everything is fine.
+debug output doesn't look that pretty any more, but is safe.
+
+--[[chrysn]]
+
+> ok, [[done]] --[[Joey]] 
diff --git a/doc/bugs/pythonproxy-utf8_again.mdwn b/doc/bugs/pythonproxy-utf8_again.mdwn
new file mode 100644 (file)
index 0000000..f068782
--- /dev/null
@@ -0,0 +1,70 @@
+[[!template  id=gitbranch branch=chrysn/more-proxy-utf8-fail author="[[chrysn]]"]]
+[[!template id=gitbranch author="[[chrysn]], [[smcv]]" branch=smcv/ready/more-proxy-utf8-fail
+  browse=http://git.pseudorandom.co.uk/smcv/ikiwiki.git/shortlog/refs/heads/ready/more-proxy-utf8-fail]]
+
+the recently introduced fixes for [[crashes in the python proxy even if disabled]]
+caused the typical python2 implicit conversion failures ("'ascii' codec
+can't...") on my debian sid system -- to fix it, i had to revert commit 154c4ea9e.
+
+i did not dig down all the way to the xml / xmlrpc modules, but my impression
+is that some module changed its behavior between stable and sid and now
+generates `unicode` strings instead of `str`.
+
+a [[patch]] to allow both versions by inspecting the types and en-/decoding on
+demand should work both for anarcat's and my case. i did not test the python3
+version, but i'm pretty sure it was already broken after the abovementioned
+patch.
+
+-- [[chrysn]]
+
+> update 2014-06-29: the problem persists, but i found it is not trivial to
+> reproduce. to demonstrate, use this test plugin:
+>
+>     #!/usr/bin/env python
+>     # -*- coding: utf-8 -*-
+>     
+>     from proxy import IkiWikiProcedureProxy
+>     
+>     def preprocess(self, proxy, *args):
+>         return repr(self.rpc('pagetype', 'schön'))
+>     
+>     proxy = IkiWikiProcedureProxy(__name__)
+>     proxy.hook('preprocess', preprocess, id='testdirective')
+>     proxy.run()
+>
+> note that when the 'schön' is stored in a variable, the exception changes --
+> it seems to me that the issue is related to the way exceptions are encoded.
+>
+> the suggested patch still applies and solves the issue. --[[chrysn]]
+
+>> In this patch band:
+>>
+>>     -        xml = _IkiWikiExtPluginXMLRPCHandler._read(in_fd).decode('utf8')
+>>     +        response = _IkiWikiExtPluginXMLRPCHandler._read(in_fd)
+>>     +        if isinstance(response, unicode):
+>>     +            xml = response.encode('utf8')
+>>
+>> I think you mean `response.decode`, not `response.encode`.
+>>
+>> Other than that it looks good to me. I like the use of `repr` in debug
+>> messages. --[[smcv]]
+
+>>> afaict, encode is fine there -- the relevant methods in python2 are
+>>> `unicode.encode` which gives a `str`, and `str.decode` which usually gives
+>>> a `unicode`. (i'd happily ditch python2 and port all plugins to python3,
+>>> where this is all easier, but my [[todo/vCard rendering]] still uses an
+>>> ancient module.) --[[chrysn]]
+
+>>>> You were right about this, `encode` is appropriate to go from `unicode`
+>>>> to `str` under Python 2. However, Python 3 is still broken.
+>>>>
+>>>> My `ready/more-proxy-utf8-fail` branch, based on yours,
+>>>> [[fixes the `rst` test when run under Python 3|bugs/rst_plugin_hangs_when_used_with_Python_3]]
+>>>> and hopefully also fixes this one. Please check that it still
+>>>> fixes your test-case too.
+>>>>
+>>>> Joey, I think this is [[ready for merge|users/smcv/ready]] even if it
+>>>> doesn't fix chrysn's bug - it does fix Python 3 support
+>>>> in general. --[[smcv]]
+
+>>>>> [[merged|done]] --[[smcv]]
diff --git a/doc/bugs/recentchanges_sets_has__95__diffurl__61__1_when_diffurl_is_empty.mdwn b/doc/bugs/recentchanges_sets_has__95__diffurl__61__1_when_diffurl_is_empty.mdwn
new file mode 100644 (file)
index 0000000..6c6e24b
--- /dev/null
@@ -0,0 +1,18 @@
+recentchanges.pm sets the template variable HAS_DIFFURL to 1 based solely on whether or not diffurl is defined. I found that diffurl was defined, but empty. The recentchanges template depends on this for recentchangesdiff to properly function -- diff toggling is dependent on HAS_DIFFURL evaluating to false. Adding a check for a non-zero length diffurl fixed the issue for me. A patch against ikiwiki-3.20121212 is as follows:
+
+    --- a/IkiWiki/Plugin/recentchanges.pm      2013-01-27 20:08:59.000000000 -0800
+    +++ b/IkiWiki/Plugin/recentchanges.pm      2013-01-27 20:08:30.000000000 -0800
+    @@ -181,7 +181,8 @@ sub store ($$$) {
+                       else {
+                               $_->{link} = pagetitle($_->{page});
+                       }
+    -                  if (defined $_->{diffurl}) {
+    +                  if (defined $_->{diffurl} &&
+    +                          length($_->{diffurl}) > 0) {
+                               $has_diffurl=1;
+                       }
+     
+
+(There should be one more line at the bottom with a single space on it...)
+
+> [[applied|done]] --[[Joey]]
diff --git a/doc/bugs/redirect.mdwn b/doc/bugs/redirect.mdwn
new file mode 100644 (file)
index 0000000..87f6a67
--- /dev/null
@@ -0,0 +1,53 @@
+I suppose this isn't technically a bug, but whetever.
+
+I want symbolic links to be rendered as HTTP redirects. For example,
+if we do this,
+
+    touch foo.mkdwn
+    ln -s foo.mkdwn bar.mkdwn
+    git push baz.branchable.com
+
+then the following command should print 302
+
+    curl -o /dev/null -s -w "%{http_code}" http://baz.thomaslevine.com/bar/
+
+> An interesting idea, but it conflicts somewhat with wanting symlinks to be
+> treated as the referenced file when it's safe to do so, which would be
+> great for [[todo/git-annex support]], and also good to avoid duplication
+> for files in system-wide underlays.
+>
+> Also, I don't think this is possible without help from the web server
+> configuration: for instance, under Apache, I believe the only way to get
+> an HTTP 302 redirect is via Apache-specific `.htaccess` files or
+> system-level Apache configuration.
+>
+> In current ikiwiki, you can get a broadly similar effect by either
+> using \[[!meta redir=foo]] (which does a HTML `<meta>` redirect)
+> or reconfiguring the web server. --[[smcv]]
+
+>> The CGI spec (http://www.ietf.org/rfc/rfc3875) says that a CGI can cause a redirect by returning a Location: header.
+>> So it's possible; desirable (due to your point about conflicting with git-annex support) is a different matter.
+
+>>> One of the major things that separates ikiwiki from other wiki software
+>>> is that ikiwiki is a wiki compiler: ordinary page-views are purely
+>>> static HTML, and the CGI only gets involved when you do something
+>>> that really has to be dynamic (like an edit).
+>>>
+>>> However, there is no server-independent static content that ikiwiki
+>>> could write out to the destdir that would result in that redirect.
+>>>
+>>> If you're OK with requiring the [[plugins/404]] plugin (and a
+>>> web server where it works, which I think still means Apache) then
+>>> it would be possible to write a plugin that detected symlinks,
+>>> stored them in the `%wikistate`, and used them to make the
+>>> [[plugins/404]] plugin (or its own hook similar to the one
+>>> in that plugin) do a 302 redirect instead of a 404.
+>>> Similarly, a plugin that assumed a suitable Apache
+>>> configuration with fairly broad `AllowOverrides`,
+>>> and wrote out `.htaccess` files, would be a feasible thing
+>>> for someone to write.
+>>>
+>>> I don't think this is a bug; I think it's a request for a
+>>> feature that not everyone will want. The solution to those
+>>> is for someone who wants the feature to
+>>> [[write a plugin|plugins/write]]. --[[smcv]]
index 2667a2b8318cfdecddafb4caa9d1b1efd1913737..6d0caf42eeca6592fe4994f6e103e4d3bcbcd5c9 100644 (file)
@@ -25,3 +25,54 @@ pages, until this is fixed.  --[[Joey]]
 >>>> to affect by web edits. The `-f` check seems rather redundant,
 >>>> surely if it's in `%pagesources` ikiwiki has already verified it's
 >>>> safe. --[[Joey]] 
+
+----
+
+[[!template id=gitbranch branch=smcv/ready/transient-rm author="[[Simon McVittie|smcv]]"]]
+
+Here's a branch. It special-cases the `$transientdir`, but in such a way
+that the special case could easily be extended to other locations where
+deletion should be allowed.
+
+It also changes `IkiWiki::prune()` to optionally stop pruning empty
+parent directories at the point where you'd expect it to (for instance,
+previously it would remove the `$transientdir` itself, if it turns out
+to be empty), and updates callers.
+
+The new `prune` API looks like this:
+
+    IkiWiki::prune("$config{srcdir}/$file", $config{srcdir});
+
+with the second argument optional. I wonder whether it ought to look
+more like `writefile`:
+
+    IkiWiki::prune($config{srcdir}, $file);
+
+although that would be either an incompatible change to internal API
+(forcing all callers to update to 2-argument), or being a bit
+inconsistent between the one-and two-argument forms. Thoughts?
+
+--[[smcv]]
+
+> I've applied the branch as-is, so this bug is [[done]].
+> `prune` is not an exported API so changing it would be ok.. 
+> I think required 2-argument would be better, but have not checked
+> all the call sites to see if the `$file` is available split out
+> as that would need. --[[Joey]] 
+
+[[!template id=gitbranch branch=smcv/ready/prune author="[[Simon McVittie|smcv]]"]]
+
+>> Try this, then? I had to make some changes to `attachment`
+>> to make the split versions available. I suggest reviewing
+>> patch-by-patch.
+
+>>> Branch updated; I'd missed a use of prune in ikiwiki.in itself.
+>>> Unfortunately, this means it does still need to support the
+>>> "undefined top directory" case: there isn't an obvious top
+>>> directory for wrappers. --[[smcv]]
+
+>> I also tried to fix a related bug which I found while testing it:
+>> the special case for renaming held attachments didn't seem to work.
+>> (`smcv/wip/rename-held`.) Unfortunately, it seems that with that
+>> change, the held attachment is committed to the `srcdir` when you
+>> rename it, which doesn't seem to be the intention either? --[[smcv]]
diff --git a/doc/bugs/renaming_a_page_destroyed_some_links.mdwn b/doc/bugs/renaming_a_page_destroyed_some_links.mdwn
new file mode 100644 (file)
index 0000000..fd7a80b
--- /dev/null
@@ -0,0 +1,12 @@
+When renaming a page here, ikiwiki destroyed unrelated links from unrelated pages. You can see the effect [here](http://mesh.openisp.ca/recentchanges/#diff-dc8dfa96efd3a4d649f571c3aa776f20b3ce0131), or by checking out the git tree (`git://mesh.openisp.ca/
+`) and looking at commit `dc8dfa96efd3a4d649f571c3aa776f20b3ce0131`.
+
+The renamed page was `configuration/bat-hosts` to `configuration/batman/bat-hosts` and the deleted links were ``\[[AUR | https://aur.archlinux.org/]]` and `\[[CHANGELOG|http://svn.dd-wrt.com:8000/browser/src/router/batman-adv/CHANGELOG]]`. --[[anarcat]]
+
+> <del>Nevermind that, that commit was unrelated to the rename and probably an operator error.</del> - No, actually, I just reproduced this again - see [another example](http://mesh.openisp.ca/recentchanges/#diff-d67dc2f0fdc149b13122fd6cba887a01c693e949).
+
+>> Looks like these all involve the wacky wikilink form that includes an
+>> external url in the link. Fixed rename code to know about those.
+>> [[done]] --[[Joey]]
+
+>>> Phew!!! Thanks a *lot* for that one, it was really annoying! :) --[[anarcat]]
diff --git a/doc/bugs/rst_plugin_fails_with___34__uncaught_exception:___39__ascii__39___codec_can__39__t_encode_character__34__.mdwn b/doc/bugs/rst_plugin_fails_with___34__uncaught_exception:___39__ascii__39___codec_can__39__t_encode_character__34__.mdwn
new file mode 100644 (file)
index 0000000..1893e70
--- /dev/null
@@ -0,0 +1,40 @@
+ I get this error when enabling the `rst` plugin. I am running IkiWiki
+3.20130904.1ubuntu1 on Ubuntu 14.04 in a non-English UTF-8 locale; the
+pages can also contain characters in UTF-8 encoding.
+
+    uncaught exception: 'ascii' codec can't encode character u'\xa9' in position 13: ordinal not in range(128)
+    Traceback (most recent call last):
+      File "/usr/lib/ikiwiki/plugins/proxy.py", line 309, in run
+        self._in_fd, self._out_fd)
+      File "/usr/lib/ikiwiki/plugins/proxy.py", line 192, in handle_rpc
+        ret = self._dispatcher.dispatch(method, params)
+      File "/usr/lib/ikiwiki/plugins/proxy.py", line 84, in dispatch
+        return self._dispatch(method, params)
+      File "/usr/lib/python2.7/SimpleXMLRPCServer.py", line 420, in _dispatch
+        return func(*params)
+      File "/usr/lib/ikiwiki/plugins/proxy.py", line 253, in hook_proxy
+        "{0} hook `{1}' returned: [{2}]".format(type, name, ret))
+    UnicodeEncodeError: 'ascii' codec can't encode character u'\xa9' in position 13: ordinal not in range(128)
+
+    Traceback (most recent call last):
+      File "/usr/lib/ikiwiki/plugins/rst", line 86, in <module>
+        proxy.run()
+      File "/usr/lib/ikiwiki/plugins/proxy.py", line 317, in run
+        self.error('uncaught exception: {0}\n{1}'.format(e, tb))
+      File "/usr/lib/ikiwiki/plugins/proxy.py", line 298, in error
+        self.rpc('error', msg)
+      File "/usr/lib/ikiwiki/plugins/proxy.py", line 233, in rpc
+        *args, **kwargs)
+      File "/usr/lib/ikiwiki/plugins/proxy.py", line 173, in send_rpc
+        raise GoingDown()
+    proxy.py.GoingDown
+
+A fix is akin to the one for
+<http://ikiwiki.info/bugs/proxy.py_utf8_troubles/>: change
+`...format(type, name, ret)` in `proxy.py` line 253 to `format(type,
+name, repr(ret))` (which should not hurt since it's a message
+for debugging purposes only).
+
+
+> this is [[fixed|done]] in commit [154c4ea9](http://source.ikiwiki.branchable.com/?p=source.git;a=commit;h=154c4ea9e65d033756330a7f8c5c0fa285380bf0)
+>  (november 2013), which is included in 3.20140227. --[[chrysn]]
diff --git a/doc/bugs/rst_plugin_hangs_when_used_with_Python_3.mdwn b/doc/bugs/rst_plugin_hangs_when_used_with_Python_3.mdwn
new file mode 100644 (file)
index 0000000..ca0738a
--- /dev/null
@@ -0,0 +1,35 @@
+During ikiwiki make phase the rst process hangs:  
+[ps output](http://dpaste.com/21TQQKT)  
+[gdb backtrace 1](http://dpaste.com/0VQBW6D)   
+[gdb backtrace 1](http://dpaste.com/1VHS88Y)  
+  
+working with python 2.7  
+[http://dpaste.com/0985A91](http://dpaste.com/0985A91)  
+not working with python3.3~3.4  
+[http://dpaste.com/0ACNK3W](http://dpaste.com/0ACNK3W)  
+  
+> Retitled this bug report since it seems to be specific to Python 3.
+>
+> The `rst` plugin is probably more commonly used with Python 2.
+> It seems likely that there is some Python-3-specific bug in `proxy.py`,
+> perhaps introduced by [commit 154c4ea
+ "properly encode and decode from/to utf8 when sending rpc to ikiwiki"](
+http://source.ikiwiki.branchable.com/?p=source.git;a=commitdiff;h=154c4ea9e65d033756330a7f8c5c0fa285380bf0).
+>
+> I can reproduce this on Debian by installing `python3-docutils`
+> and changing the first line of `plugins/proxy.py`, the first
+> line of `plugins/pythondemo`, the first line of `plugins/rst`
+> and the `system()` call in `t/rst.t` to use `python3` instead
+> of `python`. --[[smcv]]
+
+looks like the problem is in proxy.py  
+ml = _IkiWikiExtPluginXMLRPCHandler._read(in_fd).decode('utf8')  
+
+without decode('utf8') is working
+
+> That call was introduced
+> [[to fix a bug under Python 2|bugs/crashes_in_the_python_proxy_even_if_disabled]]
+> so it cannot just be removed, but I've put a proposed branch on
+> [[this related bug|bugs/pythonproxy-utf8_again]]. [[!tag patch]] --smcv
+
+tested and fixed with patch [http://git.pseudorandom.co.uk/smcv/ikiwiki.git/commitdiff/38bd51bc1bab0cabd97dfe3cb598220a2c02550a](http://git.pseudorandom.co.uk/smcv/ikiwiki.git/commitdiff/38bd51bc1bab0cabd97dfe3cb598220a2c02550a) and patch [http://git.pseudorandom.co.uk/smcv/ikiwiki.git/commitdiff/81506fae8a6d5360f6d830b0e07190e60a7efd1c](http://git.pseudorandom.co.uk/smcv/ikiwiki.git/commitdiff/81506fae8a6d5360f6d830b0e07190e60a7efd1c)
index 5509efefe872fc054f6c76a339e8f0d76d7c21b1..3bc430f68039e6b0d5cd07a02cd72bdf66873742 100644 (file)
@@ -8,3 +8,7 @@ I found that Debian stable is currently shipping 1.2.3, and on a hunch, I built
 
 > Debian has 1.2.7 now, and I have it installed and searching is working
 > fine with it. --[[Joey]]
+
+> I have this same issue. I tried xapian version 1.2.5. 1.2.8, 1.2.13. I will try and see if installing 1.2.3 fixes this issue. --[[Ramsey]]
+
+> 1.2.3 didn't fix the issue either --[[Ramsey]]
diff --git a/doc/bugs/sidebar_not_updated_in_unedited_subpages.mdwn b/doc/bugs/sidebar_not_updated_in_unedited_subpages.mdwn
new file mode 100644 (file)
index 0000000..c3e0ee1
--- /dev/null
@@ -0,0 +1,9 @@
+I turned on the sidebar plugin, with global_sidebars on (in the web setup page), created a sidebar page in the root, and edited the sidebar a few times.
+
+I then noticed that all pages on the root had been updated with a sidebar, but no subpages (i.e. a/b). Only after editing a subpage did it get a sidebar. Editing sidebar itself only updated subpages with sidebars, the other subpages had not been refreshed (proven by their unchanged filesystem date)  
+
+After calling ikiwiki --setup on the command line all pages were updated. So this seems to be a difference between web-started --setup and command-line --setup. Or it just doesn't work the first time --setup is called after sidebars are enabled.
+
+
+
+
diff --git a/doc/bugs/structured_config_data_is_mangled.mdwn b/doc/bugs/structured_config_data_is_mangled.mdwn
new file mode 100644 (file)
index 0000000..869d48e
--- /dev/null
@@ -0,0 +1,61 @@
+Put something like this in the setup file:
+
+~~~
+conversion:
+  - from: odt
+    to: pdf
+    command: [unoconv, -f, pdf, -o, $OUTPUTDIR, $INPUTFILE]
+  - from: ditaa
+    to: png
+    command: [ditaa, $INPUTFILE, $OUTPUTFILE, -s, 0.7]
+~~~
+
+However `Dumper($config{conversion})` shows:
+
+~~~
+$VAR1 = [
+          'HASH(0x164e1a0)',
+          'HASH(0x164e3c8)'
+        ];
+~~~
+
+I think it is getting mangled in `sub merge` in `IkiWiki/Setup.pm` and its calls to `possibly_foolish_untaint`
+
+Workaround: force the array values to be strings, and then re-parse them using YAML::XS::Load:
+
+~~~
+conversion:
+  - |
+    from: [odt, odp]
+    to: pdf
+    command: [unoconv, -f, pdf, -o, $OUTPUTDIR, $INPUTFILE]
+  - |
+    from: ditaa
+    to: png
+    command: [ditaa, $INPUTFILE, $OUTPUTFILE, -s, 0.7]
+
+...
+
+sub checkconfig {
+    if (!defined $config{conversion} || ref $config{conversion} ne "ARRAY") {
+        error(sprintf(gettext("Must specify '%s' and it must be a list"), "conversion"));
+    }
+    for (my $i=0; $i < @{$config{conversion}}; $i++) {
+      $config{conversion}->[$i] = YAML::XS::Load($config{conversion}->[$i]) if
+          ref $config{conversion}->[$i] ne 'HASH';
+    }
+}
+~~~
+
+> `getsetup` defines config options to be one of: boolean, string, integer,
+> pagespec, "internal" (non-user-visible string), ref to an array of one of
+> those scalar types, or ref to a hash { string => one of those scalar types }.
+> IkiWiki::Setup also appears to support regexps (qr//), although that's
+> not documented (presumably they're treated the same as strings).
+> 
+> Supporting arbitrary arrays/hashes as values would require some way to
+> untaint the values recursively.
+>
+> Complex config data also can't be used with the [[plugins/websetup]]
+> plugin, which currently supports everything that IkiWiki::Setup does,
+> except for hashes. --[[smcv]]
diff --git a/doc/bugs/svg_and_pdf_conversion_fails.mdwn b/doc/bugs/svg_and_pdf_conversion_fails.mdwn
new file mode 100644 (file)
index 0000000..ac18fe8
--- /dev/null
@@ -0,0 +1,58 @@
+[[!template  id=gitbranch branch=chrysn/imgforpdf author="[[chrysn]]"]]
+
+when using the [[img plugin|plugins/img]] with an svg file, it is supposed to
+convert it into a png for display in all browsers, and because the typical use
+case is rendering small preview versions.
+
+this currently doesn't work (at least with graphicsmagick-libmagick-dev-compat
+1.3.18-1) due to the sequence imagemagick options are set, needs an extension
+to work for pdfs (or any other imagemagick compatibile file) too, and should
+have an additional parameter for page selection.
+
+i've provided a series of [[!taglink patch]]es in the chrysn/imgforpdf [[git]]
+branch.
+
+i'd prefer to go a step further, and not only convert pdf and svg files to png,
+but everything (with the possible exception of jpg files), as most other image
+formats can't be displayed in a browser anyway -- but i didn't in this patch
+series, as it would alter the file names of existing images, i don't know if
+that needs special care or breaks something i don't use; this way, my patches
+should be safe for inclusion.
+
+--[[chrysn]]
+
+> update 2014-06-29: the patch still applies and fixes the issue. in the
+> meantime, i noticed that the desired effect doesn't happen when no explicit
+> size is set. as scalable graphics don't necessarily have a natural size
+> anyway, i don't consider that a showstopper. --[[chrysn]]
+
+>> This all looks good in principle, but I would like to do a more detailed
+>> review, and test it with "real ImageMagick" in case its behaviour differs
+>> from GraphicsMagick.
+>>
+>> An automated regression test for the desired behaviour in `t/` would
+>> be great. There are SVGs and PNGs in the docwiki already; there are no
+>> JPEGs or PDFs, but perhaps you could add a trivially small example
+>> of each to `t/`? Imitating `t/tag.t` or `t/trail.t`, and skipping the
+>> test if the required modules are missing like `t/podcast.t` does,
+>> seems like it would work best.
+>>
+>> I agree that everything not in an interoperable web format should be
+>> converted to PNG when it's scaled down, but yes, that's more likely
+>> to be a breaking change, so it seems best to do that as a separate
+>> branch. In practice I think this means JPEG -> JPEG and everything
+>> else -> PNG, since JPEG is commonly used for photos and photo-like
+>> images that don't compress well under lossless compression. --[[smcv]]
+
+>>> i've added a unit test and tested it with the [[!debsid perlmagick]]
+>>> package, the [[!debsid graphicsmagick-libmagick-dev-compat]] package and
+>>> the experimental [[!debpts libimage-magick-perl]] package (where the
+>>> [[!debpts libmagickcore-6.q16-2-extra]] package is required too), in the
+>>> meantime filing [[!debbug 753770]]. (why is it that it sometime seems i
+>>> find more bugs in ikiwiki's dependencies than in itself when working with
+>>> it?)
+>>>
+>>> the unit test also checks for file removal when it is not created any more,
+>>> which works, so my biggest fear about the all-to-png change is unwarranted.
+>>> i'll have a look at that some time, but i think as things are, this is
+>>> ready now, please review again. --[[chrysn]]
diff --git a/doc/bugs/syslog_fails_with_non-ASCII_wikinames.mdwn b/doc/bugs/syslog_fails_with_non-ASCII_wikinames.mdwn
new file mode 100644 (file)
index 0000000..0d40d23
--- /dev/null
@@ -0,0 +1,32 @@
+[[!template  id=gitbranch branch=anarcat/dev/syslog_utf8 author="[[anarcat]]"]]
+
+[[this feature|todo/syslog_should_show_wiki_name]] made it so syslog doesn't work anymore if the site being logged has non-ASCII characters it in.
+
+Specifically, my wiki was named "CⒶTS", and nothing was showing up in syslog. When I changed that to "C@TS", it worked again.
+
+My guess is this sits somewhere here:
+
+[[!format perl """
+               return eval {
+                       Sys::Syslog::syslog($type, "[$config{wikiname}] %s", join(" ", @_));
+               };
+"""]]
+
+Yet I am not sure how to fix that kind of problem in Perl... --[[anarcat]]
+
+> If I remove the "eval" above, I get:
+> 
+>     Error: Wide character in syswrite at /usr/lib/perl/5.14/Sys/Syslog.pm line 485.
+> 
+> I have improved a little the error handling in log_message() so that we see *something* when syslog fails, see the branch documented above. I can also confirm that  reverting [[todo/syslog_should_show_wiki_name]] fixes the bug. Finally, I have a unit test that reproduces the problem in git, and a working patch for the bug, again in git.
+> 
+> > One last note: I noticed that this problem also happens elsewhere in ikiwiki. For example, the [[plugins/notifyemail]] plugin will silently fail to send notifications if the pages contain unicode. The [[plugins/notifychanges]] plugin I am working on (in [[todo/option to send only the diff in notifyemail]]) seems to be working around the issue so far, but there's no telling which similar problem are out there.
+
+>> I'd merge it. --[[smcv]]
+
+>>> I've merged it, but I don't feel it fixes this bug. --[[Joey]]
+
+>>>> (I removed the patch tag to take it off the patches list.)
+>>>>
+>>>> What else is needed? Systematic classification of outputs into
+>>>> those that do and don't cope with Unicode? --[[smcv]]
diff --git a/doc/bugs/template__95__syntax_test_is_incomplete.mdwn b/doc/bugs/template__95__syntax_test_is_incomplete.mdwn
new file mode 100644 (file)
index 0000000..d50b727
--- /dev/null
@@ -0,0 +1,10 @@
+[[!template id=gitbranch branch=smcv/ready/template-syntax-test
+  browse="http://git.pseudorandom.co.uk/smcv/ikiwiki.git/shortlog/refs/heads/ready/template-syntax-test"
+  author="[[smcv]]"]]
+[[!tag patch]]
+
+`t/template_syntax.t` looks as though it's meant to check the syntax of
+`doc/templates/*.mdwn` as well as `templates/*.tmpl`, but it doesn't.
+Patch in my git repository. --[[smcv]]
+
+> [[merged|done]] --[[Joey]]
diff --git a/doc/bugs/template_creation_error.mdwn b/doc/bugs/template_creation_error.mdwn
new file mode 100644 (file)
index 0000000..d1fb788
--- /dev/null
@@ -0,0 +1,270 @@
+Hi,
+I am trying to build a template. The compilation of this template results in a weird exception. I have isolated the cause of the exception to the following point:
+
+If i have this in the template code:
+
+\[[!inline<br/>
+pages="\<TMPL_VAR SEL_PAGES\>"<br/>
+template=extract-entry<br/>
+\]]<br/>
+
+There is no problem at all. I can use the template with the desired result. But if I try to use this (just adding the "show" parameter):
+
+\[[!inline <br/>
+pages="\<TMPL_VAR SEL_PAGES>"<br/>
+template=extract-entry<br/>
+show=\<TMPL_VAR CNTPG><br/>
+\]]<br/>
+
+I get this exception on the Git bash console:
+
+<pre>
+$ git push
+Counting objects: 7, done.
+Delta compression using up to 8 threads.
+Compressing objects: 100% (4/4), done.
+Writing objects: 100% (4/4), 410 bytes, done.
+Total 4 (delta 3), reused 0 (delta 0)
+remote: From /home/b-odelama-com/source
+remote:    eb1421e..5e1bac5  master     -> origin/master
+remote: Argument "\x{3c}\x{54}..." isn't numeric in numeric lt (<) at /usr/share/perl5/IkiWiki/Plugin/inline.pm line 231.
+remote: Argument "\x{3c}\x{54}..." isn't numeric in numeric lt (<) at /usr/share/perl5/IkiWiki/Plugin/inline.pm line 231.
+To ssh://b-odelama-com@odelama-com.branchable.com/
+   eb1421e..5e1bac5  master -> master
+</pre>
+
+Please, let me know what to do to avoid this kind of error.
+
+> When you add a template page `templates/foo.mdwn` for use
+> the [[ikiwiki/directive/template]] directive, two things happen:
+>
+> 1. `\[[!template id=foo ...]]` becomes available;
+> 2. a wiki page `templates/foo` is built, resulting in a HTML file,
+>    typically `templates/foo/index.html`
+>
+> The warnings you're seeing are the second of these: when ikiwiki
+> tries to process `templates/foo.mdwn` as an ordinary page, without
+> interpreting the `<TMPL_VAR>` directives, `inline` receives invalid
+> input.
+>
+> This is a bit of a design flaw in [[plugins/template]] and
+> [[plugins/edittemplate]], I think - ideally it would be possible to
+> avoid parts of the page being interpreted when the page is being
+> rendered normally rather than being used as a template.
+>
+> There *is* a trick to avoid parts of the page being interpreted when
+> the page is being used as a template, while having them appear
+> when it's rendered as a page:
+>
+>     <TMPL_IF FALSE>
+>     <!-- This part only appears when being used as a page.
+>          It assumes that you never set FALSE to a true value :-) -->
+>     \[[!meta robots="noindex,nofollow"]]
+>     This template is used to describe a thing. Parameters:
+>     * name: the name of the thing
+>     * size: the size of the thing
+>     </TMPL_IF>
+>
+>     The thing is called <TMPL_VAR name> and its size is <TMPL_VAR size>
+>
+> I suppose you could maybe extend that to something like this:
+>
+>     <TMPL_IF FALSE>
+>     <!-- This part only appears when being used as a page.
+>          It assumes that you never set FALSE to a true value :-) -->
+>     \[[!meta robots="noindex,nofollow"]]
+>     This template is used to describe a thing. Parameters:
+>     * name: the name of the thing
+>     * size: the size of the thing
+>     </TMPL_IF>
+>
+>     <TMPL_IF FALSE>
+>     \[[!if test="included() and !included()" then="""
+>     </TMPL_IF>
+>     <!-- This part only appears when being used as a template. It also
+>          assumes that you never set FALSE to a true value, and it
+>          relies on the [[ikiwiki/pagespec]] "included() and !included()"
+>          never being true. -->
+>     The thing is called <TMPL_VAR name> and its size is <TMPL_VAR size>
+>     <TMPL_IF FALSE>
+>     """]]
+>     </TMPL_IF>
+>
+> but that's far harder than it ought to be!
+>
+> Perhaps the right solution would be to change how the template plugin
+> works, so that templates are expected to contain a new `definetemplate`
+> directive:
+>
+>     This template is used to describe a thing. Parameters:
+>     * name: the name of the thing
+>     * size: the size of the thing
+>     
+>     \[[!definetemplate """
+>     The thing is called <TMPL_VAR name> and its size is <TMPL_VAR size>
+>     """]]
+>
+> with templates not containing a `\[[!definetemplate]]` being treated
+> as if the whole text of the page was copied into a `\[[!definetemplate]]`,
+> for backwards compatibility?
+>
+> --[[smcv]]
+
+>> OK, here is a branch implementing what I said. It adds the `definetemplate`
+>> directive to [[plugins/goodstuff]] as its last commit.
+>>
+>> Templates with the current strange semantics will still work, until
+>> IkiWiki breaks compatibility.
+>>
+>> Possible controversies:
+>>
+>> * Should the `definetemplate` plugin be core, or in goodstuff, or neither?
+>>
+>> * Should \[[!definetemplate]] be allowed on any page (with the implementation
+>>   of `template("foo")` looking for a `definetemplate` in `templates/foo`,
+>>   then a `definetemplate` in `foo`, then fall back to the current logic)?
+>>   If not, should \[[!definetemplate]] raise an error when used on a page not
+>>   in `templates/`, since it will have no practical effect there?
+>>
+>> * Is it OK to rely on `definetemplate` being enabled in the basewiki's
+>>   templates?
+>>
+>> * Should the "use definetemplate" wording in the documentation of
+>>   template and edittemplate be stronger? Should those plugins automatically
+>>   load definetemplate?
+>>
+>> --[[smcv]]
+
+>>> this looks like a good idea to me.
+>>>
+>>> * i'd put it in core, and add a transition for the time compatibility gets
+>>>   broken, provided the transitioning system will be used in that. templates
+>>>   can't be expected to just work as markdown+ikiwiki too.
+>>>
+>>>   (it being in core would also solve my qualms about `section => "web"` /
+>>>   `\[[!tag type/web]]`).
+>>>
+>>> * if definetemplate gets deemed core, no "use definetemplate!" notes on the
+>>>   template/edittemplate pages will be required any more.
+>>>
+>>> * first i was sceptical of the approach of re-running scan to make sure the
+>>>   `my %templates` is filled, but it is indeed a practical solution.
+>>>
+>>> * the name "`definetemplate`" gives me the first impression that something
+>>>   is assigned (as in `#define`), but actually it highlights a region in the
+>>>   file. wouldn't "`templatebody`" be a better description of the meaning of
+>>>   the directive?
+>>>
+>>> --[[chrysn]]
+
+>>>> Thanks for your feedback!
+>>>> Looking at its description on this wiki, I agree that `type/web` doesn't
+>>>> fit, and core does seem better. I like your `templatebody` suggestion,
+>>>> too, particularly if templates remain restricted to `/templates`.
+>>>> I'll try to come up with better wording for the documentation to say
+>>>> "use `templatebody`, like this", with a note about backwards
+>>>> compatibility later.
+>>>>
+>>>> Rationale for `my %templates`: yes it does seem a bit odd, but
+>>>> if I used `$pagestate{$tpage}{template}` instead of a `my` variable,
+>>>> I'd sometimes _still_ have to force a `scan`, because
+>>>> [[plugins/template]] has to expand the template at scan time so that
+>>>> it can contain links etc. - so I have to make sure that if the
+>>>> template has changed, it has already been scanned (scanning happens
+>>>> in random order, so that can't be guaranteed). This means there's
+>>>> no benefit in reading it back from the index, so it might as well
+>>>> just be in-memory.
+>>>>
+>>>> I suppose an alternative way to do it would be to remember what was
+>>>> passed to `needsbuild`, and only force a `scan` for templates that
+>>>> were in that list - which potentially reduces CPU time and I/O a
+>>>> little, in exchange for a bigger index. I could do that if Joey
+>>>> wants me to, but I think the current approach is simpler,
+>>>> so I'll stick with the current approach if it isn't vetoed.
+>>>> --[[smcv]]
+
+>>>>> @name: even outside `/templates`, `\[[!templatebody]]` would be
+>>>>> interpreted as "when this page is used as a template, this is what its
+>>>>> contents should be", and be suitable.
+>>>>>
+>>>>> @`%templates`: my surprise wasn't to it not being in `%pagestate`, but
+>>>>> rather that the `scan` function was used for it at all, rather than plain
+>>>>> directive parsing that ignores everything else -- but i agree that it's
+>>>>> the right thing to do in this situation.
+>>>>>
+>>>>> --[[chrysn]]
+
+----
+
+[[!template id=gitbranch author="[[smcv]]" branch=smcv/ready/templatebody
+  browse=http://git.pseudorandom.co.uk/smcv/ikiwiki.git/shortlog/refs/heads/ready/templatebody]]
+[[!tag patch users/smcv/ready]]
+Branch and directive renamed to `ready/templatebody` as chrysn suggested.
+It's on-by-default now (or will be if that branch is merged).
+Joey, any chance you could review this?
+
+There is one known buglet: `template_syntax.t` asserts that the entire
+file is a valid HTML::Template, whereas it would ideally be doing the
+same logic as IkiWiki itself. I don't think that's serious. --[[smcv]]
+
+> Looking over this, I notice it adds a hash containing all scanned
+> files. This seems to me to be potentially a scalability problem on
+> rebuild of a site with many pages. Ikiwiki already keeps a lot
+> of info in memory, and this adds to it, for what is a fairly
+> minor reason. It seems to me there should be a way to avoid this. --[[Joey]] 
+
+>> Maybe. Are plugins expected to cope with scanning the same
+>> page more than once? If so, it's just a tradeoff between
+>> "spend more time scanning the template repeatedly" and
+>> "spend more memory on avoiding it", and it would be OK to
+>> omit that, or reduce it to a set of scanned *templates*
+>> (in practice that would mean scanning each template twice
+>> in a rebuild). --s
+>>> [Commit f7303db5](http://source.ikiwiki.branchable.com/?p=source.git;a=commitdiff;h=f7303db5)
+>>> suggests that scanning the same page more than once is problematic,
+>>> so that solution is probably not going to work.
+>>>
+>>> The best idea I've come up with so far is to track whether
+>>> we're in the scan or render phase. If we're in the scan
+>>> phase, I think we do need to keep track of which pages
+>>> we've scanned, so we don't do them again? (Or perhaps that's
+>>> unnecessary - commit f7303db5 removed a scan call that's in
+>>> the render phase.) If we're in the render phase, we can assume
+>>> that all changed pages have been scanned already, so we can
+>>> drop the contents of `%scanned` and rely on a single boolean
+>>> flag instead.
+>>>
+>>> `%scanned` is likely to be no larger than `%rendered`, which
+>>> we already track, and whose useful lifetime does not overlap
+>>> with `%scanned` now. I was tempted to merge them both and call
+>>> the result `%done_in_this_phase`, but that would lead to really
+>>> confusing situations if a bug led to `render` being called sooner
+>>> than it ought to be.
+>>>
+>>> My ulterior motive here is that I would like to formalize
+>>> the existence of different phases of wiki processing - at the
+>>> moment there are at least two phases, namely "it's too soon to
+>>> match pagespecs reliably" and "everything has been scanned,
+>>> you may use pagespecs now", but those phases don't have names,
+>>> so [[plugins/write]] doesn't describe them.
+>>>
+>>> I'm also considering adding warnings
+>>> if people try to match a pagespec before scanning has finished,
+>>> which can't possibly guarantee the right result, as discussed in
+>>> [[conditional_preprocess_during_scan]]. My `wip-too-soon` branch
+>>> is a start towards that; the docwiki builds successfully, but
+>>> the tests that use IkiWiki internals also need updating to
+>>> set `$phase = PHASE_RENDER` before they start preprocessing. --s
+
+>>>> reviewing those modifications, i think this is a good way to go. along
+>>>> with warning about pagespecs evaluated in scan phase, i think it should be
+>>>> an error to invoke scan in the render phase; that would mean that
+>>>> `readtemplate` needs to check whether it's invoked as a scan or not to
+>>>> decide whether to scan the template page, but would be generally more
+>>>> robust for future plugin writing.
+>>>>
+>>>> **addendum**: if the new phase state is used to create warnings/errors
+>>>> about improper ikiwiki api use of plugins (which is something i'd
+>>>> advocate), that should likewise warn if `add_link` actually adds a link in
+>>>> the render phase.  such a warning would have helped spotting the
+>>>> link-related [[template evaluation oddities]] earlier. --[[chrysn]]
diff --git a/doc/bugs/template_evaluation_oddities.mdwn b/doc/bugs/template_evaluation_oddities.mdwn
new file mode 100644 (file)
index 0000000..06ef573
--- /dev/null
@@ -0,0 +1,67 @@
+[[ikiwiki/directive/template]]s expose odd behavior when it comes to composing
+links and directives:
+
+* the parameters are passed through the preprocessor twice, once on
+  per-parameter basis and once for the final result (which usually contains the
+  preprocessed parameters).
+
+  one of the results it that you have to write:
+
+      \[[!template id="infobox" body="""
+          Just use the \\\[[!template]] directive!
+      """]]
+
+  (that'd be three backslashes in front of the opening [.)
+
+  <!-- if you read this and wonder why there are only three backslashes in the
+  source code too, look at how backslash-escaping directives is implemented.
+  -->
+
+  this also means that parts which are not used by the template at all still
+  have their side effects without showing.
+
+  furthermore, the evaluation sequence is hard to predict. this might or might
+  not be a problem, depending on whether someone comes up with a less contrived
+  example (this one assumes a ``\[[!literal value]]`` directive that just
+  returns value but protects it from the preprocessor):
+
+  we can use `\[[!literal """[[!invalid example]]"""]]`, but we can't use
+  `\[[!template id=literalator value="""[[!invalid example]]"""]]` with a
+  'literalator' template `<span class="literal">\[[!literal """<TMPL_VAR
+  value>"""]]</span>` because then the `invalid` directive comes to action in
+  the first (per-argument) preprocessor run
+
+* links in templates are not stored at all; they appear, but the backlinks
+  don't work unless the link is explicit in one of the arguments.
+
+      \[[!template id="linker" destination="foo"]]
+
+  with a 'linker' template like
+
+      Go to \[[<TMPL_VAR destination>]]!
+
+  would result in a link to 'destination', but would not be registered in the
+  scan phase and thus not show a backlink from 'foo'.
+
+  (a ``\[[!link to=...]]`` directive, as suggested in
+  [[todo/flexible relationships between pages]], does get evaluated properly
+  though.)
+
+  this seems to be due to linkification being called before preprocess rather
+  than as a part of it, or (if that is on purpose) by the template plugin not
+  running linkification as an extra step (not even once).
+
+(nb: there is a way to include the ``raw_`` value of a directive, but that only
+refers to htmlification, not directive evaluation.)
+
+both those behaviors are non-intuitive and afaict undocumented. personally, i'd
+swap them out for passing the parameters as-is to the template, then running
+the linkifier and preprocessor on the final result. that would be as if all
+parameters were queried `raw_` -- then again, i don't see where `raw_` makes
+anything not work that worked originally, so obviously i'm missing something.
+
+
+i think it boils down to one question: are those behaviors necessary for
+compatibility reasons, and if yes, why?
+
+--[[chrysn]]
diff --git a/doc/bugs/toc_displays_headings_from_sidebar.mdwn b/doc/bugs/toc_displays_headings_from_sidebar.mdwn
new file mode 100644 (file)
index 0000000..469ca8a
--- /dev/null
@@ -0,0 +1,3 @@
+The [[/ikiwiki/directive/toc]] directive scrapes all headings from the page, including those in the sidebar.  So, if the sidebar includes navigational headers, every page with a table of contents will display those navigational headers before the headers in that page's content.
+
+I'd like some way to exclude the sidebar from the table of contents.  As discussed via Jabber, perhaps toc could have a config option to ignore headers inside a nav tag or a tag with id="sidebar".
diff --git a/doc/bugs/trail_excess_dependencies.mdwn b/doc/bugs/trail_excess_dependencies.mdwn
new file mode 100644 (file)
index 0000000..f806a62
--- /dev/null
@@ -0,0 +1,95 @@
+I've just modified the trail plugin to use only presence, and not
+content dependencies. Using content dependencies, particularly to the page
+that defines the trail, meant that every time that page changed, *every*
+page in the trail gets rebuilt. This leads to users setting up sites that
+have horrible performance, if the trail is defined in, for example, the top
+page of a blog.
+
+Unfortunatly, this change to presence dependencies has
+introduced a bug. Now when an existing trail is removed, the pages in the
+trail don't get rebuilt to remove the trail (both html display and state).
+
+> Actually, this particular case is usually OK. Suppose a trail `untrail`
+> contains `untrail/a` (as is the case in the regression
+> test I'm writing), and you build the wiki, then edit `untrail` to no
+> longer be a trail, and refresh. `untrail` has changed, so it is
+> rendered. Assuming that the template of either `untrail` or another
+> changed page happens to contain the `TRAILS` variable (which is not
+> guaranteed, but is highly likely), `I::P::t::prerender`
+> is invoked. It notices that `untrail/a` was previously a trail
+> member and is no longer, and rebuilds it with the diagnostic
+> "building untrail/a, its previous or next page has changed".
+> 
+> Strictly speaking, I should change `I::P::t::build_affected`
+> so it calls `prerender`, so we're guaranteed to have done the
+> recalculation. Fixed in my branch. --[[smcv]]
+
+I think that to fix this bug, the plugin should use a hook to 
+force rebuilding of all the pages that were in the trail, when
+the trail is removed (or changed).
+
+> The case of "the trail is changed" is still broken:
+> if the order of items changes, or the trail is removed,
+> then the logic above means it's OK, but if you
+> change the `\[[!meta title]]` of the trail, or anything else
+> used in the prev/up/next bar, the items won't show that
+> change. Fixed in my branch. --[[smcv]]
+
+There's a difficulty in doing that: The needsbuild hook runs before the scan
+hook, so before it has a chance to see if the trail directive is still there.
+It'd need some changes to ikiwiki's hooks.
+
+> That's what `build_affected` is for, and trail already used it. --s
+
+(An improvement in this area would probably simplify other plugins, which
+currently abuse the needsbuild hook to unset state, to handle the case
+where the directive that resulted in that state is removed.)
+
+I apologise for introducing a known bug, but the dependency mess was too
+bad to leave as-is. And I have very little time (and regrettably, even less
+power) to deal with it right now. :( --[[Joey]] 
+
+[[!template id=gitbranch branch=smcv/ready/trail author="[[Simon_McVittie|smcv]]"]]
+[[!tag patch]]
+
+> I believe my `ready/trail` branch fixes this. There are regression tests.
+>
+> Here is an analysis of how the trail pages interdepend.
+>
+> * If *trail* contains a page *member* which does exist, *member* depends
+>   on *trail*. This is so that if the trail directive is deleted from
+>   *trail*, or if *trail*'s "friendly" title or trail settings are changed,
+>   the trail navigation bar in *member* will pick up that change. This is
+>   now only a presence dependency, which isn't enough to make those happen
+>   correctly. [Edited to add: actually, the title is the only thing that
+>   can affect *member* without affecting the order of members.]
+>
+> * If *trail* contains consecutive pages *m1* and *m2* in that order,
+>   *m1* and *m2* depend on each other. This is so that if one's
+>   "friendly" title changes, the other is rebuilt. This is now only
+>   a presence dependency, which isn't enough to make those happen
+>   correctly. In my branch, I explicitly track the "friendly" title
+>   for every page that's edited and is involved in a trail somehow.
+>
+> * If *trail* has *member* in its `pagenames` but there is no page called
+>   *member*, then *trail* must be rebuilt if *member* is created. This
+>   was always a presence dependency, and is fine.
+>
+> In addition, the `trail` plugin remembers the maps
+> { trail => next item in that trail } and { trail => previous item in
+> that trail } for each page. If either changes, the page gets rebuilt
+> by `build_affected`, with almost the same logic as is used to update
+> pages that link to a changed page. My branch extends this to track the
+> "friendly title" of each page involved in a trail, either by being
+> the trail itself or a member (or both).
+>
+> I think it's true to say that the trail always depends on every member,
+> even if it doesn't display them. This might mean that we can use
+> "render the trail page" as an opportunity to work out whether any of
+> its members are also going to need re-rendering?
+> [Edited to add: actually, I didn't need this to be true, but I made the
+> regression test check it anyway.]
+>
+> --[[smcv]]
+
+>>> Thanks **very** much! [[done]] --[[Joey]]
diff --git a/doc/bugs/trail_shows_on_cgi_pages.mdwn b/doc/bugs/trail_shows_on_cgi_pages.mdwn
new file mode 100644 (file)
index 0000000..af1de30
--- /dev/null
@@ -0,0 +1,12 @@
+When commenting on, or I think editing, a page that uses the trail
+plugin, the trail is displayed across the top of the page. This should not
+happen, probably. --[[Joey]] 
+
+> [[!template id=gitbranch branch=smcv/ready/no-trails-if-dynamic author="[[smcv]]"]]
+> [[!tag patch]]
+> Fixed in my branch. --[[smcv]]
+
+>> [[merged|done]], although I am ambivilant about hiding the search box,
+>> and unsure about hiding the sidebar. At least the latter fixes an
+>> annoying layout problem with the comment page, where the textarea
+>> appears below the sidebar due to its width. --[[Joey]]
diff --git a/doc/bugs/trail_test_suite_failures.mdwn b/doc/bugs/trail_test_suite_failures.mdwn
new file mode 100644 (file)
index 0000000..a3b7159
--- /dev/null
@@ -0,0 +1,97 @@
+[[!template id=gitbranch branch=smcv/trail author=smcv]] [[!tag patch]]
+
+`t/trail.t` has some test suite failures. This is after applying
+[[smcv]]'s patch that fixed some races that caused it to fail
+sometimes. These remaining failures may also be intermittant,
+although I can get them reliably on my laptop. I've added some debugging
+output, which seems to point to an actual bug in the plugin AFAICS. --[[Joey]] 
+
+> I can reproduce this reliably at 0a23666ddd but not 3.20120203. Bisecting
+> indicates that it regressed in aaa72a3a80f, "inline: When the pagenames list
+> includes pages that do not exist, skip them".
+>
+> I don't think this is the bug noted in the commit message - the inline
+> containing `sorting/new` uses `pages`, not `pagenames`. --[[smcv]]
+
+>> It seems you removed `trail` support from `inline` in that commit.
+>> Assuming that wasn't intentional, this is fixed in `smcv/trail`.
+>> --[[smcv]]
+
+>>> Looks like a bad merge of some kind. pulled, [[done]] --[[Joey]]
+
+<pre>
+ok 71 - expected n=sorting/end p=sorting/beginning in sorting/middle.html
+not ok 72 - expected n=sorting/new p=sorting/middle in sorting/end.html
+#   Failed test 'expected n=sorting/new p=sorting/middle in sorting/end.html'
+#   at t/trail.t line 13.
+#          got: 'n=sorting/linked2 p=sorting/middle'
+#     expected: 'n=sorting/new p=sorting/middle'
+not ok 73 - expected n=sorting/old p=sorting/end in sorting/new.html
+#   Failed test 'expected n=sorting/old p=sorting/end in sorting/new.html'
+#   at t/trail.t line 13.
+#          got: undef
+#     expected: 'n=sorting/old p=sorting/end'
+not ok 74 - expected n=sorting/ancient p=sorting/new in sorting/old.html
+#   Failed test 'expected n=sorting/ancient p=sorting/new in sorting/old.html'
+#   at t/trail.t line 13.
+#          got: undef
+#     expected: 'n=sorting/ancient p=sorting/new'
+not ok 75 - expected n=sorting/linked2 p=sorting/old in sorting/ancient.html
+#   Failed test 'expected n=sorting/linked2 p=sorting/old in sorting/ancient.html'
+#   at t/trail.t line 13.
+#          got: undef
+#     expected: 'n=sorting/linked2 p=sorting/old'
+not ok 76 - expected n= p=sorting/ancient in sorting/linked2.html
+#   Failed test 'expected n= p=sorting/ancient in sorting/linked2.html'
+#   at t/trail.t line 13.
+#          got: 'n= p=sorting/end'
+#     expected: 'n= p=sorting/ancient'
+ok 77
+</pre>
+
+Here, the "new" page does not seem to be included into the trail as expected.
+Looking at the rendered page, there is no trail directive output on it either.
+--[[Joey]] 
+
+<pre>
+ok 90
+not ok 91 - expected n=sorting/new p= in sorting/old.html
+#   Failed test 'expected n=sorting/new p= in sorting/old.html'
+#   at t/trail.t line 13.
+#          got: undef
+#     expected: 'n=sorting/new p='
+not ok 92 - expected n=sorting/middle p=sorting/old in sorting/new.html
+#   Failed test 'expected n=sorting/middle p=sorting/old in sorting/new.html'
+#   at t/trail.t line 13.
+#          got: undef
+#     expected: 'n=sorting/middle p=sorting/old'
+not ok 93 - expected n=sorting/linked2 p=sorting/new in sorting/middle.html
+#   Failed test 'expected n=sorting/linked2 p=sorting/new in sorting/middle.html'
+#   at t/trail.t line 13.
+#          got: 'n=sorting/linked2 p='
+#     expected: 'n=sorting/linked2 p=sorting/new'
+ok 94 - expected n=sorting/linked p=sorting/middle in sorting/linked2.html
+ok 95 - expected n=sorting/end p=sorting/linked2 in sorting/linked.html
+ok 96 - expected n=sorting/a/c p=sorting/linked in sorting/end.html
+ok 97 - expected n=sorting/beginning p=sorting/end in sorting/a/c.html
+ok 98 - expected n=sorting/a/b p=sorting/a/c in sorting/beginning.html
+not ok 99 - expected n=sorting/ancient p=sorting/beginning in sorting/a/b.html
+#   Failed test 'expected n=sorting/ancient p=sorting/beginning in sorting/a/b.html'
+#   at t/trail.t line 13.
+#          got: 'n=sorting/z/a p=sorting/beginning'
+#     expected: 'n=sorting/ancient p=sorting/beginning'
+not ok 100 - expected n=sorting/z/a p=sorting/a/b in sorting/ancient.html
+#   Failed test 'expected n=sorting/z/a p=sorting/a/b in sorting/ancient.html'
+#   at t/trail.t line 13.
+#          got: undef
+#     expected: 'n=sorting/z/a p=sorting/a/b'
+not ok 101 - expected n= p=sorting/ancient in sorting/z/a.html
+#   Failed test 'expected n= p=sorting/ancient in sorting/z/a.html'
+#   at t/trail.t line 13.
+#          got: 'n= p=sorting/a/b'
+#     expected: 'n= p=sorting/ancient'
+ok 102
+</pre>
+
+Haven't investigated, but looks like the same sort of problem, a 
+page expected to be in the trail isn't. --[[Joey]] 
diff --git a/doc/bugs/trails_depend_on_everything.mdwn b/doc/bugs/trails_depend_on_everything.mdwn
new file mode 100644 (file)
index 0000000..8e9edcf
--- /dev/null
@@ -0,0 +1,16 @@
+[[!template id=gitbranch branch=smcv/ready/trail-sort
+author="[[Simon McVittie|smcv]]"
+browse=http://git.pseudorandom.co.uk/smcv/ikiwiki.git/shortlog/refs/heads/ready/trail-sort]]
+[[!tag patch users/smcv/ready]]
+
+On [[trail's discussion page|plugins/trail/discussion]], [[kjs]] pointed out
+that [[plugins/trail]] and [[plugins/contrib/album]] get excessive
+dependencies on `internal(*)`. I tracked this down to their (ab)use of
+`pagespec_match_list` with the pagespec `internal(*)` to sort a pre-existing
+list of pages.
+
+They should just sort the pages instead; they'll already have all the
+dependencies they need. My branch adds `IkiWiki::sort_pages` but does not
+make it plugin API just yet. --[[smcv]]
+
+> [[merged|done]] --[[smcv]]
index 3eb1542d377e0e19875adde9c7a2d7b5fe815d33..0673aa6740dfb900eb395f4a95140b6434a34ffd 100644 (file)
@@ -1,7 +1,74 @@
     mkdir -p ikiwiki-tag-test/raw/a_dir/ ikiwiki-tag-test/rendered/
-    echo '[[!taglink a_tag]]' > ikiwiki-tag-test/raw/a_dir/a_page.mdwn
+    echo '\[[!taglink a_tag]]' > ikiwiki-tag-test/raw/a_dir/a_page.mdwn
     ikiwiki --verbose --plugin tag --plugin autoindex --plugin mdwn --set autoindex_commit=0 --set tagbase=tag --set tag_autocreate=1 --set tag_autocreate_commit=0 ikiwiki-tag-test/raw/ ikiwiki-tag-test/rendered/
     ls -al ikiwiki-tag-test/raw/.ikiwiki/transient/
     ls -al ikiwiki-tag-test/rendered/tag/
 
 Shouldn't `ikiwiki-tag-test/raw/.ikiwiki/transient/tag.mdwn` and `ikiwiki-tag-test/rendered/tag/index.html` exist?
+
+[[!tag patch users/smcv/ready]]
+[[!template id=gitbranch branch=smcv/ready/autoindex author=smcv
+  browse=http://git.pseudorandom.co.uk/smcv/ikiwiki.git/shortlog/refs/heads/ready/autoindex]]
+[[!template id=gitbranch branch=smcv/ready/autoindex-more-often author=smcv
+  browse=http://git.pseudorandom.co.uk/smcv/ikiwiki.git/shortlog/refs/heads/ready/autoindex-more-often]]
+
+> To have a starting point to (maybe) change this, my `ready/autoindex`
+> branch adds a regression test for the current behaviour, both with
+> and without `autoindex_commit` enabled. It also fixes an unnecessary
+> and potentially harmful special case for the transient directory.
+>
+> The fact that files in underlays (including transient files) don't
+> trigger autoindexing is deliberate. However, this is the second
+> request to change this behaviour: the first was
+> [[!debbug 611068]], which has a patch from Tuomas Jormola.
+> On that bug report, Joey explains why it's undesirable
+> for the original behaviour of autoindex (when the
+> index isn't transient).
+>
+> I'm not sure whether the same reasoning still applies when the
+> index is transient, though (`autoindex_commit => 0`),
+> because the index pages won't be cluttering up people's
+> git repositories any more? My `autoindex-more` branch changes
+> the logic so it will do what you want in the `autoindex_commit => 0`
+> case, and amends the appropriate regression test. --[[smcv]]
+
+>> the autoindex-more-often branch looks good to me in general.
+>>
+>> i do have doubts about the 3ba2ef1a patch ("remove unnecessary special case
+>> for transient underlay"): now that we consider the complete transient
+>> directory as well, the sequence in which the refresh hooks are called starts
+>> to matter, and pages created by other plugins in a similar fashion as by
+>> autoindex will only be included the next time refresh gets called.
+>>
+>> *addendum:* i just found where i discussed the issue of fighting transient
+>> pages last, it was on [[todo/alias directive]]. the example cited there
+>> (conflicts with autotag) would probably work here as well. (imagine a
+>> `tags/project/completed` and a `tags/project/inprogress` exist, and a page
+>> is tagge `tags/project`. will that be an autoindex or an autotag?)
+>>
+>> --[[chrysn]]
+
+>>> That's a fair point. I think what happens is down to commit vs. refresh
+>>> timing.
+>>>
+>>> If pages tagged t/p/c, t/p/i and t/p are all created between one
+>>> refresh and the next, with none of those tag pages existing, I think the
+>>> answer is that they would all be autotags, because until t/p/c and
+>>> t/p/i are created, there's no reason to need t/p as an autoindex.
+>>>
+>>> If there were already pages tagged t/p/c and t/p/i at the previous
+>>> refresh, then t/p would already be an autoindex, and that's a
+>>> valid page, so autotagging wouldn't touch it.
+>>>
+>>> I can't see much reason to prefer one over the other; the ideal answer
+>>> is probably to have a tag-cloud *and* a list of child pages, but this
+>>> seems a weird enough thing to do that I'd be OK with a wiki user
+>>> having to disambiguate it themselves. "Whichever automatic process
+>>> happens first, happens" is at least easy to explain, and I consider
+>>> both autoindices and autotags to be time-saving conveniences rather
+>>> than something fundamental. --s
+
+>>>> i think a behavior that does the right thing when there is a right thing
+>>>> and *something* when there is ambiguity is ok for now; especially, it's
+>>>> not up to the autoindex branch to come up with a solution to the general
+>>>> problem. --[[chrysn]]
diff --git a/doc/bugs/undefined_value_as_a_HASH_reference.mdwn b/doc/bugs/undefined_value_as_a_HASH_reference.mdwn
new file mode 100644 (file)
index 0000000..228c3ba
--- /dev/null
@@ -0,0 +1,68 @@
+Hello,
+
+does anyone have an idea why I see the following error when I run websetup (Setup button in Preferences)?
+
+    Error: Can't use an undefined value as a HASH reference at /usr/share/perl5/IkiWiki/Plugin/websetup.pm line 82, line 97.
+
+Maybe, related to this is also
+
+    $ ikiwiki --setup /etc/ikiwiki/auto-blog.setup
+    What will the blog be named? tmpblog
+    What revision control system to use? git
+    What wiki user (or openid) will be admin? wsh
+
+
+    Setting up tmpblog ...
+    Importing /home/wsh/tmpblog into git
+    Initialized empty shared Git repository in /home/wsh/tmpblog.git/
+    Initialized empty Git repository in /home/wsh/tmpblog/.git/
+    [master (root-commit) d6847e1] initial commit
+     8 files changed, 48 insertions(+)
+     create mode 100644 .gitignore
+     create mode 100644 archives.mdwn
+     create mode 100644 comments.mdwn
+     create mode 100644 index.mdwn
+     create mode 100644 posts.mdwn
+     create mode 100644 posts/first_post.mdwn
+     create mode 100644 sidebar.mdwn
+     create mode 100644 tags.mdwn
+    Counting objects: 11, done.
+    Delta compression using up to 4 threads.
+    Compressing objects: 100% (9/9), done.
+    Writing objects: 100% (11/11), 1.53 KiB, done.
+    Total 11 (delta 0), reused 0 (delta 0)
+    Unpacking objects: 100% (11/11), done.
+    To /home/wsh/tmpblog.git
+     * [new branch]      master -> master
+    Directory /home/wsh/tmpblog is now a clone of git repository /home/wsh/tmpblog.git
+    Reference found where even-sized list expected at /usr/share/perl5/IkiWiki/Setup.pm line 177, <GEN4> line 97.
+    Reference found where even-sized list expected at /usr/share/perl5/IkiWiki/Setup.pm line 224, <GEN4> line 97.
+    Use of uninitialized value $section in hash element at /usr/share/perl5/IkiWiki/Setup.pm line 226, <GEN4> line 97.
+    Use of uninitialized value $section in hash element at /usr/share/perl5/IkiWiki/Setup.pm line 227, <GEN4> line 97.
+    Use of uninitialized value $section in concatenation (.) or string at /usr/share/perl5/IkiWiki/Setup.pm line 233, <GEN4> line 97.
+    /etc/ikiwiki/auto-blog.setup: Can't use an undefined value as a HASH reference at /usr/share/perl5/IkiWiki/Setup.pm line 252, <GEN4> line 97.
+
+    usage: ikiwiki [options] source dest
+           ikiwiki --setup configfile
+
+I'm on Debian unstable.
+
+Thanks,
+-Michal
+
+> Some plugin has a broken getsetup hook, and is feeding a corrupted setup list in. Both the websetup and the auto.setup files cause all plugins to be loaded and all their setup to be available. 
+> 
+> This command will help you find the plugin. Here it prints some noise around the rst plugin, for unrelated reasons,
+> but what you're looking for is the plugin printed before the "even sized list" message.
+
+<pre>
+perl -le 'use warnings; use strict; use Data::Dumper; use IkiWiki; %config=IkiWiki::defaultconfig(); use IkiWiki::Setup; my @s=IkiWiki::Setup::getsetup(); foreach my $pair (@s) { print "plugin ".$pair->[0]; my $setup=$pair->[1]; if ($pair->[0] eq "rst") { print Dumper($setup)} my %s=@{$setup} }'
+</pre>
+
+> I was able to replicate this by making a plugin's getsetup hook return a list reference, rather than a list, 
+> and have put in a guard against that sort of thing.
+>  --[[Joey]]
+
+>> Thanks. Your command didn't helped me, but with trial and error approach I found that the victim an old version asciidoc plugin. For some reason, asciidoc was never listed in the output of the command. --[[wentasah]]  
+
+>>> Ok. My fix should prevent the problem, so [[done]] --[[Joey]] 
diff --git a/doc/bugs/utf8_warnings_are_meaningless.mdwn b/doc/bugs/utf8_warnings_are_meaningless.mdwn
new file mode 100644 (file)
index 0000000..7c1efa0
--- /dev/null
@@ -0,0 +1,9 @@
+Hunting down what was generating
+
+    utf8 "\xEB" does not map to Unicode at /usr/share/perl5/IkiWiki.pm line 873, <$in> chunk 1.
+
+lead me to a call to `utf8::valid`, which lead to http://perldoc.perl.org/utf8.html which says this is an "INTERNAL" function:
+
+> Main reason for this routine is to allow Perl's testsuite to check that operations have left strings in a consistent state. You most probably want to use `utf8::is_utf8()` instead.
+
+Apparently the main point of the function is to emit the warning in unit tests - problem is, in the ikiwiki context, the only useful thing to warn about would be the name of the file you're trying to parse, not the name of the source code.  Alternatively, since the code does continue on with the data, *not* whining about it might be an option :-) but an actionable message would be better.
index b2a8b06323cd7f497918d748eb0b710ef981b10f..9f0a1d1022459d4a00cfbbec88dcf2c86281c0b4 100644 (file)
@@ -46,4 +46,22 @@ and have it render like:
 > there should give some strong hints how to fix this bug, though I haven't
 > tried to apply the method yet. --[[Joey]]
 
+>> As far, as I can see, smileys bug is solved by checking for code/pre. In
+>> this case, however, this is not applicable. WikiLinks/directives *should* be
+>> expanded before passing text to formatter, as their expansion may contain
+>> markup. Directives should be processed before, as they may provide *partial*
+>> markup (eg `template` ones), that have no sense except when in the page
+>> cotext. Links should be processed before, because, at least multimarkdown may
+>> try to expand them as anchor-links.
+>>
+>> For now, my partial solution is to restrict links to not have space at the
+>> start, this way in many cases escaping in code may be done in natural way
+>> and not break copypastability. For example, shell 'if \[[ condition ]];'
+>> will work fine with this.
+>>
+>> Maybe directives can also be restricted to only be allowed on the line by
+>> themselves (not separated by blank lines, however) or something similar.
+>>
+>> --[[isbear]]
+
 [[!debbug 487397]]
index bf311c19878e02e9437a99adac6caccf1ce7f693..5f7450b799a0f955e4f083a1073bac8549f49800 100644 (file)
@@ -1,3 +1,8 @@
 in ikiwiki instances that don't reside in the git root directory (the only ones i know of are ikiwiki itself), reverts show the wrong link in the recentchanges (for example, in the ikiwiki main repository's 4530430 and its revert, the main index page was edited, but the revert shows doc/index as a link).
 
 the expected behavior is to compensate for the modified root directory (i.e., show index instead of doc/index).
+
+> This seems to work OK now - commit 84c4ca33 and its reversion both
+> appear correctly in [[recentchanges]]. Looking at git history,
+> Joey [[fixed this|done]] in commit 1b6c1895 before 3.20120203.
+> --[[smcv]]
diff --git a/doc/bugs/yaml:xs_codependency_not_listed.mdwn b/doc/bugs/yaml:xs_codependency_not_listed.mdwn
new file mode 100644 (file)
index 0000000..3ae156d
--- /dev/null
@@ -0,0 +1,16 @@
+YAML:XS is not listed as a dep in the spec file which results in
+
+```
+HOME=/home/me /usr/bin/perl -Iblib/lib   ikiwiki.in -dumpsetup ikiwiki.setup
+Can't locate YAML/XS.pm in @INC (@INC contains: . blib/lib /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5) at (eval 39) line 2.
+BEGIN failed--compilation aborted at (eval 39) line 2.
+make: *** [ikiwiki.setup] Error 2
+error: Bad exit status from /var/tmp/rpm-tmp.Sgq2QK (%build)
+```
+
+when trying to build
+
+> Ok, added. [[done]] --[[Joey]] 
+>> Appears to be missing in 'Makefile.PL' also.  -- [[ttw]]
+
+>>> Added --[[Joey]]
index 486a4d1864a2e731cb9d7d6cd6bc37c9f2705609..dab09254941c54e6ac3f6a81fb0eb7e5486f3594 100644 (file)
@@ -4,8 +4,7 @@ ikiwiki's own wiki. ikiwiki provides a [[bug_tracker|bugs]], a
 [[TODO_list|TODO]], and "discussion" sub-pages for every page, as well as a
 [[forum]] for general questions and discussion. ikiwiki
 developers monitor [[RecentChanges]] closely, via the webpage, email,
-[CIA](http://cia.navi.cx), and IRC, and respond in a timely fashion.
+and IRC, and respond in a timely fashion.
 
 You could also drop by the IRC channel `#ikiwiki` on
-[OFTC](http://www.oftc.net/) (`irc.oftc.net`), or use the
-[identi.ca ikiwiki group](http://identi.ca/group/ikiwiki).
+[OFTC](http://www.oftc.net/) (`irc.oftc.net`).
index 871cd31fe5fe533ebe2e35371261412b00854092..a6f19a802a672c668c29a117cdafd20dafe61fd0 100644 (file)
@@ -3,5 +3,8 @@ to convert it to ikiwiki? Various tools and techniques have been developed
 to handle such conversions.
 
 * [[tips/convert_mediawiki_to_ikiwiki]]
-* [[tips/convert_MoinMoin_and_TWiki_to_ikiwiki]]
+* [[tips/convert_moinmoin_to_ikiwiki]]
 * [[tips/convert_blogger_blogs_to_ikiwiki]]
+* [[tips/Movable_Type_to_ikiwiki]]
+
+In addition, [[JoshTriplett]] has written scripts to convert Twiki sites, see [his page](/users/JoshTriplett) for more information.
index 3f562702871c8db32d9c6ec6c31782571d855827..376f81b8baa1aea797541d5cc7e794400381926b 100644 (file)
@@ -10,6 +10,10 @@ included in ikiwiki for easy use.
 Feel free to add your own stylesheets here. (Upload as wiki pages; wiki
 gnomes will convert them to css files..)
 
+* **[lessish.css](https://raw.github.com/spiffin/ikiwiki_lessish/master/lessish.css)**, contributed by [[Spiffin]],
+  A responsive stylesheet based on the [Less CSS Framework](http://lessframework.com). 
+  Links: [PNG preview](https://github.com/spiffin/ikiwiki_lessish/blob/master/lessish_preview.png) and [GitHub repo](https://github.com/spiffin/ikiwiki_lessish).
+
 * **[[css_market/zack.css]]**, contributed by [[StefanoZacchiroli]],
   customized mostly for *blogging purposes*, can be seen in action on 
   [zack's blog](http://upsilon.cc/~zack/blog/)
@@ -44,6 +48,8 @@ gnomes will convert them to css files..)
   templates.
   [[!meta stylesheet="bma"]]
 
+* ** http://blog.lastlog.de/, contributed by joachim schiele; please feel free to copy.
+
 * **[blankoblues.css][1]**, contributed by [[Blanko]]. Can be seen on [Blankoblues Demo][2]. Local.css and templates available [here][3].
 
 * **[contraste.css][4]**, contributed by [[Blanko]]. Can be seen on [Contraste Demo][5]. Local.css and templates available [here][6].
@@ -56,9 +62,9 @@ gnomes will convert them to css files..)
 * **[ikiwiked gray-orange](https://github.com/AntPortal/ikiwiked/raw/master/theme/gray-orange/local.css)**, contributed by [Danny Castonguay](https://antportal.com/). Can be seen in action at [antportal.com/wiki](https://antportal.com/wiki/). Feel free to modify and contribute on [Github](https://github.com/AntPortal/ikiwiked)
 <!-- Page links -->
 
- [1]: http://blankoworld.homelinux.com/demo/ikiwiki/blankoblues/src/local.css (Download Blankoblues CSS)
- [2]: http://blankoworld.homelinux.com/demo/ikiwiki/blankoblues/htdocs/ (Take a tour on Blankoblues Demo)
- [3]: http://blankoworld.homelinux.com/demo/ikiwiki/blankoblues/blankoblues.tar.gz (Download local.css and templates for Blankoblues theme)
- [4]: http://blankoworld.homelinux.com/demo/ikiwiki/contraste/src/local.css (Download Contraste CSS)
- [5]: http://blankoworld.homelinux.com/demo/ikiwiki/contraste/htdocs/ (Take a tour on Contraste Demo)
- [6]: http://blankoworld.homelinux.com/demo/ikiwiki/contraste/contraste.tar.gz (Download local.css and templates for Contraste theme)
+ [1]: http://olivier.dossmann.net/demo/ikiwiki/blankoblues/src/local.css (Download Blankoblues CSS)
+ [2]: http://olivier.dossmann.net/demo/ikiwiki/blankoblues/htdocs/ (Take a tour on Blankoblues Demo)
+ [3]: http://olivier.dossmann.net/demo/ikiwiki/blankoblues/blankoblues.tar.gz (Download local.css and templates for Blankoblues theme)
+ [4]: http://olivier.dossmann.net/demo/ikiwiki/contraste/src/local.css (Download Contraste CSS)
+ [5]: http://olivier.dossmann.net/demo/ikiwiki/contraste/htdocs/ (Take a tour on Contraste Demo)
+ [6]: http://olivier.dossmann.net/demo/ikiwiki/contraste/contraste.tar.gz (Download local.css and templates for Contraste theme)
index f1ae5ad31451ef4c967f8655c9bcad9d61221821..100f72843b0d8913e8a487b7450d457a5076c6e5 100644 (file)
@@ -35,10 +35,7 @@ own RPM.
 
 ## BSD ports
 
-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).
+NetBSD, Mac OS X, Solaris, and many other platforms: [pkgsrc](http://www.pkgsrc.org/) has an [ikiwiki package](http://pkgsrc.se/www/ikiwiki).
 
 FreeBSD has ikiwiki in its
 [ports collection](http://www.freshports.org/www/ikiwiki/).
index 08e014838008bc1c31adb7ccbc2cc69980ec390b..2bd0f1d6f218b8b842f7f0d8e6a417c9a4114c37 100644 (file)
@@ -1,3 +1,3 @@
 Here is a full list of posts to the [[blog|index]].
 
-[[!inline pages="page(./posts/*) and !*/Discussion" archive=yes feedshow=10 quick=yes]]
+[[!inline pages="page(./posts/*) and !*/Discussion" archive=yes feedshow=10 quick=yes trail=yes]]
diff --git a/doc/examples/softwaresite/bugs/hghg.mdwn b/doc/examples/softwaresite/bugs/hghg.mdwn
new file mode 100644 (file)
index 0000000..cece641
--- /dev/null
@@ -0,0 +1 @@
+hghg
index 66f7ecb7381383ac9b326779682643501e8dcd0e..61b23bb59cfc364bf69dff570c82cbd8805167d0 100644 (file)
@@ -64,9 +64,11 @@ Ikiwiki can also [[plugins/aggregate]] external blogs, feeding them into
 the wiki. This can be used to create a Planet type site that aggregates
 interesting feeds.
 
-You can also mix blogging with podcasting by dropping audio files where
-they will be picked up like blog posts. This will work for any files that
-you would care to syndicate.
+You can also mix blogging with [[podcasting|podcast]]. Simply drop
+media files where they will be picked up like blog posts. For
+fuller-featured podcast feeds, enclose media files in blog posts
+using [[plugins/meta]]. Either way, this will work for any files
+that you would care to syndicate.
 
 ## Valid html and [[css]]
 
diff --git a/doc/forum/Adding_a_custom_header_and_footer.mdwn b/doc/forum/Adding_a_custom_header_and_footer.mdwn
new file mode 100644 (file)
index 0000000..d9bdedc
--- /dev/null
@@ -0,0 +1,13 @@
+I want to do some things that I think are easiest accomplished
+by allowing me to add arbitrary HTML to be embedded on all pages
+in the site. Specifically, I want to add meta tags to the top of
+the page so that it renders pretty-like in things like Twitter,
+and I want to add Piwik tracking to the bottom of the page.
+
+So how do I do that?
+
+I could write a whole new template for the site, but I suspect
+that there's a more modular approach that is advised. And if you
+have ideas of totally different ways do do this, do tell.
+
+Thanks
diff --git a/doc/forum/Adding_a_custom_header_and_footer/comment_1_e82dbfef77ff222a7fa07aab0a19fb18._comment b/doc/forum/Adding_a_custom_header_and_footer/comment_1_e82dbfef77ff222a7fa07aab0a19fb18._comment
new file mode 100644 (file)
index 0000000..d10961c
--- /dev/null
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="spalax"
+ ip="82.216.247.172"
+ subject="Use page.tmpl"
+ date="2014-05-16T17:11:01Z"
+ content="""
+I think the right thing to do is to copy the default `page.tmpl` to your wiki (in your template directory), and add the code you wish.
+
+-- [[Louis|spalax]]
+"""]]
diff --git a/doc/forum/Anyone_mirroring_ikiwiki_inline_feed_to_identi.ca__63__.mdwn b/doc/forum/Anyone_mirroring_ikiwiki_inline_feed_to_identi.ca__63__.mdwn
new file mode 100644 (file)
index 0000000..c0b8965
--- /dev/null
@@ -0,0 +1,3 @@
+Is anyone successfull mirroring feeds from ikiwiki to identi.ca (or another status.net instance)? How did you set up your feed?
+
+When I try to, identi.ca presents me with an error about no "author ID URI" being found in the feed. Indeed the ikiwiki-generated atom feed only has got a global "author" - I presume identi.ca requires author information in each entry. Is it possible to set up ikiwiki's feed that way?
diff --git a/doc/forum/Anyone_mirroring_ikiwiki_inline_feed_to_identi.ca__63__/comment_1_8a5acbb6234104b607c8c4cf16124ae4._comment b/doc/forum/Anyone_mirroring_ikiwiki_inline_feed_to_identi.ca__63__/comment_1_8a5acbb6234104b607c8c4cf16124ae4._comment
new file mode 100644 (file)
index 0000000..1d710d1
--- /dev/null
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="Franek"
+ ip="188.99.178.40"
+ subject="[[!meta author=&quot;..."
+ date="2012-05-19T14:51:42Z"
+ content="""
+Adding [[!meta author=\"me\"]] to the entries and/or the feedpage does not help.
+"""]]
diff --git a/doc/forum/Anyone_mirroring_ikiwiki_inline_feed_to_identi.ca__63__/comment_2_155e5823860a91989647ede8b5c9224a._comment b/doc/forum/Anyone_mirroring_ikiwiki_inline_feed_to_identi.ca__63__/comment_2_155e5823860a91989647ede8b5c9224a._comment
new file mode 100644 (file)
index 0000000..6c709b3
--- /dev/null
@@ -0,0 +1,16 @@
+[[!comment format=mdwn
+ username="Franek"
+ ip="188.99.178.40"
+ subject="Further enquiries"
+ date="2012-05-20T10:46:07Z"
+ content="""
+I did some more experiments setting not only \"[[!meta author=...\", but also \"authorurl\" globally and per-entry in various combinations, with no success. As far as I could see, \"authorurl\" had no effect on the atom feed whatsoever.
+
+It seems that identi.ca wants a feed to have an <author> field with a <uri> subfield, as described here: [[http://www.atomenabled.org/developers/syndication/#person]] . Is there a way to achieve this with ikiwiki inline-feeds?
+
+I also found two old and unresolved status.net bugreports on the matter: 
+
+[[http://status.net/open-source/issues/2840]] 
+
+[[http://status.net/open-source/issues/2839]]
+"""]]
diff --git a/doc/forum/Anyone_mirroring_ikiwiki_inline_feed_to_identi.ca__63__/comment_3_317f1202a3da1bfc845d4becbac4bba8._comment b/doc/forum/Anyone_mirroring_ikiwiki_inline_feed_to_identi.ca__63__/comment_3_317f1202a3da1bfc845d4becbac4bba8._comment
new file mode 100644 (file)
index 0000000..6bda934
--- /dev/null
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="Franek"
+ ip="92.74.26.119"
+ subject="kind of solved, but another problem comes up"
+ date="2012-05-26T19:31:19Z"
+ content="""
+The templates atompage.tmpl and/or atomitem.tmpl appear to be what would have to be altered to satisfy identi.ca. I did that on my system, just hard-coding a <uri> element into <author> for testing. In one respect, it worked: identi.ca does not complain about the missing author uri any more. In another, it did not, another error comes up now: \"Internal server error\" and something like \"could not add feed\".
+
+I do not know where to go from this very unspecific error message. I guess I am going to try something like twitterfeed.com, for now.
+"""]]
diff --git a/doc/forum/Attachment_and_sub-directory.mdwn b/doc/forum/Attachment_and_sub-directory.mdwn
new file mode 100644 (file)
index 0000000..91d7aee
--- /dev/null
@@ -0,0 +1,5 @@
+Hi.
+
+If I create a page and attach a file to the page, ikiwiki creates a sub-directory with the page name and places the attachment in the sub-directory regardless of usedirs setup. Is there any setup not to create the sub-directory and to place the attachment in the same directory where the page is, so that I can edit and properly *preview* at a local machine using third-party markdown editors?
+
+Thanks in advance.
diff --git a/doc/forum/Background_picture_and_css.mdwn b/doc/forum/Background_picture_and_css.mdwn
new file mode 100644 (file)
index 0000000..8271009
--- /dev/null
@@ -0,0 +1,8 @@
+Is it possible to put two different background pictures into the right and left sides of the following ikiwiki css?
+
+[lessish css theme](https://raw.github.com/spiffin/ikiwiki_lessish/master/lessish.css)
+
+Is it also possible to have a background like this: [http://ysharifi.wordpress.com/](http://ysharifi.wordpress.com/)
+or this [tex.stackexchange.com](tex.stackexchange.com)
+
+I am not a css expert so, it would be nice if you could provide some details.
diff --git a/doc/forum/CGI_script_and_HTTPS.mdwn b/doc/forum/CGI_script_and_HTTPS.mdwn
new file mode 100644 (file)
index 0000000..2f25500
--- /dev/null
@@ -0,0 +1,29 @@
+Dear ikiwiki folks,
+
+using Debian Wheezy and ikiwiki 3.20120629 for some reason when accessing the site using HTTP (and not HTTPS), going to Edit, so executing the CGI script, all URLs are prepended with HTTPS, which I do not want.
+
+        <base href="https://www.example.org/" />
+
+Trying to look at the source, I guess it is originating from `IkiWiki/CGI.pm`.
+
+        sub printheader ($) {
+               my $session=shift;
+       
+               if (($ENV{HTTPS} && lc $ENV{HTTPS} ne "off") || $config{sslcookie}) {
+                       print $session->header(-charset => 'utf-8',
+                               -cookie => $session->cookie(-httponly => 1, -secure => 1));
+               }
+               else {
+                       print $session->header(-charset => 'utf-8',
+                               -cookie => $session->cookie(-httponly => 1));
+               }
+        }
+
+Does it check if HTTPS is enabled in the environment? During `ikiwiki --setup example.setup` or when the CGI script is run when the site is accessed (for example in an Apache environment)?
+
+Can this somehow be disabled in ikiwiki. Reading the code I guess I could somehow set `HTTPS = off` somewhere in the `VirtualHost` section of the Apache configuration.
+
+
+Thanks,
+
+--[[PaulePanter]]
diff --git a/doc/forum/CGI_script_and_HTTPS/comment_1_3f8ef438ca7de11635d4e40080e7baa9._comment b/doc/forum/CGI_script_and_HTTPS/comment_1_3f8ef438ca7de11635d4e40080e7baa9._comment
new file mode 100644 (file)
index 0000000..03f1032
--- /dev/null
@@ -0,0 +1,43 @@
+[[!comment format=mdwn
+ username="http://smcv.pseudorandom.co.uk/"
+ nickname="smcv"
+ subject="comment 1"
+ date="2012-11-05T11:27:02Z"
+ content="""
+IkiWiki generates self-referential URLs using the `url` and `cgiurl`
+configuration parameters, and the `urlto()` and `cgiurl()` functions;
+the code you quoted isn't involved (it's choosing whether to set
+HTTPS-only cookies or not, rather than choosing how to generate
+self-referential URLs).
+
+If you want your wiki to be accessible via both HTTP and HTTPS, and use
+whichever the user first requested, you should set both `url` and
+`cgiurl` to the same URI scheme and hostname with no port specified,
+either both `http` or both `https`, for instance:
+
+    url: http://www.example.com/
+    cgiurl: http://www.example.com/ikiwiki.cgi
+
+or
+
+    url: https://example.org/wiki/
+    cgiurl: https://example.org/cgi-bin/ikiwiki
+
+(or the Perl-syntax equivalents if you're not using a YAML
+setup file).
+
+If you use one of those, IkiWiki will attempt to generate
+path-only links, like \"/wiki/\" and \"/cgi-bin/ikiwiki?...\",
+whenever it's valid to do so. A visitor using HTTP will stay
+on HTTP and a visitor using HTTPS will stay on HTTPS.
+
+The choice of `http` or `https` for the `url` and `cgiurl`
+still matters when a URL *must* be absolute, such as in an
+RSS feed.
+
+I improved this code in late 2010 for this todo item:
+[[todo/want_to_avoid_ikiwiki_using_http_or_https_in_urls_to_allow_serving_both]].
+It's possible that it has regressed (that's happened
+a couple of times). If it has, please quote your exact
+`url` and `cgiurl` configuration.
+"""]]
index ebea43697b8ef745225ffc5ac6e3f8be8a7da2ed..c3ecf36bece9652c39df300cda6e13b408f0a7f8 100644 (file)
@@ -15,3 +15,7 @@ I'm not sure how I go about swapping the link on the day number to a link to, I
 and a suitable whilst loop looks to be all that's needed...
 
 Any pointers appreciated.
+
+A [[!taglink patch]] has been proposed in [comment](#comment-d6f94e2b779d1c038b6359aad79ed14b)
+
+> This has been applied. --[[Joey]]
diff --git a/doc/forum/Calendar:_listing_multiple_entries_per_day/comment_5_de545ebb6376066674ef2aaae4757b9c._comment b/doc/forum/Calendar:_listing_multiple_entries_per_day/comment_5_de545ebb6376066674ef2aaae4757b9c._comment
new file mode 100644 (file)
index 0000000..fef8520
--- /dev/null
@@ -0,0 +1,97 @@
+[[!comment format=mdwn
+ username="spalax"
+ subject="Popup listing multiple entries per day"
+ date="2012-06-08T00:56:06Z"
+ content="""
+[[!tag patch]]
+
+Hello,
+here is a patch that:
+
+- if there is a single entry in one day, does not change anything (compared to the previous version of the calendar plugin);
+- if there are several entries, when mouse passes over the day, displays a popup listing all the entries of that day.
+
+That's all. No new pages for each day, takes as little space as it took before, and only a few lines more in the source.
+
+The only thing I am not totally happy with is the CSS. We have to say that the text is aligned on the left (otherwise, it is aligned on the right, as is each day of the calendar), but I do not know which place is the more sensible to put that line of CSS in.
+
+Regards,    
+-- Louis
+
+
+    diff --git a/IkiWiki/Plugin/calendar.pm b/IkiWiki/Plugin/calendar.pm
+    index d443198..2c9ed79 100644
+    --- a/IkiWiki/Plugin/calendar.pm
+    +++ b/IkiWiki/Plugin/calendar.pm
+    @@ -86,8 +86,11 @@ sub format_month (@) {
+               my $year  = $date[5] + 1900;
+               my $mtag  = sprintf(\"%02d\", $month);
+     
+    -          # Only one posting per day is being linked to.
+    -          $linkcache{\"$year/$mtag/$mday\"} = $p;
+    +          # Several postings per day
+    +          if (! $linkcache{\"$year/$mtag/$mday\"}) {
+    +                  $linkcache{\"$year/$mtag/$mday\"} = [];
+    +          }
+    +          push(@{$linkcache{\"$year/$mtag/$mday\"}}, $p);
+       }
+               
+       my $pmonth = $params{month} - 1;
+    @@ -221,11 +224,36 @@ EOF
+                               $tag='month-calendar-day-link';
+                       }
+                       $calendar.=qq{\t\t<td class=\"$tag $downame{$wday}\">};
+    -                  $calendar.=htmllink($params{page}, $params{destpage}, 
+    -                          $linkcache{$key},
+    -                          noimageinline => 1,
+    -                          linktext => $day,
+    -                          title => pagetitle(IkiWiki::basename($linkcache{$key})));
+    +                  if ( scalar(@{$linkcache{$key}}) == 1) {
+    +                          # Only one posting on this page
+    +                          my $page = $linkcache{$key}[0];
+    +                          $calendar.=htmllink($params{page}, $params{destpage}, 
+    +                                  $page,
+    +                                  noimageinline => 1,
+    +                                  linktext => $day,
+    +                                  title => pagetitle(IkiWiki::basename($page)));
+    +                  } else {
+    +                          $calendar.=qq{<div class='popup'>$day<div class='balloon'>};
+    +                          # Several postings on this page
+    +                          $calendar.=qq{<ul>};
+    +                          foreach my $page (@{$linkcache{$key}}) {
+    +                                  $calendar.= qq{\n\t\t\t<li>};
+    +                                  my $title;
+    +                                  if (exists $pagestate{$page}{meta}{title}) {
+    +                                          $title = \"$pagestate{$page}{meta}{title}\";
+    +                                  } else {
+    +                                          $title = pagetitle(IkiWiki::basename($page));
+    +                                  }
+    +                                  $calendar.=htmllink($params{page}, $params{destpage}, 
+    +                                          $page,
+    +                                          noimageinline => 1,
+    +                                          linktext => $title,
+    +                                          title => $title);
+    +                                  $calendar.= '</li>';
+    +                          }
+    +                          $calendar.=qq{\n\t\t</ul>};
+    +                          $calendar.=qq{</div></div>};
+    +                  }
+                       $calendar.=qq{</td>\n};
+               }
+               else {
+    diff --git a/doc/style.css b/doc/style.css
+    old mode 100644
+    new mode 100755
+    index 6e2afce..4149229
+    --- a/doc/style.css
+    +++ b/doc/style.css
+    @@ -316,6 +316,7 @@ div.progress-done {
+     .popup .paren,
+     .popup .expand {
+       display: none;
+    +  text-align: left;
+     }
+     .popup:hover .balloon,
+     .popup:focus .balloon {
+
+"""]]
diff --git a/doc/forum/Can_I_have_different_favicons_for_each_folder__63__/comment_2_b8ccd3c29249eca73766f567bce12569._comment b/doc/forum/Can_I_have_different_favicons_for_each_folder__63__/comment_2_b8ccd3c29249eca73766f567bce12569._comment
new file mode 100644 (file)
index 0000000..0c8ca3b
--- /dev/null
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="Franek"
+ ip="178.7.43.64"
+ subject="comment 2"
+ date="2012-06-25T09:58:03Z"
+ content="""
+I did as you suggested (finally) and created a simple modification of the [[plugins/favicon]] plugin: [[plugins/contrib/localfavicon]]. It checks for the \"localfavicon\" option, and if it is set, it uses bestlink() to determine which favicon to use for each page; if not, it behaves just like the original favicon plugin.
+"""]]
diff --git a/doc/forum/Can__39__t_call_method___34__distribution__34___on_an_undefined_value_at_FirstTime.pm.html b/doc/forum/Can__39__t_call_method___34__distribution__34___on_an_undefined_value_at_FirstTime.pm.html
new file mode 100644 (file)
index 0000000..b683958
--- /dev/null
@@ -0,0 +1,64 @@
+This really look like a general PERL problem, but google search returns no relative result of undfined method 'distribution' at FireTime.pm at all. Answer on where to look for answer is appreciated too. Using perl 5.18 on NETBSD 6.1
+
+<pre>
+$ PERL5LIB=`pwd`/ikiwiki:`pwd`/ikiwiki/cpan:`pwd`/lib/perl5 PERL_MM_USE_DEFAULT=1 perl -MCPAN -e 'CPAN::Shell->install("Bundle::IkiWiki")'
+perl: warning: Setting locale failed.
+perl: warning: Please check that your locale settings:
+        LC_ALL = "en_US.UTF-8",
+        LANG = "en_US.UTF-8"
+    are supported and installed on your system.
+perl: warning: Falling back to the standard locale ("C").
+perl: warning: Setting locale failed.
+perl: warning: Please check that your locale settings:
+        LC_ALL = "en_US.UTF-8",
+        LANG = "en_US.UTF-8"
+    are supported and installed on your system.
+perl: warning: Falling back to the standard locale ("C").
+
+CPAN.pm requires configuration, but most of it can be done automatically.
+If you answer 'no' below, you will enter an interactive dialog for each
+configuration option instead.
+
+Would you like to configure as much as possible automatically? [yes] yes
+
+ <install_help>
+
+Warning: You do not have write permission for Perl library directories.
+
+To install modules, you need to configure a local Perl library directory or
+escalate your privileges.  CPAN can help you by bootstrapping the local::lib
+module or by configuring itself to use 'sudo' (if available).  You may also
+resolve this problem manually if you need to customize your setup.
+
+What approach do you want?  (Choose 'local::lib', 'sudo' or 'manual')
+ [local::lib] local::lib
+
+Autoconfigured everything but 'urllist'.
+
+Now you need to choose your CPAN mirror sites.  You can let me
+pick mirrors for you, you can select them from a list or you
+can enter them by hand.
+
+Would you like me to automatically choose some CPAN mirror
+sites for you? (This means connecting to the Internet) [yes] yes
+Trying to fetch a mirror list from the Internet
+Fetching with LWP:
+http://www.perl.org/CPAN/MIRRORED.BY
+
+Looking for CPAN mirrors near you (please be patient)
+.......................... done!
+
+New urllist
+  http://cpan.llarian.net/
+  http://mirrors.syringanetworks.net/CPAN/
+  http://noodle.portalus.net/CPAN/
+
+Autoconfiguration complete.
+
+Attempting to bootstrap local::lib...
+
+Writing /arpa/tz/w/weiwu/.local/share/.cpan/CPAN/MyConfig.pm for bootstrap...
+commit: wrote '/arpa/tz/w/weiwu/.local/share/.cpan/CPAN/MyConfig.pm'
+Can't call method "distribution" on an undefined value at /usr/pkg/lib/perl5/5.18.0/CPAN/FirstTime.pm line 1257.
+$ rm -r /arpa/tz/w/weiwu/.local/share/.cpan/
+</pre>
diff --git a/doc/forum/Can_ikiwiki_be_configured_as_multi_user_blog__63__.mdwn b/doc/forum/Can_ikiwiki_be_configured_as_multi_user_blog__63__.mdwn
new file mode 100644 (file)
index 0000000..118b534
--- /dev/null
@@ -0,0 +1,7 @@
+All the ikiwiki blogs I have seen have a single user blog. Is it possible to give every user a blog, where they can create their own pages in their own directory = based on their user name? 
+
+I feel that a wiki might give more options in the way users share and collaborate when compared to a blog engine (like Word Press in multi user format)
+
+Is this the best place to post a question like this? There doesn't seem to be much traffic in this forum
+Thanks for your help
+Richard
diff --git a/doc/forum/Can_ikiwiki_be_configured_as_multi_user_blog__63__/comment_1_8e34b10699bed1b53b6c929ed1e9f19c._comment b/doc/forum/Can_ikiwiki_be_configured_as_multi_user_blog__63__/comment_1_8e34b10699bed1b53b6c929ed1e9f19c._comment
new file mode 100644 (file)
index 0000000..1f0577c
--- /dev/null
@@ -0,0 +1,32 @@
+[[!comment format=mdwn
+ username="http://smcv.pseudorandom.co.uk/"
+ nickname="smcv"
+ subject="It's a wiki: any editor can have as many blogs as they want"
+ date="2013-07-17T08:17:05Z"
+ content="""
+Ikiwiki is a wiki, so you can certainly have multiple users. Any user
+with appropriate access can create any number of blogs: they just need
+to put an [[ikiwiki/directive/inline]] directive on any page they can
+edit, with a [[ikiwiki/PageSpec]] pointing to pages (blog posts) in a
+directory where they can create pages.
+
+If you want a limited set of users to be able to edit the wiki without
+making them full wiki admins, you can use [[plugins/lockedit]]:
+
+    locked_pages: * and !(user(bob) or user(chris))
+
+or if you want \"most\" users to only be able to write on their own blog, and
+not on other users' blogs (for instance: Alice the wiki admin can edit
+anything, but Bob can only edit `users/bob/...` and Chris can only edit
+`users/chris/...`) then you can use [[plugins/lockedit]], something like:
+
+    locked_pages: * and !(user(bob) and (users/bob or users/bob/*)) and !(user(chris) and (users/chris or users/chris/*))
+
+(Wiki admins can always edit locked pages.)
+
+If you have lots of users and you know a bit of Perl, you might want
+to [[write a plugin|plugins/write]] that adds a function-like
+[[ikiwiki/PageSpec]] like `owndirectory(users)`, which would match if
+there is a logged-in user and the page being edited is equal to or
+a subpage of their directory in users.
+"""]]
diff --git a/doc/forum/Can_ikiwiki_be_configured_as_multi_user_blog__63__/comment_2_6083e16f72e12c03bdf739b84bd2f352._comment b/doc/forum/Can_ikiwiki_be_configured_as_multi_user_blog__63__/comment_2_6083e16f72e12c03bdf739b84bd2f352._comment
new file mode 100644 (file)
index 0000000..10929a3
--- /dev/null
@@ -0,0 +1,12 @@
+[[!comment format=mdwn
+ username="http://smcv.pseudorandom.co.uk/"
+ nickname="smcv"
+ subject="comment 2"
+ date="2013-07-17T08:23:32Z"
+ content="""
+IkiWiki's own [[bugs]], [[news]] and [[to-do list|todo]] are functionally
+equivalent to blogs, in fact. ([[news]] is the most obviously blog-like,
+[[bugs]] is like a blog except that solved bugs disappear from the
+page/feed, and [[todo]] only shows titles, not content, but is otherwise
+like [[bugs]].)
+"""]]
diff --git a/doc/forum/Can_not_advance_past_first_page_of_results_using_search_plugin.mdwn b/doc/forum/Can_not_advance_past_first_page_of_results_using_search_plugin.mdwn
new file mode 100644 (file)
index 0000000..1a9391e
--- /dev/null
@@ -0,0 +1,26 @@
+I'm using the [[/plugins/search/]] plugin and it correctly displays the first page of results, but the "Next" button doesn't work.
+
+If I search for "linux", for example, I see "1-10 of exactly 65 matches" and this in my browser's address bar: https://example.com/ikiwiki.cgi?P=linux
+
+Then, I scroll down and click "Next" and I see. . .
+
+> Although this page is encrypted, the information you have entered is to be sent over an unencrypted connection and could easily be read by a third party.
+> 
+> Are you sure you want to continue sending this information?
+
+. . . then I click "Continue" but I'm stuck on the first page of search results (it still says "1-10 of exactly 65 matches") and I have the following in my browser's address bar:
+
+https://example.com/ikiwiki.cgi?P=linux&DEFAULTOP=or&%253E=Next&DB=default&FMT=query&xP=Zlinux&xDB=default&xFILTERS=--O
+
+I noticed that if I change what's in the address bar to the following, I **can** advance to page 2 (it shows "11-20 of exactly 65 matches").  That is to say, I'm removing "25" from "%253E" as a work around:
+
+https://example.com/ikiwiki.cgi?P=linux&DEFAULTOP=or&%3E=Next&DB=default&FMT=query&xP=Zlinux&xDB=default&xFILTERS=--O
+
+Based on this output, I might need to make a change to "searchquery.tmpl", which is under [[/templates]]. . .
+
+    [wikiuser@ikiwiki1 ~]$ grep -r DEFAULTOP /usr/share/ikiwiki
+    /usr/share/ikiwiki/templates/searchquery.tmpl:<SELECT NAME=DEFAULTOP>
+    [wikiuser@ikiwiki1 ~]$ rpm -qf /usr/share/ikiwiki/templates/searchquery.tmpl 
+    ikiwiki-3.20120202-1.el6.noarch
+
+. . . but I would appreciate any guidance on what the fix might be.
diff --git a/doc/forum/Can_someone_update_ikiwki_in_Macports__63__.mdwn b/doc/forum/Can_someone_update_ikiwki_in_Macports__63__.mdwn
new file mode 100644 (file)
index 0000000..f120862
--- /dev/null
@@ -0,0 +1,5 @@
+The Ikiwiki in Macports is a very old version:
+
+    $ ikiwiki --version
+    ikiwiki version 3.20110608
+
diff --git a/doc/forum/Can_someone_update_ikiwki_in_Macports__63__/comment_1_87365ded9b202607d6431daf4e76e3c1._comment b/doc/forum/Can_someone_update_ikiwki_in_Macports__63__/comment_1_87365ded9b202607d6431daf4e76e3c1._comment
new file mode 100644 (file)
index 0000000..b01e742
--- /dev/null
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawlcaGfdn9Kye1Gc8aGb67PDVQW4mKbQD7E"
+ nickname="Amitai"
+ subject="that someone is probably elsewhere"
+ date="2013-09-14T18:04:24Z"
+ content="""
+Have you tried contacting the package maintainer or, failing that, submitting an update request to the relevant mailing list?
+
+(Note that [[I've asked this question before|forum/build_error:_Cannot_decode_string_with_wide_characters/#comment-8eb5e0300e6224157e0d7d55bf956bb8]].)
+"""]]
index 05490a7990d02945798774cdb02ef29bbce534c0..07e53453add8bd3e425aa4f0d0475fa374170662 100644 (file)
@@ -26,3 +26,7 @@ Ian.
 The user is logging as ian, the same user as the laptop. I can push and pull git repos on the same server owned by the same user via ssh with no problem. I have deleted and re-started from scratch several times. However, for my use case I think it's simpler to keep the repo on my local computer and just rsync the web pages to the server.
 
 Ian.
+
+Ian, you've copied over the repo created by ikiwiki --setup, which contains hook/post-update - just remove that file which is not required anymore on the git server side.
+
+Serge
diff --git a/doc/forum/Commiting_all_moderated_comments_into_special_branch__63__/comment_1_8403e8ff9c5c8dddb6d744632322f7bc._comment b/doc/forum/Commiting_all_moderated_comments_into_special_branch__63__/comment_1_8403e8ff9c5c8dddb6d744632322f7bc._comment
new file mode 100644 (file)
index 0000000..5aa5af0
--- /dev/null
@@ -0,0 +1,12 @@
+[[!comment format=mdwn
+ username="http://joey.kitenet.net/"
+ nickname="joey"
+ subject="comment 1"
+ date="2012-03-22T16:56:39Z"
+ content="""
+A branch makes sense if it's used in a way that never ties its history with mainline, so all the spam can eventually be dropped out of git, by deleting the branch. Though this is clearly an expert user level option.
+
+Probably the easiest way to get there would be to keep the branch, checked out, in `.ikiwiki/comments_pending/`. The old code that used that directory is still in ikiwiki for backwards compatability, so it should be easy to get comments written into that location. Then a minimum of vcs-specific code would be needed to set up the branch and commit pending comments to it.
+
+But there's a wrinkle -- if you just cherry pick from that branch, the comments_pending directory will retain all the old spam, growing without bounds. And the web moderation interface will show them all. I suppose you could check out the branch and revert or delete spammy comments too, but this is feeling like a lot of work the user needs to do in order to use git to moderate spammy comments. I have to think most users would prefer, as I do, to occasionally flailing at a web form in this case.
+"""]]
diff --git a/doc/forum/Dot_CGI_pointing_to_localhost._What_happened__63__.mdwn b/doc/forum/Dot_CGI_pointing_to_localhost._What_happened__63__.mdwn
new file mode 100644 (file)
index 0000000..930b9b9
--- /dev/null
@@ -0,0 +1,13 @@
+# Dot CGI pointing to localhost. What happened?
+
+My ikiwiki broke. For some reason ikiwiki.cgi started pointing to
+https://localhost:80/ instead of the real URL. Can somebody help me find out
+why this has happened and perhaps fix it? Now login and recentchanges do not
+work because of it.
+
+I believe the change happened after my hosting provider upgraded their server
+OS from Debian oldstable to stable. Rebuilding the .cgi or the wiki hasn't
+helped nor has helpdesk been helpful. Any hints as to debug this are
+appreciated.
+
+Thanks!
diff --git a/doc/forum/Dot_CGI_pointing_to_localhost._What_happened__63__/comment_1_cbab9b95923124b39cfccf5d2e88070c._comment b/doc/forum/Dot_CGI_pointing_to_localhost._What_happened__63__/comment_1_cbab9b95923124b39cfccf5d2e88070c._comment
new file mode 100644 (file)
index 0000000..eb1007b
--- /dev/null
@@ -0,0 +1,14 @@
+[[!comment format=mdwn
+ username="http://smcv.pseudorandom.co.uk/"
+ nickname="smcv"
+ subject="comment 1"
+ date="2013-11-22T09:03:38Z"
+ content="""
+The CGI automatically builds self-referential URLs based on how you
+accessed it, so if your web host puts it behind a
+[reverse proxy](https://en.wikipedia.org/wiki/Reverse_proxy) or
+something, that might make it try to redirect to localhost?
+
+If that's it, then `$q->url` with `$params{cgiurl}` in
+`IkiWiki/CGI.pm` and `IkiWiki/Plugin/openid.pm` would work around it.
+"""]]
diff --git a/doc/forum/Email_notifications_for_comment_moderation.mdwn b/doc/forum/Email_notifications_for_comment_moderation.mdwn
new file mode 100644 (file)
index 0000000..6a840ce
--- /dev/null
@@ -0,0 +1,3 @@
+I use both [[plugins/moderatedcomments/]] and [[plugins/anonok]] on my [blog](http://feeding.cloud.geek.nz) but having to remember to visit the comment moderation page manually is not ideal.
+
+Is there a way to get an email notification (or maybe even just an RSS feed) whenever a new comment enters the moderation queue?
diff --git a/doc/forum/Email_notifications_for_comment_moderation/comment_1_668bf6a21310dcc8b882bc60a130ba06._comment b/doc/forum/Email_notifications_for_comment_moderation/comment_1_668bf6a21310dcc8b882bc60a130ba06._comment
new file mode 100644 (file)
index 0000000..0614072
--- /dev/null
@@ -0,0 +1,12 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawm6VdLM7IKcNgkDiJ2YKHpcWli9bRLsZDk"
+ nickname="Oscar"
+ subject="How to get a comment moderation feed"
+ date="2013-02-25T18:04:21Z"
+ content="""
+I was looking for the same subject and I have found the following:
+
+http://ikiwiki.info/tips/comments_feed/
+
+
+"""]]
diff --git a/doc/forum/Empty_sha1sum_messages.mdwn b/doc/forum/Empty_sha1sum_messages.mdwn
new file mode 100644 (file)
index 0000000..f464232
--- /dev/null
@@ -0,0 +1,11 @@
+Hi,
+
+running ikiwiki from squeeze backports I see frequently in the logs:
+
+> Empty sha1sum for 'ikiwiki/pagespec.mdwn'.
+
+The page varies. What are these messages about? The code that emits this
+comes from the git plugin, and this page is indeed not in git. So is
+this just noise? Or rather, why does ikiwiki need to look at these?
+
+thanks in advance!
diff --git a/doc/forum/Empty_sha1sum_messages/comment_1_b260b5e6b4c4f4c203b01183fee9fd69._comment b/doc/forum/Empty_sha1sum_messages/comment_1_b260b5e6b4c4f4c203b01183fee9fd69._comment
new file mode 100644 (file)
index 0000000..7ad6f28
--- /dev/null
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="http://joey.kitenet.net/"
+ nickname="joey"
+ subject="comment 1"
+ date="2012-03-22T17:06:05Z"
+ content="""
+Hmm, this is a debug message, so only printed or logged if verbose mode is enabled. As far as I can see, in normal operation this could only happen if you use the web interface to edit a page that's coming originally from ikiwiki's underlay -- such as `ikiwiki/pagespec.mdwn`, or a page in the srcdir whose file is indeed not checked into git for some reason.
+
+Doesn't seem useful, so I've nuked the message.
+"""]]
diff --git a/doc/forum/Empty_sha1sum_messages/comment_2_d6a47838a3c81d0a75e6fc22e786c976._comment b/doc/forum/Empty_sha1sum_messages/comment_2_d6a47838a3c81d0a75e6fc22e786c976._comment
new file mode 100644 (file)
index 0000000..452fc94
--- /dev/null
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="http://k1024.org/~iusty/"
+ nickname="Iustin Pop"
+ subject="Re: comment 1"
+ date="2012-03-22T19:34:55Z"
+ content="""
+Hmm, I see this 2-3 times a day on a internet exposed ikiwiki. There shouldn't be any editing of such files, especially not of files from the underlay - the only editing permissions are for blog comments.
+
+I'll have to check what's going on better, thanks for the reply!
+"""]]
diff --git a/doc/forum/Error:_CGI::tmpFileName_failed_to_return_the_uploaded_file_name.mdwn b/doc/forum/Error:_CGI::tmpFileName_failed_to_return_the_uploaded_file_name.mdwn
new file mode 100644 (file)
index 0000000..ad52c00
--- /dev/null
@@ -0,0 +1,11 @@
+I tried to upload a file to my wiki last week, and got this error:
+
+    Error: CGI::tmpFileName failed to return the uploaded file name
+
+This used to work, and I honestly don't know what could have changed to screw it up.
+
+I see that there's a lot of frustrated comments around this particular block of code in `attachment.pm`; so, for the record, I'm on Debian 6, using perl `5.10.1-17squeeze4`.
+
+Any thoughts?
+
+~jonathon
diff --git a/doc/forum/Error:_CGI::tmpFileName_failed_to_return_the_uploaded_file_name/comment_1_66c321b9eb618d20872cee7d6ca9e44c._comment b/doc/forum/Error:_CGI::tmpFileName_failed_to_return_the_uploaded_file_name/comment_1_66c321b9eb618d20872cee7d6ca9e44c._comment
new file mode 100644 (file)
index 0000000..fb49900
--- /dev/null
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawlRjjrKEyPmXnh2qBEGx9PgH5DP32wCMAQ"
+ nickname="Jonathon"
+ subject="ikiwiki version"
+ date="2013-01-02T14:59:19Z"
+ content="""
+I should also identify that I'm using ikiwiki `3.20100815.9`.
+"""]]
diff --git a/doc/forum/Error:_CGI::tmpFileName_failed_to_return_the_uploaded_file_name/comment_2_80296d67c7f1dd75b56b85c14f5efa3b._comment b/doc/forum/Error:_CGI::tmpFileName_failed_to_return_the_uploaded_file_name/comment_2_80296d67c7f1dd75b56b85c14f5efa3b._comment
new file mode 100644 (file)
index 0000000..e765941
--- /dev/null
@@ -0,0 +1,12 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawlRjjrKEyPmXnh2qBEGx9PgH5DP32wCMAQ"
+ nickname="Jonathon"
+ subject="figured it out"
+ date="2013-01-19T15:59:09Z"
+ content="""
+It looks like this was just another expression of [the header size limit issue] [1] that has already been reported and addressed.
+
+I got `3.20120629` from `squeeze-backports`, and my issue has been resolved.
+
+[1]: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=638009
+"""]]
diff --git a/doc/forum/Error:___34__do__34___parameter_missing.mdwn b/doc/forum/Error:___34__do__34___parameter_missing.mdwn
new file mode 100644 (file)
index 0000000..402217e
--- /dev/null
@@ -0,0 +1,13 @@
+Hi
+
+I'm stuck with a «Error: "do" parameter missing» message I can't fix.
+
+I'm using ikiwiki 3.20100815.7 on a debian 6.0.4 system.
+
+Error redirection is obvisously configured, also the dot cgi thing.
+
+You can test it at http://wikimix.cc/thisuridoesntexist
+
+The procedure of creating a reference to a new page gives the same error.
+
+Any clue?
diff --git a/doc/forum/Error:___34__do__34___parameter_missing/comment_1_3a51c303ba1670f1567f323349b53837._comment b/doc/forum/Error:___34__do__34___parameter_missing/comment_1_3a51c303ba1670f1567f323349b53837._comment
new file mode 100644 (file)
index 0000000..a01a334
--- /dev/null
@@ -0,0 +1,16 @@
+[[!comment format=mdwn
+ username="http://smcv.pseudorandom.co.uk/"
+ nickname="smcv"
+ subject="comment 1"
+ date="2012-05-22T13:46:20Z"
+ content="""
+Did you enable the [[plugins/404]] plugin?
+
+Which web server? That plugin is meant to work with Apache 2; in
+principle it should be possible to make it work with other web servers,
+but it'll need some setup.
+
+The 404 plugin relies on your web server giving IkiWiki some extra
+information about 404s; lighttpd doesn't currently provide enough
+information for IkiWiki to detect 404s reliably, for instance.
+"""]]
diff --git a/doc/forum/Error:___34__do__34___parameter_missing/comment_2_c5f24a8c4d2de0267cf0de1908480e82._comment b/doc/forum/Error:___34__do__34___parameter_missing/comment_2_c5f24a8c4d2de0267cf0de1908480e82._comment
new file mode 100644 (file)
index 0000000..dd2fdb2
--- /dev/null
@@ -0,0 +1,12 @@
+[[!comment format=mdwn
+ username="http://ismael.olea.org/"
+ ip="150.214.94.198"
+ subject="comment 2"
+ date="2012-05-22T21:24:37Z"
+ content="""
+Gosh, that was it.
+
+Grrr. Sorry for being too rookie O:-)
+
+Thanks!
+"""]]
diff --git a/doc/forum/Error___34__is_locked_and_cannot_be_edited__34__.mdwn b/doc/forum/Error___34__is_locked_and_cannot_be_edited__34__.mdwn
new file mode 100644 (file)
index 0000000..44d25af
--- /dev/null
@@ -0,0 +1,15 @@
+I returned to one of my old ikiwiki blogs and received the above error message after entering (on the web interface of the blog) a title for a new post. 
+
+I found the following three locks in the .ikiwiki directory of the blog:
+
+-rw-r--r-- 1 zoidberg zoidberg     0 May 23 15:10 cgilock
+-rw-r--r-- 1 zoidberg zoidberg     0 May 23 15:20 lockfile
+-rw------- 1 zoidberg zoidberg     0 May 23 15:10 sessions.db.lck
+
+When I delete these and and again try to create a new post the above error message reappears and the locks have been recreated.
+
+Re-running 'ikiwiki --setup myblog.setup' disclosed a couple of permission problems (files owned by root - bah), but fixing them has had no effect on hte behavior of the blog.
+
+I really would like to rehab this ikiwiki blog!
+
+*Thanks!*
diff --git a/doc/forum/Error___34__is_locked_and_cannot_be_edited__34__/comment_1_dc99a921813d4f8adf797a900ee0a2c1._comment b/doc/forum/Error___34__is_locked_and_cannot_be_edited__34__/comment_1_dc99a921813d4f8adf797a900ee0a2c1._comment
new file mode 100644 (file)
index 0000000..7aed7a2
--- /dev/null
@@ -0,0 +1,18 @@
+[[!comment format=mdwn
+ username="http://smcv.pseudorandom.co.uk/"
+ nickname="smcv"
+ subject="comment 1"
+ date="2014-05-23T22:02:07Z"
+ content="""
+I believe that error message indicates that the [[plugins/lockedit]]
+plugin is preventing editing. Either make the user account you're
+trying to use into a wiki admin via the `adminuser` setting:
+
+    # either or both of these
+    adminuser:
+    - yourname
+    - http://your-openid.example.com/
+
+or allow that user to edit pages by altering the `locked_pages`
+setting.
+"""]]
diff --git a/doc/forum/Error___34__is_locked_and_cannot_be_edited__34__/comment_2_48daf77f097ed94bf78cf97b0c027129._comment b/doc/forum/Error___34__is_locked_and_cannot_be_edited__34__/comment_2_48daf77f097ed94bf78cf97b0c027129._comment
new file mode 100644 (file)
index 0000000..f94e778
--- /dev/null
@@ -0,0 +1,14 @@
+[[!comment format=mdwn
+ username="http://bob-bernstein.myopenid.com/"
+ nickname="bernstein"
+ subject="comment 2"
+ date="2014-05-24T02:04:07Z"
+ content="""
+Thanks. Your prompt reply encouraged me to poke around a bit more. I found a perl module was missing (how I cannot imagine) XML/Writer.pm. Installing the relevant deb seemed to fix things up. 
+
+nb This is a rather old install of ikiwiki. It dates from 2009.
+
+ps Your use of ikiwiki for your homepage is quite impressive, and tasteful!
+
+*Thanks!*
+"""]]
diff --git a/doc/forum/Everyone_can_remove_comments.mdwn b/doc/forum/Everyone_can_remove_comments.mdwn
new file mode 100644 (file)
index 0000000..5e30b08
--- /dev/null
@@ -0,0 +1 @@
+Having enabled anonok and leads to the undesirable situation, that everybody is able to remove every comment. Is there an easy workaround, or am I missing something? --[[wiebel]]
diff --git a/doc/forum/Export_images_when_building_the_wiki.mdwn b/doc/forum/Export_images_when_building_the_wiki.mdwn
new file mode 100644 (file)
index 0000000..9802ea4
--- /dev/null
@@ -0,0 +1,16 @@
+My repository contains image sources made with tools like Inkspace, Dia, LibreOffice, Gimp and so on.
+
+Instead of pushing the images themselves into git or manually exporting them to PNG/SVG,  
+I'd like to keep just the sources in git, and have ikiwiki compile them into the final  
+images just like it compiles Markdown into HTML. Is it possible to add new files types  
+and tell ikiwiki how to compile them?
+
+(After reading some plugin docs...)
+
+I just read 'perlintro' yesterday in unrelated context, but...
+could it maybe be done by writing a plugin like this one,
+which compiles textile?
+
+<http://source.ikiwiki.branchable.com/?p=source.git;a=blob;f=IkiWiki/Plugin/textile.pm;h=56bb4bffce83bf9fa47b1ad731f46c8dc8d9f652;hb=HEAD>
+
+-- [[fr33domlover]]
diff --git a/doc/forum/Export_images_when_building_the_wiki/comment_1_f7328be9b201f3eea6b90c269781fd0b._comment b/doc/forum/Export_images_when_building_the_wiki/comment_1_f7328be9b201f3eea6b90c269781fd0b._comment
new file mode 100644 (file)
index 0000000..182be88
--- /dev/null
@@ -0,0 +1,18 @@
+[[!comment format=mdwn
+ username="spalax"
+ ip="82.216.247.172"
+ subject="Other plugins to study"
+ date="2014-05-16T10:38:17Z"
+ content="""
+Several plugins process data using external programs. You may have a look at:
+
+- [[plugins/teximg]] which calls LaTeX;
+- [[plugins/graphviz]] which calls graphviz;
+- [[plugins/contrib/pandoc]] which calls pandoc.
+
+The first and second plugins I mentionned create an image using an external
+tool, and integrate it in the page. It may be exactly what you want.
+
+-- [[Louis|spalax]]
+
+"""]]
diff --git a/doc/forum/Export_images_when_building_the_wiki/comment_2_99a592c8ff9d2c2094132edd27356922._comment b/doc/forum/Export_images_when_building_the_wiki/comment_2_99a592c8ff9d2c2094132edd27356922._comment
new file mode 100644 (file)
index 0000000..0c27098
--- /dev/null
@@ -0,0 +1,18 @@
+[[!comment format=mdwn
+ username="fr33domlover"
+ ip="85.65.55.38"
+ subject="comment 2"
+ date="2014-05-17T11:10:35Z"
+ content="""
+Thanks, I already saw those.
+
+I need a plugin of exactly the same kind, but which calls other tools, such as Dia and Inkspace.  
+In addition, embedding into a page means the same image may end up being generated  
+many times. So it's best to generate the image as an attachment of some page, and then  
+all other pages in the wiki can use it. What do you think?
+
+Also, if I write a plugin (and test it of course), where do I publish it so people can  
+see and enjoy it? Is [[plugins]] moderated?
+
+-- [[fr33domlover]]
+"""]]
diff --git a/doc/forum/Export_images_when_building_the_wiki/comment_3_7f5a1ef639453c83748405d2b3b0b880._comment b/doc/forum/Export_images_when_building_the_wiki/comment_3_7f5a1ef639453c83748405d2b3b0b880._comment
new file mode 100644 (file)
index 0000000..48aec10
--- /dev/null
@@ -0,0 +1,27 @@
+[[!comment format=mdwn
+ username="spalax"
+ ip="82.216.247.172"
+ subject="comment 3"
+ date="2014-05-17T13:49:14Z"
+ content="""
+> I need a plugin of exactly the same kind, but which calls other tools, such as Dia and Inkspace.
+> In addition, embedding into a page means the same image may end up being generated
+> many times. So it's best to generate the image as an attachment of some page, and then
+> all other pages in the wiki can use it. What do you think?
+
+Then the [[plugins/contrib/pandoc]] may be a good start, since *you can configure it for Pandoc to take over processing of all .mkdn files, or only files with a different extension.* Have a look at it to make your plugin process files with a particular extension. Then, it will be possible to have several pages refer to the same file, generated only once (maybe by storing stuff in `%pagestate` or `%wikistate`.
+
+Have a look at [[plugins/write]] to write your plugin.
+
+> Also, if I write a plugin (and test it of course), where do I publish it so people can
+> see and enjoy it? Is [[plugins]] moderated?
+
+What is usually done is:
+
+- you publish your code somewhere (your server, or on github or something like that);
+- you advertise your plugin by creating a subpage of [[plugins/contrib]]. Use the [[templates/plugin]] [[template|templates]] (it generates the frame you can see on the right of [[one of my plugins|plugins/contrib/jscalendar]], for example):
+
+      \[[!template id=plugin name=YourFancyPlugin author=\"[[fr33domlover]]\"]]
+
+-- [[Louis|spalax]]
+"""]]
diff --git a/doc/forum/Export_images_when_building_the_wiki/comment_4_bd3b37fbee54f1bf510ef5fc6ba27e55._comment b/doc/forum/Export_images_when_building_the_wiki/comment_4_bd3b37fbee54f1bf510ef5fc6ba27e55._comment
new file mode 100644 (file)
index 0000000..5f5647a
--- /dev/null
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="fr33domlover"
+ ip="85.65.55.38"
+ subject="comment 4"
+ date="2014-05-17T14:46:15Z"
+ content="""
+Great, thanks. I'll take a look. But it's a bit different, because images are not HTML pages at all.
+
+Thanks for the quick replies :-)
+"""]]
diff --git a/doc/forum/File_wiki.setup.mdwn b/doc/forum/File_wiki.setup.mdwn
new file mode 100644 (file)
index 0000000..173988f
--- /dev/null
@@ -0,0 +1,6 @@
+Hi,
+
+I'd like to know if there were a way to get the user's directory path where the file wiki.setup is, and the name of this file. Because i'm working on an improvement of the plugin userlist, and i want to modify the .setup file but i haven't found a way to dynamically get this file.
+
+> The [[plugins/websetup]] plugin rewrites the setup file. You may find your
+> answer in its code. [[Louis|spalax]]
diff --git a/doc/forum/Force_rebuild_of_page_using_some_plugin.mdwn b/doc/forum/Force_rebuild_of_page_using_some_plugin.mdwn
new file mode 100644 (file)
index 0000000..3880a89
--- /dev/null
@@ -0,0 +1,5 @@
+I'm writing a plugin and I'd like to force all the pages that include a directive which my plugin defines to be rebuilt when the wiki is refreshed (whether or not those pages have changed).
+
+I've found the "needsbuild" hook which I could use to get pages to be rebuilt. But how can I work out which pages include my directive? And will needsbuild get called for every occurrence of my directive? I only need to rebuild those pages once (obviously). When the needsbuild hook gets called, is it because the directive match its 'id' hook() parameter has been encountered? And does needsbuild know what page is being processed?
+
+Or is there some other way of doing this?
diff --git a/doc/forum/Formatting_algorithms.mdwn b/doc/forum/Formatting_algorithms.mdwn
new file mode 100644 (file)
index 0000000..c7f4aaa
--- /dev/null
@@ -0,0 +1,54 @@
+I'm using ikiwiki for a software project, and in the design process one of the things I sometimes write  
+algorithms. It doesn't happen much, but for components of functional nature it's very useful.
+
+I've been thinking how to write them in the wiki. I can use a numbered list and manually make  
+keywords __bold__, but it's not optimal. I could also use plain text formatting and indent using tabs,  
+but again there is no highlighting of any keywords or formatting of structures.  
+Before I do that, I'd like to know if there are better options.
+
+One option I know is LaTeX, which has some very nice packages. You write pseudo-code which looks  
+very much like source code, and the result looks great, very readable and high quality.
+
+I saw the [[plugins/teximg]] plugin, but the explanation there is poor: Does the plugin handle things  
+that aren't formulas? Could it work with a LaTeX document or with an algorithm environment?
+
+Of course, of you have other suggestions I'll be happy to hear. I want to make a careful choice before  
+I start writing many algorithms :-)
+
+> You may try to see if you can select a pseudo-code languages in one of the
+> highlight plugins ([[plugins/contrib/highlightcode]],
+> [[plugins/contrib/sourcehighlight]], [[plugins/highlight]], other ?). The
+> list of supported languages with the [[plugins/highlight]] plugin is
+> [[here|http://www.andre-simon.de/doku/highlight/en/langs.php]], and if you
+> cannot find your languages, I think you can define your own
+> [[here|http://www.andre-simon.de/doku/highlight/en/plugins.php]].
+>
+> -- [[Louis|spalax]]
+
+>> Thanks, I looked at it. I don't think there's any special language for algorithms
+>> (anyway I couldn't find any), but for the record I found the following possibilities:
+>>
+>> 1. LaTeX: Not very readable in source form, but could be highlighted, didn't try
+>> 2. Writing in a subset of Python/Pascal/Fortran and using their highlighting
+>> 3. Define a new highlight syntax
+>>
+>> What about [[plugins/teximg]]? If it can be used to generate algorithms from LaTeX, it would be
+>> an easy excellent solution.
+>>
+>> --[[fr33domlover]]
+
+> [[plugins/teximg]] is the best thing that currently exists. Since it isn't
+> enabled on this wiki, and the author's ikiwiki has disappeared, I put one of
+> the test formulas into a private test wiki of mine. Here's a screenshot:
+> <http://imgur.com/nT6mefx>
+> 
+> I think it would be great if someone [[wrote a
+> plugin for something nicer|todo/Add_nicer_math_formatting]]. -- [[Jon]]
+
+>> [[plugins/teximg]] is fine for math (al least for GUI browsers, I didn't try with w3m etc.),
+>> but what I'm looking for is a solution for formatting **algorithms**. If teximg can help
+>> with that, great, otherwise there's the 3 workarounds I mentioned above.
+>>
+>> Do you have any ideas not mentioned? :-)
+>>
+>> -- [[fr33domlover]]
diff --git a/doc/forum/Forward_slashes_being_escaped_as_252F/comment_1_7702cf6d354ab600d6643b075b9f09da._comment b/doc/forum/Forward_slashes_being_escaped_as_252F/comment_1_7702cf6d354ab600d6643b075b9f09da._comment
new file mode 100644 (file)
index 0000000..7c9ccbc
--- /dev/null
@@ -0,0 +1,12 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawm6gCEo_Z36OJ7x5kyZn52lEVvyjn3zSUc"
+ nickname="Ángel"
+ subject="comment 1"
+ date="2013-05-31T16:03:03Z"
+ content="""
+Simply add the NE (No escape) flag:
+
+RewriteEngine on
+RewriteCond %{HTTP_HOST} ^www\.ciffer\.net$
+RewriteRule /(.*) http://ciffer.net/$1 [L,R,NE]
+"""]]
diff --git a/doc/forum/Google_searches_of_ikiwiki.info_are_broken._:__40__.mdwn b/doc/forum/Google_searches_of_ikiwiki.info_are_broken._:__40__.mdwn
new file mode 100644 (file)
index 0000000..3716a14
--- /dev/null
@@ -0,0 +1,14 @@
+I know that these pages exist on ikiwiki.info:
+
+* http://ikiwiki.info/ikiwiki/formatting/
+* http://ikiwiki.info/ikiwiki/subpage/
+
+But I can't get either to show up in Google search results.  I have even tried:
+> site:ikiwiki.info inurl:formatting
+
+and
+
+> site:ikiwiki.info inurl:formatting -inurl:discussion
+
+...Is this some robots.txt problem?
+
diff --git a/doc/forum/How_can_I_invert_the_banned__95__user_check__63__.mdwn b/doc/forum/How_can_I_invert_the_banned__95__user_check__63__.mdwn
new file mode 100644 (file)
index 0000000..2436b2e
--- /dev/null
@@ -0,0 +1,33 @@
+Trying to lockdown a wiki so that it can only be edited by certain users and figured I'd just set
+
+     banned_users:
+     - !user(myadmin)
+
+in my config but it doesn't work.  I'm sure I must be doing something daft?
+
+PS: the user is authenticated via 'httpauth', would that make a difference?
+
+> That's not how `banned_users` works. Make yourself an admin:
+>
+>     adminuser:
+>     - myadmin
+>
+> and disallow editing by non-admins:
+>
+>     locked_pages: '*'
+>
+> You can enable the `opendiscussion` and/or `anonok` plugins if you want
+> unprivileged users, perhaps logging in with an OpenID, to be able to
+> edit discussion pages (if enabled via `discussion`) or post comments.
+>
+> You can also relax the `locked_pages` setting if you want unprivileged
+> users to be able to edit certain areas of the site.
+>
+> --[[smcv]]
+
+>> That was my initial setup but it wasn't working and I got caught-up on the `banned_user` idea.  It would seem I was getting tricked by some credential-caching-weirdness.  Fired up another browser and `locked_pages` works perfectly.  Thanks.  -- fergus
+
+>>> Browsers generally remember HTTP auth credentials until they're closed
+>>> or get a 401 error, and don't generally have a way to "log out".
+>>> As far as I'm aware, there's nothing that [[plugins/httpauth]] can
+>>> do about that. --[[smcv]]
diff --git a/doc/forum/How_can_I_prevent_spam__63__.mdwn b/doc/forum/How_can_I_prevent_spam__63__.mdwn
new file mode 100644 (file)
index 0000000..44e3192
--- /dev/null
@@ -0,0 +1,17 @@
+I am getting continuous spam like this:
+
+    discussion  85.25.146.11  web  11:02:19 05/17/13  2rand[0,1,1]
+    discussion  85.25.146.11  web  11:02:13 05/17/13  2rand[0,1,1]
+
+The bot uses an IP address as the username and puts '2rand[0,1,1]' as comment text.
+
+I do not have a page 'discussion' in use, so I have redirected this page with an apache2
+Alias to a static page, just in case anyone stumbles on it.  This means it cannot really 
+be edited via the web. However the bots that post 
+this spam are evidently not opening the page to edit it, but merely sending a cgi request 
+as if they had edited the page.  The result is that no damage is done on the site and no 
+benefit is achieved for the spammer since google cannot see the result.  However, the 
+logs are stuffed with spurious entries and a page is constantly recompiled, which wastes 
+resources.  
+
+Is there some way to reject edits that do not arise from an established session?
diff --git a/doc/forum/How_can_I_prevent_spam__63__/comment_1_fd26fb7f1569e8c44ba8262794f938db._comment b/doc/forum/How_can_I_prevent_spam__63__/comment_1_fd26fb7f1569e8c44ba8262794f938db._comment
new file mode 100644 (file)
index 0000000..a729328
--- /dev/null
@@ -0,0 +1,19 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ nickname="joey"
+ subject="comment 1"
+ date="2013-05-17T17:55:46Z"
+ content="""
+Normally ikiwiki requires a valid session cookie of a logged in user to edit pages. It sounds like you may have the opendiscussion or anonok plugins enabled, which allows anyone to edit without logging in. Recommend disabling them.
+
+Since you know the spammer's IP, put it into ikiwiki.setup:
+
+<pre>
+banned_users:
+  - ip(85.25.146.11)
+</pre>
+
+If the user was logging in, you could also put their username in the ban list.
+
+You can also try enabling the blogspam plugin.
+"""]]
diff --git a/doc/forum/How_can_I_prevent_spam__63__/comment_2_d098124f005976ee815d25c883bc9106._comment b/doc/forum/How_can_I_prevent_spam__63__/comment_2_d098124f005976ee815d25c883bc9106._comment
new file mode 100644 (file)
index 0000000..53e7433
--- /dev/null
@@ -0,0 +1,16 @@
+[[!comment format=mdwn
+ username="http://claimid.com/richard-lyons"
+ nickname="richard-lyons"
+ subject="comment 2"
+ date="2013-05-17T20:56:23Z"
+ content="""
+I did indeed have opendiscussion active.  I shall wait to see what happens after disabling it.
+
+The bots seem to make 5 consecutive edits at short intervals (around 2 minutes) using an IP 
+address as a username.  I do not know if the IP is the one from which they work.  There are 
+usually two or three sets of five edits using different IP addresses as username in each hour.
+
+I did try blocking specific IPs but they constantly change.
+
+It would be good if blocking could match a regexp, but as far as I can see this is not an option,
+"""]]
diff --git a/doc/forum/How_can_I_prevent_spam__63__/comment_3_deb434d01aaefa18d2791e48d6c824ae._comment b/doc/forum/How_can_I_prevent_spam__63__/comment_3_deb434d01aaefa18d2791e48d6c824ae._comment
new file mode 100644 (file)
index 0000000..64783be
--- /dev/null
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://claimid.com/richard-lyons"
+ nickname="richard-lyons"
+ subject="SOLVED -- How can I prevent spam?"
+ date="2013-05-18T08:13:19Z"
+ content="""
+I can now confirm that this particular attack has stopped after removing the opendiscussion plugin.
+"""]]
diff --git a/doc/forum/How_do_I_enable_OpenID__63__.mdwn b/doc/forum/How_do_I_enable_OpenID__63__.mdwn
new file mode 100644 (file)
index 0000000..a4e1a45
--- /dev/null
@@ -0,0 +1 @@
+I'm trying to set up a new ikiwiki based blog and I want commentors to be able to log in with OpenID.  To enable OpenID I installed Net::OpenID::Consumer, and enabled the openid plugin in my blog.setup file and ran the ikiwiki --setup command.  Despite doing that I still only see the username and password in the login screen.  What am I missing?
diff --git a/doc/forum/How_to_add_additional_links_to_the_gray_horizontable_bar_under_page_title__63__.mdwn b/doc/forum/How_to_add_additional_links_to_the_gray_horizontable_bar_under_page_title__63__.mdwn
new file mode 100644 (file)
index 0000000..537ba61
--- /dev/null
@@ -0,0 +1,3 @@
+How to add additional links to the gray horizontable bar under page title?  
+
+What I meant by the gray horizontable bar shows "Edit RecentChanges Preferences".  I want to disable those three but add some other links to other pages in my website.
diff --git a/doc/forum/How_to_add_additional_links_to_the_gray_horizontable_bar_under_page_title__63__/comment_1_f2e52d38f60888c7d5142de853123540._comment b/doc/forum/How_to_add_additional_links_to_the_gray_horizontable_bar_under_page_title__63__/comment_1_f2e52d38f60888c7d5142de853123540._comment
new file mode 100644 (file)
index 0000000..1bb3fa7
--- /dev/null
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawmb2CAGUNU_Kx6YSImD2ox6MtjuaM6Jp1E"
+ nickname="Nicolas"
+ subject="comment 1"
+ date="2012-11-09T08:34:42Z"
+ content="""
+You could use custom templates and hardcode those links there.
+"""]]
diff --git a/doc/forum/How_to_add_link_to_previous_and_next_blog_on_blog_pages__63__.mdwn b/doc/forum/How_to_add_link_to_previous_and_next_blog_on_blog_pages__63__.mdwn
new file mode 100644 (file)
index 0000000..3f771e7
--- /dev/null
@@ -0,0 +1,14 @@
+In a Ikiwiki instance, I made a subdirectory to hold blog pages
+
+    /website
+    blog.mdwn
+    ...
+
+    /website/blog
+    /website/blog/blog1.mdwn
+    /website/blog/blog2.mdwn
+    ...
+
+On blog.mdwn,  reader by default see the last 10 posts, but it seems there is no link to blog pages older than that. What's a good way to make titles of blog pages older also somehow visible to reader at the blog front page `blog.mdwn`?
+
+On any individual blog page such as `blog1.mdwn`, there is not a link to the blog pages immediately before and after it. How to make such links?
diff --git a/doc/forum/How_to_add_link_to_previous_and_next_blog_on_blog_pages__63__/comment_1_aad510f45be505efaabcb6fb860665a4._comment b/doc/forum/How_to_add_link_to_previous_and_next_blog_on_blog_pages__63__/comment_1_aad510f45be505efaabcb6fb860665a4._comment
new file mode 100644 (file)
index 0000000..ce99b84
--- /dev/null
@@ -0,0 +1,23 @@
+[[!comment format=mdwn
+ username="http://smcv.pseudorandom.co.uk/"
+ nickname="smcv"
+ subject="use trail=yes, and an extra inline with archive=yes"
+ date="2012-08-04T17:22:18Z"
+ content="""
+To get just the titles of older posts, you want an inline with
+`archive=\"yes\"`, probably one that skips the same number of posts
+displayed in full:
+
+    [[!inline pages=\"blog/* and !*/Discussion\"
+      skip=\"10\" feeds=\"no\" archive=\"yes\"]]
+
+To get 'next' and 'previous' links on each post, use a recent
+IkiWiki version, enable the [[plugins/trail]] plugin and add
+`trail=\"yes\"` to your main inline:
+
+    [[!inline pages=\"blog/* and !*/Discussion\"
+      show=\"10\" trail=\"yes\"]]
+
+For instance see
+[my blog](http://git.pseudorandom.co.uk/pseudorandom.co.uk/smcv.git/blob/83e9a713d77778b58460ed04f6c48665d817f3cd:/index.mdwn).
+"""]]
diff --git a/doc/forum/How_to_add_link_to_previous_and_next_blog_on_blog_pages__63__/comment_2_ee65792a5b796caa216f4e7a653fc668._comment b/doc/forum/How_to_add_link_to_previous_and_next_blog_on_blog_pages__63__/comment_2_ee65792a5b796caa216f4e7a653fc668._comment
new file mode 100644 (file)
index 0000000..5546c47
--- /dev/null
@@ -0,0 +1,23 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawmKyeW2G4jjSdnL1m6kPPtAiGFUBsnYCfY"
+ nickname="FName"
+ subject="How to install the trail package?"
+ date="2012-08-09T00:11:26Z"
+ content="""
+I tried putting
+
+trail 
+
+in
+
+    add_plugins => [qw{ 
+    ...
+    trail
+    ...
+    }]
+
+in site.setup and rebuild.  It gives error
+
+    Failed to load plugin IkiWiki::Plugin::trail: Can't locate IkiWiki/Plugin/trail.pm in @IN ...
+
+"""]]
diff --git a/doc/forum/How_to_create_a_WikiLink_to_a_page_in_a_subdirectory__63__.mdwn b/doc/forum/How_to_create_a_WikiLink_to_a_page_in_a_subdirectory__63__.mdwn
new file mode 100644 (file)
index 0000000..75d98fe
--- /dev/null
@@ -0,0 +1,26 @@
+How to create a WikiLink to a page in a subdirectory?
+
+I have a page I want to create Wikilink to in 
+
+
+   website/subdir/page.mdwn
+
+
+And the wikilink I want to create should be in a page in the website root directory:
+
+
+   website/index.mdwn
+
+
+If I just write
+
+    \[[page]]
+
+it seems it will assume the page should be found at
+
+
+  website/page.mdwn
+
+and adds a question mark ? in front of the link in the generated HTML file. 
+
+How to make such a Wikilink?
diff --git a/doc/forum/How_to_create_a_WikiLink_to_a_page_in_a_subdirectory__63__/comment_1_d20ee1d8d7a3e77a445f8b887e807119._comment b/doc/forum/How_to_create_a_WikiLink_to_a_page_in_a_subdirectory__63__/comment_1_d20ee1d8d7a3e77a445f8b887e807119._comment
new file mode 100644 (file)
index 0000000..524852f
--- /dev/null
@@ -0,0 +1,11 @@
+[[!comment format=mdwn
+ username="http://smcv.pseudorandom.co.uk/"
+ nickname="smcv"
+ subject="comment 1"
+ date="2012-06-27T07:31:30Z"
+ content="""
+`\[[subdir/page]]`.
+
+IkiWiki terminology is that a page in a subdirectory is a \"subpage\".
+See [[ikiwiki/SubPage]] and [[ikiwiki/subpage/LinkingRules]] for more details.
+"""]]
diff --git a/doc/forum/How_to_disable___34__Add_a_new_post_titled:__34___submission_form__63__.mdwn b/doc/forum/How_to_disable___34__Add_a_new_post_titled:__34___submission_form__63__.mdwn
new file mode 100644 (file)
index 0000000..1443a18
--- /dev/null
@@ -0,0 +1 @@
+After setting up a blog subdirectory.  It has a input field for inputing title of a new post.  How to disable that?
diff --git a/doc/forum/How_to_disable___34__Add_a_new_post_titled:__34___submission_form__63__/comment_1_3dfa9ac6473d0d5ebc9d99ec39e96216._comment b/doc/forum/How_to_disable___34__Add_a_new_post_titled:__34___submission_form__63__/comment_1_3dfa9ac6473d0d5ebc9d99ec39e96216._comment
new file mode 100644 (file)
index 0000000..bad7739
--- /dev/null
@@ -0,0 +1,9 @@
+[[!comment format=mdwn
+ username="http://smcv.pseudorandom.co.uk/"
+ nickname="smcv"
+ subject="comment 1"
+ date="2013-09-17T07:46:01Z"
+ content="""
+Remove the `rootpage` parameter, and don't set the `postform` parameter
+to `yes` or `1`.
+"""]]
diff --git a/doc/forum/How_to_generate_blog_archive_pages_in___47__blog_subdir_but_not_ikiwiki_root_path__63__.mdwn b/doc/forum/How_to_generate_blog_archive_pages_in___47__blog_subdir_but_not_ikiwiki_root_path__63__.mdwn
new file mode 100644 (file)
index 0000000..e4901d7
--- /dev/null
@@ -0,0 +1,26 @@
+My Ikiwiki and blog has structure
+
+    /website
+    blog.mdwn
+    ...
+
+    /website/blog
+    /website/blog/blog1.mdwn
+    /website/blog/blog2.mdwn
+    ...
+
+After running
+
+    ikiwiki-calendar ./foo.setup "/blog/*"
+
+I got a
+
+   /website/archives/
+
+and archive pages in it.
+
+I'd like to have it in 
+
+   /website/blog/archives/
+
+as those are archive pages for blog pages only.  How to do it?
diff --git a/doc/forum/How_to_inline_a_page_from_another_git_repository.mdwn b/doc/forum/How_to_inline_a_page_from_another_git_repository.mdwn
new file mode 100644 (file)
index 0000000..528a48b
--- /dev/null
@@ -0,0 +1,5 @@
+I am migrating a dev site which was previously using Trac.
+
+Some of the wiki pages include RST documents from the code repository. What would be the best way to do this using ikiwiki? I would prefer not to include the full code repository in ikiwiki src as there are many source files I do not want to be processed by ikiwiki.
+
+A possible solution would be something like underlay, but for which only explicitly named files would be processed by ikiwiki.
diff --git a/doc/forum/How_to_properly_create_--_in_a_wiki_--____39__page__47__index.html__39___files.mdwn b/doc/forum/How_to_properly_create_--_in_a_wiki_--____39__page__47__index.html__39___files.mdwn
new file mode 100644 (file)
index 0000000..4b7f468
--- /dev/null
@@ -0,0 +1,17 @@
+I am trying **in a wiki** to "manually," i.e. not using the web interface, use the "page/index.html" type of page creation.
+
+In my working clone src dir I can use, in succession, commands such as:
+
+mkdir MyNewPage
+
+touch MyNewPage/index.mdwn
+
+git add MyNewPage MyNewPage/index.mdwn
+
+[here I edit the new index.mdwn]
+
+git commit -a
+
+git push
+
+These are, roughly, the steps I have taken, and they seem to work. But surely there is a more elegant, **Ikiwiki-ish** solution.
diff --git a/doc/forum/How_to_properly_create_--_in_a_wiki_--____39__page__47__index.html__39___files/comment_1_d9ee358ded5d5307ba73a8c11f81549d._comment b/doc/forum/How_to_properly_create_--_in_a_wiki_--____39__page__47__index.html__39___files/comment_1_d9ee358ded5d5307ba73a8c11f81549d._comment
new file mode 100644 (file)
index 0000000..7412aa9
--- /dev/null
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://me.yahoo.com/a/eetjWe8B34ZeUsHyFzpwC5QvBcEuVxllSvpJHw--#376d7"
+ nickname="Bob"
+ subject="SOLVED. NEVER MIND. SORRY."
+ date="2014-06-03T00:33:59Z"
+ content="""
+I get it. All I have to do is create NewPage.mdwn, add, commit, git pull and then git push, and lo and behold, NewPage/index.html is in my destination dir.
+"""]]
diff --git a/doc/forum/How_to_remove_the_linebreak_in_license.mdwn b/doc/forum/How_to_remove_the_linebreak_in_license.mdwn
new file mode 100644 (file)
index 0000000..4e43cb9
--- /dev/null
@@ -0,0 +1,11 @@
+I entered 
+
+  <small>this is my license</small>
+
+into `license.mdwn`, and it shows up as
+
+  License:
+  this is my license
+
+
+I'd like to remove the line break, ideally also the redundant `License:`.  How to do that?
diff --git a/doc/forum/How_to_rename_all_markdown_files_from___42__.mdwn_to___42__.md__63__.mdwn b/doc/forum/How_to_rename_all_markdown_files_from___42__.mdwn_to___42__.md__63__.mdwn
new file mode 100644 (file)
index 0000000..d11f7a3
--- /dev/null
@@ -0,0 +1,3 @@
+Github does not take .mdwn as Markdown files:      https://github.com/github/markup/blob/b865add2e053f8cea3d7f4d9dcba001bdfd78994/lib/github/markups.rb#L1 
+
+I'd like to use filename extensions complaint to GitHub.  My question is after renaming all markdown files from *.mdwn to *.md how do I correct all the dependencies?   Does simply committing the renamed files to the source repository suffice?
diff --git a/doc/forum/How_to_rename_all_markdown_files_from___42__.mdwn_to___42__.md__63__/comment_1_c2720ebfe56ad816f241693d9e2e5072._comment b/doc/forum/How_to_rename_all_markdown_files_from___42__.mdwn_to___42__.md__63__/comment_1_c2720ebfe56ad816f241693d9e2e5072._comment
new file mode 100644 (file)
index 0000000..c458b53
--- /dev/null
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="fr33domlover"
+ ip="85.65.55.38"
+ subject="comment 1"
+ date="2014-05-16T08:49:30Z"
+ content="""
+I don't know, but I remember there's a setting in the setup file which sets the extension for Markdown files. I would create a dummy wiki for tests, where I'd create some files with .md extension and change that setting in the setup file. Then try rebuilding the wiki and see what happens.
+
+I'm just a user, I don't know beyond that.
+"""]]
diff --git a/doc/forum/How_to_set_the_meta_author_field_from_user_name__63__.mdwn b/doc/forum/How_to_set_the_meta_author_field_from_user_name__63__.mdwn
new file mode 100644 (file)
index 0000000..e0d6829
--- /dev/null
@@ -0,0 +1,3 @@
+Several users will post to the same blog. I would like the meta "author" field to be set to their ikiwiki username automatically and attached to their posts such that they can not alter it. I imagine one could use the \<TMPL_VAR USER> variable in the "inlinepage" template, but this variable does not seem to be set. How can I accomplish that?
+
+Related question: is there a way to see all the variables which are set and their value?
diff --git a/doc/forum/How_to_set_the_meta_author_field_from_user_name__63__/comment_1_0906e1f3eb8b826a7730233b95cb5ddd._comment b/doc/forum/How_to_set_the_meta_author_field_from_user_name__63__/comment_1_0906e1f3eb8b826a7730233b95cb5ddd._comment
new file mode 100644 (file)
index 0000000..2d7c02a
--- /dev/null
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawnNqLKszWk9EoD4CDCqNXJRIklKFBCN1Ao"
+ nickname="maurizio"
+ subject="comment 1"
+ date="2012-06-22T20:33:59Z"
+ content="""
+This does not seem to be possible directly according to the discussion here: [[Possible to use meta variables in templates?]].
+
+The solution I chose in the end was to set up a template which prepares the meta and suggests the author to fill it in with his user name. Maybe the best way would be to create actually one blog per author, define a template for each author (based on the pagespec and on the lockedpages to constrain authors to write only on their blog) and then an inline page which includes all the individual blogs.
+"""]]
diff --git a/doc/forum/How_to_set_up_a_page_as_internal__63__.mdwn b/doc/forum/How_to_set_up_a_page_as_internal__63__.mdwn
new file mode 100644 (file)
index 0000000..ed77129
--- /dev/null
@@ -0,0 +1,5 @@
+I have a folder with few administrative tasks, like a page showing the comments waiting for moderation.
+
+There is no link from "normal/public" pages in my site to this administrative pages, but it doesn't prevent the possibility of any person writing down that address in the browser address-bar or finding that address in the browser navigation history.
+
+Please, is there any way or best-practice restricting the access to this kind of pages? I know that these pages will eventually ask the user to log-in as admin, but I don't want them to see this stuff.
diff --git a/doc/forum/How_to_set_up_git_repository_hook___63__.mdwn b/doc/forum/How_to_set_up_git_repository_hook___63__.mdwn
new file mode 100644 (file)
index 0000000..34bc4ac
--- /dev/null
@@ -0,0 +1,19 @@
+Hi,
+
+I want to set up hooks for Git, and I don't know how to. Is there any documentation somewhere? Basically, I'd like to do what [[/ikiwiki-makerepo]] does, but manually.
+
+Why? Because I want to have a special layout to my repository. Especially, I want to include at the root level some special files:
+
+- the nginx configuration
+- the script that installs the nginx configuration to the system
+- the script that starts the fast-cgi wrapper
+- the `ikiwiki.setup` file
+- ...
+
+And I want the ikiwiki sources to be in a subdirectory `src/` and the generated files in `out/` (where the nginx configuration points).
+
+So, what is the special `post-update` hook generated by [[/ikiwiki-makerepo]]? I noticed it was an ELF file, why not a script? What does it do?
+
+Thanks,
+
+Mildred
diff --git a/doc/forum/How_to_style_main_sidebar_and_SubPage_sidebar_differently_using_CSS__63__.mdwn b/doc/forum/How_to_style_main_sidebar_and_SubPage_sidebar_differently_using_CSS__63__.mdwn
new file mode 100644 (file)
index 0000000..09cf014
--- /dev/null
@@ -0,0 +1,13 @@
+How to style main sidebar and SubPage sidebar differently using CSS?
+
+I have a main sidebar
+
+   /sidebar.mdwn
+
+and a SubPage sidebar
+
+  /blog/sidebar.mdwn
+
+How to style the two differently using CSS?
+
+For example I'd like the sidebar shown on any page inside /blog to have a blue border and any other page outside of /blog to have a sidebar with red border.
diff --git a/doc/forum/How_to_suppress_sidebar_for_a_particular_page__63__.mdwn b/doc/forum/How_to_suppress_sidebar_for_a_particular_page__63__.mdwn
new file mode 100644 (file)
index 0000000..e34a925
--- /dev/null
@@ -0,0 +1,7 @@
+I normally want to use the sidebar, but for one particular page, if I want to suppress it, how do I do it?
+
+Putting
+
+    \[[!sidebar  content=""""""]]
+
+into the page source produces a collapsed table which is not ideal.
diff --git a/doc/forum/Howto_add_tag_from_plugin_code.mdwn b/doc/forum/Howto_add_tag_from_plugin_code.mdwn
new file mode 100644 (file)
index 0000000..a17faf7
--- /dev/null
@@ -0,0 +1,12 @@
+Hi, I want to add tags to some pages automatically (generating album images 
+and want to tag all generated pages). I managed to do so in following way:
+
+    IkiWiki::Plugin::tag::preprocess_tag(
+        page => $viewer,
+        destpage => $params{destpage},
+        map { ($_ => 1) } @tags,
+    );
+
+This works, however if some tag does not exist, it is not created. I tracked it so far that I found that the Render.pm's method gen_autofile() is not called , so it is most likely that I need to somehow trigger Render.pm's refresh()...but how can I do it?
+
+BTW: The code is modified album plugin that is in [my git](https://github.com/llipavsky/ikiwiki) 
diff --git a/doc/forum/Howto_add_tag_from_plugin_code/comment_1_c61454825874a6fe1905cb549386deb0._comment b/doc/forum/Howto_add_tag_from_plugin_code/comment_1_c61454825874a6fe1905cb549386deb0._comment
new file mode 100644 (file)
index 0000000..2122083
--- /dev/null
@@ -0,0 +1,77 @@
+[[!comment format=mdwn
+ username="http://smcv.pseudorandom.co.uk/"
+ nickname="smcv"
+ subject="comment 1"
+ date="2013-07-01T09:13:51Z"
+ content="""
+(If you want to branch from my version of album, please add my git repo
+as a remote and merge or cherry-pick the album4 branch: pasting from my
+gitweb seems to have given you some incorrect UTF-8.)
+
+The problem you have here is that for this plugin, the correct order
+for IkiWiki to do things is quite subtle. Am I right in thinking that
+the feature you want goes something like this?
+
+> To add a set of tags to every \"viewer\" page in the album, you can add
+> the tags parameter to the album:
+>
+>     \[[!album tags=\"holiday hawaii\"]]
+>
+> The individual viewers will all be tagged \"holiday\" and \"hawaii\",
+> for instance. These tags cannot be removed by editing the viewers.
+
+`preprocess_albumimage` runs twice: once in the scan stage, and once in
+the render stage. In the render stage, it's too late to add tags, because
+tags are a special form of [[ikiwiki/wikilinks]], and wikilinks have to
+be added during the scan stage to work correctly.
+
+The part of `preprocess_albumimage` after the line
+`return unless defined wantarray;` only runs in the render stage, which
+is too late. You'd need to set up the tags further up: just after the
+calls to `IkiWiki::Plugin::meta::preprocess` would be a good place.
+
+I would also suggest checking for
+`IkiWiki::Plugin::tag->can('preprocess_tag')`,
+like I do for meta - if you do that, you won't need to force the tag plugin
+to be loaded.
+
+Unfortunately, I'm still not sure that this is fully correct. Pages
+are scanned in a random order. If the `\[[!album]]` is scanned before
+a \"viewer\" page, then everything is fine: the tags are present when
+the \"viewer\" is scanned. However, if the \"viewer\" is scanned first,
+then it will get the tags that the `\[[!album]]` had in the *previous*
+IkiWiki run (if any), which are still in the index, because the
+`\[[!album]]` hasn't been re-scanned yet...
+
+Are you sure this form of the feature is what you want? You'll end up with
+a *lot* of pages with those tags. If it's what you want, it might be
+clearer how it works if you changed the syntax to something like this,
+perhaps?
+
+>
+>     \[[!album tag_all=\"holiday hawaii\"]]
+
+Another possible syntax would be to have the feature be more like this:
+
+> If you use the `tag_default` parameter to the `\[[!album]]` directive,
+> each \"viewer\" page created for images will have those tags by
+> default. Changing the `\[[!album]]` will not affect any \"viewer\"
+> pages that have already been created, and editing the \"viewer\"
+> can add or remove those default tags.
+>
+>     \[[!album tag_default=\"holiday hawaii\"]]
+
+which I think removes the ordering problems? If you go this route,
+you'd want to either add e.g. `[[!tag holiday hawaii]]`
+to the generated viewer page in `create_viewer`, or add a `tag`
+parameter to `\[[!albumimage]]` that's a shortcut for the
+tag directive, in the same way that author is a shortcut for
+`[[!meta author]]`).
+
+The purpose of the \"shortcut\" parameters in `\[[!albumimage]]`,
+like title, author and date, is that I eventually want to add
+a specialized CGI interface to this plugin so you can edit
+all the images of an album in one go; when I add that,
+it'll probably only be able to process something as
+machine-readable as `\[[!albumimage]]`.
+"""]]
diff --git a/doc/forum/I_do_not_know_anything_abut_git.mdwn b/doc/forum/I_do_not_know_anything_abut_git.mdwn
new file mode 100644 (file)
index 0000000..31358bb
--- /dev/null
@@ -0,0 +1,22 @@
+I want to learn how to use a text editor in addition to the web interface. I am stuck on pushing changes back to where they're supposed to go.
+
+I have done:
+
+    git clone Zoidwicky.git Zoidwicky.src
+
+and then, after editing sidebar.mdwn in that new Zoidwicky.src directory
+
+    git commit sidebar.mdwn
+
+Now I believe I must use git push to move that change to I am not sure where.
+
+I learn best by example. Would someone be good enough to post an example of what that 'git push" command might look like?
+
+Here are some samples of what I have tried:
+
+    $ git push sidebar.mdwn Zoidwicky.git
+    fatal: Invalid gitfile format: sidebar.mdwn
+
+    $ git push sidebar.mdwn /home/zoid/Zoidwicky.git/
+    fatal: remote part of refspec is not a valid name in   /home/zoidberg/Zoidwicky.git
+
diff --git a/doc/forum/I_do_not_know_anything_abut_git/comment_1_2efdf8563bcdeba73b11282157aba72d._comment b/doc/forum/I_do_not_know_anything_abut_git/comment_1_2efdf8563bcdeba73b11282157aba72d._comment
new file mode 100644 (file)
index 0000000..7649fee
--- /dev/null
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="http://kerravonsen.dreamwidth.org/"
+ ip="203.206.140.235"
+ subject="comment 1"
+ date="2014-05-24T23:30:43Z"
+ content="""
+Just use \"git push\" without any arguments at all.
+
+     git push
+"""]]
diff --git a/doc/forum/I_do_not_know_anything_abut_git/comment_2_3dd0fa0612a5fac785cc7d5ea23d42a5._comment b/doc/forum/I_do_not_know_anything_abut_git/comment_2_3dd0fa0612a5fac785cc7d5ea23d42a5._comment
new file mode 100644 (file)
index 0000000..18617ac
--- /dev/null
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://bob-bernstein.myopenid.com/"
+ nickname="bernstein"
+ subject="comment 2"
+ date="2014-05-25T03:39:41Z"
+ content="""
+Ah. That is simple enough even for me! Thank you so much!
+"""]]
diff --git a/doc/forum/Ikiwiki_themes_for_mobile_devices__63__.mdwn b/doc/forum/Ikiwiki_themes_for_mobile_devices__63__.mdwn
new file mode 100644 (file)
index 0000000..dc1b31c
--- /dev/null
@@ -0,0 +1,7 @@
+Has anyone else created ikiwiki themes for mobile devices like phones and tablets?
+
+I've been using Blueview theme for a few years and finally tried to adapt the theme for my phone.
+My local.css is [here](http://mcfrisk.kapsi.fi/local.css), and my hobby web page full of images and videos [here](http://mcfrisk.kapsi.fi/skiing/).
+
+Previously I also had problems like wasted screen space, big minimum width and images not scaled down to the CSS element. Those got fixed as well.
+Would be nice if others could test that and maybe share their setups.
diff --git a/doc/forum/Include_attachment_in_a_page.mdwn b/doc/forum/Include_attachment_in_a_page.mdwn
new file mode 100644 (file)
index 0000000..e4a5a53
--- /dev/null
@@ -0,0 +1,9 @@
+Is there any way of embedding an attachment in a page - like, when I upload a picture, I would like to have it showing on a page.... I tried the Markdown image syntax like this:
+
+    ![Alt text](/path/to/img.jpg "Optional title")
+
+But if you upload a PDF, f.ex., there will be a "broken URL/no image" thumbnail, although the link to the uploaded file works correctly, if entered correctly.
+
+So if it's just an image I want to embed, then I would want to use HTML syntax directly, I guess. (Like stated [[here|http://daringfireball.net/projects/markdown/syntax#img]].) But in case it's some other type of attachment it would be nice to be able to have some specific include syntax or the like.
+
+Probably a feature for the "attachment" plugin's wishlist!?
diff --git a/doc/forum/Include_attachment_in_a_page/comment_1_275aad6ca3b2972749b7f6636b130035._comment b/doc/forum/Include_attachment_in_a_page/comment_1_275aad6ca3b2972749b7f6636b130035._comment
new file mode 100644 (file)
index 0000000..a6f9956
--- /dev/null
@@ -0,0 +1,12 @@
+[[!comment format=mdwn
+ username="http://jmtd.net/"
+ nickname="Jon Dowland"
+ subject="comment 1"
+ date="2012-04-02T12:51:33Z"
+ content="""
+Forgive me if I don't fully understand the question, but:
+
+ * the attachment functionality includes a button \"Insert Links\" which, on the edit form for a page, inserts the correct markup to link to the attachment, which addresses the general case
+
+ * For images which you want inline, you could convert the basic wikilink e.g. `\[[foo.png]]` into a call to the [[plugins/img]] plugin e.g. `\[[!img foo.png]]`
+"""]]
diff --git a/doc/forum/Multiple_urls.mdwn b/doc/forum/Multiple_urls.mdwn
new file mode 100644 (file)
index 0000000..03125d2
--- /dev/null
@@ -0,0 +1,8 @@
+Hi,
+Is there a way of making a given ikiwiki instance accessible both from the LAN where it's server is and from the WAN?
+
+Say I have ikiwiki installed on a server connected to a router. That router has  port forwarding and dyndns configured so I could open ikiwiki from outside the LAN. Trying to open normal ikiwiki pages, from outside the LAN, or with a proxy, works. However, the Editing and Preferences pages, for example, redirect to http://192.168.x.x/~username/ikiwiki/ikiwiki.cgi?page=posts%2Fhello_world&do=edit (in the case of the edit page), which of course only exists inside the LAN, and fails loading.
+
+Editing the "url" and "cgiurl" directives in the .setup file to point to the dyndns address makes it work from the outside, but I can't edit the pages from inside the LAN anymore with this configuration. The normal pages, once again, are accessible. Edit or Preferences, on the other hand, redirect to the public address, which I can't open from inside the same LAN it points to.
+
+For this reason I ask, is there an way to have multiple urls point to the same ikiwiki page, namely a LAN IP url and a public IP one? Thanks in advance.
diff --git a/doc/forum/Multiple_urls/comment_1_e4c1256346d5a421161c20e344d8bada._comment b/doc/forum/Multiple_urls/comment_1_e4c1256346d5a421161c20e344d8bada._comment
new file mode 100644 (file)
index 0000000..9806f53
--- /dev/null
@@ -0,0 +1,22 @@
+[[!comment format=mdwn
+ username="http://kerravonsen.dreamwidth.org/"
+ ip="60.241.8.244"
+ subject="A Few Ways To Do This"
+ date="2012-10-09T02:02:09Z"
+ content="""
+I don't think one can alter IkiWiki to have multiple URLs, because the URL is built in to the CGI when the CGI is generated.
+
+1. Use the external hostname (say, foo.com) for the URL, and tell your local machine that foo.com has an IP of 192.168.x.x, thus making it accessible from within the LAN.
+2. Give the URL as a relative-absolute URL; that is, rather than \"http://foo.com/ikiwiki.cgi\" give it as \"/ikiwiki.cgi\". This doesn't always work, though.
+3. Build two versions of the site from the same git repo. One for access from inside, and one for access from outside. Both setup files would need to be identical, apart from
+
+    * the destination directory
+    * the URLs
+    * the git-update file name; one would need to call it something other than post-update.
+    
+    Then one would make a new \"post-update\" file which calls *both* of the ikiwiki post-update scripts, so that both versions of the site are updated when you make a change.
+    Then set up your web-server to point to the \"external\" directory for the external site, and the \"internal\" directory for the internal site; easy enough to do if you use virtual hosts.
+
+Yes, I know the third one is somewhat complex... I use the idea myself in order to make two versions of a site where one is editable and the other is not, but that's not what you're aiming for, I know.
+
+"""]]
diff --git a/doc/forum/Need_something_more_powerful_than_Exclude/comment_5_39b01857f7e0b388a6e7a3c1cf5388d5._comment b/doc/forum/Need_something_more_powerful_than_Exclude/comment_5_39b01857f7e0b388a6e7a3c1cf5388d5._comment
new file mode 100644 (file)
index 0000000..17228b8
--- /dev/null
@@ -0,0 +1,9 @@
+[[!comment format=mdwn
+ username="http://tbm.myopenid.com/"
+ ip="188.222.45.200"
+ subject="Still there?"
+ date="2012-03-20T18:35:41Z"
+ content="""
+Joey, I believe I see the same problem with 3.20120202.  I add foo.mdwn, run ikiwiki --setup ikiwiki.setup, add \"exclude: foo\", run --setup again and it still says \"building foo.mdwn\".
+
+"""]]
diff --git a/doc/forum/Need_something_more_powerful_than_Exclude/comment_6_1dccdfebad31446200213a2cae25f0e2._comment b/doc/forum/Need_something_more_powerful_than_Exclude/comment_6_1dccdfebad31446200213a2cae25f0e2._comment
new file mode 100644 (file)
index 0000000..d93684d
--- /dev/null
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawkiulxucQx_YZQZUVJdNF6oMaZwWb8JF2M"
+ nickname="Martin"
+ subject="Reproduced"
+ date="2012-07-25T02:23:13Z"
+ content="""
+I also encountered this bug (having to delete indexdb) in 3.20120629.
+
+-- Martin
+"""]]
diff --git a/doc/forum/Parent_Links_all_link_to_root.mdwn b/doc/forum/Parent_Links_all_link_to_root.mdwn
new file mode 100644 (file)
index 0000000..b9c4c8e
--- /dev/null
@@ -0,0 +1,18 @@
+My parent links all link to the root instead of to the appropriate index.mdwn. Is this a sign of a broken link pre-compile? Is there some setting that controls this? 
+
+<code>
+\<span class="parentlinks">
+
+\<a href="../../../">root\</a>/ 
+
+\<a href="../../../">level1\</a>/ 
+
+\<a href="../../../">level2\</a>/ 
+
+\</span>
+</code>
+
+Thanks,
+Sean
+
+ikiwiki version 3.20100722 - Pretty plain Jane install
diff --git a/doc/forum/Parent_Links_all_link_to_root/comment_1_4b5ed25cceb7740f64ee08aba00a1d91._comment b/doc/forum/Parent_Links_all_link_to_root/comment_1_4b5ed25cceb7740f64ee08aba00a1d91._comment
new file mode 100644 (file)
index 0000000..656cc0f
--- /dev/null
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="4.154.4.117"
+ subject="comment 1"
+ date="2012-06-03T17:11:11Z"
+ content="""
+All I can think is that you must have modified the `page.tmpl` template and broken the url inside the parenlinks loop somehow. 
+"""]]
diff --git a/doc/forum/Problem_with_gitweb/comment_3_6a5b96f7e0d6b169c090e3df7281d938._comment b/doc/forum/Problem_with_gitweb/comment_3_6a5b96f7e0d6b169c090e3df7281d938._comment
new file mode 100644 (file)
index 0000000..c8bbe9b
--- /dev/null
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawk_MMtLPS7osC5MjX00q2ATjvvXPWqm0ik"
+ nickname="micheal"
+ subject="comment 3"
+ date="2012-03-27T17:35:49Z"
+ content="""
+Any ideas???
+"""]]
diff --git a/doc/forum/Problem_with_gitweb/comment_5_8a79b879205bd265d54e30f0eee2ac63._comment b/doc/forum/Problem_with_gitweb/comment_5_8a79b879205bd265d54e30f0eee2ac63._comment
new file mode 100644 (file)
index 0000000..242ce89
--- /dev/null
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawk_MMtLPS7osC5MjX00q2ATjvvXPWqm0ik"
+ nickname="micheal"
+ subject="comment 5"
+ date="2012-03-29T18:55:37Z"
+ content="""
+Solved by `sudo chmod a+x /home/myuser`
+"""]]
diff --git a/doc/forum/Problem_with_local_git_commit.mdwn b/doc/forum/Problem_with_local_git_commit.mdwn
new file mode 100644 (file)
index 0000000..e9dfdb4
--- /dev/null
@@ -0,0 +1,42 @@
+I have a problem when I edit my wiki with a text editor and use just git to commit. 
+
+Suppose `iki` is my scrdir and `iki.git` my repository. Then I did `git clone iki.git myiki` to get a copy. Then I do 
+
+    cd myiki 
+    echo "test" >> somepage.mdwm"
+    git add somepage.mdwm
+    git pull 
+    git commit -m "test"
+    git push
+
+Then I get the following error message
+
+    Counting objects: 5, done.        
+    Delta compression using up to 2 threads.
+    Compressing objects: 100% (2/2), done.
+    Writing objects: 100% (3/3), 287 bytes, done.
+    Total 3 (delta 1), reused 0 (delta 0)
+    Unpacking objects: 100% (3/3), done.
+    remote: From /home/myuser/iki
+    remote:    32bb6be..1f3a647  master     -> origin/master
+    remote: There are no candidates for merging among the refs that you just fetched.
+    remote: Generally this means that you provided a wildcard refspec which had no
+    remote: matches on the remote end.
+    remote: 'git pull --prune origin' failed:  at /usr/share/perl5/IkiWiki/Plugin/git.pm line 207.
+    remote: skipping bad filename local.css~
+    remote: skipping bad filename #tex_sandbox.mdwn#
+    To /home/myuser/iki.git
+       32bb6be..1f3a647  master -> master
+
+When I check the repository via gitk I see that everything seems to be ok, if I check the scrdir the same way origin master is one step away from master and the change doesn't appear on the iki web page. Then I tried to do a `sudo git pull --prune origin master` in my scrdir which sets master to the head, but the change isn't there anyway. It foremost appears when I do a second change as above or if I do `sudo ikiwiki --setup iki.setup`.
+
+By the way the setup gives me a similar error message:
+
+    successfully generated /var/www/iki/ikiwiki.cgi  
+    successfully generated /home/myuser/iki.git/hooks/post-update
+    There are no candidates for merging among the refs that you just fetched.
+    Generally this means that you provided a wildcard refspec which had no
+    matches on the remote end.
+    'git pull --prune origin' failed:  at /usr/share/perl5/IkiWiki/Plugin/git.pm line 207.
+
+Any ideas what may be wrong here and how to fix this?
diff --git a/doc/forum/Refresh_or_recreate_style.css__63__.mdwn b/doc/forum/Refresh_or_recreate_style.css__63__.mdwn
new file mode 100644 (file)
index 0000000..262b0e3
--- /dev/null
@@ -0,0 +1,40 @@
+I was trying to use plain blueview theme but that's not what I see in the installed style.css:
+
+    ~/src/ikiwiki/themes/blueview$ grep bzed style.css
+    /*    bzed theme for ikiwiki
+    ~/src/ikiwiki/themes/blueview$ wc -l style.css
+    281 style.css
+    $ grep bzed ~/www/style.css
+    /*    bzed theme for ikiwiki
+    /*    bzed theme for ikiwiki
+    /*    bzed theme for ikiwiki
+    /*    bzed theme for ikiwiki
+    /*    bzed theme for ikiwiki
+    /*    bzed theme for ikiwiki
+    /*    bzed theme for ikiwiki
+    /*    bzed theme for ikiwiki
+    /*    bzed theme for ikiwiki
+    /*    bzed theme for ikiwiki
+    $ wc -l ~/www/style.css
+    7913
+
+I have installed ikiwiki to my home directory on the shared server and it seems the big css file is there too:
+
+    $ grep bzed ~/bin/share/ikiwiki/themes/blueview/style.css 
+    /*    bzed theme for ikiwiki
+    /*    bzed theme for ikiwiki
+    /*    bzed theme for ikiwiki
+    /*    bzed theme for ikiwiki
+    /*    bzed theme for ikiwiki
+    /*    bzed theme for ikiwiki
+    /*    bzed theme for ikiwiki
+    /*    bzed theme for ikiwiki
+    /*    bzed theme for ikiwiki
+    /*    bzed theme for ikiwiki
+    $ wc -l ~/bin/share/ikiwiki/themes/blueview/style.css 
+    7913
+
+Is the style.css really supposed to be that big?
+If not, how to create it from scratch?
+
+Reason why I'm debugging the css is that I'd like to make it better on small handset screens, like drop all margins, inline or hide sidebar etc. Chromium shows that the processed css is quite a mess.
diff --git a/doc/forum/Refresh_or_recreate_style.css__63__/comment_1_3274be931d0b543c7f7cf641810817aa._comment b/doc/forum/Refresh_or_recreate_style.css__63__/comment_1_3274be931d0b543c7f7cf641810817aa._comment
new file mode 100644 (file)
index 0000000..608dca0
--- /dev/null
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://mcfrisk.myopenid.com/"
+ nickname="mikko.rapeli"
+ subject="bug/feature in Makefile.PL"
+ date="2013-03-30T11:53:41Z"
+ content="""
+Theme style.css files were appended when installing in Makefile.PL. IMO overwriting the destination files is more correct. Sent a patch to Joey.
+"""]]
diff --git a/doc/forum/Remove_tags_and_backlinks_on_particular_pages__63__.mdwn b/doc/forum/Remove_tags_and_backlinks_on_particular_pages__63__.mdwn
new file mode 100644 (file)
index 0000000..ca99b24
--- /dev/null
@@ -0,0 +1,3 @@
+Hello,
+
+I would like to use !taglink to create a series of links, which are also tags, in the main part of my wikipages.  But since these will already be on the page, there's no need to have them at the bottom of the page.  Is there any way to turn off the display of tags (and also of backlinks) at the bottom of the page?  I understand I could just delete the sections from page.tmpl but wondered if there was a more elegant way to do it.  Thanks.
diff --git a/doc/forum/Right-to-left_support.mdwn b/doc/forum/Right-to-left_support.mdwn
new file mode 100644 (file)
index 0000000..7ca4f9a
--- /dev/null
@@ -0,0 +1,15 @@
+Does ikiwiki support RTL languages? I read somewhere it does, but I don't see
+any mention of that here (or anywhere else... that info may be wrong).
+
+I'd like to add RTL support to my wiki, for text direction and maybe for the
+page layout too. Before I edit my CSS, page.tmpl and possibly Perl for
+automatic direction setting - does ikiwiki support this in any way?
+
+On my wiki (ikiwiki version from Debian 7 stable) everything is aligned to
+the left, and unicode RTL characters cannot change that - the .tmpl and
+css files would need to be changed, it seems.
+
+I will happily share my insights and code, if I manage to get anything
+useful to work :-)
+
+--[[fr33domlover]]
diff --git a/doc/forum/Right-to-left_support/comment_1_5b2bf4d037ae8db940296e6f58884927._comment b/doc/forum/Right-to-left_support/comment_1_5b2bf4d037ae8db940296e6f58884927._comment
new file mode 100644 (file)
index 0000000..1e9558f
--- /dev/null
@@ -0,0 +1,21 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawmfcr1X7TXwuCju7vCBG6vii455SX1Qxro"
+ nickname="Mesar"
+ subject="comment 1"
+ date="2014-08-30T17:53:53Z"
+ content="""
+Hi,
+
+You need ikiwiki 3.20140227 or newer, which includes the patch to expose the language code/direction see [[todo/expose_html_language_and_direction/]]
+After which you need to modify the templates to make use of the tags.
+
+I'm currently running this on http://addons.nvda-project.org
+The config/templates can be [found here](https://bitbucket.org/nvdaaddonteam/ikiwiki-ctl)
+
+I haven't investigated how this functions when the po plugin is disabled, but I am guessing that you can simply enable the po plugin, define your master language, and miss out any slave languages.
+
+I would be intrested to hear feedback/what you got to work, as we are a bunch of blind people running the project above, so the correct markup was the goal in our case, I haven't had any feedback on its visual appearance.
+
+
+--[[mhameed]]
+"""]]
diff --git a/doc/forum/See_rendered_old_revisions_via_pagehistory.mdwn b/doc/forum/See_rendered_old_revisions_via_pagehistory.mdwn
new file mode 100644 (file)
index 0000000..465746e
--- /dev/null
@@ -0,0 +1 @@
+Via `historyurl` and `gitweb` I can view the markdown source of old revisions of a page (by clicking on `blob` in `gitweb`). Is it also possible to see the rendered versions of this old revisions directly (i.e. such they would be rendered by ikiwiki, not only the markdown source)?
diff --git a/doc/forum/Setting_http__95__proxy.mdwn b/doc/forum/Setting_http__95__proxy.mdwn
new file mode 100644 (file)
index 0000000..3bf8a76
--- /dev/null
@@ -0,0 +1,22 @@
+Hi! My wiki is behind a proxy and, as I understood looking in the web, I need to set the environment variables using ENV inside the wiki's config.
+
+So far I tried:
+
+ENV: {
+  http_proxy => 'http://proxy.uns.edu.ar:1280/',
+  https_proxy => 'http://proxy.uns.edu.ar:1280/'
+}
+
+without luck, as I get:
+
+
+YAML::XS::Load Error: The problem:
+
+    found unexpected ':'
+
+was found at document: 1, line: 85, column: 22
+while scanning a plain scalar at line: 85, column: 3
+usage: ikiwiki [options] source dest
+       ikiwiki --setup configfile
+
+What am I missing? (maybe learning perl?)
diff --git a/doc/forum/Setting_http__95__proxy/comment_1_350a7c4834c9f422e107b646cdbae3b0._comment b/doc/forum/Setting_http__95__proxy/comment_1_350a7c4834c9f422e107b646cdbae3b0._comment
new file mode 100644 (file)
index 0000000..3623652
--- /dev/null
@@ -0,0 +1,20 @@
+[[!comment format=mdwn
+ username="http://smcv.pseudorandom.co.uk/"
+ nickname="smcv"
+ subject="comment 1"
+ date="2012-10-10T13:45:10Z"
+ content="""
+If your wiki configuration is written in YAML (it says IkiWiki::Setup::Yaml near the top), the correct syntax is something like
+
+    ENV:
+      http_proxy: http://proxy.uns.edu.ar:1280/
+      https_proxy: http://proxy.uns.edu.ar:1280/
+
+or
+
+    ENV: { http_proxy: 'http://proxy.uns.edu.ar:1280/', https_proxy: 'http://proxy.uns.edu.ar:1280/' }
+
+(many variations are possible, see <http://www.yaml.org/>).
+
+The syntax you quoted is correct for Perl-syntax setup files (which will mention IkiWiki::Setup::Standard near the top), but not YAML ones.
+"""]]
diff --git a/doc/forum/Slow_ikiwiki_after_first_run.mdwn b/doc/forum/Slow_ikiwiki_after_first_run.mdwn
new file mode 100644 (file)
index 0000000..db07f6d
--- /dev/null
@@ -0,0 +1 @@
+I have local ikiwiki on my notebook. When I save an edit the first time after booting and logging in, saving is very slow. Any idea how to fix this?
diff --git a/doc/forum/Spaces_in_URLs.mdwn b/doc/forum/Spaces_in_URLs.mdwn
new file mode 100644 (file)
index 0000000..4749f4d
--- /dev/null
@@ -0,0 +1,14 @@
+There is one file on my site that had a space in the name;
+on my old site, this link worked:
+[http://dada.pink/scarsdale/Statement 20140527.pdf](http://dada.pink/scarsdale/Statement 20140527.pdf)
+
+Now that I've moved to Ikiwiki, that doesn't work. So I moved the file here:
+[http://dada.pink/scarsdale/Statement_20140527.pdf](http://dada.pink/scarsdale/Statement_20140527.pdf)
+
+Is there a better approach to maintaining this link than setting an alias in Apache?
+
+> You can add the space character to the `wiki_file_chars` argument in your setup file. -- [[Jon]]
+
+>> a space character is not allowed in a url; user agents that read one usually represent it in percent encoded form (`%20`). if you use that, things also work for direct links, which i assume caused the problem (for both the links in the original description render correctly): `\[[http://dada.pink/scarsdale/Statement%2020140527.pdf]]` renders [[http://dada.pink/scarsdale/Statement%2020140527.pdf]].
+>>
+>> spaces are allowed in internal pages because wiki page names are not urls per se but converted using conversion rules -- this allows people to not think about url rules and just link to pages, but when you're linking outside ikiwiki, some strings just aren't valid urls. --[[chrysn]]
diff --git a/doc/forum/Template_variables.mdwn b/doc/forum/Template_variables.mdwn
new file mode 100644 (file)
index 0000000..f0a8fe8
--- /dev/null
@@ -0,0 +1,20 @@
+Hi,
+
+I am very confused with the template variables. I cannot find any documentation of which ones are available, where are they set, etc.
+
+I see that in the default templates, there are things like this (rssitem.tmpl): 
+
+    <TMPL_IF AUTHOR>
+        <title><TMPL_VAR AUTHOR ESCAPE=HTML>: <TMPL_VAR TITLE></title>
+        <dcterms:creator><TMPL_VAR AUTHOR ESCAPE=HTML></dcterms:creator>
+    <TMPL_ELSE>
+        <title><TMPL_VAR TITLE></title>
+    </TMPL_IF>
+
+But I don't get this in my RSS, and I don't know how to add those variables, except for mentions of some plugins that are not yet merged.
+
+I also see that the 'author' data is one of the fields that can be set with the meta directive, but I understand that meta is processed after the templates, so it cannot be the source; right?
+
+Any help appreciated!
+
+PS: what I am tring to do now is to add a proper author field to my feeds, but I also want to understand how to use the templating system.
diff --git a/doc/forum/Template_variables/comment_1_6a2ab9450dbfb8c4ef78e7af2a1b51eb._comment b/doc/forum/Template_variables/comment_1_6a2ab9450dbfb8c4ef78e7af2a1b51eb._comment
new file mode 100644 (file)
index 0000000..5f5ce1f
--- /dev/null
@@ -0,0 +1,11 @@
+[[!comment format=mdwn
+ username="http://tincho.org/"
+ nickname="tincho"
+ subject="Update"
+ date="2013-10-02T05:40:59Z"
+ content="""
+well, it seems that if I do set up the author and authorurl meta variables in the index.mdwn, I get the author in the ATOM feed file. I don't know why, if it is because the feed creation is invoked from that page or if it is automagically taken from the main page.
+
+At the same time, the rss feed does not get the author, even if the default template should have included it for each item in the feed.
+
+"""]]
diff --git a/doc/forum/Template_variables/comment_2_9b366736171e45d5afd8247ff38501d1._comment b/doc/forum/Template_variables/comment_2_9b366736171e45d5afd8247ff38501d1._comment
new file mode 100644 (file)
index 0000000..30b4a7e
--- /dev/null
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawlcaGfdn9Kye1Gc8aGb67PDVQW4mKbQD7E"
+ nickname="Amitai"
+ subject="comment 2"
+ date="2013-11-05T19:18:10Z"
+ content="""
+What version of ikiwiki are you running? [[news/Version 3.20130904]] introduced some changes to the RSS and Atom templates that may help you.
+"""]]
diff --git a/doc/forum/Template_variables/comment_3_727f8a407dc57e4abf48cdcec4ead666._comment b/doc/forum/Template_variables/comment_3_727f8a407dc57e4abf48cdcec4ead666._comment
new file mode 100644 (file)
index 0000000..d26bc2f
--- /dev/null
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://tincho.startssl.com/"
+ nickname="tincho"
+ subject="comment 3"
+ date="2013-11-05T19:35:45Z"
+ content="""
+I am using the same version as you say. And the entry template has a place for author that does not get populated. The page template does not, on the other hand.
+"""]]
diff --git a/doc/forum/The_requested_URL___47____126__jean__47__blog__47__ikiwiki.cgi_was_not_found_on_this_server./comment_8_098bb7a3112751a7e6167483dde626bb._comment b/doc/forum/The_requested_URL___47____126__jean__47__blog__47__ikiwiki.cgi_was_not_found_on_this_server./comment_8_098bb7a3112751a7e6167483dde626bb._comment
new file mode 100644 (file)
index 0000000..ff0d79d
--- /dev/null
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="http://andrewspiers.pip.verisignlabs.com/"
+ ip="118.209.91.42"
+ subject="passing environment variables."
+ date="2012-08-24T03:47:07Z"
+ content="""
+I am getting this 'Error: \"do\" parameter missing' when trying to log in as well. I am using Apache and Firefox. The Apache error log says \"Died at /usr/share/perl5/IkiWiki/CGI.pm line 428.\" when it dies.
+
+I do have ssl set up, not sure if this is part of the problem?
+"""]]
diff --git a/doc/forum/The_requested_URL___47____126__jean__47__blog__47__ikiwiki.cgi_was_not_found_on_this_server./comment_9_fbf403255c38da93caa5b98589fbb285._comment b/doc/forum/The_requested_URL___47____126__jean__47__blog__47__ikiwiki.cgi_was_not_found_on_this_server./comment_9_fbf403255c38da93caa5b98589fbb285._comment
new file mode 100644 (file)
index 0000000..53c44d1
--- /dev/null
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://andrewspiers.pip.verisignlabs.com/"
+ ip="118.209.91.42"
+ subject="comment 9"
+ date="2012-08-24T04:29:06Z"
+ content="""
+SSL was the problem, it was necessary to specify https:// in the url=> and cgiurl=> parameters in ikiwiki.setup, the redirect wasn't working otherwise.
+"""]]
diff --git a/doc/forum/Trail_plugin_links_with_Actiontabs_theme.mdwn b/doc/forum/Trail_plugin_links_with_Actiontabs_theme.mdwn
new file mode 100644 (file)
index 0000000..decaaa1
--- /dev/null
@@ -0,0 +1,47 @@
+I'm using the trail plugin with the actiontabs theme, and the prev/next links
+seem to appear in a strange way on the page.
+
+I use modified CSS, but it changes just the colors and some font sizes.
+Nothing related to positions and trails.
+
+Here's an example - the top prev/next links appear above the action tabs.
+Is this normal? I'm using the ikiwiki version from Debian 7 stable.
+
+- If you use OpenNIC: <http://www.partager.null/tools/systems/admin-guides/ssl/Preparing_the_Tools/>
+- If you don't (will work only until the IP changes): <http://85.65.55.38/tools/systems/admin-guides/ssl/Preparing_the_Tools/>
+
+I can look at the CSS and try to figure this out, but I don't know much CSS or
+how the trail plugin works. If anyone uses trails, especially with actiontabs, and
+can help me - it will be great.
+
+Thanks in advance!
+
+--[[fr33domlover]]
+
+> I looked at the file *page.tmpl* and it seems I may be able to change
+> the trail link location if I edit that file. Would it be a good/possible solution to
+> edit it and put it in the git repo to be used instead of the default one?
+>
+> --[[fr33domlover]]
+
+>> That's how I intended trails to look with actiontabs:
+>> <http://actiontabs.hosted.pseudorandom.co.uk/posts/second_post/> is
+>> another example.
+>>
+>> With the way the actiontabs theme works, if you want to move the
+>> trail bits down into the content area (white background in the
+>> unedited theme) you might have to alter both `page.tmpl`
+>> and the actiontabs CSS. You'll see that the actiontabs CSS
+>> has a special case for trails, because the tabs and the trail
+>> links would overlap otherwise - you might have to remove
+>> that special case. --[[smcv]]
+
+>>> Thanks, I'll try that. But I've been using those trails in the last
+>>> several hours and I'm beginning to get used to the current
+>>> layout. Maybe I'll just keep it :-)
+>>>
+>>> (Anyway the way trail links look on my wiki is valid, it's exactly
+>>> like on your link, only with different colors. I suppose it's
+>>> just a cosmetic issue then)
+>>>
+>>> --[[fr33domlover]]
diff --git a/doc/forum/Translating_ikiwiki_interface.mdwn b/doc/forum/Translating_ikiwiki_interface.mdwn
new file mode 100644 (file)
index 0000000..747af15
--- /dev/null
@@ -0,0 +1,8 @@
+I am using ikiwiki for a spanish language wiki. I've read the [[translation]] page and [[plugins/po]] plugin page but it is not completely clear to me. As I understand it the po plugin is the recommended way to create translated versions of existing pages in your wiki based on a master language.  But I actually don't need that as myself and other users already edit the wiki in spanish.  What I would actually like is to have the ikiwiki interface itself translated into spanish. 
+Is it possible to have my wiki always appear in spanish? I can see that the debian package already includes po files for spanish.  How do i activate the spanish translation permanently? Did I miss something obvious?
+
+> Ikiwiki has a Spanish translation of much of the program's output.
+> However, there is currently no translation of the page.tmpl and other
+> templates that are used to build your wiki. You can of course modify
+> these and translate them yourself, but we have no way to maintaining
+> those translations in po files. --[[Joey]]
diff --git a/doc/forum/Using_reverse_proxy__59___base_URL_is_http_instead_of_https.mdwn b/doc/forum/Using_reverse_proxy__59___base_URL_is_http_instead_of_https.mdwn
new file mode 100644 (file)
index 0000000..0e606dd
--- /dev/null
@@ -0,0 +1,55 @@
+Hello.
+
+My setup is as follows: I am running Debian on a VPS. I am using the reverse proxy pound, among other things, to provide SSL support for the webserver thttpd, which is serving the ikiwiki pages and running the ikiwiki CGI. The wiki is only accessible through https.
+
+I recently upgraded from squeeze to wheezy. This broke page editing. It seems that the edit pages now include a base url that points to an http address, instead of the https address specified in the config. I guess this is a result of the changes discussed here:
+
+[[http://ikiwiki.info/todo/want_to_avoid_ikiwiki_using_http_or_https_in_urls_to_allow_serving_both/]]
+
+Because of the reverse proxy, I suppose that, as far as the webserver is concerned, it is receiving an http (rather than https) request. I don't think it's at all SSL-aware. So I don't think there's any way the webserver could tell the CGI that it's actually being accessed via https. (Feel free to correct me on this point if you are more knowledgeable about reverse proxies, HTTP and SSL. I see that, according to the Wikipedia page for thttpd, it doesn't pass on the X-Forwarded-For HTTP header to CGI scripts, but I don't see how that would be useful in detecting this anyhow.)
+
+If ikiwiki's new behaviour is intentional, rather than a bug in ikiwiki or an error in my configuration, is there some option I can set or plugin I can enable to make it honour the URLs explicitly stated in my configuration? My current solution is to revert to the old version of ikiwiki from Debian Squeeze.
+
+I see that a number of people have had vaguely similar problems from other bugs/forum posts. This person seems to be someone having the reverse problem, of the base URL being https instead of http:
+
+[[http://ikiwiki.info/forum/CGI_script_and_HTTPS/]]
+
+This person is also using a reverse proxy, and has problems with setting the base, but I think this is a feature request rather than a regression:
+
+[[http://ikiwiki.info/bugs/trouble_with_base_in_search/]]
+
+This one sounds most like my situation:
+
+[[http://ikiwiki.info/forum/Dot_CGI_pointing_to_localhost._What_happened__63__/]]
+
+There is a comment here that hints at a workaround. Am I right in reading this as a suggestion to patch the source? Is that the official recommended solution?
+
+-- Martin.
+
+---
+
+From my .setup (domains changed):
+
+        srcdir => '/home/myusername/wiki',
+        # where to build the wiki
+        destdir => '/var/www/secure.example.com/wiki',
+        # base url to the wiki
+        url => 'https://secure.example.com/wiki',
+        # url to the ikiwiki.cgi
+        cgiurl => 'https://secure.example.com/cgi-bin/wiki/ikiwiki.cgi',
+        # filename of cgi wrapper to generate
+        cgi_wrapper => '/var/www/secure.example.com/cgi-bin/wiki/ikiwiki.cgi',
+        # mode for cgi_wrapper (can safely be made suid)
+        cgi_wrappermode => '06755',
+
+Old base in an edit page:
+
+    <base href="https://secure.example.com/wiki/" />
+
+New base in an edit page, after upgrading ikiwiki package, but before regenerating wrapper:
+
+    <base href="http://localhost/wiki/" />
+
+New base in an edit page, after regenerating wrapper:
+
+    <base href="http://secure.example.com/wiki/" />
diff --git a/doc/forum/Using_reverse_proxy__59___base_URL_is_http_instead_of_https/comment_1_ef4be9e70bd6d8c970fd8982f525d2d0._comment b/doc/forum/Using_reverse_proxy__59___base_URL_is_http_instead_of_https/comment_1_ef4be9e70bd6d8c970fd8982f525d2d0._comment
new file mode 100644 (file)
index 0000000..acbcea5
--- /dev/null
@@ -0,0 +1,21 @@
+[[!comment format=mdwn
+ username="http://smcv.pseudorandom.co.uk/"
+ nickname="smcv"
+ subject="comment 1"
+ date="2013-12-20T09:54:51Z"
+ content="""
+One way to solve this would be a new `$config{hard_code_urls}`
+option whose semantics are \"you're behind a reverse proxy, hard-code
+`$config{cgiurl}` and `${url}` in output rather than using the
+address from the HTTP request\" (in other words, selectively undo some
+of the automatic self-referential URL detection).
+
+Another possibility would be to avoid using `<base>`, and when producing
+CGI pages, make all links look like `/sandbox/` or
+`/cgi-bin/ikiwiki.cgi?...`; but that can only work if your content and
+CGI are on the same domain, and is likely to be more complex.
+
+The `<base href>` is required to be an absolute URI (including the
+protocol and domain name) so the CGI output can't avoid doing a certain
+amount of hard-coding, unfortunately.
+"""]]
diff --git a/doc/forum/Using_reverse_proxy__59___base_URL_is_http_instead_of_https/comment_2_00fee67cc30b7c337710b37c27216a68._comment b/doc/forum/Using_reverse_proxy__59___base_URL_is_http_instead_of_https/comment_2_00fee67cc30b7c337710b37c27216a68._comment
new file mode 100644 (file)
index 0000000..26674f9
--- /dev/null
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawn1IY7Q6CUIdfPRp2foUdFSIKgaPpMI934"
+ nickname="Martin"
+ subject="comment 2"
+ date="2013-12-23T20:52:17Z"
+ content="""
+I think the option to treat the URLs in the config as hard-coded (effectively ignoring the address from the HTTP request) would be most useful.
+"""]]
diff --git a/doc/forum/Using_reverse_proxy__59___base_URL_is_http_instead_of_https/comment_3_f402fb426e0460ce927b7847246f699f._comment b/doc/forum/Using_reverse_proxy__59___base_URL_is_http_instead_of_https/comment_3_f402fb426e0460ce927b7847246f699f._comment
new file mode 100644 (file)
index 0000000..8b976fa
--- /dev/null
@@ -0,0 +1,19 @@
+[[!comment format=mdwn
+ username="amcalvo"
+ ip="78.53.114.169"
+ subject="Workaround for Nginx"
+ date="2014-05-05T21:49:10Z"
+ content="""
+Thank you for the analysis. I have worked around the issue by using the <http://wiki.nginx.org/HttpSubModule>, something like:
+
+~~~
+location {
+    # Proxy stuff...
+    sub_filter 'http://example.com' 'https://example.com';
+
+}
+~~~
+
+Best regards,
+amc.
+"""]]
diff --git a/doc/forum/Using_reverse_proxy__59___base_URL_is_http_instead_of_https/comment_4_db726bc81ec5feac76d17ea81f0f80a5._comment b/doc/forum/Using_reverse_proxy__59___base_URL_is_http_instead_of_https/comment_4_db726bc81ec5feac76d17ea81f0f80a5._comment
new file mode 100644 (file)
index 0000000..d0b2952
--- /dev/null
@@ -0,0 +1,13 @@
+[[!comment format=mdwn
+ username="amcalvo"
+ ip="78.53.114.169"
+ subject="comment 4"
+ date="2014-05-05T21:56:36Z"
+ content="""
+A correction to the above comment, one needs activate multiple replacements:
+
+~~~
+        sub_filter 'http://example.com' 'https://example.com';
+        sub_filter_once off;
+~~~
+"""]]
diff --git a/doc/forum/Using_reverse_proxy__59___base_URL_is_http_instead_of_https/comment_5_674f56100c0682eba36cc5327fbdae4a._comment b/doc/forum/Using_reverse_proxy__59___base_URL_is_http_instead_of_https/comment_5_674f56100c0682eba36cc5327fbdae4a._comment
new file mode 100644 (file)
index 0000000..1546c67
--- /dev/null
@@ -0,0 +1,61 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawk6z7Jsfi_XWfzFJNZIjYUcjgrthg4aPUU"
+ nickname="Alejandro"
+ subject="Same Trick in Apache"
+ date="2014-09-10T18:58:24Z"
+ content="""
+I got it working with Apache 2.4 and Virtual Hosts on both HTTP 1.1 and HTTPS (SNI). The procedure is somewhat analogous to the nginx procedure above. So here is my set-up in the hopes will help other avoid this pain.
+
+## Set-up
+
+    CLIENT <---- HTTPS ----> REVERSE PROXY <---- HTTP ----> IKIWIKI
+
+
+## The HTTP to HTTPS Redirect
+
+To assure that all your HTTP requests are being redirected to HTTPS I chose to use mod_rewrite because simple Redirect does not pass query parameters. You will want an HTTP VHost that will redirect with something like the one below (notice the subtle ? before query string). **Note: This will NOT re-write ikiwiki's http:// URLs (base tag, etc.)**. For that I use a content filter like you will see below. This HTTP to HTTPS redirect is required though for both security and for the /foo/?updated URI form in this set-up.
+
+<pre>
+
+&lt;VirtualHost *:80&gt;
+    ServerName imass.name
+    RewriteEngine On
+    RewriteCond %{HTTPS} off
+    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}?%{QUERY_STRING}
+    ErrorLog /var/log/imass.name-error.log
+    LogLevel warn
+    CustomLog /var/log/imass.name-access.log combined
+&lt;/VirtualHost&gt;
+
+</pre>
+
+## The SSL Virtual Host
+
+This part is a bit more tricky. First I am using SNI as I don't care for non-SNI user agents. Second, you need to use a filter that replaces all http:// to https:// before the response is set. Note that this alone won't deal with ?update so you will need the HTTP to HTTPS set-up above anyway. Third, I use HTTP Auth so I don't know if this will work with your particular Auth set-up (although it should IMHO), YMMV:
+
+<pre>
+
+&lt;VirtualHost *:443&gt;
+    ServerName imass.name
+    ProxyHTMLEnable On
+    ProxyHTMLExtended On
+    SSLEngine on
+    SSLCertificateFile XXX
+    SSLCertificateKeyFile XXX
+    SSLCertificateChainFile XXX
+    SSLOptions +StdEnvVars
+    ProxyPreserveHost On
+    ProxyHTMLURLMap http:// https://
+    ProxyPass / http://192.168.101.101/
+    ProxyPassReverse / http://192.168.101.101/
+    LogLevel warn
+    ErrorLog /var/log/imass.name-ssl-error.log
+    TransferLog \"/var/log/imass.name-ssl-access.log\"
+    CustomLog \"/var/log/imass.name-ssl-request.log\" \"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \\"%r\\" %b\"
+&lt;/VirtualHost&gt;
+
+</pre>
+
+
+
+"""]]
diff --git a/doc/forum/What__39__s_the_difference_between_tag_and_taglink__63__.mdwn b/doc/forum/What__39__s_the_difference_between_tag_and_taglink__63__.mdwn
new file mode 100644 (file)
index 0000000..4fee07d
--- /dev/null
@@ -0,0 +1,9 @@
+It occurred to me the difference between tag and taglink, as described in http://ikiwiki.info/ikiwiki/directive/tag/ is just that the latter enable the option to have a displayed form of the tag different from the tag itself, e.g. a tag `foo` can be displayed as `bar` using 
+
+    \[[!taglink foo|bar]]
+
+while with tag you can only display the tag `foo` as itself
+
+    \[[!tag foo]]
+
+Is that it?
diff --git a/doc/forum/What__39__s_the_difference_between_tag_and_taglink__63__/comment_1_b3553d65d12af4c4a87f1f66f961c8d9._comment b/doc/forum/What__39__s_the_difference_between_tag_and_taglink__63__/comment_1_b3553d65d12af4c4a87f1f66f961c8d9._comment
new file mode 100644 (file)
index 0000000..2394445
--- /dev/null
@@ -0,0 +1,49 @@
+[[!comment format=mdwn
+ username="http://smcv.pseudorandom.co.uk/"
+ nickname="smcv"
+ subject="comment 1"
+ date="2012-08-19T15:05:35Z"
+ content="""
+`\[[!tag]]` does not produce any output in the body of the page, but
+stores an invisible tag (which, in the default templates, gets displayed
+in the footer of the page).
+
+For instance, this
+
+    Here is some text about badgers
+    \[[!tag badger]]
+
+or this
+
+    \[[!tag badger]]
+    Here is some text about badgers
+
+or even this
+
+    Here is some text about \[[!tag badger]]badgers
+
+will all come out like this:
+
+    Edit | RecentChanges | etc.
+    ----
+    Here is some text about badgers
+    ----
+    tags: badger
+
+`\[[!taglink]]` produces a [[ikiwiki/WikiLink]] in the body of the
+page, *and* stores an invisible tag like `\[[!tag]]`.
+
+So this:
+
+    Some text about \[[!tag mushrooms]] and toadstools
+
+renders like this
+
+    Edit | RecentChanges | etc.
+    ----
+    Some text about _mushrooms_ and toadstools
+    ----
+    tags: mushrooms
+
+where `_mushrooms_` represents a hyperlink.
+"""]]
diff --git a/doc/forum/When_do_tags_like_a__47__b_get_listed_as_a__47__b_and_not_only_b__63__.mdwn b/doc/forum/When_do_tags_like_a__47__b_get_listed_as_a__47__b_and_not_only_b__63__.mdwn
new file mode 100644 (file)
index 0000000..42f470a
--- /dev/null
@@ -0,0 +1,6 @@
+Hello,
+
+For example the page [[plugins/tag|plugins/tag]] here is tagged type/link and type/tags, what gets listed exactly so below the page's content. However, when I use tags like concept/getopt or lang/Perl on my private wiki, it gets only listed as getopt and Perl. Is this behavior configurable or is it implemented firstly in a version later than 3.20100815~bpo50+1 (for which I'm stuck ATM.)?
+
+Greetings,  
+ Mike Dornberger
diff --git a/doc/forum/When_do_tags_like_a__47__b_get_listed_as_a__47__b_and_not_only_b__63__/comment_1_cd5ea3aac8a59793ece5bf01a6190b53._comment b/doc/forum/When_do_tags_like_a__47__b_get_listed_as_a__47__b_and_not_only_b__63__/comment_1_cd5ea3aac8a59793ece5bf01a6190b53._comment
new file mode 100644 (file)
index 0000000..953a714
--- /dev/null
@@ -0,0 +1,9 @@
+[[!comment format=mdwn
+ username="http://joey.kitenet.net/"
+ nickname="joey"
+ subject="comment 1"
+ date="2012-04-19T17:32:18Z"
+ content="""
+I think this change was made in 2011, in commit a17469e3882f55bee93863c6e265b96b80ec9fef.
+
+"""]]
diff --git a/doc/forum/Xapian_search:_empty_postlist_table/comment_4_40479ac2cfbca609f5f423e539a20ee0._comment b/doc/forum/Xapian_search:_empty_postlist_table/comment_4_40479ac2cfbca609f5f423e539a20ee0._comment
new file mode 100644 (file)
index 0000000..a120f97
--- /dev/null
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawlXywgEUJjKArnORJR-5hmNFv8bTraXO1Y"
+ nickname="Ramsey"
+ subject="The same issue is happening with me"
+ date="2013-03-06T13:10:15Z"
+ content="""
+I use ikiwiki version 3.20130212 and tried xapian versions 1.2.5, 1.2.8, 1.2.13. All to no avail. The postlist.DB file is empty for me. I think that is the crux of the problem. Does anybody know why this could be?
+"""]]
diff --git a/doc/forum/Xapian_search:_empty_postlist_table/comment_5_397443138da276e11c2e9b9fa7b51406._comment b/doc/forum/Xapian_search:_empty_postlist_table/comment_5_397443138da276e11c2e9b9fa7b51406._comment
new file mode 100644 (file)
index 0000000..56dd7c6
--- /dev/null
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawljJoWAYhI55qm4hRLdzIOQBNMVB6fgrs8"
+ nickname="Ramsey"
+ subject="comment 5"
+ date="2013-03-06T22:42:54Z"
+ content="""
+Tried version xapian 1.2.3  and it did not work either. Can someone please help me debug this?
+"""]]
diff --git a/doc/forum/Xapian_search:_empty_postlist_table/comment_6_3cd94b9a141ebbf96fcba4ebe99e1453._comment b/doc/forum/Xapian_search:_empty_postlist_table/comment_6_3cd94b9a141ebbf96fcba4ebe99e1453._comment
new file mode 100644 (file)
index 0000000..2d456f3
--- /dev/null
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="https://launchpad.net/~ojwb"
+ nickname="ojwb"
+ subject="comment 6"
+ date="2013-08-26T03:20:05Z"
+ content="""
+As a Xapian database is updated, changes are written out straight away to most of the tables, but the postlist changes are batched up in memory and only written to disk just before they are committed (or to free up memory during a large transaction).  So the empty postlist table you're seeing means that some documents were indexed, but the indexer stopped running before anything was committed.  By default, there's an auto-commit every 10000 documents added, removed, or changed, so it presumably managed to process less than 10000 documents.
+
+The issue with 1.2.5 RPMs may be down to there being two versions of the Xapian perl bindings, both of which claim to be Search::Xapian and both of which have been packaged up as RPMs.  For Xapian 1.2.x, you probably want to use the XS bindings (perl-Search-Xapian) not those generated with SWIG (xapian-bindings-perl).  The SWIG-generated ones are aimed to replace the XS ones, but in 1.2.x they're not really ready for prime time.  If your perl bindings are described with a 4 coponent version (e.g. 1.2.15.0) then you should be good; if it's 3 components (e.g. 1.2.15) then you probably want the other ones.
+"""]]
diff --git a/doc/forum/Your_local_changes_to_the_following_files_would_be_overwritten_by_merge:.mdwn b/doc/forum/Your_local_changes_to_the_following_files_would_be_overwritten_by_merge:.mdwn
new file mode 100644 (file)
index 0000000..911e4c8
--- /dev/null
@@ -0,0 +1,35 @@
+In my first attempt to edit in a text editor I chose sidebar.mdwn. I committed it  after the editing, and get this when I execute "git push:"
+
+$ git push
+
+    Counting objects: 5, done.
+
+    Delta compression using up to 8 threads.
+
+    Compressing objects: 100% (3/3), done.
+
+    Writing objects: 100% (3/3), 289 bytes, done.
+
+    Total 3 (delta 2), reused 0 (delta 0)
+
+    Unpacking objects: 100% (3/3), done.
+
+    remote: From /home/zoidberg/Zoidwicky
+
+    remote:    e878e6a..0ac0c44  master     -> origin/master
+
+    remote: error: Your local changes to the following files would be overwritten by merge:
+
+    remote:    sidebar.mdwn
+
+    remote: Please, commit your changes or stash them before you can merge.
+
+    remote: Aborting
+
+    remote: 'git pull --prune origin' failed:  at /usr/share/perl5/IkiWiki/Plugin/git.pm line 218.
+
+    To /home/zoidberg/Zoidwicky.git
+
+       e878e6a..0ac0c44  master -> master
+
+I have committed my changes to sidebar.mdwn and given my reason for doing so. Also, I get this complaint about sidebar.mdwn when I try 'git push' after editng other files. So I am stuck here. Pls. help.
diff --git a/doc/forum/Your_local_changes_to_the_following_files_would_be_overwritten_by_merge:/comment_1_2223c8b463b22a9dab53b71c01b67209._comment b/doc/forum/Your_local_changes_to_the_following_files_would_be_overwritten_by_merge:/comment_1_2223c8b463b22a9dab53b71c01b67209._comment
new file mode 100644 (file)
index 0000000..b306c9b
--- /dev/null
@@ -0,0 +1,12 @@
+[[!comment format=mdwn
+ username="http://bob-bernstein.myopenid.com/"
+ nickname="bernstein"
+ subject="FIXED! YIPPEE!"
+ date="2014-05-26T04:26:17Z"
+ content="""
+Just diddling around I got the old copy of sidebar.mdwn out of the way, i.e. I moved it out of, not the .git directory in my home dir, but the \"plain\" one. I really ought to learn the names of these things. At any rate it was what git called my \"local copy,\" so I got it out of there.
+
+Now with the logjam broken I can edit, commit, and push changes, apparently, 'til the cows come home.
+
+Thank yourse A::!
+"""]]
diff --git a/doc/forum/Your_local_changes_to_the_following_files_would_be_overwritten_by_merge:/comment_2_2466ce4303f5b8145bdfae23b6dbddda._comment b/doc/forum/Your_local_changes_to_the_following_files_would_be_overwritten_by_merge:/comment_2_2466ce4303f5b8145bdfae23b6dbddda._comment
new file mode 100644 (file)
index 0000000..690808a
--- /dev/null
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="http://bob-bernstein.myopenid.com/"
+ nickname="bernstein"
+ subject="Fat Fingers"
+ date="2014-05-26T04:29:44Z"
+ content="""
+Make that last line, above:
+
+Thank youse ALL!
+"""]]
diff --git a/doc/forum/__34__Error:_cannot_decode_string_with_wide_characters__34___on_Mageia_Linux_x86-64_Cauldron.mdwn b/doc/forum/__34__Error:_cannot_decode_string_with_wide_characters__34___on_Mageia_Linux_x86-64_Cauldron.mdwn
new file mode 100644 (file)
index 0000000..c5a91be
--- /dev/null
@@ -0,0 +1,23 @@
+When running ikiwiki-3.20140102-1.mga4 on Mageia Linux x86-64 4/Cauldron with perl-5.18.1-3.mga4 , I am getting this error after I try to preview a page that contains unicode, at least in firefox-24.2.0-2.mga4 (note that I added "use Carp::Always;" to Ikiwiki.pm to get the stack trace):
+
+<pre>
+Error: Cannot decode string with wide characters at /usr/lib/perl5/vendor_perl/5.18.1/x86_64-linux-thread-multi/Encode.pm line 215. 
+Encode::decode_utf8('# Freenode programming channel FAQ\x{d}\x{a}\x{d}\x{a}This page is intended t...') called at /usr/lib/perl5/vendor_perl/5.18.1/IkiWiki/CGI.pm line 117 
+IkiWiki::decode_form_utf8('CGI::FormBuilder=HASH(0x2f7b880)') called at /usr/lib/perl5/vendor_perl/5.18.1/IkiWiki/Plugin/editpage.pm line 90 
+IkiWiki::cgi_editpage('CGI=HASH(0x21ad628)', 'CGI::Session=HASH(0x280fb88)') called at /usr/lib/perl5/vendor_perl/5.18.1/IkiWiki/CGI.pm line 442
+IkiWiki::__ANON__('CODE(0x23ec970)') called at /usr/lib/perl5/vendor_perl/5.18.1/IkiWiki.pm line 2085
+IkiWiki::run_hooks('sessioncgi', 'CODE(0x2a5be20)') called at /usr/lib/perl5/vendor_perl/5.18.1/IkiWiki/CGI.pm line 442
+IkiWiki::cgi() called at /usr/bin/ikiwiki line 191 eval {...} called at /usr/bin/ikiwiki line 191
+IkiWiki::main() called at /usr/bin/ikiwiki line 228
+</pre>
+
+I have upgraded the ikiwiki instance using "ikiwiki -setup" and am running ikiwiki.cgi on a local Apache server.
+
+Can anyone shed any light on this problem and guide me what I need to do to fix it?
+
+Regards,
+
+-- [Shlomi Fish](http://www.shlomifish.org/)
+
+> [[Merged anarcat's fix for
+this|bugs/garbled non-ascii characters in body in web interface]] --[[smcv]]
diff --git a/doc/forum/__34__Error:_cannot_decode_string_with_wide_characters__34___on_Mageia_Linux_x86-64_Cauldron/comment_1_abf7ec7c378ab0908685d72d159e9fd2._comment b/doc/forum/__34__Error:_cannot_decode_string_with_wide_characters__34___on_Mageia_Linux_x86-64_Cauldron/comment_1_abf7ec7c378ab0908685d72d159e9fd2._comment
new file mode 100644 (file)
index 0000000..8b066b3
--- /dev/null
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://id.koumbit.net/anarcat"
+ ip="72.0.72.144"
+ subject="comment 1"
+ date="2014-09-10T03:00:22Z"
+ content="""
+i had a similar issue, reported in [[bugs/garbled_non-ascii_characters_in_body_in_web_interface]]. 
+"""]]
diff --git a/doc/forum/access_restrictions:_for_extranet.mdwn b/doc/forum/access_restrictions:_for_extranet.mdwn
new file mode 100644 (file)
index 0000000..66f0f7f
--- /dev/null
@@ -0,0 +1,8 @@
+Hi folks,
+
+are there any plugins or best-ways to create a kind of extranet. Just a few pages or namespaces with access restrictions?
+
+There is a [htaccess solution](http://www.branchable.com/forum/Read_access_restrictions/). Would be fine, but only if there are other solutions.
+
+greetz
+klml
diff --git a/doc/forum/access_restrictions:_for_extranet/comment_1_a0666c3c15661fb0fff70f313cd0d47d._comment b/doc/forum/access_restrictions:_for_extranet/comment_1_a0666c3c15661fb0fff70f313cd0d47d._comment
new file mode 100644 (file)
index 0000000..767fb7c
--- /dev/null
@@ -0,0 +1,29 @@
+[[!comment format=mdwn
+ username="http://smcv.pseudorandom.co.uk/"
+ nickname="smcv"
+ subject="comment 1"
+ date="2012-04-15T20:53:44Z"
+ content="""
+Read/view access and write/edit access are rather different.
+You can limit write access via wiki configuration, and even
+configure it over the web with [[plugins/websetup]].
+
+The only way to limit read access is to restrict access to the
+ entire wiki via `.htaccess` or other web server configuration,
+preferably combined with use of `https`.
+IkiWiki can't limit read access to pages on its own[*],
+because it's a wiki compiler: when a page is viewed, the web
+server serves the compiled HTML without IkiWiki being involved.
+
+The best way to integrate access control into IkiWiki would
+probably be to have a CGI user interface for `.htaccess` or
+equivalent - but you'd still have to be careful, because,
+for instance, if a user can edit public pages, then they
+can insert a `\[[!include]]` directive to make the content
+of a private page public. As a result, the safest way to
+use it is to keep public and private information in
+separate wikis.
+
+[\*] strictly speaking, it *could* via a new plugin, but
+that would defeat many of its advantages
+"""]]
diff --git a/doc/forum/access_restrictions:_for_extranet/comment_2_563040aa099c9366dc5701eb4bc9c10d._comment b/doc/forum/access_restrictions:_for_extranet/comment_2_563040aa099c9366dc5701eb4bc9c10d._comment
new file mode 100644 (file)
index 0000000..75b9d49
--- /dev/null
@@ -0,0 +1,20 @@
+[[!comment format=mdwn
+ username="klml"
+ ip="188.174.93.195"
+ subject="comment 2"
+ date="2012-04-16T19:57:20Z"
+ content="""
+hi smcv,
+
+> when a page is viewed, the web server serves the compiled HTML without IkiWiki being involved.
+
+yes you are right, but I still think its a feature ;)
+
+> The best way to integrate access control into IkiWiki would probably be to have a CGI user interface for .htaccess or equivalent - but you'd still have to be careful, because, for instance, if a user can edit public pages, then they can insert a \[[!include]] directive to make the content of a private page public. 
+
+My usecase is a website with an small internal area, its just for not \"so public\" files, no private files. And I only have some trusted users.
+
+thx
+klml
+
+"""]]
diff --git a/doc/forum/blocked_by_blogspam.mdwn b/doc/forum/blocked_by_blogspam.mdwn
new file mode 100644 (file)
index 0000000..c28f385
--- /dev/null
@@ -0,0 +1,9 @@
+[[!meta title="Wrongfully blocked by blogspam"]]
+
+For a few days, I can no longer post anything on ikiwiki.info using the web interface, but I can still do so using git. Everytime I try to edit a page, I get following message:
+
+    Error: Sorry, but that looks like spam to [[blogspam|http://blogspam.net/]]: Comment rejected by admin.
+
+Does someone know what the problem is?
+
+--[[Louis|spalax]]
diff --git a/doc/forum/build_error:_Cannot_decode_string_with_wide_characters/comment_3_d62173d0ae220ab7b063631952856587._comment b/doc/forum/build_error:_Cannot_decode_string_with_wide_characters/comment_3_d62173d0ae220ab7b063631952856587._comment
new file mode 100644 (file)
index 0000000..8dc2f98
--- /dev/null
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="http://joey.kitenet.net/"
+ nickname="joey"
+ subject="comment 3"
+ date="2012-03-16T20:33:20Z"
+ content="""
+The locale settings look ok.
+
+I'd try upgrading your perl. 5.12.3 is rather old, and the code that is failing is part of perl.
+"""]]
diff --git a/doc/forum/build_error:_Cannot_decode_string_with_wide_characters/comment_4_d5d0174e09a94359c23fd9c006a22bbc._comment b/doc/forum/build_error:_Cannot_decode_string_with_wide_characters/comment_4_d5d0174e09a94359c23fd9c006a22bbc._comment
new file mode 100644 (file)
index 0000000..57c99be
--- /dev/null
@@ -0,0 +1,50 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawmKyeW2G4jjSdnL1m6kPPtAiGFUBsnYCfY"
+ nickname="FName"
+ subject="Still can't use ikiwiki on Mac OS X"
+ date="2012-10-21T17:12:15Z"
+ content="""
+I'm still not able to use Ikiwiki on Mac:
+
+    $ ikiwiki --setup ./web.setup
+    generating wrappers..
+    rebuilding wiki..
+    Cannot decode string with wide characters at /opt/local/lib/perl5/5.12.4/darwin-thread-multi-2level/Encode.pm line 174.
+
+
+       $ ls -la /opt/local/bin/perl*
+       lrwxr-xr-x  1 root  admin     20 Oct 21 12:06 /opt/local/bin/perl -> /opt/local/bin/perl5
+       lrwxr-xr-x  1 root  admin     23 Oct 21 12:06 /opt/local/bin/perl5 -> /opt/local/bin/perl5.12
+       -rwxr-xr-x  1 root  admin   9896 Jun 26 01:39 /opt/local/bin/perl5.12
+       lrwxr-xr-x  1 root  admin      8 Jun 26 01:39 /opt/local/bin/perl5.12.4 -> perl5.12
+       -rwxr-xr-x  1 root  admin  10000 Jun 26 01:55 /opt/local/bin/perl5.14
+       lrwxr-xr-x  1 root  admin      8 Jun 26 01:56 /opt/local/bin/perl5.14.2 -> perl5.14
+       -rwxr-xr-x  1 root  admin  10000 Aug 23 13:41 /opt/local/bin/perl5.16
+       lrwxr-xr-x  1 root  admin      8 Aug 23 13:42 /opt/local/bin/perl5.16.1 -> perl5.16
+       lrwxr-xr-x  1 root  admin     12 Oct 21 11:44 /opt/local/bin/perlbug -> perlbug-5.16
+       -rwxr-xr-x  2 root  admin  45815 Jun 26 01:39 /opt/local/bin/perlbug-5.12
+       -rwxr-xr-x  2 root  admin  45203 Jun 26 01:55 /opt/local/bin/perlbug-5.14
+       -rwxr-xr-x  2 root  admin  41712 Aug 23 13:41 /opt/local/bin/perlbug-5.16
+       lrwxr-xr-x  1 root  admin     12 Oct 21 11:44 /opt/local/bin/perldoc -> perldoc-5.16
+       -rwxr-xr-x  1 root  admin    244 Jun 26 01:39 /opt/local/bin/perldoc-5.12
+       -rwxr-xr-x  1 root  admin    244 Jun 26 01:55 /opt/local/bin/perldoc-5.14
+       -rwxr-xr-x  1 root  admin    244 Aug 23 13:41 /opt/local/bin/perldoc-5.16
+       lrwxr-xr-x  1 root  admin     12 Oct 21 11:44 /opt/local/bin/perlivp -> perlivp-5.16
+       -rwxr-xr-x  1 root  admin  12484 Jun 26 01:39 /opt/local/bin/perlivp-5.12
+       -rwxr-xr-x  1 root  admin  12297 Jun 26 01:55 /opt/local/bin/perlivp-5.14
+       -rwxr-xr-x  1 root  admin  10802 Aug 23 13:41 /opt/local/bin/perlivp-5.16
+       lrwxr-xr-x  1 root  admin     15 Oct 21 11:44 /opt/local/bin/perlthanks -> perlthanks-5.16
+       -rwxr-xr-x  2 root  admin  45815 Jun 26 01:39 /opt/local/bin/perlthanks-5.12
+       -rwxr-xr-x  2 root  admin  45203 Jun 26 01:55 /opt/local/bin/perlthanks-5.14
+       -rwxr-xr-x  2 root  admin  41712 Aug 23 13:41 /opt/local/bin/perlthanks-5.16
+
+
+If I simply relink `/opt/local/bin/perl` to a newer version of perl such as `/opt/local/bin/perl5.16`, it still doesn't work, as it seems 
+
+    $ ikiwiki -version
+    ikiwiki version 3.20110608
+
+simply force to use perl5.12.
+
+
+"""]]
diff --git a/doc/forum/build_error:_Cannot_decode_string_with_wide_characters/comment_5_e652027a8f90ebef6f21613b5784ded2._comment b/doc/forum/build_error:_Cannot_decode_string_with_wide_characters/comment_5_e652027a8f90ebef6f21613b5784ded2._comment
new file mode 100644 (file)
index 0000000..08bde8c
--- /dev/null
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawnxp2XU8gIribhhGhGuYtU6eMMwHv5gUGI"
+ nickname="Amitai"
+ subject="may I recommend pkgsrc?"
+ date="2012-10-22T03:50:56Z"
+ content="""
+Looks like the MacPorts ikiwiki package is old. I use ikiwiki from pkgsrc as mentioned in [[tips/ikiwiki_on_mac_os_x]]. I also maintain the package, so it's updated regularly.
+"""]]
diff --git a/doc/forum/build_error:_Cannot_decode_string_with_wide_characters/comment_6_ba76f7f8ef46fb58d36fb2cda4b242ff._comment b/doc/forum/build_error:_Cannot_decode_string_with_wide_characters/comment_6_ba76f7f8ef46fb58d36fb2cda4b242ff._comment
new file mode 100644 (file)
index 0000000..a4ae63a
--- /dev/null
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawmKyeW2G4jjSdnL1m6kPPtAiGFUBsnYCfY"
+ nickname="FName"
+ subject="Am i the only one using MacPorts and Ikiwiki together?"
+ date="2013-08-10T23:45:40Z"
+ content="""
+This exact same problem has been stopping me from using Ikiwiki locally. I'm still able to push to remote Ikiwiki instance. But I'd like to push it to local repo and have the website built locally first so I can confirm everything runs fine. Everytime I try to build it locally, i have this exact same problem.
+"""]]
diff --git a/doc/forum/build_error:_Cannot_decode_string_with_wide_characters/comment_7_e4f7c1da09571085070275e12c09b12f._comment b/doc/forum/build_error:_Cannot_decode_string_with_wide_characters/comment_7_e4f7c1da09571085070275e12c09b12f._comment
new file mode 100644 (file)
index 0000000..447cec8
--- /dev/null
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="schmonz"
+ ip="198.228.228.165"
+ subject="MacPorts still hasn't updated past 2011 ikiwiki with a seriously old Perl"
+ date="2013-08-11T01:40:23Z"
+ content="""
+According to [this page](http://www.macports.org/ports.php?by=name&substr=Ikiwiki) nothing has changed in MacPorts' ikiwiki build. Have you tried contacting the package maintainer or, failing that, submitting an update request to the relevant mailing list?
+
+If MacPorts is this behind the times, it doesn't make sense to me to recommend it to anyone. But I'm biased in favor of pkgsrc, so I don't feel comfortable editing the [[tips/ikiwiki on Mac OS X]] page to promote the thing I happen to prefer... but pkgsrc has Perl 5.18, and I keep pkgsrc's ikiwiki package updated at every release. --[[schmonz]]
+"""]]
diff --git a/doc/forum/converting_binary_files.mdwn b/doc/forum/converting_binary_files.mdwn
new file mode 100644 (file)
index 0000000..6b3187f
--- /dev/null
@@ -0,0 +1,29 @@
+I would like to use ikiwiki to build a static site which needs some transformations to be made on binary assets. A simple example is to translate a .odp presentation to .pdf using (e.g.) unoconv. If I add a new .odp attachment, or push one into the repo, I want the corresponding .pdf to appear in the generated site. What's the right place to hook in to do this?
+
+I've made an experimental prototype which hooks into needsbuild, builds the pages then and there, and at the same time removes them from the list of pages to be built.
+
+~~~
+sub needsbuild {
+    my $files=shift;
+    my $nfiles=[];
+    foreach my $f (@$files) {
+        if ($f =~ /\.odp$/) {
+            my $g = $f;
+            $g =~ s/\.odp$/\.pdf/;
+            debug("building $f to $g");
+            will_render($f, $g);
+            if (system("unoconv","-f","pdf","-o",IkiWiki::dirname("$config{destdir}/$g"),srcfile($f)) != 0) {
+                error("unoconv: failed to translate $f to $g");
+            }
+        }
+        else {
+            push @$nfiles, $f;
+        }
+    };
+    return $nfiles;
+}
+~~~
+
+It appears to work, but is this the right way to do it, bearing in mind ikiwiki's dependency tracking and the like? And is the usage of will_render() correct?
+
+[[BrianCandler]]
diff --git a/doc/forum/copyright_and_license_template_variables___40__where_are_they_set__63____41__.mdwn b/doc/forum/copyright_and_license_template_variables___40__where_are_they_set__63____41__.mdwn
new file mode 100644 (file)
index 0000000..afca582
--- /dev/null
@@ -0,0 +1,13 @@
+The default template includes TMPL_IF LICENSE and TMPL_IF COPYRIGHT, but I can't figure out where these are set.
+
+This page seems to indicate they are created by the [[plugins/meta]] plugin:
+
+[[Default Content for Copyright and License|plugins/contrib/default_content_for___42__copyright__42___and___42__license__42__/]]
+
+Is this true? It just seems a little odd that the default template contains variables that are set by a non-default plugin, so I just wanted to confirm that.
+
+Thanks!
+
+--[[users/acodispo]]
+
+> It is true. --[[Joey]] 
diff --git a/doc/forum/creating_redirect_index.mdwn__63___.mdwn b/doc/forum/creating_redirect_index.mdwn__63___.mdwn
new file mode 100644 (file)
index 0000000..50d8518
--- /dev/null
@@ -0,0 +1,6 @@
+Hi - we are switching to ikiwiki for the Savannah documentation <http://savannah.gnu.org/maintenance>.  I installed the Debian ikiwiki package and it is working fine.  My question: is it possible to redirect the top-level index.mdwn to another page?  (Traditionally we have used <http://savannah.gnu.org/maintenance/FrontPage>.)  
+
+Sorry if this is obvious.  I looked around for existing plugins or methods, but what I found seemed to have other prerequisites that I could not easily figure out, and looked to be more about moving pages than redirecting.  I could do it at the Apache level, but I thought it would be simpler and cleaner to do it within ikiwiki itself if possible (e.g., with some plugin+directive in index.mdwn?).  
+
+Any pointers or info greatly appreciated.  Thanks,
+karl@gnu.org
diff --git a/doc/forum/creating_redirect_index.mdwn__63___/comment_1_6d609c3a2ba50da4129e15b60362c6d9._comment b/doc/forum/creating_redirect_index.mdwn__63___/comment_1_6d609c3a2ba50da4129e15b60362c6d9._comment
new file mode 100644 (file)
index 0000000..7395f17
--- /dev/null
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawlcaGfdn9Kye1Gc8aGb67PDVQW4mKbQD7E"
+ nickname="Amitai"
+ subject="comment 1"
+ date="2013-09-04T16:42:17Z"
+ content="""
+Sounds like you're looking for `[[!meta redir=foo]]`. See the docs for the [[ikiwiki/directive/meta]] directive.
+"""]]
index 0c5221cc9b832ba9933c8910522c8746e9324f4e..c75fc53e091711d4f272e03ee2dbe5a219970e07 100644 (file)
@@ -3,7 +3,7 @@ has \[[!cut id=foo text="foo"]], and fileB does \[[!absorb pagenames=fileA]],
 and can then use \[[!paste id=foo]].
 
 Therefore, I've written an [*absorb* directive /
-plugin](http://schwinge.homeip.net/~thomas/tmp/absorb.pm), which is meant to
+plugin](http://nic-nac-project.de/~schwinge/ikiwiki/absorb.pm), which is meant to
 absorb pages in order to get hold of their *cut* and *copy* directives'
 contents.  This does work as expected.  But it also absorbs page fileA's *meta*
 values, like a *meta title*, etc.  How to avoid / solve this?
diff --git a/doc/forum/debconf13_ikiwiki_bof.mdwn b/doc/forum/debconf13_ikiwiki_bof.mdwn
new file mode 100644 (file)
index 0000000..8659da7
--- /dev/null
@@ -0,0 +1,108 @@
+There has been a meeting of people interested in ikiwiki
+[[during debconf13|http://penta.debconf.org/dc13_schedule/events/1060.en.html]]
+on 2013-08-11. Videos of the event are linked there for download, or
+[[can be viewed online|http://www.irill.org/videos/debconf13/ikiwiki_BoF.webm]].
+
+Summary
+=======
+
+Ikiwiki's state and development
+-------------------------------
+
+Ikiwiki has reached a stable state with a working ecosystem, with the majority
+of changes being minor adaptions and bugfixes these days.
+
+It is unlikely that there will be a major overhaul any time soon.
+
+If incompatible changes are to be made, that might warrant a 4.$DATE
+transition, especially given that the [[ikiwiki-transition]] mechanism has not
+been used for some time. Potential changes for such a transition will be
+discussed (see below).
+
+Names of pages and links
+------------------------
+
+Several of [[the issues chrysn deals with|users/chrysn]] revolve about the
+differences betwen a page's name, its title, the name of source and destination
+page, how they are converted, and which is used when.
+
+chrysn has starting to draft a page on [[plugins/write/names]], and
+would appreciate review and comments.
+
+Themability
+-----------
+
+The default theme of ikiwiki is more appealing to the people who are expected
+to run an ikiwiki setup; end users with Web 2.$current_minor_version
+expectations often don't have there tastes served well.
+
+[[Recently|version 3.20130518]], templates have become more theming friendly,
+but for the general case still require the theme to be known to mainline
+ikiwiki, lest generic templates diverge. A planned feature is generalized
+sidebars, where more places inside the template can be filled using the same
+mechanism as currently used in the [[pluginssidebar]] pluin, but changes there
+require a complete rebuild. (Not worse than the rebuilds required when changing
+the main templates, but it would be more tempting to frequently change them.)
+
+Examples of fancy ikiwiki themes have been brought up:
+
+  * https://www.gresille.org/
+  * https://nos-oignons.net/
+  * http://www.rezine.org/accueil/association/
+  * https://cas-libres.poivron.org/
+
+A generalized version of the [[bootstrap|http://twitter.github.com/bootstrap/]]
+[[theme|theme market]] would be appreciated, as the current one is targeted
+towards a particular installation.
+
+Performance
+-----------
+
+Rebuilding many pages takes considerable time, especially when sidebars are
+changed.
+
+A faster way to use the page index (eg. sqlite) would help speeding up the
+usual rebuilds, but would not help speeding up massive rebuilds.
+
+RDF backend
+-----------
+
+On the priority level "crazy ideas", it was discussed to augment or finally
+change the index to an RDF triple collection. Statements would be extracted
+from the source pages in the scan hook, and form a triple store. Pagespecs
+would be resolved to SPARQL queries against that database; also the
+[[todo/structured page data]] fields could be addressed with this.
+
+Optimizations are still possible, even more generally, for example with
+dependencies on other pages' title:
+
+* page A sets its own title with `\[[!meta title="the A page"]]`, which results
+  in the statement '`<./page_A> dc:title "the A page" .`'.
+
+* page B uses some kind of auto-titling link to page A: `\[[~|page A]]`, which
+  queries for '`<./page_A> dc:title ?a`'.
+
+* When page B is built, it is stored that it depends on statements involving
+  the term `<./page_A>`, and the current hash value of all statements about
+  that term. (Those will be computed for all observed statements at scan time.
+  Pages that use more complex queries might not be able to list all their
+  dependencies.)
+
+  Also, the queries and query results executing during building page B are
+  stored in a separate cache.
+
+* When some other page starts linking to page A, the first cache is
+  invalidated, as now there are more statements on the subject of
+  '`<./page_A>`', so page B might need to be rebuilt. Before that is done, its
+  cached queries are executed. If their results did not change, page B does not
+  need any further action.
+
+vCard support
+-------------
+
+The topic of combining ikiwiki with
+[[calypso|http://keithp.com/blogs/calypso/]] was brought up
+[[in another event|http://penta.debconf.org/dc13_schedule/events/1087.en.html]]
+during the same DebConf.
+
+For further details, see [[todo/vCard rendering]].
diff --git a/doc/forum/default_paths._Are_there_better_defaults__63__.mdwn b/doc/forum/default_paths._Are_there_better_defaults__63__.mdwn
new file mode 100644 (file)
index 0000000..ab955a5
--- /dev/null
@@ -0,0 +1,8 @@
+Is there a reason for srcdir and repository to be put into the home dir by default? Especially the srcdir seems to be misplaced there because it looks, smells and usually has the same name as the clone you want to generate exactly there to edit the wiki on the command line. Both srcdir and repository should usually be left alone and that doesn't sound like the files you would want to place highly visible into $HOME
+
+Sure, I have no problem relocating the dirs myself or editing/replacing /etc/ikiwiki/auto.setup whenever I reinstall a new PC, but a better default would spare me and others a bit of work.
+
+To me it seems $HOME/.ikiwiki/ might be a good default for storing all this essentially-to-be-ignored dirs as it is created anyway. 
+
+Right? Wrong?
+
diff --git a/doc/forum/default_paths._Are_there_better_defaults__63__/comment_1_3db622152a8ab53841cc13280ca31da4._comment b/doc/forum/default_paths._Are_there_better_defaults__63__/comment_1_3db622152a8ab53841cc13280ca31da4._comment
new file mode 100644 (file)
index 0000000..da24613
--- /dev/null
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="http://christian.amsuess.com/chrysn"
+ ip="84.114.244.41"
+ subject="default paths: basedir spec"
+ date="2014-05-04T13:30:20Z"
+ content="""
+i have no opinion on *whether* there should be different default directories, but *if* new directories are desired, they should go to their respective paths according to [basedir-spec](http://freedesktop.org/wiki/Specifications/basedir-spec/).
+
+i'm no expert in that, but i think it means that the setup files go to `XDG_CONFIG_HOME` (`~/.config/ikiwiki/${wikiname_short}.setup`), and srcdir and repository go to `XDG_DATA_HOME` (`~/.local/share/ikiwiki/${wikiname_short}`).
+"""]]
diff --git a/doc/forum/download_links_for_attachments.mdwn b/doc/forum/download_links_for_attachments.mdwn
new file mode 100644 (file)
index 0000000..4d6e9c7
--- /dev/null
@@ -0,0 +1,11 @@
+hi, 
+I'm not sure if I'm doing something wrong but I can't figure out how to get a download link for uploaded attachments.
+I'd like to be able to upload arbitrary attachments eg. settings.xml or .gitinore or setup.txt or stuff.zip and be able to add a link to the wiki page which should let the user instantly download that file.
+I thought it might be as simple as adding a directive eg. [[!downloadlink .gitinore]] .
+
+This is driving me nuts, so any help or pointers will be appreciated even if I have to dig in to write a plugin.
+I'm running the 3.20100815.9 on Debian 6.0  but then also tried a manual install of 3.20130904.1 which seemed to have caused a bunch of timeout errors and not much improvement on the attachment issue. 
+Should  I try the git version?
+
+thanks
+marius
diff --git a/doc/forum/download_links_for_attachments/comment_1_19fe525281e38d3bbe45b31248ca7880._comment b/doc/forum/download_links_for_attachments/comment_1_19fe525281e38d3bbe45b31248ca7880._comment
new file mode 100644 (file)
index 0000000..5e16410
--- /dev/null
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawnWrt_1YwzE4yP3dF061Wy7uNjPDefJm_I"
+ nickname="Marius"
+ subject="Did anybody see this?"
+ date="2013-10-14T10:59:47Z"
+ content="""
+Did I post it at the right place?
+
+thanks
+"""]]
diff --git a/doc/forum/download_links_for_attachments/comment_2_06231e4ddc271260e51bc371637540de._comment b/doc/forum/download_links_for_attachments/comment_2_06231e4ddc271260e51bc371637540de._comment
new file mode 100644 (file)
index 0000000..aadc366
--- /dev/null
@@ -0,0 +1,14 @@
+[[!comment format=mdwn
+ username="http://smcv.pseudorandom.co.uk/"
+ nickname="smcv"
+ subject="comment 2"
+ date="2013-10-15T19:48:15Z"
+ content="""
+It should be as simple as putting the attachment's name in double square
+brackets, like `\[[stuff.zip]]`? There isn't really any difference
+between a download link and any other link.
+
+(Or if it's attached to a different page, follow the same
+[[ikiwiki/subpage/linkingrules]] as for pages, e.g. you might
+write `\[[sandbox/stuff.zip]]` for a file attached to the [[sandbox]].)
+"""]]
diff --git a/doc/forum/download_links_for_attachments/comment_3_64d12928bc24c48d6f0b5fbb2dfd8f6d._comment b/doc/forum/download_links_for_attachments/comment_3_64d12928bc24c48d6f0b5fbb2dfd8f6d._comment
new file mode 100644 (file)
index 0000000..7e84786
--- /dev/null
@@ -0,0 +1,16 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawnWrt_1YwzE4yP3dF061Wy7uNjPDefJm_I"
+ nickname="Marius"
+ subject="that works sort of, depending on the extention"
+ date="2013-10-18T12:03:26Z"
+ content="""
+[[setup.txt]] - opens the plain text in the same browser window
+[[settings.xml]] - opens the formatted xml as html i.e. I can't right click and save as, I have to copy the text, create an empty file and paste it in
+[[.gitignore]] - it does not recognise this file, I have to rename it to gitignore.txt and explain to the user to rename it.
+
+What I would like is a way to consistently get a dialog that asks the user where to save the file with the correct default file name..
+I've recently figured out how to do this with javascript - it's a bit messy but it works:
+http://stackoverflow.com/a/11486284/381083
+
+thanks
+"""]]
diff --git a/doc/forum/download_links_for_attachments/comment_4_7612923064284646c2ed59e2cd52845d._comment b/doc/forum/download_links_for_attachments/comment_4_7612923064284646c2ed59e2cd52845d._comment
new file mode 100644 (file)
index 0000000..eb65938
--- /dev/null
@@ -0,0 +1,34 @@
+[[!comment format=mdwn
+ username="http://smcv.pseudorandom.co.uk/"
+ nickname="smcv"
+ subject="comment 4"
+ date="2013-10-18T16:56:09Z"
+ content="""
+> \[[setup.txt]] - opens the plain text in the same browser window
+
+That's the browser's choice: the web server says \"this is text/plain\"
+and the browser decides to display it in the window. IkiWiki doesn't
+actually serve the file, just provides a link to it; to force it
+to be downloaded rather than opened, you'd have to configure
+your web server to offer it as \"Content-Disposition: attachment\"
+(e.g. <http://www.jtricks.com/bits/content_disposition.html>).
+
+The only way IkiWiki could get involved in this would be to
+have the file download go via the CGI script, which could
+add that header. That isn't currently a feature it has;
+you could maybe add a plugin if you need this?
+
+> \[[settings.xml]] - opens the formatted xml as html
+
+Again, this is between the web server and the browser.
+
+> \[[.gitignore]] - it does not recognise this file
+
+IkiWiki excludes files related to the source code control systems
+it uses, in order to avoid accidentally publishing a `.gitignore`
+that's intended to control ignored files for the git repo
+containing the pages' source. This is controlled by the
+`wiki_file_prune_regexps`, `exclude` and `include` config options.
+You can put `.gitignore` in `include` if you need to publish
+files with that name.
+"""]]
index 2b56bd70b27de13e12432636a18c38e15698ab2e..e01eccb92c4f6c98cb5b4687f3978a2cf4760ee1 100644 (file)
@@ -1,4 +1,4 @@
-as in title, how to align text to the right?
+As in title, how to align text to the right?
 
 > Add to your local.css a class that aligns text to the right:
 
@@ -13,3 +13,40 @@ as in title, how to align text to the right?
 > [[templates/note]] template does something similar. --[[Joey]]
 
 >> Thanks!
+
+-----
+<div class="notebox">
+[[!format mdwn """
+This is my text with [a markdown link](#).
+
+Here's a *second* paragraph.
+"""]]
+</div>
+
+> There is more than one way to do it. If [[plugins/format]] is enabled, then this:
+>
+>     <div class="notebox">
+>     \[[!format mdwn """
+>     This is my text with [a markdown link](#).
+>
+>     Here's a *second* paragraph.
+>     """]]
+>     </div>
+>
+> is rendered like the box in this page.
+>
+> (I'm using the `notebox` class used by the `note` template here, but you could
+> use any class.) --[[smcv]]
+
+-----
+> Doing this myself and noted that [[ikiwiki/markdown]] down does not allow the enclosure of block level elements directly; and thus we cannot switch the `span` suggested above for `div` in changing block level elements (not if you wish to include markdown, anyway).  For example, I want to create a paragraph (with markdown text) which is right aligned, and so add the following
+
+>>     <span class="right_align">
+>>     This is my text with [a markdown link](/)
+>>     </span>
+
+> The *correct* thing to do here is create a template (as indicated above) **but** a workaround I found useful was to over-ride the `inline` nature of the `span` element, as follows
+
+>>     .align_right { display: block ; text-align: right ; }
+
+> you may also like to remove the padding and margins since they will be provided by the enclosing block. -- fergus
index 96ba2d79145adbc9c2fdcaba05201a380b57ce6c..d25d8fe4cc3d29d29fa7176a9ee833a58f2e1e17 100644 (file)
@@ -4,6 +4,9 @@ directly to sign into ikiwiki. Just use, for example,
 
 > This seems to work fine if you use the profile directly as an OpenID.  It doesn't seem to work with delegation.  From that I can see, this is a deliberate decision by Google for security reasons.  See the response [here](http://groups.google.com/group/google-federated-login-api/browse_thread/thread/825067789537568c/23451a68c8b8b057?show_docid=23451a68c8b8b057). -- [[Will]]
 
+### adding the GMail OpenID as an admin is unhandy
+Adding the non-human-friendly OpenID from Gmail as an admin for ikiwiki (if you haven't set up a profile with a readabe URL) is unhandy; first, you need to discover the URL, for example, by making a web edit with it (like me [here](http://source.ikiwiki.branchable.com/?p=source.git;a=search;s=https://www.google.com/accounts/o8/id%3Fid%3DAItOawl3JW_Ow4xMqj98Ig1vwGx_AnjUSsgwE8E;st=author)), and then copy the URL to ikiwiki.setup. --Ivan Z.
+
 ## historical discussion
 
 when I login via to this wiki (or ours) via Google's OpenID, I get this error:
diff --git a/doc/forum/how_could_i_generate_a_flat_textfile_from_metadata_in_multiple_pages.mdwn b/doc/forum/how_could_i_generate_a_flat_textfile_from_metadata_in_multiple_pages.mdwn
new file mode 100644 (file)
index 0000000..d82a419
--- /dev/null
@@ -0,0 +1,3 @@
+I am already using the [[plugins/contrib/report]] plugin to generate reports aggregated from multiple pages, and it's great! However, I am now looking at generating non-HTML reports. Basically, I want to generate a BIND zonefile from the data aggregated from similar reports. I have gone as far as using the [[plugins/pagetemplate]] plugin to have an empty page as a template - but even that bit doesn't work as i still get pesky `<script>` tags in the output. Besides, the data actually gets parsed on display, and I'd like to do some validation and processing.
+
+How should I go forward? Should i write a separate plugin from [[plugins/contrib/report]]? Should I make a plugin that, like [[plugins/graphviz]] generates data in a separate page? Any suggestions? --[[anarcat]]
diff --git a/doc/forum/how_to_have_a_plugin_delete_a_file.mdwn b/doc/forum/how_to_have_a_plugin_delete_a_file.mdwn
new file mode 100644 (file)
index 0000000..ea29555
--- /dev/null
@@ -0,0 +1,18 @@
+[[!meta title="How to have a plugin delete a file?"]]
+
+When using the [[plugins/contrib/jscalendar]] plugin,  it creates in the
+[[plugins/transient]] directory some files (a bit like the
+[[plugins/recentchanges]] plugin does). When the calendar that triggered
+creation of this file is removed, I would like to remove the corresponding
+page as well, but I cannot, because I get the following error.
+
+    internal error: jscalendar/90cde8dfad6413813b324a15ae2d1d95041aedd69e7be36c02b0cd4a58c4af73.jscalendar cannot be found in <path of wiki> or underlay
+
+My guess is that:
+
+* the page is stored, internally, in some list of pages to render (as it depends on the page containing the calendar that was just deleted);
+* my plugin delete this page (using `IkiWiki::prune()` or `unlink()`, in the `rendered()` or `needsbuild()` hook);
+* IkiWiki tries to render the page, but cannot (since I just deleted it), and throws the error.
+
+My question is: How can I tell IkiWiki that I *deleted* this page, and that it is no longer necessary to render it? Is there a hook in which I can safely do this?
+
diff --git a/doc/forum/how_to_have_a_plugin_delete_a_file/comment_1_061c8bca174f7155d4065dd200c0c8db._comment b/doc/forum/how_to_have_a_plugin_delete_a_file/comment_1_061c8bca174f7155d4065dd200c0c8db._comment
new file mode 100644 (file)
index 0000000..439b074
--- /dev/null
@@ -0,0 +1,11 @@
+[[!comment format=mdwn
+ username="smcv"
+ ip="81.100.115.242"
+ subject="comment 1"
+ date="2014-07-21T20:15:13Z"
+ content="""
+Without actually checking the source code, I think the answer is:
+if you refrain from saying that page *x* `will_render` a file *f* that
+was previously rendered by *x*, IkiWiki will notice the difference,
+and delete *f* automatically.
+"""]]
diff --git a/doc/forum/how_to_have_a_plugin_delete_a_file/comment_2_864a20147885642ad3bbcf8400d8ee46._comment b/doc/forum/how_to_have_a_plugin_delete_a_file/comment_2_864a20147885642ad3bbcf8400d8ee46._comment
new file mode 100644 (file)
index 0000000..f22a607
--- /dev/null
@@ -0,0 +1,9 @@
+[[!comment format=mdwn
+ username="smcv"
+ ip="81.100.115.242"
+ subject="comment 2"
+ date="2014-07-21T20:16:16Z"
+ content="""
+... and in that situation, you need to put *x* in the output of
+`needsbuild`, if it did not already have a reason to be built.
+"""]]
diff --git a/doc/forum/how_to_login_as_admin/comment_1_295e130c6400a2d7336758e82bcd5647._comment b/doc/forum/how_to_login_as_admin/comment_1_295e130c6400a2d7336758e82bcd5647._comment
new file mode 100644 (file)
index 0000000..bceecf8
--- /dev/null
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="http://ismael.olea.org/"
+ ip="150.214.94.198"
+ subject="comment 1"
+ date="2012-05-22T23:31:09Z"
+ content="""
+Can be adminuser an OpenID address? 
+
+Because I can't get the websetup link at my preferences (plugin is set). I deactivated passwordauth plugin.
+"""]]
diff --git a/doc/forum/howto_install_the_pagedown_plugin.mdwn b/doc/forum/howto_install_the_pagedown_plugin.mdwn
new file mode 100644 (file)
index 0000000..51b0a55
--- /dev/null
@@ -0,0 +1 @@
+How can I install the [[todo/pagedown_plugin]] on an existing ikiwiki? What are the detailed steps to do so?
diff --git a/doc/forum/howto_install_the_pagedown_plugin/comment_1_158fbcef24d20920c40968da8f10442a._comment b/doc/forum/howto_install_the_pagedown_plugin/comment_1_158fbcef24d20920c40968da8f10442a._comment
new file mode 100644 (file)
index 0000000..3985a79
--- /dev/null
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://joey.kitenet.net/"
+ nickname="joey"
+ subject="comment 1"
+ date="2012-04-05T18:35:25Z"
+ content="""
+See [[plugins/install]]
+"""]]
diff --git a/doc/forum/ikiwiki.info_blogspam_problem.mdwn b/doc/forum/ikiwiki.info_blogspam_problem.mdwn
new file mode 100644 (file)
index 0000000..4702099
--- /dev/null
@@ -0,0 +1,11 @@
+I am attempting to edit tips/dot_cgi/ [[tips/dot_cgi/discussion]], but I get this error:
+
+    Error: Sorry, but that looks like spam to blogspam: Single-word too long: '\[[http://maketech...]]'
+
+Note: that link appeared in a /previous/ version of the discussion page, not my own edit.
+
+Hope this helps, cheers!
+
+p.s. I got the same error when trying to post here, so I edited the string to be shorter.
+
+p.p.s. I got the same error again for the link to tips/dot_cgi/discussion, so I changed that link in a silly way...
diff --git a/doc/forum/ikiwiki.info_blogspam_problem/comment_1_893a2f561ead36b531e2d6c887e6aaba._comment b/doc/forum/ikiwiki.info_blogspam_problem/comment_1_893a2f561ead36b531e2d6c887e6aaba._comment
new file mode 100644 (file)
index 0000000..9af6866
--- /dev/null
@@ -0,0 +1,11 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawkwqKsWfFCk-NK99S77R2v1JorVCnpzXUA"
+ nickname="Dave"
+ subject="site participation"
+ date="2013-11-18T21:50:59Z"
+ content="""
+joeyh, do you have charts and graphs of number of contributions per day to this site?  Do you know (or can you find out) what day you enabled blogspam?
+
+Hope this helps,
+--Dave
+"""]]
diff --git a/doc/forum/ikiwiki_+_mathjax/comment_4_873adec726e9b70394643ff28094ad39._comment b/doc/forum/ikiwiki_+_mathjax/comment_4_873adec726e9b70394643ff28094ad39._comment
new file mode 100644 (file)
index 0000000..d66d10b
--- /dev/null
@@ -0,0 +1,9 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawlsNmR53i7XzaEwtTVLCAgDPXZ7JvPHQr0"
+ nickname="GI"
+ subject="Tutorial + options"
+ date="2013-10-15T19:47:29Z"
+ content="""
+I've been using MathJAX + ikiwiki for a while, and finally got around to posting my setup. You can find a tutorial [[here|http://wiki.math.cmu.edu/iki/wiki/tips/20130930-ikiwiki/010-setup.html]].
+
+"""]]
diff --git a/doc/forum/ikiwiki_+_mathjax/comment_5_f601e3f1c78345e4d80ec3ce62784e6f._comment b/doc/forum/ikiwiki_+_mathjax/comment_5_f601e3f1c78345e4d80ec3ce62784e6f._comment
new file mode 100644 (file)
index 0000000..acb081e
--- /dev/null
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawlUQVv1tLm_aWTKoX36OqxUUkyowomdt4E"
+ nickname="Meng"
+ subject="recipe"
+ date="2013-11-06T07:50:24Z"
+ content="""
+SO has a thread on this: http://stackoverflow.com/questions/6889564/add-mathjax-support-to-a-local-ikiwiki .   
+"""]]
diff --git a/doc/forum/ikiwiki_+_mathjax/comment_6_305fddcd1e264b92d7ed7153ba27ce07._comment b/doc/forum/ikiwiki_+_mathjax/comment_6_305fddcd1e264b92d7ed7153ba27ce07._comment
new file mode 100644 (file)
index 0000000..222bc03
--- /dev/null
@@ -0,0 +1,9 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawlsNmR53i7XzaEwtTVLCAgDPXZ7JvPHQr0"
+ nickname="GI"
+ subject="comment 6"
+ date="2014-01-10T15:57:37Z"
+ content="""
+Unfortunately the StackOverflow method suggests using pandoc. This has many bad side effects...
+
+"""]]
diff --git a/doc/forum/ikiwiki_--setup_creates_tmp__47___directory_in_destdir.mdwn b/doc/forum/ikiwiki_--setup_creates_tmp__47___directory_in_destdir.mdwn
new file mode 100644 (file)
index 0000000..dab8836
--- /dev/null
@@ -0,0 +1,10 @@
+Hi,
+
+I just recently migrated my pyblosxom installation to ikiwiki (see <http://blog.well-adjusted.de/posts/>). Should have done that years ago!
+
+Anyway, so far my only problem is that `ikiwiki --setup mysite.setup` creates a directory named `tmp` in the directory containing my postings, together with an empty index.html. It happens every time if I do a complete rebuild. It does not happen every time with `--refresh`. For example, editing only `local.css` does not trigger the behaviour. Editing any posting will do, but that triggers a complete rebuild anyway due to my sidebar with the tag cloud.
+
+Do you have any idea what might cause this or how I should proceed to find it out? I am a programmer but know next to nothing about Perl.
+
+Thanks,
+Jochen.
diff --git a/doc/forum/ikiwiki_and_big_files/comment_1_df8a9f4249af435cc335f77768a3278d._comment b/doc/forum/ikiwiki_and_big_files/comment_1_df8a9f4249af435cc335f77768a3278d._comment
new file mode 100644 (file)
index 0000000..4ab5b52
--- /dev/null
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://mildred.fr/"
+ ip="2a01:e35:2f7b:8350:8d29:c70d:c3e:d110"
+ subject="git-annex"
+ date="2012-12-18T14:12:31Z"
+ content="""
+I suppose we could use git-annex to do that. The question is: does the Git plugin in ikiwiki supports git-annex ? I'd hope so.
+"""]]
diff --git a/doc/forum/ikiwiki_and_big_files/comment_2_2d996f1124aedc10f345139c3d8b11df._comment b/doc/forum/ikiwiki_and_big_files/comment_2_2d996f1124aedc10f345139c3d8b11df._comment
new file mode 100644 (file)
index 0000000..6a11d9a
--- /dev/null
@@ -0,0 +1,19 @@
+[[!comment format=mdwn
+ username="http://smcv.pseudorandom.co.uk/"
+ nickname="smcv"
+ subject="comment 2"
+ date="2012-12-21T11:02:19Z"
+ content="""
+Unfortunately, ikiwiki [[doesn't follow symlinks for security
+reasons|security]] - if it did, anyone who can commit to the wiki
+repository could publish any file readable by the user who runs ikiwiki,
+including secrets like `~/.gnupg/secring.gpg` or
+`~/.ssh/identity`.
+
+git-annex relies on symlinks, so that restriction breaks it.
+It would be great to be able to use some restricted, safe subset
+of symlinks (\"relative symlinks that point into `.git/annex`\" would
+be enough to support git-annex), and I've looked into it in the past.
+My [[plugins/contrib/album]] plugin would benefit from being able
+to annex the actual photos, for instance.
+"""]]
diff --git a/doc/forum/ikiwiki_and_big_files/comment_3_dfbd38e2b457ea3c4f70266dbf8fbeab._comment b/doc/forum/ikiwiki_and_big_files/comment_3_dfbd38e2b457ea3c4f70266dbf8fbeab._comment
new file mode 100644 (file)
index 0000000..6aae6db
--- /dev/null
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="2001:4978:f:21a::2"
+ subject="comment 3"
+ date="2012-12-21T14:49:13Z"
+ content="""
+git-annex is gaining a new \"direct\" mode where it does not use symlinks. It remains to be seen if enough git operations will be supported in that mode to make it attractive to use.
+"""]]
diff --git a/doc/forum/ikiwiki_and_big_files/comment_4_fd8a0cb8872d9de55465e8db93d67619._comment b/doc/forum/ikiwiki_and_big_files/comment_4_fd8a0cb8872d9de55465e8db93d67619._comment
new file mode 100644 (file)
index 0000000..da70861
--- /dev/null
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://id.koumbit.net/anarcat"
+ ip="2001:1928:1:9::1"
+ subject="opened todo"
+ date="2013-09-21T13:58:45Z"
+ content="""
+I explicitely opened a [[todo item|todo/git-annex_support]] about git-annex. From what I can see, it's currently unsupported, and there would be issues with file duplication between the bare repo and the srcdir, at the very least, unless git-annex magically supports hardlinks in local repos.
+"""]]
diff --git a/doc/forum/ikiwiki_and_big_files/comment_5_3532b14ee10775dac634792c75a30e89._comment b/doc/forum/ikiwiki_and_big_files/comment_5_3532b14ee10775dac634792c75a30e89._comment
new file mode 100644 (file)
index 0000000..ead9b46
--- /dev/null
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://mcfrisk.myopenid.com/"
+ nickname="mikko.rapeli"
+ subject="comment 5"
+ date="2014-01-23T09:23:53Z"
+ content="""
+Still struggling with this. Noticed that ikiwiki uses hardlinks to files but copies directory structures if my huge (now 8 gig) media library is added as underlay, but hidden files are ignored, like .htaccess which I use to browse the media files while writing blog posts for example. And symlinks are not supported. At the moment easiest for me would be to use some 'post update' scripts to add a media directory symlink to ikiwiki output directory.
+"""]]
diff --git a/doc/forum/ikiwiki_not_usable_when_installed_with_toast___40__because_of_symlinks__41__.mdwn b/doc/forum/ikiwiki_not_usable_when_installed_with_toast___40__because_of_symlinks__41__.mdwn
new file mode 100644 (file)
index 0000000..48e0079
--- /dev/null
@@ -0,0 +1,12 @@
+(NOTE: There are artificial whitespaces in the path to shortcuts.mdwn below, because on my first attempt to save this entry I got a message that Blogspam would not allow it because of the length of this string. Also, I had to reformat some of the links, which where to long for BlogSpam as well.)
+
+Ikiwiki is not usable when installed to a user’s $HOME with toast ([[http://www.toastball.net/toast/]]), as toast installs everything as symlinks, which Ikiwiki does not take well:
+
+    $  ikiwiki --rebuild --setup Testwiki.setup 
+    cannot read a symlink (/home/franek/.toast/armed/usr/ local/share/ikiwiki/ basewiki/shortcuts.mdwn)
+
+I am aware that Ikiwiki does not allow symlinks in srcdir for security reasons http://ikiwiki.info/ [no space here, see above note] security/#index18h2. I do not see, however, why this restriction should apply to basewiki or other not user-created files, which are not modifiable by committers anyway.
+
+If this is correct, can that be fixed (easily)?
+
+Edit: Maybe I should have filed this as a bug right away. If this post does not lead to anything, I may still do that in a few days.
diff --git a/doc/forum/ikiwiki_with_album___38___underlay_plugins.mdwn b/doc/forum/ikiwiki_with_album___38___underlay_plugins.mdwn
new file mode 100644 (file)
index 0000000..547c738
--- /dev/null
@@ -0,0 +1,65 @@
+# Howto avoid heavy files in ikiwiki git repo
+
+Continuation of discussion at [git-annex forum](http://git-annex.branchable.com/forum/git-annex___38___ikiwiki_experiment/) turns out the git-annex tricks could be avoided.
+
+
+## Setup on remote server
+
+On the server activate album and underlay plugins in $wiki.setup file
+
+    add_plugins:
+    - album
+    - underlay
+
+Configure underlay plugin
+
+    add_underlays:
+    - /home/$user/$wiki.underlay
+
+Create underlay directory and init git annex in direct mode
+
+    mkdir ~/$wiki.underlay
+    cd ~/$wiki.underlay;git init;git annex init $srcunderlay; git annex direct
+
+Build ikiwiki for good measure
+    ikiwiki --setup $wiki.setup --rebuild
+
+## Setup on local laptop
+
+Clone to laptop and initialise annex repo
+
+    git clone ssh://$server/$wiki.git ~/$wiki
+    git clone ssh://$server/$wiki.underlay ~/$wiki.underlay
+    cd $wiki.underday;git-annex init $wrkunderlay
+    git remote add $srcunderlay ssh://$server/$wiki.underlay
+
+You now have an annex repo in the local $wiki.underlay called $wrkunderlay and one in the $wiki.underlay directory on the remote server called $srcunderlay.
+    
+## Add content locally
+
+Add content to local $wiki directory in this case create $album.mdwn files for every album you have. Then `git add;git commit` files containing at the minimum the following
+
+    [[!album ]]
+
+Create directories in the local $wiki.underlay corresponding to the album files in the local $wiki dir. Ie. create a directory named $album for every $album.mdwn file. Copy hi-res jpg files to each directory in the local $wiki.underlay and add + commit. 
+
+    git annex add .
+    git commit -m 'jpgs added'
+
+## Push to remote
+
+    cd $wrkunderlay; git-annex copy --to $srcunderlay .; git-annex sync
+    cd $wrkdir;git push
+
+That's it! Ikiwiki should update the website and treat the jpg's as if they were part of the standard file structure.
+
+How to accomplish this using the web interface is another questions. I guess the plugins have to setup and upload to underlaydir somehow.
+
+My guess is that you have to git-annex copy the $wiki.underlay files to $srcunderlay **before** running git push from the local $wiki directory. Haven't tested this yet though.
+
+
+
+
+
+
+
diff --git a/doc/forum/ikiwiki_with_album___38___underlay_plugins/comment_1_ea4faa2b5bb9216c0a0427f2071584ef._comment b/doc/forum/ikiwiki_with_album___38___underlay_plugins/comment_1_ea4faa2b5bb9216c0a0427f2071584ef._comment
new file mode 100644 (file)
index 0000000..3559016
--- /dev/null
@@ -0,0 +1,18 @@
+[[!comment format=mdwn
+ username="http://smcv.pseudorandom.co.uk/"
+ nickname="smcv"
+ subject="comment 1"
+ date="2013-09-26T13:11:55Z"
+ content="""
+\"I guess the plugins have to setup and upload to underlaydir somehow\" -
+yes, the hypothetical specialized CGI interface mentioned at the end of
+[[plugins/contrib/album]] would ideally be able to do that.
+
+I'd also like to be able to keep full-resolution photos on my laptop
+but mangle them down to a more web-compatible resolution in a
+separate underlay that is what actually gets uploaded, also as described
+on that page - but that doesn't make a great deal of sense for a
+non-CGI workflow, since if you're uploading full-resolution photos to
+the CGI, you've already done the big data transfer whether you
+intended to or not :-)
+"""]]
diff --git a/doc/forum/ikiwiki_with_album___38___underlay_plugins/comment_2_f38b4f9191d42c3d1a9651820b36a2ee._comment b/doc/forum/ikiwiki_with_album___38___underlay_plugins/comment_2_f38b4f9191d42c3d1a9651820b36a2ee._comment
new file mode 100644 (file)
index 0000000..13c322e
--- /dev/null
@@ -0,0 +1,23 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawkickHAzX_uVJMd_vFJjae6SLs2G38URPU"
+ nickname="Kalle"
+ subject="comment 2"
+ date="2013-09-26T13:38:49Z"
+ content="""
+I recreated this post in the tips section [Ikiwiki with git-annex, the album and the underlay plugins](http://ikiwiki.info/tips/Ikiwiki_with_git-annex__44___the_album_and_the_underlay_plugins/) as per anarcats suggestion
+
+@smcv
+
+    > I'd also like to be able to keep full-resolution photos on my laptop 
+    > but mangle them down to a more web-compatible resolution in a separate 
+    > underlay that is what actually gets uploaded, also as described on that page
+
+Yes I can see that some have use for that function. I try to provide hi-res version of all my images as they are more useful for people. For the stockholm site though I've halved the size already as there are to many photos and of to dubious quality... and it's easy enough to do that locally before uploading.
+
+As you can see on the [about](http://stockholm.kalleswork.net/tech/) page I use a shell script to do the metadata stuff even adding the actual download link for the hi-res version. Couldn't figure out how to do in in album.pm before I opted for a simpler solution ;) So for me local work is necessary anyway atm.
+
+Another potential problem with the underlay is how changes to underlay files would be detected?
+
+Feel free to delete this whole forum post in favor of the version in tips.
+
+"""]]
diff --git a/doc/forum/ikiwiki_with_album___38___underlay_plugins/comment_3_46d4c9cecc5d9a19693966820dd18380._comment b/doc/forum/ikiwiki_with_album___38___underlay_plugins/comment_3_46d4c9cecc5d9a19693966820dd18380._comment
new file mode 100644 (file)
index 0000000..79aa576
--- /dev/null
@@ -0,0 +1,17 @@
+[[!comment format=mdwn
+ username="http://smcv.pseudorandom.co.uk/"
+ nickname="smcv"
+ subject="comment 3"
+ date="2013-09-26T14:38:45Z"
+ content="""
+> \"how changes to underlay files would be detected?\"
+
+Changes to files in underlays are picked up automatically, as long as
+their mtime changed.
+
+> Couldn't figure out how to do [metadata] in in album.pm
+
+Yeah, I need to implement a hook mechanism or something
+(and work out where I put the exif plugin mentioned in
+the page).
+"""]]
diff --git a/doc/forum/inject__95__preprocess__95__tag.mdwn b/doc/forum/inject__95__preprocess__95__tag.mdwn
new file mode 100644 (file)
index 0000000..2b41b5b
--- /dev/null
@@ -0,0 +1,75 @@
+[[!meta title="Cannot manage to inject preprocess_tag"]]
+
+Hello,    
+I am trying to write a plugin that changes the way the
+[[ikiwiki/directive/tag]] [[ikiwiki/directive]] works, and I am trying to do so
+by using the [[inject|plugins/write/#index81h3]] function. The piece of code
+that should (if I understood well the `inject` function) do the trick is :
+
+      sub import {
+        inject(
+          name => 'IkiWiki::Plugin::tag::preprocess_tag',
+          call => \&my_preprocess_tag
+        );
+      }
+
+Howere, this does not change anything about the effect of the `tag` directive.
+
+I have tried some variants, like calling `inject` outside the `import`
+function, or calling `IkiWiki::loadplugin("tag");` to ensure that the
+[[plugins/tag]] is loaded, but none of these things work. Any idea?
+
+*Disclaimer:* although proficient in several languages, I am a beginner in Perl.
+
+Here is the full code of (a very early version of) my plugin.
+
+    #! /usr/bin/perl
+    require 5.002;
+    package IkiWiki::Plugin::parenttag;
+
+    use warnings;
+    use strict;
+    use IkiWiki 3.00;
+
+    my $orig_preprocess_tag=\&preprocess_tag;
+
+    sub import {
+      inject(
+        name => 'IkiWiki::Plugin::tag::preprocess_tag',
+        call => \&my_preprocess_tag
+      );
+    }
+
+    sub my_preprocess_tag(@) {
+      print "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nWorking!\n";
+      return "TODO";
+    }
+
+    1
+
+-- [[Louis|spalax]]
+
+> Hello,    
+> I managed to replace the tag original `preprocess_tag` function, using a different approach than using `inject`:
+> 
+>     my $orig_preprocess_tag;
+> 
+>     sub import {
+>       IkiWiki::loadplugin("tag");
+>       $orig_preprocess_tag = \&{$IkiWiki::hooks{preprocess}{tag}{call}};
+>       hook(type => "preprocess", id => "tag", call => \&my_preprocess_tag);
+>     }
+> 
+> And later on, I can call the original `preprocess_tag` function using:
+> 
+>     $orig_preprocess_tag->(...)
+> 
+> The problem is that I am digging into `IkiWiki.pm` package to extract data from `IkiWiki::hooks`, which is not guaranteed to work in the future, contrary to `inject`.
+> 
+> Two questions:
+> 
+> - how ugly is my solution?
+> - is it possible to use `inject` to replace the `IkiWiki::Plugin::tag::preprocess_tag` function?
+> 
+> -- [[Louis|spalax]]
+
diff --git a/doc/forum/missing_pages_redirected_to_search-SOLVED/comment_1_aa03c337b31d7acb95761eb51caab1ef._comment b/doc/forum/missing_pages_redirected_to_search-SOLVED/comment_1_aa03c337b31d7acb95761eb51caab1ef._comment
new file mode 100644 (file)
index 0000000..eac5dc1
--- /dev/null
@@ -0,0 +1,44 @@
+[[!comment format=mdwn
+ username="mathdesc"
+ subject="For lighttpd with mod_magnet"
+ date="2012-08-18T18:27:32Z"
+ content="""
+Same can be done for lighttpd via a lua script (said rewrite.lua) using *mod_magnet* than need to be installed and
+called in your conf like this :
+
+<pre>
+# error-handler for status 404                                         
+$HTTP[\"url\"] =~ \"^/mysite/\" { 
+magnet.attract-physical-path-to = ( server.document-root + \"/rewrite.lua\" )
+}
+</pre>
+
+Ref :
+[[mod_magnet docs|http://redmine.lighttpd.net/projects/lighttpd/wiki/Docs_ModMagnet]]
+
+
+
+<pre>
+
+  function removePrefix(str, prefix)    
+        return str:sub(1,#prefix+1) == prefix..\"/\" and str:sub(#prefix+2)
+  end
+
+
+
+   attr = lighty.stat(lighty.env[\"physical.path\"])
+   local prefix = '/mysite'
+   if (not attr) then
+        -- we couldn't stat() the file 
+        -- let's generate a xapian query with it
+        new_uri =removePrefix(lighty.env[\"uri.path\"], prefix)
+        print (\"page not found : \" .. new_uri .. \" asking xapian\")
+        lighty.env[\"uri.path\"] = \"/mysite/ikiwiki.cgi\"    
+        lighty.env[\"uri.query\"] = \"P=\" .. new_uri  
+        lighty.env[\"physical.rel-path\"] = lighty.env[\"uri.path\"]
+        lighty.env[\"physical.path\"] = lighty.env[\"physical.doc-root\"] .. lighty.env[\"physical.rel-path\"]
+    end
+</pre>   
+
+Hope this is useful to you :)
+"""]]
diff --git a/doc/forum/po_plugin_doesn__39__t_create_po_files___40__only_pot__41__..mdwn b/doc/forum/po_plugin_doesn__39__t_create_po_files___40__only_pot__41__..mdwn
new file mode 100644 (file)
index 0000000..95cb62d
--- /dev/null
@@ -0,0 +1,11 @@
+On [[the po plugin's page|plugins/po]] it is clearly stated that "when the plugin has just been enabled, or when a page has just been declared as being translatable, the needed POT and PO files are created". Yet on all my attempts, only the pot file was created. Do I have to create the po files manually somehow? 
+
+To be precise, these are the settings I put in my wiki's setup file to enable the po plugin:
+
+    add_plugins => [qw{... po ...}],
+    po_master_language => 'de|Deutsch',
+    po_slave_languages => 'en|English',
+    po_translatable_pages => "mytranslatedpage",
+    po_link_to => 'current',
+
+… followed by "ikiwiki --setup mysetupfile".
diff --git a/doc/forum/possible_utf-8_problem__63__.mdwn b/doc/forum/possible_utf-8_problem__63__.mdwn
new file mode 100644 (file)
index 0000000..fb87fad
--- /dev/null
@@ -0,0 +1,26 @@
+I have some problems with a blog wiki that I try to setup.
+
+Everything seemed to work correctly with utf-8 until
+I tried to have a page name with utf-8 characters that
+contained a blog. More testing showed that the 'from'-parameter
+in the form didn't like utf-8. Just that variable, everything
+else works fine.
+
+As soon as I try to add a new entry I get "bad page name"
+instead of the editpage.
+
+Here is an example:
+The page itself is named 'hönshuset.mdwn' and it contains
+this blog inline:
+
+\[\[!inline  pages="honshuset/*" postform=yes ]]
+
+Looking at the form, it is the from-parameter that contains 'hönshuset'
+that triggers the problem. If I rename the file to honshuset.mdwn
+everything works fine.
+
+For some reason the from-parameter seems to depend on both the filename and
+the rootpage parameter. If I add *rootpage*, then I must not use
+utf-8 characters in *rootpage* or in the source filename.
+
+I use ikiwiki 3.20120629 in Debian sid.
diff --git a/doc/forum/problem_with_git_after_a_commit_of_ikiwiki.mdwn b/doc/forum/problem_with_git_after_a_commit_of_ikiwiki.mdwn
new file mode 100644 (file)
index 0000000..3fb8929
--- /dev/null
@@ -0,0 +1,4 @@
+after adding a comment on ikiwiki i have this error when im updating ikiwiki from gitolite with git push or using ikiwiki --setup alicewiki.setup
+http://paste.debian.net/160953
+
+and i can't update new post or everythings other
diff --git a/doc/forum/problem_with_git_after_a_commit_of_ikiwiki/comment_1_2b9986717769419a8ae0f730c36b7e65._comment b/doc/forum/problem_with_git_after_a_commit_of_ikiwiki/comment_1_2b9986717769419a8ae0f730c36b7e65._comment
new file mode 100644 (file)
index 0000000..ecdc20b
--- /dev/null
@@ -0,0 +1,22 @@
+[[!comment format=mdwn
+ username="http://smcv.pseudorandom.co.uk/"
+ nickname="smcv"
+ subject="comment 1"
+ date="2012-03-26T08:22:37Z"
+ content="""
+The problem is visible in what you pasted:
+
+    fatal: empty ident  <git@r36457.ovh.net
+    > not allowed
+
+and so is the solution:
+
+    *** Please tell me who you are.
+    
+    Run
+    
+      git config --global user.email \"you@example.com\"
+      git config --global user.name \"Your Name\"
+    
+    to set your account's default identity.
+"""]]
diff --git a/doc/forum/search_plugin_questions.mdwn b/doc/forum/search_plugin_questions.mdwn
new file mode 100644 (file)
index 0000000..4ab985c
--- /dev/null
@@ -0,0 +1,13 @@
+Hello,
+
+I have started using Ikiwiki for a personal site, which is great. I would like to add search functionality with the search plugin, so have it configured with the one parameter needed, and it does see files.
+
+However, it seems to be doing a couple things with URLs that it shouldn't in this case:
+
+* The link to the page has an extraneous "/cgi" in it, e.g. instead of "https://[hostname]/sandbox/" it has ""https://[hostname]/cgi/sandbox/". 
+* Also, the help link is the same, so links to "https://[hostname]/cgi/ikiwiki/searching/".
+
+Another question I had is whether I can restrict the pages which get searched? I would like to have an internal section which isn't linked, and which doesn't pop up in search results. I know that I can configure the web server to restrict access, but would prefer that the page snippet and its presence not be advertised.
+
+  Thanks!
+  Tim
diff --git a/doc/forum/search_plugin_questions/comment_1_d634b00ab758c9fbc43528b9a3176257._comment b/doc/forum/search_plugin_questions/comment_1_d634b00ab758c9fbc43528b9a3176257._comment
new file mode 100644 (file)
index 0000000..947b463
--- /dev/null
@@ -0,0 +1,16 @@
+[[!comment format=mdwn
+ username="http://smcv.pseudorandom.co.uk/"
+ nickname="smcv"
+ subject="comment 1"
+ date="2013-09-22T09:07:43Z"
+ content="""
+It sounds as though the `url` and/or `cgiurl` settings in your setup
+file might be wrong. What are they? What is the actual \"root\" URL
+of your wiki in your web server, and what is the actual URL of the
+CGI script?
+
+Regarding private stuff, I would recommend making a separate ikiwiki
+instance for that, particularly if your wiki accepts edits from
+untrusted people. For instance, anyone who can insert a \[[!map]]
+directive can easily enumerate every page in your wiki.
+"""]]
diff --git a/doc/forum/search_plugin_questions/comment_2_b731c664d314afd1d45485716f39ac3b._comment b/doc/forum/search_plugin_questions/comment_2_b731c664d314afd1d45485716f39ac3b._comment
new file mode 100644 (file)
index 0000000..1cf007f
--- /dev/null
@@ -0,0 +1,11 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawnQpl89u6Sh88gg2irKxbfiwg5h0uLZyzg"
+ nickname="Tim"
+ subject="comment 2"
+ date="2013-09-22T15:44:51Z"
+ content="""
+Thanks. The url parameter is the full hostname, e.g. http://example.com
+The cgiurl parameter is the url plus the path to the CGI, e.g. http://example.com/cgi/iw.cgi
+
+Regular operation of Ikiwiki seems fine, so I can log in, edit pages and so on. As far as the more private part goes, the site is essentially just me, so there won't be pages with odd parameters in them unless I add them.  :)
+"""]]
index 4a78fb932e92ba6380d05cff0f97fe0728bc1470..84b227eef1980d8b948f4ea43dbb8a74800efacb 100644 (file)
@@ -11,3 +11,8 @@ Anyway - I've realised that a big part of the interactive todo lists stuff is tr
 Second, and in a way related, I've been mooting hacking fastcgi support into ikiwiki. Essentially one ikiwiki.cgi process would persist and serve CGI-ish requests on stdin/stdout. The initial content-scanning and dependency generation would happen once and not need to be repeated for future requests. Although, all state-changing operations would need to be careful to ensure the in-memory models were accurate. Also, I don't know how suited the data structures would be for persistence, since the current model is build em up, throw em away, they might not be space-efficient enough for persistence.
 
 If I did attempt this, I would want to avoid restructuring things in a way which would impair ikiwiki's core philosophy of being a static compiler. -- [[Jon]]
+
+> This is quite interesting! There is a related discussion about FastCGI
+> support (and therefore better support for Nginx, for example) in
+> [[todo/fastcgi_or_modperl_installation_instructions/]]... --
+> [[anarcat]]
diff --git a/doc/forum/what_generates_user_name_for_recent_changes_page__63__.mdwn b/doc/forum/what_generates_user_name_for_recent_changes_page__63__.mdwn
new file mode 100644 (file)
index 0000000..ceff293
--- /dev/null
@@ -0,0 +1,3 @@
+On the recent changes page, edits are listed with a username which is a link to the corresponding user page. I'd like the commits from git to show up with the correct username, but am unsure how Ikiwiki sources this info. It doesn't seem to correspond to "git config user.name", for instance.
+
+Any help would be much appreciated! Thanks!
diff --git a/doc/forum/what_generates_user_name_for_recent_changes_page__63__/comment_1_e90085a9d61cdf623c20dfe57005472e._comment b/doc/forum/what_generates_user_name_for_recent_changes_page__63__/comment_1_e90085a9d61cdf623c20dfe57005472e._comment
new file mode 100644 (file)
index 0000000..6692587
--- /dev/null
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="http://smcv.pseudorandom.co.uk/"
+ nickname="smcv"
+ subject="comment 1"
+ date="2013-09-10T10:01:22Z"
+ content="""
+In the git plugin, it's usually the local part (the part before the @)
+of the email address (as in `git config user.email`).
+See `parse_diff_tree()` in `IkiWiki/Plugin/git.pm`.
+"""]]
diff --git a/doc/forum/which_file_ikiwiki_--setup_is_processing_right_now__63__.mdwn b/doc/forum/which_file_ikiwiki_--setup_is_processing_right_now__63__.mdwn
new file mode 100644 (file)
index 0000000..6c5ee43
--- /dev/null
@@ -0,0 +1,4 @@
+is there a way to know which file ikiwiki is currently processing while i am running "ikiwiki --setup $FOO.setup" ?
+
+i am migrating a large ikiwiki instance and the compiler dies in the middle of setup -- but i don't know which file is causing the problem.
+
diff --git a/doc/forum/which_file_ikiwiki_--setup_is_processing_right_now__63__/comment_1_4f52f8fc083982bd5a572742cf35c74f._comment b/doc/forum/which_file_ikiwiki_--setup_is_processing_right_now__63__/comment_1_4f52f8fc083982bd5a572742cf35c74f._comment
new file mode 100644 (file)
index 0000000..21b5e7d
--- /dev/null
@@ -0,0 +1,7 @@
+[[!comment format=mdwn
+ username="https://id.koumbit.net/anarcat"
+ subject="try --verbose"
+ date="2012-09-14T05:01:16Z"
+ content="""
+you can try `--verbose` when you use `--rebuild`, otherwise you could also try `strace`.
+"""]]
similarity index 75%
rename from doc/forum/Problem_with_gitweb/comment_1_c505be6a13651c397fb803dd4117acce._comment
rename to doc/forum/wmd_editor_double_preview/comment_1_0d3acf67f3c35f8c4156228f96dcd975._comment
index 0a492fa49ba175d7dce763650a4511eba392bd94..cc8c9ac438c7a732576523964837d43c3bd929a3 100644 (file)
@@ -2,7 +2,7 @@
  username="https://www.google.com/accounts/o8/id?id=AItOawk_MMtLPS7osC5MjX00q2ATjvvXPWqm0ik"
  nickname="micheal"
  subject="comment 1"
- date="2012-03-05T18:44:36Z"
+ date="2012-08-18T06:30:56Z"
  content="""
-Any Ideas what I could do?
+Any Ideas how to do this?
 """]]
index 1da9fbfbd8926b1e6e0a9b0f41fed84b08e2998e..e71fa57d72cb223721100bddddebfade598ae811 100644 (file)
@@ -12,10 +12,8 @@ rejected.
 
 The gitweb is [here](http://source.ikiwiki.branchable.com/?p=source.git;a=summary).
 
-Commits to this git repository are fed into [CIA](http://cia.vc), and can
-be browsed, subscribed to etc on its
-[project page](http://cia.vc/stats/project/ikiwiki). They're also fed into
-[twitter](http://twitter.com/ikiwiki).
+Commits to this git repository are fed into [KGB](http://kgb.alioth.debian.org/)
+for transmission to the #ikiwiki irc channel. See also: [[spam_fighting]]
 
 ## personal git repositories
 
@@ -45,7 +43,7 @@ think about merging them. This is recommended. :-)
 * [[ikiplugins|DavidBremner]] `git://pivot.cs.unb.ca/git/ikiplugins.git`
 * [[jonas|JonasSmedegaard]] `git://source.jones.dk/ikiwiki-upstream`
 * [[arpitjain]] `git://github.com/arpitjain11/ikiwiki.git`
-* [[chrysn]] `git://github.com/github076986099/ikiwiki.git`
+* [[chrysn]] `git://prometheus.amsuess.com/ikiwiki`
 * [[simonraven]] `git://github.com/kjikaqawej/ikiwiki-simon.git`
 * [[schmonz]] `git://github.com/schmonz/ikiwiki.git`
 * [[will]] `http://www.cse.unsw.edu.au/~willu/ikiwiki.git`
@@ -77,6 +75,12 @@ think about merging them. This is recommended. :-)
 * [[chrismgray]] `git://github.com/chrismgray/ikiwiki.git`
 * [[ttw]] `git://github.com/ttw/ikiwiki.git`
 * [[anarcat]] `git://src.anarcat.ath.cx/ikiwiki`
+* anderbubble `git://civilfritz.net/ikiwiki.git`
+* frioux `git://github.com/frioux/ikiwiki`
+* llipavsky `git://github.com/llipavsky/ikiwiki`
+* [[cbaines]] `git://git.cbaines.net/ikiwiki`
+* [[mhameed]] `git://github.com/mhameed/ikiwiki.git`
+* [[spalax]] `git://github.com/paternal/ikiwiki.git` ([[browse|https://github.com/paternal/ikiwiki]])
 
 ## branches
 
index b643210087732f0438f62afb2b6cbdd87bd2ee17..17c79b30308ada9ce26a78e4278de12f830afc1c 100644 (file)
@@ -20,7 +20,7 @@ Having done this, the only purpose of ikiwiki-calendar would be to re-generate t
 
 Did I miss something? If I am right, I offer to write the necessary patch, copied and adapted from the tag plugin, to generate the pages `archive_base/year/month.mdwn` on the fly.
 
--- Spalax
+-- [[Louis|spalax]]
 
 > Good spotting, `ikiwiki-calendar` predates the `add_autofile` API used to
 > autocreate tag pages and was bolted in as an easy way to create calendar
@@ -34,3 +34,5 @@ Did I miss something? If I am right, I offer to write the necessary patch, copie
 > That last is, arguably, the real point of running ikiwiki-calendar in
 > a cron job. Of course all it really does is run `ikiwiki -setup foo
 > -refresh`. --[[Joey]]
+
+> > [[Patch|todo/calendar_autocreate]]. -- [[Louis|spalax]]
index e5ea72e36cf519816489c17d34b45c9eb895031e..b6330c5e5e2882991a4fdafd81e15f57eecf191a 100644 (file)
@@ -8,8 +8,11 @@ ikiwiki-update-wikilist [-r]
 
 # DESCRIPTION
 
-`ikiwiki-update-wikilist` is designed to be made suid root, but is not installed
-suid by default. If made suid, it allows users to add or remove their names
+`ikiwiki-update-wikilist` is designed to be safely run as root by arbitrary
+users, either by being made suid and using the (now deprecated suidperl), or
+by being configured in `/etc/sudoers` to allow arbitrary users to run.
+
+All it does is allows users to add or remove their names
 from the `/etc/ikiwiki/wikilist` file. 
 
 By default, the user's name will be added.
index c486e821b0fc3ddd66d61226cb53f56ab18ad6bc..6269f5dd8a23935f1970fe62b998ecc15f569885 100644 (file)
@@ -2,9 +2,15 @@ The `edittemplate` directive is supplied by the [[!iki plugins/edittemplate desc
 
 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.
+template, insert an [[ikiwiki/directive/edittemplate]] directive on some other
+page.
 
        \[[!edittemplate template="bugtemplate" match="bugs/*"]]
+A recommended place to put the directive is on the parent page
+of the pages that will be created using the template. So the above
+example would be put on the bugs page. (Do not put the directive on the
+template page itself.)
 
 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
@@ -21,16 +27,20 @@ something like:
        Details:
 
 The template page can also contain [[!cpan HTML::Template]] directives,
-like other ikiwiki [[templates]]. Currently only one variable is
-set: `<TMPL_VAR name>` is replaced with the name of the page being
-created.
+like other ikiwiki [[templates]].
 
-----
+These variables might be set:
 
-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.
+* `<TMPL_VAR name>` is replaced with the name of the page being
+  created.
+  
+* `<TMPL_VAR uuid>` is replaced with a version 4 (random) UUID
+  suitable for use in `\[[!meta guid="urn:uuid:<TMPL_VAR uuid>"]]`.
+  (Requires the `UUID::Tiny` Perl module if not running on Linux.)
+
+* `<TMPL_VAR time>` is replaced with the current (template generation)
+  time using a fixed format (RFC 3339, `%Y-%m-%dT%H:%M:%SZ`),
+  suitable for use in `\[[!meta date="<TMPL_VAR time>"]]`
+  (see [[meta]]) or `\[[!date "<TMPL_VAR time>"]]` (see [[date]]).
 
 [[!meta robots="noindex, follow"]]
diff --git a/doc/ikiwiki/directive/edittemplate/discussion.mdwn b/doc/ikiwiki/directive/edittemplate/discussion.mdwn
new file mode 100644 (file)
index 0000000..81db204
--- /dev/null
@@ -0,0 +1,2 @@
+For some years now I do feel quite comfortable when using all things *template. But one thing I stumble across when setting up another ikiwiki driven site is a sort of misleading resp. missing description with the [[edittemplate]] directive, where it says "(Don't put the directive on the template page itself)". While this is right there should also be mentioned that "the page holding the edittemplage directive must not be named the same as the template page it refers to". At least with my usual setup the edittemplate directive will not work whenever I attempt to simplify things by giving it the same name as the template page.   
+Boris
index 7d11d225f23cc4987964894e23f5ace370234d1e..04ed139593bfbe578798d8149091127e2162985c 100644 (file)
@@ -18,7 +18,7 @@ some other format:
                4
        """]]
 
-Note that if the highlight plugin is enabled, this directive can also be
+Note that if the [[!iki plugins/highlight desc=highlight]] plugin is enabled, this directive can also be
 used to display syntax highlighted code. Many languages and formats are
 supported. For example:
 
index 8b066c2f2a64fa4f7022f713b9035873a86bbbbd..7021e47fb6a64d7e5c27fba2b98c79fab0275908 100644 (file)
@@ -9,14 +9,14 @@ Nodes on the graph can link to external urls using regular graphviz syntax,
 and a clickable imagemap will be created. As a special extension for
 ikiwiki, [[WikiLinks|ikiwiki/wikilink]] can also be used. For example:
 
-       \[[!graph src=""""
+       \[[!graph src="""
        google [ href="http://google.com/" ]
        sandbox [ href=\[[SandBox]] ]
        help [ href=\[[ikiwiki/formatting]] ]
        newpage [ href=\[[NewPage]] ]
        
        google -> sandbox -> help -> newpage -> help -> google;
-       """"]]
+       """]]
 
 The `graph` directive supports the following parameters:
 
diff --git a/doc/ikiwiki/directive/graph/discussion.mdwn b/doc/ikiwiki/directive/graph/discussion.mdwn
new file mode 100644 (file)
index 0000000..f88da72
--- /dev/null
@@ -0,0 +1,27 @@
+How to align this?
+==================
+
+I have found this patch to be the only way I can float graphs to the right:
+
+[[!format diff """
+--- Plugin/graphviz.pm.orig     2012-04-25 10:26:59.531525247 -0400
++++ Plugin/graphviz.pm  2012-04-25 10:26:01.282922144 -0400
+@@ -87,8 +87,10 @@
+                error gettext("failed to run graphviz") if ($sigpipe || $?);
+        }
+
++       my $class = '';
++       $class = 'class="' . $params{class} if $params{class};
+        return "<img src=\"".urlto($dest, $params{destpage}).
+-               "\" usemap=\"#graph$sha\" />\n".
++               "\" usemap=\"#graph$sha\" $class />\n".
+                $map;
+ }
+"""]]
+
+Then I can use `[[!graph class="align-right" ...]]`.. --[[anarcat]]
+
+> You can already use `<div class="align-right">[[!graph ...]]</div>`,
+> doesn't that have the same practical effect? --[[smcv]]
+
+> > It does! I didn't think of that, thanks! I am not used to plain HTML in wikis, and the [[plugins/contrib/osm]] plugin has "right" and "left" directives...  --[[anarcat]]
index 74b735eae9bab124ea79cd97d7105a7af057db2d..6fc28e75ed1ce7be7497e5a0b2bd5b9caa1825f2 100644 (file)
@@ -28,3 +28,7 @@ It does show a clickable question mark for ikiwiki.cgi?page=utah-2006-100-180.pn
 > 
 > To display an image that is really legitimately not part of the wiki, 
 > you can't use a directive, but you can insert `<img>` html if you really want to. --[[Joey]] 
+
+I have a local copy of the [[rcs/Git]] page.  After installing the `imagemagick-perl` package some of the elements display and others are missing including the page outlines with turned corners and all of the yellow folders.  Ideas?
+
+-- [[RonParker]]
index 22c18d9a18714556591b0ac574736a291e4360cf..a4632a5b4c4111151b7249ffd2a7dfa8bbb181eb 100644 (file)
@@ -11,7 +11,9 @@ 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.
+enclosures, which is useful for simple [[!iki podcast desc=podcasting]];
+for fuller-featured podcast feeds, enclose media files in blog posts
+using [[meta]].
 
 The optional `rootpage` parameter tells the wiki that new posts to this
 blog should default to being [[SubPages|SubPage]] of "blog", and enables a
@@ -49,6 +51,8 @@ directive. These are the commonly used ones:
   Set to 0 to show all matching pages.
 * `archive` - If set to "yes", only list page titles and some metadata, not
   full contents.
+* `title` - Sets the title of the rss feed if one is generated.
+  Defaults to the name of the page.
 * `description` - Sets the description of the rss feed if one is generated.
   Defaults to the name of the wiki.
 * `skip` - Specify a number of pages to skip displaying. Can be useful
@@ -113,9 +117,14 @@ Here are some less often needed parameters:
   and/or `page/feed.rss`. This option is not supported if the wiki is
   configured not to use `usedirs`.
 * `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.
+  space-separated list of absolute page names ([[SubPage/LinkingRules]] are
+  not taken into account), and they are inlined in exactly the order given:
+  the `sort` and `pages` parameters cannot be used in conjunction with
+  this one.
+* `trail` - If set to "yes" and the [[!iki plugins/trail desc=trail]] plugin
+  is enabled, turn the inlined pages into a trail with next/previous links,
+  by passing the same options to [[ikiwiki/directive/trailitems]]. The `skip`
+  and `show` options are ignored by the trail, so the next/previous links
+  traverse through all matching pages.
 
 [[!meta robots="noindex, follow"]]
index b7ac17b1a9e19f685f24934c14533cbf750f7996..6c2e6f1c2cd691e9050d571f514184465a6e0e4b 100644 (file)
@@ -23,6 +23,8 @@ Is that possible?
 
 --Peter
 
+> the map directive could be made to use templates as the [[inline directive|ikiwiki/directive/inline]] does. (for the ambitious, the map functionality might even be special-cased into the inline plugin, i think) --[[chrysn]]
+
 ----
 
 The site I'm trying to set up right now (not really a wiki - no public editing) is divided into topics.  Topics are pages that have `\[[!meta link="/topic"]]`.  Topic pages contain an index of their subpages (done with `\[[!inline]]`); the subpages are the real content.  I want a map in the sidebar that lists:
index 72cfc6f569ee434f74e66f82d1759309786c28c6..955648cac5005cd888ca51015b36583f0269d291 100644 (file)
@@ -59,6 +59,15 @@ Supported fields:
   Specifies a short description for the page. This will be put in
   the html header, and can also be displayed by eg, the [[map]] directive.
 
+* keywords
+
+  Specifies keywords summarizing the contents of the page. This
+  information will be put in the html header.  Only letters,
+  numbers, spaces and commas are allowed in this string; other
+  characters are stripped.  Note that the majority of search
+  engines, including Google, do not use information from the
+  keywords header.
+
 * permalink
 
   Specifies a permanent link to the page, if different than the page
@@ -127,14 +136,20 @@ Supported fields:
   [[!iki plugins/htmlscrubber desc=htmlscrubber]] plugin is enabled, since it can be used to
   insert unsafe content.
 
+* enclosure
+
+  Specifies a link to a file to be rendered as an "enclosure" in
+  RSS/Atom feeds (and a plain old link in HTML). Useful for
+  [[!iki podcast desc=podcasting]].
+
 * redir
 
   Causes the page to redirect to another page in the wiki.
 
        \[[!meta redir=otherpage]]
 
-  Optionally, a delay (in seconds) can be specified. The default is to
-  redirect without delay.
+  The default is to redirect without delay.
+  Optionally, a delay (in seconds) can be specified: "delay=10"
 
   It can also be used to redirect to an external url. For example:
 
diff --git a/doc/ikiwiki/directive/meta/discussion.mdwn b/doc/ikiwiki/directive/meta/discussion.mdwn
new file mode 100644 (file)
index 0000000..428f454
--- /dev/null
@@ -0,0 +1,80 @@
+Is there any reason the [language attribute](https://en.wikipedia.org/wiki/Meta_element#The_language_attribute) is not supported?
+--[[LucaCapello]]
+
+> Attached a patch against the Git repository, working on Debian ikiwiki_3.20100815.9. --[[LucaCapello]]
+
+[[patch]]
+
+-----
+
+<pre>
+From 680e57fd384b65e289d92054835687f3d6f3a19d Mon Sep 17 00:00:00 2001
+From: Luca Capello <luca@pca.it>
+Date: Sat, 6 Oct 2012 14:11:19 +0200
+Subject: [PATCH] IkiWiki/Plugin/meta.pm: support the language attribute
+
+---
+ IkiWiki/Plugin/meta.pm          |    9 +++++++++
+ doc/ikiwiki/directive/meta.mdwn |    4 ++++
+ 2 files changed, 13 insertions(+)
+
+diff --git a/IkiWiki/Plugin/meta.pm b/IkiWiki/Plugin/meta.pm
+index 421f1dc..1a49f0c 100644
+--- a/IkiWiki/Plugin/meta.pm
++++ b/IkiWiki/Plugin/meta.pm
+@@ -102,6 +102,10 @@ sub preprocess (@) {
+               $pagestate{$page}{meta}{description}=$value;
+               # fallthrough
+       }
++      elsif ($key eq 'language') {
++              $pagestate{$page}{meta}{language}=$value;
++              # fallthrough
++      }
+       elsif ($key eq 'guid') {
+               $pagestate{$page}{meta}{guid}=$value;
+               # fallthrough
+@@ -279,6 +283,11 @@ sub preprocess (@) {
+               push @{$metaheaders{$page}}, '<meta name="'.$key.
+                       '" content="'.encode_entities($value).'" />';
+       }
++      elsif ($key eq 'language') {
++              push @{$metaheaders{$page}},
++                      '<meta http-equiv="Content-Language" content="'.
++                      encode_entities($value).'" />';
++      }
+       elsif ($key eq 'name') {
+               push @{$metaheaders{$page}}, scrub('<meta name="'.
+                       encode_entities($value).
+diff --git a/doc/ikiwiki/directive/meta.mdwn b/doc/ikiwiki/directive/meta.mdwn
+index 984f685..b82fa58 100644
+--- a/doc/ikiwiki/directive/meta.mdwn
++++ b/doc/ikiwiki/directive/meta.mdwn
+@@ -59,6 +59,10 @@ Supported fields:
+   Specifies a short description for the page. This will be put in
+   the html header, and can also be displayed by eg, the [[map]] directive.
++* language
++
++  Specifies the natural language for the page, for example, "en".
++
+ * keywords
+   Specifies keywords summarizing the contents of the page. This
+-- 
+1.7.10.4
+</pre>
+
+----
+
+I guess patching [[/ikiwiki/directive/meta]] to document the fact this attribute is supported would be good. — [[Jon]]
+
+
+----
+
++1 the language attribute works, I see:
+
+     <meta name="language" content="en" />
+
+The problem is that it does not generate the lang attribute in `<html>` and that's what's required for [hyphenation](https://developer.mozilla.org/en-US/docs/Web/CSS/hyphens) so this would be welcome too!
+
+Also, being able to use the language variable in templates would be very useful for various css tweaks. — [Hugo](https://hroy.eu)
index a2cdd667f6c446c256c397d1f399f47442f7b0f4..6807a81988fbf302591bf3be1c88dc966167c13a 100644 (file)
@@ -27,18 +27,16 @@ icon.png (default, modifiable)..
 
 ## map display
 
- * `map` - map to display, defaults to the current page
-    name in fullscreen mode, "map" otherwise
+ * `map` - map to display, defaults to "map"
  * `zoom` - the level to zoom to on the OSM map
  * `loc` - lattitude and longitude of the map center
  * `lat` - lattitude
  * `lon` - longitude
- * `fullscreen` - make the map take the whole screen through CSS
  * `editable` - add edit controls in a separate layer
- * `right` - float the map right, ignored for fullscreen
- * `left` - float the map left (default unless fullscreen)
- * `width` - width of the map, ignored for fullscreen
- * `height` - height of the map, ignored for fullscreen
+ * `right` - float the map right
+ * `left` - float the map left (default)
+ * `width` - width of the map
+ * `height` - height of the map
 
 ## waypoints
 
diff --git a/doc/ikiwiki/directive/osm/discussion.mdwn b/doc/ikiwiki/directive/osm/discussion.mdwn
new file mode 100644 (file)
index 0000000..d9eb569
--- /dev/null
@@ -0,0 +1,13 @@
+For some reason this stopped working after the 20120203 upgrade:
+
+    Suppression de /home/a-mesh/public_html/map/pois.kml, qui n'est plus rendu par nodes/anarcat
+    Suppression de /home/a-mesh/public_html/map/pois.txt, qui n'est plus rendu par nodes/anarcat
+    Suppression de /home/a-mesh/public_html/map/pois.json, qui n'est plus rendu par nodes/anarcat
+
+The map ceased to be generated, basically. --[[anarcat]]
+
+> Weird. This went away after adding debugging. No clue what happened here. But note that this following debugging code was quite useful in the output of --rebuild:
+
+        debug("writing pois file pois.kml in " . $config{destdir} . "/$map");
+
+The `width` and `height` parameters of the `[[!osm]]` directive stopped working after that upgrade too. The map doesn't show at all when they are added to the directive. --[[anarcat]]
index 6aa3d2ceacf967c6441013765956fa2987451360..0b47a2167979eda2ada81e4756aae5371f437e81 100644 (file)
@@ -19,6 +19,8 @@ Parameters:
 
 * `open` - Whether voting is still open. Set to "no" to close the poll to
   voting.
+* `expandable` - Set to "yes" to make this poll have an interface to add
+  another choice to the poll.
 * `total` - Show total number of votes at bottom of poll. Default is "yes".
 * `percent` - Whether to display percents. Default is "yes".
 
diff --git a/doc/ikiwiki/directive/sidebar/discussion.mdwn b/doc/ikiwiki/directive/sidebar/discussion.mdwn
new file mode 100644 (file)
index 0000000..17c50ac
--- /dev/null
@@ -0,0 +1,10 @@
+Things can get messy if you have enabled the global sidebar setting and you browse the `ikiwiki/directive/*` pages. You will get the content of `ikiwiki/directive/sidebar` as a sidebar to all the directives page... I have emptied the sidebar.mdwn page on our wiki to work around that, but isn't this a bug? --[[anarcat]]
+
+> Another reason to dislike the global sidebar option and wish it didn't
+> exist, as if I didn't have a dozen already. However, renaming this page
+> does not seem like an appropriate fix; adding cruft to every directive/
+> page to force the sidebar off does not seem like an appropriate fix; 
+> this leaves only special casing the plugin to not treat this page as a
+> sidebar, but that's disgusting. --[[Joey]] 
+
+>> Yep, this all sounds wrong... Maybe we could add a global "sidebar exclusion" pattern? Or reverse, allow customizing what name the global sidebar functionality is looking for? For example, we could look for `globalsidebar.mdwn` page instead of just `sidebar.mdwn`? --[[anarcat]]
index a6692f92c59eaa24a3414c6774e17ea1426af055..3e791778978e42b87d20d55eeee813555c338408 100644 (file)
@@ -26,7 +26,7 @@ cells. For example:
        \[[!table data="""
        left||right|
        a|b|c|d
-       this cell spans 4 columns|||
+       this cell spans **4** columns|||
        """]]
 
 ## usage
@@ -47,4 +47,7 @@ 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.
 
+Note that the contents of table cells can contain arbitrary ikiwiki and
+markdown markup.
+
 [[!meta robots="noindex, follow"]]
diff --git a/doc/ikiwiki/directive/tag/discussion.mdwn b/doc/ikiwiki/directive/tag/discussion.mdwn
new file mode 100644 (file)
index 0000000..23352eb
--- /dev/null
@@ -0,0 +1,13 @@
+# Tags in HTML pages
+
+http://rhombus-tech.net is an ikiwiki site where the hardware development is expanding: there are now four hardware projects each of which has its own news page.  For convenience (putting in images for example), the pages have to use HTML not markdown or any other non-HTML format.
+
+However as there are quite a lot of them it would make sense to have an overview page saying "news reports", and that page to be auto-generated because every individual news page is tagged.
+
+... except the news pages are written in HTML, not any markup language into which a tag can be placed.
+
+question: what is the directive which allows an HTML page to have embedded within it a markup "tag"?
+
+> You can use the tag directive in `.html` pages, just like in `.mdwn` pages. This is if you're using
+> the default html plugin. If you instead use the rawhtml plugin, ikiwiki just copies your html files
+> and directives in them won't work. --[[Joey]]
diff --git a/doc/ikiwiki/directive/toggle/discussion.mdwn b/doc/ikiwiki/directive/toggle/discussion.mdwn
new file mode 100644 (file)
index 0000000..e6507ae
--- /dev/null
@@ -0,0 +1,15 @@
+IMHO, i would be very useful to be able to customise the toggle indicator a little bit more. Something like the img directive parameters would be appreciated:
+
+> 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.
+
+So that for instance:
+
+     \[[!toggle id="toggleable-id" text="Toggle" class="collapser"]]
+
+could produce:
+
+     <a class="toggle collapser" href="#posts.toggleable-id">Toggle</a>
+
+This could be extra-useful when using icons like [Font Awesome](http://fortawesome.github.io/Font-Awesome/icons/) so that the toggle link could be a nice icon instead of text.
+
+-- Hugo
similarity index 75%
rename from doc/plugins/contrib/ikiwiki/directive/trailitem.mdwn
rename to doc/ikiwiki/directive/trailitem.mdwn
index 73b1985a5864c233da084996be6e207b5eabd326..59626b5a10f12a941c980e5ef10a1005d3a0f13c 100644 (file)
@@ -1,5 +1,5 @@
 The `trailitem` directive is supplied by the
-[[!iki plugins/contrib/trail desc=trail]] plugin. It is used like this:
+[[!iki plugins/trail desc=trail]] plugin. It is used like this:
 
     \[[!trailitem some_other_page]]
 
similarity index 72%
rename from doc/plugins/contrib/ikiwiki/directive/trailitems.mdwn
rename to doc/ikiwiki/directive/trailitems.mdwn
index 4106ed33bf0783835f7a78bccca339a105478f39..387b403b9f6b8cbee7637d5e0937a7f287161d19 100644 (file)
@@ -1,5 +1,5 @@
 The `trailitems` directive is supplied by the
-[[!iki plugins/contrib/trail desc=trail]] plugin. It adds pages
+[[!iki plugins/trail desc=trail]] plugin. It adds pages
 to the trail represented by the current page, without producing any output
 on that page.
 
@@ -12,9 +12,10 @@ Options are similar to [[!iki ikiwiki/directive/inline desc=inline]]:
 * `pages`: adds pages that match a [[ikiwiki/PageSpec]] to the trail
   (cannot be used with `pagenames`)
 
-* `pagenames`: adds a space-separated list of pages to the trail,
-  with the same [[ikiwiki/SubPage/LinkingRules]] as for a [[ikiwiki/WikiLink]]
-  (cannot be used with `pages`)
+* `pagenames`: if used instead of `pages`, this is interpreted as a
+  space-separated list of absolute page names
+  ([[SubPage/LinkingRules]] are not taken into account)
+  to add to the trail
 
 * `sort`: add the pages matched by `pages` to the trail in this
   [[ikiwiki/pagespec/sorting]] order (cannot be used with `pagenames`)
similarity index 93%
rename from doc/plugins/contrib/ikiwiki/directive/traillink.mdwn
rename to doc/ikiwiki/directive/traillink.mdwn
index 0e40e2411b3d39aba96b40cc2cb1c40c39017945..090e2538d99abe4d13350b0ed1bf50992b51a8b1 100644 (file)
@@ -1,5 +1,5 @@
 The `traillink` directive is supplied by the
-[[!iki plugins/contrib/trail desc=trail]]
+[[!iki plugins/trail desc=trail]]
 plugin. It generates a visible [[ikiwiki/WikiLink]], and also adds the
 linked page to the trail represented by the page containing the directive.
 
similarity index 88%
rename from doc/plugins/contrib/ikiwiki/directive/trailoptions.mdwn
rename to doc/ikiwiki/directive/trailoptions.mdwn
index e1603f11b685344cca358eb45fb7671943cb9043..d83f444c05dbd9102f46063977db8cd9366d62ef 100644 (file)
@@ -1,5 +1,5 @@
 The `trailoptions` directive is supplied by the
-[[!iki plugins/contrib/trail desc=trail]] plugin. It sets options for the
+[[!iki plugins/trail desc=trail]] plugin. It sets options for the
 trail represented by this page.
 
     \[[!trailoptions sort="meta(title)" circular="no"]]
diff --git a/doc/ikiwiki/markdown/discussion.mdwn b/doc/ikiwiki/markdown/discussion.mdwn
new file mode 100644 (file)
index 0000000..7c0d758
--- /dev/null
@@ -0,0 +1,48 @@
+There is an ongoing [effort to standardise Markdown][sm]; I think it would be nice to check whether this implementation is compliant with it.
+
+[sm]: http://standardmarkdown.com/
+
+http://standardmarkdown.com/
+
+> IkiWiki's [[plugins/mdwn]] plugin does not contain an implementation
+> of Markdown: it relies on external libraries. It can currently use
+> any of these, most-preferred first:
+>
+> * [[!cpan Text::MultiMarkdown]], only if explicitly requested via
+>   `$config{multimarkdown}`
+> * [[!cpan Text::Markdown::Discount]], if not explicitly disabled
+>   via `$config{nodiscount}`
+> * [[!cpan Text::Markdown]]
+> * [[!cpan Markdown]]
+> * `/usr/bin/markdown`
+>
+> In practice, Discount is the implementation pulled in by the
+> Debian package dependencies, and (I suspect) the most
+> commonly used with IkiWiki.
+>
+> If the selected external library (whatever it happens to be)
+> complies with a particular interpretation of Markdown, then
+> IkiWiki will too. If not, it won't. The only influence
+> IkiWiki has over its level of compliance with a particular
+> interpretation is in how we choose which external library
+> we prefer.
+>
+> As such, if you want IkiWiki to change its interpretation of
+> Markdown, the way to do that is to either change Discount's
+> interpretation of Markdown, or contribute a patch to make
+> `mdwn.pm` prefer a different (and presumably "more compliant")
+> Markdown implementation.
+>
+> IkiWiki has one syntax extension beyond Markdown, which is
+> that text enclosed in double-square-brackets is an IkiWiki
+> [[ikiwiki/wikilink]] or [[ikiwiki/directive]]. This applies
+> to any markup language used with IkiWiki, not just Markdown.
+>
+> (There also doesn't seem to be any consensus that labelling
+> any particular fork of Markdown as "standard" can make it the 
+> truth, or that this particular fork is the Correct™ fork and not
+> just <https://xkcd.com/927/>; but that's between the authors of
+> Markdown implementations and those who want to standardize
+> Markdown, and it isn't IkiWiki's job to police that.)
+>
+> --[[smcv]]
index fe1af4c153404c35aa21232c7d0f68ddfad55f6b..0f298ad78702b5bba16d98d6585096194cfd90a4 100644 (file)
@@ -51,7 +51,8 @@ Some more elaborate limits can be added to what matches using these functions:
 * "`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.
+  specified IP address. Glob patterns can be used in the address. For
+  example, `ip(127.0.0.*)`
 * "`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 
index 7ede47e998ea494050ca8fbe911c7ca8f94e3c2d..bc5df6cf9714b22efc6a17d641b6b4464e040419 100644 (file)
@@ -13,15 +13,22 @@ appreciation.
 Ikiwiki Hosting
 ===============
 
-* [Branchable](http://branchable.com/)
+[[!table data="""
+Name                                         | Ikiwiki Configuration                                                             | Costs
+[Branchable](http://branchable.com/)         | Open configuration with [ikiwiki-hosting](http://ikiwiki-hosting.branchable.com/) | Free for free software, otherwise involves fees
+[Piny.be](http://piny.be/)                   | Restricted configuration with [Piny](http://piny.be/piny-code/)                   | Free for non-profit purposes (including open source projects); commercial activity disallowed.
+[FairlyStable.org](http://fairlystable.org/) | Restricted configuration with [Piny](http://piny.be/piny-code/)                   | Free for small projects, otherwise involves fees
+"""]]
 
 Projects & Organizations
 ========================
 
 * [This wiki](http://ikiwiki.info) (of course!)
-<!-- * [NetBSD wiki](http://wiki.netbsd.org) -->
+* [NetBSD wiki](http://wiki.netbsd.org)
 * The [GNU Hurd](http://www.gnu.org/software/hurd/)
 * [DragonFly BSD](http://www.dragonflybsd.org/)
+* [X.org](http://www.x.org/)
+* [Freedesktop.org](http://www.freedesktop.org/) and many projects therein
 * [Monotone](http://wiki.monotone.ca/)
 * The [Free Software Foundation](http://fsf.org) uses it for their internal wiki, with subversion.
 * The [cairo graphics library](http://cairographics.org/) website.
@@ -32,7 +39,7 @@ Projects & Organizations
 * The [maildirman wiki](http://svcs.cs.pdx.edu/maildirman)
 * The [Relativistic Programming research wiki](http://wiki.cs.pdx.edu/rp).
 * [Debian-IN](http://debian-in.alioth.debian.org/)
-* [Braawi Ltd](http://braawi.com/) and the community site [Braawi.org](http://braawi.org/)
+* [Braawi Ltd](http://braawi.com/)
 * [Webconverger](http://webconverger.org/) (a Web only linux distribution) with a [blog](http://webconverger.org/blog/)
 * [DebTorrent](http://debtorrent.alioth.debian.org)
 * The [Debian Packaging Handbook project](http://packaging-handbook.alioth.debian.org/wiki/)
@@ -41,20 +48,16 @@ Projects & Organizations
 * [The TOVA Company](http://www.tovatest.com) public site.  We also use it for internal documentation and issue tracking, all with a [[rcs/Git]] backend.
 * Reusable technical support websites, developed for [Redpill](http://redpill.dk/) realms:
   * [master demo site](http://support.redpill.dk/) ([source](http://source.redpill.dk/))
-  * [Homebase](http://support.homebase.dk/) ([source](http://source.homebase.dk/))
+  * [Homebase](http://support.homebase.dk/)
   * [Bitbase](http://support.bitbase.dk/) ([source](http://source.bitbase.dk/))
   * [Børneuniversitetet](http://support.borneuni.dk/) ([source](http://source.borneuni.dk/))
 * [CampusGrün Hamburg](http://www.campusgruen.org/)
 * The [awesome window manager homepage](http://awesome.naquadah.org/)
-* [vcs-pkg](http://vcs-pkg.org)
 * [vcs-home](http://vcs-home.madduck.net)
 * [Public Domain collection of Debian related tips & tricks](http://dabase.com/tips/) - please add any tips too
 * [Finnish Debian community](http://debian.fi)
-* [INCL intranuclear cascade and ABLA evaporation/fission](http://www.cs.helsinki.fi/u/kaitanie/incl/)
 * [dist-bugs](http://dist-bugs.kitenet.net/)
-* [Chaos Computer Club Düsseldorf](https://www.chaosdorf.de)
 * [monkeysphere](http://web.monkeysphere.info/)
-* [St Hugh of Lincoln Catholic Primary School in Surrey](http://www.sthugh-of-lincoln.surrey.sch.uk/)
 * [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/)
@@ -67,35 +70,50 @@ Projects & Organizations
 * [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/)
-* [PDFpirate Community](http://community.pdfpirate.org/)
 * [Software in the Public Interest](http://spi-inc.org/)
 * [NXT Improved Firmware](http://nxt-firmware.ni.fr.eu.org/)
 * [The FreedomBox Foundation](http://www.freedomboxfoundation.org/)
-* [TenderWarehouse Community](http://community.tenderwarehouse.org/)
 * [AntPortal](http://antportal.com/wiki/) - also see our templates and themes on [github](https://github.com/AntPortal/ikiwiked)
 * [The Amnesic Incognito Live System](https://tails.boum.org/index.en.html)
 * [The Progress Linux OS wiki](http://wiki.progress-linux.org/)
 * [Oxford Computer Society](http://www.ox.compsoc.net/)
-* [Russian OpenBSD Community wiki](http://wiki.openbsd.ru/)
-* [Arcada Project](http://arcadaproject.org/)
 * [*BSD UNIX user group in Denmark](http://www.bsd-dk.dk/)
+* [Telecomix Broadcast System](http://broadcast.telecomix.org/)
+* [WikiMIX.cc](http://WikiMIX.cc/)
+* Paris Observatory [Information System website](http://dio.obspm.fr/), also used for internal documentation
+* [SolderPad Documentation](http://docs.solderpad.com)
+* [The Open TV White Space Project](http://opentvws.org)
+* [The RS-232 Club](http://rs232club.org)
+* [FusionInventory project](http://www.fusioninventory.org)
+* FabLab Deventer i.o.
+* [Börn og tónlist](http://bornogtonlist.net/) - an Icelandic open-content site, primarily for kindergarten teachers, about music and music-related activites with children. Migrated from MediaWiki to IkiWiki in June 2013. Heavily changed appearance with only minimal changes to page.tmpl. Also its sister site [Leikur að bókum](http://leikuradbokum.net), about children's books in a kindergarten/pre-school context.
+* [Réseaulibre.ca](http://wiki.reseaulibre.ca) - a mesh project in Montréal, most data is stored in the wiki, including IP address allocation and geographic data. Features map ([[plugins/osm]]) integration.
+* [Foufem](http://foufem.orangeseeds.org/) - Foufem, a feminist hackerspace
+* [[Grésille|http://www.gresille.org]] - A French hactivist group.
+* [[Grenode|http://www.grenode.net]] - A French non-profit Internet access provider.
+* [[Rézine|http://www.rezine.org]] - A French non-proft Internet service provider.
+* [[Nos oignons|http://nos-oignons.net]] - Tor exit nodes funded by the community.
+* [[CAS Libres|http://cas-libres.poivron.org]] - A French feminist radio program.
+* [[Les Barricades|http://barricades.int.eu.org]] - A French socialist choir (CSS has been adapted from the one of [[Grésille|http://www.gresille.org]]).
+* [DKØTU Amateur Radio Station](http://www.dk0tu.de), TU Berlin
+* [[Plan A|http://www.plan-a-muenchen.de/]] - A proposal for improvement of the urban public transport in Munich (by PRO BAHN, Bund Naturschutz and others)
+* [[Smuxi IRC Client|https://smuxi.im/]] - powerful IRC client for GNOME
+* [[hplusroadmap|http://diyhpl.us/wiki/]] - a community for open source hardware, do-it-yourself biohacking and practical transhumanism
+* [[OpenAFS|http://wiki.openafs.org]] - an open-source, cross-platform distributed file system
 
 Personal sites and blogs
 ========================
 
 * [[Joey]]'s [homepage](http://kitenet.net/~joey/), including his weblog
 * [Kyle's MacLea Genealogy wiki](http://kitenet.net/~kyle/family/wiki) and [Livingstone and MacLea Emigration Registry](http://kitenet.net/~kyle/family/registry)
-* [Ulrik's personal web page](http://kaizer.se/wiki/)
 * [kite](http://kitenet.net)
-* [Paul Collins's as-yet purposeless wiki](http://wiki.ondioline.org/)
-* [Alessandro Dotti Contra's personal website](http://www.dotticontra.org/) and [weblog](http://www.dotticontra.org/blog)
+* [Alessandro Dotti Contra's personal website](http://www.dotticontra.org/)
 * [Kelly Clowers' personal website](http://www.clowersnet.net/)
 * [Anna's nature features](http://kitenet.net/~anna/nature-feature/)
 * [Roland Mas's blog](http://roland.entierement.nu/categories/geek-en.html)
-* [Sergio Talens-Oliag's personal wiki](http://mixinet.net/~sto/) and [blog](http://mixinet.net/~sto/blog.html)
+* [Sergio Talens-Oliag's personal wiki](http://mixinet.net/~sto/) and [blog](http://mixinet.net/~sto/blog)
 * [Christian Aichinger's homepage](http://greek0.net/)
-* Ben A'Lee's [homepage](http://subvert.org.uk/~bma/) and [wiki](http://wiki.subvert.org.uk/).
+* Ben A'Lee's [homepage](http://benjaminalee.co.uk/).
 * [Adam  Shand's homepage](http://adam.shand.net/iki/)
 * [Hess family wiki](http://kitenet.net/~family/)
 * [Zack](http://upsilon.cc/~zack)'s homepage, including [his weblog](http://upsilon.cc/~zack/blog/)
@@ -103,7 +121,6 @@ Personal sites and blogs
 * [Keith Packard's homepage and blog](http://keithp.com/).
 * [Christian Mock's homepage](http://www.tahina.priv.at/).
 * [Choffee](http://choffee.co.uk/).
-* [Tales from the Gryphon](http://www.golden-gryphon.com/blog/manoj/), Manoj Srivastava's free software blog.
 * [Proper Treatment 正當作法](http://conway.rutgers.edu/~ccshan/wiki/)
 * [lost scraps](http://web.mornfall.net), pages/blog of Petr Ročkai aka mornfall
 * [Schabis blaue Seite](http://schabi.de) - I abuse ikiwiki as blog/cms combo, and will migrate all existing content into ikiwiki eventually.
@@ -133,7 +150,7 @@ Personal sites and blogs
 * [Per Bothner's blog](http://per.bothner.com/blog/)
 * [Bernd Zeimetz (bzed)](http://bzed.de/)
 * [Gaudenz Steinlin](http://gaudenz.durcheinandertal.ch)
-* [NeoCarz Wiki](http://www.neocarz.com/wiki/) Yes - its actually Ikiwiki behind that! I'm using Nginx and XSL to transform the ikiwiki renderings thanks to the valid XHTML output of ikiwiki. Great work Joey!!
+* [NeoCarz Wiki](http://www.neocarz.com/) Yes - its actually Ikiwiki behind that! I'm using Nginx and XSL to transform the ikiwiki renderings thanks to the valid XHTML output of ikiwiki. Great work Joey!!
 * [Natalian - Kai Hendry's personal blog](http://natalian.org/)
 * [Mick Pollard aka \_lunix_ - Personal sysadmin blog and wiki](http://www.lunix.com.au)
 * [Skirv's Wiki](http://wiki.killfile.org) - formerly Skirv's Homepage
@@ -153,11 +170,10 @@ Personal sites and blogs
 * [Mukund](https://mukund.org/)
 * [Nicolas Schodet](http://ni.fr.eu.org/)
 * [weakish](http://weakish.github.com)
-* [Thomas Kane](http://planetkane.org/)
 * [Marco Silva](http://marcot.eti.br/) a weblog + wiki using the [darcs](http://darcs.net) backend
 * [NeX-6](http://nex-6.taht.net/) ikiwiki blog and wiki running over ipv6
 * [Jason Riedy](http://lovesgoodfood.com/jason/), which may occasionally look funny if I'm playing with my branch...
-* [pmate](http://pmate.nfshost.com)'s homepage and [blog](http://pmate.nfshost.com/blog/)
+* [pmate](http://www.gnurant.org)'s homepage and [blog](http://www.gnurant.org/blog/)
 * [tychoish.com](http://tychoish.com/) - a blog/wiki mashup. blog posts are "rhizomes."
 * [Martin Burmester](http://www.martin-burmester.de/)
 * [Øyvind A. Holm (sunny256)](http://www.sunbase.org) — Read my Ikiwiki praise [here](http://www.sunbase.org/blog/why_ikiwiki/).
@@ -170,10 +186,22 @@ Personal sites and blogs
 * [Michael Hammer](http://www.michael-hammer.at/)
 * [Richardson Family Wiki](http://the4richardsons.com) A wiki, blog or some such nonsense for the family home page or something or other... I will eventually move the rest of my sites to ikiwiki. The source of the site is in git.
 * [The personal website of Andrew Back](http://carrierdetect.com)
-* [SolderPad Documentation](http://docs.solderpad.com)
-* various sub-domains at kisikew.org ([example](https://portal.kisikew.org/))
 * [Paul Elms](http://paul.elms.pro) Personal site and blog in russian.
-* [James' Tech Notes](http://jamestechnotes.com) My technical notes, blog, wiki, personal site.
 * [Salient Dream](http://www.salientdream.com/) - All Things Strange. 
-* [Kafe-in.net](https://www.kafe-in.net/) Ugly personnal blog.
 * [Anton Berezin's blog](http://blog.tobez.org/)
+* [Waldgarten]( http://waldgarten.greenonion.org/ ) News and documentation of a permaculture inspired neighbourhood-garden located in Hamburg, Germany.
+* [[OscarMorante]]'s [personal site](http://oscar.morante.eu).
+* [Puckspage]( http://www.puckspage.org/ ) Political and personal blog in German. The name comes from the elf out of midsummer nights dream.  
+* [[LucaCapello]]'s [homepage](http://luca.pca.it)
+* [[Martín Ferrari's homepage|http://tincho.org/]] and [[blog|http://blog.tincho.org/]]
+* [WikiAtoBR](http://wiki.hi.ato.br) Open, free and annoymous wiki. No need for account registering and login. It is Brazilian so it is in Portuguese.
+* [Manifesto](http://manifesto.hi.ato.br) Open, free and annoymous blog. No need for account registering and login. It is Brazilian so it is in Portuguese.
+ * [Z is for Zombies](http://blog.zouish.org/) — personal blog/site of Francesca Ciceri
+* Julien Lefrique's [homepage](http://julien.lefrique.name/), hosted on [GitHub pages](https://github.com/jlefrique/jlefrique.github.com) with CGI disabled
+* [Anarcat's homepage](http://anarcat.ath.cx/) - with a custom [[theme|theme_market]]
+* [Wouter's Blog](http://grep.be/blog/), with a custom CSS stylesheet based off the rest of his website.
+* [Julian Andres Klode's blog](http://jak-linux.org/)
+* [KheOps's blog](https://w.ceops.eu/words/)
+* [Stig Sandbeck Mathisen](http://fnord.no/) - Personal site and blog, with a bootstrap theme, and varnish frontend.
+* Kalle Söderman: [Seen Architecture](http://img.kalleswork.net), [Stockholm Project](http://stockholm.kalleswork.net) - Mainly -image galleries using the album and osm plugins with a customized html5 theme.
+
index 4c22ce0e0997977ebc168a0b3e8a2856e0d69ac8..89802c604c0803af0d78e4db7254a97751ff7fc8 100644 (file)
@@ -2,7 +2,8 @@ Ikiwiki is a **wiki compiler**. It converts wiki pages into HTML pages
 suitable for publishing on a website. Ikiwiki stores pages and history in a
 [[revision_control_system|rcs]] such as [[Subversion|rcs/svn]] or [[rcs/Git]].
 There are many other [[features]], including support for
-[[blogging|blog]], as well as a large array of [[plugins]].
+[[blogging|blog]] and [[podcasting|podcast]], as well as a large
+array of [[plugins]].
 
 [[!template id=links]]
 
index 9c5d5939b132ca07b46a97c1656d9e8ad69263d1..82fd299e35c1a26b4a2ef8a63d0bcfaca61deef9 100644 (file)
@@ -13,8 +13,9 @@ wrappers.
 
 Ikiwiki requires the [[!cpan Text::Markdown::Discount]] (or 
 [[!cpan Text::Markdown]]), [[!cpan URI]],
-[[!cpan HTML::Parser]], [[!cpan HTML::Template]], and [[!cpan HTML::Scrubber]]
-perl modules be installed. It can also use a lot of other perl modules, if
+[[!cpan HTML::Parser]], [[!cpan HTML::Template]], [[!cpan YAML::XS]] and [[!cpan HTML::Scrubber]]
+perl modules be installed. 
+It can also use a lot of other perl modules, if
 they are available.
 
 Various [[plugins]] use other perl modules and utilities; see their individual
index 5e2b3c736ad780a6dab54ccd510e9103ea76d2b9..3608cb382bd417b73ebf4cbc0701d6132f8f062d 100644 (file)
@@ -57,3 +57,13 @@ added).
   A simplified (442 byte) plain SVG version of the ikiwiki favicon.
 
   Contributed by [[JasonBlevins]]
+
+* <https://archive.org/download/IkiwikiLogo-hi.ato.br/ikiwiki_logo-hiato.png>
+
+  Hosted on: <https://archive.org/details/IkiwikiLogo-hi.ato.br>
+
+  I had to change the black letters to #c8c8c8 to put in my website.
+
+  This was created from the svg source.
+
+  Contributed by [[hiato]]
diff --git a/doc/news/cia.mdwn b/doc/news/cia.mdwn
deleted file mode 100644 (file)
index 3e22be9..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-Commits to ikiwiki's source code are now fed into
-[CIA](http://cia.navi.cx/), and can be browsed, subscribed to etc on its
-[project page](http://cia.navi.cx/stats/project/ikiwiki). Note that changes
-to the documentation wiki are currently excluded.
index b1695c38545237be66c9db6f2c796dd9c892a41d..c158ec3f98a46c1574205d949430239f2796e6db 100644 (file)
@@ -10,4 +10,4 @@ log back in, try out the OpenID signup process if you don't already have an
 OpenID, and see how OpenID works for you. And let me know your feelings about
 making such a switch. --[[Joey]]
 
-[[!poll 67 "Accept only OpenID for logins" 21 "Accept only password logins" 42 "Accept both"]]
+[[!poll 76 "Accept only OpenID for logins" 21 "Accept only password logins" 49 "Accept both"]]
index bc9856ad90dd9b21fed91592663c03a2b05c6345..d8c83f022ff422429c192466b40aed2674a15bc9 100644 (file)
@@ -94,3 +94,30 @@ One caveat to the above is that, of course, OpenID is a distributed trust system
 ----
 
 Submitting bugs in the OpenID components will be difficult if OpenID must be working first...
+
+------
+
+# Privacy and Decentralization
+
+Maybe I don't understand OpenID well enough, but it looks like there are just few providers, most
+of which are huge companies or belong to such, and I don't trust them to verify me identity
+or to not track all my logins. I'll use OpenID only if I can make my own home server
+be my OpenID provider, and if doing so doesn't interfere with the design and security and
+privacy of OpenID, and doesn't require me to use centrally-signed certificates or pay to some
+company or anything like that.
+
+Is it possible to use OpenID in a way keeping the user in full control and allowing any user to
+have their personal provider without damaging the architecture behind OpenID?
+
+I'm worried, at least until the issue is cleared.
+
+-- [[fr33domlover]]
+
+> You can install an OpenID provider on your own server and use that if you
+> wish. I believe you will need an SSL certificate that `ikiwiki.info` trusts.
+> -- [[Jon]]
+
+----
+
+This poll is now 8 years old. Do we have enough data to make a decision?
+Can we consider adding `open=no` to the poll? -- [[Jon]]
diff --git a/doc/news/version_3.20111107.mdwn b/doc/news/version_3.20111107.mdwn
deleted file mode 100644 (file)
index 5af8ae6..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-ikiwiki 3.20111107 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
-   * img: Bugfix to width/height tags for scaled down image when only
-     one dimension was provided. Thanks, Per Carlson.
-   * editpage: Fix FormattingHelp link on Discussion pages.
-   * The umask setting can now be set to private, group, or public,
-     avoiding the need to enter octal correctly which is particularly
-     difficult in yaml setup files. (smcv)
-   * graphviz: Support urls embedded in the graph, by having graphviz
-     generate an imagemap.
-   * graphviz: Support wikilinks embedded in the graph.
-     (Sponsored by The TOVA Company.)"""]]
\ No newline at end of file
diff --git a/doc/news/version_3.20111229.mdwn b/doc/news/version_3.20111229.mdwn
deleted file mode 100644 (file)
index 18c4f8d..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-ikiwiki 3.20111229 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
-   * Consume all stdin when rcs\_receive short-circuits,
-     to avoid git SIGPIPE race.
-   * Add path and path\_natural sort orders (smcv)
-   * Test coverage can be checked with `make coverage` (smcv)
-   * tag: encode categories using numeric values. (tango)"""]]
\ No newline at end of file
diff --git a/doc/news/version_3.20120109.mdwn b/doc/news/version_3.20120109.mdwn
deleted file mode 100644 (file)
index de53c5d..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-ikiwiki 3.20120109 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
-   * mdwn: Can use the discount markdown library, via the
-     Text::Markdown::Discount perl module. This is preferred if available
-     since it's the fastest currently supported markdown library, speeding up
-     ikiwiki's markdown rendering by a factor of 40.
-     (However, when multimarkdown is enabled, Text::Markdown::Multimarkdown
-     is still used.)
-   * On Debian, depend on libtext-markdown-discount."""]]
\ No newline at end of file
diff --git a/doc/news/version_3.20120115.mdwn b/doc/news/version_3.20120115.mdwn
deleted file mode 100644 (file)
index ba665c6..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-ikiwiki 3.20120115 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
-   * Make backlink(.) work. Thanks, Giuseppe Bilotta.
-   * mdwn: Workaround discount's eliding of &lt;style&gt; blocks.
-   * attachment: Fix utf-8 display bug."""]]
\ No newline at end of file
diff --git a/doc/news/version_3.20120202.mdwn b/doc/news/version_3.20120202.mdwn
deleted file mode 100644 (file)
index 3a9ebeb..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-ikiwiki 3.20120202 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
-   * mdwn: Added nodiscount setting, which can be used to avoid using the
-     markdown discount engine, when maximum compatability is needed.
-   * Switch to YAML::XS to work around insanity in YAML::Mo. Closes: #[657533](http://bugs.debian.org/657533)
-   * cvs: Ensure text files are added in non-binary mode. (Amitai Schlair)
-   * cvs: Various cleanups and testing. (Amitai Schlair)
-   * calendar: Fix strftime encoding bug.
-   * shortcuts: Fixed a broken shortcut to wikipedia (accidentially
-     made into a shortcut to wikiMedia).
-   * Various portability improvements. (Amitai Schlair)"""]]
\ No newline at end of file
diff --git a/doc/news/version_3.20140125.mdwn b/doc/news/version_3.20140125.mdwn
new file mode 100644 (file)
index 0000000..3ef6ab3
--- /dev/null
@@ -0,0 +1,5 @@
+ikiwiki 3.20140125 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+   * inline: Allow overriding the title of the feed. Closes: #[735123](http://bugs.debian.org/735123)
+     Thanks, Christophe Rhodes
+   * osm: Escape name parameter. Closes: #[731797](http://bugs.debian.org/731797)"""]]
\ No newline at end of file
diff --git a/doc/news/version_3.20140227.mdwn b/doc/news/version_3.20140227.mdwn
new file mode 100644 (file)
index 0000000..e5f0154
--- /dev/null
@@ -0,0 +1,27 @@
+ikiwiki 3.20140227 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+   * Added useragent config setting. Closes: #[737121](http://bugs.debian.org/737121)
+     Thanks, Tuomas Jormola
+   * po: Add html\_lang\_code and html\_lang\_dir template variables
+     for the language code and direction of text.
+     Thanks, Mesar Hameed
+   * Allow up to 8 levels of nested directives, rather than previous 3
+     in directive infinite loop guard.
+   * git diffurl: Do not escape / in paths to changed files, in order to
+     interoperate with cgit (gitweb works either way)
+     Thanks, intrigeri.
+   * git: Explicity push master branch, as will be needed by git 2.0's
+     change to push.default=matching by default.
+     Thanks, smcv
+   * Deal with nasty issue with gettext clobbering $@ while printing
+     error message containing it.
+     Thanks, smcv
+   * Cleanup of the openid login widget, including replacing of hotlinked
+     images from openid providers with embedded, freely licensed artwork.
+     Thanks, smcv
+   * Improve templates testing.
+     Thanks, smcv
+   * python proxy: Avoid utf-8 related crash.
+     Thanks, Antoine Beaupré
+   * Special thanks to Simon McVittie for being the patchmeister for this
+     release."""]]
\ No newline at end of file
diff --git a/doc/news/version_3.20140613.mdwn b/doc/news/version_3.20140613.mdwn
new file mode 100644 (file)
index 0000000..ab9940a
--- /dev/null
@@ -0,0 +1,5 @@
+ikiwiki 3.20140613 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+   * only\_committed\_changes could fail in a git repository merged
+     with git merge -s ours.
+   * Remove google from openid selector, per http://xkcd.com/1361/"""]]
\ No newline at end of file
diff --git a/doc/news/version_3.20140815.mdwn b/doc/news/version_3.20140815.mdwn
new file mode 100644 (file)
index 0000000..6ec3c73
--- /dev/null
@@ -0,0 +1,10 @@
+ikiwiki 3.20140815 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+   * Add google back to openid selector. Apparently this has gotten a stay
+     of execution until April 2015. (It may continue to work until 2017.)
+   * highlight: Add compatibility with highlight 3.18, while still supporting
+     3.9+. Closes: #[757679](http://bugs.debian.org/757679)
+     Thanks, David Bremner
+   * highlight: Add support for multiple language definition directories
+     Closes: #[757680](http://bugs.debian.org/757680)
+     Thanks, David Bremner"""]]
\ No newline at end of file
diff --git a/doc/news/version_3.20140831.mdwn b/doc/news/version_3.20140831.mdwn
new file mode 100644 (file)
index 0000000..c8ea1a2
--- /dev/null
@@ -0,0 +1,3 @@
+ikiwiki 3.20140831 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+   * Make --no-gettime work in initial build. Closes: #[755075](http://bugs.debian.org/755075)"""]]
\ No newline at end of file
index 5c3b4a8d06b5224aebf6bea2b499069310f60f5f..0c7adc0af1d7154d24a49361e1a90fbb441ec0e4 100644 (file)
@@ -1,8 +1,8 @@
 ikiwiki supports adding "History" links to the top of pages to browse the
 revision history of a page. This is enabled by the `historyurl` setting,
 which is used to specify the URL to a web interface such as [[ViewVC]]
-(for Subversion) or [[Gitweb]]. In that url, "\[[file]]" is replaced with
+(for Subversion) or [[Gitweb]]. In that URL, "\[[file]]" is replaced with
 the name of the file to view.
 
 The [[plugins/repolist]] plugin can supplement this information with
-urls to the underlying repository of the wiki.
+URLs to the underlying repository of the wiki.
index 506657a1c1a16806921b216d842f8bc815adf22c..407012b54581d276a6742f1c8a5ddf41ee3745a2 100644 (file)
@@ -1,5 +1,5 @@
 [[!template id=plugin name=anonok author="[[Joey]]"]]
-[[!tag type/auth]]
+[[!tag type/auth type/comments]]
 
 By default, anonymous users cannot edit the wiki. This plugin allows
 anonymous web users, who have not signed in, to edit any page in the wiki
index c158316d43bfab793f1039874974371c60ddcfc3..3dd017f61897b318d017b40ad70ae704ea851469 100644 (file)
@@ -1,5 +1,5 @@
 [[!template id=plugin name=blogspam author="[[Joey]]"]]
-[[!tag type/auth]]
+[[!tag type/auth type/comments]]
 
 This plugin adds antispam support to ikiwiki, using the
 [blogspam.net](http://blogspam.net/) API. Both page edits and
index 1764b31b2a009afae8fe0fca846f4032dfcef912..d9b7172d58a488f69a99bf7d0393dcc326bf9663 100644 (file)
@@ -7,4 +7,7 @@ link.
 
 If this plugin is enabled, this will be a link: SandBox
 
+Use of this plugin is not recommended, particularly on complex wikis with
+things like [[aggregate]] in use.
+
 [[!tag type/link]]
index 48b6c6ae7a8f7462e3f98d4db0856baa1d93f85d..50a99415f040dd5aec24b5233848546f8fcf73e3 100644 (file)
@@ -1,5 +1,5 @@
 [[!template id=plugin name=comments author="[[Simon_McVittie|smcv]]"]]
-[[!tag type/web]]
+[[!tag type/web type/comments]]
 
 This plugin adds "blog-style" comments. Unlike the wiki-style freeform 
 Discussion pages, these comments are posted by a simple form, cannot later
index 227890bdd621e446417cb03054bf53cd7b9ecec3..2b8add93820297e76abdae78d9cfeea2130ef0de 100644 (file)
@@ -216,3 +216,17 @@ Or at least a reply functionality that quotes the subject/contents?
 -- [[iustin]]
 
 ---
+
+## Disabling certain formats for comments
+
+It seems that comments plugin allows using all enabled formats and
+there is not way to disable some of them. For my blog, I want to use
+additional formats for writing posts but I do not want commenters to
+use those formats because it would be a security problem.
+
+Any suggestions or hints how to implement this?
+
+-- [[wentasah]]
+
+> I've implemented this. See [[todo/Restrict_formats_allowed_for_comments]].
+> --[[wentasah]]
diff --git a/doc/plugins/contrib/addtag.mdwn b/doc/plugins/contrib/addtag.mdwn
new file mode 100644 (file)
index 0000000..5b9461d
--- /dev/null
@@ -0,0 +1,73 @@
+[[!meta author="spalax"]]
+[[!template id=plugin name=addtag author="[[Louis|spalax]]"]]
+[[!tag type/widget]]
+
+# Addtag
+
+This plugin adds links in the edit page to tag pages by clicking on tag links (instead of manually typing the tag directive).
+
+## Template
+
+The editpage template has to be modified to enable this: the following code has
+to be inserted where you want this feature to appear (right after the
+attachment link seems a good place).
+
+[[!toggle id=template text="Template"]]
+[[!toggleable id=template text="""
+    <TMPL_IF NAME="ADDTAG">
+    <a class="toggle" href="#addtag">Tags</a>
+    <TMPL_VAR ADDTAG>
+    <span class="addtag">
+    <div class="toggleable" id="addtag">
+    <em>
+    Enable Javascript to add tags by simply clicking on them.
+    </em>
+    </div>
+    </span>
+    </TMPL_IF>
+"""]]
+
+## CSS
+
+I think that in this case, the tag list looks nicer as columns. To do so, add
+the following code to your CSS.
+
+[[!toggle id=css text="CSS"]]
+[[!toggleable id=css text="""
+    .addtag:after {
+      clear: both;
+      content:".";
+      display:block;
+      height:0;
+      visibility:hidden;
+    }
+    
+    .addtag ul{
+      margin: auto;
+      padding: 0;
+    }
+    
+    .addtag ul li {
+      list-style: none;
+      float: left;
+      margin-left: 1.5em;
+    }
+    
+    .addtag ul ul{
+      margin: 0;
+      padding: 0;
+    }
+    
+    .addtag ul ul li {
+      clear: left;
+      list-style-type: disc;
+    }
+    
+    .addtag ul ul ul li {
+      list-style-type: circle;
+    }
+"""]]
+
+## Code
+
+Code and documentation can be found here : [[https://atelier.gresille.org/projects/gresille-ikiwiki/wiki/Addtag]].
index 836a98f33b9d5225b810bd40360ed2ad392c819a..9fac111647a1ac6b7ef8164c8590ad4a8317dab2 100644 (file)
@@ -11,6 +11,65 @@ This plugin automatically enables the [[filecheck]], [[img]], [[inline]],
 [[trail]] and [[transient]] plugins. The [[meta]] plugin is also
 recommended.
 
+## Demo
+
+* [HTML page of thumbnails](http://ikialbum.hosted.pseudorandom.co.uk/album/)
+  as an entry point to the album
+* Each thumbnail links to
+  [a "viewer" HTML page](http://ikialbum.hosted.pseudorandom.co.uk/album/img_0120/)
+  with a full size image, optional next/previous thumbnail links, and
+  optional [[plugins/comments]]
+
+### Altered Demo
+
+[[!template id=gitbranch branch=cbaines/album]]
+This uses the album plugin, with some altered css, and with the css applied to
+all of the themes.
+
+* [Simple album, rendered using mutiple themes](http://cbaines.net/projects/ikiwiki/album/dest/basic)
+  using the ikiwiki logo.
+
+## Installation
+
+[[!template id=gitbranch branch=smcv/album5 author="[[Simon_McVittie|smcv]]"]]
+
+Available from [[smcv]]'s git repository, in the `album5` branch.
+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 Summer of Code [[plugins/contrib/gallery]] plugin does the
+next/previous UI in Javascript using Lightbox, which means that
+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.)
+
+Updated, June 2014: integrated changes from [[KathrynAndersen]],
+Lukas Lipavsky and kjs
+
+An `album6` branch is also available, but is less suitable
+for manual installation since it needs core IkiWiki changes
+(until [[bugs/trails depend on everything]] is fixed).
+
+### Manual installation
+
+First, you need a version of ikiwiki with the [[trail]] plugin merged in
+(version 3.20120203 or later).
+
+Manual installation requires these files (use the "raw" link in gitweb
+to download):
+
+* [album.pm](http://git.pseudorandom.co.uk/smcv/ikiwiki.git/blob/album5:/IkiWiki/Plugin/album.pm)
+  in an `IkiWiki/Plugin` subdirectory of your configured `plugindir`
+* [albumviewer.tmpl](http://git.pseudorandom.co.uk/smcv/ikiwiki.git/blob/album5:/templates/albumviewer.tmpl),
+  [albumitem.tmpl](http://git.pseudorandom.co.uk/smcv/ikiwiki.git/blob/album5:/templates/albumitem.tmpl),
+  [albumnext.tmpl](http://git.pseudorandom.co.uk/smcv/ikiwiki.git/blob/album5:/templates/albumnext.tmpl) and
+  [albumprev.tmpl](http://git.pseudorandom.co.uk/smcv/ikiwiki.git/blob/album5:/templates/albumprev.tmpl),
+   in your configured `templatedir`, or a `templates` subdirectory of your wiki repository
+* the album-related bits from the end of the
+  [stylesheet](http://git.pseudorandom.co.uk/smcv/ikiwiki.git/blob/album5:/doc/style.css)
+  (put them in your local.css)
+
 ## Changing the templates
 
 When a viewer page is generated or inlined into an album, the template can
@@ -44,49 +103,6 @@ template:
 
        \[[!inline pages="..." sort="-age" template="albumitem"]]
 
-----
-
-[[!template id=gitbranch branch=smcv/album3 author="[[Simon_McVittie|smcv]]"]]
-
-Available from [[smcv]]'s git repository, in the `album3` branch.
-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 Summer of Code [[plugins/contrib/gallery]] plugin does the
-next/previous UI in Javascript using Lightbox, which means that
-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.)
-
-Updated, November 2011: rebased onto [[trail]] v3, CSS adjusted.
-
-## Manual installation
-
-If you don't want to use a branch of ikiwiki, manual installation requires
-these files (use the "raw" link in gitweb to download), in addition to the
-ones needed by [[trail]]:
-
-* [album.pm](http://git.pseudorandom.co.uk/smcv/ikiwiki.git/blob/album3:/IkiWiki/Plugin/album.pm)
-  in an `IkiWiki/Plugin` subdirectory of your configured `plugindir`
-* [albumviewer.tmpl](http://git.pseudorandom.co.uk/smcv/ikiwiki.git/blob/album3:/templates/albumviewer.tmpl),
-  [albumitem.tmpl](http://git.pseudorandom.co.uk/smcv/ikiwiki.git/blob/album3:/templates/albumitem.tmpl),
-  [albumnext.tmpl](http://git.pseudorandom.co.uk/smcv/ikiwiki.git/blob/album3:/templates/albumnext.tmpl) and
-  [albumprev.tmpl](http://git.pseudorandom.co.uk/smcv/ikiwiki.git/blob/album3:/templates/albumprev.tmpl),
-   in your configured `templatedir`, or a `templates` subdirectory of your wiki repository
-* the album-related bits from the end of the
-  [stylesheet](http://git.pseudorandom.co.uk/smcv/ikiwiki.git/blob/album3:/doc/style.css)
-  (put them in your local.css)
-
-## Demo
-
-* [HTML page of thumbnails](http://ikialbum.hosted.pseudorandom.co.uk/album/)
-  as an entry point to the album
-* Each thumbnail links to
-  [a "viewer" HTML page](http://ikialbum.hosted.pseudorandom.co.uk/album/img_0120/)
-  with a full size image, optional next/previous thumbnail links, and
-  optional [[plugins/comments]]
-
 ## Bugs
 
 * There's currently a hard-coded list of extensions that are treated as
@@ -115,9 +131,9 @@ ones needed by [[trail]]:
 
 * 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.
+  copyright). [[smcv]] once had a half-written implementation which runs
+  `scanimage` hooks, and an `exiftool` plugin using [[!cpan Image::ExifTool]]
+  as a reference implementation of that hook, but has lost that code somewhere :-(
 
 * There should be an option to reduce the size of photos and write them into
   an underlay (perhaps just the transient underlay), for this workflow:
index cdb8353e5bedfc60395ba857a00dce0d5c579ebb..23ff9017d366b3d407ce6788c9bf05856bbf91e6 100644 (file)
@@ -1,3 +1,5 @@
+## installation queries from brush
+
 thanks for this plugin.  it might help me in my application, which is to provide album/galleries which can be edited (ie. new images added, taken away, etc.) through web interface.
 
 > That's my goal eventually, too. Perhaps you can help to
@@ -58,6 +60,13 @@ i'm new to ikiwiki, apologies if this is dealt with elsewhere.  -brush
 
 ----
 
+## design feedback from joeyh on an earlier version
+
+Not entirely relevant any more.
+[[!toggle id="old-design-feedback" text="show"]]
+[[!toggleable id="old-design-feedback" text="""
+[[!toggle id="old-design-feedback" text="hide"]]
+
 You had wanted my feedback on the design of this. I have not looked at the
 code or tried it yet, but here goes. --[[Joey]]        
 
@@ -256,12 +265,19 @@ code or tried it yet, but here goes. --[[Joey]]
 >> changed, and only update those viewers where it has. But the dependency
 >> type stuff is still very new, and not plugin friendly .. so only just
 >> possible, --[[Joey]] 
+"""]]
 
 ----
 
+## alternative "special extension" design (conclusion: "don't")
+
 '''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]]'''
 
+[[!toggle id="special-extension-sketch" text="show"]]
+[[!toggleable id="special-extension-sketch" text="""
+[[!toggle id="special-extension-sketch" text="hide"]]
+
 Suppose that each viewer is a JPEG-or-GIF-or-something, with extension
 ".albumimage". We have a gallery "memes" with three images, badger,
 mushroom and snake.
@@ -402,11 +418,472 @@ Things that would be nice, and are probably possible:
 * some way to deep-link to memes/badger.jpg with a wikilink, without knowing a
   priori that it's secretly a JPEG (probably harder than it looks - you'd
   have to make a directive for it and it's probably not worth it)
+"""]]
 
 ----
 
+## resolved bug reports
+
+[[!toggle id="fixed-bugs" text="show"]]
+[[!toggleable id="fixed-bugs" text="""
+[[!toggle id="fixed-bugs" text="hide"]]
+
+### bug: unable to vary thumbnail size
+
 Hi smcv, great plugin. I am an ikiwiki newbie but so far I've had success using your plugin.
 I've integrated the jquery masonry plugin into the albumitem template and it works great.
 But is there a way to create thumnails of different sizes? I've passed thumnailsize option
 and value to album directive and while it does create the new thumbnail sizes it doesn't use them,
 The 96x96 thumbnails still appear on the page no matter what I do. - jaime
+
+> Fixed in album5 branch, thanks to [[KathrynAndersen]]. --[[smcv]]
+
+----
+
+### failed installation
+
+Hi, the plugin looks great, but I am probably too dumb to use it ;( here is what I did:
+created page gal.mdwn with just \[\[!album\]\] directive (no arguments) and subdirectory gal/ with images in form img_1234.jpg
+
+when I run ikiwiki, I get something completely wrong though:
+
+generated gal/index.html page contains following code repeated for every image:
+
+    <div class="album-viewer">
+      <div id="album-img">
+        <div class="album-finish">
+          <a href="./"><span class="album-arrow">↑</span></a>
+        </div>
+      </div>
+    </div>
+
+So no links to any images, etc.
+
+The pages for individual images are generated though, but also not correct. Trails section is perfect, but the main part is wrong:
+
+    <div class="album-prev">
+      <a><span class="album-arrow">â†<90></span></a><br />
+      <div class="album-thumbnail">
+        <span class="selflink">
+          <img src="./96x96-img_2913.jpg" width="96" height="72" alt="img 2913" title="img 2913" class="img" /></span>
+      </div>
+    </div>
+
+This really seems like this should be in the album page and not individul page. It is only thumbnail and not full image. Also the full image is not in the generated html tree at all!
+
+I am using ikiwiki 3.20130518, and got the album sources from the links of [this page](http://ikiwiki.info/plugins/contrib/album/) (part manual installation)
+
+Any hint about what do I do wrong?
+
+Thanks Lukas
+
+> This plugin is not really finished. I probably need to update it for
+> current ikiwiki. I'll try to update it (and also update my demo
+> and installation instructions) at some point. --[[smcv]]
+
+>> I have to appologize, I accidentally copied the template wrongly and that caused all the issues ;(
+>> So now after two days debugging and tracing, I just fixed that and it works. Well, at least a learnt
+>> a lot about ikiwiki internal ;-)
+>> Thanks for all the work you did on the plugin! --Lukas
+
+----
+
+### bug + patch: not all images shown on album page
+
+Hi smcv, we spoke on irc the other day. Passed `show => "0"` on line 126 in album.pm to remove the limit on the thumbnails shown on the album page. Setting it on the album directive didn't work.
+
+--kjs
+
+> That sounds like a correct solution. I'll fix that in my branch when I work on
+> this again. --[[smcv]]
+
+>> Fixed in `album5` branch --s
+
+----
+
+### bug: thumbnailsize doesn't work
+
+As mentioned above by Jaime setting the thumbnailsize doesn't catch either. Or rather if I git push after changing the album directive the generated thumbnails (the image files) are the correct size as set in the directive. The html however uses the default thumbnailsize as hardcoded in album.pm and has broken thumbnails as it links to a file with the default size in the filename.
+
+> [[KathrynAndersen]] fixed this, see below. --[[smcv]]
+
+>> Fixed in `album5` branch --s
+
+Issuing `ikiwiki --rebuild` knocks the system into another gear where the thumbnails show up correctly but this is only due to the html being the same as above (linking to hardcoded thumbnailsize) but the generated thumbnail images are now matching the hardcoded size ignoring the thumbnailsize attribute on the album directive.
+
+For me this behaviour is way beyond my skills to sort out (I'm no coder). The albumplugin ikiwiki combo is very attractive to me and the plugin i soo close to working!
+
+--kjs
+
+### suggested fix for thumbnail size bug
+
+I've tracked down the "always showing the 96x96 thumbnails" bug!
+
+The problem is in the pagetemplate function, which calls "thumbnail" to determine the name of the thumbnail image to use. As you know, the "img" method of generating thumbnails includes the size of the thumbnail as part of its name (to ensure that resizing thumbnails will create a new file of the correct size). The problem is... that in the pagetemplate function, the thumbnailsize is NOT passed in to the call to "thumbnail", so it always returns the default size, 96x96. Hence nothing that anyone can do will change the thumbnails to anything else. Oh, the different-sized thumbnail images ARE created, but they're never linked to.
+
+Here's a context-diff of my fix:
+
+<pre>
+*** /home/kat/files/repos/ikiwiki_smcv/IkiWiki/Plugin/album.pm 2013-12-18 14:50:06.861623226 +1100
+--- album.pm   2013-12-18 15:51:09.393582879 +1100
+***************
+*** 484,489 ****
+--- 484,490 ----
+               my $viewer = $params{page};
+               my $album = $pagestate{$viewer}{album}{album};
+               my $image = $pagestate{$viewer}{album}{image};
++                 my $thumbnailsize = $pagestate{$album}{album}{thumbnailsize};
+  
+               return unless defined $album;
+               return unless defined $image;
+***************
+*** 495,501 ****
+  
+               if ($template->query(name => 'thumbnail')) {
+                       $template->param(thumbnail =>
+!                              thumbnail($viewer, $params{destpage}));
+               }
+               if (IkiWiki::isinlinableimage($image)
+                       && ($template->query(name => 'imagewidth') ||
+--- 496,502 ----
+  
+               if ($template->query(name => 'thumbnail')) {
+                       $template->param(thumbnail =>
+!                              thumbnail($viewer, $params{destpage}, $thumbnailsize));
+               }
+               if (IkiWiki::isinlinableimage($image)
+                       && ($template->query(name => 'imagewidth') ||
+</pre>
+
+-- [[KathrynAndersen]]
+
+> I haven't tried this change, but it seems sane. I'll apply it
+> when I next work on this plugin.
+>
+> (OOI: why not a unified diff? The VCS world seems to have
+> settled on those as universal, and I find them easier to
+> read.)
+>
+> --[[smcv]]
+
+>> Fixed in `album5` --s
+
+----
+
+### bug: inability to show more than 10 items
+
+I've found another bug. The album plugin doesn't allow one to have more than 10 items in an album section. This is because it uses "inline" to display album sections, and the default for inline is to show only 10 items. So it only shows 10 items.
+
+What would be good is if the album directive could have a "show" parameter which is passed on to preprocess_inline, so that users could decide how many items to show (including ALL of them, if they give show=0).
+
+-- [[KathrynAndersen]]
+
+> My intention was that all items would always be shown, so I would always pass
+> `show => 0` to `preprocess_inline` (as kjs suggested above), but that must have
+> got lost somewhere. I'll apply it next time I work on this plugin.
+>
+> An optional `show` parameter would be a possible enhancement beyond that,
+> although I don't know how useful it would be; if it isn't passed, the
+> default should be 0 (unlimited). --[[smcv]]
+
+>> Fixed in `album5` --s
+
+----
+
+### cbaines' commit to change default thumbnail size
+
+Regarding commit `Change the default thumbnail size`: as far as I
+understand it, `size => 96x96` is meant to set the image size to
+be as large as possible given these constraints: width ≤ 96px,
+height ≤ 96px, and the original aspect ratio is preserved. So I
+would hope that 96x96 doesn't distort the thumbnails. What distortion
+are you seeing, and which versions of Imagemagick and Perlmagick
+are you using?
+
+--[[smcv]]
+
+> I rebuilt the examples using both your album4 and album5 branches, and I only
+> see this in the album4 branch. So this is probably ok to ignore.
+> --[[cbaines]]
+>
+>> OK, I'll assume that was a duplicate of an earlier patch, probably the
+>> one from KathrynAndersen. --s
+
+"""]]
+
+----
+
+## wishlist + patch: make clicking on the large image go to the next
+
+I've changed the behavior of the "slideshow" to show the next image when clicking the large image as downloading a full resolution image is a rare use case in a gallery of this type imho. The large clicktarget means you are likely to unnecessarily download large files otherwise. I can't quite follow the template, album.pm flow so I can't figure out how to put a "download full resolution" link on the viewer page which would be my next step. To achieve the next link i added ` link => ($nextpage or $album),` around line 454 in `my $img`
+
+--kjs
+
+> That seems reasonable. I'll consider that when I work on this
+> plugin again next. --[[smcv]]
+
+----
+
+## wishlist from kjs
+
+My wishlist for the plugin would include:
+
+- Reading exif info from the imagefile
+- ~~Keeping the full resolution image files out of version control~~ Solved this by simply creating a underlay for the images. Works out of the box for my non cgi workflow.
+- Being able to create new albums by tag or by manually picking images from other albums. Could be a simple comma separated list of viewer names, or even full urls, in the album directive.
+- A counter showing **current image/total number of images in album**. This would mean that you know how many images you have left to click through before you have seen all images in an album. This gives you enought info to decide weather to click through or go back/leave.
+
+--kjs
+
+> I want the first two of those too, perhaps one day I'll get round to
+> implementing them.
+>
+> For the third, you can get the same practical effect using an inline
+> as documented in the main page. --[[smcv]]
+>> The downside to current behaviour is that clicking an inlined thumbnail will take you to the original album context. Previous/Next image will not match the thumbnails in the inline but the thumbnails in the album. This is a bit confusing for users and prevents using the image in multiple contexts without duplicating the image. To achieve what I'm looking for there would have to be several AlbumViewer pages for a single image. --kjs
+>>
+>>> Hmm, OK. That breaks the "one picture : one page" mental model,
+>>> unfortunately. The pictures themselves can't be first-class wiki pages (see
+>>> lengthy design discussions with Joey above) because they aren't something
+>>> that produces HTML, and don't have human-readable text source code.
+>>> In the current (album5) design, the viewer pages that are automatically
+>>> created to go alongside the pictures are basically stand-ins for the
+>>> pictures, as far as metadata, wikilinks, tags and other "first-class
+>>> wiki page" things are concerned. --s
+
+>>>> I can see why it's important to keep these models simple and have figured out
+>>>> that the viewer pages are stand-ins for the image. Just as a tought though. If 
+>>>> this relationship was made more explicit ie. the viewer pages *are the content*
+>>>> just initially generated from the image metadata with a link to the image. Then 
+>>>> the mental model would stay intact and more in line with how html and the 
+>>>> implementation works.
+>>>>
+>>>> One thing to point out is that last time I tried pages can be members of 
+>>>> arbitrary numbers of trails/albums. You just get multiple rows of navigation, one
+>>>> for each trail. This doesn't quite work as it's hard to know which one to click.
+>>>>
+>>>> --k
+
+>>>>> Pages can be part of arbitrarily many trails, yes - that's a consequence of
+>>>>> how trails are created. If you can think of a better way to present a page
+>>>>> that's in more than one trail, I'd welcome ideas... I did originally have an
+>>>>> implementation where only one trail would generate links, but when I tried
+>>>>> it on some (rather artificial) overlapping trails, the result was more
+>>>>> confusing. --s
+
+>>> If there are to be viewer pages elsewhere in the wiki, I don't think
+>>> inheriting the picture's metadata is desired. Suppose you have a
+>>> picture of Alice and Bob in the album "holiday in Exampleton, 2010",
+>>> and it is tagged people/alice, people/bob and places/exampleton; the
+>>> other contexts it appears in might include "pictures of Alice" and
+>>> "pictures near Exampleton". If you look at the tag page for
+>>> places/exampleton, I doubt you want to see that photo listed three
+>>> times - once is enough, there's only one actual photo after all. So
+>>> I think the "main" viewer page should be the only one that has
+>>> the taglinks for people/alice, people/bob, places/exampleton.
+>>> --s
+
+>>>> The problem exposed by the tag page issue is very tricky. As you'd
+>>>> probably want the exif info, captions and titles to transfer. Just not 
+>>>> necessarily the tags.
+>>>> --k
+
+>>> My next question is, should the viewer page representing that
+>>> particular picture in its context of "pictures near Exampleton"
+>>> (i.e. its "next" and "previous" links go to the next and
+>>> previous picture near Exampleton, regardless of whether it was
+>>> on an earlier or later visit) be a first-class wiki page
+>>> at all?
+>>> --s
+
+>>> * Does it make any sense to comment on "this picture in this
+>>>   context", if your wiki has comments, or should the only
+>>>   place you can comment on it be its "main" viewer page?
+>>> * Is there any need for it to be possible to make a wikilink
+>>>   to that particular picture in that particular context,
+>>>   or does it only need wikilinks "to the picture" (which,
+>>>   as an implementation detail, really go to its "main" viewer
+>>>   page)?
+>>> * Can the picture in that particular context have tags
+>>>   that are orthogonal to the tags its "main" viewer page has?
+>>> * ... and so on for various wiki features
+>>>
+>>> It sound as though the answer might ideally be that this secondary
+>>> viewer page doesn't need to be a first-class wiki page at all,
+>>> only a HTML output... except that the trail plugin works in terms
+>>> of next and previous first-class wiki pages, not next and
+>>> previous HTML outputs, and the HTML-generation pipeline
+>>> is really aimed towards real pages.
+>>>
+>>> Perhaps the secondary viewer page should end up looking
+>>> something like this:
+>>>
+>>>     \[[!albumviewer original=holiday-in-exampleton-2010/img1234
+>>>       comment="To edit picture metadata, edit the original page instead"]]
+>>>
+>>> and one of the side-effects of the albumviewer directive should be to
+>>> replace [[plugins/comments]] with a link to the original? --s
+
+>>>> One thing to consider is the built in difference between the original and 
+>>>> the secondary inferred by the fact that the first is an `album` the second
+>>>> an `inline` --k
+
+>>>>> I had assumed that both the "original" album (the one where the picture
+>>>>> is physically located), and any other places you wanted to display it,
+>>>>> would be some other directive whose implementation includes a call to
+>>>>> `preprocess_inline`. `inline` on its own is not enough to create
+>>>>> viewer pages to display the pictures, regardless of whether you
+>>>>> want them to be one-per-picture or many-per-picture, and I'm not
+>>>>> going to wedge yet more functionality into that plugin :-)
+>>>>>
+>>>>> It might be a good idea for the thing that displays pictures not
+>>>>> physically located below that point to be a different directive, yes.
+>>>>> --s
+
+>>>> ### Single viewer 
+>>>> For my own usecase what you describe makes sense. I see the content of an inline object
+>>>> (struggling a bit with what terms to user here) as a particular composition of
+>>>> viewers. Perhaps comments should only be possible on the page with the inline rather 
+>>>> than the secondary viewer pages as the inline page not the image viewer is 
+>>>> the first-class page in this scenario? The inline page would also be the page you tag 
+>>>> etc. to make it show up in various contexts such as the tag page.
+>>>>
+>>>> With the thinking outlined above I'd say that the secondary viewer should be a 
+>>>> non editable clone of the original viewer without any source. Just html output with 
+>>>> backlinks to the original page. This means that there are limitations to how these 
+>>>> secondary viewers can be used as the title, caption etc might fit some contexts 
+>>>> better than others. Personally this is fine as I see these inline based albums as 
+>>>> compositions or views on existing content.
+>>>> --k
+>>>>
+>>>>> This is basically what I thought at first, but I realised while
+>>>>> writing my earlier comments that it would be necessary
+>>>>> to hack up [[plugins/trail]] fairly seriously to make it produce
+>>>>> a trail through things that are not first-class wiki pages, and
+>>>>> I'm not sure how much it would be necessary to subvert the
+>>>>> rendering pipeline to get the right parentlinks and so on. --s
+>>>>
+>>>> ###Multiple viewers alternative
+>>>> The alternative is having a page say in `/story/album.mdwn` with the following directive
+>>>> \[[!inline  pages="/01/IMGP6494 or /02/IMGP6601 or /04/IMGP6922" sort="title"  show="0" template="albumitem"]]
+>>>> that creates new fully fledged editable viewers for each image in `/story/album/'
+>>>> without tags being auto populated but backlinks to the original album viewer.
+>>>> --k
+>>>>
+>>>>> It can't *only* be an inline, because an inline wouldn't generate the
+>>>>> viewer pages, but I see what you mean. --s
+>>>>>
+>>>>>> That's actually excellent as the inline is a very useful feature
+>>>>>> the way it works now. I started writing about this yesterday but
+>>>>>> got interrupted. My indexes of albums use the inline in it's current
+>>>>>> form. --k
+>>>>  
+>>>> This would make the viewers completely independent allowing for unique titles, captions and comments
+>>>> depending on context. Very useful when creating powerpoint like slideshows where you might need 
+>>>> different captions depending on the context. In your example wiki with photos from gigs this would allow 
+>>>> a page with an album inline about stage lighting with a selections of images and captions that highlight
+>>>> relevant things in the image as well as a separate inline album page, with some of the same images, 
+>>>> about drumming styles and posture/grip of drummers.
+>>>>
+>>>> I started writing all this supporting your single page case but looking at it now from my limited
+>>>> understanding of how ikiwiki works it seems the multiple viewers option is conceptually cleaner 
+>>>> and more flexible. It relies on three things:
+
+>>>> * A mental model where the viewer page is the content not the image
+>>>> * That tags aren't automatically transferred from the original context. This doesn't seem that critical however.
+>>>> * Backlinks to the other places the image is used.
+>>>>
+>>>> --[[kjs]]
+
+I've added "--k" to some of your comments so other readers (possibly including
+my future self) can keep track of our conversation, I hope you don't mind :-)
+--s
+
+----
+
+## cbaines' CSS changes
+
+Regarding the CSS changes: I'll try to have a look soon, work out
+what actually changed (since you re-ordered the CSS, so it isn't
+immediately obvious from the diff), and integrate some or all of your
+changes. Since Joey shows no signs of wanting to merge it, and "out of tree"
+installation is currently a pain, I might split out the CSS changes into a
+separate `ikiwiki/album.css` so that the only thing that needs to be merged
+into style.css (or into local.css) is an appropriate
+`@import` rule.
+
+It shouldn't be necessary to add the album stuff to each individual
+theme's style.css unless you actually want an actiontabs album and
+a blueview album to be styled differently, because the IkiWiki Makefile
+concatenates them: for instance, `/usr/share/ikiwiki/themes/actiontabs/style.css`
+is the output of `cat doc/style.css themes/actiontabs/style.css`. So adding it
+to `doc/style.css` should be enough? --[[smcv]]
+
+> I don't think this is the case? Or at least, looking at the generated
+> stylesheet for the examples built using my branch, I would expect there to be
+> two copies of the album rules in the stylesheet [1], but there does not
+> appear to be. This could quite easily be a result of some mistake in my part
+> in not isolating the build though. --[[cbaines]]
+>
+> 1: <http://cbaines.net/projects/ikiwiki/album/dest/basic-actiontabs/style.css>
+>
+>> I searched for `/* relevant to the index page */` and found it twice,
+>> so I stand by what I said :-) --s
+>>
+>>> And right you are, unsure how I missed that. My album branch is now rebased
+>>> on your album5 branch (with the two now useless commits removed).
+>>> --[[cbaines]]
+
+cbaines, would you mind publishing an album with more realistic pixel-sizes
+of images using your modified CSS? It's difficult to get an idea of how it
+will degrade under conditions like "image size > browser window" with
+images as small as the ones you used. You might find
+<http://git.pseudorandom.co.uk/smcv/ikiwiki-demos/ikialbum.git>
+(`git clone git://git.pseudorandom.co.uk/git/smcv/ikiwiki-demos/ikialbum.git`),
+or the same techniques, useful: it contains images with a realistic pixel
+count, but very very lossy JPEG compression, to keep the size in bytes low.
+
+> I have now created a large (images) example, you can find all the examples
+> here [1]. I have also built all the examples with the album5 branch, you can
+> find the results here [2].
+>
+> 1: <http://cbaines.net/projects/ikiwiki/album/dest/>
+> 2: <http://cbaines.net/projects/ikiwiki/album/dest-album5/>
+
+It's much, much easier to review changes if you use separate commits for
+cosmetic changes like "separate index CSS from viewer CSS" and "more
+consistent indentation", and functional changes like turning the prev/next
+links from absolutely-positioned to floating. I'd be happy to apply
+the cosmetic changes if they were in commits that were literally only
+cosmetic changes, with no functional effect.
+
+> I have now rewritten the CSS changes to get a smaller diff. The only big
+> functional change is from the previous patch is the max-width stuff to cope
+> better with large images.
+
+For the functional bits: I think I'd have used floating boxes instead of the
+absolutely-positioned boxes that are currently used if they provided the effect
+I wanted. I can't remember exactly why I didn't do that now, but
+it might have been because if the browser window shrinks below the image width,
+floats have weird behaviour (they push the actual image out of the way), or because
+I wanted the entire left/right margin of the image to be clickable to have
+a large click-target for scrolling through the album.
+
+If there's something specific that you think is wrong with the CSS in my
+branch, could you please explain it, and perhaps we can come up with something
+that matches both our requirements?
+
+--smcv
+
+> I don't think that something specific is wrong with CSS in the album5 branch,
+> but it does not display large [3], or small [4] images very well. It might be
+> possible to resolve the image size issues without changing from absolute
+> positioning, but I felt (for no particular reason) that I would do it using
+> floats.
+>
+> The clickable region on the margin seems the most likely reason to me to go
+> with absolute positioning, as an initial look at doing this with floats
+> suggests that it is non-trivial.
+>
+> 3: <http://cbaines.net/projects/ikiwiki/album/dest-album5/large-goldtype/album/3/>
+> 4: <http://cbaines.net/projects/ikiwiki/album/dest-album5/basic-blueview/album/ikiwiki_old/>
diff --git a/doc/plugins/contrib/asymptote.mdwn b/doc/plugins/contrib/asymptote.mdwn
new file mode 100644 (file)
index 0000000..a85c60e
--- /dev/null
@@ -0,0 +1,141 @@
+[[!template id=plugin name=asymptote author="[Peter Simons](http://cryp.to/)"]]
+[[!tag type/widget]]
+
+This plugin provides the [[ikiwiki/directive/asymptote]]
+[[ikiwiki/directive]] which allows embedding
+[asymptote](http://asymptote.sourceforge.net/) diagrams in a page.
+
+Security implications: asymptote has functions for reading files and
+other dangerous stuff, so enabling this plugin means that everyone who
+can edit your Wiki can also read any file from your hard drive thats
+accessible to the user running Ikiwiki. 
+
+[[!if test="enabled(asymptote)" then="""
+An example diagram:
+
+[[!asymptote src="""
+import geometry;
+unitsize(1cm);
+triangle t = triangle((0,0), (4,0), (0.5,2));
+show(La="$D$", Lb="$E$", Lc="", t);
+dot(t.A^^t.B^^t.C);
+point pD = midpoint(t.BC); dot(pD);
+point pE = midpoint(t.AC); dot(pE);
+draw(pD--pE);
+
+point A_ = (pD-t.A)*2+t.A; dot("$A'$", A_, NE);
+draw(t.B--A_--t.C, dashed);
+draw(t.A--A_, dashed);
+
+point E_ = midpoint(line(t.B,A_)); dot(Label("$E'$", E_, E));
+draw(E_--pD, dashed);
+"""]]
+"""]]
+
+This plugin uses the [[!cpan Digest::SHA]] perl module.
+
+The full source code is:
+
+        #! /usr/bin/perl
+
+        package IkiWiki::Plugin::asymptote;
+        use warnings;
+        use strict;
+        use Digest::MD5 qw(md5_hex);
+        use File::Temp qw(tempdir);
+        use HTML::Entities;
+        use Encode;
+        use IkiWiki 3.00;
+
+        sub import {
+                hook(type => "getsetup", id => "asymptote", call => \&getsetup);
+                hook(type => "preprocess", id => "asymptote", call => \&preprocess);
+        }
+
+        sub getsetup () {
+                return
+                        plugin => {
+                                safe => 1,
+                                rebuild => undef,
+                                section => "widget",
+                        },
+        }
+
+        sub preprocess (@) {
+                my %params = @_;
+
+                my $code = $params{src};
+                if (! defined $code && ! length $code) {
+                        error gettext("missing src attribute");
+                }
+                return create($code, \%params);
+        }
+
+        sub create ($$$) {
+                # This function calls the image generating function and returns
+                # the <img .. /> for the generated image.
+                my $code = shift;
+                my $params = shift;
+
+                my $digest = md5_hex(Encode::encode_utf8($code));
+
+                my $imglink= $params->{page} . "/$digest.png";
+                my $imglog =  $params->{page} .  "/$digest.log";
+                will_render($params->{page}, $imglink);
+                will_render($params->{page}, $imglog);
+
+                my $imgurl=urlto($imglink, $params->{destpage});
+                my $logurl=urlto($imglog, $params->{destpage});
+
+                if (-e "$config{destdir}/$imglink" ||
+                    gen_image($code, $digest, $params->{page})) {
+                        return qq{<img src="$imgurl}
+                                .(exists $params->{alt} ? qq{" alt="} . $params->{alt} : qq{})
+                                .qq{" class="asymptote" />};
+                }
+                else {
+                        error qq{<a href="$logurl">}.gettext("failed to generate image from code")."</a>";
+                }
+        }
+
+        sub gen_image ($$$$) {
+                # Actually creates the image.
+                my $code = shift;
+                my $digest = shift;
+                my $imagedir = shift;
+
+                my $tmp = eval { create_tmp_dir($digest) };
+                if (! $@ &&
+                    writefile("$digest.asy", $tmp, $code) &&
+                    writefile("$imagedir/$digest.png", $config{destdir}, "") &&
+                    system("asy -render=2 -offscreen -f png -o $config{destdir}/$imagedir/$digest.png $tmp/$digest.asy &>$tmp/$digest.log") == 0
+                   ) {
+                        return 1;
+                }
+                else {
+                        # store failure log
+                        my $log="";
+                        {
+                                if (open(my $f, '<', "$tmp/$digest.log")) {
+                                        local $/=undef;
+                                        $log = <$f>;
+                                        close($f);
+                                }
+                        }
+                        writefile("$digest.log", "$config{destdir}/$imagedir", $log);
+
+                        return 0;
+                }
+        }
+
+        sub create_tmp_dir ($) {
+                # Create a temp directory, it will be removed when ikiwiki exits.
+                my $base = shift;
+
+                my $template = $base.".XXXXXXXXXX";
+                my $tmpdir = tempdir($template, TMPDIR => 1, CLEANUP => 1);
+                return $tmpdir;
+        }
+
+        1
+
diff --git a/doc/plugins/contrib/asymptote/ikiwiki/directive/asymptote.mdwn b/doc/plugins/contrib/asymptote/ikiwiki/directive/asymptote.mdwn
new file mode 100644 (file)
index 0000000..c6bdb1a
--- /dev/null
@@ -0,0 +1,27 @@
+The `asymptote` directive is supplied by the [[!iki plugins/contrib/asymptote
+desc=asymptote]] plugin.
+
+This directive allows embedding [asymptote](http://asymptote.sourceforge.net/)
+diagrams in a page. Example usage:
+
+       \[[!asymptote src="""
+        import geometry;
+        unitsize(1cm);
+        triangle t = triangle((0,0), (4,0), (0.5,2));
+        show(La="$D$", Lb="$E$", Lc="", t);
+        dot(t.A^^t.B^^t.C);
+        point pD = midpoint(t.BC); dot(pD);
+        point pE = midpoint(t.AC); dot(pE);
+        draw(pD--pE);
+        point A_ = (pD-t.A)*2+t.A; dot("$A'$", A_, NE);
+        draw(t.B--A_--t.C, dashed);
+        draw(t.A--A_, dashed);
+        point E_ = midpoint(line(t.B,A_)); dot(Label("$E'$", E_, E));
+        draw(E_--pD, dashed);
+        """]]
+
+The `asymptote` directive supports the following parameters:
+
+- `src` - The asymptote source code to render.
+
+[[!meta robots="noindex, follow"]]
diff --git a/doc/plugins/contrib/cowsay.mdwn b/doc/plugins/contrib/cowsay.mdwn
new file mode 100644 (file)
index 0000000..4d0824a
--- /dev/null
@@ -0,0 +1,33 @@
+[[!template id=plugin name=cowsay author="[[BrianCandler]]"]]
+[[!tag type/fun]]
+
+This plugin provides the cowsay [[ikiwiki/directive]].
+This directive allows creation of ASCII-art cows.
+
+For example,
+
+~~~
+\[[!cowsay state="stoned" text="""
+moo tube!
+"""]]
+~~~
+
+renders as
+
+~~~
+ ___________
+< moo tube! >
+ -----------
+        \   ^__^
+         \  (**)\_______
+            (__)\       )\/\
+             U  ||----w |
+                ||     ||
+~~~
+
+You must have the [cowsay](https://en.wikipedia.org/wiki/Cowsay) package
+installed.
+
+# Download
+
+You can get the source code from [github](https://github.com/candlerb/ikiwiki-cowsay)
diff --git a/doc/plugins/contrib/created_in_future.mdwn b/doc/plugins/contrib/created_in_future.mdwn
new file mode 100644 (file)
index 0000000..95793e1
--- /dev/null
@@ -0,0 +1,29 @@
+[[!meta author="spalax"]]
+[[!template id=plugin name="created_in_future (deprecated)" author="[[Louis|spalax]]"]]
+
+# Created_in_future
+
+This plugin is deprecated, and can be replaced by function `cdate_geq_today()` in plugin [[datetime_cmp|plugins/contrib/datetime_cmp]].
+
+[[!toggle id=old text="Show/Hide old documentation"]]
+
+[[!toggleable id=old text="""
+# Created_in_future
+
+This plugin provides a `created_in_future()` [[PageSpec|ikiwiki/pagespec/]]
+function. It matches pages which have a creation date in the future.
+
+It also sets the date of the next modification of the page on its creation
+date, so that the corresponding page (and the pages referring to it) will be
+rebuilt on the relevant call of `ikiwiki`.
+
+## Usage
+
+It can be used to display a list of upcoming events.
+
+       \[[!inline pages="events/* and created_in_future()" reverse=yes sorted=meta(date)]]
+
+## Code
+
+Code and documentation this way: [[https://atelier.gresille.org/projects/gresille-ikiwiki/wiki/Created_in_future]].
+"""]]
diff --git a/doc/plugins/contrib/created_in_future/discussion.mdwn b/doc/plugins/contrib/created_in_future/discussion.mdwn
new file mode 100644 (file)
index 0000000..34844de
--- /dev/null
@@ -0,0 +1 @@
+Thanks, good stuff. I wrote something similar to facilitate delaying the publication of pages until after a certain date, but mine is quite rough and ready. — [[Jon]]
diff --git a/doc/plugins/contrib/datetime_cmp.mdwn b/doc/plugins/contrib/datetime_cmp.mdwn
new file mode 100644 (file)
index 0000000..ba35b37
--- /dev/null
@@ -0,0 +1,86 @@
+[[!meta author="spalax"]]
+[[!template id=plugin name=datetime_cmp author="[[Louis|spalax]]"]]
+[[!tag type/pagespec]]
+
+# Datetime_cmp
+
+This plugin provides a family of
+[pagespec](http://ikiwiki.info/ikiwiki/pagespec/) matching pages according to
+creation or modification times.
+
+It also sets the date of the next modification of the page on relevant date, so
+that the page will be rebuilt if the condition changes.
+
+## List of functions
+
+The list of functions is given by the following regexp:
+
+    [ct](date|time)_(lt|gt|leq|geq|eq|neq)_(abs|page|now|today)(|_delta)
+
+where:
+
+  * `[ct]`: compare creation or modification time or date:
+    * `c`reation time;
+    * `m`odification time.
+  * `(date|time)`: compare full date and time, or only date (useful when time is irrelevant):
+    * `time`: compare full date and time;
+    * `date`: compare only date.
+  * `(lt|gt|leq|geq|eq|neq)`: operator of comparison:
+    * `lt`: less than;
+    * `gt`: greater than;
+    * `leq`: less or equal than;
+    * `geq`: greater or equal than;
+    * `eq`: equal;
+    * `neq`: not equal.
+  * `(abs|page|now|today)`: element to compare to:
+    * `abs`: absolute date or time (given in argument);
+    * `page`: other page (given in argument);
+    * `now`: date or time of compilation;
+    * `today`: same meaning as `now`.
+  * `(|_delta)`: used to add a time delta (to use comparisons such as *created at least two days after `some_page`*):
+    * *empty*: no delta;
+    * `_delta`: delta (given in argument).
+
+### Number of arguments
+
+[[!table header=no data="""
+         | `now` `today`  | `page`            | `abs`
+no delta | *no arguments* | `pagename`        | `date`
+delta    | `delta`        | `pagename, delta` | `date, delta`
+"""]]
+
+### Format of arguments
+
+* *date* or *time*: anything that can be recognized by perl [[str2time|http://search.cpan.org/~rse/lcwa-1.0.0/lib/lwp/lib/HTTP/Date.pm]] function, *without any comma*.
+* *delta*: One of the following patterns:
+  * `Y-M-D`: positive date;
+  * `H:M:S`: positive time;
+  * `Y-M-D H:M:S`: positive date and time;
+  * Add `-` at the beginning of the string to make durations negative.
+* several arguments: when two arguments are provided, they are passed as one string, which is then split according to the last comma.
+
+## Time zones
+
+Key `timezone` in the setup file is used to define time zone. If not set, we
+try to guess the local time zone.
+
+## Examples
+
+### Some functions
+
+* `ctime_gt_page(foo)`: match pages created after page `foo`.
+* `cdate_eq_today()`: match pages created the day the wiki is compiled.
+* `mtime_eq_now()`: match pages modified the time the wiki is compiled (likely no page, since comparison is done up to the milisecond).
+* `cdate_geq_page_delta(foo, 00-00-01)`: match pages created at least one day after page `foo`.
+* `cdate_gt_page(foo)`: same as the previous one.
+* `mdate_gt_today_delta(-00-01-00)`: match pages modified one month ago, or later (can be used to display recent changes).
+
+### Use case
+
+It can be used to display a list of upcoming events.
+
+       \[[!inline pages="events/* and cdate_geq_today()" reverse=yes sorted=meta(date)]]
+
+## Code
+
+Code and documentation this way: [[https://atelier.gresille.org/projects/gresille-ikiwiki/wiki/datetime_cmp]].
diff --git a/doc/plugins/contrib/default_content_for___42__copyright__42___and___42__license__42__/discussion.mdwn b/doc/plugins/contrib/default_content_for___42__copyright__42___and___42__license__42__/discussion.mdwn
new file mode 100644 (file)
index 0000000..9374112
--- /dev/null
@@ -0,0 +1,7 @@
+These plugins do not to work well with reStructuredText pages (and
+possibly others).
+
+The issue seems to be that the copyright/licence HTML text is injected
+into the page text before the page is converted to HTML.  So, parsers
+like reStructuredText which do not allow intermixing their native
+format with HTML, will complain.
index 5f7fffead805088b777303dabeacb5d32410c0a0..13ea8b1b3aa2fdefeb2f678ce51269d36d2857d3 100644 (file)
@@ -1,3 +1,50 @@
+## Multiple values arrays
+
+This breaks if there are multiple values for a single key. It works fine in the report plugin, but inline display shows the ARRAY reference, e.g. 
+
+    IPv6:
+    - fd64:2c08:9fa7:4::1
+    - 2001:470:1d:4a6::1
+
+and:
+
+    {{$IPv6}}
+
+yields:
+
+    ARRAY(0x266db10)
+
+Seems to me this could be checked and `join(" ")`'d. :) -- [[anarcat]]
+
+> I wrote a stupid fix for this, which works for getfield, but isn't as good for report. It simply does that `join()`. Here's the patch:
+> 
+> [[!format diff """
+--- a/IkiWiki/Plugin/field.pm
++++ b/IkiWiki/Plugin/field.pm
+@@ -322,6 +322,9 @@ sub field_get_value ($$;@) {
+     {
+        $basevalue = calculated_values($lc_field_name, $page);
+     }
++    if (ref($basevalue) eq "ARRAY") {
++        $basevalue = join(" ", @{$basevalue}); # hack
++    }
+     if (defined $basevalue)
+     {
+        $Cache{$page}{$basename} = $basevalue;
+@@ -360,6 +363,9 @@ sub field_get_value ($$;@) {
+     {
+        $value = $basevalue;
+     }
++    if (ref($value) eq "ARRAY") {
++        $value = join(" ", @{$value}); # hack
++    }
+     if (defined $value)
+     {
+        $Cache{$page}{$lc_field_name} = $value;
+"""]]
+>
+> Seems to me this should be the default, at the very least in getfield. But at least, with the above patch we don't see expanded Perl ref's. ;) --[[anarcat]]
+
 ## 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]]
index 9d21a6b7ac74c7e51fcac04addb1b0071f14b5b8..c43490b1305ec57f409e9788dbfe3528b1ca2063 100644 (file)
@@ -18,4 +18,4 @@ It can be [found here][3].
 
 [3]: http://www.tahina.priv.at/hacks/googlemaps.html
 
-See also [[plugins/contrib/osm]].
+See also [[plugins/osm]].
diff --git a/doc/plugins/contrib/ikiwiki/directive/trailinline.mdwn b/doc/plugins/contrib/ikiwiki/directive/trailinline.mdwn
deleted file mode 100644 (file)
index 91d8a4e..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-The `trailinline` directive is provided by the
-[[!iki plugins/contrib/trail desc=trail]]
-plugin. It is equivalent to combining [[ikiwiki/directive/trailitems]] and
-[[ikiwiki/directive/inline]] directives with the same options.
-
-A typical use is to navigate through all posts in a blog:
-
-      \[[!trailinline pages="page(./posts/*) and !*/Discussion" archive=yes
-        feedshow=10 quick=yes]]
-
-[[!meta robots="noindex, follow"]]
diff --git a/doc/plugins/contrib/ikiwiki/directive/ymlfront/discussion.mdwn b/doc/plugins/contrib/ikiwiki/directive/ymlfront/discussion.mdwn
new file mode 100644 (file)
index 0000000..f49c850
--- /dev/null
@@ -0,0 +1,37 @@
+I can't seem to make this work. I have tried, in this [sandbox](http://mesh.openisp.ca/sandbox), to set values for fields and then display them with the getfield meta syntax, but it doesn't seem to be working.
+
+The getfield, field and ymlfront plugins are enabled. I have tried with and without the following field registration:
+
+    # field plugin
+    # define the fields for the meshmtl project
+    field_register:
+    - meta
+    - hostname
+    - MAC
+    - IP
+
+I have tried both the ymlfront directive and the YAML markup (with the
+`---` delimiter), no luck. Any idea what I am doing wrong? --
+[[anarcat]]
+
+> I'm afraid I can't tell from here what the problem could be.  It's clear that ymlfront is turned on, or the ymlfront directive in your sandbox page wouldn't be processed.  The only thing I can suggest, in order to get more information about what could be going wrong, would be to do a dump of your indexdb file (see [[tips/inside dot ikiwiki]]) and see what the data for your sandbox page is.  If there is field data there, that would indicate a problem with getfield; if there isn't field data there, that would indicate a problem with field or ymlfront.
+
+> Oh, and you only need to register "meta" with field_register; that will enable the data defined by the "meta" plugin to be read by field.  Unless "hostname", "MAC" and "IP" are plugins, you don't need to add them to field_register.  They can be taken care of by the ymlfront plugin.  Perhaps that is the problem?
+
+> --[[KathrynAndersen]]
+
+> > I have tried removing the other fields from the declaration, no luck. I did, however, notice the following error in the `--rebuild` output:
+> > 
+> >     ymlfront parse: Load of sandbox data failed: YAML Error: Stream does not end with newline character
+> >        Code: YAML_PARSE_ERR_NO_FINAL_NEWLINE
+> >        Line: 0
+> >        Document: 0
+> >      at /usr/share/perl5/YAML/Loader.pm line 38
+> > 
+> > Now *that* has to be related... ;) In the index.db, there is no ymlfront metadata for the sandbox page... Note that the `---` delimiter approach doesn't trigger the warning but doesn't populate the DB either...
+> > 
+> > Finally note that after adding debugging code, I was able to figure out that this seems to be using the `YAML::XS` library. I have also traced the data and confirmed that `$yml_str` does get properly initialized in `parse_yml`, and it is where the error is generated. So maybe there's something wrong with the YAML library?
+> > 
+> > Update: well, look here: using `YAML::Syck` doesn't yield the same error *and* the metadata actually works! So this is a problem specific to `YAML::Any`. Hardcoding `use YAML::XS` or *even* `use YAML::Any` fixed the problem for me.
+> > 
+> > Now delimiters also work, but the output is kind of ugly: it gets parsed as regular markdown makup so the `---` makes horizontal lines in the beginning and headings in the end... --[[anarcat]]
diff --git a/doc/plugins/contrib/irclog.mdwn b/doc/plugins/contrib/irclog.mdwn
new file mode 100644 (file)
index 0000000..634f010
--- /dev/null
@@ -0,0 +1,21 @@
+The [irclog](https://github.com/ironchicken/ikiwiki-irclog) plugin allows including a formatted IRC log in your wiki.
+
+### Usage
+
+The `[[!irclog]]` directive takes the following arguments:
+
+`location` (required)
+
+The URI of your IRC log file. Currently the URI schemes `file:`, `http:`, and `ssh:` have been implemented. Only `ssh:` has been tested: `ssh://host/path/to/#channel`.
+
+`earliest` (optional)
+
+A date/time in the format `%F %T` (i.e. `YYYY-MM-DD HH:MM:SS`). Events before this time will not be included. String comparison is used, so you can omit portions of the date/time if you like, e.g. `YYYY-MM`.
+
+`latest` (optional)
+
+A date/time. Events after this time will not be included.
+
+`keywords` (optional)
+
+A mapping of keywords to translations, formatted like a Perl hash, e.g.: "richard=>\[[richard]\]". In this case occurrences of "richard" will be replaced with "\[[richard]\]" (which will later be processed as a WikiLink).
diff --git a/doc/plugins/contrib/jscalendar.mdwn b/doc/plugins/contrib/jscalendar.mdwn
new file mode 100644 (file)
index 0000000..8123b31
--- /dev/null
@@ -0,0 +1,50 @@
+[[!meta author="spalax"]]
+[[!template id=plugin name=jscalendar author="[[Louis|spalax]]"]]
+
+# Jscalendar
+
+Jscalendar is a javascript equivalent to the [[calendar|plugins/calendar]] plugin.
+
+## Description
+
+Here are some differences compared to this latter plugin.
+
+* Pros
+  * No need to rebuild the page containing the calendar each time day changes, or
+    a page (indexed by the calendar) is added, changed or deleted. This is
+    particularly useful if you want to have this calendar in the sidebar.
+  * Smooth navigation among months.
+* Cons
+  * Javascript :( .
+
+## Usage
+
+### Examples of directive
+
+    \[[!jscalendar type="month" ]]
+
+    \[[!jscalendar type="month" archivebase="calendar"]]
+
+    \[[!jscalendar type="month" year=2014 month=08 pages="posts/* and !posts/*"]]
+
+    \[[!jscalendar type="month" year=-1 month=08]]
+
+### Setup file
+
+This plugin uses the options used by the [[plugins/calendar]] plugin:
+
+    'archivebase' => "archive",
+    'archive_pagespec' => "posts/* and ! posts/*/*",
+    'week_start_day' => 1,
+    'month_link' => 1,
+
+The `archivebase` and `archive_pagespec` can be overloaded by the very same
+options of the directive.
+
+## Example
+
+You can see this plugin in action on [[our website|http://www.gresille.org]].
+
+Code and documentation can be found here : [[https://atelier.gresille.org/projects/gresille-ikiwiki/wiki/Jscalendar]]
+
+-- Louis
diff --git a/doc/plugins/contrib/livefyre.mdwn b/doc/plugins/contrib/livefyre.mdwn
new file mode 100644 (file)
index 0000000..d4a62c0
--- /dev/null
@@ -0,0 +1,14 @@
+[[!template id=plugin name=livefyre core=0 author="[[cmauch]]"]]
+[[!tag  type/special-purpose]]
+
+[LiveFyre](http://www.livefyre.com) is a third party comment and discussion system similar in some ways to Disqus or IntenseDebate.  All three services use javascript to attach comments to your site without the need to use a native commenting system.  
+
+This plugin is designed to replace the commenting system in IkiWiki entirely.  It embeds LiveFyre comments on your ikiwiki blog or posts.  It is was originally based on the [Disqus Plugin](https://code.google.com/p/ikiwiki-plugin-disqus/).  After a few days of noticing odd page title names on the livefyre moderation interface, I updated the script to make use of JSON.  I made extensive use of the [integration guide](https://github.com/Livefyre/livefyre-docs/wiki/StreamHub-Integration-Guide) to get it all running.
+
+It's loud and messy and slow, but kind of neat too.
+
+Requires the [[!cpan JSON]], [[!cpan JSON::WebToken]], and [[!cpan Digest::MD5]] perl modules to be available. 
+
+You can grab the source [here](https://bitbucket.org/cmauch/ikiwiki/src/master/IkiWiki/Plugin/livefyre.pm)
+
+See the POD documention in the module for installation and configuration instructions.
diff --git a/doc/plugins/contrib/localfavicon.mdwn b/doc/plugins/contrib/localfavicon.mdwn
new file mode 100644 (file)
index 0000000..66c9fdf
--- /dev/null
@@ -0,0 +1,7 @@
+[[!template id=plugin name=localfavicon author="Franek"]]
+
+This is a trivial modification of the [[plugins/favicon]] plugin to allow different favicons for different parts of the site. For this, the option "localfavicon" has to be set to 1 in the setup file, otherwise the plugin behaves just like the favicon plugin.
+
+For now, it can be downloaded here: [[http://perm.lemtank.de/localfavicon.pm]]
+
+See the [[this forum thread|forum/Can_I_have_different_favicons_for_each_folder__63__]] for discussion.
diff --git a/doc/plugins/contrib/mathjax.mdwn b/doc/plugins/contrib/mathjax.mdwn
new file mode 100644 (file)
index 0000000..a784b95
--- /dev/null
@@ -0,0 +1,13 @@
+[[!template id="plugin" name="mathjax" author="Baldur Kristinsson"]]
+
+The [mathjax plugin](https://github.com/bk/ikiwiki-plugin-mathjax), available on GitHub, provides easy MathJax support for ikiwiki.
+
+Features:
+
+- No change needed to page.tmpl
+- Javascript is only loaded on pages which need it.
+- Both inline and display math are supported.
+- Unlike [[the pandoc plugin|plugins/contrib/pandoc]] or a solution based on editing page.tmpl, no irritating conflicts with the smiley plugin.
+- Unlike the pandoc plugin, it is easy to use in shared hosting or other environments where you have difficulty in installing extra software (beyond Perl modules, obviously).
+
+However, if you need the power of Pandoc, such as bibliography support or pdf generation, then that is probably the better option for you.
index 5066d9de54be523707f91aaa8f7ca8ee34eb876e..c288d9bd182a59a18818cfef06368f60531267b0 100644 (file)
@@ -3,3 +3,7 @@ Anyone know a safe place where this plugin can be found? -- mjr at phonecoop.coo
 > I ended up doing a backassward way of doing it, as described at the [convert discussion page](http://ikiwiki.info/tips/convert_mediawiki_to_ikiwiki/discussion/). -[[simonraven]]
 
 >> I've mirrored it at <http://alcopop.org/~jon/mediawiki.pm>. -- [[Jon]]
+
+---
+
+Something that gives me better results is to edit the source of the [[wikitext]] plugin, and change all occurences of Text::WikiFormat to Text::MediawikiFormat. (This of course depends on ''libtext-mediawikiformat-perl'' instead of ''libtext-wikiformat-perl'' -- [[gi1242]]
diff --git a/doc/plugins/contrib/monthcalendar.mdwn b/doc/plugins/contrib/monthcalendar.mdwn
new file mode 100644 (file)
index 0000000..c21be0a
--- /dev/null
@@ -0,0 +1,127 @@
+[[!meta author="spalax"]]
+[[!template id=plugin name=monthcalendar author="[[Louis|spalax]]"]]
+
+# Monthcalendar
+
+This plugin displays a calendar, containing in each of its day the list of links of pages published on this day. It can be used, for example, to display archives of blog posts, or to announce events.
+
+The difference between this plugin and the [[plugins/calendar]] plugin is that the calendar displayed by this plugin is a big one, containing the full title of every page indexed in it.
+
+## Usage
+
+### Directive
+
+    \[[!monthcalendar type="month" year="2012" month="06" pages="events/*"]]
+
+### Automation
+
+By using the following line in template `calendarmonth.tmpl`, you can have `ikiwiki-calendar` using this plugin to display monthly archives.
+
+    \[[!monthcalendar type="month" year="<TMPL_VAR YEAR>" month="<TMPL_VAR MONTH>" pages="<TMPL_VAR PAGESPEC>"]]
+
+## CSS
+
+Here is an example of CSS properly rendering the calendar produced by this
+plugin.
+[[!toggle id=css text="CSS"]]
+[[!toggleable id=css text="""
+    /* Calendar */
+    .monthcalendar
+    {
+        color:#aaa;
+        /* font-size:18pt; */
+        margin-top:1em;
+        margin-bottom:1em;
+               width: 100%;
+    }
+    
+    .monthcalendar table,
+    .monthcalendar td,
+    .monthcalendar th
+    {
+       border: 1px solid #ccc;
+    }
+    
+    #content .monthcalendar td
+    {
+        padding: 0;
+        position: relative;
+    }
+    
+    .monthcalendar td div
+    {
+        min-height: 10ex;
+        height: 100%;
+        position: relative;
+    }
+    
+    .monthcalendar th
+    {
+       vertical-align: middle;
+    }
+    
+    .monthcalendar td ul
+    {
+        padding-left: 0.5em;
+        list-style: dot;
+        list-style-position: inside;
+        text-align: left;
+        font-size: 8pt;
+        position: relative;
+        z-index: 10;
+        font-weight: bold;
+    }
+    
+    table.monthcalendar
+    {
+       table-layout: fixed;
+    }
+    
+    .monthcalendar .selflink
+    {
+        color:#444444;
+    }
+    
+    .monthcalendar-day-head {
+       text-transform:capitalize;
+    }
+    
+    .monthcalendar-head {
+       text-transform:capitalize;
+    }
+    
+    .monthcalendar-daynumber
+    {
+        float: left;
+        position: absolute;
+        display: block;
+        font-size: 7ex;
+        color: #ccc;
+        line-height: 100%;
+        z-index: 5;
+        padding-top: 0.3ex;
+        text-align: right;
+        width: 1.8em;
+    }
+    
+    /* List of pages */
+    
+    .monthcalendar-pagelist {
+      display: flex;
+      flex-direction: column;
+    }
+    
+    .monthcalendar-item {
+      opacity: 0;
+      height: 0;
+    }
+    
+    .monthcalendar-item:target {
+      opacity: 1;
+      height: initial;
+    }
+"""]]
+
+## Code
+
+Code and documentation can be found here : [[https://atelier.gresille.org/projects/gresille-ikiwiki/wiki/Monthcalendar]].
index f1c15c6e02ca410ab2ca12ef6a6228c78b170ed9..9de66f7877341e484203e2e0bd54b96eca2ddab5 100644 (file)
@@ -38,3 +38,6 @@ If you are interested in this, drop me a line tobi at oetiker dot ch
 
 
 In the meanwhile, I ([[MartinQuinson]]) have hacked this a bit to make it fit my needs. The result is [[here|http://www.loria.fr/~quinson/Hacking/ikiwiki/]]
+
+In the meanwhile I too have hacked this for my needs and fixed a few bugs in Martin's version.
+The result (and source / instructions) can be found [[here|http://wiki.math.cmu.edu/iki/wiki/tips/20140720-ikiwiki-navbar.html]]. (It is not mobile ready yet, but might be soon...)
diff --git a/doc/plugins/contrib/nimble.mdwn b/doc/plugins/contrib/nimble.mdwn
new file mode 100644 (file)
index 0000000..29e2686
--- /dev/null
@@ -0,0 +1,6 @@
+[[!template id=plugin name=nimble author="[[schmonz]]"]]
+[[!template id=gitbranch branch=schmonz/nimble author="[[schmonz]]"]]
+[[!tag type/format]]
+
+This plugin lets ikiwiki convert [Nimble](http://was.tl/projects/nimble/)
+to HTML.
index 264aafd953fa34c3c8e67ebc62f636980c779933..c938036053bbd5ac4671d3939d80f274108d2141 100644 (file)
@@ -4,3 +4,4 @@ This plugin enables Markdown processing using [Pandoc](http://johnmacfarlane.net
 
 This is an expanded and updated version of [[Jason Blevin|users/jasonblevins]]'s pandoc plugin. Get it and see further details at <https://github.com/dubiousjim/pandoc-iki>.
 
+A version, merging enhancements in various forks is available at <https://github.com/sciunto/ikiwiki-pandoc>. PR are welcome.
diff --git a/doc/plugins/contrib/parenttag.mdwn b/doc/plugins/contrib/parenttag.mdwn
new file mode 100644 (file)
index 0000000..5dc01c7
--- /dev/null
@@ -0,0 +1,14 @@
+[[!meta author="spalax"]]
+[[!template id=plugin name=parenttag author="[[Louis|spalax]]"]]
+[[!tag type/tags]]
+
+This plugin deals with subtags (e.g. `mathematics/calculus`). Whenever a page is tagged, it is automatically tagged with its subtags as well: the following directives are equivalent:
+
+    \[[!tag mathematics/calculus]]
+    \[[!tag mathematics mathematics/calculus]]
+
+The `taglink` directive is changed as well: instead of displaying the leaf of the tag, the full path (up to `tagbase` configuration option) is displayed, each bit linking to its corresponding page. For instance, directive `\[[!taglink mathematics/calculus]]` creates a link similar to `\[[TAGBASE/mathematics]]/\[[TAGBASE/mathematics/calculus]]`.
+
+## Code
+
+Code and documentation can be found here : [[https://atelier.gresille.org/projects/gresille-ikiwiki/wiki/Parenttag]].
diff --git a/doc/plugins/contrib/poetry.mdwn b/doc/plugins/contrib/poetry.mdwn
new file mode 100644 (file)
index 0000000..aed2e42
--- /dev/null
@@ -0,0 +1,107 @@
+[[!meta author="spalax"]]
+[[!template id=plugin name=poetry author="[[Louis|spalax]]"]]
+
+# Poetry
+
+The poetry plugin provides the [[ikiwiki/directive/poetry]] directive, used to
+render poetry (or songs).
+
+## Why?
+
+### Typography
+
+In regular text, there are two different meaning of a new line: a break between
+two paragraphs, and the line wrap.
+
+When rendering poetry, we need a third one: the carriage return between two
+verse lines. This one should be different from the line wrap carriage return,
+otherwise one will not be able to tell apart these two: is a word displayed at
+the begenning of its line a new verse line, or the previous verse line,
+continuing on a new line because it is too long?
+
+Generally, wrapped text is indented, whereas verse lines are not.
+
+### Markdown
+
+One could use carriage return (two white spaces at the end of a line) between
+verse lines, and paragraph break between stanzas, but:
+
+* adding white spaces at the end of lines is painful;
+* there is no easy way to render chorus (in a different way from verses).
+
+## Usage
+
+The directive takes only one argument `content`, containing the poetry to
+render. Carriage returns are respected.
+
+Chorus are lines with `> ` as a starting character.
+
+Lines starting with `) ` are consored/outdated/crossed out verses.
+
+[[!toggle id=example text="View example"]]
+[[!toggleable id=example text='''
+    \[[!poetry content="""
+    This is a verse
+    Made of several lines
+
+    > And here is the chorus
+    > La la la!
+    > A beautiful chorus
+
+    Another verse
+    A bit longer
+    Than the previous one
+
+    ) This one is deleted
+    ) Because I did not like it
+    """]]
+''']]
+
+
+## CSS
+
+This plugin is useless without some corresponding CSS. An example is given
+below.
+
+[[!toggle id=css text="CSS"]]
+[[!toggleable id=css text="""
+    .poetry {
+      padding-left: 1em;
+      border-left: 0.1em solid lightgray;
+      border-radius: 0.5em;
+    }
+    
+    .poetry .stanza {
+      padding-left: 1em;
+    }
+    
+    .poetry .paren {
+      font-style: italic;
+      font-size: smaller;
+      text-decoration: line-through;
+    }
+    
+    .poetry .paren:hover {
+      text-decoration: initial;
+    }
+    
+    .poetry .chorus {
+      margin-left: 0.1em;
+      padding-left: 2em;
+      border-left: 0.3em solid slategray;
+    }
+    
+    .poetry .line {
+      display: block;
+      text-indent: -1em;
+    }
+"""]]
+
+## Example
+
+This plugin is used to render songs on [this choir's
+website](http://barricades.int.eu.org/repertoire/bread_and_roses/).
+
+## Code
+
+Code and documentation can be found here : [[https://atelier.gresille.org/projects/gresille-ikiwiki/wiki/Poetry]].
diff --git a/doc/plugins/contrib/purge.mdwn b/doc/plugins/contrib/purge.mdwn
new file mode 100644 (file)
index 0000000..62fcfb3
--- /dev/null
@@ -0,0 +1,38 @@
+[[!template id=plugin name=purge core=0 author="[[users/ssm]]"]]
+
+IkiWiki plugin to send PURGE requests to remote http cache server (like Varnish Cache) when your content changes.
+
+PURGE requests are sent for the changed page, as well as all pages indirectly changed when ikiwiki rebuilds the web pages.
+
+# Download
+
+Download from [Github](https://github.com/ssm/ikiwiki-plugin-purge)
+
+# Configure ikiwiki
+
+    # purge_url (mandatory), the address of your cache server.
+    purge_url: http://example.com/
+
+    # purge_timeout (optional, default 5) timeout in seconds for a purge request.
+
+    # purge_method (optional, default "PURGE") HTTP method to use.
+    
+# Configure your cache server
+
+For Varnish, you'll need to add a handler for the non-standard "PURGE" method, and preferrably an ACL which restricts who can send these requests to empty your cache.
+
+    acl origin_server {
+        "localhost";
+        "192.0.2.0"/24;
+        "2001:db8::"/64;
+    }
+    sub vcl_recv {
+        if (req.method == "PURGE") {
+            if (!client.ip ~ origin_server) {
+                return(synth(405,"Not allowed."));
+            }
+            return (purge);
+        }
+    }
+
index e23a4ced441508a8dad517cc164f0f9ecb5d3cd1..419c4bca62898c3539f4a9a08e1a4dc006076c39 100644 (file)
@@ -73,3 +73,8 @@ to select pages? How does it relate to [[todo/wikitrails]] or
 >>>>> 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]]
+
+How about arrays?
+-----------------
+
+In [[plugins/contrib/getfield/discussion]], I outline how there's a problem in getfield displaying array refs when the data is a YAML array. I also propose a patch there so that arrays are join'd with a space separator, which is less than ideal, but at least works for getfield. However, for report, I am not sure it's as good. Should it make two rows for those? How should we parse this? Thanks. -- [[anarcat]]
diff --git a/doc/plugins/contrib/sidebar2.mdwn b/doc/plugins/contrib/sidebar2.mdwn
new file mode 100644 (file)
index 0000000..5c169bf
--- /dev/null
@@ -0,0 +1,96 @@
+[[!meta author="spalax"]]
+[[!template id=plugin name=sidebar2 author="[[Louis|spalax]]"]]
+[[!tag type/chrome]]
+
+*Claim:* The [[sidebar|plugins/sidebar]] plugin has nothing
+to do with sidebars. This plugin renders some page (which happens to be named
+`sidebar`) and put the result in template variable `SIDEBAR` of template
+`page.tmpl`. But the fact that it is a sidebar, i.e. a bar appearing on the
+side on the screen, is done by CSS.
+
+What if I want a sidebar, and a [[navigation bar|plugins/contrib/navbar]], and
+a footer a bit more elaborated than the one in the template, etc.? This plugin
+allows this.
+
+# Configuration
+
+If no option is given, or if option `global_sidebars` is a boolean, this plugin
+is identical to the [[sidebar plugin|plugins/sidebar/]] (if not, please [report
+a bug](https://atelier.gresille.org/projects/gresille-ikiwiki/issues)).
+Otherwise, `global_sidebars` is a list of sidebars to include. The list is as
+follow:
+
+    global_sidebars => [
+      "var1", "page1", "pagespec1",
+      "var2", "page2", "pagespec2",
+      ]
+
+The meaning is: if available, render `page1` in pages matching `pagespec1`, and
+put it in variable `var1` of the page template, and so on for `var2`, `page2`,
+etc.
+
+The default, which gives the behaviour of the sidebar plugin, is
+`global_sidebars => ["sidebar", "sidebar", "*"]`.
+
+*Remark: It would be more sensible to have a list of lists, as the following example, but I did not manage to do so because of [[this bug|bugs/structured_config_data_is_mangled]].*
+
+    global_sidebars => [
+      ["var1", "page1", "pagespec1"],
+      ["var2", "page2", "pagespec2"],
+      ]
+
+# Improvements over sidebar plugin
+
+* You can add several "sidebars" to your wiki. For example, to have a sidebar, a submenu that appears only in documentation pages (`doc/*`), and a footer, your `global_sidebars` would be:
+
+      global_sidebars => [
+        "sidebar", "sidebar", "*",
+        "menu", "/doc/menu", "doc/*",
+        "footer", "/footer", "*"
+        ]
+
+* You can enable sidebars only in certain pages matching the pagespec. If, for
+  the same template variable, several pagespec match the current page, the
+  first page in the list is taken into account.
+
+  For example, the following configuration says: render `menu` as the sidebar
+  for every page, excepted subpages of `doc`, for which the `doc_menu` page
+  should be rendered.
+
+      global_sidebars => [
+        "sidebar", "doc_menu", "doc/*",
+        "sidebar", "menu", "*",
+        ]
+
+# Directive
+
+The behaviour of the `sidebar` directive is similar to the directive of the
+original [[sidebar|plugins/sidebar]], excepted that a new `var` argument is
+available.
+
+If this `var` argument is set, instead of applying to the default `sidebar`
+template variable, the directive applies to the value given in the argument.
+
+For example, the following command forces the `footer` sidebar to appear on the
+current page.
+
+    \[[!sidebar var=footer]]
+
+The following command forces the `footer` sidebar to appaer, containing the
+content given in argument.
+
+    \[[!sidebar var=footer content="TEST"]]
+
+# Which pages to render?
+
+Here is the decision process to decide what is rendered in a template variable
+handled by this plugin.
+
+1. If the page contains the [[sidebar|ikiwiki/directive/sidebar]] directive, with a `content` argument, this content is rendered.
+2. If the page contains the [[sidebar|ikiwiki/directive/sidebar]] directive with no `content` argument, the first rule for the considered template variable is applied, disregarding the pagespec.
+3. If none of the above, the first rule having its pagespec patching the current page is applied.
+4. If none of the above, the variable is left empty.
+
+# Download and install
+
+Code and documentation: [[https://atelier.gresille.org/projects/gresille-ikiwiki/wiki/Sidebar2]].
index 5ca6311f9d63c6151de5f6a17c103a827f608e2e..da42130000f7229d9be6b8bd1443841ec3832d72 100644 (file)
@@ -44,6 +44,8 @@ This plugin create the following CSS styles:
 
 It can be downloaded from [here](http://taquiones.net/files/misc/) or through my personal debian repository at <http://taquiones.net/files/debian/>. There is a page with examples: <http://taquiones.net/software/syntax-examples.html>
 
+_**NOTE:** all the above links are broken_
+
 Any help, comments or critics are welcome at <victor@taquiones.net>.
 
 ## version 0.9
diff --git a/doc/plugins/contrib/taskreport.mdwn b/doc/plugins/contrib/taskreport.mdwn
new file mode 100644 (file)
index 0000000..377c9ed
--- /dev/null
@@ -0,0 +1,63 @@
+[[!meta author="spalax"]]
+[[!template id=plugin name=taskreport author="[[Louis|spalax]]"]]
+
+# Taskreport
+
+The taskreport plugin provides the `task` directive (see below), displaying
+[taskwarrior](http://taskwarrior.org) data as a table.
+
+## Plugin options
+
+* `task_bin`: path to the task binary. Default is "task".
+* `task_common`: arguments to all task calls. Can be used, for example, to set
+  a non-default taskrc location.
+* `task_dir`: directory where to find task data files, if non-default. This
+  directory must be handled by IkiWiki. Otherwise, use the `task_common`
+  argument. This argument must be relative to the root of the wiki sources.
+* `task_tmpdir`: directory where to copy task data files before calling task.
+  It can be used to circumvent [[lack of `--read-only`
+  option|https://bug.tasktools.org/browse/TW-204]]. Otherwise, those data files may
+  be modified by the task call. Setting this directory ensure that they are
+  not. This argument should be absolute (I do not know what would happen
+  otherwise).
+* `task_columns`: List of default columns to display with the
+  task directive. Default is all available columns.
+
+
+## Directive
+
+### Directive options
+
+Options are:
+
+* `arg`: arguments to add to the task call. For example, to display a list of
+  pending tasks tagged `ikiwiki`, set it to `"status:pending +ikiwiki"`.
+* `show`: number of tasks to show. Default is 0, and means: print all tasks.
+* `sort`: tasks are sorted according to this column. Default is `urgency`.
+* `reverse`: set yes to reverse order.
+* `annotations`: set to yes to display annotations. Default is "yes".
+
+### Task system call
+
+When using this directive, the result of the following system call is printed:
+
+    TASK_BIN export rc.verbose=nothing TASK_COMMON [rc.data.location=DIR] ARG
+
+* `TASK_BIN` and `TASK_COMMON` are the `task_bin` and `task_common` options set in ikiwiki setup.
+* If `task_dir` and `task_tmpdir` are set in ikiwiki setup, `DIR` is `task_tmpdir` ; if only `task_dir` is set, `DIR` is `task_dir` ; otherwise, this part is not used.
+* `ARG` is the `arg` option of the directive.
+
+### CSS
+
+To allow CSS customization, the following classes are used.
+
+* `task` is the class of the table.
+* `urgency`, `project`, etc. are the class of the `th` and `td` elements for the corresponding task attributes.
+* `annotation` is the class of the `tr` element of the table containing an annotation.
+
+
+## Download and install
+
+Code and documentation can be found here : [[https://atelier.gresille.org/projects/gresille-ikiwiki/wiki/Taskreport]]
+
+-- [[Louis|spalax]]
diff --git a/doc/plugins/contrib/todo.mdwn b/doc/plugins/contrib/todo.mdwn
new file mode 100644 (file)
index 0000000..d8ba056
--- /dev/null
@@ -0,0 +1,17 @@
+[[!template id=plugin name=todo author="Joël Porquet"]]
+[[!tag type/widget]]
+
+This plugin provides the todo [[ikiwiki/directive]], which enables a page to be marked as a todo page. Additionally a deadline date can be provided.
+
+An example of a page marked as todo could be:
+
+    \[[!todo deadline="3 April 1982"]]
+    # Title of what should be done for April 3, 1982
+    blabla
+
+This plugin also provides ways to display pages marked as todo, and can even sort those pages by deadline dates:
+
+    \[[!inline pages="* and todo() and !todo(done)" archive="yes" sort="todo(deadline)"]]
+
+The full documentation and source code can be found here:
+<https://joel.porquet.org/wiki/hacking/ikiwiki_todo/>
diff --git a/doc/plugins/contrib/trail.mdwn b/doc/plugins/contrib/trail.mdwn
deleted file mode 100644 (file)
index bfd4d3d..0000000
+++ /dev/null
@@ -1,133 +0,0 @@
-[[!tag patch]]
-[[!template id=gitbranch branch=smcv/trail3 author="[[smcv]]"]]
-
-Available from [[smcv]]'s git repository, in the `trail3` branch. This
-plugin aims to solve [[todo/wikitrails]] in a simpler way; it can also be
-used for [[navigation through blog posts|todo/Pagination_next_prev_links]].
-
-If you don't want to use a branch of ikiwiki, manual installation requires
-these files (use the "raw" link in gitweb to download):
-
-* [trail.pm](http://git.pseudorandom.co.uk/smcv/ikiwiki.git/blob/trail3:/IkiWiki/Plugin/trail.pm)
-  in an `IkiWiki/Plugin` subdirectory of your configured `plugindir`
-* [page.tmpl](http://git.pseudorandom.co.uk/smcv/ikiwiki.git/blob/trail3:/templates/page.tmpl)
-  and
-  [trails.tmpl](http://git.pseudorandom.co.uk/smcv/ikiwiki.git/blob/trail3:/templates/trails.tmpl)
-  in your configured `templatedir`, or a `templates` subdirectory of your wiki repository
-* the trail-related bits from the end of the
-  [stylesheet](http://git.pseudorandom.co.uk/smcv/ikiwiki.git/blob/trail3:/doc/style.css)
-  (put them in your local.css)
-* the trail-related bits at the end of the
-  [actiontabs](http://git.pseudorandom.co.uk/smcv/ikiwiki.git/blob/trail3:/themes/actiontabs/style.css)
-  or [blueview/goldtype](http://git.pseudorandom.co.uk/smcv/ikiwiki.git/blob/trail3:/themes/blueview/style.css)
-  stylesheets, if you use one of those themes (again, put them in your local.css)
-
-The branch also includes [[todo/test_coverage]] machinery.
-
-Demo:
-
-* [in use on entries in my blog](http://smcv.pseudorandom.co.uk/)
-* [a demo trail based on links](http://demo.hosted.pseudorandom.co.uk/trail/)
-* [a demo hybrid trail/inline](http://demo.hosted.pseudorandom.co.uk/trail2/)
-
-The page `e` is in both demo trails, to demonstrate how a page in more than
-one trail looks.
-
-The `smcv/trail2` branch is an older version of `trail3` which used typed links
-as its data structure, resulting in timing-related limitations (it couldn't
-select pages for the trail by using pagespecs, because pagespecs can't be
-evaluated correctly until the scan stage has finished).
-
-Updated, November 2011:
-
-* reinstated `inline` integration ([[report]] integration would probably be
-  pretty easy too, if this gets merged)
-* switched from typed links back to a custom data structure to avoid
-  chicken/egg problems with ordering
-* create typed links too, as a side-effect, but not when using an inline
-* regression test with nearly full coverage
-* CSS for the default anti-theme and all built-in themes (it looks nicest
-  in the default anti-theme and in actiontabs - the demo uses actiontabs)
-
-Known bugs:
-
-* the blueview and goldtype CSS nearly work, but the alignment is a bit off
-
-----
-
-[[!template id=plugin name=trail author="[[Simon_McVittie|smcv]]"]]
-[[!tag type/chrome]]
-
-This plugin provides the [[ikiwiki/directive/trailoptions]],
-[[ikiwiki/directive/traillink]], [[ikiwiki/directive/trailitem]],
-[[ikiwiki/directive/trailitems]]
-and [[ikiwiki/directive/trailinline]] [[directives|ikiwiki/directive]].
-
-It's sometimes useful to have "trails" of pages in a wiki where each
-page links to the next and/or previous page. For instance, you could use
-this for a guided tour, sequence of chapters, or sequence of blog posts.
-
-In this plugin, a trail is represented by a page, and the pages in the
-trail are indicated by specially marked links within that page, or by
-including groups of pages with a [[ikiwiki/directive]].
-
-If using the default `page.tmpl`, each page automatically displays the
-trails that it's a member of (if any), with links to the trail and to
-the next and previous members. HTML `<link>` tags with the `prev`,
-`next` and `up` relations are also generated.
-
-The [[ikiwiki/directive/trailoptions]] directive sets options for the
-entire trail.
-
-Pages can be included in a trail in various ways:
-
-* The [[ikiwiki/directive/trailinline]] directive sets up an [[inline]],
-  and at the same time adds the matching pages (from `pages` or `pagenames`)
-  to the trail. One use is to navigate through all posts in a blog:
-
-        \[[!trailinline pages="page(./posts/*) and !*/Discussion" archive=yes
-          feedshow=10 quick=yes]]
-
-  This directive only works if the [[!iki plugins/inline desc=inline]]
-  plugin is also enabled.
-
-* The [[ikiwiki/directive/trailitems]] directive has optional `pages` and
-  `pagenames` options which behave the same as in [[inline]], but don't
-  produce any output in the page, so you can have trails that don't list
-  all their pages.
-
-* The [[ikiwiki/directive/traillink]] directive makes a visible link
-  and also adds the linked page to the trail. This will typically be
-  used in a bullet list, but could also be in paragraph text:
-
-        * [[!traillink Introduction]]
-        * [[!traillink "Chapter 1"]]
-        * [[!traillink Chapter_2]]
-        * [[!traillink Appendix_A]]
-
-  or
-
-        To use this software you must \[[!traillink install]] it,
-        \[[!traillink configuration text="configure it"]],
-        and finally \[[!traillink running|run_it]].
-
-  This also counts as a [[ikiwiki/WikiLink]] for things like the `link()`
-  [[ikiwiki/PageSpec]] item.
-
-* The [[ikiwiki/directive/trailitem]] directive adds a page to the trail
-  like `traillink`, but produces an invisible link, rather like `\[[!tag]]`:
-
-        To use this software you must \[[!traillink install]] it,
-        \[[!trailitem installing_from_packages]]
-        \[[!trailitem installing_from_source]]
-        \[[!traillink configuration text="configure it"]],
-        and finally \[[!traillink running|run_it]].
-        \[[!trailitem troubleshooting]]
-
-  Like `\[[!tag]]`, this still counts as a [[ikiwiki/WikiLink]] even though
-  there's no visible link.
-
-You can mix several of these directives in one page. The resulting
-trail will contain all of the pages matched by any of the directives,
-in the same order that the directives appear (unless you use the `sort` or
-`reverse` options on `\[[!trailoptions]]`).
diff --git a/doc/plugins/contrib/wordcount.mdwn b/doc/plugins/contrib/wordcount.mdwn
new file mode 100644 (file)
index 0000000..6a90d0e
--- /dev/null
@@ -0,0 +1,22 @@
+[[!template id=plugin name=wordcount author="[[schmonz]]"]]
+[[!template id=gitbranch branch=schmonz/wordcount author="[[schmonz]]"]]
+[[!tag type/meta]]
+[[!tag patch]]
+
+This plugin counts words in a page. For a single page, write a
+`\[[!wordcount]]` directive and the word count will be interpolated there.
+For a site, add `<TMPL_VAR WORDCOUNT>` to your [[templates]].
+
+If [[!cpan HTML::Strip]] is installed, the wordcount will be slightly
+more accurate.
+
+Possible enhancements:
+
+* Optimize: count words iff the result will be displayed. `sanitize()`
+  seems like the right place to count. Since it's called well after
+  `preprocess()`, I can tell whether a directive needs the result,
+  but since it appears to be called before `pagetemplate()`, I can't
+  tell whether a template wants to know and possibly skip the
+  computation. (In other words, if I add `$needed_for_template`
+  like `$needed_for_directive`, it gets set too late for `sanitize()`
+  to see.)
index 349c278eec1d6dcfd256b47ed58f063bc03b7239..5346b8f40e07a7572908987e3728c97ec7ca239f 100644 (file)
@@ -1,4 +1,4 @@
-[[!template id=plugin name=google author="Peter Simons"]]
+[[!template id=plugin name=google author="[Peter Simons](http://cryp.to/)"]]
 [[!tag type/web]]
 
 This plugin adds a search form to the wiki, using google's site search.
index 151af8d92b31b827836b4d12a7063ca440654162..eaf111f4ee1162a49ed4f1b4de4d4135d51ae9ce 100644 (file)
@@ -31,3 +31,19 @@ A patch to make it more like MediaWiki:
  </pre>
 
 --Changaco
+
+----
+
+I think using this below would let the source html clear for the browser
+without changing the render:
+
+        #use URI::Escape
+        .
+        .
+
+        #$str = uri_escape_utf8($str);
+        $str = Encode::decode_utf8($str);
+        #$str =~ s/%/./g;
+
+Don't you think ?
+[[mathdesc]]
index 556b0414515ab69f11b8656e0957c5beabb9ed64..1b9197e81e2b1db6991a3ff1d18710cba3cb18c4 100644 (file)
@@ -19,3 +19,19 @@ Having trouble working out where to get the perl bindings for highlight. --[Mick
 > --[[Joey]] 
 
 Thanks for prompt reply.All working. I will post on my site tonight and link here what I did on CentOS to make this work. --[Mick](http://www.lunix.com.au) 
+
+Any hint on how to highlight actual mdwn or any other supported markup code? -- [wiebel](http://wiebels.info)
+
+Hi, I would like put code with higlight plugin (\[[!format php """ code code code """]]) between 2 sublists. Something like that:
+
+* level 1
+  * level 2
+[[!format php """
+<?php
+echo "coucou";
+?>
+"""]]
+
+  * level 2
+
+You can see that the second level 2 is not correctly translate. It is translate in level 1 :-(. What is the good syntax  ? -- Julien
index 0eda5554f452ea41b2e6f7eb451d5fa04e9e62dd..2fae07739ea7c33abe4117d816f883b26c949ced 100644 (file)
@@ -2,7 +2,9 @@
 [[!tag type/auth]]
 
 This plugin allows HTTP basic authentication to be used to log into the
-wiki. 
+wiki. In this mode, the web browser authenticates the user by some means,
+and sets the `REMOTE_USER CGI` environment variable. This plugin trusts
+that if that variable is set, the user is authenticated.
 
 ## fully authenticated wiki
 
index 6811632038953fca491d896c07768a9e3f0ea1ee..8569238b11262fe440b58ec73671f71a058baadf 100644 (file)
@@ -1,5 +1,5 @@
 [[!template id=plugin name=lockedit core=1 author="[[Joey]]"]]
-[[!tag type/auth]]
+[[!tag type/auth type/comments]]
 
 This plugin allows the administrator of a wiki to lock some pages, limiting
 who can edit them using the online interface. This doesn't prevent anyone
index aedc1f4a063b6ba346c16031d51c4e31fcc61229..b636858132b74b12294279aba1c4afa882f679b1 100644 (file)
@@ -5,3 +5,18 @@ 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
 assumed to exist in the same location under the specified url on each
 mirror.
+
+In case the `usedirs` setting is not the same on all your mirrors, or
+if it is not the same on your local wiki as on the mirror a
+possibility is to let each mirror's ikiwiki CGI find out the correct
+target page url themselves; in that case the mirrors urls must be set
+to their ikiwiki CGI url instead of their base url. Example:
+
+       mirrorlist_use_cgi => 1,
+       mirrorlist => {
+               'mirror1' => 'https://mirror.example.org/ikiwiki.cgi',
+               'mirror2' => 'https://mirror2.example.org/ikiwiki.cgi',
+       },
+
+The mirrors must have the ikiwiki CGI and the [[goto]] plugin enabled
+for this to work.
index f9466e833f49c446e95e8d38d572f3a682269141..85bcf652b57a21aea45628bed265c4eec9f18bc4 100644 (file)
@@ -1,5 +1,5 @@
 [[!template id=plugin name=moderatedcomments author="[[Joey]]"]]
-[[!tag type/auth]]
+[[!tag type/auth type/comments]]
 
 This plugin causes [[comments]] to be held for manual moderation.
 Admins can access the comment moderation queue via their preferences page.
diff --git a/doc/plugins/notifyemail.mdwn b/doc/plugins/notifyemail.mdwn
new file mode 100644 (file)
index 0000000..302979e
--- /dev/null
@@ -0,0 +1,14 @@
+This plugin allows uses to subscribe to pages, and emails them when
+they are created or changed.
+
+It needs the [[!cpan Mail::SendMail]] perl module, and sends mail
+using the local MTA.
+
+Each user can configure which pages they are interested in, using an
+[[ikiwiki/PageSpec]] on their Preferences page. Any change to a page
+matching the PageSpec will send an email that includes the new content of
+the page, and a link to the page on the web.
+
+To make it easy to subscribe to comment threads when posting a comment,
+or a page, there is a check box that can be used to subscribe, without
+needing to manually edit the [[ikiwiki/PageSpec]].
diff --git a/doc/plugins/notifyemail/discussion.mdwn b/doc/plugins/notifyemail/discussion.mdwn
new file mode 100644 (file)
index 0000000..631c680
--- /dev/null
@@ -0,0 +1,5 @@
+When I try to add this plugin to the setup file and run "ikiwiki --setup" I get an error: Can't locate IkiWiki/Plugin/notifyemail.pm
+
+All the other plugins I have installed have worked, so my setup should be ok - just this one is missing!?! 
+
+> It's new in version 3.20120419, perhaps you have an older version? --[[smcv]]
index 040d175ca21843de5bcff4e0cd9136a7596c24af..a2455a4be07c606e934d8c77bfb311eb287895bd 100644 (file)
@@ -1,10 +1,10 @@
 [[!template id=plugin name=osm author="Blars Blarson, Antoine Beaupré"]]
 [[!tag type/special-purpose todo/geotagging]]
 
-## Openstreetmap/Openlayers support for ikiwiki
+## OpenStreetMap/OpenLayers support for ikiwiki
 
-This plugin provides simple Openstreetmap/Openlayers support for ikiwiki.
-It can embed Openstreetmap viewports within a page or link to a bigger map
+This plugin provides simple OpenStreetMap/OpenLayers support for ikiwiki.
+It can embed OpenStreetMap viewports within a page or link to a bigger map
 that will have multiple markers, generated with a KML (or CSV, or GeoJSON)
 datafile of markers based on the different calling pages. Multiple distinct
 maps on a single wiki are supported.
@@ -15,6 +15,22 @@ if the [[!cpan JSON]] perl module is installed.
 
 This provides the [[ikiwiki/directive/waypoint]] and [[ikiwiki/directive/osm]] directives.
 
+### Examples
+
+A [[basic set of examples|http://cbaines.net/osm-examples]] is available
+([[repository|http://git.cbaines.net/?p=ikiwiki/osm-examples.git;a=summary]]).
+Note that none of these will work without patching the plugin. With the
+following patches, most of the examples will work (while each patch is
+seperate, the branch includes all previous patches in the list, so the
+cbaines/osm-icon-fixes branch includes all patches).
+
+ - [[bugs/osm plugin error TypeError: mapProjection is null]]
+ - [[todo/osm plugin GeoJSON popup patch]]
+ - [[todo/osm plugin icon patch]]
+
+Even with these patches, the CSV examples do not work, and there are cosmetic
+issues with a few of the other examples.
+
 ---
 
 The plugin was originally written by
diff --git a/doc/plugins/osm/discussion.mdwn b/doc/plugins/osm/discussion.mdwn
new file mode 100644 (file)
index 0000000..538a3ab
--- /dev/null
@@ -0,0 +1,25 @@
+### CGI requirement when using \[\[\!waypoint\]\] on pages?
+
+Most of the osm plugin works well without cgi. The link from waypoints however use ikiwiki.cgi, at least in my configuration. Is this actually required or is it possible to use a pre rendered page to avoid running cgi on the server?
+
+At the moment I'd prefer not running cgi and one of the advantages of a wiki compiler is that you could run without cgi on the server.
+
+This is a minor issue but I'd be interested if you think it's possible to prerender waypoint maps. I.e maps that center on a specific waypoint whilst having all waypoints of that map visible.
+
+> I think it would be possible, but it would require a patch. I do think however that this is the way it works: all waypoints are shown, and the only difference is that the map is centered. --[[anarcat]]
+
+### Configure all osm tags to use same icon?
+
+Setting the default `osm_tag_default_icon` does not seem to work? All tagged waypoint pages now want their own unique icon and display broken image if not present. Populating the tag folder with identical icons gets a bit much when there are a lot of tags.
+
+> That looks like a bug. Please file it as such in [[bugs]]. --[[anarcat]]
+
+### \[Wishlist\] Setting unigue icon for "active waypoint"
+
+For usability it would be great if it was possible to display the active waypoint with a different icon. So that clicking a waypoint map symbol takes you to a map with lots of waypoints but the waypoint from the sources page is centered (as per current behaviour) **and** has a different icon.
+
+> This *would* indeed be awesome. --[[anarcat]]
+
+*PS. The osm plugin is amazing!*
+
+> Thanks! --[[anarcat]]
index d890b01268681a6d1d1230d7c28e917e7aa06569..f12d6edcadd649e85ec3290f028ed523d6fc61fb 100644 (file)
@@ -2,5 +2,5 @@
 [[!tag type/format]]
 
 This plugin allows ikiwiki to process `.otl` outline files, as created by 
-[vimoutliner](http://www.vimoutliner.org/). To use it, you need to have 
+[vimoutliner](https://github.com/vimoutliner/vimoutliner). To use it, you need to have 
 vimoutliner installed, since it uses the `otl2html` program.
diff --git a/doc/plugins/pinger/discussion.mdwn b/doc/plugins/pinger/discussion.mdwn
new file mode 100644 (file)
index 0000000..21f6bc8
--- /dev/null
@@ -0,0 +1 @@
+It is unclear to me where the ping directive should be used and why it's a directive, and not simply a configuration setting. --[[anarcat]]
index 703244947b9a99aabc7c285685cce4eeebb3f1b2..b7c1582ca4e1348cef265f06ddbf0579389772c4 100644 (file)
@@ -229,6 +229,14 @@ are not rendered correctly on the slave pages:
   could be used to support it, but it would need a security audit
 * other markup languages have not been tested.
 
+Renaming a page
+---------------
+
+A translatable page may be renamed using the web interface and the
+[[rename plugin|plugins/rename]], or using the VCS directly; in
+the latter case, *both* the "master" page and every corresponding
+`.po` file must be renamed in the same commit.
+
 Security
 ========
 
diff --git a/doc/plugins/poll/discussion.mdwn b/doc/plugins/poll/discussion.mdwn
new file mode 100644 (file)
index 0000000..eed3f6e
--- /dev/null
@@ -0,0 +1 @@
+Has anyone given any thought to approval voting (ie. marking more than one option), ranking or more complex decision-making protocols here? --[[anarcat]]
index 57299f92dd17c0e2fc9e9ac236cdc7a2ca90090d..660a430b956f4848191d19588624317f0e3d970e 100644 (file)
@@ -2,6 +2,8 @@
 [[!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
-page, but will display in its feeds. The [[rcs]] must have implemented
-support for the `rcs_diff()` function for any diffs to be generated.
+change. The diffs can be toggled on the recentchanges page (requires
+javascript), and are also included in its feeds.
+
+The [[rcs]] must have implemented support for the `rcs_diff()` function for
+any diffs to be generated.
diff --git a/doc/plugins/recentchangesdiff/discussion.mdwn b/doc/plugins/recentchangesdiff/discussion.mdwn
new file mode 100644 (file)
index 0000000..0ec6d7b
--- /dev/null
@@ -0,0 +1,28 @@
+# Syntax highlighting of recent changes
+
+Hello,
+is there a simple way to highlight the diff printed in the [[/recentchanges]]
+page? I imagined several solutions, but I am still wondering about the best one.
+
+* One might activate the [[plugins/highlight]] and [[plugins/format]] plugins,
+  and change the [[change.tmpl|/templates]] template, to use this plugin. But as
+  the diff is formatted not to mess up html (e.g. `\[[link]]` becomes
+  `&#91;&#91;link&#93;&#93;`), the output would be unreadable.
+* One might improve [[plugins/recentchangesdiff]] plugin by adding an option
+  `diff_escape_html=>yes/no` to it. Setting this to `no` would leave html
+  unescaped, so that it would be correctly rendered by plugin
+  [[plugins/format]].
+* One might change the [[plugins/recentchangesdiff]] plugin, to add syntax
+  highlighting to diffs, but this would duplicate plugin [[plugins/highlight]].
+
+In my opinion, the second solution is the best one. However, to be neat the
+`change.tmpl` template might detect that both plugin [[plugins/format]] and
+`diff_escape_html` option are enabled, and, depending on it, output the diff
+in `<pre>DIFF</pre>` tags or in the `\[[!format diff """DIFF"""]]` directive.
+
+Letting user edit `change.tmpl` template to enable this feature is also
+possible, but this would prevent him from benefiting of the later improvement
+of this template. In my opinion, an ideal solution would require the user
+nothing more than enabling some plugins or options.
+
+-- Louis
index e95739cf36569171e863e7587c3613bea53f4b50..4d517a2664af800ee1d9c88e530dc11f472bc35c 100644 (file)
@@ -5,7 +5,7 @@ This plugin adds full text search to ikiwiki, using the
 [xapian](http://xapian.org/) engine, its
 [omega](http://xapian.org/docs/omega/overview.html) frontend, and the
 [[!cpan Search::Xapian]], [[!cpan Digest::SHA]], and [[!cpan HTML::Scrubber]]
-perl modules.
+perl modules (on debian, check that you have packages `xapian-omega`, `libsearch-xapian-perl`, `libdigest-sha-perl` and `libhtml-scrubber-perl` installed).
 
 The [[ikiwiki/searching]] page describes how to write search queries.
 
index 42bc6a3e185314573c1d08ac7604c884f5640af4..245fb15445be3eb9961c93dfb0754aec706fa7c3 100644 (file)
@@ -8,3 +8,5 @@ I needed to include inline directives into sidebars at different site sections t
 
 Then I came across the tip to include the quick=yes variable with the inline directive, where it is described as not showing page titles included with the meta-directive, and I thought, well if it lets me have it only this way, maybe I can restrain from using meta titles.   
 But to my surprise, even with the quick=yes variable included into the inline directive in the sidebars meta titles still are shown, no more forced rebuild when editing via cgi, which is amazing, but maybe it should be noted somewhere. One more time ikiwiki showed its bright face, thank you. --Boris
+
+How to use a different sidebar and its own CSS for SubPages under a certain directory?  -- Joe
index f3cade85fed00d37dd5df5dd80421247c1ce55f7..98f01faaaafee019e41dda2e4377871a117bfd73 100644 (file)
@@ -4,10 +4,12 @@
 This plugin provides a [[ikiwiki/directive/teximg]] [[ikiwiki/directive]],
 that renders LaTeX formulas into images.
 
-Of course you will need LaTeX installed for this to work.
+You will need LaTeX installed for this to work, specifically something
+providing `latex` in the path. You will also need either `dvipng` or a
+combination of `dvips` and `convert` from ImageMagick/GraphicsMagick.
 
-See [this site](http://www.der-winnie.de/opensource/gsoc2007) for rendered
-images.
+On Debian systems, the relevant package names are `texlive-latex-base`
+and either `dvipng` or `graphicsmagick-imagemagick-compat`.
 
 ## configuration
 
index d74784ac2cfae2cff6ebbed0147d657cbe6f5b7c..5261df111f91b1462f36d3f9731479ddb01a7ae2 100644 (file)
@@ -8,7 +8,7 @@ inside `/usr/share/ikiwiki/themes/`. See [[themes]] for an overview
 of the themes included in ikiwiki and the [[theme market]] for third party themes.
 
 You can set the theme via the **theme** option in your config file (after
-enabling the plugin). Refresh the wiki after changing it to see the changes.
+enabling the plugin). Refresh the wiki (with `ikiwiki -setup <file>`, `--setup` won't work, they are not interchangable) after changing it to see the changes.
 
 Hints for theme builders
 ------------------------
index a09ae57034525d9081f3c03bdb7f4a393d69bb18..11c874fcb36bd2c7497c2692d74e8cd4042ffaeb 100644 (file)
@@ -8,3 +8,24 @@ rendered content. --[[JasonBlevins]]
 Why doesn't the TOC appear in the edit page preview?  It only appears when the page is finally rendered.  This makes it somewhat difficult to organize headings, saving & re-editing all the time.  My user page currently has a toc to play with: --[[sabr]]
 
 > Fixed. --[[Joey]]
+
+Just ran into a side effect of `\[[!toc]]` being a NOP in pages
+which are inlined: pages with `\[[!template id=note text="[[!toc]]"]]`
+wound up having the note rendered in feeds as "Use this template
+to insert a note into a page". Worked around this by making a local
+copy of the template and removing its `<TMPL_UNLESS text>...</TMPL_UNLESS>`
+section. Besides needing to generate guaranteed-unique anchor names,
+are there other reasons this directive couldn't be made to work on
+inlined pages?  --[[schmonz]]
+
+> Workaround: `\[[!template id=note text=" [[!toc]]"]]`
+> (with whitespace) should work, because then Perl will consider
+> the string to be a true value.
+>
+> Longer-term, my branch on [[bugs/template_creation_error]]
+> aims to fix this sort of thing. --[[smcv]]
+
+>> Workaround seems not to. Maybe whitespace is getting trimmed
+>> along the way and it stays falsish. Interested in your branch;
+>> sorry I can't offer precise feedback right now, but it looks sane
+>> at a glance. --[[schmonz]]
diff --git a/doc/plugins/trail.mdwn b/doc/plugins/trail.mdwn
new file mode 100644 (file)
index 0000000..14b97e3
--- /dev/null
@@ -0,0 +1,76 @@
+[[!template id=plugin name=trail author="[[Simon_McVittie|smcv]]"]]
+[[!tag type/chrome]]
+
+This plugin provides the [[ikiwiki/directive/trailoptions]],
+[[ikiwiki/directive/traillink]], [[ikiwiki/directive/trailitem]],
+and [[ikiwiki/directive/trailitems]] [[directives|ikiwiki/directive]].
+
+It's sometimes useful to have "trails" of pages in a wiki where each
+page links to the next and/or previous page. For instance, you could use
+this for a guided tour, sequence of chapters, or sequence of blog posts.
+
+In this plugin, a trail is represented by a page, and the pages in the
+trail are indicated by specially marked links within that page, or by
+including groups of pages with a [[ikiwiki/directive]].
+
+If using the default `page.tmpl`, each page automatically displays the
+trails that it's a member of (if any), with links to the trail and to
+the next and previous members. HTML `<link>` tags with the `prev`,
+`next` and `up` relations are also generated.
+
+The [[ikiwiki/directive/trailoptions]] directive sets options for the
+entire trail.
+
+Pages can be included in a trail in various ways:
+
+* The [[ikiwiki/directive/inline]] directive with `trail="yes"` sets up an
+  [[inline]], and at the same time adds the matching pages (from `pages` or
+  `pagenames`) to the trail. One use is to navigate through all posts in
+  a blog:
+
+        \[[!inline pages="page(./posts/*) and !*/Discussion" archive=yes
+          feedshow=10 quick=yes trail=yes]]
+
+  This only works if the trail and [[!iki plugins/inline desc=inline]]
+  plugins are both enabled.
+
+* The [[ikiwiki/directive/trailitems]] directive has optional `pages` and
+  `pagenames` options which behave the same as in [[inline]], but don't
+  produce any output in the page, so you can have trails that don't list
+  all their pages.
+
+* The [[ikiwiki/directive/traillink]] directive makes a visible link
+  and also adds the linked page to the trail. This will typically be
+  used in a bullet list, but could also be in paragraph text:
+
+        * [[!traillink Introduction]]
+        * [[!traillink "Chapter 1"]]
+        * [[!traillink Chapter_2]]
+        * [[!traillink Appendix_A]]
+
+  or
+
+        To use this software you must \[[!traillink install]] it,
+        \[[!traillink configuration text="configure it"]],
+        and finally \[[!traillink running|run_it]].
+
+  This also counts as a [[ikiwiki/WikiLink]] for things like the `link()`
+  [[ikiwiki/PageSpec]] item.
+
+* The [[ikiwiki/directive/trailitem]] directive adds a page to the trail
+  like `traillink`, but produces an invisible link, rather like `\[[!tag]]`:
+
+        To use this software you must \[[!traillink install]] it,
+        \[[!trailitem installing_from_packages]]
+        \[[!trailitem installing_from_source]]
+        \[[!traillink configuration text="configure it"]],
+        and finally \[[!traillink running|run_it]].
+        \[[!trailitem troubleshooting]]
+
+  Like `\[[!tag]]`, this still counts as a [[ikiwiki/WikiLink]] even though
+  there's no visible link.
+
+You can mix several of these directives in one page. The resulting
+trail will contain all of the pages matched by any of the directives,
+in the same order that the directives appear (unless you use the `sort` or
+`reverse` options on `\[[!trailoptions]]`).
diff --git a/doc/plugins/trail/discussion.mdwn b/doc/plugins/trail/discussion.mdwn
new file mode 100644 (file)
index 0000000..6b1b58b
--- /dev/null
@@ -0,0 +1,185 @@
+I believe the `trail3-integrated` and `trail3-prebuild` branches address
+Joey's review comments from IRC:
+
+    06-12-2011 19:01:07 <joeyh>: ok, light review finished. so, if you want
+    to make a branch with inline trail=yes, and perhaps also adding a hook
+    so you don't need to inject, I think I can merge it right away
+
+I haven't published instructions for using this version as a
+standalone plugin, because it needs core and inline changes.
+
+Commits up to 63bb8b42 make the trail plugin better-integrated,
+including `\[[!inline trail=yes]]`. 63bb8b42 is the commit to
+merge if you don't like the design of my hooks.
+
+Commit 24168b99 adds a `build_affected` hook, run at about the
+same time as `render_backlinks`, and uses it to render the
+extra pages. This removes the need for `trail` to inject
+anything. In principle, backlinks etc. could use this hook
+too, if they weren't core.
+
+Commit d0dea308 on the `trail3-prebuild` branch adds a
+`prebuild` hook, which runs after everything has been scanned
+but before anything is rendered. This removes the need
+for `trail` to run its old `prerender` function in its
+render hooks (preprocess, pagetemplate etc.) to collate
+metadata before it renders anything. However, I'm not sure
+that this is really the right thing to do, which is why it's
+in its own branch: the `prebuild` hook is a lot like
+`needsbuild` (but later), so it's called even if no trail
+or trail member has actually been edited.
+
+For it to be useful for `trail`, the `prebuild` hook has to run
+after both pagespecs and sorting work. The other use case
+I've seen for a similar hook was for Giuseppe Bilotta to
+sort an inline-of-inlines by mtime of newest post, but that
+can't be the same hook, because it has to run after pagespecs
+work, but before sorting.
+
+--[[smcv]]
+
+> I've merged trail3-integrated, but not prebuild. I don't exactly dislike
+> prebuild, but dunno that the hook prolieration is worth the minor cleanup
+> it allows in trail. --[[Joey]]
+
+>> Hmm, t/trail.t is failing several tests here. To reproduce, I build the
+>> debian package from a clean state, or `rm -rf .t` between test runs. --[[Joey]]
+
+<pre>
+t/trail.t .................... 1/? 
+#   Failed test at t/trail.t line 211.
+#   Failed test at t/trail.t line 213.
+#   Failed test at t/trail.t line 215.
+#   Failed test at t/trail.t line 217.
+#   Failed test at t/trail.t line 219.
+#   Failed test at t/trail.t line 221.
+#   Failed test at t/trail.t line 223.
+#   Failed test at t/trail.t line 225.
+#   Failed test at t/trail.t line 227.
+#   Failed test at t/trail.t line 229.
+#   Failed test at t/trail.t line 231.
+</pre>
+
+> Looking at the first of these, it expected "trail=sorting n=sorting/new p="
+> but gets: "trail=sorting n=sorting/ancient p=sorting/new"
+>
+> Looking at the second failure, it expected "trail=sorting n=sorting/middle p=sorting/old$"
+> but got: "trail=sorting n=sorting/old p=sorting/end"
+> 
+> Perhaps a legitimate bug? --[[Joey]] 
+
+>> I saw this while developing, but couldn't reproduce it, and assumed
+>> I'd failed to update `blib` before `make test`, or some such.
+>> In fact it's a race condition, I think.
+>>
+>> The change and failure here is that `sorting.mdwn` is modified
+>> to sort its trail in reverse order of title. Previously, it
+>> was sorted by order of directives in the page, and secondarily
+>> by whatever sort order each directive specified (e.g.
+>> new, old and ancient were sorted by increasing age).
+>> `old` appearing between `new` and `ancient`, and `new` appearing
+>> between `end` and `old`, indicates that this re-sorting has not
+>> actually taken effect, and the old sort order is still used.
+>>
+>> I believe this is because the system time (as an integer) remained
+>> the same for the entire test, and mtimes as used in ikiwiki
+>> only have a 1-second resolution. We can either fix this with
+>> utime or sleep; I chose utime, since sleeping for 1 second would
+>> slow down the test significantly. Please merge or cherry-pick
+>> `smcv/trail-test` (there's only one commit). --[[smcv]]
+
+----
+
+[[!template id=gitbranch branch=smcv/ready/trail author=smcv]]
+
+Some later changes to trail:
+
+* Display the trail links at beginning/end of default `page.tmpl`
+  as suggested on IRC
+* Improve CSS, particularly in blueview and goldtype themes
+  ([example](http://blueview.hosted.pseudorandom.co.uk/posts/second_post/))
+* Fix a possible bug regarding state deletion
+
+--[[smcv]]
+
+> Applied --[[Joey]] 
+
+----
+
+### Trail plugin creates unexpected interdependencies?
+*(ikiwiki master branch 2014-06-06 also tested with 3.20140228 release)*
+
+I noticed the problem when using the [[/plugins/contrib/album]] plugin but a bit of testing revealed that the [[trail]] plugin, which is used by [[/plugins/contrib/album]] may be the cause of the problem.
+
+On a site with the following structure where all albumN.mdwn files have the `\[[!inline  pages="page(./album01/*)" trail="yes"]]` directive set. All albumN pages and imgN pages get rebuilt whenever any one of the albumN or imgN pages are changed and the command  `ikiwiki --setup wiki.setup --refresh --verbose`
+ is issued.
+
+    /index.mdwn                        Contains no links maps or inlines
+    |-album01.mdwn                 \[[!inline  pages="page(./album01/*)" trail="yes"]]
+    |-album01/
+    | |-imgA.mdwn
+    | |-imgB.mdwn
+    |
+    |-album02.mdwn                 \[[!inline  pages="page(./album02/*)" trail="yes"]]
+    |-album02/
+    | |-imgC.mdwn
+    | |-imgD.mdwn
+    |
+    |-album03.mdwn                 \[[!inline  pages="page(./album03/*)" trail="yes"]]
+    |-album03/
+    | |-imgE.mdwn
+    | |-imgF.mdwn
+
+Changing the index.mdwn page also triggers a full rebuild of all pages with [[trail]] directives. My sites tend to look like the above but with double digit numbers of files in at each level. Changing any file then means a full rebuild of a rather complex site which takes a long time.
+
+My setup and test may very well have mistakes but perhaps someone using the trail plugin could check (using the --verbose flag) if all their trails get rebuild when changing only one. I also find it curious that changes to the parent index.mdwn page triggers the same behaviour.
+
+I have removed a similar comment from the album discussion.
+
+ --[[kjs]]
+
+> I would expect changing imgE.mdwn to rebuild album03.mdwn (because album03
+> inlines imgE) and vice versa (because imgE uses album03's \[[!meta title]]).
+>
+> I would not expect changing imgE.mdwn or album03.mdwn to affect album02
+> or imgC.
+>
+> I would also not expect changing index.mdwn to rebuild anything else
+> unless there is a valid dependency reason to do so.
+>
+> Can you reproduce this problem in a wiki that does not contain anything
+> private, and publish its git repo somewhere? (I realise photo galleries
+> tend to be more personal/private than typical wikis, so you don't
+> necessarily want to link the real thing - that's why my album demos
+> tend to use dummy data). --[[smcv]]
+
+>> I was expecting the same depends pattern you describe.
+>> My photo wikis are mostly public so I've set up a publicly accessible repo 
+>> (update-server-info type, git clone the first link below), a low-res copy of 
+>> the underlay and a quick sanitized setup file.
+
+>>* [[http://www.kalleswork.net/downloads/stockholm/.git]]
+>>* [[http://www.kalleswork.net/downloads/stockholm.underlay.tar.gz]]
+>>* [[http://www.kalleswork.net/downloads/stockholm.setup]]
+
+>> It might be a bit unwieldly and the site itself at [[http://stockholm.kalleswork.net]] 
+>> uses a few tweaks to the album templates and css, but I don't currently 
+>> have access to the machine where I setup a cleaner debug wiki to test. 
+>> (travelling atm). The images will likely be distorted due to the up scaling 
+>> bug in the [[img]] plugin but other than that it should work.
+
+>> Let me know if you need anything else. Would be great to hear it works
+>> as expected for everyone else ;) --[[kjs]]
+
+>>> Hmm. Investigating the indexdb:
+>>>
+>>>     perl -le 'use Storable; my $index = Storable::retrieve("stockholm/.ikiwiki/indexdb"); use Data::Dumper; print Dumper $index' |less
+>>>
+>>> indicates that `20130504` depends on `internal(*)` and so does `20130505`.
+>>>
+>>> After adding some `Carp::cluck` calls to the bits of IkiWiki.pm that add
+>>> dependencies, this turns out to be two similar issues, in `album` and
+>>> `trail`: they each use `pagespec_match_list` with the pagespec
+>>> `internal(*)` in order to apply a trivial filter (accept everything)
+>>> to an existing list for its side-effect of sorting that list.
+>>> Bug filed as [[bugs/trails depend on everything]] --smcv
index b7dd11906afc0eb28384e5c3d4d2ef8427b77fce..8649262c6c577102ac32d65bbe1918f1cc74446e 100644 (file)
@@ -16,8 +16,7 @@ This plugin is mostly useful as something that other plugins can depend on:
 * [[plugins/autoindex]] can be configured to auto-create missing
     pages that have a [[ikiwiki/subpage]] or an [[plugins/attachment]], but not
     commit them, in which case they go in the transient underlay
-* [[plugins/comments]] can be configured to not commit comments: if so, it
-    puts them in the transient underlay
+* [[plugins/comments]] writes comments pending moderation to the transient underlay
 * [[plugins/recentchanges]] writes new changes into the transient underlay
 * [[plugins/tag]] can be configured to auto-create missing
     tag pages but not commit them, in which case they go in the transient
index 400a5bccad9b143822ab3d52368eb09308600ff3..6a1f2d12c64653682965b4466b90174501575cbd 100644 (file)
@@ -1,2 +1,4 @@
 These plugins add different authentication methods for logging in to the
 wiki and control what pages users can edit.
+
+[[!map pages="plugins/* and tagged(.)"]]
index 0bf049ece72d6c40a9b699c1a1d993851a34ec21..980dbbe5776053b50f38ca2df5cec957777e45e8 100644 (file)
@@ -1 +1,3 @@
 These plugins enable whole bundles of other plugins.
+
+[[!map pages="plugins/* and tagged(.)"]]
index a1c6d07283c66623e2c533b349c5375f47cdae20..73a6e58985b80d6ede15b96c3678952608a0d6cf 100644 (file)
@@ -1 +1,3 @@
 These plugins affect the look and feel of the overall wiki.
+
+[[!map pages="plugins/* and tagged(.)"]]
diff --git a/doc/plugins/type/comments.mdwn b/doc/plugins/type/comments.mdwn
new file mode 100644 (file)
index 0000000..1e4dd72
--- /dev/null
@@ -0,0 +1,3 @@
+These plugins relate to [[plugins/comments]].
+
+[[!map pages="plugins/* and tagged(.)"]]
index 71d93c4a6763dea439fd19230504d6079876c73d..2646996ba2fc744adb0f76ead8a86ed063349e8c 100644 (file)
@@ -1 +1,3 @@
 These plugins provide core functionality and are enabled by default.
+
+[[!map pages="plugins/* and tagged(.)"]]
index eae1226dad02b4df9c999b55188717eb42fa314f..b95a7ecd3c05668aec9d323ef65bb3503c298d91 100644 (file)
@@ -1 +1,3 @@
 These plugins control how ikiwiki displays dates.
+
+[[!map pages="plugins/* and tagged(.)"]]
index a60d725d8d1696d832f576ad5c8638912dba3e75..8a100f963a387dcaecd6b6b32c40ee65f6b74b60 100644 (file)
@@ -1 +1,3 @@
 These plugins provide ways to format text on wiki pages.
+
+[[!map pages="plugins/* and tagged(.)"]]
index 4d97c8e6641aa6adac4aec3ea2e7dde3d67cd2a1..ad9e9c2e66c89463fe005b77f6d08a6225eef151 100644 (file)
@@ -1 +1,3 @@
 These plugins are just for fun.
+
+[[!map pages="plugins/* and tagged(.)"]]
index 290208f92312906a0eac02fb463111d7ed2fd89c..94e13b621e6150d0ec6a30dd8a026b73decdd893 100644 (file)
@@ -1 +1,3 @@
 These plugins generate or process html.
+
+[[!map pages="plugins/* and tagged(.)"]]
index c10863fac250d39c4271b3729c73d31b7c304ec1..fce27ae9c6f0c0a0f9a9c065f3d99b9828cb1e8f 100644 (file)
@@ -1 +1,3 @@
 These plugins deal with [[WikiLinks|ikiwiki/WikiLink]].
+
+[[!map pages="plugins/* and tagged(.)"]]
index cae30cad17512e0926c1790a53a4268c66c8f9a1..7a339747e93b89b98f7fddbb1dea2cf8e60f6170 100644 (file)
@@ -1 +1,3 @@
 These plugins deal in meta-information about the wiki.
+
+[[!map pages="plugins/* and tagged(.)"]]
index c0e72158527356b5979ec60f23243b50261cd28c..5907d26f96f75e423392c03080eaac3bb9a37565 100644 (file)
@@ -1,3 +1,5 @@
 These plugins can cause wiki rendering to be significantly slowed down,
 due to things like needing to run an external program for every page
 rendered.
+
+[[!map pages="plugins/* and tagged(.)"]]
index b6ed045313cb89acc1f0df6f2eaae39f84bc36ae..7aeb8be9ce6d71567e900943b88369b101b8508b 100644 (file)
@@ -1 +1,3 @@
 Special-purpose plugins.
+
+[[!map pages="plugins/* and tagged(.)"]]
index bb74066f8f2f0300f4bed9d1f8c8b36bffec807f..78daebd53180781fcd057b93c80c9ce35dcb0a1a 100644 (file)
@@ -1 +1,3 @@
 These plugins support tagging.
+
+[[!map pages="plugins/* and tagged(.)"]]
index b60e26a29f5d6f8246012442f88a5613747ddee5..6ebd6cd373930588e6819ea7e3fd691d0b977e78 100644 (file)
@@ -1 +1,3 @@
 These plugins enhance the web interface.
+
+[[!map pages="plugins/* and tagged(.)"]]
index 875829d0bcdb048f0e0b749f8b8c728ff402e010..496b7da2465d3a94fb93ae36857eb3d1d2532918 100644 (file)
@@ -1,2 +1,4 @@
 These plugins allow inserting various things into pages via a
 [[ikiwiki/directive]].
+
+[[!map pages="plugins/* and tagged(.)"]]
index a20a3248945780b22b3673c7653a3aa99e58f83b..387c90b75bdf54d56d24b92a74b3b8f409d58f4b 100644 (file)
@@ -23,5 +23,5 @@ Plugins that should not be enabled/disabled via the web interface can be
 listed in `websetup_force_plugins` in the setup file.
 
 When the setup is saved, the setup file will be rewritten with the new
-settings, and the wiki will be refreshed, or rebuilt, to make the setip
+settings, and the wiki will be refreshed, or rebuilt, to make the setup
 changes take effect.
index 2eac0788c56fcf8faf9f021f96db00729c28beb6..7202aece6fa34aece2cc05dfd61fc4e8e8504e4d 100644 (file)
@@ -5,7 +5,7 @@
 [[mdwn]]. This plugin makes WMD be used for editing pages in the wiki.
 
 To use the plugin, you will need to install WMD. Download the [WMD
-source](http://ftp.netbsd.org/pub/NetBSD/packages/distfiles/wmd-1.0.1.zip).  In that zip file
+source](https://code.google.com/p/pagedown/).  In that zip file
 you'll find a few example html files, a readme and `wmd` directory.  Create
 a 'wmd' subdirectory in the ikiwiki `underlaydir` directory (ie `sudo mkdir
 /usr/share/ikiwiki/wmd`). Move the `wmd` directory into the directory you
index b57ef40571253a1e4af997bdbfd64eb5fd861a3e..191004dc3cfd80a888b3db772ff1d4d131bd481f 100644 (file)
@@ -3,62 +3,11 @@ I've tried to retrieve the wmd-editor source tarball lately, but the site seems
 From what I've read on the Internet, wmd-editor is not (yet?) free software by itself, and its author has gone MIA.
 But it looks like somebody recently took the step to rewrite a wmd-clone under a saner license, see [[pagedown|http://code.google.com/p/pagedown/source/browse/]].
 
-Given all the above, what about upgrading this plugin to use pagedown instead of wmd? It seem a clear win to me...
+Given all the above, what about upgrading this plugin to use pagedown instead of wmd? It seem a clear win to me... --(unsigned)
 
-> AFAICS, pagedown is a modified version of WMD. Let's 
-> look at its license file: --[[Joey]] 
+> I have moved that conversation to the pagedown plugin todo [[todo/pagedown_plugin/discussion]] page, which now actually has an implementation now, and is free! --[[anarcat]]
 
-<pre>
-A javascript port of Markdown, as used on Stack Overflow
-and the rest of Stack Exchange network.
-
-Largely based on showdown.js by John Fraser (Attacklab).
-
-Original Markdown Copyright (c) 2004-2005 John Gruber
-  <http://daringfireball.net/projects/markdown/>
-
-
-Original Showdown code copyright (c) 2007 John Fraser
-
-Modifications and bugfixes (c) 2009 Dana Robinson
-Modifications and bugfixes (c) 2009-2011 Stack Exchange Inc.
-
-Permission is hereby granted, free of charge, to any person obtaining a
-copy [...]
-</pre>
-
-> Ok, so it says it's based on showdown. John Fraser wrote showdown and also 
-> WMD, which IIRC was built on top of showdown. (Showdown converts the
-> markdown to html, and WMD adds the editor UI.)
-> 
-> I can nowhere find a actual statement of the copyright of showdown or
-> WMD. <http://code.google.com/p/wmd/> has a "MIT License" notice on it,
-> but this is clearly just the license chosen when signing up at google
-> code for the repo that would be used for a rewrite of the code, and the only thing 
-> said about the previous 1.0 release of WMD is "use it freely", which is not
-> specific enough to be a grant of license, and is moreover not a free
-> software license, as it does not cover distribution or modification.
-> 
-> Which was all covered in the thread here, 
-> when StackOverflow decided to start working on pagedown.
-> <http://blog.stackoverflow.com/2008/12/reverse-engineering-the-wmd-editor/>
-> This thread does not give any indication that they ever managed to get
-> a license grant for WMD/showdown. It frankly, does not inspire confidence
-> that the people working on this care about the license.
-> 
-> It would probably be pretty easy to adapt the ikiwiki wmd plugin 
-> to use pagedown. But without a clear and credible license, why?
-> 
-> (Note that I have a wmd-new branch in my ikiwiki git repo that
-> uses <https://github.com/derobins/wmd>, which was an earlier
-> version of pagedown (probably, not entirely clear).)
-> 
-> An alternate alternative is markitup: <http://markitup.jaysalvat.com/>
-> It has a clear history and a credible license (MIT or GPL dual license).
-> It's also easily extensible to other formats so could handle rst etc.
-> It does not, however, have a markdown to html converter -- for 
-> previewing it has to talk to the server with AJAX.
-> --[[Joey]] 
+Other conversations:
 
 >> I've got pagedown working on my personal site (simon.kisikew.org) but I'm not sure how
 >> I can inject the relevant &lt;div&gt;'s in the right place. They need to go **above**
index dcab041dc285b0ae9214a629c692d1f8e747b7d9..d2d1a6329c4c9c0cf0429d14f35b820ce5329e06 100644 (file)
@@ -1,4 +1,4 @@
-lkiwiki's plugin interface allows all kinds of useful [[plugins]] to be
+Ikiwiki's plugin interface allows all kinds of useful [[plugins]] to be
 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]].
@@ -31,20 +31,26 @@ 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.
+As a compiler, ikiwiki starts by calling the
+[[`refresh`|plugins/write#refresh]] hook. Then it checks the wiki's source to
+find new or changed pages. The [[`needsbuild`|plugins/write#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`|plugins/write#scan]] hooks, which collect
+metadata about the pages. Then it runs a page rendering pipeline, by calling
+in turn these hooks: [[`filter`|plugins/write#filter]],
+[[`preprocess`|plugins/write#preprocess]],
+[[`linkify`|plugins/write#linkify]], [[`htmlize`|plugins/write#htmlize]],
+[[`indexhtml`|plugins/write#indexhtml]],
+[[`pagetemplate`|plugins/write#pagetemplate]],
+[[`sanitize`|plugins/write#sanitize]], [[`format`|plugins/write#format]].
+
+After all necessary pages are built, it calls the
+[[`changes`|plugins/write#changes]] hook. Finally, if a page was deleted, the
+[[`delete`|plugins/write#delete]] hook is called, and the files that page had
+previously produced are removed.
 
 ### cgi
 
@@ -53,33 +59,39 @@ 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.
+* Ikiwiki is run as a cgi. It assigns Alice a session cookie, and, by calling
+  the [[`auth`|plugins/write#auth]] hooks, sees that she is not yet logged in.
+* The [[`sessioncgi`|plugins/write#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`|plugins/write#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`|plugins/write#formbuilder]]
+  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.
+* The [[openid]] plugin's [[`formbuilder`|plugins/write#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`|plugins/write#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.
+* Now all the [[`canedit`|plugins/write#canedit]] hooks are happy. The
+  [[editpage]] plugin calls
+  [[`formbuilder_setup`|plugins/write#formbuilder]] 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.
+* The [[editpage]] plugin's [[`formbuilder`|plugins/write#formbuilder]] hook
+  sees that the Save button was pressed, and calls the
+  [[`checkcontent`|plugins/write#checkcontent]] and
+  [[`editcontent`|plugins/write#editcontent]] hooks.  Then it saves the page
+  to disk, and branches into the compiler part of ikiwiki to refresh the wiki.
 
 ## Types of plugins
 
@@ -165,7 +177,7 @@ 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
+### <a name="refresh">refresh</a>
 
        hook(type => "refresh", id => "foo", call => \&refresh);
 
@@ -173,7 +185,7 @@ This hook is called just before ikiwiki scans the wiki for changed files.
 It's useful for plugins that need to create or modify a source page. The
 function is passed no values.
 
-### needsbuild
+### <a name="needsbuild">needsbuild</a>
 
        hook(type => "needsbuild", id => "foo", call => \&needsbuild);
 
@@ -187,7 +199,7 @@ modified version of its input. It can add or remove files from it.
 The second parameter passed to the function is a reference to an array of
 files that have been deleted.
 
-### scan
+### <a name="scan">scan</a>
 
        hook(type => "scan", id => "foo", call => \&scan);
 
@@ -199,7 +211,7 @@ them to `%links`. Present in IkiWiki 2.40 and later.
 The function is passed named parameters "page" and "content". Its return
 value is ignored.
 
-### filter
+### <a name="filter">filter</a>
 
        hook(type => "filter", id => "foo", call => \&filter);
 
@@ -207,7 +219,7 @@ Runs on the full raw source of a page, before anything else touches it, and
 can make arbitrary changes. The function is passed named parameters "page",
 "destpage", and "content". It should return the filtered content.
 
-### preprocess
+### <a name="preprocess">preprocess</a>
 
 Adding a preprocessor [[ikiwiki/directive]] is probably the most common use
 of a plugin.
@@ -250,7 +262,7 @@ format at preprocessor time. Text output by a preprocessor directive will
 be linkified and passed through markdown (or whatever engine is used to
 htmlize the page) along with the rest of the page.
 
-### linkify
+### <a name="linkify">linkify</a>
 
        hook(type => "linkify", id => "foo", call => \&linkify);
 
@@ -263,7 +275,7 @@ Plugins that implement linkify must also implement a scan hook, that scans
 for the links on the page and adds them to `%links` (typically by calling
 `add_link`).
 
-### htmlize
+### <a name="htmlize">htmlize</a>
 
        hook(type => "htmlize", id => "ext", call => \&htmlize);
 
@@ -287,7 +299,7 @@ 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.
 
-### indexhtml
+### <a name="indexhtml">indexhtml</a>
 
        hook(type => "indexhtml", id => "foo", call => \&indexhtml);
 
@@ -298,7 +310,7 @@ update search indexes. Added in ikiwiki 2.54.
 The function is passed named parameters "page", "destpage", and "content".
 Its return value is ignored.
 
-### pagetemplate
+### <a name="pagetemplate">pagetemplate</a>
 
        hook(type => "pagetemplate", id => "foo", call => \&pagetemplate);
 
@@ -333,7 +345,7 @@ 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
+### <a name="sanitize">sanitize</a>
 
        hook(type => "sanitize", id => "foo", call => \&sanitize);
 
@@ -343,7 +355,7 @@ modify the body of a page after it has been fully converted to html.
 The function is passed named parameters: "page", "destpage", and "content",
 and should return the sanitized content.
 
-### format
+### <a name="format">format</a>
 
        hook(type => "format", id => "foo", call => \&format);
 
@@ -356,21 +368,48 @@ when the page is being previewed.)
 The function is passed named parameters: "page" and "content", and 
 should return the formatted content.
 
-### delete
+### build_affected
+
+       hook(type => "build_affected", id => "foo", call => \&build_affected);
+
+This hook is called after the directly changed pages have been built,
+and can cause extra pages to be built. If links and backlinks were provided
+by a plugin, this would be where that plugin would rebuild pages whose
+backlinks have changed, for instance. The [[trail]] plugin uses this hook
+to rebuild pages whose next or previous page has changed.
+
+The function should currently ignore its parameters. It returns a list with
+an even number of items (a hash in list context), where the first item of
+each pair is a page name to be rebuilt (if it was not already rebuilt), and
+the second is a log message resembling
+`building plugins/write because the phase of the moon has changed`.
+
+### <a name="delete">delete</a>
 
        hook(type => "delete", id => "foo", call => \&delete);
 
-Each time a page or pages is removed from the wiki, the referenced function
+After a page or pages is removed from the wiki, the referenced function
 is called, and passed the names of the source files that were removed.
 
-### change
+### rendered
 
-       hook(type => "change", id => "foo", call => \&render);
+       hook(type => "rendered", id => "foo", call => \&rendered);
 
-Each time ikiwiki renders a change or addition (but not deletion) to the
+After ikiwiki renders a change or addition (but not deletion) to the
 wiki, the referenced function is called, and passed the names of the
 source files that were rendered.
 
+(This hook used to be called "change", but that was not accurate.
+For now, plugins using the old hook name will still work.)
+
+### <a name="changes">changes</a>
+
+       hook(type => "changes", id => "foo", call => \&changes);
+
+After ikiwiki renders changes to the wiki, the referenced function is
+called, and passed the names of the source files that were added, modified,
+or deleted.
+
 ### cgi
 
        hook(type => "cgi", id => "foo", call => \&cgi);
@@ -383,7 +422,7 @@ parameters, and if it will handle this CGI request, output a page
 Note that cgi hooks are called as early as possible, before any ikiwiki
 state is loaded, and with no session information.
 
-### auth
+### <a name="auth">auth</a>
 
        hook(type => "auth", id => "foo", call => \&auth);
 
@@ -396,7 +435,7 @@ object's "name" parameter to the authenticated user's name. Note that
 if the name is set to the name of a user who is not registered,
 a basic registration of the user will be automatically performed.
 
-### sessioncgi
+### <a name="sessioncgi">sessioncgi</a>
 
        hook(type => "sessioncgi", id => "foo", call => \&sessioncgi);
 
@@ -405,7 +444,7 @@ is only run once a session object is available. It is passed both a CGI
 object and a session object. To check if the user is in fact signed in, you
 can check if the session object has a "name" parameter set.
 
-### canedit
+### <a name="canedit">canedit</a>
 
        hook(type => "canedit", id => "foo", call => \&canedit);
 
@@ -445,7 +484,7 @@ bypass it). It works exactly like the `canedit` hook,
 but is passed the named parameters `cgi` (a CGI object), `session` (a
 session object), `src`, `srcfile`, `dest` and `destfile`.
 
-### checkcontent
+### <a name="checkcontent">checkcontent</a>
        
        hook(type => "checkcontent", id => "foo", call => \&checkcontent);
 
@@ -466,7 +505,7 @@ should return a message stating what the problem is, or a function
 that can be run to perform whatever action is necessary to allow the user
 to post the content.
 
-### editcontent
+### <a name="editcontent">editcontent</a>
 
        hook(type => "editcontent", id => "foo", call => \&editcontent);
 
@@ -477,7 +516,7 @@ user, the page name, a `CGI` object, and the user's `CGI::Session`.
 
 It can modify the content as desired, and should return the content.
 
-### formbuilder
+### <a name="formbuilder">formbuilder</a>
 
        hook(type => "formbuilder_setup", id => "foo", call => \&formbuilder_setup);
        hook(type => "formbuilder", id => "foo", call => \&formbuilder);
@@ -594,7 +633,7 @@ describes the plugin as a whole. For example:
   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.
+  same as the tags used for [[plugins]] on this wiki.
 
 ### genwrapper
 
@@ -645,7 +684,7 @@ wiki updates.
 
 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
-`$wikistate{$id}{$key}=$value, where `$value` is anything Storable can
+`$wikistate{$id}{$key}=$value`, where `$value` is anything Storable can
 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.
@@ -1220,6 +1259,20 @@ and an error message on failure.
 This hook and `rcs_preprevert` are optional, if not implemented, no revert
 web interface will be available.
 
+### `rcs_find_changes($)`
+
+Finds changes committed since the passed RCS-specific rev. Returns
+a hash of the files changed, a hash of the files deleted, and the
+current rev.
+
+This hook is optional.
+
+### `rcs_get_current_rev()`
+
+Gets a RCS-specific rev, which can later be passed to `rcs_find_changes`.
+
+This hook is optional.
+
 ### PageSpec plugins
 
 It's also possible to write plugins that add new functions to
diff --git a/doc/plugins/write/names.mdwn b/doc/plugins/write/names.mdwn
new file mode 100644 (file)
index 0000000..88bc2d9
--- /dev/null
@@ -0,0 +1,25 @@
+*This page is work in progress and can not be considered to be part of the
+documentation so far.*
+
+This page describes the various forms the name of a page can take.
+
+[[!table data="""
+concept          | example
+-----------------|-----------------------------------------------------------------------------
+title            | '`dir A/page B`' unless a meta title is defined
+link             | '`dir_A/page_B`' or '`dir A/page B`' or '`page_B`' / '`page B`' when inside dirA
+page name        | '`dir_A/page_B`'
+source file      | '`/dir_A/page_B/index.mdwn`' or '`/dir_A/page_B.mdwn`' depending on indexpages
+rendered file    | '`/dir_A/page_B/`' or '`/dir_A/page_B.html`' depending on usedirs
+"""]]
+
+
+functions:
+
+* `pagename`: source file to page name
+* `pagetitle`: page name to title but not considering meta title
+* `titlepage`: title to page name but not considering meta title
+* `linkpage`: link to page name
+* `htmllink`: page name to html link to rendered file
+* `bestlink`: link to page name
+* `htmlpage`: page name to rendered file
index 5345f71f257c2979065189942ac77ce1074fa1e6..1912c8a2f37041ee54d4187957d7a664c6909573 100644 (file)
@@ -81,8 +81,8 @@ textbook.
 
        sub fib {
                my $num=shift;
-               return 0 if $num == 1;
-               return 1 if $num == 2;
+               return 0 if $num == 0;
+               return 1 if $num == 1;
                return fib($num - 1) + fib($num - 2);
        }
 
@@ -92,7 +92,7 @@ And let's change the `preprocess` sub to use it:
 
        sub preprocess {
                my %params=@_;
-               my $num=$last++;
+               my $num=++$last;
                return fib($num);
        }
 
@@ -102,7 +102,7 @@ Feel free to try it out with a simple page like this:
 
 Looks like it works ok, doesn't it? That creates a page that lists:
 
-       1, 1, 3, 5, 8
+       1, 1, 2, 3, 5
 
 But what happens if there are two pages that both use fib? Try it out.
 If ikiwiki builds both pages in one pass, the sequence will continue
@@ -127,7 +127,7 @@ to start from 1 in every page that uses it.
        sub preprocess {
                my %params=@_;
                my $page=$params{destpage};
-               my $num=$last{$page}++;
+               my $num=++$last{$page};
                return fib($num);
        }
 
@@ -145,7 +145,7 @@ Just insert these lines of code inside `preprocess`, in the appropriate
 spot:
 
                if (exists $params{seed}) {
-                       $last{$page}=$params{seed}-1;
+                       $last{$page}=$params{seed};
                }
 
 But this highlights another issue with the plugin. The `fib()` function is
@@ -158,7 +158,7 @@ Now, we could try to fix `fib()` to run in constant time for any number,
 but that's not the focus of this tutorial. Instead, let's concentrate on
 making the plugin use the existing function safely. A good first step would
 be a guard on how high it will go.
-       
+
        my %last;
 
        sub preprocess {
@@ -167,7 +167,7 @@ be a guard on how high it will go.
                if (exists $params{seed}) {
                        $last{$page}=$params{seed}-1;
                }
-               my $num=$last{$page}++;
+               my $num=++$last{$page};
                if ($num > 25) {
                        error "can only calculate the first 25 numbers in the sequence";
                }
@@ -178,10 +178,10 @@ Returning an error message like this is standard for preprocessor plugins,
 so that the user can look at the built page and see what went wrong.
 
 Are we done? Nope, there's still a security hole. Consider what `fib()`
-does for numbers less than 1. Or for any number that's not an integer. In
+does for numbers less than 0. Or for any number that's not an integer. In
 either case, it will run forever. Here's one way to fix that:
 
-               if (int($num) != $num || $num < 1) {
+               if (int($num) != $num || $num < 0) {
                        error "positive integers only, please";
                }
 
diff --git a/doc/plugins/write/tutorial/discussion.mdwn b/doc/plugins/write/tutorial/discussion.mdwn
new file mode 100644 (file)
index 0000000..19f7e40
--- /dev/null
@@ -0,0 +1,20 @@
+Thanks for the tutorial!
+
+But I think you have an error in the fib function! If you really start with
+
+    my $last = 0;
+
+and your fib function, you'll get this error, as you've produced a never ending recursion:
+
+    Deep recursion on subroutine "IkiWiki::Plugin::fib::fib" at ./fib.pm line 29.
+
+So the fib function should better look like this, which is its true definition (see [[Wikipedia|http://de.wikipedia.org/wiki/Fibonacci-Folge]], for example):
+
+       sub fib {
+               my $num=shift;
+               return 0 if $num == 0;
+               return 1 if $num == 1;
+               return fib($num - 1) + fib($num - 2);
+       }
+
+Just as a hint for people who run into this error while doing this tutorial.
diff --git a/doc/podcast.mdwn b/doc/podcast.mdwn
new file mode 100644 (file)
index 0000000..67eb793
--- /dev/null
@@ -0,0 +1,18 @@
+A podcast is just a [[blog]] with RSS/Atom feeds containing media
+enclosures. Once you've made a blog, ikiwiki gives you two ways to
+turn it into a podcast.
+
+## Basic podcasting
+
+Put a media file where you'd put a blog post, and your `\[[!inline]]`
+directive will include it as a media-only post.
+
+## Fancier podcasting
+
+Put the media file where `\[[!inline]]` _won't_ directly include it.
+Write a blog post with `\[[!meta enclosure="WikiLink/to/media.mp3"]]`
+and your show notes.
+
+-----
+
+See also [[tips/migrating_podcast_to_ikiwiki]].
index fdd2fbfd419db786dd336ce07905ab04304ffee6..57b0d044b513788658652a7133486e4be3282c2d 100644 (file)
@@ -171,8 +171,21 @@ Bugs found and fixed so far:
 
 > Merged to current head. --[[Joey]] 
 
-* Return bounded output from `rcs_diff()` when asked, as the API states.
-   (6753235d98a3903364af26c0614106c47d93ae35)
-* When adding a text file under a name formerly tracked as binary,
-  fix CVS keyword substitution behavior by explicitly setting `-kkv`.
-   (e45175d5454cc72b261507260accb309f13b5e8b)
+----
+
+Hi! Bugfixes in `schmonz/cvs` I'd like to see merged:
+
+* `6753235d`: Return bounded output from `rcs_diff()` when asked, as
+  the API states.
+* `e45175d5`: Always explicitly set CVS keyword substitution behavior.
+  Fixes behavior when a text file is added under a name formerly
+  used for a binary file.
+* `b30cacdf`: If the previous working directory no longer exists after
+  a CVS operation, don't try to `chdir()` back to it afterward.
+* `91b477c0`: Fix diffurl links (cvsweb expects unescaped '/').
+
+These are all the diffs that exist on the branch, so if the changes
+are acceptable you should be able to simply merge the branch.
+--[[schmonz]]
+
+> All applied. --[[Joey]] 
index b4f639c614f199dc56f1e61d09057769df288d22..c82adbd049258d7cf49ead1ac8d043138b5ef5fc 100644 (file)
@@ -116,3 +116,38 @@ pulling changes from the bare root repository, you will need to
 manually update the local wiki, with a command such as `ikiwiki
 -setup localwiki.setup -refresh`. You could use git's `post-merge` hook
 to automate that command.
+
+## Using ikiwiki with Gerrit
+
+[Gerrit Code Review](https://code.google.com/p/gerrit/) manages a set of Git
+repositories and provides a web interface to review and merge commits.  You can
+configure ikiwiki to work with a Gerrit-managed repository, allowing you to
+review and merge commits to your wiki.
+
+First, create your initial wiki repository with Gerrit.  On the server, as the
+user that will own the wiki, clone that repository to create a working
+directory for ikiwiki, such as /srv/wiki/ikiwiki-checkout.  Create a setup file
+and target directory as usual, referencing that working directory path, and
+creating a post-update hook in Gerrit's repository.  You'll need to set
+appropriate permissions on the hook directory for the repository so that the
+user running ikiwiki can compile and install the post-update hook.  Also note
+that you must disable web editing by disabling the editpage plugin, and you
+must not enable any other plugin that commits to the repository, since ikiwiki
+will not have permission to push to the repository.  (Allowing web edits to
+have such permission would bypass Gerrit's code review, defeating the purpose.)
+
+Gerrit does not run per-repository hooks, such as the post-update hook ikiwiki
+installs to update the wiki after pushes.  However, Gerrit has site-wide hooks,
+including a ref-updated hook that runs whenever a ref changes.  You can use
+that hook to trigger ikiwiki's post-update hook.  The following script,
+installed as Gerrit's ref-updated hook, will run the post-update hook on any
+repository that has a "gerrit-run-post-update-hook" file in it:
+
+    #!/bin/sh
+    if [ -e "$GIT_DIR/gerrit-run-post-update-hook" ] ; then
+        exec "$GIT_DIR/hooks/post-update"
+    fi
+
+Then just create gerrit-run-post-update-hook in the wiki repository, run
+ikiwiki --setup on the setup file, add your wiki to /etc/ikiwiki/wikilist, and
+start reviewing and committing wiki changes via Gerrit.
index 200a3439d0f95cf28c7da5e0572772d13aff3983..53eae39e3f0ec7cb7f2e5ca7246a448d84f5997f 100644 (file)
@@ -9,11 +9,11 @@
    xmlns="http://www.w3.org/2000/svg"
    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="493.90625"
-   height="548.64734"
+   width="493.02975"
+   height="542.18921"
    id="svg2"
    version="1.1"
-   inkscape:version="0.48.1 r9760"
+   inkscape:version="0.48.4 r9939"
    sodipodi:docname="wiki_edit_flow.svg">
   <defs
      id="defs4">
      inkscape:pageopacity="0.0"
      inkscape:pageshadow="2"
      inkscape:zoom="1.0885159"
-     inkscape:cx="281.26331"
-     inkscape:cy="219.65103"
+     inkscape:cx="281.27395"
+     inkscape:cy="314.69374"
      inkscape:document-units="px"
      inkscape:current-layer="layer1"
      showgrid="false"
      showguides="true"
      inkscape:guide-bbox="true"
      inkscape:snap-global="true"
-     inkscape:window-width="1280"
-     inkscape:window-height="995"
-     inkscape:window-x="1280"
-     inkscape:window-y="0"
+     inkscape:window-width="1438"
+     inkscape:window-height="872"
+     inkscape:window-x="0"
+     inkscape:window-y="26"
      inkscape:window-maximized="1"
      fit-margin-top="25"
      fit-margin-left="25"
        empspacing="5"
        visible="true"
        enabled="true"
-       snapvisiblegridlinesonly="true" />
+       snapvisiblegridlinesonly="true"
+       originx="0.010641754px"
+       originy="26px" />
   </sodipodi:namedview>
   <metadata
      id="metadata7">
         <dc:format>image/svg+xml</dc:format>
         <dc:type
            rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
+        <dc:title />
       </cc:Work>
     </rdf:RDF>
   </metadata>
      inkscape:label="Layer 1"
      inkscape:groupmode="layer"
      id="layer1"
-     transform="translate(-159.65625,-106.875)">
+     transform="translate(-159.64561,-139.33311)">
     <rect
        style="fill:none;stroke:#000000;stroke-width:0.70866144;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
        id="rect3866"
-       width="220.00006"
-       height="79.999939"
+       width="442.32111"
+       height="341.82434"
        x="184.99994"
-       y="142.36218"
+       y="164.68744"
        ry="10"
        rx="10" />
     <path
        style="fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 355,182.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+       d="m 355,222.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
        id="path2989"
        inkscape:connector-curvature="0" />
     <text
        xml:space="preserve"
        style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
        x="368.57144"
-       y="225.21931"
+       y="251.21931"
        id="text2995"
        sodipodi:linespacing="125%"><tspan
          sodipodi:role="line"
          id="tspan2997"
          x="368.57144"
-         y="225.21931" /></text>
+         y="251.21931" /></text>
     <path
        style="fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 355,322.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+       d="m 355,348.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
        id="path2989-4"
        inkscape:connector-curvature="0" />
     <path
        style="fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 355,457.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+       d="m 355,483.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
        id="path2989-1"
        inkscape:connector-curvature="0" />
     <path
        style="fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 355,597.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+       d="m 355,623.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
        id="path2989-5"
        inkscape:connector-curvature="0" />
     <path
        style="opacity:0.48800001;fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 475,597.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+       d="m 475,623.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
        id="path2989-2"
        inkscape:connector-curvature="0" />
     <path
        style="opacity:0.5;fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 235,597.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+       d="m 235,623.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
        id="path2989-8"
        inkscape:connector-curvature="0" />
     <text
        xml:space="preserve"
        style="font-size:40px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
        x="386.06738"
-       y="626.36218"
+       y="652.36218"
        id="text3868"
        sodipodi:linespacing="125%"><tspan
          sodipodi:role="line"
          id="tspan3870"
          x="386.06738"
-         y="626.36218"
+         y="652.36218"
          style="font-size:20px;text-align:center;text-anchor:middle">working clones</tspan></text>
     <text
        xml:space="preserve"
        style="font-size:18px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
        x="524.37988"
-       y="437.36218"
+       y="463.36218"
        id="text3874"
        sodipodi:linespacing="125%"><tspan
          sodipodi:role="line"
          id="tspan3876"
          x="524.37988"
-         y="437.36218"
+         y="463.36218"
          style="font-size:20px;text-align:center;text-anchor:middle">repository</tspan></text>
     <text
        xml:space="preserve"
        style="font-size:16px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
        x="525.35156"
-       y="304.36218"
+       y="330.36218"
        id="text3878"
        sodipodi:linespacing="125%"><tspan
          sodipodi:role="line"
          id="tspan3880"
          x="525.35156"
-         y="304.36218"
+         y="330.36218"
          style="font-size:20px;text-align:center;text-anchor:middle">srcdir</tspan></text>
     <text
        xml:space="preserve"
        style="font-size:16px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
        x="525.1543"
-       y="165.36218"
+       y="201.36218"
        id="text3882"
        sodipodi:linespacing="125%"><tspan
          sodipodi:role="line"
          id="tspan3884"
          x="525.1543"
-         y="165.36218"
+         y="201.36218"
          style="font-size:20px;text-align:center;text-anchor:middle">destdir</tspan></text>
     <g
        id="g5440"
-       transform="translate(5,25.000003)">
+       transform="translate(5,51.000003)">
       <path
          sodipodi:nodetypes="cc"
          inkscape:connector-curvature="0"
          style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)" />
     </g>
     <g
-       transform="translate(5,-110)"
+       transform="translate(5,-84)"
        id="g5440-4">
       <path
          sodipodi:nodetypes="cc"
          style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)" />
     </g>
     <g
-       transform="matrix(0.71872744,0.69529193,-0.69529193,0.71872744,353.78964,-104.94206)"
+       transform="matrix(0.71872744,0.69529193,-0.69529193,0.71872744,353.78964,-78.94206)"
        id="g5440-47">
       <path
          sodipodi:nodetypes="cc"
          style="opacity:0.5;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)" />
     </g>
     <g
-       transform="matrix(-0.71872744,0.69529193,0.69529193,0.71872744,421.21036,-104.94206)"
+       transform="matrix(-0.71872744,0.69529193,0.69529193,0.71872744,421.21036,-78.94206)"
        id="g5440-47-9"
        style="opacity:0.5">
       <path
     </g>
     <path
        style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker5532)"
-       d="m 380,262.36218 0,-60"
+       d="m 380,288.36218 0,-60"
        id="path5558"
        inkscape:connector-curvature="0" />
     <g
        id="g5810"
-       transform="translate(0,-9)">
+       transform="translate(0,17)">
       <g
          transform="translate(-230,-4.9999974)"
          id="g3784-7">
     </g>
     <g
        id="g5824"
-       transform="translate(0,-9)">
+       transform="translate(0,17)">
       <g
          transform="translate(-165,-9.9999974)"
          id="g3784-0">
            sodipodi:cy="187.36218"
            sodipodi:rx="5"
            sodipodi:ry="5"
-           d="m 300,187.36218 a 5,5 0 1 1 -10,0 5,5 0 1 1 10,0 z"
+           d="m 300,187.36218 c 0,2.76143 -2.23858,5 -5,5 -2.76142,0 -5,-2.23857 -5,-5 0,-2.76142 2.23858,-5 5,-5 2.76142,0 5,2.23858 5,5 z"
            transform="matrix(1.4,0,0,1.4,-120,-74.944873)" />
       </g>
     </g>
        xml:space="preserve"
        style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
        x="265"
-       y="211.36218"
+       y="237.36218"
        id="text5806"
        sodipodi:linespacing="125%"><tspan
          sodipodi:role="line"
          id="tspan5808"
          x="265"
-         y="211.36218"
+         y="237.36218"
          style="font-size:12px">ikiwiki.cgi</tspan></text>
     <path
        style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker5532)"
-       d="m 295,217.36218 c 10,40 25,65 55,85"
+       d="m 295,243.36218 c 10,40 25,65 55,85"
        id="path5834"
        inkscape:connector-curvature="0"
        sodipodi:nodetypes="cc" />
        xml:space="preserve"
        style="font-size:16px;font-style:normal;font-weight:normal;text-align:end;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
        x="351.31982"
-       y="362.36218"
+       y="388.36218"
        id="text6240"
        sodipodi:linespacing="125%"><tspan
          sodipodi:role="line"
          id="tspan6242"
          x="351.31982"
-         y="362.36218"
+         y="388.36218"
          style="font-size:14px;text-align:end;writing-mode:lr-tb;text-anchor:end">post-update</tspan><tspan
          sodipodi:role="line"
          x="351.31982"
-         y="379.86218"
+         y="405.86218"
          style="font-size:14px;text-align:end;writing-mode:lr-tb;text-anchor:end"
          id="tspan6244">hook</tspan></text>
     <text
        xml:space="preserve"
        style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
        x="420"
-       y="362.36218"
+       y="388.36218"
        id="text6246"
        sodipodi:linespacing="125%"><tspan
          sodipodi:role="line"
          id="tspan6248"
          x="420"
-         y="362.36218"
+         y="388.36218"
          style="font-size:14px">ikiwiki.cgi</tspan><tspan
          sodipodi:role="line"
          x="420"
-         y="379.86218"
+         y="405.86218"
          id="tspan6250"
          style="font-size:14px">push</tspan></text>
     <text
        xml:space="preserve"
        style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
        x="382"
-       y="316.36218"
+       y="342.36218"
        id="text6252"
        sodipodi:linespacing="125%"><tspan
          sodipodi:role="line"
          id="tspan6254"
          x="382"
-         y="316.36218">.git</tspan></text>
+         y="342.36218">.git</tspan></text>
     <text
        xml:space="preserve"
        style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
        x="383"
-       y="592.36218"
+       y="618.36218"
        id="text6252-3"
        sodipodi:linespacing="125%"><tspan
          sodipodi:role="line"
          id="tspan6254-1"
          x="383"
-         y="592.36218">.git</tspan></text>
+         y="618.36218">.git</tspan></text>
     <text
        xml:space="preserve"
        style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;opacity:0.3;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
        x="502"
-       y="591.36218"
+       y="617.36218"
        id="text6252-3-1"
        sodipodi:linespacing="125%"><tspan
          sodipodi:role="line"
          id="tspan6254-1-0"
          x="502"
-         y="591.36218">.git</tspan></text>
+         y="617.36218">.git</tspan></text>
     <text
        xml:space="preserve"
        style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;opacity:0.3;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
        x="263"
-       y="592.36218"
+       y="618.36218"
        id="text6252-3-6"
        sodipodi:linespacing="125%"><tspan
          sodipodi:role="line"
          id="tspan6254-1-1"
          x="263"
-         y="592.36218">.git</tspan></text>
+         y="618.36218">.git</tspan></text>
     <text
        xml:space="preserve"
        style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
        x="411"
-       y="456.36218"
+       y="482.36218"
        id="text6252-3-0"
        sodipodi:linespacing="125%"><tspan
          sodipodi:role="line"
          id="tspan6254-1-2"
          x="411"
-         y="456.36218">.git</tspan></text>
+         y="482.36218">.git</tspan></text>
     <text
        xml:space="preserve"
        style="font-size:16px;font-style:normal;font-weight:normal;text-align:end;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
        x="300"
-       y="262.36218"
+       y="288.36218"
        id="text6372"
        sodipodi:linespacing="125%"><tspan
          sodipodi:role="line"
          id="tspan6374"
          x="300"
-         y="262.36218"
+         y="288.36218"
          style="font-size:14px">web-side</tspan><tspan
          sodipodi:role="line"
          x="300"
-         y="279.86218"
+         y="305.86218"
          id="tspan6376"
          style="font-size:14px">edit</tspan></text>
     <text
        xml:space="preserve"
        style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
        x="410"
-       y="232.36218"
+       y="258.36218"
        id="text6378"
        sodipodi:linespacing="125%"><tspan
          sodipodi:role="line"
          id="tspan6380"
          x="410"
-         y="232.36218"
+         y="258.36218"
          style="font-size:14px">automatic</tspan><tspan
          sodipodi:role="line"
          x="410"
-         y="249.86218"
+         y="275.86218"
          id="tspan6382"
          style="font-size:14px">rebuild</tspan></text>
     <text
        xml:space="preserve"
        style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
        x="406.75635"
-       y="501.15298"
+       y="527.15295"
        id="text6384"
        sodipodi:linespacing="125%"><tspan
          sodipodi:role="line"
          id="tspan6386"
          x="406.75635"
-         y="501.15298"
+         y="527.15295"
          style="font-size:14px">git</tspan><tspan
          sodipodi:role="line"
          x="406.75635"
-         y="518.65295"
+         y="544.65295"
          id="tspan6388"
          style="font-size:14px">pull</tspan></text>
     <text
        xml:space="preserve"
        style="font-size:16px;font-style:normal;font-weight:normal;text-align:end;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
        x="363.62955"
-       y="504.39691"
+       y="530.39691"
        id="text6390"
        sodipodi:linespacing="125%"><tspan
          sodipodi:role="line"
          id="tspan6392"
          x="363.62955"
-         y="504.39691"
+         y="530.39691"
          style="font-size:14px;text-align:end;text-anchor:end">git</tspan><tspan
          sodipodi:role="line"
          x="363.62955"
-         y="521.89691"
+         y="547.89691"
          id="tspan6394"
          style="font-size:14px;text-align:end;text-anchor:end">push</tspan></text>
   </g>
index 134ebcb7b11b63360ba65483141ee6778ff096c4..d1b2191e2bf32a2bb9a896dae2cd5697ce598e98 100644 (file)
@@ -65,25 +65,25 @@ Released 31 December, 2008.
 
 The 3.x series is expected to undergo continuing development for some time,
 adding improvements and new features, but avoiding changes that break
-backwards compatability.
+backwards compatibility.
 
 ----
 
-# compatability breaking changes
+# compatibility breaking changes
 
 Probably incomplete list:
 
 * Drop old `--getctime` option.
-* Remove compatability code in `loadindex` to handle old index data layouts.
+* Remove compatibility 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?
+* Flip wikilinks? (see [[todo/link_plugin_perhaps_too_general?]] and [[todo/do_not_make_links_backwards]])
 * 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.)
+* Remove support for old `.ikiwiki/comments_pending` and for
+  pending comments located in the srcdir, rather than transient underlay,
+  from comment plugin. That support makes comment moderation slow as
+  it has to check all the old locations.
 
 In general, we try to use [[ikiwiki-transition]] or forced rebuilds on
 upgrade to deal with changes that break compatability. Some things that
@@ -91,8 +91,5 @@ can't help with.
 
 # future goals
 
-* Conversion support for existing other wikis.
-  (Being worked on for MoinMoin and TWiki by [[Josh_Triplett|JoshTriplett]]
-  and Jamey Sharp; support for other wikis should fit into the same
-  framework.)
+* Conversion support for existing other wikis. See [[convert]].
 * [[TODO]], [[bugs]], ...
index 502bc4feca5d4d46a41452feb4eef70d4d973085..f9fa321b3b96baa49c0b79ce32ce03a8553d38c6 100644 (file)
@@ -1,37 +1,16 @@
-# Sandbox
-
-[[!pagestats  pages="/tags/*"]]
-<<<<<<< HEAD
-ttt
-[[!sidebar  content="dfdsfsf""
-This is my custom sidebar for this page.
-
-\[[!calendar pages="posts/*"]]
-"""]]
-
-
-asdfasdf asdfasldkfj asdf
-
-[[!sidebar ]]
-
-
-## number 2
-### number 3
 
 This is the [[SandBox]], a page anyone can edit to try out ikiwiki
 (version [[!version  ]]).
 
-[[!toc levels=1 startlevel=2 ]]
-
-See, online editing :-p
+What about [[this page]]?
 
-Let's try this~!
+hello world (right back at ya)
 
-w00t, how does this look on the **git** end? Well, as a commit of course.
+test, is it being saved? Probably. I will check. This seems really straightforward.
 
-Testing this sandbox thing.
-
-## Blockquotes
+~~~
+pre formated text?
+~~~
 
 > This is a blockquote.
 >
@@ -43,43 +22,35 @@ Testing this sandbox thing.
 >>> to three levels
 >
 > Back to the first level.
-
-> It's kinda like e-mail...
->> ...but without the cool colored lines...
->>> ...and different font colors.
->>>> ...but it's nothing a little CSS can't fix.
-
-# Pointless heading
-
-Let's see a table:
-
-[[!table data="""
-Heading 1|Heading 2|Heading 3
-Item 1| Item 2| Item 3"""]]
+>
+> added a line in level 1
+> and another
 
 
 Numbered list 
 
 1. First item.
- 1. Sub item.
+    1. Sub item.
+    1. Number 2
 1. Another.
 1. And another..
- 1. foo
- 2. bar
- 3. quz
   1. foo
   2. bar
   3. quz
 
 Bulleted list
 
 * item
-* *item*
+* *italic item*
 * item
 * one
   * footballs; runner; unices
   * Cool !
-  * Indeed.
 
-[[new link]]
+test _this_ out.
 
+`test this code block`
+[[!wikipedia War_of_1812]]
 ----
 
 [[!template id=note text="this is generated by the [[plugins/haiku]] plugin"]]
@@ -112,80 +83,41 @@ Bulleted list
 
 _italic_
 
+test ms
 
-Umcacaumca
-
-### this shows a problem with the list and the verbatim 
-
-Now we try to write a "code" block starting with a hash sign
-
-    # test 1,2,3
-    $ another test
-
-
-Oh, let's try to do the same thing using sane syntax instead:
-
-~~~
-# test 1,2,3
-$ another test
-~~~
-
-Now let's write the same block, with a bullest list preceding it.
-
-
-* This is a bullet list
-
-    # test 1,2,3
-    $ another test
+opopopo
+----
 
+This **SandBox** is also a [[blog]]!
 
-----
+[[!inline pages="sandbox/* and !*/Discussion" rootpage="sandbox" show="4" archive="yes"]]
 
-Test some tags
-[[!tag  tech life linux]]
-[[!taglink tech life linux]]
+Testy test!
 
-Toggle:
-[[!toggle  id="ipsum" text="show"]]
 
-[[!toggleable  id="ipsum" text="""
-Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do
-eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim
-ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
-aliquip ex ea commodo consequat.
+<p>
+This is an email link:
+<a href="mailto:erik.josefsson@europarl.europa.eu?Subject=Hello%20again" target="_top">
+Send Mail</a>
+</p>
 
-[[!toggle id="ipsum" text="hide"]]
-"""]]
-----
+What follows is some preformatted text.  Each line is proceeded by four spaces.
 
-This **SandBox** is also a [[blog]]! xxx
+    Test
 
-[[!inline pages="sandbox/* and !*/Discussion" rootpage="sandbox" show="4" archive="yes"]]a
+    <Test>
 
-[[!format  verilog """
-module vc_Mux2 #( parameter W = 1 )
-(
-  input      [W-1:0] in0, in1,
-  input              sel,
-  output reg [W-1:0] out
-);
+    <test>
+    <test>
 
-  always @(*)
-  begin
-    case ( sel )
-      1'd0 : out = in0;
-      1'd1 : out = in1;
-      default : out = {W{1'bx}};
-    endcase
-  end
+    <test>
+      <child />
+    </test>
 
-endmodule
-"""]]
+...Now why doesn't it work like that on my own copy of ikiwiki? :(
 
-#<asd>
+Räksmörgås.
 
-This is simple enough for now [[sandbocen]] no?
+`pre?`
 
-    Do code tags work?
 
-test by max
diff --git a/doc/sandbox/Fantasia.mdwn b/doc/sandbox/Fantasia.mdwn
deleted file mode 100644 (file)
index 8845ec9..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
->> Block
->>> Two Block
-
-[[blog]] blog
-
-* one
-* two
-
-# one
-# two
diff --git a/doc/sandbox/Hey__33__.mdwn b/doc/sandbox/Hey__33__.mdwn
deleted file mode 100644 (file)
index 6902ee3..0000000
+++ /dev/null
@@ -1 +0,0 @@
-Don't you love it...
diff --git a/doc/sandbox/Just_a_new_post_with_non-latin_characters:_日本語.mdwn b/doc/sandbox/Just_a_new_post_with_non-latin_characters:_日本語.mdwn
deleted file mode 100644 (file)
index 44b139a..0000000
+++ /dev/null
@@ -1 +0,0 @@
-Ελληνικά
diff --git a/doc/sandbox/Mooooo.mdwn b/doc/sandbox/Mooooo.mdwn
deleted file mode 100644 (file)
index 6f11d35..0000000
+++ /dev/null
@@ -1 +0,0 @@
-Hrm.
diff --git a/doc/sandbox/NewPage.mdwn b/doc/sandbox/NewPage.mdwn
new file mode 100644 (file)
index 0000000..18e27fc
--- /dev/null
@@ -0,0 +1 @@
+This page uses directory hierarchies. Good.
diff --git a/doc/sandbox/New_blog_entry.mdwn b/doc/sandbox/New_blog_entry.mdwn
new file mode 100644 (file)
index 0000000..9327285
--- /dev/null
@@ -0,0 +1,3 @@
+Räksmörgåstest.
+
+ハッカー
diff --git a/doc/sandbox/Nur_so..mdwn b/doc/sandbox/Nur_so..mdwn
deleted file mode 100644 (file)
index 32c9f23..0000000
+++ /dev/null
@@ -1 +0,0 @@
-Das ist ein Test.
diff --git a/doc/sandbox/Nyus_of_se_däi.mdwn b/doc/sandbox/Nyus_of_se_däi.mdwn
deleted file mode 100644 (file)
index 6205f18..0000000
+++ /dev/null
@@ -1 +0,0 @@
-Sies ahr se nyus of se däi...... säi ahr väri interesting, for schur.
diff --git a/doc/sandbox/Test.py b/doc/sandbox/Test.py
new file mode 100644 (file)
index 0000000..7be9128
--- /dev/null
@@ -0,0 +1,2 @@
+for i in range(10):
+  print i
diff --git a/doc/sandbox/Test_it.mdwn b/doc/sandbox/Test_it.mdwn
deleted file mode 100644 (file)
index 5478d7a..0000000
+++ /dev/null
@@ -1 +0,0 @@
-Test it just now!
diff --git a/doc/sandbox/Testing_blog_entry.mdwn b/doc/sandbox/Testing_blog_entry.mdwn
deleted file mode 100644 (file)
index aa5fa5b..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-# Be cool, this is a test!
-
-Hello guys, this is *just a test* entry.
-
-* Did I say
-* that I love
-* bulleted lists?
diff --git a/doc/sandbox/adding_a_new_post.mdwn b/doc/sandbox/adding_a_new_post.mdwn
deleted file mode 100644 (file)
index b42ae70..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-Bob has many drives to archive his data, most of them kept offline, in a safe place.
-
-With git-annex, Bob has a single directory tree that includes all his files, even if their content is being stored offline. He can reorganize his files using that tree, committing new versions to git, without worry about accidentally deleting anything. 
diff --git a/doc/sandbox/ainvyu.mdwn b/doc/sandbox/ainvyu.mdwn
deleted file mode 100644 (file)
index 7c96095..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-## 룰루랄라 잘되나 테스트
-
-### 두번째
-
-#### 세번째
-
-[[link test]]
-
-    code test
-    basic
-
-----
-
-몸에 좋고 맛도 좋은 소고기
diff --git a/doc/sandbox/bullet_list_and_code_test.mdwn b/doc/sandbox/bullet_list_and_code_test.mdwn
deleted file mode 100644 (file)
index a17729c..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-paragraph.
-
-    code
-
- * bullet list
- * bullet list
-
-    more code
-
- * bullet list continued
-
-    tailing code
diff --git a/doc/sandbox/danc.mdwn b/doc/sandbox/danc.mdwn
deleted file mode 100644 (file)
index 9766475..0000000
+++ /dev/null
@@ -1 +0,0 @@
-ok
diff --git a/doc/sandbox/dateenumeration.mdwn b/doc/sandbox/dateenumeration.mdwn
deleted file mode 100644 (file)
index adc40bd..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-* 1. January
-* 23. February
-* 99. March
-* 7. November
diff --git a/doc/sandbox/discussion.mdwn b/doc/sandbox/discussion.mdwn
new file mode 100644 (file)
index 0000000..ec651a5
--- /dev/null
@@ -0,0 +1,7 @@
+Whilst discussing Ikiwiki on IRC, someone pointed out that "This is the SandBox, a page anyone can edit to try out ikiwiki" is not strictly true, or is debatably so, since they must log in to edit. This proved to be enough of a barrier that said person didn't consider ikiwiki any further. -- [[Jon]]
+
+> I personally think we'd be better off with a separate demo wiki
+> (sandbox.ikiwiki.info?) that has its own git repo and
+> `nofollow` configuration, so edits to that wiki aren't archived
+> in ikiwiki's git history forever; perhaps with a cron job to
+> reset the sandbox every few days? --[[smcv]]
diff --git a/doc/sandbox/hey.mdwn b/doc/sandbox/hey.mdwn
deleted file mode 100644 (file)
index a955185..0000000
+++ /dev/null
@@ -1 +0,0 @@
-* Hello
diff --git a/doc/sandbox/new__95__test.mdwn b/doc/sandbox/new__95__test.mdwn
new file mode 100644 (file)
index 0000000..90bfcb5
--- /dev/null
@@ -0,0 +1 @@
+this is a test
diff --git a/doc/sandbox/plop.mdwn b/doc/sandbox/plop.mdwn
deleted file mode 100644 (file)
index e8b7c91..0000000
+++ /dev/null
@@ -1 +0,0 @@
-plop
diff --git a/doc/sandbox/revert_me.mdwn b/doc/sandbox/revert_me.mdwn
deleted file mode 100644 (file)
index 2b1cd2f..0000000
+++ /dev/null
@@ -1 +0,0 @@
-this looks good
diff --git a/doc/sandbox/sandbocen.mdwn b/doc/sandbox/sandbocen.mdwn
deleted file mode 100644 (file)
index 8f7e049..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-Great!
-
-<code>
-if (sample == test) goto Dijkstra
-</code>
diff --git a/doc/sandbox/sidebar.mdwn b/doc/sandbox/sidebar.mdwn
deleted file mode 100644 (file)
index 9daeafb..0000000
+++ /dev/null
@@ -1 +0,0 @@
-test
diff --git a/doc/sandbox/testostereone.mdwn b/doc/sandbox/testostereone.mdwn
new file mode 100644 (file)
index 0000000..e95aaad
--- /dev/null
@@ -0,0 +1 @@
+testpost
index b573b5f2348a3bea028706f1af7d5433b3b0f9a7..afefd1bc300eb4d18811c42f72931d9dfd7b7860 100644 (file)
@@ -110,7 +110,7 @@ runs ikiwiki to update a given wiki. The wrapper can in turn be made suid,
 for example to be used in a [[post-commit]] hook by people who cannot write
 to the html pages, etc.
 
-If the wrapper script is made suid, then any bugs in this wrapper would be
+If the wrapper program is made suid, then any bugs in this wrapper would be
 security holes. The wrapper is written as securely as I know how, is based
 on code that has a history of security use long before ikiwiki, and there's
 been no problem yet.
@@ -482,9 +482,18 @@ Ludwig Nussel discovered a way for users to hijack root's tty when
 ikiwiki-mass-rebuild was run. Additionally, there was some potential
 for information disclosure via symlinks. ([[!cve CVE-2011-1408]])
 
-This hole was disconvered on 8 June 2011 and fixed the same day with
+This hole was discovered on 8 June 2011 and fixed the same day with
 the release of ikiwiki 3.20110608. Note that the fix is dependant on
-a version of su that has a similar hole fixed; [[!debbug 628843]]
-tracks fixing the hole in Debian's su. An upgrade is a must for any
-sites that have `ikiwiki-update-wikilist` installed suid (not the default),
-and whose admins run `ikiwiki-mass-rebuild`.
+a version of su that has a similar hole fixed. Version 4.1.5 of the shadow
+package contains the fixed su; [[!debbug 628843]] tracks fixing the hole in
+Debian. An upgrade is a must for any sites that have `ikiwiki-update-wikilist`
+installed suid (not the default), and whose admins run `ikiwiki-mass-rebuild`.
+
+## javascript insertion via meta tags
+
+Raúl Benencia discovered an additional XSS exposure in the meta plugin.
+([[!cve CVE-2012-0220]])
+
+This hole was discovered on 16 May 2012 and fixed the same day with
+the release of ikiwiki 3.20120516. A fix was backported to Debian squeeze,
+as version 3.20100815.9. An upgrade is recommended for all sites.
index ce51faa6d47688754acc04f08c0931d4cd90134a..bdbe323fd673884eba68e1387ca4aa4c9d70f4c2 100644 (file)
@@ -143,3 +143,10 @@ setup file.
 
 Add yourself to [[IkiWikiUsers]]. And check out
 the [[tips]] to find out how to get more out of ikiwiki.
+
+----
+
+_Notes_:
+
+- If you are searching for the file where the users are stored, it's in `your_repository/.ikiwiki/userdb`. The one which is in YOUR REPOSITORY, it cannot be found into your `~/.ikiwiki`.
+- If you want to enable a plugin you **WILL HAVE** to add it to the `add_plugins` array in the `*.setup` file (or to use the `--plugin` switch while calling `ikiwiki`). Uncommenting the plugin options/configuration fields in the setup is not **ALWAYS** sufficient. You have been warned.
index 75a5648d5212ba8d090764ea4064229d2a7d1923..6d0f37cd9e05333ea35a211ebdc4ed36e3aabd0f 100644 (file)
@@ -93,9 +93,15 @@ will set everything up.
 
 ## Turn on additional features.
 
+[[!template id="note" text="""
+CGI configuration is heavily dependent on webserver. Figure out (or
+configure) the location and/or filename extension your webserver
+needs to execute a CGI, then set `cgi_wrapper` to a suitable path.
+"""]]
+
 Now you have a basic wiki with a setup file. Time to experiment
 with ikiwiki's many features. 
-   
+
 Let's first enable a key wiki feature and set up [[CGI]] to allow
 editing the wiki from the web. Just edit ikiwiki.setup, uncomment the
 settings for the `cgi_wrapper`, make sure the filename for the cgi wrapper
index 722c6b141b06aee390b82cf10e216f5dfdbfbb4b..ca529c296b64e9eb34f884c5a1595365ea41cca6 100644 (file)
@@ -7,7 +7,7 @@ Some examples of using shortcuts include:
        \[[!google foo]]
        \[[!wikipedia War_of_1812]]
        \[[!debbug 12345]]
-       Check the \[[!cia ikiwiki desc="CIA page for %s"]].
+       Check the \[[!google ikiwiki desc="google search for %s"]].
 
 This page controls what shortcut links the wiki supports.
 
@@ -27,7 +27,7 @@ This page controls what shortcut links the wiki supports.
 * [[!shortcut name=debrt url="https://rt.debian.org/Ticket/Display.html?id=%s"]]
 * [[!shortcut name=debss url="http://snapshot.debian.org/package/%s/"]]
   * Usage: `\[[!debss package]]` or `\[[!debss package/version]]`.  See <http://snapshot.debian.org/> for details.
-* [[!shortcut name=debwiki url="https://wiki.debian.org/%s"]]
+* [[!shortcut name=debwiki url="https://wiki.debian.org/%S"]]
 * [[!shortcut name=fdobug url="https://bugs.freedesktop.org/show_bug.cgi?id=%s" desc="freedesktop.org bug #%s"]]
 * [[!shortcut name=fdolist url="http://lists.freedesktop.org/mailman/listinfo/%s" desc="%s@lists.freedesktop.org"]]
 * [[!shortcut name=gnomebug url="https://bugzilla.gnome.org/show_bug.cgi?id=%s" desc="GNOME bug #%s"]]
@@ -54,10 +54,8 @@ This page controls what shortcut links the wiki supports.
 * [[!shortcut name=perldoc url="http://perldoc.perl.org/search.html?q=%s"]]
 * [[!shortcut name=whois url="http://reports.internic.net/cgi/whois?whois_nic=%s&type=domain"]]
 * [[!shortcut name=cve url="https://cve.mitre.org/cgi-bin/cvename.cgi?name=%s"]]
-* [[!shortcut name=cia url="http://cia.vc/stats/project/%s"]]
-* [[!shortcut name=ciauser url="http://cia.vc/stats/user/%s"]]
 * [[!shortcut name=flickr url="https://secure.flickr.com/photos/%s"]]
-* [[!shortcut name=man url="http://linux.die.net/man/%s"]]
+* [[!shortcut name=man url="http://manpages.debian.org/%s"]]
 * [[!shortcut name=ohloh url="https://www.ohloh.net/p/%s"]]
 * [[!shortcut name=cpanrt url="https://rt.cpan.org/Ticket/Display.html?id=%s" desc="CPAN RT#%s"]]
 * [[!shortcut name=novellbug url="https://bugzilla.novell.com/show_bug.cgi?id=%s" desc="bug %s"]]
index 635ca755c97f5a4dc5488183f4dba0717201da0d..5cdb10bb72fce91161bcc81eff52963a5a3419f3 100644 (file)
@@ -47,7 +47,7 @@ Based on ["What should a mentoring organization application look like?"](http://
     The ikiwiki project strongly encourages collaboration through ikiwiki itself, and thus does not have a mailing list.
     Anyone can create an account on ikiwiki's own wiki.  ikiwiki provides a bug tracker, a TODO list, and the ability
     to create a weblog on any page.  ikiwiki also includes "discussion" sub-pages on every page.  The developers and mentors
-    monitor RecentChanges closely, via the webpage, email, and [CIA](http://cia.navi.cx), and will respond in a timely fashion.
+    monitor RecentChanges closely, via the webpage, email, and CIA, and will respond in a timely fashion.
 
 9. **What is the main IRC channel for your organization?**
 
diff --git a/doc/spam_fighting.mdwn b/doc/spam_fighting.mdwn
new file mode 100644 (file)
index 0000000..712eb07
--- /dev/null
@@ -0,0 +1,35 @@
+ikiwiki.info is occasionally attacked by persistent spammers who keep
+making changes. Anyone can revert spam changes, and several people do.
+
+If you find a spammer, and revert their spam, please post a link to the
+spam commit here. After review, these can be used to ban spammers by login,
+or for the really persistent ones, by IP (or even IP range).
+
+If you're a trusted member of the ikiwiki community and would like access
+to the setup branch in git to be able to update the ban list, get in touch
+with joey with a ssh public key. Once your key is added, you will be able
+to edit the ikiwiki.setup file on the setup branch, and push changes.
+You will also be able to access the recent web server logs to find IP
+addresses from recent web edits, by running:
+
+    ssh b-ikiwiki@ikiwiki.info logdump | grep 'GET .*\?updated HTTP\/' > access.log
+
+## Spam commits
+
+[[!table data="""
+Commit  | Date       | Login     | IP
+854588d | 2013/08/15 | webschen1 | 79.228.6.28
+d8f1faa | 2013/08/16 | webschen1 | 79.228.11.79
+d1dbd8e | 2013/08/19 | webschen1 | 79.228.8.176
+6602052 | 2013/08/21 | webschen1 | 31.17.11.19
+d93a948 | 2013/09/05 | soman81   | 31.17.11.19
+568fdb0 | 2013/09/05 | soman81   | 31.17.11.19
+d759052 | 2013/09/08 | spain1001 | 80.187.106.2
+24a1c62 | 2013/09/15 | spain1001 | 80.187.106.136
+cba01c2 | 2013/09/15 | spain1001 | 80.187.106.136
+702a3e5 | 2014/01/02 | Toni      | 124.105.173.121
+c2924ce | 2014/01/02 | domtheo9110 | 182.253.51.174
+cd81b9f | 2014/01/03 | domtheo9110 | ?
+e3376ce | 2014/08/19 | Nng_L (OpenID) | 58.186.127.104
+104c606 | 2014/08/19 | tlevine (OpenID) | 82.153.13.48
+"""]]
index 7bbfe5d2a8b76bd682817b4e3c60aebd74aee93b..4c48e5c7b9ebbcb2b9b1d6a9f49915c727f2b55c 100644 (file)
@@ -5,10 +5,8 @@
  */
 
 /* html5 compat */
-article,
-header,
-footer,
-nav {
+article,aside,details,figcaption,figure,
+footer,header,hgroup,menu,nav,section {
        display: block;
 }
 
@@ -58,7 +56,8 @@ nav {
        border-bottom: 1px solid #000;
 }
 
-.inlinecontent {
+.inlinecontent,
+.inlineenclosure {
        margin-top: .4em;
 }
 
@@ -202,6 +201,13 @@ div.recentchanges {
        margin-top: 1em;
 }
 
+.archivepagedate {
+       font-style: italic;
+}
+.archivepage {
+       margin-bottom: 1em;
+}
+
 .error {
        color: #C00;
 }
@@ -275,6 +281,7 @@ div.progress-done {
 @media print {
        .actions { display: none; }
        .tags { display: none; }
+       .trails { display: none; }
        .feedbutton { display: none; }
        #searchform { display: none; }
        .blogform, #blogform { display: none; }
@@ -315,6 +322,7 @@ div.progress-done {
 .popup .paren,
 .popup .expand {
        display: none;
+       text-align: left;
 }
 .popup:hover .balloon,
 .popup:focus .balloon {
@@ -501,3 +509,42 @@ a.openid_large_btn:focus {
 .fileupload-content .ui-progressbar-value {
        background: url(ikiwiki/images/pbar-ani.gif);
 }
+
+.trails {
+       margin-top: 1em;
+       margin-bottom: 1em;
+}
+.trail {
+       display: block;
+       clear: both;
+       position: relative;
+}
+
+.trailprev {
+       display: block;
+       text-align: left;
+       position: absolute;
+       top: 0%;
+       left: 3%;
+       width: 30%;
+}
+
+.trailup {
+       display: block;
+       text-align: center;
+       margin-left: 35%;
+       margin-right: 35%;
+}
+
+.trailnext {
+       display: block;
+       text-align: right;
+       position: absolute;
+       top: 0%;
+       width: 30%;
+       right: 3%;
+}
+
+.trailsep {
+       display: none;
+}
index d189fa073468dce570508c2d5fefa2c6b5c0afb6..d0f891c21320243125f2b5b7d26fc278c6292dde 100644 (file)
@@ -80,10 +80,15 @@ Here is a full list of the template files used:
 * `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.
+* `trails.tmpl` - Used by the trail plugin to generate links on each page
+  that is a member of a trail.
+* `notifyemail.tmpl` - Used by the notifymail plugin to generate mails about
+  changed pages.
 * `editpage.tmpl`, `editconflict.tmpl`, `editcreationconflict.tmpl`,
   `editfailedsave.tmpl`, `editpagegone.tmpl`, `pocreatepage.tmpl`,
   `editcomment.tmpl` `commentmoderation.tmpl`, `renamesummary.tmpl`,
   `passwordmail.tmpl`, `openid-selector.tmpl`, `revert.tmpl` - Parts of ikiwiki's user
   interface; do not normally need to be customised.
 
+
 [[!meta robots="noindex, follow"]]
index c7115e4d6af1581465a0cdbb3214ace819768d45..dddab48d4007572b1232394e7d46ed233371f815 100644 (file)
@@ -25,3 +25,4 @@ Is there a list of all the available variables somewhere, or do I just grep the
 
 I pulled a list of variables and posted it, its in the history for [[templates]] under my name. [[justint]]
 
+I am trying to override `page.tmpl` by providing `templates/page.tmpl` in my `srcdir`- this works, but now `templates/page.tmpl` is created in my `destdir` as well! Is this expected? Is there a way to avoid this? --chenz
index 4fdf937ff2da6be6b794cb44dce850f08700b548..853da92801ffc8c039c29f9133238cd4342aa4d6 100644 (file)
@@ -1,8 +1,8 @@
-<span class="infobox">
+<div class="infobox">
 Available in a [[!taglink /git]] repository [[!taglink branch|/branches]].<br />
-Branch: <TMPL_VAR branch><br />
-Author: <TMPL_VAR author><br />
-</span>
+Branch: <TMPL_IF browse><a href="<TMPL_VAR browse>"></TMPL_IF><TMPL_VAR branch><TMPL_IF browse></a></TMPL_IF><br />
+<TMPL_IF author>Author: <TMPL_VAR author><br /></TMPL_IF>
+</div>
 <TMPL_UNLESS branch>
 This template is used to create an infobox for a git branch. It uses
 these parameters:
index 6c66a02ec7d17200f2ffe8f6a6af61c2344ef8e3..4bd1a85bf9559c1d6f38c378f9a696b2f21298b3 100644 (file)
@@ -11,6 +11,6 @@
 <li>[[TipJar]]</li>
 </ul>
 <a href="http://flattr.com/thing/39811/ikiwiki">
-<img src="http://api.flattr.com/button/flattr-badge-large.png"
+<img src="https://api.flattr.com/button/flattr-badge-large.png"
 alt="Flattr this" title="Flattr this" /></a>
 </div>
index 06526df1a2e3dc6ff7c33e343585a3dd4a282f0e..4ac41cb0a77ac17fdcb3f0a71ef106676029ace0 100644 (file)
@@ -9,3 +9,7 @@ Feel free to add your own [[theme|themes]] here, but first consider writing a si
  * **[[AntPortal theme|https://github.com/AntPortal/ikiwiked]]**, contributed by Danny, see an example [[on the Antportal wiki|https://antportal.com/wiki/]]
 
  * **[[Night city theme|http://anarcat.ath.cx/night_city/README/]]**, contributed by [[anarcat]], see an example [[on his homepage|http://anarcat.ath.cx/]]
+
+ * **[[Bootstrap theme|http://anonscm.debian.org/gitweb/?p=users/jak/website.git;a=summary]]**, contributed by [[JAK LINUX|http://jak-linux.org/about/]], based on [[Twitter Bootstrap|http://twitter.github.com/bootstrap/]]
+
+ * **[[Bootstrap 3|https://github.com/ramseydsilva/ikiwiki-bootstrap-theme]]**, contributed by [[ramsey]], based on [[Twitter Bootstrap 3|http://getbootstrap.com]]
index 57f899677f8bade0c71f21d350414cd09e5adaa8..bc654a39dabc8c5ef9948ccf784459fa9dad174c 100644 (file)
@@ -3,7 +3,9 @@ ikiwiki a nice look and feel. The local.css [[CSS]] file is left
 free for you to further customize.
 
 Ikiwiki now comes with several themes contributed by users.
-You can enable the [[theme_plugin|plugins/theme]] to use any of these:
+You can enable the [[theme_plugin|plugins/theme]] to use any of
+these, but you can also deploy custom themes maintained by the
+community from the [[theme market]].
 
 [[!img actiontabs_small.png align=left]] The **actiontabs** theme, contributed by
 [[svend]]. This style sheet displays the action list
@@ -21,6 +23,11 @@ blueview and featuring the photography of Lars Wirzenius.
 
 <br clear="both" />
 
+[[!img monochrome_small.png align=left]] The **monochrome** theme,
+based on [[Jon]]'s homepage design.
+
+<br clear="both" />
+
 [[!img none_small.png align=left]] For completeness, ikiwiki's default
 anti-theme.
 
index ce79d0f70202ec52184bd061f0352c5f0e2be7e9..5c0766a0625cb4316043f553cb035aa830be2357 100644 (file)
@@ -7,3 +7,14 @@ For an example of the theme in action, see: [[https://antportal.com/wiki/]]
 > Shouldn't we just make people post their themes in the [[themes]] page? Or maybe we should make a [[theme market]]? --[[anarcat]]
 
 > I did just that. -- [[anarcat]]
+
+What is the process for merging a theme in Ikiwiki? It seems to me the
+[[Bootstrap theme|http://www2.tblein.eu/posts/How_to_have_a_nice_design_for_ikiwiki/]]
+could improve the options a lot... See the [[theme market]] for the
+links to the actual theme. -- [[anarcat]]
+
+> Step 1 is to not need two versions of page.tmpl to be maintained.
+> This is, unfortunately, the reason why I have not pulled in the bootstrap
+> theme yet. I recently made `<TMPL_IF THEME_$NAME>` be available,
+> so the page.tmpl could use that to do different things if the boostrap
+> theme was enabled. --[[Joey]]
diff --git a/doc/themes/monochrome_small.png b/doc/themes/monochrome_small.png
new file mode 100644 (file)
index 0000000..6c98100
Binary files /dev/null and b/doc/themes/monochrome_small.png differ
index ae612e129d8812bd2c9b8e1d12570b11bb27f623..6d65a0a70a87447fc819d810fba6425436a224e3 100644 (file)
@@ -19,6 +19,7 @@ Thanks to the following people for their kind contributions:
 * Nico Schottelius
 * Jon Dowland
 * Amitai Schlair
+* Luca Capello
 
 (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 01447b009016b016292ce6259dcce7d2e077a452..3fd3a647dea495410661428f9b321ecd91c2e79f 100644 (file)
@@ -24,3 +24,7 @@ and replace with
 This changes the discussion link to a Comment link that takes you to the full page for that blog entry which should contain the disqus comments form that you added before.
 
 Note: This does then mean that to add a comment people need to have javascript enabled.
+
+---
+
+You can also try [IkiWiki::Plugin::disqus](http://code.google.com/p/ikiwiki-plugin-disqus/).
index 070638e3e41a947f5717f92f26365459cd673bb9..338bca78239e33500f38bf0209150b941796eb63 100644 (file)
@@ -176,6 +176,7 @@ Then you'll have to add a few variables to your path [referenced by your compile
 
     export C_INCLUDE_PATH=YOUR_INSTALL_PATH_HERE/include/
     export LIBRARY_PATH=YOUR_INSTALL_PATH_HERE/lib/
+    export LD_LIBRARY_PATH=YOUR_INSTALL_PATH_HERE/lib/
 
 Then you should be able to install the module, and it'll be faster.
 
index 58940b89f9ef860b9a5cc3f2c15337bf036ad6fc..c1529c7a0272eae6fd777081daad6056d4d44832 100644 (file)
@@ -3,6 +3,8 @@ server located at different hosts. Here's a description for such
 a setup, using password-less SSH as a way of communication between
 these two hosts.
 
+[[!img separate-webserver.svg size=490x align=right]]
+
 Git server
 ==========
 
diff --git a/doc/tips/Git_repository_and_web_server_on_different_hosts/separate-webserver.svg b/doc/tips/Git_repository_and_web_server_on_different_hosts/separate-webserver.svg
new file mode 100644 (file)
index 0000000..a9a4281
--- /dev/null
@@ -0,0 +1,716 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="493.26132"
+   height="546.48431"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="separate-webserver.svg">
+  <defs
+     id="defs4">
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend"
+       style="overflow:visible">
+      <path
+         id="path3914"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend"
+       style="overflow:visible">
+      <path
+         id="path3896"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lstart"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lstart"
+       style="overflow:visible">
+      <path
+         id="path3893"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(0.8,0,0,0.8,10,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <linearGradient
+       id="linearGradient3767">
+      <stop
+         style="stop-color:#efbc00;stop-opacity:1;"
+         offset="0"
+         id="stop3769" />
+      <stop
+         id="stop3775"
+         offset="0.93150687"
+         style="stop-color:#ffcb10;stop-opacity:1;" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3771" />
+    </linearGradient>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-4"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path3914-9"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker5456"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path5458"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-3"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path3914-6"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker5456-4"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path5458-7"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-5"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path3914-92"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker5456-3"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path5458-78"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-36"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path3914-5"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker5532"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path5534"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1.0885159"
+     inkscape:cx="281.5055"
+     inkscape:cy="314.69374"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     showguides="true"
+     inkscape:guide-bbox="true"
+     inkscape:snap-global="true"
+     inkscape:window-width="1438"
+     inkscape:window-height="872"
+     inkscape:window-x="0"
+     inkscape:window-y="26"
+     inkscape:window-maximized="1"
+     fit-margin-top="25"
+     fit-margin-left="25"
+     fit-margin-right="25"
+     fit-margin-bottom="25">
+    <inkscape:grid
+       type="xygrid"
+       id="grid2985"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true"
+       originx="0.24219388px"
+       originy="26px" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-159.41406,-135.03802)">
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.70866144;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect3866"
+       width="442.32111"
+       height="227.90776"
+       x="184.99994"
+       y="278.604"
+       ry="10"
+       rx="10" />
+    <path
+       style="fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 355,222.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+       id="path2989"
+       inkscape:connector-curvature="0" />
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="368.57144"
+       y="251.21931"
+       id="text2995"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan2997"
+         x="368.57144"
+         y="251.21931" /></text>
+    <path
+       style="fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 355,348.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+       id="path2989-4"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 355,483.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+       id="path2989-1"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 355,623.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+       id="path2989-5"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.48800001;fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 475,623.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+       id="path2989-2"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.5;fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 235,623.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+       id="path2989-8"
+       inkscape:connector-curvature="0" />
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="386.06738"
+       y="652.36218"
+       id="text3868"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3870"
+         x="386.06738"
+         y="652.36218"
+         style="font-size:20px;text-align:center;text-anchor:middle">working clones</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:18px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="524.37988"
+       y="463.36218"
+       id="text3874"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3876"
+         x="524.37988"
+         y="463.36218"
+         style="font-size:20px;text-align:center;text-anchor:middle">repository</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="525.35156"
+       y="330.36218"
+       id="text3878"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3880"
+         x="525.35156"
+         y="330.36218"
+         style="font-size:20px;text-align:center;text-anchor:middle">srcdir</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="525.1543"
+       y="201.36218"
+       id="text3882"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3884"
+         x="525.1543"
+         y="201.36218"
+         style="font-size:20px;text-align:center;text-anchor:middle">destdir</tspan></text>
+    <g
+       id="g5440"
+       transform="translate(5,51.000003)">
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path3886"
+         d="m 370,512.36218 c -5,-24.99999 -5,-44.99999 0,-70"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:none;marker-mid:none;marker-end:url(#Arrow2Lend)" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path3888"
+         d="m 390,442.36218 c 5,25 5,45 0,70"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)" />
+    </g>
+    <g
+       transform="translate(5,-84)"
+       id="g5440-4">
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path3886-8"
+         d="m 370,512.36218 c -5,-24.99999 -5,-44.99999 0,-70"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:none;marker-mid:none;marker-end:url(#Arrow2Lend)" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path3888-9"
+         d="m 390,442.36218 c 5,25 5,45 0,70"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)" />
+    </g>
+    <g
+       transform="matrix(0.71872744,0.69529193,-0.69529193,0.71872744,353.78964,-78.94206)"
+       id="g5440-47">
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path3886-3"
+         d="m 370,512.36218 c -5,-24.99999 -0.0778,-66.9912 7.34379,-88.08431"
+         style="opacity:0.5;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:none;marker-mid:none;marker-end:url(#Arrow2Lend)" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path3888-6"
+         d="m 391.48399,424.51223 c 5,25 6.0155,63.74804 -1.48399,87.84995"
+         style="opacity:0.5;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)" />
+    </g>
+    <g
+       transform="matrix(-0.71872744,0.69529193,0.69529193,0.71872744,421.21036,-78.94206)"
+       id="g5440-47-9"
+       style="opacity:0.5">
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path3886-3-3"
+         d="m 370,512.36218 c -5,-24.99999 -0.0778,-66.9912 7.34379,-88.08431"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:none;marker-mid:none;marker-end:url(#Arrow2Lend)" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path3888-6-3"
+         d="m 391.48399,424.51223 c 5,25 6.0155,63.74804 -1.48399,87.84995"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)" />
+    </g>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker5532)"
+       d="m 380,288.36218 0,-60"
+       id="path5558"
+       inkscape:connector-curvature="0" />
+    <g
+       id="g5810"
+       transform="translate(0,17)">
+      <g
+         transform="translate(-230,-4.9999974)"
+         id="g3784-7">
+        <g
+           id="g3779-37">
+          <path
+             inkscape:connector-curvature="0"
+             id="path2993-5"
+             d="m 440,177.36218 10,0 0,-10"
+             style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+          <path
+             sodipodi:nodetypes="cccccc"
+             inkscape:connector-curvature="0"
+             id="path2991-3"
+             d="m 440,177.36218 0,40 35,0 0,-50 -25,0 z"
+             style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+          <path
+             inkscape:connector-curvature="0"
+             id="path3777-8"
+             d="m 440,177.36218 10,0 0,-10"
+             style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+        </g>
+      </g>
+      <g
+         transform="translate(-235,-9.9999974)"
+         id="g3784">
+        <g
+           id="g3779">
+          <path
+             inkscape:connector-curvature="0"
+             id="path2993"
+             d="m 440,177.36218 10,0 0,-10"
+             style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+          <path
+             sodipodi:nodetypes="cccccc"
+             inkscape:connector-curvature="0"
+             id="path2991"
+             d="m 440,177.36218 0,40 35,0 0,-50 -25,0 z"
+             style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+          <path
+             inkscape:connector-curvature="0"
+             id="path3777"
+             d="m 440,177.36218 10,0 0,-10"
+             style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+        </g>
+      </g>
+      <text
+         sodipodi:linespacing="125%"
+         id="text5762"
+         y="176.55017"
+         x="206.62401"
+         style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+         xml:space="preserve"><tspan
+           style="font-size:8px"
+           y="176.55017"
+           x="206.62401"
+           id="tspan5764"
+           sodipodi:role="line">&lt;html&gt;</tspan></text>
+    </g>
+    <g
+       id="g5824"
+       transform="translate(0,17)">
+      <g
+         transform="translate(-165,-9.9999974)"
+         id="g3784-0">
+        <g
+           id="g3779-3">
+          <path
+             inkscape:connector-curvature="0"
+             id="path2993-2"
+             d="m 440,177.36218 10,0 0,-10"
+             style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+          <path
+             sodipodi:nodetypes="cccccc"
+             inkscape:connector-curvature="0"
+             id="path2991-8"
+             d="m 440,177.36218 0,40 35,0 0,-50 -25,0 z"
+             style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+          <path
+             inkscape:connector-curvature="0"
+             id="path3777-7"
+             d="m 440,177.36218 10,0 0,-10"
+             style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+        </g>
+      </g>
+      <g
+         transform="matrix(0.74161576,0,0,0.74161576,75.250882,53.354937)"
+         id="g5772">
+        <path
+           sodipodi:type="star"
+           style="fill:#939393;fill-opacity:1;stroke:#939393;stroke-width:0.70866144;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+           id="path5768"
+           sodipodi:sides="13"
+           sodipodi:cx="295"
+           sodipodi:cy="187.36218"
+           sodipodi:r1="10.889445"
+           sodipodi:r2="14.142136"
+           sodipodi:arg1="-2.3561945"
+           sodipodi:arg2="-2.1145335"
+           inkscape:flatsided="false"
+           inkscape:rounded="0.36"
+           inkscape:randomized="0"
+           d="m 287.3,179.66218 c 1.12496,-1.12496 -0.97775,-3.57952 0.38374,-4.40257 1.36149,-0.82305 2.55772,2.1795 4.07662,1.70619 1.5189,-0.47331 0.79773,-3.62389 2.38576,-3.71995 1.58803,-0.0961 1.25188,3.11848 2.81676,3.40526 1.56487,0.28677 2.39046,-2.83808 3.84123,-2.18514 1.45078,0.65294 -0.34074,3.34306 0.91162,4.32422 1.25235,0.98116 3.43557,-1.40209 4.41673,-0.14973 0.98116,1.25236 -1.85532,2.80178 -1.20238,4.25255 0.65294,1.45078 3.69363,0.35511 3.98041,1.91998 0.28677,1.56488 -2.94485,1.61865 -3.04091,3.20668 -0.0961,1.58803 3.10552,2.03094 2.63221,3.54984 -0.47331,1.5189 -3.35976,0.0647 -4.18281,1.42619 -0.82305,1.3615 1.80598,3.24152 0.68102,4.36648 -1.12496,1.12496 -3.00498,-1.50407 -4.36648,-0.68101 -1.36149,0.82305 0.0927,3.7095 -1.42619,4.1828 -1.5189,0.47331 -1.96181,-2.72827 -3.54984,-2.63221 -1.58803,0.0961 -1.64181,3.32768 -3.20668,3.04091 -1.56488,-0.28678 -0.4692,-3.32746 -1.91998,-3.9804 -1.45077,-0.65294 -3.00019,2.18353 -4.25255,1.20237 -1.25236,-0.98116 1.13089,-3.16437 0.14973,-4.41673 -0.98116,-1.25236 -3.67128,0.53916 -4.32422,-0.91161 -0.65294,-1.45078 2.47191,-2.27636 2.18513,-3.84124 -0.28677,-1.56488 -3.50131,-1.22873 -3.40525,-2.81676 0.096,-1.58803 3.24664,-0.86686 3.71995,-2.38576 0.47331,-1.5189 -2.52925,-2.71513 -1.70619,-4.07662 0.82305,-1.36149 3.27761,0.74122 4.40257,-0.38374 z"
+           inkscape:transform-center-x="-0.68364368"
+           inkscape:transform-center-y="0.68364368"
+           transform="translate(-2,0)" />
+        <path
+           sodipodi:type="arc"
+           style="fill:#ffffff;fill-opacity:1;stroke:#939393;stroke-width:0.70866144;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+           id="path5770"
+           sodipodi:cx="295"
+           sodipodi:cy="187.36218"
+           sodipodi:rx="5"
+           sodipodi:ry="5"
+           d="m 300,187.36218 c 0,2.76143 -2.23858,5 -5,5 -2.76142,0 -5,-2.23857 -5,-5 0,-2.76142 2.23858,-5 5,-5 2.76142,0 5,2.23858 5,5 z"
+           transform="matrix(1.4,0,0,1.4,-120,-74.944873)" />
+      </g>
+    </g>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="265"
+       y="237.36218"
+       id="text5806"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan5808"
+         x="265"
+         y="237.36218"
+         style="font-size:12px">ikiwiki.cgi</tspan></text>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker5532)"
+       d="m 295,243.36218 c 10,40 25,65 55,85"
+       id="path5834"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;text-align:end;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="351.31982"
+       y="388.36218"
+       id="text6240"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan6242"
+         x="351.31982"
+         y="388.36218"
+         style="font-size:14px;text-align:end;writing-mode:lr-tb;text-anchor:end">post-update</tspan><tspan
+         sodipodi:role="line"
+         x="351.31982"
+         y="405.86218"
+         style="font-size:14px;text-align:end;writing-mode:lr-tb;text-anchor:end"
+         id="tspan6244">hook</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="420"
+       y="388.36218"
+       id="text6246"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan6248"
+         x="420"
+         y="388.36218"
+         style="font-size:14px">ikiwiki.cgi</tspan><tspan
+         sodipodi:role="line"
+         x="420"
+         y="405.86218"
+         id="tspan6250"
+         style="font-size:14px">push</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="382"
+       y="342.36218"
+       id="text6252"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan6254"
+         x="382"
+         y="342.36218">.git</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="383"
+       y="618.36218"
+       id="text6252-3"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan6254-1"
+         x="383"
+         y="618.36218">.git</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;opacity:0.3;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="502"
+       y="617.36218"
+       id="text6252-3-1"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan6254-1-0"
+         x="502"
+         y="617.36218">.git</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;opacity:0.3;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="263"
+       y="618.36218"
+       id="text6252-3-6"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan6254-1-1"
+         x="263"
+         y="618.36218">.git</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="411"
+       y="482.36218"
+       id="text6252-3-0"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan6254-1-2"
+         x="411"
+         y="482.36218">.git</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;text-align:end;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="300"
+       y="288.36218"
+       id="text6372"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan6374"
+         x="300"
+         y="288.36218"
+         style="font-size:14px">web-side</tspan><tspan
+         sodipodi:role="line"
+         x="300"
+         y="305.86218"
+         id="tspan6376"
+         style="font-size:14px">edit</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="410"
+       y="258.36218"
+       id="text6378"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan6380"
+         x="410"
+         y="258.36218"
+         style="font-size:14px">automatic</tspan><tspan
+         sodipodi:role="line"
+         x="410"
+         y="275.86218"
+         id="tspan6382"
+         style="font-size:14px">rebuild</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="406.75635"
+       y="527.15295"
+       id="text6384"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan6386"
+         x="406.75635"
+         y="527.15295"
+         style="font-size:14px">git</tspan><tspan
+         sodipodi:role="line"
+         x="406.75635"
+         y="544.65295"
+         id="tspan6388"
+         style="font-size:14px">pull</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;text-align:end;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="363.62955"
+       y="530.39691"
+       id="text6390"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan6392"
+         x="363.62955"
+         y="530.39691"
+         style="font-size:14px;text-align:end;text-anchor:end">git</tspan><tspan
+         sodipodi:role="line"
+         x="363.62955"
+         y="547.89691"
+         id="tspan6394"
+         style="font-size:14px;text-align:end;text-anchor:end">push</tspan></text>
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.70866144;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect3866-3"
+       width="442.32111"
+       height="84.593353"
+       x="184.76839"
+       y="160.39235"
+       ry="10"
+       rx="10" />
+  </g>
+</svg>
diff --git a/doc/tips/Hosting_Ikiwiki_and_master_git_repository_on_different_machines.mdwn b/doc/tips/Hosting_Ikiwiki_and_master_git_repository_on_different_machines.mdwn
new file mode 100644 (file)
index 0000000..e6277d3
--- /dev/null
@@ -0,0 +1,157 @@
+[[!meta title="Hosting Ikiwiki with a master git repository on a remote machine"]]
+
+This tutorial explains how to set up a wiki such that:
+
+- the machine running Ikiwiki is not the same as the one hosting the git repository;
+- changes can be done using CGI;
+- changes can be done using git (using ssh protocol).
+
+This configuration may be useful when:
+
+- you do not want (or cannot) connect to the machine hosting your wiki using
+  `git` or `ssh`;
+- you do not want (or cannot) publish web content on the machine hosting you
+  remotely accessible git repository.
+
+I assume the [[rcs]] used is [[rcs/git]], but it might be done for other rcs.
+
+# Similar and related tips and problems
+
+- [[tips/distributed_wikis]] References different way of distributing wikis (including this one).
+- [[http://www.icanttype.org/blog/ikiwiki_git_remote_repo/]] Similar to what I
+  am describing, excepted that you must be able to connect to the machine
+  hosting Ikiwiki using ssh.
+- [[forum/How_to_specify_repository_is_on_a_remote_host__63__]] My solution
+  solves the problem described here, excepted that svn is used there, and in
+  the comments, Joey advice not to do this with svn.
+- [[forum/how_to_setup_ikiwiki_on_a_remote_host]] My solution might answer this
+  problem.
+
+# Overview
+
+By default, when creating a wiki, Ikiwiki creates and uses two repositories: a
+bare repository, and a « slave » repository, used as the source to render the
+wiki. All of these are on the same machine.
+
+Instead of having the bare repository hosted on the same machine, we will host
+it on a remote machine, and tell Ikiwiki to use it instead of its local one. We
+will also ensure that the wiki is rendered whenever a commit is done to the git
+repository.
+
+[[!img separate-web-git-servers.svg size=400x]]
+
+# Conventions
+
+- We are building a wiki called *SITE*.
+- The machine running Ikiwiki and a web server is called the *Ikiwiki machine*.
+- The machine hosting the git repository is called the *git machine*. Users can
+  make git pull and push to this machine.
+
+# Let's go!
+
+## Creating ssh keys on the Ikiwiki machine
+
+- Create a pair of ssh keys, not password-protected (as they will be used by
+  script). Let's call them `id_SITE` and `id_SITE.pub`. These keys will be used
+  by the ikiwiki machine to connect to the git machine.
+
+## Creating and setting up a repository on the git machine
+
+- Create a repository `SITE.git` on the git machine (using `git init --bare`),
+  and ensure that public key `id_SITE.pub` can pull from and push to this
+  repository (using `~/.ssh/config` or by setting the right permissions on
+  gitolite or gitosis).
+
+## Creating the wiki on the ikiwiki machine
+
+- Create the wiki following [[the regular procedure|setup]]. You should have,
+  among others, a directory `SITE.git`, being the master git repository, and a
+  directory `SITE`, clone of `SITE.git`, used as source directory to render the
+  wiki.
+- Ensure that your web server can serve the rendered wiki, and that changes can
+  be done with CGI.
+
+## Configuring the wiki on the wiki machine so that it uses the repository of the git machine
+
+- Configure ssh so that it uses the ssh key `id_SITE` to connect to the git
+  michine: add the following lines to file `~/.ssh/config` on the ikiwiki
+  machine:
+
+        Host server.name.of.the.git.machine
+            User git-machine-user
+            IdentityFile ~/.ssh/id_SITE
+
+- Configure the local copy `SITE` of the wiki (on the ikiwiki machine) to use
+  the remote git repository instead of the local `SITE.git`. To do so, in the
+  file `SITE/.git/config`, replace the lines:
+
+        [remote "origin"]
+               url = /path/to/SITE.git
+               fetch = +refs/heads/*:refs/remotes/origin/*
+
+  by the lines:
+
+        [remote "origin"]
+                url = git-machine-user@server.name.of.the.git.machine:SITE.git
+                fetch = +refs/heads/*:refs/remotes/origin/*
+
+- In this repository (`SITE`), run `git pull` and `git push` to ensure that
+  everything works fine. It *works fine* when you will be able to run `git
+  pull` and `git push` without user interaction.
+
+- Disable the `post-update` hook in ikiwiki: it is used if the git commits are
+  done on this machine, which is no longer the case. To do so, in file
+  `SITE.setup`, comment the line:
+
+        git_wrapper => '/path/to/SITE.git/hooks/post-update',
+
+- Tell Ikiwiki to push to the ikiwiki machine when a commit is done by the web
+  (CGI). To do so, in file `SITE.setup`, add the line:
+
+        git_wrapper_background_command => 'git push',
+
+- Enable plugin [[pingee|http://ikiwiki.info/plugins/pingee/]]. It allows git
+  (on the git machine) to tell ikiwiki to update and rebuild the wiki when
+  commits are done on the git repository, using only an http connection. To do
+  so, add `pingee` to the list of enabled plugins (variable `add_plugins` in
+  file `SITE.setup`).
+
+- Rebuild the wiki (since you chaned the setup file `SITE.setup`).
+
+        ikiwiki --setup SITE.setup --rebuild --verbose
+
+## Configure the git repository (on the git machine) to update the wiki after a push
+
+Add in the `post-receive` hook (file `SITE.git/hooks/post-receive`):
+
+      git log -1 --format=format:%ae HEAD | grep -e '@web$' -e 'USER@HOST' ||  wget "http://WIKI-URL/ikiwiki.cgi?do=ping" -O /dev/stdout
+
+If your wiki is password protected, use:
+
+      git log -1 --format=format:%ae HEAD | grep -e '@web$' -e 'USER@HOST' ||  wget "http://LOGIN:PASSWORD@WIKI-URL/ikiwiki.cgi?do=ping" -O /dev/stdout
+
+The bit before `wget` is here to prevent updating the wiki while it is
+updating, which can lead to a deadlock. Indeed, when the wiki is edited via
+web, or a tag page is automatically added, IkiWiki pushes the changes to the
+Git machine. Then, the hook on this latter machine tries to pull changes from
+the IkiWiki machine, and here is the deadlock. Explanations of the command:
+
+* `git log -1 --format=format:%ae HEAD`: Looks for the user name of the
+  latest commit.
+* `grep -e '@web$' -e 'USER@HOST': Check whether this last commit was pushed
+  from the IkiWiki machine (change `USER@HOST` to the appropriate string).
+* `wget ...`: If the last commit does not come from the IkiWiki machine
+  (which means it comes from another machine), update the wiki.
+
+## Going further
+
+- *Web server on a third machine* It should be possible to use a third machine
+  to host the web server, using [[this documentation|tips/Git_repository_and_web_server_on_different_hosts/]].
+- *Using [[gitolite|https://github.com/sitaramc/gitolite]] to manage
+  repositories on the git machine* Simply replace the manipulations of git on
+  the git machine by the corresponding manipulations using gitolite.
+    * With gitolite, you can use this line in a `post-update` hook:
+
+        `[ x"$GL_USER" = x"`*`gitolite-user`*`" ] || wget ...` where *gitolite-user* is the name of the public key registered through gitolite.
+
+        Thus, you filter out precisely the events that originate from the server-to-be-pinged, no matter what the commit id says. (For example, if you push commits you created on a local CGI ikiwiki, they'd be called '@web' as well).
diff --git a/doc/tips/Hosting_Ikiwiki_and_master_git_repository_on_different_machines/discussion.mdwn b/doc/tips/Hosting_Ikiwiki_and_master_git_repository_on_different_machines/discussion.mdwn
new file mode 100644 (file)
index 0000000..12565fd
--- /dev/null
@@ -0,0 +1,14 @@
+It may be clear to experienced/technical gitolite users, but it confused me so I'd like to ask:
+
+In the comment about gitolite mentioning the line with $GL_USER, I assume "gitolite-user"  
+needs to be replaced with the name of the gitolite user with which ikiwiki pushes  
+changes? For example, if I have a key 'ikiwiki.pub', I use "ikiwiki" in the hook.
+
+If that's what the comment means, I'd be happy if it was made clear, so it's easier  
+to understand. Or I can edit it myself, once I make sure I really understand.  
+
+--[[fr33domlover]]
+
+> You are right. I [[updated|http://source.ikiwiki.branchable.com/?p=source.git;a=blobdiff;f=doc/tips/Hosting_Ikiwiki_and_master_git_repository_on_different_machines.mdwn;h=6bbaf3e6e818e2e286c0cf9d357c9b03f649e146;hp=af4438bd5f6ac4f64cb443c6cfa3ba52e12da4f0;hb=54d47eb26ae41ff23932b9c0e3f15e698cb56ada;hpb=fc24df96c10b804d3022eb92caf687729921adbb]] the page to make it more precise, but feel free to continue to improve it.
+>
+> -- [[Louis|spalax]]
diff --git a/doc/tips/Hosting_Ikiwiki_and_master_git_repository_on_different_machines/separate-web-git-servers.svg b/doc/tips/Hosting_Ikiwiki_and_master_git_repository_on_different_machines/separate-web-git-servers.svg
new file mode 100644 (file)
index 0000000..b6095a2
--- /dev/null
@@ -0,0 +1,783 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="493.26132"
+   height="546.48431"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="separate-web-git-servers.svg">
+  <defs
+     id="defs4">
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend"
+       style="overflow:visible">
+      <path
+         id="path3914"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend"
+       style="overflow:visible">
+      <path
+         id="path3896"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lstart"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lstart"
+       style="overflow:visible">
+      <path
+         id="path3893"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(0.8,0,0,0.8,10,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <linearGradient
+       id="linearGradient3767">
+      <stop
+         style="stop-color:#efbc00;stop-opacity:1;"
+         offset="0"
+         id="stop3769" />
+      <stop
+         id="stop3775"
+         offset="0.93150687"
+         style="stop-color:#ffcb10;stop-opacity:1;" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3771" />
+    </linearGradient>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-4"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path3914-9"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker5456"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path5458"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-3"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path3914-6"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker5456-4"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path5458-7"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-5"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path3914-92"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker5456-3"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path5458-78"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-36"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path3914-5"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker5532"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path5534"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-9"
+       style="overflow:visible">
+      <path
+         id="path3914-62"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker3131"
+       style="overflow:visible">
+      <path
+         id="path3133"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker5532-3"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path5534-1"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker5532-1"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path5534-12"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1.0885159"
+     inkscape:cx="285.18022"
+     inkscape:cy="314.69374"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     showguides="true"
+     inkscape:guide-bbox="true"
+     inkscape:snap-global="true"
+     inkscape:window-width="1440"
+     inkscape:window-height="834"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     fit-margin-top="25"
+     fit-margin-left="25"
+     fit-margin-right="25"
+     fit-margin-bottom="25">
+    <inkscape:grid
+       type="xygrid"
+       id="grid2985"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true"
+       originx="0.24219388px"
+       originy="26px" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-159.41406,-135.03802)">
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.44862616;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect3866"
+       width="442.58115"
+       height="91.284172"
+       x="184.86992"
+       y="415.3576"
+       ry="4.005312"
+       rx="10.005878" />
+    <path
+       style="fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 355,222.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+       id="path2989"
+       inkscape:connector-curvature="0" />
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="368.57144"
+       y="251.21931"
+       id="text2995"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan2997"
+         x="368.57144"
+         y="251.21931" /></text>
+    <path
+       style="fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 355,348.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+       id="path2989-4"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 355,483.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+       id="path2989-1"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 355,623.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+       id="path2989-5"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.48800001;fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 475,623.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+       id="path2989-2"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.5;fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 235,623.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+       id="path2989-8"
+       inkscape:connector-curvature="0" />
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="386.06738"
+       y="652.36218"
+       id="text3868"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3870"
+         x="386.06738"
+         y="652.36218"
+         style="font-size:20px;text-align:center;text-anchor:middle">working clones</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:18px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="524.37988"
+       y="463.36218"
+       id="text3874"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3876"
+         x="524.37988"
+         y="463.36218"
+         style="font-size:20px;text-align:center;text-anchor:middle">repository</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="525.35156"
+       y="330.36218"
+       id="text3878"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3880"
+         x="525.35156"
+         y="330.36218"
+         style="font-size:20px;text-align:center;text-anchor:middle">srcdir</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="525.1543"
+       y="201.36218"
+       id="text3882"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3884"
+         x="525.1543"
+         y="201.36218"
+         style="font-size:20px;text-align:center;text-anchor:middle">destdir</tspan></text>
+    <g
+       id="g5440"
+       transform="translate(5,51.000003)">
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path3886"
+         d="m 370,512.36218 c -5,-24.99999 -5,-44.99999 0,-70"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:none;marker-mid:none;marker-end:url(#Arrow2Lend)" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path3888"
+         d="m 390,442.36218 c 5,25 5,45 0,70"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)" />
+    </g>
+    <g
+       transform="translate(5,-84)"
+       id="g5440-4" />
+    <g
+       transform="matrix(0.71872744,0.69529193,-0.69529193,0.71872744,353.78964,-78.94206)"
+       id="g5440-47">
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path3886-3"
+         d="m 370,512.36218 c -5,-24.99999 -0.0778,-66.9912 7.34379,-88.08431"
+         style="opacity:0.5;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:none;marker-mid:none;marker-end:url(#Arrow2Lend)" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path3888-6"
+         d="m 391.48399,424.51223 c 5,25 6.0155,63.74804 -1.48399,87.84995"
+         style="opacity:0.5;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)" />
+    </g>
+    <g
+       transform="matrix(-0.71872744,0.69529193,0.69529193,0.71872744,421.21036,-78.94206)"
+       id="g5440-47-9"
+       style="opacity:0.5">
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path3886-3-3"
+         d="m 370,512.36218 c -5,-24.99999 -0.0778,-66.9912 7.34379,-88.08431"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:none;marker-mid:none;marker-end:url(#Arrow2Lend)" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path3888-6-3"
+         d="m 391.48399,424.51223 c 5,25 6.0155,63.74804 -1.48399,87.84995"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)" />
+    </g>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker5532)"
+       d="m 380,288.36218 0,-60"
+       id="path5558"
+       inkscape:connector-curvature="0" />
+    <g
+       id="g5810"
+       transform="translate(0,17)">
+      <g
+         transform="translate(-230,-4.9999974)"
+         id="g3784-7">
+        <g
+           id="g3779-37">
+          <path
+             inkscape:connector-curvature="0"
+             id="path2993-5"
+             d="m 440,177.36218 10,0 0,-10"
+             style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+          <path
+             sodipodi:nodetypes="cccccc"
+             inkscape:connector-curvature="0"
+             id="path2991-3"
+             d="m 440,177.36218 0,40 35,0 0,-50 -25,0 z"
+             style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+          <path
+             inkscape:connector-curvature="0"
+             id="path3777-8"
+             d="m 440,177.36218 10,0 0,-10"
+             style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+        </g>
+      </g>
+      <g
+         transform="translate(-235,-9.9999974)"
+         id="g3784">
+        <g
+           id="g3779">
+          <path
+             inkscape:connector-curvature="0"
+             id="path2993"
+             d="m 440,177.36218 10,0 0,-10"
+             style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+          <path
+             sodipodi:nodetypes="cccccc"
+             inkscape:connector-curvature="0"
+             id="path2991"
+             d="m 440,177.36218 0,40 35,0 0,-50 -25,0 z"
+             style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+          <path
+             inkscape:connector-curvature="0"
+             id="path3777"
+             d="m 440,177.36218 10,0 0,-10"
+             style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+        </g>
+      </g>
+      <text
+         sodipodi:linespacing="125%"
+         id="text5762"
+         y="176.55017"
+         x="206.62401"
+         style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+         xml:space="preserve"><tspan
+           style="font-size:8px"
+           y="176.55017"
+           x="206.62401"
+           id="tspan5764"
+           sodipodi:role="line">&lt;html&gt;</tspan></text>
+    </g>
+    <g
+       id="g5824"
+       transform="translate(0,17)">
+      <g
+         transform="translate(-165,-9.9999974)"
+         id="g3784-0">
+        <g
+           id="g3779-3">
+          <path
+             inkscape:connector-curvature="0"
+             id="path2993-2"
+             d="m 440,177.36218 10,0 0,-10"
+             style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+          <path
+             sodipodi:nodetypes="cccccc"
+             inkscape:connector-curvature="0"
+             id="path2991-8"
+             d="m 440,177.36218 0,40 35,0 0,-50 -25,0 z"
+             style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+          <path
+             inkscape:connector-curvature="0"
+             id="path3777-7"
+             d="m 440,177.36218 10,0 0,-10"
+             style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+        </g>
+      </g>
+      <g
+         transform="matrix(0.74161576,0,0,0.74161576,75.250882,53.354937)"
+         id="g5772">
+        <path
+           sodipodi:type="star"
+           style="fill:#939393;fill-opacity:1;stroke:#939393;stroke-width:0.70866144;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+           id="path5768"
+           sodipodi:sides="13"
+           sodipodi:cx="295"
+           sodipodi:cy="187.36218"
+           sodipodi:r1="10.889445"
+           sodipodi:r2="14.142136"
+           sodipodi:arg1="-2.3561945"
+           sodipodi:arg2="-2.1145335"
+           inkscape:flatsided="false"
+           inkscape:rounded="0.36"
+           inkscape:randomized="0"
+           d="m 287.3,179.66218 c 1.12496,-1.12496 -0.97775,-3.57952 0.38374,-4.40257 1.36149,-0.82305 2.55772,2.1795 4.07662,1.70619 1.5189,-0.47331 0.79773,-3.62389 2.38576,-3.71995 1.58803,-0.0961 1.25188,3.11848 2.81676,3.40526 1.56487,0.28677 2.39046,-2.83808 3.84123,-2.18514 1.45078,0.65294 -0.34074,3.34306 0.91162,4.32422 1.25235,0.98116 3.43557,-1.40209 4.41673,-0.14973 0.98116,1.25236 -1.85532,2.80178 -1.20238,4.25255 0.65294,1.45078 3.69363,0.35511 3.98041,1.91998 0.28677,1.56488 -2.94485,1.61865 -3.04091,3.20668 -0.0961,1.58803 3.10552,2.03094 2.63221,3.54984 -0.47331,1.5189 -3.35976,0.0647 -4.18281,1.42619 -0.82305,1.3615 1.80598,3.24152 0.68102,4.36648 -1.12496,1.12496 -3.00498,-1.50407 -4.36648,-0.68101 -1.36149,0.82305 0.0927,3.7095 -1.42619,4.1828 -1.5189,0.47331 -1.96181,-2.72827 -3.54984,-2.63221 -1.58803,0.0961 -1.64181,3.32768 -3.20668,3.04091 -1.56488,-0.28678 -0.4692,-3.32746 -1.91998,-3.9804 -1.45077,-0.65294 -3.00019,2.18353 -4.25255,1.20237 -1.25236,-0.98116 1.13089,-3.16437 0.14973,-4.41673 -0.98116,-1.25236 -3.67128,0.53916 -4.32422,-0.91161 -0.65294,-1.45078 2.47191,-2.27636 2.18513,-3.84124 -0.28677,-1.56488 -3.50131,-1.22873 -3.40525,-2.81676 0.096,-1.58803 3.24664,-0.86686 3.71995,-2.38576 0.47331,-1.5189 -2.52925,-2.71513 -1.70619,-4.07662 0.82305,-1.36149 3.27761,0.74122 4.40257,-0.38374 z"
+           inkscape:transform-center-x="-0.68364368"
+           inkscape:transform-center-y="0.68364368"
+           transform="translate(-2,0)" />
+        <path
+           sodipodi:type="arc"
+           style="fill:#ffffff;fill-opacity:1;stroke:#939393;stroke-width:0.70866144;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+           id="path5770"
+           sodipodi:cx="295"
+           sodipodi:cy="187.36218"
+           sodipodi:rx="5"
+           sodipodi:ry="5"
+           d="m 300,187.36218 c 0,2.76143 -2.23858,5 -5,5 -2.76142,0 -5,-2.23857 -5,-5 0,-2.76142 2.23858,-5 5,-5 2.76142,0 5,2.23858 5,5 z"
+           transform="matrix(1.4,0,0,1.4,-120,-74.944873)" />
+      </g>
+    </g>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="265"
+       y="237.36218"
+       id="text5806"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan5808"
+         x="265"
+         y="237.36218"
+         style="font-size:12px">ikiwiki.cgi</tspan></text>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker5532)"
+       d="m 295,243.36218 c -33.17806,71.23519 20.40659,76.94287 53.16264,84.08132"
+       id="path5834"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;text-align:end;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="303.54837"
+       y="447.15784"
+       id="text6240"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan6242"
+         x="303.54837"
+         y="447.15784"
+         style="font-size:14px;text-align:end;writing-mode:lr-tb;text-anchor:end">post-update</tspan><tspan
+         sodipodi:role="line"
+         x="303.54837"
+         y="464.65784"
+         style="font-size:14px;text-align:end;writing-mode:lr-tb;text-anchor:end"
+         id="tspan6244">hook</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="400.70767"
+       y="387.44351"
+       id="text6246"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan6248"
+         x="400.70767"
+         y="387.44351"
+         style="font-size:14px">ikiwiki.cgi</tspan><tspan
+         sodipodi:role="line"
+         x="400.70767"
+         y="404.94351"
+         id="tspan6250"
+         style="font-size:14px">push</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="382"
+       y="342.36218"
+       id="text6252"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan6254"
+         x="382"
+         y="342.36218">.git</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="383"
+       y="618.36218"
+       id="text6252-3"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan6254-1"
+         x="383"
+         y="618.36218">.git</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;opacity:0.3;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="502"
+       y="617.36218"
+       id="text6252-3-1"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan6254-1-0"
+         x="502"
+         y="617.36218">.git</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;opacity:0.3;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="263"
+       y="618.36218"
+       id="text6252-3-6"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan6254-1-1"
+         x="263"
+         y="618.36218">.git</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="411"
+       y="482.36218"
+       id="text6252-3-0"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan6254-1-2"
+         x="411"
+         y="482.36218">.git</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;text-align:end;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="353.28357"
+       y="277.33801"
+       id="text6372"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan6374"
+         x="353.28357"
+         y="277.33801"
+         style="font-size:14px">web-side</tspan><tspan
+         sodipodi:role="line"
+         x="353.28357"
+         y="294.83801"
+         id="tspan6376"
+         style="font-size:14px">edit</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="410"
+       y="258.36218"
+       id="text6378"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan6380"
+         x="410"
+         y="258.36218"
+         style="font-size:14px">automatic</tspan><tspan
+         sodipodi:role="line"
+         x="410"
+         y="275.86218"
+         id="tspan6382"
+         style="font-size:14px">rebuild</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="406.75635"
+       y="527.15295"
+       id="text6384"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan6386"
+         x="406.75635"
+         y="527.15295"
+         style="font-size:14px">git</tspan><tspan
+         sodipodi:role="line"
+         x="406.75635"
+         y="544.65295"
+         id="tspan6388"
+         style="font-size:14px">pull</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;text-align:end;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="363.62955"
+       y="530.39691"
+       id="text6390"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan6392"
+         x="363.62955"
+         y="530.39691"
+         style="font-size:14px;text-align:end;text-anchor:end">git</tspan><tspan
+         sodipodi:role="line"
+         x="363.62955"
+         y="547.89691"
+         id="tspan6394"
+         style="font-size:14px;text-align:end;text-anchor:end">push</tspan></text>
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:1.11616147;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect3866-3"
+       width="441.9136"
+       height="210.04529"
+       x="184.97214"
+       y="160.5961"
+       ry="24.83"
+       rx="9.9907875" />
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;text-align:end;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="246.14922"
+       y="257.2352"
+       id="text6240-9"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         x="246.14922"
+         y="257.2352"
+         style="font-size:14px;text-align:end;writing-mode:lr-tb;text-anchor:end"
+         id="tspan6244-2">pingee</tspan></text>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.96974897px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker5532)"
+       d="m 381.75266,355.47259 0,66.86071"
+       id="path5558-7"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker5532)"
+       d="M 342.2494,449.19328 C 188.8295,356.40638 236.60096,296.40639 265.99879,248.63492"
+       id="path5558-1"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+  </g>
+</svg>
diff --git a/doc/tips/Ikiwiki_with_git-annex__44___the_album_and_the_underlay_plugins.mdwn b/doc/tips/Ikiwiki_with_git-annex__44___the_album_and_the_underlay_plugins.mdwn
new file mode 100644 (file)
index 0000000..a011ac0
--- /dev/null
@@ -0,0 +1,64 @@
+# Howto avoid heavy files in ikiwiki git repo
+
+Continuation of discussion at [git-annex forum](http://git-annex.branchable.com/forum/git-annex___38___ikiwiki_experiment/) turns out the git-annex tricks could be avoided.
+
+
+## Setup on remote server
+
+On the server activate album and underlay plugins in $wiki.setup file
+
+    add_plugins:
+    - album
+    - underlay
+
+Configure underlay plugin
+
+    add_underlays:
+    - /home/$user/$wiki.underlay
+
+Create underlay directory and init git annex in direct mode
+
+    mkdir ~/$wiki.underlay
+    cd ~/$wiki.underlay;git init;git annex init $srcunderlay; git annex direct
+
+Build ikiwiki for good measure
+    ikiwiki --setup $wiki.setup --rebuild
+
+## Setup on local laptop
+
+Clone to laptop and initialise annex repo
+
+    git clone ssh://$server/$wiki.git ~/$wiki
+    git clone ssh://$server/$wiki.underlay ~/$wiki.underlay
+    cd $wiki.underday;git-annex init $wrkunderlay
+    git remote add $srcunderlay ssh://$server/$wiki.underlay
+
+You now have an annex repo in the local $wiki.underlay called $wrkunderlay and one in the $wiki.underlay directory on the remote server called $srcunderlay.
+    
+## Add content locally
+
+Add content to local $wiki directory in this case create $album.mdwn files for every album you have. Then `git add;git commit` files containing at the minimum the following
+
+    [[!album ]]
+
+Create directories in the local $wiki.underlay corresponding to the album files in the local $wiki dir. Ie. create a directory named $album for every $album.mdwn file. Copy hi-res jpg files to each directory in the local $wiki.underlay and add + commit. 
+
+    git annex add .
+    git commit -m 'jpgs added'
+
+## Push to remote
+
+    cd $wrkunderlay; git-annex copy --to $srcunderlay .; git-annex sync
+    cd $wrkdir;git push
+
+That's it! Ikiwiki should update the website and treat the jpg's as if they were part of the standard file structure.
+
+How to accomplish this using the web interface is another questions. I guess the plugins have to setup and upload to underlaydir somehow.
+
+My guess is that you have to git-annex copy the $wiki.underlay files to $srcunderlay **before** running git push from the local $wiki directory. Haven't tested this yet though.
+
+
+
+
+
+
index 09e6f67424fa3c190ddf24bf37b8766fbc731a2a..f1028bc3884b58c4dffc6147cfc1f8bd3e88a91b 100644 (file)
@@ -1,3 +1,18 @@
+Using a new debian 6.0.5 system, I get the following error trying to run the script:
+
+    ~/bin/ikiwiki-wordpress-import.py "Name" email@domain log < ~/share/wordpress.2012-08-23.xml.edited | git-fast-import
+    Traceback (most recent call last):
+      File "/home/luke/bin/ikiwiki-wordpress-import.py", line 139, in <module>
+        main(*sys.argv[1:])
+      File "/home/luke/bin/ikiwiki-wordpress-import.py", line 65, in main
+        content += x.find('content:encoded').string.replace('\r\n', '\n')
+    AttributeError: 'NoneType' object has no attribute 'replace'
+    git-fast-import statistics:
+
+Any ideas on what I am doing wrong would be appreciated.
+
+-----
+
 When I attempt to use this script, I get the following error:
 warning: Not updating refs/heads/master (new tip 26b1787fca04f2f9772b6854843fe99fe06e6088 does not contain fc0ad65d14d88fd27a6cee74c7cef3176f6900ec).  I have git 1.5.6.5, any ideas?
 
diff --git a/doc/tips/JavaScript_to_add_index.html_to_file:_links/discussion.mdwn b/doc/tips/JavaScript_to_add_index.html_to_file:_links/discussion.mdwn
new file mode 100644 (file)
index 0000000..3b9f29e
--- /dev/null
@@ -0,0 +1,2 @@
+Please make this an ikiwiki feature.  By that I mean, "server side".  Cheers, thanks, --Dave
+> After I left this comment, I found that --no-usedirs suits my purposes: I can navigate my local wiki with file:/// urls...  Hope this helps someone!
diff --git a/doc/tips/Make_calendar_start_week_on_Monday/discussion.mdwn b/doc/tips/Make_calendar_start_week_on_Monday/discussion.mdwn
new file mode 100644 (file)
index 0000000..fffd587
--- /dev/null
@@ -0,0 +1 @@
+It should be pointed out that copying the templates are optional -- you only have to add **week_start_day="1"** to the calendar part of the sidebar.
diff --git a/doc/tips/Movable_Type_to_ikiwiki.mdwn b/doc/tips/Movable_Type_to_ikiwiki.mdwn
new file mode 100644 (file)
index 0000000..28fdc6a
--- /dev/null
@@ -0,0 +1,37 @@
+this script can be used to convert your existing Movable Type blog/database to a ikiwiki blog.
+
+First, go to your MT Admin panel and purge all spam comments/trackbacks. Then use this script: <http://anti.teamidiot.de/static/nei/*/Code/MovableType/mtdump_to_iki.pl>
+
+If you wrote your posts with markdown already you're pretty much ikiwiki compatible :-)
+
+    DATABASE_NAME=your_mt_database
+    DATABASE_USER=your_mysql_user
+
+    mkdir -p conv/posts
+
+    mysqldump $DATABASE_NAME -v -nt --compatible=ansi,postgresql \\
+      --complete-insert=TRUE --extended-insert=FALSE --compact   \\
+      --default-character-set=UTF8 -u $DATABASE_USER             \\
+    | perl mtdump_to_iki.pl
+
+the script will spit out one file for every post into the conv/posts directory. you can manually clean them up or however you like. next, you must set the output directory where your ikiwiki resides:
+
+    export OUT=$HOME/my_ikiwiki_blog
+
+make sure there is a 'posts' subdirectory inside (default if you start with the blog-setup script)
+
+now you can import one or all posts and comments by running the post file through zsh:
+
+    zsh ./1__my_first_post.mdwn
+
+or to do it all:
+
+    zsh
+    for import (<->__*.*) { zsh $import }
+
+the files will be created in your $OUT directory and committed onto git. now the **important** last step: run
+
+    ikiwiki --gettime --setup your.setup
+
+only with the gettime flag will ikiwiki reread the file dates as recorded in the git. Enjoy!
+
diff --git a/doc/tips/Right-to-left___40__RTL__41___page_text.mdwn b/doc/tips/Right-to-left___40__RTL__41___page_text.mdwn
new file mode 100644 (file)
index 0000000..2b176c8
--- /dev/null
@@ -0,0 +1,49 @@
+Here's a simple way to create pages in which the page body (or a part of it) goes right-to-left.
+This includes things you insert into the page, such as polls and blockquotes and
+lists and a progress bar and so on. Some things don't work perfectly, but if
+you want to have some RTL pages in your wiki, this will probably do.
+
+It does not modify the things around the body, such as the page header and the
+footer. Only what is rendered from the mdwn file is affected.
+
+# 1 Add an RTL Template
+
+Create a new template page *templates/rtl.mdwn* with the following content:
+
+    <div class="rtl">
+    <TMPL_VAR text>
+    </div>
+    <TMPL_UNLESS text>
+    Use this template to insert RTL text into a page. 
+    This template has one parameter:
+    <ul>
+    <li>`text` - the text to display in RTL
+    </ul>
+    </TMPL_UNLESS>
+
+# 2 Add an RTL class to the CSS
+
+In your *local.css* add the following:
+
+[[!format css """
+/* rtl template */
+.rtl {
+    direction: rtl;
+}
+"""]]
+
+# 3 Use the Template
+
+To make a page or part of it RTL, use the [[ikiwiki/directive/template]] directive:
+
+    \[[!template id="rtl" text="""
+    
+    This text will be aligned to the right. You can write here in Hebrew, Arabic, etc. You can
+    put here anything you want to put on the page. As said above, some elements may not
+    align perfectly, but:
+
+    1. It can be solved per case
+    2. It's not critical, everything works quite well and is readable. If you have any comments,
+        suggestions, improvements, bugs, etc - please share here :-)
+    
+    """]]
diff --git a/doc/tips/convert_MoinMoin_and_TWiki_to_ikiwiki.mdwn b/doc/tips/convert_MoinMoin_and_TWiki_to_ikiwiki.mdwn
deleted file mode 100644 (file)
index 5565dbd..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-[[JoshTriplett]] has developed scripts to convert MoinMoin and TWiki wikis
-to ikiwikis backed by a git repository, including full history. For
-details, see [[his_user_page|JoshTriplett]].
index 39ffc040483a1368bd0f4d0cb3975c25894390f4..e71e2132d48103e126710ce51df811b80d107660 100644 (file)
@@ -1,3 +1,5 @@
 Daniel Burrows
 [explains](http://algebraicthunk.net/~dburrows/blog/entry/howto-convert-your-blogger-or-blogspot-blog-to-ikiwiki/)
 how to convert your Blogger/BlogSpot blog to ikiwiki.
+
+François Marier used a [different approach](http://feeding.cloud.geek.nz/posts/moving-from-blogger-to-ikiwiki-and-branchable/) on a more recent version of Blogger.
index e60b413ddc39ba3e3d6073bb722de6d631633511..e8f6a26a1e8f6d27289e56835e2d6a97478cd5ad 100644 (file)
@@ -182,12 +182,25 @@ There is a Python script for converting from the Mediawiki format to Markdown in
 
 ## Scripts
 
+### media2iki
+
 There is a repository of tools for converting MediaWiki to Git based Markdown wiki formats (such as ikiwiki and github wikis) at <http://github.com/mithro/media2iki>. It also includes a standalone tool for converting from the Mediawiki format to Markdown. [[mithro]] doesn't frequent this page, so please report issues on the [github issue tracker](https://github.com/mithro/media2iki/issues).
 
+### mediawiki2gitikiwiki (ruby)
+
 [[Albert]] wrote a ruby script to convert from mediawiki's database to ikiwiki at <https://github.com/docunext/mediawiki2gitikiwiki>
 
+### levitation (xml to git)
+
 [[scy]] wrote a python script to convert from mediawiki XML dumps to git repositories at <https://github.com/scy/levitation>.
 
+### git-mediawiki
+
+There's now support for mediawiki as a git remote:
+
+<https://github.com/moy/Git-Mediawiki/wiki>
+
+### mediawikigitdump
 [[Anarcat]] wrote a python script to convert from a mediawiki website to ikiwiki at git://src.anarcat.ath.cx/mediawikigitdump.git/. The script doesn't need any special access or privileges and communicates with the documented API (so it's a bit slower, but allows you to mirror sites you are not managing, like parts of Wikipedia). The script can also incrementally import new changes from a running site, through RecentChanges inspection. It also supports mithro's new Mediawiki2markdown converter (which I have a copy here: git://src.anarcat.ath.cx/media2iki.git/).
 
 > Some assembly is required to get Mediawiki2markdown and its mwlib
diff --git a/doc/tips/convert_moinmoin_to_ikiwiki.mdwn b/doc/tips/convert_moinmoin_to_ikiwiki.mdwn
new file mode 100644 (file)
index 0000000..211cb4e
--- /dev/null
@@ -0,0 +1,108 @@
+This MoinMoin converter converts wikis to ikiwikis backed by a git repository, including full history. It simply parses the wiki pages into markdown using the MoinMoin engine.
+
+The converter was originally written by [[JoshTriplett]] and included support for Tikiwiki, for which it parses the wiki pages to HTML then back into markdown using the `libhtml-wikiconverter` Perl package. That original version from Josh is still available from [his wiki page](/users/JoshTriplett). 
+
+The MoinMoin side of things was completely re-written by [[anarcat]] and is currently still in development. That version is available at:
+
+    git clone git://git.koumbit.net/moin2iki.git
+
+It doesn't feature support to migrate from Tikiwiki anymore and focuses on MoinMoin support.
+
+Issues can be filed in the redmine bugtracker: <https://redmine.koumbit.net/projects/moin2iki>
+
+[[!toc levels=2]]
+
+## Usage
+
+Usage instructions are in the `README` file.
+
+## MoinMoin importer features
+
+ * supports latest MoinMoin versions (tested with 1.9.x)
+ * uses `git fast-import` to improve performance (10 minutes and 200M of ram for a 7 years old 2GB Moinmoin wiki)
+ * multistep process allows bulk edit through git before markdown conversion, or staying with a 
+ * imports attachments as subpages
+ * uses the per-page edit log
+ * consistent: multiple runs will generate the same repository
+ * re-entrant: can be run multiple times to import new changes
+
+## MoinMoin converter features
+
+ * most of the inline markup
+ * links
+ * attachment links
+ * smileys
+ * images (not well tested), into [[ikiwiki/directive/img]]
+ * preformatted and code areas, including [[ikiwiki/directive/format]]
+ * ordered, unordered and definition lists
+ * tables (although only with HTML and no styles)
+
+### Supported macros
+
+ * TableOfContents, through [[ikiwiki/directive/toc]]
+ * Navigation, through [[ikiwiki/directive/map]] (so as a nested
+   vertical list instead of an horizontal list)
+ * PageList, through [[ikiwiki/directive/map]]
+ * MonthCalendar, partially, through [[ikiwiki/directive/calendar]]
+ * FootNote, through markdown
+ * Anchor, through markdown and plain HTML
+ * `<<BR>>`, through the weird line ending thing
+ * AttachList, through a weird [[ikiwiki/directive/inline]]
+ * FullSearch, partially, only through [[ikiwiki/directive/inline]] (so no textual search)
+ * Include, partially through [[ikiwiki/directive/inline]] (so missing boundary extraction and heading level generation)
+ * PageCount, same name even :)
+ * OrphanedPages, through [[ikiwiki/directive/orphans]]
+ * Date and Datetime, should be through [[plugins/date]] instead of
+   current hack
+
+### Supported parsers
+
+ * the main "moin wiki" markup
+ * highlight parser, through the [[plugins/format]] plugin
+ * other parsers may be supported if an equivalent plugin exists in Ikiwiki (example: [[plugins/rst]])
+
+## Current blocker
+
+This script is being used to test the conversion of the venerable [Koumbit wiki](https://wiki.koumbit.net/) into Ikiwiki, and so far progress is steady but difficult. The current blocker is:
+
+ * figuring out exactly which pages should exist and which should not, as there is ambiguity in the internal datastructures of MoinMoin, which become apparent when running the conversion script, as files a missing
+
+## Todos
+
+There are also significant pieces missing:
+
+ * inline parsers and hackish styled tables
+ * turn categories into tags
+ * name converted page to the right name depending on the `#format` parameter on top of page
+ * finish a full converter run on the Koumbitwiki
+ * improve the output of the converter (too much debugging)
+
+## MoinMoin features missing from ikiwiki
+
+The importer is pretty much complete, but the converter can only go so far as what features ikiwiki supports. Here are the MoinMoin features that are known to be missing from ikiwiki. Note that some of those features are available in MoinMoin only through third-party extensions.
+
+ * [[todo/do_not_make_links_backwards/]] - MoinMoin and Creole use `\[[link|text]]`, while ikiwiki uses `\[[text|link]]` - for now the converter generates [[markdown]] links so this is not so much an issue, but will freak out users
+ * [[todo/internal_definition_list_support/]] - includes tabling the results ([MoinMoin's DictColumns macro](http://moinmo.in/MacroMarket/DictColumns))
+ * [[todo/per page ACLs]] - ([MoinMoin's ACLs](http://moinmo.in/HelpOnAccessControlLists))
+ * [MailTo](http://moinmo.in/HelpOnMacros/MailTo) macro spam protection
+ * list pages based on full text page search
+ * extract part of other pages with the inline macro
+ * specifying a template when creating a page (as opposed to matching a pagespec)
+ * specifying a style for a sub-section (MoinMoin's inline parsers
+   allow the user to specify a CSS class - very useful see
+   [the documentation](http://moinmo.in/HelpOnMoinWikiSyntax#Using_the_wiki_parser_with_css_classes)
+   to get an idea)
+ * the above also keeps the SectionParser from being properly supported
+ * regex matching all over the place: pagespec, basically, but all
+   full text search (which is missing anyways, see above)
+
+### Missing macros
+
+ * RandomPage(N) - lists N random pages, skipped
+ * Gallery() - skipped
+ * Gettext - translates the string accordign to internal translation
+   system, ignored
+ * AdvancedSearch - an elaborate search form provided by MoinMoin
+ * Goto - a simple "jump to page" macro
+
+Comments and feedback always welcome! --[[anarcat]]
diff --git a/doc/tips/convert_moinmoin_to_ikiwiki/discussion.mdwn b/doc/tips/convert_moinmoin_to_ikiwiki/discussion.mdwn
new file mode 100644 (file)
index 0000000..2939814
--- /dev/null
@@ -0,0 +1,7 @@
+I look forward to trying this.  I have a large (~10 year old) MoinMoin installation that has been migrated up to a 1.8.x version so far, and which is partially ACL'd away behind logins. — [[Jon]]
+
+> I'll make that clearer in the docs, but we do not deal with ACL (yet?), as ikiwiki doesn't support Moinmoin's level of ACL flexibility. See [[todo/per_page_ACLs]] for more information. --[[anarcat]]
+
+>> I was actually thinking the ACLs would cause a problem just for the crawler, I hadn't considered their re-implementation (but yes, that would be good!) — [[Jon]]
+
+Note that freedesktop.org are doing a moinmoin to ikiwiki conversion, see [this page](http://www.freedesktop.org/wiki/conversion/) for some documentation. <del>It's unclear which software they are using for that purpose.</del> They used the software documented here, and haven't done significant patches: they manually convert the remaining broken bits. — [[anarcat]]
index cf9c2e338a1311e83797a37d7b6f7ec96b5dd342..2547a2e9fe510bdbb8ab22a06f847d1a47aaac47 100644 (file)
@@ -3,12 +3,167 @@ making it easy to create and maintain copies and branches of a project. And
 this can be used for all sorts of interesting stuff. Since ikiwiki can use
 git, let's explore some possibilities for distributed wikis.
 
-## a wiki mirror
+[[!toc levels=2]]
 
-The simplest possibility is setting up a mirror. If a wiki exposes its git
-repository and has the [[plugins/pinger]] plugin enabled, then anyone can
-set up a mirror that will automatically be kept up-to-date with the origin
-wiki. Just clone the git repo, configure ikiwiki to use it, enable the
+## Overview
+
+There are several possible level of decentralisation:
+
+ 0. [[default setup|rcs/git]], no decentralisation
+ 1. [[a simple HTML mirror|tips/Git_repository_and_web_server_on_different_hosts/]]
+ 2. [[separate ikiwiki and git servers|tips/Hosting_Ikiwiki_and_master_git_repository_on_different_machines]]
+ 3. separate `srcdir`, still requires a central bare repo - uses [[plugins/pinger]]
+ 4. completely distinct ikiwiki installs, synchronised with [[plugins/contrib/gitpush]]
+
+Here's a graphic overview of those:
+
+### Default setup - one central server
+
+[[!img rcs/git/wiki_edit_flow.svg size=400x]]
+
+In the default setup, all the resources are stored on the central
+servers. Users can still clone and edit the git repo by hand and
+contribute by git, but otherwise all the changes happen on a single
+web interface. This basic setup is best described in [[rcs/git]].
+
+### Separate webserver and git repository
+
+[[!img tips/Git_repository_and_web_server_on_different_hosts/separate-webserver.svg size=400x]]
+
+This is the configuration described in
+[[tips/Git_repository_and_web_server_on_different_hosts]]. The webserver part
+hosts the HTML files, the ikiwiki [[cgi]] but everything else is on
+the git server.
+
+### Separate webserver and git repository, the git srcdir being hosted on the webserver
+
+[[!img Hosting_Ikiwiki_and_master_git_repository_on_different_machines/separate-web-git-servers.svg size=400x]]
+
+This is the configuration described in
+[[tips/Hosting_Ikiwiki_and_master_git_repository_on_different_machines]]. One server hosts the web server (and the [[Ikiwiki cgi|cgi]]) and the git source dir; a second server hosts the git bare repository. This can be used when you have very limited access to the git server.
+
+### Decentralised pinger setup
+
+[[!img ping-setup.svg size=400x]]
+
+In this configuration, the mirrors all have their own `srcdir`, but
+still need to push and pull from the same central bare git repo. The
+[[plugins/pinger]] plugin is used to ping the mirrors from the central
+server on edits.
+
+Step by step setup instructions for this are detailed below.
+
+### Fully decentralised setup
+
+[[!img decentralized_wikis.svg size=400x]]
+
+In this configuration, each wiki is fully independent and pushes its
+changes to other wikis using the [[plugins/contrib/gitpush]] plugin.
+
+## Step by step setup instructions
+
+The first two ways of setting up ikiwiki are better described in [[setup]] or [[tips/Git_repository_and_web_server_on_different_hosts]]. The remainder of this page describes the latter two more complex distributed setups. 
+
+Say you have a friend that has already configured a shiny ikiwiki site, and you want to help by creating a mirror. You still need to figure out how to install ikiwiki and everything, hopefully this section will help you with that.
+
+Note that parts of the following documentation duplicate instructions from [[setup]], [[setup/byhand]], [[rcs/git]] and [[tips/laptop_wiki_with_git]].
+
+### Installing ikiwiki
+
+You need to install the ikiwiki package for the mirror to work. You can use ikiwiki to publish the actual HTML pages elsewhere if you don't plan on letting people edit the wiki, but generally you want the package to be installed on the webserver for editing to work.
+
+    apt-get install ikiwiki
+
+### Setting up the wiki
+
+(!) Optionnally: create a user just for this wiki. Otherwise the wiki will run as your user from here on.
+
+We assume your username is `user` and that you will host the wiki under the hostname `mirror.example.com`. The original wiki is at `wiki.example.com`. We also assume that your friend was nice enough to provide a copy of the `.setup` file in the `setup` branch, which is the case for any wiki hosted on [branchable.com](http://branchable.com).
+
+    cd ~user
+    # setup srcdir, named source
+    git clone git://wiki.example.com/ source
+    # convenience copy of the setup file
+    git clone -b origin/setup source setup
+    cd setup
+    edit ikiwiki.setup # adapt configuration
+
+When editing ikiwiki.setup, make sure you change the following entries:
+
+    cgiurl: http://mirror.example.com/ikiwiki.cgi
+    cgi_wrapper: /var/www/ikiwiki.cgi
+    srcdir: /home/user/source
+    destdir: /var/www/mirror.example.com
+    libdir: /home/user/source/.ikiwiki
+    git_wrapper: /home/user/source/.git/hooks/post-commit
+    git_test_receive_wrapper: /home/user/source/.git/hooks/pre-receive
+    ENV:
+      TMPDIR: /home/user/tmp
+
+This assumes that your /var/www directory is writable by your user.
+
+### Basic HTML rendering
+
+You should already be able to make a plain HTML rendering of the wiki:
+
+    ikiwiki --setup ikiwiki.setup
+
+### Webserver configuration
+
+You will also need a webserver to serve the content in the `destdir`
+defined above. We assume you will configure a virtual host named `mirror.example.com`. Here are some examples on how to do those, see [[!iki setup]] and [[!iki tips/dot_cgi]] for complete documentation.
+
+Note that this will also configure CGI so that people can edit the wiki. Note that this configuration may involve timeouts if the main site is down, as ikiwiki will attempt to push to the central git repository at every change.
+
+#### Apache configuration
+
+    <VirtualHost *:80>
+        ServerName mirror.example.com:80
+        DocumentRoot /var/www/mirror.example.com
+        <Directory /var/www/mirror.example.com>
+            Options Indexes MultiViews ExecCGI
+            AllowOverride None
+            Order allow,deny
+            allow from all
+        </Directory>
+        ScriptAlias /ikiwiki.cgi /var/www/ikiwiki.cgi
+        ErrorDocument 404 "/ikiwiki.cgi"
+    </VirtualHost>
+
+#### Nginx configuration
+
+    server {
+        root /var/www/mirror.example.com/;
+        index index.html index.htm;
+        server_name mirror.example.com;
+
+        location / {
+            try_files $uri $uri/ /index.html;
+        }
+        location /ikiwiki.cgi {
+            fastcgi_pass  unix:/tmp/fcgi.socket;
+            fastcgi_index ikiwiki.cgi;
+            fastcgi_param SCRIPT_FILENAME   /var/www/ikiwiki.cgi;
+            fastcgi_param  DOCUMENT_ROOT      /var/www/mirror.example.com;
+            include /etc/nginx/fastcgi_params;
+        }
+    }
+
+Start this process as your own user (or the user that has write access
+to `srcdir`, `destdir`, etc):
+
+    spawn-fcgi -s /tmp/fcgi.socket -n -- /usr/sbin/fcgiwrap
+
+Make this writable:
+
+    chmod a+w /tmp/fcgi.socket
+
+### Enable the pinger functionality
+
+At this point, you need to enable the pinger functionality to make sure that changes on the central server propagate to your mirror.
+
+This assumes a central wiki that exposes its git
+repository and has the [[plugins/pinger]] plugin enabled. Enable the
 [[plugins/pingee]] plugin in your configuration, and edit the origin wiki,
 adding a ping directive for your mirror:
 
@@ -16,7 +171,7 @@ adding a ping directive for your mirror:
        to="http://mymirror.com/ikiwiki.cgi?do=ping"]]
 
 The "from" parameter needs to be the url to the origin wiki. The "to" parameter
-is the url to ping on your mirror.
+is the url to ping on your mirror. This can be done basically in any page.
 
 Now whenever the main wiki is edited, it will ping your mirror, which will
 pull the changes from "origin" using git, and update itself. It could, in
@@ -27,11 +182,58 @@ committing the changes back to the origin git repository, and updating the
 origin mirror. Assuming you can push to that git repository. If you can't,
 and you want a mirror, and not a branch, you should disable web edits on
 your mirror. (You could also point the cgiurl for your mirror at the origin
-wiki.)
+wiki if you do not want to incur that overhead or do not want to, or can't, run a CGI.)
+
+### Fully decentralized configuration
+
+In the above configuration, the master git repository is still on the main site. If that site goes down, there will be delays when editing the wiki mirror. It could also simply fail because it will not be able to push the changes to the master git repo. An alternative is to setup a local bare repository that is synced with the master.
+
+At the setup step, you need to create *two* git repositories on the mirror:
+
+    cd ~user
+    # setup base repository, named source.git
+    git clone --bare git://wiki.example.com/ source.git
+    # setup srcdir, named source
+    git clone source.git
+    # convenience copy of the setup file
+    git clone -b origin/setup source.git setup
+    cd setup
+    edit ikiwiki.setup # adapt configuration
+
+The following entries will be different from the above setup file:
+
+    git_wrapper: /home/user/source.git/hooks/post-commit
+    git_test_receive_wrapper: /home/user/source.git/hooks/pre-receive
+
+To do this, the mirror needs to push back to the master, using the [[plugins/contrib/gitpush]] plugin:
+
+    git_push_to:
+    - git://wiki.example.com/
+
+This will ensure that commits done on the mirror will propagate back to the master.
+
+## Other ideas
+
+See also:
+
+ * [[setup]]
+ * [[setup/byhand]]
+ * [[rcs/git]]
+ * [[tips/laptop_wiki_with_git]]
+ * [ikiwiki creation notes](http://piny.be/jrayhawk/notes/ikiwiki_creation/)
+
+### Announcing the mirror
+
+Once your mirror works, you can also add it to the list of mirrors. You can ask the mirror where you take it from (and why not, all mirrors) to add it to their setup file. As an example, here's the configuration for the first mirror:
+
+    mirrorlist:
+      example: https://wiki.example.com/
+
+The [[plugins/mirrorlist]] plugin of course needs to be enabled for this to work.
 
-## branching a wiki
+### branching a wiki
 
-It follows that setting up a branch of a wiki is just like a mirror, except
+It follows that setting up a branch of a wiki is just like the fully decentralised mirror above, except
 we don't want it to push changes back to the origin. The easy way to
 accomplish this is to clone the origin git repository using a readonly
 protocol (ie, "git://"). Then you can't push to it.
diff --git a/doc/tips/distributed_wikis/decentralized_wikis.svg b/doc/tips/distributed_wikis/decentralized_wikis.svg
new file mode 100644 (file)
index 0000000..f74e070
--- /dev/null
@@ -0,0 +1,1511 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="968.55975"
+   height="542.18921"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="decentralized_wikis.svg">
+  <defs
+     id="defs4">
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend"
+       style="overflow:visible">
+      <path
+         id="path3914"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend"
+       style="overflow:visible">
+      <path
+         id="path3896"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lstart"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lstart"
+       style="overflow:visible">
+      <path
+         id="path3893"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(0.8,0,0,0.8,10,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <linearGradient
+       id="linearGradient3767">
+      <stop
+         style="stop-color:#efbc00;stop-opacity:1;"
+         offset="0"
+         id="stop3769" />
+      <stop
+         id="stop3775"
+         offset="0.93150687"
+         style="stop-color:#ffcb10;stop-opacity:1;" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3771" />
+    </linearGradient>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-4"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path3914-9"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker5456"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path5458"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-3"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path3914-6"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker5456-4"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path5458-7"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-5"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path3914-92"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker5456-3"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path5458-78"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-36"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path3914-5"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker5532"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path5534"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker5532-8"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path5534-3"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker6579"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path6581"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-1"
+       style="overflow:visible">
+      <path
+         id="path3914-7"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker6585"
+       style="overflow:visible">
+      <path
+         id="path6587"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-0"
+       style="overflow:visible">
+      <path
+         id="path3914-8"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker6789"
+       style="overflow:visible">
+      <path
+         id="path6791"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-32"
+       style="overflow:visible">
+      <path
+         id="path3914-3"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-9"
+       style="overflow:visible">
+      <path
+         id="path3914-0"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker6894"
+       style="overflow:visible">
+      <path
+         id="path6896"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker6898"
+       style="overflow:visible">
+      <path
+         id="path6900"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker6902"
+       style="overflow:visible">
+      <path
+         id="path6904"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker6906"
+       style="overflow:visible">
+      <path
+         id="path6908"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker6910"
+       style="overflow:visible">
+      <path
+         id="path6912"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker5532-4"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path5534-8"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker7058"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path7060"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-6"
+       style="overflow:visible">
+      <path
+         id="path3914-2"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker7064"
+       style="overflow:visible">
+      <path
+         id="path7066"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker7068"
+       style="overflow:visible">
+      <path
+         id="path7070"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker7072"
+       style="overflow:visible">
+      <path
+         id="path7074"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker7076"
+       style="overflow:visible">
+      <path
+         id="path7078"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker7080"
+       style="overflow:visible">
+      <path
+         id="path7082"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker7084"
+       style="overflow:visible">
+      <path
+         id="path7086"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker7088"
+       style="overflow:visible">
+      <path
+         id="path7090"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1.0885159"
+     inkscape:cx="498.08291"
+     inkscape:cy="303.66958"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     showguides="true"
+     inkscape:guide-bbox="true"
+     inkscape:snap-global="true"
+     inkscape:window-width="1438"
+     inkscape:window-height="872"
+     inkscape:window-x="0"
+     inkscape:window-y="26"
+     inkscape:window-maximized="1"
+     fit-margin-top="25"
+     fit-margin-left="25"
+     fit-margin-right="25"
+     fit-margin-bottom="25">
+    <inkscape:grid
+       type="xygrid"
+       id="grid2985"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true"
+       originx="0.010643508px"
+       originy="26.00002px" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-159.64561,-139.33311)">
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.70866144;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect3866"
+       width="411.08591"
+       height="341.82434"
+       x="184.99994"
+       y="164.68744"
+       ry="10"
+       rx="10" />
+    <path
+       style="fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 355,222.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+       id="path2989"
+       inkscape:connector-curvature="0" />
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="368.57144"
+       y="251.21931"
+       id="text2995"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan2997"
+         x="368.57144"
+         y="251.21931" /></text>
+    <path
+       style="fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 355,348.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+       id="path2989-4"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 355,483.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+       id="path2989-1"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 355,623.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+       id="path2989-5"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.48800001;fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 475,623.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+       id="path2989-2"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.5;fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 235,623.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+       id="path2989-8"
+       inkscape:connector-curvature="0" />
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="386.06738"
+       y="652.36218"
+       id="text3868"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3870"
+         x="386.06738"
+         y="652.36218"
+         style="font-size:20px;text-align:center;text-anchor:middle">working clones</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:18px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="524.37988"
+       y="463.36218"
+       id="text3874"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3876"
+         x="524.37988"
+         y="463.36218"
+         style="font-size:20px;text-align:center;text-anchor:middle">repository</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="525.35156"
+       y="330.36218"
+       id="text3878"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3880"
+         x="525.35156"
+         y="330.36218"
+         style="font-size:20px;text-align:center;text-anchor:middle">srcdir</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="525.1543"
+       y="201.36218"
+       id="text3882"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3884"
+         x="525.1543"
+         y="201.36218"
+         style="font-size:20px;text-align:center;text-anchor:middle">destdir</tspan></text>
+    <g
+       id="g5440"
+       transform="translate(5,51.000003)">
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path3886"
+         d="m 370,512.36218 c -5,-24.99999 -5,-44.99999 0,-70"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:none;marker-mid:none;marker-end:url(#Arrow2Lend)" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path3888"
+         d="m 390,442.36218 c 5,25 5,45 0,70"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)" />
+    </g>
+    <g
+       transform="translate(5,-84)"
+       id="g5440-4">
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path3886-8"
+         d="m 370,512.36218 c -5,-24.99999 -5,-44.99999 0,-70"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:none;marker-mid:none;marker-end:url(#Arrow2Lend)" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path3888-9"
+         d="m 390,442.36218 c 5,25 5,45 0,70"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)" />
+    </g>
+    <g
+       transform="matrix(0.71872744,0.69529193,-0.69529193,0.71872744,353.78964,-78.94206)"
+       id="g5440-47">
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path3886-3"
+         d="m 370,512.36218 c -5,-24.99999 -0.0778,-66.9912 7.34379,-88.08431"
+         style="opacity:0.5;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:none;marker-mid:none;marker-end:url(#Arrow2Lend)" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path3888-6"
+         d="m 391.48399,424.51223 c 5,25 6.0155,63.74804 -1.48399,87.84995"
+         style="opacity:0.5;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)" />
+    </g>
+    <g
+       transform="matrix(-0.71872744,0.69529193,0.69529193,0.71872744,421.21036,-78.94206)"
+       id="g5440-47-9"
+       style="opacity:0.5">
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path3886-3-3"
+         d="m 370,512.36218 c -5,-24.99999 -0.0778,-66.9912 7.34379,-88.08431"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:none;marker-mid:none;marker-end:url(#Arrow2Lend)" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path3888-6-3"
+         d="m 391.48399,424.51223 c 5,25 6.0155,63.74804 -1.48399,87.84995"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)" />
+    </g>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker5532)"
+       d="m 380,288.36218 0,-60"
+       id="path5558"
+       inkscape:connector-curvature="0" />
+    <g
+       id="g5810"
+       transform="translate(0,17)">
+      <g
+         transform="translate(-230,-4.9999974)"
+         id="g3784-7">
+        <g
+           id="g3779-37">
+          <path
+             inkscape:connector-curvature="0"
+             id="path2993-5"
+             d="m 440,177.36218 10,0 0,-10"
+             style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+          <path
+             sodipodi:nodetypes="cccccc"
+             inkscape:connector-curvature="0"
+             id="path2991-3"
+             d="m 440,177.36218 0,40 35,0 0,-50 -25,0 z"
+             style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+          <path
+             inkscape:connector-curvature="0"
+             id="path3777-8"
+             d="m 440,177.36218 10,0 0,-10"
+             style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+        </g>
+      </g>
+      <g
+         transform="translate(-235,-9.9999974)"
+         id="g3784">
+        <g
+           id="g3779">
+          <path
+             inkscape:connector-curvature="0"
+             id="path2993"
+             d="m 440,177.36218 10,0 0,-10"
+             style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+          <path
+             sodipodi:nodetypes="cccccc"
+             inkscape:connector-curvature="0"
+             id="path2991"
+             d="m 440,177.36218 0,40 35,0 0,-50 -25,0 z"
+             style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+          <path
+             inkscape:connector-curvature="0"
+             id="path3777"
+             d="m 440,177.36218 10,0 0,-10"
+             style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+        </g>
+      </g>
+      <text
+         sodipodi:linespacing="125%"
+         id="text5762"
+         y="176.55017"
+         x="206.62401"
+         style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+         xml:space="preserve"><tspan
+           style="font-size:8px"
+           y="176.55017"
+           x="206.62401"
+           id="tspan5764"
+           sodipodi:role="line">&lt;html&gt;</tspan></text>
+    </g>
+    <g
+       id="g5824"
+       transform="translate(0,17)">
+      <g
+         transform="translate(-165,-9.9999974)"
+         id="g3784-0">
+        <g
+           id="g3779-3">
+          <path
+             inkscape:connector-curvature="0"
+             id="path2993-2"
+             d="m 440,177.36218 10,0 0,-10"
+             style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+          <path
+             sodipodi:nodetypes="cccccc"
+             inkscape:connector-curvature="0"
+             id="path2991-8"
+             d="m 440,177.36218 0,40 35,0 0,-50 -25,0 z"
+             style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+          <path
+             inkscape:connector-curvature="0"
+             id="path3777-7"
+             d="m 440,177.36218 10,0 0,-10"
+             style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+        </g>
+      </g>
+      <g
+         transform="matrix(0.74161576,0,0,0.74161576,75.250882,53.354937)"
+         id="g5772">
+        <path
+           sodipodi:type="star"
+           style="fill:#939393;fill-opacity:1;stroke:#939393;stroke-width:0.70866144;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+           id="path5768"
+           sodipodi:sides="13"
+           sodipodi:cx="295"
+           sodipodi:cy="187.36218"
+           sodipodi:r1="10.889445"
+           sodipodi:r2="14.142136"
+           sodipodi:arg1="-2.3561945"
+           sodipodi:arg2="-2.1145335"
+           inkscape:flatsided="false"
+           inkscape:rounded="0.36"
+           inkscape:randomized="0"
+           d="m 287.3,179.66218 c 1.12496,-1.12496 -0.97775,-3.57952 0.38374,-4.40257 1.36149,-0.82305 2.55772,2.1795 4.07662,1.70619 1.5189,-0.47331 0.79773,-3.62389 2.38576,-3.71995 1.58803,-0.0961 1.25188,3.11848 2.81676,3.40526 1.56487,0.28677 2.39046,-2.83808 3.84123,-2.18514 1.45078,0.65294 -0.34074,3.34306 0.91162,4.32422 1.25235,0.98116 3.43557,-1.40209 4.41673,-0.14973 0.98116,1.25236 -1.85532,2.80178 -1.20238,4.25255 0.65294,1.45078 3.69363,0.35511 3.98041,1.91998 0.28677,1.56488 -2.94485,1.61865 -3.04091,3.20668 -0.0961,1.58803 3.10552,2.03094 2.63221,3.54984 -0.47331,1.5189 -3.35976,0.0647 -4.18281,1.42619 -0.82305,1.3615 1.80598,3.24152 0.68102,4.36648 -1.12496,1.12496 -3.00498,-1.50407 -4.36648,-0.68101 -1.36149,0.82305 0.0927,3.7095 -1.42619,4.1828 -1.5189,0.47331 -1.96181,-2.72827 -3.54984,-2.63221 -1.58803,0.0961 -1.64181,3.32768 -3.20668,3.04091 -1.56488,-0.28678 -0.4692,-3.32746 -1.91998,-3.9804 -1.45077,-0.65294 -3.00019,2.18353 -4.25255,1.20237 -1.25236,-0.98116 1.13089,-3.16437 0.14973,-4.41673 -0.98116,-1.25236 -3.67128,0.53916 -4.32422,-0.91161 -0.65294,-1.45078 2.47191,-2.27636 2.18513,-3.84124 -0.28677,-1.56488 -3.50131,-1.22873 -3.40525,-2.81676 0.096,-1.58803 3.24664,-0.86686 3.71995,-2.38576 0.47331,-1.5189 -2.52925,-2.71513 -1.70619,-4.07662 0.82305,-1.36149 3.27761,0.74122 4.40257,-0.38374 z"
+           inkscape:transform-center-x="-0.68364368"
+           inkscape:transform-center-y="0.68364368"
+           transform="translate(-2,0)" />
+        <path
+           sodipodi:type="arc"
+           style="fill:#ffffff;fill-opacity:1;stroke:#939393;stroke-width:0.70866144;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+           id="path5770"
+           sodipodi:cx="295"
+           sodipodi:cy="187.36218"
+           sodipodi:rx="5"
+           sodipodi:ry="5"
+           d="m 300,187.36218 c 0,2.76143 -2.23858,5 -5,5 -2.76142,0 -5,-2.23857 -5,-5 0,-2.76142 2.23858,-5 5,-5 2.76142,0 5,2.23858 5,5 z"
+           transform="matrix(1.4,0,0,1.4,-120,-74.944873)" />
+      </g>
+    </g>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="265"
+       y="237.36218"
+       id="text5806"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan5808"
+         x="265"
+         y="237.36218"
+         style="font-size:12px">ikiwiki.cgi</tspan></text>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker5532)"
+       d="m 295,243.36218 c 10,40 25,65 55,85"
+       id="path5834"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;text-align:end;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="351.31982"
+       y="388.36218"
+       id="text6240"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan6242"
+         x="351.31982"
+         y="388.36218"
+         style="font-size:14px;text-align:end;writing-mode:lr-tb;text-anchor:end">post-update</tspan><tspan
+         sodipodi:role="line"
+         x="351.31982"
+         y="405.86218"
+         style="font-size:14px;text-align:end;writing-mode:lr-tb;text-anchor:end"
+         id="tspan6244">hook</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="420"
+       y="388.36218"
+       id="text6246"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan6248"
+         x="420"
+         y="388.36218"
+         style="font-size:14px">ikiwiki.cgi</tspan><tspan
+         sodipodi:role="line"
+         x="420"
+         y="405.86218"
+         id="tspan6250"
+         style="font-size:14px">push</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="382"
+       y="342.36218"
+       id="text6252"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan6254"
+         x="382"
+         y="342.36218">.git</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="383"
+       y="618.36218"
+       id="text6252-3"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan6254-1"
+         x="383"
+         y="618.36218">.git</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;opacity:0.3;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="502"
+       y="617.36218"
+       id="text6252-3-1"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan6254-1-0"
+         x="502"
+         y="617.36218">.git</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;opacity:0.3;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="263"
+       y="618.36218"
+       id="text6252-3-6"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan6254-1-1"
+         x="263"
+         y="618.36218">.git</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="411"
+       y="482.36218"
+       id="text6252-3-0"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan6254-1-2"
+         x="411"
+         y="482.36218">.git</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;text-align:end;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="300"
+       y="288.36218"
+       id="text6372"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan6374"
+         x="300"
+         y="288.36218"
+         style="font-size:14px">web-side</tspan><tspan
+         sodipodi:role="line"
+         x="300"
+         y="305.86218"
+         id="tspan6376"
+         style="font-size:14px">edit</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="410"
+       y="258.36218"
+       id="text6378"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan6380"
+         x="410"
+         y="258.36218"
+         style="font-size:14px">automatic</tspan><tspan
+         sodipodi:role="line"
+         x="410"
+         y="275.86218"
+         id="tspan6382"
+         style="font-size:14px">rebuild</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="406.75635"
+       y="527.15295"
+       id="text6384"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan6386"
+         x="406.75635"
+         y="527.15295"
+         style="font-size:14px">git</tspan><tspan
+         sodipodi:role="line"
+         x="406.75635"
+         y="544.65295"
+         id="tspan6388"
+         style="font-size:14px">pull</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;text-align:end;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="363.62955"
+       y="530.39691"
+       id="text6390"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan6392"
+         x="363.62955"
+         y="530.39691"
+         style="font-size:14px;text-align:end;text-anchor:end">git</tspan><tspan
+         sodipodi:role="line"
+         x="363.62955"
+         y="547.89691"
+         id="tspan6394"
+         style="font-size:14px;text-align:end;text-anchor:end">push</tspan></text>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
+       d="m 425.06527,430.06284 c 66.34069,-8.67473 323.36066,-8.67473 411.74972,0"
+       id="path3888-8"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
+       d="m 835.77173,439.46333 c -66.34069,8.67473 -323.36066,8.67473 -411.74972,0"
+       id="path3888-8-0"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;text-align:end;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="663.99207"
+       y="464.14218"
+       id="text6390-6"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         x="663.99207"
+         y="464.14218"
+         id="tspan6394-8"
+         style="font-size:14px;text-align:end;text-anchor:end">gitpush</tspan><tspan
+         sodipodi:role="line"
+         x="663.99207"
+         y="481.64218"
+         style="font-size:14px;text-align:end;text-anchor:end"
+         id="tspan6880">plugin</tspan></text>
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.70866144;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect3866-6"
+       width="416.59802"
+       height="341.82434"
+       x="686.25299"
+       y="164.68744"
+       ry="10"
+       rx="10" />
+    <path
+       style="fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 856.25304,222.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+       id="path2989-47"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 856.25304,348.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+       id="path2989-4-7"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 856.25304,483.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+       id="path2989-1-0"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 856.25304,623.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+       id="path2989-5-7"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.48800001;fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 976.25304,623.36218 54.99996,0 0,-45 -25,0 -5,-5 -19.99996,0 -5,5 z"
+       id="path2989-2-2"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.5;fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 736.25304,623.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+       id="path2989-8-2"
+       inkscape:connector-curvature="0" />
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="887.32037"
+       y="652.36218"
+       id="text3868-9"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3870-2"
+         x="887.32037"
+         y="652.36218"
+         style="font-size:20px;text-align:center;text-anchor:middle">working clones</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:18px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="1025.6329"
+       y="463.36218"
+       id="text3874-5"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3876-5"
+         x="1025.6329"
+         y="463.36218"
+         style="font-size:20px;text-align:center;text-anchor:middle">repository</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="1026.6046"
+       y="330.36215"
+       id="text3878-5"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3880-9"
+         x="1026.6046"
+         y="330.36215"
+         style="font-size:20px;text-align:center;text-anchor:middle">srcdir</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="1026.4073"
+       y="201.3622"
+       id="text3882-0"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3884-9"
+         x="1026.4073"
+         y="201.3622"
+         style="font-size:20px;text-align:center;text-anchor:middle">destdir</tspan></text>
+    <g
+       id="g5440-8"
+       transform="translate(506.25304,50.999998)">
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path3886-6"
+         d="m 370,512.36218 c -5,-24.99999 -5,-44.99999 0,-70"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:none;marker-mid:none;marker-end:url(#Arrow2Lend)" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path3888-7"
+         d="m 390,442.36218 c 5,25 5,45 0,70"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)" />
+    </g>
+    <g
+       transform="translate(506.25304,-84.000002)"
+       id="g5440-4-1">
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path3886-8-6"
+         d="m 370,512.36218 c -5,-24.99999 -5,-44.99999 0,-70"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:none;marker-mid:none;marker-end:url(#Arrow2Lend)" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path3888-9-8"
+         d="m 390,442.36218 c 5,25 5,45 0,70"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)" />
+    </g>
+    <g
+       transform="matrix(0.71872744,0.69529193,-0.69529193,0.71872744,855.04268,-78.942062)"
+       id="g5440-47-1">
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path3886-3-9"
+         d="m 370,512.36218 c -5,-24.99999 -0.0778,-66.9912 7.34379,-88.08431"
+         style="opacity:0.5;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:none;marker-mid:none;marker-end:url(#Arrow2Lend)" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path3888-6-7"
+         d="m 391.48399,424.51223 c 5,25 6.0155,63.74804 -1.48399,87.84995"
+         style="opacity:0.5;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)" />
+    </g>
+    <g
+       transform="matrix(-0.71872744,0.69529193,0.69529193,0.71872744,922.4634,-78.942062)"
+       id="g5440-47-9-2"
+       style="opacity:0.5">
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path3886-3-3-3"
+         d="m 370,512.36218 c -5,-24.99999 -0.0778,-66.9912 7.34379,-88.08431"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:none;marker-mid:none;marker-end:url(#Arrow2Lend)" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path3888-6-3-3"
+         d="m 391.48399,424.51223 c 5,25 6.0155,63.74804 -1.48399,87.84995"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)" />
+    </g>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker5532)"
+       d="m 881.25304,288.36218 0,-60"
+       id="path5558-2"
+       inkscape:connector-curvature="0" />
+    <g
+       id="g5810-2"
+       transform="translate(501.25304,16.999998)">
+      <g
+         transform="translate(-230,-4.9999974)"
+         id="g3784-7-6">
+        <g
+           id="g3779-37-1">
+          <path
+             inkscape:connector-curvature="0"
+             id="path2993-5-6"
+             d="m 440,177.36218 10,0 0,-10"
+             style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+          <path
+             sodipodi:nodetypes="cccccc"
+             inkscape:connector-curvature="0"
+             id="path2991-3-5"
+             d="m 440,177.36218 0,40 35,0 0,-50 -25,0 z"
+             style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+          <path
+             inkscape:connector-curvature="0"
+             id="path3777-8-0"
+             d="m 440,177.36218 10,0 0,-10"
+             style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+        </g>
+      </g>
+      <g
+         transform="translate(-235,-9.9999974)"
+         id="g3784-9">
+        <g
+           id="g3779-2">
+          <path
+             inkscape:connector-curvature="0"
+             id="path2993-3"
+             d="m 440,177.36218 10,0 0,-10"
+             style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+          <path
+             sodipodi:nodetypes="cccccc"
+             inkscape:connector-curvature="0"
+             id="path2991-34"
+             d="m 440,177.36218 0,40 35,0 0,-50 -25,0 z"
+             style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+          <path
+             inkscape:connector-curvature="0"
+             id="path3777-78"
+             d="m 440,177.36218 10,0 0,-10"
+             style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+        </g>
+      </g>
+      <text
+         sodipodi:linespacing="125%"
+         id="text5762-1"
+         y="176.55017"
+         x="206.62401"
+         style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+         xml:space="preserve"><tspan
+           style="font-size:8px"
+           y="176.55017"
+           x="206.62401"
+           id="tspan5764-2"
+           sodipodi:role="line">&lt;html&gt;</tspan></text>
+    </g>
+    <g
+       id="g5824-9"
+       transform="translate(501.25304,16.999998)">
+      <g
+         transform="translate(-165,-9.9999974)"
+         id="g3784-0-3">
+        <g
+           id="g3779-3-3">
+          <path
+             inkscape:connector-curvature="0"
+             id="path2993-2-9"
+             d="m 440,177.36218 10,0 0,-10"
+             style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+          <path
+             sodipodi:nodetypes="cccccc"
+             inkscape:connector-curvature="0"
+             id="path2991-8-0"
+             d="m 440,177.36218 0,40 35,0 0,-50 -25,0 z"
+             style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+          <path
+             inkscape:connector-curvature="0"
+             id="path3777-7-3"
+             d="m 440,177.36218 10,0 0,-10"
+             style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+        </g>
+      </g>
+      <g
+         transform="matrix(0.74161576,0,0,0.74161576,75.250882,53.354937)"
+         id="g5772-3">
+        <path
+           sodipodi:type="star"
+           style="fill:#939393;fill-opacity:1;stroke:#939393;stroke-width:0.70866144;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+           id="path5768-6"
+           sodipodi:sides="13"
+           sodipodi:cx="295"
+           sodipodi:cy="187.36218"
+           sodipodi:r1="10.889445"
+           sodipodi:r2="14.142136"
+           sodipodi:arg1="-2.3561945"
+           sodipodi:arg2="-2.1145335"
+           inkscape:flatsided="false"
+           inkscape:rounded="0.36"
+           inkscape:randomized="0"
+           d="m 287.3,179.66218 c 1.12496,-1.12496 -0.97775,-3.57952 0.38374,-4.40257 1.36149,-0.82305 2.55772,2.1795 4.07662,1.70619 1.5189,-0.47331 0.79773,-3.62389 2.38576,-3.71995 1.58803,-0.0961 1.25188,3.11848 2.81676,3.40526 1.56487,0.28677 2.39046,-2.83808 3.84123,-2.18514 1.45078,0.65294 -0.34074,3.34306 0.91162,4.32422 1.25235,0.98116 3.43557,-1.40209 4.41673,-0.14973 0.98116,1.25236 -1.85532,2.80178 -1.20238,4.25255 0.65294,1.45078 3.69363,0.35511 3.98041,1.91998 0.28677,1.56488 -2.94485,1.61865 -3.04091,3.20668 -0.0961,1.58803 3.10552,2.03094 2.63221,3.54984 -0.47331,1.5189 -3.35976,0.0647 -4.18281,1.42619 -0.82305,1.3615 1.80598,3.24152 0.68102,4.36648 -1.12496,1.12496 -3.00498,-1.50407 -4.36648,-0.68101 -1.36149,0.82305 0.0927,3.7095 -1.42619,4.1828 -1.5189,0.47331 -1.96181,-2.72827 -3.54984,-2.63221 -1.58803,0.0961 -1.64181,3.32768 -3.20668,3.04091 -1.56488,-0.28678 -0.4692,-3.32746 -1.91998,-3.9804 -1.45077,-0.65294 -3.00019,2.18353 -4.25255,1.20237 -1.25236,-0.98116 1.13089,-3.16437 0.14973,-4.41673 -0.98116,-1.25236 -3.67128,0.53916 -4.32422,-0.91161 -0.65294,-1.45078 2.47191,-2.27636 2.18513,-3.84124 -0.28677,-1.56488 -3.50131,-1.22873 -3.40525,-2.81676 0.096,-1.58803 3.24664,-0.86686 3.71995,-2.38576 0.47331,-1.5189 -2.52925,-2.71513 -1.70619,-4.07662 0.82305,-1.36149 3.27761,0.74122 4.40257,-0.38374 z"
+           inkscape:transform-center-x="-0.68364368"
+           inkscape:transform-center-y="0.68364368"
+           transform="translate(-2,0)" />
+        <path
+           sodipodi:type="arc"
+           style="fill:#ffffff;fill-opacity:1;stroke:#939393;stroke-width:0.70866144;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+           id="path5770-1"
+           sodipodi:cx="295"
+           sodipodi:cy="187.36218"
+           sodipodi:rx="5"
+           sodipodi:ry="5"
+           d="m 300,187.36218 c 0,2.76143 -2.23858,5 -5,5 -2.76142,0 -5,-2.23857 -5,-5 0,-2.76142 2.23858,-5 5,-5 2.76142,0 5,2.23858 5,5 z"
+           transform="matrix(1.4,0,0,1.4,-120,-74.944873)" />
+      </g>
+    </g>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="766.25305"
+       y="237.3622"
+       id="text5806-4"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan5808-5"
+         x="766.25305"
+         y="237.3622"
+         style="font-size:12px">ikiwiki.cgi</tspan></text>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker5532)"
+       d="m 796.25304,243.36218 c 10,40 25,65 55,85"
+       id="path5834-1"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;text-align:end;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="852.57281"
+       y="388.36215"
+       id="text6240-9"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan6242-1"
+         x="852.57281"
+         y="388.36215"
+         style="font-size:14px;text-align:end;writing-mode:lr-tb;text-anchor:end">post-update</tspan><tspan
+         sodipodi:role="line"
+         x="852.57281"
+         y="405.86215"
+         style="font-size:14px;text-align:end;writing-mode:lr-tb;text-anchor:end"
+         id="tspan6244-4">hook</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="921.25305"
+       y="388.36215"
+       id="text6246-3"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan6248-5"
+         x="921.25305"
+         y="388.36215"
+         style="font-size:14px">ikiwiki.cgi</tspan><tspan
+         sodipodi:role="line"
+         x="921.25305"
+         y="405.86215"
+         id="tspan6250-2"
+         style="font-size:14px">push</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="883.25299"
+       y="342.36215"
+       id="text6252-4"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan6254-3"
+         x="883.25299"
+         y="342.36215">.git</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="884.25299"
+       y="618.36218"
+       id="text6252-3-8"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan6254-1-7"
+         x="884.25299"
+         y="618.36218">.git</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;opacity:0.3;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="1003.2531"
+       y="617.36218"
+       id="text6252-3-1-2"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan6254-1-0-2"
+         x="1003.2531"
+         y="617.36218">.git</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;opacity:0.3;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="764.25305"
+       y="618.36218"
+       id="text6252-3-6-0"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan6254-1-1-7"
+         x="764.25305"
+         y="618.36218">.git</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="912.25305"
+       y="482.36218"
+       id="text6252-3-0-6"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan6254-1-2-7"
+         x="912.25305"
+         y="482.36218">.git</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;text-align:end;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="801.25305"
+       y="288.36218"
+       id="text6372-8"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan6374-9"
+         x="801.25305"
+         y="288.36218"
+         style="font-size:14px">web-side</tspan><tspan
+         sodipodi:role="line"
+         x="801.25305"
+         y="305.86218"
+         id="tspan6376-1"
+         style="font-size:14px">edit</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="911.25305"
+       y="258.36218"
+       id="text6378-7"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan6380-3"
+         x="911.25305"
+         y="258.36218"
+         style="font-size:14px">automatic</tspan><tspan
+         sodipodi:role="line"
+         x="911.25305"
+         y="275.86218"
+         id="tspan6382-5"
+         style="font-size:14px">rebuild</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="908.0094"
+       y="527.15295"
+       id="text6384-9"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan6386-3"
+         x="908.0094"
+         y="527.15295"
+         style="font-size:14px">git</tspan><tspan
+         sodipodi:role="line"
+         x="908.0094"
+         y="544.65295"
+         id="tspan6388-0"
+         style="font-size:14px">pull</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;text-align:end;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="864.88257"
+       y="530.39691"
+       id="text6390-2"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan6392-1"
+         x="864.88257"
+         y="530.39691"
+         style="font-size:14px;text-align:end;text-anchor:end">git</tspan><tspan
+         sodipodi:role="line"
+         x="864.88257"
+         y="547.89691"
+         id="tspan6394-1"
+         style="font-size:14px;text-align:end;text-anchor:end">push</tspan></text>
+  </g>
+</svg>
index 994c493f911c90d3257537ad862a8a9d3d61e90d..101f64d51a2af96c9935f67b5347f433a1e093a5 100644 (file)
@@ -5,3 +5,18 @@ Would it work if the mirrored wiki was configured with cgiurl set to the cgiurl
 > leave the user on a page on the origin wiki when they save the edit.)
 > I've put a mention of this option in the page.
 > --[[Joey]]
+
+---
+
+### Separate ikiwiki web server, and git server
+
+> I don't understand how this configuration is different from the previous one, could you clarify? the image link is broken as well. [[anarcat]]
+>
+>> Sorry. I did a mistake. I hope this is more clear now. [[Louis|spalax]]
+>>
+>>> I still don't understand the difference, and I can't reach the URL you have given above. Previously, to upload stuff I created a clone of the git repository and asked joeyh to pull, like [[this|todo/improve_decentralised_wikis_documentation_and_graphics/]]. --[[anarcat]]
+>>>
+>>>> Upload: I have set up a [[clone|https://github.com/paternal/ikiwiki]] on github and asking joeyh to pull: [[branch|https://github.com/paternal/ikiwiki/tree/paternal/upload-svg]], [[pull request|todo/upload__95__figure]], [[figure|https://github.com/paternal/ikiwiki/blob/paternal/upload-svg/doc/tips/Hosting_Ikiwiki_and_master_git_repository_on_different_machines/separate-web-git-servers.svg]]
+>>>>
+>>>> Difference between *Separate webserver and git repository* and *Separate ikiwiki web server, and git server* : the only difference is that in the first case, the git srcdir is on the same server as the git main repository, whereas in the second case, it is present on the same server as the web server. One use case is when one as a very limited access to the server hosting the git repository, and cannot setup the git srcdir (because of, for instance, a (reasonably?) paranoid sysadmins would require the creation of a new user to own the git srcdir). Using this configuration, it is possible to have an Ikiwiki instance where the main public repository is hosted on [[github|http://github.com]] (excepted that the wiki won't automatically rebuild when pushing a repo to github, since the [[github webhook|https://help.github.com/articles/creating-webhooks]] does not seem to allow conditional).
diff --git a/doc/tips/distributed_wikis/ping-setup.svg b/doc/tips/distributed_wikis/ping-setup.svg
new file mode 100644 (file)
index 0000000..2d971c4
--- /dev/null
@@ -0,0 +1,1064 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="1013.625"
+   height="547.8844"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="ping-setup.svg">
+  <defs
+     id="defs4">
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend"
+       style="overflow:visible">
+      <path
+         id="path3914"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend"
+       style="overflow:visible">
+      <path
+         id="path3896"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lstart"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lstart"
+       style="overflow:visible">
+      <path
+         id="path3893"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(0.8,0,0,0.8,10,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <linearGradient
+       id="linearGradient3767">
+      <stop
+         style="stop-color:#efbc00;stop-opacity:1;"
+         offset="0"
+         id="stop3769" />
+      <stop
+         id="stop3775"
+         offset="0.93150687"
+         style="stop-color:#ffcb10;stop-opacity:1;" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3771" />
+    </linearGradient>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-4"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path3914-9"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker5456"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path5458"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-3"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path3914-6"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker5456-4"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path5458-7"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-5"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path3914-92"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker5456-3"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path5458-78"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-36"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path3914-5"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker5532"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path5534"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker5532-5"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path5534-9"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker5496"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path5498"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-7"
+       style="overflow:visible">
+      <path
+         id="path3914-8"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker5502"
+       style="overflow:visible">
+      <path
+         id="path5504"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1.0885159"
+     inkscape:cx="434.69385"
+     inkscape:cy="298.15747"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     showguides="true"
+     inkscape:guide-bbox="true"
+     inkscape:snap-global="true"
+     inkscape:window-width="1438"
+     inkscape:window-height="872"
+     inkscape:window-x="0"
+     inkscape:window-y="26"
+     inkscape:window-maximized="1"
+     fit-margin-top="25"
+     fit-margin-left="25"
+     fit-margin-right="25"
+     fit-margin-bottom="25">
+    <inkscape:grid
+       type="xygrid"
+       id="grid2985"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true"
+       originx="0.010641754px"
+       originy="25.999999px" />
+    <sodipodi:guide
+       position="0.010641754,25.999999"
+       orientation="0,493.90625"
+       id="guide3496" />
+    <sodipodi:guide
+       position="493.91689,25.999999"
+       orientation="-548.64734,0"
+       id="guide3498" />
+    <sodipodi:guide
+       position="493.91689,574.64734"
+       orientation="0,-493.90625"
+       id="guide3500" />
+    <sodipodi:guide
+       position="0.010641754,574.64734"
+       orientation="548.64734,0"
+       id="guide3502" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-159.64561,-133.63792)">
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.70866144;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect3866"
+       width="442.32111"
+       height="345.49908"
+       x="184.99994"
+       y="161.01271"
+       ry="10"
+       rx="10" />
+    <path
+       style="fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 355,222.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+       id="path2989"
+       inkscape:connector-curvature="0" />
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="368.57144"
+       y="251.21931"
+       id="text2995"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan2997"
+         x="368.57144"
+         y="251.21931" /></text>
+    <path
+       style="fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 355,348.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+       id="path2989-4"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 355,483.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+       id="path2989-1"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 355,623.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+       id="path2989-5"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.48800001;fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 475,623.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+       id="path2989-2"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.5;fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 235,623.36218 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+       id="path2989-8"
+       inkscape:connector-curvature="0" />
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="386.06738"
+       y="652.36218"
+       id="text3868"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3870"
+         x="386.06738"
+         y="652.36218"
+         style="font-size:20px;text-align:center;text-anchor:middle">working clones</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:18px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="524.37988"
+       y="463.36218"
+       id="text3874"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3876"
+         x="524.37988"
+         y="463.36218"
+         style="font-size:20px;text-align:center;text-anchor:middle">repository</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="525.35156"
+       y="330.36218"
+       id="text3878"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3880"
+         x="525.35156"
+         y="330.36218"
+         style="font-size:20px;text-align:center;text-anchor:middle">srcdir</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="525.1543"
+       y="201.36218"
+       id="text3882"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3884"
+         x="525.1543"
+         y="201.36218"
+         style="font-size:20px;text-align:center;text-anchor:middle">destdir</tspan></text>
+    <g
+       id="g5440"
+       transform="translate(5,51.000003)">
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path3886"
+         d="m 370,512.36218 c -5,-24.99999 -5,-44.99999 0,-70"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:none;marker-mid:none;marker-end:url(#Arrow2Lend)" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path3888"
+         d="m 390,442.36218 c 5,25 5,45 0,70"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)" />
+    </g>
+    <g
+       transform="translate(5,-84)"
+       id="g5440-4">
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path3886-8"
+         d="m 370,512.36218 c -5,-24.99999 -5,-44.99999 0,-70"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:none;marker-mid:none;marker-end:url(#Arrow2Lend)" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path3888-9"
+         d="m 390,442.36218 c 5,25 5,45 0,70"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)" />
+    </g>
+    <g
+       transform="matrix(0.71872744,0.69529193,-0.69529193,0.71872744,353.78964,-78.94206)"
+       id="g5440-47">
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path3886-3"
+         d="m 370,512.36218 c -5,-24.99999 -0.0778,-66.9912 7.34379,-88.08431"
+         style="opacity:0.5;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:none;marker-mid:none;marker-end:url(#Arrow2Lend)" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path3888-6"
+         d="m 391.48399,424.51223 c 5,25 6.0155,63.74804 -1.48399,87.84995"
+         style="opacity:0.5;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)" />
+    </g>
+    <g
+       transform="matrix(-0.71872744,0.69529193,0.69529193,0.71872744,421.21036,-78.94206)"
+       id="g5440-47-9"
+       style="opacity:0.5">
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path3886-3-3"
+         d="m 370,512.36218 c -5,-24.99999 -0.0778,-66.9912 7.34379,-88.08431"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:none;marker-mid:none;marker-end:url(#Arrow2Lend)" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path3888-6-3"
+         d="m 391.48399,424.51223 c 5,25 6.0155,63.74804 -1.48399,87.84995"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)" />
+    </g>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker5532)"
+       d="m 380,288.36218 0,-60"
+       id="path5558"
+       inkscape:connector-curvature="0" />
+    <g
+       id="g5810"
+       transform="translate(0,17)">
+      <g
+         transform="translate(-230,-4.9999974)"
+         id="g3784-7">
+        <g
+           id="g3779-37">
+          <path
+             inkscape:connector-curvature="0"
+             id="path2993-5"
+             d="m 440,177.36218 10,0 0,-10"
+             style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+          <path
+             sodipodi:nodetypes="cccccc"
+             inkscape:connector-curvature="0"
+             id="path2991-3"
+             d="m 440,177.36218 0,40 35,0 0,-50 -25,0 z"
+             style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+          <path
+             inkscape:connector-curvature="0"
+             id="path3777-8"
+             d="m 440,177.36218 10,0 0,-10"
+             style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+        </g>
+      </g>
+      <g
+         transform="translate(-235,-9.9999974)"
+         id="g3784">
+        <g
+           id="g3779">
+          <path
+             inkscape:connector-curvature="0"
+             id="path2993"
+             d="m 440,177.36218 10,0 0,-10"
+             style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+          <path
+             sodipodi:nodetypes="cccccc"
+             inkscape:connector-curvature="0"
+             id="path2991"
+             d="m 440,177.36218 0,40 35,0 0,-50 -25,0 z"
+             style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+          <path
+             inkscape:connector-curvature="0"
+             id="path3777"
+             d="m 440,177.36218 10,0 0,-10"
+             style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+        </g>
+      </g>
+      <text
+         sodipodi:linespacing="125%"
+         id="text5762"
+         y="176.55017"
+         x="206.62401"
+         style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+         xml:space="preserve"><tspan
+           style="font-size:8px"
+           y="176.55017"
+           x="206.62401"
+           id="tspan5764"
+           sodipodi:role="line">&lt;html&gt;</tspan></text>
+    </g>
+    <g
+       id="g5824"
+       transform="translate(0,17)">
+      <g
+         transform="translate(-165,-9.9999974)"
+         id="g3784-0">
+        <g
+           id="g3779-3">
+          <path
+             inkscape:connector-curvature="0"
+             id="path2993-2"
+             d="m 440,177.36218 10,0 0,-10"
+             style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+          <path
+             sodipodi:nodetypes="cccccc"
+             inkscape:connector-curvature="0"
+             id="path2991-8"
+             d="m 440,177.36218 0,40 35,0 0,-50 -25,0 z"
+             style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+          <path
+             inkscape:connector-curvature="0"
+             id="path3777-7"
+             d="m 440,177.36218 10,0 0,-10"
+             style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+        </g>
+      </g>
+      <g
+         transform="matrix(0.74161576,0,0,0.74161576,75.250882,53.354937)"
+         id="g5772">
+        <path
+           sodipodi:type="star"
+           style="fill:#939393;fill-opacity:1;stroke:#939393;stroke-width:0.70866144;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+           id="path5768"
+           sodipodi:sides="13"
+           sodipodi:cx="295"
+           sodipodi:cy="187.36218"
+           sodipodi:r1="10.889445"
+           sodipodi:r2="14.142136"
+           sodipodi:arg1="-2.3561945"
+           sodipodi:arg2="-2.1145335"
+           inkscape:flatsided="false"
+           inkscape:rounded="0.36"
+           inkscape:randomized="0"
+           d="m 287.3,179.66218 c 1.12496,-1.12496 -0.97775,-3.57952 0.38374,-4.40257 1.36149,-0.82305 2.55772,2.1795 4.07662,1.70619 1.5189,-0.47331 0.79773,-3.62389 2.38576,-3.71995 1.58803,-0.0961 1.25188,3.11848 2.81676,3.40526 1.56487,0.28677 2.39046,-2.83808 3.84123,-2.18514 1.45078,0.65294 -0.34074,3.34306 0.91162,4.32422 1.25235,0.98116 3.43557,-1.40209 4.41673,-0.14973 0.98116,1.25236 -1.85532,2.80178 -1.20238,4.25255 0.65294,1.45078 3.69363,0.35511 3.98041,1.91998 0.28677,1.56488 -2.94485,1.61865 -3.04091,3.20668 -0.0961,1.58803 3.10552,2.03094 2.63221,3.54984 -0.47331,1.5189 -3.35976,0.0647 -4.18281,1.42619 -0.82305,1.3615 1.80598,3.24152 0.68102,4.36648 -1.12496,1.12496 -3.00498,-1.50407 -4.36648,-0.68101 -1.36149,0.82305 0.0927,3.7095 -1.42619,4.1828 -1.5189,0.47331 -1.96181,-2.72827 -3.54984,-2.63221 -1.58803,0.0961 -1.64181,3.32768 -3.20668,3.04091 -1.56488,-0.28678 -0.4692,-3.32746 -1.91998,-3.9804 -1.45077,-0.65294 -3.00019,2.18353 -4.25255,1.20237 -1.25236,-0.98116 1.13089,-3.16437 0.14973,-4.41673 -0.98116,-1.25236 -3.67128,0.53916 -4.32422,-0.91161 -0.65294,-1.45078 2.47191,-2.27636 2.18513,-3.84124 -0.28677,-1.56488 -3.50131,-1.22873 -3.40525,-2.81676 0.096,-1.58803 3.24664,-0.86686 3.71995,-2.38576 0.47331,-1.5189 -2.52925,-2.71513 -1.70619,-4.07662 0.82305,-1.36149 3.27761,0.74122 4.40257,-0.38374 z"
+           inkscape:transform-center-x="-0.68364368"
+           inkscape:transform-center-y="0.68364368"
+           transform="translate(-2,0)" />
+        <path
+           sodipodi:type="arc"
+           style="fill:#ffffff;fill-opacity:1;stroke:#939393;stroke-width:0.70866144;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+           id="path5770"
+           sodipodi:cx="295"
+           sodipodi:cy="187.36218"
+           sodipodi:rx="5"
+           sodipodi:ry="5"
+           d="m 300,187.36218 c 0,2.76143 -2.23858,5 -5,5 -2.76142,0 -5,-2.23857 -5,-5 0,-2.76142 2.23858,-5 5,-5 2.76142,0 5,2.23858 5,5 z"
+           transform="matrix(1.4,0,0,1.4,-120,-74.944873)" />
+      </g>
+    </g>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="265"
+       y="237.36218"
+       id="text5806"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan5808"
+         x="265"
+         y="237.36218"
+         style="font-size:12px">ikiwiki.cgi</tspan></text>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker5532)"
+       d="m 295,243.36218 c 10,40 25,65 55,85"
+       id="path5834"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;text-align:end;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="351.31982"
+       y="388.36218"
+       id="text6240"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan6242"
+         x="351.31982"
+         y="388.36218"
+         style="font-size:14px;text-align:end;writing-mode:lr-tb;text-anchor:end">post-update</tspan><tspan
+         sodipodi:role="line"
+         x="351.31982"
+         y="405.86218"
+         style="font-size:14px;text-align:end;writing-mode:lr-tb;text-anchor:end"
+         id="tspan6244">hook</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="401.62637"
+       y="369.98856"
+       id="text6246"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan6248"
+         x="401.62637"
+         y="369.98856"
+         style="font-size:14px">ikiwiki.cgi</tspan><tspan
+         sodipodi:role="line"
+         x="401.62637"
+         y="387.48856"
+         id="tspan6250"
+         style="font-size:14px">push</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="382"
+       y="342.36218"
+       id="text6252"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan6254"
+         x="382"
+         y="342.36218">.git</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="383"
+       y="618.36218"
+       id="text6252-3"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan6254-1"
+         x="383"
+         y="618.36218">.git</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;opacity:0.3;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="502"
+       y="617.36218"
+       id="text6252-3-1"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan6254-1-0"
+         x="502"
+         y="617.36218">.git</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;opacity:0.3;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="263"
+       y="618.36218"
+       id="text6252-3-6"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan6254-1-1"
+         x="263"
+         y="618.36218">.git</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="411"
+       y="482.36218"
+       id="text6252-3-0"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan6254-1-2"
+         x="411"
+         y="482.36218">.git</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;text-align:end;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="300"
+       y="288.36218"
+       id="text6372"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan6374"
+         x="300"
+         y="288.36218"
+         style="font-size:14px">web-side</tspan><tspan
+         sodipodi:role="line"
+         x="300"
+         y="305.86218"
+         id="tspan6376"
+         style="font-size:14px">edit</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="410"
+       y="258.36218"
+       id="text6378"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan6380"
+         x="410"
+         y="258.36218"
+         style="font-size:14px">automatic</tspan><tspan
+         sodipodi:role="line"
+         x="410"
+         y="275.86218"
+         id="tspan6382"
+         style="font-size:14px">rebuild</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="406.75635"
+       y="527.15295"
+       id="text6384"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan6386"
+         x="406.75635"
+         y="527.15295"
+         style="font-size:14px">git</tspan><tspan
+         sodipodi:role="line"
+         x="406.75635"
+         y="544.65295"
+         id="tspan6388"
+         style="font-size:14px">pull</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;text-align:end;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="363.62955"
+       y="530.39691"
+       id="text6390"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan6392"
+         x="363.62955"
+         y="530.39691"
+         style="font-size:14px;text-align:end;text-anchor:end">git</tspan><tspan
+         sodipodi:role="line"
+         x="363.62955"
+         y="547.89691"
+         id="tspan6394"
+         style="font-size:14px;text-align:end;text-anchor:end">push</tspan></text>
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.70866144;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect3866-8"
+       width="442.32104"
+       height="215.04623"
+       x="705.59521"
+       y="160.99225"
+       ry="10"
+       rx="10" />
+    <path
+       style="fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 875.59526,222.34171 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+       id="path2989-3"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:#ffcb14;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 875.59526,348.34171 55,0 0,-45 -25,0 -5,-5 -20,0 -5,5 z"
+       id="path2989-4-3"
+       inkscape:connector-curvature="0" />
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="1045.9468"
+       y="330.34171"
+       id="text3878-9"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3880-8"
+         x="1045.9468"
+         y="330.34171"
+         style="font-size:20px;text-align:center;text-anchor:middle">srcdir</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="1045.7495"
+       y="201.34171"
+       id="text3882-5"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3884-9"
+         x="1045.7495"
+         y="201.34171"
+         style="font-size:20px;text-align:center;text-anchor:middle">destdir</tspan></text>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:none;marker-mid:none;marker-end:url(#Arrow2Lend)"
+       d="M 419.71797,438.28458 C 444.1158,401.34173 758.30505,317.03398 799.13365,245.18119"
+       id="path3886-8-5"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
+       d="M 897.22162,357.26039 C 834.23915,422.6824 538.42353,495.04728 447.06742,474.11317"
+       id="path3888-9-8"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker5532)"
+       d="m 900.59526,288.34171 0,-60"
+       id="path5558-1"
+       inkscape:connector-curvature="0" />
+    <g
+       id="g5810-7"
+       transform="translate(520.59526,16.979529)">
+      <g
+         transform="translate(-230,-4.9999974)"
+         id="g3784-7-9">
+        <g
+           id="g3779-37-0">
+          <path
+             inkscape:connector-curvature="0"
+             id="path2993-5-5"
+             d="m 440,177.36218 10,0 0,-10"
+             style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+          <path
+             sodipodi:nodetypes="cccccc"
+             inkscape:connector-curvature="0"
+             id="path2991-3-0"
+             d="m 440,177.36218 0,40 35,0 0,-50 -25,0 z"
+             style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+          <path
+             inkscape:connector-curvature="0"
+             id="path3777-8-1"
+             d="m 440,177.36218 10,0 0,-10"
+             style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+        </g>
+      </g>
+      <g
+         transform="translate(-235,-9.9999974)"
+         id="g3784-2">
+        <g
+           id="g3779-4">
+          <path
+             inkscape:connector-curvature="0"
+             id="path2993-3"
+             d="m 440,177.36218 10,0 0,-10"
+             style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+          <path
+             sodipodi:nodetypes="cccccc"
+             inkscape:connector-curvature="0"
+             id="path2991-6"
+             d="m 440,177.36218 0,40 35,0 0,-50 -25,0 z"
+             style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+          <path
+             inkscape:connector-curvature="0"
+             id="path3777-0"
+             d="m 440,177.36218 10,0 0,-10"
+             style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+        </g>
+      </g>
+      <text
+         sodipodi:linespacing="125%"
+         id="text5762-3"
+         y="176.55017"
+         x="206.62401"
+         style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+         xml:space="preserve"><tspan
+           style="font-size:8px"
+           y="176.55017"
+           x="206.62401"
+           id="tspan5764-9"
+           sodipodi:role="line">&lt;html&gt;</tspan></text>
+    </g>
+    <g
+       id="g5824-8"
+       transform="translate(520.59526,16.979529)">
+      <g
+         transform="translate(-165,-9.9999974)"
+         id="g3784-0-4">
+        <g
+           id="g3779-3-6">
+          <path
+             inkscape:connector-curvature="0"
+             id="path2993-2-8"
+             d="m 440,177.36218 10,0 0,-10"
+             style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+          <path
+             sodipodi:nodetypes="cccccc"
+             inkscape:connector-curvature="0"
+             id="path2991-8-3"
+             d="m 440,177.36218 0,40 35,0 0,-50 -25,0 z"
+             style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+          <path
+             inkscape:connector-curvature="0"
+             id="path3777-7-1"
+             d="m 440,177.36218 10,0 0,-10"
+             style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+        </g>
+      </g>
+      <g
+         transform="matrix(0.74161576,0,0,0.74161576,75.250882,53.354937)"
+         id="g5772-3">
+        <path
+           sodipodi:type="star"
+           style="fill:#939393;fill-opacity:1;stroke:#939393;stroke-width:0.70866144;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+           id="path5768-5"
+           sodipodi:sides="13"
+           sodipodi:cx="295"
+           sodipodi:cy="187.36218"
+           sodipodi:r1="10.889445"
+           sodipodi:r2="14.142136"
+           sodipodi:arg1="-2.3561945"
+           sodipodi:arg2="-2.1145335"
+           inkscape:flatsided="false"
+           inkscape:rounded="0.36"
+           inkscape:randomized="0"
+           d="m 287.3,179.66218 c 1.12496,-1.12496 -0.97775,-3.57952 0.38374,-4.40257 1.36149,-0.82305 2.55772,2.1795 4.07662,1.70619 1.5189,-0.47331 0.79773,-3.62389 2.38576,-3.71995 1.58803,-0.0961 1.25188,3.11848 2.81676,3.40526 1.56487,0.28677 2.39046,-2.83808 3.84123,-2.18514 1.45078,0.65294 -0.34074,3.34306 0.91162,4.32422 1.25235,0.98116 3.43557,-1.40209 4.41673,-0.14973 0.98116,1.25236 -1.85532,2.80178 -1.20238,4.25255 0.65294,1.45078 3.69363,0.35511 3.98041,1.91998 0.28677,1.56488 -2.94485,1.61865 -3.04091,3.20668 -0.0961,1.58803 3.10552,2.03094 2.63221,3.54984 -0.47331,1.5189 -3.35976,0.0647 -4.18281,1.42619 -0.82305,1.3615 1.80598,3.24152 0.68102,4.36648 -1.12496,1.12496 -3.00498,-1.50407 -4.36648,-0.68101 -1.36149,0.82305 0.0927,3.7095 -1.42619,4.1828 -1.5189,0.47331 -1.96181,-2.72827 -3.54984,-2.63221 -1.58803,0.0961 -1.64181,3.32768 -3.20668,3.04091 -1.56488,-0.28678 -0.4692,-3.32746 -1.91998,-3.9804 -1.45077,-0.65294 -3.00019,2.18353 -4.25255,1.20237 -1.25236,-0.98116 1.13089,-3.16437 0.14973,-4.41673 -0.98116,-1.25236 -3.67128,0.53916 -4.32422,-0.91161 -0.65294,-1.45078 2.47191,-2.27636 2.18513,-3.84124 -0.28677,-1.56488 -3.50131,-1.22873 -3.40525,-2.81676 0.096,-1.58803 3.24664,-0.86686 3.71995,-2.38576 0.47331,-1.5189 -2.52925,-2.71513 -1.70619,-4.07662 0.82305,-1.36149 3.27761,0.74122 4.40257,-0.38374 z"
+           inkscape:transform-center-x="-0.68364368"
+           inkscape:transform-center-y="0.68364368"
+           transform="translate(-2,0)" />
+        <path
+           sodipodi:type="arc"
+           style="fill:#ffffff;fill-opacity:1;stroke:#939393;stroke-width:0.70866144;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+           id="path5770-5"
+           sodipodi:cx="295"
+           sodipodi:cy="187.36218"
+           sodipodi:rx="5"
+           sodipodi:ry="5"
+           d="m 300,187.36218 c 0,2.76143 -2.23858,5 -5,5 -2.76142,0 -5,-2.23857 -5,-5 0,-2.76142 2.23858,-5 5,-5 2.76142,0 5,2.23858 5,5 z"
+           transform="matrix(1.4,0,0,1.4,-120,-74.944873)" />
+      </g>
+    </g>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="785.59528"
+       y="237.34171"
+       id="text5806-9"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan5808-4"
+         x="785.59528"
+         y="237.34171"
+         style="font-size:12px">ikiwiki.cgi</tspan></text>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker5532)"
+       d="m 815.59526,243.34171 c 10,40 25,65 55,85"
+       id="path5834-5"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;text-align:end;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="774.53473"
+       y="262.48227"
+       id="text6240-7"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         x="774.53473"
+         y="262.48227"
+         style="font-size:14px;text-align:end;writing-mode:lr-tb;text-anchor:end"
+         id="tspan6244-9">pingee</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="873.53143"
+       y="398.4472"
+       id="text6246-4"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan6248-4"
+         x="873.53143"
+         y="398.4472"
+         style="font-size:14px">ikiwiki.cgi</tspan><tspan
+         sodipodi:role="line"
+         x="873.53143"
+         y="415.9472"
+         id="tspan6250-2"
+         style="font-size:14px">push</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="902.59521"
+       y="342.34171"
+       id="text6252-1"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan6254-5"
+         x="902.59521"
+         y="342.34171">.git</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;text-align:end;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="850.9118"
+       y="324.17032"
+       id="text6372-7"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan6374-6"
+         x="850.9118"
+         y="324.17032"
+         style="font-size:14px">web-side</tspan><tspan
+         sodipodi:role="line"
+         x="850.9118"
+         y="341.67032"
+         id="tspan6376-1"
+         style="font-size:14px">edit</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="930.59521"
+       y="258.34171"
+       id="text6378-1"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan6380-1"
+         x="930.59521"
+         y="258.34171"
+         style="font-size:14px">automatic</tspan><tspan
+         sodipodi:role="line"
+         x="930.59521"
+         y="275.84171"
+         id="tspan6382-9"
+         style="font-size:14px">rebuild</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;text-align:end;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="495.62973"
+       y="432.47018"
+       id="text6240-7-3"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         x="495.62973"
+         y="432.47018"
+         style="font-size:14px;text-align:end;writing-mode:lr-tb;text-anchor:end"
+         id="tspan6244-9-7">pinger</tspan></text>
+  </g>
+</svg>
index 42a0aa7bf16350d8dde600bf125c05a55f5de3a7..8865508d33909a2016bb8eb249fbaf69718f6ec0 100644 (file)
@@ -15,7 +15,11 @@ configuration changes should work anywhere.
 
 ## apache 2
 
-* Edit /etc/apache2/apache2.conf and add a line like this:
+* Make sure the cgi module is loaded. (Ie, `a2enmod cgi`).
+  Note that the cgid module will not work.
+
+* Edit /etc/apache2/apache2.conf (or /etc/apache2/mods-available/mime.conf)
+  and add a line like this:
 
        AddHandler cgi-script .cgi
 
@@ -26,8 +30,10 @@ configuration changes should work anywhere.
   Or, if you've put it in a `~/public_html`, edit
   `/etc/apache2/mods-available/userdir.conf`.
 
-  You may also want to install some dependencies to enable CGI in apache2 setup as: `libcgi-formbuilder-perl` and `libcgi-session-perl`.
-
+* If your wiki is in `~/public_html` and does not appear when you enter the URL given by the installer, check that you have 
+  the userdir mod enabled (there should be simlinks to userdir.load and userdir.conf in /etc/apache2/modes-enabled).  If not,
+  run `a2enmod userdir` and reload apache2.
+  
 * You may also want to enable the [[plugins/404]] plugin.
   To make apache use it, the apache config file will need a further
   modification to make it use ikiwiki's CGI as the apache 404 handler.
@@ -60,7 +66,44 @@ If you have any thought about it, feel free to let me know.
 
 ## nginx
 
-* To run CGI under nginx, just use a FastCGI wrapper like [this one](http://technotes.1000lines.net/?p=23). The wrapper must be started somehow just like any other FastCGI program. I use launchd on OSX.
+To run CGI under nginx, you need to use a FastCGI wrapper. The wrapper must be started somehow just like any other FastCGI program. You can use launchd on OSX.
+
+In Linux, you will need the spawn-fcgi and fcgiwrap packages and start
+them with:
+
+    spawn-fcgi -s /tmp/fcgi.socket -n -- /usr/sbin/fcgiwrap
+
+This needs to be ran as your user. It can be added to `inittab` or
+made into a startup script in `init.d`. You may also need to make this file writable by the webserver, if that's running as a different user, e.g.:
+
+    chmod a+w /tmp/fcgi.socket
+
+Then you need an nginx config plugged in that wrapper. Here's an
+example virtual host configuration:
+
+    server {
+        #listen   80; ## listen for ipv4; this line is default and implied
+        #listen   [::]:80 default_server ipv6only=on; ## listen for ipv6
+
+        root /home/anarcat/public_html/wiki.reseaulibre.ca/;
+        index index.html index.htm;
+
+        # Make site accessible from http://localhost/
+        server_name wiki.reseaulibre.ca;
+
+        location / {
+                try_files $uri $uri/ /index.html;
+        }
+        location /ikiwiki.cgi {
+                fastcgi_pass  unix:/tmp/fcgi.socket;
+                fastcgi_index ikiwiki.cgi;
+                fastcgi_param SCRIPT_FILENAME   /home/anarcat/public_html/ikiwiki.cgi;
+                fastcgi_param  DOCUMENT_ROOT      /home/anarcat/public_html/wiki.reseaulibre.ca;
+                include /etc/nginx/fastcgi_params;
+        }
+    }
+
+Also, note that the `/tmp/fcgi.socket` file needs to be writable by the webserver. I am also unsure as to the security of this setup, as I am using this only on my dev server. Needless to say that [[real fastcgi support|todo/fastcgi_or_modperl_installation_instructions]] would be great. ;) --[[anarcat]]
 
 ## boa
 
index a8854565ca502794e95f8a27b82087e5df547cbe..0e23e3a0834ba8388b21817ebdff75ec303db0cd 100644 (file)
@@ -1,3 +1,8 @@
+## Alt explanation/instructions
+For whatever reason, I found the info on the dot cgi page very confusing.  The instructions on [[http://maketecheasier.com/install-and-configure-apache-in-ubuntu/2011/03/09]] were a lot easier to follow, and ultimately got me over the ubuntu-apache hump.
+
+Following this method the wiki won't be at the same url, it will be at localhost/*wiki_name*
+
 ## warning: lighttpd only or both?
 
 Is your warning at the bottom (you don't know how secure it is) only about
index b3d1de3706498e863a2e83135dd0bf30f9961c2d..b36bb6a0312c206f2d52edf8ceb84a2eed6da44d 100644 (file)
@@ -1,14 +1,32 @@
 [[!toc]]
 
+# pkgsrc
+
+The easiest way of installing an up-to-date ikiwiki on any version of Mac OS X is via
+[pkgsrc](http://www.pkgsrc.org/).
+
+## From source:
+
+7. [Bootstrap pkgsrc](http://www.netbsd.org/docs/pkgsrc/platforms.html#bootstrapping-pkgsrc)
+7. Run `cd .../pkgsrc/www/ikiwiki && make install clean`
+
+## From binary packages:
+
+7. [install binary packages (OSX)](http://www.pkgsrc.org/#index1h1)
+
+{OK} As of 2014/08/24, the [version of ikiwiki in pkgsrc](http://pkgsrc.se/www/ikiwiki) is 3.20140815.
+
+-----
+
 # MacPorts
 
-The easiest way of installing ikiwiki on Mac OS X [Snow] Leopard and Tiger is via MacPorts: <http://www.macports.org/>
+Another way to install ikiwiki on Mac OS X [Snow] Leopard and Tiger is via MacPorts: <http://www.macports.org/>
 
-This project ports Open Source software into Mac Os X platform.
-It's very easy to intall ikiwiki via MacPorts:
+This project ports Open Source software into Mac OS X platform.
+It's very easy to install ikiwiki via MacPorts:
 
 1.- Donwnload and install MacPorts port manager from:  <http://www.macports.org/install.php> . 
-    Port manager installs via Mac Os X installer. Prerequisite: XCode.
+    Port manager installs via Mac OS X installer. Prerequisite: XCode.
     Se above URL for details
 
 2.- Run 
@@ -21,15 +39,7 @@ enjoy
 
 Enrique Castilla
 
------
-
-# pkgsrc
-
-The other easiest way of installing ikiwiki on Mac OS X is via
-[pkgsrc](http://www.pkgsrc.org/).
-
-7. Bootstrap pkgsrc
-7. Run `cd .../pkgsrc/www/ikiwiki && make install clean`
+[!] As of 2014/08/24, the [version of ikiwiki in MacPorts](http://www.macports.org/ports.php?by=name&substr=Ikiwiki) is 3.20110608.
 
 -----
 
diff --git a/doc/tips/ikiwiki_on_mac_os_x/discussion.mdwn b/doc/tips/ikiwiki_on_mac_os_x/discussion.mdwn
new file mode 100644 (file)
index 0000000..40ac874
--- /dev/null
@@ -0,0 +1,16 @@
+This recommended method (sc. install Ikiwiki using pkgsrc) is not compatible with homebrew and the packages installed via homebrew,  and, therefore, not always a viable solution to installing Ikiwiki on Mac computers.
+
+> In what way is it "not compatible"? Have you tried it? I can't
+> think of any technical reason why having a working Homebrew
+> installation would prevent one from also having a working pkgsrc
+> installation, or vice versa. (MacPorts and Fink can certainly coexist
+> with each other and with other package managers on the same system.)
+>
+> We used to direct OS X ikiwiki users to MacPorts, but the version
+> there is almost three years old. pkgsrc's ikiwiki stays up to date
+> because I keep it that way. If someone packages ikiwiki for Homebrew
+> and reliably keeps the package updated, then we could discuss
+> whether pointing folks at Homebrew is better advice than what's
+> currently being given here. In the meantime, if you've tried and
+> failed to install ikiwiki from pkgsrc on OS X, please report your
+> problem in detail so it can be addressed in some way. --[[schmonz]]
diff --git a/doc/tips/ikiwiki_via_gopher/discussion.mdwn b/doc/tips/ikiwiki_via_gopher/discussion.mdwn
new file mode 100644 (file)
index 0000000..196f203
--- /dev/null
@@ -0,0 +1,8 @@
+Joey, do you have an ikiwiki served up on gopher, as an example, I can take a look at?
+I find this prospect interesting.
+I have a gopherhole, but no wiki in it.
+
+I was wondering, myself, if I symlinked a dirfull of dokuwiki pages in my gopherhole what that might be like...hmmmm.
+I might try that.
+
+tony baldwin | http://tonybaldwin.me | gopher://tonybaldwin.me
index 0c0527f2ce8e84a7d4aff0e1f9a85fb875ad64f5..a59d4b5ad48595418d915b12382370f82a3b3064 100644 (file)
@@ -1,9 +1,244 @@
 [[!meta title="ikiwiki-wordpress-import"]]
 
+I converted the script to Perl.  The new version gets your name and email automatically from your git config, converts the body of your posts to markdown, and also imports comments.  More importantly it works with the latest wordpress, which the python version does not.  Note that it's still not 100% perfect and I intend to make a few modifications still, but they will require access to the mysql database and that may render the script useless to some users.
+
+-----
+[[!format perl '''
+#!/usr/bin/env perl
+
+use 5.16.1;
+use warnings;
+
+use XML::Simple;
+use DateTime::Format::Strptime;
+use HTML::WikiConverter;
+use LWP::UserAgent;
+use Try::Tiny;
+use Digest::MD5 'md5_hex';
+
+die "usage: $0 import_file subdir [branch] | git-fast-import"
+   unless @ARGV == 2 or @ARGV == 3;
+
+chomp(my $name = qx(git config --get user.name));
+chomp(my $email = qx(git config --get user.email));
+
+my ($file, $subdir, $branch) = @ARGV;
+
+my %events;
+
+POST:
+for my $x (grep $_->{'wp:status'} eq 'publish', @{XMLin($file)->{channel}{item}}) {
+   state $date_parser = DateTime::Format::Strptime->new(
+      pattern => '%F %T',
+      time_zone => 'UTC',
+   );
+
+   my $stub = $x =~ m<([^/]+)\/$>
+      ? $1
+      : lc($x->{title} =~ s/\W/-/gr =~ s/-$//r)
+   ;
+
+   my $guid = $x->{guid}{content} || $x->{link};
+   utf8::encode($x->{title});
+   my $msg = qq($x->{title}\n\nfrom WordPress [$guid]);
+   my $timestamp = $date_parser
+      ->parse_datetime($x->{'wp:post_date_gmt'})
+      ->epoch;
+
+   my $c = $x->{category};
+   $c = [$c] if ref $c && ref $c ne 'ARRAY';
+
+   my $content =
+      sprintf(qq([[!meta title="%s"]]\n), $x->{title} =~ s/"/\\"/gr) .
+      convert_content($x->{'content:encoded'}) . "\n\n" .
+      join("\n",
+         map '[[!tag ' . s/ /-/r . ']]',
+         keys %{
+            +{
+               map { $_ => 1 }
+               grep $_ ne 'uncategorized',
+               map $_->{nicename},
+               @$c
+            }
+         }
+      );
+
+   $events{$timestamp} = join "\n",
+      "commit refs/heads/$branch",
+      "committer $name <$email> $timestamp +0000",
+      'data <<8675309',
+      $msg,
+      '8675309',
+      "M 644 inline $subdir/$stub.mdwn",
+      'data <<8675309',
+      $content,
+      '8675309'
+   ;
+
+   get_comments($x->{link}, "$subdir/$stub")
+      if $x->{'wp:post_type'} eq 'post'
+}
+
+sub get_comments {
+   my ($url, $dir) = @_;
+
+   state $ua = LWP::UserAgent->new;
+
+   my $content = $ua->get("$url/feed")->decoded_content;
+   my $first;
+   my $bail;
+   my $decoded =
+      try { XMLin($content, ForceArray => ['item']) }
+      catch { $bail = 1 };
+
+   return if $bail;
+
+   COMMENT:
+   for my $x (@{$decoded->{channel}{item}}) {
+      my $date = $x->{pubDate};
+      $date =~ s/^\S+\s//;
+      $date =~ s/\s\S+$//;
+
+      #ghetto
+      $date =~ s/Jan/01/;
+      $date =~ s/Feb/02/;
+      $date =~ s/Mar/03/;
+      $date =~ s/Apr/04/;
+      $date =~ s/May/05/;
+      $date =~ s/Jun/06/;
+      $date =~ s/Jul/07/;
+      $date =~ s/Aug/08/;
+      $date =~ s/Sep/09/;
+      $date =~ s/Oct/10/;
+      $date =~ s/Nov/11/;
+      $date =~ s/Dec/12/;
+
+      state $date_parser = DateTime::Format::Strptime->new(
+         pattern => '%d %m %Y %T',
+         time_zone => 'UTC',
+      );
+
+      my $datetime = $date_parser
+         ->parse_datetime($date);
+
+      my $timestamp = $datetime->epoch;
+      my $formatted_date = "$timestamp";
+
+      my $msg = 'Added a comment';
+      my $content = convert_content($x->{'content:encoded'});
+      utf8::encode($x->{'dc:creator'});
+
+      $events{$timestamp} = join "\n",
+         "commit refs/heads/$branch",
+         # still need to get email address
+         "committer $x->{'dc:creator'} <$x->{'dc:creator'}> $timestamp +0000",
+         'data <<8675309',
+         $msg,
+         '8675309',
+         "M 644 inline " . unique_comment_location($dir, $content),
+         'data <<8675309',
+
+      <<"COMMENT",
+[[!comment format=mdwn
+ username="$x->{'dc:creator'}"
+ date="$formatted_date"
+ content="""
+$content
+"""]]
+COMMENT
+      '8675309'
+      ;
+   }
+}
+
+say $events{$_} for sort keys %events;
+
+sub convert_content {
+   my $body = shift;
+
+   utf8::encode($body);
+
+   state $converter = HTML::WikiConverter->new(
+      dialect              => 'Markdown',
+      link_style           => 'inline',
+      unordered_list_style => 'dash',
+      image_style          => 'inline',
+      image_tag_fallback   => 0,
+   );
+
+   # I know I know you can't parse XML with regular expressions.  Go find a real
+   # parser and send me a patch
+   my $in_code = 0;
+
+   my $start_code = qr(<pre[^>]*>);
+   # (?:) is a no op but keeps ikiwiki from breaking my script
+   my $end_code = qr(</p(?:)re>);
+
+   $body =~ s(&#(?:8217|039);)(')g;
+   $body =~ s(&(?:quot|#822[01]);)(")g;
+   $body =~ s(&lt;)(<)g;
+   $body =~ s(&gt;)(>)g;
+   $body =~ s(&amp;)(&)g;
+   $body =~ s(&#8230;)(...)g;
+   $body =~ s(&#821[12];)(-)g;
+   $body =~ s(&#8216;)(')g;
+   $body =~ s(&#8242;)(')g;
+   $body =~ s(&infin;)(∞)g;
+   $body =~ s(&nbsp;)()g;
+   $body =~ s(<code[^>]*>)(<p(?:)re>)g;
+   $body =~ s(</c(?:)ode>)(</p(?:)re>)g;
+
+   my @tokens =
+      map {; split qr[(?=<p(?:)re>)] }
+      map {; split qr[</p(?:)re>\K] }
+      split /\n\n/,
+      $body;
+
+   my @new_tokens;
+   for my $t (@tokens) {
+      if (
+         ($in_code && $t !~ $end_code) ||
+         ($t =~ $start_code && $t =~ $end_code)
+      ) {
+         # do nothing
+      } elsif ($t =~ $start_code) {
+         $in_code = 1;
+      } elsif ($t =~ $end_code) {
+         $in_code = 0;
+      } else {
+         die "$t !!! '$1'" if $t =~ m/&([^;\s]+);/ && $1 !~ /[lg]t/;
+
+         $t = "<p>$t</p>"
+      }
+      push @new_tokens, $t
+   }
+
+   $converter->html2wiki(join "\n\n", @new_tokens)
+}
+
+sub unique_comment_location {
+   my ($dir, $content) = @_;
+
+   utf8::encode($content);
+   my $md5 = md5_hex($content);
+
+   my $location;
+   my $i = 0;
+   do {
+      $i++;
+      $location = "$dir/comment_${i}_$md5._comment";
+   } while -e $location;
+
+   return $location
+}
+
+''']]
+-----
+
 I modified the script a bit so categories and tags would actually show up in the output file.
 
 -----
-<pre>
+[[!format '''
 #!/usr/bin/env python
 
 """
@@ -110,7 +345,7 @@ if __name__ == "__main__":
     else:
         main(*sys.argv[1:])
 
-</pre>
+''']]
 -----
 
 I have another version of the script, which uses the `timestamp` from the script, and inserts that as a \[[!meta date="foodate"]]. I'm posting it here just in case I happen to be doing something to the httpd.
@@ -118,7 +353,7 @@ I have another version of the script, which uses the `timestamp` from the script
 (Hopefully I've escaped everything properly; if I missed something, check the source.)
 
 -----
-<pre>
+[[!format '''
 #!/usr/bin/env python
 
 """
@@ -223,7 +458,7 @@ if __name__ == "__main__":
     else:
         main(*sys.argv[1:])
 
-</pre>
+''']]
 -----
 
 
index cfa565d1a4b317bd7666b4ab3c701339ea167d37..4011763fc2468ea5b32c957cc5f0a5a1053d4153 100644 (file)
@@ -19,15 +19,14 @@ for setting up ikiwiki with git.
 Next, `git clone` the source (`$REPOSITORY`, not `$SRCDIR`)
 from the server to the laptop.
 
-Now, set up a [[web_server|dot_cgi]] on your laptop, if it doesn't
-already have one.
-
 Now you need to write a setup file for ikiwiki on the laptop. Mostly this
 is standard, but a few special settings are needed:
 
 * Configure a cgi wrapper as usual, but configure the git wrapper to
   be written to the `post-commit` hook of the git clone, rather than the
   usual `post-update` hook.
+  
+    git_wrapper: /home/user/foo-wiki/.git/hooks/post-commit
 
 * By default, ikiwiki pulls and pushes from `origin`. This shouldn't be 
   done on the laptop, because the origin may not be accessible (when the
@@ -36,7 +35,7 @@ is standard, but a few special settings are needed:
 
   Make sure you have ikiwiki 2.11 or better installed, and set:
   
-       gitorigin_branch => "",
+       gitorigin_branch
 
 * You can optionally enable to the [[plugins/mirrorlist]] plugin,
   and configure it so that each page links to the corresponding page on the
@@ -44,7 +43,30 @@ is standard, but a few special settings are needed:
 
 Now just run `ikiwiki -setup wiki.setup -getctime` and you should be
 good to go. (You only need the slow `-getctime` option the first time you
-run setup.)
+run setup.) If you have taken your `wiki.setup` file from an existing
+wiki, you may need to change certain parameters to adapt to the paths
+on your laptop, a few examples:
+
+    srcdir: /home/user/foo-wiki
+    destdir: /home/user/public_html
+    # optional
+    url: http://foo-wiki.localhost
+    libdir: /home/user/foo-wiki/.ikiwiki
+    ENV:
+        TMPDIR: /home/user/tmp
+    cookiejar:
+        file:
+
+Now, set up a [[web_server|dot_cgi]] on your laptop, if it doesn't
+already have one. You can also skip that step if you want only to
+render the wiki and not allow edition, in which case you'll want the
+following:
+
+    # disable CGI, unless you want to get really funky
+    cgiurl: 
+    cgi_wrapper: 
+
+You can also direct people to the main server for web edition there.
 
 Use standard git commands to handle pulling from and pushing to the server.
 
diff --git a/doc/tips/mailman_subscription_form.mdwn b/doc/tips/mailman_subscription_form.mdwn
new file mode 100644 (file)
index 0000000..3e9ed07
--- /dev/null
@@ -0,0 +1,10 @@
+One can think about implementing "[[Mailman integration]]" or something, but I find that rather overdoing it. Mailman is simple enough that you can add a clean subscription form to your ikiwiki site in seconds, just add:
+
+~~~~
+<form action="https://listes.example.com/cgi-bin/mailman/subscribe/listname" method="POST">
+Email: <input name="email" />
+<input type="submit" value="Subscribe" />
+</form>
+~~~~
+
+To your site and voilà, you are done! No more scary mailman subscription form! (Thanks to [[bgm]] for that trick!) --[[anarcat]]
diff --git a/doc/tips/migrating_podcast_to_ikiwiki.mdwn b/doc/tips/migrating_podcast_to_ikiwiki.mdwn
new file mode 100644 (file)
index 0000000..416ba29
--- /dev/null
@@ -0,0 +1,19 @@
+First, get familiar with [[howto avoid flooding aggregators]].
+
+## Into ikiwiki, from another CMS
+
+7. Copy content into ikiwiki, taking care to:
+    7. Match article paths to preserve old permalinks.
+    7. Match enclosure paths (or use redirects) to preserve old URLs.
+    7. Match titles, post dates, and guids with `\[[!meta]]`.
+    7. Match feed paths with permanent redirects from old Atom
+       location to `index.atom` (likewise for RSS).
+    7. `\[[!inline]]` the articles.
+7. Rerun `ikiwiki --setup`.
+
+## Within ikiwiki, from basic to fancy
+
+7. Exclude media files from `\[[!inline]]`.
+7. Replace direct `\[[WikiLinks]]` to media files with
+   `\[[!meta enclosure="WikiLink/to/media.mp3"]]`.
+7. Rerun `ikiwiki --setup`.
diff --git a/doc/tips/monitor_page_changes_through_IRC.mdwn b/doc/tips/monitor_page_changes_through_IRC.mdwn
new file mode 100644 (file)
index 0000000..ebddbfe
--- /dev/null
@@ -0,0 +1,9 @@
+because of [[bugs/notifyemail_fails_with_some_openid_providers]], I have been struggling with finding ways of being notified of changes to pages I want to watch here.
+
+the workaround I found so far was to join the `#ikiwiki` channel on freenode, and set the following "hilight" in irssi:
+
+    /hilight -channels #ikiwiki  -word tips/monitor_page_changes_through_IRC
+
+this will watch for any change to this page. -- [[anarcat]]
+
+hello anarcat, I'm editing your page! -- [[micah]]
index d66ee9343296e61bbfff62a7128c76e95b8754a7..cf412d266f17b307ecd0b3732af3fd426a30ff62 100644 (file)
@@ -148,20 +148,22 @@ That is accomplished as follows:
 Be aware that the [[plugins/search]] plugin has to update the search index
 whenever any page is changed. This can slow things down somewhat.
 
-## profiling
+## cgi overload workaround
 
-If you have a repeatable change that ikiwiki takes a long time to build,
-and none of the above help, the next thing to consider is profiling
-ikiwiki. 
+If the ikiwiki.cgi takes a long time to run, it's possible
+that under load, your site will end up with many
+of them running, all waiting on some long-running thing,
+like a site rebuild. This can prevent the web server from doing anything
+else.
 
-The best way to do it is:
+A workaround for this problem is to set `cgi_overload_delay` to 
+a number of seconds. Now if ikiwiki.cgi would block waiting
+for something, it will instead display a Please wait message (configurable
+via `cgi_overload_message`, which can contain arbitrary html),
+and set the page to reload it after the configured number of seconds.
 
-* Install [[!cpan Devel::NYTProf]]
-* `PERL5OPT=-d:NYTProf`
-* `export PER5OPT`
-* Now run ikiwiki as usual, and it will generate a `nytprof.out` file.
-* Run `nytprofhtml` to generate html files.
-* Those can be examined to see what parts of ikiwiki are being slow.
+This takes very little load, as it all happens within compiled C code.
+Note that it is currently limited to GET requests, not POST requests.
 
 ## scaling to large numbers of pages
 
@@ -171,6 +173,12 @@ Finally, let's think about how huge number of pages can affect ikiwiki.
   new and changed pages. This is similar in speed to running the `find`
   command. Obviously, more files will make it take longer.
 
+  You can avoid this scanning overhead, if you're using git, by setting
+  `only_committed_changes`. This makes ikiwiki -refresh query git for
+  changed files since the last time, which tends to be a lot faster.
+  However, it only works if all files in your wiki are committed to git
+  (or stored in the [[/plugins/transient]] underlay).
+
 * Also, to see what pages match a [[ikiwiki/PageSpec]] like "blog/*", it has
   to check if every page in the wiki matches. These checks are done quite
   quickly, but still, lots more pages will make PageSpecs more expensive.
@@ -186,3 +194,18 @@ Finally, let's think about how huge number of pages can affect ikiwiki.
 
 If your wiki will have 100 thousand files in it, you might start seeing
 the above contribute to ikiwiki running slowly.
+
+## profiling
+
+If you have a repeatable change that ikiwiki takes a long time to build,
+and none of the above help, the next thing to consider is profiling
+ikiwiki. 
+
+The best way to do it is:
+
+* Install [[!cpan Devel::NYTProf]]
+* `PERL5OPT=-d:NYTProf`
+* `export PER5OPT`
+* Now run ikiwiki as usual, and it will generate a `nytprof.out` file.
+* Run `nytprofhtml` to generate html files.
+* Those can be examined to see what parts of ikiwiki are being slow.
diff --git a/doc/todo/Add_basename_in_edittemplate.mdwn b/doc/todo/Add_basename_in_edittemplate.mdwn
new file mode 100644 (file)
index 0000000..6f5b056
--- /dev/null
@@ -0,0 +1,8 @@
+I wanted to produce an external link from a ikiwiki Subpage based on
+the *basename* of the Subpage. So I added the following code to the
+edittemplate plugin:
+
+       my ($basename) = $page =~ m!.*/(.*)!;
+       $template->param(basename => $basename || $page);
+
+Is there any other way I could have achieved this? 
index d83c97add65026e649a19ba5a2331ec3a3440062..ac17f6745237a7c74b8c1e822d665f5a300fab63 100644 (file)
@@ -25,4 +25,7 @@ I think [mathjax](http://www.mathjax.org/) would be the best option. This is the
 
 > I've updated Jason Blevin's pandoc plugin to permit tighter integration between Ikiwiki and Pandoc. Given the features Pandoc has added over the past 6-12 months, this makes for a very powerful combination, e.g. with code block syntax highlighting and lots of options for how to process and display inline TeX. Both jsMath and MathJaX are supported, along with many other methods. See https://github.com/profjim/pandoc-iki for details. --Profjim
 
+> talking to my semantic-web/scientist colleagues, [math.js](http://mathjs.org)
+> is apparently the current state-of-the-art. -- [[Jon]].
+
 [[!tag wishlist]]
index 536980ea8e9cd4e44e5e8ad6b98f50473d91c56b..e07ad8ef9588eee70910bea361d16742dfa1db47 100644 (file)
@@ -81,3 +81,76 @@ This is what I do on my site for example. -- [[Jon]]
 >
 > (Admittedly, `page.tmpl` is the hardest to maintain a fork of, because it
 > tends to change whenever a new plugin is added...) --[[smcv]]
+
+----
+
+Here is a solution which doesn't require people to create their own
+`page.tmpl`.  The solution uses an HTML list together with CSS to draw the
+separator and can therefore be controlled by users.  This change also
+allows people to control other aspects of how the parentlinks are
+displayed.  The only drawback is that lynx/w3m don't seem to deal with this
+CSS feature, but I don't think it's too bad since the parentlinks will
+simply show up as a list.
+
+> I guess I could live with w3m having a second list at the top.
+> 
+> Does this method look identical in the default theme? What about the
+> other themes? Several of them do things with parentlinks css.. --[[Joey]]
+
+(I see that the other patch changes templates/misc.tmpl and
+templates/recentchanges.tmpl for INDEXLINK.  I haven't done that but can do
+so if [[Joey]] likes this approach.)
+
+> Those template no longer have the redundant stuff. --[[Joey]] 
+
+--[[tbm]]
+
+    diff --git a/doc/style.css b/doc/style.css
+    index 35a1331..b726365 100644
+    --- a/doc/style.css
+    +++ b/doc/style.css
+    @@ -129,6 +129,23 @@ pre {
+        overflow: auto;
+     }
+
+    +ul.parentlinks li:after {
+    +display: marker;
+    +content: "/ ";
+    +background: none;
+    +}
+    +
+    +ul.parentlinks li {
+    +display: inline;
+    +}
+    +
+    +ul.parentlinks
+    +{
+    +padding-left: 0;
+    +display:inline;
+    +list-style-type: none;
+    +}
+    +
+     div.recentchanges {
+        border-style: solid;
+        border-width: 1px;
+    diff --git a/templates/page.tmpl b/templates/page.tmpl
+    index 770ac23..f54493e 100644
+    --- a/templates/page.tmpl
+    +++ b/templates/page.tmpl
+    @@ -44,11 +44,15 @@
+     <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>
+    +<TMPL_IF PARENTLINKS>
+     <span class="parentlinks">
+    +<ul class="parentlinks">
+     <TMPL_LOOP PARENTLINKS>
+    -<a href="<TMPL_VAR URL>"><TMPL_VAR PAGE></a>/
+    +<li><a href="<TMPL_VAR URL>"><TMPL_VAR PAGE></a></li>
+     </TMPL_LOOP>
+    +</ul>
+     </span>
+    +</TMPL_IF>
+     <span class="title">
+     <TMPL_VAR TITLE>
+     <TMPL_IF ISTRANSLATION>
index b504698c495131cef5f594a4e60ad0ede279ccc2..6355867099fc133ad8e884ff09573432142818bc 100644 (file)
@@ -4,7 +4,7 @@ This seems somewhat difficult, as ikiwiki would need to maintain a cache of the
 
 --[[JoshTriplett]]
 
-[scmbug](http://www.mkgnu.net/?q=scmbug) might help here. --[[JoshTriplett]]
+[scmbug](http://www.mkgnu.net/scmbug) might help here. --[[JoshTriplett]]
 
 [[!tag soc]]
 
diff --git a/doc/todo/Calendar:_listing_multiple_entries_per_day_.mdwn b/doc/todo/Calendar:_listing_multiple_entries_per_day_.mdwn
new file mode 100644 (file)
index 0000000..ba01790
--- /dev/null
@@ -0,0 +1,94 @@
+[[!tag patch]]
+
+I am copying stuff discussed in the [[forum|/forum/Calendar:_listing_multiple_entries_per_day]], since the [[patch]] only list pages that are todo or bugs.
+
+If there are several pages created on the same date, the [[calendar directive|/ikiwiki/directive/calendar]] only display the first one.
+Here is a patch that:
+
+- if there is a single entry in one day, does not change anything (compared to the previous version of the calendar plugin);
+- if there are several entries, when mouse passes over the day, displays a popup listing all the entries of that day.
+
+That's all. No new pages for each day, takes as little space as it took before, and only a few lines more in the source.
+
+The only thing I am not totally happy with is the CSS. We have to say that the text is aligned on the left (otherwise, it is aligned on the right, as is each day of the calendar), but I do not know which place is the more sensible to put that line of CSS in.
+
+Regards,    
+-- Louis
+
+
+    diff --git a/IkiWiki/Plugin/calendar.pm b/IkiWiki/Plugin/calendar.pm
+    index d443198..2c9ed79 100644
+    --- a/IkiWiki/Plugin/calendar.pm
+    +++ b/IkiWiki/Plugin/calendar.pm
+    @@ -86,8 +86,11 @@ sub format_month (@) {
+               my $year  = $date[5] + 1900;
+               my $mtag  = sprintf("%02d", $month);
+     
+    -          # Only one posting per day is being linked to.
+    -          $linkcache{"$year/$mtag/$mday"} = $p;
+    +          # Several postings per day
+    +          if (! $linkcache{"$year/$mtag/$mday"}) {
+    +                  $linkcache{"$year/$mtag/$mday"} = [];
+    +          }
+    +          push(@{$linkcache{"$year/$mtag/$mday"}}, $p);
+       }
+               
+       my $pmonth = $params{month} - 1;
+    @@ -221,11 +224,36 @@ EOF
+                               $tag='month-calendar-day-link';
+                       }
+                       $calendar.=qq{\t\t<td class="$tag $downame{$wday}">};
+    -                  $calendar.=htmllink($params{page}, $params{destpage}, 
+    -                          $linkcache{$key},
+    -                          noimageinline => 1,
+    -                          linktext => $day,
+    -                          title => pagetitle(IkiWiki::basename($linkcache{$key})));
+    +                  if ( scalar(@{$linkcache{$key}}) == 1) {
+    +                          # Only one posting on this page
+    +                          my $page = $linkcache{$key}[0];
+    +                          $calendar.=htmllink($params{page}, $params{destpage}, 
+    +                                  $page,
+    +                                  noimageinline => 1,
+    +                                  linktext => $day,
+    +                                  title => pagetitle(IkiWiki::basename($page)));
+    +                  } else {
+    +                          $calendar.=qq{<div class='popup'>$day<div class='balloon'>};
+    +                          # Several postings on this page
+    +                          $calendar.=qq{<ul>};
+    +                          foreach my $page (@{$linkcache{$key}}) {
+    +                                  $calendar.= qq{\n\t\t\t<li>};
+    +                                  my $title;
+    +                                  if (exists $pagestate{$page}{meta}{title}) {
+    +                                          $title = "$pagestate{$page}{meta}{title}";
+    +                                  } else {
+    +                                          $title = pagetitle(IkiWiki::basename($page));
+    +                                  }
+    +                                  $calendar.=htmllink($params{page}, $params{destpage}, 
+    +                                          $page,
+    +                                          noimageinline => 1,
+    +                                          linktext => $title,
+    +                                          title => $title);
+    +                                  $calendar.= '</li>';
+    +                          }
+    +                          $calendar.=qq{\n\t\t</ul>};
+    +                          $calendar.=qq{</div></div>};
+    +                  }
+                       $calendar.=qq{</td>\n};
+               }
+               else {
+    diff --git a/doc/style.css b/doc/style.css
+    old mode 100644
+    new mode 100755
+    index 424d438..b52c72b
+    --- a/doc/style.css
+    +++ b/doc/style.css
+    @@ -323,6 +323,7 @@ div.progress-done {
+     .popup .paren,
+     .popup .expand {
+       display: none;
+    +  text-align: left;
+     }
+     .popup:hover .balloon,
+     .popup:focus .balloon {
+
+> [[applied|done]] --[[Joey]]
diff --git a/doc/todo/Fenced_code_blocks___40__from_GitHub_Flavored_Markdown__41__.mdwn b/doc/todo/Fenced_code_blocks___40__from_GitHub_Flavored_Markdown__41__.mdwn
new file mode 100644 (file)
index 0000000..24552b2
--- /dev/null
@@ -0,0 +1,44 @@
+GitHub's flavor of markdown adds fenced code blocks, delimited by triple-backquotes, like this:
+
+    ```
+    code
+    more code
+    ```
+
+That syntax proves quite a bit more convenient in many cases, because it doesn't require modifying every line of the code block to add indentation.  Please consider adding optional support for this in ikiwiki.  Please also consider turning it on by default for new wikis, though not for existing wikis since it could *potentially* break backward compatibility with existing content.
+
+> I don't think that's an official markdown feature, although it might be available
+> as an extension in some markdown library or other -- possibly one of the ones
+> supported by ikiwiki.
+> 
+> However, aside from compatability, ikiwiki already provides a way to do it that does not
+> require indenting the code: The [[ikiwiki/directive/format]] directive. Which has the benefit of
+> also telling it what kind of code it is, so it can syntax highlight it. Example:
+
+[[!format haskell """
+main :: IO ()
+main = forever $
+  putStrLn "hello, world!"
+"""]]
+
+> --[[Joey]]
+
+> > It is not a standard feature (as much as Markdown is [[standardized|Track_Markdown_Standardisation_Efforts]]...) But it does allow for [syntax hilightning](https://help.github.com/articles/github-flavored-markdown) too, just tag the language name after the backticks. It *seems* that Discount supports github-style backtick format (as well as Pandoc `~~~~` format) but doesn't allow the keyword argument.
+> > 
+> > I strongly support this feature. --[[anarcat]]
+> > 
+> > In fact, it turns out that it already works here!
+> >
+> > ~~~~
+> > this is a pandoc-style fenced in code block
+> > this is another line
+> > ~~~~
+> > 
+> > github-style backticks, however, do not add a wrapping `<pre>` block for some reason:
+> >
+> > ```
+> > this is a github-style fenced in code block
+> > this is another line
+> > ```
+> >
+> > ... maybe a bug in Discount... --[[anarcat]]
diff --git a/doc/todo/FormattingHelp_should_open_new_window.mdwn b/doc/todo/FormattingHelp_should_open_new_window.mdwn
new file mode 100644 (file)
index 0000000..58b4b68
--- /dev/null
@@ -0,0 +1 @@
+Currently the FormattingHelp link on the editing page takes you away from the editing page. The formattinghelp link should open in a new window, to allow the user to continue editing; wikipedia's edit page behaves this way.
diff --git a/doc/todo/Javascript_calendar.mdwn b/doc/todo/Javascript_calendar.mdwn
deleted file mode 100644 (file)
index 1b6eee4..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-[[!meta title="Javascript equivalent of plugin 'calendar'"]]
-[[!tag patch]]
-
-Hello,
-we ([[Grésille|http://www.gresille.org]]) have a calendar (built using the [[calendar|plugins/calendar]] plugin) in the sidebar of our website. This caused the whole website to be rebuilded each night, and we did not like it. So I wrote a javascript equivalent of the calendar plugin.
-
-Here are the differences compared to the [[calendar|plugins/calendar]] plugin.
-
-* Pros
-  * No need to rebuild the page containing the calendar each time day changes, or
-    a page (indexed by the calendar) is added, changed or deleted. This is
-    particularly useful if you want to have this calendar in the sidebar.
-  * Handles the case where several pages appear the same day: a popup appear to let user choose the day he wants.
-  * Smooth navigation among months.
-* Neutral
-  * Most of options are defined in Ikiwiki's setup files instead of the options
-    of the directive.
-* Cons
-  * As a consequence, every calendar of the wiki must index the same set of pages.
-  * Javascript :( .
-
-You can see this plugin in action on [[our website|http://www.gresille.org]]. To see what happens when several pages happens on the same day, check the 15th of March 2012.
-
-I do not know how contributions are processed, but if you want to include this plugin in Ikiwiki, I made a copy of Ikiwiki repository, with this new plugin (as well as the documentation for the plugin and the directive).
-
-    git clone http://spalax.homedns.org/git/ikiwiki
-
--- Spalax
diff --git a/doc/todo/Option_linktext_for_pagestats_directive.mdwn b/doc/todo/Option_linktext_for_pagestats_directive.mdwn
new file mode 100644 (file)
index 0000000..8bbb7c2
--- /dev/null
@@ -0,0 +1,196 @@
+[[!meta title="Option disp for pagestats directive"]]
+
+[[!toggle id=old text="Old, outdated, monologue"]]
+
+[[!toggleable id=old text="""
+Hello,    
+here is a proposal to add a new option to [[ikiwiki/directive]]
+[[ikiwiki/directive/pagestats]] (from plugin [[plugins/pagestats]]).
+
+This adds global option `pagestats_linktext` (and directive option `linktext`) to specify whether directive `pagestats` should use the page name or the [[title|ikiwiki/directive/meta]] of tags.
+
+Here is a [[patch]], for both code and documentation.
+
+    diff --git a/IkiWiki/Plugin/pagestats.pm b/IkiWiki/Plugin/pagestats.pm
+    index 17b26f7..a65fd7a 100644
+    --- a/IkiWiki/Plugin/pagestats.pm
+    +++ b/IkiWiki/Plugin/pagestats.pm
+    @@ -29,11 +29,31 @@ sub getsetup () {
+                       rebuild => undef,
+                       section => "widget",
+               },
+    +          pagestats_linktext => {
+    +                  type => "string",
+    +                  example => "title",
+    +                  description => "Set link text to be whether page title (page) or meta title (title).",
+    +                  safe => 1,
+    +                  rebuild => 1,
+    +          },
+    +}
+    +
+    +sub linktext ($$) {
+    +  # Return the text of the link to a tag, depending on option linktext.
+    +  use Data::Dumper;
+    +  my $page = $_[0];
+    +  my $linktype = $_[1];
+    +  if (($linktype eq "title") and (exists $pagestate{$page}{meta}{title})) {
+    +          return $pagestate{$page}{meta}{title};
+    +  } else {
+    +          return undef;
+    +  }
+     }
+     
+     sub preprocess (@) {
+       my %params=@_;
+       $params{pages}="*" unless defined $params{pages};
+    +  $params{linktext} = $config{pagestats_linktext} unless defined $params{linktext};
+       my $style = ($params{style} or 'cloud');
+       
+       my %counts;
+    @@ -78,7 +98,7 @@ sub preprocess (@) {
+               return "<table class='".(exists $params{class} ? $params{class} : "pageStats")."'>\n".
+                       join("\n", map {
+                               "<tr><td>".
+    -                          htmllink($params{page}, $params{destpage}, $_, noimageinline => 1).
+    +                          htmllink($params{page}, $params{destpage}, $_, noimageinline => 1, linktext => linktext($_, $params{linktext})).
+                               "</td><td>".$counts{$_}."</td></tr>"
+                       }
+                       sort { $counts{$b} <=> $counts{$a} } keys %counts).
+    @@ -101,8 +121,8 @@ sub preprocess (@) {
+                       
+                       $res.="<li>" if $style eq 'list';
+                       $res .= "<span class=\"$class\">".
+    -                          htmllink($params{page}, $params{destpage}, $page).
+    -                          "</span>\n";
+    +                                                  htmllink($params{page}, $params{destpage}, $page, linktext => linktext($page, $params{linktext})).
+    +                                                  "</span>\n";
+                       $res.="</li>" if $style eq 'list';
+     
+               }
+    diff --git a/doc/ikiwiki/directive/pagestats.mdwn b/doc/ikiwiki/directive/pagestats.mdwn
+    index 8d904f5..56970e6 100644
+    --- a/doc/ikiwiki/directive/pagestats.mdwn
+    +++ b/doc/ikiwiki/directive/pagestats.mdwn
+    @@ -37,4 +37,6 @@ links:
+     The optional `class` parameter can be used to control the class
+     of the generated tag cloud `div` or page stats `table`.
+     
+    +The optional `linktext` parameter can be used to control the text that is displayed for each tag. It can be `page` (the name of the page is used) or `title` (the title, according to the [[ikiwiki/directive/meta]] [[ikiwiki/directive]], is used). This option can be set globally in the setup using option `pagestats_linktext`; default is `page`.
+    +
+     [[!meta robots="noindex, follow"]]
+    diff --git a/doc/plugins/pagestats.mdwn b/doc/plugins/pagestats.mdwn
+    index 347e39a..6a72a9a 100644
+    --- a/doc/plugins/pagestats.mdwn
+    +++ b/doc/plugins/pagestats.mdwn
+    @@ -4,3 +4,7 @@
+     This plugin provides the [[ikiwiki/directive/pagestats]]
+     [[ikiwiki/directive]], which can generate stats about how pages link to
+     each other, or display a tag cloud.
+    +
+    +Their is one global option for the setup file:
+    +
+    +* `pagestats_linktext` controls the text that is displayed for each tag. If `page` (the default), the name of the page is used; if `title`, its title (according to the [[ikiwiki/directive/meta]] [[ikiwiki/directive]]) is used.
+
+-- [[Louis|spalax]]
+
+> Hello,    
+> do not accept my patch: it is an ugly hack that works for me, but its too narrow to be merged in IkiWiki:
+> 
+>   - it assumes the [[ikiwiki/directive/pagestats]] directive only deals with tags, which is wrong;
+>   - such a feature (allowing displaying tags using their title), if enabled, should be enabled for the [[plugins/tag]] plugin (and maybe other plugins [[I have in mind|users/spalax]]) as well.
+> 
+> I cannot manage to find a solution to my problem that suits me.
+> 
+> # My problem
+> 
+> On two sites I maintain using IkiWiki, I have tags that:
+> 
+> - have special characters in it (like [[·|http://en.wikipedia.org/wiki/Interpunct]]) that generate ugly URLs;
+> - have subtags (e.g. `math/calculus`, `math/algebra`, `physics/mechanic` etc.).
+> 
+> That is, having [[ikiwiki/directive/taglink]] or [[ikiwiki/directive/pagestats]] displaying tags using the pagename (that is something derived from the basename of the URL) is not sufficient for me. I would like to be able to display them using their title, their full name (from the `tagbase` parameter), or both.
+> 
+> # Solution?
+> 
+> A solution would be to provide a `tagtext` config option, set to one of `page` (use pagename), `title` (use [[ikiwiki/directive/meta]] title), `path` (use path, since the tagbase), `pathtitle` (use path, and use title for each of the subtags); or a boolean `display_tagtitle` and `display_tagpath`, which would handle the way tags are displayed.
+> 
+> I see at least two drawbacks to this solution:
+> 
+> - I do not know what would be the default of these options, not to break backward compatibility: [[ikiwiki/directive/taglink]] would suggest `page`, whereas the footer would suggest `path`.
+> - The [[ikiwiki/directive/pagestats]] directive would need an optional boolean parameter `tag`, to specify whether to use these options or not.
+> 
+> # *My* problem ?
+> 
+> I actually wonder if someone else also have this problem: as far as I can see on other sites using IkiWiki and tags, I would not be surprised if others are satisfyed with the current way tags are displayed: I do not remember having seen subtags, or tags in non-English language with weird characters in them.
+> 
+> So, I wonder whether this discussion would benefit IkiWiki, or if I should just go on with my hack (or maybe a plugin, but I think it would be quite difficult to do, given that the very same function is used to display tags and to uniquely identify them).
+> 
+> -- [[Louis|spalax]]
+"""]]
+
+I eventually managed to get something that suits me, for the problem described above (I want [[ikiwiki/directive/pagestats]] directive to display [[title|ikiwiki/directive/meta]] rather than page name).
+
+Here is a [[patch]] that adds an option `disp` for the [[ikiwiki/directive/pagestats]], acting exactly the same as option `show` for the [[ikiwiki/directive/map]] directive (but parameter `show` was already used for something else). That is, if one wants its tags displayed using their [[title|ikiwiki/directive/meta]] rather than their page name, she can use param `disp`, is in:
+
+    \[[!pagestats  pages="tags/*" disp=title]]
+
+[[!toggle id=patch text="Patch"]]
+[[!toggleable id=patch text="""
+    diff --git a/IkiWiki/Plugin/pagestats.pm b/IkiWiki/Plugin/pagestats.pm
+    index 17b26f7..8a5e100 100644
+    --- a/IkiWiki/Plugin/pagestats.pm
+    +++ b/IkiWiki/Plugin/pagestats.pm
+    @@ -31,6 +31,19 @@ sub getsetup () {
+               },
+     }
+     
+    +sub linktext ($%) {
+    +  # Return the text of the link to a tag, depending on option linktext.
+    +  my ($page, %params) = @_;
+    +  if (exists $params{disp} && 
+    +      exists $pagestate{$page} &&
+    +      exists $pagestate{$page}{meta}{$params{disp}}) {
+    +    return $pagestate{$page}{meta}{$params{disp}};
+    +  }
+    +  else {
+    +    return undef;
+    +  }
+    +}
+    +
+     sub preprocess (@) {
+       my %params=@_;
+       $params{pages}="*" unless defined $params{pages};
+    @@ -78,7 +91,7 @@ sub preprocess (@) {
+               return "<table class='".(exists $params{class} ? $params{class} : "pageStats")."'>\n".
+                       join("\n", map {
+                               "<tr><td>".
+    -                          htmllink($params{page}, $params{destpage}, $_, noimageinline => 1).
+    +                          htmllink($params{page}, $params{destpage}, $_, noimageinline => 1, linktext => linktext($_, %params)).
+                               "</td><td>".$counts{$_}."</td></tr>"
+                       }
+                       sort { $counts{$b} <=> $counts{$a} } keys %counts).
+    @@ -101,7 +114,7 @@ sub preprocess (@) {
+                       
+                       $res.="<li>" if $style eq 'list';
+                       $res .= "<span class=\"$class\">".
+    -                          htmllink($params{page}, $params{destpage}, $page).
+    +                                                  htmllink($params{page}, $params{destpage}, $page, linktext => linktext($page, %params)).
+                               "</span>\n";
+                       $res.="</li>" if $style eq 'list';
+"""]]
+
+Regards,  
+-- [[Louis|spalax]]
+
+> Saved to my git repository as `contrib/spalax/pagestats-disp`.
+> I'd rather find a better name than `disp` for the parameter.
+> I think `display` would be an improvement, but that doesn't solve the
+> problem of "it's a synonym for show, and non-obvious which is which".
+> Maybe `linktext`?
+> 
+> It's unfortunate that `map` and `pagestats` have different meanings for
+> the `show` parameter. I'm tempted to propose a patch that adds something
+> like `limit` (by analogy with SQL) or `max` as the canonical name for the
+> "number of things to match" parameter, at which point a non-numeric
+> `show` could mean this thing. --[[smcv]]
diff --git a/doc/todo/Protocol_relative_urls_for_stylesheet_linking.mdwn b/doc/todo/Protocol_relative_urls_for_stylesheet_linking.mdwn
new file mode 100644 (file)
index 0000000..ccbaf4e
--- /dev/null
@@ -0,0 +1,32 @@
+For security reasons, ikiwiki.cgi should only be accessed via HTTPS, which is easy to set in the config, however each wiki page contains
+
+    <link rel="stylesheet" href="http://ikiwiki.info/style.css" type="text/css" />
+    <link rel="stylesheet" href="http://ikiwiki.info/local.css" type="text/css" />
+
+regardless of whether the site is accessed via HTTP or HTTPS, which causes most modern browsers to automatically disable javascript and complain about the site only being partially encrypted. Features such as the openID-selector stop working unless the user manually allows the browser to execute unsafe scripts on the site.
+
+This can be fixed by setting the base wiki url to a protocol relative url, such as
+
+    //wiki.example.com
+
+but this breaks all sorts of things, like the 404 plugin and wiki rebuilds will throw the following perl warning several times:
+
+    Use of uninitialized value in string ne at /usr/share/perl5/IkiWiki.pm line 586
+
+> With a vaguely recent ikiwiki, if your `url` and `cgiurl` settings have the
+> same hostname (e.g.
+> `url => "http://www.example.com", cgiurl => "https://www.example.com/ikiwiki.cgi"`),
+> most links are path-only (e.g. `/style.css`), and in particular,
+> CGI-generated pages should generate those links. This was the implementation of
+> [[todo/want_to_avoid_ikiwiki_using_http_or_https_in_urls_to_allow_serving_both]].
+>
+> If your`$config{url}` and `$config{cgiurl}` have different hostnames (e.g.
+> `url => "http://wiki.example.com", cgiurl => "http://cgi.example.com/ikiwiki.cgi"`)
+> then you might still have this problem. In principle, IkiWiki could generate
+> protocol-relative URLs in this situation, but it isn't clear to me how
+> widely-supported those are.
+>
+> If you set both the `$config{url}` and `$config{cgiurl}` to https, but make
+> the resulting HTML available over HTTP as well as HTTPS, that should work
+> fine - accesses will be over http until the user either explicitly
+> navigates to https, or navigates to the CGI. --[[smcv]]
index 5fd787607198a234c0277045d28d5b4667de2d5c..b7723f91960e74286ef83f266448faefa85bc0c5 100644 (file)
@@ -48,3 +48,38 @@ Just brainstorming a bit after [[liw]]'s comment about this being useful on IRC,
 > and parameterize it using `$ENV{FOO}`, then you can build two different
 > setups from the same setup file.
 > --[[Joey]]
+
+> > My post-update script has grown a bit, as I'm using ikiwiki-hosting now, so want to let the users update stuff themselves:
+> > 
+> >     #!/bin/sh
+> >     
+> >     PUB_URL=http://truestedt.hands.com
+> >     PUB_TMPL=$HOME/source-public/templates-public
+> >     
+> >     # make the public config, in case of updates via ikiwiki-hosting
+> >     sed -e 's/^\(srcdir\|destdir\|git_wrapper\): .*/&-public/;s#^\(url:\).*#\1 '$PUB_URL'#;s/^\(cgi_wrapper:\).*/\1 '"''"'/;s#^\(templatedir:\).*#\1 '$PUB_TMPL'#;s/^\(cgiurl\|historyurl\):/#&/;/disable_plugins:/a \
+> >     - recentchanges\
+> >     - editpage' ~/ikiwiki.setup > ~/ikiwiki.setup-public
+> >     #echo 'wikistatedir: source/.ikiwiki-public' >> ~/ikiwiki.setup-public
+> >     [ -d ~/source-public ] || cp -a ~/source ~/source-public
+> >     [ -d ~/public_html-public ] || mkdir ~/public_html-public
+> >     
+> >     # run normal post-update hook
+> >     ./hooks/post-update-ikiwiki "$@"
+> >     
+> >     # run post-update hook for the public version of the site
+> >     ./hooks/post-update-ikiwiki-public "$@"
+> >     
+> >     exec git update-server-info
+> >
+> > I tried using wikistatedir, as you suggested, but then wiki edits are not reflected on the second site (AFAICT), so reverted to having a full checkout of the source.
+> > I'm guessing that that's because the second run through with the post-update hook sees no changes that it needs to worry about in the source directory, but it's just
+> > possible that I got confused while testing, as the sed is pretty fragile, so some of the time it was failing because of sed syntax errors.
+> >
+> > It strikes me that one ought to be able to have a plugin that takes the current config, applies a few minor tweaks to it (perhaps by loading an extra config file) and
+> > then does some or all of the tasks normally run by main() again, targeting a new directory -- that way there would be no need for the two post-updates, and whatever
+> > provoked a rebuild would always do both, whether on the command line or via CGI.
+> > I just don't know quite where the right place to plumb such a plugin in would be -- also, it would be good to separate out the bits of main() that we'd be calling
+> > so that both the plugin and main calls them in the same way, to ease future maintenance
+> >
+> > Any hints on where to start with such a plugin, gratefully received :-)  -[[fil]]
diff --git a/doc/todo/Restrict_formats_allowed_for_comments.mdwn b/doc/todo/Restrict_formats_allowed_for_comments.mdwn
new file mode 100644 (file)
index 0000000..9aee290
--- /dev/null
@@ -0,0 +1,99 @@
+I want to write my blog posts in a convenient format (Emacs org mode)
+but do not want commenters to be able to use this format for security
+reasons. This patch allows to configure which formats are allowed for
+writing comments.
+
+Effectively, it restricts the formats enabled with add_plugin to those
+mentioned in comments_allowformats. If this is empty, all formats are
+allowed, which is the behavior without this patch.
+
+The patch can be pulled from my repo ([gitweb](https://rtime.felk.cvut.cz/gitweb/sojka/ikiwiki.git/commitdiff/c42fd7d7580d081f3e3f624fd74219b0435230f6?hp=bfc9dc93c9f64a9acfff4683b69995d5a0edb0ea))
+
+    git pull git://rtime.felk.cvut.cz/sojka/ikiwiki.git restrict-comment-formats
+---
+
+<pre>
+From c42fd7d7580d081f3e3f624fd74219b0435230f6 Mon Sep 17 00:00:00 2001
+From: Michal Sojka <sojkam1@fel.cvut.cz>
+Date: Tue, 5 Mar 2013 10:54:51 +0100
+Subject: [PATCH] Add configuration to restrict the formats allowed for
+ comments
+
+I want to write my blog posts in a convenient format (Emacs org mode)
+but do not want commenters to be able to use this format for security
+reasons. This patch allows to configure which formats are allowed for
+writing comments.
+
+Effectively, it restricts the formats enabled with add_plugin to those
+mentioned in comments_allowformats. If this is empty, all formats are
+allowed, which is the behavior without this patch.
+---
+ IkiWiki/Plugin/comments.pm |   21 +++++++++++++++++++--
+ 1 file changed, 19 insertions(+), 2 deletions(-)
+
+diff --git a/IkiWiki/Plugin/comments.pm b/IkiWiki/Plugin/comments.pm
+index 285013e..151e839 100644
+--- a/IkiWiki/Plugin/comments.pm
++++ b/IkiWiki/Plugin/comments.pm
+@@ -90,6 +90,15 @@ sub getsetup () {
+                       safe => 0,
+                       rebuild => 0,
+               },
++              comments_allowformats => {
++                      type => 'string',
++                      default => '',
++                      example => 'mdwn txt',
++                      description => 'Restrict formats for comments to (no restriction if empty)',
++                      safe => 1,
++                      rebuild => 0,
++              },
++
+ }
+ sub checkconfig () {
+@@ -101,6 +110,8 @@ sub checkconfig () {
+               unless defined $config{comments_closed_pagespec};
+       $config{comments_pagename} = 'comment_'
+               unless defined $config{comments_pagename};
++      $config{comments_allowformats} = ''
++              unless defined $config{comments_allowformats};
+ }
+ sub htmlize {
+@@ -128,12 +139,18 @@ sub safeurl ($) {
+       }
+ }
++sub isallowed ($) {
++    my $format = shift;
++    return ! $config{comments_allowformats} || $config{comments_allowformats} =~ /\b$format\b/;
++}
++
+ sub preprocess {
+       my %params = @_;
+       my $page = $params{page};
+       my $format = $params{format};
+-      if (defined $format && ! exists $IkiWiki::hooks{htmlize}{$format}) {
++      if (defined $format && (! exists $IkiWiki::hooks{htmlize}{$format} ||
++                              ! isallowed($format))) {
+               error(sprintf(gettext("unsupported page format %s"), $format));
+       }
+@@ -332,7 +349,7 @@ sub editcomment ($$) {
+       my @page_types;
+       if (exists $IkiWiki::hooks{htmlize}) {
+-              foreach my $key (grep { !/^_/ } keys %{$IkiWiki::hooks{htmlize}}) {
++              foreach my $key (grep { !/^_/ && isallowed($_) } keys %{$IkiWiki::hooks{htmlize}}) {
+                       push @page_types, [$key, $IkiWiki::hooks{htmlize}{$key}{longname} || $key];
+               }
+       }
+-- 
+1.7.10.4
+
+</pre>
+
+[[!tag patch]]
+
+> [[done]] --[[Joey]]
index 9c1889d63b88d40cba94cd58cc1e464e0962c2fb..20b59cb13f396566a4d33f7fa21c203caacbdec0 100644 (file)
@@ -37,3 +37,6 @@ much more maintainable htaccess file.
 
 >>>> Yes, I think this could probably be used in combination with ikiwiki's
 >>>> httpauth and openid plugins. --[[Joey]] 
+
+>>>>> If you use the httpauth and the cgiauthurl method, you can restrict a path 
+>>>>> like /private/* to be accessible only under the authenticated request uri.
index a4940220adef0fabdbc10175f27c5bfe5e198df9..b7ff82282ed04078907ef889a14538004c6b6cd5 100644 (file)
@@ -13,6 +13,8 @@ A slightly more complex next step would be to request sreg from the provider and
 > implemented as a badly-done wart on the side of their regular login
 > system.
 > 
+> > If there are user profiles on the site with non-empty information associated with them (including permissions, reputation), then it would make more sense to be able to access your user profile with alternative OpenIDs (in case one of the provider goes down), as on <http://stackoverflow.com>. In ikiwiki, there might be no such special information associated with users (or you can think of something like this?), except for the admin rights. But fortunately, several OpenIDs can be set up for admins in ikwiki. (Only if it comes to [the OpenIDs provided by Gmail][forum/google openid broken?], then it turns out to be unhandy to write the ID into the configuration file as a second admin ID.)--Ivan Z.
+> 
 > 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).
index e679d98e02dc71d03df637b21242860c2162f0d1..1fa710f8f8f184a4e75ff98b4a34c544d1631bbd 100644 (file)
@@ -37,3 +37,27 @@ I've written a new plugin, sectiontemplate, available in the `page_tmpl` branch
 >>>>> I've implemented this functionality as part of `pagetemplate` as on my "pagetemplate" branch of ikiwiki at https://github.com/rubykat/ikiwiki/tree/pagetemplate - do you want to pull this, Joey?
 >>>>> It isn't implemented quite the same way as Will did; I have the template name first and the pagespec last, but it does the same thing.
 >>>>> --[[KathrynAndersen]]
+
+Just a quick note that Kathryn's branch is ready.[[!template id=gitbranch branch=rubykat/pagetemplate author="[[KathrynAndersen]]"]][[!tag patch]] --[[Will]]
+
+> Review:
+>
+> The indentation seems odd. IkiWiki is mostly indented with hard tabs;
+> this seems to be a mixture of tabs and spaces, assuming 4 spaces per tab.
+>
+> [[!format perl """
+sub checkconfig () {
+...
+               ! defined IkiWiki::template_file($tmpl))
+"""]]
+>
+> I think `checkconfig` is too soon to rely on `template_file`
+> producing correct results? It looks in `%pagesources` which has not
+> yet been updated.
+>
+> If we had a "just before building" hook, that would be a good time
+> to emit warnings; or doing it once per run, on-demand, triggered
+> by the first call to the `templatefile` hook could work. Or the
+> hook could just silently ignore bad pagespecs?
+>
+> --[[smcv]]
diff --git a/doc/todo/Support_clipboard_copy__47__paste_of_images.mdwn b/doc/todo/Support_clipboard_copy__47__paste_of_images.mdwn
new file mode 100644 (file)
index 0000000..ff2eeb8
--- /dev/null
@@ -0,0 +1,3 @@
+Using one of the strategies described here: http://stackoverflow.com/questions/6333814/ ... we could support copying/pasting images from the clipboard (in supported browsers).
+
+[[!tag wishlist]]
diff --git a/doc/todo/Track_Markdown_Standardisation_Efforts.mdwn b/doc/todo/Track_Markdown_Standardisation_Efforts.mdwn
new file mode 100644 (file)
index 0000000..54a6159
--- /dev/null
@@ -0,0 +1,7 @@
+Just a quick note that some people are making noise about Markdown standardisation.  Specifically:
+
+  * <http://markdown.github.com/>
+  * <http://www.codinghorror.com/blog/2012/10/the-future-of-markdown.html>
+  * <http://johnmacfarlane.net/babelmark2/faq.html#what-are-some-big-questions-that-the-markdown-spec-does-not-answer>
+
+It might be worth following...
diff --git a/doc/todo/Using_page_titles_in_internal_links.mdwn b/doc/todo/Using_page_titles_in_internal_links.mdwn
new file mode 100644 (file)
index 0000000..6e1438b
--- /dev/null
@@ -0,0 +1,3 @@
+It would be really nice if, should a page happen to have a title metavariable then links to that page which do not explicitly state a title would use it. -- Daniel Silverstone
+
+> i like the idea for some applications, but i'm afraid there would be lots of cases where it wouldn't be appropriate to happen automatically, first and foremost capitalization. a syntax like ``\[[|that page]]`` might still be available, as the current implementation assumes the ``|`` character to be part of the page name. --[[chrysn]]
diff --git a/doc/todo/Zoned_ikiwiki.mdwn b/doc/todo/Zoned_ikiwiki.mdwn
new file mode 100644 (file)
index 0000000..26260b2
--- /dev/null
@@ -0,0 +1,64 @@
+The idea behind this would be to have one ikiwiki behave as a dynamic private wiki in a specified area
+and a more static publiczone wiki. Actually private wiki page can be addressed via a *pagespec*. 
+
+What is ready /can be done:
+
+* We already can more or less do this for example with [[httpauth|/plugins/httpauth/]], *.htaccess* files and a proper *httpauth_pagespec*
+yet at the cost of maintaining two different user/pass logbase (native ikiwiki signin)
+* Furthermore we can [[lockedit|plugins/lockedit/]] some pagespecs, ie in the public zone.
+
+What is problematic is when you link a public page in a private page : 
+a backlink will be generated from the public page to the private page.
+
+As I noticed in [[per_page_ACLs]] in the end users through backlink 
+navigation will frequently hit HTTP/401 deterring browsing as well as for the admin at false-positive logwatching.
+
+One can radically [[disable backlinks feature|todo/allow_disabling_backlinks]] but then no more neat backlink navigation that
+is really good to have in both area.
+
+I think of just preventing this backlink leak in that case would be sufficient via i.e a *privatebacklinks* config and
+a below patch.
+
+Comments are welcome.
+
+[[mathdesc]]
+
+
+<pre>
+diff --git a/IkiWiki.pm b/IkiWiki.pm
+--- a/IkiWiki.pm
++++ b/IkiWiki.pm
+@@ -294,6 +294,14 @@ sub getsetup () {
+                safe => 1,
+                rebuild => 1,
+        },
++       privatebacklinks => {
++               type => "pagespec",
++               example => "",
++               description => "PageSpec controlling which backlinks are private (ie users/*)",
++               link => "ikiwiki/PageSpec",
++               safe => 1,
++               rebuild => 1,
++       },
+        hardlink => {
+                type => "boolean",
+                default => 0,
+diff --git a/IkiWiki/Render.pm b/IkiWiki/Render.pm
+--- a/IkiWiki/Render.pm
++++ b/IkiWiki/Render.pm
+@@ -52,7 +52,8 @@ sub backlinks ($) {
+                        $p_trimmed=~s/^\Q$dir\E// &&
+                        $page_trimmed=~s/^\Q$dir\E//;
+                               
+-               push @links, { url => $href, page => pagetitle($p_trimmed) };
++               push @links, { url => $href, page => pagetitle($p_trimmed) }
++               unless defined $config{privatebacklinks} && length $config{privatebacklinks} && pagespec_match($p, $config{privatebacklinks}) && !pagespec_match($page, $config{privatebacklinks}) ;
+        }
+        return @links;
+ }
+
+</pre>
+
+> Have you considered all the ways that anyone with edit access to the
+> public wiki could expose information from the public wiki? For example,
+> you could inline all the private pages into a public page. --[[Joey]] 
index b3804d652d3ca87e84f155a402fc9c3919f47182..dd007b97de4c392c1926cb03377ad0e4d4b9acdd 100644 (file)
@@ -3,9 +3,6 @@ to the [[`meta`_plugin|plugins/meta]].
 
 > [[done]], with some changes --[[Joey]]
 
-Find the most recent version at
-<http://schwinge.homeip.net/~thomas/tmp/meta_forward.patch>.
-
 I can't use `scrub(...)`, as that will strip out the forwarding HTML command.
 How to deal with that?
 
diff --git a/doc/todo/ad-hoc_plugins.mdwn b/doc/todo/ad-hoc_plugins.mdwn
new file mode 100644 (file)
index 0000000..da28c1b
--- /dev/null
@@ -0,0 +1,66 @@
+with pypy's sandbox module, it is possible to run user supplied code safely; that can be used for ad-hoc [[!taglink plugins]].
+
+ad-hoc plugins are little code snipplets that work similar to plugins, are limited in what they can do, but their code resides inside the wiki.
+
+## use cases
+
+* calendar modules for non-standard calendars.
+
+  an article mentioning Maladay could note it as `\[[!template id=discdate date="The Aftermath 5, 579 YOLD"]]`, which could run a script parsing the date and showing an appropriate gregorian daten in parentheses after the date in [[!wikipedia Discordian calendar]]
+
+* url operations for services that don't use the widespread url calculation patterns
+
+  a template for geocoordinates that offers links to various geo-services could take various input formats and generate urls like http://geohash.org/u2edk850cxh31 from `\[[!template id=geoinfos n=48.2081743 e=16.3738189]]`.
+
+## implementation in ikiwiki
+
+### `\[[!pythontemplate id=foo arg=value]]`
+
+the easiest way to enable ad-hoc plugins that came to my mind was creating a plugin like template, pythontemplate, that uses the same calling convention as the template plugin. i have implemented the plugin in perl, in a way that doesn't need any additional python code apart from what is shipped in pypy (in the [[!debpkg python-pypy.translator.sandbox]] package). the implementation is far from mature, but works.
+
+### `\[[!foo argument option=value]]`
+
+an implementation in the style of the [[ikiwiki/directive/shortcut]] directive would be easier to use, and would allow positional arguments too. (the template way of calling, with id= identification, requires parsing all arguments to a hash).
+
+### `hook(type="preprocess", id="foo", call=preprocess)`
+
+if one was to allow more features to wiki editors, one could even export the ikiwiki rpc api to python pages. (pages would get their `import()` function called via rpc, and coold `hook` into ikiwiki.) the security implications of such a feature would be much harder to overview, though, and the rpc would probably need filtering mechanisms.
+
+## implementation in python
+
+on the python side, i've prepared a `pythontemplate` module that can be imported from the template python programs. for example, it contains an argparse module that's adapted to ikiwiki specifics by formatting help output in a way suitable for wiki inclusion, and that silently handles the `page` and `destpage` options.
+
+The discordian calendar described above could look like this:
+
+    """Explain dates in discordian calendar"""
+    from pythontemplate.argparse import ArgumentParser
+    p = ArgumentParser(description=__doc__)
+    p.add_argument("--date", help="Date in discordian calendar")
+    
+    args = p.parse_args()
+    
+    def convert_date(...):
+        ...
+    
+    print "%s <small>(%s)</small>"%(args.date, convert_date(args.date))
+
+Using argparse might be a bit of overkill here, but has the nice property of enabling `\[[!pythontemplate id=discdate help=true]]` for a documentation page.
+
+## security implications
+
+a simple implementation like my current one or a shortcut-style one is secure by design:
+
+* the perl module decides which python script inside the wiki is to be executed. it takes the arguments to preprocess and prepares them being passed over to the script in argv.
+* the perl module launches the secure pypy-sandbox. it tells it to allow read access to the script itself and the python library, and to run the script in an otherwise isolated environment. it passes the arguments by means of argv, receives the resulting html+directive text from stdout, and evaluates the return status and stderr in case of problems.
+
+time and memory limits can be passed to the sandbox process, so the worst thing a wiki editor could do would be to use up both resources to the defined limit whenever someone edits a page triggering the script.
+
+some details on pypy-sandbox internals:
+
+an interact script provides an "operating system" to the pypy sandbox binary itself, which it launches. the only syscalls the sandbox binary can do are stdio read/write, and every time the script being run inside wants to do something that would normally trigger a syscall, it talks to the interact script. for example, if the script tries to import the library, the binary asks the interact script for a file handle using an open() line, and the interact script will look in the virtual filesystem it keeps if such a file is present there. (it is, as it was instructed thus by the perl module).
+
+## performance / optimizations
+
+the current implementation amounts to an invocation to classical python and another invocation to pypy per directive. this also means that pypy will never get to play its big strength, just in time optimization.
+
+running a complete foreign language plugin using the xmlrpc interface in the sandbox would alleviate the problem, but the security implications would be difficult. a middle path (running a single pypy sandbox binary per ikiwiki run, but still calling into it only for directive evaluation) seems feasible. there is no direct support for such a thing in pypy yet, but it shouldn't be too hard to do, and even if the separations between the individual directive evaluations could be torn down from inside, the worst thing an attacker could do would be to have side effects between different directive evaluations).
diff --git a/doc/todo/add_remove_to_actionlist.mdwn b/doc/todo/add_remove_to_actionlist.mdwn
new file mode 100644 (file)
index 0000000..b50fe88
--- /dev/null
@@ -0,0 +1,20 @@
+[[!template id=gitbranch branch=jon/remove_action author="[[Jon]]"]]
+
+The "remove" plugin allows one to remove pages via the web, but you first have
+to click on 'edit' to get to the 'remove' button. This is a bit
+counter-intuitive, and ikiwiki has an action list, so it would be good if
+"remove" (and also "rename" for that plugin) added items to the action list.
+
+First cut series of patches in the indicated branch.  A bit more review is
+needed, in my tests removals work and are committed to the vcs but
+recentchanges isn't regenerated for some reason (probably the constructed `<a>`
+link needs to add/adjust the parameters to emulate a formbuilder form
+submission more carefully).
+
+I haven't begun on the 'rename' plugin. -- [[Jon]]
+
+[[!tag wishlist patch]]
+
+> I accidentally pushed an incomplete patch to that branch that starts the
+> work of doing the same for rename, but it's not working yet, to merge one
+> would need to cherry-pick the other patches for now. Sorry. -- [[Jon]]
diff --git a/doc/todo/allow_TMPL__95__LOOP_in_template_directives.mdwn b/doc/todo/allow_TMPL__95__LOOP_in_template_directives.mdwn
new file mode 100644 (file)
index 0000000..890c4cf
--- /dev/null
@@ -0,0 +1,278 @@
+[[!tag patch todo]]
+
+[[!template id="note" text="""
+Simply copied this from my website
+[[http://www.camco.ie/code/ikiwiki,3.20120202,20120313a/]]
+feel free to reformat / delete"""]]
+
+The following re-write allows for multiple definitions of the
+same tag value in a [[plugins/template]] definition.  This, in turn, allows
+us to use TMPL_LOOPS in our [[ikiwiki/directive/template]] directives; all-be-it in a
+rather limited way.
+
+> I'm willing to consider such a feature, but it needs to be presented in
+> the form of a patch that is reviewable, not a gratuitous rewrite.
+> --[[Joey]] 
+
+>> Yes, my apologies for that.  The two worker functions `mktmpl_hash`
+and `proc_tmpl_hash` are new.  The `preprocess` function then starts
+by arranging the parameters into an array.  This array is passed to the
+`mktmpl_hash` and it creates a hash, suitable for passing into the
+HTML::Template directly.  The `proc_tmpl_hash` then walks the hash
+structure and processes the parameters.
+
+>> I know ... you weren't looking for an explanation, just a patch
+... totally understand.  Point I'm trying to make, it's a 90% re-write
+anyway (and my `style(8)` will probably piss most people off).
+
+>> Anyway, would love to contribute so will try to get to doing this
+"correctly" and post as a patch.
+
+I would, personally, only use this feature for very basic loops
+and, although nested loops *might* be possible (with a little
+more tinkering) it think any attempt would be better served by
+[[Kathyrn Anderson's|http://www.katspace.org/]] [[field et
+al.|http://ikiwiki.info/plugins/contrib/field/]] plugin.
+
+It *is* (primarily) intended to allow insertion of organised CSS
+blocks (i.e. `<div>`) through template directives (since i can't
+seem to get HTML and Markup to mix the way I want).
+
+[[!template id="note" text="""
+Apologies for the re-write.  I struggle reading perl code that
+I didn't write and (probably too often) re-format to reduce my
+head-aches.  Anyway it didn't make sense to post the patch since
+everything's changed now.
+"""]]
+
+NB: this *should* be 100% backwards compatible.
+
+# `lib/perl5/IkiWiki/Plugin/template.pm`
+
+[[!format perl """
+
+       #!/usr/bin/perl
+       # Structured template plugin.
+       package IkiWiki::Plugin::template ;
+
+       use warnings ;
+       use strict ;
+       use IkiWiki 3.00 ;
+       use Encode ;
+
+       sub mktmpl_hash( $ ; $ ; @ ) ;
+                               # declare to supress warning in recursive call
+       sub mktmpl_hash( $ ; $ ; @ )
+                               # make hash for the template, filling
+                               # values from the supplied params
+       {
+               my $template = shift( @_ )
+                               || error( "mktmpl_hash: no template provided" ) ;
+               my $param_src = shift( @_ )
+                               || error( "mktmpl_hash: no parameters" ) ;
+
+               my $path ;
+               if( $#_ > 0 )
+               {
+                       $path = [ @_ ] ;
+               } else {
+                       $path = shift(@_) || [] ;
+               } ;
+
+               my %params ;
+
+               my @path_vars ;
+               if( $#{$path} < 0 )
+               {
+                       @path_vars = $template->query() ;
+               } else {
+                       @path_vars = $template->query( loop => $path ) ;
+               } ;
+
+               foreach my $var ( @path_vars )
+               {
+                       push( @{$path}, $var ) ;
+                       my $param_type = $template->query( name => $path ) ;
+                       if( $param_type eq 'VAR' )
+                       {
+                               my @var_path = split( /_/, $var ) ;
+                               if( $var_path[0] ne '' )
+                               {
+                                       $path->[-1] = join( '_', @var_path[1..$#var_path] )
+                                               if( $var_path[0] eq 'raw' ) ;
+                                       $params{$var} = shift( @{$param_src->{$path->[-1]}} )
+                                                       || return(undef) ;
+                               } ;
+                       } elsif( $param_type eq 'LOOP' )
+                       {
+                               $params{$var} = [] ;
+                               push( @{$params{$var}}, $_ )
+                                       while( $_ = mktmpl_hash($template,$param_src,$path) ) ;
+                       } ;
+                       pop( @{$path} ) ;
+               } ; 
+               return( \%params ) ;
+       } ;
+
+       sub proc_tmpl_hash( $ ; $ ; $ ; $ ) ;
+                               # declare to supress warning in recursive call
+       sub proc_tmpl_hash( $ ; $ ; $ ; $ )
+                               # walk the hash, preprocess and
+                               # convert to html
+       {
+               my $tmpl_hash = shift( @_ ) ;
+               my $page = shift( @_ ) ;
+               my $destpage = shift( @_ ) ;
+               my $scan = shift( @_ ) ;
+               foreach my $key ( keys(%{$tmpl_hash}) )
+               {
+                       unless( ref($tmpl_hash->{$key}) )
+                                               # here we assume that
+                                               # any reference is an
+                                               # array and allow it to
+                                               # fail if that's false
+                       {
+                               $tmpl_hash->{$key} =
+                                               IkiWiki::preprocess(
+                                                               $page,
+                                                               $destpage,
+                                                               $tmpl_hash->{$key},
+                                                               $scan ) ;
+                               my @key_path = split( /_/, $key ) ;
+                               $tmpl_hash->{$key} =
+                                               IkiWiki::htmlize(
+                                                               $page,
+                                                               $destpage,
+                                                               pagetype($pagesources{$page}),
+                                                               $tmpl_hash->{$key}, )
+                                       unless( $key_path[0] eq 'raw' ) ;
+                       } else {
+                               proc_tmpl_hash( $_, $page, $destpage, $scan )
+                                       foreach( @{$tmpl_hash->{$key}} ) ;
+                       } ;
+               } ;
+       } ;
+
+       # "standard" ikiwiki definitions / hooks
+
+       sub import
+       {
+               hook( type => "getsetup",
+                               id => "template",
+                               call => \&getsetup ) ;
+               hook( type => "preprocess",
+                               id => "template",
+                               call => \&preprocess,
+                               scan => 1 ) ;
+       } ;
+
+       sub getsetup()
+       {
+               return(
+                               plugin => {
+                                       safe => 1,
+                                       rebuild => undef,
+                                       section => "widget",
+                               }, ) ;
+       } ;
+
+       sub preprocess( @ )
+       {
+       # first process arguments into arrays of values
+               my %params ;
+
+               my( $key, $value ) ;
+               while( ($key,$value)=splice(@_,0,2) )
+               {
+                       if( exists($params{$key}) )
+                       {
+                               push( @{$params{$key}}, $value ) ;
+                       } else {
+                               $params{$key} = [ $value ] ;
+                       } ;
+               } ;
+
+       # set context
+               my $scan = ! defined( wantarray() ) ;
+                                       # This needs to run even in scan
+                                       # mode, in order to process links
+                                       # and other metadata included via
+                                       # the template.
+
+       # check for critical values
+               if( ! exists($params{id}) )
+               {
+                       error( gettext("missing id parameter") ) ;
+               } ;
+
+       # set some convenience variables
+               my $id = $params{id}->[$#{$params{id}}] ;
+               my $page = $params{page}->[$#{$params{page}}] ;
+               my $destpage = $params{destpage}->[$#{$params{destpage}}] ;
+       # ... and an essential one for the production pass
+               $params{basename} = [ IkiWiki::basename($page) ] ;
+
+       # load the template
+               my $template ;
+               eval {
+                       $template =
+                                       template_depends( $id, $page,
+                                                       blind_cache=>1 ) ;
+                                               # The bare id is used, so
+                                               # a page templates/$id can
+                                               # be used as the template.
+               } ;
+               if( $@ )
+               {
+                       error(
+                                       sprintf(
+                                                       gettext("failed to process template %s"),
+                                                       htmllink(
+                                                                       $page,
+                                                                       $destpage,
+                                                                       "/templates/$id")
+                                                       )." $@"
+                                       ) ;
+               } ;
+
+       # create and process the parameters
+               my $tmpl_hash = mktmpl_hash( $template, \%params ) ;
+               proc_tmpl_hash( $tmpl_hash, $page, $destpage, $scan ) ;
+       # ... and load the template with the values
+               $template->param( $tmpl_hash ) ;
+
+       # return the processed page chunk
+               return( IkiWiki::preprocess($page,
+                                               $destpage,
+                                               $template->output(),$scan)
+                               ) ;
+       } ;
+
+       1 ;
+
+"""]]
+
+## sample template
+
+       # <TMPL_VAR HEADER0>
+
+       <table>
+       <TMPL_LOOP TEST0>
+       <tr>
+               <td><TMPL_VAR DATA0></td>
+               <td><TMPL_VAR DATA1></td>
+       </tr>
+       </TMPL_LOOP>
+       </table>
+
+## sample iki page
+
+       \[[!meta title="this is my loops page"]]
+
+       \[[!template id="loops"
+       header0="this is a table"
+       data0="cell0:0"
+       data1="cell0:1"
+       data0="cell1:0"
+       data1="cell1:1"
+       ]]
diff --git a/doc/todo/allow_banning_a_user_when_moderating_a_comment.mdwn b/doc/todo/allow_banning_a_user_when_moderating_a_comment.mdwn
new file mode 100644 (file)
index 0000000..c0b85ec
--- /dev/null
@@ -0,0 +1 @@
+If a logged-in user is both a comment moderator and an admin, it would be nice if you could tick a box to ban the poster of a comment (or their IP if not signed in. Or their IP, AND their login if signed in, I suppose.) via the comment moderation interface.  Presently, you must view the back-end files to establish who posted the comment (the IP is not exposed in the moderation interface yet.) — [[Jon]]
diff --git a/doc/todo/allow_option_for_requiring_description_when_editing_page.mdwn b/doc/todo/allow_option_for_requiring_description_when_editing_page.mdwn
new file mode 100644 (file)
index 0000000..bb85248
--- /dev/null
@@ -0,0 +1,24 @@
+allow option for requiring description when editing page. This is so if a commit to an rcs is used, the commit message will not be blank.
+
+> Duplicate of [[todo/Allow_web_edit_form_comment_field_to_be_mandatory]] where
+> Joey indicated that he didn't want this in ikiwiki core, but would
+> accept a plugin that did it.
+>
+> Expanding on what Joey said there a little, the problem I have with
+> *requiring* a commit message is that solving a social problem
+> by technical means rarely works. If you can't persuade users
+> to obey a policy like "provide a nonempty commit message", then
+> you can't persuade them to obey a policy like "provide a *useful*
+> nonempty commit message" either. I used to work on a project
+> whose Bugzilla had been configured or patched to require a comment
+> whenever you changed a field (e.g. priority, cc, ...) and in
+> practice that just led to a lot of wasted time when people tried
+> to triage bugs quickly, and a lot of comments whose text was
+> ".", " ", or on at least one occasion, ☃
+> (U+2603 SNOWMAN).
+>
+> If your chosen RCS has a technical constraint that the commit
+> message must be non-empty (and will just not work otherwise),
+> that's another matter; I'd say that in that situation
+> it's appropriate for its plugin to replace empty commit
+> messages with "." or gettext("update") or something. --smcv
index b0524be5fcabfba5b66ef671ddebab6eb0645eb4..e39d4c19b1d15a8680d96fbd7645810aaa5a9c37 100644 (file)
@@ -24,7 +24,7 @@ You might look at the Wikipedia page on "Spam\_in\_blogs" for more ideas.  In pa
 Ikiwiki now has a checkcontent hook that plugins can use to see content
 that is being entered and check it for spam/whatever.
 
-There is a blogspam plugin that uses the blogspam.org service
+There is a [[plugins/blogspam]] plugin that uses the blogspam.org service
 to check for common spam signatures. --[[Joey]] 
 
 [[done]]
index a0405472b64110f0e6ee210d4b92384964a105ce..63ffccf0d8d41abf24df21adf78d0a3463af74bd 100644 (file)
@@ -13,4 +13,8 @@ The installed bin/ikiwiki file also refers to /usr/bin/perl rather than the perl
 > yours, but do not plan to work on it myself, since I do not use systems
 > where /usr/bin/perl is not a sane default. --[[Joey]]
 
+> > I've implemented a change that should fix this.  For what it's worth this is a
+> > life saver on shared hosting where building your own perl is super effective.
+> > --frioux ([code here](https://github.com/frioux/ikiwiki/tree/use-env-perl))
+
 [[wishlist]]
index 600c6cf7be58c043361d2d62c22222b9b07986e2..bb0221d72a4542745fb91748d44d908d8c6847d9 100644 (file)
@@ -7,6 +7,7 @@ nice to add:
   position in the page edit form, without actually reposting the form.
   (Falling back to the current reposting of the form if javascript is not
   available of course.)
+* Allow files to be attached from the add comments form, as well as the edit page.
 * An option to not `rcs_add` new attachments, but just write them to the
   srcdir. This would allow the admin to review them, and manually
   add/delete them before they bloat history.
index 7a5a17517cb49282a4ba5a9a5d27ec5b67c987a4..09e8b087357c658b1d8c723f34163da073836caa 100644 (file)
@@ -29,5 +29,13 @@ The date for publishing and expiring could be set be using some new directives;
 > 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]] 
+>
+
+> Some times ago, I wrote a Pagespec function that matches pages that have
+> creation date in the future: [[plugins/contrib/created_in_future/]]. It can
+> be used to solve part of the original problem: publication on some date. For
+> unpublication, I think that my plugin is not sufficient.
+> 
+> -- [[Louis|spalax]]
 
 [[!tag wishlist]]
diff --git a/doc/todo/avatar/discussion.mdwn b/doc/todo/avatar/discussion.mdwn
new file mode 100644 (file)
index 0000000..568866f
--- /dev/null
@@ -0,0 +1 @@
+It seems that this thing is on by default. How to turn it off?
index fdaa09f26fac39d797367b7c9c53808000a54c03..084c6fd164629eb7dd03a5d524e987e239cb2184 100644 (file)
@@ -123,3 +123,7 @@ Footer example:
 -- [[KathrynAndersen]]
 
 [[!tag wishlist]]
+
+> I am stumbling upon this discussion, and I noticed that I implemented part of [[KathrynAndersen]] idea in the [[plugins/contrib/sidebar2]] [[plugin|plugins]]. Using this plugin, you can have several sidebars, which are included only in pages matching some pagespec.
+> 
+> [[Louis|spalax]]
diff --git a/doc/todo/bitcoin_URI_scheme.mdwn b/doc/todo/bitcoin_URI_scheme.mdwn
new file mode 100644 (file)
index 0000000..a0f3e11
--- /dev/null
@@ -0,0 +1,16 @@
+This is a tiny feature request:
+
+add the bitcoin URI scheme [1] to ikiwiki.
+
+This can be done by adding '"bitcoin",' to Ikiwiki/Plugin/htmlscrubber.pm
+
+-              "aim", "callto", "cvs", "ed2k", "feed", "fish", "gg",
+to
++              "aim", "bitcoin", "callto", "cvs", "ed2k", "feed", "fish", "gg",
+
+thanks
+
+flowolf
+[1]: http://en.wikipedia.org/wiki/URI_scheme
+
+> I agree and this was important enough to fire up the ol' wayback machine, set the dial to one year ago today, and fix it then, in version 3.20130212. [[done]]. As a bonus, in this new hardforked casuality chain, someone sent me half a bitcoin using this feature. --[[Joey]]
diff --git a/doc/todo/break_up_page_template_into_subfiles.mdwn b/doc/todo/break_up_page_template_into_subfiles.mdwn
new file mode 100644 (file)
index 0000000..e9f2e31
--- /dev/null
@@ -0,0 +1,36 @@
+Wishlist items such as [[Add space before slash in parent links]] would be
+easier to deal with if the page.tmpl template was broken up into sections
+and each section had a separate template file which was included in the
+master page.tmpl file.  This would make it easier to customize parts of a
+page without having to fork the whole page.tmpl and then have things break
+when there's an update of the master page.tmpl file.
+
+Suggested sections:
+
+* page_head.tmpl for the things in the <head> section
+* page_header.tmpl for things in the "header" div (which includes the PARENTLINKS loop)
+* page_actions.tmpl for the actions section
+* page_sidebar.tmpl for the sidebar
+* page_content.tmpl for the main content
+* page_footer.tmpl for the footer
+
+Would this work, or would HTML::Template have problems with this?
+
+-- [[KathrynAndersen]]
+
+> Well, breaking it up into 6 sections would let a user modify one of them
+> with only 1/6th the chance of it being broken by a new ikiwiki.
+> Which seems like a win from the user's POV. However, I know that there
+> are ikiwiki users who modify the `page.tmpl` but are very
+> unsophisticated; needing to find the right file amoung 6 to modify
+> would be a loss for these users. And some modifications would probably
+> need to be coordinated amoung multiple files.
+> 
+> For ikiwiki developers, reducing by 5/6th the number of users affected by a
+> breaking change to page.tmpl is nice, but we still have to worry about
+> the 1 in 6 that would be affected despite the splitting. Ikiwiki has
+> enough users that any change to page.tmpl has to be carefully considered
+> to avoid breaking something they may depend on, and it's been two years
+> since that last needed to be done.
+> 
+> So all in all, I don't think it's worth doing. --[[Joey]] 
diff --git a/doc/todo/bugs-everywhere_integration.mdwn b/doc/todo/bugs-everywhere_integration.mdwn
new file mode 100644 (file)
index 0000000..705922c
--- /dev/null
@@ -0,0 +1,7 @@
+So this is a little nutty [[wishlist]].
+
+There's this cool software called [Bugs Everywhere](http://bugseverywhere.org/) (be) which allows you to track your bug reports as plain text files in git.
+
+There's also an "html" command for be that allows you to produce an HTML rendering of the repository.
+
+ikiwiki could detect and use that instead of the (fairly limited) [[tips/integrated_issue_tracking_with_ikiwiki]].. --[[anarcat]]
diff --git a/doc/todo/calendar_autocreate.mdwn b/doc/todo/calendar_autocreate.mdwn
new file mode 100644 (file)
index 0000000..2a7350b
--- /dev/null
@@ -0,0 +1,225 @@
+Here is a patch that makes [[ikiwiki-calendar]] almost useless.
+
+It adds some options, the main one being `calendar_autocreate`, which is
+similar to the `tag_autocreate` option of the [[tag|plugins/tag]]: it create
+archive pages when needed.
+
+The documentation is updated as well (but as a non-native English speaker, I
+won't be offended if you correct stuff you consider awkward):
+
+- [[plugin|https://github.com/paternal/ikiwiki/blob/calendar-autocreate/doc/plugins/calendar.mdwn]]
+- [[directive|https://github.com/paternal/ikiwiki/blob/calendar-autocreate/doc/ikiwiki/directive/calendar.mdwn]]
+
+[[!tag patch]]
+[[!template  id=gitbranch branch=spalax/calendar-autocreate browse="https://github.com/paternal/ikiwiki/tree/calendar-autocreate" author="[[Louis|spalax]]"]]
+
+--[[Louis|spalax]]
+
+> An attempt at a review (although note that I don't have commit access,
+> so my opinion is not final):
+>
+> Should `calendar_autocreate_commit` really default to 1? I would personally
+> expect that any new features that synthesize new pages should not commit
+> them by default - I'd prefer to avoid cluttering git history with generated
+> pages. (Indeed, should the option even exist?)
+>
+> > I copied those options from the [[plugins/tag]] plugin: the
+> > `tag_autocreate_commit` option exists and default to 1.
+> >
+> > It should definitely exists: suppose a calendar page is created and not
+> > commited, and later, someone tries to push some changes where a page with
+> > the same name has been created. This would result in a conflict. The
+> > `calendar_autocreate_commit` prevents this.
+>
+> > > `tag_autocreate_commit` exists because when tag autocreation
+> > > was introduced, they were always in the `$srcdir` and committed.
+> > > I changed it so that it was possible to put them in the [[plugins/transient]]
+> > > underlay and not commit them. It defaults to 1 to preserve existing
+> > > functionality.
+> > >
+> > > When automatic tag pages (or autoindex pages) are not committed, they
+> > > go in the transient underlay, which means they can't cause conflicts:
+> > > independent page creation will simply mask them (a page in the
+> > > `$srcdir` hides a page of the same name in an underlay). I thought
+> > > this implementation did the same when not committing? --[[smcv]]
+>
+> > > > I did not realize how easy it was to use the [[plugins/transient]]
+> > > > plugin! I [[took it into
+> > > > account|https://github.com/paternal/ikiwiki/commit/492a22ac75f8b41a427a98c44525b01a6fd181b5]].
+> > > > -- [[Louis|spalax]]
+>
+> I'd personally do the conditional in gencalendaryear more like:
+>
+> [[!format perl """
+return unless $config{calendar_autocreate};
+"""]]
+>
+> to reduce the indentation depth of the more interesting code.
+>
+> > [[I agree|https://github.com/paternal/ikiwiki/commit/7f18c1ce48630507b744fa56b83999e8ca684606]]
+>
+> The recursion to generate missing years:
+>
+> [[!format perl """
+if (not exists $wikistate{calendar}{minyear}) {
+        $wikistate{calendar}{minyear} = $year;
+} elsif ($wikistate{calendar}{minyear} > $year) {
+        gencalendaryear($year + 1);
+        $wikistate{calendar}{minyear} -= 1;
+}
+"""]]
+>
+> does seem to be correct on closer examination, but it took me a while
+> to work out that it would actually do the right thing by recursing:
+>
+> * generate 2005
+>   * recurse to generate 2006
+>     * recurse to generate 2007
+>       * recurse to generate 2008
+>         * recurse to generate 2009
+>           * recurse to try to generate 2010 (no effect)
+>         * minyear = minyear - 1 = 2010 - 1 = 2009
+>       * minyear = minyear - 1 = 2009 - 1 = 2008
+>     * minyear = minyear - 1 = 2008 - 1 = 2007
+>   * minyear = minyear - 1 = 2007 - 1 = 2006
+> * minyear = minyear - 1 = 2006 - 1 = 2005
+>
+> I think it might be clearer (as well as less
+> recursion-happy) to use iteration:
+>
+> * generate 2005
+>   * recurse to generate 2006
+>   * ...
+>   * recurse to generate 2009
+> * minyear = 2005
+>
+> something like this:
+>
+> [[!format perl """
+sub gencalendaryear {
+        my $year = shift;
+        my %params = @_;
+        ...
+        # generate this year
+        ...
+        # Filling potential gaps in years [...] years 2006 to 2009.
+        return if $params{norecurse};
+        if (not exists $wikistate{calendar}{minyear}) {
+                $wikistate{calendar}{minyear} = $year;
+        } elsif ($wikistate{calendar}{minyear} > $year) {
+                foreach my $other ($year + 1 .. $wikistate{calendar}{minyear} - 1) {
+                        gencalendar($year, norecurse => 1);
+                }
+                $wikistate{calendar}{minyear} = $year;
+        }
+        # ... and the opposite for maxyear
+}
+"""]]
+>
+>
+> > [[I agree|https://github.com/paternal/ikiwiki/commit/7f18c1ce48630507b744fa56b83999e8ca684606]]
+>
+> I'm not sure about generating missing years at all, though: if the
+> generation is entirely dynamic, and there were no posts at all during
+> a particular year (or month for that matter), shouldn't we just skip
+> the year/month? That seems to be what e.g. Wordpress does.
+>
+> > [[Done|https://github.com/paternal/ikiwiki/commit/59b46942e01b32138d056381249effbbaf773892]].
+> > I added an option `calendar_fill_gaps` to chose between the two
+> > alternatives (since skipping empty months and years would change the
+> > default behaviour of this plugin).
+> >
+> > I think the code is a bit ugly at some places. Perl is not one the the
+> > programming languages I am fluent into. Sorry.
+> >
+> > PS: Good idea, thought. I now have to implement a similar thing for
+> > [[plugins/contrib/jscalendar]].
+>
+> This piece of ikiwiki-calendar functionality is lost:
+>
+> [[!format diff """
+- ... It also refreshes the wiki, updating the calendars to
+-highlight the current day. This command is typically run at midnight from
+-cron.
+"""]]
+>
+> If I understand correctly, the highlight will be on the day at which
+> the wiki was last refreshed, which seems arbitrary and confusing.
+> If ikiwiki-calendar is not used, I'd say there should just not be a
+> highlight for today (although I'm not sure how best to implement that -
+> perhaps a config option representing "I am going to use ikiwiki-calendar").
+>
+> > This is not lost. What ikiwiki-calendar do is simply: build the missing
+> > `archive/year/month` pages, and run `ikiwiki -refresh`. With my patch, the
+> > `ikiwiki -refresh` includes:
+> >
+> > - the build of missing `archive/year/month` pages;
+> > - highlighting the current day (this was already the case).
+> >
+> > So one can simply drop the `ikiwiki-calendar ...` for `ikiwiki --refresh
+> > ...` in cron to get the same result.
+> >
+> > I
+> > [[tried|https://github.com/paternal/ikiwiki/commit/7a92444e56fe023cea3b074dc5e6b5c4acdb6114]]
+> > to make the documentation clearer.
+>
+> [[!format diff """
+-\[[!template id=plugin name=calendar author="\[[ManojSrivastava]]"]]
+-\[[!tag type/widget]]
+"""]]
+>
+> Why did you remove that? It's useful information about the plugin
+> which I think ought to stay.
+>
+> > Oops! It was a mistake.
+> > [[Corrected|https://github.com/paternal/ikiwiki/commit/de9842ecc8914e11e73148dae78cd6909b535262]].
+>
+> --[[smcv]]
+>
+> > Thank you for this review. -- [[Louis|spalax]]
+
+---
+
+[[smcv]], can you please go on reviewing this?
+
+> I don't think I'm really the reviewer you want, since I don't have commit
+> access (as you might be able to tell from the number of pending branches
+> I have)... but nobody with commit access seems to be available to do
+> reviews at the moment, so I'm probably the best you're going to get.
+>
+>     +    0 0 * * * ikiwiki ~/ikiwiki.setup --refresh
+>
+> I think that should be `ikiwiki --setup ~/ikiwiki.setup --refresh`
+>
+> The indentation of some of the new code in `IkiWiki/Plugin/calendar.pm`
+> is weird. Please use one hard tab (U+0009) per indent step: you seem
+> to have used a mixture of one hard tab per indent or two spaces
+> per indent, which looks bizarre for anyone whose tab size is not
+> 2 spaces.
+>
+>     +        return unless $config{calendar_autocreate};
+>
+> This is checked in `gencalendaryear` but not in `gencalendarmonth`.
+> Shouldn't `gencalendarmonth` do it too? Alternatively, do the check
+> in `scan`, which calls `gencalendarmonth` directly.
+>
+>     +                my $year  = $date[5] + 1900;
+>
+> You calculate this, but you don't seem to do anything with it?
+>
+>     +  if (not exists $changed{$params{year}}) {
+>     +    $changed{$params{year}} = ();
+>     +  }
+>     +  $changed{$params{year}}{$params{month}} = 1;
+>
+> `$changed{$params{year}}` is a scalar (you can tell because it starts with the
+> `$` sigil) but `()` is a list. I think you want `{}`
+> (a scalar that is a reference to an empty anonymous hash).
+>
+> However, that whole `if` block can be omitted, and you can just use
+> `$changed{$params{year}}{$params{month}} = 1;`, because Perl will automatically
+> create `$changed{$params{year}}` as a reference to an empty hash if necessary,
+> in order to put the pair `$params{month} => 1` in it (the term to look
+> up if you're curious is "autovivification").
+>
+> --[[smcv]]
diff --git a/doc/todo/calendar_with___34__create__34___links.mdwn b/doc/todo/calendar_with___34__create__34___links.mdwn
new file mode 100644 (file)
index 0000000..9fe6c43
--- /dev/null
@@ -0,0 +1,10 @@
+the [[ikiwiki/directive/calendar]] directive is well usable without ikiwiki-calendar (eg for articles about meetings), but in such situations, it might be useful to have page creating links at the days.
+
+a [[!taglink patch]] to address this [[!taglink wishlist]] item is [[attached|incomplete_patch.pl]].
+
+from the new documentation (also in the patch):
+
+> * `newpageformat` - In month mode, if no articles match the query, the value of
+>   `newpageformat` will be used to strformat the date in question. A good value
+>   is `newpageformat="meetings/%Y-%m-%d"`. It might be a good idea to have
+>   `\[[!meta date="<TMPL_VAR name>"]]` in the edittemplate of `meetings/*`
diff --git a/doc/todo/calendar_with___34__create__34___links/incomplete_patch.pl b/doc/todo/calendar_with___34__create__34___links/incomplete_patch.pl
new file mode 100644 (file)
index 0000000..dc67988
--- /dev/null
@@ -0,0 +1,36 @@
+diff --git a/IkiWiki/Plugin/calendar.pm b/IkiWiki/Plugin/calendar.pm
+index d443198..0436eda 100644
+--- a/IkiWiki/Plugin/calendar.pm
++++ b/IkiWiki/Plugin/calendar.pm
+@@ -238,7 +238,16 @@ EOF
+                       else {
+                               $tag='month-calendar-day-nolink';
+                       }
+-                      $calendar.=qq{\t\t<td class="$tag $downame{$wday}">$day</td>\n};
++                      if ($params{newpageformat}) {
++                              $calendar.=qq{\t\t<td class="$tag $downame{$wday}">};
++                              $calendar.=htmllink($params{page}, $params{destpage},
++                                      strftime_utf8($params{newpageformat}, 0, 0, 0, $day, $params{month} - 1, $params{year} - 1900),
++                                      noimageinline => 1,
++                                      linktext => $day);
++                              $calendar.=qq{</td>\n};
++                      } else {
++                              $calendar.=qq{\t\t<td class="$tag $downame{$wday}">$day</td>\n};
++                      }
+               }
+       }
+diff --git a/doc/ikiwiki/directive/calendar.mdwn b/doc/ikiwiki/directive/calendar.mdwn
+index cb40f88..7b7fa85 100644
+--- a/doc/ikiwiki/directive/calendar.mdwn
++++ b/doc/ikiwiki/directive/calendar.mdwn
+@@ -56,5 +56,9 @@ An example crontab:
+   and so on. Defaults to 0, which is Sunday.
+ * `months_per_row` - In the year calendar, number of months to place in
+   each row. Defaults to 3.
++* `newpageformat` - In month mode, if no articles match the query, the value of
++  `newpageformat` will be used to strformat the date in question. A good value
++  is `newpageformat="meetings/%Y-%m-%d"`. It might be a good idea to have
++  `\[[!meta date="<TMPL_VAR name>"]]` in the edittemplate of `meetings/*`.
+ [[!meta robots="noindex, follow"]]
index 6bab6ef271a0f148140ecf2fb32fc8da5fe55f05..95b25bf36cb4721531b7a5fa7253557cb0f4e53b 100644 (file)
@@ -31,3 +31,5 @@ can be empty everyday and filled all day long. It does not make sense to me to
 delete these pages :). --[[xma]]
 
 I was not aware of [[plugins/remove]]. I don't think another method is necessary -- [[users/Jon]]
+
+> Consensus seems to be [[won't fix|done]] as far as I can see. --[[smcv]]
diff --git a/doc/todo/concatenating_or_compiling_CSS.mdwn b/doc/todo/concatenating_or_compiling_CSS.mdwn
new file mode 100644 (file)
index 0000000..068be93
--- /dev/null
@@ -0,0 +1,159 @@
+It would be great if IkiWiki could apply some sort of preprocessing to
+CSS. I'm just "thinking out loud" at the moment, but I might write
+a plugin.
+
+The simplest starting point would be concatenating a list of files:
+
+* The actiontabs and monochrome themes are not ready for use as-is;
+  the Makefile constructs the real stylesheet by concatenating the
+  anti-theme's CSS and the relevant theme's CSS. It would be better
+  if they could just drop a file in an underlay, and IkiWiki would
+  concatenate the anti-theme stylesheet and the theme's file.
+
+* The blueview theme is the same, but the theme's CSS also starts
+  with a couple of stylesheets from YUI. IkiWiki could maybe
+  concatenate the anti-theme stylesheet, the two YUI stylesheets
+  and the blueview-specific part? Or maybe that's too complicated.
+
+* The goldtype theme is the blueview theme with some overrides
+  added to the end. Again, IkiWiki could concatenate all the pieces.
+
+* The [[plugins/contrib/album]] plugin needs to append some
+  stuff to the stylesheet, making its installation more involved
+  than it ought to be. If it could append the pieces by putting them
+  in an underlay, installation would just be a matter of "add
+  the files".
+
+I'm not sure whether local.css should be concatenated too, or whether
+it should be separate.
+
+It would also be great if the same mechanism could be extended
+to compile CSS-like languages like [[!debpkg ruby-sass desc=SASS]]
+or [[!debpkg node-less desc=LESS]] down to CSS, but for dependency
+reasons, I don't think the themes shipped with IkiWiki should rely on that.
+
+If the compiled CSS ended up with a content-based filename (perhaps
+ikiwiki/compiled-HASH.css where HASH is the (possibly truncated) MD5 or SHA1
+hash of the content), that would mitigate stale CSS being served from cache
+(as long as the HTML has a short expiry, which is desirable anyway),
+and ikiwiki-hosting could maybe even do something like this to allow
+long-term caching of the files with content-based names:
+
+    <LocationMatch /ikiwiki/compiled-[a-f0-9]+\.css>
+        ExpiresByType text/css "now plus 1 year"
+    </LocationMatch>
+
+A similar mechanism could maybe be used to minify JavaScript.
+
+## vague syntax proposal: controlled by directive
+
+    \[[!css files="""
+        style.css
+        ikiwiki/plugin*.css
+        ikiwiki/theme*.css
+        local.css
+    """]]
+
+* *css* directive, placed in any page, concatenates the given files
+  and uses them as the stylesheet for that page and its subpages,
+  replacing `<TMPL_VAR BASEURL>style.css`
+
+* the files can be globs, which are sorted lexicographically within
+  a glob, and do not have to match anything (so it's OK if you don't
+  have anything that matches `plugin*.css`); "-" happens to sort
+  before ".", so theme-base.css would sort before theme.css,
+  which is nice to have
+
+* the default would be `style.css`, then `ikiwiki/plugin*.css`,
+  then `ikiwiki/theme*.css` and maybe `local.css`, as in the
+  example above
+
+* `style.css` would continue to be the anti-theme
+
+* themes would ship `ikiwiki/theme.css` instead of `style.css`,
+  resulting in concatenation
+
+* goldtype would ship `ikiwiki/theme-base.css` (which is a copy of
+  blueview, or a symlink to blueview if we can make symlinks safe)
+  and `ikiwiki/theme.css` (which is the goldtype additions)
+
+* [[plugins/contrib/album]] would put its templates and
+  `ikiwiki/plugin-album.css` in an underlay
+
+* any non-contrib plugin with complicated CSS requirements
+  could also move its CSS to an underlay
+
+I think this could be done entirely in a plugin, except for this
+change to `page.tmpl` to allow the `<style>`s to be overridden:
+
+    <TMPL_IF COMPILED_CSS>
+        <style type="text/css" href="<TMPL_VAR BASEURL><TMPL_VAR COMPILED_CSS>" />
+    <TMPL_ELSE>
+        <!-- ... what it does now ... -->
+    </TMPL_IF>
+
+The plugin could also optionally minify its output, and either pass input
+files through an external SASS/SCSS/LESS implementation according
+to their extension, or have a hook system to do so.
+
+People who want SASS/LESS would probably just do this in their top-level page:
+
+    \[[!css files="mywiki.less"]]
+
+and do the inclusion/concatenation logic via @import.
+
+Security consideration: the SASS/LESS compilers will read arbitrary local
+files, so if you use those languages, ability to upload the appropriate
+extension would have to be locked-down. Perhaps it's better to implement
+this without that feature initially.
+
+--[[smcv]]
+
+> Although I understand the need to improve CSS inclusion, I wonder why you are
+> proposing concatenating CSS rather than including them as several `<link
+> type="text/css" href="FILE.css" rel="stylesheet">` lines
+> in the header: unless I am missing something, I see this as far more simpler
+> than concatenating them.
+>
+> This would imply that a template variable `CSS` is added to the page
+> template, to be filled with those lines.
+>
+> Whatever solution is used, I agree that such a thing would be useful:
+> adding CSS (rather than replacing the existing one) should be easier.
+>
+> -- [[Louis|spalax]]
+
+>> One big request is more efficient than lots of small requests,
+>> if we model the CSS as all changing equally infrequently.
+>> In terms of bytes, each file needs some code in the HTML `<head>`,
+>> plus the HTTP request and response headers, plus the actual file.
+>> On the first page-view, a visitor will have to download all the CSS anyway
+>> (one request/response pair per CSS file). On subsequent page-views, there
+>> will be one request/"304 Not Modified" response per CSS file, unless the
+>> CSS files can be marked "to be cached forever" (which can be done if
+>> they have content-based filenames).
+>>
+>> In terms of time, [[!wikipedia HTTP_pipelining desc="according to Wikipedia"]]
+>> browsers don't generally pipeline requests, so the page won't finish
+>> loading until one round-trip time per uncached CSS file has elapsed.
+>>
+>> Having lots of small files with content-based filenames would be the
+>> next best thing - not particularly efficient on a generic web server,
+>> but they could at least be marked as "cache forever" in server
+>> configuration. I'd be OK with doing that if it makes ikiwiki more
+>> maintainable, but I don't think concatenating all the CSS at
+>> compile time is actually going to be a problem in practice.
+>> The individual small files are still going to be available
+>> for the wiki operator to edit.
+>>
+>> If some CSS files change with a significantly different frequency,
+>> *then* it might become worthwhile to separate them, but I don't
+>> think that's the case (apart from possibly local.css, which is why
+>> I'm not sure whether to include it in this).
+>> --smcv
+
+>>> I must admit that I am not aware of how those several CSS inclusion lines
+>>> tend to make browsing less smooth. Please withdraw my comment.
+>>>
+>>> As you pointed out, CSS inclusion is more painful than it should be, and
+>>> your proposal seems to answer that. Go ahead! --[[Louis|spalax]]
diff --git a/doc/todo/custom_location_for_openlayers.mdwn b/doc/todo/custom_location_for_openlayers.mdwn
new file mode 100644 (file)
index 0000000..3ccfa29
--- /dev/null
@@ -0,0 +1,17 @@
+In the [[plugins/osm]], we use an absolute URL to download the OpenLayers.js script file. This has two downsides:
+
+ 1. if the wiki is behind HTTPS, this will create a nasty SSL warning in the browser and we don't want that
+ 2. if we want the map to work offline, we need to load the js locally
+
+For those reasons, I think the location of that script should be customizable. --[[anarcat]]
+
+[[!template  id=gitbranch branch=anarcat/master author="[[anarcat]]"]]
+
+There is now a [[patch]] for this, thanks to Genevieve, available in my master branch.
+
+Note that there's an update to the patch in my master branch, that allows changing the URL for tiles too.
+
+> There's a lot of stuff in your master branch. Which commit is it,
+> or if you want me to merge it, spin a branch I can merge. --[[Joey]]
+
+> > I believe this was already fixed, actually - it's commit 409c4e48f983d10aceb6321148d7f440d17eb28f, which you cherry-picked on August 5th in d926c4a. So this is [[done]], thanks! -- [[anarcat]]
index 55db32b4f49e856ffd1cc229aed74a4d236928e2..50720fed04d06cd69a260323d373cea2852526b6 100644 (file)
@@ -30,6 +30,35 @@ Discussion
 > > 
 > > Originally, I named that parameter `backwards_links`, but then it wouldn't make sense in the long term, and isn't exactly neutral: it assume the current way is backwards! Your suggestion is interesting however, but I don't think the rtl/ltr nomenclature is problematic, with proper documentation of course... --[[anarcat]]
 
+> > > I still don't think `rtl`/`ltr` is the right terminology here. I think
+> > > the "API" should say what you mean: the distinction being made is
+> > > "text first" vs. "link first", so, say that.
+> > >
+> > > As far as I understand it, RTL languages like Arabic typically write
+> > > text files "in logical order" (i.e. reading/writing order - first
+> > > letter is first in the bytestream) and only apply RTL rendering on
+> > > display. IkiWiki is UTF-8-only, and Unicode specifies that all
+> > > Unicode text should be in logical order. The opposite of logical
+> > > order is is "display order", which is how you would have to mangle
+> > > the file for it to appear correctly on a naive terminal that expects
+> > > LTR; that can only work correctly for hard-wrapped text, I think.
+> > >
+> > > IkiWiki will parse files
+> > > in logical order too; so if a link's text and destination are both
+> > > written in Arabic, in text-before-link order in the source code, an
+> > > Arabic reader starting from the right would still see the text
+> > > before the link. Similarly, in your proposed link-before-text
+> > > order, an Arabic reader would still see the link before the text
+> > > (which in their case means further to the right). So I don't think
+> > > it would make sense to suggest that
+> > > one order was more appropriate for RTL languages than the other: if
+> > > it's "more correct" (for whatever opinion of "correct") in English, then
+> > > it's "more correct" in Arabic too.
+> > >
+> > > (If the destination is written in Latin then it gets
+> > > more complicated, because the destination will be rendered LTR within an
+> > > otherwise RTL document. I think the order still works though.) --[[smcv]]
+
 There's a caveat: we can't have a per-wiki backwards_links option, because of the underlay, common to all wikis, which needs to be converted. So the option doesn't make much sense. Not sure how to deal with this... Maybe this needs to be at the package level? --[[anarcat]]
 
 > I've thought about adding a direction-neutral `\[[!link]]` directive -
@@ -54,11 +83,18 @@ There's a caveat: we can't have a per-wiki backwards_links option, because of th
 >>> That style of link would work whether the link style was "backwards" or "forwards".  Unfortunately it could make some links less readable; after all, there is a reason why one wants to be able to change the link text!  But I don't know what proportion of the links are like that.  It's a thought, anyway.
 >>> --[[KathrynAndersen]]
 
+>>>> I dislike placing such requirements on the underlay, which is after
+>>>> all, just a subset of pages in this wiki, which many of the people
+>>>> editing may not even realize are part of the underlay. --[[Joey]]
+
 >>> Another option for internal links is to just use the regular markdown links instead of `\[[text|link]]` markup, that way it works regardless. Then the documentation for the link plugin just has to state both syntaxes in a safe manner.
 >>> I also agree that we should just switch in one shot, although I am worried this means this could be postponed indefinitely.--[[anarcat]]
 
 >>>> I have done just that in my branch: now the underlay only uses wikilinks in the wikilink page, elsewhere regular markdown links are used. I haven't converted the whole of the doc/ directory however, that would be left to the migration. I have written a ikiwik-transition tool to migrate from wikilink to markdown while i was there. --[[anarcat]]
 
+>>>>> No, that is *not* an option. Relative markdown links **break** when
+>>>>> page A, containing a link, is inlined into page B. --[[Joey]]
+
 ----
 
 FWIW, I think this change may well be painful, but is a good idea. I can never remember which way around it should be.
@@ -73,6 +109,7 @@ I think we can approach this rationnally:
 
  1. left to right (text then link) can be considered more natural, and should therefore be supported
  2. it is supported in markdown using regular markdown links. in the proposed branch, the underlay wikilinks are converted to use regular markdown links
+    > Joey explicitly rejected this for a valid reason (it breaks inlining). See above. --[[smcv]]
  3. ikiwiki links break other markup plugins, like mediawiki and creole, as those work right to left.
  4. those are recognized "standards" used by other popular sites, like Wikipedia, or any wiki supporting the Creole markup, which is [most wikis](http://www.wikicreole.org/wiki/Engines)
 
diff --git a/doc/todo/document_dependency_influences_in_code.mdwn b/doc/todo/document_dependency_influences_in_code.mdwn
new file mode 100644 (file)
index 0000000..4dfbb14
--- /dev/null
@@ -0,0 +1,28 @@
+[[!template id=gitbranch branch=smcv/ready/document-success-reason author="[[smcv]]"
+browse=http://git.pseudorandom.co.uk/smcv/ikiwiki.git/shortlog/refs/heads/ready/document-success-reason]]
+[[!tag patch users/smcv/ready]]
+
+Whenever I look at dependency calculation, for instance to solve
+[[bugs/editing gitbranch template is really slow]], it takes me a while to
+get my head round the concept of influences. The design documentation is
+in [[todo/dependency_types]], but that takes the form of a long discussion
+between [[Joey]] and [[Will]], so it's difficult to tell which of the
+attempts to define influences were incorrect or have been superseded.
+
+I think it would be valuable to have brief documentation
+as doc-comments in the source code. My branch adds some;
+please confirm whether I got it right? :-)
+
+It would also be great to have a definition of what
+should or shouldn't be counted as an influence, and which influences
+should count as static or dynamic, perhaps analogous to
+[git-annex's design pages](http://git-annex.branchable.com/design/)
+and linked from the `match_foo` section of [[plugins/write]]. I haven't
+written this myself because I'm somewhat stuck on the subtlety of what
+"indirectly influenced" means... --[[smcv]]
+
+>> the documentation looks correct to me, as far as i understand dependencies.
+>> the documentation on `influences_static` could add a "Static influences are
+>> what make `pagespec_match_list` more efficient than repeated
+>> `pagespec_match_list`." to give an idea of why it is there in the first
+>> place. --[[chrysn]]
diff --git a/doc/todo/ease_archivepage_styling.mdwn b/doc/todo/ease_archivepage_styling.mdwn
new file mode 100644 (file)
index 0000000..67415c1
--- /dev/null
@@ -0,0 +1,59 @@
+Hi! Please apply the following [[patch]] to make the
+`archivepage.tmpl` template more semantic and easier to style with
+a local CSS:
+
+       From 4e5cc0d9e5582f20df9f26dd5b1937ead0b46827 Mon Sep 17 00:00:00 2001
+       From: intrigeri <intrigeri@boum.org>
+       Date: Sat, 18 Aug 2012 10:34:36 +0200
+       Subject: [PATCH] Ease archivepage styling by using named classes, move
+        styling to the CSS.
+       
+       ---
+        doc/style.css              |    4 ++++
+        templates/archivepage.tmpl |    8 ++++----
+        2 files changed, 8 insertions(+), 4 deletions(-)
+       
+       diff --git a/doc/style.css b/doc/style.css
+       index 6e2afce..5fb4100 100644
+       --- a/doc/style.css
+       +++ b/doc/style.css
+       @@ -202,6 +202,10 @@ div.recentchanges {
+               margin-top: 1em;
+        }
+        
+       +.archivepagedate {
+       +       font-style: italic;
+       +}
+       +
+        .error {
+               color: #C00;
+        }
+       diff --git a/templates/archivepage.tmpl b/templates/archivepage.tmpl
+       index 93bdd9c..3e0bd9b 100644
+       --- a/templates/archivepage.tmpl
+       +++ b/templates/archivepage.tmpl
+       @@ -1,10 +1,10 @@
+       -<p>
+       +<div class="archivepage">
+        <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>
+       +<span class="archivepagedate">
+        Posted <TMPL_VAR CTIME>
+        <TMPL_IF AUTHOR>
+        by <span class="author">
+       @@ -15,5 +15,5 @@ by <span class="author">
+        </TMPL_IF>
+        </span>
+        </TMPL_IF>
+       -</i>
+       -</p>
+       +</span>
+       +</div>
+       -- 
+       1.7.10.4
+
+> [[done]] --[[Joey]]
diff --git a/doc/todo/edittemplate_should_support_uuid__44___date_variables.mdwn b/doc/todo/edittemplate_should_support_uuid__44___date_variables.mdwn
new file mode 100644 (file)
index 0000000..e5a8d0a
--- /dev/null
@@ -0,0 +1,85 @@
+[[!template id=gitbranch branch=anderbubble/edittemplate author="Jonathon Anderson"]]
+[[!tag wishlist patch]]
+
+I use a default template for all new pages:
+
+    \[[!meta title="<TMPL_VAR name>"]]
+    \[[!meta author=]]
+    \[[!meta date="<TMPL_VAR time>"]]
+    \[[!meta guid="urn:uuid:<TMPL_VAR uuid>"]]
+    \[[!tag ]]
+
+This encourages me to include useful metadata on the page.  In particular, though, I've modified the `edittemplate` plugin to generate a uuid for use in the guid, for use in `inline`.  Importantly, this keeps `inline` from flooding aggregators when I rename these pages.
+
+I've also noticed that IkiWiki seems to use the creation time for the generated page for the page date.  This means that when I do a rebuild, `inline`d pages get shuffled.  The inclusion of a `time` variable in `edittemplate` (and in a `meta` declaration for all such pages) prevents the date from changing unexpectedly.
+
+I've already made these changes in my installation, and have made my patches available in the `edittemplate` branch of git://civilfritz.net/ikiwiki.git.
+
+Changes to the structure of `$pagestate{$registering_page}{edittemplate}{$pagespec}` mean that a `cgi` rebuild is necessary (for reasons I don't entirely understand); but I think that's preferable to creating an entirely separate `$pagestate` namespace for storing parameters.  That said, I'm not really a perl programmer, so corrections are welcome.
+
+> I like this patch. I hate seeing things I've already read get marked as unread in my rss feed. -- [[JoshBBall]]
+
+>> (I don't have commit access so take this with a pinch of salt -
+>> I'm just trying to help deal with the code-review backlog.)
+>>
+>> I mostly like the first and third patches in the branch (adding v4
+>> (random) UUIDs, and adding the timestamps). I'd be tempted to rename
+>> `time` and `formatted_time` to `iso_time` and `time`, but that's
+>> a matter of taste, and perhaps people with commit access have
+>> stronger opinions one way or another. I haven't researched
+>> whether there's precendent for any particular naming style
+>> elsewhere in ikiwiki.
+>>
+>> The UUID bit would require adding some reference to libuuid-tiny-perl
+>> to the Debian packaging - I think a `Recommends` is too strong
+>> but a `Suggests` seems OK.
+>>
+>> I don't like the second patch (adding URL-namespaced UUID support).
+>> I'm having a hard time thinking of any situation in which a v4 UUID
+>> would be unsuitable, which means it's unnecessary complexity.
+>> FYI, the reason that it makes a rebuild is necessary is that
+>> you've restructured `$pagestate`, which is carried over from one
+>> refresh to the next (that's its purpose), and you haven't
+>> built in any migration or backwards-compatibility code that will
+>> cope with it being in the old format. My inclination would be to
+>> drop that patch. If there's a really good reason to prefer
+>> v3/v5 UUIDs, please describe it and I'll try to suggest some
+>> better way based on that, maybe global configuration in `$config`.
+>> --[[smcv]]
+
+>>> [[!template id=gitbranch branch=smcv/ready/edittemplate2
+  browse=http://git.pseudorandom.co.uk/smcv/ikiwiki.git/shortlog/refs/heads/ready/edittemplate2
+  author="Jonathon Anderson, [[smcv]]"]]
+>>> Here is a version of that branch that I [[would merge|users/smcv/ready]] if I could.
+>>> Changes since Jonathon's version:
+>>>
+>>> * only generate a UUID if needed
+>>> * read `/proc/sys/kernel/random/uuid` instead of using [[!cpan UUID::Tiny]]
+>>>   if available, to avoid the dependency on at least Linux
+>>> * remove v3/v5 UUID support since I don't really see the point,
+>>>   and if included, it would need a migration path for `$pagestate`
+>>> * use RFC 3339 time format for `time` to make the timezone unambiguous
+>>> * add `html_time` which is the output of `IkiWiki::displaytime`, e.g.
+>>>   a `<time>` element on HTML5 wikis
+>>>
+>>> I'm not entirely sure what the use-case is for `formatted_time`,
+>>> so perhaps either `html_time` or `formatted_time` should be
+>>> removed; but it's not as if they really cost anything.
+>>>
+>>> There doesn't seem to be any strong convention for how we name
+>>> timestamp variables/objects, so I left the naming as it was.
+>>>
+>>> --[[smcv]]
+
+>>>> the ready/edittemplate branch looks good to me too. `formatted_time` and
+>>>> `html_time` probably don't hurt, but personally i'd not add either and
+>>>> instead expose displaytime as a directive, for otherwise migrating to
+>>>> html5 would leave old evaluations of displaytime around in the repository.
+>>>> (example template: `\[[!meta date="<TMPL_VAR time>"]]I wrote this post at
+>>>> \[[!displaytime "<TMPL_VAR time>"]]`). --[[chrysn]]
+
+>>>>> That's a very good point; and Joey added `\[[!date "<TMPL_VAR time">]]`,
+>>>>> which does the same thing as your hypothetical `\[[!displaytime]]`,
+>>>>> almost 5 years ago. Branch replaced by `smcv/ready/edittemplate2`
+>>>>> which drops `formatted_time` and `html_time`, and adds a suggestion
+>>>>> to use `\[[!date]]`. --[[smcv]]
diff --git a/doc/todo/etherpad_support.mdwn b/doc/todo/etherpad_support.mdwn
new file mode 100644 (file)
index 0000000..c11243f
--- /dev/null
@@ -0,0 +1,22 @@
+[[Other wikis are doing it|https://www.mediawiki.org/wiki/Extension:EtherEditor]], why not jump the fray? The idea here would be to make the main editor hook into etherpad. 
+
+Trivial implementation
+----------------------
+
+There are a lot of funky things that would be done here, but the basic functionality would be to throw the document in etherpad and make everyone that edits the same page join the same etherpad. Only one person would need to save the document, but the last person to save it would save the last version. Documents would be left on the etherpad server. That's what I would call the trivial way to go around this.
+
+This would translate in a simple javascript hook for the editor page. The pad name could simply be the page name, which makes it insecure for private wikis.
+
+Garbage-collecting implementation
+---------------------------------
+
+This would require a bit more work. With this implementation, a "counter" would be implemented for every user that would edit the page simultaneously. Once a user saves the page, the counter goes down, when the counter reaches zero, the pad is deleted.
+
+Resources
+---------
+
+ * [etherpad jquery plugin](https://github.com/ether/etherpad-lite-jquery-plugin) - for embeding in any page
+ * [embed parameters](https://github.com/ether/etherpad-lite/wiki/Embed-Parameters) - for embeding using an iframe, probably not what we want
+ * [other integrations](https://github.com/ether/etherpad-lite/wiki/Third-party-web-services-that-have-support-for-Etherpad-Lite) - document us here when done
+ * [no Perl API implementation](https://github.com/ether/etherpad-lite/wiki/HTTP-API-client-libraries) - we'll have to write our own?
+ * [API documentation](http://etherpad.org/doc/v1.2.0/)
diff --git a/doc/todo/expose_html_language_and_direction.mdwn b/doc/todo/expose_html_language_and_direction.mdwn
new file mode 100644 (file)
index 0000000..65032fa
--- /dev/null
@@ -0,0 +1,15 @@
+[[!template  id=gitbranch branch=mhameed/html_lang_and_dir author="[[mhameed]]"]]
+[[!tag wishlist]]
+
+When a wiki is translatable, it would be nice to have the language code and the direction of the text exposed as template variables.
+This means:
+
+1. Better rendering for rtl languages.
+2. Content can correctly be tagged with the language code, to enable screenreaders and other accessibility providers to render/speak the text in the correct language.
+
+The [[patch]] is currently being used on http://addons.nvda-project.org and seems to work well. --[[mhameed]]
+
+> I don't have commit access, but it [[seems reasonable|/users/smcv/ready]].
+> --[[smcv]]
+
+>> [[done]]] --[[Joey]]
diff --git a/doc/todo/fancypodcast.mdwn b/doc/todo/fancypodcast.mdwn
new file mode 100644 (file)
index 0000000..1280170
--- /dev/null
@@ -0,0 +1,69 @@
+## Status
+
+[[!template id=gitbranch branch=schmonz/fancypodcast author="[[schmonz]]"]]
+[[!tag patch]]
+
+Nothing new since 2013/07/21 [[merge|done]] to `master`.
+
+## Features
+
+[[!table data="""
+Feature            |iTunes RSS|iTunes Atom|Downcast RSS|Downcast Atom
+Feed image         |          |           |            |
+Feed title         |(./)      |(./)       |(./)        |(./)
+Feed publisher     |          |           |            |
+Feed "category"    |          |           |            |
+Feed date          |(./)      |(./)       |(./)        |(./)
+Feed description   |(./)      |(./)       |(./)        |
+Episode image      |          |           |            |
+Episode title      |(./)      |(./)       |(./)        |(./)
+Episode date       |(./)      |(./)       |(./)        |(./)
+Episode duration   |          |           |            |
+Episode author     |          |           |            |
+Episode description|(./)      |(./)       |(./)        |
+Episode enclosure  |(./)      |(./)       |(./)        |(./)
+"""]]
+
+## Future improvements
+
+### iTunes fancy podcasting
+
+* [iTunes-specific tags](https://www.apple.com/itunes/podcasts/specs.html)
+  appear to be RSS-only
+    * If they work in Atom, teach `inline` to optionally iTunesify RSS/Atom.
+    * Else, add `itunes` as a third kind of feed (RSS plus more stuff).
+* Notable tags for feeds:
+    * `itunes:subtitle`
+    * `itunes:author`
+    * `itunes:summary` (same as `description`)
+    * `itunes:owner` (includes `itunes:name` and `itunes:email`)
+    * `itunes:image href=''`
+    * `itunes:publisher`
+    * `itunes:category text=''` (can contain subcategories)
+    * `itunes:keywords`
+* Notable tags for entries:
+    * `itunes:duration`
+        * [[!cpan Audio::TagLib]] might be fastest, if present and applicable
+        * [ffprobe](http://ffmpeg.org/ffprobe.html) is reasonably fast
+        * [mediainfo](http://mediainfo.sourceforge.net/) is way slower
+        * Cache computed durations as pagestate
+
+### Fancy podcast aggregating
+
+* Write tests comparing a fancy podcast (HTML and feeds) against
+  the same podcast aggregated and republished, then make them pass
+  via changes to `aggregatepost.impl` and [[plugins/aggregate]].
+
+### Other ideas
+
+* Optionally specify the enclosure's:
+    * MIME type, in case `File::MimeInfo` guesses wrong.
+    * Duration, in case `ffprobe` guesses wrong.
+* Optionally specify enclosures outside the wiki:
+    * Some people don't want to store big unchanging files in the VCS.
+    * Other people like [podcasting found media](http://huffduffer.com/about).
+    * We'd have to download the file just to compute some metadata
+      about it, and then somehow not frequently re-download it.
+* Configurably generate additional subscription links (such as
+  iTunes) alongside the RSS/Atom ones in [[plugins/inline]].
+* Support Apple's "enhanced podcasts" (if they're still relevant).
diff --git a/doc/todo/fancypodcast/discussion.mdwn b/doc/todo/fancypodcast/discussion.mdwn
new file mode 100644 (file)
index 0000000..bffc532
--- /dev/null
@@ -0,0 +1,167 @@
+# Round 1
+
+ikiwiki's simple podcasting, while elegant and minimal, doesn't (as
+mentioned in [[todo/blogging]]) produce full-featured feeds. In
+fancy podcasts, episodes are accompanied by text content. The feeds
+also have lots more metadata.
+
+## Design
+
+7. For each fancy podcast episode, write a blog post containing
+   `\[[!meta enclosure="WikiLink/to/media.mp3"]]`. (Don't specify
+   more than one enclosure -- but if you do, last one wins.)
+7. When rendering to HTML (single-page or inlined), append a link
+   to the media file.
+7. When rendering to RSS/Atom, the text is the entry's content and
+   the media file is its enclosure.
+7. Don't break simple podcasts in pursuit of fancy podcasts.
+
+## Implementation
+
+### Completed
+
+* Cover the existing simple podcast behavior with tests.
+* Add an `enclosure` field to [[plugins/meta]] that expands the
+  given [[ikiwiki/WikiLink]] to an absolute URL (feed enclosures
+  pretty much need to be, and the reference feeds I've looked at
+  all do this).
+* Write failing tests for the desired single-page and inlined
+  HTML behavior, then make them pass by adding enclosure stanzas
+  to `{,inline}page.tmpl`.
+* Write failing tests for the desired RSS/Atom behavior, then make
+  them pass via changes to `{atom,rss}item.tmpl` and [[plugins/inline]].
+* Match feature-for-feature with
+  [tru_podcast](http://www.rainskit.com/blog/542/tru_podcast-a-podcasting-plugin-for-textpattern)
+  (what [[schmonz]] will be migrating from).
+* Enrich [feed metadata](http://cyber.law.harvard.edu/rss/rss.html)
+  by catching up `rsspage.tmpl` to `atompage.tmpl`.
+* Verify that [[plugins/more]] plays well with fancy podcasts.
+* Verify that the feeds validate.
+* Subscribe to a fancy feed in some common podcatchers and verify
+  display details against a reference podcast.
+* Verify smooth transitions for two common use cases (see testing
+  details below).
+* Code review: don't add enclosure divs unless we have enclosures.
+* Code review: genericize download link for more use cases.
+* Code review: don't confuse old readers with Atom names in RSS.
+* Code review: instead of hacking back to `$link`, just provide it.
+* Code review: show author in addition to feedname, if different.
+
+### Code review
+
+       +                               # XXX better way to compute relative to srcdir?
+       +                               my $file = $absurl;
+       +                               $file =~ s|^$config{url}/||;
+
+I don't think ikiwiki offers a better way to do that, because there is
+normally no reason to do that. Why does it need an url of this form here?
+--[[Joey]] 
+
+> In all the popular, production-quality podcast feeds I've looked
+> at, enclosure URLs are always absolute (even when they could be
+> expressed concisely as relative). [Apple's
+> example](http://www.apple.com/itunes/podcasts/specs.html#example)
+> does too. So I told \[[!meta]] to call `urlto()` with the third
+> parameter true, which means the \[[!inline]] code here gets an
+> absolute URL in `$pagestate{$p}{meta}{enclosure}`. To compute the
+> enclosure's metadata, though, we of course need it as a local path.
+> I didn't see a less
+> [ongepotchket](http://www.jewish-languages.org/jewish-english-lexicon/words/1402)
+> way at the time. If you have a better idea, I'm happy to hear it;
+> if not, I'll add an explanatory comment. --[[schmonz]]
+
+>> I would be more comfortable with this if two two different forms of url
+>> you need were both generated by calling urlto. It'd be fine to call
+>> it more than once. --[[Joey]]
+
+>>> Heh, it was even easier than that! (Hooray for tests.) Done.
+>>> --[[schmonz]]
+
+       +<TMPL_IF HTML5><section id="inlineenclosure"><TMPL_ELSE><div id="inlineenclosure"></TMPL_IF>
+       +<TMPL_IF ENCLOSURE>
+
+Can't we avoid adding this div when there's no enclosure? --[[Joey]]
+
+> Sure, I've moved the `<TMPL_IF ENCLOSURE>` check to outside the
+> section-and-div block for `{,inline}page.tmpl`. --[[schmonz]]
+
+       +<a href="<TMPL_VAR ENCLOSURE>">Download this episode</a>
+
+"Download this episode" is pretty specific to particular use cases.
+Can this be made more generic, perhaps just "Download"? --[[Joey]] 
+
+> Yep, I got a little carried away. Done. --[[schmonz]]
+
+       -<TMPL_IF AUTHOR>
+       -       <title><TMPL_VAR AUTHOR ESCAPE=HTML>: <TMPL_VAR TITLE></title>
+       -       <dcterms:creator><TMPL_VAR AUTHOR ESCAPE=HTML></dcterms:creator>
+
+This change removes the author name from the title of the rss feed, which
+does not seem necessary for fancy podcasts. And it is a change that
+could negatively impact eg, Planet style aggregators using ikiwiki. --[[Joey]]
+
+> While comparing how feeds render in podcatchers, I noticed that
+> RSS and Atom were inconsistent in a couple ways, of which this was
+> one. The way I noticed it: with RSS, valuable title space was being
+> spent to display the author. I figured Atom's display was the one
+> worth matching. You're right, of course, that planets using the
+> default template and somehow relying on the current author-in-the-title
+> rendering for RSS feeds (but not Atom feeds!) would be broken by
+> this change. I'm having trouble imagining exactly what would break,
+> though, since guids and timestamps are unaffected. Would it suffice
+> to provide a note in the changelog warning people to be careful
+> upgrading their planets, and to customize `rssitem.tmpl` if they
+> really prefer the old behavior (or don't want to take any chances)?
+> --[[schmonz]]
+
+>> A specific example I know of is updo.debian.net, when used with
+>> rss2email. Without the author name there, one cannot see who posted
+>> an item. It's worth noting that planet.debian.org does the same thing
+>> with its rss feed. (That's probably what I copied.) Atom feeds may
+>> not have this problem, don't know. --[[Joey]]
+
+>>> Okay, that's easy to reproduce. It looks like this _might_ be
+>>> a simple matter of getting \[[!aggregate]] to populate author in
+>>> `add_page()`. I'll see what I can figure out. --[[schmonz]]
+
+>>>> Yep, that was mostly it. If the feed entry defines an author,
+>>>> and the author is distinct from the feed name, we now show `NAME:
+>>>> AUTHOR`, else just show `NAME` (same as always). In addition,
+>>>> the W3 feed validator says `<dcterms:creator>` is invalid, so
+>>>> I replaced it with `<dc:creator>`, and all of a sudden `r2e`
+>>>> gives me better `From:` headers. With the latest on my branch,
+>>>> when I generate the same planet as updo and run `r2e` over it,
+>>>> the names I get in `From:` look like so:
+
+*  `"updo: Junio C Hamano"`
+*  `"updo: Greg Kroah-Hartman"`
+*  `"updo: Eric Raymond: esr"` (article author != feed name, so we get both)
+*  `"updo: Jannis Pohlman: Jannis Pohlmann"` (oops! I tweaked the real updo)
+
+>>>> --[[schmonz]]
+
+       +++ b/templates/rsspage.tmpl
+       +       xmlns:atom="http://www.w3.org/2005/Atom"
+       +<atom:link href="<TMPL_VAR FEEDURL>" rel="self" type="application/rss+xml" />
+
+Why is it using atom namespace inside an rss feed? What are the chances
+every crummy rss reader on earth is going to understand this? I'd put it at
+about 0%; I doubt ikiwiki's own rss reader understands such a mashup.
+--[[Joey]]
+
+> The validator I used (<http://validator.w3.org/feed/>) told me to.
+> Pretty sure it doesn't make anything work better in the podcatchers
+> I tried. Hadn't considered that it might break some readers.
+> Removed. --[[schmonz]]
+
+       +<generator>ikiwiki</generator>
+
+Does this added tag provide any benefits? --[[Joey]]
+
+> Consistency with the Atom feed, and of course it trumpets ikiwiki
+> to software and/or curious humans who inspect their feeds. The tag
+> arrived only in RSS 2.0, but that's already the version we're
+> claiming to be, and it's over a decade old. Seems much less risky
+> than the atom namespace bits. --[[schmonz]]
+
+>> Sounds ok then. --[[Joey]]
index 74dcaeb61b8ff7f1ac075233cdae087ec4db763a..8850d87f1dace36e8b0e57699f8354040e3c8e53 100644 (file)
@@ -9,4 +9,12 @@ There has got to be a way to run the CGI wrapper under fastcgi or modperl (apach
 > I've not looked at what code changes fastcgi or modperl would require in
 > ikiwiki. --[[Joey]]
 
+> > Looking at nginx support in [[tips/dot_cgi]], I had to figure that out, and it's not so complicated. The hackish way that's documented there right now (and also supported by [answers on serverfault.com](http://serverfault.com/questions/93090/installing-ikiwiki-on-nginx-fastcgi-fcgi-wrapper) or [other](http://vilain.net/comp/ikiwiki_setup.html) [guides](https://library.linode.com/web-applications/wikis/ikiwiki/arch-linux)), and involves starting up a fcgi wrapper, which I find personnally quite weird.
+> > 
+> > Otherwise the general idea would be to launch a daemon per site that would have a pool of fastcgi processes to answer requests. The common setup pattern here is that users have a fixed quota of processes running as their user, listening either on the network (hackish: a port need to be allocated for each user) or on a socket (documented above, but then the webserver needs write access).
+> >
+> > Perl has had extensive support for FastCGI for quite a while. It seems to me a simple daemon could be written to wrap around the `.cgi`, it's a common way things are deployed. [RT](http://rt.bestpractical.com/) for example can run as a regular CGI, under `mod_perl` or `FastCGI` indiscrimenatly, the latter being more reliable and faster. They use [Plack](http://search.cpan.org/dist/Plack/) to setup that server (see the [startup script](https://github.com/bestpractical/rt/blob/stable/sbin/rt-server.in) for an example). But of course, [TIMTOWTDI](http://search.cpan.org/search?query=fastcgi&mode=all). --[[anarcat]]
+> > 
+> > Also related: [[todo/multi-thread_ikiwiki]], [[todo/rewrite_ikiwiki_in_haskell]]. :) --[[anarcat]]
+
 [[!tag wishlist]]
index b48c37d7bb9a17c2901cf9c32db6c49ac7774cf2..f13213dc2e1b108cf9436297e45679b3c047236e 100644 (file)
@@ -1,4 +1,4 @@
-[[!template id=gitbranch branch=GiuseppeBilotta/inlinestuff author="Giuseppe Bilotta"]]
+[[!template id=gitbranch branch=GiuseppeBilotta/inlinestuff author="[[GiuseppeBilotta]]"]]
 
 I rearranged my patchset once again, to clearly identify the origin and
 motivation of each patch, which is explained in the following.
diff --git a/doc/todo/flexible_relationships_between_pages.mdwn b/doc/todo/flexible_relationships_between_pages.mdwn
new file mode 100644 (file)
index 0000000..e09e03e
--- /dev/null
@@ -0,0 +1,149 @@
+it has been some years since the [[matching different kinds of links]] issue
+was tackled, but hardly a plugin is using it.
+
+in order to enhance on the [[todo/rel attribute for links]] and [[todo/better bug tracking support]]
+issues and to provide a more general infrastructure, i'd like to propose a
+generic plugin for typed links. it can be also viewed of a way to have
+[[todo/structured page data]] that consists of URLs inside the wiki.
+
+following the use case i've developed it for, i'll call it `blocks` for the
+moment (but am open to better suggestions).
+
+outline
+=======
+
+the plugin has a **configuration option** called `blocks_names`, which consists
+of pairs of verbs; the typical example is `blocks/blockedby`, but other values
+could be `next/prev up/down` or `owner/owns`.
+
+for each verb in the options, there is a **directive** which is used to state
+the relationship; relationships can be declared on both ends, so a page `bugA`
+with the contents `\[[!blocks bugB]]` is semantically equivalent to a page
+`bugB` with the contents `\[[!blockedby bugA]]`.
+
+for each verb, there is also a **pagespec** which matches all pages that are
+the origin of a relationship to a given page. if `developerA` `\[[!owns
+bug1]]`, then if `bug1` contains `\[[!map pages="owns(.)"]]`, it will show the
+owning developer. these specs match both ways, ie. if `bug1` `\[[!owner
+developerA]]`, the said map directive will still produce the same result.
+
+details
+=======
+
+* single word relationships vs. symmetric relationships
+
+  with some verbs, it is possible that a relationship is only used in one
+  direction (eg `index`, even though one could declare it as
+  `index/isindexof`).
+
+  > isindexof is not a very interesting relationship - it just clogs up
+  > the link-map, since the index is "the index of" all pages. I can't
+  > see any situation in which you'd want to do pagespec matching
+  > on it? --[[smcv]]
+
+  >> that's why i used `index` as an example of a one-direction relationship.
+  >>
+  >> it wouldn't clog up the link map, though: in order to cleanly match both
+  >> directions, when the "inverse" term of a relationship is used, the link in
+  >> taggedlinks uses the "forward" term, but switches the objects.
+  >>
+  >> --[[chrysn]]
+
+  other verbs are symmetric, eg. `equivalent`, which need different treatment.
+
+* "taglink" style directives
+
+  the [[plugins/tag]] plugin would be a special case for this plugin (apart
+  from the autotag and tagdir features). as there is a `\[[!taglink ...]]`
+  directive, there could be an analogous directive for every single directive.
+
+  > This is basically the traillink/trailitem duality, too.
+  > I'd be quite tempted to generalize to something like this:
+  >
+  >     We can't fix [[!link blocks="bug123" text="Bug 123"]] until we do this.
+  >
+  >     [[!hiddenlink owner="smcv"]]
+  >
+  > but perhaps that's too wordy?
+  >
+  > I think both trail and tag need their own special processing beyond the
+  > general case, but maybe not? --[[smcv]]
+
+  >> i'd be all in favor of having this unified and deeper; there has been the
+  >> idea of a `\[[!link]]` directive [[again|todo/link plugin perhaps too general__63__]]
+  >> and [[again|todo/do not make links backwards]].
+  >>
+  >> i like the `\[[!link text=""]]` and `[[!hiddenlink]]` conventions, but
+  >> think that ${REL}="${TARGET}" isn't ideal because it implies that a single
+  >> link can have more than one target. instead, i'd go for
+  >> `\[[!link to="bug123" rel="blocks" text="Bug 123"]]; as with the html rel
+  >> parameter, rel would be a list of whitespace separated values.
+  >>
+  >> positional parameters (`\[[!link bug123 rel="blocks" text="Bug 123"]]` or
+  >> even `\[[!link Bug 123|bug123 rel="blocks"]]`) would be possible, but i
+  >> prefer explicit syntax and not joining stings back again with the
+  >> whitespace that was split off it before.
+  >>
+  >> if the '|' character is not widespread in page names (which i assume it is
+  >> not), instead of using positional parameters in `\[[!link]]` for
+  >> shortcuts, we could extend the regular link syntax; the same relationship
+  >> could then be declared as `\[[Bug 123|bug123|blocks]]`; this would be an
+  >> easy extension to the original link syntax. it would even work for hidden links
+  >> (`\[[|smcv|owner]]`), which previously made no sense because a link with
+  >> neither a physicial representation nor metadat is of no use.
+  >>
+  >> --[[chrysn]]
+
+* implementation notes
+
+  the way pagespec hooks are implemented required some nasty perl tricks, for
+  which the people who showed me felt very bad for having spoilt me. indeed,
+  `no strict refs;` and `*$forward_name = $forward_match;` are not exactly
+  ideal. a change in the pagespec declaration api (why not just `hook` like
+  everything else) would make the implementation cleaner.
+
+  > How about replacing `blockedby(bug*)` with `linktype(blockedby bug*)` or
+  > something? Then you'd only need one pseudo-hook. --[[smcv]]
+
+  >> there has been the topic of pagespecs like `typedlink(type glob)` back in
+  >> the [[matching different kinds of links]] discussion, but it was removed
+  >> in favor of per-type matchers. --[[chrysn]]
+
+  >>> note to self: should use the ``inject`` function to avoid `no strict refs`. --[[chrysn]]
+
+* configuration location
+
+  i aimed for static configuration of the `block_names` in the setup file. this
+  could be made more general like in the [[plugins/shortcut]] plugin, but that
+  would make things more complex.
+
+* no html links with `rel=` yet
+
+  as there are no taglink style links between the articles so far, no htmllink
+  gets rendered that could carry the relationship name in its rel field.
+
+  having the inverse relationship description in backlinks (as in the link
+  created by the map directive in the example above) would be hard to
+  implement. (actually, i think it'd be easier to determine the rel values from
+  the taggedlinks for *every* htmllink than to influence the backlinks in this
+  plugin).
+
+* one direction also creates a normal link
+
+  due to the way add\_link treats relationships, the forward relationship is
+  always going to be reflected in the links/backlinks. a section of
+  [[todo/matching different kinds of links]] was dismissed with "let's not
+  worry about it", this plugin might be reason to worry about it again. (i'd
+  consider what is in @links to be a representation of which hyperlinks are
+  there, and in this case, none are generated).
+
+  > taglink and traillink already count as wikilinks without generating
+  > any visible HTML. --[[smcv]]
+
+implementation
+==============
+
+there is a working but slightly incomplete (basically where it comes to the
+details mentioned above) implementation in [[blocks.pm]].
+
+--[[chrysn]]
diff --git a/doc/todo/flexible_relationships_between_pages/blocks.pm.mdwn b/doc/todo/flexible_relationships_between_pages/blocks.pm.mdwn
new file mode 100644 (file)
index 0000000..0ef97b2
--- /dev/null
@@ -0,0 +1,129 @@
+#!/usr/bin/perl
+# Ikiwiki "blocks" relationship plugin.
+package IkiWiki::Plugin::blocks;
+
+use warnings;
+use strict;
+use IkiWiki 3.00;
+
+sub import {
+       hook(type => "getsetup", id => "blocks", call => \&getsetup);
+       hook(type => "checkconfig", id => "skeleton", call => \&checkconfig);
+}
+
+sub getsetup () {
+       return
+               plugin => {
+                       safe => 1,
+                       rebuild => 1,
+               },
+               blocks_names => {
+                       type => "string",
+                       example => "blocks/blockedby",
+                       description => "comma separated list of defined relationship pairs, the forward and backward name separated by a slash",
+                       safe => 1,
+                       rebuild => 1,
+               },
+}
+
+sub checkconfig () {
+       my $blocksnames;
+       if (defined $config{blocks_names}) {
+               $blocksnames = $config{blocks_names};
+       } else {
+               $blocksnames = "blocks/blockedby";
+       }
+
+       while ( $blocksnames =~ /([^ ]+)/g )
+       {
+               if ( $1 =~ m@([a-zA-Z0-9]+)(/([a-zA-Z0-9]+))?@ )
+               {
+                       my $from = $1;
+                       my $to = $3;
+                       hook(
+                               type => "preprocess",
+                               shortcut => 1, # gets interpreted by listdirectives; see doc/bugs/cannot_preview_shortcuts.mdwn / ikiwiki commit 354d22e2
+                               no_override => 1,
+                               id => $from,
+                               scan => 1,
+                               call => sub { preprocess_blocks($from, 1, @_); }
+                       );
+                       if ($to)
+                       {
+                               hook(
+                                       type => "preprocess",
+                                       shortcut => 1,
+                                       no_override => 1,
+                                       id => $to,
+                                       scan => 1,
+                                       call => sub { preprocess_blocks($from, 0, @_); }
+                               );
+                       }
+
+                       my $backward_match; my $backward_name;
+                       my $forward_match; my $forward_name;
+
+                       $backward_match = sub ($$;@) {
+                               my $page=shift;
+                               my $glob=shift;
+                               return IkiWiki::PageSpec::match_backlink($page, $glob, linktype => $from, @_);
+                       };
+
+                       $backward_name = "IkiWiki::PageSpec::match_$from";
+
+                       if ($to)
+                       {
+                               $forward_match = sub ($$;@) {
+                                       my $page=shift;
+                                       my $glob=shift;
+                                       return IkiWiki::PageSpec::match_link($page, $glob, linktype => $from, @_);
+                               };
+
+                               $forward_name = "IkiWiki::PageSpec::match_$to";
+                       }
+
+                       {
+                               no strict 'refs';
+
+                               if ($to)
+                               {
+                                       *$forward_name = $forward_match;
+                               }
+                               *$backward_name = $backward_match;
+                       }
+               } else {
+                       error gettext("Malformed option in blocks_names");
+               }
+       }
+}
+
+sub preprocess_blocks ($$@) {
+       # with flip=0, the directive occurring on page A pointing at page B
+       # means that A $relation B, with flip=1, it means B $relation A
+       my $relation = shift;
+       my $flip = shift;
+
+       if (! @_) {
+               return "";
+       }
+       my %params=@_;
+       my $page = $params{page};
+       delete $params{page};
+       delete $params{destpage};
+       delete $params{preview};
+
+       foreach my $blocks (keys %params) {
+               $blocks=linkpage($blocks);
+               
+               # hidden WikiLink
+               if ( $flip == 0 ) {
+                       add_link($page, $blocks, $relation);
+               } else {
+                       add_link($blocks, $page, $relation);
+               }
+       }
+               
+       return "";
+}
+
+1
diff --git a/doc/todo/git-annex_support.mdwn b/doc/todo/git-annex_support.mdwn
new file mode 100644 (file)
index 0000000..2f63663
--- /dev/null
@@ -0,0 +1,99 @@
+A dear [[wishlist]] which would resolve [[this question|forum/ikiwiki_and_big_files]]: ikiwiki should support git-annex repositories.
+
+I am not sure how this would work, but from my POV, it should do a `git annex get` when new commits are pushed to its bare repo. This would assume, of course, that there's another repo somewhere that ikiwiki has access to, which works for HTTP-style remotes, but could be more problematic for SSH remotes that require a key.
+
+Another solution would be to make ikiwiki a remote itself and allow users to push big files to it. The only problem I see with this is those files would end up in the bare repository and not necessarily show up in the web rendering. Ideally, a big file pushed would be hardlinked between the two repos, but it seems [git-annex doesn't support that yet](http://git-annex.branchable.com/todo/wishlist:_use_hardlinks_for_local_clones). --[[anarcat]]
+
+> One technical problem with this is that ikiwiki doesn't allow symlinks
+> for [[security]], but git-annex relies on symlinks (unless you're in
+> direct mode, but I'm not sure that's really desirable here).
+> I'd like to make symlinks possible without compromising security,
+> but it'll be necessary to be quite careful. --[[smcv]]
+
+First implementation
+====================
+
+So as the [[discussion]] shows, it seems it's perfectly possible to actually do this! There's this [gallery site](http://stockholm.kalleswork.net) which uses the [[plugins/contrib/album]] plugin and git-annex to manage its files.
+
+The crucial steps are:
+
+ 1. setup a git annex remote in `$srcdir`
+
+ 2. configure direct mode because ikiwiki ignores symlinks for [[security]] reasons:
+
+        cd $srcdir
+        git annex init
+        git annex direct
+
+ 3. configure files to be considered by git-annex (those will be not committed into git directly):
+
+        git config annex.largefiles 'largerthan=100kb and not (include=*.mdwn or include=*.txt)'
+
+ 4. make the bare repository (the remote of `$srcdir`) ignored by git-annex:
+
+        cd $srcdir
+        git config remote.origin.annex-ignore true
+        git config remote.origin.annex-sync false
+
+    (!) This needs to be done on *ANY* clone of the repository, which is annoying, but it's important because we don't want to see git-annex stuff in the bare repo. (why?)
+
+ 5. deploy the following crappy plugin to make commits work again and make sure the right files are added in git-annex:
+
+[[!format perl """
+#!/usr/bin/perl
+package IkiWiki::Plugin::gitannex;
+
+use warnings;
+use strict;
+use IkiWiki 3.00;
+
+sub import {
+        hook(type => "getsetup", id => "gitannex", call => \&getsetup);
+       hook(type => "savestate", id => "gitannex", call => \&rcs_commit);
+        # we need to handle all rcs commands maybe?
+}
+
+sub getsetup () {
+        return
+                plugin => {
+                        safe => 1, # rcs plugin
+                        rebuild => undef,
+                        section => "misc",
+                },
+}
+
+# XXX: we want to copy or reuse safe_git
+
+sub rcs_commit (@) {
+    chdir $config{srcdir};
+    `git annex add --auto`;
+    `git annex sync`;
+}
+
+sub rcs_commit_staged (@) {
+    rcs_commit($@);
+}
+
+1
+"""]]
+This assumes you know what `srcdir`, `repository` and so on mean, if you forgot (like me), see this reference: [[rcs/git/]].
+
+
+What doesn't work
+-----------------
+
+ * the above plugin is kind of flaky and ugly.
+ * it's not an RCS plugin, but probably should be, replacing the git plugin, because really: git doesn't work at all anymore at this point
+
+What remains to be clarified
+----------------------------
+
+ * how do files get pushed to the `$srcdir`? Only through the web interface?
+ * why do we ignore the bare repository?
+
+See the [[discussion]] for a followup on that. --[[anarcat]]
+
+Alternative implementation
+==========================
+
+An alternative implementation, which remains to be detailed but is mentionned in [[forum/ikiwiki_and_big_files]], is to use the [[underlay]] feature combined with the `hardlink` option to deploy the git-annex'd files. Then git-annex is separate from the base ikiwiki git repo. --[[anarcat]]
diff --git a/doc/todo/git-annex_support/discussion.mdwn b/doc/todo/git-annex_support/discussion.mdwn
new file mode 100644 (file)
index 0000000..f1015b5
--- /dev/null
@@ -0,0 +1,15 @@
+Hi,
+
+> Hi! :) First, many thanks for this enlightening information! You are leading the way in a glorious trail of flames! ;) -a
+
+I'm currently using git-annex with ikiwiki for a website of mine. [stockholm.kalleswork.net](http://stockholm.kalleswork.net). The site relies heavily on the osm and album plugins. The site just went online and is a bit of an experiment, things seem a bit fragile but works for now. (ikiwiki 3.20130904.1)(git-annex 4.20130904.1)
+
+The trick I had to do to get git-annex, ikiwiki and the album plugin to work was to initialize an annex remote in the `$srcdir`. Then block the bare origin (ie wiki.git folder) with `annex-sync = false` and `annex-ignore = true` on **both** the server and the working laptop. This is to avoid polluting the wiki.git bare repo with annex stuff.
+
+> Why are you ignoring the bare remote actually? It seems it would be the proper way to batch-upload files into the server... -a
+
+Another critical thing for this to work was to set the `$srcdir` on the server to direct mode `git-annex direct` before adding any content anywhere. On the laptop I can use indirect mode without problems.
+
+For now syncing annex, pushing updates to mdwns etc all seem to work and the album plugin picks up images etc. I'm sure there are problems ahead with this setup but it does seem to work. I barely know how to use git, git-annex and ikiwiki and much less understand how it works behind the scenes. So do let me know if there are fatal flaws in my setup ;) -- Kalle
+
+> I am not sure how git-annex'd files are pushed to the `$srcdir`. Usually, you clone from the bare repo, so any git annex command will work on that repository, yet you explicitely ignore it. How *do* you push files into the `$srcdir`? Only on the web interface? Thanks again! --[[anarcat]]
index 4dbbc1cc811aae40184df3769c75cdf60566b88e..bedf21d0ca5c07d68c11e8eb566957224b5d3d1e 100644 (file)
@@ -6,7 +6,9 @@ Ikiwiki should really survive being asked to work with a git branch that has no
     git clone barerepo.git srcdir
     ikiwiki --rcs=git srcdir destdir
 
-I've fixed this initial construction case, and, based on my testing, I've also fixed the post-update executing on a new master, and ikiwiki.cgi executing on a non-existent master cases.
+I've fixed this initial construction case, and, based on my testing, I've
+also fixed the post-update executing on a new master, and ikiwiki.cgi
+executing on a non-existent master cases.
 
 Please commit so my users stop whining at me about having clean branches to push to, the big babies.
 
@@ -63,15 +65,18 @@ It's still extra work) to a very hot code path that is run to eg,
 update recentchanges after every change. 
 
 Seems not ideal to do extra work every time to handle a case
-that will liternally happen a maximum of once in the entire lifecycle of a
+that will literally happen a maximum of once in the entire lifecycle of a
 wiki (and zero times more typically, since the setup automator puts in a
 .gitignore file that works around this problem).
 
 So as to not just say "no" ... what if it always tried to run git log,
-and if it failed (or returned no parsed lines, then it could look 
-at git show-ref to desice whether to throw an error or not.
+and if it failed (or returned no parsed lines), then it could look 
+at git show-ref to deduce whether to throw an error or not.
 --[[Joey]] 
 
+> Ah, but then git-log would still complain "bad revision 'HEAD'"
+> --[[Joey]] 
+
 <pre>
 @@ -474,7 +478,10 @@ sub rcs_update () {
        # Update working directory.
@@ -84,6 +89,7 @@ at git show-ref to desice whether to throw an error or not.
 +              }
        }
  }
+
 </pre>
 
 Same concern here about extra work. Code path is nearly as hot, being
diff --git a/doc/todo/hook_to_detect_markdown_links_to_wiki_pages.mdwn b/doc/todo/hook_to_detect_markdown_links_to_wiki_pages.mdwn
new file mode 100644 (file)
index 0000000..ad9c7dd
--- /dev/null
@@ -0,0 +1 @@
+For an internal wiki, we occasionally get patches that link to internal wiki pages using the Markdown link syntax.  I'd love to see an optional git hook to detect that and complain.
diff --git a/doc/todo/improve_decentralised_wikis_documentation_and_graphics.mdwn b/doc/todo/improve_decentralised_wikis_documentation_and_graphics.mdwn
new file mode 100644 (file)
index 0000000..98b4add
--- /dev/null
@@ -0,0 +1,14 @@
+i'm trying to work on the decentralised wikis documentation in [[tips/distributed_wikis]] and i would like to add more / edit SVG graphics, but I can't because i'm not admin. --[[users/anarcat]]
+
+[[!template  id=gitbranch branch=anarcat/dev/decentralised_graphics author="[[anarcat]]"]]
+
+This branch is ready to be merged, I believe. There are some improvements to be done on the text of those pages, but I'd like to get the images in before going any further. [[patch]]
+
+Here are the images, to give you an idea:
+
+* <http://src.anarc.at/ikiwiki.git/blob/dev/decentralised_graphics:/doc/rcs/git/wiki_edit_flow.svg>
+* <http://src.anarc.at/ikiwiki.git/blob/dev/decentralised_graphics:/doc/tips/Git_repository_and_web_server_on_different_hosts/separate-webserver.svg>
+* <http://src.anarc.at/ikiwiki.git/blob/dev/decentralised_graphics:/doc/tips/distributed_wikis/ping-setup.svg>
+* <http://src.anarc.at/ikiwiki.git/blob/dev/decentralised_graphics:/doc/tips/distributed_wikis/decentralized_wikis.svg>
+
+[[patch merged|done]], thanks.
diff --git a/doc/todo/improved_mediawiki_support.mdwn b/doc/todo/improved_mediawiki_support.mdwn
new file mode 100644 (file)
index 0000000..68cbcf7
--- /dev/null
@@ -0,0 +1,9 @@
+[[!tag patch todo wishlist]]
+
+I several updates to the mediawiki plugin to improve compatibility, improving img and File: support.  I'd love to get them upstream.  Is there any interest?  Patches are at [[http://www.isi.edu/~johnh/SOFTWARE/IKIWIKI/index.html]]
+
+> The mediawiki plugin has never been included in ikiwiki, it's
+> [provided by a third party](https://github.com/jmtd/mediawiki.pm) and
+> you should send your patches to them.
+> [[done]]
+> --[[Joey]] 
diff --git a/doc/todo/inband_acl_data.mdwn b/doc/todo/inband_acl_data.mdwn
new file mode 100644 (file)
index 0000000..02b0624
--- /dev/null
@@ -0,0 +1,75 @@
+it [[!tag wishlist]] would be nice to have acls that get their data from wiki pages.
+
+a particular use case is the [debienna wiki](http://debienna.at/) (our local
+debian usergroup), where there are few admins, but everyone who has been
+granted edit rights to the wiki should be allowed to allow other people in.
+those people can register their accounts on their own, but may only write to a
+dedicated page where they request write privileges.
+
+the setup file should look like this:
+
+    locked_pages: '!PleaseClearForEditing and !user_in_page(DebiennaGroup)'
+
+and DebiennaGroup would contain
+
+    * \[[chrysn]]
+    * \[[albert]]
+    * \[[rhonda]]
+
+etc.
+
+a suggested implementation is published on
+`git://prometheus.amsuess.com/ikiwiki-plugins` and is short enough to be quoted
+here:
+
+<!-- don't copy/paste from here, clone the git or copy/paste from the ikiwiki rendered version, i had to scape [ -->
+
+    #!/usr/bin/perl
+    # Ikiwiki "user_in_page" pagespec
+    # 
+    # The pagespec user_in_page(some_page) returns success if the currently logged
+    # in user is mentioned in a wikilink on some_page (which might be relative to
+    # the currently active page, which allows per-directory restrictions).
+    #
+    # To be precise, the string \[[${USERNAME}]] has to be present in the some_page
+    # source file.
+    
+    package IkiWiki::Plugin::user_in_page;
+    
+    package IkiWiki::PageSpec;
+    
+    sub match_user_in_page ($$;@) {
+       my $page=shift;
+       my $userlistpage=shift;
+       my %params=@_;
+       my $user=$params{user};
+    
+       # this is relative to page, but this is intentional
+       my $userlistpagename = IkiWiki::bestlink($page, $userlistpage);
+    
+       # FIXME: pagesources seems not to be defined in do=edit
+       my $userlistpagefile = "$userlistpagename/index.mdwn";
+    
+       my $userlistpagedata = IkiWiki::readfile(IkiWiki::srcfile($userlistpagefile));
+    
+       if ($userlistpagedata =~ /\Q\[[$user]]\E/ ) {
+               return IkiWiki::SuccessReason->new("User $user is listed in $userlistpagename");
+       } else {
+               return IkiWiki::FailReason->new("User $user is not listed in $userlistpagename");
+       }
+    }
+    
+    1
+
+before i complete this as a proposed plugin, i'd like to know
+
+* if you have better ideas to check for the delimited user name than the
+  \[[$user]] scheme?
+
+* i had to manually expand `$pagename` to `$pagename/index.mdwn` as
+  %pagesources seems to be empty in the context of `?do=edit`. how is this
+  supposed to work?
+
+--[[chrysn]]
+
+> Just for the record, this seems to be a special case of [[todo/per_page_ACLs/]]. -- [[anarcat]]
diff --git a/doc/todo/inline_directive_should_support_pagination.mdwn b/doc/todo/inline_directive_should_support_pagination.mdwn
new file mode 100644 (file)
index 0000000..eafe6ee
--- /dev/null
@@ -0,0 +1,8 @@
+Ikiwiki should support pagination for index pages. Something like showing only 10 items on the first page, and then having the other items on the other pages.
+
+Basically, the same page would be rendered multiple times:
+
+- The index page: rendered normally, but item list is truncated to N items
+- The separate pages: rendered with a slice of the item list containing N items (or less for the last page)
+
+This I think breaks one major assumption: that source pages only generate one page in the output directory.
index 39713eb5f473a6d4bdffe7bb00e8d820e74c5a06..3767631f71961fb7d0bbeac49aca891cd09604b5 100644 (file)
@@ -1,5 +1,5 @@
 [[!tag wishlist patch plugins/inline]]
-[[!template id=gitbranch branch=chrysn/patches author="[[chrysn]]"]]
+[[!template id=gitbranch branch=chrysn/inlineautotitles author="[[chrysn]]"]]
 
 for postforms in inlines of pages which follow a certain scheme, it might not
 be required to set the title for each individual post, but to automatically set
@@ -8,7 +8,7 @@ this can either be based on timestamp formatting, or use the already existing
 munging mechanism, which appends numbers to page titles in case that page
 already exists.
 
-two patches ([1], [2]) set inline up for that, adding an additional `autotitle`
+two patches (b568eb25, 34bc82f2) set inline up for that, adding an additional `autotitle`
 parameter. if that is given, the regular input of the inline postform will be
 replaced with a hidden input of that text. in addition, the empty title is
 permitted (both for autotitle and regular titles, as they go in the same GET
@@ -42,7 +42,7 @@ common uses of percent as in "reach 10% market share", but might in others as
 in "the 10%-rule").
 
 both can be circumvented by using another GET parameter for autotexts, as
-implemented in [3].
+implemented in 40dc10a4.
 > this patch still does not work perfectly; especially, it should make a
 > distinction between "autotitle is set but equal ''" (in which case it
 > should create a page named `1.mdwn`, and "autotitle is not set, and title is
@@ -61,7 +61,3 @@ having a pre-filled input field instead of an unchangable hidden input might be
 cool (eg for creating an entry with yesterday's date), but would be a bit of a
 problem with static pages. javascript could help with the date part, but name
 munging would be yet another thing.
-
-[1]: http://github.com/github076986099/ikiwiki/commit/b568eb257a3ef5ff49a84ac00a3a7465b643c1e1
-[2]: http://github.com/github076986099/ikiwiki/commit/34bc82f232be141edf036d35e8ef5aa289415072
-[3]: http://github.com/github076986099/ikiwiki/commit/40dc10a4ec7809e401b4497c2abccfba30f7a2af
index 4550e4e3232b2c54463b29c0493aa4a32042d514..f87dc653f70416a1a34334819eba182d5db006f4 100644 (file)
@@ -1,4 +1,4 @@
-While ikiwiki can support definition lists (`dl/dt/dd`) through [[multimarkdown|mdwn]], it doesn't actually /do/ anything with those valuable definitions. It would be interesting for third party plugins to have access to this stuff as a proper data structure. This is what allows MoinMoin to have plugins that collect that data across multiple pages and tabulate it, for example.
+While ikiwiki can support definition lists (`dl/dt/dd`) through [[multimarkdown|plugins/mdwn]], it doesn't actually /do/ anything with those valuable definitions. It would be interesting for third party plugins to have access to this stuff as a proper data structure. This is what allows MoinMoin to have plugins that collect that data across multiple pages and tabulate it, for example.
 
 What I am proposing here is that the [[variables exported to plugins|plugins/write/#index6h2]] be extended to include a `%dictionnaries` hash. For a markup like this:
 
@@ -21,7 +21,7 @@ would result in a data structure like this:
 
 Now, I know I can write myself a `format()` parser that would do this on all pages in my own plugin, but then it would need to be adapted to all markups, while markup formatters should be the ones implementing this directly, if possible.
 
-My first use case for this would be to extend the [[plugins/contrib/osm]] plugin to tap into those lists, so that I could have this data in the page, visible to the user:
+My first use case for this would be to extend the [[plugins/osm]] plugin to tap into those lists, so that I could have this data in the page, visible to the user:
 
 [[!format txt """
 Longitude
@@ -34,7 +34,21 @@ and then reuse that data in the plugin.
 
 Then for us running the humongous [[koumbit wiki|https://wiki.koumbit.net/]], it is a necessary step to be able to migrate away from MoinMoin to Ikiwiki as we have a lot of pages that tabulate information like this. For example, see our [[ServerList|https://wiki.koumbit.net/ServerList]] ([[source|https://wiki.koumbit.net/ServerList?action=raw]]), being generated from pages like [[this one|https://wiki.koumbit.net/metis.koumbit.net]].
 
-If there are no objections to that concept, I may try to start coding patches. Otherwise this is really just a [[wishlist]].
+If there are no objections to that concept, I may try to start coding patches. Otherwise this is really just a [[wishlist]]. --[[anarcat]]
 
-> Have you looked at the [[plugins/contrib/field]] plugin? This gives you the infrastructure, and all you need is to write a plugin that parses the definition list format.  Then you could use [[plugins/contrib/getfield]], [[plugins/contrib/ftemplate]] and/or [[plugins/contrib/report]] to do what you like with the data.
+> Have you looked at the [[/plugins/contrib/field]] plugin? This gives you the infrastructure, and all you need is to write a plugin that parses the definition list format.  Then you could use [[/plugins/contrib/getfield]], [[/plugins/contrib/ftemplate]] and/or [[/plugins/contrib/report]] to do what you like with the data.
 > --[[KathrynAndersen]]
+
+> ----
+
+> with the recent inclusion of discount to the [[plugins/mdwn]] module, definition lists can be used by default (instead of, as with multimarkdown, after an option is enabled), and look like this:
+>
+>     =Apple=
+>         Apple is a fruit.
+>         Apple is also a company.
+>     =Orange=
+>         Orange is a fruit.
+>
+> (indented with four spaces). this makes definition lists a bit more attractive for definition harvesting.
+>
+> personally, i'd prefer a solution that works from the markup'ed plain text instead of invisible directives, as it integrates more naturally in the flow of designing a document, even though a plugin for explicitly stating invisible facts certainly has its purpose too. (think [[!wikipedia RDFa]] here ;-) ) --[[chrysn]]
diff --git a/doc/todo/linkbase.mdwn b/doc/todo/linkbase.mdwn
new file mode 100644 (file)
index 0000000..5dcef3c
--- /dev/null
@@ -0,0 +1,16 @@
+[[!template id=gitbranch branch=GiuseppeBilotta/linkbase author="[[GiuseppeBilotta]]"]]
+
+This patches enables the user to specify additional paths (“link bases”)
+that can be used by ikiwiki when trying to resolve links. The list of
+link bases is built as follows:
+
+* the page itself (as ikiwiki currently does)
+* all link bases specified for this page
+* all link bases specified for pagespecs matched by this page
+
+To specify the link bases, the only way made available presently by the
+patchset is a linkbase plugin that works similarly to the shortcut
+plugin (link bases are specified in a linkbases.mdwn file at the
+document root). However, are ways are potentially possible.
+
+This is still work in progress. Comments and suggestions are welcome.
diff --git a/doc/todo/lucene_search_engine.mdwn b/doc/todo/lucene_search_engine.mdwn
new file mode 100644 (file)
index 0000000..da8c73f
--- /dev/null
@@ -0,0 +1 @@
+There are [some issue](http://www.branchable.com/bugs/Exception:_Cannot_open_tables_at_consistent_revisions_at___47__usr__47__lib__47__perl5__47__Search__47__Xapian__47__WritableDatabase.pm_line_41./#comment-c159ea3f9be35fcd9ed0eeedb162e816) with the current search engine. Sometimes the database gets corrupted and it's not very good at weighting say, the title against the content. For example, [searching for pagespec](http://ikiwiki.info/ikiwiki.cgi?P=pagespec) in this wiki doesn't lead to the [[ikiwiki/pagespec]] page in the first page... but in the third page. In [[different_search_engine]], there was the idea of using Lucene - is there any reason why we shouldn't have both, or at least let lucene live in contrib? --[[anarcat]]
index 4120b8432a7609c53183987412c5cefbe7970f0f..5449c0543edb3d3c292fa15d01dfa6ada9df6ccb 100644 (file)
@@ -1,4 +1,7 @@
 ikiwiki could support manpages (or general groff input files) and convert them
 to HTML. --[[JoshTriplett]]
 
+> I wrote [[plugins/contrib/mandoc]] a while back. Just noticed
+> this wishlist item. --[[Schmonz]]
+
 [[wishlist]]
index c20314c2828a447372e3efd5ba297f2cf5f71141..fa69bad47d77836337394e2484557aa15fad71f3 100644 (file)
@@ -1,3 +1,37 @@
+ikiwiki needs a wysiwyg markdown editor. While there have been tries using
+WMD etc, they are not fully satisfactory, and also the license of
+everything around WMD is [[unclear|plugins/wmd/discussion]].
+
+[Hallo](https://github.com/bergie/hallo) is the closest to a solution
+I've seen.
+The user can edit the page by clicking on the html part they want to change
+and typing. Selecting text pops up a toolbar to modify it.
+
+[Demo of Hallo with live WYSIWYG markdown editing](http://bergie.github.com/hallo/markdown.html)
+This demo uses showdown, and I still don't know what the license of
+showdown is. However, the showdown part seems to only be to handle the live
+conversion from the markdown source in the edit field to the html. The 
+(edited) html to markdown conversion is accomplished by Hallo.
+
+So, ikiwiki could use this in a page edit UI that does not show the
+markdown at all. The user would edit the live page, entirely in wysiwyg
+mode, and on saving hallo's generated markdown would be saved. Probably
+there would need to be a button to bring up the current markdown editor
+too, but without showdown, changes in it would not immediatly preview, so
+it'd make sense to disable hallo when the editor is visible.
+
+Issue: Ikiwiki directives can generate html. We would not want that html to
+be editable by halo and converted back to markdown. Also, the directives
+need to appear in the html so users can edit them. This seems to call for a
+special page rendering mode for editing, in which directives are either not
+expanded, or are expanded but the generated html wrapped in some tag that
+makes hallo refuse to edit it (which would probably require that feature be
+added to hallo, currently it acts on all blocks with `class=editable`),
+or otherwise allows it to be stripped out at save time. --[[Joey]]
+
+### old discussion
+
+
 The [StackOverflow](http://stackoverflow.com/) site uses markdown for markup.
 It has a fancy javascript thing for showing a real-time preview of what the user
 is editing. It would be nice if ikiwiki could support this, too. The thing they
index baad063ef53d78c48bd6f184cae6ffa49e8a62bc..5701d8e2b7b677b56cb13a23ee7160e83753f05f 100644 (file)
@@ -80,6 +80,11 @@ and decided this time it was really needed to implement this feature.
 >>>>>> Ping? I've merged 3.20110321 in my `mirrorlist` branch and
 >>>>>> checked it still works properly. --[[intrigeri]]
 
+>>>>>>> Joey: ping? I've rebased my `mirrorlist` branch on top of
+>>>>>>> 3.20120419, and checked it still works properly. I really
+>>>>>>> would like to see this functionality merged in time
+>>>>>>> for Wheezy. --[[intrigeri]]
+
 >>>>> concerning goto/cgiurl, what about having that as the default in
 >>>>> mirrorlist, but keeping ``nousedirs|file:///home/intrigeri/wiki`` and
 >>>>> ``usedirs|http://example.com/wiki`` valid for cgi-less cases?
@@ -94,3 +99,5 @@ and decided this time it was really needed to implement this feature.
 >>>>>> this should not block the merge of the branch I have been
 >>>>>> proposing. Support for the usecase you are suggesting can
 >>>>>> always be added later if needed. --[[intrigeri]]
+
+>>>>>>> Well, that came out nice and clean. [[done]] --[[Joey]] 
index cecac7a94010dec37e9caf6b4eec4c414c426d4a..b257760cef4b6f8b1bdf307fe05553efe8d2310a 100644 (file)
@@ -30,6 +30,12 @@ This patch, or one like it, would enable better blogging support, by adding
 the ability to hierarchically organize blog posts and automatically generate
 structural pages for year, month, or day. Please apply. --Ethan
 
+> This looks a lot like [[plugins/autoindex]], except limited to a subset
+> of pages, and with different templates according to the page it's used
+> on. Perhaps it could become several enhancements for autoindex? --[[smcv]]
+
+----
+
 <pre>
 Index: IkiWiki/Render.pm
 ===================================================================
diff --git a/doc/todo/monochrome_theme.mdwn b/doc/todo/monochrome_theme.mdwn
new file mode 100644 (file)
index 0000000..eaf51c0
--- /dev/null
@@ -0,0 +1,48 @@
+[[!template id=gitbranch branch=jmtd/monochrome_theme author="[[Jon]]"
+
+]][As requested](http://jmtd.net/log/goodreads/), please find a new theme named
+'monochrome' in listed git repo/branch. [Here's the screenshot of what it looks like](https://github.com/jmtd/ikiwiki/blob/30af2437cd41d394930864e93b3c2319d1ec2b06/doc/themes/monochrome.png). — [[Jon]]
+
+Perhaps controversially, I think that this would be a good basis for a default theme for the ikiwiki website. (I suspect more work is needed, I have not tested the theme against every plugin which provides theme-able bits and pieces, nor with e.g. HTML5 mode turned on, etc. etc.) Whilst the anti-theme is the best default for an ikiwiki instance (although an argument could be made against that, too!), the site needs to try to advertise some of the potential of ikiwiki to visitors, and serve as an example of what can be done. I'd appreciate thoughts of frequent ikiwiki contributors on this proposal ☺  — [[Jon]]
+
+> I appreciate you putting that branch together. I was ready to merge it,
+> but `themes/monochrome/style.css` seems to contain a lot of redundant
+> things that are in ikiwiki's normal style.css. This is especially
+> redundant since ikiwiki's style.css gets prepended to the theme's stylesheet
+> at build time! Can you remove those redundant bits please? (PITA I know,
+> but it will make maintaining this much easier.) --[[Joey]]
+
+>> Sure I'll sort that out.  Sorry, I didn't realise the prepending was an automatic process. I did it manually. It should be quick for me to fix. — [[Jon]]
+
+>>> Fixed. I rebased the branch; hopefully that won't cause your script issues.  — [[Jon]]
+
+>>>> I've merged your branch.
+>>>> 
+>>>> Looking more closely at the css, I do have a few questions:
+>>>> 
+>>>> * Is the google-provided font really necessary? I consider that a sort
+>>>>   of web bug, I would prefer users of ikiwiki not need to worry that
+>>>>   their referer information is being sent to some third party.
+>>>>   I'd also prefer for ikiwiki sites to always be functional when
+>>>>   viewed offline.
+>>>> * The external link markup needs the local url to be put into
+>>>>   local.css to work right, correct? I wonder if this is too much of a
+>>>>   complication to ask of users. It seems to be it could either be left
+>>>>   out of the theme, or perhaps ikiwiki could be made to expand
+>>>>   something in the css to the site's url at build time.
+>>>> 
+>>>> --[[Joey]]
+
+>>>>>Thanks for merging!
+>>>>>
+>>>>> * the font is not necessary. I will check, it might be license-compatible
+>>>>>   and thus could be bundled. As things stand, if people have no 'net connection
+>>>>>   or the font fails to load, the theme still "works". Good point RE the referral
+>>>>>   situation.
+>>>>>
+>>>>> * The external link markup works without customizing the CSS, but if something
+>>>>>   generates a non-relative link within the content area of a page, it will be
+>>>>>   styled as an external link.  By default, nothing does this in ikiwiki afaik,
+>>>>>   so the impact is pretty small. (except perhaps if someone specifies an absolute
+>>>>>   `cgiurl` path?)  The additional customization is belt-and-braces.
+>>>>>   — [[Jon]]
diff --git a/doc/todo/optimisation_via_git_log.mdwn b/doc/todo/optimisation_via_git_log.mdwn
new file mode 100644 (file)
index 0000000..469681a
--- /dev/null
@@ -0,0 +1,27 @@
+Currently each time ikiwiki runs a refresh, it has to traverse the entire
+directory tree, looking at each file, to determine what has changed.
+
+Profiling shows this can take many seconds on large sites, and tends to be
+where around half the time is spent (other half being loadindex/saveindex).
+
+This could be sped up by remembering the HEAD ref that was rendered last,
+and using git log to get a list of files changed since then. Only render
+those files.
+
+Looking at the current implementation, the list of all files in the tree is
+also used when eg, iterating to find pages that need to be changed because
+one of their dependencies has changed. That would need to be modified,
+probably to use info from loadindex instead (ie, values %pagesources), with
+added/removed files added/removed from it.
+
+The actual git log parsing would be easy to add; there is already code to
+parse git-log in raw form.
+
+The main complication would probably be files in the tree that are not
+checked into git would not be rendered. The underlay dirs would still need
+to be scanned as now, as would the transient directory. Since some sites
+may depend on files being put into the tree and not committed, this
+optimisation would probably need to be something that can be optionally
+enabled.
+
+> [[done]] --[[Joey]]
diff --git a/doc/todo/option_to_send_only_the_diff_in_notifyemail.mdwn b/doc/todo/option_to_send_only_the_diff_in_notifyemail.mdwn
new file mode 100644 (file)
index 0000000..b863d36
--- /dev/null
@@ -0,0 +1,11 @@
+[[!tag wishlist]]
+
+[[!template  id=gitbranch branch=anarcat/notifychanges author="[[anarcat]]"]]
+
+It would be nice if [[plugins/notifyemail]] wouldn't send the complete page source, but only the things that changed, when notifying users. They can always follow the link to see the full page if they want.
+
+For bonus points, make that optional. --[[anarcat]]
+
+> I am working on a patch, in the branch mentionned above. So far, my first job was to make sure notifyemail sends a single email per refresh. Next step is to try to figure out the revisions to send to the user - I am not sure it's quite obvious in the iki internals which diffs we're working on, because of the pluggable nature of the software (and even the possibility that not RCS exists at all). So far, I am thinking of using `rcs_recentchanges()`, but how many commits to look back into? Feedback welcome. --[[anarcat]]
+
+> > It turns out it was easier to simply make a completely new plugin for this, which I called "notifychanges" (i don't like that name too much). It is in my notifychanges branch, so i guess we have a [[!taglink patch]] now! --[[anarcat]]
index ef7f4dbafc0a7fda92db13b9fc64615e4f1e69a9..bb3b7dec0f0a1b170a7d98cf1e680637ba5b2aa3 100644 (file)
@@ -22,14 +22,15 @@ new plugin
 ==========
 
 A complete rewrite of the plugin can be found
-[here][chrismgray-rewrite].  It is an [[external|plugins/write/external]] plugin using a
+[here][chrismgray-rewrite].  It uses a
 dedicated emacs instance to parse the org-mode files.  Thus, it should
 be a bit faster than the older plugin, as well as properly handling
 [[wikilinks|ikiwiki/wikilink]] and images, two features not present in the older
-plugin.
+plugin.  An example of its use can be found at my [blog][chrismgray-blog].
 
 [org-mode]: http://orgmode.org/
 [MS]: http://www.golden-gryphon.com/blog/manoj/blog/2008/06/08/Using_org-mode_with_Ikiwiki/
 [example]: http://blog.tremily.us/posts/Git/notes/
 [raw]: http://orgmode.org/manual/Quoting-HTML-tags.html
 [chrismgray-rewrite]: https://github.com/chrismgray/ikiwiki-org-plugin
+[chrismgray-blog]: http://chrismgray.github.com
diff --git a/doc/todo/osm__95__optimisations__95__and__95__fixes.mdwn b/doc/todo/osm__95__optimisations__95__and__95__fixes.mdwn
new file mode 100644 (file)
index 0000000..3496cff
--- /dev/null
@@ -0,0 +1,27 @@
+[[!template  id=gitbranch branch=anarcat/osm_kml_formatting author="[[anarcat]]"]]
+[[!template  id=gitbranch branch=anarcat/attic/osm_emacs_indent author="[[anarcat]]"]]
+
+I have accumulated a small series of patches to the OSM plugin along with the [[other|todo/osm_arbitrary_layers]] [[fixes|bugs/osm_KML_maps_do_not_display_properly_on_google_maps]] I have submitted here. They have lived in a tangled mess on my master branch so far, but not anymore!
+
+I have two main branches that need merging (on top of [[todo/osm_arbitrary_layers]]):
+
+ * `osm_kml_formatting` - indentation of the KML, optimisation: remove duplicate style declarations, folders support (even though [[it's not supported by openlayers just yet|https://trac.osgeo.org/openlayers/ticket/2195]])
+
+> If it's not supported yet, does it break something? Seems it must be hard
+> to test the change at least if it's not supported. --[[Joey]]
+
+> > Good point. Maybe that can be skipped for now, it sure doesn't look like it will be merged any time soon anyways. I do think that the optimisation needs to be merged, it's quite important because if halves the size of the resulting KML file. --[[anarcat]]
+
+> > > The merge you just did is fine, the only thing missing is folder support, I'll keep it in a separate branch for now, maybe it will be useful later! This is [[done]]. --[[anarcat]]
+
+ * `osm_openlayers_misc` - do not override the sorting of layers (so that the order defined in [[todo/osm_arbitrary_layers]] takes effect) and tell Emacs about the non-default indentation policies of the file.
+
+> I prefer not to pollute files with editor-specific garbage, and that goes
+> doubly for files served over the network. Cherry-picked the layer sorting
+> change. --[[Joey]]
+
+> > Alright, I am fine with that, thanks. I moved my branch to the attic. -- [[anarcat]]
+
+Those two branches are also merged directly on my master branch... along with [[todo/osm_arbitrary_layers]].
+
+I am filing this as one todo to simplify matter, but I can also split it further if needs be. --[[anarcat]]
diff --git a/doc/todo/osm_arbitrary_layers.mdwn b/doc/todo/osm_arbitrary_layers.mdwn
new file mode 100644 (file)
index 0000000..d59f394
--- /dev/null
@@ -0,0 +1,43 @@
+[[!template  id=gitbranch branch=anarcat/osm_arbitrary_layers author="[[anarcat]]"]]
+
+I got tired of hacking at the osm.pm every time I wanted to change the layers, so I made it so the layers can be changed in the .setup file. In my master branch, there are now two new configuration settings: `osm_layers` and `osm_layers_order` which replace the hackish `osm_mapurl`. The variables are a hash and an array that allow the operator to define the list of URLs to be loaded as layers and also to change the order of layers. -- [[users/anarcat]]
+
+> I try to avoid adding hashes to config, because websetup does
+> not allow configuring hashes.
+> 
+> The example for `osm_layers_order` is confusing, it makes
+> it look like a perl hash, but it appears to really be a javascript
+> code fragement string, and one that is tightly bound to other
+> configuration too. Why not generate that javascript code from
+> data in a robust way?
+>
+> Does it even make sense to configure this stuff globally?
+> Could the layers be passed as parameters to the osm direction? --[[Joey]]
+>
+> > The reason for `osm_layers_order` is that order is important in the layers: the default layer is the first one and it's not possible to force Perl to have arrays generated in a reliable, reproducable order. Maybe an alternative would be to just set the default layer.
+> > 
+> > That said - maybe you're right and this should be passed as an argument to the OSM directive. The problem then is that you need to pass this stuff around the waypoint directive too. It also makes it hard to have a consistent set of maps all across the wiki. On our site, we have map inserts here and there, and it's nice to have them consistent all around.
+> > 
+> > In closing, I would say that I agree that `.._order` is confusing: maybe I should just have a `_default` to choose the first one? -- [[anarcat]]
+
+>>> If there's no reason to order the other layers, that makes some sense.
+>>> --[[Joey]]
+
+>>>> The layers are ordered because that's the way they are displayed in the menu. Take a look at the base layers on the top left here for an idea: <http://wiki.reseaulibre.ca/ikiwiki.cgi?map=map&do=osm&zoom=12&lat=45.5227&lon=-73.59554>. -- [[anarcat]]
+
+>>>> After sleeping over this - maybe it would be simpler if `osm_layers` was just an array. First, it would get rid of the duplication with `osm_layers_order`. Then I do not feel that having the keys in that hash is worth the duplication anymore. The only reason this is a hash is to provide an arbitrary string description for the layers. We could replace this with an automated description based on the path to the tiles provided.
+>>>> 
+>>>> If that's an acceptable solution for you, I'll go right ahead and rewrite this in a separate branch for merging. Note that on my master branch, there are now 3 main  changes that are not merged: arbitrary OSM layers (includes Google Maps support), KML formatting improvements (indentation, non-duplication of tags), minor OpenLayers improvements (don't sort layers arbitrarily, folders support, higher default zoom level and projection fixes). I can either make a branch for those three things or leave it on my master branch, but be warned that it will be hard to separate those as distinct/orthogonal patches as they mangle each other quite a bit.
+>>>>
+>>>> So basically, I need to know two things from you:
+>>>>
+>>>> 1. on the layers design: a) hash (which include arbitrary descriptions) + default value or b) a simple array with automated descriptions
+>>>> 2. the above changes on a single branch or on 3 different ones?
+>>>>
+>>>> Thanks for your time.  -- [[anarcat]]
+
+>>>>> I have implemented 1.b) and 2. (ie. it's a simple array now, and I split this stuff in different branches.) I'll open another todo for the other branches. --[[anarcat]]
+
+>>>>>> [[merged|done]] --[[Joey]] 
+
+Confirmed, thanks!! --[[anarcat]]
diff --git a/doc/todo/osm_plugin_GeoJSON_popup_patch.mdwn b/doc/todo/osm_plugin_GeoJSON_popup_patch.mdwn
new file mode 100644 (file)
index 0000000..8b0996f
--- /dev/null
@@ -0,0 +1,6 @@
+[[!template  id=gitbranch branch=cbaines/osm-popup-fixes author="[[cbaines]]"]]
+[[!tag patch]]
+
+When using the GeoJSON output of the OSM plugin (osm_format: GeoJSON), the name and description in the popups are missing, this patch fixes the issue.
+
+
diff --git a/doc/todo/osm_plugin_icon_patch.mdwn b/doc/todo/osm_plugin_icon_patch.mdwn
new file mode 100644 (file)
index 0000000..ccb7810
--- /dev/null
@@ -0,0 +1,6 @@
+[[!template  id=gitbranch branch=cbaines/osm-icon-fixes author="[[cbaines]]"]]
+[[!tag patch]]
+
+Currently, the documented icon parameter to the waypoint directive is not used. This patch fixes that, and fixes some related problems in the KML output. 
+
+> That patch looks pretty awesome, thanks for your work on it. I don't have time to test it now, but if it works, I am all for its inclusion. --[[anarcat]]
diff --git a/doc/todo/outbound_proxy.mdwn b/doc/todo/outbound_proxy.mdwn
new file mode 100644 (file)
index 0000000..2af0ae5
--- /dev/null
@@ -0,0 +1,57 @@
+[[!template id=gitbranch branch=schmonz/proxy author="[[schmonz]]"]]
+[[!tag patch]]
+
+## Background
+
+Ikiwiki has several plugins that open outbound connections:
+
+* [[plugins/aggregate]]
+* [[plugins/openid]]
+* [[plugins/pinger]]
+
+In some networks it is desired (or necessary) for these connections
+to traverse a proxy. Proxies are usually configured via environment
+variables, so for ikiwiki it is probably not desirable (or necessary)
+to manage proxy configuration via new purpose-specific settings in
+the setup file; `ENV` ought to suffice.
+
+[[!cpan LWP::UserAgent]] by default doesn't care about the usual
+environment variables, but if its constructor is passed a true
+`env_proxy` value, it does. Then environment settings such as these
+influence the agent, as expected:
+
+    ENV:
+      http_proxy: 'http://foo.internal:8080'
+      no_proxy: 'localhost,.bar.internal'
+
+If the proxy and/or destination requires authentication, it may
+also be necessary to prime `cookiejar`.
+
+## Changes
+
+This patch causes ikiwiki's `LWP::UserAgent` instances to:
+
+* honor proxy configuration in the environment
+* consistently make use of cookies configured in the setup file
+
+## Limitations
+
+The patch lets me configure [[plugins/aggregate]] to traverse my
+corporate proxy and to skip the proxy for internal hosts. I haven't
+tested it with the other two plugins, both of which prefer [[!cpan
+LWPx::ParanoidAgent]] if present, which deliberately lacks proxy
+support. There exists [[!cpan LWP::UserAgent::Paranoid]] claiming
+to be more modern, but I haven't looked at it further, so I don't
+know whether its paranoia measures up or whether it supports proxies.
+
+## See also
+
+* [[bugs/http_proxy_for_openid]]
+* [[forum/Setting_http__95__proxy]]
+
+> This looks fine, but you forgot to move the config entry for cookiejar
+> from aggregate to the config setting list in IkiWiki.pm --[[Joey]] 
+
+>> Indeed, fixed. --[[schmonz]]
+
+>>> [[merged|done]] --[[Joey]] 
diff --git a/doc/todo/pagedown_plugin/discussion.mdwn b/doc/todo/pagedown_plugin/discussion.mdwn
new file mode 100644 (file)
index 0000000..42015c4
--- /dev/null
@@ -0,0 +1,146 @@
+(This conversation was moved from [[plugins/wmd/discussion]]. --[[anarcat]])
+
+I've tried to retrieve the wmd-editor source tarball lately, but the site seems offline.
+
+From what I've read on the Internet, wmd-editor is not (yet?) free software by itself, and its author has gone MIA.
+But it looks like somebody recently took the step to rewrite a wmd-clone under a saner license, see [[pagedown|http://code.google.com/p/pagedown/source/browse/]].
+
+Given all the above, what about upgrading this plugin to use pagedown instead of wmd? It seem a clear win to me...
+
+> AFAICS, pagedown is a modified version of WMD. Let's 
+> look at its license file: --[[Joey]] 
+> 
+>     A javascript port of Markdown, as used on Stack Overflow
+>     and the rest of Stack Exchange network.
+>     
+>     Largely based on showdown.js by John Fraser (Attacklab).
+>     
+>     Original Markdown Copyright (c) 2004-2005 John Gruber
+>       <http://daringfireball.net/projects/markdown/>
+>     
+>     
+>     Original Showdown code copyright (c) 2007 John Fraser
+>     
+>     Modifications and bugfixes (c) 2009 Dana Robinson
+>     Modifications and bugfixes (c) 2009-2011 Stack Exchange Inc.
+>     
+>     Permission is hereby granted, free of charge, to any person obtaining a
+>     copy [...]
+>     
+> Ok, so it says it's based on showdown. John Fraser wrote showdown and also 
+> WMD, which IIRC was built on top of showdown. (Showdown converts the
+> markdown to html, and WMD adds the editor UI.)
+> 
+> I can nowhere find a actual statement of the copyright of showdown or
+> WMD. <http://code.google.com/p/wmd/> has a "MIT License" notice on it,
+> but this is clearly just the license chosen when signing up at google
+> code for the repo that would be used for a rewrite of the code, and the only thing 
+> said about the previous 1.0 release of WMD is "use it freely", which is not
+> specific enough to be a grant of license, and is moreover not a free
+> software license, as it does not cover distribution or modification.
+> 
+> Which was all covered in the thread here, 
+> when StackOverflow decided to start working on pagedown.
+> <http://blog.stackoverflow.com/2008/12/reverse-engineering-the-wmd-editor/>
+> This thread does not give any indication that they ever managed to get
+> a license grant for WMD/showdown. It frankly, does not inspire confidence
+> that the people working on this care about the license.
+> 
+> It would probably be pretty easy to adapt the ikiwiki wmd plugin 
+> to use pagedown. But without a clear and credible license, why?
+> 
+> (Note that I have a wmd-new branch in my ikiwiki git repo that
+> uses <https://github.com/derobins/wmd>, which was an earlier
+> version of pagedown (probably, not entirely clear).)
+> 
+> An alternate alternative is markitup: <http://markitup.jaysalvat.com/>
+> It has a clear history and a credible license (MIT or GPL dual license).
+> It's also easily extensible to other formats so could handle rst etc.
+> It does not, however, have a markdown to html converter -- for 
+> previewing it has to talk to the server with AJAX.
+> --[[Joey]]
+
+
+>> Showdown has a pretty explicit [license.txt file](https://github.com/coreyti/showdown/blob/master/license.txt)
+>> and it basically looks like a BSD license. That license.txt file was imported into 
+>> github directly from the upstream showdown source, so it seems credible. That zip file
+>> is still available [on archive.org](http://wayback.archive.org/web/20100612163302/http://attacklab.net/showdown/showdown-v0.9.zip),
+>> and does mention a BSD copyright.
+>>
+>> So Showdown itself is clean: it's free. Nowhere does it say it derives from WMD, or
+>> if it does, it doesn't matter *because* it was made by the same author **and then** 
+>> released under that free license. But even then, it does *not* mention being a
+>> derivative of WMD.
+>> 
+>> I agree the license behind WMD is murky. One the one hand, the [google code page](https://code.google.com/p/wmd/)
+>> mentions the code will be relicensed under MIT but "for now" we can "use it freely":
+>> 
+>> > *I'm refactoring the code, and will be releasing WMD under the MIT license soon. For
+>> now you can download the most recent release (wmd-1.0.1.zip) and use it freely.*
+>>
+>> That zip file is again offline, but it's also [on archive.org](http://web.archive.org/web/20101226145228/http://wmd-editor.com/downloads/wmd-1.0.1.zip).
+>> Things get a little more murky there: the file doesn't actually mention any copyright 
+>> statement, and the code is actually obfuscated, something that is mentionned on the aforementionned
+>> Stack Exchange thread. The [terms and conditions of WMD](http://web.archive.org/web/20100323043113/http://wmd-editor.com/terms)
+>> are pretty hostile however:
+>>
+>>> *All rights reserved. You may not duplicate, copy, or reuse any portion of the HTML/CSS, JavaScript, or visual design elements or concepts without express written permission from AttackLab.*
+>>
+>> But one could argue they apply only to WMD, and *not* showdown, which has been
+>> explicitely published under a different license. And maybe that was the whole 
+>> point here: the stack exchange people were trying to negociate having the 
+>> clear and free version of WMD for their own use, maybe showdown is actually
+>> what came out of this and what allows Stack exchange to do their thing...
+>> 
+>> And besides: the point here is that we *can't actually use WMD safely*, but
+>> we **can use pagedown safely!**.
+>> 
+>> I tried the plugin: it works, and it works well. It's also fairly trivial to
+>> install the upstream showdown library, which is not shipped with the plugin
+>> (which alleviates all possible copyright problems). You can take test the 
+>> plugin at <http://testwiki.anarc.at/>
+>> 
+>> There are only three issues I could find during testing:
+>> 
+>>  1. two previews are showed (the showdown one and the regular ikiwiki one),
+>>     which can be confusing, but is still necessary because the showdown one 
+>>     doesn't parse ikiwiki directives. 
+>>  2. the wiki needs to be rebuilt when the plugin is first activated for the
+>>     stylesheets to regenerate. new wikis are not affected, and this can be
+>>     deployed massively on farms without user intervention.
+>>  3. on large pages, the edit screen isn't in the first screen, so it's not 
+>>     obvious we're editing the page, which is also a little confusing - we 
+>>     would need an anchor in there... Update: a simple patch fixes that... 
+>>     but in a rather crude way:
+>>
+>>  [[!format diff """
+--- a/IkiWiki/Render.pm
++++ b/IkiWiki/Render.pm
+@@ -87,7 +87,7 @@ sub genpage ($$) {
+        my $actions=0;
+        if (length $config{cgiurl}) {
+                if (IkiWiki->can("cgi_editpage")) {
+-                       $template->param(editurl => cgiurl(do => "edit", page => $page));
++                       $template->param(editurl => cgiurl(do => "edit", page => $page) . '#editcontent');
+                        $actions++;
+                }
+        }
+"""]]
+>>      ideally, we would show the edit box next to the page preview... And there's a way to do that too! But it requires some more CSS hackery, like [this](http://css-tricks.com/scrollfollow-sidebar/), for example:
+>>
+>>     #wmd-preview {
+>>       position: relative;
+>>       margin: 15px auto;
+>>       float: left;
+>>       width: 50%;
+>>     }
+>>     form {
+>>       position: fixed;
+>>       margin-left: 50%;
+>>     }
+>>
+>> But this is getting a little crazy and I need to sleep now.
+>>
+>> [[!template id=gitbranch branch=anarcat/pagedown author="[[anarcat]]"]]
+>>
+>> Anyways, let's work on merging that pretty branch already shall we? :) --[[anarcat]]
diff --git a/doc/todo/pagespec__95__match__95__list_can_result_in_excessive_dependencies.mdwn b/doc/todo/pagespec__95__match__95__list_can_result_in_excessive_dependencies.mdwn
new file mode 100644 (file)
index 0000000..9781f75
--- /dev/null
@@ -0,0 +1,41 @@
+If you say
+
+    pagespec_match_list($page, $spec, list => \@pages)
+
+with a small list `@pages` and a vague pagespec `$spec`, `$page` ends
+up depending on (every page that matches) `$spec`. For instance, if you
+already have a list of subpages of the sandbox, and you want to filter it
+to only the discussion pages, you can do that like
+
+    pagespec_match_list("sandbox", "*/discussion",
+        list => ["sandbox/discussion", "sandbox/things", "sandbox/stuff"])
+
+but then a change to *any* discussion page will refresh the sandbox.
+
+The [[bugs/trails depend on everything]] bug was a particularly bad
+case of this, with the widest possible pagespec `internal(*)`
+matched against a small list (the trail).
+
+In principle it would be nice if `pagespec_match_list` could detect
+this situation and make sandbox depend on only those subpages instead.
+
+Perhaps if the `list` parameter is given, `p_m_l` should add a
+by-name (simple) dependency on each page in that list, instead
+of a dependency on the pagespec? Or perhaps it should be documented
+that plugins can pass `deptype => 0` to take responsibility for
+their own dependency handling, and then do whatever they need?
+
+Uses of `pagespec_match_list` with a non-trivial list, in-tree,
+after [[bugs/trails depend on everything]] is fixed:
+
+* brokenlinks: really does need to depend on the whole pagespec,
+  but that could be done separately
+
+* inline: the inliner already depends on the inlined pages
+  so no extra dependency is needed
+
+* pagestats: same as brokenlinks
+
+My album plugin is in the same situation as inline.
+
+--[[smcv]]
index 55624096403baeda26a9b3ea2c80b9d753616f1b..a640d651626285253cefcf23c12d3d501e41dd9c 100644 (file)
@@ -35,11 +35,15 @@ in the ikiwiki source code, where emailing is done.
 OK, so I'll have a look at replacing all email handling with *Email::Send*.
 
 [[!tag patch]]
-*<http://schwinge.homeip.net/~thomas/tmp/ikiwiki-sendmail.patch>*
+*<http://nic-nac-project.de/~schwinge/ikiwiki/0001-Use-Email-Send-instead-of-Mail-Sendmail.patch>*
 
 Remaining TODOs:
 
   * Resolve TODOs as denoted inside the patch.
+  * Update for the last years of ikiwiki development, such as adapting the
+    [[plugins/notifyemail]] plugin.
+  * Is this
+    [[UTF-8-safe|bugs/password_reset_fails_with___34__Wide_character_in_subroutine_entry__34__]]?
   * Is it worthwhile to use and depend on [[!cpan Return::Value]]
     just for this bit of functionality?
   * Debian news file.
diff --git a/doc/todo/per-page_comment_control.mdwn b/doc/todo/per-page_comment_control.mdwn
new file mode 100644 (file)
index 0000000..69937d7
--- /dev/null
@@ -0,0 +1,31 @@
+It might be nice to be able to control [[plugins/comments]] by inserting
+directives in individual pages:
+
+* disable comments where they would normally be enabled, e.g. for a blog
+  post you know is going to cause flamey responses (`\[[!closecomments]]`
+  to reject new comments but display old ones, `\[[!nocomments]]` to
+  hide comments too?)
+
+* direct comments to a different wiki page or an off-site URL,
+  e.g. if you have mentioned/posted something in two places
+  and you want to collect all the comments together
+  (maybe `\[[!commenton page=other/page]]`,
+  `\[[!commenton url="http://newsblog.example.com/the-next-big-thing"]]`?)
+
+* (maybe) enable comments where they would not normally be enabled?
+  (I'm unsure about this one, it would need to be under some level of
+  admin control - maybe a new pagespec for pages where comments are
+  disabled by default but may be enabled by directives)
+
+The use that got me thinking about this is that if the
+[[plugins/contrib/album]] plugin evolves to be able to have the same
+picture appear in more than one trail as kjs requested, all except the
+"original" (defined as the page to which the picture was attached) should
+probably either disable comments, or direct comments to the "original".
+
+I don't plan to work on this myself unless I find that I need it
+(for album or otherwise).
+
+--[[smcv]]
+
+[[!tag wishlist]]
diff --git a/doc/todo/per_page_ACLs.mdwn b/doc/todo/per_page_ACLs.mdwn
new file mode 100644 (file)
index 0000000..82acac2
--- /dev/null
@@ -0,0 +1,18 @@
+This is about going beyond the current [[ACL]] system and allow not only readonly pages (through [[plugins/lockedit]]) but also read protection, and per page. To quote that other page:
+
+>     [[!acl  user=joe page=.png allow=upload]]
+>     [[!acl  user=bob page=/blog/bob/ allow=]]
+>     [[!acl  user= page=/blog/bob/ deny=]]
+>     [[!acl  user=http://jeremie.koenig.myopenid.com/ page=/todo/* deny=create
+>            reason="spends his time writing todo items instead of source code"]]
+> 
+> Each would expand to a description of the resulting rule.
+> 
+> a configurable page of the wiki would be used as an ACL list. Possibly could refer to other ACL pages, as in:
+> 
+>     [[!acl  user= page=/subsite/ acl=/subsite/acl.mdwn]]
+
+I think this would be perfectly possible in Ikiwiki, provided of course the access to the full repository is not allowed, as that cannot be made granular. The way I would see that happen would be by dropping .htaccess files in the right directories and with clever configuration of the virtual host containing the ikiwiki install. Apache has plenty of methods for doing such authentication, and we could simply rely on [[plugins/httpauth/]] for that. *But* there is a key feature of having ACLs per page, or improving the httpauth plugin to have "noread" pagespecs... --[[anarcat]]
+
+Agreed with anarcat, I'am experimenting it. Moreover after sketching some kind of "private area" and a "public area" with [[plugins/httpauth/]], I realized in a public page, generated *backlinks* that appears, actually links pages in private. In the end users through backlink navigation will frequently hit HTTP/401 deterring browsing as well as for the admin at false-positive logwatching.  
+So the plus would be to have a visual display noticing that some link is denied (why not with the reason in a mouseover popup). [[mathdesc]] 
diff --git a/doc/todo/pick_a_new_canonical_name_for_equivalent_of_SQL_limit.mdwn b/doc/todo/pick_a_new_canonical_name_for_equivalent_of_SQL_limit.mdwn
new file mode 100644 (file)
index 0000000..daa520d
--- /dev/null
@@ -0,0 +1,38 @@
+In [[todo/Option_linktext_for_pagestats_directive]] I wrote:
+
+> It's unfortunate that map and pagestats have different meanings for
+> the show parameter. I'm tempted to propose a patch that adds something
+> like limit (by analogy with SQL) or max as the canonical name for the
+> "number of things to match" parameter, at which point a non-numeric show
+> could mean [what [[spalax]] proposed].
+
+It isn't immediately obvious whether `show` should be used like
+`\[[!map show=title]]` or like `\[[!inline show=10]]`. I can't think of
+any better names for the "which property to display" parameter that don't
+have the problem of being a synonym for show so you can't easily tell which
+is which, and I think that suggests that it might be better to rename the
+"number of items to display" parameter instead.
+
+This would allow recycling the name `show` so that a non-numeric
+value is interpreted analogous to `\[[!map show=title]]`,
+for instance to solve [[todo/Option_linktext_for_pagestats_directive]].
+
+If a committer (I think that just means Joey?) would review it, I'd be happy
+to put together a patch that adds the chosen name to all the directives
+that currently interpret `show` to mean "number of items", preferring the
+new name but retaining compatibility for a numeric `show`.
+
+Some possibilities (using inline as my example directive here):
+
+* `\[[!inline limit=10]]` like SQL `select * from foo limit 10`
+* `\[[!inline max-count=10]]` like `git log --max-count=10`
+* `\[[!inline max=10]]`
+* `\[[!inline n=10]]`, `\[[!inline num=10]]`, `\[[!inline number=10]]`
+* `\[[!inline count=10]]`
+
+Which of those do Joey/other contributors prefer?
+
+Or if keeping `show=10` is preferred, what should be the conventional name
+for functionality like `\[[!map show=title]]`?
+
+I personally like the idea of `\[[!inline limit=10]]`. --[[smcv]]
diff --git a/doc/todo/please_add_some_table_styles.mdwn b/doc/todo/please_add_some_table_styles.mdwn
new file mode 100644 (file)
index 0000000..1308e19
--- /dev/null
@@ -0,0 +1,8 @@
+[[!template id=gitbranch branch=jmtd/tablestyle author="[[Jon]]"
+
+]]The [[plugins/table]] plugin's "`class`" argument is a pretty useful
+shortcut, and it would be nice to provide at least one example class
+designed for use with tables pre-defined in ikiwiki. I've written a
+quick, minimal one that makes the table full-width (and some very
+minimal, useful table styling) called `fullwidth_table` — please
+consider merging it. Thanks! — [[Jon]][[!tag wishlist patch]]
index d2ae2ed5cffba62d387a7bf5edbdd5af0a6e3c43..68da99f6f9e5556230d1d528ab22a227008f5501 100644 (file)
@@ -3,3 +3,5 @@ with automatic escaping of special chars.
 
 [[Integrating with transifex|todo/po: transifex integration]] or with
 Pootle would be another way to go.
+
+[[wishlist]]
index 5d0318ae10f66363642ac49539d3f2c7dbd9a6e4..6c11fa17baafc5db4ebab4b916f4151096b8bbdc 100644 (file)
@@ -11,3 +11,9 @@ files from the source repository when it has been disabled?
 >> `rcs_remove` rather than a good old `unlink`. --[[intrigeri]]
 
 >>> I guess you could call `rcs_remove` followed by `unlink`. --[[Joey]] 
+
+>>>> Implemented in my `po-disable` branch, added a basic test case
+>>>> that passes, not tested in a real ikiwiki with a VCS yet.
+>>>> Not sure I'll have time to do better any time soon, but for
+>>>> anyone interested to lead this to completion, it should be a good
+>>>> starting point. --[[intrigeri]]
diff --git a/doc/todo/polltrails.mdwn b/doc/todo/polltrails.mdwn
new file mode 100644 (file)
index 0000000..387ab3f
--- /dev/null
@@ -0,0 +1,3 @@
+When the poll directive is used on a page in a trail, voting on the poll
+should advance to the next page in the trail. This would allow multiple
+poll questionairres with a reasonable UI. --[[Joey]]
index 7e95791c6467127c8095d4da89f50ad6fbd3e03d..3bf1bdc33ea56fea6a59d7955d68be8c6f04db78 100644 (file)
@@ -11,13 +11,17 @@ It would rock if I could view diffs from the web without going via feeds. I envi
 > > 
 > > Unfortunately it has some issues:
 > > 
-> > 1. it assumes the toggle.js code is loaded somehow
-> > 2. if the toggle code isn't loaded the diffs are displayed (which is arguably better than showing nothing since we ship the diff to the UA anyways...)
+> > 1. <del>it assumes the toggle.js code is loaded somehow</del> - now loaded manually
+> > 2. <del>if the toggle code isn't loaded the diffs are displayed (which is arguably better than showing nothing since we ship the diff to the UA anyways...)</del> - i actually think that's fine
 > > 3. <del>it will show only if there's a revert URL, which is backwards, but otherwise the display is weird, with each button on its own line</del> fixed!
-> > 4. if the diffurl parameter is set in the template, we'd actually see two sets of glasses, which is silly. 
+> > 4. <del>if the diffurl parameter is set in the template, we'd actually see two sets of glasses, which is silly.</del> - just added a tmp_unless to fix this.
 > >
 > > I feel this should nevertheless be implemented because if we're going to compile all this crap in the page anyways and send it to the client, why not allow the user to show it? I also feel that showing it by default is a lesser evil for non-javascript users.
 > >
 > > -- [[anarcat]] 2012-03-03
 
+> > > I have pushed a new version of this patch to my branch, which fixes all the above issues. I think this is ready to be merged now. -- [[anarcat]] 2012-07-19
+
+>>>> [[done]] --[[Joey]] 
+
 [[!tag wishlist patch]]
diff --git a/doc/todo/publishing_in_the_future.mdwn b/doc/todo/publishing_in_the_future.mdwn
new file mode 100644 (file)
index 0000000..9b6f3f8
--- /dev/null
@@ -0,0 +1,135 @@
+[[!tag wishlist]]I would quite like the ability to write a page (blog post in
+practice) but for the page to not be displayed until a date and time after it
+is added to the wiki. I've thought this through a bit, but would appreciate
+feedback from people before I go any further. Would anyone else find this
+useful?
+
+Thinking about how to implement this in ikiwiki, perhaps a conditional
+pagespec would be best (which could be tidied up into a template)
+
+    \[[!if test="current_date_before(<TMPL_VAR date>)"
+    then="""[[!tag draft]]"""
+    else="""[[!meta date="<TMPL_VAR date>"]]"""
+    ]]
+
+…pre-supposing a scheme whereby tagging 'draft' hides the page from an
+aggregation somewhere.  With a template, this could collapse to
+
+    \[[!template id=publishafter date="Thu Aug 30 14:13:06 BST 2012"]]
+
+This would require implementing the `current_date_before` pagespec.
+
+You would also need a regularly scheduled wiki refresh and a way of marking the
+unpublished pages as 'dirty' so they were always scanned on refresh until their
+publish date has occurred. That could perhaps be implemented via a small plugin
+which defined a pagespec which ensured the page was 'dirty':
+
+    \[[!meta date="<TMPL_VAR date>"]]
+    \[[!if test="!current_date_before(<TMPL_VAR date>)"
+    then="""[[!tag draft]][[!dirty]]"""
+    ]]
+
+The following is an attempt at the dirty part:
+
+    #!/usr/bin/perl
+    package IkiWiki::Plugin::dirty;
+    # provides a pagespec 'dirty' which ensures the page will always be
+    # re-scanned for content on wiki refresh.
+    
+    use warnings;
+    use strict;
+    use IkiWiki 3.00;
+    
+    hook(type => "preprocess", id => "dirty", call => \&preprocess);
+    hook(type => "needsbuild", id => "dirty", call => \&needsbuild);
+    
+    sub preprocess (@) {
+      my %params = @_;
+      $pagestate{$params{page}}{dirty}{dirty} = 1;
+      return '';
+    }
+    
+    sub needsbuild (@) {
+      my $pages= shift;
+      my %p2 = map { $_ => 1 } @$pages;
+      my %d2 = map { $_ => 1 } @$deleted;
+    
+      foreach my $page (keys %pagestate) {
+        if(exists $pagestate{$page}{dirty}{dirty}) {
+          push @$pages, $pagesources{$page} unless
+            (exists $p2{$pagesources{$page}} or exists $d2{$pagesources{$page}});
+          delete $pagestate{$page}{dirty}{dirty};
+        }
+      }
+    
+      return $pages;
+    }
+    
+    1
+
+Although it doesn't fit, the `current_date_before` pagespec could be implemented
+in the same plugin. I tried the following (before the trailing `1`):
+
+    package IkiWiki::PageSpec;
+    use Date::Parse;
+    
+    sub match_current_date_before ($$;@) {
+      shift;
+      my $date = shift;
+      my $out = str2time($date);
+      if(defined $out) {
+        return IkiWiki::SuccessReason->new("time before now") if $out < time();
+        return IkiWiki::FailReason->new("time not before now");
+      } else { return IkiWiki::ErrorReason->new("couldn't parse time $date")};
+    }
+
+I always hit the `ErrorReason` branch when I try to use it, even with strings
+which work fine in test scripts.  If anyone can help me debug that I'd be very
+grateful.
+If anyone has any clues as to why this doesn't work 
+
+Thoughts on the whole idea? — [[Jon]]
+
+> There is an old todo about it: [[tagging_with_a_publication_date]].
+> I feel my idea there about making a pagespec that is limited to
+> items in the present/past, combined with setting the meta data, is a good
+> way.. --[[Joey]]  
+
+>> Thanks for your response Joey. Should I merge these two TODOs, then?
+>> So if I understand you correctly, you would prefer some new pagespecs
+>> to match future/past dates, and a plugin which kept track of pages with
+>> a future date and kept them 'dirty' (similar to the above), which means
+>> avoiding the need for a `dirty` pagespec in the page itself. Is that
+>> about right?
+>> 
+>> I came up with the following, but I haven't adapted `dirty.pm` inline
+>> with my understanding above, yet.
+
+    sub match_infuture ($$;@) {
+      my $page = shift;
+      return IkiWiki::SuccessReason->new("page time is in the future")
+        if $IkiWiki::pagectime{$page} > time;
+      return IkiWiki::FailReason->new("page time is not in the future");
+    }
+
+>> I've managed to get my original suggestion working. The problem was
+>> I was using quotes when invoking the pagespec, which stopped `str2time`
+>> working. 
+>> 
+>> Let me know if I've understood your POV correctly and I'll see about
+>> tidying this up and putting it in a branch.
+>> 
+>> Finally, a way of scheduling future runs of ikiwiki *within ikiwiki
+>> itself* might be useful for other things too, and would avoid the 
+>> need for a cron job in this case. (I'm thinking of a plugin that
+>> implemented itself in terms of cron, or at, or both, or possibly
+>> other things depending on what people want to support). But that would
+>> be substantially more work, more than I can afford atm at least. — [[Jon]]
+
+> Some times ago, I wrote a Pagespec function that matches pages that have
+> creation date in the future: [[plugins/contrib/created_in_future/]]. It can
+> be enhanced to create the `current_date_before(<DATE>)` pagespec. The
+> interesting part of my plugin is that it makes IkiWiki rebuild pages on the
+> right date.
+>
+> -- [[Louis|spalax]]
diff --git a/doc/todo/recentchanges_feed_with_comment.mdwn b/doc/todo/recentchanges_feed_with_comment.mdwn
new file mode 100644 (file)
index 0000000..4c32b9c
--- /dev/null
@@ -0,0 +1,5 @@
+There is currently know clean way to extract the actual "description" the user provided for a change in the recent changes. They get displayed in the "description" blob of the recent changes, but only as HTML and alongside the diff blob and other things.
+
+It would be nice if the user's "description" (the git commitlog, really) would be a first class citizen, because right now the RSS feed titles only say "user: change to page/blah", which is really not informative. We should at least have the commitlog available as a field. -- [[anarcat]]
+
+[[!tag wishlist]]
diff --git a/doc/todo/send_only_one_mail_per_page_in_notifyemail.mdwn b/doc/todo/send_only_one_mail_per_page_in_notifyemail.mdwn
new file mode 100644 (file)
index 0000000..5bbee0d
--- /dev/null
@@ -0,0 +1,7 @@
+[[!tag wishlist]]
+
+[[!template  id=gitbranch branch=anarcat/notify_one_email author="[[anarcat]]"]]
+
+While working on [[todo/option to send only the diff in notifyemail]], I tried to improve the [[plugins/notifyemail]] plugin to make it send only one email per change instead of one email per file changed. When using the wiki through git, this is particularly important if people touch a lot of pages at the same time.
+
+The [[!taglink patch]], incomplete and buggy, is in my `notify_one_email` branch. --[[anarcat]]
index a454d7da5d6565fa4e475fca5cef8af1ff5e0c49..5a55fcce5b8977612b3e3f360cf6a59dbc8179ba 100644 (file)
@@ -5,7 +5,7 @@ I hope it's a bug, not a feature and you fix it soon :) --[[Paweł|ptecza]]
 
 > ikiwiki only allows a very limited set of characters raw in page names,
 > this is done as a deny-by-default security thing. All other characters
-> need to be encoded in __code__ format, where "code" is the character
+> need to be encoded in `__code__` format, where "code" is the character
 > number. This is normally done for you, but if you're adding a page
 > manually, you need to handle it yourself. --[[Joey]]
 
@@ -48,6 +48,11 @@ I hope it's a bug, not a feature and you fix it soon :) --[[Paweł|ptecza]]
 >>>>>> What's your locale? I have both pl\_PL (ISO-8859-2) and pl\_PL.UTF-8,
 >>>>>> but I use pl\_PL. Is it wrong? --[[Paweł|ptecza]]
 
+>>>>>>> IkiWiki assumes UTF-8 throughout, so escaped filename characters
+>>>>>>> should be `__x____y____z__` where x, y, z are the bytes of the
+>>>>>>> UTF-8 encoding of the character. I don't know how to achieve that
+>>>>>>> from a non-UTF-8 locale. --[[smcv]]
+
 >>>> Now, as to UTF7, in retrospect, using a standard encoding might be a
 >>>> better idea than coming up with my own encoding for filenames. Can 
 >>>> you provide a pointer to a description to modified-UTF7? --[[Joey]]
@@ -58,4 +63,38 @@ I hope it's a bug, not a feature and you fix it soon :) --[[Paweł|ptecza]]
 >>>>> There is a Perl [Unicode::IMAPUtf7](http://search.cpan.org/~fabpot/Unicode-IMAPUtf7-2.01/lib/Unicode/IMAPUtf7.pm)
 >>>>> module at the CPAN, but probably it hasn't been debianized yet :( --[[Paweł|ptecza]]
 
+> Note: [libencode-imaputf7-perl][1] has made it into debian.
+>
+>> "IMAP UTF-7" uses & as an escape character, which seems like a recipe
+>> for shell injection vulnerabilities... so I would not recommend it
+>> for this particular use. --[[smcv]]
+
+> I would value some clarification, in the ikiwiki setup file I have
+>
+>     wiki_file_chars: -[:alnum:][\p{Arabic}()]+/.:_
+>
+> Ikiwiki doesn't seem to produce any errors on the commandline for this, but
+> when I attempt to create a new post with Arabic characters from the web I get the following error :
+>
+>     Error: Cannot decode string with wide characters at /usr/lib/x86_64-linux-gnu/perl/5.20/Encode.pm line 215. 
+>
+> Should the modified regexp not be sufficient?
+> Ikiwiki 3.20140815.
+> --[[mhameed]]
+
+>> This seems like a bug: in principle non-ASCII in `wiki_file_chars` should work,
+>> in practice it does not. I would suggest either using the default
+>> `wiki_file_chars`, or digging into the code to find what is wrong.
+>> Solving this sort of bug usually requires having a clear picture of
+>> which "strings" are bytestrings, and which "strings" are Unicode. --[[smcv]]
+
+>>> mhameed confirmed on IRC that anarcat's [[patch]] from
+>>> [[bugs/garbled_non-ascii_characters_in_body_in_web_interface]] fixes this.
+>>> --[[smcv]]
+
+>>>> Merged that patch. Not marking this page as done, because the todo
+>>>> about using a standard encoding still stands (although I'm not at
+>>>> all sure there's an encoding that would be better). --[[smcv]]
+
 [[wishlist]]
+[1]: https://packages.debian.org/search?suite=all&section=all&arch=any&searchon=names&keywords=libencode-imaputf7-perl
index f6ccaf538dd286bb6ae28323c0d2eac4f42b687e..b07ea33f173641f94f1a9822e6e965c9178bc7a7 100644 (file)
@@ -4,4 +4,50 @@ Having a `sort=` parameter for the map plugin/directive would be real nice; like
 
 I may hack one in from `inline` if it seem within my skill level.
 
+> this could leverage the [[sorting mechanism|ikiwiki/pagespec/sorting]] already in place. as it's not sorting a flat list, there's a number of different ways to sort, which should be configurable imo.
+>
+> as an example, i'll consider pages created in the sequence c/1, a, b, c, a/1, c/2.
+>
+> sorting could:
+>
+> * sort within each level:
+>
+>   sorting order of child nodes would only matter internally in the groups
+>
+>   that would create a (a/1) b c (c/1 c/2) sequence in our example.
+>
+> * sort by maximum
+>
+>   the highest ranking page in a group would pull the parent to its own position
+>
+>   that would create b a (a/1) c (c/1 c/2).
+>
+> * sort by minimum
+>
+>   the lowest ranking page in a group would pull the parent to its own position
+>
+>   here, that would give c (c/1 c/2) a (a/1) b
+>
+> * forced sequence
+>
+>   all deepest-level items are forced to their positions, even if that means their parents are repeated at positions where they wouldn't occur naturally. parent nodes that don't have child nodes that occur directly before or after them are shown without the child nodes.
+>
+>   that'd be c (c/1) a b c a (a/1) c (c/2) in our example.
+>
+>   admittedly, the use cases for that are not too obvious, but think of a travel diary, for example, where you'd have the entries chronologically but grouped by the country you've visited. when you visit the same country twice, it should show up twice too.
+>
+> --[[chrysn]]
+
+------
+
+> i now do have two thirds of the solution:
+>
+> * i've patched the map plugin to accept a sort parameter (as usual in pagespec directives) and a strategy parameter, which is used to choose how the tree should be sorted. it turned out that the changes required were minimal; even precautions for having to display a node's parents although they are not supposed to be shown by themselves are present (they're decorated with the mapparent css class).
+> * i've implemented algorithms for the described strategies, but in python -- i tried in perl, but i'm not versed well enough in perl for such things. the "force" strategy works in perl but i'm afraid it depends on more than the perl sort algorithm to be just stable.
+> * if someone could port the three strategies implemented in python to perl, we'd have a complete patch for this.
+>
+> when comparing the implementation to my notes above, you'll see that there is a minor difference in the "force" algorithm -- my code doesn't generate the "parent" entries (**c** (c/1) a b c **a** (a/1) **c** (c/2) in the example), but they're generated by the already existing output code.
+>
+> the code can be found at [[incomplete_patch.pl.pl]] and [[python_algorithms.py]]. --[[chrysn]]
+
 [[!tag wishlist]]
diff --git a/doc/todo/sort_parameter_for_map_plugin_and_directive/incomplete_patch.pl.pl b/doc/todo/sort_parameter_for_map_plugin_and_directive/incomplete_patch.pl.pl
new file mode 100644 (file)
index 0000000..1297be6
--- /dev/null
@@ -0,0 +1,77 @@
+diff --git a/IkiWiki/Plugin/map.pm b/IkiWiki/Plugin/map.pm
+index 38f090f..6b884cd 100644
+--- a/IkiWiki/Plugin/map.pm
++++ b/IkiWiki/Plugin/map.pm
+@@ -25,6 +25,42 @@ sub getsetup () {
+               },
+ }
++sub strategy_byparents (@) {
++      # Sort by parents only
++      #
++      # With this strategy, children are sorted *under* their parents
++      # regardless of their own position, and the parents' positions are
++      # determined only by comparing the parents themselves.
++
++      # FIXME this is *not* what's described above, but the old behavior (for
++      # testing/comparison)
++      use sort 'stable';
++      my (@sequence,) = @_;
++      @sequence = sort @sequence;
++      return @sequence;
++}
++
++sub strategy_forcedsequence (@) {
++      # Forced Sequence Mode
++      #
++      # Using this strategy, all entries will be shown in the sequence; this
++      # can cause parents to show up multiple times.
++      #
++      # The only reason why this is not the identical function is that
++      # parents that are sorted between their children are bubbled up to the
++      # top of their contiguous children to avoid being repeated in the
++      # output.
++
++      use sort 'stable';
++
++      my (@sequence,) = @_;
++      # FIXME: i'm surprised that this actually works. i'd expect this to
++      # work with bubblesort, but i'm afraid that this may just not yield the
++      # correct results with mergesort.
++      @sequence = sort {($b eq substr($a, 0, length($b))) - ($a eq substr($b, 0, length($a)))} @sequence;
++      return @sequence;
++}
++
+ sub preprocess (@) {
+       my %params=@_;
+       $params{pages}="*" unless defined $params{pages};
+@@ -37,8 +73,11 @@ sub preprocess (@) {
+       # Get all the items to map.
+       my %mapitems;
++      my @mapsequence;
+       foreach my $page (pagespec_match_list($params{page}, $params{pages},
+-                                      deptype => $deptype)) {
++                                      deptype => $deptype,
++                                      sort => exists $params{sort} ? $params{sort} : "title")) {
++              push(@mapsequence, $page);
+               if (exists $params{show} && 
+                   exists $pagestate{$page} &&
+                   exists $pagestate{$page}{meta}{$params{show}}) {
+@@ -88,7 +127,15 @@ sub preprocess (@) {
+               $map .= "<ul>\n";
+       }
+-      foreach my $item (sort keys %mapitems) {
++      if (!exists $params{strategy} || $params{strategy} eq "parent") {
++              @mapsequence = strategy_byparents(@mapsequence);
++      } elsif ($params{strategy} eq "forced") {
++              @mapsequence = strategy_forcedsequence(@mapsequence);
++      } else {
++              error("Unknown strategy.");
++      }
++
++      foreach my $item (@mapsequence) {
+               my @linktext = (length $mapitems{$item} ? (linktext => $mapitems{$item}) : ());
+               $item=~s/^\Q$common_prefix\E\///
+                       if defined $common_prefix && length $common_prefix;
diff --git a/doc/todo/sort_parameter_for_map_plugin_and_directive/python_algorithms.py b/doc/todo/sort_parameter_for_map_plugin_and_directive/python_algorithms.py
new file mode 100644 (file)
index 0000000..e89c54f
--- /dev/null
@@ -0,0 +1,86 @@
+testdata = "c/3 a b d b/1 c/1 c/2/x c/2 c".split(" ")
+
+def strategy_byearlychild(sequence):
+    """Sort by earliest child
+
+    When this strategy is used, a parent is displayed with all its children as
+    soon as the first child is supposed to be shown.
+
+    >>> strategy_byearlychild(testdata)
+    ['c', 'c/3', 'c/1', 'c/2', 'c/2/x', 'a', 'b', 'b/1', 'd']
+    """
+
+    # first step: pull parents to top
+    def firstchildindex(item):
+        childindices = [i for (i,text) in enumerate(sequence) if text.startswith(item + "/")]
+        # distinction required as min(foo, *[]) tries to iterate over foo
+        if childindices:
+            return min(sequence.index(item), *childindices)
+        else:
+            return sequence.index(item)
+    sequence = sorted(sequence, key=firstchildindex)
+
+    # second step: pull other children to the start too
+    return strategy_byparents(sequence)
+
+def strategy_byparents(sequence):
+    """Sort by parents only
+
+    With this strategy, children are sorted *under* their parents regardless of
+    their own position, and the parents' positions are determined only by
+    comparing the parents themselves.
+
+    >>> strategy_byparents(testdata)
+    ['a', 'b', 'b/1', 'd', 'c', 'c/3', 'c/1', 'c/2', 'c/2/x']
+    """
+
+    def partindices(item):
+        """Convert an entry a tuple of the indices of the entry's parts.
+
+        >>> sequence = testsequence
+        >>> assert partindices("c/2/x") == (sequence.index("c"), sequence.index("c/2"), sequence.index("c/2/x"))
+        """
+        return tuple(sequence.index(item.rsplit('/', i)[0]) for i in range(item.count('/'), -1, -1))
+
+    return sorted(sequence, key=partindices)
+
+def strategy_forcedsequence(sequence):
+    """Forced Sequence Mode
+
+    Using this strategy, all entries will be shown in the sequence; this can
+    cause parents to show up multiple times.
+
+    The only reason why this is not the identical function is that parents that
+    are sorted between their children are bubbled up to the top of their
+    contiguous children to avoid being repeated in the output.
+
+    >>> strategy_forcedsequence(testdata)
+    ['c/3', 'a', 'b', 'd', 'b/1', 'c', 'c/1', 'c/2', 'c/2/x']
+    """
+
+    # this is a classical bubblesort. other algorithms wouldn't work because
+    # they'd compare non-adjacent entries and move the parents before remote
+    # children. python's timsort seems to work too...
+
+    for i in range(len(sequence), 1, -1):
+        for j in range(1, i):
+            if sequence[j-1].startswith(sequence[j] + '/'):
+                sequence[j-1:j+1] = [sequence[j], sequence[j-1]]
+
+    return sequence
+
+def strategy_forcedsequence_timsort(sequence):
+    sequence.sort(lambda x,y: -1 if y.startswith(x) else 1)
+    return sequence
+
+if __name__ == "__main__":
+    import doctest
+    doctest.testmod()
+
+    import itertools
+
+    for perm in itertools.permutations(testdata):
+        if strategy_forcedsequence(testdata[:]) != strategy_forcedsequence_timsort(testdata[:]):
+            print "difference for testdata", testdata
+            print "normal", strategy_forcedsequence(testdata[:])
+            print "timsort", strategy_forcedsequence_timsort(testdata[:])
diff --git a/doc/todo/sortable_tables.mdwn b/doc/todo/sortable_tables.mdwn
new file mode 100644 (file)
index 0000000..ebdc72c
--- /dev/null
@@ -0,0 +1,3 @@
+It would be nice if ikiwiki's table plugin could create sortable tables like Mediawiki does.
+
+This is on my wishlist too.  I believe Mediawiki does this with the [DataTables](http://datatables.net/) JQuery Plugin.
diff --git a/doc/todo/support_linking_to_cgit.mdwn b/doc/todo/support_linking_to_cgit.mdwn
new file mode 100644 (file)
index 0000000..ae7d23c
--- /dev/null
@@ -0,0 +1,45 @@
+As described on [Tails issue #5879](https://labs.riseup.net/code/issues/5879),
+cgit wants URLs like:
+
+        https://git-tails.immerda.ch/tails/commit/wiki/src/todo/fix_localized_iceweasel_search_engine.mdwn?id=c682a361418bef7bce040ea2905691d54be192ab
+
+... while ikiwiki generates links like:
+
+        https://git-tails.immerda.ch/tails/commit/wiki/src/todo%2Ffix_localized_iceweasel_search_engine.mdwn?id=c682a361418bef7bce040ea2905691d54be192ab
+
+on the recentchanges page.
+
+Would it make sense to add an option to skip URL-encoding when doing
+the substitution of `\[[file]]` in `diffurl` and `historyurl`?
+
+--[[intrigeri]]
+
+> In `91b477c` I made a similar change to how the cvs backend encodes
+> `diffurl`. Perhaps it applies to all VCS backends? --[[schmonz]]
+
+>> Thanks a lot! I've not looked at it yet, but will try to do so
+>> soonish, as this bug is a real problem for Tails when welcoming potential
+>> new contributors. --[[intrigeri]]
+
+>>> My `fix_diffurl_vs._cgit` branch now implements schmonz' change
+>>> for the Git plugin. Please review and merge if you like
+>>> it. --[[intrigeri]]
+
+>>>> Ping? --[[intrigeri]]
+
+>>>> Normally, my tendency towards pedantic preservation of existing APIs
+>>>> would make me implement a new token \[[file_less_escaped]] or
+>>>> something, analogous to `%s` vs. `%S` in [[shortcuts]]; but
+>>>> gitweb and cgit are both OK with `/` not being escaped, whereas
+>>>> only gitweb allows it to be escaped as `%2F`, so I think your
+>>>> solution is fine. Also, it would need a much better name than
+>>>> \[[file_less_escaped]], and I can't think of one.
+>>>>
+>>>> I don't have commit access to ikiwiki.info, but if I did,
+>>>> [[I'd merge this|/users/smcv/ready]]. --[[smcv]]
+
+>>>>> [[merged|done]] --[[Joey]]
+
+[[wishlist]]
+
+[[!tag patch]]
diff --git a/doc/todo/support_multi-row_table_headers.mdwn b/doc/todo/support_multi-row_table_headers.mdwn
new file mode 100644 (file)
index 0000000..6f13bbb
--- /dev/null
@@ -0,0 +1,79 @@
+[[!template id=gitbranch branch=jon/table_headerblock author="[[Jon]]"]]
+It would be great if it were possible to support multi-row table headers in the [[plugins/table]] plugin, so you could do e.g.
+
+        \[[!table header="""
+        Name | Platform ||
+        | Windows | Mac | Linux
+        """ data="""
+        ikiwiki | ‧ | ✓ | ✓
+        """]]
+
+-- [[Jon]]
+
+[[!tag wishlist patch]]
+
+> This seems like weird overloading of the header parameter - it's
+> table data, except when it isn't.
+
+> > My first cut (now rebased out of existence I think) introduced a
+> > new "headerblock" parameter, but trying to clearly document the
+> > interaction of data/headerblock/header parameters was too awkward. -- [[Jon]]
+
+> Perhaps
+> something like this would be easier to use in practice?
+> (and also more featureful :-) )
+>
+>     \[[!table header="2 rows 1 column" data="""
+>     Name | Platform ||
+>     | Windows | Mac | Linux
+>     ikiwiki | no | yes | yes
+>     Starcraft | yes | yes | via Wine
+>     """]]
+
+> > Thanks for your prompt feedback!
+> > 
+> > This would probably be good, yes, and having mixed row/column headers is
+> > definitely a nice-to-have. I don't relish the prospect of writing the parser
+> > but I see you've made a stab already...
+> > 
+> > One thing you'd lose, but it's debatable whether this is valuable, would be
+> > to have the header defined in the directive, and the remaining table data
+> > declared in an external CSV. -- [[Jon]]
+
+> intended to be rendered like
+>
+> <table>
+> <tr><th>Name</th><th colspan=2>Platform</th>
+> <tr><th></th><th>Windows</th><th>Mac</th><th>Linux</th></tr>
+> <tr><th>ikiwiki</th><td>no</td><td>yes</td><td>yes</td></tr>
+> <tr><th>Starcraft</th><td>yes</td><td>yes</td><td>via Wine</td></tr>
+> </table>
+>
+> (Deliberately switching to plain-text to make it more obvious
+> what's a `<th>` and what's `<td>`.)
+>
+> Vague pseudocode for parsing `headers`
+> (possibly even valid Perl, I'm not sure):
+>
+>     my ($header_rows, $header_cols);
+>     while ($header =~ s/(\d*)\W*(\w+)//) {
+>         my $n = ($1 or 0);
+>         my $what = $2;
+>         if ($what =~ m/rows?/) {
+>             $header_rows = $n;
+>         }
+>         elif ($what =~ m/col(?:umn)?s?/) {
+>             $header_cols = $n;
+>         }
+>     }
+>
+> and it would even be fairly easy to extend to support
+> `(first|last|)\W*(\d*)\W*(\w+)` later, e.g.
+> `header="1 row, first 2 cols, last column"`.
+>
+> --[[smcv]]
+
+> > To be clear I think your suggestion is a good one, but my hack has
+> > addressed my immediate need so it's the one I'm deploying at $ork for the
+> > time being. I'm unlikely to have time to implement this solution in the
+> > near future. -- [[Jon]]
index 39fc4e22088869b0bff96936f4ebe0259106b8fc..b4d3ca007a23c484a1c67e9c9d22cca7a7961323 100644 (file)
@@ -69,3 +69,9 @@ on vacation".
 >>> 
 >>> You'd still need a cron job to run ikiwiki -refresh every hour, or
 >>> whatever, so it can update. --[[Joey]] 
+
+---
+
+Some times ago, I wrote a Pagespec function that matches pages that have creation date in the future: [[plugins/contrib/created_in_future/]]. It can be used to solve the original problem.
+
+-- [[Louis|spalax]]
diff --git a/doc/todo/toc-with-human-readable-anchors.mdwn b/doc/todo/toc-with-human-readable-anchors.mdwn
new file mode 100644 (file)
index 0000000..0f358f4
--- /dev/null
@@ -0,0 +1,7 @@
+The [[/plugins/toc]] plugin is very useful but it creates anchors with names such as #index1h3
+
+In #ikiwiki today, another user and I were in agreement that an option for human readable anchors would be preferable.
+
+> +1 - i would love to see that happen too. Here's a patch I wrote a while back for similar functionality in moinmoin: https://svn.koumbit.net/koumbit/trunk/patches/moinmoin/nice_headings.patch -- [[anarcat]]
+
+[[!tag wishlist]]
diff --git a/doc/todo/translation_links.mdwn b/doc/todo/translation_links.mdwn
new file mode 100644 (file)
index 0000000..63e8d10
--- /dev/null
@@ -0,0 +1,46 @@
+This is an offshoot of [[this rant|translation/discussion/#index3h1]].
+
+Basically, while I can appreciate the [[plugins/po]] plugin for more or less "static" site, or more organised wikis, for certain wikis, it's way too overhead.
+
+## Stories
+
+The following stories should be answered by that plugin:
+
+ 1. a user browses the wiki, finds that the page is translated in another language and clicks on the language to see that page translated
+ 2. a user browses the wiki and gets automatically the right language
+ 3. an editor creates a wiki page, and it gets assigned a language
+ 4. a translator sees that page and translates it to another language, and that page is linked with the first one, both ways (in that stories 1 and 2 can work)
+ 5. (optional) a translator can see the list of pages needing translation and translate pages
+ 6. (optional) an editor changes a wiki page, the translated page is marked as "dirty" (ie. needing translation)
+
+## Fundamental constraints
+
+This issue is about creating a "wikipedia-like" translation structure where:
+
+ 1. there's no "master language"
+ 2. there's a loose connexion between pages
+ 3. not all pages are necessarily translated, nor is it a goal
+
+Those are fundamental constraints that should be required by that plugin. It doesn't mean that the plugin cannot be used otherwise, but that's all it needs to respect to fulfill the requirements here.
+
+## Optional constraints
+
+There can be more constraints that we may want to impose or not, which will make things more or less complicated:
+
+ 4. the page URLs need to be translatable - it would make [[!wikipedia Content_negotiation]] fail, so it would require the CGI for story 2. it would also make it harder to create the connexion between pages, as metadata would be needed in each page
+ 5. the language must not be visible in the URL - same as #4
+ 6. translation system must also be usable from the commandline/git repository - #5 and #6 would be basically impossible to implement there
+
+## Basic spec
+
+ 1. a hook that looks for foo.la.mdwn pages, where la is a language code (defined where..?), and that lists available translations - 
+    this is where most of the work needs to happen. we can probably reuse the builtin template stuff that got injected with the [[plugins/po]] plugin was imported, to start with
+ 2. instructions on how to setup [[!wikipedia Content_negotiation]] so that the above works out of the box - just documentation
+ 3. a button to create such translations - that would be through the [[pageactions hook|plugins/write/#index15h3]]
+ 4. a default language setting? - that's obviously the getsetup hook
+ 5. a set of language code settings? - same
+ 6. content-negotiation - the po module has good code for that
+
+## Authors
+
+ * [[anarcat]]
diff --git a/doc/todo/upload__95__figure.mdwn b/doc/todo/upload__95__figure.mdwn
new file mode 100644 (file)
index 0000000..a63e183
--- /dev/null
@@ -0,0 +1,22 @@
+I would like to upload a svg figure to illustrate [[this tip|tips/Hosting_Ikiwiki_and_master_git_repository_on_different_machines/]] (this figure would also appear [[here|tips/distributed_wikis]]). 
+
+Unfortunately, Github shows [[raw code|https://github.com/paternal/ikiwiki/blob/paternal/upload-svg/doc/tips/Hosting_Ikiwiki_and_master_git_repository_on_different_machines/separate-web-git-servers.svg]] instead of the image. 
+
+[[!template  id=gitbranch branch=spalax/paternal/upload-svg browse="https://github.com/paternal/ikiwiki/tree/paternal/upload-svg" author="[[Louis|spalax]]"]]
+
+[[!tag patch]]
+
+--[[Louis|spalax]]
+
+> Unfortunately SVG can contain embedded JavaScript, so anyone who can
+> upload arbitrary SVG to this wiki can execute JavaScript in its security
+> context, leading to stealing login cookies and other badness. GitHub
+> won't display arbitrary user-supplied SVG for the same reasons.
+>
+> I've seen various attempts to sanitize SVG via a whitelist, but it's
+> just too large a specification to be confident that you're right, IMO.
+>
+> This particular SVG [[looks good to me|users/smcv/ready]] and I've
+> mirrored it in my own git repo. --[[smcv]]
+
+>> [[merged|done]] --[[smcv]]
diff --git a/doc/todo/usedirs__95__redir_proposed_additional_module.mdwn b/doc/todo/usedirs__95__redir_proposed_additional_module.mdwn
new file mode 100644 (file)
index 0000000..6e9f27a
--- /dev/null
@@ -0,0 +1,8 @@
+I wrote a new ikiwiki plugin (download source) to generate redirection files so that the URL http://example.com/wiki/foo.html turns into http://example.com/wiki/foo/.
+
+This plugin is particularly useful when converting old sites built with static wiki pages into shiny new ikiwiki ones, while preserving external links.
+
+I'm happy to contribute the module to ikiwiki if there's interest.  Source is [here](
+http://www.isi.edu/~johnh/SOFTWARE/IKIWIKI/usedirs_redir.pm.txt).
+
+[[!tag wishlist todo patch]]
diff --git a/doc/todo/vCard_rendering.mdwn b/doc/todo/vCard_rendering.mdwn
new file mode 100644 (file)
index 0000000..c4b54c0
--- /dev/null
@@ -0,0 +1,100 @@
+Addressbooks are commonly kept on a CardDAV server, where the individual
+contacts are represented as single vCard (`.vcf`) files. Supporting those files
+as a source format could facilitate integration between ikiwiki and address
+books, and allow linking wiki entries to people. With the plugin presented here
+and the [[calypso|http://keithp.com/blogs/calypso/]] server, that is easily
+possible.
+
+The idea was first presented on [[DebConf13|forum/debconf13 ikiwiki bof]] by
+[[chrysn]].
+
+Software involved
+=================
+
+* CardDAV server
+
+  ikiwiki generates its pages from the local file system. Using the 
+  [[calypso|http://keithp.com/blogs/calypso/]] CardDAV/CalDAV server makes that
+  trivial, as it stores its contacts as plain files already (and under git
+  version control!).
+
+  The files can be pulled into ikiwiki in the form of an underlay.
+
+* Rendering VCF files
+
+  A python plugin called `vcf` has been published in chrysn's plugin repository
+  at `git://prometheus.amsuess.com/ikiwiki-plugins`. It supports contact images
+  (as `data:` URLs) as well as all the attributes Evolution generates, creates
+  external hyperlinks for those attributes that can be dereferenced (including
+  telephone numbers), and renders vCard categories into ikiwiki tags.
+
+  Python was chosen as a programming language due to the availability of the
+  [[`vobject`|http://vobject.skyhouseconsulting.com/]] python module and the
+  author's personal preference.
+
+* Linking to contacts
+
+  File names of vCard files are usually not usable
+  (`4FD53349-51280409-28AD50CB.vcf`). To make links like "`I've talked to
+  \[[John Doe]] about this`" possible, the [[todo/alias directive]] has to be
+  implemented in the same repository. (Work in progress.)
+
+Issues / Further development
+============================
+
+* The rendered output is currently a plain definition list, and could need some
+  theming and/or grouping.
+
+  The current implementation does not use templating, and instead generates
+  HTML directly in Python (with the help of the
+  [[MarkupSafe|https://pypi.python.org/pypi/MarkupSafe]] module). Due to the
+  [[limitations of the foreign language API|plugins/write/external]], ikiwiki's
+  regular templating can't be used anyway.
+
+* Addresses are rendered by `python-vcard` builtin address renderer (plus a
+  hack to get unicode out of it), and are not always most beautiful; moreover,
+  this kind of rendering is not themable.
+
+* The `paramlist` words in the vcards are plain dumped out after the respective
+  fields. That's unsuitable for theming, and would need localization.
+
+* In general, the plugin is not internationalized.
+
+* All VCF pages currently receive a 'Contact' tag. That needs configurability
+  and/or localization. In the same vein, prefix configuration for the category
+  taggings would be useful too.
+
+* The alias plugin is not ready yet.
+
+* vCards can not be edited. To be precise: vCards can be edited, but they show
+  vCard sources which are not suitable for user editing. Moreover, the changes
+  would be committed into the wiki main from the underlay, and not travel back.
+
+  Two approaches would make editing feasible, a relatively easy one and a
+  hard-but-wow-if-it-works one:
+
+  * Use a dedicated vCard editing online tool like CardDavMate, which accepts
+    URLs for editing (unlike CardDavMate). Ideally we would even hijack the
+    edit button on vCard pages to take the user to a proper editor.
+
+  * Have a simple edit mask for vCard objects. (It'd be ok if it was incomplete
+    with respect to fields, the vCard format is designed to make that
+    possible). That's related to the
+    [[structured data|forum/an alternative approach to structured data]] issue.
+
+    In such a setup, the vCard list would not go to an underlay, but rather to
+    a git checkout in a subdirectory or a submodule, from which the change
+    could then be pushed back to Calypso. (AFAIK, different git roots are not
+    supported in ikiwiki yet.)
+
+* Would such a renderer be useful for vCalendar too? (vCard and vCalendar only
+  differ in what they can represent, not in how they do it.)
+
+Status
+======
+
+The setup is currently usable, but just barely so. Once the basic issues are
+solved (aliases, parameters for tags, enhanced appearence), I will suggest this
+plugin for inclusion in ikiwiki.
+
+-- [[chrysn]]
index f2f87ac824a97259d345a713ae996f26ba891562..d11d29bb28974b31891ee7df320b73baa60b466a 100644 (file)
@@ -3,7 +3,7 @@ at times it is useful to have a guided tour or trail through a subset of the pag
 
 ### smcv's implementation
 
-... is the out-of-tree [[plugins/contrib/trail]] plugin, see there for details.
+... is the out-of-tree [[plugins/trail]] plugin, see there for details.
 
 > And will be the one landing in ikiwiki. So, I'm closing this bug report. [[done]] --[[Joey]]
 
@@ -11,10 +11,12 @@ at times it is useful to have a guided tour or trail through a subset of the pag
 
 i'm working on a python xmlrpc plugin for ikiwiki to support wikitrails, both as a navigation feature (have "forward" and "back" links based on a sequence) and a modified inline that includes all pages in the trail with appropriate modifications (suitable for printing if necessary).
 
-the current status is published on `git://github.com/github076986099/ikiwiki-plugins.git`; as of now, i don't have a public demo of it.
+the current status is published on `git://prometheus.amsuess.com/ikiwiki-plugins`; as of now, i don't have a public demo of it.
 
 feedback on both the concept and the code is very much appreciated by [[discussion]] or [email](mailto:chrysn@fsfe.org).
 
+> update as of 2013: this implementation is kept in said ikiwiki-plugins directory for historical reference only; with the implementation nowadays available in ikiwiki, my implementation is obsolete. --[[chrysn]]
+
 #### usage
 
 two preprocessor commands are provided:
index 839986c7b69a96c7980941a74cb128a1c959dd3b..602a1b436882475aee75b0f76d04a1a28952bdfc 100644 (file)
@@ -62,3 +62,10 @@ The plugin can be downloaded from <http://ikiwiki.xbaud.com/wikiwyg-1.6.tar.gz>
 > lost my copy of this before merging it. I hope that this plugin will turn
 > back up. In the meantime, there is a wmd plugin that accomplishes the
 > same basic task of WSYWIG markdown editing. --[[Joey]] 
+
+>> Seems the new place is now at Github: <https://github.com/audreyt/wikiwyg-js>
+>> FYI
+>> --[[users/Olea]]
+
+>>> No, that's the wikiwyg source, not the ikiwiki plugin to use it. The
+>>> latter is what's lost. --[[Joey]]
index 304b3962095361a549a68f8c3ef199f69490146e..11c96a8b5d83fd9ceab07bbcab677091623a8694 100644 (file)
@@ -176,3 +176,6 @@ Thanks, [[Greg]]
 >>> it, and at this point, I don't know where to find them anymore! Damn,
 >>> damn, damn. I suspect I did that right when I was learning git, and
 >>> screwed up pushing the branch. :-( --[[Joey]]
+>>>> Seems the new place is now at Github: <https://github.com/audreyt/wikiwyg-js>
+>>>> FYI
+>>>> --[[users/Olea]]
diff --git a/doc/todo/xapian_omega_same_lang_when_indexing_and_searching.mdwn b/doc/todo/xapian_omega_same_lang_when_indexing_and_searching.mdwn
new file mode 100644 (file)
index 0000000..218fef0
--- /dev/null
@@ -0,0 +1,72 @@
+Hi, by default xapian/omega use locate param from blog.setup to set stemmer language when wiki is indexing.
+
+But, when you search, we use omega cgi, and we not set language, so if you indexing in french, but search in english, you have a bad result.
+
+I propose to set a new param omega_stemmer in blog.setup, to fix the same language when we indexing, and searching. And if omega_stemmer is not set, we use LANG env param.
+
+Bellow, you can find the patch.
+
+
+
+        diff --git a/IkiWiki/Plugin/search.pm b/IkiWiki/Plugin/search.pm
+        index 42d2e0d..08a0a01 100644
+        --- a/IkiWiki/Plugin/search.pm
+        +++ b/IkiWiki/Plugin/search.pm
+        @@ -33,6 +33,13 @@ sub getsetup () {
+                                safe => 0, # external program
+                                rebuild => 0,
+                        },
+        +              omega_stemmer => {
+        +                      type => "string",
+        +                      example => "en",
+        +                      description => "language used for indexing and searching",
+        +                      safe => 0, # external program
+        +                      rebuild => 0,
+        +              },
+         }
+         
+         sub checkconfig () {
+        @@ -136,7 +143,7 @@ sub indexhtml (@) {
+                # Index document and add terms for other metadata.
+                my $tg = Search::Xapian::TermGenerator->new();
+                if (! $stemmer) {
+        -              my $langcode=$ENV{LANG} || "en";
+        +              my $langcode=$config{omega_stemmer} || $ENV{LANG} || "en";
+                        $langcode=~s/_.*//;
+         
+                        # This whitelist is here to work around a xapian bug (#486138)
+        @@ -183,6 +190,18 @@ sub cgi ($) {
+                        IkiWiki::loadindex();
+                        $ENV{HELPLINK}=htmllink("", "", "ikiwiki/searching",
+                                noimageinline => 1, linktext => "Help");
+        +              my $langcode=$config{omega_stemmer} || $ENV{LANG} || "en";
+        +              $langcode=~s/_.*//;
+        +
+        +              # This whitelist is here to work around a xapian bug (#486138)
+        +              my @whitelist=qw{da de en es fi fr hu it no pt ru ro sv tr};
+        +
+        +              if (grep { $_ eq $langcode } @whitelist) {
+        +                        $ENV{STEMMER}=$langcode;
+        +              }
+        +              else {
+        +                        $ENV{STEMMER}="en";
+        +              }
+                        exec($config{omega_cgi}) || error("$config{omega_cgi} failed: $!");
+                }
+         }
+        diff --git a/templates/searchquery.tmpl b/templates/searchquery.tmpl
+        index 15bc78e..4742460 100644
+        --- a/templates/searchquery.tmpl
+        +++ b/templates/searchquery.tmpl
+        @@ -1,6 +1,6 @@
+         $setmap{prefix,title,S}
+         $setmap{prefix,link,XLINK}
+        -$set{thousand,$.}$set{decimal,.}$setmap{BN,,Any Country,uk,England,fr,France}
+        +$set{thousand,$.}$set{decimal,.}$setmap{BN,,Any Country,uk,England,fr,France}$set{stemmer,$env{STEMMER}}
+         ${
+         $def{PREV,
+         $if{$ne{$topdoc,0},<INPUT TYPE=image NAME="&lt;" ALT="&lt;"
+
+Regards,
+
+[[!tag patch]]
index 61606e3d0d067f4daf5fbf7db09cbf7cf12ec73d..b274317cd34dc17d93a1b8b834fabb98aa99e642 100644 (file)
@@ -117,3 +117,5 @@ Obviously, this is a lot more work, diverging in a different direction than the
 Also, the thing with the above is that if functionalities 1 and 2 (mapping and page flipping) is stripped out of the po plugin and made reusable, functionalities 3 and 4 can be made optional and a wiki is still translatable, giving the user the responsability of tracking the translations...
 
 So basically, what I think should happen is to have ikiwiki be able to use the .po plugin without .po files - just allow for pages to be linked together. Detect foo.fr.mdwn when parsing foo.mdwn and create links to it would already be a huge start... -- [[anarcat]]
+
+> I have a hopefully clearer spec for a plugin called [[todo/translation_links]]. -- [[anarcat]]
diff --git a/doc/users/GiuseppeBilotta.mdwn b/doc/users/GiuseppeBilotta.mdwn
new file mode 100644 (file)
index 0000000..7b15da9
--- /dev/null
@@ -0,0 +1,6 @@
+Custom patches to IkiWiki can be found in select branches of
+<http://git.oblomov.eu>.
+
+Patches proposed/discussed:
+[[!map pages="link(users/GiuseppeBilotta) and (todo/* or bugs/*) and
+link(branches) and !link(todo/done)"]]
diff --git a/doc/users/JoshBBall.mdwn b/doc/users/JoshBBall.mdwn
new file mode 100644 (file)
index 0000000..ed4b5b2
--- /dev/null
@@ -0,0 +1,3 @@
+My name is Joshua B. Ball. I can be contacted at [JoshBBall@gmail.com](mailto:JoshBBall@gmail.com). I love haskell.
+
+[Github](http://github.com/sciolizer)
diff --git a/doc/users/LucaCapello.mdwn b/doc/users/LucaCapello.mdwn
new file mode 100644 (file)
index 0000000..5ddccbf
--- /dev/null
@@ -0,0 +1,5 @@
+[Debian Developer](http://wiki.debian.org/LucaCapello)
+
+[homepage](http://luca.pca.it)
+
+[write me](mailto:luca@pca.it)
diff --git a/doc/users/Olea.mdwn b/doc/users/Olea.mdwn
new file mode 100644 (file)
index 0000000..1db2a7c
--- /dev/null
@@ -0,0 +1,4 @@
+[[!meta title="Ismael Olea"]]
+
+Ismael Olea is <a href="mailto:ismael@olea.org">ismael@olea.org</a>. 
+His web page is [here](http://olea.org/diario/).
diff --git a/doc/users/OscarMorante.mdwn b/doc/users/OscarMorante.mdwn
new file mode 100644 (file)
index 0000000..7ece36d
--- /dev/null
@@ -0,0 +1,3 @@
+Oscar Morante <oscar@morante.eu>
+
+[homepage](http://oscar.morante.eu)
diff --git a/doc/users/Ramsey.mdwn b/doc/users/Ramsey.mdwn
new file mode 100644 (file)
index 0000000..696f00b
--- /dev/null
@@ -0,0 +1,3 @@
+Hi everyone, I'm Ramsey. I am a web developer/aerospace engineer in order of preference.
+
+I am using ikiwiki to create a [[blog|http://blog.coderfly.com]] and [[wiki|http://wiki.coderfly.com]]
diff --git a/doc/users/RickOwens.mdwn b/doc/users/RickOwens.mdwn
new file mode 100644 (file)
index 0000000..c619569
--- /dev/null
@@ -0,0 +1 @@
+I'm a Systems Analyst in Montana.  I use ikiwiki as a private notebook/journal/worklog/etc.
diff --git a/doc/users/acodispo.mdwn b/doc/users/acodispo.mdwn
new file mode 100644 (file)
index 0000000..cf07b63
--- /dev/null
@@ -0,0 +1,2 @@
+# ACodispo
+
index 5273c6439f8d76894d7f389303902e47c3045341..acb2290ca550fc524aba3cafc54a4cb80bf4ae78 100644 (file)
@@ -2,14 +2,6 @@
 
 New ikiwiki user (well not really "new" anymore), long time wiki user. :-)
 
-<http://adam.shand.net/iki/>
+<http://adam.shand.net/>
 
 [[!map pages="link(AdamShand)"]]
-
-<!-- for map bug
-## Correct? (No extra ULs)
-\[[!map pages="setup*" show="title"]]
-
-## Bug? (Extra UL for each LI)
-\[[!map pages="tagged(done) and tagged(patch)" show="title"]]
--->
index d868d74934f0c5769da9a7e90420cfee75da4bbb..2bd50c76b9ec7888f1463d74316c5332089a09be 100644 (file)
@@ -1 +1,31 @@
 See <https://wiki.koumbit.net/TheAnarcat>
+
+[[!toc]]
+
+My todos
+========
+
+... or the ones I commented it, to be more precise.
+
+[[!inline pages="todo/* and !todo/done and !link(todo/done) and
+link(users/anarcat) and !todo/*/*" sort=mtime feeds=no actions=yes archive=yes show=0]]
+
+Done
+----
+
+[[!inline pages="todo/* and !todo/done and link(todo/done) and
+link(users/anarcat) and !todo/*/*" feeds=no actions=yes archive=yes show=0]]
+
+My bugs
+=======
+
+... same.
+
+[[!inline pages="bugs/* and !bugs/done and !link(bugs/done) and
+link(users/anarcat) and !bugs/*/*" sort=mtime feeds=no actions=yes archive=yes show=0]]
+
+Fixed
+-----
+
+[[!inline pages="bugs/* and !bugs/done and link(bugs/done) and
+link(users/anarcat) and !bugs/*/*" feeds=no actions=yes archive=yes show=0]]
diff --git a/doc/users/cbaines.mdwn b/doc/users/cbaines.mdwn
new file mode 100644 (file)
index 0000000..9781cfe
--- /dev/null
@@ -0,0 +1,4 @@
+About Me
+========
+
+From the UK, interested in Ikiwiki and OpenStreetMap.
index 0daa3b2b971790ba7328b3f70214d79e447892d0..1057c94189976114e946063b4203ec6c0b01550c 100644 (file)
@@ -2,3 +2,11 @@
 * **website**: <http://christian.amsuess.com/>
 * **uses ikiwiki for**: a bunch of internal documentation / organization projects
 * **likes ikiwiki because**: it is a distributed organization tool that pretends to be a web app for the non-programmers out there
+
+chrysn is [[interested|interests]] in these pages:
+
+[[!map pages="backlink(users/chrysn/interests) and !link(todo/done) and !link(bugs/done) and !."]]
+
+chrysn was interested in these pages before they were done:
+
+[[!map pages="backlink(users/chrysn/interests) and (link(todo/done) or link(bugsdone))"]]
diff --git a/doc/users/chrysn/interests.mdwn b/doc/users/chrysn/interests.mdwn
new file mode 100644 (file)
index 0000000..c25e6ed
--- /dev/null
@@ -0,0 +1,35 @@
+these are the topics [[chrysn]] is or was interested in inside ikiwiki:
+
+* [[bugs/linkmap displays underscore escapes]]
+* [[bugs/methodResponse in add__95__plugins]]
+* [[bugs/preprocessing loop control too tight]]
+* [[bugs/proxy.py utf8 troubles]]
+* [[bugs/pythonproxy-utf8 again]]
+* [[bugs/svg and pdf conversion fails]]
+* [[bugs/Underscores in links don't appear]]
+* [[bugs/unicode encoded urls and recentchanges]]
+* [[bugs/wrong link in recentchanges when reverting an ikiwiki outside git root]]
+* [[forum/debconf13 ikiwiki bof]]
+* [[forum/link to an image inside the wiki without inlining it]]
+* [[forum/managing todo lists]]
+* [[ikiwiki/directive/map/discussion]]
+* [[plugins/write/names]]
+* [[todo/ad-hoc plugins]]
+* [[todo/alias directive]]
+* [[todo/auto-create tag pages according to a template]]
+* [[todo/Better bug tracking support]]
+* [[todo/calendar with "create" links]]
+* [[todo/credentials page]]
+* [[todo/flexible relationships between pages]]
+* [[todo/inband acl data]]
+* [[todo/inline postform autotitles]]
+* [[todo/internal definition list support]]
+* [[todo/mirrorlist with per-mirror usedirs settings]]
+* [[todo/more customisable titlepage function]]
+* [[todo/natural sorting]]
+* [[todo/sort parameter for map plugin and directive]]
+* [[todo/tracking bugs with dependencies]]
+* [[todo/unaccent url instead of encoding]]
+* [[todo/Using page titles in internal links]]
+* [[todo/vCard rendering]]
+* [[todo/wikitrails]]
diff --git a/doc/users/fr33domlover.mdwn b/doc/users/fr33domlover.mdwn
new file mode 100644 (file)
index 0000000..562802b
--- /dev/null
@@ -0,0 +1,10 @@
+There isn't much to say, I'm just a person of the common kind,
+trying to make this world a bit better for the next generations.
+
+I run a website, you're welcome to visit.
+
+* Clearnet: <http://www.partager.null> (requires [OpenNIC])
+* I2P: <http://partager.i2p>
+* Tor: <http://75dae7c76okcrloz.onion>
+
+[OpenNIC]: https://www.opennicproject.org/
index 15c065e45f6bbb9239477c3b27273bbc2c81b2d9..3214e15219ae3a7cf41864694b9aa4da55def628 100644 (file)
@@ -3,3 +3,4 @@ consider documenting them?  Perhaps we could turn the result into a
 [[tip|tips]]. -[[JoshTriplett]]
 > Well, certainly. Basically it's just inline + tag feature. I'm going to have more time in May for ikiwiki, I hope. 
 > > Any news about that ?
+> > > I am also interested if you do not mind to share with us. [[cstamas]]
diff --git a/doc/users/holger.mdwn b/doc/users/holger.mdwn
new file mode 100644 (file)
index 0000000..9f0e3c0
--- /dev/null
@@ -0,0 +1,3 @@
+I'm sysadmin at a german university. 
+
+I'm using ikiwiki as personal wiki at work and at home.
index 3dd29708602b42ec4f63c8070ad2a4509d40560a..ed3863717f92410353d90aeb633c8b3f881d351f 100644 (file)
@@ -1,26 +1,39 @@
 &hellip; To put it short: an Ikiwiki newbie.
 
+[Altai State University]: http://www.asu.ru/
 [Emacs]: http://www.gnu.org/software/emacs/
 [Lynx]: http://lynx.isc.org/
+[Software Freedom Day]: http://sf-day.org/
 
 ## Wikis
 
 Currently, I run a few Ikiwiki instances.  Namely:
 
-* <http://lhc.am-1.org/lhc/>
-  &mdash; to hold random stuff written by me, my colleagues,
-  students, etc.
+* <http://sfd.am-1.org/>
+  &mdash; [Software Freedom Day][]
+  event at [Altai State University][].
+
+* <https://spire.am-1.org/>
+  &mdash; introductory materials
+  on XML, Markdown, Ikiwiki, etc.
+  in Russian.
+
+* <http://am-1.org/~ivan/networks-2011/>
+  &mdash; bits &amp; pieces related to the course on computer
+  networks I've read in 2011.
 
-* <http://rsdesne.am-1.org/rsdesne-2010/>
-  &mdash; for some of the materials related to the
+* http://rsdesne.am-1.org/rsdesne-2010/
+  **(down since December, 2012)**
+  &mdash; used to hold 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
+  University) program I've participated in as
   an instructor.
 
-* <http://nets.asu591.ru/networks-2011/>
-  &mdash; for bits &amp; pieces related to the course on computer
-  networks I've read in 2011.
+* http://lhc.am-1.org/lhc/
+  **(down since December, 2012)**
+  &mdash; used to hold random stuff written by me, my colleagues,
+  students, etc.
 
 ## Preferences
 
index 16e9be057afe720cb011a3e69c71cef965255270..bbe0ed7c18c5c17abc0e5487a3887509e59437eb 100644 (file)
@@ -64,3 +64,5 @@ The other thing I saw was:
 Moin version is 1.8.5
 
 Help please!
+
+> Please take a look at [[tips/Convert_moinmoin_to_ikiwiki]] again, the code has radically changed and should now be easier to use *and* work with 1.8.x. --[[anarcat]]
diff --git a/doc/users/kjs.mdwn b/doc/users/kjs.mdwn
new file mode 100644 (file)
index 0000000..d65b663
--- /dev/null
@@ -0,0 +1,11 @@
+## Kalle Söderman
+
+Websites using ikiwiki: 
+
+* <http://img.kalleswork.net>
+* <http://stockholm.kalleswork.net>
+
+
+Mostly using ikiwiki with the [[/plugins/contrib/album/]] and [[plugins/osm]] plugins. My git repo with tweaks including the simplebw theme and changes to the [[plugins/contrib/album]] templates can be cloned via http at:
+
+* <http://src.kalleswork.net/ikiwiki.git>
diff --git a/doc/users/mathdesc.mdwn b/doc/users/mathdesc.mdwn
new file mode 100644 (file)
index 0000000..acb2a07
--- /dev/null
@@ -0,0 +1,190 @@
+mathdesc-at-scourge.biz
+.
+## PROFILING slow render  : Case buggy [[plugins/filecheck]] ?
+
+Saving an article from ikiwiki editor is long ? 
+<tt>ikiwiki  --setup wiki.setup --rebuild</tt> is long ?
+
+Of course it depends the size of the wiki but if it's tiny and still take
+more that two minutes, it's boring. But if it takes a **dozen of minutes**, it's plain buggy.
+
+Actually one can with a verbose rebuild narrow down which page "lags" :
+
+<code>
+    private/admin.mdmn
+    tag/admin
+    tag/private
+</code>
+
+It's also possible to measure render time on one of these pages like this:
+
+<code>
+time ikiwiki  --setup wiki.setup --render private/admin.mdwn
+</code>
+
+Well indeed for such a simple page, something fishy is going on.
+
+Still for simple yet superficial but enough profiling test, it requires 
+a sub-level perl profiler.
+
+## Using SmallProf
+
+[[tips/optimising_ikiwiki/#index10h2]] proposed [[!cpan Devel::NYTProf]].
+
+Try it hard to make it spits realistic numbers or even a trend to point
+the bottleneck in the code. Bref -- nothing valuable nor coherent, it's way to sophisticated to be handy
+in my situation (virtual machine, SMP system, long runs, clock drifts, etc...)  
+
+[[!cpan Devel::SmallProf]] is simple and just works(c)
+
+<pre>
+export PERL5OPT=-d:SmallProf
+time ikiwiki  --setup wiki.setup --rebuild
+sort -k 2nr,2 -k 3nr,3  smallprof.out | head -n 6
+</pre>
+
+
+### Results : 6 top slowpits
+
+Total rebuild time:<br/>
+real   5m16.283s<br/>
+user   2m38.935s<br/>
+sys    2m32.704s<br/>
+
+
+Total rebuild time (under profiling) : <br/>
+real   19m21.633s<br/>
+user   14m47.831s<br/>
+sys    4m11.046s<br/>
+
+
+<pre>
+[num]  [walltime]      [cputime]       [line]: [code]
+3055   114.17165       15.34000        149:    $mimetype=<$file_h>;
+1626527        69.39272        101.4700    93:     read($fh, $line, $$ref[1]); # read max
+3055   50.62106        34.78000        148:    open(my $file_h, "-|", "file", "-bi",
+1626527  14.86525      48.50000         92:    seek($fh, $$ref[0], SEEK_SET); # seek
+1626527  13.95613      44.78000        102:    return undef unless $line =~ $$ref[3]; #
+3055           5.75528         5.81000         76:     for my $type (map @$_, @rules) {
+</pre>
+
+legend : 
+*num* is the number of times that the line was executed, *time* is the amount of "wall time" (time according the the clock on the wall vs. cpu time)
+spent executing it, *ctime* is the amount of cpu time expended on it and *line* and *code* are the line number and the actual text of the executed line 
+(read from the file).
+
+
+3 topmost issues are located in this file :
+
+<tt>/usr/lib/perl5/vendor_perl/5.12.3/IkiWiki/Plugin/filecheck.pm</tt>
+<pre>
+sub match_mimetype ($$;@) {                                         
+        my $page=shift;
+        my $wanted=shift;                       
+        
+        my %params=@_;
+        my $file=exists $params{file} ? $params{file} : IkiWiki::srcfile($IkiWiki::pagesources{$page});
+        if (! defined $file) {
+                return IkiWiki::ErrorReason->new("file does not exist");
+        }        
+        
+        # Get the mime type.
+        #
+        # First, try File::Mimeinfo. This is fast, but doesn't recognise
+        # all files.
+        eval q{use File::MimeInfo::Magic};                    
+        my $mimeinfo_ok=! $@;                                     
+        my $mimetype;
+        if ($mimeinfo_ok) {
+                my $mimetype=File::MimeInfo::Magic::magic($file);
+        }                                                         
+        
+        # Fall back to using file, which has a more complete
+        # magic database.
+        if (! defined $mimetype) {
+                open(my $file_h, "-|", "file", "-bi", $file); 
+                $mimetype=<$file_h>;                                 
+                chomp $mimetype;                            
+                close $file_h;                   
+        }
+        if (! defined $mimetype || $mimetype !~s /;.*//) {
+                # Fall back to default value.
+                $mimetype=File::MimeInfo::Magic::default($file)
+                        if $mimeinfo_ok; 
+                if (! defined $mimetype) {
+                        $mimetype="unknown";
+                }                                                  
+        }        
+        
+        my $regexp=IkiWiki::glob2re($wanted);
+        if ($mimetype!~$regexp) {
+                return IkiWiki::FailReason->new("file MIME type is $mimetype, not $wanted");
+        }
+        else {  
+                return IkiWiki::SuccessReason->new("file MIME type is $mimetype");
+        }
+}
+</pre>
+
+Next 3 in this file :
+
+<tt>/usr/lib/perl5/vendor_perl/5.12.3/File/MimeInfo/Magic.pm</tt>
+<pre>
+sub _check_rule {
+        my ($ref, $fh, $lev) = @_;
+        my $line;
+
+        # Read
+        if (ref $fh eq 'GLOB') {
+                seek($fh, $$ref[0], SEEK_SET);  # seek offset
+                read($fh, $line, $$ref[1]);     # read max length
+        }
+        else { # allowing for IO::Something
+                $fh->seek($$ref[0], SEEK_SET);  # seek offset
+                $fh->read($line, $$ref[1]);     # read max length
+        }
+
+        # Match regex
+        $line = unpack 'b*', $line if $$ref[2]; # unpack to bits if using mask
+        return undef unless $line =~ $$ref[3];  # match regex
+        print STDERR    '>', '>'x$lev, ' Value "', _escape_bytes($2),
+                        '" at offset ', $$ref[1]+length($1),
+                        " matches at $$ref[4]\n"
+                if $DEBUG;
+        return 1 unless $#$ref > 4;
+
+        # Check nested rules and recurs
+        for (5..$#$ref) {
+                return 1 if _check_rule($$ref[$_], $fh, $lev+1);
+        }
+        print STDERR "> Failed nested rules\n" if $DEBUG && ! $lev;
+        return 0;
+}
+</pre>
+
+*"It seems it's a unique cause, that snails it all"*
+
+## Conclusion 
+
+This describes an issue in the attachment filechecker with mime type detection.
+The smallprof out file reveals it always fall back to using file which is very time-consuming.
+
+So what the hell did I put as complex allowed file attachment ruining File::Mimeinfo fast yet sparse recon ? 
+Well, it was set in the config this way:
+
+<tt>allowed_attachments => 'mimetype(image/*) or maxsize(5000kb) or mimetype(text/plain) or mimetype(text/css) or mimetype(video/*)'</tt>
+
+Ok... maybe the wildcards induce ....hum whatever... let's try something , the simplest thing :
+
+<tt>allowed_attachments => 'mimetype(text/plain) or mimetype(text/css)'</tt>
+
+Same slowness : yek, File::Mimeinfo recons nothing ... not even simplest files.
+Disabling it is a temporary cure obviously but it only took **30 seconds** .
+
+<tt>disable_plugins => [qw{filecheck}]</tt>
+
+I tried also to upgrade [[!cpan File::MimeInfo]] to current 0.16, did not helped either. :/
+
+I opened a bug [[bugs/Slow_Filecheck_attachments___34__snails_it_all__34__]]
+
diff --git a/doc/users/mhameed.mdwn b/doc/users/mhameed.mdwn
new file mode 100644 (file)
index 0000000..7b450f4
--- /dev/null
@@ -0,0 +1 @@
+Running ikiwiki on [personal site](http://mesarhameed.info/) also responsible for <http://addons.nvda-project.org> and <http://liblouis.org>.
diff --git a/doc/users/pdurbin.mdwn b/doc/users/pdurbin.mdwn
new file mode 100644 (file)
index 0000000..15ded83
--- /dev/null
@@ -0,0 +1 @@
+<http://greptilian.com>
index fc7558b240a3b9228f6a937babe1afca9ec77a58..92a89272f9b16933a8e7cf8343b9985b6bc95dbe 100644 (file)
@@ -1,10 +1,32 @@
-[Amitai Schlair](http://www.schmonz.com/) finds himself using ikiwiki
-for all sorts of things. His attempts at contributing:
+[Amitai Schlair](http://www.schmonz.com/) has contributed code to ikiwiki...
 
 [[!map
-pages="!*/Discussion and ((link(users/schmonz) and plugins/*) or rcs/cvs)"
+pages="!*/Discussion and ((link(users/schmonz) and plugins/*) or rcs/cvs or todo/fancypodcast)"
 ]]
 
-He's also written a plugin for [WIND
-authentication](http://www.columbia.edu/acis/rad/authmethods/wind/), which
-may or may not be of general utility.
+...and uses ikiwiki for all sorts of things:
+
+## Public
+
+* [A major open-source project's wiki](http://wiki.netbsd.org) (with
+  the [[rcs/cvs]] plugin)
+* [An undergraduate group's university-provided-static-hosted
+  site](http://www.columbia.edu/cu/philo/) (with [[plugins/rsync]] and a [WIND
+  authentication](http://www.columbia.edu/acis/rad/authmethods/wind/) plugin)
+* [A small personal site](http://www.anglofish.net/) (happily hosted at
+  [Branchable](http://www.branchable.com/))
+
+## Non-public
+
+* At work, team documentation and project planning: product and sprint
+  backlogs, burndown charts, release plans/procedures/announcements,
+  aggregating feeds of shared interest, etc.
+* On my laptop, personal to-do and scratch space
+* [A small personal site](http://podcast.schmonz.com/) (happily hosted at
+  [Branchable](http://www.branchable.com/))
+
+## Non-yet-ikiwiki
+
+* [My personal web site](http://www.schmonz.com/) (to be happily
+  hosted at Branchable when it's running a post-[[todo/fancypodcast]]
+  release)
index 59d1affba20f97c4e8e7f7db94588cb9a5533076..9835049c32dd0e8b24a1be696a7eb72629159801 100644 (file)
@@ -7,4 +7,4 @@ My repository containing ikiwiki branches:
 * gitweb: http://git.pseudorandom.co.uk/smcv/ikiwiki.git
 * anongit: git://git.pseudorandom.co.uk/git/smcv/ikiwiki.git
 
-Currently thinking about a [[users/smcv/gallery]] plugin.
+Recently tried to [[help with the review backlog|users/smcv/ready]].
diff --git a/doc/users/smcv/ready.mdwn b/doc/users/smcv/ready.mdwn
new file mode 100644 (file)
index 0000000..ed8aa26
--- /dev/null
@@ -0,0 +1,10 @@
+A tag for patches that I would merge if I had commit access to ikiwiki,
+in the hope that it's a useful shortlist for committers to look at.
+Two categories:
+
+* my own branches, in my git repository under the `ready/*` namespace
+* other people's branches, mirrored in my git repo in the same namespace
+
+[[!inline pages="(todo/* or bugs/*) and link(patch) and !link(bugs/done) and
+   !link(todo/done) and link(users/smcv/ready) and !*/Discussion"
+   archive="yes"]]
diff --git a/doc/users/spalax.mdwn b/doc/users/spalax.mdwn
new file mode 100644 (file)
index 0000000..d5867ca
--- /dev/null
@@ -0,0 +1,21 @@
+[[!meta title="Louis Paternault"]]
+
+User of IkiWiki.
+
+# Plugins
+
+I wrote and maintain a few plugins, which are available here: [[https://atelier.gresille.org/projects/gresille-ikiwiki]].
+
+[[!map pages="plugins/contrib/* and ! plugins/contrib/*/* and author(spalax)"]]
+
+# Wishlist
+
+I have a few things in mind. Their status is something between *I will implement it someday* to *maybe someone could need this* or *I will need it if I implement this killer website I have in mind*.
+
+* [[plugins/contrib/htaccessmanager]]: Create a cgi page to manage a htaccess file.
+* Automatically add calendar pages (WIP: see the [[ikiwiki-calendar discussion|ikiwiki-calendar/discussion]]).
+
+
+# Contact
+
+Contact: `spalax at gresille dot org`.
diff --git a/doc/users/ssm.mdwn b/doc/users/ssm.mdwn
new file mode 100644 (file)
index 0000000..f2ebb8e
--- /dev/null
@@ -0,0 +1,3 @@
+Stig Sandbeck Mathisen has a [web page somewhere](http://fnord.no).
+
+Somewhat fond of perl, ikiwiki and varnish, and wrote the [[plugins/contrib/purge]] plugin to glue them together.
index 712a0d3e7d42d3ef27a264c48110faf477ece6e0..f7a88d125a573a780a016ad17905779a12c16a86 100644 (file)
@@ -1,4 +1,4 @@
 [[!meta title="Svend Sorensen"]]
 
-* [website](http://ciffer.net/~svend/)
-* [blog](http://ciffer.net/~svend/blog/)
+* [website](http://svend.ciffer.net)
+* [blog](http://svend.ciffer.net/blog)
diff --git a/doc/users/tbm.mdwn b/doc/users/tbm.mdwn
new file mode 100644 (file)
index 0000000..cd7491c
--- /dev/null
@@ -0,0 +1,3 @@
+[[!meta title="Martin Michlmayr"]]
+
+Currently trying to convert [my homepage](http://www.cyrius.com/) to ikiwiki.
diff --git a/doc/users/undx.mdwn b/doc/users/undx.mdwn
new file mode 100644 (file)
index 0000000..9b62209
--- /dev/null
@@ -0,0 +1,7 @@
+![undx](http://www.undx.net/images/site/undx_original.png)
+
+IRL, I'm Emmanuel GALLOIS.
+
+This is my temporary ikiwiki user's page.
+
+Ciao. 
diff --git a/doc/users/wiebel.mdwn b/doc/users/wiebel.mdwn
new file mode 100644 (file)
index 0000000..4d6997a
--- /dev/null
@@ -0,0 +1,5 @@
+Started my [Homepage](http://wiebel.scorpius.uberspace.de/) with ikiwiki added some plugins like:
+
+* [hlinclude](https://wiebel.scorpius.uberspace.de/space/hlinclude/) -> addition to highlight to render a files content and provide it as a download, example can be seen at [favlinks](https://wiebel.scorpius.uberspace.de/code/favlink/), sadly it seem to be unable to render itself, meh
+* [favlinks](https://wiebel.scorpius.uberspace.de/code/favlink/) -> to include favicons off linked Pages
+
diff --git a/doc/wishlist/watched_pages.mdwn b/doc/wishlist/watched_pages.mdwn
new file mode 100644 (file)
index 0000000..d943571
--- /dev/null
@@ -0,0 +1 @@
+Is there a way to mark pages I edit as "watched"? A way of doing this through git would be acceptable too. Right now I link to my homepage on every page I comment on, but this doesn't tell me if the pages were updated... --[[anarcat]]
diff --git a/icons/aol.svg b/icons/aol.svg
new file mode 100644 (file)
index 0000000..3986767
--- /dev/null
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="16px"
+   height="16px"
+   id="svg2985"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="aol.svg"
+   inkscape:export-filename="/home/smcv/src/ikiwiki/icons/aol.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <title
+     id="title3812">approximately the AOL logo</title>
+  <defs
+     id="defs2987">
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3781">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3783" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="1"
+         id="stop3785" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3781"
+       id="linearGradient3787" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1"
+     inkscape:cx="19.271071"
+     inkscape:cy="3.271264"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     inkscape:window-width="1366"
+     inkscape:window-height="717"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata2990">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title>approximately the AOL logo</dc:title>
+        <dc:creator>
+          <cc:Agent>
+            <dc:title>Simon McVittie</dc:title>
+          </cc:Agent>
+        </dc:creator>
+        <dc:date>2014</dc:date>
+        <dc:rights>
+          <cc:Agent>
+            <dc:title>ikiwiki basewiki license</dc:title>
+          </cc:Agent>
+        </dc:rights>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer">
+    <text
+       xml:space="preserve"
+       style="font-size:8.92135143px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans Bold"
+       x="-0.16655508"
+       y="11.176648"
+       id="text3841"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3843"
+         x="-0.16655508"
+         y="11.176648">Aol.</tspan></text>
+  </g>
+</svg>
diff --git a/icons/livejournal.svg b/icons/livejournal.svg
new file mode 100644 (file)
index 0000000..381d881
--- /dev/null
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="16px"
+   height="16px"
+   id="svg2985"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="New document 2">
+  <title
+     id="title3825">A pencil resembling the Livejournal logo</title>
+  <defs
+     id="defs2987" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1"
+     inkscape:cx="-26.375015"
+     inkscape:cy="3.6372964"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     showguides="true"
+     inkscape:guide-bbox="true"
+     inkscape:window-width="1366"
+     inkscape:window-height="717"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata2990">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title>A pencil resembling the Livejournal logo</dc:title>
+        <dc:creator>
+          <cc:Agent>
+            <dc:title>Simon McVittie</dc:title>
+          </cc:Agent>
+        </dc:creator>
+        <dc:rights>
+          <cc:Agent>
+            <dc:title>ikiwiki basewiki license</dc:title>
+          </cc:Agent>
+        </dc:rights>
+        <dc:date>2014</dc:date>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer">
+    <rect
+       style="color:#000000;fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#2e3436;stroke-width:0.5;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;stroke-miterlimit:4;stroke-dasharray:none"
+       id="rect3015"
+       width="16.103926"
+       height="3.75"
+       x="-3.1922383"
+       y="-4.2015886"
+       transform="matrix(0.68662998,0.72700707,-0.72700707,0.68662997,0,0)" />
+    <rect
+       style="color:#000000;fill:#3465a4;fill-opacity:1;fill-rule:nonzero;stroke:#2e3436;stroke-width:0.5;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;stroke-miterlimit:4;stroke-dasharray:none"
+       id="rect3017"
+       width="16.103926"
+       height="3.5"
+       x="-3.1922383"
+       y="-0.45158866"
+       transform="matrix(0.68662998,0.72700707,-0.72700707,0.68662997,0,0)" />
+    <path
+       style="color:#000000;fill:#e9b96e;fill-opacity:1;fill-rule:nonzero;stroke:#2e3436;stroke-width:0.50000000000000000;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;stroke-miterlimit:4;stroke-dasharray:none;stroke-linejoin:bevel"
+       d="M 11.90625 6.53125 L 11.8125 6.59375 L 10.125 7.28125 L 8.34375 7.96875 L 7.53125 9.75 L 6.8125 11.28125 L 6.65625 11.4375 L 6.71875 11.46875 L 6.71875 11.5 L 6.75 11.46875 L 10.90625 13.3125 L 15.15625 15.1875 L 13.53125 10.84375 L 11.9375 6.5625 L 11.90625 6.5625 L 11.90625 6.53125 z "
+       id="path3019" />
+    <path
+       transform="matrix(0.11470637,0.12145165,-0.088438,0.08352626,11.92361,11.142815)"
+       inkscape:transform-center-x="-0.65303443"
+       d="m 30.903804,3.625 -7.334103,4.2343464 -7.334103,4.2343466 0,-8.4686932 0,-8.4686923 7.334103,4.23434635 z"
+       inkscape:randomized="0"
+       inkscape:rounded="0"
+       inkscape:flatsided="false"
+       sodipodi:arg2="1.0471976"
+       sodipodi:arg1="0"
+       sodipodi:r2="4.8894019"
+       sodipodi:r1="9.7788038"
+       sodipodi:cy="3.625"
+       sodipodi:cx="21.125"
+       sodipodi:sides="3"
+       id="path3023"
+       style="color:#000000;fill:#2e3436;fill-opacity:1;fill-rule:nonzero;stroke:#2e3436;stroke-width:3.50741758;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;stroke-miterlimit:4;stroke-dasharray:none"
+       sodipodi:type="star" />
+  </g>
+</svg>
diff --git a/icons/verisign.svg b/icons/verisign.svg
new file mode 100644 (file)
index 0000000..cbdb21d
--- /dev/null
@@ -0,0 +1,112 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="16px"
+   height="16px"
+   id="svg2985"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="verisign.svg"
+   inkscape:export-filename="/home/smcv/src/ikiwiki/icons/verisign.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <title
+     id="title3812">approximately the Verisign logo</title>
+  <defs
+     id="defs2987">
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3781">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3783" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="1"
+         id="stop3785" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3781"
+       id="linearGradient3787" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1"
+     inkscape:cx="19.271071"
+     inkscape:cy="3.271264"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     inkscape:window-width="1366"
+     inkscape:window-height="717"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata2990">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title>approximately the Verisign logo</dc:title>
+        <dc:creator>
+          <cc:Agent>
+            <dc:title>Simon McVittie</dc:title>
+          </cc:Agent>
+        </dc:creator>
+        <dc:date>2014</dc:date>
+        <dc:rights>
+          <cc:Agent>
+            <dc:title>ikiwiki basewiki license</dc:title>
+          </cc:Agent>
+        </dc:rights>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer">
+    <path
+       sodipodi:type="arc"
+       style="color:#000000;fill:none;stroke:#edd400;stroke-width:2.56285746999999997;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="path3001"
+       sodipodi:cx="7.906188"
+       sodipodi:cy="8.22896"
+       sodipodi:rx="6.734901"
+       sodipodi:ry="6.734901"
+       d="m 14.641089,8.22896 a 6.734901,6.734901 0 1 1 -13.4698019,0 6.734901,6.734901 0 1 1 13.4698019,0 z"
+       transform="matrix(0.77034953,0,0,0.79053893,0.64096934,1.9303724)" />
+    <text
+       xml:space="preserve"
+       style="font-size:21.52570534px;font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Inconsolata;-inkscape-font-specification:Inconsolata Medium"
+       x="2.9831085"
+       y="12.96045"
+       id="text3789"
+       sodipodi:linespacing="125%"
+       transform="scale(1.0045059,0.99551431)"><tspan
+         sodipodi:role="line"
+         id="tspan3791"
+         x="2.9831085"
+         y="12.96045">✔</tspan></text>
+  </g>
+</svg>
index 1976f7ed1e3c3a65bc517abbb34aaafac103c147..56d6e07319094dcc77d8fea283bcdf4b0b0b734d 100755 (executable)
@@ -1,6 +1,6 @@
 #!/usr/bin/perl -t
 # Add a user to the system wide wikilist.
-# This script can safely be made suid.
+# This script can safely be made suid or put in /etc/sudoers.
 use warnings;
 use strict;
 use English;
index 0c7f435d934a81fb9dfb9056453caa9c25242f57..83c110321b9ea9bafc8e7976eb2645ee973dda44 100644 (file)
@@ -1,5 +1,5 @@
 Name:           ikiwiki
-Version: 3.20120202
+Version: 3.20140831
 Release:        1%{?dist}
 Summary:        A wiki compiler
 
@@ -20,6 +20,7 @@ BuildRequires:  perl(HTML::Template)
 BuildRequires:  perl(CGI::FormBuilder)
 BuildRequires:  perl(CGI::Session)
 BuildRequires:  perl(File::MimeInfo)
+BuildRequires:  perl(YAML::XS)
 BuildRequires:  gettext
 BuildRequires:  po4a
 
old mode 100644 (file)
new mode 100755 (executable)
index c2e9bd6..b61eb46
@@ -3,8 +3,10 @@
 #
 # proxy.py — helper for Python-based external (xml-rpc) ikiwiki plugins
 #
-# Copyright © martin f. krafft <madduck@madduck.net>
-# 
+# Copyright © 2008      martin f. krafft <madduck@madduck.net>
+#             2008-2011 Joey Hess <joey@kitenet.net>
+#             2012      W. Trevor King <wking@tremily.us>
+#
 #  Redistribution and use in source and binary forms, with or without
 # modification, are permitted provided that the following conditions
 # are met:
 # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 # OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 # SUCH DAMAGE.
-# 
+#
 __name__ = 'proxy.py'
 __description__ = 'helper for Python-based external (xml-rpc) ikiwiki plugins'
-__version__ = '0.1'
+__version__ = '0.2'
 __author__ = 'martin f. krafft <madduck@madduck.net>'
 __copyright__ = 'Copyright © ' + __author__
 __licence__ = 'BSD-2-clause'
 
 import sys
 import time
-import xmlrpclib
 import xml.parsers.expat
-from SimpleXMLRPCServer import SimpleXMLRPCDispatcher
+try:  # Python 3
+    import xmlrpc.client as _xmlrpc_client
+except ImportError:  # Python 2
+    import xmlrpclib as _xmlrpc_client
+try:  # Python 3
+    import xmlrpc.server as _xmlrpc_server
+except ImportError:  # Python 2
+    import SimpleXMLRPCServer as _xmlrpc_server
+
+
+class ParseError (Exception):
+    pass
+
+
+class PipeliningDetected (Exception):
+    pass
+
+
+class GoingDown (Exception):
+    pass
+
+
+class InvalidReturnValue (Exception):
+    pass
+
+
+class AlreadyImported (Exception):
+    pass
+
 
-class _IkiWikiExtPluginXMLRPCDispatcher(SimpleXMLRPCDispatcher):
+class _IkiWikiExtPluginXMLRPCDispatcher(_xmlrpc_server.SimpleXMLRPCDispatcher):
 
     def __init__(self, allow_none=False, encoding=None):
         try:
-            SimpleXMLRPCDispatcher.__init__(self, allow_none, encoding)
+            _xmlrpc_server.SimpleXMLRPCDispatcher.__init__(
+                self, allow_none, encoding)
         except TypeError:
             # see http://bugs.debian.org/470645
             # python2.4 and before only took one argument
-            SimpleXMLRPCDispatcher.__init__(self)
+            _xmlrpc_server.SimpleXMLRPCDispatcher.__init__(self)
 
     def dispatch(self, method, params):
         return self._dispatch(method, params)
 
+
 class XMLStreamParser(object):
 
     def __init__(self):
@@ -74,14 +105,15 @@ class XMLStreamParser(object):
     def _pop_tag(self, tag):
         top = self._stack.pop()
         if top != tag:
-            raise ParseError, 'expected %s closing tag, got %s' % (top, tag)
+            raise ParseError(
+                'expected {0} closing tag, got {1}'.format(top, tag))
 
     def _request_complete(self):
         return self._first_tag_received and len(self._stack) == 0
 
     def _check_pipelining(self, *args):
         if self._first_tag_received:
-            raise PipeliningDetected, 'need a new line between XML documents'
+            raise PipeliningDetected('need a new line between XML documents')
 
     def parse(self, data):
         self._parser.Parse(data, False)
@@ -91,11 +123,6 @@ class XMLStreamParser(object):
             self._reset()
             return ret
 
-    class ParseError(Exception):
-        pass
-
-    class PipeliningDetected(Exception):
-        pass
 
 class _IkiWikiExtPluginXMLRPCHandler(object):
 
@@ -129,21 +156,35 @@ class _IkiWikiExtPluginXMLRPCHandler(object):
                 return ret
 
     def send_rpc(self, cmd, in_fd, out_fd, *args, **kwargs):
-        xml = xmlrpclib.dumps(sum(kwargs.iteritems(), args), cmd)
-        self._debug_fn("calling ikiwiki procedure `%s': [%s]" % (cmd, xml))
-        _IkiWikiExtPluginXMLRPCHandler._write(out_fd, xml)
+        xml = _xmlrpc_client.dumps(sum(kwargs.items(), args), cmd)
+        self._debug_fn(
+            "calling ikiwiki procedure `{0}': [{1}]".format(cmd, repr(xml)))
+        # ensure that encoded is a str (bytestring in Python 2, Unicode in 3)
+        if str is bytes and not isinstance(xml, str):
+            encoded = xml.encode('utf8')
+        else:
+            encoded = xml
+        _IkiWikiExtPluginXMLRPCHandler._write(out_fd, encoded)
 
         self._debug_fn('reading response from ikiwiki...')
 
-        xml = _IkiWikiExtPluginXMLRPCHandler._read(in_fd)
-        self._debug_fn('read response to procedure %s from ikiwiki: [%s]' % (cmd, xml))
+        response = _IkiWikiExtPluginXMLRPCHandler._read(in_fd)
+        if str is bytes and not isinstance(response, str):
+            xml = response.encode('utf8')
+        else:
+            xml = response
+        self._debug_fn(
+            'read response to procedure {0} from ikiwiki: [{1}]'.format(
+                cmd, repr(xml)))
         if xml is None:
             # ikiwiki is going down
             self._debug_fn('ikiwiki is going down, and so are we...')
-            raise _IkiWikiExtPluginXMLRPCHandler._GoingDown
+            raise GoingDown()
 
-        data = xmlrpclib.loads(xml)[0][0]
-        self._debug_fn('parsed data from response to procedure %s: [%s]' % (cmd, data))
+        data = _xmlrpc_client.loads(xml)[0][0]
+        self._debug_fn(
+            'parsed data from response to procedure {0}: [{1}]'.format(
+                cmd, repr(data)))
         return data
 
     def handle_rpc(self, in_fd, out_fd):
@@ -152,18 +193,18 @@ class _IkiWikiExtPluginXMLRPCHandler(object):
         if xml is None:
             # ikiwiki is going down
             self._debug_fn('ikiwiki is going down, and so are we...')
-            raise _IkiWikiExtPluginXMLRPCHandler._GoingDown
+            raise GoingDown()
 
-        self._debug_fn('received procedure call from ikiwiki: [%s]' % xml)
-        params, method = xmlrpclib.loads(xml)
+        self._debug_fn(
+            'received procedure call from ikiwiki: [{0}]'.format(xml))
+        params, method = _xmlrpc_client.loads(xml)
         ret = self._dispatcher.dispatch(method, params)
-        xml = xmlrpclib.dumps((ret,), methodresponse=True)
-        self._debug_fn('sending procedure response to ikiwiki: [%s]' % xml)
+        xml = _xmlrpc_client.dumps((ret,), methodresponse=True)
+        self._debug_fn(
+                'sending procedure response to ikiwiki: [{0}]'.format(xml))
         _IkiWikiExtPluginXMLRPCHandler._write(out_fd, xml)
         return ret
 
-    class _GoingDown:
-        pass
 
 class IkiWikiProcedureProxy(object):
 
@@ -196,7 +237,7 @@ class IkiWikiProcedureProxy(object):
                     yield i
 
         args = list(subst_none(args))
-        kwargs = dict(zip(kwargs.keys(), list(subst_none(kwargs.itervalues()))))
+        kwargs = dict(zip(kwargs.keys(), list(subst_none(kwargs.values()))))
         ret = self._xmlrpc_handler.send_rpc(cmd, self._in_fd, self._out_fd,
                                             *args, **kwargs)
         if ret == IkiWikiProcedureProxy._IKIWIKI_NIL_SENTINEL:
@@ -205,7 +246,7 @@ class IkiWikiProcedureProxy(object):
 
     def hook(self, type, function, name=None, id=None, last=False):
         if self._imported:
-            raise IkiWikiProcedureProxy.AlreadyImported
+            raise AlreadyImported()
 
         if name is None:
             name = function.__name__
@@ -217,11 +258,12 @@ class IkiWikiProcedureProxy(object):
 #            curpage = args[0]
 #            kwargs = dict([args[i:i+2] for i in xrange(1, len(args), 2)])
             ret = function(self, *args)
-            self._debug_fn("%s hook `%s' returned: [%s]" % (type, name, ret))
+            self._debug_fn(
+                    "{0} hook `{1}' returned: [{2}]".format(type, name, repr(ret)))
             if ret == IkiWikiProcedureProxy._IKIWIKI_NIL_SENTINEL:
-                raise IkiWikiProcedureProxy.InvalidReturnValue, \
-                        'hook functions are not allowed to return %s' \
-                        % IkiWikiProcedureProxy._IKIWIKI_NIL_SENTINEL
+                raise InvalidReturnValue(
+                    'hook functions are not allowed to return {0}'.format(
+                        IkiWikiProcedureProxy._IKIWIKI_NIL_SENTINEL))
             if ret is None:
                 ret = IkiWikiProcedureProxy._IKIWIKI_NIL_SENTINEL
             return ret
@@ -231,7 +273,7 @@ class IkiWikiProcedureProxy(object):
 
     def inject(self, rname, function, name=None, memoize=True):
         if self._imported:
-            raise IkiWikiProcedureProxy.AlreadyImported
+            raise AlreadyImported()
 
         if name is None:
             name = function.__name__
@@ -263,7 +305,7 @@ class IkiWikiProcedureProxy(object):
     def error(self, msg):
         try:
             self.rpc('error', msg)
-        except IOError, e:
+        except IOError as e:
             if e.errno != 32:
                 raise
         import posix
@@ -272,30 +314,26 @@ class IkiWikiProcedureProxy(object):
     def run(self):
         try:
             while True:
-                ret = self._xmlrpc_handler.handle_rpc(self._in_fd, self._out_fd)
+                ret = self._xmlrpc_handler.handle_rpc(
+                    self._in_fd, self._out_fd)
                 time.sleep(IkiWikiProcedureProxy._LOOP_DELAY)
-        except _IkiWikiExtPluginXMLRPCHandler._GoingDown:
+        except GoingDown:
             return
 
-        except Exception, e:
+        except Exception as e:
             import traceback
-            self.error('uncaught exception: %s\n%s' \
-                       % (e, traceback.format_exc(sys.exc_info()[2])))
+            tb = traceback.format_exc()
+            self.error('uncaught exception: {0}\n{1}'.format(e, tb))
             return
 
     def _importme(self):
         self._debug_fn('importing...')
         for id, type, function, last in self._hooks:
-            self._debug_fn('hooking %s/%s into %s chain...' % (id, function, type))
+            self._debug_fn('hooking {0}/{1} into {2} chain...'.format(
+                    id, function, type))
             self.rpc('hook', id=id, type=type, call=function, last=last)
         for rname, function, memoize in self._functions:
-            self._debug_fn('injecting %s as %s...' % (function, rname))
+            self._debug_fn('injecting {0} as {1}...'.format(function, rname))
             self.rpc('inject', name=rname, call=function, memoize=memoize)
         self._imported = True
         return IkiWikiProcedureProxy._IKIWIKI_NIL_SENTINEL
-
-    class InvalidReturnValue(Exception):
-        pass
-
-    class AlreadyImported(Exception):
-        pass
index 0fe91c58b7e79636b9c5be528a10e07a4fbf20b8..ba0f543f9244a04a10bc8b35b926cc0f30743e19 100755 (executable)
@@ -5,8 +5,12 @@
 #
 # based a little bit on rst.pm by Sergio Talens-Oliag, but only a little bit. :)
 #
-# Copyright © martin f. krafft <madduck@madduck.net>
-# 
+# Copyright © 2007-2008 martin f. krafft <madduck@madduck.net>
+#             2007-2011 Joey Hess <joey@kitenet.net>
+#             2009      Ulrik Sverdrup <ulrik.sverdrup@gmail.com>
+#             2011      Simon McVittie <smcv@debian.org>
+#             2012      W. Trevor King <wking@tremily.us>
+#
 #  Redistribution and use in source and binary forms, with or without
 # modification, are permitted provided that the following conditions
 # are met:
 # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 # OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 # SUCH DAMAGE.
-# 
+#
 __name__ = 'rst'
 __description__ = 'xml-rpc-based ikiwiki plugin to process RST files'
-__version__ = '0.3'
+__version__ = '0.4'
 __author__ = 'martin f. krafft <madduck@madduck.net>'
 __copyright__ = 'Copyright © ' + __author__
 __licence__ = 'BSD-2-clause'
 
+import sys as _sys
+
 from proxy import IkiWikiProcedureProxy
 
+
 publish_parts = None
 
+
 def rst2html(proxy, *args):
     # delayed import so docutils is only needed if you *use* rst -
     # http://bugs.debian.org/637604
@@ -47,9 +55,9 @@ def rst2html(proxy, *args):
     if publish_parts is None:
         try:
             from docutils.core import publish_parts
-        except ImportError, e:
-            proxy.error('cannot import docutils.core: %s: %s' %
-                        (e.__class__.__name__, e))
+        except ImportError as e:
+            proxy.error('cannot import docutils.core: {0}: {1}'.format(
+                    e.__class__.__name__, e))
             raise
 
     kwargs = _to_dict(args)
@@ -68,10 +76,9 @@ def _to_dict(args):
 def getsetup(proxy, *kwargs):
     return 'plugin', { 'safe' : 1, 'rebuild' : 1, 'section' : 'format' }
 
-import sys
 def debug(s):
-    sys.stderr.write(__name__ + ':DEBUG:%s\n' % s)
-    sys.stderr.flush()
+    _sys.stderr.write(__name__ + ':DEBUG:{0}\n'.format(s))
+    _sys.stderr.flush()
 
 proxy = IkiWikiProcedureProxy(__name__, debug_fn=None)
 proxy.hook('getsetup', getsetup)
index dfb018c81eea6377d901a65d11b783f1de0c6883..5ec4a157c6ddbb0fdfcdea3d117730b3cb2ea266 100644 (file)
@@ -41,19 +41,22 @@ clean:
        find underlays -name \*.mdwn -or -name \*.pot | xargs rm -f
 
 %.mo: %.po
-       msgfmt -o $@ $<
+       @if ! msgfmt -o $@ $<; then echo "unable to run msgfmt"; fi
 
 %.po: ikiwiki.pot
        @echo -n "Merging ikiwiki.pot and $@"
-       @msgmerge $@ ikiwiki.pot -o $@.new 2>&1
-# Typically all that changes was a date or line number. I'd prefer not to
+# Typically all that changes is a date or line number. I'd prefer not to
 # commit such changes, so detect and ignore them.
-       @if [ "`diff $@ $@.new | grep '[<>]' | grep -v '[<>] #:' | wc -l`" -ne 2 ]; then \
-               mv -f $@.new $@; \
+       @if ! msgmerge $@ ikiwiki.pot -o $@.new 2>&1; then \
+               echo "unable to run msgmerge"; \
        else \
-               rm -f $@.new; \
+               if [ "`diff $@ $@.new | grep '[<>]' | grep -v '[<>] #:' | wc -l`" -ne 2 ]; then \
+                       mv -f $@.new $@; \
+               else \
+                       rm -f $@.new; \
+               fi; \
+               msgfmt --statistics $@ 2>&1; \
        fi
-       @msgfmt --statistics $@ 2>&1
 
 check:
        @for file in $(POFILES); do \
index 4963f86bed2d581f4bf613cb494c987e1ff1b234..e69b83c996354ca91b49fb9dc0817cc907cac7ac 100644 (file)
--- a/po/bg.po
+++ b/po/bg.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: ikiwiki-bg\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-11-30 16:33-0400\n"
+"POT-Creation-Date: 2013-09-04 10:16-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"
@@ -52,85 +52,85 @@ msgstr "Предпочитанията са запазени."
 msgid "You are banned."
 msgstr "Достъпът ви е забранен."
 
-#: ../IkiWiki/CGI.pm:464 ../IkiWiki/CGI.pm:465 ../IkiWiki.pm:1470
+#: ../IkiWiki/CGI.pm:464 ../IkiWiki/CGI.pm:465 ../IkiWiki.pm:1508
 msgid "Error"
 msgstr "Грешка"
 
-#: ../IkiWiki/Plugin/aggregate.pm:95
+#: ../IkiWiki/Plugin/aggregate.pm:86
 msgid "Aggregation triggered via web."
 msgstr ""
 
-#: ../IkiWiki/Plugin/aggregate.pm:104
+#: ../IkiWiki/Plugin/aggregate.pm:95
 msgid "Nothing to do right now, all feeds are up-to-date!"
 msgstr ""
 
-#: ../IkiWiki/Plugin/aggregate.pm:237
+#: ../IkiWiki/Plugin/aggregate.pm:227
 #, fuzzy, perl-format
 msgid "missing %s parameter"
 msgstr "липсващ параметър „id” на шаблона"
 
-#: ../IkiWiki/Plugin/aggregate.pm:272
+#: ../IkiWiki/Plugin/aggregate.pm:262
 msgid "new feed"
 msgstr "нов източник"
 
-#: ../IkiWiki/Plugin/aggregate.pm:286
+#: ../IkiWiki/Plugin/aggregate.pm:276
 msgid "posts"
 msgstr "съобщения"
 
-#: ../IkiWiki/Plugin/aggregate.pm:288
+#: ../IkiWiki/Plugin/aggregate.pm:278
 msgid "new"
 msgstr "ново"
 
-#: ../IkiWiki/Plugin/aggregate.pm:475
+#: ../IkiWiki/Plugin/aggregate.pm:465
 #, perl-format
 msgid "expiring %s (%s days old)"
 msgstr "премахване на „%s” (на %s дни)"
 
-#: ../IkiWiki/Plugin/aggregate.pm:482
+#: ../IkiWiki/Plugin/aggregate.pm:472
 #, perl-format
 msgid "expiring %s"
 msgstr "премахване на „%s”"
 
-#: ../IkiWiki/Plugin/aggregate.pm:510
+#: ../IkiWiki/Plugin/aggregate.pm:500
 #, perl-format
 msgid "last checked %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/aggregate.pm:514
+#: ../IkiWiki/Plugin/aggregate.pm:504
 #, perl-format
 msgid "checking feed %s ..."
 msgstr "проверка на източника „%s”"
 
-#: ../IkiWiki/Plugin/aggregate.pm:519
+#: ../IkiWiki/Plugin/aggregate.pm:509
 #, perl-format
 msgid "could not find feed at %s"
 msgstr "не е намерен източник на адрес „%s”"
 
-#: ../IkiWiki/Plugin/aggregate.pm:542
+#: ../IkiWiki/Plugin/aggregate.pm:529
 #, fuzzy
 msgid "feed not found"
 msgstr "шаблонът „%s” не е намерен"
 
-#: ../IkiWiki/Plugin/aggregate.pm:553
+#: ../IkiWiki/Plugin/aggregate.pm:540
 #, perl-format
 msgid "(invalid UTF-8 stripped from feed)"
 msgstr ""
 
-#: ../IkiWiki/Plugin/aggregate.pm:561
+#: ../IkiWiki/Plugin/aggregate.pm:548
 #, perl-format
 msgid "(feed entities escaped)"
 msgstr ""
 
-#: ../IkiWiki/Plugin/aggregate.pm:569
+#: ../IkiWiki/Plugin/aggregate.pm:556
 msgid "feed crashed XML::Feed!"
 msgstr "данните от източника предизвикаха грешка в модула XML::Feed!"
 
-#: ../IkiWiki/Plugin/aggregate.pm:661
+#: ../IkiWiki/Plugin/aggregate.pm:649
 #, perl-format
 msgid "creating new page %s"
 msgstr "създаване на нова страницa „%s”"
 
-#: ../IkiWiki/Plugin/aggregate.pm:689 ../IkiWiki/Plugin/edittemplate.pm:135
+#: ../IkiWiki/Plugin/aggregate.pm:677 ../IkiWiki/Plugin/edittemplate.pm:135
 #, fuzzy
 msgid "failed to process template:"
 msgstr "грешка при обработване на шаблона"
@@ -139,7 +139,7 @@ msgstr "грешка при обработване на шаблона"
 msgid "deleting bucket.."
 msgstr ""
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:227
+#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:225
 msgid "done"
 msgstr "готово"
 
@@ -158,7 +158,7 @@ msgstr "Грешка при изпращане на поща"
 msgid "Failed to save file to S3: "
 msgstr "Грешка при изпращане на поща"
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:247
+#: ../IkiWiki/Plugin/amazon_s3.pm:248
 #, fuzzy
 msgid "Failed to delete file from S3: "
 msgstr "грешка при запис на файла „%s”: %s"
@@ -176,15 +176,15 @@ msgstr ""
 msgid "bad attachment filename"
 msgstr ""
 
-#: ../IkiWiki/Plugin/attachment.pm:295
+#: ../IkiWiki/Plugin/attachment.pm:296
 msgid "attachment upload"
 msgstr ""
 
-#: ../IkiWiki/Plugin/attachment.pm:346
+#: ../IkiWiki/Plugin/attachment.pm:347
 msgid "this attachment is not yet saved"
 msgstr ""
 
-#: ../IkiWiki/Plugin/attachment.pm:363
+#: ../IkiWiki/Plugin/attachment.pm:365
 msgid "just uploaded"
 msgstr ""
 
@@ -193,7 +193,7 @@ msgstr ""
 msgid "creating index page %s"
 msgstr "създаване на нова страницa „%s”"
 
-#: ../IkiWiki/Plugin/blogspam.pm:118
+#: ../IkiWiki/Plugin/blogspam.pm:119
 msgid ""
 "Sorry, but that looks like spam to <a href=\"http://blogspam.net/"
 "\">blogspam</a>: "
@@ -208,83 +208,87 @@ msgstr ""
 msgid "There are no broken links!"
 msgstr "Няма „счупени” връзки!"
 
-#: ../IkiWiki/Plugin/comments.pm:114
+#: ../IkiWiki/Plugin/comments.pm:124
 #, fuzzy, perl-format
 msgid "this comment needs %s"
 msgstr "създаване на %s"
 
-#: ../IkiWiki/Plugin/comments.pm:117
+#: ../IkiWiki/Plugin/comments.pm:127
 msgid "moderation"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:138 ../IkiWiki/Plugin/format.pm:50
+#: ../IkiWiki/Plugin/comments.pm:154 ../IkiWiki/Plugin/format.pm:50
 #, perl-format
 msgid "unsupported page format %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:143
+#: ../IkiWiki/Plugin/comments.pm:159
 msgid "comment must have content"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:201
+#: ../IkiWiki/Plugin/comments.pm:217
 msgid "Anonymous"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:263
+#: ../IkiWiki/Plugin/comments.pm:279
 msgid "Comment Moderation"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:379 ../IkiWiki/Plugin/editpage.pm:95
-#: ../IkiWiki/Plugin/editpage.pm:101
+#: ../IkiWiki/Plugin/comments.pm:375 ../IkiWiki/Plugin/comments.pm:379
+msgid "email replies to me"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:413 ../IkiWiki/Plugin/editpage.pm:96
+#: ../IkiWiki/Plugin/editpage.pm:102
 msgid "bad page name"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:382
+#: ../IkiWiki/Plugin/comments.pm:416
 #, fuzzy, perl-format
 msgid "commenting on %s"
 msgstr "създаване на %s"
 
-#: ../IkiWiki/Plugin/comments.pm:399
+#: ../IkiWiki/Plugin/comments.pm:433
 #, perl-format
 msgid "page '%s' doesn't exist, so you can't comment"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:406
+#: ../IkiWiki/Plugin/comments.pm:440
 #, perl-format
 msgid "comments on page '%s' are closed"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:520
+#: ../IkiWiki/Plugin/comments.pm:565
 msgid "comment stored for moderation"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:522
+#: ../IkiWiki/Plugin/comments.pm:567
 msgid "Your comment will be posted after moderator review"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:535
+#: ../IkiWiki/Plugin/comments.pm:580
 msgid "Added a comment"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:539
+#: ../IkiWiki/Plugin/comments.pm:584
 #, perl-format
 msgid "Added a comment: %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:608 ../IkiWiki/Plugin/userlist.pm:55
+#: ../IkiWiki/Plugin/comments.pm:654 ../IkiWiki/Plugin/userlist.pm:55
 #: ../IkiWiki/Plugin/websetup.pm:272
 msgid "you are not logged in as an admin"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:660
+#: ../IkiWiki/Plugin/comments.pm:708
 msgid "Comment moderation"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:701
+#: ../IkiWiki/Plugin/comments.pm:749
 msgid "comment moderation"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:862
+#: ../IkiWiki/Plugin/comments.pm:910
 #, perl-format
 msgid "%i comment"
 msgid_plural "%i comments"
@@ -294,11 +298,11 @@ msgstr[1] ""
 #. translators: Here "Comment" is a verb;
 #. translators: the user clicks on it to
 #. translators: post a comment.
-#: ../IkiWiki/Plugin/comments.pm:872
+#: ../IkiWiki/Plugin/comments.pm:920
 msgid "Comment"
 msgstr ""
 
-#: ../IkiWiki/Plugin/conditional.pm:28 ../IkiWiki/Plugin/cutpaste.pm:46
+#: ../IkiWiki/Plugin/conditional.pm:27 ../IkiWiki/Plugin/cutpaste.pm:46
 #: ../IkiWiki/Plugin/cutpaste.pm:60 ../IkiWiki/Plugin/cutpaste.pm:75
 #: ../IkiWiki/Plugin/testpagespec.pm:26
 #, perl-format
@@ -319,19 +323,23 @@ msgstr ""
 msgid "removing old preview %s"
 msgstr "премахване на старата страница „%s”"
 
-#: ../IkiWiki/Plugin/editpage.pm:117
+#: ../IkiWiki/Plugin/editpage.pm:118
 #, perl-format
 msgid "%s is not an editable page"
 msgstr ""
 
-#: ../IkiWiki/Plugin/editpage.pm:307
+#: ../IkiWiki/Plugin/editpage.pm:166
+msgid "email comments to me"
+msgstr ""
+
+#: ../IkiWiki/Plugin/editpage.pm:319
 #, perl-format
 msgid "creating %s"
 msgstr "създаване на %s"
 
-#: ../IkiWiki/Plugin/editpage.pm:325 ../IkiWiki/Plugin/editpage.pm:344
-#: ../IkiWiki/Plugin/editpage.pm:355 ../IkiWiki/Plugin/editpage.pm:400
-#: ../IkiWiki/Plugin/editpage.pm:442
+#: ../IkiWiki/Plugin/editpage.pm:337 ../IkiWiki/Plugin/editpage.pm:356
+#: ../IkiWiki/Plugin/editpage.pm:367 ../IkiWiki/Plugin/editpage.pm:412
+#: ../IkiWiki/Plugin/editpage.pm:454
 #, perl-format
 msgid "editing %s"
 msgstr "промяна на %s"
@@ -379,26 +387,26 @@ msgstr "грешка при четене на „%s”: %s"
 msgid "%s is an attachment, not a page."
 msgstr ""
 
-#: ../IkiWiki/Plugin/git.pm:777 ../IkiWiki/Plugin/git.pm:840
-#: ../IkiWiki.pm:1690
+#: ../IkiWiki/Plugin/git.pm:789 ../IkiWiki/Plugin/git.pm:852
+#: ../IkiWiki.pm:1728
 #, perl-format
 msgid "you are not allowed to change %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/git.pm:799
+#: ../IkiWiki/Plugin/git.pm:811
 #, perl-format
 msgid "you cannot act on a file with mode %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/git.pm:803
+#: ../IkiWiki/Plugin/git.pm:815
 msgid "you are not allowed to change file modes"
 msgstr ""
 
-#: ../IkiWiki/Plugin/git.pm:873
+#: ../IkiWiki/Plugin/git.pm:885
 msgid "you are not allowed to revert a merge"
 msgstr ""
 
-#: ../IkiWiki/Plugin/git.pm:892
+#: ../IkiWiki/Plugin/git.pm:902
 #, fuzzy, perl-format
 msgid "Failed to revert commit %s"
 msgstr "крешка при компилиране на файла %s"
@@ -413,7 +421,7 @@ msgstr "При използване на приеставката „search” 
 msgid "failed to run graphviz"
 msgstr "приставката „linkmap”: грешка при изпълнение на „dot”"
 
-#: ../IkiWiki/Plugin/graphviz.pm:143
+#: ../IkiWiki/Plugin/graphviz.pm:144
 msgid "prog not a valid graphviz program"
 msgstr ""
 
@@ -427,7 +435,7 @@ msgstr ""
 msgid "Source code: %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/highlight.pm:179
+#: ../IkiWiki/Plugin/highlight.pm:180
 msgid ""
 "warning: highlight perl module not available; falling back to pass through"
 msgstr ""
@@ -478,31 +486,31 @@ msgstr "шаблонът „%s” не е намерен"
 msgid "missing pages parameter"
 msgstr "липсващ параметър „id” на шаблона"
 
-#: ../IkiWiki/Plugin/inline.pm:192
+#: ../IkiWiki/Plugin/inline.pm:209
 #, perl-format
 msgid "the %s and %s parameters cannot be used together"
 msgstr ""
 
-#: ../IkiWiki/Plugin/inline.pm:297
+#: ../IkiWiki/Plugin/inline.pm:315
 #, perl-format
 msgid "%s (RSS feed)"
 msgstr ""
 
-#: ../IkiWiki/Plugin/inline.pm:301
+#: ../IkiWiki/Plugin/inline.pm:319
 #, perl-format
 msgid "%s (Atom feed)"
 msgstr ""
 
-#: ../IkiWiki/Plugin/inline.pm:330
+#: ../IkiWiki/Plugin/inline.pm:348
 msgid "Add a new post titled:"
 msgstr ""
 
-#: ../IkiWiki/Plugin/inline.pm:369 ../IkiWiki/Plugin/template.pm:44
+#: ../IkiWiki/Plugin/inline.pm:387 ../IkiWiki/Plugin/template.pm:44
 #, fuzzy, perl-format
 msgid "failed to process template %s"
 msgstr "грешка при обработване на шаблона"
 
-#: ../IkiWiki/Plugin/inline.pm:695
+#: ../IkiWiki/Plugin/inline.pm:725
 msgid "RPC::XML::Client not found, not pinging"
 msgstr "модулът „RPC::XML::Client” не е намерен; източникът не е проверен"
 
@@ -522,46 +530,51 @@ msgid "%s is locked and cannot be edited"
 msgstr ""
 "Страницата „%s” е заключена от потребителя „%s” и не може да бъде променяна"
 
-#: ../IkiWiki/Plugin/mdwn.pm:45
+#: ../IkiWiki/Plugin/mdwn.pm:52
 msgid "multimarkdown is enabled, but Text::MultiMarkdown is not installed"
 msgstr ""
 
-#: ../IkiWiki/Plugin/mdwn.pm:70
+#: ../IkiWiki/Plugin/mdwn.pm:96
 #, 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:175
+#: ../IkiWiki/Plugin/meta.pm:127
 #, fuzzy
-msgid "stylesheet not found"
+msgid "enclosure not found"
 msgstr "шаблонът „%s” не е намерен"
 
 #: ../IkiWiki/Plugin/meta.pm:187
 #, fuzzy
+msgid "stylesheet not found"
+msgstr "шаблонът „%s” не е намерен"
+
+#: ../IkiWiki/Plugin/meta.pm:199
+#, fuzzy
 msgid "script not found"
 msgstr "шаблонът „%s” не е намерен"
 
-#: ../IkiWiki/Plugin/meta.pm:235
+#: ../IkiWiki/Plugin/meta.pm:247
 #, fuzzy
 msgid "redir page not found"
 msgstr "шаблонът „%s” не е намерен"
 
-#: ../IkiWiki/Plugin/meta.pm:249
+#: ../IkiWiki/Plugin/meta.pm:261
 #, fuzzy
 msgid "redir cycle is not allowed"
 msgstr "шаблонът „%s” не е намерен"
 
-#: ../IkiWiki/Plugin/meta.pm:427
+#: ../IkiWiki/Plugin/meta.pm:450
 msgid "sort=meta requires a parameter"
 msgstr ""
 
-#: ../IkiWiki/Plugin/mirrorlist.pm:44
+#: ../IkiWiki/Plugin/mirrorlist.pm:57
 msgid "Mirrors"
 msgstr "Огледала"
 
-#: ../IkiWiki/Plugin/mirrorlist.pm:44
+#: ../IkiWiki/Plugin/mirrorlist.pm:57
 msgid "Mirror"
 msgstr "Огледало"
 
@@ -573,6 +586,18 @@ msgstr ""
 msgid "more"
 msgstr ""
 
+#: ../IkiWiki/Plugin/notifyemail.pm:72
+msgid "Cannot subscribe your email address without logging in."
+msgstr ""
+
+#: ../IkiWiki/Plugin/notifyemail.pm:136
+msgid "change notification:"
+msgstr ""
+
+#: ../IkiWiki/Plugin/notifyemail.pm:138
+msgid "comment notification:"
+msgstr ""
+
 #: ../IkiWiki/Plugin/openid.pm:71
 #, fuzzy, perl-format
 msgid "failed to load openid module: "
@@ -587,42 +612,50 @@ msgstr "Всички страници имат връзки от други ст
 msgid "bad or missing template"
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:231
+#: ../IkiWiki/Plugin/passwordauth.pm:145 ../IkiWiki/Plugin/passwordauth.pm:337
+msgid "Error creating account."
+msgstr "Грешка при създаване на акаунта."
+
+#: ../IkiWiki/Plugin/passwordauth.pm:297
 msgid "Your user page: "
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:238
+#: ../IkiWiki/Plugin/passwordauth.pm:304
 msgid "Create your user page"
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:268
+#: ../IkiWiki/Plugin/passwordauth.pm:334
 msgid "Account creation successful. Now you can Login."
 msgstr "Акаунтът е създаден. Можете да влезете."
 
-#: ../IkiWiki/Plugin/passwordauth.pm:271
-msgid "Error creating account."
-msgstr "Грешка при създаване на акаунта."
-
-#: ../IkiWiki/Plugin/passwordauth.pm:278
+#: ../IkiWiki/Plugin/passwordauth.pm:344
 msgid "No email address, so cannot email password reset instructions."
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:312
+#: ../IkiWiki/Plugin/passwordauth.pm:371
 msgid "Failed to send mail"
 msgstr "Грешка при изпращане на поща"
 
-#: ../IkiWiki/Plugin/passwordauth.pm:314
+#: ../IkiWiki/Plugin/passwordauth.pm:373
 msgid "You have been mailed password reset instructions."
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:349
+#: ../IkiWiki/Plugin/passwordauth.pm:408
 msgid "incorrect password reset url"
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:352
+#: ../IkiWiki/Plugin/passwordauth.pm:411
 msgid "password reset denied"
 msgstr ""
 
+#: ../IkiWiki/Plugin/passwordauth.pm:424
+msgid "incorrect url"
+msgstr ""
+
+#: ../IkiWiki/Plugin/passwordauth.pm:427
+msgid "access denied"
+msgstr ""
+
 #: ../IkiWiki/Plugin/pingee.pm:30
 msgid "Ping received."
 msgstr ""
@@ -650,97 +683,101 @@ msgstr "модулът „RPC::XML::Client” не е намерен; източ
 msgid "warning: Old po4a detected! Recommend upgrade to 0.35."
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:180
+#: ../IkiWiki/Plugin/po.pm:179
 #, perl-format
 msgid "%s is not a valid language code"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:192
+#: ../IkiWiki/Plugin/po.pm:191
 #, 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:197
+#: ../IkiWiki/Plugin/po.pm:196
 msgid ""
 "po_link_to=negotiated requires usedirs to be enabled, falling back to "
 "po_link_to=default"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:468
+#: ../IkiWiki/Plugin/po.pm:467
 msgid "updated PO files"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:491
+#: ../IkiWiki/Plugin/po.pm:490
 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:511
+#: ../IkiWiki/Plugin/po.pm:510
 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:957
+#: ../IkiWiki/Plugin/po.pm:956
 #, perl-format
 msgid "POT file (%s) does not exist"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:971
+#: ../IkiWiki/Plugin/po.pm:970
 #, fuzzy, perl-format
 msgid "failed to copy underlay PO file to %s"
 msgstr "крешка при компилиране на файла %s"
 
-#: ../IkiWiki/Plugin/po.pm:980
+#: ../IkiWiki/Plugin/po.pm:979
 #, fuzzy, perl-format
 msgid "failed to update %s"
 msgstr "крешка при компилиране на файла %s"
 
-#: ../IkiWiki/Plugin/po.pm:986
+#: ../IkiWiki/Plugin/po.pm:985
 #, fuzzy, perl-format
 msgid "failed to copy the POT file to %s"
 msgstr "крешка при компилиране на файла %s"
 
-#: ../IkiWiki/Plugin/po.pm:1022
+#: ../IkiWiki/Plugin/po.pm:1021
 msgid "N/A"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:1033
+#: ../IkiWiki/Plugin/po.pm:1032
 #, fuzzy, perl-format
 msgid "failed to translate %s"
 msgstr "грешка при запис на файла „%s”: %s"
 
-#: ../IkiWiki/Plugin/po.pm:1112
+#: ../IkiWiki/Plugin/po.pm:1111
 msgid "removed obsolete PO files"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:1169 ../IkiWiki/Plugin/po.pm:1181
-#: ../IkiWiki/Plugin/po.pm:1220
+#: ../IkiWiki/Plugin/po.pm:1168 ../IkiWiki/Plugin/po.pm:1180
+#: ../IkiWiki/Plugin/po.pm:1219
 #, fuzzy, perl-format
 msgid "failed to write %s"
 msgstr "грешка при запис на файла „%s”: %s"
 
-#: ../IkiWiki/Plugin/po.pm:1179
+#: ../IkiWiki/Plugin/po.pm:1178
 #, fuzzy
 msgid "failed to translate"
 msgstr "приставката „linkmap”: грешка при изпълнение на „dot”"
 
-#: ../IkiWiki/Plugin/po.pm:1232
+#: ../IkiWiki/Plugin/po.pm:1231
 msgid "invalid gettext data, go back to previous page to continue edit"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:1275
+#: ../IkiWiki/Plugin/po.pm:1274
 #, perl-format
 msgid "%s has invalid syntax: must use CODE|NAME"
 msgstr ""
 
-#: ../IkiWiki/Plugin/poll.pm:70
+#: ../IkiWiki/Plugin/poll.pm:72 ../IkiWiki/Plugin/poll.pm:87
 msgid "vote"
 msgstr "гласуване"
 
-#: ../IkiWiki/Plugin/poll.pm:78
+#: ../IkiWiki/Plugin/poll.pm:86
+msgid "Write in"
+msgstr ""
+
+#: ../IkiWiki/Plugin/poll.pm:93
 msgid "Total votes:"
 msgstr "Общо гласове:"
 
@@ -844,36 +881,36 @@ msgstr ""
 msgid "confirm reversion of %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/recentchangesdiff.pm:36
+#: ../IkiWiki/Plugin/recentchangesdiff.pm:49
 msgid "(Diff truncated)"
 msgstr ""
 
-#: ../IkiWiki/Plugin/remove.pm:32 ../IkiWiki/Plugin/rename.pm:37
+#: ../IkiWiki/Plugin/remove.pm:39 ../IkiWiki/Plugin/rename.pm:37
 #, perl-format
 msgid "%s does not exist"
 msgstr ""
 
-#: ../IkiWiki/Plugin/remove.pm:39
+#: ../IkiWiki/Plugin/remove.pm:56
 #, fuzzy, perl-format
 msgid "%s is not in the srcdir, so it cannot be deleted"
 msgstr ""
 "Страницата „%s” е заключена от потребителя „%s” и не може да бъде променяна"
 
-#: ../IkiWiki/Plugin/remove.pm:42 ../IkiWiki/Plugin/rename.pm:46
+#: ../IkiWiki/Plugin/remove.pm:59 ../IkiWiki/Plugin/rename.pm:46
 #, perl-format
 msgid "%s is not a file"
 msgstr ""
 
-#: ../IkiWiki/Plugin/remove.pm:149
+#: ../IkiWiki/Plugin/remove.pm:166
 #, perl-format
 msgid "confirm removal of %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/remove.pm:186
+#: ../IkiWiki/Plugin/remove.pm:203
 msgid "Please select the attachments to remove."
 msgstr ""
 
-#: ../IkiWiki/Plugin/remove.pm:230
+#: ../IkiWiki/Plugin/remove.pm:263
 msgid "removed"
 msgstr ""
 
@@ -911,20 +948,20 @@ msgstr "обновяване на страницата „%s”"
 msgid "Also rename SubPages and attachments"
 msgstr ""
 
-#: ../IkiWiki/Plugin/rename.pm:258
+#: ../IkiWiki/Plugin/rename.pm:266
 msgid "Only one attachment can be renamed at a time."
 msgstr ""
 
-#: ../IkiWiki/Plugin/rename.pm:261
+#: ../IkiWiki/Plugin/rename.pm:269
 msgid "Please select the attachment to rename."
 msgstr ""
 
-#: ../IkiWiki/Plugin/rename.pm:371
+#: ../IkiWiki/Plugin/rename.pm:379
 #, perl-format
 msgid "rename %s to %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/rename.pm:597
+#: ../IkiWiki/Plugin/rename.pm:605
 #, fuzzy, perl-format
 msgid "update for rename of %s to %s"
 msgstr "обновяване на страниците от уики „%s”: %s от потребител „%s”"
@@ -1053,6 +1090,11 @@ msgstr ""
 msgid "failed to generate image from code"
 msgstr "грешка при запис на файла „%s”: %s"
 
+#: ../IkiWiki/Plugin/trail.pm:393
+#, perl-format
+msgid "building %s, its previous or next page has changed"
+msgstr ""
+
 #: ../IkiWiki/Plugin/transient.pm:45
 #, fuzzy, perl-format
 msgid "removing transient version of %s"
@@ -1119,59 +1161,59 @@ msgstr ""
 msgid "scanning %s"
 msgstr "сканиране на „%s”"
 
-#: ../IkiWiki/Render.pm:280
+#: ../IkiWiki/Render.pm:281
 #, perl-format
 msgid ""
 "symlink found in srcdir path (%s) -- set allow_symlinks_before_srcdir to "
 "allow this"
 msgstr ""
 
-#: ../IkiWiki/Render.pm:316
+#: ../IkiWiki/Render.pm:317
 #, perl-format
 msgid "skipping bad filename %s"
 msgstr "пропускане на невалидното име на файл „%s”"
 
-#: ../IkiWiki/Render.pm:332
+#: ../IkiWiki/Render.pm:333
 #, perl-format
 msgid "%s has multiple possible source pages"
 msgstr ""
 
-#: ../IkiWiki/Render.pm:372
+#: ../IkiWiki/Render.pm:373
 #, perl-format
 msgid "querying %s for file creation and modification times.."
 msgstr ""
 
-#: ../IkiWiki/Render.pm:446
+#: ../IkiWiki/Render.pm:447
 #, fuzzy, perl-format
 msgid "removing obsolete %s"
 msgstr "премахване на старата страница „%s”"
 
-#: ../IkiWiki/Render.pm:530
+#: ../IkiWiki/Render.pm:531
 #, fuzzy, perl-format
 msgid "building %s, which links to %s"
 msgstr "обновяване на страницата „%s”, съдържаща препратки към „%s”"
 
-#: ../IkiWiki/Render.pm:539
+#: ../IkiWiki/Render.pm:540
 #, fuzzy, perl-format
 msgid "removing %s, no longer built by %s"
 msgstr "премахване на „%s” понеже не се генерира от „%s”"
 
-#: ../IkiWiki/Render.pm:622 ../IkiWiki/Render.pm:704
+#: ../IkiWiki/Render.pm:623 ../IkiWiki/Render.pm:705
 #, fuzzy, perl-format
 msgid "building %s, which depends on %s"
 msgstr "обновяване на страницата „%s”, зависеща от „%s”"
 
-#: ../IkiWiki/Render.pm:717
+#: ../IkiWiki/Render.pm:718
 #, fuzzy, perl-format
 msgid "building %s, to update its backlinks"
 msgstr "обновяване на „%s” и осъвременяване на обратните връзки"
 
-#: ../IkiWiki/Render.pm:797
+#: ../IkiWiki/Render.pm:806
 #, fuzzy, perl-format
 msgid "building %s"
 msgstr "промяна на %s"
 
-#: ../IkiWiki/Render.pm:849
+#: ../IkiWiki/Render.pm:871
 #, fuzzy, perl-format
 msgid "ikiwiki: cannot build %s"
 msgstr "ikiwiki: неуспех при обновяване на страницата „%s”"
@@ -1215,27 +1257,31 @@ msgstr ""
 msgid "generating wrappers.."
 msgstr "генериране на обвивки..."
 
-#: ../IkiWiki/Wrapper.pm:36
+#: ../IkiWiki/Wrapper.pm:37
 #, perl-format
 msgid "%s doesn't seem to be executable"
 msgstr "„%s” не е изпълним файл"
 
-#: ../IkiWiki/Wrapper.pm:40
+#: ../IkiWiki/Wrapper.pm:41
 msgid "cannot create a wrapper that uses a setup file"
 msgstr "не може да бъде създадена обвивка, която използва файл за настройки"
 
-#: ../IkiWiki/Wrapper.pm:44
+#: ../IkiWiki/Wrapper.pm:45
 msgid "wrapper filename not specified"
 msgstr "не е указан файл на обвивката"
 
+#: ../IkiWiki/Wrapper.pm:109
+msgid "Please wait"
+msgstr ""
+
 #. translators: The parameter is a C filename.
-#: ../IkiWiki/Wrapper.pm:220
+#: ../IkiWiki/Wrapper.pm:268
 #, perl-format
 msgid "failed to compile %s"
 msgstr "крешка при компилиране на файла %s"
 
 #. translators: The parameter is a filename.
-#: ../IkiWiki/Wrapper.pm:240
+#: ../IkiWiki/Wrapper.pm:288
 #, perl-format
 msgid "successfully generated %s"
 msgstr "успешно генериране на %s"
@@ -1256,68 +1302,68 @@ msgstr ""
 msgid "usage: --set-yaml var=value"
 msgstr ""
 
-#: ../ikiwiki.in:216
+#: ../ikiwiki.in:214
 msgid "rebuilding wiki.."
 msgstr "обновяване на уики..."
 
-#: ../ikiwiki.in:219
+#: ../ikiwiki.in:217
 msgid "refreshing wiki.."
 msgstr "осъвременяване на уики..."
 
-#: ../IkiWiki.pm:232
+#: ../IkiWiki.pm:248
 msgid "Discussion"
 msgstr "Дискусия"
 
-#: ../IkiWiki.pm:557
+#: ../IkiWiki.pm:580
 msgid "Must specify url to wiki with --url when using --cgi"
 msgstr ""
 "При използване на пареметъра „--cgi” е необходимо да се укаже и "
 "местоположението на уикито чрез параметъра „--url”"
 
-#: ../IkiWiki.pm:605
+#: ../IkiWiki.pm:628
 #, perl-format
 msgid "unsupported umask setting %s"
 msgstr ""
 
-#: ../IkiWiki.pm:645
+#: ../IkiWiki.pm:668
 msgid "cannot use multiple rcs plugins"
 msgstr ""
 
-#: ../IkiWiki.pm:675
+#: ../IkiWiki.pm:698
 #, perl-format
 msgid "failed to load external plugin needed for %s plugin: %s"
 msgstr ""
 
-#: ../IkiWiki.pm:1452
+#: ../IkiWiki.pm:1490
 #, fuzzy, perl-format
 msgid "preprocessing loop detected on %s at depth %i"
 msgstr "открита е циклична завидимост при %s на „%s” на дълбочина %i"
 
-#: ../IkiWiki.pm:1646
+#: ../IkiWiki.pm:1684
 #, fuzzy, perl-format
 msgid "bad file name %s"
 msgstr "пропускане на невалидното име на файл „%s”"
 
-#: ../IkiWiki.pm:1946
+#: ../IkiWiki.pm:1984
 #, perl-format
 msgid "template %s not found"
 msgstr "шаблонът „%s” не е намерен"
 
-#: ../IkiWiki.pm:2196
+#: ../IkiWiki.pm:2234
 msgid "yes"
 msgstr ""
 
-#: ../IkiWiki.pm:2273
+#: ../IkiWiki.pm:2318
 #, fuzzy, perl-format
 msgid "invalid sort type %s"
 msgstr "непознат вид сортиране „%s”"
 
-#: ../IkiWiki.pm:2294
+#: ../IkiWiki.pm:2339
 #, perl-format
 msgid "unknown sort type %s"
 msgstr "непознат вид сортиране „%s”"
 
-#: ../IkiWiki.pm:2430
+#: ../IkiWiki.pm:2475
 #, fuzzy, perl-format
 msgid "cannot match pages: %s"
 msgstr "грешка при четене на „%s”: %s"
index 5cb42b937ef68566c69cbce6e8ac684c64c13f32..4f484faf399c04146bbb9d95a6da7a86e7042e3f 100644 (file)
--- a/po/cs.po
+++ b/po/cs.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: ikiwiki\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-11-30 16:33-0400\n"
+"POT-Creation-Date: 2013-09-04 10:16-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"
@@ -52,84 +52,84 @@ msgstr "Nastavení uloženo."
 msgid "You are banned."
 msgstr "Jste vyhoštěni."
 
-#: ../IkiWiki/CGI.pm:464 ../IkiWiki/CGI.pm:465 ../IkiWiki.pm:1470
+#: ../IkiWiki/CGI.pm:464 ../IkiWiki/CGI.pm:465 ../IkiWiki.pm:1508
 msgid "Error"
 msgstr "Chyba"
 
-#: ../IkiWiki/Plugin/aggregate.pm:95
+#: ../IkiWiki/Plugin/aggregate.pm:86
 msgid "Aggregation triggered via web."
 msgstr "Agregace spuštěna přes web."
 
-#: ../IkiWiki/Plugin/aggregate.pm:104
+#: ../IkiWiki/Plugin/aggregate.pm:95
 msgid "Nothing to do right now, all feeds are up-to-date!"
 msgstr "Není třeba nic dělat, všechny kanály jsou aktuální!"
 
-#: ../IkiWiki/Plugin/aggregate.pm:237
+#: ../IkiWiki/Plugin/aggregate.pm:227
 #, perl-format
 msgid "missing %s parameter"
 msgstr "chybí parametr %s"
 
-#: ../IkiWiki/Plugin/aggregate.pm:272
+#: ../IkiWiki/Plugin/aggregate.pm:262
 msgid "new feed"
 msgstr "nový kanál"
 
-#: ../IkiWiki/Plugin/aggregate.pm:286
+#: ../IkiWiki/Plugin/aggregate.pm:276
 msgid "posts"
 msgstr "příspěvky"
 
-#: ../IkiWiki/Plugin/aggregate.pm:288
+#: ../IkiWiki/Plugin/aggregate.pm:278
 msgid "new"
 msgstr "nový"
 
-#: ../IkiWiki/Plugin/aggregate.pm:475
+#: ../IkiWiki/Plugin/aggregate.pm:465
 #, perl-format
 msgid "expiring %s (%s days old)"
 msgstr "expiruji %s (stará %s dnů)"
 
-#: ../IkiWiki/Plugin/aggregate.pm:482
+#: ../IkiWiki/Plugin/aggregate.pm:472
 #, perl-format
 msgid "expiring %s"
 msgstr "expiruji %s"
 
-#: ../IkiWiki/Plugin/aggregate.pm:510
+#: ../IkiWiki/Plugin/aggregate.pm:500
 #, perl-format
 msgid "last checked %s"
 msgstr "poslední kontrola %s"
 
-#: ../IkiWiki/Plugin/aggregate.pm:514
+#: ../IkiWiki/Plugin/aggregate.pm:504
 #, perl-format
 msgid "checking feed %s ..."
 msgstr "kontroluji kanál %s ..."
 
-#: ../IkiWiki/Plugin/aggregate.pm:519
+#: ../IkiWiki/Plugin/aggregate.pm:509
 #, perl-format
 msgid "could not find feed at %s"
 msgstr "nemohu najít kanál na %s"
 
-#: ../IkiWiki/Plugin/aggregate.pm:542
+#: ../IkiWiki/Plugin/aggregate.pm:529
 msgid "feed not found"
 msgstr "kanál nebyl nalezen"
 
-#: ../IkiWiki/Plugin/aggregate.pm:553
+#: ../IkiWiki/Plugin/aggregate.pm:540
 #, perl-format
 msgid "(invalid UTF-8 stripped from feed)"
 msgstr "(neplatné UTF-8 bylo z kanálu odstraněno)"
 
-#: ../IkiWiki/Plugin/aggregate.pm:561
+#: ../IkiWiki/Plugin/aggregate.pm:548
 #, perl-format
 msgid "(feed entities escaped)"
 msgstr "(entity byly v kanálu zakódovány)"
 
-#: ../IkiWiki/Plugin/aggregate.pm:569
+#: ../IkiWiki/Plugin/aggregate.pm:556
 msgid "feed crashed XML::Feed!"
 msgstr "kanál shodil XML::Feed!"
 
-#: ../IkiWiki/Plugin/aggregate.pm:661
+#: ../IkiWiki/Plugin/aggregate.pm:649
 #, perl-format
 msgid "creating new page %s"
 msgstr "vytvářím novou stránku %s"
 
-#: ../IkiWiki/Plugin/aggregate.pm:689 ../IkiWiki/Plugin/edittemplate.pm:135
+#: ../IkiWiki/Plugin/aggregate.pm:677 ../IkiWiki/Plugin/edittemplate.pm:135
 #, fuzzy
 msgid "failed to process template:"
 msgstr "nepodařilo se zpracovat:"
@@ -138,7 +138,7 @@ msgstr "nepodařilo se zpracovat:"
 msgid "deleting bucket.."
 msgstr "mažu bucket..."
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:227
+#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:225
 msgid "done"
 msgstr "hotovo"
 
@@ -155,7 +155,7 @@ msgstr "Nepodařilo se vytvořit S3 bucket:"
 msgid "Failed to save file to S3: "
 msgstr "Nepodařilo se uložit soubor na S3:"
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:247
+#: ../IkiWiki/Plugin/amazon_s3.pm:248
 msgid "Failed to delete file from S3: "
 msgstr "Nelze smazat soubor z S3:"
 
@@ -172,16 +172,16 @@ msgstr "zakázáno proměnnou allowed_attachments"
 msgid "bad attachment filename"
 msgstr "chybné jméno souboru s přílohou"
 
-#: ../IkiWiki/Plugin/attachment.pm:295
+#: ../IkiWiki/Plugin/attachment.pm:296
 msgid "attachment upload"
 msgstr "příloha nahrána"
 
-#: ../IkiWiki/Plugin/attachment.pm:346
+#: ../IkiWiki/Plugin/attachment.pm:347
 #, fuzzy
 msgid "this attachment is not yet saved"
 msgstr "%s není ani příloha, ani stránka."
 
-#: ../IkiWiki/Plugin/attachment.pm:363
+#: ../IkiWiki/Plugin/attachment.pm:365
 msgid "just uploaded"
 msgstr ""
 
@@ -190,7 +190,7 @@ msgstr ""
 msgid "creating index page %s"
 msgstr "vytvářím novou stránku %s"
 
-#: ../IkiWiki/Plugin/blogspam.pm:118
+#: ../IkiWiki/Plugin/blogspam.pm:119
 msgid ""
 "Sorry, but that looks like spam to <a href=\"http://blogspam.net/"
 "\">blogspam</a>: "
@@ -207,85 +207,89 @@ msgstr "%s z %s"
 msgid "There are no broken links!"
 msgstr "Žádné porušené odkazy!"
 
-#: ../IkiWiki/Plugin/comments.pm:114
+#: ../IkiWiki/Plugin/comments.pm:124
 #, fuzzy, perl-format
 msgid "this comment needs %s"
 msgstr "komentář k %s"
 
-#: ../IkiWiki/Plugin/comments.pm:117
+#: ../IkiWiki/Plugin/comments.pm:127
 #, fuzzy
 msgid "moderation"
 msgstr "Schvalování komentářů"
 
-#: ../IkiWiki/Plugin/comments.pm:138 ../IkiWiki/Plugin/format.pm:50
+#: ../IkiWiki/Plugin/comments.pm:154 ../IkiWiki/Plugin/format.pm:50
 #, perl-format
 msgid "unsupported page format %s"
 msgstr "nepodporovaný formát stránky %s"
 
-#: ../IkiWiki/Plugin/comments.pm:143
+#: ../IkiWiki/Plugin/comments.pm:159
 msgid "comment must have content"
 msgstr "komentář musí mít obsah"
 
-#: ../IkiWiki/Plugin/comments.pm:201
+#: ../IkiWiki/Plugin/comments.pm:217
 msgid "Anonymous"
 msgstr "Anonym"
 
-#: ../IkiWiki/Plugin/comments.pm:263
+#: ../IkiWiki/Plugin/comments.pm:279
 #, fuzzy
 msgid "Comment Moderation"
 msgstr "Schvalování komentářů"
 
-#: ../IkiWiki/Plugin/comments.pm:379 ../IkiWiki/Plugin/editpage.pm:95
-#: ../IkiWiki/Plugin/editpage.pm:101
+#: ../IkiWiki/Plugin/comments.pm:375 ../IkiWiki/Plugin/comments.pm:379
+msgid "email replies to me"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:413 ../IkiWiki/Plugin/editpage.pm:96
+#: ../IkiWiki/Plugin/editpage.pm:102
 msgid "bad page name"
 msgstr "chybný název stránky"
 
-#: ../IkiWiki/Plugin/comments.pm:382
+#: ../IkiWiki/Plugin/comments.pm:416
 #, perl-format
 msgid "commenting on %s"
 msgstr "komentář k %s"
 
-#: ../IkiWiki/Plugin/comments.pm:399
+#: ../IkiWiki/Plugin/comments.pm:433
 #, 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:406
+#: ../IkiWiki/Plugin/comments.pm:440
 #, perl-format
 msgid "comments on page '%s' are closed"
 msgstr "komentáře na stránce „%s“ jsou uzamčeny"
 
-#: ../IkiWiki/Plugin/comments.pm:520
+#: ../IkiWiki/Plugin/comments.pm:565
 msgid "comment stored for moderation"
 msgstr "komentář uložen pro schválení"
 
-#: ../IkiWiki/Plugin/comments.pm:522
+#: ../IkiWiki/Plugin/comments.pm:567
 msgid "Your comment will be posted after moderator review"
 msgstr "Váš komentář bude zobrazen po schválení moderátorem"
 
-#: ../IkiWiki/Plugin/comments.pm:535
+#: ../IkiWiki/Plugin/comments.pm:580
 msgid "Added a comment"
 msgstr "Přidán komentář"
 
-#: ../IkiWiki/Plugin/comments.pm:539
+#: ../IkiWiki/Plugin/comments.pm:584
 #, perl-format
 msgid "Added a comment: %s"
 msgstr "Přidán komentář: %s"
 
-#: ../IkiWiki/Plugin/comments.pm:608 ../IkiWiki/Plugin/userlist.pm:55
+#: ../IkiWiki/Plugin/comments.pm:654 ../IkiWiki/Plugin/userlist.pm:55
 #: ../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:660
+#: ../IkiWiki/Plugin/comments.pm:708
 msgid "Comment moderation"
 msgstr "Schvalování komentářů"
 
-#: ../IkiWiki/Plugin/comments.pm:701
+#: ../IkiWiki/Plugin/comments.pm:749
 msgid "comment moderation"
 msgstr "schvalování komentářů"
 
-#: ../IkiWiki/Plugin/comments.pm:862
+#: ../IkiWiki/Plugin/comments.pm:910
 #, fuzzy, perl-format
 msgid "%i comment"
 msgid_plural "%i comments"
@@ -295,12 +299,12 @@ 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:872
+#: ../IkiWiki/Plugin/comments.pm:920
 #, fuzzy
 msgid "Comment"
 msgstr "Komentáře"
 
-#: ../IkiWiki/Plugin/conditional.pm:28 ../IkiWiki/Plugin/cutpaste.pm:46
+#: ../IkiWiki/Plugin/conditional.pm:27 ../IkiWiki/Plugin/cutpaste.pm:46
 #: ../IkiWiki/Plugin/cutpaste.pm:60 ../IkiWiki/Plugin/cutpaste.pm:75
 #: ../IkiWiki/Plugin/testpagespec.pm:26
 #, perl-format
@@ -321,19 +325,24 @@ msgstr "na této stránce nebyl zkopírován žádný text s id %s"
 msgid "removing old preview %s"
 msgstr "odstraňuji starý náhled %s"
 
-#: ../IkiWiki/Plugin/editpage.pm:117
+#: ../IkiWiki/Plugin/editpage.pm:118
 #, perl-format
 msgid "%s is not an editable page"
 msgstr "%s není editovatelná stránka"
 
-#: ../IkiWiki/Plugin/editpage.pm:307
+#: ../IkiWiki/Plugin/editpage.pm:166
+#, fuzzy
+msgid "email comments to me"
+msgstr "Komentáře"
+
+#: ../IkiWiki/Plugin/editpage.pm:319
 #, perl-format
 msgid "creating %s"
 msgstr "vytvářím %s"
 
-#: ../IkiWiki/Plugin/editpage.pm:325 ../IkiWiki/Plugin/editpage.pm:344
-#: ../IkiWiki/Plugin/editpage.pm:355 ../IkiWiki/Plugin/editpage.pm:400
-#: ../IkiWiki/Plugin/editpage.pm:442
+#: ../IkiWiki/Plugin/editpage.pm:337 ../IkiWiki/Plugin/editpage.pm:356
+#: ../IkiWiki/Plugin/editpage.pm:367 ../IkiWiki/Plugin/editpage.pm:412
+#: ../IkiWiki/Plugin/editpage.pm:454
 #, perl-format
 msgid "editing %s"
 msgstr "upravuji %s"
@@ -377,27 +386,27 @@ msgstr "není stránkou"
 msgid "%s is an attachment, not a page."
 msgstr "%s není ani příloha, ani stránka."
 
-#: ../IkiWiki/Plugin/git.pm:777 ../IkiWiki/Plugin/git.pm:840
-#: ../IkiWiki.pm:1690
+#: ../IkiWiki/Plugin/git.pm:789 ../IkiWiki/Plugin/git.pm:852
+#: ../IkiWiki.pm:1728
 #, perl-format
 msgid "you are not allowed to change %s"
 msgstr "nejste oprávněni měnit %s"
 
-#: ../IkiWiki/Plugin/git.pm:799
+#: ../IkiWiki/Plugin/git.pm:811
 #, 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:803
+#: ../IkiWiki/Plugin/git.pm:815
 msgid "you are not allowed to change file modes"
 msgstr "nejste oprávněni měnit přístupová oprávnění souborů"
 
-#: ../IkiWiki/Plugin/git.pm:873
+#: ../IkiWiki/Plugin/git.pm:885
 #, fuzzy
 msgid "you are not allowed to revert a merge"
 msgstr "nejste oprávněni měnit %s"
 
-#: ../IkiWiki/Plugin/git.pm:892
+#: ../IkiWiki/Plugin/git.pm:902
 #, fuzzy, perl-format
 msgid "Failed to revert commit %s"
 msgstr "nelze zkompilovat %s"
@@ -411,7 +420,7 @@ msgstr "%s musíte zadat při každém použití modulu %s"
 msgid "failed to run graphviz"
 msgstr "nepodařilo se spustit graphviz"
 
-#: ../IkiWiki/Plugin/graphviz.pm:143
+#: ../IkiWiki/Plugin/graphviz.pm:144
 msgid "prog not a valid graphviz program"
 msgstr "program není platným programem graphviz"
 
@@ -425,7 +434,7 @@ msgstr "tohighlight obsahuje neznámý typ souboru „%s“"
 msgid "Source code: %s"
 msgstr "Zdrojový kód: %s"
 
-#: ../IkiWiki/Plugin/highlight.pm:179
+#: ../IkiWiki/Plugin/highlight.pm:180
 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"
@@ -470,31 +479,31 @@ msgstr "úprava stránky není povolena"
 msgid "missing pages parameter"
 msgstr "chybí parametr pages"
 
-#: ../IkiWiki/Plugin/inline.pm:192
+#: ../IkiWiki/Plugin/inline.pm:209
 #, 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:297
+#: ../IkiWiki/Plugin/inline.pm:315
 #, perl-format
 msgid "%s (RSS feed)"
 msgstr ""
 
-#: ../IkiWiki/Plugin/inline.pm:301
+#: ../IkiWiki/Plugin/inline.pm:319
 #, perl-format
 msgid "%s (Atom feed)"
 msgstr ""
 
-#: ../IkiWiki/Plugin/inline.pm:330
+#: ../IkiWiki/Plugin/inline.pm:348
 msgid "Add a new post titled:"
 msgstr "Přidat nový příspěvek nazvaný:"
 
-#: ../IkiWiki/Plugin/inline.pm:369 ../IkiWiki/Plugin/template.pm:44
+#: ../IkiWiki/Plugin/inline.pm:387 ../IkiWiki/Plugin/template.pm:44
 #, fuzzy, perl-format
 msgid "failed to process template %s"
 msgstr "nepodařilo se zpracovat:"
 
-#: ../IkiWiki/Plugin/inline.pm:695
+#: ../IkiWiki/Plugin/inline.pm:725
 msgid "RPC::XML::Client not found, not pinging"
 msgstr "RPC::XML::Client nebyl nalezen, nepinkám"
 
@@ -512,43 +521,48 @@ msgstr ""
 msgid "%s is locked and cannot be edited"
 msgstr "Stránka %s je zamknutá a nelze ji měnit"
 
-#: ../IkiWiki/Plugin/mdwn.pm:45
+#: ../IkiWiki/Plugin/mdwn.pm:52
 msgid "multimarkdown is enabled, but Text::MultiMarkdown is not installed"
 msgstr "je povolen multimarkdown, ale Text::MultiMarkdown není nainstalován"
 
-#: ../IkiWiki/Plugin/mdwn.pm:70
+#: ../IkiWiki/Plugin/mdwn.pm:96
 #, 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:175
+#: ../IkiWiki/Plugin/meta.pm:127
+#, fuzzy
+msgid "enclosure not found"
+msgstr "kanál nebyl nalezen"
+
+#: ../IkiWiki/Plugin/meta.pm:187
 msgid "stylesheet not found"
 msgstr "styl nebyl nalezen"
 
-#: ../IkiWiki/Plugin/meta.pm:187
+#: ../IkiWiki/Plugin/meta.pm:199
 #, fuzzy
 msgid "script not found"
 msgstr "%s nenalezen"
 
-#: ../IkiWiki/Plugin/meta.pm:235
+#: ../IkiWiki/Plugin/meta.pm:247
 msgid "redir page not found"
 msgstr "stránka, na kterou vede přesměrování, nebyla nalezena"
 
-#: ../IkiWiki/Plugin/meta.pm:249
+#: ../IkiWiki/Plugin/meta.pm:261
 msgid "redir cycle is not allowed"
 msgstr "cykly nejsou v přesměrování povoleny"
 
-#: ../IkiWiki/Plugin/meta.pm:427
+#: ../IkiWiki/Plugin/meta.pm:450
 #, fuzzy
 msgid "sort=meta requires a parameter"
 msgstr "vyžaduje parametry „from“ a „to“"
 
-#: ../IkiWiki/Plugin/mirrorlist.pm:44
+#: ../IkiWiki/Plugin/mirrorlist.pm:57
 msgid "Mirrors"
 msgstr "Zrcadla"
 
-#: ../IkiWiki/Plugin/mirrorlist.pm:44
+#: ../IkiWiki/Plugin/mirrorlist.pm:57
 msgid "Mirror"
 msgstr "Zrcadlo"
 
@@ -561,6 +575,19 @@ msgstr "schvalování komentářů"
 msgid "more"
 msgstr "více"
 
+#: ../IkiWiki/Plugin/notifyemail.pm:72
+msgid "Cannot subscribe your email address without logging in."
+msgstr ""
+
+#: ../IkiWiki/Plugin/notifyemail.pm:136
+msgid "change notification:"
+msgstr ""
+
+#: ../IkiWiki/Plugin/notifyemail.pm:138
+#, fuzzy
+msgid "comment notification:"
+msgstr "schvalování komentářů"
+
 #: ../IkiWiki/Plugin/openid.pm:71
 #, fuzzy, perl-format
 msgid "failed to load openid module: "
@@ -574,42 +601,51 @@ 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:231
+#: ../IkiWiki/Plugin/passwordauth.pm:145 ../IkiWiki/Plugin/passwordauth.pm:337
+msgid "Error creating account."
+msgstr "Chyba při vytváření účtu."
+
+#: ../IkiWiki/Plugin/passwordauth.pm:297
 msgid "Your user page: "
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:238
+#: ../IkiWiki/Plugin/passwordauth.pm:304
 msgid "Create your user page"
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:268
+#: ../IkiWiki/Plugin/passwordauth.pm:334
 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:271
-msgid "Error creating account."
-msgstr "Chyba při vytváření účtu."
-
-#: ../IkiWiki/Plugin/passwordauth.pm:278
+#: ../IkiWiki/Plugin/passwordauth.pm:344
 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:312
+#: ../IkiWiki/Plugin/passwordauth.pm:371
 msgid "Failed to send mail"
 msgstr "Nepodařilo se odeslat email."
 
-#: ../IkiWiki/Plugin/passwordauth.pm:314
+#: ../IkiWiki/Plugin/passwordauth.pm:373
 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:349
+#: ../IkiWiki/Plugin/passwordauth.pm:408
 msgid "incorrect password reset url"
 msgstr "chybné URL pro resetování hesla"
 
-#: ../IkiWiki/Plugin/passwordauth.pm:352
+#: ../IkiWiki/Plugin/passwordauth.pm:411
 msgid "password reset denied"
 msgstr "resetování hesla bylo zamítnuto"
 
+#: ../IkiWiki/Plugin/passwordauth.pm:424
+#, fuzzy
+msgid "incorrect url"
+msgstr "chybné URL pro resetování hesla"
+
+#: ../IkiWiki/Plugin/passwordauth.pm:427
+msgid "access denied"
+msgstr ""
+
 #: ../IkiWiki/Plugin/pingee.pm:30
 msgid "Ping received."
 msgstr "Obdrženo pinknutí."
@@ -636,30 +672,30 @@ 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:180
+#: ../IkiWiki/Plugin/po.pm:179
 #, perl-format
 msgid "%s is not a valid language code"
 msgstr "%s není platným kódem jazyka"
 
-#: ../IkiWiki/Plugin/po.pm:192
+#: ../IkiWiki/Plugin/po.pm:191
 #, 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:197
+#: ../IkiWiki/Plugin/po.pm:196
 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:468
+#: ../IkiWiki/Plugin/po.pm:467
 msgid "updated PO files"
 msgstr "aktualizovány PO soubory"
 
-#: ../IkiWiki/Plugin/po.pm:491
+#: ../IkiWiki/Plugin/po.pm:490
 msgid ""
 "Can not remove a translation. If the master page is removed, however, its "
 "translations will be removed as well."
@@ -667,7 +703,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:511
+#: ../IkiWiki/Plugin/po.pm:510
 msgid ""
 "Can not rename a translation. If the master page is renamed, however, its "
 "translations will be renamed as well."
@@ -675,65 +711,69 @@ 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:957
+#: ../IkiWiki/Plugin/po.pm:956
 #, perl-format
 msgid "POT file (%s) does not exist"
 msgstr "POT soubor (%s) neexistuje"
 
-#: ../IkiWiki/Plugin/po.pm:971
+#: ../IkiWiki/Plugin/po.pm:970
 #, 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:980
+#: ../IkiWiki/Plugin/po.pm:979
 #, perl-format
 msgid "failed to update %s"
 msgstr "nepodařilo se aktualizovat %s"
 
-#: ../IkiWiki/Plugin/po.pm:986
+#: ../IkiWiki/Plugin/po.pm:985
 #, 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:1022
+#: ../IkiWiki/Plugin/po.pm:1021
 msgid "N/A"
 msgstr "N/A"
 
-#: ../IkiWiki/Plugin/po.pm:1033
+#: ../IkiWiki/Plugin/po.pm:1032
 #, perl-format
 msgid "failed to translate %s"
 msgstr "nepodařilo se přeložit %s"
 
-#: ../IkiWiki/Plugin/po.pm:1112
+#: ../IkiWiki/Plugin/po.pm:1111
 msgid "removed obsolete PO files"
 msgstr "odstraněny zastaralé PO soubory"
 
-#: ../IkiWiki/Plugin/po.pm:1169 ../IkiWiki/Plugin/po.pm:1181
-#: ../IkiWiki/Plugin/po.pm:1220
+#: ../IkiWiki/Plugin/po.pm:1168 ../IkiWiki/Plugin/po.pm:1180
+#: ../IkiWiki/Plugin/po.pm:1219
 #, perl-format
 msgid "failed to write %s"
 msgstr "nepodařilo se zapsat %s"
 
-#: ../IkiWiki/Plugin/po.pm:1179
+#: ../IkiWiki/Plugin/po.pm:1178
 msgid "failed to translate"
 msgstr "překlad se nezdařil"
 
-#: ../IkiWiki/Plugin/po.pm:1232
+#: ../IkiWiki/Plugin/po.pm:1231
 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/po.pm:1275
+#: ../IkiWiki/Plugin/po.pm:1274
 #, perl-format
 msgid "%s has invalid syntax: must use CODE|NAME"
 msgstr ""
 
-#: ../IkiWiki/Plugin/poll.pm:70
+#: ../IkiWiki/Plugin/poll.pm:72 ../IkiWiki/Plugin/poll.pm:87
 msgid "vote"
 msgstr "hlasovat"
 
-#: ../IkiWiki/Plugin/poll.pm:78
+#: ../IkiWiki/Plugin/poll.pm:86
+msgid "Write in"
+msgstr ""
+
+#: ../IkiWiki/Plugin/poll.pm:93
 msgid "Total votes:"
 msgstr "Celkem hlasů:"
 
@@ -836,35 +876,35 @@ msgstr ""
 msgid "confirm reversion of %s"
 msgstr "potvrďte odstranění %s"
 
-#: ../IkiWiki/Plugin/recentchangesdiff.pm:36
+#: ../IkiWiki/Plugin/recentchangesdiff.pm:49
 msgid "(Diff truncated)"
 msgstr "(Diff oříznut)"
 
-#: ../IkiWiki/Plugin/remove.pm:32 ../IkiWiki/Plugin/rename.pm:37
+#: ../IkiWiki/Plugin/remove.pm:39 ../IkiWiki/Plugin/rename.pm:37
 #, perl-format
 msgid "%s does not exist"
 msgstr "%s neexistuje"
 
-#: ../IkiWiki/Plugin/remove.pm:39
+#: ../IkiWiki/Plugin/remove.pm:56
 #, 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:42 ../IkiWiki/Plugin/rename.pm:46
+#: ../IkiWiki/Plugin/remove.pm:59 ../IkiWiki/Plugin/rename.pm:46
 #, perl-format
 msgid "%s is not a file"
 msgstr "%s není souborem"
 
-#: ../IkiWiki/Plugin/remove.pm:149
+#: ../IkiWiki/Plugin/remove.pm:166
 #, perl-format
 msgid "confirm removal of %s"
 msgstr "potvrďte odstranění %s"
 
-#: ../IkiWiki/Plugin/remove.pm:186
+#: ../IkiWiki/Plugin/remove.pm:203
 msgid "Please select the attachments to remove."
 msgstr "Vyberte prosím přílohy, které se mají odstranit."
 
-#: ../IkiWiki/Plugin/remove.pm:230
+#: ../IkiWiki/Plugin/remove.pm:263
 msgid "removed"
 msgstr "odstraněno"
 
@@ -901,20 +941,20 @@ msgstr "přejmenování %s"
 msgid "Also rename SubPages and attachments"
 msgstr "Také přejmenovat podstránky a přílohy"
 
-#: ../IkiWiki/Plugin/rename.pm:258
+#: ../IkiWiki/Plugin/rename.pm:266
 msgid "Only one attachment can be renamed at a time."
 msgstr "Najednou lze přejmenovat pouze jednu přílohu."
 
-#: ../IkiWiki/Plugin/rename.pm:261
+#: ../IkiWiki/Plugin/rename.pm:269
 msgid "Please select the attachment to rename."
 msgstr "Vyberte přílohu, kterou chcete přejmenovat."
 
-#: ../IkiWiki/Plugin/rename.pm:371
+#: ../IkiWiki/Plugin/rename.pm:379
 #, perl-format
 msgid "rename %s to %s"
 msgstr "přejmenování %s na %s"
 
-#: ../IkiWiki/Plugin/rename.pm:597
+#: ../IkiWiki/Plugin/rename.pm:605
 #, perl-format
 msgid "update for rename of %s to %s"
 msgstr "aktualizace pro přejmenování %s na %s"
@@ -1034,6 +1074,11 @@ msgstr "chybí TeXový kód"
 msgid "failed to generate image from code"
 msgstr "z kódu se nepodařilo vygenerovat obrázek"
 
+#: ../IkiWiki/Plugin/trail.pm:393
+#, perl-format
+msgid "building %s, its previous or next page has changed"
+msgstr ""
+
 #: ../IkiWiki/Plugin/transient.pm:45
 #, fuzzy, perl-format
 msgid "removing transient version of %s"
@@ -1105,7 +1150,7 @@ msgstr "nemohu určit identitu nedůvěryhodného uživatele %s"
 msgid "scanning %s"
 msgstr "prohledávám %s"
 
-#: ../IkiWiki/Render.pm:280
+#: ../IkiWiki/Render.pm:281
 #, perl-format
 msgid ""
 "symlink found in srcdir path (%s) -- set allow_symlinks_before_srcdir to "
@@ -1114,52 +1159,52 @@ 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:316
+#: ../IkiWiki/Render.pm:317
 #, perl-format
 msgid "skipping bad filename %s"
 msgstr "přeskakuji chybné jméno souboru %s"
 
-#: ../IkiWiki/Render.pm:332
+#: ../IkiWiki/Render.pm:333
 #, perl-format
 msgid "%s has multiple possible source pages"
 msgstr "%s má několik možných zdrojových stránek"
 
-#: ../IkiWiki/Render.pm:372
+#: ../IkiWiki/Render.pm:373
 #, perl-format
 msgid "querying %s for file creation and modification times.."
 msgstr ""
 
-#: ../IkiWiki/Render.pm:446
+#: ../IkiWiki/Render.pm:447
 #, fuzzy, perl-format
 msgid "removing obsolete %s"
 msgstr "odstraňuji starou stránku %s"
 
-#: ../IkiWiki/Render.pm:530
+#: ../IkiWiki/Render.pm:531
 #, perl-format
 msgid "building %s, which links to %s"
 msgstr "sestavuji %s, která odkazuje na %s"
 
-#: ../IkiWiki/Render.pm:539
+#: ../IkiWiki/Render.pm:540
 #, perl-format
 msgid "removing %s, no longer built by %s"
 msgstr "odstraňuji %s, již není sestavována pomocí %s"
 
-#: ../IkiWiki/Render.pm:622 ../IkiWiki/Render.pm:704
+#: ../IkiWiki/Render.pm:623 ../IkiWiki/Render.pm:705
 #, perl-format
 msgid "building %s, which depends on %s"
 msgstr "sestavuji %s, která závisí na %s"
 
-#: ../IkiWiki/Render.pm:717
+#: ../IkiWiki/Render.pm:718
 #, perl-format
 msgid "building %s, to update its backlinks"
 msgstr "sestavuji %s, aby se aktualizovaly zpětné odkazy"
 
-#: ../IkiWiki/Render.pm:797
+#: ../IkiWiki/Render.pm:806
 #, perl-format
 msgid "building %s"
 msgstr "sestavuji %s"
 
-#: ../IkiWiki/Render.pm:849
+#: ../IkiWiki/Render.pm:871
 #, perl-format
 msgid "ikiwiki: cannot build %s"
 msgstr "ikiwiki: nelze sestavit %s"
@@ -1203,27 +1248,31 @@ msgstr "** Deaktivuji modul %s, protože selhává s touto hláškou:"
 msgid "generating wrappers.."
 msgstr "generuji obaly..."
 
-#: ../IkiWiki/Wrapper.pm:36
+#: ../IkiWiki/Wrapper.pm:37
 #, perl-format
 msgid "%s doesn't seem to be executable"
 msgstr "%s není spustitelný soubor"
 
-#: ../IkiWiki/Wrapper.pm:40
+#: ../IkiWiki/Wrapper.pm:41
 msgid "cannot create a wrapper that uses a setup file"
 msgstr "nemohu vytvořit obal, který využívá soubor setup"
 
-#: ../IkiWiki/Wrapper.pm:44
+#: ../IkiWiki/Wrapper.pm:45
 msgid "wrapper filename not specified"
 msgstr "jméno souboru s obalem nebylo zadáno"
 
+#: ../IkiWiki/Wrapper.pm:109
+msgid "Please wait"
+msgstr ""
+
 #. translators: The parameter is a C filename.
-#: ../IkiWiki/Wrapper.pm:220
+#: ../IkiWiki/Wrapper.pm:268
 #, perl-format
 msgid "failed to compile %s"
 msgstr "nelze zkompilovat %s"
 
 #. translators: The parameter is a filename.
-#: ../IkiWiki/Wrapper.pm:240
+#: ../IkiWiki/Wrapper.pm:288
 #, perl-format
 msgid "successfully generated %s"
 msgstr "%s byl úspěšně vytvořen"
@@ -1245,66 +1294,66 @@ msgstr "použití: --set proměnná=hodnota"
 msgid "usage: --set-yaml var=value"
 msgstr "použití: --set proměnná=hodnota"
 
-#: ../ikiwiki.in:216
+#: ../ikiwiki.in:214
 msgid "rebuilding wiki.."
 msgstr "znovusestavuji wiki..."
 
-#: ../ikiwiki.in:219
+#: ../ikiwiki.in:217
 msgid "refreshing wiki.."
 msgstr "obnovuji wiki..."
 
-#: ../IkiWiki.pm:232
+#: ../IkiWiki.pm:248
 msgid "Discussion"
 msgstr "Diskuse"
 
-#: ../IkiWiki.pm:557
+#: ../IkiWiki.pm:580
 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:605
+#: ../IkiWiki.pm:628
 #, fuzzy, perl-format
 msgid "unsupported umask setting %s"
 msgstr "nepodporovaný formát stránky %s"
 
-#: ../IkiWiki.pm:645
+#: ../IkiWiki.pm:668
 msgid "cannot use multiple rcs plugins"
 msgstr "nelze použít několik rcs modulů"
 
-#: ../IkiWiki.pm:675
+#: ../IkiWiki.pm:698
 #, 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:1452
+#: ../IkiWiki.pm:1490
 #, perl-format
 msgid "preprocessing loop detected on %s at depth %i"
 msgstr "Byla rozpoznána smyčka na %s v hloubce %i"
 
-#: ../IkiWiki.pm:1646
+#: ../IkiWiki.pm:1684
 #, perl-format
 msgid "bad file name %s"
 msgstr "chybné jméno souboru %s"
 
-#: ../IkiWiki.pm:1946
+#: ../IkiWiki.pm:1984
 #, perl-format
 msgid "template %s not found"
 msgstr "šablona %s nebyla nalezena"
 
-#: ../IkiWiki.pm:2196
+#: ../IkiWiki.pm:2234
 msgid "yes"
 msgstr "ano"
 
-#: ../IkiWiki.pm:2273
+#: ../IkiWiki.pm:2318
 #, fuzzy, perl-format
 msgid "invalid sort type %s"
 msgstr "neznámý typ řazení %s"
 
-#: ../IkiWiki.pm:2294
+#: ../IkiWiki.pm:2339
 #, perl-format
 msgid "unknown sort type %s"
 msgstr "neznámý typ řazení %s"
 
-#: ../IkiWiki.pm:2430
+#: ../IkiWiki.pm:2475
 #, perl-format
 msgid "cannot match pages: %s"
 msgstr "nelze vybrat stránky: %s"
index 5d612c662d36bb915450e98bb9ea7852a6997a3b..6eb171f9bc3b0ed5a7f15456e7a243fd0450a22e 100644 (file)
--- a/po/da.po
+++ b/po/da.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: ikiwiki 3.20110430\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-11-30 16:33-0400\n"
+"POT-Creation-Date: 2013-09-04 10:16-0400\n"
 "PO-Revision-Date: 2011-05-05 13:30+0200\n"
 "Last-Translator: Jonas Smedegaard <dr@jones.dk>\n"
 "Language-Team: None\n"
@@ -56,84 +56,84 @@ msgstr "Indstillinger gemt"
 msgid "You are banned."
 msgstr "Du er banlyst."
 
-#: ../IkiWiki/CGI.pm:464 ../IkiWiki/CGI.pm:465 ../IkiWiki.pm:1470
+#: ../IkiWiki/CGI.pm:464 ../IkiWiki/CGI.pm:465 ../IkiWiki.pm:1508
 msgid "Error"
 msgstr "Fejl"
 
-#: ../IkiWiki/Plugin/aggregate.pm:95
+#: ../IkiWiki/Plugin/aggregate.pm:86
 msgid "Aggregation triggered via web."
 msgstr "Indsamling udløst via web."
 
-#: ../IkiWiki/Plugin/aggregate.pm:104
+#: ../IkiWiki/Plugin/aggregate.pm:95
 msgid "Nothing to do right now, all feeds are up-to-date!"
 msgstr "Intet at gøre lige nu, alle fødninger er tidssvarende!"
 
-#: ../IkiWiki/Plugin/aggregate.pm:237
+#: ../IkiWiki/Plugin/aggregate.pm:227
 #, perl-format
 msgid "missing %s parameter"
 msgstr "mangler parametren %s"
 
-#: ../IkiWiki/Plugin/aggregate.pm:272
+#: ../IkiWiki/Plugin/aggregate.pm:262
 msgid "new feed"
 msgstr "ny fødning"
 
-#: ../IkiWiki/Plugin/aggregate.pm:286
+#: ../IkiWiki/Plugin/aggregate.pm:276
 msgid "posts"
 msgstr "indlæg"
 
-#: ../IkiWiki/Plugin/aggregate.pm:288
+#: ../IkiWiki/Plugin/aggregate.pm:278
 msgid "new"
 msgstr "nyt"
 
-#: ../IkiWiki/Plugin/aggregate.pm:475
+#: ../IkiWiki/Plugin/aggregate.pm:465
 #, perl-format
 msgid "expiring %s (%s days old)"
 msgstr "udløber %s (%s dage gammel)"
 
-#: ../IkiWiki/Plugin/aggregate.pm:482
+#: ../IkiWiki/Plugin/aggregate.pm:472
 #, perl-format
 msgid "expiring %s"
 msgstr "udløber %s"
 
-#: ../IkiWiki/Plugin/aggregate.pm:510
+#: ../IkiWiki/Plugin/aggregate.pm:500
 #, perl-format
 msgid "last checked %s"
 msgstr "senest undersøgt %s"
 
-#: ../IkiWiki/Plugin/aggregate.pm:514
+#: ../IkiWiki/Plugin/aggregate.pm:504
 #, perl-format
 msgid "checking feed %s ..."
 msgstr "undersøger fødning %s ..."
 
-#: ../IkiWiki/Plugin/aggregate.pm:519
+#: ../IkiWiki/Plugin/aggregate.pm:509
 #, perl-format
 msgid "could not find feed at %s"
 msgstr "kunne ikke finde fødning ved %s"
 
-#: ../IkiWiki/Plugin/aggregate.pm:542
+#: ../IkiWiki/Plugin/aggregate.pm:529
 msgid "feed not found"
 msgstr "fødning ikke fundet"
 
-#: ../IkiWiki/Plugin/aggregate.pm:553
+#: ../IkiWiki/Plugin/aggregate.pm:540
 #, perl-format
 msgid "(invalid UTF-8 stripped from feed)"
 msgstr "(defekt UTF-8 fjernet fra fødning)"
 
-#: ../IkiWiki/Plugin/aggregate.pm:561
+#: ../IkiWiki/Plugin/aggregate.pm:548
 #, perl-format
 msgid "(feed entities escaped)"
 msgstr "(fødningselementer omgået (escaped))"
 
-#: ../IkiWiki/Plugin/aggregate.pm:569
+#: ../IkiWiki/Plugin/aggregate.pm:556
 msgid "feed crashed XML::Feed!"
 msgstr "fødning fik XML::Feed til at bryde sammen!"
 
-#: ../IkiWiki/Plugin/aggregate.pm:661
+#: ../IkiWiki/Plugin/aggregate.pm:649
 #, perl-format
 msgid "creating new page %s"
 msgstr "opretter ny side %s"
 
-#: ../IkiWiki/Plugin/aggregate.pm:689 ../IkiWiki/Plugin/edittemplate.pm:135
+#: ../IkiWiki/Plugin/aggregate.pm:677 ../IkiWiki/Plugin/edittemplate.pm:135
 msgid "failed to process template:"
 msgstr "behandling af skabelon mislykkedes:"
 
@@ -141,7 +141,7 @@ msgstr "behandling af skabelon mislykkedes:"
 msgid "deleting bucket.."
 msgstr "sletter bundt.."
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:227
+#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:225
 msgid "done"
 msgstr "færdig"
 
@@ -158,7 +158,7 @@ msgstr "Oprettelse af S3 bundt mislykkedes: "
 msgid "Failed to save file to S3: "
 msgstr "Arkivering af fil til S3 mislykkedes: "
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:247
+#: ../IkiWiki/Plugin/amazon_s3.pm:248
 msgid "Failed to delete file from S3: "
 msgstr "Sletning af fil fra S3 mislykkedes: "
 
@@ -175,16 +175,16 @@ msgstr "forhindret af allowed_attachments"
 msgid "bad attachment filename"
 msgstr "dårligt vedhæftningsfilnavn"
 
-#: ../IkiWiki/Plugin/attachment.pm:295
+#: ../IkiWiki/Plugin/attachment.pm:296
 msgid "attachment upload"
 msgstr "vedhæftningsoplægning"
 
-#: ../IkiWiki/Plugin/attachment.pm:346
+#: ../IkiWiki/Plugin/attachment.pm:347
 #, fuzzy
 msgid "this attachment is not yet saved"
 msgstr "%s er en vedhæftning, ikke en side."
 
-#: ../IkiWiki/Plugin/attachment.pm:363
+#: ../IkiWiki/Plugin/attachment.pm:365
 msgid "just uploaded"
 msgstr ""
 
@@ -193,7 +193,7 @@ msgstr ""
 msgid "creating index page %s"
 msgstr "opretter indeks-side %s"
 
-#: ../IkiWiki/Plugin/blogspam.pm:118
+#: ../IkiWiki/Plugin/blogspam.pm:119
 msgid ""
 "Sorry, but that looks like spam to <a href=\"http://blogspam.net/"
 "\">blogspam</a>: "
@@ -210,83 +210,87 @@ msgstr "%s fra %s"
 msgid "There are no broken links!"
 msgstr "Ingen henvisninger der ikker fungerer!"
 
-#: ../IkiWiki/Plugin/comments.pm:114
+#: ../IkiWiki/Plugin/comments.pm:124
 #, perl-format
 msgid "this comment needs %s"
 msgstr "denne kommentar kræver %s"
 
-#: ../IkiWiki/Plugin/comments.pm:117
+#: ../IkiWiki/Plugin/comments.pm:127
 msgid "moderation"
 msgstr "moderering"
 
-#: ../IkiWiki/Plugin/comments.pm:138 ../IkiWiki/Plugin/format.pm:50
+#: ../IkiWiki/Plugin/comments.pm:154 ../IkiWiki/Plugin/format.pm:50
 #, perl-format
 msgid "unsupported page format %s"
 msgstr "Ikke-understøttet sideformat %s"
 
-#: ../IkiWiki/Plugin/comments.pm:143
+#: ../IkiWiki/Plugin/comments.pm:159
 msgid "comment must have content"
 msgstr "kommentar skal have indhold"
 
-#: ../IkiWiki/Plugin/comments.pm:201
+#: ../IkiWiki/Plugin/comments.pm:217
 msgid "Anonymous"
 msgstr "Anonym"
 
-#: ../IkiWiki/Plugin/comments.pm:263
+#: ../IkiWiki/Plugin/comments.pm:279
 msgid "Comment Moderation"
 msgstr "Kommentarmoderering"
 
-#: ../IkiWiki/Plugin/comments.pm:379 ../IkiWiki/Plugin/editpage.pm:95
-#: ../IkiWiki/Plugin/editpage.pm:101
+#: ../IkiWiki/Plugin/comments.pm:375 ../IkiWiki/Plugin/comments.pm:379
+msgid "email replies to me"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:413 ../IkiWiki/Plugin/editpage.pm:96
+#: ../IkiWiki/Plugin/editpage.pm:102
 msgid "bad page name"
 msgstr "dårligt sidenavn"
 
-#: ../IkiWiki/Plugin/comments.pm:382
+#: ../IkiWiki/Plugin/comments.pm:416
 #, perl-format
 msgid "commenting on %s"
 msgstr "kommenterer på %s"
 
-#: ../IkiWiki/Plugin/comments.pm:399
+#: ../IkiWiki/Plugin/comments.pm:433
 #, 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:406
+#: ../IkiWiki/Plugin/comments.pm:440
 #, perl-format
 msgid "comments on page '%s' are closed"
 msgstr "kommentarer på side '%s' er lukket"
 
-#: ../IkiWiki/Plugin/comments.pm:520
+#: ../IkiWiki/Plugin/comments.pm:565
 msgid "comment stored for moderation"
 msgstr "kommentar gemt for moderering"
 
-#: ../IkiWiki/Plugin/comments.pm:522
+#: ../IkiWiki/Plugin/comments.pm:567
 msgid "Your comment will be posted after moderator review"
 msgstr "Din kommentar vil blive tilføjet efter moderatorgenemsyn"
 
-#: ../IkiWiki/Plugin/comments.pm:535
+#: ../IkiWiki/Plugin/comments.pm:580
 msgid "Added a comment"
 msgstr "Tilføjede en kommentar"
 
-#: ../IkiWiki/Plugin/comments.pm:539
+#: ../IkiWiki/Plugin/comments.pm:584
 #, perl-format
 msgid "Added a comment: %s"
 msgstr "Tilføjede en kommentar: %s"
 
-#: ../IkiWiki/Plugin/comments.pm:608 ../IkiWiki/Plugin/userlist.pm:55
+#: ../IkiWiki/Plugin/comments.pm:654 ../IkiWiki/Plugin/userlist.pm:55
 #: ../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:660
+#: ../IkiWiki/Plugin/comments.pm:708
 msgid "Comment moderation"
 msgstr "Kommentarmoderering"
 
-#: ../IkiWiki/Plugin/comments.pm:701
+#: ../IkiWiki/Plugin/comments.pm:749
 msgid "comment moderation"
 msgstr "kommentarkoderering"
 
-#: ../IkiWiki/Plugin/comments.pm:862
+#: ../IkiWiki/Plugin/comments.pm:910
 #, perl-format
 msgid "%i comment"
 msgid_plural "%i comments"
@@ -296,11 +300,11 @@ msgstr[1] "%i kommentarer"
 #. translators: Here "Comment" is a verb;
 #. translators: the user clicks on it to
 #. translators: post a comment.
-#: ../IkiWiki/Plugin/comments.pm:872
+#: ../IkiWiki/Plugin/comments.pm:920
 msgid "Comment"
 msgstr "Kommentér"
 
-#: ../IkiWiki/Plugin/conditional.pm:28 ../IkiWiki/Plugin/cutpaste.pm:46
+#: ../IkiWiki/Plugin/conditional.pm:27 ../IkiWiki/Plugin/cutpaste.pm:46
 #: ../IkiWiki/Plugin/cutpaste.pm:60 ../IkiWiki/Plugin/cutpaste.pm:75
 #: ../IkiWiki/Plugin/testpagespec.pm:26
 #, perl-format
@@ -321,19 +325,24 @@ msgstr "ingen tekst blev kopieret i denne side med id %s"
 msgid "removing old preview %s"
 msgstr "fjerner gammelt smugkig %s"
 
-#: ../IkiWiki/Plugin/editpage.pm:117
+#: ../IkiWiki/Plugin/editpage.pm:118
 #, perl-format
 msgid "%s is not an editable page"
 msgstr "%s er ikke en redigérbar side"
 
-#: ../IkiWiki/Plugin/editpage.pm:307
+#: ../IkiWiki/Plugin/editpage.pm:166
+#, fuzzy
+msgid "email comments to me"
+msgstr "%i kommentar"
+
+#: ../IkiWiki/Plugin/editpage.pm:319
 #, perl-format
 msgid "creating %s"
 msgstr "opretter %s"
 
-#: ../IkiWiki/Plugin/editpage.pm:325 ../IkiWiki/Plugin/editpage.pm:344
-#: ../IkiWiki/Plugin/editpage.pm:355 ../IkiWiki/Plugin/editpage.pm:400
-#: ../IkiWiki/Plugin/editpage.pm:442
+#: ../IkiWiki/Plugin/editpage.pm:337 ../IkiWiki/Plugin/editpage.pm:356
+#: ../IkiWiki/Plugin/editpage.pm:367 ../IkiWiki/Plugin/editpage.pm:412
+#: ../IkiWiki/Plugin/editpage.pm:454
 #, perl-format
 msgid "editing %s"
 msgstr "redigerer %s"
@@ -377,26 +386,26 @@ msgstr "ikke en side"
 msgid "%s is an attachment, not a page."
 msgstr "%s er en vedhæftning, ikke en side."
 
-#: ../IkiWiki/Plugin/git.pm:777 ../IkiWiki/Plugin/git.pm:840
-#: ../IkiWiki.pm:1690
+#: ../IkiWiki/Plugin/git.pm:789 ../IkiWiki/Plugin/git.pm:852
+#: ../IkiWiki.pm:1728
 #, perl-format
 msgid "you are not allowed to change %s"
 msgstr "Du har ikke lov til at ændre %s"
 
-#: ../IkiWiki/Plugin/git.pm:799
+#: ../IkiWiki/Plugin/git.pm:811
 #, 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:803
+#: ../IkiWiki/Plugin/git.pm:815
 msgid "you are not allowed to change file modes"
 msgstr "du har ikke lov til at ændre modus for filer"
 
-#: ../IkiWiki/Plugin/git.pm:873
+#: ../IkiWiki/Plugin/git.pm:885
 msgid "you are not allowed to revert a merge"
 msgstr "Du har ikke lov til at tilbageføre en sammenlægning"
 
-#: ../IkiWiki/Plugin/git.pm:892
+#: ../IkiWiki/Plugin/git.pm:902
 #, perl-format
 msgid "Failed to revert commit %s"
 msgstr "tilbageføring af indlæg %s mislykkedes"
@@ -410,7 +419,7 @@ msgstr "Skal angive %s når udvidelsen %s bruges"
 msgid "failed to run graphviz"
 msgstr "graphviz-kørsel mislykkedes"
 
-#: ../IkiWiki/Plugin/graphviz.pm:143
+#: ../IkiWiki/Plugin/graphviz.pm:144
 msgid "prog not a valid graphviz program"
 msgstr "prog er ikke et gyldigt graphviz-program"
 
@@ -424,7 +433,7 @@ msgstr "tohighlight indeholder ukendt filtype '%s'"
 msgid "Source code: %s"
 msgstr "Kildekode: %s"
 
-#: ../IkiWiki/Plugin/highlight.pm:179
+#: ../IkiWiki/Plugin/highlight.pm:180
 msgid ""
 "warning: highlight perl module not available; falling back to pass through"
 msgstr ""
@@ -471,31 +480,31 @@ msgstr "sideredigering er ikke tilladt"
 msgid "missing pages parameter"
 msgstr "mangler pages-parametren"
 
-#: ../IkiWiki/Plugin/inline.pm:192
+#: ../IkiWiki/Plugin/inline.pm:209
 #, perl-format
 msgid "the %s and %s parameters cannot be used together"
 msgstr "parametrene %s og %s kan ikke anvendes sammen"
 
-#: ../IkiWiki/Plugin/inline.pm:297
+#: ../IkiWiki/Plugin/inline.pm:315
 #, perl-format
 msgid "%s (RSS feed)"
 msgstr "%s (RSS-fødning)"
 
-#: ../IkiWiki/Plugin/inline.pm:301
+#: ../IkiWiki/Plugin/inline.pm:319
 #, perl-format
 msgid "%s (Atom feed)"
 msgstr "%s (Atom-fødning)"
 
-#: ../IkiWiki/Plugin/inline.pm:330
+#: ../IkiWiki/Plugin/inline.pm:348
 msgid "Add a new post titled:"
 msgstr "Tilføj nyt indlæg med følgende titel:"
 
-#: ../IkiWiki/Plugin/inline.pm:369 ../IkiWiki/Plugin/template.pm:44
+#: ../IkiWiki/Plugin/inline.pm:387 ../IkiWiki/Plugin/template.pm:44
 #, perl-format
 msgid "failed to process template %s"
 msgstr "behandling af skabelon %s mislykkedes"
 
-#: ../IkiWiki/Plugin/inline.pm:695
+#: ../IkiWiki/Plugin/inline.pm:725
 msgid "RPC::XML::Client not found, not pinging"
 msgstr "RPC::XML::Client ikke fundet, pinger ikke"
 
@@ -513,43 +522,48 @@ msgstr "henvisningskort"
 msgid "%s is locked and cannot be edited"
 msgstr "%s er låst og kan ikke redigeres"
 
-#: ../IkiWiki/Plugin/mdwn.pm:45
+#: ../IkiWiki/Plugin/mdwn.pm:52
 msgid "multimarkdown is enabled, but Text::MultiMarkdown is not installed"
 msgstr ""
 "multimarkdown er aktiveret, men Text::MultiMarkdown er ikke installeret"
 
-#: ../IkiWiki/Plugin/mdwn.pm:70
+#: ../IkiWiki/Plugin/mdwn.pm:96
 #, 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:175
+#: ../IkiWiki/Plugin/meta.pm:127
+#, fuzzy
+msgid "enclosure not found"
+msgstr "fødning ikke fundet"
+
+#: ../IkiWiki/Plugin/meta.pm:187
 msgid "stylesheet not found"
 msgstr "stilsnit (stylesheet) ikke fundet"
 
-#: ../IkiWiki/Plugin/meta.pm:187
+#: ../IkiWiki/Plugin/meta.pm:199
 msgid "script not found"
 msgstr "skript ikke fundet"
 
-#: ../IkiWiki/Plugin/meta.pm:235
+#: ../IkiWiki/Plugin/meta.pm:247
 msgid "redir page not found"
 msgstr "henvisningsside ikke fundet"
 
-#: ../IkiWiki/Plugin/meta.pm:249
+#: ../IkiWiki/Plugin/meta.pm:261
 msgid "redir cycle is not allowed"
 msgstr "ring af henvisninger er ikke tilladt"
 
-#: ../IkiWiki/Plugin/meta.pm:427
+#: ../IkiWiki/Plugin/meta.pm:450
 msgid "sort=meta requires a parameter"
 msgstr "sort=meta kræver en parameter"
 
-#: ../IkiWiki/Plugin/mirrorlist.pm:44
+#: ../IkiWiki/Plugin/mirrorlist.pm:57
 msgid "Mirrors"
 msgstr "Spejle"
 
-#: ../IkiWiki/Plugin/mirrorlist.pm:44
+#: ../IkiWiki/Plugin/mirrorlist.pm:57
 msgid "Mirror"
 msgstr "Spejl"
 
@@ -561,6 +575,19 @@ msgstr "kommentar kræver moderering"
 msgid "more"
 msgstr "mere"
 
+#: ../IkiWiki/Plugin/notifyemail.pm:72
+msgid "Cannot subscribe your email address without logging in."
+msgstr ""
+
+#: ../IkiWiki/Plugin/notifyemail.pm:136
+msgid "change notification:"
+msgstr ""
+
+#: ../IkiWiki/Plugin/notifyemail.pm:138
+#, fuzzy
+msgid "comment notification:"
+msgstr "kommentarkoderering"
+
 #: ../IkiWiki/Plugin/openid.pm:71
 #, perl-format
 msgid "failed to load openid module: "
@@ -574,43 +601,52 @@ msgstr "Alle sider har henvisninger fra andre sider."
 msgid "bad or missing template"
 msgstr "dårlig eller manglende skabelon"
 
-#: ../IkiWiki/Plugin/passwordauth.pm:231
+#: ../IkiWiki/Plugin/passwordauth.pm:145 ../IkiWiki/Plugin/passwordauth.pm:337
+msgid "Error creating account."
+msgstr "Fejl ved kontooprettelse."
+
+#: ../IkiWiki/Plugin/passwordauth.pm:297
 msgid "Your user page: "
 msgstr "Din brugerside: "
 
-#: ../IkiWiki/Plugin/passwordauth.pm:238
+#: ../IkiWiki/Plugin/passwordauth.pm:304
 msgid "Create your user page"
 msgstr "Opret din brugerside"
 
-#: ../IkiWiki/Plugin/passwordauth.pm:268
+#: ../IkiWiki/Plugin/passwordauth.pm:334
 msgid "Account creation successful. Now you can Login."
 msgstr "Konto korrekt oprettet. Nu kan du logge på."
 
-#: ../IkiWiki/Plugin/passwordauth.pm:271
-msgid "Error creating account."
-msgstr "Fejl ved kontooprettelse."
-
-#: ../IkiWiki/Plugin/passwordauth.pm:278
+#: ../IkiWiki/Plugin/passwordauth.pm:344
 msgid "No email address, so cannot email password reset instructions."
 msgstr ""
 "Ingen emailadresse, så kan ikke sende adgangskodenulstillingsinstruktioner."
 
-#: ../IkiWiki/Plugin/passwordauth.pm:312
+#: ../IkiWiki/Plugin/passwordauth.pm:371
 msgid "Failed to send mail"
 msgstr "Afsendelse af mail mislykkedes"
 
-#: ../IkiWiki/Plugin/passwordauth.pm:314
+#: ../IkiWiki/Plugin/passwordauth.pm:373
 msgid "You have been mailed password reset instructions."
 msgstr "Du har fået tilsendt adgangskodenulstillingsinstruktioner."
 
-#: ../IkiWiki/Plugin/passwordauth.pm:349
+#: ../IkiWiki/Plugin/passwordauth.pm:408
 msgid "incorrect password reset url"
 msgstr "Ukorrekt adgangskodenumstillings-URL"
 
-#: ../IkiWiki/Plugin/passwordauth.pm:352
+#: ../IkiWiki/Plugin/passwordauth.pm:411
 msgid "password reset denied"
 msgstr "adgangskodenulstilling afvist"
 
+#: ../IkiWiki/Plugin/passwordauth.pm:424
+#, fuzzy
+msgid "incorrect url"
+msgstr "Ukorrekt adgangskodenumstillings-URL"
+
+#: ../IkiWiki/Plugin/passwordauth.pm:427
+msgid "access denied"
+msgstr ""
+
 #: ../IkiWiki/Plugin/pingee.pm:30
 msgid "Ping received."
 msgstr "Ping modtaget."
@@ -637,12 +673,12 @@ msgstr "LWP ikke fundet, pinger ikke"
 msgid "warning: Old po4a detected! Recommend upgrade to 0.35."
 msgstr "advarsel: Gammel po4a detekteret. Anbefaler opgradering til 0.35."
 
-#: ../IkiWiki/Plugin/po.pm:180
+#: ../IkiWiki/Plugin/po.pm:179
 #, perl-format
 msgid "%s is not a valid language code"
 msgstr "%s er ikke en gyldig sprogkode"
 
-#: ../IkiWiki/Plugin/po.pm:192
+#: ../IkiWiki/Plugin/po.pm:191
 #, perl-format
 msgid ""
 "%s is not a valid value for po_link_to, falling back to po_link_to=default"
@@ -650,7 +686,7 @@ msgstr ""
 "%s er ikke en gyldig værdi for po_link_to, falder tilbage til "
 "po_link_to=default"
 
-#: ../IkiWiki/Plugin/po.pm:197
+#: ../IkiWiki/Plugin/po.pm:196
 msgid ""
 "po_link_to=negotiated requires usedirs to be enabled, falling back to "
 "po_link_to=default"
@@ -658,11 +694,11 @@ msgstr ""
 "po_link_to=negotiated kræver at usedirs er aktiveret, falder tilbage til "
 "po_link_to=default"
 
-#: ../IkiWiki/Plugin/po.pm:468
+#: ../IkiWiki/Plugin/po.pm:467
 msgid "updated PO files"
 msgstr "opdaterer PO-filer"
 
-#: ../IkiWiki/Plugin/po.pm:491
+#: ../IkiWiki/Plugin/po.pm:490
 msgid ""
 "Can not remove a translation. If the master page is removed, however, its "
 "translations will be removed as well."
@@ -670,7 +706,7 @@ msgstr ""
 "Kan ikke fjerne en oversættelse. Fjern i stedet hovedsiden, så fjernes dens "
 "oversættelser også."
 
-#: ../IkiWiki/Plugin/po.pm:511
+#: ../IkiWiki/Plugin/po.pm:510
 msgid ""
 "Can not rename a translation. If the master page is renamed, however, its "
 "translations will be renamed as well."
@@ -678,64 +714,68 @@ msgstr ""
 "Kan ikke omdøbe en oversættelse. Omdøb i stedet hovedsiden, så omdøbes dens "
 "oversættelser også."
 
-#: ../IkiWiki/Plugin/po.pm:957
+#: ../IkiWiki/Plugin/po.pm:956
 #, perl-format
 msgid "POT file (%s) does not exist"
 msgstr "POT-filen %s eksisterer ikke"
 
-#: ../IkiWiki/Plugin/po.pm:971
+#: ../IkiWiki/Plugin/po.pm:970
 #, perl-format
 msgid "failed to copy underlay PO file to %s"
 msgstr "kopiering af underlags-PO-fil til %s mislykkedes"
 
-#: ../IkiWiki/Plugin/po.pm:980
+#: ../IkiWiki/Plugin/po.pm:979
 #, perl-format
 msgid "failed to update %s"
 msgstr "opdatering af %s mislykkedes"
 
-#: ../IkiWiki/Plugin/po.pm:986
+#: ../IkiWiki/Plugin/po.pm:985
 #, perl-format
 msgid "failed to copy the POT file to %s"
 msgstr "kopiering af POT-filen til %s mislykkedes"
 
-#: ../IkiWiki/Plugin/po.pm:1022
+#: ../IkiWiki/Plugin/po.pm:1021
 msgid "N/A"
 msgstr "N/A"
 
-#: ../IkiWiki/Plugin/po.pm:1033
+#: ../IkiWiki/Plugin/po.pm:1032
 #, perl-format
 msgid "failed to translate %s"
 msgstr "oversættelse af %s mislykkedes"
 
-#: ../IkiWiki/Plugin/po.pm:1112
+#: ../IkiWiki/Plugin/po.pm:1111
 msgid "removed obsolete PO files"
 msgstr "forældede PO filer fjernet"
 
-#: ../IkiWiki/Plugin/po.pm:1169 ../IkiWiki/Plugin/po.pm:1181
-#: ../IkiWiki/Plugin/po.pm:1220
+#: ../IkiWiki/Plugin/po.pm:1168 ../IkiWiki/Plugin/po.pm:1180
+#: ../IkiWiki/Plugin/po.pm:1219
 #, perl-format
 msgid "failed to write %s"
 msgstr "skrivning af %s mislykkedes"
 
-#: ../IkiWiki/Plugin/po.pm:1179
+#: ../IkiWiki/Plugin/po.pm:1178
 msgid "failed to translate"
 msgstr "oversættelse mislykkedes"
 
-#: ../IkiWiki/Plugin/po.pm:1232
+#: ../IkiWiki/Plugin/po.pm:1231
 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/po.pm:1275
+#: ../IkiWiki/Plugin/po.pm:1274
 #, perl-format
 msgid "%s has invalid syntax: must use CODE|NAME"
 msgstr "%s har forkert syntaks: skal bruge CODE|NAME"
 
-#: ../IkiWiki/Plugin/poll.pm:70
+#: ../IkiWiki/Plugin/poll.pm:72 ../IkiWiki/Plugin/poll.pm:87
 msgid "vote"
 msgstr "stem"
 
-#: ../IkiWiki/Plugin/poll.pm:78
+#: ../IkiWiki/Plugin/poll.pm:86
+msgid "Write in"
+msgstr ""
+
+#: ../IkiWiki/Plugin/poll.pm:93
 msgid "Total votes:"
 msgstr "Samlede stemmer:"
 
@@ -838,35 +878,35 @@ msgstr "Dette tilbagefører indlæg %s"
 msgid "confirm reversion of %s"
 msgstr "bekræft tilbageføring af %s"
 
-#: ../IkiWiki/Plugin/recentchangesdiff.pm:36
+#: ../IkiWiki/Plugin/recentchangesdiff.pm:49
 msgid "(Diff truncated)"
 msgstr "(Diff trunkeret)"
 
-#: ../IkiWiki/Plugin/remove.pm:32 ../IkiWiki/Plugin/rename.pm:37
+#: ../IkiWiki/Plugin/remove.pm:39 ../IkiWiki/Plugin/rename.pm:37
 #, perl-format
 msgid "%s does not exist"
 msgstr "%s eksisterer ikke"
 
-#: ../IkiWiki/Plugin/remove.pm:39
+#: ../IkiWiki/Plugin/remove.pm:56
 #, 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:42 ../IkiWiki/Plugin/rename.pm:46
+#: ../IkiWiki/Plugin/remove.pm:59 ../IkiWiki/Plugin/rename.pm:46
 #, perl-format
 msgid "%s is not a file"
 msgstr "%s er ikke en fil"
 
-#: ../IkiWiki/Plugin/remove.pm:149
+#: ../IkiWiki/Plugin/remove.pm:166
 #, perl-format
 msgid "confirm removal of %s"
 msgstr "bekræft at %s bliver fjernet"
 
-#: ../IkiWiki/Plugin/remove.pm:186
+#: ../IkiWiki/Plugin/remove.pm:203
 msgid "Please select the attachments to remove."
 msgstr "Vælg vedhæftning der skal slettes."
 
-#: ../IkiWiki/Plugin/remove.pm:230
+#: ../IkiWiki/Plugin/remove.pm:263
 msgid "removed"
 msgstr "fjernet"
 
@@ -903,20 +943,20 @@ msgstr "omdøb %s"
 msgid "Also rename SubPages and attachments"
 msgstr "Omdøb også UnderSider og vedhæftninger"
 
-#: ../IkiWiki/Plugin/rename.pm:258
+#: ../IkiWiki/Plugin/rename.pm:266
 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:261
+#: ../IkiWiki/Plugin/rename.pm:269
 msgid "Please select the attachment to rename."
 msgstr "Vælg vedhæftningen som skal omdøbes."
 
-#: ../IkiWiki/Plugin/rename.pm:371
+#: ../IkiWiki/Plugin/rename.pm:379
 #, perl-format
 msgid "rename %s to %s"
 msgstr "omdøb %s til %s"
 
-#: ../IkiWiki/Plugin/rename.pm:597
+#: ../IkiWiki/Plugin/rename.pm:605
 #, perl-format
 msgid "update for rename of %s to %s"
 msgstr "opdatering til omdøbning af %s til %s"
@@ -1036,6 +1076,11 @@ msgstr "manglende tex-kode"
 msgid "failed to generate image from code"
 msgstr "billedopbygning fra kode mislykkedes"
 
+#: ../IkiWiki/Plugin/trail.pm:393
+#, perl-format
+msgid "building %s, its previous or next page has changed"
+msgstr ""
+
 #: ../IkiWiki/Plugin/transient.pm:45
 #, perl-format
 msgid "removing transient version of %s"
@@ -1107,7 +1152,7 @@ msgstr "kan ikke afgøre id for ikke-tillidsfulde skribent %s"
 msgid "scanning %s"
 msgstr "gennemlæser %s"
 
-#: ../IkiWiki/Render.pm:280
+#: ../IkiWiki/Render.pm:281
 #, perl-format
 msgid ""
 "symlink found in srcdir path (%s) -- set allow_symlinks_before_srcdir to "
@@ -1116,52 +1161,52 @@ msgstr ""
 "symbolsk lænke fundet i srcdir-sti (%s) -- sæt allow_symlinks_before_srcdir "
 "for at tillade dette"
 
-#: ../IkiWiki/Render.pm:316
+#: ../IkiWiki/Render.pm:317
 #, perl-format
 msgid "skipping bad filename %s"
 msgstr "udelader forkert filnavn %s"
 
-#: ../IkiWiki/Render.pm:332
+#: ../IkiWiki/Render.pm:333
 #, perl-format
 msgid "%s has multiple possible source pages"
 msgstr "%s har flere mulige kildesider"
 
-#: ../IkiWiki/Render.pm:372
+#: ../IkiWiki/Render.pm:373
 #, perl-format
 msgid "querying %s for file creation and modification times.."
 msgstr "anmoder %s om oprettelses- og redigeringstider for fil.."
 
-#: ../IkiWiki/Render.pm:446
+#: ../IkiWiki/Render.pm:447
 #, perl-format
 msgid "removing obsolete %s"
 msgstr "fjerner forældet %s"
 
-#: ../IkiWiki/Render.pm:530
+#: ../IkiWiki/Render.pm:531
 #, perl-format
 msgid "building %s, which links to %s"
 msgstr "danner %s, som henviser til %s"
 
-#: ../IkiWiki/Render.pm:539
+#: ../IkiWiki/Render.pm:540
 #, perl-format
 msgid "removing %s, no longer built by %s"
 msgstr "fjerner %s, ikke længere dannet af %s"
 
-#: ../IkiWiki/Render.pm:622 ../IkiWiki/Render.pm:704
+#: ../IkiWiki/Render.pm:623 ../IkiWiki/Render.pm:705
 #, perl-format
 msgid "building %s, which depends on %s"
 msgstr "danner %s, som afhænger af %s"
 
-#: ../IkiWiki/Render.pm:717
+#: ../IkiWiki/Render.pm:718
 #, perl-format
 msgid "building %s, to update its backlinks"
 msgstr "danner %s, for at opdatere dens krydshenvisninger (backlinks)"
 
-#: ../IkiWiki/Render.pm:797
+#: ../IkiWiki/Render.pm:806
 #, perl-format
 msgid "building %s"
 msgstr "danner %s"
 
-#: ../IkiWiki/Render.pm:849
+#: ../IkiWiki/Render.pm:871
 #, perl-format
 msgid "ikiwiki: cannot build %s"
 msgstr "ikiwiki: kan ikke danne %s"
@@ -1205,27 +1250,31 @@ msgstr "** Deaktiverer udvidelse %s, da den fejler med denne besked:"
 msgid "generating wrappers.."
 msgstr "bygger wrappers.."
 
-#: ../IkiWiki/Wrapper.pm:36
+#: ../IkiWiki/Wrapper.pm:37
 #, perl-format
 msgid "%s doesn't seem to be executable"
 msgstr "%s ser ikke ud til at kunne afvikles"
 
-#: ../IkiWiki/Wrapper.pm:40
+#: ../IkiWiki/Wrapper.pm:41
 msgid "cannot create a wrapper that uses a setup file"
 msgstr "kan ikke oprette en wrapper som bruger en opsætningsfil"
 
-#: ../IkiWiki/Wrapper.pm:44
+#: ../IkiWiki/Wrapper.pm:45
 msgid "wrapper filename not specified"
 msgstr "wrapper-navn ikke angivet"
 
+#: ../IkiWiki/Wrapper.pm:109
+msgid "Please wait"
+msgstr ""
+
 #. translators: The parameter is a C filename.
-#: ../IkiWiki/Wrapper.pm:220
+#: ../IkiWiki/Wrapper.pm:268
 #, perl-format
 msgid "failed to compile %s"
 msgstr "kompilering af %s mislykkedes"
 
 #. translators: The parameter is a filename.
-#: ../IkiWiki/Wrapper.pm:240
+#: ../IkiWiki/Wrapper.pm:288
 #, perl-format
 msgid "successfully generated %s"
 msgstr "Korrekt bygget %s"
@@ -1246,67 +1295,67 @@ msgstr "brug: --set var=værdi"
 msgid "usage: --set-yaml var=value"
 msgstr "brug: --set-yaml var=værdi"
 
-#: ../ikiwiki.in:216
+#: ../ikiwiki.in:214
 msgid "rebuilding wiki.."
 msgstr "genopbygger wiki..."
 
-#: ../ikiwiki.in:219
+#: ../ikiwiki.in:217
 msgid "refreshing wiki.."
 msgstr "genopfrisker wiki..."
 
-#: ../IkiWiki.pm:232
+#: ../IkiWiki.pm:248
 msgid "Discussion"
 msgstr "Diskussion"
 
-#: ../IkiWiki.pm:557
+#: ../IkiWiki.pm:580
 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:605
+#: ../IkiWiki.pm:628
 #, fuzzy, perl-format
 msgid "unsupported umask setting %s"
 msgstr "Ikke-understøttet sideformat %s"
 
-#: ../IkiWiki.pm:645
+#: ../IkiWiki.pm:668
 msgid "cannot use multiple rcs plugins"
 msgstr "kan ikke bruge flere samtidige RCS-udvidelser"
 
-#: ../IkiWiki.pm:675
+#: ../IkiWiki.pm:698
 #, 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:1452
+#: ../IkiWiki.pm:1490
 #, perl-format
 msgid "preprocessing loop detected on %s at depth %i"
 msgstr "forudberegningssløkke fundet på %s ved dybde %i"
 
-#: ../IkiWiki.pm:1646
+#: ../IkiWiki.pm:1684
 #, perl-format
 msgid "bad file name %s"
 msgstr "dårligt filnavn %s"
 
-#: ../IkiWiki.pm:1946
+#: ../IkiWiki.pm:1984
 #, perl-format
 msgid "template %s not found"
 msgstr "skabelon %s ikke fundet"
 
-#: ../IkiWiki.pm:2196
+#: ../IkiWiki.pm:2234
 msgid "yes"
 msgstr "ja"
 
-#: ../IkiWiki.pm:2273
+#: ../IkiWiki.pm:2318
 #, perl-format
 msgid "invalid sort type %s"
 msgstr "forkert sorteringstype %s"
 
-#: ../IkiWiki.pm:2294
+#: ../IkiWiki.pm:2339
 #, perl-format
 msgid "unknown sort type %s"
 msgstr "ukendt sorteringsform %s"
 
-#: ../IkiWiki.pm:2430
+#: ../IkiWiki.pm:2475
 #, perl-format
 msgid "cannot match pages: %s"
 msgstr "kan ikke få sider til at passe sammen: %s"
index 9cc9e388b478c745a3fe6bc2bdea2ca3bf16536b..9cc63ccfffb28eeb81cf044ec1a389aa117e48bc 100644 (file)
--- a/po/de.po
+++ b/po/de.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: ikiwiki 3.14159\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-11-30 16:33-0400\n"
+"POT-Creation-Date: 2013-09-04 10:16-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"
@@ -53,84 +53,84 @@ msgstr "Einstellungen gespeichert."
 msgid "You are banned."
 msgstr "Sie sind ausgeschlossen worden."
 
-#: ../IkiWiki/CGI.pm:464 ../IkiWiki/CGI.pm:465 ../IkiWiki.pm:1470
+#: ../IkiWiki/CGI.pm:464 ../IkiWiki/CGI.pm:465 ../IkiWiki.pm:1508
 msgid "Error"
 msgstr "Fehler"
 
-#: ../IkiWiki/Plugin/aggregate.pm:95
+#: ../IkiWiki/Plugin/aggregate.pm:86
 msgid "Aggregation triggered via web."
 msgstr "Das Web löst die Zusammenstellung aus"
 
-#: ../IkiWiki/Plugin/aggregate.pm:104
+#: ../IkiWiki/Plugin/aggregate.pm:95
 msgid "Nothing to do right now, all feeds are up-to-date!"
 msgstr "Es gibt nichts zu tun, alle Vorlagen (feeds) sind aktuell!"
 
-#: ../IkiWiki/Plugin/aggregate.pm:237
+#: ../IkiWiki/Plugin/aggregate.pm:227
 #, perl-format
 msgid "missing %s parameter"
 msgstr "Parameter %s fehlt"
 
-#: ../IkiWiki/Plugin/aggregate.pm:272
+#: ../IkiWiki/Plugin/aggregate.pm:262
 msgid "new feed"
 msgstr "neue Vorlage (feed)"
 
-#: ../IkiWiki/Plugin/aggregate.pm:286
+#: ../IkiWiki/Plugin/aggregate.pm:276
 msgid "posts"
 msgstr "Beiträge"
 
-#: ../IkiWiki/Plugin/aggregate.pm:288
+#: ../IkiWiki/Plugin/aggregate.pm:278
 msgid "new"
 msgstr "neu"
 
-#: ../IkiWiki/Plugin/aggregate.pm:475
+#: ../IkiWiki/Plugin/aggregate.pm:465
 #, perl-format
 msgid "expiring %s (%s days old)"
 msgstr "%s läuft aus (%s Tage alt)"
 
-#: ../IkiWiki/Plugin/aggregate.pm:482
+#: ../IkiWiki/Plugin/aggregate.pm:472
 #, perl-format
 msgid "expiring %s"
 msgstr "%s läuft aus"
 
-#: ../IkiWiki/Plugin/aggregate.pm:510
+#: ../IkiWiki/Plugin/aggregate.pm:500
 #, perl-format
 msgid "last checked %s"
 msgstr "zuletzt geprüft %s"
 
-#: ../IkiWiki/Plugin/aggregate.pm:514
+#: ../IkiWiki/Plugin/aggregate.pm:504
 #, perl-format
 msgid "checking feed %s ..."
 msgstr "überprüfe Vorlage (feed) %s ..."
 
-#: ../IkiWiki/Plugin/aggregate.pm:519
+#: ../IkiWiki/Plugin/aggregate.pm:509
 #, perl-format
 msgid "could not find feed at %s"
 msgstr "konnte Vorlage (feed) unter %s nicht finden"
 
-#: ../IkiWiki/Plugin/aggregate.pm:542
+#: ../IkiWiki/Plugin/aggregate.pm:529
 msgid "feed not found"
 msgstr "Vorlage (feed) nicht gefunden"
 
-#: ../IkiWiki/Plugin/aggregate.pm:553
+#: ../IkiWiki/Plugin/aggregate.pm:540
 #, perl-format
 msgid "(invalid UTF-8 stripped from feed)"
 msgstr "(ungültiges UTF-8 wurde aus der Vorlage (feed) entfernt)"
 
-#: ../IkiWiki/Plugin/aggregate.pm:561
+#: ../IkiWiki/Plugin/aggregate.pm:548
 #, perl-format
 msgid "(feed entities escaped)"
 msgstr "(Einträge in der Vorlage (feed) wurden maskiert)"
 
-#: ../IkiWiki/Plugin/aggregate.pm:569
+#: ../IkiWiki/Plugin/aggregate.pm:556
 msgid "feed crashed XML::Feed!"
 msgstr "Vorlage (feed) führte zum Absturz von XML::Feed!"
 
-#: ../IkiWiki/Plugin/aggregate.pm:661
+#: ../IkiWiki/Plugin/aggregate.pm:649
 #, perl-format
 msgid "creating new page %s"
 msgstr "erstelle neue Seite %s"
 
-#: ../IkiWiki/Plugin/aggregate.pm:689 ../IkiWiki/Plugin/edittemplate.pm:135
+#: ../IkiWiki/Plugin/aggregate.pm:677 ../IkiWiki/Plugin/edittemplate.pm:135
 #, fuzzy
 msgid "failed to process template:"
 msgstr "Fehler beim Ablauf:"
@@ -139,7 +139,7 @@ msgstr "Fehler beim Ablauf:"
 msgid "deleting bucket.."
 msgstr "lösche Behälter (bucket)..."
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:227
+#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:225
 msgid "done"
 msgstr "fertig"
 
@@ -157,7 +157,7 @@ msgstr "Konnte Behälter (bucket) in S3 nicht anlegen: "
 msgid "Failed to save file to S3: "
 msgstr "Konnte die Datei nicht in S3 speichern: "
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:247
+#: ../IkiWiki/Plugin/amazon_s3.pm:248
 msgid "Failed to delete file from S3: "
 msgstr "Konnte die Datei nicht in S3 löschen: "
 
@@ -174,16 +174,16 @@ msgstr "durch allowed_attachements verboten"
 msgid "bad attachment filename"
 msgstr "fehlerhafter Dateiname für Anhang"
 
-#: ../IkiWiki/Plugin/attachment.pm:295
+#: ../IkiWiki/Plugin/attachment.pm:296
 msgid "attachment upload"
 msgstr "Anhang hochladen"
 
-#: ../IkiWiki/Plugin/attachment.pm:346
+#: ../IkiWiki/Plugin/attachment.pm:347
 #, fuzzy
 msgid "this attachment is not yet saved"
 msgstr "Seite %s ist ein Anhang und keine Seite."
 
-#: ../IkiWiki/Plugin/attachment.pm:363
+#: ../IkiWiki/Plugin/attachment.pm:365
 msgid "just uploaded"
 msgstr ""
 
@@ -192,7 +192,7 @@ msgstr ""
 msgid "creating index page %s"
 msgstr "erstelle neue Seite %s"
 
-#: ../IkiWiki/Plugin/blogspam.pm:118
+#: ../IkiWiki/Plugin/blogspam.pm:119
 msgid ""
 "Sorry, but that looks like spam to <a href=\"http://blogspam.net/"
 "\">blogspam</a>: "
@@ -209,86 +209,90 @@ msgstr "%s von %s"
 msgid "There are no broken links!"
 msgstr "Es gibt keine ungültigen Verweise!"
 
-#: ../IkiWiki/Plugin/comments.pm:114
+#: ../IkiWiki/Plugin/comments.pm:124
 #, fuzzy, perl-format
 msgid "this comment needs %s"
 msgstr "kommentiere %s"
 
-#: ../IkiWiki/Plugin/comments.pm:117
+#: ../IkiWiki/Plugin/comments.pm:127
 #, fuzzy
 msgid "moderation"
 msgstr "Kommentar-Moderation"
 
-#: ../IkiWiki/Plugin/comments.pm:138 ../IkiWiki/Plugin/format.pm:50
+#: ../IkiWiki/Plugin/comments.pm:154 ../IkiWiki/Plugin/format.pm:50
 #, perl-format
 msgid "unsupported page format %s"
 msgstr "nicht unterstütztes Seitenformat %s"
 
-#: ../IkiWiki/Plugin/comments.pm:143
+#: ../IkiWiki/Plugin/comments.pm:159
 msgid "comment must have content"
 msgstr "ein Kommentar sollte Inhalt haben"
 
-#: ../IkiWiki/Plugin/comments.pm:201
+#: ../IkiWiki/Plugin/comments.pm:217
 msgid "Anonymous"
 msgstr "Anonym"
 
-#: ../IkiWiki/Plugin/comments.pm:263
+#: ../IkiWiki/Plugin/comments.pm:279
 #, fuzzy
 msgid "Comment Moderation"
 msgstr "Kommentar-Moderation"
 
-#: ../IkiWiki/Plugin/comments.pm:379 ../IkiWiki/Plugin/editpage.pm:95
-#: ../IkiWiki/Plugin/editpage.pm:101
+#: ../IkiWiki/Plugin/comments.pm:375 ../IkiWiki/Plugin/comments.pm:379
+msgid "email replies to me"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:413 ../IkiWiki/Plugin/editpage.pm:96
+#: ../IkiWiki/Plugin/editpage.pm:102
 msgid "bad page name"
 msgstr "fehlerhafter Seitenname"
 
-#: ../IkiWiki/Plugin/comments.pm:382
+#: ../IkiWiki/Plugin/comments.pm:416
 #, perl-format
 msgid "commenting on %s"
 msgstr "kommentiere %s"
 
-#: ../IkiWiki/Plugin/comments.pm:399
+#: ../IkiWiki/Plugin/comments.pm:433
 #, 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:406
+#: ../IkiWiki/Plugin/comments.pm:440
 #, perl-format
 msgid "comments on page '%s' are closed"
 msgstr "Kommentare zur Seite %s sind gesperrt"
 
-#: ../IkiWiki/Plugin/comments.pm:520
+#: ../IkiWiki/Plugin/comments.pm:565
 msgid "comment stored for moderation"
 msgstr "Der Kommentar wurde zur Moderation gespeichert"
 
-#: ../IkiWiki/Plugin/comments.pm:522
+#: ../IkiWiki/Plugin/comments.pm:567
 msgid "Your comment will be posted after moderator review"
 msgstr "Ihr Kommentar wird nach Moderation verschickt"
 
-#: ../IkiWiki/Plugin/comments.pm:535
+#: ../IkiWiki/Plugin/comments.pm:580
 msgid "Added a comment"
 msgstr "Kommentar hinzugefügt"
 
-#: ../IkiWiki/Plugin/comments.pm:539
+#: ../IkiWiki/Plugin/comments.pm:584
 #, perl-format
 msgid "Added a comment: %s"
 msgstr "Kommentar hinzugefügt: %s"
 
-#: ../IkiWiki/Plugin/comments.pm:608 ../IkiWiki/Plugin/userlist.pm:55
+#: ../IkiWiki/Plugin/comments.pm:654 ../IkiWiki/Plugin/userlist.pm:55
 #: ../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:660
+#: ../IkiWiki/Plugin/comments.pm:708
 msgid "Comment moderation"
 msgstr "Kommentar-Moderation"
 
-#: ../IkiWiki/Plugin/comments.pm:701
+#: ../IkiWiki/Plugin/comments.pm:749
 msgid "comment moderation"
 msgstr "Kommentar-Moderation"
 
-#: ../IkiWiki/Plugin/comments.pm:862
+#: ../IkiWiki/Plugin/comments.pm:910
 #, perl-format
 msgid "%i comment"
 msgid_plural "%i comments"
@@ -298,11 +302,11 @@ 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:872
+#: ../IkiWiki/Plugin/comments.pm:920
 msgid "Comment"
 msgstr "Kommentieren"
 
-#: ../IkiWiki/Plugin/conditional.pm:28 ../IkiWiki/Plugin/cutpaste.pm:46
+#: ../IkiWiki/Plugin/conditional.pm:27 ../IkiWiki/Plugin/cutpaste.pm:46
 #: ../IkiWiki/Plugin/cutpaste.pm:60 ../IkiWiki/Plugin/cutpaste.pm:75
 #: ../IkiWiki/Plugin/testpagespec.pm:26
 #, perl-format
@@ -323,19 +327,24 @@ msgstr "es wurde kein Text in diese Seite mit der id %s kopiert"
 msgid "removing old preview %s"
 msgstr "entferne alte Vorschau %s"
 
-#: ../IkiWiki/Plugin/editpage.pm:117
+#: ../IkiWiki/Plugin/editpage.pm:118
 #, perl-format
 msgid "%s is not an editable page"
 msgstr "Seite %s kann nicht bearbeitet werden"
 
-#: ../IkiWiki/Plugin/editpage.pm:307
+#: ../IkiWiki/Plugin/editpage.pm:166
+#, fuzzy
+msgid "email comments to me"
+msgstr "%i Kommentar"
+
+#: ../IkiWiki/Plugin/editpage.pm:319
 #, perl-format
 msgid "creating %s"
 msgstr "erstelle %s"
 
-#: ../IkiWiki/Plugin/editpage.pm:325 ../IkiWiki/Plugin/editpage.pm:344
-#: ../IkiWiki/Plugin/editpage.pm:355 ../IkiWiki/Plugin/editpage.pm:400
-#: ../IkiWiki/Plugin/editpage.pm:442
+#: ../IkiWiki/Plugin/editpage.pm:337 ../IkiWiki/Plugin/editpage.pm:356
+#: ../IkiWiki/Plugin/editpage.pm:367 ../IkiWiki/Plugin/editpage.pm:412
+#: ../IkiWiki/Plugin/editpage.pm:454
 #, perl-format
 msgid "editing %s"
 msgstr "bearbeite %s"
@@ -379,27 +388,27 @@ msgstr "Keine Seite"
 msgid "%s is an attachment, not a page."
 msgstr "Seite %s ist ein Anhang und keine Seite."
 
-#: ../IkiWiki/Plugin/git.pm:777 ../IkiWiki/Plugin/git.pm:840
-#: ../IkiWiki.pm:1690
+#: ../IkiWiki/Plugin/git.pm:789 ../IkiWiki/Plugin/git.pm:852
+#: ../IkiWiki.pm:1728
 #, perl-format
 msgid "you are not allowed to change %s"
 msgstr "Sie dürfen %s nicht verändern"
 
-#: ../IkiWiki/Plugin/git.pm:799
+#: ../IkiWiki/Plugin/git.pm:811
 #, 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:803
+#: ../IkiWiki/Plugin/git.pm:815
 msgid "you are not allowed to change file modes"
 msgstr "Sie dürfen die Zugriffsrechte der Datei nicht ändern"
 
-#: ../IkiWiki/Plugin/git.pm:873
+#: ../IkiWiki/Plugin/git.pm:885
 #, fuzzy
 msgid "you are not allowed to revert a merge"
 msgstr "Sie dürfen %s nicht verändern"
 
-#: ../IkiWiki/Plugin/git.pm:892
+#: ../IkiWiki/Plugin/git.pm:902
 #, fuzzy, perl-format
 msgid "Failed to revert commit %s"
 msgstr "erzeugen von %s fehlgeschlagen"
@@ -413,7 +422,7 @@ msgstr "%s muss angegeben werden, wenn die %s Erweiterung verwandt wird"
 msgid "failed to run graphviz"
 msgstr "graphviz konnte nicht ausgeführt werden"
 
-#: ../IkiWiki/Plugin/graphviz.pm:143
+#: ../IkiWiki/Plugin/graphviz.pm:144
 msgid "prog not a valid graphviz program"
 msgstr "prog ist kein gültiges graphviz-Programm"
 
@@ -427,7 +436,7 @@ msgstr "tohighlight enteilt unbekannten Dateityp '%s'"
 msgid "Source code: %s"
 msgstr "Quellcode: %s"
 
-#: ../IkiWiki/Plugin/highlight.pm:179
+#: ../IkiWiki/Plugin/highlight.pm:180
 msgid ""
 "warning: highlight perl module not available; falling back to pass through"
 msgstr ""
@@ -476,31 +485,31 @@ msgstr "bearbeiten der Seiten nicht erlaubt"
 msgid "missing pages parameter"
 msgstr "fehlender Seitenparameter"
 
-#: ../IkiWiki/Plugin/inline.pm:192
+#: ../IkiWiki/Plugin/inline.pm:209
 #, perl-format
 msgid "the %s and %s parameters cannot be used together"
 msgstr "die Parameter %s und %s können nicht zusammen benutzt werden"
 
-#: ../IkiWiki/Plugin/inline.pm:297
+#: ../IkiWiki/Plugin/inline.pm:315
 #, perl-format
 msgid "%s (RSS feed)"
 msgstr ""
 
-#: ../IkiWiki/Plugin/inline.pm:301
+#: ../IkiWiki/Plugin/inline.pm:319
 #, perl-format
 msgid "%s (Atom feed)"
 msgstr ""
 
-#: ../IkiWiki/Plugin/inline.pm:330
+#: ../IkiWiki/Plugin/inline.pm:348
 msgid "Add a new post titled:"
 msgstr "Füge einen neuen Beitrag hinzu. Titel:"
 
-#: ../IkiWiki/Plugin/inline.pm:369 ../IkiWiki/Plugin/template.pm:44
+#: ../IkiWiki/Plugin/inline.pm:387 ../IkiWiki/Plugin/template.pm:44
 #, fuzzy, perl-format
 msgid "failed to process template %s"
 msgstr "Fehler beim Ablauf:"
 
-#: ../IkiWiki/Plugin/inline.pm:695
+#: ../IkiWiki/Plugin/inline.pm:725
 msgid "RPC::XML::Client not found, not pinging"
 msgstr "RPC::XML::Client nicht gefunden, führe Ping nicht aus"
 
@@ -518,46 +527,51 @@ msgstr "Verknüpfungskarte"
 msgid "%s is locked and cannot be edited"
 msgstr "%s ist gesperrt und kann nicht bearbeitet werden"
 
-#: ../IkiWiki/Plugin/mdwn.pm:45
+#: ../IkiWiki/Plugin/mdwn.pm:52
 msgid "multimarkdown is enabled, but Text::MultiMarkdown is not installed"
 msgstr ""
 "multimarkdown ist eingeschaltet, aber Text::MultiMarkdown ist nicht "
 "installiert"
 
-#: ../IkiWiki/Plugin/mdwn.pm:70
+#: ../IkiWiki/Plugin/mdwn.pm:96
 #, 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:175
+#: ../IkiWiki/Plugin/meta.pm:127
+#, fuzzy
+msgid "enclosure not found"
+msgstr "Vorlage (feed) nicht gefunden"
+
+#: ../IkiWiki/Plugin/meta.pm:187
 msgid "stylesheet not found"
 msgstr "Stylesheet nicht gefunden"
 
-#: ../IkiWiki/Plugin/meta.pm:187
+#: ../IkiWiki/Plugin/meta.pm:199
 #, fuzzy
 msgid "script not found"
 msgstr "Vorlage (feed) nicht gefunden"
 
-#: ../IkiWiki/Plugin/meta.pm:235
+#: ../IkiWiki/Plugin/meta.pm:247
 msgid "redir page not found"
 msgstr "Umleitungsseite nicht gefunden"
 
-#: ../IkiWiki/Plugin/meta.pm:249
+#: ../IkiWiki/Plugin/meta.pm:261
 msgid "redir cycle is not allowed"
 msgstr "Zyklische Umleitungen sind nicht erlaubt"
 
-#: ../IkiWiki/Plugin/meta.pm:427
+#: ../IkiWiki/Plugin/meta.pm:450
 #, fuzzy
 msgid "sort=meta requires a parameter"
 msgstr "erfordert die Parameter 'from' und 'to'"
 
-#: ../IkiWiki/Plugin/mirrorlist.pm:44
+#: ../IkiWiki/Plugin/mirrorlist.pm:57
 msgid "Mirrors"
 msgstr "Spiegel"
 
-#: ../IkiWiki/Plugin/mirrorlist.pm:44
+#: ../IkiWiki/Plugin/mirrorlist.pm:57
 msgid "Mirror"
 msgstr "Spiegel"
 
@@ -569,6 +583,19 @@ msgstr "Kommentar muss moderiert werden"
 msgid "more"
 msgstr "mehr"
 
+#: ../IkiWiki/Plugin/notifyemail.pm:72
+msgid "Cannot subscribe your email address without logging in."
+msgstr ""
+
+#: ../IkiWiki/Plugin/notifyemail.pm:136
+msgid "change notification:"
+msgstr ""
+
+#: ../IkiWiki/Plugin/notifyemail.pm:138
+#, fuzzy
+msgid "comment notification:"
+msgstr "Kommentar-Moderation"
+
 #: ../IkiWiki/Plugin/openid.pm:71
 #, fuzzy, perl-format
 msgid "failed to load openid module: "
@@ -582,44 +609,53 @@ msgstr "Alle Seiten haben mindestens einen Verweis von einer anderen Seite."
 msgid "bad or missing template"
 msgstr "fehlerhafte oder fehlende Vorlage"
 
-#: ../IkiWiki/Plugin/passwordauth.pm:231
+#: ../IkiWiki/Plugin/passwordauth.pm:145 ../IkiWiki/Plugin/passwordauth.pm:337
+msgid "Error creating account."
+msgstr "Konto konnte nicht erstellt werden."
+
+#: ../IkiWiki/Plugin/passwordauth.pm:297
 msgid "Your user page: "
 msgstr "Ihre Benutzerseite: "
 
-#: ../IkiWiki/Plugin/passwordauth.pm:238
+#: ../IkiWiki/Plugin/passwordauth.pm:304
 msgid "Create your user page"
 msgstr "Benutzerseite erstellen"
 
-#: ../IkiWiki/Plugin/passwordauth.pm:268
+#: ../IkiWiki/Plugin/passwordauth.pm:334
 msgid "Account creation successful. Now you can Login."
 msgstr "Kontoerstellung erfolgreich. Sie können sich jetzt anmelden."
 
-#: ../IkiWiki/Plugin/passwordauth.pm:271
-msgid "Error creating account."
-msgstr "Konto konnte nicht erstellt werden."
-
-#: ../IkiWiki/Plugin/passwordauth.pm:278
+#: ../IkiWiki/Plugin/passwordauth.pm:344
 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:312
+#: ../IkiWiki/Plugin/passwordauth.pm:371
 msgid "Failed to send mail"
 msgstr "Es konnte keine E-Mail versandt werden"
 
-#: ../IkiWiki/Plugin/passwordauth.pm:314
+#: ../IkiWiki/Plugin/passwordauth.pm:373
 msgid "You have been mailed password reset instructions."
 msgstr "Ihnen wurden Anweisungen zum Zurücksetzen des Passworts zugesandt."
 
-#: ../IkiWiki/Plugin/passwordauth.pm:349
+#: ../IkiWiki/Plugin/passwordauth.pm:408
 msgid "incorrect password reset url"
 msgstr "fehlerhafte URL zum Zurücksetzen des Passworts"
 
-#: ../IkiWiki/Plugin/passwordauth.pm:352
+#: ../IkiWiki/Plugin/passwordauth.pm:411
 msgid "password reset denied"
 msgstr "zurücksetzen des Passworts abgelehnt"
 
+#: ../IkiWiki/Plugin/passwordauth.pm:424
+#, fuzzy
+msgid "incorrect url"
+msgstr "fehlerhafte URL zum Zurücksetzen des Passworts"
+
+#: ../IkiWiki/Plugin/passwordauth.pm:427
+msgid "access denied"
+msgstr ""
+
 #: ../IkiWiki/Plugin/pingee.pm:30
 msgid "Ping received."
 msgstr "Ping empfangen."
@@ -646,12 +682,12 @@ msgstr "LWP nicht gefunden, führe Ping nicht aus"
 msgid "warning: Old po4a detected! Recommend upgrade to 0.35."
 msgstr "Warnung: Altes po4a erkannt! Empfehle Aktualisierung auf 0.35"
 
-#: ../IkiWiki/Plugin/po.pm:180
+#: ../IkiWiki/Plugin/po.pm:179
 #, perl-format
 msgid "%s is not a valid language code"
 msgstr "%s ist keine gültige Sprachkodierung"
 
-#: ../IkiWiki/Plugin/po.pm:192
+#: ../IkiWiki/Plugin/po.pm:191
 #, perl-format
 msgid ""
 "%s is not a valid value for po_link_to, falling back to po_link_to=default"
@@ -659,7 +695,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:197
+#: ../IkiWiki/Plugin/po.pm:196
 msgid ""
 "po_link_to=negotiated requires usedirs to be enabled, falling back to "
 "po_link_to=default"
@@ -667,11 +703,11 @@ msgstr ""
 "po_link_to=negotiated benötigt usedirs eingeschaltet, greife zurück auf "
 "po_link_to=default"
 
-#: ../IkiWiki/Plugin/po.pm:468
+#: ../IkiWiki/Plugin/po.pm:467
 msgid "updated PO files"
 msgstr "PO-Dateien aktualisiert"
 
-#: ../IkiWiki/Plugin/po.pm:491
+#: ../IkiWiki/Plugin/po.pm:490
 msgid ""
 "Can not remove a translation. If the master page is removed, however, its "
 "translations will be removed as well."
@@ -679,7 +715,7 @@ msgstr ""
 "Übersetzung kann nicht entfernt werden. Wenn die Master Seite entfernt wird, "
 "werden auch ihre Übersetzungen entfernt."
 
-#: ../IkiWiki/Plugin/po.pm:511
+#: ../IkiWiki/Plugin/po.pm:510
 msgid ""
 "Can not rename a translation. If the master page is renamed, however, its "
 "translations will be renamed as well."
@@ -687,65 +723,69 @@ msgstr ""
 "Eine Übersetzung kann nicht umbenannt werden. Wenn die Master Seite "
 "unbenannt wird, werden auch ihre Übersetzungen unbenannt."
 
-#: ../IkiWiki/Plugin/po.pm:957
+#: ../IkiWiki/Plugin/po.pm:956
 #, perl-format
 msgid "POT file (%s) does not exist"
 msgstr "POT-Datei (%s) existiert nicht"
 
-#: ../IkiWiki/Plugin/po.pm:971
+#: ../IkiWiki/Plugin/po.pm:970
 #, perl-format
 msgid "failed to copy underlay PO file to %s"
 msgstr "konnte die PO-Datei nicht aus dem Underlay nach %s kopieren"
 
-#: ../IkiWiki/Plugin/po.pm:980
+#: ../IkiWiki/Plugin/po.pm:979
 #, perl-format
 msgid "failed to update %s"
 msgstr "aktualisieren von %s fehlgeschlagen"
 
-#: ../IkiWiki/Plugin/po.pm:986
+#: ../IkiWiki/Plugin/po.pm:985
 #, perl-format
 msgid "failed to copy the POT file to %s"
 msgstr "kopieren der POT-Datei nach %s fehlgeschlagen"
 
-#: ../IkiWiki/Plugin/po.pm:1022
+#: ../IkiWiki/Plugin/po.pm:1021
 msgid "N/A"
 msgstr "N/A"
 
-#: ../IkiWiki/Plugin/po.pm:1033
+#: ../IkiWiki/Plugin/po.pm:1032
 #, perl-format
 msgid "failed to translate %s"
 msgstr "übersetzen von %s fehlgeschlagen"
 
-#: ../IkiWiki/Plugin/po.pm:1112
+#: ../IkiWiki/Plugin/po.pm:1111
 msgid "removed obsolete PO files"
 msgstr "überflüssige PO-Dateien wurden entfernt"
 
-#: ../IkiWiki/Plugin/po.pm:1169 ../IkiWiki/Plugin/po.pm:1181
-#: ../IkiWiki/Plugin/po.pm:1220
+#: ../IkiWiki/Plugin/po.pm:1168 ../IkiWiki/Plugin/po.pm:1180
+#: ../IkiWiki/Plugin/po.pm:1219
 #, perl-format
 msgid "failed to write %s"
 msgstr "schreiben von %s fehlgeschlagen"
 
-#: ../IkiWiki/Plugin/po.pm:1179
+#: ../IkiWiki/Plugin/po.pm:1178
 msgid "failed to translate"
 msgstr "übersetzen fehlgeschlagen"
 
-#: ../IkiWiki/Plugin/po.pm:1232
+#: ../IkiWiki/Plugin/po.pm:1231
 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/po.pm:1275
+#: ../IkiWiki/Plugin/po.pm:1274
 #, perl-format
 msgid "%s has invalid syntax: must use CODE|NAME"
 msgstr ""
 
-#: ../IkiWiki/Plugin/poll.pm:70
+#: ../IkiWiki/Plugin/poll.pm:72 ../IkiWiki/Plugin/poll.pm:87
 msgid "vote"
 msgstr "abstimmen"
 
-#: ../IkiWiki/Plugin/poll.pm:78
+#: ../IkiWiki/Plugin/poll.pm:86
+msgid "Write in"
+msgstr ""
+
+#: ../IkiWiki/Plugin/poll.pm:93
 msgid "Total votes:"
 msgstr "Alle Stimmen:"
 
@@ -850,35 +890,35 @@ msgstr ""
 msgid "confirm reversion of %s"
 msgstr "bestätigen Sie die Entfernung von %s"
 
-#: ../IkiWiki/Plugin/recentchangesdiff.pm:36
+#: ../IkiWiki/Plugin/recentchangesdiff.pm:49
 msgid "(Diff truncated)"
 msgstr "(Diff wurde gekürzt)"
 
-#: ../IkiWiki/Plugin/remove.pm:32 ../IkiWiki/Plugin/rename.pm:37
+#: ../IkiWiki/Plugin/remove.pm:39 ../IkiWiki/Plugin/rename.pm:37
 #, perl-format
 msgid "%s does not exist"
 msgstr "%s existiert nicht"
 
-#: ../IkiWiki/Plugin/remove.pm:39
+#: ../IkiWiki/Plugin/remove.pm:56
 #, 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:42 ../IkiWiki/Plugin/rename.pm:46
+#: ../IkiWiki/Plugin/remove.pm:59 ../IkiWiki/Plugin/rename.pm:46
 #, perl-format
 msgid "%s is not a file"
 msgstr "%s ist keine Datei"
 
-#: ../IkiWiki/Plugin/remove.pm:149
+#: ../IkiWiki/Plugin/remove.pm:166
 #, perl-format
 msgid "confirm removal of %s"
 msgstr "bestätigen Sie die Entfernung von %s"
 
-#: ../IkiWiki/Plugin/remove.pm:186
+#: ../IkiWiki/Plugin/remove.pm:203
 msgid "Please select the attachments to remove."
 msgstr "Bitte wählen Sie die zu entfernenden Anhänge aus."
 
-#: ../IkiWiki/Plugin/remove.pm:230
+#: ../IkiWiki/Plugin/remove.pm:263
 msgid "removed"
 msgstr "entfernt"
 
@@ -915,20 +955,20 @@ msgstr "benenne %s um"
 msgid "Also rename SubPages and attachments"
 msgstr "Auch Unterseiten (SubPages) und Anhänge umbenennen"
 
-#: ../IkiWiki/Plugin/rename.pm:258
+#: ../IkiWiki/Plugin/rename.pm:266
 msgid "Only one attachment can be renamed at a time."
 msgstr "Es kann immer nur ein Anhang gleichzeitig umbenannt werden."
 
-#: ../IkiWiki/Plugin/rename.pm:261
+#: ../IkiWiki/Plugin/rename.pm:269
 msgid "Please select the attachment to rename."
 msgstr "Bitte wählen Sie den Anhang aus, der umbenannt werden soll."
 
-#: ../IkiWiki/Plugin/rename.pm:371
+#: ../IkiWiki/Plugin/rename.pm:379
 #, perl-format
 msgid "rename %s to %s"
 msgstr "benenne %s in %s um"
 
-#: ../IkiWiki/Plugin/rename.pm:597
+#: ../IkiWiki/Plugin/rename.pm:605
 #, perl-format
 msgid "update for rename of %s to %s"
 msgstr "aktualisiert zum Umbenennen von %s nach %s"
@@ -1048,6 +1088,11 @@ msgstr "fehlender TeX-Code"
 msgid "failed to generate image from code"
 msgstr "konnte kein Bild aus dem Code erzeugen"
 
+#: ../IkiWiki/Plugin/trail.pm:393
+#, perl-format
+msgid "building %s, its previous or next page has changed"
+msgstr ""
+
 #: ../IkiWiki/Plugin/transient.pm:45
 #, fuzzy, perl-format
 msgid "removing transient version of %s"
@@ -1122,7 +1167,7 @@ msgstr ""
 msgid "scanning %s"
 msgstr "durchsuche %s"
 
-#: ../IkiWiki/Render.pm:280
+#: ../IkiWiki/Render.pm:281
 #, perl-format
 msgid ""
 "symlink found in srcdir path (%s) -- set allow_symlinks_before_srcdir to "
@@ -1131,52 +1176,52 @@ msgstr ""
 "symbolischer Verweis im srcdir Pfad (%s) gefunden -- setzen Sie "
 "allow_symlinks_before_srcdir, um dies zu erlauben"
 
-#: ../IkiWiki/Render.pm:316
+#: ../IkiWiki/Render.pm:317
 #, perl-format
 msgid "skipping bad filename %s"
 msgstr "überspringe fehlerhaften Dateinamen %s"
 
-#: ../IkiWiki/Render.pm:332
+#: ../IkiWiki/Render.pm:333
 #, perl-format
 msgid "%s has multiple possible source pages"
 msgstr "%s hat mehrere mögliche Quellseiten"
 
-#: ../IkiWiki/Render.pm:372
+#: ../IkiWiki/Render.pm:373
 #, perl-format
 msgid "querying %s for file creation and modification times.."
 msgstr ""
 
-#: ../IkiWiki/Render.pm:446
+#: ../IkiWiki/Render.pm:447
 #, fuzzy, perl-format
 msgid "removing obsolete %s"
 msgstr "entferne alte Seite %s"
 
-#: ../IkiWiki/Render.pm:530
+#: ../IkiWiki/Render.pm:531
 #, perl-format
 msgid "building %s, which links to %s"
 msgstr "erzeuge %s, die auf %s verweist"
 
-#: ../IkiWiki/Render.pm:539
+#: ../IkiWiki/Render.pm:540
 #, perl-format
 msgid "removing %s, no longer built by %s"
 msgstr "entferne %s, wird nicht länger von %s erzeugt"
 
-#: ../IkiWiki/Render.pm:622 ../IkiWiki/Render.pm:704
+#: ../IkiWiki/Render.pm:623 ../IkiWiki/Render.pm:705
 #, perl-format
 msgid "building %s, which depends on %s"
 msgstr "erzeuge %s, die von %s abhängt"
 
-#: ../IkiWiki/Render.pm:717
+#: ../IkiWiki/Render.pm:718
 #, perl-format
 msgid "building %s, to update its backlinks"
 msgstr "erzeuge %s, um dessen Rückverweise zu aktualisieren"
 
-#: ../IkiWiki/Render.pm:797
+#: ../IkiWiki/Render.pm:806
 #, perl-format
 msgid "building %s"
 msgstr "erzeuge %s"
 
-#: ../IkiWiki/Render.pm:849
+#: ../IkiWiki/Render.pm:871
 #, perl-format
 msgid "ikiwiki: cannot build %s"
 msgstr "ikiwiki: kann %s nicht erzeugen"
@@ -1223,27 +1268,31 @@ msgstr ""
 msgid "generating wrappers.."
 msgstr "erzeuge Wrapper.."
 
-#: ../IkiWiki/Wrapper.pm:36
+#: ../IkiWiki/Wrapper.pm:37
 #, perl-format
 msgid "%s doesn't seem to be executable"
 msgstr "%s scheint nicht ausführbar zu sein"
 
-#: ../IkiWiki/Wrapper.pm:40
+#: ../IkiWiki/Wrapper.pm:41
 msgid "cannot create a wrapper that uses a setup file"
 msgstr "Kann keinen Wrapper erzeugen, der eine Einrichtungsdatei verwendet"
 
-#: ../IkiWiki/Wrapper.pm:44
+#: ../IkiWiki/Wrapper.pm:45
 msgid "wrapper filename not specified"
 msgstr "Dateiname des Wrappers nicht angegeben"
 
+#: ../IkiWiki/Wrapper.pm:109
+msgid "Please wait"
+msgstr ""
+
 #. translators: The parameter is a C filename.
-#: ../IkiWiki/Wrapper.pm:220
+#: ../IkiWiki/Wrapper.pm:268
 #, perl-format
 msgid "failed to compile %s"
 msgstr "erzeugen von %s fehlgeschlagen"
 
 #. translators: The parameter is a filename.
-#: ../IkiWiki/Wrapper.pm:240
+#: ../IkiWiki/Wrapper.pm:288
 #, perl-format
 msgid "successfully generated %s"
 msgstr "%s wurde erfolgreich erstellt"
@@ -1265,69 +1314,69 @@ msgstr "Aufruf: --set Variable=Wert"
 msgid "usage: --set-yaml var=value"
 msgstr "Aufruf: --set Variable=Wert"
 
-#: ../ikiwiki.in:216
+#: ../ikiwiki.in:214
 msgid "rebuilding wiki.."
 msgstr "erzeuge Wiki neu.."
 
-#: ../ikiwiki.in:219
+#: ../ikiwiki.in:217
 msgid "refreshing wiki.."
 msgstr "aktualisiere Wiki.."
 
-#: ../IkiWiki.pm:232
+#: ../IkiWiki.pm:248
 msgid "Discussion"
 msgstr "Diskussion"
 
-#: ../IkiWiki.pm:557
+#: ../IkiWiki.pm:580
 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:605
+#: ../IkiWiki.pm:628
 #, fuzzy, perl-format
 msgid "unsupported umask setting %s"
 msgstr "nicht unterstütztes Seitenformat %s"
 
-#: ../IkiWiki.pm:645
+#: ../IkiWiki.pm:668
 msgid "cannot use multiple rcs plugins"
 msgstr ""
 "Es können nicht mehrere Versionskontrollsystem-Erweiterungen verwandt werden"
 
-#: ../IkiWiki.pm:675
+#: ../IkiWiki.pm:698
 #, 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:1452
+#: ../IkiWiki.pm:1490
 #, perl-format
 msgid "preprocessing loop detected on %s at depth %i"
 msgstr "Präprozessorschleife auf %s in Tiefe %i erkannt"
 
-#: ../IkiWiki.pm:1646
+#: ../IkiWiki.pm:1684
 #, perl-format
 msgid "bad file name %s"
 msgstr "fehlerhafter Dateiname %s"
 
-#: ../IkiWiki.pm:1946
+#: ../IkiWiki.pm:1984
 #, perl-format
 msgid "template %s not found"
 msgstr "Vorlage %s nicht gefunden"
 
-#: ../IkiWiki.pm:2196
+#: ../IkiWiki.pm:2234
 msgid "yes"
 msgstr "ja"
 
-#: ../IkiWiki.pm:2273
+#: ../IkiWiki.pm:2318
 #, fuzzy, perl-format
 msgid "invalid sort type %s"
 msgstr "Unbekannter Sortierungstyp %s"
 
-#: ../IkiWiki.pm:2294
+#: ../IkiWiki.pm:2339
 #, perl-format
 msgid "unknown sort type %s"
 msgstr "Unbekannter Sortierungstyp %s"
 
-#: ../IkiWiki.pm:2430
+#: ../IkiWiki.pm:2475
 #, perl-format
 msgid "cannot match pages: %s"
 msgstr "Kann die Seiten nicht zuordnen: %s"
index 86f49f2c29b15d6a69d3518c4253da29c6e692f4..de009124da052d86ec1c3d7e64900fb31904b2da 100644 (file)
--- a/po/es.po
+++ b/po/es.po
@@ -9,7 +9,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: es\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-11-30 16:33-0400\n"
+"POT-Creation-Date: 2013-09-04 10:16-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"
@@ -57,85 +57,85 @@ msgstr "Las preferencias se han guardado."
 msgid "You are banned."
 msgstr "Ha sido expulsado."
 
-#: ../IkiWiki/CGI.pm:464 ../IkiWiki/CGI.pm:465 ../IkiWiki.pm:1470
+#: ../IkiWiki/CGI.pm:464 ../IkiWiki/CGI.pm:465 ../IkiWiki.pm:1508
 msgid "Error"
 msgstr "Error"
 
-#: ../IkiWiki/Plugin/aggregate.pm:95
+#: ../IkiWiki/Plugin/aggregate.pm:86
 msgid "Aggregation triggered via web."
 msgstr "Contenido añadido activado vía web."
 
-#: ../IkiWiki/Plugin/aggregate.pm:104
+#: ../IkiWiki/Plugin/aggregate.pm:95
 msgid "Nothing to do right now, all feeds are up-to-date!"
 msgstr ""
 "¡ No hay nada que hacer, todas las fuentes de noticias están actualizadas !"
 
-#: ../IkiWiki/Plugin/aggregate.pm:237
+#: ../IkiWiki/Plugin/aggregate.pm:227
 #, perl-format
 msgid "missing %s parameter"
 msgstr "falta el parámetro %s"
 
-#: ../IkiWiki/Plugin/aggregate.pm:272
+#: ../IkiWiki/Plugin/aggregate.pm:262
 msgid "new feed"
 msgstr "nueva entrada"
 
-#: ../IkiWiki/Plugin/aggregate.pm:286
+#: ../IkiWiki/Plugin/aggregate.pm:276
 msgid "posts"
 msgstr "entradas"
 
-#: ../IkiWiki/Plugin/aggregate.pm:288
+#: ../IkiWiki/Plugin/aggregate.pm:278
 msgid "new"
 msgstr "nuevo"
 
-#: ../IkiWiki/Plugin/aggregate.pm:475
+#: ../IkiWiki/Plugin/aggregate.pm:465
 #, perl-format
 msgid "expiring %s (%s days old)"
 msgstr "%s caducada (%s días de antigüedad)"
 
-#: ../IkiWiki/Plugin/aggregate.pm:482
+#: ../IkiWiki/Plugin/aggregate.pm:472
 #, perl-format
 msgid "expiring %s"
 msgstr "%s caducada"
 
-#: ../IkiWiki/Plugin/aggregate.pm:510
+#: ../IkiWiki/Plugin/aggregate.pm:500
 #, perl-format
 msgid "last checked %s"
 msgstr "última comprobación el %s"
 
-#: ../IkiWiki/Plugin/aggregate.pm:514
+#: ../IkiWiki/Plugin/aggregate.pm:504
 #, perl-format
 msgid "checking feed %s ..."
 msgstr "comprobando fuente de datos %s ..."
 
-#: ../IkiWiki/Plugin/aggregate.pm:519
+#: ../IkiWiki/Plugin/aggregate.pm:509
 #, perl-format
 msgid "could not find feed at %s"
 msgstr "no puedo encontrar la fuente de datos en %s"
 
-#: ../IkiWiki/Plugin/aggregate.pm:542
+#: ../IkiWiki/Plugin/aggregate.pm:529
 msgid "feed not found"
 msgstr "fuente de datos no encontrada"
 
-#: ../IkiWiki/Plugin/aggregate.pm:553
+#: ../IkiWiki/Plugin/aggregate.pm:540
 #, perl-format
 msgid "(invalid UTF-8 stripped from feed)"
 msgstr "(una secuencia UTF-8 inválida ha sido eliminada de la fuente de datos)"
 
-#: ../IkiWiki/Plugin/aggregate.pm:561
+#: ../IkiWiki/Plugin/aggregate.pm:548
 #, perl-format
 msgid "(feed entities escaped)"
 msgstr "(los caracteres especiales de la fuente de datos están exceptuados)"
 
-#: ../IkiWiki/Plugin/aggregate.pm:569
+#: ../IkiWiki/Plugin/aggregate.pm:556
 msgid "feed crashed XML::Feed!"
 msgstr "¡ la fuente de datos ha provocado un error fatal en XML::Feed !"
 
-#: ../IkiWiki/Plugin/aggregate.pm:661
+#: ../IkiWiki/Plugin/aggregate.pm:649
 #, perl-format
 msgid "creating new page %s"
 msgstr "creando nueva página %s"
 
-#: ../IkiWiki/Plugin/aggregate.pm:689 ../IkiWiki/Plugin/edittemplate.pm:135
+#: ../IkiWiki/Plugin/aggregate.pm:677 ../IkiWiki/Plugin/edittemplate.pm:135
 #, fuzzy
 msgid "failed to process template:"
 msgstr "se ha producido un error fatal mientras procesaba la plantilla:"
@@ -144,7 +144,7 @@ msgstr "se ha producido un error fatal mientras procesaba la plantilla:"
 msgid "deleting bucket.."
 msgstr "borrando el directorio.."
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:227
+#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:225
 msgid "done"
 msgstr "completado"
 
@@ -163,7 +163,7 @@ msgstr "Creación de directorio en S3 fallida: "
 msgid "Failed to save file to S3: "
 msgstr "No puedo guardar el archivo en S3: "
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:247
+#: ../IkiWiki/Plugin/amazon_s3.pm:248
 #, fuzzy
 msgid "Failed to delete file from S3: "
 msgstr "No puedo borrar archivo en S3: "
@@ -181,16 +181,16 @@ msgstr "prohibido por la claúsula allowed_attachments"
 msgid "bad attachment filename"
 msgstr "nombre de archivo adjunto erróneo"
 
-#: ../IkiWiki/Plugin/attachment.pm:295
+#: ../IkiWiki/Plugin/attachment.pm:296
 msgid "attachment upload"
 msgstr "enviado el adjunto"
 
-#: ../IkiWiki/Plugin/attachment.pm:346
+#: ../IkiWiki/Plugin/attachment.pm:347
 #, fuzzy
 msgid "this attachment is not yet saved"
 msgstr "la página %s no es modificable"
 
-#: ../IkiWiki/Plugin/attachment.pm:363
+#: ../IkiWiki/Plugin/attachment.pm:365
 msgid "just uploaded"
 msgstr ""
 
@@ -199,7 +199,7 @@ msgstr ""
 msgid "creating index page %s"
 msgstr "creando nueva página %s"
 
-#: ../IkiWiki/Plugin/blogspam.pm:118
+#: ../IkiWiki/Plugin/blogspam.pm:119
 msgid ""
 "Sorry, but that looks like spam to <a href=\"http://blogspam.net/"
 "\">blogspam</a>: "
@@ -216,85 +216,89 @@ msgstr "%s desde la página %s"
 msgid "There are no broken links!"
 msgstr "¡ No hay enlaces rotos !"
 
-#: ../IkiWiki/Plugin/comments.pm:114
+#: ../IkiWiki/Plugin/comments.pm:124
 #, fuzzy, perl-format
 msgid "this comment needs %s"
 msgstr "creando comentarios en la página %s"
 
-#: ../IkiWiki/Plugin/comments.pm:117
+#: ../IkiWiki/Plugin/comments.pm:127
 #, fuzzy
 msgid "moderation"
 msgstr "Aprobación de comentarios"
 
-#: ../IkiWiki/Plugin/comments.pm:138 ../IkiWiki/Plugin/format.pm:50
+#: ../IkiWiki/Plugin/comments.pm:154 ../IkiWiki/Plugin/format.pm:50
 #, perl-format
 msgid "unsupported page format %s"
 msgstr "formato de página %s no soportado"
 
-#: ../IkiWiki/Plugin/comments.pm:143
+#: ../IkiWiki/Plugin/comments.pm:159
 msgid "comment must have content"
 msgstr "Un comentario debe tener algún contenido"
 
-#: ../IkiWiki/Plugin/comments.pm:201
+#: ../IkiWiki/Plugin/comments.pm:217
 msgid "Anonymous"
 msgstr "Anónimo"
 
-#: ../IkiWiki/Plugin/comments.pm:263
+#: ../IkiWiki/Plugin/comments.pm:279
 #, fuzzy
 msgid "Comment Moderation"
 msgstr "Aprobación de comentarios"
 
-#: ../IkiWiki/Plugin/comments.pm:379 ../IkiWiki/Plugin/editpage.pm:95
-#: ../IkiWiki/Plugin/editpage.pm:101
+#: ../IkiWiki/Plugin/comments.pm:375 ../IkiWiki/Plugin/comments.pm:379
+msgid "email replies to me"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:413 ../IkiWiki/Plugin/editpage.pm:96
+#: ../IkiWiki/Plugin/editpage.pm:102
 msgid "bad page name"
 msgstr "nombre de página erróneo"
 
-#: ../IkiWiki/Plugin/comments.pm:382
+#: ../IkiWiki/Plugin/comments.pm:416
 #, perl-format
 msgid "commenting on %s"
 msgstr "creando comentarios en la página %s"
 
-#: ../IkiWiki/Plugin/comments.pm:399
+#: ../IkiWiki/Plugin/comments.pm:433
 #, 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:406
+#: ../IkiWiki/Plugin/comments.pm:440
 #, perl-format
 msgid "comments on page '%s' are closed"
 msgstr "los comentarios para la página '%s' están cerrados"
 
-#: ../IkiWiki/Plugin/comments.pm:520
+#: ../IkiWiki/Plugin/comments.pm:565
 msgid "comment stored for moderation"
 msgstr "comentario guardado a la espera de aprobación"
 
-#: ../IkiWiki/Plugin/comments.pm:522
+#: ../IkiWiki/Plugin/comments.pm:567
 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:535
+#: ../IkiWiki/Plugin/comments.pm:580
 msgid "Added a comment"
 msgstr "Añadir un comentario"
 
-#: ../IkiWiki/Plugin/comments.pm:539
+#: ../IkiWiki/Plugin/comments.pm:584
 #, perl-format
 msgid "Added a comment: %s"
 msgstr "Comentario añadido: %s"
 
-#: ../IkiWiki/Plugin/comments.pm:608 ../IkiWiki/Plugin/userlist.pm:55
+#: ../IkiWiki/Plugin/comments.pm:654 ../IkiWiki/Plugin/userlist.pm:55
 #: ../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:660
+#: ../IkiWiki/Plugin/comments.pm:708
 msgid "Comment moderation"
 msgstr "Aprobación de comentarios"
 
-#: ../IkiWiki/Plugin/comments.pm:701
+#: ../IkiWiki/Plugin/comments.pm:749
 msgid "comment moderation"
 msgstr "aprobación de comentarios"
 
-#: ../IkiWiki/Plugin/comments.pm:862
+#: ../IkiWiki/Plugin/comments.pm:910
 #, fuzzy, perl-format
 msgid "%i comment"
 msgid_plural "%i comments"
@@ -304,12 +308,12 @@ msgstr[1] "Comentarios"
 #. translators: Here "Comment" is a verb;
 #. translators: the user clicks on it to
 #. translators: post a comment.
-#: ../IkiWiki/Plugin/comments.pm:872
+#: ../IkiWiki/Plugin/comments.pm:920
 #, fuzzy
 msgid "Comment"
 msgstr "Comentarios"
 
-#: ../IkiWiki/Plugin/conditional.pm:28 ../IkiWiki/Plugin/cutpaste.pm:46
+#: ../IkiWiki/Plugin/conditional.pm:27 ../IkiWiki/Plugin/cutpaste.pm:46
 #: ../IkiWiki/Plugin/cutpaste.pm:60 ../IkiWiki/Plugin/cutpaste.pm:75
 #: ../IkiWiki/Plugin/testpagespec.pm:26
 #, perl-format
@@ -330,19 +334,24 @@ msgstr "no se ha copiado ningún texto con el identificador %s en esta pagina"
 msgid "removing old preview %s"
 msgstr "eliminando la antigua previsualización %s"
 
-#: ../IkiWiki/Plugin/editpage.pm:117
+#: ../IkiWiki/Plugin/editpage.pm:118
 #, perl-format
 msgid "%s is not an editable page"
 msgstr "la página %s no es modificable"
 
-#: ../IkiWiki/Plugin/editpage.pm:307
+#: ../IkiWiki/Plugin/editpage.pm:166
+#, fuzzy
+msgid "email comments to me"
+msgstr "Comentarios"
+
+#: ../IkiWiki/Plugin/editpage.pm:319
 #, perl-format
 msgid "creating %s"
 msgstr "creando página %s"
 
-#: ../IkiWiki/Plugin/editpage.pm:325 ../IkiWiki/Plugin/editpage.pm:344
-#: ../IkiWiki/Plugin/editpage.pm:355 ../IkiWiki/Plugin/editpage.pm:400
-#: ../IkiWiki/Plugin/editpage.pm:442
+#: ../IkiWiki/Plugin/editpage.pm:337 ../IkiWiki/Plugin/editpage.pm:356
+#: ../IkiWiki/Plugin/editpage.pm:367 ../IkiWiki/Plugin/editpage.pm:412
+#: ../IkiWiki/Plugin/editpage.pm:454
 #, perl-format
 msgid "editing %s"
 msgstr "modificando página %s"
@@ -387,27 +396,27 @@ msgstr "no encuentro páginas coincidentes: %s"
 msgid "%s is an attachment, not a page."
 msgstr "la página %s no es modificable"
 
-#: ../IkiWiki/Plugin/git.pm:777 ../IkiWiki/Plugin/git.pm:840
-#: ../IkiWiki.pm:1690
+#: ../IkiWiki/Plugin/git.pm:789 ../IkiWiki/Plugin/git.pm:852
+#: ../IkiWiki.pm:1728
 #, perl-format
 msgid "you are not allowed to change %s"
 msgstr "No puede cambiar %s"
 
-#: ../IkiWiki/Plugin/git.pm:799
+#: ../IkiWiki/Plugin/git.pm:811
 #, 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:803
+#: ../IkiWiki/Plugin/git.pm:815
 msgid "you are not allowed to change file modes"
 msgstr "No puede cambiar los permisos de acceso de un archivo"
 
-#: ../IkiWiki/Plugin/git.pm:873
+#: ../IkiWiki/Plugin/git.pm:885
 #, fuzzy
 msgid "you are not allowed to revert a merge"
 msgstr "No puede cambiar %s"
 
-#: ../IkiWiki/Plugin/git.pm:892
+#: ../IkiWiki/Plugin/git.pm:902
 #, fuzzy, perl-format
 msgid "Failed to revert commit %s"
 msgstr "ha fallado la compilación del programa %s"
@@ -421,7 +430,7 @@ msgstr "Es obligatorio indicar %s cuando se utiliza el complemento de búsqueda"
 msgid "failed to run graphviz"
 msgstr "no he podido ejecutar el programa graphviz "
 
-#: ../IkiWiki/Plugin/graphviz.pm:143
+#: ../IkiWiki/Plugin/graphviz.pm:144
 msgid "prog not a valid graphviz program"
 msgstr "prog no es un programa graphviz válido "
 
@@ -435,7 +444,7 @@ msgstr "la directiva tohighlight contiene el tipo de archivo desconocido '%s' "
 msgid "Source code: %s"
 msgstr "Código fuente: %s"
 
-#: ../IkiWiki/Plugin/highlight.pm:179
+#: ../IkiWiki/Plugin/highlight.pm:180
 msgid ""
 "warning: highlight perl module not available; falling back to pass through"
 msgstr ""
@@ -485,31 +494,31 @@ msgstr "no está permitida la modificación de páginas"
 msgid "missing pages parameter"
 msgstr "falta el parámetro pages"
 
-#: ../IkiWiki/Plugin/inline.pm:192
+#: ../IkiWiki/Plugin/inline.pm:209
 #, perl-format
 msgid "the %s and %s parameters cannot be used together"
 msgstr ""
 
-#: ../IkiWiki/Plugin/inline.pm:297
+#: ../IkiWiki/Plugin/inline.pm:315
 #, perl-format
 msgid "%s (RSS feed)"
 msgstr ""
 
-#: ../IkiWiki/Plugin/inline.pm:301
+#: ../IkiWiki/Plugin/inline.pm:319
 #, perl-format
 msgid "%s (Atom feed)"
 msgstr ""
 
-#: ../IkiWiki/Plugin/inline.pm:330
+#: ../IkiWiki/Plugin/inline.pm:348
 msgid "Add a new post titled:"
 msgstr "Añadir una entrada nueva titulada:"
 
-#: ../IkiWiki/Plugin/inline.pm:369 ../IkiWiki/Plugin/template.pm:44
+#: ../IkiWiki/Plugin/inline.pm:387 ../IkiWiki/Plugin/template.pm:44
 #, fuzzy, perl-format
 msgid "failed to process template %s"
 msgstr "se ha producido un error fatal mientras procesaba la plantilla:"
 
-#: ../IkiWiki/Plugin/inline.pm:695
+#: ../IkiWiki/Plugin/inline.pm:725
 msgid "RPC::XML::Client not found, not pinging"
 msgstr "No he encontrado el componente RPC::XML::Client, no envío señal alguna"
 
@@ -527,45 +536,50 @@ msgstr ""
 msgid "%s is locked and cannot be edited"
 msgstr "La página %s está bloqueada y no puede modificarse"
 
-#: ../IkiWiki/Plugin/mdwn.pm:45
+#: ../IkiWiki/Plugin/mdwn.pm:52
 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:70
+#: ../IkiWiki/Plugin/mdwn.pm:96
 #, 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:175
+#: ../IkiWiki/Plugin/meta.pm:127
+#, fuzzy
+msgid "enclosure not found"
+msgstr "fuente de datos no encontrada"
+
+#: ../IkiWiki/Plugin/meta.pm:187
 msgid "stylesheet not found"
 msgstr "hoja de estilo no encontrada "
 
-#: ../IkiWiki/Plugin/meta.pm:187
+#: ../IkiWiki/Plugin/meta.pm:199
 #, fuzzy
 msgid "script not found"
 msgstr "fuente de datos no encontrada"
 
-#: ../IkiWiki/Plugin/meta.pm:235
+#: ../IkiWiki/Plugin/meta.pm:247
 msgid "redir page not found"
 msgstr "falta la página a donde redirigir"
 
-#: ../IkiWiki/Plugin/meta.pm:249
+#: ../IkiWiki/Plugin/meta.pm:261
 msgid "redir cycle is not allowed"
 msgstr "ciclo de redirección no permitido"
 
-#: ../IkiWiki/Plugin/meta.pm:427
+#: ../IkiWiki/Plugin/meta.pm:450
 #, fuzzy
 msgid "sort=meta requires a parameter"
 msgstr "los parámetros 'from' y 'to' son obligatorios"
 
-#: ../IkiWiki/Plugin/mirrorlist.pm:44
+#: ../IkiWiki/Plugin/mirrorlist.pm:57
 msgid "Mirrors"
 msgstr "Réplicas"
 
-#: ../IkiWiki/Plugin/mirrorlist.pm:44
+#: ../IkiWiki/Plugin/mirrorlist.pm:57
 msgid "Mirror"
 msgstr "Réplica"
 
@@ -578,6 +592,19 @@ msgstr "aprobación de comentarios"
 msgid "more"
 msgstr "ver más"
 
+#: ../IkiWiki/Plugin/notifyemail.pm:72
+msgid "Cannot subscribe your email address without logging in."
+msgstr ""
+
+#: ../IkiWiki/Plugin/notifyemail.pm:136
+msgid "change notification:"
+msgstr ""
+
+#: ../IkiWiki/Plugin/notifyemail.pm:138
+#, fuzzy
+msgid "comment notification:"
+msgstr "aprobación de comentarios"
+
 #: ../IkiWiki/Plugin/openid.pm:71
 #, fuzzy, perl-format
 msgid "failed to load openid module: "
@@ -592,46 +619,55 @@ 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:231
+#: ../IkiWiki/Plugin/passwordauth.pm:145 ../IkiWiki/Plugin/passwordauth.pm:337
+msgid "Error creating account."
+msgstr "Error creando la cuenta de usuario."
+
+#: ../IkiWiki/Plugin/passwordauth.pm:297
 msgid "Your user page: "
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:238
+#: ../IkiWiki/Plugin/passwordauth.pm:304
 msgid "Create your user page"
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:268
+#: ../IkiWiki/Plugin/passwordauth.pm:334
 msgid "Account creation successful. Now you can Login."
 msgstr "Cuenta de usuario creada con éxito. Ahora puede identificarse."
 
-#: ../IkiWiki/Plugin/passwordauth.pm:271
-msgid "Error creating account."
-msgstr "Error creando la cuenta de usuario."
-
-#: ../IkiWiki/Plugin/passwordauth.pm:278
+#: ../IkiWiki/Plugin/passwordauth.pm:344
 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:312
+#: ../IkiWiki/Plugin/passwordauth.pm:371
 msgid "Failed to send mail"
 msgstr "No he podido enviar el mensaje de correo electrónico"
 
-#: ../IkiWiki/Plugin/passwordauth.pm:314
+#: ../IkiWiki/Plugin/passwordauth.pm:373
 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:349
+#: ../IkiWiki/Plugin/passwordauth.pm:408
 msgid "incorrect password reset url"
 msgstr "el url para reiniciar la contraseña es incorrecto"
 
-#: ../IkiWiki/Plugin/passwordauth.pm:352
+#: ../IkiWiki/Plugin/passwordauth.pm:411
 msgid "password reset denied"
 msgstr "reinicio de contraseña denegado"
 
+#: ../IkiWiki/Plugin/passwordauth.pm:424
+#, fuzzy
+msgid "incorrect url"
+msgstr "el url para reiniciar la contraseña es incorrecto"
+
+#: ../IkiWiki/Plugin/passwordauth.pm:427
+msgid "access denied"
+msgstr ""
+
 #: ../IkiWiki/Plugin/pingee.pm:30
 msgid "Ping received."
 msgstr "Recibida una señal ping."
@@ -658,97 +694,101 @@ 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:180
+#: ../IkiWiki/Plugin/po.pm:179
 #, fuzzy, perl-format
 msgid "%s is not a valid language code"
 msgstr "%s no es un archivo"
 
-#: ../IkiWiki/Plugin/po.pm:192
+#: ../IkiWiki/Plugin/po.pm:191
 #, 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:197
+#: ../IkiWiki/Plugin/po.pm:196
 msgid ""
 "po_link_to=negotiated requires usedirs to be enabled, falling back to "
 "po_link_to=default"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:468
+#: ../IkiWiki/Plugin/po.pm:467
 msgid "updated PO files"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:491
+#: ../IkiWiki/Plugin/po.pm:490
 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:511
+#: ../IkiWiki/Plugin/po.pm:510
 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:957
+#: ../IkiWiki/Plugin/po.pm:956
 #, fuzzy, perl-format
 msgid "POT file (%s) does not exist"
 msgstr "No existe la página %s."
 
-#: ../IkiWiki/Plugin/po.pm:971
+#: ../IkiWiki/Plugin/po.pm:970
 #, 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:980
+#: ../IkiWiki/Plugin/po.pm:979
 #, fuzzy, perl-format
 msgid "failed to update %s"
 msgstr "ha fallado la compilación del programa %s"
 
-#: ../IkiWiki/Plugin/po.pm:986
+#: ../IkiWiki/Plugin/po.pm:985
 #, 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:1022
+#: ../IkiWiki/Plugin/po.pm:1021
 msgid "N/A"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:1033
+#: ../IkiWiki/Plugin/po.pm:1032
 #, fuzzy, perl-format
 msgid "failed to translate %s"
 msgstr "dimensionamiento fallido: %s"
 
-#: ../IkiWiki/Plugin/po.pm:1112
+#: ../IkiWiki/Plugin/po.pm:1111
 msgid "removed obsolete PO files"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:1169 ../IkiWiki/Plugin/po.pm:1181
-#: ../IkiWiki/Plugin/po.pm:1220
+#: ../IkiWiki/Plugin/po.pm:1168 ../IkiWiki/Plugin/po.pm:1180
+#: ../IkiWiki/Plugin/po.pm:1219
 #, fuzzy, perl-format
 msgid "failed to write %s"
 msgstr "dimensionamiento fallido: %s"
 
-#: ../IkiWiki/Plugin/po.pm:1179
+#: ../IkiWiki/Plugin/po.pm:1178
 #, fuzzy
 msgid "failed to translate"
 msgstr "no he podido ejecutar el programa dot"
 
-#: ../IkiWiki/Plugin/po.pm:1232
+#: ../IkiWiki/Plugin/po.pm:1231
 msgid "invalid gettext data, go back to previous page to continue edit"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:1275
+#: ../IkiWiki/Plugin/po.pm:1274
 #, perl-format
 msgid "%s has invalid syntax: must use CODE|NAME"
 msgstr ""
 
-#: ../IkiWiki/Plugin/poll.pm:70
+#: ../IkiWiki/Plugin/poll.pm:72 ../IkiWiki/Plugin/poll.pm:87
 msgid "vote"
 msgstr "Votar"
 
-#: ../IkiWiki/Plugin/poll.pm:78
+#: ../IkiWiki/Plugin/poll.pm:86
+msgid "Write in"
+msgstr ""
+
+#: ../IkiWiki/Plugin/poll.pm:93
 msgid "Total votes:"
 msgstr "Recuento de votos:"
 
@@ -851,35 +891,35 @@ msgstr ""
 msgid "confirm reversion of %s"
 msgstr "confirme el borrado de %s"
 
-#: ../IkiWiki/Plugin/recentchangesdiff.pm:36
+#: ../IkiWiki/Plugin/recentchangesdiff.pm:49
 msgid "(Diff truncated)"
 msgstr "(Lista de diferencias truncada)"
 
-#: ../IkiWiki/Plugin/remove.pm:32 ../IkiWiki/Plugin/rename.pm:37
+#: ../IkiWiki/Plugin/remove.pm:39 ../IkiWiki/Plugin/rename.pm:37
 #, perl-format
 msgid "%s does not exist"
 msgstr "No existe la página %s."
 
-#: ../IkiWiki/Plugin/remove.pm:39
+#: ../IkiWiki/Plugin/remove.pm:56
 #, 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:42 ../IkiWiki/Plugin/rename.pm:46
+#: ../IkiWiki/Plugin/remove.pm:59 ../IkiWiki/Plugin/rename.pm:46
 #, perl-format
 msgid "%s is not a file"
 msgstr "%s no es un archivo"
 
-#: ../IkiWiki/Plugin/remove.pm:149
+#: ../IkiWiki/Plugin/remove.pm:166
 #, perl-format
 msgid "confirm removal of %s"
 msgstr "confirme el borrado de %s"
 
-#: ../IkiWiki/Plugin/remove.pm:186
+#: ../IkiWiki/Plugin/remove.pm:203
 msgid "Please select the attachments to remove."
 msgstr "Por favor seleccione los adjuntos que serán borrados."
 
-#: ../IkiWiki/Plugin/remove.pm:230
+#: ../IkiWiki/Plugin/remove.pm:263
 msgid "removed"
 msgstr "borrado"
 
@@ -916,20 +956,20 @@ msgstr "cambiando de nombre %s"
 msgid "Also rename SubPages and attachments"
 msgstr "También cambia de nombre las subpáginas y los adjuntos"
 
-#: ../IkiWiki/Plugin/rename.pm:258
+#: ../IkiWiki/Plugin/rename.pm:266
 msgid "Only one attachment can be renamed at a time."
 msgstr "Únicamente un adjunto puede ser renombrado a la vez."
 
-#: ../IkiWiki/Plugin/rename.pm:261
+#: ../IkiWiki/Plugin/rename.pm:269
 msgid "Please select the attachment to rename."
 msgstr "Por favor, seleccione el adjunto al que cambiar el nombre."
 
-#: ../IkiWiki/Plugin/rename.pm:371
+#: ../IkiWiki/Plugin/rename.pm:379
 #, perl-format
 msgid "rename %s to %s"
 msgstr "%s cambia de nombre a %s"
 
-#: ../IkiWiki/Plugin/rename.pm:597
+#: ../IkiWiki/Plugin/rename.pm:605
 #, perl-format
 msgid "update for rename of %s to %s"
 msgstr "actualizado el cambio de nombre de %s a %s"
@@ -1053,6 +1093,11 @@ msgstr "falta el código tex"
 msgid "failed to generate image from code"
 msgstr "no he podido crear la imagen desde el código"
 
+#: ../IkiWiki/Plugin/trail.pm:393
+#, perl-format
+msgid "building %s, its previous or next page has changed"
+msgstr ""
+
 #: ../IkiWiki/Plugin/transient.pm:45
 #, fuzzy, perl-format
 msgid "removing transient version of %s"
@@ -1126,7 +1171,7 @@ msgstr "no puedo determinar el identificador de un usuario no fiable como %s"
 msgid "scanning %s"
 msgstr "explorando %s"
 
-#: ../IkiWiki/Render.pm:280
+#: ../IkiWiki/Render.pm:281
 #, perl-format
 msgid ""
 "symlink found in srcdir path (%s) -- set allow_symlinks_before_srcdir to "
@@ -1135,54 +1180,54 @@ 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:316
+#: ../IkiWiki/Render.pm:317
 #, perl-format
 msgid "skipping bad filename %s"
 msgstr "ignorando el archivo %s porque su nombre no es correcto"
 
-#: ../IkiWiki/Render.pm:332
+#: ../IkiWiki/Render.pm:333
 #, perl-format
 msgid "%s has multiple possible source pages"
 msgstr "%s tiene mútiples páginas fuente posibles"
 
-#: ../IkiWiki/Render.pm:372
+#: ../IkiWiki/Render.pm:373
 #, perl-format
 msgid "querying %s for file creation and modification times.."
 msgstr ""
 
-#: ../IkiWiki/Render.pm:446
+#: ../IkiWiki/Render.pm:447
 #, fuzzy, perl-format
 msgid "removing obsolete %s"
 msgstr "eliminando la antigua página %s"
 
-#: ../IkiWiki/Render.pm:530
+#: ../IkiWiki/Render.pm:531
 #, fuzzy, perl-format
 msgid "building %s, which links to %s"
 msgstr "convirtiendo la página %s, la cual referencia a %s"
 
-#: ../IkiWiki/Render.pm:539
+#: ../IkiWiki/Render.pm:540
 #, 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:622 ../IkiWiki/Render.pm:704
+#: ../IkiWiki/Render.pm:623 ../IkiWiki/Render.pm:705
 #, fuzzy, perl-format
 msgid "building %s, which depends on %s"
 msgstr "convirtiendo la página %s, la cual depende de %s"
 
-#: ../IkiWiki/Render.pm:717
+#: ../IkiWiki/Render.pm:718
 #, 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:797
+#: ../IkiWiki/Render.pm:806
 #, fuzzy, perl-format
 msgid "building %s"
 msgstr "Informaremos a %s"
 
-#: ../IkiWiki/Render.pm:849
+#: ../IkiWiki/Render.pm:871
 #, fuzzy, perl-format
 msgid "ikiwiki: cannot build %s"
 msgstr "ikiwiki: no puedo convertir la página %s"
@@ -1227,28 +1272,32 @@ msgstr ""
 msgid "generating wrappers.."
 msgstr "generando programas auxiliares.."
 
-#: ../IkiWiki/Wrapper.pm:36
+#: ../IkiWiki/Wrapper.pm:37
 #, perl-format
 msgid "%s doesn't seem to be executable"
 msgstr "el programa %s no parece ser ejecutable"
 
-#: ../IkiWiki/Wrapper.pm:40
+#: ../IkiWiki/Wrapper.pm:41
 msgid "cannot create a wrapper that uses a setup file"
 msgstr ""
 "no puedo crear un programa envoltorio que utiliza un archivo de configuración"
 
-#: ../IkiWiki/Wrapper.pm:44
+#: ../IkiWiki/Wrapper.pm:45
 msgid "wrapper filename not specified"
 msgstr "el programa envoltorio no ha sido especificado"
 
+#: ../IkiWiki/Wrapper.pm:109
+msgid "Please wait"
+msgstr ""
+
 #. translators: The parameter is a C filename.
-#: ../IkiWiki/Wrapper.pm:220
+#: ../IkiWiki/Wrapper.pm:268
 #, 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:240
+#: ../IkiWiki/Wrapper.pm:288
 #, perl-format
 msgid "successfully generated %s"
 msgstr "creado con éxito el programa envoltorio %s"
@@ -1270,70 +1319,70 @@ msgstr "uso: --set variable=valor"
 msgid "usage: --set-yaml var=value"
 msgstr "uso: --set variable=valor"
 
-#: ../ikiwiki.in:216
+#: ../ikiwiki.in:214
 msgid "rebuilding wiki.."
 msgstr "reconstruyendo el wiki.."
 
-#: ../ikiwiki.in:219
+#: ../ikiwiki.in:217
 msgid "refreshing wiki.."
 msgstr "actualizando el wiki.."
 
-#: ../IkiWiki.pm:232
+#: ../IkiWiki.pm:248
 msgid "Discussion"
 msgstr "Comentarios"
 
-#: ../IkiWiki.pm:557
+#: ../IkiWiki.pm:580
 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:605
+#: ../IkiWiki.pm:628
 #, fuzzy, perl-format
 msgid "unsupported umask setting %s"
 msgstr "formato de página %s no soportado"
 
-#: ../IkiWiki.pm:645
+#: ../IkiWiki.pm:668
 msgid "cannot use multiple rcs plugins"
 msgstr "no puedo emplear varios complementos rcs"
 
-#: ../IkiWiki.pm:675
+#: ../IkiWiki.pm:698
 #, 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:1452
+#: ../IkiWiki.pm:1490
 #, 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:1646
+#: ../IkiWiki.pm:1684
 #, perl-format
 msgid "bad file name %s"
 msgstr "el nombre de archivo %s es erróneo"
 
-#: ../IkiWiki.pm:1946
+#: ../IkiWiki.pm:1984
 #, perl-format
 msgid "template %s not found"
 msgstr "no he encontrado la plantilla %s"
 
-#: ../IkiWiki.pm:2196
+#: ../IkiWiki.pm:2234
 msgid "yes"
 msgstr "si"
 
-#: ../IkiWiki.pm:2273
+#: ../IkiWiki.pm:2318
 #, fuzzy, perl-format
 msgid "invalid sort type %s"
 msgstr "no conozco este tipo de ordenación %s"
 
-#: ../IkiWiki.pm:2294
+#: ../IkiWiki.pm:2339
 #, perl-format
 msgid "unknown sort type %s"
 msgstr "no conozco este tipo de ordenación %s"
 
-#: ../IkiWiki.pm:2430
+#: ../IkiWiki.pm:2475
 #, perl-format
 msgid "cannot match pages: %s"
 msgstr "no encuentro páginas coincidentes: %s"
index a1fa14f9d6b1ad3808c9ae26d89b51ef16907c92..0c869b8c17e5d89a99ff2b7b4d030fb6d9787acb 100644 (file)
--- a/po/fr.po
+++ b/po/fr.po
@@ -9,7 +9,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: ikiwiki 3.141\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-11-30 16:33-0400\n"
+"POT-Creation-Date: 2013-09-04 10:16-0400\n"
 "PO-Revision-Date: 2010-10-03 10:42+0200\n"
 "Last-Translator: Philippe Batailler <philippe.batailler@free.fr>\n"
 "Language-Team: French <debian-l10n-french@lists.debian.org>\n"
@@ -54,84 +54,84 @@ msgstr "Les préférences ont été enregistrées."
 msgid "You are banned."
 msgstr "Vous avez été banni."
 
-#: ../IkiWiki/CGI.pm:464 ../IkiWiki/CGI.pm:465 ../IkiWiki.pm:1470
+#: ../IkiWiki/CGI.pm:464 ../IkiWiki/CGI.pm:465 ../IkiWiki.pm:1508
 msgid "Error"
 msgstr "Erreur"
 
-#: ../IkiWiki/Plugin/aggregate.pm:95
+#: ../IkiWiki/Plugin/aggregate.pm:86
 msgid "Aggregation triggered via web."
 msgstr "Agrégation déclenchée par le web"
 
-#: ../IkiWiki/Plugin/aggregate.pm:104
+#: ../IkiWiki/Plugin/aggregate.pm:95
 msgid "Nothing to do right now, all feeds are up-to-date!"
 msgstr "Rien à faire pour le moment, tous les flux sont à jour !"
 
-#: ../IkiWiki/Plugin/aggregate.pm:237
+#: ../IkiWiki/Plugin/aggregate.pm:227
 #, perl-format
 msgid "missing %s parameter"
 msgstr "Paramètre %s manquant"
 
-#: ../IkiWiki/Plugin/aggregate.pm:272
+#: ../IkiWiki/Plugin/aggregate.pm:262
 msgid "new feed"
 msgstr "Nouveau flux"
 
-#: ../IkiWiki/Plugin/aggregate.pm:286
+#: ../IkiWiki/Plugin/aggregate.pm:276
 msgid "posts"
 msgstr "Articles"
 
-#: ../IkiWiki/Plugin/aggregate.pm:288
+#: ../IkiWiki/Plugin/aggregate.pm:278
 msgid "new"
 msgstr "Nouveau"
 
-#: ../IkiWiki/Plugin/aggregate.pm:475
+#: ../IkiWiki/Plugin/aggregate.pm:465
 #, perl-format
 msgid "expiring %s (%s days old)"
 msgstr "Fin de validité de %s (date de %s jours)"
 
-#: ../IkiWiki/Plugin/aggregate.pm:482
+#: ../IkiWiki/Plugin/aggregate.pm:472
 #, perl-format
 msgid "expiring %s"
 msgstr "Fin de validité de %s"
 
-#: ../IkiWiki/Plugin/aggregate.pm:510
+#: ../IkiWiki/Plugin/aggregate.pm:500
 #, perl-format
 msgid "last checked %s"
 msgstr "dernière vérification : %s"
 
-#: ../IkiWiki/Plugin/aggregate.pm:514
+#: ../IkiWiki/Plugin/aggregate.pm:504
 #, perl-format
 msgid "checking feed %s ..."
 msgstr "Vérification du flux %s..."
 
-#: ../IkiWiki/Plugin/aggregate.pm:519
+#: ../IkiWiki/Plugin/aggregate.pm:509
 #, perl-format
 msgid "could not find feed at %s"
 msgstr "Impossible de trouver de flux à %s"
 
-#: ../IkiWiki/Plugin/aggregate.pm:542
+#: ../IkiWiki/Plugin/aggregate.pm:529
 msgid "feed not found"
 msgstr "Flux introuvable "
 
-#: ../IkiWiki/Plugin/aggregate.pm:553
+#: ../IkiWiki/Plugin/aggregate.pm:540
 #, perl-format
 msgid "(invalid UTF-8 stripped from feed)"
 msgstr "(chaîne UTF-8 non valable supprimée du flux)"
 
-#: ../IkiWiki/Plugin/aggregate.pm:561
+#: ../IkiWiki/Plugin/aggregate.pm:548
 #, perl-format
 msgid "(feed entities escaped)"
 msgstr "(échappement des entités de flux)"
 
-#: ../IkiWiki/Plugin/aggregate.pm:569
+#: ../IkiWiki/Plugin/aggregate.pm:556
 msgid "feed crashed XML::Feed!"
 msgstr "Plantage du flux XML::Feed !"
 
-#: ../IkiWiki/Plugin/aggregate.pm:661
+#: ../IkiWiki/Plugin/aggregate.pm:649
 #, perl-format
 msgid "creating new page %s"
 msgstr "Création de la nouvelle page %s"
 
-#: ../IkiWiki/Plugin/aggregate.pm:689 ../IkiWiki/Plugin/edittemplate.pm:135
+#: ../IkiWiki/Plugin/aggregate.pm:677 ../IkiWiki/Plugin/edittemplate.pm:135
 msgid "failed to process template:"
 msgstr "Échec du traitementdu modèle :"
 
@@ -139,7 +139,7 @@ msgstr "Échec du traitementdu modèle :"
 msgid "deleting bucket.."
 msgstr "Suppression du compartiment S3 (« bucket »)..."
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:227
+#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:225
 msgid "done"
 msgstr "Terminé"
 
@@ -156,7 +156,7 @@ msgstr "Impossible de créer un compartiment S3 : "
 msgid "Failed to save file to S3: "
 msgstr "Impossible de sauvegarder le fichier dans le compartiment S3 : "
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:247
+#: ../IkiWiki/Plugin/amazon_s3.pm:248
 msgid "Failed to delete file from S3: "
 msgstr "Échec lors de la suppression du fichier sur S3 : "
 
@@ -173,16 +173,16 @@ msgstr "Action interdite par allowed_attachments"
 msgid "bad attachment filename"
 msgstr "Nom de la pièce jointe incorrect"
 
-#: ../IkiWiki/Plugin/attachment.pm:295
+#: ../IkiWiki/Plugin/attachment.pm:296
 msgid "attachment upload"
 msgstr "Envoi de la pièce jointe"
 
-#: ../IkiWiki/Plugin/attachment.pm:346
+#: ../IkiWiki/Plugin/attachment.pm:347
 #, fuzzy
 msgid "this attachment is not yet saved"
 msgstr "%s est une pièce jointe, pas une page."
 
-#: ../IkiWiki/Plugin/attachment.pm:363
+#: ../IkiWiki/Plugin/attachment.pm:365
 msgid "just uploaded"
 msgstr ""
 
@@ -191,7 +191,7 @@ msgstr ""
 msgid "creating index page %s"
 msgstr "Création de la nouvelle page %s"
 
-#: ../IkiWiki/Plugin/blogspam.pm:118
+#: ../IkiWiki/Plugin/blogspam.pm:119
 msgid ""
 "Sorry, but that looks like spam to <a href=\"http://blogspam.net/"
 "\">blogspam</a>: "
@@ -208,83 +208,87 @@ msgstr "%s sur %s"
 msgid "There are no broken links!"
 msgstr "Aucun lien cassé !"
 
-#: ../IkiWiki/Plugin/comments.pm:114
+#: ../IkiWiki/Plugin/comments.pm:124
 #, perl-format
 msgid "this comment needs %s"
 msgstr "Ce commentaire demande %s"
 
-#: ../IkiWiki/Plugin/comments.pm:117
+#: ../IkiWiki/Plugin/comments.pm:127
 msgid "moderation"
 msgstr "Modération"
 
-#: ../IkiWiki/Plugin/comments.pm:138 ../IkiWiki/Plugin/format.pm:50
+#: ../IkiWiki/Plugin/comments.pm:154 ../IkiWiki/Plugin/format.pm:50
 #, perl-format
 msgid "unsupported page format %s"
 msgstr "Format de page non reconnu %s"
 
-#: ../IkiWiki/Plugin/comments.pm:143
+#: ../IkiWiki/Plugin/comments.pm:159
 msgid "comment must have content"
 msgstr "Un commentaire doit avoir un contenu."
 
-#: ../IkiWiki/Plugin/comments.pm:201
+#: ../IkiWiki/Plugin/comments.pm:217
 msgid "Anonymous"
 msgstr "Anonyme"
 
-#: ../IkiWiki/Plugin/comments.pm:263
+#: ../IkiWiki/Plugin/comments.pm:279
 msgid "Comment Moderation"
 msgstr "Modération du commentaire"
 
-#: ../IkiWiki/Plugin/comments.pm:379 ../IkiWiki/Plugin/editpage.pm:95
-#: ../IkiWiki/Plugin/editpage.pm:101
+#: ../IkiWiki/Plugin/comments.pm:375 ../IkiWiki/Plugin/comments.pm:379
+msgid "email replies to me"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:413 ../IkiWiki/Plugin/editpage.pm:96
+#: ../IkiWiki/Plugin/editpage.pm:102
 msgid "bad page name"
 msgstr "Nom de page incorrect"
 
-#: ../IkiWiki/Plugin/comments.pm:382
+#: ../IkiWiki/Plugin/comments.pm:416
 #, perl-format
 msgid "commenting on %s"
 msgstr "Faire un commentaire sur %s"
 
-#: ../IkiWiki/Plugin/comments.pm:399
+#: ../IkiWiki/Plugin/comments.pm:433
 #, 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:406
+#: ../IkiWiki/Plugin/comments.pm:440
 #, perl-format
 msgid "comments on page '%s' are closed"
 msgstr "Le commentaire pour la page '%s' est terminé."
 
-#: ../IkiWiki/Plugin/comments.pm:520
+#: ../IkiWiki/Plugin/comments.pm:565
 msgid "comment stored for moderation"
 msgstr "Le commentaire a été enregistré, en attente de « modération »"
 
-#: ../IkiWiki/Plugin/comments.pm:522
+#: ../IkiWiki/Plugin/comments.pm:567
 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:535
+#: ../IkiWiki/Plugin/comments.pm:580
 msgid "Added a comment"
 msgstr "Commentaire ajouté"
 
-#: ../IkiWiki/Plugin/comments.pm:539
+#: ../IkiWiki/Plugin/comments.pm:584
 #, perl-format
 msgid "Added a comment: %s"
 msgstr "Commentaire ajouté : %s"
 
-#: ../IkiWiki/Plugin/comments.pm:608 ../IkiWiki/Plugin/userlist.pm:55
+#: ../IkiWiki/Plugin/comments.pm:654 ../IkiWiki/Plugin/userlist.pm:55
 #: ../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:660
+#: ../IkiWiki/Plugin/comments.pm:708
 msgid "Comment moderation"
 msgstr "Modération du commentaire"
 
-#: ../IkiWiki/Plugin/comments.pm:701
+#: ../IkiWiki/Plugin/comments.pm:749
 msgid "comment moderation"
 msgstr "modération du commentaire"
 
-#: ../IkiWiki/Plugin/comments.pm:862
+#: ../IkiWiki/Plugin/comments.pm:910
 #, perl-format
 msgid "%i comment"
 msgid_plural "%i comments"
@@ -294,11 +298,11 @@ msgstr[1] "%i commentaires"
 #. translators: Here "Comment" is a verb;
 #. translators: the user clicks on it to
 #. translators: post a comment.
-#: ../IkiWiki/Plugin/comments.pm:872
+#: ../IkiWiki/Plugin/comments.pm:920
 msgid "Comment"
 msgstr "poster un commentaire"
 
-#: ../IkiWiki/Plugin/conditional.pm:28 ../IkiWiki/Plugin/cutpaste.pm:46
+#: ../IkiWiki/Plugin/conditional.pm:27 ../IkiWiki/Plugin/cutpaste.pm:46
 #: ../IkiWiki/Plugin/cutpaste.pm:60 ../IkiWiki/Plugin/cutpaste.pm:75
 #: ../IkiWiki/Plugin/testpagespec.pm:26
 #, perl-format
@@ -319,19 +323,24 @@ msgstr "Aucun texte n'a été copié dans cette page avec l'identifiant %s"
 msgid "removing old preview %s"
 msgstr "Suppression de l'ancienne prévisualisation %s"
 
-#: ../IkiWiki/Plugin/editpage.pm:117
+#: ../IkiWiki/Plugin/editpage.pm:118
 #, perl-format
 msgid "%s is not an editable page"
 msgstr "%s n'est pas une page éditable"
 
-#: ../IkiWiki/Plugin/editpage.pm:307
+#: ../IkiWiki/Plugin/editpage.pm:166
+#, fuzzy
+msgid "email comments to me"
+msgstr "%i commentaire"
+
+#: ../IkiWiki/Plugin/editpage.pm:319
 #, perl-format
 msgid "creating %s"
 msgstr "Création de %s"
 
-#: ../IkiWiki/Plugin/editpage.pm:325 ../IkiWiki/Plugin/editpage.pm:344
-#: ../IkiWiki/Plugin/editpage.pm:355 ../IkiWiki/Plugin/editpage.pm:400
-#: ../IkiWiki/Plugin/editpage.pm:442
+#: ../IkiWiki/Plugin/editpage.pm:337 ../IkiWiki/Plugin/editpage.pm:356
+#: ../IkiWiki/Plugin/editpage.pm:367 ../IkiWiki/Plugin/editpage.pm:412
+#: ../IkiWiki/Plugin/editpage.pm:454
 #, perl-format
 msgid "editing %s"
 msgstr "Édition de %s"
@@ -375,27 +384,27 @@ msgstr "Ce n'est pas une page."
 msgid "%s is an attachment, not a page."
 msgstr "%s est une pièce jointe, pas une page."
 
-#: ../IkiWiki/Plugin/git.pm:777 ../IkiWiki/Plugin/git.pm:840
-#: ../IkiWiki.pm:1690
+#: ../IkiWiki/Plugin/git.pm:789 ../IkiWiki/Plugin/git.pm:852
+#: ../IkiWiki.pm:1728
 #, perl-format
 msgid "you are not allowed to change %s"
 msgstr "Vous n'êtes pas autorisé à modifier %s"
 
-#: ../IkiWiki/Plugin/git.pm:799
+#: ../IkiWiki/Plugin/git.pm:811
 #, 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:803
+#: ../IkiWiki/Plugin/git.pm:815
 msgid "you are not allowed to change file modes"
 msgstr "Vous n'êtes pas autorisé à modifier le mode des fichiers"
 
-#: ../IkiWiki/Plugin/git.pm:873
+#: ../IkiWiki/Plugin/git.pm:885
 #, fuzzy
 msgid "you are not allowed to revert a merge"
 msgstr "Vous n'êtes pas autorisé à modifier %s"
 
-#: ../IkiWiki/Plugin/git.pm:892
+#: ../IkiWiki/Plugin/git.pm:902
 #, fuzzy, perl-format
 msgid "Failed to revert commit %s"
 msgstr "Échec de la compilation de %s"
@@ -409,7 +418,7 @@ msgstr "Vous devez indiquer %s lors de l'utilisation du greffon %s."
 msgid "failed to run graphviz"
 msgstr "Échec du lancement de graphviz"
 
-#: ../IkiWiki/Plugin/graphviz.pm:143
+#: ../IkiWiki/Plugin/graphviz.pm:144
 msgid "prog not a valid graphviz program"
 msgstr "Ce programme n'est pas un programme graphviz valable"
 
@@ -423,7 +432,7 @@ msgstr "tohighlight contient un type de fichier inconnu : '%s'"
 msgid "Source code: %s"
 msgstr "Code source : %s"
 
-#: ../IkiWiki/Plugin/highlight.pm:179
+#: ../IkiWiki/Plugin/highlight.pm:180
 msgid ""
 "warning: highlight perl module not available; falling back to pass through"
 msgstr ""
@@ -472,31 +481,31 @@ msgstr "Modification de page interdite"
 msgid "missing pages parameter"
 msgstr "Paramètre « pages » manquant"
 
-#: ../IkiWiki/Plugin/inline.pm:192
+#: ../IkiWiki/Plugin/inline.pm:209
 #, 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:297
+#: ../IkiWiki/Plugin/inline.pm:315
 #, perl-format
 msgid "%s (RSS feed)"
 msgstr ""
 
-#: ../IkiWiki/Plugin/inline.pm:301
+#: ../IkiWiki/Plugin/inline.pm:319
 #, perl-format
 msgid "%s (Atom feed)"
 msgstr ""
 
-#: ../IkiWiki/Plugin/inline.pm:330
+#: ../IkiWiki/Plugin/inline.pm:348
 msgid "Add a new post titled:"
 msgstr "Ajouter un nouvel article dont le titre est :"
 
-#: ../IkiWiki/Plugin/inline.pm:369 ../IkiWiki/Plugin/template.pm:44
+#: ../IkiWiki/Plugin/inline.pm:387 ../IkiWiki/Plugin/template.pm:44
 #, fuzzy, perl-format
 msgid "failed to process template %s"
 msgstr "Échec du traitementdu modèle :"
 
-#: ../IkiWiki/Plugin/inline.pm:695
+#: ../IkiWiki/Plugin/inline.pm:725
 msgid "RPC::XML::Client not found, not pinging"
 msgstr "RPC::XML::Client introuvable, pas de réponse au ping"
 
@@ -514,43 +523,48 @@ msgstr "linkmap"
 msgid "%s is locked and cannot be edited"
 msgstr "%s est verrouillé et ne peut être modifié"
 
-#: ../IkiWiki/Plugin/mdwn.pm:45
+#: ../IkiWiki/Plugin/mdwn.pm:52
 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:70
+#: ../IkiWiki/Plugin/mdwn.pm:96
 #, 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:175
+#: ../IkiWiki/Plugin/meta.pm:127
+#, fuzzy
+msgid "enclosure not found"
+msgstr "Flux introuvable "
+
+#: ../IkiWiki/Plugin/meta.pm:187
 msgid "stylesheet not found"
 msgstr "Feuille de style introuvable "
 
-#: ../IkiWiki/Plugin/meta.pm:187
+#: ../IkiWiki/Plugin/meta.pm:199
 #, fuzzy
 msgid "script not found"
 msgstr "%s introuvable"
 
-#: ../IkiWiki/Plugin/meta.pm:235
+#: ../IkiWiki/Plugin/meta.pm:247
 msgid "redir page not found"
 msgstr "Page de redirection introuvable"
 
-#: ../IkiWiki/Plugin/meta.pm:249
+#: ../IkiWiki/Plugin/meta.pm:261
 msgid "redir cycle is not allowed"
 msgstr "Redirection cyclique non autorisée"
 
-#: ../IkiWiki/Plugin/meta.pm:427
+#: ../IkiWiki/Plugin/meta.pm:450
 msgid "sort=meta requires a parameter"
 msgstr "sort=meta demande un paramètre."
 
-#: ../IkiWiki/Plugin/mirrorlist.pm:44
+#: ../IkiWiki/Plugin/mirrorlist.pm:57
 msgid "Mirrors"
 msgstr "Miroirs"
 
-#: ../IkiWiki/Plugin/mirrorlist.pm:44
+#: ../IkiWiki/Plugin/mirrorlist.pm:57
 msgid "Mirror"
 msgstr "Miroir"
 
@@ -562,6 +576,19 @@ msgstr "le commentaire doit passer par une instance de modération"
 msgid "more"
 msgstr "lire la suite"
 
+#: ../IkiWiki/Plugin/notifyemail.pm:72
+msgid "Cannot subscribe your email address without logging in."
+msgstr ""
+
+#: ../IkiWiki/Plugin/notifyemail.pm:136
+msgid "change notification:"
+msgstr ""
+
+#: ../IkiWiki/Plugin/notifyemail.pm:138
+#, fuzzy
+msgid "comment notification:"
+msgstr "modération du commentaire"
+
 #: ../IkiWiki/Plugin/openid.pm:71
 #, perl-format
 msgid "failed to load openid module: "
@@ -575,46 +602,55 @@ 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:231
+#: ../IkiWiki/Plugin/passwordauth.pm:145 ../IkiWiki/Plugin/passwordauth.pm:337
+msgid "Error creating account."
+msgstr "Erreur lors de la création du compte."
+
+#: ../IkiWiki/Plugin/passwordauth.pm:297
 msgid "Your user page: "
 msgstr "Votre page d'utilisateur :"
 
-#: ../IkiWiki/Plugin/passwordauth.pm:238
+#: ../IkiWiki/Plugin/passwordauth.pm:304
 msgid "Create your user page"
 msgstr "Création de votre page d'utilisateur"
 
-#: ../IkiWiki/Plugin/passwordauth.pm:268
+#: ../IkiWiki/Plugin/passwordauth.pm:334
 msgid "Account creation successful. Now you can Login."
 msgstr "Le compte a été créé. Vous pouvez maintenant vous identifier."
 
-#: ../IkiWiki/Plugin/passwordauth.pm:271
-msgid "Error creating account."
-msgstr "Erreur lors de la création du compte."
-
-#: ../IkiWiki/Plugin/passwordauth.pm:278
+#: ../IkiWiki/Plugin/passwordauth.pm:344
 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:312
+#: ../IkiWiki/Plugin/passwordauth.pm:371
 msgid "Failed to send mail"
 msgstr "Impossible d'envoyer un courriel"
 
-#: ../IkiWiki/Plugin/passwordauth.pm:314
+#: ../IkiWiki/Plugin/passwordauth.pm:373
 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:349
+#: ../IkiWiki/Plugin/passwordauth.pm:408
 msgid "incorrect password reset url"
 msgstr "Adresse pour la réinitialisation du mot de passe incorrecte"
 
-#: ../IkiWiki/Plugin/passwordauth.pm:352
+#: ../IkiWiki/Plugin/passwordauth.pm:411
 msgid "password reset denied"
 msgstr "réinitialisation du mot de passe refusée"
 
+#: ../IkiWiki/Plugin/passwordauth.pm:424
+#, fuzzy
+msgid "incorrect url"
+msgstr "Adresse pour la réinitialisation du mot de passe incorrecte"
+
+#: ../IkiWiki/Plugin/passwordauth.pm:427
+msgid "access denied"
+msgstr ""
+
 #: ../IkiWiki/Plugin/pingee.pm:30
 msgid "Ping received."
 msgstr "Ping reçu"
@@ -643,12 +679,12 @@ msgstr ""
 "Note : ancienne version de po4a détectée. Il est recommandé d'installer la "
 "version 0.35."
 
-#: ../IkiWiki/Plugin/po.pm:180
+#: ../IkiWiki/Plugin/po.pm:179
 #, perl-format
 msgid "%s is not a valid language code"
 msgstr "%s n'est pas un code de langue valable"
 
-#: ../IkiWiki/Plugin/po.pm:192
+#: ../IkiWiki/Plugin/po.pm:191
 #, perl-format
 msgid ""
 "%s is not a valid value for po_link_to, falling back to po_link_to=default"
@@ -656,7 +692,7 @@ msgstr ""
 "%s n'est pas une valeur correcte pour po_link_to, retour à la valeur par "
 "défaut."
 
-#: ../IkiWiki/Plugin/po.pm:197
+#: ../IkiWiki/Plugin/po.pm:196
 msgid ""
 "po_link_to=negotiated requires usedirs to be enabled, falling back to "
 "po_link_to=default"
@@ -664,11 +700,11 @@ msgstr ""
 "po_link_to=negotiated nécessite que usedirs soit activé, retour à "
 "po_link_to=default."
 
-#: ../IkiWiki/Plugin/po.pm:468
+#: ../IkiWiki/Plugin/po.pm:467
 msgid "updated PO files"
 msgstr "Fichiers PO mis à jour."
 
-#: ../IkiWiki/Plugin/po.pm:491
+#: ../IkiWiki/Plugin/po.pm:490
 msgid ""
 "Can not remove a translation. If the master page is removed, however, its "
 "translations will be removed as well."
@@ -676,7 +712,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:511
+#: ../IkiWiki/Plugin/po.pm:510
 msgid ""
 "Can not rename a translation. If the master page is renamed, however, its "
 "translations will be renamed as well."
@@ -684,65 +720,69 @@ 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:957
+#: ../IkiWiki/Plugin/po.pm:956
 #, perl-format
 msgid "POT file (%s) does not exist"
 msgstr "Le fichier POT %s n'existe pas."
 
-#: ../IkiWiki/Plugin/po.pm:971
+#: ../IkiWiki/Plugin/po.pm:970
 #, 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:980
+#: ../IkiWiki/Plugin/po.pm:979
 #, perl-format
 msgid "failed to update %s"
 msgstr "Impossible de mettre à jour %s"
 
-#: ../IkiWiki/Plugin/po.pm:986
+#: ../IkiWiki/Plugin/po.pm:985
 #, perl-format
 msgid "failed to copy the POT file to %s"
 msgstr "Impossible de copier le fichier POT dans %s"
 
-#: ../IkiWiki/Plugin/po.pm:1022
+#: ../IkiWiki/Plugin/po.pm:1021
 msgid "N/A"
 msgstr "N/A"
 
-#: ../IkiWiki/Plugin/po.pm:1033
+#: ../IkiWiki/Plugin/po.pm:1032
 #, perl-format
 msgid "failed to translate %s"
 msgstr "Impossible de traduire %s"
 
-#: ../IkiWiki/Plugin/po.pm:1112
+#: ../IkiWiki/Plugin/po.pm:1111
 msgid "removed obsolete PO files"
 msgstr "Fichiers PO obsolètes supprimés."
 
-#: ../IkiWiki/Plugin/po.pm:1169 ../IkiWiki/Plugin/po.pm:1181
-#: ../IkiWiki/Plugin/po.pm:1220
+#: ../IkiWiki/Plugin/po.pm:1168 ../IkiWiki/Plugin/po.pm:1180
+#: ../IkiWiki/Plugin/po.pm:1219
 #, perl-format
 msgid "failed to write %s"
 msgstr "Impossible de modifier %s"
 
-#: ../IkiWiki/Plugin/po.pm:1179
+#: ../IkiWiki/Plugin/po.pm:1178
 msgid "failed to translate"
 msgstr "Impossible de traduire"
 
-#: ../IkiWiki/Plugin/po.pm:1232
+#: ../IkiWiki/Plugin/po.pm:1231
 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/po.pm:1275
+#: ../IkiWiki/Plugin/po.pm:1274
 #, perl-format
 msgid "%s has invalid syntax: must use CODE|NAME"
 msgstr "La syntaxe de %s n'est pas correcte : il faut utiliser CODE|NOM"
 
-#: ../IkiWiki/Plugin/poll.pm:70
+#: ../IkiWiki/Plugin/poll.pm:72 ../IkiWiki/Plugin/poll.pm:87
 msgid "vote"
 msgstr "Voter"
 
-#: ../IkiWiki/Plugin/poll.pm:78
+#: ../IkiWiki/Plugin/poll.pm:86
+msgid "Write in"
+msgstr ""
+
+#: ../IkiWiki/Plugin/poll.pm:93
 msgid "Total votes:"
 msgstr "Total des suffrages :"
 
@@ -847,35 +887,35 @@ msgstr ""
 msgid "confirm reversion of %s"
 msgstr "Suppression de %s confirmée"
 
-#: ../IkiWiki/Plugin/recentchangesdiff.pm:36
+#: ../IkiWiki/Plugin/recentchangesdiff.pm:49
 msgid "(Diff truncated)"
 msgstr "(fichier de différences tronqué)"
 
-#: ../IkiWiki/Plugin/remove.pm:32 ../IkiWiki/Plugin/rename.pm:37
+#: ../IkiWiki/Plugin/remove.pm:39 ../IkiWiki/Plugin/rename.pm:37
 #, perl-format
 msgid "%s does not exist"
 msgstr "%s n'existe pas"
 
-#: ../IkiWiki/Plugin/remove.pm:39
+#: ../IkiWiki/Plugin/remove.pm:56
 #, 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:42 ../IkiWiki/Plugin/rename.pm:46
+#: ../IkiWiki/Plugin/remove.pm:59 ../IkiWiki/Plugin/rename.pm:46
 #, perl-format
 msgid "%s is not a file"
 msgstr "%s n'est pas un fichier"
 
-#: ../IkiWiki/Plugin/remove.pm:149
+#: ../IkiWiki/Plugin/remove.pm:166
 #, perl-format
 msgid "confirm removal of %s"
 msgstr "Suppression de %s confirmée"
 
-#: ../IkiWiki/Plugin/remove.pm:186
+#: ../IkiWiki/Plugin/remove.pm:203
 msgid "Please select the attachments to remove."
 msgstr "Veuillez choisir la pièce jointe à supprimer"
 
-#: ../IkiWiki/Plugin/remove.pm:230
+#: ../IkiWiki/Plugin/remove.pm:263
 msgid "removed"
 msgstr "supprimé"
 
@@ -912,20 +952,20 @@ msgstr "%s renommé"
 msgid "Also rename SubPages and attachments"
 msgstr "« SubPages » et attachements renommés."
 
-#: ../IkiWiki/Plugin/rename.pm:258
+#: ../IkiWiki/Plugin/rename.pm:266
 msgid "Only one attachment can be renamed at a time."
 msgstr "Modification de pièce jointe : une seule à la fois"
 
-#: ../IkiWiki/Plugin/rename.pm:261
+#: ../IkiWiki/Plugin/rename.pm:269
 msgid "Please select the attachment to rename."
 msgstr "Veuillez sélectionner la pièce jointe à renommer"
 
-#: ../IkiWiki/Plugin/rename.pm:371
+#: ../IkiWiki/Plugin/rename.pm:379
 #, perl-format
 msgid "rename %s to %s"
 msgstr "Renomme %s en %s"
 
-#: ../IkiWiki/Plugin/rename.pm:597
+#: ../IkiWiki/Plugin/rename.pm:605
 #, perl-format
 msgid "update for rename of %s to %s"
 msgstr "mise à jour, suite au changement de %s en %s"
@@ -1045,6 +1085,11 @@ msgstr "Il manque le code TeX"
 msgid "failed to generate image from code"
 msgstr "Échec de la création de l'image à partir du code"
 
+#: ../IkiWiki/Plugin/trail.pm:393
+#, perl-format
+msgid "building %s, its previous or next page has changed"
+msgstr ""
+
 #: ../IkiWiki/Plugin/transient.pm:45
 #, fuzzy, perl-format
 msgid "removing transient version of %s"
@@ -1117,7 +1162,7 @@ msgstr ""
 msgid "scanning %s"
 msgstr "Examen de %s"
 
-#: ../IkiWiki/Render.pm:280
+#: ../IkiWiki/Render.pm:281
 #, perl-format
 msgid ""
 "symlink found in srcdir path (%s) -- set allow_symlinks_before_srcdir to "
@@ -1126,53 +1171,53 @@ msgstr ""
 "Lien symbolique trouvé dans l'adresse de srcdir (%s) -- pour l'autoriser, "
 "activez le paramètre « allow_symlinks_before_srcdir »."
 
-#: ../IkiWiki/Render.pm:316
+#: ../IkiWiki/Render.pm:317
 #, perl-format
 msgid "skipping bad filename %s"
 msgstr "Omission du fichier au nom incorrect %s"
 
-#: ../IkiWiki/Render.pm:332
+#: ../IkiWiki/Render.pm:333
 #, perl-format
 msgid "%s has multiple possible source pages"
 msgstr "%s peut être associé à plusieurs pages source."
 
-#: ../IkiWiki/Render.pm:372
+#: ../IkiWiki/Render.pm:373
 #, perl-format
 msgid "querying %s for file creation and modification times.."
 msgstr ""
 "recherche de %s pour les dates de modification et de création des fichiers..."
 
-#: ../IkiWiki/Render.pm:446
+#: ../IkiWiki/Render.pm:447
 #, perl-format
 msgid "removing obsolete %s"
 msgstr "Suppression de %s obsolète"
 
-#: ../IkiWiki/Render.pm:530
+#: ../IkiWiki/Render.pm:531
 #, perl-format
 msgid "building %s, which links to %s"
 msgstr "Reconstruction de %s, qui est lié à %s"
 
-#: ../IkiWiki/Render.pm:539
+#: ../IkiWiki/Render.pm:540
 #, perl-format
 msgid "removing %s, no longer built by %s"
 msgstr "Suppression de %s, qui n'est plus rendu par %s"
 
-#: ../IkiWiki/Render.pm:622 ../IkiWiki/Render.pm:704
+#: ../IkiWiki/Render.pm:623 ../IkiWiki/Render.pm:705
 #, perl-format
 msgid "building %s, which depends on %s"
 msgstr "Reconstruction de %s, qui dépend de %s"
 
-#: ../IkiWiki/Render.pm:717
+#: ../IkiWiki/Render.pm:718
 #, perl-format
 msgid "building %s, to update its backlinks"
 msgstr "Reconstruction de %s, afin de mettre à jour ses rétroliens"
 
-#: ../IkiWiki/Render.pm:797
+#: ../IkiWiki/Render.pm:806
 #, perl-format
 msgid "building %s"
 msgstr "construction de %s"
 
-#: ../IkiWiki/Render.pm:849
+#: ../IkiWiki/Render.pm:871
 #, perl-format
 msgid "ikiwiki: cannot build %s"
 msgstr "ikiwiki : impossible de reconstruire %s"
@@ -1220,28 +1265,32 @@ msgstr ""
 msgid "generating wrappers.."
 msgstr "Création des fichiers CGI..."
 
-#: ../IkiWiki/Wrapper.pm:36
+#: ../IkiWiki/Wrapper.pm:37
 #, perl-format
 msgid "%s doesn't seem to be executable"
 msgstr "%s ne semble pas être exécutable"
 
-#: ../IkiWiki/Wrapper.pm:40
+#: ../IkiWiki/Wrapper.pm:41
 msgid "cannot create a wrapper that uses a setup file"
 msgstr ""
 "Impossible de créer un fichier CGI utilisant un fichier de configuration"
 
-#: ../IkiWiki/Wrapper.pm:44
+#: ../IkiWiki/Wrapper.pm:45
 msgid "wrapper filename not specified"
 msgstr "Le nom du fichier CGI n'a pas été indiqué"
 
+#: ../IkiWiki/Wrapper.pm:109
+msgid "Please wait"
+msgstr ""
+
 #. translators: The parameter is a C filename.
-#: ../IkiWiki/Wrapper.pm:220
+#: ../IkiWiki/Wrapper.pm:268
 #, perl-format
 msgid "failed to compile %s"
 msgstr "Échec de la compilation de %s"
 
 #. translators: The parameter is a filename.
-#: ../IkiWiki/Wrapper.pm:240
+#: ../IkiWiki/Wrapper.pm:288
 #, perl-format
 msgid "successfully generated %s"
 msgstr "%s a été créé avec succès"
@@ -1262,67 +1311,67 @@ msgstr "Syntaxe : -- set var=valeur"
 msgid "usage: --set-yaml var=value"
 msgstr "Syntaxe : --set-yaml var=valeur"
 
-#: ../ikiwiki.in:216
+#: ../ikiwiki.in:214
 msgid "rebuilding wiki.."
 msgstr "Reconstruction du wiki..."
 
-#: ../ikiwiki.in:219
+#: ../ikiwiki.in:217
 msgid "refreshing wiki.."
 msgstr "Rafraîchissement du wiki..."
 
-#: ../IkiWiki.pm:232
+#: ../IkiWiki.pm:248
 msgid "Discussion"
 msgstr "Discussion"
 
-#: ../IkiWiki.pm:557
+#: ../IkiWiki.pm:580
 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:605
+#: ../IkiWiki.pm:628
 #, fuzzy, perl-format
 msgid "unsupported umask setting %s"
 msgstr "Format de page non reconnu %s"
 
-#: ../IkiWiki.pm:645
+#: ../IkiWiki.pm:668
 msgid "cannot use multiple rcs plugins"
 msgstr "Impossible d'utiliser plusieurs systèmes de contrôle des versions"
 
-#: ../IkiWiki.pm:675
+#: ../IkiWiki.pm:698
 #, 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:1452
+#: ../IkiWiki.pm:1490
 #, 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:1646
+#: ../IkiWiki.pm:1684
 #, perl-format
 msgid "bad file name %s"
 msgstr "Nom de fichier incorrect %s"
 
-#: ../IkiWiki.pm:1946
+#: ../IkiWiki.pm:1984
 #, perl-format
 msgid "template %s not found"
 msgstr "Modèle de page %s introuvable"
 
-#: ../IkiWiki.pm:2196
+#: ../IkiWiki.pm:2234
 msgid "yes"
 msgstr "oui"
 
-#: ../IkiWiki.pm:2273
+#: ../IkiWiki.pm:2318
 #, perl-format
 msgid "invalid sort type %s"
 msgstr "Type de tri %s inconnu"
 
-#: ../IkiWiki.pm:2294
+#: ../IkiWiki.pm:2339
 #, perl-format
 msgid "unknown sort type %s"
 msgstr "Type de tri %s inconnu"
 
-#: ../IkiWiki.pm:2430
+#: ../IkiWiki.pm:2475
 #, perl-format
 msgid "cannot match pages: %s"
 msgstr "Impossible de trouver les pages : %s"
index 123cadd4ac4e1d2cfe942cce80c130b2b3e2c777..7e33a4de55d526a587ce94f35f9c760ac26fc377 100644 (file)
--- a/po/gu.po
+++ b/po/gu.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: ikiwiki-gu\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-11-30 16:33-0400\n"
+"POT-Creation-Date: 2013-09-04 10:16-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"
@@ -51,84 +51,84 @@ msgstr "પ્રાથમિકતાઓ સંગ્રહાઇ."
 msgid "You are banned."
 msgstr "તમારા પર પ્રતિબંધ છે."
 
-#: ../IkiWiki/CGI.pm:464 ../IkiWiki/CGI.pm:465 ../IkiWiki.pm:1470
+#: ../IkiWiki/CGI.pm:464 ../IkiWiki/CGI.pm:465 ../IkiWiki.pm:1508
 msgid "Error"
 msgstr "ક્ષતિ"
 
-#: ../IkiWiki/Plugin/aggregate.pm:95
+#: ../IkiWiki/Plugin/aggregate.pm:86
 msgid "Aggregation triggered via web."
 msgstr ""
 
-#: ../IkiWiki/Plugin/aggregate.pm:104
+#: ../IkiWiki/Plugin/aggregate.pm:95
 msgid "Nothing to do right now, all feeds are up-to-date!"
 msgstr ""
 
-#: ../IkiWiki/Plugin/aggregate.pm:237
+#: ../IkiWiki/Plugin/aggregate.pm:227
 #, perl-format
 msgid "missing %s parameter"
 msgstr "ખોવાયેલ %s વિકલ્પ"
 
-#: ../IkiWiki/Plugin/aggregate.pm:272
+#: ../IkiWiki/Plugin/aggregate.pm:262
 msgid "new feed"
 msgstr "નવું ફીડ"
 
-#: ../IkiWiki/Plugin/aggregate.pm:286
+#: ../IkiWiki/Plugin/aggregate.pm:276
 msgid "posts"
 msgstr "પોસ્ટ"
 
-#: ../IkiWiki/Plugin/aggregate.pm:288
+#: ../IkiWiki/Plugin/aggregate.pm:278
 msgid "new"
 msgstr "નવું"
 
-#: ../IkiWiki/Plugin/aggregate.pm:475
+#: ../IkiWiki/Plugin/aggregate.pm:465
 #, perl-format
 msgid "expiring %s (%s days old)"
 msgstr "જુનું કરે છે %s (%s દિવસો જુનું)"
 
-#: ../IkiWiki/Plugin/aggregate.pm:482
+#: ../IkiWiki/Plugin/aggregate.pm:472
 #, perl-format
 msgid "expiring %s"
 msgstr "જુનું કરે છે %s"
 
-#: ../IkiWiki/Plugin/aggregate.pm:510
+#: ../IkiWiki/Plugin/aggregate.pm:500
 #, perl-format
 msgid "last checked %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/aggregate.pm:514
+#: ../IkiWiki/Plugin/aggregate.pm:504
 #, perl-format
 msgid "checking feed %s ..."
 msgstr "ફીડ %s ચકાસે છે ..."
 
-#: ../IkiWiki/Plugin/aggregate.pm:519
+#: ../IkiWiki/Plugin/aggregate.pm:509
 #, perl-format
 msgid "could not find feed at %s"
 msgstr "%s પર ફીડ મળી શક્યું નહી"
 
-#: ../IkiWiki/Plugin/aggregate.pm:542
+#: ../IkiWiki/Plugin/aggregate.pm:529
 msgid "feed not found"
 msgstr "ફીડ મળ્યું નહી"
 
-#: ../IkiWiki/Plugin/aggregate.pm:553
+#: ../IkiWiki/Plugin/aggregate.pm:540
 #, fuzzy, perl-format
 msgid "(invalid UTF-8 stripped from feed)"
 msgstr "ફીડમાંથી અયોગ્ય રીતે UTF-8 નીકાળેલ છે"
 
-#: ../IkiWiki/Plugin/aggregate.pm:561
+#: ../IkiWiki/Plugin/aggregate.pm:548
 #, perl-format
 msgid "(feed entities escaped)"
 msgstr ""
 
-#: ../IkiWiki/Plugin/aggregate.pm:569
+#: ../IkiWiki/Plugin/aggregate.pm:556
 msgid "feed crashed XML::Feed!"
 msgstr "ફીડ ભાંગી ગયું XML::Feed!"
 
-#: ../IkiWiki/Plugin/aggregate.pm:661
+#: ../IkiWiki/Plugin/aggregate.pm:649
 #, perl-format
 msgid "creating new page %s"
 msgstr "નવું પાનું %s બનાવે છે"
 
-#: ../IkiWiki/Plugin/aggregate.pm:689 ../IkiWiki/Plugin/edittemplate.pm:135
+#: ../IkiWiki/Plugin/aggregate.pm:677 ../IkiWiki/Plugin/edittemplate.pm:135
 #, fuzzy
 msgid "failed to process template:"
 msgstr "ક્રિયા કરવામાં નિષ્ફળ:"
@@ -137,7 +137,7 @@ msgstr "ક્રિયા કરવામાં નિષ્ફળ:"
 msgid "deleting bucket.."
 msgstr ""
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:227
+#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:225
 msgid "done"
 msgstr "સંપૂર્ણ"
 
@@ -156,7 +156,7 @@ msgstr "મેઇલ મોકલવામાં નિષ્ફળ"
 msgid "Failed to save file to S3: "
 msgstr "મેઇલ મોકલવામાં નિષ્ફળ"
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:247
+#: ../IkiWiki/Plugin/amazon_s3.pm:248
 #, fuzzy
 msgid "Failed to delete file from S3: "
 msgstr "માપ બદલવામાં નિષ્ફળ: %s"
@@ -174,16 +174,16 @@ msgstr ""
 msgid "bad attachment filename"
 msgstr ""
 
-#: ../IkiWiki/Plugin/attachment.pm:295
+#: ../IkiWiki/Plugin/attachment.pm:296
 msgid "attachment upload"
 msgstr ""
 
-#: ../IkiWiki/Plugin/attachment.pm:346
+#: ../IkiWiki/Plugin/attachment.pm:347
 #, fuzzy
 msgid "this attachment is not yet saved"
 msgstr "%s એ સુધારી શકાય તેવું પાનું નથી"
 
-#: ../IkiWiki/Plugin/attachment.pm:363
+#: ../IkiWiki/Plugin/attachment.pm:365
 msgid "just uploaded"
 msgstr ""
 
@@ -192,7 +192,7 @@ msgstr ""
 msgid "creating index page %s"
 msgstr "નવું પાનું %s બનાવે છે"
 
-#: ../IkiWiki/Plugin/blogspam.pm:118
+#: ../IkiWiki/Plugin/blogspam.pm:119
 msgid ""
 "Sorry, but that looks like spam to <a href=\"http://blogspam.net/"
 "\">blogspam</a>: "
@@ -207,83 +207,87 @@ msgstr ""
 msgid "There are no broken links!"
 msgstr "અહીં કોઇ તૂટેલ કડી નથી!"
 
-#: ../IkiWiki/Plugin/comments.pm:114
+#: ../IkiWiki/Plugin/comments.pm:124
 #, fuzzy, perl-format
 msgid "this comment needs %s"
 msgstr "%s બનાવે છે"
 
-#: ../IkiWiki/Plugin/comments.pm:117
+#: ../IkiWiki/Plugin/comments.pm:127
 msgid "moderation"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:138 ../IkiWiki/Plugin/format.pm:50
+#: ../IkiWiki/Plugin/comments.pm:154 ../IkiWiki/Plugin/format.pm:50
 #, perl-format
 msgid "unsupported page format %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:143
+#: ../IkiWiki/Plugin/comments.pm:159
 msgid "comment must have content"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:201
+#: ../IkiWiki/Plugin/comments.pm:217
 msgid "Anonymous"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:263
+#: ../IkiWiki/Plugin/comments.pm:279
 msgid "Comment Moderation"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:379 ../IkiWiki/Plugin/editpage.pm:95
-#: ../IkiWiki/Plugin/editpage.pm:101
+#: ../IkiWiki/Plugin/comments.pm:375 ../IkiWiki/Plugin/comments.pm:379
+msgid "email replies to me"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:413 ../IkiWiki/Plugin/editpage.pm:96
+#: ../IkiWiki/Plugin/editpage.pm:102
 msgid "bad page name"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:382
+#: ../IkiWiki/Plugin/comments.pm:416
 #, fuzzy, perl-format
 msgid "commenting on %s"
 msgstr "%s બનાવે છે"
 
-#: ../IkiWiki/Plugin/comments.pm:399
+#: ../IkiWiki/Plugin/comments.pm:433
 #, perl-format
 msgid "page '%s' doesn't exist, so you can't comment"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:406
+#: ../IkiWiki/Plugin/comments.pm:440
 #, perl-format
 msgid "comments on page '%s' are closed"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:520
+#: ../IkiWiki/Plugin/comments.pm:565
 msgid "comment stored for moderation"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:522
+#: ../IkiWiki/Plugin/comments.pm:567
 msgid "Your comment will be posted after moderator review"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:535
+#: ../IkiWiki/Plugin/comments.pm:580
 msgid "Added a comment"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:539
+#: ../IkiWiki/Plugin/comments.pm:584
 #, perl-format
 msgid "Added a comment: %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:608 ../IkiWiki/Plugin/userlist.pm:55
+#: ../IkiWiki/Plugin/comments.pm:654 ../IkiWiki/Plugin/userlist.pm:55
 #: ../IkiWiki/Plugin/websetup.pm:272
 msgid "you are not logged in as an admin"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:660
+#: ../IkiWiki/Plugin/comments.pm:708
 msgid "Comment moderation"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:701
+#: ../IkiWiki/Plugin/comments.pm:749
 msgid "comment moderation"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:862
+#: ../IkiWiki/Plugin/comments.pm:910
 #, perl-format
 msgid "%i comment"
 msgid_plural "%i comments"
@@ -293,11 +297,11 @@ msgstr[1] ""
 #. translators: Here "Comment" is a verb;
 #. translators: the user clicks on it to
 #. translators: post a comment.
-#: ../IkiWiki/Plugin/comments.pm:872
+#: ../IkiWiki/Plugin/comments.pm:920
 msgid "Comment"
 msgstr ""
 
-#: ../IkiWiki/Plugin/conditional.pm:28 ../IkiWiki/Plugin/cutpaste.pm:46
+#: ../IkiWiki/Plugin/conditional.pm:27 ../IkiWiki/Plugin/cutpaste.pm:46
 #: ../IkiWiki/Plugin/cutpaste.pm:60 ../IkiWiki/Plugin/cutpaste.pm:75
 #: ../IkiWiki/Plugin/testpagespec.pm:26
 #, fuzzy, perl-format
@@ -318,19 +322,23 @@ msgstr ""
 msgid "removing old preview %s"
 msgstr "જુનાં પાનાં દૂર કરે છે %s"
 
-#: ../IkiWiki/Plugin/editpage.pm:117
+#: ../IkiWiki/Plugin/editpage.pm:118
 #, perl-format
 msgid "%s is not an editable page"
 msgstr "%s એ સુધારી શકાય તેવું પાનું નથી"
 
-#: ../IkiWiki/Plugin/editpage.pm:307
+#: ../IkiWiki/Plugin/editpage.pm:166
+msgid "email comments to me"
+msgstr ""
+
+#: ../IkiWiki/Plugin/editpage.pm:319
 #, perl-format
 msgid "creating %s"
 msgstr "%s બનાવે છે"
 
-#: ../IkiWiki/Plugin/editpage.pm:325 ../IkiWiki/Plugin/editpage.pm:344
-#: ../IkiWiki/Plugin/editpage.pm:355 ../IkiWiki/Plugin/editpage.pm:400
-#: ../IkiWiki/Plugin/editpage.pm:442
+#: ../IkiWiki/Plugin/editpage.pm:337 ../IkiWiki/Plugin/editpage.pm:356
+#: ../IkiWiki/Plugin/editpage.pm:367 ../IkiWiki/Plugin/editpage.pm:412
+#: ../IkiWiki/Plugin/editpage.pm:454
 #, perl-format
 msgid "editing %s"
 msgstr "%s સુધારે છે"
@@ -378,26 +386,26 @@ msgstr "વાંચી શકાતી નથી %s: %s"
 msgid "%s is an attachment, not a page."
 msgstr "%s એ સુધારી શકાય તેવું પાનું નથી"
 
-#: ../IkiWiki/Plugin/git.pm:777 ../IkiWiki/Plugin/git.pm:840
-#: ../IkiWiki.pm:1690
+#: ../IkiWiki/Plugin/git.pm:789 ../IkiWiki/Plugin/git.pm:852
+#: ../IkiWiki.pm:1728
 #, perl-format
 msgid "you are not allowed to change %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/git.pm:799
+#: ../IkiWiki/Plugin/git.pm:811
 #, perl-format
 msgid "you cannot act on a file with mode %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/git.pm:803
+#: ../IkiWiki/Plugin/git.pm:815
 msgid "you are not allowed to change file modes"
 msgstr ""
 
-#: ../IkiWiki/Plugin/git.pm:873
+#: ../IkiWiki/Plugin/git.pm:885
 msgid "you are not allowed to revert a merge"
 msgstr ""
 
-#: ../IkiWiki/Plugin/git.pm:892
+#: ../IkiWiki/Plugin/git.pm:902
 #, fuzzy, perl-format
 msgid "Failed to revert commit %s"
 msgstr "%s કમ્પાઇલ કરવામાં નિષ્ફળ"
@@ -411,7 +419,7 @@ msgstr "જ્યારે શોધ પ્લગઇન ઉપયોગ કર
 msgid "failed to run graphviz"
 msgstr "ગ્રાફવિઝ ચલાવવામાં નિષ્ફળ"
 
-#: ../IkiWiki/Plugin/graphviz.pm:143
+#: ../IkiWiki/Plugin/graphviz.pm:144
 msgid "prog not a valid graphviz program"
 msgstr "કાર્યક્રમએ યોગ્ય ગ્રાફવિઝ કાર્યક્રમ નથી"
 
@@ -425,7 +433,7 @@ msgstr ""
 msgid "Source code: %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/highlight.pm:179
+#: ../IkiWiki/Plugin/highlight.pm:180
 msgid ""
 "warning: highlight perl module not available; falling back to pass through"
 msgstr ""
@@ -474,31 +482,31 @@ msgstr "ફીડ મળ્યું નહી"
 msgid "missing pages parameter"
 msgstr "ખોવાયેલ %s વિકલ્પ"
 
-#: ../IkiWiki/Plugin/inline.pm:192
+#: ../IkiWiki/Plugin/inline.pm:209
 #, perl-format
 msgid "the %s and %s parameters cannot be used together"
 msgstr ""
 
-#: ../IkiWiki/Plugin/inline.pm:297
+#: ../IkiWiki/Plugin/inline.pm:315
 #, perl-format
 msgid "%s (RSS feed)"
 msgstr ""
 
-#: ../IkiWiki/Plugin/inline.pm:301
+#: ../IkiWiki/Plugin/inline.pm:319
 #, perl-format
 msgid "%s (Atom feed)"
 msgstr ""
 
-#: ../IkiWiki/Plugin/inline.pm:330
+#: ../IkiWiki/Plugin/inline.pm:348
 msgid "Add a new post titled:"
 msgstr "આ શિર્ષકથી નવું પોસ્ટ ઉમેરો:"
 
-#: ../IkiWiki/Plugin/inline.pm:369 ../IkiWiki/Plugin/template.pm:44
+#: ../IkiWiki/Plugin/inline.pm:387 ../IkiWiki/Plugin/template.pm:44
 #, fuzzy, perl-format
 msgid "failed to process template %s"
 msgstr "ક્રિયા કરવામાં નિષ્ફળ:"
 
-#: ../IkiWiki/Plugin/inline.pm:695
+#: ../IkiWiki/Plugin/inline.pm:725
 msgid "RPC::XML::Client not found, not pinging"
 msgstr "RPC::XML::Client મળ્યું નહી, પિંગ કરવામાં આવતું નથી"
 
@@ -516,43 +524,48 @@ msgstr ""
 msgid "%s is locked and cannot be edited"
 msgstr "%s એ %s દ્વારા તાળું મરાયેલ છે અને તેમાં સુધારો કરી શકાશે નહી"
 
-#: ../IkiWiki/Plugin/mdwn.pm:45
+#: ../IkiWiki/Plugin/mdwn.pm:52
 msgid "multimarkdown is enabled, but Text::MultiMarkdown is not installed"
 msgstr ""
 
-#: ../IkiWiki/Plugin/mdwn.pm:70
+#: ../IkiWiki/Plugin/mdwn.pm:96
 #, 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:175
+#: ../IkiWiki/Plugin/meta.pm:127
+#, fuzzy
+msgid "enclosure not found"
+msgstr "ફીડ મળ્યું નહી"
+
+#: ../IkiWiki/Plugin/meta.pm:187
 msgid "stylesheet not found"
 msgstr "સ્ટાઇલશીટ મળ્યું નહી"
 
-#: ../IkiWiki/Plugin/meta.pm:187
+#: ../IkiWiki/Plugin/meta.pm:199
 #, fuzzy
 msgid "script not found"
 msgstr "ટેમ્પલેટ %s મળ્યું નહી"
 
-#: ../IkiWiki/Plugin/meta.pm:235
+#: ../IkiWiki/Plugin/meta.pm:247
 #, fuzzy
 msgid "redir page not found"
 msgstr "ફીડ મળ્યું નહી"
 
-#: ../IkiWiki/Plugin/meta.pm:249
+#: ../IkiWiki/Plugin/meta.pm:261
 #, fuzzy
 msgid "redir cycle is not allowed"
 msgstr "ફીડ મળ્યું નહી"
 
-#: ../IkiWiki/Plugin/meta.pm:427
+#: ../IkiWiki/Plugin/meta.pm:450
 msgid "sort=meta requires a parameter"
 msgstr ""
 
-#: ../IkiWiki/Plugin/mirrorlist.pm:44
+#: ../IkiWiki/Plugin/mirrorlist.pm:57
 msgid "Mirrors"
 msgstr "મિરરો"
 
-#: ../IkiWiki/Plugin/mirrorlist.pm:44
+#: ../IkiWiki/Plugin/mirrorlist.pm:57
 msgid "Mirror"
 msgstr "મિરર"
 
@@ -564,6 +577,18 @@ msgstr ""
 msgid "more"
 msgstr "વધુ"
 
+#: ../IkiWiki/Plugin/notifyemail.pm:72
+msgid "Cannot subscribe your email address without logging in."
+msgstr ""
+
+#: ../IkiWiki/Plugin/notifyemail.pm:136
+msgid "change notification:"
+msgstr ""
+
+#: ../IkiWiki/Plugin/notifyemail.pm:138
+msgid "comment notification:"
+msgstr ""
+
 #: ../IkiWiki/Plugin/openid.pm:71
 #, fuzzy, perl-format
 msgid "failed to load openid module: "
@@ -578,42 +603,50 @@ msgstr "બધા પાનાંઓ બીજા પાનાંઓ વડે 
 msgid "bad or missing template"
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:231
+#: ../IkiWiki/Plugin/passwordauth.pm:145 ../IkiWiki/Plugin/passwordauth.pm:337
+msgid "Error creating account."
+msgstr "ખાતું બનાવવામાં ક્ષતિ."
+
+#: ../IkiWiki/Plugin/passwordauth.pm:297
 msgid "Your user page: "
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:238
+#: ../IkiWiki/Plugin/passwordauth.pm:304
 msgid "Create your user page"
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:268
+#: ../IkiWiki/Plugin/passwordauth.pm:334
 msgid "Account creation successful. Now you can Login."
 msgstr "ખાતું બનાવવાનું સફળ. તમે હવે લોગઇન કરી શકો છો."
 
-#: ../IkiWiki/Plugin/passwordauth.pm:271
-msgid "Error creating account."
-msgstr "ખાતું બનાવવામાં ક્ષતિ."
-
-#: ../IkiWiki/Plugin/passwordauth.pm:278
+#: ../IkiWiki/Plugin/passwordauth.pm:344
 msgid "No email address, so cannot email password reset instructions."
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:312
+#: ../IkiWiki/Plugin/passwordauth.pm:371
 msgid "Failed to send mail"
 msgstr "મેઇલ મોકલવામાં નિષ્ફળ"
 
-#: ../IkiWiki/Plugin/passwordauth.pm:314
+#: ../IkiWiki/Plugin/passwordauth.pm:373
 msgid "You have been mailed password reset instructions."
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:349
+#: ../IkiWiki/Plugin/passwordauth.pm:408
 msgid "incorrect password reset url"
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:352
+#: ../IkiWiki/Plugin/passwordauth.pm:411
 msgid "password reset denied"
 msgstr ""
 
+#: ../IkiWiki/Plugin/passwordauth.pm:424
+msgid "incorrect url"
+msgstr ""
+
+#: ../IkiWiki/Plugin/passwordauth.pm:427
+msgid "access denied"
+msgstr ""
+
 #: ../IkiWiki/Plugin/pingee.pm:30
 msgid "Ping received."
 msgstr ""
@@ -641,97 +674,101 @@ msgstr "RPC::XML::Client મળ્યું નહી, પિંગ કરવા
 msgid "warning: Old po4a detected! Recommend upgrade to 0.35."
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:180
+#: ../IkiWiki/Plugin/po.pm:179
 #, fuzzy, perl-format
 msgid "%s is not a valid language code"
 msgstr "%s એ સુધારી શકાય તેવું પાનું નથી"
 
-#: ../IkiWiki/Plugin/po.pm:192
+#: ../IkiWiki/Plugin/po.pm:191
 #, 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:197
+#: ../IkiWiki/Plugin/po.pm:196
 msgid ""
 "po_link_to=negotiated requires usedirs to be enabled, falling back to "
 "po_link_to=default"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:468
+#: ../IkiWiki/Plugin/po.pm:467
 msgid "updated PO files"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:491
+#: ../IkiWiki/Plugin/po.pm:490
 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:511
+#: ../IkiWiki/Plugin/po.pm:510
 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:957
+#: ../IkiWiki/Plugin/po.pm:956
 #, perl-format
 msgid "POT file (%s) does not exist"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:971
+#: ../IkiWiki/Plugin/po.pm:970
 #, fuzzy, perl-format
 msgid "failed to copy underlay PO file to %s"
 msgstr "%s કમ્પાઇલ કરવામાં નિષ્ફળ"
 
-#: ../IkiWiki/Plugin/po.pm:980
+#: ../IkiWiki/Plugin/po.pm:979
 #, fuzzy, perl-format
 msgid "failed to update %s"
 msgstr "%s કમ્પાઇલ કરવામાં નિષ્ફળ"
 
-#: ../IkiWiki/Plugin/po.pm:986
+#: ../IkiWiki/Plugin/po.pm:985
 #, fuzzy, perl-format
 msgid "failed to copy the POT file to %s"
 msgstr "%s કમ્પાઇલ કરવામાં નિષ્ફળ"
 
-#: ../IkiWiki/Plugin/po.pm:1022
+#: ../IkiWiki/Plugin/po.pm:1021
 msgid "N/A"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:1033
+#: ../IkiWiki/Plugin/po.pm:1032
 #, fuzzy, perl-format
 msgid "failed to translate %s"
 msgstr "માપ બદલવામાં નિષ્ફળ: %s"
 
-#: ../IkiWiki/Plugin/po.pm:1112
+#: ../IkiWiki/Plugin/po.pm:1111
 msgid "removed obsolete PO files"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:1169 ../IkiWiki/Plugin/po.pm:1181
-#: ../IkiWiki/Plugin/po.pm:1220
+#: ../IkiWiki/Plugin/po.pm:1168 ../IkiWiki/Plugin/po.pm:1180
+#: ../IkiWiki/Plugin/po.pm:1219
 #, fuzzy, perl-format
 msgid "failed to write %s"
 msgstr "%s લખવામાં નિષ્ફળ: %s"
 
-#: ../IkiWiki/Plugin/po.pm:1179
+#: ../IkiWiki/Plugin/po.pm:1178
 #, fuzzy
 msgid "failed to translate"
 msgstr "ડોટ ચલાવવામાં નિષ્ફળ"
 
-#: ../IkiWiki/Plugin/po.pm:1232
+#: ../IkiWiki/Plugin/po.pm:1231
 msgid "invalid gettext data, go back to previous page to continue edit"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:1275
+#: ../IkiWiki/Plugin/po.pm:1274
 #, perl-format
 msgid "%s has invalid syntax: must use CODE|NAME"
 msgstr ""
 
-#: ../IkiWiki/Plugin/poll.pm:70
+#: ../IkiWiki/Plugin/poll.pm:72 ../IkiWiki/Plugin/poll.pm:87
 msgid "vote"
 msgstr "મત"
 
-#: ../IkiWiki/Plugin/poll.pm:78
+#: ../IkiWiki/Plugin/poll.pm:86
+msgid "Write in"
+msgstr ""
+
+#: ../IkiWiki/Plugin/poll.pm:93
 msgid "Total votes:"
 msgstr "કુલ મત:"
 
@@ -836,35 +873,35 @@ msgstr ""
 msgid "confirm reversion of %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/recentchangesdiff.pm:36
+#: ../IkiWiki/Plugin/recentchangesdiff.pm:49
 msgid "(Diff truncated)"
 msgstr ""
 
-#: ../IkiWiki/Plugin/remove.pm:32 ../IkiWiki/Plugin/rename.pm:37
+#: ../IkiWiki/Plugin/remove.pm:39 ../IkiWiki/Plugin/rename.pm:37
 #, perl-format
 msgid "%s does not exist"
 msgstr ""
 
-#: ../IkiWiki/Plugin/remove.pm:39
+#: ../IkiWiki/Plugin/remove.pm:56
 #, fuzzy, perl-format
 msgid "%s is not in the srcdir, so it cannot be deleted"
 msgstr "%s એ %s દ્વારા તાળું મરાયેલ છે અને તેમાં સુધારો કરી શકાશે નહી"
 
-#: ../IkiWiki/Plugin/remove.pm:42 ../IkiWiki/Plugin/rename.pm:46
+#: ../IkiWiki/Plugin/remove.pm:59 ../IkiWiki/Plugin/rename.pm:46
 #, fuzzy, perl-format
 msgid "%s is not a file"
 msgstr "%s એ સુધારી શકાય તેવું પાનું નથી"
 
-#: ../IkiWiki/Plugin/remove.pm:149
+#: ../IkiWiki/Plugin/remove.pm:166
 #, perl-format
 msgid "confirm removal of %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/remove.pm:186
+#: ../IkiWiki/Plugin/remove.pm:203
 msgid "Please select the attachments to remove."
 msgstr ""
 
-#: ../IkiWiki/Plugin/remove.pm:230
+#: ../IkiWiki/Plugin/remove.pm:263
 msgid "removed"
 msgstr ""
 
@@ -902,20 +939,20 @@ msgstr "રેન્ડર કરે છે %s"
 msgid "Also rename SubPages and attachments"
 msgstr ""
 
-#: ../IkiWiki/Plugin/rename.pm:258
+#: ../IkiWiki/Plugin/rename.pm:266
 msgid "Only one attachment can be renamed at a time."
 msgstr ""
 
-#: ../IkiWiki/Plugin/rename.pm:261
+#: ../IkiWiki/Plugin/rename.pm:269
 msgid "Please select the attachment to rename."
 msgstr ""
 
-#: ../IkiWiki/Plugin/rename.pm:371
+#: ../IkiWiki/Plugin/rename.pm:379
 #, perl-format
 msgid "rename %s to %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/rename.pm:597
+#: ../IkiWiki/Plugin/rename.pm:605
 #, fuzzy, perl-format
 msgid "update for rename of %s to %s"
 msgstr "%s નો સુધારો %s નાં %s વડે"
@@ -1041,6 +1078,11 @@ msgstr "ખોવાયેલ કિંમતો"
 msgid "failed to generate image from code"
 msgstr "માપ બદલવામાં નિષ્ફળ: %s"
 
+#: ../IkiWiki/Plugin/trail.pm:393
+#, perl-format
+msgid "building %s, its previous or next page has changed"
+msgstr ""
+
 #: ../IkiWiki/Plugin/transient.pm:45
 #, fuzzy, perl-format
 msgid "removing transient version of %s"
@@ -1107,59 +1149,59 @@ msgstr ""
 msgid "scanning %s"
 msgstr "%s શોધે છે"
 
-#: ../IkiWiki/Render.pm:280
+#: ../IkiWiki/Render.pm:281
 #, perl-format
 msgid ""
 "symlink found in srcdir path (%s) -- set allow_symlinks_before_srcdir to "
 "allow this"
 msgstr ""
 
-#: ../IkiWiki/Render.pm:316
+#: ../IkiWiki/Render.pm:317
 #, perl-format
 msgid "skipping bad filename %s"
 msgstr "ખરાબ ફાઇલ નામ છોડી દે છે %s"
 
-#: ../IkiWiki/Render.pm:332
+#: ../IkiWiki/Render.pm:333
 #, perl-format
 msgid "%s has multiple possible source pages"
 msgstr ""
 
-#: ../IkiWiki/Render.pm:372
+#: ../IkiWiki/Render.pm:373
 #, perl-format
 msgid "querying %s for file creation and modification times.."
 msgstr ""
 
-#: ../IkiWiki/Render.pm:446
+#: ../IkiWiki/Render.pm:447
 #, fuzzy, perl-format
 msgid "removing obsolete %s"
 msgstr "જુનાં પાનાં દૂર કરે છે %s"
 
-#: ../IkiWiki/Render.pm:530
+#: ../IkiWiki/Render.pm:531
 #, fuzzy, perl-format
 msgid "building %s, which links to %s"
 msgstr "રેન્ડર કરે છે %s, જે %s સાથે જોડાણ ધરાવે છે"
 
-#: ../IkiWiki/Render.pm:539
+#: ../IkiWiki/Render.pm:540
 #, fuzzy, perl-format
 msgid "removing %s, no longer built by %s"
 msgstr "દૂર કરે છે %s, હવે %s વડે રેન્ડર કરાતું નથી"
 
-#: ../IkiWiki/Render.pm:622 ../IkiWiki/Render.pm:704
+#: ../IkiWiki/Render.pm:623 ../IkiWiki/Render.pm:705
 #, fuzzy, perl-format
 msgid "building %s, which depends on %s"
 msgstr "રેન્ડર કરે છે %s, જે %s પર આધારિત છે"
 
-#: ../IkiWiki/Render.pm:717
+#: ../IkiWiki/Render.pm:718
 #, fuzzy, perl-format
 msgid "building %s, to update its backlinks"
 msgstr "રેન્ડર કરે છે %s, તેનાં પાછળનાં જોડાણો સુધારવા માટે"
 
-#: ../IkiWiki/Render.pm:797
+#: ../IkiWiki/Render.pm:806
 #, fuzzy, perl-format
 msgid "building %s"
 msgstr "%s સુધારે છે"
 
-#: ../IkiWiki/Render.pm:849
+#: ../IkiWiki/Render.pm:871
 #, fuzzy, perl-format
 msgid "ikiwiki: cannot build %s"
 msgstr "ikiwiki: %s રેન્ડર કરી શકાતું નથી"
@@ -1203,27 +1245,31 @@ msgstr ""
 msgid "generating wrappers.."
 msgstr "આવરણ બનાવે છે.."
 
-#: ../IkiWiki/Wrapper.pm:36
+#: ../IkiWiki/Wrapper.pm:37
 #, perl-format
 msgid "%s doesn't seem to be executable"
 msgstr "%s એ ચલાવી શકાય તેમ લાગતું નથી"
 
-#: ../IkiWiki/Wrapper.pm:40
+#: ../IkiWiki/Wrapper.pm:41
 msgid "cannot create a wrapper that uses a setup file"
 msgstr "ગોઠવણ ફાઇલનો ઉપયોગ કરે છે તેનું આવરણ બનાવી શકાતું નથી"
 
-#: ../IkiWiki/Wrapper.pm:44
+#: ../IkiWiki/Wrapper.pm:45
 msgid "wrapper filename not specified"
 msgstr "આવરણ ફાઇલનામ સ્પષ્ટ કરેલ નથી"
 
+#: ../IkiWiki/Wrapper.pm:109
+msgid "Please wait"
+msgstr ""
+
 #. translators: The parameter is a C filename.
-#: ../IkiWiki/Wrapper.pm:220
+#: ../IkiWiki/Wrapper.pm:268
 #, perl-format
 msgid "failed to compile %s"
 msgstr "%s કમ્પાઇલ કરવામાં નિષ્ફળ"
 
 #. translators: The parameter is a filename.
-#: ../IkiWiki/Wrapper.pm:240
+#: ../IkiWiki/Wrapper.pm:288
 #, perl-format
 msgid "successfully generated %s"
 msgstr "સફળતાપૂર્વક પેદા કરેલ છે %s"
@@ -1244,66 +1290,66 @@ msgstr ""
 msgid "usage: --set-yaml var=value"
 msgstr ""
 
-#: ../ikiwiki.in:216
+#: ../ikiwiki.in:214
 msgid "rebuilding wiki.."
 msgstr "વીકી ફરીથી બનાવે છે.."
 
-#: ../ikiwiki.in:219
+#: ../ikiwiki.in:217
 msgid "refreshing wiki.."
 msgstr "વીકીને તાજી કરે છે.."
 
-#: ../IkiWiki.pm:232
+#: ../IkiWiki.pm:248
 msgid "Discussion"
 msgstr "ચર્ચા"
 
-#: ../IkiWiki.pm:557
+#: ../IkiWiki.pm:580
 msgid "Must specify url to wiki with --url when using --cgi"
 msgstr "જ્યારે --cgi ઉપયોગ કરતાં હોય ત્યારે વીકીનું યુઆરએલ સ્પષ્ટ કરવું જ પડશે"
 
-#: ../IkiWiki.pm:605
+#: ../IkiWiki.pm:628
 #, perl-format
 msgid "unsupported umask setting %s"
 msgstr ""
 
-#: ../IkiWiki.pm:645
+#: ../IkiWiki.pm:668
 msgid "cannot use multiple rcs plugins"
 msgstr ""
 
-#: ../IkiWiki.pm:675
+#: ../IkiWiki.pm:698
 #, perl-format
 msgid "failed to load external plugin needed for %s plugin: %s"
 msgstr ""
 
-#: ../IkiWiki.pm:1452
+#: ../IkiWiki.pm:1490
 #, fuzzy, perl-format
 msgid "preprocessing loop detected on %s at depth %i"
 msgstr "%s પર શોધાયેલ લુપ  %s પર ચલાવે છે %i ઉંડાણ પર"
 
-#: ../IkiWiki.pm:1646
+#: ../IkiWiki.pm:1684
 #, fuzzy, perl-format
 msgid "bad file name %s"
 msgstr "ખરાબ ફાઇલ નામ છોડી દે છે %s"
 
-#: ../IkiWiki.pm:1946
+#: ../IkiWiki.pm:1984
 #, perl-format
 msgid "template %s not found"
 msgstr "ટેમ્પલેટ %s મળ્યું નહી"
 
-#: ../IkiWiki.pm:2196
+#: ../IkiWiki.pm:2234
 msgid "yes"
 msgstr ""
 
-#: ../IkiWiki.pm:2273
+#: ../IkiWiki.pm:2318
 #, fuzzy, perl-format
 msgid "invalid sort type %s"
 msgstr "અજાણ્યો ગોઠવણી પ્રકાર %s"
 
-#: ../IkiWiki.pm:2294
+#: ../IkiWiki.pm:2339
 #, perl-format
 msgid "unknown sort type %s"
 msgstr "અજાણ્યો ગોઠવણી પ્રકાર %s"
 
-#: ../IkiWiki.pm:2430
+#: ../IkiWiki.pm:2475
 #, fuzzy, perl-format
 msgid "cannot match pages: %s"
 msgstr "વાંચી શકાતી નથી %s: %s"
index 970b9472443da0d2910c443e3e5cccd4b58b7f6f..1dbd77f7a8bc0ee145b7b2b8d771aaadc8e30b9c 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2012-02-02 22:29-0400\n"
+"POT-Creation-Date: 2014-08-31 14:18-0700\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"
@@ -28,7 +28,7 @@ msgstr ""
 msgid "login failed, perhaps you need to turn on cookies?"
 msgstr ""
 
-#: ../IkiWiki/CGI.pm:222 ../IkiWiki/CGI.pm:373
+#: ../IkiWiki/CGI.pm:222 ../IkiWiki/CGI.pm:374
 msgid "Your login session has expired."
 msgstr ""
 
@@ -52,84 +52,84 @@ msgstr ""
 msgid "You are banned."
 msgstr ""
 
-#: ../IkiWiki/CGI.pm:464 ../IkiWiki/CGI.pm:465 ../IkiWiki.pm:1480
+#: ../IkiWiki/CGI.pm:465 ../IkiWiki/CGI.pm:466 ../IkiWiki.pm:1533
 msgid "Error"
 msgstr ""
 
-#: ../IkiWiki/Plugin/aggregate.pm:95
+#: ../IkiWiki/Plugin/aggregate.pm:86
 msgid "Aggregation triggered via web."
 msgstr ""
 
-#: ../IkiWiki/Plugin/aggregate.pm:104
+#: ../IkiWiki/Plugin/aggregate.pm:95
 msgid "Nothing to do right now, all feeds are up-to-date!"
 msgstr ""
 
-#: ../IkiWiki/Plugin/aggregate.pm:237
+#: ../IkiWiki/Plugin/aggregate.pm:227
 #, perl-format
 msgid "missing %s parameter"
 msgstr ""
 
-#: ../IkiWiki/Plugin/aggregate.pm:272
+#: ../IkiWiki/Plugin/aggregate.pm:262
 msgid "new feed"
 msgstr ""
 
-#: ../IkiWiki/Plugin/aggregate.pm:286
+#: ../IkiWiki/Plugin/aggregate.pm:276
 msgid "posts"
 msgstr ""
 
-#: ../IkiWiki/Plugin/aggregate.pm:288
+#: ../IkiWiki/Plugin/aggregate.pm:278
 msgid "new"
 msgstr ""
 
-#: ../IkiWiki/Plugin/aggregate.pm:475
+#: ../IkiWiki/Plugin/aggregate.pm:465
 #, perl-format
 msgid "expiring %s (%s days old)"
 msgstr ""
 
-#: ../IkiWiki/Plugin/aggregate.pm:482
+#: ../IkiWiki/Plugin/aggregate.pm:472
 #, perl-format
 msgid "expiring %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/aggregate.pm:510
+#: ../IkiWiki/Plugin/aggregate.pm:500
 #, perl-format
 msgid "last checked %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/aggregate.pm:514
+#: ../IkiWiki/Plugin/aggregate.pm:504
 #, perl-format
 msgid "checking feed %s ..."
 msgstr ""
 
-#: ../IkiWiki/Plugin/aggregate.pm:519
+#: ../IkiWiki/Plugin/aggregate.pm:509
 #, perl-format
 msgid "could not find feed at %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/aggregate.pm:542
+#: ../IkiWiki/Plugin/aggregate.pm:529
 msgid "feed not found"
 msgstr ""
 
-#: ../IkiWiki/Plugin/aggregate.pm:553
+#: ../IkiWiki/Plugin/aggregate.pm:540
 #, perl-format
 msgid "(invalid UTF-8 stripped from feed)"
 msgstr ""
 
-#: ../IkiWiki/Plugin/aggregate.pm:561
+#: ../IkiWiki/Plugin/aggregate.pm:548
 #, perl-format
 msgid "(feed entities escaped)"
 msgstr ""
 
-#: ../IkiWiki/Plugin/aggregate.pm:569
+#: ../IkiWiki/Plugin/aggregate.pm:558
 msgid "feed crashed XML::Feed!"
 msgstr ""
 
-#: ../IkiWiki/Plugin/aggregate.pm:661
+#: ../IkiWiki/Plugin/aggregate.pm:652
 #, perl-format
 msgid "creating new page %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/aggregate.pm:689 ../IkiWiki/Plugin/edittemplate.pm:135
+#: ../IkiWiki/Plugin/aggregate.pm:682 ../IkiWiki/Plugin/edittemplate.pm:137
 msgid "failed to process template:"
 msgstr ""
 
@@ -154,7 +154,7 @@ msgstr ""
 msgid "Failed to save file to S3: "
 msgstr ""
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:247
+#: ../IkiWiki/Plugin/amazon_s3.pm:248
 msgid "Failed to delete file from S3: "
 msgstr ""
 
@@ -171,15 +171,15 @@ msgstr ""
 msgid "bad attachment filename"
 msgstr ""
 
-#: ../IkiWiki/Plugin/attachment.pm:296
+#: ../IkiWiki/Plugin/attachment.pm:298
 msgid "attachment upload"
 msgstr ""
 
-#: ../IkiWiki/Plugin/attachment.pm:347
+#: ../IkiWiki/Plugin/attachment.pm:349
 msgid "this attachment is not yet saved"
 msgstr ""
 
-#: ../IkiWiki/Plugin/attachment.pm:365
+#: ../IkiWiki/Plugin/attachment.pm:367
 msgid "just uploaded"
 msgstr ""
 
@@ -188,7 +188,7 @@ msgstr ""
 msgid "creating index page %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/blogspam.pm:118
+#: ../IkiWiki/Plugin/blogspam.pm:119
 msgid ""
 "Sorry, but that looks like spam to <a href=\"http://blogspam.net/"
 "\">blogspam</a>: "
@@ -203,83 +203,87 @@ msgstr ""
 msgid "There are no broken links!"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:113
+#: ../IkiWiki/Plugin/comments.pm:128
 #, perl-format
 msgid "this comment needs %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:116
+#: ../IkiWiki/Plugin/comments.pm:131
 msgid "moderation"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:137 ../IkiWiki/Plugin/format.pm:50
+#: ../IkiWiki/Plugin/comments.pm:158 ../IkiWiki/Plugin/format.pm:50
 #, perl-format
 msgid "unsupported page format %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:142
+#: ../IkiWiki/Plugin/comments.pm:163
 msgid "comment must have content"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:200
+#: ../IkiWiki/Plugin/comments.pm:221
 msgid "Anonymous"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:262
+#: ../IkiWiki/Plugin/comments.pm:283
 msgid "Comment Moderation"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:378 ../IkiWiki/Plugin/editpage.pm:95
-#: ../IkiWiki/Plugin/editpage.pm:101
+#: ../IkiWiki/Plugin/comments.pm:379 ../IkiWiki/Plugin/comments.pm:383
+msgid "email replies to me"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:417 ../IkiWiki/Plugin/editpage.pm:96
+#: ../IkiWiki/Plugin/editpage.pm:102
 msgid "bad page name"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:381
+#: ../IkiWiki/Plugin/comments.pm:420
 #, perl-format
 msgid "commenting on %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:398
+#: ../IkiWiki/Plugin/comments.pm:437
 #, perl-format
 msgid "page '%s' doesn't exist, so you can't comment"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:405
+#: ../IkiWiki/Plugin/comments.pm:444
 #, perl-format
 msgid "comments on page '%s' are closed"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:519
+#: ../IkiWiki/Plugin/comments.pm:569
 msgid "comment stored for moderation"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:521
+#: ../IkiWiki/Plugin/comments.pm:571
 msgid "Your comment will be posted after moderator review"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:534
+#: ../IkiWiki/Plugin/comments.pm:584
 msgid "Added a comment"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:538
+#: ../IkiWiki/Plugin/comments.pm:588
 #, perl-format
 msgid "Added a comment: %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:607 ../IkiWiki/Plugin/userlist.pm:55
+#: ../IkiWiki/Plugin/comments.pm:658 ../IkiWiki/Plugin/userlist.pm:55
 #: ../IkiWiki/Plugin/websetup.pm:272
 msgid "you are not logged in as an admin"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:659
+#: ../IkiWiki/Plugin/comments.pm:717
 msgid "Comment moderation"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:700
+#: ../IkiWiki/Plugin/comments.pm:758
 msgid "comment moderation"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:861
+#: ../IkiWiki/Plugin/comments.pm:921
 #, perl-format
 msgid "%i comment"
 msgid_plural "%i comments"
@@ -289,11 +293,11 @@ msgstr[1] ""
 #. translators: Here "Comment" is a verb;
 #. translators: the user clicks on it to
 #. translators: post a comment.
-#: ../IkiWiki/Plugin/comments.pm:871
+#: ../IkiWiki/Plugin/comments.pm:931
 msgid "Comment"
 msgstr ""
 
-#: ../IkiWiki/Plugin/conditional.pm:28 ../IkiWiki/Plugin/cutpaste.pm:46
+#: ../IkiWiki/Plugin/conditional.pm:27 ../IkiWiki/Plugin/cutpaste.pm:46
 #: ../IkiWiki/Plugin/cutpaste.pm:60 ../IkiWiki/Plugin/cutpaste.pm:75
 #: ../IkiWiki/Plugin/testpagespec.pm:26
 #, perl-format
@@ -314,19 +318,23 @@ msgstr ""
 msgid "removing old preview %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/editpage.pm:117
+#: ../IkiWiki/Plugin/editpage.pm:118
 #, perl-format
 msgid "%s is not an editable page"
 msgstr ""
 
-#: ../IkiWiki/Plugin/editpage.pm:307
+#: ../IkiWiki/Plugin/editpage.pm:166
+msgid "email comments to me"
+msgstr ""
+
+#: ../IkiWiki/Plugin/editpage.pm:319
 #, perl-format
 msgid "creating %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/editpage.pm:325 ../IkiWiki/Plugin/editpage.pm:344
-#: ../IkiWiki/Plugin/editpage.pm:355 ../IkiWiki/Plugin/editpage.pm:400
-#: ../IkiWiki/Plugin/editpage.pm:442
+#: ../IkiWiki/Plugin/editpage.pm:337 ../IkiWiki/Plugin/editpage.pm:356
+#: ../IkiWiki/Plugin/editpage.pm:367 ../IkiWiki/Plugin/editpage.pm:414
+#: ../IkiWiki/Plugin/editpage.pm:456
 #, perl-format
 msgid "editing %s"
 msgstr ""
@@ -370,31 +378,31 @@ msgstr ""
 msgid "%s is an attachment, not a page."
 msgstr ""
 
-#: ../IkiWiki/Plugin/git.pm:777 ../IkiWiki/Plugin/git.pm:840
-#: ../IkiWiki.pm:1700
+#: ../IkiWiki/Plugin/git.pm:839 ../IkiWiki/Plugin/git.pm:902
+#: ../IkiWiki.pm:1753
 #, perl-format
 msgid "you are not allowed to change %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/git.pm:799
+#: ../IkiWiki/Plugin/git.pm:861
 #, perl-format
 msgid "you cannot act on a file with mode %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/git.pm:803
+#: ../IkiWiki/Plugin/git.pm:865
 msgid "you are not allowed to change file modes"
 msgstr ""
 
-#: ../IkiWiki/Plugin/git.pm:873
+#: ../IkiWiki/Plugin/git.pm:935
 msgid "you are not allowed to revert a merge"
 msgstr ""
 
-#: ../IkiWiki/Plugin/git.pm:892
+#: ../IkiWiki/Plugin/git.pm:952
 #, perl-format
 msgid "Failed to revert commit %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/google.pm:26 ../IkiWiki/Plugin/search.pm:41
+#: ../IkiWiki/Plugin/google.pm:26 ../IkiWiki/Plugin/search.pm:48
 #, perl-format
 msgid "Must specify %s when using the %s plugin"
 msgstr ""
@@ -403,21 +411,21 @@ msgstr ""
 msgid "failed to run graphviz"
 msgstr ""
 
-#: ../IkiWiki/Plugin/graphviz.pm:143
+#: ../IkiWiki/Plugin/graphviz.pm:144
 msgid "prog not a valid graphviz program"
 msgstr ""
 
-#: ../IkiWiki/Plugin/highlight.pm:83
+#: ../IkiWiki/Plugin/highlight.pm:91
 #, perl-format
 msgid "tohighlight contains unknown file type '%s'"
 msgstr ""
 
-#: ../IkiWiki/Plugin/highlight.pm:94
+#: ../IkiWiki/Plugin/highlight.pm:102
 #, perl-format
 msgid "Source code: %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/highlight.pm:179
+#: ../IkiWiki/Plugin/highlight.pm:198
 msgid ""
 "warning: highlight perl module not available; falling back to pass through"
 msgstr ""
@@ -462,31 +470,31 @@ msgstr ""
 msgid "missing pages parameter"
 msgstr ""
 
-#: ../IkiWiki/Plugin/inline.pm:192
+#: ../IkiWiki/Plugin/inline.pm:216
 #, perl-format
 msgid "the %s and %s parameters cannot be used together"
 msgstr ""
 
-#: ../IkiWiki/Plugin/inline.pm:297
+#: ../IkiWiki/Plugin/inline.pm:322
 #, perl-format
 msgid "%s (RSS feed)"
 msgstr ""
 
-#: ../IkiWiki/Plugin/inline.pm:301
+#: ../IkiWiki/Plugin/inline.pm:326
 #, perl-format
 msgid "%s (Atom feed)"
 msgstr ""
 
-#: ../IkiWiki/Plugin/inline.pm:330
+#: ../IkiWiki/Plugin/inline.pm:355
 msgid "Add a new post titled:"
 msgstr ""
 
-#: ../IkiWiki/Plugin/inline.pm:369 ../IkiWiki/Plugin/template.pm:44
+#: ../IkiWiki/Plugin/inline.pm:396 ../IkiWiki/Plugin/template.pm:46
 #, perl-format
 msgid "failed to process template %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/inline.pm:695
+#: ../IkiWiki/Plugin/inline.pm:735
 msgid "RPC::XML::Client not found, not pinging"
 msgstr ""
 
@@ -508,36 +516,40 @@ msgstr ""
 msgid "multimarkdown is enabled, but Text::MultiMarkdown is not installed"
 msgstr ""
 
-#: ../IkiWiki/Plugin/mdwn.pm:96
+#: ../IkiWiki/Plugin/mdwn.pm:97
 #, perl-format
 msgid "failed to load Markdown.pm perl module (%s) or /usr/bin/markdown (%s)"
 msgstr ""
 
-#: ../IkiWiki/Plugin/meta.pm:175
-msgid "stylesheet not found"
+#: ../IkiWiki/Plugin/meta.pm:127
+msgid "enclosure not found"
 msgstr ""
 
 #: ../IkiWiki/Plugin/meta.pm:187
+msgid "stylesheet not found"
+msgstr ""
+
+#: ../IkiWiki/Plugin/meta.pm:199
 msgid "script not found"
 msgstr ""
 
-#: ../IkiWiki/Plugin/meta.pm:235
+#: ../IkiWiki/Plugin/meta.pm:247
 msgid "redir page not found"
 msgstr ""
 
-#: ../IkiWiki/Plugin/meta.pm:249
+#: ../IkiWiki/Plugin/meta.pm:261
 msgid "redir cycle is not allowed"
 msgstr ""
 
-#: ../IkiWiki/Plugin/meta.pm:427
+#: ../IkiWiki/Plugin/meta.pm:450
 msgid "sort=meta requires a parameter"
 msgstr ""
 
-#: ../IkiWiki/Plugin/mirrorlist.pm:44
+#: ../IkiWiki/Plugin/mirrorlist.pm:57
 msgid "Mirrors"
 msgstr ""
 
-#: ../IkiWiki/Plugin/mirrorlist.pm:44
+#: ../IkiWiki/Plugin/mirrorlist.pm:57
 msgid "Mirror"
 msgstr ""
 
@@ -549,6 +561,18 @@ msgstr ""
 msgid "more"
 msgstr ""
 
+#: ../IkiWiki/Plugin/notifyemail.pm:72
+msgid "Cannot subscribe your email address without logging in."
+msgstr ""
+
+#: ../IkiWiki/Plugin/notifyemail.pm:136
+msgid "change notification:"
+msgstr ""
+
+#: ../IkiWiki/Plugin/notifyemail.pm:138
+msgid "comment notification:"
+msgstr ""
+
 #: ../IkiWiki/Plugin/openid.pm:71
 #, perl-format
 msgid "failed to load openid module: "
@@ -562,42 +586,50 @@ msgstr ""
 msgid "bad or missing template"
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:231
+#: ../IkiWiki/Plugin/passwordauth.pm:145 ../IkiWiki/Plugin/passwordauth.pm:337
+msgid "Error creating account."
+msgstr ""
+
+#: ../IkiWiki/Plugin/passwordauth.pm:297
 msgid "Your user page: "
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:238
+#: ../IkiWiki/Plugin/passwordauth.pm:304
 msgid "Create your user page"
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:268
+#: ../IkiWiki/Plugin/passwordauth.pm:334
 msgid "Account creation successful. Now you can Login."
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:271
-msgid "Error creating account."
-msgstr ""
-
-#: ../IkiWiki/Plugin/passwordauth.pm:278
+#: ../IkiWiki/Plugin/passwordauth.pm:344
 msgid "No email address, so cannot email password reset instructions."
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:312
+#: ../IkiWiki/Plugin/passwordauth.pm:371
 msgid "Failed to send mail"
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:314
+#: ../IkiWiki/Plugin/passwordauth.pm:373
 msgid "You have been mailed password reset instructions."
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:349
+#: ../IkiWiki/Plugin/passwordauth.pm:408
 msgid "incorrect password reset url"
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:352
+#: ../IkiWiki/Plugin/passwordauth.pm:411
 msgid "password reset denied"
 msgstr ""
 
+#: ../IkiWiki/Plugin/passwordauth.pm:424
+msgid "incorrect url"
+msgstr ""
+
+#: ../IkiWiki/Plugin/passwordauth.pm:427
+msgid "access denied"
+msgstr ""
+
 #: ../IkiWiki/Plugin/pingee.pm:30
 msgid "Ping received."
 msgstr ""
@@ -624,96 +656,100 @@ msgstr ""
 msgid "warning: Old po4a detected! Recommend upgrade to 0.35."
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:180
+#: ../IkiWiki/Plugin/po.pm:179
 #, perl-format
 msgid "%s is not a valid language code"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:192
+#: ../IkiWiki/Plugin/po.pm:191
 #, 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:197
+#: ../IkiWiki/Plugin/po.pm:196
 msgid ""
 "po_link_to=negotiated requires usedirs to be enabled, falling back to "
 "po_link_to=default"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:468
+#: ../IkiWiki/Plugin/po.pm:473
 msgid "updated PO files"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:491
+#: ../IkiWiki/Plugin/po.pm:496
 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:511
+#: ../IkiWiki/Plugin/po.pm:516
 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:957
+#: ../IkiWiki/Plugin/po.pm:975
 #, perl-format
 msgid "POT file (%s) does not exist"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:971
+#: ../IkiWiki/Plugin/po.pm:989
 #, perl-format
 msgid "failed to copy underlay PO file to %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:980
+#: ../IkiWiki/Plugin/po.pm:998
 #, perl-format
 msgid "failed to update %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:986
+#: ../IkiWiki/Plugin/po.pm:1004
 #, perl-format
 msgid "failed to copy the POT file to %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:1022
+#: ../IkiWiki/Plugin/po.pm:1040
 msgid "N/A"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:1033
+#: ../IkiWiki/Plugin/po.pm:1051
 #, perl-format
 msgid "failed to translate %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:1112
+#: ../IkiWiki/Plugin/po.pm:1134
 msgid "removed obsolete PO files"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:1169 ../IkiWiki/Plugin/po.pm:1181
-#: ../IkiWiki/Plugin/po.pm:1220
+#: ../IkiWiki/Plugin/po.pm:1191 ../IkiWiki/Plugin/po.pm:1203
+#: ../IkiWiki/Plugin/po.pm:1242
 #, perl-format
 msgid "failed to write %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:1179
+#: ../IkiWiki/Plugin/po.pm:1201
 msgid "failed to translate"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:1232
+#: ../IkiWiki/Plugin/po.pm:1254
 msgid "invalid gettext data, go back to previous page to continue edit"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:1275
+#: ../IkiWiki/Plugin/po.pm:1297
 #, perl-format
 msgid "%s has invalid syntax: must use CODE|NAME"
 msgstr ""
 
-#: ../IkiWiki/Plugin/poll.pm:70
+#: ../IkiWiki/Plugin/poll.pm:72 ../IkiWiki/Plugin/poll.pm:87
 msgid "vote"
 msgstr ""
 
-#: ../IkiWiki/Plugin/poll.pm:78
+#: ../IkiWiki/Plugin/poll.pm:86
+msgid "Write in"
+msgstr ""
+
+#: ../IkiWiki/Plugin/poll.pm:93
 msgid "Total votes:"
 msgstr ""
 
@@ -816,35 +852,35 @@ msgstr ""
 msgid "confirm reversion of %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/recentchangesdiff.pm:47
+#: ../IkiWiki/Plugin/recentchangesdiff.pm:49
 msgid "(Diff truncated)"
 msgstr ""
 
-#: ../IkiWiki/Plugin/remove.pm:32 ../IkiWiki/Plugin/rename.pm:37
+#: ../IkiWiki/Plugin/remove.pm:39 ../IkiWiki/Plugin/rename.pm:37
 #, perl-format
 msgid "%s does not exist"
 msgstr ""
 
-#: ../IkiWiki/Plugin/remove.pm:39
+#: ../IkiWiki/Plugin/remove.pm:56
 #, perl-format
 msgid "%s is not in the srcdir, so it cannot be deleted"
 msgstr ""
 
-#: ../IkiWiki/Plugin/remove.pm:42 ../IkiWiki/Plugin/rename.pm:46
+#: ../IkiWiki/Plugin/remove.pm:59 ../IkiWiki/Plugin/rename.pm:46
 #, perl-format
 msgid "%s is not a file"
 msgstr ""
 
-#: ../IkiWiki/Plugin/remove.pm:149
+#: ../IkiWiki/Plugin/remove.pm:166
 #, perl-format
 msgid "confirm removal of %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/remove.pm:186
+#: ../IkiWiki/Plugin/remove.pm:203
 msgid "Please select the attachments to remove."
 msgstr ""
 
-#: ../IkiWiki/Plugin/remove.pm:230
+#: ../IkiWiki/Plugin/remove.pm:263
 msgid "removed"
 msgstr ""
 
@@ -881,20 +917,20 @@ msgstr ""
 msgid "Also rename SubPages and attachments"
 msgstr ""
 
-#: ../IkiWiki/Plugin/rename.pm:258
+#: ../IkiWiki/Plugin/rename.pm:266
 msgid "Only one attachment can be renamed at a time."
 msgstr ""
 
-#: ../IkiWiki/Plugin/rename.pm:261
+#: ../IkiWiki/Plugin/rename.pm:269
 msgid "Please select the attachment to rename."
 msgstr ""
 
-#: ../IkiWiki/Plugin/rename.pm:371
+#: ../IkiWiki/Plugin/rename.pm:379
 #, perl-format
 msgid "rename %s to %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/rename.pm:597
+#: ../IkiWiki/Plugin/rename.pm:605
 #, perl-format
 msgid "update for rename of %s to %s"
 msgstr ""
@@ -909,12 +945,12 @@ msgstr ""
 msgid "rsync_command exited %d"
 msgstr ""
 
-#: ../IkiWiki/Plugin/search.pm:199
+#: ../IkiWiki/Plugin/search.pm:216
 #, perl-format
 msgid "need Digest::SHA to index %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/search.pm:253
+#: ../IkiWiki/Plugin/search.pm:270
 msgid "search"
 msgstr ""
 
@@ -1014,6 +1050,11 @@ msgstr ""
 msgid "failed to generate image from code"
 msgstr ""
 
+#: ../IkiWiki/Plugin/trail.pm:393
+#, perl-format
+msgid "building %s, its previous or next page has changed"
+msgstr ""
+
 #: ../IkiWiki/Plugin/transient.pm:45
 #, perl-format
 msgid "removing transient version of %s"
@@ -1080,59 +1121,59 @@ msgstr ""
 msgid "scanning %s"
 msgstr ""
 
-#: ../IkiWiki/Render.pm:280
+#: ../IkiWiki/Render.pm:281
 #, perl-format
 msgid ""
 "symlink found in srcdir path (%s) -- set allow_symlinks_before_srcdir to "
 "allow this"
 msgstr ""
 
-#: ../IkiWiki/Render.pm:316
+#: ../IkiWiki/Render.pm:332 ../IkiWiki/Render.pm:393
 #, perl-format
 msgid "skipping bad filename %s"
 msgstr ""
 
-#: ../IkiWiki/Render.pm:332
+#: ../IkiWiki/Render.pm:349 ../IkiWiki/Render.pm:398
 #, perl-format
 msgid "%s has multiple possible source pages"
 msgstr ""
 
-#: ../IkiWiki/Render.pm:372
+#: ../IkiWiki/Render.pm:435
 #, perl-format
 msgid "querying %s for file creation and modification times.."
 msgstr ""
 
-#: ../IkiWiki/Render.pm:446
+#: ../IkiWiki/Render.pm:509
 #, perl-format
 msgid "removing obsolete %s"
 msgstr ""
 
-#: ../IkiWiki/Render.pm:530
+#: ../IkiWiki/Render.pm:593
 #, perl-format
 msgid "building %s, which links to %s"
 msgstr ""
 
-#: ../IkiWiki/Render.pm:539
+#: ../IkiWiki/Render.pm:602
 #, perl-format
 msgid "removing %s, no longer built by %s"
 msgstr ""
 
-#: ../IkiWiki/Render.pm:622 ../IkiWiki/Render.pm:704
+#: ../IkiWiki/Render.pm:685 ../IkiWiki/Render.pm:767
 #, perl-format
 msgid "building %s, which depends on %s"
 msgstr ""
 
-#: ../IkiWiki/Render.pm:717
+#: ../IkiWiki/Render.pm:780
 #, perl-format
 msgid "building %s, to update its backlinks"
 msgstr ""
 
-#: ../IkiWiki/Render.pm:797
+#: ../IkiWiki/Render.pm:883
 #, perl-format
 msgid "building %s"
 msgstr ""
 
-#: ../IkiWiki/Render.pm:849
+#: ../IkiWiki/Render.pm:948
 #, perl-format
 msgid "ikiwiki: cannot build %s"
 msgstr ""
@@ -1176,27 +1217,31 @@ msgstr ""
 msgid "generating wrappers.."
 msgstr ""
 
-#: ../IkiWiki/Wrapper.pm:36
+#: ../IkiWiki/Wrapper.pm:37
 #, perl-format
 msgid "%s doesn't seem to be executable"
 msgstr ""
 
-#: ../IkiWiki/Wrapper.pm:40
+#: ../IkiWiki/Wrapper.pm:41
 msgid "cannot create a wrapper that uses a setup file"
 msgstr ""
 
-#: ../IkiWiki/Wrapper.pm:44
+#: ../IkiWiki/Wrapper.pm:45
 msgid "wrapper filename not specified"
 msgstr ""
 
+#: ../IkiWiki/Wrapper.pm:109
+msgid "Please wait"
+msgstr ""
+
 #. translators: The parameter is a C filename.
-#: ../IkiWiki/Wrapper.pm:220
+#: ../IkiWiki/Wrapper.pm:268
 #, perl-format
 msgid "failed to compile %s"
 msgstr ""
 
 #. translators: The parameter is a filename.
-#: ../IkiWiki/Wrapper.pm:240
+#: ../IkiWiki/Wrapper.pm:288
 #, perl-format
 msgid "successfully generated %s"
 msgstr ""
@@ -1225,58 +1270,58 @@ msgstr ""
 msgid "refreshing wiki.."
 msgstr ""
 
-#: ../IkiWiki.pm:232
+#: ../IkiWiki.pm:255
 msgid "Discussion"
 msgstr ""
 
-#: ../IkiWiki.pm:557
+#: ../IkiWiki.pm:595
 msgid "Must specify url to wiki with --url when using --cgi"
 msgstr ""
 
-#: ../IkiWiki.pm:605
+#: ../IkiWiki.pm:643
 #, perl-format
 msgid "unsupported umask setting %s"
 msgstr ""
 
-#: ../IkiWiki.pm:645
+#: ../IkiWiki.pm:683
 msgid "cannot use multiple rcs plugins"
 msgstr ""
 
-#: ../IkiWiki.pm:675
+#: ../IkiWiki.pm:713
 #, perl-format
 msgid "failed to load external plugin needed for %s plugin: %s"
 msgstr ""
 
-#: ../IkiWiki.pm:1462
+#: ../IkiWiki.pm:1515
 #, perl-format
 msgid "preprocessing loop detected on %s at depth %i"
 msgstr ""
 
-#: ../IkiWiki.pm:1656
+#: ../IkiWiki.pm:1709
 #, perl-format
 msgid "bad file name %s"
 msgstr ""
 
-#: ../IkiWiki.pm:1956
+#: ../IkiWiki.pm:2019
 #, perl-format
 msgid "template %s not found"
 msgstr ""
 
-#: ../IkiWiki.pm:2206
+#: ../IkiWiki.pm:2269
 msgid "yes"
 msgstr ""
 
-#: ../IkiWiki.pm:2283
+#: ../IkiWiki.pm:2354
 #, perl-format
 msgid "invalid sort type %s"
 msgstr ""
 
-#: ../IkiWiki.pm:2304
+#: ../IkiWiki.pm:2375
 #, perl-format
 msgid "unknown sort type %s"
 msgstr ""
 
-#: ../IkiWiki.pm:2440
+#: ../IkiWiki.pm:2511
 #, perl-format
 msgid "cannot match pages: %s"
 msgstr ""
index 872a39e6218d1cb0759999c8911db99f2ceb03cd..c7e59e4f4b816e18d09be5aac1b13f3d97c84fb2 100644 (file)
--- a/po/it.po
+++ b/po/it.po
@@ -5,7 +5,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Ikiwiki\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-11-30 16:33-0400\n"
+"POT-Creation-Date: 2013-09-04 10:16-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"
@@ -50,85 +50,85 @@ msgstr "Preferenze salvate."
 msgid "You are banned."
 msgstr "Avete ricevuto un ban."
 
-#: ../IkiWiki/CGI.pm:464 ../IkiWiki/CGI.pm:465 ../IkiWiki.pm:1470
+#: ../IkiWiki/CGI.pm:464 ../IkiWiki/CGI.pm:465 ../IkiWiki.pm:1508
 msgid "Error"
 msgstr "Errore"
 
-#: ../IkiWiki/Plugin/aggregate.pm:95
+#: ../IkiWiki/Plugin/aggregate.pm:86
 msgid "Aggregation triggered via web."
 msgstr "Aggregazione attivata dal web."
 
-#: ../IkiWiki/Plugin/aggregate.pm:104
+#: ../IkiWiki/Plugin/aggregate.pm:95
 msgid "Nothing to do right now, all feeds are up-to-date!"
 msgstr ""
 "Nessuna azione da intraprendere, tutti i notiziari sono già aggiornati."
 
-#: ../IkiWiki/Plugin/aggregate.pm:237
+#: ../IkiWiki/Plugin/aggregate.pm:227
 #, perl-format
 msgid "missing %s parameter"
 msgstr "parametro %s mancante"
 
-#: ../IkiWiki/Plugin/aggregate.pm:272
+#: ../IkiWiki/Plugin/aggregate.pm:262
 msgid "new feed"
 msgstr "nuovo notiziario"
 
-#: ../IkiWiki/Plugin/aggregate.pm:286
+#: ../IkiWiki/Plugin/aggregate.pm:276
 msgid "posts"
 msgstr "articoli"
 
-#: ../IkiWiki/Plugin/aggregate.pm:288
+#: ../IkiWiki/Plugin/aggregate.pm:278
 msgid "new"
 msgstr "nuovo"
 
-#: ../IkiWiki/Plugin/aggregate.pm:475
+#: ../IkiWiki/Plugin/aggregate.pm:465
 #, perl-format
 msgid "expiring %s (%s days old)"
 msgstr "in scadenza %s (vecchio di %s giorni)"
 
-#: ../IkiWiki/Plugin/aggregate.pm:482
+#: ../IkiWiki/Plugin/aggregate.pm:472
 #, perl-format
 msgid "expiring %s"
 msgstr "in scadenza %s"
 
-#: ../IkiWiki/Plugin/aggregate.pm:510
+#: ../IkiWiki/Plugin/aggregate.pm:500
 #, perl-format
 msgid "last checked %s"
 msgstr "ultimo controllo %s"
 
-#: ../IkiWiki/Plugin/aggregate.pm:514
+#: ../IkiWiki/Plugin/aggregate.pm:504
 #, perl-format
 msgid "checking feed %s ..."
 msgstr "controllo notiziario %s..."
 
-#: ../IkiWiki/Plugin/aggregate.pm:519
+#: ../IkiWiki/Plugin/aggregate.pm:509
 #, perl-format
 msgid "could not find feed at %s"
 msgstr "impossibile trovare il notiziario %s"
 
-#: ../IkiWiki/Plugin/aggregate.pm:542
+#: ../IkiWiki/Plugin/aggregate.pm:529
 msgid "feed not found"
 msgstr "notiziario non trovato"
 
-#: ../IkiWiki/Plugin/aggregate.pm:553
+#: ../IkiWiki/Plugin/aggregate.pm:540
 #, perl-format
 msgid "(invalid UTF-8 stripped from feed)"
 msgstr "(codifica UTF-8 non valida eliminata dal notiziario)"
 
-#: ../IkiWiki/Plugin/aggregate.pm:561
+#: ../IkiWiki/Plugin/aggregate.pm:548
 #, perl-format
 msgid "(feed entities escaped)"
 msgstr "(entità del notiziario espanse con escape)"
 
-#: ../IkiWiki/Plugin/aggregate.pm:569
+#: ../IkiWiki/Plugin/aggregate.pm:556
 msgid "feed crashed XML::Feed!"
 msgstr "il notiziario ha fatto andare in crash XML::Feed."
 
-#: ../IkiWiki/Plugin/aggregate.pm:661
+#: ../IkiWiki/Plugin/aggregate.pm:649
 #, perl-format
 msgid "creating new page %s"
 msgstr "creazione nuova pagina %s"
 
-#: ../IkiWiki/Plugin/aggregate.pm:689 ../IkiWiki/Plugin/edittemplate.pm:135
+#: ../IkiWiki/Plugin/aggregate.pm:677 ../IkiWiki/Plugin/edittemplate.pm:135
 #, fuzzy
 msgid "failed to process template:"
 msgstr "errore nell'elaborazione:"
@@ -137,7 +137,7 @@ msgstr "errore nell'elaborazione:"
 msgid "deleting bucket.."
 msgstr "eliminazione contenitore..."
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:227
+#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:225
 msgid "done"
 msgstr "fatto"
 
@@ -154,7 +154,7 @@ msgstr "Impossibile creare il contenitore S3: "
 msgid "Failed to save file to S3: "
 msgstr "Impossibile salvare il file sul S3: "
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:247
+#: ../IkiWiki/Plugin/amazon_s3.pm:248
 msgid "Failed to delete file from S3: "
 msgstr "Impossibile eliminare il file dal S3: "
 
@@ -171,16 +171,16 @@ msgstr "non permesso da allowed_attachments"
 msgid "bad attachment filename"
 msgstr "nome file dell'allegato non valido"
 
-#: ../IkiWiki/Plugin/attachment.pm:295
+#: ../IkiWiki/Plugin/attachment.pm:296
 msgid "attachment upload"
 msgstr "carica allegato"
 
-#: ../IkiWiki/Plugin/attachment.pm:346
+#: ../IkiWiki/Plugin/attachment.pm:347
 #, fuzzy
 msgid "this attachment is not yet saved"
 msgstr "%s è un allegato, non una pagina."
 
-#: ../IkiWiki/Plugin/attachment.pm:363
+#: ../IkiWiki/Plugin/attachment.pm:365
 msgid "just uploaded"
 msgstr ""
 
@@ -189,7 +189,7 @@ msgstr ""
 msgid "creating index page %s"
 msgstr "creazione nuova pagina %s"
 
-#: ../IkiWiki/Plugin/blogspam.pm:118
+#: ../IkiWiki/Plugin/blogspam.pm:119
 msgid ""
 "Sorry, but that looks like spam to <a href=\"http://blogspam.net/"
 "\">blogspam</a>: "
@@ -206,85 +206,89 @@ msgstr "%s da %s"
 msgid "There are no broken links!"
 msgstr "Non ci sono collegamenti rotti."
 
-#: ../IkiWiki/Plugin/comments.pm:114
+#: ../IkiWiki/Plugin/comments.pm:124
 #, fuzzy, perl-format
 msgid "this comment needs %s"
 msgstr "commento su %s"
 
-#: ../IkiWiki/Plugin/comments.pm:117
+#: ../IkiWiki/Plugin/comments.pm:127
 #, fuzzy
 msgid "moderation"
 msgstr "Moderazione commenti"
 
-#: ../IkiWiki/Plugin/comments.pm:138 ../IkiWiki/Plugin/format.pm:50
+#: ../IkiWiki/Plugin/comments.pm:154 ../IkiWiki/Plugin/format.pm:50
 #, perl-format
 msgid "unsupported page format %s"
 msgstr "formato pagina %s non supportato"
 
-#: ../IkiWiki/Plugin/comments.pm:143
+#: ../IkiWiki/Plugin/comments.pm:159
 msgid "comment must have content"
 msgstr "i commenti devono avere un contenuto"
 
-#: ../IkiWiki/Plugin/comments.pm:201
+#: ../IkiWiki/Plugin/comments.pm:217
 msgid "Anonymous"
 msgstr "Anonimo"
 
-#: ../IkiWiki/Plugin/comments.pm:263
+#: ../IkiWiki/Plugin/comments.pm:279
 #, fuzzy
 msgid "Comment Moderation"
 msgstr "Moderazione commenti"
 
-#: ../IkiWiki/Plugin/comments.pm:379 ../IkiWiki/Plugin/editpage.pm:95
-#: ../IkiWiki/Plugin/editpage.pm:101
+#: ../IkiWiki/Plugin/comments.pm:375 ../IkiWiki/Plugin/comments.pm:379
+msgid "email replies to me"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:413 ../IkiWiki/Plugin/editpage.pm:96
+#: ../IkiWiki/Plugin/editpage.pm:102
 msgid "bad page name"
 msgstr "nome pagina non valido"
 
-#: ../IkiWiki/Plugin/comments.pm:382
+#: ../IkiWiki/Plugin/comments.pm:416
 #, perl-format
 msgid "commenting on %s"
 msgstr "commento su %s"
 
-#: ../IkiWiki/Plugin/comments.pm:399
+#: ../IkiWiki/Plugin/comments.pm:433
 #, 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:406
+#: ../IkiWiki/Plugin/comments.pm:440
 #, perl-format
 msgid "comments on page '%s' are closed"
 msgstr "i commenti per la pagina «%s» sono chiusi"
 
-#: ../IkiWiki/Plugin/comments.pm:520
+#: ../IkiWiki/Plugin/comments.pm:565
 msgid "comment stored for moderation"
 msgstr "commento trattenuto per moderazione"
 
-#: ../IkiWiki/Plugin/comments.pm:522
+#: ../IkiWiki/Plugin/comments.pm:567
 msgid "Your comment will be posted after moderator review"
 msgstr "Il commento sarà pubblicato dopo la verifica del moderatore"
 
-#: ../IkiWiki/Plugin/comments.pm:535
+#: ../IkiWiki/Plugin/comments.pm:580
 msgid "Added a comment"
 msgstr "Aggiunto commento"
 
-#: ../IkiWiki/Plugin/comments.pm:539
+#: ../IkiWiki/Plugin/comments.pm:584
 #, perl-format
 msgid "Added a comment: %s"
 msgstr "Aggiunto commento: %s"
 
-#: ../IkiWiki/Plugin/comments.pm:608 ../IkiWiki/Plugin/userlist.pm:55
+#: ../IkiWiki/Plugin/comments.pm:654 ../IkiWiki/Plugin/userlist.pm:55
 #: ../IkiWiki/Plugin/websetup.pm:272
 msgid "you are not logged in as an admin"
 msgstr "non siete autenticati come amministratore"
 
-#: ../IkiWiki/Plugin/comments.pm:660
+#: ../IkiWiki/Plugin/comments.pm:708
 msgid "Comment moderation"
 msgstr "Moderazione commenti"
 
-#: ../IkiWiki/Plugin/comments.pm:701
+#: ../IkiWiki/Plugin/comments.pm:749
 msgid "comment moderation"
 msgstr "moderazione commento"
 
-#: ../IkiWiki/Plugin/comments.pm:862
+#: ../IkiWiki/Plugin/comments.pm:910
 #, fuzzy, perl-format
 msgid "%i comment"
 msgid_plural "%i comments"
@@ -294,12 +298,12 @@ msgstr[1] "Commenti"
 #. translators: Here "Comment" is a verb;
 #. translators: the user clicks on it to
 #. translators: post a comment.
-#: ../IkiWiki/Plugin/comments.pm:872
+#: ../IkiWiki/Plugin/comments.pm:920
 #, fuzzy
 msgid "Comment"
 msgstr "Commenti"
 
-#: ../IkiWiki/Plugin/conditional.pm:28 ../IkiWiki/Plugin/cutpaste.pm:46
+#: ../IkiWiki/Plugin/conditional.pm:27 ../IkiWiki/Plugin/cutpaste.pm:46
 #: ../IkiWiki/Plugin/cutpaste.pm:60 ../IkiWiki/Plugin/cutpaste.pm:75
 #: ../IkiWiki/Plugin/testpagespec.pm:26
 #, perl-format
@@ -320,19 +324,24 @@ msgstr "nessun testo è stato copiato in questa pagina con l'id %s"
 msgid "removing old preview %s"
 msgstr "rimozione vecchia anteprima %s"
 
-#: ../IkiWiki/Plugin/editpage.pm:117
+#: ../IkiWiki/Plugin/editpage.pm:118
 #, perl-format
 msgid "%s is not an editable page"
 msgstr "%s non è una pagina modificabile"
 
-#: ../IkiWiki/Plugin/editpage.pm:307
+#: ../IkiWiki/Plugin/editpage.pm:166
+#, fuzzy
+msgid "email comments to me"
+msgstr "Commenti"
+
+#: ../IkiWiki/Plugin/editpage.pm:319
 #, perl-format
 msgid "creating %s"
 msgstr "creazione %s"
 
-#: ../IkiWiki/Plugin/editpage.pm:325 ../IkiWiki/Plugin/editpage.pm:344
-#: ../IkiWiki/Plugin/editpage.pm:355 ../IkiWiki/Plugin/editpage.pm:400
-#: ../IkiWiki/Plugin/editpage.pm:442
+#: ../IkiWiki/Plugin/editpage.pm:337 ../IkiWiki/Plugin/editpage.pm:356
+#: ../IkiWiki/Plugin/editpage.pm:367 ../IkiWiki/Plugin/editpage.pm:412
+#: ../IkiWiki/Plugin/editpage.pm:454
 #, perl-format
 msgid "editing %s"
 msgstr "modifica %s"
@@ -376,27 +385,27 @@ msgstr "non è una pagina"
 msgid "%s is an attachment, not a page."
 msgstr "%s è un allegato, non una pagina."
 
-#: ../IkiWiki/Plugin/git.pm:777 ../IkiWiki/Plugin/git.pm:840
-#: ../IkiWiki.pm:1690
+#: ../IkiWiki/Plugin/git.pm:789 ../IkiWiki/Plugin/git.pm:852
+#: ../IkiWiki.pm:1728
 #, perl-format
 msgid "you are not allowed to change %s"
 msgstr "non è permesso modificare %s"
 
-#: ../IkiWiki/Plugin/git.pm:799
+#: ../IkiWiki/Plugin/git.pm:811
 #, 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:803
+#: ../IkiWiki/Plugin/git.pm:815
 msgid "you are not allowed to change file modes"
 msgstr "non è permesso cambiare la modalità del file"
 
-#: ../IkiWiki/Plugin/git.pm:873
+#: ../IkiWiki/Plugin/git.pm:885
 #, fuzzy
 msgid "you are not allowed to revert a merge"
 msgstr "non è permesso modificare %s"
 
-#: ../IkiWiki/Plugin/git.pm:892
+#: ../IkiWiki/Plugin/git.pm:902
 #, fuzzy, perl-format
 msgid "Failed to revert commit %s"
 msgstr "errore nel compilare %s"
@@ -410,7 +419,7 @@ msgstr "Occorre specificare %s quando si usa il plugin %s"
 msgid "failed to run graphviz"
 msgstr "errore nell'eseguire graphviz"
 
-#: ../IkiWiki/Plugin/graphviz.pm:143
+#: ../IkiWiki/Plugin/graphviz.pm:144
 msgid "prog not a valid graphviz program"
 msgstr "prog non è un programma graphviz valido"
 
@@ -424,7 +433,7 @@ msgstr "tohighlight contiene il tipo di file sconosciuto «%s»"
 msgid "Source code: %s"
 msgstr "Sorgente: %s"
 
-#: ../IkiWiki/Plugin/highlight.pm:179
+#: ../IkiWiki/Plugin/highlight.pm:180
 msgid ""
 "warning: highlight perl module not available; falling back to pass through"
 msgstr ""
@@ -472,31 +481,31 @@ msgstr "modifica della pagina non ammessa"
 msgid "missing pages parameter"
 msgstr "parametro pagine mancante"
 
-#: ../IkiWiki/Plugin/inline.pm:192
+#: ../IkiWiki/Plugin/inline.pm:209
 #, 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:297
+#: ../IkiWiki/Plugin/inline.pm:315
 #, perl-format
 msgid "%s (RSS feed)"
 msgstr ""
 
-#: ../IkiWiki/Plugin/inline.pm:301
+#: ../IkiWiki/Plugin/inline.pm:319
 #, perl-format
 msgid "%s (Atom feed)"
 msgstr ""
 
-#: ../IkiWiki/Plugin/inline.pm:330
+#: ../IkiWiki/Plugin/inline.pm:348
 msgid "Add a new post titled:"
 msgstr "Aggiungere un nuovo articolo dal titolo:"
 
-#: ../IkiWiki/Plugin/inline.pm:369 ../IkiWiki/Plugin/template.pm:44
+#: ../IkiWiki/Plugin/inline.pm:387 ../IkiWiki/Plugin/template.pm:44
 #, fuzzy, perl-format
 msgid "failed to process template %s"
 msgstr "errore nell'elaborazione:"
 
-#: ../IkiWiki/Plugin/inline.pm:695
+#: ../IkiWiki/Plugin/inline.pm:725
 msgid "RPC::XML::Client not found, not pinging"
 msgstr "RPC::XML::Client non trovato, impossibile inviare ping"
 
@@ -514,44 +523,49 @@ msgstr ""
 msgid "%s is locked and cannot be edited"
 msgstr "%s è bloccata e non può essere modificata"
 
-#: ../IkiWiki/Plugin/mdwn.pm:45
+#: ../IkiWiki/Plugin/mdwn.pm:52
 msgid "multimarkdown is enabled, but Text::MultiMarkdown is not installed"
 msgstr ""
 "multimarkdown è stato abilitato, ma Text::MultiMarkdown non è aggiornato"
 
-#: ../IkiWiki/Plugin/mdwn.pm:70
+#: ../IkiWiki/Plugin/mdwn.pm:96
 #, 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:175
+#: ../IkiWiki/Plugin/meta.pm:127
+#, fuzzy
+msgid "enclosure not found"
+msgstr "notiziario non trovato"
+
+#: ../IkiWiki/Plugin/meta.pm:187
 msgid "stylesheet not found"
 msgstr "foglio di stile non trovato"
 
-#: ../IkiWiki/Plugin/meta.pm:187
+#: ../IkiWiki/Plugin/meta.pm:199
 #, fuzzy
 msgid "script not found"
 msgstr "notiziario non trovato"
 
-#: ../IkiWiki/Plugin/meta.pm:235
+#: ../IkiWiki/Plugin/meta.pm:247
 msgid "redir page not found"
 msgstr "pagina di reindirizzamento non trovata"
 
-#: ../IkiWiki/Plugin/meta.pm:249
+#: ../IkiWiki/Plugin/meta.pm:261
 msgid "redir cycle is not allowed"
 msgstr "ciclo di reindirizzamento non ammesso"
 
-#: ../IkiWiki/Plugin/meta.pm:427
+#: ../IkiWiki/Plugin/meta.pm:450
 #, fuzzy
 msgid "sort=meta requires a parameter"
 msgstr "sono richiesti i parametri \"to\" e \"from\""
 
-#: ../IkiWiki/Plugin/mirrorlist.pm:44
+#: ../IkiWiki/Plugin/mirrorlist.pm:57
 msgid "Mirrors"
 msgstr "Mirror"
 
-#: ../IkiWiki/Plugin/mirrorlist.pm:44
+#: ../IkiWiki/Plugin/mirrorlist.pm:57
 msgid "Mirror"
 msgstr "Mirror"
 
@@ -564,6 +578,19 @@ msgstr "moderazione commento"
 msgid "more"
 msgstr "altro"
 
+#: ../IkiWiki/Plugin/notifyemail.pm:72
+msgid "Cannot subscribe your email address without logging in."
+msgstr ""
+
+#: ../IkiWiki/Plugin/notifyemail.pm:136
+msgid "change notification:"
+msgstr ""
+
+#: ../IkiWiki/Plugin/notifyemail.pm:138
+#, fuzzy
+msgid "comment notification:"
+msgstr "moderazione commento"
+
 #: ../IkiWiki/Plugin/openid.pm:71
 #, fuzzy, perl-format
 msgid "failed to load openid module: "
@@ -577,45 +604,54 @@ 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:231
+#: ../IkiWiki/Plugin/passwordauth.pm:145 ../IkiWiki/Plugin/passwordauth.pm:337
+msgid "Error creating account."
+msgstr "Errore nella creazione dell'account."
+
+#: ../IkiWiki/Plugin/passwordauth.pm:297
 msgid "Your user page: "
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:238
+#: ../IkiWiki/Plugin/passwordauth.pm:304
 msgid "Create your user page"
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:268
+#: ../IkiWiki/Plugin/passwordauth.pm:334
 msgid "Account creation successful. Now you can Login."
 msgstr "Account creato con successo. È ora possibile effettuare l'accesso."
 
-#: ../IkiWiki/Plugin/passwordauth.pm:271
-msgid "Error creating account."
-msgstr "Errore nella creazione dell'account."
-
-#: ../IkiWiki/Plugin/passwordauth.pm:278
+#: ../IkiWiki/Plugin/passwordauth.pm:344
 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:312
+#: ../IkiWiki/Plugin/passwordauth.pm:371
 msgid "Failed to send mail"
 msgstr "Impossibile spedire il messaggio"
 
-#: ../IkiWiki/Plugin/passwordauth.pm:314
+#: ../IkiWiki/Plugin/passwordauth.pm:373
 msgid "You have been mailed password reset instructions."
 msgstr ""
 "Il messaggio con le istruzioni per reimpostare la password è stato inviato."
 
-#: ../IkiWiki/Plugin/passwordauth.pm:349
+#: ../IkiWiki/Plugin/passwordauth.pm:408
 msgid "incorrect password reset url"
 msgstr "url per il reset della password non corretto"
 
-#: ../IkiWiki/Plugin/passwordauth.pm:352
+#: ../IkiWiki/Plugin/passwordauth.pm:411
 msgid "password reset denied"
 msgstr "reset della password non permesso"
 
+#: ../IkiWiki/Plugin/passwordauth.pm:424
+#, fuzzy
+msgid "incorrect url"
+msgstr "url per il reset della password non corretto"
+
+#: ../IkiWiki/Plugin/passwordauth.pm:427
+msgid "access denied"
+msgstr ""
+
 #: ../IkiWiki/Plugin/pingee.pm:30
 msgid "Ping received."
 msgstr "Ping ricevuto."
@@ -644,19 +680,19 @@ msgstr ""
 "attenzione: è presente un vecchio po4a. Si raccomanda di aggiornare almeno "
 "alla versione 0.35."
 
-#: ../IkiWiki/Plugin/po.pm:180
+#: ../IkiWiki/Plugin/po.pm:179
 #, perl-format
 msgid "%s is not a valid language code"
 msgstr "%s non è una codifica di lingua valida"
 
-#: ../IkiWiki/Plugin/po.pm:192
+#: ../IkiWiki/Plugin/po.pm:191
 #, 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:197
+#: ../IkiWiki/Plugin/po.pm:196
 msgid ""
 "po_link_to=negotiated requires usedirs to be enabled, falling back to "
 "po_link_to=default"
@@ -664,11 +700,11 @@ msgstr ""
 "po_link_to=negotiated richiede che venga abilitato usedirs, verrà utilizzato "
 "po_link_to=default"
 
-#: ../IkiWiki/Plugin/po.pm:468
+#: ../IkiWiki/Plugin/po.pm:467
 msgid "updated PO files"
 msgstr "file PO aggiornati"
 
-#: ../IkiWiki/Plugin/po.pm:491
+#: ../IkiWiki/Plugin/po.pm:490
 msgid ""
 "Can not remove a translation. If the master page is removed, however, its "
 "translations will be removed as well."
@@ -676,7 +712,7 @@ msgstr ""
 "Impossibile eliminare una traduzione. Tuttavia, se la pagina principale è "
 "stata eliminata anche le traduzioni lo saranno."
 
-#: ../IkiWiki/Plugin/po.pm:511
+#: ../IkiWiki/Plugin/po.pm:510
 msgid ""
 "Can not rename a translation. If the master page is renamed, however, its "
 "translations will be renamed as well."
@@ -684,65 +720,69 @@ msgstr ""
 "Impossibile rinominare una traduzione. Tuttavia, se la pagina principale è "
 "stata rinominata anche le traduzioni lo saranno."
 
-#: ../IkiWiki/Plugin/po.pm:957
+#: ../IkiWiki/Plugin/po.pm:956
 #, perl-format
 msgid "POT file (%s) does not exist"
 msgstr "Il file POT (%s) non esiste"
 
-#: ../IkiWiki/Plugin/po.pm:971
+#: ../IkiWiki/Plugin/po.pm:970
 #, 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:980
+#: ../IkiWiki/Plugin/po.pm:979
 #, perl-format
 msgid "failed to update %s"
 msgstr "impossibile aggiornare %s"
 
-#: ../IkiWiki/Plugin/po.pm:986
+#: ../IkiWiki/Plugin/po.pm:985
 #, perl-format
 msgid "failed to copy the POT file to %s"
 msgstr "impossibile copiare il file POT in %s"
 
-#: ../IkiWiki/Plugin/po.pm:1022
+#: ../IkiWiki/Plugin/po.pm:1021
 msgid "N/A"
 msgstr "N/D"
 
-#: ../IkiWiki/Plugin/po.pm:1033
+#: ../IkiWiki/Plugin/po.pm:1032
 #, perl-format
 msgid "failed to translate %s"
 msgstr "impossibile tradurre %s"
 
-#: ../IkiWiki/Plugin/po.pm:1112
+#: ../IkiWiki/Plugin/po.pm:1111
 msgid "removed obsolete PO files"
 msgstr "file PO obsoleti rimossi"
 
-#: ../IkiWiki/Plugin/po.pm:1169 ../IkiWiki/Plugin/po.pm:1181
-#: ../IkiWiki/Plugin/po.pm:1220
+#: ../IkiWiki/Plugin/po.pm:1168 ../IkiWiki/Plugin/po.pm:1180
+#: ../IkiWiki/Plugin/po.pm:1219
 #, perl-format
 msgid "failed to write %s"
 msgstr "impossibile scrivere %s"
 
-#: ../IkiWiki/Plugin/po.pm:1179
+#: ../IkiWiki/Plugin/po.pm:1178
 msgid "failed to translate"
 msgstr "impossibile tradurre"
 
-#: ../IkiWiki/Plugin/po.pm:1232
+#: ../IkiWiki/Plugin/po.pm:1231
 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/po.pm:1275
+#: ../IkiWiki/Plugin/po.pm:1274
 #, perl-format
 msgid "%s has invalid syntax: must use CODE|NAME"
 msgstr ""
 
-#: ../IkiWiki/Plugin/poll.pm:70
+#: ../IkiWiki/Plugin/poll.pm:72 ../IkiWiki/Plugin/poll.pm:87
 msgid "vote"
 msgstr "voto"
 
-#: ../IkiWiki/Plugin/poll.pm:78
+#: ../IkiWiki/Plugin/poll.pm:86
+msgid "Write in"
+msgstr ""
+
+#: ../IkiWiki/Plugin/poll.pm:93
 msgid "Total votes:"
 msgstr "Voti totali:"
 
@@ -847,35 +887,35 @@ msgstr ""
 msgid "confirm reversion of %s"
 msgstr "conferma rimozione di %s"
 
-#: ../IkiWiki/Plugin/recentchangesdiff.pm:36
+#: ../IkiWiki/Plugin/recentchangesdiff.pm:49
 msgid "(Diff truncated)"
 msgstr "(Diff troncato)"
 
-#: ../IkiWiki/Plugin/remove.pm:32 ../IkiWiki/Plugin/rename.pm:37
+#: ../IkiWiki/Plugin/remove.pm:39 ../IkiWiki/Plugin/rename.pm:37
 #, perl-format
 msgid "%s does not exist"
 msgstr "%s non esiste"
 
-#: ../IkiWiki/Plugin/remove.pm:39
+#: ../IkiWiki/Plugin/remove.pm:56
 #, 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:42 ../IkiWiki/Plugin/rename.pm:46
+#: ../IkiWiki/Plugin/remove.pm:59 ../IkiWiki/Plugin/rename.pm:46
 #, perl-format
 msgid "%s is not a file"
 msgstr "%s non è un file"
 
-#: ../IkiWiki/Plugin/remove.pm:149
+#: ../IkiWiki/Plugin/remove.pm:166
 #, perl-format
 msgid "confirm removal of %s"
 msgstr "conferma rimozione di %s"
 
-#: ../IkiWiki/Plugin/remove.pm:186
+#: ../IkiWiki/Plugin/remove.pm:203
 msgid "Please select the attachments to remove."
 msgstr "Selezionare l'allegato da rimuovere."
 
-#: ../IkiWiki/Plugin/remove.pm:230
+#: ../IkiWiki/Plugin/remove.pm:263
 msgid "removed"
 msgstr "rimosso"
 
@@ -912,20 +952,20 @@ msgstr "rinomina di %s"
 msgid "Also rename SubPages and attachments"
 msgstr "Rinomina anche SottoPagine e allegati"
 
-#: ../IkiWiki/Plugin/rename.pm:258
+#: ../IkiWiki/Plugin/rename.pm:266
 msgid "Only one attachment can be renamed at a time."
 msgstr "Si può rinominare un solo allegato alla volta."
 
-#: ../IkiWiki/Plugin/rename.pm:261
+#: ../IkiWiki/Plugin/rename.pm:269
 msgid "Please select the attachment to rename."
 msgstr "Selezionare l'allegato da rinominare."
 
-#: ../IkiWiki/Plugin/rename.pm:371
+#: ../IkiWiki/Plugin/rename.pm:379
 #, perl-format
 msgid "rename %s to %s"
 msgstr "rinomina %s in %s"
 
-#: ../IkiWiki/Plugin/rename.pm:597
+#: ../IkiWiki/Plugin/rename.pm:605
 #, perl-format
 msgid "update for rename of %s to %s"
 msgstr "aggiornamento per rinomina di %s in %s"
@@ -1045,6 +1085,11 @@ msgstr "codice tex mancante"
 msgid "failed to generate image from code"
 msgstr "impossibile generare l'immagine dal codice"
 
+#: ../IkiWiki/Plugin/trail.pm:393
+#, perl-format
+msgid "building %s, its previous or next page has changed"
+msgstr ""
+
 #: ../IkiWiki/Plugin/transient.pm:45
 #, fuzzy, perl-format
 msgid "removing transient version of %s"
@@ -1116,7 +1161,7 @@ msgstr "impossibile determinare l'id del committer non fidato %s"
 msgid "scanning %s"
 msgstr "scansione %s"
 
-#: ../IkiWiki/Render.pm:280
+#: ../IkiWiki/Render.pm:281
 #, perl-format
 msgid ""
 "symlink found in srcdir path (%s) -- set allow_symlinks_before_srcdir to "
@@ -1125,52 +1170,52 @@ msgstr ""
 "collegamento simbolico trovato nel percorso srcdir (%s) -- impostare "
 "allow_symlinks_before_srcdir per abilitare questa configurazione"
 
-#: ../IkiWiki/Render.pm:316
+#: ../IkiWiki/Render.pm:317
 #, perl-format
 msgid "skipping bad filename %s"
 msgstr "ignorato il file dal nome scorretto %s"
 
-#: ../IkiWiki/Render.pm:332
+#: ../IkiWiki/Render.pm:333
 #, perl-format
 msgid "%s has multiple possible source pages"
 msgstr "%s ha diverse pagine sorgenti possibili"
 
-#: ../IkiWiki/Render.pm:372
+#: ../IkiWiki/Render.pm:373
 #, perl-format
 msgid "querying %s for file creation and modification times.."
 msgstr ""
 
-#: ../IkiWiki/Render.pm:446
+#: ../IkiWiki/Render.pm:447
 #, fuzzy, perl-format
 msgid "removing obsolete %s"
 msgstr "rimozione della vecchia pagina %s"
 
-#: ../IkiWiki/Render.pm:530
+#: ../IkiWiki/Render.pm:531
 #, perl-format
 msgid "building %s, which links to %s"
 msgstr "compilazione di %s, che è collegato a %s"
 
-#: ../IkiWiki/Render.pm:539
+#: ../IkiWiki/Render.pm:540
 #, perl-format
 msgid "removing %s, no longer built by %s"
 msgstr "rimozione di %s, non più richiesto da %s"
 
-#: ../IkiWiki/Render.pm:622 ../IkiWiki/Render.pm:704
+#: ../IkiWiki/Render.pm:623 ../IkiWiki/Render.pm:705
 #, perl-format
 msgid "building %s, which depends on %s"
 msgstr "compilazione di %s, che dipende da %s"
 
-#: ../IkiWiki/Render.pm:717
+#: ../IkiWiki/Render.pm:718
 #, perl-format
 msgid "building %s, to update its backlinks"
 msgstr "compilazione di %s, per aggiornare i collegamenti ai precedenti"
 
-#: ../IkiWiki/Render.pm:797
+#: ../IkiWiki/Render.pm:806
 #, perl-format
 msgid "building %s"
 msgstr "compilazione di %s"
 
-#: ../IkiWiki/Render.pm:849
+#: ../IkiWiki/Render.pm:871
 #, perl-format
 msgid "ikiwiki: cannot build %s"
 msgstr "ikiwiki: impossibile compilare %s"
@@ -1215,27 +1260,31 @@ msgstr ""
 msgid "generating wrappers.."
 msgstr "generazione contenitori..."
 
-#: ../IkiWiki/Wrapper.pm:36
+#: ../IkiWiki/Wrapper.pm:37
 #, perl-format
 msgid "%s doesn't seem to be executable"
 msgstr "%s non sembra essere eseguibile"
 
-#: ../IkiWiki/Wrapper.pm:40
+#: ../IkiWiki/Wrapper.pm:41
 msgid "cannot create a wrapper that uses a setup file"
 msgstr "impossibile creare un contenitore che utilizzi un file di setup"
 
-#: ../IkiWiki/Wrapper.pm:44
+#: ../IkiWiki/Wrapper.pm:45
 msgid "wrapper filename not specified"
 msgstr "nome del file del contenitore non specificato"
 
+#: ../IkiWiki/Wrapper.pm:109
+msgid "Please wait"
+msgstr ""
+
 #. translators: The parameter is a C filename.
-#: ../IkiWiki/Wrapper.pm:220
+#: ../IkiWiki/Wrapper.pm:268
 #, perl-format
 msgid "failed to compile %s"
 msgstr "errore nel compilare %s"
 
 #. translators: The parameter is a filename.
-#: ../IkiWiki/Wrapper.pm:240
+#: ../IkiWiki/Wrapper.pm:288
 #, perl-format
 msgid "successfully generated %s"
 msgstr "%s generato con successo"
@@ -1257,66 +1306,66 @@ msgstr "utilizzo: --set var=valore"
 msgid "usage: --set-yaml var=value"
 msgstr "utilizzo: --set var=valore"
 
-#: ../ikiwiki.in:216
+#: ../ikiwiki.in:214
 msgid "rebuilding wiki.."
 msgstr "ricostruzione wiki..."
 
-#: ../ikiwiki.in:219
+#: ../ikiwiki.in:217
 msgid "refreshing wiki.."
 msgstr "aggiornamento wiki..."
 
-#: ../IkiWiki.pm:232
+#: ../IkiWiki.pm:248
 msgid "Discussion"
 msgstr "Discussione"
 
-#: ../IkiWiki.pm:557
+#: ../IkiWiki.pm:580
 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:605
+#: ../IkiWiki.pm:628
 #, fuzzy, perl-format
 msgid "unsupported umask setting %s"
 msgstr "formato pagina %s non supportato"
 
-#: ../IkiWiki.pm:645
+#: ../IkiWiki.pm:668
 msgid "cannot use multiple rcs plugins"
 msgstr "impossibile usare più plugin rcs"
 
-#: ../IkiWiki.pm:675
+#: ../IkiWiki.pm:698
 #, 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:1452
+#: ../IkiWiki.pm:1490
 #, perl-format
 msgid "preprocessing loop detected on %s at depth %i"
 msgstr "ciclo del preprocessore individuato su %s alla profondità %i"
 
-#: ../IkiWiki.pm:1646
+#: ../IkiWiki.pm:1684
 #, perl-format
 msgid "bad file name %s"
 msgstr "nome file %s scorretto"
 
-#: ../IkiWiki.pm:1946
+#: ../IkiWiki.pm:1984
 #, perl-format
 msgid "template %s not found"
 msgstr "modello %s non trovato"
 
-#: ../IkiWiki.pm:2196
+#: ../IkiWiki.pm:2234
 msgid "yes"
 msgstr "sì"
 
-#: ../IkiWiki.pm:2273
+#: ../IkiWiki.pm:2318
 #, fuzzy, perl-format
 msgid "invalid sort type %s"
 msgstr "ordinamento %s sconosciuto"
 
-#: ../IkiWiki.pm:2294
+#: ../IkiWiki.pm:2339
 #, perl-format
 msgid "unknown sort type %s"
 msgstr "ordinamento %s sconosciuto"
 
-#: ../IkiWiki.pm:2430
+#: ../IkiWiki.pm:2475
 #, perl-format
 msgid "cannot match pages: %s"
 msgstr "impossibile trovare pagine corrispondenti: %s"
index 902ae82603bac79484b023922050ec4f1bbb2203..350d4ae884332c92f6e9b3614c93ee124a6f063e 100644 (file)
--- a/po/pl.po
+++ b/po/pl.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: ikiwiki 1.51\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-11-30 16:33-0400\n"
+"POT-Creation-Date: 2013-09-04 10:16-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"
@@ -54,85 +54,85 @@ msgstr "Preferencje zapisane."
 msgid "You are banned."
 msgstr "Twój dostęp został zabroniony przez administratora."
 
-#: ../IkiWiki/CGI.pm:464 ../IkiWiki/CGI.pm:465 ../IkiWiki.pm:1470
+#: ../IkiWiki/CGI.pm:464 ../IkiWiki/CGI.pm:465 ../IkiWiki.pm:1508
 msgid "Error"
 msgstr "Błąd"
 
-#: ../IkiWiki/Plugin/aggregate.pm:95
+#: ../IkiWiki/Plugin/aggregate.pm:86
 msgid "Aggregation triggered via web."
 msgstr ""
 
-#: ../IkiWiki/Plugin/aggregate.pm:104
+#: ../IkiWiki/Plugin/aggregate.pm:95
 msgid "Nothing to do right now, all feeds are up-to-date!"
 msgstr ""
 
-#: ../IkiWiki/Plugin/aggregate.pm:237
+#: ../IkiWiki/Plugin/aggregate.pm:227
 #, fuzzy, perl-format
 msgid "missing %s parameter"
 msgstr "brakujący parametr %s"
 
-#: ../IkiWiki/Plugin/aggregate.pm:272
+#: ../IkiWiki/Plugin/aggregate.pm:262
 msgid "new feed"
 msgstr "nowy kanał RSS"
 
-#: ../IkiWiki/Plugin/aggregate.pm:286
+#: ../IkiWiki/Plugin/aggregate.pm:276
 msgid "posts"
 msgstr "wpisy"
 
-#: ../IkiWiki/Plugin/aggregate.pm:288
+#: ../IkiWiki/Plugin/aggregate.pm:278
 msgid "new"
 msgstr "nowy wpis"
 
-#: ../IkiWiki/Plugin/aggregate.pm:475
+#: ../IkiWiki/Plugin/aggregate.pm:465
 #, perl-format
 msgid "expiring %s (%s days old)"
 msgstr "wygasający wpis %s (ma już %s dni)"
 
-#: ../IkiWiki/Plugin/aggregate.pm:482
+#: ../IkiWiki/Plugin/aggregate.pm:472
 #, perl-format
 msgid "expiring %s"
 msgstr "wygasający wpis %s"
 
-#: ../IkiWiki/Plugin/aggregate.pm:510
+#: ../IkiWiki/Plugin/aggregate.pm:500
 #, perl-format
 msgid "last checked %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/aggregate.pm:514
+#: ../IkiWiki/Plugin/aggregate.pm:504
 #, perl-format
 msgid "checking feed %s ..."
 msgstr "sprawdzanie kanału RSS %s..."
 
-#: ../IkiWiki/Plugin/aggregate.pm:519
+#: ../IkiWiki/Plugin/aggregate.pm:509
 #, perl-format
 msgid "could not find feed at %s"
 msgstr "nie znaleziono kanału RSS pod adresem %s"
 
-#: ../IkiWiki/Plugin/aggregate.pm:542
+#: ../IkiWiki/Plugin/aggregate.pm:529
 #, fuzzy
 msgid "feed not found"
 msgstr "nieznaleziony kanał RSS"
 
-#: ../IkiWiki/Plugin/aggregate.pm:553
+#: ../IkiWiki/Plugin/aggregate.pm:540
 #, fuzzy, perl-format
 msgid "(invalid UTF-8 stripped from feed)"
 msgstr "Nieprawidłowe kodowanie UTF-8 usunięte z kanału RSS"
 
-#: ../IkiWiki/Plugin/aggregate.pm:561
+#: ../IkiWiki/Plugin/aggregate.pm:548
 #, perl-format
 msgid "(feed entities escaped)"
 msgstr ""
 
-#: ../IkiWiki/Plugin/aggregate.pm:569
+#: ../IkiWiki/Plugin/aggregate.pm:556
 msgid "feed crashed XML::Feed!"
 msgstr "awaria kanału RSS w module XML::Feed!"
 
-#: ../IkiWiki/Plugin/aggregate.pm:661
+#: ../IkiWiki/Plugin/aggregate.pm:649
 #, perl-format
 msgid "creating new page %s"
 msgstr "tworzenie nowej strony %s"
 
-#: ../IkiWiki/Plugin/aggregate.pm:689 ../IkiWiki/Plugin/edittemplate.pm:135
+#: ../IkiWiki/Plugin/aggregate.pm:677 ../IkiWiki/Plugin/edittemplate.pm:135
 #, fuzzy
 msgid "failed to process template:"
 msgstr "awaria w trakcie przetwarzania:"
@@ -141,7 +141,7 @@ msgstr "awaria w trakcie przetwarzania:"
 msgid "deleting bucket.."
 msgstr ""
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:227
+#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:225
 msgid "done"
 msgstr "gotowe"
 
@@ -160,7 +160,7 @@ msgstr "Awaria w trakcie wysyłania wiadomości"
 msgid "Failed to save file to S3: "
 msgstr "Awaria w trakcie wysyłania wiadomości"
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:247
+#: ../IkiWiki/Plugin/amazon_s3.pm:248
 #, fuzzy
 msgid "Failed to delete file from S3: "
 msgstr "awaria w trakcie zmiany rozmiaru: %s"
@@ -178,16 +178,16 @@ msgstr ""
 msgid "bad attachment filename"
 msgstr ""
 
-#: ../IkiWiki/Plugin/attachment.pm:295
+#: ../IkiWiki/Plugin/attachment.pm:296
 msgid "attachment upload"
 msgstr ""
 
-#: ../IkiWiki/Plugin/attachment.pm:346
+#: ../IkiWiki/Plugin/attachment.pm:347
 #, fuzzy
 msgid "this attachment is not yet saved"
 msgstr "Strona %s nie może być edytowana"
 
-#: ../IkiWiki/Plugin/attachment.pm:363
+#: ../IkiWiki/Plugin/attachment.pm:365
 msgid "just uploaded"
 msgstr ""
 
@@ -196,7 +196,7 @@ msgstr ""
 msgid "creating index page %s"
 msgstr "tworzenie nowej strony %s"
 
-#: ../IkiWiki/Plugin/blogspam.pm:118
+#: ../IkiWiki/Plugin/blogspam.pm:119
 msgid ""
 "Sorry, but that looks like spam to <a href=\"http://blogspam.net/"
 "\">blogspam</a>: "
@@ -211,83 +211,87 @@ msgstr ""
 msgid "There are no broken links!"
 msgstr "Wszystkie odnośniki są aktualne!"
 
-#: ../IkiWiki/Plugin/comments.pm:114
+#: ../IkiWiki/Plugin/comments.pm:124
 #, fuzzy, perl-format
 msgid "this comment needs %s"
 msgstr "tworzenie %s"
 
-#: ../IkiWiki/Plugin/comments.pm:117
+#: ../IkiWiki/Plugin/comments.pm:127
 msgid "moderation"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:138 ../IkiWiki/Plugin/format.pm:50
+#: ../IkiWiki/Plugin/comments.pm:154 ../IkiWiki/Plugin/format.pm:50
 #, perl-format
 msgid "unsupported page format %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:143
+#: ../IkiWiki/Plugin/comments.pm:159
 msgid "comment must have content"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:201
+#: ../IkiWiki/Plugin/comments.pm:217
 msgid "Anonymous"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:263
+#: ../IkiWiki/Plugin/comments.pm:279
 msgid "Comment Moderation"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:379 ../IkiWiki/Plugin/editpage.pm:95
-#: ../IkiWiki/Plugin/editpage.pm:101
+#: ../IkiWiki/Plugin/comments.pm:375 ../IkiWiki/Plugin/comments.pm:379
+msgid "email replies to me"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:413 ../IkiWiki/Plugin/editpage.pm:96
+#: ../IkiWiki/Plugin/editpage.pm:102
 msgid "bad page name"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:382
+#: ../IkiWiki/Plugin/comments.pm:416
 #, fuzzy, perl-format
 msgid "commenting on %s"
 msgstr "tworzenie %s"
 
-#: ../IkiWiki/Plugin/comments.pm:399
+#: ../IkiWiki/Plugin/comments.pm:433
 #, perl-format
 msgid "page '%s' doesn't exist, so you can't comment"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:406
+#: ../IkiWiki/Plugin/comments.pm:440
 #, perl-format
 msgid "comments on page '%s' are closed"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:520
+#: ../IkiWiki/Plugin/comments.pm:565
 msgid "comment stored for moderation"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:522
+#: ../IkiWiki/Plugin/comments.pm:567
 msgid "Your comment will be posted after moderator review"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:535
+#: ../IkiWiki/Plugin/comments.pm:580
 msgid "Added a comment"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:539
+#: ../IkiWiki/Plugin/comments.pm:584
 #, perl-format
 msgid "Added a comment: %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:608 ../IkiWiki/Plugin/userlist.pm:55
+#: ../IkiWiki/Plugin/comments.pm:654 ../IkiWiki/Plugin/userlist.pm:55
 #: ../IkiWiki/Plugin/websetup.pm:272
 msgid "you are not logged in as an admin"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:660
+#: ../IkiWiki/Plugin/comments.pm:708
 msgid "Comment moderation"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:701
+#: ../IkiWiki/Plugin/comments.pm:749
 msgid "comment moderation"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:862
+#: ../IkiWiki/Plugin/comments.pm:910
 #, perl-format
 msgid "%i comment"
 msgid_plural "%i comments"
@@ -297,11 +301,11 @@ msgstr[1] ""
 #. translators: Here "Comment" is a verb;
 #. translators: the user clicks on it to
 #. translators: post a comment.
-#: ../IkiWiki/Plugin/comments.pm:872
+#: ../IkiWiki/Plugin/comments.pm:920
 msgid "Comment"
 msgstr ""
 
-#: ../IkiWiki/Plugin/conditional.pm:28 ../IkiWiki/Plugin/cutpaste.pm:46
+#: ../IkiWiki/Plugin/conditional.pm:27 ../IkiWiki/Plugin/cutpaste.pm:46
 #: ../IkiWiki/Plugin/cutpaste.pm:60 ../IkiWiki/Plugin/cutpaste.pm:75
 #: ../IkiWiki/Plugin/testpagespec.pm:26
 #, fuzzy, perl-format
@@ -322,19 +326,23 @@ msgstr ""
 msgid "removing old preview %s"
 msgstr "usuwanie starej strony %s"
 
-#: ../IkiWiki/Plugin/editpage.pm:117
+#: ../IkiWiki/Plugin/editpage.pm:118
 #, perl-format
 msgid "%s is not an editable page"
 msgstr "Strona %s nie może być edytowana"
 
-#: ../IkiWiki/Plugin/editpage.pm:307
+#: ../IkiWiki/Plugin/editpage.pm:166
+msgid "email comments to me"
+msgstr ""
+
+#: ../IkiWiki/Plugin/editpage.pm:319
 #, perl-format
 msgid "creating %s"
 msgstr "tworzenie %s"
 
-#: ../IkiWiki/Plugin/editpage.pm:325 ../IkiWiki/Plugin/editpage.pm:344
-#: ../IkiWiki/Plugin/editpage.pm:355 ../IkiWiki/Plugin/editpage.pm:400
-#: ../IkiWiki/Plugin/editpage.pm:442
+#: ../IkiWiki/Plugin/editpage.pm:337 ../IkiWiki/Plugin/editpage.pm:356
+#: ../IkiWiki/Plugin/editpage.pm:367 ../IkiWiki/Plugin/editpage.pm:412
+#: ../IkiWiki/Plugin/editpage.pm:454
 #, perl-format
 msgid "editing %s"
 msgstr "edycja %s"
@@ -382,26 +390,26 @@ msgstr "awaria w trakcie odczytu %s: %s"
 msgid "%s is an attachment, not a page."
 msgstr "Strona %s nie może być edytowana"
 
-#: ../IkiWiki/Plugin/git.pm:777 ../IkiWiki/Plugin/git.pm:840
-#: ../IkiWiki.pm:1690
+#: ../IkiWiki/Plugin/git.pm:789 ../IkiWiki/Plugin/git.pm:852
+#: ../IkiWiki.pm:1728
 #, perl-format
 msgid "you are not allowed to change %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/git.pm:799
+#: ../IkiWiki/Plugin/git.pm:811
 #, perl-format
 msgid "you cannot act on a file with mode %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/git.pm:803
+#: ../IkiWiki/Plugin/git.pm:815
 msgid "you are not allowed to change file modes"
 msgstr ""
 
-#: ../IkiWiki/Plugin/git.pm:873
+#: ../IkiWiki/Plugin/git.pm:885
 msgid "you are not allowed to revert a merge"
 msgstr ""
 
-#: ../IkiWiki/Plugin/git.pm:892
+#: ../IkiWiki/Plugin/git.pm:902
 #, fuzzy, perl-format
 msgid "Failed to revert commit %s"
 msgstr "awaria w trakcie kompilowania %s"
@@ -416,7 +424,7 @@ msgstr "Wtyczka do wyszukiwarka wymaga podania %s"
 msgid "failed to run graphviz"
 msgstr "awaria w trakcie uruchamiania wtyczki graphviz"
 
-#: ../IkiWiki/Plugin/graphviz.pm:143
+#: ../IkiWiki/Plugin/graphviz.pm:144
 msgid "prog not a valid graphviz program"
 msgstr "prog nie jest poprawnym programem graphviz"
 
@@ -430,7 +438,7 @@ msgstr ""
 msgid "Source code: %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/highlight.pm:179
+#: ../IkiWiki/Plugin/highlight.pm:180
 msgid ""
 "warning: highlight perl module not available; falling back to pass through"
 msgstr ""
@@ -481,31 +489,31 @@ msgstr "nieznaleziony kanał RSS"
 msgid "missing pages parameter"
 msgstr "brakujący parametr %s"
 
-#: ../IkiWiki/Plugin/inline.pm:192
+#: ../IkiWiki/Plugin/inline.pm:209
 #, perl-format
 msgid "the %s and %s parameters cannot be used together"
 msgstr ""
 
-#: ../IkiWiki/Plugin/inline.pm:297
+#: ../IkiWiki/Plugin/inline.pm:315
 #, perl-format
 msgid "%s (RSS feed)"
 msgstr ""
 
-#: ../IkiWiki/Plugin/inline.pm:301
+#: ../IkiWiki/Plugin/inline.pm:319
 #, perl-format
 msgid "%s (Atom feed)"
 msgstr ""
 
-#: ../IkiWiki/Plugin/inline.pm:330
+#: ../IkiWiki/Plugin/inline.pm:348
 msgid "Add a new post titled:"
 msgstr "Tytuł nowego wpisu"
 
-#: ../IkiWiki/Plugin/inline.pm:369 ../IkiWiki/Plugin/template.pm:44
+#: ../IkiWiki/Plugin/inline.pm:387 ../IkiWiki/Plugin/template.pm:44
 #, fuzzy, perl-format
 msgid "failed to process template %s"
 msgstr "awaria w trakcie przetwarzania:"
 
-#: ../IkiWiki/Plugin/inline.pm:695
+#: ../IkiWiki/Plugin/inline.pm:725
 msgid "RPC::XML::Client not found, not pinging"
 msgstr "Nieznaleziony moduł RPC::XML::Client, brak możliwości pingowania"
 
@@ -526,46 +534,51 @@ msgstr ""
 "strona %s jest tymczasowo zablokowana przez użytkownika %s i nie może być "
 "teraz edytowana"
 
-#: ../IkiWiki/Plugin/mdwn.pm:45
+#: ../IkiWiki/Plugin/mdwn.pm:52
 msgid "multimarkdown is enabled, but Text::MultiMarkdown is not installed"
 msgstr ""
 
-#: ../IkiWiki/Plugin/mdwn.pm:70
+#: ../IkiWiki/Plugin/mdwn.pm:96
 #, 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:175
+#: ../IkiWiki/Plugin/meta.pm:127
+#, fuzzy
+msgid "enclosure not found"
+msgstr "nieznaleziony kanał RSS"
+
+#: ../IkiWiki/Plugin/meta.pm:187
 #, fuzzy
 msgid "stylesheet not found"
 msgstr "nieznaleziony szablon ze stylami CSS"
 
-#: ../IkiWiki/Plugin/meta.pm:187
+#: ../IkiWiki/Plugin/meta.pm:199
 #, fuzzy
 msgid "script not found"
 msgstr "nie znaleziono %s"
 
-#: ../IkiWiki/Plugin/meta.pm:235
+#: ../IkiWiki/Plugin/meta.pm:247
 #, fuzzy
 msgid "redir page not found"
 msgstr "nieznaleziony kanał RSS"
 
-#: ../IkiWiki/Plugin/meta.pm:249
+#: ../IkiWiki/Plugin/meta.pm:261
 #, fuzzy
 msgid "redir cycle is not allowed"
 msgstr "nieznaleziony kanał RSS"
 
-#: ../IkiWiki/Plugin/meta.pm:427
+#: ../IkiWiki/Plugin/meta.pm:450
 msgid "sort=meta requires a parameter"
 msgstr ""
 
-#: ../IkiWiki/Plugin/mirrorlist.pm:44
+#: ../IkiWiki/Plugin/mirrorlist.pm:57
 msgid "Mirrors"
 msgstr "Kopie lustrzane"
 
-#: ../IkiWiki/Plugin/mirrorlist.pm:44
+#: ../IkiWiki/Plugin/mirrorlist.pm:57
 msgid "Mirror"
 msgstr "Kopia lustrzana"
 
@@ -577,6 +590,18 @@ msgstr ""
 msgid "more"
 msgstr "więcej"
 
+#: ../IkiWiki/Plugin/notifyemail.pm:72
+msgid "Cannot subscribe your email address without logging in."
+msgstr ""
+
+#: ../IkiWiki/Plugin/notifyemail.pm:136
+msgid "change notification:"
+msgstr ""
+
+#: ../IkiWiki/Plugin/notifyemail.pm:138
+msgid "comment notification:"
+msgstr ""
+
 #: ../IkiWiki/Plugin/openid.pm:71
 #, fuzzy, perl-format
 msgid "failed to load openid module: "
@@ -591,42 +616,50 @@ msgstr "Dla każdej strony istnieje odnośnik z innej strony"
 msgid "bad or missing template"
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:231
+#: ../IkiWiki/Plugin/passwordauth.pm:145 ../IkiWiki/Plugin/passwordauth.pm:337
+msgid "Error creating account."
+msgstr "Błąd w trakcie zakładania konta."
+
+#: ../IkiWiki/Plugin/passwordauth.pm:297
 msgid "Your user page: "
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:238
+#: ../IkiWiki/Plugin/passwordauth.pm:304
 msgid "Create your user page"
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:268
+#: ../IkiWiki/Plugin/passwordauth.pm:334
 msgid "Account creation successful. Now you can Login."
 msgstr "Konto założone pomyślnie. Teraz można zalogować się."
 
-#: ../IkiWiki/Plugin/passwordauth.pm:271
-msgid "Error creating account."
-msgstr "Błąd w trakcie zakładania konta."
-
-#: ../IkiWiki/Plugin/passwordauth.pm:278
+#: ../IkiWiki/Plugin/passwordauth.pm:344
 msgid "No email address, so cannot email password reset instructions."
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:312
+#: ../IkiWiki/Plugin/passwordauth.pm:371
 msgid "Failed to send mail"
 msgstr "Awaria w trakcie wysyłania wiadomości"
 
-#: ../IkiWiki/Plugin/passwordauth.pm:314
+#: ../IkiWiki/Plugin/passwordauth.pm:373
 msgid "You have been mailed password reset instructions."
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:349
+#: ../IkiWiki/Plugin/passwordauth.pm:408
 msgid "incorrect password reset url"
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:352
+#: ../IkiWiki/Plugin/passwordauth.pm:411
 msgid "password reset denied"
 msgstr ""
 
+#: ../IkiWiki/Plugin/passwordauth.pm:424
+msgid "incorrect url"
+msgstr ""
+
+#: ../IkiWiki/Plugin/passwordauth.pm:427
+msgid "access denied"
+msgstr ""
+
 #: ../IkiWiki/Plugin/pingee.pm:30
 msgid "Ping received."
 msgstr ""
@@ -654,97 +687,101 @@ 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:180
+#: ../IkiWiki/Plugin/po.pm:179
 #, fuzzy, perl-format
 msgid "%s is not a valid language code"
 msgstr "Strona %s nie może być edytowana"
 
-#: ../IkiWiki/Plugin/po.pm:192
+#: ../IkiWiki/Plugin/po.pm:191
 #, 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:197
+#: ../IkiWiki/Plugin/po.pm:196
 msgid ""
 "po_link_to=negotiated requires usedirs to be enabled, falling back to "
 "po_link_to=default"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:468
+#: ../IkiWiki/Plugin/po.pm:467
 msgid "updated PO files"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:491
+#: ../IkiWiki/Plugin/po.pm:490
 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:511
+#: ../IkiWiki/Plugin/po.pm:510
 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:957
+#: ../IkiWiki/Plugin/po.pm:956
 #, perl-format
 msgid "POT file (%s) does not exist"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:971
+#: ../IkiWiki/Plugin/po.pm:970
 #, fuzzy, perl-format
 msgid "failed to copy underlay PO file to %s"
 msgstr "awaria w trakcie kompilowania %s"
 
-#: ../IkiWiki/Plugin/po.pm:980
+#: ../IkiWiki/Plugin/po.pm:979
 #, fuzzy, perl-format
 msgid "failed to update %s"
 msgstr "awaria w trakcie kompilowania %s"
 
-#: ../IkiWiki/Plugin/po.pm:986
+#: ../IkiWiki/Plugin/po.pm:985
 #, fuzzy, perl-format
 msgid "failed to copy the POT file to %s"
 msgstr "awaria w trakcie kompilowania %s"
 
-#: ../IkiWiki/Plugin/po.pm:1022
+#: ../IkiWiki/Plugin/po.pm:1021
 msgid "N/A"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:1033
+#: ../IkiWiki/Plugin/po.pm:1032
 #, fuzzy, perl-format
 msgid "failed to translate %s"
 msgstr "awaria w trakcie zmiany rozmiaru: %s"
 
-#: ../IkiWiki/Plugin/po.pm:1112
+#: ../IkiWiki/Plugin/po.pm:1111
 msgid "removed obsolete PO files"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:1169 ../IkiWiki/Plugin/po.pm:1181
-#: ../IkiWiki/Plugin/po.pm:1220
+#: ../IkiWiki/Plugin/po.pm:1168 ../IkiWiki/Plugin/po.pm:1180
+#: ../IkiWiki/Plugin/po.pm:1219
 #, fuzzy, perl-format
 msgid "failed to write %s"
 msgstr "awaria w trakcie zapisu %s: %s"
 
-#: ../IkiWiki/Plugin/po.pm:1179
+#: ../IkiWiki/Plugin/po.pm:1178
 #, fuzzy
 msgid "failed to translate"
 msgstr "awaria w trakcie uruchamiania dot"
 
-#: ../IkiWiki/Plugin/po.pm:1232
+#: ../IkiWiki/Plugin/po.pm:1231
 msgid "invalid gettext data, go back to previous page to continue edit"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:1275
+#: ../IkiWiki/Plugin/po.pm:1274
 #, perl-format
 msgid "%s has invalid syntax: must use CODE|NAME"
 msgstr ""
 
-#: ../IkiWiki/Plugin/poll.pm:70
+#: ../IkiWiki/Plugin/poll.pm:72 ../IkiWiki/Plugin/poll.pm:87
 msgid "vote"
 msgstr "głosuj"
 
-#: ../IkiWiki/Plugin/poll.pm:78
+#: ../IkiWiki/Plugin/poll.pm:86
+msgid "Write in"
+msgstr ""
+
+#: ../IkiWiki/Plugin/poll.pm:93
 msgid "Total votes:"
 msgstr "Oddane głosy:"
 
@@ -849,37 +886,37 @@ msgstr ""
 msgid "confirm reversion of %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/recentchangesdiff.pm:36
+#: ../IkiWiki/Plugin/recentchangesdiff.pm:49
 msgid "(Diff truncated)"
 msgstr ""
 
-#: ../IkiWiki/Plugin/remove.pm:32 ../IkiWiki/Plugin/rename.pm:37
+#: ../IkiWiki/Plugin/remove.pm:39 ../IkiWiki/Plugin/rename.pm:37
 #, perl-format
 msgid "%s does not exist"
 msgstr ""
 
-#: ../IkiWiki/Plugin/remove.pm:39
+#: ../IkiWiki/Plugin/remove.pm:56
 #, 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:42 ../IkiWiki/Plugin/rename.pm:46
+#: ../IkiWiki/Plugin/remove.pm:59 ../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:149
+#: ../IkiWiki/Plugin/remove.pm:166
 #, perl-format
 msgid "confirm removal of %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/remove.pm:186
+#: ../IkiWiki/Plugin/remove.pm:203
 msgid "Please select the attachments to remove."
 msgstr ""
 
-#: ../IkiWiki/Plugin/remove.pm:230
+#: ../IkiWiki/Plugin/remove.pm:263
 msgid "removed"
 msgstr ""
 
@@ -917,20 +954,20 @@ msgstr "renderowanie %s"
 msgid "Also rename SubPages and attachments"
 msgstr ""
 
-#: ../IkiWiki/Plugin/rename.pm:258
+#: ../IkiWiki/Plugin/rename.pm:266
 msgid "Only one attachment can be renamed at a time."
 msgstr ""
 
-#: ../IkiWiki/Plugin/rename.pm:261
+#: ../IkiWiki/Plugin/rename.pm:269
 msgid "Please select the attachment to rename."
 msgstr ""
 
-#: ../IkiWiki/Plugin/rename.pm:371
+#: ../IkiWiki/Plugin/rename.pm:379
 #, perl-format
 msgid "rename %s to %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/rename.pm:597
+#: ../IkiWiki/Plugin/rename.pm:605
 #, fuzzy, perl-format
 msgid "update for rename of %s to %s"
 msgstr "aktualizacja stron wiki %s: %s przez użytkownika %s"
@@ -1062,6 +1099,11 @@ msgstr "brakujące wartości"
 msgid "failed to generate image from code"
 msgstr "awaria w trakcie zmiany rozmiaru: %s"
 
+#: ../IkiWiki/Plugin/trail.pm:393
+#, perl-format
+msgid "building %s, its previous or next page has changed"
+msgstr ""
+
 #: ../IkiWiki/Plugin/transient.pm:45
 #, fuzzy, perl-format
 msgid "removing transient version of %s"
@@ -1128,59 +1170,59 @@ msgstr ""
 msgid "scanning %s"
 msgstr "skanowanie %s"
 
-#: ../IkiWiki/Render.pm:280
+#: ../IkiWiki/Render.pm:281
 #, perl-format
 msgid ""
 "symlink found in srcdir path (%s) -- set allow_symlinks_before_srcdir to "
 "allow this"
 msgstr ""
 
-#: ../IkiWiki/Render.pm:316
+#: ../IkiWiki/Render.pm:317
 #, perl-format
 msgid "skipping bad filename %s"
 msgstr "pomijanie nieprawidłowej nazwy pliku %s"
 
-#: ../IkiWiki/Render.pm:332
+#: ../IkiWiki/Render.pm:333
 #, perl-format
 msgid "%s has multiple possible source pages"
 msgstr ""
 
-#: ../IkiWiki/Render.pm:372
+#: ../IkiWiki/Render.pm:373
 #, perl-format
 msgid "querying %s for file creation and modification times.."
 msgstr ""
 
-#: ../IkiWiki/Render.pm:446
+#: ../IkiWiki/Render.pm:447
 #, fuzzy, perl-format
 msgid "removing obsolete %s"
 msgstr "usuwanie starej strony %s"
 
-#: ../IkiWiki/Render.pm:530
+#: ../IkiWiki/Render.pm:531
 #, fuzzy, perl-format
 msgid "building %s, which links to %s"
 msgstr "renderowanie %s z odnośnikiem do %s"
 
-#: ../IkiWiki/Render.pm:539
+#: ../IkiWiki/Render.pm:540
 #, fuzzy, perl-format
 msgid "removing %s, no longer built by %s"
 msgstr "usuwanie %s nie tworzonego już przez %s"
 
-#: ../IkiWiki/Render.pm:622 ../IkiWiki/Render.pm:704
+#: ../IkiWiki/Render.pm:623 ../IkiWiki/Render.pm:705
 #, fuzzy, perl-format
 msgid "building %s, which depends on %s"
 msgstr "renderowanie %s zależącego od %s"
 
-#: ../IkiWiki/Render.pm:717
+#: ../IkiWiki/Render.pm:718
 #, fuzzy, perl-format
 msgid "building %s, to update its backlinks"
 msgstr "renderowanie %s w celu aktualizacji powrotnych odnośników"
 
-#: ../IkiWiki/Render.pm:797
+#: ../IkiWiki/Render.pm:806
 #, fuzzy, perl-format
 msgid "building %s"
 msgstr "edycja %s"
 
-#: ../IkiWiki/Render.pm:849
+#: ../IkiWiki/Render.pm:871
 #, fuzzy, perl-format
 msgid "ikiwiki: cannot build %s"
 msgstr "ikiwiki: awaria w trakcie tworzenia %s"
@@ -1224,27 +1266,31 @@ msgstr ""
 msgid "generating wrappers.."
 msgstr "tworzenie osłon..."
 
-#: ../IkiWiki/Wrapper.pm:36
+#: ../IkiWiki/Wrapper.pm:37
 #, perl-format
 msgid "%s doesn't seem to be executable"
 msgstr "osłona %s nie jest wykonywalna"
 
-#: ../IkiWiki/Wrapper.pm:40
+#: ../IkiWiki/Wrapper.pm:41
 msgid "cannot create a wrapper that uses a setup file"
 msgstr "awaria w trakcie tworzenia osłony używającej pliku konfiguracyjnego"
 
-#: ../IkiWiki/Wrapper.pm:44
+#: ../IkiWiki/Wrapper.pm:45
 msgid "wrapper filename not specified"
 msgstr "nieokreślona nazwa pliku osłony"
 
+#: ../IkiWiki/Wrapper.pm:109
+msgid "Please wait"
+msgstr ""
+
 #. translators: The parameter is a C filename.
-#: ../IkiWiki/Wrapper.pm:220
+#: ../IkiWiki/Wrapper.pm:268
 #, perl-format
 msgid "failed to compile %s"
 msgstr "awaria w trakcie kompilowania %s"
 
 #. translators: The parameter is a filename.
-#: ../IkiWiki/Wrapper.pm:240
+#: ../IkiWiki/Wrapper.pm:288
 #, perl-format
 msgid "successfully generated %s"
 msgstr "pomyślnie utworzono %s"
@@ -1265,68 +1311,68 @@ msgstr ""
 msgid "usage: --set-yaml var=value"
 msgstr ""
 
-#: ../ikiwiki.in:216
+#: ../ikiwiki.in:214
 msgid "rebuilding wiki.."
 msgstr "przebudowywanie wiki..."
 
-#: ../ikiwiki.in:219
+#: ../ikiwiki.in:217
 msgid "refreshing wiki.."
 msgstr "odświeżanie wiki..."
 
-#: ../IkiWiki.pm:232
+#: ../IkiWiki.pm:248
 msgid "Discussion"
 msgstr "Dyskusja"
 
-#: ../IkiWiki.pm:557
+#: ../IkiWiki.pm:580
 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:605
+#: ../IkiWiki.pm:628
 #, perl-format
 msgid "unsupported umask setting %s"
 msgstr ""
 
-#: ../IkiWiki.pm:645
+#: ../IkiWiki.pm:668
 msgid "cannot use multiple rcs plugins"
 msgstr ""
 
-#: ../IkiWiki.pm:675
+#: ../IkiWiki.pm:698
 #, perl-format
 msgid "failed to load external plugin needed for %s plugin: %s"
 msgstr ""
 
-#: ../IkiWiki.pm:1452
+#: ../IkiWiki.pm:1490
 #, 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:1646
+#: ../IkiWiki.pm:1684
 #, fuzzy, perl-format
 msgid "bad file name %s"
 msgstr "pomijanie nieprawidłowej nazwy pliku %s"
 
-#: ../IkiWiki.pm:1946
+#: ../IkiWiki.pm:1984
 #, perl-format
 msgid "template %s not found"
 msgstr "nieznaleziony szablon %s"
 
-#: ../IkiWiki.pm:2196
+#: ../IkiWiki.pm:2234
 msgid "yes"
 msgstr ""
 
-#: ../IkiWiki.pm:2273
+#: ../IkiWiki.pm:2318
 #, fuzzy, perl-format
 msgid "invalid sort type %s"
 msgstr "nieznany sposób sortowania %s"
 
-#: ../IkiWiki.pm:2294
+#: ../IkiWiki.pm:2339
 #, perl-format
 msgid "unknown sort type %s"
 msgstr "nieznany sposób sortowania %s"
 
-#: ../IkiWiki.pm:2430
+#: ../IkiWiki.pm:2475
 #, fuzzy, perl-format
 msgid "cannot match pages: %s"
 msgstr "awaria w trakcie odczytu %s: %s"
index 666524d03833a17afa99ea147409356d507db2fa..6e220468347e00fcd918a99c56554d69cca1b84b 100644 (file)
--- a/po/sv.po
+++ b/po/sv.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: ikiwiki\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-11-30 16:33-0400\n"
+"POT-Creation-Date: 2013-09-04 10:16-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"
@@ -51,85 +51,85 @@ msgstr "Inställningar sparades."
 msgid "You are banned."
 msgstr "Du är bannlyst."
 
-#: ../IkiWiki/CGI.pm:464 ../IkiWiki/CGI.pm:465 ../IkiWiki.pm:1470
+#: ../IkiWiki/CGI.pm:464 ../IkiWiki/CGI.pm:465 ../IkiWiki.pm:1508
 msgid "Error"
 msgstr "Fel"
 
-#: ../IkiWiki/Plugin/aggregate.pm:95
+#: ../IkiWiki/Plugin/aggregate.pm:86
 msgid "Aggregation triggered via web."
 msgstr ""
 
-#: ../IkiWiki/Plugin/aggregate.pm:104
+#: ../IkiWiki/Plugin/aggregate.pm:95
 msgid "Nothing to do right now, all feeds are up-to-date!"
 msgstr ""
 
-#: ../IkiWiki/Plugin/aggregate.pm:237
+#: ../IkiWiki/Plugin/aggregate.pm:227
 #, fuzzy, perl-format
 msgid "missing %s parameter"
 msgstr "mall saknar id-parameter"
 
-#: ../IkiWiki/Plugin/aggregate.pm:272
+#: ../IkiWiki/Plugin/aggregate.pm:262
 msgid "new feed"
 msgstr "ny kanal"
 
-#: ../IkiWiki/Plugin/aggregate.pm:286
+#: ../IkiWiki/Plugin/aggregate.pm:276
 msgid "posts"
 msgstr "inlägg"
 
-#: ../IkiWiki/Plugin/aggregate.pm:288
+#: ../IkiWiki/Plugin/aggregate.pm:278
 msgid "new"
 msgstr "ny"
 
-#: ../IkiWiki/Plugin/aggregate.pm:475
+#: ../IkiWiki/Plugin/aggregate.pm:465
 #, perl-format
 msgid "expiring %s (%s days old)"
 msgstr "låter %s gå ut (%s dagar gammal)"
 
-#: ../IkiWiki/Plugin/aggregate.pm:482
+#: ../IkiWiki/Plugin/aggregate.pm:472
 #, perl-format
 msgid "expiring %s"
 msgstr "låter %s gå ut"
 
-#: ../IkiWiki/Plugin/aggregate.pm:510
+#: ../IkiWiki/Plugin/aggregate.pm:500
 #, perl-format
 msgid "last checked %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/aggregate.pm:514
+#: ../IkiWiki/Plugin/aggregate.pm:504
 #, perl-format
 msgid "checking feed %s ..."
 msgstr "kontrollerar kanalen %s ..."
 
-#: ../IkiWiki/Plugin/aggregate.pm:519
+#: ../IkiWiki/Plugin/aggregate.pm:509
 #, perl-format
 msgid "could not find feed at %s"
 msgstr "kunde inte hitta kanalen på %s"
 
-#: ../IkiWiki/Plugin/aggregate.pm:542
+#: ../IkiWiki/Plugin/aggregate.pm:529
 #, fuzzy
 msgid "feed not found"
 msgstr "mallen %s hittades inte"
 
-#: ../IkiWiki/Plugin/aggregate.pm:553
+#: ../IkiWiki/Plugin/aggregate.pm:540
 #, perl-format
 msgid "(invalid UTF-8 stripped from feed)"
 msgstr ""
 
-#: ../IkiWiki/Plugin/aggregate.pm:561
+#: ../IkiWiki/Plugin/aggregate.pm:548
 #, perl-format
 msgid "(feed entities escaped)"
 msgstr ""
 
-#: ../IkiWiki/Plugin/aggregate.pm:569
+#: ../IkiWiki/Plugin/aggregate.pm:556
 msgid "feed crashed XML::Feed!"
 msgstr "kanalen kraschade XML::Feed!"
 
-#: ../IkiWiki/Plugin/aggregate.pm:661
+#: ../IkiWiki/Plugin/aggregate.pm:649
 #, perl-format
 msgid "creating new page %s"
 msgstr "skapar nya sidan %s"
 
-#: ../IkiWiki/Plugin/aggregate.pm:689 ../IkiWiki/Plugin/edittemplate.pm:135
+#: ../IkiWiki/Plugin/aggregate.pm:677 ../IkiWiki/Plugin/edittemplate.pm:135
 #, fuzzy
 msgid "failed to process template:"
 msgstr "misslyckades med att behandla mall:"
@@ -138,7 +138,7 @@ msgstr "misslyckades med att behandla mall:"
 msgid "deleting bucket.."
 msgstr ""
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:227
+#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:225
 msgid "done"
 msgstr "klar"
 
@@ -157,7 +157,7 @@ msgstr "Misslyckades med att skicka e-post"
 msgid "Failed to save file to S3: "
 msgstr "Misslyckades med att skicka e-post"
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:247
+#: ../IkiWiki/Plugin/amazon_s3.pm:248
 #, fuzzy
 msgid "Failed to delete file from S3: "
 msgstr "misslyckades med att skriva %s: %s"
@@ -175,15 +175,15 @@ msgstr ""
 msgid "bad attachment filename"
 msgstr ""
 
-#: ../IkiWiki/Plugin/attachment.pm:295
+#: ../IkiWiki/Plugin/attachment.pm:296
 msgid "attachment upload"
 msgstr ""
 
-#: ../IkiWiki/Plugin/attachment.pm:346
+#: ../IkiWiki/Plugin/attachment.pm:347
 msgid "this attachment is not yet saved"
 msgstr ""
 
-#: ../IkiWiki/Plugin/attachment.pm:363
+#: ../IkiWiki/Plugin/attachment.pm:365
 msgid "just uploaded"
 msgstr ""
 
@@ -192,7 +192,7 @@ msgstr ""
 msgid "creating index page %s"
 msgstr "skapar nya sidan %s"
 
-#: ../IkiWiki/Plugin/blogspam.pm:118
+#: ../IkiWiki/Plugin/blogspam.pm:119
 msgid ""
 "Sorry, but that looks like spam to <a href=\"http://blogspam.net/"
 "\">blogspam</a>: "
@@ -207,83 +207,87 @@ msgstr ""
 msgid "There are no broken links!"
 msgstr "Det finns inga trasiga länkar!"
 
-#: ../IkiWiki/Plugin/comments.pm:114
+#: ../IkiWiki/Plugin/comments.pm:124
 #, fuzzy, perl-format
 msgid "this comment needs %s"
 msgstr "skapar %s"
 
-#: ../IkiWiki/Plugin/comments.pm:117
+#: ../IkiWiki/Plugin/comments.pm:127
 msgid "moderation"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:138 ../IkiWiki/Plugin/format.pm:50
+#: ../IkiWiki/Plugin/comments.pm:154 ../IkiWiki/Plugin/format.pm:50
 #, perl-format
 msgid "unsupported page format %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:143
+#: ../IkiWiki/Plugin/comments.pm:159
 msgid "comment must have content"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:201
+#: ../IkiWiki/Plugin/comments.pm:217
 msgid "Anonymous"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:263
+#: ../IkiWiki/Plugin/comments.pm:279
 msgid "Comment Moderation"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:379 ../IkiWiki/Plugin/editpage.pm:95
-#: ../IkiWiki/Plugin/editpage.pm:101
+#: ../IkiWiki/Plugin/comments.pm:375 ../IkiWiki/Plugin/comments.pm:379
+msgid "email replies to me"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:413 ../IkiWiki/Plugin/editpage.pm:96
+#: ../IkiWiki/Plugin/editpage.pm:102
 msgid "bad page name"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:382
+#: ../IkiWiki/Plugin/comments.pm:416
 #, fuzzy, perl-format
 msgid "commenting on %s"
 msgstr "skapar %s"
 
-#: ../IkiWiki/Plugin/comments.pm:399
+#: ../IkiWiki/Plugin/comments.pm:433
 #, perl-format
 msgid "page '%s' doesn't exist, so you can't comment"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:406
+#: ../IkiWiki/Plugin/comments.pm:440
 #, perl-format
 msgid "comments on page '%s' are closed"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:520
+#: ../IkiWiki/Plugin/comments.pm:565
 msgid "comment stored for moderation"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:522
+#: ../IkiWiki/Plugin/comments.pm:567
 msgid "Your comment will be posted after moderator review"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:535
+#: ../IkiWiki/Plugin/comments.pm:580
 msgid "Added a comment"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:539
+#: ../IkiWiki/Plugin/comments.pm:584
 #, perl-format
 msgid "Added a comment: %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:608 ../IkiWiki/Plugin/userlist.pm:55
+#: ../IkiWiki/Plugin/comments.pm:654 ../IkiWiki/Plugin/userlist.pm:55
 #: ../IkiWiki/Plugin/websetup.pm:272
 msgid "you are not logged in as an admin"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:660
+#: ../IkiWiki/Plugin/comments.pm:708
 msgid "Comment moderation"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:701
+#: ../IkiWiki/Plugin/comments.pm:749
 msgid "comment moderation"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:862
+#: ../IkiWiki/Plugin/comments.pm:910
 #, perl-format
 msgid "%i comment"
 msgid_plural "%i comments"
@@ -293,11 +297,11 @@ msgstr[1] ""
 #. translators: Here "Comment" is a verb;
 #. translators: the user clicks on it to
 #. translators: post a comment.
-#: ../IkiWiki/Plugin/comments.pm:872
+#: ../IkiWiki/Plugin/comments.pm:920
 msgid "Comment"
 msgstr ""
 
-#: ../IkiWiki/Plugin/conditional.pm:28 ../IkiWiki/Plugin/cutpaste.pm:46
+#: ../IkiWiki/Plugin/conditional.pm:27 ../IkiWiki/Plugin/cutpaste.pm:46
 #: ../IkiWiki/Plugin/cutpaste.pm:60 ../IkiWiki/Plugin/cutpaste.pm:75
 #: ../IkiWiki/Plugin/testpagespec.pm:26
 #, perl-format
@@ -318,19 +322,23 @@ msgstr ""
 msgid "removing old preview %s"
 msgstr "tar bort gammal sida %s"
 
-#: ../IkiWiki/Plugin/editpage.pm:117
+#: ../IkiWiki/Plugin/editpage.pm:118
 #, perl-format
 msgid "%s is not an editable page"
 msgstr ""
 
-#: ../IkiWiki/Plugin/editpage.pm:307
+#: ../IkiWiki/Plugin/editpage.pm:166
+msgid "email comments to me"
+msgstr ""
+
+#: ../IkiWiki/Plugin/editpage.pm:319
 #, perl-format
 msgid "creating %s"
 msgstr "skapar %s"
 
-#: ../IkiWiki/Plugin/editpage.pm:325 ../IkiWiki/Plugin/editpage.pm:344
-#: ../IkiWiki/Plugin/editpage.pm:355 ../IkiWiki/Plugin/editpage.pm:400
-#: ../IkiWiki/Plugin/editpage.pm:442
+#: ../IkiWiki/Plugin/editpage.pm:337 ../IkiWiki/Plugin/editpage.pm:356
+#: ../IkiWiki/Plugin/editpage.pm:367 ../IkiWiki/Plugin/editpage.pm:412
+#: ../IkiWiki/Plugin/editpage.pm:454
 #, perl-format
 msgid "editing %s"
 msgstr "redigerar %s"
@@ -378,26 +386,26 @@ msgstr "kan inte läsa %s: %s"
 msgid "%s is an attachment, not a page."
 msgstr ""
 
-#: ../IkiWiki/Plugin/git.pm:777 ../IkiWiki/Plugin/git.pm:840
-#: ../IkiWiki.pm:1690
+#: ../IkiWiki/Plugin/git.pm:789 ../IkiWiki/Plugin/git.pm:852
+#: ../IkiWiki.pm:1728
 #, perl-format
 msgid "you are not allowed to change %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/git.pm:799
+#: ../IkiWiki/Plugin/git.pm:811
 #, perl-format
 msgid "you cannot act on a file with mode %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/git.pm:803
+#: ../IkiWiki/Plugin/git.pm:815
 msgid "you are not allowed to change file modes"
 msgstr ""
 
-#: ../IkiWiki/Plugin/git.pm:873
+#: ../IkiWiki/Plugin/git.pm:885
 msgid "you are not allowed to revert a merge"
 msgstr ""
 
-#: ../IkiWiki/Plugin/git.pm:892
+#: ../IkiWiki/Plugin/git.pm:902
 #, fuzzy, perl-format
 msgid "Failed to revert commit %s"
 msgstr "misslyckades med att kompilera %s"
@@ -412,7 +420,7 @@ msgstr "Måste ange %s när sökinsticket används"
 msgid "failed to run graphviz"
 msgstr "linkmap misslyckades att köra dot"
 
-#: ../IkiWiki/Plugin/graphviz.pm:143
+#: ../IkiWiki/Plugin/graphviz.pm:144
 msgid "prog not a valid graphviz program"
 msgstr ""
 
@@ -426,7 +434,7 @@ msgstr ""
 msgid "Source code: %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/highlight.pm:179
+#: ../IkiWiki/Plugin/highlight.pm:180
 msgid ""
 "warning: highlight perl module not available; falling back to pass through"
 msgstr ""
@@ -475,31 +483,31 @@ msgstr "mallen %s hittades inte"
 msgid "missing pages parameter"
 msgstr "mall saknar id-parameter"
 
-#: ../IkiWiki/Plugin/inline.pm:192
+#: ../IkiWiki/Plugin/inline.pm:209
 #, perl-format
 msgid "the %s and %s parameters cannot be used together"
 msgstr ""
 
-#: ../IkiWiki/Plugin/inline.pm:297
+#: ../IkiWiki/Plugin/inline.pm:315
 #, perl-format
 msgid "%s (RSS feed)"
 msgstr ""
 
-#: ../IkiWiki/Plugin/inline.pm:301
+#: ../IkiWiki/Plugin/inline.pm:319
 #, perl-format
 msgid "%s (Atom feed)"
 msgstr ""
 
-#: ../IkiWiki/Plugin/inline.pm:330
+#: ../IkiWiki/Plugin/inline.pm:348
 msgid "Add a new post titled:"
 msgstr ""
 
-#: ../IkiWiki/Plugin/inline.pm:369 ../IkiWiki/Plugin/template.pm:44
+#: ../IkiWiki/Plugin/inline.pm:387 ../IkiWiki/Plugin/template.pm:44
 #, fuzzy, perl-format
 msgid "failed to process template %s"
 msgstr "misslyckades med att behandla mall:"
 
-#: ../IkiWiki/Plugin/inline.pm:695
+#: ../IkiWiki/Plugin/inline.pm:725
 msgid "RPC::XML::Client not found, not pinging"
 msgstr "RPC::XML::Client hittades inte, pingar inte"
 
@@ -518,46 +526,51 @@ msgstr ""
 msgid "%s is locked and cannot be edited"
 msgstr "%s är låst av %s och kan inte redigeras"
 
-#: ../IkiWiki/Plugin/mdwn.pm:45
+#: ../IkiWiki/Plugin/mdwn.pm:52
 msgid "multimarkdown is enabled, but Text::MultiMarkdown is not installed"
 msgstr ""
 
-#: ../IkiWiki/Plugin/mdwn.pm:70
+#: ../IkiWiki/Plugin/mdwn.pm:96
 #, 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:175
+#: ../IkiWiki/Plugin/meta.pm:127
 #, fuzzy
-msgid "stylesheet not found"
+msgid "enclosure not found"
 msgstr "mallen %s hittades inte"
 
 #: ../IkiWiki/Plugin/meta.pm:187
 #, fuzzy
+msgid "stylesheet not found"
+msgstr "mallen %s hittades inte"
+
+#: ../IkiWiki/Plugin/meta.pm:199
+#, fuzzy
 msgid "script not found"
 msgstr "mallen %s hittades inte"
 
-#: ../IkiWiki/Plugin/meta.pm:235
+#: ../IkiWiki/Plugin/meta.pm:247
 #, fuzzy
 msgid "redir page not found"
 msgstr "mallen %s hittades inte"
 
-#: ../IkiWiki/Plugin/meta.pm:249
+#: ../IkiWiki/Plugin/meta.pm:261
 #, fuzzy
 msgid "redir cycle is not allowed"
 msgstr "mallen %s hittades inte"
 
-#: ../IkiWiki/Plugin/meta.pm:427
+#: ../IkiWiki/Plugin/meta.pm:450
 msgid "sort=meta requires a parameter"
 msgstr ""
 
-#: ../IkiWiki/Plugin/mirrorlist.pm:44
+#: ../IkiWiki/Plugin/mirrorlist.pm:57
 msgid "Mirrors"
 msgstr "Speglar"
 
-#: ../IkiWiki/Plugin/mirrorlist.pm:44
+#: ../IkiWiki/Plugin/mirrorlist.pm:57
 msgid "Mirror"
 msgstr "Spegel"
 
@@ -569,6 +582,18 @@ msgstr ""
 msgid "more"
 msgstr ""
 
+#: ../IkiWiki/Plugin/notifyemail.pm:72
+msgid "Cannot subscribe your email address without logging in."
+msgstr ""
+
+#: ../IkiWiki/Plugin/notifyemail.pm:136
+msgid "change notification:"
+msgstr ""
+
+#: ../IkiWiki/Plugin/notifyemail.pm:138
+msgid "comment notification:"
+msgstr ""
+
 #: ../IkiWiki/Plugin/openid.pm:71
 #, fuzzy, perl-format
 msgid "failed to load openid module: "
@@ -583,42 +608,50 @@ msgstr "Alla sidor länkas till av andra sidor."
 msgid "bad or missing template"
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:231
+#: ../IkiWiki/Plugin/passwordauth.pm:145 ../IkiWiki/Plugin/passwordauth.pm:337
+msgid "Error creating account."
+msgstr "Fel vid skapandet av konto."
+
+#: ../IkiWiki/Plugin/passwordauth.pm:297
 msgid "Your user page: "
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:238
+#: ../IkiWiki/Plugin/passwordauth.pm:304
 msgid "Create your user page"
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:268
+#: ../IkiWiki/Plugin/passwordauth.pm:334
 msgid "Account creation successful. Now you can Login."
 msgstr "Kontot har skapats. Du kan nu logga in."
 
-#: ../IkiWiki/Plugin/passwordauth.pm:271
-msgid "Error creating account."
-msgstr "Fel vid skapandet av konto."
-
-#: ../IkiWiki/Plugin/passwordauth.pm:278
+#: ../IkiWiki/Plugin/passwordauth.pm:344
 msgid "No email address, so cannot email password reset instructions."
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:312
+#: ../IkiWiki/Plugin/passwordauth.pm:371
 msgid "Failed to send mail"
 msgstr "Misslyckades med att skicka e-post"
 
-#: ../IkiWiki/Plugin/passwordauth.pm:314
+#: ../IkiWiki/Plugin/passwordauth.pm:373
 msgid "You have been mailed password reset instructions."
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:349
+#: ../IkiWiki/Plugin/passwordauth.pm:408
 msgid "incorrect password reset url"
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:352
+#: ../IkiWiki/Plugin/passwordauth.pm:411
 msgid "password reset denied"
 msgstr ""
 
+#: ../IkiWiki/Plugin/passwordauth.pm:424
+msgid "incorrect url"
+msgstr ""
+
+#: ../IkiWiki/Plugin/passwordauth.pm:427
+msgid "access denied"
+msgstr ""
+
 #: ../IkiWiki/Plugin/pingee.pm:30
 msgid "Ping received."
 msgstr ""
@@ -646,97 +679,101 @@ msgstr "RPC::XML::Client hittades inte, pingar inte"
 msgid "warning: Old po4a detected! Recommend upgrade to 0.35."
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:180
+#: ../IkiWiki/Plugin/po.pm:179
 #, perl-format
 msgid "%s is not a valid language code"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:192
+#: ../IkiWiki/Plugin/po.pm:191
 #, 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:197
+#: ../IkiWiki/Plugin/po.pm:196
 msgid ""
 "po_link_to=negotiated requires usedirs to be enabled, falling back to "
 "po_link_to=default"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:468
+#: ../IkiWiki/Plugin/po.pm:467
 msgid "updated PO files"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:491
+#: ../IkiWiki/Plugin/po.pm:490
 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:511
+#: ../IkiWiki/Plugin/po.pm:510
 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:957
+#: ../IkiWiki/Plugin/po.pm:956
 #, perl-format
 msgid "POT file (%s) does not exist"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:971
+#: ../IkiWiki/Plugin/po.pm:970
 #, fuzzy, perl-format
 msgid "failed to copy underlay PO file to %s"
 msgstr "misslyckades med att kompilera %s"
 
-#: ../IkiWiki/Plugin/po.pm:980
+#: ../IkiWiki/Plugin/po.pm:979
 #, fuzzy, perl-format
 msgid "failed to update %s"
 msgstr "misslyckades med att kompilera %s"
 
-#: ../IkiWiki/Plugin/po.pm:986
+#: ../IkiWiki/Plugin/po.pm:985
 #, fuzzy, perl-format
 msgid "failed to copy the POT file to %s"
 msgstr "misslyckades med att kompilera %s"
 
-#: ../IkiWiki/Plugin/po.pm:1022
+#: ../IkiWiki/Plugin/po.pm:1021
 msgid "N/A"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:1033
+#: ../IkiWiki/Plugin/po.pm:1032
 #, fuzzy, perl-format
 msgid "failed to translate %s"
 msgstr "misslyckades med att skriva %s: %s"
 
-#: ../IkiWiki/Plugin/po.pm:1112
+#: ../IkiWiki/Plugin/po.pm:1111
 msgid "removed obsolete PO files"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:1169 ../IkiWiki/Plugin/po.pm:1181
-#: ../IkiWiki/Plugin/po.pm:1220
+#: ../IkiWiki/Plugin/po.pm:1168 ../IkiWiki/Plugin/po.pm:1180
+#: ../IkiWiki/Plugin/po.pm:1219
 #, fuzzy, perl-format
 msgid "failed to write %s"
 msgstr "misslyckades med att skriva %s: %s"
 
-#: ../IkiWiki/Plugin/po.pm:1179
+#: ../IkiWiki/Plugin/po.pm:1178
 #, fuzzy
 msgid "failed to translate"
 msgstr "linkmap misslyckades att köra dot"
 
-#: ../IkiWiki/Plugin/po.pm:1232
+#: ../IkiWiki/Plugin/po.pm:1231
 msgid "invalid gettext data, go back to previous page to continue edit"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:1275
+#: ../IkiWiki/Plugin/po.pm:1274
 #, perl-format
 msgid "%s has invalid syntax: must use CODE|NAME"
 msgstr ""
 
-#: ../IkiWiki/Plugin/poll.pm:70
+#: ../IkiWiki/Plugin/poll.pm:72 ../IkiWiki/Plugin/poll.pm:87
 msgid "vote"
 msgstr "röst"
 
-#: ../IkiWiki/Plugin/poll.pm:78
+#: ../IkiWiki/Plugin/poll.pm:86
+msgid "Write in"
+msgstr ""
+
+#: ../IkiWiki/Plugin/poll.pm:93
 msgid "Total votes:"
 msgstr "Antal röster:"
 
@@ -840,35 +877,35 @@ msgstr ""
 msgid "confirm reversion of %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/recentchangesdiff.pm:36
+#: ../IkiWiki/Plugin/recentchangesdiff.pm:49
 msgid "(Diff truncated)"
 msgstr ""
 
-#: ../IkiWiki/Plugin/remove.pm:32 ../IkiWiki/Plugin/rename.pm:37
+#: ../IkiWiki/Plugin/remove.pm:39 ../IkiWiki/Plugin/rename.pm:37
 #, perl-format
 msgid "%s does not exist"
 msgstr ""
 
-#: ../IkiWiki/Plugin/remove.pm:39
+#: ../IkiWiki/Plugin/remove.pm:56
 #, 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:42 ../IkiWiki/Plugin/rename.pm:46
+#: ../IkiWiki/Plugin/remove.pm:59 ../IkiWiki/Plugin/rename.pm:46
 #, perl-format
 msgid "%s is not a file"
 msgstr ""
 
-#: ../IkiWiki/Plugin/remove.pm:149
+#: ../IkiWiki/Plugin/remove.pm:166
 #, perl-format
 msgid "confirm removal of %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/remove.pm:186
+#: ../IkiWiki/Plugin/remove.pm:203
 msgid "Please select the attachments to remove."
 msgstr ""
 
-#: ../IkiWiki/Plugin/remove.pm:230
+#: ../IkiWiki/Plugin/remove.pm:263
 msgid "removed"
 msgstr ""
 
@@ -906,20 +943,20 @@ msgstr "ritar upp %s"
 msgid "Also rename SubPages and attachments"
 msgstr ""
 
-#: ../IkiWiki/Plugin/rename.pm:258
+#: ../IkiWiki/Plugin/rename.pm:266
 msgid "Only one attachment can be renamed at a time."
 msgstr ""
 
-#: ../IkiWiki/Plugin/rename.pm:261
+#: ../IkiWiki/Plugin/rename.pm:269
 msgid "Please select the attachment to rename."
 msgstr ""
 
-#: ../IkiWiki/Plugin/rename.pm:371
+#: ../IkiWiki/Plugin/rename.pm:379
 #, perl-format
 msgid "rename %s to %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/rename.pm:597
+#: ../IkiWiki/Plugin/rename.pm:605
 #, fuzzy, perl-format
 msgid "update for rename of %s to %s"
 msgstr "uppdatering av %s, %s av %s"
@@ -1048,6 +1085,11 @@ msgstr ""
 msgid "failed to generate image from code"
 msgstr "misslyckades med att skriva %s: %s"
 
+#: ../IkiWiki/Plugin/trail.pm:393
+#, perl-format
+msgid "building %s, its previous or next page has changed"
+msgstr ""
+
 #: ../IkiWiki/Plugin/transient.pm:45
 #, fuzzy, perl-format
 msgid "removing transient version of %s"
@@ -1114,59 +1156,59 @@ msgstr ""
 msgid "scanning %s"
 msgstr "söker av %s"
 
-#: ../IkiWiki/Render.pm:280
+#: ../IkiWiki/Render.pm:281
 #, perl-format
 msgid ""
 "symlink found in srcdir path (%s) -- set allow_symlinks_before_srcdir to "
 "allow this"
 msgstr ""
 
-#: ../IkiWiki/Render.pm:316
+#: ../IkiWiki/Render.pm:317
 #, perl-format
 msgid "skipping bad filename %s"
 msgstr "hoppar över felaktigt filnamn %s"
 
-#: ../IkiWiki/Render.pm:332
+#: ../IkiWiki/Render.pm:333
 #, perl-format
 msgid "%s has multiple possible source pages"
 msgstr ""
 
-#: ../IkiWiki/Render.pm:372
+#: ../IkiWiki/Render.pm:373
 #, perl-format
 msgid "querying %s for file creation and modification times.."
 msgstr ""
 
-#: ../IkiWiki/Render.pm:446
+#: ../IkiWiki/Render.pm:447
 #, fuzzy, perl-format
 msgid "removing obsolete %s"
 msgstr "tar bort gammal sida %s"
 
-#: ../IkiWiki/Render.pm:530
+#: ../IkiWiki/Render.pm:531
 #, fuzzy, perl-format
 msgid "building %s, which links to %s"
 msgstr "ritar upp %s, vilken länkar till %s"
 
-#: ../IkiWiki/Render.pm:539
+#: ../IkiWiki/Render.pm:540
 #, 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:622 ../IkiWiki/Render.pm:704
+#: ../IkiWiki/Render.pm:623 ../IkiWiki/Render.pm:705
 #, fuzzy, perl-format
 msgid "building %s, which depends on %s"
 msgstr "ritar upp %s, vilken är beroende av %s"
 
-#: ../IkiWiki/Render.pm:717
+#: ../IkiWiki/Render.pm:718
 #, 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:797
+#: ../IkiWiki/Render.pm:806
 #, fuzzy, perl-format
 msgid "building %s"
 msgstr "redigerar %s"
 
-#: ../IkiWiki/Render.pm:849
+#: ../IkiWiki/Render.pm:871
 #, fuzzy, perl-format
 msgid "ikiwiki: cannot build %s"
 msgstr "ikiwiki: kan inte rita upp %s"
@@ -1210,27 +1252,31 @@ msgstr ""
 msgid "generating wrappers.."
 msgstr "genererar wrappers.."
 
-#: ../IkiWiki/Wrapper.pm:36
+#: ../IkiWiki/Wrapper.pm:37
 #, perl-format
 msgid "%s doesn't seem to be executable"
 msgstr "%s verkar inte vara körbar"
 
-#: ../IkiWiki/Wrapper.pm:40
+#: ../IkiWiki/Wrapper.pm:41
 msgid "cannot create a wrapper that uses a setup file"
 msgstr "kan inte skapa en wrapper som använder en konfigurationsfil"
 
-#: ../IkiWiki/Wrapper.pm:44
+#: ../IkiWiki/Wrapper.pm:45
 msgid "wrapper filename not specified"
 msgstr "filnamn för wrapper har inte angivits"
 
+#: ../IkiWiki/Wrapper.pm:109
+msgid "Please wait"
+msgstr ""
+
 #. translators: The parameter is a C filename.
-#: ../IkiWiki/Wrapper.pm:220
+#: ../IkiWiki/Wrapper.pm:268
 #, perl-format
 msgid "failed to compile %s"
 msgstr "misslyckades med att kompilera %s"
 
 #. translators: The parameter is a filename.
-#: ../IkiWiki/Wrapper.pm:240
+#: ../IkiWiki/Wrapper.pm:288
 #, perl-format
 msgid "successfully generated %s"
 msgstr "generering av %s lyckades"
@@ -1251,66 +1297,66 @@ msgstr ""
 msgid "usage: --set-yaml var=value"
 msgstr ""
 
-#: ../ikiwiki.in:216
+#: ../ikiwiki.in:214
 msgid "rebuilding wiki.."
 msgstr "bygger om wiki.."
 
-#: ../ikiwiki.in:219
+#: ../ikiwiki.in:217
 msgid "refreshing wiki.."
 msgstr "uppdaterar wiki.."
 
-#: ../IkiWiki.pm:232
+#: ../IkiWiki.pm:248
 msgid "Discussion"
 msgstr "Diskussion"
 
-#: ../IkiWiki.pm:557
+#: ../IkiWiki.pm:580
 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:605
+#: ../IkiWiki.pm:628
 #, perl-format
 msgid "unsupported umask setting %s"
 msgstr ""
 
-#: ../IkiWiki.pm:645
+#: ../IkiWiki.pm:668
 msgid "cannot use multiple rcs plugins"
 msgstr ""
 
-#: ../IkiWiki.pm:675
+#: ../IkiWiki.pm:698
 #, perl-format
 msgid "failed to load external plugin needed for %s plugin: %s"
 msgstr ""
 
-#: ../IkiWiki.pm:1452
+#: ../IkiWiki.pm:1490
 #, fuzzy, perl-format
 msgid "preprocessing loop detected on %s at depth %i"
 msgstr "%s förbehandlingsslinga detekterades på %s, djup %i"
 
-#: ../IkiWiki.pm:1646
+#: ../IkiWiki.pm:1684
 #, fuzzy, perl-format
 msgid "bad file name %s"
 msgstr "hoppar över felaktigt filnamn %s"
 
-#: ../IkiWiki.pm:1946
+#: ../IkiWiki.pm:1984
 #, perl-format
 msgid "template %s not found"
 msgstr "mallen %s hittades inte"
 
-#: ../IkiWiki.pm:2196
+#: ../IkiWiki.pm:2234
 msgid "yes"
 msgstr ""
 
-#: ../IkiWiki.pm:2273
+#: ../IkiWiki.pm:2318
 #, fuzzy, perl-format
 msgid "invalid sort type %s"
 msgstr "okänd sorteringstyp %s"
 
-#: ../IkiWiki.pm:2294
+#: ../IkiWiki.pm:2339
 #, perl-format
 msgid "unknown sort type %s"
 msgstr "okänd sorteringstyp %s"
 
-#: ../IkiWiki.pm:2430
+#: ../IkiWiki.pm:2475
 #, fuzzy, perl-format
 msgid "cannot match pages: %s"
 msgstr "kan inte läsa %s: %s"
index ecf76c6ece88c598b8da76c9d53b9b8672c831e3..9b209cb8f6da11895d71b3e7ea8cf26c0c27112c 100644 (file)
--- a/po/tr.po
+++ b/po/tr.po
@@ -5,7 +5,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: ikiwiki 3.20091031\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-11-30 16:33-0400\n"
+"POT-Creation-Date: 2013-09-04 10:16-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"
@@ -48,84 +48,84 @@ msgstr "Tercihler kaydedildi."
 msgid "You are banned."
 msgstr ""
 
-#: ../IkiWiki/CGI.pm:464 ../IkiWiki/CGI.pm:465 ../IkiWiki.pm:1470
+#: ../IkiWiki/CGI.pm:464 ../IkiWiki/CGI.pm:465 ../IkiWiki.pm:1508
 msgid "Error"
 msgstr "Hata"
 
-#: ../IkiWiki/Plugin/aggregate.pm:95
+#: ../IkiWiki/Plugin/aggregate.pm:86
 msgid "Aggregation triggered via web."
 msgstr ""
 
-#: ../IkiWiki/Plugin/aggregate.pm:104
+#: ../IkiWiki/Plugin/aggregate.pm:95
 msgid "Nothing to do right now, all feeds are up-to-date!"
 msgstr ""
 
-#: ../IkiWiki/Plugin/aggregate.pm:237
+#: ../IkiWiki/Plugin/aggregate.pm:227
 #, perl-format
 msgid "missing %s parameter"
 msgstr "%s parametresi eksik"
 
-#: ../IkiWiki/Plugin/aggregate.pm:272
+#: ../IkiWiki/Plugin/aggregate.pm:262
 msgid "new feed"
 msgstr "yeni özet akışı"
 
-#: ../IkiWiki/Plugin/aggregate.pm:286
+#: ../IkiWiki/Plugin/aggregate.pm:276
 msgid "posts"
 msgstr "gönderi"
 
-#: ../IkiWiki/Plugin/aggregate.pm:288
+#: ../IkiWiki/Plugin/aggregate.pm:278
 msgid "new"
 msgstr "yeni"
 
-#: ../IkiWiki/Plugin/aggregate.pm:475
+#: ../IkiWiki/Plugin/aggregate.pm:465
 #, perl-format
 msgid "expiring %s (%s days old)"
 msgstr "%s için zaman aşımı (%s gün eski)"
 
-#: ../IkiWiki/Plugin/aggregate.pm:482
+#: ../IkiWiki/Plugin/aggregate.pm:472
 #, perl-format
 msgid "expiring %s"
 msgstr "%s için zaman aşımı"
 
-#: ../IkiWiki/Plugin/aggregate.pm:510
+#: ../IkiWiki/Plugin/aggregate.pm:500
 #, perl-format
 msgid "last checked %s"
 msgstr "son güncelleme: %s"
 
-#: ../IkiWiki/Plugin/aggregate.pm:514
+#: ../IkiWiki/Plugin/aggregate.pm:504
 #, perl-format
 msgid "checking feed %s ..."
 msgstr "%s özet akışı denetleniyor ..."
 
-#: ../IkiWiki/Plugin/aggregate.pm:519
+#: ../IkiWiki/Plugin/aggregate.pm:509
 #, perl-format
 msgid "could not find feed at %s"
 msgstr "%s özet akışı bulunamadı"
 
-#: ../IkiWiki/Plugin/aggregate.pm:542
+#: ../IkiWiki/Plugin/aggregate.pm:529
 msgid "feed not found"
 msgstr "özet akışı bulunamadı"
 
-#: ../IkiWiki/Plugin/aggregate.pm:553
+#: ../IkiWiki/Plugin/aggregate.pm:540
 #, perl-format
 msgid "(invalid UTF-8 stripped from feed)"
 msgstr "(geçersiz UTF-8 dizgisi özet akışından çıkarıldı)"
 
-#: ../IkiWiki/Plugin/aggregate.pm:561
+#: ../IkiWiki/Plugin/aggregate.pm:548
 #, perl-format
 msgid "(feed entities escaped)"
 msgstr "(özet akışı girdileri işlendi)"
 
-#: ../IkiWiki/Plugin/aggregate.pm:569
+#: ../IkiWiki/Plugin/aggregate.pm:556
 msgid "feed crashed XML::Feed!"
 msgstr "özet akışı XML::Feed'in çakılmasına yol açtı!"
 
-#: ../IkiWiki/Plugin/aggregate.pm:661
+#: ../IkiWiki/Plugin/aggregate.pm:649
 #, perl-format
 msgid "creating new page %s"
 msgstr "%s için yeni sayfa oluşturuluyor"
 
-#: ../IkiWiki/Plugin/aggregate.pm:689 ../IkiWiki/Plugin/edittemplate.pm:135
+#: ../IkiWiki/Plugin/aggregate.pm:677 ../IkiWiki/Plugin/edittemplate.pm:135
 msgid "failed to process template:"
 msgstr ""
 
@@ -133,7 +133,7 @@ msgstr ""
 msgid "deleting bucket.."
 msgstr ""
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:227
+#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:225
 msgid "done"
 msgstr ""
 
@@ -150,7 +150,7 @@ msgstr ""
 msgid "Failed to save file to S3: "
 msgstr ""
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:247
+#: ../IkiWiki/Plugin/amazon_s3.pm:248
 msgid "Failed to delete file from S3: "
 msgstr ""
 
@@ -167,15 +167,15 @@ msgstr ""
 msgid "bad attachment filename"
 msgstr ""
 
-#: ../IkiWiki/Plugin/attachment.pm:295
+#: ../IkiWiki/Plugin/attachment.pm:296
 msgid "attachment upload"
 msgstr ""
 
-#: ../IkiWiki/Plugin/attachment.pm:346
+#: ../IkiWiki/Plugin/attachment.pm:347
 msgid "this attachment is not yet saved"
 msgstr ""
 
-#: ../IkiWiki/Plugin/attachment.pm:363
+#: ../IkiWiki/Plugin/attachment.pm:365
 msgid "just uploaded"
 msgstr ""
 
@@ -184,7 +184,7 @@ msgstr ""
 msgid "creating index page %s"
 msgstr "%s için yeni sayfa oluşturuluyor"
 
-#: ../IkiWiki/Plugin/blogspam.pm:118
+#: ../IkiWiki/Plugin/blogspam.pm:119
 msgid ""
 "Sorry, but that looks like spam to <a href=\"http://blogspam.net/"
 "\">blogspam</a>: "
@@ -199,83 +199,87 @@ msgstr ""
 msgid "There are no broken links!"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:114
+#: ../IkiWiki/Plugin/comments.pm:124
 #, perl-format
 msgid "this comment needs %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:117
+#: ../IkiWiki/Plugin/comments.pm:127
 msgid "moderation"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:138 ../IkiWiki/Plugin/format.pm:50
+#: ../IkiWiki/Plugin/comments.pm:154 ../IkiWiki/Plugin/format.pm:50
 #, perl-format
 msgid "unsupported page format %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:143
+#: ../IkiWiki/Plugin/comments.pm:159
 msgid "comment must have content"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:201
+#: ../IkiWiki/Plugin/comments.pm:217
 msgid "Anonymous"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:263
+#: ../IkiWiki/Plugin/comments.pm:279
 msgid "Comment Moderation"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:379 ../IkiWiki/Plugin/editpage.pm:95
-#: ../IkiWiki/Plugin/editpage.pm:101
+#: ../IkiWiki/Plugin/comments.pm:375 ../IkiWiki/Plugin/comments.pm:379
+msgid "email replies to me"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:413 ../IkiWiki/Plugin/editpage.pm:96
+#: ../IkiWiki/Plugin/editpage.pm:102
 msgid "bad page name"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:382
+#: ../IkiWiki/Plugin/comments.pm:416
 #, perl-format
 msgid "commenting on %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:399
+#: ../IkiWiki/Plugin/comments.pm:433
 #, perl-format
 msgid "page '%s' doesn't exist, so you can't comment"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:406
+#: ../IkiWiki/Plugin/comments.pm:440
 #, perl-format
 msgid "comments on page '%s' are closed"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:520
+#: ../IkiWiki/Plugin/comments.pm:565
 msgid "comment stored for moderation"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:522
+#: ../IkiWiki/Plugin/comments.pm:567
 msgid "Your comment will be posted after moderator review"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:535
+#: ../IkiWiki/Plugin/comments.pm:580
 msgid "Added a comment"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:539
+#: ../IkiWiki/Plugin/comments.pm:584
 #, perl-format
 msgid "Added a comment: %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:608 ../IkiWiki/Plugin/userlist.pm:55
+#: ../IkiWiki/Plugin/comments.pm:654 ../IkiWiki/Plugin/userlist.pm:55
 #: ../IkiWiki/Plugin/websetup.pm:272
 msgid "you are not logged in as an admin"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:660
+#: ../IkiWiki/Plugin/comments.pm:708
 msgid "Comment moderation"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:701
+#: ../IkiWiki/Plugin/comments.pm:749
 msgid "comment moderation"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:862
+#: ../IkiWiki/Plugin/comments.pm:910
 #, perl-format
 msgid "%i comment"
 msgid_plural "%i comments"
@@ -285,11 +289,11 @@ msgstr[1] ""
 #. translators: Here "Comment" is a verb;
 #. translators: the user clicks on it to
 #. translators: post a comment.
-#: ../IkiWiki/Plugin/comments.pm:872
+#: ../IkiWiki/Plugin/comments.pm:920
 msgid "Comment"
 msgstr ""
 
-#: ../IkiWiki/Plugin/conditional.pm:28 ../IkiWiki/Plugin/cutpaste.pm:46
+#: ../IkiWiki/Plugin/conditional.pm:27 ../IkiWiki/Plugin/cutpaste.pm:46
 #: ../IkiWiki/Plugin/cutpaste.pm:60 ../IkiWiki/Plugin/cutpaste.pm:75
 #: ../IkiWiki/Plugin/testpagespec.pm:26
 #, perl-format
@@ -310,19 +314,23 @@ msgstr ""
 msgid "removing old preview %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/editpage.pm:117
+#: ../IkiWiki/Plugin/editpage.pm:118
 #, perl-format
 msgid "%s is not an editable page"
 msgstr ""
 
-#: ../IkiWiki/Plugin/editpage.pm:307
+#: ../IkiWiki/Plugin/editpage.pm:166
+msgid "email comments to me"
+msgstr ""
+
+#: ../IkiWiki/Plugin/editpage.pm:319
 #, perl-format
 msgid "creating %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/editpage.pm:325 ../IkiWiki/Plugin/editpage.pm:344
-#: ../IkiWiki/Plugin/editpage.pm:355 ../IkiWiki/Plugin/editpage.pm:400
-#: ../IkiWiki/Plugin/editpage.pm:442
+#: ../IkiWiki/Plugin/editpage.pm:337 ../IkiWiki/Plugin/editpage.pm:356
+#: ../IkiWiki/Plugin/editpage.pm:367 ../IkiWiki/Plugin/editpage.pm:412
+#: ../IkiWiki/Plugin/editpage.pm:454
 #, perl-format
 msgid "editing %s"
 msgstr ""
@@ -366,26 +374,26 @@ msgstr ""
 msgid "%s is an attachment, not a page."
 msgstr ""
 
-#: ../IkiWiki/Plugin/git.pm:777 ../IkiWiki/Plugin/git.pm:840
-#: ../IkiWiki.pm:1690
+#: ../IkiWiki/Plugin/git.pm:789 ../IkiWiki/Plugin/git.pm:852
+#: ../IkiWiki.pm:1728
 #, perl-format
 msgid "you are not allowed to change %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/git.pm:799
+#: ../IkiWiki/Plugin/git.pm:811
 #, perl-format
 msgid "you cannot act on a file with mode %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/git.pm:803
+#: ../IkiWiki/Plugin/git.pm:815
 msgid "you are not allowed to change file modes"
 msgstr ""
 
-#: ../IkiWiki/Plugin/git.pm:873
+#: ../IkiWiki/Plugin/git.pm:885
 msgid "you are not allowed to revert a merge"
 msgstr ""
 
-#: ../IkiWiki/Plugin/git.pm:892
+#: ../IkiWiki/Plugin/git.pm:902
 #, perl-format
 msgid "Failed to revert commit %s"
 msgstr ""
@@ -399,7 +407,7 @@ msgstr ""
 msgid "failed to run graphviz"
 msgstr ""
 
-#: ../IkiWiki/Plugin/graphviz.pm:143
+#: ../IkiWiki/Plugin/graphviz.pm:144
 msgid "prog not a valid graphviz program"
 msgstr ""
 
@@ -413,7 +421,7 @@ msgstr ""
 msgid "Source code: %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/highlight.pm:179
+#: ../IkiWiki/Plugin/highlight.pm:180
 msgid ""
 "warning: highlight perl module not available; falling back to pass through"
 msgstr ""
@@ -458,31 +466,31 @@ msgstr ""
 msgid "missing pages parameter"
 msgstr ""
 
-#: ../IkiWiki/Plugin/inline.pm:192
+#: ../IkiWiki/Plugin/inline.pm:209
 #, perl-format
 msgid "the %s and %s parameters cannot be used together"
 msgstr ""
 
-#: ../IkiWiki/Plugin/inline.pm:297
+#: ../IkiWiki/Plugin/inline.pm:315
 #, perl-format
 msgid "%s (RSS feed)"
 msgstr ""
 
-#: ../IkiWiki/Plugin/inline.pm:301
+#: ../IkiWiki/Plugin/inline.pm:319
 #, perl-format
 msgid "%s (Atom feed)"
 msgstr ""
 
-#: ../IkiWiki/Plugin/inline.pm:330
+#: ../IkiWiki/Plugin/inline.pm:348
 msgid "Add a new post titled:"
 msgstr ""
 
-#: ../IkiWiki/Plugin/inline.pm:369 ../IkiWiki/Plugin/template.pm:44
+#: ../IkiWiki/Plugin/inline.pm:387 ../IkiWiki/Plugin/template.pm:44
 #, perl-format
 msgid "failed to process template %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/inline.pm:695
+#: ../IkiWiki/Plugin/inline.pm:725
 msgid "RPC::XML::Client not found, not pinging"
 msgstr ""
 
@@ -500,41 +508,46 @@ msgstr ""
 msgid "%s is locked and cannot be edited"
 msgstr ""
 
-#: ../IkiWiki/Plugin/mdwn.pm:45
+#: ../IkiWiki/Plugin/mdwn.pm:52
 msgid "multimarkdown is enabled, but Text::MultiMarkdown is not installed"
 msgstr ""
 
-#: ../IkiWiki/Plugin/mdwn.pm:70
+#: ../IkiWiki/Plugin/mdwn.pm:96
 #, perl-format
 msgid "failed to load Markdown.pm perl module (%s) or /usr/bin/markdown (%s)"
 msgstr ""
 
-#: ../IkiWiki/Plugin/meta.pm:175
+#: ../IkiWiki/Plugin/meta.pm:127
+#, fuzzy
+msgid "enclosure not found"
+msgstr "özet akışı bulunamadı"
+
+#: ../IkiWiki/Plugin/meta.pm:187
 msgid "stylesheet not found"
 msgstr ""
 
-#: ../IkiWiki/Plugin/meta.pm:187
+#: ../IkiWiki/Plugin/meta.pm:199
 #, fuzzy
 msgid "script not found"
 msgstr "özet akışı bulunamadı"
 
-#: ../IkiWiki/Plugin/meta.pm:235
+#: ../IkiWiki/Plugin/meta.pm:247
 msgid "redir page not found"
 msgstr ""
 
-#: ../IkiWiki/Plugin/meta.pm:249
+#: ../IkiWiki/Plugin/meta.pm:261
 msgid "redir cycle is not allowed"
 msgstr ""
 
-#: ../IkiWiki/Plugin/meta.pm:427
+#: ../IkiWiki/Plugin/meta.pm:450
 msgid "sort=meta requires a parameter"
 msgstr ""
 
-#: ../IkiWiki/Plugin/mirrorlist.pm:44
+#: ../IkiWiki/Plugin/mirrorlist.pm:57
 msgid "Mirrors"
 msgstr ""
 
-#: ../IkiWiki/Plugin/mirrorlist.pm:44
+#: ../IkiWiki/Plugin/mirrorlist.pm:57
 msgid "Mirror"
 msgstr ""
 
@@ -546,6 +559,18 @@ msgstr ""
 msgid "more"
 msgstr ""
 
+#: ../IkiWiki/Plugin/notifyemail.pm:72
+msgid "Cannot subscribe your email address without logging in."
+msgstr ""
+
+#: ../IkiWiki/Plugin/notifyemail.pm:136
+msgid "change notification:"
+msgstr ""
+
+#: ../IkiWiki/Plugin/notifyemail.pm:138
+msgid "comment notification:"
+msgstr ""
+
 #: ../IkiWiki/Plugin/openid.pm:71
 #, perl-format
 msgid "failed to load openid module: "
@@ -559,42 +584,50 @@ msgstr ""
 msgid "bad or missing template"
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:231
+#: ../IkiWiki/Plugin/passwordauth.pm:145 ../IkiWiki/Plugin/passwordauth.pm:337
+msgid "Error creating account."
+msgstr ""
+
+#: ../IkiWiki/Plugin/passwordauth.pm:297
 msgid "Your user page: "
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:238
+#: ../IkiWiki/Plugin/passwordauth.pm:304
 msgid "Create your user page"
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:268
+#: ../IkiWiki/Plugin/passwordauth.pm:334
 msgid "Account creation successful. Now you can Login."
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:271
-msgid "Error creating account."
-msgstr ""
-
-#: ../IkiWiki/Plugin/passwordauth.pm:278
+#: ../IkiWiki/Plugin/passwordauth.pm:344
 msgid "No email address, so cannot email password reset instructions."
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:312
+#: ../IkiWiki/Plugin/passwordauth.pm:371
 msgid "Failed to send mail"
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:314
+#: ../IkiWiki/Plugin/passwordauth.pm:373
 msgid "You have been mailed password reset instructions."
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:349
+#: ../IkiWiki/Plugin/passwordauth.pm:408
 msgid "incorrect password reset url"
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:352
+#: ../IkiWiki/Plugin/passwordauth.pm:411
 msgid "password reset denied"
 msgstr ""
 
+#: ../IkiWiki/Plugin/passwordauth.pm:424
+msgid "incorrect url"
+msgstr ""
+
+#: ../IkiWiki/Plugin/passwordauth.pm:427
+msgid "access denied"
+msgstr ""
+
 #: ../IkiWiki/Plugin/pingee.pm:30
 msgid "Ping received."
 msgstr ""
@@ -621,96 +654,100 @@ msgstr ""
 msgid "warning: Old po4a detected! Recommend upgrade to 0.35."
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:180
+#: ../IkiWiki/Plugin/po.pm:179
 #, perl-format
 msgid "%s is not a valid language code"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:192
+#: ../IkiWiki/Plugin/po.pm:191
 #, 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:197
+#: ../IkiWiki/Plugin/po.pm:196
 msgid ""
 "po_link_to=negotiated requires usedirs to be enabled, falling back to "
 "po_link_to=default"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:468
+#: ../IkiWiki/Plugin/po.pm:467
 msgid "updated PO files"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:491
+#: ../IkiWiki/Plugin/po.pm:490
 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:511
+#: ../IkiWiki/Plugin/po.pm:510
 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:957
+#: ../IkiWiki/Plugin/po.pm:956
 #, perl-format
 msgid "POT file (%s) does not exist"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:971
+#: ../IkiWiki/Plugin/po.pm:970
 #, perl-format
 msgid "failed to copy underlay PO file to %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:980
+#: ../IkiWiki/Plugin/po.pm:979
 #, perl-format
 msgid "failed to update %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:986
+#: ../IkiWiki/Plugin/po.pm:985
 #, perl-format
 msgid "failed to copy the POT file to %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:1022
+#: ../IkiWiki/Plugin/po.pm:1021
 msgid "N/A"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:1033
+#: ../IkiWiki/Plugin/po.pm:1032
 #, perl-format
 msgid "failed to translate %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:1112
+#: ../IkiWiki/Plugin/po.pm:1111
 msgid "removed obsolete PO files"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:1169 ../IkiWiki/Plugin/po.pm:1181
-#: ../IkiWiki/Plugin/po.pm:1220
+#: ../IkiWiki/Plugin/po.pm:1168 ../IkiWiki/Plugin/po.pm:1180
+#: ../IkiWiki/Plugin/po.pm:1219
 #, perl-format
 msgid "failed to write %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:1179
+#: ../IkiWiki/Plugin/po.pm:1178
 msgid "failed to translate"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:1232
+#: ../IkiWiki/Plugin/po.pm:1231
 msgid "invalid gettext data, go back to previous page to continue edit"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:1275
+#: ../IkiWiki/Plugin/po.pm:1274
 #, perl-format
 msgid "%s has invalid syntax: must use CODE|NAME"
 msgstr ""
 
-#: ../IkiWiki/Plugin/poll.pm:70
+#: ../IkiWiki/Plugin/poll.pm:72 ../IkiWiki/Plugin/poll.pm:87
 msgid "vote"
 msgstr ""
 
-#: ../IkiWiki/Plugin/poll.pm:78
+#: ../IkiWiki/Plugin/poll.pm:86
+msgid "Write in"
+msgstr ""
+
+#: ../IkiWiki/Plugin/poll.pm:93
 msgid "Total votes:"
 msgstr ""
 
@@ -813,35 +850,35 @@ msgstr ""
 msgid "confirm reversion of %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/recentchangesdiff.pm:36
+#: ../IkiWiki/Plugin/recentchangesdiff.pm:49
 msgid "(Diff truncated)"
 msgstr ""
 
-#: ../IkiWiki/Plugin/remove.pm:32 ../IkiWiki/Plugin/rename.pm:37
+#: ../IkiWiki/Plugin/remove.pm:39 ../IkiWiki/Plugin/rename.pm:37
 #, perl-format
 msgid "%s does not exist"
 msgstr ""
 
-#: ../IkiWiki/Plugin/remove.pm:39
+#: ../IkiWiki/Plugin/remove.pm:56
 #, perl-format
 msgid "%s is not in the srcdir, so it cannot be deleted"
 msgstr ""
 
-#: ../IkiWiki/Plugin/remove.pm:42 ../IkiWiki/Plugin/rename.pm:46
+#: ../IkiWiki/Plugin/remove.pm:59 ../IkiWiki/Plugin/rename.pm:46
 #, perl-format
 msgid "%s is not a file"
 msgstr ""
 
-#: ../IkiWiki/Plugin/remove.pm:149
+#: ../IkiWiki/Plugin/remove.pm:166
 #, perl-format
 msgid "confirm removal of %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/remove.pm:186
+#: ../IkiWiki/Plugin/remove.pm:203
 msgid "Please select the attachments to remove."
 msgstr ""
 
-#: ../IkiWiki/Plugin/remove.pm:230
+#: ../IkiWiki/Plugin/remove.pm:263
 msgid "removed"
 msgstr ""
 
@@ -878,20 +915,20 @@ msgstr ""
 msgid "Also rename SubPages and attachments"
 msgstr ""
 
-#: ../IkiWiki/Plugin/rename.pm:258
+#: ../IkiWiki/Plugin/rename.pm:266
 msgid "Only one attachment can be renamed at a time."
 msgstr ""
 
-#: ../IkiWiki/Plugin/rename.pm:261
+#: ../IkiWiki/Plugin/rename.pm:269
 msgid "Please select the attachment to rename."
 msgstr ""
 
-#: ../IkiWiki/Plugin/rename.pm:371
+#: ../IkiWiki/Plugin/rename.pm:379
 #, perl-format
 msgid "rename %s to %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/rename.pm:597
+#: ../IkiWiki/Plugin/rename.pm:605
 #, perl-format
 msgid "update for rename of %s to %s"
 msgstr ""
@@ -1011,6 +1048,11 @@ msgstr ""
 msgid "failed to generate image from code"
 msgstr ""
 
+#: ../IkiWiki/Plugin/trail.pm:393
+#, perl-format
+msgid "building %s, its previous or next page has changed"
+msgstr ""
+
 #: ../IkiWiki/Plugin/transient.pm:45
 #, perl-format
 msgid "removing transient version of %s"
@@ -1078,59 +1120,59 @@ msgstr ""
 msgid "scanning %s"
 msgstr ""
 
-#: ../IkiWiki/Render.pm:280
+#: ../IkiWiki/Render.pm:281
 #, perl-format
 msgid ""
 "symlink found in srcdir path (%s) -- set allow_symlinks_before_srcdir to "
 "allow this"
 msgstr ""
 
-#: ../IkiWiki/Render.pm:316
+#: ../IkiWiki/Render.pm:317
 #, perl-format
 msgid "skipping bad filename %s"
 msgstr ""
 
-#: ../IkiWiki/Render.pm:332
+#: ../IkiWiki/Render.pm:333
 #, perl-format
 msgid "%s has multiple possible source pages"
 msgstr ""
 
-#: ../IkiWiki/Render.pm:372
+#: ../IkiWiki/Render.pm:373
 #, perl-format
 msgid "querying %s for file creation and modification times.."
 msgstr ""
 
-#: ../IkiWiki/Render.pm:446
+#: ../IkiWiki/Render.pm:447
 #, perl-format
 msgid "removing obsolete %s"
 msgstr ""
 
-#: ../IkiWiki/Render.pm:530
+#: ../IkiWiki/Render.pm:531
 #, perl-format
 msgid "building %s, which links to %s"
 msgstr ""
 
-#: ../IkiWiki/Render.pm:539
+#: ../IkiWiki/Render.pm:540
 #, perl-format
 msgid "removing %s, no longer built by %s"
 msgstr ""
 
-#: ../IkiWiki/Render.pm:622 ../IkiWiki/Render.pm:704
+#: ../IkiWiki/Render.pm:623 ../IkiWiki/Render.pm:705
 #, perl-format
 msgid "building %s, which depends on %s"
 msgstr ""
 
-#: ../IkiWiki/Render.pm:717
+#: ../IkiWiki/Render.pm:718
 #, perl-format
 msgid "building %s, to update its backlinks"
 msgstr ""
 
-#: ../IkiWiki/Render.pm:797
+#: ../IkiWiki/Render.pm:806
 #, perl-format
 msgid "building %s"
 msgstr ""
 
-#: ../IkiWiki/Render.pm:849
+#: ../IkiWiki/Render.pm:871
 #, perl-format
 msgid "ikiwiki: cannot build %s"
 msgstr ""
@@ -1174,27 +1216,31 @@ msgstr ""
 msgid "generating wrappers.."
 msgstr ""
 
-#: ../IkiWiki/Wrapper.pm:36
+#: ../IkiWiki/Wrapper.pm:37
 #, perl-format
 msgid "%s doesn't seem to be executable"
 msgstr ""
 
-#: ../IkiWiki/Wrapper.pm:40
+#: ../IkiWiki/Wrapper.pm:41
 msgid "cannot create a wrapper that uses a setup file"
 msgstr ""
 
-#: ../IkiWiki/Wrapper.pm:44
+#: ../IkiWiki/Wrapper.pm:45
 msgid "wrapper filename not specified"
 msgstr ""
 
+#: ../IkiWiki/Wrapper.pm:109
+msgid "Please wait"
+msgstr ""
+
 #. translators: The parameter is a C filename.
-#: ../IkiWiki/Wrapper.pm:220
+#: ../IkiWiki/Wrapper.pm:268
 #, perl-format
 msgid "failed to compile %s"
 msgstr ""
 
 #. translators: The parameter is a filename.
-#: ../IkiWiki/Wrapper.pm:240
+#: ../IkiWiki/Wrapper.pm:288
 #, perl-format
 msgid "successfully generated %s"
 msgstr ""
@@ -1215,66 +1261,66 @@ msgstr ""
 msgid "usage: --set-yaml var=value"
 msgstr ""
 
-#: ../ikiwiki.in:216
+#: ../ikiwiki.in:214
 msgid "rebuilding wiki.."
 msgstr ""
 
-#: ../ikiwiki.in:219
+#: ../ikiwiki.in:217
 msgid "refreshing wiki.."
 msgstr ""
 
-#: ../IkiWiki.pm:232
+#: ../IkiWiki.pm:248
 msgid "Discussion"
 msgstr ""
 
-#: ../IkiWiki.pm:557
+#: ../IkiWiki.pm:580
 msgid "Must specify url to wiki with --url when using --cgi"
 msgstr ""
 
-#: ../IkiWiki.pm:605
+#: ../IkiWiki.pm:628
 #, perl-format
 msgid "unsupported umask setting %s"
 msgstr ""
 
-#: ../IkiWiki.pm:645
+#: ../IkiWiki.pm:668
 msgid "cannot use multiple rcs plugins"
 msgstr ""
 
-#: ../IkiWiki.pm:675
+#: ../IkiWiki.pm:698
 #, perl-format
 msgid "failed to load external plugin needed for %s plugin: %s"
 msgstr ""
 
-#: ../IkiWiki.pm:1452
+#: ../IkiWiki.pm:1490
 #, perl-format
 msgid "preprocessing loop detected on %s at depth %i"
 msgstr ""
 
-#: ../IkiWiki.pm:1646
+#: ../IkiWiki.pm:1684
 #, perl-format
 msgid "bad file name %s"
 msgstr ""
 
-#: ../IkiWiki.pm:1946
+#: ../IkiWiki.pm:1984
 #, perl-format
 msgid "template %s not found"
 msgstr ""
 
-#: ../IkiWiki.pm:2196
+#: ../IkiWiki.pm:2234
 msgid "yes"
 msgstr ""
 
-#: ../IkiWiki.pm:2273
+#: ../IkiWiki.pm:2318
 #, perl-format
 msgid "invalid sort type %s"
 msgstr ""
 
-#: ../IkiWiki.pm:2294
+#: ../IkiWiki.pm:2339
 #, perl-format
 msgid "unknown sort type %s"
 msgstr ""
 
-#: ../IkiWiki.pm:2430
+#: ../IkiWiki.pm:2475
 #, perl-format
 msgid "cannot match pages: %s"
 msgstr ""
index 47c34effaa84091fa4e09f8e471b3e578106d169..d524bfadc62d752b4d30a2dab3a47dc0bbc2f1c3 100644 (file)
--- a/po/vi.po
+++ b/po/vi.po
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: ikiwiki\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-11-30 16:33-0400\n"
+"POT-Creation-Date: 2013-09-04 10:16-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"
@@ -52,85 +52,85 @@ msgstr "Tùy thích đã được lưu."
 msgid "You are banned."
 msgstr "Bạn bị cấm ra."
 
-#: ../IkiWiki/CGI.pm:464 ../IkiWiki/CGI.pm:465 ../IkiWiki.pm:1470
+#: ../IkiWiki/CGI.pm:464 ../IkiWiki/CGI.pm:465 ../IkiWiki.pm:1508
 msgid "Error"
 msgstr "Lỗi"
 
-#: ../IkiWiki/Plugin/aggregate.pm:95
+#: ../IkiWiki/Plugin/aggregate.pm:86
 msgid "Aggregation triggered via web."
 msgstr ""
 
-#: ../IkiWiki/Plugin/aggregate.pm:104
+#: ../IkiWiki/Plugin/aggregate.pm:95
 msgid "Nothing to do right now, all feeds are up-to-date!"
 msgstr ""
 
-#: ../IkiWiki/Plugin/aggregate.pm:237
+#: ../IkiWiki/Plugin/aggregate.pm:227
 #, fuzzy, perl-format
 msgid "missing %s parameter"
 msgstr "mẫu thiếu tham số id"
 
-#: ../IkiWiki/Plugin/aggregate.pm:272
+#: ../IkiWiki/Plugin/aggregate.pm:262
 msgid "new feed"
 msgstr "nguồn tin mới"
 
-#: ../IkiWiki/Plugin/aggregate.pm:286
+#: ../IkiWiki/Plugin/aggregate.pm:276
 msgid "posts"
 msgstr "bài"
 
-#: ../IkiWiki/Plugin/aggregate.pm:288
+#: ../IkiWiki/Plugin/aggregate.pm:278
 msgid "new"
 msgstr "mới"
 
-#: ../IkiWiki/Plugin/aggregate.pm:475
+#: ../IkiWiki/Plugin/aggregate.pm:465
 #, perl-format
 msgid "expiring %s (%s days old)"
 msgstr "đang mãn hạn %s (cũ %s ngày)"
 
-#: ../IkiWiki/Plugin/aggregate.pm:482
+#: ../IkiWiki/Plugin/aggregate.pm:472
 #, perl-format
 msgid "expiring %s"
 msgstr "đang mãn hạn %s"
 
-#: ../IkiWiki/Plugin/aggregate.pm:510
+#: ../IkiWiki/Plugin/aggregate.pm:500
 #, perl-format
 msgid "last checked %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/aggregate.pm:514
+#: ../IkiWiki/Plugin/aggregate.pm:504
 #, perl-format
 msgid "checking feed %s ..."
 msgstr "đang kiểm tra nguồn tin %s ..."
 
-#: ../IkiWiki/Plugin/aggregate.pm:519
+#: ../IkiWiki/Plugin/aggregate.pm:509
 #, perl-format
 msgid "could not find feed at %s"
 msgstr "không tìm thấy nguồn tin ở %s"
 
-#: ../IkiWiki/Plugin/aggregate.pm:542
+#: ../IkiWiki/Plugin/aggregate.pm:529
 #, fuzzy
 msgid "feed not found"
 msgstr "không tìm thấy mẫu %s"
 
-#: ../IkiWiki/Plugin/aggregate.pm:553
+#: ../IkiWiki/Plugin/aggregate.pm:540
 #, perl-format
 msgid "(invalid UTF-8 stripped from feed)"
 msgstr ""
 
-#: ../IkiWiki/Plugin/aggregate.pm:561
+#: ../IkiWiki/Plugin/aggregate.pm:548
 #, perl-format
 msgid "(feed entities escaped)"
 msgstr ""
 
-#: ../IkiWiki/Plugin/aggregate.pm:569
+#: ../IkiWiki/Plugin/aggregate.pm:556
 msgid "feed crashed XML::Feed!"
 msgstr "nguồn tin đã gây ra XML::Feed sụp đổ."
 
-#: ../IkiWiki/Plugin/aggregate.pm:661
+#: ../IkiWiki/Plugin/aggregate.pm:649
 #, perl-format
 msgid "creating new page %s"
 msgstr "đang tạo trang mới %s"
 
-#: ../IkiWiki/Plugin/aggregate.pm:689 ../IkiWiki/Plugin/edittemplate.pm:135
+#: ../IkiWiki/Plugin/aggregate.pm:677 ../IkiWiki/Plugin/edittemplate.pm:135
 #, fuzzy
 msgid "failed to process template:"
 msgstr "mẫu không xử lý được:"
@@ -139,7 +139,7 @@ msgstr "mẫu không xử lý được:"
 msgid "deleting bucket.."
 msgstr ""
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:227
+#: ../IkiWiki/Plugin/amazon_s3.pm:38 ../ikiwiki.in:225
 msgid "done"
 msgstr "xong"
 
@@ -158,7 +158,7 @@ msgstr "Lỗi gửi thư"
 msgid "Failed to save file to S3: "
 msgstr "Lỗi gửi thư"
 
-#: ../IkiWiki/Plugin/amazon_s3.pm:247
+#: ../IkiWiki/Plugin/amazon_s3.pm:248
 #, fuzzy
 msgid "Failed to delete file from S3: "
 msgstr "lỗi ghi %s: %s"
@@ -176,15 +176,15 @@ msgstr ""
 msgid "bad attachment filename"
 msgstr ""
 
-#: ../IkiWiki/Plugin/attachment.pm:295
+#: ../IkiWiki/Plugin/attachment.pm:296
 msgid "attachment upload"
 msgstr ""
 
-#: ../IkiWiki/Plugin/attachment.pm:346
+#: ../IkiWiki/Plugin/attachment.pm:347
 msgid "this attachment is not yet saved"
 msgstr ""
 
-#: ../IkiWiki/Plugin/attachment.pm:363
+#: ../IkiWiki/Plugin/attachment.pm:365
 msgid "just uploaded"
 msgstr ""
 
@@ -193,7 +193,7 @@ msgstr ""
 msgid "creating index page %s"
 msgstr "đang tạo trang mới %s"
 
-#: ../IkiWiki/Plugin/blogspam.pm:118
+#: ../IkiWiki/Plugin/blogspam.pm:119
 msgid ""
 "Sorry, but that looks like spam to <a href=\"http://blogspam.net/"
 "\">blogspam</a>: "
@@ -208,83 +208,87 @@ msgstr ""
 msgid "There are no broken links!"
 msgstr "Không có liên kết bị ngắt nào."
 
-#: ../IkiWiki/Plugin/comments.pm:114
+#: ../IkiWiki/Plugin/comments.pm:124
 #, fuzzy, perl-format
 msgid "this comment needs %s"
 msgstr "đang tạo %s"
 
-#: ../IkiWiki/Plugin/comments.pm:117
+#: ../IkiWiki/Plugin/comments.pm:127
 msgid "moderation"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:138 ../IkiWiki/Plugin/format.pm:50
+#: ../IkiWiki/Plugin/comments.pm:154 ../IkiWiki/Plugin/format.pm:50
 #, perl-format
 msgid "unsupported page format %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:143
+#: ../IkiWiki/Plugin/comments.pm:159
 msgid "comment must have content"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:201
+#: ../IkiWiki/Plugin/comments.pm:217
 msgid "Anonymous"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:263
+#: ../IkiWiki/Plugin/comments.pm:279
 msgid "Comment Moderation"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:379 ../IkiWiki/Plugin/editpage.pm:95
-#: ../IkiWiki/Plugin/editpage.pm:101
+#: ../IkiWiki/Plugin/comments.pm:375 ../IkiWiki/Plugin/comments.pm:379
+msgid "email replies to me"
+msgstr ""
+
+#: ../IkiWiki/Plugin/comments.pm:413 ../IkiWiki/Plugin/editpage.pm:96
+#: ../IkiWiki/Plugin/editpage.pm:102
 msgid "bad page name"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:382
+#: ../IkiWiki/Plugin/comments.pm:416
 #, fuzzy, perl-format
 msgid "commenting on %s"
 msgstr "đang tạo %s"
 
-#: ../IkiWiki/Plugin/comments.pm:399
+#: ../IkiWiki/Plugin/comments.pm:433
 #, perl-format
 msgid "page '%s' doesn't exist, so you can't comment"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:406
+#: ../IkiWiki/Plugin/comments.pm:440
 #, perl-format
 msgid "comments on page '%s' are closed"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:520
+#: ../IkiWiki/Plugin/comments.pm:565
 msgid "comment stored for moderation"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:522
+#: ../IkiWiki/Plugin/comments.pm:567
 msgid "Your comment will be posted after moderator review"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:535
+#: ../IkiWiki/Plugin/comments.pm:580
 msgid "Added a comment"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:539
+#: ../IkiWiki/Plugin/comments.pm:584
 #, perl-format
 msgid "Added a comment: %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:608 ../IkiWiki/Plugin/userlist.pm:55
+#: ../IkiWiki/Plugin/comments.pm:654 ../IkiWiki/Plugin/userlist.pm:55
 #: ../IkiWiki/Plugin/websetup.pm:272
 msgid "you are not logged in as an admin"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:660
+#: ../IkiWiki/Plugin/comments.pm:708
 msgid "Comment moderation"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:701
+#: ../IkiWiki/Plugin/comments.pm:749
 msgid "comment moderation"
 msgstr ""
 
-#: ../IkiWiki/Plugin/comments.pm:862
+#: ../IkiWiki/Plugin/comments.pm:910
 #, perl-format
 msgid "%i comment"
 msgid_plural "%i comments"
@@ -293,11 +297,11 @@ msgstr[0] ""
 #. translators: Here "Comment" is a verb;
 #. translators: the user clicks on it to
 #. translators: post a comment.
-#: ../IkiWiki/Plugin/comments.pm:872
+#: ../IkiWiki/Plugin/comments.pm:920
 msgid "Comment"
 msgstr ""
 
-#: ../IkiWiki/Plugin/conditional.pm:28 ../IkiWiki/Plugin/cutpaste.pm:46
+#: ../IkiWiki/Plugin/conditional.pm:27 ../IkiWiki/Plugin/cutpaste.pm:46
 #: ../IkiWiki/Plugin/cutpaste.pm:60 ../IkiWiki/Plugin/cutpaste.pm:75
 #: ../IkiWiki/Plugin/testpagespec.pm:26
 #, perl-format
@@ -318,19 +322,23 @@ msgstr ""
 msgid "removing old preview %s"
 msgstr "đang gỡ bỏ trang cũ %s"
 
-#: ../IkiWiki/Plugin/editpage.pm:117
+#: ../IkiWiki/Plugin/editpage.pm:118
 #, perl-format
 msgid "%s is not an editable page"
 msgstr ""
 
-#: ../IkiWiki/Plugin/editpage.pm:307
+#: ../IkiWiki/Plugin/editpage.pm:166
+msgid "email comments to me"
+msgstr ""
+
+#: ../IkiWiki/Plugin/editpage.pm:319
 #, perl-format
 msgid "creating %s"
 msgstr "đang tạo %s"
 
-#: ../IkiWiki/Plugin/editpage.pm:325 ../IkiWiki/Plugin/editpage.pm:344
-#: ../IkiWiki/Plugin/editpage.pm:355 ../IkiWiki/Plugin/editpage.pm:400
-#: ../IkiWiki/Plugin/editpage.pm:442
+#: ../IkiWiki/Plugin/editpage.pm:337 ../IkiWiki/Plugin/editpage.pm:356
+#: ../IkiWiki/Plugin/editpage.pm:367 ../IkiWiki/Plugin/editpage.pm:412
+#: ../IkiWiki/Plugin/editpage.pm:454
 #, perl-format
 msgid "editing %s"
 msgstr "đang sửa %s"
@@ -378,26 +386,26 @@ msgstr "không thể đọc %s: %s"
 msgid "%s is an attachment, not a page."
 msgstr ""
 
-#: ../IkiWiki/Plugin/git.pm:777 ../IkiWiki/Plugin/git.pm:840
-#: ../IkiWiki.pm:1690
+#: ../IkiWiki/Plugin/git.pm:789 ../IkiWiki/Plugin/git.pm:852
+#: ../IkiWiki.pm:1728
 #, perl-format
 msgid "you are not allowed to change %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/git.pm:799
+#: ../IkiWiki/Plugin/git.pm:811
 #, perl-format
 msgid "you cannot act on a file with mode %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/git.pm:803
+#: ../IkiWiki/Plugin/git.pm:815
 msgid "you are not allowed to change file modes"
 msgstr ""
 
-#: ../IkiWiki/Plugin/git.pm:873
+#: ../IkiWiki/Plugin/git.pm:885
 msgid "you are not allowed to revert a merge"
 msgstr ""
 
-#: ../IkiWiki/Plugin/git.pm:892
+#: ../IkiWiki/Plugin/git.pm:902
 #, fuzzy, perl-format
 msgid "Failed to revert commit %s"
 msgstr "lỗi biên dịch %s"
@@ -412,7 +420,7 @@ msgstr "Cần phải xác định %s khi dùng bổ sung tìm kiếm"
 msgid "failed to run graphviz"
 msgstr "linkmap không chạy dot được"
 
-#: ../IkiWiki/Plugin/graphviz.pm:143
+#: ../IkiWiki/Plugin/graphviz.pm:144
 msgid "prog not a valid graphviz program"
 msgstr ""
 
@@ -426,7 +434,7 @@ msgstr ""
 msgid "Source code: %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/highlight.pm:179
+#: ../IkiWiki/Plugin/highlight.pm:180
 msgid ""
 "warning: highlight perl module not available; falling back to pass through"
 msgstr ""
@@ -477,31 +485,31 @@ msgstr "không tìm thấy mẫu %s"
 msgid "missing pages parameter"
 msgstr "mẫu thiếu tham số id"
 
-#: ../IkiWiki/Plugin/inline.pm:192
+#: ../IkiWiki/Plugin/inline.pm:209
 #, perl-format
 msgid "the %s and %s parameters cannot be used together"
 msgstr ""
 
-#: ../IkiWiki/Plugin/inline.pm:297
+#: ../IkiWiki/Plugin/inline.pm:315
 #, perl-format
 msgid "%s (RSS feed)"
 msgstr ""
 
-#: ../IkiWiki/Plugin/inline.pm:301
+#: ../IkiWiki/Plugin/inline.pm:319
 #, perl-format
 msgid "%s (Atom feed)"
 msgstr ""
 
-#: ../IkiWiki/Plugin/inline.pm:330
+#: ../IkiWiki/Plugin/inline.pm:348
 msgid "Add a new post titled:"
 msgstr ""
 
-#: ../IkiWiki/Plugin/inline.pm:369 ../IkiWiki/Plugin/template.pm:44
+#: ../IkiWiki/Plugin/inline.pm:387 ../IkiWiki/Plugin/template.pm:44
 #, fuzzy, perl-format
 msgid "failed to process template %s"
 msgstr "mẫu không xử lý được:"
 
-#: ../IkiWiki/Plugin/inline.pm:695
+#: ../IkiWiki/Plugin/inline.pm:725
 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"
 
@@ -520,44 +528,49 @@ msgstr ""
 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:45
+#: ../IkiWiki/Plugin/mdwn.pm:52
 msgid "multimarkdown is enabled, but Text::MultiMarkdown is not installed"
 msgstr ""
 
-#: ../IkiWiki/Plugin/mdwn.pm:70
+#: ../IkiWiki/Plugin/mdwn.pm:96
 #, 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:175
+#: ../IkiWiki/Plugin/meta.pm:127
 #, fuzzy
-msgid "stylesheet not found"
+msgid "enclosure not found"
 msgstr "không tìm thấy mẫu %s"
 
 #: ../IkiWiki/Plugin/meta.pm:187
 #, fuzzy
+msgid "stylesheet not found"
+msgstr "không tìm thấy mẫu %s"
+
+#: ../IkiWiki/Plugin/meta.pm:199
+#, fuzzy
 msgid "script not found"
 msgstr "không tìm thấy mẫu %s"
 
-#: ../IkiWiki/Plugin/meta.pm:235
+#: ../IkiWiki/Plugin/meta.pm:247
 #, fuzzy
 msgid "redir page not found"
 msgstr "không tìm thấy mẫu %s"
 
-#: ../IkiWiki/Plugin/meta.pm:249
+#: ../IkiWiki/Plugin/meta.pm:261
 #, fuzzy
 msgid "redir cycle is not allowed"
 msgstr "không tìm thấy mẫu %s"
 
-#: ../IkiWiki/Plugin/meta.pm:427
+#: ../IkiWiki/Plugin/meta.pm:450
 msgid "sort=meta requires a parameter"
 msgstr ""
 
-#: ../IkiWiki/Plugin/mirrorlist.pm:44
+#: ../IkiWiki/Plugin/mirrorlist.pm:57
 msgid "Mirrors"
 msgstr "Nhân bản"
 
-#: ../IkiWiki/Plugin/mirrorlist.pm:44
+#: ../IkiWiki/Plugin/mirrorlist.pm:57
 msgid "Mirror"
 msgstr "Nhân bản"
 
@@ -569,6 +582,18 @@ msgstr ""
 msgid "more"
 msgstr ""
 
+#: ../IkiWiki/Plugin/notifyemail.pm:72
+msgid "Cannot subscribe your email address without logging in."
+msgstr ""
+
+#: ../IkiWiki/Plugin/notifyemail.pm:136
+msgid "change notification:"
+msgstr ""
+
+#: ../IkiWiki/Plugin/notifyemail.pm:138
+msgid "comment notification:"
+msgstr ""
+
 #: ../IkiWiki/Plugin/openid.pm:71
 #, fuzzy, perl-format
 msgid "failed to load openid module: "
@@ -583,42 +608,50 @@ msgstr "Mọi trang được liên kết với trang khác."
 msgid "bad or missing template"
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:231
+#: ../IkiWiki/Plugin/passwordauth.pm:145 ../IkiWiki/Plugin/passwordauth.pm:337
+msgid "Error creating account."
+msgstr "Gặp lỗi khi tạo tài khoản."
+
+#: ../IkiWiki/Plugin/passwordauth.pm:297
 msgid "Your user page: "
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:238
+#: ../IkiWiki/Plugin/passwordauth.pm:304
 msgid "Create your user page"
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:268
+#: ../IkiWiki/Plugin/passwordauth.pm:334
 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:271
-msgid "Error creating account."
-msgstr "Gặp lỗi khi tạo tài khoản."
-
-#: ../IkiWiki/Plugin/passwordauth.pm:278
+#: ../IkiWiki/Plugin/passwordauth.pm:344
 msgid "No email address, so cannot email password reset instructions."
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:312
+#: ../IkiWiki/Plugin/passwordauth.pm:371
 msgid "Failed to send mail"
 msgstr "Lỗi gửi thư"
 
-#: ../IkiWiki/Plugin/passwordauth.pm:314
+#: ../IkiWiki/Plugin/passwordauth.pm:373
 msgid "You have been mailed password reset instructions."
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:349
+#: ../IkiWiki/Plugin/passwordauth.pm:408
 msgid "incorrect password reset url"
 msgstr ""
 
-#: ../IkiWiki/Plugin/passwordauth.pm:352
+#: ../IkiWiki/Plugin/passwordauth.pm:411
 msgid "password reset denied"
 msgstr ""
 
+#: ../IkiWiki/Plugin/passwordauth.pm:424
+msgid "incorrect url"
+msgstr ""
+
+#: ../IkiWiki/Plugin/passwordauth.pm:427
+msgid "access denied"
+msgstr ""
+
 #: ../IkiWiki/Plugin/pingee.pm:30
 msgid "Ping received."
 msgstr ""
@@ -646,97 +679,101 @@ 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:180
+#: ../IkiWiki/Plugin/po.pm:179
 #, perl-format
 msgid "%s is not a valid language code"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:192
+#: ../IkiWiki/Plugin/po.pm:191
 #, 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:197
+#: ../IkiWiki/Plugin/po.pm:196
 msgid ""
 "po_link_to=negotiated requires usedirs to be enabled, falling back to "
 "po_link_to=default"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:468
+#: ../IkiWiki/Plugin/po.pm:467
 msgid "updated PO files"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:491
+#: ../IkiWiki/Plugin/po.pm:490
 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:511
+#: ../IkiWiki/Plugin/po.pm:510
 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:957
+#: ../IkiWiki/Plugin/po.pm:956
 #, perl-format
 msgid "POT file (%s) does not exist"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:971
+#: ../IkiWiki/Plugin/po.pm:970
 #, fuzzy, perl-format
 msgid "failed to copy underlay PO file to %s"
 msgstr "lỗi biên dịch %s"
 
-#: ../IkiWiki/Plugin/po.pm:980
+#: ../IkiWiki/Plugin/po.pm:979
 #, fuzzy, perl-format
 msgid "failed to update %s"
 msgstr "lỗi biên dịch %s"
 
-#: ../IkiWiki/Plugin/po.pm:986
+#: ../IkiWiki/Plugin/po.pm:985
 #, fuzzy, perl-format
 msgid "failed to copy the POT file to %s"
 msgstr "lỗi biên dịch %s"
 
-#: ../IkiWiki/Plugin/po.pm:1022
+#: ../IkiWiki/Plugin/po.pm:1021
 msgid "N/A"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:1033
+#: ../IkiWiki/Plugin/po.pm:1032
 #, fuzzy, perl-format
 msgid "failed to translate %s"
 msgstr "lỗi ghi %s: %s"
 
-#: ../IkiWiki/Plugin/po.pm:1112
+#: ../IkiWiki/Plugin/po.pm:1111
 msgid "removed obsolete PO files"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:1169 ../IkiWiki/Plugin/po.pm:1181
-#: ../IkiWiki/Plugin/po.pm:1220
+#: ../IkiWiki/Plugin/po.pm:1168 ../IkiWiki/Plugin/po.pm:1180
+#: ../IkiWiki/Plugin/po.pm:1219
 #, fuzzy, perl-format
 msgid "failed to write %s"
 msgstr "lỗi ghi %s: %s"
 
-#: ../IkiWiki/Plugin/po.pm:1179
+#: ../IkiWiki/Plugin/po.pm:1178
 #, fuzzy
 msgid "failed to translate"
 msgstr "linkmap không chạy dot được"
 
-#: ../IkiWiki/Plugin/po.pm:1232
+#: ../IkiWiki/Plugin/po.pm:1231
 msgid "invalid gettext data, go back to previous page to continue edit"
 msgstr ""
 
-#: ../IkiWiki/Plugin/po.pm:1275
+#: ../IkiWiki/Plugin/po.pm:1274
 #, perl-format
 msgid "%s has invalid syntax: must use CODE|NAME"
 msgstr ""
 
-#: ../IkiWiki/Plugin/poll.pm:70
+#: ../IkiWiki/Plugin/poll.pm:72 ../IkiWiki/Plugin/poll.pm:87
 msgid "vote"
 msgstr "bỏ phiếu"
 
-#: ../IkiWiki/Plugin/poll.pm:78
+#: ../IkiWiki/Plugin/poll.pm:86
+msgid "Write in"
+msgstr ""
+
+#: ../IkiWiki/Plugin/poll.pm:93
 msgid "Total votes:"
 msgstr "Tổng số phiếu :"
 
@@ -840,35 +877,35 @@ msgstr ""
 msgid "confirm reversion of %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/recentchangesdiff.pm:36
+#: ../IkiWiki/Plugin/recentchangesdiff.pm:49
 msgid "(Diff truncated)"
 msgstr ""
 
-#: ../IkiWiki/Plugin/remove.pm:32 ../IkiWiki/Plugin/rename.pm:37
+#: ../IkiWiki/Plugin/remove.pm:39 ../IkiWiki/Plugin/rename.pm:37
 #, perl-format
 msgid "%s does not exist"
 msgstr ""
 
-#: ../IkiWiki/Plugin/remove.pm:39
+#: ../IkiWiki/Plugin/remove.pm:56
 #, 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:42 ../IkiWiki/Plugin/rename.pm:46
+#: ../IkiWiki/Plugin/remove.pm:59 ../IkiWiki/Plugin/rename.pm:46
 #, perl-format
 msgid "%s is not a file"
 msgstr ""
 
-#: ../IkiWiki/Plugin/remove.pm:149
+#: ../IkiWiki/Plugin/remove.pm:166
 #, perl-format
 msgid "confirm removal of %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/remove.pm:186
+#: ../IkiWiki/Plugin/remove.pm:203
 msgid "Please select the attachments to remove."
 msgstr ""
 
-#: ../IkiWiki/Plugin/remove.pm:230
+#: ../IkiWiki/Plugin/remove.pm:263
 msgid "removed"
 msgstr ""
 
@@ -906,20 +943,20 @@ msgstr "đang vẽ %s"
 msgid "Also rename SubPages and attachments"
 msgstr ""
 
-#: ../IkiWiki/Plugin/rename.pm:258
+#: ../IkiWiki/Plugin/rename.pm:266
 msgid "Only one attachment can be renamed at a time."
 msgstr ""
 
-#: ../IkiWiki/Plugin/rename.pm:261
+#: ../IkiWiki/Plugin/rename.pm:269
 msgid "Please select the attachment to rename."
 msgstr ""
 
-#: ../IkiWiki/Plugin/rename.pm:371
+#: ../IkiWiki/Plugin/rename.pm:379
 #, perl-format
 msgid "rename %s to %s"
 msgstr ""
 
-#: ../IkiWiki/Plugin/rename.pm:597
+#: ../IkiWiki/Plugin/rename.pm:605
 #, 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"
@@ -1048,6 +1085,11 @@ msgstr ""
 msgid "failed to generate image from code"
 msgstr "lỗi ghi %s: %s"
 
+#: ../IkiWiki/Plugin/trail.pm:393
+#, perl-format
+msgid "building %s, its previous or next page has changed"
+msgstr ""
+
 #: ../IkiWiki/Plugin/transient.pm:45
 #, fuzzy, perl-format
 msgid "removing transient version of %s"
@@ -1114,59 +1156,59 @@ msgstr ""
 msgid "scanning %s"
 msgstr "đang quét %s"
 
-#: ../IkiWiki/Render.pm:280
+#: ../IkiWiki/Render.pm:281
 #, perl-format
 msgid ""
 "symlink found in srcdir path (%s) -- set allow_symlinks_before_srcdir to "
 "allow this"
 msgstr ""
 
-#: ../IkiWiki/Render.pm:316
+#: ../IkiWiki/Render.pm:317
 #, perl-format
 msgid "skipping bad filename %s"
 msgstr "đang bỏ qua tên tập tin sai %s"
 
-#: ../IkiWiki/Render.pm:332
+#: ../IkiWiki/Render.pm:333
 #, perl-format
 msgid "%s has multiple possible source pages"
 msgstr ""
 
-#: ../IkiWiki/Render.pm:372
+#: ../IkiWiki/Render.pm:373
 #, perl-format
 msgid "querying %s for file creation and modification times.."
 msgstr ""
 
-#: ../IkiWiki/Render.pm:446
+#: ../IkiWiki/Render.pm:447
 #, fuzzy, perl-format
 msgid "removing obsolete %s"
 msgstr "đang gỡ bỏ trang cũ %s"
 
-#: ../IkiWiki/Render.pm:530
+#: ../IkiWiki/Render.pm:531
 #, 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:539
+#: ../IkiWiki/Render.pm:540
 #, 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:622 ../IkiWiki/Render.pm:704
+#: ../IkiWiki/Render.pm:623 ../IkiWiki/Render.pm:705
 #, fuzzy, perl-format
 msgid "building %s, which depends on %s"
 msgstr "đang vẽ %s mà phụ thuộc vào %s"
 
-#: ../IkiWiki/Render.pm:717
+#: ../IkiWiki/Render.pm:718
 #, 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:797
+#: ../IkiWiki/Render.pm:806
 #, fuzzy, perl-format
 msgid "building %s"
 msgstr "đang sửa %s"
 
-#: ../IkiWiki/Render.pm:849
+#: ../IkiWiki/Render.pm:871
 #, fuzzy, perl-format
 msgid "ikiwiki: cannot build %s"
 msgstr "ikiwiki: không thể vẽ %s"
@@ -1210,27 +1252,31 @@ msgstr ""
 msgid "generating wrappers.."
 msgstr "đang tạo ra các bộ bao bọc.."
 
-#: ../IkiWiki/Wrapper.pm:36
+#: ../IkiWiki/Wrapper.pm:37
 #, perl-format
 msgid "%s doesn't seem to be executable"
 msgstr "có vẻ là %s không phải có khả năng thực hiện"
 
-#: ../IkiWiki/Wrapper.pm:40
+#: ../IkiWiki/Wrapper.pm:41
 msgid "cannot create a wrapper that uses a setup file"
 msgstr "không thể tạo bộ bao bọc sử dụng tập tin thiết lập"
 
-#: ../IkiWiki/Wrapper.pm:44
+#: ../IkiWiki/Wrapper.pm:45
 msgid "wrapper filename not specified"
 msgstr "chưa xác định tên tập tin bộ bao bọc"
 
+#: ../IkiWiki/Wrapper.pm:109
+msgid "Please wait"
+msgstr ""
+
 #. translators: The parameter is a C filename.
-#: ../IkiWiki/Wrapper.pm:220
+#: ../IkiWiki/Wrapper.pm:268
 #, perl-format
 msgid "failed to compile %s"
 msgstr "lỗi biên dịch %s"
 
 #. translators: The parameter is a filename.
-#: ../IkiWiki/Wrapper.pm:240
+#: ../IkiWiki/Wrapper.pm:288
 #, perl-format
 msgid "successfully generated %s"
 msgstr "%s đã được tạo ra"
@@ -1251,67 +1297,67 @@ msgstr ""
 msgid "usage: --set-yaml var=value"
 msgstr ""
 
-#: ../ikiwiki.in:216
+#: ../ikiwiki.in:214
 msgid "rebuilding wiki.."
 msgstr "đang xây dựng lại wiki.."
 
-#: ../ikiwiki.in:219
+#: ../ikiwiki.in:217
 msgid "refreshing wiki.."
 msgstr "đang làm tươi wiki.."
 
-#: ../IkiWiki.pm:232
+#: ../IkiWiki.pm:248
 msgid "Discussion"
 msgstr "Thảo luận"
 
-#: ../IkiWiki.pm:557
+#: ../IkiWiki.pm:580
 msgid "Must specify url to wiki with --url when using --cgi"
 msgstr ""
 "Cần phải xác định địa chỉ URL tới wiki với « --url » khi dùng « --cgi »"
 
-#: ../IkiWiki.pm:605
+#: ../IkiWiki.pm:628
 #, perl-format
 msgid "unsupported umask setting %s"
 msgstr ""
 
-#: ../IkiWiki.pm:645
+#: ../IkiWiki.pm:668
 msgid "cannot use multiple rcs plugins"
 msgstr ""
 
-#: ../IkiWiki.pm:675
+#: ../IkiWiki.pm:698
 #, perl-format
 msgid "failed to load external plugin needed for %s plugin: %s"
 msgstr ""
 
-#: ../IkiWiki.pm:1452
+#: ../IkiWiki.pm:1490
 #, 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:1646
+#: ../IkiWiki.pm:1684
 #, fuzzy, perl-format
 msgid "bad file name %s"
 msgstr "đang bỏ qua tên tập tin sai %s"
 
-#: ../IkiWiki.pm:1946
+#: ../IkiWiki.pm:1984
 #, perl-format
 msgid "template %s not found"
 msgstr "không tìm thấy mẫu %s"
 
-#: ../IkiWiki.pm:2196
+#: ../IkiWiki.pm:2234
 msgid "yes"
 msgstr ""
 
-#: ../IkiWiki.pm:2273
+#: ../IkiWiki.pm:2318
 #, fuzzy, perl-format
 msgid "invalid sort type %s"
 msgstr "kiểu sắp xếp không rõ %s"
 
-#: ../IkiWiki.pm:2294
+#: ../IkiWiki.pm:2339
 #, perl-format
 msgid "unknown sort type %s"
 msgstr "kiểu sắp xếp không rõ %s"
 
-#: ../IkiWiki.pm:2430
+#: ../IkiWiki.pm:2475
 #, fuzzy, perl-format
 msgid "cannot match pages: %s"
 msgstr "không thể đọc %s: %s"
diff --git a/t/cvs.t b/t/cvs.t
index 9afd5a7e9061767f8cc0f1f5ad08d97dcc335c98..cbac43252ecbe7ae4c1ef850cff83fe1187d1dde 100755 (executable)
--- a/t/cvs.t
+++ b/t/cvs.t
@@ -1,7 +1,7 @@
 #!/usr/bin/perl
 use warnings;
 use strict;
-use Test::More; my $total_tests = 42;
+use Test::More; my $total_tests = 72;
 use IkiWiki;
 
 my $default_test_methods = '^test_*';
@@ -26,14 +26,13 @@ sub test_web_comments {
        # - when the first comment for page.mdwn is added, and page/ is
        #   created to hold the comment, page/ isn't added to CVS control,
        #   so the comment isn't either
+       #   - can't reproduce after chmod g+s ikiwiki.cgi (20120204)
        # - side effect for moderated comments: after approval they
        #   show up normally AND are still pending, too
        # - comments.pm treats rcs_commit_staged() as returning conflicts?
 }
 
 sub test_chdir_magic {
-       # cvs.pm operations are always occurring inside $config{srcdir}
-       # other ikiwiki operations are occurring wherever, and are unaffected
        # when are we bothering with "local $CWD" and when aren't we?
 }
 
@@ -52,12 +51,14 @@ sub test_cvs_run_cvs {
        # steal from git.pm: safe_git(), run_or_{die,cry,non}
        # - open() instead of system()
        # always call cvs_run_cvs(), don't ever run 'cvs' directly
+       # - for cvs_info(), make it respect wantarray
 }
 
 sub test_cvs_run_cvsps {
        # parameterize command like run_cvs()
        # expose config vars for e.g. "--cvs-direct -z 30"
        # always pass -x (unless proven otherwise)
+       # - but diff doesn't! optimization alert
        # always pass -b HEAD (configurable like gitmaster_branch?)
 }
 
@@ -94,21 +95,43 @@ sub test_cvs_is_controlling {
 # TESTS FOR GENERAL PLUGIN API CALLS
 
 sub test_checkconfig {
-       # undef cvspath, expect "ikiwiki"
-       # define cvspath normally, get it back
-       # define cvspath in a subdir, get it back?
-       # define cvspath with extra slashes, get sanitized version back
-       # - yoink test_extra_path_slashes
-       # undef cvs_wrapper, expect $config{wrappers} same size as before
-
-       my $initial_cvspath = $config{cvspath};
-       $config{cvspath} = "/ikiwiki//";
+       my $default_cvspath = 'ikiwiki';
+
+       undef $config{cvspath}; IkiWiki::checkconfig();
+       is(
+               $config{cvspath}, $default_cvspath,
+               q{can provide default cvspath},
+       );
+
+       $config{cvspath} = "/$default_cvspath/"; IkiWiki::checkconfig();
+       is(
+               $config{cvspath}, $default_cvspath,
+               q{can set typical cvspath and strip well-meaning slashes},
+       );
+
+       $config{cvspath} = "/$default_cvspath//subdir"; IkiWiki::checkconfig();
+       is(
+               $config{cvspath}, "$default_cvspath/subdir",
+               q{can really sanitize cvspath as assumed by rcs_recentchanges},
+       );
+
+       my $default_num_wrappers = @{$config{wrappers}};
+       undef $config{cvs_wrapper}; IkiWiki::checkconfig();
+       is(
+               @{$config{wrappers}}, $default_num_wrappers,
+               q{can start with no wrappers configured},
+       );
+
+       $config{cvs_wrapper} = $config{cvsrepo} . "/CVSROOT/post-commit";
        IkiWiki::checkconfig();
        is(
-               $config{cvspath},
-               $initial_cvspath,
-               q{rcs_recentchanges assumes checkconfig has sanitized cvspath},
+               @{$config{wrappers}}, ++$default_num_wrappers,
+               q{can add cvs_wrapper},
        );
+
+       undef $config{cvs_wrapper};
+       $config{cvspath} = $default_cvspath;
+       IkiWiki::checkconfig();
 }
 
 sub test_getsetup {
@@ -132,6 +155,11 @@ sub test_rcs_prepedit {
        # for existing file, returns latest revision in repo
        # - what's this used for? should it return latest revision in checkout?
        # for new file, returns empty string
+
+       # netbsd web log says "could not open lock file"
+       # XXX does this work right?
+       # how about with un-added dirs in the srcdir?
+       # how about with cvsps.core lying around?
 }
 
 sub test_rcs_commit {
@@ -145,7 +173,8 @@ sub test_rcs_commit {
        # - else, revert + return content with the conflict markers in it
        # git.pm receives "session" param -- useful here?
        # web commits start with "web commit {by,from} "
-       # seeing File::chdir errors on commit?
+
+       # XXX commit can fail due to "could not open lock file"
 }
 
 sub test_rcs_commit_staged {
@@ -159,9 +188,21 @@ sub test_rcs_add {
 
        my $message = "add a top-level ASCII (non-UTF-8) page via VCS API";
        my $file = q{test0.mdwn};
-       add_and_commit($file, $message, q{* some plain ASCII text});
+       add_and_commit($file, $message, qq{# \$Id\$\n* some plain ASCII text});
        is_newly_added($file);
-       is_in_keyword_substitution_mode($file, undef);
+       is_in_keyword_substitution_mode($file, q{-kkv});
+       like(
+               readfile($config{srcdir} . "/$file"),
+               qr/^# \$Id: $file,v 1\.1 .+\$$/m,
+               q{can expand RCS Id keyword},
+       );
+       my $generated_file = $config{destdir} . q{/test0/index.html};
+       ok(-e $generated_file, q{post-commit hook generates content});
+       like(
+               readfile($generated_file),
+               qr/^<h1>\$Id: $file,v 1\.1 .+\$<\/h1>$/m,
+               q{can htmlize mdwn, including RCS Id},
+       );
        @changes = IkiWiki::rcs_recentchanges(3);
        is_total_number_of_changes(\@changes, 1);
        is_most_recent_change(\@changes, stripext($file), $message);
@@ -187,7 +228,7 @@ sub test_rcs_add {
        $file = q{test4/test5/test1.mdwn};
        add_and_commit($file, $message, readfile("t/test1.mdwn"));
        is_newly_added($file);
-       is_in_keyword_substitution_mode($file, undef);
+       is_in_keyword_substitution_mode($file, q{-kkv});
        @changes = IkiWiki::rcs_recentchanges(3);
        is_total_number_of_changes(\@changes, 2);
        is_most_recent_change(\@changes, stripext($file), $message);
@@ -218,14 +259,14 @@ sub test_rcs_add {
        $message = "add a UTF-8 and a binary file in different dirs";
        my $file1 = "test8/test9.mdwn";
        my $file2 = "test10/test11.ico";
-       can_mkdir(qw(test8 test10));
+       can_mkdir($_) for (qw(test8 test10));
        writefile($file1, $config{srcdir}, readfile('t/test2.mdwn'));
        writefile($file2, $config{srcdir}, $bindata_in, 1);
        IkiWiki::rcs_add($_) for ($file1, $file2);
        IkiWiki::rcs_commit_staged(message => $message);
        is_newly_added($_) for ($file1, $file2);
-       is_in_keyword_substitution_mode($file1, undef);
-       is_in_keyword_substitution_mode($file2, '-kb');
+       is_in_keyword_substitution_mode($file1, q{-kkv});
+       is_in_keyword_substitution_mode($file2, q{-kb});
        @changes = IkiWiki::rcs_recentchanges(3);
        is_total_number_of_changes(\@changes, 3);
        @changes = IkiWiki::rcs_recentchanges(4);
@@ -233,15 +274,39 @@ sub test_rcs_add {
        # XXX test for both files in the commit, and no other files
        is_most_recent_change(\@changes, $file2, $message);
 
+       $message = "remove the UTF-8 and binary files we just added";
+       IkiWiki::rcs_remove($_) for ($file1, $file2);
+       IkiWiki::rcs_commit_staged(message => $message);
+       ok(! -d "$config{srcdir}/test8", q{empty dir pruned by post-commit});
+       ok(! -d "$config{srcdir}/test10", q{empty dir pruned by post-commit});
+       @changes = IkiWiki::rcs_recentchanges(11);
+       is_total_number_of_changes(\@changes, 5);
+       # XXX test for both files in the commit, and no other files
+       is_most_recent_change(\@changes, $file2, $message);
+
+       $message = "re-add UTF-8 and binary files with names swapped";
+       writefile($file2, $config{srcdir}, readfile('t/test2.mdwn'));
+       writefile($file1, $config{srcdir}, $bindata_in, 1);
+       IkiWiki::rcs_add($_) for ($file1, $file2);
+       IkiWiki::rcs_commit_staged(message => $message);
+       isnt_newly_added($_) for ($file1, $file2);
+       is_in_keyword_substitution_mode($file2, q{-kkv});
+       is_in_keyword_substitution_mode($file1, q{-kb});
+       @changes = IkiWiki::rcs_recentchanges(11);
+       is_total_number_of_changes(\@changes, 6);
+       # XXX test for both files in the commit, and no other files
+       is_most_recent_change(\@changes, $file2, $message);
+
        # prevent web edits from attempting to create .../CVS/foo.mdwn
        # on case-insensitive filesystems, also prevent .../cvs/foo.mdwn
        # unless your "CVS" is something else and we've made it configurable
+       # also want a pre-commit hook for this?
 
-       # can it assume we're under CVS control? or must it check?
+       # pre-commit hook:
+       # - lcase filenames
+       # - ?
 
-       # extract method: filetype-guessing
-       # add a binary file, remove it, add a text file by same name, no -kb?
-       # add a text file, remove it, add a binary file by same name, -kb?
+       # can it assume we're under CVS control? or must it check?
 }
 
 sub test_rcs_remove {
@@ -304,9 +369,67 @@ sub test_rcs_recentchanges {
 }
 
 sub test_rcs_diff {
+       my @changes = IkiWiki::rcs_recentchanges(3);
+       is_total_number_of_changes(\@changes, 0);
+
+       my $message = "add a UTF-8 and an ASCII file in different dirs";
+       my $file1 = "rcsdiff1/utf8.mdwn";
+       my $file2 = "rcsdiff2/ascii.mdwn";
+       my $contents2 = ''; $contents2 .= "$_. foo\n" for (1..11);
+       can_mkdir($_) for (qw(rcsdiff1 rcsdiff2));
+       writefile($file1, $config{srcdir}, readfile('t/test2.mdwn'));
+       writefile($file2, $config{srcdir}, $contents2);
+       IkiWiki::rcs_add($_) for ($file1, $file2);
+       IkiWiki::rcs_commit_staged(message => $message);
+
+       # XXX we rely on rcs_recentchanges() to be called first!
+       # XXX or else for no cvsps cache to exist yet...
+       # XXX because rcs_diff() doesn't pass -x (as an optimization)
+       @changes = IkiWiki::rcs_recentchanges(3);
+       is_total_number_of_changes(\@changes, 1);
+
+       unlike(
+               $changes[0]->{pages}->[0]->{diffurl},
+               qr/%2F/m,
+               q{path separators are preserved when UTF-8scaping filename},
+       );
+
+       my $changeset = 1;
+
+       my $maxlines = undef;
+       my $scalar_diffs = IkiWiki::rcs_diff($changeset, $maxlines);
+       like(
+               $scalar_diffs,
+               qr/^\+11\. foo$/m,
+               q{unbounded scalar diffs go all the way to 11},
+       );
+       my @array_diffs = IkiWiki::rcs_diff($changeset, $maxlines);
+       is(
+               $array_diffs[$#array_diffs],
+               "+11. foo\n",
+               q{unbounded array diffs go all the way to 11},
+       );
+
+       $maxlines = 8;
+       $scalar_diffs = IkiWiki::rcs_diff($changeset, $maxlines);
+       unlike(
+               $scalar_diffs,
+               qr/^\+11\. foo$/m,
+               q{bounded scalar diffs don't go all the way to 11},
+       );
+       @array_diffs = IkiWiki::rcs_diff($changeset, $maxlines);
+       isnt(
+               $array_diffs[$#array_diffs],
+               "+11. foo\n",
+               q{bounded array diffs don't go all the way to 11},
+       );
+       is(
+               scalar @array_diffs,
+               $maxlines,
+               q{bounded array diffs contain expected maximum number of lines},
+       );
+
        # can it assume we're under CVS control? or must it check?
-       # in list context, return all lines (with \n), up to $maxlines if set
-       # in scalar context, return the whole diff, up to $maxlines if set
 }
 
 sub test_rcs_getctime {
@@ -415,6 +538,7 @@ sub list_module {
 sub _startup {
        my $can_plan = shift;
        _plan_for_test_more($can_plan);
+       hook(type => "genwrapper", id => "cvstest", call => \&_wrapper_paths);
        _generate_test_config();
 }
 
@@ -450,8 +574,12 @@ sub _generate_test_config {
        %config = IkiWiki::defaultconfig();
        $config{rcs} = "cvs";
        $config{srcdir} = "$dir/src";
+       $config{allow_symlinks_before_srcdir} = 1;
+       $config{destdir} = "$dir/dest";
        $config{cvsrepo} = "$dir/repo";
        $config{cvspath} = "ikiwiki";
+       use Cwd; $config{templatedir} = getcwd() . '/templates';
+       $config{diffurl} = "/nonexistent/cvsweb/[[file]]";
        IkiWiki::loadplugins();
        IkiWiki::checkconfig();
 }
@@ -462,12 +590,39 @@ sub _generate_test_repo {
 
        my $cvs = "cvs -d $config{cvsrepo}";
        my $dn = ">/dev/null";
+
        system "$cvs init $dn";
        system "mkdir $dir/$config{cvspath} $dn";
        system "cd $dir/$config{cvspath} && "
                . "$cvs import -m import $config{cvspath} VENDOR RELEASE $dn";
        system "rm -rf $dir/$config{cvspath} $dn";
        system "$cvs co -d $config{srcdir} $config{cvspath} $dn";
+
+       _generate_and_configure_post_commit_hook();
+}
+
+sub _generate_and_configure_post_commit_hook {
+       $config{cvs_wrapper} = $config{cvsrepo} . "/CVSROOT/test-post";
+       $config{wrapper} = $config{cvs_wrapper};
+
+       require IkiWiki::Wrapper;
+       {
+               no warnings 'once';
+               $IkiWiki::program_to_wrap = 'ikiwiki.out';
+               # XXX substitute its interpreter to Makefile's $(PERL)
+               # XXX best solution: do this to all scripts during build
+       }
+       IkiWiki::gen_wrapper();
+
+       my $cvs = "cvs -d $config{cvsrepo}";
+       my $dn = ">/dev/null";
+
+       system "mkdir $config{destdir} $dn";
+       system "cd $dir && $cvs co CVSROOT $dn && cd CVSROOT && " .
+               "echo 'DEFAULT $config{cvsrepo}/CVSROOT/test-post %{sVv} &' "
+               . " >> loginfo && "
+               . "$cvs commit -m 'test repo setup' $dn && "
+               . "cd .. && rm -rf CVSROOT";
 }
 
 sub add_and_commit {
@@ -489,18 +644,28 @@ sub can_mkdir {
        );
 }
 
-sub is_newly_added {
-       my $file = shift;
-       is(
+sub is_newly_added { _newly_added_or_not(shift, 1) }
+sub isnt_newly_added { _newly_added_or_not(shift, 0) }
+sub _newly_added_or_not {
+       my ($file, $expected_new) = @_;
+       my ($func, $word);
+       if ($expected_new) {
+               $func = \&Test::More::is;
+               $word = q{is};
+       }
+       else {
+               $func = \&Test::More::isnt;
+               $word = q{isn't};
+       }
+       $func->(
                IkiWiki::Plugin::cvs::cvs_info("Repository revision", $file),
                '1.1',
-               qq{$file is newly added to CVS},
+               qq{$file $word newly added to CVS},
        );
 }
 
 sub is_in_keyword_substitution_mode {
        my ($file, $mode) = @_;
-       $mode = '(none)' unless defined $mode;
        is(
                IkiWiki::Plugin::cvs::cvs_info("Sticky Options", $file),
                $mode,
@@ -537,3 +702,7 @@ sub stripext {
        $file =~ s|$extension$||g;
        return $file;
 }
+
+sub _wrapper_paths {
+       return qq{newenviron[i++]="PERL5LIB=$ENV{PERL5LIB}";};
+}
diff --git a/t/git.t b/t/git.t
index 6d847dfb04d56808dab435a125bc6cbadcfd3af0..0396ae0652a26b5be875ed9a6c733a81f6656117 100755 (executable)
--- a/t/git.t
+++ b/t/git.t
@@ -16,13 +16,14 @@ BEGIN {
                die $@;
        }
 }
-use Test::More tests => 18;
+use Test::More tests => 22;
 
 BEGIN { use_ok("IkiWiki"); }
 
 %config=IkiWiki::defaultconfig();
 $config{rcs} = "git";
 $config{srcdir} = "$dir/src";
+$config{diffurl} = '/nonexistent/cgit/plain/[[file]]';
 IkiWiki::loadplugins();
 IkiWiki::checkconfig();
 
@@ -94,4 +95,26 @@ is($changes[0]{pages}[0]{"page"}, "newdir/test5");
 IkiWiki::rcs_remove("newdir/test5.mdwn");
 IkiWiki::rcs_commit_staged(message => "Remove the 5th page");
 
+# diffurl escaping
+ok(mkdir($config{srcdir}."/diffurl_dir"));
+my $test3 = readfile("t/test1.mdwn");
+writefile('test3.mdwn', $config{srcdir}."/diffurl_dir", $test3);
+IkiWiki::rcs_add("diffurl_dir/test3.mdwn");
+IkiWiki::rcs_commit(
+       file => "diffurl_dir/test3.mdwn",
+       message => "Added a page in diffurl_dir",
+       token => "moo",
+);
+
+@changes = IkiWiki::rcs_recentchanges(5);
+
+is($#changes, 4);
+is($changes[0]{pages}[0]{"page"}, "diffurl_dir/test3");
+
+unlike(
+       $changes[0]{pages}[0]{"diffurl"},
+       qr{%2F}m,
+       q{path separators are preserved when UTF-8scaping filename}
+);
+
 system "rm -rf $dir";
index 392a167e9747131dbcd065b022a725ebf35f16d2..3f4b7d9b19a39286ddac71d8024efed8248b9037 100755 (executable)
--- a/t/index.t
+++ b/t/index.t
@@ -38,8 +38,6 @@ $depends{"bar"}={"foo*" => 1};
 $depends{"bar.png"}={};
 $pagestate{"bar"}{meta}{title}="a page about bar";
 $pagestate{"bar"}{meta}{moo}="mooooo";
-# only loaded plugins save state, so this should not be saved out
-$pagestate{"bar"}{nosuchplugin}{moo}="mooooo";
 
 ok(saveindex(), "save index");
 ok(-s "$config{wikistatedir}/indexdb", "index file created");
diff --git a/t/inline.t b/t/inline.t
new file mode 100755 (executable)
index 0000000..b34cd27
--- /dev/null
@@ -0,0 +1,59 @@
+#!/usr/bin/perl
+use warnings;
+use strict;
+use Test::More;
+use IkiWiki;
+
+my $blob;
+
+ok(! system("rm -rf t/tmp"));
+ok(! system("mkdir t/tmp"));
+
+sub write_old_file {
+       my $name = shift;
+       my $content = shift;
+
+       writefile($name, "t/tmp/in", $content);
+       ok(utime(333333333, 333333333, "t/tmp/in/$name"));
+}
+
+write_old_file("protagonists.mdwn",
+       '[[!inline pages="protagonists/*" rootpage="protagonists/new"]]');
+write_old_file("friends.mdwn",
+       '[[!inline pages="friends/*" postform=yes]]');
+write_old_file("antagonists.mdwn",
+       '[[!inline pages="antagonists/*"]]');
+write_old_file("enemies.mdwn",
+       '[[!inline pages="enemies/*" postform=no rootpage=enemies]]');
+foreach my $page (qw(protagonists/shepard protagonists/link
+               antagonists/saren antagonists/ganondorf
+               friends/liara friends/midna
+               enemies/benezia enemies/zant)) {
+       write_old_file("$page.mdwn", "this page is *$page*");
+}
+
+ok(! system("make -s ikiwiki.out"));
+
+my $command = "perl -I. ./ikiwiki.out -set usedirs=0 -plugin inline -url=http://example.com -cgiurl=http://example.com/ikiwiki.cgi -rss -atom -underlaydir=underlays/basewiki -set underlaydirbase=underlays -templatedir=templates t/tmp/in t/tmp/out -verbose";
+
+ok(! system($command));
+
+ok(! system("$command -refresh"));
+
+$blob = readfile("t/tmp/out/protagonists.html");
+like($blob, qr{Add a new post}, 'rootpage=yes gives postform');
+like($blob, qr{<input type="hidden" name="from" value="protagonists/new"},
+       'explicit rootpage is /protagonists/new');
+
+$blob = readfile("t/tmp/out/friends.html");
+like($blob, qr{Add a new post}, 'postform=yes forces postform');
+like($blob, qr{<input type="hidden" name="from" value="friends"},
+       'implicit rootpage is /friends');
+
+$blob = readfile("t/tmp/out/antagonists.html");
+unlike($blob, qr{Add a new post}, 'default is no postform');
+
+$blob = readfile("t/tmp/out/enemies.html");
+unlike($blob, qr{Add a new post}, 'postform=no forces no postform');
+
+done_testing;
diff --git a/t/map.t b/t/map.t
new file mode 100755 (executable)
index 0000000..5d4713d
--- /dev/null
+++ b/t/map.t
@@ -0,0 +1,242 @@
+#!/usr/bin/perl
+package IkiWiki;
+
+use warnings;
+use strict;
+use Test::More;
+
+BEGIN {
+        unless (eval { require XML::Twig }) {
+                eval q{
+                        use Test::More skip_all => "XML::Twig is not available"
+                }
+        }
+}
+
+BEGIN { use_ok("IkiWiki"); }
+BEGIN { use_ok("IkiWiki::Render"); }
+BEGIN { use_ok("IkiWiki::Plugin::map"); }
+BEGIN { use_ok("IkiWiki::Plugin::mdwn"); }
+
+ok(! system("rm -rf t/tmp; mkdir t/tmp"));
+
+$config{verbose} = 1;
+$config{srcdir} = 't/tmp';
+$config{underlaydir} = 't/tmp';
+$config{underlaydirbase} = '.';
+$config{templatedir} = 'templates';
+$config{usedirs} = 1;
+$config{htmlext} = 'html';
+$config{wiki_file_chars} = "-[:alnum:]+/.:_";
+$config{userdir} = "users";
+$config{tagbase} = "tags";
+$config{default_pageext} = "mdwn";
+$config{wiki_file_prune_regexps} = [qr/^\./];
+$config{autoindex_commit} = 0;
+
+is(checkconfig(), 1);
+
+%oldrenderedfiles=%pagectime=();
+%pagesources=%pagemtime=%oldlinks=%links=%depends=%typedlinks=%oldtypedlinks=
+%destsources=%renderedfiles=%pagecase=%pagestate=();
+
+my @pages = qw(
+alpha
+alpha/1
+alpha/1/i
+alpha/1/ii
+alpha/1/iii
+alpha/1/iv
+alpha/2
+alpha/2/a
+alpha/2/b
+alpha/3
+beta
+);
+
+foreach my $page (@pages) {
+       # we use a non-default extension for these, so they're distinguishable
+       # from programmatically-created pages
+       $pagesources{$page} = "$page.mdwn";
+       $destsources{$page} = "$page.mdwn";
+       $pagemtime{$page} = $pagectime{$page} = 1000000;
+       writefile("$page.mdwn", "t/tmp", "your ad here");
+}
+
+sub comment {
+       my $str = shift;
+       $str =~ s/^/# /gm;
+       print $str;
+}
+
+sub node {
+       my $name = shift;
+       my $kids = shift;
+       my %stuff = @_;
+
+       return { %stuff, name => $name, kids => $kids };
+}
+
+sub check_nodes {
+       my $ul = shift;
+       my $expected = shift;
+
+       is($ul->tag, 'ul');
+
+       # expected is a list of hashes
+       # ul is a list of li
+       foreach my $li ($ul->children) {
+               my @kids = $li->children;
+
+               is($li->tag, 'li');
+
+               my $expectation = shift @$expected;
+
+               is($kids[0]->tag, 'a');
+               my $a = $kids[0];
+
+               if ($expectation->{parent}) {
+                       is($a->att('class'), 'mapparent');
+               }
+               else {
+                       is($a->att('class'), 'mapitem');
+               }
+
+               is_deeply([$a->text], [$expectation->{name}]);
+
+               if (@{$expectation->{kids}}) {
+                       is(scalar @kids, 2);
+
+                       check_nodes($kids[1], $expectation->{kids});
+               }
+               else {
+                       is_deeply([@kids], [$a]);
+               }
+       }
+}
+
+sub check {
+       my $pagespec = shift;
+       my $expected = shift;
+       comment("*** $pagespec ***\n");
+
+       my $html = IkiWiki::Plugin::map::preprocess(pages => $pagespec,
+               page => 'map',
+               destpage => 'map');
+       comment($html);
+       my $tree = XML::Twig->new(pretty_print => 'indented');
+       eval {
+               $tree->parse($html);
+       };
+       if ($@) {
+               print "malformed XML: $@\n$html\n";
+               ok(0);
+       }
+       my $fragment = $tree->root;
+
+       is($fragment->tag, 'div');
+       is($fragment->att('class'), 'map');
+
+       if (@$expected) {
+               check_nodes(($fragment->children)[0], $expected);
+       }
+       else {
+               ok(! $fragment->children);
+       }
+
+       $tree->dispose;
+}
+
+check('doesnotexist', []);
+
+check('alpha', [node('alpha', [])]);
+
+check('alpha/*',
+       [
+               node('1', [
+                       node('i', []),
+                       node('ii', []),
+                       node('iii', []),
+                       node('iv', []),
+               ]),
+               node('2', [
+                       node('a', []),
+                       node('b', []),
+               ]),
+               node('3', []),
+       ]);
+
+check('alpha or alpha/*',
+       [
+               node('alpha', [
+                       node('1', [
+                               node('i', []),
+                               node('ii', []),
+                               node('iii', []),
+                               node('iv', []),
+                       ]),
+                       node('2', [
+                               node('a', []),
+                               node('b', []),
+                       ]),
+                       node('3', []),
+               ]),
+       ]);
+
+check('alpha or alpha/1 or beta',
+       [
+               node('alpha', [
+                       node('1', []),
+               ]),
+               node('beta', []),
+       ]);
+
+check('alpha/1 or beta',
+       [
+               node('alpha', [
+                       node('1', []),
+               ], parent => 1),
+               node('beta', []),
+       ]);
+
+check('alpha/1/i* or alpha/2/a or beta',
+       [
+               node('alpha', [
+                       node('1', [
+                               node('i', []),
+                               node('ii', []),
+                               node('iii', []),
+                               node('iv', []),
+                       ], parent => 1),
+                       node('2', [
+                               node('a', []),
+                       ], parent => 1),
+               ], parent => 1),
+               node('beta', []),
+       ]);
+
+check('alpha/1/i* or alpha/2/a',
+       [
+               node('1', [
+                       node('i', []),
+                       node('ii', []),
+                       node('iii', []),
+                       node('iv', []),
+               ], parent => 1),
+               node('2', [
+                       node('a', []),
+               ], parent => 1),
+       ]);
+
+check('alpha/1/i*',
+       [
+               node('i', []),
+               node('ii', []),
+               node('iii', []),
+               node('iv', []),
+       ]);
+
+ok(! system("rm -rf t/tmp"));
+done_testing;
+
+1;
index 81d4d18206e860f672f7689222ef45c526dcc0a5..36be984c56fd80aa88796d65bb98dee64f06fe23 100755 (executable)
@@ -3,6 +3,7 @@ use warnings;
 use strict;
 use Test::More 'no_plan';
 
+ok(! system("rm -rf t/tmp"));
 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 -set underlaydirbase=underlays -templatedir=templates t/tinyblog t/tmp/out"));
diff --git a/t/po.t b/t/po.t
index 5e251fce469fa2ad36a874dee6a5d26db520fe93..0db56edc9efae236deeaf8b7348b4bc9e65bbcf9 100755 (executable)
--- a/t/po.t
+++ b/t/po.t
@@ -135,7 +135,7 @@ is_deeply(\@{$links{'index.fr'}}, ['translatable.fr', 'nontranslatable'], "$msgp
 is_deeply(\@{$links{'translatable'}}, ['nontranslatable'], "$msgprefix translatable");
 is_deeply(\@{$links{'translatable.es'}}, ['nontranslatable'], "$msgprefix translatable.es");
 is_deeply(\@{$links{'translatable.fr'}}, ['nontranslatable'], "$msgprefix translatable.fr");
-is_deeply(\@{$links{'nontranslatable'}}, ['/', 'translatable', 'translatable.fr', 'translatable.es'], "$msgprefix nontranslatable");
+is_deeply([sort @{$links{'nontranslatable'}}], [sort('/', 'translatable', 'translatable.fr', 'translatable.es')], "$msgprefix nontranslatable");
 
 $config{po_link_to}='current';
 $msgprefix="links (po_link_to=current)";
@@ -146,7 +146,7 @@ is_deeply(\@{$links{'index.fr'}}, [ (map bestlink('index.fr', $_), ('translatabl
 is_deeply(\@{$links{'translatable'}}, [bestlink('translatable', 'nontranslatable')], "$msgprefix translatable");
 is_deeply(\@{$links{'translatable.es'}}, ['nontranslatable'], "$msgprefix translatable.es");
 is_deeply(\@{$links{'translatable.fr'}}, ['nontranslatable'], "$msgprefix translatable.fr");
-is_deeply(\@{$links{'nontranslatable'}}, ['/', 'translatable', 'translatable.fr', 'translatable.es'], "$msgprefix nontranslatable");
+is_deeply([sort @{$links{'nontranslatable'}}], [sort('/', 'translatable', 'translatable.fr', 'translatable.es')], "$msgprefix nontranslatable");
 
 ### targetpage
 $config{usedirs}=0;
diff --git a/t/podcast.t b/t/podcast.t
new file mode 100755 (executable)
index 0000000..94505a0
--- /dev/null
@@ -0,0 +1,233 @@
+#!/usr/bin/perl
+use warnings;
+use strict;
+
+BEGIN {
+       eval q{use XML::Feed; use HTML::Parser; use HTML::LinkExtor; use File::MimeInfo};
+       if ($@) {
+               eval q{use Test::More skip_all =>
+                       "XML::Feed and/or HTML::Parser or File::MimeInfo not available"};
+       }
+       else {
+               eval q{use Test::More tests => 136};
+       }
+}
+
+use Cwd;
+use File::Basename;
+
+my $tmp = 't/tmp';
+my $statedir = 't/tinypodcast/.ikiwiki';
+
+sub podcast {
+       my $podcast_style = shift;
+
+       my $baseurl = 'http://example.com';
+       my @command = (qw(./ikiwiki.out -plugin inline -rss -atom));
+       push @command, qw(-underlaydir=underlays/basewiki);
+       push @command, qw(-set underlaydirbase=underlays -templatedir=templates);
+       push @command, "-url=$baseurl", qw(t/tinypodcast), "$tmp/out";
+
+       ok(! system("mkdir $tmp"),
+               q{setup});
+       ok(! system(@command),
+               q{build});
+
+       my %media_types = (
+               'simplepost'    => undef,
+               'piano.mp3'     => 'audio/mpeg',
+               'scroll.3gp'    => 'video/3gpp',
+               'walter.ogg'    => 'audio/ogg',
+       );
+
+       for my $format (qw(atom rss)) {
+               my $feed = XML::Feed->parse("$tmp/out/$podcast_style/index.$format");
+
+               is($feed->title, $podcast_style,
+                       qq{$format feed title});
+               is($feed->link, "$baseurl/$podcast_style/",
+                       qq{$format feed link});
+               is($feed->description, 'wiki',
+                       qq{$format feed description});
+               if ('atom' eq $format) {
+                       is($feed->author, $feed->description,
+                               qq{$format feed author});
+                       is($feed->id, $feed->link,
+                               qq{$format feed id});
+                       is($feed->generator, "ikiwiki",
+                               qq{$format feed generator});
+               }
+
+               for my $entry ($feed->entries) {
+                       my $title = $entry->title;
+                       my $url = $entry->id;
+                       my $body = $entry->content->body;
+                       my $enclosure = $entry->enclosure;
+
+                       is($entry->link, $url, qq{$format $title link});
+                       isnt($entry->issued, undef,
+                               qq{$format $title issued date});
+                       isnt($entry->modified, undef,
+                               qq{$format $title modified date});
+
+                       if (defined $media_types{$title}) {
+                               is($url, "$baseurl/$title",
+                                       qq{$format $title id});
+                               is($body, undef,
+                                       qq{$format $title no body text});
+                               is($enclosure->url, $url,
+                                       qq{$format $title enclosure url});
+                               is($enclosure->type, $media_types{$title},
+                                       qq{$format $title enclosure type});
+                               cmp_ok($enclosure->length, '>', 0,
+                                       qq{$format $title enclosure length});
+                       }
+                       else {
+                               # XXX hack hack hack
+                               my $expected_id = "$baseurl/$title/";
+                               $expected_id =~ s/\ /_/g;
+
+                               is($url, $expected_id,
+                                       qq{$format $title id});
+                               isnt($body, undef,
+                                       qq{$format $title body text});
+
+                               if ('fancy' eq $podcast_style) {
+                                       isnt($enclosure, undef,
+                                               qq{$format $title enclosure});
+                                       my $filename = basename($enclosure->url);
+                                       is($enclosure->type, $media_types{$filename},
+                                               qq{$format $title enclosure type});
+                                       cmp_ok($enclosure->length, '>', 0,
+                                               qq{$format $title enclosure length});
+                               }
+                               else {
+                                       is($enclosure, undef,
+                                               qq{$format $title no enclosure});
+                               }
+                       }
+               }
+       }
+
+       ok(! system("rm -rf $tmp $statedir"), q{teardown});
+}
+
+sub single_page_html {
+       my @command = (qw(./ikiwiki.out));
+       push @command, qw(-underlaydir=underlays/basewiki);
+       push @command, qw(-set underlaydirbase=underlays -templatedir=templates);
+       push @command, qw(t/tinypodcast), "$tmp/out";
+
+       ok(! system("mkdir $tmp"),
+               q{setup});
+       ok(! system(@command),
+               q{build});
+
+       my $html = "$tmp/out/pianopost/index.html";
+       like(_extract_html_content($html, 'content'), qr/has content and/m,
+               q{html body text});
+       like(_extract_html_content($html, 'enclosure'), qr/Download/m,
+               q{html enclosure});
+       my ($href) = _extract_html_links($html, 'piano');
+       is($href, '/piano.mp3',
+               q{html enclosure sans -url is site-absolute});
+
+       $html = "$tmp/out/attempted_multiple_enclosures/index.html";
+       like(_extract_html_content($html, 'content'), qr/has content and/m,
+               q{html body text});
+       like(_extract_html_content($html, 'enclosure'), qr/Download/m,
+               q{html enclosure});
+       ($href) = _extract_html_links($html, 'walter');
+       is($href, '/walter.ogg',
+               q{html enclosure sans -url is site-absolute});
+
+       my $baseurl = 'http://example.com';
+       ok(! system(@command, "-url=$baseurl", q{--rebuild}));
+
+       $html = "$tmp/out/pianopost/index.html";
+       ($href) = _extract_html_links($html, 'piano');
+       is($href, "$baseurl/piano.mp3",
+               q{html enclosure with -url is fully absolute});
+
+       $html = "$tmp/out/attempted_multiple_enclosures/index.html";
+       ($href) = _extract_html_links($html, 'walter');
+       is($href, "$baseurl/walter.ogg",
+               q{html enclosure with -url is fully absolute});
+
+       ok(! system("rm -rf $tmp $statedir"), q{teardown});
+}
+
+sub inlined_pages_html {
+       my @command = (qw(./ikiwiki.out -plugin inline));
+       push @command, qw(-underlaydir=underlays/basewiki);
+       push @command, qw(-set underlaydirbase=underlays -templatedir=templates);
+       push @command, qw(t/tinypodcast), "$tmp/out";
+
+       ok(! system("mkdir $tmp"),
+               q{setup});
+       ok(! system(@command),
+               q{build});
+
+       my $html = "$tmp/out/fancy/index.html";
+       my $contents = _extract_html_content($html, 'content');
+       like($contents, qr/has content and an/m,
+               q{html body text from pianopost});
+       like($contents, qr/has content and only one/m,
+               q{html body text from attempted_multiple_enclosures});
+       my $enclosures = _extract_html_content($html, 'inlineenclosure');
+       like($enclosures, qr/Download/m,
+               q{html enclosure});
+       my ($href) = _extract_html_links($html, 'piano.mp3');
+       is($href, '/piano.mp3',
+               q{html enclosure from pianopost sans -url});
+       ($href) = _extract_html_links($html, 'walter.ogg');
+       is($href, '/walter.ogg',
+               q{html enclosure from attempted_multiple_enclosures sans -url});
+
+       ok(! system("rm -rf $tmp $statedir"), q{teardown});
+}
+
+sub _extract_html_content {
+       my ($file, $desired_id, $desired_tag) = @_;
+       $desired_tag = 'div' unless defined $desired_tag;
+
+       my $p = HTML::Parser->new(api_version => 3);
+       my $content = '';
+
+       $p->handler(start => sub {
+               my ($tag, $self, $attr) = @_;
+               return if $tag ne $desired_tag;
+               return unless exists $attr->{id} && $attr->{id} eq $desired_id;
+
+               $self->handler(text => sub {
+                       my ($dtext) = @_;
+                       $content .= $dtext;
+               }, "dtext");
+       }, "tagname,self,attr");
+
+       $p->parse_file($file) || die $!;
+
+       return $content;
+}
+
+sub _extract_html_links {
+       my ($file, $desired_value) = @_;
+
+       my @hrefs = ();
+
+       my $p = HTML::LinkExtor->new(sub {
+               my ($tag, %attr) = @_;
+               return if $tag ne 'a';
+               return unless $attr{href} =~ qr/$desired_value/;
+               push(@hrefs, values %attr);
+       }, getcwd() . '/' . $file);
+
+       $p->parse_file($file);
+
+       return @hrefs;
+}
+
+podcast('simple');
+single_page_html();
+inlined_pages_html();
+podcast('fancy');
diff --git a/t/prune.t b/t/prune.t
new file mode 100755 (executable)
index 0000000..8c3925e
--- /dev/null
+++ b/t/prune.t
@@ -0,0 +1,23 @@
+#!/usr/bin/perl
+use warnings;
+use strict;
+use Test::More tests => 6;
+use File::Path qw(make_path remove_tree);
+
+BEGIN { use_ok("IkiWiki"); }
+BEGIN { use_ok("IkiWiki::Render"); }
+
+%config=IkiWiki::defaultconfig();
+
+remove_tree("t/tmp");
+
+make_path("t/tmp/srcdir/a/b/c");
+make_path("t/tmp/srcdir/d/e/f");
+writefile("a/b/c/d.mdwn", "t/tmp/srcdir", "foo");
+writefile("d/e/f/g.mdwn", "t/tmp/srcdir", "foo");
+IkiWiki::prune("t/tmp/srcdir/d/e/f/g.mdwn");
+ok(-d "t/tmp/srcdir");
+ok(! -e "t/tmp/srcdir/d");
+IkiWiki::prune("t/tmp/srcdir/a/b/c/d.mdwn", "t/tmp/srcdir");
+ok(-d "t/tmp/srcdir");
+ok(! -e "t/tmp/srcdir/a");
index a3760a2b2aa956b48bc1764dbff141335b0247ff..b7c6efd58345de974628f6e55dab4424336c9c09 100755 (executable)
@@ -5,8 +5,9 @@ use Test::More;
 
 my @progs="ikiwiki.in";
 my @libs="IkiWiki.pm";
-# monotone, external, amazon_s3 skipped since they need perl modules
-push @libs, map { chomp; $_ } `find IkiWiki -type f -name \\*.pm | grep -v monotone.pm | grep -v external.pm | grep -v amazon_s3.pm | grep -v po.pm`;
+# monotone, external, amazon_s3, po, and cvs
+# skipped since they need perl modules
+push @libs, map { chomp; $_ } `find IkiWiki -type f -name \\*.pm | grep -v monotone.pm | grep -v external.pm | grep -v amazon_s3.pm | grep -v po.pm | grep -v cvs.pm`;
 push @libs, 'IkiWiki/Plugin/skeleton.pm.example';
 
 plan(tests => (@progs + @libs));
diff --git a/t/syslog.t b/t/syslog.t
new file mode 100644 (file)
index 0000000..ffe8635
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/perl
+use warnings;
+use strict;
+use Test::More tests => 5;
+use utf8;
+
+BEGIN { use_ok("IkiWiki"); }
+
+$IkiWiki::config{verbose} = 1;
+$IkiWiki::config{syslog} = 1;
+
+$IkiWiki::config{wikiname} = 'ASCII';
+is(debug('test'), '', 'plain ASCII syslog');
+$IkiWiki::config{wikiname} = 'not ⒶSCII';
+is(debug('test'), '', 'UTF8 syslog');
+my $orig = $IkiWiki::config{wikiname};
+is(debug('test'), '', 'check for idempotency');
+is($IkiWiki::config{wikiname}, $orig, 'unchanged config');
index 1e156eed897890f1e856eb25606ba8057f169975..e3d1feca9ef3d3791ba7e93cf6bad2faf9abecc7 100755 (executable)
@@ -3,7 +3,7 @@ use warnings;
 use strict;
 use Test::More;
 
-my @templates=glob("templates/*.tmpl"), glob("doc/templates/*.mdwn");
+my @templates=(glob("templates/*.tmpl"), glob("doc/templates/*.mdwn"));
 plan(tests => 2*@templates);
 
 use HTML::Template;
diff --git a/t/tinypodcast/attempted_multiple_enclosures.mdwn b/t/tinypodcast/attempted_multiple_enclosures.mdwn
new file mode 100644 (file)
index 0000000..ea7bae8
--- /dev/null
@@ -0,0 +1,4 @@
+[[!meta enclosure="piano.mp3" enclosure="scroll.3gp"]]
+[[!meta enclosure="walter.ogg"]]
+
+this article has content _and_ only one enclosure!
diff --git a/t/tinypodcast/fancy.mdwn b/t/tinypodcast/fancy.mdwn
new file mode 100644 (file)
index 0000000..290f4c2
--- /dev/null
@@ -0,0 +1 @@
+[[!inline pages="pianopost or attempted_multiple_enclosures"]]
diff --git a/t/tinypodcast/piano.mp3 b/t/tinypodcast/piano.mp3
new file mode 100644 (file)
index 0000000..3d6b662
Binary files /dev/null and b/t/tinypodcast/piano.mp3 differ
diff --git a/t/tinypodcast/pianopost.mdwn b/t/tinypodcast/pianopost.mdwn
new file mode 100644 (file)
index 0000000..b02f8de
--- /dev/null
@@ -0,0 +1,3 @@
+[[!meta enclosure="piano.mp3"]]
+
+this article has content _and_ an enclosure!
diff --git a/t/tinypodcast/scroll.3gp b/t/tinypodcast/scroll.3gp
new file mode 100644 (file)
index 0000000..61e69e9
Binary files /dev/null and b/t/tinypodcast/scroll.3gp differ
diff --git a/t/tinypodcast/simple.mdwn b/t/tinypodcast/simple.mdwn
new file mode 100644 (file)
index 0000000..0523697
--- /dev/null
@@ -0,0 +1 @@
+[[!inline pages="simplepost or *.3gp or *.mov or *.mp3 or *.ogg"]]
diff --git a/t/tinypodcast/simplepost.mdwn b/t/tinypodcast/simplepost.mdwn
new file mode 100644 (file)
index 0000000..d28ddb5
--- /dev/null
@@ -0,0 +1 @@
+this article has content but no enclosure
diff --git a/t/tinypodcast/walter.ogg b/t/tinypodcast/walter.ogg
new file mode 100644 (file)
index 0000000..3eee48c
Binary files /dev/null and b/t/tinypodcast/walter.ogg differ
diff --git a/t/trail.t b/t/trail.t
new file mode 100755 (executable)
index 0000000..dce3b3c
--- /dev/null
+++ b/t/trail.t
@@ -0,0 +1,292 @@
+#!/usr/bin/perl
+use warnings;
+use strict;
+use Test::More 'no_plan';
+use IkiWiki;
+
+sub check_trail {
+       my $file=shift;
+       my $expected=shift;
+       my $trailname=shift || qr/\w+/;
+       my $blob=readfile("t/tmp/out/$file");
+       my ($trailline)=$blob=~/^trail=$trailname\s+(.*)$/m;
+       is($trailline, $expected, "expected $expected in $file");
+}
+
+sub check_no_trail {
+       my $file=shift;
+       my $trailname=shift || qr/\w+/;
+       my $blob=readfile("t/tmp/out/$file");
+       my ($trailline)=$blob=~/^trail=$trailname\s+(.*)$/m;
+       $trailline="" unless defined $trailline;
+       ok($trailline !~ /^trail=$trailname\s+/, "no trail $trailname in $file");
+}
+
+my $blob;
+
+ok(! system("rm -rf t/tmp"));
+ok(! system("mkdir t/tmp"));
+
+# Write files with a date in the past, so that when we refresh,
+# the update is detected.
+sub write_old_file {
+       my $name = shift;
+       my $content = shift;
+
+       writefile($name, "t/tmp/in", $content);
+       ok(utime(333333333, 333333333, "t/tmp/in/$name"));
+}
+
+# Use a rather stylized template to override the default rendering, to make
+# it easy to search for the desired results
+write_old_file("templates/trails.tmpl", <<EOF
+<TMPL_LOOP TRAILLOOP>
+<TMPL_IF __FIRST__><nav></TMPL_IF>
+<div>
+trail=<TMPL_VAR TRAILPAGE> n=<TMPL_VAR NEXTPAGE> p=<TMPL_VAR PREVPAGE>
+</div>
+<div>
+<TMPL_IF PREVURL>
+<a href="<TMPL_VAR PREVURL>">&lt; <TMPL_VAR PREVTITLE></a>
+</TMPL_IF> |
+<a href="<TMPL_VAR TRAILURL>">^ <TMPL_VAR TRAILTITLE> ^</a>
+| <TMPL_IF NEXTURL>
+<a href="<TMPL_VAR NEXTURL>"><TMPL_VAR NEXTTITLE> &gt;</a>
+</TMPL_IF>
+</div>
+<TMPL_IF __LAST__></nav></TMPL_IF>
+</TMPL_LOOP>
+EOF
+);
+write_old_file("badger.mdwn", "[[!meta title=\"The Breezy Badger\"]]\ncontent of badger");
+write_old_file("mushroom.mdwn", "content of mushroom");
+write_old_file("snake.mdwn", "content of snake");
+write_old_file("ratty.mdwn", "content of ratty");
+write_old_file("mr_toad.mdwn", "content of mr toad");
+write_old_file("add.mdwn", '[[!trailitems pagenames="add/a add/b add/c add/d add/e"]]');
+write_old_file("add/b.mdwn", "b");
+write_old_file("add/d.mdwn", "d");
+write_old_file("del.mdwn", '[[!trailitems pages="del/*" sort=title]]');
+write_old_file("del/a.mdwn", "a");
+write_old_file("del/b.mdwn", "b");
+write_old_file("del/c.mdwn", "c");
+write_old_file("del/d.mdwn", "d");
+write_old_file("del/e.mdwn", "e");
+write_old_file("self_referential.mdwn", '[[!trailitems pagenames="self_referential" circular=yes]]');
+write_old_file("sorting/linked.mdwn", "linked");
+write_old_file("sorting/a/b.mdwn", "a/b");
+write_old_file("sorting/a/c.mdwn", "a/c");
+write_old_file("sorting/z/a.mdwn", "z/a");
+write_old_file("sorting/beginning.mdwn", "beginning");
+write_old_file("sorting/middle.mdwn", "middle");
+write_old_file("sorting/end.mdwn", "end");
+write_old_file("sorting/new.mdwn", "new");
+write_old_file("sorting/old.mdwn", "old");
+write_old_file("sorting/ancient.mdwn", "ancient");
+# These three need to be in the appropriate age order
+ok(utime(333333333, 333333333, "t/tmp/in/sorting/new.mdwn"));
+ok(utime(222222222, 222222222, "t/tmp/in/sorting/old.mdwn"));
+ok(utime(111111111, 111111111, "t/tmp/in/sorting/ancient.mdwn"));
+write_old_file("sorting/linked2.mdwn", "linked2");
+# This initially uses the default sort order: age for the inline, and path
+# for trailitems. We change it later.
+write_old_file("sorting.mdwn",
+       '[[!traillink linked]] ' .
+       '[[!trailitems pages="sorting/z/a or sorting/a/b or sorting/a/c"]] ' .
+       '[[!trailitems pagenames="sorting/beginning sorting/middle sorting/end"]] ' .
+       '[[!inline pages="sorting/old or sorting/ancient or sorting/new" trail="yes"]] ' .
+       '[[!traillink linked2]]');
+write_old_file("limited/a.mdwn", "a");
+write_old_file("limited/b.mdwn", "b");
+write_old_file("limited/c.mdwn", "c");
+write_old_file("limited/d.mdwn", "d");
+write_old_file("limited.mdwn",
+       '[[!inline pages="limited/*" trail="yes" show=2 sort=title]]');
+write_old_file("untrail/a.mdwn", "a");
+write_old_file("untrail/b.mdwn", "b");
+write_old_file("untrail.mdwn", "[[!traillink a]] [[!traillink b]]");
+write_old_file("retitled/a.mdwn", "a");
+write_old_file("retitled.mdwn",
+       '[[!meta title="the old title"]][[!traillink a]]');
+
+write_old_file("meme.mdwn", <<EOF
+[[!trail]]
+* [[!traillink badger]]
+* [[!traillink badger text="This is a link to badger, with a title"]]
+* [[!traillink That_is_the_badger|badger]]
+* [[!traillink badger]]
+* [[!traillink mushroom]]
+* [[!traillink mushroom]]
+* [[!traillink snake]]
+* [[!traillink snake]]
+EOF
+);
+
+write_old_file("wind_in_the_willows.mdwn", <<EOF
+[[!trailoptions circular=yes sort=title]]
+[[!trailitems pages="ratty or badger or mr_toad"]]
+[[!trailitem moley]]
+EOF
+);
+
+ok(! system("make -s ikiwiki.out"));
+
+my $command = "perl -I. ./ikiwiki.out -set usedirs=0 -plugin trail -plugin inline -url=http://example.com -cgiurl=http://example.com/ikiwiki.cgi -rss -atom -underlaydir=underlays/basewiki -set underlaydirbase=underlays -templatedir=templates t/tmp/in t/tmp/out -verbose";
+
+ok(! system($command));
+
+ok(! system("$command -refresh"));
+
+$blob = readfile("t/tmp/out/meme.html");
+ok($blob =~ /<a href="(\.\/)?badger.html">badger<\/a>/m);
+ok($blob =~ /<a href="(\.\/)?badger.html">This is a link to badger, with a title<\/a>/m);
+ok($blob =~ /<a href="(\.\/)?badger.html">That is the badger<\/a>/m);
+
+check_trail("badger.html", "n=mushroom p=", "meme");
+check_trail("badger.html", "n=mr_toad p=ratty", "wind_in_the_willows");
+
+ok(! -f "t/tmp/out/moley.html");
+
+check_trail("mr_toad.html", "n=ratty p=badger", "wind_in_the_willows");
+check_no_trail("mr_toad.html", "meme");
+# meta title is respected for pages that have one
+$blob = readfile("t/tmp/out/mr_toad.html");
+ok($blob =~ /">&lt; The Breezy Badger<\/a>/m);
+# pagetitle for pages that don't
+ok($blob =~ /">ratty &gt;<\/a>/m);
+
+check_no_trail("ratty.html", "meme");
+check_trail("ratty.html", "n=badger p=mr_toad", "wind_in_the_willows");
+
+check_trail("mushroom.html", "n=snake p=badger", "meme");
+check_no_trail("mushroom.html", "wind_in_the_willows");
+
+check_trail("snake.html", "n= p=mushroom", "meme");
+check_no_trail("snake.html", "wind_in_the_willows");
+
+check_trail("self_referential.html", "n= p=", "self_referential");
+
+check_trail("add/b.html", "n=add/d p=", "add");
+check_trail("add/d.html", "n= p=add/b", "add");
+ok(! -f "t/tmp/out/add/a.html");
+ok(! -f "t/tmp/out/add/c.html");
+ok(! -f "t/tmp/out/add/e.html");
+
+check_trail("del/a.html", "n=del/b p=");
+check_trail("del/b.html", "n=del/c p=del/a");
+check_trail("del/c.html", "n=del/d p=del/b");
+check_trail("del/d.html", "n=del/e p=del/c");
+check_trail("del/e.html", "n= p=del/d");
+
+check_trail("sorting/linked.html", "n=sorting/a/b p=");
+check_trail("sorting/a/b.html", "n=sorting/a/c p=sorting/linked");
+check_trail("sorting/a/c.html", "n=sorting/z/a p=sorting/a/b");
+check_trail("sorting/z/a.html", "n=sorting/beginning p=sorting/a/c");
+check_trail("sorting/beginning.html", "n=sorting/middle p=sorting/z/a");
+check_trail("sorting/middle.html", "n=sorting/end p=sorting/beginning");
+check_trail("sorting/end.html", "n=sorting/new p=sorting/middle");
+check_trail("sorting/new.html", "n=sorting/old p=sorting/end");
+check_trail("sorting/old.html", "n=sorting/ancient p=sorting/new");
+check_trail("sorting/ancient.html", "n=sorting/linked2 p=sorting/old");
+check_trail("sorting/linked2.html", "n= p=sorting/ancient");
+
+# If the inline has a limited number of pages, the trail still contains
+# everything.
+$blob = readfile("t/tmp/out/limited.html");
+ok($blob =~ /<a href="(\.\/)?limited\/a.html">a<\/a>/m);
+ok($blob =~ /<a href="(\.\/)?limited\/b.html">b<\/a>/m);
+ok($blob !~ /<a href="(\.\/)?limited\/c.html">/m);
+ok($blob !~ /<a href="(\.\/)?limited\/d.html">/m);
+check_trail("limited/a.html", "n=limited/b p=");
+check_trail("limited/b.html", "n=limited/c p=limited/a");
+check_trail("limited/c.html", "n=limited/d p=limited/b");
+check_trail("limited/d.html", "n= p=limited/c");
+
+check_trail("untrail/a.html", "n=untrail/b p=");
+check_trail("untrail/b.html", "n= p=untrail/a");
+
+$blob = readfile("t/tmp/out/retitled/a.html");
+ok($blob =~ /\^ the old title \^/m);
+
+# Make some changes and refresh. These writefile calls don't set an
+# old mtime, so they're strictly newer than the "old" files.
+
+writefile("add/a.mdwn", "t/tmp/in", "a");
+writefile("add/c.mdwn", "t/tmp/in", "c");
+writefile("add/e.mdwn", "t/tmp/in", "e");
+ok(unlink("t/tmp/in/del/a.mdwn"));
+ok(unlink("t/tmp/in/del/c.mdwn"));
+ok(unlink("t/tmp/in/del/e.mdwn"));
+
+writefile("sorting.mdwn", "t/tmp/in",
+       readfile("t/tmp/in/sorting.mdwn") .
+       '[[!trailoptions sort="title" reverse="yes"]]'); 
+
+writefile("retitled.mdwn", "t/tmp/in",
+       '[[!meta title="the new title"]][[!traillink a]]');
+
+# If the inline has a limited number of pages, the trail still depends on
+# everything.
+writefile("limited.html", "t/tmp/out", "[this gets rebuilt]");
+writefile("limited/c.mdwn", "t/tmp/in", '[[!meta title="New C page"]]c');
+
+writefile("untrail.mdwn", "t/tmp/in", "no longer a trail");
+
+ok(! system("$command -refresh"));
+
+check_trail("add/a.html", "n=add/b p=");
+check_trail("add/b.html", "n=add/c p=add/a");
+check_trail("add/c.html", "n=add/d p=add/b");
+check_trail("add/d.html", "n=add/e p=add/c");
+check_trail("add/e.html", "n= p=add/d");
+
+check_trail("del/b.html", "n=del/d p=");
+check_trail("del/d.html", "n= p=del/b");
+ok(! -f "t/tmp/out/del/a.html");
+ok(! -f "t/tmp/out/del/c.html");
+ok(! -f "t/tmp/out/del/e.html");
+
+check_trail("sorting/old.html", "n=sorting/new p=");
+check_trail("sorting/new.html", "n=sorting/middle p=sorting/old");
+check_trail("sorting/middle.html", "n=sorting/linked2 p=sorting/new");
+check_trail("sorting/linked2.html", "n=sorting/linked p=sorting/middle");
+check_trail("sorting/linked.html", "n=sorting/end p=sorting/linked2");
+check_trail("sorting/end.html", "n=sorting/a/c p=sorting/linked");
+check_trail("sorting/a/c.html", "n=sorting/beginning p=sorting/end");
+check_trail("sorting/beginning.html", "n=sorting/a/b p=sorting/a/c");
+check_trail("sorting/a/b.html", "n=sorting/ancient p=sorting/beginning");
+check_trail("sorting/ancient.html", "n=sorting/z/a p=sorting/a/b");
+check_trail("sorting/z/a.html", "n= p=sorting/ancient");
+
+# If the inline has a limited number of pages, the trail still depends on
+# everything, so it gets rebuilt even though it doesn't strictly need it.
+# This means we could use it as a way to recompute the order of members
+# and the contents of their trail navbars, allowing us to fix the regression
+# described in [[bugs/trail excess dependencies]] without a full content
+# dependency.
+$blob = readfile("t/tmp/out/limited.html");
+ok($blob =~ /<a href="(\.\/)?limited\/a.html">a<\/a>/m);
+ok($blob =~ /<a href="(\.\/)?limited\/b.html">b<\/a>/m);
+ok($blob !~ /<a href="(\.\/)?limited\/c.html">/m);
+ok($blob !~ /<a href="(\.\/)?limited\/d.html">/m);
+check_trail("limited/a.html", "n=limited/b p=");
+check_trail("limited/b.html", "n=limited/c p=limited/a");
+check_trail("limited/c.html", "n=limited/d p=limited/b");
+check_trail("limited/d.html", "n= p=limited/c");
+# Also, b and d should pick up the change to c. This regressed with the
+# change to using a presence dependency.
+$blob = readfile("t/tmp/out/limited/b.html");
+ok($blob =~ /New C page &gt;/m);
+$blob = readfile("t/tmp/out/limited/d.html");
+ok($blob =~ /&lt; New C page/m);
+
+# Members of a retitled trail should pick up that change.
+# This regressed with the change to using a presence dependency.
+$blob = readfile("t/tmp/out/retitled/a.html");
+ok($blob =~ /\^ the new title \^/m);
+
+# untrail is no longer a trail, so these are no longer in it.
+check_no_trail("untrail/a.html");
+check_no_trail("untrail/b.html");
+
+ok(! system("rm -rf t/tmp"));
index 4e89efe3282082faf98f654294a31357422ff34b..5a0f6e7805b299feee7b4077a58cad0af557e02b 100644 (file)
@@ -11,5 +11,9 @@
 <TMPL_IF COPYRIGHT>
 [[!meta copyright="<TMPL_VAR COPYRIGHT ESCAPE=HTML>"]]
 </TMPL_IF>
+<TMPL_IF AUTHOR>
+[[!meta author="<TMPL_VAR AUTHOR ESCAPE=HTML> (<TMPL_VAR NAME ESCAPE=HTML>)"]]
+<TMPL_ELSE>
 [[!meta author="<TMPL_VAR NAME ESCAPE=HTML>"]]
+</TMPL_IF>
 [[!meta authorurl="<TMPL_VAR URL ESCAPE=HTML>"]]
index 93bdd9ce0e50135eec16dd4b7b6a9c5c5969a190..3e0bd9bc20c2d228ce2958ca2d80496c8aec5190 100644 (file)
@@ -1,10 +1,10 @@
-<p>
+<div class="archivepage">
 <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>
+<span class="archivepagedate">
 Posted <TMPL_VAR CTIME>
 <TMPL_IF AUTHOR>
 by <span class="author">
@@ -15,5 +15,5 @@ by <span class="author">
 </TMPL_IF>
 </span>
 </TMPL_IF>
-</i>
-</p>
+</span>
+</div>
index 4ed17bc62070756b16e2dc1c6de3d10d0058de5e..9b056e0f455c06a06144d4c73922184441c1d3a6 100644 (file)
        <published><TMPL_VAR CDATE_3339></published>
 <TMPL_IF ENCLOSURE>
        <link rel="enclosure" type="<TMPL_VAR TYPE>" href="<TMPL_VAR ENCLOSURE>" length="<TMPL_VAR LENGTH>" />
-<TMPL_ELSE>
+</TMPL_IF>
+<TMPL_UNLESS SIMPLEPODCAST>
        <content type="html" xml:lang="en">
        <TMPL_VAR CONTENT ESCAPE=HTML>
        </content>
-</TMPL_IF>
+</TMPL_UNLESS>
 <TMPL_IF COMMENTSURL>
        <link rel="comments" href="<TMPL_VAR COMMENTSURL>" type="text/html" />
 </TMPL_IF>
index d7ec9087534af331eb53ee1c4f9ab6f786a76e6f..cb022220e9510ab81ec2896d0ae5a396f71b9232 100644 (file)
@@ -9,6 +9,11 @@
 <div id="change-<TMPL_VAR REV>" class="metadata">
 <span class="desc"><br />Changed pages:</span>
 <span class="pagelinks">
+<TMPL_UNLESS HAS_DIFFURL>
+<TMPL_IF DIFF>
+<a href="#diff-<TMPL_VAR REV>" class="toggle" title="diff" rel="nofollow">[[diff|wikiicons/diff.png]]</a>
+</TMPL_IF>
+</TMPL_UNLESS>
 <TMPL_LOOP PAGES>
 <TMPL_IF DIFFURL><a href="<TMPL_VAR DIFFURL>" title="diff" rel="nofollow">[[diff|wikiicons/diff.png]]</a><TMPL_VAR LINK>
 <TMPL_ELSE><TMPL_VAR LINK></TMPL_IF>
 </TMPL_LOOP>
 </div>
 <TMPL_IF DIFF>
+<TMPL_IF HAS_DIFFURL>
 <div class="diff">
+<TMPL_ELSE>
+<div class="toggleable" id="diff-<TMPL_VAR REV>">
+</TMPL_IF>
 <pre>
 <TMPL_VAR DIFF>
 </pre>
index a2edc691e7cf98dedbfe6195f10791f678842f07..e177db959412355240ccb2c83fc016ff7c477ca1 100644 (file)
@@ -13,6 +13,9 @@
 <label for="url" class="block">Website:</label>
 <TMPL_VAR NAME=FIELD-URL> (optional)
 <br />
+<label for="url" class="block">Email:</label>
+<TMPL_VAR NAME=FIELD-EMAIL> <TMPL_VAR FIELD-ANONSUBSCRIBE>
+<br />
 <TMPL_ELSE>
 (You might want to <a href="<TMPL_VAR SIGNINURL>">Signin</a> first?)
 <br />
@@ -22,7 +25,8 @@
 <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 FORM-SUBMIT> <TMPL_VAR FIELD-TYPE> <TMPL_VAR HELPONFORMATTINGLINK>
+<TMPL_VAR FIELD-SUBSCRIBE><br />
 <TMPL_VAR NAME="FORM-END">
 <TMPL_VAR WMD_PREVIEW>
 
index 696c8dcad197134bb7264d17d9f5cf950c24aba0..4736c95d0a8197d32d37f72fd7ab27ae48788553 100644 (file)
 <TMPL_VAR FIELD-EDITCONTENT><br />
 </div>
 <TMPL_IF NAME="CAN_COMMIT">
-<label for="editmessage" class="block">Optional comment about this change:</label>
+<label for="editmessage" class="block">Optional description of this change:</label>
 <TMPL_VAR FIELD-EDITMESSAGE><br />
 </TMPL_IF>
 <TMPL_VAR FORM-SUBMIT>
 <TMPL_VAR HELPONFORMATTINGLINK>
 <TMPL_IF NAME="FIELD-ATTACHMENT">
 <a class="toggle" href="#attachments">Attachments</a>
+</TMPL_IF>
+<TMPL_VAR FIELD-SUBSCRIBE>
+<TMPL_IF NAME="FIELD-ATTACHMENT">
 <div class="<TMPL_VAR ATTACHMENTS-CLASS>" id="attachments">
 <div id="fileupload"> 
 <script>
index b0b53d0416db76d2dc24bb606c5e86755dee93ef..37d7e48c135b430b47308b8f5c3f4b1b4446e5ce 100644 (file)
 <TMPL_VAR CONTENT>
 <TMPL_IF HTML5></section><TMPL_ELSE></div></TMPL_IF>
 
+<TMPL_IF ENCLOSURE>
+<TMPL_IF HTML5><section id="inlineenclosure"><TMPL_ELSE><div id="inlineenclosure"></TMPL_IF>
+<a href="<TMPL_VAR ENCLOSURE>">Download</a>
+<TMPL_IF HTML5></section><TMPL_ELSE></div></TMPL_IF>
+</TMPL_IF>
+
 <TMPL_IF HTML5><footer class="inlinefooter"><TMPL_ELSE><div class="inlinefooter"></TMPL_IF>
 
 <span class="pagedate">
diff --git a/templates/notifyemail.tmpl b/templates/notifyemail.tmpl
new file mode 100644 (file)
index 0000000..5087668
--- /dev/null
@@ -0,0 +1,9 @@
+A <TMPL_IF NAME=ISCOMMENT>comment has been posted at<TMPL_ELSE>change has been made to</TMPL_IF>  <TMPL_VAR URL>
+<TMPL_IF NAME=SHOWCONTENT>
+----
+
+<TMPL_VAR CONTENT>
+
+----
+</TMPL_IF>
+To stop these notifications, visit <TMPL_VAR PREFSURL>
index 8659018a05fef3d2915287e66dcf23b6140b65aa..c886b22d81d53069fd10ff290dbddb672d093566 100644 (file)
 <TMPL_ELSE>
 <link rel="stylesheet" href="<TMPL_VAR BASEURL>local.css" type="text/css" />
 </TMPL_IF>
+
+<TMPL_UNLESS DYNAMIC>
 <TMPL_IF EDITURL>
 <link rel="alternate" type="application/x-wiki" title="Edit this page" href="<TMPL_VAR EDITURL>" />
 </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>
+<TMPL_LOOP TRAILLOOP>
+<TMPL_IF PREVPAGE>
+<link rel="prev" href="<TMPL_VAR PREVURL>" title="<TMPL_VAR PREVTITLE>" />
+</TMPL_IF>
+<link rel="up" href="<TMPL_VAR TRAILURL>" title="<TMPL_VAR TRAILTITLE>" />
+<TMPL_IF NEXTPAGE>
+<link rel="next" href="<TMPL_VAR NEXTURL>" title="<TMPL_VAR NEXTTITLE>" />
+</TMPL_IF>
+</TMPL_LOOP>
+</TMPL_UNLESS>
+
 </head>
 <body>
 
 </TMPL_IF>
 </span>
 </span>
+<TMPL_UNLESS DYNAMIC>
 <TMPL_IF SEARCHFORM>
 <TMPL_VAR SEARCHFORM>
 </TMPL_IF>
+</TMPL_UNLESS>
 <TMPL_IF HTML5></header><TMPL_ELSE></div></TMPL_IF>
 
 <TMPL_IF HAVE_ACTIONS>
 <TMPL_IF HTML5></nav><TMPL_ELSE></div></TMPL_IF>
 </TMPL_IF>
 
+<TMPL_UNLESS DYNAMIC>
+<TMPL_VAR TRAILS>
+</TMPL_UNLESS>
+
 <TMPL_IF HTML5></section><TMPL_ELSE></div></TMPL_IF>
 
+<TMPL_UNLESS DYNAMIC>
 <TMPL_IF SIDEBAR>
 <TMPL_IF HTML5><aside class="sidebar"><TMPL_ELSE><div class="sidebar"></TMPL_IF>
 <TMPL_VAR SIDEBAR>
 <TMPL_IF HTML5></aside><TMPL_ELSE></div></TMPL_IF>
 </TMPL_IF>
+</TMPL_UNLESS>
 
 <div id="pagebody">
 
 <TMPL_VAR CONTENT>
 <TMPL_IF HTML5></section><TMPL_ELSE></div></TMPL_IF>
 
+<TMPL_IF ENCLOSURE>
+<TMPL_IF HTML5><section id="enclosure"><TMPL_ELSE><div id="enclosure"></TMPL_IF>
+<a href="<TMPL_VAR ENCLOSURE>">Download</a>
+<TMPL_IF HTML5></section><TMPL_ELSE></div></TMPL_IF>
+</TMPL_IF>
+
 <TMPL_UNLESS DYNAMIC>
 <TMPL_IF COMMENTS>
 <TMPL_IF HTML5><section id="comments"><TMPL_ELSE><div id="comments"></TMPL_IF>
 <TMPL_UNLESS DYNAMIC>
 <TMPL_IF HTML5><nav id="pageinfo"><TMPL_ELSE><div id="pageinfo"></TMPL_IF>
 
+<TMPL_VAR TRAILS>
+
 <TMPL_IF TAGS>
 <TMPL_IF HTML5><nav class="tags"><TMPL_ELSE><div class="tags"></TMPL_IF>
 Tags:
index 831daa871d11369b7b5c532014fbfab2b478c550..bb03ca5bcf9be23c9f52d9e81fd3072ec2ab50f7 100644 (file)
@@ -1,16 +1,14 @@
 <item>
-<TMPL_IF AUTHOR>
-       <title><TMPL_VAR AUTHOR ESCAPE=HTML>: <TMPL_VAR TITLE></title>
-       <dcterms:creator><TMPL_VAR AUTHOR ESCAPE=HTML></dcterms:creator>
-<TMPL_ELSE>
        <title><TMPL_VAR TITLE></title>
-</TMPL_IF>
 <TMPL_IF GUID>
        <guid isPermaLink="false"><TMPL_VAR GUID></guid>
 <TMPL_ELSE>
        <guid isPermaLink="false"><TMPL_VAR URL></guid>
 </TMPL_IF>
        <link><TMPL_VAR PERMALINK></link>
+<TMPL_IF AUTHOR>
+       <dc:creator><TMPL_VAR AUTHOR ESCAPE=HTML></dc:creator>
+</TMPL_IF>
 <TMPL_IF CATEGORIES>
 <TMPL_LOOP CATEGORIES>
        <category><TMPL_VAR CATEGORY></category>
        <dcterms:modified><TMPL_VAR MDATE_3339></dcterms:modified>
 <TMPL_IF ENCLOSURE>
        <enclosure url="<TMPL_VAR ENCLOSURE>" type="<TMPL_VAR TYPE>" length="<TMPL_VAR LENGTH>" />
-<TMPL_ELSE>
-       <description><TMPL_VAR CONTENT ESCAPE=HTML></description>
 </TMPL_IF>
+<TMPL_UNLESS SIMPLEPODCAST>
+       <description><TMPL_VAR CONTENT ESCAPE=HTML></description>
+</TMPL_UNLESS>
 <TMPL_IF COMMENTSURL>
        <comments><TMPL_VAR COMMENTSURL></comments>
 </TMPL_IF>
index e54094aaa2f1ddbc7e7b1cde73827eca9ad7da89..45265f2654d0c5a1b16156b7e65b49254654faf3 100644 (file)
@@ -5,7 +5,12 @@
 <channel>
 <title><TMPL_VAR TITLE></title>
 <link><TMPL_VAR PAGEURL></link>
+<TMPL_IF COPYRIGHT>
+<copyright><TMPL_VAR COPYRIGHT ESCAPE=HTML></copyright>
+</TMPL_IF>
 <description><TMPL_VAR FEEDDESC ESCAPE=HTML></description>
+<generator>ikiwiki</generator>
+<pubDate><TMPL_VAR FEEDDATE_822></pubDate>
 <TMPL_VAR CONTENT>
 </channel>
 </rss>
diff --git a/templates/trails.tmpl b/templates/trails.tmpl
new file mode 100644 (file)
index 0000000..54c0460
--- /dev/null
@@ -0,0 +1,23 @@
+<TMPL_LOOP TRAILLOOP>
+<TMPL_IF __FIRST__><TMPL_IF HTML5><nav class="trails"><TMPL_ELSE><div class="trails"></TMPL_IF></TMPL_IF>
+<div class="trail">
+<TMPL_IF PREVPAGE>
+<span class="trailprev">
+<span class="trailarrow">←</span>
+<a href="<TMPL_VAR PREVURL>"><TMPL_VAR PREVTITLE></a>
+<span class="trailsep">|</span>
+</span>
+</TMPL_IF>
+<span class="trailup">
+<a href="<TMPL_VAR TRAILURL>"><TMPL_VAR TRAILTITLE></a>
+</span>
+<TMPL_IF NEXTPAGE>
+<span class="trailnext">
+<span class="trailsep">|</span>
+<a href="<TMPL_VAR NEXTURL>"><TMPL_VAR NEXTTITLE></a>
+<span class="trailarrow">→</span>
+</span>
+</TMPL_IF>
+</div>
+<TMPL_IF __LAST__><TMPL_IF HTML5></nav><TMPL_ELSE></div></TMPL_IF></TMPL_IF>
+</TMPL_LOOP>
index 749d9b21e1ca9c1efae9195f04d07242388557e7..d4afc0915b86a44ce2ad20d5d9e574e17abae945 100644 (file)
@@ -76,7 +76,7 @@ body {
        padding: 2px;
 }
 
-#content, #comments, #footer {
+#content, #enclosure, #comments, #footer {
        margin: 1em 2em;
 }
 
@@ -142,3 +142,8 @@ div.recentchanges {
        padding: 0 0 0 2ex;
        border-color: #999;
 }
+
+.pageheader .trails {
+       /* allow space for the action tabs */
+       margin-bottom: 2em;
+}
index c07d1cdfa4b305e8a336575c6c0ac5cc9626fda3..af1434574b537259e4bbf77fee8780788fe18856 100644 (file)
@@ -143,7 +143,7 @@ p,fieldset,table,pre {
  * 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 {
+.page, .pageheader, .sidebar, #content, #enclosure, #comments, .inlinepage, .recentchanges, .pageheader .actions ul, #pagebody {
        border: none;
 }
 
@@ -197,14 +197,15 @@ body {
        font-weight: bold;
 }
 
-.pageheader .header .title, .pageheader .header .parentlinks, .pageheader .actions ul li, .pageheader .header span, .pageheader #otherlanguages ul li {
+.pageheader .header .title, .pageheader .header .parentlinks, .pageheader .actions ul li, .pageheader .header span, .pageheader #otherlanguages ul li, .pageheader .trailprev, .pageheader .trailnext, .pageheader .trailup {
        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, .pageheader #otherlanguages ul li a {
+.pageheader .header span a, .pageheader .actions ul li a, .pageheader .header .parentlinks a, .pageheader #otherlanguages ul li a, .pageheader a, .pageheader .trail a {
+       font-weight: bold;
        color: white;
        text-decoration: none;
 }
@@ -222,7 +223,7 @@ body {
        clear: none;
 }
 
-#content a, #comments a, .sidebar a {
+#content a, #enclosure a, #comments a, .sidebar a {
        color: #315485;
        text-decoration: none;
        font-weight: bold;
@@ -270,7 +271,7 @@ body {
        .pageheader .header span a, .pageheader .actions ul li a, .pageheader .header .parentlinks a {
                color #315485;
        }
-       #content, #comments, #pagebody {
+       #content, #enclosure, #comments, #pagebody {
                margin-right: 0;
                *margin-right: 0;
                border-right: none;
index 9c217c746a065c48ccb080efc263419a375c5bd4..b0e29dfad6e6f7cfdc2849c2a16f214b66a74faa 100644 (file)
@@ -14,10 +14,12 @@ html, body {
        background-color: #f2d98d;
 }
 
-#content a:hover, #comments a:hover, .sidebar a:hover,
-#content a:visited:hover, #comments a:visited:hover, .sidebar a:visited:hover {
+#content a:hover, #enclosure a:hover, #comments a:hover, .sidebar a:hover,
+#content a:visited:hover, #enclosure a:visited:hover, #comments a:visited:hover,
+.sidebar a:visited:hover {
     color: red;
 }
-#content a:visited, #comments a:visited, .sidebar a:visited {
+#content a:visited, #enclosure a:visited, #comments a:visited,
+.sidebar a:visited {
     color: #37485e;
 }
diff --git a/themes/monochrome/gradient.png b/themes/monochrome/gradient.png
new file mode 100644 (file)
index 0000000..7363185
Binary files /dev/null and b/themes/monochrome/gradient.png differ
diff --git a/themes/monochrome/style.css b/themes/monochrome/style.css
new file mode 100644 (file)
index 0000000..bd3fdf5
--- /dev/null
@@ -0,0 +1,57 @@
+/*
+ * monochrome - ikiwiki theme © Jon Dowland 2012
+ * based on ikiwiki style.css and bits from jmtd.net at the time
+ * License: GPL-2+
+ */
+
+@import url(http://fonts.googleapis.com/css?family=Lato&v2);
+
+body {
+       margin-left: auto;
+       margin-right: auto;
+       width: 48em;
+
+       background: url(gradient.png) repeat-x white 0px -16px;
+       margin-top: 48px; /* height of gradient.png that we want to see */
+
+       color: #555;
+       font-family: 'Lato', sans-serif;
+}
+
+.header {
+       margin-bottom: 0.5em;
+}
+.pageheader .actions ul {
+       border-bottom: 2px solid #c00040;
+}
+
+#pageinfo {
+       border-top: 2px solid #c00040;
+       text-align: center;
+       color: #aaa;
+}
+
+/*
+ * css3 external links stuff
+ * thanks to <http://www.kryogenix.org/days/2002/08/30/external>
+ */
+#content a[href^="http:"]:after,
+#content a[href^="https:"]:after,
+#enclosure a[href^="http:"]:after,
+#enclosure a[href^="https:"]:after {
+  content: "↗";
+}
+/* you will want to replicate this for your own domain in local.css */
+#content a[href^="http://localhost"]:after,
+#content a[href^="http://ikiwiki.info"]:after,
+#enclosure a[href^="http://localhost"]:after,
+#enclosure a[href^="http://ikiwiki.info"]:after {
+  content: none;
+}
+
+/* colouring */
+a:link    { color: #c00040; font-weight: bold; text-decoration: none; }
+a:hover   { color: #f01070; text-decoration: underline;}
+a:active  { color: #c00040; }
+a:visited { color: #c08080; font-weight: normal; font-style: italic; }
+hr { border: none; border-top: 2px solid #c00040; clear: both; }
diff --git a/underlays/openid-selector/ikiwiki/openid/aol.png b/underlays/openid-selector/ikiwiki/openid/aol.png
new file mode 100644 (file)
index 0000000..d47f5fa
Binary files /dev/null and b/underlays/openid-selector/ikiwiki/openid/aol.png differ
diff --git a/underlays/openid-selector/ikiwiki/openid/goa-account-flickr.png b/underlays/openid-selector/ikiwiki/openid/goa-account-flickr.png
new file mode 100644 (file)
index 0000000..5321642
Binary files /dev/null and b/underlays/openid-selector/ikiwiki/openid/goa-account-flickr.png differ
diff --git a/underlays/openid-selector/ikiwiki/openid/goa-account-google.png b/underlays/openid-selector/ikiwiki/openid/goa-account-google.png
new file mode 100644 (file)
index 0000000..ae1caa8
Binary files /dev/null and b/underlays/openid-selector/ikiwiki/openid/goa-account-google.png differ
diff --git a/underlays/openid-selector/ikiwiki/openid/goa-account-yahoo.png b/underlays/openid-selector/ikiwiki/openid/goa-account-yahoo.png
new file mode 100644 (file)
index 0000000..51e1c11
Binary files /dev/null and b/underlays/openid-selector/ikiwiki/openid/goa-account-yahoo.png differ
diff --git a/underlays/openid-selector/ikiwiki/openid/livejournal.png b/underlays/openid-selector/ikiwiki/openid/livejournal.png
new file mode 100644 (file)
index 0000000..d86ee5e
Binary files /dev/null and b/underlays/openid-selector/ikiwiki/openid/livejournal.png differ
index 0561103843adb093883c0aa437e4ca25fa36b4b2..0400ae6bbf6d0b6d24146f3b135692b79e3acc56 100644 (file)
@@ -8,12 +8,18 @@ This code is licenced under the New BSD License.
 var providers_large = {
     google: {
         name: 'Google',
-       icon: 'http://google.com/favicon.ico',
+        icon: 'ikiwiki/openid/goa-account-google.png',
         url: 'https://www.google.com/accounts/o8/id'
     },
+    verisign: {
+        name: 'Verisign',
+        icon: 'ikiwiki/openid/verisign.png',
+        label: 'Enter your Verisign username:',
+        url: 'http://{username}.pip.verisignlabs.com/'
+    },
     yahoo: {
         name: 'Yahoo',      
-       icon: 'http://yahoo.com/favicon.ico',
+        icon: 'ikiwiki/openid/goa-account-yahoo.png',
         url: 'http://me.yahoo.com/'
     },    
     openid: {
@@ -26,45 +32,27 @@ var providers_large = {
 var providers_small = {
     livejournal: {
         name: 'LiveJournal',
-       icon: 'http://livejournal.com/favicon.ico',
+        icon: 'ikiwiki/openid/livejournal.png',
         label: 'Enter your Livejournal username:',
         url: 'http://{username}.livejournal.com/'
     },
     flickr: {
        name: 'Flickr',        
-       icon: 'http://flickr.com/favicon.ico',
+       icon: 'ikiwiki/openid/goa-account-flickr.png',
        label: 'Enter your Flickr username:',
        url: 'http://flickr.com/photos/{username}/'
     },
     wordpress: {
         name: 'Wordpress',
-       icon: 'https://s2.wp.com/i/favicon.ico',
+       icon: 'ikiwiki/openid/wordpress.png',
         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',
+        icon: 'ikiwiki/openid/aol.png',
         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);
diff --git a/underlays/openid-selector/ikiwiki/openid/verisign.png b/underlays/openid-selector/ikiwiki/openid/verisign.png
new file mode 100644 (file)
index 0000000..5120812
Binary files /dev/null and b/underlays/openid-selector/ikiwiki/openid/verisign.png differ
diff --git a/underlays/openid-selector/ikiwiki/openid/wordpress.png b/underlays/openid-selector/ikiwiki/openid/wordpress.png
new file mode 100644 (file)
index 0000000..96e08bd
Binary files /dev/null and b/underlays/openid-selector/ikiwiki/openid/wordpress.png differ
index 7994c62fc8ff61bb795391aeae3587d9dac91a35..37e588f7b5bba4c1125052f82c358359a3459705 100644 (file)
@@ -34,34 +34,72 @@ function mapsetup(divname, options) {
                        new OpenLayers.Control.Permalink(permalink)
                ],
                displayProjection: new OpenLayers.Projection("EPSG:4326"),
-               numZoomLevels: 18
+               maxExtent: new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34),
+               projection: "EPSG:900913",
+               units: "m",
+               maxResolution: 156543.0339,
+               numZoomLevels: 19
        });
 
+       for (x in options.layers) {
+               layer = options.layers[x];
+               console.log("setting up layer: " + layer);
+               if (layer.indexOf("Google") >= 0) {
+                       if (options.google_apikey && options.google_apikey != 'null') {
+                               var gtype = G_NORMAL_MAP;
+                               if (layer.indexOf("Satellite") >= 0) {
+                                       gtype = G_SATELLITE_MAP;
+                               } else if (layer.indexOf("Hybrid") >= 0) {
+                                       gtype = G_HYBRID_MAP // the normal map overlaying the satellite photographs
+                               } else if (layer.indexOf("Physical") >= 0) {
+                                       gtype = G_PHYSICAL_MAP // terrain information
+                               }
+                               // this nightmare is possible through http://docs.openlayers.org/library/spherical_mercator.html
+                               googleLayer = new OpenLayers.Layer.Google(
+                                       layer,
+                                       {type: gtype,
+                                        'sphericalMercator': true,
+                                        'maxExtent': new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34),
+                                        projection: new OpenLayers.Projection("EPSG:3857")}
+                               );
+                               map.addLayer(googleLayer);
+                       } else {
+                               console.log("no API key defined for Google layer, skipping");
+                       }
+               } else if (layer == 'OSM') { // OSM default layer
+                       map.addLayer(new OpenLayers.Layer.OSM("OSM (Mapnik)"));
+               } else { // assumed to be a URL
+                       text = layer.match(/([^.\/]*\.[^.\/]*(\/[^\$]*)?)\/.*$/i) // take the first two parts of the FQDN and everything before the first $
+                       map.addLayer(new OpenLayers.Layer.OSM("OSM (" + text[1]  + ")", layer));
+               }
+       }
 
-       map.addLayer(new OpenLayers.Layer.OSM());
        if (options.format == 'CSV') {
                pois = new OpenLayers.Layer.Text( "CSV",
-                       { location:"/" + options.map + "/pois.txt",
-                         projection: map.displayProjection
+                       { location: options.csvurl,
+                         projection: new OpenLayers.Projection("EPSG:4326")
                        });
        } else if (options.format == 'GeoJSON') {
                pois = new OpenLayers.Layer.Vector("GeoJSON", {
                        protocol: new OpenLayers.Protocol.HTTP({
-                               url: "/" + options.map + "/pois.json",
+                               url: options.jsonurl,
                                format: new OpenLayers.Format.GeoJSON()
                        }),
-                       strategies: [new OpenLayers.Strategy.Fixed()]
+                       strategies: [new OpenLayers.Strategy.Fixed()],
+                       projection: new OpenLayers.Projection("EPSG:4326")
                });
        } else {
                pois = new OpenLayers.Layer.Vector("KML", {
                        protocol: new OpenLayers.Protocol.HTTP({
-                               url: "/" + options.map + "/pois.kml",
+                               url: options.kmlurl,
                                format: new OpenLayers.Format.KML({
                                        extractStyles: true,
                                        extractAttributes: true
                                })
                        }),
-               strategies: [new OpenLayers.Strategy.Fixed()]});
+                       strategies: [new OpenLayers.Strategy.Fixed()],
+                       projection: new OpenLayers.Projection("EPSG:4326")
+                });
        }
        map.addLayer(pois);
        select = new OpenLayers.Control.SelectFeature(pois);
@@ -98,7 +136,7 @@ function mapsetup(divname, options) {
 
        if (options.fullscreen) {
                map.addControl(new OpenLayers.Control.PanZoomBar());
-               map.addControl(new OpenLayers.Control.LayerSwitcher({'ascending':false}));
+               map.addControl(new OpenLayers.Control.LayerSwitcher());
                map.addControl(new OpenLayers.Control.MousePosition());
                map.addControl(new OpenLayers.Control.KeyboardDefaults());
        } else {