Since some preprocessor directives insert raw HTML, it would be good to specify, per-format, how to pass HTML so that it goes through the format OK. With Markdown we cross our fingers; with reST we use the "raw" directive. I added an extra named parameter to the htmlize hook, which feels sort of wrong, since none of the other hooks take parameters. Let me know what you think. --Ethan Seems fairly reasonable, actually. Shouldn't the `$type` come from `$page` instead of `$destpage` though? Only other obvious change is to make the escape parameter optional, and only call it if set. --[[Joey]] > I couldn't figure out what to make it from, but thinking it through, > yeah, it should be $page. Revised patch follows. --Ethan >> I've updated the patch some more, but I think it's incomplete. ikiwiki >> emits raw html when expanding WikiLinks too, and it would need to escape >> those. Assuming that escaping html embedded in the middle of a sentence >> works.. --[[Joey]]
Index: debian/changelog
===================================================================
--- debian/changelog	(revision 3158)
+++ debian/changelog	(working copy)
@@ -44,8 +44,11 @@
   * Fix smiley plugin to scan smileys.mdwn after it's updated, which fixes
     a bug caused by committing changes to smilies.mdwn.
   * Fix display of escaped wikilinks containing anchors.
+  * Based on a patch by Ethan, add a new htmlescape hook, that is called
+    when a preprocssor directive emits inline html. The rst plugin uses this
+    hook to support inlined raw html.
 
- -- Joey Hess   Fri, 06 Apr 2007 17:17:52 -0400
+ -- Joey Hess   Fri, 06 Apr 2007 19:19:08 -0400
 
 ikiwiki (1.48) unstable; urgency=low
 
Index: IkiWiki/Plugin/rst.pm
===================================================================
--- IkiWiki/Plugin/rst.pm	(revision 3157)
+++ IkiWiki/Plugin/rst.pm	(working copy)
@@ -30,15 +30,22 @@
 html = publish_string(stdin.read(), writer_name='html', 
        settings_overrides = { 'halt_level': 6, 
                               'file_insertion_enabled': 0,
-                              'raw_enabled': 0 }
+                              'raw_enabled': 1 }
 );
 print html[html.find('')+6:html.find('')].strip();
 ";
 
 sub import { #{{{
 	hook(type => "htmlize", id => "rst", call => \&htmlize);
+	hook(type => "htmlescape", id => "rst", call => \&htmlecape);
 } # }}}
 
+sub htmlescape ($) { #{{{
+	my $html=shift;
+	$html=~s/^/  /mg;
+	return ".. raw:: html\n\n".$html;
+} # }}}
+
 sub htmlize (@) { #{{{
 	my %params=@_;
 	my $content=$params{content};
Index: doc/plugins/write.mdwn
===================================================================
--- doc/plugins/write.mdwn	(revision 3157)
+++ doc/plugins/write.mdwn	(working copy)
@@ -121,6 +121,16 @@
 The function is passed named parameters: "page" and "content" and should
 return the htmlized content.
 
+### htmlescape
+
+	hook(type => "htmlescape", id => "ext", call => \&htmlescape);
+
+Some markup languages do not allow raw html to be mixed in with the markup
+language, and need it to be escaped in some way. This hook is a companion
+to the htmlize hook, and is called when ikiwiki detects that a preprocessor
+directive is inserting raw html. It is passed the chunk of html in
+question, and should return the escaped chunk.
+
 ### pagetemplate
 
 	hook(type => "pagetemplate", id => "foo", call => \&pagetemplate);
Index: doc/plugins/rst.mdwn
===================================================================
--- doc/plugins/rst.mdwn	(revision 3157)
+++ doc/plugins/rst.mdwn	(working copy)
@@ -10,10 +10,8 @@
 Note that this plugin does not interoperate very well with the rest of
 ikiwiki. Limitations include:
 
-* reStructuredText does not allow raw html to be inserted into
-  documents, but ikiwiki does so in many cases, including
-  [[WikiLinks|WikiLink]] and many
-  [[PreprocessorDirectives|PreprocessorDirective]].
+* Some bits of ikiwiki may still assume that markdown is used or embed html
+  in ways that break reStructuredText. (Report bugs if you find any.)
 * It's slow; it forks a copy of python for each page. While there is a
   perl version of the reStructuredText processor, it is not being kept in
   sync with the standard version, so is not used.
Index: IkiWiki.pm
===================================================================
--- IkiWiki.pm	(revision 3158)
+++ IkiWiki.pm	(working copy)
@@ -550,11 +550,11 @@
 	$content =~ s{(\\?)$config{wiki_link_regexp}}{
 		defined $2
 			? ( $1 
-				? "[[$2|$3".(length $4 ? "#$4" : "")."]]" 
+				? "[[$2|$3".($4 ? "#$4" : "")."]]" 
 				: htmllink($lpage, $page, linkpage($3),
 					anchor => $4, linktext => pagetitle($2)))
 			: ( $1 
-				? "[[$3".(length $4 ? "#$4" : "")."]]"
+				? "[[$3".($4 ? "#$4" : "")."]]"
 				: htmllink($lpage, $page, linkpage($3),
 					anchor => $4))
 	}eg;
@@ -628,6 +628,14 @@
 				preview => $preprocess_preview,
 			);
 			$preprocessing{$page}--;
+
+			# Handle escaping html if the htmlizer needs it.
+			if ($ret =~ /[<>]/ && $pagesources{$page}) {
+				my $type=pagetype($pagesources{$page});
+				if ($hooks{htmlescape}{$type}) {
+					return $ret = $hooks{htmlize}{$type}{escape}->($ret);
+				}
+			}
 			return $ret;
 		}
 		else {