racket/collects/scribble/tools/drscheme-buttons.ss
Sam Tobin-Hochstadt 8ccbe74e5e don't open url twice
svn: r17824
2010-01-25 20:00:32 +00:00

59 lines
2.3 KiB
Scheme

#lang scheme/base
(require scheme/runtime-path
scheme/gui/base
scheme/class
mrlib/bitmap-label
scheme/system
setup/xref
net/sendurl)
(provide drscheme-buttons)
(define-runtime-path pdf-png-path "pdf.png")
(define-runtime-path html-png-path "html.png")
(define pdf.png (make-object bitmap% pdf-png-path 'png/mask))
(define html.png (make-object bitmap% html-png-path 'png/mask))
(define-namespace-anchor anchor)
(define (make-render-button label bmp mode suffix extra-cmdline)
(list
label
bmp
(λ (drs-frame)
(let* ([t (send drs-frame get-definitions-text)]
[fn (send t get-filename)])
(if (and fn (not (send t is-modified?)))
(let-values ([(p) (open-output-string)]
[(base name dir?) (split-path fn)])
(parameterize ([current-namespace (make-base-namespace)]
[current-output-port p]
[current-error-port p]
[current-command-line-arguments
(list->vector
(append
extra-cmdline
(list "--dest" (path->string base))
(list mode (if (path? fn) (path->string fn) fn))))])
(namespace-attach-module (namespace-anchor->empty-namespace anchor) 'setup/xref)
(dynamic-require 'scribble/run #f)
(cond
[(equal? label "HTML")
(send-url/file (path-replace-suffix fn suffix))]
[else (system (format "open ~a" (path-replace-suffix name suffix)))]))
(message-box "Scribble" (get-output-string p) drs-frame))
(message-box "Not Named" "Cannot render unsaved file"))))))
(define drscheme-buttons
(let ([html-button
(make-render-button "HTML" html.png "--html" #".html"
'("++xref-in" "setup/xref" "load-collections-xref"))]
[pdf-button
;; only available on OSX currently
;; when we have a general way of opening pdfs, can use that
(make-render-button "PDF" pdf.png "--pdf" #".pdf" null)])
(case (system-type)
[(macosx) (list html-button pdf-button)]
[else (list html-button)])))