| author | blanchet | 
| Fri, 07 Jun 2013 12:11:55 +0200 | |
| changeset 52344 | ff05e50efa0d | 
| parent 51567 | a86c5e02ba58 | 
| child 52549 | 802576856527 | 
| 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 | 
| 48804 
6348e5fca42e
more direct interpretation of document_variants for build (unchanged for usedir);
 wenzelm parents: 
48543diff
changeset | 16 | val read_variant: string -> string * string | 
| 51399 
6ac3c29a300e
discontinued "isabelle usedir" option -r (reset session path);
 wenzelm parents: 
51398diff
changeset | 17 | val init: bool -> bool -> Path.T -> string -> bool -> string -> (string * string) list -> | 
| 
6ac3c29a300e
discontinued "isabelle usedir" option -r (reset session path);
 wenzelm parents: 
51398diff
changeset | 18 | string * string -> bool * string -> bool -> theory list -> unit (*not thread-safe!*) | 
| 42008 
7423e833a880
Present.init/finish/no_document are not thread-safe -- eliminated futile CRITICAL sections;
 wenzelm parents: 
42007diff
changeset | 19 | val finish: unit -> unit (*not thread-safe!*) | 
| 7727 | 20 | val init_theory: string -> unit | 
| 27862 
8f727f7c8c1d
removed obsolete verbatim_source, results, chapter, section etc.;
 wenzelm parents: 
27491diff
changeset | 21 | val theory_source: string -> (unit -> HTML.text) -> unit | 
| 9136 | 22 | val theory_output: string -> string -> unit | 
| 51293 
05b1bbae748d
discontinued obsolete 'uses' within theory header;
 wenzelm parents: 
50707diff
changeset | 23 | val begin_theory: int -> Path.T -> theory -> theory | 
| 14922 | 24 | val drafts: string -> Path.T list -> Path.T | 
| 6203 | 25 | end; | 
| 26 | ||
| 7685 | 27 | structure Present: PRESENT = | 
| 28 | struct | |
| 29 | ||
| 7727 | 30 | |
| 31 | (** paths **) | |
| 32 | ||
| 33 | val tex_ext = Path.ext "tex"; | |
| 34 | val tex_path = tex_ext o Path.basic; | |
| 35 | val html_ext = Path.ext "html"; | |
| 36 | val html_path = html_ext o Path.basic; | |
| 37 | val index_path = Path.basic "index.html"; | |
| 11856 | 38 | val readme_html_path = Path.basic "README.html"; | 
| 17082 | 39 | val documentN = "document"; | 
| 40 | val document_path = Path.basic documentN; | |
| 8196 | 41 | val doc_indexN = "session"; | 
| 11856 | 42 | val graph_path = Path.basic "session.graph"; | 
| 43 | val graph_pdf_path = Path.basic "session_graph.pdf"; | |
| 44 | val graph_eps_path = Path.basic "session_graph.eps"; | |
| 7727 | 45 | |
| 51415 
8a33d581718b
show expanded path, to avoid odd /foo/bar/$ISABELLE_BROWSER_INFO/baz;
 wenzelm parents: 
51401diff
changeset | 46 | fun show_path path = Path.implode (Path.expand (Path.append (File.pwd ()) path)); | 
| 11856 | 47 | |
| 7727 | 48 | |
| 14922 | 49 | |
| 7727 | 50 | (** additional theory data **) | 
| 51 | ||
| 42008 
7423e833a880
Present.init/finish/no_document are not thread-safe -- eliminated futile CRITICAL sections;
 wenzelm parents: 
42007diff
changeset | 52 | structure Browser_Info = Theory_Data | 
| 22846 | 53 | ( | 
| 51399 
6ac3c29a300e
discontinued "isabelle usedir" option -r (reset session path);
 wenzelm parents: 
51398diff
changeset | 54 |   type T = {chapter: string, name: string};
 | 
| 51567 
a86c5e02ba58
proper default browser info for interactive mode, notably thy_deps;
 wenzelm parents: 
51419diff
changeset | 55 |   val empty = {chapter = "Unsorted", name = "Unknown"}: T;
 | 
| 16503 | 56 | fun extend _ = empty; | 
| 33522 | 57 | fun merge _ = empty; | 
| 22846 | 58 | ); | 
| 7727 | 59 | |
| 51567 
a86c5e02ba58
proper default browser info for interactive mode, notably thy_deps;
 wenzelm parents: 
51419diff
changeset | 60 | val _ = Context.>> (Context.map_theory | 
| 
a86c5e02ba58
proper default browser info for interactive mode, notably thy_deps;
 wenzelm parents: 
51419diff
changeset | 61 |   (Browser_Info.put {chapter = Context.PureN, name = Context.PureN}));
 | 
| 
a86c5e02ba58
proper default browser info for interactive mode, notably thy_deps;
 wenzelm parents: 
51419diff
changeset | 62 | |
| 51399 
6ac3c29a300e
discontinued "isabelle usedir" option -r (reset session path);
 wenzelm parents: 
51398diff
changeset | 63 | val session_name = #name o Browser_Info.get; | 
| 
6ac3c29a300e
discontinued "isabelle usedir" option -r (reset session path);
 wenzelm parents: 
51398diff
changeset | 64 | val session_chapter_name = (fn {chapter, name} => [chapter, name]) o Browser_Info.get;
 | 
| 24561 | 65 | |
| 7727 | 66 | |
| 67 | ||
| 68 | (** graphs **) | |
| 69 | ||
| 9416 | 70 | fun ID_of sess s = space_implode "/" (sess @ [s]); | 
| 51399 
6ac3c29a300e
discontinued "isabelle usedir" option -r (reset session path);
 wenzelm parents: 
51398diff
changeset | 71 | fun ID_of_thy thy = ID_of (session_chapter_name thy) (Context.theory_name thy); | 
| 7727 | 72 | |
| 51400 | 73 | fun theory_link (curr_chapter, curr_session) thy = | 
| 51399 
6ac3c29a300e
discontinued "isabelle usedir" option -r (reset session path);
 wenzelm parents: 
51398diff
changeset | 74 | let | 
| 51400 | 75 |     val {chapter, name = session} = Browser_Info.get thy;
 | 
| 76 | val link = html_path (Context.theory_name thy); | |
| 51399 
6ac3c29a300e
discontinued "isabelle usedir" option -r (reset session path);
 wenzelm parents: 
51398diff
changeset | 77 | in | 
| 51400 | 78 | if curr_session = session then SOME link | 
| 79 | else if curr_chapter = chapter then | |
| 80 | SOME (Path.appends [Path.parent, Path.basic session, link]) | |
| 81 | else if chapter = Context.PureN then NONE | |
| 82 | else SOME (Path.appends [Path.parent, Path.parent, Path.basic chapter, Path.basic session, link]) | |
| 51399 
6ac3c29a300e
discontinued "isabelle usedir" option -r (reset session path);
 wenzelm parents: 
