* Reorganised the doc wiki's todo/* pages, using a link/tag to flag
authorjoey <joey@0fa5a96a-9a0e-0410-b3b2-a0fd24251071>
Fri, 2 Jun 2006 04:49:12 +0000 (04:49 +0000)
committerjoey <joey@0fa5a96a-9a0e-0410-b3b2-a0fd24251071>
Fri, 2 Jun 2006 04:49:12 +0000 (04:49 +0000)
* Allow pagetemplate plugins to override *anything* in the template.
* Add a meta plugin, which allows specifying various metadata about pages,
  like license and author. It also allows for inserting html link and meta
  tags into html, overriding the title, and adding hidden WikiLinks, which
  can be useful when using link-based globbing for page categorisation.
* Remove preprocessor directives from inlined pages.
* Allow simple preprocessor directive values to be specified w/o quotes.

16 files changed:
IkiWiki/Plugin/inline.pm
IkiWiki/Plugin/meta.pm [new file with mode: 0644]
IkiWiki/Render.pm
Makefile.PL
debian/changelog
doc/bugs.mdwn
doc/features.mdwn
doc/plugins/meta.mdwn [new file with mode: 0644]
doc/plugins/write.mdwn
doc/roadmap.mdwn
doc/tags.mdwn [new file with mode: 0644]
doc/todo/blogging.mdwn
doc/todo/lists.mdwn
doc/todo/metadata.mdwn
doc/todo/pluggablerenderers.mdwn
templates/page.tmpl

