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