| author | wenzelm | 
| Fri, 09 Oct 2020 13:12:56 +0200 | |
| changeset 72411 | b8cc129ece05 | 
| parent 72376 | 04bce3478688 | 
| child 72565 | ed5b907bbf50 | 
| permissions | -rw-r--r-- | 
| 50707 
5b2bf7611662
maintain session index on Scala side, for more determistic results;
 wenzelm parents: diff
changeset | 1 | /* Title: Pure/Thy/present.scala | 
| 
5b2bf7611662
maintain session index on Scala side, for more determistic results;
 wenzelm parents: diff
changeset | 2 | Author: Makarius | 
| 
5b2bf7611662
maintain session index on Scala side, for more determistic results;
 wenzelm parents: diff
changeset | 3 | |
| 
5b2bf7611662
maintain session index on Scala side, for more determistic results;
 wenzelm parents: diff
changeset | 4 | Theory presentation: HTML. | 
| 
5b2bf7611662
maintain session index on Scala side, for more determistic results;
 wenzelm parents: diff
changeset | 5 | */ | 
| 
5b2bf7611662
maintain session index on Scala side, for more determistic results;
 wenzelm parents: diff
changeset | 6 | |
| 
5b2bf7611662
maintain session index on Scala side, for more determistic results;
 wenzelm parents: diff
changeset | 7 | package isabelle | 
| 
5b2bf7611662
maintain session index on Scala side, for more determistic results;
 wenzelm parents: diff
changeset | 8 | |
| 
5b2bf7611662
maintain session index on Scala side, for more determistic results;
 wenzelm parents: diff
changeset | 9 | |
| 61372 | 10 | import java.io.{File => JFile}
 | 
| 11 | ||
| 51402 | 12 | import scala.collection.immutable.SortedMap | 
| 13 | ||
| 14 | ||
| 50707 
5b2bf7611662
maintain session index on Scala side, for more determistic results;
 wenzelm parents: diff
changeset | 15 | object Present | 
| 
5b2bf7611662
maintain session index on Scala side, for more determistic results;
 wenzelm parents: diff
