Convert postprocessordirectives into preprocessordirectives, so they are
authorjoey <joey@0fa5a96a-9a0e-0410-b3b2-a0fd24251071>
Tue, 4 Apr 2006 20:57:46 +0000 (20:57 +0000)
committerjoey <joey@0fa5a96a-9a0e-0410-b3b2-a0fd24251071>
Tue, 4 Apr 2006 20:57:46 +0000 (20:57 +0000)
expanded before markdown. Consequences:

 - No need to worry about markdown messing with parameters of
   preprocessordirectives. (If you had to escape stuff in one before, you'll
   need to undo that escaping now.)
 - No need for ugly </p> hacks before inlined subpages. Instead, subpages
   are wrapped in a <div>, and this prevents markdown from touching them.
   (This can also be used to add style to subpages.)
 - rss generation is less of a hack.

IkiWiki/Render.pm
basewiki/postprocessordirective.mdwn [deleted file]
basewiki/preprocessordirective.mdwn [new file with mode: 0644]
doc/bugs.mdwn
doc/todo/done/htmlvalidation.mdwn [new file with mode: 0644]
doc/todo/html.mdwn
doc/todo/utf8.mdwn
templates/inlinepage.tmpl

index de35d24e1566c44e16de3944a4cb4d7423767c27..7148d754ec54e21524f4700efa43fe243678ef67 100644 (file)
@@ -86,12 +86,11 @@ sub rsspage ($) { #{{{
        return $page.".rss";
 } #}}}
 
