(* COCANWIKI - a wiki written in Objective CAML.
* Written by Richard W.M. Jones <rich@merjis.com>.
* Copyright (C) 2004 Merjis Ltd.
- * $Id: mail_import.ml,v 1.2 2004/10/11 15:21:49 rich Exp $
+ * $Id: mail_import.ml,v 1.3 2004/10/11 16:07:25 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
| (_, `Parts []) -> raise Not_found (* should never happen *)
| (_, `Parts (m :: _)) ->
find_body m in
+
+ (* Markup a plain text body. *)
+ let markup_body text =
+ (* Get all the titles from the database! We're going to exclude
+ * mail messages from this.
+ *)
+ let sth =
+ dbh#prepare_cached
+ "select lower (title) from pages where hostid = ?
+ and url is not null and title not like 'Mail/%'" in
+ sth#execute [`Int hostid];
+ let links = sth#map (function [`String s] -> s | _ -> assert false) in
+
+ (* This code cannot find titles which are split across multiple lines.
+ * XXX
+ *)
+ let lines = Pcre.split ~rex:lines_re text in
+
+ (* We don't want to mark up the same link twice, so keep track of the
+ * titles we've already used.
+ *)
+ let used = ref [] in
+ let lines =
+ List.map
+ (fun line ->
+ let find str sub_lc =
+ try
+ String.find (String.lowercase str) sub_lc
+ with
+ String.Invalid_string -> -1
+ in
+ let rec loop line = function
+ [] -> line
+ | link :: links ->
+ let i = find line link in
+ if i >= 0 && not (List.mem link !used) then (
+ used := link :: !used;
+ let n = String.length link in
+ let n' = String.length line in
+ let line =
+ String.sub line 0 i ^
+ "[[" ^ String.sub line i n ^
+ "]]" ^ loop (String.sub line (i+n) (n' - (i+n))) links
+ in
+ line
+ ) else
+ loop line links
+ in
+ loop line links) lines in
+
+ let lines = List.map trim lines in
+ let lines =
+ List.map (fun line -> if line <> "" then line ^ " <br>" else "")
+ lines in
+
+ String.concat "\n" lines
+ in
+
let content =
try
let text = find_body msg in
- let lines = Pcre.split ~rex:lines_re text in
- let lines = List.map trim lines in
- let lines = List.map (fun str -> str ^ "<br>") lines in
- String.concat "\n" lines
+ let content = markup_body text in
+ content
with
Not_found ->
"No plain text message body found" in