diff --git a/collects/scribble/doclang2.rkt b/collects/scribble/doclang2.rkt new file mode 100644 index 00000000..523ca363 --- /dev/null +++ b/collects/scribble/doclang2.rkt @@ -0,0 +1,28 @@ +#lang racket/base + +;; A slightly nicer version of doclang where the parameters are keyword-based +;; rather than positional. Delegates off to the original doclang. + +(require (prefix-in doclang: "doclang.rkt") + (for-syntax racket/base + syntax/parse)) + +(provide (except-out (all-from-out racket/base) #%module-begin) + (rename-out [*module-begin #%module-begin])) + +;; Module wrapper ---------------------------------------- + +(define-syntax (*module-begin stx) + (syntax-parse stx + [(_ (~or (~optional (~seq #:id id)) + (~optional (~seq #:post-process post-process)) + (~optional (~seq #:exprs exprs))) + ... + . body) + (with-syntax ([id (or (attribute id) + #'doc)] + [post-process (or (attribute post-process) + #'values)] + [exprs (or (attribute exprs) + #'())]) + #'(doclang:#%module-begin id post-process exprs . body))])) diff --git a/collects/scribblings/scribble/doclang.scrbl b/collects/scribblings/scribble/doclang.scrbl index 9263de76..483ba954 100644 --- a/collects/scribblings/scribble/doclang.scrbl +++ b/collects/scribblings/scribble/doclang.scrbl @@ -3,11 +3,11 @@ @title[#:tag "doclang"]{Document Language} -@defmodulelang[scribble/doclang]{The @racketmodname[scribble/doclang] +@defmodulelang[scribble/doclang2]{The @racketmodname[scribble/doclang2] language provides everything from @racket[racket/base], except that it -replaces the @racket[#%module-begin] form.} +replaces the @racket[#%module-begin] form. -The @racketmodname[scribble/doclang] @racket[#%module-begin] +The @racketmodname[scribble/doclang2] @racket[#%module-begin] essentially packages the body of the module into a call to @racket[decode], binds the result to @racket[doc], and exports @racket[doc]. @@ -16,3 +16,102 @@ Any module-level form other than an expression (e.g., a @racket[require] or @racket[define]) remains at the top level, and the @racket[doc] binding is put at the end of the module. As usual, a module-top-level @racket[begin] slices into the module top level. + +For example: +@codeblock|{ +#lang racket +(module example scribble/doclang2 + "hello world, this is" + " an example document") +(require 'example) +doc +}| + +The behavior of @racketmodname[scribble/doclang2] can be customized by +providing @racket[#:id], @racket[#:post-process], and @racket[#:exprs] +arguments at the very beginning of the module. + +@itemize[ + +@item{@racket[#:id] names the top-level documentation binding. By default, this +is @racket[doc].} + +@item{@racket[#:post-process] processes the body of the module after +@racket[decode]. By default, this is @racket[values].} + +@item{@racket[#:exprs] prepends an additional sequence of expressions to the +beginning of the module's body. By default, this is the empty sequence +@racket[()].} + +] + +This example explicitly uses the defaults for all three keywords: + +@codeblock|{ +#lang racket +(module example scribble/doclang2 + #:id doc + #:post-process values + #:exprs () + "hello world, this is an example document") +(require 'example) +doc +}| + + +The next toy example uses a different name for the documentation binding, and +also adds an additional binding with a count of the parts in the document: + +@codeblock|{ +#lang racket +(module example scribble/doclang2 + #:id documentation + #:post-process (lambda (decoded-doc) + (set! number-of-parts (length (part-parts decoded-doc))) + decoded-doc) + #:exprs ((title "My first expression!")) + + (require scribble/core + scribble/base) + + (define number-of-parts #f) + (provide number-of-parts) + (section "part 1") + "hello world" + (section "part 2") + "this is another document") + +(require 'example) +number-of-parts +documentation +}| +} + + + + +@defmodulelang[scribble/doclang]{The @racketmodname[scribble/doclang] language +provides the same functionality as @racketmodname[scribble/doclang2], where the +configuration options are positional and mandatory. The first three elements +in the @racket[#%module-begin]'s body must be the @racket[id], +@racket[post-process], and @racket[exprs] arguments. + +Example: +@codeblock|{ +#lang racket +(module* example scribble/doclang + doc + values + () + (require scribble/base) + (provide (all-defined-out)) + (define foo (para "hello again")) + "hello world, this is an example document" + (para "note the " (bold "structure"))) + +(module+ main + (require (submod ".." example)) + (printf "I see doc is: ~s\n\n" doc) + (printf "I see foo is: ~s" foo)) +}| +}