51398diff
changeset | 83 | end; | 
| 23899 
ab37b1f690c7
clarified init/begin_theory: no longer depend on thy_info.ML;
 wenzelm parents: 
23884diff
changeset | 84 | |
| 
ab37b1f690c7
clarified init/begin_theory: no longer depend on thy_info.ML;
 wenzelm parents: 
23884diff
changeset | 85 | (*retrieve graph data from initial collection of theories*) | 
| 51400 | 86 | fun init_graph (curr_chapter, curr_session) = rev o map (fn thy => | 
| 7727 | 87 | let | 
| 51399 
6ac3c29a300e
discontinued "isabelle usedir" option -r (reset session path);
 wenzelm parents: 
51398diff
changeset | 88 |     val {chapter, name = session_name} = Browser_Info.get thy;
 | 
| 
6ac3c29a300e
discontinued "isabelle usedir" option -r (reset session path);
 wenzelm parents: 
51398diff
changeset | 89 | val thy_name = Context.theory_name thy; | 
| 51400 | 90 | val path = | 
| 91 | (case theory_link (curr_chapter, curr_session) thy of | |
| 92 | NONE => "" | |
| 93 | | SOME p => Path.implode p); | |
| 24150 
ed724867099a
sort indexes according to symbolic update_time (multithreading-safe);
 wenzelm parents: 
24102diff
changeset | 94 | val entry = | 
| 51399 
6ac3c29a300e
discontinued "isabelle usedir" option -r (reset session path);
 wenzelm parents: 
51398diff
changeset | 95 |      {name = thy_name,
 | 
| 
6ac3c29a300e
discontinued "isabelle usedir" option -r (reset session path);
 wenzelm parents: 
51398diff
changeset | 96 | ID = ID_of [chapter, session_name] thy_name, | 
| 
6ac3c29a300e
discontinued "isabelle usedir" option -r (reset session path);
 wenzelm parents: 
51398diff
changeset | 97 | dir = session_name, | 
| 51400 | 98 | path = path, | 
| 24150 
ed724867099a
sort indexes according to symbolic update_time (multithreading-safe);
 wenzelm parents: 
24102diff
changeset | 99 | unfold = false, | 
| 49561 | 100 | parents = map ID_of_thy (Theory.parents_of thy), | 
| 101 | content = []}; | |
| 24150 
ed724867099a
sort indexes according to symbolic update_time (multithreading-safe);
 wenzelm parents: 
24102diff
changeset | 102 | in (0, entry) end); | 
| 7727 | 103 | |
| 49561 | 104 | fun ins_graph_entry (i, entry as {ID, ...}) (gr: (int * Graph_Display.node) list) =
 | 
| 24150 
ed724867099a
sort indexes according to symbolic update_time (multithreading-safe);
 wenzelm parents: 
24102diff
changeset | 105 | (i, entry) :: filter_out (fn (_, entry') => #ID entry' = ID) gr; | 
| 7727 | 106 | |
| 107 | ||
| 108 | ||
| 109 | (** global browser info state **) | |
| 110 | ||
| 111 | (* type theory_info *) | |
| 112 | ||
| 113 | type theory_info = {tex_source: Buffer.T, html_source: Buffer.T, html: Buffer.T};
 | |
| 114 | ||
| 115 | fun make_theory_info (tex_source, html_source, html) = | |
| 116 |   {tex_source = tex_source, html_source = html_source, html = html}: theory_info;
 | |
| 117 | ||
| 118 | val empty_theory_info = make_theory_info (Buffer.empty, Buffer.empty, Buffer.empty); | |
| 119 | ||
| 120 | fun map_theory_info f {tex_source, html_source, html} =
 | |
| 121 | make_theory_info (f (tex_source, html_source, html)); | |
| 122 | ||
| 123 | ||
| 124 | (* type browser_info *) | |
| 125 | ||
| 11856 | 126 | type browser_info = {theories: theory_info Symtab.table, files: (Path.T * string) list,
 | 
| 49561 | 127 | tex_index: (int * string) list, html_index: (int * string) list, | 
| 128 | graph: (int * Graph_Display.node) list}; | |
| 7727 | 129 | |
| 11856 | 130 | fun make_browser_info (theories, files, tex_index, html_index, graph) = | 
| 131 |   {theories = theories, files = files, tex_index = tex_index, html_index = html_index,
 | |
| 9416 | 132 | graph = graph}: browser_info; | 
| 7727 | 133 | |
| 24150 
ed724867099a
sort indexes according to symbolic update_time (multithreading-safe);
 wenzelm parents: 
24102diff
changeset | 134 | val empty_browser_info = make_browser_info (Symtab.empty, [], [], [], []); | 
| 7727 | 135 | |
| 51400 | 136 | fun init_browser_info session thys = | 
| 137 | make_browser_info (Symtab.empty, [], [], [], init_graph session thys); | |
| 7727 | 138 | |
| 11856 | 139 | fun map_browser_info f {theories, files, tex_index, html_index, graph} =
 | 
| 140 | make_browser_info (f (theories, files, tex_index, html_index, graph)); | |
| 7727 | 141 | |
| 142 | ||
| 143 | (* state *) | |
| 144 | ||
| 32738 | 145 | val browser_info = Unsynchronized.ref empty_browser_info; | 
| 146 | fun change_browser_info f = | |
| 147 | CRITICAL (fn () => Unsynchronized.change browser_info (map_browser_info f)); | |
| 7727 | 148 | |
| 32738 | 149 | 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 | 150 | fun no_document f x = Unsynchronized.setmp suppress_tex_source true f x; | 
| 7727 | 151 | |
| 152 | fun init_theory_info name info = | |
| 11856 | 153 | change_browser_info (fn (theories, files, tex_index, html_index, graph) => | 
| 17412 | 154 | (Symtab.update (name, info) theories, files, tex_index, html_index, graph)); | 
| 7727 | 155 | |
| 156 | fun change_theory_info name f = | |
| 42010 | 157 | change_browser_info (fn (theories, files, tex_index, html_index, graph) => | 
| 17412 | 158 | (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 | 159 |       NONE => error ("Browser info: cannot access theory document " ^ quote name)
 | 
| 17412 | 160 | | SOME info => (Symtab.update (name, map_theory_info f info) theories, files, | 
| 9416 | 161 | tex_index, html_index, graph))); | 
| 7727 | 162 | |
| 163 | ||
| 11856 | 164 | fun add_file file = | 
| 165 | change_browser_info (fn (theories, files, tex_index, html_index, graph) => | |
| 166 | (theories, file :: files, tex_index, html_index, graph)); | |
| 167 | ||
| 7727 | 168 | fun add_tex_index txt = | 
| 11856 | 169 | 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 | 170 | (theories, files, txt :: tex_index, html_index, graph)); | 
| 7727 | 171 | |
| 172 | fun add_html_index txt = | |
| 11856 | 173 | 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 | 174 | (theories, files, tex_index, txt :: html_index, graph)); | 
| 7727 | 175 | |
| 24150 
ed724867099a
sort indexes according to symbolic update_time (multithreading-safe);
 wenzelm parents: 
