BIG, experimental patch.
[cocanwiki.git] / scripts / wikilib.ml
index b366ae2..9651aad 100644 (file)
@@ -1,7 +1,7 @@
 (* COCANWIKI - a wiki written in Objective CAML.
  * Written by Richard W.M. Jones <rich@merjis.com>.
  * Copyright (C) 2004 Merjis Ltd.
- * $Id: wikilib.ml,v 1.8 2004/09/30 14:58:14 rich Exp $
+ * $Id: wikilib.ml,v 1.12 2004/10/11 14:13:04 rich Exp $
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -43,7 +43,9 @@ let nontrivial_re = Pcre.regexp ~flags:[`CASELESS] "[a-z0-9]"
 let generate_url_of_title (dbh : Dbi.connection) hostid title =
   (* Create a suitable URL from this title. *)
   let url =
-    String.map (function '\000' .. ' ' | '<' | '>' | '&' | '"' | '+' -> '_'
+    String.map (function
+                   '\000' .. ' ' | '<' | '>' | '&' | '"' | '+' | '#' | '%'
+                     -> '_'
                  | c -> Char.lowercase c) title in
 
   (* Check URL is not too trivial. *)
@@ -91,7 +93,7 @@ let obscure_mailto url =
 (* This matches any markup. *)
 let markup_re =
   let link = "\\[\\[\\s*(?:.+?)\\s*(?:\\|.+?\\s*)?\\]\\]" in
-  let tag = "</?(?:b|i|strong|em|code|sup|sub|nowiki|br)>" in
+  let tag = "</?(?:b|i|strong|em|code|tt|sup|sub|nowiki|big|small|strike|s|br)>" in
   Pcre.regexp ("(.*?)((?:" ^ link ^ ")|(?:" ^ tag ^ "))(.*)")
 
 (* This matches links only, and should be compatible with the link contained
@@ -221,8 +223,7 @@ let markup_link dbh hostid link =
       ) else (
        let title = url in
        (* Look up the 'URL' against the titles in the database and
-        * obtain the real URL.  If none is found then it's a link to
-        * create a new page.
+        * obtain the real URL.
         *)
        let sth = dbh#prepare_cached "select url from pages
                                        where hostid = ? and url is not null
@@ -234,7 +235,27 @@ let markup_link dbh hostid link =
          "/" ^ url, "internal", title
        with
            Not_found ->
-             "/_bin/create_form.cmo?title=" ^ escape_url url, "newpage", title
+             (* It might be a template page ...  These pages don't
+              * exist in the template, but can be synthesized on the
+              * fly by page.ml.
+              *)
+             let is_template_page url =
+               let sth = dbh#prepare_cached "select 1 from templates
+                                               where ? ~ url_regexp
+                                               order by ordering
+                                               limit 1" in
+               sth#execute [`String url];
+
+               try sth#fetch1int () = 1 with Not_found -> false
+             in
+
+             if is_template_page url then
+               "/" ^ url, "internal", title
+             else
+               (* No, it really doesn't exist, so make it a link to
+                * a new page.
+                *)
+             "/_bin/edit.cmo?title=" ^ escape_url url, "newpage", title
       ) in
 
     "<a href=\"" ^ url ^
@@ -406,10 +427,12 @@ let allowed_elements =
     "p", [];
     "ul", []; "ol", []; "li", [];
     "pre", []; "blockquote", ["cite"];
-    "strong", []; "em", []; "dfn", []; "code", []; "samp", []; "kbd", [];
-    "var", []; "cite", []; "sup", []; "sub", []; "q", [];
+    "strong", []; "em", []; "dfn", []; "code", []; "tt", [];
+    "samp", []; "kbd", []; "var", []; "cite", [];
+    "sup", []; "sub", []; "q", [];
     "abbr", []; "acronym", [];
     "b", []; "i", [];
+    "big", []; "small", []; "strike", []; "s", [];
     "div", []; "span", [];
     "br", [];
   ] in