| author | wenzelm | 
| Thu, 02 Aug 2012 15:23:28 +0200 | |
| changeset 48649 | bf9bff84a61d | 
| parent 48543 | 93b558e05f21 | 
| child 48804 | 6348e5fca42e | 
| permissions | -rw-r--r-- | 
| 6203 | 1 | (* Title: Pure/Thy/present.ML | 
| 9416 | 2 | Author: Markus Wenzel and Stefan Berghofer, TU Muenchen | 
| 6203 | 3 | |
| 9416 | 4 | Theory presentation: HTML, graph files, (PDF)LaTeX documents. | 
| 6203 | 5 | *) | 
| 6 | ||
| 7 | signature BASIC_PRESENT = | |
| 8 | sig | |
| 42008 
7423e833a880
Present.init/finish/no_document are not thread-safe -- eliminated futile CRITICAL sections;
 wenzelm parents: 
42007diff
changeset | 9 |   val no_document: ('a -> 'b) -> 'a -> 'b  (*not thread-safe!*)
 | 
| 6203 | 10 | end; | 
| 11 | ||
| 12 | signature PRESENT = | |
| 13 | sig | |
| 7727 | 14 | include BASIC_PRESENT | 
| 24561 | 15 | val session_name: theory -> string | 
| 9452 | 16 |   val write_graph: {name: string, ID: string, dir: string, unfold: bool,
 | 
| 17 | path: string, parents: string list} list -> Path.T -> unit | |
| 20577 | 18 |   val display_graph: {name: string, ID: string, dir: string, unfold: bool,
 | 
| 19 | path: string, parents: string list} list -> unit | |
| 48543 | 20 | datatype dump_mode = Dump_all | Dump_tex | Dump_tex_sty | 
| 21 | val dump_mode: string -> dump_mode | |
| 48445 | 22 | val init: bool -> bool -> string -> string -> bool -> string list -> string list -> | 
| 48543 | 23 | string -> string * dump_mode -> Url.T option * bool -> bool -> | 
| 42008 
7423e833a880
Present.init/finish/no_document are not thread-safe -- eliminated futile CRITICAL sections;
 wenzelm parents: 
42007diff
changeset | 24 | theory list -> unit (*not thread-safe!*) | 
| 
7423e833a880
Present.init/finish/no_document are not thread-safe -- eliminated futile CRITICAL sections;
 wenzelm parents: 
42007diff
changeset | 25 | val finish: unit -> unit (*not thread-safe!*) | 
| 7727 | 26 | val init_theory: string -> unit | 
| 27862 
8f727f7c8c1d
removed obsolete verbatim_source, results, chapter, section etc.;
 wenzelm parents: 
27491diff
changeset | 27 | val theory_source: string -> (unit -> HTML.text) -> unit | 
| 9136 | 28 | val theory_output: string -> string -> unit | 
| 24150 
ed724867099a
sort indexes according to symbolic update_time (multithreading-safe);
 wenzelm parents: 
24102diff
changeset | 29 | val begin_theory: int -> Path.T -> (Path.T * bool) list -> theory -> theory | 
| 14922 | 30 | val drafts: string -> Path.T list -> Path.T | 
| 6203 | 31 | end; | 
| 32 | ||
| 7685 | 33 | structure Present: PRESENT = | 
| 34 | struct | |
| 35 | ||
| 7727 | 36 | |
| 37 | (** paths **) | |
| 38 | ||
| 39 | val tex_ext = Path.ext "tex"; | |
| 40 | val tex_path = tex_ext o Path.basic; | |
| 41 | val html_ext = Path.ext "html"; | |
| 42 | val html_path = html_ext o Path.basic; | |
| 43 | val index_path = Path.basic "index.html"; | |
| 11856 | 44 | val readme_html_path = Path.basic "README.html"; | 
| 45 | val readme_path = Path.basic "README"; | |
| 17082 | 46 | val documentN = "document"; | 
| 47 | val document_path = Path.basic documentN; | |
| 8196 | 48 | val doc_indexN = "session"; | 
| 11856 | 49 | val graph_path = Path.basic "session.graph"; | 
| 50 | val graph_pdf_path = Path.basic "session_graph.pdf"; | |
| 51 | val graph_eps_path = Path.basic "session_graph.eps"; | |
| 7727 | 52 | |
| 53 | val session_path = Path.basic ".session"; | |
| 21858 
05f57309170c
avoid conflict with Alice keywords: renamed pack -> implode, unpack -> explode, any -> many, avoided assert;
 wenzelm parents: 
20664diff
changeset | 54 | val session_entries_path = Path.explode ".session/entries"; | 
| 
05f57309170c
avoid conflict with Alice keywords: renamed pack -> implode, unpack -> explode, any -> many, avoided assert;
 wenzelm parents: 
20664diff
changeset | 55 | val pre_index_path = Path.explode ".session/pre-index"; | 
| 7727 | 56 | |
| 9044 | 57 | fun mk_rel_path [] ys = Path.make ys | 
| 58 | | mk_rel_path xs [] = Path.appends (replicate (length xs) Path.parent) | |
| 9416 | 59 | | mk_rel_path (ps as x :: xs) (qs as y :: ys) = if x = y then mk_rel_path xs ys else | 
| 9044 | 60 | Path.appends (replicate (length ps) Path.parent @ [Path.make qs]); | 
| 7727 | 61 | |
| 21858 
05f57309170c
avoid conflict with Alice keywords: renamed pack -> implode, unpack -> explode, any -> many, avoided assert;
 wenzelm parents: 
20664diff
changeset | 62 | fun show_path path = Path.implode (Path.append (File.pwd ()) path); | 
| 11856 | 63 | |
| 7727 | 64 | |
| 14922 | 65 | |
| 7727 | 66 | (** additional theory data **) | 
| 67 | ||
| 42008 
7423e833a880
Present.init/finish/no_document are not thread-safe -- eliminated futile CRITICAL sections;
 wenzelm parents: 
42007diff
changeset | 68 | structure Browser_Info = Theory_Data | 
| 22846 | 69 | ( | 
| 9416 | 70 |   type T = {name: string, session: string list, is_local: bool};
 | 
| 27329 | 71 |   val empty = {name = "", session = [], is_local = false}: T;
 | 
| 16503 | 72 | fun extend _ = empty; | 
| 33522 | 73 | fun merge _ = empty; | 
| 22846 | 74 | ); | 
| 7727 | 75 | |
| 42008 
7423e833a880
Present.init/finish/no_document are not thread-safe -- eliminated futile CRITICAL sections;
 wenzelm parents: 
42007diff
changeset | 76 | val put_info = Browser_Info.put; | 
| 
7423e833a880
Present.init/finish/no_document are not thread-safe -- eliminated futile CRITICAL sections;
 wenzelm parents: 