24102diff
changeset | 176 | fun add_graph_entry entry = | 
| 11856 | 177 | 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 | 178 | (theories, files, tex_index, html_index, ins_graph_entry entry graph)); | 
| 7727 | 179 | |
| 11057 | 180 | fun add_tex_source name txt = | 
| 181 | if ! suppress_tex_source then () | |
| 182 | else change_theory_info name (fn (tex_source, html_source, html) => | |
| 183 | (Buffer.add txt tex_source, html_source, html)); | |
| 7727 | 184 | |
| 185 | fun add_html_source name txt = change_theory_info name (fn (tex_source, html_source, html) => | |
| 186 | (tex_source, Buffer.add txt html_source, html)); | |
| 187 | ||
| 188 | ||
| 189 | ||
| 190 | (** global session state **) | |
| 191 | ||
| 192 | (* session_info *) | |
| 193 | ||
| 194 | type session_info = | |
| 51399 
6ac3c29a300e
discontinued "isabelle usedir" option -r (reset session path);
 wenzelm parents: 
51398diff
changeset | 195 |   {name: string, chapter: string, info_path: Path.T,
 | 
| 48805 
c3ea910b3581
explicit document_output directory, without implicit purge of default in ISABELLE_BROWSER_INFO;
 wenzelm parents: 
48804diff
changeset | 196 | info: bool, doc_format: string, doc_graph: bool, doc_output: Path.T option, | 
| 51398 
c3d02b3518c2
discontinued "isabelle usedir" option -P (remote path);
 wenzelm parents: 
51293diff
changeset | 197 | documents: (string * string) list, doc_dump: (bool * string), verbose: bool, | 
| 
c3d02b3518c2
discontinued "isabelle usedir" option -P (remote path);
 wenzelm parents: 
51293diff
changeset | 198 | readme: Path.T option}; | 
| 7727 | 199 | |
| 9416 | 200 | fun make_session_info | 
| 51399 
6ac3c29a300e
discontinued "isabelle usedir" option -r (reset session path);
 wenzelm parents: 
51398diff
changeset | 201 | (name, chapter, info_path, info, doc_format, doc_graph, doc_output, | 
| 51398 
c3d02b3518c2
discontinued "isabelle usedir" option -P (remote path);
 wenzelm parents: 
51293diff
changeset | 202 | documents, doc_dump, verbose, readme) = | 
| 51399 
6ac3c29a300e
discontinued "isabelle usedir" option -r (reset session path);
 wenzelm parents: 
51398diff
changeset | 203 |   {name = name, chapter = chapter, info_path = info_path, info = info,
 | 
| 
6ac3c29a300e
discontinued "isabelle usedir" option -r (reset session path);
 wenzelm parents: 
51398diff
changeset | 204 | doc_format = doc_format, doc_graph = doc_graph, doc_output = doc_output, | 
| 51398 
c3d02b3518c2
discontinued "isabelle usedir" option -P (remote path);
 wenzelm parents: 
51293diff
changeset | 205 | documents = documents, doc_dump = doc_dump, verbose = verbose, | 
| 
c3d02b3518c2
discontinued "isabelle usedir" option -P (remote path);
 wenzelm parents: 
51293diff
changeset | 206 | readme = readme}: session_info; | 
| 7685 | 207 | |
| 208 | ||
| 7727 | 209 | (* state *) | 
| 210 | ||
| 32738 | 211 | val session_info = Unsynchronized.ref (NONE: session_info option); | 
| 7727 | 212 | |
| 51399 
6ac3c29a300e
discontinued "isabelle usedir" option -r (reset session path);
 wenzelm parents: 
51398diff
changeset | 213 | fun with_session_info x f = (case ! session_info of NONE => x | SOME info => f info); | 
| 7727 | 214 | |
| 215 | ||
| 216 | ||
| 14922 | 217 | (** document preparation **) | 
| 7727 | 218 | |
| 42004 | 219 | (* document variants *) | 
| 17082 | 220 | |
| 42004 | 221 | fun read_variant str = | 
| 17082 | 222 | (case space_explode "=" str of | 
| 223 | [name] => (name, "") | |
| 224 | | [name, tags] => (name, tags) | |
| 42004 | 225 |   | _ => error ("Malformed document variant specification: " ^ quote str));
 | 
| 17082 | 226 | |
| 227 | ||
| 7727 | 228 | (* init session *) | 
| 229 | ||
| 51399 
6ac3c29a300e
discontinued "isabelle usedir" option -r (reset session path);
 wenzelm parents: 
51398diff
changeset | 230 | fun init build info info_path doc doc_graph document_output doc_variants | 
| 
6ac3c29a300e
discontinued "isabelle usedir" option -r (reset session path);
 wenzelm parents: 
51398diff
changeset | 231 | (chapter, name) (doc_dump as (_, dump_prefix)) verbose thys = | 
| 48516 
c5d0f19ef7cb
refined "document_dump_mode": "all", "tex+sty", "tex";
 wenzelm parents: 
48445diff
changeset | 232 | if not build andalso not info andalso doc = "" andalso dump_prefix = "" then | 
| 15531 | 233 | (browser_info := empty_browser_info; session_info := NONE) | 
| 11856 | 234 | else | 
| 235 | let | |
| 51399 
6ac3c29a300e
discontinued "isabelle usedir" option -r (reset session path);
 wenzelm parents: 
51398diff
changeset | 236 | val doc_output = | 
| 
6ac3c29a300e
discontinued "isabelle usedir" option -r (reset session path);
 wenzelm parents: 
51398diff
changeset | 237 | if document_output = "" then NONE else SOME (Path.explode document_output); | 
| 7727 | 238 | |
| 42007 | 239 | val documents = | 
| 240 | if doc = "" then [] | |
| 42005 | 241 | 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 | 242 | (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 | 243 | else (); []) | 
| 48804 
6348e5fca42e
more direct interpretation of document_variants for build (unchanged for usedir);
 wenzelm parents: 
48543diff
changeset | 244 | else doc_variants; | 
| 7727 | 245 | |
| 51419 
5313abe76bd4
include only README.html, not historic README, which tends towards surprises like src/HOL/SPARK/Examples/README;
 wenzelm parents: 
