* run.ss is used for he scribble command-line tool
* scribble.ss is gone (ot was doing the running, which run.ss defined) * converted run.ss to scheme/base * added private/indirect-renderer which can be used to build renderers that are based on conversion from the result of an existing renderer, obviously useful with the latex renderer * added pdf-render using this and private/run-pdflatex * added a --pdf option to run.ss svn: r13946 original commit: d952b144c2b47f64b675ace0f25877f5a4e5c3f5
This commit is contained in:
parent
bd2dd5c43a
commit
7f0900073b
|
@ -1,5 +1,5 @@
|
||||||
#lang setup/infotab
|
#lang setup/infotab
|
||||||
|
|
||||||
(define mzscheme-launcher-names '("scribble"))
|
(define mzscheme-launcher-names '("scribble"))
|
||||||
(define mzscheme-launcher-libraries '("scribble.ss"))
|
(define mzscheme-launcher-libraries '("run.ss"))
|
||||||
(define compile-omit-paths '("test-reader.ss"))
|
(define compile-omit-paths '("test-reader.ss"))
|
||||||
|
|
10
collects/scribble/pdf-render.ss
Normal file
10
collects/scribble/pdf-render.ss
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
#lang scheme/base
|
||||||
|
|
||||||
|
(require "private/indirect-renderer.ss" "private/run-pdflatex.ss"
|
||||||
|
(prefix-in latex: "latex-render.ss"))
|
||||||
|
|
||||||
|
(provide render-mixin)
|
||||||
|
|
||||||
|
(define render-mixin
|
||||||
|
(make-indirect-renderer-mixin
|
||||||
|
latex:render-mixin #".tex" #".pdf" run-pdflatex))
|
40
collects/scribble/private/indirect-renderer.ss
Normal file
40
collects/scribble/private/indirect-renderer.ss
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
#lang scheme/base
|
||||||
|
|
||||||
|
(require scheme/class scheme/file scheme/path)
|
||||||
|
|
||||||
|
(provide make-indirect-renderer-mixin)
|
||||||
|
|
||||||
|
(define (dotless bytes) (regexp-replace #rx#"[.]" bytes #""))
|
||||||
|
|
||||||
|
(define ((make-indirect-renderer-mixin
|
||||||
|
base-renderer base-suffix target-suffix convert)
|
||||||
|
%renderer)
|
||||||
|
(class (base-renderer %renderer)
|
||||||
|
(define tmp-dest-dir #f)
|
||||||
|
(define/override (get-dest-directory create?)
|
||||||
|
(or tmp-dest-dir (super get-dest-directory create?)))
|
||||||
|
(define/override (get-suffix) target-suffix)
|
||||||
|
(define/override (render srcs dests ri)
|
||||||
|
(define tmp-dir
|
||||||
|
(make-temporary-file
|
||||||
|
(format "scribble-~a-to-~a-~~a"
|
||||||
|
(dotless base-suffix) (dotless target-suffix))
|
||||||
|
'directory))
|
||||||
|
(define (cleanup)
|
||||||
|
(when (directory-exists? tmp-dir) (delete-directory/files tmp-dir)))
|
||||||
|
(with-handlers ([void (lambda (e) (cleanup) (raise e))])
|
||||||
|
(define tmp-dests
|
||||||
|
(map (lambda (dest)
|
||||||
|
(build-path tmp-dir
|
||||||
|
(path-replace-suffix (file-name-from-path dest)
|
||||||
|
base-suffix)))
|
||||||
|
dests))
|
||||||
|
(set! tmp-dest-dir tmp-dir)
|
||||||
|
;; it would be better if it's ok to change current-directory for this
|
||||||
|
(super render srcs tmp-dests ri)
|
||||||
|
(for ([tmp tmp-dests] [dst dests])
|
||||||
|
(parameterize ([current-directory tmp-dir])
|
||||||
|
(convert (file-name-from-path tmp)))
|
||||||
|
(copy-file (build-path tmp-dir(file-name-from-path dst)) dst))
|
||||||
|
(cleanup)))
|
||||||
|
(super-new)))
|
|
@ -1,156 +1,127 @@
|
||||||
|
#lang scheme/base
|
||||||
|
|
||||||
(module run mzscheme
|
(require "struct.ss"
|
||||||
(require "struct.ss"
|
"base-render.ss"
|
||||||
"base-render.ss"
|
"xref.ss"
|
||||||
"xref.ss"
|
scheme/cmdline
|
||||||
mzlib/cmdline
|
scheme/file
|
||||||
mzlib/class
|
scheme/class
|
||||||
mzlib/file
|
(prefix-in text: "text-render.ss")
|
||||||
(prefix text: "text-render.ss")
|
(prefix-in html: "html-render.ss")
|
||||||
(prefix html: "html-render.ss")
|
(prefix-in latex: "latex-render.ss")
|
||||||
(prefix latex: "latex-render.ss"))
|
(prefix-in pdf: "pdf-render.ss"))
|
||||||
|
|
||||||
(provide (all-defined)
|
(define multi-html:render-mixin
|
||||||
html:render-mixin
|
(lambda (%) (html:render-multi-mixin (html:render-mixin %))))
|
||||||
latex:render-mixin
|
|
||||||
text:render-mixin)
|
|
||||||
|
|
||||||
(define multi-html:render-mixin
|
(define current-render-mixin (make-parameter text:render-mixin))
|
||||||
(lambda (%)
|
(define current-dest-directory (make-parameter #f))
|
||||||
(html:render-multi-mixin
|
(define current-dest-name (make-parameter #f))
|
||||||
(html:render-mixin %))))
|
(define current-info-output-file (make-parameter #f))
|
||||||
|
(define current-info-input-files (make-parameter null))
|
||||||
|
(define current-xref-input-modules (make-parameter null))
|
||||||
|
(define current-prefix-file (make-parameter #f))
|
||||||
|
(define current-style-file (make-parameter #f))
|
||||||
|
(define current-style-extra-files (make-parameter null))
|
||||||
|
(define current-redirect (make-parameter #f))
|
||||||
|
(define current-redirect-main (make-parameter #f))
|
||||||
|
|
||||||
(define current-render-mixin
|
(define (read-one str)
|
||||||
(make-parameter text:render-mixin))
|
(let ([i (open-input-string str)])
|
||||||
(define current-dest-directory
|
(with-handlers ([exn:fail:read? (lambda (x) #f)])
|
||||||
(make-parameter #f))
|
(let ([v (read i)])
|
||||||
(define current-dest-name
|
(and (eof-object? (read i)) v)))))
|
||||||
(make-parameter #f))
|
|
||||||
(define current-info-output-file
|
|
||||||
(make-parameter #f))
|
|
||||||
(define current-info-input-files
|
|
||||||
(make-parameter null))
|
|
||||||
(define current-xref-input-modules
|
|
||||||
(make-parameter null))
|
|
||||||
(define current-prefix-file
|
|
||||||
(make-parameter #f))
|
|
||||||
(define current-style-file
|
|
||||||
(make-parameter #f))
|
|
||||||
(define current-style-extra-files
|
|
||||||
(make-parameter null))
|
|
||||||
(define current-redirect
|
|
||||||
(make-parameter #f))
|
|
||||||
(define current-redirect-main
|
|
||||||
(make-parameter #f))
|
|
||||||
|
|
||||||
(define (read-one str)
|
(define (run)
|
||||||
(let ([i (open-input-string str)])
|
(command-line
|
||||||
(with-handlers ([exn:fail:read? (lambda (x) #f)])
|
#:once-any
|
||||||
(let ([v (read i)])
|
[("--text") "generate text-format output (the default)"
|
||||||
(if (eof-object? (read i))
|
(void)]
|
||||||
v
|
[("--html") "generate HTML-format output file"
|
||||||
#f)))))
|
(current-render-mixin html:render-mixin)]
|
||||||
|
[("--htmls") "generate HTML-format output directory"
|
||||||
|
(current-render-mixin multi-html:render-mixin)]
|
||||||
|
[("--latex") "generate LaTeX-format output"
|
||||||
|
(current-render-mixin latex:render-mixin)]
|
||||||
|
[("--pdf") "generate PDF-format output (with PDFLaTeX)"
|
||||||
|
(current-render-mixin pdf:render-mixin)]
|
||||||
|
#:once-each
|
||||||
|
[("--dest") dir "write output in <dir>"
|
||||||
|
(current-dest-directory dir)]
|
||||||
|
[("--dest-name") name "write output as <name>"
|
||||||
|
(current-dest-name name)]
|
||||||
|
[("--prefix") file "use given .html/.tex prefix (for doctype/documentclass)"
|
||||||
|
(current-prefix-file file)]
|
||||||
|
[("--style") file "use given base .css/.tex file"
|
||||||
|
(current-style-file file)]
|
||||||
|
[("--redirect") url "redirect external links to tag search via <url>"
|
||||||
|
(current-redirect url)]
|
||||||
|
[("--redirect-main") url "redirect main doc links to <url>"
|
||||||
|
(current-redirect-main url)]
|
||||||
|
[("--info-out") file "write format-specific link information to <file>"
|
||||||
|
(current-info-output-file file)]
|
||||||
|
#:multi
|
||||||
|
[("++info-in") file "load format-specific link information from <file>"
|
||||||
|
(current-info-input-files
|
||||||
|
(cons file (current-info-input-files)))]
|
||||||
|
[("++xref-in") module-path proc-id "load format-specific link information by"
|
||||||
|
"calling <proc-id> as exported by <module-path>"
|
||||||
|
(let ([mod (read-one module-path)]
|
||||||
|
[id (read-one proc-id)])
|
||||||
|
(unless (module-path? mod)
|
||||||
|
(raise-user-error
|
||||||
|
'scribble "bad module path for ++ref-in: ~s" module-path))
|
||||||
|
(unless (symbol? id)
|
||||||
|
(raise-user-error
|
||||||
|
'scribble "bad procedure identifier for ++ref-in: ~s" proc-id))
|
||||||
|
(current-xref-input-modules
|
||||||
|
(cons (cons mod id) (current-xref-input-modules))))]
|
||||||
|
[("++style") file "add given .css/.tex file"
|
||||||
|
(current-style-extra-files (cons file (current-style-extra-files)))]
|
||||||
|
#:args (file . another-file)
|
||||||
|
(let ([files (cons file another-file)])
|
||||||
|
(build-docs (map (lambda (file) (dynamic-require `(file ,file) 'doc))
|
||||||
|
files)
|
||||||
|
files))))
|
||||||
|
|
||||||
(define (get-command-line-files argv)
|
(define (build-docs docs files)
|
||||||
(command-line
|
(define dir (current-dest-directory))
|
||||||
"scribble"
|
(when dir (make-directory* dir))
|
||||||
argv
|
(let ([renderer (new ((current-render-mixin) render%)
|
||||||
[once-any
|
[dest-dir dir]
|
||||||
[("--text") "generate text-format output (the default)"
|
[prefix-file (current-prefix-file)]
|
||||||
(void)]
|
[style-file (current-style-file)]
|
||||||
[("--html") "generate HTML-format output file"
|
[style-extra-files (reverse (current-style-extra-files))])])
|
||||||
(current-render-mixin html:render-mixin)]
|
(when (current-redirect)
|
||||||
[("--htmls") "generate HTML-format output directory"
|
(send renderer set-external-tag-path (current-redirect)))
|
||||||
(current-render-mixin multi-html:render-mixin)]
|
(when (current-redirect-main)
|
||||||
[("--latex") "generate LaTeX-format output"
|
(send renderer set-external-root-url (current-redirect-main)))
|
||||||
(current-render-mixin latex:render-mixin)]]
|
(send renderer report-output!)
|
||||||
[once-each
|
(let* ([fns (map (lambda (fn)
|
||||||
[("--dest") dir "write output in <dir>"
|
(let-values ([(base name dir?) (split-path fn)])
|
||||||
(current-dest-directory dir)]
|
(let ([fn (path-replace-suffix
|
||||||
[("--dest-name") name "write output as <name>"
|
(or (current-dest-name) name)
|
||||||
(current-dest-name name)]
|
(send renderer get-suffix))])
|
||||||
[("--prefix") file "use given .html/.tex prefix (for doctype/documentclass)"
|
(if dir (build-path dir fn) fn))))
|
||||||
(current-prefix-file file)]
|
files)]
|
||||||
[("--style") file "use given base .css/.tex file"
|
[info (send renderer collect docs fns)])
|
||||||
(current-style-file file)]
|
(for ([file (in-list (reverse (current-info-input-files)))])
|
||||||
[("--redirect") url "redirect external links to tag search via <url>"
|
(let ([s (with-input-from-file file read)])
|
||||||
(current-redirect url)]
|
(send renderer deserialize-info s info)))
|
||||||
[("--redirect-main") url "redirect main doc links to <url>"
|
(for ([mod+id (in-list (reverse (current-xref-input-modules)))])
|
||||||
(current-redirect-main url)]
|
(let* ([get-xref (dynamic-require (car mod+id) (cdr mod+id))]
|
||||||
[("--info-out") file "write format-specific link information to <file>"
|
[xr (get-xref)])
|
||||||
(current-info-output-file file)]]
|
(unless (xref? xr)
|
||||||
[multi
|
(raise-user-error
|
||||||
[("++info-in") file "load format-specific link information from <file>"
|
'scribble "result from `~s' of `~s' is not an xref: ~e"
|
||||||
(current-info-input-files
|
(cdr mod+id) (car mod+id) xr))
|
||||||
(cons file (current-info-input-files)))]
|
(xref-transfer-info renderer info xr)))
|
||||||
[("++xref-in") module-path proc-id "load format-specific link information by"
|
(let ([r-info (send renderer resolve docs fns info)])
|
||||||
"calling <proc-id> as exported by <module-path>"
|
(send renderer render docs fns r-info)
|
||||||
(let ([mod (read-one module-path)]
|
(when (current-info-output-file)
|
||||||
[id (read-one proc-id)])
|
(let ([s (send renderer serialize-info r-info)])
|
||||||
(unless (module-path? mod)
|
(with-output-to-file (current-info-output-file)
|
||||||
(raise-user-error 'scribble
|
(lambda () (write s))
|
||||||
"bad module path for ++ref-in: ~s"
|
'truncate/replace)))))))
|
||||||
module-path))
|
|
||||||
(unless (symbol? id)
|
|
||||||
(raise-user-error 'scribble
|
|
||||||
"bad procedure identifier for ++ref-in: ~s"
|
|
||||||
proc-id))
|
|
||||||
(current-xref-input-modules
|
|
||||||
(cons (cons mod id) (current-xref-input-modules))))]
|
|
||||||
[("++style") file "add given .css/.tex file"
|
|
||||||
(current-style-extra-files (cons file (current-style-extra-files)))]]
|
|
||||||
[args (file . another-file) (cons file another-file)]))
|
|
||||||
|
|
||||||
(define (build-docs-files files)
|
(run)
|
||||||
(build-docs (map (lambda (file)
|
|
||||||
(dynamic-require `(file ,file) 'doc))
|
|
||||||
files)
|
|
||||||
files))
|
|
||||||
|
|
||||||
(define (build-docs docs files)
|
|
||||||
(let ([dir (current-dest-directory)])
|
|
||||||
(when dir
|
|
||||||
(make-directory* dir))
|
|
||||||
|
|
||||||
(let ([renderer (new ((current-render-mixin) render%)
|
|
||||||
[dest-dir dir]
|
|
||||||
[prefix-file (current-prefix-file)]
|
|
||||||
[style-file (current-style-file)]
|
|
||||||
[style-extra-files (reverse (current-style-extra-files))])])
|
|
||||||
(when (current-redirect)
|
|
||||||
(send renderer set-external-tag-path (current-redirect)))
|
|
||||||
(when (current-redirect-main)
|
|
||||||
(send renderer set-external-root-url (current-redirect-main)))
|
|
||||||
(send renderer report-output!)
|
|
||||||
(let* ([fns (map (lambda (fn)
|
|
||||||
(let-values ([(base name dir?) (split-path fn)])
|
|
||||||
(let ([fn (path-replace-suffix (or (current-dest-name) name)
|
|
||||||
(send renderer get-suffix))])
|
|
||||||
(if dir
|
|
||||||
(build-path dir fn)
|
|
||||||
fn))))
|
|
||||||
files)]
|
|
||||||
[info (send renderer collect docs fns)])
|
|
||||||
(for-each (lambda (file)
|
|
||||||
(let ([s (with-input-from-file file read)])
|
|
||||||
(send renderer deserialize-info s info)))
|
|
||||||
(reverse (current-info-input-files)))
|
|
||||||
(for-each (lambda (mod+id)
|
|
||||||
(let ([get-xref (dynamic-require (car mod+id) (cdr mod+id))])
|
|
||||||
(let ([xr (get-xref)])
|
|
||||||
(unless (xref? xr)
|
|
||||||
(raise-user-error 'scribble
|
|
||||||
"result from `~s' of `~s' is not an xref: ~e"
|
|
||||||
(cdr mod+id)
|
|
||||||
(car mod+id)
|
|
||||||
xr))
|
|
||||||
(xref-transfer-info renderer info xr))))
|
|
||||||
(reverse (current-xref-input-modules)))
|
|
||||||
(let ([r-info (send renderer resolve docs fns info)])
|
|
||||||
(send renderer render docs fns r-info)
|
|
||||||
(when (current-info-output-file)
|
|
||||||
(let ([s (send renderer serialize-info r-info)])
|
|
||||||
(with-output-to-file (current-info-output-file)
|
|
||||||
(lambda ()
|
|
||||||
(write s))
|
|
||||||
'truncate/replace)))))))))
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user