src/Pure/Thy/presentation.scala
changeset 72675 cc1347c8c804
parent 72673 8ff7a0e394f9
child 72682 e0443773ef1a
equal deleted inserted replaced
72674:a9fea3f11cc0 72675:cc1347c8c804
   437   def build_documents(
   437   def build_documents(
   438     session: String,
   438     session: String,
   439     deps: Sessions.Deps,
   439     deps: Sessions.Deps,
   440     store: Sessions.Store,
   440     store: Sessions.Store,
   441     progress: Progress = new Progress,
   441     progress: Progress = new Progress,
       
   442     output_sources: Option[Path] = None,
       
   443     output_pdf: Option[Path] = None,
   442     verbose: Boolean = false,
   444     verbose: Boolean = false,
   443     verbose_latex: Boolean = false): List[(Document_Variant, Bytes)] =
   445     verbose_latex: Boolean = false): List[(Document_Variant, Bytes)] =
   444   {
   446   {
   445     /* session info */
   447     /* session info */
   446 
   448 
   491     }
   493     }
   492 
   494 
   493 
   495 
   494     /* produce documents */
   496     /* produce documents */
   495 
   497 
   496     val doc_output = info.document_output
       
   497 
       
   498     val documents =
   498     val documents =
   499       for (doc <- info.documents)
   499       for (doc <- info.documents)
   500       yield {
   500       yield {
   501         Isabelle_System.with_tmp_dir("document")(tmp_dir =>
   501         Isabelle_System.with_tmp_dir("document")(tmp_dir =>
   502         {
   502         {
   509           val (doc_dir, root) = prepare_dir1(tmp_dir, doc)
   509           val (doc_dir, root) = prepare_dir1(tmp_dir, doc)
   510           val digests = File.find_files(doc_dir.file, follow_links = true).map(SHA1.digest)
   510           val digests = File.find_files(doc_dir.file, follow_links = true).map(SHA1.digest)
   511           val sources = SHA1.digest_set(digests).toString
   511           val sources = SHA1.digest_set(digests).toString
   512           prepare_dir2(tmp_dir, doc)
   512           prepare_dir2(tmp_dir, doc)
   513 
   513 
   514           doc_output.foreach(prepare_dir1(_, doc))
   514           for (dir <- output_sources) {
   515           doc_output.foreach(prepare_dir2(_, doc))
   515             prepare_dir1(dir, doc)
       
   516             prepare_dir2(dir, doc)
       
   517           }
   516 
   518 
   517 
   519 
   518           // old document from database
   520           // old document from database
   519 
   521 
   520           val old_document =
   522           val old_document =
   581             }
   583             }
   582           }
   584           }
   583         })
   585         })
   584       }
   586       }
   585 
   587 
   586     for (dir <- doc_output; (doc, pdf) <- documents) {
   588     for (dir <- output_pdf; (doc, pdf) <- documents) {
       
   589       Isabelle_System.make_directory(dir)
   587       val path = dir + doc.path.pdf
   590       val path = dir + doc.path.pdf
   588       Bytes.write(path, pdf)
   591       Bytes.write(path, pdf)
   589       progress.echo_document("Document at " + path.absolute)
   592       progress.echo_document("Document at " + path.absolute)
   590     }
   593     }
   591 
   594 
   596   /* Isabelle tool wrapper */
   599   /* Isabelle tool wrapper */
   597 
   600 
   598   val isabelle_tool =
   601   val isabelle_tool =
   599     Isabelle_Tool("document", "prepare session theory document", args =>
   602     Isabelle_Tool("document", "prepare session theory document", args =>
   600     {
   603     {
       
   604       var output_sources: Option[Path] = None
       
   605       var output_pdf: Option[Path] = None
   601       var verbose_latex = false
   606       var verbose_latex = false
   602       var dirs: List[Path] = Nil
   607       var dirs: List[Path] = Nil
   603       var options = Options.init()
   608       var options = Options.init()
   604       var verbose_build = false
   609       var verbose_build = false
   605 
   610 
   606       val getopts = Getopts(
   611       val getopts = Getopts(
   607         """
   612         """
   608 Usage: isabelle document [OPTIONS] SESSION
   613 Usage: isabelle document [OPTIONS] SESSION
   609 
   614 
   610   Options are:
   615   Options are:
   611     -O           set option "document_output", relative to current directory
   616     -O DIR       output directory for LaTeX sources and resulting PDF
       
   617     -P DIR       output directory for resulting PDF
       
   618     -S DIR       output directory for LaTeX sources
   612     -V           verbose latex
   619     -V           verbose latex
   613     -d DIR       include session directory
   620     -d DIR       include session directory
   614     -o OPTION    override Isabelle system OPTION (via NAME=VAL or NAME)
   621     -o OPTION    override Isabelle system OPTION (via NAME=VAL or NAME)
   615     -v           verbose build
   622     -v           verbose build
   616 
   623 
   617   Prepare the theory document of a session.
   624   Prepare the theory document of a session.
   618 """,
   625 """,
   619         "O:" -> (arg => options += ("document_output=" + Path.explode(arg).absolute.implode)),
   626         "O:" -> (arg =>
       
   627           {
       
   628             val dir = Path.explode(arg)
       
   629             output_sources = Some(dir)
       
   630             output_pdf = Some(dir)
       
   631           }),
       
   632         "P:" -> (arg => { output_pdf = Some(Path.explode(arg)) }),
       
   633         "S:" -> (arg => { output_sources = Some(Path.explode(arg)) }),
   620         "V" -> (_ => verbose_latex = true),
   634         "V" -> (_ => verbose_latex = true),
   621         "d:" -> (arg => dirs = dirs ::: List(Path.explode(arg))),
   635         "d:" -> (arg => dirs = dirs ::: List(Path.explode(arg))),
   622         "o:" -> (arg => options = options + arg),
   636         "o:" -> (arg => options = options + arg),
   623         "v" -> (_ => verbose_build = true))
   637         "v" -> (_ => verbose_build = true))
   624 
   638 
   640 
   654 
   641         val deps =
   655         val deps =
   642           Sessions.load_structure(options + "document=pdf", dirs = dirs).
   656           Sessions.load_structure(options + "document=pdf", dirs = dirs).
   643             selection_deps(Sessions.Selection.session(session))
   657             selection_deps(Sessions.Selection.session(session))
   644 
   658 
   645         if (deps.sessions_structure(session).document_output.isEmpty) {
   659         if (output_sources.isEmpty && output_pdf.isEmpty) {
   646           progress.echo_warning("No document_output")
   660           progress.echo_warning("No output directory")
   647         }
   661         }
   648 
   662 
   649         build_documents(session, deps, store, progress = progress,
   663         build_documents(session, deps, store, progress = progress,
       
   664           output_sources = output_sources, output_pdf = output_pdf,
   650           verbose = true, verbose_latex = verbose_latex)
   665           verbose = true, verbose_latex = verbose_latex)
   651       }
   666       }
   652     })
   667     })
   653 }
   668 }