summary refs log tree commit diff
path: root/doc/txt
diff options
context:
space:
mode:
authorQuentin Carbonneaux <quentin.carbonneaux@yale.edu>2016-03-15 10:43:41 -0400
committerQuentin Carbonneaux <quentin.carbonneaux@yale.edu>2016-03-15 10:43:41 -0400
commit42c8252b03945657d59d9bfbd51694c288fc52e0 (patch)
treeefb4ee5cfd0de587041a1bf4efc32c401840fabb /doc/txt
parent15aa877caeb8210fc3b0e3a93b830ad417d3dbd6 (diff)
downloadroux-42c8252b03945657d59d9bfbd51694c288fc52e0.tar.gz
generate readable internal links
Diffstat (limited to 'doc/txt')
-rw-r--r--doc/txt/txt.ml27
1 files changed, 18 insertions, 9 deletions
diff --git a/doc/txt/txt.ml b/doc/txt/txt.ml
index 5652e28..35b797a 100644
--- a/doc/txt/txt.ml
+++ b/doc/txt/txt.ml
@@ -6,7 +6,7 @@ and item =
   | Par of (string * bool)
   | Ulist of doc list
   | Olist of doc list
-  | Title of int * int * string
+  | Title of int * string * string
 
 let (|>) x f = f x
 
@@ -35,6 +35,14 @@ module String = struct
     if !j = -1 then s else sub s !i (!j- !i+1)
 end
 
+let idify s =
+  let rec f i cs =
+    if i >= String.length s then cs else
+    match s.[i] with
+    | ' ' -> f (i+1) ("-" :: cs)
+    | c   -> f (i+1) (String.make 1 c :: cs) in
+  f 0 [] |> List.rev |> String.concat ""
+
 let warn = Printf.eprintf
 
 let getdent s =
@@ -80,7 +88,7 @@ let gettitles lines =
     let t = String.trim (skipnum (String.suff t 2)) in
     if Hashtbl.mem titles t then
       warn "line %d: title has multiple definitions\n" n;
-    Hashtbl.add titles t (lvl, n) in
+    Hashtbl.add titles t (lvl, idify t) in
   lines |> List.iter begin fun (n, lvl, t) ->
     if lvl <> 0 then () else
     if String.haspref "- " t then insert 0 n t else
@@ -189,7 +197,8 @@ let rec getdoc lines si acc =
       pop lines;
       let lvl = if l.[0] = '-' then 0 else 1 in
       let tit = String.suff l 2 in
-      getdoc lines si (Title (lvl, n, tit) :: acc);
+      let id = idify (String.trim (skipnum tit)) in
+      getdoc lines si (Title (lvl, id, tit) :: acc);
     end else
     if String.haspref "---" l
     || String.haspref "~~~" l
@@ -255,8 +264,8 @@ let rec dochtml titles d =
   let escape = String.iter pchar in
   let plink l =
     try
-      let (_, n) = Hashtbl.find titles l in
-      printf "<a href=\"#%d\">%s</a>" n l
+      let (_, id) = Hashtbl.find titles l in
+      printf "<a href=\"#%s\">%s</a>" id l
     with Not_found ->
       warn "warning: unresolved link '%s'\n" l;
       printf "<a href=\"#\">%s</a>" l in
@@ -279,12 +288,12 @@ let rec dochtml titles d =
         dochtml titles d;
     end in
   let itemhtml = function
-    | Title (0, n, t) ->
-      printf "<h3><a id='%d'>" n;
+    | Title (0, id, t) ->
+      printf "<h3><a id='%s'>" id;
       escape t;
       printf "</a></h3>\n";
-    | Title (_, n, t) ->
-      printf "<h4><a id='%d'>" n;
+    | Title (_, id, t) ->
+      printf "<h4><a id='%s'>" id;
       escape t;
       printf "</a></h4>\n";
     | Olist l ->