changeset | 16 | {
 | 
| 51399 
6ac3c29a300e
discontinued "isabelle usedir" option -r (reset session path);
 wenzelm parents: 
50707diff
changeset | 17 | /* maintain chapter index -- NOT thread-safe */ | 
| 50707 
5b2bf7611662
maintain session index on Scala side, for more determistic results;
 wenzelm parents: diff
changeset | 18 | |
| 51399 
6ac3c29a300e
discontinued "isabelle usedir" option -r (reset session path);
 wenzelm parents: 
50707diff
changeset | 19 |   private val sessions_path = Path.basic(".sessions")
 | 
| 50707 
5b2bf7611662
maintain session index on Scala side, for more determistic results;
 wenzelm parents: diff
changeset | 20 | |
| 51402 | 21 | private def read_sessions(dir: Path): List[(String, String)] = | 
| 22 |   {
 | |
| 51416 | 23 | val path = dir + sessions_path | 
| 24 |     if (path.is_file) {
 | |
| 25 | import XML.Decode._ | |
| 65344 
b99283eed13c
clarified YXML vs. symbol encoding: operate on whole message;
 wenzelm parents: 
65089diff
changeset | 26 | list(pair(string, string))(Symbol.decode_yxml(File.read(path))) | 
| 51416 | 27 | } | 
| 28 | else Nil | |
| 51402 | 29 | } | 
| 50707 
5b2bf7611662
maintain session index on Scala side, for more determistic results;
 wenzelm parents: diff
changeset | 30 | |
| 51402 | 31 | private def write_sessions(dir: Path, sessions: List[(String, String)]) | 
| 32 |   {
 | |
| 33 | import XML.Encode._ | |
| 34 | File.write(dir + sessions_path, YXML.string_of_body(list(pair(string, string))(sessions))) | |
| 35 | } | |
| 50707 
5b2bf7611662
maintain session index on Scala side, for more determistic results;
 wenzelm parents: diff
changeset | 36 | |
| 61372 | 37 | def update_chapter_index(browser_info: Path, chapter: String, new_sessions: List[(String, String)]) | 
| 51399 
6ac3c29a300e
discontinued "isabelle usedir" option -r (reset session path);
 wenzelm parents: 
50707diff
changeset | 38 |   {
 | 
| 72376 | 39 | val dir = Isabelle_System.make_directory(browser_info + Path.basic(chapter)) | 
| 50707 
5b2bf7611662
maintain session index on Scala side, for more determistic results;
 wenzelm parents: diff
changeset | 40 | |
| 51399 
6ac3c29a300e
discontinued "isabelle usedir" option -r (reset session path);
 wenzelm parents: 
50707diff
changeset | 41 | val sessions0 = | 
| 51406 
950b897f95bb
proper path -- I/O was hidden due to permissiveness;
 wenzelm parents: 
51402diff
changeset | 42 |       try { read_sessions(dir) }
 | 
| 51987 | 43 |       catch { case _: XML.Error => Nil }
 | 
| 51399 
6ac3c29a300e
discontinued "isabelle usedir" option -r (reset session path);
 wenzelm parents: 
50707diff
changeset | 44 | |
| 51402 | 45 | val sessions = (SortedMap.empty[String, String] ++ sessions0 ++ new_sessions).toList | 
| 65988 | 46 | write_sessions(dir, sessions) | 
| 51402 | 47 | |
| 65988 | 48 | val title = "Isabelle/" + chapter + " sessions" | 
| 49 | HTML.write_document(dir, "index.html", | |
| 50 |       List(HTML.title(title + " (" + Distribution.version + ")")),
 | |
| 51 | HTML.chapter(title) :: | |
| 52 | (if (sessions.isEmpty) Nil | |
| 53 | else | |
| 65992 | 54 |           List(HTML.div("sessions",
 | 
| 55 | List(HTML.description( | |
| 65988 | 56 |               sessions.map({ case (name, description) =>
 | 
| 69318 | 57 | val descr = Symbol.trim_blank_lines(description) | 
| 65989 | 58 | (List(HTML.link(name + "/index.html", HTML.text(name))), | 
| 69318 | 59 | if (descr == "") Nil | 
| 60 | else HTML.break ::: List(HTML.pre(HTML.text(descr)))) }))))))) | |
| 51399 
6ac3c29a300e
discontinued "isabelle usedir" option -r (reset session path);
 wenzelm parents: 
50707diff
changeset | 61 | } | 
| 61372 | 62 | |
| 63 | def make_global_index(browser_info: Path) | |
| 64 |   {
 | |
| 65 |     if (!(browser_info + Path.explode("index.html")).is_file) {
 | |
| 72375 | 66 | Isabelle_System.make_directory(browser_info) | 
| 61372 | 67 |       File.copy(Path.explode("~~/lib/logo/isabelle.gif"),
 | 
| 68 |         browser_info + Path.explode("isabelle.gif"))
 | |
| 69 |       File.write(browser_info + Path.explode("index.html"),
 | |
| 70 |         File.read(Path.explode("~~/lib/html/library_index_header.template")) +
 | |
| 71 |         File.read(Path.explode("~~/lib/html/library_index_content.template")) +
 | |
| 72 |         File.read(Path.explode("~~/lib/html/library_index_footer.template")))
 | |
| 73 | } | |
| 74 | } | |
| 75 | ||
| 76 | ||
| 77 | /* finish session */ | |
| 78 | ||
| 79 | def finish( | |
| 80 | progress: Progress, | |
| 81 | browser_info: Path, | |
| 82 | graph_file: JFile, | |
| 62631 | 83 | info: Sessions.Info, | 
| 61372 | 84 | name: String) | 
| 85 |   {
 | |
| 86 | val session_prefix = browser_info + Path.basic(info.chapter) + Path.basic(name) | |
| 65089 | 87 |     val session_fonts = session_prefix + Path.explode("fonts")
 | 
| 61372 | 88 | |
| 89 |     if (info.options.bool("browser_info")) {
 | |
| 72375 | 90 | Isabelle_System.make_directory(session_fonts) | 
| 62971 
087e36ce0593
back to exact copy of non-text file (amending dcc8e1d34b18);
 wenzelm parents: 
62631diff
changeset | 91 | |
| 
087e36ce0593
back to exact copy of non-text file (amending dcc8e1d34b18);
 wenzelm parents: 
62631diff
changeset | 92 |       val session_graph = session_prefix + Path.basic("session_graph.pdf")
 | 
| 
087e36ce0593
back to exact copy of non-text file (amending dcc8e1d34b18);
 wenzelm parents: 
62631diff
changeset | 93 | File.copy(graph_file, session_graph.file) | 
| 71114 | 94 |       Isabelle_System.chmod("a+r", session_graph)
 | 
| 62971 
087e36ce0593
back to exact copy of non-text file (amending dcc8e1d34b18);
 wenzelm parents: 
62631diff
changeset | 95 | |
| 66000 | 96 | HTML.write_isabelle_css(session_prefix) | 
| 61500 | 97 | |
| 69374 | 98 | for (entry <- Isabelle_Fonts.fonts(hidden = true)) | 
| 69360 | 99 | File.copy(entry.path, session_fonts) | 
| 61372 | 100 | } | 
| 101 | } | |
| 66040 | 102 | |
| 103 | ||
| 67253 | 104 | /** preview **/ | 
| 105 | ||
| 67260 
ecd607631bc7
uniform preview for Isabelle/jEdit and Isabelle/VSCode;
 wenzelm parents: 
67256diff
changeset | 106 | sealed case class Preview(title: String, content: String) | 
| 
ecd607631bc7
uniform preview for Isabelle/jEdit and Isabelle/VSCode;
 wenzelm parents: 
67256diff
changeset | 107 | |
| 69255 
800b1ce96fce
more general support for Isabelle/PIDE file formats -- less hardwired Bibtex operations;
 wenzelm parents: 
69033diff
changeset | 108 | def preview( | 
| 
800b1ce96fce
more general support for Isabelle/PIDE file formats -- less hardwired Bibtex operations;
 wenzelm parents: 
69033diff
changeset | 109 | resources: Resources, | 
| 
800b1ce96fce
more general support for Isabelle/PIDE file formats -- less hardwired Bibtex operations;
 wenzelm parents: 
69033diff
changeset | 110 | snapshot: Document.Snapshot, | 
| 67262 | 111 | plain_text: Boolean = false, | 
| 67260 
ecd607631bc7
uniform preview for Isabelle/jEdit and Isabelle/VSCode;
 wenzelm parents: 
67256diff
changeset | 112 | fonts_url: String => String = HTML.fonts_url()): Preview = | 
| 67253 | 113 |   {
 | 
| 114 | require(!snapshot.is_outdated) | |
| 115 | ||
| 67264 | 116 | def output_document(title: String, body: XML.Body): String = | 
| 117 | HTML.output_document( | |
| 118 | List( | |
| 69362 | 119 | HTML.style(HTML.fonts_css(fonts_url) + "\n\n" + File.read(HTML.isabelle_css)), | 
| 67264 | 120 | HTML.title(title)), | 
| 67337 
4254cfd15b00
more tight HTML output: avoid extra lines within <pre>;
 wenzelm parents: 
67336diff
changeset | 121 | List(HTML.source(body)), css = "", structural = false) | 
| 67264 | 122 | |
| 67253 | 123 | val name = snapshot.node_name | 
| 69255 
800b1ce96fce
more general support for Isabelle/PIDE file formats -- less hardwired Bibtex operations;
 wenzelm parents: 
69033diff
changeset | 124 | |
| 67264 | 125 |     if (plain_text) {
 | 
| 69366 | 126 | val title = "File " + quote(name.path.file_name) | 
| 67265 
f32287c95432
store full blob source for the sake of markup_to_XML;
 wenzelm parents: 
67264diff
changeset | 127 | val content = output_document(title, HTML.text(snapshot.node.source)) | 
| 67264 | 128 | Preview(title, content) | 
| 129 | } | |
| 67253 | 130 |     else {
 | 
| 69255 
800b1ce96fce
more general support for Isabelle/PIDE file formats -- less hardwired Bibtex operations;
 wenzelm parents: 
69033diff
changeset | 131 |       resources.make_preview(snapshot) match {
 | 
| 
800b1ce96fce
more general support for Isabelle/PIDE file formats -- less hardwired Bibtex operations;
 wenzelm parents: 
69033diff
changeset | 132 | case Some(preview) => preview | 
| 
800b1ce96fce
more general support for Isabelle/PIDE file formats -- less hardwired Bibtex operations;
 wenzelm parents: 
69033diff
changeset | 133 | case None => | 
| 
800b1ce96fce
more general support for Isabelle/PIDE file formats -- less hardwired Bibtex operations;
 wenzelm parents: 
69033diff
changeset | 134 | val title = | 
| 
800b1ce96fce
more general support for Isabelle/PIDE file formats -- less hardwired Bibtex operations;
 wenzelm parents: 
69033diff
changeset | 135 | if (name.is_theory) "Theory " + quote(name.theory_base_name) | 
| 69366 | 136 | else "File " + quote(name.path.file_name) | 
| 69255 
800b1ce96fce
more general support for Isabelle/PIDE file formats -- less hardwired Bibtex operations;
 wenzelm parents: 
69033diff
changeset | 137 | val content = output_document(title, pide_document(snapshot)) | 
| 
800b1ce96fce
more general support for Isabelle/PIDE file formats -- less hardwired Bibtex operations;
 wenzelm parents: 
69033diff
changeset | 138 | Preview(title, content) | 
| 
800b1ce96fce
more general support for Isabelle/PIDE file formats -- less hardwired Bibtex operations;
 wenzelm parents: 
69033diff
changeset | 139 | } | 
| 67253 | 140 | } | 
| 141 | } | |
| 142 | ||
| 143 | ||
| 67264 | 144 | /* PIDE document */ | 
| 66040 | 145 | |
| 67336 | 146 | private val document_elements = | 
| 147 | Rendering.foreground_elements ++ Rendering.text_color_elements ++ Rendering.markdown_elements + | |
| 148 | Markup.NUMERAL + Markup.COMMENT + Markup.LANGUAGE | |
| 149 | ||
| 150 | private val div_elements = | |
| 151 | Set(HTML.div.name, HTML.pre.name, HTML.par.name, HTML.list.name, HTML.enum.name, | |
| 152 | HTML.descr.name) | |
| 153 | ||
| 154 | private def html_div(html: XML.Body): Boolean = | |
| 155 |     html exists {
 | |
| 156 | case XML.Elem(markup, body) => div_elements.contains(markup.name) || html_div(body) | |
| 157 | case XML.Text(_) => false | |
| 158 | } | |
| 159 | ||
| 160 | private def html_class(c: String, html: XML.Body): XML.Tree = | |
| 67337 
4254cfd15b00
more tight HTML output: avoid extra lines within <pre>;
 wenzelm parents: 
67336diff
changeset | 161 | if (html.forall(_ == HTML.no_text)) HTML.no_text | 
| 
4254cfd15b00
more tight HTML output: avoid extra lines within <pre>;
 wenzelm parents: 
67336diff
changeset | 162 | else if (html_div(html)) HTML.div(c, html) | 
| 
4254cfd15b00
more tight HTML output: avoid extra lines within <pre>;
 wenzelm parents: 
67336diff
changeset | 163 | else HTML.span(c, html) | 
| 66040 | 164 | |
| 66075 | 165 | private def make_html(xml: XML.Body): XML.Body = | 
| 66040 | 166 |     xml map {
 | 
| 67336 | 167 | case XML.Elem(Markup(Markup.LANGUAGE, Markup.Name(Markup.Language.DOCUMENT)), body) => | 
| 168 | html_class(Markup.Language.DOCUMENT, make_html(body)) | |
| 169 | case XML.Elem(Markup(Markup.MARKDOWN_PARAGRAPH, _), body) => HTML.par(make_html(body)) | |
| 170 | case XML.Elem(Markup(Markup.MARKDOWN_ITEM, _), body) => HTML.item(make_html(body)) | |
| 171 | case XML.Elem(Markup(Markup.Markdown_Bullet.name, _), _) => HTML.no_text | |
| 172 | case XML.Elem(Markup.Markdown_List(kind), body) => | |
| 173 | if (kind == Markup.ENUMERATE) HTML.enum(make_html(body)) else HTML.list(make_html(body)) | |
| 66040 | 174 | case XML.Elem(markup, body) => | 
| 66044 | 175 | val name = markup.name | 
| 176 | val html = | |
| 177 |           markup.properties match {
 | |
| 178 | case Markup.Kind(kind) if kind == Markup.COMMAND || kind == Markup.KEYWORD => | |
| 67336 | 179 | List(html_class(kind, make_html(body))) | 
| 66044 | 180 | case _ => | 
| 181 | make_html(body) | |
| 182 | } | |
| 66075 | 183 |         Rendering.foreground.get(name) orElse Rendering.text_color.get(name) match {
 | 
| 67336 | 184 | case Some(c) => html_class(c.toString, html) | 
| 185 | case None => html_class(name, html) | |
| 66044 | 186 | } | 
| 66040 | 187 | case XML.Text(text) => | 
| 188 | XML.Text(Symbol.decode(text)) | |
| 189 | } | |
| 190 | ||
| 67253 | 191 | def pide_document(snapshot: Document.Snapshot): XML.Body = | 
| 67336 | 192 | make_html(snapshot.markup_to_XML(Text.Range.full, document_elements)) | 
| 67246 
4cedf44f2af1
isabelle.preview presents auxiliary text files as well;
 wenzelm parents: 
67204diff
changeset | 193 | |
| 
4cedf44f2af1
isabelle.preview presents auxiliary text files as well;
 wenzelm parents: 
67204diff
changeset | 194 | |
| 67176 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 195 | |
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 196 | /** build document **/ | 
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 197 | |
| 72309 
564012e31db1
discontinued obsolete DVI document format and related settings/tools;
 wenzelm parents: 
71114diff
changeset | 198 | val document_format = "pdf" | 
| 
564012e31db1
discontinued obsolete DVI document format and related settings/tools;
 wenzelm parents: 
71114diff
changeset | 199 | |
| 67176 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 200 | val default_document_name = "document" | 
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 201 |   def default_document_dir(name: String): Path = Path.explode("output") + Path.basic(name)
 | 
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 202 | |
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 203 | def document_tags(tags: List[String]): String = | 
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 204 |   {
 | 
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 205 | cat_lines( | 
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 206 | tags.map(tag => | 
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 207 |         tag.toList match {
 | 
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 208 |           case '/' :: cs => "\\isafoldtag{" + cs.mkString + "}"
 | 
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 209 |           case '-' :: cs => "\\isadroptag{" + cs.mkString + "}"
 | 
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 210 |           case '+' :: cs => "\\isakeeptag{" + cs.mkString + "}"
 | 
| 67201 | 211 |           case cs => "\\isakeeptag{" + cs.mkString + "}"
 | 
| 67176 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 212 | })) + "\n" | 
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 213 | } | 
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 214 | |
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 215 | def build_document( | 
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 216 | document_name: String = default_document_name, | 
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 217 | document_dir: Option[Path] = None, | 
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 218 | tags: List[String] = Nil) | 
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 219 |   {
 | 
| 67177 | 220 | val document_target = Path.parent + Path.explode(document_name).ext(document_format) | 
| 221 | ||
| 67176 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 222 | val dir = document_dir getOrElse default_document_dir(document_name) | 
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 223 |     if (!dir.is_dir) error("Bad document output directory " + dir)
 | 
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 224 | |
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 225 | val root_name = | 
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 226 |     {
 | 
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 227 | val root1 = "root_" + document_name | 
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 228 |       if ((dir + Path.explode(root1).ext("tex")).is_file) root1 else "root"
 | 
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 229 | } | 
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 230 | |
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 231 | |
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 232 | /* bash scripts */ | 
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 233 | |
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 234 | def root_bash(ext: String): String = Bash.string(root_name + "." + ext) | 
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 235 | |
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 236 | def latex_bash(fmt: String, ext: String = "tex"): String = | 
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 237 | "isabelle latex -o " + Bash.string(fmt) + " " + Bash.string(root_name + "." + ext) | 
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 238 | |
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 239 | def bash(script: String): Process_Result = | 
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 240 | Isabelle_System.bash(script, cwd = dir.file) | 
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 241 | |
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 242 | |
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 243 | /* prepare document */ | 
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 244 | |
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 245 |     File.write(dir + Path.explode("isabelletags.sty"), document_tags(tags))
 | 
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 246 | |
| 67204 | 247 |     List("log", "blg").foreach(ext => (dir + Path.explode(root_name).ext(ext)).file.delete)
 | 
| 248 | ||
| 67176 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 249 | val result = | 
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 250 |       if ((dir + Path.explode("build")).is_file) {
 | 
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 251 |         bash("./build " + Bash.string(document_format) + " " + Bash.string(document_name))
 | 
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 252 | } | 
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 253 |       else {
 | 
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 254 | bash( | 
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 255 | List( | 
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 256 |             latex_bash("sty"),
 | 
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 257 | latex_bash(document_format), | 
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 258 |             "{ [ ! -f " + root_bash("bib") + " ] || " + latex_bash("bbl") + "; }",
 | 
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 259 |             "{ [ ! -f " + root_bash("idx") + " ] || " + latex_bash("idx") + "; }",
 | 
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 260 | latex_bash(document_format), | 
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 261 |             latex_bash(document_format)).mkString(" && "))
 | 
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 262 | } | 
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 263 | |
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 264 | |
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 265 | /* result */ | 
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 266 | |
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 267 |     if (!result.ok) {
 | 
| 67203 | 268 | cat_error( | 
| 68132 
2a5ae592eafb
more informative error, notably for missing executable;
 wenzelm parents: 
67337diff
changeset | 269 | Library.trim_line(result.err), | 
| 67203 | 270 | cat_lines(Latex.latex_errors(dir, root_name) ::: Bibtex.bibtex_errors(dir, root_name)), | 
| 67187 | 271 | "Failed to build document in " + File.path(dir.absolute_file)) | 
| 67176 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 272 | } | 
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 273 | |
| 68704 | 274 |     bash("if [ -f " + root_bash(document_format) + " ]; then cp -f " +
 | 
| 275 | root_bash(document_format) + " " + File.bash_path(document_target) + "; fi").check | |
| 67176 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 276 | } | 
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 277 | |
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 278 | |
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 279 | /* Isabelle tool wrapper */ | 
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 280 | |
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 281 | val isabelle_tool = | 
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 282 |     Isabelle_Tool("document", "prepare theory session document", args =>
 | 
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 283 |   {
 | 
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 284 | var document_dir: Option[Path] = None | 
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 285 | var document_name = default_document_name | 
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 286 | var tags: List[String] = Nil | 
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 287 | |
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 288 |     val getopts = Getopts("""
 | 
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 289 | Usage: isabelle document [OPTIONS] | 
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 290 | |
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 291 | Options are: | 
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 292 | -d DIR document output directory (default """ + | 
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 293 | default_document_dir(default_document_name) + """) | 
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 294 | -n NAME document name (default """ + quote(default_document_name) + """) | 
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 295 | -t TAGS markup for tagged regions | 
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 296 | |
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 297 | Prepare the theory session document in document directory, producing the | 
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 298 | specified output format. | 
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 299 | """, | 
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 300 | "d:" -> (arg => document_dir = Some(Path.explode(arg))), | 
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 301 | "n:" -> (arg => document_name = arg), | 
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 302 |       "t:" -> (arg => tags = space_explode(',', arg)))
 | 
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 303 | |
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 304 | val more_args = getopts(args) | 
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 305 | if (more_args.nonEmpty) getopts.usage() | 
| 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 306 | |
| 67180 | 307 |     try {
 | 
| 72309 
564012e31db1
discontinued obsolete DVI document format and related settings/tools;
 wenzelm parents: 
71114diff
changeset | 308 | build_document(document_dir = document_dir, document_name = document_name, tags = tags) | 
| 67180 | 309 | } | 
| 69033 | 310 |     catch { case ERROR(msg) => Output.writeln(msg); sys.exit(2) }
 | 
| 67176 
13b5c3ff1954
re-implemented "isabelle document" in Isabelle/Scala, include latex_errors here;
 wenzelm parents: 
66075diff
changeset | 311 | }) | 
| 50707 
5b2bf7611662
maintain session index on Scala side, for more determistic results;
 wenzelm parents: diff
changeset | 312 | } |