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 |
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 } |