| author | wenzelm | 
| Fri, 02 May 2014 13:52:45 +0200 | |
| changeset 56823 | 37be55461dbe | 
| parent 56784 | 776890e0cf71 | 
| child 56831 | e3ccf0809d51 | 
| permissions | -rw-r--r-- | 
| 52444 
2cfe6656d6d6
slightly improved "isabelle doc" based on Isabelle/Scala;
 wenzelm parents: 
52429diff
changeset | 1 | /* Title: Pure/Tools/doc.scala | 
| 52427 | 2 | Author: Makarius | 
| 3 | ||
| 56424 
7032378cc097
proper settings instead of hard-wired information;
 wenzelm parents: 
56423diff
changeset | 4 | Access to Isabelle documentation. | 
| 52427 | 5 | */ | 
| 6 | ||
| 7 | package isabelle | |
| 8 | ||
| 9 | ||
| 10 | import scala.util.matching.Regex | |
| 11 | ||
| 12 | ||
| 13 | object Doc | |
| 14 | {
 | |
| 15 | /* dirs */ | |
| 16 | ||
| 17 | def dirs(): List[Path] = | |
| 18 |     Path.split(Isabelle_System.getenv("ISABELLE_DOCS")).map(dir =>
 | |
| 19 | if (dir.is_dir) dir | |
| 20 |       else error("Bad documentation directory: " + dir))
 | |
| 52740 | 21 | |
| 52427 | 22 | |
| 23 | /* contents */ | |
| 24 | ||
| 56422 | 25 | private def contents_lines(): List[(Path, String)] = | 
| 52444 
2cfe6656d6d6
slightly improved "isabelle doc" based on Isabelle/Scala;
 wenzelm parents: 
52429diff
changeset | 26 |     for {
 | 
| 
2cfe6656d6d6
slightly improved "isabelle doc" based on Isabelle/Scala;
 wenzelm parents: 
52429diff
changeset | 27 | dir <- dirs() | 
| 
2cfe6656d6d6
slightly improved "isabelle doc" based on Isabelle/Scala;
 wenzelm parents: 
52429diff
changeset | 28 |       catalog = dir + Path.basic("Contents")
 | 
| 
2cfe6656d6d6
slightly improved "isabelle doc" based on Isabelle/Scala;
 wenzelm parents: 
52429diff
changeset | 29 | if catalog.is_file | 
| 
2cfe6656d6d6
slightly improved "isabelle doc" based on Isabelle/Scala;
 wenzelm parents: 
52429diff
changeset | 30 | line <- split_lines(Library.trim_line(File.read(catalog))) | 
| 56422 | 31 | } yield (dir, line) | 
| 52444 
2cfe6656d6d6
slightly improved "isabelle doc" based on Isabelle/Scala;
 wenzelm parents: 
52429diff
changeset | 32 | |
| 52427 | 33 | sealed abstract class Entry | 
| 56423 
c2f52824dbb2
explicit indication of important doc sections ("!"), which are expanded in the tree view;
 wenzelm parents: 
56422diff
changeset | 34 | case class Section(text: String, important: Boolean) extends Entry | 
| 56422 | 35 | case class Doc(name: String, title: String, path: Path) extends Entry | 
| 52542 
19d674acb764
more release notes according to availability in proper release vs. repository clone;
 wenzelm parents: 
52541diff
changeset | 36 | case class Text_File(name: String, path: Path) extends Entry | 
| 52427 | 37 | |
| 56424 
7032378cc097
proper settings instead of hard-wired information;
 wenzelm parents: 
56423diff
changeset | 38 | def text_file(name: Path): Option[Text_File] = | 
| 53777 | 39 |   {
 | 
| 56424 
7032378cc097
proper settings instead of hard-wired information;
 wenzelm parents: 
56423diff
changeset | 40 |     val path = Path.variable("ISABELLE_HOME") + name
 | 
| 
7032378cc097
proper settings instead of hard-wired information;
 wenzelm parents: 
56423diff
changeset | 41 | if (path.is_file) Some(Text_File(name.implode, path)) | 
| 53777 | 42 | else None | 
| 43 | } | |
| 44 | ||
| 52444 
2cfe6656d6d6
slightly improved "isabelle doc" based on Isabelle/Scala;
 wenzelm parents: 
52429diff
changeset | 45 |   private val Section_Entry = new Regex("""^(\S.*)\s*$""")
 | 
| 
2cfe6656d6d6
slightly improved "isabelle doc" based on Isabelle/Scala;
 wenzelm parents: 
52429diff
changeset | 46 |   private val Doc_Entry = new Regex("""^\s+(\S+)\s+(.+)\s*$""")
 | 
| 52427 | 47 | |
| 52542 
19d674acb764
more release notes according to availability in proper release vs. repository clone;
 wenzelm parents: 
52541diff
changeset | 48 | private def release_notes(): List[Entry] = | 
| 56423 
c2f52824dbb2
explicit indication of important doc sections ("!"), which are expanded in the tree view;
 wenzelm parents: 
56422diff
changeset | 49 |     Section("Release notes", true) ::
 | 
| 56424 
7032378cc097
proper settings instead of hard-wired information;
 wenzelm parents: 
56423diff
changeset | 50 |       Path.split(Isabelle_System.getenv_strict("ISABELLE_DOCS_RELEASE_NOTES")).flatMap(text_file(_))
 | 
| 52541 
97c950217d7f
quick access to release notes (imitating website/documentation.html);
 wenzelm parents: 
52448diff
changeset | 51 | |
| 53777 | 52 | private def examples(): List[Entry] = | 
| 56424 
7032378cc097
proper settings instead of hard-wired information;
 wenzelm parents: 
56423diff
changeset | 53 |     Section("Examples", true) ::
 | 
| 
7032378cc097
proper settings instead of hard-wired information;
 wenzelm parents: 
56423diff
changeset | 54 |       Path.split(Isabelle_System.getenv_strict("ISABELLE_DOCS_EXAMPLES")).map(file =>
 | 
| 
7032378cc097
proper settings instead of hard-wired information;
 wenzelm parents: 
56423diff
changeset | 55 |         text_file(file) match {
 | 
| 
7032378cc097
proper settings instead of hard-wired information;
 wenzelm parents: 
56423diff
changeset | 56 | case Some(entry) => entry | 
| 56425 | 57 |           case None => error("Bad entry in ISABELLE_DOCS_EXAMPLES: " + file)
 | 
| 56424 
7032378cc097
proper settings instead of hard-wired information;
 wenzelm parents: 
56423diff
changeset | 58 | }) | 
| 53777 | 59 | |
| 52444 
2cfe6656d6d6
slightly improved "isabelle doc" based on Isabelle/Scala;
 wenzelm parents: 
52429diff
changeset | 60 | def contents(): List[Entry] = | 
| 52541 
97c950217d7f
quick access to release notes (imitating website/documentation.html);
 wenzelm parents: 
52448diff
changeset | 61 |     (for {
 | 
| 56422 | 62 | (dir, line) <- contents_lines() | 
| 52427 | 63 | entry <- | 
| 64 |         line match {
 | |
| 56423 
c2f52824dbb2
explicit indication of important doc sections ("!"), which are expanded in the tree view;
 wenzelm parents: 
56422diff
changeset | 65 | case Section_Entry(text) => | 
| 
c2f52824dbb2
explicit indication of important doc sections ("!"), which are expanded in the tree view;
 wenzelm parents: 
56422diff
changeset | 66 |             Library.try_unsuffix("!", text) match {
 | 
| 
c2f52824dbb2
explicit indication of important doc sections ("!"), which are expanded in the tree view;
 wenzelm parents: 
56422diff
changeset | 67 | case None => Some(Section(text, false)) | 
| 
c2f52824dbb2
explicit indication of important doc sections ("!"), which are expanded in the tree view;
 wenzelm parents: 
56422diff
changeset | 68 | case Some(txt) => Some(Section(txt, true)) | 
| 
c2f52824dbb2
explicit indication of important doc sections ("!"), which are expanded in the tree view;
 wenzelm parents: 
56422diff
changeset | 69 | } | 
| 56422 | 70 | case Doc_Entry(name, title) => Some(Doc(name, title, dir + Path.basic(name))) | 
| 52427 | 71 | case _ => None | 
| 72 | } | |
| 53777 | 73 | } yield entry) ::: release_notes() ::: examples() | 
| 52427 | 74 | |
| 75 | ||
| 76 | /* view */ | |
| 77 | ||
| 56422 | 78 | def view(path: Path) | 
| 52427 | 79 |   {
 | 
| 56784 | 80 | if (path.is_file) System.out.println(Library.trim_line(File.read(path))) | 
| 56422 | 81 |     else {
 | 
| 82 |       val pdf = path.ext("pdf")
 | |
| 83 | if (pdf.is_file) Isabelle_System.pdf_viewer(pdf) | |
| 84 |       else error("Bad Isabelle documentation file: " + pdf)
 | |
| 52427 | 85 | } | 
| 86 | } | |
| 52444 
2cfe6656d6d6
slightly improved "isabelle doc" based on Isabelle/Scala;
 wenzelm parents: 
52429diff
changeset | 87 | |
| 
2cfe6656d6d6
slightly improved "isabelle doc" based on Isabelle/Scala;
 wenzelm parents: 
52429diff
changeset | 88 | |
| 
2cfe6656d6d6
slightly improved "isabelle doc" based on Isabelle/Scala;
 wenzelm parents: 
52429diff
changeset | 89 | /* command line entry point */ | 
| 
2cfe6656d6d6
slightly improved "isabelle doc" based on Isabelle/Scala;
 wenzelm parents: 
52429diff
changeset | 90 | |
| 
2cfe6656d6d6
slightly improved "isabelle doc" based on Isabelle/Scala;
 wenzelm parents: 
52429diff
changeset | 91 | def main(args: Array[String]) | 
| 
2cfe6656d6d6
slightly improved "isabelle doc" based on Isabelle/Scala;
 wenzelm parents: 
52429diff
changeset | 92 |   {
 | 
| 56631 | 93 |     Command_Line.tool0 {
 | 
| 56425 | 94 | val entries = contents() | 
| 56784 | 95 | if (args.isEmpty) System.out.println(cat_lines(contents_lines().map(_._2))) | 
| 56422 | 96 |       else {
 | 
| 97 | args.foreach(arg => | |
| 98 |           entries.collectFirst { case Doc(name, _, path) if arg == name => path } match {
 | |
| 99 | case Some(path) => view(path) | |
| 100 |             case None => error("No Isabelle documentation entry: " + quote(arg))
 | |
| 101 | } | |
| 102 | ) | |
| 103 | } | |
| 52444 
2cfe6656d6d6
slightly improved "isabelle doc" based on Isabelle/Scala;
 wenzelm parents: 
52429diff
changeset | 104 | } | 
| 
2cfe6656d6d6
slightly improved "isabelle doc" based on Isabelle/Scala;
 wenzelm parents: 
52429diff
changeset | 105 | } | 
| 52427 | 106 | } | 
| 107 |