51415diff
changeset | 246 | val readme = if File.exists readme_html_path then SOME readme_html_path else NONE; | 
| 7727 | 247 | |
| 17082 | 248 | val docs = | 
| 249 | (case readme of NONE => [] | SOME p => [(Url.File p, "README")]) @ | |
| 42007 | 250 | map (fn (name, _) => (Url.File (Path.ext doc (Path.basic name)), name)) documents; | 
| 11856 | 251 | in | 
| 42007 | 252 | session_info := | 
| 51399 
6ac3c29a300e
discontinued "isabelle usedir" option -r (reset session path);
 wenzelm parents: 
51398diff
changeset | 253 | SOME (make_session_info (name, chapter, info_path, info, doc, | 
| 51398 
c3d02b3518c2
discontinued "isabelle usedir" option -P (remote path);
 wenzelm parents: 
51293diff
changeset | 254 | doc_graph, doc_output, documents, doc_dump, verbose, readme)); | 
| 51400 | 255 | browser_info := init_browser_info (chapter, name) thys; | 
| 51401 | 256 | add_html_index (0, HTML.begin_session_index name docs (Url.explode "medium.html")) | 
| 42008 
7423e833a880
Present.init/finish/no_document are not thread-safe -- eliminated futile CRITICAL sections;
 wenzelm parents: 
42007diff
changeset | 257 | end; | 
| 7727 | 258 | |
| 259 | ||
| 28496 
4cff10648928
renamed isatool to isabelle_tool in programming interfaces;
 wenzelm parents: 
28375diff
changeset | 260 | (* isabelle tool wrappers *) | 
| 17082 | 261 | |
| 48805 
c3ea910b3581
explicit document_output directory, without implicit purge of default in ISABELLE_BROWSER_INFO;
 wenzelm parents: 
48804diff
changeset | 262 | fun isabelle_document {verbose, purge} format name tags dir =
 | 
| 17082 | 263 | let | 
| 48805 
c3ea910b3581
explicit document_output directory, without implicit purge of default in ISABELLE_BROWSER_INFO;
 wenzelm parents: 
48804diff
changeset | 264 | val s = "\"$ISABELLE_TOOL\" document" ^ (if purge then " -c" else "") ^ " -o '" ^ format ^ "' \ | 
| 
c3ea910b3581
explicit document_output directory, without implicit purge of default in ISABELLE_BROWSER_INFO;
 wenzelm parents: 
48804diff
changeset | 265 | \-n '" ^ name ^ "' -t '" ^ tags ^ "' " ^ File.shell_path dir ^ " 2>&1"; | 
| 
c3ea910b3581
explicit document_output directory, without implicit purge of default in ISABELLE_BROWSER_INFO;
 wenzelm parents: 
48804diff
changeset | 266 | val doc_path = Path.appends [dir, Path.parent, Path.basic name |> Path.ext format]; | 
| 33682 
0c5d1485dea7
isabelle_document: more explicit error output, notably for drafts;
 wenzelm parents: 
33522diff
changeset | 267 | val _ = if verbose then writeln s else (); | 
| 43850 
7f2cbc713344
moved bash operations to Isabelle_System (cf. Scala version);
 wenzelm parents: 
43712diff
changeset | 268 | val (out, rc) = Isabelle_System.bash_output s; | 
| 33682 
0c5d1485dea7
isabelle_document: more explicit error output, notably for drafts;
 wenzelm parents: 
33522diff
changeset | 269 | val _ = | 
| 
0c5d1485dea7
isabelle_document: more explicit error output, notably for drafts;
 wenzelm parents: 
33522diff
changeset | 270 | if not (File.exists doc_path) orelse rc <> 0 then | 
| 
0c5d1485dea7
isabelle_document: more explicit error output, notably for drafts;
 wenzelm parents: 
33522diff
changeset | 271 |         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 | 272 | else if verbose then writeln out | 
| 
0c5d1485dea7
isabelle_document: more explicit error output, notably for drafts;
 wenzelm parents: 
33522diff
changeset | 273 | else (); | 
| 
0c5d1485dea7
isabelle_document: more explicit error output, notably for drafts;
 wenzelm parents: 
33522diff
changeset | 274 | in doc_path end; | 
| 17082 | 275 | |
| 42127 
8223e7f4b0da
Isabelle_System.create_tmp_path/with_tmp_file: optional extension;
 wenzelm parents: 
42126diff
changeset | 276 | fun isabelle_browser graph = Isabelle_System.with_tmp_dir "browser" (fn dir => | 
| 17082 | 277 | let | 
| 42127 
8223e7f4b0da
Isabelle_System.create_tmp_path/with_tmp_file: optional extension;
 wenzelm parents: 
42126diff
changeset | 278 | val pdf_path = Path.append dir graph_pdf_path; | 
| 
8223e7f4b0da
Isabelle_System.create_tmp_path/with_tmp_file: optional extension;
 wenzelm parents: 
42126diff
changeset | 279 | val eps_path = Path.append dir graph_eps_path; | 
| 
8223e7f4b0da
Isabelle_System.create_tmp_path/with_tmp_file: optional extension;
 wenzelm parents: 
42126diff
changeset | 280 | val graph_path = Path.append dir graph_path; | 
| 49565 
ea4308b7ef0f
ML support for generic graph display, with browser and graphview backends (via print modes);
 wenzelm parents: 
49561diff
changeset | 281 | val _ = Graph_Display.write_graph_browser graph_path graph; | 
| 42127 
8223e7f4b0da
Isabelle_System.create_tmp_path/with_tmp_file: optional extension;
 wenzelm parents: 
42126diff
changeset | 282 | val args = "-o " ^ File.shell_path pdf_path ^ " " ^ File.shell_path graph_path; | 
| 17082 | 283 | in | 
| 42127 
8223e7f4b0da
Isabelle_System.create_tmp_path/with_tmp_file: optional extension;
 wenzelm parents: 
42126diff
changeset | 284 | if Isabelle_System.isabelle_tool "browser" args = 0 andalso | 
| 
8223e7f4b0da
Isabelle_System.create_tmp_path/with_tmp_file: optional extension;
 wenzelm parents: 
42126diff
changeset | 285 | File.exists pdf_path andalso File.exists eps_path | 
| 
8223e7f4b0da
Isabelle_System.create_tmp_path/with_tmp_file: optional extension;
 wenzelm parents: 
42126diff
changeset | 286 | then (File.read pdf_path, File.read eps_path) | 
| 
8223e7f4b0da
Isabelle_System.create_tmp_path/with_tmp_file: optional extension;
 wenzelm parents: 
42126diff
changeset | 287 | else error "Failed to prepare dependency graph" | 
| 
8223e7f4b0da
Isabelle_System.create_tmp_path/with_tmp_file: optional extension;
 wenzelm parents: 
42126diff
changeset | 288 | end); | 
| 17082 | 289 | |
| 290 | ||
| 11856 | 291 | (* finish session -- output all generated text *) | 
| 292 | ||
| 24150 
ed724867099a
sort indexes according to symbolic update_time (multithreading-safe);
 wenzelm parents: 