index 6ecdf0d38989bc34e503607ed493520a83373dc5..b22109a9399bda180f76dda38f245a614d699d33 100644 (file)
@@ -100,7 +100,7 @@ sub get_inline_content ($$) { #{{{
        my $file=$pagesources{$page};
        my $type=pagetype($file);
        if ($type ne 'unknown') {
-               return htmlize($type, linkify($page, $parentpage, readfile(srcfile($file))));
+               return htmlize($type, preprocess($page, linkify($page, $parentpage, readfile(srcfile($file))), 1));
        }
        else {
                return "";
diff --git a/IkiWiki/Plugin/meta.pm b/IkiWiki/Plugin/meta.pm
new file mode 100644 (file)
index 0000000..8244cf7
--- /dev/null
@@ -0,0 +1,61 @@
+#!/usr/bin/perl
+# Ikiwiki metadata plugin.
+package IkiWiki::Plugin::meta;
+
+use warnings;
+use strict;
+use IkiWiki;
+
+my %meta;
+my %title;
+
+sub import { #{{{
+       IkiWiki::hook(type => "preprocess", id => "meta", 
+               call => \&preprocess);
+       IkiWiki::hook(type => "pagetemplate", id => "meta", 
+               call => \&pagetemplate);
+} # }}}
+
+sub preprocess (@) { #{{{
+       if (! @_) {
+               return "";
+       }
+       my %params=@_;
+       my $key=shift;
+       my $value=$params{$key};
+       delete $params{$key};
+       my $page=$params{page};
+       delete $params{page};
+
+       if ($key eq 'link') {
+               if (%params) {
+                       $meta{$page}='' unless exists $meta{$page};
+                       $meta{$page}.="<link href=\"$value\" ".
+                               join(" ", map { "$_=\"$params{$_}\"" } keys %params).
+                               " />\n";
+               }
+               else {
+                       # hidden WikiLink
+                       push @{$IkiWiki::links{$page}}, $value;
+               }
+       }
+       elsif ($key eq 'title') {
+               $title{$page}=$value;
+       }
+       else {
+               $meta{$page}='' unless exists $meta{$page};
+               $meta{$page}.="<meta name=\"$key\" content=\"$value\" />\n";
+       }
+
+       return "";
+} # }}}
+
+sub pagetemplate ($$) { #{{{
+        my $page=shift;
+        my $template=shift;
+
+       $template->param(meta => $meta{$page}) if exists $meta{$page};
+       $template->param(title => $title{$page}) if exists $title{$page};
+} # }}}
+
+1
index 886a30f6b7eb587be217ca215748fbe70dec0ecc..0dfa03cd4229f040ef17ae66579f1d3c4ca5ec35 100644 (file)
@@ -95,9 +95,10 @@ sub parentlinks ($) { #{{{
        return @ret;
 } #}}}
 
-sub preprocess ($$) { #{{{
+sub preprocess ($$;$) { #{{{
        my $page=shift;
        my $content=shift;
+       my $onlystrip=shift || 0; # strip directives without processing
 
        my $handle=sub {
                my $escape=shift;
@@ -106,12 +107,17 @@ sub preprocess ($$) { #{{{
                if (length $escape) {
                        return "[[$command $params]]";
                }
+               elsif ($onlystrip) {
+                       return "";
+               }
                elsif (exists $hooks{preprocess}{$command}) {
-                       my %params;
-                       while ($params =~ /(\w+)=\"([^"]+)"(\s+|$)/g) {
-                               $params{$1}=$2;
+                       # Note: preserve order of params, some plugins may
+                       # consider it significant.
+                       my @params;
+                       while ($params =~ /(\w+)=\"?([^"]+)"?(\s+|$)/g) {
+                               push @params, $1, $2;
                        }
-                       return $hooks{preprocess}{$command}{call}->(page => $page, %params);
+                       return $hooks{preprocess}{$command}{call}->(@params, page => $page);
                }
                else {
                        return "[[$command not processed]]";
@@ -190,12 +196,6 @@ sub genpage ($$$) { #{{{
                $template->param(have_actions => 1);
        }
 
-       if (exists $hooks{pagetemplate}) {
-               foreach my $id (keys %{$hooks{pagetemplate}}) {
-                       $hooks{pagetemplate}{$id}{call}->($page, $template);
-               }
-       }
-
        $template->param(
                title => $title,
                wikiname => $config{wikiname},
@@ -205,6 +205,12 @@ sub genpage ($$$) { #{{{
                mtime => displaytime($mtime),
                styleurl => styleurl($page),
        );
+
+       if (exists $hooks{pagetemplate}) {
+               foreach my $id (keys %{$hooks{pagetemplate}}) {
+                       $hooks{pagetemplate}{$id}{call}->($page, $template);
+               }
+       }
        
        return $template->output;
 } #}}}
index b20070869fe8f26f7b0e277196dd6795dc139259..89a8f32323703092a78a4617feaf95238357e152 100755 (executable)
@@ -16,7 +16,7 @@ extra_build:
                --wikiname="ikiwiki" --verbose --no-rcs \
                --exclude=/discussion --no-discussion \
                --plugin=brokenlinks --plugin=pagecount \
-               --plugin=orphans --plugin=haiku
+               --plugin=orphans --plugin=haiku --plugin=meta
        ./mdwn2man ikiwiki 1 doc/usage.mdwn > ikiwiki.man
        ./mdwn2man ikiwiki-mass-rebuild 8 doc/ikiwiki-mass-rebuild.mdwn > ikiwiki-mass-rebuild.man
                
index 31932d857194d1b38cc5f63da6626b40da065b4c..e60eb9a3e4eb7e55fcc5f1ed36ea2c944a74029b 100644 (file)
@@ -13,11 +13,18 @@ ikiwiki (1.5) UNRELEASED; urgency=low
       pages that link to my home page in the wiki"
     - Locking any pages that are linked to from a particular page, so that
       lists of locks can be exposed in the wiki.
-  * Reorganised the doc wiki's todo/* pages, using a [[done]] tag to flag
+  * Reorganised the doc wiki's todo/* pages, using a link/tag to flag
     when a todo item is done, instead of the previous moving it to a different
     subdir.
-
- -- Joey Hess <joeyh@debian.org>  Thu,  1 Jun 2006 21:30:03 -0400
+  * Allow pagetemplate plugins to override *anything* in the template.
+  * Add a meta plugin, which allows specifying various metadata about pages,
+    like license and author. It also allows for inserting html link and meta
+    tags into html, overriding the title, and adding hidden WikiLinks, which
+    can be useful when using link-based globbing for page categorisation.
+  * Remove preprocessor directives from inlined pages.
+  * Allow simple preprocessor directive values to be specified w/o quotes.
+
+ -- Joey Hess <joeyh@debian.org>  Thu,  1 Jun 2006 23:47:43 -0400
 
 ikiwiki (1.4) unstable; urgency=low
 
index c646242aaa96a20fca4b454d1472fa9cdffaf6ac..3bcd1998ad14d648fb60fe71269e1c0ccad4c576 100644 (file)
@@ -30,6 +30,5 @@
   underlaydir gets a mtime newer than the mtime the removed file had.
 * ikiwiki will generate html formatted error messages to the command
   line if --cgi is set, even if it's not yet running as a cgi
-* if a page containing an rss feed happens to show up in an rss feed,
-  the preprocessor directives won't be expanded (good) but are left in
-  raw rather than removed (bad).
+* The meta plugin doesn't affect a page if it's being inlined. Probably
+  setting the title with it should override the title of the blog post.
index ac5dc03752049dcab125b8839b11b68928985eae..30fe5987bb8cb3e53f19685ab64886cc00289dbc 100644 (file)
@@ -35,7 +35,7 @@ Some of ikiwiki's features:
 
   Arbitrarily deep hierarchies of pages with fairly simple and useful [[SubPage/LinkingRules]]
 
-* [[blog]]s
+* [[blogging|blog]]
 
   You can turn any page in the wiki into a [[blog]]. Pages matching a
   specified [[GlobList]] will be displayed as a weblog within the blog
@@ -44,7 +44,9 @@ Some of ikiwiki's features:
   Ikiwiki's own [[TODO]], [[news]], and [[plugins]] pages are good examples
   of some of the flexible ways that this can be used.
 
-  Note that this also includes support for tag-based blogging.
+* [[tags]]
+
+  You can tag pages and use these tags in various ways.
 
 * Fast compiler
 
diff --git a/doc/plugins/meta.mdwn b/doc/plugins/meta.mdwn
new file mode 100644 (file)
index 0000000..371713a
--- /dev/null
@@ -0,0 +1,45 @@
+This plugin allows inserting arbitrary metadata into the source of a page.
+Enter the metadata as follows:
+
+       \\[[meta field="value"]]
+       \\[[meta field="value" param="value" param="value"]]
+
+The first form sets a given field to a given value, while the second form
+also specifies some additional sub-parameters.
+
+You can use any field names you like, but here are some predefined ones:
+
+* link
+
+  Specifies a link to another page. This is used to generate a html
+  &lt;link&gt; tag, and also as a way to make the wiki treat one page as
+  linking to another without displaying a user-visible link. The latter 
+  can be useful when using links to categorise pages. A html link tag
+  would look like this:
+
+       \\[[meta link="foo.css" rel="stylesheet" type="text/css"]]
+
+  A non-user-visible [[WikiLink]] would instead look like this:
+
+       \\[[meta link=otherpage]]
+
+* title
+
+  Overrides the title of the page, which is generally the same as the
+  page name.
+
+* license
+
+  Specifies a copyright license for the page, for example, "GPL".
+
+* author
+
+  Specifies the author of a page.
+
+If the field is not treated specially (as the link and title fields are),
+the metadata will be written to the generated html page as a &lt;meta&gt;
+header.
+
+This plugin is not enabled by default. If it is enabled, the title of this
+page will say it is.
+[[meta title="meta plugin (enabled)"]]
index 245f7c9ee8dad10063c050bb90d416d1927bcc3c..b2b7c6ff806ec762aa035a0df89aa2e9d654bc25 100644 (file)
@@ -35,10 +35,12 @@ This is probably the most common use of a plugin.
 Replace "foo" with the command name that will be used inside brackers for
 the preprocessor directive.
 
-Each time the directive is processed, the referenced function (`preprocess` in the example above) is called, and is passed named parameters. A
-"page" parameter gives the name of the page that embedded the preprocessor directive. All parameters included in the directive are included
-as named parameters as well. Whatever the function returns goes onto the
-page in place of the directive.
+Each time the directive is processed, the referenced function (`preprocess`
+in the example above) is called, and is passed named parameters. A "page"
+parameter gives the name of the page that embedded the preprocessor
+directive. All parameters included in the directive are included as named
+parameters as well. Whatever the function returns goes onto the page in
+place of the directive.
 
 ## Error handing
 
index 8e9c5b4622f4960454c3c8fee40f46d3ef5fbbd5..eef5bd755300d42b7eec39f819e81680d3db3e8f 100644 (file)
@@ -14,8 +14,10 @@ Released 29 April 2006.
 * Unit test suite (with tests of at least core stuff like
   [[GlobList]]).
 * [[Plugins]] 
+* [[Tags]]
 * Should have fully working [[todo/done/utf8]] support.
 * [[Optimised_rendering|todo/optimisations]] if possible. Deal with other scalability issues.
 * improved [[todo/html]] stylesheets and templates
 * A version of the logo in a different font, possibly with the dots on the i's highlighted in some other color.
 * Support for at least one RCS aside from svn. Once it supports two, it should quickly grow to support them all.. See [[about_rcs_backends]]
+* Support for one other markup language, probably restructured text.
diff --git a/doc/tags.mdwn b/doc/tags.mdwn
new file mode 100644 (file)
index 0000000..fd2315f
--- /dev/null
@@ -0,0 +1,18 @@
+While ikiwiki supports hierarchically categorising pages by creating
+[[SubPage]]s, that's often not flexible enough, and it can also be useful
+to tag pages in various non-hierarchical ways.
+
+Since this is a wiki, tagging is just a form of linking. For example, since
+this page links to [[features]], it can be considered to have something to
+do with ikiwiki's features. If you want to put pages into a category, the
+typical wiki way to do so is to create a "CategoryFoo" page and link pages
+in the category to it. That is just another form of tagging.
+
+Sometimes you may want to tag a page without putting a visible link on it.
+The [[meta_plugin|plugins/meta]] allows you to do so, like this:
+
+       \\[[meta link=mytag]]
+
+One way to use these tags is to create a [[blog]] of pages that have a
+particular set of tags. [[Plugins]] can be written to do anything else with
+tags that you might desire.
index 680570d848d4136bec418a89a375eeca2118d178..a5e7762567974ba3e55c26699d5c01cddf5694da 100644 (file)
@@ -1,5 +1,5 @@
-- Should probably add params to control various rss fields like the blog
-  title, its author email, its copyright info, etc. 
+- Blog title, author email, copyright info and anything else supported by
+  rss should be able to be specified using the meta plugin.
 - The [[TODO]] page would work better if the first N were shown in full, 
   and then all open items were shown in summary. Maybe add this mode.
 - Add Discussion and Edit links at the bottom of each inlined post.
index 9330124936403aa3e794b428853e8ab312baaa33..912666cd73cddf9c46f20d874d9ad6a09cd85428 100644 (file)
@@ -1,8 +1,3 @@
 * list of all missing pages
 
-  done
-
-* list of registered users, with the names being links to any userpages.
-
-  Might be a plugin, but how to let the wiki know that the page
-  needs an update whever a new user is added?
+  [[done]]
index 044e65abefb556e28a8d4374be29f7647cb0b2f3..c647c0cffb99f500b7b6d3d7f868f70891b5bb36 100644 (file)
@@ -9,3 +9,9 @@ Uses for this include:
 * Any metadata that's generally useful on html pages.
 * Maybe as an alternate way to tag a page, like linking to the tag,
   except it doesn't have to show up in the page text.
+* Recording page licenses.
+
+[[meta link=done]]
+[[meta title="supporting metadata..."]]
+[[meta author="Joey Hess"]]
+[[meta link="foo.css" rel="stylesheet" type="text/css"]]
index bbf28c305f1b8d270f69024af0f63a01f4de2153..3b7e9ffc711dacde86dabd967cb2b9373951617e 100644 (file)
@@ -1,14 +1 @@
-I'm considering a configurable rendering pipeline for each supported
-filename extension. So for ".mdwn" files, it would send the content through
-linkify, markdown, and finalize, while for ".wiki" files it might send it
-through just a wiki formatter and finalize.
-
-This would allow not only supporting more types of markup, but changing
-what style of [[WikiLink]]s are supported, maybe some people want to add
-[[CamelCase]] for example, or don't like the [[SubPage/LinkingRules]].
-
-There also needs to be a step before finalize, where stuff like lists of pages
-that linked back to it could be added to the page. However, doing linkbacks
-also needs to tie into the main logic, to determine what pages need to be
-renered, so maybe that won't be a plugin.
-
+Should be able to plug in support for rst or other markup formats.
index c2430f044a46f3ab73cb1bc8bd21eb5a3d70b04c..ce92ab38ac6d97434a4edadb9794636432695fcb 100644 (file)
@@ -5,6 +5,9 @@
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 <title><TMPL_VAR TITLE></title>
 <link rel="stylesheet" href="<TMPL_VAR STYLEURL>" type="text/css" />
+<TMPL_IF NAME="META">
+<TMPL_VAR META>
+</TMPL_IF>
 </head>
 <body>