42007diff
changeset | 77 | val get_info = Browser_Info.get; | 
| 24561 | 78 | val session_name = #name o get_info; | 
| 79 | ||
| 7727 | 80 | |
| 81 | ||
| 82 | (** graphs **) | |
| 83 | ||
| 84 | type graph_node = | |
| 85 |   {name: string, ID: string, dir: string, unfold: bool,
 | |
| 86 | path: string, parents: string list}; | |
| 87 | ||
| 9416 | 88 | fun write_graph gr path = | 
| 89 |   File.write path (cat_lines (map (fn {name, ID, dir, unfold, path, parents} =>
 | |
| 90 | "\"" ^ name ^ "\" \"" ^ ID ^ "\" \"" ^ dir ^ (if unfold then "\" + \"" else "\" \"") ^ | |
| 28840 | 91 | path ^ "\" > " ^ space_implode " " (map quote parents) ^ " ;") gr)); | 
| 7727 | 92 | |
| 20577 | 93 | fun display_graph gr = | 
| 94 | let | |
| 42127 
8223e7f4b0da
Isabelle_System.create_tmp_path/with_tmp_file: optional extension;
 wenzelm parents: 
42126diff
changeset | 95 | val path = Isabelle_System.create_tmp_path "graph" ""; | 
| 
8223e7f4b0da
Isabelle_System.create_tmp_path/with_tmp_file: optional extension;
 wenzelm parents: 
42126diff
changeset | 96 | val _ = write_graph gr path; | 
| 24561 | 97 | val _ = writeln "Displaying graph ..."; | 
| 40743 | 98 |     val _ = Isabelle_System.isabelle_tool "browser" ("-c " ^ File.shell_path path ^ " &");
 | 
| 20577 | 99 | in () end; | 
| 100 | ||
| 101 | ||
| 9416 | 102 | fun ID_of sess s = space_implode "/" (sess @ [s]); | 
| 23899 
ab37b1f690c7
clarified init/begin_theory: no longer depend on thy_info.ML;
 wenzelm parents: 