24102diff
changeset | 293 | 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 | 294 | 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 | 295 | |
| 14922 | 296 | fun write_tex src name path = | 
| 28027 | 297 | File.write_buffer (Path.append path (tex_path name)) src; | 
| 14922 | 298 | |
| 299 | fun write_tex_index tex_index path = | |
| 24150 
ed724867099a
sort indexes according to symbolic update_time (multithreading-safe);
 wenzelm parents: 
24102diff
changeset | 300 | write_tex (index_buffer tex_index |> Buffer.add Latex.tex_trailer) doc_indexN path; | 
| 14922 | 301 | |
| 7685 | 302 | |
| 42008 
7423e833a880
Present.init/finish/no_document are not thread-safe -- eliminated futile CRITICAL sections;
 wenzelm parents: 
42007diff
changeset | 303 | fun finish () = | 
| 51399 
6ac3c29a300e
discontinued "isabelle usedir" option -r (reset session path);
 wenzelm parents: 
51398diff
changeset | 304 |   with_session_info () (fn {name, chapter, info, info_path, doc_format, doc_graph, doc_output,
 | 
| 
6ac3c29a300e
discontinued "isabelle usedir" option -r (reset session path);
 wenzelm parents: 
51398diff
changeset | 305 | documents, doc_dump = (dump_copy, dump_prefix), verbose, readme, ...} => | 
| 7727 | 306 | let | 
| 11856 | 307 |     val {theories, files, tex_index, html_index, graph} = ! browser_info;
 | 
| 308 | val thys = Symtab.dest theories; | |
| 51399 
6ac3c29a300e
discontinued "isabelle usedir" option -r (reset session path);
 wenzelm parents: 
51398diff
changeset | 309 | |
| 
6ac3c29a300e
discontinued "isabelle usedir" option -r (reset session path);
 wenzelm parents: 
51398diff
changeset | 310 | val chapter_prefix = Path.append info_path (Path.basic chapter); | 
| 
6ac3c29a300e
discontinued "isabelle usedir" option -r (reset session path);
 wenzelm parents: 
51398diff
changeset | 311 | val session_prefix = Path.append chapter_prefix (Path.basic name); | 
| 7727 | 312 | |
| 11856 | 313 |     fun finish_html (a, {html, ...}: theory_info) =
 | 
| 51399 
6ac3c29a300e
discontinued "isabelle usedir" option -r (reset session path);
 wenzelm parents: 
51398diff
changeset | 314 | File.write_buffer (Path.append session_prefix (html_path a)) | 
| 
6ac3c29a300e
discontinued "isabelle usedir" option -r (reset session path);
 wenzelm parents: 
51398diff
changeset | 315 | (Buffer.add HTML.end_document html); | 
| 11856 | 316 | |
| 24150 
ed724867099a
sort indexes according to symbolic update_time (multithreading-safe);
 wenzelm parents: 
24102diff
changeset | 317 | val sorted_graph = sorted_index graph; | 
| 11856 | 318 | val opt_graphs = | 
| 48516 
c5d0f19ef7cb
refined "document_dump_mode": "all", "tex+sty", "tex";
 wenzelm parents: 
48445diff
changeset | 319 | 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 | 320 | SOME (isabelle_browser sorted_graph) | 
| 15531 | 321 | else NONE; | 
| 11856 | 322 | |
| 42007 | 323 | val _ = | 
| 324 | if info then | |
| 51399 
6ac3c29a300e
discontinued "isabelle usedir" option -r (reset session path);
 wenzelm parents: 
51398diff
changeset | 325 | (Isabelle_System.mkdirs session_prefix; | 
| 
6ac3c29a300e
discontinued "isabelle usedir" option -r (reset session path);
 wenzelm parents: 
51398diff
changeset | 326 | File.write_buffer (Path.append session_prefix index_path) | 
| 
6ac3c29a300e
discontinued "isabelle usedir" option -r (reset session path);
 wenzelm parents: 
51398diff
changeset | 327 | (index_buffer html_index |> Buffer.add HTML.end_document); | 
| 
6ac3c29a300e
discontinued "isabelle usedir" option -r (reset session path);
 wenzelm parents: 
51398diff
changeset | 328 | (case readme of NONE => () | SOME path => File.copy path session_prefix); | 
| 
6ac3c29a300e
discontinued "isabelle usedir" option -r (reset session path);
 wenzelm parents: 
51398diff
changeset | 329 | Graph_Display.write_graph_browser (Path.append session_prefix graph_path) sorted_graph; | 
| 42007 | 330 | Isabelle_System.isabelle_tool "browser" "-b"; | 
| 51399 
6ac3c29a300e
discontinued "isabelle usedir" option -r (reset session path);
 wenzelm parents: 
51398diff
changeset | 331 | File.copy (Path.explode "~~/lib/browser/GraphBrowser.jar") session_prefix; | 
| 
6ac3c29a300e
discontinued "isabelle usedir" option -r (reset session path);
 wenzelm parents: 
51398diff
changeset | 332 | List.app (fn (a, txt) => File.write (Path.append session_prefix (Path.basic a)) txt) | 
| 42007 | 333 | (HTML.applet_pages name (Url.File index_path, name)); | 
| 51399 
6ac3c29a300e
discontinued "isabelle usedir" option -r (reset session path);
 wenzelm parents: 
51398diff
changeset | 334 | File.copy (Path.explode "~~/etc/isabelle.css") session_prefix; | 
| 42007 | 335 | List.app finish_html thys; | 
| 336 | List.app (uncurry File.write) files; | |
| 51399 
6ac3c29a300e
discontinued "isabelle usedir" option -r (reset session path);
 wenzelm parents: 
51398diff
changeset | 337 |         if verbose then Output.physical_stderr ("Browser info at " ^ show_path session_prefix ^ "\n")
 | 
| 42007 | 338 | else ()) | 
| 339 | else (); | |
| 340 | ||
| 50121 
97d2b77313a0
isabelle build no longer supports document_dump/document_dump_mode (no INCOMPATIBILITY, since it was never in official release);
 wenzelm parents: 
49565diff
changeset | 341 | fun prepare_sources doc_copy doc_dir = | 
| 48933 | 342 | (Isabelle_System.mkdirs doc_dir; | 
| 50121 
97d2b77313a0
isabelle build no longer supports document_dump/document_dump_mode (no INCOMPATIBILITY, since it was never in official release);
 wenzelm parents: 
49565diff
changeset | 343 | if doc_copy then Isabelle_System.copy_dir document_path doc_dir else (); | 
| 
97d2b77313a0
isabelle build no longer supports document_dump/document_dump_mode (no INCOMPATIBILITY, since it was never in official release);
 wenzelm parents: 
49565diff
changeset | 344 | Isabelle_System.isabelle_tool "latex" | 
| 
97d2b77313a0
isabelle build no longer supports document_dump/document_dump_mode (no INCOMPATIBILITY, since it was never in official release);
 wenzelm parents: 
49565diff
changeset | 345 |         ("-o sty " ^ File.shell_path (Path.append doc_dir (Path.basic "root.tex")));
 | 
| 48933 | 346 | (case opt_graphs of NONE => () | SOME (pdf, eps) => | 
| 347 | (File.write (Path.append doc_dir graph_pdf_path) pdf; | |
| 348 | File.write (Path.append doc_dir graph_eps_path) eps)); | |
| 349 | write_tex_index tex_index doc_dir; | |
| 350 |       List.app (fn (a, {tex_source, ...}) => write_tex tex_source a doc_dir) thys);
 | |
| 351 | ||
| 42007 | 352 | val _ = | 
| 48516 
c5d0f19ef7cb
refined "document_dump_mode": "all", "tex+sty", "tex";
 wenzelm parents: 
48445diff
changeset | 353 | if dump_prefix = "" then () | 
| 
c5d0f19ef7cb
refined "document_dump_mode": "all", "tex+sty", "tex";
 wenzelm parents: 
48445diff
changeset | 354 | else | 
| 
c5d0f19ef7cb
refined "document_dump_mode": "all", "tex+sty", "tex";
 wenzelm parents: 
48445diff
changeset | 355 | let | 
| 
c5d0f19ef7cb
refined "document_dump_mode": "all", "tex+sty", "tex";
 wenzelm parents: 
48445diff
changeset | 356 | val path = Path.explode dump_prefix; | 
| 50121 
97d2b77313a0
isabelle build no longer supports document_dump/document_dump_mode (no INCOMPATIBILITY, since it was never in official release);
 wenzelm parents: 
49565diff
changeset | 357 | val _ = prepare_sources dump_copy path; | 
| 48516 
c5d0f19ef7cb
refined "document_dump_mode": "all", "tex+sty", "tex";
 wenzelm parents: 
48445diff
changeset | 358 | in | 
| 
c5d0f19ef7cb
refined "document_dump_mode": "all", "tex+sty", "tex";
 wenzelm parents: 
48445diff
changeset | 359 | if verbose then | 
| 
c5d0f19ef7cb
refined "document_dump_mode": "all", "tex+sty", "tex";
 wenzelm parents: 
48445diff
changeset | 360 |             Output.physical_stderr ("Document sources at " ^ show_path path ^ "\n")
 | 
| 
c5d0f19ef7cb
refined "document_dump_mode": "all", "tex+sty", "tex";
 wenzelm parents: 
48445diff
changeset | 361 | else () | 
| 
c5d0f19ef7cb
refined "document_dump_mode": "all", "tex+sty", "tex";
 wenzelm parents: 
48445diff
changeset | 362 | end; | 
| 42007 | 363 | |
| 48935 
4c92a2f310b6
clarified document directories: browser_info as backdrop vs. optional output directory in the foreground;
 wenzelm parents: 
48933diff
changeset | 364 | fun document_job doc_prefix backdrop (name, tags) = | 
| 
4c92a2f310b6
clarified document directories: browser_info as backdrop vs. optional output directory in the foreground;
 wenzelm parents: 
48933diff
changeset | 365 | let | 
| 
4c92a2f310b6
clarified document directories: browser_info as backdrop vs. optional output directory in the foreground;
 wenzelm parents: 
48933diff
changeset | 366 | val _ = | 
| 
4c92a2f310b6
clarified document directories: browser_info as backdrop vs. optional output directory in the foreground;
 wenzelm parents: 
48933diff
changeset | 367 | File.eq (document_path, doc_prefix) andalso | 
| 
4c92a2f310b6
clarified document directories: browser_info as backdrop vs. optional output directory in the foreground;
 wenzelm parents: 
48933diff
changeset | 368 |             error ("Overlap of document input and output directory " ^ Path.print doc_prefix);
 | 
| 
4c92a2f310b6
clarified document directories: browser_info as backdrop vs. optional output directory in the foreground;
 wenzelm parents: 
48933diff
changeset | 369 | val dir = Path.append doc_prefix (Path.basic name); | 
| 50121 
97d2b77313a0
isabelle build no longer supports document_dump/document_dump_mode (no INCOMPATIBILITY, since it was never in official release);
 wenzelm parents: 
49565diff
changeset | 370 | val copy = not (File.eq (document_path, dir)); | 
| 
97d2b77313a0
isabelle build no longer supports document_dump/document_dump_mode (no INCOMPATIBILITY, since it was never in official release);
 wenzelm parents: 
49565diff
changeset | 371 | val _ = prepare_sources copy dir; | 
| 48935 
4c92a2f310b6
clarified document directories: browser_info as backdrop vs. optional output directory in the foreground;
 wenzelm parents: 
48933diff
changeset | 372 | fun inform doc = | 
| 
4c92a2f310b6
clarified document directories: browser_info as backdrop vs. optional output directory in the foreground;
 wenzelm parents: 
48933diff
changeset | 373 | if verbose orelse not backdrop then | 
| 
4c92a2f310b6
clarified document directories: browser_info as backdrop vs. optional output directory in the foreground;
 wenzelm parents: 
48933diff
changeset | 374 |             Output.physical_stderr ("Document at " ^ show_path doc ^ "\n")
 | 
| 
4c92a2f310b6
clarified document directories: browser_info as backdrop vs. optional output directory in the foreground;
 wenzelm parents: 
48933diff
changeset | 375 | else (); | 
| 
4c92a2f310b6
clarified document directories: browser_info as backdrop vs. optional output directory in the foreground;
 wenzelm parents: 
48933diff
changeset | 376 | in | 
| 
4c92a2f310b6
clarified document directories: browser_info as backdrop vs. optional output directory in the foreground;
 wenzelm parents: 
48933diff
changeset | 377 | fn () => | 
| 
4c92a2f310b6
clarified document directories: browser_info as backdrop vs. optional output directory in the foreground;
 wenzelm parents: 
48933diff
changeset | 378 |           (isabelle_document {verbose = true, purge = backdrop} doc_format name tags dir, inform)
 | 
| 
4c92a2f310b6
clarified document directories: browser_info as backdrop vs. optional output directory in the foreground;
 wenzelm parents: 
48933diff
changeset | 379 | end; | 
| 
4c92a2f310b6
clarified document directories: browser_info as backdrop vs. optional output directory in the foreground;
 wenzelm parents: 
48933diff
changeset | 380 | |
| 
4c92a2f310b6
clarified document directories: browser_info as backdrop vs. optional output directory in the foreground;
 wenzelm parents: 
48933diff
changeset | 381 | val jobs = | 
| 
4c92a2f310b6
clarified document directories: browser_info as backdrop vs. optional output directory in the foreground;
 wenzelm parents: 
48933diff
changeset | 382 | (if info orelse is_none doc_output then | 
| 51399 
6ac3c29a300e
discontinued "isabelle usedir" option -r (reset session path);
 wenzelm parents: 
51398diff
changeset | 383 | map (document_job session_prefix true) documents | 
| 48935 
4c92a2f310b6
clarified document directories: browser_info as backdrop vs. optional output directory in the foreground;
 wenzelm parents: 
48933diff
changeset | 384 | else []) @ | 
| 
4c92a2f310b6
clarified document directories: browser_info as backdrop vs. optional output directory in the foreground;
 wenzelm parents: 
48933diff
changeset | 385 | (case doc_output of | 
| 
4c92a2f310b6
clarified document directories: browser_info as backdrop vs. optional output directory in the foreground;
 wenzelm parents: 
48933diff
changeset | 386 | NONE => [] | 
| 
4c92a2f310b6
clarified document directories: browser_info as backdrop vs. optional output directory in the foreground;
 wenzelm parents: 
48933diff
changeset | 387 | | SOME path => map (document_job path false) documents); | 
| 
4c92a2f310b6
clarified document directories: browser_info as backdrop vs. optional output directory in the foreground;
 wenzelm parents: 
48933diff
changeset | 388 | |
| 
4c92a2f310b6
clarified document directories: browser_info as backdrop vs. optional output directory in the foreground;
 wenzelm parents: 
48933diff
changeset | 389 | val _ = jobs |> Par_List.map (fn job => job ()) |> List.app (op |>); | 
| 7727 | 390 | in | 
| 391 | browser_info := empty_browser_info; | |
| 15531 | 392 | session_info := NONE | 
| 42008 
7423e833a880
Present.init/finish/no_document are not thread-safe -- eliminated futile CRITICAL sections;
 wenzelm parents: 
42007diff
changeset | 393 | end); | 
| 7727 | 394 | |
| 395 | ||
| 396 | (* theory elements *) | |
| 397 | ||
| 51399 
6ac3c29a300e
discontinued "isabelle usedir" option -r (reset session path);
 wenzelm parents: 
