more operations;
authorwenzelm
Tue, 29 May 2018 17:45:48 +0200
changeset 68319 2e168460a9c3
parent 68318 5971199863ea
child 68320 1d33697199c1
more operations; more output;
src/Pure/Thy/thy_resources.scala
src/Pure/Tools/dump.scala
--- a/src/Pure/Thy/thy_resources.scala	Tue May 29 15:04:02 2018 +0200
+++ b/src/Pure/Thy/thy_resources.scala	Tue May 29 17:45:48 2018 +0200
@@ -60,6 +60,7 @@
     val version: Document.Version,
     val nodes: List[(Document.Node.Name, Protocol.Node_Status)])
   {
+    def node_names: List[Document.Node.Name] = nodes.map(_._1)
     def ok: Boolean = nodes.forall({ case (_, st) => st.ok })
 
     def messages(node_name: Document.Node.Name): List[(XML.Tree, Position.T)] =
@@ -73,6 +74,13 @@
        } yield (tree, pos)).toList
     }
 
+    def markup_to_XML(node_name: Document.Node.Name,
+      range: Text.Range = Text.Range.full,
+      elements: Markup.Elements = Markup.Elements.full): XML.Body =
+    {
+      state.markup_to_XML(version, node_name, range, elements)
+    }
+
     def exports(node_name: Document.Node.Name): List[Export.Entry] =
     {
       val node = version.nodes(node_name)
--- a/src/Pure/Tools/dump.scala	Tue May 29 15:04:02 2018 +0200
+++ b/src/Pure/Tools/dump.scala	Tue May 29 17:45:48 2018 +0200
@@ -13,17 +13,46 @@
 
   sealed case class Aspect_Args(
     options: Options, progress: Progress, output_dir: Path, result: Thy_Resources.Theories_Result)
+  {
+    def write(node_name: Document.Node.Name, file_name: String, bytes: Bytes)
+    {
+      val path = output_dir + Path.basic(node_name.theory) + Path.basic(file_name)
+      Isabelle_System.mkdirs(path.dir)
+      Bytes.write(path, bytes)
+    }
+
+    def write(node_name: Document.Node.Name, file_name: String, text: String)
+    {
+      write(node_name, file_name, Bytes(text))
+    }
+  }
 
   sealed case class Aspect(name: String, description: String, operation: Aspect_Args => Unit)
 
   private val known_aspects =
     List(
       Aspect("list", "list theory nodes",
-        { case args => for ((node, _) <- args.result.nodes) args.progress.echo(node.toString) })
+        { case args =>
+            for (node_name <- args.result.node_names) args.progress.echo(node_name.toString)
+        }),
+      Aspect("messages", "output messages (YXML format)",
+        { case args =>
+            for (node_name <- args.result.node_names) {
+              args.write(node_name, "messages.yxml",
+                YXML.string_of_body(args.result.messages(node_name).iterator.map(_._1).toList))
+            }
+        }),
+      Aspect("markup", "PIDE markup (YXML format)",
+        { case args =>
+            for (node_name <- args.result.node_names) {
+              args.write(node_name, "markup.yxml",
+                YXML.string_of_body(args.result.markup_to_XML(node_name)))
+            }
+        })
     )
 
   def show_aspects: String =
-    cat_lines(known_aspects.map(aspect => aspect.name + " - " + aspect.description))
+    cat_lines(known_aspects.sortBy(_.name).map(aspect => aspect.name + " - " + aspect.description))
 
   def the_aspect(name: String): Aspect =
     known_aspects.find(aspect => aspect.name == name) getOrElse