-sub postprocess { #{{{
-       # Takes content to postprocess followed by a list of postprocessor
-       # commands and subroutine references to run for the commands.
+sub preprocess ($$) { #{{{
        my $page=shift;
        my $content=shift;
-       my %commands=@_;
+
+       my %commands=(inline => \&preprocess_inline);
        
        my $handle=sub {
                my $escape=shift;
@@ -146,7 +145,7 @@ sub get_inline_content ($$) { #{{{
        }
 } #}}}
 
-sub postprocess_html_inline { #{{{
+sub preprocess_inline ($@) { #{{{
        my $parentpage=shift;
        my %params=@_;
        
@@ -160,7 +159,7 @@ sub postprocess_html_inline { #{{{
                $params{show}=10;
        }
        $inlinepages{$parentpage}=$params{pages};
-       
+
        my $ret="";
        
        if (exists $params{rootpage}) {
@@ -177,8 +176,10 @@ sub postprocess_html_inline { #{{{
                                ? "$config{templatedir}/inlinepage.tmpl"
                                : "$config{templatedir}/inlinepagetitle.tmpl"));
        
+       my @pages;
        foreach my $page (blog_list($params{pages}, $params{show})) {
                next if $page eq $parentpage;
+               push @pages, $page;
                $template->param(pagelink => htmllink($parentpage, $page));
                $template->param(content => get_inline_content($parentpage, $page))
                        if $params{archive} eq "no";
@@ -186,7 +187,15 @@ sub postprocess_html_inline { #{{{
                $ret.=$template->output;
        }
        
-       return "</p>$ret<p>";
+       # TODO: should really add this to renderedfiles and call
+       # check_overwrite, but currently renderedfiles
+       # only supports listing one file per page.
+       if ($config{rss}) {
+               writefile(rsspage($parentpage), $config{destdir},
+                       genrss($parentpage, @pages));
+       }
+       
+       return $ret;
 } #}}}
 
 sub genpage ($$$) { #{{{
@@ -194,8 +203,6 @@ sub genpage ($$$) { #{{{
        my $page=shift;
        my $mtime=shift;
 
-       $content = postprocess($page, $content, inline => \&postprocess_html_inline);
-       
        my $title=pagetitle(basename($page));
        
        my $template=HTML::Template->new(blind_cache => 1,
@@ -255,10 +262,9 @@ sub absolute_urls ($$) { #{{{
        return $content;
 } #}}}
 
-sub genrss ($$$) { #{{{
-       my $content=shift;
+sub genrss ($@) { #{{{
        my $page=shift;
-       my $mtime=shift;
+       my @pages=@_;
        
        my $url="$config{url}/".htmlpage($page);
        
@@ -266,33 +272,14 @@ sub genrss ($$$) { #{{{
                filename => "$config{templatedir}/rsspage.tmpl");
        
        my @items;
-       my $isblog=0;
-       my $gen_blog=sub {
-               my $parentpage=shift;
-               my %params=@_;
-               
-               if (! exists $params{show}) {
-                       $params{show}=10;
-               }
-               if (! exists $params{pages}) {
-                       return "";
-               }
-               
-               $isblog=1;
-               foreach my $page (blog_list($params{pages}, $params{show})) {
-                       next if $page eq $parentpage;
-                       push @items, {
-                               itemtitle => pagetitle(basename($page)),
-                               itemurl => "$config{url}/$renderedfiles{$page}",
-                               itempubdate => date_822($pagectime{$page}),
-                               itemcontent => absolute_urls(get_inline_content($parentpage, $page), $url),
-                       } if exists $renderedfiles{$page};
-               }
-               
-               return "";
-       };
-       
-       $content = postprocess($page, $content, inline => $gen_blog);
+       foreach my $p (@pages) {
+               push @items, {
+                       itemtitle => pagetitle(basename($p)),
+                       itemurl => "$config{url}/$renderedfiles{$p}",
+                       itempubdate => date_822($pagectime{$p}),
+                       itemcontent => absolute_urls(get_inline_content($page, $p), $url),
+               } if exists $renderedfiles{$p};
+       }
 
        $template->param(
                title => $config{wikiname},
@@ -349,6 +336,7 @@ sub render ($) { #{{{
                delete $inlinepages{$page};
                
                $content=linkify($content, $page);
+               $content=preprocess($page, $content);
                $content=htmlize($type, $content);
                
                check_overwrite("$config{destdir}/".htmlpage($page), $page);
@@ -356,14 +344,6 @@ sub render ($) { #{{{
                        genpage($content, $page, mtime($srcfile)));
                $oldpagemtime{$page}=time;
                $renderedfiles{$page}=htmlpage($page);
-
-               # TODO: should really add this to renderedfiles and call
-               # check_overwrite, as above, but currently renderedfiles
-               # only supports listing one file per page.
-               if ($config{rss} && exists $inlinepages{$page}) {
-                       writefile(rsspage($page), $config{destdir},
-                               genrss($content, $page, mtime($srcfile)));
-               }
        }
        else {
                my $content=readfile($srcfile, 1);
diff --git a/basewiki/postprocessordirective.mdwn b/basewiki/postprocessordirective.mdwn
deleted file mode 100644 (file)
index fa8432e..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-Postprocessor directives are similar to a [[WikiLink]] in form, except they
-contain spaces and parameters. The general form is:
-
-\\[[directive param="value" param="value"]]
-
-This gets expanded after the rest of the page is processed, and can be used
-to transform the page in various ways.
-
-Currently, these postprocessor directives are available:
-
-* "inline" to make a [[blog]]
diff --git a/basewiki/preprocessordirective.mdwn b/basewiki/preprocessordirective.mdwn
new file mode 100644 (file)
index 0000000..a7d1be8
--- /dev/null
@@ -0,0 +1,11 @@
+Preprocessor directives are similar to a [[WikiLink]] in form, except they
+contain spaces and parameters. The general form is:
+
+\\[[directive param="value" param="value"]]
+
+This gets expanded before the rest of the page is processed, and can be used
+to transform the page in various ways.
+
+Currently, these preprocessor directives are available:
+
+* "inline" to make a [[blog]]
index 06cfc976e3edba6883650f3bb84be8d68ce47a0b..bf4ffb53c301a3f2f955f4a43a298dbb111c2850 100644 (file)
@@ -31,8 +31,5 @@
 * If a file in the srcdir is removed, exposing a file in the underlaydir,
   ikiwiki will not notice the change and rebuild it until the file in the
   underlaydir gets a mtime newer than the mtime the removed file had.
-* Markdown will try to expand stuff inside postprocessordirectives. For
-  example, if there are two *'s, it will turn them to html em's, which
-  breaks things unexpectedly and requires escaping.
 * 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
diff --git a/doc/todo/done/htmlvalidation.mdwn b/doc/todo/done/htmlvalidation.mdwn
new file mode 100644 (file)
index 0000000..6b8d0e7
--- /dev/null
@@ -0,0 +1,45 @@
+  * Doctype is XHTML 1.0 Strict
+       
+       One consideration of course is that regular users might embed html
+       that uses deprecated presentational elements like &lt;center&gt;. At
+        least firefox seems to handle that mixture ok. 
+       --[[Joey]]
+
+  * [ [inlinepage] ] gets wrapped in &lt;p&gt;...&lt;/p&gt; which has a high chance of invalidating the page.
+
+       Since markdown does this, the only way I can think to fix it is to
+       make the inlined page text start with &lt;/p&gt; and end with
+       &lt;p&gt;. Ugly, and of course there could be problems with
+       markdown enclosing it in other spanning tags in some cases.
+       I've implemented this hack now. :-/ --[[Joey]]
+
+       I used this 'hack' myself, but yesterday I came up with a better idea:  
+           &lt;div class="inlinepage"&gt;  
+           [ [inlinepage] ]  
+           &lt;/div&gt;  
+       This prevents markdown enclosing and even adds a useful css identifier. Problem is that this should be added to every page and not in the template(s). --[[JeroenSchot]]
+
+       I can make ikiwiki add that around every inlined page easily
+       enough. However, where is it documented? Came up dry on google.
+       --[[Joey]]
+
+       From <http://daringfireball.net/projects/markdown/syntax#html>:
+       > The only restrictions are that block-level HTML elements e.g. &lt;div&gt;, &lt;table&gt;, &lt;pre&gt;, &lt;p&gt;, etc. must be separated from surrounding content by blank lines, and the start and end tags of the block should not be indented with tabs or spaces. Markdown is smart enough not to add extra (unwanted) &lt;p&gt; tags around HTML block-level tags. [snip]
+       > Note that Markdown formatting syntax is not processed within
+       > block-level HTML tags. E.g., you can't use Markdown-style \*emphasis\* inside an HTML block.
+
+       Because [ [inlinepage] ] isn't separated by a blank line it gets treated as a block-level element. Hmm, will this stop all formatting, including *'s to em-tags? --[[JeroenSchot]]
+
+    Ah didn't realize you meant it fixed it at the markdown level. I'll
+    think about making [[postprocessordirective]]s into
+    [[preprocessordirective]]s instead, then I could use that fix (but I'm not
+    sure how feasible it is to do that). --[[Joey]]
+
+    Done.. inlining is now a preprocessor directive, happens before
+    markdown, and the inlinepage template uses div as suggested, this does
+    prevent markdown from doing any annoying escaping of the preprocessor
+    directives, as well as preventing it wrapping subpages in &lt;p&gt;.
+    --[[Joey]]
+
+This page is now valid.
+Test: [validate this page](http://validator.w3.org/check?url=referer)
index 9f5dc836e67bfc701e6e22a95c7f5a97d0047ece..51f669a13c7d086fefd0d5c922ddf92a1d39e230 100644 (file)
@@ -3,44 +3,3 @@ formatting, and images to indicate web vs svn commits and to link to diffs.
 
 All of this should be doable w/o touching a single line of code, just
 editing the [[templates]] and/or editing [[style.css]] BTW.
-
-## html validation
-
-  * Doctype is XHTML 1.0 Strict
-       
-       One consideration of course is that regular users might embed html
-       that uses deprecated presentational elements like &lt;center&gt;. At
-        least firefox seems to handle that mixture ok. 
-       --[[Joey]]
-
-  * [ [inlinepage] ] gets wrapped in &lt;p&gt;...&lt;/p&gt; which has a high chance of invalidating the page.
-
-       Since markdown does this, the only way I can think to fix it is to
-       make the inlined page text start with &lt;/p&gt; and end with
-       &lt;p&gt;. Ugly, and of course there could be problems with
-       markdown enclosing it in other spanning tags in some cases.
-       I've implemented this hack now. :-/ --[[Joey]]
-
-       I used this 'hack' myself, but yesterday I came up with a better idea:  
-           &lt;div class="inlinepage"&gt;  
-           [ [inlinepage] ]  
-           &lt;/div&gt;  
-       This prevents markdown enclosing and even adds a useful css identifier. Problem is that this should be added to every page and not in the template(s). --[[JeroenSchot]]
-
-       I can make ikiwiki add that around every inlined page easily
-       enough. However, where is it documented? Came up dry on google.
-       --[[Joey]]
-
-       From <http://daringfireball.net/projects/markdown/syntax#html>:
-       > The only restrictions are that block-level HTML elements \97 e.g. &lt;div&gt;, &lt;table&gt;, &lt;pre&gt;, &lt;p&gt;, etc. \97 must be separated from surrounding content by blank lines, and the start and end tags of the block should not be indented with tabs or spaces. Markdown is smart enough not to add extra (unwanted) &lt;p&gt; tags around HTML block-level tags. [snip]
-       > Note that Markdown formatting syntax is not processed within block-level HTML tags. E.g., you can\92t use Markdown-style \*emphasis\* inside an HTML block.
-
-       Because [ [inlinepage] ] isn't separated by a blank line it gets treated as a block-level element. Hmm, will this stop all formatting, including *'s to em-tags? --[[JeroenSchot]]
-
-    Ah didn't realize you meant it fixed it at the markdown level. I'll
-    think about making [[postprocessordirective]]s into
-    preprocessordirectives instead, then I could use that fix (but I'm not
-    sure how feasible it is to do that). --[[Joey]]
-
-This page is now valid.
-Test: [validate this page](http://validator.w3.org/check?url=referer)
index 536ec75b27e3acf9582c8cf57dc64e2dc254fd6d..822177487cb92a19111f19754ff06cac8ce7a07e 100644 (file)
@@ -23,5 +23,3 @@ The following problems have been observed when running ikiwiki this way:
 
   In this example, a literal 0x97 character had gotten into a markdown
   file. 
-  
-  Here, let's put one in this file: "\97"
index 38834c0b2502acd8888887d8d57888c5038f74d8..397ac860c218a4979b7ad7d1ad1426981049c1d9 100644 (file)
@@ -1,3 +1,4 @@
+<div class="inlinepage">
 <h1><TMPL_VAR PAGELINK></h1>
 
 <TMPL_VAR CONTENT>
@@ -5,3 +6,4 @@
 <p>
 <i>(posted <TMPL_VAR CTIME>)</i>
 </p>
+</div>