51398diff
changeset | 398 | fun init_theory name = with_session_info () (fn _ => init_theory_info name empty_theory_info); | 
| 7727 | 399 | |
| 27862 
8f727f7c8c1d
removed obsolete verbatim_source, results, chapter, section etc.;
 wenzelm parents: 
27491diff
changeset | 400 | fun theory_source name mk_text = | 
| 51399 
6ac3c29a300e
discontinued "isabelle usedir" option -r (reset session path);
 wenzelm parents: 
51398diff
changeset | 401 | with_session_info () (fn _ => add_html_source name (HTML.theory_source (mk_text ()))); | 
| 7727 | 402 | |
| 9136 | 403 | fun theory_output name s = | 
| 51399 
6ac3c29a300e
discontinued "isabelle usedir" option -r (reset session path);
 wenzelm parents: 
51398diff
changeset | 404 | with_session_info () (fn _ => add_tex_source name (Latex.isabelle_file name s)); | 
| 7727 | 405 | |
| 406 | ||
| 51399 
6ac3c29a300e
discontinued "isabelle usedir" option -r (reset session path);
 wenzelm parents: 
51398diff
changeset | 407 | fun begin_theory update_time dir thy = | 
| 
6ac3c29a300e
discontinued "isabelle usedir" option -r (reset session path);
 wenzelm parents: 