23884diff
changeset | 103 | fun ID_of_thy thy = ID_of (#session (get_info thy)) (Context.theory_name thy); | 
| 7727 | 104 | |
| 23899 
ab37b1f690c7
clarified init/begin_theory: no longer depend on thy_info.ML;
 wenzelm parents: 
23884diff
changeset | 105 | |
| 
ab37b1f690c7
clarified init/begin_theory: no longer depend on thy_info.ML;
 wenzelm parents: 
23884diff
changeset | 106 | (*retrieve graph data from initial collection of theories*) | 
| 24150 
ed724867099a
sort indexes according to symbolic update_time (multithreading-safe);
 wenzelm parents: 
24102diff
changeset | 107 | fun init_graph remote_path curr_sess = rev o map (fn thy => | 
| 7727 | 108 | let | 
| 23899 
ab37b1f690c7
clarified init/begin_theory: no longer depend on thy_info.ML;
 wenzelm parents: 
23884diff
changeset | 109 | val name = Context.theory_name thy; | 
| 
ab37b1f690c7
clarified init/begin_theory: no longer depend on thy_info.ML;
 wenzelm parents: 
23884diff
changeset | 110 |     val {name = sess_name, session, is_local} = get_info thy;
 | 
| 24150 
ed724867099a
sort indexes according to symbolic update_time (multithreading-safe);
 wenzelm parents: 
24102diff
changeset | 111 | val entry = | 
| 
ed724867099a
sort indexes according to symbolic update_time (multithreading-safe);
 wenzelm parents: 
24102diff
changeset | 112 |      {name = name, ID = ID_of session name, dir = sess_name,
 | 
| 
ed724867099a
sort indexes according to symbolic update_time (multithreading-safe);
 wenzelm parents: 
24102diff
changeset | 113 | path = | 
| 
ed724867099a
sort indexes according to symbolic update_time (multithreading-safe);
 wenzelm parents: 
24102diff
changeset | 114 | if null session then "" else | 
| 
ed724867099a
sort indexes according to symbolic update_time (multithreading-safe);
 wenzelm parents: 
24102diff
changeset | 115 | if is_some remote_path andalso not is_local then | 
| 
ed724867099a
sort indexes according to symbolic update_time (multithreading-safe);
 wenzelm parents: 
24102diff
changeset | 116 | Url.implode (Url.append (the remote_path) (Url.File | 
| 
ed724867099a
sort indexes according to symbolic update_time (multithreading-safe);
 wenzelm parents: 
24102diff
changeset | 117 | (Path.append (Path.make session) (html_path name)))) | 
| 
ed724867099a
sort indexes according to symbolic update_time (multithreading-safe);
 wenzelm parents: 
24102diff
changeset | 118 | else Path.implode (Path.append (mk_rel_path curr_sess session) (html_path name)), | 
| 
ed724867099a
sort indexes according to symbolic update_time (multithreading-safe);
 wenzelm parents: 
24102diff
changeset | 119 | unfold = false, | 
| 
ed724867099a
sort indexes according to symbolic update_time (multithreading-safe);
 wenzelm parents: 
24102diff
changeset | 120 | parents = map ID_of_thy (Theory.parents_of thy)}; | 
| 
ed724867099a
sort indexes according to symbolic update_time (multithreading-safe);
 wenzelm parents: 
24102diff
changeset | 121 | in (0, entry) end); | 
| 7727 | 122 | |
| 24150 
ed724867099a
sort indexes according to symbolic update_time (multithreading-safe);
 wenzelm parents: 
24102diff
changeset | 123 | fun ins_graph_entry (i, entry as {ID, ...}) (gr: (int * graph_node) list) =
 | 
| 
ed724867099a
sort indexes according to symbolic update_time (multithreading-safe);
 wenzelm parents: 
24102diff
changeset | 124 | (i, entry) :: filter_out (fn (_, entry') => #ID entry' = ID) gr; | 
| 7727 | 125 | |
| 126 | ||
| 127 | ||
| 128 | (** global browser info state **) | |
| 129 | ||
| 130 | (* type theory_info *) | |
| 131 | ||
| 132 | type theory_info = {tex_source: Buffer.T, html_source: Buffer.T, html: Buffer.T};
 | |
| 133 | ||
| 134 | fun make_theory_info (tex_source, html_source, html) = | |
| 135 |   {tex_source = tex_source, html_source = html_source, html = html}: theory_info;
 | |
| 136 | ||
| 137 | val empty_theory_info = make_theory_info (Buffer.empty, Buffer.empty, Buffer.empty); | |
| 138 | ||
| 139 | fun map_theory_info f {tex_source, html_source, html} =
 | |
| 140 | make_theory_info (f (tex_source, html_source, html)); | |
| 141 | ||
| 142 | ||
| 143 | (* type browser_info *) | |
| 144 | ||
| 11856 | 145 | type browser_info = {theories: theory_info Symtab.table, files: (Path.T * string) list,
 | 
| 24150 
ed724867099a
sort indexes according to symbolic update_time (multithreading-safe);
 wenzelm parents: 
24102diff
changeset | 146 | tex_index: (int * string) list, html_index: (int * string) list, graph: (int * graph_node) list}; | 
| 7727 | 147 | |
| 11856 | 148 | fun make_browser_info (theories, files, tex_index, html_index, graph) = | 
| 149 |   {theories = theories, files = files, tex_index = tex_index, html_index = html_index,
 | |
| 9416 | 150 | graph = graph}: browser_info; | 
| 7727 | 151 | |
| 24150 
ed724867099a
sort indexes according to symbolic update_time (multithreading-safe);
 wenzelm parents: 
24102diff
changeset | 152 | val empty_browser_info = make_browser_info (Symtab.empty, [], [], [], []); | 
| 7727 | 153 | |
| 23899 
ab37b1f690c7
clarified init/begin_theory: no longer depend on thy_info.ML;
 wenzelm parents: 
23884diff
changeset | 154 | fun init_browser_info remote_path curr_sess thys = make_browser_info | 
| 24150 
ed724867099a
sort indexes according to symbolic update_time (multithreading-safe);
 wenzelm parents: 
24102diff
changeset | 155 | (Symtab.empty, [], [], [], init_graph remote_path curr_sess thys); | 
| 7727 | 156 | |
| 11856 | 157 | fun map_browser_info f {theories, files, tex_index, html_index, graph} =
 | 
| 158 | make_browser_info (f (theories, files, tex_index, html_index, graph)); | |
| 7727 | 159 | |
| 160 | ||
| 161 | (* state *) | |
| 162 | ||
| 32738 | 163 | val browser_info = Unsynchronized.ref empty_browser_info; | 
| 164 | fun change_browser_info f = | |
| 165 | CRITICAL (fn () => Unsynchronized.change browser_info (map_browser_info f)); | |
| 7727 | 166 | |
| 32738 | 167 | val suppress_tex_source = Unsynchronized.ref false; | 
| 42008 
7423e833a880
Present.init/finish/no_document are not thread-safe -- eliminated futile CRITICAL sections;
 wenzelm parents: 
42007diff
changeset | 168 | fun no_document f x = Unsynchronized.setmp suppress_tex_source true f x; | 
| 7727 | 169 | |
| 170 | fun init_theory_info name info = | |
| 11856 | 171 | change_browser_info (fn (theories, files, tex_index, html_index, graph) => | 
| 17412 | 172 | (Symtab.update (name, info) theories, files, tex_index, html_index, graph)); | 
| 7727 | 173 | |
| 174 | fun change_theory_info name f = | |
| 42010 | 175 | change_browser_info (fn (theories, files, tex_index, html_index, graph) => | 
| 17412 | 176 | (case Symtab.lookup theories name of | 
| 27491 
c8178a6a6480
begin_theory: files_html needs to be produced outside of prep_html_source to make ML files appear!
 wenzelm parents: 
27329diff
changeset | 177 |       NONE => error ("Browser info: cannot access theory document " ^ quote name)
 | 
| 17412 | 178 | | SOME info => (Symtab.update (name, map_theory_info f info) theories, files, | 
| 9416 | 179 | tex_index, html_index, graph))); | 
| 7727 | 180 | |
| 181 | ||
| 11856 | 182 | fun add_file file = | 
| 183 | change_browser_info (fn (theories, files, tex_index, html_index, graph) => | |
| 184 | (theories, file :: files, tex_index, html_index, graph)); | |
| 185 | ||
| 7727 | 186 | fun add_tex_index txt = | 
| 11856 | 187 | change_browser_info (fn (theories, files, tex_index, html_index, graph) => | 
| 24150 
ed724867099a
sort indexes according to symbolic update_time (multithreading-safe);
 wenzelm parents: 
24102diff
changeset | 188 | (theories, files, txt :: tex_index, html_index, graph)); | 
| 7727 | 189 | |
| 190 | fun add_html_index txt = | |
| 11856 | 191 | change_browser_info (fn (theories, files, tex_index, html_index, graph) => | 
| 24150 
ed724867099a
sort indexes according to symbolic update_time (multithreading-safe);
 wenzelm parents: 
24102diff
changeset | 192 | (theories, files, tex_index, txt :: html_index, graph)); | 
| 7727 | 193 | |
| 24150 
ed724867099a
sort indexes according to symbolic update_time (multithreading-safe);
 wenzelm parents: 
24102diff
changeset | 194 | fun add_graph_entry entry = | 
| 11856 | 195 | change_browser_info (fn (theories, files, tex_index, html_index, graph) => | 
| 24150 
ed724867099a
sort indexes according to symbolic update_time (multithreading-safe);
 wenzelm parents: 
24102diff
changeset | 196 | (theories, files, tex_index, html_index, ins_graph_entry entry graph)); | 
| 7727 | 197 | |
| 11057 | 198 | fun add_tex_source name txt = | 
| 199 | if ! suppress_tex_source then () | |
| 200 | else change_theory_info name (fn (tex_source, html_source, html) => | |
| 201 | (Buffer.add txt tex_source, html_source, html)); | |
| 7727 | 202 | |
| 203 | fun add_html_source name txt = change_theory_info name (fn (tex_source, html_source, html) => | |
| 204 | (tex_source, Buffer.add txt html_source, html)); | |
| 205 | ||
| 206 | ||
| 207 | ||
| 208 | (** global session state **) | |
| 209 | ||
| 210 | (* session_info *) | |
| 211 | ||
| 48543 | 212 | datatype dump_mode = Dump_all | Dump_tex | Dump_tex_sty; | 
| 213 | ||
| 214 | fun dump_mode "all" = Dump_all | |
| 215 | | dump_mode "tex" = Dump_tex | |
| 216 | | dump_mode "tex+sty" = Dump_tex_sty | |
| 217 | | dump_mode s = | |
| 218 |       error ("Illegal document dump mode: " ^ quote s ^ " (expected \"all\", \"tex\", \"tex+sty\")");
 | |
| 219 | ||
| 7727 | 220 | type session_info = | 
| 221 |   {name: string, parent: string, session: string, path: string list, html_prefix: Path.T,
 | |
| 17082 | 222 | info: bool, doc_format: string, doc_graph: bool, documents: (string * string) list, | 
| 48543 | 223 | doc_dump: (string * dump_mode), remote_path: Url.T option, verbose: bool, | 
| 42007 | 224 | readme: Path.T option}; | 
| 7727 | 225 | |
| 9416 | 226 | fun make_session_info | 
| 17082 | 227 | (name, parent, session, path, html_prefix, info, doc_format, doc_graph, documents, | 
| 48516 
c5d0f19ef7cb
refined "document_dump_mode": "all", "tex+sty", "tex";
 wenzelm parents: 
48445diff
changeset | 228 | doc_dump, remote_path, verbose, readme) = | 
| 7802 | 229 |   {name = name, parent = parent, session = session, path = path, html_prefix = html_prefix,
 | 
| 17082 | 230 | info = info, doc_format = doc_format, doc_graph = doc_graph, documents = documents, | 
| 48516 
c5d0f19ef7cb
refined "document_dump_mode": "all", "tex+sty", "tex";
 wenzelm parents: 
48445diff
changeset | 231 | doc_dump = doc_dump, remote_path = remote_path, verbose = verbose, | 
| 42007 | 232 | readme = readme}: session_info; | 
| 7685 | 233 | |
| 234 | ||
| 7727 | 235 | (* state *) | 
| 236 | ||
| 32738 | 237 | val session_info = Unsynchronized.ref (NONE: session_info option); | 
| 7727 | 238 | |
| 42126 | 239 | fun session_default x f = (case ! session_info of NONE => x | SOME info => f info); | 
| 7727 | 240 | |
| 241 | ||
| 242 | ||
| 14922 | 243 | (** document preparation **) | 
| 7727 | 244 | |
| 245 | (* maintain index *) | |
| 246 | ||
| 247 | val session_entries = | |
| 248 | HTML.session_entries o | |
| 14898 | 249 | map (fn name => (Url.File (Path.append (Path.basic name) index_path), name)); | 
| 7727 | 250 | |
| 251 | fun get_entries dir = | |
| 252 | split_lines (File.read (Path.append dir session_entries_path)); | |
| 253 | ||
| 254 | fun put_entries entries dir = | |
| 255 | File.write (Path.append dir session_entries_path) (cat_lines entries); | |
| 256 | ||
| 257 | ||
| 258 | fun create_index dir = | |
| 259 | File.read (Path.append dir pre_index_path) ^ | |
| 27862 
8f727f7c8c1d
removed obsolete verbatim_source, results, chapter, section etc.;
 wenzelm parents: 
27491diff
changeset | 260 | session_entries (get_entries dir) ^ HTML.end_document | 
| 7727 | 261 | |> File.write (Path.append dir index_path); | 
| 262 | ||
| 42008 
7423e833a880
Present.init/finish/no_document are not thread-safe -- eliminated futile CRITICAL sections;
 wenzelm parents: 
42007diff
changeset | 263 | fun update_index dir name = | 
| 7727 | 264 | (case try get_entries dir of | 
| 41944 
b97091ae583a
Path.print is the official way to show file-system paths to users -- note that Path.implode often indicates violation of the abstract datatype;
 wenzelm parents: 
41886diff
changeset | 265 |     NONE => warning ("Browser info: cannot access session index of " ^ Path.print dir)
 | 
| 42008 
7423e833a880
Present.init/finish/no_document are not thread-safe -- eliminated futile CRITICAL sections;
 wenzelm parents: 
42007diff
changeset | 266 | | SOME es => (put_entries ((remove (op =) name es) @ [name]) dir; create_index dir)); | 
| 7727 | 267 | |
| 268 | ||
| 42004 | 269 | (* document variants *) | 
| 17082 | 270 | |
| 42004 | 271 | fun read_variant str = | 
| 17082 | 272 | (case space_explode "=" str of | 
| 273 | [name] => (name, "") | |
| 274 | | [name, tags] => (name, tags) | |
| 42004 | 275 |   | _ => error ("Malformed document variant specification: " ^ quote str));
 | 
| 17082 | 276 | |
| 42004 | 277 | fun read_variants strs = | 
| 278 | rev (distinct (eq_fst (op =)) (rev ((documentN, "") :: map read_variant strs))) | |
| 28375 | 279 | |> filter_out (fn (_, s) => s = "-"); | 
| 17082 | 280 | |
| 281 | ||
| 7727 | 282 | (* init session *) | 
| 283 | ||
| 12895 | 284 | fun name_of_session elems = space_implode "/" ("Isabelle" :: elems);
 | 
| 285 | ||
| 48516 
c5d0f19ef7cb
refined "document_dump_mode": "all", "tex+sty", "tex";
 wenzelm parents: 
48445diff
changeset | 286 | fun init build info info_path doc doc_graph doc_variants path name | 
| 
c5d0f19ef7cb
refined "document_dump_mode": "all", "tex+sty", "tex";
 wenzelm parents: 
48445diff
changeset | 287 | (doc_dump as (dump_prefix, _)) (remote_path, first_time) verbose thys = | 
| 
c5d0f19ef7cb
refined "document_dump_mode": "all", "tex+sty", "tex";
 wenzelm parents: 
48445diff
changeset | 288 | if not build andalso not info andalso doc = "" andalso dump_prefix = "" then | 
| 15531 | 289 | (browser_info := empty_browser_info; session_info := NONE) | 
| 11856 | 290 | else | 
| 291 | let | |
| 33957 | 292 | val parent_name = name_of_session (take (length path - 1) path); | 
| 11856 | 293 | val session_name = name_of_session path; | 
| 294 | val sess_prefix = Path.make path; | |
| 48445 | 295 | val html_prefix = Path.append (Path.expand (Path.explode info_path)) sess_prefix; | 
| 7727 | 296 | |
| 42007 | 297 | val documents = | 
| 298 | if doc = "" then [] | |
| 42005 | 299 | else if not (can File.check_dir document_path) then | 
| 44389 
a3b5fdfb04a3
tuned signature -- contrast physical output primitives versus Output.raw_message;
 wenzelm parents: 
43850diff
changeset | 300 | (if verbose then Output.physical_stderr "Warning: missing document directory\n" | 
| 
a3b5fdfb04a3
tuned signature -- contrast physical output primitives versus Output.raw_message;
 wenzelm parents: 
43850diff
changeset | 301 | else (); []) | 
| 42007 | 302 | else read_variants doc_variants; | 
| 7727 | 303 | |
| 11856 | 304 | val parent_index_path = Path.append Path.parent index_path; | 
| 42007 | 305 | val index_up_lnk = | 
| 306 | if first_time then | |
| 16263 
0609fb8df4a7
removed copy, copy_all (superceded by File.copy, File.copy_dir);
 wenzelm parents: 
15801diff
changeset | 307 | Url.append (the remote_path) (Url.File (Path.append sess_prefix parent_index_path)) | 
| 14898 | 308 | else Url.File parent_index_path; | 
| 11856 | 309 | val readme = | 
| 15531 | 310 | if File.exists readme_html_path then SOME readme_html_path | 
| 311 | else if File.exists readme_path then SOME readme_path | |
| 312 | else NONE; | |
| 7727 | 313 | |
| 17082 | 314 | val docs = | 
| 315 | (case readme of NONE => [] | SOME p => [(Url.File p, "README")]) @ | |
| 42007 | 316 | map (fn (name, _) => (Url.File (Path.ext doc (Path.basic name)), name)) documents; | 
| 11856 | 317 | val index_text = HTML.begin_index (index_up_lnk, parent_name) | 
| 21858 
05f57309170c
avoid conflict with Alice keywords: renamed pack -> implode, unpack -> explode, any -> many, avoided assert;
 wenzelm parents: 
20664diff
changeset | 318 | (Url.File index_path, session_name) docs (Url.explode "medium.html"); | 
| 11856 | 319 | in | 
| 42007 | 320 | session_info := | 
| 321 | SOME (make_session_info (name, parent_name, session_name, path, html_prefix, | |
| 48516 
c5d0f19ef7cb
refined "document_dump_mode": "all", "tex+sty", "tex";
 wenzelm parents: 
48445diff
changeset | 322 | info, doc, doc_graph, documents, doc_dump, remote_path, verbose, readme)); | 
| 23899 
ab37b1f690c7
clarified init/begin_theory: no longer depend on thy_info.ML;
 wenzelm parents: 
23884diff
changeset | 323 | browser_info := init_browser_info remote_path path thys; | 
| 24150 
ed724867099a
sort indexes according to symbolic update_time (multithreading-safe);
 wenzelm parents: 
24102diff
changeset | 324 | add_html_index (0, index_text) | 
| 42008 
7423e833a880
Present.init/finish/no_document are not thread-safe -- eliminated futile CRITICAL sections;
 wenzelm parents: 
42007diff
changeset | 325 | end; | 
| 7727 | 326 | |
| 327 | ||
| 28496 
4cff10648928
renamed isatool to isabelle_tool in programming interfaces;
 wenzelm parents: 
28375diff
changeset | 328 | (* isabelle tool wrappers *) | 
| 17082 | 329 | |
| 28496 
4cff10648928
renamed isatool to isabelle_tool in programming interfaces;
 wenzelm parents: 
28375diff
changeset | 330 | fun isabelle_document verbose format name tags path result_path = | 
| 17082 | 331 | let | 
| 28500 | 332 | val s = "\"$ISABELLE_TOOL\" document -c -o '" ^ format ^ "' \ | 
| 33682 
0c5d1485dea7
isabelle_document: more explicit error output, notably for drafts;
 wenzelm parents: 
33522diff
changeset | 333 | \-n '" ^ name ^ "' -t '" ^ tags ^ "' " ^ File.shell_path path ^ " 2>&1"; | 
| 17082 | 334 | val doc_path = Path.append result_path (Path.ext format (Path.basic name)); | 
| 33682 
0c5d1485dea7
isabelle_document: more explicit error output, notably for drafts;
 wenzelm parents: 
33522diff
changeset | 335 | val _ = if verbose then writeln s else (); | 
| 43850 
7f2cbc713344
moved bash operations to Isabelle_System (cf. Scala version);
 wenzelm parents: 
43712diff
changeset | 336 | val (out, rc) = Isabelle_System.bash_output s; | 
| 33682 
0c5d1485dea7
isabelle_document: more explicit error output, notably for drafts;
 wenzelm parents: 
33522diff
changeset | 337 | val _ = | 
| 
0c5d1485dea7
isabelle_document: more explicit error output, notably for drafts;
 wenzelm parents: 
33522diff
changeset | 338 | if not (File.exists doc_path) orelse rc <> 0 then | 
| 
0c5d1485dea7
isabelle_document: more explicit error output, notably for drafts;
 wenzelm parents: 
33522diff
changeset | 339 |         cat_error out ("Failed to build document " ^ quote (show_path doc_path))
 | 
| 
0c5d1485dea7
isabelle_document: more explicit error output, notably for drafts;
 wenzelm parents: 
33522diff
changeset | 340 | else if verbose then writeln out | 
| 
0c5d1485dea7
isabelle_document: more explicit error output, notably for drafts;
 wenzelm parents: 
33522diff
changeset | 341 | else (); | 
| 
0c5d1485dea7
isabelle_document: more explicit error output, notably for drafts;
 wenzelm parents: 
33522diff
changeset | 342 | in doc_path end; | 
| 17082 | 343 | |
| 42127 
8223e7f4b0da
Isabelle_System.create_tmp_path/with_tmp_file: optional extension;
 wenzelm parents: 
42126diff
changeset | 344 | fun isabelle_browser graph = Isabelle_System.with_tmp_dir "browser" (fn dir => | 
| 17082 | 345 | let | 
| 42127 
8223e7f4b0da
Isabelle_System.create_tmp_path/with_tmp_file: optional extension;
 wenzelm parents: 
42126diff
changeset | 346 | val pdf_path = Path.append dir graph_pdf_path; | 
| 
8223e7f4b0da
Isabelle_System.create_tmp_path/with_tmp_file: optional extension;
 wenzelm parents: 
42126diff
changeset | 347 | val eps_path = Path.append dir graph_eps_path; | 
| 
8223e7f4b0da
Isabelle_System.create_tmp_path/with_tmp_file: optional extension;
 wenzelm parents: 
42126diff
changeset | 348 | val graph_path = Path.append dir graph_path; | 
| 
8223e7f4b0da
Isabelle_System.create_tmp_path/with_tmp_file: optional extension;
 wenzelm parents: 
42126diff
changeset | 349 | val _ = write_graph graph graph_path; | 
| 
8223e7f4b0da
Isabelle_System.create_tmp_path/with_tmp_file: optional extension;
 wenzelm parents: 
42126diff
changeset | 350 | val args = "-o " ^ File.shell_path pdf_path ^ " " ^ File.shell_path graph_path; | 
| 17082 | 351 | in | 
| 42127 
8223e7f4b0da
Isabelle_System.create_tmp_path/with_tmp_file: optional extension;
 wenzelm parents: 
42126diff
changeset | 352 | if Isabelle_System.isabelle_tool "browser" args = 0 andalso | 
| 
8223e7f4b0da
Isabelle_System.create_tmp_path/with_tmp_file: optional extension;
 wenzelm parents: 
42126diff
changeset | 353 | File.exists pdf_path andalso File.exists eps_path | 
| 
8223e7f4b0da
Isabelle_System.create_tmp_path/with_tmp_file: optional extension;
 wenzelm parents: 
42126diff
changeset | 354 | then (File.read pdf_path, File.read eps_path) | 
| 
8223e7f4b0da
Isabelle_System.create_tmp_path/with_tmp_file: optional extension;
 wenzelm parents: 
42126diff
changeset | 355 | else error "Failed to prepare dependency graph" | 
| 
8223e7f4b0da
Isabelle_System.create_tmp_path/with_tmp_file: optional extension;
 wenzelm parents: 
42126diff
changeset | 356 | end); | 
| 17082 | 357 | |
| 358 | ||
| 11856 | 359 | (* finish session -- output all generated text *) | 
| 360 | ||
| 24150 
ed724867099a
sort indexes according to symbolic update_time (multithreading-safe);
 wenzelm parents: 
24102diff
changeset | 361 | fun sorted_index index = map snd (sort (int_ord o pairself fst) (rev index)); | 
| 
ed724867099a
sort indexes according to symbolic update_time (multithreading-safe);
 wenzelm parents: 
24102diff
changeset | 362 | fun index_buffer index = Buffer.add (implode (sorted_index index)) Buffer.empty; | 
| 
ed724867099a
sort indexes according to symbolic update_time (multithreading-safe);
 wenzelm parents: 
24102diff
changeset | 363 | |
| 14922 | 364 | fun write_tex src name path = | 
| 28027 | 365 | File.write_buffer (Path.append path (tex_path name)) src; | 
| 14922 | 366 | |
| 367 | fun write_tex_index tex_index path = | |
| 24150 
ed724867099a
sort indexes according to symbolic update_time (multithreading-safe);
 wenzelm parents: 
24102diff
changeset | 368 | write_tex (index_buffer tex_index |> Buffer.add Latex.tex_trailer) doc_indexN path; | 
| 14922 | 369 | |
| 7685 | 370 | |
| 42008 
7423e833a880
Present.init/finish/no_document are not thread-safe -- eliminated futile CRITICAL sections;
 wenzelm parents: 
42007diff
changeset | 371 | fun finish () = | 
| 42126 | 372 |   session_default () (fn {name, info, html_prefix, doc_format,
 | 
| 48516 
c5d0f19ef7cb
refined "document_dump_mode": "all", "tex+sty", "tex";
 wenzelm parents: 
48445diff
changeset | 373 | doc_graph, documents, doc_dump = (dump_prefix, dump_mode), path, verbose, readme, ...} => | 
| 7727 | 374 | let | 
| 11856 | 375 |     val {theories, files, tex_index, html_index, graph} = ! browser_info;
 | 
| 376 | val thys = Symtab.dest theories; | |
| 9416 | 377 | val parent_html_prefix = Path.append html_prefix Path.parent; | 
| 7727 | 378 | |
| 11856 | 379 |     fun finish_html (a, {html, ...}: theory_info) =
 | 
| 28027 | 380 | File.write_buffer (Path.append html_prefix (html_path a)) (Buffer.add HTML.end_document html); | 
| 11856 | 381 | |
| 24150 
ed724867099a
sort indexes according to symbolic update_time (multithreading-safe);
 wenzelm parents: 
24102diff
changeset | 382 | val sorted_graph = sorted_index graph; | 
| 11856 | 383 | val opt_graphs = | 
| 48516 
c5d0f19ef7cb
refined "document_dump_mode": "all", "tex+sty", "tex";
 wenzelm parents: 
48445diff
changeset | 384 | if doc_graph andalso (not (null documents) orelse dump_prefix <> "") then | 
| 28496 
4cff10648928
renamed isatool to isabelle_tool in programming interfaces;
 wenzelm parents: 
28375diff
changeset | 385 | SOME (isabelle_browser sorted_graph) | 
| 15531 | 386 | else NONE; | 
| 11856 | 387 | |
| 48516 
c5d0f19ef7cb
refined "document_dump_mode": "all", "tex+sty", "tex";
 wenzelm parents: 
48445diff
changeset | 388 | fun prepare_sources doc_dir doc_mode = | 
| 
c5d0f19ef7cb
refined "document_dump_mode": "all", "tex+sty", "tex";
 wenzelm parents: 
48445diff
changeset | 389 | (Isabelle_System.mkdirs doc_dir; | 
| 48543 | 390 | (case doc_mode of | 
| 391 | Dump_all => Isabelle_System.copy_dir document_path doc_dir | |
| 392 | | Dump_tex_sty => | |
| 393 | ignore (Isabelle_System.isabelle_tool "latex" | |
| 394 |             ("-o sty " ^ File.shell_path (Path.append doc_dir (Path.basic "root.tex"))))
 | |
| 395 | | Dump_tex => ()); | |
| 15531 | 396 | (case opt_graphs of NONE => () | SOME (pdf, eps) => | 
| 48516 
c5d0f19ef7cb
refined "document_dump_mode": "all", "tex+sty", "tex";
 wenzelm parents: 
48445diff
changeset | 397 | (File.write (Path.append doc_dir graph_pdf_path) pdf; | 
| 
c5d0f19ef7cb
refined "document_dump_mode": "all", "tex+sty", "tex";
 wenzelm parents: 
48445diff
changeset | 398 | File.write (Path.append doc_dir graph_eps_path) eps)); | 
| 
c5d0f19ef7cb
refined "document_dump_mode": "all", "tex+sty", "tex";
 wenzelm parents: 
48445diff
changeset | 399 | write_tex_index tex_index doc_dir; | 
| 
c5d0f19ef7cb
refined "document_dump_mode": "all", "tex+sty", "tex";
 wenzelm parents: 
48445diff
changeset | 400 |       List.app (fn (a, {tex_source, ...}) => write_tex tex_source a doc_dir) thys);
 | 
| 42007 | 401 | val _ = | 
| 402 | if info then | |
| 403 | (Isabelle_System.mkdirs (Path.append html_prefix session_path); | |
| 404 | File.write_buffer (Path.append html_prefix pre_index_path) (index_buffer html_index); | |
| 405 | File.write (Path.append html_prefix session_entries_path) ""; | |
| 406 | create_index html_prefix; | |
| 407 | if length path > 1 then update_index parent_html_prefix name else (); | |
| 408 | (case readme of NONE => () | SOME path => File.copy path html_prefix); | |
| 409 | write_graph sorted_graph (Path.append html_prefix graph_path); | |
| 410 | Isabelle_System.isabelle_tool "browser" "-b"; | |
| 411 | File.copy (Path.explode "~~/lib/browser/GraphBrowser.jar") html_prefix; | |
| 412 | List.app (fn (a, txt) => File.write (Path.append html_prefix (Path.basic a)) txt) | |
| 413 | (HTML.applet_pages name (Url.File index_path, name)); | |
| 43437 | 414 | File.copy (Path.explode "~~/etc/isabelle.css") html_prefix; | 
| 42007 | 415 | List.app finish_html thys; | 
| 416 | List.app (uncurry File.write) files; | |
| 44389 
a3b5fdfb04a3
tuned signature -- contrast physical output primitives versus Output.raw_message;
 wenzelm parents: 
43850diff
changeset | 417 |         if verbose then Output.physical_stderr ("Browser info at " ^ show_path html_prefix ^ "\n")
 | 
| 42007 | 418 | else ()) | 
| 419 | else (); | |
| 420 | ||
| 421 | val _ = | |
| 48516 
c5d0f19ef7cb
refined "document_dump_mode": "all", "tex+sty", "tex";
 wenzelm parents: 
48445diff
changeset | 422 | if dump_prefix = "" then () | 
| 
c5d0f19ef7cb
refined "document_dump_mode": "all", "tex+sty", "tex";
 wenzelm parents: 
48445diff
changeset | 423 | else | 
| 
c5d0f19ef7cb
refined "document_dump_mode": "all", "tex+sty", "tex";
 wenzelm parents: 
48445diff
changeset | 424 | let | 
| 
c5d0f19ef7cb
refined "document_dump_mode": "all", "tex+sty", "tex";
 wenzelm parents: 
48445diff
changeset | 425 | val path = Path.explode dump_prefix; | 
| 
c5d0f19ef7cb
refined "document_dump_mode": "all", "tex+sty", "tex";
 wenzelm parents: 
48445diff
changeset | 426 | val _ = prepare_sources path dump_mode; | 
| 
c5d0f19ef7cb
refined "document_dump_mode": "all", "tex+sty", "tex";
 wenzelm parents: 
48445diff
changeset | 427 | in | 
| 
c5d0f19ef7cb
refined "document_dump_mode": "all", "tex+sty", "tex";
 wenzelm parents: 
48445diff
changeset | 428 | if verbose then | 
| 
c5d0f19ef7cb
refined "document_dump_mode": "all", "tex+sty", "tex";
 wenzelm parents: 
48445diff
changeset | 429 |             Output.physical_stderr ("Document sources at " ^ show_path path ^ "\n")
 | 
| 
c5d0f19ef7cb
refined "document_dump_mode": "all", "tex+sty", "tex";
 wenzelm parents: 
48445diff
changeset | 430 | else () | 
| 
c5d0f19ef7cb
refined "document_dump_mode": "all", "tex+sty", "tex";
 wenzelm parents: 
48445diff
changeset | 431 | end; | 
| 42007 | 432 | |
| 433 | val doc_paths = | |
| 42009 
b008525c4399
parallel preparation of document variants, within separate directories;
 wenzelm parents: 
42008diff
changeset | 434 | documents |> Par_List.map (fn (name, tags) => | 
| 42007 | 435 | let | 
| 42009 
b008525c4399
parallel preparation of document variants, within separate directories;
 wenzelm parents: 
42008diff
changeset | 436 | val path = Path.append html_prefix (Path.basic name); | 
| 48543 | 437 | val _ = prepare_sources path Dump_all; | 
| 42007 | 438 | in isabelle_document true doc_format name tags path html_prefix end); | 
| 439 | val _ = | |
| 440 | if verbose then | |
| 44389 
a3b5fdfb04a3
tuned signature -- contrast physical output primitives versus Output.raw_message;
 wenzelm parents: 
43850diff
changeset | 441 | doc_paths | 
| 
a3b5fdfb04a3
tuned signature -- contrast physical output primitives versus Output.raw_message;
 wenzelm parents: 
43850diff
changeset | 442 |         |> List.app (fn doc => Output.physical_stderr ("Document at " ^ show_path doc ^ "\n"))
 | 
| 42007 | 443 | else (); | 
| 7727 | 444 | in | 
| 445 | browser_info := empty_browser_info; | |
| 15531 | 446 | session_info := NONE | 
| 42008 
7423e833a880
Present.init/finish/no_document are not thread-safe -- eliminated futile CRITICAL sections;
 wenzelm parents: 
42007diff
changeset | 447 | end); | 
| 7727 | 448 | |
| 449 | ||
| 450 | (* theory elements *) | |
| 451 | ||
| 42126 | 452 | fun init_theory name = session_default () (fn _ => init_theory_info name empty_theory_info); | 
| 7727 | 453 | |
| 27862 
8f727f7c8c1d
removed obsolete verbatim_source, results, chapter, section etc.;
 wenzelm parents: 
27491diff
changeset | 454 | fun theory_source name mk_text = | 
| 42126 | 455 | session_default () (fn _ => add_html_source name (HTML.theory_source (mk_text ()))); | 
| 7727 | 456 | |
| 9136 | 457 | fun theory_output name s = | 
| 42126 | 458 | session_default () (fn _ => add_tex_source name (Latex.isabelle_file name s)); | 
| 7727 | 459 | |
| 460 | ||
| 23899 
ab37b1f690c7
clarified init/begin_theory: no longer depend on thy_info.ML;
 wenzelm parents: 
23884diff
changeset | 461 | fun parent_link remote_path curr_session thy = | 
| 
ab37b1f690c7
clarified init/begin_theory: no longer depend on thy_info.ML;
 wenzelm parents: 
23884diff
changeset | 462 | let | 
| 
ab37b1f690c7
clarified init/begin_theory: no longer depend on thy_info.ML;
 wenzelm parents: 
23884diff
changeset | 463 |     val {name = _, session, is_local} = get_info thy;
 | 
| 
ab37b1f690c7
clarified init/begin_theory: no longer depend on thy_info.ML;
 wenzelm parents: 
23884diff
changeset | 464 | val name = Context.theory_name thy; | 
| 
ab37b1f690c7
clarified init/begin_theory: no longer depend on thy_info.ML;
 wenzelm parents: 
23884diff
changeset | 465 | val link = | 
| 
ab37b1f690c7
clarified init/begin_theory: no longer depend on thy_info.ML;
 wenzelm parents: 
23884diff
changeset | 466 | if null session then NONE | 
| 
ab37b1f690c7
clarified init/begin_theory: no longer depend on thy_info.ML;
 wenzelm parents: 
23884diff
changeset | 467 | else SOME | 
| 
ab37b1f690c7
clarified init/begin_theory: no longer depend on thy_info.ML;
 wenzelm parents: 
23884diff
changeset | 468 | (if is_some remote_path andalso not is_local then | 
| 
ab37b1f690c7
clarified init/begin_theory: no longer depend on thy_info.ML;
 wenzelm parents: 
23884diff
changeset | 469 | Url.append (the remote_path) (Url.File (Path.append (Path.make session) (html_path name))) | 
| 
ab37b1f690c7
clarified init/begin_theory: no longer depend on thy_info.ML;
 wenzelm parents: 
23884diff
changeset | 470 | else Url.File (Path.append (mk_rel_path curr_session session) (html_path name))); | 
| 
ab37b1f690c7
clarified init/begin_theory: no longer depend on thy_info.ML;
 wenzelm parents: 
23884diff
changeset | 471 | in (link, name) end; | 
| 7727 | 472 | |
| 26323 
73efc70edeef
theory loader: discontinued *attached* ML scripts;
 wenzelm parents: 
24829diff
changeset | 473 | fun begin_theory update_time dir files thy = | 
| 42126 | 474 |     session_default thy (fn {name = sess_name, session, path, html_prefix, remote_path, ...} =>
 | 
| 7727 | 475 | let | 
| 23899 
ab37b1f690c7
clarified init/begin_theory: no longer depend on thy_info.ML;
 wenzelm parents: 
23884diff
changeset | 476 | val name = Context.theory_name thy; | 
| 
ab37b1f690c7
clarified init/begin_theory: no longer depend on thy_info.ML;
 wenzelm parents: 
23884diff
changeset | 477 | val parents = Theory.parents_of thy; | 
| 
ab37b1f690c7
clarified init/begin_theory: no longer depend on thy_info.ML;
 wenzelm parents: 
23884diff
changeset | 478 | val parent_specs = map (parent_link remote_path path) parents; | 
| 7727 | 479 | |
| 37939 
965537d86fcc
discontinued special treatment of ML files -- no longer complete extensions on demand;
 wenzelm parents: 
37216diff
changeset | 480 | val files_html = files |> map (fn (raw_path, loadit) => | 
| 
965537d86fcc
discontinued special treatment of ML files -- no longer complete extensions on demand;
 wenzelm parents: 
37216diff
changeset | 481 | let | 
| 43712 
3c2c912af2ef
moved Outer_Syntax.load_thy to Thy_Load.load_thy;
 wenzelm parents: 
43437diff
changeset | 482 | val path = File.check_file (File.full_path dir raw_path); | 
| 37939 
965537d86fcc
discontinued special treatment of ML files -- no longer complete extensions on demand;
 wenzelm parents: 
37216diff
changeset | 483 | val base = Path.base path; | 
| 
965537d86fcc
discontinued special treatment of ML files -- no longer complete extensions on demand;
 wenzelm parents: 
37216diff
changeset | 484 | val base_html = html_ext base; | 
| 
965537d86fcc
discontinued special treatment of ML files -- no longer complete extensions on demand;
 wenzelm parents: 
37216diff
changeset | 485 | val _ = add_file (Path.append html_prefix base_html, | 
| 37940 
4857eab31298
generic external source files -- nothing special about ML here;
 wenzelm parents: 
37939diff
changeset | 486 | HTML.external_file (Url.File base) (File.read path)); | 
| 37939 
965537d86fcc
discontinued special treatment of ML files -- no longer complete extensions on demand;
 wenzelm parents: 
37216diff
changeset | 487 | in (Url.File base_html, Url.File raw_path, loadit) end); | 
| 7727 | 488 | |
| 489 | fun prep_html_source (tex_source, html_source, html) = | |
| 490 | let | |
| 14898 | 491 | val txt = HTML.begin_theory (Url.File index_path, session) | 
| 27491 
c8178a6a6480
begin_theory: files_html needs to be produced outside of prep_html_source to make ML files appear!
 wenzelm parents: 
27329diff
changeset | 492 | name parent_specs files_html (Buffer.content html_source) | 
| 7727 | 493 | in (tex_source, Buffer.empty, Buffer.add txt html) end; | 
| 494 | ||
| 9416 | 495 | val entry = | 
| 496 |      {name = name, ID = ID_of path name, dir = sess_name, unfold = true,
 | |
| 21858 
05f57309170c
avoid conflict with Alice keywords: renamed pack -> implode, unpack -> explode, any -> many, avoided assert;
 wenzelm parents: 
20664diff
changeset | 497 | path = Path.implode (html_path name), | 
| 23899 
ab37b1f690c7
clarified init/begin_theory: no longer depend on thy_info.ML;
 wenzelm parents: 
23884diff
changeset | 498 | parents = map ID_of_thy parents}; | 
| 7727 | 499 | in | 
| 500 | change_theory_info name prep_html_source; | |
| 24150 
ed724867099a
sort indexes according to symbolic update_time (multithreading-safe);
 wenzelm parents: 
24102diff
changeset | 501 | add_graph_entry (update_time, entry); | 
| 
ed724867099a
sort indexes according to symbolic update_time (multithreading-safe);
 wenzelm parents: 
24102diff
changeset | 502 | add_html_index (update_time, HTML.theory_entry (Url.File (html_path name), name)); | 
| 
ed724867099a
sort indexes according to symbolic update_time (multithreading-safe);
 wenzelm parents: 
24102diff
changeset | 503 | add_tex_index (update_time, Latex.theory_entry name); | 
| 27327 | 504 |     put_info {name = sess_name, session = path, is_local = is_some remote_path} thy
 | 
| 7727 | 505 | end); | 
| 506 | ||
| 507 | ||
| 508 | ||
| 42127 
8223e7f4b0da
Isabelle_System.create_tmp_path/with_tmp_file: optional extension;
 wenzelm parents: 
42126diff
changeset | 509 | (** draft document output **) | 
| 14922 | 510 | |
| 42127 
8223e7f4b0da
Isabelle_System.create_tmp_path/with_tmp_file: optional extension;
 wenzelm parents: 
42126diff
changeset | 511 | fun drafts doc_format src_paths = Isabelle_System.with_tmp_dir "drafts" (fn dir => | 
| 14922 | 512 | let | 
| 24150 
ed724867099a
sort indexes according to symbolic update_time (multithreading-safe);
 wenzelm parents: 
24102diff
changeset | 513 | fun prep_draft path i = | 
| 14935 | 514 | let | 
| 515 | val base = Path.base path; | |
| 14972 | 516 | val name = | 
| 24829 | 517 | (case Path.implode (#1 (Path.split_ext base)) of | 
| 44986 
6f27ecf2a951
unique file names via serial numbers, to allow files like "root" or multiple files with same base name;
 wenzelm parents: 
44389diff
changeset | 518 | "" => "DUMMY" | 
| 
6f27ecf2a951
unique file names via serial numbers, to allow files like "root" or multiple files with same base name;
 wenzelm parents: 
44389diff
changeset | 519 | | s => s) ^ serial_string (); | 
| 14935 | 520 | in | 
| 521 | if File.exists path then | |
| 24150 
ed724867099a
sort indexes according to symbolic update_time (multithreading-safe);
 wenzelm parents: 
24102diff
changeset | 522 | (((name, base, File.read path), (i, Latex.theory_entry name)), i + 1) | 
| 41944 
b97091ae583a
Path.print is the official way to show file-system paths to users -- note that Path.implode often indicates violation of the abstract datatype;
 wenzelm parents: 
41886diff
changeset | 523 |         else error ("Bad file: " ^ Path.print path)
 | 
| 14935 | 524 | end; | 
| 24150 
ed724867099a
sort indexes according to symbolic update_time (multithreading-safe);
 wenzelm parents: 
24102diff
changeset | 525 | val (srcs, tex_index) = split_list (fst (fold_map prep_draft src_paths 0)); | 
| 14935 | 526 | |
| 42127 
8223e7f4b0da
Isabelle_System.create_tmp_path/with_tmp_file: optional extension;
 wenzelm parents: 
42126diff
changeset | 527 | val doc_path = Path.append dir document_path; | 
| 40743 | 528 | val _ = Isabelle_System.mkdirs doc_path; | 
| 14922 | 529 | val root_path = Path.append doc_path (Path.basic "root.tex"); | 
| 21858 
05f57309170c
avoid conflict with Alice keywords: renamed pack -> implode, unpack -> explode, any -> many, avoided assert;
 wenzelm parents: 
20664diff
changeset | 530 | val _ = File.copy (Path.explode "~~/lib/texinputs/draft.tex") root_path; | 
| 40743 | 531 |     val _ = Isabelle_System.isabelle_tool "latex" ("-o sty " ^ File.shell_path root_path);
 | 
| 532 |     val _ = Isabelle_System.isabelle_tool "latex" ("-o syms " ^ File.shell_path root_path);
 | |
| 14922 | 533 | |
| 534 | fun known name = | |
| 535 | let val ss = split_lines (File.read (Path.append doc_path (Path.basic name))) | |
| 20664 | 536 | in member (op =) ss end; | 
| 14922 | 537 | val known_syms = known "syms.lst"; | 
| 538 | val known_ctrls = known "ctrls.lst"; | |
| 539 | ||
| 15570 | 540 | val _ = srcs |> List.app (fn (name, base, txt) => | 
| 14935 | 541 | Symbol.explode txt | 
| 21858 
05f57309170c
avoid conflict with Alice keywords: renamed pack -> implode, unpack -> explode, any -> many, avoided assert;
 wenzelm parents: 
20664diff
changeset | 542 | |> Latex.symbol_source (known_syms, known_ctrls) (Path.implode base) | 
| 14935 | 543 | |> File.write (Path.append doc_path (tex_path name))); | 
| 14922 | 544 | val _ = write_tex_index tex_index doc_path; | 
| 545 | ||
| 42127 
8223e7f4b0da
Isabelle_System.create_tmp_path/with_tmp_file: optional extension;
 wenzelm parents: 
42126diff
changeset | 546 | val result = isabelle_document false doc_format documentN "" doc_path dir; | 
| 
8223e7f4b0da
Isabelle_System.create_tmp_path/with_tmp_file: optional extension;
 wenzelm parents: 
42126diff
changeset | 547 | val result' = Isabelle_System.create_tmp_path documentN doc_format; | 
| 
8223e7f4b0da
Isabelle_System.create_tmp_path/with_tmp_file: optional extension;
 wenzelm parents: 
42126diff
changeset | 548 | val _ = File.copy result result'; | 
| 
8223e7f4b0da
Isabelle_System.create_tmp_path/with_tmp_file: optional extension;
 wenzelm parents: 
42126diff
changeset | 549 | in result' end); | 
| 14922 | 550 | |
| 7685 | 551 | end; | 
| 552 | ||
| 32738 | 553 | structure Basic_Present: BASIC_PRESENT = Present; | 
| 554 | open Basic_Present; |