51398diff
changeset | 408 |     with_session_info thy (fn {name = session_name, chapter, info_path, ...} =>
 | 
| 23899 
ab37b1f690c7
clarified init/begin_theory: no longer depend on thy_info.ML;
 wenzelm parents: 
23884diff
changeset | 409 | let | 
| 
ab37b1f690c7
clarified init/begin_theory: no longer depend on thy_info.ML;
 wenzelm parents: 
23884diff
changeset | 410 | val name = Context.theory_name thy; | 
| 
ab37b1f690c7
clarified init/begin_theory: no longer depend on thy_info.ML;
 wenzelm parents: 
23884diff
changeset | 411 | val parents = Theory.parents_of thy; | 
| 51399 
6ac3c29a300e
discontinued "isabelle usedir" option -r (reset session path);
 wenzelm parents: 
51398diff
changeset | 412 | val parent_specs = parents |> map (fn parent => | 
| 51400 | 413 | (Option.map Url.File (theory_link (chapter, session_name) parent), | 
| 414 | (Context.theory_name parent))); | |
| 7727 | 415 | |
| 51293 
05b1bbae748d
discontinued obsolete 'uses' within theory header;
 wenzelm parents: 
50707diff
changeset | 416 | val files = []; (* FIXME *) | 
| 37939 
965537d86fcc
discontinued special treatment of ML files -- no longer complete extensions on demand;
 wenzelm parents: 
37216diff
changeset | 417 | 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 | 418 | let | 
| 43712 
3c2c912af2ef
moved Outer_Syntax.load_thy to Thy_Load.load_thy;
 wenzelm parents: 
43437diff
changeset | 419 | 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 | 420 | val base = Path.base path; | 
| 
965537d86fcc
discontinued special treatment of ML files -- no longer complete extensions on demand;
 wenzelm parents: 
37216diff
changeset | 421 | val base_html = html_ext base; | 
| 51399 
6ac3c29a300e
discontinued "isabelle usedir" option -r (reset session path);
 wenzelm parents: 
51398diff
changeset | 422 | (* FIXME retain file path!? *) | 
| 
6ac3c29a300e
discontinued "isabelle usedir" option -r (reset session path);
 wenzelm parents: 
51398diff
changeset | 423 | val session_prefix = Path.appends [info_path, Path.basic chapter, Path.basic name]; | 
| 
6ac3c29a300e
discontinued "isabelle usedir" option -r (reset session path);
 wenzelm parents: 
51398diff
changeset | 424 | val _ = | 
| 
6ac3c29a300e
discontinued "isabelle usedir" option -r (reset session path);
 wenzelm parents: 
51398diff
changeset | 425 | add_file (Path.append session_prefix base_html, | 
| 
6ac3c29a300e
discontinued "isabelle usedir" option -r (reset session path);
 wenzelm parents: 
51398diff
changeset | 426 | 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 | 427 | in (Url.File base_html, Url.File raw_path, loadit) end); | 
| 7727 | 428 | |
| 429 | fun prep_html_source (tex_source, html_source, html) = | |
| 51399 
6ac3c29a300e
discontinued "isabelle usedir" option -r (reset session path);
 wenzelm parents: 
51398diff
changeset | 430 | let val txt = HTML.begin_theory name parent_specs files_html (Buffer.content html_source) | 
| 7727 | 431 | in (tex_source, Buffer.empty, Buffer.add txt html) end; | 
| 432 | ||
| 9416 | 433 | val entry = | 
| 51400 | 434 |      {name = name,
 | 
| 435 | ID = ID_of [chapter, session_name] name, | |
| 436 | dir = session_name, | |
| 437 | unfold = true, | |
| 21858 
05f57309170c
avoid conflict with Alice keywords: renamed pack -> implode, unpack -> explode, any -> many, avoided assert;
 wenzelm parents: 
20664diff
changeset | 438 | path = Path.implode (html_path name), | 
| 49561 | 439 | parents = map ID_of_thy parents, | 
| 440 | content = []}; | |
| 7727 | 441 | in | 
| 442 | change_theory_info name prep_html_source; | |
| 24150 
ed724867099a
sort indexes according to symbolic update_time (multithreading-safe);
 wenzelm parents: 
24102diff
changeset | 443 | add_graph_entry (update_time, entry); | 
| 
ed724867099a
sort indexes according to symbolic update_time (multithreading-safe);
 wenzelm parents: 
24102diff
changeset | 444 | 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 | 445 | add_tex_index (update_time, Latex.theory_entry name); | 
| 51399 
6ac3c29a300e
discontinued "isabelle usedir" option -r (reset session path);
 wenzelm parents: 
51398diff
changeset | 446 |     Browser_Info.put {chapter = chapter, name = session_name} thy
 | 
| 7727 | 447 | end); | 
| 448 | ||
| 449 | ||
| 450 | ||
| 42127 
8223e7f4b0da
Isabelle_System.create_tmp_path/with_tmp_file: optional extension;
 wenzelm parents: 
42126diff
changeset | 451 | (** draft document output **) | 
| 14922 | 452 | |
| 42127 
8223e7f4b0da
Isabelle_System.create_tmp_path/with_tmp_file: optional extension;
 wenzelm parents: 
42126diff
changeset | 453 | fun drafts doc_format src_paths = Isabelle_System.with_tmp_dir "drafts" (fn dir => | 
| 14922 | 454 | let | 
| 24150 
ed724867099a
sort indexes according to symbolic update_time (multithreading-safe);
 wenzelm parents: 
24102diff
changeset | 455 | fun prep_draft path i = | 
| 14935 | 456 | let | 
| 457 | val base = Path.base path; | |
| 14972 | 458 | val name = | 
| 24829 | 459 | (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 | 460 | "" => "DUMMY" | 
| 
6f27ecf2a951
unique file names via serial numbers, to allow files like "root" or multiple files with same base name;
 wenzelm parents: 
44389diff
changeset | 461 | | s => s) ^ serial_string (); | 
| 14935 | 462 | in | 
| 463 | if File.exists path then | |
| 24150 
ed724867099a
sort indexes according to symbolic update_time (multithreading-safe);
 wenzelm parents: 
24102diff
changeset | 464 | (((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 | 465 |         else error ("Bad file: " ^ Path.print path)
 | 
| 14935 | 466 | end; | 
| 24150 
ed724867099a
sort indexes according to symbolic update_time (multithreading-safe);
 wenzelm parents: 
24102diff
changeset | 467 | val (srcs, tex_index) = split_list (fst (fold_map prep_draft src_paths 0)); | 
| 14935 | 468 | |
| 42127 
8223e7f4b0da
Isabelle_System.create_tmp_path/with_tmp_file: optional extension;
 wenzelm parents: 
42126diff
changeset | 469 | val doc_path = Path.append dir document_path; | 
| 40743 | 470 | val _ = Isabelle_System.mkdirs doc_path; | 
| 14922 | 471 | 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 | 472 | val _ = File.copy (Path.explode "~~/lib/texinputs/draft.tex") root_path; | 
| 40743 | 473 |     val _ = Isabelle_System.isabelle_tool "latex" ("-o sty " ^ File.shell_path root_path);
 | 
| 474 |     val _ = Isabelle_System.isabelle_tool "latex" ("-o syms " ^ File.shell_path root_path);
 | |
| 14922 | 475 | |
| 476 | fun known name = | |
| 477 | let val ss = split_lines (File.read (Path.append doc_path (Path.basic name))) | |
| 20664 | 478 | in member (op =) ss end; | 
| 14922 | 479 | val known_syms = known "syms.lst"; | 
| 480 | val known_ctrls = known "ctrls.lst"; | |
| 481 | ||
| 15570 | 482 | val _ = srcs |> List.app (fn (name, base, txt) => | 
| 14935 | 483 | Symbol.explode txt | 
| 21858 
05f57309170c
avoid conflict with Alice keywords: renamed pack -> implode, unpack -> explode, any -> many, avoided assert;
 wenzelm parents: 
20664diff
changeset | 484 | |> Latex.symbol_source (known_syms, known_ctrls) (Path.implode base) | 
| 14935 | 485 | |> File.write (Path.append doc_path (tex_path name))); | 
| 14922 | 486 | val _ = write_tex_index tex_index doc_path; | 
| 487 | ||
| 48805 
c3ea910b3581
explicit document_output directory, without implicit purge of default in ISABELLE_BROWSER_INFO;
 wenzelm parents: 
48804diff
changeset | 488 | val result = | 
| 
c3ea910b3581
explicit document_output directory, without implicit purge of default in ISABELLE_BROWSER_INFO;
 wenzelm parents: 
48804diff
changeset | 489 |       isabelle_document {verbose = false, purge = true} doc_format documentN "" doc_path;
 | 
| 42127 
8223e7f4b0da
Isabelle_System.create_tmp_path/with_tmp_file: optional extension;
 wenzelm parents: 
42126diff
changeset | 490 | 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 | 491 | val _ = File.copy result result'; | 
| 
8223e7f4b0da
Isabelle_System.create_tmp_path/with_tmp_file: optional extension;
 wenzelm parents: 
42126diff
changeset | 492 | in result' end); | 
| 14922 | 493 | |
| 7685 | 494 | end; | 
| 495 | ||
| 32738 | 496 | structure Basic_Present: BASIC_PRESENT = Present; | 
| 497 | open Basic_Present; |