From bbe51a11aa8e9241abd444ea02c7de144f2deb77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Georges=20Dup=C3=A9ron?= Date: Tue, 20 Sep 2016 18:35:21 +0200 Subject: [PATCH] Extracted manual-scheme.rkt and racket.rkt from upstream scribble repository --- .gitignore | 10 - .../manual-scheme.rkt => manual-scheme.rkt | 0 .../scribble/racket.rkt => racket.rkt | 0 scribble-doc/LICENSE.txt | 11 - scribble-doc/info.rkt | 28 - scribble-doc/scribblings/scribble/base.scrbl | 793 ------ scribble-doc/scribblings/scribble/basic.scrbl | 26 - .../scribblings/scribble/blueboxes.scrbl | 59 - scribble-doc/scribblings/scribble/bnf.scrbl | 97 - scribble-doc/scribblings/scribble/book.scrbl | 9 - .../scribblings/scribble/class-diagrams.rkt | 514 ---- .../scribblings/scribble/compat.scrbl | 6 - .../scribblings/scribble/config.scrbl | 654 ----- scribble-doc/scribblings/scribble/core.scrbl | 1801 -------------- .../scribblings/scribble/decode.scrbl | 228 -- .../scribblings/scribble/demo-class.scrbl | 23 - .../scribblings/scribble/demo-m1.scrbl | 10 - .../scribblings/scribble/demo-m2.scrbl | 12 - .../scribblings/scribble/demo-manual-m1.scrbl | 10 - .../scribblings/scribble/demo-manual-m2.scrbl | 12 - .../scribblings/scribble/demo-manual-s1.scrbl | 10 - .../scribblings/scribble/demo-manual-s2.scrbl | 12 - .../scribblings/scribble/demo-manual.scrbl | 203 -- .../scribblings/scribble/demo-s1.scrbl | 10 - .../scribblings/scribble/demo-s2.scrbl | 12 - scribble-doc/scribblings/scribble/demo.scrbl | 324 --- .../scribblings/scribble/doclang.scrbl | 117 - .../scribblings/scribble/docreader.scrbl | 10 - scribble-doc/scribblings/scribble/eval.scrbl | 180 -- .../scribblings/scribble/examples.scrbl | 304 --- .../scribblings/scribble/generic.scrbl | 14 - .../scribble/getting-started.scrbl | 10 - .../scribblings/scribble/how-to-paper.scrbl | 682 ----- .../scribblings/scribble/how-to.scrbl | 381 --- scribble-doc/scribblings/scribble/html.scrbl | 494 ---- scribble-doc/scribblings/scribble/inbox.css | 4 - scribble-doc/scribblings/scribble/inbox.tex | 2 - scribble-doc/scribblings/scribble/info.rkt | 14 - .../scribblings/scribble/internals.scrbl | 19 - scribble-doc/scribblings/scribble/jfp.scrbl | 73 - .../scribblings/scribble/layers.scrbl | 239 -- scribble-doc/scribblings/scribble/lncs.scrbl | 97 - .../scribblings/scribble/lp-ex-doc.scrbl | 4 - scribble-doc/scribblings/scribble/lp-ex.rkt | 18 - scribble-doc/scribblings/scribble/lp.css | 4 - scribble-doc/scribblings/scribble/lp.scrbl | 136 - scribble-doc/scribblings/scribble/lp.tex | 3 - .../scribblings/scribble/manual-stub.scrbl | 8 - .../scribblings/scribble/manual.scrbl | 2185 ----------------- scribble-doc/scribblings/scribble/plt.scrbl | 25 - .../scribble/reader-internals.scrbl | 335 --- .../scribblings/scribble/reader.scrbl | 742 ------ .../scribblings/scribble/renderer.scrbl | 474 ---- .../scribblings/scribble/report.scrbl | 8 - .../scribblings/scribble/running.scrbl | 212 -- .../scribblings/scribble/scheme.scrbl | 223 -- .../scribblings/scribble/scribble-pp.scrbl | 26 - .../scribblings/scribble/scribble.scrbl | 32 - scribble-doc/scribblings/scribble/shaded.css | 1 - scribble-doc/scribblings/scribble/shaded.tex | 2 - .../scribblings/scribble/sigplan.scrbl | 146 -- .../scribblings/scribble/srcdoc.scrbl | 258 -- .../scribblings/scribble/struct-hierarchy.rkt | 393 --- .../scribblings/scribble/struct.scrbl | 280 --- scribble-doc/scribblings/scribble/style.scrbl | 231 -- scribble-doc/scribblings/scribble/tag.scrbl | 140 -- scribble-doc/scribblings/scribble/text.scrbl | 1362 ---------- scribble-doc/scribblings/scribble/utils.rkt | 229 -- scribble-doc/scribblings/scribble/xref.scrbl | 236 -- .../scriblib/scribblings/autobib.scrbl | 244 -- .../scriblib/scribblings/bibtex.scrbl | 54 - .../scriblib/scribblings/figure.scrbl | 129 - .../scriblib/scribblings/footnote.scrbl | 33 - .../scriblib/scribblings/gui-eval.scrbl | 81 - scribble-doc/scriblib/scribblings/info.rkt | 3 - .../scriblib/scribblings/render-cond.scrbl | 63 - .../scriblib/scribblings/scriblib.scrbl | 12 - scribble-html-lib/LICENSE.txt | 11 - scribble-html-lib/info.rkt | 11 - scribble-html-lib/scribble/html.rkt | 4 - scribble-html-lib/scribble/html/html.rkt | 471 ---- scribble-html-lib/scribble/html/info.rkt | 3 - scribble-html-lib/scribble/html/lang.rkt | 14 - .../scribble/html/lang/reader.rkt | 11 - scribble-html-lib/scribble/html/main.rkt | 17 - scribble-html-lib/scribble/html/resource.rkt | 243 -- scribble-html-lib/scribble/html/xml.rkt | 162 -- scribble-lib/LICENSE.txt | 11 - scribble-lib/help/help.rkt | 21 - scribble-lib/help/info.rkt | 3 - scribble-lib/help/search.rkt | 81 - scribble-lib/info.rkt | 26 - scribble-lib/scribble/HISTORY.txt | 26 - scribble-lib/scribble/base-render.rkt | 1152 --------- scribble-lib/scribble/base.rkt | 976 -------- scribble-lib/scribble/base/lang.rkt | 4 - scribble-lib/scribble/base/lang/reader.rkt | 3 - scribble-lib/scribble/basic.rkt | 46 - scribble-lib/scribble/blueboxes.rkt | 198 -- scribble-lib/scribble/bnf.rkt | 93 - scribble-lib/scribble/book/lang.rkt | 20 - scribble-lib/scribble/book/lang/reader.rkt | 3 - scribble-lib/scribble/book/style.tex | 47 - scribble-lib/scribble/comment-reader.rkt | 83 - scribble-lib/scribble/config.rkt | 6 - scribble-lib/scribble/contract-render.rkt | 185 -- scribble-lib/scribble/core.rkt | 781 ------ scribble-lib/scribble/decode-struct.rkt | 5 - scribble-lib/scribble/decode.rkt | 368 --- scribble-lib/scribble/doc.txt | 708 ------ scribble-lib/scribble/doc/lang/reader.rkt | 3 - scribble-lib/scribble/doc/main.rkt | 5 - scribble-lib/scribble/doc/reader.rkt | 1 - scribble-lib/scribble/doclang.rkt | 93 - scribble-lib/scribble/doclang2.rkt | 28 - scribble-lib/scribble/elsarticle/.gitignore | 2 - .../scribble/elsarticle/elsarticle.tex | 5 - scribble-lib/scribble/elsarticle/lang.rkt | 68 - .../scribble/elsarticle/lang/reader.rkt | 3 - scribble-lib/scribble/elsarticle/style.tex | 3 - scribble-lib/scribble/eval.rkt | 952 ------- scribble-lib/scribble/example.rkt | 113 - scribble-lib/scribble/examples.rkt | 4 - scribble-lib/scribble/extract.rkt | 53 - scribble-lib/scribble/html-properties.rkt | 32 - scribble-lib/scribble/html-render.rkt | 2049 ---------------- scribble-lib/scribble/info.rkt | 17 - scribble-lib/scribble/jfp.rkt | 66 - scribble-lib/scribble/jfp/.gitignore | 2 - scribble-lib/scribble/jfp/jfp.css | 0 scribble-lib/scribble/jfp/jfp.tex | 5 - scribble-lib/scribble/jfp/lang.rkt | 60 - scribble-lib/scribble/jfp/lang/reader.rkt | 3 - scribble-lib/scribble/jfp/replacements.tex | 1 - scribble-lib/scribble/jfp/style.tex | 3 - scribble-lib/scribble/latex-prefix.rkt | 8 - scribble-lib/scribble/latex-properties.rkt | 13 - scribble-lib/scribble/latex-render.rkt | 1396 ----------- scribble-lib/scribble/lncs/.gitignore | 2 - scribble-lib/scribble/lncs/lang.rkt | 195 -- scribble-lib/scribble/lncs/lang/reader.rkt | 3 - scribble-lib/scribble/lncs/lncs.tex | 11 - scribble-lib/scribble/lncs/style.tex | 3 - scribble-lib/scribble/lp-include.rkt | 20 - scribble-lib/scribble/lp.rkt | 3 - scribble-lib/scribble/lp/lang/common.rkt | 149 -- scribble-lib/scribble/lp/lang/lang.rkt | 7 - scribble-lib/scribble/lp/lang/lang2.rkt | 7 - scribble-lib/scribble/lp/lang/reader.rkt | 17 - scribble-lib/scribble/lp2.rkt | 16 - scribble-lib/scribble/manual-fonts.css | 343 --- scribble-lib/scribble/manual-prefix.tex | 15 - scribble-lib/scribble/manual-racket.css | 319 --- scribble-lib/scribble/manual-racket.js | 98 - scribble-lib/scribble/manual-struct.rkt | 21 - scribble-lib/scribble/manual-style.css | 743 ------ scribble-lib/scribble/manual-style.tex | 11 - scribble-lib/scribble/manual.rkt | 38 - scribble-lib/scribble/manual/lang.rkt | 12 - scribble-lib/scribble/manual/lang/reader.rkt | 3 - scribble-lib/scribble/markdown-render.rkt | 301 --- scribble-lib/scribble/pdf-render.rkt | 17 - scribble-lib/scribble/private/defaults.rkt | 47 - .../scribble/private/indirect-renderer.rkt | 47 - .../scribble/private/literal-anchor.rkt | 7 - scribble-lib/scribble/private/lp.rkt | 85 - scribble-lib/scribble/private/manual-bib.rkt | 89 - scribble-lib/scribble/private/manual-bind.rkt | 273 -- .../scribble/private/manual-class-struct.rkt | 8 - .../scribble/private/manual-class.rkt | 530 ---- scribble-lib/scribble/private/manual-code.rkt | 373 --- .../scribble/private/manual-defaults.rkt | 27 - scribble-lib/scribble/private/manual-ex.rkt | 10 - scribble-lib/scribble/private/manual-form.rkt | 450 ---- .../scribble/private/manual-history.rkt | 60 - .../scribble/private/manual-method.rkt | 63 - scribble-lib/scribble/private/manual-mod.rkt | 336 --- scribble-lib/scribble/private/manual-proc.rkt | 1202 --------- .../scribble/private/manual-sprop.rkt | 13 - .../scribble/private/manual-style.rkt | 256 -- scribble-lib/scribble/private/manual-tech.rkt | 76 - scribble-lib/scribble/private/manual-unit.rkt | 67 - .../scribble/private/manual-utils.rkt | 36 - scribble-lib/scribble/private/manual-vars.rkt | 218 -- scribble-lib/scribble/private/on-demand.rkt | 12 - .../scribble/private/provide-structs.rkt | 37 - scribble-lib/scribble/private/qsloc.rkt | 8 - .../scribble/private/render-utils.rkt | 55 - .../scribble/private/run-pdflatex.rkt | 95 - scribble-lib/scribble/private/serialize.rkt | 18 - .../scribble/provide-doc-transform.rkt | 7 - scribble-lib/scribble/racket.css | 249 -- scribble-lib/scribble/racket.tex | 74 - scribble-lib/scribble/render-struct.rkt | 8 - scribble-lib/scribble/render.rkt | 95 - scribble-lib/scribble/report/lang.rkt | 20 - scribble-lib/scribble/report/lang/reader.rkt | 3 - scribble-lib/scribble/run.rkt | 183 -- scribble-lib/scribble/scheme.rkt | 3 - scribble-lib/scribble/scribble-common.js | 170 -- .../scribble/scribble-load-replace.tex | 1 - scribble-lib/scribble/scribble-load.tex | 18 - scribble-lib/scribble/scribble-prefix.html | 1 - scribble-lib/scribble/scribble-prefix.tex | 5 - scribble-lib/scribble/scribble-skull.tex | 1 - scribble-lib/scribble/scribble-style.css | 0 scribble-lib/scribble/scribble-style.tex | 0 scribble-lib/scribble/scribble.css | 484 ---- scribble-lib/scribble/scribble.tex | 397 --- scribble-lib/scribble/search.rkt | 179 -- scribble-lib/scribble/sigplan.rkt | 177 -- scribble-lib/scribble/sigplan/lang.rkt | 88 - scribble-lib/scribble/sigplan/lang/reader.rkt | 3 - scribble-lib/scribble/sigplan/sigplan.css | 13 - scribble-lib/scribble/sigplan/sigplan.tex | 23 - scribble-lib/scribble/sigplan/sigplanconf.cls | 1311 ---------- scribble-lib/scribble/sigplan/style.tex | 41 - scribble-lib/scribble/srcdoc.rkt | 710 ------ scribble-lib/scribble/struct.rkt | 429 ---- scribble-lib/scribble/tag.rkt | 132 - scribble-lib/scribble/text-render.rkt | 305 --- scribble-lib/scribble/urls.rkt | 10 - .../scribble/valid-blueboxes-info.rkt | 14 - scribble-lib/scribble/xref.rkt | 173 -- scribble-lib/scriblib/autobib.css | 9 - scribble-lib/scriblib/autobib.rkt | 608 ----- scribble-lib/scriblib/autobib.tex | 8 - scribble-lib/scriblib/bibtex.rkt | 334 --- scribble-lib/scriblib/figure.css | 37 - scribble-lib/scriblib/figure.js | 27 - scribble-lib/scriblib/figure.rkt | 140 -- scribble-lib/scriblib/figure.tex | 42 - scribble-lib/scriblib/footnote.css | 27 - scribble-lib/scriblib/footnote.rkt | 86 - scribble-lib/scriblib/footnote.tex | 12 - scribble-lib/scriblib/gui-eval.rkt | 174 -- scribble-lib/scriblib/info.rkt | 3 - scribble-lib/scriblib/private/counter.rkt | 99 - .../scriblib/private/gui-eval-exn.rkt | 6 - scribble-lib/scriblib/render-cond.rkt | 75 - scribble-test/LICENSE.txt | 11 - scribble-test/info.rkt | 18 - .../tests/help/test-docs-complete2.rkt | 3 - scribble-test/tests/scribble/decode.rkt | 52 - scribble-test/tests/scribble/docs.rkt | 83 - .../tests/scribble/docs/autobib-broken.scrbl | 17 - .../tests/scribble/docs/autobib-broken.txt | 1 - .../docs/autobib-disambiguation-corner.scrbl | 19 - .../docs/autobib-disambiguation-corner.txt | 6 - .../docs/autobib-disambiguation-more.scrbl | 56 - .../docs/autobib-disambiguation-more.txt | 20 - .../docs/autobib-disambiguation.scrbl | 32 - .../scribble/docs/autobib-disambiguation.txt | 10 - .../scribble/docs/autobib-numbered.scrbl | 57 - .../tests/scribble/docs/autobib-numbered.txt | 20 - .../tests/scribble/docs/autobib-order.scrbl | 19 - .../tests/scribble/docs/autobib-order.txt | 7 - .../tests/scribble/docs/autobib.scrbl | 32 - scribble-test/tests/scribble/docs/autobib.txt | 17 - .../tests/scribble/docs/box-chars.scrbl | 41 - .../tests/scribble/docs/box-chars.txt | 14 - .../tests/scribble/docs/codeblock-quote.scrbl | 10 - .../tests/scribble/docs/codeblock-quote.txt | 4 - .../tests/scribble/docs/codeblock-utf8.scrbl | 12 - .../tests/scribble/docs/codeblock-utf8.txt | 7 - scribble-test/tests/scribble/docs/cond.scrbl | 20 - scribble-test/tests/scribble/docs/cond.txt | 7 - .../tests/scribble/docs/decode.scrbl | 4 - scribble-test/tests/scribble/docs/decode.txt | 2 - scribble-test/tests/scribble/docs/diamond.rkt | 15 - .../tests/scribble/docs/diamond.scrbl | 14 - scribble-test/tests/scribble/docs/diamond.txt | 5 - .../scribble/docs/empty-onthispage.scrbl | 9 - .../tests/scribble/docs/empty-onthispage.txt | 8 - .../tests/scribble/docs/eval-false.scrbl | 4 - .../tests/scribble/docs/eval-false.txt | 4 - .../tests/scribble/docs/eval-special.scrbl | 14 - .../tests/scribble/docs/eval-special.txt | 22 - .../tests/scribble/docs/examples.scrbl | 93 - .../tests/scribble/docs/examples.txt | 100 - .../tests/scribble/docs/figure.scrbl | 20 - scribble-test/tests/scribble/docs/figure.txt | 10 - .../tests/scribble/docs/filebox.scrbl | 12 - scribble-test/tests/scribble/docs/filebox.txt | 7 - .../tests/scribble/docs/footnote.scrbl | 12 - .../tests/scribble/docs/footnote.txt | 9 - .../tests/scribble/docs/grouper-sub.scrbl | 41 - .../tests/scribble/docs/grouper-sub.txt | 48 - .../tests/scribble/docs/grouper.scrbl | 46 - scribble-test/tests/scribble/docs/grouper.txt | 52 - .../tests/scribble/docs/include-section.scrbl | 6 - .../tests/scribble/docs/include-section.txt | 7 - .../tests/scribble/docs/itemlist.scrbl | 10 - .../tests/scribble/docs/itemlist.txt | 11 - .../tests/scribble/docs/list-section.scrbl | 9 - .../tests/scribble/docs/list-section.txt | 9 - .../tests/scribble/docs/lp-comment.scrbl | 8 - .../tests/scribble/docs/lp-comment.txt | 6 - .../tests/scribble/docs/manual-ex.rkt | 22 - .../tests/scribble/docs/manual.scrbl | 135 - scribble-test/tests/scribble/docs/manual.txt | 278 --- .../tests/scribble/docs/numberer.scrbl | 37 - .../tests/scribble/docs/numberer.txt | 29 - .../tests/scribble/docs/print-lines.scrbl | 21 - .../tests/scribble/docs/print-lines.txt | 18 - .../tests/scribble/docs/read-alts.scrbl | 13 - .../tests/scribble/docs/read-alts.txt | 8 - .../tests/scribble/docs/secref.scrbl | 36 - scribble-test/tests/scribble/docs/secref.txt | 32 - .../tests/scribble/docs/secref2.scrbl | 55 - scribble-test/tests/scribble/docs/secref2.txt | 65 - .../tests/scribble/docs/secref3.scrbl | 55 - scribble-test/tests/scribble/docs/secref3.txt | 65 - scribble-test/tests/scribble/docs/srcdoc.rkt | 12 - .../tests/scribble/docs/srcdoc.scrbl | 6 - scribble-test/tests/scribble/docs/srcdoc.txt | 9 - .../tests/scribble/docs/stxobj.scrbl | 6 - scribble-test/tests/scribble/docs/stxobj.txt | 2 - .../tests/scribble/docs/table-border.scrbl | 9 - .../tests/scribble/docs/table-border.txt | 8 - scribble-test/tests/scribble/docs/table.scrbl | 24 - scribble-test/tests/scribble/docs/table.txt | 12 - scribble-test/tests/scribble/docs/tech.scrbl | 27 - scribble-test/tests/scribble/docs/tech.txt | 12 - scribble-test/tests/scribble/docs/text.scrbl | 76 - scribble-test/tests/scribble/docs/text.txt | 71 - .../tests/scribble/docs/traverse.scrbl | 41 - .../tests/scribble/docs/traverse.txt | 11 - .../tests/scribble/docs/verbatim.scrbl | 39 - .../tests/scribble/docs/verbatim.txt | 31 - scribble-test/tests/scribble/docs/wrap.scrbl | 20 - scribble-test/tests/scribble/docs/wrap.txt | 18 - scribble-test/tests/scribble/eval.rkt | 71 - scribble-test/tests/scribble/exe.rkt | 33 - scribble-test/tests/scribble/main.rkt | 14 - .../tests/scribble/markdown-docs/example.md | 98 - .../scribble/markdown-docs/example.scrbl | 104 - scribble-test/tests/scribble/markdown.rkt | 53 - scribble-test/tests/scribble/reader.rkt | 966 -------- scribble-test/tests/scribble/render.rkt | 23 - scribble-test/tests/scribble/text-collect.rkt | 82 - scribble-test/tests/scribble/text-lang.rkt | 66 - scribble-test/tests/scribble/text-wrap.rkt | 121 - scribble-test/tests/scribble/xref.rkt | 18 - .../tests/scriblib/bibtex.normal.txt | 8 - .../tests/scriblib/bibtex.number.txt | 8 - scribble-test/tests/scriblib/bibtex.rkt | 76 - scribble-test/tests/scriblib/example.bib | 407 --- scribble-test/tests/scriblib/info.rkt | 3 - scribble-text-lib/LICENSE.txt | 11 - scribble-text-lib/info.rkt | 12 - scribble-text-lib/scribble/info.rkt | 3 - scribble-text-lib/scribble/text.rkt | 4 - scribble-text-lib/scribble/text/lang.rkt | 9 - .../scribble/text/lang/reader.rkt | 11 - scribble-text-lib/scribble/text/main.rkt | 7 - scribble-text-lib/scribble/text/output.rkt | 329 --- .../scribble/text/syntax-utils.rkt | 213 -- scribble-text-lib/scribble/text/wrap.rkt | 105 - scribble/LICENSE.txt | 11 - scribble/info.rkt | 12 - 361 files changed, 45886 deletions(-) delete mode 100644 .gitignore rename scribble-lib/scribble/private/manual-scheme.rkt => manual-scheme.rkt (100%) rename scribble-lib/scribble/racket.rkt => racket.rkt (100%) delete mode 100644 scribble-doc/LICENSE.txt delete mode 100644 scribble-doc/info.rkt delete mode 100644 scribble-doc/scribblings/scribble/base.scrbl delete mode 100644 scribble-doc/scribblings/scribble/basic.scrbl delete mode 100644 scribble-doc/scribblings/scribble/blueboxes.scrbl delete mode 100644 scribble-doc/scribblings/scribble/bnf.scrbl delete mode 100644 scribble-doc/scribblings/scribble/book.scrbl delete mode 100644 scribble-doc/scribblings/scribble/class-diagrams.rkt delete mode 100644 scribble-doc/scribblings/scribble/compat.scrbl delete mode 100644 scribble-doc/scribblings/scribble/config.scrbl delete mode 100644 scribble-doc/scribblings/scribble/core.scrbl delete mode 100644 scribble-doc/scribblings/scribble/decode.scrbl delete mode 100644 scribble-doc/scribblings/scribble/demo-class.scrbl delete mode 100644 scribble-doc/scribblings/scribble/demo-m1.scrbl delete mode 100644 scribble-doc/scribblings/scribble/demo-m2.scrbl delete mode 100644 scribble-doc/scribblings/scribble/demo-manual-m1.scrbl delete mode 100644 scribble-doc/scribblings/scribble/demo-manual-m2.scrbl delete mode 100644 scribble-doc/scribblings/scribble/demo-manual-s1.scrbl delete mode 100644 scribble-doc/scribblings/scribble/demo-manual-s2.scrbl delete mode 100644 scribble-doc/scribblings/scribble/demo-manual.scrbl delete mode 100644 scribble-doc/scribblings/scribble/demo-s1.scrbl delete mode 100644 scribble-doc/scribblings/scribble/demo-s2.scrbl delete mode 100644 scribble-doc/scribblings/scribble/demo.scrbl delete mode 100644 scribble-doc/scribblings/scribble/doclang.scrbl delete mode 100644 scribble-doc/scribblings/scribble/docreader.scrbl delete mode 100644 scribble-doc/scribblings/scribble/eval.scrbl delete mode 100644 scribble-doc/scribblings/scribble/examples.scrbl delete mode 100644 scribble-doc/scribblings/scribble/generic.scrbl delete mode 100644 scribble-doc/scribblings/scribble/getting-started.scrbl delete mode 100644 scribble-doc/scribblings/scribble/how-to-paper.scrbl delete mode 100644 scribble-doc/scribblings/scribble/how-to.scrbl delete mode 100644 scribble-doc/scribblings/scribble/html.scrbl delete mode 100644 scribble-doc/scribblings/scribble/inbox.css delete mode 100644 scribble-doc/scribblings/scribble/inbox.tex delete mode 100644 scribble-doc/scribblings/scribble/info.rkt delete mode 100644 scribble-doc/scribblings/scribble/internals.scrbl delete mode 100644 scribble-doc/scribblings/scribble/jfp.scrbl delete mode 100644 scribble-doc/scribblings/scribble/layers.scrbl delete mode 100644 scribble-doc/scribblings/scribble/lncs.scrbl delete mode 100644 scribble-doc/scribblings/scribble/lp-ex-doc.scrbl delete mode 100644 scribble-doc/scribblings/scribble/lp-ex.rkt delete mode 100644 scribble-doc/scribblings/scribble/lp.css delete mode 100644 scribble-doc/scribblings/scribble/lp.scrbl delete mode 100644 scribble-doc/scribblings/scribble/lp.tex delete mode 100644 scribble-doc/scribblings/scribble/manual-stub.scrbl delete mode 100644 scribble-doc/scribblings/scribble/manual.scrbl delete mode 100644 scribble-doc/scribblings/scribble/plt.scrbl delete mode 100644 scribble-doc/scribblings/scribble/reader-internals.scrbl delete mode 100644 scribble-doc/scribblings/scribble/reader.scrbl delete mode 100644 scribble-doc/scribblings/scribble/renderer.scrbl delete mode 100644 scribble-doc/scribblings/scribble/report.scrbl delete mode 100644 scribble-doc/scribblings/scribble/running.scrbl delete mode 100644 scribble-doc/scribblings/scribble/scheme.scrbl delete mode 100644 scribble-doc/scribblings/scribble/scribble-pp.scrbl delete mode 100644 scribble-doc/scribblings/scribble/scribble.scrbl delete mode 100644 scribble-doc/scribblings/scribble/shaded.css delete mode 100644 scribble-doc/scribblings/scribble/shaded.tex delete mode 100644 scribble-doc/scribblings/scribble/sigplan.scrbl delete mode 100644 scribble-doc/scribblings/scribble/srcdoc.scrbl delete mode 100644 scribble-doc/scribblings/scribble/struct-hierarchy.rkt delete mode 100644 scribble-doc/scribblings/scribble/struct.scrbl delete mode 100644 scribble-doc/scribblings/scribble/style.scrbl delete mode 100644 scribble-doc/scribblings/scribble/tag.scrbl delete mode 100644 scribble-doc/scribblings/scribble/text.scrbl delete mode 100644 scribble-doc/scribblings/scribble/utils.rkt delete mode 100644 scribble-doc/scribblings/scribble/xref.scrbl delete mode 100644 scribble-doc/scriblib/scribblings/autobib.scrbl delete mode 100644 scribble-doc/scriblib/scribblings/bibtex.scrbl delete mode 100644 scribble-doc/scriblib/scribblings/figure.scrbl delete mode 100644 scribble-doc/scriblib/scribblings/footnote.scrbl delete mode 100644 scribble-doc/scriblib/scribblings/gui-eval.scrbl delete mode 100644 scribble-doc/scriblib/scribblings/info.rkt delete mode 100644 scribble-doc/scriblib/scribblings/render-cond.scrbl delete mode 100644 scribble-doc/scriblib/scribblings/scriblib.scrbl delete mode 100644 scribble-html-lib/LICENSE.txt delete mode 100644 scribble-html-lib/info.rkt delete mode 100644 scribble-html-lib/scribble/html.rkt delete mode 100644 scribble-html-lib/scribble/html/html.rkt delete mode 100644 scribble-html-lib/scribble/html/info.rkt delete mode 100644 scribble-html-lib/scribble/html/lang.rkt delete mode 100644 scribble-html-lib/scribble/html/lang/reader.rkt delete mode 100644 scribble-html-lib/scribble/html/main.rkt delete mode 100644 scribble-html-lib/scribble/html/resource.rkt delete mode 100644 scribble-html-lib/scribble/html/xml.rkt delete mode 100644 scribble-lib/LICENSE.txt delete mode 100644 scribble-lib/help/help.rkt delete mode 100644 scribble-lib/help/info.rkt delete mode 100644 scribble-lib/help/search.rkt delete mode 100644 scribble-lib/info.rkt delete mode 100644 scribble-lib/scribble/HISTORY.txt delete mode 100644 scribble-lib/scribble/base-render.rkt delete mode 100644 scribble-lib/scribble/base.rkt delete mode 100644 scribble-lib/scribble/base/lang.rkt delete mode 100644 scribble-lib/scribble/base/lang/reader.rkt delete mode 100644 scribble-lib/scribble/basic.rkt delete mode 100644 scribble-lib/scribble/blueboxes.rkt delete mode 100644 scribble-lib/scribble/bnf.rkt delete mode 100644 scribble-lib/scribble/book/lang.rkt delete mode 100644 scribble-lib/scribble/book/lang/reader.rkt delete mode 100644 scribble-lib/scribble/book/style.tex delete mode 100644 scribble-lib/scribble/comment-reader.rkt delete mode 100644 scribble-lib/scribble/config.rkt delete mode 100644 scribble-lib/scribble/contract-render.rkt delete mode 100644 scribble-lib/scribble/core.rkt delete mode 100644 scribble-lib/scribble/decode-struct.rkt delete mode 100644 scribble-lib/scribble/decode.rkt delete mode 100644 scribble-lib/scribble/doc.txt delete mode 100644 scribble-lib/scribble/doc/lang/reader.rkt delete mode 100644 scribble-lib/scribble/doc/main.rkt delete mode 100644 scribble-lib/scribble/doc/reader.rkt delete mode 100644 scribble-lib/scribble/doclang.rkt delete mode 100644 scribble-lib/scribble/doclang2.rkt delete mode 100644 scribble-lib/scribble/elsarticle/.gitignore delete mode 100644 scribble-lib/scribble/elsarticle/elsarticle.tex delete mode 100644 scribble-lib/scribble/elsarticle/lang.rkt delete mode 100644 scribble-lib/scribble/elsarticle/lang/reader.rkt delete mode 100644 scribble-lib/scribble/elsarticle/style.tex delete mode 100644 scribble-lib/scribble/eval.rkt delete mode 100644 scribble-lib/scribble/example.rkt delete mode 100644 scribble-lib/scribble/examples.rkt delete mode 100644 scribble-lib/scribble/extract.rkt delete mode 100644 scribble-lib/scribble/html-properties.rkt delete mode 100644 scribble-lib/scribble/html-render.rkt delete mode 100644 scribble-lib/scribble/info.rkt delete mode 100644 scribble-lib/scribble/jfp.rkt delete mode 100644 scribble-lib/scribble/jfp/.gitignore delete mode 100644 scribble-lib/scribble/jfp/jfp.css delete mode 100644 scribble-lib/scribble/jfp/jfp.tex delete mode 100644 scribble-lib/scribble/jfp/lang.rkt delete mode 100644 scribble-lib/scribble/jfp/lang/reader.rkt delete mode 100644 scribble-lib/scribble/jfp/replacements.tex delete mode 100644 scribble-lib/scribble/jfp/style.tex delete mode 100644 scribble-lib/scribble/latex-prefix.rkt delete mode 100644 scribble-lib/scribble/latex-properties.rkt delete mode 100644 scribble-lib/scribble/latex-render.rkt delete mode 100644 scribble-lib/scribble/lncs/.gitignore delete mode 100644 scribble-lib/scribble/lncs/lang.rkt delete mode 100644 scribble-lib/scribble/lncs/lang/reader.rkt delete mode 100644 scribble-lib/scribble/lncs/lncs.tex delete mode 100644 scribble-lib/scribble/lncs/style.tex delete mode 100644 scribble-lib/scribble/lp-include.rkt delete mode 100644 scribble-lib/scribble/lp.rkt delete mode 100644 scribble-lib/scribble/lp/lang/common.rkt delete mode 100644 scribble-lib/scribble/lp/lang/lang.rkt delete mode 100644 scribble-lib/scribble/lp/lang/lang2.rkt delete mode 100644 scribble-lib/scribble/lp/lang/reader.rkt delete mode 100644 scribble-lib/scribble/lp2.rkt delete mode 100644 scribble-lib/scribble/manual-fonts.css delete mode 100644 scribble-lib/scribble/manual-prefix.tex delete mode 100644 scribble-lib/scribble/manual-racket.css delete mode 100644 scribble-lib/scribble/manual-racket.js delete mode 100644 scribble-lib/scribble/manual-struct.rkt delete mode 100644 scribble-lib/scribble/manual-style.css delete mode 100644 scribble-lib/scribble/manual-style.tex delete mode 100644 scribble-lib/scribble/manual.rkt delete mode 100644 scribble-lib/scribble/manual/lang.rkt delete mode 100644 scribble-lib/scribble/manual/lang/reader.rkt delete mode 100644 scribble-lib/scribble/markdown-render.rkt delete mode 100644 scribble-lib/scribble/pdf-render.rkt delete mode 100644 scribble-lib/scribble/private/defaults.rkt delete mode 100644 scribble-lib/scribble/private/indirect-renderer.rkt delete mode 100644 scribble-lib/scribble/private/literal-anchor.rkt delete mode 100644 scribble-lib/scribble/private/lp.rkt delete mode 100644 scribble-lib/scribble/private/manual-bib.rkt delete mode 100644 scribble-lib/scribble/private/manual-bind.rkt delete mode 100644 scribble-lib/scribble/private/manual-class-struct.rkt delete mode 100644 scribble-lib/scribble/private/manual-class.rkt delete mode 100644 scribble-lib/scribble/private/manual-code.rkt delete mode 100644 scribble-lib/scribble/private/manual-defaults.rkt delete mode 100644 scribble-lib/scribble/private/manual-ex.rkt delete mode 100644 scribble-lib/scribble/private/manual-form.rkt delete mode 100644 scribble-lib/scribble/private/manual-history.rkt delete mode 100644 scribble-lib/scribble/private/manual-method.rkt delete mode 100644 scribble-lib/scribble/private/manual-mod.rkt delete mode 100644 scribble-lib/scribble/private/manual-proc.rkt delete mode 100644 scribble-lib/scribble/private/manual-sprop.rkt delete mode 100644 scribble-lib/scribble/private/manual-style.rkt delete mode 100644 scribble-lib/scribble/private/manual-tech.rkt delete mode 100644 scribble-lib/scribble/private/manual-unit.rkt delete mode 100644 scribble-lib/scribble/private/manual-utils.rkt delete mode 100644 scribble-lib/scribble/private/manual-vars.rkt delete mode 100644 scribble-lib/scribble/private/on-demand.rkt delete mode 100644 scribble-lib/scribble/private/provide-structs.rkt delete mode 100644 scribble-lib/scribble/private/qsloc.rkt delete mode 100644 scribble-lib/scribble/private/render-utils.rkt delete mode 100644 scribble-lib/scribble/private/run-pdflatex.rkt delete mode 100644 scribble-lib/scribble/private/serialize.rkt delete mode 100644 scribble-lib/scribble/provide-doc-transform.rkt delete mode 100644 scribble-lib/scribble/racket.css delete mode 100644 scribble-lib/scribble/racket.tex delete mode 100644 scribble-lib/scribble/render-struct.rkt delete mode 100644 scribble-lib/scribble/render.rkt delete mode 100644 scribble-lib/scribble/report/lang.rkt delete mode 100644 scribble-lib/scribble/report/lang/reader.rkt delete mode 100644 scribble-lib/scribble/run.rkt delete mode 100644 scribble-lib/scribble/scheme.rkt delete mode 100644 scribble-lib/scribble/scribble-common.js delete mode 100644 scribble-lib/scribble/scribble-load-replace.tex delete mode 100644 scribble-lib/scribble/scribble-load.tex delete mode 100644 scribble-lib/scribble/scribble-prefix.html delete mode 100644 scribble-lib/scribble/scribble-prefix.tex delete mode 100644 scribble-lib/scribble/scribble-skull.tex delete mode 100644 scribble-lib/scribble/scribble-style.css delete mode 100644 scribble-lib/scribble/scribble-style.tex delete mode 100644 scribble-lib/scribble/scribble.css delete mode 100644 scribble-lib/scribble/scribble.tex delete mode 100644 scribble-lib/scribble/search.rkt delete mode 100644 scribble-lib/scribble/sigplan.rkt delete mode 100644 scribble-lib/scribble/sigplan/lang.rkt delete mode 100644 scribble-lib/scribble/sigplan/lang/reader.rkt delete mode 100644 scribble-lib/scribble/sigplan/sigplan.css delete mode 100644 scribble-lib/scribble/sigplan/sigplan.tex delete mode 100644 scribble-lib/scribble/sigplan/sigplanconf.cls delete mode 100644 scribble-lib/scribble/sigplan/style.tex delete mode 100644 scribble-lib/scribble/srcdoc.rkt delete mode 100644 scribble-lib/scribble/struct.rkt delete mode 100644 scribble-lib/scribble/tag.rkt delete mode 100644 scribble-lib/scribble/text-render.rkt delete mode 100644 scribble-lib/scribble/urls.rkt delete mode 100644 scribble-lib/scribble/valid-blueboxes-info.rkt delete mode 100644 scribble-lib/scribble/xref.rkt delete mode 100644 scribble-lib/scriblib/autobib.css delete mode 100644 scribble-lib/scriblib/autobib.rkt delete mode 100644 scribble-lib/scriblib/autobib.tex delete mode 100644 scribble-lib/scriblib/bibtex.rkt delete mode 100644 scribble-lib/scriblib/figure.css delete mode 100644 scribble-lib/scriblib/figure.js delete mode 100644 scribble-lib/scriblib/figure.rkt delete mode 100644 scribble-lib/scriblib/figure.tex delete mode 100644 scribble-lib/scriblib/footnote.css delete mode 100644 scribble-lib/scriblib/footnote.rkt delete mode 100644 scribble-lib/scriblib/footnote.tex delete mode 100644 scribble-lib/scriblib/gui-eval.rkt delete mode 100644 scribble-lib/scriblib/info.rkt delete mode 100644 scribble-lib/scriblib/private/counter.rkt delete mode 100644 scribble-lib/scriblib/private/gui-eval-exn.rkt delete mode 100644 scribble-lib/scriblib/render-cond.rkt delete mode 100644 scribble-test/LICENSE.txt delete mode 100644 scribble-test/info.rkt delete mode 100644 scribble-test/tests/help/test-docs-complete2.rkt delete mode 100644 scribble-test/tests/scribble/decode.rkt delete mode 100644 scribble-test/tests/scribble/docs.rkt delete mode 100644 scribble-test/tests/scribble/docs/autobib-broken.scrbl delete mode 100644 scribble-test/tests/scribble/docs/autobib-broken.txt delete mode 100644 scribble-test/tests/scribble/docs/autobib-disambiguation-corner.scrbl delete mode 100644 scribble-test/tests/scribble/docs/autobib-disambiguation-corner.txt delete mode 100644 scribble-test/tests/scribble/docs/autobib-disambiguation-more.scrbl delete mode 100644 scribble-test/tests/scribble/docs/autobib-disambiguation-more.txt delete mode 100644 scribble-test/tests/scribble/docs/autobib-disambiguation.scrbl delete mode 100644 scribble-test/tests/scribble/docs/autobib-disambiguation.txt delete mode 100644 scribble-test/tests/scribble/docs/autobib-numbered.scrbl delete mode 100644 scribble-test/tests/scribble/docs/autobib-numbered.txt delete mode 100644 scribble-test/tests/scribble/docs/autobib-order.scrbl delete mode 100644 scribble-test/tests/scribble/docs/autobib-order.txt delete mode 100644 scribble-test/tests/scribble/docs/autobib.scrbl delete mode 100644 scribble-test/tests/scribble/docs/autobib.txt delete mode 100644 scribble-test/tests/scribble/docs/box-chars.scrbl delete mode 100644 scribble-test/tests/scribble/docs/box-chars.txt delete mode 100644 scribble-test/tests/scribble/docs/codeblock-quote.scrbl delete mode 100644 scribble-test/tests/scribble/docs/codeblock-quote.txt delete mode 100644 scribble-test/tests/scribble/docs/codeblock-utf8.scrbl delete mode 100644 scribble-test/tests/scribble/docs/codeblock-utf8.txt delete mode 100644 scribble-test/tests/scribble/docs/cond.scrbl delete mode 100644 scribble-test/tests/scribble/docs/cond.txt delete mode 100644 scribble-test/tests/scribble/docs/decode.scrbl delete mode 100644 scribble-test/tests/scribble/docs/decode.txt delete mode 100644 scribble-test/tests/scribble/docs/diamond.rkt delete mode 100644 scribble-test/tests/scribble/docs/diamond.scrbl delete mode 100644 scribble-test/tests/scribble/docs/diamond.txt delete mode 100644 scribble-test/tests/scribble/docs/empty-onthispage.scrbl delete mode 100644 scribble-test/tests/scribble/docs/empty-onthispage.txt delete mode 100644 scribble-test/tests/scribble/docs/eval-false.scrbl delete mode 100644 scribble-test/tests/scribble/docs/eval-false.txt delete mode 100644 scribble-test/tests/scribble/docs/eval-special.scrbl delete mode 100644 scribble-test/tests/scribble/docs/eval-special.txt delete mode 100644 scribble-test/tests/scribble/docs/examples.scrbl delete mode 100644 scribble-test/tests/scribble/docs/examples.txt delete mode 100644 scribble-test/tests/scribble/docs/figure.scrbl delete mode 100644 scribble-test/tests/scribble/docs/figure.txt delete mode 100644 scribble-test/tests/scribble/docs/filebox.scrbl delete mode 100644 scribble-test/tests/scribble/docs/filebox.txt delete mode 100644 scribble-test/tests/scribble/docs/footnote.scrbl delete mode 100644 scribble-test/tests/scribble/docs/footnote.txt delete mode 100644 scribble-test/tests/scribble/docs/grouper-sub.scrbl delete mode 100644 scribble-test/tests/scribble/docs/grouper-sub.txt delete mode 100644 scribble-test/tests/scribble/docs/grouper.scrbl delete mode 100644 scribble-test/tests/scribble/docs/grouper.txt delete mode 100644 scribble-test/tests/scribble/docs/include-section.scrbl delete mode 100644 scribble-test/tests/scribble/docs/include-section.txt delete mode 100644 scribble-test/tests/scribble/docs/itemlist.scrbl delete mode 100644 scribble-test/tests/scribble/docs/itemlist.txt delete mode 100644 scribble-test/tests/scribble/docs/list-section.scrbl delete mode 100644 scribble-test/tests/scribble/docs/list-section.txt delete mode 100644 scribble-test/tests/scribble/docs/lp-comment.scrbl delete mode 100644 scribble-test/tests/scribble/docs/lp-comment.txt delete mode 100644 scribble-test/tests/scribble/docs/manual-ex.rkt delete mode 100644 scribble-test/tests/scribble/docs/manual.scrbl delete mode 100644 scribble-test/tests/scribble/docs/manual.txt delete mode 100644 scribble-test/tests/scribble/docs/numberer.scrbl delete mode 100644 scribble-test/tests/scribble/docs/numberer.txt delete mode 100644 scribble-test/tests/scribble/docs/print-lines.scrbl delete mode 100644 scribble-test/tests/scribble/docs/print-lines.txt delete mode 100644 scribble-test/tests/scribble/docs/read-alts.scrbl delete mode 100644 scribble-test/tests/scribble/docs/read-alts.txt delete mode 100644 scribble-test/tests/scribble/docs/secref.scrbl delete mode 100644 scribble-test/tests/scribble/docs/secref.txt delete mode 100644 scribble-test/tests/scribble/docs/secref2.scrbl delete mode 100644 scribble-test/tests/scribble/docs/secref2.txt delete mode 100644 scribble-test/tests/scribble/docs/secref3.scrbl delete mode 100644 scribble-test/tests/scribble/docs/secref3.txt delete mode 100644 scribble-test/tests/scribble/docs/srcdoc.rkt delete mode 100644 scribble-test/tests/scribble/docs/srcdoc.scrbl delete mode 100644 scribble-test/tests/scribble/docs/srcdoc.txt delete mode 100644 scribble-test/tests/scribble/docs/stxobj.scrbl delete mode 100644 scribble-test/tests/scribble/docs/stxobj.txt delete mode 100644 scribble-test/tests/scribble/docs/table-border.scrbl delete mode 100644 scribble-test/tests/scribble/docs/table-border.txt delete mode 100644 scribble-test/tests/scribble/docs/table.scrbl delete mode 100644 scribble-test/tests/scribble/docs/table.txt delete mode 100644 scribble-test/tests/scribble/docs/tech.scrbl delete mode 100644 scribble-test/tests/scribble/docs/tech.txt delete mode 100644 scribble-test/tests/scribble/docs/text.scrbl delete mode 100644 scribble-test/tests/scribble/docs/text.txt delete mode 100644 scribble-test/tests/scribble/docs/traverse.scrbl delete mode 100644 scribble-test/tests/scribble/docs/traverse.txt delete mode 100644 scribble-test/tests/scribble/docs/verbatim.scrbl delete mode 100644 scribble-test/tests/scribble/docs/verbatim.txt delete mode 100644 scribble-test/tests/scribble/docs/wrap.scrbl delete mode 100644 scribble-test/tests/scribble/docs/wrap.txt delete mode 100644 scribble-test/tests/scribble/eval.rkt delete mode 100644 scribble-test/tests/scribble/exe.rkt delete mode 100644 scribble-test/tests/scribble/main.rkt delete mode 100644 scribble-test/tests/scribble/markdown-docs/example.md delete mode 100644 scribble-test/tests/scribble/markdown-docs/example.scrbl delete mode 100644 scribble-test/tests/scribble/markdown.rkt delete mode 100644 scribble-test/tests/scribble/reader.rkt delete mode 100644 scribble-test/tests/scribble/render.rkt delete mode 100644 scribble-test/tests/scribble/text-collect.rkt delete mode 100644 scribble-test/tests/scribble/text-lang.rkt delete mode 100644 scribble-test/tests/scribble/text-wrap.rkt delete mode 100644 scribble-test/tests/scribble/xref.rkt delete mode 100644 scribble-test/tests/scriblib/bibtex.normal.txt delete mode 100644 scribble-test/tests/scriblib/bibtex.number.txt delete mode 100644 scribble-test/tests/scriblib/bibtex.rkt delete mode 100644 scribble-test/tests/scriblib/example.bib delete mode 100644 scribble-test/tests/scriblib/info.rkt delete mode 100644 scribble-text-lib/LICENSE.txt delete mode 100644 scribble-text-lib/info.rkt delete mode 100644 scribble-text-lib/scribble/info.rkt delete mode 100644 scribble-text-lib/scribble/text.rkt delete mode 100644 scribble-text-lib/scribble/text/lang.rkt delete mode 100644 scribble-text-lib/scribble/text/lang/reader.rkt delete mode 100644 scribble-text-lib/scribble/text/main.rkt delete mode 100644 scribble-text-lib/scribble/text/output.rkt delete mode 100644 scribble-text-lib/scribble/text/syntax-utils.rkt delete mode 100644 scribble-text-lib/scribble/text/wrap.rkt delete mode 100644 scribble/LICENSE.txt delete mode 100644 scribble/info.rkt diff --git a/.gitignore b/.gitignore deleted file mode 100644 index a9a9f332..00000000 --- a/.gitignore +++ /dev/null @@ -1,10 +0,0 @@ -# Racket compiled files -compiled/ - -# common backups, autosaves, lock files, OS meta-files -*~ -\#* -.#* -.DS_Store -*.bak -TAGS diff --git a/scribble-lib/scribble/private/manual-scheme.rkt b/manual-scheme.rkt similarity index 100% rename from scribble-lib/scribble/private/manual-scheme.rkt rename to manual-scheme.rkt diff --git a/scribble-lib/scribble/racket.rkt b/racket.rkt similarity index 100% rename from scribble-lib/scribble/racket.rkt rename to racket.rkt diff --git a/scribble-doc/LICENSE.txt b/scribble-doc/LICENSE.txt deleted file mode 100644 index 1b827862..00000000 --- a/scribble-doc/LICENSE.txt +++ /dev/null @@ -1,11 +0,0 @@ -scribble-doc -Copyright (c) 2010-2014 PLT Design Inc. - -This package is distributed under the GNU Lesser General Public -License (LGPL). This means that you can link this package into proprietary -applications, provided you follow the rules stated in the LGPL. You -can also modify this package; if you distribute a modified version, -you must distribute it under the terms of the LGPL, which in -particular means that you must release the source code for the -modified software. See http://www.gnu.org/copyleft/lesser.html -for more information. diff --git a/scribble-doc/info.rkt b/scribble-doc/info.rkt deleted file mode 100644 index 4fa7d4be..00000000 --- a/scribble-doc/info.rkt +++ /dev/null @@ -1,28 +0,0 @@ -#lang info - -(define collection 'multi) - -(define build-deps '("racket-index" - "mzscheme-doc" - "net-doc" - "scheme-lib" - "draw-doc" - "gui-doc" - "slideshow-doc" - "pict-doc" - "typed-racket-doc" - "at-exp-lib" - "base" - "compatibility-lib" - "draw-lib" - "pict-lib" - "sandbox-lib" - "slideshow-lib" - "scribble-lib" - "scribble-text-lib" - "racket-doc")) -(define update-implies '("scribble-lib")) - -(define pkg-desc "documentation part of \"scribble\"") - -(define pkg-authors '(mflatt eli)) diff --git a/scribble-doc/scribblings/scribble/base.scrbl b/scribble-doc/scribblings/scribble/base.scrbl deleted file mode 100644 index 75a8bd75..00000000 --- a/scribble-doc/scribblings/scribble/base.scrbl +++ /dev/null @@ -1,793 +0,0 @@ -#lang scribble/doc -@(require scribble/manual "utils.rkt" - (for-syntax racket/base) - (for-label setup/main-collects - racket/runtime-path)) - -@(define-syntax def-section-like - (syntax-rules () - [(_ id result/c x ...) - (defproc (id [#:tag tag (or/c #f string? (listof string?)) #f] - [#:tag-prefix tag-prefix (or/c #f string? module-path?) #f] - [#:style style (or/c style? #f string? symbol? (listof symbol?)) #f] - [pre-content pre-content?] (... ...+)) - result/c - x ...)])) - -@(define-syntax def-elem-proc - (syntax-rules () - [(_ id x ...) - (defproc (id [pre-content pre-content?] (... ...)) - element? - x ...)])) -@(define-syntax def-style-proc - (syntax-rules () - [(_ id) - @def-elem-proc[id]{Like @racket[elem], but with style @racket['id].}])) - -@title[#:tag "base"]{Base Document Format} - -@defmodulelang[scribble/base]{The @racketmodname[scribble/base] -language provides functions and forms that can be used from code -written either in Racket or with @elem["@"] expressions. It -essentially extends @racketmodname[racket/base], except that top-level -forms within a module using the @racketmodname[scribble/base] language -are treated as document content (like @racketmodname[scribble/doclang]). - -The @racketmodname[scribble/base] name can also be used as a library -with @racket[require], in which case it provides only the bindings -defined in this section, and it also does not set the reader or -set the default rendering format to the Racket manual format.} - -Functions provided by this library, such as @racket[title] and -@racket[italic], might be called from Racket as - -@racketblock[ -(title #:tag "how-to" - "How to Design " (italic "Great") " Programs") -] - -They can also be called with @elem["@"] notation as - -@verbatim[#:indent 2]|{ - @title[#:tag "how-to"]{How to Design @italic{Great} Programs} -}| - -Although the procedures are mostly designed to be used from @elem["@"] -mode, they are easier to document in Racket mode (partly because we -have @racketmodname[scribble/manual]). - -@; ------------------------------------------------------------------------ - -@section{Document Structure} - -@defproc[(title [#:tag tag (or/c #f string? (listof string?)) #f] - [#:tag-prefix tag-prefix (or/c #f string? module-path?) #f] - [#:style style (or/c style? #f string? symbol? (listof symbol?)) #f] - [#:version vers (or/c string? #f) #f] - [#:date date (or/c string? #f) #f] - [pre-content pre-content?] ...+) - title-decl?]{ - -Generates a @racket[title-decl] to be picked up by @racket[decode] or -@racket[decode-part]. The @tech{decode}d @racket[pre-content] (i.e., -parsed with @racket[decode-content]) supplies the title content. If -@racket[tag] is @racket[#f], a tag string is generated automatically -from the content. The tag string is combined with the symbol -@racket['part] to form the full tag. - -The @racket[style] argument can be a style structure, or it can be one -of the following: a @racket[#f] that corresponds to a ``plain'' style, -a string that is used as a @tech{style name}, a symbol that is used as -a @tech{style property}, or a list of symbols to be used as @tech{style properties}. -For information on styles, see @racket[part]. For example, a style of -@racket['toc] causes sub-sections to be generated as separate pages in -multi-page HTML output. - -The @racket[tag-prefix] argument is propagated to the generated -structure (see @secref["tags"]). If @racket[tag-prefix] is a module -path, it is converted to a string using -@racket[module-path-prefix->string]. - -The @racket[vers] argument is propagated to the @racket[title-decl] -structure. Use @racket[""] as @racket[vers] to suppress version -rendering in the output. - -The @racket[date] argument is propagated to the @racket[title-decl] -structure via a @racket[document-date] @tech{style property}. Use -@racket[""] as @racket[date] to suppress date rendering in Latex -output. - -The section title is automatically indexed by -@racket[decode-part]. For the index key, leading whitespace and a -leading ``A'', ``An'', or ``The'' (followed by more whitespace) is -removed.} - - -@def-section-like[section part-start?]{ Like @racket[title], but - generates a @racket[part-start] of depth @racket[0] to be by - @racket[decode] or @racket[decode-part].} - -@def-section-like[subsection part-start?]{ Like @racket[section], but - generates a @racket[part-start] of depth @racket[1].} - -@def-section-like[subsubsection part-start?]{ Like @racket[section], but - generates a @racket[part-start] of depth @racket[2].} - -@def-section-like[subsubsub*section paragraph?]{ Similar to - @racket[section], but merely generates a paragraph that looks like an - unnumbered section heading (for when the nesting gets too deep to - include in a table of contents).} - -@defform[(include-section module-path)]{ Requires @racket[module-path] - and returns its @racket[doc] export (without making any imports - visible to the enclosing context). Since this form expands to - @racket[require], it must be used in a module or top-level context.} - -@defproc[(author [auth content?] ...) block?]{ - -Generates a @racket[paragraph] with style name @racket['author] to -show the author(s) of a document, where each author is represented by -@tech{content}. Normally, this function is used after -@racket[title] for the beginning of a document. See also -@racket[author+email].} - -@defproc[(author+email [author-name content?] - [email string?] - [#:obfuscate? obfuscate? any/c #f]) - element?]{ - -Combines an author name with an e-mail address. If @racket[obfuscate?] -is true, then the result obscures the e-mail address slightly to avoid -address-harvesting robots. - -Note that @racket[author+email] is not a replacement for -@racket[author]. The @racket[author+email] function is often used in -combination with @racket[author].} - -@; ------------------------------------------------------------------------ - -@section{Blocks} - -@defproc[(para [#:style style (or/c style? string? symbol? #f) #f] - [pre-content pre-content?] ...) paragraph?]{ - - Creates a @tech{paragraph} containing the @tech{decode}d - @racket[pre-content] (i.e., parsed with @racket[decode-paragraph]). - - The @racket[style] argument can be a style, @racket[#f] to indicate a - ``plain'' style, a string that is used as a @tech{style name}, or a - symbol that is used as a @tech{style name}. (Note that - @racket[section] and @racket[para] treat symbols differently as - @racket[style] arguments.)} - - -@defproc[(nested [#:style style (or/c style? string? symbol? #f) #f] - [pre-flow pre-flow?] ...) nested-flow?]{ - - Creates a @tech{nested flow} containing the @tech{decode}d - @racket[pre-flow] (i.e., parsed with @racket[decode-flow]). - - The @racket[style] argument is handled the same as @racket[para]. The - @racket['inset] and @racket['code-inset] styles cause the nested flow - to be inset compared to surrounding text, with the latter - particularly intended for insetting code. The default style is - specified by the output destination (and tends to inset text for HTML - output and not inset for Latex output).} - - -@defproc[(centered [pre-flow pre-flow?] ...) nested-flow?]{ - -Produces a @tech{nested flow} whose content is centered.} - - -@defproc[(margin-note [pre-flow pre-flow?] ... - [#:left? left? any/c #f]) - block?]{ - -Produces a @tech{nested flow} that is typeset in the margin, instead -of inlined. - -If @racket[left?] is true, then the note is shown on the opposite as -it would normally be shown (which is the left-hand side for HTML -output). Beware of colliding with output for a table of contents.} - - -@defproc[(margin-note* [pre-content pre-content?] ... - [#:left? left? any/c #f]) - element?]{ - -Produces an @racket[element] that is typeset in the margin, instead of -inlined. Unlike @racket[margin-note], @racket[margin-note*] can be -used in the middle of a paragraph; at the same time, its content is -constrained to form a single paragraph in the margin.} - - -@defproc[(itemlist [itm items/c] ... - [#:style style (or/c style? string? symbol? #f) #f]) - itemization?]{ - - Constructs an @racket[itemization] given a sequence of items. Typical - each @racket[itm] is constructed by @racket[item], but an - @racket[itm] can be a @tech{block} that is coerced to an - @racket[item]. Finally, @racket[itm] can be a list or @racket[splice] - whose elements are spliced (recursively, if necessary) into the - @racket[itemlist] sequence. - - The @racket[style] argument is handled the same as @racket[para]. The - @racket['ordered] style numbers items, instead of just using a - bullet.} - - -@defthing[items/c flat-contract?]{ - -A contract that is equivalent to the following recursive -specification: - -@racketblock[ - (or/c item? block? (listof items/c) (spliceof items/c)) -]} - - -@defproc[(item [pre-flow pre-flow?] ...) item?]{ - -Creates an item for use with @racket[itemlist]. The @tech{decode}d -@racket[pre-flow] (i.e., parsed with @racket[decode-flow]) is the item -content.} - - -@defproc[(item? [v any/c]) boolean?]{ - -Returns @racket[#t] if @racket[v] is an item produced by -@racket[item], @racket[#f] otherwise.} - - -@defproc[(tabular [cells (listof (listof (or/c block? content? 'cont)))] - [#:style style (or/c style? string? symbol? #f) #f] - [#:sep sep (or/c block? content? #f) #f] - [#:column-properties column-properties (listof any/c) '()] - [#:row-properties row-properties (listof any/c) '()] - [#:cell-properties cell-properties (listof (listof any/c)) '()]) - table?]{ - -Creates a @tech{table} with the given @racket[cells] content, which is -supplied as a list of rows, where each row has a list of cells. The -length of all rows must match. - -Use @racket['cont] in @racket[cells] as a cell to continue the content -of the preceding cell in a row in the space that would otherwise be -used for a new cell. A @racket['cont] must not appear as the first -cell in a row. - -The @racket[style] argument is handled the same as @racket[para]. - -If @racket[sep] is not @racket[#f], it is inserted as a new column -between every column in the table; note that any -@racket[table-columns] or @racket[table-cells] property in -@racket[style] must take the added columns into account. Otherwise, -the default style places no space between table columns. When @racket[sep] -would be placed before a @racket['cont], a @racket['cont] is inserted, -instead. - -The @racket[column-properties], @racket[row-properties], and -@racket[cell-properties] arguments specify @tech{style properties} for -the columns and cells of a table; see @racket[table-columns] and -@racket[table-cells] for a description of recognized properties. The -lists do not contain entries for columns potentially introduced for -@racket[sep], and when non-empty, they are extended as needed to match -the table size determined by @racket[cells]: - -@itemlist[ - - @item{If the length of @racket[column-properties] is less than the - length of each row in @racket[cells], the last item of the list - is duplicated to make the list long enough.} - - @item{If the length of @racket[row-properties] is less than the - length of @racket[cells], the last item of the list is - duplicated to make the list long enough.} - - @item{If the length of @racket[cell-properties] is less than the - number of rows in @racket[cells], then the last element is - duplicated to make the list long enough. Each list within - @racket[cell-properties] is treated like a - @racket[column-properties] list---expanded as needed to match - the number of columns in each row.} - -] - -Each element of @racket[column-properties] or @racket[row-properties] -is either a list of @tech{style property} values or a non-list element -that is wrapped as a list. Similarly, for each list that is an element -of @racket[cell-properties], the list's non-list elements are wrapped -as nested lists. - -If @racket[column-properties] is non-empty, then its list of property -lists is converted into a @racket[table-columns] @tech{style property} -that is added to the style specified by @racket[style]---or merged -with an existing @racket[table-columns] @tech{style property} that -matches the column shape of @racket[cells]. In addition, if either -@racket[row-properties] or @racket[cell-properties] is non-empty, the -property lists of @racket[column-properties] are merged -with the property lists of @racket[row-properties] and -@racket[cell-properties]. If @racket[row-properties] or -@racket[cell-properties] is non-empty, the merged lists are -converted into a @racket[table-cells] @tech{style property} that is -added to the style specified by @racket[style]---or merged with an -existing @racket[table-cells] @tech{style property} that matches the -shape of @racket[cells]. - -@margin-note{If the style lists for @racket[column-properties] are -both merged with @racket[cell-properties] and converted to -@racket[table-columns], then @racket[style] will contain some -redundant information. In that case, @racket[column-attributes] -properties will be used from @racket[table-columns], while other -properties will be used from the merger into @racket[table-cells].} - -@history[#:changed "1.1" @elem{Added the @racket[#:column-properties], - @racket[#:row-properties], - and @racket[#:cell-properties] arguments.} - #:changed "1.12" @elem{Changed @racket[sep] insertion before a - @racket['cont].}] - -Examples: -@codeblock[#:keep-lang-line? #f]|{ -#lang scribble/manual -@tabular[#:sep @hspace[1] - (list (list "soup" "gazpacho") - (list "soup" "tonjiru"))] - -@tabular[#:style 'boxed - #:column-properties '(left right) - #:row-properties '(bottom-border ()) - (list (list @bold{recipe} @bold{vegetable}) - (list "caldo verde" "kale") - (list "kinpira gobō" "burdock") - (list "makizushi" 'cont))] -}| -@doc-render-examples[ - @tabular[#:sep @hspace[1] - (list (list "soup" "gazpacho") - (list "soup" "tonjiru"))] - - @tabular[#:style 'boxed - #:column-properties '(left right) - #:row-properties '(bottom-border ()) - (list (list @bold{recipe} @bold{vegetable}) - (list "caldo verde" "kale") - (list "kinpira gobō" "burdock") - (list "makizushi" 'cont))]] -} - -@defproc[(verbatim [#:indent indent exact-nonnegative-integer? 0] [elem content?] ...+) - block?]{ - -Typesets string @racket[elem]s in typewriter font with linebreaks -specified by newline characters in string @racket[elem]s. Consecutive spaces in -the string @racket[elem]s are converted to @racket[hspace] to ensure that they -are all preserved in the output. Additional space (via -@racket[hspace]) as specified by @racket[indent] is added to the -beginning of each line. A non-string @racket[elem] is treated as -content within a single line. - -The string @racket[elem]s are @emph{not} decoded with @racket[decode-content], -so @racket[(verbatim "---")] renders with three hyphens instead of an -em dash. Beware, however, that @emph{reading} -@litchar["@"]@racket[verbatim] converts @litchar["@"] syntax -within the argument, and such reading occurs well before -arguments to @racket[verbatim] are delivered at run-time. To disable simple -@litchar["@"] notation within the @racket[verbatim] argument, -@racket[verbatim] is typically used with -@litchar["|{"]...@litchar["}|"] or similar brackets, like this: - -@verbatim[#:indent 2]|{ - @verbatim|{ - Use @bold{---} like this... - }| -}| - -which renders as - -@verbatim[#:indent 2]|{ - Use @bold{---} like this... -}| - -while - -@verbatim[#:indent 2]||{ - @verbatim|{ - Use |@bold{---} like this... - }| -}|| - -renders as - -@verbatim[#:indent 2]|{ - Use |@bold{---} like this... -}| - -Even with brackets like @litchar["|{"]...@litchar["}|"], beware that consistent -leading whitespace is removed by the parser; see -@secref["alt-body-syntax"] for more information. - -See also @racket[literal].} - -@; ------------------------------------------------------------------------ - -@section{Text Styles and Content} - -@defproc[(elem [pre-content pre-content?] ... - [#:style style (or/c style? string? symbol? #f) #f]) - element?]{ - -Wraps the @tech{decode}d @racket[pre-content] as an element with style -@racket[style].} - - -@def-style-proc[italic] -@def-style-proc[bold] - -@defproc[(tt [pre-content pre-content?] ...) element?]{ - -Similar to @racket[elem], but the @racket['tt] style is used for -immediate strings and symbols among the @racket[pre-content] -arguments. - -To apply the @racket['tt] style uniformly to all @racket[pre-content] -arguments, use @racket[(elem #:style 'tt pre-content ...)], instead.} - -@def-style-proc[subscript] -@def-style-proc[superscript] - -@def-elem-proc[smaller]{Like @racket[elem], but with style -@racket['smaller]. When uses of @racket[smaller] are nested, text -gets progressively smaller.} - -@def-elem-proc[larger]{Like @racket[elem], but with style -@racket['larger]. When uses of @racket[larger] are nested, text -gets progressively larger.} - -@defproc[(emph [pre-content pre-content?] ...) element?]{ -The same as @racket[italic].} - -@defproc[(literal [str string?] ...+) element?]{ - -Produces an element containing literally @racket[str]s with no -decoding via @racket[decode-content]. - -Beware that @litchar["@"] for a @racket[literal] call performs some -processing before delivering arguments to @racket[literal]. The -@racket[literal] form can be used with @litchar["|{"]...@litchar["}|"] -or similar brackets to disable @litchar["@"] notation within the -@racket[literal] argument, like this: - -@verbatim[#:indent 2]|{ - @literal|{@bold{---}}| -}| - -which renders as - -@verbatim[#:indent 2]{ - @literal|{@bold{---}}| -} - -See also @racket[verbatim].} - -@; ------------------------------------------------------------------------ -@section[#:tag "images"]{Images} - - -@defproc[(image [path (or/c path-string? (cons/c 'collects (listof bytes?)))] - [#:scale scale real? 1.0] - [#:suffixes suffixes (listof #rx"^[.]") null] - [#:style style (or/c style? string? symbol? #f) #f] - [pre-content pre-content?] ...) - image-element?]{ - - Creates an image element from the given path. The @tech{decode}d - @racket[pre-content] serves as the alternate text for contexts where - the image cannot be displayed. - - If @racket[path] is a relative path, it is relative to the current - directory, which is set by @exec{raco setup} to - the directory of the main document file. (In general, however, it's - more reliable to express relative paths using - @racket[define-runtime-path].) Instead of a path or string, - the @racket[path] argument can be a result of - @racket[path->main-collects-relative]. - - The @racket[scale] argument sets the images scale relative to its - default size as determined by the content of @racket[path]. For HTML - output, the resulting @racket[image-element] is rendered with an - @tt{img} or @tt{object} (for SVG) tag, and @racket[scale] adjusts the - @tt{width} and @tt{height} attributes; a class name or other - attributes in @racket[style] can effectively override that size. - - The strings in @racket[suffixes] are filtered to those supported by - given renderer, and then the acceptable suffixes are tried in - order. The HTML renderer supports @racket[".png"], - @racket[".gif"], and @racket[".svg"], while the Latex renderer supports @racket[".png"], - @racket[".pdf"], and @racket[".ps"] (but @racket[".ps"] works only - when converting Latex output to DVI, and @racket[".png"] and - @racket[".pdf"] work only for converting Latex output to PDF). - - Note that when the @racket[suffixes] list is non-empty, then - the @racket[path] argument should not have a suffix. - - @history[#:changed "1.3" @elem{Added the @racket[#:style] argument.}]} - -@; ------------------------------------------------------------------------ -@section[#:tag "spacing"]{Spacing} - -@defproc[(linebreak) element?]{ -Produces an element that forces a line break.} - - -@def-elem-proc[nonbreaking]{Like @racket[elem], but line breaks are -suppressed while rendering the content.} - - -@defproc[(hspace [n exact-nonnegative-integer?]) element?]{ - -Produces an element containing @racket[n] spaces and style -@racket['hspace].} - - -@defthing[~ string?]{ - -A string containing the non-breaking space character, -which is equivalent to @racket['nbsp] as an element.} - - -@defthing[-~- string?]{ - -A string containing the non-breaking hyphen character.} - - -@defthing[?- string?]{ - -A string containing the soft-hyphen character (i.e., a suggestion of -where to hyphenate a word to break it across lines when rendering).} - - -@defthing[._ element?]{ - -Generates a period that ends an abbreviation in the middle of a -sentence, as opposed to a period that ends a sentence (since the -latter may be typeset with extra space). Use @litchar|{@._}| in a -document instead of just @litchar{.} for an abbreviation-ending period -that is preceded by a lowercase letter and followed by a space. - -See @racket[.__] for an example.} - - -@defthing[.__ element?]{ - -Generates a period that ends a sentence (which may be typeset with -extra space), as opposed to a period that ends an abbreviation in the -middle of a sentence. Use @litchar|{@.__}| in a document instead of just -@litchar{.} for a sentence-ending period that is preceded by an -uppercase letter. - -The following example illustrates both @racket[._] and @racket[.__]: - -@codeblock|{ - #lang scribble/base - My name is Mr@._ T@.__ I pity the fool who can't typeset punctuation. -}|} - - -@; ------------------------------------------------------------------------ -@section[#:tag "base-links"]{Links} - -@defproc[(hyperlink [url string?] [pre-content pre-content?] ... - [#:underline? underline? any/c #t] - [#:style style (or/c style? string? symbol? #f) (if underline? #f "plainlink")]) - element?]{ - -The @tech{decode}d @racket[pre-content] is hyperlinked to -@racket[url]. If @racket[style] is not supplied, then -@racket[underline?] determines how the link is rendered.} - - -@defproc[(url [dest string?]) element?]{ - -Generates a literal hyperlinked URL.} - - -@defproc[(secref [tag string?] - [#:doc module-path (or/c module-path? #f) #f] - [#:tag-prefixes prefixes (or/c (listof string?) #f) #f] - [#:underline? underline? any/c #t]) - element?]{ - -Inserts a reference to the section tagged @racket[tag]. - -If @racket[#:doc module-path] is provided, the @racket[tag] refers to -a tag with a prefix determined by @racket[module-path]. When -@exec{raco setup} renders documentation, it automatically adds a tag -prefix to the document based on the source module. Thus, for example, -to refer to a section of the Racket reference, -@racket[module-path] would be @racket['(lib -"scribblings/reference/reference.scrbl")]. - -The @racket[#:tag-prefixes prefixes] argument similarly supports -selecting a particular section as determined by a path of tag -prefixes. When a @racket[#:doc] argument is provided, then -@racket[prefixes] should trace a path of tag-prefixed subsections to -reach the @racket[tag] section. When @racket[#:doc] is not provided, -the @racket[prefixes] path is relative to any enclosing section (i.e., -the youngest ancestor that produces a match). - -For HTML output, the generated reference is the hyperlinked title of -the elements in the section's title content, except that elements with -the @racket['aux] @tech{style property} are omitted in the hyperlink -label. If @racket[underline?] is @racket[#f], then the hyperlink is -rendered in HTML without an underline. - -For Latex output, the generated reference's format depends on the -document style. By default, only the section number is shown in the -reference, but the @racketmodname[scribble/manual] style shows the -title after the section number. Customize the output (see -@secref["config"]) by redefining the @ltx{BookRef}, @|etc|, macros (see -@secref["builtin-latex"]). - -In Racket documentation that is rendered to HTML, clicking on a -section title normally shows the @racket[secref] call that is needed -to link to the section.} - - -@defproc[(Secref [tag string?] - [#:doc module-path (or/c module-path? #f) #f] - [#:tag-prefixes prefixes (or/c (listof string?) #f) #f] - [#:underline? underline? any/c #t]) - element?]{ - -Like @racket[secref], but if the rendered form of the reference starts -with a word (e.g., ``section''), then the word is capitalized.} - - -@defproc[(seclink [tag string?] - [#:doc module-path (or/c module-path? #f) #f] - [#:tag-prefixes prefixes (or/c (listof string?) #f) #f] - [#:underline? underline? any/c #t] - [#:indirect? indirect? any/c #f] - [pre-content pre-content?] ...) element?]{ - -Like @racket[secref], but the link label is the @tech{decode}d -@racket[pre-content] instead of the target section's name. - -In addition to @racket[secref]'s arguments, @racket[seclink] supports -a @racket[indirect?] argument. When @racket[indirect?] is true, then -the section hyperlink's resolution in HTML is potentially delayed; see -@racket['indirect-link] for @racket[link-element].} - - -@defproc[(other-doc [module-path module-path?] - [#:underline? underline? any/c #t] - [#:indirect indirect (or/c #f content?) #f]) - element?]{ - -Like @racket[secref] for the document's implicit @racket["top"] -tag. Use this function to refer to a whole manual instead of -@racket[secref], in case a special style in the future is used for -manual titles. - -If @racket[indirect] is not @racket[#f], then the link's resolution in -HTML can be delayed, like @racket[seclink] with @racket[#:indirect? -#t]. The @racket[indirect] content is prefixed with ``the'' and -suffixed with ``documentation'' to generate the rendered text of the -link. For example: - -@verbatim[#:indent 2]|{ - @other-doc['(lib "parsack/parsack/parsack.scrbl") - #:indirect "Parsec implementation in Racket"] -}| - -renders as a hyperlink with the text: - -@verbatim[#:indent 2]|{ - the Parsec implementation in Racket documentation -}|} - - -@defproc[(elemtag [t (or/c tag? string?)] [pre-content pre-content?] ...) element?]{ - -The tag @racket[t] refers to the content form of -@racket[pre-content].} - - -@defproc[(elemref [t (or/c tag? string?)] [pre-content pre-content?] ... - [#:underline? underline? any/c #t]) element?]{ - -The @tech{decode}d @racket[pre-content] is hyperlinked to @racket[t], -which is normally defined using @racket[elemtag].} - -@; ------------------------------------------------------------------------ - -@section[#:tag "base-indexing"]{Indexing} - -@defproc[(index [words (or/c string? (listof string?))] - [pre-content pre-content?] ...) - index-element?]{ - -Creates an index element given a plain-text string---or list of -strings for a hierarchy, such as @racket['("strings" "plain")] for a -``plain'' entry below a more general ``strings'' entry. As index keys, -the strings are ``cleaned'' using @racket[clean-up-index-strings]. The -strings (without clean-up) also serve as the text to render in the -index. The @tech{decode}d @racket[pre-content] is the text to appear -inline as the index target. - -Use @racket[index] when an index entry should point to a specific word -or phrase within the typeset document (i.e., the -@racket[pre-content]). Use @racket[section-index], instead, to create -an index entry that leads to a section, instead of a specific word or -phrase within the section.} - - -@defproc[(index* [words (listof string?)] - [word-contents (listof list?)] - [pre-content pre-content?] ...) - index-element?]{ -Like @racket[index], except that @racket[words] must be a list, and -the list of contents render in the index (in parallel to -@racket[words]) is supplied as @racket[word-contents]. -} - -@defproc[(as-index [pre-content pre-content?] ...) - index-element?]{ - -Like @racket[index], but the word to index is determined by applying -@racket[content->string] on the @tech{decode}d @racket[pre-content].} - - -@defproc[(section-index [word string?] ...) - part-index-decl?]{ - -Creates a @racket[part-index-decl] to be associated with the enclosing -section by @racket[decode]. The @racket[word]s serve as both the keys -and as the rendered forms of the keys within the index.} - - -@defproc[(index-section [#:tag tag (or/c #f string?) "doc-index"]) - part?]{ - -Produces a part that shows the index the enclosing document. The -optional @racket[tag] argument is used as the index section's tag.} - - -@; ------------------------------------------------------------------------ - -@section{Tables of Contents} - -@defproc[(table-of-contents) delayed-block?]{ - -Returns a delayed flow element that expands to a table of contents for -the enclosing section. For Latex output, however, the table of -contents currently spans the entire enclosing document.} - - -@defproc[(local-table-of-contents [#:style style (or/c symbol? #f) #f]) - delayed-block?]{ - -Returns a delayed flow element that may expand to a table of contents -for the enclosing section, depending on the output type. For -multi-page HTML output, the flow element is a table of contents; for -Latex output, the flow element is empty. - -The meaning of the @racket[style] argument depends on the output type, -but @racket['immediate-only] normally creates a table of contents that -contains only immediate sub-sections of the enclosing section. See -also the @racket['quiet] style of @racket[part] (i.e., in a -@racket[part] structure, not supplied as the @racket[style] argument -to @racket[local-table-of-contents]), which normally suppresses -sub-part entries in a table of contents.} - -@; ------------------------------------------------------------------------ - -@section{Tags} - -The exports of @racketmodname[scribble/tag] are all re-exported by -@racketmodname[scribble/base]. - diff --git a/scribble-doc/scribblings/scribble/basic.scrbl b/scribble-doc/scribblings/scribble/basic.scrbl deleted file mode 100644 index 1fffc268..00000000 --- a/scribble-doc/scribblings/scribble/basic.scrbl +++ /dev/null @@ -1,26 +0,0 @@ -#lang scribble/manual -@(require "utils.rkt" (for-label (only-in scribble/basic span-class))) - -@(define (compat) - @italic{For backward compatibility.}) - -@title[#:tag "basic"]{Compatibility Basic Functions} - -@defmodule[scribble/basic]{The @racketmodname[scribble/basic] -compatibility library mostly just re-exports -@racketmodname[scribble/base].} - -@defproc[(span-class [style-name string?] [pre-content any/c] ...) - element?]{ - -@compat[] Wraps the @tech{decode}d -@racket[pre-content] as an element with style @racket[style-name].} - - - -@defproc[(itemize [itm (or/c whitespace? an-item?)] ... - [#:style style (or/c style? string? symbol? #f) #f]) - itemization?]{ - -@compat[] Like @racket[itemlist], but whitespace strings among the -@racket[itm]s are ignored.} diff --git a/scribble-doc/scribblings/scribble/blueboxes.scrbl b/scribble-doc/scribblings/scribble/blueboxes.scrbl deleted file mode 100644 index 3aff0092..00000000 --- a/scribble-doc/scribblings/scribble/blueboxes.scrbl +++ /dev/null @@ -1,59 +0,0 @@ -#lang scribble/doc -@(require scribble/manual "utils.rkt" - (for-label scribble/core - scribble/blueboxes - racket/contract - setup/xref)) - -@title[#:tag "blueboxes"]{Blue Boxes Utilities} - -@defmodule[scribble/blueboxes]{ - The @racketmodname[scribble/blueboxes] provides access - to the content of the ``blue boxes'' that describe - some module's export (but without any styling).} - -@defproc[(fetch-blueboxes-strs [tag tag?] - [#:blueboxes-cache blueboxes-cache - blueboxes-cache? - (make-blueboxes-cache #t)]) - (or/c #f (non-empty-listof string?))]{ - Returns a list of strings that show the content of the blue box - (without any styling information) for the documentation referenced - by @racket[tag]. - - The first string in the list describes the export (e.g. @racket["procedure"] - when @racket[defproc] is used, or @racket["syntax"] when @racket[defform] - was used to document the export). -} - -@defproc[(fetch-blueboxes-method-tags [method-name symbol?] - [#:blueboxes-cache blueboxes-cache - blueboxes-cache? - (make-blueboxes-cache #t)]) - (listof method-tag?)]{ - Returns the list of tags for all methods that are documented in the documentation - in @racket[blueboxes-cache]. - - @history[#:added "1.11"] -} - -@defproc[(make-blueboxes-cache - [populate? boolean?] - [#:blueboxes-dirs blueboxes-dirs (listof path?) (get-doc-search-dirs)]) - blueboxes-cache?]{ - Constructs a new (mutable) blueboxes cache. - - If @racket[populate?] is @racket[#f], the cache is initially - unpopulated, in which case it is filled in the first time the cache - is passed to @racket[fetch-bluebxoes-strs]. Otherwise, the cache is - populated immediately. - - The @racket[blueboxes-dirs] argument is a list of directories that are - looked inside for @filepath{blueboxes.rktd} files. The default value - is only an approximation for where those files usually reside. See - also @racket[get-rendered-doc-directories]. -} - -@defproc[(blueboxes-cache? [v any/c]) boolean?]{ - Determines if @racket[v] is a blueboxes cache. -} diff --git a/scribble-doc/scribblings/scribble/bnf.scrbl b/scribble-doc/scribblings/scribble/bnf.scrbl deleted file mode 100644 index f1d51414..00000000 --- a/scribble-doc/scribblings/scribble/bnf.scrbl +++ /dev/null @@ -1,97 +0,0 @@ -#lang scribble/doc -@(require scribble/manual "utils.rkt" scribble/bnf - (for-label scribble/bnf)) - -@title[#:tag "bnf"]{BNF Grammars} - -@defmodule[scribble/bnf]{The @racket[scribble/bnf] library -provides utilities for typesetting grammars.} - -For example, - -@verbatim[#:indent 2]|{ -@(let ([open @litchar{(}] - [close @litchar{)}]) - @BNF[(list @nonterm{expr} - @nonterm{id} - @BNF-seq[open @kleeneplus[@nonterm{expr}] close] - @BNF-seq[open @litchar{lambda} - open @kleenestar[@nonterm{id}] close - @nonterm{expr} close] - @nonterm{val}) - (list @nonterm{val} - @BNF-alt[@nonterm{number} @nonterm{primop}]) - (list @nonterm{id} - @elem{any name except for @litchar{lambda}})]) -}| - -produces the output - -@(let ([open @litchar{(}] - [close @litchar{)}]) - @BNF[(list @nonterm{expr} - @nonterm{id} - @BNF-seq[open @kleeneplus[@nonterm{expr}] close] - @BNF-seq[open @litchar{lambda} - open @kleenestar[@nonterm{id}] close - @nonterm{expr} close] - @nonterm{val}) - (list @nonterm{val} - @BNF-alt[@nonterm{number} @nonterm{primop}]) - (list @nonterm{id} - @elem{any name except for @litchar{lambda}})]) - -See also @racket[racketgrammar]. - -@defproc[(BNF [prod (cons element? (listof (or/c block? element?)))] ...) table?]{ - -Typesets a grammar table. Each production starts with an element -(typically constructed with @racket[nonterm]) for the non-terminal -being defined, and then a list of possibilities (typically constructed -with @racket[BNF-seq], etc.) to show on separate lines.} - -@defproc[(nonterm (pre-content any/c) ...) element?]{ - -Typesets a non-terminal: italic in angle brackets.} - -@defproc[(BNF-seq [elem element?] ...) element?]{ - -Typesets a sequence.} - -@defproc[(BNF-seq-lines [elems (listof element?)] ...) block?]{ - -Typesets a sequence that is broken into multiple lines, where each -@racket[elems] is one line.} - -@defproc[(BNF-group [pre-content any/c] ...) element?]{ - -Typesets a group surrounded by curly braces (so the entire group can -be repeated, for example).} - -@defproc[(optional [pre-content any/c] ...) element?]{ - -Typesets an optional element: in square brackets.} - -@defproc[(kleenestar [pre-content any/c] ...) element?]{ - -Typesets a 0-or-more repetition.} - -@defproc[(kleeneplus [pre-content any/c] ...) element?]{ - -Typesets a 1-or-more repetition.} - -@defproc[(kleenerange [n any/c] [m any/c] [pre-content any/c] ...) element?]{ - -Typesets a @racket[n]-to-@racket[m] repetition. The @racket[n] and -@racket[m] arguments are converted to a string using @racket[(format -"~a" n)] and @racket[(format "~a" m)].} - -@defproc[(BNF-alt [elem element?] ...) element?]{ - -Typesets alternatives for a production's right-hand side to appear on -a single line. The result is normally used as a single possibility in -a production list for @racket[BNF].} - -@defthing[BNF-etc string?]{ - -A string to use for omitted productions or content.} diff --git a/scribble-doc/scribblings/scribble/book.scrbl b/scribble-doc/scribblings/scribble/book.scrbl deleted file mode 100644 index 34a768a1..00000000 --- a/scribble-doc/scribblings/scribble/book.scrbl +++ /dev/null @@ -1,9 +0,0 @@ -#lang scribble/manual -@(require "utils.rkt") - -@title{Book Format} - -@defmodulelang[scribble/book]{The @racketmodname[scribble/book] -language is like @racketmodname[scribble/base], but configured with -Latex style defaults to use the standard @tt{book} class. Top-level -sections are rendered as Latex chapters.} diff --git a/scribble-doc/scribblings/scribble/class-diagrams.rkt b/scribble-doc/scribblings/scribble/class-diagrams.rkt deleted file mode 100644 index f474bda2..00000000 --- a/scribble-doc/scribblings/scribble/class-diagrams.rkt +++ /dev/null @@ -1,514 +0,0 @@ -#lang racket/base -(require (prefix-in etc: mzlib/etc) - texpict/mrpict - (only-in pict pin-line pin-arrow-line) - (except-in texpict/utils pin-line pin-arrow-line) - racket/class - racket/runtime-path - racket/draw - racket/contract - (only-in racket/list last)) - -(define the-font-size 12) -(define prim-font-family 'swiss) -;; Was 'modern, but we want font smoothing even for small text: -(define font-family (make-object font% the-font-size 'modern 'normal 'normal #f 'smoothed)) - -(define prim-types '("int" "String" "float" "double" "boolean")) - -;; how far a dot is to the right of a class -(define dot-edge-spacing 10) - -(define field-arrowhead-size 10) - -(define hierarchy-color "navy") -(define type-link-color "firebrick") - -#| -(define font-family "Palatino") -(define-runtime-path afm "afm") -(current-ps-afm-file-paths (cons afm (current-ps-afm-file-paths))) - -(let ([id (send the-font-name-directory find-or-create-font-id font-family 'default)]) - (send the-font-name-directory set-post-script-name - id 'normal 'normal "Palatino-Roman") - (send the-font-name-directory set-post-script-name - id 'bold 'normal "Palatino-Bold") - (send the-font-name-directory set-post-script-name - id 'normal 'italic "Palatino-Italic")) -|# - -(define (user-type-font x) (text x font-family the-font-size)) -(define (prim-type-font x) (text x prim-font-family the-font-size)) -(define (var-font x) (text x `(bold . ,font-family) the-font-size)) -(define (field-name-font x) (text x font-family the-font-size)) -(define (comment-font x) (text x font-family the-font-size)) -(define (normal-font x) (text x font-family the-font-size)) -(define (java-this) (text "this" `(bold . ,font-family) the-font-size)) - -;; field-spec : string string -> pict -(define (field-spec type fd #:default [default #f] [comment #f]) - (let ([code-line - (hbl-append (if type - (hbl-append (type-spec type) - (normal-font " ")) - (blank)) - (field-name-font fd) - (if default - (hbl-append (normal-font " = ") - (normal-font default)) - (blank)) - #; - (normal-font ";"))]) - (if comment - (hbl-append code-line - (normal-font " ") - (comment-font (format "[in ~a]" comment))) - code-line))) - -(define (method-spec range name #:body [body #f] . args) - (unless (even? (length args)) - (error 'method-spec "expected a list of types and argument names, but found ~a arguments" - (length args))) - (let ([first-line - (hbl-append - (type-spec range) - (normal-font " ") - (var-font name) - (cond - [(null? args) - (normal-font "()")] - [else - (hbl-append - (normal-font "(") - (let loop ([args args]) - (let* ([type (car args)] - [param (cadr args)] - [single-arg - (if param - (hbl-append (type-spec type) - (normal-font " ") - (var-font param)) - (type-spec type))]) - - (cond - [(null? (cddr args)) - (hbl-append single-arg (normal-font ")"))] - [else - (hbl-append single-arg - (normal-font ", ") - (loop (cddr args)))]))))]) - (if body - (hbl-append (normal-font " {")) - (blank)))]) - (if body - (vl-append first-line - (hbl-append (blank 8 0) body (normal-font "}"))) - first-line))) - -(define (type-spec str) - (cond - [(member str prim-types) (prim-type-font str)] - [else (user-type-font str)])) - -;; class-name : string -> pict -(define (class-name txt #:spacing-word [spacing-word txt]) - (define p (colorize (lt-superimpose (ghost (var-font spacing-word)) - (apply vl-append (map var-font (regexp-split #rx"\n" txt)))) - "white")) - (refocus (cc-superimpose (colorize (filled-rectangle (+ class-box-margin class-box-margin (pict-width p)) - (+ class-box-margin class-box-margin (pict-height p))) - "black") - p) - p)) - -(define class-box-margin 4) - -;; class-box : pict (or/c #f (listof pict)) (or/c #f (listof pict)) -> pict -(define (class-box name fields methods) - (let* ([mk-blank (λ () (blank 0 (+ class-box-margin class-box-margin)))]) - (cond - [(and methods fields) - (let* ([top-spacer (mk-blank)] - [bottom-spacer (mk-blank)] - [main (vl-append name - top-spacer - (if (null? fields) - (blank 0 4) - (apply vl-append fields)) - bottom-spacer - (if (null? methods) - (blank 0 4) - (apply vl-append methods)))]) - (add-hline - (add-hline (frame (inset main class-box-margin)) - top-spacer) - bottom-spacer))] - [fields - (let* ([top-spacer (mk-blank)] - [main (vl-append name - top-spacer - (if (null? fields) - (blank) - (apply vl-append fields)))]) - (add-hline (frame (inset main class-box-margin)) - top-spacer))] - [methods (class-box name methods fields)] - [else (frame (inset name class-box-margin))]))) - -(define (add-hline main sub) - (let-values ([(x y) (cc-find main sub)]) - (pin-line main - sub (λ (p1 p2) (values 0 y)) - sub (λ (p1 p2) (values (pict-width main) y))))) - -;; hierarchy : pict (cons pict (listof pict)) (cons pict (listof pict)) -> pict -(define (hierarchy main supers subs) - (let ([supers-bottoms (apply max (map (λ (x) (let-values ([(x y) (cb-find main x)]) y)) supers))] - [subs-tops (apply min (map (λ (x) (let-values ([(x y) (ct-find main x)]) y)) subs))] - [sorted-subs (sort subs (λ (x y) (< (left-edge-x main x) (left-edge-x main y))))]) - (unless (< supers-bottoms subs-tops) - (error 'hierarchy "expected supers to be on top of subs, supers bottom is at ~a, and subs tops is at ~a" - supers-bottoms - subs-tops)) - (let* ([main-line-y (max (- subs-tops 20) (/ (+ supers-bottoms subs-tops) 2))] - [main-line-start-x (center-x main (car sorted-subs))] - [main-line-end-x (center-x main (last sorted-subs))] - [w/main-line - (pin-line main - main (λ (_1 _2) (values main-line-start-x main-line-y)) - main (λ (_1 _2) (values main-line-end-x main-line-y)) - #:color hierarchy-color)] - [super-lines - (map (λ (super) - (let-values ([(x y) (cb-find main super)]) - (pin-over - (pin-line (ghost main) - super cb-find - main (λ (_1 _2) (values x main-line-y))) - (- x (/ (pict-width triangle) 2)) - (- (/ (+ y main-line-y) 2) - (/ (pict-height triangle) 2)) - triangle))) - supers)] - [sub-lines - (map (λ (sub) - (let-values ([(x y) (ct-find main sub)]) - (pin-line (ghost main) - sub ct-find - main (λ (_1 _2) (values x main-line-y)) - #:color hierarchy-color))) - subs)]) - (apply cc-superimpose - w/main-line - (append sub-lines - super-lines))))) - -(define triangle-width 12) -(define triangle-height 12) -(define triangle - (let ([points (list (make-object point% (/ triangle-width 2) 0) - (make-object point% 0 triangle-height) - (make-object point% triangle-width triangle-height))]) - (colorize - (dc (λ (dc dx dy) - (let ([brush (send dc get-brush)]) - (send dc set-brush (send brush get-color) 'solid) - (send dc draw-polygon points dx dy) - (send dc set-brush brush))) - triangle-width - triangle-height) - hierarchy-color))) - -(define (center-x main pict) - (let-values ([(x y) (cc-find main pict)]) - x)) - -(define (left-edge-x main pict) - (let-values ([(x y) (lc-find main pict)]) - x)) - - -(define (add-dot-right main class field) (add-dot-left-right/offset main class field 0 rc-find)) -(define add-dot-right/space - (λ (main class field [count 1]) - (add-dot-right/offset main class field (* count dot-edge-spacing)))) -(define (add-dot-right/offset main class field offset) - (add-dot-left-right/offset main class field offset rc-find)) - -(define (add-dot-left main class field) (add-dot-left-right/offset main class field 0 lc-find)) -(define add-dot-left/space - (λ (main class field [count 1]) - (add-dot-left/offset main class field (* count (- dot-edge-spacing))))) -(define (add-dot-left/offset main class field offset) - (add-dot-left-right/offset main class field offset lc-find)) - -(define (add-dot-left-right/offset main class field offset finder) - (let-values ([(_1 y) (cc-find main field)] - [(x-edge _2) (finder main class)]) - (add-dot main (+ x-edge offset) y))) - -(define add-dot-junction - (case-lambda - [(main x-pict y-pict) (add-dot-junction main x-pict cc-find y-pict cc-find)] - [(main x-pict x-find y-pict y-find) - (let-values ([(x _1) (x-find main x-pict)] - [(_2 y) (y-find main y-pict)]) - (add-dot main x y))])) - -(define (add-dot-offset pict dot dx dy) - (let-values ([(x y) (cc-find pict dot)]) - (add-dot pict (+ x dx) (+ y dy)))) - -(define dot-δx (make-parameter 0)) -(define dot-δy (make-parameter 0)) - -(define (add-dot pict dx dy) - (let ([dot (blank)]) - (values (pin-over pict - (+ dx (dot-δx)) - (+ dy (dot-δy)) - dot) - dot))) - -(define (connect-dots show-arrowhead? main dot1 . dots) - (let loop ([prev-dot dot1] - [dots dots] - [pict main]) - (cond - [(null? dots) pict] - [else - (loop (car dots) - (cdr dots) - (connect-two-dots pict prev-dot (car dots) (null? (cdr dots)) show-arrowhead?))]))) - -(define (connect-two-dots pict dot1 dot2 arrowhead? show-arrowhead?) - (if arrowhead? - (pin-arrow-line field-arrowhead-size pict - dot1 cc-find - dot2 cc-find - #:hide-arrowhead? (not show-arrowhead?) - #:color type-link-color) - (pin-line pict - dot1 cc-find - dot2 cc-find - #:color type-link-color))) - -(define (hierarchy/layout tops bottoms - #:every-other-space [every-other-space 0] - #:top-space [top-space 40] - #:bottom-space [bottom-space 40] - #:vertical-space [vertical-space 60]) - (hierarchy - (vc-append (apply ht-append top-space tops) - (blank 0 vertical-space) - (apply ht-append bottom-space - (let loop ([bottoms bottoms] - [every-other? #f]) - (cond - [(null? bottoms) '()] - [else - (cons (if every-other? - (vc-append (blank 0 every-other-space) - (car bottoms)) - (car bottoms)) - (loop (cdr bottoms) - (not every-other?)))])))) - tops - bottoms)) - -(define (add-dot-delta f dx dy) - (parameterize ([dot-δx dx] - [dot-δy dy]) - (f))) - - -(define (right-right-reference main0 start-class start-field finish-class finish-name - [count 1] - #:connect-dots [connect-dots connect-dots] - #:dot-delta [dot-delta 0]) - (let ([going-down? (let-values ([(_1 start-y) (find-cc main0 start-field)] - [(_2 finish-y) (find-cc main0 finish-name)]) - (< start-y finish-y))]) - (define-values (main1 dot1) (add-dot-delta (λ () (add-dot-right main0 start-class start-field)) - 0 - (if going-down? - dot-delta - (- dot-delta)))) - (define-values (main2 dot2) (add-dot-delta (λ () (add-dot-right/space main1 start-class start-field count)) - dot-delta - (if going-down? - dot-delta - (- dot-delta)))) - (define-values (main3 dot3) (add-dot-delta (λ () (add-dot-right main2 finish-class finish-name)) - 0 - (if going-down? - (- dot-delta) - dot-delta))) - (define-values (main4 dot4) (add-dot-delta (λ () (add-dot-junction main3 dot2 dot3)) - 0 - 0)) - - ;; these last two dots are just there for the delta-less arrowhead - (define-values (main5 dot5) (add-dot-right main4 finish-class finish-name)) - (define-values (main6 dot6) (add-dot-delta (λ () (add-dot-right main5 finish-class finish-name)) - 1 ;; just enough to get the arrowhead going the right direction; not enough to see the line - 0)) - - (connect-dots - #t - (connect-dots #f main6 dot1 dot2 dot4 dot3) - dot6 - dot5))) - -(define left-left-reference - (λ (main0 start-class start-field finish-class finish-name [count 1] - #:connect-dots [connect-dots connect-dots] - #:dot-delta [dot-delta 0]) - (let ([going-down? (let-values ([(_1 start-y) (find-cc main0 start-field)] - [(_2 finish-y) (find-cc main0 finish-name)]) - (< start-y finish-y))]) - (define-values (main1 dot1) (add-dot-delta (λ () (add-dot-left main0 start-class start-field)) - 0 - (if going-down? - dot-delta - (- dot-delta)))) - (define-values (main2 dot2) (add-dot-delta (λ () (add-dot-left/space main1 start-class start-field count)) - (- dot-delta) - (if going-down? - dot-delta - (- dot-delta)))) - (define-values (main3 dot3) (add-dot-delta (λ () (add-dot-left main2 finish-class finish-name)) - 0 - (if going-down? - (- dot-delta) - dot-delta))) - (define-values (main4 dot4) (add-dot-delta (λ () (add-dot-junction main3 dot2 dot3)) - 0 - 0)) - (define-values (main5 dot5) (add-dot-left main4 finish-class finish-name)) - (define-values (main6 dot6) (add-dot-delta (λ () (add-dot-left main5 finish-class finish-name)) - -1 ;; just enough to get the arrowhead going the right direction; not enough to see the line - 0)) - - (connect-dots - #t - (connect-dots #f main6 dot1 dot2 dot4 dot3) - dot6 - dot5)))) - -(define left-top-reference - (λ (main0 start-class start-field finish-class [count 1] #:connect-dots [connect-dots connect-dots]) - (define-values (main1 dot1) (add-dot-left main0 start-class start-field)) - (define-values (main2 dot2) (add-dot-left/space main1 start-class start-field count)) - (define-values (main3 dot3) (add-dot-junction main2 dot2 cc-find finish-class ct-find)) - (connect-dots #t main3 dot1 dot2 dot3))) - -(define right-left-reference - (λ (main0 start-class start-field finish-class finish-name - [offset - (find-middle main0 start-class rc-find finish-class lc-find)] - #:connect-dots [connect-dots connect-dots]) - (define-values (main1 dot1) (add-dot-right main0 start-class start-field)) - (define-values (main2 dot2) (add-dot-right/offset main1 start-class start-field offset)) - (define-values (main3 dot3) (add-dot-left main2 finish-class finish-name)) - (define-values (main4 dot4) (add-dot-junction main3 dot2 dot3)) - (connect-dots #t main4 dot1 dot2 dot4 dot3))) - -(define left-right-reference - (λ (main0 start-class start-field finish-class finish-name - [offset - (- (find-middle main0 start-class lc-find finish-class rc-find))] - #:connect-dots [connect-dots connect-dots]) - (define-values (main1 dot1) (add-dot-left main0 start-class start-field)) - (define-values (main2 dot2) (add-dot-left/offset main1 start-class start-field offset)) - (define-values (main3 dot3) (add-dot-right main2 finish-class finish-name)) - (define-values (main4 dot4) (add-dot-junction main3 dot2 dot3)) - (connect-dots #t main4 dot1 dot2 dot4 dot3))) - -(define (find-middle main p1 find1 p2 find2) - (let-values ([(x1 y1) (find1 main p1)] - [(x2 y2) (find2 main p2)]) - (- (/ (+ x1 x2) 2) (min x1 x2)))) - -(define right-top-reference - (λ (main0 start-class start-field finish-class [count 1] #:connect-dots [connect-dots connect-dots]) - (define-values (main1 dot1) (add-dot-right main0 start-class start-field)) - (define-values (main2 dot2) (add-dot-right/space main1 start-class start-field count)) - (define-values (main3 dot3) (add-dot-junction main2 dot2 cc-find finish-class ct-find)) - (connect-dots #t main3 dot1 dot2 dot3))) - -(define connect-dots-contract (->* (boolean? pict? pict?) () #:rest (listof pict?) (values pict?))) - -(provide type-link-color) -(provide/contract - [field-spec (->* ((or/c #f string?) string?) (string? #:default string?) pict?)] - [class-name (->* (string?) (#:spacing-word string?) pict?)] - [class-box (-> pict? (or/c false/c (listof pict?)) (or/c false/c (listof pict?)) pict?)] - [hierarchy/layout - (->* ((cons/c pict? (listof pict?)) (cons/c pict? (listof pict?))) - (#:top-space - integer? - #:bottom-space integer? - #:vertical-space integer? - #:every-other-space integer?) - pict?)] - [user-type-font (-> string? pict?)] - [prim-type-font (-> string? pict?)] - [var-font (-> string? pict?)] - [normal-font (-> string? pict?)] - [comment-font (-> string? pict?)] - - [hierarchy (-> pict? - (cons/c pict? (listof pict?)) - (cons/c pict? (listof pict?)) - pict?)] - [right-right-reference (->* (pict? pict? pict? pict? pict?) - (number? - #:connect-dots connect-dots-contract - #:dot-delta number?) - pict?)] - [left-left-reference (->* (pict? pict? pict? pict? pict?) - (number? - #:connect-dots connect-dots-contract - #:dot-delta number?) - pict?)] - [right-left-reference (->* (pict? pict? pict? pict? pict?) - (number? - #:connect-dots connect-dots-contract) - pict?)] - [left-right-reference (->* (pict? pict? pict? pict? pict?) - (number? - #:connect-dots connect-dots-contract) - pict?)] - [left-top-reference (->* (pict? pict? pict? pict?) - (number? - #:connect-dots connect-dots-contract) - pict?)] - [right-top-reference (->* (pict? pict? pict? pict?) - (number? - #:connect-dots connect-dots-contract) - pict?)] - - [dot-edge-spacing number?] - [connect-dots connect-dots-contract] - [add-dot-right (-> pict? pict? pict? (values pict? pict?))] - [add-dot-right/space (-> pict? pict? pict? (values pict? pict?))] - [add-dot-left (-> pict? pict? pict? (values pict? pict?))] - [add-dot-left/space (-> pict? pict? pict? (values pict? pict?))] - [add-dot-junction - (case-> - (-> pict? pict? pict? (values pict? pict?)) - (-> pict? - pict? (-> pict? pict? (values number? number?)) - pict? (-> pict? pict? (values number? number?)) - (values pict? pict?)))] - [add-dot-offset (-> pict? pict? number? number? (values pict? pict?))] - [add-dot (-> pict? number? number? (values pict? pict?))] - [method-spec - (->* (string? string?) - (#:body (or/c false/c pict?)) - #:rest (listof (or/c false/c string?)) - pict?)] - [java-this (-> pict?)] - [field-arrowhead-size number?]) diff --git a/scribble-doc/scribblings/scribble/compat.scrbl b/scribble-doc/scribblings/scribble/compat.scrbl deleted file mode 100644 index 45d8f1c9..00000000 --- a/scribble-doc/scribblings/scribble/compat.scrbl +++ /dev/null @@ -1,6 +0,0 @@ -#lang scribble/manual - -@title{Compatibility Libraries} - -@include-section["struct.scrbl"] -@include-section["basic.scrbl"] diff --git a/scribble-doc/scribblings/scribble/config.scrbl b/scribble-doc/scribblings/scribble/config.scrbl deleted file mode 100644 index 7289afb1..00000000 --- a/scribble-doc/scribblings/scribble/config.scrbl +++ /dev/null @@ -1,654 +0,0 @@ -#lang scribble/doc -@(require scribble/manual scribble/core scribble/decode - scribble/html-properties scribble/latex-properties - "utils.rkt" - (for-label racket/base - scribble/latex-prefix)) - -@(define (fake-title . str) (apply bold str)) - -@(define (css s) (tt s)) -@(define spacer @hspace[1]) -@(define baseline (style #f '(baseline))) -@(define-syntax-rule (css-table [name desc] ...) - (tabular - #:style (style #f (list (table-columns (list baseline baseline baseline baseline)))) - (list (list spacer name spacer @smaller[desc]) ...))) - -@; ------------------------------------------------------------ - -@title[#:tag "config" #:style 'toc]{Extending and Configuring Scribble Output} - -Sometimes, Scribble's primitives and built-in styles are insufficient -to produce the output that you need. The cases in which you need to -extend or configure Scribble fall into two groups: - -@itemize[ - - @item{You may need to drop into the back-end ``language'' of CSS or - Latex to create a specific output effect. For this kind of - extension, you will mostly likely attach a - @racket[css-addition] or @racket[tex-addition] @tech{style property} - to style, where the addition implements the style name. This - kind of extension is described in @secref["extra-style"].} - - @item{You may need to produce a document whose page layout is - different from the Racket documentation style. For that - kind of configuration, you can run the @exec{scribble} command-line - tool and supply flags like @DFlag{prefix} or @DPFlag{style}, or - you can associate a @racket[html-defaults] or - @racket[latex-defaults] @tech{style property} to the main document's - style. This kind of configuration is described in - @secref["config-style"].} - -] - -@local-table-of-contents[] - -@; ------------------------------------------------------------ - -@section[#:tag "extra-style" - #:style (make-style #f (list (make-css-addition "inbox.css") - (make-tex-addition "inbox.tex"))) - ]{Implementing Styles} - -When a string is used as a style in an @racket[element], -a @racket[multiarg-element], @racket[paragraph], @racket[table], -@racket[itemization], @racket[nested-flow], or -@racket[compound-paragraph], it corresponds to a CSS class for HTML -output or a Latex macro/environment for Latex output. In Latex output, -the string is used as a command name for a @racket[paragraph] -and an environment name for a @racket[table], @racket[itemization], -@racket[nested-flow], or @racket[compound-paragraph]; if the style has -a @racket['command] @tech{style property} for a @racket[nested-flow] or -@racket[compound-paragraph], then the style name is used as a command -instead of an environment; and if the style has -a @racket['multicommand] @tech{style property} for a @racket[nested-flow], -then the style name is used as a command with multiple arguments. -In addition, for an itemization, the style -string is suffixed with @racket["Item"] and used as a CSS class or Latex -macro name to use for the itemization's items (in place of @ltx{item} -in the case of Latex). - -To add a mapping from your own style name to a CSS configuration, add -a @racket[css-addition] structure instance to a style's @tech{style property} -list. To map a style name to a Latex macro or environment, add a -@racket[tex-addition] structure instance. A @racket[css-addition] or -@racket[tex-addition] is normally associated with the style whose name -is implemented by the adition, but it can also be added to the style -for an enclosing part. - -Scribble includes a number of predefined styles that are used by the -exports of @racket[scribble/base]. You can use them or redefine -them. The styles are specified by @filepath{scribble.css} and -@filepath{scribble.tex} in the @filepath{scribble} collection. - -The styles used by @racketmodname[scribble/manual] are implemented by -@filepath{racket.css} and @filepath{racket.tex} in the -@filepath{scribble} collection. Other libraries, such as -@racketmodname[scriblib/autobib], similarly implement styles through files -that are associated by @racket[css-addition] and @racket[tex-addition] -@tech{style properties}. - -To avoid collisions with future additions to Scribble, start your -style name with an uppercase letter that is not @litchar{S}. An -uppercase letter helps to avoid collisions with macros defined by -Latex packages, and future styles needed by @racketmodname[scribble/base] and -@racketmodname[scribble/manual] will start with @litchar{S}. - -For example, a Scribble document - -@verbatim[#:indent 2]|{ - #lang scribble/manual - @(require scribble/core - scribble/html-properties - scribble/latex-properties) - - @(define inbox-style - (make-style "InBox" - (list (make-css-addition "inbox.css") - (make-tex-addition "inbox.tex")))) - - @title{Quantum Pet} - - Do not open: @elem[#:style inbox-style]{Cat} -}| - -combined with an @filepath{inbox.css} that contains - -@verbatim[#:indent 2]|{ - .InBox { - padding: 0.2em; - border: 1px solid #000000; - } -}| - -and an @filepath{inbox.tex} that contains - -@verbatim[#:indent 2]|{ - \newcommand{\InBox}[1]{\fbox{#1}} -}| - -generates - -@nested[#:style 'inset]{ - @fake-title{Quantum Pet} - - Do not open: @elem[#:style "InBox"]{Cat} -} - -@index["HTML Tags and Attributes"]{ -Scribble documents can also embed specific html tags and -attributes.} For example, this Scribble document: -@codeblock|{ -#lang scribble/base - -@(require scribble/core - scribble/html-properties) - -@(define external-image - (elem - #:style - (style #f - (list (alt-tag "img") - (attributes - '((src . "http://racket-lang.org/icon.png"))))))) - -@external-image -}| - -renders as the the Racket logo at the url -@url{http://racket-lang.org/logo.png} -when producing html. - -@; ------------------------------------------------------------ - -@section[#:tag "config-style"]{Configuring Output} - -The implementation of styles used by libraries depends to some degree -on separately configurable parameters, and configuration is also -possible by replacing style implementations. Latex output is more -configurable in the former way, since a document class determines a -set of page-layout and font properties that are used by other -commands. The style-replacement kind of configuration corresponds to -re-defining Latex macros or overriding CSS class attributes. When -@exec{raco setup} builds PDF documentation, it uses both kinds of -configuration to produce a standard layout for Racket manuals; -that is, it selects a particular page layout, and it replaces some -@racketmodname[racket/base] styles. - -Two kinds of files implement the two kinds of configuration: - -@itemize[ - - @item{A @deftech{prefix file} determines the @tt{DOCTYPE} line for - HTML output or the @ltx{documentclass} configuration (and - perhaps some addition package uses or other configurations) for - Latex output. - - The default prefix files are @filepath{scribble-prefix.html} - and @filepath{scribble-prefix.tex} in the @filepath{scribble} - collection.} - - @item{A @deftech{style file} refines the implementation of styles - used in the document---typically just the ``built-in'' styles - used by @racketmodname[scribble/base]. - - The default style files, @filepath{scribble-style.css} and - @filepath{scribble-style.tex} in the @filepath{scribble} - collection, change no style implementations.} - -] - -For a given configuration of output, typically a particular prefix -file works with a particular style file. Some prefix or style files -may be more reusable. For now, reading the default files is the best -way to understand how they interact. A prefix and/or style file may -also require extra accomanying files; for example, a prefix file for -Latex mode may require a corresponding Latex class file. The default -prefix and style files require no extra files. - -When rendering a document through the @exec{scribble} command-line -tool, use flags to select a prefix file, style file, and additional -accompanying files: - -@itemize[ - - @item{Select the prefix file using the @as-index{@DFlag{prefix}} - flag. (Selecting the prefix file also cancels the default list - of accompanying files, if any.)} - - @item{Replace the style file using the @as-index{@DFlag{style}} - flag. Add additional style definitions and re-definitions using - the @as-index{@DPFlag{style}} flag.} - - @item{Add additional accompanying files with @as-index{@DPFlag{extra}}.} - -] - -When using the @exec{scribble} command-line utility, a document can -declare its default style, prefix, and extra files through a -@racket[html-defaults] and/or @racket[latex-defaults] -@tech{style property}. In particular, when using the @exec{scribble} -command-line tool to generate Latex or PDF a document whose main part -is implemented with @racket[#, @hash-lang[] #, -@racketmodname[scribble/manual]], the result has the standard -Racket manual configuration, because @racketmodname[scribble/manual] -associates a @racket[latex-defaults] @tech{style property} with the exported -document. The @racketmodname[scribble/sigplan] language similarly -associates a default configuration with an exported document. As -libraries imported with @racket[require], however, -@racketmodname[scribble/manual] and @racketmodname[scribble/sigplan] -simply implement new styles in a composable way. - -Whether or not a document has a default prefix- and style-file -configuration through a @tech{style property}, the defaults can be -overridden using @exec{scribble} command-line flags. Furthermore, -languages like @racketmodname[scribble/manual] and -@racketmodname[scribble/sigplan] add a @racket[html-defaults] and/or -@racket[latex-defaults] @tech{style property} to a main-document part only if -it does not already have such a property added through the -@racket[#:style] argument of @racket[title]. - -@; ------------------------------------------------------------ - -@section[#:tag "builtin-css"]{Base CSS Style Classes} - -The following renderings of @elem[#:style (style #f (list -(link-resource "demo.scrbl")))]{@filepath{demo.scrbl}} demonstrate all -of the CSS style classes used by @racketmodname[scribble/base] forms and -functions: - -@itemlist[ - - @item{@other-doc['(lib "scribblings/scribble/demo-s1.scrbl")] shows - the default style in a single-page rendering without a search - box.} - - @item{@other-doc['(lib "scribblings/scribble/demo-m1.scrbl")] shows - the default style in a multi-page rendering without a search - box.} - - @item{@other-doc['(lib "scribblings/scribble/demo-s2.scrbl")] shows - the current manual style's adjustments in a single-page - rendering with a search box.} - - @item{@other-doc['(lib "scribblings/scribble/demo-m2.scrbl")] shows - the current manual style's adjustments in a multi-page - rendering with a search box.} - -] - -The style classes: - -@(css-table - [@css{maincolumn} @elem{Outer wrapper for all content in the main column.}] - [@css{main} @elem{Inner wrapper for all content in the main column, including navigation bars.}] - - [@spacer @spacer] - - [@css{refpara} @elem{Outer wrapper for right-hand @racket[margin-note] notes.}] - [@css{refparaleft} @elem{Outer wrapper for left-hand @racket[margin-note] notes.}] - [@css{refelem} @elem{Outer wrapper for right @racket[margin-note*] notes.}] - [@css{refelemleft} @elem{Outer wrapper for left-hand @racket[margin-note*] notes.}] - [@css{refcolumn} @elem{Middle wrapper for right-hand @racket[margin-note] and @racket[margin-note*] notes.}] - [@css{refcolumnleft} @elem{Middle wrapper for left-hand @racket[margin-note] and @racket[margin-note*] notes.}] - [@css{refcontent} @elem{Inner wrapper for @racket[margin-note] and @racket[margin-note*] notes.}] - - [@spacer @spacer] - - [@css{tocset} @elem{Groups table-of-contents panels: main and ``on this page.''}] - - [@spacer @spacer] - - [@css{tocview} @elem{Wraps the main (multi-page mode) or only (single-page mode) table-of-contents panel.}] - [@css{tocviewlist} @elem{A hierarchical layer of content in a main table-of-contents panel.}] - [@css{tocviewlisttopspace} @elem{With @css{tocviewlist} for the first layer.}] - [@css{tocviewtoggle} @elem{The always-visible name of a layer.}] - [@css{tocviewtitle} @elem{With @css{tocviewtoggle} for the first layer.}] - [@css{tocviewsublist} @elem{An item in a layer that has multiple items and more items before and after.}] - [@css{tocviewsublistonly} @elem{An item in a single-item layer.}] - [@css{tocviewsublisttop} @elem{The first item in a multi-item layer.}] - [@css{tocviewsublistbottom} @elem{The last item in a multi-item layer.}] - [@css{tocviewlink} @elem{Inner wrapper for an item in a layer when linked to a different page.}] - [@css{tocviewselflink} @elem{Inner wrapper for every item in a layer when linked to the same page.}] - - [@spacer @spacer] - - [@css{tocsub} @elem{Wraps the ``on this page'' (multi-page mode only) table-of-contents panel.}] - [@css{tocsubtitle} @elem{Wraps the words ``on this page''.}] - [@css{tocsublist} @elem{Inner table for the ``on this page'' panel.}] - [@css{tocsublinknumber} @elem{Number for an entry in an ``on this page'' panel.}] - [@css{tocsubseclink} @elem{Title for a @emph{section} entry in an ``on this page'' panel.}] - [@css{tocsubnonseclink} @elem{Title for a @emph{non-section} entry in an ``on this page'' panel - that has some section links.}] - [@css{tocsublink} @elem{Title for a @emph{non-section} entry in an ``on this page'' panel - that has no section links.}] - - [@css{toctoplink} @elem{Top-level entry in an inline (not the panel) table of contents.}] - [@css{toclink} @elem{Nested entry in an inline (not the panel) table of contents.}] - - [@spacer @spacer] - - [@css{versionbox} @elem{Outer wrapper for version}] - [@css{version} @elem{Inner wrapper for version in the case of search box and/or navigation.}] - [@css{versionNoNav} @elem{Inner wrapper for version in the acse of no search box and navigation.}] - - [@spacer @spacer] - - [@css{SAuthorListBox} @elem{Outer wrapper for the author list.}] - [@css{SAuthorList} @elem{Inner wrapper for the author list.}] - [@css{author} @elem{Wrapper for an individual author.}] - - [@spacer @spacer] - - [@css{navsettop} @elem{Wraps the top navigation bar (in multi-page mode or when a search bar is present).}] - [@css{navsetbottom} @elem{Wraps the bottom navigation bar (in multi-page mode or when a search bar is present).}] - [@css{navleft} @elem{Wraps left-side elements within a navigation bar.}] - [@css{navright} @elem{Wraps right-side elements within a navigation bar.}] - [@css{nonavigation} @elem{Disabled links within a navigation bar.}] - [@css{searchform} @elem{Outer wrapper for a search box within the top navigation bar.}] - [@css{searchbox} @elem{Inner wrapper for a search box within the top navigation bar.}] - [@css{nosearchform} @elem{Takes the place of an absent search box within the top navigation bar.}] - - [@spacer @spacer] - - [@css{SSubSubSubSection} @elem{Deeply nested subsection (below @tt{
}).}] - - [@spacer @spacer] - - [@css{SIntrapara} @elem{Used with @tt{
} instead of @tt{

} for a paragraph - within a @racket[compound-paragraph].}] - - [@spacer @spacer] - - [@css{SubFlow} @elem{For a @racket[nested-flow] with no style name: no inset.}] - [@css{SCodeFlow} @elem{For a @racket[nested-flow] with the @racket['code-inset] style name: - inset suitable for code.}] - [@css{SVInsetFlow} @elem{For a @racket[nested-flow] with the @racket['vertical-inset] style name: - add space before and after suitable for code.}] - [@css{SCentered} @elem{For a @racket[nested-flow] created by @racket[centered]: horizontally - centered.}] - - [@spacer @spacer] - - [@css{boxed} @elem{For a @racket[table] with the @racket['boxed] style name: as a definition box.}] - - [@spacer @spacer] - - [@css{compact} @elem{For an @racket[itemlist] with the @racket['compact] style name.}] - - [@spacer @spacer] - - [@css{techoutside} @elem{Outer wrapper for a technical-term reference.}] - [@css{techinside} @elem{Inner wrapper for a technical-term reference.}] - - [@spacer @spacer] - - [@css{indexlink} @elem{For an entry in the index.}] - - [@spacer @spacer] - - [@css{stt} @elem{Fixed-width text.}] - [@css{sroman} @elem{Serif text.}] - [@css{ssanserif} @elem{Sans serif text.}] - [@css{slant} @elem{Oblique (as opposed to italic) text.}] - [@css{Smaller} @elem{Smaller text (as created by @racket[smaller]).}] - [@css{Larger} @elem{Smaller text (as created by @racket[larger]).}] - [@css{hspace} @elem{For whitespace produced by @racket[hspace].}] - [@css{nobreak} @elem{Disable link breaks.}] - [@css{badlink} @elem{Broken cross-reference.}] - [@css{plainlink} @elem{Hyperlink without an underline.}]) - -In addition, the @css{SIEHidden} style class is built in to all -Scribble HTML output to hide an element on Internet Explorer 6. - -@; ------------------------------------------------------------ - -@section[#:tag "manual-css"]{Manual CSS Style Classes} - -The following renderings of @elem[#:style (style #f (list -(link-resource "demo-manual.scrbl")))]{@filepath{demo-manual.scrbl}} -demonstrate all of the CSS style classes used by -@racketmodname[scribble/manual] forms and functions in addition to the -@seclink["builtin-css"]{base style classes}. - -@itemlist[ - - @item{@other-doc['(lib "scribblings/scribble/demo-manual-s1.scrbl")] shows - the original style in a single-page rendering without a search - box.} - - @item{@other-doc['(lib "scribblings/scribble/demo-manual-m1.scrbl")] shows - the original style in a multi-page rendering without a search - box.} - - @item{@other-doc['(lib "scribblings/scribble/demo-manual-s2.scrbl")] shows - the current manual style's adjustments in a single-page - rendering with a search box.} - - @item{@other-doc['(lib "scribblings/scribble/demo-manual-m2.scrbl")] shows - the current manual style's adjustments in a multi-page - rendering with a search box.} - -] - -The style classes: - -@(css-table - [@css{RktSym} @elem{Identifiers with no @racket[for-label] binding.}] - [@css{RktValLink} @elem{Identifier with @racket[for-label] binding to a variable definition.}] - [@css{RktValDef} @elem{Definition site of a variable, normally combined with @css{RktValLink}.}] - [@css{RktStxLink} @elem{Identifier with @racket[for-label] binding to a syntactic-form definition.}] - [@css{RktStxDef} @elem{Definition site of a syntactic form, normally combined with @css{RktStxLink}.}] - [@css{RktSymDef} @elem{Definition site of an identifier without binding (normally a mistake), combined with @css{RktSym}.}] - [@css{RktVar} @elem{Local variable or meta-variable.}] - [@css{RktRes} @elem{REPL result.}] - [@css{RktOut} @elem{Output written to the current output port.}] - [@css{RktErr} @elem{Output written to the current error port.}] - [@css{RktCmt} @elem{A comment in Racket code.}] - [@css{RktVal} @elem{A literal value in Racket code.}] - [@css{RktPn} @elem{Parentheses, keywords, and similar delimiters in Racket code.}] - [@css{RktRdr} @elem{Reader shorthands in Racket code, except for commas.}] - [@css{RktMeta} @elem{An unquoting comma in Racket code.}] - [@css{highlighted} @elem{Hilighlted code (via @racket[code:highlight] in @racket[racketblock], for example).}] - [@css{RktIn} @elem{Foreground for literal characters written with @racket[litchar].}] - [@css{RktInBG} @elem{Background for literal characters written with @racket[litchar].}] - [@css{RktModLink} @elem{A module name linked to the module's definition.}] - [@css{RktMod} @elem{A module name (normally @css{RktModLink}, instead).}] - [@css{RktKw} @elem{A ``keyword;'' not normally used.}] - [@css{RktOpt} @elem{Brackets for optional arguments (in function definitions).}] - - [@spacer @spacer] - - [@css{RktBlk} @elem{Wrapper for multi-linke Racket code blocks.}] - - [@spacer @spacer] - - [@css{defmodule} @elem{Module definition block.}] - [@css{RpackageSpec} @elem{Package specification within a module-definition block.}] - - [@spacer @spacer] - - [@css{RBoxed} @elem{Definition block; always combined with @css{boxed}.}] - [@css{together} @elem{Table within a @racket[together] grouping.}] - [@css{RBackgroundLabel} @elem{Wrapper for ``procedure,'' ``syntax,'' etc., backing in a definition box.}] - [@css{RBackgroundLabelInner} @elem{Wrapper within @css{RBackgroundLabel}.}] - [@css{RForeground} @elem{Wrapper for element to appear over a @css{RBackgroundLabel}.}] - [@css{prototype} @elem{Wrapper for a multi-line procedure-definition prototype.}] - [@css{argcontract} @elem{Wrapper for a multi-line argument contract and default value.}] - [@css{specgrammar} @elem{Wrapper for a grammar with a syntactic-form definition box.}] - [@css{inherited} @elem{Wrapper for a margin ``inherited methods'' table.}] - [@css{inheritedlbl} @elem{Wrapper for ``Inherited methods:'' and ``from'' labels.}] - - [@spacer @spacer] - - [@css{leftindent} @elem{Left-indented block, such as form @racket[specsubform].}] - [@css{insetpara} @elem{Inset block.}] - - [@spacer @spacer] - - [@css{Rfilebox} @elem{Wrapper for a file box (via @racket[filebox]),}] - [@css{Rfiletitle} @elem{Outer wrapper for a file box title.}] - [@css{Rfilename} @elem{Inner wrapper for a file box title.}] - [@css{Rfilecontent} @elem{Wrapper for file box content.}] - - [@spacer @spacer] - - [@css{SHistory} @elem{Wrapper for @racket[history] paragraphs.}] - - [@spacer @spacer] - - [@css{RBibliography} @elem{Wrapper for a @racket[bibliography] section.}]) - -@; ------------------------------------------------------------ - -@section[#:tag "builtin-latex"]{Base Latex Macros} - -The @filepath{scribble.tex} Latex configuration includes several -macros and environments that you can redefine to adjust the output -style: - -@itemlist[ - - @item{@ltxd[0]{preDoc} --- called before the document content; the - default does nothing, while the @racketmodname[scribble/manual] - configuration enabled @ltx{sloppy}.} - - @item{@ltxd[0]{postDoc} --- called after the document content; the - default does nothing.} - - @item{@ltxd[0]{sectionNewpage} --- called before each top-level - section starts; the default does nothing, while the - @racketmodname[scribble/manual] configuration uses - @ltx{newpage} to start each chapter on a new page.} - - @item{@ltxd[3]{SecRefLocal} --- the first argument is a Latex label, - the second argument is a section number, and the third argument - is a section title. This macro is used by @racket[secref] to - reference a section (other than a document or top-level section - within a document) that has a number and that is local to the - current document. The default expands to @ltx{SecRef}, passing - along just the second and third arguments (so that the label is - ignored).} - - @item{@ltxd[2]{SecRef} --- like @ltx{SecRefLocal}, but used when the - referenced section is in a different document, so that no label - is available. The default shows ``section'' followed by the - section number (ignoring the title). The - @racketmodname[scribble/manual] redefinition of this macro - shows ``§'', the section number, and the title in quotes.} - - @item{@ltxd[3]{ChapRefLocal} and @ltxd[2]{ChapRef} --- like - @ltx{SecRefLocal} and @ltx{SecRef}, but for a top-level section - within a document. The default implementation defers to - @ltx{SecRefLocal} or @ltx{SecRef}.} - - @item{@ltxd[3]{PartRefLocal} and @ltxd[2]{PartRef} --- like - @ltx{SecRefLocal} and @ltx{SecRef}, but for a top-level section - within a document whose part has the @racket['grouper] style - property. The default @ltx{PartRef} shows ``part'' followed by - the section number (ignoring the title).} - - @item{@ltxd[3]{BookRefLocal} and @ltxd[2]{BookRef} --- like - @ltx{SecRefLocal} and @ltx{SecRef}, but for a document (as - opposed to a section within the document). The default - @ltx{BookRef} implementation shows the title in italic.} - - @item{@ltxd[3]{SecRefLocalUC} and @ltxd[2]{SecRefUC} --- like - @ltx{SecRefLocal} and @ltx{SecRef}, but for @racket[Secref]. - The default @ltx{SecRefUC} shows ``Section'' followed by the - section number.} - - @item{@ltxd[3]{ChapRefLocalUC} and @ltxd[2]{ChapRefUC} --- like - @ltx{ChapRefLocal} and @ltx{ChapRef}, but for - @racket[Secref]. The default @ltx{ChapRefUC}implementation - defers to @ltx{SecRefUC}.} - - @item{@ltxd[3]{PartRefLocalUC} and @ltxd[2]{PartRefUC} --- like - @ltx{PartRefLocal} and @ltx{PartRef}, but for @racket[Secref]. - The default @ltx{PartRefUC} shows ``Part'' followed by the - section number.} - - @item{@ltxd[3]{BookRefLocalUC} and @ltxd[2]{BookRefUC} --- like - @ltx{BookRefLocal} and @ltx{BookRef}, but for @racket[Secref]. - The default @ltx{BookRefUC} defers to @ltx{BookRef}.} - - @item{@ltxd[2]{SecRefLocalUN}, @ltxd[1]{SecRefUCUN}, - @ltxd[2]{SecRefLocalUCUN}, @ltxd[1]{SecRefUN}, - @ltxd[2]{PartRefLocalUN}, @ltxd[1]{PartRefUN}, - @ltxd[2]{PartRefLocalUCUN}, @ltxd[1]{PartRefUCUN}, - @ltxd[2]{BookRefLocalUN}, @ltxd[1]{BookRefUN}, - @ltxd[2]{BookRefLocalUCUN}, @ltxd[1]{BookRefUCUN}, - @ltxd[2]{ChapRefLocalUN}, @ltxd[1]{ChapRefUN}, - @ltxd[2]{ChapRefLocalUCUN}, and @ltxd[1]{ChapRefUCUN} --- like - @ltx{SecRefLocal}, etc., but in the case that a - section/part/chapter number is unavailable. The default - implementation of @ltx{BookRefUN} uses @ltx{BookRef} with an - empty first argument. The default @ltx{SecRefLocalUN} expands - to its second argument in quotes followed by ``on page'' as a - @ltx{pageref} using the first argument, while the default - @ltx{SecRefUN} expands to its only argument in quotes. The - default @ltx{PartRef} and @ltx{ChapRef} variants expand to the - corresponding @ltx{SecRef} variant.} - - @item{@ltxd[2]{Ssection}, @ltxd[2]{Ssubsection}, - @ltxd[2]{Ssubsubsection}, @ltxd[2]{Ssubsubsubsection}, - @ltxd[2]{Ssubsubsubsubsection} --- for a top-level section, a - second-level section, etc., where the last variant is used for - all sections that are deeper than four levels. The first - argument corresponds to the optional argument to - @ltx{section}, which is used for the table of contents.} - - @item{@ltxd[1]{Ssectionstar}, @ltxd[1]{Ssubsectionstar}, - @ltxd[1]{Ssubsubsectionstar}, @ltxd[1]{Ssubsubsubsectionstar}, - @ltxd[1]{Ssubsubsubsubsectionstar} --- like @ltx{Ssection}, - etc., but for unnumbered sections that are omitted from the - table of contents.} - - @item{@ltxd[2]{Ssectionstarx}, @ltxd[1]{Ssubsectionstarx}, - @ltxd[2]{Ssubsubsectionstarx}, - @ltxd[2]{Ssubsubsubsectionstarx}, - @ltxd[2]{Ssubsubsubsubsectionstarx} --- like @ltx{Ssection}, - etc., but for unnumbered sections (that nevertheless appear in - the table of contents).} - - @item{@ltxd[0]{Sincsection}, @ltxd[0]{Sincsubsection}, - @ltxd[0]{Sincsubsubsection}, @ltxd[0]{Sincsubsubsubsection}, - @ltxd[0]{Sincsubsubsubsubsection} --- increments the section - counter.} - - @item{@ltxd[2]{Spart}, @ltxd[1]{Spartstar}, @ltxd[2]{Spartstarx}, - @ltxd[0]{Sincpart} --- like the section commands, but used for - in place of @ltxd[2]{Ssection}, @ltxd[1]{Ssectionstar}, @|etc| - for a part with the @racket['grouper] style property.} - - @item{@ltxe{SInsetFlow} environment --- for a @racket[nested-flow] - with the @racket['inset] style name.} - - @item{@ltxe{SCodeFlow} environment --- for a @racket[nested-flow] - with the @racket['code-inset] style name.} - - @item{@ltxe{SVInsetFlow} environment --- for a @racket[nested-flow] - with the @racket['vertical-inset] style name.} - - @item{@ltxd[1]{SCodeBox}, @ltxd[1]{SVInsetBox} --- for a - @racket[nested-flow] with the @racket['code-inset] or - @racket['vertical-inset] style name, respectively, and as the - content of a table cell. The content is installed into a TeX - box using @tt{\setbox1}.} - - ] - -@; ------------------------------------------------------------ - -@section[#:tag "latex-prefix"]{Latex Prefix Support} - -@defmodule[scribble/latex-prefix]{Provides a string that is useful for -constructing a Latex document prefix.} - -@defthing[unicode-encoding-packages string?]{ - -A string containing Latex code that is useful after a -@tt{\documentclass} declaration to make Latex work with Unicode -characters.} diff --git a/scribble-doc/scribblings/scribble/core.scrbl b/scribble-doc/scribblings/scribble/core.scrbl deleted file mode 100644 index 31f93c36..00000000 --- a/scribble-doc/scribblings/scribble/core.scrbl +++ /dev/null @@ -1,1801 +0,0 @@ -#lang scribble/doc -@(require scribble/manual - (except-in "utils.rkt" url) - "struct-hierarchy.rkt" - (for-label scribble/manual-struct - racket/serialize - file/convertible - setup/main-collects - scriblib/render-cond - xml/xexpr - net/url-structs - (only-in scribble/html-render render-mixin))) - -@title[#:tag "core"]{Structures And Processing} - -@defmodule[scribble/core] - -A document is represented as a @techlink{part}, as described in - @secref["parts"]. This representation is intended to be - independent of its eventual rendering, and it is intended to be - immutable; rendering extensions and specific data in a document can - collude arbitrarily, however. - -A document is processed in four passes: - -@itemlist[ - - @item{The @deftech{traverse pass} traverses the document content in - document order so that information from one part of a document - can be communicated to other parts of the same document. The - information is transmitted through a symbol-keyed mapping that - can be inspected and extended by @racket[traverse-element]s and - @racket[traverse-block]s in the document. The @tech{traverse - pass} iterates the traversal until it obtains a fixed point - (i.e., the mapping from one iteration is unchanged from the - previous iteration).} - - @item{The @deftech{collect pass} globally collects information in the - document that can span documents that are built at separate - times, such as targets for hyperlinking.} - - @item{The @deftech{resolve pass} matches hyperlink references - with targets and expands delayed elements (where the expansion - should not contribute new hyperlink targets).} - - @item{The @deftech{render pass} generates the result document.} - -] - -None of the passes mutate the document representation. Instead, the - @tech{traverse pass}, @tech{collect pass}, and @tech{resolve pass} - accumulate information in a side hash table, @racket[collect-info] - table, and @racket[resolve-info] table. The @tech{collect pass} and - @tech{resolve pass} are effectively specialized version of - @tech{traverse pass} that work across separately built documents. - - -@; ------------------------------------------------------------------------ - -@section[#:tag "parts"]{Parts, Flows, Blocks, and Paragraphs} - -This diagram shows the large-scale structure of the -type hierarchy for Scribble documents. A box represents -a struct or a built-in Racket type; for example @racket[part] is a struct. -The bottom portion of a box shows the fields; for example -@racket[part] has three fields, @racket[title], @racket[blocks], -and @racket[subparts]. -The substruct relationship -is shown vertically with navy blue lines connected by a triangle; -for example, a @racket[compound-paragraph] is a @racket[block]. -The types of values on fields are shown via dark red lines in the diagram. -Doubled lines represent lists and tripled lines represent lists -of lists; for example, the @racket[blocks] field of -@racket[compound-paragraph] is a list of @racket[blocks]. -Dotted lists represent functions that compute elements of -a given field; for example, the @racket[block] field of -a @racket[traverse-block] struct is a function that -computes a @racket[block]. - -The diagram is not completely -accurate: a @racket[table] may have @racket['cont] -in place of a block in its @racket[cells] field, and -the types of fields are only shown if they are other structs -in the diagram. -A prose description with more detail follows the diagram. - -@(mk-diagram) - -A @deftech{part} is an instance of @racket[part]; among other things, - it has a title @techlink{content}, an initial @techlink{flow}, and a - list of subsection @techlink{parts}. There is no difference between - a part and a full document; a particular source module just as easily - defines a subsection (incorporated via @racket[include-section]) as a - document. - -A @deftech{flow} is a list of @techlink{blocks}. - -A @deftech{block} is either a @techlink{table}, an - @techlink{itemization}, a @techlink{nested flow}, a - @techlink{paragraph}, a @techlink{compound paragraph}, a - @techlink{traverse block}, or a @techlink{delayed block}. - -@itemize[ - - @item{A @deftech{table} is an instance of @racket[table]; it - has a list of list of @techlink{blocks} corresponding to - table cells.} - - @item{A @deftech{itemization} is an instance of @racket[itemization]; - it has a list of @techlink{flows}.} - - @item{A @deftech{nested flow} is an instance of - @racket[nested-flow]; it has a @tech{flow} that - is typeset as sub-flow.} - - @item{A @deftech{paragraph} is an instance of - @racket[paragraph]; it has a @tech{content}: - - @itemize[ - - @item{An @deftech{content} can be a string, one of a few - symbols, an instance of @racket[element] (possibly - @racket[link-element], etc.), a @racket[multiarg-element], a - a @techlink{traverse element}, @techlink{part-relative element}, a - @techlink{delayed element}, or a list of content. - - @itemize[ - - @item{A string is included in the result - document verbatim, except for space, and - unless the content's enclosing @tech{style} is - @racket['hspace]. In a style other than - @racket['hspace], consecutive spaces in the - output may be collapsed togther or replaced - with a line break. In the style - @racket['hspace], all text is converted to - uncollapsable spaces that cannot be broken - across lines.} - - @item{A symbol content is either @racket['mdash], - @racket['ndash], @racket['ldquo], - @racket['lsquo], @racket['rdquo], @racket['rsquo], @racket['larr], - @racket['rarr], or @racket['prime]; it is - rendered as the corresponding HTML entity - (even for Latex output).} - - @item{An instance of @racket[element] has a - @techlink{content} plus a @tech{style}. The style's - interpretation depends on the renderer, but it - can be one of a few special symbols (such as - @racket['bold]) that are recognized by all - renderers.} - - @item{An instance of @racket[link-element] has a - @techlink{tag} for the target of the link.} - - @item{An instance of @racket[target-element] has a - @techlink{tag} to be referenced by - @racket[link-element]s. An instance of the - subtype @racket[toc-target-element] is - treated like a kind of section label, to be - shown in the ``on this page'' table for HTML - output.} - - @item{An instance of @racket[index-element] has a - @techlink{tag} (as a target), a list of - strings for the keywords (for sorting and - search), and a list of @techlink{contents} to - appear in the end-of-document index.} - - @item{An instance of @racket[image-element] - incorporates an image from a file into the rendered - document.} - - @item{An instance of @racket[multiarg-element] - combines a style with a list of content, - where the style corresponds to a rendered - command that takes multiple arguments.} - - @item{An instance of @racket[collect-element] has a - procedure that is called in the - @techlink{collect pass} of document - processing to record information used by - later passes.} - - @item{A @deftech{traverse element} is an instance - of @racket[traverse-element], which - ultimately produces content, but can - accumulate and inspect information in the - @tech{traverse pass}.} - - @item{A @deftech{part-relative element} is an - instance of @racket[part-relative-element], - which has a procedure that is called in the - @techlink{collect pass} of document - processing to obtain @defterm{content}. When the - part-relative element's procedure is called, - collected information is not yet available, - but information about the enclosing parts is - available.} - - @item{A @deftech{delayed element} is an instance of - @racket[delayed-element], which has a - procedure that is called in the - @techlink{resolve pass} of document - processing to obtain @defterm{content}.} - - @item{An instance of @racket[render-element] has a - procedure that is called in the - @techlink{render pass} of document - processing.} - - ]}]} - - @item{A @deftech{compound paragraph} is an instance of - @racket[compound-paragraph]; like @racket[blockquote], it - has list of @tech{blocks}, but the blocks are typeset as - a single paragraph (e.g., no indentation after the first - block) instead of inset.} - - @item{A @deftech{traverse block} is an instance of - @racket[traverse-block], which ultimately produces - another block, but can accumulate and inspect information - during the @tech{traverse pass}.} - - @item{A @deftech{delayed block} is an instance of - @racket[delayed-block], which has a procedure that - is called in the @techlink{resolve pass} of document - processing to obtain a @defterm{block}.} - -] - -@; ------------------------------------------------------------------------ - -@section[#:tag "tags"]{Tags} - -A @deftech{tag} is a list containing a symbol and either a string, a -@racket[generated-tag] instance, or an arbitrary list. The symbol -effectively identifies the type of the tag, such as @racket['part] for -a tag that links to a part, or @racket['def] for a Racket function -definition. The symbol also effectively determines the interpretation -of the second half of the tag. - -A part can have a @deftech{tag prefix}, which is effectively added -onto the second item within each tag whose first item is -@racket['part], @racket['tech], or @racket['cite], or whose second -item is a list that starts with @racket['prefixable]: - -@itemlist[ - - @item{The prefix is added to a string second item by creating a list - containing the prefix and string.} - - @item{The prefix is added to a list second item after @racket['part], - @racket['tech], or @racket['cite] using @racket[cons].} - - @item{The prefix is added to a second item that starts - @racket['prefixable] by adding it to the list after - @racket['prefixable].} - - @item{A prefix is not added to a @racket[generated-tag] item.} - -] - -The prefix is used for reference outside the part, including the use -of tags in the part's @racket[tags] field. Typically, a document's -main part has a tag prefix that applies to the whole document; -references to sections and defined terms within the document from -other documents must include the prefix, while references within the -same document omit the prefix. Part prefixes can be used within a -document as well, to help disambiguate references within the document. - -Some procedures accept a ``tag'' that is just the string part of the -full tag, where the symbol part is supplied automatically. For -example, @racket[section] and @racket[secref] both accept a string -``tag'', where @racket['part] is implicit. - -The @racketmodname[scribble/tag] library provides functions for constructing -@tech{tags}. - -@; ------------------------------------------------------------------------ - -@section[#:tag "style"]{Styles} - -A @deftech{style} combines a @tech{style name} with a list of -@tech{style properties} in a @racket[style] structure. A @deftech{style name} -is either a string, symbol, or @racket[#f]. A @deftech{style property} can be -anything, including a symbol or a structure such as -@racket[color-property]. - -A style has a single @tech{style name}, because the name typically -corresponds to a configurable instruction to a renderer. For example, -with Latex output, a string style name corresponds to a Latex command -or environment. For more information on how string style names -interact with configuration of a renderer, see -@secref["config"]. Symbolic style names, meanwhile, provide a simple -layer of abstraction between the renderer and documents for widely -supported style; for example, the @racket['italic] style name is -supported by all renderers. - -@tech{Style properties} within a style compose with style names and other -properties. Again, symbols are often used for properties that are directly -supported by renderers. For example, @racket['unnumbered] style -property for a @tech{part} renders the part without a section number. -Many properties are renderer-specific, such as a @racket[hover-property] -structure that associates text with an element to be shown in an -HTML display when the mouse hovers over the text. - -@; ------------------------------------------------------------------------ - -@section[#:tag "passes"]{Collected and Resolved Information} - -The @techlink{collect pass}, @techlink{resolve pass}, and -@techlink{render pass} processing steps all produce information that -is specific to a rendering mode. Concretely, the operations are all -represented as methods on a @racket[render<%>] object. - -The result of the @method[render<%> collect] method is a -@racket[collect-info] instance. This result is provided back as an -argument to the @method[render<%> resolve] method, which produces a -@racket[resolve-info] value that encapsulates the results from both -iterations. The @racket[resolve-info] value is provided back to the -@method[render<%> resolve] method for final rendering. - -Optionally, before the @method[render<%> resolve] method is called, -serialized information from other documents can be folded into the -@racket[collect-info] instance via the @method[render<%> -deserialize-info] method. Other methods provide serialized information -out of the collected and resolved records. - -During the @techlink{collect pass}, the procedure associated with a -@racket[collect-element] instance can register information with -@racket[collect-put!]. - -During the @techlink{resolve pass}, collected information for a part -can be extracted with @racket[part-collected-info], which includes a -part's number and its parent part (or @racket[#f]). More generally, -the @racket[resolve-get] method looks up information previously -collected. This resolve-time information is normally obtained by the -procedure associated with a @techlink{delayed block} or -@techlink{delayed element}. - -The @racket[resolve-get] information accepts both a @racket[part] and -a @racket[resolve-info] argument. The @racket[part] argument enables -searching for information in each enclosing part before sibling parts. - -@; ------------------------------------------------------------------------ - -@section{Structure Reference} - -@defstruct[part ([tag-prefix (or/c #f string?)] - [tags (listof tag?)] - [title-content (or/c #f list?)] - [style style?] - [to-collect list?] - [blocks (listof block?)] - [parts (listof part?)])]{ - -The @racket[tag-prefix] field determines the optional @techlink{tag -prefix} for the part. - -The @racket[tags] indicates a list of @techlink{tags} that each link -to the section. Normally, @racket[tags] should be a non-empty list, so -that hyperlinks can target the section. - -The @racket[title-content] field holds the part's title, if any. - -For the @racket[style] field, the currently recognized symbolic style -names are as follows: - -@itemize[ - - @item{@racket['index] --- The part represents an index.} - -] - -The recognized @tech{style properties} are as follows: - -@itemize[ - - @item{@racket['unnumbered] --- A section number is not computed or - rendered for the section.} - - @item{@racket['hidden-number] --- A section number is computed for - the section, but it is not rendered as part of the section name.} - - @item{@racket['toc-hidden] --- The part title is not shown in tables - of contents, including in ``on this page'' boxes. For Latex - rendering, the part title is omitted only if it is unnumbered - or has a hidden number.} - - @item{@racket['hidden] --- The part title is not shown; for Latex - output, the part title is not shown only if its is empty, and - in that case, it is also excluded from tables of contents. The - @racket['toc-hidden] @tech{style property} usually should be included with - @racket['hidden] (for consistency in non-Latex output).} - - @item{@racket['grouper] --- The part is numbered with a Roman - numeral, by default, and its subsections continue numbering as - if they appeared in the preceeding part. In other words, the - part acts like a ``part'' in a book where chapter numbering is - continuous across parts.} - - @item{@tech{numberer} --- A @tech{numberer} created with - @racket[make-numberer] determines a representation of the - part's section number as an extension of it's patent's number. - A @tech{numberer} overrides the default representation, which - is a natural number or (in the case of an accompanying - @racket['grouper] property) a Roman numeral. If a - @racket['unnumbered] property is also present, a - @tech{numberer} property is ignored.} - - @item{@racket['toc] --- Sub-parts of the part are rendered on separate - pages for multi-page HTML mode.} - - @item{@racket['non-toc] --- Initial sub-parts of the part are - @emph{not} rendered on separate pages for multi-page HTML - mode; this @tech{style property} applies only to the main part.} - - @item{@racket['reveal] --- Shows sub-parts when this part is - displayed in a table-of-contents panel in HTML output (which - normally shows only the top-level sections).} - - @item{@racket['quiet] --- In HTML output and most other output modes, - hides entries for sub-parts of this part in a - @racket[table-of-contents] or @racket[local-table-of-contents] - listing except when those sub-parts are top-level entries in - the listing.} - - @item{@racket['no-toc] --- As a @tech{style property} for the main part of a - rendered page, causes the HTML output to not include a margin box - for the main table of contents; the ``on this page'' box that - contains @racket[toc-element] and @racket[toc-target-element] - links (and that only includes an ``on this page'' label for - multi-page documents) takes on the location and color of the - main table of contents, instead.} - - @item{@racket['no-sidebar] --- As a @tech{style property} for the main part of a - document, causes the HTML output to not include an ``on this - page'' margin box.} - - @item{@racket[document-version] structure --- A version number for - this part and its sub-parts (except as overridden). When it is - not @racket[""] may be used when rendering a document; at a - minimum, a non-@racket[""] version is rendered when it is - attached to a part representing the whole document. The default - version for a document is @racket[(version)]. In rendered form, - the version is normally prefixed with the word ``Version,'' but - this formatting can be controlled by overriding - @tt{.version:before} and/or @tt{.versionNoNav:before} in CSS - for HTML rendering or by redefining the @tt{\SVersionBefore} - macro for Latex rendering (see @secref["config"]).} - - @item{@racket[document-date] structure --- A date for the part, - normally used on a document's main part for for Latex - output. The default date for a document is @racket[#f], which - avoids explicitly specifying a date at the Latex level, so that - the current date is used as the document date. Set the date to - @racket[""] to suppress a date in an output document.} - - @item{@racket[body-id] structure --- Generated HTML uses the given - string @tt{id} attribute of the @tt{} tag; this @tech{style property} can - be set separately for parts that start different HTML pages, - otherwise it is effectively inherited by sub-parts; the - default is @racket["scribble-racket-lang.org"], but - @exec{raco setup} installs @racket["doc-racket-lang.org"] as the - @tt{id} for any document that it builds.} - - @item{@racket[attributes] structure --- Provides additional HTML - attributes for the @tt{} tag when the part corresponds to - its own HTML page.} - - @item{@racket[head-extra] structure --- Provides additional HTML - content for the @tt{} tag when the part corresponds to - its own HTML page.} - - @item{@racket[color-property] structure --- For HTML, applies a color - to the part title.} - - @item{@racket[background-color-property] structure --- For HTML, - applies a color to the background of the part title.} - - @item{@racket[hover-property] structure --- For HTML, adds a text - label to the title to be shown when the mouse hovers over - it.} - - @item{@racket[render-convertible-as] structure --- For HTML, controls - how objects that subscribe to the @racketmodname[file/convertible] - protocol are rendered.} - - @item{@racket[document-source] structure --- For HTML, provides a - module path for the part's source. Clicking on an HTML section - title generated for the part or its sub-parts may show the - module path plus a section-tag string, so that the user can - create a reference to the section.} - -] - -The @racket[to-collect] field contains @techlink{content} that is -inspected during the @techlink{collect pass}, but ignored in later -passes (i.e., it doesn't directly contribute to the output). - -The @racket[blocks] field contains the part's initial flow (before -sub-parts). - -The @racket[parts] field contains sub-parts. - -} - - -@defstruct[paragraph ([style style?] [content content?])]{ - -A @techlink{paragraph} has a @tech{style} and a @tech{content}. - -For the @racket[style] field, a string @tech{style name} corresponds -to a CSS class for HTML output or a macro for Latex output (see -@secref["extra-style"]). The following symbolic @tech{style names} are -recognized: - -@itemize[ - - @item{@racket['author] --- Typeset as the author of a document. Such - paragraphs normally should appear only in the initial flow of a - @racket[part] for a document, where they are treated specially - by the Latex renderer by moving the author information to the - title.} - - @item{@racket['pretitle] --- Typeset before the title of the - enclosing part.} - - @item{@racket['wraps] --- Like a @racket[#f] @tech{style name}, but not - @tech{boxable} in the sense of @racket[box-mode] for Latex output.} - -] - -When a paragraph's style is @racket[#f], then it is @tech{boxable} in the -sense of @racket[box-mode] for Latex output. - -The currently recognized @tech{style properties} are as follows: - -@itemize[ - - @item{@racket['omitable] --- When a table cell contains a single - @racket[paragraph] with the @racket['omitable] @tech{style property}, - then when rendering to HTML, no @tt{

} tag wraps the cell - content.} - - @item{@racket['div] --- Generates @tt{

} HTML output instead of - @tt{

} (unless a @racket[alt-tag] property is provided).} - - @item{@racket[alt-tag] structure --- Generates the indicated HTML tag - instead of @tt{

} or @tt{

}.} - - @item{@racket[attributes] structure --- Provides additional HTML - attributes for the @tt{

}, @tt{

}, or alternate tag.} - - @item{@racket[body-id] structure --- For HTML, uses the given string - as an @tt{id} attribute of the @tt{

}, @tt{

}, or - alternate tag.} - - @item{@racket['never-indents] --- For Latex and @tech{compound - paragraphs}; see @racket[compound-paragraph].} - - @item{@racket[box-mode] structure --- For Latex output, uses an alternate - rendering form for @tech{boxing contexts} (such as a table cell); see - @racket[box-mode].} - -]} - - -@defstruct[table ([style style?] - [blockss (listof (listof (or/c block? 'cont)))])]{ - -See also the @racket[tabular] function. - -A @techlink{table} has, roughly, a list of list of blocks. A cell in -the table can span multiple columns by using @racket['cont] instead of -a block in the following columns (i.e., for all but the first in a set -of cells that contain a single block). - -Within @racket[style], a string @tech{style name} corresponds to a CSS -class for HTML output or an environment for Latex output (see -@secref["extra-style"]). The following symbolic style names are also -recognized: - -@itemize[ - - @item{@racket['boxed] --- Renders as a definition. - This style name is not intended for use on a table that is - nested within a @racket['boxed] table; nested uses may look - right for some renders of the style but not others.} - - @item{@racket['centered] --- Centers HTML output horizontally.} - - @item{@racket['block] --- Prevents pages breaks in Latex output.} - -] - -The following @tech{style properties} are currently recognized: - -@itemize[ - - @item{@racket[table-columns] structure --- Provides column-specific - styles, but only @racket[column-attributes] properties (if any) - are used if a @racket[table-cells] structure is included as a - @tech{style property}. See @racket[table-cells] for information - about how a column style is used for each cell.} - - @item{@racket[table-cells] structure --- Provides cell-specific - styles. See @racket[table-cells] for information about how the - styles are used.} - - @item{@racket[attributes] structure --- Provides additional HTML - attributes for the @tt{} tag.} - - @item{@racket[body-id] structure --- For HTML, uses the given string - as an @tt{id} attribute of the @tt{
} tag.} - - @item{@racket['aux] --- For HTML, include the table in the - table-of-contents display for the enclosing part.} - - @item{@racket['never-indents] --- For Latex and @tech{compound - paragraphs}; see @racket[compound-paragraph].} - -] - -For Latex output, a paragraph as a cell value is not automatically -line-wrapped, unless a vertical alignment is specified for the cell -through a @racket[table-cells] or @racket[table-columns] -@tech{style property}. To get a line-wrapped paragraph, use a -@racket[compound-paragraph] or use an element with a string style and -define a corresponding Latex macro in terms of @ltx{parbox}. For Latex -output of blocks in the flow that are @racket[nested-flow]s, -@racket[itemization]s, @racket[compound-paragraph]s, or -@racket[delayed-block]s, the block is wrapped with @ltxe{minipage} using -@ltx{linewidth} divided by the column count as the width.} - - -@defstruct[itemization ([style style?] - [blockss (listof (listof block?))])]{ - -A @techlink{itemization} has a @tech{style} and a list of @tech{flows}. - -In @racket[style], a string @tech{style name} corresponds to a CSS -class for HTML output or a macro for Latex output (see -@secref["extra-style"]). In addition, the following symbolic style -names are recognized: - -@itemize[ - - @item{@racket['compact] --- Reduces space between items.} - - @item{@racket['ordered] --- Generates @tt{
    } HTML output instead - of @tt{
      } or an Latex enumeration instead of an - itemization.} -] - -The following @tech{style properties} are currently recognized: - -@itemize[ - - @item{@racket[attributes] structure --- Provides additional HTML - attributes for the @tt{
        } or @tt{
          } tag.} - - @item{@racket[body-id] structure --- For HTML, uses the given string - as an @tt{id} attribute of the @tt{
            } or @tt{
              } tag.} - - @item{@racket['never-indents] --- For Latex and @tech{compound - paragraphs}; see @racket[compound-paragraph].} - -]} - - -@defstruct[nested-flow ([style any/c] - [blocks (listof block?)])]{ - -A @techlink{nested flow} has a style and a @tech{flow}. - -In @racket[style], the @tech{style name} is normally a string that -corresponds to a CSS class for HTML @tt{
              } output or a Latex -environment (see @secref["extra-style"]). The following symbolic style -names are recognized: - -@itemize[ - - @item{@racket['inset] --- Insets the nested flow relative to - surrounding text.} - - @item{@racket['code-inset] --- Insets the nested flow relative to - surrounding text in a way suitable for code. If the nested flow - has a single block, then it is @tech{boxable} in the sense of - @racket[box-mode] for Latex output.} - - @item{@racket['vertical-inset] --- Insets the nested flow vertically - relative to surrounding text, but not horizontally. If the - nested flow has a single block, then it is @tech{boxable} in the sense - of @racket[box-mode] for Latex output.} - -] - -The following @tech{style properties} are currently recognized: - -@itemize[ - - @item{@racket['command] --- For Latex output, a string @tech{style - name} is used as a command name instead of an environment - name.} - - @item{@racket['multicommand] --- For Latex output, a string - @tech{style name} is used as a command name with a separate - argument for each block in @racket[blocks].} - - @item{@racket[attributes] structure --- Provides additional HTML - attributes for the @tt{
              } tag.} - - @item{@racket[body-id] structure --- For HTML, uses the given string - as an @tt{id} attribute of the @tt{
              } tag.} - - @item{@racket['never-indents] --- For Latex and @tech{compound - paragraphs}; see @racket[compound-paragraph].} - - @item{@racket[box-mode] structure --- For Latex output, uses an alternate - rendering form for @tech{boxing contexts} (such as a table cell); see - @racket[box-mode].} - - @item{@racket['decorative] --- The content of the nested flow is intended - for decoration. Text output skips a decorative nested flow.} - - @item{@racket[alt-tag] structure --- Generates the indicated HTML tag - instead of @tt{
              }.} - -]} - - -@defstruct[compound-paragraph ([style style?] - [blocks (listof block?)])]{ - -A @techlink{compound paragraph} has a @tech{style} and a list of -@tech{blocks}. - -For HTML, a @racket[paragraph] block in @racket[blocks] is rendered -without a @tt{

              } tag, unless the paragraph has a style with a -non-@racket[#f] @tech{style name}. For Latex, each @tech{block} in -@racket[blocks] is rendered with a preceding @ltx{noindent}, unless -the block has the @racket['never-indents] property (checking -recursively in a @racket[nested-flow] or @racket[compound-paragraph] -if the @racket[nested-flow] or @racket[compound-paragraph] itself has -no @racket['never-indents] property). - -The @racket[style] field of a compound paragraph is normally a string -that corresponds to a CSS class for HTML output or Latex environment -for Latex output (see @secref["extra-style"]). The following -@tech{style properties} are currently recognized: - -@itemize[ - - @item{@racket['command] --- For Latex output, a string @tech{style - name} is used as a command name instead of an environment - name.} - - @item{@racket[alt-tag] structure --- Generates the given HTML tag - instead of @tt{

              }.} - - @item{@racket[attributes] structure --- Provides additional HTML - attributes for the @tt{

              } or alternate tag.} - - @item{@racket[body-id] structure --- For HTML, uses the given string - as an @tt{id} attribute of the @tt{

              } or alternate tag.} - - @item{@racket['never-indents] --- For Latex within another - @tech{compound paragraph}; see above.} - -]} - - -@defstruct[traverse-block ([traverse block-traverse-procedure/c])]{ - -Produces another block during the @tech{traverse pass}, eventually. - -The @racket[traverse] procedure is called with @racket[_get] and -@racket[_set] procedures to get and set symbol-keyed information; the -@racket[traverse] procedure should return either a @tech{block} (which -effectively takes the @racket[traverse-block]'s place) or a procedure -like @racket[traverse] to be called in the next iteration of the -@tech{traverse pass}. - -All @racket[traverse-element] and @racket[traverse-block]s that have -not been replaced are forced in document order relative to each other -during an iteration of the @tech{traverse pass}. - -The @racket[_get] procedure passed to @racket[traverse] takes a symbol -and any value to act as a default; it returns information registered -for the symbol or the given default if no value has been -registered. The @racket[_set] procedure passed to @racket[traverse] -takes a symbol and a value to registered for the symbol. - -@margin-note*{See also @racket[cond-block] in @racketmodname[scriblib/render-cond].} -@; -The symbol @indexed-racket['scribble:current-render-mode] is -automatically registered to a list of symbols that describe the -target of document rendering. The list contains @racket['html] -when rendering to HTML, @racket['latex] when rendering via Latex, and -@racket['text] when rendering to text. The registration of -@racket['scribble:current-render-mode] cannot be changed via -@racket[_set].} - - -@defstruct[delayed-block ([resolve (any/c part? resolve-info? . -> . block?)])]{ - -The @racket[resolve] procedure is called during the @techlink{resolve -pass} to obtain a normal @tech{block}. The first argument to -@racket[resolve] is the renderer. - -} - - -@defstruct[element ([style element-style?] - [content content?])]{ - -Styled @tech{content} within an enclosing @tech{paragraph} or other content. - -The @racket[style] field can be a @racket[style] structure, but it can -also be just a @tech{style name}. - -In @racket[style], a string @tech{style name} corresponds to a CSS -class for HTML output and a macro name for Latex output (see -@secref["extra-style"]). The following symbolic style names are -recognized: - -@itemize[ - - @item{@racket['tt], @racket['italic], @racket['bold], @racket['roman], @racket['sf], - @racket['url], @racket['subscript], @racket['superscript], - @racket['smaller], @racket['larger] --- - Basic styles recognized by all renders.} - - @item{@racket['hspace] --- Renders its @racket[content] as monospace - blanks.} - - @item{@racket['newline] --- Renders a line break independent of - the @racket[content].} - - @item{@racket['no-break] --- Prevents line breaks when rendering - @racket[content].} - -] - -The following @tech{style properties} are currently recognized: - -@itemize[ - - @item{@racket[target-url] structure --- Generates a hyperlink.} - - @item{@racket[url-anchor] structure --- For HTML, inserts a hyperlink - target before @racket[content].} - - @item{@racket[color-property] structure --- Applies a color to the - text of @racket[content].} - - @item{@racket[background-color-property] structure --- Applies a - color to the background of @racket[content].} - - @item{@racket[alt-tag] structure --- Generates the given HTML tag - instead of the default one (@tt{}, @tt{}, @|etc|).} - - @item{@racket[attributes] structure --- Provides additional HTML - attributes for a tag.} - - @item{@racket[hover-property] structure --- For HTML, adds a text - label to the content to be shown when the mouse hovers over - it.} - - @item{@racket[script-property] structure --- For HTML, supplies a - script alternative to @racket[content].} - - @item{@racket[body-id] structure --- For HTML uses the given - string as an @tt{id} attribute of the @tt{} tag.} - - @item{@racket['aux] --- Intended for use in titles, where the - auxiliary part of the title can be omitted in hyperlinks. See, - for example, @racket[secref].} - - @item{@racket['tt-chars] --- For Latex output, when the @tech{style - name} is a string, render the element's content with escapes - suitable for Latex @tt{tt} mode.} - - @item{@racket['exact-chars] --- For Latex output, when the @tech{style - name} is a string or @racket[#f], render the elements content exactly - (without escapes).} - - @item{@racket[command-extras] structure --- For Latex output, - adds strings as arguments to the Latex command.} - -] - -@history[#:changed "1.6" @elem{Changed @racket['exact-chars] handling to - take effect when the style name is @racket[#f].}]} - - -@defstruct[(image-element element) ([path (or/c path-string? - (cons/c 'collects (listof bytes?)))] - [suffixes (listof #rx"^[.]")] - [scale real?])]{ - -Used as a style for an @racket[element] to inline an image. The -@racket[path] field can be a result of -@racket[path->main-collects-relative]. - -For each string in @racket[suffixes], if the rendered works with the -corresponding suffix, the suffix is added to @racket[path] and used if -the resulting path refers to a file that exists. The order in -@racket[suffixes] determines the order in which suffixes are -tried. The HTML renderer supports @racket[".png"], @racket[".gif"], and @racket[".svg"], -while the Latex renderer supports @racket[".png"], @racket[".pdf"], -and @racket[".ps"] (but rendering Latex output to PDF will not work -with @racket[".ps"] files, while rendering to Latex DVI output works -only with @racket[".ps"] files). If @racket[suffixes] is empty or if -none of the suffixes lead to files that exist, @racket[path] is used -as-is. - -The @racket[scale] field scales the image in its rendered form.} - - -@defstruct[(target-element element) ([_tag tag?])]{ - -Declares the content as a hyperlink target for @racket[_tag].} - - -@defstruct[(toc-target-element target-element) ()]{ - -Like @racket[target-element], the content is also a kind of section -label to be shown in the ``on this page'' table for HTML output.} - - -@defstruct[(toc-target2-element toc-target-element) ([toc-content content?])]{ - -Extends @racket[target-element] with a separate field for the content -to be shown in the ``on this page'' table for HTML output.} - - -@defstruct[(page-target-element target-element) ()]{ - -Like @racket[target-element], but a link to the element goes to the -top of the containing page.} - - -@defstruct[(redirect-target-element target-element) ([alt-path path-string?] - [alt-anchor string?])]{ - -Like @racket[target-element], but a link to the element is redirected -to the given URL.} - - -@defstruct[(toc-element element) ([toc-content content?])]{ - -Similar to @racket[toc-target-element], but with specific content for -the ``on this page'' table specified in the @racket[toc-content] -field.} - - -@defstruct[(link-element element) ([tag tag?])]{ - -Hyperlinks the content to @racket[_tag]. - -When @racket[_tag] is a part tag and the content of the element is -@racket[null], then the hyperlink uses the target part's number and/or -title as the content. In that case, if the section number is preceded -by a word, the word starts in uppercase if the element's style includes a -@racket['uppercase] property. - -The following symbol is recognized as a @tech{style property}: - -@itemize[ - - @item{@racket['indirect-link] --- For HTML output, treats the link as - ``external''. When rendering to HTML and the - @method[render-mixin set-external-tag-path] method is called to - provide an external-link URL, then the resolution of the - hyperlink can be deferred until the link is clicked (or, in - some cases, patched by JavaScript when the documentation is - viewed in a browser).} - -]} - - -@defstruct[(index-element element) ([tag tag?] - [plain-seq (and/c pair? (listof string?))] - [entry-seq (listof content?)] - [desc any/c])]{ - -The @racket[plain-seq] specifies the keys for sorting, where the first -string is the main key, the second is a sub-key, etc. For -example, an ``night'' portion of an index might have sub-entries for -``night, things that go bump in'' and ``night, defender of the''. The -former would be represented by @racket[plain-seq] @racket['("night" -"things that go bump in")], and the latter by @racket['("night" -"defender of the")]. Naturally, single-string -@racket[plain-seq] lists are the common case, and at least one word is -required, but there is no limit to the word-list length. The strings in -@racket[plain-seq] must not contain a newline character. - -The @racket[entry-seq] list must have the same length as -@racket[plain-seq]. It provides the form of each key to render in the -final document. - -The @racket[desc] field provides additional information about the -index entry as supplied by the entry creator. For example, a reference -to a procedure binding can be recognized when @racket[desc] is an -instance of @racket[procedure-index-desc]. See -@racketmodname[scribble/manual-struct] for other typical types of -@racket[desc] values. - -See also @racket[index].} - - -@defstruct[multiarg-element ([style element-style?] - [contents (listof content?)])]{ - -Like @racket[element] with a list for content, except that for Latex -output, if the @tech{style name} in @racket[style] is a string, then -it corresponds to a Latex command that accepts as many arguments (each -in curly braces) as elements of @racket[contents].} - - -@defstruct[traverse-element ([traverse element-traverse-procedure/c])]{ - -@margin-note*{See also @racket[cond-element] in @racketmodname[scriblib/render-cond].} -@; -Like @racket[traverse-block], but the @racket[traverse] procedure must -eventually produce @tech{content}, rather than a @tech{block}.} - - -@defstruct[delayed-element ([resolve (any/c part? resolve-info? . -> . content?)] - [sizer (-> any/c)] - [plain (-> any/c)])]{ - -The @racket[render] procedure's arguments are the same as for -@racket[delayed-block], but the result is @techlink{content}. -Unlike @racket[delayed-block], the -result of the @racket[render] procedure's argument is remembered on -the first call for re-use for a particular resolve pass. - -The @racket[sizer] field is a procedure that produces a substitute -@techlink{content} for the delayed element for the purposes of -determining the delayed element's width (see @racket[element-width]). - -The @racket[plain] field is a procedure that produces a substitute -@techlink{content} when needed before the @techlink{collect pass}, -such as when @racket[element->string] is used before the @tech{collect -pass}.} - - -@defstruct[part-relative-element ([resolve (collect-info? . -> . content?)] - [sizer (-> any/c)] - [plain (-> any/c)])]{ - -Similar to @racket[delayed-block], but the replacement -@techlink{content} is obtained in the @techlink{collect pass} by -calling the function in the @racket[resolve] field. - -The @racket[resolve] function can call @racket[collect-info-parents] -to obtain a list of @techlink{parts} that enclose the element, -starting with the nearest enclosing section. Functions like -@racket[part-collected-info] and @racket[collected-info-number] can -extract information like the part number.} - - -@defstruct[(collect-element element) ([collect (collect-info . -> . any)])]{ - -Like @racket[element], but the @racket[collect] procedure is called -during the @techlink{collect pass}. The @racket[collect] procedure -normally calls @racket[collect-put!]. - -Unlike @racket[delayed-element] or @racket[part-relative-element], the -element remains intact (i.e., it is not replaced) by either the -@tech{collect pass} or @tech{resolve pass}.} - - -@defstruct[(render-element element) ([render (any/c part? resolve-info? . -> . any)])]{ - -Like @racket[delayed-element], but the @racket[render] procedure is called -during the @techlink{render pass}. - -If a @racket[render-element] instance is serialized (such as when -saving collected info), it is reduced to a @racket[element] instance.} - - -@defstruct[collected-info ([number (listof part-number-item?)] - [parent (or/c #f part?)] - [info any/c])]{ - -Computed for each part by the @techlink{collect pass}. - -The length of the @racket[number] list indicates the section's nesting -depth. Elements of @racket[number] correspond to the section's number, -it's parent's number, and so on (that is, the section numbers are in -reverse order): - -@itemlist[ - - @item{A number value corresponds to a normally numbered - section.} - - @item{A non-empty string corresponds to a @racket['grouper] section, - which is shown as part of the combined section number only when - it's the first element.} - - @item{A a list corresponds to a @tech{numberer}-generated section - string plus its separator string, where the separator is used - in a combined section number after the section string and - before a subsection's number (or, for some output modes, before - the title of the section).} - - @item{For an unnumbered section, a @racket[#f] is used in place of - any number or lists element, while @racket[""] is used in place - of all non-empty strings.} - -]} - -@history[#:changed "6.4" @elem{Added @racket[(list/c string? string?)] - number items for - @tech{numberer}-generated section - numbers.}]} - - -@defstruct[target-url ([addr path-string?])]{ - -Used as a @tech{style property} for an @racket[element]. A path is -allowed for @racket[addr], but a string is interpreted as a URL rather -than a file path.} - - -@defstruct[document-version ([text (or/c string? #f)])]{ - -Used as a @tech{style property} for a @racket[part] to indicate a -version number.} - - -@defstruct[document-date ([text (or/c string? #f)])]{ - -Used as a @tech{style property} for a @racket[part] to indicate a -date (which is typically used for Latex output).} - - -@defstruct[color-property ([color (or/c string? (list/c byte? byte? byte?))])]{ - -Used as a @tech{style property} for an @racket[element] to set its -color. Recognized string names for @racket[color] depend on the -renderer, but at the recognized set includes at least -@racket["white"], @racket["black"], @racket["red"], @racket["green"], -@racket["blue"], @racket["cyan"], @racket["magenta"], and -@racket["yellow"]. When @racket[color] is a list of bytes, the values -are used as RGB levels. - -When rendering to HTML, a @racket[color-property] is also recognized -for a @tech{block}, @racket[part] (and used for the title in the -latter case)or cell in a @racket[table].} - - -@defstruct[background-color-property ([color (or/c string? (list/c byte? byte? byte?))])]{ - -Like @racket[color-property], but sets the background color.} - - -@defstruct[table-cells ([styless (listof (listof style?))])]{ - -Used as a @tech{style property} for a @racket[table] to set its cells' -styles. - -If a cell style has a string name, it is used as an HTML class for the -@tt{

} tag or as a Latex command name. - -The following are recognized as cell-@tech{style properties}: - -@itemize[ - - @item{@racket['left] --- Left-align the cell content.} - - @item{@racket['right] --- Right-align the cell content top baselines.} - - @item{@racket['center] --- Center the cell content horizontally.} - - @item{@racket['top] --- Top-align the cell content.} - - @item{@racket['baseline] --- Align the cell content top baselines.} - - @item{@racket['bottom] --- bottom-align the cell content.} - - @item{@racket['vcenter] --- Center the cell content vertically.} - - @item{@racket['border] --- Draw a line around all sides of the - cell. Borders along a shared edge of adjacent cells are - collapsed into a single line.} - - @item{@racket['left-border], @racket['right-border], - @racket['top-border], or @racket['bottom-border] --- Draw a - line along the corresponding side of the cell (with the same - border collapsing as for @racket['border]).} - - @item{@racket[color-property] structure --- For HTML, applies a color - to the cell content.} - - @item{@racket[background-color-property] structure --- For HTML, - applies a color to the background of the cell.} - - @item{@racket[attributes] --- Provides additional HTML attributes - for the cell's @tt{} tag.} - -] - -@history[#:changed "1.1" @elem{Added @racket[color-property] and - @racket[background-color-property] support.} - #:changed "1.4" @elem{Added @racket['border], @racket['left-border], - @racket['right-border], @racket['top-border], - and @racket['bottom-border] support.}]} - - -@defstruct[table-columns ([styles (listof style?)])]{ - -Like @racket[table-cells], but with support for a -@racket[column-attributes] property in each style, and the -@racket[styles] list is otherwise duplicated for each row in the -table. The non-@racket[column-attributes] parts of a -@racket[table-columns] are used only when a @racket[table-cells] property is -not present along with the @racket[table-columns] property. - -For HTML table rendering, for each column that has a -@racket[column-attributes] property in the corresponding element of -@racket[styles], the attributes are put into an HTML @tt{col} tag -within the table.} - - -@deftogether[( -@defstruct[box-mode ([top-name string?] - [center-name string?] - [bottom-name string?])] -@defproc[(box-mode* [name string?]) box-mode?] -)]{ - -As a @tech{style property}, indicates that a @tech{nested flow} or -@tech{paragraph} is @deftech{boxable} when it is used in a -@deftech{boxing context} for Latex output, but a @tech{nested flow} is -@tech{boxable} only if its content is also @tech{boxable}. - -A @tech{boxing context} starts with a table cell in a multi-column -table, and the content of a @tech{block} in a @tech{boxing context} is -also in a @tech{boxing context}. If the cell's content is -@tech{boxable}, then the content determines the width of the cell, -otherwise a width is imposed. A @tech{paragraph} with a @racket[#f] -@tech{style name} is @tech{boxable} as a single line; the -@racket['wraps] @tech{style name} makes the paragraph -non-@tech{boxable} so that its width is imposed and its content can -use multiple lines. A @tech{table} is @tech{boxable} when that all of -its cell content is boxable. - -To generate output in box mode, the @racket[box-mode] property -supplies Latex macro names to apply to the @tech{nested flow} or -@tech{paragraph} content. The @racket[top-name] macro is used if the -box's top line is to be aligned with other boxes, @racket[center-name] -if the box's center is to be aligned, and @racket[bottom-name] if the -box's bottom line is to be aligned. The @racket[box-mode*] function -creates a @racket[box-mode] structure with the same name for all three -fields. - -A @racket[box-mode] @tech{style property} overrides any automatic -boxed rendering (e.g., for a @tech{paragraph} with @tech{style name} -@racket[#f]). If a @tech{block} has both a @racket[box-mode] -@tech{style property} and a @racket['multicommand] @tech{style -property}, then the Latex macro @racket[top-name], -@racket[center-name], or @racket[bottom-name] is applied with a -separate argument for each of its content.} - - -@defproc[(block? [v any/c]) boolean?]{ - -Returns @racket[#t] if @racket[v] is a @racket[paragraph], -@racket[table], @racket[itemization], @racket[nested-flow], -@racket[traverse-block], or @racket[delayed-block], @racket[#f] -otherwise.} - - -@defproc[(content? [v any/c]) boolean?]{ - -Returns @racket[#t] if @racket[v] is a string, symbol, -@racket[element], @racket[multiarg-element], -@racket[traverse-element], @racket[delayed-element], -@racket[part-relative-element], a convertible value in -the sense of @racket[convertible?], or list of @tech{content}. -Otherwise, it returns @racket[#f].} - - -@defstruct[style ([name (or/c string? symbol? #f)] - [properties list?])]{ - -Represents a @techlink{style}.} - - -@defthing[plain style?]{ - -A style @racket[(make-style #f null)].} - - -@defproc[(element-style? [v any/c]) boolean?]{ - -Returns @racket[#t] if @racket[v] is a string, symbol, @racket[#f], -or @racket[style] structure.} - - -@defproc[(tag? [v any/c]) boolean?]{ - -Returns @racket[#t] if @racket[v] is acceptable as a link -@techlink{tag}, which is a list containing a symbol and either a -string, a @racket[generated-tag] instance, or a non-empty list -of @racket[serializable?] values.} - - -@defstruct[generated-tag ()]{ - -A placeholder for a tag to be generated during the @techlink{collect - pass}. Use @racket[tag-key] to convert a tag containing a - @racket[generated-tag] instance to one containing a string. - -} - - -@defproc*[([(content->string (content content?)) string?] - [(content->string (content content?) (renderer any/c) (p part?) (info resolve-info?)) string?])]{ - -Converts @tech{content} to a single string (essentially -rendering the content as ``plain text''). - -If @racket[p] and @racket[info] arguments are not supplied, then a -pre-``collect'' substitute is obtained for @tech{delayed -elements}. Otherwise, the two arguments are used to force the -@tech{delayed element} (if it has not been forced already).} - -@defproc[(content-width [c content?]) exact-nonnegative-integer?]{ - -Returns the width in characters of the given @tech{content}. - -} - - -@defproc[(block-width (e block?)) exact-nonnegative-integer?]{ - -Returns the width in characters of the given @tech{block}.} - - -@defproc[(part-number-item? [v any/c]) boolean]{ - -Return @racket[#t] if @racket[v] is @racket[#f], an exact non-negative -integer, a string, or a list containing two strings. See @racket[part] -for information on how different representations are used for numbering. - -@history[#:added "6.4"]} - - -@deftogether[( -@defproc[(numberer? [v any/c]) boolean?] -@defproc[(make-numberer [step (any/c (listof part-number-item?) - . -> . - (values part-number-item? any/c))] - [initial-value any/c]) - numberer?] -@defproc[(numberer-step [n numberer?] - [parent-number (listof part-number-item?)] - [ci collect-info?] - [numberer-values hash?]) - (values part-number-item? hash?)] -)]{ - -A @deftech{numberer} implements a representation of a section number -that increment separately from the default numbering style and that -can be rendered differently than as Arabic numerals. - -The @racket[numberer?] function returns @racket[#t] if @racket[v] is a -@tech{numberer}, or @racket[#f] otherwise. - -The @racket[make-numberer] function creates a @tech{numberer}. The -@racket[step] function computes both the current number's -representation and increments the number, where the ``number'' can be -an arbitrary value; the @racket[initial-value] argument determines the -initial value of the ``number'', and the @racket[step] function -receives the current value as its first argument and returns an -incremented value as its second result. A numberer's ``number'' value -starts fresh at each new nesting level. In addition to the numberer's -current value, the @racket[step] function receives the parent -section's numbering (so that its result can depend on the part's -nesting depth). - -The @racket[numberer-step] function is normally used by a renderer. It -applies a @tech{numberer}, given the parent section's number, a -@racket[collect-info] value, and a hash table that accumulates -@tech{numberer} values at a given nesting layer. The -@racket[collect-info] argument is needed because a @tech{numberer}'s -identity is based on a @racket[generated-tag]. The result of -@racket[numberer-step] is the rendered form of the current section -number plus an updated hash table with an incremented value for the -@tech{numberer}. - -@history[#:added "6.4"]} - - -@defstruct[collect-info ([fp any/c] [ht any/c] [ext-ht any/c] - [ext-demand (tag? collect-info? . -> . any/c)] - [parts any/c] - [tags any/c] [gen-prefix any/c] - [relatives any/c] - [parents (listof part?)])]{ - -Encapsulates information accumulated (or being accumulated) from the -@techlink{collect pass}. The fields are exposed, but not currently -intended for external use, except that @racket[collect-info-parents] -is intended for external use. - -} - -@defstruct[resolve-info ([ci any/c] [delays any/c] [undef any/c] [searches any/c])]{ - -Encapsulates information accumulated (or being accumulated) from the -@techlink{resolve pass}. The fields are exposed, but not currently -intended for external use. - -} - -@defproc[(info-key? [v any/c]) boolean?]{ - -Returns @racket[#t] if @racket[v] is an @deftech{info key}: a list of -at least two elements whose first element is a symbol. The result is -@racket[#f] otherwise. - -For a list that is an info tag, the interpretation of the second -element of the list is effectively determined by the leading symbol, -which classifies the key. However, a @racket[#f] value as the second -element has an extra meaning: collected information mapped by such -info keys is not propagated out of the part where it is collected; -that is, the information is available within the part and its -sub-parts, but not in ancestor or sibling parts. - -Note that every @techlink{tag} is an info key. - -} - -@defproc[(collect-put! [ci collect-info?] [key info-key?] [val any/c]) - void?]{ - -Registers information in @racket[ci]. This procedure should be called -only during the @techlink{collect pass}. - -} - -@defproc[(resolve-get [p (or/c part? #f)] [ri resolve-info?] [key info-key?]) - any/c]{ - -Extract information during the @techlink{resolve pass} or -@techlink{render pass} for @racket[p] from @racket[ri], where the -information was previously registered during the @techlink{collect -pass}. See also @secref["passes"]. - -The result is @racket[#f] if the no value for the given key is found. -Furthermore, the search failure is recorded for potential consistency -reporting, such as when @exec{racket setup} is used to build -documentation. - -} - - -@defproc[(resolve-get/ext? [p (or/c part? #f)] [ri resolve-info?] [key info-key?]) - (values any/c boolean?)]{ - -Like @racket[render-get], but returns a second value to indicate -whether the resulting information originated from an external source -(i.e., a different document).} - - -@defproc[(resolve-get/ext-id [p (or/c part? #f)] [ri resolve-info?] [key info-key?]) - (values any/c (or/c boolean? string?))]{ - -Like @racket[render-get/ext?], but the second result can be a string -to indicate the source document's identification as established via -@racket[load-xref] and a @racket[#:doc-id] argument. - -@history[#:added "1.1"]} - - -@defproc[(resolve-search [dep-key any/c] [p (or/c part? #f)] [ri resolve-info?] [key info-key?]) - void?]{ - -Like @racket[resolve-get], but a shared @racket[dep-key] groups -multiple searches as a single request for the purposes of consistency -reporting and dependency tracking. That is, a single success for the -same @racket[dep-key] means that all of the failed attempts for the -same @racket[dep-key] have been satisfied. However, for dependency -checking, such as when using @exec{racket setup} to re-build -documentation, all attempts are recorded (in case external changes -mean that an earlier attempt would succeed next time). - -} - -@defproc[(resolve-get/tentative [p (or/c part? #f)] [ri resolve-info?] [key info-key?]) - any/c]{ - -Like @racket[resolve-search], but without dependency tracking. For -multi-document settings where dependencies are normally tracked, such -as when using @exec{racket setup} to build documentation, this function -is suitable for use only for information within a single document. - -} - -@defproc[(resolve-get-keys [p (or/c part? #f)] - [ri resolve-info?] - [pred (info-key? . -> . any/c)]) - list?]{ - -Applies @racket[pred] to each key mapped for @racket[p] in -@racket[ri], returning a list of all keys for which @racket[pred] -returns a true value. - -} - -@defproc[(part-collected-info [p part?] - [ri resolve-info?]) - collected-info?]{ - -Returns the information collected for @racket[p] as recorded within -@racket[ri]. - -} - -@defproc[(tag-key [t tag?] [ri resolve-info?]) tag?]{ - -Converts a @racket[generated-tag] value with @racket[t] to a string. - -} - - -@defproc[(traverse-block-block [b traverse-block?] - [i (or/c resolve-info? collect-info?)]) - block?]{ - -Produces the block that replaces @racket[b].} - - -@defproc[(traverse-element-content [e traverse-element?] - [i (or/c resolve-info? collect-info?)]) - content?]{ - -Produces the content that replaces @racket[e].} - - -@defthing[block-traverse-procedure/c contract?]{ - -Defined as - -@racketblock[ - (recursive-contract - ((symbol? any/c . -> . any/c) - (symbol? any/c . -> . any) - . -> . (or/c block-traverse-procedure/c - block?))) -]} - -@defthing[element-traverse-procedure/c contract?]{ - -Defined as - -@racketblock[ - (recursive-contract - ((symbol? any/c . -> . any/c) - (symbol? any/c . -> . any) - . -> . (or/c element-traverse-procedure/c - content?))) -]} - -@; ---------------------------------------- - -@section{HTML Style Properties} - -@defmodule[scribble/html-properties]{ The -@racket[scribble/html-properties] library provides datatypes used as -@tech{style properties} for HTML rendering.} - - -@defstruct[attributes ([assoc (listof (cons/c symbol? string?))])]{ - -Used as a @tech{style property} to add arbitrary attributes to an HTML -tag.} - - -@defstruct[alt-tag ([name (and/c string? #rx"^[a-zA-Z0-9]+$")])]{ - -Use as a @tech{style property} for an @racket[element], -@racket[paragraph], or @racket[compound-paragraph] to substitute an -alternate HTML tag (instead of @tt{}, @tt{

}, @tt{div}, -@|etc|).} - - -@defstruct[column-attributes ([assoc (listof (cons/c symbol? string?))])]{ - -Used as a @tech{style property} on a style with @racket[table-columns] -to add arbitrary attributes to an HTML @tt{col} tag within the table.} - - -@defstruct[url-anchor ([name string?])]{ - -Used as a @tech{style property} with @racket[element] to insert an -anchor before the element.} - - -@defstruct[hover-property ([text string?])]{ - -Used as a @tech{style property} with @racket[element] to add text that -is shown when the mouse hovers over the element.} - - -@defstruct[script-property ([type string?] - [script (or/c path-string? (listof string?))])]{ - -Used as a @tech{style property} with @racket[element] to supply a -script alternative to the element content.} - - -@defstruct[css-addition ([path (or/c path-string? - (cons/c 'collects (listof bytes?)) - url? - bytes?)])]{ - -Used as a @tech{style property} to supply a CSS file (if @racket[path] -is a path, string, or list), URL (if @racket[path] is a @racket[url]) or content (if @racket[path] is a byte -string) to be referenced or included in the generated HTML. This -property can be attached to any style, and all additions are collected -to the top of the generated HTML page. - -The @racket[path] field can be a result of -@racket[path->main-collects-relative].} - -@defstruct[css-style-addition ([path (or/c path-string? - (cons/c 'collects (listof bytes?)) - url? - bytes?)])]{ - -Like @racket[css-addition], but added after any style files that are -specified by a document and before any style files that are provided -externally.} - - -@defstruct[js-addition ([path (or/c path-string? - (cons/c 'collects (listof bytes?)) - url? - bytes?)])]{ - -Like @racket[css-addition], but for a JavaScript file instead of a CSS file.} - - -@defstruct[js-style-addition ([path (or/c path-string? - (cons/c 'collects (listof bytes?)) - url? - bytes?)])]{ - -Like @racket[css-style-addition], but for a JavaScript file instead of a CSS file.} - - -@defstruct[body-id ([value string?])]{ - -Used as a @tech{style property} to associate an @tt{id} attribute with -an HTML tag.} - - -@defstruct[document-source ([module-path module-path?])]{ - -Used as a @tech{style property} to associate a module path with a -part. Clicking on a section title within the part may show -@racket[module-path] with the part's tag string, so that authors of -other documents can link to the section. - -More specifically, the section title is given the HTML attributes -@tt{x-source-module} and @tt{x-part-tag}, plus @tt{x-part-prefixes} -if the section or enclosing sections declare tag prefixes, and -@tt{x-source-pkg} if the source is found within a package at document-build time. The -@racketmodname[scribble/manual] style recognizes those tags to make -clicking a title show cross-reference information. - -@history[#:added "1.2" - #:changed "1.7" @elem{Added @tt{x-part-prefixes}.} - #:changed "1.9" @elem{Added @tt{x-source-pkg}.}]} - - -@defstruct[html-defaults ([prefix (or/c bytes? path-string? - (cons/c 'collects (listof bytes?)))] - [style (or/c bytes? path-string? - (cons/c 'collects (listof bytes?)))] - [extra-files (listof (or/c path-string? - (cons/c 'collects (listof bytes?))))])]{ - -Like @racket[latex-defaults], but use for the -@exec{scribble} command-line tool's @DFlag{html} and -@DFlag{htmls} modes.} - - -@defstruct[head-extra ([xexpr xexpr/c])]{ - -For a @racket[part] that corresponds to an HTML page, adds content to -the @tt{} tag.} - - -@defstruct[render-convertible-as ([types (listof (or/c 'png-bytes 'svg-bytes))])]{ - For a @racket[part] that corresponds to an HTML page, - controls how objects that subscribe to the @racketmodname[file/convertible] - protocol are rendered. - - The alternatives in the @racket[types] field are tried in order - and the first one that succeeds is used in the html output. -} - -@defstruct[part-link-redirect ([url url?])]{ - -As a @tech{style property} on a @tech{part}, causes hyperiinks to the -part to be redirected to @racket[url] instead of the rendered part.} - -@defstruct[link-resource ([path path-string?])]{ - -As a @tech{style property} on an @racket[element], causes the elements -to be rendered as a hyperlink to (a copy of) @racket[path]. - -The file indicated by @racket[path] is referenced in place when -@racket[render<%>] is instantiated with -@racketidfont{refer-to-existing-files} as true. Otherwise, it is -copied to the destination directory and potentially renamed to avoid -conflicts.} - - -@defstruct[install-resource ([path path-string?])]{ - -Like @racket[link-resource], but makes @racket[path] accessible in the -destination without rendering a hyperlink. - -This @tech{style property} is useful only when @racket[render<%>] is -instantiated with @racketidfont{refer-to-existing-files} as -@racket[#f], and only when @racket[path] does not match then name of -any other file that is copied by the renderer to the destination.} - -@; ---------------------------------------- - -@section{Latex Style Properties} - -@defmodule[scribble/latex-properties]{ The -@racket[scribble/latex-properties] library provides datatypes used as -@tech{style properties} for Latex rendering.} - - -@defstruct[tex-addition ([path (or/c path-string? - (cons/c 'collects (listof bytes?)) - bytes?)])]{ - -Used as a @tech{style property} to supply a @filepath{.tex} file (if -@racket[path] is a path, string, or list) or content (if @racket[path] -is a byte string) to be included in the generated Latex. This property -can be attached to any style, and all additions are collected to the -top of the generated Latex file. - -The @racket[path] field can be a result of -@racket[path->main-collects-relative].} - - -@defstruct[latex-defaults ([prefix (or/c bytes? path-string? - (cons/c 'collects (listof bytes?)))] - [style (or/c bytes? path-string? - (cons/c 'collects (listof bytes?)))] - [extra-files (listof (or/c path-string? - (cons/c 'collects (listof bytes?))))])]{ - -Used as a @tech{style property} on the main @racket[part] of a document -to set a default prefix file, style file, and extra files (see -@secref["config-style"]). The defaults are used by the -@exec{scribble} command-line tool for @DFlag{latex} or @DFlag{pdf} -mode if none are supplied via @DFlag{prefix} and @DFlag{style} (where -@racket[extra-files] are used only when @racket[prefix] is used). A -byte-string value is used directly like file content, and a path can -be a result of @racket[path->main-collects-relative]. - -Languages (used with @hash-lang[]) like -@racketmodname[scribble/manual] and @racketmodname[scribble/sigplan] -add this property to a document to specify appropriate files for Latex -rendering. - -See also @racketmodname[scribble/latex-prefix].} - -@defstruct[(latex-defaults+replacements latex-defaults) - ([replacements (hash/c string? (or/c bytes? path-string? - (cons/c 'collects (listof bytes?))))])]{ - Like @racket[latex-defaults] but it allows for more configuration. For example if - the @racket[replacements] maps @racket["scribble-load-replace.tex"] to @racket["my-scribble.tex"], - then the @racket["my-scribble.tex"] file in the current directory will we used in place - of the standard scribble package inclusion header. -} - - -@defstruct[command-extras ([arguments (listof string?)])]{ - -Used as a @tech{style property} on an @racket[element] to add extra -arguments to the element's command in Latex output.} diff --git a/scribble-doc/scribblings/scribble/decode.scrbl b/scribble-doc/scribblings/scribble/decode.scrbl deleted file mode 100644 index 3ce70c5a..00000000 --- a/scribble-doc/scribblings/scribble/decode.scrbl +++ /dev/null @@ -1,228 +0,0 @@ -#lang scribble/doc -@(require scribble/manual "utils.rkt") - -@title[#:tag "decode"]{Decoding Text} - -@defmodule[scribble/decode]{The @racketmodname[scribble/decode] -library helps you write document content in a natural way---more like -plain text, except for @litchar["@"] escapes. Roughly, it processes a -stream of strings to produces instances of the -@racketmodname[scribble/struct] datatypes (see @secref["struct"]).} - -At the @tech{flow} level, decoding recognizes a blank line as a -@tech{paragraph} separator. Blocks and paragraphs without blank lines -in between are collected into a @tech{compound paragraph}. - -@elemtag['(decode "rules")]{At} the @tech{content} level, decoding -makes just a few special text conversions: - -@itemize[ - - @item{@litchar{---}: converted to @racket['mdash]} - - @item{@litchar{--}: converted to @racket['ndash]} - - @item{@litchar{``}: converted to @racket['ldquo], which is fancy open quotes: ``} - - @item{@litchar{''}: converted to @racket['rdquo], which is fancy closing quotes: ''} - - @item{@litchar{'}: converted to @racket['rsquo], which is a fancy apostrophe: '} - - @item{@litchar{`}: converted to @racket['lsquo], which is a fancy quote: `} - -] - -Some functions @deftech{decode} a sequence of @racket[_pre-flow] or -@racket[_pre-content] arguments using @racket[decode-flow] or -@racket[decode-content], respectively. For example, the @racket[bold] -function accepts any number of @racket[_pre-content] arguments, so -that in - -@verbatim[#:indent 2]|{@bold{``apple''}}| - -the @litchar{``apple''} argument is decoded to use fancy quotes, and -then it is bolded. - - -@defproc[(pre-content? [v any/c]) boolean?]{ - -Returns @racket[#t] if @racket[v] is a @deftech{pre-content} value: a -string or other non-list @tech{content}, a list of @tech{pre-content} values, or a @racket[splice] -containing a list of @tech{pre-content} values; otherwise returns -@racket[#f]. - -Pre-content is decoded into @tech{content} by functions like -@racket[decode-content] and @racket[decode-paragraph].} - - -@defproc[(pre-flow? [v any/c]) boolean?]{ - -Returns @racket[#t] if @racket[v] is a @deftech{pre-flow} value: a -string or other non-list @tech{content}, a @racket[block], -@|void-const|, a list of @tech{pre-flow} values, or a @racket[splice] containing a list of -@tech{pre-flow} values; otherwise returns @racket[#f]. - -Pre-flow is decoded into a @tech{flow} (i.e., a list of @tech{blocks}) -by functions like @racket[decode-flow].} - - -@defproc[(pre-part? [v any/c]) boolean?]{ - -Returns @racket[#t] if @racket[v] is a @deftech{pre-part} value: a -string or other non-list @tech{content}, a @tech{block}, a -@racket[part], a @racket[title-decl], a @racket[part-start], a -@racket[part-index-decl], a @racket[part-collect-decl], a -@racket[part-tag-decl], @|void-const|, a list of @tech{pre-part} values, or a @racket[splice] containing -a list of @tech{pre-part} values; otherwise returns @racket[#f]. - -A pre-part sequence is decoded into a @racket[part] by functions like -@racket[decode] and @racket[decode-part].} - - -@defproc[(decode [lst (listof pre-part?)]) part?]{ - -Decodes a document, producing a part. In @racket[lst], lists and instances of -@racket[splice] are inlined into the list, and @|void-const|s are dropped. An instance of -@racket[title-decl] supplies the title for the part, plus tag, style -and version information. Instances of @racket[part-index-decl] (that -precede any sub-part) add index entries that point to the -section. Instances of @racket[part-collect-decl] add elements to the -part that are used only during the @techlink{collect pass}. Instances -of @racket[part-tag-decl] add hyperlink tags to the section -title. Instances of @racket[part-start] at level 0 trigger sub-part -parsing. Instances of @racket[section] trigger are used as-is as -subsections, and instances of @racket[paragraph] and other -flow-element datatypes are used as-is in the enclosing flow. - -Portions of @racket[lst] are within a part are decoded using -@racket[decode-flow].} - - -@defproc[(decode-part [lst (listof pre-part?)] - [tags (listof string?)] - [title (or/c #f list?)] - [depth exact-nonnegative-integer?]) - part?]{ - -Like @racket[decode], but given a list of tag string for the part, a -title (if @racket[#f], then a @racket[title-decl] instance is used if -found), and a depth for @racket[part-start]s to trigger sub-part -parsing. - -} - -@defproc[(decode-flow [lst (listof pre-flow?)]) (listof block?)]{ - -Decodes a flow. In @racket[lst], lists and instances of -@racket[splice] are inlined into the list. A sequence of two or more -newlines separated only by whitespace is parsed as a -compound-paragraph separator. - -Portions of @racket[lst] are within a compound paragraph are decoded using -@racket[decode-compound-paragraph].} - - -@defproc[(decode-compound-paragraph [lst (listof pre-flow?)]) block?]{ - -Decodes a compound paragraph. In @racket[lst], lists and instances of -@racket[splice] are inlined into the list. Instances of -@racket[paragraph] and other @tech{block} datatypes are used as-is in -the result. If the compound paragraph contains a single block, the -block is returned without a @racket[compound-paragraph] wrapper. - -Portions of @racket[lst] that are separated by @tech{block}s are -decoded using @racket[decode-content].} - - -@defproc[(decode-paragraph [lst (listof pre-content?)]) paragraph?]{ - -Decodes a paragraph using @racket[decode-content] to decode -@racket[lst] as the paragraph's content.} - - -@defproc[(decode-content [lst (listof pre-content?)]) list?]{ - -Decodes @tech{content}. Elements at the start of the list that are -whitespace (according to @racket[whitespace?]) are dropped. -@margin-note*{Dropping whitespace in nested lists and splices was a poor -implementation choice that is left in place for compatibility. To protect -against it, you can exploit the similarly unfortunate fact that an empty -list does not count as whitespace.} -Lists and splices in @racket[lst] are -flattened into the list, similarly dropping leading whitespace. -Plain strings are @elemref['(decode -"rules")]{decoded}; non-string, non-list @tech{content} is included in -the result as-is.} - - -@defproc[(decode-elements [lst (listof pre-content?)]) list?]{ - -An alias for @racket[decode-content].} - - -@defproc[(decode-string [s string?]) (listof content?)]{ - -@elemref['(decode "rules")]{Decodes} a single string to produce -@tech{content}.} - - -@defproc[(whitespace? [v any/c]) boolean?]{ - -Returns @racket[#t] if @racket[v] is a string that contains only whitespace, @racket[#f] -otherwise.} - - -@defstruct[title-decl ([tag-prefix (or/c #f string?)] - [tags (listof string?)] - [version (or/c string? #f)] - [style style?] - [content content?])]{ - -See @racket[decode] and @racket[decode-part]. The @racket[tag-prefix] -and @racketidfont{style} fields are propagated to the resulting -@racket[part]. If the @racketidfont{version} field is not @racket[#f], -it is propagated as a @racket[document-version] style property on the -@racket[part].} - - -@defstruct[part-start ([depth integer?] - [tag-prefix (or/c #f string?)] - [tags (listof string?)] - [style style?] - [title content?])]{ - -Like @racket[title-decl], but for a sub-part. See @racket[decode] and -@racket[decode-part].} - - -@defstruct[part-index-decl ([plain-seq (listof string?)] - [entry-seq list?])]{ - -See @racket[decode]. The two fields are as for @racket[index-element].} - - -@defstruct[part-collect-decl ([element (or/c element? part-relative-element?)])]{ - -See @racket[decode].} - - -@defstruct[part-tag-decl ([tag tag?])]{ - -See @racket[decode].} - - -@defstruct[splice ([run list?])]{ - -See @racket[decode], @racket[decode-part], and @racket[decode-flow].} - - -@defproc[(spliceof [ctc flat-contract?]) flat-contract?]{ - -Produces a contract for a @racket[splice] instance whose -@racketidfont{run} elements satisfy @racket[ctc].} - - -@defproc[(clean-up-index-string [str string?]) string?]{ - -Trims leading and trailing whitespace, and converts non-empty -sequences of whitespace to a single space character.} diff --git a/scribble-doc/scribblings/scribble/demo-class.scrbl b/scribble-doc/scribblings/scribble/demo-class.scrbl deleted file mode 100644 index 3b81e0eb..00000000 --- a/scribble-doc/scribblings/scribble/demo-class.scrbl +++ /dev/null @@ -1,23 +0,0 @@ -#lang scribble/base -@(require scribble/manual - (for-label racket/base - racket/class - racket/contract/base - racket/draw)) - -@(define css tt) - -@defclass/title[#:link-target? #f bitmap-dc% object% (dc<%>)]{ - -In multi-page mode, this class definition gets its own page, and -there's an ``inherited methods'' table in the margin. The table has -style class @css{inherited}, and the words ``inherited methods:'' and -``from'' have style class @css{inheritedlbl}. - -@defmethod[#:link-target? #f (set-bitmap [bm any/c]) any]{ - -A method example; nothing new here, but note how the defined -identifier is not at the start of the box.} - -} - diff --git a/scribble-doc/scribblings/scribble/demo-m1.scrbl b/scribble-doc/scribblings/scribble/demo-m1.scrbl deleted file mode 100644 index 55489af3..00000000 --- a/scribble-doc/scribblings/scribble/demo-m1.scrbl +++ /dev/null @@ -1,10 +0,0 @@ -#lang racket/base -(require "demo.scrbl" - scribble/core) - -(define renamed-doc - (struct-copy part doc - [title-content - (cons "M1 " (part-title-content doc))])) - -(provide (rename-out [renamed-doc doc])) diff --git a/scribble-doc/scribblings/scribble/demo-m2.scrbl b/scribble-doc/scribblings/scribble/demo-m2.scrbl deleted file mode 100644 index 90587193..00000000 --- a/scribble-doc/scribblings/scribble/demo-m2.scrbl +++ /dev/null @@ -1,12 +0,0 @@ -#lang racket/base -(require "demo.scrbl" - scribble/core - scribble/manual) - -(define renamed-doc - (struct-copy part doc - [style manual-doc-style] - [title-content - (cons "M2 " (part-title-content doc))])) - -(provide (rename-out [renamed-doc doc])) diff --git a/scribble-doc/scribblings/scribble/demo-manual-m1.scrbl b/scribble-doc/scribblings/scribble/demo-manual-m1.scrbl deleted file mode 100644 index 05e1bf1f..00000000 --- a/scribble-doc/scribblings/scribble/demo-manual-m1.scrbl +++ /dev/null @@ -1,10 +0,0 @@ -#lang racket/base -(require "demo-manual.scrbl" - scribble/core) - -(define renamed-doc - (struct-copy part doc - [title-content - (cons "M1 " (part-title-content doc))])) - -(provide (rename-out [renamed-doc doc])) diff --git a/scribble-doc/scribblings/scribble/demo-manual-m2.scrbl b/scribble-doc/scribblings/scribble/demo-manual-m2.scrbl deleted file mode 100644 index e10ae1ce..00000000 --- a/scribble-doc/scribblings/scribble/demo-manual-m2.scrbl +++ /dev/null @@ -1,12 +0,0 @@ -#lang racket/base -(require "demo-manual.scrbl" - scribble/core - scribble/manual) - -(define renamed-doc - (struct-copy part doc - [style manual-doc-style] - [title-content - (cons "M2 " (part-title-content doc))])) - -(provide (rename-out [renamed-doc doc])) diff --git a/scribble-doc/scribblings/scribble/demo-manual-s1.scrbl b/scribble-doc/scribblings/scribble/demo-manual-s1.scrbl deleted file mode 100644 index a2e2d22f..00000000 --- a/scribble-doc/scribblings/scribble/demo-manual-s1.scrbl +++ /dev/null @@ -1,10 +0,0 @@ -#lang racket/base -(require "demo-manual.scrbl" - scribble/core) - -(define renamed-doc - (struct-copy part doc - [title-content - (cons "S1 " (part-title-content doc))])) - -(provide (rename-out [renamed-doc doc])) diff --git a/scribble-doc/scribblings/scribble/demo-manual-s2.scrbl b/scribble-doc/scribblings/scribble/demo-manual-s2.scrbl deleted file mode 100644 index aa3e84a0..00000000 --- a/scribble-doc/scribblings/scribble/demo-manual-s2.scrbl +++ /dev/null @@ -1,12 +0,0 @@ -#lang racket/base -(require "demo-manual.scrbl" - scribble/core - scribble/manual) - -(define renamed-doc - (struct-copy part doc - [style manual-doc-style] - [title-content - (cons "S2 " (part-title-content doc))])) - -(provide (rename-out [renamed-doc doc])) diff --git a/scribble-doc/scribblings/scribble/demo-manual.scrbl b/scribble-doc/scribblings/scribble/demo-manual.scrbl deleted file mode 100644 index b3161d8c..00000000 --- a/scribble-doc/scribblings/scribble/demo-manual.scrbl +++ /dev/null @@ -1,203 +0,0 @@ -#lang scribble/base -@(require scribble/manual - scribble/eval - (for-syntax racket/base) - (for-label racket/base - racket/contract/base - scribble/manual)) - -@(define css tt) - -@(define-syntax (opt-example stx) - ;; A #\? 'paren-shape value triggers RktOpt: - #`@racket[#,(syntax-property #'(in-example) 'paren-shape '#\?)]) - -@title{Manual All-Styles Document} - -@table-of-contents[] - -@section{Code Styles} - -@itemlist[ - - @item{@css{RktSym} (identifier without @racket[for-label] binding): - @racket[unbound] or @racketidfont{example}} - - @item{@css{RktValLink} (link to variable form): @racket[cons]} - - @item{@css{RktValDef} (definition of variable, normally combined with @css{RktValLink}): - @racket[list] in - - @defproc[#:link-target? #f (list) any/c] - @defthing[#:link-target? #f list any/c]} - - @item{@css{RktStxLink} (link to syntactic form): @racket[lambda]} - - @item{@css{RktStxDef} (definition of syntactic form, normally combined with @css{RktStxLink}): - @racket[lambda] in - - @defform[#:link-target? #f (lambda ...)]} - - @item{@css{RktSymDef} (definition without binding, normally a mistake, combined with @css{RktSym}): - @racket[unbound-identifier] in - - @defform[#:link-target? #f (unbound-identifier)]} - - @item{@css{RktVar} (local variable or meta-variable): @racket[_variable] or @racketvarfont{example}} - - @item{@css{RktRes} (REPL result): @racketresult['(1 2 3)] or @racketresultfont{example}} - - @item{@css{RktOut} (as written to the current output port): @racketoutput{example}} - - @item{@css{RktErr} (errors): @racketerror{example} or the error message in - - @interaction[(eval:error (+ 1 'a))]} - - @item{@css{RktCmt} (comments): @racketcommentfont{example} or - - @racketblock[(code:comment "comment")]} - - @item{@css{RktVal} (values): @racket['(1 2 3)] or @racketvalfont{example}} - - @item{@css{highlighted} (highlight via background): @racket[(not-this (code:hilite example) nor-this)]} - - @item{@css{RktIn} on a @css{RktInBG}: @litchar{example}} - - @item{@css{RktPn} (parentheses, etc.): @racket[([{}])] or @racketparenfont{example}} - - @item{@css{RktRdr} (reader shorthands): non-parentheses in @racket[(#`() ,@())]} - - @item{@css{RktMeta} (the @racket[unquote] comma): - @racket[,1] or @racketmetafont{example} or ``#reader'' below. - - @defmodule[@schemeidfont{module} #:module-paths (racket/base) #:reader #:no-declare #:link-target? #f]} - - @item{@css{RktMod} (module name; normally @css{RktModLink} instead): @racketmodfont{example}} - - @item{@css{RktModLink} (a linked module reference): @racketmodname[racket/base]} - - @item{@css{RktOpt} (option-argument brackets): brackets in @opt-example[]} - - @item{@css{RktKw} (not normally used): @racketkeywordfont{example}} - -] - -The @css{RktBlk} style class is used for a table of multiple lines (more -than 1) of Racket code: - -@racketblock[ - (define x (+ 1 2)) - (+ x 3) -] - -@section{Definition Blocks} - -@defmodule[racket/base #:link-target? #f] - -The module-declaration box above is in a @css{defmodule} table. The -package-specification part is in an @css{RpackageSpec} wrapper. - -The definitions below are marked so that they are not link targets. If -they were link targets, the table-of-contents panel on the left would -have entries for them. - -@defproc[#:link-target? #f (cons [really-long-name-for-the-first-argument - any/c] - [really-long-name-for-the-second-argument - (or/c any/c - any/c)]) - pair?]{ - -This definition box starts with a @css{SVInsetFlow} wrapper, which is a -@racketmodname[scribble/base] style class for the -@racket['vertical-inset] style name on a block; it should give the -block suitable vertical space before and after. - -The next layer is a @css{boxed} plus @css{RBoxed} table. The @css{boxed} -style class is from @racketmodname[scribble/base] and the -@racket['boxed] style name on a table. The @css{RBoxed} style class is -from the @racket[scribble/manual] layer. Both @css{boxed} and @css{RBoxed} -are used for all definition boxes by @racket[scribble/manual] forms. - -The initial content of the table includes a @css{SubFlow} (a -@racket[scribble/base] style class for non-indented flow) to combine -blocks for the background label with the first line of the table. The -background label ``procedure'' has an @css{RBackgroundLabel} outer -wrapper, which makes the label float right. (The wrapper also has the -@css{SIEHidden} style class, which built-in for all Scribble HTML output -and makes the label hidden on Internet Explorer 6 and earlier.) The -background label has an @css{RBackgroundLabelInner} inner wrapper, which -makes the label suitably faint. The content part of the first line is -wrapped in @css{RForeground}, which ensures that it is in front of the -background label. - -In a procedure definition box: - -@itemlist[ - - @item{When the initial ``prototype'' call in the definition box spans - multiple lines, the table that contains the call has the - @css{prototype} style class in addition to @css{RForeground}.} - - @item{When the contract or default value for an argument spans - multiple lines, then the contract, the ``='' for a value (if - any), and value (if any) are wrapped in an table with the - @css{argcontract} style class.} - -] - -Finally, the definition box and all of the associated explanation text -are wrapped in @css{SIntrapara} blocks and grouped into a single -@tt{

}.} - -@defform[#:link-target? #f - (lambda ...) - #:grammar ([example good - bad])] - -When a syntactic-from specification has a grammar, the grammar is in a -table with the @css{specgrammar} style class. - -Since no explanation flow is attached to the above @racket[defform] use, -there's no @css{SIntrapara} block around the table (just a @tt{

}). - -@deftogether[( -@defproc[#:link-target? #f (cons [a any/c] [d any/c]) pair?] -@defform[#:link-target? #f (lambda ...)] -)]{ - -Putting definitions together with @racket[deftogether] converts the -@css{RBoxed} and @css{boxed} tables that would be generated for the -individual definitions into tables with the @css{together} style -class. The tables are then combined as rows in a new table with the -@css{RBoxed} and @css{boxed} style classes.} - -A @racket[defsubform], @racket[specsubform], etc., such as - -@specsubform[(lambda ...)] - -is indented though a wrapper with a @css{leftindent} style class. - -@include-section["demo-class.scrbl"] - -@section{Miscellaneous} - -In @racket[filebox] rendering, - -@(filebox "example.rkt" "This is a file box") - -a @css{Rfilebox} wrapper surrounds the file name in a @css{Rfiletitle} -outer wrapper and an @css{Rfilename} inner wrapper, plus the file -content in an @css{Rfilecontent} wrapper. - -@inset-flow{The @racket[inset-flow] form generates a -@racket[nested-flow] with style class @css{insetpara}.} - -@history[#:changed "1.0" @elem{History paragraphs have the @css{SHistory} style class.}] - -@section{Bibliography} - -The bibliography table for the citation @cite["Example"] as the -@css{RBibliography} style class. - -@bibliography[(bib-entry #:key "Example" #:title "Example bibliography entry")] diff --git a/scribble-doc/scribblings/scribble/demo-s1.scrbl b/scribble-doc/scribblings/scribble/demo-s1.scrbl deleted file mode 100644 index b49c8dc9..00000000 --- a/scribble-doc/scribblings/scribble/demo-s1.scrbl +++ /dev/null @@ -1,10 +0,0 @@ -#lang racket/base -(require "demo.scrbl" - scribble/core) - -(define renamed-doc - (struct-copy part doc - [title-content - (cons "S1 " (part-title-content doc))])) - -(provide (rename-out [renamed-doc doc])) diff --git a/scribble-doc/scribblings/scribble/demo-s2.scrbl b/scribble-doc/scribblings/scribble/demo-s2.scrbl deleted file mode 100644 index 0e1afce3..00000000 --- a/scribble-doc/scribblings/scribble/demo-s2.scrbl +++ /dev/null @@ -1,12 +0,0 @@ -#lang racket/base -(require "demo.scrbl" - scribble/core - scribble/manual) - -(define renamed-doc - (struct-copy part doc - [style manual-doc-style] - [title-content - (cons "S2 " (part-title-content doc))])) - -(provide (rename-out [renamed-doc doc])) diff --git a/scribble-doc/scribblings/scribble/demo.scrbl b/scribble-doc/scribblings/scribble/demo.scrbl deleted file mode 100644 index 037ea0e5..00000000 --- a/scribble-doc/scribblings/scribble/demo.scrbl +++ /dev/null @@ -1,324 +0,0 @@ -#lang scribble/base -@(require scribble/core - scribble/manual) - -@title[#:tag "top" #:version "1.0" #:style 'toc-hidden]{All-Styles Document, Title in ``H2''} - -@author["Jack" "Jill"] - -All of this content is within ``maincolumn'', then ``main''. - -@"\U2192" The version on the top left of this page is in -``versionbox'' and then either span ``versionNoNav'' (no navigation -bar, as for single-page rendering) or ``version'' (with navigation -bar, as for multi-page rendering). - -@"\U2192" The author on the top left of this page is in -``SAuthorListBox'', then ``SAuthorList'', and then a span ``author'', -where @tt{
} separates multiple authors. - -@"\U2190" The table-of-contents panels are both in a table ``tocset'': - -@margin-note{This note is in ``refpara'', then ``refcolumn'', then - ``refcontent''.} - -@itemlist[ - - @item{The top panel is in ``tocview''. - - The top panel can have multiple layers of the hierarchy. For a - single-page rendering, only one layer is present. For an - example of multiple layers when rendering this document to - multiple pages, go to @secref["deepest"]. - - Each layer is in a ``tocviewlist'' that also has the class - ``tocviewlisttopspace'' in the case of the first layer. The - always-visible name of a layer is in a span ``tocviewtoggle'', - but that span is also in a ``tocviewtitle'' in the case of the - first layer. Each item under the title is in a - ``tocviewsublist'' or a variant: ``tocviewsublistonly'' if only - a single item is present, ``tocviewsublistfirst'' for the first - item of multi, ``tocviewsublistlast'' for the last item of - multiple. Then, each item is in a span ``tocviewlink''. - - Each section link in the panel is a span ``tocviewlink'' or a - span ``tocviewselflink'' if the link corresponds to the current - page or on the path to the current page.} - - @item{A bottom panel is visible here only for a single-page - rendering. See its description in @secref["h3"].} - -] - - -@margin-note[#:left? #t]{This note is in ``refparaleft'', then - ``refcolumnleft'', then ``refcontent''.} - -Table of contents uses ``toptoclink'' for the top layer, and -``toclink'' for nested levels: - -@table-of-contents[] - -@margin-note*{This note is in ``refelem'', then ``refcolumn'', then - ``refcontent''.} -@margin-note*[#:left? #t]{This note is in ``refelemleft'', then - ``refcolumnleft'', then ``refcontent''.} - -@; ====================================================================== -@section[#:tag "h3"]{Section in ``H3''} - -@"\U2190" For either single-page or multi-page rendering, the -table-of-contents column here has two panels. The top panel is -described in the @seclink["h3"]{starting prose}. For the bottom panel: - -@itemlist[ - - @item{The bottom panel is in a ``tocsub''. For a multi-page - rendering, the on-this-page title is in ``tocsubtitle''. The - rest is always in a table ``tocsublist''. For each entry, the - number part is in a span ``tocsublinknumber'', and the title - part in a span, one of the following: ``tocsubseclink'' if the - link represents a (sub)section, ``tocnonseclink'' if the link is - not a (sub)section but there are (sub)sections in the list (and - there is an example target in this section), or ``tocsublink'' - if no links represent a (sub)section (see - @secref["all-non-sec"]).} - -] - -When a part that corresponds to a page has a @racket['no-toc] style, -the top panel of the table-of-contents column is missing and the -bottom panel is in a ``tocview'' instead of ``tocsub''. See -@secref["no-toc"]. - -Here is the target for the -@toc-target-element[#f @elem{``tocnonseclink''} `(demo (prefixable "non-sec"))] -link. - -@subsection[#:style 'toc]{Subsection in ``H4''} - -@local-table-of-contents[] - -@subsubsection[#:tag "deepest"]{Subsubsection in ``H5''} - -@"\U2190" This page has no on-this-page panel in a multi-page -rendering, because there are no numbered subsections, but it has three -levels shown in the table-of-contents panel. - -@subsubsub*section{``SSubSubSubSection''} - - -@subsection{Second Subsection in ``H4''} - - -@; ====================================================================== -@section[#:tag "no-toc" #:style 'no-toc]{Suppressed ToC Panel} - -In multi-page rendering, this page has no gobal table-of-contents -panel, because it is suppressed with @racket['no-toc]. - -@subsection{Subsection} - -@subsection{Another Subsection} - - -@; ====================================================================== -@section[#:tag "all-non-sec"]{Non-Section On-This-Page Links} - -This section has only non-section targets in the on-this-page -panel of a multi-page rendering. -Here is the target for the -@toc-target-element[#f @elem{``tocsublink'' 1} `(demo (prefixable "non-sec 1"))] -link. -Here is the target for the -@toc-target-element[#f @elem{``tocsublink'' 2} `(demo (prefixable "non-sec 2"))] -link. - -Here is the target for the @as-index{``indexlink''} link in the -@seclink["doc-index"]{index} (where ``indexlink'' is used for the -index entry and not here). - -@; ====================================================================== -@section{Element Styles} - -Some spans: - -@itemlist[ - - @item{@tt{``stt''}} - - @item{@elem[#:style 'roman]{``sroman''}} - - @item{@elem[#:style "slant"]{``slant''}} - - @item{@elem[#:style 'sf]{``ssanserif''}} - - @item{@smaller{``Smaller''}} - - @item{@larger{``Larger''}} - - @item{``hspace'' is used for forced @hspace[3] space} - - @item{``url'' is used for URLs: @url{http://racket-lang.org}} - - @item{@elem[#:style 'no-break]{``nobreak'', which is used to prevent - line breaks anywhere in the element so that the element may run too - far right}} - - @item{@italic{italic} directly sets @tt{font-style} to @tt{italic}} - - @item{@bold{bold} directly sets @tt{font-weight} to @tt{bold}} - - @item{@elem[#:style 'superscript]{superscript} directly sets - @tt{vertical-align} to @tt{super} and @tt{font-size} to @tt{80%}.} - - @item{@elem[#:style 'subscript]{subscript} directly sets - @tt{vertical-align} to @tt{sub} and @tt{font-size} to @tt{80%}.} - -] - -Link spans: - -@itemlist[ - - @item{@elemref[#:underline? #f '(prefixable "plain-target")]{``plainlink''} - hyperlink to @elemtag['(prefixable "plain-target")]{here}} - - @item{@deftech{technical term} definitions are simply italicized by default} - - @item{@tech{technical term} references are in ``techoutside'', then ``techinside''} - -] - -@; ====================================================================== -@section{Block Styles} - -@nested{This paragraph is in a ``SubFlow'' @tt{

}.} - -@nested[#:style 'inset]{This paragraph is in a plain @tt{
}.} - -@nested[#:style 'code-inset]{This paragraph is in a ``SCodeFlow'' -@tt{
}.} - -@nested[#:style 'vertical-inset]{This paragraph is in a -``SVInsetFlow'' @tt{
}. This style is useful when space is -not normally included between blocks.} - -@centered{This paragraph is in a ``SCentered'' @tt{
}.} - -@tabular[#:style 'boxed (list (list @t{A ``boxed'' table.}))] - -@; ====================================================================== -@section{Enumerations} - -This one is unordered, so it uses @tt{
    }: - -@itemlist[ - - @item{six} - - @item{half-dozen} - -] - -This one is ordered, so it uses @tt{
      }: - -@itemlist[#:style 'ordered - - @item{First} - - @item{Second - - @itemlist[#:style 'ordered - - @item{Second, first half} - - @item{Second, second half - - @itemlist[#:style 'ordered - - @item{First half of that} - - @item{Second half of that - - @itemlist[#:style 'ordered - - @item{Thin-slice start} - - @item{Thin-sliced end} - - ]} - ]} - - ]} - - @item{Third} -] - -This one is ``compact'': - -@itemlist[ #:style 'compact - - @item{six} - - @item{half-dozen} - -] - -This paragraph follows the enumeration above. - -@; ====================================================================== -@section{Paragraph Spacing} - -This sentence is a paragraph all by itself. - -@t{This sentence is a paragraph.} -@t{This sentence is also a paragraph, but it is connected to the - previous paragraph as a compound paragraph by virtue of having no - paragraph-breaking space before it, and each paragraph is in a - ``SIntraPara'' @tt{
      } instead of a @tt{

      }.} - -This sentence is a paragraph, as is each of A1, B1, A2, B2, A3, B3a, -and B2a in the following table, but B3a and B2a form a compound paragraph. -@; -@tabular[(list (list "A1" - "B1") - (list "A2" - "B2") - (list "A3" - @compound-paragraph[plain (list @t{B3a} @t{B3b})]))] -@; -This sentence is a paragraph, and with the preceding table and - paragraph forms a compound paragraph. - -@nested{ - @t{This is a first paragraph in a @tt{

      }.} - @t{This is a second paragraph in a @tt{
      }.} -} - - -@; ====================================================================== -@section{Navigation Bars} - -For multi-page rendering, this page will have a navigation bar at the -top and bottom. The bars are within ``maincolumn'' and ``main''. - -The tap bar is in ``navsettop'', and the bottom one is in -``navsetbottom''. Within those divs, ``navsetleft'' wraps content to -be left-aligned and ``navsetright'' wraps content to be right-aligned. - -Links that are disabled (such as a next-page link on the last page) -are each in a span ``nonavigation''. - -When a search box is included, then it is in ``searchform'' and then -``searchbox''. If no search box is included, then a ``nosearchform'' -@tt{div} is used. - -Finally, and not part of the nagivation bar, the bottom nagivation bar -is followed by a @tt{div} with the name -``contextindicator''. JavaScript code attached to the page copies the -@tt{ctxtname} query argument, if any, to the @tt{div} and makes it -visible. - -@; ====================================================================== -@index-section[] diff --git a/scribble-doc/scribblings/scribble/doclang.scrbl b/scribble-doc/scribblings/scribble/doclang.scrbl deleted file mode 100644 index b30ae43e..00000000 --- a/scribble-doc/scribblings/scribble/doclang.scrbl +++ /dev/null @@ -1,117 +0,0 @@ -#lang scribble/manual -@(require "utils.rkt") - -@title[#:tag "doclang"]{Document Language} - -@defmodulelang[scribble/doclang2]{The @racketmodname[scribble/doclang2] -language provides everything from @racket[racket/base], except that it -replaces the @racket[#%module-begin] form. - -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]. - -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 -}| -} - - - -@section{@racketmodname[scribble/doclang]} -@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)) -}| -} diff --git a/scribble-doc/scribblings/scribble/docreader.scrbl b/scribble-doc/scribblings/scribble/docreader.scrbl deleted file mode 100644 index 3bcd6237..00000000 --- a/scribble-doc/scribblings/scribble/docreader.scrbl +++ /dev/null @@ -1,10 +0,0 @@ -#lang scribble/doc -@(require scribble/manual scribble/bnf "utils.rkt") - -@title[#:tag "docreader"]{Document Reader} - -@defmodulelang[scribble/doc]{The @racketmodname[scribble/doc] language is -the same as @racketmodname[scribble/doclang], except that -@racket[read-syntax-inside] is used to read the body of the module. In -other words, the module body starts in Scribble ``text'' mode instead -of S-expression mode.} diff --git a/scribble-doc/scribblings/scribble/eval.scrbl b/scribble-doc/scribblings/scribble/eval.scrbl deleted file mode 100644 index 73457e55..00000000 --- a/scribble-doc/scribblings/scribble/eval.scrbl +++ /dev/null @@ -1,180 +0,0 @@ -#lang scribble/doc -@(require scribble/manual - "utils.rkt" - (for-label scribble/eval - racket/sandbox - racket/pretty - file/convertible - racket/serialize)) - -@(define-syntax-rule (define-new-examples new-examples) - (begin - (require (for-label scribble/example)) - (define new-examples @racket[examples]))) -@(define-new-examples new-examples) - - -@title[#:tag "old-eval"]{Legacy Evaluation} - -@defmodule[scribble/eval]{The @racketmodname[scribble/eval] library provides -an older interface to the functionality of @racketmodname[scribble/example]. -The @racketmodname[scribble/example] library should be used, instead.} - -In addition to the forms listed below, @racket[scribble/eval] -re-exports several functions from @racket[scribble/example]: -@racket[make-base-eval] @racket[make-base-eval-factory], -@racket[make-eval-factory], @racket[make-log-based-eval], -@racket[close-eval], and @racket[scribble-eval-handler]. - - -@defform/subs[(interaction maybe-options datum ...) - ([maybe-options maybe-eval maybe-escape maybe-no-errors] - [maybe-eval code:blank - (code:line #:eval eval-expr)] - [maybe-escape code:blank - (code:line #:escape escape-id)] - [maybe-no-errors code:blank - (code:line #:no-errors? no-errors?-expr)])]{ - -Like @|new-examples| from @racketmodname[scribble/example], except that - -@itemlist[ - - @item{the ``Examples:'' label is always supressed,} - - @item{exceptions raised during the evaluation of a @racket[datum] are - always rendered as errors, unless @racket[#:no-errors?] is - specified with a true value; and} - - @item{the @racket[#:once] option is never implicitly used.} - -] - -@history[#:changed "1.14" @elem{Added @racket[#:no-errors?], - @racket[eval:no-prompt], and - @racket[eval:error], and changed - @racket[code:line] to support multiple - @racket[_datum]s.}]} - - -@defform[(interaction0 maybe-options datum ...)]{ -Like @racket[interaction], but without insetting the code via -@racket[nested]. - -Use @|new-examples| with @racket[#:no-indent], instead.} - - -@defform[(interaction/no-prompt maybe-eval maybe-escape datum)]{ - Like @racket[interaction], but does not render each @racket[datum] with a prompt. - - Use @|new-examples| with @racket[#:no-prompt], instead.} - - -@defform[(interaction-eval maybe-eval datum)]{ - -Like @racket[interaction], evaluates the @racket[quote]d form of -@racket[datum], but returns the empty string and does not catch -exceptions (so @racket[eval:error] has no effect). - -Use @|new-examples| with @racket[#:hidden], instead.} - - -@defform[(interaction-eval-show maybe-eval datum)]{ - -Like @racket[interaction-eval], but produces an element representing -the printed form of the evaluation result. - -Use @|new-examples| with @racket[#:result-only], instead.} - - -@defform[(racketblock+eval maybe-eval maybe-escape datum ...)]{ - -Combines @racket[racketblock] and @racket[interaction-eval]. - -Use @|new-examples| with @racket[#:no-result], instead.} - - -@defform[(racketblock0+eval maybe-eval maybe-escape datum ...)]{ - -Combines @racket[racketblock0] and @racket[interaction-eval]. - -Use @|new-examples| with @racket[#:no-result] and -@racket[#:no-indent], instead.} - - -@defform[(racketmod+eval maybe-eval maybe-escape name datum ...)]{ - -Combines @racket[racketmod] and @racket[interaction-eval]. - -Use @|new-examples| with @racket[#:lang], instead.} - - -@defform[(def+int maybe-options defn-datum expr-datum ...)]{ - -Like @racket[interaction], except the @racket[defn-datum] is -typeset as for @racket[racketblock] (i.e., no prompt) and a line of -space is inserted before the @racket[expr-datum]s.} - - -@defform[(defs+int maybe-options (defn-datum ...) expr-datum ...)]{ - -Like @racket[def+int], but for multiple leading definitions. - -Use @|new-examples| with @racket[eval:no-prompt] wrappers on -definitions, instead.} - - -@defform[(examples maybe-options datum ...)]{ - -Like @racket[interaction], but with an ``Examples:'' label prefixed. - -Use @|new-examples| from @racketmodname[scribble/example], instead.} - - -@defform[(examples* label-expr maybe-options datum ...)]{ - -Like @racket[examples], but using the result of @racket[label-expr] in -place of the default ``Examples:'' label. - -Use @|new-examples| from @racketmodname[scribble/example] with the -@racket[#:label] option, instead.} - - -@defform[(defexamples maybe-options datum ...)]{ - -Like @racket[examples], but each definition using @racket[define] or -@racket[define-struct] among the @racket[datum]s is typeset without a -prompt, and with line of space after it. - -Use @|new-examples| with @racket[eval:no-prompt] wrappers on -definitions, instead.} - - -@defform[(defexamples* label-expr maybe-options datum ...)]{ - -Like @racket[defexamples], but using the result of @racket[label-expr] in -place of the default ``Examples:'' label. - -Use @|new-examples| with the @racket[#:label] option and -@racket[eval:no-prompt] wrappers on definitions, instead.} - - -@defproc*[([(as-examples [b block?]) block?] - [(as-examples [label (or/c block? content?)] - [b block?]) - block?])]{ - -Adds an ``examples'' label to @racket[b], using either a default label -or the given @racket[label].} - -@defform[(with-eval-preserve-source-locations expr ...)]{ - -By default, the evaluation forms provided by this module, such as -@racket[interaction] and @racket[examples], discard the source -locations from the expressions they evaluate. Within a -@racket[with-eval-preserve-source-locations] form, the source -locations are preserved. This can be useful for documenting forms that -depend on source locations, such as Redex's typesetting macros. - -Use @|new-examples| with the @racket[#:preserve-source-locations] -option, instead.} diff --git a/scribble-doc/scribblings/scribble/examples.scrbl b/scribble-doc/scribblings/scribble/examples.scrbl deleted file mode 100644 index 8e1c167a..00000000 --- a/scribble-doc/scribblings/scribble/examples.scrbl +++ /dev/null @@ -1,304 +0,0 @@ -#lang scribble/doc -@(require scribble/manual - "utils.rkt" - (for-label scribble/example - racket/sandbox - racket/pretty - file/convertible - racket/serialize)) - -@title[#:tag "eval"]{Evaluation and Examples} - -@defmodule[scribble/example #:use-sources (scribble/eval scribble/example)]{The -@racket[scribble/example] library provides -utilities for evaluating code at document-build time and incorporating -the results in the document, especially to show example uses of -defined procedures and syntax.} - -@history[#:added "1.16"] - -@defform/subs[(examples option ... datum ...) - ([option (code:line #:eval eval-expr) - #:once - (code:line #:escape escape-id) - (code:line #:label label-expr) - #:hidden - #:result-only - #:no-inset - #:no-prompt - #:preserve-source-locations - #:no-result - (code:line #:lang language-name)])]{ - -Similar to @racket[racketinput], except that the result for each input -@racket[datum] is shown on the next line. The result is determined by -evaluating the @racket[quote]d form of the @racket[datum] using the -evaluator produced by @racket[eval-expr]. - -Each keyword option can be provided at most once: - -@itemlist[ - - @item{@racket[#:eval eval-expr] --- Specifies an evaluator, where - @racket[eval-expr] must produce either @racket[#f] or a sandbox - evaluator via @racket[make-evaluator] or - @racket[make-module-evaluator] with the @racket[sandbox-output] - and @racket[sandbox-error-output] parameters set to - @racket['string]. If @racket[eval-expr] is not provided or is - @racket[#f], an evaluator is created using - @racket[make-base-eval]. See also @racket[make-eval-factory].} - - @item{@racket[#:once] --- Specifies that the evaluator should be - closed with @racket[close-eval] after the all @racket[datum]s - are evaluated. The @racket[#:once] option is assumed if - @racket[#:eval] is not specified.} - - @item{@racket[@#,racket[#:escape] escape-id] --- Specifies an escape - identifier, as in @racket[racketblock].} - - @item{@racket[#:label label-expr] --- Specifies a label for the - examples, which defaults to ``Example:'' or ``Examples:'' - (depending on the number of @racket[datum]s). A @racket[#f] - value for @racket[label-expr] suppresses the label.} - - @item{@racket[#:hidden] --- Specifies that the @racket[datum]s and - results should not be typeset, but instead evaluated for a - side-effect, and disables @racket[eval:error]. Typically, this - option is combined with @racket[#:eval] to configure an - evaluator.} - - @item{@racket[#:result-only] --- Specifies that the @racket[datum] - results should be typeset, but not the @racket[datum]s - themselves, and implies @racket[#:label #f].} - - @item{@racket[#:no-result] --- Implies @racket[#:no-prompt] and - @racket[#:label #f], specifies that no results should be - typeset, and disables @racket[eval:error].} - - @item{@racket[#:no-inset] --- Specifies that the examples should be - typeset without indentation, i.e., like @racket[racketinput0] - instead of @racket[racketinput].} - - @item{@racket[#:no-prompt] --- Specifies that each examples should - be typeset without a leading prompt, i.e., like - @racket[racketblock] instead of @racket[racketinput]. A prompt - can be omitted from a specific @racket[_datum] by wrapping it - with @racket[eval:no-prompt].} - - @item{@racket[#:preserve-source-locations] --- Specifies that the - original source locations for each @racket[datum] should be - preserved for evaluation. Preserving source locations can be - useful for documenting forms that depend on source locations, - such as Redex's typesetting macros.} - - @item{@racket[#:lang] --- Implies @racket[#:no-result] prefixes the - typeset @racket[datum] sequence with a @hash-lang[] line using - @racket[language-name] as the module's language.} - -] - -Certain patterns in @racket[datum] are treated specially: - -@itemlist[ - - @item{A @racket[datum] of the form - @racket[(@#,indexed-racket[code:line] _code-datum (@#,racketidfont{code:comment} _comment-datum ...))] - is treated as @racket[_code-datum] for evaluation.} - -@item{A @racket[datum] of the form - @racket[(@#,indexed-racket[code:line] _code-datum ...)] - evaluates each @racket[_code-datum], but only the last result is used.} - - @item{Other uses of @racketidfont{code:comment}, @racketidfont{code:contract}, and - @racketidfont{code:blank} are stripped from each @racket[datum] - before evaluation.} - - @item{A @racket[datum] of the form - @racket[(@#,indexed-racket[eval:error] #,(svar eval-datum))] is - treated like @racket[_eval-datum], but @racket[_eval-datum] is - expected to raise an exception, and an error is shown as the - evaluation's result.} - - @item{A @racket[datum] of the form - @racket[(@#,indexed-racket[eval:alts] #,(svar show-datum) #,(svar eval-datum))] - is treated as @svar[show-datum] for typesetting and @svar[eval-datum] for evaluation.} - - @item{A @racket[datum] of the form - @racket[(@#,indexed-racket[eval:check] #,(svar eval-datum) #,(svar expect-datum))] - is treated like @racket[_eval-datum], but @svar[check-datum] is also - evaluated, and an error is raised if they are not @racket[equal?].} - - @item{A @racket[datum] of the form - @racket[(@#,indexed-racket[eval:result] _content-expr _out-expr _err-expr)] - involves no sandboxed evaluation; instead, the @tech{content} result of @racket[_content-expr] is used as the - typeset form of the result, @racket[_out-expr] is treated as output printed - by the expression, and @racket[_err-expr] is error output printed by the - expression. The @racket[_out-expr] and/or @racket[_err-expr] can be omitted, - in which case they default to empty strings. - - Normally, @racketidfont{eval:result} - is used in the second part of an @racketidfont{eval:alts} combination. Otherwise, - @racket[_content-expr] is typeset as the input form (which rarely makes sense for - a reader of the example).} - - @item{A @racket[datum] of the form - @racket[(@#,indexed-racket[eval:results] _content-list-expr _out-expr _err-expr)] - is treated like an @racketidfont{eval:result} form, except that @racket[_content-list-expr] - should produce a list of @tech{content} for multiple results of evaluation. As - with @racketidfont{eval:result}, @racket[_out-expr] and @racket[_err-expr] are optional.} - - @item{A @racket[datum] of the form - @racket[(@#,indexed-racket[eval:no-prompt] _eval-datum ...)] - is treated like @racket[(@#,racket[code:line] _eval-datum ...)], but no prompt is shown before - the group, and a blank line is added before and after - @(svar eval-datum) and its result.} - -] - -A @racket[datum] cannot be a keyword. To specify a @racket[datum] that -is a keyword, wrap it with @racket[code:line]. - -When evaluating a @racket[datum] produces an error (and @racket[datum] -does not have an @racket[eval:error] wrapper), an exception is raised -by @racket[examples]. - -If the value of @racket[current-print] in the sandbox is changed from -its default value, or if @racket[print-as-expression] in the sandbox -is set to @racket[#f], then each evaluation result is formatted to a -port by applying @racket[(current-print)] to the value; the output -port is set to a pipe that supports specials in the sense of -@racket[write-special], and non-character values written to the port -are used as @tech{content}. Otherwise, when the default -@racket[current-print] is in place, result values are typeset using -@racket[to-element/no-color]. - -As an example, - -@codeblock|{ -#lang scribble/manual -@(require racket/sandbox - scribble/eval) -@(define my-evaluator - (parameterize ([sandbox-output 'string] - [sandbox-error-output 'string]) - (make-evaluator 'typed/racket/base))) - -@examples[#:eval my-evaluator - (: my-sqr (Real -> Real)) - (define (my-sqr x) - (* x x)) - (my-sqr 42)] -}| - -uses an evaluator whose language is @racketmodname[typed/racket/base].} - - -@defproc[(make-base-eval [#:pretty-print? pretty-print? any/c #t] - [#:lang lang - (or/c module-path? - (list/c 'special symbol?) - (cons/c 'begin list?)) - '(begin)] - [input-program any/c] ...) - (any/c . -> . any)]{ - -Creates an evaluator using @racket[(make-evaluator 'racket/base #:lang lang input-program ...)], -setting sandbox parameters to disable limits, setting the outputs to -@racket['string], and not adding extra security guards. - -If @racket[pretty-print?] is true, the sandbox's printer is set to -@racket[pretty-print-handler]. In that case, values that are convertible -in the sense of @racket[convertible?] are printed using @racket[write-special], -except that values that are serializable in the sense of @racket[serializable?] -are serialized for tranfers from inside the sandbox to outside (which can avoid -pulling code and support from the sandboxed environment into the document-rendering -environment). - -@history[#:changed "1.6" @elem{Changed treatment of convertible values that are - serializable.}]} - - -@defproc[(make-base-eval-factory [mod-paths (listof module-path?)] - [#:pretty-print? pretty-print? any/c #t] - [#:lang lang - (or/c module-path? - (list/c 'special symbol?) - (cons/c 'begin list?)) - '(begin)]) - (-> (any/c . -> . any))]{ - -Produces a function that is like @racket[make-base-eval], except that -each module in @racket[mod-paths] is attached to the evaluator's -namespace. The modules are loaded and instantiated once (when the -returned @racket[make-base-eval]-like function is called the first -time) and then attached to each evaluator that is created.} - - -@defproc[(make-eval-factory [mod-paths (listof module-path?)] - [#:pretty-print? pretty-print? any/c #t] - [#:lang lang - (or/c module-path? - (list/c 'special symbol?) - (cons/c 'begin list?)) - '(begin)]) - (-> (any/c . -> . any))]{ - -Like @racket[make-base-eval-factory], but each module in @racket[mod-paths] is -also required into the top-level environment for each generated evaluator.} - - -@defproc[(make-log-based-eval [log-file path-string?] - [mode (or/c 'record 'replay)]) - (-> any/c any)]{ - -Creates an evaluator (like @racket[make-base-eval]) that uses a log -file to either record or replay evaluations. - -If @racket[mode] is @racket['record], the evaluator records every -interaction to @racket[log-file], replacing @racket[log-file] if it -already exists. The result of each interaction must be -@seclink["serialization" #:doc '(lib -"scribblings/reference/reference.scrbl")]{serializable}. - -If @racket[mode] is @racket['replay], the evaluator uses the contents -of @racket[log-file] instead of actually performing evaluatings. For -each interaction, it compares the term to evaluate against the next -interaction recorded in @racket[log-file]. If the term matches, the -stored result is returned; if not, the evaluator raises an error -indicating that it is out of sync with @racket[log-file]. - -Use @racket[make-log-based-eval] to document libraries when the -embedded examples rely on external features that may not be present or -appropriately configured on all machines. - -@history[#:added "1.12"]} - - -@defproc[(close-eval [eval (any/c . -> . any)]) (one-of/c "")]{ - -Shuts down an evaluator produced by @racket[make-base-eval]. Use -@racket[close-eval] when garbage collection cannot otherwise reclaim -an evaluator (e.g., because it is defined in a module body).} - - -@defparam[scribble-eval-handler handler - ((any/c . -> . any) any/c boolean? . -> . any)]{ - -A parameter that serves as a hook for evaluation. The evaluator to use -is supplied as the first argument to the parameter's value, and the -second argument is the form to evaluate. The last argument is -@racket[#t] if exceptions are being captured (to display exception -results), @racket[#f] otherwise.} - -@defparam[scribble-exn->string handler (-> (or/c exn? any/c) string?)]{ - A parameter that controls how exceptions are rendered by - @racket[interaction]. Defaults to - @racketblock[(λ (e) - (if (exn? e) - (exn-message e) - (format "uncaught exception: ~s" e)))] -} - -@; ------------------------------------------------------------ - -@include-section["eval.scrbl"] diff --git a/scribble-doc/scribblings/scribble/generic.scrbl b/scribble-doc/scribblings/scribble/generic.scrbl deleted file mode 100644 index 33f6c243..00000000 --- a/scribble-doc/scribblings/scribble/generic.scrbl +++ /dev/null @@ -1,14 +0,0 @@ -#lang scribble/manual -@(require "utils.rkt") - -@title[#:tag "generic-prose" #:style 'toc]{High-Level Scribble API} - -@local-table-of-contents[] - -@include-section["base.scrbl"] -@include-section["manual-stub.scrbl"] -@include-section["book.scrbl"] -@include-section["report.scrbl"] -@include-section["sigplan.scrbl"] -@include-section["jfp.scrbl"] -@include-section["lncs.scrbl"] diff --git a/scribble-doc/scribblings/scribble/getting-started.scrbl b/scribble-doc/scribblings/scribble/getting-started.scrbl deleted file mode 100644 index b59dd871..00000000 --- a/scribble-doc/scribblings/scribble/getting-started.scrbl +++ /dev/null @@ -1,10 +0,0 @@ -#lang scribble/manual - -@title[#:tag "getting-started" #:style 'toc]{Getting Started} - - - -@local-table-of-contents[] - -@include-section["how-to-paper.scrbl"] -@include-section["how-to.scrbl"] diff --git a/scribble-doc/scribblings/scribble/how-to-paper.scrbl b/scribble-doc/scribblings/scribble/how-to-paper.scrbl deleted file mode 100644 index a15d190b..00000000 --- a/scribble-doc/scribblings/scribble/how-to-paper.scrbl +++ /dev/null @@ -1,682 +0,0 @@ -#lang scribble/doc -@(require scribble/manual scribble/bnf "utils.rkt" - pict - (for-label scriblib/figure scribble/base scribble/sigplan - (except-in pict table))) - -@(define-syntax-rule (samplemod . text) (codeblock . text)) -@(define-syntax-rule (sample a . text) - (codeblock #:context #'a #:keep-lang-line? #f - "#lang scribble/base" "\n" a . text)) -@(define (result . text) (apply nested #:style 'inset text)) - -@(define sep @hspace[1]) - -@(define sub*section subsection) - -@title[#:tag "getting-started"]{Getting Started} - -No matter what you want to do with Scribble, it's best to start by -generating a few simple HTML and/or PDF documents. This chapter steps -you through the basics, and it ends in @secref["roadmap"] with -goal-specific advice on how to continue. - -@section[#:tag "first-example"]{A First Example} - -Create a file @filepath{mouse.scrbl} with this content: - - @samplemod|{ - #lang scribble/base - - @title{On the Cookie-Eating Habits of Mice} - - If you give a mouse a cookie, he's going to ask for a - glass of milk. - }| - -The first line's @racket[#, @hash-lang[] #, -@racketmodname[scribble/base]] indicates that the file implements a -Scribble document. The document starts in ``text mode,'' and the -@litchar["@"] character escapes to operators like @racket[title], -where the curly braces return to text mode for the arguments to the -operator. The rest is document content. - -Now run the @exec{scribble} command-line program, specifying a mode -for the kind of document that you want as output: - - @itemize[ - - @item{Run - @commandline{scribble mouse.scrbl} - to generate HTML as @filepath{mouse.html}. You may - notice that the apostrophe in ``he's'' turned into a - curly apostrophe.} - - @item{Run - @commandline{scribble --htmls mouse.scrbl} - to generate HTML as @filepath{mouse/index.html}. - Sub-sections (which we add next) will appear as separate - HTML files in the @filepath{mouse} directory.} - - @item{Run - @commandline{scribble --pdf mouse.scrbl} - to generate PDF as @filepath{mouse.pdf}. This will - work only if you have @exec{pdflatex} installed. - If you'd like to see the intermediate Latex, try - @commandline{scribble --latex mouse.scrbl} - to generate @filepath{mouse.tex}.} - - ] - -See @secref["running"] for more information on the @exec{scribble} -command-line tool. - -@section{Multiple Sections} - -Add more text to @filepath{mouse.scrbl} so that it looks like this: - - @samplemod|{ - #lang scribble/base - - @title{On the Cookie-Eating Habits of Mice} - - If you give a mouse a cookie, he's going to ask for a - glass of milk. - - @section{The Consequences of Milk} - - That ``squeak'' was the mouse asking for milk. Let's - suppose that you give him some in a big glass. - - He's a small mouse. The glass is too big---way too - big. So, he'll probably ask you for a straw. You might as - well give it to him. - - @section{Not the Last Straw} - - For now, to handle the milk moustache, it's enough to give - him a napkin. But it doesn't end there... oh, no. - }| - - Now, after the first paragraph of the paper, we have two - sub-sections, each created by calling @racket[section] to - generate a sub-section declaration. The first sub-section has - two paragraphs. The second section, as initiated by the result - of the second @racket[section] call, has a single paragraph. - -Run the @exec{scribble} command(s) from @secref["first-example"] -again. You may notice the curly double-quotes in the output, and -the @litchar{---} turned into an em dash. - -@;---------------------------------------- -@section{Splitting the Document Source} - -As a document grows larger, it's better to split sections into -separate source files. The @racket[include-section] operation -incorporates a document defined by a @filepath{.scrbl} file into a -larger document. - -To split the example document into multiple files, change -@filepath{mouse.scrbl} to just - - @samplemod|{ - #lang scribble/base - - @title{On the Cookie-Eating Habits of Mice} - - If you give a mouse a cookie, he's going to ask for a - glass of milk. - - @include-section["milk.scrbl"] - @include-section["straw.scrbl"] - }| - -Create @filepath{milk.scrbl} and @filepath{straw.scrbl} in the same -directory as @filepath{mouse.scrbl}. In @filepath{milk.scrbl}, put - - @samplemod|{ - #lang scribble/base - - @title{The Consequences of Milk} - - That ``squeak'' was the mouse asking for milk... - }| - -and in @filepath{straw.scrbl}, put - - @samplemod|{ - #lang scribble/base - - @title{Not the Last Straw} - - For now, to handle the milk moustache, ... - }| - -Notice that the new files both start with @hash-lang[], like the -original document, and the @racket[section]s from the original -document become @racket[title]s in the new documents. Both -@filepath{milk.scrbl} and @filepath{straw.scrbl} are documents in -their own right with their own titles, and they can be individually -rendered using @exec{scribble}. Running @exec{scribble} on -@filepath{mouse.scrbl}, meanwhile, incorporates the smaller documents -into one document that is the same as before. - -@; ---------------------------------------- -@section{Document Styles} - -Scribble currently supports only one form of HTML output. You can -replace the @filepath{scribble.css} file for the generated pages, and -that's about it. (We expect to add more styles in the future.) - -For Latex-based PDF output, Scribble includes support for -multiple page-layout configurations. The @filepath{mouse.scrbl} -example so far uses the default Latex style. If you plan on submitting -the paper to a workshop on programming languages, then---well, you -probably need a different topic. But you can start making the current -content look right by changing the first line to - - @samplemod|{ - #lang scribble/sigplan - }| - -If you're instead working toward Racket library documentation, -try changing the first line to - - @samplemod|{ - #lang scribble/manual - }| - -which produces output with a separate title page, initial content on -that page (intended as a brief orientation to the document), and -top-level sections turned into chapters that each start on a new page. -If you have split the document into multiple files, the first line of -the main document file determines the output format. - -Using @racketmodname[scribble/sigplan] or -@racketmodname[scribble/manual] does not change the rendered HTML for -a document---aside from @racketmodname[scribble/manual] adding a -version number---but it changes the set of bindings available in the -document body. For example, with @racketmodname[scribble/sigplan], the -introductory text can be marked as an abstract: - - @samplemod|{ - #lang scribble/sigplan - - @title{On the Cookie-Eating Habits of Mice} - - @abstract{If you give a mouse a cookie, he's going to - ask for a glass of milk.} - - @section{The Consequences of Milk} - - ....}| - -When rendered as HTML, the abstract shows up as an inset paragraph. If -you try to use @racket[abstract] with the -@racketmodname[scribble/base] or @racketmodname[scribble/manual] -language, then you get an error, because @racket[abstract] is not -defined. - -When a document is implemented across multiple files, changing the -language of the main document can set the style for all of the parts, -but it does not introduce bindings into the other part files. For -example, if you change the language of @filepath{mouse.scrbl} to -@racketmodname[scribble/sigplan], then @racket[abstract] becomes -available in @filepath{mouse.scrbl} but not in @filepath{milk.scrbl} -or @filepath{straw.scrbl}. In other words, operator names are -lexically scoped. - -@; ---------------------------------------- -@section{More Functions} - -The @racketmodname[scribble/base] language provides a collection of -basic operations (and The @racketmodname[scribble/sigplan] and -@racketmodname[scribble/manual] are supersets of -@racketmodname[scribble/base]). Many of the operations are style -variations that you can apply to text: - - @sample|{ - He's a @smaller{small mouse}. The glass is too - @larger{big}---@bold{way @larger{too @larger{big}}}. So, he'll - @italic{probably} ask you for a straw. - }| - -which renders as - - @result{ - He's a @smaller{small mouse}. The glass is too - @larger{big}---@bold{way @larger{too @larger{big}}}. So, he'll - @italic{probably} ask you for a straw. - } - -As you would expect, calls to functions like @racket[smaller], -@racket[larger], and @racket[bold] can be nested in other calls. They -can also be nested within calls to @racket[title] or @racket[section]: - - @sample|{ - @section{@italic{Not} the Last Straw} - }| - -@sub*section{Centering} - -The @racket[centered] operation centers a flow of text: - - @sample|{ - If a mouse eats all your cookies, put up a sign that says - @centered{ - @bold{Cookies Wanted} - - @italic{Chocolate chip preferred!} - } - and see if anyone brings you more. - }| - -which renders as - - @result{ - If a mouse eats all your cookies, put up a sign that says - @centered{ - @bold{Cookies Wanted} - - @italic{Chocolate chip preferred!} - } - and see if anyone brings you more. - } - -@sub*section{Margin Notes} - -The @racket[margin-note] operation is used in a similar way, but the -rendered text is moved to the margins. -@margin-note*{If you use @racket[margin-note], then the content shows - up over here.} - -@sub*section{Itemizations} - -The @racket[itemlist] operation creates a sequence of bulleted text, -where the @racket[item] operation groups text to appear in a single -bullet. The @racket[itemlist] operation is different from the others -that we have seen before, because it only accepts values produced by -@racket[item] instead of arbitrary text. This difference is reflected -in the use of @litchar{[}...@litchar{]} for the arguments to -@racket[itemlist] instead of @litchar["{"]...@litchar["}"]: - - @sample|{ - @centered{@bold{Notice to Mice}} - - @itemlist[@item{We have cookies for you.} - @item{If you want to eat a cookie, - you must bring your own straw.}] - }| - -which renders as - - @result{ - @centered{@bold{Notice to Mice}} - - @itemlist[@item{We have cookies for you.} - @item{If you want to eat a cookie, - you must bring your own straw.}] - } - -@sub*section{Tables} - -The @racket[tabular] function takes a list of lists to organize into a -two-dimensional table. By default, no spacing is added between columns, -so supply a @racket[#:sep] argument to acts as a column separator. -For example, - - @sample|{ - @tabular[#:sep @hspace[1] - (list (list @bold{Animal} @bold{Food}) - (list "mouse" "cookie") - (list "moose" "muffin"))] - }| - -renders as - - @result{ - @tabular[#:sep @hspace[1] - (list (list @bold{Animal} @bold{Food}) - (list "mouse" "cookie") - (list "moose" "muffin"))] - } - -@; ---------------------------------------- -@section{Text Mode vs. Racket Mode for Arguments} - -When @litchar{[}...@litchar{]} surrounds the arguments of an -operation, the argument expressions are in Racket mode rather than -text mode. Even in Racket mode, @litchar["@"] can be used to apply -operations; once the @"@" syntax is enabled through a -language like @racketmodname[scribble/base] (as opposed to -@racketmodname[racket]), it behaves the same in both Racket mode and -text mode. - -One advantage of using Racket mode for the arguments to -@racket[itemlist] is that we can pass a keyword-tagged optional -argument to @racket[itemlist]. In particular, if you want a list with -numbers instead of bullets, supply the @racket['ordered] style to -@racket[itemlist] using the @racket[#:style] keyword: - - @sample|{ - @itemlist[#:style 'ordered - @item{Eat cookie.} - @item{Drink milk.} - @item{Wipe mouth.} - @item{...}] - }| - -An operation doesn't care whether it's used with -@litchar{[}...@litchar{]} or @litchar["{"]...@litchar["}"]. Roughly, -@litchar["{"]...@litchar["}"] forms an argument that is a -string. (Only roughly, though. Newlines or uses of @litchar["@"] -within @litchar["{"]...@litchar["}"] complicate the picture, and we'll -get back to that soon.) So, - - @sample|{ - @italic{Yummy!} - }| - -is equivalent to - - @sample|{ - @italic["Yummy!"] - }| - -which is equivalent to the Racket expression - - @racketblock[ - (italic "Yummy!") - ] - -These equivalences explain why Scribble functions are documented in -Racket notation. If you're reading this in HTML format, you can click -@racket[italic] above to access its documentation. The documentation -won't completely make sense, yet, but it will by the end of this -chapter. - -What if you want to provide arguments in text mode, but you also want -to supply other optional arguments? You can use both -@litchar{[}...@litchar{]} and @litchar["{"]...@litchar["}"] for an -operation, as long as the @litchar{[}...@litchar{]} is first, and as -long as no character separate the closing @litchar{]} from the -opening @litchar["{"]. For example, calling @racket[italic] is the -same as using @racket[elem] with the @racket['italic] style: - - @sample|{ - @elem[#:style 'italic]{Yummy!} - }| - -You can also @emph{omit} both @litchar{[}...@litchar{]} and -@litchar["{"]...@litchar["}"]. In that case, the Racket expression -after @litchar["@"] is used directly instead of applied as an -operation. For example, - - @sample|{ - 1 plus 2 is @(number->string (+ 1 2)). - }| - -renders as - - @result{ - 1 plus 2 is @(number->string (+ 1 2)). - } - -The call to @racket[number->string] is needed because a naked number -is not valid as document content. - -@; ---------------------------------------- -@section[#:tag "how-to:reader"]{@"@" Syntax Basics} - -The @"@" notation provided by Scribble is just another way of -writing Racket expressions. Scribble documents could be constructed -using normal Racket notation, without using @"@" at all, but -that would be inconvenient for most purposes. The @"@" -notation makes dealing with textual content much easier. - -Whether in text mode or Racket mode, @litchar["@"] in a document -provides an escape to Racket mode. The basic syntax of @litchar["@"] is - -@racketblock[ - @#,BNF-seq[@litchar["@"] - @nonterm{cmd} - @litchar{[} @kleenestar{@nonterm{datum}} @litchar{]} - @litchar["{"] @nonterm{text-body} @litchar["}"]] -] - -where all three parts after @litchar["@"] are optional, but at least -one must be present. No spaces are allowed between - -@itemize[ - - @item{@litchar["@"] and @nonterm{cmd}, @litchar{[}, or @litchar["{"]} - - @item{@nonterm{cmd} and @litchar{[} or @litchar["{"]; or} - - @item{@litchar{]} and @litchar["{"].} - -] - -A @nonterm{cmd} or @nonterm{datum} is normal Racket notation, while a -@nonterm{text-body} is itself in text mode. A @nonterm{cmd} obviously -must not start with @litchar{[} or @litchar["{"], even though Racket -forms could otherwise start with those characters. - -The expansion of just @litchar["@"]@nonterm{cmd} into Racket code is - -@racketblock[ - @#,nonterm{cmd} -] - -When either @litchar{[} @litchar{]} or @litchar["{"] @litchar["}"] -are used, the expansion is - -@racketblock[ - (@#,nonterm{cmd} @#,kleenestar{@nonterm{datum}} @#,kleenestar{@nonterm{parsed-body}}) -] - -where @kleenestar{@nonterm{parsed-body}} is the parse result of the -@nonterm{text-body}. The @kleenestar{@nonterm{parsed-body}} part often -turns out to be a sequence of Racket strings. - -In practice, the @nonterm{cmd} is normally a Racket identifier that is -bound to a procedure or syntactic form. If the procedure or form -expects further text to typeset, then @litchar["{"]...@litchar["}"] -supplies the text. If the form expects other data, typically -@litchar{[}...@litchar{]} is used to surround Racket arguments, -instead. Even if an operation's argument is a string, if the string is -not used as content text (but instead used as, say, a hyperlink -label), then the string is typically provided through -@litchar{[}...@litchar{]} instead of @litchar["{"]...@litchar["}"]. -Sometimes, both @litchar{[}...@litchar{]} and -@litchar["{"]...@litchar["}"] are used, where the former surround -Racket arguments that precede text to typeset. Finally, if a form is a -purely Racket-level form with not typeset result, such as a -@racket[require] to import more operations, then typically just -@litchar["@"] is used. - -For example the text-mode stream - - @sample|{ - @(require scriblib/figure) - - @section[#:tag "poetry"]{Of Mice and Cookies} - See @secref["milk"]. - - @section[#:tag "milk"]{@italic{Important} Milk Supplies} - @figure["straw" @elem{A straw}]{@image["straw.png"]} - }| - -is equivalent to the Racket-mode sequence - -@racketblock[ - (require scriblib/figure) "\n" - "\n" - (section #:tag "poetry" "Of Mice and Cookies") "\n" - "See " (secref "milk") "." "\n" - "\n" - (section #:tag "milk" (italic "Important") " Milk Supplies") "\n" - (figure "straw" (elem "A straw") (image "straw.png")) "\n" -] - -Besides showing how different argument conventions are used for -different operations, the above example illustrates how whitespace is -preserved in the Racket form of a text-mode stream---including -newlines preserved as their own strings. Notice how the second -@racket[section] gets two arguments for its content, since the -argument content for @racket[section] in the source stream includes -both the use of an operator and additional text. When an operation -like @racket[section] or @racket[italic] accepts content to typeset, -it normally accepts an arbitrary number of arguments that together -form the content. - -In addition to its role for command, a @litchar["@"] can be followed -by @litchar{;} to start a @index['("Scribble" -"comments")]{comment}. If the character after @litchar{;} is -@litchar["{"], then the comment runs until a matching @litchar["}"], -otherwise the comment runs until the end-of-line: - -@racketblock[ - @#,BNF-seq[@litchar["@;{"] @nonterm{comment} @litchar["}"]] - @#,BNF-seq[@litchar["@;"] @nonterm{line-comment}] -] - -For more information on the syntax of @litchar["@"], see -@secref["reader"]. The full syntax includes a few more details, such -as brackets like @litchar["|{"]...@litchar["}|"] for text-mode -arguments while disabling @litchar["@"] between the brackets. - -@; ---------------------------------------- -@section{Decoding Sequences} - -In a document that starts @racket[#, @hash-lang[] #, -@racketmodname[scribble/base]], the top level is a text-mode stream, -just like the @nonterm{text-body} in a @litchar["@"] form. As -illustrated in the previous section, such a top-level sequence -corresponds to a mixture of Racket-mode strings and operation -applications. There's an implicit operation, @racket[decode], that -wraps the whole document to consume this mixture of strings and other -values and turn them into a document description. - -The @racket[decode] operation implements @defterm{flow decoding}, -which takes a document stream and breaks it up into sections and -paragraphs. Blank lines delimit paragraphs, and the results of -operations like @racket[title] and @racket[section] generate ``here's -the title'' or ``a new section starts here'' declarations that are -recognized by @racket[decode]. - -A different but related @defterm{content decoding} takes place within -a paragraph or section title. Content decoding is responsible for -converting @litchar{---} to an em dash or for converting @litchar{"} -and @litchar{'} to suitable curly quotes. - -The decoding process for document's stream is ultimately determined by -the @hash-lang[] line that starts the document. The -@racketmodname[scribble/base], @racketmodname[scribble/manual], and -@racketmodname[scribble/sigplan] languages all use the same -@racket[decode] operation. The @racketmodname[scribble/text] language, -however, acts more like a plain-text generator and preprocessor, and it -does not perform any such decoding rules. (For more on -@racketmodname[scribble/text], see @other-doc['(lib -"scribblings/scribble/scribble-pp.scrbl")].) - -@margin-note{More precisely, languages like - @racketmodname[scribble/base] apply @racket[decode] only after - lifting out all definitions and imports from the document - stream.} - -When the flow decoder is used, after it breaks the input stream into -paragraphs, it applies content decoding to strings within the -paragraph. When content is wrapped with an operation, however, content -decoding does not apply automatically. An operation is responsible for -calling a content or flow decoder as it sees fit. Most operations call -the decoder; for example, @racket[italic], @racket[bold], -@racket[smaller], etc., all decode their arguments. Similarly, -@racket[title] and @racket[section] decode the given content for the -title or section name. The @racket[literal] and @racket[verbatim] -operators, however, do not decode the given strings. For example, - - @sample|{ - @verbatim{---} - }| - -renders as - - @result{ - @verbatim{---} - } - -Don't confuse decoding with the expansion of @"@" -notation. The source form - - @sample|{ - @verbatim{@(number->string (+ 1 2))} - }| - -renders as - - @result{ - @verbatim{@(number->string (+ 1 2))} - } - -because the source is equivalent to - - @racketblock[ - (verbatim (number->string (+ 1 2))) - ] - -where @racket[(number->string (+ 1 2))] is evaluated to produce the -argument to @racket[verbatim]. The @litchar["|{"]...@litchar["}|"] -style of brackets is often used with @racket[verbatim], because -@litchar["|{"]...@litchar["}|"] disables @"@" notation for -arguments. For example, - - @sample|{ - @verbatim|{@(number->string (+ 1 2))}| - }| - -renders as - - @result{ - @verbatim|{@(number->string (+ 1 2))}| - } - - -@; ---------------------------------------- -@section[#:tag "pictures"]{Pictures} - -Any value that is convertable to an image can be used directly within -a Scribble document. Functions from the @racketmodname[pict] -and @racketmodname[2htdp/image #:indirect] libraries, for example, generate -images. For example, - -@sample|{ - @(require pict) - - This cookie has lost its chocolate chips: - @(colorize (filled-ellipse 40 40) "beige"). -}| - -renders as - - @result{ - This cookie has lost its chocolate chips: - @(colorize (filled-ellipse 40 40) "beige"). - } - - -@; ---------------------------------------- -@section[#:tag "roadmap"]{Next Steps} - -If your immediate goal is to document a Racket library or write -literate programs, skip to @secref["how-to-doc"], and then go back to -@secref["reader"] and other chapters. - -If you are more interested in producing documents unrelated to -Racket, continue with @secref["reader"] and then -@secref["generic-prose"]. Move on to @secref["internals"] when you -need more power. - -If you are interested in text generation and preprocessing, continue -with @secref["reader"], but then switch to -@other-doc['(lib "scribblings/scribble/scribble-pp.scrbl")]. \ No newline at end of file diff --git a/scribble-doc/scribblings/scribble/how-to.scrbl b/scribble-doc/scribblings/scribble/how-to.scrbl deleted file mode 100644 index 7c3059f8..00000000 --- a/scribble-doc/scribblings/scribble/how-to.scrbl +++ /dev/null @@ -1,381 +0,0 @@ -#lang scribble/doc -@(require scribble/manual scribble/bnf "utils.rkt") - -@(define pkg-doc '(lib "pkg/scribblings/pkg.scrbl")) - -@title[#:tag "how-to-doc"]{Getting Started with Documentation} - -Although the @exec{scribble} command-line utility generates output -from a Scribble document, documentation of Racket libraries is -normally built by @exec{raco setup}. This chapter emphasizes the -@exec{raco setup} approach, which more automatically supports links -across documents. - -@margin-note{See @secref["getting-started"] for information on using the - @exec{scribble} command-line utility.} - -@;---------------------------------------- -@section[#:tag "setting-up"]{Setting Up Library Documentation} - -To document a collection, including a collection implemented by a -@seclink["getting-started" #:doc pkg-doc]{package}: - -@itemize[ - - @item{Create a file in your collection with the - file extension @filepath{.scrbl}. Beware that the file name - you choose will determine the output directory's name, and - the directory name must be unique across all installed documents. The - remainder of these instructions assume that the file is called - @filepath{manual.scrbl} (but pick a more specific name in practice).} - - @item{Start @filepath{manual.scrbl} like this: - @codeblock|{ - #lang scribble/manual - - @title{My Library} - - Welcome to my documentation: @racket[(list 'testing 1 2 3)]. - }| - - The first line starts the file in ``text'' mode and selects - the Racket manual output format. - It also introduces bindings like @racket[title] and - @racket[racket] for writing Racket documentation.} - - @item{Add the following entry to your collection's - @filepath{info.rkt}: - - @racketblock[ - (define scribblings '(("manual.scrbl" ()))) - ] - - The @racket[()] above is a list of options. When your document - gets large enough that you want it split into multiple pages, - add the @racket['multi-page] option (omitting the quote, since - the whole right-hand side of the definition is already - quoted). - - If you do not already have an @filepath{info.rkt} module, - here's a suitable complete module: - - @racketmod[ - info - (define scribblings '(("manual.scrbl" ()))) - ]} - - @item{Run @exec{raco setup} to build your documentation. For a - collection, optionally supply @Flag{l} followed by the - collection name to limit the build process to that - collection.} - - @item{For a collection that is installed as user-specific - (e.g., the user @tech[#:doc pkg-doc]{package scope}), the generated - documentation is @filepath{doc/manual/index.html} within the - collection directory. If the collection is installation-wide, - however, then the documentation - is generated as @filepath{manual/index.html} in the - installation's @filepath{doc} directory.} - -] - -@; ---------------------------------------- -@section[#:tag "racket-hyperlinks"]{Racket Typesetting and Hyperlinks} - -In the document source at the start of this chapter -(@secref["setting-up"]), the Racket expression -@racket[(#,(racketidfont "list") 'testing 1 2 3)] is typeset properly, -but the @racketidfont{list} identifier is not hyperlinked to the usual -definition. To cause @racketidfont{list} to be hyperlinked, add a -@racket[require] form like this: - -@codeblock[#:keep-lang-line? #f]|{ - #lang scribble/base - @(require (for-label racket)) -}| - -This @racket[require] with @racket[for-label] declaration introduces a -document-time binding for each export of the @racketmodname[racket] -module. When the document is built, the @racket[racket] form detects -the binding for @racket[list], and so it generates a reference to the -specification of @racket[list]. The setup process detects the -reference, and it finds the matching specification in the existing -documentation, and ultimately directs the hyperlink to that -specification. - -Hyperlinks based on @racket[for-label] and @racket[racket] are the -preferred mechanism for linking to information outside of a single -document. Such links require no information about where and how a -binding is documented elsewhere: - -@codeblock|{ - #lang scribble/manual - @(require (for-label racket)) - - @title{My Library} - - See also @racket[list]. -}| - -The @racket[racket] form typesets a Racket expression for inline text, -so it ignores the source formatting of the expression. The -@racket[racketblock] form, in contrast, typesets inset Racket code, -and it preserves the expression's formatting from the document source. - -@codeblock|{ - #lang scribble/manual - @(require (for-label racket)) - - @title{My Library} - - Some example Racket code: - - @racketblock[ - (define (nobody-understands-me what) - (list "When I think of all the" - what - "I've tried so hard to explain!")) - (nobody-understands-me "glorble snop") - ] -}| - - -@; ---------------------------------------- -@section[#:tag "section-hyperlinks"]{Section Hyperlinks} - -A @racket[section] declaration in a document can include a -@racket[#:tag] argument that declares a hyperlink-target tag. The -@racket[secref] function generates a hyperlink, using the section name -as the text of the hyperlink. Use @racket[seclink] to create a -hyperlink with text other than the section title. - -The following example illustrates section hyperlinks: - -@codeblock|{ - #lang scribble/manual - @(require (for-label racket)) - - - @title{My Library} - - Welcome to my documentation: @racket[(list 'testing 1 2 3)]. - - @table-of-contents[] - - - @section[#:tag "chickens"]{Philadelphia Chickens} - - Dancing tonight! - - - @section{Reprise} - - See @secref{chickens}. -}| - -Since the page is so short, the hyperlinks in the above example are - more effective if you change the @filepath{info.rkt} file to add the - @racket['multi-file] flag: - -@racketblock[ -(define scribblings '(("manual.scrbl" (multi-page)))) -] - -A section can have a @techlink{tag prefix} that applies to all tags as -seen from outside the section. Such a prefix is automatically given to -each top-level document as processed by @exec{raco setup}. Thus, -referencing a section tag in a different document requires using a -prefix, which is based on the target document's main source file. The -following example links to a section in the Racket reference -manual: - -@codeblock|{ - #lang scribble/manual - @(require (for-label racket)) - @(define ref-src - '(lib "scribblings/reference/reference.scrbl")) - - @title{My Library} - - See also @italic{@secref[#:doc ref-src]{pairs}}. -}| - -As mentioned in @secref{racket-hyperlinks}, however, cross-document -references based on @racket[(require (for-label ....))] and -@racket[racket] are usually better than cross-document references -using @racket[secref]. - -@; ---------------------------------------- -@section{Defining Racket Bindings} - -Use @racket[defproc] to document a procedure, @racket[defform] to -document a syntactic form, @racket[defstruct] to document a structure -type, etc. These forms provide consistent formatting of definitions, -and they declare hyperlink targets for @racket[racket]-based -hyperlinks. - -To document a @racket[my-helper] procedure that is exported by -@filepath{helper.rkt} in the @filepath{my-lib} collection that contains -@filepath{manual.scrbl}: - -@itemize[ - - @item{Use @racket[(require (for-label "helper.rkt"))] to import the - binding information about the bindings of @filepath{helper.rkt} - for use when typesetting identifiers. A relative reference - @racket["helper.rkt"] works since it is relative to the - documentation source.} - - @item{Add a @tt|{@defmodule[my-lib/helper]}| declaration, which - specifies the library that is being documented within the - section. The @racket[defmodule] form needs an absolute module - name @racket[mylib/helper], instead of a relative reference - @racket["helper.rkt"], since the module path given to - @racket[defmodule] appears verbatim in the generated - documentation.} - - @item{Use @racket[defproc] to document the procedure.} - -] - -Adding these pieces to @filepath{manual.scrbl} gives us the -following: - -@codeblock|{ - #lang scribble/manual - @(require (for-label racket - "helper.rkt")) - - @title{My Library} - - @defmodule[my-lib/helper] - - @defproc[(my-helper [lst list?]) - (listof - (not/c (one-of/c 'cow)))]{ - - Replaces each @racket['cow] in @racket[lst] with - @racket['aardvark].} -}| - -In @racket[defproc], a contract is specified with each argument to the -procedure. In this example, the contract for the @racket[_lst] -argument is @racket[list?], which is the contract for a list. After -the closing parenthesis that ends the argument sequence, the contract -of the result must be given; in this case, @racket[my-helper] -guarantees a result that is a list where none of the elements are -@racket['cow]. - -Some things to notice in this example and the documentation that it -generates: - -@itemize[ - - @item{The @racket[list?], @racket[listof], @|etc| elements of - contracts are hyperlinked to their documentation.} - - @item{The result contract is formatted in the generated documentation - in the same way as in the source. That is, the source layout of - contracts is preserved. (In this case, putting the contract all - on one line would be better.)} - - @item{In the prose that documents @racket[my-helper], @racket[_lst] - is automatically typeset in italic, matching the typesetting in - the blue box. The @racket[racket] form essentially knows that - it's used in the scope of a procedure with argument - @racket[_lst].} - - @item{If you hover the mouse pointer over @racket[my-helper], a popup - reports that it is provided from @racketidfont{my-lib/helper}.} - - @item{If you use @racket[my-helper] in any documentation now, as long - as that documentation source also has a @racket[(require - (for-label ....))] of @filepath{helper.rkt}, then the - reference is hyperlinked to the definition above.} - -] - -See @racket[defproc*], @racket[defform], @|etc| for more information -on forms to document Racket bindings. - -@; ---------------------------------------- -@section{Showing Racket Examples} - -The @racket[examples] form from @racket[scribble/eval] helps you -generate examples in your documentation. To use @racket[examples], the -procedures to document must be suitable for use at documentation time, -but the @racket[examples] form does not use any binding introduced -into the document source by @racket[require]. Instead, create a new -evaluator with its own namespace using @racket[make-base-eval], and -use @racket[interaction-eval] to require @filepath{helper.rkt} in that -evaluator. Finally, supply the same evaluator to @racket[examples]: - -@codeblock|{ - #lang scribble/manual - @(require scribble/eval - (for-label racket - "helper.rkt")) - - @title{My Library} - - @defmodule[my-lib/helper] - - @defproc[(my-helper [lst list?]) - (listof - (not/c (one-of/c 'cow)))]{ - Replaces each @racket['cow] in @racket[lst] with - @racket['aardvark]. - - @(define helper-eval (make-base-eval)) - @interaction-eval[#:eval helper-eval - (require "helper.rkt")] - @examples[ - #:eval helper-eval - (my-helper '()) - (my-helper '(cows such remarkable cows)) - ]} -}| - -@;---------------------------------------- -@section{Multi-Page Sections} - -Setting the @racket['multi-page] option (see -@secref["section-hyperlinks"]) causes each top-level section of a -document to be rendered as a separate HTML page. - -To push sub-sections onto separate pages, use the @racket['toc] style -for the enclosing section (as started by @racket[title], -@racket[section], @racket[subsection], etc.) and use -@racket[local-table-of-contents] to generate hyperlinks to the -sub-sections. - -Revising @filepath{cows.scrbl} from the previous section: - -@codeblock|{ - #lang scribble/manual - - @title[#:style '(toc)]{Cows} - - @local-table-of-contents[] - - @section[#:tag "singing"]{Singing} - Wherever they go, it's a quite a show. - - @section{Dancing} - See @secref["singing"]. -}| - -To run this example, remember to change @filepath{info.rkt} to add the -@racket['multi-page] style. You may also want to add a call to -@racket[table-of-contents] in @filepath{manual.scrbl}. - -The difference between @racket[table-of-contents] and -@racket[local-table-of-contents] is that the latter is ignored for -Latex output. - -When using @racket[local-table-of-contents], it often makes sense to -include introductory text before the call of -@racket[local-table-of-contents]. When the introductory text is less -important and when local table of contents is short, putting the -introductory text after the call of @racket[local-table-of-contents] -may be appropriate. diff --git a/scribble-doc/scribblings/scribble/html.scrbl b/scribble-doc/scribblings/scribble/html.scrbl deleted file mode 100644 index 133aba89..00000000 --- a/scribble-doc/scribblings/scribble/html.scrbl +++ /dev/null @@ -1,494 +0,0 @@ -#lang scribble/doc -@(require scribble/manual - scribble/core - scribble/eval - (only-meta-in 0 "utils.rkt") - (for-label (except-in racket/base #%top #%module-begin) - racket/contract/base - racket/string - scribble/html)) - -@(define html-eval (make-base-eval)) -@interaction-eval[#:eval html-eval (require scribble/html)] -@interaction-eval[#:eval html-eval (require racket/string)] - -@title[#:tag "html" #:style 'toc]{HTML Generation} - -@defmodulelang[scribble/html]{The @racketmodname[scribble/html] -language provides a way to generate HTML that is different from -@racketmodname[scribble/base]. The @racketmodname[scribble/base] -approach involves describing a document that can be rendered to HTML, -Latex, or other formats. The @racketmodname[scribble/html] approach, -in contrast, treats the document content as HTML format plus escapes.} - -Specifically, @racketmodname[scribble/html] is like -@racketmodname[scribble/text], but with the following changes: - -@itemize[ - - @item{The @racketmodname[scribble/html/html], - @racketmodname[scribble/html/xml], and - @racketmodname[scribble/html/resource] are re-exported, - in addition to @racketmodname[scribble/text].} - - @item{Free identifiers that end with @litchar{:} are implicitly - quoted as symbols.} - -] - -When @racketmodname[scribble/html] is used via @racket[require] -instead of @hash-lang[], then it does not change the printing of -values, and it does not include the bindings of @racket[racket/base]. - -The @racketmodname[scribble/html/resource], -@racketmodname[scribble/html/xml], and -@racketmodname[scribble/html/html] libraries provide forms for -generating HTML as strings to be output in the same way as -@racketmodname[scribble/text]. - -@local-table-of-contents[] - -@; ---------------------------------------- - -@section[#:tag "html-html"]{Generating HTML Strings} - -@defmodule[scribble/html/html]{The @racketmodname[scribble/html/html] -provides functions for HTML representations that render to string form -via @racket[output-xml].} - -@defproc[(doctype [s (or/c string 'html 'xhtml)]) procedure?]{ - -Produces a value that @tech{XML-renders} as a DOCTYPE declaration. - -@examples[#:eval html-eval -(output-xml (doctype "?")) -(output-xml (doctype 'html)) -(regexp-split #rx"\n|((?<=\") (?=\"))" - (xml->string (doctype 'xhtml)))]} - - -@defproc[(xhtml [content outputable/c] ...) procedure?]{ - -Produces a value that @tech{XML-renders} as the given content wrapped -as XHTML. - -@examples[#:eval html-eval -(regexp-split #rx"\n|((?<=\") (?=\"))" - (xml->string (xhtml "Hello")))]} - -@(define-syntax-rule (def-tags tag ...) - @deftogether[( - @defproc[(tag [v outputable/c] (... ...)) procedure?] ... - )]{ - - Like @racket[element/not-empty], but with the symbolic form of the function - name added as the first argument. - - @examples[#:eval html-eval - (output-xml (title "The Book"))]}) - -@(def-tags - html - head - title - style ; style info, which may include CDATA sections - script ; script statements, which may include CDATA sections - noscript ; alternate content container for non script-based rendering - frameset ; only one noframes element permitted per document - frame ; tiled window within frameset - iframe ; inline subwindow - noframes ; alternate content container for non frame-based rendering - body - div ; generic language/style container - p - h1 - h2 - h3 - h4 - h5 - h6 - ul ; Unordered list - ol ; Ordered (numbered) list - menu ; single column list (DEPRECATED) - dir ; multiple column list (DEPRECATED) - li ; list item - dl ; definition lists - dt for term, dd for its definition - dt - dd - address ; information on author - pre - blockquote - center ; center content - ins - del - a ; content is inline; except that anchors shouldn't be nested - span ; generic language/style container - bdo ; I18N BiDi over-ride - em ; emphasis - strong ; strong emphasis - dfn ; definitional - code ; program code - samp ; sample - kbd ; something user would type - var ; variable - cite ; citation - abbr ; abbreviation - acronym ; acronym - q ; inlined quote - sub ; subscript - sup ; superscript - tt ; fixed pitch font - i ; italic font - b ; bold font - big ; bigger font - small ; smaller font - u ; underline - s ; strike-through - strike ; strike-through - font ; local change to font - object ; embeded objects - applet ; Java applet - form ; forms shouldn't be nested - label ; text that belongs to a form control - select ; option selector - optgroup ; option group - option ; selectable choice - textarea ; multi-line text field - fieldset ; group form fields - legend ; fieldset label (one per fieldset) - button ; push button - table ; holds caption?, (col*|colgroup*), thead?, tfoot?, (tbody+|tr+) - caption ; caption text - thead ; header part, holds tr - tfoot ; footer part, holds tr - tbody ; body part, holds tr - colgroup ; column group, olds col - tr ; holds th or td - th ; header cell - td) - -@(define-syntax-rule (def-tags/empty tag ...) - @deftogether[( - @defproc[(tag [v outputable/c] (... ...)) procedure?] ... - )]{ - - Like @racket[element], but with the symbolic form of the function - name added as the first argument. - - @examples[#:eval html-eval - (output-xml (hr))]}) - -@(def-tags/empty - base meta link hr br basefont param img area input isindex col) - -@(define-syntax-rule (def-entities ent ...) - @deftogether[( - @defthing[ent procedure?] ... - )]{ - - The result of @racket[(entity '_id)] for each @racket[_id]. - - @examples[#:eval html-eval - (output-xml nbsp)]}) - -@(def-entities - nbsp ndash mdash bull middot sdot lsquo rsquo sbquo ldquo rdquo bdquo - lang rang dagger Dagger plusmn deg) - - -@defproc[(script/inline [v outputable/c] ...) procedure?]{ - -Procedures a value that renders as an inline script. - -@examples[#:eval html-eval -(output-xml (script/inline type: "text/javascript" "var x = 5;"))]} - - -@defproc[(style/inline [v outputable/c] ...) procedure?]{ - -Procedures a value that renders as an inline style sheet. - -@examples[#:eval html-eval -(output-xml (style/inline type: "text/css" - ".racket { font-size: xx-large; }"))]} - - -@; ---------------------------------------- - -@section[#:tag "html-xml"]{Generating XML Strings} - -@defmodule[scribble/html/xml]{The @racketmodname[scribble/html/xml] -provides functions for XML representations that @deftech{XML-render} to string form -via @racket[output-xml] or @racket[xml->string].} - - -@defproc[(output-xml [content outputable/c] [port output-port? (current-output-port)]) - void?]{ - -Renders @racket[content] in the same way as @racket[output], but using -the value of @racket[xml-writer] as the @tech{current writer} so that -special characters are escaped as needed.} - - -@defproc[(xml->string [content outputable/c]) string?]{ - -Renders @racket[content] to a string via @racket[output-xml].} - - -@defparam[xml-writer writer ((string? output-port? . -> . void))]{ - -A parameter for a function that is used with @racket[with-writer] by -@racket[output-xml]. The default value is a function that escapes -@litchar{&}, @litchar{<}, @litchar{>}, and @litchar{"} to entity form.} - - -@defproc[(make-element [tag symbol?] - [attrs (listof (cons/c symbol? outputable/c))] - [content outputable/c]) - (and/c procedure outputable/c?)]{ - -Produces a value that @tech{XML-renders} as XML for the -given tag, attributes, and content. - -When an attribute in @racket[attrs] is mapped to @racket[#f], then it -is skipped. When an attribute is mapped to @racket[#t], then it is -rendered as present, but without a value. - -@examples[#:eval html-eval -(output-xml (make-element 'b '() '("Try" #\space "Racket"))) -(output-xml (make-element 'a '((href . "http://racket-lang.org")) "Racket")) -(output-xml (make-element 'div '((class . "big") (overlay . #t)) "example")) -]} - - -@defproc[(element [tag symbol?] [attrs-and-content any/c] ...) - (and procedure outputable/c?)]{ - -Like @racket[make-element], but the list of @racket[attrs-and-content] -is parsed via @racket[attributes+body] to separate the attributes and -content. - -@examples[#:eval html-eval -(output-xml (element 'b "Try" #\space "Racket")) -(output-xml (element 'a 'href: "http://racket-lang.org" "Racket")) -(output-xml (element 'div 'class: "big" 'overlay: #t "example")) -(require scribble/html) -(output-xml (element 'div class: "big" overlay: #t "example")) -]} - - -@defproc[(element/not-empty [tag symbol?] [attrs-and-content any/c] ...) - (and/c procedure? outputable/c)]{ - -Like @racket[element], but the result always renders with an separate -closing tag. - -@examples[#:eval html-eval -(output-xml (element 'span)) -(output-xml (element/not-empty 'span)) -]} - - -@defproc[(attribute? [v any/c]) (or/c #f symbol?)]{ - -Returns a symbol without if @racket[v] is a symbol that ends with -@litchar{:}, @racket[#f] otherwise. When a symbol is returned, it is -the same as @racket[v], but without the trailing @litchar{:}. - -@examples[#:eval html-eval -(attribute? 'a:) -(attribute? 'a) -(require scribble/html) -(attribute? a:) -]} - - -@defproc[(attributes+body [lst list?]) (values (listof (cons/c symbol? any/c)) - list?)]{ - -Parses @racket[lst] into an association list mapping attributes to -list elements plus a list of remaining elements. The first -even-positioned (counting from 0) non-@racket[attribute?] element of -@racket[lst] is the start of the ``remaining elements'' list, while -each preceding even-positioned attribute is mapped in the association -list to the immediately following element of @racket[lst]. In the -association list, the trailing @litchar{:} is stripped for each -attribute.} - - -@defproc[(split-attributes+body [lst list?]) (values list? list?)]{ - -Like @racket[attributes+body], but produces a flat list (of -alternating attributes and value) instead of an association list as -the first result.} - - -@defproc[(literal [content any/c] ...) procedure?]{ - -Produces a value that @tech{XML-renders} without escapes -for special characters. - -@examples[#:eval html-eval -(output-xml (literal "a->b")) -(output-xml "a->b")]} - - -@defproc[(entity [v (or/c exact-integer? symbol?)]) procedure?]{ - -Produces a value that @tech{XML-renders} as a numeric or -symbolic entity. - -@examples[#:eval html-eval -(output-xml (entity 'gt))]} - - -@defproc[(comment [content outputable/c] ... [#:newlines? newlines? any/c #f]) - procedure?]{ - -Produces a value that @tech{XML-renders} as a comment with -literal content. If @racket[newlines?] is true, then newlines are -inserted before and after the content. - -@examples[#:eval html-eval -(output-xml (comment "testing" 1 2 3))]} - - -@defproc[(cdata [content outputable/c] ... - [#:newlines? newlines? any/c #t] - [#:line-pfx line-pfx any/c #f]) - procedure?]{ - -Produces a value that @tech{XML-renders} as CDATA with -literal content. If @racket[newlines?] is true, then newlines are -inserted before and after the content. The @racket[line-pfx] value is -rendered before the CDATA opening and closing markers. - -@examples[#:eval html-eval -(output-xml (cdata "testing" 1 2 3))]} - - -@defform[(define/provide-elements/empty tag-id ...)]{ - -Defines and exports @racket[tag-id] as a function that is like -@racket[element], but with @racket['tag-id] added as the first argument.} - - -@defform[(define/provide-elements/not-empty tag-id ...)]{ - -Defines and exports @racket[tag-id] as a function that is like -@racket[element/not-empty], but with @racket['_tag-id] added as the -first argument.} - - -@defform[(define/provide-entities entity-id ...)]{ - -Defines and exports @racket[entity-id] as the -result of @racket[(entity '_entity-id)].} - -@; ---------------------------------------- - -@section[#:tag "html-resources"]{HTML Resources} - -@defmodule[scribble/html/resource] - -@defproc[(resource [path string?] - [renderer (or/c (path-string? . -> . any) #f)] - [#:exists exists (or/c 'delete-file #f) 'delete-file]) - (and/c resource? - (->* () (outputable/c) -> string?))]{ - -Creates and returns a new @deftech{resource} value. Creating a -resource registers @racket[renderer] (if non-@racket[#f]) to be called when rendering is -initiated by @racket[render-all], while calling the result resource as -a function generates a URL for the resource. - -For example, a typical use of @racket[resource] is to register the -generation of a CSS file, where the value produced by -@racket[resource] itself renders as the URL for the generated CSS -file. Another possible use of @racket[resource] is to generate an HTML -file, where the @racket[resource] result renders as the URL of the -generated HTML page. - -The @racket[path] argument specifies the path of the output file, -relative to the working directory, indicating where the resource file -should be placed. Though @racket[url-roots], @racket[path] also -determines the ultimate URL. The @racket[path] string must be a -@litchar{/}-separated relative path with no @litchar{..}, @litchar{.}, -or @litchar{//}. The @racket[path] string can end in @litchar{/}, in -which case @racket["index.html"] is effectively added to the string. -Using @racket[resource] with @racket[#f] as @racket[renderer] is -useful for converting a path to a URL according to @racket[url-roots]. - -The @racket[renderer] argument (when non-@racket[#f]) renders the resource, receiving the -path for the file to be created. The path provided to -@racket[renderer] will be different from @racket[path], because the -function is invoked in the target directory. - -The resulting resource value is a function that returns the URL for -the resource. The function accepts an optional boolean; if a true -value is provided, the result is an absolute URL, instead of relative. -Note that the function can be used as a value for @racket[output], -which uses the resource value as a thunk (that renders as the relative -URL for the resource). The default relative resulting URL is, of -course, a value that depends on the currently rendered resource that -uses this value. - -When @racket[renderer] is called by @racket[render-all], more -resources can be created while rendering; the newly created resources -will also be rendered, in turn, until no more new resources are -created. - -If @racket[exists] is @racket['delete-file] and the target file exists -when @racket[renderer] is to be called, then the file is deleted -before @racket[renderer] is called.} - - -@defparam[url-roots roots (or/c #f - (listof (cons/c path-string? - (cons/c string? - (listof (or/c 'abs 'index))))))]{ - -A parameter that determines how resource paths are converted to URLs -for reference. A @racket[#f] value is equivalent to an empty list. - -The parameter value is a mapping from path prefixes to URLs (actually, -any string). When two paths have the same prefix, links from one to -the other are relative (unless absolute links are requested); if they -have different prefixes, the full URL is used. The paths enclosed by -two root paths must be disjoint (e.g., the list must not include -both @racket["/colors"] and @racket["/colors/red"], but it can include -both @racket["/colors/red"] and @racket["/colors/blue"]). - -If an item in the parameter's list includes @racket['abs], then a -site-local, absolute URL (i.e., a URL that starts with @litchar{/}) is -produced for references among files within the corresponding prefix. - -If an item in the parameter's list includes @racket['index], then a -reference to a directory path is converted to a reference to -@filepath{index.html}, otherwise a reference to @filepath{index.html} -is converted to a directory path.} - - -@defproc[(resource? [v any/c]) boolean?]{ - -Returns @racket[#t] if @racket[v] is a procedure (that takes 0 or 1 -arguments) produced by @racket[resource].} - - -@defproc[(render-all) void?]{ - -Generates all resources registered via @racket[resource].} - - -@defproc[(file-writer [content-writer (outputable/c output-port? . -> . any)] - [content outputable/c]) - (path-string? . -> . any)]{ - -Produces a function that is useful as a @racket[_writer] argument to -@racket[resource]. Given a path, the produced function writes -@racket[content] to the path by passing @racket[content] and an output -port for the file to @racket[content-writer].} - -@; ------------------------------------------------------------ - -@close-eval[html-eval] diff --git a/scribble-doc/scribblings/scribble/inbox.css b/scribble-doc/scribblings/scribble/inbox.css deleted file mode 100644 index d33f2076..00000000 --- a/scribble-doc/scribblings/scribble/inbox.css +++ /dev/null @@ -1,4 +0,0 @@ -.InBox { - padding: 0.2em; - border: 1px solid #000000; -} diff --git a/scribble-doc/scribblings/scribble/inbox.tex b/scribble-doc/scribblings/scribble/inbox.tex deleted file mode 100644 index 399a3ee2..00000000 --- a/scribble-doc/scribblings/scribble/inbox.tex +++ /dev/null @@ -1,2 +0,0 @@ - -\newcommand{\InBox}[1]{\fbox{#1}} diff --git a/scribble-doc/scribblings/scribble/info.rkt b/scribble-doc/scribblings/scribble/info.rkt deleted file mode 100644 index 2df098de..00000000 --- a/scribble-doc/scribblings/scribble/info.rkt +++ /dev/null @@ -1,14 +0,0 @@ -#lang info - -(define scribblings '(("scribble.scrbl" (multi-page) (racket-core -24)) - ("scribble-pp.scrbl" (multi-page) (tool)) - - ("demo-s1.scrbl" (keep-style no-search) (omit-start)) - ("demo-m1.scrbl" (multi-page keep-style no-search) (omit-start)) - ("demo-s2.scrbl" (keep-style) (omit-start)) - ("demo-m2.scrbl" (multi-page keep-style) (omit-start)) - - ("demo-manual-s1.scrbl" (keep-style no-search) (omit-start)) - ("demo-manual-m1.scrbl" (multi-page keep-style no-search) (omit-start)) - ("demo-manual-s2.scrbl" (keep-style) (omit-start)) - ("demo-manual-m2.scrbl" (multi-page keep-style) (omit-start)))) diff --git a/scribble-doc/scribblings/scribble/internals.scrbl b/scribble-doc/scribblings/scribble/internals.scrbl deleted file mode 100644 index 9c8ca238..00000000 --- a/scribble-doc/scribblings/scribble/internals.scrbl +++ /dev/null @@ -1,19 +0,0 @@ -#lang scribble/manual -@(require "utils.rkt") - -@title[#:tag "internals" #:style 'toc]{Low-Level Scribble API} - -@local-table-of-contents[] - -@include-section["layers.scrbl"] -@include-section["reader-internals.scrbl"] -@include-section["core.scrbl"] -@include-section["renderer.scrbl"] -@include-section["decode.scrbl"] -@include-section["doclang.scrbl"] -@include-section["docreader.scrbl"] -@include-section["xref.scrbl"] -@include-section["tag.scrbl"] -@include-section["blueboxes.scrbl"] -@include-section["config.scrbl"] - diff --git a/scribble-doc/scribblings/scribble/jfp.scrbl b/scribble-doc/scribblings/scribble/jfp.scrbl deleted file mode 100644 index 938d8e43..00000000 --- a/scribble-doc/scribblings/scribble/jfp.scrbl +++ /dev/null @@ -1,73 +0,0 @@ -#lang scribble/manual -@(require (except-in "utils.rkt" author) (for-label scribble/jfp)) - -@(define-syntax-rule (def base-author) - (begin - (require (for-label scribble/base)) - (define base-author @racket[author]))) -@(def base-author) - -@title{JFP Paper Format} - -@defmodulelang[scribble/jfp]{The @racketmodname[scribble/jfp] -language is like @racketmodname[scribble/base], but configured with -Latex style defaults to use the @filepath{jfp1.cls} class -file. The class file is not included with Scribble due to license -issues, but if the file is not manually installed into the -@racket[scribble/jfp] collections, then it is downloaded on demand to -@racket[(find-system-path 'addon-dir)].} - -Latex output with @racketmodname[scribble/jfp] uses a main-document -version supplied to @racket[title] as the short-form document name (to -be used in page headers). - -@defproc[(abstract [pre-content pre-content?] ...) block?]{ - -Generates a @tech{nested flow} for a paper abstract.} - -@defform[(include-abstract module-path)]{ - -Similar to @racket[include-section], but incorporates the document in the -specified module as an abstract. The document must have no title or -sub-parts.} - -@defproc[(author [name pre-content?] ...) - block?]{ - -A replacement for @base-author from @racketmodname[scribble/base].} - -@defproc[((author/short [short-name pre-content?] ...) [long-name pre-content?] ...) - block?]{ - -Like @racket[author], but allows the short-form names (to be used in -page headers) to be specified separately from the long-form name.} - -@deftogether[( -@defproc[(affiliation [place pre-content?] ...) element?] -@defproc[(affiliation-mark [mark pre-content?] ...) element?] -@defproc[(affiliation-sep) element?] -)]{ - -Use @racket[affiliation] within @racket[author] or the long-name part -of @racket[author/short] to specify affiliations after all authors. -If different authors have different affiliations, use -@racket[affiliation-mark] with a number after each author, and then -use @racket[affiliation-mark] before each different affiliation within -a single @racket[affiliation], using @racket[(affiliation-sep)] to -separate affiliations.} - -Examples: -@codeblock|{ -#lang scribble/jfp - -@title{My First Love Story} - -@((author/short "Romeo M. and Juliet C.") - "ROMEO" (affiliation-mark "1") - " and " - "JULIET" (affiliation-mark "2") - @affiliation[ - "House Montague" (affiliation-mark "1") - (affiliation-sep) - "House Capulet" (affiliation-mark "2")]) -}| diff --git a/scribble-doc/scribblings/scribble/layers.scrbl b/scribble-doc/scribblings/scribble/layers.scrbl deleted file mode 100644 index fc0fe6cf..00000000 --- a/scribble-doc/scribblings/scribble/layers.scrbl +++ /dev/null @@ -1,239 +0,0 @@ -#lang scribble/doc -@(require scribble/manual scribble/bnf "utils.rkt") - -@title[#:tag "layers"]{Scribble Layers} - -Scribble is made of independently usable parts. For example, the -Scribble reader can be used in any situation that requires lots of -free-form text. You can also skip Scribble's special reader support, -and instead use the document-generation structure directly. - -@; ---------------------------------------------------------------------- - -@section{Typical Composition} - -A Scribble document normally starts - -@racketmod[ -scribble/manual -] - -but it could also start - -@racketmod[ -scribble/base -] - -or - -@racketmod[ -scribble/doc -] - -The last one introduces the smallest number of typesetting bindings in -the document body. Using @racketmodname[scribble/base] after -@hash-lang[] is the same as using @racketmodname[scribble/doc] plus -@racket[(require scribble/base)], and using -@racketmodname[scribble/manual] after @hash-lang[] is the same as using -@racketmodname[scribble/doc] plus @racket[(require scribble/manual)]. - -Besides making the file a module, each of the @hash-lang[] -declarations selects the Scribble reader (instead of the usual Racket -reader), and it starts the body of the file in ``text'' mode. The -reader layer mostly leaves text alone, but @tech{@"@"-forms} escape -to S-expression mode. - -A module written as - -@verbatim[#:indent 2]|{ - #lang scribble/doc - @(require scribble/manual) - - @(define to-be "To Be") - - @title{@|to-be| or Not @|to-be|} - - @bold{That} is the question. - Whether 'tis nobler... -}| - -reads as - -@racketblock[ -(module #,(nonterm "name") scribble/doc - (require scribble/manual) - "\n" - (define to-be "To Be") "\n" - "\n" - (title to-be " or Not " to-be) "\n" - "\n" - (bold "That") " is the question." "\n" - "Whether 'tis nobler..." "\n") -] - -As shown in this example, the read result is a module whose content -mingles text and definitions. The @racketmodname[scribble/doc] -language lifts definitions, @racket[require]s, and @racket[provide]s -to the beginning of the module, while everything else is collected -into a document bound to the provided identifier @racket[doc]. That -is, the module is transformed to something like this: - -@racketblock[ -(module #,(nonterm "name") racket/base - (require scribble/decode - scribble/manual) - (define to-be "To Be") - (define doc - (decode - "\n" "\n" "\n" - (title to-be " or Not " to-be) "\n" - "\n" - (bold "That") " is the question." "\n" - "Whether 'tis nobler..." "\n")) - (provide doc)) -] - -The @racket[decode] function produces a @racket[part] structure -instance that represents the document. To build the @racket[part] -instance, it inspects its arguments to find a @racket[title-decl] -value created by @racket[title] to name the part, @racket[part-start] -values created by @racket[section] to designate sub-parts, etc. - -A @racket[part] is the input to a rendering back-end, such as the HTML -renderer. All renderers recognize a fixed structure hierarchy: the -content of a part is a @defterm{flow}, which is a sequence of -@defterm{flow elements}, such as paragraphs and tables; a table, in -turn, consists of a list of list of flows; a paragraph is a list of -@defterm{elements}, which can be instances of the @racket[element] -structure type, plain strings, or certain special symbols. - -The value bound to @racket[doc] in the example above is something like - -@racketblock[ -(make-part .... - (list "To Be" " or Not " "To Be") (code:comment "title") - .... - (make-flow - (list - (make-paragraph - (list (make-element 'bold (list "That")) - " is the question." "\n" - "Whether " 'rsquo "tis nobler...")))) - ....) -] - -Notice that the @litchar{'} in the input's @litchar{'tis} has turned -into @racket['rsquo] (rendered as a curly apostrophe). The conversion to use -@racket['rsquo] was performed by @racket[decode] via -@racket[decode-flow] via @racket[decode-paragraph] via -@racket[decode-content] via @racket[decode-string]. - -In contrast, @racket[(make-element 'bold (list "That"))] was produced -by the @racket[bold] function. The @racket[decode] operation is a -function, not a syntactic form, and so @racket[bold] has control over -its argument before @racket[decode] sees the result. Also, decoding -traverses only immediate string arguments. - -As it turns out, @racket[bold] also decodes its argument, because the -@racket[bold] function is implemented as - -@racketblock[ -(define (bold . strs) - (make-element 'bold (decode-content strs))) -] - -The @racket[verbatim] function, however, does not decode its content, -and instead typesets its text arguments directly. - -A document module can construct elements directly using -@racket[make-element], but normally functions like @racket[bold] and -@racket[verbatim] are used to construct them. In particular, the -@racketmodname[scribble/manual] library provides many functions and -forms to typeset elements and flow elements. - -The @racket[part] structure hierarchy includes built-in element types -for setting hyperlink targets and references. Again, this machinery is -normally packaged into higher-level functions and forms, such as -@racket[secref], @racket[defproc], and @racket[racket]. - -@; ---------------------------------------------------------------------- - -@section{Layer Roadmap} - -Working roughly from the bottom up, the Scribble layers are: - -@itemize[ - - @item{@racketmodname[scribble/reader]: A reader that extends the - syntax of Racket with @tech{@"@"-forms} for conveniently embedding a - mixin of text and escapes. See @secref["reader"].} - - @item{@racketmodname[scribble/core]: A set of document datatypes - and utilities that define the basic layout and processing of a - document. For example, the @racket[part] datatype is defined in - this layer. See @secref["core"].} - - @item{@racketmodname[scribble/base-render] with - @racketmodname[scribble/html-render], - @racketmodname[scribble/latex-render], or - @racketmodname[scribble/text-render]: A base renderer and - mixins that generate documents in various formats from - instances of the @racketmodname[scribble/struct] datatypes. See - @secref["renderer"].} - - @item{@racketmodname[scribble/decode]: Processes a stream of text, - section-start markers, etc. to produce instances of the - @racketmodname[scribble/core] datatypes. See - @secref["decode"].} - - @item{@racketmodname[scribble/doclang]: A language to be used for the - initial import of a module; processes the module top level - through @racketmodname[scribble/decode], and otherwise provides - all of @racketmodname[racket/base]. See @secref["doclang"].} - - @item{@racketmodname[scribble/doc]: A language that combines - @racketmodname[scribble/reader] with - @racketmodname[scribble/doclang]. See @secref["docreader"].} - - @item{@racketmodname[scribble/base]: A library of basic document - operators---such as @racket[title], @racket[section], and - @racket[secref]---for use with @racketmodname[scribble/decode] - and a renderer. This library name also can be used as a - language, where it combines @racketmodname[scribble/doc] with - the exports of @racketmodname[scribble/base]. See - @secref["base"].} - - @item{@racketmodname[scribble/racket]: A library of functions for - typesetting Racket code. See @secref["scheme"]. These functions - are not normally used directly, but instead used through - @racketmodname[scribble/manual].} - - @item{@racketmodname[scribble/manual]: A library of functions for - writing Racket documentation; re-exports - @racketmodname[scribble/base]. Also, the - @racketmodname[scribble/manual-struct] library provides types - for index-entry descriptions created by functions in - @racketmodname[scribble/manual]. See @secref["manual"].} - - @item{@racketmodname[scribble/eval]: A library of functions for - evaluating code at document-build time, especially for showing - examples. See @secref["eval"].} - - @item{@racketmodname[scribble/bnf]: A library of support functions - for writing grammars. See @secref["bnf"].} - - @item{@racketmodname[scribble/xref]: A library of support functions - for using cross-reference information, typically after a - document is rendered (e.g., to search). See @secref["xref"].} - - @item{@racketmodname[scribble/text]: A language that uses - @racketmodname[scribble/reader] preprocessing text files.} - -] - -The @exec{scribble} command-line utility generates output with a -specified renderer. More specifically, the executable installs a -renderer, loads the modules specified on the command line, extracts -the @racket[doc] export of each module (which must be an instance of -@racket[part]), and renders each---potentially with links that span -documents. diff --git a/scribble-doc/scribblings/scribble/lncs.scrbl b/scribble-doc/scribblings/scribble/lncs.scrbl deleted file mode 100644 index 531f031a..00000000 --- a/scribble-doc/scribblings/scribble/lncs.scrbl +++ /dev/null @@ -1,97 +0,0 @@ -#lang scribble/manual -@(require (except-in "utils.rkt" author) - (except-in (for-label scribble/lncs/lang) #%module-begin)) - -@(define-syntax-rule (def base-author) - (begin - (require (for-label scribble/base)) - (define base-author @racket[author]))) -@(def base-author) - -@title{LNCS Paper Format} - -@defmodulelang[scribble/lncs #:use-sources (scribble/lncs/lang)]{ - The @racketmodname[scribble/lncs] -language is like @racketmodname[scribble/base], but configured with -Latex style defaults to use the @filepath{llncs.cls} class -file. The class file is not included with Scribble due to license issues, -but if the file is not manually installed into the -@racket[scribble/lncs] collection, then it is downloaded on demand to -@racket[(find-system-path 'addon-dir)].} - -@defproc[(abstract [pre-content pre-content?] ...) block?]{ - -Generates a @tech{nested flow} for a paper abstract.} - -@defform[(include-abstract module-path)]{ - -Similar to @racket[include-section], but incorporates the document in the -specified module as an abstract. The document must have no title or -sub-parts.} - -@defform/subs[#:literals (author) - (authors auth ...) - ([auth (author pre-content-expr ...) - (author #:inst str-expr pre-content-expr ...)]) - #:contracts ([pre-content-expr pre-content?] - [str-expr string?])]{ - -A replacement for @base-author from @racketmodname[scribble/base]. - -The @racket[#:inst] should be a number that matches up to one of the -arguments to @racket[institutes]. -} - - -@defidform[author]{For use only in @racket[authors].} - - -@defform[#:literals (institute) - (institutes (institute pre-content-expr ...) ...) - #:contracts ([pre-content-expr pre-content?])]{ - -The @racket[pre-content-expr]s are used as the institutions of the authors. - -} - -@defidform[institute]{For use only in @racket[institutes].} - -@defform[(email pre-content-expr ...)]{ - Specifies an email address; must be used inside @racket[institute]. -} - -@section{Example} - -Here is an example of a paper written in the LNCS format: - -@margin-note{For more randomly generated papers, see SCIgen: - @url["http://pdos.csail.mit.edu/scigen"]} - -@codeblock[#:keep-lang-line? #t]|{ -#lang scribble/lncs - -@authors[@author[#:inst "1"]{Lauritz Darragh} - @author[#:inst "2"]{Nikolaj Kyran} - @author[#:inst "2"]{Kirsten Gormlaith} - @author[#:inst "2"]{Tamaz Adrian}] - -@institutes[ - @institute["University of Southeast Boston" - @linebreak[] - @email|{darragh@cs.seboston.edu}|] - @institute["University of Albion" - @linebreak[] - @email|{{nkyran,gorm,tamaz}@cs.albion.ac.uk}|]] - -@title{Arak: Low-Energy, Interposable Theory} - -@abstract{The implications of client-server symmetries have been -far-reaching and pervasive. Given the current status of -constant-time theory, mathematicians daringly desire the synthesis -of rasterization, which embodies the essential principles of -algorithms. In this work, we describe a client-server tool for -investigating flip-flop gates (Arak), verifying that the -producer-consumer problem can be made homogeneous, secure, and -wireless.} -}| - diff --git a/scribble-doc/scribblings/scribble/lp-ex-doc.scrbl b/scribble-doc/scribblings/scribble/lp-ex-doc.scrbl deleted file mode 100644 index c23d6e8e..00000000 --- a/scribble-doc/scribblings/scribble/lp-ex-doc.scrbl +++ /dev/null @@ -1,4 +0,0 @@ -#lang scribble/doc -@(require scribble/lp-include) - -@lp-include["lp-ex.rkt"] diff --git a/scribble-doc/scribblings/scribble/lp-ex.rkt b/scribble-doc/scribblings/scribble/lp-ex.rkt deleted file mode 100644 index b23f1a03..00000000 --- a/scribble-doc/scribblings/scribble/lp-ex.rkt +++ /dev/null @@ -1,18 +0,0 @@ -#lang scribble/lp2 -@(require scribble/manual) - -Literate programs have chunks of code, like this one: - -@chunk[ - (define (f x) - )] - -and this one: - -@chunk[ - (* x x)] - -that, when assembled, produce a complete program, in this case: - -@racketblock[(define (f x) - (* x x))] diff --git a/scribble-doc/scribblings/scribble/lp.css b/scribble-doc/scribblings/scribble/lp.css deleted file mode 100644 index 638efcd2..00000000 --- a/scribble-doc/scribblings/scribble/lp.css +++ /dev/null @@ -1,4 +0,0 @@ -.LPBoxed { - padding: 1ex; - border: 1px solid #000000; -} diff --git a/scribble-doc/scribblings/scribble/lp.scrbl b/scribble-doc/scribblings/scribble/lp.scrbl deleted file mode 100644 index a3a5aeb0..00000000 --- a/scribble-doc/scribblings/scribble/lp.scrbl +++ /dev/null @@ -1,136 +0,0 @@ -#lang scribble/doc -@(require scribble/manual scribble/core scribble/html-properties - scribble/latex-properties - racket/runtime-path - racket/file - "utils.rkt" - (prefix-in lp-ex: "lp-ex-doc.scrbl") - (for-label scribble/lp-include scribble/lp)) - -@title[#:tag "lp" - #:style (make-style #f - (list (make-css-addition "lp.css") - (make-tex-addition "lp.tex"))) - ]{Literate Programming} - -Programs written using @racketmodname[scribble/lp2] are simultaneously -two things: a program and a document describing the program: - -@itemlist[ - - @item{When the program is run, all of the @racket[chunk] expressions - are collected and stitched together into a program, and the - rest of the module is discarded.} - - @item{When the program is provided to Scribble---or used through - @racket[include-section] in another Scribble document with a - @racket[(submod ... doc)] module path---the entire contents of - the module are treated like an ordinary Scribble document, - where @racket[chunk]s are typeset in a manner similar to - @racket[codeblock].} - -] - -@(define-runtime-path lp-ex "lp-ex.rkt") - -For example, consider this program: - -@(codeblock (file->string lp-ex)) - -When this file is @racket[require]d in the normal manner, it defines a -function @racket[f] that squares its argument, and the documentation -is ignored. When it is rendered as a Scribble document, the output -looks like this: - -@(make-nested-flow - (make-style "LPBoxed" null) - (part-blocks lp-ex:doc)) - -@; ------------------------------------------------------------ - -@section{@racketmodname[scribble/lp2] Language} - -@defmodulelang[scribble/lp2 #:use-sources (scribble/lp)]{The -@racketmodname[scribble/lp] language provides core support for -literate programming. It is read like a @racketmodname[scribble/base] -program, but its bindings extend @racketmodname[racket/base] with two -forms: @racket[chunk] and @racket[CHUNK].} - -More precisely, a module in @racketmodname[scribble/lp2] has its -@racketmodname[racket/base]-like content in a @racketidfont{doc} -submodule, which is recognized by tools such as @exec{raco scribble}. -The content of the @racket[chunk] and @racket[CHUNK] forms is -stitched together as the immediate content of the module. - -The @racket[chunk] and @racket[CHUNK] content is discovered by first -@racket[expand]ing the module as written. The content is collected -into a new module, and then the original module content is placed into -a @racket[doc] submodule that is expanded (so that the content is -effectively re-expanded). The @racketidfont{doc} submodule is declared -with @racket[module*]. - -@history[#:added "1.8" - #:changed "1.17" @elem{Declared the @racketidfont{doc} submodule with - @racket[module*] instead of @racket[module].}] - -@defform[(chunk id form ...)]{ - - Introduces a chunk, binding @racket[id] for use in other - chunks. Normally, @racket[id] starts with @litchar{<} and ends with - @litchar{>}. - - When running the enclosing program, only the code inside the - chunks is run; the rest is ignored. - - If @racket[id] is @racketidfont{<*>}, then this chunk is - used as the main chunk in the file. If @racketidfont{<*>} - is never used, then the first chunk in the file is treated - as the main chunk. If some chunk is not referenced from - the main chunk (possibly indirectly via other chunks that - the main chunk references), then it is not included in the - program and thus is not run. - - The @racket[form]s are typeset using @racket[racketblock], so - @racket[code:comment], etc., can be used to adjust the output. - Those output-adjusting forms are stripped from each @racket[form] - for running the program. - -@history[#:changed "1.17" @elem{Strip @racket[code:comment], etc., for running.}]} - -@defform[(CHUNK id form ...)]{ - - Like @racket[chunk], but typesets with @racket[RACKETBLOCK], so @racket[unsyntax] - can be used normally in each @racket[form]. To escape, - use @racket[UNSYNTAX]. - -} - -@; ------------------------------------------------------------ - -@section{@racketmodname[scribble/lp] Language} - -@defmodulelang[scribble/lp]{Programs written using the older -@racketmodname[scribble/lp] language are similar to -@racketmodname[scribble/lp2] programs, except that the module cannot -be provided directly to Scribble. Instead, the document content must be -extracted using @racket[lp-include].} - -The @racketmodname[scribble/lp] language effectively binds only -@racket[chunk] and @racket[CHUNK], while all other bindings for -documentation are taken from the context where @racket[lp-include] is -used. - -@; ------------------------------------------------------------ - -@section{@racketmodname[scribble/lp-include] Module} - -@defmodule[scribble/lp-include]{The -@racketmodname[scribble/lp-include] library is normally used within a -Scribble document---that is, a module that starts with something like -@racket[#, @hash-lang[] @racketmodname[scribble/base]] or @racket[#, @hash-lang[] -@racketmodname[scribble/manual]], instead of @racket[#, @hash-lang[] @racketmodname[racket]].} - -@defform[(lp-include filename)]{ -Includes the source of @racket[filename] as the typeset version of the literate -program. -} diff --git a/scribble-doc/scribblings/scribble/lp.tex b/scribble-doc/scribblings/scribble/lp.tex deleted file mode 100644 index fcbaecac..00000000 --- a/scribble-doc/scribblings/scribble/lp.tex +++ /dev/null @@ -1,3 +0,0 @@ - -\usepackage{framed} -\newenvironment{LPBoxed}{\begin{framed}}{\end{framed}} diff --git a/scribble-doc/scribblings/scribble/manual-stub.scrbl b/scribble-doc/scribblings/scribble/manual-stub.scrbl deleted file mode 100644 index 4d929d7f..00000000 --- a/scribble-doc/scribblings/scribble/manual-stub.scrbl +++ /dev/null @@ -1,8 +0,0 @@ -#lang scribble/manual -@(require "utils.rkt" (for-label scribble/sigplan)) - -@title{Racket Manual Format} - -The @racketmodname[scribble/manual] language is a major component of -Scribble, and it is documented in its own chapter: -@secref["plt-manuals"]. diff --git a/scribble-doc/scribblings/scribble/manual.scrbl b/scribble-doc/scribblings/scribble/manual.scrbl deleted file mode 100644 index 31af1260..00000000 --- a/scribble-doc/scribblings/scribble/manual.scrbl +++ /dev/null @@ -1,2185 +0,0 @@ -#lang scribble/doc -@(require scribble/manual "utils.rkt" - (for-syntax racket/base) - (for-label scribble/manual-struct - version/utils - syntax/quote)) - -@(define lit-ellipses (racket ...)) -@(define lit-ellipses+ (racket ...+)) - -@title[#:tag "manual" #:style 'toc]{Manual Forms} - -@defmodulelang[scribble/manual]{The @racketmodname[scribble/manual] -language provides all of @racketmodname[scribble/base] plus many -additional functions that are specific to writing Racket -documentation. It also associates @tech{style properties} with the -generated @racket[doc] export to select the default Racket manual -style for rendering; see @secref["manual-render-style"] for more -information. - -The @racketmodname[scribble/manual] name can also be used as a library -with @racket[require], in which case it provides all of the same -bindings, but without setting the reader or setting the default -rendering format to the Racket manual format.} - - -@local-table-of-contents[] - -@; ------------------------------------------------------------------------ -@section[#:tag "scribble:manual:code"]{Typesetting Code} - -The @racket[codeblock] and @racket[code] forms (see -@secref["all-code"]) typeset code verbatim, adding a layer of color to -the code based on the same syntax-coloring parsers that are used by -DrRacket. Input that is parsed as an identifier is further given a -lexical context and hyperlinked via @racket[for-label] imports. - -The @racket[racketblock] and @racket[racket] forms (see -@secref["racket-code"]) typeset S-expression code roughly verbatim, -but roughly by quoting the source term with -@racket[syntax]. Identifiers in the quoted S-expression are -hyperlinked via @racket[for-label] imports. - -The two different approaches to typesetting code---@racket[codeblock] -and @racket[code] versus @racket[racketblock] and -@racket[racket]---have different advantages and disadvantages: - -@itemlist[ - - @item{The @racket[codeblock] and @racket[code] forms work with - non-S-expression syntax, and they give authors more control - over output (e.g., the literal number @code{2/4} is not - normalized to @racket[2/4]). The @racket[codeblock] and - @racket[code] forms do not yet support escapes to Scribble - element mode, and they cannot adapt spacing based on the width - of elements in escapes.} - - @item{The @racket[racketblock] and @racket[racket] forms are more - efficient and allow escapes to Scribble element mode. The - @racket[racketblock] and @racket[racket] forms are tied to - S-expression syntax, however, and they are based on a syntax - representation that tends to normalize source terms (e.g., the - literal number @code{2/4} is normalized to @racket[2/4]).} - -] - -@; ---------------------------------------- -@subsection[#:tag "all-code"]{@hash-lang[]-Specified Code} - -@defform/subs[(codeblock option ... str-expr ...+) - ([option (code:line #:keep-lang-line? keep-expr) - (code:line #:indent indent-expr) - (code:line #:expand expand-expr) - (code:line #:context context-expr) - (code:line #:line-numbers line-number-expr) - (code:line #:line-number-sep line-number-sep-expr)]) - #:contracts ([keep-expr any/c] - [indent-expr exact-nonnegative-integer?] - [expand-expr (or/c #f (syntax? . -> . syntax?))] - [context-expr (or/c #f syntax?)] - [line-number-expr (or/c #f exact-nonnegative-integer?)] - [line-number-sep-expr exact-nonnegative-integer?])]{ - -Parses the code formed by the strings produced by the -@racket[str-expr]s as a Racket module (roughly) and produces a -@tech{block} that typesets the code inset via @racket[nested] with the -style @racket['code-inset]. See also @racket[typeset-code]. - -The @racket[str-expr]s should normally start with @hash-lang[] to -determine the reader syntax for the module, but the resulting -``module'' need not expand or compile---except as needed by -@racket[expand-expr]. If @racket[expand-expr] is omitted or produces -false, then the input formed by @racket[str-expr] is read until an -end-of-file is encountered, otherwise a single form is read from the -input. - -When @racket[keep-expr] produces a true value (the default), the first -line in the input (which is typically @hash-lang[]) is preserved in -the typeset output, otherwise the first line is dropped. The typeset -code is indented by the amount specified by @racket[indent-expr], -which defaults to @racket[0]. - -When @racket[expand-expr] produces @racket[#f] (which is the default), -identifiers in the typeset code are colored and linked based on -for-label bindings in the lexical environment of the syntax object -provided by @racket[context-expr]. The default @racket[context-expr] -has the same lexical context as the first @racket[str-expr]. -When @racket[line-number-expr] is true, line number is enabled starting -from @racket[line-number-expr], and @racket[line-number-sep] controls -the separation (in spaces; defaults to 1) between the line numbers and -code. - -When @racket[expand-expr] produces a procedure, it is used to -macro-expand the parsed program, and syntax coloring is based on the -parsed program. - -For example, - -@codeblock[#:keep-lang-line? #f]|<|{ - #lang scribble/manual - @codeblock|{ - #lang scribble/manual - @codeblock{ - #lang scribble/manual - @title{Hello} - } - }| -}|>| - -produces the typeset result - - @codeblock|{ - #lang scribble/manual - @codeblock{ - #lang scribble/manual - @title{Hello} - } - }| - -} - - -@defform[(codeblock0 option ... str-expr ...+)]{ - -Like @racket[codeblock], but without the @racket['code-inset] -@racket[nested] wrapper.} - - -@defform/subs[(code option ... str-expr ...+) - ([option (code:line #:lang lang-line-expr) - (code:line #:expand expand-expr) - (code:line #:context context-expr)]) - #:contracts ([lang-line-expr (or/c #f string?)] - [expand-expr (or/c #f (syntax? . -> . syntax?))] - [context-expr (or/c #f syntax?)])]{ - -Like @racket[codeblock], but produces @tech{content} instead of a -@tech{block}. No @hash-lang[] line should appear in the string content; -instead, it should be provided @racket[#:lang] (as a string -without @racket["#lang "]) if needed, and the @hash-lang[] line is always stripped -from the output when provided. Also, each newline in @racket[str-expr]s is collapsed -along with all surrounding whitespace to a single space. - -For example, - -@codeblock[#:keep-lang-line? #f]|<|{ - #lang scribble/manual - This is @code[#:lang "at-exp racket"]|{@bold{Hi}}|'s result: - @bold{Hi}. -}|>| - -produces the typeset result - -@nested[#:style 'inset]{ - This is @code[#:lang "at-exp racket"]|{@bold{Hi}}|'s result: - @bold{Hi}. -} - -} - -@defproc[(typeset-code [#:context context (or/c #f syntax?) #f] - [#:expand expand (or/c #f (syntax? . -> . syntax?)) #f] - [#:indent indent exact-nonnegative-integer? 2] - [#:keep-lang-line? keep? any/c #t] - [#:line-numbers line-numbers (or/c #f exact-nonnegative-integer?) #f] - [#:line-number-sep line-number-sep exact-nonnegative-integer? 1] - [#:block? block? #t] - [strs string?] ...) - block?]{ - A function-based version of @racket[codeblock], allowing you to compute the @racket[strs] arguments. - - Unlike @racket[codeblock], the default @racket[context] argument (@racket[#f]) implies that - the context is untouched. The other arguments are treated the same way. -} - -@; ---------------------------------------- -@subsection[#:tag "racket-code"]{Racket Code} - -@defform/subs[(racketblock maybe-escape datum ...) - ([maybe-escape code:blank - (code:line #:escape escape-id)])]{ - -Typesets the @racket[datum] sequence as a table of Racket code -inset via @racket[nested] with the style @racket['code-inset]. The -source locations of the @racket[datum]s determine the generated -layout. For example, - -@racketblock[ -(racketblock - (define (loop x) - (loop (not x)))) -] - -produces the output - -@racketblock[ -(define (loop x) - (loop (not x))) -] - -with the @racket[(loop (not x))] indented under @racket[define], -because that's the way it is idented the use of @racket[racketblock]. -Source-location span information is used to preserve @racket[#true] -versus @racket[#t] and @racket[#false] versus @racket[#f]; span -information is also used heuristically to add @racketvalfont{#i} -to the start of an inexact number if its printed form would otherwise -be two characters shorter than the source; -syntax-object properties are used to preserve square brackets and -curly braces versus parentheses; otherwise, using syntax objects tends -to normalize the form of S-expression elements, such as rendering -@code{2/4} as @racket[2/4]. When source-location information is not -available, such as when it is lost by bytecode-compiled macros, -spacing is inserted in the same style (within a single line) as the -@racket[racket] form. - -@margin-note{See also @racket[quote-syntax/keep-srcloc] for use in a -macro to preserve source-location information in a template.} - -In the above example, @racket[define] is typeset as a keyword (in black) -and as a hyperlink to @racket[define]'s definition in the reference -manual, because this document was built using a @racket[for-label] binding of -@racket[define] (in the source) that matches a definition in the -reference manual. Similarly, @racket[not] is a hyperlink to its -definition in the reference manual. - -Like other forms defined via @racket[define-code], -@racket[racketblock] expands identifiers that are bound as -@tech{element transformers}. - -An @racket[#:escape] clause specifies an identifier to escape back to -an expression that produces an @racket[element]. By default, -the escape identifier is @racket[unsyntax]. For example, - -@racketblock[ -#:escape nonesuch -(racketblock - (+ 1 (unsyntax (elem (racket x) (subscript "2"))))) -] - -produces - -@racketblock[ -(+ 1 (unsyntax (elem (racket x) (subscript "2")))) -] - -The @racket[escape-id] that defaults to @racket[unsyntax] is regonized via -@racket[free-identifier=?], so a binding can hide the escape behavior: - -@RACKETBLOCK[ -(racketblock - (let ([(UNSYNTAX (racket unsyntax)) #f]) - (racketblock - (syntax (+ 1 (unsyntax x)))))) -] - -The @racket[RACKETBLOCK] form's default escape is @racket[UNSYNTAX] -instead of @racket[unsyntax]. - -A few other escapes are recognized symbolically: - -@itemize[ - - @item{@racket[(#,(indexed-racket code:line) _datum ...)] typesets as the - sequence of @racket[_datum]s (i.e., without the - @racket[code:line] wrapper).} - - @item{@racket[(#,(indexed-racket code:comment) _content)] typesets like - @racket[_content], but colored as a comment and prefixed with a - semi-colon. A typical @racket[_content] escapes from - Racket-typesetting mode using @racket[unsyntax] and - produces a string, an element using @racket[elem], - or a paragraph using @racket[t]: - - @verbatim[#:indent 2]|{ - (code:comment @#,elem{this is a comment}) - }| - - (Note that @litchar|{@#,foo{...}}| reads as - @RACKET[(unsyntax (foo "..."))].) - } - - @item{@racket[(#,(indexed-racket code:contract) _datum ...)] typesets like - the sequence of @racket[_datum]s (including its coloring), but prefixed with a - semi-colon.} - - @item{@as-index[@racketidfont{code:blank}] typesets as a blank space.} - - @item{@racket[(#,(indexed-racket code:hilite) _datum)] typesets like - @racket[_datum], but with a background highlight.} - - @item{@racket[(#,(indexed-racket code:quote) _datum)] typesets like - @racket[(@#,racketidfont{quote} _datum)], but without rendering the - @racketidfont{quote} as @litchar{'}.} - - @item{@racketidfont{_}@racket[_id] typesets as @racket[id], but - colored as a variable (like @racket[racketvarfont]); this - escape applies only if @racketidfont{_}@racket[_id] has no - for-label binding and is not specifically colored as a subform - non-terminal via @racket[defform], a variable via - @racket[defproc], etc.} - -] - -See also @racketmodname[scribble/comment-reader]. - -@history[#:changed "1.9" @elem{Added heuristic for adding @racketvalfont{#i} to inexact numbers.}]} - -@defform[(RACKETBLOCK maybe-escape datum ...)]{Like @racket[racketblock], but with -the default expression escape @racket[UNSYNTAX] instead of @racket[unsyntax].} - -@defform[(racketblock0 maybe-escape datum ...)]{Like @racket[racketblock], but -without insetting the code via @racket[nested].} - -@defform[(RACKETBLOCK0 maybe-escape datum ...)]{Like @racket[RACKETBLOCK], but -without insetting the code via @racket[nested].} - -@deftogether[( -@defform[(racketresultblock maybe-escape datum ...)] -@defform[(racketresultblock0 maybe-escape datum ...)] -@defform[(RACKETRESULTBLOCK maybe-escape datum ...)] -@defform[(RACKETRESULTBLOCK0 maybe-escape datum ...)] -)]{ - -Like @racket[racketblock], etc., but colors the typeset text as a -result (i.e., a single color with no hyperlinks) instead of code. - -Unlike @racket[racketblock], @racket[racketresultblock] and -@racket[RACKETRESULTBLOCK] implement indentation by adding an -@racket[(hspace 2)] to the start of each line, instead of using -@racket[nested] with the @racket['code-inset] style. To get formatting -more like @racket[racketblock] and @racket[racketinput], use -@racket[(nested #:style 'code-inset (racketresultblock0 datum ...))] -instead of @racket[(racketresultblock datum ...)].} - -@deftogether[( -@defform[(racketinput maybe-escape datum ...)] -@defform[(RACKETINPUT maybe-escape datum ...)] -)]{Like @racket[racketblock] and @racket[RACKETBLOCK], but the -@racket[datum]s are typeset after a prompt representing a REPL.} - -@deftogether[( -@defform[(racketinput0 maybe-escape datum ...)] -@defform[(RACKETINPUT0 maybe-escape datum ...)] -)]{ -Like @racket[racketinput] and @racket[RACKETINPUT], but -without insetting the code via @racket[nested].} - -@defform/subs[(racketmod maybe-file maybe-escape lang datum ...) - ([maybe-file code:blank - (code:line #:file filename-expr)] - [maybe-escape code:blank - (code:line #:escape escape-id)])]{ - -Like @racket[racketblock], but the @racket[datum] are typeset inside a -@racketmodfont{#lang}-form module whose language is @racket[lang]. - -The source location of @racket[lang] (relative to the body -@racket[datum]s) determines the relative positioning of the -@racketmodfont{#lang} line in the typeset output. So, line up -@racket[lang] with the left end of the content code. - -If @racket[#:file] is provided, then the code block is typeset using -@racket[filebox] with @racket[filename-expr] as the filename -argument.} - -@defform[(racketmod0 maybe-file maybe-escape lang datum ...)]{ -Like @racket[racketmod], but -without insetting the code via @racket[nested].} - -@defform[(racket maybe-escape datum ...)]{Like @racket[racketblock], but typeset on -a single line and wrapped with its enclosing paragraph, independent of -the formatting of @racket[datum].} - -@defform[(RACKET maybe-escape datum ...)]{Like @racket[racket], but with the -@racket[UNSYNTAX] escape like @racket[racketblock].} - -@defform[(racketresult maybe-escape datum ...)]{Like @racket[racket], but typeset -as a result (i.e., a single color with no hyperlinks).} - -@defform[(racketid maybe-escape datum ...)]{Like @racket[racket], but typeset -as an unbound identifier (i.e., no coloring or hyperlinks).} - -@deftogether[( -@defform[(schemeblock maybe-escape datum ...)] -@defform[(SCHEMEBLOCK maybe-escape datum ...)] -@defform[(schemeblock0 maybe-escape datum ...)] -@defform[(SCHEMEBLOCK0 maybe-escape datum ...)] -@defform[(schemeinput maybe-escape datum ...)] -@defform[(schememod lang maybe-escape datum ...)] -@defform[(scheme maybe-escape datum ...)] -@defform[(SCHEME maybe-escape datum ...)] -@defform[(schemeresult maybe-escape datum ...)] -@defform[(schemeid maybe-escape datum ...)] -)]{ - -Compatibility aliases. Each @racketidfont{scheme...} name is an alias for the -corresponding @racketidfont{racket...} binding.} - -@; ------------------------------------------------------------------------ - -@subsection{Preserving Comments} - -@defmodulereader[scribble/comment-reader] - -As a reader module, @racketmodname[scribble/comment-reader] reads a -single S-expression that contains @litchar{;}-based comment lines, and -it wraps the comments with @racket[code:comment] for use with forms -like @racket[racketblock]. More precisely, -@racketmodname[scribble/comment-reader] extends the current reader to -adjust the parsing of @litchar{;}. - -For example, within a Scribble document that imports -@racketmodname[scribble/manual], - -@verbatim[#:indent 2]|{ - @#reader scribble/comment-reader - (racketblock - ;; This is not a pipe - (make-pipe) - ) -}| - -generates - -@#reader scribble/comment-reader - (racketblock - ;; This is not a pipe - (make-pipe) - ) - -The initial @litchar["@"] is needed above to shift into S-expression -mode, so that @racketmetafont{#reader} is recognized as a reader -declaration instead of literal text. Also, the example uses -@racket[(racketblock ....)] instead of -@racketmetafont["@"]@racket[racketblock]@racketmetafont["["]@racket[....]@racketmetafont["]"] -because the @"@"-reader would drop comments within the -@racket[racketblock] before giving -@racketmodname[scribble/comment-reader] a chance to convert them. - -The implementation of @racketmodname[scribble/comment-reader] uses @racket[unsyntax] to -typeset comments. When using @racketmodname[scribble/comment-reader] -with, for instance, @racket[RACKETBLOCK], @racket[unsyntax] does not escape, -since @racket[RACKETBLOCK] uses @racket[UNSYNTAX] as its escape form. You can -declare an escape identifier for -@racketmodname[scribble/comment-reader] with @racket[#:escape-id]. For example, - -@verbatim[#:indent 2]|{ - @#reader scribble/comment-reader #:escape-id UNSYNTAX - (RACKETBLOCK - (define-syntax (m stx) - (syntax-case stx () - [(_ x) - ;; Well this was silly - #`(#,x)])) - ) -}| - -generates - - @#reader scribble/comment-reader #:escape-id UNSYNTAX - (RACKETBLOCK - (define-syntax (m stx) - (syntax-case stx () - [(_ x) - ;; Well this was silly - #`(#,x)])) - ) - -@; ------------------------------------------------------------------------ -@subsection{Code Fonts and Styles} - -@defform*[((racketmodname datum maybe-indirect) - (racketmodname ((unsyntax (racket unsyntax)) expr) maybe-indirect)) - #:grammar ([maybe-indirect code:blank - #:indirect])]{ - -Like @racket[racket], but typeset as a module path. If @racket[datum] -is an identifier or @racket[expr] produces a symbol, then it is -hyperlinked to the module path's definition as created by -@racket[defmodule]. - -If @racket[#:indirect] is specified, then the hyperlink is given the -@racket['indirect-link] @tech{style property}, which makes the -hyperlink's resolution in HTML potentially delayed; see -@racket['indirect-link] for @racket[link-element].} - -@defform[(racketmodlink datum pre-content-expr ...)]{ -Like @racket[racketmod], but separating the module path to link -from the content to be linked. The @racket[datum] module path is always -linked, even if it is not an identifier.} - -@defproc[(litchar [str string?] ...) element?]{Typesets @racket[str]s as a -representation of literal text. Use this when you have to talk about -the individual characters in a stream of text, as when documenting -a reader extension.} - -@defproc[(racketfont [pre-content pre-content?] ...) element?]{The -same as @racket[(tt pre-content ...)], which applies the @racket['tt] -style to immediate strings and symbols among the @racket[pre-content] -arguments. Beware that @racket[pre-content] is @racket[decode]d as -usual, making @racket[racketfont] a poor choice for typesetting -literal code.} - -@defproc[(racketplainfont [pre-content pre-content?] ...) element?]{Applies -the @racket['tt] style to @racket[pre-content]. Beware -that @racket[pre-content] is @racket[decode]d as usual, making -@racket[racketplainfont] a poor choice for typesetting literal code -directly but useful for implementing code-formatting functions. - -@history[#:added "1.6"]} - -@defproc[(racketvalfont [pre-content pre-content?] ...) element?]{Like -@racket[racketplainfont], but colored as a value.} - -@defproc[(racketresultfont [#:decode? decode? boolean? #t] [pre-content pre-content?] ...) element?]{ -Like @racket[racketplainfont], but colored as a REPL result. When -@racket[decode?] is @racket[#f], then unlike @racket[racketplainfont], -@racket[racketresultfont] avoids @racket[decode]ing its argument.} - -@defproc[(racketidfont [pre-content pre-content?] ...) element?]{Like -@racket[racketplainfont], but colored as an identifier.} - -@defproc[(racketvarfont [pre-content pre-content?] ...) element?]{Like -@racket[racketplainfont], but colored as a variable (i.e., an argument or -sub-form in a procedure being documented).} - -@defproc[(racketkeywordfont [pre-content pre-content?] ...) element?]{Like -@racket[racketplainfont], but colored as a syntactic form name.} - -@defproc[(racketparenfont [pre-content pre-content?] ...) element?]{Like -@racket[racketplainfont], but colored like parentheses.} - -@defproc[(racketmetafont [pre-content pre-content?] ...) element?]{Like -@racket[racketplainfont], but colored as meta-syntax, such as backquote or -unquote.} - -@defproc[(racketcommentfont [pre-content pre-content?] ...) element?]{Like -@racket[racketplainfont], but colored as a comment.} - -@defproc[(racketerror [pre-content pre-content?] ...) element?]{Like -@racket[racketplainfont], but colored as error-message text.} - -@defproc[(racketmodfont [pre-content pre-content?] ...) element?]{Like -@racket[racketplainfont], but colored as module name.} - -@defproc[(racketoutput [pre-content pre-content?] ...) element?]{Like -@racket[racketplainfont], but colored as output.} - -@defproc[(procedure [pre-content pre-content?] ...) element?]{Typesets -@tech{decode}d @racket[pre-content] as a procedure name in a REPL -result (e.g., in typewriter font with a @litchar{#} suffix.).} - -@defform[(var datum)]{Typesets @racket[datum] as an identifier that is -an argument or sub-form in a procedure being documented. Normally, the -@racket[defproc] and @racket[defform] arrange for @racket[racket] to -format such identifiers automatically in the description of the -procedure, but use @racket[var] if that cannot work for some reason.} - -@defform[(svar datum)]{Like @racket[var], but for subform non-terminals -in a form definition.} - -@deftogether[( -@defform*[((schememodname datum) - (schememodname ((unsyntax (racket unsyntax)) expr)))] -@defform[(schememodlink datum pre-content-expr ...)] -@defproc[(schemefont [pre-content pre-content?] ...) element?] -@defproc[(schemevalfont [pre-content pre-content?] ...) element?] -@defproc[(schemeresultfont [pre-content pre-content?] ...) element?] -@defproc[(schemeidfont [pre-content pre-content?] ...) element?] -@defproc[(schemevarfont [pre-content pre-content?] ...) element?] -@defproc[(schemekeywordfont [pre-content pre-content?] ...) element?] -@defproc[(schemeparenfont [pre-content pre-content?] ...) element?] -@defproc[(schememetafont [pre-content pre-content?] ...) element?] -@defproc[(schemeerror [pre-content pre-content?] ...) element?] -@defproc[(schememodfont [pre-content pre-content?] ...) element?] -@defproc[(schemeoutput [pre-content pre-content?] ...) element?] -)]{ - -Compatibility aliases. Each @racketidfont{scheme...} name is an alias for the -corresponding @racketidfont{racket...} binding.} - -@; ------------------------------------------------------------------------ -@section[#:tag "doc-modules"]{Documenting Modules} - -@defform/subs[(defmodule maybe-req one-or-multi option ... pre-flow ...) - ([maybe-req code:blank - (code:line #:require-form content-expr)] - [one-or-multi module-spec - (code:line #:multi (module-spec ...+))] - [module-spec module-path - content-expr] - [option (code:line #:module-paths (module-path ...)) - #:no-declare - (code:line #:use-sources (src-module-path ...)) - (code:line #:link-target? link-target?-expr) - #:indirect - #:lang - #:reader - (code:line #:packages (pkg-expr ...))])]{ - -Produces a sequence of flow elements (in a @racket[splice]) -to start the documentation for a module---or for multiple modules, if -the @racket[#:multi] form is used. - -Each documented module specified as either a @racket[module-path] (in -the sense of @racket[require]), in which case the module path is -typeset using @racket[racketmodname], or by a -@racket[content-expr]. The latter case is triggered by the presence of -a @racket[#:module-paths] clause, which provides a plain -@racket[module-path] for each @racket[module-spec], and the plain -@racket[module-path] is used for cross-referencing. - -If a @racket[#:require-form] clause is provided and if @racket[#:lang] -and @racket[#:reader] are not provided, the given expression produces -content to use instead of @racket[require] for the declaration of the -module. The @racket[#:require-form] clause is useful to suggest a -different way of accessing the module instead of through -@racket[require]. - -Besides generating text, unless @racket[#:no-declare] appears as an -option, this form expands to a use of @racket[declare-exporting] with -@racket[module-path]s; the @racket[#:use-sources] clause, if provided, -is propagated to @racket[declare-exporting]. Consequently, -@racket[defmodule] should be used at most once in a section without -@racket[#:no-declare], though it can be shadowed with -@racket[defmodule]s in sub-sections. Use @racket[#:no-declare] form -when you want to provide a more specific list of modules (e.g., to -name both a specific module and one that combines several modules) via -your own @racket[declare-exporting] declaration - -When @racket[#:link-target?] is omitted or specified with an expression that -produces a true value, then the @racket[module-path]s are also -declared as link targets though a @racket[part-tag-decl] (which means -that the @racket[defmodule] form must appear before any -sub-parts). These link targets are referenced via -@racket[racketmodname], which thus points to the enclosing section, -rather than the individual @racket[module-path]s. - -Specifying @racket[#:indirect] normally makes sense only when -@racket[#:link-target?] is specified with a @racket[#f] value. Specifying -@racket[#:indirect] makes the module path that is displayed (and that -normally refers to some other declaration of the module) use -@racket[racketmodname] with @racket[#:indirect]. - -If @racket[#:lang] is provided as an option, then the module name is -shown after @hash-lang[] (instead of in a @racket[require] form) to -indicate that the @racket[module-path]s are suitable for use by either -@racket[require] or @hash-lang[]. If the module path for -@racket[require] is syntactically different from the @hash-lang[] -form, use @racket[#:module-paths] to provide the @racket[require] -variant (and make each @racket[module-spec] a @racket[content-expr]). - -If @racket[#:reader] is provided, then the module name is shown after -@racketmetafont{#reader} to indicate that the module path is intended -for use as a reader module. - -By default, the package (if any) that supplies the documented module -is determined automatically, but a set of providing packages can be -specified explicitly with @racket[#:packages]. Each @racket[pkg-expr] -result is passed on to a function like @racket[tt] for -typesetting. Provide an empty sequence after @racket[#:packages] to -suppress any package name in the output. Each @racket[pkg-expr] -expression is are duplicated for a @racket[declare-exporting] form, -unless @racket[#:no-declare] is specified. - -Each @racket[option] form can appear at most once, and @racket[#:lang] -and @racket[#:reader] are mutually exclusive. - -The @tech{decode}d @racket[pre-flow]s introduce the module, but need -not include all of the module content.} - - -@defform[#:literals (unquote) - (declare-exporting module-path/escape ... maybe-pkgs maybe-sources) - #:grammar ([maybe-pkgs code:blank - (code:line #:packages (pkg-expr ...))] - [maybe-sources code:blank - (code:line #:use-sources (module-path/escape ...))] - [module-path/escape module-path - ,module-path-expr])]{ - -Associates the @racket[module-path]s to all bindings defined within the -enclosing section, except as overridden by other -@racket[declare-exporting] declarations in nested sub-sections. The -list of @racket[module-path]s before @racket[#:use-sources] is shown, for -example, when the user hovers the mouse over one of the bindings -defined within the section. A @racket[unquote]-escaped -@racket[,module-path-expr] can be used in place of a -@racket[module-path] to compute the module path dynamically. - -More significantly, the first @racket[module-path] before -@racket[#:use-sources] plus the @racket[module-path]s after -@racket[#:use-sources] determine the binding that is documented by -each @racket[defform], @racket[defproc], or similar form within the -section that contains the @racket[declare-exporting] declaration: - -@itemize[ - - @item{If no @racket[#:use-sources] clause is supplied, then the - documentation applies to the given name as exported by the first - @racket[module-path].} - - @item{If @racket[#:use-sources] @racket[module-path]s are supplied, then - they are tried in order before the first @racket[module-path]. The - @racket[module-path] that provides an export with the same - symbolic name and @racket[free-label-identifier=?] to the given - name is used as the documented binding. This binding is assumed - to be the same as the identifier as exported by the first - @racket[module-path] in the @racket[declare-exporting] - declaration.} - -] - -Use @racket[#:use-sources] sparingly, but it is needed when - -@itemlist[ - - @item{bindings are documented as originating from a module - @racket[_M], but the bindings are actually re-exported from - some module @racket[_P]; and} - - @item{other documented modules also re-export the bindings from - @racket[_P], but they are documented as re-exporting from - @racket[_M].} - -] - -For example, the @racket[parameterize] binding of -@racketmodname[mzscheme] is documented as re-exported from -@racketmodname[racket/base], but @racket[parameterize] happens to be -implemented in a private module and re-exported by both -@racketmodname[racket/base] and @racketmodname[mzscheme]. Importing -@racket[parameterize] from @racketmodname[mzscheme] does not go -through @racketmodname[racket/base], so a search for documentation on -@racket[parameterize] in @racketmodname[mzscheme] would not -automatically connect to the documentation of -@racketmodname[racket/base]. To make the connection, the documentation -of @racketmodname[racket/base] declares the private module to be a -source through @racket[#:use-sources], so that any re-export of -@racket[parameterize] from the private module connects to the -documentation for @racketmodname[racket/base] (unless a re-export has -its own documentation, which would override the automatic connection -when searching for documentation). - -The initial @racket[module-path]s sequence can be empty if -@racket[module-path]s are given with @racket[#:use-sources]. In that -case, the rendered documentation never reports an exporting module for -identifiers that are documented within the section, but the -@racket[module-path]s in @racket[#:use-sources] provide a binding context -for connecting (via hyperlinks) definitions and uses of identifiers. - -Supply @racket[#:packages] to specify the package that provides the -declared modules, which is otherwise inferred automatically from the -first @racket[module-path]. The package names are used, for example, -by @racket[history]. - -The @racket[declare-exporting] form should be used no more than once -per section, since the declaration applies to the entire section, -although overriding @racket[declare-exporting] forms can appear in -sub-sections. - -@history[#:changed "1.1" @elem{Added @racket[#:packages] clause.} - #:changed "1.17" @elem{Added support for @racket[,module-path-expr].}]} - -@defform*[[(defmodulelang one-or-multi maybe-sources option ... pre-flow ...) - (defmodulelang one-or-multi #:module-path module-path - option ... pre-flow ...)]]{ -Equivalent to @racket[defmodule] with @racket[#:lang]. The -@racket[#:module-path module-path] is provided, it is converted to -@racket[#:module-paths (module-path)].} - -@defform[(defmodulereader one-or-multi option ... pre-flow ...)]{ -Equivalent to @racket[defmodule] with @racket[#:reader].} - - -@deftogether[( -@defform[(defmodule* maybe-req (module-spec ...+) option ... pre-flow ...)] -@defform[(defmodulelang* (module-spec ...+) option ... pre-flow ...)] -@defform[(defmodulereader* (module-spec ...+) option ... pre-flow ...)] -)]{ -Equivalent to @racket[defmodule] variants with @racket[#:multi].} - -@deftogether[( -@defform[(defmodule*/no-declare maybe-req (module-spec ...) option ... pre-flow ...)] -@defform[(defmodulelang*/no-declare (module-spec ...) option ... pre-flow ...)] -@defform[(defmodulereader*/no-declare (module-spec ...) option ... pre-flow ...)] -)]{ -Equivalent to @racket[defmodule] variants @racket[#:no-declare].} - -@; ------------------------------------------------------------------------ -@section[#:tag "doc-forms"]{Documenting Forms, Functions, Structure Types, and Values} - -@defform/subs[(defproc options prototype - result-contract-expr-datum - maybe-value - pre-flow ...) - ([prototype (id arg-spec ...) - (prototype arg-spec ...)] - [arg-spec (arg-id contract-expr-datum) - (arg-id contract-expr-datum default-expr) - (keyword arg-id contract-expr-datum) - (keyword arg-id contract-expr-datum default-expr) - ellipses - ellipses+] - [options (code:line maybe-kind maybe-link maybe-id)] - [maybe-kind code:blank - (code:line #:kind kind-string-expr)] - [maybe-link code:blank - (code:line #:link-target? link-target?-expr)] - [maybe-id code:blank - (code:line #:id [src-id dest-id-expr])] - [maybe-value code:blank - (code:line #:value value-expr-datum)] - [ellipses @#,lit-ellipses] - [ellipses+ @#,lit-ellipses+])]{ - -Produces a sequence of flow elements (encapsulated in a -@racket[splice]) to document a procedure named @racket[id]. Nesting -@racket[prototype]s corresponds to a curried function, as in -@racket[define]. Unless @racket[link-target?-expr] is specified -and produces @racket[#f], the @racket[id] is indexed, and it also registered so -that @racket[racket]-typeset uses of the identifier (with the same -for-label binding) are hyperlinked to this documentation. - -Examples: -@codeblock[#:keep-lang-line? #f]|{ -#lang scribble/manual -@defproc[(make-sandwich [ingredients (listof ingredient?)]) - sandwich?]{ - Returns a sandwich given the right ingredients. -} - -@defproc[#:kind "sandwich-maker" - (make-reuben [ingredient sauerkraut?] ... - [#:veggie? veggie? any/c #f]) - sandwich?]{ - Produces a reuben given some number of @racket[ingredient]s. - - If @racket[veggie?] is @racket[#f], produces a standard - reuben with corned beef. Otherwise, produces a vegetable - reuben. -} -}| - -@doc-render-examples[ - @defproc[#:link-target? #f - (make-sandwich [ingredients (listof ingredient?)]) - sandwich?]{ - Returns a sandwich given the right ingredients. - } - - @defproc[#:kind "sandwich-maker" - #:link-target? #f - (make-reuben [ingredient sauerkraut?] ... - [#:veggie? veggie? any/c #f]) - sandwich?]{ - Produces a reuben given some number of @racket[ingredient]s. - - If @racket[veggie?] is @racket[#f], produces a standard - reuben with corned beef. Otherwise, produces a vegetable - reuben. - }] - -When @racket[id] is indexed and registered, -a @racket[defmodule] or @racket[declare-exporting] form (or one of the -variants) in an enclosing section determines the @racket[id] binding -that is being defined. The @racket[id] should also have a for-label -binding (as introduced by @racket[(require (for-label ....))]) that -matches the definition binding; otherwise, the defined @racket[id] -will not typeset correctly within the definition. - -Each @racket[arg-spec] must have one of the following forms: - -@specsubform[(arg-id contract-expr-datum)]{ - An argument whose contract is specified by - @racket[contract-expr-datum] which is typeset via - @racket[racketblock0].} - -@specsubform[(arg-id contract-expr-datum default-expr)]{ - Like the previous case, but with a default value. All arguments - with a default value must be grouped together, but they can be - in the middle of required arguments.} - -@specsubform[(keyword arg-id contract-expr-datum)]{ - Like the first case, but for a keyword-based argument.} - -@specsubform[(keyword arg-id contract-expr-datum default-expr)]{ - Like the previous case, but with a default - value.} - -@specsubform[@#,lit-ellipses]{Any number of the preceding argument. This - form is normally used at the end, but keyword-based arguments - can sensibly appear afterward. See also the documentation for - @racket[append] for a use of @lit-ellipses before the last - argument.} - -@specsubform[@#,lit-ellipses+]{One or more of the preceding argument - (normally at the end, like @lit-ellipses).} - -The @racket[result-contract-expr-datum] is typeset via -@racket[racketblock0], and it represents a contract on the procedure's -result. - -The @tech{decode}d @racket[pre-flow] documents the procedure. In this -description, references to @svar[arg-id]s using @racket[racket], -@racket[racketblock], @|etc| are typeset as procedure arguments. - -The typesetting of all information before the @racket[pre-flow]s -ignores the source layout, except that the local formatting is -preserved for contracts and default-values expressions. The information -is formatted to fit (if possible) in the number of characters specified -by the @racket[current-display-width] parameter. - -An optional @racket[#:kind] specification chooses the decorative -label, which defaults to @racket["procedure"]. A @racket[#f] -result for @racket[kind-string-expr] uses the default, otherwise -@racket[kind-string-expr] should produce a string. An alternate -label should be all lowercase. - -If @racket[#:id [src-id dest-id-expr]] is supplied, then -@racket[src-id] is the identifier as it appears in the -@racket[prototype] (to be replaced by a defining instance), and -@racket[dest-id-expr] produces the identifier to be documented in -place of @racket[src-id]. This split between @racket[src-id] and -@racket[dest-id-expr] roles is useful for functional abstraction of -@racket[defproc]. - -If @racket[#:value value-expr-datum] is given, @racket[value-expr-datum] -is typeset using @racket[racketblock0] and included in the documentation. -As a service to readers, please use @racket[#:value] to document only -simple, short functions. -} - -@defform[(defproc* options - ([prototype - result-contract-expr-datum - maybe-value] ...) - pre-flow ...)]{ - -Like @racket[defproc], but for multiple cases with the same -@racket[id]. Multiple distinct @racket[id]s can also be defined by a -single @racket[defproc*], for the case that it's best to document a -related group of procedures at once (but multiple @racket[defproc]s -grouped by @racket[deftogether] also works for that case). - -When an @racket[id] has multiple calling cases, either they must be -defined with a single @racket[defproc*], so that a single definition -point exists for the @racket[id], or else all but one definition -should use @racket[#:link-target? #f]. - -Examples: -@codeblock[#:keep-lang-line? #f]|{ -#lang scribble/manual -@defproc*[([(make-pb&j) sandwich?] - [(make-pb&j [jelly jelly?]) sandwich?])]{ - Returns a peanut butter and jelly sandwich. If @racket[jelly] - is provided, then it is used instead of the standard (grape) - jelly. -} -}| - -@doc-render-examples[ - @defproc*[#:link-target? #f - ([(make-pb&j) sandwich?] - [(make-pb&j [jelly jelly?]) sandwich?])]{ - Returns a peanut butter and jelly sandwich. If @racket[jelly] - is provided, then it is used instead of the standard (grape) - jelly. - }] -} - - -@defform/subs[(defform options form-datum - maybe-grammar maybe-contracts - pre-flow ...) - ([options (code:line maybe-kind maybe-link maybe-id maybe-literals)] - [maybe-kind code:blank - (code:line #:kind kind-string-expr)] - [maybe-link code:blank - (code:line #:link-target? link-target?-expr)] - [maybe-id code:blank - (code:line #:id id) - (code:line #:id [id id-expr])] - [maybe-literals code:blank - (code:line #:literals (literal-id ...))] - [maybe-grammar code:blank - (code:line #:grammar ([nonterm-id clause-datum ...+] ...))] - [maybe-contracts code:blank - (code:line #:contracts ([subform-datum contract-expr-datum] - ...))])]{ - -Produces a sequence of flow elements (encapsulated in a -@racket[splice]) to document a syntatic form named by @racket[id] (or the -result of @racket[id-expr]) whose syntax is described by -@racket[form-datum]. If no @racket[#:id] is used to specify -@racket[id], then @racket[form-datum] must have the form @racket[(id -. _datum)]. - -If @racket[#:kind kind-string-expr] is supplied, it is used in the -same way as for @racket[defproc], but the default kind is -@racket["syntax"]. - -If @racket[#:id [id id-expr]] is supplied, then @racket[id] is the -identifier as it appears in the @racket[form-datum] (to be replaced by -a defining instance), and @racket[id-expr] produces the identifier to -be documented. This split between @racket[id] and @racket[id-expr] -roles is useful for functional abstraction of @racket[defform]. - -Unless @racket[link-target?-expr] is specified -and produces @racket[#f], -the @racket[id] (or result of @racket[id-expr]) is indexed, and it is -also registered so that @racket[racket]-typeset uses of the identifier -(with the same for-label binding) are hyperlinked to this -documentation. The @racket[defmodule] or @racket[declare-exporting] -requirements, as well as the binding requirements for @racket[id] (or -result of @racket[id-expr]), are the same as for @racket[defproc]. - -The @tech{decode}d @racket[pre-flow] documents the form. In this -description, a reference to any identifier in @racket[form-datum] via -@racket[racket], @racket[racketblock], @|etc| is typeset as a sub-form -non-terminal. If @racket[#:literals] clause is provided, however, -instances of the @racket[literal-id]s are typeset normally (i.e., as -determined by the enclosing context). - -If a @racket[#:grammar] clause is provided, it includes an auxiliary -grammar of non-terminals shown with the @racket[id] form. Each -@racket[nonterm-id] is specified as being any of the corresponding -@racket[clause-datum]s. - -If a @racket[#:contracts] clause is provided, each -@racket[subform-datum] (typically an identifier that serves as a -meta-variable in @racket[form-datum] or @racket[clause-datum]) is -shown as producing a value that must satisfy the contract described by -@racket[contract-expr-datum]. Use @racket[#:contracts] only to -specify constraints on a @emph{value} produced by an expression; for -constraints on the @emph{syntax} of a @racket[subform-datum], use -grammar notation instead, possibly through an auxiliary grammar -specified with @racket[#:grammar]. - -The typesetting of @racket[form-datum], @racket[clause-datum], -@racket[subform-datum], and @racket[contract-expr-datum] preserves the -source layout, like @racket[racketblock]. - -Examples: -@codeblock[#:keep-lang-line? #f]|{ -#lang scribble/manual -@defform[(sandwich-promise sandwich-expr) - #:contracts ([sandwich-expr sandwich?])]{ - Returns a promise to construct a sandwich. When forced, the promise - will produce the result of @racket[sandwich-expr]. -} - -@defform[#:literals (sandwich mixins) - (sandwich-promise* [sandwich sandwich-expr] - [mixins ingredient-expr ...]) - #:contracts ([sandwich-expr sandwich?] - [ingredient-expr ingredient?])]{ - Returns a promise to construct a sandwich. When forced, the promise - will produce the result of @racket[sandwich-expr]. Each result of - the @racket[ingredient-expr]s will be mixed into the resulting - sandwich. -} - -@defform[(sandwich-factory maybe-name factory-component ...) - #:grammar - [(maybe-name (code:line) - name) - (factory-component (code:line #:protein protein-expr) - [vegetable vegetable-expr])]]{ - Constructs a sandwich factory. If @racket[maybe-name] is provided, - the factory will be named. Each of the @racket[factory-component] - clauses adds an additional ingredient to the sandwich pipeline. -} -}| -@doc-render-examples[ - @defform[#:link-target? #f - (sandwich-promise sandwich-expr) - #:contracts ([sandwich-expr sandwich?])]{ - Returns a promise to construct a sandwich. When forced, the promise - will produce the result of @racket[sandwich-expr]. - } - - @defform[#:link-target? #f - #:literals (sandwich mixins) - (sandwich-promise* [sandwich sandwich-expr] - [mixins ingredient-expr ...]) - #:contracts ([sandwich-expr sandwich?] - [ingredient-expr ingredient?])]{ - Returns a promise to construct a sandwich. When forced, the promise - will produce the result of @racket[sandwich-expr]. Each result of - the @racket[ingredient-expr]s will be mixed into the resulting - sandwich. - } - - @defform[#:link-target? #f - (sandwich-factory maybe-name factory-component ...) - #:grammar - [(maybe-name (code:line) - name) - (factory-component (code:line #:protein protein-expr) - [vegetable vegetable-expr])]]{ - Constructs a sandwich factory. If @racket[maybe-name] is provided, - the factory will be named. Each of the @racket[factory-component] - clauses adds an additional ingredient to the sandwich pipeline. - }] -} - -@defform[(defform* options [form-datum ...+] - maybe-grammar maybe-contracts - pre-flow ...)]{ - -Like @racket[defform], but for multiple forms using the same -@racket[_id]. - -Examples: -@codeblock[#:keep-lang-line? #f]|{ -#lang scribble/manual -@defform*[((call-with-current-sandwich expr) - (call-with-current-sandwich expr sandwich-handler-expr))]{ - Runs @racket[expr] and passes it the value of the current - sandwich. If @racket[sandwich-handler-expr] is provided, its result - is invoked when the current sandwich is eaten. -} -}| -@doc-render-examples[ -@defform*[#:link-target? #f - ((call-with-current-sandwich expr) - (call-with-current-sandwich expr sandwich-handler-expr))]{ - Runs @racket[expr] and passes it the value of the current - sandwich. If @racket[sandwich-handler-expr] is provided, its result - is invoked when the current sandwich is eaten. -}] -} - - -@defform[(defform/none maybe-kind maybe-literal form-datum - maybe-grammar maybe-contracts - pre-flow ...)]{ - -Like @racket[defform] with @racket[#:link-target? #f].} - - -@defform[(defidform maybe-kind maybe-link id pre-flow ...)]{ - -Like @racket[defform], but with a plain @racket[id] as the form.} - - -@defform*[[(defidform/inline id) - (defidform/inline (@#,racket[unsyntax] id-expr))]]{ - -Like @racket[defidform], but @racket[id] (or the result of -@racket[id-expr], analogous to @racket[defform]) is typeset as an -inline element. Use this form sparingly, because the typeset form does -not stand out to the reader as a specification of @racket[id].} - -@deftogether[( -@defform[(defsubform options form-datum - maybe-grammar maybe-contracts - pre-flow ...)] -@defform[(defsubform* options [form-datum ...+] - maybe-grammar maybe-contracts - pre-flow ...)] -)]{ - -Like @racket[defform] and @racket[defform*], but with -indenting on the left for both the specification and the -@racket[pre-flow]s.} - - -@defform[(specform maybe-literals datum maybe-grammar maybe-contracts - pre-flow ...)]{ - -Like @racket[defform] with @racket[#:link-target? #f], but with -indenting on the left for both the specification and the -@racket[pre-flow]s.} - - -@defform[(specsubform maybe-literals datum maybe-grammar maybe-contracts - pre-flow ...)]{ - -Similar to @racket[defform] with @racket[#:link-target? #f], -but without the initial identifier as an implicit literal, -and the table and flow are typeset indented. This form is -intended for use when refining the syntax of a non-terminal used in a -@racket[defform] or other @racket[specsubform]. For example, it is -used in the documentation for @racket[defproc] in the itemization of -possible shapes for @svar[arg-spec]. - -The @racket[pre-flow]s list is parsed as a flow that documents the -procedure. In this description, a reference to any identifier in -@racket[datum] is typeset as a sub-form non-terminal.} - - -@defform[(specspecsubform maybe-literals datum maybe-grammar maybe-contracts - pre-flow ...)]{ - -Like @racket[specsubform], but indented an extra level. Since using -@racket[specsubform] within the body of @racket[specsubform] already -nests indentation, @racket[specspecsubform] is for extra indentation -without nesting a description.} - - -@deftogether[[ -@defform[(defform/subs options form-datum - ([nonterm-id clause-datum ...+] ...) - maybe-contracts - pre-flow ...)] -@defform[(defform*/subs options [form-datum ...+] - ([nonterm-id clause-datum ...+] ...) - maybe-contracts - pre-flow ...)] -@defform[(specform/subs maybe-literals datum - ([nonterm-id clause-datum ...+] ...) - maybe-contracts - pre-flow ...)] -@defform[(specsubform/subs maybe-literals datum - ([nonterm-id clause-datum ...+] ...) - maybe-contracts - pre-flow ...)] -@defform[(specspecsubform/subs maybe-literals datum - ([nonterm-id clause-datum ...+] ...) - maybe-contracts - pre-flow ...)]]]{ - -Like @racket[defform], @racket[defform*], @racket[specform], -@racket[specsubform], and @racket[specspecsubform], respectively, but -the auxiliary grammar is mandatory and the @racket[#:grammar] keyword -is omitted. - -Examples: -@codeblock[#:keep-lang-line? #f]|{ -#lang scribble/manual -@defform/subs[(sandwich-factory maybe-name factory-component ...) - [(maybe-name (code:line) - name) - (factory-component (code:line #:protein protein-expr) - [vegetable vegetable-expr])]]{ - Constructs a sandwich factory. If @racket[maybe-name] is provided, - the factory will be named. Each of the @racket[factory-component] - clauses adds an additional ingredient to the sandwich pipeline. -} -}| -@doc-render-examples[ - @defform/subs[#:link-target? #f - (sandwich-factory maybe-name factory-component ...) - [(maybe-name (code:line) - name) - (factory-component (code:line #:protein protein-expr) - [vegetable vegetable-expr])]]{ - Constructs a sandwich factory. If @racket[maybe-name] is provided, - the factory will be named. Each of the @racket[factory-component] - clauses adds an additional ingredient to the sandwich pipeline. - }] -} - - -@defform[(defparam maybe-link id arg-id - contract-expr-datum - maybe-value - pre-flow ...)]{ - -Like @racket[defproc], but for a parameter. The -@racket[contract-expr-datum] serves as both the result contract on the -parameter and the contract on values supplied for the parameter. The -@racket[arg-id] refers to the parameter argument in the latter case. - -Examples: -@codeblock[#:keep-lang-line? #f]|{ -#lang scribble/manual -@defparam[current-sandwich sandwich sandwich? - #:value empty-sandwich]{ - A parameter that defines the current sandwich for operations that - involve eating a sandwich. Default value is the empty sandwich. -} -}| -@doc-render-examples[ - @defparam[#:link-target? #f - current-sandwich sandwich sandwich? #:value empty-sandwich]{ - A parameter that defines the current sandwich for operations that - involve eating a sandwich. Default value is the empty sandwich. - }] -} - - -@defform[(defparam* maybe-link id arg-id - in-contract-expr-datum out-contract-expr-datum - maybe-value - pre-flow ...)]{ - -Like @racket[defparam], but with separate contracts for when the parameter is being -set versus when it is being retrieved (for the case that a parameter guard -coerces values matching a more flexible contract to a more restrictive one; -@racket[current-directory] is an example).} - - -@defform[(defboolparam maybe-link id arg-id - maybe-value - pre-flow ...)]{ - -Like @racket[defparam], but the contract on a parameter argument is -@racket[any/c], and the contract on the parameter result is -@racket[boolean?].} - - -@defform/subs[(defthing options id contract-expr-datum maybe-value - pre-flow ...) - ([options (code:line maybe-kind maybe-link maybe-id)] - [maybe-kind code:blank - (code:line #:kind kind-string-expr)] - [maybe-link code:blank - (code:line #:link-target? link-target?-expr)] - [maybe-id code:blank - (code:line #:id id-expr)] - [maybe-value code:blank - (code:line #:value value-expr-datum)])]{ - -Like @racket[defproc], but for a non-procedure binding. - -If @racket[#:kind kind-string-expr] is supplied, -it is used in the same way as for -@racket[defproc], but the default kind is @racket["value"]. - -If @racket[#:id id-expr] is supplied, then the result of -@racket[id-expr] is used in place of @racket[id]. - -If @racket[#:value value-expr-datum] is given, @racket[value-expr-datum] -is typeset using @racket[racketblock0] and included in the documentation. -Wide values are put on a separate line. - -Examples: -@codeblock[#:keep-lang-line? #f]|{ -#lang scribble/manual -@defthing[moldy-sandwich sandwich?]{ - Don't eat this. Provided for backwards compatibility. -} - -@defthing[empty-sandwich sandwich? #:value (make-sandwich empty)]{ - The empty sandwich. -} -}| -@doc-render-examples[ - @defthing[#:link-target? #f - moldy-sandwich sandwich?]{ - Don't eat this. Provided for backwards compatibility. - } - @defthing[#:link-target? #f - empty-sandwich sandwich? #:value (make-sandwich empty)]{ - The empty sandwich. - }] -} - - -@deftogether[( -@defform[ (defstruct* maybe-link struct-name ([field-name contract-expr-datum] ...) - maybe-mutable maybe-non-opaque maybe-constructor - pre-flow ...)] -@defform/subs[ (defstruct maybe-link struct-name ([field-name contract-expr-datum] ...) - maybe-mutable maybe-non-opaque maybe-constructor - pre-flow ...) - ([maybe-link code:blank - (code:line #:link-target? link-target?-expr)] - [struct-name id - (id super-id)] - [maybe-mutable code:blank - #:mutable] - [maybe-non-opaque code:blank - #:prefab - #:transparent - (code:line #:inspector #f)] - [maybe-constructor code:blank - (code:line #:constructor-name constructor-id) - (code:line #:extra-constructor-name constructor-id) - (code:line #:omit-constructor)])] -)]{ - -Similar to @racket[defform] or @racket[defproc], but for a structure -definition. The @racket[defstruct*] form corresponds to @racket[struct], -while @racket[defstruct] corresponds to @racket[define-struct]. - -Examples: -@codeblock[#:keep-lang-line? #f]|{ -#lang scribble/manual -@defstruct[sandwich ([protein ingredient?] [sauce ingredient?])]{ - A strucure type for sandwiches. Sandwiches are a pan-human foodstuff - composed of a partially-enclosing bread material and various - ingredients. -} -}| -@doc-render-examples[ - @defstruct[#:link-target? #f - sandwich ([protein ingredient?] [sauce ingredient?])]{ - A strucure type for sandwiches. Sandwiches are a pan-human foodstuff - composed of a partially-enclosing bread material and various - ingredients. - }] -} - - -@defform[(deftogether [def-expr ...] pre-flow ...)]{ - -Combines the definitions created by the @racket[def-expr]s into a -single definition box. Each @racket[def-expr] should produce a -definition point via @racket[defproc], @racket[defform], etc. Each -@racket[def-expr] should have an empty @racket[pre-flow]; the -@tech{decode}d @racket[pre-flow] sequence for the @racket[deftogether] -form documents the collected bindings. - -Examples: -@codeblock[#:keep-lang-line? #f]|{ -#lang scribble/manual -@deftogether[(@defthing[test-sandwich-1 sandwich?] - @defthing[test-sandwich-2 sandwich?])]{ - Two high-quality sandwiches. These are provided for convenience - in writing test cases -} -}| -@doc-render-examples[ - @deftogether[(@defthing[#:link-target? #f test-sandwich-1 sandwich?] - @defthing[#:link-target? #f test-sandwich-2 sandwich?])]{ - Two high-quality sandwiches. These are provided for convenience - in writing test cases - } -] -} - - -@defform/subs[(racketgrammar maybe-literals id clause-datum ...+) - ([maybe-literals code:blank - (code:line #:literals (literal-id ...))])]{ - -Creates a table to define the grammar of @racket[id]. Each identifier -mentioned in a @racket[clause-datum] is typeset as a non-terminal, -except for the identifiers listed as @racket[literal-id]s, which are -typeset as with @racket[racket].} - - -@defform[(racketgrammar* maybe-literals [id clause-datum ...+] ...)]{ - -Like @racket[racketgrammar], but for typesetting multiple productions -at once, aligned around the @litchar{=} and @litchar{|}.} - -@defproc[(defidentifier [id identifier?] - [#:form? form? boolean? #f] - [#:index? index? boolean? #t] - [#:show-libs? show-libs? boolean? #t]) - element?]{ - -Typesets @racket[id] as a Racket identifier, and also establishes the -identifier as the definition of a binding in the same way as -@racket[defproc], @racket[defform], etc. As always, the library that -provides the identifier must be declared via @racket[defmodule] or -@racket[declare-exporting] for an enclosing section. - -If @racket[form?] is a true value, then the identifier is documented -as a syntactic form, so that uses of the identifier (normally -including @racket[id] itself) are typeset as a syntactic form. - -If @racket[index?] is a true value, then the identifier is registered -in the index. - -If @racket[show-libs?] is a true value, then the identifier's defining -module may be exposed in the typeset form (e.g., when viewing HTML and -the mouse hovers over the identifier).} - -@deftogether[( -@defform[(schemegrammar maybe-literals id clause-datum ...+)] -@defform[(schemegrammar* maybe-literals [id clause-datum ...+] ...)] -)]{ - -Compatibility aliases for @racket[racketgrammar] and @racket[racketgrammar*].} - -@defparam[current-display-width w exact-nonnegative-integer?]{ - -Specifies the target maximum width in characters for the output of -@racket[defproc] and @racket[defstruct].} - - -@; ------------------------------------------------------------------------ -@section[#:tag "doc-classes"]{Documenting Classes and Interfaces} - -@defform/subs[(defclass maybe-link id super (intf-id ...) pre-flow ...) - ([maybe-link code:blank - (code:line #:link-target? link-target?-expr)] - [super super-id - (mixin-id super)])]{ - -Creates documentation for a class @racket[id] that is a subclass of -@racket[super] and implements each interface @racket[intf-id]. Each -identifier in @racket[super] (except @racket[object%]) and -@racket[intf-id] must be documented somewhere via @racket[defclass] or -@racket[definterface]. - -The decoding of the @racket[pre-flow] sequence should start with -general documentation about the class, followed by constructor -definition (see @racket[defconstructor]), and then field and method -definitions (see @racket[defmethod]). In rendered form, the -constructor and method specification are indented to visually group -them under the class definition.} - -@defform[(defclass/title maybe-link id super (intf-id ...) pre-flow ...)]{ - -Like @racket[defclass], also includes a @racket[title] declaration -with the style @racket['hidden]. In addition, the constructor and -methods are not left-indented. - -This form is normally used to create a section to be rendered on its -own HTML. The @racket['hidden] style is used because the definition -box serves as a title.} - -@defform[(definterface id (intf-id ...) pre-flow ...)]{ - -Like @racket[defclass], but for an interfaces. Naturally, -@racket[pre-flow] should not generate a constructor declaration.} - -@defform[(definterface/title id (intf-id ...) pre-flow ...)]{ - -Like @racket[definterface], but for single-page rendering as in -@racket[defclass/title].} - -@defform[(defmixin id (domain-id ...) (range-id ...) pre-flow ...)]{ - -Like @racket[defclass], but for a mixin. Any number of -@racket[domain-id] classes and interfaces are specified for the -mixin's input requires, and any number of result classes and (more -likely) interfaces are specified for the @racket[range-id]. The -@racket[domain-id]s supply inherited methods.} - -@defform[(defmixin/title id (domain-id ...) (range-id ...) pre-flow ...)]{ - -Like @racket[defmixin], but for single-page rendering as in -@racket[defclass/title].} - -@defform/subs[(defconstructor (arg-spec ...) pre-flow ...) - ([arg-spec (arg-id contract-expr-datum) - (arg-id contract-expr-datum default-expr)])]{ - -Like @racket[defproc], but for a constructor declaration in the body -of @racket[defclass], so no return contract is specified. Also, the -@racket[new]-style keyword for each @racket[arg-spec] is implicit from -the @racket[arg-id].} - -@defform[(defconstructor/make (arg-spec ...) pre-flow ...)]{ - -Like @racket[defconstructor], but specifying by-position -initialization arguments (for use with @racket[make-object]) instead -of by-name arguments (for use with @racket[new]).} - -@defform[(defconstructor*/make [(arg-spec ...) ...] pre-flow ...)]{ - -Like @racket[defconstructor/make], but with multiple constructor -patterns analogous @racket[defproc*].} - -@defform[(defconstructor/auto-super [(arg-spec ...) ...] pre-flow ...)]{ - -Like @racket[defconstructor], but the constructor is -annotated to indicate that additional initialization arguments are -accepted and propagated to the superclass.} - -@defform/subs[#:literals (override override-final public-final - augment augment-final pubment extend extend-final) - (defmethod maybe-mode maybe-link (id arg-spec ...) - result-contract-expr-datum - pre-flow ...) - ([maybe-link code:blank - (code:line #:link-target? link-target?-expr)] - [maybe-mode code:blank - (code:line #:mode override) - (code:line #:mode override-final) - (code:line #:mode public-final) - (code:line #:mode augment) - (code:line #:mode augment-final) - (code:line #:mode pubment) - (code:line #:mode extend) - (code:line #:mode extend-final)])]{ - -Like @racket[defproc], but for a method within a @racket[defclass] or -@racket[definterface] body. - -The @racket[maybe-mode] specifies whether the method overrides a -method from a superclass, and so on. (For these purposes, use -@racket[#:mode override] when refining a method of an implemented -interface.) The @racket[extend] mode is like @racket[override], but -the description of the method should describe only extensions to the -superclass implementation.} - -@defform[(defmethod* maybe-mode maybe-link - ([(id arg-spec ...) - result-contract-expr-datum] ...) - pre-flow ...)]{ - -Like @racket[defproc*], but for a method within a @racket[defclass] or -@racket[definterface] body. The @racket[maybe-mode] specification is as in -@racket[defmethod].} - - -@defform[(method class/intf-id method-id)]{ - -Creates a hyperlink to the method named by @racket[method-id] in the -class or interface named by @racket[class/intf-id]. The hyperlink -names the method, only; see also @racket[xmethod]. - -For-label binding information is used with @racket[class/intf-id], but -not @racket[method-id].} - -@defform[(xmethod class/intf-id method-id)]{ - -Like @racket[method], but the hyperlink shows both the method name and -the containing class/interface.} - -@defform[(this-obj)]{ - -Within a @racket[defmethod] or similar form, typesets as a -meta-variable that stands for the target of the method call. Use -@racket[(this-obj)] to be more precise than prose such as ``this -method's object.''} - -@; ------------------------------------------------------------------------ -@section[#:tag "doc-signatures"]{Documenting Signatures} - -@defform[(defsignature id (super-id ...) pre-flow ...)]{ - -Defines a signature @racket[id] that extends the @racket[super-id] -signatures. Any elements defined in @tech{decode}d -@racket[pre-flow]s---including forms, procedures, structure types, -classes, interfaces, and mixins---are defined as members of the -signature instead of direct bindings. These definitions can be -referenced through @racket[sigelem] instead of @racket[racket]. - -The @tech{decode}d @racket[pre-flow]s inset under the signature -declaration in the typeset output, so no new sections, @|etc| can be -started.} - -@defform[(defsignature/splice id (super-id ...) pre-flow ...)]{ - -Like @racket[defsignature], but the @tech{decode}d @racket[pre-flow]s -are not typeset under the signature declaration, and new sections, -@|etc| can be started in the @racket[pre-flow]s.} - -@defproc[(signature-desc [pre-flow pre-flow?] ...) any/c]{ - -Produces an opaque value that @racket[defsignature] recognizes to -outdent in the typeset form. This is useful for text describing the -signature as a whole to appear right after the signature declaration.} - -@defform[(sigelem sig-id id)]{ - -Typesets the identifier @racket[id] with a hyperlink to its definition -as a member of the signature named by @racket[sig-id].} - -@; ------------------------------------------------------------------------ -@section[#:tag "doc-strings"]{Various String Forms} - -@defproc[(aux-elem [pre-content pre-content?] ...) element?]{ -Like @racket[elem], but adds an @racket['aux] @tech{style property}.} - -@defproc[(defterm [pre-content pre-content?] ...) element?]{Typesets the -@tech{decode}d @racket[pre-content] as a defined term (e.g., in -italic). Consider using @racket[deftech] instead, though, so that uses -of @racket[tech] can hyper-link to the definition.} - -@defproc[(onscreen [pre-content pre-content?] ...) element?]{ Typesets the -@tech{decode}d @racket[pre-content] as a string that appears in a GUI, -such as the name of a button.} - -@defproc[(menuitem [menu-name string?] [item-name string?]) element?]{ -Typesets the given combination of a GUI's menu and item name.} - -@defproc[(filepath [pre-content pre-content?] ...) element?]{Typesets the -@tech{decode}d @racket[pre-content] as a file name (e.g., in -typewriter font and in quotes).} - -@defproc[(exec [pre-content pre-content?] ...) element?]{Typesets the -@tech{decode}d @racket[pre-content] as a command line (e.g., in -typewriter font).} - -@defproc[(envvar [pre-content pre-content?] ...) element?]{Typesets the given -@tech{decode}d @racket[pre-content] as an environment variable (e.g., -in typewriter font).} - -@defproc[(Flag [pre-content pre-content?] ...) element?]{Typesets the given -@tech{decode}d @racket[pre-content] as a flag (e.g., in typewriter -font with a leading @litchar{-}).} - -@defproc[(DFlag [pre-content pre-content?] ...) element?]{Typesets the given -@tech{decode}d @racket[pre-content] a long flag (e.g., in typewriter -font with two leading @litchar{-}s).} - -@defproc[(PFlag [pre-content pre-content?] ...) element?]{Typesets the given -@tech{decode}d @racket[pre-content] as a @litchar{+} flag (e.g., in typewriter -font with a leading @litchar{+}).} - -@defproc[(DPFlag [pre-content pre-content?] ...) element?]{Typesets the given -@tech{decode}d @racket[pre-content] a long @litchar{+} flag (e.g., in -typewriter font with two leading @litchar{+}s).} - -@; ------------------------------------------------------------------------ -@section[#:tag "section-links"]{Links} - -See also @secref["base-links"]. - -@defform*[[(racketlink id #:style style-expr pre-content ...) - (racketlink id pre-content ...)] - #:contracts ([id identifier?] - [pre-content pre-content?])]{ - -An element where the @tech{decode}d @racket[pre-content] is hyperlinked to the definition -of @racket[id].} - -@defform[(schemelink id pre-content ...)]{ - -Compatibility alias for @racket[racketlink].} - -@defproc[(link [url string?] [pre-content any/c] ... - [#:underline? underline? any/c #t] - [#:style style (or/c style? string? symbol? #f) (if underline? #f "plainlink")]) - element?]{ - -Alias of @racket[hyperlink] for backward compatibility.} - -@defproc[(other-manual [module-path module-path?] - [#:underline? underline? any/c #t]) - element?]{ - -Alias of @racket[other-doc] for backward compatibility.} - -@defproc[(deftech [pre-content pre-content?] ... - [#:key key (or/c string? #f) #f] - [#:normalize? normalize? any/c #t] - [#:style? style? any/c #t]) element?]{ - -Produces an element for the @tech{decode}d @racket[pre-content], and -also defines a term that can be referenced elsewhere using -@racket[tech]. - -When @racket[key] is @racket[#f], the @racket[content->string] result -of the @tech{decode}d @racket[pre-content] is used as a key for -references. If @racket[normalize?] is true, then the key string is -normalized as follows: - -@itemize[ - - @item{The string is case-folded.} - - @item{A trailing ``ies'' is replaced by ``y''.} - - @item{A trailing ``s'' is removed.} - - @item{Consecutive hyphens and whitespaces are all replaced by a - single space.} - -] - -These normalization steps help support natural-language references -that differ slightly from a defined form. For example, a definition of -``bananas'' can be referenced with a use of ``banana''. - -If @racket[style?] is true, then @racket[defterm] is used on -@racket[pre-content].} - -@defproc[(tech [pre-content pre-content?] ... - [#:key key (or/c string? #f) #f] - [#:normalize? normalize? any/c #t] - [#:doc module-path (or/c module-path? #f) #f] - [#:tag-prefixes prefixes (or/c (listof string?) #f) #f]) - element?]{ - -Produces an element for the @tech{decode}d @racket[pre-content], and -hyperlinks it to the definition of the key as established by -@racket[deftech]. If @racket[key] is false, the decoded content is -converted to a string (using @racket[content->string]) to use as a -key; in either case, if @racket[normalize?] is true, the key is normalized in the same way as for -@racket[deftech]. The @racket[#:doc] and @racket[#:tag-prefixes] -arguments support cross-document and section-specific references, like -in @racket[secref]. -For example: -@racketblock[@tech[#:doc '(lib "scribblings/guide/guide.scrbl")]{blame object}] - -creates a link to @tech[#:doc '(lib "scribblings/guide/guide.scrbl")]{blame object} in -@other-doc['(lib "scribblings/guide/guide.scrbl")]. - -With the default style files, the hyperlink created by @racket[tech] -is somewhat quieter than most hyperlinks: the underline in HTML output -is gray, instead of blue, and the term and underline turn blue only -when the mouse is moved over the term. - -In some cases, combining both natural-language uses of a term and -proper linking can require some creativity, even with the -normalization performed on the term. For example, if ``bind'' is -defined, but a sentence uses the term ``binding,'' the latter can be -linked to the former using @racketfont["@tech{bind}ing"].} - -@defproc[(techlink [pre-content pre-content?] ... - [#:key key (or/c string? #f) #f] - [#:normalize? normalize? any/c #t] - [#:doc module-path (or/c module-path? #f) #f] - [#:tag-prefixes prefixes (or/c (listof string?) #f) #f]) - element?]{ - -Like @racket[tech], but the link is not quiet. For example, in HTML -output, a hyperlink underline appears even when the mouse is not over -the link.} - -@; ------------------------------------------------------------------------ -@section[#:tag "manual-indexing"]{Indexing} - -See also @secref["base-indexing"] for @racketmodname[scribble/base]. - -@defform[(indexed-racket datum ...)]{ - -A combination of @racket[racket] and @racket[as-index], with the -following special cases when a single @racket[datum] is provided: - - @itemize[ - - @item{If @racket[datum] is a @racket[quote] form, then the quote is - removed from the key (so that it's sorted using its unquoted - form).} - - @item{If @racket[datum] is a string, then quotes are removed from the - key (so that it's sorted using the string content).} - -]} - -@defform[(indexed-scheme datum ...)]{ - -Compatibility alias for @racket[indexed-racket].} - -@defproc[(idefterm [pre-content pre-content?] ...) element?]{Combines -@racket[as-index] and @racket[defterm]. The content normally should be -plural, rather than singular. Consider using @racket[deftech], -instead, which always indexes.} - -@defproc[(pidefterm [pre-content pre-content?] ...) element?]{Like -@racket[idefterm], but plural: adds an ``s'' on the end of the content -for the index entry. Consider using @racket[deftech], instead.} - -@defproc[(indexed-file [pre-content pre-content?] ...) element?]{A -combination of @racket[file] and @racket[as-index], but where the sort -key for the index iterm does not include quotes.} - -@defproc[(indexed-envvar [pre-content pre-content?] ...) element?]{A -combination of @racket[envvar] and @racket[as-index].} - -@; ------------------------------------------------------------------------ -@section{Bibliography} - -@margin-note{See also @racketmodname[scriblib/autobib].} - -@defproc[(cite [key string?] ...+) element?]{ - -Links to a bibliography entry, using the @racket[key]s both to indicate the -bibliography entry and, in square brackets, as the link text.} - -@defproc[(bibliography [#:tag tag string? "doc-bibliography"] - [entry bib-entry?] ...) - part?]{ - -Creates a bibliography part containing the given entries, each of -which is created with @racket[bib-entry]. The entries are typeset in -order as given.} - -@defproc[(bib-entry [#:key key string?] - [#:title title (or/c #f pre-content?)] - [#:is-book? is-book? boolean? #f] - [#:author author (or/c #f pre-content?) #f] - [#:location location (or/c #f pre-content?) #f] - [#:date date (or/c #f pre-content?) #f] - [#:url url (or/c #f pre-content?) #f]) - bib-entry?]{ - -Creates a bibliography entry. The @racket[key] is used to refer to the -entry via @racket[cite]. The other arguments are used as elements in -the entry: - -@itemize[ - - @item{@racket[title] is the title of the cited work. It will be - surrounded by quotes in typeset form if @racket[is-book?] is - @racket[#f], otherwise it is typeset via @racket[italic].} - - @item{@racket[author] lists the authors. Use names in their usual - order (as opposed to ``last, first''), and separate multiple - names with commas using ``and'' before the last name (where - there are multiple names). The @racket[author] is typeset in - the bibliography as given, or it is omitted if given as - @racket[#f].} - - @item{@racket[location] names the publication venue, such as a - conference name or a journal with volume, number, and - pages. The @racket[location] is typeset in the bibliography as - given, or it is omitted if given as @racket[#f].} - - @item{@racket[date] is a date, usually just a year (as a string). It - is typeset in the bibliography as given, or it is omitted if - given as @racket[#f].} - - @item{@racket[url] is an optional URL. It is typeset in the - bibliography using @racket[tt] and hyperlinked, or it is - omitted if given as @racket[#f].} - -]} - - -@defproc[(bib-entry? [v any/c]) boolean?]{ - -Returns @racket[#t] if @racket[v] is a bibliography entry created by -@racket[bib-entry], @racket[#f] otherwise.} - - -@; ------------------------------------------------------------------------ -@section{Version History} - -@defform[(history clause ...) - #:grammar ([clause (code:line #:added version-expr) - (code:line #:changed version-expr content-expr)]) - #:contracts ([version-expr valid-version?] - [content-expr content?])]{ - -Generates a @tech{block} for version-history notes. The version -refers to a package as determined by a @racket[defmodule] or -@racket[declare-exporting] declaration within an enclosing section. - -Normally, @racket[history] should be used at the end of a -@racket[defform], @racket[defproc], @|etc|, entry, although it may -also appear in a section that introduces a module (that has been added -to a package). In the case of a @racket[changed] entry, the content -produced by @racket[content-expr] should normally start with a capital -letter and end with a period, but it can be a sentence fragment such -as ``Added a @racket[#:changed] form.'' - -Examples: -@codeblock[#:keep-lang-line? #f]|{ -#lang scribble/manual -@defthing[tasty-burrito burrito?]{ - Compatible with the API of a sandwich, but not legally a - sandwich in Massachusetts. - - @history[#:added "1.0" - #:changed "1.1" "Refactored tortilla." - #:changed "1.2" @elem{Now includes @emph{guacamole}.}] -} -}| -@doc-render-examples[ - @defthing[tasty-burrito burrito?]{ - Compatible with the API of a sandwich, but not legally a - sandwich in Massachusetts. - - @history[#:added "1.0" - #:changed "1.1" "Refactored tortilla." - #:changed "1.2" @elem{Now includes @emph{guacamole}.}] -}] - -@history[#:added "1.1"]} - -@; ------------------------------------------------------------------------ -@section{Miscellaneous} - -@defproc[(t [pre-content pre-content?] ...) paragraph?]{Wraps the -@tech{decode}d @racket[pre-content] as a paragraph.} - -@defthing[etc element?]{Like @racket["etc."], but with an -abbreviation-ending period for use in the middle of a sentence.} - -@defthing[PLaneT element?]{@racket["PLaneT"] (to help make sure you get -the letters in the right case).} - -@defthing[manual-doc-style style?]{ - -A style to be used for a document's main @racket[part] to get the -style configuration of @racket[@#,hash-lang[] @#,racketmodname[scribble/manual]]. -See @secref["manual-render-style"].} - -@defproc[(hash-lang) element?]{Returns an element for @hash-lang[] -that is hyperlinked to an explanation.} - -@defthing[void-const element?]{Returns an element for @|void-const|.} - -@defthing[undefined-const element?]{Returns an element for @|undefined-const|.} - -@defproc[(commandline [pre-content pre-content?] ...) paragraph?]{Produces -an inset command-line example (e.g., in typewriter font).} - -@defproc[(inset-flow [pre-flow pre-flow?] ...) nested-flow?]{ - -Creates a @racket[nested-flow] with indenting on the left and right. - -Using @racket[nested] with the @racket['inset] style is a prefered -alternative.} - -@defproc[(centerline [pre-flow pre-flow?] ...) nested-flow?]{ - -An alias for @racket[centered] for backward compatibility.} - -@defproc[(math [pre-content any/c] ...) element?]{The @tech{decode}d -@racket[pre-content] is further transformed: - - @itemize[ - - @item{Any immediate @racket['rsquo] is converted to @racket['prime].} - - @item{Parentheses and sequences of decimal digits in immediate - strings are left as-is, but any other immediate string is - italicized.} - - @item{When @litchar{_} appears before a non-empty sequence of numbers - and letters, the sequence is typeset as a subscript.} - - @item{When @litchar{^} appears before a non-empty sequence of numbers - and letters, the sequence is typeset as a superscript.} - - ]} - -@defproc[(filebox [filename (or/c string? element?)] [pre-flow pre-flow?] ...) - block?]{ - -Typesets the @racket[pre-flow]s as the content of -@racket[filename]. For example, the content may be inset on the page -with @racket[filename] above it. If @racket[filename] is a string, it -is passed to @racket[filepath] to obtain an @racket[element].} - -@defproc[(deprecated [#:what what content? "library"] - [replacement content?] - [additional-notes content?] ...) - block?]{ -Produces an inset warning for deprecated libraries, functions, @|etc| (as -described by @racket[what]), where @racket[replacement] describes a -suitable replacement. The @racket[additional-notes] are included after the -initial deprecation message.} - -@defproc[(image/plain [filename-relative-to-source string?] - [pre-element any/c] ...) - element?]{ - - An alias for @racket[image] for backward compatibility.} - -@; ------------------------------------------------------------------------ -@section[#:tag "index-entries"]{Index-Entry Descriptions} - -@defmodule[scribble/manual-struct]{The -@racketmodname[scribble/manual-struct] library provides types used to -describe index entries created by @racketmodname[scribble/manual] -functions. These structure types are provided separate from -@racketmodname[scribble/manual] so that -@racketmodname[scribble/manual] need not be loaded when deserializing -cross-reference information that was generated by a previously -rendered document.} - -@defstruct[module-path-index-desc ()]{ - -Indicates that the index entry corresponds to a module definition via -@racket[defmodule] and company.} - -@deftogether[( -@defstruct[(language-index-desc module-path-index-desc) ()]{} -@defstruct[(reader-index-desc module-path-index-desc) ()]{} -)]{ -Indicates that the index entry corresponds to a module definition via -@racket[defmodule] with the @racket[#:lang] or @racket[#:reader] option. -For example, a module definition via @racket[defmodulelang] has a -@racket[language-index-desc] index entry and a module definition via -@racket[defmodulereader] has a @racket[reader-index-desc] index entry.} - -@defstruct[exported-index-desc ([name symbol?] - [from-libs (listof module-path?)])]{ - -Indicates that the index entry corresponds to the definition of an -exported binding. The @racket[name] field and @racket[from-libs] list -correspond to the documented name of the binding and the primary -modules that export the documented name (but this list is not -exhaustive, because new modules can re-export the binding).} - -@defstruct[(form-index-desc exported-index-desc) ()]{ - -Indicates that the index entry corresponds to the definition of a -syntactic form via @racket[defform] and company.} - -@defstruct[(procedure-index-desc exported-index-desc) ()]{ - -Indicates that the index entry corresponds to the definition of a -procedure binding via @racket[defproc] and company.} - -@defstruct[(thing-index-desc exported-index-desc) ()]{ - -Indicates that the index entry corresponds to the definition of a -binding via @racket[defthing] and company.} - -@defstruct[(struct-index-desc exported-index-desc) ()]{ - -Indicates that the index entry corresponds to the definition of a -structure type via @racket[defstruct] and company.} - -@defstruct[(class-index-desc exported-index-desc) ()]{ - -Indicates that the index entry corresponds to the definition of a -class via @racket[defclass] and company.} - -@defstruct[(interface-index-desc exported-index-desc) ()]{ - -Indicates that the index entry corresponds to the definition of an -interface via @racket[definterface] and company.} - -@defstruct[(mixin-index-desc exported-index-desc) ()]{ - -Indicates that the index entry corresponds to the definition of a -mixin via @racket[defmixin] and company.} - -@defstruct[(method-index-desc exported-index-desc) ([method-name symbol?] - [class-tag tag?])]{ - -Indicates that the index entry corresponds to the definition of an -method via @racket[defmethod] and company. The @racket[_name] field -from @racket[exported-index-desc] names the class or interface that -contains the method. The @racket[method-name] field names the method. -The @racket[class-tag] field provides a pointer to the start of the -documentation for the method's class or interface.} - -@defstruct[(constructor-index-desc exported-index-desc) ([class-tag tag?])]{ - -Indicates that the index entry corresponds to a constructor -via @racket[defconstructor] and company. The @racket[_name] field -from @racket[exported-index-desc] names the class or interface that -contains the method. -The @racket[class-tag] field provides a pointer to the start of the -documentation for the method's class or interface.} - -@;---------------------------------------- - -@section[#:tag "manual-render-style"]{Manual Rendering Style} - -Using @racket[@#,hash-lang[] @#,racketmodname[scribble/manual]] for the -main @racket[part] of a document associates @tech{style properties} on -the @racket[doc] export to select the Racket manual style for -rendering. - -A @racket[html-defaults] @tech{style property} is added to -@racket[doc], unless @racket[doc]'s style already has a -@racket[html-defaults] @tech{style property} (e.g., supplied to -@racket[title]). Similarly, a @racket[latex-default] @tech{style -property} is added if one is not already present. Finally, an -@racket[css-style-addition] property is always added. - -For HTML rendering: - -@itemlist[ - - @item{The document's @tech{prefix file} is set to - @filepath{scribble-prefix.html}, as usual, in @racket[html-defaults].} - - @item{The document's @tech{style file} is set to - @filepath{manual-style.css} from the @filepath{scribble} - collection in @racket[html-defaults].} - - @item{The file @filepath{manual-files.css} from the - @filepath{scribble} collection is designated as an additional - accompanying file in @racket[html-defaults].} - - @item{The file @filepath{manual-racket.css} from the - @filepath{scribble} collection is added as a - @racket[css-style-addition].} - -] - -To obtain this configuration without using @racket[@#,hash-lang[] -@#,racketmodname[scribble/manual]], use @racket[manual-doc-style]. diff --git a/scribble-doc/scribblings/scribble/plt.scrbl b/scribble-doc/scribblings/scribble/plt.scrbl deleted file mode 100644 index 1aa71735..00000000 --- a/scribble-doc/scribblings/scribble/plt.scrbl +++ /dev/null @@ -1,25 +0,0 @@ -#lang scribble/manual -@(require "utils.rkt") - -@title[#:tag "plt-manuals" #:style 'toc]{Scribbling Documentation} - -The @racketmodname[scribble/manual] language and associated libraries -provide extensive support for documenting Racket libraries. The -most significant aspect of support for documentation is the way that -source-code bindings are connected to documentation sites through the -module namespace---a connection that is facilitated by the fact that -Scribble documents are themselves modules that reside in the same -namespace. @Secref["how-to-doc"] provides an introduction to using -Scribble for documentation, and the remaining sections document the -relevant libraries and APIs in detail. - -@local-table-of-contents[] - -@include-section["how-to.scrbl"] -@include-section["style.scrbl"] -@include-section["manual.scrbl"] -@include-section["scheme.scrbl"] -@include-section["examples.scrbl"] -@include-section["srcdoc.scrbl"] -@include-section["bnf.scrbl"] -@include-section["compat.scrbl"] diff --git a/scribble-doc/scribblings/scribble/reader-internals.scrbl b/scribble-doc/scribblings/scribble/reader-internals.scrbl deleted file mode 100644 index a46cdeec..00000000 --- a/scribble-doc/scribblings/scribble/reader-internals.scrbl +++ /dev/null @@ -1,335 +0,0 @@ -#lang scribble/doc -@(require scribble/manual scribble/bnf scribble/eval "utils.rkt" - (for-syntax racket/base) - (for-label (only-in scribble/reader - use-at-readtable))) - -@(define read-eval (make-base-eval)) -@(interaction-eval #:eval read-eval (require (for-syntax racket/base))) - -@title[#:tag "reader-internals"]{@"@" Reader Internals} - -@;-------------------------------------------------------------------- -@section{Using the @"@" Reader} - -You can use the reader via Racket's @racketfont{#reader} form: - -@racketblock[ - @#,racketfont|{ - #reader scribble/reader @foo{This is free-form text!} -}|] - -or use the @racket[at-exp] meta-language as described in -@secref["at-exp-lang"]. - -Note that the Scribble reader reads @tech{@"@"-forms} as S-expressions. This -means that it is up to you to give meanings for these expressions in -the usual way: use Racket functions, define your functions, or require -functions. For example, typing the above into @exec{racket} is likely -going to produce a ``reference to undefined identifier'' error, unless -@racket[foo] is defined. You can use @racket[string-append] instead, -or you can define @racket[foo] as a function (with variable arity). - -A common use of the Scribble @"@"-reader is when using Scribble as a -documentation system for producing manuals. In this case, the manual -text is likely to start with - -@racketmod[scribble/doc] - -which installs the @"@" reader starting in ``text mode,'' wraps the -file content afterward into a Racket module where many useful Racket -and documentation related functions are available, and parses the body -into a document using @racketmodname[scribble/decode]. See -@secref["docreader"] for more information. - -Another way to use the reader is to use the @racket[use-at-readtable] -function to switch the current readtable to a readtable that parses -@tech{@"@"-forms}. You can do this in a single command line: - -@commandline{racket -ile scribble/reader "(use-at-readtable)"} - -@;-------------------------------------------------------------------- -@section{Syntax Properties} - -The Scribble reader attaches properties to syntax objects. These -properties might be useful in some rare situations. - -Forms that Scribble reads are marked with a @racket['scribble] -property, and a value of a list of three elements: the first is -@racket['form], the second is the number of items that were read from -the datum part, and the third is the number of items in the body part -(strings, sub-forms, and escapes). In both cases, a @racket[0] means -an empty datum/body part, and @racket[#f] means that the corresponding -part was omitted. If the form has neither parts, the property is not -attached to the result. This property can be used to give different -meanings to expressions from the datum and the body parts, for -example, implicitly quoted keywords: - -@; FIXME: a bit of code duplication here -@def+int[ - #:eval read-eval - (define-syntax (foo stx) - (let ([p (syntax-property stx 'scribble)]) - (printf ">>> ~s\n" (syntax->datum stx)) - (syntax-case stx () - [(_ x ...) - (and (pair? p) (eq? (car p) 'form) (even? (cadr p))) - (let loop ([n (/ (cadr p) 2)] - [as '()] - [xs (syntax->list #'(x ...))]) - (if (zero? n) - (with-syntax ([attrs (reverse as)] - [(x ...) xs]) - #'(list 'foo `attrs x ...)) - (loop (sub1 n) - (cons (with-syntax ([key (car xs)] - [val (cadr xs)]) - #'(key ,val)) - as) - (cddr xs))))]))) - (eval:alts - (code:line - @#,tt["@foo[x 1 y (* 2 3)]{blah}"]) - ;; Unfortunately, expressions are preserved by `def+int' - ;; using `quote', not `quote-syntax' (which would create all sorts - ;; or binding trouble), so we manually re-attach the property: - (eval (syntax-property #'@foo[x 1 y (* 2 3)]{blah} - 'scribble '(form 4 1)))) -] - -In addition, the Scribble parser uses syntax properties to mark syntax -items that are not physically in the original source --- indentation -spaces and newlines. Both of these will have a @racket['scribble] -property; an indentation string of spaces will have -@racket['indentation] as the value of the property, and a newline will -have a @racket['(newline S)] value where @racket[S] is the original -newline string including spaces that precede and follow it (which -includes the indentation for the following item). This can be used to -implement a verbatim environment: drop indentation strings, and use -the original source strings instead of the single-newline string. Here -is an example of this. - -@; FIXME: a bit of code duplication here -@def+int[ - #:eval read-eval - (define-syntax (verb stx) - (syntax-case stx () - [(_ cmd item ...) - #`(cmd - #,@(let loop ([items (syntax->list #'(item ...))]) - (if (null? items) - '() - (let* ([fst (car items)] - [prop (syntax-property fst 'scribble)] - [rst (loop (cdr items))]) - (cond [(eq? prop 'indentation) rst] - [(not (and (pair? prop) - (eq? (car prop) 'newline))) - (cons fst rst)] - [else (cons (datum->syntax-object - fst (cadr prop) fst) - rst)])))))])) - (eval:alts - (code:line - @#,tt["@verb[string-append]{"] - @#,tt[" foo"] - @#,tt[" bar"] - @#,tt["}"]) - @verb[string-append]{ - foo - bar - }) -] - -@;-------------------------------------------------------------------- -@section[#:tag "at-exp-lang"]{Adding @"@"-expressions to a Language} - -@defmodulelang[at-exp]{The @racketmodname[at-exp] language installs -@seclink["reader"]{@"@"-reader} support in the readtable used to read -a module, and then chains to the reader of -another language that is specified immediately after -@racketmodname[at-exp].} - -For example, @racket[@#,hash-lang[] at-exp racket/base] adds @"@"-reader -support to @racket[racket/base], so that - -@racketmod[ -at-exp racket/base - -(define (greet who) @#,elem{@tt["@"]@racket[string-append]@racketparenfont["{"]@racketvalfont{Hello, }@tt["@|"]@racket[who]@tt["|"]@racketvalfont{.}@racketparenfont["}"]}) -(greet "friend")] - -reports @racket["Hello, friend."]. - -In addition to configuring the reader for a module body, -@racketmodname[at-exp] attaches a run-time configuration annotation to -the module, so that it if it used as the main module, the -@racket[current-read-interaction] parameter is adjusted to use the -@seclink["reader"]{@"@"-reader} readtable extension. - -@history[#:changed "1.2" @elem{Added @racket[current-read-interaction] - run-time configuration.}] - -@;-------------------------------------------------------------------- -@section{Interface} - -@defmodule[scribble/reader]{The @racketmodname[scribble/reader] module -provides direct Scribble reader functionality for advanced needs.} - -@; The `with-scribble-read' trick below shadows `read' and -@; `read-syntax' with for-label bindings from the Scribble reader - -@(define-syntax with-scribble-read - (syntax-rules () - [(_) - (... - (begin - (require (for-label scribble/reader)) - -@; *** Start reader-import section *** -@deftogether[( -@defproc[(read [in input-port? (current-input-port)]) any]{} -@defproc[(read-syntax [source-name any/c (object-name in)] - [in input-port? (current-input-port)]) - (or/c syntax? eof-object?)] -)]{ - -Implements the Scribble reader using the readtable produced by - -@racketblock[(make-at-readtable #:command-readtable 'dynamic - #:datum-readtable 'dynamic)] - -@history[#:changed "1.1" @elem{Changed to use @racket['dynamic] for the command and datum readtables.}]} - - -@deftogether[( -@defproc[(read-inside [in input-port? (current-input-port)]) any]{} -@defproc[(read-syntax-inside [source-name any/c (object-name in)] - [in input-port? (current-input-port)] - [#:command-char command-char char? #\@]) - (or/c syntax? eof-object?)] -)]{ - -Like @racket[read] and @racket[read-syntax], but starting as if -inside a @litchar["@{"]...@litchar["}"] to return a (syntactic) list, -which is useful for implementing languages that are textual by default. - -The given @racket[command-char] is used to customize the readtable -used by the reader, effectively passing it along to @racket[make-at-readtable]. - -@history[#:changed "1.1" @elem{Changed to use @racket['dynamic] for the command and datum readtables.}] -} - -@defproc[(make-at-readtable - [#:readtable readtable readtable? (current-readtable)] - [#:command-char command-char char? #\@] - [#:command-readtable command-readtable (or/c readtable? 'dynamic) readtable] - [#:datum-readtable datum-readtable - (or/c readtable? - boolean? - (readtable? . -> . readtable?) - 'dynamic) - #t] - [#:syntax-post-processor syntax-post-proc - (syntax? . -> . syntax?) - values]) - readtable?]{ - -Constructs an @"@"-readtable. The keyword arguments can customize the -resulting reader in several ways: - -@itemize[ - -@item{@racket[readtable] --- a readtable to base the @"@"-readtable - on.} - -@item{@racket[command-char] --- the character used for @tech{@"@"-forms}.} - -@item{@racket[command-readtable] --- determines the readtable that is - extended for reading the command part of an @tech{@"@"-form}: - - @itemlist[ - @item{a readtable --- extended to make @litchar{|} a delimiter - instead of a symbol-quoting character} - - @item{@racket['dynamic] --- extends @racket[(current-readtable)] - at the point where a command is parsed to make @litchar{|} a - delimiter} - ]} - -@item{@racket[datum-readtable] --- the readtable used for - reading the datum part of an @tech{@"@"-form}: - - @itemlist[ - @item{@racket[#t] --- uses the constructed @"@"-readtable itself} - @item{a readtable --- uses the given readtable} - @item{a readtable-to-readtable function --- called to construct a readtable - from the generated @"@"-readtable} - @item{@racket['dynamic] --- uses @racket[(current-readtable)] at the - point where the datum part is parsed} - ] - - The idea is that you may want to have completely - different uses for the datum part, for example, introducing a - convenient @litchar{key=val} syntax for attributes.} - -@item{@racket[syntax-post-proc] --- function that is applied on - each resulting syntax value after it has been parsed (but before it - is wrapped quoting punctuations). You can use this to further - control uses of @tech{@"@"-forms}, for example, making the command be the - head of a list: - - @racketblock[ - (use-at-readtable - #:syntax-post-processor - (lambda (stx) - (syntax-case stx () - [(cmd rest ...) #'(list 'cmd rest ...)] - [_else (error "@ forms must have a body")]))) - ]} - -] - -@history[#:changed "1.1" @elem{Added @racket[#:command-readtable] and - the @racket['dynamic] option for @racket[#:datum-readtable].}]} - - -@defproc[(make-at-reader [#:syntax? syntax? #t] [#:inside? inside? #f] ...) - procedure?]{ -Constructs a variant of a @"@"-readtable. The arguments are the same -as in @racket[make-at-readtable], with two more that determine the -kind of reader function that will be created: @racket[syntax?] chooses -between a @racket[read]- or @racket[read-syntax]-like function, and -@racket[inside?] chooses a plain reader or an @racketid[-inside] -variant. - -The resulting function has a different contract and action based on -these inputs. The expected inputs are as in @racket[read] or -@racket[read-syntax] depending on @racket[syntax?]; the function will -read a single expression or, if @racket[inside?] is true, the whole -input; it will return a syntactic list of expressions rather than a -single one in this case. - -Note that @racket[syntax?] defaults to @racket[#t], as this is the -more expected common case when you're dealing with concrete-syntax -reading. - -Note that if @racket[syntax?] is true, the @racket[read]-like function -is constructed by simply converting a syntax result back into a datum.} - - -@defproc[(use-at-readtable ...) void?]{ - -Passes all arguments to @racket[make-at-readtable], and installs the -resulting readtable using @racket[current-readtable]. It also enables -line counting for the current input-port via @racket[port-count-lines!]. - -This is mostly useful for playing with the Scribble syntax on the REPL.} - -@; *** End reader-import section *** -))])) -@with-scribble-read[] - -@; -------------------------------------------------- -@(close-eval read-eval) - diff --git a/scribble-doc/scribblings/scribble/reader.scrbl b/scribble-doc/scribblings/scribble/reader.scrbl deleted file mode 100644 index 6f8d980f..00000000 --- a/scribble-doc/scribblings/scribble/reader.scrbl +++ /dev/null @@ -1,742 +0,0 @@ -#lang scribble/doc -@(require scribble/manual scribble/bnf scribble/eval "utils.rkt" - (for-syntax racket/base) - (for-label (only-in scribble/reader - use-at-readtable))) - -@(define read-eval (make-base-eval)) -@(interaction-eval #:eval read-eval (require (for-syntax racket/base))) - -@(define (at-exp-racket) - @racket[#, @hash-lang[] #, @racketmodname[at-exp] #, @racketidfont{racket}]) - -@title[#:tag "reader"]{@"@" Syntax} - -The Scribble @"@" notation is designed to be a convenient facility for -free-form text in Racket code, where ``@"@"'' was chosen as one of the -least-used characters in existing Racket code. An @"@"-expression is -simply an S-expression in disguise. - -Typically, @"@" notation is enabled through -@racketmodname[scribble/base] or similar languages, but you can also -add @"@" notation to an S-expression-based language using the -@racketmodname[at-exp] meta-language. For example, - -@verbatim[#:indent 2]|{ - #lang at-exp racket - (define v '@op{str}) -}| - -is equivalent to - -@racketmod[ -racket -(define v '(op "str")) -] - -Using @at-exp-racket[] is probably the easiest way to try the examples -in this chapter. - -@;-------------------------------------------------------------------- -@section{The Scribble Syntax at a Glance} - -To review @secref["how-to:reader"], the concrete syntax of @deftech{@"@"-forms} -is roughly - -@racketblock[ - @#,BNF-seq[@litchar["@"] - @nonterm{cmd} - @litchar{[} @kleenestar{@nonterm{datum}} @litchar{]} - @litchar["{"] @kleenestar{@nonterm{text-body}} @litchar["}"]] -] - -where all three parts after @litchar["@"] are optional, but at least -one should be present. (Spaces are not allowed between the -three parts.) Roughly, a form matching the above grammar is read as - -@racketblock[ - (@#,nonterm{cmd} @#,kleenestar{@nonterm{datum}} @#,kleenestar{@nonterm{parsed-body}}) -] - -where @nonterm{parsed-body} is the translation of each -@nonterm{text-body} in the input. Thus, the initial @nonterm{cmd} -determines the Racket code that the input is translated into. The -common case is when @nonterm{cmd} is a Racket identifier, which reads -as a plain Racket form, with datum arguments and/or string arguments. - -Here is one example: - -@scribble-examples|==={ - @foo{blah blah blah} -}===| - -The example shows how an input syntax is read as Racket syntax, not -what it evaluates to. If you want to see the translation of an example -into S-expression form, add a quote in front of it in a -@at-exp-racket[] module. For example, running - -@verbatim[#:indent 2]|{ - #lang at-exp racket - '@foo{blah blah blah} -}| - -in DrRacket prints the output - -@nested[#:style 'inset]{@racketresult[(foo "blah blah blah")]} - -while omitting the quote - -@verbatim[#:indent 2]|{ - #lang at-exp racket - @foo{blah blah blah} -}| - -triggers a syntax error because @racket[foo] is not bound, and - -@verbatim[#:indent 2]|{ - #lang at-exp racket - (define (foo str) (printf "He wrote ~s.\n" str)) - @foo{blah blah blah} -}| - -prints the output - -@nested[#:style 'inset]{@racketoutput{He wrote "blah blah blah".}} - -Here are more examples of @tech{@"@"-forms}: - -@scribble-examples|==={ - @foo{blah "blah" (`blah'?)} - @foo[1 2]{3 4} - @foo[1 2 3 4] - @foo[#:width 2]{blah blah} - @foo{blah blah - yada yada} - @foo{ - blah blah - yada yada - } -}===| - -As seen in the last example, multiple lines and the newlines that -separate them are parsed to multiple Racket strings. More generally, -a @nonterm{text-body} is made of text, newlines, and nested -@tech{@"@"-forms}, where the syntax for @tech{@"@"-forms} is the same whether it's -in a @nonterm{text-body} context as in a Racket context. A -@nonterm{text-body} that isn't an @tech{@"@"-form} is converted to a string -expression for its @nonterm{parsed-body}; newlines and following -indentations are converted to @racket["\n"] and all-space string -expressions. - -@scribble-examples|==={ - @foo{bar @baz{3} - blah} - @foo{@b{@u[3] @u{4}} - blah} - @C{while (*(p++)) - *p = '\n';} -}===| - -The command part of an @tech{@"@"-form} is optional as well. In that case, -the @tech{@"@"-form} is read as a list, which usually counts as a function -application, but it also useful when quoted with the usual Racket -@racket[quote]: - -@scribble-examples|==={ - @{blah blah} - @{blah @[3]} - '@{foo - bar - baz} -}===| - -Finally, we can also drop the datum and text parts, which leaves us with -only the command---which is read as is, not within a parenthesized -form. This is not useful when reading Racket code, but it can be used -inside a text block to escape a Racket identifier. A vertical bar -(@litchar{|}) can be used to delimit the escaped identifier when -needed. - -@scribble-examples|==={ - @foo - @{blah @foo blah} - @{blah @foo: blah} - @{blah @|foo|: blah} -}===| - -Actually, the command part can be any Racket expression (that does not -start with @litchar["["], @litchar["{"], or @litchar["|"]), which is -particularly useful with such escapes since they can be used with any -expression. - -@scribble-examples|==={ - @foo{(+ 1 2) -> @(+ 1 2)!} - @foo{A @"string" escape} -}===| - -Note that an escaped Racket string is merged with the surrounding text -as a special case. This is useful if you want to use the special -characters in your string, but escaping braces are not necessary if -they are balanced. - -@scribble-examples|==={ - @foo{eli@"@"barzilay.org} - @foo{A @"{" begins a block} - @C{while (*(p++)) { - *p = '\n'; - }} -}===| - -In some cases, a text contains many literal @"@"s, which can be -cumbersome to quote individually. For such case, braces have an -alternative syntax: A block of text can begin with a -``@litchar["|{"]'' and terminated accordingly with a -``@litchar["}|"]''. Furthermore, any nested @tech{@"@"-forms} must begin -with a ``@litchar["|@"]''. - -@scribble-examples|==={ - @foo|{bar}@{baz}| - @foo|{bar |@x{X} baz}| - @foo|{bar |@x|{@}| baz}| -}===| - -In cases when even this is not convenient enough, punctuation -characters can be added between the @litchar{|} and the braces and the -@"@" in nested forms. (The punctuation is mirrored for parentheses -and @litchar{<>}s.) With this extension, @tech{@"@"-form} syntax can be used as a -``here string'' replacement. - -@scribble-examples|==={ - @foo|--{bar}@|{baz}--| - @foo|<<{bar}@|{baz}>>| -}===| - -On the flip side of this is, how can an @"@" sign be used in Racket -code? This is almost never an issue, because Racket strings and -characters are still read the same, and @litchar["@"] is set as a -non-terminating reader macro so it can be used in Racket identifiers -anywhere except in the first character of an identifier. When -@litchar["@"] must appear as the first character of an identifier, you -must quote the identifier just like other non-standard characters in -normal S-expression syntax: with a backslash or with vertical bars. - -@scribble-examples|==={ - (define \@email "foo@bar.com") - (define |@atchar| #\@) -}===| - -Note that spaces are not allowed before a @litchar{[} or a -@litchar["{"], or they will be part of the following text (or Racket -code). (More on using braces in body texts below.) - -@scribble-examples|==={ - @foo{bar @baz[2 3] {4 5}} -}===| - -Finally, remember that @tech{@"@"-forms} are just an alternate form of -S-expressions. Identifiers still get their meaning, as in any -Racket code, through the lexical context in which they appear. -Specifically, when the above @tech{@"@"-form} appears in a Racket expression -context, the lexical environment must provide bindings for -@racket[foo] as a procedure or a macro; it can be defined, required, -or bound locally (with @racket[let], for example). - -@; FIXME: unfortunate code duplication -@interaction[ -(eval:alts - (let* ([formatter (lambda (fmt) - (lambda args (format fmt (apply string-append args))))] - [bf (formatter "*~a*")] - [it (formatter "/~a/")] - [ul (formatter "_~a_")] - [text string-append]) - #,(tt "@text{@it{Note}: @bf{This is @ul{not} a pipe}.}")) - (let* ([formatter (lambda (fmt) - (lambda args (format fmt (apply string-append args))))] - [bf (formatter "*~a*")] - [it (formatter "/~a/")] - [ul (formatter "_~a_")] - [text string-append]) - @text{@it{Note}: @bf{This is @ul{not} a pipe}.})) -] - -@;-------------------------------------------------------------------- -@section{The Command Part} - -Besides being a Racket identifier, the @nonterm{cmd} part of an -@tech{@"@"-form} can have Racket punctuation prefixes, which will end up -wrapping the @italic{whole} expression. - -@scribble-examples|==={ - @`',@foo{blah} - @#`#'#,@foo{blah} -}===| - -When writing Racket code, this means that @litchar|{@`',@foo{blah}}| -is exactly the same as @litchar|{`@',@foo{blah}}| and -@litchar|{`',@@foo{blah}}|, but unlike the latter two, the first -construct can appear in body texts with the same meaning, whereas the -other two would not work (see below). - -After the optional punctuation prefix, the @nonterm{cmd} itself is not -limited to identifiers; it can be @italic{any} Racket expression. - -@scribble-examples|==={ - @(lambda (x) x){blah} - @`(unquote foo){blah} -}===| - -In addition, the command can be omitted altogether, which will omit it -from the translation, resulting in an S-expression that usually -contains, say, just strings: - -@scribble-examples|==={ - @{foo bar - baz} - @'{foo bar - baz} -}===| - -If the command part begins with a @litchar{;} (with no newline between -the @litchar["@"] and the @litchar{;}), then the construct is a -comment. There are two comment forms, one for arbitrary-text and -possibly nested comments, and another one for line comments: - -@racketblock[ -@#,BNF-seq[@litchar["@;{"] @kleenestar{@nonterm{any}} @litchar["}"]] - -@#,BNF-seq[@litchar["@;"] @kleenestar{@nonterm{anything-else-without-newline}}] -] - -In the first form, the commented body must still parse correctly; see -the description of the body syntax below. In the second form, all -text from the @litchar["@;"] to the end of the line @italic{and} all -following spaces (or tabs) are part of the comment (similar to -@litchar{%} comments in TeX). - -@scribble-examples|==={ - @foo{bar @; comment - baz@; - blah} -}===| - -Tip: if you use an editor in some Scheme mode without support for -@tech{@"@"-forms}, balanced comments can be confusing, since the open brace -looks commented out, and the closing one isn't. In such cases it is -useful to ``comment'' out the closing brace too: - -@verbatim[#:indent 2]|==={ - @;{ - ... - ;} -}===| - -so the editor does not treat the file as having unbalanced -parentheses. - -If only the @nonterm{cmd} part of an @tech{@"@"-form} is specified, then the -result is the command part only, without an extra set of parenthesis. -This makes it suitable for Racket escapes in body texts. (More on this -below, in the description of the body part.) - -@scribble-examples|==={ - @foo{x @y z} - @foo{x @(* y 2) z} - @{@foo bar} -}===| - -Finally, note that there are currently no special rules for using -@litchar["@"] in the command itself, which can lead to things like: - -@scribble-examples|==={ - @@foo{bar}{baz} -}===| - -@;-------------------------------------------------------------------- -@section{The Datum Part} - -The datum part can contains arbitrary Racket expressions, which -are simply stacked before the body text arguments: - -@scribble-examples|==={ - @foo[1 (* 2 3)]{bar} - @foo[@bar{...}]{blah} -}===| - -The body part can still be omitted, which is essentially an -alternative syntax for plain (non-textual) S-expressions: - -@scribble-examples|==={ - @foo[bar] - @foo{bar @f[x] baz} -}===| - -The datum part can be empty, which makes no difference, except when -the body is omitted. It is more common, however, to use an empty body -for the same purpose. - -@scribble-examples|==={ - @foo[]{bar} - @foo[] - @foo - @foo{} -}===| - -The most common use of the datum part is for Racket forms that expect -keyword-value arguments that precede the body of text arguments. - -@scribble-examples|==={ - @foo[#:style 'big]{bar} -}===| - -@;-------------------------------------------------------------------- -@section{The Body Part} - -The syntax of the body part is intended to be as convenient as -possible for free text. It can contain almost any text---the only -characters with special meaning is @litchar["@"] for sub-@tech{@"@"-forms}, -and @litchar["}"] for the end of the text. In addition, a -@litchar["{"] is allowed as part of the text, and it makes the -matching @litchar["}"] be part of the text too---so balanced braces -are valid text. - -@scribble-examples|==={ - @foo{f{o}o} - @foo{{{}}{}} -}===| - -As described above, the text turns to a sequence of string arguments -for the resulting form. Spaces at the beginning and end of lines are -discarded, and newlines turn to individual @racket["\n"] strings -(i.e., they are not merged with other body parts); see also the -information about newlines and indentation below. Spaces are -@italic{not} discarded if they appear after the open @litchar["{"] -(before the closing @litchar["}"]) when there is also text that -follows (precedes) it; specifically, they are preserved in a -single-line body. - -@scribble-examples|==={ - @foo{bar} - @foo{ bar } - @foo[1]{ bar } -}===| - -If @litchar["@"] appears in a body, then it is interpreted as Racket -code, which means that the @"@"-reader is applied recursively, and the -resulting syntax appears as part of the S-expression, among other -string contents. - -@scribble-examples|==={ - @foo{a @bar{b} c} -}===| - -If the nested @"@" construct has only a command---no body or datum -parts---it will not appear in a subform. Given that the command part -can be any Racket expression, this makes @"@" a general escape to -arbitrary Racket code. - -@scribble-examples|==={ - @foo{a @bar c} - @foo{a @(bar 2) c} -}===| - -This is particularly useful with strings, which can be used to include -arbitrary text. - -@scribble-examples|==={ - @foo{A @"}" marks the end} -}===| - -Note that the escaped string is (intentionally) merged with the rest -of the text. This works for @litchar["@"] too: - -@scribble-examples|==={ - @foo{The prefix: @"@".} - @foo{@"@x{y}" --> (x "y")} -}===| - -@;-------------------------------------------------------------------- -@subsection[#:tag "alt-body-syntax"]{Alternative Body Syntax} - -In addition to the above, there is an alternative syntax for the body, -one that specifies a new marker for its end: use @litchar["|{"] for -the opening marker to have the text terminated by a @litchar["}|"]. - -@scribble-examples|==={ - @foo|{...}| - @foo|{"}" follows "{"}| - @foo|{Nesting |{is}| ok}| -}===| - -This applies to sub-@tech{@"@"-forms} too---the @litchar["@"] must be -prefixed with a @litchar{|}: - -@scribble-examples|==={ - @foo|{Maze - |@bar{is} - Life!}| - @t|{In |@i|{sub|@"@"s}| too}| -}===| - -Note that the subform uses its own delimiters, @litchar{{...}} or -@litchar{|{...}|}. This means that you can copy and paste Scribble -text with @tech{@"@"-forms} freely, just prefix the @litchar["@"] if the -immediate surrounding text has a prefix. - -For even better control, you can add characters in the opening -delimiter, between the @litchar{|} and the @litchar["{"]. -Characters that are put there (non alphanumeric ASCII characters only, -excluding @litchar["{"] and @litchar["@"]) should also be used for -sub-@tech{@"@"-forms}, and the end-of-body marker should have these characters -in reverse order with paren-like characters (@litchar{(}, -@litchar{[}, @litchar{<}) mirrored. - -@scribble-examples|==={ - @foo|<<<{@x{foo} |@{bar}|.}>>>| - @foo|!!{X |!!@b{Y}...}!!| -}===| - -Finally, remember that you can use an expression escape with a Racket -string for confusing situations. This works well when you only need -to quote short pieces, and the above works well when you have larger -multi-line body texts. - -@;-------------------------------------------------------------------- -@subsection{Racket Expression Escapes} - -In some cases, you may want to use a Racket identifier (or a number or -a boolean etc.) in a position that touches the following text; in -these situations you should surround the escaped Racket expression by -a pair of @litchar{|} characters. The text inside the bars is -parsed as a Racket expression. - -@scribble-examples|==={ - @foo{foo@bar.} - @foo{foo@|bar|.} - @foo{foo@3.} - @foo{foo@|3|.} -}===| - -This form is a generic Racket expression escape, there is no body text -or datum part when you use this form. - -@scribble-examples|==={ - @foo{foo@|(f 1)|{bar}} - @foo{foo@|bar|[1]{baz}} -}===| - -This works for string expressions too, but note that unlike the above, -the string is (intentionally) not merged with the rest of the text: - -@scribble-examples|==={ - @foo{x@"y"z} - @foo{x@|"y"|z} -}===| - -Expression escapes also work with @italic{any} number of expressions, - -@scribble-examples|==={ - @foo{x@|1 (+ 2 3) 4|y} - @foo{x@|* - *|y} -}===| - -It seems that @litchar["@||"] has no purpose---but remember that these escapes -are never merged with the surrounding text, which can be useful when -you want to control the sub expressions in the form. - -@scribble-examples|==={ - @foo{Alice@||Bob@| - |Carol} -}===| - -Note that @litchar["@|{...}|"] can be parsed as either an escape expression or -as the Racket command part of an @tech{@"@"-form}. The latter is used in this case -(since there is little point in Racket code that uses braces. - -@scribble-examples|==={ - @|{blah}| -}===| - -@;-------------------------------------------------------------------- -@subsection{Comments} - -As noted above, there are two kinds of @tech{@"@"-form} comments: @litchar|{@;{...}}| is -a (nestable) comment for a whole body of text (following the same -rules for @tech{@"@"-forms}), and @litchar|{@;...}| is a line-comment. - -@scribble-examples|==={ - @foo{First line@;{there is still a - newline here;} - Second line} -}===| - -One useful property of line-comments is that they continue to the end -of the line @italic{and} all following spaces (or tabs). Using this, -you can get further control of the subforms. - -@scribble-examples|==={ - @foo{A long @; - single-@; - string arg.} -}===| - -Note how this is different from using @litchar["@||"]s in that strings -around it are not merged. - -@;-------------------------------------------------------------------- -@subsection{Spaces, Newlines, and Indentation} - -The @tech{@"@"-form} syntax treats spaces and newlines in a special way is -meant to be sensible for dealing with text. As mentioned above, -spaces at the beginning and end of body lines are discarded, except -for spaces between a @litchar["{"] and text, or between text and a -@litchar["}"]. - -@scribble-examples|==={ - @foo{bar} - @foo{ bar } - @foo{ bar - baz } -}===| - -A single newline that follows an open brace or precedes a closing -brace is discarded, unless there are only newlines in the body; other -newlines are read as a @racket["\n"] string - -@scribble-examples|==={ - @foo{bar - } - @foo{ - bar - } - @foo{ - - bar - - } - @foo{ - bar - - baz - } - @foo{ - } - @foo{ - - } - @foo{ bar - baz } -}===| - -Spaces at the beginning of body lines do not appear in the resulting -S-expressions, but the column of each line is noticed, and all-space -indentation strings are added so the result has the same indentation. -A indentation string is added to each line according to its distance -from the leftmost syntax object (except for empty lines). (Note: if -you try these examples on a Racket REPL, you should be aware that -the reader does not know about the ``@litchar{> }'' prompt.) - -@scribble-examples|==={ - @foo{ - bar - baz - blah - } - @foo{ - begin - x++; - end} - @foo{ - a - b - c} -}===| - -If the first string came from the opening @litchar["{"] line, it is -not prepended with an indentation (but it can affect the leftmost -syntax object used for indentation). This makes sense when formatting -structured code as well as text (see the last example in the following -block). - -@scribble-examples|==={ - @foo{bar - baz - bbb} - @foo{ bar - baz - bbb} - @foo{bar - baz - bbb} - @foo{ bar - baz - bbb} - @foo{ bar - baz - bbb} - @text{Some @b{bold - text}, and - more text.} -}===| - -Note that each @"@"-form is parsed to an S-expression that has its own -indentation. This means that Scribble source can be indented like -code, but if indentation matters then you may need to apply -indentation of the outer item to all lines of the inner one. For -example, in - -@litchar/lines|==={ - @code{ - begin - i = 1, r = 1 - @bold{while i < n do - r *= i++ - done} - end - } -}===| - -a formatter will need to apply the 2-space indentation to the -rendering of the @racket[bold] body. - -Note that to get a first-line text to be counted as a leftmost line, -line and column accounting should be on for the input port -(@racket[use-at-readtable] turns them on for the current input port). -Without this, - -@litchar/lines|==={ - @foo{x1 - x2 - x3} -}===| - -will not have 2-space indentations in the parsed S-expression if -source accounting is not on, but - -@litchar/lines|==={ - @foo{x1 - x2 - x3} -}===| - -will (due to the last line). Pay attention to this, as it can be a -problem with Racket code, for example: - -@litchar/lines|==={ - @code{(define (foo x) - (+ x 1))} -}===| - -For rare situations where spaces at the beginning (or end) of lines -matter, you can begin (or end) a line with a @litchar["@||"]. - -@scribble-examples|==={ - @foo{ - @|| bar @|| - @|| baz} -}===| - -@; -------------------------------------------------- -@(close-eval read-eval) - diff --git a/scribble-doc/scribblings/scribble/renderer.scrbl b/scribble-doc/scribblings/scribble/renderer.scrbl deleted file mode 100644 index dc2421a2..00000000 --- a/scribble-doc/scribblings/scribble/renderer.scrbl +++ /dev/null @@ -1,474 +0,0 @@ -#lang scribble/doc -@(require scribble/manual - "utils.rkt" - (for-label racket/class - scribble/render - scribble/xref)) - -@(define-syntax-rule (defmodule/local lib . content) - (begin - (define-syntax-rule (intro) - (begin - (require (for-label lib)) - (defmodule lib) - . content)) - (intro))) - -@(begin - (define-syntax-rule (def-html-render-mixin id mid) - (begin - (require (for-label scribble/html-render)) - (define id @racket[render-mixin]) - (define mid @racket[render-multi-mixin]))) - (def-html-render-mixin html:render-mixin html:render-multi-mixin)) -@(begin - (define-syntax-rule (def-latex-render-mixin id) - (begin - (require (for-label scribble/latex-render)) - (define id @racket[render-mixin]))) - (def-latex-render-mixin latex:render-mixin)) - -@title[#:tag "renderer"]{Renderers} - -A renderer is an object that provides four main methods: -@racket[traverse], @racket[collect], @racket[resolve], and -@racketidfont{render}. Each method corresponds to a pass described in -@secref["core"], and they are chained together by the @racket[render] -function to render a document. - -@section{Rendering Driver} - -@defmodule[scribble/render] - -@defproc[(render [docs (listof part?)] - [names (listof path-string?)] - [#:render-mixin render-mixin (class? . -> . class?) @#,html:render-mixin] - [#:dest-dir dest-dir (or/c #f path-string?) #f] - [#:helper-file-prefix helper-file-prefix (or/c #f string?) #f] - [#:prefix-file prefix-file (or/c #f path-string?) #f] - [#:style-file style-file (or/c #f path-string?) #f] - [#:style-extra-files style-extra-files (listof path-string?) #f] - [#:extra-files extra-files (listof path-string?) #f] - [#:image-preferences image-preferences (listof (or/c 'ps 'pdf 'png 'svg 'gif)) null] - [#:xrefs xrefs (listof xref?) null] - [#:info-in-files info-in-files (listof path-string?) null] - [#:info-out-file info-out-file (or/c #f path-string?) #f] - [#:redirect redirect (or/c #f string?) #f] - [#:redirect-main redirect-main (or/c #f string?) #f] - [#:directory-depth directory-depth exact-nonnegative-integer? 0] - [#:quiet? quiet? any/c #t] - [#:warn-undefined? warn-undefined? any/c (not quiet?)]) - void?]{ - -Renders the given @racket[docs], each with an output name derived from -the corresponding element of @racket[names]. A directory path (if any) -for a name in @racket[names] is discarded, and the file suffix is -replaced (if any) with a suitable suffix for the output format. - -The @racket[render-mixin] argument determines the output format. By -default, it is @html:render-mixin from @racketmodname[scribble/html-render]. - -The @racket[dest-dir] argument determines the output directory, which -is created using @racket[make-directory*] if it is non-@racket[#f] and -does not exist already. - -The @racket[helper-file-prefix], @racket[prefix-file], -@racket[style-file], @racket[style-extra-files], and -@racket[extra-files] arguments are passed on to the @racket[render%] -constructor. - -The @racket[image-preferences] argument specified preferred formats -for image files and conversion, where formats listed earlier in the -list are more preferred. The renderer specified by -@racket[render-mixin] may not support all of the formats listed in -@racket[image-preferences]. - -The @racket[xrefs] argument provides extra cross-reference information -to be used during the documents' @tech{resolve pass}. The -@racket[info-in-files] arguments supply additional cross-reference -information in serialized form. When the @racket[info-out-file] -argument is not @racket[#f], cross-reference information for the -rendered documents is written in serialized for to the specified file. - -The @racket[redirect] and @racket[redirect-main] arguments correspond -to the @racket[set-external-tag-path] and -@racket[set-external-root-url] methods of @|html:render-mixin| from -@racketmodname[scribble/html-render], so they should be -non-@racket[#f] only for HTML rendering. - -The @racket[directory-depth] arguments correspond to the -@racket[set-directory-depth] method of @|html:render-multi-mixin|. - -If @racket[quiet?] is a false value, output-file information is -written to the current output port. - -If @racket[warn-undefined?] is a true value, then references to -missing cross-reference targets trigger a warning message on the -current error port. - -@history[#:changed "1.4" @elem{Added the @racket[#:image-preferences] argument.}]} - - -@section{Base Renderer} - -@defmodule[scribble/base-render]{The -@racketmodname[scribble/base-render] module provides @racket[render%], -which implements the core of a renderer. This rendering class must be -refined with a mixin from @racketmodname[scribble/text-render], -@racketmodname[scribble/markdown-render], or -@racketmodname[scribble/html-render], or -@racketmodname[scribble/latex-render].} - -The mixin structure is meant to support document-specific extensions -to the renderers. For example, the @exec{scribble} command-line tool -might, in the future, extract rendering mixins from a document module -(in addition to the document proper). - -See the @filepath{base-render.rkt} source for more information about -the methods of the renderer. Documents built with higher layers, such -as @racketmodname[scribble/manual], generally do not call the render -object's methods directly. - -@definterface[render<%> ()]{ - -@defmethod[(traverse [srcs (listof part?)] - [dests (listof path-string?)]) - (and/c hash? immutable?)]{ - -Performs the @techlink{traverse pass}, producing a hash table that -contains the replacements for and @racket[traverse-block]s and -@racket[traverse-elements]s. See @method[render<%> render] for -information on the @racket[dests] argument.} - -@defmethod[(collect [srcs (listof part?)] - [dests (listof path-string?)] - [fp (and/c hash? immutable?)] - [demand (tag? collect-info? . -> . any/c) (lambda (_tag _ci) #f)]) - collect-info?]{ - -Performs the @techlink{collect pass}. See @method[render<%> render] for -information on the @racket[dests] arguments. The @racket[fp] argument -is a result from the @method[render<%> traverse] method. - -The @racket[demand] argument supplies external tag mappings on demand. -When the @racket[collect-info] result is later used to find a mapping -for a tag and no mapping is already available, @racket[demand] is -called with the tag and the @racket[collect-info]. The @racket[demand] -function returns true to indicate when it adds information to the -@racket[collect-info] so that the lookup should be tried again; the -@racket[demand] function should return @racket[#f] if it does not -extend @racket[collect-info].} - -@defmethod[(resolve [srcs (listof part?)] - [dests (listof path-string?)] - [ci collect-info?]) - resolve-info?]{ - -Performs the @techlink{resolve pass}. See @method[render<%> render] for -information on the @racket[dests] argument. The @racket[ci] argument -is a result from the @method[render<%> collect] method.} - -@defmethod[(render [srcs (listof part?)] - [dests (listof path-string?)] - [ri resolve-info?]) - void?]{ - -Produces the final output. The @racket[ri] argument is a result from -the @method[render<%> render] method. - -The @racket[dests] provide names of files for Latex or single-file -HTML output, or names of sub-directories for multi-file HTML output. -If the @racket[dests] are relative, they're relative to the current -directory; normally, they should indicates a path within the -@racket[_dest-dir] supplied on initialization of the @racket[render%] -object.} - - -@defmethod[(serialize-info [ri resolve-info?]) - any/c]{ - -Serializes the collected info in @racket[ri].} - - -@defmethod[(serialize-infos [ri resolve-info?] - [count exact-positive-integer?] - [doc part?]) - list?]{ - -Like @method[render<%> serialize-info], but produces @racket[count] results -that together have the same information as produced by -@method[render<%> serialize-info]. The structure of @racket[doc] is used to -drive the partitioning (on the assumption that @racket[ri] is derived -from @racket[doc]).} - - -@defmethod[(deserialize-info [v any/c] - [ci collect-info?] - [#:root root-path (or/c path-string? false/c) #f]) - void?]{ - -Adds the deserialized form of @racket[v] to @racket[ci]. - -If @racket[root-path] is not @racket[#f], then file paths that are -recorded in @racket[ci] as relative to an instantiation-supplied -@racket[root-path] are deserialized as relative instead to the given -@racket[root-path].} - - -@defmethod[(get-defined [ci collect-info?]) (listof tag?)]{ - -Returns a list of tags that were defined within the documents -represented by @racket[ci].} - - -@defmethod[(get-defineds [ci collect-info?] - [count exact-positive-integer?] - [doc part?]) - (listof (listof tag?))]{ - -Analogous to @method[render<%> serialize-infos]: returns a list of -tags for each of @racket[count] partitions of the result of -@method[render<%> get-defined], using the structure of @racket[doc] to -drive the partitioning.} - - -@defmethod[(get-external [ri resolve-info?]) (listof tag?)]{ - -Returns a list of tags that were referenced but not defined within the -documents represented by @racket[ri] (though possibly found in -cross-reference information transferred to @racket[ri] via -@racket[xref-transfer-info]).} - - -@defmethod[(get-undefined [ri resolve-info?]) (listof tag?)]{ - -Returns a list of tags that were referenced by the resolved documents -with no target found either in the resolved documents represented by -@racket[ri] or cross-reference information transferred to @racket[ri] -via @racket[xref-transfer-info]. - -If multiple tags were referenced via @racket[resolve-search] and a -target was found for any of the tags using the same dependency key, -then no tag in the set is included in the list of undefined tags.} - -} - -@defclass[render% object% (render<%>)]{ - -Represents a renderer. - -@defconstructor[([dest-dir path-string?] - [refer-to-existing-files any/c #f] - [root-path (or/c path-string? #f) #f] - [prefix-file (or/c path-string? #f) #f] - [style-file (or/c path-string? #f) #f] - [style-extra-files (listof path-string?) null] - [extra-files (listof path-string?) null] - [image-preferences (listof (or/c 'ps 'pdf 'png 'svg 'gif)) null])]{ - -Creates a renderer whose output will go to @racket[dest-dir]. For -example, @racket[dest-dir] could name the directory containing the -output Latex file, the HTML file for a single-file output, or the -output sub-directory for multi-file HTML output. - -If @racket[refer-to-existing-files] is true, then when a document -refers to external files, such as an image or a style file, then the -file is referenced from its source location instead of copied to the -document destination. - -If @racket[root-path] is not @racket[#f], it is normally the same as -@racket[dest-dir] or a parent of @racket[dest-dir]. It causes -cross-reference information to record destination files relative to -@racket[root-path]; when cross-reference information is serialized, it -can be deserialized via @method[render<%> deserialize-info] with a -different root path (indicating that the destination files have -moved). - -The @racket[prefix-file], @racket[style-file], and -@racket[style-extra-files] arguments set files that control output -styles in a formal-specific way; see @secref["config-style"] for more -information. - -The @racket[extra-files] argument names files to be copied to the -output location, such as image files or extra configuration files. - -The @racket[image-preferences] argument specified preferred formats -for image files and conversion, where formats listed earlier in the -list are more preferred. The renderer may not support all of the -formats listed in @racket[image-preferences]. - -@history[#:changed "1.4" @elem{Added the @racket[image-preferences] - initialization argument.}]}} - -@; ---------------------------------------- - -@section{Text Renderer} - -@defmodule/local[scribble/text-render]{ - -@defmixin[render-mixin (render<%>) ()]{ - -Specializes a @racket[render<%>] class for generating plain text.}} - -@; ---------------------------------------- - -@section{Markdown Renderer} - -@defmodule/local[scribble/markdown-render]{ - -@defmixin[render-mixin (render<%>) ()]{ - -Specializes a @racket[render<%>] class for generating Markdown text. - -Code blocks are marked using the -@hyperlink["http://github.github.com/github-flavored-markdown/" -"Github convention"] @verbatim{```racket} so that they are lexed and -formatted as Racket code.}} - -@; ---------------------------------------- - -@section{HTML Renderer} - -@defmodule/local[scribble/html-render]{ - -@defmixin[render-mixin (render<%>) ()]{ - - @defconstructor/auto-super[([search-box? boolean? #f])]{ - Specializes a @racket[render<%>] class for generating - HTML output. The arguments are the same as - @racket[render<%>], except for the addition of - @racket[search-box]. - - If @racket[search-box?] is @racket[#t] and the document - is created with @racket[scribble/manual], then it will be - rendered with a search box, similar to this page. Note - that the @racket[search-box?] argument does not create - the search page itself. Rather, it passes the search - query to whatever page is located at - @tt{search/index.html}. The query is passed as an HTTP - query string in the @tt{q} field.} - -@defmethod[(set-external-tag-path [url string?]) void?]{ - -Configures the renderer to redirect links to external documents via -@racket[url], adding a @tt{tag} query element to the end of the -URL that contains the Base64-encoded, @racket[print]ed, serialized -original tag (in the sense of @racket[link-element]) for the link. - -If the link is based on a cross-reference entry that has a -document-identifying string (see @racket[load-xref] and its -@racket[#:doc-id] argument), the document identifier is added as a -@tt{doc} query element, and a path to the target within the -document is added as a @tt{rel} query element.} - -@defmethod[(set-external-root-url [url string?]) void?]{ - -Configures the renderer to redirect links to documents installed in -the distribution's documentation directory to the given URL, using the -URL as a replacement to the path of the distribution's document -directory.} - -} - -@defmixin[render-multi-mixin (render<%>) ()]{ - -Further specializes a rendering class produced by -@racket[render-mixin] for generating multiple HTML -files. - -@defmethod[(set-directory-depth [depth exact-nonnegative-integer?]) void?]{ - -Sets the depth of directory structure used when rendering parts that -are own their own pages. A value of @racket[0] is treated the same as -@racket[1].} - -} - -} - -@; ---------------------------------------- - -@section{Latex Renderer} - -@defmodule/local[scribble/latex-render]{ - -@defmixin[render-mixin (render<%>) ()]{ - -Specializes a @racket[render<%>] class for generating Latex input.}} - -@defparam[extra-character-conversions convs (-> char? (or/c string? #f))]{ -Function that maps (special) characters to strings corresponding to the Latex -code that should be used to render them. This function should return false for -any character it does not know how to handle. - -Scribble already converts many special characters to the proper Latex -commands. This parameter should be used in case you need characters it does not -support yet. -} - -@; ---------------------------------------- - -@section{PDF Renderer} - -@defmodule/local[scribble/pdf-render]{ - -@defmixin[render-mixin (render<%>) ()]{ - -Specializes a @racket[render<%>] class for generating PDF output via -Latex, building on @|latex:render-mixin| from @racketmodname[scribble/latex-render].}} - -@; ---------------------------------------- - -@section{Contract (Blue boxes) Renderer} - -@defmodule/local[scribble/contract-render]{ - -@defmixin[override-render-mixin-multi (render<%>) ()]{ - -Overrides the @method[render<%> render] method of -given renderer to record the content of the -blue boxes (generated by @racket[defproc], @racket[defform], etc) -that appear in the document. - -@defmethod[#:mode override - (render [srcs (listof part?)] - [dests (listof path?)] - [ri render-info?]) - void?]{ -In addition to doing whatever the @racket[super] method -does, also save the content of the blue boxes (rendered -via a @racketmodname[scribble/text-render] renderer). - -It saves this information in three pieces in a file -inside the @racket[dests] directories called -@filepath{blueboxes.rktd}. The first piece is -a single line containing a (decimal, ASCII) number. That number -is the number of bytes that the second piece of information -occupies in the file. The second piece of information -is a @racket[hash] that maps @racket[tag?] values to -a list of offsets and line numbers that follow the hash table. -For example, if the @racket[hash] maps -@racket['(def ((lib "x/main.rkt") abcdef))] to -@racket['((10 . 3))], then that means that the documentation -for the @racket[abcdef] export from the @racket[x] collection -starts 10 bytes after the end of the hash table and continues for -@racket[3] lines. Multiple elements in the list mean that that -@racket[tag?] has multiple blue boxes and each shows where one -of the boxes appears in the file. -}} - -@defmixin[override-render-mixin-single (render<%>) ()]{ - -Just like @racket[override-render-mixin-multi], except -it saves the resulting files in a different place. - -@defmethod[#:mode override - (render [srcs (listof part?)] - [dests (listof path?)] - [ri render-info?]) - void?]{ - Just like @method[override-render-mixin-multi render], except - that it saves the file @filepath{blueboxes.rktd} in - the same directory where each @racket[dests] element resides. -}} -} diff --git a/scribble-doc/scribblings/scribble/report.scrbl b/scribble-doc/scribblings/scribble/report.scrbl deleted file mode 100644 index a7b8c98b..00000000 --- a/scribble-doc/scribblings/scribble/report.scrbl +++ /dev/null @@ -1,8 +0,0 @@ -#lang scribble/manual -@(require "utils.rkt") - -@title{Report Format} - -@defmodulelang[scribble/report]{The @racketmodname[scribble/report] -language is like @racketmodname[scribble/book], but configured with -Latex style defaults to use the standard @tt{report} class.} diff --git a/scribble-doc/scribblings/scribble/running.scrbl b/scribble-doc/scribblings/scribble/running.scrbl deleted file mode 100644 index df95d135..00000000 --- a/scribble-doc/scribblings/scribble/running.scrbl +++ /dev/null @@ -1,212 +0,0 @@ -#lang scribble/manual -@(require "utils.rkt" - scribble/bnf - (for-label setup/xref)) - -@(define fn (italic "fn")) - -@title[#:tag "running"]{Running @exec{scribble}} - -The @exec{scribble} command-line tool (also available as @as-index{@exec{raco -scribble}}) runs a Scribble document and renders it to a specific -format. Select a format with one of the following flags, where the -output name @|fn| is by default the document source name without -its file suffix: - -@itemlist[ - - @item{@DFlag{html} --- a single HTML page @filepath{@|fn|.html}, - plus CSS sources and needed image files; this mode is the - default if no format is specified} - - @item{@DFlag{htmls} --- multiple HTML pages (and associated files) in - a @filepath{@|fn|} directory, starting with - @filepath{@|fn|/index.html}} - - @item{@DFlag{html-tree} @nonterm{n} --- HTML pages in a directory - tree up to @nonterm{n} layers deep; a tree of depth @exec{0} is - equivalent to using @DFlag{html}, and a tree of depth @exec{1} - is equivalent to using @DFlag{htmls}} - - @item{@DFlag{latex} --- LaTeX source @filepath{@|fn|.tex}, plus - any needed additional files (such as non-standard class files) - needed to run @exec{latex} or @exec{pdflatex}} - - @item{@DFlag{pdf} --- PDF @filepath{@|fn|.pdf} that is generated - via @exec{pdflatex}} - - @item{@DFlag{dvipdf} --- PDF @filepath{@|fn|.pdf} that is generated - via @exec{latex}, @exec{dvips}, and @exec{pstopdf}} - - @item{@DFlag{latex-section} @nonterm{n} --- LaTeX source - @filepath{@|fn|.tex} plus additional @filepath{.tex} files to - be included in the enclosing document's preamble, where the - enclosing document must use the UTF-8 input encoding and T1 - font encoding; use @tt{1} for @nonterm{n} to make the rendered - document a section, @tt{2} for a subsection, etc.} - - @item{@DFlag{text} --- plain text in a single file - @filepath{@|fn|.txt}, with non-ASCII content encoded as UTF-8} - - @item{@DFlag{markdown} --- Markdown text in a single file - @filepath{@|fn|.md}, with non-ASCII content encoded as UTF-8} - -] - -Use @DFlag{dest-name} to specify a @|fn| other than the default name, -but only when a single source file is provided. Use the @DFlag{dest} -flag to specify a destination directory (for any number of source -files). Use @DFlag{dest-base} to add a prefix to the name of each -support file that is generated or copied to the destination. - -After all flags, provide one or more document sources, where each -source declares a module. The module should either have a @racket[doc] -@tech[#:doc '(lib "scribblings/reference/reference.scrbl")]{submodule} -that exports @racket[doc] as a @racket[part], or it should directly -export @racket[doc] as a @racket[part]. (The submodule is tried first, -and the main module is not directly loaded or evaluated if the -submodule can be loaded on its own.) - -When multiple documents are rendered at the same time, cross-reference -information in one document is visible to the other documents. See -@secref["xref-flags"] for information on references that cross -documents that are built separately. - -@history[#:changed "1.4" @elem{Added @DFlag{dvipdf}.}] - -@section{Extra and Format-Specific Files} - -Use the @DFlag{style} flag to specify a format-specific file to adjust -the output style file for certain formats. For HTML (single-page or -multi-page) output, the style file should be a CSS file that is -applied after all other CSS files, and that may therefore override -some style properties. For Latex (or PDF) output, the style file -should be a @filepath{.tex} file that can redefine Latex commands. -When a particular Scribble function needs particular CSS or Latex -support, however, a better option is to use a @racket[css-addition] or -@racket[tex-addition] style property so that the support is included -automatically; see @secref["config"] for more information. - -In rare cases, use the @DFlag{style} flag to specify a format-specific -base style file. For HTML (single-page or multi-page) output, the -style file should be a CSS file to substitute for -@filepath{scribble.css} in the @filepath{scribble} collection. For -Latex (or PDF) output, the style file should be a @filepath{.tex} file -to substitute for @filepath{scribble.tex} in the @filepath{scribble} -collection. The @DFlag{style} flag is rarely useful, because the -content of @filepath{scribble.css} or @filepath{scribble.tex} is -weakly specified; replacements must define all of the same styles, and -the set of styles can change across versions of Racket. - -Use @DFlag{prefix} to specify an alternate format-specific start of -the output file. For HTML output, the starting file specifies the -@tt{DOCTYPE} declaration of each output HTML file as a substitute for -@filepath{scribble-prefix.html} in the @filepath{scribble} -collection. For Latex (or PDF) output (but not Latex-section output), the starting file specifies -the @ltx{documentclass} declaration and initial @ltx{usepackage} -declarations as a substitute for @filepath{scribble-prefix.tex} in the -@filepath{scribble} collection. See also @racket[html-defaults], -@racket[latex-defaults], and @secref["config"]. - -For any output form, use the @DPFlag{extra} flag to add a needed file -to the build destination, such as an image file that is referenced in -the generated output but not included via @racket[image] (which copies -the file automatically). - -@section[#:tag "xref-flags"]{Handling Cross-References} - -Cross references within a document or documents rendered together are -always resolved. When cross references span documents that are -rendered separately, cross-reference information needs to be saved and -loaded explicitly. Cross-reference information is format-specific, but -HTML-format information is usable for Latex (or PDF) or text rendering. - -A Racket installation includes HTML-format cross-reference information -for all installed documentation. Each document's information is in a -separate file, so that loading all relevant files would be tedious. -The @PFlag{m} or @DPFlag{main-xref-in} flag loads cross-reference -information for all installed documentation, so - -@commandline{scribble +m mine.scrbl} - -renders @filepath{mine.scrbl} to @filepath{mine.html} with -cross-reference links to the Racket installation's documentation. -(The @filepath{racket-index} package must be installed to use -@PFlag{m}/@DPFlag{main-xref-in}.) - -The @DPFlag{xref-in} flag loads cross-reference information by calling -a specified module's function. The @racketmodname[setup/xref] module -provides @racket[load-collections-xref] to load cross-reference -information for all installed documentation, and @PFlag{m} or -@DPFlag{main-xref-in} is just a shorthand for @exec{++xref-in -setup/xref load-collections-xref}. - -The @DFlag{redirect-main} flag for HTML output redirects links to the local -installation's documentation to a given URL, such as -@tt{http://docs.racket-lang.org/}. Beware that documentation links -sometimes change (although Scribble generates HTML paths and anchors -in a relatively stable way), so -@tt{http://download.racket-lang.org/docs/@italic{version}/html/} may be -more reliable when building with an installation for @italic{version}. -The @DFlag{redirect-main} flag is ignored for non-HTML output. - -The @DFlag{redirect} flag is like @DFlag{redirect-main}, except -that it builds on the given URL to indicate a cross-reference tag that -is more stable than an HTML path and anchor (in case the documentation -for a function changes sections, for example). No server currently -exists to serve such tag requests, however. - -For cross-references among documentation that is not part of the -Racket installation, use @DFlag{info-out} to save information from a -document build and use @DPFlag{info-in} to load previously saved -information. For example, if @filepath{c.scrbl} refers to information -in @filepath{a.scrbl} and @filepath{b.scrbl}, then - -@commandline{scribble --info-out a.sxref a.scrbl} -@commandline{scribble --info-out b.sxref b.scrbl} -@commandline{scribble ++info-in a.sxref ++info-in b.sxref c.scrbl} - -builds @filepath{c.html} with cross-reference links into -@filepath{a.html} and @filepath{b.html}. - - -@section{Selecting an Image Format} - -Use the @DPFlag{convert} @nonterm{fmt} flag to select @nonterm{fmt} as -a preferred image format to use when rendering a document that -includes values that can be converted to different image formats. The -@nonterm{fmt} argument can be @exec{pdf}, @exec{ps}, @exec{png}, -@exec{svg}, or @exec{gif}, but a renderer typically supports only a -subset of those formats. - -Use @DPFlag{convert} @nonterm{fmt} multiple times to specify multiple -preferred formats, where a @nonterm{fmt} earlier in the command line -take precedence over @nonterm{fmt}s specified later. - -For example, to generate Latex sources with images in Encapsulated -PostScript format (so that the result works with @exec{latex} instead -of @exec{pdflatex}), combine @DFlag{latex} with @exec{@DPFlag{convert} -ps}. To generate HTML pages with images converted to SVG format -instead of PNG format, combine @DFlag{html} with -@exec{@DPFlag{convert} svg}. - -@history[#:changed "1.4" @elem{Added @DPFlag{convert} support.}] - -@section{Passing Command-Line Arguments to Documents} - -When @exec{scribble} loads and renders a document module, by default -it sets @racket[current-command-line-arguments] to an empty vector. -Use the @DPFlag{arg} flag (any number of times) to add a string to -@racket[current-command-line-arguments]. - -For example, - -@commandline{scribble ++arg --mode ++arg fast turtle.scrbl} - -causes @racket[(current-command-line-arguments)] to return -@racket['#("--mode" "fast")] while @filepath{turtle.scrbl} is loaded -and rendered, which could affect the content that -@filepath{turtle.scrbl} generates if it uses -@racket[current-command-line-arguments]. - -@history[#:changed "1.1" @elem{Added the empty-vector default and @DPFlag{arg} flag.}] \ No newline at end of file diff --git a/scribble-doc/scribblings/scribble/scheme.scrbl b/scribble-doc/scribblings/scribble/scheme.scrbl deleted file mode 100644 index 3e295363..00000000 --- a/scribble-doc/scribblings/scribble/scheme.scrbl +++ /dev/null @@ -1,223 +0,0 @@ -#lang scribble/doc -@(require scribble/manual "utils.rkt" (for-label scribble/racket)) - -@title[#:tag "scheme"]{Racket} - -@defmodule*[(scribble/racket scribble/scheme)]{The -@racket[scribble/racket] library (or @racketmodname[scribble/scheme] -for backward compatibility) provides utilities for typesetting Racket -code. The @racket[scribble/manual] forms provide a higher-level -interface.} - -@defform*[[(define-code id typeset-expr) - (define-code id typeset-expr uncode-id) - (define-code id typeset-expr uncode-id d->s-expr) - (define-code id typeset-expr uncode-id d->s-expr stx-prop-expr)]]{ - -Binds @racket[id] to a form similar to @racket[racket] or -@racket[racketblock] for typesetting code. The form generated by -@racket[define-code] handles source-location information, escapes via -@racket[unquote] by default, preserves binding and property information, -and supports @tech{element transformers}. - -The supplied @racket[typeset-expr] expression should produce a -procedure that performs the actual typesetting. This expression is -normally @racket[to-element] or @racket[to-paragraph]. The argument -supplied to @racket[typeset-expr] is normally a syntax object, but -more generally it is the result of applying @racket[d->s-expr]. - -The optional @racket[uncode-id] specifies the default escape from -literal code to be recognized by @racket[id], and the default for -@racket[uncode-id] is @racket[unsyntax]. A use of the @racket[id] form -can specify an alternate escape via @racket[#:escape], as in -@racket[racketblock] and @racket[racket]. - -The optional @racket[d->s-expr] should produce a procedure that -accepts three arguments suitable for @racket[datum->syntax]: a syntax -object or @racket[#f], an arbitrary value, and a vector for a source -location. The result should record as much or as little of the -argument information as needed by @racket[typeset-expr] to typeset the -code. Normally, @racket[d->s-expr] is @racket[datum->syntax]. - -The @racket[stx-prop-expr] should produce a procedure for recording a -@racket['paren-shape] property when the source expression uses with -@racket[id] has such a property. The default is -@racket[syntax-property].} - -@defproc[(to-paragraph [v any/c] - [#:expr? expr? any/c #f] - [#:escapes? escapes? any/c #t] - [#:color? color? any/c #t] - [#:wrap-elem wrap-elem (element? . -> . element?) (lambda (e) e)]) - block?]{ - -Typesets an S-expression that is represented by a syntax object, where -source-location information in the syntax object controls the -generated layout. When source-location information is not available, -default spacing is used (in the same single-line style as -@racket[to-element]). - -Identifiers that have @racket[for-label] bindings are typeset and -hyperlinked based on definitions declared elsewhere (via -@racket[defproc], @racket[defform], etc.). Unless @racket[escapes?] -is @racket[#f], the identifiers -@racketidfont{code:line}, @racketidfont{code:comment}, -@racketidfont{code:blank}, @racketidfont{code:hilite}, and -@racketidfont{code:quote} are handled as in @racket[racketblock], as -are identifiers that start with @litchar{_}. - -In addition, the given @racket[v] can contain @racket[var-id], -@racket[shaped-parens], @racket[just-context], or -@racket[literal-syntax] structures to be typeset specially (see each -structure type for details), or it can contain @racket[element] -structures that are used directly in the output. - -If @racket[expr?] is true, then @racket[v] is rendered in expression -style, much like @racket[print] with the @racket[print-as-expression] -parameter set to @racket[#t]. In that case, @racket[for-label] -bindings on identifiers are ignored, since the identifiers are all -quoted in the output. Typically, @racket[expr?] is set to true for -printing result values. - -If @racket[color?] is @racket[#f], then the output is typeset without -coloring. - -The @racket[wrap-elem] procedure is applied to each element -constructed for the resulting block. When combined with @racket[#f] -for @racket[color?], for example, the @racket[wrap-elem] procedure can -be used to give a style to an element.} - - -@defproc[((to-paragraph/prefix [prefix1 any/c] [prefix any/c] [suffix any/c]) - [v any/c] [#:expr? expr? any/c #f] [#:escapes? escapes? any/c #t] - [#:color? color? any/c #f] - [#:wrap-elem wrap-elem (element? . -> . element?) (lambda (e) e)]) - block?]{ - -Like @racket[to-paragraph], but @racket[prefix1] is prefixed onto the -first line, @racket[prefix] is prefix to any subsequent line, and -@racket[suffix] is added to the end. The @racket[prefix1], -@racket[prefix], and @racket[suffix] arguments are used as -@tech{content}, except that if @racket[suffix] is a list of elements, -it is added to the end on its own line.} - - -@defproc[(to-element [v any/c] - [#:expr? expr? any/c #f] - [#:escapes? escapes? any/c #t] - [#:defn? defn? any/c #f]) element?]{ - -Like @racket[to-paragraph], except that source-location information is -mostly ignored, since the result is meant to be inlined into a -paragraph. If @racket[defn?] is true, then an identifier is styled as -a definition site.} - -@defproc[(to-element/no-color [v any/c] - [#:expr? expr? any/c #f] - [#:escapes? escapes? any/c #t]) - element?]{ - -Like @racket[to-element], but @racket[for-syntax] bindings are -ignored, and the generated text is uncolored. This variant is -typically used to typeset results.} - - -@defstruct[var-id ([sym (or/c symbol? identifier?)])]{ - -When @racket[to-paragraph] and variants encounter a @racket[var-id] -structure, it is typeset as @racket[sym] in the variable font, like -@racket[racketvarfont]---unless the @racket[var-id] appears under -quote or quasiquote, in which case @racket[sym] is typeset as a symbol.} - - -@defstruct[shaped-parens ([val any/c] - [shape char?])]{ - -When @racket[to-paragraph] and variants encounter a -@racket[shaped-parens] structure, it is typeset like a syntax object -that has a @racket['paren-shape] property with value @racket[shape].} - - -@defstruct[long-boolean ([val boolean?])]{ - -When @racket[to-paragraph] and variants encounter a -@racket[long-boolean] structure, it is typeset as @racket[#true] or @racket[#false], -as opposed to @racket[#t] or @racket[#f].} - - -@defstruct[just-context ([val any/c] - [context syntax?])]{ - -When @racket[to-paragraph] and variants encounter a -@racket[just-context] structure, it is typeset using the -source-location information of @racket[val] just the lexical context -of @racket[ctx].} - - -@defstruct[literal-syntax ([stx any/c])]{ - -When @racket[to-paragraph] and variants encounter a -@racket[literal-syntax] structure, it is typeset as the string form of -@racket[stx]. This can be used to typeset a syntax-object value in the -way that the default printer would represent the value.} - - -@defproc[(element-id-transformer? [v any/c]) boolean?]{ - -Provided @racket[for-syntax]; returns @racket[#t] if @racket[v] is an -@tech{element transformer} created by -@racket[make-element-id-transformer], @racket[#f] otherwise.} - - -@defproc[(make-element-id-transformer [proc (syntax? . -> . syntax?)]) - element-id-transformer?]{ - -Provided @racket[for-syntax]; creates an @deftech{element -transformer}. When an identifier has a transformer binding to an -@tech{element transformer}, then forms generated by -@racket[define-code] (including @racket[racket] and -@racket[racketblock]) typeset the identifier by applying the -@racket[proc] to the identifier. The result must be an expression -whose value, typically an @racket[element], is passed on to functions -like @racket[to-paragraph] .} - -@defproc[(variable-id? [v any/c]) boolean?]{ - -Provided @racket[for-syntax]; returns @racket[#t] if @racket[v] is an -@tech{element transformer} created by @racket[make-variable-id], -@racket[#f] otherwise.} - - -@defproc[(make-variable-id [sym (or/c symbol? identifier?)]) - variable-id?]{ - -Provided @racket[for-syntax]; like @racket[make-element-id-transformer] for -a transformer that produces @racket[sym] typeset as a variable (like -@racket[racketvarfont])---unless it appears under quote or quasiquote, -in which case @racket[sym] is typeset as a symbol.} - -@deftogether[( -@defthing[output-color style?] -@defthing[input-color style?] -@defthing[input-background-color style?] -@defthing[no-color style?] -@defthing[reader-color style?] -@defthing[result-color style?] -@defthing[keyword-color style?] -@defthing[comment-color style?] -@defthing[paren-color style?] -@defthing[meta-color style?] -@defthing[value-color style?] -@defthing[symbol-color style?] -@defthing[variable-color style?] -@defthing[opt-color style?] -@defthing[error-color style?] -@defthing[syntax-link-color style?] -@defthing[value-link-color style?] -@defthing[module-color style?] -@defthing[module-link-color style?] -@defthing[block-color style?] -@defthing[highlighted-color style?] -)]{ - -Styles that are used for coloring Racket programs, results, and I/O.} diff --git a/scribble-doc/scribblings/scribble/scribble-pp.scrbl b/scribble-doc/scribblings/scribble/scribble-pp.scrbl deleted file mode 100644 index 7cde8eec..00000000 --- a/scribble-doc/scribblings/scribble/scribble-pp.scrbl +++ /dev/null @@ -1,26 +0,0 @@ -#lang scribble/manual -@(require "utils.rkt") - -@title{Scribble as Preprocessor} - -@author["Matthew Flatt" "Eli Barzilay"] - -@section-index["Preprocessor"] - -The @racketmodname[scribble/text] and @racketmodname[scribble/html] -languages act as ``preprocessor'' languages for generating text or -HTML. These preprocessor languages use the same @"@" syntax as the -main Scribble tool (see @other-doc['(lib -"scribblings/scribble/scribble.scrbl")]), but instead of working in -terms of a document abstraction that can be rendered to text and HTML -(and other formats), the preprocessor languages work in a way that is -more specific to the target formats. - -@table-of-contents[] - -@; ------------------------------------------------------------------------ - -@include-section["text.scrbl"] -@include-section["html.scrbl"] - -@index-section[] diff --git a/scribble-doc/scribblings/scribble/scribble.scrbl b/scribble-doc/scribblings/scribble/scribble.scrbl deleted file mode 100644 index 731f2cb5..00000000 --- a/scribble-doc/scribblings/scribble/scribble.scrbl +++ /dev/null @@ -1,32 +0,0 @@ -#lang scribble/manual -@(require "utils.rkt") - -@title{Scribble: The Racket Documentation Tool} - -@author["Matthew Flatt" "Eli Barzilay"] - -Scribble is a collection of tools for creating prose -documents---papers, books, library documentation, etc.---in HTML or -PDF (via Latex) form. More generally, Scribble helps you write -programs that are rich in textual content, whether the content is -prose to be typeset or any other form of text to be generated -programmatically. - -This document is itself written using Scribble. You can see its source -at -@(let ([url "https://github.com/racket/scribble/tree/master/scribble-doc/scribblings/scribble"]) - (link url url)), -starting with the @filepath{scribble.scrbl} file. - -@table-of-contents[] - -@; ------------------------------------------------------------------------ -@include-section["how-to-paper.scrbl"] -@include-section["reader.scrbl"] -@include-section["generic.scrbl"] -@include-section["plt.scrbl"] -@include-section["lp.scrbl"] -@include-section["internals.scrbl"] -@include-section["running.scrbl"] - -@index-section[] diff --git a/scribble-doc/scribblings/scribble/shaded.css b/scribble-doc/scribblings/scribble/shaded.css deleted file mode 100644 index 8b137891..00000000 --- a/scribble-doc/scribblings/scribble/shaded.css +++ /dev/null @@ -1 +0,0 @@ - diff --git a/scribble-doc/scribblings/scribble/shaded.tex b/scribble-doc/scribblings/scribble/shaded.tex deleted file mode 100644 index c7002ea4..00000000 --- a/scribble-doc/scribblings/scribble/shaded.tex +++ /dev/null @@ -1,2 +0,0 @@ - -\newcommand{\Short}[1]{\begin{minipage}[c]{6ex}#1\end{minipage}} diff --git a/scribble-doc/scribblings/scribble/sigplan.scrbl b/scribble-doc/scribblings/scribble/sigplan.scrbl deleted file mode 100644 index 9ee87183..00000000 --- a/scribble-doc/scribblings/scribble/sigplan.scrbl +++ /dev/null @@ -1,146 +0,0 @@ -#lang scribble/manual -@(require "utils.rkt" (for-label scribble/sigplan)) - -@title{SIGPLAN Paper Format} - -@defmodulelang[scribble/sigplan]{The @racketmodname[scribble/sigplan] -language is like @racketmodname[scribble/base], but configured with -Latex style defaults to use the @filepath{sigplanconf.cls} class -file that is included with Scribble.} - -@defidform[preprint]{ - -Enables the @tt{preprint} option. Use @racket[preprint] only on the -same line as @hash-lang[], with only whitespace (or other options) between -@racketmodname[scribble/sigplan] and @racket[preprint]: - -@verbatim[#:indent 2]|{ - #lang scribble/sigplan @preprint -}|} - -@defidform[10pt]{ - -Enables the @tt{10pt} option. Use @racket[10pt] only on the -same line as @hash-lang[], with only whitespace (or other options) between -@racketmodname[scribble/sigplan] and @racket[10pt]: - -@verbatim[#:indent 2]|{ - #lang scribble/sigplan @10pt -}| - -@defidform[nocopyright]{ - -Enables the @tt{nocopyright} option. Use @racket[nocopyright] only on the -same line as @hash-lang[], with only whitespace (or other options) between -@racketmodname[scribble/sigplan] and @racket[nocopyright]: - -@verbatim[#:indent 2]|{ - #lang scribble/sigplan @nocopyright -}|} - -@defidform[onecolumn]{ - -Enables the @tt{onecolumn} option. Use only on the -same line as @hash-lang[], with only whitespace (or other options) between -@racketmodname[scribble/sigplan] and @racket[onecolumn]: - -@codeblock|{ - #lang scribble/sigplan @onecolumn -}|} - - -@defidform[notimes]{ - -Disables the use of @tt{\usepackage@"{"times@"}"} in the generated LaTeX output. -Use only on the same line as @hash-lang[], -with only whitespace (or other options) between -@racketmodname[scribble/sigplan] and @racket[notimes]: - -@codeblock|{ - #lang scribble/sigplan @notimes -}|} - -@defidform[noqcourier]{ - -Disables the use of @tt{\usepackage@"{"qcourier@"}"} in the generated LaTeX output. -Use only on the same line as @hash-lang[], -with only whitespace (or other options) between -@racketmodname[scribble/sigplan] and @racket[noqcourier]: - -@codeblock|{ - #lang scribble/sigplan @noqcourier -}|} - -The @racket[10pt], @racket[preprint], @racket[nocopyright], -@racket[onecolumn], @racket[notimes], and @racket[noqcourier] -options can be used together and may appear in any order. -} - - -@defproc[(abstract [pre-content pre-content?] ...) block?]{ - -Generates a @tech{nested flow} for a paper abstract.} - -@defform[(include-abstract module-path)]{ - -Similar to @racket[include-section], but incorporates the document in the -specified module as an abstract. The document must have no title or -sub-parts.} - -@defproc[(subtitle [pre-content pre-content?] ...) element?]{ - -Use as the last argument to @racket[title] to specify a subtitle.} - -@defproc[(authorinfo [name pre-content?] - [affiliation pre-content?] - [email pre-content?]) - block?]{ - -A replacement for @racket[author] that associates an affiliation and -e-mail address with the author name.} - -@deftogether[( -@defproc[(conferenceinfo [conference pre-content?] [location pre-content?]) block?] -@defproc[(copyrightyear [content pre-content?] ...) block?] -@defproc[(copyrightdata [content pre-content?] ...) block?] -@defproc[(doi [content pre-content?] ...) block?] -@defproc[(exclusive-license) block?] -)]{ - -Declares information that is collected into the copyright region of the paper.} - - -@defproc[(to-appear [content pre-content?] ...) block?]{ - -Declares alternate content for the copyright region of the paper. - -@history[#:added "1.13"]} - - -@deftogether[( -@defproc[(category [CR-number pre-content?] - [subcategory pre-content?] - [third-level pre-content?] - [fourth-level (or/c #f pre-content?) #f]) content?] -@defproc[(terms [content pre-content?] ...) content?] -@defproc[(keywords [content pre-content?] ...) content?] -)]{ - -Typesets category, term, and keyword information for the paper, which -is normally placed immediately after an @racket[abstract] form. -See also @url["http://www.acm.org/about/class/how-to-use"]. - -For @racket[category], the @racket[subcategory] argument should be in -titlecase (i.e., capitalize the first letter of each word) and a -phrase at the level of ``Programming Languages'' or ``Software -Engineering'' (as opposed to a category like ``Software'' or a -third-level name like ``Concurrent Programming'' or ``Processors''). A -@racket[third-level] phrase should be in titlecase. A -@racket[fourth-level] phrase, if any, should not be capitalized. - -For @racket[terms], each general term should be in titlecase. Terms -are usually drawn from a fixed list, and they are usually optional. - -For @racket[keywords], capitalize only the first letter of the first -word, separate phrases by commas, and do not include ``and'' before -the last one. Keywords should be noun phrases, not adjectives.} diff --git a/scribble-doc/scribblings/scribble/srcdoc.scrbl b/scribble-doc/scribblings/scribble/srcdoc.scrbl deleted file mode 100644 index 1e24a5d9..00000000 --- a/scribble-doc/scribblings/scribble/srcdoc.scrbl +++ /dev/null @@ -1,258 +0,0 @@ -#lang scribble/doc -@(require scribble/manual "utils.rkt" - (for-label scribble/srcdoc scribble/extract racket/contract)) - -@title[#:tag "srcdoc"]{In-Source Documentation} - -The @racketmodname[scribble/srcdoc] and -@racketmodname[scribble/extract] libraries support writing -documentation within the documented code along with an export -contract, similar to using @as-index{JavaDoc}. With this approach, a -single contract specification is used both for the run-time contract -and the documentation of an exported binding. - -The @racketmodname[scribble/srcdoc] library provides forms for -exporting a binding with associated documentation. The -@racket[scribble/extract] library is used to pull -@racket[scribble/srcdoc]-based documentation into a Scribble document -(perhaps for multiple libraries). - -Although documentation is written with a library's implementation when -using @racketmodname[scribble/srcdoc], the documentation creates no -run-time overhead for the library. Similarly, typesetting the -documentation does not require running the library. The two phases -(run time versus documentation time) are kept separate in much the -same way that the module system keeps expansion-time code separate -from run-time code, and documentation information is recorded in a -submodule to be separately loadable from the enclosing module. - -For an example use, see the @filepath{file} collection's -@filepath{gif.rkt} source file and the corresponding extraction in -@filepath{scribblings/gif.scrbl}. As that example illustrates, -starting the module declaration with - -@racketblock[ - @#,hash-lang[] @#,racketmodname[at-exp] -] - -enables the @"@"-reader, which is handy for writing documentation -expressions. - -@; ---------------------------------------- - -@section{Source Annotations for Documentation} - -@defmodule[scribble/srcdoc] - -Documentation information generated by @racketmodname[scribble/srcdoc] -forms are accumulated into a @racketidfont{srcdoc} submodule. The -generated submodule is accessed by the bindings of -@racketmodname[scribble/extract]. - -@defform[(for-doc require-spec ...)]{ - -A @racket[require] sub-form for bindings that are needed at -documentation time (and documentation-expansion time, etc.) instead of -run time (and expansion time, etc.). A @racket[for-doc] import has -no effect on a normal use of the library; it affects only -documentation extraction. - -Typically, a library that uses @racketmodname[scribble/srcdoc] -includes at least @racket[(require (for-doc scribble/base scribble/manual))] -to get core Racket forms and basic Scribble functions to use in -documentation expressions.} - -@defform*/subs[#:literals (-> ->* case->) - [(proc-doc/names id contract arg-specs (desc-expr ...))] - ([arg-specs ((arg-id ...) ((arg-id default-expr) ...)) - (arg-id ...)] - [contract (-> arg ... result) - (->* (mandatory ...) (optional ...) result) - (case-> (-> arg ... result) ...)] - [mandatory contract-expr - (code:line keyword contract-expr)] - [optional contract-expr - (code:line keyword contract-expr)])]{ - -A @racket[provide] sub-form that exports @racket[id] with the -contract described by @racket[contract] -just like using @racket[contract-out]. - -The @racket[arg-spec] specifies the names of arguments and the -default values, which are not -normally written as part of a contract. They are combined with the -contract expression to generate the description of the binding in the -documentation via @racket[defproc]. The @racket[(arg-id default-expr)] -pairs specify the names and default values of the optional arguments. -If the contract supports optional arguments, then the first -@racket[arg-spec]s form must be used, otherwise the second must be used. - -The @racket[desc-expr] is a sequence of documentation-time expressions that -produces prose to describe the exported binding---that is, the last -part of the generated @racket[defproc], so the description can refer -to the @racket[arg-id]s using @racket[racket]. - -The normal @racket[require]s of the enclosing library are effectively -converted into @racket[for-label] @racket[require]s when generating -documentation, so that identifiers in the @racket[contract]s are -linked to their corresponding documentation. Similarly, any binding -that is available in the run-time phase of the enclosing library -can be referenced in documentation prose using the @racket[racket] -form.} - -@defform/subs[#:literals (-> ->i ->d values) - (proc-doc id contract maybe-defs (desc-expr ...)) - ([contract (-> result) - (->i (arg ...) (opt ...) maybe-pre [id res]) - (->i (arg ...) (opt ...) maybe-pre (values [id res] ...)) - (->i (arg ...) (opt ...) #:rest rest [id result-expr]) - - (->d (arg ...) () maybe-pre (values [id result] ...)) - (->d (arg ...) () maybe-pre [id result]) - (->d (arg ...) () #:rest id rest [id result])] - [maybe-pre (code:line) - (code:line #:pre (pre-id ...) condition)] - [maybe-defs (code:line) - (default-expr default-expr ...)])]{ - -Like @racket[proc-doc/names], but supporting contract forms that embed -argument identifiers. Only a subset of @racket[->i] and @racket[->d] forms are -currently supported. - -If the sequence of optional arguments, @racket[(opt ...)] is empty then -the @racket[maybe-arg-desc] must be not be present. If it is non-empty, -then it must have as many default expressions are there are optional -arguments. -} - - -@defform[(thing-doc id contract-expr (desc-expr ...))]{ - -Like @racket[proc-doc], but for an export of an arbitrary value.} - - -@defform[#:literals (parameter/c) - (parameter-doc id (parameter/c contract-expr) arg-id (desc-expr ...))]{ - -Like @racket[proc-doc], but for exporting a parameter.} - -@defform[(struct*-doc struct-name - ([field-name contract-expr-datum] ...) - maybe-omit-constructor - maybe-mutable maybe-non-opaque maybe-constructor - (desc-expr ...)) - #:grammar ([maybe-omit-constructor (code:line) #:omit-constructor])]{ - Like @racket[proc-doc], but for struct declarations that use @racket[struct]. - - The @racket[maybe-mutable], @racket[maybe-non-opaque], and @racket[maybe-constructor] - options are as in @racket[defstruct]. -} - -@defform[(struct-doc struct-name - ([field-name contract-expr-datum] ...) - maybe-omit-constructor - maybe-mutable maybe-non-opaque maybe-constructor - (desc-expr ...))]{ - Like @racket[struct*-doc], but for struct declarations that use @racket[define-struct]. -} - - -@defform/subs[(form-doc options form-datum - maybe-grammar maybe-contracts - (desc-expr ...)) - ([options (code:line maybe-kind maybe-link maybe-id maybe-literals)] - [maybe-kind code:blank - (code:line #:kind kind-string-expr)] - [maybe-link code:blank - (code:line #:link-target? link-target?-expr)] - [maybe-id code:blank - (code:line #:id id) - (code:line #:id [id id-expr])] - [maybe-literals code:blank - (code:line #:literals (literal-id ...))] - [maybe-grammar code:blank - (code:line #:grammar ([nonterm-id clause-datum ...+] ...))] - [maybe-contracts code:blank - (code:line #:contracts ([subform-datum contract-expr-datum] - ...))])]{ - -Like @racket[proc-doc], but for an export of a syntactic form. If -@racket[#:id] is provided, then @racket[id] is the exported identifier, -otherwise the exported identifier is extracted from @racket[form-datum]. - -See @racket[defform] for information on @racket[options], -@racket[form-datum], @racket[maybe-grammar], and -@racket[maybe-contracts]. - -@history[#:added "1.6"]} - - -@defform[(begin-for-doc form ...)]{ - -Like to @racket[begin-for-syntax], but for documentation time instead -of expansion time. The @racket[form]s can refer to binding -@racket[require]d with @racket[for-doc]. - -For example, a definition in @racket[begin-for-doc] -can be referenced by a @racket[_desc-expr] in -@racket[proc-doc/names].} - - -@defform[(generate-delayed-documents)]{ - -Causes documentation information to be recorded as a macro that is -expanded (along with any @racket[for-doc] imports) in the -module that uses @racket[include-extracted] or @racket[provide-extracted], -instead of within (a submodule of) the module that declares the information. - -Delaying document generation in this way allows @racket[(for-doc -(for-label ....))] imports that would otherwise create cyclic module -dependencies. - -To avoid problems with accumulated @racket[for-doc] imports across -modules, @racket[generate-delayed-documents] declaration should appear -before any @racket[for-doc] import.} - - -@defform[(require/doc require-spec ...)]{ - -A legacy shorthand for @racket[(require (for-doc require-spec ...))].} - - -@defform[(provide/doc spec ...)]{ - -A legacy alternative to @racket[(provide spec ...)]} - -@; ---------------------------------------- - -@section{Extracting Documentation from Source} - -@defmodule[scribble/extract] - -@defform[(include-extracted module-path)]{ - -Expands to a sequence of documentation forms extracted from -@racket[module-path], which is expected to be a module that uses -@racketmodname[scribble/srcdoc] (so that the module has a -@racketidfont{srcdoc} submodule).} - -@defform[(provide-extracted module-path)]{ - -Similar to @racket[include-extracted], but the documentation is -packaged and exported as @racket[exported], instead of left -inline. - -Use this form in combination with -@racket[include-previously-extracted] when documentation from a single -source is to be split and typeset among multiple documentation -locations. The @racket[provide-extracted] form extracts the -documentation once, and then @racket[include-previously-extracted] -form extracts documentation for specific bindings as needed.} - -@defform[(include-previously-extracted module-path regexp)]{ - -Similar to @racket[include-extracted], but instead of referring to the -source that contains its own documentation, @racket[module-path] -refers to a module that uses @racket[provide-extracted]. The -@racket[include-previously-extracted] form expands to documentation -forms for all identifiers whose string forms match @racket[regexp].} diff --git a/scribble-doc/scribblings/scribble/struct-hierarchy.rkt b/scribble-doc/scribblings/scribble/struct-hierarchy.rkt deleted file mode 100644 index 06bebd3d..00000000 --- a/scribble-doc/scribblings/scribble/struct-hierarchy.rkt +++ /dev/null @@ -1,393 +0,0 @@ -#lang racket/base - -(require "class-diagrams.rkt" - (only-in pict pin-arrow-line) - texpict/mrpict - (except-in texpict/utils pin-arrow-line) - racket/system - racket/class - racket/draw) - -(define (mk-ps-diagram) - ;; thicken up the lines for postscript - (linewidth .8 (mk-diagram))) - -(provide mk-diagram) - -(define (mk-diagram) - - (define part-name (class-name "part" #:spacing-word "subparts")) - (define part-blocks-field (field-spec #f "blocks")) - (define part-subparts-field (field-spec #f "subparts")) - (define part-title-field (field-spec #f "title")) - (define part-box (class-box part-name (list part-title-field part-blocks-field part-subparts-field) #f)) - - (define block-name (class-name "block")) - (define block-box (class-box block-name #f #f)) - - (define para-name (class-name "paragraph")) - (define para-style (field-spec #f "style")) - (define para-content (field-spec #f "content")) - (define para-box (class-box para-name (list para-style para-content) #f)) - - (define compound-para-name (class-name "compound-\nparagraph")) - (define compound-para-style (field-spec #f "style")) - (define compound-para-blocks (field-spec #f "blocks")) - (define compound-para-box (class-box compound-para-name (list compound-para-style compound-para-blocks) #f)) - - (define table-name (class-name "table")) - (define table-style (field-spec #f "style")) - (define table-cells (field-spec #f "cells")) ;; blockss - (define table-box (class-box table-name (list table-style table-cells) #f)) - - (define itemization-name (class-name "itemization")) - (define itemization-style (field-spec #f "style")) - (define itemization-items (field-spec #f "items")) ;; blockss - (define itemization-box (class-box itemization-name (list itemization-style itemization-items) #f)) - - (define nested-flow-name (class-name "nested-\nflow")) - (define nested-flow-style (field-spec #f "style")) - (define nested-flow-blocks (field-spec #f "blocks")) - (define nested-flow-box (class-box nested-flow-name (list nested-flow-style nested-flow-blocks) #f)) - - (define delayed-block-name (class-name "delayed-block")) - (define delayed-block-block (field-spec #f "block")) - (define delayed-block-box (class-box delayed-block-name (list delayed-block-block) #f)) - - (define traverse-block-name (class-name "traverse-\nblock")) - (define traverse-block-block (field-spec #f "block")) - (define traverse-block-box (class-box traverse-block-name (list traverse-block-block) #f)) - - (define content-name (class-name "content")) - (define content-box (class-box content-name #f #f)) - - (define string-name (class-name "string")) - (define string-box (class-box string-name #f #f)) - - (define symbol-name (class-name "symbol")) - (define symbol-box (class-box symbol-name #f #f)) - - (define pict-name (class-name "pict")) - (define pict-box (class-box pict-name #f #f)) - - (define convertible-name (class-name "convertible")) - (define convertible-box (class-box convertible-name #f #f)) - - (define list-name (class-name "list")) - (define list-box (class-box list-name #f #f)) - - (define delayed-element-name (class-name "delayed-\nelement")) - (define delayed-element-content (field-spec #f "content")) - (define delayed-element-box (class-box delayed-element-name (list delayed-element-content) #f)) - - (define render-element-name (class-name "render-\nelement")) - (define render-element-content (field-spec #f "content")) - (define render-element-box (class-box render-element-name (list render-element-content) #f)) - - (define traverse-element-name (class-name "traverse-\nelement")) - (define traverse-element-content (field-spec #f "content")) - (define traverse-element-box (class-box traverse-element-name (list traverse-element-content) #f)) - - (define part-relative-element-name (class-name "part-\nrelative-\nelement")) - (define part-relative-element-resolve (field-spec #f "resolve")) - (define part-relative-element-box (class-box part-relative-element-name (list part-relative-element-resolve) #f)) - - (define element-name (class-name "element")) - (define element-style (field-spec #f "style")) - (define element-content (field-spec #f "content")) - (define element-box (class-box element-name (list element-style element-content) #f)) - - (define link-element-name (class-name "link-\nelement")) - (define link-tag (field-spec #f "tag")) - (define link-element-box (class-box link-element-name - (list link-tag) - #f)) - - (define collect-element-name (class-name "collect-\nelement")) - (define collect-element-collect (field-spec #f "collect")) - (define collect-element-box (class-box collect-element-name (list collect-element-collect) #f)) - - (define index-element-name (class-name "index-\nelement" #:spacing-word "keywords")) - (define index-element-tag (field-spec #f "tag")) - (define index-element-keywords (field-spec #f "keywords")) - (define index-element-box (class-box index-element-name - (list index-element-tag index-element-keywords) - #f)) - - (define image-element-name (class-name "image-\nelement" #:spacing-word "suffixes")) - (define image-element-path (field-spec #f "path")) - (define image-element-suffixes (field-spec #f "suffixes")) - (define image-element-scale (field-spec #f "scale")) - (define image-element-box (class-box image-element-name - (list image-element-path - image-element-suffixes - image-element-scale) - #f)) - - (define multiarg-element-name (class-name "multiarg-\nelement")) - (define multiarg-element-tag (field-spec #f "tag")) - (define multiarg-element-box (class-box multiarg-element-name (list multiarg-element-tag) #f)) - - (define target-element-name (class-name "target-\nelement")) - (define target-tag (field-spec #f "tag")) - (define target-element-box (class-box target-element-name - (list target-tag) - #f)) - - (define redirect-target-element-name (class-name "redirect-target-\nelement")) - (define redirect-target-alt-path (field-spec #f "alt-path")) - (define redirect-target-alt-anchor (field-spec #f "alt-anchor")) - (define redirect-target-element-box (class-box redirect-target-element-name - (list redirect-target-alt-path redirect-target-alt-anchor) - #f)) - - (define toc-target-element-name (class-name "toc-target-\nelement")) - (define toc-target-element-box (class-box toc-target-element-name (list) #f)) - - (define page-target-element-name (class-name "page-target-\nelement")) - (define page-target-element-box (class-box page-target-element-name (list) #f)) - - - (define block-hierarchy - (hierarchy - (vc-append block-box - (blank 0 50) - (ht-append 20 - (ht-append 30 - compound-para-box - para-box) - (vc-append (blank 0 30) itemization-box) - table-box) - (blank 0 25) - (ht-append nested-flow-box - (blank 120 0) - (vc-append (blank 0 30) delayed-block-box) - (blank 80 0) - traverse-block-box)) - (list block-box) - (list compound-para-box - para-box - nested-flow-box - itemization-box - table-box - delayed-block-box - traverse-block-box))) - - (define target-element-hierarchy - (hierarchy - (vc-append target-element-box - (blank 0 50) - (ht-append 20 - toc-target-element-box - page-target-element-box - redirect-target-element-box)) - (list target-element-box) - (list toc-target-element-box - page-target-element-box - redirect-target-element-box))) - - (define element-hierarchy - (hierarchy - (vc-append element-box - (blank 0 50) - (inset (ht-append 20 - collect-element-box - multiarg-element-box - (refocus target-element-hierarchy target-element-box) - link-element-box - image-element-box - index-element-box) - 0 0 -400 0)) - (list element-box) - (list collect-element-box - index-element-box - image-element-box - target-element-box - multiarg-element-box - link-element-box - ))) - - (define render-element-parent-link (blank)) - (define delayed-element-parent-link (blank)) - (define part-relative-element-parent-link (blank)) - (define traverse-element-parent-link (blank)) - (define element-parent-link (blank)) - - (define (drop-and-link box parent-link i) - (vc-append - (blank 0 (+ 40 (* i 20))) - (refocus (ct-superimpose box parent-link) - parent-link))) - - (define content-hierarchy - (hierarchy - (vc-append content-box - (blank 0 50) - (ht-append 15 - (drop-and-link (refocus element-hierarchy element-box) - element-parent-link - 4) - convertible-box - (drop-and-link render-element-box - render-element-parent-link - 4) - pict-box - (drop-and-link delayed-element-box - delayed-element-parent-link - 3) - symbol-box - (drop-and-link part-relative-element-box - part-relative-element-parent-link - 1) - string-box - (drop-and-link traverse-element-box - traverse-element-parent-link - 0) - list-box)) - (list content-box) - (list element-box - string-box - symbol-box - convertible-box - pict-box - traverse-element-parent-link - part-relative-element-parent-link - delayed-element-parent-link - render-element-parent-link - list-box))) - - (define raw - (vc-append part-box - (blank 0 20) - (vc-append block-hierarchy - (blank 0 20) - content-hierarchy))) - - (define w/connections - (double - right-right-reference - (double - left-left-reference - (triple - right-right-reference - (triple - right-right-reference - (double - left-left-reference - (double - left-left-reference - (double - right-right-reference - (double - left-left-reference - (double - left-left-reference - (left-left-reference - raw - element-box element-content content-box content-name 1 #:dot-delta -1) - part-box part-title-field content-box content-name 21) - part-box part-blocks-field block-box block-name) - part-box part-subparts-field part-box part-name 2) - para-box para-content content-box content-name 2) - compound-para-box compound-para-blocks block-box block-name 3) - table-box table-cells block-box block-name 2) - itemization-box itemization-items block-box block-name 10) - nested-flow-box nested-flow-blocks block-box block-name 1) - list-box list-box content-box content-name)) - - (define w/delayed-connections - (dotted-right-right-reference - (dotted-right-right-reference - (dotted-right-right-reference - (dotted-right-right-reference - (dotted-right-right-reference - (dotted-right-right-reference - w/connections - render-element-box render-element-content content-box content-name 30) - traverse-block-box traverse-block-block block-box block-name 1) - delayed-block-box delayed-block-block block-box block-name 17) - traverse-element-box traverse-element-content content-box content-name 3) - delayed-element-box delayed-element-content content-box content-name 22) - part-relative-element-box part-relative-element-resolve content-box content-name 12)) - - ;; one extra pixel on the right so we get the - ;; line drawn to the outermost turning point - (inset (panorama w/delayed-connections) 0 0 1 0)) - -(define (double f p0 a b c d [count 1]) - (let ([arrows1 (launder (f (ghost p0) a b c d count #:dot-delta 1))] - [arrows2 (launder (f (ghost p0) a b c d count #:dot-delta -1))]) - (cc-superimpose p0 - arrows1 - arrows2))) - -(define (triple f p0 a b c d [count 1]) - (let ([arrows (launder (f (ghost p0) a b c d count))] - [up-arrows (launder (f (ghost p0) a b c d count #:dot-delta 2))] - [down-arrows (launder (f (ghost p0) a b c d count #:dot-delta -2))]) - (cc-superimpose p0 - arrows - up-arrows - down-arrows))) - -(define (connect-circly-dots show-arrowhead? main dot1 . dots) - (let loop ([prev-dot dot1] - [dots dots] - [pict main]) - (cond - [(null? dots) pict] - [else - (loop (car dots) - (cdr dots) - (connect-two-circly-dots pict prev-dot (car dots) (null? (cdr dots))))]))) - -;; this is a hack -- it will only work with right-right-reference -(define (connect-two-circly-dots pict dot1 dot2 arrowhead?) - (let ([base - (let*-values ([(sx sy) (cc-find pict dot1)] - [(raw-ex ey) (cc-find pict dot2)] - [(ex) (if arrowhead? - (+ raw-ex 2) - raw-ex)]) - (cc-superimpose - (dc - (λ (dc dx dy) - (let ([pen (send dc get-pen)]) - (send dc set-pen - type-link-color ;(send pen get-color) - (if (is-a? dc post-script-dc%) - 4 - 2) - 'dot) - (send dc draw-line - (+ dx sx) (+ dy sy) - (+ dx ex) (+ dy ey)) - (send dc set-pen pen))) - (pict-width pict) - (pict-height pict)) - pict))]) - (if arrowhead? - (pin-arrow-line field-arrowhead-size - base - dot1 (λ (ignored1 ignored2) - (let-values ([(x y) (cc-find pict dot2)]) - (values (+ x 2) y))) - dot2 cc-find - #:color type-link-color) - base))) - -(define (dotted-right-right-reference p0 a b c d [count 1]) - (right-right-reference p0 a b c d count #:connect-dots connect-circly-dots)) - -(module+ slideshow - (require slideshow) - (define p (inset (mk-diagram) 0 0 0 1)) - (define c (blank client-w client-h)) - (slide (lt-superimpose (t "top") (clip (refocus (ct-superimpose p c) c)))) - (slide (lt-superimpose (t "bottom") (clip (refocus (cb-superimpose p c) c)))) - (slide (lt-superimpose (t "all") - (ct-superimpose - c - (scale p - (min (/ client-w (pict-width p)) - (/ client-h (pict-height p)))))))) diff --git a/scribble-doc/scribblings/scribble/struct.scrbl b/scribble-doc/scribblings/scribble/struct.scrbl deleted file mode 100644 index c2301f8c..00000000 --- a/scribble-doc/scribblings/scribble/struct.scrbl +++ /dev/null @@ -1,280 +0,0 @@ -#lang scribble/manual -@(require (except-in "utils.rkt" - make-part make-paragraph make-table make-itemization make-compound-paragraph - make-element make-toc-element make-target-element make-toc-target-element make-toc-target2-element - make-page-target-element make-redirect-target-element make-link-element - make-index-element - make-target-url target-url struct:target-url target-url? target-url-addr - toc-element-toc-content toc-target2-element-toc-content part-title-content paragraph-content - element? element-content element-style) - (for-label scribble/manual-struct - scribble/struct - setup/main-collects)) - -@(define (compat) @italic{For backward compatibility.}) -@(define-syntax-rule (compat/comp id) - @elem{@compat[] Compared to the normal constructor for @racket[id]}) - -@title[#:tag "struct"]{Compatibility Structures And Processing} - -@defmodule[scribble/struct]{ -The @racket[scribble/struct] compatibility library mostly re-exports -@racket[scribble/core], but using some different names (e.g., -@racket[blockquote] instead of @racket[nested-flow]).} - -The following structure types and functions are re-exported directly: - -@racketblock[collect-info resolve-info tag? block? - delayed-block collected-info delayed-element ; delayed-element-content delayed-block-blocks current-serialize-resolve-info - part-relative-element collect-info-parents ; part-relative-element-content delayed-index-desc - collect-element render-element generated-tag ; generate-tag current-tag-prefixes add-current-tag-prefix - tag-key content->string element->string ; strip-aux - block-width element-width - info-key? part-collected-info collect-put! - resolve-get resolve-get/tentative resolve-get/ext? - resolve-search resolve-get-keys] - -The following structure types are re-exported, but the constructors and some selectors -are replaced as documented further below: - -@racketblock[part paragraph table itemization compound-paragraph - element toc-element target-element toc-target-element toc-target2-element - page-target-element redirect-target-element link-element - index-element] - -Several additional compatibility functions and structure types are -also exported. - -@defproc[(make-part [tag-prefix (or/c false/c string?)] - [tags (listof tag?)] - [title-content (or/c false/c list?)] - [style any/c] - [to-collect list?] - [blocks (listof block?)] - [parts (listof part?)]) - part?]{ - -@compat/comp[part], parses @racket[style] to convert old formats to -the current one. Also, if @racket[title-content] is a list with a -single item, the item by itself is stored in the resulting -@racket[part].} - -@defproc[(part-flow [p part?]) (listof block?)]{ - -@compat[] An alias for @racket[part-blocks].} - -@defproc[(part-title-content [p part?]) list?]{ - -@compat[] Like the normal selector, but if the result would not be a list, it is -coerced to one.} - -@deftogether[( -@defproc[(make-versioned-part [tag-prefix (or/c false/c string?)] - [tags (listof tag?)] - [title-content (or/c false/c list?)] - [style any/c] - [to-collect list?] - [blocks (listof block?)] - [parts (listof part?)] - [version string?]) - part?] -@defproc[(versioned-part? [v any/c]) boolean?] -)]{ - -@compat[] Like @racket[make-part], but adds a the -@racket[document-version] @tech{style property} using the given -@racket[version]. The @racket[versioned-part?] predicate recognizes a -@racket[part] with a @racket[document-version] property.} - -@deftogether[( -@defproc[(make-unnumbered-part [tag-prefix (or/c false/c string?)] - [tags (listof tag?)] - [title-content (or/c false/c list?)] - [style any/c] - [to-collect list?] - [blocks (listof block?)] - [parts (listof part?)]) - part?] -@defproc[(unnumbered-part? [v any/c]) boolean?] -)]{ - -@compat[] Like @racket[make-part], but adds the @racket['unnumbered] -@tech{style property}. The @racket[unnumbered-part?] predicate -recognizes a @racket[part] with the @racket['unnumbered] property.} - - -@defproc[(make-paragraph [content list?]) paragraph?]{ - -@compat/comp[paragraph], omits a style argument. Also, if -@racket[content] is a list containing a single item, the item by -itself is stored in the resulting @racket[paragraph].} - -@defproc[(paragraph-content [p paragraph?]) list?]{ - -@compat[] Like the normal selector, but if the result would not be a list, it is -coerced to one. -} - - -@deftogether[( -@defproc[(make-styled-paragraph [content list?] [style any/c]) paragraph?] -@defproc[(styled-paragraph? [v any/c]) boolean?] -@defproc[(styled-paragraph-style [p paragraph?]) style?] -)]{ - -@compat/comp[paragraph], parses @racket[style] to convert old formats -to the current one. The @racket[styled-paragraph?] predicate and -@racket[styled-paragraph-style] accessor are aliases for -@racket[paragraph?] and @racket[paragraph-style].} - - -@deftogether[( -@defproc[(make-omitable-paragraph [content list?]) paragraph?] -@defproc[(omitable-paragraph? [v any/c]) boolean?] -)]{ - -@compat[] Like @racket[make-paragraph], but adds the -@racket['omitable] @tech{style property}. The -@racket[omitable-paragraph?] predicate checks for a paragraph with the -property.} - - -@defproc[(make-table [style any/c] - [blocksss (listof (listof (or/c (listof block?) (one-of/c 'cont))))]) - table?]{ - -@compat/comp[table], the style is converted, and each cell has a list -of blocks instead of a single block. If any such list has multiple -blocks, they are combined into a @racket[nested-flow].} - -@defproc[(table-flowss [table table?]) - (listof (listof (or/c (listof block?) (one-of/c 'cont))))]{ - -@compat[] Like @racket[table-blockss], but adds a list wrapper to be -consistent with @racket[make-table].} - -@defproc[(make-itemization [blockss (listof (listof block?))]) itemization?]{ - -@compat/comp[itemization], omits a style argument.} - -@deftogether[( -@defproc[(make-styled-itemization [style any/c] - [blockss (listof (listof block?))]) itemization?] -@defproc[(styled-itemization? [v any/c]) boolean?] -@defproc[(styled-itemization-style [i itemization?]) style?] -)]{ - -@compat/comp[itemization], parses @racket[style] to convert old -formats to the current one. The @racket[styled-itemization?] predicate -is an alias for @racket[itemization?], and -@racket[styled-itemization-style] is an alias for -@racket[itemization-style].} - -@defproc[(make-blockquote [style any/c] [blocks (listof block?)]) - nested-flow?]{ - -@compat[] Like @racket[make-nested-flow], but @racket[style] is -parsed to the current format.} - - -@deftogether[( -@defproc[(make-auxiliary-table [style any/c] - [blocksss (listof (listof (or/c (listof block?) (one-of/c 'cont))))]) - table?] -@defproc[(auxiliary-table? [v any/c]) boolean?] -)]{ - -@compat[] Like @racket[make-table], but adds the @racket['aux] -@tech{style property}. The @racket[auxiliary-table?] predicate recognizes -tables with the @racket['aux] property.} - - -@defproc[(make-compound-paragraph [style any/c] - [blocks (listof block?)]) - compound-paragraph?]{ - -@compat/comp[compound-paragraph], parses @racket[style] to convert old -formats to the current one.} - -@deftogether[( -@defproc[(make-element [style any/c] [content list?]) element?] -@defproc[(make-toc-element [style any/c] [content list?] [toc-content list?]) toc-element?] -@defproc[(make-target-element [style any/c] [content list?] [tag tag?]) target-element?] -@defproc[(make-toc-target-element [style any/c] [content list?] [tag tag?]) toc-target-element?] -@defproc[(make-toc-target2-element [style any/c] [content list?] [tag tag?] [toc-content content?]) toc-target2-element?] -@defproc[(make-page-target-element [style any/c] [content list?] [tag tag?]) page-target-element?] -@defproc[(make-redirect-target-element [style any/c] [content list?] [tag tag?] - [alt-path path-string?] [alt-anchor string?]) redirect-target-element?] -@defproc[(make-link-element [style any/c] [content list?] [tag tag?]) link-element?] -@defproc[(make-index-element [style any/c] [content list?] [tag tag?] - [plain-seq (and/c pair? (listof string?))] - [entry-seq list?] [desc any/c]) index-element?] -)]{ - -@compat[] Compared to the normal constructors, parses @racket[style] to convert old -formats to the current one.} - - -@deftogether[( -@defproc[(element? [v any/c]) boolean?] -@defproc[(element-content [e element?]) list?] -@defproc[(element-style [e element?]) element-style?] -)]{ - -@compat[] A @tech{content} list is treated as an element by these functions, -and the result of @racket[element-content] is always a list.} - - -@defproc[(make-aux-element [style any/c] [content list?]) element?]{ - -@compat[] Like @racket[make-element], but adds the @racket['aux] -@tech{style property}.} - - -@defproc[(make-hover-element [style any/c] [content list?] [text string?]) element?]{ - -@compat[] Like @racket[make-element], but adds @racket[hover-property] -containing @racket[text] to the element's style.} - - -@defproc[(make-script-element [style any/c] [content list?] [type string?] - [script (or/c path-string? (listof string?))]) element?]{ - -@compat[] Like @racket[make-element], but adds @racket[script-property] -containing @racket[type] and @racket[script] to the element's style.} - - -@defstruct[with-attributes ([style any/c] - [assoc (listof (cons/c symbol? string?))])]{ - -@compat[] Used for an @racket[element]'s style to combine a base style with -arbitrary HTML attributes. When the @racket[style] field is itself an -instance of @racket[with-attributes], its content is automatically -flattened into the enclosing @racket[with-attributes] when it is used -(when, e.g., rendering an @racket[element] or @racket[paragraph]).} - - -@defstruct[target-url ([addr path-string?] - [style any/c])]{ - -@compat[] Used as a style for an @racket[element]. The @racket[style] at this -layer is a style for the hyperlink.} - - -@defstruct[image-file ([path (or/c path-string? - (cons/c 'collects (listof bytes?)))] - [scale real?])]{ - -@compat[] Used as a style for an @racket[element] to inline an image. The -@racket[path] field can be a result of -@racket[path->main-collects-relative].} - - - - -@defproc*[([(element->string (element content?)) string?] - [(element->string (element content?) (renderer any/c) (p part?) (info resolve-info?)) string?])]{ - -@compat[] An alias for @racket[content->string]. - -} diff --git a/scribble-doc/scribblings/scribble/style.scrbl b/scribble-doc/scribblings/scribble/style.scrbl deleted file mode 100644 index fc4e60b3..00000000 --- a/scribble-doc/scribblings/scribble/style.scrbl +++ /dev/null @@ -1,231 +0,0 @@ -#lang scribble/doc -@(require scribble/manual scribble/eval "utils.rkt" - (for-label scribble/manual scribble/eval)) - -@title[#:tag "reference-style"]{Style Guide} - -Consistent style---for terms, typesetting, and prose---makes -documentation clearer. As much as possible, follow the rules listed in -this section. Many of the rules are arbitrary in the sense that a -different choice of rule could work fine, but the only way to make our -documentation consistent is to pick one of the choices. - -There are too many rules to absorb easily on a first reading. Re-read -this section after writing documentation for a library or two, and -revisit the section periodically to refresh your memory and check for -new rules. - -@section{Prose and Terminology} - -In the descriptive body of @racket[defform], @racket[defproc], etc., -do not start with ``This ...'' Instead, start with a sentence whose -implicit subject is the form or value being described (but only start -the first sentence that way). Capitalize the first word. Thus, the -description will often start with ``Returns'' or ``Produces.'' Refer -to arguments and sub-forms by name. - -Do not use the word ``argument'' to describe a sub-form in a syntactic -form; use the term ``sub-form'' instead, reserving ``argument'' for -values or expressions in a function call. Refer to libraries and -languages as such, rather than as ``modules'' (even though the form to -typeset a library or language name is called @racket[racketmodname]). -Do not call an identifier (i.e., a syntactic element) a ``variable'' -or a ``symbol.'' Do not use the word ``expression'' for a form that is -a definition or might be a definition; use the word ``form,'' instead. -Prefer ``function'' to ``procedure.'' - -Use the word ``list'' only when you mean a run-time value consisting -of the empty list and cons cells; use the word ``sequence'' in other -cases, if you must use any word. For example, do not write that -@racket[begin] has a ``list of sub-forms;'' instead, it has a -``sequence of sub-forms.'' Similarly, do not refer to a ``list of -arguments'' in a function call; just write ``arguments'' if possible, -or write ``sequence of argument expressions.'' (Unfortunately, -``@tech[#:doc '(lib -"scribblings/reference/reference.scrbl")]{sequence}'' has acquired a -specific run-time meaning, too, but the collision is less severe than -the historical confusion between lists and other entities in Lisp.) - -Avoid cut-and-paste for descriptive text. If two functions are -similar, consider documenting them together with -@racket[deftogether]. To abstract a description, consider using -explicit prose abstraction, such as ``@racket[x] is like @racket[y], -except that ...,'' instead of abstracting the source and instantiating -it multiple times; often, a prose abstraction is clearer to the reader -than a hidden abstraction in the document implementation. - -Hyphenate the words ``sub-form'' and ``sub-expression.'' - -Use ``Windows,'' ``Mac OS X,'' and ``Unix'' for the three -``platforms'' (as opposed to ``systems'') on which Racket runs. Use -``Unix'' as a generic term for Unix-like operating systems---notably -including Linux---other than Mac OS X. Use ``Unix'' even when ``Gtk'' -or ``the X11 windowing system'' would be more precisely correct, but -use ``X11'' as adjective when necessary, such as ``X11 display.'' -Racket runs ``on'' a platform, as opposed to ``under'' a platform. - - -@section{Typesetting Code} - -Use @racketidfont{id} or a name that ends @racketidfont{-id} in -@racket[defform] to mean an identifier, not @racketidfont{identifier}, -@racketidfont{variable}, @racketidfont{name}, or -@racketidfont{symbol}. Similarly, use @racketidfont{expr} or something -that ends @racketidfont{-expr} for an expression position within a -syntactic form. Use @racketidfont{body} for a form (definition or -expression) in an internal-definition position---always followed by -@racket[...+] in a grammar description. Do not use -@racketidfont{expr} for something that isn't exactly an expression, -@racket[id] for something that isn't exactly an identifier, etc.; -instead, use @racket[defform/subs] to define a new non-terminal. - -Beware of using @racket[deftogether] to define multiple variants of a -syntactic form or procedure, because each @racket[defform] or -@racket[defproc] creates a definition point, but each form or -procedure should have a single definition point. (Scribble issues a -warning when a binding has multiple definition points.) Instead, use -@racket[defproc*] or @racket[defform*]. - -For function arguments, use @racket[v] as the meta-variable for ``any -value.'' Use @racket[x] as a meta-variable only for numerical -values. Other conventions include @racket[lst] for a list and -@racket[proc] for a procedure. - -Pay attention to the difference between identifiers and meta-variables -when using @racket[racket], especially outside of @racket[defproc] or -@racket[defform]. Prefix a meta-variable with @litchar{_}; for -example, - -@verbatim[#:indent 2]|{@racket[(rator-expr rand-expr ...)]}| - -would be the wrong way to refer to the grammar of a function call, -because it produces @racket[(rator-expr rand-expr ...)], where -@racketidfont{rator-expr} and @racketidfont{rand-expr} are -typeset as variables. The correct description is - -@verbatim[#:indent 2]|{@racket[(_rator-expr _rand-expr ...)]}| - -which produces @racket[(_rator-expr _rand-expr ...)], where -@racketidfont{rator-expr} and @racketidfont{rand-expr} are typeset as -meta-variables. The @racket[defproc], @racket[defform], @|etc| forms -greatly reduce this burden in descriptions, since they automatically -set up meta-variable typesetting for non-literal identifiers. In -@racket[defform], be sure to include literal identifiers (i.e., those -not meant as variables, other than the form name being defined) in a -@racket[#:literals] clause. - -To typeset an identifier with no particular interpretation---syntax, -variable, meta-variable, etc.---use @racket[racketidfont] (e.g., as in -@racketidfont{rand-expr} above). Otherwise, use @racket[litchar], -not merely @racket[racketfont] or @racket[verbatim], to refer to a -specific sequence of characters. - -When a syntactic form synthesizes an identifier from a given -identifier, use a combination of @racket[racketidfont] and -@racket[racket] to describe the identifiers. For example, if -@racket[_id] is combined with @racketidfont{is-} and @racketidfont{?} -to form @racketidfont{is-}@racket[_id]@racketidfont{?}, then implement -that identifier as -@code[#:lang "at-exp racket"]|{@racketidfont{is-}@racket[id]@racketidfont{?}}|. - -When using @racket[defform] to describe a syntactic form, don't -confuse the @racket[#:contracts] clause with a grammar -specification. Use @racket[#:contracts] only for expressions within the -syntactic form, and the contract is a run-time constraint---not a -syntactic constraint, such as requiring a sub-form to be an identifier. -Use @racket[defform/subs] for syntactic constraints. - -When showing example evaluations, use the REPL-snapshot style: - -@verbatim[#:indent 2]|{ - @interaction[ - (+ 1 2) - ] -}| - -See also the @racket[scribble/eval] library and @secref["examples-style"]. - -Use four dots, @litchar{....}, in place of omitted code, since -@litchar{...} means repetition. - - -@section{Typesetting Prose} - -Refrain from referring to documentation ``above'' or ``below,'' and -instead have a hyperlink point to the right place. - -In prose, use @litchar{``} and @litchar{''} quotation marks instead of -@litchar{"}. Use @litchar{---} for an em dash, and do not include -spaces on either side. Use American style for quotation marks and punctuation -@; [Eli] BTW, I've asked several people about this, and the general -@; agreement that I've seen is that this is a rather arbitrary rule -@; and there's no harm in doing the more logical thing of putting -@; the punctuations outside quotations and parens. Just like you -@; did at the end of this sentence... -@; [Matthew] See intro of this section. -at the end of quotation marks (i.e., a sentence-terminating period -goes inside the quotation marks). Of course, this rule does not apply -for quotation marks that are part of code. - -Do not use a citation reference (as created by @racket[cite]) as a -noun; use it as an annotation. - -Do not start a sentence with a Racket variable name, since it is -normally lowercase. For example, use ``The @racket[_thing] argument -is...'' instead of ``@racket[_thing] is...'' - -Use @racket[etc] for ``@|etc|'' when it does not end a sentence, and -include a comma after ``@|etc|'' unless it ends a sentence of is -followed by other punctuation (such as a parenthesis). - -@section{Section Titles} - -Capitalize all words except articles (``the,'' ``a,'' etc.), -prepositions, and conjunctions that are not at the start of the title. - -A manual title should normally start with a suitable keyword or key -phrase (such as ``Scribble'' for this manual) that is in boldface. If -the key word is primarily an executable name, use @racket[exec] -instead of @racket[bold]. Optionally add further descriptive text in -the title after a colon, where the text starting with the colon is not -in boldface. - -@section{Indexing} - -Document and section titles, identifiers that are documented with -@racket[defproc], @racket[defform], etc. are automatically indexed, as -are terms defined with @racket[deftech]. - -Symbols are not indexed automatically. Use @racket[indexed-racket] -instead of @racket[racket] for the instance of a symbol that roughly -defines the use. For an example, try searching for ``truncate'' to -find @racket['truncate] as used with @racket[open-output-file]. Do no -use something like @racket[(index "'truncate")] to index a symbol, -because it will not typeset correctly (i.e., in a fixed-width font -with the color of a literal). - -Use @racket[index], @racket[as-index], and @racket[section-index] as a -last resort. Create index entries for terms that are completely -different from terms otherwise indexed. Do not try to index minor -variations of a term or phrase in an attempt to improve search -results; if search fails to find a word or phrase due to a minor -variation, then the search algorithm should be fixed, not the index -entry. - -@section[#:tag "examples-style"]{Examples} - -Strive to include examples (using @racket[examples]) with the -documentation of every function and syntactic form. When writing -examples, refrain from using nonsense words like ``foo'' and ``bar.'' -For example, when documenting @racket[member], resist the temptation -to write - -@interaction[ -(member "foo" '("bar" "foo" "baz")) -] - -and instead write something like - -@interaction[ -(member "Groucho" '("Harpo" "Groucho" "Zeppo")) -] diff --git a/scribble-doc/scribblings/scribble/tag.scrbl b/scribble-doc/scribblings/scribble/tag.scrbl deleted file mode 100644 index 65d82382..00000000 --- a/scribble-doc/scribblings/scribble/tag.scrbl +++ /dev/null @@ -1,140 +0,0 @@ -#lang scribble/doc -@(require scribble/manual "utils.rkt" - (for-label setup/main-collects)) - -@title[#:tag "tag"]{Tag Utilities} - -@declare-exporting[scribble/tag scribble/base] - -@defmodule*/no-declare[(scribble/tag)]{The @racketmodname[scribble/tag] -library provides utilities for constructing cross-reference -@tech{tags}. The library is re-exported by -@racketmodname[scribble/base].} - -@; ------------------------------------------------------------------------ - -@defproc[(make-section-tag [name string?] - [#:doc doc-mod-path (or/c module-path? #f) #f] - [#:tag-prefixes tag-prefixes (or/c #f (listof string?)) #f]) - tag?]{ - -Forms a @tech{tag} that refers to a section whose ``tag'' (as provided -by the @racket[#:tag] argument to @racket[section], for example) is -@racket[name]. If @racket[doc-mod-path] is provided, the @tech{tag} -references a section in the document implemented by -@racket[doc-mod-path] from outside the document. Additional tag -prefixes (for intermediate sections, typically) can be provided as -@racket[tag-prefixes].} - -@defproc[(make-module-language-tag [lang symbol?]) tag?]{ - Forms a @tech{tag} that refers to a section - that contains @racket[defmodulelang] for the language - @racket[lang]. -} - -@defproc[(taglet? [v any/c]) boolean?]{ - -Returns @racket[#t] if @racket[v] is a @tech{taglet}, @racket[#f] -otherwise. - -A @deftech{taglet} is a value that can be combined with a symbol via -@racket[list] to form a @tech{tag}, but that is not a -@racket[generated-tag]. A @tech{taglet} is therefore useful as a piece -of a @tech{tag}, and specifically as a piece of a tag that can gain a -prefix (e.g., to refer to a section of a document from outside the -document).} - - -@defproc*[([(doc-prefix [mod-path (or/c #f module-path?)] - [taglet taglet?]) - taglet?] - [(doc-prefix [mod-path (or/c #f module-path?)] - [extra-prefixes (or/c #f (listof taglet?))] - [taglet taglet?]) - taglet?])]{ - -Converts part of a cross-reference @tech{tag} that would work within a -document implemented by @racket[mod-path] to one that works from -outside the document, assuming that @racket[mod-path] is not -@racket[#f]. That is, @racket[mod-path] is converted to a -@tech{taglet} and added as prefix to an existing @racket[taglet]. - -If @racket[extra-prefixes] is provided, then its content is added as a -extra prefix elements before the prefix for @racket[mod-path] is -added. A @racket[#f] value for @racket[extra-prefixes] is equivalent -to @racket['()]. - -If @racket[mod-path] is @racket[#f], then @racket[taglet] is returned -without a prefix (except adding @racket[extra-prefixes], if provided).} - - -@defproc[(module-path-prefix->string [mod-path module-path?]) string?]{ - -Converts a module path to a string by resolving it to a path, and -using @racket[path->main-collects-relative].} - -@defproc[(module-path-index->taglet [mpi module-path-index?]) taglet?]{ - -Converts a module path index to a @tech{taglet}---a normalized -encoding of the path as an S-expression---that is interned via -@racket[intern-taglet]. - -The string form of the @tech{taglet} is used as prefix in a @tech{tag} -to form cross-references into the document that is implemented by the -module referenced by @racket[mpi].} - -@defproc[(intern-taglet [v any/c]) any/c]{ - -Returns a value that is @racket[equal?] to @racket[v], where multiple -calls to @racket[intern-taglet] for @racket[equal?] @racket[v]s -produce the same (i.e., @racket[eq?]) value.} - - -@defproc[(definition-tag->class/interface-tag [definition-tag definition-tag?]) - class/interface-tag?]{ - Constructs a tag like @racket[definition-tag], except that - it matches documentation for the class. If @racket[definition-tag] - doesn't document a class or interface, this function still returns - the tag that the class or interface documentation would have had, - as if @racket[definition-tag] had documented a class or interface. - - @history[#:added "1.11"] -} -@defproc[(class/interface-tag->constructor-tag [class/interface-tag class/interface-tag?]) - constructor-tag?]{ - Constructs a tag like @racket[definition-tag], except that - it matches documentation for the constructor of the class. - - @history[#:added "1.11"] -} -@defproc[(get-class/interface-and-method [method-tag method-tag?]) - (values symbol? symbol?)]{ - Returns the class name and method name (respectively) for the method documented - by the docs at @racket[method-tag]. - - @history[#:added "1.11"] -} -@defproc[(definition-tag? [v any/c]) boolean?]{ - Recognizes definition tags. If @racket[(definition-tag? _v)] is - @racket[#t], then so is @racket[(tag? _v)]. - - @history[#:added "1.11"] -} -@defproc[(class/interface-tag? [v any/c]) boolean?]{ - Recognizes class or interface tags. If @racket[(class/interface-tag? _v)] is - @racket[#t], then so is @racket[(tag? _v)]. - - @history[#:added "1.11"] -} -@defproc[(method-tag? [v any/c]) boolean?]{ - Recognizes method tags. If @racket[(method-tag? _v)] is - @racket[#t], then so is @racket[(tag? _v)]. - - @history[#:added "1.11"] -} -@defproc[(constructor-tag? [v any/c]) boolean?]{ - Recognizes class constructor tags. If @racket[(constructor-tag? _v)] is - @racket[#t], then so is @racket[(tag? _v)]. - - @history[#:added "1.11"] -} diff --git a/scribble-doc/scribblings/scribble/text.scrbl b/scribble-doc/scribblings/scribble/text.scrbl deleted file mode 100644 index 2bd0dbe5..00000000 --- a/scribble-doc/scribblings/scribble/text.scrbl +++ /dev/null @@ -1,1362 +0,0 @@ -#lang scribble/doc -@(require scribble/manual - scribble/core scribble/html-properties scribble/latex-properties - (except-in "utils.rkt" splice begin include) - (for-label (except-in racket/base begin) - scribble/text - (only-in scribble/text - [begin/text begin] - [include/text include]))) -@initialize-tests - -@(define (tech/r s) @tech[s #:doc '(lib "scribblings/reference/reference.scrbl")]) -@(define scribble-doc '(lib "scribblings/scribble/scribble.scrbl")) -@(define @-form @tech[#:doc scribble-doc]{@"@"-forms}) - -@(define-syntax-rule (def-rkt t-id) - (begin - (require (for-label racket/include)) - (define t-id @racket[include]))) -@(def-rkt rkt-include) - -@title[#:tag "text" - #:style (make-style #f (list (make-tex-addition "shaded.tex") - (make-css-addition "shaded.css"))) - ]{Text Generation} - -@defmodulelang[scribble/text]{The @racketmodname[scribble/text] -language provides everything from @racket[racket/base], -@racket[racket/promise], @racket[racket/list], and -@racket[racket/string], but with additions and a changed treatment of -the module top level to make it suitable as for text generation or a -preprocessor language: - -@itemize[ - - @item{The language uses @racket[read-syntax-inside] to read the body - of the module, similar to @secref[#:doc scribble-doc "docreader"]. This means that - by default, all text is read in as Racket strings; and - @seclink[#:doc scribble-doc "reader"]|{@-forms}| can be used to use Racket - functions and expression escapes.} - - @item{Values of expressions are printed with a custom @racket[output] - function. This function displays most values in a similar way - to @racket[display], except that it is more convenient for a - textual output.}] - -} - -When @racketmodname[scribble/text] is used via @racket[require] -instead of @hash-lang[], then it does not change the printing of -values, it does not include the bindings of @racket[racket/base], -@racket[include] is provided as @racket[include/text], and -@racket[begin] is provided as @racket[begin/text]. - -@; TODO: -@; * make all example sections be subsections, -@; * add a reference section, -@; * a section on "scribble/text.rkt" -@; * maybe a section on additional utilities: begin/text - -@;-------------------------------------------------------------------- -@section{Writing Text Files} - -The combination of the two features makes text in files in the -@racket[scribble/text] language be read as strings, which get printed -out when the module is @racket[require]d, for example, when a file is -given as an argument to @exec{racket}. (In these example the left -part shows the source input, and the right part the printed result.) - -@example|-{#lang scribble/text - Programming languages should - be designed not by piling - feature on top of feature, but - blah blah blah. - ---***--- - Programming languages should - be designed not by piling - feature on top of feature, but - blah blah blah.}-| - -Using @seclink[#:doc scribble-doc "reader"]|{@-forms}|, we can define and use Racket -functions. - -@example|-{#lang scribble/text - @(require racket/list) - @(define Foo "Preprocessing") - @(define (3x . x) - ;; racket syntax here - (add-between (list x x x) " ")) - @Foo languages should - be designed not by piling - feature on top of feature, but - @3x{blah}. - ---***--- - Preprocessing languages should - be designed not by piling - feature on top of feature, but - blah blah blah.}-| - -As demonstrated in this case, the @racket[output] function simply -scans nested list structures recursively, which makes them convenient -for function results. In addition, @racket[output] prints most values -similarly to @racket[display] --- notable exceptions are void and -false values which cause no output to appear. This can be used for -convenient conditional output. - -@example|-{#lang scribble/text - @(define (errors n) - (list n - " error" - (and (not (= n 1)) "s"))) - You have @errors[3] in your code, - I fixed @errors[1]. - ---***--- - You have 3 errors in your code, - I fixed 1 error.}-| - -Using the scribble @seclink[#:doc scribble-doc "reader"]|{@-forms}| syntax, you can write -functions more conveniently too. - -@example|-{#lang scribble/text - @(define (errors n) - ;; note the use of `unless' - @list{@n error@unless[(= n 1)]{s}}) - You have @errors[3] in your code, - I fixed @errors[1]. - ---***--- - You have 3 errors in your code, - I fixed 1 error.}-| - -Following the details of the scribble reader, you may notice that in -these examples there are newline strings after each definition, yet -they do not show in the output. To make it easier to write -definitions, newlines after definitions and indentation spaces before -them are ignored. - -@example|-{#lang scribble/text - - @(define (plural n) - (unless (= n 1) "s")) - - @(define (errors n) - @list{@n error@plural[n]}) - - You have @errors[3] in your code, - @(define fixed 1) - I fixed @errors[fixed]. - ---***--- - You have 3 errors in your code, - I fixed 1 error.}-| - -These end-of-line newline strings are not ignored when they follow -other kinds of expressions, which may lead to redundant empty lines in -the output. - -@example|-{#lang scribble/text - @(define (count n str) - (for/list ([i (in-range 1 (add1 n))]) - @list{@i @str,@"\n"})) - Start... - @count[3]{Mississippi} - ... and I'm done. - ---***--- - Start... - 1 Mississippi, - 2 Mississippi, - 3 Mississippi, - - ... and I'm done.}-| - -There are several ways to avoid having such empty lines in your -output. The simplest way is to arrange for the function call's form -to end right before the next line begins, but this is often not too -convenient. An alternative is to use a @litchar|{@;}| comment, which -makes the scribble reader ignore everything that follows it up to and -including the newline. (These methods can be applied to the line that -precedes the function call too, but the results are likely to have -what looks like erroneous indentation. More about this below.) - -@example|-{#lang scribble/text - @(define (count n str) - (for/list ([i (in-range 1 (+ n 1))]) - @list{@i @str,@"\n"})) - Start... - @count[3]{Mississippi - }... done once. - - Start again... - @count[3]{Massachusetts}@; - ... and I'm done again. - ---***--- - Start... - 1 Mississippi, - 2 Mississippi, - 3 Mississippi, - ... done once. - - Start again... - 1 Massachusetts, - 2 Massachusetts, - 3 Massachusetts, - ... and I'm done again.}-| - -A better approach is to generate newlines only when needed. - -@example|-{#lang scribble/text - @(require racket/list) - @(define (counts n str) - (add-between - (for/list ([i (in-range 1 (+ n 1))]) - @list{@i @str,}) - "\n")) - Start... - @counts[3]{Mississippi} - ... and I'm done. - ---***--- - Start... - 1 Mississippi, - 2 Mississippi, - 3 Mississippi, - ... and I'm done.}-| - -In fact, this is common enough that the @racket[scribble/text] -language provides a convenient facility: @racket[add-newlines] is a -function that is similar to @racket[add-between] using a newline -string as the default separator, except that false and void values are -filtered out before doing so. - -@example|-{#lang scribble/text - @(define (count n str) - (add-newlines - (for/list ([i (in-range 1 (+ n 1))]) - @list{@i @str,}))) - Start... - @count[3]{Mississippi} - ... and I'm done. - ---***--- - Start... - 1 Mississippi, - 2 Mississippi, - 3 Mississippi, - ... and I'm done.}-| - -@example|-{#lang scribble/text - @(define (count n str) - (add-newlines - (for/list ([i (in-range 1 (+ n 1))]) - @(and (even? i) @list{@i @str,})))) - Start... - @count[6]{Mississippi} - ... and I'm done. - ---***--- - Start... - 2 Mississippi, - 4 Mississippi, - 6 Mississippi, - ... and I'm done.}-| - -The separator can be set to any value. - -@example|-{#lang scribble/text - @(define (count n str) - (add-newlines #:sep ",\n" - (for/list ([i (in-range 1 (+ n 1))]) - @list{@i @str}))) - Start... - @count[3]{Mississippi}. - ... and I'm done. - ---***--- - Start... - 1 Mississippi, - 2 Mississippi, - 3 Mississippi. - ... and I'm done.}-| - - -@;-------------------------------------------------------------------- -@section{Defining Functions and More} - -(Note: most of the tips in this section are applicable to any code -that uses the Scribble @|@-form| syntax.) - -Because the Scribble reader is uniform, you can use it in place of any -expression where it is more convenient. (By convention, we use a -plain S-expression syntax when we want a Racket expression escape, and -an @|@-form| for expressions that render as text, which, in the -@racket[scribble/text] language, is any value-producing expression.) -For example, you can use an @|@-form| for a function that you define. - -@example|-{#lang scribble/text - @(define @bold[text] @list{*@|text|*}) - An @bold{important} note. - ---***--- - An *important* note. - }-| - -This is not commonly done, since most functions that operate with text -will need to accept a variable number of arguments. In fact, this -leads to a common problem: what if we want to write a function that -consumes a number of ``text arguments'' rathen than a single -``rest-like'' body? The common solution for this is to provide the -separate text arguments in the S-expression part of an @|@-form|. - -@example|-{#lang scribble/text - @(define (choose 1st 2nd) - @list{Either @1st, or @|2nd|@"."}) - @(define who "us") - @choose[@list{you're with @who} - @list{against @who}] - ---***--- - Either you're with us, or against us. - }-| - -You can even use @|@-form|s with a Racket quote or quasiquote as the -``head'' part to make it shorter, or use a macro to get grouping of -sub-parts without dealing with quotes. - -@example|-{#lang scribble/text - @(define (choose 1st 2nd) - @list{Either @1st, or @|2nd|@"."}) - @(define who "us") - @choose[@list{you're with @who} - @list{against @who}] - @(define-syntax-rule (compare (x ...) ...) - (add-newlines - (list (list "* " x ...) ...))) - Shopping list: - @compare[@{apples} - @{oranges} - @{@(* 2 3) bananas}] - ---***--- - Either you're with us, or against us. - Shopping list: - * apples - * oranges - * 6 bananas - }-| - -Yet another solution is to look at the text values and split the input -arguments based on a specific token. Using @racket[match] can make it -convenient --- you can even specify the patterns with @|@-form|s. - -@example|-{#lang scribble/text - @(require racket/match) - @(define (features . text) - (match text - [@list{@|1st|@... - --- - @|2nd|@...} - @list{>> Pros << - @1st; - >> Cons << - @|2nd|.}])) - @features{fast, - reliable - --- - expensive, - ugly} - ---***--- - >> Pros << - fast, - reliable; - >> Cons << - expensive, - ugly. - }-| - -In particular, it is often convenient to split the input by lines, -identified by delimiting @racket["\n"] strings. Since this can be -useful, a @racket[split-lines] function is provided. - -@example|-{#lang scribble/text - @(require racket/list) - @(define (features . text) - (add-between (split-lines text) - ", ")) - @features{red - fast - reliable}. - ---***--- - red, fast, reliable. - }-| - -Finally, the Scribble reader accepts @emph{any} expression as the head -part of an @"@"-form --- even an @"@" form. This makes it possible to -get a number of text bodies by defining a curried function, where each -step accepts any number of arguments. This, however, means that the -number of body expressions must be fixed. - -@example|-{#lang scribble/text - @(define ((choose . 1st) . 2nd) - @list{Either you're @1st, or @|2nd|.}) - @(define who "me") - @@choose{with @who}{against @who} - ---***--- - Either you're with me, or against me. - }-| - - -@;-------------------------------------------------------------------- -@section{Using Printouts} - -Because the text language simply displays each toplevel value as the -file is run, it is possible to print text directly as part of the -output. - -@example|-{#lang scribble/text - First - @display{Second} - Third - ---***--- - First - Second - Third}-| - -Taking this further, it is possible to write functions that output -some text @emph{instead} of returning values that represent the text. - -@example|-{#lang scribble/text - @(define (count n) - (for ([i (in-range 1 (+ n 1))]) - (printf "~a Mississippi,\n" i))) - Start... - @count[3]@; avoid an empty line - ... and I'm done. - ---***--- - Start... - 1 Mississippi, - 2 Mississippi, - 3 Mississippi, - ... and I'm done.}-| - -This can be used to produce a lot of output text, even infinite. - -@example|-{#lang scribble/text - @(define (count n) - (printf "~a Mississippi,\n" n) - (count (add1 n))) - Start... - @count[1] - this line is never printed! - ---***--- - Start... - 1 Mississippi, - 2 Mississippi, - 3 Mississippi, - 4 Mississippi, - 5 Mississippi, - ...}-| - -However, you should be careful not to mix returning values with -printouts, as the results are rarely desirable. - -@example|-{#lang scribble/text - @list{1 @display{two} 3} - ---***--- - two1 3}-| - -Note that you don't need side-effects if you want infinite output. -The @racket[output] function iterates thunks and (composable) -promises, so you can create a loop that is delayed in either form. -@; Note: there is some sfs-related problem in racket that makes it not -@; run in bounded space, so don't show it for nowx. - -@example|-{#lang scribble/text - @(define (count n) - (cons @list{@n Mississippi,@"\n"} - (lambda () - (count (add1 n))))) - Start... - @count[1] - this line is never printed! - ---***--- - Start... - 1 Mississippi, - 2 Mississippi, - 3 Mississippi, - 4 Mississippi, - 5 Mississippi, - ...}-| - - -@;-------------------------------------------------------------------- -@section{Indentation in Preprocessed output} - -An issue that can be very important in many text generation applications -is the indentation of the output. This can be crucial in some cases, if -you're generating code for an indentation-sensitive language (e.g., -Haskell, Python, or C preprocessor directives). To get a better -understanding of how the pieces interact, you may want to review how the -@seclink[#:doc scribble-doc "reader"]|{Scribble reader}| section, but also remember that -you can use quoted forms to see how some form is read. - -@example|-{#lang scribble/text - @(format "~s" '@list{ - a - b - c}) - ---***--- - (list "a" "\n" " " "b" "\n" "c")}-| - -The Scribble reader ignores indentation spaces in its body. This is an -intentional feature, since you usually do not want an expression to -depend on its position in the source. But the question is whether we -@emph{can} render some output text with proper indentation. The -@racket[output] function achieves that by introducing @racket[block]s. -Just like a list, a @racket[block] contains a list of elements, and when -one is rendered, it is done in its own indentation level. When a -newline is part of a @racket[block]'s contents, it causes the following -text to appear with indentation that corresponds to the column position -at the beginning of the block. - -In addition, lists are also rendered as blocks by default, so they can -be used for the same purpose. In most cases, this makes the output -appear ``as intended'' where lists are used for nested pieces of text ---- either from a literal @racket[list] expression, or an expression -that evaluates to a list, or when a list is passed on as a value; either -as a toplevel expression, or as a nested value; either appearing after -spaces, or after other output. - -@example|-{#lang scribble/text - foo @block{1 - 2 - 3} - foo @list{4 - 5 - 6} - ---***--- - foo 1 - 2 - 3 - foo 4 - 5 - 6}-| - -@example|-{#lang scribble/text - @(define (code . text) - @list{begin - @text - end}) - @code{first - second - @code{ - third - fourth} - last} - ---***--- - begin - first - second - begin - third - fourth - end - last - end}-| - -@example|-{#lang scribble/text - @(define (enumerate . items) - (add-newlines #:sep ";\n" - (for/list ([i (in-naturals 1)] - [item (in-list items)]) - @list{@|i|. @item}))) - Todo: @enumerate[@list{Install Racket} - @list{Hack, hack, hack} - @list{Profit}]. - ---***--- - Todo: 1. Install Racket; - 2. Hack, hack, hack; - 3. Profit.}-| - -@example[#:hidden]|-{ - #lang scribble/text - @; demonstrates how indentation is preserved inside lists - begin - a - b - @list{c - d - @list{e - f - g} - h - i - @list{j - k - l} - m - n - o} - p - q - end - ---***--- - begin - a - b - c - d - e - f - g - h - i - j - k - l - m - n - o - p - q - end - }-| - -@example[#:hidden]|-{ - #lang scribble/text - - @list{ - a - - b - } - - c - ---***--- - a - - b - - c - }-| - -@example[#:hidden]|-{ - #lang scribble/text - @; indentation works even when coming from a function - @(define (((if . c) . t) . e) - @list{ - if (@c) - @t - else - @e - fi}) - function foo() { - @list{if (1 < 2) - something1 - else - @@@if{2<3}{something2}{something3} - repeat 3 { - @@@if{2<3}{something2}{something3} - @@@if{2<3}{ - @list{something2.1 - something2.2} - }{ - something3 - } - } - fi} - return - } - ---***--- - function foo() { - if (1 < 2) - something1 - else - if (2<3) - something2 - else - something3 - fi - repeat 3 { - if (2<3) - something2 - else - something3 - fi - if (2<3) - something2.1 - something2.2 - else - something3 - fi - } - fi - return - } - }-| - -@example[#:hidden]|-{ - #lang scribble/text - @; indentation works with a list, even a single string with a newline - @; in a list, but not in a string by itself - function foo() { - prefix - @list{if (1 < 2) - something1 - else - @list{something2 - something3} - @'("something4\nsomething5") - @"something6\nsomething7" - fi} - return - } - @; can be used with a `display', but makes sense only at the top level - @; or in thunks (not demonstrated here) - @(display 123) foo @list{bar1 - bar2 - bar2} - ---***--- - function foo() { - prefix - if (1 < 2) - something1 - else - something2 - something3 - something4 - something5 - something6 - something7 - fi - return - } - 123 foo bar1 - bar2 - bar2 - }-| - -There are, however, cases when you need more refined control over the -output. The @racket[scribble/text] language provides a few functions -for such cases in addition to @racket[block]. The @racket[splice] -function groups together a number of values but avoids introducing a new -indentation context. Furthermore, lists are not always rendered as -@racket[block]s --- instead, they are rendered as @racket[splice]s when -they are used inside one, so you essentially use @racket[splice] to -avoid the ``indentation group'' behavior, and @racket[block] to restore -it. - -@example|-{#lang scribble/text - @(define (blah . text) - @splice{{ - blah(@block{@text}); - }}) - start - @splice{foo(); - loop:} - @list{if (something) @blah{one, - two}} - end - ---***--- - start - foo(); - loop: - if (something) { - blah(one, - two); - } - end - }-| - -The @racket[disable-prefix] function disables all indentation -printouts in its contents, including the indentation before the body -of the @racket[disable-prefix] value itself. It is useful, for -example, to print out CPP directives. - -@example|-{#lang scribble/text - @(define (((IFFOO . var) . expr1) . expr2) - (define (array e1 e2) - @list{[@e1, - @e2]}) - @list{var @var; - @disable-prefix{#ifdef FOO} - @var = @array[expr1 expr2]; - @disable-prefix{#else} - @var = @array[expr2 expr1]; - @disable-prefix{#endif}}) - - function blah(something, something_else) { - @disable-prefix{#include "stuff.inc"} - @@@IFFOO{i}{something}{something_else} - } - ---***--- - function blah(something, something_else) { - #include "stuff.inc" - var i; - #ifdef FOO - i = [something, - something_else]; - #else - i = [something_else, - something]; - #endif - } - }-| - -If there are values after a @racket[disable-prefix] value on the same -line, they @emph{will} get indented to the goal column (unless the -output is already beyond it). - -@example|-{#lang scribble/text - @(define (thunk name . body) - @list{function @name() { - @body - }}) - @(define (ifdef cond then else) - @list{@disable-prefix{#}ifdef @cond - @then - @disable-prefix{#}else - @else - @disable-prefix{#}endif}) - - @thunk['do_stuff]{ - init(); - @ifdef["HAS_BLAH" - @list{var x = blah();} - @thunk['blah]{ - @ifdef["BLEHOS" - @list{@disable-prefix{#}@; - include - bleh();} - @list{error("no bleh");}] - }] - more_stuff(); - } - ---***--- - function do_stuff() { - init(); - # ifdef HAS_BLAH - var x = blah(); - # else - function blah() { - # ifdef BLEHOS - # include - bleh(); - # else - error("no bleh"); - # endif - } - # endif - more_stuff(); - } - }-| - -There are cases where each line should be prefixed with some string -other than a plain indentation. The @racket[add-prefix] function -causes its contents to be printed using some given string prefix for -every line. The prefix gets accumulated to an existing indentation, -and indentation in the contents gets added to the prefix. - -@example|-{#lang scribble/text - @(define (comment . body) - @add-prefix["// "]{@body}) - @comment{add : int int -> string} - char *foo(int x, int y) { - @comment{ - skeleton: - allocate a string - print the expression into it - @comment{...more work...} - } - char *buf = malloc(@comment{FIXME! - This is bad} - 100); - } - ---***--- - // add : int int -> string - char *foo(int x, int y) { - // skeleton: - // allocate a string - // print the expression into it - // // ...more work... - char *buf = malloc(// FIXME! - // This is bad - 100); - } - }-| - -When combining @racket[add-prefix] and @racket[disable-prefix] there -is an additional value that can be useful: @racket[flush]. This is a -value that causes @racket[output] to print the current indentation and -prefix. This makes it possible to get the ``ignored as a prefix'' -property of @racket[disable-prefix] but only for a nested prefix. - -@example|-{#lang scribble/text - @(define (comment . text) - (list flush - @add-prefix[" *"]{ - @disable-prefix{/*} @text */})) - function foo(x) { - @comment{blah - more blah - yet more blah} - if (x < 0) { - @comment{even more - blah here - @comment{even - nested}} - do_stuff(); - } - } - ---***--- - function foo(x) { - /* blah - * more blah - * yet more blah */ - if (x < 0) { - /* even more - * blah here - * /* even - * * nested */ */ - do_stuff(); - } - } - }-| - -@example[#:hidden]|-{ - #lang scribble/text - - @(begin - ;; This is a somewhat contrived example, showing how to use lists - ;; and disable-prefix to control the added prefix - (define (item . text) - ;; notes: the `flush' makes the prefix to that point print so the - ;; disable-prefix "* " is printed after it, which overwrites the - ;; "| " prefix - (list flush (add-prefix "| " (disable-prefix "* ") text))) - ;; note that a simple item with spaces is much easier: - (define (simple . text) @list{* @text})) - - start - @item{blah blah blah - blah blah blah - @item{more stuff - more stuff - more stuff} - blah blah blah - blah blah blah} - @simple{more blah - blah blah} - end - ---***--- - start - * blah blah blah - | blah blah blah - | * more stuff - | | more stuff - | | more stuff - | blah blah blah - | blah blah blah - * more blah - blah blah - end - }-| - - -@;-------------------------------------------------------------------- -@section{Using External Files} - -Using additional files that contain code for your preprocessing is -trivial: the source text is still source code in a module, so you can -@racket[require] additional files with utility functions. - -@example|-{#lang scribble/text - @(require "itemize.rkt") - Todo: - @itemize[@list{Hack some} - @list{Sleep some} - @list{Hack some - more}] - ---***--- itemize.rkt - #lang racket - (provide itemize) - (define (itemize . items) - (add-between (map (lambda (item) - (list "* " item)) - items) - "\n")) - ---***--- - Todo: - * Hack some - * Sleep some - * Hack some - more - }-| - -Note that the @seclink[#:doc scribble-doc "at-exp-lang"]{@racket[at-exp] language} can -often be useful here, since such files need to deal with texts. Using -it, it is easy to include a lot of textual content. - -@example|-{#lang scribble/text - @(require "stuff.rkt") - Todo: - @itemize[@list{Hack some} - @list{Sleep some} - @list{Hack some - more}] - @summary - ---***--- stuff.rkt - #lang at-exp racket/base - (require racket/list) - (provide (all-defined-out)) - (define (itemize . items) - (add-between (map (lambda (item) - @list{* @item}) - items) - "\n")) - (define summary - @list{If that's not enough, - I don't know what is.}) - ---***--- - Todo: - * Hack some - * Sleep some - * Hack some - more - If that's not enough, - I don't know what is. - }-| - -Of course, the extreme side of this will be to put all of your content -in a plain Racket module, using @|@-form|s for convenience. However, -there is no need to use the text language in this case; instead, you can -@racket[(require scribble/text)], which will get all of the bindings -that are available in the @racket[scribble/text] language. Using -@racket[output], switching from a preprocessed files to a Racket file is -very easy ---- choosing one or the other depends on whether it is more -convenient to write a text file with occasional Racket expressions or -the other way. - -@example|-{#lang at-exp racket/base - (require scribble/text racket/list) - (define (itemize . items) - (add-between (map (lambda (item) - @list{* @item}) - items) - "\n")) - (define summary - @list{If that's not enough, - I don't know what is.}) - (output - @list{ - Todo: - @itemize[@list{Hack some} - @list{Sleep some} - @list{Hack some - more}] - @summary - }) - ---***--- - Todo: - * Hack some - * Sleep some - * Hack some - more - If that's not enough, - I don't know what is. - }-| - -However, you might run into a case where it is desirable to include a -mostly-text file from a @racket[scribble/text] source file. It might be -because you prefer to split the source text to several files, or because -you need to use a template file that cannot have a @litchar{#lang} -header (for example, an HTML template file that is the result of an -external editor). In these cases, the @racket[scribble/text] language -provides an @racket[include] form that includes a file in the -preprocessor syntax (where the default parsing mode is text). - -@example|-{#lang scribble/text - @(require racket/list) - @(define (itemize . items) - (list - "
        " - (add-between - (map (lambda (item) - @list{
      • @|item|
      • }) - items) - "\n") - "
      ")) - @(define title "Todo") - @(define summary - @list{If that's not enough, - I don't know what is.}) - - @include["template.html"] - ---***--- template.html - - @|title| - -

      @|title|

      - @itemize[@list{Hack some} - @list{Sleep some} - @list{Hack some - more}] -

      @|summary|

      - - - ---***--- - - Todo - -

      Todo

      -
      • Hack some
      • -
      • Sleep some
      • -
      • Hack some - more
      -

      If that's not enough, - I don't know what is.

      - - - }-| - -(Using @racket[require] with a text file in the @racket[scribble/text] -language will not work as intended: the language will display the text -is when the module is invoked, so the required file's contents will be -printed before any of the requiring module's text does. If you find -yourself in such a situation, it is better to switch to a -Racket-with-@"@"-expressions file as shown above.) - -@;FIXME: add more text on `restore-prefix', `set-prefix', `with-writer' - -@;FIXME: add this to the reference section -@;@defform[(include filename)]{ -@; -@;Preprocess the @racket[filename] using the same syntax as -@;@racket[scribble/text]. This is similar to using @racket[load] in a -@;namespace that can access names bound in the current file so included -@;code can refer to bindings from the including module. Note, however, -@;that the including module cannot refer to names that are bound the -@;included file because it is still a plain racket module---for such -@;uses you should still use @racket[require] as usual.} - - -@; Two random tests -@example[#:hidden]|-{ - #lang scribble/text - - @define[name]{Racket} - - Suggested price list for "@name" - - @; test mutual recursion, throwing away inter-definition spaces - @; <-- this is needed to get only one line of space above - @(define (items-num) - (length items)) - - @(define average - (delay (/ (apply + (map car items)) (length items)))) - - @(define items - (list @list[99]{Home} - @list[149]{Professional} - @list[349]{Enterprize})) - - @(for/list ([i items] [n (in-naturals)]) - @list{@|n|. @name @cadr[i] edition: $@car[i].99 - @||})@; <-- also needed - - Total: @items-num items - Average price: $@|average|.99 - ---***--- - Suggested price list for "Racket" - - 0. Racket Home edition: $99.99 - 1. Racket Professional edition: $149.99 - 2. Racket Enterprize edition: $349.99 - - Total: 3 items - Average price: $199.99 - }-| -@example[#:hidden]|-{ - #lang scribble/text - - --*-- - @(define (angled . body) (list "<" body ">")) - @(define (shout . body) @angled[(map string-upcase body)]) - @define[z]{blah} - - blah @angled{blah @shout{@z} blah} blah - - @(define-syntax-rule @twice[x] - (list x ", " x)) - - @twice{@twice{blah}} - - @include{inp1} - - @(let ([name "Eli"]) (let ([foo (include "inp2")]) (list foo "\n" foo))) - Repeating yourself much? - ---***--- inp1 - Warning: blah overdose might be fatal - ---***--- inp2 - @(define (foo . xs) (bar xs)) - @(begin (define (isname) @list{is @foo{@name}}) - (define-syntax-rule (DEF x y) (define x y))) - @(DEF (bar x) (list z " " x)) - @(define-syntax-rule (BEG x ...) (begin x ...)) - @(BEG (define z "zee")) - - My name @isname - @DEF[x]{Foo!} - - ... and to that I say "@x", I think. - - ---***--- - --*-- - blah blah> blah - - blah, blah, blah, blah - - Warning: blah overdose might be fatal - - My name is zee Eli - ... and to that I say "Foo!", I think. - My name is zee Eli - ... and to that I say "Foo!", I think. - Repeating yourself much? - }-| - -@;-------------------------------------------------------------------- -@section{Text Generation Functions} - -@defthing[outputable/c contract?]{ - -A contract that (in principle) corresponds to value that can be output -by @racket[output]. Currently, however, this contract accepts all -values (to avoid the cost of checking at every boundary). - -@history[#:added "1.1"]} - -@defproc[(output [v outputable/c] [port output-port? (current-output-port)]) void?]{ - -Outputs values to @racket[port] as follows for each kind of @racket[v]: - - @itemlist[ - - @item{@tech/r{strings}, @tech/r{byte strings}, @tech/r{symbols}, - @tech/r{paths}, @tech/r{keywords}, @tech/r{numbers}, and - @tech/r{characters}: converts the value to a string along the - same lines as @racket[display], and then passes the string to - the @deftech{current writer}, which is initially - @racket[write-string]} - - @item{@|void-const|, @racket[#f], or @racket[null]: no output} - - @item{@tech/r{list}: output depends on the current mode, which is - initially @tech{splice mode}: - - @itemlist[ - - @item{@deftech{block mode}: each item in order, using the - starting column as the @deftech{current - indentation} (which starts out empty)} - - @item{@deftech{splice mode}: outputs each item in order} - - ]} - - @item{@racket[(block _v2 ...)]: outputs each @racket[_v2] in @tech{block mode}.} - - @item{@racket[(splice _v2 ...)]: outputs each @racket[_v2] in @tech{splice mode}.} - - @item{@racket[(set-prefix _pfx _v2 ...)]: sets the @deftech{current - prefix}, which is initially empty, to @racket[_pfx] while - outputting each @racket[_v2].} - - @item{@racket[(add-prefix _pfx _v2 ...)]: sets the @tech{current - prefix} to by adding @racket[_pfx] while outputting each - @racket[_v2].} - - @item{@racket[(disable-prefix _v2 ...)]: sets the @tech{current - prefix} to empty while outputting each @racket[_v2].} - - @item{@racket[(restore-prefix _v2 ...)]: rewinds the - @tech{current prefix} by one enclosing adjustments while - outputting each @racket[_v2].} - - @item{@racket[flush]: outputs the @tech{current indentation} and @tech{current prefix}.} - - @item{@racket[(with-writer _writer _v2 ...)]: sets the @tech{current writer} - to @racket[_writer] with outputting each @racket[_v2].} - - @item{@tech/r{promise}: outputs the result of @racket[(force v)]} - - @item{@tech/r{box}: outputs the result of @racket[(unbox v)]} - - @item{procedure of 0 arguments: outputs the result of @racket[(v)]} - -] - -Any other kind of @racket[v] triggers an exception.} - - -@defproc[(block [v outputable/c] ...) outputable/c]{ - -Produces a value that outputs each @racket[v] in @tech{block mode}.} - -@defproc[(splice [v outputable/c] ...) outputable/c]{ - -Produces a value that outputs each @racket[v] in @tech{splice mode}.} - -@deftogether[( -@defproc[(disable-prefix [v outputable/c] ...) outputable/c] -@defproc[(restore-prefix [v outputable/c] ...) outputable/c] -@defproc[(add-prefix [pfx (or/c string? exact-nonnegative-integer?)] [v outputable/c] ...) outputable/c] -@defproc[(set-prefix [pfx (or/c string? exact-nonnegative-integer?)] [v outputable/c] ...) outputable/c] -)]{ - -Produces a value that outputs with an adjusted @tech{current prefix}. -An integer as a prefix is equivalent to a string with as many space -characters.} - - -@defthing[flush void?]{ - -A value that outputs as the @tech{current indentation} plus @tech{current prefix}.} - - -@defproc[(with-writer [writer (or/c (->* (string? output-port?) - (exact-nonnegative-integer?) - any/c) - #f)] - [v outputable/c] ...) - outputable/c]{ - -Produces a value that outputs with an adjusted @tech{current writer}, -where @racket[#f] indicates @racket[write-string].} - - -@defproc[(add-newlines [items list?] [#:sep sep an/y "\n"]) list?]{ - -Like @racket[add-between], but first removes @racket[#f] and @|void-const| -elements of @racket[items].} - - -@defproc[(split-lines [items list?]) (listof list?)]{ - -Converts @racket[items] to a list of lists, where consecutive -non-@racket["\n"] values are kept together in a nested list, and -@racket["\n"] values are dropped.} - - -@defform[(include/text maybe-char path-spec) - #:grammar ([maybe-char code:blank - (code:line #:command-char command-char)])]{ - -Like @rkt-include from @racketmodname[racket/include], but reads the -file at @racket[path-spec] in the same way as for -@racketmodname[scribble/text]. If @racket[command-char] is supplied, -then it replaces @litchar["@"] as the escape character. - -The @racketmodname[scribble/text] language via @hash-lang[] provides -@racket[include/text] as @racket[include].} - -@defform[(begin/text form ...)]{ - -Like @racket[begin], but the results of expression @racket[forms] are -collected into a list that is returned as the result of the -@racket[begin/list] form. - -The @racketmodname[scribble/text] language via @hash-lang[] provides -@racket[begin/text] as @racket[begin].} diff --git a/scribble-doc/scribblings/scribble/utils.rkt b/scribble-doc/scribblings/scribble/utils.rkt deleted file mode 100644 index ba37ecf6..00000000 --- a/scribble-doc/scribblings/scribble/utils.rkt +++ /dev/null @@ -1,229 +0,0 @@ -#lang racket/base - -(require scribble/core - scribble/html-properties - scribble/manual - (prefix-in racket: scribble/racket) - (prefix-in scribble: scribble/reader)) - -(define-syntax bounce-for-label - (syntax-rules (all-except) - [(_ (all-except mod (id ...) (id2 ...))) - (begin (require (for-label (except-in mod id ...))) - (provide (for-label (except-out (all-from-out mod) id2 ...))))] - [(_ mod) (begin (require (for-label mod)) - (provide (for-label (all-from-out mod))))] - [(_ mod ...) (begin (bounce-for-label mod) ...)])) - -(bounce-for-label (all-except racket (abstract link) ()) - scribble/core - scribble/base-render - scribble/decode - scribble/manual - scribble/racket - scribble/html-properties - scribble/latex-properties - scribble/bnf) - -(provide scribble-examples litchar/lines doc-render-examples) - -(define (as-flow e) - (if (block? e) e (make-paragraph plain (list e)))) - -(define (litchar/lines . strs) - (let ([strs (regexp-split #rx"\n" (apply string-append strs))]) - (if (= 1 (length strs)) - (litchar (car strs)) - (make-table - plain - (map (lambda (s) ; the nbsp is needed for IE - (list (as-flow (if (string=? s "") 'nbsp (litchar s))))) - strs))))) - -(define spacer (hspace 2)) - -(define ((norm-spacing base) p) - (cond [(and (syntax->list p) (not (null? (syntax-e p)))) - (let loop ([e (syntax->list p)] - [line (syntax-line (car (syntax-e p)))] - [pos base] - [second #f] - [accum null]) - (if (null? e) - (datum->syntax - p (reverse accum) - (list (syntax-source p) (syntax-line p) base (add1 base) - (- pos base)) - p) - (let* ([v ((norm-spacing (if (= line (syntax-line (car e))) - pos - (or second pos))) - (car e))] - [next-pos (+ (syntax-column v) (syntax-span v) 1)]) - (loop (cdr e) - (syntax-line v) - next-pos - (or second next-pos) - (cons v accum)))))] - [else (datum->syntax - p (syntax-e p) - (list (syntax-source p) (syntax-line p) base (add1 base) 1) - p)])) - -(define (scribble-examples . lines) - (define reads-as (make-paragraph plain (list spacer "reads as" spacer))) - (let* ([lines (apply string-append lines)] - [p (open-input-string lines)]) - (port-count-lines! p) - (let loop ([r '()] [newlines? #f]) - (regexp-match? #px#"^[[:space:]]*" p) - (let* ([p1 (file-position p)] - [stx (scribble:read-syntax #f p)] - [p2 (file-position p)]) - (if (not (eof-object? stx)) - (let ([str (substring lines p1 p2)]) - (loop (cons (list str stx) r) - (or newlines? (regexp-match? #rx#"\n" str)))) - (let* ([r (reverse r)] - [r (if newlines? - (cdr (apply append (map (lambda (x) (list #f x)) r))) - r)]) - (make-table - plain - (map (lambda (x) - (let ([@expr (if x (litchar/lines (car x)) "")] - [sexpr (if x - (racket:to-paragraph - ((norm-spacing 0) (cadr x))) - "")] - [reads-as (if x reads-as "")]) - (map as-flow (list spacer @expr reads-as sexpr)))) - r)))))))) - -;; stuff for the scribble/text examples - -(require racket/list (for-syntax racket/base racket/list)) - -(define max-textsample-width 45) - -(define (textsample-verbatim-boxes line in-text out-text more) - (define (split str) (regexp-split #rx"\n" str)) - (define strs1 (split in-text)) - (define strs2 (split out-text)) - (define strsm (map (compose split cdr) more)) - (define (str->elts str) - (let ([spaces (regexp-match-positions #rx"(?:^| ) +" str)]) - (if spaces - (list* (str->elts (substring str 0 (caar spaces))) - (smaller (hspace (- (cdar spaces) (caar spaces)))) - (str->elts (substring str (cdar spaces)))) - (list (smaller (make-element 'tt str)))))) - (define (make-line str) - (list (as-flow (if (equal? str "") - (smaller (hspace 1)) - (str->elts str))))) - (define (make-box strs [file #f]) - (nested #:style 'code-inset - (let ([t (make-table plain (map make-line strs))]) - (if file - (filebox file t) - t)))) - (define filenames (map car more)) - (define indent (let ([d (- max-textsample-width - (for*/fold ([m 0]) - ([s (in-list (cons strs1 strsm))] - [s (in-list s)]) - (max m (string-length s))))]) - (if (negative? d) - (error 'textsample-verbatim-boxes - "left box too wide for sample at line ~s" line) - (make-element 'tt (list (hspace d)))))) - ;; Note: the font-size property is reset for every table, so we need it - ;; everywhere there's text, and they don't accumulate for nested tables - (values - (make-table - (make-style #f - (list (make-table-columns (list (make-style #f '(left top)))))) - (cons (list (as-flow (make-box strs1))) - (map (lambda (file strs) - (list (as-flow (make-box strs file)))) - filenames strsm))) - (make-box strs2))) - -(define (textsample line in-text out-text more) - (define-values (box1 box2) - (textsample-verbatim-boxes line in-text out-text more)) - (make-table - (make-style #f (list (make-table-columns (list (make-style #f '(left vcenter)) - (make-style "Short" '(left vcenter)) - (make-style #f '(left vcenter)))))) - (list (map as-flow (list box1 (make-paragraph plain '(nbsp rarr nbsp)) box2))))) - -(define-for-syntax tests-ids #f) - -(provide initialize-tests) -(define-syntax (initialize-tests stx) - (set! tests-ids (map (lambda (x) (datum->syntax stx x stx)) - '(tests add-to-tests))) - (with-syntax ([(tests add-to-tests) tests-ids]) - #'(begin (provide tests) - (define-values (tests add-to-tests) - (let ([l '()]) - (values (lambda () (reverse l)) - (lambda (x) (set! l (cons x l))))))))) - -(provide example) -(define-syntax (example stx) - (define sep-rx #px"^---[*]{3}---(?: +(.*))?$") - (define file-rx #rx"^[a-z0-9_.+-]+$") - (define-values (body hidden?) - (syntax-case stx () - [(_ #:hidden x ...) (values #'(x ...) #t)] - [(_ x ...) (values #'(x ...) #f)])) - (let loop ([xs body] [text '(#f)] [texts '()]) - (syntax-case xs () - [("\n" sep "\n" . xs) - (and (string? (syntax-e #'sep)) (regexp-match? sep-rx (syntax-e #'sep))) - (let ([m (cond [(regexp-match sep-rx (syntax-e #'sep)) => cadr] - [else #f])]) - (if (and m (not (regexp-match? file-rx m))) - (raise-syntax-error #f "bad filename specified" stx #'sep) - (loop #'xs - (list (and m (datum->syntax #'sep m #'sep #'sep))) - (cons (reverse text) texts))))] - [(x . xs) (loop #'xs (cons #'x text) texts)] - [() (let ([texts (reverse (cons (reverse text) texts))] - [line (syntax-line stx)]) - (define-values (files i/o) (partition car texts)) - (unless ((length i/o) . = . 2) - (raise-syntax-error - 'example "need at least an input and an output block" stx)) - (with-syntax ([line line] - [((in ...) (out ...)) (map cdr i/o)] - [((file text ...) ...) files] - [add-to-tests (cadr tests-ids)]) - (quasisyntax/loc stx - (let* ([in-text (string-append in ...)] - [out-text (string-append out ...)] - [more (list (cons file (string-append text ...)) ...)]) - (add-to-tests (list line in-text out-text more)) - #,(if hidden? #'"" - #'(textsample line in-text out-text more))))))] - [_ (raise-syntax-error #f "no separator found in example text")]))) - -(provide ltx ltxe ltxd) -(define (ltx s) (tt "\\" s)) ; command -(define (ltxe s) (tt s)) ; enviornment -(define (ltxd n s) - (make-element #f (cons (index (list s) (ltx s)) - (for/list ([i (in-range n)]) (tt "{}"))))) - -;; Utility to render examples of scribble documentation forms -;; Note: it would be nice if this abstracted over the codeblock -;; that usually comes along with this too, but that's hard -;; because there's a read-time distinction between [...] -;; and |{...}|. -(define-syntax-rule (doc-render-examples e ...) - (nested "Renders like:\n" - (nested #:style 'inset (nested #:style 'inset e ...)))) - diff --git a/scribble-doc/scribblings/scribble/xref.scrbl b/scribble-doc/scribblings/scribble/xref.scrbl deleted file mode 100644 index 06a55d18..00000000 --- a/scribble-doc/scribblings/scribble/xref.scrbl +++ /dev/null @@ -1,236 +0,0 @@ -#lang scribble/doc -@(require scribble/manual "utils.rkt" - (for-label scribble/xref - scribble/base-render - scribble/html-render - setup/xref)) - -@title[#:tag "xref"]{Cross-Reference Utilities} - -@defmodule[scribble/xref]{The @racketmodname[scribble/xref] library -provides utilities for querying cross-reference information that was -collected from a document build.} - -@; ------------------------------------------------------------------------ - -@defproc[(xref? [v any/c]) boolean?]{ - -Returns @racket[#t] if @racket[v] is a cross-reference record created -by @racket[load-xref], @racket[#f] otherwise.} - - -@defproc[(load-xref [sources (listof (-> (or/c any/c (-> list?))))] - [#:demand-source demand-source - (tag? -> (or/c (-> any/c) #f)) - (lambda (_tag) #f)] - [#:render% using-render% (implementation?/c render<%>) - (render-mixin render%)] - [#:root root-path (or/c path-string? false/c) #f] - [#:doc-id doc-id-str (or/c path-string? false/c) #f]) - xref?]{ - -Creates a cross-reference record given a list of functions, -@racket[sources]. - -Let @racket[_source] be a function in @racket[sources]. The -@racket[_source] function normally returns serialized information, -@racket[_info], which was formerly obtained from @xmethod[render<%> -serialize-info]. The result of @racket[_source] can optionally be -another function, which is in turn responsible for returning a list of -@racket[_info]s. Finally, each @racket[_info] can be either serialized -information, a @racket[#f] to be ignored, or a value produced by -@racket[make-data+root] or @racket[make-data+root+doc-id], from which -@racket[_data] part is used as serialized information, the -@racket[_root] part overrides @racket[root-path] for deserialization, -and the @racket[_doc-id] part (if any) overrides -@racket[doc-id-string] to identify the source document. - -The @racket[demand-source] function can effectively add a new source -to @racket[sources] in response to a search for information on the -given tag. The @racket[demand-source] function returns @racket[#f] -to indicate that no new sources satisfy the given tag. - -Since the format of serialized information is specific to a rendering -class, the optional @racket[using-render%] argument accepts the -relevant class. It defaults to HTML rendering, partly because -HTML-format information is usable by other formats (including -Latex/PDF and text). - -If @racket[root-path] is not @racket[#f], then file paths that are -serialized as relative to an instantiation-supplied @racket[root-path] -are deserialized as relative instead to the given @racket[root-path], -but a @racket[make-data+root] result for any @racket[_info] supplies -an alternate path for deserialization of the @racket[_info]'s -@racket[_data]. - -If @racket[doc-id-str] is not @racket[#f], it identifies each -cross-reference entry as originating from @racket[doc-id-str]. This -identification is used when a rendering link to the cross-reference -entry as an external query; see the @racket[set-external-tag-path] -method of @racket[render-mixin]. - -Use @racket[load-collections-xref] from @racketmodname[setup/xref] to -get all cross-reference information for installed documentation. - -@history[#:changed "1.1" @elem{Added the @racket[#:doc-id] argument.}]} - - -@defproc[(xref-binding->definition-tag [xref xref?] - [binding (or/c identifier? - (list/c (or/c module-path? - module-path-index?) - symbol?) - (listof module-path-index? - symbol? - module-path-index? - symbol? - (one-of/c 0 1) - (or/c exact-integer? false/c) - (or/c exact-integer? false/c)))] - [mode (or/c exact-integer? false/c)]) - (or/c tag? false/c)]{ - -Locates a tag in @racket[xref] that documents a module export. The -binding is specified in one of several ways, as described below; all -possibilities encode an exporting module and a symbolic name. The name -must be exported from the specified module. Documentation is found -either for the specified module or, if the exported name is -re-exported from other other module, for the other module -(transitively). - -The @racket[mode] argument specifies the relevant phase level for the -binding. The @racket[binding] is specified in one of four ways: - -@itemize[ - - @item{If @racket[binding] is an identifier, then - @racket[identifier-binding] is used with @racket[mode] to - determine the binding.} - - @item{If @racket[binding] is a two-element list, then the first - element provides the exporting module and the second the - exported name. The @racket[mode] argument is effectively - ignored.} - - @item{If @racket[binding] is a seven-element list, then it corresponds - to a result from @racket[identifier-binding] using - @racket[mode].} - - @item{If @racket[binding] is a five-element list, then the first - element is as for the two-element-list case, and the remain - elements are as in the last four elements of the seven-element - case.} - -] - -If a documentation point exists in @racket[xref], a tag is returned, -which might be used with @racket[xref-tag->path+anchor] or embedded in -a document rendered via @racket[xref-render]. If no definition point -is found in @racket[xref], the result is @racket[#f].} - - -@defproc[(xref-tag->path+anchor [xref xref?] - [tag tag?] - [#:external-root-url root-url (or/c string? #f) #f] - [#:render% using-render% (implementation?/c render<%>) - (render-mixin render%)]) - (values (or/c false/c path?) - (or/c false/c string?))]{ - -Returns a path and anchor string designated by the key @racket[tag] -according the cross-reference @racket[xref]. The first result is -@racket[#f] if no mapping is found for the given tag. The second -result is @racket[#f] if the first result is @racket[#f], and it can -also be @racket[#f] if the tag refers to a page rather than a specific -point in a page. - -If @racket[root-url] is provided, then references to documentation in -the main installation are redirected to the given URL. - -The optional @racket[using-render%] argument is as for -@racket[load-xref].} - - -@defproc[(xref-tag->index-entry [xref xref?] [tag tag?]) - (or/c false/c entry?)]{ - -Extract an @racket[entry] structure that provides addition information -about the definition (of any) referenced by @racket[tag]. This -function can be composed with @racket[xref-binding->definition-tag] to -obtain information about a binding, such as the library that exports -the binding and its original name.} - - -@defproc[(xref-render [xref xref?] - [doc part?] - [dest (or/c path-string? false/c)] - [#:render% using-render% (implemenation?/c render<%>) - (render-mixin render%)] - [#:refer-to-existing-files? use-existing? any/c (not dest)]) - (or/c void? any/c)]{ - -Renders @racket[doc] using the cross-reference info in @racket[xref] -to the destination @racket[dest]. For example, @racket[doc] might be a -generated document of search results using link tags described in -@racket[xref]. - -If @racket[dest] is @racket[#f], no file is written, and the result is -an X-expression for the rendered page. Otherwise, the file -@racket[dest] is written and the result is @|void-const|. - -The optional @racket[using-render%] argument is as for -@racket[load-xref]. It determines the kind of output that is -generated. - -If @racket[use-existing?] is true, then files referenced during -rendering (such as image files) are referenced from their existing -locations, instead of copying to the directory of @racket[dest].} - - -@defproc[(xref-transfer-info [renderer (is-a?/c render<%>)] - [ci collect-info?] - [xref xref?]) - void?]{ - -Transfers cross-reference information to @racket[ci], which is the -initially collected information from @racket[renderer].} - - -@defproc[(xref-index [xref xref?]) (listof entry?)]{ - -Converts indexing information @racket[xref] into a list of -@racket[entry] structures.} - - -@defstruct[entry ([words (and/c (listof string?) cons?)] - [content list?] - [tag tag?] - [desc any/c])]{ - -Represents a single entry in a Scribble document index. - -The @racket[words] list corresponds to -@racket[index-element-plain-seq]. The @racket[content] list -corresponds to @racket[index-element-entry-seq]. The @racket[desc] -value corresponds to @racket[index-element-desc]. The @racket[tag] is -the destination for the index link into the main document.} - - -@deftogether[( -@defproc[(data+root? [v any/c]) boolean?] -@defproc[(make-data+root [data any/c] [root (or/c #f path-string?)]) data+root?] -)]{ - -A value constructed by @racket[make-data+root] can be returned by a -source procedure for @racket[load-xref] to specify a path used for -deserialization.} - -@deftogether[( -@defproc[(data+root+doc-id? [v any/c]) boolean?] -@defproc[(make-data+root+doc-id [data any/c] [root (or/c #f path-string?)] [doc-id string?]) data+root+doc-id?] -)]{ - -Extends @racket[make-data+root+doc-id] to support an -document-identifying string (see @racket[load-xref]). - -@history[#:added "1.1"]} diff --git a/scribble-doc/scriblib/scribblings/autobib.scrbl b/scribble-doc/scriblib/scribblings/autobib.scrbl deleted file mode 100644 index 3b6cae4e..00000000 --- a/scribble-doc/scriblib/scribblings/autobib.scrbl +++ /dev/null @@ -1,244 +0,0 @@ -#lang scribble/manual -@(require (for-label scribble/struct - scriblib/autobib - scheme/base - scheme/contract)) - -@title[#:tag "autobib"]{Bibliographies} - -@defmodule[scriblib/autobib] - -This library provides support for bibliography management in a Scribble -document. The @racket[define-cite] form is used to bind procedures -that create in-line citations and generate the bibilography in the -document. - -Individual bibliography entries are created with the @racket[make-bib] -function. See below for an example. - -@codeblock|{ - #lang scribble/base - - @(require scriblib/autobib) - - @(define-cite ~cite citet generate-bibliography) - - @(define plt-tr1 - (make-bib - #:title "Reference: Racket" - #:author (authors "Matthew Flatt" "PLT") - #:date "2010" - #:location (techrpt-location #:institution "PLT Inc." - #:number "PLT-TR-2010-1") - #:url "http://racket-lang.org/tr1/")) - - Racket is fun@~cite[plt-tr1]. - - @(generate-bibliography) -}| - -For citations that reference a page number or section, the @racket[in-bib] -function can be used. For example, the following snippet: - -@codeblock[#:keep-lang-line? #f]|{ - #lang scribble/base - Racket has a contract library.@~cite[(in-bib plt-tr1 ", §8")] -}| - -includes a citation to section 8 of the Racket reference. - -@defform/subs[(define-cite ~cite-id citet-id generate-bibliography-id - option ...) - ([option (code:line #:style style-expr) - (code:line #:disambiguate disambiguator-expr) - (code:line #:spaces spaces-expr) - (code:line #:render-date-bib render-date-expr) - (code:line #:render-date-cite render-date-expr) - (code:line #:date exact-nonnegative-integer? element?))] - [render-date-expr (or/c #f (-> date? element?))] - [date-compare-expr (or/c #f (-> date? date? boolean?))])]{ - -Binds @racket[~cite-id], @racket[citet-id], and -@racket[generate-bibliography-id], which share state to accumulate and -render citations. - -The function bound to @racket[~cite-id] produces a citation referring -to one or more bibliography entries with a preceding non-breaking -space, by default sorting the entries to match the bibliography order. -It has the contract - -@racketblock[ -(->* (bib?) (#:sort? any/c) #:rest (listof bib?) element?) -] - -The function bound to @racket[citet-id] generates an element suitable -for use as a noun---referring to a document or its author---for one -or more bibliography entries which have the same authors. It has the contract - -@racketblock[ -(->* (bib?) () #:rest (listof bib?) element?) -] - -The function bound to @racket[generate-bibliography-id] generates the -section for the bibliography. It has the contract - -@racketblock[ -(->* () (#:tag string? #:sec-title string?) part?) -] - -The default value for the @racket[#:tag] argument is @racket["doc-bibliography"] -and for @racket[#:sec-title] is @racket["Bibliography"]. - -The optional @racket[spaces-expr] determines the number of blank lines that appear -between citations. The default number of lines is 1. - -The optional @racket[style-expr] determines the way that citations and -the bibliography are rendered.@margin-note*{Programmer-defined styles -may be supported in the future.} Currently, two built-in style are -provided, and @racket[author+date-style] is the default. - -For @racket[author+date-style], -if two citations' references would render the same (as judged by equal -authors and dates that are considered the same) but are different, the -optionally provided function from @racket[disambiguator-expr] is used -to add an extra element after the date; the default disambiguator adds -@litchar{a}, @litchar{b}, @etc until @litchar{z}, and anything more -ambiguous raises an exception. Date comparison is controlled by -@racket[date-compare-expr]s. Dates in citations and dates in the -bibliography may be rendered differently, as specified by the -optionally given @racket[render-date-expr] functions.} - -@deftogether[( -@defthing[author+date-style any/c] -@defthing[number-style any/c] -)]{ - -Styles for use with @racket[define-cite].} - - -@defproc[(bib? [v any/c]) boolean?]{ - -Returns @racket[#t] if @racket[v] is a value produced by -@racket[make-bib] or @racket[in-bib], @racket[#f] otherwise.} - - -@defproc[(make-bib [#:title title any/c] - [#:author author any/c #f] - [#:is-book? is-book? any/c #f] - [#:location location any/c #f] - [#:date date (or/c #f date? exact-nonnegative-integer? string?) #f] - [#:url url string? #f] - [#:note note any/c #f]) - bib?]{ - -Produces a value that represents a document to cite. Except for -@racket[is-book?] and @racket[url], the arguments are used as -content, except that @racket[#f] means that the information is not -supplied. Functions like @racket[proceedings-location], -@racket[author-name], and @racket[authors] help produce elements in a -standard format. - -Dates are internally represented as @racket[date] values, so a @racket[date] -may be given, or a number or string that represent the year. - -An element produced by a function like @racket[author-name] tracks -first, last names, and name suffixes separately, so that names can be -ordered and rendered correctly. When a string is provided as an author -name, the last non-empty sequence of alphabetic characters or -@litchar["-"] after a space is treated as the author name, and the -rest is treated as the first name.} - -@defproc[(in-bib [orig bib?] [where string?]) bib?]{ - -Extends a bib value so that the rendered citation is suffixed with -@racket[where], which might be a page or chapter number.} - -@defproc[(proceedings-location [location any/c] - [#:pages pages (or (list/c any/c any/c) #f) #f] - [#:series series any/c #f] - [#:volume volume any/c #f]) - element?]{ - -Combines elements to generate an element that is suitable for -describing a paper's location within a conference or workshop -proceedings.} - -@defproc[(journal-location [title any/c] - [#:pages pages (or (list/c any/c any/c) #f) #f] - [#:number number any/c #f] - [#:volume volume any/c #f]) - element?]{ - -Combines elements to generate an element that is suitable for -describing a paper's location within a journal.} - - -@defproc[(book-location [#:edition edition any/c #f] - [#:publisher publisher any/c #f]) - element?]{ - -Combines elements to generate an element that is suitable for -describing a book's location.} - -@defproc[(techrpt-location [#:institution institution edition any/c] - [#:number number any/c]) - element?]{ - -Combines elements to generate an element that is suitable for -describing a technical report's location.} - -@defproc[(dissertation-location [#:institution institution edition any/c] - [#:degree degree any/c "PhD"]) - element?]{ - -Combines elements to generate an element that is suitable for -describing a dissertation.} - - -@defproc[(author-name [first any/c] - [last any/c] - [#:suffix suffix any/c #f]) - element?]{ - -Combines elements to generate an element that is suitable for -describing an author's name, especially where the last name is not -merely a sequence of ASCII alphabet letters or where the name has a -suffix (such as ``Jr.'').} - -@defproc[(authors [name content?] [names content?] ...) element?]{ - -Combines multiple author elements into one, so that it is rendered and -alphabetized appropriately. Any of @racket[name] or @racket[names] -that are strings are -parsed in the same way as by @racket[make-bib].} - -@defproc[(org-author-name [name any/c]) element?]{ - -Converts an element for an organization name to one suitable for use -as a bib-value author.} - -@defproc[(other-authors) element?]{ - -Generates an element that is suitable for use as a ``others'' author. -When combined with another author element via @racket[authors], the -one created by @racket[other-authors] renders as ``et al.''} - -@defproc[(editor [name name/c]) element?]{ - -Takes an author-name element and create one that represents the editor -of a collection. If a @racket[name] is a string, it is parsed in the -same way as by @racket[make-bib].} - -@defparam[abbreviate-given-names abbreviate? any/c]{ - Shortens given names in calls to @racket[author] and @racket[make-bib] - to just the first initial when the parameter value is not @racket[#f]. - Otherwise, does not change the author names. - - Defaults to @racket[#f]. - - @history[#:added "1.5"] -} diff --git a/scribble-doc/scriblib/scribblings/bibtex.scrbl b/scribble-doc/scriblib/scribblings/bibtex.scrbl deleted file mode 100644 index 80464e54..00000000 --- a/scribble-doc/scriblib/scribblings/bibtex.scrbl +++ /dev/null @@ -1,54 +0,0 @@ -#lang scribble/manual -@(require (for-label scribble/struct - scriblib/bibtex - scriblib/autobib - racket/base - racket/contract)) - -@title[#:tag "bibtex"]{BibTeX Bibliographies} - -@defmodule[scriblib/bibtex] - -@defform[(define-bibtex-cite bib-pth ~cite-id citet-id generate-bibliography-id - option ...)]{ - -Expands into: -@racketblock[ -(begin - (define-cite autobib-cite autobib-citet generate-bibliography-id - option ...) - (define-bibtex-cite* bib-pth - autobib-cite autobib-citet - ~cite-id citet-id))] -} - -@defform[(define-bibtex-cite* bib-pth autobib-cite autobib-citet - ~cite-id citet-id)]{ - -Parses @racket[bib-pth] as a BibTeX database, and augments -@racket[autobib-cite] and @racket[autobib-citet] into -@racket[~cite-id] and @racket[citet-id] functions so that rather than -accepting @racket[bib?] structures, they accept citation key strings. - -Each string is broken along spaces into citations keys that are looked up in the BibTeX database and turned into @racket[bib?] structures. - -The only BibTeX entries that are supported are: @litchar{misc}, -@litchar{book}, @litchar{article}, @litchar{inproceedings}, -@litchar{webpage}, @litchar{mastersthesis}, and @litchar{techreport}. - -} - -@defstruct*[bibdb ([raw (hash/c string? (hash/c string? string?))] - [bibs (hash/c string? bib?)])]{ - Represents a BibTeX database. The @racket[_raw] hash table maps the labels in the file to hash tables of the attributes and their values. The @racket[_bibs] hash table maps the same labels to Scribble data-structures representing the same information. - } - -@defproc[(path->bibdb [path path-string?]) - bibdb?]{ - Parses a path into a BibTeX database. - } - -@defproc[(bibtex-parse [ip input-port?]) - bibdb?]{ - Parses an input port into a BibTeX database. - } diff --git a/scribble-doc/scriblib/scribblings/figure.scrbl b/scribble-doc/scriblib/scribblings/figure.scrbl deleted file mode 100644 index dc7a84be..00000000 --- a/scribble-doc/scriblib/scribblings/figure.scrbl +++ /dev/null @@ -1,129 +0,0 @@ -#lang scribble/manual -@(require (for-label scribble/core - scribble/decode - scriblib/figure - scheme/base - scheme/contract)) - -@(define-syntax-rule (sn s) @racket[s]) - -@title[#:tag "figure"]{Figures} - -@defmodule[scriblib/figure] - -@deftogether[( -@defproc[(figure [tag string?] [caption content?] - [p pre-flow?] ... - [#:style style style? center-figure-style] - [#:continue? continue? any/c #f]) - block?] -@defproc[(figure* [tag string?] [caption content?] - [p pre-flow?] ... - [#:style style style? center-figure-style] - [#:continue? continue? any/c #f]) - block?] -@defproc[(figure** [tag string?] [caption content?] - [p pre-flow?] ... - [#:style style style? center-figure-style] - [#:continue? continue? any/c #f]) - block?] -@defproc[(figure-here [tag string?] [caption content?] - [pre-flow pre-flow?] ... - [#:style style style? center-figure-style] - [#:continue? continue? any/c #f]) - block?] -)]{ - -Creates a figure. The given @racket[tag] is for use with -@racket[figure-ref] or @racket[Figure-ref]. The @racket[caption] is an -element. The @racket[pre-flow] is decoded as a flow. - -For HTML output, the @racket[figure] and @racket[figure*] functions -are the same, while @racket[figure**] allows the content to be wider -than the document body. For two-column Latex output, @racket[figure*] -and @racket[figure**] generate a figure that spans columns. - -For Latex output, @racket[figure-here] generates a figure to be included at -the position in the output text where the @racket[figure-here] occurs -in the source text. For HTML output, all @racket[figure] variants -place the figure where the use appears in the source text. - -By default, @racket[style] is set so that the content of the figure is -centered. Use @racket[left-figure-style], @racket[center-figure-style], -or @racket[right-figure-style] to specify the alignment. - -If @racket[continue?] is a true value, then the figure counter is not -incremented.} - -@deftogether[( -@defthing[left-figure-style style?] -@defthing[center-figure-style style?] -@defthing[right-figure-style style?] -@defthing[left style?] -)]{ -Implements figure alignments. - -The @racket[left] binding is a synonym for @racket[left-figure-style], -provided for backward compatibility.} - - -@defproc[(figure-ref [tag string?] ...+) element?]{ - -Generates a reference to one or more figures, using a lowercase word ``figure''.} - - -@defproc[(Figure-ref [tag string?] ...+) element?]{ - -Generates a reference to one or more figures, capitalizing the word ``Figure''.} - - -@defproc[(Figure-target [tag string?] - [#:continue? continue? any/c #f]) - element?]{ - -Generates a new figure label. This function is normally not used -directly, since it is used by @racket[figure].} - - -@defproc[(suppress-floats) element?]{ - -Produces an empty element that renders in Latex as -@tt{\suppressfloats}, which discourages the placement of figures in -the column or page of the surrounding text.} - - -@section{Configuring Output} - -Output uses the following style names, which can be adjusted in an -overriding @filepath{.css} or @filepath{.tex} specification: - -@itemize[ - - @item{@sn{Figure}, @sn{FigureMulti}, @sn{FigureMultiWide}, or - @sn{HereFigure} --- used for the outer of three - @racket[nested-flow]s for a figure, depending on whether - @racket[figure], @racket[figure*], @racket[figure**], or - @racket[figure-here] is used to generate the figure.} - - @item{@sn{Leftfigure}, @sn{Centerfigure}, or @sn{Rightfigure} --- - used for the middle of three @racket[nested-flow]s for a - figure, depending on the specified style.} - - @item{@sn{FigureInside} --- used for the inner of three - @racket[nested-flow]s for a figure.} - - @item{@sn{Legend} --- Wraps the caption for a figure.} - - @item{@sn{LegendContinued} --- Wraps the caption for a figure that - does not increment the figure counter.} - - @item{@sn{FigureTarget} --- Wraps the label anchor and text within a - figure's caption. For Latex output, the corresponding command - is given a second argument, which is just the generated label - (used with @tt{\label} in the command's first argument).} - - @item{@sn{FigureRef} --- Wraps a reference to a figure. For Latex - output, the corresponding command is given a second argument, - which is just the target label.} - -] diff --git a/scribble-doc/scriblib/scribblings/footnote.scrbl b/scribble-doc/scriblib/scribblings/footnote.scrbl deleted file mode 100644 index c8f3f57e..00000000 --- a/scribble-doc/scriblib/scribblings/footnote.scrbl +++ /dev/null @@ -1,33 +0,0 @@ -#lang scribble/manual -@(require (for-label scribble/struct - scriblib/footnote - scheme/base - scheme/contract)) - -@title[#:tag "footnotes"]{Footnotes} - -@defmodule[scriblib/footnote] - -@defproc[(note [pre-content pre-content?] ...) element?]{ - -Creates a margin note for HTML and a footnote for Latex/PDF output.} - -@defform[(define-footnote footnote-id footnote-part-id)]{ - -Binds @racket[footnote-id] to a form like @racket[note] that generates -a footnote in HTML output as well as Latex/PDF output. To trigger the -HTML output of the footnotes that are registered through -@racket[footnote-id], the function bound to @racket[footnote-part-id] -must be called at a position that corresponds the bottom of the HTML -page. (The generated section will not show a title or appear in a -table of contents; it will look like a footnote area.) - -Beware that any content passed to @racket[footnote-id] will occur -twice in at least an intermediate form of the document, and perhaps -also in the rendered form of the document. Consequently, the content -passed to @racket[footnote-id] should not bind link targets or include -other one-time declarations.} - - - - diff --git a/scribble-doc/scriblib/scribblings/gui-eval.scrbl b/scribble-doc/scriblib/scribblings/gui-eval.scrbl deleted file mode 100644 index 29dba0f6..00000000 --- a/scribble-doc/scriblib/scribblings/gui-eval.scrbl +++ /dev/null @@ -1,81 +0,0 @@ -#lang scribble/manual -@(require (for-label scribble/eval scriblib/gui-eval)) - -@title[#:tag "gui-eval"]{Examples Using the GUI Toolbox} - -@defmodule[scriblib/gui-eval]{The -@racketmodname[scriblib/gui-eval] library support example -evaluations that use @racketmodname[racket/gui] facilities (as opposed -to just @racketmodname[racket/draw]) to generate text and image results.} - -The trick is that @racketmodname[racket/gui] is not generally -available when rendering documentation, because it requires a GUI -context. Text and image output is rendered to an image file when the -@envvar{MREVAL} environment variable is set, so run the enclosing -document once with the environment varibale to generate the -images. Future runs (with the environment variable unset) use the -generated image. - -@deftogether[( -@defform*[((gui-interaction datum ...) - (gui-interaction - #:eval+opts the-eval get-predicate? get-render - get-get-width get-get-height - datum ...)) - ] -@defform*[((gui-interaction-eval datum ...) - (gui-interaction-eval - #:eval+opts the-eval get-predicate? get-render - get-get-width get-get-height - datum ... ))] -@defform*[((gui-interaction-eval-show datum ...) - (gui-interaction-eval-show - #:eval+opts the-eval get-predicate? get-render - get-get-width get-get-height - datum ...))] -@defform*[((gui-racketblock+eval datum ...) - (gui-racketblock+eval - #:eval+opts the-eval get-predicate? get-render - get-get-width get-get-height - datum ...))] -@defform*[((gui-racketmod+eval datum ...) - (gui-racketmod+eval - #:eval+opts the-eval get-predicate? get-render - get-get-width get-get-height - datum ...))] -@defform*[((gui-def+int datum ...) - (gui-def+int - #:eval+opts the-eval get-predicate? get-render - get-get-width get-get-height - datum ...))] -@defform*[((gui-defs+int datum ...) - (gui-defs+int - #:eval+opts the-eval get-predicate? get-render - get-get-width get-get-height - datum ...))] -)]{ - -The first option of each of the above is -like @racket[interaction], etc., but actually evaluating the forms -only when the @envvar{MREVAL} environment variable is set, and then in -an evaluator that is initialized with @racketmodname[racket/gui/base] -and @racketmodname[slideshow]. - -The second option of each allows you to specify your own evaluator via -the @racket[the-eval] argument and then to specify four thunks that -return functions for finding and rendering graphical objects: -@itemize[ - @item{@racket[get-predicate? : (-> (-> any/c boolean?))] - Determines if a value is a graphical object (and thus handled by the other operations)} - @item{@racket[get-render : (-> (-> any/c (is-a?/c dc<%>) number? number? void?))] - Draws a graphical object (only called if the predicate returned @racket[#t]; the first - argument will be the value for which the predicate holds).} - @item{@racket[get-get-width : (-> (-> any/c number?))] - Gets the width of a graphical object (only called if the predicate returned @racket[#t]; the first - argument will be the value for which the predicate holds).} - @item{@racket[get-get-height : (-> (-> any/c number?))] - Gets the height of a graphical object (only called if the predicate returned @racket[#t]; the first - argument will be the value for which the predicate holds).} - ] - -} diff --git a/scribble-doc/scriblib/scribblings/info.rkt b/scribble-doc/scriblib/scribblings/info.rkt deleted file mode 100644 index 1d0ce0c7..00000000 --- a/scribble-doc/scriblib/scribblings/info.rkt +++ /dev/null @@ -1,3 +0,0 @@ -#lang info - -(define scribblings '(("scriblib.scrbl" (multi-page) ("Scribble Libraries")))) diff --git a/scribble-doc/scriblib/scribblings/render-cond.scrbl b/scribble-doc/scriblib/scribblings/render-cond.scrbl deleted file mode 100644 index 94b59875..00000000 --- a/scribble-doc/scriblib/scribblings/render-cond.scrbl +++ /dev/null @@ -1,63 +0,0 @@ -#lang scribble/manual -@(require (for-label scribble/core - racket/base - scriblib/render-cond)) - -@(define scribble-doc '(lib "scribblings/scribble/scribble.scrbl")) - -@title[#:tag "render-cond"]{Conditional Content} - -@defmodule[scriblib/render-cond] - -As much as possible, Scribble documents should be independent of the -target format for rendering the document. To customize generated -output, use styles plus ``back end'' configurations for each target -format (see @secref[#:doc scribble-doc "config"] in -@other-manual[scribble-doc]). - -As a last resort, the @racket[cond-element] and @racket[cond-block] -forms support varying the document content depending on the target -format. More precisely, they generate parts of a document where -content is delayed until the @tech[#:doc scribble-doc]{traverse pass} -of document rendering. Format detection relies on the -@racket['scribble:current-render-mode] registration that is accessible -through a @racket[traverse-element] or @racket[traverse-block]. - -The syntax of @racket[cond-element] and @racket[cond-block] is based -on SRFI-0. - -@defform*/subs[#:literals (and or not else) - [(cond-element [feature-requirement body ...+]) - (cond-element [feature-requirement body ...+] [else body ...+])] - ([feature-requirement identifier - (not feature-requirement) - (and feature-requirement ...) - (or feature-requirement ...)])]{ - -Generates a @racket[traverse-element] whose replacement content is -produced by the @racket[body] of one of the first matching -@racket[cond-element] clause. - -A @racket[feature-requirement] can be any identifier; a useful -identifier is one whose symbol form can appear in a -@racket['scribble:current-render-mode] list. The identifier matches -when its symbol form is in the @racket['scribble:current-render-mode] -list. Typically, the identifier is @racket[html], @racket[latex], or -@racket[text] to indicate the corresponding rendering target. - -A @racket[(not feature-requirement)] test matches when -@racket[feature-requirement] does not match, and so on. An -@racket[else] clause always matches. If no @racket[else] clause is -present and no clause matches, then the @racket[exn:fail:contract] -exception is raised. Similarly, if the result of the selected -@racket[body] is not content according to @racket[content?], then the -@racket[exn:fail:contract] exception is raised.} - -@defform*[[(cond-block [feature-requirement body ...+]) - (cond-block [feature-requirement body ...+] [else body ...+])]]{ - -Like @racket[cond-element], but generates a @racket[traverse-block] -where the selected @racket[body] must produce a block according to -@racket[block?].} - - diff --git a/scribble-doc/scriblib/scribblings/scriblib.scrbl b/scribble-doc/scriblib/scribblings/scriblib.scrbl deleted file mode 100644 index 55b7fb5b..00000000 --- a/scribble-doc/scriblib/scribblings/scriblib.scrbl +++ /dev/null @@ -1,12 +0,0 @@ -#lang scribble/manual - -@title{Scriblib: Extra Scribble Libraries} - -@table-of-contents[] - -@include-section["gui-eval.scrbl"] -@include-section["figure.scrbl"] -@include-section["autobib.scrbl"] -@include-section["bibtex.scrbl"] -@include-section["footnote.scrbl"] -@include-section["render-cond.scrbl"] diff --git a/scribble-html-lib/LICENSE.txt b/scribble-html-lib/LICENSE.txt deleted file mode 100644 index f31116b7..00000000 --- a/scribble-html-lib/LICENSE.txt +++ /dev/null @@ -1,11 +0,0 @@ -scribble-text-lib -Copyright (c) 2010-2014 PLT Design Inc. - -This package is distributed under the GNU Lesser General Public -License (LGPL). This means that you can link this package into proprietary -applications, provided you follow the rules stated in the LGPL. You -can also modify this package; if you distribute a modified version, -you must distribute it under the terms of the LGPL, which in -particular means that you must release the source code for the -modified software. See http://www.gnu.org/copyleft/lesser.html -for more information. diff --git a/scribble-html-lib/info.rkt b/scribble-html-lib/info.rkt deleted file mode 100644 index 3fc25086..00000000 --- a/scribble-html-lib/info.rkt +++ /dev/null @@ -1,11 +0,0 @@ -#lang info - -(define collection 'multi) - -(define deps '("scheme-lib" - "base" "at-exp-lib" - "scribble-text-lib")) - -(define pkg-desc "Language for HTML with embedded Racket code") - -(define pkg-authors '(mflatt eli)) diff --git a/scribble-html-lib/scribble/html.rkt b/scribble-html-lib/scribble/html.rkt deleted file mode 100644 index 7d69f7c0..00000000 --- a/scribble-html-lib/scribble/html.rkt +++ /dev/null @@ -1,4 +0,0 @@ -#lang racket/base - -(require "html/main.rkt") -(provide (all-from-out "html/main.rkt")) diff --git a/scribble-html-lib/scribble/html/html.rkt b/scribble-html-lib/scribble/html/html.rkt deleted file mode 100644 index 5bc0a1dd..00000000 --- a/scribble-html-lib/scribble/html/html.rkt +++ /dev/null @@ -1,471 +0,0 @@ -#lang racket/base - -;; (X)HTML elements etc. - -(require "xml.rkt" scribble/text) - -;; ---------------------------------------------------------------------------- -;; Doctype line - -(provide doctype) -(define (doctype type) - (cond [(string? type) (literal "\n")] - [(eq? 'html type) (doctype "html")] - [(eq? 'xhtml type) - (list (literal "\n") - (doctype (string-append - "html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"" - " \"http://www.w3.org/TR/xhtml1/DTD/" - "xhtml1-strict.dtd\"")))] - [else (raise-type-error 'doctype - "string or known doctype symbol" type)])) - -;; ---------------------------------------------------------------------------- -;; Xhtml toplevel - -;; creation of xhtml files requires some extra stuff -(define xhtml-prefix (doctype 'xhtml)) -(provide xhtml) -(define (xhtml . body) - (list xhtml-prefix - (apply html 'xmlns: "http://www.w3.org/1999/xhtml" body) - "\n")) - -;; ---------------------------------------------------------------------------- -;; Elements - -;; For complete reference: http://www.w3.org/TR/html/dtds.html -;; (See also http://www.w3schools.com/tags/) - -;; The dtds, in increasing size: -;; http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd -;; http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd -;; http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd - -;; These are all entities, taked from the DTDs. The ones marked with "[*]" are -;; defined later, since they need a different definition. -(define/provide-elements/not-empty - ;; ========== Document Structure - html - ;; ========== Document Head - head - ;; The title element is not considered part of the flow of text. - ;; It should be displayed, for example as the page header or - ;; window title. Exactly one title is required per document. - title - ;; base ; document base URI, can be empty [*] - ;; meta ; generic metainformation, can be empty [*] - ;; link ; relationship values, can be empty [*] - style ; style info, which may include CDATA sections - script ; script statements, which may include CDATA sections - noscript ; alternate content container for non script-based rendering - ;; ========== Frames - frameset ; only one noframes element permitted per document - frame ; tiled window within frameset - iframe ; inline subwindow - noframes ; alternate content container for non frame-based rendering - ;; ========== Document Body - body - div ; generic language/style container - ;; ========== Paragraphs - p - ;; ========== Headings - h1 - h2 - h3 - h4 - h5 - h6 - ;; ========== Lists - ul ; Unordered list - ol ; Ordered (numbered) list - menu ; single column list (DEPRECATED) - dir ; multiple column list (DEPRECATED) - li ; list item - dl ; definition lists - dt for term, dd for its definition - dt - dd - ;; ========== Address - address ; information on author - ;; ========== Horizontal Rule - ;; hr ; horizontal rule can be empty [*] - ;; ========== Preformatted Text - pre - ;; ========== Block-like Quotes - blockquote - ;; ========== Text alignment - center ; center content - ;; ========== Inserted/Deleted Text - ins - del - ;; ========== The Anchor Element - a ; content is inline; except that anchors shouldn't be nested - ;; ========== Inline Elements - span ; generic language/style container - bdo ; I18N BiDi over-ride - ;; br ; forced line break, can be empty [*] - em ; emphasis - strong ; strong emphasis - dfn ; definitional - code ; program code - samp ; sample - kbd ; something user would type - var ; variable - cite ; citation - abbr ; abbreviation - acronym ; acronym - q ; inlined quote - sub ; subscript - sup ; superscript - tt ; fixed pitch font - i ; italic font - b ; bold font - big ; bigger font - small ; smaller font - u ; underline - s ; strike-through - strike ; strike-through - ;; basefont ; base font size, can be empty [*] - font ; local change to font - ;; ========== Object - object ; embeded objects - ;; param ; parameters for objects, can also specify as attrs, can be empty [*] - applet ; Java applet - ;; ========== Images - ;; To avoid accessibility problems for people who aren't - ;; able to see the image, you should provide a text - ;; description using the alt and longdesc attributes. - ;; In addition, avoid the use of server-side image maps. - ;; img ; can be empty [*] - ;; ========== Client-side image maps - ;; map ; collides with scheme, but not really useful - ;; area ; can be empty [*] - ;; ========== Forms - form ; forms shouldn't be nested - label ; text that belongs to a form control - ;; input ; form control, can be empty [*] - select ; option selector - optgroup ; option group - option ; selectable choice - textarea ; multi-line text field - fieldset ; group form fields - legend ; fieldset label (one per fieldset) - button ; push button - ;; isindex ; single-line text input control (DEPRECATED), can be empty [*] - ;; ========== Tables - table ; holds caption?, (col*|colgroup*), thead?, tfoot?, (tbody+|tr+) - caption ; caption text - thead ; header part, holds tr - tfoot ; footer part, holds tr - tbody ; body part, holds tr - colgroup ; column group, olds col - ;; col ; column info, has only attributes, can be empty [*] - tr ; holds th or td - th ; header cell - td ; table cell - ) - -;; [*] empty elements, these are listed with an `EMPTY' content in -;; http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd -(define/provide-elements/empty - base meta link hr br basefont param img area input isindex col) - -;; [*] elements with a cdata/comment body -(provide script/inline) -(define (script/inline . args) - (define-values [attrs body] (attributes+body args)) - (make-element - 'script attrs - `("\n" ,(set-prefix 0 (apply cdata #:line-prefix "//" body)) "\n"))) -(provide style/inline) -(define (style/inline . args) - (define-values [attrs body] (attributes+body args)) - (make-element 'style attrs `("\n" ,body "\n"))) - -;; ---------------------------------------------------------------------------- -;; Entities - -;; The three dtds that define the set of entities are at: -;; http://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent -;; http://www.w3.org/TR/xhtml1/DTD/xhtml-special.ent -;; http://www.w3.org/TR/xhtml1/DTD/xhtml-symbol.ent - -(define/provide-entities - nbsp ndash mdash bull middot sdot lsquo rsquo sbquo ldquo rdquo bdquo - lang rang dagger Dagger plusmn deg) - -#; ; the complete list -(define/provide-entities - ;; 24.2 Character entity references for ISO 8859-1 characters - nbsp ;00A0 no-break space = non-breaking space - iexcl ;00A1 inverted exclamation mark - cent ;00A2 cent sign - pound ;00A3 pound sign - curren ;00A4 currency sign - yen ;00A5 yen sign = yuan sign - brvbar ;00A6 broken bar = broken vertical bar - sect ;00A7 section sign - uml ;00A8 diaeresis = spacing diaeresis - copy ;00A9 copyright sign - ordf ;00AA feminine ordinal indicator - laquo ;00AB left-pointing double angle quotation mark = left pointing guillemet - not ;00AC not sign - shy ;00AD soft hyphen = discretionary hyphen - reg ;00AE registered sign = registered trade mark sign - macr ;00AF macron = spacing macron = overline = APL overbar - deg ;00B0 degree sign - plusmn ;00B1 plus-minus sign = plus-or-minus sign - sup2 ;00B2 superscript two = superscript digit two = squared - sup3 ;00B3 superscript three = superscript digit three = cubed - acute ;00B4 acute accent = spacing acute - micro ;00B5 micro sign - para ;00B6 pilcrow sign = paragraph sign - middot ;00B7 middle dot = Georgian comma = Greek middle dot - cedil ;00B8 cedilla = spacing cedilla - sup1 ;00B9 superscript one = superscript digit one - ordm ;00BA masculine ordinal indicator - raquo ;00BB right-pointing double angle quotation mark = right pointing guillemet - frac14 ;00BC vulgar fraction one quarter = fraction one quarter - frac12 ;00BD vulgar fraction one half = fraction one half - frac34 ;00BE vulgar fraction three quarters = fraction three quarters - iquest ;00BF inverted question mark = turned question mark - Agrave ;00C0 latin capital letter A with grave = latin capital letter A grave - Aacute ;00C1 latin capital letter A with acute - Acirc ;00C2 latin capital letter A with circumflex - Atilde ;00C3 latin capital letter A with tilde - Auml ;00C4 latin capital letter A with diaeresis - Aring ;00C5 latin capital letter A with ring above = latin capital letter A ring - AElig ;00C6 latin capital letter AE = latin capital ligature AE - Ccedil ;00C7 latin capital letter C with cedilla - Egrave ;00C8 latin capital letter E with grave - Eacute ;00C9 latin capital letter E with acute - Ecirc ;00CA latin capital letter E with circumflex - Euml ;00CB latin capital letter E with diaeresis - Igrave ;00CC latin capital letter I with grave - Iacute ;00CD latin capital letter I with acute - Icirc ;00CE latin capital letter I with circumflex - Iuml ;00CF latin capital letter I with diaeresis - ETH ;00D0 latin capital letter ETH - Ntilde ;00D1 latin capital letter N with tilde - Ograve ;00D2 latin capital letter O with grave - Oacute ;00D3 latin capital letter O with acute - Ocirc ;00D4 latin capital letter O with circumflex - Otilde ;00D5 latin capital letter O with tilde - Ouml ;00D6 latin capital letter O with diaeresis - times ;00D7 multiplication sign - Oslash ;00D8 latin capital letter O with stroke = latin capital letter O slash - Ugrave ;00D9 latin capital letter U with grave - Uacute ;00DA latin capital letter U with acute - Ucirc ;00DB latin capital letter U with circumflex - Uuml ;00DC latin capital letter U with diaeresis - Yacute ;00DD latin capital letter Y with acute - THORN ;00DE latin capital letter THORN - szlig ;00DF latin small letter sharp s = ess-zed - agrave ;00E0 latin small letter a with grave = latin small letter a grave - aacute ;00E1 latin small letter a with acute - acirc ;00E2 latin small letter a with circumflex - atilde ;00E3 latin small letter a with tilde - auml ;00E4 latin small letter a with diaeresis - aring ;00E5 latin small letter a with ring above = latin small letter a ring - aelig ;00E6 latin small letter ae = latin small ligature ae - ccedil ;00E7 latin small letter c with cedilla - egrave ;00E8 latin small letter e with grave - eacute ;00E9 latin small letter e with acute - ecirc ;00EA latin small letter e with circumflex - euml ;00EB latin small letter e with diaeresis - igrave ;00EC latin small letter i with grave - iacute ;00ED latin small letter i with acute - icirc ;00EE latin small letter i with circumflex - iuml ;00EF latin small letter i with diaeresis - eth ;00F0 latin small letter eth - ntilde ;00F1 latin small letter n with tilde - ograve ;00F2 latin small letter o with grave - oacute ;00F3 latin small letter o with acute - ocirc ;00F4 latin small letter o with circumflex - otilde ;00F5 latin small letter o with tilde - ouml ;00F6 latin small letter o with diaeresis - divide ;00F7 division sign - oslash ;00F8 latin small letter o with stroke, = latin small letter o slash - ugrave ;00F9 latin small letter u with grave - uacute ;00FA latin small letter u with acute - ucirc ;00FB latin small letter u with circumflex - uuml ;00FC latin small letter u with diaeresis - yacute ;00FD latin small letter y with acute - thorn ;00FE latin small letter thorn - yuml ;00FF latin small letter y with diaeresis - - ;; 24.3 Character entity references for symbols, mathematical symbols, and - ;; Greek letters - ;; Latin Extended-B - fnof ;0192 latin small f with hook = function = florin - ;; Greek - Alpha ;0391 greek capital letter alpha - Beta ;0392 greek capital letter beta - Gamma ;0393 greek capital letter gamma - Delta ;0394 greek capital letter delta - Epsilon ;0395 greek capital letter epsilon - Zeta ;0396 greek capital letter zeta - Eta ;0397 greek capital letter eta - Theta ;0398 greek capital letter theta - Iota ;0399 greek capital letter iota - Kappa ;039A greek capital letter kappa - Lambda ;039B greek capital letter lambda - Mu ;039C greek capital letter mu - Nu ;039D greek capital letter nu - Xi ;039E greek capital letter xi - Omicron ;039F greek capital letter omicron - Pi ;03A0 greek capital letter pi - Rho ;03A1 greek capital letter rho - Sigma ;03A3 greek capital letter sigma - Tau ;03A4 greek capital letter tau - Upsilon ;03A5 greek capital letter upsilon - Phi ;03A6 greek capital letter phi - Chi ;03A7 greek capital letter chi - Psi ;03A8 greek capital letter psi - Omega ;03A9 greek capital letter omega - alpha ;03B1 greek small letter alpha - beta ;03B2 greek small letter beta - gamma ;03B3 greek small letter gamma - delta ;03B4 greek small letter delta - epsilon ;03B5 greek small letter epsilon - zeta ;03B6 greek small letter zeta - eta ;03B7 greek small letter eta - theta ;03B8 greek small letter theta - iota ;03B9 greek small letter iota - kappa ;03BA greek small letter kappa - lambda ;03BB greek small letter lambda - mu ;03BC greek small letter mu - nu ;03BD greek small letter nu - xi ;03BE greek small letter xi - omicron ;03BF greek small letter omicron - pi ;03C0 greek small letter pi - rho ;03C1 greek small letter rho - sigmaf ;03C2 greek small letter final sigma - sigma ;03C3 greek small letter sigma - tau ;03C4 greek small letter tau - upsilon ;03C5 greek small letter upsilon - phi ;03C6 greek small letter phi - chi ;03C7 greek small letter chi - psi ;03C8 greek small letter psi - omega ;03C9 greek small letter omega - thetasym ;03D1 greek small letter theta symbol - upsih ;03D2 greek upsilon with hook symbol - piv ;03D6 greek pi symbol - ;; *** General Punctuation - bull ;2022 bullet = black small circle - hellip ;2026 horizontal ellipsis = three dot leader - prime ;2032 prime = minutes = feet - Prime ;2033 double prime = seconds = inches - oline ;203E overline = spacing overscore - frasl ;2044 fraction slash - ;; *** Letterlike Symbols - weierp ;2118 script capital P = power set = Weierstrass p - image ;2111 blackletter capital I = imaginary part - real ;211C blackletter capital R = real part symbol - trade ;2122 trade mark sign - alefsym ;2135 alef symbol = first transfinite cardinal - ;; *** Arrows - larr ;2190 leftwards arrow - uarr ;2191 upwards arrow - rarr ;2192 rightwards arrow - darr ;2193 downwards arrow - harr ;2194 left right arrow - crarr ;21B5 downwards arrow with corner leftwards = carriage return - lArr ;21D0 leftwards double arrow - uArr ;21D1 upwards double arrow - rArr ;21D2 rightwards double arrow - dArr ;21D3 downwards double arrow - hArr ;21D4 left right double arrow - ;; Mathematical Operators - forall ;2200 for all - part ;2202 partial differential - exist ;2203 there exists - empty ;2205 empty set = null set = diameter - nabla ;2207 nabla = backward difference - isin ;2208 element of - notin ;2209 not an element of - ni ;220B contains as member - prod ;220F n-ary product = product sign - sum ;2211 n-ary sumation - minus ;2212 minus sign - lowast ;2217 asterisk operator - radic ;221A square root = radical sign - prop ;221D proportional to - infin ;221E infinity - ang ;2220 angle - and ;2227 logical and = wedge - or ;2228 logical or = vee - cap ;2229 intersection = cap - cup ;222A union = cup - int ;222B integral - there4 ;2234 therefore - sim ;223C tilde operator = varies with = similar to - cong ;2245 approximately equal to - asymp ;2248 almost equal to = asymptotic to - ne ;2260 not equal to - equiv ;2261 identical to - le ;2264 less-than or equal to - ge ;2265 greater-than or equal to - sub ;2282 subset of - sup ;2283 superset of - nsub ;2284 not a subset of - sube ;2286 subset of or equal to - supe ;2287 superset of or equal to - oplus ;2295 circled plus = direct sum - otimes ;2297 circled times = vector product - perp ;22A5 up tack = orthogonal to = perpendicular - sdot ;22C5 dot operator - ;; Miscellaneous Technical - lceil ;2308 left ceiling = apl upstile - rceil ;2309 right ceiling - lfloor ;230A left floor = apl downstile - rfloor ;230B right floor - lang ;2329 left-pointing angle bracket = bra - rang ;232A right-pointing angle bracket = ket - ;; Geometric Shapes - loz ;25CA lozenge - ;; Miscellaneous Symbols - spades ;2660 black spade suit - clubs ;2663 black club suit = shamrock - hearts ;2665 black heart suit = valentine - diams ;2666 black diamond suit - - ;; 24.4 Character entity references for markup-significant and - ;; internationalization characters - ;; C0 Controls and Basic Latin - quot ;0022 quotation mark = APL quote - amp ;0026 ampersand - lt ;003C less-than sign - gt ;003E greater-than sign - ;; Latin Extended-A - OElig ;0152 latin capital ligature OE - oelig ;0153 latin small ligature oe - Scaron ;0160 latin capital letter S with caron - scaron ;0161 latin small letter s with caron - Yuml ;0178 latin capital letter Y with diaeresis - ;; Spacing Modifier Letters - circ ;02C6 modifier letter circumflex accent - tilde ;02DC small tilde - ;; General Punctuation - ensp ;2002 en space - emsp ;2003 em space - thinsp ;2009 thin space - zwnj ;200C zero width non-joiner - zwj ;200D zero width joiner - lrm ;200E left-to-right mark - rlm ;200F right-to-left mark - ndash ;2013 en dash - mdash ;2014 em dash - lsquo ;2018 left single quotation mark - rsquo ;2019 right single quotation mark - sbquo ;201A single low-9 quotation mark - ldquo ;201C left double quotation mark - rdquo ;201D right double quotation mark - bdquo ;201E double low-9 quotation mark - dagger ;2020 dagger - Dagger ;2021 double dagger - permil ;2030 per mille sign - lsaquo ;2039 single left-pointing angle quotation mark - rsaquo ;203A single right-pointing angle quotation mark - euro ;20AC euro sign - ) diff --git a/scribble-html-lib/scribble/html/info.rkt b/scribble-html-lib/scribble/html/info.rkt deleted file mode 100644 index 1536c76b..00000000 --- a/scribble-html-lib/scribble/html/info.rkt +++ /dev/null @@ -1,3 +0,0 @@ -#lang info - -(define test-responsibles '((all eli))) diff --git a/scribble-html-lib/scribble/html/lang.rkt b/scribble-html-lib/scribble/html/lang.rkt deleted file mode 100644 index 3caefb4a..00000000 --- a/scribble-html-lib/scribble/html/lang.rkt +++ /dev/null @@ -1,14 +0,0 @@ -#lang racket/base - -(require "main.rkt" (except-in scribble/text/lang #%top) - scribble/text/syntax-utils) - -(provide (except-out (all-from-out scribble/text/lang) #%module-begin) - (rename-out [module-begin #%module-begin]) - (all-from-out "main.rkt")) - -(require (for-syntax racket/base)) -(define-syntax-rule (module-begin expr ...) - (#%plain-module-begin - (port-count-lines! (current-output-port)) - (process-begin/text begin output-xml expr ...))) diff --git a/scribble-html-lib/scribble/html/lang/reader.rkt b/scribble-html-lib/scribble/html/lang/reader.rkt deleted file mode 100644 index b61bd509..00000000 --- a/scribble-html-lib/scribble/html/lang/reader.rkt +++ /dev/null @@ -1,11 +0,0 @@ -#lang s-exp syntax/module-reader - -scribble/html/lang - -#:read scribble:read-inside -#:read-syntax scribble:read-syntax-inside -#:whole-body-readers? #t -#:info (scribble-base-reader-info) - -(require (prefix-in scribble: scribble/reader) - (only-in scribble/base/reader scribble-base-reader-info)) diff --git a/scribble-html-lib/scribble/html/main.rkt b/scribble-html-lib/scribble/html/main.rkt deleted file mode 100644 index 789c4fe3..00000000 --- a/scribble-html-lib/scribble/html/main.rkt +++ /dev/null @@ -1,17 +0,0 @@ -#lang racket/base - -(require "xml.rkt" "html.rkt" "resource.rkt" - ;; includes all of the scribble/text utilities - scribble/text) - -(provide (all-from-out "xml.rkt" "html.rkt" "resource.rkt" scribble/text) - (rename-out [top #%top])) - -(require (for-syntax racket/base)) -(define-syntax (top stx) - (syntax-case stx () - [(_ . x) - (let ([x* (syntax-e #'x)]) - (if (and (symbol? x*) (regexp-match? #rx":$" (symbol->string x*))) - #''x - #'(#%top . x)))])) diff --git a/scribble-html-lib/scribble/html/resource.rkt b/scribble-html-lib/scribble/html/resource.rkt deleted file mode 100644 index 454ff633..00000000 --- a/scribble-html-lib/scribble/html/resource.rkt +++ /dev/null @@ -1,243 +0,0 @@ -#lang racket/base - -;; Resources are renderable & referrable objects, (most are html pages). - -;; (resource path renderer) creates and returns a new "resource" value. The -;; arguments are: -;; - `path': the path of the output file, relative to the working directory, -;; indicating where the resource file should be put at, also corresponding to -;; the URL it will be found at. It must be a `/'-separated relative string, -;; no `..', `.', or `//', and it can end in `/' (which will turn to -;; "index.html"). -;; - `renderer': a unary function that renders the resource, receiving the path -;; for the file to be created as an argument. This path will be different -;; than the `path' argument because this function is invoked in the target -;; directory. -;; The resulting resource value is a function that returns the URL for the -;; resource. The function takes in an optional boolean which defaults to #f, -;; and when #t is given, the result will be an absolute full URL. Note that -;; the function can be used as a value for output, which will use it as a thunk -;; (that renders as the relative URL for the resource). The default relative -;; resulting URL is, of course, a value that depends on the currently rendered -;; resource that uses this value. Creating a resource registers the `renderer' -;; to be executed when rendering is initiated by `render-all'. Note that more -;; resources can be created while rendering; they will also be rendered in turn -;; until no more new resources are created. - -(require scribble/text) - -;; default file, urls to it will point to its directory instead, a -;; /-suffixed path will render to this file, and `url-roots' entries -;; with 'index will append this file name to a rewritten path that -;; otherwise ends in / -(define default-file "index.html") - -;; the currently rendered directory, as a list -(define rendered-dirpath (make-parameter '())) - -;; A mapping from path prefixes to urls (actually, any string) -- when two -;; paths are in the same prefix, links from one to the other are relative -;; (unless absolute links are requested) , but if they're in different -;; prefixes, the url will be used instead; the roots are expected to be -;; disjoint (= no "/foo" and "/foo/bar" roots). Additionally, optional symbol -;; flags can appear in each entry, currently only 'abs is used below for roots -;; that should always use absolute links (needed for some skeleton pages that -;; are used in nested subdirectories). -(provide url-roots) -(define url-roots (make-parameter #f)) - -(define cached-roots '(#f . #f)) -(define (current-url-roots) - ;; takes `url-roots', a (listof (list prefix-string url-string . flags)), and - ;; produces an alist with lists of strings for the keys; the prefix-strings - ;; are split on "/"s, and the url-strings can be anything at all actually - ;; (they are put as-is before the path with a "/" between them). - (define roots (url-roots)) - (unless (eq? roots (car cached-roots)) - (set! cached-roots - (cons roots - (and (list? roots) (pair? roots) - (map (lambda (root) - (list* (regexp-match* #rx"[^/]+" (car root)) - (regexp-replace #rx"/$" (cadr root) "") - (cddr root))) - roots))))) - (cdr cached-roots)) - -;; a utility for relative paths, taking the above `default-file' and -;; `url-roots' into consideration. -(define (relativize file tgtdir curdir) - (define file* (if (equal? file default-file) "" file)) - (define roots (current-url-roots)) - (define (find-root path mode) - (ormap (lambda (root+url+flags) - (let loop ([r (car root+url+flags)] [p path]) - (if (pair? r) - (and (pair? p) (equal? (car p) (car r)) - (loop (cdr r) (cdr p))) - (case mode - [(get-path) `(,(cadr root+url+flags) - ,@p - ,(if (and (equal? file* "") - (memq 'index (cddr root+url+flags))) - default-file - file*))] - [(get-abs-or-true) - (if (memq 'abs (cddr root+url+flags)) `("" ,@p) #t)] - [else (error 'relativize "internal error: ~e" mode)])))) - roots)) - (define result - (let loop ([t tgtdir] [c curdir] [pfx '()]) - (cond - ;; find shared prefix - [(and (pair? t) (pair? c) (equal? (car t) (car c))) - (loop (cdr t) (cdr c) (cons (car t) pfx))] - ;; done with the shared prefix, deal with the root now - ;; no roots => always use a relative path (useful for debugging) - [(not roots) `(,@(map (lambda (_) "..") c) ,@t ,file*)] - ;; share a root => use a relative path unless its an absolute root - [(find-root (reverse pfx) 'get-abs-or-true) - => (lambda (abs/true) - `(;; rel. => as above - ,@(if (list? abs/true) abs/true (map (lambda (_) "..") c)) - ,@t ,file*))] - ;; different roots => use the one for the target - [(find-root tgtdir 'get-path)] - ;; if there isn't any, throw an error - [else (error 'relativize "target url is not in any known root: ~a" - (string-join `(,@tgtdir ,file*) "/"))]))) - (if (equal? '("") result) "." (string-join result "/"))) - -#; -(module+ test - (require tests/eli-tester) - (define R relativize) - (let () - (test do (test (R "bleh.txt" '() '() ) => "bleh.txt" - (R "bleh.txt" '("x") '() ) => "x/bleh.txt" - (R "bleh.txt" '("x" "y") '() ) => "x/y/bleh.txt" - (R "bleh.txt" '() '("x") ) => "../bleh.txt" - (R "bleh.txt" '("x") '("x") ) => "bleh.txt" - (R "bleh.txt" '("x" "y") '("x") ) => "y/bleh.txt" - (R "bleh.txt" '() '("x" "y")) => "../../bleh.txt" - (R "bleh.txt" '("x") '("x" "y")) => "../bleh.txt" - (R "bleh.txt" '("x" "y") '("x" "y")) => "bleh.txt" - (R "bleh.txt" '("x" "y") '("y" "x")) => "../../x/y/bleh.txt" - (R "index.html" '() '() ) => "." - (R "index.html" '("x") '() ) => "x/" - (R "index.html" '("x" "y") '() ) => "x/y/" - (R "index.html" '() '("x") ) => "../" - (R "index.html" '("x") '("x") ) => "." - (R "index.html" '("x" "y") '("x") ) => "y/" - (R "index.html" '() '("x" "y")) => "../../" - (R "index.html" '("x") '("x" "y")) => "../" - (R "index.html" '("x" "y") '("x" "y")) => "." - (R "index.html" '("x" "y") '("y" "x")) => "../../x/y/") - do (parameterize ([url-roots '(["/x" "/X/"] ["/y" "/Y/"])]) - (test (R "bleh.txt" '() '() ) =error> "not in any" - (R "bleh.txt" '("x") '() ) => "/X/bleh.txt" - (R "bleh.txt" '("x" "y") '() ) => "/X/y/bleh.txt" - (R "bleh.txt" '() '("x") ) =error> "not in any" - (R "bleh.txt" '("x") '("x") ) => "bleh.txt" - (R "bleh.txt" '("x" "y") '("x") ) => "y/bleh.txt" - (R "bleh.txt" '() '("x" "y")) =error> "not in any" - (R "bleh.txt" '("x") '("x" "y")) => "../bleh.txt" - (R "bleh.txt" '("x" "y") '("x" "y")) => "bleh.txt" - (R "bleh.txt" '("x" "y") '("y" "x")) => "/X/y/bleh.txt" - (R "index.html" '() '() ) =error> "not in any" - (R "index.html" '("x") '() ) => "/X/" - (R "index.html" '("x" "y") '() ) => "/X/y/" - (R "index.html" '() '("x") ) =error> "not in any" - (R "index.html" '("x") '("x") ) => "." - (R "index.html" '("x" "y") '("x") ) => "y/" - (R "index.html" '() '("x" "y")) =error> "not in any" - (R "index.html" '("x") '("x" "y")) => "../" - (R "index.html" '("x" "y") '("x" "y")) => "." - (R "index.html" '("x" "y") '("y" "x")) => "/X/y/")) - do (parameterize ([url-roots '(["/x" "/X/"] ["/y" "/Y/" abs])]) - (test (R "foo.txt" '("x" "1") '("x" "2")) => "../1/foo.txt" - (R "foo.txt" '("y" "1") '("y" "2")) => "/1/foo.txt"))))) - -;; utility for keeping a list of renderer thunks -(define-values [add-renderer get/reset-renderers] - (let ([l '()] [s (make-semaphore 1)]) - ;; map paths to #t -- used to avoid overwriting files - (define t (make-hash)) - (define-syntax-rule (S body) (call-with-semaphore s (lambda () body))) - (values (lambda (path renderer) - (S (if (hash-ref t path #f) - (error 'resource "path used for two resources: ~e" path) - (begin (hash-set! t path #t) (set! l (cons renderer l)))))) - (lambda () (S (begin0 (reverse l) (set! l '()))))))) - -;; `#:exists' determines what happens when the render destination exists, it -;; can be one of: #f (do nothing), 'delete-file (delete if a file exists, error -;; if exists as a directory) -(provide resource resource?) -;; use a struct to make resources identifiable as such -(struct resource (url) #:constructor-name make-resource - #:property prop:procedure 0 #:omit-define-syntaxes) -(define (resource path0 renderer #:exists [exists 'delete-file]) - (define (bad reason) (error 'resource "bad path, ~a: ~e" reason path0)) - (unless (string? path0) (bad "must be a string")) - (for ([x (in-list '([#rx"^/" "must be relative"] - [#rx"//" "must not have empty elements"] - [#rx"(?:^|/)[.][.]?(?:/|$)" - "must not contain `.' or `..'"]))]) - (when (regexp-match? (car x) path0) (bad (cadr x)))) - (define path (regexp-replace #rx"(?<=^|/)$" path0 default-file)) - (define-values [dirpathlist filename] - (let-values ([(l r) (split-at-right (regexp-split #rx"/" path) 1)]) - (values l (car r)))) - (define (render) - (let loop ([ps dirpathlist]) - (if (pair? ps) - (begin (unless (directory-exists? (car ps)) - (if (or (file-exists? (car ps)) (link-exists? (car ps))) - (bad "exists as a file/link") - (make-directory (car ps)))) - (parameterize ([current-directory (car ps)]) - (loop (cdr ps)))) - (begin (cond [(not exists)] ; do nothing - [(or (file-exists? filename) (link-exists? filename)) - (delete-file filename)] - [(directory-exists? filename) - (bad "exists as directory")]) - (parameterize ([rendered-dirpath dirpathlist]) - (printf " ~a\n" path) - (renderer filename)))))) - (define absolute-url - (lazy (define url (relativize filename dirpathlist '())) - (if (url-roots) - url - ;; we're in local build mode, and insist on an absolute url, so - ;; construct a `file://' result - (list* "file://" (current-directory) url)))) - (when renderer - (add-renderer path render)) - (define (url [absolute? #f]) - ;; be conservative, in case it needs to be extended in the future - (case absolute? - [(#f) (relativize filename dirpathlist (rendered-dirpath))] - [(#t) (force absolute-url)] - [else (error 'resource "bad absolute flag value: ~e" absolute?)])) - (make-resource url)) - -;; a convenient utility to create renderers from some output function (like -;; `output-xml' or `display') and some content -(provide file-writer) -(define ((file-writer writer content) file) - (call-with-output-file file (lambda (o) (writer content o)))) - -;; runs all renderers, and any renderers that might have been added on the way -(provide render-all) -(define (render-all) - (printf "Rendering...\n") - (define todo (get/reset-renderers)) - (if (null? todo) - (printf " Warning: no content to render\n") - (let loop ([todo todo]) - (unless (null? todo) - (for-each (lambda (r) (r)) todo) - (loop (get/reset-renderers))))) ; if more were created - (printf "Rendering done.\n")) diff --git a/scribble-html-lib/scribble/html/xml.rkt b/scribble-html-lib/scribble/html/xml.rkt deleted file mode 100644 index b41d93c5..00000000 --- a/scribble-html-lib/scribble/html/xml.rkt +++ /dev/null @@ -1,162 +0,0 @@ -#lang racket/base - -;; XML-like objects and functions, with rendering - -(require scribble/text racket/port) - -;; ---------------------------------------------------------------------------- -;; Represent attribute names as `foo:' symbols. They are made self-quoting in -;; the language. A different option would be to use the usual racket keyword -;; arguments, but that tends to have problems like disallowing repeated uses of -;; the same keyword, sorting the keywords alphabetically, and ambiguity when -;; some keywords are meant to do the usual thing (customize a function) instead -;; of representing an attribute. It's more convenient to just have a separate -;; mechanism for this, so racket keywords are still used in the same way, and -;; orthogonal to specifying attributes. Another possibility is to have a new -;; type, with `foo:' evaluating to instances -- but it's often convenient to -;; pass them around as quoted lists. - -(define attribute->symbol - (let ([t (make-weak-hasheq)]) - (lambda (x) - (and (symbol? x) - (hash-ref! t x - (lambda () - (define m (regexp-match #rx"^(.*):$" (symbol->string x))) - (and m (string->symbol (cadr m))))))))) - -(provide attribute?) -(define attribute? attribute->symbol) - -(provide attributes+body) -(define (attributes+body xs) - (let loop ([xs xs] [as '()]) - (define a (and (pair? xs) (attribute->symbol (car xs)))) - (cond [(not a) (values (reverse as) xs)] - [(null? (cdr xs)) (error 'attriubtes+body - "missing attribute value for `~s:'" a)] - [else (loop (cddr xs) (cons (cons a (cadr xs)) as))]))) - -;; similar, but keeps the attributes as a list, useful to build new functions -;; that accept attributes without knowing about the xml structs. -(provide split-attributes+body) -(define (split-attributes+body xs) - (let loop ([xs xs] [as '()]) - (if (and (pair? xs) (pair? (cdr xs)) (attribute->symbol (car xs))) - (loop (cddr xs) (list* (cadr xs) (car xs) as)) - (values (reverse as) xs)))) - -;; ---------------------------------------------------------------------------- -;; An output that handles xml quoting, customizable - -;; TODO: make this more conveniently customizable and extensible -(define (write-string/xml-quote str p [start 0] [end (string-length str)]) - (let loop ([start start]) - (when (< start end) - (define m (regexp-match-positions #rx"[&<>\"]" str start end p)) - (when m - (write-string (case (string-ref str (caar m)) - [(#\&) "&"] - [(#\<) "<"] - [(#\>) ">"] - [(#\") """]) - p) - (loop (cdar m)))))) - -(provide xml-writer) -(define xml-writer (make-parameter write-string/xml-quote)) - -(provide output-xml) -(define (output-xml content [p (current-output-port)]) - (output (disable-prefix (with-writer (xml-writer) content)) p)) - -(provide xml->string) -(define (xml->string content) - (with-output-to-string (lambda () (output-xml content)))) - -;; ---------------------------------------------------------------------------- -;; Structs for xml data: elements, literals, entities - -(provide make-element) -(struct element (tag attrs body [cache #:auto #:mutable]) - #:constructor-name make-element - #:transparent #:omit-define-syntaxes #:auto-value #f - #:property prop:procedure - (lambda (e) - (unless (element-cache e) (set-element-cache! e (element->output e))) - (element-cache e))) - -(provide element) -(define (element tag . args) - (define-values [attrs body] (attributes+body args)) - (make-element tag attrs body)) - -;; similar to element, but will always have a closing tag instead of using the -;; short syntax (see also `element->output' below) -(provide element/not-empty) -(define (element/not-empty tag . args) - (define-values [attrs body] (attributes+body args)) - (make-element tag attrs (if (null? body) '(#f) body))) - -;; convert an element to something output-able -(define (element->output e) - (define tag (element-tag e)) - (define attrs (element-attrs e)) - (define body (element-body e)) - ;; null body means a lone tag, tags that should always have a closer will - ;; have a '(#f) as their body (see below) - (list (with-writer #f "<" tag) - (map (lambda (attr) - (define name (car attr)) - (define val (cdr attr)) - (cond [(not val) #f] - ;; #t means just mention the attribute - [(eq? #t val) (with-writer #f (list " " name))] - [else (list (with-writer #f (list " " name "=\"")) - val - (with-writer #f "\""))])) - attrs) - (if (null? body) - (with-writer #f " />") - (list (with-writer #f ">") - body - (with-writer #f ""))))) - -;; ---------------------------------------------------------------------------- -;; Literals - -;; literal "struct" for things that are not escaped -(provide literal) -(define (literal . contents) (with-writer #f contents)) - -;; entities are implemented as literals -(provide entity) -(define (entity x) (literal "&" (and (number? x) "#") x ";")) - -;; comments and cdata -(provide comment) -(define (comment #:newlines? [newlines? #f] . body) - (define newline (and newlines? "\n")) - (literal "")) -(provide cdata) -(define (cdata #:newlines? [newlines? #t] #:line-prefix [pfx #f] . body) - (define newline (and newlines? "\n")) - (literal pfx "")) - -;; ---------------------------------------------------------------------------- -;; Template definition forms - -(provide define/provide-elements/empty - define/provide-elements/not-empty - define/provide-entities) -(define-syntax-rule (define/provide-elements/empty tag ...) - (begin (provide tag ...) - (define (tag . args) (apply element 'tag args)) ...)) -(define-syntax-rule (define/provide-elements/not-empty tag ...) - (begin (provide tag ...) - (define (tag . args) (apply element/not-empty 'tag args)) ...)) -(define-syntax-rule (define/provide-entities ent ...) - (begin (provide ent ...) - (define ent ; use string-append to make it a little faster - (literal (string-append "&" (symbol->string 'ent) ";"))) - ...)) diff --git a/scribble-lib/LICENSE.txt b/scribble-lib/LICENSE.txt deleted file mode 100644 index 1be10033..00000000 --- a/scribble-lib/LICENSE.txt +++ /dev/null @@ -1,11 +0,0 @@ -scribble-lib -Copyright (c) 2010-2014 PLT Design Inc. - -This package is distributed under the GNU Lesser General Public -License (LGPL). This means that you can link this package into proprietary -applications, provided you follow the rules stated in the LGPL. You -can also modify this package; if you distribute a modified version, -you must distribute it under the terms of the LGPL, which in -particular means that you must release the source code for the -modified software. See http://www.gnu.org/copyleft/lesser.html -for more information. diff --git a/scribble-lib/help/help.rkt b/scribble-lib/help/help.rkt deleted file mode 100644 index 383c7b3c..00000000 --- a/scribble-lib/help/help.rkt +++ /dev/null @@ -1,21 +0,0 @@ -#lang scheme/base - -(require "search.rkt" scheme/cmdline scheme/list scheme/string - raco/command-name) - -;; Minimal command-line arguments, the query string can contain all -;; kinds of magic. -(command-line - #:program (short-program+command-name) - #:handlers - (lambda (_ . ts) - (if (null? ts) - (send-main-page) - (perform-search (string-append* (add-between ts " "))))) - '("search-terms") - (lambda (help-str) - (display help-str) - (display " See the search page for the syntax of queries\n") - (exit 0))) - -(module test racket/base) diff --git a/scribble-lib/help/info.rkt b/scribble-lib/help/info.rkt deleted file mode 100644 index 8525dbf5..00000000 --- a/scribble-lib/help/info.rkt +++ /dev/null @@ -1,3 +0,0 @@ -#lang info - -(define compile-omit-files '("tests")) diff --git a/scribble-lib/help/search.rkt b/scribble-lib/help/search.rkt deleted file mode 100644 index b3c36742..00000000 --- a/scribble-lib/help/search.rkt +++ /dev/null @@ -1,81 +0,0 @@ -#lang racket/base - -(require setup/dirs - net/sendurl - net/uri-codec - net/url - racket/string) -(provide perform-search send-main-page) - -(define search-dir "search/") - -;; Almost nothing to do here -- the real work is done in the browser, -;; using javascript. - -(define (send-main-page #:sub [sub "index.html"] - #:fragment [fragment #f] #:query [query #f] - #:notify [notify void]) - (define open-url (get-doc-open-url)) - (cond - [open-url - (define dest-url (let ([u (string->url open-url)]) - (combine-url/relative - u - (string-join - (for/list ([s (explode-path sub)]) - (if (path? s) - (path-element->string s) - (format "~a" s))) - "/")))) - (notify (url->string dest-url)) - (send-url (url->string - (struct-copy url dest-url - [fragment (or fragment - (url-fragment dest-url))] - [query (append - (url-query dest-url) - (if query - (url-query - (string->url - (format "q?~a" query))) - null))])))] - [else - (let* ([path (build-path (find-user-doc-dir) sub)] - [path (if (file-exists? path) path (build-path (find-doc-dir) sub))]) - (notify path) - (send-url/file path #:fragment fragment #:query query))])) - -;; This is an example of changing this code to use the online manuals. -;; Normally, it's better to set `doc-open-url` in "etc/config.rktd", -;; but as a last resort, you can change `send-main-page` to compute a URL. -;; This may be useful in cases like schools that use systems that have problems -;; running a browser on local files (like NEU). If you use this, then -;; it is a good idea to put the documentation tree somewhere local, to -;; have better interaction times instead of using the PLT server. -;; (define (send-main-page #:sub [sub "index.html"] -;; #:fragment [fragment #f] #:query [query #f] -;; #:notify [notify void]) -;; (define (part pfx x) (if x (string-append pfx x) "")) -;; (send-url (string-append -;; "http://download.racket-lang.org/docs/" (version) "/html/" -;; sub (part "#" fragment) (part "?" query)))) - -(define (perform-search str [context #f]) - ;; `context' can be a pre-filter query string to use for a context, - ;; optionally a list of one and a label to display for that context. - ;; In any case, when a context is specified, the search actually - ;; goes through the search-context.html page which tranpolines to - ;; the main search page after setting the cookies (so when the - ;; search page is refreshed it won't reset the context). - (let* ([label (and (list? context) (= 2 (length context)) (cadr context))] - [context (if (pair? context) (car context) context)] - [page (if context "search-context.html" "index.html")] - [query (format "q=~a" (uri-encode str))] - [query (if context - (format "~a&hq=~a~a" - query (uri-encode context) - (if label - (format "&label=~a" (uri-encode label)) - "")) - query)]) - (send-main-page #:sub (string-append search-dir page) #:query query))) diff --git a/scribble-lib/info.rkt b/scribble-lib/info.rkt deleted file mode 100644 index 4c79e431..00000000 --- a/scribble-lib/info.rkt +++ /dev/null @@ -1,26 +0,0 @@ -#lang info - -(define collection 'multi) - -(define deps '("scheme-lib" - "base" - "compatibility-lib" - "scribble-text-lib" - "scribble-html-lib" - "planet-lib" ; used dynamically - "net-lib" - "at-exp-lib" - "draw-lib" - "syntax-color-lib" - "sandbox-lib" - "typed-racket-lib" - )) -(define build-deps '("rackunit-lib")) - -(define implies '("scribble-html-lib")) - -(define pkg-desc "implementation (no documentation) part of \"scribble\"") - -(define pkg-authors '(mflatt eli)) - -(define version "1.17") diff --git a/scribble-lib/scribble/HISTORY.txt b/scribble-lib/scribble/HISTORY.txt deleted file mode 100644 index e619f422..00000000 --- a/scribble-lib/scribble/HISTORY.txt +++ /dev/null @@ -1,26 +0,0 @@ -Version 1.1 -Moved detailed-change recording to documentation - -Version 1.0 -Use `doc' submodule when available -Changed the HTML rendering style of `scribble/manual' -Changed `verbatim' to support non-string arguments -Added `--html-tree' option to for rendering to multi-page HTML - with nested directories for nested parts -Added `css-style-addition' and `js-style-addition' for adding - style files that override library-level defaults but can be - overridden externally -For HTML rendering, merge generated `style' attributes within - a single tag -scribble/base: same change as for racket/runtime-path related - to "collects"-relative paths -scribble/base: added `#:indirect' option to `defmodule` and - `seclink` -scribble/manual: added `manual-doc-style' -scribble/manual: changed `deprecated' to a function, and - generalized it by adding an optional `#:what' argument -scriblib/autobib: add #:note - -Older versions -See the "Racket core" release notes for a history of changes before - the "scribble-lib" package was created. diff --git a/scribble-lib/scribble/base-render.rkt b/scribble-lib/scribble/base-render.rkt deleted file mode 100644 index d73c0a35..00000000 --- a/scribble-lib/scribble/base-render.rkt +++ /dev/null @@ -1,1152 +0,0 @@ -#lang scheme/base - -(require "core.rkt" - "private/render-utils.rkt" - mzlib/class - mzlib/serialize - scheme/file - scheme/path - setup/collects - setup/path-relativize - file/convertible - net/url-structs - "render-struct.rkt") - -(provide render% - render<%>) - -(define render<%> - (interface () - traverse - collect - resolve - render - serialize-info - deserialize-info - get-external - get-undefined - - ;; undocumented: - current-render-mode - get-substitutions - render-part - render-flow - render-intrapara-block - render-table - render-itemization - render-paragraph - render-content - render-nested-flow - render-block - render-other - get-dest-directory - format-number - number-depth)) - -(define render% - (class* object% (render<%>) - - (init-field dest-dir - [refer-to-existing-files #f] - [root-path #f] - [prefix-file #f] - [style-file #f] - [style-extra-files null] - [extra-files null] - [image-preferences null] - [helper-file-prefix #f]) - - (define/public (current-render-mode) - '()) - - (define/public (get-dest-directory [create? #f]) - (when (and dest-dir create? (not (directory-exists? dest-dir))) - (make-directory* dest-dir)) - dest-dir) - - (define/public (get-substitutions) null) - - (define/public (get-suffix) #".txt") - - (define/public (index-manual-newlines?) - #f) - - (define/public (format-number number sep [keep-separator? #f]) - (cond - [(or (null? number) - (andmap (lambda (x) (or (not x) (equal? x ""))) - number) - (and (not (car number)) - (not (ormap number? number)))) - null] - [else - (define result-s - (let ([s (string-append - (apply - string-append - (map (lambda (n) - (cond - [(number? n) (format "~a." n)] - [(or (not n) (string? n)) ""] - [(pair? n) (string-append (car n) (cadr n))])) - (reverse (cdr number)))) - (if (and (car number) - (not (equal? "" (car number)))) - (if (pair? (car number)) - (if keep-separator? - (string-append (caar number) - (cadar number)) - (caar number)) - (format "~a." (car number))) - ""))]) - (if (or keep-separator? - (pair? (car number)) - (equal? s "")) - s - (substring s 0 (sub1 (string-length s)))))) - (if (equal? result-s "") - null - (cons result-s sep))])) - - (define/public (number-depth number) - (if (null? number) - 0 - (+ 1 (for/sum ([i (in-list (cdr number))]) (if (not (string? i)) 1 0))))) - - (field [report-output?? #f]) - (define/public (report-output?) report-output??) - (define/public (report-output!) (set! report-output?? #t)) - - ;; should work up to 3999: - (define/private (number->roman n) - (let loop ([n n] - [I #\I] [V #\V] - [X #\X] [L #\L] - [C #\C] [D #\D] - [M #\M]) - (case n - [(0) ""] - [(1 2 3) (make-string n I)] - [(4) (string I V)] - [(5) (string V)] - [(6 7 8) (string-append (string V) (make-string (- n 5) I))] - [(9) (string I X)] - [else - (string-append (loop (quotient n 10) X L C D M D M) - (loop (modulo n 10) I V X L C D M))]))) - - ;; ---------------------------------------- - ;; Methods that really only work on some renderers: - - (define/public (set-external-tag-path p) (void)) - (define/public (set-external-root-url p) (void)) - (define/public (add-extra-script-file s) (void)) - (define/public (set-directory-depth n) (void)) - - ;; ---------------------------------------- - - (define/public (extract-part-style-files d ri stop-at-part? pred extract) - (let ([ht (make-hash)]) - (let loop ([p d] [up? #t] [only-up? #f]) - (let ([s (part-style p)]) - (when up? - (let ([p (collected-info-parent (part-collected-info p ri))]) - (if p - (loop p #t #t) - null))) - (extract-style-style-files (part-style p) ht pred extract) - (unless only-up? - (extract-content-style-files (part-to-collect p) d ri ht pred extract) - (extract-content-style-files (part-title-content p) d ri ht pred extract) - (extract-flow-style-files (part-blocks p) d ri ht pred extract)) - (unless only-up? - (for-each (lambda (p) - (unless (stop-at-part? p) - (loop p #f #f))) - (part-parts p))))) - (map cdr - (sort - (for/list ([(k v) (in-hash ht)]) - (cons v (if (or (bytes? k) (url? k)) - k - (collects-relative->path k)))) - < - #:key car)))) - - (define/private (extract-style-style-files s ht pred extract) - (for ([v (in-list (style-properties s))]) - (when (pred v) - (hash-update! ht (extract v) values (hash-count ht))))) - - (define/private (extract-flow-style-files blocks d ri ht pred extract) - (for ([b (in-list blocks)]) - (extract-block-style-files b d ri ht pred extract))) - - (define/private (extract-block-style-files p d ri ht pred extract) - (cond - [(table? p) - (extract-style-style-files (table-style p) ht pred extract) - (for-each (lambda (blocks) - (for-each (lambda (block) - (unless (eq? block 'cont) - (extract-block-style-files block d ri ht pred extract))) - blocks)) - (table-blockss p))] - [(itemization? p) - (extract-style-style-files (itemization-style p) ht pred extract) - (for-each (lambda (blocks) - (extract-flow-style-files blocks d ri ht pred extract)) - (itemization-blockss p))] - [(nested-flow? p) - (extract-style-style-files (nested-flow-style p) ht pred extract) - (extract-flow-style-files (nested-flow-blocks p) d ri ht pred extract)] - [(compound-paragraph? p) - (extract-style-style-files (compound-paragraph-style p) ht pred extract) - (extract-flow-style-files (compound-paragraph-blocks p) d ri ht pred extract)] - [(delayed-block? p) - (let ([v (delayed-block-blocks p ri)]) - (extract-block-style-files v d ri ht pred extract))] - [(traverse-block? p) - (extract-block-style-files (traverse-block-block p ri) d ri ht pred extract)] - [else - (extract-style-style-files (paragraph-style p) ht pred extract) - (extract-content-style-files (paragraph-content p) d ri ht pred extract)])) - - (define/public (string-to-implicit-styles e) null) - - (define/private (extract-content-style-files e d ri ht pred extract) - (cond - [(string? e) (let ([ses (string-to-implicit-styles e)]) - (when (pair? ses) - (for ([s (in-list ses)]) - (extract-style-style-files s ht pred extract))))] - [(element? e) - (when (style? (element-style e)) - (extract-style-style-files (element-style e) ht pred extract)) - (extract-content-style-files (element-content e) d ri ht pred extract)] - [(multiarg-element? e) - (when (style? (multiarg-element-style e)) - (extract-style-style-files (multiarg-element-style e) ht pred extract)) - (extract-content-style-files (multiarg-element-contents e) d ri ht pred extract)] - [(list? e) - (for ([e (in-list e)]) - (extract-content-style-files e d ri ht pred extract))] - [(delayed-element? e) - (extract-content-style-files (delayed-element-content e ri) d ri ht pred extract)] - [(traverse-element? e) - (extract-content-style-files (traverse-element-content e ri) d ri ht pred extract)] - [(part-relative-element? e) - (extract-content-style-files (part-relative-element-content e ri) d ri ht pred extract)])) - - (define/public (extract-version d) - (or (ormap (lambda (v) - (and (document-version? v) - (document-version-text v))) - (style-properties (part-style d))) - "")) - - (define/public (extract-date d) - (ormap (lambda (v) - (and (document-date? v) - (document-date-text v))) - (style-properties (part-style d)))) - - (define/private (extract-pre-paras d sym) - (let loop ([l (part-blocks d)]) - (cond - [(null? l) null] - [else (let ([v (car l)]) - (cond - [(and (paragraph? v) - (eq? sym (style-name (paragraph-style v)))) - (cons v (loop (cdr l)))] - [(compound-paragraph? v) - (append (loop (compound-paragraph-blocks v)) - (loop (cdr l)))] - [else (loop (cdr l))]))]))) - - (define/public (extract-authors d) - (extract-pre-paras d 'author)) - - (define/public (extract-pretitle d) - (extract-pre-paras d 'pretitle)) - - ;; ---------------------------------------- - - (define root (make-mobile-root root-path)) - - (define-values (:path->root-relative - :root-relative->path) - (if root-path - (make-relativize (lambda () root-path) - root - 'path->root-relative - 'root-relative->path) - (values #f #f))) - - (define/public (path->root-relative p) - (if root-path - (:path->root-relative p) - p)) - - (define/public (root-relative->path p) - (if (root-relative? p) - (apply build-path (or (mobile-root-path (car p)) - (current-directory)) - (map bytes->path-element (cdr p))) - p)) - - (define/public (root-relative? p) - (and (pair? p) - (mobile-root? (car p)))) - - ;; ---------------------------------------- - - (define/public (fresh-tag-collect-context? d ci) - #f) - (define/public (fresh-tag-resolve-context? d ri) - #f) - (define/public (fresh-tag-render-context? d ri) - #f) - - (define/private (extend-prefix d fresh?) - (cond - [fresh? null] - [(part-tag-prefix d) - (cons (part-tag-prefix d) (current-tag-prefixes))] - [else (current-tag-prefixes)])) - - ;; ---------------------------------------- - ;; marshal info - - (define/public (get-serialize-version) - 4) - - (define/public (serialize-infos ri n d) - (if (= n 1) - (list (serialize-info ri)) - (map (lambda (ht) (serialize-one-ht ri ht)) - (partition-info (resolve-info-ci ri) n d)))) - - (define/private (partition-info all-ci n d) - ;; partition information in `all-ci' based on `d's: - (let ([prefix (part-tag-prefix d)] - [new-hts (for/list ([i (in-range n)]) - (make-hash))] - [covered (make-hash)]) - ;; Fill in new-hts from parts: - (for ([sub-d (in-list (part-parts d))] - [i (in-naturals)]) - (define ht (list-ref new-hts (min (add1 i) (sub1 n)))) - (define cdi (hash-ref (collect-info-parts all-ci) sub-d #f)) - (define sub-prefix (part-tag-prefix sub-d)) - (when cdi - (for ([(k v) (in-hash (collected-info-info cdi))]) - (when (cadr k) - (define sub-k (if sub-prefix - (convert-key sub-prefix k) - k)) - (define full-k (if prefix - (convert-key prefix sub-k) - sub-k)) - (hash-set! ht full-k v) - (hash-set! covered full-k #t))))) - ;; Anything not covered in the new-hts must go in the main hts: - (let ([ht0 (car new-hts)]) - (for ([(k v) (in-hash (collect-info-ht all-ci))]) - (unless (hash-ref covered k #f) - (hash-set! ht0 k v)))) - ;; Return hts: - new-hts)) - - (define/public (serialize-info ri) - (serialize-one-ht ri (collect-info-ht (resolve-info-ci ri)))) - - (define/public (serialize-one-ht ri ht) - (parameterize ([current-serialize-resolve-info ri]) - (let ([rp (mobile-root-path root)]) - (when rp - (set-mobile-root-path! root #f)) - (begin0 - (serialize (cons root ht)) - (when rp - (set-mobile-root-path! root rp)))))) - - (define/public (deserialize-info v ci #:root [root-path #f] #:doc-id [doc-id #f]) - (let ([root+ht (deserialize v)] - [in-ht (collect-info-ext-ht ci)]) - (when root-path - (set-mobile-root-path! (car root+ht) root-path)) - (for ([(k v) (cdr root+ht)]) - (hash-set! in-ht k (if doc-id (known-doc v doc-id) v))))) - - (define/public (get-defined ci) - (hash-map (collect-info-ht ci) (lambda (k v) k))) - - (define/public (get-defineds ci n d) - (for/list ([ht (partition-info ci n d)]) - (hash-map ht (lambda (k v) k)))) - - (define/public (get-external ri) - (hash-map (resolve-info-undef ri) (lambda (k v) k))) - - (define/public (get-undefined ri) - (for/list ([(k v) (in-hash (resolve-info-undef ri))] - #:unless (or (eq? v 'found) - (and v - ;; v is a search key; see if any key in the set was resolved: - (let ([ht (hash-ref (resolve-info-searches ri) v)]) - (for/or ([k2 (in-hash-keys ht)]) - (eq? 'found (hash-ref (resolve-info-undef ri) k2 #f))))))) - k)) - - (define/public (transfer-info ci src-ci) - (let ([in-ht (collect-info-ext-ht ci)]) - (for ([(k v) (collect-info-ext-ht src-ci)]) - (hash-set! in-ht k v))) - (set-demand-chain-demands! - (collect-info-ext-demand ci) - (cons (collect-info-ext-demand src-ci) - (demand-chain-demands (collect-info-ext-demand ci))))) - - ;; ---------------------------------------- - ;; document-order traversal - - (define/public (traverse ds fns) - (let loop ([fp #hasheq()]) - (let ([fp2 (start-traverse ds fns fp)]) - (if (equal? fp fp2) - fp - (loop fp2))))) - - (define/public (start-traverse ds fns fp) - (for/fold ([fp fp]) ([d (in-list ds)]) - (traverse-part d fp))) - - (define/public (traverse-part d fp) - (let* ([fp (if (part-title-content d) - (traverse-content (part-title-content d) fp) - fp)] - [fp (traverse-content (part-to-collect d) fp)] - [fp (traverse-flow (part-blocks d) fp)]) - (for/fold ([fp fp]) ([p (in-list (part-parts d))]) - (traverse-part p fp)))) - - (define/public (traverse-paragraph p fp) - (traverse-content (paragraph-content p) fp)) - - (define/public (traverse-flow p fp) - (for/fold ([fp fp]) ([p (in-list p)]) - (traverse-block p fp))) - - (define/public (traverse-block p fp) - (cond [(table? p) (traverse-table p fp)] - [(itemization? p) (traverse-itemization p fp)] - [(nested-flow? p) (traverse-nested-flow p fp)] - [(compound-paragraph? p) (traverse-compound-paragraph p fp)] - [(delayed-block? p) fp] - [(traverse-block? p) (traverse-force fp p - (traverse-block-traverse p) - (lambda (p fp) (traverse-block p fp)))] - [else (traverse-paragraph p fp)])) - - (define/public (traverse-table i fp) - (for*/fold ([fp fp]) ([ds (in-list (table-blockss i))] - [d (in-list ds)]) - (if (eq? d 'cont) - fp - (traverse-block d fp)))) - - (define/public (traverse-itemization i fp) - (for/fold ([fp fp]) ([d (in-list (itemization-blockss i))]) - (traverse-flow d fp))) - - (define/public (traverse-nested-flow i fp) - (for/fold ([fp fp]) ([d (in-list (nested-flow-blocks i))]) - (traverse-block d fp))) - - (define/public (traverse-compound-paragraph i fp) - (for/fold ([fp fp]) ([d (in-list (compound-paragraph-blocks i))]) - (traverse-block d fp))) - - (define/public (traverse-content i fp) - (cond - [(traverse-element? i) (traverse-force fp i (traverse-element-traverse i) - (lambda (i fp) (traverse-content i fp)))] - [(element? i) (traverse-content (element-content i) fp)] - [(list? i) (for/fold ([fp fp]) ([c (in-list i)]) - (traverse-content c fp))] - [(multiarg-element? i) - (for/fold ([fp fp]) ([c (in-list (multiarg-element-contents i))]) - (traverse-content c fp))] - [else fp])) - - (define/private (traverse-force fp p proc again) - (let ([v (hash-ref fp p (lambda () proc))]) - (if (procedure? v) - (let ([fp fp]) - (let ([v2 (v (lambda (key default) - (if (eq? key 'scribble:current-render-mode) - (current-render-mode) - (hash-ref fp key default))) - (lambda (key val) - (if (eq? key 'scribble:current-render-mode) - (raise-mismatch-error - 'traverse-info-set! - "cannot set value for built-in key: " - key) - (set! fp (hash-set fp key val)))))]) - (let ([fp (hash-set fp p v2)]) - (if (procedure? v2) - fp - (again v2 fp))))) - fp))) - - ;; ---------------------------------------- - ;; global-info collection - - (define/public (collect ds fns fp [demand (lambda (key ci) #f)]) - (let ([ci (make-collect-info fp - (make-hash) - (make-hash) - (make-demand-chain (list demand)) - (make-hasheq) - (make-hasheq) - null - (make-hasheq) - null)]) - (start-collect ds fns ci) - ci)) - - (define/public (start-collect ds fns ci) - (for-each (lambda (d) (collect-part d #f ci null 1 #hash())) - ds)) - - (define/public (collect-part d parent ci number init-sub-number init-sub-numberers) - (let ([p-ci (make-collect-info - (collect-info-fp ci) - (make-hash) - (collect-info-ext-ht ci) - (collect-info-ext-demand ci) - (collect-info-parts ci) - (collect-info-tags ci) - (if (part-tag-prefix d) - (append (collect-info-gen-prefix ci) - (list (part-tag-prefix d))) - (collect-info-gen-prefix ci)) - (collect-info-relatives ci) - (cons d (collect-info-parents ci)))]) - (hash-set! (collect-info-parts ci) - d - (make-collected-info number - parent - (collect-info-ht p-ci))) - (define grouper? (and (pair? number) (part-style? d 'grouper))) - (define-values (next-sub-number next-sub-numberers) - (parameterize ([current-tag-prefixes - (extend-prefix d (fresh-tag-collect-context? d p-ci))]) - (when (part-title-content d) - (collect-content (part-title-content d) p-ci)) - (collect-part-tags d p-ci number) - (collect-content (part-to-collect d) p-ci) - (collect-flow (part-blocks d) p-ci) - (let loop ([parts (part-parts d)] - [pos init-sub-number] - [numberers init-sub-numberers] - [sub-pos 1] - [sub-numberers #hash()]) - (if (null? parts) - (values pos numberers) - (let ([s (car parts)]) - (define unnumbered? (part-style? s 'unnumbered)) - (define hidden-number? (or unnumbered? - (part-style? s 'hidden-number))) - (define sub-grouper? (part-style? s 'grouper)) - (define numberer (and (not unnumbered?) - (for/or ([p (style-properties (part-style s))] - #:when (numberer? p)) - p))) - (define-values (numberer-str next-numberers) - (if numberer - (numberer-step numberer number p-ci numberers) - (values #f numberers))) - (define-values (next-sub-pos next-sub-numberers) - (collect-part s d p-ci - (cons (if hidden-number? - (if sub-grouper? - "" - #f) - (if numberer - numberer-str - (if sub-grouper? - (number->roman pos) - pos))) - (if hidden-number? - (for/list ([i (in-list number)]) - (if (string? i) - i - #f)) - number)) - sub-pos - sub-numberers)) - (loop (cdr parts) - (if (or unnumbered? numberer) - pos - (add1 pos)) - next-numberers - (if sub-grouper? - next-sub-pos - 1) - (if sub-grouper? - next-sub-numberers - #hash()))))))) - (let ([prefix (part-tag-prefix d)]) - (for ([(k v) (collect-info-ht p-ci)]) - (when (cadr k) - (collect-put! ci (if prefix - (convert-key prefix k) - k) - v)))) - (values next-sub-number next-sub-numberers))) - - (define/private (convert-key prefix k) - (case (car k) - [(part tech cite) - (let ([rhs (cadr k)]) - (if (or (string? rhs) (pair? rhs)) - (list (car k) (cons prefix (if (pair? rhs) rhs (list rhs)))) - k))] - [(index-entry) - (let ([v (convert-key prefix (cadr k))]) - (if (eq? v (cadr k)) k (list 'index-entry v)))] - [else - (if (and (pair? (cadr k)) - (eq? 'prefixable (caadr k))) - (list (car k) (list* 'prefixable prefix (cdadr k))) - k)])) - - (define/public (collect-part-tags d ci number) - (for ([t (part-tags d)]) - (let ([t (generate-tag t ci)]) - (collect-put! ci - t - ;; INFO SHAPE: - ;; The HTML renderer defines its info as an - ;; extension of this vector's shape, so that - ;; other renderers can use HTML info. - (vector (or (part-title-content d) '("???")) - (add-current-tag-prefix t) - number))))) - - (define/public (collect-paragraph p ci) - (collect-content (paragraph-content p) ci)) - - (define/public (collect-flow p ci) - (for ([p (in-list p)]) - (collect-block p ci))) - - (define/public (collect-block p ci) - (cond [(table? p) (collect-table p ci)] - [(itemization? p) (collect-itemization p ci)] - [(nested-flow? p) (collect-nested-flow p ci)] - [(compound-paragraph? p) (collect-compound-paragraph p ci)] - [(delayed-block? p) (void)] - [(traverse-block? p) (collect-block (traverse-block-block p ci) ci)] - [else (collect-paragraph p ci)])) - - (define/public (collect-table i ci) - (for ([d (in-list (apply append (table-blockss i)))]) - (unless (eq? d 'cont) (collect-block d ci)))) - - (define/public (collect-itemization i ci) - (for ([d (in-list (itemization-blockss i))]) - (collect-flow d ci))) - - (define/public (collect-nested-flow i ci) - (for ([d (in-list (nested-flow-blocks i))]) - (collect-block d ci))) - - (define/public (collect-compound-paragraph i ci) - (for ([d (in-list (compound-paragraph-blocks i))]) - (collect-block d ci))) - - (define/public (collect-content i ci) - (if (part-relative-element? i) - (let ([content (or (hash-ref (collect-info-relatives ci) i #f) - (let ([v ((part-relative-element-collect i) ci)]) - (hash-set! (collect-info-relatives ci) i v) - v))]) - (collect-content content ci)) - (begin (when (target-element? i) (collect-target-element i ci)) - (when (index-element? i) (collect-index-element i ci)) - (when (collect-element? i) ((collect-element-collect i) ci)) - (when (element? i) - (collect-content (element-content i) ci)) - (when (multiarg-element? i) - (collect-content (multiarg-element-contents i) ci)) - (when (list? i) - (for ([e (in-list i)]) (collect-content e ci))) - (when (toc-element? i) - (collect-content (toc-element-toc-content i) ci)) - (when (toc-target2-element? i) - (collect-content (toc-target2-element-toc-content i) ci))))) - - (define/public (collect-target-element i ci) - (let ([t (generate-tag (target-element-tag i) ci)]) - (collect-put! ci t - ;; See "INFO SHAPE" above. - (vector (element-content i) - (add-current-tag-prefix t))))) - - (define/public (collect-index-element i ci) - (collect-put! ci - `(index-entry ,(generate-tag (index-element-tag i) ci)) - (list (index-element-plain-seq i) - (index-element-entry-seq i) - (index-element-desc i)))) - - ;; ---------------------------------------- - ;; global-info resolution - - (define/public (resolve ds fns ci) - (let ([ri (make-resolve-info ci (make-hasheq) (make-hash) (make-hash))]) - (start-resolve ds fns ri) - ri)) - - (define/public (start-resolve ds fns ri) - (map (lambda (d) (resolve-part d ri)) ds)) - - (define/public (resolve-part d ri) - (parameterize ([current-tag-prefixes - (extend-prefix d (fresh-tag-resolve-context? d ri))]) - (when (part-title-content d) - (resolve-content (part-title-content d) d ri)) - (resolve-flow (part-blocks d) d ri) - (for ([p (part-parts d)]) - (resolve-part p ri)))) - - (define/public (resolve-paragraph p d ri) - (resolve-content (paragraph-content p) d ri)) - - (define/public (resolve-flow f d ri) - (for ([p (in-list f)]) - (resolve-block p d ri))) - - (define/public (resolve-block p d ri) - (cond - [(table? p) (resolve-table p d ri)] - [(itemization? p) (resolve-itemization p d ri)] - [(nested-flow? p) (resolve-nested-flow p d ri)] - [(compound-paragraph? p) (resolve-compound-paragraph p d ri)] - [(delayed-block? p) - (let ([v ((delayed-block-resolve p) this d ri)]) - (hash-set! (resolve-info-delays ri) p v) - (resolve-block v d ri))] - [(traverse-block? p) (resolve-block (traverse-block-block p ri) d ri)] - [else (resolve-paragraph p d ri)])) - - (define/public (resolve-table i d ri) - (for ([f (in-list (apply append (table-blockss i)))]) - (unless (eq? f 'cont) (resolve-block f d ri)))) - - (define/public (resolve-itemization i d ri) - (for ([f (in-list (itemization-blockss i))]) - (resolve-flow f d ri))) - - (define/public (resolve-nested-flow i d ri) - (for ([f (in-list (nested-flow-blocks i))]) - (resolve-block f d ri))) - - (define/public (resolve-compound-paragraph i d ri) - (for ([f (in-list (compound-paragraph-blocks i))]) - (resolve-block f d ri))) - - (define/public (resolve-content i d ri) - (cond - [(part-relative-element? i) - (resolve-content (part-relative-element-content i ri) d ri)] - [(delayed-element? i) - (resolve-content (or (hash-ref (resolve-info-delays ri) i #f) - (let ([v ((delayed-element-resolve i) this d ri)]) - (hash-set! (resolve-info-delays ri) i v) - v)) - d ri)] - [(traverse-element? i) - (resolve-content (traverse-element-content i ri) d ri)] - [(list? i) - (for ([i (in-list i)]) - (resolve-content i d ri))] - [(element? i) - (cond - [(index-element? i) - (let ([e (index-element-desc i)]) - (when (delayed-index-desc? e) - (let ([v ((delayed-index-desc-resolve e) this d ri)]) - (hash-set! (resolve-info-delays ri) e v))))] - [(link-element? i) - (resolve-get d ri (link-element-tag i))]) - (resolve-content (element-content i) d ri) - (cond - [(toc-target2-element? i) (resolve-content (toc-target2-element-toc-content i) d ri)] - [(toc-element? i) (resolve-content (toc-element-toc-content i) d ri)])] - [(multiarg-element? i) - (resolve-content (multiarg-element-contents i) d ri)])) - - ;; ---------------------------------------- - ;; render methods - - (define/public (sort-image-requests reqs prefs) - (for/fold ([reqs reqs]) ([pref (in-list (reverse prefs))]) - (define matches - (for/list ([req (in-list reqs)] - #:when (case pref - [(png) (or (eq? req 'png@2x-bytes) - (eq? req 'png-bytes))] - [(svg) (eq? req 'svg-bytes)] - [(pdf) (eq? req 'pdf-bytes)] - [(ps) (eq? req 'eps-bytes)] - [(gif) (eq? req 'gif-bytes)] - [else #f])) - req)) - (if (null? matches) - reqs - (append matches (remove* matches reqs))))) - - (define/public (auto-extra-files? v) #f) - (define/public (auto-extra-files-paths v) null) - (define/public (skip-extra-file? v) #f) - - (define/public (install-extra-files ds) - (for ([fn extra-files]) - (unless (skip-extra-file? fn) - (install-file fn #:private-name? #f))) - (unless prefix-file - (for ([d (in-list ds)]) - (let ([extras (ormap (lambda (v) (and (auto-extra-files? v) v)) - (style-properties (part-style d)))]) - (when extras - (for ([fn (in-list (auto-extra-files-paths extras))]) - (unless (skip-extra-file? fn) - (install-file (collects-relative->path fn) - #:private-name? #f)))))))) - - (define/public (render ds fns ri) - ;; maybe this should happen even if fns is empty or all #f? - ;; or maybe it should happen for each file rendered (when d is not #f)? - (unless (andmap not ds) (install-extra-files ds)) - (map (lambda (d fn) - (define (one) (render-one d ri fn)) - (when (report-output?) (printf " [Output to ~a]\n" fn)) - (if fn - (with-output-to-file fn #:exists 'truncate/replace one) - ;; a #f filename means return the contents as a string - (let ([o (open-output-string)]) - (parameterize ([current-output-port o]) - (one) - (get-output-string o))))) - ds - fns)) - - (define/public (render-one d ri fn) - (render-part d ri)) - - (define/public (render-part d ri) - (parameterize ([current-tag-prefixes - (extend-prefix d (fresh-tag-render-context? d ri))]) - (render-part-content d ri))) - - (define/public (render-part-content d ri) - (list - (when (part-title-content d) - (render-content (part-title-content d) d ri)) - (render-flow (part-blocks d) d ri #f) - (map (lambda (s) (render-part s ri)) - (part-parts d)))) - - (define/public (render-paragraph p part ri) - (render-content (paragraph-content p) part ri)) - - (define/public (render-compound-paragraph p part ri starting-item?) - (apply append (let loop ([l (compound-paragraph-blocks p)] - [first? #t]) - (cond - [(null? l) null] - [else (cons - (render-intrapara-block (car l) part ri first? (null? (cdr l)) - (and first? starting-item?)) - (loop (cdr l) #f))])))) - - (define/public (render-flow p part ri starting-item?) - (if (null? p) - null - (append - (render-block (car p) - part ri starting-item?) - (apply append - (map (lambda (p) - (render-block p part ri #f)) - (cdr p)))))) - - (define/public (render-intrapara-block p part ri first? last? starting-item?) - (render-block p part ri starting-item?)) - - (define/public (render-block p part ri starting-item?) - (cond - [(table? p) (if (memq 'aux (style-properties (table-style p))) - (render-auxiliary-table p part ri) - (render-table p part ri starting-item?))] - [(itemization? p) (render-itemization p part ri)] - [(nested-flow? p) (render-nested-flow p part ri starting-item?)] - [(compound-paragraph? p) (render-compound-paragraph p part ri starting-item?)] - [(delayed-block? p) - (render-block (delayed-block-blocks p ri) part ri starting-item?)] - [(traverse-block? p) - (render-block (traverse-block-block p ri) part ri starting-item?)] - [else (render-paragraph p part ri)])) - - (define/public (render-auxiliary-table i part ri) - null) - - (define/public (render-table i part ri starting-item?) - (map (lambda (d) (if (eq? i 'cont) null (render-block d part ri #f))) - (apply append (table-blockss i)))) - - (define/public (render-itemization i part ri) - (map (lambda (d) (render-flow d part ri #t)) - (itemization-blockss i))) - - (define/public (render-nested-flow i part ri starting-item?) - (for/list ([b (in-list (nested-flow-blocks i))] - [pos (in-naturals)]) - (render-block b part ri (and starting-item? (zero? pos))))) - - (define/public (render-content i part ri) - (cond - [(string? i) (render-other i part ri)] ; short-cut for common case - [(list? i) - (apply append (for/list ([i (in-list i)]) (render-content i part ri)))] - [(and (link-element? i) - (null? (element-content i))) - (let ([v (resolve-get part ri (link-element-tag i))]) - (if v - (render-content (strip-aux (or (vector-ref v 0) "???")) part ri) - (render-content (list "[missing]") part ri)))] - [(element? i) - (when (render-element? i) - ((render-element-render i) this part ri)) - (render-content (element-content i) part ri)] - [(multiarg-element? i) - (render-content (multiarg-element-contents i) part ri)] - [(delayed-element? i) - (render-content (delayed-element-content i ri) part ri)] - [(traverse-element? i) - (render-content (traverse-element-content i ri) part ri)] - [(part-relative-element? i) - (render-content (part-relative-element-content i ri) part ri)] - [(convertible? i) (list "???")] - [else (render-other i part ri)])) - - (define/public (render-other i part ri) - (list i)) - - ;; ---------------------------------------- - - (define copied-srcs (make-hash)) - (define copied-dests (make-hash)) - - (define/public (install-file fn [content #f] #:private-name? [private-name? #t]) - (if (and refer-to-existing-files - (not content)) - (if (string? fn) - (string->path fn) - fn) - (let ([normalized (normal-case-path (simplify-path (path->complete-path fn)))]) - (or (and (not content) - (hash-ref copied-srcs normalized #f)) - (let ([src-dir (path-only fn)] - [dest-dir (get-dest-directory #t)] - [fn (file-name-from-path fn)]) - (let ([src-file (build-path (or src-dir (current-directory)) fn)] - [dest-file (build-path (or dest-dir (current-directory)) - (if (and private-name? - helper-file-prefix) - (string-append helper-file-prefix - (path-element->string fn)) - fn))] - [next-file-name (lambda (dest) - (let-values ([(base name dir?) (split-path dest)]) - (build-path - base - (let ([s (path-element->string (path-replace-suffix name #""))]) - (let ([n (regexp-match #rx"^(.*)_([0-9]+)$" s)]) - (format "~a_~a~a" - (if n (cadr n) s) - (if n (add1 (string->number (caddr n))) 2) - (let ([ext (filename-extension name)]) - (if ext - (bytes-append #"." ext) - ""))))))))]) - (let-values ([(dest-file normalized-dest-file) - (let loop ([dest-file dest-file]) - (let* ([normalized-dest-file - (normal-case-path (simplify-path (path->complete-path dest-file)))] - [check-same - (lambda (src dest-file) - (call-with-input-file* - dest-file - (lambda (dest) - (or (and (not content) - (equal? (port-file-identity src) - (port-file-identity dest))) - (let loop () - (let ([s (read-bytes 4096 src)] - [d (read-bytes 4096 dest)]) - (and (equal? s d) - (or (eof-object? s) (loop)))))))))] - [same-directories? - (lambda (s d) - (let loop ([s s] [d d]) - (cond - [(and (file-exists? s) (file-exists? d)) - (call-with-input-file* s (lambda (in) - (check-same in d)))] - [(directory-exists? s) - (and (directory-exists? d) - (let ([sl (sort (directory-list s) bytesbytes)] - [dl (sort (directory-list d) bytesbytes)]) - (and (equal? sl dl) - (andmap loop sl dl))))] - [else #f])))] - [not-same - (lambda (delete-dest) - (cond - [(hash-ref copied-dests normalized-dest-file #f) - ;; need a different file/directory - (loop (next-file-name dest-file))] - [else - ;; replace the file/directory - (delete-dest dest-file) - (values dest-file normalized-dest-file)]))]) - (cond - [(and (file-exists? src-file) - (file-exists? dest-file)) - (cond - [(or (and content - (check-same (open-input-bytes content) dest-file)) - (and (not content) - (call-with-input-file* src-file (lambda (in) (check-same in dest-file))))) - ;; same content at that destination - (values dest-file normalized-dest-file)] - [else - (not-same delete-file)])] - [(and (directory-exists? src-file) - (directory-exists? dest-file)) - (if (same-directories? src-file dest-file) - (values dest-file normalized-dest-file) - (not-same delete-directory/files))] - [(file-exists? dest-file) - (not-same delete-file)] - [(directory-exists? dest-file) - (not-same delete-directory/files)] - [else - ;; new file/directory - (values dest-file normalized-dest-file)])))]) - (unless (or (file-exists? dest-file) - (directory-exists? dest-file)) - (if content - (call-with-output-file* - dest-file - (lambda (dest) (write-bytes content dest))) - (if (directory-exists? src-file) - (copy-directory/files src-file dest-file) - (copy-file src-file dest-file)))) - (hash-set! copied-dests normalized-dest-file #t) - (let ([result (path->string (file-name-from-path dest-file))]) - (unless content - (hash-set! copied-srcs normalized result)) - result)))))))) - - ;; ---------------------------------------- - - (define/private (do-table-of-contents part ri delta quiet depth) - (make-table plain (generate-toc part - ri - (+ delta - (length (collected-info-number - (part-collected-info part ri)))) - #t - quiet - depth - null))) - - (define/public (table-of-contents part ri) - (do-table-of-contents part ri -1 not +inf.0)) - - (define/public (local-table-of-contents part ri style) - (do-table-of-contents part ri -1 not (if (eq? style 'immediate-only) - 1 - +inf.0))) - - (define/public (quiet-table-of-contents part ri) - (do-table-of-contents part ri 1 (lambda (x) #t) +inf.0)) - - (define/private (generate-toc part ri base-len skip? quiet depth prefixes) - (let* ([number (collected-info-number (part-collected-info part ri))] - [prefixes (if (part-tag-prefix part) - (cons (part-tag-prefix part) prefixes) - prefixes)] - [subs - (if (and (quiet (and (part-style? part 'quiet) - (not (= base-len (sub1 (length number)))))) - (positive? depth)) - (apply append (map (lambda (p) - (generate-toc p ri base-len (part-style? p 'toc-hidden) - quiet (sub1 depth) prefixes)) - (part-parts part))) - null)]) - (if skip? - subs - (let ([l (cons - (list (make-paragraph - plain - (list - (make-element - 'hspace - (list (make-string (* 2 (- (length number) - base-len)) - #\space))) - (make-link-element - (if (= 1 (length number)) "toptoclink" "toclink") - (append - (format-number - number - (list (make-element 'hspace '(" ")))) - (or (part-title-content part) '("???"))) - (for/fold ([t (car (part-tags part))]) - ([prefix (in-list prefixes)]) - (convert-key prefix t)))))) - subs)]) - (if (and (= 1 (length number)) - (or (not (car number)) - (and (number? (car number)) - ((car number) . > . 1)) - (and (string? (car number)) - (not (string=? (car number) "I"))))) - (cons (list (make-paragraph - plain - (list (make-element 'hspace (list ""))))) - l) - l))))) - - ;; ---------------------------------------- - - (super-new))) - - -;; ---------------------------------------- - -(define-struct demand-chain ([demands #:mutable]) - #:property prop:procedure (lambda (self key ci) - (for/or ([demand (in-list (demand-chain-demands self))]) - (demand key ci)))) - diff --git a/scribble-lib/scribble/base.rkt b/scribble-lib/scribble/base.rkt deleted file mode 100644 index 14102588..00000000 --- a/scribble-lib/scribble/base.rkt +++ /dev/null @@ -1,976 +0,0 @@ -#lang scheme/base - -(require "decode.rkt" - "core.rkt" - "manual-struct.rkt" - "decode-struct.rkt" - "html-properties.rkt" - "tag.rkt" - scheme/list - scheme/class - racket/contract/base - racket/contract/combinator - (for-syntax scheme/base)) - -(provide (all-from-out "tag.rkt")) - -;; ---------------------------------------- - -(define-syntax-rule (title-like-contract) - (->* () - (#:tag (or/c #f string? (listof string?)) - #:tag-prefix (or/c #f string? module-path?) - #:style (or/c style? string? symbol? (listof symbol?) #f)) - #:rest (listof pre-content?) - part-start?)) - -(provide/contract - [title (->* () - (#:tag (or/c #f string? (listof string?)) - #:tag-prefix (or/c #f string? module-path?) - #:style (or/c style? string? symbol? (listof symbol?) #f) - #:version (or/c string? #f) - #:date (or/c string? #f)) - #:rest (listof pre-content?) - title-decl?)] - [section (title-like-contract)] - [subsection (title-like-contract)] - [subsubsection (title-like-contract)] - [subsubsub*section (->* () - (#:tag (or/c #f string? (listof string?))) - #:rest (listof pre-content?) - block?)]) -(provide include-section) - -(define (gen-tag content) - (datum-intern-literal - (regexp-replace* "[^-a-zA-Z0-9_=]" (content->string content) "_"))) - -(define (prefix->string p) - (and p (if (string? p) - (datum-intern-literal p) - (module-path-prefix->string p)))) - -(define (convert-tag tag content) - (if (list? tag) - (append-map (lambda (t) (convert-tag t content)) tag) - `((part ,(or tag (gen-tag content)))))) - -(define (convert-part-style who s) - (cond - [(style? s) s] - [(not s) plain] - [(string? s) (make-style s null)] - [(symbol? s) (make-style #f (list s))] - [(and (list? s) (andmap symbol? s)) (make-style #f s)] - [else (raise-argument-error who "(or/c style? string? symbol? (listof symbol?) #f)" s)])) - -(define (title #:tag [tag #f] #:tag-prefix [prefix #f] #:style [style plain] - #:version [version #f] #:date [date #f] - . str) - (let ([content (decode-content str)]) - (make-title-decl (prefix->string prefix) - (convert-tag tag content) - version - (let ([s (convert-part-style 'title style)]) - (if date - (make-style (style-name s) - (cons (make-document-date date) - (style-properties s))) - s)) - content))) - -(define (section #:tag [tag #f] #:tag-prefix [prefix #f] #:style [style plain] - . str) - (let ([content (decode-content str)]) - (make-part-start 0 (prefix->string prefix) - (convert-tag tag content) - (convert-part-style 'section style) - content))) - -(define (subsection #:tag [tag #f] #:tag-prefix [prefix #f] #:style [style plain] - . str) - (let ([content (decode-content str)]) - (make-part-start 1 - (prefix->string prefix) - (convert-tag tag content) - (convert-part-style 'subsection style) - content))) - -(define (subsubsection #:tag [tag #f] #:tag-prefix [prefix #f] - #:style [style plain] . str) - (let ([content (decode-content str)]) - (make-part-start 2 - (prefix->string prefix) - (convert-tag tag content) - (convert-part-style 'subsubsection style) - content))) - -(define (subsubsub*section #:tag [tag #f] . str) - (let ([content (decode-content str)]) - (make-paragraph plain - (list - (make-element "SSubSubSubSection" - (if tag - (make-target-element #f content `(part ,tag)) - content)))))) - -(define-syntax (include-section stx) - (syntax-case stx () - [(_ mod) - (with-syntax ([doc-from-mod (datum->syntax #'mod 'doc)]) - (unless (module-path? (syntax->datum #'mod)) - (raise-syntax-error #f - "not a module path" - stx - #'mod)) - #'(begin - (require (only-in mod [doc-from-mod doc])) - doc))])) - -;; ---------------------------------------- - -(provide/contract - [author (->* (content?) () #:rest (listof content?) block?)] - [author+email (->* (content? string?) (#:obfuscate? any/c) element?)]) - -(define (author . auths) - (make-paragraph - (make-style 'author null) - (let ([nl (make-element 'newline '("\n"))]) - (case (length auths) - [(1) auths] - [(2) (list (car auths) nl "and " (cadr auths))] - [else (let ([r (reverse auths)]) - (append (add-between (reverse (cdr r)) - (make-element #f (list "," nl))) - (list "," nl "and " (car r))))])))) - -(define (author+email name email #:obfuscate? [obfuscate? #f]) - (make-element #f - (list - name - " <" - (if obfuscate? - (regexp-replace* #rx"[.]" - (regexp-replace* #rx"@" email " at ") - " dot ") - (hyperlink (string-append "mailto:" email) email)) - ">"))) - -;; ---------------------------------------- - -(define (item? x) (an-item? x)) - -(define recur-items/c - (make-flat-contract - #:name 'items/c - #:first-order (lambda (x) - ((flat-contract-predicate items/c) x)))) - -(define items/c (or/c item? - block? - (listof recur-items/c) - (spliceof recur-items/c))) - -(provide items/c) - -(provide/contract - [itemlist (->* () - (#:style (or/c style? string? symbol? #f)) - #:rest (listof items/c) - itemization?)] - [item (->* () - () - #:rest (listof pre-flow?) - item?)]) -(provide/contract - [item? (any/c . -> . boolean?)]) - -(define (itemlist #:style [style plain] . items) - (let ([flows (let loop ([items items]) - (cond - [(null? items) null] - [(item? (car items)) (cons (an-item-flow (car items)) - (loop (cdr items)))] - [(block? (car items)) (cons (list (car items)) - (loop (cdr items)))] - [(splice? (car items)) - (loop (append (splice-run (car items)) - (cdr items)))] - [else - (loop (append (car items) (cdr items)))]))]) - (make-itemization (convert-block-style style) flows))) - -(define-struct an-item (flow)) - -(define (item . str) - (make-an-item (decode-flow str))) - -;; ---------------------------------------- - -(provide ._ .__ ~ ?- -~-) - -(define ._ (make-element (make-style "Sendabbrev" null) ".")) -(define .__ (make-element (make-style "Sendsentence" null) ".")) -(define ~ "\uA0") -(define ?- "\uAD") -(define -~- "\u2011") - -;; ---------------------------------------- - -(define elem-like-contract - (->* () () #:rest (listof pre-content?) element?)) - -(provide/contract - [linebreak (-> element?)] - [nonbreaking elem-like-contract] - [hspace (-> exact-nonnegative-integer? element?)] - [elem (->* () - (#:style element-style?) - #:rest (listof pre-content?) - element?)] - [italic elem-like-contract] - [bold elem-like-contract] - [smaller elem-like-contract] - [larger elem-like-contract] - [emph elem-like-contract] - [tt elem-like-contract] - [subscript elem-like-contract] - [superscript elem-like-contract] - - [literal (->* (string?) () #:rest (listof string?) element?)] - - [image (->* ((or/c path-string? (cons/c 'collects (listof bytes?)))) - (#:scale real? - #:suffixes (listof (and/c string? #rx"^[.]")) - #:style element-style?) - #:rest (listof content?) - image-element?)]) - -(define hspace-cache (make-vector 100 #f)) - -(define (hspace n) - (if (n . < . (vector-length hspace-cache)) - (or (vector-ref hspace-cache n) - (let ([h (make-element 'hspace (list (make-string n #\space)))]) - (vector-set! hspace-cache n h) - h)) - (make-element 'hspace (list (make-string n #\space))))) - -(define (linebreak) - (make-element 'newline '("\n"))) - -(define (nonbreaking . str) - (make-element 'no-break (decode-content str))) - -(define (elem #:style [style plain] . str) - (make-element style (decode-content str))) - -(define (italic . str) - (make-element 'italic (decode-content str))) - -(define (bold . str) - (make-element 'bold (decode-content str))) - -(define (smaller . str) - (make-element 'smaller (decode-content str))) - -(define (larger . str) - (make-element 'larger (decode-content str))) - -(define (emph . str) - (make-element 'italic (decode-content str))) - -(define (tt . str) - (let* ([l (decode-content str)] - [l (let ([m (and (pair? l) - (string? (car l)) - (regexp-match-positions #rx"^ +" (car l)))]) - (if m - (list* (hspace (- (cdar m) (caar m))) - (substring (car l) (cdar m)) - (cdr l)) - l))]) - (if (andmap string? l) - (make-element 'tt l) - (make-element #f (map (lambda (s) - (if (or (string? s) (symbol? s)) - (make-element 'tt (list s)) - s)) - l))))) - -(define (span-class classname . str) - (make-element classname (decode-content str))) - -(define (subscript . str) - (make-element 'subscript (decode-content str))) - -(define (superscript . str) - (make-element 'superscript (decode-content str))) - -(define (literal s . strs) - (let ([s (apply string-append s strs)]) - (make-element #f s))) - -(define (image #:scale [scale 1.0] - filename-relative-to-source - #:suffixes [suffixes null] - #:style [style #f] - . alt) - (make-image-element style - (decode-content alt) - filename-relative-to-source - suffixes - scale)) - -;; ---------------------------------------- - -(define (cell-spec/c c) - (define rc - (recursive-contract (or/c c - empty - (cons/c rc rc)))) - rc) - -(provide/contract - [para (->* () - (#:style (or/c style? string? symbol? #f )) - #:rest (listof pre-content?) - paragraph?)] - [nested (->* () - (#:style (or/c style? string? symbol? #f )) - #:rest (listof pre-flow?) - nested-flow?)] - [compound (->* () - (#:style (or/c style? string? symbol? #f )) - #:rest (listof pre-flow?) - compound-paragraph?)] - [tabular (->* ((listof (listof (or/c 'cont block? content?)))) - (#:style (or/c style? string? symbol? #f) - #:sep (or/c content? block? #f) - #:column-properties (listof any/c) - #:row-properties (listof any/c) - #:cell-properties (listof (listof any/c))) - table?)]) - -(define (convert-block-style style) - (cond - [(style? style) style] - [(or (string? style) (symbol? style)) (make-style style null)] - [else plain])) - -(define (nested #:style [style #f] . c) - (make-nested-flow (convert-block-style style) - (decode-flow c))) - -(define (para #:style [style #f] . c) - (make-paragraph (convert-block-style style) - (decode-content c))) - -(define (compound #:style [style #f] . c) - (make-compound-paragraph (convert-block-style style) - (decode-flow c))) - -(define (tabular #:style [style #f] - #:sep [sep #f] - #:column-properties [column-properties null] - #:row-properties [row-properties null] - #:cell-properties [cell-properties null] - cells) - (define (nth-str pos) - (case (modulo pos 10) - [(1) "st"] - [(2) "nd"] - [(3) "rd"] - [else "th"])) - (unless (null? cells) - (let ([n (length (car cells))]) - (for ([row (in-list (cdr cells))] - [pos (in-naturals 2)]) - (unless (= n (length row)) - (raise-mismatch-error - 'tabular - (format "bad length (~a does not match first row's length ~a) for ~a~a row: " - (length row) - n - pos - (nth-str pos)) - row))))) - (for ([row (in-list cells)] - [pos (in-naturals 1)]) - (when (and (pair? row) (eq? (car row) 'cont)) - (raise-mismatch-error - 'tabular - (format "~a~a row starts with 'cont: " pos (nth-str pos)) - row))) - (make-table (let ([s (convert-block-style style)]) - (define n-orig-cols (if (null? cells) - 0 - (length (car cells)))) - (define n-cols (if sep - (max 0 (sub1 (* n-orig-cols 2))) - n-orig-cols)) - (define n-rows (length cells)) - (unless (null? cells) - (when ((length column-properties) . > . n-orig-cols) - (raise-mismatch-error - 'tabular - "column properties list is too long: " - column-properties))) - (when ((length row-properties) . > . n-rows) - (raise-mismatch-error - 'tabular - "row properties list is too long: " - row-properties)) - (when ((length cell-properties) . > . n-rows) - (raise-mismatch-error - 'tabular - "cell properties list is too long: " - cell-properties)) - (unless (null? cells) - (for ([row (in-list cell-properties)]) - (when ((length row) . > . n-orig-cols) - (raise-mismatch-error - 'tabular - "row list within cell properties list is too long: " - row)))) - ;; Expand given column and cell properties lists to match - ;; the dimensions of the given `cells` by duplicating - ;; the last element of a list as needed (and ignoring - ;; extra elements): - (define (make-full-column-properties column-properties) - (let loop ([column-properties column-properties] - [n 0] - [prev null]) - (cond - [(= n n-cols) null] - [(null? column-properties) - (if (or (zero? n) (not sep)) - (cons prev (loop null (add1 n) prev)) - (list* prev prev (loop null (+ n 2) prev)))] - [else - (define (to-list v) (if (list? v) v (list v))) - (define props (to-list (car column-properties))) - (define rest (loop (cdr column-properties) - (if (or (zero? n) (not sep)) - (add1 n) - (+ n 2)) - props)) - (if (or (zero? n) (not sep)) - (cons props rest) - (list* null props rest))]))) - (define full-column-properties - (make-full-column-properties column-properties)) - (define (make-full-cell-properties cell-properties) - (let loop ([cell-properties cell-properties] - [n 0] - [prev (make-list n-cols null)]) - (cond - [(= n n-rows) null] - [(null? cell-properties) - (cons prev (loop null (add1 n) prev))] - [else - (define props (make-full-column-properties (car cell-properties))) - (cons props - (loop (cdr cell-properties) - (add1 n) - props))]))) - (define full-cell-properties - (for/list ([c-row (in-list (make-full-cell-properties cell-properties))] - [r-row (in-list (make-full-cell-properties (map list row-properties)))]) - (for/list ([c (in-list c-row)] - [r (in-list r-row)]) - (append c r)))) - (define all-cell-properties - (and (or (pair? row-properties) - (pair? cell-properties)) - (if (null? column-properties) - full-cell-properties - (for/list ([row (in-list full-cell-properties)]) - (for/list ([cell (in-list row)] - [col (in-list full-column-properties)]) - (append cell col)))))) - (define all-column-properties - (and (pair? column-properties) - full-column-properties)) - ;; Will werge `cell-properties` and `column-properties` into - ;; `s`. Start by finding any existing `table-columns` - ;; and `table-cells` properties with the right number of - ;; styles: - (define props (style-properties s)) - (define tc (and all-column-properties - (let ([tc (ormap (lambda (v) (and (table-columns? v) v)) - props)]) - (if (and tc - (= (length (table-columns-styles tc)) - n-cols)) - tc - #f)))) - (define tl (and all-cell-properties - (let ([tl (ormap (lambda (v) (and (table-cells? v) v)) - props)]) - (if (and tl - (= (length (table-cells-styless tl)) - n-rows) - (andmap (lambda (cl) - (= (length cl) n-cols)) - (table-cells-styless tl))) - tl - #f)))) - ;; Merge: - (define (cons-maybe v l) (if v (cons v l) l)) - (make-style (style-name s) - (cons-maybe - (and all-column-properties - (table-columns - (if tc - (for/list ([ps (in-list all-column-properties)] - [cs (in-list (table-columns-styles tc))]) - (make-style (style-name cs) - (append ps (style-properties cs)))) - (for/list ([ps (in-list all-column-properties)]) - (make-style #f ps))))) - (cons-maybe - (and all-cell-properties - (table-cells - (if tl - (for/list ([pss (in-list all-cell-properties)] - [css (in-list (table-cells-styless tl))]) - (for/list ([ps (in-list pss)] - [cs (in-list css)]) - (make-style (style-name cs) - (append ps (style-properties cs))))) - (for/list ([pss (in-list all-cell-properties)]) - (for/list ([ps (in-list pss)]) - (make-style #f ps)))))) - (remq tc (remq tl props)))))) - ;; Process cells: - (map (lambda (row) - (define (cvt cell) - (cond - [(eq? cell 'cont) cell] - [(block? cell) cell] - [else (make-paragraph plain cell)])) - (define l (map cvt row)) - (if sep - (add-between/cont l (cvt sep)) - l)) - cells))) - -;; Like `add-between`, but change `sep` to 'cont when -;; adding before a 'cont: -(define (add-between/cont l sep) - (cond - [(null? l) null] - [(null? (cdr l)) l] - [else - (list* (car l) - (if (eq? 'cont (cadr l)) 'cont sep) - (add-between/cont (cdr l) sep))])) - -;; ---------------------------------------- - -(provide/contract - [elemtag (->* ((or/c tag? string?)) - () - #:rest (listof pre-content?) - element?)] - [elemref (->* ((or/c tag? string?)) - (#:underline? any/c) - #:rest (listof pre-content?) - element?)] - [secref (->* (string?) - (#:doc module-path? - #:tag-prefixes (or/c #f (listof string?)) - #:underline? any/c) - element?)] - [Secref (->* (string?) - (#:doc module-path? - #:tag-prefixes (or/c #f (listof string?)) - #:underline? any/c) - element?)] - [seclink (->* (string?) - (#:doc module-path? - #:tag-prefixes (or/c #f (listof string?)) - #:underline? any/c - #:indirect? any/c) - #:rest (listof pre-content?) - element?)] - [other-doc (->* (module-path?) - (#:underline? any/c - #:indirect (or/c #f content?)) - element?)]) - -(define (elemtag t . body) - (make-target-element #f (decode-content body) `(elem ,t))) -(define (elemref #:underline? [u? #t] t . body) - (make-link-element (if u? #f "plainlink") (decode-content body) `(elem ,t))) - -(define (secref s #:underline? [u? #t] #:doc [doc #f] #:tag-prefixes [prefix #f]) - (make-link-element (if u? #f "plainlink") null (make-section-tag s #:doc doc #:tag-prefixes prefix))) -(define (Secref s #:underline? [u? #t] #:doc [doc #f] #:tag-prefixes [prefix #f]) - (let ([le (secref s #:underline? u? #:doc doc #:tag-prefixes prefix)]) - (make-link-element - (make-style (element-style le) '(uppercase)) - (element-content le) - (link-element-tag le)))) - -(define normal-indirect (style #f '(indirect-link))) -(define plain-indirect (style "plainlink" '(indirect-link))) - -(define (seclink tag - #:doc [doc #f] - #:underline? [u? #t] - #:tag-prefixes [prefix #f] - #:indirect? [indirect? #f] - . s) - (make-link-element (if indirect? - (if u? - normal-indirect - plain-indirect) - (if u? - #f - "plainlink")) - (decode-content s) - `(part ,(doc-prefix doc prefix tag)))) - -(define (other-doc doc - #:underline? [u? #t] - #:indirect [indirect #f]) - (if indirect - (seclink "top" #:doc doc #:underline? u? #:indirect? #t - (list "the " indirect " documentation")) - (secref "top" #:doc doc #:underline? u?))) - -;; ---------------------------------------- - -(provide/contract - [hyperlink (->* ((or/c string? path?)) - (#:underline? any/c - #:style element-style?) - #:rest (listof pre-content?) - element?)] - [url (-> string? element?)] - [margin-note (->* () (#:left? any/c) #:rest (listof pre-flow?) block?)] - [margin-note* (->* () (#:left? any/c) #:rest (listof pre-content?) element?)] - [centered (->* () () #:rest (listof pre-flow?) block?)] - [verbatim (->* (content?) (#:indent exact-nonnegative-integer?) #:rest (listof content?) block?)]) - -(define (centered . s) - (make-nested-flow (make-style "SCentered" null) (decode-flow s))) - -(define (hyperlink url - #:underline? [underline? #t] - #:style [style (if underline? #f "plainlink")] - . str) - (make-element (make-style (if (style? style) - (style-name style) - style) - (cons (make-target-url url) - (if (style? style) - (style-properties style) - null))) - (decode-content str))) - -(define (url str) - (hyperlink str (make-element 'url str))) - -(define (margin-note #:left? [left? #f] . c) - (make-nested-flow - (make-style (if left? "refparaleft" "refpara") - '(command never-indents)) - (list - (make-nested-flow - (make-style (if left? "refcolumnleft" "refcolumn") - null) - (list - (make-nested-flow - (make-style "refcontent" null) - (decode-flow c))))))) - -(define (margin-note* #:left? [left? #f] . c) - (make-element - (make-style (if left? "refelemleft" "refelem") null) - (make-element - (make-style (if left? "refcolumnleft" "refcolumn") null) - (make-element - (make-style "refcontent" null) - (decode-content c))))) - -(define (verbatim #:indent [i 0] s . more) - (define lines - ;; Break input into a list of lists, where each inner - ;; list is a single line. Break lines on "\n" in the - ;; input strings, while non-string content is treated - ;; as an element within a line. - (let loop ([l (cons s more)] [strs null]) - (cond - [(null? l) (if (null? strs) - null - (map - list - (regexp-split - #rx"\n" - (apply string-append (reverse strs)))))] - [(string? (car l)) - (loop (cdr l) (cons (car l) strs))] - [else - (define post-lines (loop (cdr l) null)) - (define pre-lines (loop null strs)) - (define-values (post-line rest-lines) - (if (null? post-lines) - (values null null) - (values (car post-lines) (cdr post-lines)))) - (define-values (first-lines pre-line) - (if (null? pre-lines) - (values null null) - (values (drop-right pre-lines 1) - (last pre-lines)))) - (append first-lines - (list (append pre-line (list (car l)) post-line)) - rest-lines)]))) - (define (str->elts str) - ;; Convert a single string in a line to typewriter font, - ;; and also convert multiple adjacent spaces to `hspace` so - ;; that the space is preserved exactly: - (let ([spaces (regexp-match-positions #rx"(?:^| ) +" str)]) - (if spaces - (list* (make-element 'tt (substring str 0 (caar spaces))) - (hspace (- (cdar spaces) (caar spaces))) - (str->elts (substring str (cdar spaces)))) - (list (make-element 'tt (list str)))))) - (define (strs->elts line) - ;; Convert strings in the line: - (apply append (map (lambda (e) - (if (string? e) - (str->elts e) - (list e))) - line))) - (define indent - ;; Add indentation to a line: - (if (zero? i) - values - (let ([hs (hspace i)]) (lambda (line) (cons hs line))))) - (define (make-nonempty l) - ;; If a line has no content, then add a single space: - (if (let loop ([l l]) - (cond - [(null? l) #t] - [(equal? "" l) #t] - [(list? l) (andmap loop l)] - [(element? l) (loop (element-content l))] - [(multiarg-element? l) (loop (multiarg-element-contents l))] - [else #f])) - (list l (hspace 1)) - l)) - (define (make-line line) - ;; Convert a list of line elements --- a mixture of strings - ;; and non-strings --- to a paragraph for the line: - (let* ([line (indent (strs->elts line))]) - (list (make-paragraph omitable-style (make-nonempty line))))) - (make-table plain (map make-line lines))) - -(define omitable-style (make-style 'omitable null)) - -;; ---------------------------------------- - -; XXX unknown contract -(provide get-index-entries) -(provide/contract - [index-block (-> delayed-block?)] - [index (((or/c string? (listof string?))) () #:rest (listof pre-content?) . ->* . index-element?)] - [index* (((listof string?) (listof any/c)) () #:rest (listof pre-content?) . ->* . index-element?)] ; XXX first any/c wrong in docs - [as-index (() () #:rest (listof pre-content?) . ->* . index-element?)] - [section-index (() () #:rest (listof string?) . ->* . part-index-decl?)] - [index-section (() (#:tag (or/c false/c string?)) . ->* . part?)]) - -(define (section-index . elems) - (make-part-index-decl (map content->string elems) elems)) - -(define (record-index word-seq element-seq tag content) - (make-index-element #f - (list (make-target-element #f content `(idx ,tag))) - `(idx ,tag) - word-seq - element-seq - #f)) - -(define (index* word-seq content-seq . s) - (let ([key (make-generated-tag)]) - (record-index (map clean-up-index-string word-seq) - content-seq key (decode-content s)))) - -(define (index word-seq . s) - (let ([word-seq (if (string? word-seq) (list word-seq) word-seq)]) - (apply index* word-seq word-seq s))) - -(define (as-index . s) - (let ([key (make-generated-tag)] - [content (decode-content s)]) - (record-index - (list (clean-up-index-string (content->string content))) - (if (= 1 (length content)) content (list (make-element #f content))) - key - content))) - -(define (index-section #:title [title "Index"] #:tag [tag #f]) - (make-part #f - `((part ,(or tag "doc-index"))) - (list title) - (make-style 'index '(unnumbered)) - null - (list (index-block)) - null)) - -;; returns an ordered list of (list tag (text ...) (element ...) index-desc) -(define (get-index-entries sec ri) - (define (compare-lists xs ys ] - [(] - [else (loop (cdr ys) (cdr xs))]))) - ;; string-ci] - [else (case t1 ; equal to t2 - [(part) '=] ; will just compare tags - [(mod) '=] ; the text fields are the names of the modules - [(libs) (compare-lists (cdr d1) (cdr d2) lib] ; dosn't matter, will run again - [(#f) '=])]))) - (define (entry) #f] - [else (case (compare-desc e1 e2) - [(<) #t] [(>) #f] - [else (case (compare-lists text1 text2 string) #f] - [else - ;; (error 'get-index-entries - ;; ;; when this happens, revise this code so - ;; ;; ordering will always be deterministic - ;; "internal error -- unordered entries: ~e ~e" - ;; e1 e2) - ;; Instead, just compare the tags - (stringlist "ABCDEFGHIJKLMNOPQRSTUVWXYZ")) - (define (rows . rows) - (make-table (make-style 'index null) - (map (lambda (row) - (list (make-paragraph plain row))) - rows))) - (define contents - (lambda (renderer sec ri) - (define l (get-index-entries sec ri)) - (define manual-newlines? (send renderer index-manual-newlines?)) - (define alpha-starts (make-hasheq)) - (define alpha-row - (let loop ([i l] [alpha alpha]) - (define (add-letter let l) - (list* (make-element "nonavigation" (list (string let))) " " l)) - (cond [(null? alpha) null] - [(null? i) (add-letter (car alpha) (loop i (cdr alpha)))] - [else - (let* ([strs (cadr (car i))] - [letter (if (or (null? strs) (string=? "" (car strs))) - #f - (char-upcase (string-ref (car strs) 0)))]) - (cond [(not letter) (loop (cdr i) alpha)] - [(char-ci>? letter (car alpha)) - (add-letter (car alpha) (loop i (cdr alpha)))] - [(char-ci=? letter (car alpha)) - (hash-set! alpha-starts (car i) letter) - (list* (make-element - (make-style #f (list (make-target-url (format "#alpha:~a" letter)))) - (list (string (car alpha)))) - " " - (loop (cdr i) (cdr alpha)))] - [else (loop (cdr i) alpha)]))]))) - (define body - (let ([br (if manual-newlines? (make-element 'newline '("\n")) "")]) - (map (lambda (i) - (let ([e (make-link-element - "indexlink" - `(,@(add-between (caddr i) ", ") ,br) - (car i))]) - (cond [(hash-ref alpha-starts i #f) - => (lambda (let) - (make-element - (make-style #f (list - (make-url-anchor - (format "alpha:~a" (char-upcase let))))) - (list e)))] - [else e]))) - l))) - (if manual-newlines? - (rows alpha-row '(nbsp) body) - (apply rows alpha-row '(nbsp) (map list body))))) - (make-delayed-block contents)) - -;; ---------------------------------------- - -(provide/contract - [table-of-contents (-> delayed-block?)] - [local-table-of-contents (() - (#:style (or/c style? string? symbol? (listof symbol?) #f)) - . ->* . delayed-block?)]) - -(define (table-of-contents) - (make-delayed-block - (lambda (renderer part ri) - (send renderer table-of-contents part ri)))) - -(define (local-table-of-contents #:style [style plain]) - (make-delayed-block - (lambda (renderer part ri) - (send renderer local-table-of-contents part ri style)))) diff --git a/scribble-lib/scribble/base/lang.rkt b/scribble-lib/scribble/base/lang.rkt deleted file mode 100644 index a9642769..00000000 --- a/scribble-lib/scribble/base/lang.rkt +++ /dev/null @@ -1,4 +0,0 @@ -#lang racket/base -(require scribble/doclang scribble/base) -(provide (all-from-out scribble/doclang - scribble/base)) diff --git a/scribble-lib/scribble/base/lang/reader.rkt b/scribble-lib/scribble/base/lang/reader.rkt deleted file mode 100644 index 9c2b200c..00000000 --- a/scribble-lib/scribble/base/lang/reader.rkt +++ /dev/null @@ -1,3 +0,0 @@ -#lang s-exp scribble/base/reader -scribble/base/lang -#:wrapper1 (lambda (t) (list* 'doc 'values '() (t))) diff --git a/scribble-lib/scribble/basic.rkt b/scribble-lib/scribble/basic.rkt deleted file mode 100644 index 43ccbbc6..00000000 --- a/scribble-lib/scribble/basic.rkt +++ /dev/null @@ -1,46 +0,0 @@ -#lang scheme/base - -(require "base.rkt" - "core.rkt" - "decode.rkt") - -(provide title - section - subsection - subsubsection - subsubsub*section - include-section - - author - author+email - - intern-taglet - module-path-index->taglet - module-path-prefix->string - - itemize item item? - - hspace - elem aux-elem - italic bold smaller - tt - subscript superscript - - section-index index index* as-index index-section - get-index-entries index-block - - table-of-contents - local-table-of-contents - - span-class) - -(define (span-class classname . str) - (make-element classname (decode-content str))) - -(define (aux-elem . s) - (make-element (make-style #f (list 'aux)) (decode-content s))) - -(define (itemize #:style [style #f] . items) - (let ([items (filter (lambda (v) (not (whitespace? v))) items)]) - (apply itemlist #:style style items))) - diff --git a/scribble-lib/scribble/blueboxes.rkt b/scribble-lib/scribble/blueboxes.rkt deleted file mode 100644 index 5e42a123..00000000 --- a/scribble-lib/scribble/blueboxes.rkt +++ /dev/null @@ -1,198 +0,0 @@ -#lang typed/racket/base -(require racket/match) -(require/typed setup/dirs [get-doc-search-dirs (-> (Listof Path))]) -(require/typed racket/serialize [deserialize (Any -> Any)]) -(require/typed scribble/core [#:opaque Tag tag?]) -(require/typed scribble/tag - [#:opaque Method-Tag method-tag?] - [#:opaque Definition-Tag definition-tag?] - [#:opaque Class/Interface-Tag class/interface-tag?] - [class/interface-tag->constructor-tag (Class/Interface-Tag -> Tag)] - [definition-tag->class/interface-tag (Definition-Tag -> Class/Interface-Tag)] - [get-class/interface-and-method (Method-Tag -> (values Symbol Symbol))] - ) -(require/typed "valid-blueboxes-info.rkt" [valid-blueboxes-info? (Any -> Boolean)]) - -(provide fetch-blueboxes-strs - make-blueboxes-cache - blueboxes-cache? - fetch-blueboxes-method-tags - ) - -(define-type Bluebox-Info bluebox-info) -(struct bluebox-info - ([blueboxes.rktd : Path-String] - [offset : (U Natural #f)] - [tag-ht : (U Blueboxes-Info-Hash #f)] ; (or/c valid-blueboxes-info? #f) - [mod-time : (U Natural #f)]) - #:mutable) - -(define-type Blueboxes-Cache blueboxes-cache) -(struct blueboxes-cache - ([info-or-paths : (U (Listof Path) (Listof Bluebox-Info))] - [method->tags : (U (HashTable Symbol (Listof Method-Tag)) #f)]) - #:mutable) - -(: make-blueboxes-cache : - Boolean - [#:blueboxes-dirs (Listof Path)] - -> - Blueboxes-Cache) -(define (make-blueboxes-cache - populate? - #:blueboxes-dirs - [blueboxes-dirs (for*/list ([d (in-list (get-doc-search-dirs))] - [c (in-list (if (directory-exists? d) - (directory-list d) - '()))]) - : (Listof Path) - (build-path d c))]) - (define cache (blueboxes-cache blueboxes-dirs #f)) - (when populate? (populate-cache! cache)) - cache) - -(: fetch-blueboxes-strs : - Tag - [#:blueboxes-cache Blueboxes-Cache] - -> - (U #f (List* String (Listof String)))) -(define (fetch-blueboxes-strs tag #:blueboxes-cache [cache (make-blueboxes-cache #f)]) - (define plain-strs (fetch-strs-for-single-tag tag cache)) - (cond - [(and plain-strs (definition-tag? tag)) - (define constructor-strs - (fetch-strs-for-single-tag - (class/interface-tag->constructor-tag - (definition-tag->class/interface-tag tag)) - cache)) - (append plain-strs - (if constructor-strs '("") '()) - (if constructor-strs (cdr constructor-strs) '()))] - [else plain-strs])) - -(: fetch-strs-for-single-tag : Tag Blueboxes-Cache -> (U #f (List* String (Listof String)))) -(define (fetch-strs-for-single-tag tag cache) - (populate-cache! cache) - (for/or ([ent (in-list (blueboxes-cache-info-or-paths cache))]) - : (U #f (List* String (Listof String))) - (when (bluebox-info? ent) - (check-and-update-bluebox-info! ent)) - (match ent - [(bluebox-info blueboxes.rktd offset tag-ht _) - (define offset+lens (and tag-ht (hash-ref tag-ht tag #f))) - (cond - [offset+lens - (define lines - (apply - append - (for/list ([offset+len (in-list offset+lens)]) - : (Listof (Listof (U String EOF))) - (call-with-input-file blueboxes.rktd - (λ ([port : Input-Port]) - (port-count-lines! port) - (file-position port (+ (car offset+len) (or offset 0))) - (for/list ([i (in-range (cdr offset+len))]) - : (Listof (U String EOF)) - (read-line port))))))) - (cond - [(not (andmap string? lines)) #f] - [(null? lines) #f] - [else lines])] - [else #f])] - [_ (log-warning "expected bluebox-info?, given: ~v" ent) - #f]))) - -(: fetch-blueboxes-method-tags : Symbol [#:blueboxes-cache Blueboxes-Cache] -> (Listof Method-Tag)) -(define (fetch-blueboxes-method-tags sym #:blueboxes-cache [cache (make-blueboxes-cache #f)]) - (populate-cache! cache) - (define ht (blueboxes-cache-method->tags cache)) - (or (and ht (hash-ref ht sym (λ () '()))) '())) - -(define listof-path? (make-predicate (Listof Path))) - -(: populate-cache! : Blueboxes-Cache -> Void) -(define (populate-cache! cache) - (define cache-content (blueboxes-cache-info-or-paths cache)) - (when (listof-path? cache-content) - (define the-cache (build-blueboxes-cache cache-content)) - (define mtd-table (compute-methods-table the-cache)) - (set-blueboxes-cache-method->tags! cache mtd-table) - (set-blueboxes-cache-info-or-paths! cache the-cache))) - -(: compute-methods-table : (Listof Bluebox-Info) -> (HashTable Symbol (Listof Method-Tag))) -(define (compute-methods-table lst) - (: meth-ht : (HashTable Symbol (Listof Method-Tag))) - (define meth-ht (make-hash)) - (for ([a-bluebox-info (in-list lst)]) - (match a-bluebox-info - [(bluebox-info blueboxes.rktd offset tag-ht mod-time) - (when tag-ht - (for ([(tag val) (in-hash tag-ht)]) - (when (method-tag? tag) - (define-values (class/intf meth) (get-class/interface-and-method tag)) - (hash-set! meth-ht meth (cons tag (hash-ref meth-ht meth (λ () '())))))))])) - meth-ht) - -(: build-blueboxes-cache : (Listof Path) -> (Listof Bluebox-Info)) -(define (build-blueboxes-cache blueboxes-dirs) - (filter - values - (for*/list ([doc-dir-name (in-list blueboxes-dirs)]) - : (Listof Bluebox-Info) - (define blueboxes.rktd (build-path doc-dir-name "blueboxes.rktd")) - (define a-bluebox-info (bluebox-info blueboxes.rktd #f #f #f)) - (populate-bluebox-info! a-bluebox-info) - a-bluebox-info))) - -(: check-and-update-bluebox-info! : bluebox-info -> Void) -(define (check-and-update-bluebox-info! a-bluebox-info) - (match a-bluebox-info - [(bluebox-info blueboxes.rktd offset tag-ht mod-time) - (when (or (not mod-time) - (and (file-exists? blueboxes.rktd) - (not (mod-time . = . (file-or-directory-modify-seconds blueboxes.rktd))))) - (populate-bluebox-info! a-bluebox-info))])) - -(: populate-bluebox-info! : Bluebox-Info -> Void) -(define (populate-bluebox-info! a-bluebox-info) - (define blueboxes.rktd (bluebox-info-blueboxes.rktd a-bluebox-info)) - (cond - [(file-exists? blueboxes.rktd) - (call-with-input-file blueboxes.rktd - (λ ([port : Input-Port]) - (port-count-lines! port) - (define first-line (read-line port)) - (define pos (file-position port)) - (define desed - (with-handlers ([exn:fail? (λ ([x : exn:fail]) - (log-warning "Failed to deserialize ~a: ~a" - x - (exn-message x)) - #f)]) - (define candidate (deserialize (read port))) - (unless (valid-blueboxes-info? candidate) - (error 'build-blueboxes-cache - "blueboxes info didn't have the right shape: ~s" - candidate)) - (cast candidate Blueboxes-Info-Hash))) - (define first-line-num (and (string? first-line) (string->number first-line))) - (cond - [(exact-nonnegative-integer? first-line-num) - (set-bluebox-info-offset! a-bluebox-info (+ first-line-num pos))] - [else - (log-warning "expected a string representing a Natuaral\n given: ~v" - first-line-num)]) - (set-bluebox-info-tag-ht! a-bluebox-info desed) - (set-bluebox-info-mod-time! a-bluebox-info - (file-or-directory-modify-seconds blueboxes.rktd))))] - [else - (set-bluebox-info-offset! a-bluebox-info #f) - (set-bluebox-info-tag-ht! a-bluebox-info #f) - (set-bluebox-info-mod-time! a-bluebox-info #f)])) - -(define-type Blueboxes-Info-Hash - (HashTable - Tag - (Listof (Pairof Natural - Natural)))) - diff --git a/scribble-lib/scribble/bnf.rkt b/scribble-lib/scribble/bnf.rkt deleted file mode 100644 index 91af03e6..00000000 --- a/scribble-lib/scribble/bnf.rkt +++ /dev/null @@ -1,93 +0,0 @@ -(module bnf racket - (require "struct.rkt" - "decode.rkt" - (only-in "core.rkt" - make-style - make-table-columns) - mzlib/kw) - - (provide BNF - nonterm - BNF-seq BNF-seq-lines - BNF-alt BNF-alt/close ; single-line alternatives - BNF-etc - BNF-group - optional kleenestar kleeneplus kleenerange) - - (define spacer (make-element 'hspace (list " "))) - (define equals (make-element 'tt (list spacer "::=" spacer))) - (define alt (make-element 'tt (list spacer spacer "|" spacer spacer))) - - (define (as-flow i) (make-flow (list (if (block? i) - i - (make-paragraph (list i)))))) - - - (define baseline (make-style #f '(baseline))) - - (define (BNF . defns) - (make-table - (make-style #f - (list - (make-table-columns - (list baseline baseline baseline baseline)))) - (apply - append - (map (lambda (defn) - (cons - (list (as-flow spacer) (as-flow (car defn)) (as-flow equals) (as-flow (cadr defn))) - (map (lambda (i) - (list (as-flow spacer) (as-flow " ") (as-flow alt) (as-flow i))) - (cddr defn)))) - defns)))) - - (define (interleave l spacer) - (make-element #f (cons (car l) - (apply append - (map (lambda (i) - (list spacer i)) - (cdr l)))))) - - (define (BNF-seq . l) - (if (null? l) - "" - (interleave l spacer))) - - (define (BNF-seq-lines . l) - (make-table #f (map (lambda (row) (list (as-flow (apply BNF-seq row)))) - l))) - - (define (BNF-alt . l) - (interleave l alt)) - - (define (BNF-alt/close . l) - (interleave l (make-element 'roman " | "))) - - (define BNF-etc (make-element 'roman "...")) - - (define/kw (nonterm #:body s) - (make-element 'roman (append (list 'lang) - (list (make-element 'italic (decode-content s))) - (list 'rang)))) - - (define/kw (optional #:body s) - (make-element #f (append (list (make-element 'roman "[")) - (decode-content s) - (list (make-element 'roman "]"))))) - - (define/kw (BNF-group #:body s) - (make-element #f (append (list (make-element 'roman "{")) - (list (apply BNF-seq (decode-content s))) - (list (make-element 'roman "}"))))) - - (define/kw (kleenestar #:body s) - (make-element #f (append (decode-content s) (list (make-element 'roman "*"))))) - - (define/kw (kleeneplus #:body s) - (make-element #f (append (decode-content s) (list (make-element 'superscript (list "+")))))) - - (define/kw (kleenerange a b #:body s) - (make-element #f (append (decode-content s) - (list (make-element 'roman - (make-element 'superscript - (list (format "{~a,~a}" a b))))))))) diff --git a/scribble-lib/scribble/book/lang.rkt b/scribble-lib/scribble/book/lang.rkt deleted file mode 100644 index 800fd01a..00000000 --- a/scribble-lib/scribble/book/lang.rkt +++ /dev/null @@ -1,20 +0,0 @@ -#lang racket/base -(require scribble/doclang - scribble/base - "../private/defaults.rkt" - scribble/latex-prefix) - -(provide (except-out (all-from-out scribble/doclang) #%module-begin) - (all-from-out scribble/base) - (rename-out [module-begin #%module-begin])) - -(define-syntax-rule (module-begin id . body) - (#%module-begin id (post-process) () . body)) - -(define ((post-process) doc) - (add-defaults doc - (string->bytes/utf-8 (string-append "\\documentclass{book}\n" - unicode-encoding-packages)) - (scribble-file "book/style.tex") - null - #f)) diff --git a/scribble-lib/scribble/book/lang/reader.rkt b/scribble-lib/scribble/book/lang/reader.rkt deleted file mode 100644 index ada58ad9..00000000 --- a/scribble-lib/scribble/book/lang/reader.rkt +++ /dev/null @@ -1,3 +0,0 @@ -#lang s-exp scribble/base/reader -scribble/book/lang -#:wrapper1 (lambda (t) (cons 'doc (t))) diff --git a/scribble-lib/scribble/book/style.tex b/scribble-lib/scribble/book/style.tex deleted file mode 100644 index f70c1f21..00000000 --- a/scribble-lib/scribble/book/style.tex +++ /dev/null @@ -1,47 +0,0 @@ -% This style file is used both for `book' and `report' modes - -\renewcommand{\ChapRef}[2]{chapter~#1} -\renewcommand{\ChapRefUC}[2]{Chapter~#1} - -% sections -\renewcommand{\Spart}[2]{\part[#1]{#2}} -\renewcommand{\Ssection}[2]{\chapter[#1]{#2}} -\renewcommand{\Ssubsection}[2]{\section[#1]{#2}} -\renewcommand{\Ssubsubsection}[2]{\subsection[#1]{#2}} -\renewcommand{\Ssubsubsubsection}[2]{\subsubsection[#1]{#2}} -\renewcommand{\Ssubsubsubsubsection}[2]{{\bf #2}} - -% "star" means unnumbered and not in ToC: -\renewcommand{\Spartstar}[1]{\part*{#1}} -\renewcommand{\Ssectionstar}[1]{\chapter*{#1}} -\renewcommand{\Ssubsectionstar}[1]{\section*{#1}} -\renewcommand{\Ssubsubsectionstar}[1]{\subsection*{#1}} -\renewcommand{\Ssubsubsubsectionstar}[1]{\subsubsection*{#1}} -\renewcommand{\Ssubsubsubsubsectionstar}[1]{\Ssubsubsubsubsection{#1}} - -% "starx" means unnumbered but in ToC: -\renewcommand{\Spartstarx}[2]{\Spartstar{#2}\addcontentsline{toc}{part}{#1}} -\renewcommand{\Ssectionstarx}[2]{\Ssectionstar{#2}\addcontentsline{toc}{chapter}{#1}} -\renewcommand{\Ssubsectionstarx}[2]{\Ssubsectionstar{#2}\addcontentsline{toc}{section}{#1}} -\renewcommand{\Ssubsubsectionstarx}[2]{\Ssubsubsectionstar{#2}\addcontentsline{toc}{subsection}{#1}} -\renewcommand{\Ssubsubsubsectionstarx}[2]{\Ssubsubsubsectionstar{#2}\addcontentsline{toc}{subsubsection}{#1}} -\renewcommand{\Ssubsubsubsubsectionstarx}[2]{\Ssubsubsubsubsectionstar{#2}} - -% "grouper" is for the 'grouper style variant: -\renewcommand{\Ssubsectiongrouper}[2]{\setcounter{GrouperTemp}{\value{section}}\Ssubsectionstarx{#1}{#2}\setcounter{section}{\value{GrouperTemp}}} -\renewcommand{\Ssubsubsectiongrouper}[2]{\setcounter{GrouperTemp}{\value{subsection}}\Ssubsubsectionstarx{#1}{#2}\setcounter{subsection}{\value{GrouperTemp}}} -\renewcommand{\Ssubsubsubsectiongrouper}[2]{\setcounter{GrouperTemp}{\value{subsubsection}}\Ssubsubsectionstarx{#1}{#2}\setcounter{subsubsection}{\value{GrouperTemp}}} -\renewcommand{\Ssubsubsubsubsectiongrouper}[2]{\Ssubsubsubsubsectionstarx{#1}{#2}} - -\renewcommand{\Ssubsectiongrouperstar}[1]{\setcounter{GrouperTemp}{\value{section}}\Ssubsectionstar{#1}\setcounter{section}{\value{GrouperTemp}}} -\renewcommand{\Ssubsubsectiongrouperstar}[1]{\setcounter{GrouperTemp}{\value{subsection}}\Ssubsubsectionstar{#1}\setcounter{subsection}{\value{GrouperTemp}}} -\renewcommand{\Ssubsubsubsectiongrouperstar}[1]{\setcounter{GrouperTemp}{\value{subsubsection}}\Ssubsubsectionstar{#1}\setcounter{subsubsection}{\value{GrouperTemp}}} -\renewcommand{\Ssubsubsubsubsectiongrouperstar}[1]{\Ssubsubsubsubsectionstar{#1}} - -% To increments section numbers: -\renewcommand{\Sincpart}{\stepcounter{part}} -\renewcommand{\Sincsection}{\stepcounter{chapter}} -\renewcommand{\Sincsubsection}{\stepcounter{section}} -\renewcommand{\Sincsubsubsection}{\stepcounter{subsection}} -\renewcommand{\Sincsubsubsubsection}{\stepcounter{subsubsection}} - diff --git a/scribble-lib/scribble/comment-reader.rkt b/scribble-lib/scribble/comment-reader.rkt deleted file mode 100644 index 049e8015..00000000 --- a/scribble-lib/scribble/comment-reader.rkt +++ /dev/null @@ -1,83 +0,0 @@ -(module comment-reader scheme/base - (require (only-in racket/port peeking-input-port)) - - (provide (rename-out [*read read] - [*read-syntax read-syntax]) - make-comment-readtable) - - (define unsyntaxer (make-parameter 'unsyntax)) - - (define (*read [inp (current-input-port)]) - (parameterize ([unsyntaxer (read-unsyntaxer inp)] - [current-readtable (make-comment-readtable)]) - (read/recursive inp))) - - (define (*read-syntax src [port (current-input-port)]) - (parameterize ([unsyntaxer (read-unsyntaxer port)] - [current-readtable (make-comment-readtable)]) - (read-syntax/recursive src port))) - - (define (read-unsyntaxer port) - (let ([p (peeking-input-port port)]) - (if (eq? (read p) '#:escape-id) - (begin (read port) (read port)) - 'unsyntax))) - - (define (make-comment-readtable #:readtable [rt (current-readtable)]) - (make-readtable rt - #\; 'terminating-macro - (case-lambda - [(char port) - (do-comment port (lambda () (read/recursive port #\@)))] - [(char port src line col pos) - (let ([v (do-comment port (lambda () (read-syntax/recursive src port #\@)))]) - (let-values ([(eline ecol epos) (port-next-location port)]) - (datum->syntax - #f - v - (list src line col pos (and pos epos (- epos pos))))))]))) - - (define (do-comment port recur) - (let loop () - (when (equal? #\; (peek-char port)) - (read-char port) - (loop))) - (when (equal? #\space (peek-char port)) - (read-char port)) - `(code:comment - (,(unsyntaxer) - (t - ,@(append-strings - (let loop () - (let ([c (read-char port)]) - (cond - [(or (eof-object? c) - (char=? c #\newline)) - null] - [(char=? c #\@) - (cons (recur) (loop))] - [else - (cons (string c) - (loop))])))))))) - - (define (append-strings l) - (let loop ([l l][s null]) - (cond - [(null? l) (if (null? s) - null - (preserve-space (apply string-append (reverse s))))] - [(string? (car l)) - (loop (cdr l) (cons (car l) s))] - [else - (append (loop null s) - (cons - (car l) - (loop (cdr l) null)))]))) - - (define (preserve-space s) - (let ([m (regexp-match-positions #rx" +" s)]) - (if m - (append (preserve-space (substring s 0 (caar m))) - (list `(hspace ,(- (cdar m) (caar m)))) - (preserve-space (substring s (cdar m)))) - (list s))))) diff --git a/scribble-lib/scribble/config.rkt b/scribble-lib/scribble/config.rkt deleted file mode 100644 index 5822c588..00000000 --- a/scribble-lib/scribble/config.rkt +++ /dev/null @@ -1,6 +0,0 @@ - -(module config mzscheme - - (provide value-color) - - (define value-color "schemevalue")) diff --git a/scribble-lib/scribble/contract-render.rkt b/scribble-lib/scribble/contract-render.rkt deleted file mode 100644 index 6785cae5..00000000 --- a/scribble-lib/scribble/contract-render.rkt +++ /dev/null @@ -1,185 +0,0 @@ -#lang racket/base -(require racket/class racket/match - (prefix-in text: "text-render.rkt") - "base-render.rkt" - "core.rkt" - file/convertible - racket/serialize) -(provide override-render-mixin-single - override-render-mixin-multi) - -(define (override-render-mixin multi?) - (mixin (render<%>) () - (super-new) - (define/override (render srcs dests ri) - (super render srcs dests ri) - - (for ([part (in-list srcs)] - [dest (in-list dests)]) - (define p (open-output-string)) - (define index-table (make-hash)) - (port-count-lines! p) - (parameterize ([the-renderer text-renderer] - [the-part part] - [the-ri ri] - [the-text-p p]) - (r-part part 'block index-table)) - (define table-str (format "~s\n" (serialize index-table))) - (define cb.rktd - (cond - [multi? - (build-path dest "blueboxes.rktd")] - [else - (define-values (base name dir?) (split-path dest)) - (build-path base "blueboxes.rktd")])) - (call-with-output-file cb.rktd - (λ (port) - (fprintf port "~a\n" (string-utf-8-length table-str)) - (display table-str port) - (display (get-output-string p) port)) - #:exists 'truncate))) - - (inherit get-dest-directory) - (define text-renderer (new (text:render-mixin render%) - [dest-dir (get-dest-directory)])))) - -(define the-renderer (make-parameter #f)) -(define the-part (make-parameter #f)) -(define the-ri (make-parameter #f)) -(define the-text-p (make-parameter #f)) - -;; mode is either -;; 'block -- search for the blue blocks -;; or (cons number number) -- search for tags in a block -(define (r-parts parts mode index-table) - (for ([part (in-list parts)]) - (r-part part mode index-table))) - -(define (r-part part mode index-table) - (r-blocks (part-blocks part) mode index-table) - (r-parts (part-parts part) mode index-table)) - -(define (r-blocks blocks mode index-table) - (for ([block (in-list blocks)]) - (r-block block mode index-table))) - -(define (r-block block mode index-table) - (match block - [(struct nested-flow (style blocks)) - (check-and-continue style block mode index-table r-blocks blocks)] - [(struct compound-paragraph (style blocks)) - (check-and-continue style block mode index-table r-blocks blocks)] - [(paragraph style content) - (check-and-continue style block mode index-table r-content content)] - [(itemization style blockss) - (check-and-continue style block mode index-table r-blockss blockss)] - [(table style cells) - (check-and-continue style block mode index-table r-blockss+cont cells)] - [(delayed-block resolve) - (r-block (delayed-block-blocks block (the-ri)) mode index-table)] - [(traverse-block _) - (r-block (traverse-block-block block (the-ri)) mode index-table)])) - -(define (check-and-continue style block mode index-table sub-f sub-p) - (cond - [(and (pair? mode) (equal? (style-name style) "RBackgroundLabelInner")) - (define background-label-port (car mode)) - (parameterize ([current-output-port background-label-port]) - (send (the-renderer) render-block block (the-part) (the-ri) #f)) - (sub-f sub-p mode index-table)] - [(and (eq? mode 'block) (eq? (style-name style) 'boxed) (table? block)) - (cond - [(for/and ([cells (in-list (table-blockss block))]) - (and (not (null? cells)) - (null? (cdr cells)) - (let ([fst (car cells)]) - (and (table? fst) - (equal? (style-name (table-style fst)) "together"))))) - (for ([cells (in-list (table-blockss block))]) - (handle-one-block style (car cells) mode index-table r-block (car cells)))] - [else - (handle-one-block style block mode index-table sub-f sub-p)])] - [else - (sub-f sub-p mode index-table)])) - -(define (handle-one-block style block mode index-table sub-f sub-p) - ;(printf "-----\n") ((dynamic-require 'racket/pretty 'pretty-write) block) - (define block-port (open-output-string)) - (define background-label-port (open-output-string)) - (define ents (make-hash)) - (define new-mode (cons background-label-port ents)) - (port-count-lines! block-port) - (port-count-lines! background-label-port) - (parameterize ([current-output-port block-port]) - (send (the-renderer) render-block block (the-part) (the-ri) #f)) - (sub-f sub-p new-mode index-table) - - ;; we just take the first one here - (define background-label-p (open-input-string (get-output-string background-label-port))) - (define background-label-line (read-line background-label-p)) - - (define text-p (the-text-p)) - (define-values (before-line _1 _2) (port-next-location text-p)) - (define before-position (file-position text-p)) - (fprintf text-p "~a\n" - (if (eof-object? background-label-line) - "" - background-label-line)) - - ;; dump content of block-port into text-p, but first trim - ;; the spaces that appear at the ends of the lines - (let ([p (open-input-string (get-output-string block-port))]) - (let loop () - (define l (read-line p)) - (unless (eof-object? l) - (display (regexp-replace #rx" *$" l "") text-p) - (newline text-p) - (loop)))) - - (define-values (after-line _3 _4) (port-next-location text-p)) - (define txt-loc (cons before-position (- after-line before-line))) - (define ri (the-ri)) - (for ([(k v) (in-hash ents)]) - (let ([k (tag-key k ri)]) - (hash-set! index-table k (cons txt-loc (hash-ref index-table k '())))))) - -(define (r-blockss+cont blockss mode index-table) - (for ([blocks (in-list blockss)]) - (for ([block (in-list blocks)]) - (unless (eq? block 'cont) - (r-block block mode index-table))))) - -(define (r-blockss blockss mode index-table) - (for ([blocks (in-list blockss)]) - (r-blocks blocks mode index-table))) - -(define (r-content content mode index-table) - (cond - [(element? content) (r-element content mode index-table)] - [(list? content) - (for ([content (in-list content)]) - (r-content content mode index-table))] - [(string? content) (void)] - [(symbol? content) (void)] - [(convertible? content) (void)] - [(delayed-element? content) - (r-content (delayed-element-content content (the-ri)) mode index-table)] - [(traverse-element? content) - (r-content (traverse-element-content content (the-ri)) mode index-table)] - [(part-relative-element? content) - (r-content (part-relative-element-content content (the-ri)) mode index-table)] - [(multiarg-element? content) - (r-content (multiarg-element-contents content) mode index-table)] - [else (error 'r-content "unknown content: ~s\n" content)])) - -(define (r-element element mode index-table) - (when (index-element? element) - (when (pair? mode) - (define ents (cdr mode)) - (define key (index-element-tag element)) - (hash-set! ents (tag-key key (the-ri)) #t))) - (r-content (element-content element) mode index-table)) - - -(define override-render-mixin-multi (override-render-mixin #t)) -(define override-render-mixin-single (override-render-mixin #f)) diff --git a/scribble-lib/scribble/core.rkt b/scribble-lib/scribble/core.rkt deleted file mode 100644 index 5e11043f..00000000 --- a/scribble-lib/scribble/core.rkt +++ /dev/null @@ -1,781 +0,0 @@ -#lang scheme/base -(require "private/provide-structs.rkt" - scheme/serialize - racket/contract/base - file/convertible) - -;; ---------------------------------------- - -(define-struct collect-info (fp ht ext-ht ext-demand parts tags gen-prefix relatives parents) #:transparent) -(define-struct resolve-info (ci delays undef searches) #:transparent) - -(define (part-collected-info part ri) - (hash-ref (collect-info-parts (resolve-info-ci ri)) - part)) - -(define (collect-put! ci key val) - (let ([ht (collect-info-ht ci)]) - (let ([old-val (hash-ref ht key #f)]) - (when old-val - (eprintf "WARNING: collected information for key multiple times: ~e; values: ~e ~e\n" - key old-val val)) - (hash-set! ht key val)))) - -(define (resolve-get/where part ri key) - (let ([key (tag-key key ri)]) - (let ([v (hash-ref (if part - (collected-info-info (part-collected-info part ri)) - (collect-info-ht (resolve-info-ci ri))) - key - #f)]) - (cond - [v (values v #f)] - [part (resolve-get/where - (collected-info-parent (part-collected-info part ri)) - ri key)] - [else - (define ci (resolve-info-ci ri)) - (define (try-ext) - (hash-ref (collect-info-ext-ht ci) key #f)) - (define v - (or (try-ext) - (and ((collect-info-ext-demand ci) key ci) - (try-ext)))) - (if (known-doc? v) - (values (known-doc-v v) (known-doc-id v)) - (values v #t))])))) - -(define (resolve-get/ext? part ri key) - (define-values (v ext-id) (resolve-get/ext-id* part ri key #f)) - (values v (and ext-id #t))) - -(define (resolve-get/ext-id part ri key) - (resolve-get/ext-id* part ri key #f)) - -(define (resolve-get/ext-id* part ri key search-key) - (let-values ([(v ext-id) (resolve-get/where part ri key)]) - (when ext-id - (hash-set! (resolve-info-undef ri) (tag-key key ri) - (if v 'found search-key))) - (values v ext-id))) - -(define (resolve-get part ri key) - (resolve-get* part ri key #f)) - -(define (resolve-get* part ri key search-key) - (let-values ([(v ext-id) (resolve-get/ext-id* part ri key search-key)]) - v)) - -(define (resolve-get/tentative part ri key) - (let-values ([(v ext-id) (resolve-get/where part ri key)]) - v)) - -(define (resolve-search search-key part ri key) - (let ([s-ht (hash-ref (resolve-info-searches ri) - search-key - (lambda () - (let ([s-ht (make-hash)]) - (hash-set! (resolve-info-searches ri) - search-key s-ht) - s-ht)))]) - (hash-set! s-ht key #t)) - (resolve-get* part ri key search-key)) - -(define (resolve-get-keys part ri key-pred) - (for/list ([k (in-hash-keys (if part - (collected-info-info (part-collected-info part ri)) - (let ([ci (resolve-info-ci ri)]) - ;; Force all xref info: - ((collect-info-ext-demand ci) #f ci) - (collect-info-ext-ht ci))))] - #:when (key-pred k)) - k)) - -(provide (struct-out collect-info) - (struct-out resolve-info)) - -;; ---------------------------------------- - -(provide tag?) -(define (tag? s) - (and (pair? s) - (symbol? (car s)) - (pair? (cdr s)) - (or (string? (cadr s)) - (generated-tag? (cadr s)) - (and (pair? (cadr s)) - (list? (cadr s)) - (serializable? (cadr s)))) - (null? (cddr s)))) - -(provide block?) -(define (block? p) - (or (paragraph? p) - (table? p) - (itemization? p) - (nested-flow? p) - (compound-paragraph? p) - (delayed-block? p) - (traverse-block? p))) - -(define content-symbols - #hasheq([nbsp . #t] - [mdash . #t] - [ndash . #t] - [ldquo . #t] - [rdquo . #t] - [rsquo . #t] - [lsquo . #t] - [prime . #t] - [rarr . #t] - [larr . #t] - [alpha . #t] - [infin . #t] - [lang . #t] - [rang . #t])) - -(provide content?) -(define (content? v) - (or (string? v) - (element? v) - (and (list? v) (andmap content? v)) - (delayed-element? v) - (traverse-element? v) - (part-relative-element? v) - (multiarg-element? v) - (hash-ref content-symbols v #f) - (convertible? v))) - -(provide element-style?) -(define (element-style? s) - (or (style? s) (not s) (string? s) (symbol? s))) - -(define (string-without-newline? s) - (and (string? s) - (not (regexp-match? #rx"\n" s)))) - -(define (same-lengths? ls) - (or (null? ls) - (let ([l1 (length (car ls))]) - (andmap (λ (l) (= l1 (length l))) - (cdr ls))))) - -;; ---------------------------------------- - -(define-struct numberer (tag step-proc initial-value) - #:constructor-name numberer - #:property - prop:serializable - (make-serialize-info - (lambda (d) - (vector (numberer-tag d) - (numberer-initial-value d))) - #'deserialize-numberer - #f - (or (current-load-relative-directory) (current-directory)))) - -(provide deserialize-numberer) -(define deserialize-numberer - (make-deserialize-info (lambda (tag init-val) - (numberer tag #f)) - (lambda (tag init-val) - (error "cannot allocate numberer for cycle")))) - -(define (make-numberer spec-proc initial-value) - (numberer (generated-tag) spec-proc initial-value)) - -(define (numberer-step n parent-numbers ci ht) - (define tag (generate-tag `(numberer ,(numberer-tag n)) ci)) - (define-values (numberer-str new-val) - (let ([step (numberer-step-proc n)]) - (step (hash-ref ht tag (lambda () (numberer-initial-value n))) - parent-numbers))) - (values numberer-str (hash-set ht tag new-val))) - -(define part-number-item? - (or/c #f exact-nonnegative-integer? string? (list/c string? string?))) - -(provide - part-number-item? - numberer? - (contract-out - [make-numberer ((any/c (listof part-number-item?) - . -> . (values part-number-item? any/c)) - any/c - . -> . numberer?)] - [numberer-step (numberer? - (listof part-number-item?) - collect-info? - hash? - . -> . (values part-number-item? hash?))])) - -;; ---------------------------------------- - -(provide-structs - [part ([tag-prefix (or/c false/c string?)] - [tags (listof tag?)] - [title-content (or/c false/c content?)] - [style style?] - [to-collect list?] - [blocks (listof block?)] - [parts (listof part?)])] - [paragraph ([style style?] - [content content?])] - [table ([style style?] - [blockss (and/c (listof (listof (or/c block? (one-of/c 'cont)))) - same-lengths?)])] - [delayed-block ([resolve (any/c part? resolve-info? . -> . block?)])] - [itemization ([style style?] - [blockss (listof (listof block?))])] - [nested-flow ([style style?] - [blocks (listof block?)])] - [compound-paragraph ([style style?] - [blocks (listof block?)])] - - [element ([style element-style?] - [content content?])] - [(toc-element element) ([toc-content content?])] - [(target-element element) ([tag tag?])] - [(toc-target-element target-element) ()] - [(toc-target2-element toc-target-element) ([toc-content content?])] - [(page-target-element target-element) ()] - [(redirect-target-element target-element) ([alt-path path-string?] - [alt-anchor string?])] - [(link-element element) ([tag tag?])] - [(index-element element) ([tag tag?] - [plain-seq (and/c pair? (listof string-without-newline?))] - [entry-seq (listof content?)] - [desc any/c])] - [(image-element element) ([path (or/c path-string? - (cons/c (one-of/c 'collects) - (listof bytes?)))] - [suffixes (listof #rx"^[.]")] - [scale real?])] - [multiarg-element ([style element-style?] - [contents (listof content?)])] - - [style ([name (or/c string? symbol? #f)] - [properties list?])] - ;; properties: - [document-version ([text (or/c string? false/c)])] - [document-date ([text (or/c string? false/c)])] - [target-url ([addr path-string?])] - [color-property ([color (or/c string? (list/c byte? byte? byte?))])] - [background-color-property ([color (or/c string? (list/c byte? byte? byte?))])] - [numberer-property ([numberer numberer?] [argument any/c])] - - [table-columns ([styles (listof style?)])] - [table-cells ([styless (listof (listof style?))])] - - [box-mode ([top-name string?] - [center-name string?] - [bottom-name string?])] - - [collected-info ([number (listof part-number-item?)] - [parent (or/c false/c part?)] - [info any/c])] - - [known-doc ([v any/c] - [id string?])]) - -(provide plain) -(define plain (make-style #f null)) - -(define (box-mode* name) - (box-mode name name name)) -(provide/contract - [box-mode* (string? . -> . box-mode?)]) - -;; ---------------------------------------- - -;; Traverse block has special serialization support: -(define-struct traverse-block (traverse) - #:property - prop:serializable - (make-serialize-info - (lambda (d) - (let ([ri (current-serialize-resolve-info)]) - (unless ri - (error 'serialize-traverse-block - "current-serialize-resolve-info not set")) - (vector (traverse-block-block d ri)))) - #'deserialize-traverse-block - #f - (or (current-load-relative-directory) (current-directory))) - #:transparent) - -(define block-traverse-procedure/c - (recursive-contract - ((symbol? any/c . -> . any/c) - (symbol? any/c . -> . any) - . -> . (or/c block-traverse-procedure/c - block?)))) - -(provide block-traverse-procedure/c) -(provide/contract - (struct traverse-block ([traverse block-traverse-procedure/c]))) - -(provide deserialize-traverse-block) -(define deserialize-traverse-block - (make-deserialize-info values values)) - -(define (traverse-block-block b i) - (cond - [(collect-info? i) - (let ([p (hash-ref (collect-info-fp i) b #f)]) - (if (block? p) - p - (error 'traverse-block-block - "no block computed for traverse-block: ~e" - b)))] - [(resolve-info? i) - (traverse-block-block b (resolve-info-ci i))])) - -(provide/contract - [traverse-block-block (traverse-block? - (or/c resolve-info? collect-info?) - . -> . block?)]) - -;; ---------------------------------------- - -;; Traverse element has special serialization support: -(define-struct traverse-element (traverse) - #:property - prop:serializable - (make-serialize-info - (lambda (d) - (let ([ri (current-serialize-resolve-info)]) - (unless ri - (error 'serialize-traverse-block - "current-serialize-resolve-info not set")) - (vector (traverse-element-content d ri)))) - #'deserialize-traverse-element - #f - (or (current-load-relative-directory) (current-directory))) - #:transparent) - -(define element-traverse-procedure/c - (recursive-contract - ((symbol? any/c . -> . any/c) - (symbol? any/c . -> . any) - . -> . (or/c element-traverse-procedure/c - content?)))) - -(provide/contract - (struct traverse-element ([traverse element-traverse-procedure/c]))) - -(provide deserialize-traverse-element) -(define deserialize-traverse-element - (make-deserialize-info values values)) - -(define (traverse-element-content e i) - (cond - [(collect-info? i) - (let ([c (hash-ref (collect-info-fp i) e #f)]) - (if (content? c) - c - (error 'traverse-block-block - "no block computed for traverse-block: ~e" - e)))] - [(resolve-info? i) - (traverse-element-content e (resolve-info-ci i))])) - -(provide element-traverse-procedure/c) -(provide/contract - [traverse-element-content (traverse-element? - (or/c resolve-info? collect-info?) - . -> . content?)]) - -;; ---------------------------------------- - -;; Delayed element has special serialization support: -(define-struct delayed-element (resolve sizer plain) - #:property - prop:serializable - (make-serialize-info - (lambda (d) - (let ([ri (current-serialize-resolve-info)]) - (unless ri - (error 'serialize-delayed-element - "current-serialize-resolve-info not set")) - (with-handlers ([exn:fail:contract? - (lambda (exn) - (error 'serialize-delayed-element - "serialization failed (wrong resolve info? delayed element never rendered?); ~a" - (exn-message exn)))]) - (vector (delayed-element-content d ri))))) - #'deserialize-delayed-element - #f - (or (current-load-relative-directory) (current-directory))) - #:transparent) - -(provide/contract - (struct delayed-element ([resolve (any/c part? resolve-info? . -> . content?)] - [sizer (-> any)] - [plain (-> any)]))) - -(module+ deserialize-info - (provide deserialize-delayed-element)) -(define deserialize-delayed-element - (make-deserialize-info values values)) - -(provide delayed-element-content) -(define (delayed-element-content e ri) - (hash-ref (resolve-info-delays ri) e)) - -(provide delayed-block-blocks) -(define (delayed-block-blocks p ri) - (hash-ref (resolve-info-delays ri) p)) - -(provide current-serialize-resolve-info) -(define current-serialize-resolve-info (make-parameter #f)) - -;; ---------------------------------------- - -;; part-relative element has special serialization support: -(define-struct part-relative-element (collect sizer plain) - #:property - prop:serializable - (make-serialize-info - (lambda (d) - (let ([ri (current-serialize-resolve-info)]) - (unless ri - (error 'serialize-part-relative-element - "current-serialize-resolve-info not set")) - (with-handlers ([exn:fail:contract? - (lambda (exn) - (error 'serialize-part-relative-element - "serialization failed (wrong resolve info? part-relative element never rendered?); ~a" - (exn-message exn)))]) - (vector - (part-relative-element-content d ri))))) - #'deserialize-part-relative-element - #f - (or (current-load-relative-directory) (current-directory))) - #:transparent) - -(provide/contract - (struct part-relative-element ([collect (collect-info? . -> . content?)] - [sizer (-> any)] - [plain (-> any)]))) - -(module+ deserialize-info - (provide deserialize-part-relative-element)) -(define deserialize-part-relative-element - (make-deserialize-info values values)) - -(provide part-relative-element-content) -(define (part-relative-element-content e ci/ri) - (hash-ref (collect-info-relatives - (if (resolve-info? ci/ri) (resolve-info-ci ci/ri) ci/ri)) - e)) - -(provide collect-info-parents) - -;; ---------------------------------------- - -;; Delayed index entry also has special serialization support. -;; It uses the same delay -> value table as delayed-element -(define-struct delayed-index-desc (resolve) - #:mutable - #:property - prop:serializable - (make-serialize-info - (lambda (d) - (let ([ri (current-serialize-resolve-info)]) - (unless ri - (error 'serialize-delayed-index-desc - "current-serialize-resolve-info not set")) - (with-handlers ([exn:fail:contract? - (lambda (exn) - (error 'serialize-index-desc - "serialization failed (wrong resolve info?); ~a" - (exn-message exn)))]) - (vector - (delayed-element-content d ri))))) - #'deserialize-delayed-index-desc - #f - (or (current-load-relative-directory) (current-directory))) - #:transparent) - -(provide/contract - (struct delayed-index-desc ([resolve (any/c part? resolve-info? . -> . any)]))) - -(module+ deserialize-info - (provide deserialize-delayed-index-desc)) -(define deserialize-delayed-index-desc - (make-deserialize-info values values)) - -;; ---------------------------------------- - -(define-struct (collect-element element) (collect) - #:mutable - #:property - prop:serializable - (make-serialize-info - (lambda (d) - (vector (make-element - (element-style d) - (element-content d)))) - #'deserialize-collect-element - #f - (or (current-load-relative-directory) (current-directory))) - #:transparent) - -(module+ deserialize-info - (provide deserialize-collect-element)) -(define deserialize-collect-element - (make-deserialize-info values values)) - -(provide/contract - [struct collect-element ([style element-style?] - [content content?] - [collect (collect-info? . -> . any)])]) - -;; ---------------------------------------- - -(define-struct (render-element element) (render) - #:property - prop:serializable - (make-serialize-info - (lambda (d) - (vector (make-element - (element-style d) - (element-content d)))) - #'deserialize-render-element - #f - (or (current-load-relative-directory) (current-directory))) - #:transparent) - -(module+ deserialize-info - (provide deserialize-render-element)) -(define deserialize-render-element - (make-deserialize-info values values)) - -(provide/contract - [struct render-element ([style element-style?] - [content content?] - [render (any/c part? resolve-info? . -> . any)])]) - -;; ---------------------------------------- - -(define-struct generated-tag () - #:property - prop:serializable - (make-serialize-info - (lambda (g) - (let ([ri (current-serialize-resolve-info)]) - (unless ri - (error 'serialize-generated-tag - "current-serialize-resolve-info not set")) - (let ([t (hash-ref (collect-info-tags (resolve-info-ci ri)) g #f)]) - (if t - (vector t) - (error 'serialize-generated-tag - "serialization failed (wrong resolve info?)"))))) - #'deserialize-generated-tag - #f - (or (current-load-relative-directory) (current-directory))) - #:transparent) - -(provide (struct-out generated-tag)) - -(module+ deserialize-info - (provide deserialize-generated-tag)) -(define deserialize-generated-tag - (make-deserialize-info values values)) - -(provide generate-tag tag-key - current-tag-prefixes - add-current-tag-prefix) - -(define (generate-tag tg ci) - (if (generated-tag? (cadr tg)) - (let ([t (cadr tg)]) - (list (car tg) - (let ([tags (collect-info-tags ci)]) - (or (hash-ref tags t #f) - (let ([key (list* 'gentag - (hash-count tags) - (collect-info-gen-prefix ci))]) - (hash-set! tags t key) - key))))) - tg)) - -(define (tag-key tg ri) - (if (generated-tag? (cadr tg)) - (list (car tg) - (hash-ref (collect-info-tags (resolve-info-ci ri)) (cadr tg))) - tg)) - -(define current-tag-prefixes (make-parameter null)) -(define (add-current-tag-prefix t) - (let ([l (current-tag-prefixes)]) - (if (null? l) - t - (cons (car t) (append l (cdr t)))))) - -;; ---------------------------------------- - -(provide content->string - strip-aux) - -;; content->port: output-port content -> void -;; Writes the string content of content into op. -(define content->port - (case-lambda - [(op c) - (cond - [(element? c) (content->port op (element-content c))] - [(multiarg-element? c) (content->port op (multiarg-element-contents c))] - [(list? c) (for-each (lambda (e) (content->port op e)) c)] - [(part-relative-element? c) (content->port op ((part-relative-element-plain c)))] - [(delayed-element? c) (content->port op ((delayed-element-plain c)))] - [(string? c) (display c op)] - [else (display (case c - [(mdash) "---"] - [(ndash) "--"] - [(ldquo rdquo) "\""] - [(rsquo) "'"] - [(rarr) "->"] - [(lang) "<"] - [(rang) ">"] - [else (format "~s" c)]) - op)])] - [(op c renderer sec ri) - (cond - [(and (link-element? c) - (null? (element-content c))) - (let ([dest (resolve-get sec ri (link-element-tag c))]) - ;; FIXME: this is specific to renderer - (if dest - (content->port op - (strip-aux - (if (pair? dest) (cadr dest) (vector-ref dest 1))) - renderer sec ri) - (display "???" op)))] - [(element? c) (content->port op (element-content c) renderer sec ri)] - [(multiarg-element? c) (content->port op (multiarg-element-contents c) renderer sec ri)] - [(list? c) (for-each (lambda (e) - (content->port op e renderer sec ri)) - c)] - [(delayed-element? c) - (content->port op (delayed-element-content c ri) renderer sec ri)] - [(part-relative-element? c) - (content->port op (part-relative-element-content c ri) renderer sec ri)] - [else (content->port op c)])])) - -(define (simple-content->string c) - ;; `content->string' is commonly used on a list containing a single string - (cond - [(string? c) c] - [(and (pair? c) - (string? (car c)) - (null? (cdr c))) - (car c)] - [else #f])) - -(define content->string - (case-lambda - [(c) - (or (simple-content->string c) - (let ([op (open-output-string)]) - (content->port op c) - (get-output-string op)))] - [(c renderer sec ri) - (or (simple-content->string c) - (let ([op (open-output-string)]) - (content->port op c renderer sec ri) - (get-output-string op)))])) - - -(define (aux-element? e) - (and (element? e) - (let ([s (element-style e)]) - (and (style? s) - (memq 'aux (style-properties s)))))) - -(define (strip-aux content) - (cond - [(null? content) null] - [(aux-element? content) null] - [(element? content) - (define c (element-content content)) - (define p (strip-aux c)) - (if (equal? c p) - content - (struct-copy element content [content p]))] - [(list? content) - (define p (map strip-aux content)) - (if (equal? p content) - content - p)] - [else content])) - -;; ---------------------------------------- - -(provide block-width - content-width) - -(define (content-width s) - (cond - [(string? s) (string-length s)] - [(list? s) (for/fold ([v 0]) ([s (in-list s)]) (+ v (content-width s)))] - [(element? s) (content-width (element-content s))] - [(multiarg-element? s) (content-width (multiarg-element-contents s))] - [(delayed-element? s) (content-width ((delayed-element-sizer s)))] - [(part-relative-element? s) (content-width ((part-relative-element-sizer s)))] - [else 1])) - -(define (paragraph-width s) - (content-width (paragraph-content s))) - -(define (flow-width f) - (apply max 0 (map block-width f))) - -(define (block-width p) - (cond - [(paragraph? p) (paragraph-width p)] - [(table? p) (table-width p)] - [(itemization? p) (itemization-width p)] - [(nested-flow? p) (nested-flow-width p)] - [(compound-paragraph? p) (compound-paragraph-width p)] - [(delayed-block? p) 1] - [(eq? p 'cont) 0])) - -(define (table-width p) - (let ([blocks (table-blockss p)]) - (if (null? blocks) - 0 - (let loop ([blocks blocks]) - (if (null? (car blocks)) - 0 - (+ (apply max 0 (map block-width (map car blocks))) - (loop (map cdr blocks)))))))) - -(define (itemization-width p) - (apply max 0 (map flow-width (itemization-blockss p)))) - -(define (nested-flow-width p) - (+ 4 (apply max 0 (map block-width (nested-flow-blocks p))))) - -(define (compound-paragraph-width p) - (apply max 0 (map block-width (compound-paragraph-blocks p)))) - -;; ---------------------------------------- - -(define (info-key? l) - (and (pair? l) - (symbol? (car l)) - (pair? (cdr l)))) - -(provide info-key?) -(provide/contract - [part-collected-info (part? resolve-info? . -> . collected-info?)] - [collect-put! (collect-info? info-key? any/c . -> . any)] - [resolve-get ((or/c part? false/c) resolve-info? info-key? . -> . any)] - [resolve-get/tentative ((or/c part? false/c) resolve-info? info-key? . -> . any)] - [resolve-get/ext? ((or/c part? false/c) resolve-info? info-key? . -> . any)] - [resolve-get/ext-id ((or/c part? false/c) resolve-info? info-key? . -> . any)] - [resolve-search (any/c (or/c part? false/c) resolve-info? info-key? . -> . any)] - [resolve-get-keys ((or/c part? false/c) resolve-info? (info-key? . -> . any/c) . -> . any/c)]) diff --git a/scribble-lib/scribble/decode-struct.rkt b/scribble-lib/scribble/decode-struct.rkt deleted file mode 100644 index 3a56e267..00000000 --- a/scribble-lib/scribble/decode-struct.rkt +++ /dev/null @@ -1,5 +0,0 @@ -#lang scheme/base -(require "private/provide-structs.rkt") - -(provide-structs - [part-index-desc ()]) diff --git a/scribble-lib/scribble/decode.rkt b/scribble-lib/scribble/decode.rkt deleted file mode 100644 index 463845b9..00000000 --- a/scribble-lib/scribble/decode.rkt +++ /dev/null @@ -1,368 +0,0 @@ -#lang scheme/base -(require "core.rkt" - "private/provide-structs.rkt" - "decode-struct.rkt" - racket/contract/base - racket/contract/combinator - scheme/list) - -(define (pre-content? i) - (or (string? i) - (content? i) - (and (splice? i) - (andmap pre-content? (splice-run i))) - (and (list? i) - (andmap pre-content? i)) - (void? i))) - -(define (pre-flow? i) - (or (string? i) - (content? i) - (block? i) - (and (splice? i) - (andmap pre-flow? (splice-run i))) - (and (list? i) - (andmap pre-flow? i)) - (void? i))) - -(define (pre-part? v) - (or (pre-flow? v) - (title-decl? v) - (part-start? v) - (part-index-decl? v) - (part-collect-decl? v) - (part-tag-decl? v) - (part? v) - (and (splice? v) - (andmap pre-part? (splice-run v))) - (and (list? v) - (andmap pre-part? v)))) - -(provide-structs - [title-decl ([tag-prefix (or/c false/c string?)] - [tags (listof tag?)] - [version (or/c string? false/c)] - [style style?] - [content content?])] - [part-start ([depth integer?] - [tag-prefix (or/c false/c string?)] - [tags (listof tag?)] - [style style?] - [title content?])] - [splice ([run list?])] - [part-index-decl ([plain-seq (listof string?)] - [entry-seq list?])] - [part-collect-decl ([element (or/c element? part-relative-element?)])] - [part-tag-decl ([tag tag?])]) - -(provide whitespace? - pre-content? - pre-flow? - pre-part?) - -(provide/contract - [decode (-> (listof pre-part?) - part?)] - [decode-part (-> (listof pre-part?) - (listof string?) - (or/c #f content?) - exact-nonnegative-integer? - part?)] - [decode-flow (-> (listof pre-flow?) - (listof block?))] - [decode-paragraph (-> (listof pre-content?) - paragraph?)] - [decode-compound-paragraph (-> (listof pre-flow?) - block?)] - [decode-content (-> (listof pre-content?) - content?)] - [rename decode-content decode-elements - (-> (listof pre-content?) - content?)] - [decode-string (-> string? content?)] - [clean-up-index-string (-> string? string?)]) - -(define (spliceof c) - (define name `(spliceof ,(contract-name c))) - (define p (flat-contract-predicate c)) - (make-flat-contract #:name name - #:first-order (lambda (x) - (and (splice? x) - (andmap p (splice-run x)))))) -(provide/contract - [spliceof (flat-contract? . -> . flat-contract?)]) - -(define the-part-index-desc (make-part-index-desc)) - -(define (clean-up-index-string s) - ;; Collapse whitespace, and remove leading or trailing spaces, which - ;; might appear there due to images or something else that gets - ;; dropped in string form. - (let* ([s (regexp-replace* #px"\\s+" s " ")] - [s (regexp-replace* #rx"^ " s "")] - [s (regexp-replace* #rx" $" s "")]) - (datum-intern-literal s))) - - -(define (decode-string s) - (define pattern #rx"(---|--|``|''|'|`)") - (let loop ([start 0]) - (cond - [(regexp-match-positions pattern s start) - => (lambda (m) - (define the-match (substring s (caar m) (cdar m))) - (list* (datum-intern-literal (substring s start (caar m))) - (cond - [(string=? the-match "---") 'mdash] - [(string=? the-match "--") 'ndash] - [(string=? the-match "``") 'ldquo] - [(string=? the-match "''") 'rdquo] - [(string=? the-match "'") 'rsquo] - [(string=? the-match "`") 'lsquo]) - (loop (cdar m))))] - ;; Common case: nothing to decode, so don't copy strings. - ;; Assume that the input is already interned. - [(= start 0) - (list s)] - [else - (list (datum-intern-literal (substring s start)))]))) - - -(define (line-break? v) - (equal? v "\n")) - -(define (whitespace? v) - (and (string? v) (regexp-match? #px"^[\\s]*$" v))) - -(define (decode-accum-para accum) - (if (andmap whitespace? accum) - null - (list (decode-compound-paragraph (reverse (skip-whitespace accum)))))) - -(define (decode-flow* l keys colls tag-prefix tags vers style title part-depth) - (let loop ([l l] [next? #f] [keys keys] [colls colls] [accum null] - [title title] [tag-prefix tag-prefix] [tags tags] [vers vers] - [style style]) - (cond - [(null? l) - (let ([k-tags (map (lambda (k) `(idx ,(make-generated-tag))) keys)] - [tags (if (null? tags) - (list `(part ,(make-generated-tag))) - tags)]) - (make-part - tag-prefix - (append tags k-tags) - title - (if vers - (make-style (style-name style) - (cons (make-document-version vers) - (style-properties style))) - style) - (let ([l (append - (map (lambda (k tag) - (make-index-element #f null tag - (part-index-decl-plain-seq k) - (part-index-decl-entry-seq k) - #f)) - keys k-tags) - colls)]) - (if (and title - (not (memq 'hidden (style-properties style)))) - (cons (make-index-element - #f null (car tags) - (list (clean-up-index-string - (regexp-replace #px"^\\s+(?:(?:A|An|The)\\s)?" - (content->string title) ""))) - (list (make-element #f title)) - the-part-index-desc) - l) - l)) - (decode-accum-para accum) - null))] - [(void? (car l)) - (loop (cdr l) next? keys colls accum title tag-prefix tags vers style)] - [(title-decl? (car l)) - (cond [(not part-depth) (error 'decode "misplaced title: ~e" (car l))] - [title (error 'decode "found extra title: ~v" (car l))] - [else (loop (cdr l) next? keys colls accum - (title-decl-content (car l)) - (title-decl-tag-prefix (car l)) - (title-decl-tags (car l)) - (title-decl-version (car l)) - (title-decl-style (car l)))])] - #; - ;; Blocks are now handled by decode-accum-para - [(block? (car l)) - (let ([para (decode-accum-para accum)] - [part (decode-flow* (cdr l) keys colls tag-prefix tags vers style - title part-depth)]) - (make-part - (part-tag-prefix part) - (part-tags part) - (part-title-content part) - (part-style part) - (part-to-collect part) - (append para (list (car l)) (part-flow part)) - (part-parts part)))] - [(part? (car l)) - (let ([para (decode-accum-para accum)] - [part (decode-flow* (cdr l) keys colls tag-prefix tags vers style - title part-depth)]) - (make-part - (part-tag-prefix part) - (part-tags part) - (part-title-content part) - (part-style part) - (part-to-collect part) - (append para (part-blocks part)) - (cons (car l) (part-parts part))))] - [(part-start? (car l)) - (unless part-depth - (error 'decode "misplaced part; title: ~s" (part-start-title (car l)))) - (unless ((part-start-depth (car l)) . <= . part-depth) - (error 'decode - "misplaced part (the part is more than one layer deeper than its container); title: ~s" - (part-start-title (car l)))) - (let ([s (car l)]) - (let loop ([l (cdr l)] [s-accum null]) - (if (or (null? l) - (and (part-start? (car l)) - ((part-start-depth (car l)) . <= . part-depth)) - (part? (car l))) - (let ([para (decode-accum-para accum)] - [s (decode-styled-part (reverse s-accum) - (part-start-tag-prefix s) - (part-start-tags s) - (part-start-style s) - (part-start-title s) - (add1 part-depth))] - [part (decode-flow* l keys colls tag-prefix tags vers style - title part-depth)]) - (make-part (part-tag-prefix part) - (part-tags part) - (part-title-content part) - (part-style part) - (part-to-collect part) - para - (cons s (part-parts part)))) - (cond - [(splice? (car l)) - (loop (append (splice-run (car l)) (cdr l)) s-accum)] - [(list? (car l)) - (loop (append (car l) (cdr l)) s-accum)] - [else - (loop (cdr l) (cons (car l) s-accum))]))))] - [(splice? (car l)) - (loop (append (splice-run (car l)) (cdr l)) - next? keys colls accum title tag-prefix tags vers style)] - [(list? (car l)) - (loop (append (car l) (cdr l)) - next? keys colls accum title tag-prefix tags vers style)] - [(null? (cdr l)) - (loop null #f keys colls (cons (car l) accum) title tag-prefix tags - vers style)] - [(part-index-decl? (car l)) - (loop (cdr l) next? (cons (car l) keys) colls accum title tag-prefix - tags vers style)] - [(part-collect-decl? (car l)) - (loop (cdr l) next? keys - (cons (part-collect-decl-element (car l)) colls) - accum title tag-prefix tags vers style)] - [(part-tag-decl? (car l)) - (loop (cdr l) next? keys colls accum title tag-prefix - (append tags (list (part-tag-decl-tag (car l)))) - vers style)] - [(and (pair? (cdr l)) - (or (splice? (cadr l)) - (list? (cadr l)))) - (loop (cons (car l) (append ((if (splice? (cadr l)) splice-run values) (cadr l)) (cddr l))) - next? keys colls accum title tag-prefix tags vers style)] - [(line-break? (car l)) - (if next? - (loop (cdr l) #t keys colls accum title tag-prefix tags vers style) - (let ([m (match-newline-whitespace (cdr l))]) - (if m - (let ([part (loop m #t keys colls null title tag-prefix tags vers - style)]) - (make-part - (part-tag-prefix part) - (part-tags part) - (part-title-content part) - (part-style part) - (part-to-collect part) - (append (decode-accum-para accum) - (part-blocks part)) - (part-parts part))) - (loop (cdr l) #f keys colls (cons (car l) accum) title tag-prefix - tags vers style))))] - [else (loop (cdr l) #f keys colls (cons (car l) accum) title tag-prefix - tags vers style)]))) - -(define (decode-part l tags title depth) - (decode-flow* l null null #f tags #f plain title depth)) - -(define (decode-styled-part l tag-prefix tags style title depth) - (decode-flow* l null null tag-prefix tags #f style title depth)) - -(define (decode-flow l) - (part-blocks (decode-flow* l null null #f null #f plain #f #f))) - -(define (match-newline-whitespace l) - (cond [(null? l) #f] - [(void? (car l)) (match-newline-whitespace (cdr l))] - [(line-break? (car l)) (skip-whitespace l)] - [(splice? (car l)) - (match-newline-whitespace (append (splice-run (car l)) (cdr l)))] - [(list? (car l)) - (match-newline-whitespace (append (car l) (cdr l)))] - [(whitespace? (car l)) (match-newline-whitespace (cdr l))] - [else #f])) - -(define (skip-whitespace l) - (if (or (null? l) - (not (or (whitespace? (car l)) - (void? (car l))))) - l - (skip-whitespace (cdr l)))) - -(define (decode l) - (decode-part l null #f 0)) - -(define (decode-paragraph l) - (make-paragraph plain (decode-content l))) - -(define (decode-content l) - (append-map (lambda (s) (cond - [(string? s) (decode-string s)] - [(void? s) null] - [(splice? s) (decode-content (splice-run s))] - [(list? s) (decode-content s)] - [else (list s)])) - (skip-whitespace l))) - -(define (decode-compound-paragraph l) - (define (finish-accum para-accum) - (if (null? para-accum) - null - (list (make-paragraph plain (skip-whitespace (apply append (reverse para-accum))))))) - (let ([r (let loop ([l (skip-whitespace l)] - [para-accum null]) - (cond - [(null? l) - (finish-accum para-accum)] - [else - (let ([s (car l)]) - (cond - [(block? s) (append - (finish-accum para-accum) - (cons s (loop (skip-whitespace (cdr l)) null)))] - [(string? s) (loop (cdr l) - (cons (decode-string s) para-accum))] - [else (loop (cdr l) - (cons (list (car l)) para-accum))]))]))]) - (cond - [(null? r) - (make-paragraph plain null)] - [(null? (cdr r)) - (car r)] - [(make-compound-paragraph plain r)]))) diff --git a/scribble-lib/scribble/doc.txt b/scribble-lib/scribble/doc.txt deleted file mode 100644 index 40d16d86..00000000 --- a/scribble-lib/scribble/doc.txt +++ /dev/null @@ -1,708 +0,0 @@ -(The rest of the Scribble documentation is now a separate manual.) - -The Scribble Reader -------------------- - -The Scribble @-reader is designed to be a convenient facility for -using free-form text in Scheme code, where "@" is chosen as one of -the least-used characters in Scheme code. - -You can use the reader via Racket's `#reader' form: - - #reader(lib "reader.ss" "scribble")@{This is free-form text!} - -Note that the reader will only read @-forms as S-expressions. The -meaning of these S-expressions depends on the rest of your own code. - -A PLT Scheme manual more likely starts with - - #reader(lib "docreader.ss" "scribble") - -which installs a reader, wraps the file content afterward into a -Racket module, and parses the body into a document using -"decode.ss". - -Another way to use the reader is to use the `use-at-readtable' -function to switch the current readtable to a readtable that parses -@-forms. You can do this in a single command line: - - mzscheme -ile scribble/reader "(use-at-readtable)" - -*** Concrete Syntax - -Informally, the concrete syntax of @-forms is - - "@" "[" ... "]" "{" ... "}" - -where all three parts after "@" are optional, but at least one should -be present. (Note that spaces are not allowed between the three -parts.) "@" is set as a non-terminating reader macro, so it can be -used as usual in Scheme identifiers unless you want to use it as a -first character of an identifier; in this case you need to quote with -a backslash (`\@foo') or quote the whole identifier with bars -(`|@foo|'). - - (define |@foo| '\@bar@baz) - -Of course, "@" is not treated specially in Scheme strings, character -constants, etc. - -Roughly, a form matching the above grammar is read as - - ( ... ...) - -where is the translation of each in the -input. Thus, the initial determines the Scheme code that the -input is translated into. The common case is when is a Scheme -identifier, which generates a plain Scheme form. - -A is made of text, newlines, and nested @-forms. Note -that the syntax for @-forms is the same in a context as in -a Scheme context. A that isn't an @-form is converted to -a string expression for its , and newlines are converted -to "\n" expressions. - - @foo{bar baz - blah} - --reads-as--> - (foo "bar baz" "\n" "blah") - - @foo{bar @baz[3] - blah} - --reads-as--> - (foo "bar " (baz 3) "\n" "blah") - - @foo{bar @baz{3} - blah} - --reads-as--> - (foo "bar " (baz "3") "\n" "blah") - - @foo{bar @baz[2 3]{4 5} - blah} - --reads-as--> - (foo "bar " (baz 2 3 "4 5") "\n" "blah") - -Note that spaces are not allowed before a "[" or a "{", or they will -be part of the following text (or Scheme code). (More on using braces -in body texts below.) - - @foo{bar @baz[2 3] {4 5}} - --reads-as--> - (foo "bar " (baz 2 3) " {4 5}") - -When the above @-forms appear in a Scheme expression context, the -lexical environment must provide bindings for `foo' (as a procedure or -a macro). - - (let* ([formatter (lambda (fmt) - (lambda args (format fmt (apply string-append args))))] - [bf (formatter "*~a*")] - [it (formatter "/~a/")] - [ul (formatter "_~a_")] - [text string-append]) - @text{@it{Note}: @bf{This is @ul{not} a pipe}.}) - --> "/Note/: *This is _not_ a pipe*." - -If you want to see the expression that is actually being read, you can -use Scheme's `quote'. - - '@foo{bar} - -** The Command Part - -Besides being a Scheme identifier, the part of an @-form can -have Scheme punctuation prefixes, which will end up wrapping the -*whole* expression. - - @`',@foo{blah} --reads-as--> `',@(foo "blah") - -When writing Scheme code, this means that @`',@foo{blah} is exactly -the same as `@',@foo{blah} and `',@@foo{blah}, but unlike the latter -two, the first construct can appear in body texts with the same -meaning, whereas the other two would not work (see below). - -After the optional punctuation prefix, the itself is not limited -to identifiers; it can be *any* Scheme expression. - - @(lambda (x) x){blah} --reads-as--> ((lambda (x) x) "blah") - @`(unquote foo){blah} --reads-as--> `(,foo "blah") - -In addition, the command can be omitted altogether, which will omit it -from the translation, resulting in an S-expression that usually -contains, say, just strings: - - @{foo bar --reads-as--> ("foo bar" "\n" "baz") - baz} - - @'{foo bar --reads-as--> '("foo bar" "\n" "baz") - baz} - -If the command part begins with a ";" (with no newline between the "@" -and the ";"), then the construct is a comment. There are two comment -forms, one for arbitrary-text and possibly nested comments, and -another one for line comments: - - @;{ ...} - - @; - -In the first form, the commented body must still parse correctly; see -the description of the body syntax below. In the second form, all -text from the "@;" to the end of the line *and* all following spaces -(or tabs) are part of the comment (similar to "%" comments in TeX). - - @foo{bar @; comment --reads-as--> (foo "bar bazblah") - baz@; - blah} - -Tip: if you're editing in a Scheme-aware editor (like DrRacket or -Emacs), it is useful to comment out blocks like this: - - @;{ - ... - ;} - -so the editor does not treat the file as having unbalanced -parenthesis. - -If only the part of an @-form is specified, then the result is -the command part only, without an extra set of parenthesis. This -makes it suitable for Scheme escapes in body texts. (More on this -below, in the description of the body part.) - - @foo{x @y z} --reads-as--> (foo "x " y " z") - @foo{x @(* y 2) z} --reads-as--> (foo "x " (* y 2) " z") - @{@foo bar} --reads-as--> (foo " bar") - -Finally, note that there are currently no special rules for using "@" -in the command itself, which can lead to things like: - - @@foo{bar}{baz} --reads-as--> ((foo "bar") "baz") - -** The Datum Part - -The datum part can contains arbitrary Scheme expressions, which are -simply stacked before the body text arguments: - - @foo[1 (* 2 3)]{bar} --reads-as--> (foo 1 (* 2 3) "bar") - @foo[@bar{...}]{blah} --reads-as--> (foo (bar "...") "blah") - -The body part can still be omitted, which is essentially an -alternative syntax for plain (non-textual) S-expressions: - - @foo[bar] --reads-as--> (foo bar) - @foo{bar @f[x] baz} --reads-as--> (foo "bar " (f x) " baz") - -The datum part can be empty, which makes no difference, except when -the body is omitted. It is more common, however, to use an empty body -for the same purpose. - - @foo[]{bar} --reads-as--> (foo "bar") - @foo[] --reads-as--> (foo) - @foo --reads-as--> foo - @foo{} --reads-as--> (foo) - -The most common use of the datum part is for Scheme forms that expect -keyword-value arguments that precede the body of text arguments. - - @foo[#:style 'big]{bar} --reads-as--> (foo #:style 'big "bar") - -** The Body Part - -The syntax of the body part is intended to be as convenient as -possible for free text. It can contain almost any text -- the only -characters with special meaning is "@" for sub-@-forms, and "}" for -the end of the text. In addition, a "{" is allowed as part of the -text, and it makes the matching "}" be part of the text too -- so -balanced braces are valid text. - - @foo{f{o}o} --reads-as--> (foo "f{o}o") - @foo{{{}}{}} --reads-as--> (foo "{{}}{}") - -As described above, the text turns to a sequence of string arguments -for the resulting form. Spaces at the beginning and end of lines are -discarded, and newlines turn to individual "\n" strings (i.e., they -are not merged with other body parts). (See also the information -about newlines and indentation below.) Spaces are *not* discarded if -they appear after the open "{" (before the closing "}") when there is -also text that follows (precedes) it; specifically, they are preserved -in a single-line body. - - @foo{bar} --reads-as--> (foo "bar") - @foo{ bar } --reads-as--> (foo " bar ") - @foo[1]{ bar } --reads-as--> (foo 1 " bar ") - -If "@" appears in a body, then it is interpreted as Scheme code, which -means that the @-reader is applied recursively, and the resulting -syntax appears as part of the S-expression, among other string -contents. - - @foo{a @bar{b} c} --reads-as--> (foo "a " (bar "b") " c") - -If the nested "@" construct has only a command -- no body or datum -parts -- it will not appear in a subform. Given that the command part -can be any Scheme expression, this makes "@" a general escape to -arbitrary Scheme code. - - @foo{a @bar c} --reads-as--> (foo "a " bar " c") - @foo{a @(bar 2) c} --reads-as--> (foo "a " (bar 2) " c") - -This is particularly useful with strings, which can be used to include -arbitrary text. - - @foo{A @"}" marks the end} - --reads-as--> - (foo "A } marks the end") - -Note that the escaped string is (intentionally) merged with the rest -of the text. This works for "@" too: - - @foo{The prefix: @"@".} - --reads-as--> - (foo "The prefix: @.") - - @foo{@"@x{y}" --> (x "y")} - --reads-as--> - (foo "@x{y} --> (x \"y\")") - -* Alternative Body Syntax - -In addition to the above, there is an alternative syntax for the body, -one that specifies a new marker for its end: use "|{" for the opening -marker to have the text terminated by a "}|". - - @foo|{...}| - --reads-as--> - (foo "...") - - @foo|{"}" follows "{"}| - --reads-as--> - (foo "\"}\" follows \"{\"") - - @foo|{Nesting |{is}| ok}| - --reads-as--> - (foo "Nesting |{is}| ok") - -This applies to sub-@-forms too -- the "@" must be prefixed with a -"|": - - @foo|{Maze - |@bar{is} - Life!}| - --reads-as--> - (foo "Maze" "\n" (bar "is") "Life!") - - @t|{In |@i|{sub|@"@"s}| too}| - --reads-as--> - (t "In " (i "sub@s") " too") - -Note that the subform uses its own delimiters, "{...}" or "|{...}|". -This means that you can copy and paste Scribble text with @-forms -freely, just prefix the "@" if the immediate surrounding text has a -prefix. - -For even better control, you can add characters in the opening -delimiter, between the "|" and the "{". Characters that are put there -(non alphanumeric ASCII characters only, excluding "{" and "@") should -also be used for sub-@-forms, and the end-of-body marker should have -these characters in reverse order with paren-like characters ("(", -"[", "<") mirrored. - - @foo|<<<{@x{foo} |@{bar}|.}>>>| - --reads-as--> - (foo "@x{foo} |@{bar}|.") - - @foo|!!{X |!!@b{Y}...}!!| - --reads-as--> - (foo "X " (b "Y") "...") - -Finally, remember that you can use an expression escape with a Scheme -string for confusing situations. This works well when you only need -to quote short pieces, and the above works well when you have larger -multi-line body texts. - -* Scheme Expression Escapes - -In some cases, you may want to use a Scheme identifier (or a number or -a boolean etc.) in a position that touches the following text; in -these situations you should surround the escaped Scheme expression by -a pair of "|" characters. The text inside the bars is parsed as a -Scheme expression. - - @foo{foo@bar.} --reads-as--> (foo "foo" bar.) - @foo{foo@|bar|.} --reads-as--> (foo "foo" bar ".") - @foo{foo@3.} --reads-as--> (foo "foo" 3.0) - @foo{foo@|3|.} --reads-as--> (foo "foo" 3 ".") - -This form is a generic Scheme expression escape, there is no body text -or datum part when you use this form. - - @foo{foo@|(f 1)|{bar}} --reads-as--> (foo "foo" (f 1) "{bar}") - @foo{foo@|bar|[1]{baz}} --reads-as--> (foo "foo" bar "[1]{baz}") - -This works for string expressions too, but note that unlike the above, -the string is (intentionally) not merged with the rest of the text: - - @foo{x@"y"z} --reads-as--> (foo "xyz") - @foo{x@|"y"|z} --reads-as--> (foo "x" "y" "z") - -Expression escapes also work with *any* number of expressions, - - @foo{x@|1 (+ 2 3) 4|y} --reads-as--> (foo "x" 1 (+ 2 3) 4 "y") - - @foo{x@|* --reads-as--> (foo "x" * * "y") - *|y} - -It seems that "@||" has no purpose -- but remember that these escapes -are never merged with the surrounding text, which can be useful when -you want to control the sub expressions in the form. - - @foo{Alice@||Bob@| --reads-as--> (foo "Alice" "Bob" "Carol") - |Carol} - -Note that "@|{...}|" can be parsed as either an escape expression or -as a no-command @-form. The latter is used in this case (since there -is little point in Scheme code that uses braces. - - @|{blah}| --reads-as--> ("blah") - -* Comments - -As noted above, there are two kinds of Scribble comments: "@;{...}" is -a (nestable) comment for a whole body of text (following the same -rules for @-forms), and "@;..." is a line-comment. - - @foo{First line@;{there is still a - newline here;} - Second line} - --reads-as--> - (foo "First line" "\n" "Second line") - -One useful property of line-comments is that they continue to the end -of the line *and* all following spaces (or tabs). Using this, you can -get further control of the subforms. - - @foo{A long @; - single-@; - string arg.} - --reads-as--> - (foo "A long single-string arg.") - -Note how this is different from using "@||"s in that strings around it -are not merged. - -* Spaces, Newlines, and Indentation - -The Scribble syntax treats spaces and newlines in a special way is -meant to be sensible for dealing with text. As mentioned above, -spaces at the beginning and end of body lines are discarded, except -for spaces between a "{" and text, or between text and a "}". - - @foo{bar} --reads-as--> (foo "bar") - - @foo{ bar } --reads-as--> (foo " bar ") - - @foo{ bar --reads-as--> (foo " bar" "\n" "baz ") - baz } - -A single newline that follows an open brace or precedes a closing -brace is discarded, unless there are only newlines in the body; other -newlines are read as a "\n" string - - @foo{bar --reads-as--> (foo "bar") - } - - @foo{ - bar --reads-as--> (foo "bar") - } - - @foo{ - - bar --reads-as--> (foo "\n" "bar" "\n") - - } - - @foo{ - bar - --reads-as--> (foo "bar" "\n" "\n" "baz") - baz - } - - @foo{ --reads-as--> (foo "\n") - } - - @foo{ - --reads-as--> (foo "\n" "\n") - } - - @foo{ bar --reads-as--> (foo " bar" "\n" "baz ") - baz } - -In the parsed S-expression syntax, a single newline string is used for -all newlines; you can use `eq?' to identify this line. This can be -used to identify newlines in the original . - - (let ([nl (car @'{ - })]) - (for-each (lambda (x) (display (if (eq? x nl) "\n... " x))) - @`{foo - @,@(list "bar" "\n" "baz") - blah}) - (newline)) - --prints--> - foo - ... bar - baz - ... blah - -Spaces at the beginning of body lines do not appear in the resulting -S-expressions, but the column of each line is noticed, and all-space -indentation strings are added so the result has the same indentation. -A indentation string is added to each line according to its distance -from the leftmost syntax object (except for empty lines). (Note: if -you try these examples on a mzscheme REPL, you should be aware that -the reader does not know about the "> " prompt.) - - @foo{ --reads-as--> (foo "bar" "\n" - bar "baz" "\n" - baz "blah") - blah - } - - @foo{ --reads-as--> (foo "begin" "\n" - begin " " "x++;" "\n" - x++; "end") - end} - - @foo{ --reads-as--> (foo " " "a" "\n" - a " " "b" "\n" - b "c") - c} - -If the first string came from the openning "{" line, it is not -prepended with an indentation (but it can affect the leftmost syntax -object used for indentation). This makes sense when formatting -structured code as well as text (see the last example in the following -block). - - @foo{bar --reads-as--> (foo "bar" "\n" - baz " " "baz" "\n" - bbb} "bbb") - - @foo{ bar --reads-as--> (foo " bar" "\n" - baz " " "baz" "\n" - bbb} " " "bbb") - - @foo{bar --reads-as--> (foo "bar" "\n" - baz "baz" "\n" - bbb} "bbb") - - @foo{ bar --reads-as--> (foo " bar" "\n" - baz "baz" "\n" - bbb} "bbb") - - @foo{ bar --reads-as--> (foo " bar" "\n" - baz "baz" "\n" - bbb} " " "bbb") - - @text{Some @b{bold - text}, and - more text.} - --reads-as--> - (text "Some " (b "bold" "\n" "text") ", and" "\n" "more text.") - -Note that each @-form is parsed to an S-expression that has its own -indentation. This means that Scribble source can be indented like -code, but if indentation matters then you may need to apply -indentation of the outer item to all lines of the inner one. For -example, in - - @code{ - begin - i = 1, r = 1 - @bold{while i < n do - r *= i++ - done} - end - } - --reads-as--> - (code "begin" "\n" - " " "i = 1, r = 1" "\n" - " " (bold "while i < n do" "\n" - " " "r *= i++" "\n" - "done") "\n" - "end") - -a formatter will need to apply the 2-space indentation to the -rendering of the `bold' body. - -Note that to get a first-line text to be counted as a leftmost line, -line and column accounting should be on for the input port -(`use-at-readtable' turns them on for the current input port). -Without this, - - @foo{x1 - x2 - x3} - -will not have 2-space indentations in the parsed S-expression if -source accounting is not on, but - - @foo{x1 - x2 - x3} - -will (due to the last line). Pay attention to this, as it can be a -problem with Scheme code, for example: - - @code{(define (foo x) - (+ x 1))} - -For rare situations where spaces at the beginning (or end) of lines -matter, you can begin (or end) a line with a "@||". - - @foo{ - @|| bar @|| --reads-as--> (foo " bar " "\n" " baz") - @|| baz} - -*** Syntax Properties - -The Scribble reader attaches properties to syntax objects. These -properties might be useful in rare situations. - -Forms that Scribble reads is marked with a 'scribble property, and a -value of a list of three elements: the first is 'form, the second is -the number of items that were read from the datum part, and the third -is the number of items in the body part (strings, sub-forms, and -escapes). In both cases, a 0 means an empty datum/body part, and #f -means that the corresponding part was omitted. If the form has -neither parts, the property is not attached to the result. This -property can be used to give different meanings to expressions from -the datum and the body parts, for example, implicitly quoted keywords: - - (define-syntax (foo stx) - (let ([p (syntax-property stx 'scribble)]) - (syntax-case stx () - [(_ x ...) - (and (pair? p) (eq? (car p) 'form) (even? (cadr p))) - (let loop ([n (/ (cadr p) 2)] - [as '()] - [xs (syntax->list #'(x ...))]) - (if (zero? n) - #`(list 'foo `#,(reverse as) #,@xs) - (loop (sub1 n) - (cons #`(#,(car xs) ,#,(cadr xs)) as) - (cddr xs))))]))) - @foo[x 1 y (* 2 3)]{blah} - --> (foo ((x 1) (y 6)) "blah") - -In addition, the Scribble parser uses syntax properties to mark syntax -items that are not physically in the original source -- indentation -spaces and newlines. Both of these will have a 'scribble property; an -indentation string of spaces will have 'indentation as the value of -the property, and a newline will have a '(newline S) value where S is -the original newline string including spaces that precede and follow -it (which includes the indentation for the following item). This can -be used to implement a verbatim environment: drop indentation strings, -and use the original source strings instead of single-newline string. -Here is an example of this. - - (define-syntax (verb stx) - (syntax-case stx () - [(_ cmd item ...) - #`(cmd - #,@(let loop ([items (syntax->list #'(item ...))]) - (if (null? items) - '() - (let* ([fst (car items)] - [prop (syntax-property fst 'scribble)] - [rst (loop (cdr items))]) - (cond [(eq? prop 'indentation) rst] - [(not (and (pair? prop) - (eq? (car prop) 'newline))) - (cons fst rst)] - [else (cons (datum->syntax-object - fst (cadr prop) fst) - rst)])))))])) - @verb[string-append]{ - foo - bar - } - --> "foo\n bar" - -*** Interface - -The "reader.ss" module provides very little functionality for advanced -needs. - -> (read [input-port]) -> (read-syntax [source-name] [input-port]) - -These procedures implement the Scribble reader. They do so by -constructing a reader table based on the current one, and using that -in reading. - -> (read-inside [input-port]) -> (read-syntax-inside [source-name] [input-port]) - -These `-inside' variants parse as if starting inside a "@{...}", and -they return a (syntactic) list. Useful for implementing languages -that are textual by default (see "docreader.ss" for example). - -> (make-at-readtable [keyword-args...]) - -Constructs an @-readtable. The keyword arguments can customize the -resulting reader in several ways. - -* #:readtable -- a readtable to base the @-readtable on. Defaults to - the current readtable. - -* #:command-char -- the character used for @-forms; defaults to `#\@'. - -* #:datum-readtable -- determines the readtable used for reading the - datum part. The default (#t) is to use the @-readtable, otherwise - it can be a readtable, or a readtable-to-readtable function that - will construct one from the @-readtable. The idea is that you may - want to have completely different uses for the datum part, for - example, introducing a convenient `key=val' syntax for attributes. - -* #:syntax-post-processor -- a function that is applied on each - resulting syntax value after it has been parsed (but before it is - wrapped quoting punctuations). You can use this to further control - uses of @-forms, for example, making the command be the head of a - list: - - (use-at-readtable - #:syntax-post-processor - (lambda (stx) - (syntax-case stx () - [(cmd rest ...) #'(list 'cmd rest ...)] - [_else (error "@ forms must have a body")]))) - - Beware that the syntax may contain placeholder values at this stage - (e.g: the command part), so you can `plant' your own form that will - do some plain processing later. For example, here's a setup that - uses a `mk-' prefix for all command names: - - (use-at-readtable - #:syntax-post-processor - (lambda (stx) - (syntax-case stx () - [(cmd rest ...) #'(add-mk cmd rest ...)] - [_else (error "@ forms must have a body")]))) - (define-syntax (add-mk stx) - (syntax-case stx () - [(_ cmd rest ...) - (identifier? #'cmd) - (with-syntax ([mk-cmd (datum->syntax-object - #'cmd - (string->symbol - (format "mk-~a" (syntax-e #'cmd))) - #'cmd)]) - (syntax/loc stx (mk-cmd rest ...)))])) - -> (use-at-readtable [keyword-args]) - -Installs the Scribble readtable as the default. Useful for REPL -experimentation. (Note: enables line and column tracking.) The given -keyword arguments are used with `make-at-readtable'. diff --git a/scribble-lib/scribble/doc/lang/reader.rkt b/scribble-lib/scribble/doc/lang/reader.rkt deleted file mode 100644 index cf56c022..00000000 --- a/scribble-lib/scribble/doc/lang/reader.rkt +++ /dev/null @@ -1,3 +0,0 @@ -#lang s-exp scribble/base/reader -scribble/doclang -#:wrapper1 (lambda (t) (list* 'doc 'values '() (t))) diff --git a/scribble-lib/scribble/doc/main.rkt b/scribble-lib/scribble/doc/main.rkt deleted file mode 100644 index 57a38aa7..00000000 --- a/scribble-lib/scribble/doc/main.rkt +++ /dev/null @@ -1,5 +0,0 @@ -#lang scheme/base -(define-syntax-rule (out) - (begin (require scribble/doclang) - (provide (all-from-out scribble/doclang)))) -(out) diff --git a/scribble-lib/scribble/doc/reader.rkt b/scribble-lib/scribble/doc/reader.rkt deleted file mode 100644 index c53a5086..00000000 --- a/scribble-lib/scribble/doc/reader.rkt +++ /dev/null @@ -1 +0,0 @@ -#lang scheme/base diff --git a/scribble-lib/scribble/doclang.rkt b/scribble-lib/scribble/doclang.rkt deleted file mode 100644 index 0f62596b..00000000 --- a/scribble-lib/scribble/doclang.rkt +++ /dev/null @@ -1,93 +0,0 @@ -#lang racket/base - -(require "decode.rkt" - (for-syntax racket/base - syntax/kerncase)) - -(provide (except-out (all-from-out racket/base) #%module-begin) - (rename-out [*module-begin #%module-begin])) - -;; Module wrapper ---------------------------------------- - -(define-syntax (*module-begin stx) - (syntax-case stx () - [(_ id post-process exprs . body) - #'(#%module-begin - (doc-begin id post-process exprs . body))])) - -(define-syntax (doc-begin stx) - (syntax-case stx () - [(_ m-id post-process exprs) - #`(begin - (define m-id (post-process (decode (list . #,(reverse (syntax->list #'exprs)))))) - (provide m-id))] - [(_ m-id post-process exprs . body) - ;; `body' probably starts with lots of string constants; it's - ;; slow to trampoline on every string, so do them in a batch - ;; here: - (let loop ([body #'body] - [accum null]) - (syntax-case body () - [(s . rest) - (string? (syntax-e #'s)) - (loop #'rest (cons #'s accum))] - [() - (with-syntax ([(accum ...) accum]) - #`(doc-begin m-id post-process (accum ... . exprs)))] - [(body1 . body) - (with-syntax ([exprs (append accum #'exprs)]) - (let ([expanded (local-expand - #'body1 'module - (append (kernel-form-identifier-list) - (syntax->list #'(provide - require))))]) - (syntax-case expanded (begin) - [(begin body1 ...) - #`(doc-begin m-id post-process exprs body1 ... . body)] - [(id . rest) - (and (identifier? #'id) - (ormap (lambda (kw) (free-identifier=? #'id kw)) - (syntax->list #'(require - provide - define-values - define-syntaxes - begin-for-syntax - module - module* - #%require - #%provide - #%declare)))) - #`(begin #,expanded (doc-begin m-id post-process exprs . body))] - [_else - #`(doc-begin m-id post-process - ((pre-part #,expanded body1) . exprs) - . body)])))]))])) - -(define-syntax (pre-part stx) - (syntax-case stx () - [(_ s e) - (if (string? (syntax-e #'s)) - #'s - (with-syntax ([loc (datum->syntax #f 'loc #'e)]) - #'(check-pre-part e (quote-syntax loc))))])) - -(define (check-pre-part v loc-stx) - (if (pre-part? v) - v - (error - (format - "~a: not valid in document body (need a pre-part for decode) in: ~e" - (cond - [(and (syntax-source loc-stx) - (syntax-line loc-stx)) - (format "~a:~a:~a" - (syntax-source loc-stx) - (syntax-line loc-stx) - (syntax-column loc-stx))] - [(and (syntax-source loc-stx) - (syntax-position loc-stx)) - (format "~a:::~a" - (syntax-source loc-stx) - (syntax-position loc-stx))] - [else 'document]) - v)))) diff --git a/scribble-lib/scribble/doclang2.rkt b/scribble-lib/scribble/doclang2.rkt deleted file mode 100644 index 523ca363..00000000 --- a/scribble-lib/scribble/doclang2.rkt +++ /dev/null @@ -1,28 +0,0 @@ -#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/scribble-lib/scribble/elsarticle/.gitignore b/scribble-lib/scribble/elsarticle/.gitignore deleted file mode 100644 index 6b2410b3..00000000 --- a/scribble-lib/scribble/elsarticle/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -# to avoid committing it by accident, since we can't distribute it -/elsarticle.cls diff --git a/scribble-lib/scribble/elsarticle/elsarticle.tex b/scribble-lib/scribble/elsarticle/elsarticle.tex deleted file mode 100644 index a11d3a2d..00000000 --- a/scribble-lib/scribble/elsarticle/elsarticle.tex +++ /dev/null @@ -1,5 +0,0 @@ -\newcommand{\ELSauthor}[1]{\author{#1}} -\newcommand{\ELSaddress}[1]{\address{#1}} -\newcommand{\ELSemail}[1]{\ead{#1}} - -\newcommand{\ELSabstract}[1]{\begin{abstract}#1\end{abstract}} diff --git a/scribble-lib/scribble/elsarticle/lang.rkt b/scribble-lib/scribble/elsarticle/lang.rkt deleted file mode 100644 index 31b5cdb1..00000000 --- a/scribble-lib/scribble/elsarticle/lang.rkt +++ /dev/null @@ -1,68 +0,0 @@ -#lang racket/base -(require scribble/doclang - scribble/core - racket/file - (except-in scribble/base author) - (prefix-in s/b: scribble/base) - scribble/decode - "../private/defaults.rkt" - setup/collects - scribble/html-properties - scribble/latex-properties - scribble/latex-prefix - racket/stxparam - net/ftp - file/gunzip - (for-syntax racket/base - racket/list - racket/stxparam-exptime)) - -(module test racket/base) - -(provide (except-out (all-from-out scribble/doclang) #%module-begin) - (all-from-out scribble/base) - (rename-out [module-begin #%module-begin]) - frontmatter - abstract author email address) - -(define-syntax (module-begin stx) - ;; No options, currently, but keep in case we want to support some: - (syntax-case* stx () (lambda (a b) (eq? (syntax-e a) (syntax-e b))) - [(_ id ws . body) - ;; Skip intraline whitespace to find options: - (and (string? (syntax-e #'ws)) - (regexp-match? #rx"^ *$" (syntax-e #'ws))) - #'(module-begin id . body)] - [(_ id . body) - #'(#%module-begin id (post-process) () . body)])) - -(define ((post-process) doc) - (add-defaults doc - (string->bytes/utf-8 (string-append "\\documentclass{elsarticle}\n" - unicode-encoding-packages)) - (scribble-file "elsarticle/style.tex") - '() - #f)) - -(define elsarticle-extras - (let ([abs (lambda (s) - (path->collects-relative - (collection-file-path s "scribble" "elsarticle")))]) - (list - (make-tex-addition (abs "elsarticle.tex"))))) - -(define (LaTeX-element i) - (λ strs - (make-element (style i elsarticle-extras) - ;; XXX maybe decode-content - (decode-content strs)))) - -(define abstract (LaTeX-element "ELSabstract")) -(define author (LaTeX-element "ELSauthor")) -(define address (LaTeX-element "ELSaddress")) -(define email (LaTeX-element "ELSemail")) - -(define (frontmatter #:authors as - #:abstract a) - (paragraph (style 'author '()) - (append as (list a)))) diff --git a/scribble-lib/scribble/elsarticle/lang/reader.rkt b/scribble-lib/scribble/elsarticle/lang/reader.rkt deleted file mode 100644 index 20af590b..00000000 --- a/scribble-lib/scribble/elsarticle/lang/reader.rkt +++ /dev/null @@ -1,3 +0,0 @@ -#lang s-exp scribble/base/reader -scribble/elsarticle/lang -#:wrapper1 (lambda (t) (cons 'doc (t))) diff --git a/scribble-lib/scribble/elsarticle/style.tex b/scribble-lib/scribble/elsarticle/style.tex deleted file mode 100644 index 26e482b8..00000000 --- a/scribble-lib/scribble/elsarticle/style.tex +++ /dev/null @@ -1,3 +0,0 @@ - -\renewcommand{\titleAndVersionAndAuthors}[3]{\begin{frontmatter}\title{#1}#3\end{frontmatter}} -\renewcommand{\titleAndEmptyVersionAndAuthors}[3]{\titleAndVersionAndAuthors{#1}{#1}{#3}} diff --git a/scribble-lib/scribble/eval.rkt b/scribble-lib/scribble/eval.rkt deleted file mode 100644 index 602f69da..00000000 --- a/scribble-lib/scribble/eval.rkt +++ /dev/null @@ -1,952 +0,0 @@ -#lang racket/base - -(require "manual.rkt" "struct.rkt" "scheme.rkt" "decode.rkt" - (only-in "core.rkt" content? compound-paragraph plain) - racket/contract/base - racket/file - racket/list - file/convertible ;; attached into new namespace via anchor - racket/serialize ;; attached into new namespace via anchor - racket/pretty ;; attached into new namespace via anchor - scribble/private/serialize ;; attached into new namespace via anchor - racket/sandbox racket/promise racket/port - racket/gui/dynamic - (for-syntax racket/base syntax/srcloc racket/struct) - racket/stxparam - racket/splicing - racket/string - scribble/text/wrap) - -(provide interaction - interaction0 - interaction/no-prompt - interaction-eval - interaction-eval-show - racketblock+eval (rename-out [racketblock+eval schemeblock+eval]) - racketblock0+eval - racketmod+eval (rename-out [racketmod+eval schememod+eval]) - def+int - defs+int - examples - examples* - defexamples - defexamples* - as-examples - - make-base-eval - make-base-eval-factory - make-eval-factory - close-eval - - scribble-exn->string - scribble-eval-handler - with-eval-preserve-source-locations) - -(provide/contract - [make-log-based-eval - (-> path-string? (or/c 'record 'replay) (-> any/c any))]) - -(define scribble-eval-handler - (make-parameter (lambda (ev c? x) (ev x)))) - -(define image-counter 0) - -(define maxlen 60) - -(define-namespace-anchor anchor) - -(define (literal-string style s) - (let ([m (regexp-match #rx"^(.*)( +|^ )(.*)$" s)]) - (if m - (make-element #f (list (literal-string style (cadr m)) - (hspace (string-length (caddr m))) - (literal-string style (cadddr m)))) - (make-element style (list s))))) - -(define list.flow.list (compose1 list make-flow list)) - -(define (format-output str style) - (if (string=? "" str) - '() - (list (list.flow.list - (let ([s (regexp-split #rx"\n" (regexp-replace #rx"\n$" str ""))]) - (if (= 1 (length s)) - (make-paragraph (list (literal-string style (car s)))) - (make-table - #f - (map (lambda (s) - (list.flow.list - (make-paragraph (list (literal-string style s))))) - s)))))))) - -(define (format-output-stream in style) - (define (add-string string-accum line-accum) - (if string-accum - (cons (list->string (reverse string-accum)) - (or line-accum null)) - line-accum)) - (define (add-line line-accum flow-accum) - (if line-accum - (cons (make-paragraph - (map (lambda (s) - (if (string? s) (literal-string style s) s)) - (reverse line-accum))) - flow-accum) - flow-accum)) - (let loop ([string-accum #f] [line-accum #f] [flow-accum null]) - (let ([v (read-char-or-special in)]) - (cond - [(eof-object? v) - (let* ([line-accum (add-string string-accum line-accum)] - [flow-accum (add-line line-accum flow-accum)]) - (if (null? flow-accum) - null - (list - (list.flow.list - (if (= 1 (length flow-accum)) - (car flow-accum) - (make-table - #f - (map list.flow.list (reverse flow-accum))))))))] - [(equal? #\newline v) - (loop #f #f (add-line (add-string string-accum line-accum) - flow-accum))] - [(char? v) - (loop (cons v (or string-accum null)) line-accum flow-accum)] - [else - (loop #f (cons v (or (add-string string-accum line-accum) null)) - flow-accum)])))) - -(define (string->wrapped-lines str) - (apply - append - (for/list ([line-str (regexp-split #rx"\n" str)]) - (wrap-line line-str maxlen - (λ (word fits) - (if ((string-length word) . > . maxlen) - (values (substring word 0 fits) (substring word fits) #f) - (values #f word #f))))))) - -(struct formatted-result (content)) - -(define (interleave inset? title expr-paras promptless?+val-list+outputs) - (let ([lines - (let loop ([expr-paras expr-paras] - [promptless?+val-list+outputs promptless?+val-list+outputs] - [first? #t] - [after-blank? #t]) - (if (null? expr-paras) - null - (append - (if (and (caar promptless?+val-list+outputs) - (not after-blank?)) - (list (list (list blank-line))) - null) - (list (list (let ([p (car expr-paras)]) - (if (flow? p) p (make-flow (list p)))))) - (format-output (cadr (cdar promptless?+val-list+outputs)) output-color) - (format-output (caddr (cdar promptless?+val-list+outputs)) error-color) - (cond - [(string? (cadar promptless?+val-list+outputs)) - ;; Error result case: - (map (lambda (s) - (define p (format-output s error-color)) - (if (null? p) - (list null) - (car p))) - (string->wrapped-lines (cadar promptless?+val-list+outputs)))] - [(box? (cadar promptless?+val-list+outputs)) - ;; Output written to a port - (format-output-stream (unbox (cadar promptless?+val-list+outputs)) - result-color)] - [else - ;; Normal result case: - (let ([val-list (cadar promptless?+val-list+outputs)]) - (if (equal? val-list (list (void))) - null - (map (lambda (v) - (list.flow.list - (make-paragraph - (list (if (formatted-result? v) - (formatted-result-content v) - (elem #:style result-color - (to-element/no-color - v #:expr? (print-as-expression)))))))) - val-list)))]) - (if (and (caar promptless?+val-list+outputs) - (pair? (cdr promptless?+val-list+outputs))) - (list (list (list blank-line))) - null) - (loop (cdr expr-paras) (cdr promptless?+val-list+outputs) #f (caar promptless?+val-list+outputs)))))]) - (if inset? - (let ([p (code-inset (make-table block-color lines))]) - (if title - (compound-paragraph - plain - (list - title - p)) - p)) - (if title - (compound-paragraph plain - (list - title - (make-table block-color lines))) - (make-table block-color lines))))) - -;; extracts from a datum or syntax object --- while keeping the -;; syntax-objectness of the original intact, instead of always -;; generating a syntax object or always generating a datum -(define (extract s . ops) - (let loop ([s s] [ops ops]) - (cond [(null? ops) s] - [(syntax? s) (loop (syntax-e s) ops)] - [else (loop ((car ops) s) (cdr ops))]))) - -(struct nothing-to-eval ()) - -(struct eval-results (contents out err)) -(define (make-eval-results contents out err) - (unless (and (list? contents) - (andmap content? contents)) - (raise-argument-error 'eval:results "(listof content?)" contents)) - (unless (string? out) - (raise-argument-error 'eval:results "string?" out)) - (unless (string? err) - (raise-argument-error 'eval:results "string?" err)) - (eval-results contents out err)) -(define (make-eval-result content out err) - (unless (content? content) - (raise-argument-error 'eval:result "content?" content)) - (unless (string? out) - (raise-argument-error 'eval:result "string?" out)) - (unless (string? err) - (raise-argument-error 'eval:result "string?" err)) - (eval-results (list content) out err)) - -(define (extract-to-evaluate s val handle-one) - (let loop ([val val] [s s] [expect #f] [error-expected? #f] [promptless? #f]) - (syntax-case s (code:line code:comment code:contract eval:no-prompt eval:alts eval:check eval:error) - [(code:line v (code:comment . rest)) - (loop val (extract s cdr car) expect error-expected? promptless?)] - [(code:line v ...) - (for/fold ([val val]) ([v (in-list (extract s cdr))]) - (loop val v expect error-expected? promptless?))] - [(code:comment . rest) - (handle-one val (nothing-to-eval) expect error-expected? promptless?)] - [(code:contract . rest) - (handle-one val (nothing-to-eval) expect error-expected? promptless?)] - [(eval:no-prompt e ...) - (for/fold ([val val]) ([v (in-list (extract s cdr))]) - (handle-one val v expect error-expected? #t))] - [(eval:error e) - (handle-one val (extract s cdr car) expect #t promptless?)] - [(eval:alts p e) - (handle-one val (extract s cdr cdr car) expect error-expected? promptless?)] - [(eval:check e expect) - (handle-one val - (extract s cdr car) - (list (syntax->datum (datum->syntax #f (extract s cdr cdr car)))) - error-expected? - promptless?)] - [else (handle-one val s expect error-expected? promptless?)]))) - -(define (do-eval ev who no-errors?) - (define (get-outputs) - (define (get getter what) - (define s (getter ev)) - (if (string? s) - s - (error who "missing ~a, possibly from a sandbox without a `sandbox-~a' configured to 'string" - what (string-join (string-split what) "-")))) - (list (get get-output "output") (get get-error-output "error output"))) - (define (render-value v) - (let-values ([(eval-print eval-print-as-expr?) - (call-in-sandbox-context ev - (lambda () (values (current-print) (print-as-expression))))]) - (cond [(and (eq? eval-print (current-print)) - eval-print-as-expr?) - ;; default printer => get result as S-expression - (make-reader-graph (copy-value v (make-hasheq)))] - [else - ;; other printer => go through a pipe - ;; If it happens to be the pretty printer, tell it to retain - ;; convertible objects (via write-special) - (box (call-in-sandbox-context - ev - (lambda () - (define-values [in out] (make-pipe-with-specials)) - (parameterize ((current-output-port out) - (pretty-print-size-hook - (lambda (obj _mode _out) - (and (convertible? obj) 1))) - (pretty-print-print-hook - (lambda (obj _mode out) - (write-special (if (serializable? obj) - (make-serialized-convertible - (serialize obj)) - obj) - out)))) - (map (current-print) v)) - (close-output-port out) - in)))]))) - (define (do-ev/expect s expect error-expected?) - (define-values (val error? render+output) - (with-handlers ([(lambda (x) (not (exn:break? x))) - (lambda (e) - (when (and no-errors? - (not error-expected?)) - (error 'examples - (string-append "exception raised in example\n" - " error: ~s") - (if (exn? e) - (exn-message e) - e))) - (values e - #t - (cons ((scribble-exn->string) e) - (get-outputs))))]) - (define val (do-plain-eval ev s #t)) - (values val #f (cons (render-value val) (get-outputs))))) - (when (and error-expected? (not error?)) - (error 'eval "interaction failed to raise an expected exception: ~.s" s)) - (when expect - (let ([expect (do-plain-eval ev (car expect) #t)]) - (unless (equal? val expect) - (error 'eval "example result check failed: ~.s" s)))) - render+output) - (lambda (str) - (if (eval-results? str) - (list #f - (map formatted-result (eval-results-contents str)) - (eval-results-out str) - (eval-results-err str)) - (extract-to-evaluate - str - (list #f (list (void)) "" "") - (lambda (result s expect error-expected? promptless?) - (if (nothing-to-eval? s) - result - (cons promptless? (do-ev/expect s expect error-expected?)))))))) - -(module+ test - (require rackunit) - (test-case - "eval:check in interaction" - (check-not-exn (λ () (interaction (eval:check #t #t)))))) - -(define scribble-exn->string - (make-parameter - (λ (e) - (if (exn? e) - (exn-message e) - (format "uncaught exception: ~s" e))))) - -;; Since we evaluate everything in an interaction before we typeset, -;; copy each value to avoid side-effects. -(define (copy-value v ht) - (define (install v v2) (hash-set! ht v v2) v2) - (let loop ([v v]) - (cond - [(and v (hash-ref ht v #f)) => (lambda (v) v)] - [(syntax? v) (make-literal-syntax v)] - [(string? v) (install v (string-copy v))] - [(bytes? v) (install v (bytes-copy v))] - [(pair? v) - (let ([ph (make-placeholder #f)]) - (hash-set! ht v ph) - (placeholder-set! ph (cons (loop (car v)) (loop (cdr v)))) - ph)] - [(mpair? v) - (let ([p (mcons #f #f)]) - (hash-set! ht v p) - (set-mcar! p (loop (mcar v))) - (set-mcdr! p (loop (mcdr v))) - p)] - [(vector? v) - (let ([v2 (make-vector (vector-length v))]) - (hash-set! ht v v2) - (for ([i (in-range (vector-length v2))]) - (vector-set! v2 i (loop (vector-ref v i)))) - v2)] - [(box? v) - (let ([v2 (box #f)]) - (hash-set! ht v v2) - (set-box! v2 (loop (unbox v))) - v2)] - [(hash? v) - (let ([ph (make-placeholder #f)]) - (hash-set! ht v ph) - (let ([a (hash-map v (lambda (k v) (cons (loop k) (loop v))))]) - (placeholder-set! - ph - (cond [(hash-eq? v) (make-hasheq-placeholder a)] - [(hash-eqv? v) (make-hasheqv-placeholder a)] - [else (make-hash-placeholder a)]))) - ph)] - [else v]))) - -(define (strip-comments stx) - (cond - [(syntax? stx) - (datum->syntax stx (strip-comments (syntax-e stx)) stx stx stx)] - [(pair? stx) - (define a (car stx)) - (define (comment? a) - (and (pair? a) - (or (eq? (car a) 'code:comment) - (eq? (car a) 'code:contract) - (and (identifier? (car a)) - (or (eq? (syntax-e (car a)) 'code:comment) - (eq? (syntax-e (car a)) 'code:contract)))))) - (if (or (comment? a) (and (syntax? a) (comment? (syntax-e a)))) - (strip-comments (cdr stx)) - (cons (strip-comments a) - (strip-comments (cdr stx))))] - [(eq? stx 'code:blank) (void)] - [else stx])) - -(define (make-base-eval #:lang [lang '(begin)] #:pretty-print? [pretty-print? #t] . ips) - (call-with-trusted-sandbox-configuration - (lambda () - (parameterize ([sandbox-output 'string] - [sandbox-error-output 'string] - [sandbox-propagate-breaks #f] - [sandbox-namespace-specs - (append (sandbox-namespace-specs) - (if pretty-print? - '(racket/pretty) - '()) - '(file/convertible - racket/serialize - scribble/private/serialize))]) - (let ([e (apply make-evaluator lang ips)]) - (when pretty-print? - (call-in-sandbox-context e - (lambda () - (current-print (dynamic-require 'racket/pretty 'pretty-print-handler))))) - e))))) - -(define (make-base-eval-factory mod-paths - #:lang [lang '(begin)] - #:pretty-print? [pretty-print? #t] . ips) - (parameterize ([sandbox-namespace-specs - (cons (λ () (let ([ns - ;; This namespace-creation choice needs to be consistent - ;; with the sandbox (i.e., with `make-base-eval') - (if gui? - ((gui-dynamic-require 'make-gui-empty-namespace)) - (make-base-empty-namespace))]) - (parameterize ([current-namespace ns]) - (for ([mod-path (in-list mod-paths)]) - (dynamic-require mod-path #f)) - (when pretty-print? (dynamic-require 'racket/pretty #f))) - ns)) - (append mod-paths (if pretty-print? '(racket/pretty) '())))]) - (lambda () - (let ([ev (apply make-base-eval #:lang lang #:pretty-print? #f ips)]) - (when pretty-print? - (call-in-sandbox-context ev - (lambda () - (current-print (dynamic-require 'racket/pretty 'pretty-print-handler))))) - ev)))) - -(define (make-eval-factory mod-paths - #:lang [lang '(begin)] - #:pretty-print? [pretty-print? #t] . ips) - (let ([base-factory (apply make-base-eval-factory mod-paths #:lang lang #:pretty-print? pretty-print? ips)]) - (lambda () - (let ([ev (base-factory)]) - (call-in-sandbox-context - ev - (lambda () - (for ([mod-path (in-list mod-paths)]) - (namespace-require mod-path)))) - ev)))) - -(define (make-log-based-eval logfile mode) - (case mode - ((record) (make-eval/record logfile)) - ((replay) (make-eval/replay logfile)))) - -(define (make-eval/record logfile) - (let* ([ev (make-base-eval)] - [super-cust (current-custodian)] - [out (parameterize ((current-custodian (get-user-custodian ev))) - (open-output-file logfile #:exists 'replace))]) - (display ";; This file was created by make-log-based-eval\n" out) - (flush-output out) - (call-in-sandbox-context ev - (lambda () - ;; Required for serialization to work. - (namespace-attach-module (namespace-anchor->namespace anchor) 'racket/serialize) - (let ([old-eval (current-eval)] - [init-out-p (current-output-port)] - [init-err-p (current-error-port)] - [out-p (open-output-bytes)] - [err-p (open-output-bytes)]) - (current-eval - (lambda (x) - (let* ([x (syntax->datum (datum->syntax #f x))] - [x (if (and (pair? x) (eq? (car x) '#%top-interaction)) (cdr x) x)] - [result - (with-handlers ([exn? values]) - (call-with-values (lambda () - (parameterize ((current-eval old-eval) - (current-custodian (make-custodian)) - (current-output-port out-p) - (current-error-port err-p)) - (begin0 (old-eval x) - (wait-for-threads (current-custodian) super-cust)))) - list))] - [out-s (get-output-bytes out-p #t)] - [err-s (get-output-bytes err-p #t)]) - (let ([result* (serialize (cond [(list? result) (cons 'values result)] - [(exn? result) (list 'exn (exn-message result))]))]) - (pretty-write (list x result* out-s err-s) out) - (flush-output out)) - (display out-s init-out-p) - (display err-s init-err-p) - (cond [(list? result) (apply values result)] - [(exn? result) (raise result)]))))))) - ev)) - -;; Wait for threads created by evaluation so that the evaluator catches output -;; they generate, etc. -;; FIXME: see what built-in scribble evaluators do -(define (wait-for-threads sub-cust super-cust) - (let ([give-up-evt (alarm-evt (+ (current-inexact-milliseconds) 200.0))]) - ;; find a thread to wait on - (define (find-thread cust) - (let* ([managed (custodian-managed-list cust super-cust)] - [thds (filter thread? managed)] - [custs (filter custodian? managed)]) - (cond [(pair? thds) (car thds)] - [else (ormap find-thread custs)]))) - ;; keep waiting on threads (one at a time) until time to give up - (define (wait-loop cust) - (let ([thd (find-thread cust)]) - (when thd - (cond [(eq? give-up-evt (sync thd give-up-evt)) (void)] - [else (wait-loop cust)])))) - (wait-loop sub-cust))) - -(define (make-eval/replay logfile) - (let* ([ev (make-base-eval)] - [evaluations (file->list logfile)]) - (call-in-sandbox-context ev - (lambda () - (namespace-attach-module (namespace-anchor->namespace anchor) 'racket/serialize) - (let ([old-eval (current-eval)] - [init-out-p (current-output-port)] - [init-err-p (current-error-port)]) - (current-eval - (lambda (x) - (let* ([x (syntax->datum (datum->syntax #f x))] - [x (if (and (pair? x) (eq? (car x) '#%top-interaction)) (cdr x) x)]) - (unless (and (pair? evaluations) (equal? x (car (car evaluations)))) - ;; TODO: smarter resync - ;; - can handle *additions* by removing next set! - ;; - can handle *deletions* by searching forward (but may jump to far - ;; if terms occur more than once, eg for stateful code) - ;; For now, just fail early and often. - (set! evaluations null) - (error 'eval "unable to replay evaluation of ~.s" x)) - (let* ([evaluation (car evaluations)] - [result (parameterize ((current-eval old-eval)) - (deserialize (cadr evaluation)))] - [result (case (car result) - ((values) (cdr result)) - ((exn) (make-exn (cadr result) (current-continuation-marks))))] - [output (caddr evaluation)] - [error-output (cadddr evaluation)]) - (set! evaluations (cdr evaluations)) - (display output init-out-p #| (current-output-port) |#) - (display error-output init-err-p #| (current-error-port) |#) - (cond [(exn? result) (raise result)] - [(list? result) (apply values result)])))))))) - ev)) - -(define (close-eval e) - (kill-evaluator e) - "") - -(define (do-plain-eval ev s catching-exns?) - (parameterize ([sandbox-propagate-breaks #f]) - (call-with-values - (lambda () - ((scribble-eval-handler) - ev - catching-exns? - (let ([s (strip-comments s)]) - (cond [(syntax? s) - (syntax-case s (module) - [(module . _rest) (syntax->datum s)] - [_else s])] - ;; a sandbox treats strings and byte strings as code - ;; streams, so protect them as syntax objects: - [(string? s) (datum->syntax #f s)] - [(bytes? s) (datum->syntax #f s)] - [else s])))) - list))) - -(define-syntax-parameter quote-expr-preserve-source? #f) - -(define-syntax (with-eval-preserve-source-locations stx) - (syntax-case stx () - [(with-eval-preserve-source-locations e ...) - (syntax/loc stx - (splicing-syntax-parameterize ([quote-expr-preserve-source? #t]) - e ...))])) - -;; Quote an expression to be evaluated or wrap as escaped: -(define-syntax quote-expr - (syntax-rules (eval:alts eval:result eval:results) - [(_ (eval:alts e1 e2)) (quote-expr e2)] - [(_ (eval:result e)) (make-eval-result (list e) "" "")] - [(_ (eval:result e out)) (make-eval-result (list e) out "")] - [(_ (eval:result e out err)) (make-eval-result (list e) out err)] - [(_ (eval:results es)) (make-eval-results es "" "")] - [(_ (eval:results es out)) (make-eval-results es out "")] - [(_ (eval:results es out err)) (make-eval-results es out err)] - [(_ e) (base-quote-expr e)])) - -(define orig-stx (read-syntax 'orig (open-input-string "()"))) - -(define-syntax (base-quote-expr stx) - (syntax-case stx () - [(_ e) - (cond [(syntax-parameter-value #'quote-expr-preserve-source?) - ;; Preserve source; produce an expression resulting in a - ;; syntax object with no lexical context (like strip-context) - ;; but with (quotable) source locations. - ;; Also preserve syntax-original?, since that seems important - ;; to some syntax-based code (eg redex term->pict). - (define (get-source-location e) - (let* ([src (build-source-location-list e)] - [old-source (source-location-source src)] - [new-source - (cond [(path? old-source) ;; not quotable/writable - ;;(path->string old-source) ;; don't leak build paths - 'eval] - [(or (string? old-source) - (symbol? old-source)) - ;; Okay? Or should this be replaced also? - old-source] - [else #f])]) - (update-source-location src #:source new-source))) - (let loop ([e #'e]) - (cond [(syntax? e) - (let ([src (get-source-location e)] - [original? (syntax-original? (syntax-local-introduce e))]) - #`(syntax-property - (datum->syntax #f - #,(loop (syntax-e e)) - (quote #,src) - #,(if original? #'orig-stx #'#f)) - 'paren-shape - (quote #,(syntax-property e 'paren-shape))))] - [(pair? e) - #`(cons #,(loop (car e)) #,(loop (cdr e)))] - [(vector? e) - #`(list->vector #,(loop (vector->list e)))] - [(box? e) - #`(box #,(loop (unbox e)))] - [(prefab-struct-key e) - => (lambda (key) - #`(apply make-prefab-struct - (quote #,key) - #,(loop (struct->list e))))] - [else - #`(quote #,e)]))] - [else - ;; Using quote means that sandbox evaluation works on - ;; sexprs; to get it to work on syntaxes, use - ;; (strip-context (quote-syntax e))) - ;; while importing - ;; (require syntax/strip-context) - #'(quote e)])])) - -(define (do-interaction-eval ev es) - (for/fold ([ev ev]) ([e (in-list es)]) - (extract-to-evaluate - e - ev - (lambda (ev e expect error-expected?/ignored promptless?/ignored) - (cond - [(nothing-to-eval? e) ev] - [else - (parameterize ([current-command-line-arguments #()]) - (let ([ev (or ev (make-base-eval))]) - (do-plain-eval ev e #f) - ev))])))) - "") - -(define-syntax interaction-eval - (syntax-rules () - [(_ #:eval ev e ...) (do-interaction-eval ev (list (quote-expr e) ...))] - [(_ e ...) (do-interaction-eval #f (list (quote-expr e) ...))])) - -(define (show-val v) - (elem #:style result-color - (to-element/no-color v #:expr? (print-as-expression)))) - -(define (do-interaction-eval-show ev es) - (parameterize ([current-command-line-arguments #()]) - (let ([ev (or ev (make-base-eval))]) - (show-val (car (for/fold ([v (list #f)]) ([e (in-list es)]) - (extract-to-evaluate - e - v - (lambda (prev-v e expect error-expected?/ignored promptless?/ignored) - (do-plain-eval ev e #f))))))))) - -(define-syntax interaction-eval-show - (syntax-rules () - [(_ #:eval ev e ...) (do-interaction-eval-show ev (list (quote-expr e) ...))] - [(_ e ...) (do-interaction-eval-show #f (list (quote-expr e) ...))])) - -(define-syntax racketinput* - (syntax-rules (eval:alts code:comment eval:check eval:no-prompt eval:error eval:result eval:results) - [(_ #:escape id (code:comment . rest)) (racketblock0 #:escape id (code:comment . rest))] - [(_ #:escape id (eval:alts a b)) (racketinput* #:escape id a)] - [(_ #:escape id (eval:result a . _)) (racketinput* #:escape id a)] - [(_ #:escape id (eval:results a . _)) (racketinput* #:escape id a)] - [(_ #:escape id (eval:check a b)) (racketinput* #:escape id a)] - [(_ #:escape id (eval:error a)) (racketinput* #:escape id a)] - [(_ #:escape id (eval:no-prompt a ...)) (racketblock* #:escape id (code:line a ...))] - [(_ #:escape id e) (racketinput0 #:escape id e)])) - -(define-syntax racketblock* - (syntax-rules (eval:alts code:comment eval:check eval:no-prompt eval:error eval:result eval:results) - [(_ #:escape id (code:comment . rest)) (racketblock0 #:escape id (code:comment . rest))] - [(_ #:escape id (eval:alts a b)) (racketblock #:escape id a)] - [(_ #:escape id (eval:result a . _)) (racketinputblock #:escape id a)] - [(_ #:escape id (eval:results a . _)) (racketinputblock #:escape id a)] - [(_ #:escape id (eval:check a b)) (racketblock #:escape id a)] - [(_ #:escape id (eval:no-prompt a ...)) (racketblock #:escape id (code:line a ...))] - [(_ #:escape id (eval:error a)) (racketblock #:escape id a)] - [(_ #:escape id e) (racketblock0 #:escape id e)])) - -(define-code racketblock0+line (to-paragraph/prefix "" "" (list " "))) - -(define-syntax (racketdefinput* stx) - (syntax-case stx (define define-values define-struct) - [(_ #:escape id (define . rest)) - (syntax-case stx () - [(_ #:escape _ e) #'(racketblock0+line #:escape id e)])] - [(_ #:escape id (define-values . rest)) - (syntax-case stx () - [(_ #:escape _ e) #'(racketblock0+line #:escape id e)])] - [(_ #:escape id (define-struct . rest)) - (syntax-case stx () - [(_ #:escape _ e) #'(racketblock0+line #:escape id e)])] - [(_ #:escape id (code:line (define . rest) . rest2)) - (syntax-case stx () - [(_ #:escape _ e) #'(racketblock0+line #:escape id e)])] - [(_ #:escape id e) #'(racketinput* #:escape id e)])) - -(define (do-titled-interaction who inset? no-errors? ev t shows evals) - (interleave inset? t shows (map (do-eval ev who no-errors?) evals))) - -(define-syntax titled-interaction - (syntax-rules () - [(_ who inset? t racketinput* - #:eval ev #:escape unsyntax-id #:no-errors? no-errors? - e ...) - (do-titled-interaction - 'who inset? no-errors? ev t - (list (racketinput* #:escape unsyntax-id e) ...) - (list (quote-expr e) ...))] - - [(_ who inset? t racketinput* - #:eval ev #:escape unsyntax-id - e ...) - (titled-interaction - who inset? t racketinput* - #:eval ev #:escape unsyntax-id #:no-errors? #f - e ...)] - [(_ who inset? t racketinput* - #:eval ev #:no-errors? no-errors? - e ...) - (titled-interaction - who inset? t racketinput* - #:eval ev #:escape unsyntax #:no-errors? no-errors? - e ...)] - [(_ who inset? t racketinput* - #:escape unsyntax-id #:no-errors? no-errors? - e ...) - (titled-interaction - who inset? t racketinput* - #:eval (make-base-eval) #:escape unsyntax-id #:no-errors? no-errors? - e ...)] - [(_ who inset? t racketinput* - #:eval ev - e ...) - (titled-interaction - who inset? t racketinput* - #:eval ev #:escape unsyntax #:no-errors? #f - e ...)] - [(_ who inset? t racketinput* - #:escape unsyntax-id - e ...) - (titled-interaction - who inset? t racketinput* - #:eval (make-base-eval) #:escape unsyntax-id - e ...)] - [(_ who inset? t racketinput* - #:no-errors? no-errors? - e ...) - (titled-interaction - who inset? t racketinput* - #:eval (make-base-eval) #:escape unsyntax #:no-errors? no-errors? - e ...)] - [(_ who inset? t racketinput* e ...) - (titled-interaction - who inset? t racketinput* - #:eval (make-base-eval) #:escape unsyntax #:no-errors? #f - e ...)])) - -(define-syntax (-interaction stx) - (syntax-case stx () - [(_ who e ...) - (syntax/loc stx - (titled-interaction who #f #f racketinput* e ...))])) - -(define-syntax (interaction stx) - (syntax-case stx () - [(H e ...) (syntax/loc stx (code-inset (-interaction H e ...)))])) - -(define-syntax (interaction/no-prompt stx) - (syntax-case stx () - [(H e ...) - (syntax/loc stx - (code-inset (titled-interaction who #f #f racketblock* e ...)))])) - -(define-syntax (interaction0 stx) - (syntax-case stx () - [(H e ...) (syntax/loc stx (-interaction H e ...))])) - -(define-syntax racketblockX+eval - (syntax-rules () - [(_ racketblock #:eval ev #:escape unsyntax-id e ...) - (let ([eva ev]) - (#%expression - (begin (interaction-eval #:eval eva e ...) - (racketblock #:escape unsyntax-id e ...))))] - [(_ racketblock #:eval ev e ...) - (racketblockX+eval racketblock #:eval ev #:escape unsyntax e ...)] - [(_ racketblock #:escape unsyntax-id e ...) - (racketblockX+eval racketblock #:eval (make-base-eval) #:escape unsyntax-id e ...)] - [(_ racketblock e ...) - (racketblockX+eval racketblock #:eval (make-base-eval) #:escape unsyntax e ...)])) - -(define-syntax racketblock+eval - (syntax-rules () - [(_ e ...) - (racketblockX+eval racketblock e ...)])) - -(define-syntax racketblock0+eval - (syntax-rules () - [(_ e ...) - (racketblockX+eval racketblock0 e ...)])) - -(define-syntax racketmod+eval - (syntax-rules () - [(_ #:eval ev #:escape unsyntax-id name e ...) - (let ([eva ev]) - (#%expression - (begin (interaction-eval #:eval eva e ...) - (racketmod #:escape unsyntax-id name e ...))))] - [(_ #:eval ev name e ...) - (racketmod+eval #:eval ev #:escape unsyntax name e ...)] - [(_ #:escape unsyntax-id name e ...) - (racketmod+eval #:eval (make-base-eval) #:escape unsyntax-id name e ...)] - [(_ name e ...) - (racketmod+eval #:eval (make-base-eval) #:escape unsyntax name e ...)])) - -(define-syntax (defs+int stx) - (syntax-case stx () - [(H #:eval ev #:escape unsyntax-id [def ...] e ...) - (syntax/loc stx - (let ([eva ev]) - (column (list (racketblock0+eval #:eval eva #:escape unsyntax-id def ...) - blank-line - (-interaction H #:eval eva #:escape unsyntax-id e ...)))))] - [(H #:eval ev [def ...] e ...) - (syntax/loc stx (defs+int #:eval ev #:escape unsyntax [def ...] e ...))] - [(_ #:escape unsyntax-id [def ...] e ...) - (syntax/loc stx (defs+int #:eval (make-base-eval) #:escape unsyntax-id [def ...] e ...))] - [(_ [def ...] e ...) - (syntax/loc stx (defs+int #:eval (make-base-eval) [def ...] e ...))])) - -(define-syntax def+int - (syntax-rules () - [(H #:eval ev #:escape unsyntax-id def e ...) - (defs+int #:eval ev #:escape unsyntax-id [def] e ...)] - [(H #:eval ev def e ...) - (defs+int #:eval ev [def] e ...)] - [(H #:escape unsyntax-id def e ...) - (defs+int #:escape unsyntax-id [def] e ...)] - [(H def e ...) - (defs+int [def] e ...)])) - -(define example-title - (make-paragraph (list "Example:"))) -(define examples-title - (make-paragraph (list "Examples:"))) - -(define-syntax pick-example-title - (syntax-rules () - [(_ e) example-title] - [(_ #:eval ev e) example-title] - [(_ #:escape id e) example-title] - [(_ #:eval ev #:escape id e) example-title] - [(_ . _) examples-title])) - -(define-syntax (examples stx) - (syntax-case stx () - [(H e ...) - (syntax/loc stx - (titled-interaction - H #t (pick-example-title e ...) racketinput* e ...))])) -(define-syntax (examples* stx) - (syntax-case stx () - [(H example-title e ...) - (syntax/loc stx - (titled-interaction H #t example-title racketinput* e ...))])) -(define-syntax (defexamples stx) - (syntax-case stx () - [(H e ...) - (syntax/loc stx - (titled-interaction - H #t (pick-example-title e ...) racketdefinput* e ...))])) -(define-syntax (defexamples* stx) - (syntax-case stx () - [(H example-title e ...) - (syntax/loc stx - (titled-interaction H #t example-title racketdefinput* e ...))])) - -(define blank-line (make-paragraph (list 'nbsp))) - -(define (column l) - (code-inset (make-table #f (map list.flow.list l)))) - -(define (do-splice l) - (cond [(null? l) null] - [(splice? (car l)) `(,@(splice-run (car l)) ,@(do-splice (cdr l)))] - [else (cons (car l) (do-splice (cdr l)))])) - -(define as-examples - (case-lambda - [(t) (as-examples examples-title t)] - [(example-title t) - (if example-title - (compound-paragraph - plain - (list - (if (block? example-title) - example-title - (make-paragraph (list example-title))) - t)) - t)])) diff --git a/scribble-lib/scribble/example.rkt b/scribble-lib/scribble/example.rkt deleted file mode 100644 index 986d112b..00000000 --- a/scribble-lib/scribble/example.rkt +++ /dev/null @@ -1,113 +0,0 @@ -#lang racket/base - -(require "eval.rkt" - (only-in "struct.rkt" make-paragraph) - (for-syntax racket/base - syntax/parse)) - -(provide examples - - ;; Re-exports: - - make-base-eval - make-base-eval-factory - make-eval-factory - close-eval - - scribble-exn->string - scribble-eval-handler - make-log-based-eval) - -(define example-title - (make-paragraph (list "Example:"))) -(define examples-title - (make-paragraph (list "Examples:"))) - -(define-syntax (examples stx) - (syntax-parse stx - [(_ (~or (~optional (~seq #:eval eval:expr)) - (~optional (~and #:once once-kw)) - (~optional (~seq #:escape escape:id)) - (~optional (~seq #:label title:expr)) - (~optional (~and #:no-inset no-inset-kw)) - (~optional (~and #:no-prompt no-prompt-kw)) - (~optional (~and #:result-only no-form-kw)) - (~optional (~and #:no-result block-kw)) - (~optional (~and #:hidden no-result-kw)) - (~optional (~and #:preserve-source-locations preserve-srclocs-kw)) - (~optional (~seq #:lang module-name))) - ... - form:expr ...) - (define once? (or (attribute once-kw) - (not (attribute eval)))) - (define eval-stx (or (attribute eval) #'(make-base-eval))) - (define base-form - (with-syntax ([eval (if once? #'once-eval eval-stx)] - [escape (or (attribute escape) #'unsyntax)]) - (cond - [(attribute block-kw) - (when (attribute module-name) - (raise-syntax-error #f "#:block and #:module are mutually exclusive" stx)) - (cond - [(attribute no-inset-kw) - (syntax/loc stx - (racketblock0+eval #:eval eval #:escape escape - form ...))] - [else - (syntax/loc stx - (racketblock+eval #:eval eval #:escape escape - form ...))])] - [(attribute module-name) - (syntax/loc stx - (racketmod+eval #:eval eval #:escape escape module-name - form ...))] - [(attribute no-result-kw) - (syntax/loc stx - (interaction-eval #:eval eval form ...))] - [(attribute no-form-kw) - (syntax/loc stx - (interaction-eval-show #:eval eval form ...))] - [(attribute no-prompt-kw) - (syntax/loc stx - (interaction/no-prompt #:eval eval #:escape escape #:no-errors? #t - form ...))] - [(attribute no-inset-kw) - (syntax/loc stx - (interaction0 #:eval eval #:escape escape #:no-errors? #t - form ...))] - [else - (syntax/loc stx - (interaction #:eval eval #:escape escape #:no-errors? #t - form ...))]))) - (define srcloced-form - (cond - [(attribute preserve-srclocs-kw) - (with-syntax ([base-form base-form]) - (syntax/loc stx - (with-eval-preserve-source-locations base-form)))] - [else base-form])) - (define examples-form - (cond - [(or (attribute title) - (not (or (attribute block-kw) - (attribute module-name) - (attribute no-result-kw) - (attribute no-form-kw)))) - (with-syntax ([srcloced-form srcloced-form] - [title (or (attribute title) - (cond - [(= 1 (length (syntax->list #'(form ...)))) - #'example-title] - [else #'examples-title]))]) - (syntax/loc stx (as-examples title srcloced-form)))] - [else - srcloced-form])) - (if once? - (with-syntax ([eval eval-stx] - [examples-form examples-form]) - (syntax/loc stx - (let ([once-eval eval]) - (begin0 - examples-form - (close-eval eval))))) - examples-form)])) diff --git a/scribble-lib/scribble/examples.rkt b/scribble-lib/scribble/examples.rkt deleted file mode 100644 index 51a10289..00000000 --- a/scribble-lib/scribble/examples.rkt +++ /dev/null @@ -1,4 +0,0 @@ -#lang racket/base - -(require "example.rkt") -(provide (all-from-out "example.rkt")) diff --git a/scribble-lib/scribble/extract.rkt b/scribble-lib/scribble/extract.rkt deleted file mode 100644 index 0bbb54bb..00000000 --- a/scribble-lib/scribble/extract.rkt +++ /dev/null @@ -1,53 +0,0 @@ -#lang racket/base -(require (for-syntax racket/base)) - -(provide include-extracted - provide-extracted - include-previously-extracted) - -(define-for-syntax (do-include-extracted stx wraps) - (syntax-case stx () - [(_ module-path) - (with-syntax ([get-docs (syntax-local-lift-require - #`(only (submod #,@(syntax-case #'module-path (submod) - [(submod e ...) #'(e ...)] - [e #'(e)]) - srcdoc) - get-docs) - #'get-docs)] - [(wrap ...) wraps]) - #'(begin - (define-syntax (docs stx) - (define docs (get-docs)) - (if (identifier? docs) - ;; normal: - (with-syntax ([(_ xwrap (... ...)) stx] - [id docs]) - #'(xwrap (... ...) id)) - ;; delayed: - (with-syntax ([(_ xwrap (... ...)) stx] - [(reqs exprs ((id d) (... ...))) (syntax-local-introduce - (datum->syntax #f (get-docs)))]) - #`(begin - (require . reqs) - (begin . exprs) - (xwrap (... ...) (list (cons 'id d) (... ...))))))) - (docs wrap ...)))])) - -(define-syntax (include-extracted stx) - (do-include-extracted stx #'(map cdr))) - -(define-syntax (provide-extracted stx) - (syntax-case stx () - [(_ module-path) - #`(begin - #,(do-include-extracted stx #'(define exported)) - (provide exported))])) - -(define-syntax-rule (include-previously-extracted module-path regexp) - (let () - (local-require (rename-in module-path [exported exported])) - (for/list ([p (in-list exported)] - #:when (regexp-match regexp (symbol->string (car p)))) - (cdr p)))) - diff --git a/scribble-lib/scribble/html-properties.rkt b/scribble-lib/scribble/html-properties.rkt deleted file mode 100644 index 6ba51790..00000000 --- a/scribble-lib/scribble/html-properties.rkt +++ /dev/null @@ -1,32 +0,0 @@ -#lang scheme/base -(require "private/provide-structs.rkt" - racket/contract/base - xml/xexpr - net/url-structs) - -(provide-structs - [body-id ([value string?])] - [document-source ([module-path module-path?])] - - [hover-property ([text string?])] - [script-property ([type string?] - [script (or/c path-string? (listof string?))])] - [css-addition ([path (or/c path-string? (cons/c 'collects (listof bytes?)) url? bytes?)])] - [js-addition ([path (or/c path-string? (cons/c 'collects (listof bytes?)) url? bytes?)])] - [html-defaults ([prefix-path (or/c bytes? path-string? (cons/c 'collects (listof bytes?)))] - [style-path (or/c bytes? path-string? (cons/c 'collects (listof bytes?)))] - [extra-files (listof (or/c path-string? (cons/c 'collects (listof bytes?))))])] - [css-style-addition ([path (or/c path-string? (cons/c 'collects (listof bytes?)) url? bytes?)])] - [js-style-addition ([path (or/c path-string? (cons/c 'collects (listof bytes?)) url? bytes?)])] - - [url-anchor ([name string?])] - [alt-tag ([name (and/c string? #rx"^[a-zA-Z0-9]+$")])] - [attributes ([assoc (listof (cons/c symbol? string?))])] - [column-attributes ([assoc (listof (cons/c symbol? string?))])] - - [part-link-redirect ([url url?])] - [install-resource ([path path-string?])] - [link-resource ([path path-string?])] - - [head-extra ([xexpr xexpr/c])] - [render-convertible-as ([types (listof (or/c 'png-bytes 'svg-bytes))])]) diff --git a/scribble-lib/scribble/html-render.rkt b/scribble-lib/scribble/html-render.rkt deleted file mode 100644 index e9d3a5d8..00000000 --- a/scribble-lib/scribble/html-render.rkt +++ /dev/null @@ -1,2049 +0,0 @@ -#lang scheme/base -(require "core.rkt" - "private/render-utils.rkt" - "html-properties.rkt" - "private/literal-anchor.rkt" - scheme/class - scheme/path - scheme/file - scheme/port - scheme/list - scheme/string - file/convertible - mzlib/runtime-path - setup/main-doc - setup/collects - setup/dirs - net/url - net/uri-codec - net/base64 - scheme/serialize - racket/draw/gif - pkg/path - (prefix-in xml: xml/xml) - (for-syntax scheme/base) - "search.rkt" - (except-in "base.rkt" url)) -(provide render-mixin - render-multi-mixin) - -(define as-literal - (let ([loc (xml:make-location 0 0 0)]) - (lambda strings (xml:make-cdata loc loc (string-append* strings))))) -(define (ref-style path) - `(link ([rel "stylesheet"] [type "text/css"] [href ,path] [title "default"]))) -(define (inlined-style . body) - `(style ([type "text/css"]) - ,(apply as-literal - `("\n" - ,@(map (lambda (x) (if (string? x) x (format "~a" x))) body) - "\n")))) -(define (ref-script path) - `(script ([type "text/javascript"] [src ,path]))) -(define (inlined-script . body) - `(script ([type "text/javascript"]) - ,(apply as-literal - `("\n" - ,@(map (lambda (x) (if (string? x) x (format "~a" x))) body) - "\n")))) - -(define-runtime-path scribble-css "scribble.css") -(define-runtime-path scribble-style-css "scribble-style.css") -(define-runtime-path scribble-prefix-html "scribble-prefix.html") -(define-runtime-path scribble-js "scribble-common.js") -;; utilities for render-one-part -(define-values (scribble-css-contents scribble-js-contents) - (let* ([read-file - (lambda (file) - (with-input-from-file file - (lambda () - ;; note: file-size can be bigger than the string, but - ;; that's fine. - (read-string (file-size file)))))] - [adjust-rel - (lambda (depth p) - (if (and (relative-path? p) - (positive? depth)) - (let loop ([d depth] [p p]) - (if (zero? d) - p - (loop (sub1 d) (string-append "../" p)))) - p))] - [file-getter - (lambda (default-file make-inline make-ref) - (let ([c #f]) - (lambda (file path depth) - (cond [(bytes? file) - (make-inline (bytes->string/utf-8 file))] - [(url? file) - (make-ref (url->string* file))] - [(not (eq? 'inline path)) - (make-ref (adjust-rel - depth - (or path (let-values ([(base name dir?) - (split-path file)]) - (path->string name)))))] - [(or (not file) (equal? file default-file)) - (unless c - (set! c (make-inline (read-file default-file)))) - c] - [else (make-inline (read-file file))]))))]) - (values (file-getter scribble-css inlined-style ref-style) - (file-getter scribble-js inlined-script ref-script)))) - -(define (lookup-path path mapping) - (ormap (lambda (p) - (and (equal? (car p) path) - (cdr p))) - mapping)) - -(define current-subdirectory (make-parameter #f)) -(define current-output-file (make-parameter #f)) -(define current-top-part (make-parameter #f)) -(define on-separate-page-ok (make-parameter #t)) -(define collecting-sub (make-parameter 0)) -(define collecting-whole-page (make-parameter #t)) -(define current-no-links (make-parameter #f)) -(define extra-breaking? (make-parameter #f)) -(define current-version (make-parameter (version))) -(define current-part-files (make-parameter #f)) -(define current-render-convertible-requests (make-parameter '(png@2x-bytes png-bytes svg-bytes))) - -(define (url->string* u) - (parameterize ([current-url-encode-mode 'unreserved]) - (url->string u))) - -;; HTML anchors should be case-insensitively unique. To make them -;; distinct, add a "." in front of capital letters. Also clean up -;; characters that give browsers trouble (i.e., the ones that are not -;; allowed as-is in URI components) by using "~" followed by a hex -;; encoding. (The idea is that the result is still readable, so the -;; link can be used as a rough indication of where you'll get to.) -(define (anchor-name v) - (define (encode-byte b) - (string-append (if (< b 16) "~0" "~") (number->string b 16))) - (define (encode-bytes str) - (string->bytes/utf-8 (encode-byte (bytes-ref str 0)))) - (if (literal-anchor? v) - (literal-anchor-string v) - (let* ([v (string->bytes/utf-8 (format "~a" v))] - [v (regexp-replace* #rx#"[A-Z.]" v #".&")] - [v (regexp-replace* #rx#" " v #"._")] - [v (regexp-replace* #rx#"\"" v #".'")] - [v (regexp-replace* #rx#"[^-a-zA-Z0-9_!+*'()/.,]" v encode-bytes)]) - (bytes->string/utf-8 v)))) - -(define (color->string c) - (if (string? c) - c - (string-append* - "#" - (map (lambda (v) - (let ([s (number->string v 16)]) - (if (< v 16) (string-append "0" s) s))) - c)))) - -(define (merge-styles s cls l) - ;; merge multiple 'style and 'class attributes into one - (cond - [(null? l) (append - (if s - (list (list 'style s)) - null) - (if cls - (list (list 'class cls)) - null))] - [(eq? 'style (caar l)) - (merge-styles (if s (string-append s "; " (cadar l)) (cadar l)) - cls - (cdr l))] - [(eq? 'class (caar l)) - (merge-styles s - (if cls (string-append cls " " (cadar l)) (cadar l)) - (cdr l))] - [else (cons (car l) (merge-styles s cls (cdr l)))])) - -(define (style->attribs style [extras null]) - (let ([a (merge-styles - #f - #f - (apply - append - extras - (map (lambda (v) - (cond - [(attributes? v) - (map (lambda (v) (list (car v) (cdr v))) (attributes-assoc v))] - [(color-property? v) - `((style ,(format "color: ~a" (color->string (color-property-color v)))))] - [(background-color-property? v) - `((style ,(format "background-color: ~a" (color->string (background-color-property-color v)))))] - [(hover-property? v) - `((title ,(hover-property-text v)))] - [else null])) - (style-properties style))))]) - (let ([name (style-name style)]) - (if (string? name) - (if (assq 'class a) - (for/list ([i (in-list a)]) - (if (eq? (car i) 'class) - (list 'class (string-append name " " (cadr i))) - i)) - (cons `[class ,name] - a)) - a)))) - -;; combine a 'class attribute from both `cl' and `al' -;; if `cl' starts with one -(define (combine-class cl al) - (cond - [(and (pair? cl) - (eq? (caar cl) 'class) - (for/or ([i (in-list al)]) - (and (eq? (car i) 'class) (cadr i)))) - => (lambda (s) - (cons - `[class ,(string-append (cadar cl) " " s)] - (append - (cdr cl) - (for/list ([i (in-list al)] - #:unless (eq? 'class (car i))) - i))))] - [else - (append cl al)])) - -(define (style->tag style) - (for/or ([s (in-list (style-properties style))]) - (and (alt-tag? s) - (string->symbol (alt-tag-name s))))) - -(define (make-search-box top-path) ; appears on every page - (let ([sa string-append] - [emptylabel "...search manuals..."] - [dimcolor "#888"]) - `(form ([class "searchform"]) - (input - ([class "searchbox"] - [style ,(sa "color: "dimcolor";")] - [type "text"] - [value ,emptylabel] - [title "Enter a search string to search the manuals"] - [onkeypress ,(format "return DoSearchKey(event, this, ~s, ~s);" - (version) top-path)] - [onfocus ,(sa "this.style.color=\"black\"; " - "this.style.textAlign=\"left\"; " - "if (this.value == \""emptylabel"\") this.value=\"\";")] - [onblur ,(sa "if (this.value.match(/^ *$/)) {" - " this.style.color=\""dimcolor"\";" - " this.style.textAlign=\"center\";" - " this.value=\""emptylabel"\"; }")]))))) -(define search-box (make-search-box "../")) -(define top-search-box (make-search-box "")) - -(define (part-tags/nonempty p) - (define l (part-tags p)) - (if (null? l) - (list `(part "???")) - l)) - -(define (part-parent d ri) - (collected-info-parent (part-collected-info d ri))) - -(define (with-output-to-file/clean fn thunk) - ;; We use 'replace instead of the usual 'truncate/replace - ;; to avoid problems where a filename changes only in case, - ;; in which case some platforms will see the old file - ;; as matching the new name, while others don't. Replacing - ;; the file syncs the case with the current uses. - (with-handlers ([exn? ; delete file on breaks, too - (lambda (exn) - (delete-file fn) - (raise exn))]) - (with-output-to-file fn #:exists 'replace thunk))) - -;; ---------------------------------------- -;; main mixin - -(define (render-mixin %) - (class % - (inherit render-block - render-part - collect-part - install-file - get-dest-directory - format-number - number-depth - quiet-table-of-contents - extract-part-style-files - extract-version - extract-authors - extract-pretitle) - (inherit-field prefix-file style-file style-extra-files image-preferences) - - (init-field [alt-paths null] - ;; `up-path' is either a link "up", or #t which goes - ;; to the start page (using cookies to get to the - ;; user start page). If it's a path, then it's also - ;; used for the "top" link on the page. - [up-path #f] - [script-path #f] - [script-file #f] - [search-box? #f]) - - (define/override (current-render-mode) - '(html)) - - (define/override (get-suffix) #".html") - - (define/override (index-manual-newlines?) - #t) - - (define/override (auto-extra-files? v) (html-defaults? v)) - (define/override (auto-extra-files-paths v) (html-defaults-extra-files v)) - (define/override (skip-extra-file? p) - (lookup-path (if (path? p) - p - (collects-relative->path p)) - alt-paths)) - - ;; ---------------------------------------- - - (inherit path->root-relative - root-relative->path - root-relative?) - - (define path-cache (make-hash)) - (define pkg-cache (make-hash)) - - (define (path->relative p) - (let ([p (path->main-doc-relative p)]) - (if (path? p) - (let ([p (path->root-relative p)]) - (if (path? p) - (let ([p (path->collects-relative p #:cache path-cache)]) - (if (path? p) - p - (intern-taglet p))) - (intern-taglet p))) - (intern-taglet p)))) - - (define (relative->path p) - (if (root-relative? p) - (root-relative->path p) - (let ([p (if (or (not (pair? p)) - (eq? (car p) 'doc)) - (main-doc-relative->path p) - p)]) - (if (path? p) - p - (collects-relative->path p))))) - - ;; ---------------------------------------- - - (define/override (start-collect ds fns ci) - (for-each (lambda (d fn) - (parameterize ([current-output-file fn] - [current-top-part d]) - (collect-part d #f ci null 1 #hash()))) - ds - fns)) - - (define/public (part-whole-page? p ri) - (let ([dest (resolve-get p ri (car (part-tags/nonempty p)))]) - (and dest (dest-page? dest)))) - - (define/public (current-part-whole-page? d) - (eq? d (current-top-part))) - - (define/override (fresh-tag-collect-context? d ci) - (current-part-whole-page? d)) - (define/override (fresh-tag-resolve-context? d ri) - (part-whole-page? d ri)) - (define/override (fresh-tag-render-context? d ri) - (part-whole-page? d ri)) - - (define/override (collect-part-tags d ci number) - (define redirect (let ([s (part-style d)]) - (and s - (for/or ([p (in-list (style-properties s))]) - (and (part-link-redirect? p) - (part-link-redirect-url p)))))) - (for ([t (part-tags d)]) - (let ([key (generate-tag t ci)]) - (collect-put! ci key - (let ([v (vector (or (part-title-content d) '("???")) - (add-current-tag-prefix key) - number ; for consistency with base - (and (current-output-file) - (path->relative (current-output-file))) - (current-part-whole-page? d))]) - (if redirect - (list->vector (append (vector->list v) - (list (url->string* redirect)))) - v)))))) - - (define/override (collect-target-element i ci) - (let ([key (generate-tag (target-element-tag i) ci)]) - (collect-put! ci key - (vector (let ([tag (target-element-tag i)]) - (if (and (pair? tag) (eq? 'part (car tag))) - (element-content i) - #f)) - (if (redirect-target-element? i) - (make-literal-anchor - (redirect-target-element-alt-anchor i)) - (add-current-tag-prefix key)) - #f ; for consistency with 'part info - (path->relative - (let ([p (current-output-file)]) - (if (redirect-target-element? i) - (let-values ([(base name dir?) (split-path p)]) - (build-path base - (redirect-target-element-alt-path i))) - p))) - (page-target-element? i))))) - - (define (dest-path dest) - (vector-ref dest 3)) - (define (dest-title dest) - (vector-ref dest 0)) - (define (dest-page? dest) - (vector-ref dest 4)) - (define (dest-anchor dest) - (vector-ref dest 1)) - (define (dest-redirect dest) - (if ((vector-length dest) . > . 5) - (vector-ref dest 5) - #f)) - - ;; ---------------------------------------- - - (define external-tag-path #f) - (define/override (set-external-tag-path p) - (set! external-tag-path p)) - - (define external-root-url #f) - (define/override (set-external-root-url p) - (set! external-root-url p)) - - (define extra-script-files null) - (define/override (add-extra-script-file s) - (set! extra-script-files (cons s extra-script-files))) - - (define (try-relative-to-external-root dest) - (cond - [(let ([rel (find-relative-path - (find-doc-dir) - (relative->path (dest-path dest)))]) - (and (relative-path? rel) - rel)) - => (lambda (rel) - (cons - (url->string* - (struct-copy - url - (combine-url/relative - (string->url external-root-url) - (string-join (map path-element->string - (explode-path rel)) - "/")))) - (and (not (dest-page? dest)) - (anchor-name (dest-anchor dest)))))] - [else #f])) - - (define/public (tag->path+anchor ri tag) - ;; Called externally; not used internally - (let-values ([(dest ext?) (resolve-get/ext? #f ri tag)]) - (cond [(not dest) (values #f #f)] - [(and ext? external-root-url - (try-relative-to-external-root dest)) - => (lambda (p) - (values (car p) (cdr p)))] - [(and ext? external-tag-path) - (values (string->url external-tag-path) (format "~a" (serialize tag)))] - [else (values (relative->path (dest-path dest)) - (and (not (dest-page? dest)) - (anchor-name (dest-anchor dest))))]))) - - (define/public (tag->url-string ri tag #:absolute? [abs? #f]) - ;; Called externally; not used internally - (let-values ([(dest ext?) (resolve-get/ext? #f ri tag)]) - (cond [(not dest) ""] - [else (dest->url dest abs?)]))) - - (define/public (tag->query-string tag) - (define (simple? s) - (or (symbol? s) - (string? s) - (number? s) - (and (list? s) (andmap simple? s)))) - (anchor-name (format "~s" (if (simple? tag) - tag - (serialize tag))))) - - (define/private (link-element-indirect? e) - (memq 'indirect-link - (let ([s (element-style e)]) - (or (and (style? s) - (style-properties s)) - null)))) - - (define/override (resolve-content i d ri) - (cond - [(and (link-element? i) - external-tag-path - (link-element-indirect? i)) - ;; don't resolve indirect link - (resolve-content (element-content i) d ri)] - [else - (super resolve-content i d ri)])) - - ;; ---------------------------------------- - - (define/private (reveal-subparts? p) ;!!! need to use this - (part-style? p 'reveal)) - - (define/public (toc-wrap table) - null) - - (define/private (dest->url dest [abs? #f]) - (if dest - (or (dest-redirect dest) - (format "~a~a~a" - (let ([p (relative->path (dest-path dest))]) - (if abs? - (path->url-string (path->complete-path p)) - (if (equal? p (current-output-file)) - "" - (from-root p (get-dest-directory))))) - (if (dest-page? dest) "" "#") - (if (dest-page? dest) - "" - (uri-unreserved-encode - (anchor-name (dest-anchor dest)))))) - "???")) - - (define/private (dest->url-in-doc dest ext-id) - (and dest - (not (dest-redirect dest)) - (format "~a~a~a" - ;; The path within the document directory is normally - ;; just a single element, but detect nested paths - ;; (for "r5rs-std", for example) when the containing - ;; directory doesn't match `ext-id`: - (let loop ([path (relative->path (dest-path dest))] - [empty-ok? #f]) - (let-values ([(base name dir?) (split-path path)]) - (cond - [(and empty-ok? - dir? - (equal? (format "~a" name) (format "~a" ext-id))) - #f] - [(path? base) - (define r (loop base #t)) - (if r (build-path r name) name)] - [else name]))) - (if (dest-page? dest) "" "#") - (if (dest-page? dest) - "" - (uri-unreserved-encode - (anchor-name (dest-anchor dest))))))) - - (inherit sort-image-requests) - (define/override (render ds fns ri) - (parameterize ([current-render-convertible-requests - (sort-image-requests (current-render-convertible-requests) - image-preferences)]) - (render-top ds fns ri))) - - (define/public (render-top ds fns ri) - (super render ds fns ri)) - - (define/public (render-toc-view d ri) - (define has-sub-parts? - (pair? (part-parts d))) - (define sub-parts-on-other-page? - (and has-sub-parts? - (part-whole-page? (car (part-parts d)) ri))) - (define toc-chain - (let loop ([d d] [r (if has-sub-parts? (list d) '())]) - (cond [(collected-info-parent (part-collected-info d ri)) - => (lambda (p) (loop p (cons p r)))] - [(pair? r) r] - ;; we have no toc, so use just the current part - [else (list d)]))) - (define top (car toc-chain)) - (define (toc-item->title+num t show-mine?) - (values - `((a ([href ,(dest->url (resolve-get t ri (car (part-tags/nonempty t))))] - [class ,(if (or (eq? t d) (and show-mine? (memq t toc-chain))) - "tocviewselflink" - "tocviewlink")] - [data-pltdoc "x"]) - ,@(render-content (strip-aux (or (part-title-content t) '("???"))) d ri))) - (format-number (collected-info-number (part-collected-info t ri)) - '(nbsp)))) - (define (toc-item->block t i) - (define-values (title num) (toc-item->title+num t #f)) - (define children ; note: might be empty - (filter (lambda (p) (not (part-style? p 'toc-hidden))) - (part-parts t))) - (define id (format "tocview_~a" i)) - (define last? (eq? t (last toc-chain))) - (define expand? (or (and last? - (or (not has-sub-parts?) - sub-parts-on-other-page?)) - (and has-sub-parts? - (not sub-parts-on-other-page?) - ;; next-to-last? - (let loop ([l toc-chain]) - (cond - [(null? l) #f] - [(eq? t (car l)) - (and (pair? (cdr l)) (null? (cddr l)))] - [else (loop (cdr l))]))))) - (define top? (eq? t top)) - (define header - `(table ([cellspacing "0"] [cellpadding "0"]) - (tr () - (td ([style "width: 1em;"]) - ,(if (null? children) - 'bull - `(a ([href "javascript:void(0);"] - [title "Expand/Collapse"] - [class "tocviewtoggle"] - [onclick ,(format "TocviewToggle(this,\"~a\");" id)]) - ,(if expand? 9660 9658)))) - (td () ,@num) - (td () ,@title)))) - `(div ([class ,(if top? - "tocviewlist tocviewlisttopspace" - "tocviewlist")]) - ,(if top? `(div ([class "tocviewtitle"]) ,header) header) - ,(if (null? children) - "" - `(div ([class ,(cond - [(and top? last?) "tocviewsublistonly"] - [top? "tocviewsublisttop"] - [last? "tocviewsublistbottom"] - [else "tocviewsublist"])] - [style ,(format "display: ~a;" (if expand? 'block 'none))] - [id ,id]) - (table ([cellspacing "0"] [cellpadding "0"]) - ,@(for/list ([c children]) - (let-values ([(t n) (toc-item->title+num c #t)]) - `(tr () (td ([align "right"]) ,@n) (td () ,@t))))))))) - (define (toc-content) - ;; no links -- the code constructs links where needed - (parameterize ([current-no-links #t] - [extra-breaking? #t]) - (for/list ([t toc-chain] [i (in-naturals)]) - (toc-item->block t i)))) - `((div ([class "tocset"]) - ,@(if (part-style? d 'no-toc) - null - ;; toc-wrap determines if we get the toc or just the title !!! - `((div ([class "tocview"]) ,@(toc-content)))) - ,@(if (part-style? d 'no-sidebar) - null - (render-onthispage-contents - d ri top (if (part-style? d 'no-toc) "tocview" "tocsub") - sub-parts-on-other-page?)) - ,@(parameterize ([extra-breaking? #t]) - (append-map (lambda (e) - (let loop ([e e]) - (cond - [(and (table? e) - (memq 'aux (style-properties (table-style e))) - (pair? (table-blockss e))) - (render-table e d ri #f)] - [(delayed-block? e) - (loop (delayed-block-blocks e ri))] - [(traverse-block? e) - (loop (traverse-block-block e ri))] - [(compound-paragraph? e) - (append-map loop (compound-paragraph-blocks e))] - [else null]))) - (part-blocks d)))))) - - (define/public (get-onthispage-label) - null) - - (define/public (nearly-top? d ri top) - #f) - - (define hidden-memo (make-weak-hasheq)) - (define/public (all-toc-hidden? p) - (hash-ref hidden-memo - p - (lambda () - (define h? (and (part-style? p 'toc-hidden) - (andmap (lambda (s) (all-toc-hidden? s)) - (part-parts p)))) - (hash-set! hidden-memo p h?) - h?))) - - (define/private (render-onthispage-contents d ri top box-class sections-in-toc?) - (let ([nearly-top? (lambda (d) - ;; If ToC would be collapsed, then - ;; no section is nearly the top - (if (not sections-in-toc?) - #f - (nearly-top? d ri top)))]) - (define (flow-targets flow) - (append-map block-targets flow)) - (define (block-targets e) - (cond [(table? e) (table-targets e)] - [(paragraph? e) (para-targets e)] - [(itemization? e) - (append-map flow-targets (itemization-blockss e))] - [(nested-flow? e) - (append-map block-targets (nested-flow-blocks e))] - [(compound-paragraph? e) - (append-map block-targets (compound-paragraph-blocks e))] - [(delayed-block? e) null] - [(traverse-block? e) (block-targets (traverse-block-block e ri))])) - (define (para-targets para) - (let loop ([a (paragraph-content para)]) - (cond - [(list? a) (append-map loop a)] - [(toc-target-element? a) (list a)] - [(toc-element? a) (list a)] - [(element? a) (loop (element-content a))] - [(delayed-element? a) (loop (delayed-element-content a ri))] - [(traverse-element? a) (loop (traverse-element-content a ri))] - [(part-relative-element? a) (loop (part-relative-element-content a ri))] - [else null]))) - (define (table-targets table) - (append-map - (lambda (blocks) - (append-map (lambda (f) (if (eq? f 'cont) null (block-targets f))) - blocks)) - (table-blockss table))) - (define ps - ((if (or (nearly-top? d) (eq? d top)) values (lambda (p) (if (pair? p) (cdr p) null))) - (let flatten ([d d] [prefixes null] [top? #t]) - (let ([prefixes (if (and (not top?) (part-tag-prefix d)) - (cons (part-tag-prefix d) prefixes) - prefixes)]) - (append* - ;; don't include the section if it's in the TOC - (if (or (nearly-top? d) - (part-style? d 'toc-hidden)) - null - (list (cons d prefixes))) - ;; get internal targets: - (map (lambda (v) (cons v prefixes)) (append-map block-targets (part-blocks d))) - (map (lambda (p) (if (or (part-whole-page? p ri) - (and (part-style? p 'toc-hidden) - (all-toc-hidden? p))) - null - (flatten p prefixes #f))) - (part-parts d))))))) - (define any-parts? (ormap (compose part? car) ps)) - (if (null? ps) - null - `((div ([class ,box-class]) - ,@(get-onthispage-label) - (table ([class "tocsublist"] [cellspacing "0"]) - ,@(map (lambda (p) - (let ([p (car p)] - [prefixes (cdr p)] - [add-tag-prefixes - (lambda (t prefixes) - (if (null? prefixes) - t - (cons (car t) (append prefixes (cdr t)))))]) - `(tr - (td - ,@(if (part? p) - `((span ([class "tocsublinknumber"]) - ,@(format-number - (collected-info-number - (part-collected-info p ri)) - '((tt nbsp))))) - '("")) - ,@(if (toc-element? p) - (render-content (toc-element-toc-content p) - d ri) - (parameterize ([current-no-links #t] - [extra-breaking? #t]) - `((a ([href - ,(format - "#~a" - (uri-unreserved-encode - (anchor-name - (add-tag-prefixes - (tag-key (if (part? p) - (car (part-tags/nonempty p)) - (target-element-tag p)) - ri) - prefixes))))] - [class - ,(cond - [(part? p) "tocsubseclink"] - [any-parts? "tocsubnonseclink"] - [else "tocsublink"])] - [data-pltdoc "x"]) - ,@(render-content - (if (part? p) - (strip-aux - (or (part-title-content p) - "???")) - (if (toc-target2-element? p) - (toc-target2-element-toc-content p) - (element-content p))) - d ri))))))))) - ps))))))) - - (define/private (extract-inherited d ri pred extract) - (or (ormap (lambda (v) - (and (pred v) - (extract v))) - (style-properties (part-style d))) - (let ([p (part-parent d ri)]) - (and p (extract-inherited p ri pred extract))))) - - (define/public (extract-part-body-id d ri) - (extract-inherited d ri body-id? body-id-value)) - - (define/public (extract-part-source d ri) - (extract-inherited d ri document-source? document-source-module-path)) - - (define/public (part-nesting-depth d ri) - 0) - - (define/public (render-one-part d ri fn number) - (parameterize ([current-output-file fn]) - (let* ([defaults (let loop ([d d]) - (or (ormap (lambda (v) (and (html-defaults? v) v)) - (style-properties (part-style d))) - (let ([p (part-parent d ri)]) - (and p (loop p)))))] - [prefix-file (or prefix-file - (and defaults - (let ([v (html-defaults-prefix-path defaults)]) - (if (bytes? v) - v - (collects-relative->path v)))) - scribble-prefix-html)] - [style-file (or style-file - (and defaults - (let ([v (html-defaults-style-path defaults)]) - (if (bytes? v) - v - (collects-relative->path v)))) - scribble-style-css)] - [script-file (or script-file scribble-js)] - [title (cond [(part-title-content d) - => (lambda (c) - `(title ,@(format-number number '(nbsp)) - ,(content->string (strip-aux c) this d ri)))] - [else `(title)])] - [dir-depth (part-nesting-depth d ri)] - [extract (lambda (pred get) (extract-part-style-files - d - ri - (lambda (p) (part-whole-page? p ri)) - pred - get))]) - (unless (bytes? style-file) - (unless (lookup-path style-file alt-paths) - (install-file style-file))) - (unless (lookup-path scribble-css alt-paths) - (install-file scribble-css)) - (unless (lookup-path script-file alt-paths) - (install-file script-file)) - (if (bytes? prefix-file) - (display prefix-file) - (call-with-input-file* - prefix-file - (lambda (in) - (copy-port in (current-output-port))))) - (parameterize ([xml:empty-tag-shorthand xml:html-empty-tags]) - (xml:write-xexpr - `(html ,(style->attribs (part-style d)) - (head () - (meta ([http-equiv "content-type"] - [content "text/html; charset=utf-8"])) - ,title - ,(scribble-css-contents scribble-css - (lookup-path scribble-css alt-paths) - dir-depth) - ,@(map (lambda (style-file) - (if (or (bytes? style-file) (url? style-file)) - (scribble-css-contents style-file #f dir-depth) - (let ([p (lookup-path style-file alt-paths)]) - (unless p (install-file style-file)) - (scribble-css-contents style-file p dir-depth)))) - (append (extract css-addition? css-addition-path) - (list style-file) - (extract css-style-addition? css-style-addition-path) - style-extra-files)) - ,(scribble-js-contents script-file - (lookup-path script-file alt-paths) - dir-depth) - ,@(map (lambda (script-file) - (if (or (bytes? script-file) (url? script-file)) - (scribble-js-contents script-file #f dir-depth) - (let ([p (lookup-path script-file alt-paths)]) - (unless p (install-file script-file)) - (scribble-js-contents script-file p dir-depth)))) - (append - (extract js-addition? js-addition-path) - (extract js-style-addition? js-style-addition-path) - (reverse extra-script-files))) - ,(xml:comment "[if IE 6]>url (resolve-get x ri (car (part-tags/nonempty x)))) - (string-append - "\"" - (content->string - (append (format-number (collected-info-number - (part-collected-info x ri)) - '(" ")) - (part-title-content x))) - "\""))] - [(equal? x "index.html") (values x "the manual top")] - [(equal? x "../index.html") (values x "the documentation top")] - [(string? x) (values x #f)] - [(path? x) (values (url->string* (path->url x)) #f)] - [else (error 'navigation "internal error ~e" x)])) - (define title* - (if (and tfrom (part? tfrom)) - (string-append - "\"" (content->string (part-title-content tfrom)) "\"") - title)) - (make-style - #f - (list - (make-target-url (if (equal? url "") - "#" - url)) - (make-attributes - `([title . ,(if title* (string-append label " to " title*) label)] - [data-pltdoc . "x"] - ,@more))))) - (define top-link - (titled-url - "up" (if (path? up-path) - (url->string* (path->url up-path)) - "../index.html") - `[onclick . ,(format "return GotoPLTRoot(\"~a\");" (version))])) - (define navleft - `(span ([class "navleft"]) - ,@(if search-box? - (list (if up-path search-box top-search-box)) - (list `(div ([class "nosearchform"])))) - ,@(render - sep-element - (and up-path (make-element top-link top-content)) - ;; sep-element - ;; (make-element - ;; (if parent (make-target-url "index.html" #f) "nonavigation") - ;; contents-content) - ;; sep-element - ;; (if (or (not index) (eq? d index)) - ;; (make-element "nonavigation" index-content) - ;; (make-link-element #f index-content (car (part-tags/nonempty index)))) - ))) - (define navright - (if (not (or parent up-path next)) - "" - `(span ([class "navright"]) - ,@(render - ;; put space here for text browsers and to avoid an Opera issue - sep-element - (make-element - (cond [(not parent) "nonavigation"] - [prev (titled-url "backward" prev)] - [else (titled-url "backward" "index.html" - #:title-from - (and (part? parent) parent))]) - prev-content) - sep-element - (make-element - (cond - [(and (part? parent) (toc-part? parent ri) - (part-parent parent ri)) - (titled-url "up" parent)] - [parent (titled-url "up" "index.html" #:title-from parent)] - ;; up-path = #t => go up to the start page, using - ;; cookies to get to the user's version of it (see - ;; scribblings/main/private/utils for the code that - ;; creates these cookies.) - [(eq? #t up-path) top-link] - [up-path (titled-url "up" up-path)] - [else "nonavigation"]) - up-content) - sep-element - (make-element - (if next (titled-url "forward" next) "nonavigation") - next-content))))) - (define navbar - `(div ([class ,(if top? "navsettop" "navsetbottom")]) - ,navleft ,navright nbsp)) ; need nbsp to make the navset bg visible - (if (include-navigation?) - (list navbar) - null)) - - (define/override (render-one d ri fn) - (render-one-part d ri fn null)) - - (define/public (render-version d ri) - (let ([v (current-version)]) - (if (equal? v "") - ;; don't show empty version: - null - ;; show version: - `((div ([class "versionbox"]) - ,@(render-content - (list (make-element (if (include-navigation?) - "version" - "versionNoNav") - v)) - d - ri)))))) - - (define/public (extract-render-convertible-as d) - (for/or ([v (in-list (style-properties (part-style d)))]) - (and (render-convertible-as? v) - (render-convertible-as-types v)))) - - (define/override (render-part-content d ri) - (parameterize ([current-render-convertible-requests (or (extract-render-convertible-as d) - (current-render-convertible-requests))]) - (let ([number (collected-info-number (part-collected-info d ri))]) - `(,@(let ([pres (extract-pretitle d)]) - (append-map (lambda (pre) - (do-render-paragraph pre d ri #f #t)) - pres)) - ,@(cond - [(and (not (part-title-content d)) (null? number)) null] - [(part-style? d 'hidden) - (map (lambda (t) - `(a ((name ,(format "~a" (anchor-name - (add-current-tag-prefix - (tag-key t ri)))))))) - (part-tags d))] - [else `((,(case (number-depth number) - [(0) 'h2] - [(1) 'h3] - [(2) 'h4] - [else 'h5]) - ,(let ([src (extract-part-source d ri)] - [taglet (for/or ([t (in-list (part-tags d))]) - (and (pair? t) - (eq? 'part (car t)) - (= 2 (length t)) - (cadr t)))]) - (if (and src taglet) - `([x-source-module ,(format "~s" src)] - ,@(let* ([path (resolved-module-path-name - (module-path-index-resolve - (module-path-index-join src #f)))] - [pkg (and (path? path) - (path->pkg path #:cache pkg-cache))]) - (if pkg - `([x-source-pkg ,pkg]) - null)) - ,@(let ([prefixes (current-tag-prefixes)]) - (if (null? prefixes) - null - `([x-part-prefixes ,(format "~s" prefixes)]))) - [x-part-tag ,(format "~s" taglet)]) - '())) - ,@(format-number number '((tt nbsp))) - ,@(map (lambda (t) - `(a ([name ,(format "~a" (anchor-name - (add-current-tag-prefix - (tag-key t ri))))]))) - (part-tags d)) - ,@(if (part-title-content d) - (render-content (part-title-content d) d ri) - null)))]) - ,@(let ([auths (extract-authors d)]) - (if (null? auths) - null - `((div ([class "SAuthorListBox"]) - (span ([class "SAuthorList"]) - ,@(apply - append - (for/list ([auth (in-list auths)] - [pos (in-naturals)]) - (let ([v (do-render-paragraph auth d ri #f #t)]) - (if (zero? pos) - v - (cons '(span ([class "SAuthorSep"]) (br)) v)))))))))) - ,@(render-flow* (part-blocks d) d ri #f #f) - ,@(let loop ([pos 1] - [secs (part-parts d)]) - (if (null? secs) - null - (append (render-part (car secs) ri) - (loop (add1 pos) (cdr secs))))))))) - - (define/private (render-flow* p part ri starting-item? special-last?) - ;; Wrap each table with

      , except for a trailing table - ;; when `special-last?' is #t - (let loop ([f p] [starting-item? starting-item?]) - (cond - [(null? f) null] - [(and (table? (car f)) - (or (not special-last?) (not (null? (cdr f))))) - (cons `(p ,@(render-block (car f) part ri starting-item?)) - (loop (cdr f) #f))] - [else (append (render-block (car f) part ri starting-item?) - (loop (cdr f) #f))]))) - - (define/override (render-flow p part ri starting-item?) - (render-flow* p part ri starting-item? #t)) - - (define/private (do-render-paragraph p part ri flatten-unstyled? show-pre?) - (let* ([contents (super render-paragraph p part ri)] - [style (paragraph-style p)] - [attrs (style->attribs style)]) - (if (and (not show-pre?) - (or (eq? (style-name style) 'author) - (eq? (style-name style) 'pretitle))) - null - (if (and flatten-unstyled? - (not (style-name style)) - (null? attrs)) - contents - `((,(or (style->tag style) - (if (memq 'div (style-properties style)) - 'div - 'p)) - [,@(combine-class - (case (style-name style) - [(author) '([class "author"])] - [(pretitle) '([class "SPretitle"])] - [(wraps) null] - [else null]) - attrs)] - ,@contents)))))) - - (define/override (render-paragraph p part ri) - (do-render-paragraph p part ri #f #f)) - - (define/override (render-intrapara-block p part ri first? last? starting-item?) - `((div ([class "SIntrapara"]) - ,@(cond - [(paragraph? p) (do-render-paragraph p part ri #t #f)] - [else (render-block p part ri starting-item?)])))) - - (define/private (content-style e) - (cond - [(element? e) (element-style e)] - [(multiarg-element? e) (multiarg-element-style e)] - [else #f])) - - (define/private (content-attribs e [extras null]) - (let ([s (content-style e)]) - (if (style? s) - (element-style->attribs (style-name s) s extras) - (element-style->attribs s #f extras)))) - - (define/override (render-content e part ri) - (define (attribs [extras null]) (content-attribs e extras)) - (cond - [(string? e) (super render-content e part ri)] ; short-cut for common case - [(list? e) (super render-content e part ri)] ; also a short-cut - [(and (convertible? e) - (render-as-convertible e (current-render-convertible-requests))) - => values] - [(image-element? e) - (let* ([src (collects-relative->path (image-element-path e))] - [suffixes (image-element-suffixes e)] - [scale (image-element-scale e)] - [to-scaled-num - (lambda (s) - (number->string - (inexact->exact - (floor (* scale (if (number? s) - s - (integer-bytes->integer s #f #t)))))))] - [src (select-suffix src suffixes '(".png" ".gif" ".svg"))] - [svg? (regexp-match? #rx#"[.]svg$" (if (path? src) (path->bytes src) src))] - [sz (cond - [svg? - (define (to-scaled-num-from-str s) - (define parts - (regexp-match - #rx"^([+-]?[0-9]*\\.?([0-9]+)?)(em|ex|px|in|cm|mm|pt|pc|%|)$" - s)) - (cond - [parts - (string-append - (number->string - (* scale - (string->number (list-ref parts 1)))) - (list-ref parts 3))] - [else s])) - (call-with-input-file* - src - (lambda (in) - (with-handlers ([exn:fail? (lambda (exn) - (log-warning - (format "warning: error while reading SVG file for size: ~a" - (if (exn? exn) - (exn-message exn) - (format "~e" exn)))) - null)]) - (let* ([d (xml:read-xml in)] - [attribs (xml:element-attributes - (xml:document-element d))] - [check-name (lambda (n) - (lambda (a) - (and (eq? n (xml:attribute-name a)) - (xml:attribute-value a))))] - [w (ormap (check-name 'width) attribs)] - [h (ormap (check-name 'height) attribs)]) - (if (and w h) - `([width ,(to-scaled-num-from-str w)] - [height ,(to-scaled-num-from-str h)]) - null)))))] - [else - ;; Try to extract file size: - (call-with-input-file* - src - (lambda (in) - (cond - [(regexp-try-match #px#"^\211PNG.{12}" in) - `([width ,(to-scaled-num (read-bytes 4 in))] - [height ,(to-scaled-num (read-bytes 4 in))])] - [(regexp-try-match #px#"^(?=GIF8)" in) - (define-values (w h rows) (gif->rgba-rows in)) - `([width ,(to-scaled-num w)] - [height ,(to-scaled-num h)])] - [else - null])))])]) - (let ([srcref (let ([p (install-file src)]) - (if (path? p) - (url->string* (path->url (path->complete-path p))) - p))]) - `((,(if svg? 'object 'img) - ([,(if svg? 'data 'src) ,srcref] - [alt ,(content->string (element-content e))] - ,@(if svg? - `([type "image/svg+xml"]) - null) - ,@sz - ,@(attribs)) - ,@(if svg? - `((param ([name "src"] [value ,srcref]))) - null)))))] - [(and (or (element? e) (multiarg-element? e)) - (ormap (lambda (v) (and (script-property? v) v)) - (let ([s (if (element? e) - (element-style e) - (multiarg-element-style e))]) - (if (style? s) (style-properties s) null)))) - => - (lambda (v) - (let* ([t `[type ,(script-property-type v)]] - [s (script-property-script v)] - [s (if (list? s) - `(script (,t ,@(attribs)) ,(apply as-literal `("\n" ,@s "\n"))) - `(script (,t ,@(attribs) [src ,s])))]) - (list s - `(noscript ,@(render-plain-content e part ri)))))] - [(target-element? e) - `((a ([name ,(format "~a" (anchor-name (add-current-tag-prefix - (tag-key (target-element-tag e) - ri))))] - ,@(attribs))) - ,@(render-content (element-content e) part ri))] - [(and (link-element? e) (not (current-no-links))) - (parameterize ([current-no-links #t]) - (define indirect-link? (link-element-indirect? e)) - (let-values ([(dest ext-id) - (if (and indirect-link? - external-tag-path) - (values #f #f) - (resolve-get/ext-id part ri (link-element-tag e)))]) - (if (or indirect-link? dest) - `((a ([href - ,(cond - [(and ext-id external-root-url dest - (let* ([ref-path (relative->path (dest-path dest))] - [rel (if (relative-path? ref-path) - #f - (find-relative-path - (find-doc-dir) - ref-path))]) - (and rel - (relative-path? rel) - (not (memq 'up (explode-path rel))) - rel))) - => (lambda (rel) - (url->string* - (struct-copy - url - (combine-url/relative - (string->url external-root-url) - (string-join (map (lambda (s) - (case s - [(up) ".."] - [(same) "."] - [else (path-element->string s)])) - (explode-path rel)) - "/")) - [fragment - (and (not (dest-page? dest)) - (anchor-name (dest-anchor dest)))])))] - [(or indirect-link? - (and ext-id external-tag-path)) - ;; Redirected to search: - (url->string* - (let ([u (string->url (or external-tag-path - (get-doc-search-url)))]) - (struct-copy - url - u - [query - (if (string? ext-id) - (list* (cons 'doc ext-id) - (cons 'rel (or (dest->url-in-doc dest ext-id) "???")) - (url-query u)) - (cons (cons 'tag (tag->query-string (link-element-tag e))) - (url-query u)))])))] - [else - ;; Normal link: - (dest->url dest)])] - ,@(attribs (if (or indirect-link? - (and ext-id external-tag-path)) - '([class "Sq"]) - null)) - [data-pltdoc "x"]) - ,@(if (empty-content? (element-content e)) - (render-content (strip-aux (dest-title dest)) part ri) - (render-content (element-content e) part ri)))) - (begin - (when #f - (eprintf "Undefined link: ~s\n" - (tag-key (link-element-tag e) ri))) - `((font ([class "badlink"]) - ,@(if (empty-content? (element-content e)) - `(,(format "~s" (tag-key (link-element-tag e) ri))) - (render-plain-content e part ri))))))))] - [else - (render-plain-content e part ri)])) - - (define/private (render-as-convertible e requests) - (for/or ([request (in-list requests)]) - (cond - [(case request - [(png-bytes) - (or (convert e 'png-bytes+bounds8) - (convert e 'png-bytes+bounds) - (convert e 'png-bytes))] - [(png@2x-bytes) - (or (convert e 'png@2x-bytes+bounds8) - (convert e 'png@2x-bytes+bounds) - (convert e 'png@2x-bytes))] - [else #f]) - => - (lambda (cvt) - (let* ([bstr (if (list? cvt) (first cvt) cvt)] - [w (if (list? cvt) - (list-ref cvt 1) - (integer-bytes->integer (subbytes bstr 16 20) #f #t))] - [h (if (list? cvt) - (list-ref cvt 2) - (integer-bytes->integer (subbytes bstr 20 24) #f #t))] - [scale (lambda (v) - (if (and (not (list? cvt)) - (equal? request 'png@2x-bytes)) - (/ v 2.0) - v))] - [number->decimal-string (lambda (s) - (number->string - (if (integer? s) - s - (exact->inexact s))))]) - (list - (add-padding - cvt - `(img ([src ,(install-file "pict.png" bstr)] - [alt "image"] - [width ,(number->decimal-string (scale w))] - [height ,(number->decimal-string (scale h))]))))))] - [(case request - [(svg-bytes) - (or (convert e 'svg-bytes+bounds8) - (convert e 'svg-bytes))] - [else #f]) - => (lambda (cvt) - (let* ([bstr (if (list? cvt) (first cvt) cvt)]) - (list - (add-padding - cvt - `(object - ([data ,(install-file "pict.svg" bstr)] - [type "image/svg+xml"]))))))] - [else #f]))) - - ;; Add padding for a bounding-box conversion reply: - (define/private (add-padding cvt e) - (define descent (and (list? cvt) - ((length cvt) . >= . 5) - (list-ref cvt 3))) - (define padding (and (list? cvt) - ((length cvt) . >= . 9) - (take (list-tail cvt 5) 4))) - (cond - [(and (or (not descent) - (zero? descent)) - (or (not padding) - (andmap zero? padding))) - e] - [else - ;; Descent and padding: - (define-values (left top right bottom) (apply values padding)) - `(,(car e) ,(cons `[style ,(format "vertical-align: ~apx; margin: ~apx ~apx ~apx ~apx;" - (- (- descent bottom)) - (- top) (- right) - (- bottom) (- left))] - (cadr e)) - ,@(cddr e))])) - - (define/private (render-plain-content e part ri) - (define (attribs) (content-attribs e)) - (let* ([properties (let ([s (content-style e)]) - (if (style? s) - (style-properties s) - null))] - [name (let ([s (content-style e)]) - (if (style? s) - (style-name s) - s))] - [alt-tag - (let ([s (content-style e)]) - (and (style? s) - (style->tag s)))] - [resources (for/list ([p (in-list properties)] - #:when (install-resource? p)) - (install-resource-path p))] - [link-resource (for/or ([p (in-list properties)] - #:when (link-resource? p)) - (link-resource-path p))] - [link? (and (or (ormap target-url? properties) - link-resource) - (not (current-no-links)))] - [anchor? (ormap url-anchor? properties)] - [attribs - (append - (if (null? properties) - null - (append-map (lambda (v) - (cond - [(target-url? v) - (if (current-no-links) - null - `([href ,(let ([addr (target-url-addr v)]) - (if (path? addr) - (from-root addr (get-dest-directory)) - addr))]))] - [else null])) - properties)) - (attribs))] - [newline? (eq? name 'newline)] - [check-render - (lambda () - (when (render-element? e) - ((render-element-render e) this part ri)))]) - (for ([r (in-list resources)]) - (install-file r)) - (let-values ([(content) (cond - [link? - (parameterize ([current-no-links #t]) - (super render-content e part ri))] - [newline? (check-render) null] - [(eq? 'hspace name) - (check-render) - (let ([str (content->string e)]) - (map (lambda (c) 'nbsp) (string->list str)))] - [else - (super render-content e part ri)])]) - (if (and (null? attribs) - (not link?) - (not anchor?) - (not newline?) - (not alt-tag)) - content - `(,@(if anchor? - (append-map (lambda (v) - (if (url-anchor? v) - `((a ([name ,(url-anchor-name v)]))) - null)) - properties) - null) - (,(cond - [alt-tag alt-tag] - [link? 'a] - [newline? 'br] - [else 'span]) - ,(append - (if link-resource - `([href ,(install-file link-resource)]) - null) - attribs) - ,@content)))))) - - (define/private (element-style->attribs name style [extras null]) - (combine-class - (cond - [(symbol? name) - (case name - [(italic) '([style "font-style: italic"])] - [(bold) '([style "font-weight: bold"])] - [(tt) '([class "stt"])] - [(roman) '([class "sroman"])] - [(url) '([class "url"])] - [(no-break) '([class "nobreak"])] - [(sf) '([class "ssansserif"])] - [(superscript) '([style "vertical-align: super; font-size: 80%"])] - [(subscript) '([style "vertical-align: sub; font-size: 80%"])] - [(smaller) '([class "Smaller"])] - [(larger) '([class "Larger"])] - [(hspace) '([class "hspace"])] - [(newline) '()] - [else (error 'html-render "unrecognized style symbol: ~e" name)])] - [(string? name) (if style null `([class ,name]))] - [else null]) - (if style - (style->attribs style extras) - (if (pair? extras) - (style->attribs (make-style #f null) extras) - null)))) - - (define/override (render-table t part ri starting-item?) - (define (make-row flows column-styles) - `(tr - ,@(let loop ([ds flows] - [column-styles column-styles] - [first? #t]) - (cond - [(null? ds) null] - [(eq? (car ds) 'cont) - (loop (cdr ds) (cdr column-styles) first?)] - [else - (let ([d (car ds)] [column-style (car column-styles)]) - (cons - `(td (,@(cond - [(not column-style) null] - [(memq 'right (style-properties column-style)) '([align "right"])] - [(memq 'left (style-properties column-style)) '([align "left"])] - [(memq 'center (style-properties column-style)) '([align "center"])] - [else null]) - ,@(cond - [(not column-style) null] - [(memq 'top (style-properties column-style)) '([valign "top"])] - [(memq 'baseline (style-properties column-style)) '([valign "baseline"])] - [(memq 'vcenter (style-properties column-style)) '([valign "center"])] - [(memq 'bottom (style-properties column-style)) '([valign "bottom"])] - [else null]) - ,@(if (and column-style - (string? (style-name column-style))) - `([class ,(style-name column-style)]) - null) - ,@(if (and column-style - (pair? (style-properties column-style))) - (style->attribs (make-style - #f - (filter (lambda (a) - (or (attributes? a) - (color-property? a) - (background-color-property? a))) - (style-properties column-style))) - (let ([ps (style-properties column-style)]) - (cond - [(memq 'border ps) - `([style "border: 1px solid black;"])] - [else - (define (check sym sfx) - (if (memq sym ps) - `([style ,(format "border-~a: 1px solid black;" sfx)]) - null)) - (append - (check 'top-border 'top) - (check 'bottom-border 'bottom) - (check 'left-border 'left) - (check 'right-border 'right))]))) - null) - ,@(if (and (pair? (cdr ds)) - (eq? 'cont (cadr ds))) - `([colspan - ,(number->string - (let loop ([n 2] [ds (cddr ds)]) - (cond [(null? ds) n] - [(eq? 'cont (car ds)) - (loop (+ n 1) (cdr ds))] - [else n])))]) - null)) - ,@(if (and (paragraph? d) - (memq 'omitable (style-properties (paragraph-style d)))) - (render-content (paragraph-content d) part ri) - (render-block d part ri #f))) - (loop (cdr ds) (cdr column-styles) #f)))])))) - (define cell-styless (extract-table-cell-styles t)) - `((table ([cellspacing "0"] - [cellpadding "0"] - ,@(combine-class - (case (style-name (table-style t)) - [(boxed) '([class "boxed"])] - [(centered) '([align "center"])] - [else '()]) - (style->attribs (table-style t) - (append - (if starting-item? - '([style "display: inline-table; vertical-align: text-top; margin-top: 0;"]) - null) - (if (for/or ([cell-styles (in-list cell-styless)]) - (for/or ([cell-style (in-list cell-styles)]) - (and cell-style - (let ([ps (style-properties cell-style)]) - (or (memq 'border ps) - (memq 'left-border ps) - (memq 'right-border ps) - (memq 'bottom-border ps) - (memq 'top-border ps)))))) - `([style "border-collapse: collapse;"]) - '()))))) - ,@(let ([columns (ormap (lambda (p) - (and (table-columns? p) - (map (lambda (s) - (ormap (lambda (a) - (and (column-attributes? a) - a)) - (style-properties s))) - (table-columns-styles p)))) - (style-properties (table-style t)))]) - (if (and columns (ormap values columns)) - `((colgroup ,@(for/list ([col (in-list columns)]) - `(col ,(if col - (map (lambda (v) (list (car v) (cdr v))) (column-attributes-assoc col)) - null))))) - null)) - ,@(if (null? (table-blockss t)) - `((tr (td))) - (map make-row - (table-blockss t) - cell-styless))))) - - (define/override (render-nested-flow t part ri starting-item?) - `((,(or (style->tag (nested-flow-style t)) 'blockquote) - [,@(combine-class - (cond - [(eq? 'code-inset (style-name (nested-flow-style t))) - `([class "SCodeFlow"])] - [(eq? 'vertical-inset (style-name (nested-flow-style t))) - `([class "SVInsetFlow"])] - [(and (not (string? (style-name (nested-flow-style t)))) - (not (eq? 'inset (style-name (nested-flow-style t))))) - `([class "SubFlow"])] - [else null]) - (style->attribs (nested-flow-style t)))] - ,@(apply append - (super render-nested-flow t part ri starting-item?))))) - - (define/override (render-compound-paragraph t part ri starting-item?) - (let ([style (compound-paragraph-style t)]) - `((,(or (style->tag style) 'p) - ,(style->attribs style) - ,@(super render-compound-paragraph t part ri starting-item?))))) - - (define/override (render-itemization t part ri) - (let ([style-str (and (string? (style-name (itemization-style t))) - (style-name (itemization-style t)))]) - `((,(if (eq? 'ordered (style-name (itemization-style t))) - 'ol - 'ul) - (,@(style->attribs (itemization-style t)) - ,@(if (eq? 'compact (style-name (itemization-style t))) - `([class "compact"]) - '())) - ,@(map (lambda (flow) `(li ,(if style-str - `([class ,(string-append style-str "Item")]) - `()) - ,@(render-flow flow part ri #t))) - (itemization-blockss t)))))) - - (define/override (render-other i part ri) - (cond - [(string? i) - (let ([m (and (extra-breaking?) - (regexp-match-positions #rx"[-:/+_](?=.)|[a-z](?=[A-Z])" i))]) - (if m - (list* (substring i 0 (cdar m)) - ;; Most browsers wrap after a hyphen. The one that - ;; doesn't, Firefox, pays attention to wbr. Some - ;; browsers ignore wbr, but at least they don't do - ;; strange things with it. - (if (equal? #\- (string-ref i (caar m))) - '(wbr) - '(span ([class "mywbr"]) " " nbsp)) - (render-other (substring i (cdar m)) part ri)) - (ascii-ize i)))] - [(symbol? i) - (case i - [(mdash) '(#x2014 (wbr))] ;; encourages breaking after rather than before - - ;; FIXME: 'lang and 'rang do not match `⟩' and `⟨' in HTML 4 or 5. - ;; Happened because of the thread: - ;; - ;; ("Fonts with proper angle brackets") - ;; - ;; Do we still need this? See test page at . - ;; - ;; More background: - ;; - ;; HTML 4 says (in HTMLsymbol.dtd): - ;; - ;; - ;; - ;; - ;; - ;; - ;; HTML 5 says (in , dated 2012-10-12): - ;; - ;; "⟨": { "codepoints": [10216], "characters": "\u27E8" }, - ;; "⟩": { "codepoints": [10217], "characters": "\u27E9" }, - ;; - [(lang) '(#x2039)] ; SINGLE LEFT-POINTING ANGLE QUOTATION MARK - [(rang) '(#x203a)] ; SINGLE RIGHT-POINTING ANGLE QUOTATION MARK - - [else (list i)])] - [else - (log-error (format "Unrecognized element in content: ~e" i)) - (list (format "~s" i))])) - - (define/private (ascii-ize s) - (if (= (string-utf-8-length s) (string-length s)) - (list s) - (let ([m (regexp-match-positions #rx"[^\u01-\u7E]" s)]) - (if m - (append (ascii-ize (substring s 0 (caar m))) - (list (char->integer (string-ref s (caar m)))) - (ascii-ize (substring s (cdar m)))) - (list s))))) - - ;; ---------------------------------------- - - (super-new))) - -;; ---------------------------------------- -;; multi-file output - -(define (render-multi-mixin %) - (class % - (inherit render-one - render-one-part - render-content - part-whole-page? - format-number - install-extra-files - report-output? - all-toc-hidden?) - - (define directory-depth 1) - (define/override (set-directory-depth n) - (set! directory-depth (max 1 n))) - - (define/override (get-suffix) #"") - - (define/override (get-dest-directory [create? #f]) - (or (and (current-subdirectory) - (let ([d (build-path (or (super get-dest-directory) - (current-directory)) - (current-subdirectory))]) - (when (and create? (not (directory-exists? d))) - (make-directory* d)) - d)) - (super get-dest-directory create?))) - - (define/private (append-part-prefixes d ci ri) - (let ([parents (drop-right - (if ci - (cons d (collect-info-parents ci)) - (let loop ([d d]) - (if d - (cons d - (loop (collected-info-parent (part-collected-info d ri)))) - null))) - 1)]) - (apply - string-append - (for/list ([p (in-list parents)]) - (or (part-tag-prefix p) ""))))) - - (define/override (part-nesting-depth d ri) - (min (part-depth d ri) (sub1 directory-depth))) - - (define/private (part-depth d ri) - (define p (collected-info-parent (part-collected-info d ri))) - (if (not p) - 0 - (add1 (part-depth p ri)))) - - (define/override (derive-filename d ci ri depth) - (let ([base (regexp-replace* - "[^-a-zA-Z0-9_=]" - (string-append - (append-part-prefixes d ci ri) - (let ([s (cadr (car (part-tags/nonempty d)))]) - (cond [(string? s) s] - [(part-title-content d) - (content->string (part-title-content d))] - [else - ;; last-ditch effort to make up a unique name: - (format "???~a" (eq-hash-code d))]))) - "_")]) - (let ([fn (if (depth . < . directory-depth) - (path->string (build-path base "index.html")) - (format "~a.html" base))]) - (when ((string-length fn) . >= . 48) - (error "file name too long (need a tag):" fn)) - fn))) - - (define/override (include-navigation?) #t) - - (define/override (collect ds fns fp [demand (lambda (key ci) #f)]) - (super collect - ds - (map (lambda (fn) (build-path fn "index.html")) fns) - fp - demand)) - - (define/override (current-part-whole-page? d) - (collecting-whole-page)) - - (define/override (start-collect ds fns ci) - (parameterize ([current-part-files (make-hash)]) - (for-each (lambda (d fn) - (parameterize ([collecting-sub - (if (part-style? d 'non-toc) - 1 - 0)]) - (super start-collect (list d) (list fn) ci))) - ds - fns))) - - (define/private (check-duplicate-filename orig-s) - (let ([s (string-downcase (path->string orig-s))]) - (when (hash-ref (current-part-files) s #f) - (error 'htmls-render "multiple parts have the same filename (modulo case): ~e" - orig-s)) - (hash-set! (current-part-files) s #t))) - - (define/override (collect-part d parent ci number sub-init-number sub-init-numberers) - (let ([prev-sub (collecting-sub)]) - (parameterize ([collecting-sub (if (part-style? d 'toc) - 1 - (add1 prev-sub))] - [collecting-whole-page (prev-sub . <= . 1)]) - (if (and (current-part-whole-page? d) - (not (eq? d (current-top-part)))) - (let* ([filename (derive-filename d ci #f (length number))] - [full-filename (build-path (path-only (current-output-file)) - filename)]) - (make-directory* (path-only full-filename)) - (check-duplicate-filename full-filename) - (parameterize ([current-output-file full-filename]) - (super collect-part d parent ci number sub-init-number sub-init-numberers))) - (super collect-part d parent ci number sub-init-number sub-init-numberers))))) - - (define/override (render-top ds fns ri) - (map (lambda (d fn) - (when (report-output?) - (printf " [Output to ~a/index.html]\n" fn)) - (unless (directory-exists? fn) - (make-directory fn)) - (parameterize ([current-subdirectory (file-name-from-path fn)] - [current-top-part d]) - ;; install files for each directory - (install-extra-files ds) - (let ([fn (build-path fn "index.html")]) - (with-output-to-file/clean - fn - (lambda () (render-one d ri fn)))))) - ds - fns)) - - (define/override (nearly-top? d ri top) - (eq? top (collected-info-parent (part-collected-info d ri)))) - - (define/override (get-onthispage-label) - `((div ([class "tocsubtitle"]) "On this page:"))) - - (define/override (toc-wrap p) - (list p)) - - (inherit render-table - render-paragraph - extract-version) - - (define/override (render-part d ri) - (parameterize ([current-version (extract-version d)]) - (let ([number (collected-info-number (part-collected-info d ri))]) - (if (and (on-separate-page-ok) - (part-whole-page? d ri) - (not (eq? d (current-top-part)))) - ;; Put the actual content in a new file: - (let* ([filename (derive-filename d #f ri (part-depth d ri))] - [full-path (build-path (path-only (current-output-file)) - filename)]) - (parameterize ([on-separate-page-ok #f] - [current-subdirectory (let ([p (path-only filename)]) - (if p - (build-path (current-subdirectory) p) - (current-subdirectory)))]) - (with-output-to-file/clean - full-path - (lambda () (render-one-part d ri full-path number))) - null)) - (parameterize ([on-separate-page-ok #t]) - ;; Normal section render - (super render-part d ri)))))) - - (super-new))) - -;; ---------------------------------------- -;; utils - -(define (explode p) (explode-path p)) - -(define in-plt? - (let ([roots (map explode (filter values (list (find-doc-dir) (find-collects-dir))))]) - (lambda (path) - (for/or ([root (in-list roots)]) - (let loop ([path path] [root root]) - (or (null? root) - (and (pair? path) - (equal? (car path) (car root)) - (loop (cdr path) (cdr root))))))))) - -(define (from-root p d) - (define c-p (path->complete-path p)) - (define e-p (explode c-p)) - (define e-d (and d (explode (path->complete-path d)))) - (define p-in? (in-plt? e-p)) - (define d-in? (and d (in-plt? e-d))) - ;; use an absolute link if the link is from outside the plt tree - ;; going in (or if d is #f) - (if (not (and d (cond - [(equal? p-in? d-in?) #t] - [d-in? (error 'from-root - "got a link from the PLT tree going out; ~e" - p)] - [else #f]))) - (path->url-string c-p) - (let loop ([e-d e-d] [e-p e-p]) - (cond - [(null? e-d) - (string-append* - (let loop ([e-p e-p]) - (cond [(null? e-p) '("/")] - [(null? (cdr e-p)) (list (path->string (car e-p)))] - [(eq? 'same (car e-p)) (loop (cdr e-p))] - [(eq? 'up (car e-p)) (cons "../" (loop (cdr e-p)))] - [else (cons (path->string (car e-p)) (cons "/" (loop (cdr e-p))))])))] - [(equal? (car e-d) (car e-p)) (loop (cdr e-d) (cdr e-p))] - [(eq? 'same (car e-d)) (loop (cdr e-d) e-p)] - [(eq? 'same (car e-p)) (loop e-d (cdr e-p))] - [else (string-append (string-append* (map (lambda (x) "../") e-d)) - (loop null e-p))])))) - -(define (path->url-string p) - (if (eq? 'unix (path-convention-type p)) - (let ([p (simplify-path p #f)]) - (if (regexp-match? #rx#"^[-a-zA-Z0-9_/.]*$" (path->bytes p)) - (string-append "file://" (path->string p)) - (url->string (path->url p)))) - (url->string (path->url p)))) diff --git a/scribble-lib/scribble/info.rkt b/scribble-lib/scribble/info.rkt deleted file mode 100644 index 8cf218cf..00000000 --- a/scribble-lib/scribble/info.rkt +++ /dev/null @@ -1,17 +0,0 @@ -#lang info - -(define source-keep-files '("doc")) - -(define mzscheme-launcher-names '("scribble")) -(define mzscheme-launcher-libraries '("run.rkt")) - -(define raco-commands - '(("scribble" scribble/run "render a Scribble document" #f))) - -(define purpose "This collect contains the implementation of scribble.") - -(define release-note-files '(("Scribble" "HISTORY.txt"))) - -(define version "1.1") - -(define test-responsibles '(("html.rkt" eli))) diff --git a/scribble-lib/scribble/jfp.rkt b/scribble-lib/scribble/jfp.rkt deleted file mode 100644 index 8cbe831e..00000000 --- a/scribble-lib/scribble/jfp.rkt +++ /dev/null @@ -1,66 +0,0 @@ -#lang scheme/base -(require setup/collects - scribble/core - (except-in scribble/base author) - scribble/decode - scribble/html-properties - scribble/latex-properties - (for-syntax scheme/base)) - -(provide abstract include-abstract - author author/short - affiliation affiliation-mark affiliation-sep) - -(define jfp-extras - (let ([abs (lambda (s) - (path->collects-relative - (collection-file-path s "scribble" "jfp")))]) - (list - (make-css-addition (abs "jfp.css")) - (make-tex-addition (abs "jfp.tex"))))) - -;; ---------------------------------------- -;; Abstracts: - -(define abstract-style (make-style "abstract" jfp-extras)) - -(define (abstract . strs) - (make-nested-flow - abstract-style - (decode-flow strs))) - -(define (extract-abstract p) - (unless (part? p) - (error 'include-abstract "doc binding is not a part: ~e" p)) - (unless (null? (part-parts p)) - (error 'include-abstract "abstract part has sub-parts: ~e" (part-parts p))) - (when (part-title-content p) - (error 'include-abstract "abstract part has title content: ~e" (part-title-content p))) - (part-blocks p)) - -(define-syntax-rule (include-abstract mp) - (begin - (require (only-in mp [doc abstract-doc])) - (make-nested-flow abstract-style (extract-abstract abstract-doc)))) - -;; ---------------------------------------- -;; Author - -(define (author . long) - (apply (apply author/short long) long)) - -(define ((author/short . short) . long) - (make-paragraph - (make-style 'author jfp-extras) - (list - (make-multiarg-element "JFPAuthor" (list (decode-content short) - (decode-content long)))))) - -(define (affiliation . txt) - (make-element (make-style "Affiliation" jfp-extras) (decode-content txt))) - -(define (affiliation-mark . txt) - (make-element (make-style "MarkSuperscript" jfp-extras) (decode-content txt))) - -(define (affiliation-sep) - (hspace 2)) diff --git a/scribble-lib/scribble/jfp/.gitignore b/scribble-lib/scribble/jfp/.gitignore deleted file mode 100644 index d5788f43..00000000 --- a/scribble-lib/scribble/jfp/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -# to avoid committing it by accident, since we can't distribute it -/jfp1.cls diff --git a/scribble-lib/scribble/jfp/jfp.css b/scribble-lib/scribble/jfp/jfp.css deleted file mode 100644 index e69de29b..00000000 diff --git a/scribble-lib/scribble/jfp/jfp.tex b/scribble-lib/scribble/jfp/jfp.tex deleted file mode 100644 index 815165c0..00000000 --- a/scribble-lib/scribble/jfp/jfp.tex +++ /dev/null @@ -1,5 +0,0 @@ - -\newcommand{\Affiliation}[1]{\\ #1} -\newcommand{\MarkSuperscript}[1]{$^{#1}$} - -\newcommand{\JFPAuthor}[2]{\author[#1]{#2}} diff --git a/scribble-lib/scribble/jfp/lang.rkt b/scribble-lib/scribble/jfp/lang.rkt deleted file mode 100644 index 1e9e22a5..00000000 --- a/scribble-lib/scribble/jfp/lang.rkt +++ /dev/null @@ -1,60 +0,0 @@ -#lang scheme/base -(require scribble/doclang - (except-in scribble/base author) - scribble/jfp - setup/collects - "../private/defaults.rkt" - net/ftp - racket/file - scribble/latex-prefix - (for-syntax scheme/base)) -(provide (except-out (all-from-out scribble/doclang) #%module-begin) - (all-from-out scribble/jfp) - (all-from-out scribble/base) - (rename-out [module-begin #%module-begin])) - -(module test racket/base) - -;; No options, currently, but keep in case we want to support some: -(define-syntax (module-begin stx) - (syntax-case* stx () (lambda (a b) (eq? (syntax-e a) (syntax-e b))) - [(_ id ws . body) - ;; Skip intraline whitespace to find options: - (and (string? (syntax-e #'ws)) - (regexp-match? #rx"^ *$" (syntax-e #'ws))) - #'(module-begin id . body)] - [(_ id . body) - #'(#%module-begin id (post-process) () . body)])) - -(define cls-file - (let ([p (scribble-file "jfp/jfp1.cls")]) - (if (file-exists? (collects-relative->path p)) - p - (downloaded-file "jfp1.cls")))) - -(define ((post-process) doc) - (add-defaults doc - (string->bytes/utf-8 - (format "\\documentclass{jfp1}\n~a\\usepackage{times}\n\\usepackage{qcourier}\n~a" - unicode-encoding-packages - ;; Avoid a conflict with mathabx: - "\\let\\amalg\\relax\n")) - (scribble-file "jfp/style.tex") - (list cls-file) - #f - #:replacements - (hash "scribble-load-replace.tex" (scribble-file "jfp/replacements.tex")))) - -(unless (or (not (path? cls-file)) - (file-exists? cls-file)) - (log-error (format "File not found: ~a" cls-file)) - (define site "ftp.cambridge.org") - (define path "pub/texarchive/journals/latex/jfp-cls") - (define file "jfp1.cls") - (log-error (format "Downloading via ftp://~a/~a/~a..." site path file)) - (define c (ftp-establish-connection site 21 "anonymous" "user@racket-lang.org")) - (ftp-cd c path) - (let-values ([(base name dir?) (split-path cls-file)]) - (make-directory* base) - (ftp-download-file c base file)) - (ftp-close-connection c)) diff --git a/scribble-lib/scribble/jfp/lang/reader.rkt b/scribble-lib/scribble/jfp/lang/reader.rkt deleted file mode 100644 index 09e0da56..00000000 --- a/scribble-lib/scribble/jfp/lang/reader.rkt +++ /dev/null @@ -1,3 +0,0 @@ -#lang s-exp scribble/base/reader -scribble/jfp/lang -#:wrapper1 (lambda (t) (cons 'doc (t))) diff --git a/scribble-lib/scribble/jfp/replacements.tex b/scribble-lib/scribble/jfp/replacements.tex deleted file mode 100644 index 176fa412..00000000 --- a/scribble-lib/scribble/jfp/replacements.tex +++ /dev/null @@ -1 +0,0 @@ -\renewcommand{\packageRelsize}{} diff --git a/scribble-lib/scribble/jfp/style.tex b/scribble-lib/scribble/jfp/style.tex deleted file mode 100644 index 09d7c156..00000000 --- a/scribble-lib/scribble/jfp/style.tex +++ /dev/null @@ -1,3 +0,0 @@ - -\renewcommand{\titleAndVersionAndAuthors}[3]{\title[#2]{#1}#3\maketitle} -\renewcommand{\titleAndEmptyVersionAndAuthors}[3]{\titleAndVersionAndAuthors{#1}{#1}{#3}} diff --git a/scribble-lib/scribble/latex-prefix.rkt b/scribble-lib/scribble/latex-prefix.rkt deleted file mode 100644 index 4668497c..00000000 --- a/scribble-lib/scribble/latex-prefix.rkt +++ /dev/null @@ -1,8 +0,0 @@ -#lang racket/base - -(provide unicode-encoding-packages) - -(define unicode-encoding-packages - (string-append - "\\usepackage[utf8]{inputenc}\n" - "\\usepackage[T1]{fontenc}\n")) diff --git a/scribble-lib/scribble/latex-properties.rkt b/scribble-lib/scribble/latex-properties.rkt deleted file mode 100644 index d00eb62e..00000000 --- a/scribble-lib/scribble/latex-properties.rkt +++ /dev/null @@ -1,13 +0,0 @@ -#lang scheme/base -(require "private/provide-structs.rkt" - racket/serialize - racket/contract/base) - -(provide-structs - [tex-addition ([path (or/c path-string? (cons/c 'collects (listof bytes?)) bytes?)])] - [latex-defaults ([prefix (or/c bytes? path-string? (cons/c 'collects (listof bytes?)))] - [style (or/c bytes? path-string? (cons/c 'collects (listof bytes?)))] - [extra-files (listof (or/c path-string? (cons/c 'collects (listof bytes?))))])] - [(latex-defaults+replacements latex-defaults) - ([replacements (hash/c string? (or/c bytes? path-string? (cons/c 'collects (listof bytes?))))])] - [command-extras ([arguments (listof string?)])]) diff --git a/scribble-lib/scribble/latex-render.rkt b/scribble-lib/scribble/latex-render.rkt deleted file mode 100644 index a176a24f..00000000 --- a/scribble-lib/scribble/latex-render.rkt +++ /dev/null @@ -1,1396 +0,0 @@ -#lang at-exp racket/base -(require "core.rkt" - "latex-properties.rkt" - "private/render-utils.rkt" - racket/class - racket/runtime-path - racket/port - racket/string - racket/path - racket/list - setup/collects - file/convertible) -(provide render-mixin - make-render-part-mixin - extra-character-conversions) - -(define current-table-mode (make-parameter #f)) -(define rendering-tt (make-parameter #f)) -(define show-link-page-numbers (make-parameter #f)) -(define done-link-page-numbers (make-parameter #f)) -(define disable-images (make-parameter #f)) -(define escape-brackets (make-parameter #f)) -(define suppress-newline-content (make-parameter #f)) - -(define-struct (toc-paragraph paragraph) ()) - -(define-runtime-path scribble-prefix-tex "scribble-prefix.tex") -(define-runtime-path scribble-packages-tex "scribble-packages.tex") -(define-runtime-path scribble-load-tex "scribble-load.tex") -(define-runtime-path scribble-tex "scribble.tex") -(define-runtime-path scribble-style-tex "scribble-style.tex") -(define-runtime-path scribble-load-replace-tex "scribble-load-replace.tex") - -(define (color->string c) - (if (string? c) - c - (format "~a,~a,~a" - (/ (car c) 255.0) - (/ (cadr c) 255.0) - (/ (caddr c) 255.0)))) - -(define (make-render-part-mixin n) - (lambda (%) - (class (render-mixin %) - (define/override (render-part-depth) n) - (super-new)))) - -(define-runtime-path skull-tex "scribble-skull.tex") -(define skull-style (make-style #f (list (tex-addition skull-tex)))) - -(define extra-character-conversions (make-parameter (λ (c) #f))) - -(define (render-mixin % #:image-mode [image-mode #f]) - (class % - (super-new) - - (inherit-field prefix-file style-file style-extra-files image-preferences) - - (define/override (current-render-mode) - '(latex)) - - (inherit sort-image-requests) - (define image-reqs - (sort-image-requests (cond - [(eq? image-mode 'pdf) - '(pdf-bytes png@2x-bytes png-bytes)] - [(eq? image-mode 'ps) - '(eps-bytes)] - [else - '(pdf-bytes png@2x-bytes png-bytes eps-bytes)]) - image-preferences)) - - (define/override (get-suffix) #".tex") - - (inherit render-block - render-part - install-file - format-number - number-depth - extract-part-style-files - extract-version - extract-date - extract-authors - extract-pretitle) - - (define/override (auto-extra-files? v) (latex-defaults? v)) - (define/override (auto-extra-files-paths v) (latex-defaults-extra-files v)) - - (define/public (render-part-depth) #f) - - (define/override (render-one d ri fn) - (define (maybe-replace file defaults) - (cond [(and defaults - (latex-defaults+replacements? defaults) - (hash-ref (latex-defaults+replacements-replacements defaults) - (path->string (file-name-from-path file)) - #f)) => - (lambda (v) - (cond - [(bytes? v) v] - [else (collects-relative->path v)]))] - [else file])) - (let* ([defaults (ormap (lambda (v) (and (latex-defaults? v) v)) - (style-properties (part-style d)))] - [prefix-file (or prefix-file - (and defaults - (let ([v (latex-defaults-prefix defaults)]) - (cond - [(bytes? v) v] - [else (collects-relative->path v)]))) - scribble-prefix-tex)] - [style-file (or style-file - (and defaults - (let ([v (latex-defaults-style defaults)]) - (cond - [(bytes? v) v] - [else (collects-relative->path v)]))) - scribble-style-tex)] - [all-style-files (list* scribble-load-tex - (maybe-replace scribble-load-replace-tex defaults) - scribble-tex - (append (extract-part-style-files - d - ri - (lambda (p) #f) - tex-addition? - tex-addition-path) - (list style-file) - style-extra-files))] - [whole-doc? (not (render-part-depth))]) - (if whole-doc? - (for ([style-file (in-list (cons prefix-file all-style-files))]) - (if (bytes? style-file) - (display style-file) - (with-input-from-file style-file - (lambda () - (copy-port (current-input-port) (current-output-port)))))) - (for ([style-file (in-list all-style-files)]) - (if (bytes? style-file) - (display style-file) - (install-file style-file)))) - (when whole-doc? - (printf "\\begin{document}\n\\preDoc\n") - (when (part-title-content d) - (let ([vers (extract-version d)] - [date (extract-date d)] - [pres (extract-pretitle d)] - [auths (extract-authors d)]) - (for ([pre (in-list pres)]) - (printf "\n\n") - (do-render-paragraph pre d ri #t #f)) - (when date (printf "\\date{~a}\n" date)) - (printf "\\titleAnd~aVersionAnd~aAuthors{" - (if (equal? vers "") "Empty" "") - (if (null? auths) "Empty" "")) - (render-content (part-title-content d) d ri) - (printf "}{~a}{" vers) - (unless (null? auths) - (printf "\\SNumberOfAuthors{~a}" (length auths))) - (for/fold ([first? #t]) ([auth (in-list auths)]) - (unless first? (printf "\\SAuthorSep{}")) - (do-render-paragraph auth d ri #t #f) - #f) - (printf "}\n")))) - (render-part d ri) - (when whole-doc? - (printf "\n\n\\postDoc\n\\end{document}\n")))) - - (define/override (render-part-content d ri) - (let ([number (collected-info-number (part-collected-info d ri))] - [completely-hidden? - (and (part-style? d 'hidden) - (equal? "" (content->string (part-title-content d))))]) - (when (and (part-title-content d) - (or (pair? number) - (let ([d (render-part-depth)]) - (and d (positive? d))))) - (when (eq? (style-name (part-style d)) 'index) - (printf "\\twocolumn\n\\parskip=0pt\n\\addcontentsline{toc}{section}{Index}\n")) - (let ([pres (extract-pretitle d)]) - (for ([pre (in-list pres)]) - (printf "\n\n") - (do-render-paragraph pre d ri #t #f))) - (define depth (+ (number-depth number) (or (render-part-depth) 0))) - (define grouper? (part-style? d 'grouper)) - (define (inc-section-number) - (printf "\\Sinc~a" (case depth - [(0 1) (if grouper? "part" "section")] - [(2) "subsection"] - [(3) "subsubsection"] - [(4) "subsubsubsection"] - [else "subsubsubsubsection"]))) - (cond - [completely-hidden? - (printf "\n\n\\notitlesection") - (unless (part-style? d 'unnumbered) - (inc-section-number))] - [else - (define no-number? (and (pair? number) - (or (not (car number)) - (equal? "" (car number)) - ((length number) . > . 3)))) - (define no-toc? (part-style? d 'toc-hidden)) - (define (show-number) - (when (and (part-style? d 'grouper) - (depth . > . 1) - (not no-number?)) - (printf "~a\\quad{}" (car (format-number number null))))) - (printf "\n\n\\~a~a~a" - (case depth - [(0 1) (if grouper? - "partNewpage\n\n\\Spart" - "sectionNewpage\n\n\\Ssection")] - [(2) "Ssubsection"] - [(3) "Ssubsubsection"] - [(4) "Ssubsubsubsection"] - [else "Ssubsubsubsubsection"]) - (if (and grouper? - (depth . > . 1)) - "grouper" - "") - (if no-number? - (if no-toc? - "star" - "starx") - "")) - (unless (and no-number? no-toc?) - (printf "{") - (show-number) - (parameterize ([disable-images #t] - [escape-brackets #t]) - (render-content (part-title-content d) d ri)) - (printf "}")) - (printf "{") - (show-number) - (render-content (part-title-content d) d ri) - (printf "}") - (when (and (part-style? d 'hidden-number) - (not (part-style? d 'unnumbered))) - (inc-section-number)) - (when (eq? (style-name (part-style d)) 'index) (printf "\n\n"))])) - (for ([t (part-tags d)]) - (printf "\\label{t:~a}~a" (t-encode (add-current-tag-prefix (tag-key t ri))) - (if completely-hidden? "" "\n\n"))) - (render-flow (part-blocks d) d ri #f) - (for ([sec (part-parts d)]) (render-part sec ri)) - (when (eq? (style-name (part-style d)) 'index) (printf "\\onecolumn\n\n")) - null)) - - (define/override (render-paragraph p part ri) - (do-render-paragraph p part ri #f #f)) - - (define/private (do-render-paragraph p part ri show-pre? as-box-mode) - (let* ([sn (style-name (paragraph-style p))] - [style (cond - [as-box-mode - (or - (ormap (lambda (a) - (and (box-mode? a) - ((box-mode-selector as-box-mode) a))) - (style-properties - (paragraph-style p))) - "hbox")] - [(eq? sn 'author) "SAuthor"] - [(eq? sn 'pretitle) #f] - [(eq? sn 'wraps) #f] - [else sn])]) - (unless (and (not show-pre?) - (or (eq? sn 'author) - (eq? sn 'pretitle))) - (let ([use-style? (string? style)]) - (when use-style? - (printf "\\~a{" style)) - (if (toc-paragraph? p) - (printf "\\newpage \\tableofcontents \\newpage") - (if as-box-mode - (parameterize ([suppress-newline-content #t]) - (super render-paragraph p part ri)) - (super render-paragraph p part ri))) - (when use-style? (printf "}"))))) - null) - - (define/private (no-noindent? p ri) - (cond - [(delayed-block? p) - (no-noindent? (delayed-block-blocks p ri) ri)] - [(traverse-block? p) - (no-noindent? (traverse-block-block p ri) ri)] - [else - (or - (memq 'never-indents - (style-properties - (cond - [(paragraph? p) (paragraph-style p)] - [(compound-paragraph? p) (compound-paragraph-style p)] - [(nested-flow? p) (nested-flow-style p)] - [(table? p) (table-style p)] - [(itemization? p) (itemization-style p)] - [else plain]))) - (and (nested-flow? p) - (pair? (nested-flow-blocks p)) - (no-noindent? (car (nested-flow-blocks p)) ri)) - (and (compound-paragraph? p) - (pair? (compound-paragraph-blocks p)) - (no-noindent? (car (compound-paragraph-blocks p)) ri)))])) - - (define/override (render-intrapara-block p part ri first? last? starting-item?) - (unless first? - (printf "\n\n") - (unless (no-noindent? p ri) - (printf "\\noindent "))) - (super render-intrapara-block p part ri first? last? starting-item?)) - - (define/override (render-content e part ri) - (let ([part-label? (and (link-element? e) - (pair? (link-element-tag e)) - (eq? 'part (car (link-element-tag e))) - (empty-content? (element-content e)))]) - (parameterize ([done-link-page-numbers (or (done-link-page-numbers) - (link-element? e))]) - (when (target-element? e) - (printf "\\label{t:~a}" - (t-encode (add-current-tag-prefix (tag-key (target-element-tag e) ri))))) - (when part-label? - (define-values (dest ext?) (resolve-get/ext? part ri (link-element-tag e))) - (let* ([number (and dest (vector-ref dest 2))] - [formatted-number (and dest - (list? number) - (format-number number null))] - [lbl? (and dest - (not ext?) - (not (show-link-page-numbers)))]) - (printf "\\~aRef~a~a~a{" - (case (and dest (number-depth number)) - [(0) "Book"] - [(1) (if (string? (car number)) "Part" "Chap")] - [else "Sec"]) - (if lbl? - "Local" - "") - (if (let ([s (element-style e)]) - (and (style? s) (memq 'uppercase (style-properties s)))) - "UC" - "") - (if (null? formatted-number) - "UN" - "")) - (when lbl? - (printf "t:~a}{" (t-encode (vector-ref dest 1)))) - (unless (null? formatted-number) - (render-content - (if dest - (if (list? number) - formatted-number - (begin (eprintf "Internal tag error: ~s -> ~s\n" - (link-element-tag e) - dest) - '("!!!"))) - (list "???")) - part ri) - (printf "}{")))) - (let* ([es (cond - [(element? e) (element-style e)] - [(multiarg-element? e) (multiarg-element-style e)] - [else #f])] - [style-name (if (style? es) - (style-name es) - es)] - [style (and (style? es) es)] - [check-render - (lambda () - (when (render-element? e) - ((render-element-render e) this part ri)))] - [core-render (lambda (e tt?) - (cond - [(and (image-element? e) - (not (disable-images))) - (check-render) - (let ([fn (install-file - (select-suffix - (collects-relative->path - (image-element-path e)) - (image-element-suffixes e) - '(".pdf" ".ps" ".png")))]) - (printf "\\includegraphics[scale=~a]{~a}" - (image-element-scale e) fn))] - [(and (convertible? e) - (not (disable-images)) - (let ([ftag (lambda (v suffix [scale 1]) (and v (list v suffix scale)))] - [xxlist (lambda (v) (and v (list v #f #f #f #f #f #f #f #f)))] - [xlist (lambda (v) (and v (append v (list 0 0 0 0))))]) - (for/or ([req (in-list image-reqs)]) - (case req - [(eps-bytes) - (or (ftag (convert e 'eps-bytes+bounds8) ".ps") - (ftag (xlist (convert e 'eps-bytes+bounds)) ".ps") - (ftag (xxlist (convert e 'eps-bytes)) ".ps"))] - [(pdf-bytes) - (or (ftag (convert e 'pdf-bytes+bounds8) ".pdf") - (ftag (xlist (convert e 'pdf-bytes+bounds)) ".pdf") - (ftag (xxlist (convert e 'pdf-bytes)) ".pdf"))] - [(png@2x-bytes) - (or (ftag (convert e 'png@2x-bytes+bounds8) ".png" 0.5) - (ftag (xxlist (convert e 'png@2x-bytes)) ".png" 0.5))] - [(png-bytes) - (or (ftag (convert e 'png-bytes+bounds8) ".png") - (ftag (xxlist (convert e 'png-bytes)) ".png"))])))) - => (lambda (bstr+info+suffix) - (check-render) - (let* ([bstr (list-ref (list-ref bstr+info+suffix 0) 0)] - [suffix (list-ref bstr+info+suffix 1)] - [scale (list-ref bstr+info+suffix 2)] - [height (list-ref (list-ref bstr+info+suffix 0) 2)] - [pad-left (or (list-ref (list-ref bstr+info+suffix 0) 5) 0)] - [pad-top (or (list-ref (list-ref bstr+info+suffix 0) 6) 0)] - [pad-right (or (list-ref (list-ref bstr+info+suffix 0) 7) 0)] - [pad-bottom (or (list-ref (list-ref bstr+info+suffix 0) 8) 0)] - [descent (and height - (- (+ (list-ref (list-ref bstr+info+suffix 0) 3) - (- (ceiling height) height)) - pad-bottom))] - [width (let ([w (list-ref (list-ref bstr+info+suffix 0) 1)]) - (and w (- w pad-left pad-right)))] - [fn (install-file (format "pict~a" suffix) bstr)]) - (if descent - (printf "\\raisebox{-~abp}{\\makebox[~abp][l]{\\includegraphics[~atrim=~a ~a ~a ~a]{~a}}}" - descent - width - (if (= scale 1) "" (format "scale=~a," scale)) - (/ pad-left scale) (/ pad-bottom scale) (/ pad-right scale) (/ pad-top scale) - fn) - (printf "\\includegraphics{~a}" fn))))] - [else - (parameterize ([rendering-tt (or tt? (rendering-tt))]) - (super render-content e part ri))]))] - [wrap (lambda (e s tt?) - (when s (printf "\\~a{" s)) - (core-render e tt?) - (when s (printf "}")))]) - (define (finish tt?) - (cond - [(symbol? style-name) - (case style-name - [(italic) (wrap e "textit" tt?)] - [(bold) (wrap e "textbf" tt?)] - [(tt) (wrap e "Scribtexttt" #t)] - [(url) (wrap e "Snolinkurl" 'url)] - [(no-break) (wrap e "mbox" tt?)] - [(sf) (wrap e "textsf" #f)] - [(roman) (wrap e "textrm" #f)] - [(subscript) (wrap e "textsub" #f)] - [(superscript) (wrap e "textsuper" #f)] - [(smaller) (wrap e "Smaller" #f)] - [(larger) (wrap e "Larger" #f)] - [(hspace) - (check-render) - (let ([s (content->string e)]) - (case (string-length s) - [(0) (void)] - [else - (printf "\\mbox{\\hphantom{\\Scribtexttt{~a}}}" - (regexp-replace* #rx"." s "x"))]))] - [(newline) - (check-render) - (unless (suppress-newline-content) - (printf "\\hspace*{\\fill}\\\\"))] - [else (error 'latex-render - "unrecognized style symbol: ~s" style)])] - [(string? style-name) - (let* ([v (if style (style-properties style) null)] - [tt? (cond - [(memq 'tt-chars v) #t] - [(memq 'exact-chars v) 'exact] - [else tt?])]) - (cond - [(multiarg-element? e) - (check-render) - (printf "\\~a" style-name) - (if (null? (multiarg-element-contents e)) - (printf "{}") - (for ([i (in-list (multiarg-element-contents e))]) - (printf "{") - (parameterize ([rendering-tt (or tt? (rendering-tt))]) - (render-content i part ri)) - (printf "}")))] - [else - (wrap e style-name tt?)]))] - [(and (not style-name) - style - (memq 'exact-chars (style-properties style))) - (wrap e style-name 'exact)] - [else - (core-render e tt?)])) - (let loop ([l (if style (style-properties style) null)] [tt? #f]) - (if (null? l) - (finish tt?) - (let ([v (car l)]) - (cond - [(target-url? v) - (define target (let* ([s (let ([p (target-url-addr v)]) - (if (path? p) - (path->string p) - p))] - [s (regexp-replace* #rx"\\\\" s "%5c")] - [s (regexp-replace* #rx"{" s "%7b")] - [s (regexp-replace* #rx"}" s "%7d")] - [s (regexp-replace* #rx"%" s "\\\\%")]) - s)) - (if (regexp-match? #rx"^[^#]*#[^#]*$" target) - ;; work around a problem with `\href' as an - ;; argument to other macros, such as `\marginpar': - (let ([l (string-split target "#")]) - (printf "\\Shref{~a}{~a}{" (car l) (cadr l))) - ;; normal: - (printf "\\href{~a}{" target)) - (loop (cdr l) #t) - (printf "}")] - [(color-property? v) - (printf "\\intext~acolor{~a}{" - (if (string? (color-property-color v)) "" "rgb") - (color->string (color-property-color v))) - (loop (cdr l) tt?) - (printf "}")] - [(background-color-property? v) - (printf "\\in~acolorbox{~a}{" - (if (string? (background-color-property-color v)) "" "rgb") - (color->string (background-color-property-color v))) - (loop (cdr l) tt?) - (printf "}")] - [(command-extras? (car l)) - (loop (cdr l) tt?) - (for ([l (in-list (command-extras-arguments (car l)))]) - (printf "{~a}" l))] - [else (loop (cdr l) tt?)])))))) - (when part-label? - (printf "}")) - (when (and (link-element? e) - (show-link-page-numbers) - (not (done-link-page-numbers))) - (printf ", \\pageref{t:~a}" - (t-encode - (let ([v (resolve-get part ri (link-element-tag e))]) - (and v (vector-ref v 1)))))) - null)) - - (define/private (t-encode s) - (string-append* - (map (lambda (c) - (cond - [(and (or (char-alphabetic? c) (char-numeric? c)) - ((char->integer c) . < . 128)) - (string c)] - [(char=? c #\space) "_"] - [else (format "x~x" (char->integer c))])) - (string->list (format "~s" s))))) - - (define/override (render-flow p part ri starting-item? [wrap-each? #f]) - (if (null? p) - null - (begin - (when wrap-each? (printf "{")) - (render-block (car p) part ri starting-item?) - (when wrap-each? (printf "}")) - (for ([b (in-list (cdr p))]) - (if wrap-each? - (printf "%\n{") - (printf "\n\n")) - (render-block b part ri #f) - (when wrap-each? (printf "}"))) - null))) - - (define/override (render-table t part ri starting-item?) - (render-table* t part ri starting-item? "[t]")) - - (define/private (render-table* t part ri starting-item? alignment) - (let* ([s-name (style-name (table-style t))] - [boxed? (eq? 'boxed s-name)] - [index? (eq? 'index s-name)] - [tableform - (cond [index? "list"] - [(eq? 'block s-name) "tabular"] - [(not (current-table-mode)) "bigtabular"] - [else "tabular"])] - [opt (cond [(equal? tableform "bigtabular") ""] - [(equal? tableform "tabular") alignment] - [else ""])] - [blockss (if index? (cddr (table-blockss t)) (table-blockss t))] - [cell-styless (extract-table-cell-styles t)] - [twidth (if (null? (table-blockss t)) - 1 - (length (car (table-blockss t))))] - [single-column? (and (= 1 twidth) - (or (not s-name) (string? s-name)) - (not (ormap (lambda (cell-styles) - (ormap (lambda (s) - (or (string? (style-name s)) - (let ([l (style-properties s)]) - (or (memq 'right l) - (memq 'center l))))) - cell-styles)) - cell-styless)) - (not (current-table-mode)))] - [inline? - (and (not single-column?) - (not boxed?) - (not index?) - (ormap (lambda (rs) - (ormap (lambda (cs) (style-name cs)) rs)) - cell-styless) - (= 1 twidth) - (let ([m (current-table-mode)]) - (and m - (equal? "bigtabular" (car m)) - (= 1 (length (car (table-blockss (cadr m))))))))]) - (if single-column? - (begin - (when (string? s-name) - (printf "\\begin{~a}" s-name)) - (do-render-nested-flow - (make-nested-flow (make-style "SingleColumn" null) (map car (table-blockss t))) - part - ri - #t - #f) - (when (string? s-name) - (printf "\\end{~a}" s-name))) - (unless (or (null? blockss) (null? (car blockss))) - (define all-left-line?s - (if (null? cell-styless) - null - (for/list ([i (in-range (length (car cell-styless)))]) - (for/and ([cell-styles (in-list cell-styless)]) - (let ([cell-style (list-ref cell-styles i)]) - (or (memq 'left-border (style-properties cell-style)) - (memq 'border (style-properties cell-style)))))))) - (define all-right-line? - (and (pair? cell-styless) - (let ([i (sub1 (length (car cell-styless)))]) - (for/and ([cell-styles (in-list cell-styless)]) - (let ([cell-style (list-ref cell-styles i)]) - (or (memq 'right-border (style-properties cell-style)) - (memq 'border (style-properties cell-style)))))))) - (parameterize ([current-table-mode - (if inline? (current-table-mode) (list tableform t))] - [show-link-page-numbers - (or index? (show-link-page-numbers))]) - (cond - [index? (printf "\\begin{list}{}{\\parsep=0pt \\itemsep=1pt \\leftmargin=2ex \\itemindent=-2ex}\n")] - [inline? (void)] - [single-column? (printf "\\begin{tabbing}\n")] - [else - (printf "~a~a\\begin{~a}~a{@{~a}~a}\n~a" - (if (and starting-item? (equal? tableform "bigtabular")) - "\\bigtableinlinecorrect" - "") - (if (string? s-name) - (format "\\begin{~a}" s-name) - "") - tableform - opt - (if (equal? tableform "bigtabular") - "\\bigtableleftpad" - "") - (string-append* - (let ([l - (map (lambda (i cell-style left-line?) - (format "~a~a@{}" - (if left-line? "|@{}" "") - (cond - [(memq 'center (style-properties cell-style)) "c"] - [(memq 'right (style-properties cell-style)) "r"] - [else "l"]))) - (car blockss) - (car cell-styless) - all-left-line?s)]) - (let ([l (if all-right-line? (append l '("|")) l)]) - (if boxed? (cons "@{\\SBoxedLeft}" l) l)))) - "")]) - ;; Helper to add row-separating lines: - (define (add-clines prev-styles next-styles) - (let loop ([pos 1] [start #f] [prev-styles prev-styles] [next-styles next-styles]) - (cond - [(or (and prev-styles (null? prev-styles)) - (and next-styles (null? next-styles))) - (when start - (if (= start 1) - (printf "\\hline ") - (printf "\\cline{~a-~a}" start (sub1 pos))))] - [else - (define prev-style (and prev-styles (car prev-styles))) - (define next-style (and next-styles (car next-styles))) - (define line? (or (and prev-style - (or (memq 'bottom-border (style-properties prev-style)) - (memq 'border (style-properties prev-style)))) - (and next-style - (or (memq 'top-border (style-properties next-style)) - (memq 'border (style-properties next-style)))))) - (when (and start (not line?)) - (printf "\\cline{~a-~a}" start (sub1 pos))) - (loop (add1 pos) (and line? (or start pos)) - (and prev-styles (cdr prev-styles)) - (and next-styles (cdr next-styles)))]))) - ;; Loop through rows: - (let loop ([blockss blockss] - [cell-styless cell-styless] - [prev-styles #f]) ; for 'bottom-border styles - (let ([flows (car blockss)] - [cell-styles (car cell-styless)]) - (unless index? (add-clines prev-styles cell-styles)) - (let loop ([flows flows] - [cell-styles cell-styles] - [all-left-line?s all-left-line?s] - [need-left? #f]) - (unless (null? flows) - (define (render-cell cnt) - (render-table-cell (car flows) part ri (/ twidth cnt) (car cell-styles) (not index?))) - (define right-line? - (cond - [index? - (printf "\n\\item ") - (render-cell 1) - #f] - [(eq? 'cont (car flows)) - #f] - [else - (let ([cnt (let loop ([flows (cdr flows)][n 1]) - (cond [(null? flows) n] - [(eq? (car flows) 'cont) - (loop (cdr flows) (add1 n))] - [else n]))]) - (unless (= cnt 1) (printf "\\multicolumn{~a}{l}{" cnt)) - (when (and (not (car all-left-line?s)) - (or need-left? - (memq 'left-border (style-properties (car cell-styles))) - (memq 'border (style-properties (car cell-styles))))) - (printf "\\vline ")) - (render-cell cnt) - (define right-line? (or (memq 'right-border (style-properties (list-ref cell-styles (sub1 cnt)))) - (memq 'border (style-properties (list-ref cell-styles (sub1 cnt)))))) - (when (and right-line? (null? (list-tail flows cnt)) (not all-right-line?)) - (printf "\\vline ")) - (unless (= cnt 1) (printf "}")) - (unless (null? (list-tail flows cnt)) - (printf " &\n")) - right-line?)])) - (unless (null? (cdr flows)) (loop (cdr flows) - (cdr cell-styles) - (cdr all-left-line?s) - right-line?)))) - (unless (or index? - (and (null? (cdr blockss)) - (not (for/or ([cell-style (in-list cell-styles)]) - (or (memq 'bottom-border (style-properties cell-style)) - (memq 'border (style-properties cell-style))))))) - (printf " \\\\\n")) - (cond - [(null? (cdr blockss)) - (unless index? (add-clines cell-styles #f))] - [else - (loop (cdr blockss) (cdr cell-styless) cell-styles)]))) - (unless inline? - (printf "\\end{~a}~a" - tableform - (if (string? s-name) - (format "\\end{~a}" s-name) - ""))))))) - null) - - (define/private (render-table-cell p part ri twidth vstyle can-box?) - (let* ([top? (or (memq 'top (style-properties vstyle)) - (memq 'baseline (style-properties vstyle)))] - [bottom? (and (not top?) - (memq 'bottom (style-properties vstyle)))] - [center? (and (not bottom?) - (not top?))] - [as-box? (and can-box? (boxable? p))]) - (when (string? (style-name vstyle)) - (printf "\\~a{" (style-name vstyle))) - (let ([minipage? (and can-box? (not as-box?))]) - (when minipage? - (printf "\\begin{minipage}~a{~a\\linewidth}\n" - (cond - [top? "[t]"] - [center? "[c]"] - [else ""]) - (/ 1.0 twidth))) - (cond - [(table? p) - (render-table* p part ri #f (cond - [top? "[t]"] - [center? "[c]"] - [else "[b]"]))] - [as-box? - (render-boxable-block p part ri (cond - [top? 't] - [center? 'c] - [else 'b]))] - [else - (render-block p part ri #f)]) - (when minipage? - (printf " \\end{minipage}\n"))) - (when (string? (style-name vstyle)) - (printf "}")) - null)) - - (define/private (boxable? p) - (or (and (table? p) - (for* ([l (in-list (table-blockss p))] - [p (in-list l)]) - (boxable? p))) - (and (nested-flow? p) - (or (and (= 1 (length (nested-flow-blocks p))) - (memq (style-name (nested-flow-style p)) - '(code-inset vertical-inset))) - (and - (ormap box-mode? (style-properties (nested-flow-style p))) - (andmap (lambda (p) (boxable? p)) (nested-flow-blocks p))))) - (and (paragraph? p) - (or (not (style-name (paragraph-style p))) - (ormap box-mode? (style-properties (paragraph-style p))))))) - - (define/private (render-boxable-block p part ri mode) - (cond - [(table? p) - (render-table* p part ri #f (format "[~a]" mode))] - [(nested-flow? p) - (do-render-nested-flow p part ri #f mode)] - [(paragraph? p) - (do-render-paragraph p part ri #f mode)])) - - (define/private (box-mode-selector as-box-mode) - (case as-box-mode - [(t) box-mode-top-name] - [(c) box-mode-center-name] - [(b) box-mode-bottom-name])) - - (define/override (render-itemization t part ri) - (let* ([style-str (let ([s (style-name (itemization-style t))]) - (if (eq? s 'compact) - "compact" - s))] - [mode (or (and (string? style-str) - style-str) - (if (eq? 'ordered style-str) - "enumerate" - "itemize"))]) - (printf "\\begin{~a}\\atItemizeStart" mode) - (for ([flow (in-list (itemization-blockss t))]) - (printf "\n\n\\~a" (if (string? style-str) - (format "~aItem{" style-str) - "item ")) - (render-flow flow part ri #t) - (when (string? style-str) - (printf "}"))) - (printf "\\end{~a}" mode) - null)) - - (define/private (do-render-nested-flow t part ri single-column? as-box-mode) - (let* ([props (style-properties (nested-flow-style t))] - [kind (or (and as-box-mode - (or - (ormap (lambda (a) - (and (box-mode? a) - ((box-mode-selector as-box-mode) a))) - props) - (case (style-name (nested-flow-style t)) - [(code-inset) "SCodeInsetBox"] - [(vertical-inset) "SVInsetBox"] - [else (error "unexpected style for box mode")]))) - (let ([s (style-name (nested-flow-style t))]) - (or (and (string? s) s) - (and (eq? s 'inset) "SInsetFlow") - (and (eq? s 'code-inset) "SCodeFlow") - (and (eq? s 'vertical-inset) "SVInsetFlow"))) - "Subflow")] - [multicommand? (memq 'multicommand props)] - [command? (or (and as-box-mode (not multicommand?)) - (memq 'command props))]) - (cond - [command? (printf "\\~a{" kind)] - [multicommand? (printf "\\~a" kind)] - [else (printf "\\begin{~a}" kind)]) - (parameterize ([current-table-mode (if (or single-column? - (not (current-table-mode))) - (current-table-mode) - (list "nested-flow" t))]) - (if as-box-mode - (for-each (lambda (p) - (when multicommand? (printf "{")) - (render-boxable-block p part ri as-box-mode) - (when multicommand? (printf "}"))) - (nested-flow-blocks t)) - (render-flow (nested-flow-blocks t) part ri #f multicommand?))) - (cond - [command? (printf "}")] - [multicommand? (void)] - [else (printf "\\end{~a}" kind)]) - null)) - - (define/override (render-nested-flow t part ri starting-item?) - (do-render-nested-flow t part ri #f #f)) - - (define/override (render-compound-paragraph t part ri starting-item?) - (let ([kind (style-name (compound-paragraph-style t))] - [command? (memq 'command (style-properties (compound-paragraph-style t)))]) - (when kind - (if command? - (printf "\\~a{" kind) - (printf "\\begin{~a}" kind))) - (super render-compound-paragraph t part ri starting-item?) - (when kind - (if command? - (printf "}") - (printf "\\end{~a}" kind))) - null)) - - (define/override (render-other i part ri) - (cond - [(string? i) (display-protected i)] - [(symbol? i) - (display (case i - [(nbsp) "~"] - [(mdash) "{---}"] - [(ndash) "{--}"] - [(ldquo) "{``}"] - [(rdquo) "{''}"] - [(rsquo) "{'}"] - [(lsquo) "{`}"] - [(prime) "$'$"] - [(rarr) "$\\rightarrow$"] - [(larr) "$\\leftarrow$"] - [(alpha) "$\\alpha$"] - [(infin) "$\\infty$"] - [(lang) "$\\langle$"] - [(rang) "$\\rangle$"] - [else (error 'render "unknown symbol element: ~e" i)]))] - [else (display-protected (format "~s" i))]) - null) - - (define/override (string-to-implicit-styles e) - (for/fold ([ses null]) ([ch (in-string e)]) - (case ch - [(#\☠) (cons skull-style ses)] - [else ses]))) - - (define/private (display-protected s) - (define rtt (rendering-tt)) - (define convs (extra-character-conversions)) - (cond - [(eq? rtt 'exact) - (display s)] - [(eq? rtt 'url) - (for ([c (in-string s)]) - (case c - [(#\%) (display "\\%")] - [(#\#) (display "\\#")] - [(#\\) (display "\\%5c")] - [(#\{) (display "\\%7b")] - [(#\}) (display "\\%7d")] - [else (display c)]))] - [else - ;; Start by normalizing to "combined" form, so that Racket characters - ;; are closer to Unicode characters (e.g., ä is one character, instead - ;; of a combining character followed by "a"). - (let ([s (string-normalize-nfc s)]) - (let ([len (string-length s)]) - (let loop ([i 0]) - (unless (= i len) - (display - (let char-loop ([c (string-ref s i)]) - (case c - [(#\\) (if (rendering-tt) - "{\\char`\\\\}" - "$\\backslash$")] - [(#\_) (if (rendering-tt) - "{\\char`\\_}" - "$\\_$")] - [(#\^) "{\\char'136}"] - [(#\>) (if (rendering-tt) "{\\Stttextmore}" "$>$")] - [(#\<) (if (rendering-tt) "{\\Stttextless}" "$<$")] - [(#\|) (if (rendering-tt) "{\\Stttextbar}" "$|$")] - [(#\-) "{-}"] ;; avoid en- or em-dash - [(#\`) "{\\textasciigrave}"] - [(#\') "{\\textquotesingle}"] - [(#\? #\! #\. #\:) - (if (rendering-tt) (format "{\\hbox{\\texttt{~a}}}" c) c)] - [(#\~) "$\\sim$"] - [(#\{ #\}) (if (rendering-tt) - (format "{\\char`\\~a}" c) - (format "\\~a" c))] - [(#\[ #\]) (if (escape-brackets) - (if (eq? c #\[) - "{\\SOpenSq}" - "{\\SCloseSq}") - c)] - [(#\# #\% #\& #\$) (format "\\~a" c)] - [(#\uA0) "~"] ; non-breaking space - [(#\uAD) "\\-"] ; soft hyphen; unfortunately, also disables auto-hyphen - [(#\uDF) "{\\ss}"] - [else - (if ((char->integer c) . > . 127) - ;; first, try user-defined conversions - (or (convs c) - ;; latex-prefix.rkt enables utf8 input, but this does not work for - ;; all the characters below (e.g. ∞). Some parts of the table - ;; below are therefore necessary, but some parts probably are not. - ;; Which parts are necessary may depend on the latex version, - ;; though, so we keep this table around to avoid regressions. - (case c - [(#\╔ #\═ #\╗ #\║ #\╚ #\╝ #\╦ #\╠ #\╣ #\╬ #\╩) (box-character c)] - [(#\┌ #\─ #\┐ #\│ #\└ #\┘ #\┬ #\├ #\┤ #\┼ #\┴) (box-character c)] - [(#\┏ #\━ #\┓ #\┃ #\┗ #\┛ #\┳ #\┣ #\┫ #\╋ #\┻) (box-character c 2)] - [(#\u2011) "\\mbox{-}"] ; non-breaking hyphen - [(#\uB0) "$^{\\circ}$"] ; degree - [(#\uB2) "$^2$"] - [(#\u039A) "K"] ; kappa - [(#\u0391) "A"] ; alpha - [(#\u039F) "O"] ; omicron - [(#\u03A3) "$\\Sigma$"] - [(#\u03BA) "$\\kappa$"] - [(#\u03B1) "$\\alpha$"] - [(#\u03B2) "$\\beta$"] - [(#\u03B3) "$\\gamma$"] - [(#\u03BF) "o"] ; omicron - [(#\u03C3) "$\\sigma$"] - [(#\u03C2) "$\\varsigma$"] - [(#\u03BB) "$\\lambda$"] - [(#\u039B) "$\\Lambda$"] - [(#\u03BC) "$\\mu$"] - [(#\u03C0) "$\\pi$"] - [(#\‘) "{`}"] - [(#\’) "{'}"] - [(#\“) "{``}"] - [(#\”) "{''}"] - [(#\u2013) "{--}"] - [(#\u2014) "{---}"] - [(#\⟨ #\〈) "$\\langle$"] ; [MATHEMATICAL] LEFT ANGLE BRACKET - [(#\⟩ #\〉) "$\\rangle$"] ; [MATHEMATICAL] RIGHT ANGLE BRACKET - [(#\∞) "$\\infty$"] - [(#\⇓) "$\\Downarrow$"] - [(#\↖) "$\\nwarrow$"] - [(#\↓) "$\\downarrow$"] - [(#\⇒) "$\\Rightarrow$"] - [(#\→) "$\\rightarrow$"] - [(#\↘) "$\\searrow$"] - [(#\↙) "$\\swarrow$"] - [(#\←) "$\\leftarrow$"] - [(#\↑) "$\\uparrow$"] - [(#\⇐) "$\\Leftarrow$"] - [(#\−) "$\\longrightarrow$"] - [(#\⇑) "$\\Uparrow$"] - [(#\⇔) "$\\Leftrightarrow$"] - [(#\↕) "$\\updownarrow$"] - [(#\↔) "$\\leftrightarrow$"] - [(#\↗) "$\\nearrow$"] - [(#\⇕) "$\\Updownarrow$"] - [(#\א) "$\\aleph$"] - [(#\′) "$\\prime$"] - [(#\∅) "$\\emptyset$"] - [(#\∇) "$\\nabla$"] - [(#\♦) "$\\diamondsuit$"] - [(#\♠) "$\\spadesuit$"] - [(#\♣) "$\\clubsuit$"] - [(#\♥) "$\\heartsuit$"] - [(#\♯) "$\\sharp$"] - [(#\♭) "$\\flat$"] - [(#\♮) "$\\natural$"] - [(#\√) "$\\surd$"] - [(#\∆) "$\\Delta$"] ; no better mapping for than \Delta for "increment" - [(#\u2211) "$\\sum$"] ; better than \Sigma, right? - [(#\u220F) "$\\prod$"] ; better than \Pi, right? - [(#\u2210) "$\\coprod$"] - [(#\u222B) "$\\int$"] - [(#\u222E) "$\\oint$"] - [(#\¬) "$\\neg$"] - [(#\△) "$\\triangle$"] - [(#\∀) "$\\forall$"] - [(#\∃) "$\\exists$"] - [(#\∘) "$\\circ$"] - [(#\θ) "$\\theta$"] - [(#\ϑ) "$\\vartheta$"] - [(#\τ) "$\\tau$"] - [(#\υ) "$\\upsilon$"] - [(#\φ) "$\\phi$"] - [(#\ϕ) "$\\varphi$"] - [(#\δ) "$\\delta$"] - [(#\ρ) "$\\rho$"] - [(#\ϱ) "$\\varrho$"] - [(#\ϵ) "$\\epsilon$"] - [(#\ε) "$\\varepsilon$"] - [(#\ϖ) "$\\varpi$"] - [(#\χ) "$\\chi$"] - [(#\ψ) "$\\psi$"] - [(#\ζ) "$\\zeta$"] - [(#\ν) "$\\nu$"] - [(#\ω) "$\\omega$"] - [(#\η) "$\\eta$"] - [(#\ι) "$\\iota$"] - [(#\ξ) "$\\xi$"] - [(#\Γ) "$\\Gamma$"] - [(#\Ψ) "$\\Psi$"] - [(#\Δ) "$\\Delta$"] - [(#\Ξ) "$\\Xi$"] - [(#\Υ) "$\\Upsilon$"] - [(#\Ω) "$\\Omega$"] - [(#\Θ) "$\\Theta$"] - [(#\Π) "$\\Pi$"] - [(#\Φ) "$\\Phi$"] - [(#\±) "$\\pm$"] - [(#\∩) "$\\cap$"] - [(#\◇) "$\\diamond$"] - [(#\⊕) "$\\oplus$"] - [(#\∓) "$\\mp$"] - [(#\∪) "$\\cup$"] - [(#\△) "$\\bigtriangleup$"] - [(#\⊖) "$\\ominus$"] - [(#\×) "$\\times$"] - [(#\⊎) "$\\uplus$"] - [(#\▽) "$\\bigtriangledown$"] - [(#\⊗) "$\\otimes$"] - [(#\÷) "$\\div$"] - [(#\⊓) "$\\sqcap$"] - [(#\▹) "$\\triangleleft$"] - [(#\⊘) "$\\oslash$"] - [(#\∗) "$\\ast$"] - [(#\⊔) "$\\sqcup$"] - [(#\∨) "$\\vee$"] - [(#\∧) "$\\wedge$"] - [(#\◃) "$\\triangleright$"] - [(#\⊙) "$\\odot$"] - [(#\★) "$\\star$"] - [(#\†) "$\\dagger$"] - [(#\•) "$\\bullet$"] - [(#\‡) "$\\ddagger$"] - [(#\≀) "$\\wr$"] - [(#\⨿) "$\\amalg$"] - [(#\≤) "$\\leq$"] - [(#\≥) "$\\geq$"] - [(#\≡) "$\\equiv$"] - [(#\⊨) "$\\models$"] - [(#\≺) "$\\prec$"] - [(#\≻) "$\\succ$"] - [(#\∼) "$\\sim$"] - [(#\⊥) "$\\perp$"] - [(#\≼) "$\\preceq$"] - [(#\≽) "$\\succeq$"] - [(#\≃) "$\\simeq$"] - [(#\≪) "$\\ll$"] - [(#\≫) "$\\gg$"] - [(#\≍) "$\\asymp$"] - [(#\∥) "$\\parallel$"] - [(#\⊂) "$\\subset$"] - [(#\⊃) "$\\supset$"] - [(#\≈) "$\\approx$"] - [(#\⋈) "$\\bowtie$"] - [(#\⊆) "$\\subseteq$"] - [(#\⊇) "$\\supseteq$"] - [(#\≌) "$\\cong$"] - [(#\⊏) "$\\sqsubset$"] - [(#\⊐) "$\\sqsupset$"] - [(#\≠) "$\\neq$"] - [(#\⌣) "$\\smile$"] - [(#\⊑) "$\\sqsubseteq$"] - [(#\⊒) "$\\sqsupseteq$"] - [(#\≐) "$\\doteq$"] - [(#\⌢) "$\\frown$"] - [(#\∈) "$\\in$"] - [(#\∉) "$\\not\\in$"] - [(#\∋) "$\\ni$"] - [(#\∝) "$\\propto$"] - [(#\⊢) "$\\vdash$"] - [(#\⊣) "$\\dashv$"] - [(#\☠) "$\\skull$"] - [(#\☺) "$\\smiley$"] - [(#\☻) "$\\blacksmiley$"] - [(#\☹) "$\\frownie$"] - [(#\ø) "{\\o}"] - [(#\Ø) "{\\O}"] - [(#\ł) "{\\l}"] - [(#\Ł) "{\\L}"] - [(#\uA7) "{\\S}"] - [(#\⟦ #\〚) "$[\\![$"] - [(#\⟧ #\〛) "$]\\!]$"] - [(#\↦) "$\\mapsto$"] - [(#\⊤) "$\\top$"] - [(#\¥) "{\\textyen}"] - [(#\™) "{\\texttrademark}"] - [(#\®) "{\\textregistered}"] - [(#\©) "{\\textcopyright}"] - [(#\u2070) "$^0$"] - [(#\u00b9) "$^1$"] - [(#\u00b2) "$^2$"] - [(#\u00b3) "$^3$"] - [(#\u2074) "$^4$"] - [(#\u2075) "$^5$"] - [(#\u2076) "$^6$"] - [(#\u2077) "$^7$"] - [(#\u2078) "$^8$"] - [(#\u2079) "$^9$"] - [(#\u207a) "$^+$"] - [(#\u207b) "$^-$"] - [(#\⋖) "$\\precdot$"] - [(#\⋗) "$\\succdot$"] - [(#\⋮) "\\vdots"] - [(#\⋱) "$\\ddots$"] - [(#\⋯) "$\\cdots$"] - [(#\⋯) "\\hdots"] - [else - (cond - [(char<=? #\uAC00 c #\uD7AF) ; Korean Hangul - (format "\\begin{CJK}{UTF8}{mj}~a\\end{CJK}" c)] - [else - ;; Detect characters that can be formed with combining characters - ;; and translate them to Latex combinations: - (define s (string-normalize-nfd (string c))) - (define len (string-length s)) - (cond - [(len . > . 1) - (define combiner (case (string-ref s (sub1 len)) - [(#\u300) "\\`{~a}"] - [(#\u301) "\\'{~a}"] - [(#\u302) "\\^{~a}"] - [(#\u303) "\\~~{~a}"] - [(#\u304) "\\={~a}"] - [(#\u306) "\\u{~a}"] - [(#\u307) "\\.{~a}"] - [(#\u308) "\\\"{~a}"] - [(#\u30a) "\\r{~a}"] - [(#\u30b) "\\H{~a}"] - [(#\u30c) "\\v{~a}"] - [(#\u327) "\\c{~a}"] - [(#\u328) "\\k{~a}"] - [else #f])) - (define base (string-normalize-nfc (substring s 0 (sub1 len)))) - (if (and combiner - (= 1 (string-length base))) - (format combiner (char-loop (string-ref base 0))) - c)] - [else c])])])) - c)]))) - (loop (add1 i))))))])) - - - (define/private (box-character c [line-thickness 1]) - (define (combine . args) - (apply string-append - "\\setlength{\\unitlength}{0.05em}" - (if (= line-thickness 1) - "" - (format "\\linethickness{~apt}" (* 0.4 line-thickness))) - (filter (λ (x) (not (regexp-match #rx"^[ \n]*$" x))) - (flatten args)))) - (define (adjust % v) - (define num (* % (/ v 10) 10)) - (define i-part (floor num)) - (define d-part (floor (* 10 (- num i-part)))) - (format "~a.~a" i-part d-part)) - (define (x v) (adjust 1 v)) - (define (y v) (adjust 6/4 v)) - (define upper-horizontal @list{\put(@x[0],@y[6]){\line(1,0){@x[10]}}}) - (define mid-horizontal @list{\put(@x[0],@y[5]){\line(1,0){@x[10]}}}) - (define lower-horizontal @list{\put(@x[0],@y[4]){\line(1,0){@x[10]}}}) - (define righter-vertical @list{\put(@x[6],@y[10]){\line(0,-1){@y[10]}}}) - (define mid-vertical @list{\put(@x[5],@y[10]){\line(0,-1){@y[10]}}}) - (define lefter-vertical @list{\put(@x[4],@y[10]){\line(0,-1){@y[10]}}}) - (define bottom-right @list{\put(@x[6],@y[4]){\line(1,0){@x[4]}} - \put(@x[6],@y[0]){\line(0,1){@y[4]}}}) - (define bottom-left @list{\put(@x[0],@y[4]){\line(1,0){@x[4]}} - \put(@x[4],@y[0]){\line(0,1){@y[4]}}}) - (define upper-right @list{\put(@x[6],@y[6]){\line(1,0){@x[4]}} - \put(@x[6],@y[10]){\line(0,-1){@y[4]}}}) - (define upper-left @list{\put(@x[0],@y[6]){\line(1,0){@x[4]}} - \put(@x[4],@y[10]){\line(0,-1){@y[4]}}}) - (define header @list{\begin{picture}(@x[10],@y[10])(0,0)}) - (define footer @list{\end{picture}}) - - (case c - [(#\╔) - @combine{@header - \put(@x[4],@y[6]){\line(1,0){@x[6]}} - \put(@x[4],@y[0]){\line(0,1){@y[6]}} - @bottom-right - @footer}] - [(#\═) @combine{@header - @upper-horizontal - @lower-horizontal - @footer}] - [(#\╗) @combine{@header - \put(@x[0],@y[6]){\line(1,0){@x[6]}} - \put(@x[6],@y[0]){\line(0,1){@y[6]}} - @bottom-left - @footer}] - [(#\║) @combine{@header - @lefter-vertical - @righter-vertical - @footer}] - [(#\╚) @combine{@header - @upper-right - \put(@x[4],@y[4]){\line(1,0){@x[6]}} - \put(@x[4],@y[10]){\line(0,-1){@y[6]}} - @footer}] - [(#\╝) - @combine{@header - @upper-left - \put(@x[0],@y[4]){\line(1,0){@x[6]}} - \put(@x[6],@y[10]){\line(0,-1){@y[6]}} - @footer}] - [(#\╣) - @combine{@header - @upper-left - @bottom-left - @righter-vertical - @footer}] - [(#\╠) - @combine{@header - @upper-right - @bottom-right - @lefter-vertical - @footer}] - [(#\╩) - @combine{@header - @upper-right - @upper-left - @lower-horizontal - @footer}] - [(#\╦) - @combine{@header - @bottom-right - @bottom-left - @upper-horizontal - @footer}] - [(#\╬) - @combine{@header - @upper-left - @bottom-left - @upper-right - @bottom-right - @footer}] - [(#\┌ #\┏) - @combine{@header - \put(@x[5],@y[5]){\line(1,0){@x[5]}} - \put(@x[5],@y[0]){\line(0,1){@y[5]}} - @footer}] - [(#\─ #\━) @combine{@header - @mid-horizontal - @footer}] - [(#\┐ #\┓) @combine{@header - \put(@x[0],@y[5]){\line(1,0){@x[5]}} - \put(@x[5],@y[0]){\line(0,1){@y[5]}} - @footer}] - [(#\│ #\┃) @combine{@header - @mid-vertical - @footer}] - [(#\└ #\┗) @combine{@header - \put(@x[5],@y[5]){\line(1,0){@x[5]}} - \put(@x[5],@y[10]){\line(0,-1){@y[5]}} - @footer}] - [(#\┘ #\┛) - @combine{@header - \put(@x[0],@y[5]){\line(1,0){@x[5]}} - \put(@x[5],@y[10]){\line(0,-1){@y[5]}} - @footer}] - [(#\┤ #\┫) - @combine{@header - \put(@x[0],@y[5]){\line(1,0){@x[5]}} - @mid-vertical - @footer}] - [(#\├ #\┣) - @combine{@header - \put(@x[5],@y[5]){\line(1,0){@x[5]}} - @mid-vertical - @footer}] - [(#\┴ #\┻) - @combine{@header - \put(@x[5],@y[10]){\line(0,-1){@y[5]}} - @mid-horizontal - @footer}] - [(#\┬ #\┳) - @combine{@header - \put(@x[5],@y[5]){\line(0,-1){@y[5]}} - @mid-horizontal - @footer}] - [(#\┼ #\╋) - @combine{@header - @mid-horizontal - @mid-vertical - @footer}])) - - ;; ---------------------------------------- - - (define/override (table-of-contents sec ri) - ;; FIXME: isn't local to the section - (make-toc-paragraph plain null)) - - (define/override (local-table-of-contents part ri style) - (make-paragraph plain null)))) diff --git a/scribble-lib/scribble/lncs/.gitignore b/scribble-lib/scribble/lncs/.gitignore deleted file mode 100644 index 6c77022d..00000000 --- a/scribble-lib/scribble/lncs/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -# to avoid committing it by accident, since we can't distribute it -/llncs.cls diff --git a/scribble-lib/scribble/lncs/lang.rkt b/scribble-lib/scribble/lncs/lang.rkt deleted file mode 100644 index 11ab79ba..00000000 --- a/scribble-lib/scribble/lncs/lang.rkt +++ /dev/null @@ -1,195 +0,0 @@ -#lang racket/base -(require scribble/doclang - scribble/core - racket/file - (except-in scribble/base author) - (prefix-in s/b: scribble/base) - scribble/decode - "../private/defaults.rkt" - setup/collects - scribble/html-properties - scribble/latex-properties - scribble/latex-prefix - racket/stxparam - net/ftp - file/gunzip - (for-syntax racket/base - racket/list - racket/stxparam-exptime)) - -(module test racket/base) - -(provide (except-out (all-from-out scribble/doclang) #%module-begin) - (all-from-out scribble/base) - (rename-out [module-begin #%module-begin]) - abstract include-abstract - authors author - institute institutes - email) - -(define-syntax (module-begin stx) - ;; No options, currently, but keep in case we want to support some: - (syntax-case* stx () (lambda (a b) (eq? (syntax-e a) (syntax-e b))) - [(_ id ws . body) - ;; Skip intraline whitespace to find options: - (and (string? (syntax-e #'ws)) - (regexp-match? #rx"^ *$" (syntax-e #'ws))) - #'(module-begin id . body)] - [(_ id . body) - #'(#%module-begin id (post-process) () . body)])) - -(define cls-file - (let ([p (scribble-file "lncs/llncs.cls")]) - (if (file-exists? (collects-relative->path p)) - p - (downloaded-file "llncs.cls")))) - -(define ((post-process) doc) - (add-defaults doc - (string->bytes/utf-8 (string-append "\\documentclass{llncs}\n" - unicode-encoding-packages)) - (scribble-file "lncs/style.tex") - (list cls-file) - #f)) - -(define lncs-extras - (let ([abs (lambda (s) - (path->collects-relative - (collection-file-path s "scribble" "lncs")))]) - (list - (make-css-addition (abs "lncs.css")) - (make-tex-addition (abs "lncs.tex"))))) - -(unless (or (not (path? cls-file)) - (file-exists? cls-file)) - (log-error (format "File not found: ~a" cls-file)) - (define site "ftp.springer.de") - (define path "pub/tex/latex/llncs/latex2e") - (define file "llncs2e.zip") - (unless (directory-exists? (find-system-path 'addon-dir)) - (make-directory (find-system-path 'addon-dir))) - (log-error (format "Downloading via ftp://~a/~a/~a..." site path file)) - (define c (ftp-establish-connection site 21 "anonymous" "user@racket-lang.org")) - (ftp-cd c path) - (make-directory* (find-system-path 'temp-dir)) - (ftp-download-file c (find-system-path 'temp-dir) file) - (ftp-close-connection c) - (define z (build-path (find-system-path 'temp-dir) file)) - ;; Poor man's unzip (replace it when we have an `unzip' library): - (define i (open-input-file z)) - (define (skip n) (file-position i (+ (file-position i) n))) - (define (get n) - (define s (read-bytes n i)) - (unless (and (bytes? s) (= n (bytes-length s))) - (error "unexpected end of file")) - s) - (let loop () - (cond - [(equal? #"PK\3\4" (get 4)) - ;; local file header - (skip 2) - (define data-desc? (bitwise-bit-set? (bytes-ref (get 1) 0) 3)) - (skip 11) - (define sz (integer-bytes->integer (get 4) #f #f)) - (skip 4) - (define name-sz (integer-bytes->integer (get 2) #f #f)) - (define extra-sz (integer-bytes->integer (get 2) #f #f)) - (define name (bytes->string/utf-8 (get name-sz) #\?)) - (skip extra-sz) - (if (equal? name "llncs.cls") - (call-with-output-file cls-file - (lambda (o) - (inflate i o))) - (begin - (skip sz) - (when data-desc? - skip 12) - (loop)))] - [else (error "didn't find file in archive")])) - (close-input-port i) - (delete-file z)) - -;; ---------------------------------------- -;; Abstracts: - -(define abstract-style (make-style "abstract" lncs-extras)) - -(define (abstract . strs) - (make-nested-flow - abstract-style - (decode-flow strs))) - -(define (extract-abstract p) - (unless (part? p) - (error 'include-abstract "doc binding is not a part: ~e" p)) - (unless (null? (part-parts p)) - (error 'include-abstract "abstract part has sub-parts: ~e" (part-parts p))) - (when (part-title-content p) - (error 'include-abstract "abstract part has title content: ~e" (part-title-content p))) - (part-blocks p)) - -(define-syntax-rule (include-abstract mp) - (begin - (require (only-in mp [doc abstract-doc])) - (make-nested-flow abstract-style (extract-abstract abstract-doc)))) - -;; ---------------------------------------- -;; Author - -(define-syntax (author stx) - (raise-syntax-error 'author "can only be used inside 'authors'" stx)) -(define-syntax (authors stx) - (syntax-case stx (author) - [(_ (author . args) ...) - #`(paragraph - (style 'author '()) - (make-element (style "LNCSauthor" lncs-extras) - (decode-content - (list - #,@(apply - append - (add-between - (for/list ([stx (in-list (syntax->list #'(args ...)))]) - (syntax-case stx () - [(#:inst string rest ...) - (append (syntax->list #'(rest ...)) - (list #'(element (style "LNCSinst" lncs-extras) (decode-content (list string)))))] - [(rest ...) - (syntax->list #'(rest ...))])) - (list #'(element (style "LNCSand" lncs-extras) '()))))))))] - [(_ . rest) - (raise-syntax-error 'authors "expected a sequence of authors" stx)])) - -(define-syntax-parameter email-ok #f) - -(define-syntax (institute stx) - (raise-syntax-error #f "can only be used inside 'institutes'" stx)) -(define-syntax (institutes stx) - (syntax-case stx (author) - [(_ (inst . args) ...) - #`(syntax-parameterize - ((email-ok #t)) - (paragraph - (style 'author '()) - (make-element (style "LNCSinstitutes" lncs-extras) - (decode-content - (list - #,@(apply - append - (add-between - (for/list ([stx (in-list (syntax->list #'(args ...)))]) - (syntax-case stx () - [(rest ...) - (syntax->list #'(rest ...))])) - (list #'(element (style "LNCSand" lncs-extras) '())))))))))] - [(_ . rest) - (raise-syntax-error 'institutes "expected a sequence of institutes" stx)])) - -(define-syntax (email stx) - (syntax-case stx () - [(_ . args) - (begin - (unless (syntax-parameter-value #'email-ok) - (raise-syntax-error 'email "email can appear inside institutes only")) - #'(make-element (style "LNCSemail" lncs-extras) - (decode-content (list . args))))])) diff --git a/scribble-lib/scribble/lncs/lang/reader.rkt b/scribble-lib/scribble/lncs/lang/reader.rkt deleted file mode 100644 index 6bac48ba..00000000 --- a/scribble-lib/scribble/lncs/lang/reader.rkt +++ /dev/null @@ -1,3 +0,0 @@ -#lang s-exp scribble/base/reader -scribble/lncs/lang -#:wrapper1 (lambda (t) (cons 'doc (t))) diff --git a/scribble-lib/scribble/lncs/lncs.tex b/scribble-lib/scribble/lncs/lncs.tex deleted file mode 100644 index 6125813c..00000000 --- a/scribble-lib/scribble/lncs/lncs.tex +++ /dev/null @@ -1,11 +0,0 @@ -\newcommand{\LNCSand}{\and} - -\newcommand{\LNCSauthor}[1]{\author{#1}} -\newcommand{\LNCSinst}[1]{\inst{#1}} - -\newcommand{\LNCSinstitutes}[1]{\institute{#1}} -\newcommand{\LNCSinstitute}[1]{#1} - -\newcommand{\LNCSemail}[1]{\email{#1}} - -\renewcommand{\SAuthorSep}{} diff --git a/scribble-lib/scribble/lncs/style.tex b/scribble-lib/scribble/lncs/style.tex deleted file mode 100644 index 9d57aab1..00000000 --- a/scribble-lib/scribble/lncs/style.tex +++ /dev/null @@ -1,3 +0,0 @@ - -\renewcommand{\titleAndVersionAndAuthors}[3]{\title{#1}\titlerunning{#2}#3\maketitle} -\renewcommand{\titleAndEmptyVersionAndAuthors}[3]{\titleAndVersionAndAuthors{#1}{#1}{#3}} diff --git a/scribble-lib/scribble/lp-include.rkt b/scribble-lib/scribble/lp-include.rkt deleted file mode 100644 index d3558652..00000000 --- a/scribble-lib/scribble/lp-include.rkt +++ /dev/null @@ -1,20 +0,0 @@ -#lang scheme/base - -(require scheme/include (for-syntax scheme/base) - (only-in scribble/private/lp chunk CHUNK) - scribble/manual) - -(provide lp-include) - -(define-syntax (module stx) - (syntax-case stx (#%module-begin) - [(module name base (#%module-begin body ...)) - #'(begin body ...)] - [(module name base body ...) - (raise-syntax-error #f "missing #%module-begin" stx)])) - -(define-syntax (lp-include stx) - (syntax-case stx () - [(_ name) - (with-syntax ([there (datum->syntax stx 'there)]) - #'(include-at/relative-to here there name))])) diff --git a/scribble-lib/scribble/lp.rkt b/scribble-lib/scribble/lp.rkt deleted file mode 100644 index 68fbcaf9..00000000 --- a/scribble-lib/scribble/lp.rkt +++ /dev/null @@ -1,3 +0,0 @@ -#lang racket/base -(require scribble/private/lp) -(provide chunk CHUNK) diff --git a/scribble-lib/scribble/lp/lang/common.rkt b/scribble-lib/scribble/lp/lang/common.rkt deleted file mode 100644 index 1501d8df..00000000 --- a/scribble-lib/scribble/lp/lang/common.rkt +++ /dev/null @@ -1,149 +0,0 @@ -#lang racket/base - -(provide (except-out (all-from-out racket/base) #%module-begin) - module-begin/plain - module-begin/doc) - -(require (for-syntax racket/base syntax/boundmap racket/list - syntax/strip-context)) - -(begin-for-syntax - (define first-id #f) - (define main-id #f) - (define (mapping-get mapping id) - (free-identifier-mapping-get mapping id (lambda () '()))) - ;; maps a chunk identifier to its collected expressions - (define chunks (make-free-identifier-mapping)) - ;; maps a chunk identifier to all identifiers that are used to define it - (define chunk-groups (make-free-identifier-mapping)) - (define (get-chunk id) (mapping-get chunks id)) - (define (add-to-chunk! id exprs) - (unless first-id (set! first-id id)) - (when (eq? (syntax-e id) '<*>) (set! main-id id)) - (free-identifier-mapping-put! - chunk-groups id - (cons id (mapping-get chunk-groups id))) - (free-identifier-mapping-put! - chunks id - `(,@(mapping-get chunks id) ,@exprs)))) - -(define-syntax (tangle stx) - (define chunk-mentions '()) - (unless first-id - (raise-syntax-error 'scribble/lp "no chunks")) - (define orig-stx (syntax-case stx () [(_ orig) #'orig])) - (define (restore nstx d) (datum->syntax orig-stx d nstx nstx)) - (define (shift nstx) (replace-context orig-stx nstx)) - (define body - (let ([main-id (or main-id first-id)]) - (restore - main-id - (let loop ([block (get-chunk main-id)]) - (append-map - (lambda (expr) - (if (identifier? expr) - (let ([subs (get-chunk expr)]) - (if (pair? subs) - (begin (set! chunk-mentions (cons expr chunk-mentions)) - (loop subs)) - (list (shift expr)))) - (let ([subs (syntax->list expr)]) - (if subs - (list (restore expr (loop subs))) - (list (shift expr)))))) - block))))) - (with-syntax ([(body ...) (strip-comments body)] - ;; construct arrows manually - [((b-use b-id) ...) - (append-map (lambda (m) - (map (lambda (u) - (list (syntax-local-introduce m) - (syntax-local-introduce u))) - (mapping-get chunk-groups m))) - chunk-mentions)]) - #`(begin body ... (let ([b-id (void)]) b-use) ...))) - -(define-for-syntax (strip-comments body) - (cond - [(syntax? body) - (define r (strip-comments (syntax-e body))) - (if (eq? r (syntax-e body)) - body - (datum->syntax body r body body))] - [(pair? body) - (define a (car body)) - (define ad (syntax-e a)) - (cond - [(and (pair? ad) - (memq (syntax-e (car ad)) - '(code:comment - code:contract))) - (strip-comments (cdr body))] - [(eq? ad 'code:blank) - (strip-comments (cdr body))] - [(and (or (eq? ad 'code:hilite) - (eq? ad 'code:quote)) - (let* ([d (cdr body)] - [dd (if (syntax? d) - (syntax-e d) - d)]) - (and (pair? dd) - (or (null? (cdr dd)) - (and (syntax? (cdr dd)) - (null? (syntax-e (cdr dd)))))))) - (define d (cdr body)) - (define r - (strip-comments (car (if (syntax? d) (syntax-e d) d)))) - (if (eq? ad 'code:quote) - `(quote ,r) - r)] - [(and (pair? ad) - (eq? (syntax-e (car ad)) - 'code:line)) - (strip-comments (append (cdr ad) (cdr body)))] - [else (cons (strip-comments a) - (strip-comments (cdr body)))])] - [else body])) - -(define-for-syntax (extract-chunks exprs) - (let loop ([exprs exprs]) - (syntax-case exprs () - [() (void)] - [(expr . exprs) - (syntax-case #'expr (define-syntax quote-syntax) - [(define-values (lifted) (quote-syntax (a-chunk id body ...))) - (eq? (syntax-e #'a-chunk) 'a-chunk) - (begin - (add-to-chunk! #'id (syntax->list #'(body ...))) - (loop #'exprs))] - [_ - (loop #'exprs)])]))) - -(define-for-syntax ((make-module-begin submod?) stx) - (syntax-case stx () - [(_ body0 . body) - (let ([expanded - (expand `(,#'module scribble-lp-tmp-name scribble/private/lp - ,@(strip-context #'(body0 . body))))]) - (syntax-case expanded () - [(module name lang (mb . stuff)) - (begin (extract-chunks #'stuff) - #`(#%module-begin - (tangle body0) - ;; The `doc` submodule allows a `scribble/lp` module - ;; to be provided to `scribble`: - #,@(if submod? - (list - (let ([submod - (strip-context - #`(module doc scribble/doclang2 - (require scribble/manual - (only-in scribble/private/lp chunk CHUNK)) - (begin body0 . body)))]) - (syntax-case submod () - [(_ . rest) - (datum->syntax submod (cons #'module* #'rest))]))) - '())))]))])) - -(define-syntax module-begin/plain (make-module-begin #f)) -(define-syntax module-begin/doc (make-module-begin #t)) diff --git a/scribble-lib/scribble/lp/lang/lang.rkt b/scribble-lib/scribble/lp/lang/lang.rkt deleted file mode 100644 index e2fcc4d2..00000000 --- a/scribble-lib/scribble/lp/lang/lang.rkt +++ /dev/null @@ -1,7 +0,0 @@ -#lang racket/base -(require "common.rkt") - -(provide (except-out (all-from-out "common.rkt") - module-begin/plain - module-begin/doc) - (rename-out [module-begin/plain #%module-begin])) diff --git a/scribble-lib/scribble/lp/lang/lang2.rkt b/scribble-lib/scribble/lp/lang/lang2.rkt deleted file mode 100644 index 299e32a2..00000000 --- a/scribble-lib/scribble/lp/lang/lang2.rkt +++ /dev/null @@ -1,7 +0,0 @@ -#lang racket/base -(require "common.rkt") - -(provide (except-out (all-from-out "common.rkt") - module-begin/plain - module-begin/doc) - (rename-out [module-begin/doc #%module-begin])) diff --git a/scribble-lib/scribble/lp/lang/reader.rkt b/scribble-lib/scribble/lp/lang/reader.rkt deleted file mode 100644 index bc2e2f8b..00000000 --- a/scribble-lib/scribble/lp/lang/reader.rkt +++ /dev/null @@ -1,17 +0,0 @@ -#lang s-exp syntax/module-reader - -scribble/lp/lang/lang - -#:read read-inside -#:read-syntax read-syntax-inside -#:whole-body-readers? #t -;; don't use scribble-base-info for the #:info arg, since -;; scribble/lp files are not directly scribble'able. -#:language-info (scribble-base-language-info) -#:info (scribble-base-reader-info) -(require scribble/reader - (only-in scribble/base/reader - scribble-base-reader-info - scribble-base-language-info)) - - diff --git a/scribble-lib/scribble/lp2.rkt b/scribble-lib/scribble/lp2.rkt deleted file mode 100644 index 66765117..00000000 --- a/scribble-lib/scribble/lp2.rkt +++ /dev/null @@ -1,16 +0,0 @@ -#lang racket/base -(require scribble/private/lp) -(provide chunk CHUNK) - -(module reader syntax/module-reader - scribble/lp/lang/lang2 - - #:read read-inside - #:read-syntax read-syntax-inside - #:whole-body-readers? #t - #:language-info (scribble-base-language-info) - #:info (scribble-base-info) - (require scribble/reader - (only-in scribble/base/reader - scribble-base-info - scribble-base-language-info))) diff --git a/scribble-lib/scribble/manual-fonts.css b/scribble-lib/scribble/manual-fonts.css deleted file mode 100644 index 39656bb4..00000000 --- a/scribble-lib/scribble/manual-fonts.css +++ /dev/null @@ -1,343 +0,0 @@ -@font-face { -font-family: Miso; -font-style: normal; -font-weight: bold; -font-stretch: normal; -src: url('data:application/font-woff;charset=utf-8;base64,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') format('woff'); -} - -/* Miso license */ -/* - M M I SSS OOO - MM MM I S S O O - M M M M I S O O - M M M I S O O - M M I S O O - M M I S S O O - M M I SSS OOO - ---------------------------------------- -MISO is an architectural lettering font -completed in 2006 by Mårten Nettelbladt. ---------------------------------------- -MISO is available in three weights -(Light, Regular, Bold) -in TrueType and OpenType format. ---------------------------------------- - - L I C E N S E I N F O R M A T I O N ---------------------------------------- -MISO is a free typeface. However, -there is one important limitation: - -MISO MUST ALWAYS REMAIN COMPLETELY FREE - -You can use MISO for personal and commercial work. -You can share MISO with your friends -as long as you include this text file. - -You must not sell MISO. -You must not charge someone else for using MISO. -You must not bundle MISO with a sold product. - -Use it, share it, but keep it free. ---------------------------------------- - -Mårten Nettelbladt -Omkrets arkitektur -www.omkrets.se - -Stockholm, Sweden -July 9th 2009 - ---------------------------------------- -If you have any comments about MISO -please let me know: -miso (a) omkrets.se ---------------------------------------- - -November 27th 2008 -Converted to OpenType by Torin Hill. - -June 24th 2007 -Some small adjustments - -October 23rd 2006 -Released -*/ - -@font-face { -font-family: Charter; -font-style: normal; -font-weight: normal; -font-stretch: normal; -src: url('data:application/font-woff;charset=utf-8;base64,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') format('woff'); -} -@font-face { -font-family: Charter; -font-style: italic; -font-weight: normal; -font-stretch: normal; -src: url('data:application/font-woff;charset=utf-8;base64,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') format('woff'); -} -@font-face { -font-family: Charter; -font-style: normal; -font-weight: bold; -font-stretch: normal; -src: url('data:application/font-woff;charset=utf-8;base64,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') format('woff'); -} - -/* Charter license */ -/* (c) Copyright 1989-1992, Bitstream Inc., Cambridge, MA. You are hereby granted permission under all Bitstream propriety rights to use, copy, modify, sublicense, sell, and redistribute the 4 Bitstream Charter (r) Type 1 outline fonts and the 4 Courier Type 1 outline fonts for any purpose and without restriction; provided, that this notice is left intact on all copies of such fonts and that Bitstream's trademark is acknowledged as shown below on all unmodified copies of the 4 Charter Type 1 fonts. BITSTREAM CHARTER is a registered trademark of Bitstream Inc. */ - - - -@font-face { -font-family: Fira; -font-style: normal; -font-weight: 300; /* "Light" */ -font-stretch: normal; - src: url(data:application/x-font-woff;charset=utf-8;base64,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) format('woff'); -} - -@font-face { -font-family: Fira; -font-style: italic; -font-weight: 300; /* "Light" */ -font-stretch: normal; - src: url(data:application/x-font-woff;charset=utf-8;base64,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) format('woff'); -} - -@font-face { -font-family: Fira; -font-style: normal; -font-weight: 400; /* "Regular" */ -font-stretch: normal; - src: url(data:application/x-font-woff;charset=utf-8;base64,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) format('woff'); -} - -@font-face { -font-family: Fira; -font-style: normal; -font-weight: 600; /* "Medium" */ -font-stretch: normal; - src: url(data:application/x-font-woff;charset=utf-8;base64,d09GRgABAAAAAGaMABMAAAAA5xAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAABqAAAABwAAAAcafiXXUdERUYAAAHEAAAAHgAAACABGAAER1BPUwAAAeQAAA2GAABEdIU+i5xHU1VCAAAPbAAAAh8AAAb2Y6MJv09TLzIAABGMAAAAXQAAAGAQmEjcY21hcAAAEewAAAGTAAAB8kpEps1jdnQgAAATgAAAADYAAAA2CdAGy2ZwZ20AABO4AAABsQAAAmVTtC+nZ2FzcAAAFWwAAAAIAAAACP//AANnbHlmAAAVdAAAR+sAAIXs9k76gmhlYWQAAF1gAAAANAAAADYCJE9UaGhlYQAAXZQAAAAgAAAAJAe1AphobXR4AABdtAAAAi0AAAOs294k02xvY2EAAF/kAAABygAAAdg0u1P4bWF4cAAAYbAAAAAgAAAAIAIIAZpuYW1lAABh0AAAAgkAAAUyiuuvC3Bvc3QAAGPcAAAB9QAAAu6b+3zWcHJlcAAAZdQAAACuAAABF9ZTawV3ZWJmAABmhAAAAAYAAAAGVS1ThgAAAAEAAAAAzD2izwAAAADODu7hAAAAAM+sBax42mNgZGBg4ANiCQYQYGJgBMJXQMwC5jEAAA5YAR0AAHja1ZxbcFXVGce/E3JCCJBoeiD3kIRrTdUKomipCglIRKtC8ILTanHUzsgwDHWYsfXBFwQvD53OdIIQq7YWL1TMTBuBAEXtEclLHhofDjUx5rSdM2X2TOe87M6wp939f2uvc9lnry855+REp3vNb1/WfX3rW7fvEChERFX0PB2h8u7Nd/dS4+PP7ttNq57a98TTdNPuHz+zh7qpHHHIdakMj9CUX6uoYsPOTW20qmtDL9+38f2ee+/Gfdu99+Deu20r7lkpyh7f+9O9VP30E/v2UET5kLojhCqoWn2HEMKx59C68H/brsN3FYXhquAbpuV0G8IO0FFqpNfot3QDfQq3jj6Du4VC4R+pOq6mPaF3QidCF0OXQxfLyss6yn5SdqJsbE7jnDvKT5R/Hq4OVyMULhxBvIv4XsF+4RvDt+L7Mocq7lC+1V58db/MOXKK0EX6AVW6FjW6CWoGS91BWo7vlXjvBGvAWnAz/Na5b9IteN7qRul77jitx/v33X7ahOediLMF9IC73DhtxXM72AEecpO0E36PIN4P8XwKfgfw/gI4CA6BF8FL4GXwCsL7wGHwKjgCjoLXwK8R/jp4A7wJfoPyf4fnMfA2eAe8C94Dx8HvkeZ9cAJ8AAbAIDgJToHTYAicAefAJ6hfFHyK9wvgM+T/VzdGX4Bx8CX4J8IvgxBtRS9X0CLEW4zvOrSzwbWpCXFaXIcqKQKfRe5xhDpUj5BGfDchZjOeLagdp7UQmkBaC2kdhI6otHPpKsSpVfEt6sJzDEyASXA11SCXq/FWr9KlcraQs63StyG8HXSAXQjbj2c/OAti+L6kc7FRjo1ybNTERk1s3YIkcrCRg40cbJRvIwcbOdjIwUZdbNTFRl1smp+uaR3a7dWH68L1SARqXqPL9FIsUnKwc8pK5pSVST0vK6VXyxb3SqCMR1DGKGL2Q0JxxO7X/fBvtO8KankFtYxpqbHELOSSpFbUdgloQ9p20AGW43slpNkJ1oC1oCut8RY03oLGW9B2i+5HHtvAdrz34rkDzwfwfBB5PIznLqX5Fu3D937k/TP4PadGQgIjIYGRkMBISGAkJDASEhgJCYwEByPBwUhwMBIcjAQHI8GBbEYxGpxpNN+C5lvQfAuab0HzLWi+RR+i3JN4ngKnwRA4A84iz3N4/gnh58FH4GPwKcq5AP8Y6n8JjKH9E+Ar1G8ST3+f1Ol+ye2TasSKIlZU61lSxaxXIyaJfkj1Jvd/FCmjSBlFyihGGYeUow1RtCGKNoyivlHMrNW0nproZkrQfSqWpe7e2HFQlqNr4iA/B/k5yM9BnNWYhRdAE6/CCKjFCF5MdVRPDZiLm6iZWqiVllAbtVMHZuTbqYs20120nXrpQXqYHqVdtI/203PUT2/RSTpFp2mIztBZOkd/phhdojGaoK9okkKNjWoWX0Adc5+pbK1cN+8v83cv2L/wq+qhuu761oa9oc/VzGuCZ2MTzQI8a5vgmdzESqXXQToF1gisFeDVwgSvICZ4VTHBK40JXn1M8IpkglcpEzyOTfBqZmKLQI8Ar4QmeHU0sV1ghwCvrCZ4tTXBK7AJXpVN8EptgldvEy8IHBQ4JPCiwEsCLwu8oubQIH0ChwVeFTgicFTgNQHe1Zh4XeANgTcFeJdkgtcPE8cE3hZ4R+BdgfcEjgvwLs7E+wInBD4QGBAYFDgpcErgtMCQwBmBcwK8azURFeDdrYkLArwLNsE7YxNfCIwLfCnAO20TlwWuUXsRE7UCvGsw0aX3MLmMCUwITApUpPfdXTn76SfV3t4E7/dN8J7bRIPezefSqHZcQSRZ8JnCBJ8zTPDZw0S7QIfALrVrDsJnGRP9AmcF+Bxk4pLAk+rsYuIqgVqBRQKLBaSebFK9FqRNn6lyaRfoEOgS2C/QL3BWYExgQmBSYGPB457PqibksZQ00qR6IQiffU3M9ryycwodLUxCiwRaVOuClE7nzBIqnc6VRtI3FSFR86iXRjHbNkzMsg6VdSj7iQm2qZi4Wq1OQdj2YoLtMSbYRmOC7TYm6gTq1UgOIq+IlpFmgRbVO0HYhmRiiQDbmky0C3QIsJ3KBNuuTHQKrBFYK8C2MBPyudrMFoEega0CbIMzsU2AbXUm2H5ngm16JtjOZ4JtfybYHmhil9r1BGG7oQm2JZpg+6IJtjmaYDukiQMCLwgcFDgk8KLASwIvC7Cd1ESfwGGBVwWOCBwVYPusCbbZmvj/OYebeV/ghMAHAgMCgwJsyzbB9m0TpwROCwwJnBFgG7oJtqubYFu7ifMCHwl8LMC2exNszzcRU6eiIJcE+LcAExMC/JuBCf4dwUTp9lh1AtLea7b36b3q9xATtQLymTFpRGpxvbIYBJFOOI1qfxRE3rWazwf8u46JMYEJgUmBa9SvPiZqBeS+d4yMCUwITAqU0RyqgiOKUAuF6C24+VTW8Tn/XrRkS3uE7oLmkzvqjru2O+Im4WxgseRpGd4TroMvHgkJ7JuHKYy4cYaKvDh/3BN+P3V3VKij4bokvTB8c71sL15BpTnqPu7GXLa3+HzTZTeoZ9wdxr69RNfUNfVa46tlzUzLQvtYZp4M+c3zTWTH8iSKc8K4ewjtTQALdz61J6aWIWbsErZ/2tTcF+PKJWghzyVaL22qStUUYSPuiK9HW/V7Il16ldIdx1jGoCpjEHIb4hK190LEHwVxbjHyD7vH8YzCbyBTWnZPBiSVLIH2ODNIm1CjJhaspRpXqTGWyO4j+MTTIzMJqSRNfSmNP7+vOx6QSNzvw1qqx2XcfUaVGM9NHSzJK91fb57XCtO0/OYQXTvbN14dCutR5M1Ptg6xdCvVvJUl66RfQ6YrF9o8BBIgBs3kJ8+82qkYw3CjrNXeiEScGC2FZh6DHAego8NIY0Ei5zmuznOklLpYzKhW84yWBupqez3IGqDmKSc1M6XnKK+9EUjhOMJ53vb6vEbNcIngqPPplpWqr0qVDPZl2sdJ91INUg17Es3MG9ONRcQe0TMo592g1isn0yIt/1HVY5mcIlpr8pqjsnQjypJQ7+dRBsvRUlJMejM9wnk+TKTmIMSIYZ4fcftQwyFOrSQScQdSM7l/nPrWphGkycgrnD0DiBpSpdPmNfupGlnuYJaOpNox7s3f8IkpeaZqG/Pe9T2Z3Q96vFlTaWdOWCutz4nQ4Ov19Xo9rlIhreotko5RRau8flQhDfheL6/z06zauetqVREjzJrB6LZnZ32aSZ2ytSKviJuz3tdrHZIl7/XVDirZlVvLmazevmvpjGtmqRWhmKumNH04nazSZTlfn/YWW/Npx3IykMLxhdtTSsHrr/HipK7Wr5y9jaG+DYWNUV7P8pO6Yb92xb8rLVLsDYXrRmbvVWC6qH8FM8onEiirOM0dzaOeNTnaNDp9u4wxqgofKerM/7VeU4yupN5VxWdztSlsBlC7kLxkmnuaKuwsV7LKhwX/VhVW44sXTodE0usleWcP7D6T/pmQ5yzVSludlzP+sZLL/z+ZswLvoM26U6wuoB2x7LRfl/6j1Cv5j073l+6/SlKqd/qx6Ju6GkqwOxzOnhEy56yp9KfoPhryff/DHYQGDivNH/SvIN/8fJlXexK5EvNOzulT83hw/OoTWmLqWS0v+0o8e3dg3lmpslT/so1optLJsjHEZ7VXnMx+ZTp7WeH7FOzmz6XmWO+knHfKY1K/5DOfZHaysyS1eMYeoiwVyXz7l21EBeyEcm1EBc1/nk2tkPOwZyPKbmceO26nuPXHsxGl3vNZf9O2lT6pXlPbiIqbi2ayrupfhIZUa9lCdN7UByU6FUZodQGxW6cMiZR0tDxWgE6wDW1WZ7ysGeY4VsS+9K53ZLoV2aSh02mH+5jaeUcxX1iZ1VaYZ3N+Y8z6tSiZOaOmaqntiF8Efq+IZ1ai/FeB4mxCysLtZORinnf9s5b3W45hH5zMlWuprSXuwAwzWD2D0OC1Na3zcchkJKhValaMq/l/RD7v+mzLySl1M0SV9DdaoL+2qHsPdVE3IJqn4/C1RH3Po41wPcrdqUPL4DuHyvWZq5oqaC5y5dhVYD5yXwjf1F+QfkuXQqqExci3Dk/vL0q9i/+qlNTflXKZ3t+WsiVxGS3HfYVO342cpGsT2Kjfe7L8U36bjanmqH9r4LnUNU+32nM9oFq7WrwvQf0zrl79Zazn+GqCS7XDcz2qRd61FO9LVctrp9WLbrgNcF36vlHJbpOvHS2qL8epM+1zgzoHd6A/OnLyq9RcDxdWjmXfrn0p/WxKa3EqRSdKuVbJqRk9fl26HC5hOVimHCmI1qj7Crhlmu/QWtxZM1bi/l2dvkLnlEqXfc1V9fRbAFZk+WUszO0+V2mUZGXahcG12qn/4wL1z3bL0o6UFrbpNqRcWH17ztOSSviUT9uXFXA3wnXo+/VKdnPRjjJVa673ArgQRkwt/CLqf02og5uLXmpEeDPizkMNOzGeroP06iHn2+HbBfdtaMWddA00bSvadS/dBxlvo1704QP0EGS/kx6ldbSLHqfbaC/cHbQPbgPth9tIz8F10fNw3XSAfoG8fgV3P/XRAHL5A/2RdtOHdI720CcURYoL9Bk9SzGapJ9jFvk70lyGO/g/Q5IxBAAAeNqtlEtrU1EUhb+TVzVtbawxlqASpUqRUrQUqSLBalqkpg9iKFJKaUjVgaGRNKKCKIjOOnDgzAeCDsUf4Fz0Bzjyd3Qo1HXuPem1RUrShM3di3vPXmvvfe45GwPEec1vIrmpfJF0+UmtwvC92p37ZCul+hrzRBTD1paHhhDhpr4MEZtYnMwwdH2iaH3B+pm5vHxhbka+WLgpv1unXKrUSd+tlcpkqrXVNbLrDx+sk/Mi+uR7tzNGidHFAQ6qg256tGJjDnkeDjPIMFfEzFNkiVUq1HnKSzZ4wzs+88WLM+o+JozygU0zbV6Yb967MX98DJ11uOBww+FPH8NxhwWHHx1u+hiZdfjV4S8fozGHI34d0WX11aPOnvGIx/oW5igpjgltlf3CAcb0P+yb4YiiI67rPlmIJCcUc0rWu+eazw5v61ltOqZqdRJaSzHalGaD5zMsl5Z4hrSepJ6L3j4m2uyjsduGEae3dxU4RlIr57WfzXECXko4qtovt8AM2AOKHmNc5/xqi/xAI62zb/NnucbUPlQCpeM60X4tOW7o3u1PK9A7qfvdqGuaWQptKAaqGc2MoMZ5TYfbbeoG2qc1jf6td4FFljugHmQY1LTbWfsSK5puncnh5zGcc5OUJk7//29gpGlmv8ub8Cb7JLe8+W6joSqL81zW7cWndsXb+qKc0Z7DK95K7z2fuMB32Tg/ZJcUEddTlYbT/wutbmRzAHjaY2Bh4mL8wsDKwMLUxRTBwMDgDaEZ4xiMGG24OJi4WZlZGRiYGFgaGJjeOzAs+A1UowDEDAGRQcGMBxh4fzMxC/7XZGBgkWLiUGBgnA+SYxJk2gxWxw0AkX0NwgAAAHjaY2BgYGaAYBkGRgYQeAPkMYL5LAwXgLQBgwKQJQBk8TLUMfQxzGP4zxjMWMF0jOmOApeCiIKUgpyCkoKagr6ClUK8whpFJdU/v5n+/webxQvUC9KxgDEIqoNBQUBBQkEGqsMSroMRqIPx/7f/T/5f/X/s/9H/xf/9/zH9ffvg1IOjDw49OPhg34PdDzY/WPWg7YHV/aO33rC+gLqWJMDIxgDXxsgE9TeKAgYGFlY2dg5OLm4eXj5+AUEhYRFRMXEJSSlpGVk5eQVFJWUVVTV1DU0tbR1dPX0DQyNjE1MzcwtLK2sbWzt7B0cnZxdXN3cPTy9vH18//4DAoOCQ0LDwiMio6JjYuPiExCSGzq6evmmzFy5bunzlilVr1q1dv2HTxs1btu3YvnP3rv37DhxkKE3PyHlQvaQ473llLkP3XIYyBoasKrDr8usZVu9tSSsEsQsaHqa2dsw6euzGzbv3bt3ew3DkOMOzx09evmKouXOfob2/bULvpMlTJs6YyTB9/oJ5DCdOlgA11QIxAFPqkZQAAAACEQKzAGIAmwBTAFgAWwBcAGkAfQBNAIUAgABzAHkAbwCFAIsAogBgAHEARwBCAD8AIQJ5AAB42l1Ru05bQRDdDQ8DgcTYIDnaFLOZkMZ7oQUJxNWNYmQ7heUIaTdykYtxAR9AgUQN2q8ZoKGkSJsGIRdIfEI+IRIza4iiNDs7s3POmTNLypGqd+lrz1PnJJDC3QbNNv1OSLWzAPek6+uNjLSDB1psZvTKdfv+Cwab0ZQ7agDlPW8pDxlNO4FatKf+0fwKhvv8H/M7GLQ00/TUOgnpIQTmm3FLg+8ZzbrLD/qC1eFiMDCkmKbiLj+mUv63NOdqy7C1kdG8gzMR+ck0QFNrbQSa/tQh1fNxFEuQy6axNpiYsv4kE8GFyXRVU7XM+NrBXbKz6GCDKs2BB9jDVnkMHg4PJhTStyTKLA0R9mKrxAgRkxwKOeXcyf6kQPlIEsa8SUo744a1BsaR18CgNk+z/zybTW1vHcL4WRzBd78ZSzr4yIbaGBFiO2IpgAlEQkZV+YYaz70sBuRS+89AlIDl8Y9/nQi07thEPJe1dQ4xVgh6ftvc8suKu1a5zotCd2+qaqjSKc37Xs6+xwOeHgvDQWPBm8/7/kqB+jwsrjRoDgRDejd6/6K16oirvBc+sifTv7FaAAAAAAAAAf//AAJ42tV9B3gb55Xg/DPodQaV6ARAEiQhEiRAEoQaJYoU1UVJlKzerRIXVcuWZclUt2XHTtzt1PUlm43XvsyAlO14k9hpm+LdzWWT1SXZ9HZLO3HieHO5OCZ47/3/DABSlJzLlf3OMtoAnHnv/e9//b3heC7OcaSZf4oTOCPXqhAuM7to1AV+nVUM+u/PLgo8vOUUAQ/r8XDRaAi+M7tI8HhOikupnJSME/O/feUr/FPje+L8eo7juczEm9w3+RHOzNm59VzRxHFpRdCNFS08lyayIyNzVxS9ewwfI3Y9Z0orNnFMtokjIZvVkVYsrjHZklGsrjHFSeA7u+QaEYwmvs5f4BSLILlkW6GtPd/RlfV5PYZEgzsnJDOZPvzfesl5U28ik0nE29r4h0rzOQ7hWUQ+Rs4CPIjjOq4IR9KyLjcq6DiTLi0bsvSI+pHIpowsXBnlRc4NX/KiwjnHZC6D74wkPWpgxw2iooPjuoxiJmmurd0NdMDHohMbP3JiIz9SepM4S2/CeYMAQASuHeJiZBNXhI/potcXyOVyRSNctWiy2vC9nnDpEYPZYq/z5xSdYWxEEKOxOn92lCNBvT09wkvhCH7FwVcef00IviJybUY2XlFM4ljRaLKkR+YZdeb0SMBkBIIGgaDBjBKAF5OoWAkl8YjXZoXvfHDQl1G88HdeH/6d121OK3GSlruCL/Xc/IebOW/a8lLP0T98At/IQXGEDxrd6RGBPhvwWQ6II+aACd74xBGLzwpvvOKI3WuDH4j0WaLPHnzG3/jpb+CvauhfwTlD2nnC2nki+JuRqPbLGB4X5om8gHQRJUQ7HInGWqf8J88LwgLkO3P5JDxyRvrwJukjmYdHD4GvgivDC1d5bvLeBo++wdDC1fB61HOT5/Yj4aMfWP+NDU/Afxu+sf4D8N/6b3CEq53YyTuFtVyKe4QrJmHV5IacIghjsiCO1us4sy5ddCIfuXKK3zQm+8VRiR4d8dZLJuCixoxsu6IEbbAMolIPtHVmlTogvJSV60TFAAtSaxtTmuA1aJNcioUUCkpdPXC6WfDDSheUWoPkKnq80UIBuN4P3yjEVijITkn2APf3EF8u29XZ0ZBqJZ0dXYC91+c3NiQTBq/H548S2BhGb7KzobZv8fau/q5l+3dtW7lrz/IF81a2z+pes333ni27TyxbsSDfNiPvj+9evGi748nHLAsWdaVT9a3B2J51a261P/aIjdNz8yZ+KPTxX4e9LHFeLsbVc09zxSju6IR+DOQDvBH1Y6P1gahgTyv18NZmpm9t+jEiN2RkcmXUwvaMRVQck3aQDz7Vsk+1opKETyH6SUkBWRwWwF9weQF/2SDJJqCID4hQAwSRk5Li9iBd6hNwKOQD2olAxSJHDPDztnZXR1eOCYe8J5ft7Egm3MRPKhIj74GDiXnbly7Zvu0xfvHAwGIL+caaUtub2x/btu2x7bve9z7yhQ/v3LFycIe8fcf28Y/wn86ND3xp5Q48sgP+345yReD6Jt7k/53/Ahfm6rg27jhX9OPuxi2u1ApjRTMSp9UAZGinIi8CzBAR5fraK5JiAOFhyCj1TjykpHF/OseULLxGYN1loaCkYclHzcHapBO4QbZJcgLwrfXDlzUFuVW6zBls3mQjfEdFYZ6yAUPa6O/K++E5mTIkEVfglHzK4Aa+mAs/Qh7p61mQz+zbsfnAwt4PJH0H67v/6qNLt9x58NT5OYVlhdEBd7wh3dxc19BYnL053bG4ZWDz+v5ZQ82Pzt8aP7T6oQWr9+3Iduf+c5bEwm3JUGc82dSE9CAoZ7kvUjnbxU2WqTpKAALYEnFUYEsuAG9o0lXRl6XoIiY+8Xzhif2kWVjNOTk3R2QReUkxw66R6I9dHXP5vN9BRGD8Vj4cmtOVWbW4t3fxqkzXHGJ69oFTa3rye79S+ulX93T3DJ3C84XgfE3V5xOuKNby+YA6YkMqHxU8Dt4Y0s4UwvNu2/NVEv3K3nzPmlMPwImHehi+ItlEnuF/wTk4zp33p3LGvN/oN6aMqbyYOOc+4j6feGDvlsX9W3fzdTfNfujhOTeF9vUPn+69Gf92GXeA/Iw3clZuNYfqxZhTCEgXPSgjgjKZs5jTRcLhWyKYgYS2jGy5IvNZxQxSRJctmi34ndkIP7OY8a2FAyluZ3TszIFAAAEIImDZo7c8+ugtxHTjU0/d+OSTFO7GiSHum9zDcO0UXnvUoOOMOnYJoIgJNDOcRjEJKHOssM2ANvmGTrZ7nKSxKQGaNtD77LM16URrJhGb9Qics4MYyC5yM6x9As+pEPMYPnDpFQ52tuDGa2jr3Bn3dpAMMezZg/BQewHgMXNNVdaC9oaAMVBlMaAy46rVv6r6NbUP51s/8QiRhVaAhfO7/cL6124dWy0MB965G3iyEfasGfasEeTZKq5oxItYBU2SCXA1F+Mz+5hspgJL0dvHFDe8mgkQhDeCsNE74J1gQAkkWkFmEx2npzuxSwSoREPCJaJ4FmGvNd75qxMnfmXq6i50dRW6nyWbX/q70l9/hvy+9G93nSDBO+l65MBGsMC+sXC9XNGAEBlR0WTBzEKDyZqRTVcUwQ5AUjUv6GHNTQK+NRlgzW0Am2ACwUBwqdz5nJTzxjtzkjH3o0MXS2v+5nE+fc+4vGsX+cdNjG9hu5L/ATTwABcWrXg9E1CARwq4BLAvrDxqMG9GdgLVbWNFpx6v5bTCtUBkc4rJSm0w2SMpeieIY5dL5gB5tyZ/4sZ4pypqjE0bLu674+xHSLujtGT0ZKF18Ux+9cFb16564aEbtyof68vkFzGYvBNvkncApjpuE9O3qGyLPoRJEsZGLeakD5SKxTQ24k76ELz6jGy4gkpUdqBADcAiNSBwZsq2tbBK7iS8cwTgnU8CgKvVZprkmfoECFMa2F6qNpMJ79KZG+cMDM90NGXn97Qvn79gy/DeE0sLvesfOPLQUN+CnvzhzZ3Zlo65i264ccncdXad8YZlG48jDnWwjshbDu4AV7SjLkCajnI6O29Pyyaw3mBZLdmijm5rnQG3tTMj26/Atgczd0w2Zos2O35nw91vt+FbO2xrsI0Vg0g1hoiqgqkITtFxdNXR+gE+B8NH3fN1X7752cccB5YvP/nUDeSbTaVdzz2386mnKJ0bgP8J8FqAO8MVazQ625DOTqCzy1RjAzq7TLD/XJTDrAhlMCNbryiic6woWvGoaAegRGbHeEGChuAVd4JCLFRdjwgmVw3qLa9LdgCgQo2EPCKbJIV4GceIVcsBq5CUgGu86lKA2lrROTh74EBrejO531kqtXXfcODBw5dW9/cum3vGT/Zve853x41774H93AT4WIDmfq6WO8IV3YhRUNvPwNaj9pgbzRE7cI7BLSDnxKk4qQHOsWblGlGJIPDAPgnUvgDoiEmwuxF4EfS0Hjd5LAiocSJwksENiFgLbL/pkelR6zLLy1iGvpXPa4g1PXZu3dxcumP+av28zUO3nN0zb8fMyDnhcK5jy2KSL343vSpyx4Hlt91y030dm45k/nmw9z62H2ZPvEV+D+tkAHkKDAO8hMIAOYjIxoxiQlYnHOUDJk9Jiswmny797jgx8IO7Now/Wc93gwSsBfqIQB83FwFpfxtXlJBCfqAQuh9Kg3GM2qpAEA8woEeUo7ibVN8m6sRDSgDNMfg2iV9ZnMxsjerg4jzaYqOSzx82IsEsKBY4pQGslMuczuIIx1X7hKoPSh2jur5gljD71QDv/PguYag9t//spm0nD91/4bajp8/MOTynb+0az6yeJbmtuRePzpp189D2zWu2zl1wfN3RQ5uys2ZnujqjrX+Y0eVrH2jKtgEv1E38ku4/NxdFKUJZIAxbzpxBwSFLGTTViRyrQpfiZgAOroVXD9BTMSMHB6SiINmY6Q2yQ7Gj6R0GduAK2ppTkZGqy6cSyYqZRa2ruvv2Hhn+/DdDRB8jhHRuXXvoNMi9TG52bg757t4zj97x999p37zgJbLorj1985fv2rqw7DOTt0EHurmWihYEbaTYUQd6EGgQHqgC0ZdATeidogmlqTpxsmYk98YzmXgCVCTVg0P0elaw6ps5OL3ixMv40ASQbVm0AsBXUfzXMQSE8uU0k2CAXbDKMuDXla9JuD5uP3kduBJUnLuz3m8nxj5yYkbpS2T2DOK9/dkt953fSf31ZdzT5OfkW9RfD2rWBPKjHg0Kk+Zz54Hr6+GxjDxR2keeeHrv3q/v3TvlOvkWktd79X1kdulLM8iJ0vmvXbx327O3P0uvEwGd83XglyBI7gOq1onqVE1YYx4bCSZ5VdWEQNVgtKI2ZKKmOjosXrQNbFTt0CDFZb4mEk0kcSPUSrKbCj8zcFAwCq6J2YvsJNdICqcvVJSlQ4iQZGfHXB3TRe4ySSMbz+6+ub6zs/6OQH26PtDS1F8IMuryG/dt7ZvRm6rvTAZjqZ76ZLDeF6/vLTVqBhDFbeZEg/AFwC3DdXOPq3shAXuhJaM0CshWsjWnZPXgfmTlfEapQW+tQDcG+iT1DLs2x5jcJiod8DYE6ickKjHkB5AAM+G1ow1wFmoSjS0uxDkkKU4HoBhzFa3Nabp3XI0gI5oLSj4ruZ43cU5vrN6BP62R5CCVC1wuG+WZQEglHQReqJzwS9RtU91Z2Fd++EVdPRzMd8LBmUT/Lzf+9XsKB3Z29xp10kDnDZuO71832L3lI0988sXnP7F9Z+0tx749wZH9y2ZGIuH3vPkqMcy/5YEVF56dnWrqvOPGk+9Nl/5tzffu/8irH//rLyY3N7391Xt637Bz/MSfgHCrQeaiVb4UPBj0+oUcFbyjBhNHQI0YUP7aKJ2MLlDYoqJD68vFTGadEbQHT0xmGqoiqCMsgGfSnXMnU0kjBqr0//qfvvvAjP82o//yeh0/Mr78ox8lOjKf+ZNDcP1+uL4bODLB7VW1mUezzWD5RkNBN9gSSgjlWJLJMdBjoSyKMtyrDgAqhmLaCIxZBwf8Mdi8VguuRtAjoTbGhbLAbpYTLtkI0IG5yBaBGUAOPplC4qdJp2oqDX2rc/2S5kVtc29oGdzSvXHzheGd6wv5Y0ApKTXQPmuZVWdbvqx71Qz3rn0HN2eyG6n+agO9kwP+83L9Kh4Os6aVzWVV7KMoYKTPjwrNgdpVQgOiyFlB3U6vZyss0dD2zJnbb+ibNbBsy8Zlyxf2rB+++DGy6W9eXrwye/LcmVMzB4c+h3sB6bod6OrgamA3FB0cM3bUfY4rGqBwOIGUTlFxIY8DSEEEqcYJAJg0Mgm4Yxl9WnmgjFLYsrWnMdWzcWNn94KXooVZjQv4EbFlyV1rVp9c1uba9fbSG9vclB4AAxkDGKzcAOMsMFTHmE7XwbrqGXvpK+wFji5186itaAYrDHw/5u+pTl4OLKYkNfji3iHyfkfpBz8gIj+y8/M7X93Fla/5fRqHnceuWbmeSU+vZxLK7tXk6/Fm1blU3a3yxaQhco/z37/9bbjQN3aWflxe6xWw1gHuMIuBKI5qC8wFtqmduRYGP132oLbsslWkFq0XnBvRSy1LjEVq5iR4OX6Uml7NEDP40RCzXpcxOmF9JMocL1w4t37R3FWr96xaMy9zq/2dm+954INk4zOfW72k+9SFS3eGijtLct+ny7Til9H16VF3vpHtfFmfGxUslFqCubw6VqAWn0XwwRIDutH9pq0L+5eEf0Pn3zh//g1+pPQ68Y4vJ52lV9Vrcd+lcZJ41bpoURIBzoQPfflsQ+dRUlA4J34/sZv7KYWzBuxC+mfMbTeUATCC7wV/hWEM67zG89FZvZmZgYX9/OLx4sz1M+tFTtsTBygMZi6pYmwqY6wxBcJhLcMRIjmBJIfO63/z4G8I/yEEihwivaWvlC6U+e3XcE69hhdSTMXNUD6fsXy+uHHoPPE44TyfpjGRVoDpV/D3fu7Dk9dA4fU5gKmGnsNvx3Ar0l0xgtUeYHHrL7h/8x0aruZbHbLwiiJ5/iiLr7w01/vbI3hYL+vhuO4VxWH8o+x8hbss6BxOUWIRZPICL+j0lc80pkwUP/OuFCOymqGg2tt2lAVu9i8pgL7KJwX4h6at0Jp/5pTu+LNdp30Gohu++4JOp/fA4kfIz4BSm/b0hL0lPxmr75i1oqSoPDcI+Dq51Sq+ZnUFjDkan0KZ5KQyyaDqXQlenWimWm3U0VJ4NFdNLrAVCyqEimAtMHnlzjUgI1DopKFPjuncx5/7pQ4gGv/25k+QpvHlfPPuj5S+S/kB9/AF2MNW0D59HIiB6l3sFjQLVLG5MFND4TC4qAmqSBjANgt4fTcGRqYYyWgci6hKxNq2v7p030fxcd9HV64qvUI2PPPyZ57FR2n8xL1E0Piym8ZCXBgN4TQvGsXHqNnKofYzIzhuCo6FeXEWkaaK9ACRB6W2y6pKB5TaCESaeCVNnX3tnofff2pwee/C+xfzI7feetuhN8nQ7IETnEqH0/zfAR0kkGZruaJT08CUDgG8MBNeLqCDi+lcpANKLL8LE1VmpwlNHINEXSEPqA9QeNSlmEIYox/EViuZSp6Hya0bVs88ufG+D1UT6fuDurk3zSy8+JxGKY1WW4BWNs6D/o62hym5AOZRq52Sy4pQe9nqAbnsWVxAlLo6ANyHopZmIIwApE6iFqsdyWfEAI+sY0SsRfsA+D0ZINQyAzL+E3Gv6Xv5iY8PrDo9v285P/Lqou2+0hXiBVl39Gh3DvjbATwlAS3jqBdqNXngVMEbcdU6URkkaKbE76K7Gvk8AmAlkZ5aYgSIeRno6gnWImUjrqLkClH7UqhlYQWXNEJsLG3i9FAT4qoMSZWO8KtxHsfA8hsLA4UVB3dc2HvvpgUL1rbPzq/du+f+4x8aXDHQ1Z5uDyS2r1i3f+2y2elUQzoU37px2zEq52xAdwe1E2eyeJ3qm5sxaEcTiAYWONMbUKXpQZkWDTSGZiDmtJYx7ASNCirCxvOOkfP8kv37x5/nl9DzLwG6AUE5kcur1opBlaMgIAj4saoolQUmBjGG7VIdNQy3gGWN8h/wp3oAd+CS87PnnTx/8cTJcz8n3yh1LV70fvL1UvstF87h9QAFfinFZw6LiGopUooLBu5dGLinpi46PGbkHQyGGoy4CpyRRgIwfI//hKThgUd1j1/81odB0Hyd70LNRQAXTshTWfci21VFi9WBmU+81IhOjzZzWegRG70e4mZmQg9F/NxvvvU5KuJ1TMTbjX/Uy45XXvp86q3X6HErHLe9AjY6HNe/8lJP8vfn8LhDNomy8RW9bBZlyysCNyoYjDY7k/zzLCD5DUaL1WZ3TEopMmHvRPSck9BjKOI/8dw63cH7b9Vtu+vUc/t0N30C0P0CP3f8S/xskKy+8dfoWuJGnQ1427mGiozHHSobcpgLR7nFKTzKbR2V2+1uIefP5XMC7jbh1b97+Hbdyfe+/K2HHtDdRw6QvtdfL32xdIn4Sq8xe6AE559HbbwsixpU1s5C48ZGpsKpFlMEni6YScVIYNgAF/IPvU/3vvt/BIZG6YtkTmlN6W2ip/DXwNO/0/O3qjrdCLyIhgczhzBRjxgYVWWpE6iyBKHRSeIYlooba0hf6QfkRRBlCxw3kl/s31OK3azajfeQqNABfNfJYVALrF/08nlhTGW8UaMbc6qY9dA7xzCHYKYJe3UL+SU0SHPetjduu+0O4dnd46Fd9LxV8X933m1cf+trBwRv4J3hIHyXgmt66TXn0mtiSFbIoE1Mr2m8Alt41KBeSGQpK9jPogaKUYs++EGxdsIjddttb7zh5X+5650hGsfmnbwgLIE9Fad5HSE3StT0yqSwHSonsKfALzR6P3v0s8N3HOWdZFbpy1euMHvUPrGT/Gnia4CDn0MAQbjgg+ZTmGXoj3vjdvJGyZXfi7kt/hRJCPMw4oe/x4tay5m3Ud6NeTgt+5L3G0Oz/iHFf3/3cC/qkRiNvddyIa6OO8UVA8il3pwSNY3JnmzRTlQ7XkgE7GgFW8doSAT2aRjkQljE2BmawJKTxULCyMzUw6yViiZ7AC14wBhd4miAvpETkiKBMmShJQt4erJdkq0slTmLVMXlI8SDeW01k0mt+4Qhdub4/PbuOctjuzbccqPkCa8L598zuPXe5XMbWxbNfXxoUzTbGFpfv2nDzyJh01pTz+JNqwfnv6eV6cyVIFvr+bdgP/q57ap9YeFY7odWYSheZAVmamLQE3jP7hiTHcwvxN3EwqEsBeKSFD11rkWOHfBKqDj1LC6bk/ISYEFFcMqIMWGG2srh7vV/f/DGdR0GZ93sg7nc7Fb+F47ST5eWXjv5wQUdlwov7lg3AGuahnX5JqyLG+Uyjdva0IdW10OzyMAEopFAxSZRiSWbwHs2OJDqwlQXyevRPOf0+WO7Fs3MdR+/oyM/a9mW4+eI4eSH5q5IXX6uaWjOY4xWLUArA9AK/eY9zCYs2jhmizEw/Fc5zwAJZjOMdhocMTto9DWILh5aQgJarWZJtmBwyEzDI7JfQhU+CVTJL1UnrzHm03J018rc8CFTfvvuGy90dsydkZp5mJjv+kAXMTvGQz0rHj27c+3Ctzop3Ei3CaCbC9b4Jq4olnN8CLLPODbqNovokbr15ZVG79edxYyfBy065lcoHjNadFbRxyw6YGYHtTusIoukACb2guyeavIa4+UART4HsKfvPnDLcaE06ji6YE5+6Ka7zp77Jr97BzGd+NADJy3ND7Yv73/ib98P622Fjf9xoLcXLV8PtSsAYtmZA4lNK0esGRaA8mVkD80Fu4HMjiwLnlhBI4P1xoolWA64YvZESI5aG9Y1OzYs6q9raWmqPeU4OEwub565dEtsnSeR6t5cWkouU/q5Jhr4Wn4T1wb2zWcAEiRbt2Gs6ENoWkBYGkEDtNAcFianQAU0gBSNZZQOJOisjCxdUdoBsjYMRBFggXaR5Q7sIpifGSUp4iGlC2UF1kHgV81A8tlwoJ0xsdKVlFzzzGaLLuZJteS6cQHCkhzACjAdCyrGGjAwnwSG6pAUZxxeu11KWCrQvKQ/iAviz3l8qrmKkUU1C4Er42WeSQrtwVlE81M63SwrAQRzHZmz4EJTx9LFg93r7t58z4FE9sYNR3bEk2I807Hz5gfvHD70VHZ92+YZ2Y50vD8W724rNGT33bBr1h6XLrVlxW6TCC7XqoFV69asIk9m8l3tu/NMrq+Ep3H+TbCHeisWO5U7dlxZZtuJVO5ggg1NLZOdmXdmkeoNTtHbpUnyxQsLS+WKtHJ4wab3DccS+S7+5/bSz5d+qHSSHEsll5Qu4brOguv9QAjRurwFHBV7RSuuqSnDEu0Omvo2uMfwMWI3EFNasdhpNZ7dzqrx7BZ0aASaDGBlNkg5AezMWS11ydbWZF14mH+ud8aM3pbxYV4a/w3HT/x0IqVe183luKIOL1mV18DghX1sJCBg8Z/I8hrA57i6LnodLaBhMFauGJ3ZNrxhV1q95l3BeYvJa6Xo4VuahAv04lTW09q7t2iMo3YytcsBDnslwJGX3PkcODkrh/UjF4uffxhk8ridxH87VvoOW7sBkCtROJ+Nm8GoxxIS9vKZsFpA4KhYg1WyqJHDPJy5LHcHhiOSPdwyY9aCu/k9jvEHmvQbXQOMLwQbyKwwSixqZ9k8YB2jAKAAg9mI7idIASJHmPKFC/IiVcBIMDWfZafJiDElipuLZ6VEmNdCrWRn3h0JoCQ2qkECP8qISUxUZqYD5gXrd0YXrr9/OBjLtw6Hot2tvNS7atUqZKvDzXWLS/eSo01JeKnm7Vrg7RVVESUNgykMTmGfwuEiAxjlKvI5qfB5bjKIAFr/DpXRAaJqNmfyH9a9lrOAF79CjWXYNfmv1XioQTwrq/HA6BnWeFg5JkQdEsJhwAUE3W6/OqqhFpGBcL9w9Laz5147d+GXh48S86knHx8+/fijZ1944XnN3mgAe6OW2hv7uYqpUSEL2BtgKGqKyM4kOhLHPtnksKvEKZscFhaOkkWJGh50iYlECeZnBGOGh1eqGB4HjXM2//2BnUPtdXMOoN3xPf71+YNodsz8A1mXf37n2gGq9xtA79eC3vdjXoyqfAlgNiDMTIkCzKYyzKrqh5UEHYqLiTWnar1CgPpwmuo3sIW1mRiVJbQEZB/14elXmgGQz0kpqWLzMf2/vsN4YLhz055dF/b3pFX1P6993OsgfP8j557vB+1POHQ2L/IxoHc55l2mtMUyppUfozjjHapI49VyCkpQU5mI2uYwUpZbfsiW3hKp8dX418V4afdh412Gs6WfUL53glz4MtCrltvHFWNaTYWDaJGzOK2e8AFdfCzCEbaxagOflTpNLL7hcAdiVM25iqIUZPGNGItvuKURYpXC+K1jcuVEQ6ph+uCGs7dvaTqXWf7U0e03reia3Z9qyQysXnNm2/DsxZ3JSDzuSd3et757sClSE4p4/YsWDm5ge9gMuJziH+U8GAcv25zUDtGDHWLEIhUaTXKzYjQ7Zg1YWZBmf3IS2EbMAMl70ezQ8jUNnZJ51fBpx5FQJBpv6Vz5UfL8ptuc5zaVXk8lPGsayaeIV4t/kN/xEsiRIcZ9LAxnULdNdRDEXgmC2OlmppXkmUo4xElrJ+2YO7Cp0VstOIKv1MxcMlyT6MkMHzDO3v3QQ+Tu0vvrm3rJifHf9K5iNOHh6Q8AjxHj2iw+QsrxEeoOXh0D4S8d0h05+6nHeKm0iXwc1KAaN/oenMfJ3a9GFjEEQk9W1OlNuRwLgIDTXh31OPm71mmjHovemjcp6mGkUQ+BGxEMLLpBXsDYRnVkA+MaZpOqn64Z17CdHtBtPbtOt+zEkY+u1q35IKBwA/lkaQP5xPhvyMOlW2jc4U/w9HvAZXJcg1w7rpF0p2hcw0hToXr5ww+t191w3xPyIzfp3kP8b8vyfy/94h//kdF7ooHS2wEWqEZqtYiDFkzpaHQNQ5iwZ81szwLTVZHfQYypuSSf5O85qLvt3N/WnjkgLl/kSQMmy8jo+K933mraYsvPxGu54ekZuFZVfAPYDE0U3MTXj28kWXzDTbjXyMkJjujsm8mq3ZtLn9rN+EaaOEbqhIVcjNvKgZek1JjGtGIGwMaE2NRm5PAV3EFeMIRt2aI3TAvyA2BWm7JYk694wxJueVivGqClJ1xA+aSIaOeaXWAKUq3Ume2aQzq68l609FkmFz3nnLeVwPEGqTG0/WB7Q0NnZ0ND+8HtIdK8L5l+eUc/2Ryuk5f02XS2viVyXXgz6d/xcjpJYb848QQ3LjTR+EM5MwUCEx96LfoiXTy2T3j/Owfg93HAtUPDFVwB9FhqMoofcHVmFFHFVbgiW7PU6HdniwLFVYiZaXE84hoWqKHCKTWUbxBXv6SYMDLtdClWN7XpVVQ7GWrJTg1VFfV4FZ6NiHfrdDiq+LN16uJ+S94m9wEvtHMoPEDQjIgGGxi/PHOzmX9Nw+QcAKHwBrVQiNVxRAnIYmreYTjfYOzKb6mbm3H5I46lXVvVdyRyayQcCDbeEokEgyBRaFxN+BjwnQhXvTqyBoIAhRwKsusG10jen/cbk9UxttKp9rNn2i6t0mJtws3da9Z0H2f2COV3oZ5ed3qOv95Fk5MuWsX4pcezZ0633zeobQD+jfyWLflz7JqZibxa22TnFnLV3kZVI5CNNgJZQXyDl4vNKiGrBfwBu9YFZK3qAqJmgmqGYRBN6/5x7XORT6plMOOfIp8v9dD17ZvYScZ4mQtwtzO/WvbnaAGAx4kc6PGZmVkDokuxmsBOpDWOgs5cTlXbbdQcE0Ak+7JaB4MnS9M+1FOxOlFf0+SDqyBbpSJnltQIjIlZNZUWDTUIg/0ZraRv39YdA3ktEJMf2LltDzHc8qj0+KPWVhaNabE+8pj4IOLRDMT08F/gotwt6sphdRvJsvJNLJM1GjibnaJntI7J3uyIk7NhjiWGQhMlSsBOY3oBHWIY8APiuoDmyNMauIAOOyrCiA3V5w668HNhryWnBhS8Sa/H6I0bm7uDy5cf2n2qf1XT/I7mz3++QPqd29yF5UsXH7zhwLbZ3XP7Bxdv3xzT7UZesHGL+Dp+F625ugvsYWS7pFG1LdFkkv0ZJWpkIUbwDMPMw0HpIIlqfBEIfpnojaZAEC2iOHj7FhpivGyzO10eLy2+ifqBXzi3N4A/SYL9pHe6WImiYrIVqAWFEYFUnpp4wM0+D9bu00CdC62DLjSYbUPx2tU9a9sH+rND81YnkmvmDeX6FuaGtha6Oru7O7vuGepY2Nc5NG9tLDY0b03nPfnV89ZEo0Nk8bHe3mPzcc1AxPAZmtM+puY9tPYzyeXkYK0sOUWyouwf9froAWBCLxwwZal57byCNjUGIs3ZooPyq8MGEtOYLTodtCxbgk/eLItKOisxft9kgwRXixUH4zrCg1x6QPfe8y/efOnSpTMXL17cz4+U/itpKj2zaNmi06fhCcCs6AAjF+HUmDwqK1ACGIVHXVCOxEsC1QfHju0j+0uP8434DOfonyiS14Bnm7gs9yDHik5toBvCGSVuwsgCkXN0i6XhnDqMBGHGOy0qGdR9cMwrygE8XAeH68CfAMsI69GcOiy1ijVmcVHrpOdtRlc4nmrBTwFX0W3xUwM6jsozCqsuXdY5A7EW/DU4VNT7wF2Zn856VktUU/lKArFLrVFN9a/oPLRhz+rszEUNLa2LB5cs6zq69ebl7T0LG9tblq5acrR7b2zmXjJrRa553sJ1+WWpWDBaXxPsn7OkPT1/4Q3dg+lYMJasCS44sqQuWZeoa0jingjx95ILgof2JHRyaAIacqNWC5ejqQ+sPslhKJ81JuhdY7Keuc0OF3VaWSQGwyKJrnJ8JNQ0u7Fx9mhzJNbYGIvwxZmNjTObmugzrTVbyt3Cf4f/72r95/tBLtJ+HSs3S5cuRnFXBqxVXmoxRA3vzKjTyi0CsBozShLzAGmaXrCLnA0O2llLV5yJxzh1X1FYwnfKDIDXFZdcL5idgicQamikuzSJBYINBTkqzTMbsIaS84Xrac1wdflAV3k/CtWrpYVUlr587z2f/ew997684sGb3vPAA++5ad6OJQu70smG+pZVMxoaCwMrtxAFf3Hxs5996zuPPPKdx0oTG/e1dodmzjkWn5XdQ+mxHjbr7/i3QEdEwKI9wzo1lZAWNaizjo3W+oMC7E93TqmF/enKoiKzY8QzRRkYi6WjIvp1uEVEEFaNWCYNWnTEYg2G6mjao2iy04om0SV7tX4uLzKwIlbyIU410lCdCQHbRsuD0GpvLRey/sDejsbWTF9k7bJiLLg0kBvsW2UjD5R+ODuXTM1sJ5/uW+qpj/iXxx4upixLjLlZS0tnt20jn5uTWx6nMX4uzif5JGcA3czlO2kHk/rS8sKKs2dXFF7E5z8MfSf3T9/IXmEvtH/pKPk5OcDpwUZXjVqtc4nqTQM10wURLAuhrGCM5e6fZOcy8sQtxLznT48yG+wv7x/Sgf32Q34p/ybYF17w0BoxZu1WuTkO3NwICzhaY+U88D5IqiMCsIKjdvojME5HE+zntQmEtxaMAjkCMrhJa2G0sRZGlcPxUyKLTF4PB4LsQJDWVWgs3wzLXw8sP2qyu2MCrn9QUsJRtvoRXH0troSMIYYtVb2LNKjq8WlNKgYQsFksGQHfydvJyjO7PnDo4JNPHjx0w+F1aw8dWrvu8PZ1p+euWtYXCHXPDJDbf/zUUz9+kphvuP32G9bfccePSOiGgvfY/v0faqyj9A7xHyNz+IkKvY1j+Lg2vUMkwX9s0ybkmTx5hjwIe8XMebjF1J6zW2mlOk0N0kqTqp5PpIie9XXSYhMLCm6jSaACwIUkUCuiq9oztf1uyO+9tBf+3zYjnpgxIxGfwQ8u2bBxydKNm5Y2tbYOtrSo9eIc+TnvAFyc3A7VMiI0l4xFzphVBt2powUYOgeYPHpq/eiNyKcgbB1XUJlhbsKULdqpUrWzesuig3bjOICjZS6r9gnmcPtVN9hh+fmjBx555MCuXUTc/dRTuw8cYDzdDFbTDv5XQKU+Dq1aE6MSr1IJu6vEa3dXuaSi3ulBYcFP6a/KVfVXNc/duGDlyq0vWUvfv3VFrKa5jv9Piwc6cntXLFuwa0d9IDID+yhJF9kCcNRhfAotLiykAileDOMeSNJ1Q7Pfp2Z2sa9KZH1VowG2cmh3BdDrCUdoYCrJAlNmibVaSZgVcAcAVh/rT3bn/4xGq3ChMZtMLU5ZQ6FkbSjTnJ2/euHKxobGjk3Lt5LbO9KJ8Oz+YKAm0NBV6GmLtVsEQyFVWMqp/Iv57p4/O9/9D7N+wr9y966tNE49keJF8PnD3DbVH3CyODUYYzQUG6GaFoNLoSzGl8xVQXUBC198AZbH9BRkm0txSkgTGmUPo3c+YpB8AarF0C7y+H35LhpzQgGORe6phCHpi5CVwwnJn08NB46JRt/8RFeE8MT/Xf610is7JZNOmEWOlz58w3pnuKs+3Uh6B7ZQvJcB7BdpPUmfWtVvomaUGnaRLVdY0lUc5egOxhoEM4s66lm8EzgMV0tfjmfHJYz5G6VWsuzCCTLz8I7Dx4bJT7ccfeduq9D6zg+s5HVyhF47w70DftyHYN8nNC/u2g2a7qnNKGQ5bQXJZNj6TQjECz6oC/tfJcaCGEyzsNI+c7XI1VvTow7Gh5idxZCPIlCaC1Klr8xBIyK0isCvpdrzOY3XQvFoMp9utS5rzy6f0/OTHjHpFe/s07c3ZGdRePKwV2P8L1jdhiGD1RqgwNReZRpgFHTVLZZAsPwTg9s38Q/cUFpPFmTRhtiAgTGQi1aQQ174xCLndtaB5NKDLQt46se0snfRQRMgmHYwOGgFPK0iAE4rYMiXllTKBhdY9Yiq1zVtaSUzBrCdfcPhHTsPHdq56yCq/3/9zGd4966Td+3ec+LO0tC2bbz7ve+97yp930PA//Ea1ZeWM2dWvPDC0/D84otrvvFPue8MXcmyF8AtP/GscJ7/PfydBWykT7HeQdYaEXDWEGYXBajTWXQGNMdkxFBD1ILvMjFxQ9WAkSRmR/3sgCtb9Nfgn/i9IJ1r/Pi2BiUwTlVgXAAcElLXANQUbaQZNZktdmyOpy1atM3QGWCi0yCB1WFH0UnUsgK2YjgFoL7T7TdWWiXpIp4mjw2WbiKmE6v3DFrXZLPb+L1sVcefE+KN7/zoP88jNdHf7t69ZONGTqXFBZUWMe4cV/ThOrutrEZv1B7xYbU46MQRg4+iXzsFfayHAAOxGBQR1aCPjd+owi4oXQbsrLQNkVPcPlY1E5FGdaIQpFkCO21DJAZpKoJmMp2aqEYzcJXKmIwteWmKBkGcQ+r614F9lee+zxW7aOVMlTJxo1UVwAP5li4LMER7TskDQ+SyxZY84tmSMYNdkcTv6HaHba4pne7plA72WHUBo7RmRzvZgbZssbMLT9WZA0bp6sS3XU3AKJ3iaIYxSiajFICUXQ7JdTnckGpMo0uodGaATjOAlC15VjxQUWAjpDY9Q40MoHL7M3XXNKwUmqrO5q0pq7MHp3IYGbyWfit9+Wqeozk58l3yNhfk6rndHIZW3eYx1N1RHZuzgQLFRgUKbhRsVjPTZjV10gRmFFK0jwsQ19F0GxawuEbdNZFokjljbgyZGL0+pro65gpzSM7rceiqGm40qQ5vWyZ1p3UPrT+3++YPtfZh9C3T3UL70yLJVE8d9qcl6nrn79vK12stagLrtRJk2mvl5JZP7bayVbqtxOm6rSS12+oyT0wWm531W9nUeFW53woUv1DVcxWY/WrD5XLflbB818nekps2X2nwKCo8g9eEB+y4/12QqtvAoq/O+jGpgNRxcvemkkvtB1NhehpgcoCe3DQVJmeFRu7pAEJdaVRTmjrpBZ6YLTaHU0ReF1B6AHhOtVhaA0/I53CARTWErvsG72s/c6ahAmTT8ePda9ZQymkwPggwoud8fCqMwTLdfKwJV8zKbtjiciCHLdlEjk4HeWwq5BbRHWAutIAAA+RBamwpdrdaZFHGADeqFo6nXdnVyEhNq5O9VtFnX5geTPTa4I1YwSu1r8Xjr8Wn8XHATafidh5wc3E+sAsuTsXOXcZOysixcswmmKVV7aYrGKEZMTpMsA05F839IKIO1jYQge90Eb+JoYwF7w6T5CoSg7vA8h5eX4FWu/N6Dw1mETcNFlThWilGQCTzlY8avp7mSLSpaXbTBsAy3RyNNDfNblaxnRdpbIxEGxvHf0rm/0l9X8b5n1Wco9xT18ZZzIwGabwIFnHUSt9pzdXqeoLZNFrD5HKNqIThUyVSpK01Bp1rAPERA7G4WZlX0evD5j/QcSN6K+9hO4khr0SxFd9uKlTvqYpMoplXrOHqaEhoNEgMHFw0UOgeSAINWkMzQqEZKgU2tS9c2J5buHD8+2Q+yWQjkWyI5ism3oDN56O16m7uNLPiZC43uWHPIdrQ6JFy2CUzqjfZyu17LF2EqdvP/82bl2iKVmqVda2yBATx/tEh60TF5f2jHl5H9DqcccXJrlYyqtMDFcoTrRSdHhB2I5okboz7QcXAI652kbqIRH7rLP245Y8/b/1l6bnEG4WNfzdfz4/s/MLOV3fSltJeWl8t0B7MFHdHVQ9mPSpurRETh4TFrOV+zMbqxjwwSVQLjTb8x61YkWcSHG5PMFxXzyyTGHCsP1KHrZqGIE5geve2zbIKTZWt9FYypZFz8A5qpmcT0UR3OmO+5e5JXZ0r9A3UcA9TK36H90XWC0PGQJ+g9F71bh2W4rt1WKIsN2u2+JReSwIivNxvWfoU6BS16ZIqFO7/IizOd4Hl06BMNFhyoEkqsDwNsLjeHRb3u8HiKcPimgYWqjsq4NzNNIcGEVMbap8zwHQeYEKpesf1ocJICYhW5yTRel0oZU6UbZgywB4tc1nYUhFrxhwuRlWmAl9V11V5W8HlhCpIf1AWogwpTYpGNQmKNJcAvxpYf5Y3YdM79LQL0kSjokabljehFoqUkyTgog+fpww07lSbPVmuNvBnn8cN53EDB4TO08WvnGfi53CeJcAD6K80qRUsJm20kJFVkOMQIQtYL0We6AuUPJotAKcNs5XsOa8uYvncwsRP4NzLYS0tYKMEuM1snhBNSILTK/tzavYCfDxtiozDBuLGYa3oRAMoQic94FU76ay0jRGEvOLFhkJXDQOoSt1hvqnyMaauzpHzIXV9ygvzzg8R1PJHSlcnPO0C+e4C7tur1oe7BTX3HgHuI5yoA+FemwMHa0yOMp6TWMU1DnHLFt0Ssp27FtwQyY1vJayEdjNmszBmU9sxMRVFq6HKDeRpIvmpZ4E95MiAzoGi1ki+qfOz5xesvZG2kj/1FOlaR1KVfnLS9a0D92FL+ZfWaf1/g2B7OQGP01d1kIJWxjk+ck1WDqHFFc8pXrS4EtP1lSbVvtKi1SayiXuXeYurJoQDXGSTqyjoAoVJDaZKNETrUkCVwWtgmobTqy2xSgtq5io7bGpTapU1Rv1P2p9KZaqb82MP/TQdqjXTdagG1A7VEbPg8TGldf0m1R7iN05pVK2B7Tm1WfW3KOz/g+GKo/cwBa4rKPg1uJjcD2InK4XLq8EVRLhCFC43wOWmIRkKF1hpilttZqmRLpvtDtFFkxcG1g4X9E4fh2LSQpja6XsHEx3RyQ2//F3Mh9intrNq8D4I8EbAwz2iwlurwVsvUFPFQVuSZD/ycySnSKay7xt10exbUsUipabeEIskYOHw+CMaFph4q69VsVAkvzpQdhI2V/HuVYgdb1pdN89WzcIdU3C8s8zBpdUqnjoVT6b7oiCND6mYBjRMo0zlpcoqLwHip5l1voOgtPmxTMbFumXDDNuRekMYDsZctAmjHtDHgZIxF46dEdi+xcar6VatSqSqCFapvzKut6ny1Ucx/IoqYyuYPqxK11Ke4fkzTdoS8FoPkH8hr2FvCw0zqiMSN9122+KjRxfT5xePHl1y7NgS+lHd63cCjbrpHJQ4MbNZatgGA7JZDmUpnbAaFevh/VmaL8+oInrEJnEOsFNcdM7AiM2INUQqYVSxDJa53BAkiii1fo1TJLH1a0QxGPG90dD6NbTb5xx9I86GBvhbHbLvFSXuA3M99ApY8CN6yeBOvzSn69cr4RdWWRRHTKLRndaPOPGl8gX81IU/LcJz7aXaS0kD7O5CEX4ML9yIyeWLsxpNvcnp8vlD8UmjB2IeFLNoeyqBCOqQysrRWhVmPxtT+Ya8x+8GBnUDt0odKVixQLh+X9NDf3UpFMTXe2ff5/Q9fRIes3C59CfCp9e9/szLhpPhM0O//liB/FAYH9cR3ce7UJ/QvmOQZSLnwe6UqzuPvdN1Hvu0pgcJ4/AjDpfbw2q0rmpCRiul0oh8FITqlGZk/jvUgp4Ky8BfCEvR4aL5Mys6Uu8O0FmQplMB+hw1o8vwPA3w+HFq4tXw1EwHT0CFB6RMQaMObSazuhSPt3ANoKgkrcC1konQqaCNlu1pBtt5gC3ENXC7r4YOLa+63KiHCZRYVitZAGhHJAEFCrbfV+AeSVgxZkHbOzNKwsVKGcI4fMVhuAbU0xrQFSSWTjGgp2Lz6lWGNM96m4EHsG7wqu5mR7m72fmu3c0CrLPW4TyTOkmVLme+lS2xak/NUecpLK6azMJKQNSJCsJVExUU3p7NaqrdyGYqcIrHLpXnK3nLQyjKM5XOL77n4QeH1w7N77t3kB85fODgsSPHvz9n0d0sP/km38+/xbViNy6FwquONZTTGUWHSi9DL95qH5NbmdKzOah1gbMMXbCARlcEFrARjLzGjGIEA68Nvki2sjyCTbqs89YEa9O0GqpR7XMPcuzbtFQ0osVNQVeX0sF7PWi7VpVFtQqdHXN5Gh33SiuP3LR+f7wx3thdaDy4bkl+RjKZaq7r6KiL1cfq6jfznpuOru2t7YimPL5UXcuStrU74uvcTanaXKKuuy7REU4Hwk0nxn8JvEx7kYVWnJfONXLnK93IiandyA2VbuQmSo1aFx3LVlfpRsYKjFq0ai3WMAqCOmnEZA/gnAgZ4xbRGNWNCbUpueEvaUqmHtz1G5P3z3o19fK1m5P5u3ed7y3laYuyhn+Liv+5/9P4jyL+MUYAxR/9f4H+za/O+qH1OuhvObdrl4p+Gf96wD/Bpbl7KvjXT8W/qYL/DIp/EvBPimj6afi3INOzAqxwApFOSZeRANG4xgKxWsoC9SoNmv4yGjBH+fpkmAVSPHv6dPg6lFh39mz3li2ljsm0sAEtZnCd3McqtMhMpUVOowUK9hk5WloZZ7M8QfArzSgyuiiRWoBILaLSXiFSHojUohKJJsLapeeBSNE47GCVSnX1lEq5DGqyaeijxFM0HP8udJpiVL8bxeY2r0rOR8O6v3lVYr4tFDBch3br97WCsb0/M6MUUpv9dVX0SwIFu7i/qlCwYSoFm8sU7MzIiZzSZmGOf55SrQ6oFsGQUhze1ImoDlXygaEn5/CbVvimNaPkQP53Y7SUmm1YJtKKRX8NuP1ybAhCc8M1yHh98mk1nmWqVSrFrsFxoG6bZtczor2viVWCTku8rVgX2lgKI+XIj+iHCv0GgX71oIu6ucsV+jVOpd+MMv3qMqNZViSaz4zG1LQAGy3ZAL5KuAHsjdE2lgdoEFFGaaTswNwvq62jAybbwsB8gShGl+UOoGIjTenHcdsmKUPOaLwWQ+LESSUeLrwbS1ZuIlKmqkfrlpyeqgcXHh5YdHAgwMjaFfS1B/2+aal6f66/P5dduHD8fyBd+YZsqCMQVve1EOdruTqgagfOw8H7KSDToRNI762QMo1R2mJ+Acgr57KjGX8UKZzRj8kZURaQ5Wag7OtkQzttdGinDoiZzioZJ3WMMiJV+x77GO21ry/P5dChHkykcHtnXEVnbRPStU0qSgG83YTscRV92AKA028DmBMO1TfR32LBE2urs1xNWP/U4QeVoR0NSNj6HHbHxE7fqRH1jsb8rptuF0qj1tt7e/Lr9t/dM/fEuh33rFzYZKlZt5Ckv8m3d2x/fGhDbXsTUHb58veeCnnf17ayf/36TasHlzV2Nu1buJDW7qQnBDonox57p7XxGJgij1jL8QEcFGah80tHvZWbTNCOz2BBjkmY2bBJrpoQG+DqBW/ZgQTAgdD4C7DdOYNXS0FOO1Vj2sTGpDkbC9a151bM6WlntUjmzbuqhm50GRr02XotqbHT9QCbCUpnWYA9hNm4EHd06jSLoHFs1M+mWfixsihcjo376TSLGnWaRUQN3ONY2hrpsmAVPb4gi4cAKzhYz8TksRb+64y1YJn16UZbvAeMnS9fNd6C70Ub5x/fX41Ty/83ON0CFox0NU61aLhMxqkecApwUcxpTMYpAjgFGU5BfXkGNeIUpDiFVJxqtQQLLaYMSc8jVt6aCEMLrDeHzz8NXsHr4qXm9KdDbQ6zSrxXYxdgxsjXKX46FT8bjSbGuCbu0lQMo4BhiGEY0qPbgSn+pAULwrT4lVkdVYuyq4blZsIMb9kgyg2afo1nUFHQGFYcx7FbRSFaRw1U2sdrtrK295B0bZzLuhKRrjRFXIX+TKoi44j9JVVBTqZCnGnG4vt/oWpF9BPNIHScdL5UVV6GVOVl7FPzO2bYFR8c5l+FXTD+JJ2KgeexwHlE2Ad/3nkw52EBTgwO858EzqucZ+K7cJ4e4L1J+R1Sld+xv0t+J8W4YP4w/zRd9fHH1HMLE1fg3PNh3Y20U2SD6oWbUTd5sOhUcVpwVgmtaQR/3GofG9HT4AGdGZfBdpUROz3gYlN+FRNRb55BpzRqyTheWzEAhy8vWDNdn+XDNeri8M/QZRg/hfCpH7jyzAeH4AF50sidZHaKEgMt0JBRBBMWYOLgGYeh7CyFbbSvjHbh25mnFKaeEh3xIyekFwSzQZSsAVqT4MO2Pk5pwGHKPrQ3zBhP1RuYvWHCtvyi6HIXVHsDo3QNNDwHqgADdqpiUCvbOztSGFNOHx9a1SGEV8xf09veFlw3c6C/sGnN+YN7L54tZLtnC+nFmcJrN9+XJftm9qYG3Ob1YmDp7JlzvvTA3R+5cPuKlZs21MVnLuPUOSdkHNZI5OLoMU87eQOlaDyn+Ew4hKBcghOrJISmGcmBcQXawS3hdB2RjsQwu0b1bl+YupAmSQkEC5WBNIovrNYTXTWwY2oyyFg1wWPdVDt/8kgP/mOaaa/KWT4Cew/zjV68m5tZm06hBWm08tqqac443cOvTU41owXkkoo2h1BgBbYmGmj1SNNN+WAO7qRJH0dgM/9D9bQPvh+129PqzA8Nxpb/SBjvQEExCcYkaqupMNbTGSk1WFtmLk86nTLYy2Wjk069KoxYu+rCnQJymM1mHrHZBZEpqKIJi5XRbvRMD6jqKU+CdSGTPo5J4IaZ+vkIA1iD1wbwYmTguApvVIM3TivM5FAOW82Bh2U7cjiWJFcmpatbPqYiUqeNqqPEjkmjdrcvpOaIFBO9vVg8qmWJRJ/ESsursZnK01PWYNFUvjZOwjBa9lgvUCR1VTiiFZHk7qzO2hE2q5ymOXJKxIKDXAk4WzSFZxsbsbkxjiuyZJ6P4YhqtRbVaggOhzIYIcJ2JdrJjvNXQIUKNTinj825qfFOt2gVv5NiV6VNVTz7qJAOAHIf1HRoGck6pj8vAoavq9Ja4JZxYfJzHrOUOBWnjStKdKaMjk7uMOq0IQk0pq67guNwzG6cGIDhdLUbST/NTS+wEedn1Te+IOY9ez4Yb2vDpgPyitZ9gLx0Jx/hH752fom8a37JNim/ZGP5Jdufm1/if/U3k/NL/in5pdn/8qvYtPml8hf/AfklUFuw5I6ahh2NR87d5hPh9ei5+n0m6eh2m+1wHTGffEp3e/jEwLPDT+hOhO/qL97cSBaR0mP8C3uatBwK+R3Ibszp7L7mZBfv9Se7TE7xKE5Xgfbg2D2Y6MHbblxv0gtN+FRNe1kConzyxBf+eyDLy7C2/J+Etehk6SgbNV//l2HdAiJ9Cqwvgkwvw1pPc1P7rwlrzfVhvSpV5VRTVRq4LGF1XYBZ4qoK5jgT7VPAVqhsZ3qIwY62Sw3I9ZPXgB5HKPlzStiCYkCT54iKC6WbzzUFJ3YLjKCLlTe6qtFEqe9zscFAQYmOdb82Rle3VVcjF6Ny77Iq86bg+Gkq7RpVmcezmTbAT1jJ3X31VBt3eaoNltjpdRIrc77+dBua1po84SYBTDJlyg31FqpmkbHZpzdyV489pbe5rZ5EpvCObHbqHDLasnntCWR6aiby7L5k/uoBqNVzyHAAKh1Dxsaffk94WZt/ygaR4QBUyh+Mbjagm4+rxftXTaYcOtLenBK0sMl4wCbiFcz+4yg8dVz1SESvA82IDieGhFxs9JZHxFprh129KQ+PvVY6lxKMFd6V7PxVXDFlEbZPYoypy/HMJM6gcxkn3hSO8l8ADGOo813a/Uk8WmGIXr2VBqsQiZnHRi12D3raFoHN1cH7mSF+zKHGGXKWbNFO5+vYbWp3URh9ab3LQ00cu6SYaFuZhTbghiviPw5uNFYbG4xxb5z60qLaBTPr6fMdafIpR+lfc+avftXQTQqlJc3Zix+9/wMrBxYvJxs++YpzZ9+pnWcX7XR+hnxq/O077r90h2a7Cdv4WnpXmxT3QdY7JnuYvnWq+taYQyOO2TkNxrHRpL0GMUzqyzcoC9nKtyCyO8fkJOVM3M/o32KFciyEN4gVqFOm6LF6vs41YnR6Gmh7D1jToBoRZ3uEbi8aXYBd4EMeaKgeP3fNSCYaQHoaSDl/+ER394Gbb69EE+4uzLrt6NmLh44cOUS20HgKWEE7drz3FIslbN366Nnnn798icWL1Nz2edpDHUO+rs5uoziI5EbtLF9fw271zLLdI6IRnWn1Htlg7o146QGw8OgqY29nkeDgzILiFdWkuBJCz19Xw24mPF2CfNrsvZYyP3xV8WtV+nzW1MQ99ubeTYaFdq2XEoedEB1G9atmYFc1rqHSCN03eKntzBn++RMn8kND9ByPkJNCFLyTdq7ooPcAMWGDtmxFwx4sYL1pjJIL52LQKRgKr9fmelxVvRVq0kzxptUJ+oZ/vrq+sHr+ADdpusD/zndB+O4N+p3/qpkGlcb6IPk2/RP6e37i3X/P/0L9fTP5CfcVfgL8hRQH3IB326WDxq20fRkrETDqY6TxFr06sbWH5Kh5l2j2z++vi6Tn8Za5mXs+6E7FmijMM8gvuK8Lwv/CvWHdVbeEm1EXmTEvXTOf/IKesSkWab+H0WLGxHbu69ypv/Ces9p5P1p1Wh7xJ/dR/H04VwqMMXNu1EFPTG/E4NfogL0oOAMfQ1A11SRBK0yHt6NUHOJUAuUrbxs0Yj3pm7+wPjpjXnOFaouibfd80NMQa2I2LtCPvJfSz48w4d2CcqMuBpOejfRh+OKMTKxc8biZWi2jjrf4xpurgk3rv4rAuWmIcgohSvsnEZ1BFAtnkU5Ae3I/pX0NwgRa3pZTF4DWZQemwuRld7+6CiYvwFRz1eLkKnd3rAIKXmO1AFXVksG7aHNTrLZV5YlZ3H8hA+RfORPXirP41btFl28abaat/Hrayq++KJZKbzmuy6xlR5fB/2TdzKXLji5dDjsnAz40u5cw3vGyX72TohTK5Wi7us2XzVbdWTiqNa7jSB0LRl/cNCCDRljATRvRJt1hsX6ad5qzyU1+1e66GJ/yCni3gNeZpT3YDRydmUi7zcu4Au9SW1bP0VZNeqfDqoEsfyjPYJl0HqFyHhwapNKrfB7auD6p0Vtt8Wb33uVTYH8k0CqMaXdQpbcvx+YmjsTMdqqvOesYzj/T6+gBFwhhK3b0jdhiZuweArM8QWdp4C2axCy7/xzeoZ3drJ0LqkUCsK86k/ncXKINV81hH4YxiXP08l56M0Cva8Fa99KaB/ZtWdzR0X176Ieuf/mS+29t/T1Lehctv/WC5/XFg4tuO92+JvHIosHFKxe13Vo/fCfdfzHSJPTTe5mEuNc41lBisecY7EL57tp432STM5ul2SXDFXVAyfQ3bEHeMJVvTk/r6UU5iLlqM8timzPaAJgQHXcCPsqok/1Ywp+pswsi6p2qvvTrXbQrzALOv/UVxe//o+x75aU5//ybAywoYGcDPT01f5S9r3CXrTaP1+fX7lSFdyqpfGbufNXdZEKEDtl0J1MN6n2pnCRGNjkO7/qDOLxMt+CCY6uR6HXLBod0emLkd69cWfoy3naCXHr77dKxL+Zmlv5IjHMyXyrfu8TFu2BXpapm6WozNtiEmMmDYtqluIR/Mv4Gx+bZ8zrwN/w4rw575EFvTxpp766MtAe56KMNFl46ALnoo3eD82FXhZf5H5I6lN9Fo1QolCRJMZvoPP7rj76P03ux4fD73XvXrkjluzoaSMPdn8Dp993LtzSsDSQau8Z/Qy6zAfgAN+yHXQB3HHOTtep8kMmzcEMMgUgWx9UZ6IQZGiGqpTjE7DSvF2OCxKKG0j2YPTDgUEsLWN90fgVhkwvwHgheddx0FfhVY8M7pclT/G/c1dF/S9TmCqVbZ/Y15NrrbnVsp/gs2+qWxt/XZNjk6lvA2+3Jxi51rv//BKC0fGAAeNpjYGRgYGBicOrVLf4Qz2/zlUGe+QVQhOH8GtY1MPr/tf/MzIeYLwG5HEC1QAAAfskN33jaY2BkYGCR+vuDgYH5z/9r/3cwH2IAiqCA1wC2VwhReNptk81rU0EUxc+9A9LYaG1KICaRWqqxJsY8UVKwoSj0I62GVo2YIiIuhC7cuNRlrLoNLlRwU9E/wJVSt/0PXAju/KIgiLiwiE3xee70pdTSwC9n3sy9M3fmzMgtDIA/qfFvbQMBSrKCqgZIk4NuAWdcDGOSQ1XGkSUZeYt9HDvP2CF5glOWo11osG+InCRHSZIcIrnou2LzWZ9fAz52zOYxld844NZxWmthW2+jrqMItEVNoi7fqff4vch2kZwIV3Weuo66S+O4vuT4a45fjPQmtYS9mkBcH2NaL2CXq7LmCqCj4V/OmeI+AquZekT3s9Yu7JEKMjqIfs4zIx9R0Msoag4FuYZuzSKhk+xPYURS4WdNsX0Yk+4KZqxfpxjPPMuR+6jJF/TIHcT0LKblD1RXEJefYVvWoLKMPq7bKwt4SB3g/su+JvZ3PIjOJk/iRCyWOi7PkXGDOKcNnvcM6zMf6IE2UZYG6w8w7PtayJOs39ME62p7v0oS0L8WYxqYs3z3CsMRGXpQ9Oe/Ay4If3hPkhuedKAfvaRPiuFX8kkfoWfTj+0EuOrVPNmKeXKJOXOs085/B9wU+r0nuf+hHzGym558IO/pcWHTj+3YXTOlJ1sxT7znVLeIEfeAMaxJnvFMnpJvgHtHXzo6wbfyi7yIuEuWSZlj9h4ieKfSvJ9prCJPjhmyRF+WqG9Ik2sJSpYr13lvbqBo89rbcU3uO8H2LO/ePLr/AT3FpQ8AAAB42mNgYNCCwyKGDYw9TAJM85jVmP2Yy5jnMe9h/sWiwuLEksVSwXKI5RerC+sy1h9sCWxn2D6wp7EfYf/DYcbhxZHFUcfxhrON8xiXDlcR1xaud9xK3C3cu7hvcP/hUeNx49nHy8LrwdvBe49Pj28W3yl+Jn4T/g38DwQEBOwEsgQqBFYInBF4IsgkWCF4TohPKEvomDCX8A7hbyJGInki00SOiKqJZoluEOMSyxBbJM4h7iU+SXybhIyEl0SDxDpJHkkVySbJPZI/pIyAsEjqmrSF9AYZPhkDmUMyf2Rb5BjkZORc5JLk/shLySfJr5P/pBCjUKVwQ1FM0UaxRXGZ4g8lEaVZyiLKV1RsVFpUzqkqqPapcah1qb1TT1Ffpf5Bw0pjlcY5jU+aCppVmve0QrQWaL3RdtHeoWOg46XLpuujO0X3kZ6fXpveKX0P/RMGHgbnDPOM+Ix2GScZXzCxMlliKmI6y3Sf6SMzAbMUs0fmEearzP9YhFgcs7SyrLIys+qxemTtYL3F+ptNgM0hWyPbPXZadj52LTjgJLsFduvsjtnds+ewN7GPs19h/8nBziHDYRcQ3nNkAsIMJz4nPacup28AyY6RugAAAAEAAADrADsABQAAAAAAAgABAAIAFgAAAQABWwAAAAB42pVTTU8TURQ986FCxEZcGMLqLQzBBMe2EISGDdFCTAATbSQxbgYY6wTakmkJgRU/wIUrfoILf4kaVy5d+AP8FZ5757ZpmzbUTN6b8+6759w3Z+4D8AB/EMALpwF84cixhwWucuyjgJ+GA1zht+EQq947w7cw7302fBvO+2r4DpreD8NTqPlrhqex5X8yfBcb/i/DM1gKCobv4X1QMVxALbg2fB9zwV/Ds5gJfcPf8DDscr+jGD7CC6Soc3Q4LpHgCI4j5jomOkQLp7hAplkfGXVYZPQx32UUUeL8xNAylhitMSvhe5fMS7JO+IjSc64zaskca7UWmozHnI+UlzAzwQeNp6whrDeIsMmxxUhmEWG0iV6RI3XkzCnO0MBr4jqRVMxYUeaMeinzh+sn2MYBGQuokp+o5ikzExxzZFSTOk1W30aFdSY7QaXny/KEDDd06rdavd3zp8yvL6piV6+rJlr9SuPrpYplp6MZ8r0NrXbMWIue/+9/i4bcdSP8deawo8fuBped+jyJ5s1a0qUd7lTwlM+5PpH6NJ4Taac3xnAPB87Vzd3RLs0183tzpr0suuJ07ucm1WLm5atBjtyX0f979DniPq1IXalz92RAs83IDl7Suyr22AlVvZ+iOa4/+nton/jA7qDc9ZIy9+37dsm70DOu6d4znq+Mdc4lrPY6f+UfJNDQYQAAAHjabdBHbFNBEMbx/ySOnTi990Lv4PccJzbdTmx6751AEtsQkuBgILSA6FUgJG4g2gUQnQACAQdA9CaKgANnujgAV3Dylhtz+Wl3Vt+Mlija608rOv+rLyBREi0mojERgxkLscRhJZ4EEkkimRRSSSOdDDLJIpsccskjnwIKKaKYEjrQkU50pgtd6UZ3etCTXvSmD33phw0tMt1OKQ7KKMeJi/4MYCCDGMwQhuLGQwWVePExjOGMYCSjGM0YxjKO8UxgIpOYzBSmMo3pzGAms5jNHOYyj/lUSYyYxcIxNrGZGxzgI1vYw04OcoLjEssO3rOR/RInVnZLPNu4zQdJ4BAn+cVPfnOU0zzgHmdYwEL2Us0jarjPQ57xmCc85RO1vOQ5LziLnx/s4w2veE0g8ovf2M4igixmCXXUc5gGltJIiCbCLGM5K/jMSlbRzGrWsoarHKGFdaxnA1/5zjXOcZ7rvOWdJEqSJEuKpEqapEuGZEqWZEuO5EoeF7jIZa5wh0u0cpetnJJ8bnJLCqSQXVIkxVJi9tc1NwY0A90Srg/abLZKQ6fX0KV025Sq71HvPXalQ+lqU48EKTWlrrQrS5UOZZmyXOlU/stzG2oqV9OstUF/OFRTXdUUMK50n6HDZ/KGQw3tB4evok2fx9gjov4XUvyhXwAAAHjaPc07DsIwDAbgpGnTB33TBaFK6ZxbINqlC2JqJFYuwMAKCxOCs7hMiMsVg9xs/n5b/t98ugF/sB6C3TBy/jRjJ/XQQG56qPY4XE0NUh8GBkK1IPQWXNW+ROLoPzyEWxAkwjsRfITcEALVfpjv9Iwc4jKoCREinH8sEBF95xBTZ45pvHb0KLozMkPmjWWKzO6WCTJVlsWvO75MzCYlHhRHyyWyXM00UOkvDZxNYAAAAAFThlUsAAA=) format('woff'); -} - - -/* Fira license */ -/* This Font Software is licensed under the SIL Open Font License, Version 1.1. -This license is copied below, and is also available with a FAQ at: -http://scripts.sil.org/OFL - - ------------------------------------------------------------ -SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 ------------------------------------------------------------ - -PREAMBLE -The goals of the Open Font License (OFL) are to stimulate worldwide -development of collaborative font projects, to support the font creation -efforts of academic and linguistic communities, and to provide a free and -open framework in which fonts may be shared and improved in partnership -with others. - -The OFL allows the licensed fonts to be used, studied, modified and -redistributed freely as long as they are not sold by themselves. The -fonts, including any derivative works, can be bundled, embedded, -redistributed and/or sold with any software provided that any reserved -names are not used by derivative works. The fonts and derivatives, -however, cannot be released under any other type of license. The -requirement for fonts to remain under this license does not apply -to any document created using the fonts or their derivatives. - -DEFINITIONS -"Font Software" refers to the set of files released by the Copyright -Holder(s) under this license and clearly marked as such. This may -include source files, build scripts and documentation. - -"Reserved Font Name" refers to any names specified as such after the -copyright statement(s). - -"Original Version" refers to the collection of Font Software components as -distributed by the Copyright Holder(s). - -"Modified Version" refers to any derivative made by adding to, deleting, -or substituting -- in part or in whole -- any of the components of the -Original Version, by changing formats or by porting the Font Software to a -new environment. - -"Author" refers to any designer, engineer, programmer, technical -writer or other person who contributed to the Font Software. - -PERMISSION & CONDITIONS -Permission is hereby granted, free of charge, to any person obtaining -a copy of the Font Software, to use, study, copy, merge, embed, modify, -redistribute, and sell modified and unmodified copies of the Font -Software, subject to the following conditions: - -1) Neither the Font Software nor any of its individual components, -in Original or Modified Versions, may be sold by itself. - -2) Original or Modified Versions of the Font Software may be bundled, -redistributed and/or sold with any software, provided that each copy -contains the above copyright notice and this license. These can be -included either as stand-alone text files, human-readable headers or -in the appropriate machine-readable metadata fields within text or -binary files as long as those fields can be easily viewed by the user. - -3) No Modified Version of the Font Software may use the Reserved Font -Name(s) unless explicit written permission is granted by the corresponding -Copyright Holder. This restriction only applies to the primary font name as -presented to the users. - -4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font -Software shall not be used to promote, endorse or advertise any -Modified Version, except to acknowledge the contribution(s) of the -Copyright Holder(s) and the Author(s) or with their explicit written -permission. - -5) The Font Software, modified or unmodified, in part or in whole, -must be distributed entirely under this license, and must not be -distributed under any other license. The requirement for fonts to -remain under this license does not apply to any document created -using the Font Software. - -TERMINATION -This license becomes null and void if any of the above conditions are -not met. - -DISCLAIMER -THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT -OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE -COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL -DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM -OTHER DEALINGS IN THE FONT SOFTWARE. */ - - - -@font-face { -font-family: Source Code Pro; -font-style: normal; -font-weight: 300; -font-stretch: normal; -src: url('data:application/font-woff;charset=utf-8;base64,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') format('woff'); -}@font-face { -font-family: Source Code Pro; -font-style: normal; -font-weight: 400; -font-stretch: normal; -src: url('data:application/font-woff;charset=utf-8;base64,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') format('woff'); -}@font-face { -font-family: Source Code Pro; -font-style: normal; -font-weight: 500; -font-stretch: normal; -src: url('data:application/font-woff;charset=utf-8;base64,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') format('woff'); -}@font-face { -font-family: Source Code Pro; -font-style: normal; -font-weight: 600; -font-stretch: normal; -src: url('data:application/font-woff;charset=utf-8;base64,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') format('woff'); -} - -/* Source Code Pro license */ -/* Copyright 2010, 2012 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of Adobe Systems Incorporated in the United States and/or other countries. - -This Font Software is licensed under the SIL Open Font License, Version 1.1. - -This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL - - ------------------------------------------------------------ -SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 ------------------------------------------------------------ - -PREAMBLE -The goals of the Open Font License (OFL) are to stimulate worldwide -development of collaborative font projects, to support the font creation -efforts of academic and linguistic communities, and to provide a free and -open framework in which fonts may be shared and improved in partnership -with others. - -The OFL allows the licensed fonts to be used, studied, modified and -redistributed freely as long as they are not sold by themselves. The -fonts, including any derivative works, can be bundled, embedded, -redistributed and/or sold with any software provided that any reserved -names are not used by derivative works. The fonts and derivatives, -however, cannot be released under any other type of license. The -requirement for fonts to remain under this license does not apply -to any document created using the fonts or their derivatives. - -DEFINITIONS -"Font Software" refers to the set of files released by the Copyright -Holder(s) under this license and clearly marked as such. This may -include source files, build scripts and documentation. - -"Reserved Font Name" refers to any names specified as such after the -copyright statement(s). - -"Original Version" refers to the collection of Font Software components as -distributed by the Copyright Holder(s). - -"Modified Version" refers to any derivative made by adding to, deleting, -or substituting -- in part or in whole -- any of the components of the -Original Version, by changing formats or by porting the Font Software to a -new environment. - -"Author" refers to any designer, engineer, programmer, technical -writer or other person who contributed to the Font Software. - -PERMISSION & CONDITIONS -Permission is hereby granted, free of charge, to any person obtaining -a copy of the Font Software, to use, study, copy, merge, embed, modify, -redistribute, and sell modified and unmodified copies of the Font -Software, subject to the following conditions: - -1) Neither the Font Software nor any of its individual components, -in Original or Modified Versions, may be sold by itself. - -2) Original or Modified Versions of the Font Software may be bundled, -redistributed and/or sold with any software, provided that each copy -contains the above copyright notice and this license. These can be -included either as stand-alone text files, human-readable headers or -in the appropriate machine-readable metadata fields within text or -binary files as long as those fields can be easily viewed by the user. - -3) No Modified Version of the Font Software may use the Reserved Font -Name(s) unless explicit written permission is granted by the corresponding -Copyright Holder. This restriction only applies to the primary font name as -presented to the users. - -4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font -Software shall not be used to promote, endorse or advertise any -Modified Version, except to acknowledge the contribution(s) of the -Copyright Holder(s) and the Author(s) or with their explicit written -permission. - -5) The Font Software, modified or unmodified, in part or in whole, -must be distributed entirely under this license, and must not be -distributed under any other license. The requirement for fonts to -remain under this license does not apply to any document created -using the Font Software. - -TERMINATION -This license becomes null and void if any of the above conditions are -not met. - -DISCLAIMER -THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT -OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE -COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL -DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM -OTHER DEALINGS IN THE FONT SOFTWARE. */ \ No newline at end of file diff --git a/scribble-lib/scribble/manual-prefix.tex b/scribble-lib/scribble/manual-prefix.tex deleted file mode 100644 index 480671a3..00000000 --- a/scribble-lib/scribble/manual-prefix.tex +++ /dev/null @@ -1,15 +0,0 @@ -% This is the prefix for PLT Scheme manuals -\documentclass{article} - -\parskip=10pt -\parindent=0pt -\partopsep=0pt - -% Adjust margins to match HTML width for -% fixed-width font -\advance \oddsidemargin by -0.15in -\advance \evensidemargin by -0.15in -\advance \textwidth by 0.3in - -\usepackage[utf8]{inputenc} -\usepackage[T1]{fontenc} diff --git a/scribble-lib/scribble/manual-racket.css b/scribble-lib/scribble/manual-racket.css deleted file mode 100644 index 18c93607..00000000 --- a/scribble-lib/scribble/manual-racket.css +++ /dev/null @@ -1,319 +0,0 @@ -/* See the beginning of "manual.css". */ - -/* Monospace: */ - -.RktIn, .RktRdr, .RktPn, .RktMeta, -.RktMod, .RktKw, .RktVar, .RktSym, -.RktRes, .RktOut, .RktCmt, .RktVal, -.RktBlk, .RktErr { - font-family: 'Source Code Pro', monospace; - white-space: inherit; - font-size: 1rem; -} - -/* this selctor grabs the first linked Racket symbol -in a definition box (i.e., the symbol being defined) */ -a.RktValDef, a.RktStxDef, a.RktSymDef, -span.RktValDef, span.RktStxDef, span.RktSymDef -{ - font-size: 1.15rem; - color: black; - font-weight: 600; -} - - -.inheritedlbl { - font-family: 'Fira', sans; -} - -.RBackgroundLabelInner { - font-family: inherit; -} - -/* ---------------------------------------- */ -/* Inherited methods, left margin */ - -.inherited { - width: 95%; - margin-top: 0.5em; - text-align: left; - background-color: inherit; -} - -.inherited td { - font-size: 82%; - padding-left: 0.5rem; - line-height: 1.3; - text-indent: 0; - padding-right: 0; -} - -.inheritedlbl { - font-style: normal; -} - -/* ---------------------------------------- */ -/* Racket text styles */ - -.RktIn { - color: #cc6633; - background-color: #eee; -} - -.RktInBG { - background-color: #eee; -} - - -.refcolumn .RktInBG { - background-color: white; -} - -.RktRdr { -} - -.RktPn { - color: #843c24; -} - -.RktMeta { - color: black; -} - -.RktMod { - color: inherit; -} - -.RktOpt { - color: black; -} - -.RktKw { - color: black; -} - -.RktErr { - color: red; - font-style: italic; - font-weight: 400; -} - -.RktVar { - position: relative; - left: -1px; font-style: italic; - color: #444; -} - -.SVInsetFlow .RktVar { - font-weight: 400; - color: #444; -} - - -.RktSym { - color: inherit; -} - - - -.RktValLink, .RktStxLink, .RktModLink { - text-decoration: none; - color: #07A; - font-weight: 500; - font-size: 1rem; -} - -/* for syntax links within headings */ -h2 a.RktStxLink, h3 a.RktStxLink, h4 a.RktStxLink, h5 a.RktStxLink, -h2 a.RktValLink, h3 a.RktValLink, h4 a.RktValLink, h5 a.RktValLink, -h2 .RktSym, h3 .RktSym, h4 .RktSym, h5 .RktSym, -h2 .RktMod, h3 .RktMod, h4 .RktMod, h5 .RktMod, -h2 .RktVal, h3 .RktVal, h4 .RktVal, h5 .RktVal, -h2 .RktPn, h3 .RktPn, h4 .RktPn, h5 .RktPn { - color: #333; - font-size: 1.65rem; - font-weight: 400; -} - -.toptoclink .RktStxLink, .toclink .RktStxLink, -.toptoclink .RktValLink, .toclink .RktValLink, -.toptoclink .RktModLink, .toclink .RktModLink { - color: inherit; -} - -.tocset .RktValLink, .tocset .RktStxLink, .tocset .RktModLink { - color: black; - font-weight: 400; - font-size: 0.9rem; -} - -.tocset td a.tocviewselflink .RktValLink, -.tocset td a.tocviewselflink .RktStxLink, -.tocset td a.tocviewselflink .RktMod, -.tocset td a.tocviewselflink .RktSym { - font-weight: lighter; - color: white; -} - - -.RktRes { - color: #0000af; -} - -.RktOut { - color: #960096; -} - -.RktCmt { - color: #c2741f; -} - -.RktVal { - color: #228b22; -} - -/* ---------------------------------------- */ -/* Some inline styles */ - -.together { /* for definitions grouped together in one box */ - width: 100%; - border-top: 2px solid white; -} - -tbody > tr:first-child > td > .together { - border-top: 0px; /* erase border on first instance of together */ -} - -.RktBlk { - white-space: pre; - text-align: left; -} - -.highlighted { - font-size: 1rem; - background-color: #fee; -} - -.defmodule { - font-family: 'Source Code Pro'; - padding: 0.25rem 0.75rem 0.25rem 0.5rem; - margin-bottom: 1rem; - width: 100%; - background-color: hsl(60, 29%, 94%); -} - -.defmodule a { - color: #444; -} - - -.defmodule td span.hspace:first-child { - position: absolute; - width: 0; - display: inline-block; -} - -.defmodule .RpackageSpec .Smaller, -.defmodule .RpackageSpec .stt { - font-size: 1rem; -} - - -.specgrammar { - float: none; - padding-left: 1em; -} - - -.RBibliography td { - vertical-align: text-top; - padding-top: 1em; -} - -.leftindent { - margin-left: 2rem; - margin-right: 0em; -} - -.insetpara { - margin-left: 1em; - margin-right: 1em; -} - -.SCodeFlow .Rfilebox { - margin-left: -1em; /* see 17.2 of guide, module languages */ -} - -.Rfiletitle { - text-align: right; - background-color: #eee; -} - -.SCodeFlow .Rfiletitle { - border-top: 1px dotted gray; - border-right: 1px dotted gray; -} - - -.Rfilename { - border-top: 0; - border-right: 0; - padding-left: 0.5em; - padding-right: 0.5em; - background-color: inherit; -} - -.Rfilecontent { - margin: 0.5em; -} - -.RpackageSpec { - padding-right: 0; -} - -/* ---------------------------------------- */ -/* For background labels */ - -.RBackgroundLabel { - float: right; - width: 0px; - height: 0px; -} - -.RBackgroundLabelInner { - position: relative; - width: 25em; - left: -25.5em; - top: 0.20rem; /* sensitive to monospaced font choice */ - text-align: right; - z-index: 0; - font-weight: 300; - font-family: 'Source Code Pro'; - font-size: 0.9rem; - color: gray; -} - - -.RpackageSpec .Smaller { - font-weight: 300; - font-family: 'Source Code Pro'; - font-size: 0.9rem; -} - -.RForeground { - position: relative; - left: 0px; - top: 0px; - z-index: 1; -} - -/* ---------------------------------------- */ -/* For section source modules & tags */ - -.RPartExplain { - background: #eee; - font-size: 0.9rem; - margin-top: 0.2rem; - padding: 0.2rem; - text-align: left; -} diff --git a/scribble-lib/scribble/manual-racket.js b/scribble-lib/scribble/manual-racket.js deleted file mode 100644 index 203d6d30..00000000 --- a/scribble-lib/scribble/manual-racket.js +++ /dev/null @@ -1,98 +0,0 @@ -/* For the Racket manual style */ - -AddOnLoad(function() { - /* Look for header elements that have x-source-module and x-part tag. - For those elements, add a hidden element that explains how to - link to the section, and set the element's onclick() to display - the explanation. */ - var tag_names = ["h1", "h2", "h3", "h4", "h5"]; - for (var j = 0; j < tag_names.length; j++) { - elems = document.getElementsByTagName(tag_names[j]); - for (var i = 0; i < elems.length; i++) { - var elem = elems.item(i); - AddPartTitleOnClick(elem); - } - } -}) - -function AddPartTitleOnClick(elem) { - var mod_path = elem.getAttribute("x-source-module"); - var tag = elem.getAttribute("x-part-tag"); - if (mod_path && tag) { - // Might not be present: - var prefixes = elem.getAttribute("x-part-prefixes"); - - var info = document.createElement("div"); - info.className = "RPartExplain"; - - /* The "top" tag refers to a whole document: */ - var is_top = (tag == "\"top\""); - info.appendChild(document.createTextNode("Link to this " - + (is_top ? "document" : "section") - + " with ")); - - /* Break `secref` into two lines if the module path and tag - are long enough: */ - var is_long = (is_top ? false : ((mod_path.length - + tag.length - + (prefixes ? (16 + prefixes.length) : 0)) - > 60)); - - var line1 = document.createElement("div"); - var line1x = ((is_long && prefixes) ? document.createElement("div") : line1); - var line2 = (is_long ? document.createElement("div") : line1); - - function add(dest, str, cn) { - var s = document.createElement("span"); - s.className = cn; - s.style.whiteSpace = "nowrap"; - s.appendChild(document.createTextNode(str)); - dest.appendChild(s); - } - /* Construct a `secref` call with suitable syntax coloring: */ - add(line1, "\xA0@", "RktRdr"); - add(line1, (is_top ? "other-doc" : "secref"), "RktSym"); - add(line1, "[", "RktPn"); - if (!is_top) - add(line1, tag, "RktVal"); - if (is_long) { - /* indent additional lines: */ - if (prefixes) - add(line1x, "\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0", "RktPn"); - add(line2, "\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0", "RktPn"); - } - if (prefixes) { - add(line1x, " #:tag-prefixes ", "RktPn"); - add(line1x, "'", "RktVal"); - add(line1x, prefixes, "RktVal"); - } - if (!is_top) - add(line2, " #:doc ", "RktPn"); - add(line2, "'", "RktVal"); - add(line2, mod_path, "RktVal"); - add(line2, "]", "RktPn"); - - info.appendChild(line1); - if (is_long) - info.appendChild(line1x); - if (is_long) - info.appendChild(line2); - - info.style.display = "none"; - - /* Add the new element afterthe header: */ - var n = elem.nextSibling; - if (n) - elem.parentNode.insertBefore(info, n); - else - elem.parentNode.appendChild(info); - - /* Clicking the header shows the explanation element: */ - elem.onclick = function () { - if (info.style.display == "none") - info.style.display = "block"; - else - info.style.display = "none"; - } - } -} diff --git a/scribble-lib/scribble/manual-struct.rkt b/scribble-lib/scribble/manual-struct.rkt deleted file mode 100644 index 80b6cbd9..00000000 --- a/scribble-lib/scribble/manual-struct.rkt +++ /dev/null @@ -1,21 +0,0 @@ -#lang scheme/base -(require "core.rkt" - "private/provide-structs.rkt" - racket/contract/base) - -(provide-structs - [module-path-index-desc ()] - [(language-index-desc module-path-index-desc) ()] - [(reader-index-desc module-path-index-desc) ()] - [exported-index-desc ([name symbol?] - [from-libs (listof module-path?)])] - [(method-index-desc exported-index-desc) ([method-name symbol?] - [class-tag tag?])] - [(constructor-index-desc exported-index-desc) ([class-tag tag?])] - [(procedure-index-desc exported-index-desc) ()] - [(thing-index-desc exported-index-desc) ()] - [(struct-index-desc exported-index-desc) ()] - [(form-index-desc exported-index-desc) ()] - [(class-index-desc exported-index-desc) ()] - [(interface-index-desc exported-index-desc) ()] - [(mixin-index-desc exported-index-desc) ()]) diff --git a/scribble-lib/scribble/manual-style.css b/scribble-lib/scribble/manual-style.css deleted file mode 100644 index fa7e8cc8..00000000 --- a/scribble-lib/scribble/manual-style.css +++ /dev/null @@ -1,743 +0,0 @@ - -/* See the beginning of "scribble.css". - This file is used by the `scribble/manual` language, along with - "manual-racket.css". */ - -@import url("manual-fonts.css"); - -* { - margin: 0; - padding: 0; -} - -@media all {html {font-size: 15px;}} -@media all and (max-width:940px){html {font-size: 14px;}} -@media all and (max-width:850px){html {font-size: 13px;}} -@media all and (max-width:830px){html {font-size: 12px;}} -@media all and (max-width:740px){html {font-size: 11px;}} - -/* CSS seems backward: List all the classes for which we want a - particular font, so that the font can be changed in one place. (It - would be nicer to reference a font definition from all the places - that we want it.) - - As you read the rest of the file, remember to double-check here to - see if any font is set. */ - -/* Monospace: */ -.maincolumn, .refpara, .refelem, .tocset, .stt, .hspace, .refparaleft, .refelemleft { - font-family: 'Source Code Pro', monospace; - white-space: inherit; - font-size: 1rem; -} - -.stt { - font-weight: 500; -} - -h2 .stt { - font-size: 2.7rem; -} - -.toptoclink .stt { - font-size: inherit; -} -.toclink .stt { - font-size: 90%; -} - -.RpackageSpec .stt { - font-weight: 300; - font-family: 'Source Code Pro'; - font-size: 0.9rem; -} - -h3 .stt, h4 .stt, h5 .stt { - color: #333; - font-size: 1.65rem; - font-weight: 400; -} - - -/* Serif: */ -.main, .refcontent, .tocview, .tocsub, .sroman, i { - font-family: 'Charter', serif; - font-size: 1.18rem; -} - - -/* Sans-serif: */ -.version, .versionNoNav, .ssansserif { - font-family: 'Fira', sans-serif; -} -.ssansserif { - font-family: 'Fira'; - font-weight: 500; - font-size: 0.9em; -} - -.tocset .ssansserif { - font-size: 100%; -} - -/* ---------------------------------------- */ - -p, .SIntrapara { - display: block; - margin: 0 0 1em 0; - line-height: 1.4; -} - -.compact { - padding: 0 0 1em 0; -} - -li { - list-style-position: outside; - margin-left: 1.2em; -} - -h1, h2, h3, h4, h5, h6, h7, h8 { - font-family: 'Fira'; - font-weight: 300; - font-size: 1.6rem; - color: #333; - margin-top: inherit; - margin-bottom: 1rem; - line-height: 1.25; - -moz-font-feature-settings: 'tnum=1'; - -moz-font-feature-settings: 'tnum' 1; - -webkit-font-feature-settings: 'tnum' 1; - -o-font-feature-settings: 'tnum' 1; - -ms-font-feature-settings: 'tnum' 1; - font-feature-settings: 'tnum' 1; - -} - -h3, h4, h5, h6, h7, h8 { - border-top: 1px solid black; -} - - - -h2 { /* per-page main title */ - font-family: 'Miso'; - font-weight: bold; - margin-top: 4rem; - font-size: 3rem; - line-height: 1.1; - width: 90%; -} - -h3, h4, h5, h6, h7, h8 { - margin-top: 2em; - padding-top: 0.1em; - margin-bottom: 0.75em; -} - -/* ---------------------------------------- */ -/* Main */ - -body { - color: black; - background-color: white; -} - -.maincolumn { - width: auto; - margin-top: 4rem; - margin-left: 17rem; - margin-right: 2rem; - margin-bottom: 10rem; /* to avoid fixed bottom nav bar */ - max-width: 700px; - min-width: 370px; /* below this size, code samples don't fit */ -} - -a { - text-decoration: inherit; -} - -a, .toclink, .toptoclink, .tocviewlink, .tocviewselflink, .tocviewtoggle, .plainlink, -.techinside, .techoutside:hover, .techinside:hover { - color: #07A; -} - -a:hover { - text-decoration: underline; -} - - -/* ---------------------------------------- */ -/* Navigation */ - -.navsettop, .navsetbottom { - left: 0; - width: 15rem; - height: 6rem; - font-family: 'Fira'; - font-size: 0.9rem; - border-bottom: 0px solid hsl(216, 15%, 70%); - background-color: inherit; - padding: 0; -} - -.navsettop { - position: absolute; - top: 0; - left: 0; - margin-bottom: 0; - border-bottom: 0; -} - -.navsettop a, .navsetbottom a { - color: black; -} - -.navsettop a:hover, .navsetbottom a:hover { - background: hsl(216, 78%, 95%); - text-decoration: none; -} - -.navleft, .navright { - position: static; - float: none; - margin: 0; - white-space: normal; -} - - -.navleft a { - display: inline-block; -} - -.navright a { - display: inline-block; - text-align: center; -} - -.navleft a, .navright a, .navright span { - display: inline-block; - padding: 0.5rem; - min-width: 1rem; -} - - -.navright { - height: 2rem; - white-space: nowrap; -} - - -.navsetbottom { - display: none; -} - -.nonavigation { - color: #889; -} - -.searchform { - display: block; - margin: 0; - padding: 0; - border-bottom: 1px solid #eee; - height: 4rem; -} - -.nosearchform { - margin: 0; - padding: 0; - height: 4rem; -} - -.searchbox { - font-size: 1rem; - width: 12rem; - margin: 1rem; - padding: 0.25rem; - vertical-align: middle; - background-color: white; -} - -#search_box { - font-size: 0.8rem; -} - -/* ---------------------------------------- */ -/* Version */ - -.versionbox { - position: absolute; - float: none; - top: 0.25rem; - left: 17rem; - z-index: 11000; - height: 2em; - font-size: 70%; - font-weight: lighter; - width: inherit; - margin: 0; -} -.version, .versionNoNav { - font-size: inherit; -} -.version:before, .versionNoNav:before { - content: "v."; -} - - -/* ---------------------------------------- */ -/* Margin notes */ - -/* cancel scribble.css styles: */ -.refpara, .refelem { - position: static; - float: none; - height: auto; - width: auto; - margin: 0; -} - -.refcolumn { - position: static; - display: block; - width: auto; - font-size: inherit; - margin: 2rem; - margin-left: 2rem; - padding: 0.5em; - padding-left: 0.75em; - padding-right: 1em; - background: hsl(60, 29%, 94%); - border: 1px solid #ccb; - border-left: 0.4rem solid #ccb; -} - - -/* slightly different handling for margin-note* on narrow screens */ -@media all and (max-width:1260px) { - span.refcolumn { - float: right; - width: 50%; - margin-left: 1rem; - margin-bottom: 0.8rem; - margin-top: 1.2rem; - } - -} - -.refcontent, .refcontent p { - line-height: 1.5; - margin: 0; -} - -.refcontent p + p { - margin-top: 1em; -} - -.refcontent a { - font-weight: 400; -} - -.refpara, .refparaleft { - top: -1em; -} - - -@media all and (max-width:600px) { - .refcolumn { - margin-left: 0; - margin-right: 0; - } -} - - -@media all and (min-width:1260px) { - .refcolumn { - position: absolute; - left: 66rem; right: 3em; - margin: 0; - float: right; - max-width: 18rem; - } -} - -.refcontent { - font-family: 'Fira'; - font-size: 1rem; - line-height: 1.6; - margin: 0 0 0 0; -} - - -.refparaleft, .refelemleft { - position: relative; - float: left; - right: 2em; - height: 0em; - width: 13em; - margin: 0em 0em 0em -13em; -} - -.refcolumnleft { - background-color: hsl(60, 29%, 94%); - display: block; - position: relative; - width: 13em; - font-size: 85%; - border: 0.5em solid hsl(60, 29%, 94%); - margin: 0 0 0 0; -} - - -/* ---------------------------------------- */ -/* Table of contents, left margin */ - -.tocset { - position: absolute; - float: none; - left: 0; - top: 0rem; - width: 14rem; - padding: 7rem 0.5rem 0.5rem 0.5rem; - background-color: hsl(216, 15%, 70%); - margin: 0; - -} - -.tocset td { - vertical-align: text-top; - padding-bottom: 0.4rem; - padding-left: 0.2rem; - line-height: 1.1; - font-family: 'Fira'; - -moz-font-feature-settings: 'tnum=1'; - -moz-font-feature-settings: 'tnum' 1; - -webkit-font-feature-settings: 'tnum' 1; - -o-font-feature-settings: 'tnum' 1; - -ms-font-feature-settings: 'tnum' 1; - font-feature-settings: 'tnum' 1; - -} - -.tocset td a { - color: black; - font-weight: 400; -} - - -.tocview { - text-align: left; - background-color: inherit; -} - - -.tocview td, .tocsub td { - line-height: 1.3; -} - - -.tocview table, .tocsub table { - width: 90%; -} - -.tocset td a.tocviewselflink { - font-weight: lighter; - font-size: 110%; /* monospaced styles below don't need to enlarge */ - color: white; -} - -.tocviewselflink { - text-decoration: none; -} - -.tocsub { - text-align: left; - margin-top: 0.5em; - background-color: inherit; -} - -.tocviewlist, .tocsublist { - margin-left: 0.2em; - margin-right: 0.2em; - padding-top: 0.2em; - padding-bottom: 0.2em; -} -.tocviewlist table { - font-size: 82%; -} - -.tocviewlisttopspace { - margin-bottom: 1em; -} - -.tocviewsublist, .tocviewsublistonly, .tocviewsublisttop, .tocviewsublistbottom { - margin-left: 0.4em; - border-left: 1px solid #99a; - padding-left: 0.8em; -} -.tocviewsublist { - margin-bottom: 1em; -} -.tocviewsublist table, -.tocviewsublistonly table, -.tocviewsublisttop table, -.tocviewsublistbottom table, -table.tocsublist { - font-size: 1rem; -} - -.tocviewsublist td, .tocviewsublistbottom td, .tocviewsublisttop td, .tocsub td, -.tocviewsublistonly td { - font-size: 90%; -} - - -.tocviewtoggle { - font-size: 75%; /* looks better, and avoids bounce when toggling sub-sections due to font alignments */ -} - -.tocsublist td { - padding-left: 0.5rem; - padding-top: 0.25rem; - text-indent: 0; -} - -.tocsublinknumber { - font-size: 100%; -} - -.tocsublink { - font-size: 82%; - text-decoration: none; -} - -.tocsubseclink { - font-size: 100%; - text-decoration: none; -} - -.tocsubnonseclink { - font-size: 82%; - text-decoration: none; - margin-left: 1rem; - padding-left: 0; - display: inline-block; -} - -/* the label "on this page" */ -.tocsubtitle { - display: block; - font-size: 62%; - font-family: 'Fira'; - font-weight: bolder; - font-style: normal; - letter-spacing: 2px; - text-transform: uppercase; - margin: 0.5em; -} - -.toptoclink { - font-weight: bold; - font-size: 110%; - margin-bottom: 0.5rem; - margin-top: 1.5rem; - display: inline-block; -} - -.toclink { - font-size: inherit; -} - -/* ---------------------------------------- */ -/* Some inline styles */ - -.indexlink { - text-decoration: none; -} - -pre { - margin-left: 2em; -} - -blockquote { - margin-left: 2em; - margin-right: 2em; - margin-bottom: 1em; -} - -.SCodeFlow { - border-left: 1px dotted black; - padding-left: 1em; - padding-right: 1em; - margin-top: 1em; - margin-bottom: 1em; - margin-left: 0em; - margin-right: 2em; - white-space: nowrap; - line-height: 1.5; -} - -.SCodeFlow img { - margin-top: 0.5em; - margin-bottom: 0.5em; -} - -.boxed { - margin: 0; - margin-top: 2em; - padding: 0.25em; - padding-bottom: 0.5em; - background: #f3f3f3; - box-sizing:border-box; - border-top: 1px solid #99b; - background: hsl(216, 78%, 95%); - background: -moz-linear-gradient(to bottom left, hsl(0, 0%, 99%) 0%, hsl(216, 78%, 95%) 100%); - background: -webkit-linear-gradient(to bottom left, hsl(0, 0%, 99%) 0%, hsl(216, 78%, 95%) 100%); - background: -o-linear-gradient(to bottom left, hsl(0, 0%, 99%) 0%, hsl(216, 78%, 95%) 100%); - background: -ms-linear-gradient(to bottom left, hsl(0, 0%, 99%) 0%, hsl(216, 78%, 95%) 100%); - background: linear-gradient(to bottom left, hsl(0, 0%, 99%) 0%, hsl(216, 78%, 95%) 100%); -} - -blockquote > blockquote.SVInsetFlow { -/* resolves issue in e.g. /reference/notation.html */ - margin-top: 0em; -} - -.leftindent .SVInsetFlow { /* see e.g. section 4.5 of Racket Guide */ - margin-top: 1em; - margin-bottom: 1em; -} - -.SVInsetFlow a, .SCodeFlow a { - color: #07A; - font-weight: 500; -} - -.SubFlow { - display: block; - margin: 0em; -} - -.boxed { - width: 100%; - background-color: inherit; -} - -.techoutside { text-decoration: none; } - -.SAuthorListBox { - position: static; - float: none; - font-family: 'Fira'; - font-weight: 300; - font-size: 110%; - margin-top: 1rem; - margin-bottom: 3rem; - width: 30rem; - height: auto; -} - -.author > a { /* email links within author block */ - font-weight: inherit; - color: inherit; -} - -.SAuthorList { - font-size: 82%; -} -.SAuthorList:before { - content: "by "; -} -.author { - display: inline; - white-space: nowrap; -} - -/* phone + tablet styles */ - -@media all and (max-width:720px){ - - - @media all and (max-width:720px){ - - @media all {html {font-size: 15px;}} - @media all and (max-width:700px){html {font-size: 14px;}} - @media all and (max-width:630px){html {font-size: 13px;}} - @media all and (max-width:610px){html {font-size: 12px;}} - @media all and (max-width:550px){html {font-size: 11px;}} - @media all and (max-width:520px){html {font-size: 10px;}} - - .navsettop, .navsetbottom { - display: block; - position: absolute; - width: 100%; - height: 4rem; - border: 0; - background-color: hsl(216, 15%, 70%); - } - - .searchform { - display: inline; - border: 0; - } - - .navright { - position: absolute; - right: 1.5rem; - margin-top: 1rem; - border: 0px solid red; - } - - .navsetbottom { - display: block; - margin-top: 8rem; - } - - .tocset { - display: none; - } - - .tocset table, .tocset tbody, .tocset tr, .tocset td { - display: inline; - } - - .tocview { - display: none; - } - - .tocsub .tocsubtitle { - display: none; - } - - .versionbox { - top: 4.5rem; - left: 1rem; /* same distance as main-column */ - z-index: 11000; - height: 2em; - font-size: 70%; - font-weight: lighter; - } - - - .maincolumn { - margin-left: 1em; - margin-top: 7rem; - margin-bottom: 0rem; - } - - } - -} - -/* print styles : hide the navigation elements */ -@media print { - .tocset, - .navsettop, - .navsetbottom { display: none; } - .maincolumn { - width: auto; - margin-right: 13em; - margin-left: 0; - } -} \ No newline at end of file diff --git a/scribble-lib/scribble/manual-style.tex b/scribble-lib/scribble/manual-style.tex deleted file mode 100644 index 50a42aa1..00000000 --- a/scribble-lib/scribble/manual-style.tex +++ /dev/null @@ -1,11 +0,0 @@ -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% Re-definitions for the PLT Scheme manual style - -\renewcommand{\sectionNewpage}{\newpage} - -\renewcommand{\preDoc}{\sloppy} - -\renewcommand{\ChapRef}[2]{\SecRef{#1}{#2}} -\renewcommand{\SecRef}[2]{\S#1 ``#2''} -\renewcommand{\ChapRefUC}[2]{\SecRefUC{#1}{#2}} -\renewcommand{\SecRefUC}[2]{\SecRef{#1}{#2}} diff --git a/scribble-lib/scribble/manual.rkt b/scribble-lib/scribble/manual.rkt deleted file mode 100644 index a6fa7004..00000000 --- a/scribble-lib/scribble/manual.rkt +++ /dev/null @@ -1,38 +0,0 @@ -#lang scheme/base -(require "base.rkt" - "private/manual-style.rkt" - "private/manual-scheme.rkt" - "private/manual-code.rkt" - "private/manual-mod.rkt" - "private/manual-tech.rkt" - "private/manual-bib.rkt" - "private/manual-proc.rkt" - "private/manual-form.rkt" - "private/manual-class.rkt" - "private/manual-unit.rkt" - "private/manual-vars.rkt" - "private/manual-bind.rkt" - "private/manual-utils.rkt" - "private/manual-defaults.rkt" - "private/manual-history.rkt") - -(provide unsyntax - make-binding-redirect-elements - defidentifier - current-display-width - manual-doc-style - (all-from-out "base.rkt" - "private/manual-style.rkt" - "private/manual-scheme.rkt" - "private/manual-code.rkt" - "private/manual-mod.rkt" - "private/manual-tech.rkt" - "private/manual-bib.rkt" - "private/manual-form.rkt" - "private/manual-class.rkt" - "private/manual-unit.rkt" - "private/manual-history.rkt") - (except-out (all-from-out "private/manual-vars.rkt") - *deftogether) - (except-out (all-from-out "private/manual-proc.rkt") - *defthing)) diff --git a/scribble-lib/scribble/manual/lang.rkt b/scribble-lib/scribble/manual/lang.rkt deleted file mode 100644 index b7f7a83b..00000000 --- a/scribble-lib/scribble/manual/lang.rkt +++ /dev/null @@ -1,12 +0,0 @@ -#lang scheme/base -(require scribble/doclang - scribble/manual - scribble/html-properties - "../private/manual-defaults.rkt") -(provide (except-out (all-from-out scribble/doclang) #%module-begin) - (all-from-out scribble/manual) - (rename-out [module-begin #%module-begin]) - manual-doc-style) - -(define-syntax-rule (module-begin id . body) - (#%module-begin id post-process () . body)) diff --git a/scribble-lib/scribble/manual/lang/reader.rkt b/scribble-lib/scribble/manual/lang/reader.rkt deleted file mode 100644 index ec831697..00000000 --- a/scribble-lib/scribble/manual/lang/reader.rkt +++ /dev/null @@ -1,3 +0,0 @@ -#lang s-exp scribble/base/reader -scribble/manual/lang -#:wrapper1 (lambda (t) (cons 'doc (t))) diff --git a/scribble-lib/scribble/markdown-render.rkt b/scribble-lib/scribble/markdown-render.rkt deleted file mode 100644 index 58847f74..00000000 --- a/scribble-lib/scribble/markdown-render.rkt +++ /dev/null @@ -1,301 +0,0 @@ -#lang racket/base -(require "core.rkt" - "base-render.rkt" - "private/render-utils.rkt" - racket/class racket/port racket/list racket/string racket/match - scribble/text/wrap) -(provide render-mixin) - -(define current-indent (make-parameter 0)) -(define (make-indent amt) - (+ amt (current-indent))) -(define (indent) - (define i (current-indent)) - (unless (zero? i) (display (make-string i #\space)))) -(define (indented-newline) - (newline) - (indent)) - -(define note-depth (make-parameter 0)) - -(define (render-mixin %) - (class % - - (define/override (current-render-mode) - '(markdown)) - - (define/override (get-suffix) #".md") - - (define/override (get-substitutions) - '((#rx"---" "\U2014") - (#rx"--" "\U2013") - (#rx"``" "\U201C") - (#rx"''" "\U201D") - (#rx"'" "\U2019"))) - - (inherit render-block - format-number - number-depth) - - (define/override (render-part d ht) - (let ([number (collected-info-number (part-collected-info d ht))]) - (unless (part-style? d 'hidden) - (printf (string-append (make-string (add1 (number-depth number)) #\#) " ")) - (let ([s (format-number number '() #t)]) - (unless (null? s) - (printf "~a~a" - (car s) - (if (part-title-content d) - " " - ""))) - (when (part-title-content d) - (render-content (part-title-content d) d ht)) - (when (or (pair? number) (part-title-content d)) - (newline) - (newline)))) - (render-flow (part-blocks d) d ht #f) - (let loop ([pos 1] - [secs (part-parts d)] - [need-newline? (pair? (part-blocks d))]) - (unless (null? secs) - (when need-newline? (newline)) - (render-part (car secs) ht) - (loop (add1 pos) (cdr secs) #t))))) - - (define/override (render-flow f part ht starting-item?) - (if (null? f) - null - (append* - (render-block (car f) part ht starting-item?) - (for/list ([p (in-list (cdr f))]) - (indented-newline) - (render-block p part ht #f))))) - - (define/override (render-intrapara-block p part ri first? last? starting-item?) - (unless first? (indented-newline)) - (super render-intrapara-block p part ri first? last? starting-item?)) - - (define/override (render-table i part ht inline?) - (define flowss (table-blockss i)) - - (define tick? (member (style-name (table-style i)) - (list 'boxed "defmodule" "RktBlk"))) - - (cond - [(null? flowss) null] - - [(and tick? (not (in-code?))) - (displayln "```racket") - (parameterize ([in-code? #t]) - (render-table i part ht inline?)) - (displayln "```")] - - [else - (define strs (map (lambda (flows) - (map (lambda (d) - (if (eq? d 'cont) - d - (let ([o (open-output-string)]) - (parameterize ([current-indent 0] - [current-output-port o]) - (render-block d part ht #f)) - (regexp-split - #rx"\n" - (regexp-replace #rx"\n$" - (get-output-string o) - ""))))) - flows)) - flowss)) - (define widths (map (lambda (col) - (for/fold ([d 0]) ([i (in-list col)]) - (if (eq? i 'cont) - 0 - (apply max d (map string-length i))))) - (apply map list strs))) - (define x-length (lambda (col) (if (eq? col 'cont) 0 (length col)))) - (for/fold ([indent? #f]) ([row (in-list strs)]) - (let ([h (apply max 0 (map x-length row))]) - (let ([row* (for/list ([i (in-range h)]) - (for/list ([col (in-list row)]) - (if (i . < . (x-length col)) - (list-ref col i) - "")))]) - (for/fold ([indent? indent?]) ([sub-row (in-list row*)]) - (when indent? (indent)) - (for/fold ([space? #f]) - ([col (in-list sub-row)] - [w (in-list widths)]) - (let ([col (if (eq? col 'cont) "" col)]) - (display (regexp-replace* #rx"\uA0" col " ")) - (display (make-string (max 0 (- w (string-length col))) #\space))) - #t) - (newline) - #t))) - #t)]) - null) - - (define/override (render-itemization i part ht) - (let ([flows (itemization-blockss i)]) - (if (null? flows) - null - (append* - (begin (printf "* ") - (parameterize ([current-indent (make-indent 2)]) - (render-flow (car flows) part ht #t))) - (for/list ([d (in-list (cdr flows))]) - (indented-newline) - (printf "* ") - (parameterize ([current-indent (make-indent 2)]) - (render-flow d part ht #f))))))) - - (define/override (render-paragraph p part ri) - (define (write-note) - (write-string (make-string (note-depth) #\>)) - (unless (zero? (note-depth)) - (write-string " "))) - (define o (open-output-string)) - (parameterize ([current-output-port o]) - (super render-paragraph p part ri)) - ;; 1. Remove newlines so we can re-wrap the text. - ;; - ;; 2. Combine adjacent code spans into one. These result from - ;; something like @racket[(x y)] being treated as multiple - ;; RktXXX items rather than one. (Although it would be - ;; more-correct to handle them at that level, I don't easily see - ;; how. As a result I'm handling it after-the-fact, at the - ;; text/Markdown stage.) - (define to-wrap (regexp-replaces (get-output-string o) - '([#rx"\n" " "] ;1 - [#rx"``" ""]))) ;2 - (define lines (wrap-line (string-trim to-wrap) (- 72 (current-indent)))) - (write-note) - (write-string (car lines)) - (for ([line (in-list (cdr lines))]) - (newline) (indent) (write-note) (write-string line)) - (newline) - null) - - (define/private (content-style e) - (cond - [(element? e) (element-style e)] - [(multiarg-element? e) (multiarg-element-style e)] - [else #f])) - - (define in-bold? (make-parameter #f)) - (define in-italic? (make-parameter #f)) - (define in-code? (make-parameter #f)) - (define in-link? (make-parameter #f)) - (define preserving-spaces? (make-parameter #f)) - - (define (bold? i) - (and (element? i) (eq? (element-style i) 'bold))) - - (define (italic? i) - (and (element? i) (eq? (element-style i) 'italic))) - - (define (code? i) - (and (element? i) - (let ([s (element-style i)]) - (or (eq? 'tt s) - (and (style? s) - (style-name s) - (regexp-match? #rx"^Rkt[A-Z]" (style-name s))))))) - - (define (link? i) - (let ([s (content-style i)]) - (and (style? s) (findf target-url? (style-properties s))))) - - (define (link-from i) - (target-url-addr (findf target-url? (style-properties (content-style i))))) - - (define (preserve-spaces? i) - (and (element? i) - (let ([s (element-style i)]) - (or (eq? 'hspace s) - (and (style? s) - (eq? 'hspace (style-name s))))))) - - (define (sanitize-parens str) - (regexp-replace #rx"[\\(\\)]" str "\\&")) - - (define/override (render-content i part ri) - (define (recurse-wrapped str param) - (display str) - (begin0 - (parameterize ([param #t]) - (render-content i part ri)) - (display str))) - - (cond - [(and (code? i) (not (in-code?))) - (recurse-wrapped "`" in-code?)] - - [(and (bold? i) (not (in-bold?))) - (recurse-wrapped "**" in-bold?)] - - [(and (italic? i) (not (in-italic?))) - (recurse-wrapped "_" in-italic?)] - - [(and (preserve-spaces? i) (not (preserving-spaces?))) - (parameterize ([preserving-spaces? #t]) - (render-content i part ri))] - - [(and (link? i) (not (in-link?))) - (let ([link (link-from i)]) - (display "[") - (begin0 - (parameterize ([in-link? #t]) - (render-content i part ri)) - (printf "](~a)" (sanitize-parens link))))] - - [else (super render-content i part ri)])) - - (define/override (render-nested-flow i part ri starting-item?) - (define s (nested-flow-style i)) - (unless (memq 'decorative (style-properties s)) - (define note? (equal? (style-name s) "refcontent")) - (when note? - (note-depth (add1 (note-depth)))) - (begin0 (super render-nested-flow i part ri starting-item?) - (when note? - (note-depth (sub1 (note-depth))))))) - - (define/override (render-other i part ht) - (cond - [(symbol? i) - (display (case i - [(mdash) "\U2014"] - [(ndash) "\U2013"] - [(ldquo) "\U201C"] - [(rdquo) "\U201D"] - [(lsquo) "\U2018"] - [(rsquo) "\U2019"] - [(lang) ">"] - [(rang) "<"] - [(rarr) "->"] - [(nbsp) "\uA0"] - [(prime) "'"] - [(alpha) "\u03B1"] - [(infin) "\u221E"] - [else (error 'markdown-render "unknown element symbol: ~e" - i)]))] - [(string? i) - (let* ([i (if (in-code?) - (regexp-replace** i '([#rx"``" . "\U201C"] - [#rx"''" . "\U201D"])) - (regexp-replace* #px"([#_*`\\[\\(\\]\\)]{1})" i "\\\\\\1"))] - [i (if (preserving-spaces?) - (regexp-replace* #rx" " i "\uA0") - i)]) - (display i))] - [else (write i)]) - null) - - (super-new))) - -(define (regexp-replace** str ptns&reps) - (for/fold ([str str]) - ([ptn (map car ptns&reps)] - [rep (map cdr ptns&reps)]) - (regexp-replace* ptn str rep))) - diff --git a/scribble-lib/scribble/pdf-render.rkt b/scribble-lib/scribble/pdf-render.rkt deleted file mode 100644 index fd66cdb1..00000000 --- a/scribble-lib/scribble/pdf-render.rkt +++ /dev/null @@ -1,17 +0,0 @@ -#lang scheme/base - -(require "private/indirect-renderer.rkt" "private/run-pdflatex.rkt" - (prefix-in latex: "latex-render.rkt")) - -(provide render-mixin - dvi-render-mixin) - -(define render-mixin - (make-indirect-renderer-mixin - (λ (%) (latex:render-mixin % #:image-mode 'pdf)) #".tex" #".pdf" - run-pdflatex)) - -(define dvi-render-mixin - (make-indirect-renderer-mixin - (λ (%) (latex:render-mixin % #:image-mode 'ps)) #".tex" #".pdf" - run-dvipdf-latex)) diff --git a/scribble-lib/scribble/private/defaults.rkt b/scribble-lib/scribble/private/defaults.rkt deleted file mode 100644 index 19201ff8..00000000 --- a/scribble-lib/scribble/private/defaults.rkt +++ /dev/null @@ -1,47 +0,0 @@ -#lang scheme/base -(require scribble/core - scribble/latex-properties - scribble/html-properties - setup/collects) - -(provide scribble-file - downloaded-file - add-defaults) - -(define (add-property properties pred new) - (if (ormap pred properties) - properties - (cons new properties))) - -(define (scribble-file s) - (path->collects-relative (collection-file-path s "scribble"))) - -(define (downloaded-file s) - (build-path (find-system-path 'addon-dir) s)) - -(define (add-defaults doc pfx styl extras version? - #:html [html #f] - #:properties [properties null] - #:replacements [replacements #F]) - (struct-copy part doc [style (make-style (style-name (part-style doc)) - ((if version? add-property (lambda (x y z) x)) - (add-property - ((if html add-property (lambda (x y z) x)) - (append - (style-properties (part-style doc)) - properties) - html-defaults? - html) - latex-defaults? - (if replacements - (make-latex-defaults+replacements - pfx - styl - extras - replacements) - (make-latex-defaults - pfx - styl - extras))) - document-version? - (make-document-version (version))))])) diff --git a/scribble-lib/scribble/private/indirect-renderer.rkt b/scribble-lib/scribble/private/indirect-renderer.rkt deleted file mode 100644 index 68371ecf..00000000 --- a/scribble-lib/scribble/private/indirect-renderer.rkt +++ /dev/null @@ -1,47 +0,0 @@ -#lang racket/base - -(require racket/class racket/file racket/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) - ;; set to a temp directory when doing the sub-rendering - (define tmp-dest-dir #f) - (define/override (get-dest-directory create?) - (or tmp-dest-dir (super get-dest-directory create?))) - (define/override (report-output?) - (and (not tmp-dest-dir) (super report-output?))) - (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))) - (when (super report-output?) ; use the original - (printf " [Output to ~a]\n" dst)) - (copy-file (build-path tmp-dir (file-name-from-path dst)) - dst - #t)) - (cleanup))) - (super-new))) diff --git a/scribble-lib/scribble/private/literal-anchor.rkt b/scribble-lib/scribble/private/literal-anchor.rkt deleted file mode 100644 index e7b44564..00000000 --- a/scribble-lib/scribble/private/literal-anchor.rkt +++ /dev/null @@ -1,7 +0,0 @@ -#lang racket/base -(require racket/serialize) - -(provide (all-defined-out)) - -(define-serializable-struct literal-anchor (string) - #:transparent) diff --git a/scribble-lib/scribble/private/lp.rkt b/scribble-lib/scribble/private/lp.rkt deleted file mode 100644 index 3416ce08..00000000 --- a/scribble-lib/scribble/private/lp.rkt +++ /dev/null @@ -1,85 +0,0 @@ -#lang scheme/base - -(require (for-syntax scheme/base syntax/boundmap) - scribble/scheme scribble/decode scribble/manual scribble/struct) - -(begin-for-syntax - ;; maps chunk identifiers to a counter, so we can distinguish multiple uses - ;; of the same name - (define chunk-numbers (make-free-identifier-mapping)) - (define (get-chunk-number id) - (free-identifier-mapping-get chunk-numbers id (lambda () #f))) - (define (inc-chunk-number id) - (free-identifier-mapping-put! chunk-numbers id (+ 1 (free-identifier-mapping-get chunk-numbers id)))) - (define (init-chunk-number id) - (free-identifier-mapping-put! chunk-numbers id 2))) - -(define-syntax-rule (define-chunk chunk-id racketblock) - (define-syntax (chunk-id stx) - (syntax-case stx () - [(_ name expr (... ...)) - ;; no need for more error checking, using chunk for the code will do that - (identifier? #'name) - (let* ([n (get-chunk-number (syntax-local-introduce #'name))] - [str (symbol->string (syntax-e #'name))] - [tag (format "~a:~a" str (or n 1))]) - - (when n - (inc-chunk-number (syntax-local-introduce #'name))) - - (syntax-local-lift-expression #'(quote-syntax (a-chunk name expr (... ...)))) - - (with-syntax ([tag tag] - [str str] - [((for-label-mod (... ...)) (... ...)) - (map (lambda (expr) - (syntax-case expr (require) - [(require mod (... ...)) - (let loop ([mods (syntax->list #'(mod (... ...)))]) - (cond - [(null? mods) null] - [else - (syntax-case (car mods) (for-syntax) - [(for-syntax x (... ...)) - (append (loop (syntax->list #'(x (... ...)))) - (loop (cdr mods)))] - [x - (cons #'x (loop (cdr mods)))])]))] - [else null])) - (syntax->list #'(expr (... ...))))] - - [(rest (... ...)) (if n - #`((subscript #,(format "~a" n))) - #`())]) - #`(begin - (require (for-label for-label-mod (... ...) (... ...))) - #,@(if n - #'() - #'((define-syntax name (make-element-id-transformer - (lambda (stx) #'(chunkref name)))) - (begin-for-syntax (init-chunk-number #'name)))) - (make-splice - (list (make-toc-element - #f - (list (elemtag '(chunk tag) - (bold (italic (racket name)) " ::="))) - (list (smaller (elemref '(chunk tag) #:underline? #f - str - rest (... ...))))) - (racketblock expr (... ...)))))))]))) - -(define-chunk chunk racketblock) -(define-chunk CHUNK RACKETBLOCK) - -(define-syntax (chunkref stx) - (syntax-case stx () - [(_ id) - (identifier? #'id) - (with-syntax ([tag (format "~a:1" (syntax-e #'id))] - [str (format "~a" (syntax-e #'id))]) - #'(elemref '(chunk tag) #:underline? #f str))])) - - -(provide (all-from-out scheme/base - scribble/manual) - chunk CHUNK) diff --git a/scribble-lib/scribble/private/manual-bib.rkt b/scribble-lib/scribble/private/manual-bib.rkt deleted file mode 100644 index 08b25741..00000000 --- a/scribble-lib/scribble/private/manual-bib.rkt +++ /dev/null @@ -1,89 +0,0 @@ -#lang scheme/base -(require racket/contract/base - "../decode.rkt" - "../struct.rkt" - "../basic.rkt" - "on-demand.rkt" - (only-in "../core.rkt" make-style) - "manual-sprop.rkt" - "manual-utils.rkt" - "manual-style.rkt") - -(define-struct a-bib-entry (key val)) - -(provide/contract - [cite ((string?) () #:rest (listof string?) . ->* . element?)] - [bib-entry ((#:key string? #:title (or/c false/c pre-content?)) - (#:is-book? boolean? #:author (or/c false/c pre-content?) - #:location (or/c false/c pre-content?) - #:date (or/c false/c pre-content?) - #:url (or/c false/c pre-content?)) - . ->* . - a-bib-entry?)] - [rename a-bib-entry? bib-entry? (any/c . -> . boolean?)] - [bibliography (() (#:tag string?) #:rest (listof a-bib-entry?) . ->* . part?)]) - -(define (cite key . keys) - (make-element - #f - (list "[" - (let loop ([keys (cons key keys)]) - (if (null? (cdr keys)) - (make-link-element - #f - (list (car keys)) - `(cite ,(car keys))) - (make-element - #f - (list (loop (list (car keys))) - ", " - (loop (cdr keys)))))) - "]"))) - -(define (bib-entry #:key key - #:title title - #:is-book? [is-book? #f] - #:author [author #f] - #:location [location #f] - #:date [date #f] - #:url [url #f]) - (make-a-bib-entry - key - (make-element - "bibentry" - (append - (if author `(,@(decode-content (list author)) ", ") null) - (if is-book? null '(ldquo)) - (if is-book? - (list (italic title)) - (decode-content (list title))) - (if location '(",") '(".")) - (if is-book? null '(rdquo)) - (if location - `(" " ,@(decode-content (list location)) ,(if date "," ".")) - null) - (if date `(" " ,@(decode-content (list date)) ".") null) - (if url `(" " ,(link url (tt url))) null))))) - -(define-on-demand bib-style (make-style "RBibliography" scheme-properties)) - -(define (bibliography #:tag [tag "doc-bibliography"] . citations) - (make-unnumbered-part - #f - `((part ,tag)) - '("Bibliography") - '() - null - (make-flow - (list - (make-table - bib-style - (map (lambda (c) - (let ([key (a-bib-entry-key c)] - [val (a-bib-entry-val c)]) - (list - (to-flow (make-target-element #f `("[" ,key "]") `(cite ,key))) - flow-spacer - (to-flow val)))) - citations)))) - null)) diff --git a/scribble-lib/scribble/private/manual-bind.rkt b/scribble-lib/scribble/private/manual-bind.rkt deleted file mode 100644 index 206a411a..00000000 --- a/scribble-lib/scribble/private/manual-bind.rkt +++ /dev/null @@ -1,273 +0,0 @@ -#lang scheme/base -(require racket/string - racket/format - "../struct.rkt" - "../scheme.rkt" - "../search.rkt" - "../basic.rkt" - "../manual-struct.rkt" - (only-in "../core.rkt" make-style) - "../html-properties.rkt" - "manual-ex.rkt" - racket/contract/base - (for-syntax scheme/base) - (for-label scheme/base - scheme/class)) - -(provide definition-site - libs->taglet - annote-exporting-library - with-exporting-libraries - id-to-target-maker - id-to-form-target-maker - *sig-elem - (struct-out sig) - ;; public: - ; XXX unknown contract - make-binding-redirect-elements - sigelem) -(provide/contract - ; XXX What is return type? - [defidentifier ((identifier?) (#:form? boolean? #:index? boolean? #:show-libs? boolean?) . ->* . any/c)]) - -(define (gen-absolute-tag) - `(abs ,(make-generated-tag))) - -(define-struct sig (id)) - -(define-syntax-rule (sigelem sig elem) - (*sig-elem (quote-syntax sig) 'elem)) - -(define (*sig-elem sig elem #:defn? [defn? #f]) - (let ([s (to-element/no-color elem)]) - (make-delayed-element - (lambda (renderer sec ri) - (let* ([tag (find-scheme-tag sec ri sig #f)] - [taglet (and tag (append (cadr tag) (list elem)))] - [vtag (and tag `(sig-val ,taglet))] - [stag (and tag `(sig-form ,taglet))] - [sd (and stag (resolve-get/tentative sec ri stag))]) - (make-element - symbol-color - (list - (cond [sd (make-link-element (if defn? syntax-def-color syntax-link-color) (list s) stag)] - [vtag (make-link-element (if defn? value-def-color value-link-color) (list s) vtag)] - [else s]))))) - (lambda () s) - (lambda () s)))) - -(define hovers (make-weak-hasheq)) -(define (intern-hover-style text) - (let ([text (datum-intern-literal text)]) - (or (hash-ref hovers text #f) - (let ([s (make-style #f (list (make-hover-property text)))]) - (hash-set! hovers text s) - s)))) - -(define (annote-exporting-library e) - (make-delayed-element - (lambda (render p ri) - (let ([from (resolve-get/tentative p ri '(exporting-libraries #f))]) - (if (and from (pair? from)) - (make-element - (intern-hover-style - (string-append - "Provided from: " - (string-join (map ~s from) ", ") - (let ([from-pkgs (resolve-get/tentative p ri '(exporting-packages #f))]) - (if (and from-pkgs (pair? from-pkgs)) - (string-append - " | Package: " - (string-join (map ~a from-pkgs) ", ")) - "")))) - e) - e))) - (lambda () e) - (lambda () e))) - -(define (get-exporting-libraries render p ri) - (resolve-get/tentative p ri '(exporting-libraries #f))) - -(define (with-exporting-libraries proc) - (make-delayed-index-desc - (lambda (render part ri) - (proc (or (get-exporting-libraries render part ri) null))))) - -(define (definition-site name stx-id form?) - (let ([sig (current-signature)]) - (define (gen defn?) - (if sig - (*sig-elem #:defn? defn? (sig-id sig) name) - ((if defn? annote-exporting-library values) - (to-element #:defn? defn? (make-just-context name stx-id))))) - (values (gen #t) (gen #f)))) - -(define checkers (make-hash)) - -(define (libs->taglet id libs source-libs) - (let ([lib - (or (ormap (lambda (lib) - (let ([checker - (hash-ref - checkers lib - (lambda () - (let ([ns-id - (let ([ns (make-base-empty-namespace)]) - (parameterize ([current-namespace ns]) - ;; A `(namespace-require `(for-label ,lib))` can - ;; fail if `lib` provides different bindings of the - ;; same name at different phases. We can require phases - ;; 1 and 0 separately, in which case the phase-0 - ;; binding shadows the phase-1 one in that case. - ;; This strategy only works for documenting bindings - ;; at phases 0 and 1, though. - (namespace-require `(just-meta 1 (for-label ,lib))) - (namespace-require `(just-meta 0 (for-label ,lib))) - (namespace-syntax-introduce (datum->syntax #f 'x))))]) - (let ([checker - (lambda (id) - (free-label-identifier=? - (datum->syntax ns-id (syntax-e id)) - id))]) - (hash-set! checkers lib checker) - checker))))]) - (and (checker id) lib))) - (or source-libs null)) - (and (pair? libs) (car libs)))]) - (and lib (module-path-index->taglet - (module-path-index-join lib #f))))) - -(define (id-to-target-maker id dep?) - (*id-to-target-maker 'def id dep?)) - -(define (id-to-form-target-maker id dep?) - (*id-to-target-maker 'form id dep?)) - -(define (*id-to-target-maker sym id dep?) - (let ([sig (current-signature)]) - (lambda (content mk) - (make-part-relative-element - (lambda (ci) - (let ([e (ormap (lambda (p) - (ormap (lambda (e) - (and (exporting-libraries? e) e)) - (part-to-collect p))) - (collect-info-parents ci))]) - (unless e - ;; Call raise-syntax-error to capture error message: - (with-handlers ([exn:fail:syntax? - (lambda (exn) - (eprintf "~a\n" (exn-message exn)))]) - (raise-syntax-error - 'WARNING - "no declared exporting libraries for definition" id))) - (if e - (let* ([lib-taglet (libs->taglet - (if sig (sig-id sig) id) - (exporting-libraries-libs e) - (exporting-libraries-source-libs e))] - [tag (intern-taglet - (list (if sig - (case sym - [(def) 'sig-val] - [(form) 'sig-def]) - sym) - `(,lib-taglet - ,@(if sig (list (syntax-e (sig-id sig))) null) - ,(syntax-e id))))]) - (if (or sig (not dep?)) - (mk tag) - (make-dep (list lib-taglet (syntax-e id)) - (mk tag)))) - content))) - (lambda () content) - (lambda () content))))) - -(define (defidentifier id - #:form? [form? #f] - #:index? [index? #t] - #:show-libs? [show-libs? #t]) - ;; This function could have more optional argument to select - ;; whether to index the id, include a toc link, etc. - (let ([dep? #t]) - (let ([maker (if form? - (id-to-form-target-maker id dep?) - (id-to-target-maker id dep?))]) - (define-values (elem elem-ref) - (if show-libs? - (definition-site (syntax-e id) id form?) - (values (to-element id #:defn? #t) - (to-element id)))) - (if maker - (maker elem - (lambda (tag) - (let ([elem - (if index? - (make-index-element - #f (list elem) tag - (list (datum-intern-literal (symbol->string (syntax-e id)))) - (list elem) - (and show-libs? - (with-exporting-libraries - (lambda (libs) - (make-exported-index-desc (syntax-e id) - libs))))) - elem)]) - (make-target-element #f (list elem) tag)))) - elem)))) - -(define (make-binding-redirect-elements mod-path redirects) - (let ([taglet (module-path-index->taglet - (module-path-index-join mod-path #f))]) - (make-element - #f - (map - (lambda (redirect) - (let ([id (car redirect)] - [form? (cadr redirect)] - [path (caddr redirect)] - [anchor (cadddr redirect)]) - (let ([make-one - (lambda (kind) - (make-redirect-target-element - #f - null - (intern-taglet (list kind (list taglet id))) - path - anchor))]) - (make-element - #f - (list (make-one (if form? 'form 'def)) - (make-dep (list taglet id) null) - (let ([str (datum-intern-literal (symbol->string id))]) - (make-index-element #f - null - (intern-taglet - (list (if form? 'form 'def) - (list taglet id))) - (list str) - (list - (make-element - symbol-color - (list - (make-element - (if form? - syntax-link-color - value-link-color) - (list str))))) - ((if form? - make-form-index-desc - make-procedure-index-desc) - id - (list mod-path))))))))) - redirects)))) - - -(define (make-dep t content) - (make-collect-element - #f - content - (lambda (ci) - (collect-put! ci - (intern-taglet (list 'dep t)) - #t)))) diff --git a/scribble-lib/scribble/private/manual-class-struct.rkt b/scribble-lib/scribble/private/manual-class-struct.rkt deleted file mode 100644 index 40c41dbf..00000000 --- a/scribble-lib/scribble/private/manual-class-struct.rkt +++ /dev/null @@ -1,8 +0,0 @@ -#lang racket/base -(require racket/serialize) - -(provide (all-defined-out)) - -(define-serializable-struct cls/intf - (name-element app-mixins super intfs methods) - #:transparent) diff --git a/scribble-lib/scribble/private/manual-class.rkt b/scribble-lib/scribble/private/manual-class.rkt deleted file mode 100644 index a9358f2c..00000000 --- a/scribble-lib/scribble/private/manual-class.rkt +++ /dev/null @@ -1,530 +0,0 @@ -#lang scheme/base -(require "../decode.rkt" - "../struct.rkt" - "../scheme.rkt" - "../search.rkt" - "../basic.rkt" - "../manual-struct.rkt" - "qsloc.rkt" - scheme/serialize - scheme/stxparam - "manual-utils.rkt" - "manual-style.rkt" - "manual-scheme.rkt" - "manual-bind.rkt" - "manual-method.rkt" - "manual-proc.rkt" - "manual-vars.rkt" - "manual-class-struct.rkt" - scheme/list - (for-syntax scheme/base) - (for-label scheme/base - scheme/class)) - -(provide defclass - defclass/title - definterface - definterface/title - defmixin - defmixin/title - defconstructor - defconstructor/make - defconstructor*/make - defconstructor/auto-super - defmethod - defmethod* - methspec - methimpl - this-obj - method xmethod (rename-out [method ::])) - -(define-syntax-parameter current-class #f) - -(define-struct decl (name super app-mixins intfs ranges mk-head body)) -(define-struct constructor (def)) -(define-struct meth (names mode def)) -(define-struct spec (def)) -(define-struct impl (def)) - -(define (id-info id) - (let ([b (identifier-label-binding id)]) - (if b - (list (caddr b) - (list-ref b 3) - (list-ref b 4) - (list-ref b 5) - (list-ref b 6)) - (error 'scribble "no class/interface/mixin information for identifier: ~e" - id)))) - -(define (make-inherited-table r d ri decl) - (define start - (let ([key (find-scheme-tag d ri (decl-name decl) #f)]) - (if key (list (cons key (lookup-cls/intf d ri key))) null))) - (define supers - (if (null? start) - null - (cdr - (let loop ([supers start][accum null]) - (cond - [(null? supers) (reverse accum)] - [(assoc (caar supers) accum) - (loop (cdr supers) accum)] - [else - (let ([super (car supers)]) - (loop (append (filter-map - (lambda (i) - (let ([key (find-scheme-tag d ri i #f)]) - (and key - (cons key (lookup-cls/intf d ri key))))) - (append - (reverse (cls/intf-intfs (cdr super))) - (if (cls/intf-super (cdr super)) - (list (cls/intf-super (cdr super))) - null) - (reverse (cls/intf-app-mixins (cdr super))))) - (cdr supers)) - (cons super accum)))]))))) - (define ht - (let ([ht (make-hasheq)]) - (for* ([i (decl-body decl)] - #:when (meth? i) - [name (meth-names i)]) - (hash-set! ht name #t)) - ht)) - (define inh - (append-map - (lambda (super) - (let ([inh (filter-map - (lambda (k) - (if (hash-ref ht k #f) - #f - (begin (hash-set! ht k #t) - (cons (datum-intern-literal (symbol->string k)) - (**method k (car super)))))) - (cls/intf-methods (cdr super)))]) - (if (null? inh) - null - (cons (make-element #f (list (make-element "inheritedlbl" '("from ")) - (cls/intf-name-element (cdr super)))) - (map cdr (sort inh stringstring (syntax-e (decl-name decl))))) - tag))) - (map id-info (decl-app-mixins decl)) - (and (decl-super decl) - (not (free-label-identifier=? (quote-syntax object%) - (decl-super decl))) - (id-info (decl-super decl))) - (map id-info (decl-intfs decl)) - (append-map (lambda (m) - (let loop ([l (meth-names m)]) - (cond [(null? l) null] - [(memq (car l) (cdr l)) (loop (cdr l))] - [else (cons (car l) (loop (cdr l)))]))) - (filter meth? (decl-body decl)))))))))) - null)) - -(define (build-body decl body) - `(,@(map (lambda (i) - (cond [(constructor? i) ((constructor-def i))] - [(meth? i) ((meth-def i))] - [else i])) - body) - ,(make-delayed-block (lambda (r d ri) (make-inherited-table r d ri decl))))) - -(define (*include-class/title decl link?) - (make-splice - (list* (title #:style 'hidden (to-element (decl-name decl))) - (make-decl-collect decl link?) - (build-body decl (append ((decl-mk-head decl) #t) - (decl-body decl)))))) - -(define (*include-class decl link?) - (make-splice - (cons - (make-decl-collect decl link?) - (append - ((decl-mk-head decl) #f) - (let-values ([(pre post) - (let loop ([l (decl-body decl)][accum null]) - (cond - [(null? l) (values (reverse accum) null)] - [(or (constructor? (car l)) (meth? (car l))) - (values (reverse accum) l)] - [else (loop (cdr l) (cons (car l) accum))]))]) - (append - (flow-paragraphs (decode-flow pre)) - (list - (make-blockquote - "leftindent" - (flow-paragraphs - (decode-flow (build-body decl post))))))))))) - -(define (*class-doc kind stx-id super intfs ranges whole-page? make-index-desc link?) - (make-table - boxed-style - (append - (list - (list - ((add-background-label (symbol->string kind)) - (make-flow - (list - (make-omitable-paragraph - (list (if link? - (let ([target-maker (id-to-target-maker stx-id #t)] - [content (annote-exporting-library - (to-element #:defn? #t stx-id))] - [ref-content (to-element stx-id)]) - (if target-maker - (target-maker - content - (lambda (tag) - ((if whole-page? - make-page-target-element - (lambda (s c t) - (make-toc-target2-element s c t ref-content))) - #f - (list - (make-index-element - #f content tag - (list (datum-intern-literal - (symbol->string (syntax-e stx-id)))) - (list ref-content) - (with-exporting-libraries - (lambda (libs) - (make-index-desc (syntax-e stx-id) libs))))) - tag))) - content)) - (to-element stx-id)) - spacer ":" spacer - (case kind - [(class) (racket class?)] - [(interface) (racket interface?)] - [(mixin) (racketblockelem (class? . -> . class?))])))))))) - (if super - (list - (list (make-flow - (list (t (hspace 2) "superclass:" spacer (to-element super)))))) - null) - (let ([show-intfs - (lambda (intfs range?) - (if (null? intfs) - null - (list - (list - (make-flow - (list - (make-table - #f - (cons - (list (make-flow - (list (make-omitable-paragraph - (list (hspace 2) - (case kind - [(interface) "implements:"] - [(class) "extends:"] - [(mixin) - (if range? - "result implements:" - "argument extends/implements:")]) - spacer)))) - (to-flow (to-element (car intfs)))) - (map (lambda (i) - (list flow-spacer (to-flow (to-element i)))) - (cdr intfs))))))))))]) - (append (show-intfs intfs #f) (show-intfs ranges #t)))))) - -(define-syntax extract-super - (syntax-rules () - [(_ (mixin base)) (extract-super base)] - [(_ super) (quote-syntax/loc super)])) - -(define-syntax extract-app-mixins - (syntax-rules () - [(_ (mixin base)) (cons (quote-syntax/loc mixin) (extract-app-mixins base))] - [(_ super) null])) - -(define (flatten-splices l) - (let loop ([l l]) - (cond [(null? l) null] - [(splice? (car l)) (append (splice-run (car l)) (loop (cdr l)))] - [else (cons (car l) (loop (cdr l)))]))) - -(define-syntax-rule (*defclass *include-class link-target? name super (intf ...) body ...) - (let ([link? link-target?]) - (*include-class - (syntax-parameterize ([current-class (quote-syntax name)]) - (make-decl (quote-syntax/loc name) - (extract-super super) - (extract-app-mixins super) - (list (quote-syntax/loc intf) ...) - null - (lambda (whole-page?) - (list (*class-doc 'class - (quote-syntax/loc name) - (quote-syntax/loc super) - (list (quote-syntax intf) ...) - null - whole-page? - make-class-index-desc - link?))) - (flatten-splices (list body ...)))) - link?))) - -(define-syntax defclass - (syntax-rules () - [(_ #:link-target? link-target? name super (intf ...) body ...) - (*defclass *include-class link-target? name super (intf ...) body ...)] - [(_ name super (intf ...) body ...) - (defclass #:link-target? #t name super (intf ...) body ...)])) - -(define-syntax defclass/title - (syntax-rules () - [(_ #:link-target? link-target? name super (intf ...) body ...) - (*defclass *include-class/title link-target? name super (intf ...) body ...)] - [(_ name super (intf ...) body ...) - (defclass/title #:link-target? #t name super (intf ...) body ...)])) - -(define-syntax-rule (*definterface *include-class name (intf ...) body ...) - (let ([link? #t]) - (*include-class - (syntax-parameterize ([current-class (quote-syntax name)]) - (make-decl (quote-syntax/loc name) - #f - null - (list (quote-syntax/loc intf) ...) - null - (lambda (whole-page?) - (list - (*class-doc 'interface - (quote-syntax/loc name) - #f - (list (quote-syntax intf) ...) - null - whole-page? - make-interface-index-desc - link?))) - (list body ...))) - link?))) - -(define-syntax-rule (definterface name (intf ...) body ...) - (*definterface *include-class name (intf ...) body ...)) - -(define-syntax-rule (definterface/title name (intf ...) body ...) - (*definterface *include-class/title name (intf ...) body ...)) - -(define-syntax-rule (*defmixin *include-class name (domain ...) (range ...) - body ...) - (let ([link? #t]) - (*include-class - (syntax-parameterize ([current-class (quote-syntax name)]) - (make-decl (quote-syntax/loc name) - #f - null - (list (quote-syntax/loc domain) ...) - (list (quote-syntax/loc range) ...) - (lambda (whole-page?) - (list - (*class-doc 'mixin - (quote-syntax/loc name) - #f - (list (quote-syntax domain) ...) - (list (quote-syntax range) ...) - whole-page? - make-mixin-index-desc - link?))) - (list body ...))) - link?))) - -(define-syntax-rule (defmixin name (domain ...) (range ...) body ...) - (*defmixin *include-class name (domain ...) (range ...) body ...)) - -(define-syntax-rule (defmixin/title name (domain ...) (range ...) body ...) - (*defmixin *include-class/title name (domain ...) (range ...) body ...)) - -(define-syntax (defconstructor*/* stx) - (syntax-case stx () - [(_ mode ((arg ...) ...) desc ...) - (let ([n (syntax-parameter-value #'current-class)]) - (with-syntax ([name n] - [result - (datum->syntax - #f - (list - (datum->syntax #'is-a?/c 'is-a?/c (list 'src 1 1 2 1)) - (datum->syntax n (syntax-e n) (list 'src 1 3 4 1))) - (list 'src 1 0 1 5))] - [(((kw ...) ...) ...) - (map (lambda (ids) - (map (lambda (arg) - (if (and (pair? (syntax-e arg)) - (eq? (syntax-e #'mode) 'new)) - (list (string->keyword - (symbol->string - (syntax-e - (car (syntax-e arg)))))) - null)) - (syntax->list ids))) - (syntax->list #'((arg ...) ...)))]) - #'(make-constructor (lambda () - (defproc* #:mode mode #:within name - [[(make [kw ... . arg] ...) result] ...] - desc ...)))))])) - -(define-syntax (defconstructor stx) - (syntax-case stx () - [(_ ([id . arg-rest] ...) desc ...) - #'(defconstructor*/* new (([id . arg-rest] ...)) desc ...)])) - -(define-syntax (defconstructor/make stx) - (syntax-case stx () - [(_ ([id . arg-rest] ...) desc ...) - #'(defconstructor*/* make (([id . arg-rest] ...)) desc ...)])) - -(define-syntax (defconstructor*/make stx) - (syntax-case stx () - [(_ (([id . arg-rest] ...) ...) desc ...) - #'(defconstructor*/* make (([id . arg-rest] ...) ...) desc ...)])) - -(define-syntax (defconstructor/auto-super stx) - (syntax-case stx () - [(_ ([id . arg-rest] ...) desc ...) - #'(defconstructor*/* new (([id . arg-rest] ... _...superclass-args...)) - desc ...)])) - -(define-syntax (defmethod* stx) - (syntax-case stx () - [(_ #:mode mode #:link-target? link-target? ([(name arg ...) result-type] ...) desc ...) - (with-syntax ([cname (syntax-parameter-value #'current-class)] - [name1 (car (syntax->list #'(name ...)))]) - (with-syntax ([(extra ...) - (let ([finality - (lambda () - (case (syntax-e #'mode) - [(override-final public-final extend-final) - #'(" This method is final, so it cannot be overiddden.")] - [(augment-final) - #'(" This method is final, so it cannot be augmented.")] - [else null]))]) - (case (syntax-e #'mode) - [(pubment) - #'((t "Refine this method with " - (racket augment) "."))] - [(override override-final extend augment) - #`((t (case (syntax-e #'mode) - [(override override-final) "Overrides "] - [(extend extend-final) "Extends "] - [(augment augment-final) "Augments "]) - (*xmethod/super (quote-syntax/loc cname) 'name1) - "." - #,@(finality)))] - [else null]))]) - #'(make-meth '(name ...) - 'mode - (lambda () - (defproc* #:link-target? link-target? #:mode send #:within cname - ([(name arg ...) result-type] ...) - (make-splice - (append-map (lambda (f) - (cond [(impl? f) ((impl-def f))] - [(spec? f) ((spec-def f))] - [else (list f)])) - (list extra ... desc ...))))))))] - [(_ #:mode mode ([(name arg ...) result-type] ...) desc ...) - #'(defmethod* #:mode mode #:link-target? #t ([(name arg ...) result-type] ...) desc ...)] - [(_ #:link-target? link-target? ([(name arg ...) result-type] ...) desc ...) - #'(defmethod* #:mode public #:link-target? link-target? ([(name arg ...) result-type] ...) desc ...)] - [(_ ([(name arg ...) result-type] ...) desc ...) - #'(defmethod* #:mode public ([(name arg ...) result-type] ...) desc ...)])) - -(define-syntax defmethod - (syntax-rules () - [(_ #:mode mode #:link-target? link-target? (name arg ...) result-type desc ...) - (defmethod* #:mode mode #:link-target? link-target? ([(name arg ...) result-type]) desc ...)] - [(_ #:mode mode (name arg ...) result-type desc ...) - (defmethod #:mode mode #:link-target? #t (name arg ...) result-type desc ...)] - [(_ #:link-target? link-target? (name arg ...) result-type desc ...) - (defmethod #:mode public #:link-target? link-target? (name arg ...) result-type desc ...)] - [(_ (name arg ...) result-type desc ...) - (defmethod #:mode public #:link-target? #t (name arg ...) result-type desc ...)])) - -(define-syntax-rule (methimpl body ...) - (make-impl (lambda () (list (italic "Default implementation:") " " body ...)))) - -(define-syntax-rule (methspec body ...) - (make-spec (lambda () (list (italic "Specification:") " " body ...)))) - -(define (*this-obj cname) - (name-this-object cname)) - -(define-syntax (this-obj stx) - (syntax-case stx () - [(_) - (with-syntax ([cname (syntax-parameter-value #'current-class)]) - #'(*this-obj 'cname))])) - -(define (*xmethod/super cname name) - (let ([get - (lambda (d ri key) - (if key - (let ([v (lookup-cls/intf d ri key)]) - (if v - (append (cls/intf-app-mixins v) - (cons (cls/intf-super v) - (cls/intf-intfs v))) - null)) - null))]) - (make-delayed-element - (lambda (r d ri) - (let loop ([search (get d ri (find-scheme-tag d ri cname #f))]) - (cond - [(null? search) - (list (make-element #f '("")))] - [(not (car search)) - (loop (cdr search))] - [else - (let* ([a-key (find-scheme-tag d ri (car search) #f)] - [v (and a-key (lookup-cls/intf d ri a-key))]) - (if v - (if (member name (cls/intf-methods v)) - (list - (make-element #f - (list (**method name a-key) - " in " - (cls/intf-name-element v)))) - (loop (append (cdr search) - (get d ri (find-scheme-tag d ri (car search) - #f))))) - (loop (cdr search))))]))) - (lambda () (format "~a in ~a" (syntax-e cname) name)) - (lambda () (format "~a in ~a" (syntax-e cname) name))))) - -(define (lookup-cls/intf d ri tag) - (let ([v (resolve-get d ri `(cls/intf ,(cadr tag)))]) - (or v (make-cls/intf "unknown" null #f null null)))) diff --git a/scribble-lib/scribble/private/manual-code.rkt b/scribble-lib/scribble/private/manual-code.rkt deleted file mode 100644 index e17b0779..00000000 --- a/scribble-lib/scribble/private/manual-code.rkt +++ /dev/null @@ -1,373 +0,0 @@ -#lang racket/base -(require syntax/strip-context - syntax-color/module-lexer - syntax-color/lexer-contract - "../racket.rkt" - "../base.rkt" - "manual-scheme.rkt" - "manual-style.rkt" - scribble/core - (for-syntax racket/base - syntax/parse)) - -(provide codeblock - codeblock0 - typeset-code - code) - -(define-for-syntax (do-codeblock stx) - (syntax-parse stx - [(_ (~seq (~or (~optional (~seq #:expand expand-expr:expr) - #:defaults ([expand-expr #'#f]) - #:name "#:expand keyword") - (~optional (~seq #:indent indent-expr:expr) - #:defaults ([indent-expr #'0]) - #:name "#:expand keyword") - (~optional (~seq #:keep-lang-line? keep-lang-line?-expr:expr) - #:defaults ([keep-lang-line?-expr #'#t]) - #:name "#:keep-lang-line? keyword") - (~optional (~seq #:context context-expr:expr) - #:name "#:context keyword") - (~optional (~seq #:line-numbers line-numbers:expr) - #:defaults ([line-numbers #'#f]) - #:name "#:line-numbers keyword") - (~optional (~seq #:line-number-sep line-number-sep:expr) - #:defaults ([line-number-sep #'1]) - #:name "#:line-number-sep keyword")) - ...) - str ...) - #`(typeset-code str ... - #:expand expand-expr - #:keep-lang-line? keep-lang-line?-expr - #:indent indent-expr - #:context #,(if (attribute context-expr) - #'context-expr - (or - (let ([v #'(str ...)]) - (and (pair? (syntax-e v)) - #`#'#,(car (syntax-e v)))) - #'#f)) - #:line-numbers line-numbers - #:line-number-sep line-number-sep)])) - -(define-syntax (codeblock stx) #`(code-inset #,(do-codeblock stx))) -(define-syntax (codeblock0 stx) (do-codeblock stx)) - -(define (typeset-code #:context [context #f] - #:expand [expand #f] - #:indent [indent 2] - #:keep-lang-line? [keep-lang-line? #t] - #:line-numbers [line-numbers #f] - #:line-number-sep [line-number-sep 1] - #:block? [block? #t] - . strs) - (define-values (tokens bstr) (get-tokens strs context expand)) - (define default-color meta-color) - ((if block? table (lambda (style lines) (make-element #f lines))) - block-color - ((if keep-lang-line? values cdr) ; FIXME: #lang can span lines - (list->lines - indent - #:line-numbers line-numbers - #:line-number-sep line-number-sep - #:block? block? - (let loop ([pos 0] - [tokens tokens]) - (cond - [(null? tokens) (split-lines default-color (substring bstr pos))] - [(eq? (caar tokens) 'white-space) (loop pos (cdr tokens))] - [(= pos (cadar tokens)) - (append (let ([style (caar tokens)] - [get-str (lambda () - (substring bstr (cadar tokens) (caddar tokens)))]) - (cond - [(symbol? style) - (let ([scribble-style - (case style - [(symbol) symbol-color] - [(parenthesis hash-colon-keyword) paren-color] - [(constant string) value-color] - [(comment) comment-color] - [else default-color])]) - (split-lines scribble-style (get-str)))] - [(procedure? style) - (list (style (get-str)))] - [else (list style)])) - (loop (caddar tokens) (cdr tokens)))] - [(> pos (cadar tokens)) - (loop pos (cdr tokens))] - [else (append - (split-lines default-color (substring bstr pos (cadar tokens))) - (loop (cadar tokens) tokens))])))))) - -;; (listof string) boolean boolean -> tokens string -;; tokens is a -;; (listof (list T natural natural natural)) -;; T being a symbol returned as a token type from the languages lexer -;; OR a function created by get-tokens -;; the first number being the start position -;; the second being the end position -;; the third 0 if T is a symbol, and 1 or greater if its a function or element -;; the tokens are sorted by the start end end positions -(define (get-tokens strs context expand) - (let* ([xstr (apply string-append strs)] - [bstr (regexp-replace* #rx"(?m:^$)" xstr "\xA0")] - [in (open-input-string bstr)]) - (port-count-lines! in) - (let* ([tokens - (let loop ([mode #f]) - (let-values ([(lexeme type data start end backup-delta mode) - (module-lexer in 0 mode)]) - (if (equal? type 'eof) - null - (cons (list type (sub1 start) (sub1 end) 0) - (loop (if (dont-stop? mode) - (dont-stop-val mode) - mode))))))] - [program-source 'prog] - [e (parameterize ([read-accept-reader #t]) - ((or expand - (lambda (stx) - (if context - (replace-context context stx) - stx))) - (let ([p (open-input-string bstr)]) - (port-count-lines! p) - (let loop () - (let ([v (read-syntax program-source p)]) - (cond - [expand v] - [(eof-object? v) null] - [else (datum->syntax #f (cons v (loop)) v v)]))))))] - [ids (let loop ([e e]) - (cond - [(and (identifier? e) - (syntax-original? e) - (syntax-position e) - (eq? program-source (syntax-source e))) - (let ([pos (sub1 (syntax-position e))]) - (list (list (lambda (str) - (to-element (syntax-property - e - 'display-string - str) - #:escapes? #f)) - pos - (+ pos (syntax-span e)) - 1)))] - [(syntax? e) (append (loop (syntax-e e)) - (loop (or (syntax-property e 'origin) - null)) - (loop (or (syntax-property e 'disappeared-use) - null)))] - [(pair? e) (append (loop (car e)) (loop (cdr e)))] - [else null]))] - [link-mod (lambda (mp-stx priority #:orig? [always-orig? #f]) - (if (or always-orig? - (syntax-original? mp-stx)) - (let ([mp (syntax->datum mp-stx)] - [pos (sub1 (syntax-position mp-stx))]) - (list (list (racketmodname #,mp) - pos - (+ pos (syntax-span mp-stx)) - priority))) - null))] - ;; This makes sense when `expand' actually expands, and - ;; probably not otherwise: - [mods (let loop ([e e]) - (syntax-case e (module #%require begin) - [(module name lang (mod-beg form ...)) - (apply append - (link-mod #'lang 2) - (map loop (syntax->list #'(form ...))))] - [(#%require spec ...) - (apply append - (map (lambda (spec) - ;; Need to add support for renaming forms, etc.: - (if (module-path? (syntax->datum spec)) - (link-mod spec 2) - null)) - (syntax->list #'(spec ...))))] - [(begin form ...) - (apply append - (map loop (syntax->list #'(form ...))))] - [else null]))] - [has-hash-lang? (regexp-match? #rx"^#lang " bstr)] - [hash-lang (if has-hash-lang? - (list (list (hash-lang) - 0 - 5 - 1) - (list 'white-space 5 6 0)) - null)] - [language (if has-hash-lang? - (let ([m (regexp-match #rx"^#lang ([-0-9a-zA-Z/._+]+)" bstr)]) - (if m - (link-mod - #:orig? #t - (datum->syntax #f - (string->symbol (cadr m)) - (vector 'in 1 6 7 (string-length (cadr m)))) - 3) - null)) - null)] - [tokens (sort (append ids - mods - hash-lang - language - (filter (lambda (x) (not (eq? (car x) 'symbol))) - (if has-hash-lang? - ;; Drop #lang entry: - (cdr tokens) - tokens))) - (lambda (a b) - (or (< (cadr a) (cadr b)) - (and (= (cadr a) (cadr b)) - (> (cadddr a) (cadddr b))))))]) - (values tokens bstr)))) - -(define (typeset-code-line context expand lang-line . strs) - (typeset-code - #:context context - #:expand expand - #:keep-lang-line? (not lang-line) - #:block? #f - #:indent 0 - (let ([s (regexp-replace* #px"(?:\\s*(?:\r|\n|\r\n)\\s*)+" (apply string-append strs) " ")]) - (if lang-line - (string-append "#lang " lang-line "\n" s) - s)))) - -(define-syntax (code stx) - (syntax-parse stx - [(_ (~seq (~or (~optional (~seq #:expand expand-expr:expr) - #:defaults ([expand-expr #'#f]) - #:name "#:expand keyword") - (~optional (~seq #:context context-expr:expr) - #:name "#:context keyword") - (~optional (~seq #:lang lang-line-expr:expr) - #:defaults ([lang-line-expr #'#f]) - #:name "#:lang-line keyword")) - ...) - str ...) - #`(typeset-code-line #,(if (attribute context-expr) - #'context-expr - (or - (let ([v #'(str ...)]) - (and (pair? (syntax-e v)) - #`#'#,(car (syntax-e v)))) - #'#f)) - expand-expr - lang-line-expr - str ...)])) - -(define (split-lines style s) - (cond - [(regexp-match-positions #rx"(?:\r\n|\r|\n)" s) - => (lambda (m) - (append (split-lines style (substring s 0 (caar m))) - (list 'newline) - (split-lines style (substring s (cdar m)))))] - [(regexp-match-positions #rx" +" s) - => (lambda (m) - (append (split-lines style (substring s 0 (caar m))) - (list (hspace (- (cdar m) (caar m)))) - (split-lines style (substring s (cdar m)))))] - [else (list (element style s))])) - -(define omitable (make-style #f '(omitable))) - -(define (list->lines indent-amt l - #:line-numbers line-numbers - #:line-number-sep line-number-sep - #:block? block?) - (define indent-elem (if (zero? indent-amt) - "" - (hspace indent-amt))) - ;(list of any) delim -> (list of (list of any)) - (define (break-list lst delim) - (let loop ([l lst] [n null] [c null]) - (cond - [(null? l) (reverse (if (null? c) n (cons (reverse c) n)))] - [(eq? delim (car l)) (loop (cdr l) (cons (reverse c) n) null)] - [else (loop (cdr l) n (cons (car l) c) )]))) - - (define lines (break-list l 'newline)) - (define line-cnt (length lines)) - (define line-cntl (string-length (format "~a" (+ line-cnt (or line-numbers 0))))) - - (define (prepend-line-number n r) - (define ln (format "~a" n)) - (define lnl (string-length ln)) - (define diff (- line-cntl lnl)) - (define l1 (list (tt ln) (hspace line-number-sep))) - (cons (make-element 'smaller - (make-element 'smaller - (if (not (zero? diff)) - (cons (hspace diff) l1) - l1))) - r)) - - (define (make-line accum-line line-number) - (define rest (cons indent-elem accum-line)) - (list ((if block? paragraph (lambda (s e) e)) - omitable - (if line-numbers - (prepend-line-number line-number rest) - rest)))) - - (for/list ([l (break-list l 'newline)] - [i (in-naturals (or line-numbers 1))]) - (make-line l i))) - - -;; ---------------------------------------- - -(module+ test - (require racket/list - racket/match - rackunit) - - (define (tokens strs) - (define-values (toks _) (get-tokens strs #f #f)) - (for/list ([tok (in-list toks)]) - (match tok - [(list _ start end (or 1 2 3)) - (list 'function start end 1)] ; this looses information - [_ tok]))) - - (define (make-test-result lst) - (define-values (res _) - (for/fold ([result null] [count 12]) - ([p lst]) - (define next (+ count (second p))) - (define r (if (eq? (first p) 'function) 1 0)) - (values - (cons (list (first p) count next r) result) - next))) - (list* `(function 0 5 1) `(white-space 5 6 0) `(function 6 12 1) `(function 6 12 1) - (reverse res))) - - (check-equal? - (tokens (list "#lang racket\n1")) - `((function 0 5 1) (white-space 5 6 0) ;"#lang " - (function 6 12 1) (function 6 12 1) (white-space 12 13 0) ;"racket\n" - (constant 13 14 0))) ; "1" - (check-equal? - (tokens (list "#lang racket\n" "(+ 1 2)")) - (make-test-result - '((white-space 1) - (parenthesis 1) (function 1) - (white-space 1) (constant 1) (white-space 1) (constant 1) - (parenthesis 1)))) - (check-equal? - (tokens (list "#lang racket\n(apply x (list y))")) - (make-test-result - '((white-space 1) - (parenthesis 1) - (function 5) (white-space 1);apply - (function 1) (white-space 1);x - (parenthesis 1) - (function 4) (white-space 1) (function 1);list y - (parenthesis 1) - (parenthesis 1))))) diff --git a/scribble-lib/scribble/private/manual-defaults.rkt b/scribble-lib/scribble/private/manual-defaults.rkt deleted file mode 100644 index 809d18dd..00000000 --- a/scribble-lib/scribble/private/manual-defaults.rkt +++ /dev/null @@ -1,27 +0,0 @@ -#lang scheme/base -(require scribble/core - scribble/html-properties - "defaults.rkt" - "on-demand.rkt") - -(provide post-process - manual-doc-style) - -(define (post-process doc) - (add-defaults doc - (scribble-file "manual-prefix.tex") - (scribble-file "manual-style.tex") - null - #:html (html-defaults (scribble-file "scribble-prefix.html") - (scribble-file "manual-style.css") - (list - (scribble-file "manual-fonts.css"))) - #:properties (list - (css-style-addition - (scribble-file "manual-racket.css")) - (js-style-addition - (scribble-file "manual-racket.js"))) - #t)) - -(define-on-demand manual-doc-style - (part-style (post-process (part #f null #f plain null null null)))) diff --git a/scribble-lib/scribble/private/manual-ex.rkt b/scribble-lib/scribble/private/manual-ex.rkt deleted file mode 100644 index 3cf64453..00000000 --- a/scribble-lib/scribble/private/manual-ex.rkt +++ /dev/null @@ -1,10 +0,0 @@ -#lang scheme/base -(require "../struct.rkt") - -; XXX unknown contracts -(provide (struct-out exporting-libraries) - current-signature) - -(define-struct (exporting-libraries element) (libs source-libs pkgs)) - -(define current-signature (make-parameter #f)) diff --git a/scribble-lib/scribble/private/manual-form.rkt b/scribble-lib/scribble/private/manual-form.rkt deleted file mode 100644 index e4c45ae0..00000000 --- a/scribble-lib/scribble/private/manual-form.rkt +++ /dev/null @@ -1,450 +0,0 @@ -#lang scheme/base -(require "../decode.rkt" - "../struct.rkt" - "../scheme.rkt" - "../basic.rkt" - "../manual-struct.rkt" - "qsloc.rkt" - "manual-utils.rkt" - "manual-vars.rkt" - "manual-scheme.rkt" - "manual-bind.rkt" - scheme/list - (for-syntax scheme/base - syntax/parse - racket/syntax) - (for-label scheme/base)) - -(provide defform defform* defform/subs defform*/subs defform/none - defidform defidform/inline - specform specform/subs - specsubform specsubform/subs specspecsubform specspecsubform/subs - specsubform/inline - defsubform defsubform* - racketgrammar racketgrammar* - (rename-out [racketgrammar schemegrammar] - [racketgrammar* schemegrammar*]) - var svar - (for-syntax kind-kw id-kw link-target?-kw - literals-kw subs-kw contracts-kw)) - -(begin-for-syntax - (define-splicing-syntax-class kind-kw - #:description "#:kind keyword" - (pattern (~seq #:kind kind)) - (pattern (~seq) - #:with kind #'#f)) - - (define-splicing-syntax-class id-kw - #:description "#:id keyword" - (pattern (~seq #:id [defined-id:id defined-id-expr])) - (pattern (~seq #:id defined-id:id) - #:with defined-id-expr #'(quote-syntax defined-id)) - (pattern (~seq #:id [#f #f]) - #:with defined-id #'#f - #:with defined-id-expr #'#f) - (pattern (~seq) - #:with defined-id #'#f - #:with defined-id-expr #'#f)) - - (define-splicing-syntax-class link-target?-kw - #:description "#:link-target? keyword" - (pattern (~seq #:link-target? expr)) - (pattern (~seq) - #:with expr #'#t)) - - (define-splicing-syntax-class literals-kw - #:description "#:literals keyword" - (pattern (~seq #:literals (lit:id ...))) - (pattern (~seq) - #:with (lit ...) #'())) - - (define-splicing-syntax-class contracts-kw - #:description "#:contracts keyword" - (pattern (~seq #:contracts (~and cs ([contract-nonterm:id contract-expr] ...)))) - (pattern (~seq) - #:with (~and cs ((contract-nonterm contract-expr) ...)) #'())) - - (define-syntax-class grammar - #:description "grammar" - (pattern ([non-term-id:id non-term-form ...+] ...))) - - (define-splicing-syntax-class subs-kw - #:description "#:grammar keyword" - #:attributes (g (g.non-term-id 1) (g.non-term-form 2)) - (pattern (~seq #:grammar g:grammar)) - (pattern (~seq) #:with g:grammar #'())) - ) - -(define-syntax (defform*/subs stx) - (syntax-parse stx - [(_ k:kind-kw lt:link-target?-kw d:id-kw l:literals-kw [spec spec1 ...] - g:grammar - c:contracts-kw - desc ...) - (with-syntax* ([defined-id (if (syntax-e #'d.defined-id) - #'d.defined-id - (syntax-case #'spec () - [(spec-id . _) #'spec-id]))] - [defined-id-expr (if (syntax-e #'d.defined-id-expr) - #'d.defined-id-expr - #'(quote-syntax defined-id))] - [(new-spec ...) - (for/list ([spec (in-list (syntax->list #'(spec spec1 ...)))]) - (let loop ([spec spec]) - (if (and (identifier? spec) - (free-identifier=? spec #'defined-id)) - (datum->syntax #'here '(unsyntax x) spec spec) - (syntax-case spec () - [(a . b) - (datum->syntax spec - (cons (loop #'a) (loop #'b)) - spec - spec)] - [_ spec]))))]) - #'(with-togetherable-racket-variables - (l.lit ...) - ([form [defined-id spec]] [form [defined-id spec1]] ... - [non-term (g.non-term-id g.non-term-form ...)] ...) - (*defforms k.kind lt.expr defined-id-expr - '(spec spec1 ...) - (list (lambda (x) (racketblock0/form new-spec)) ...) - '((g.non-term-id g.non-term-form ...) ...) - (list (list (lambda () (racket g.non-term-id)) - (lambda () (racketblock0/form g.non-term-form)) - ...) - ...) - (list (list (lambda () (racket c.contract-nonterm)) - (lambda () (racketblock0 c.contract-expr))) - ...) - (lambda () (list desc ...)))))])) - -(define-syntax (defform* stx) - (syntax-parse stx - [(_ k:kind-kw lt:link-target?-kw d:id-kw l:literals-kw [spec ...] - subs:subs-kw c:contracts-kw desc ...) - (syntax/loc stx - (defform*/subs #:kind k.kind - #:link-target? lt.expr - #:id [d.defined-id d.defined-id-expr] - #:literals (l.lit ...) - [spec ...] subs.g #:contracts c.cs desc ...))])) - -(define-syntax (defform stx) - (syntax-parse stx - [(_ k:kind-kw lt:link-target?-kw d:id-kw l:literals-kw spec - subs:subs-kw c:contracts-kw desc ...) - (syntax/loc stx - (defform*/subs #:kind k.kind - #:link-target? lt.expr - #:id [d.defined-id d.defined-id-expr] - #:literals (l.lit ...) - [spec] subs.g #:contracts c.cs desc ...))])) - -(define-syntax (defform/subs stx) - (syntax-parse stx - [(_ k:kind-kw lt:link-target?-kw d:id-kw l:literals-kw spec subs desc ...) - (syntax/loc stx - (defform*/subs #:kind k.kind - #:link-target? lt.expr - #:id [d.defined-id d.defined-id-expr] - #:literals (l.lit ...) - [spec] subs desc ...))])) - -(define-syntax (defform/none stx) - (syntax-parse stx - [(_ k:kind-kw lt:link-target?-kw l:literals-kw spec subs:subs-kw c:contracts-kw desc ...) - (syntax/loc stx - (with-togetherable-racket-variables - (l.lit ...) - ([form/none spec] - [non-term (subs.g.non-term-id subs.g.non-term-form ...)] ...) - (*defforms k.kind lt.expr #f - '(spec) - (list (lambda (ignored) (racketblock0/form spec))) - '((subs.g.non-term-id subs.g.non-term-form ...) ...) - (list (list (lambda () (racket subs.g.non-term-id)) - (lambda () (racketblock0/form subs.g.non-term-form)) - ...) - ...) - (list (list (lambda () (racket c.contract-nonterm)) - (lambda () (racketblock0 c.contract-expr))) - ...) - (lambda () (list desc ...)))))])) - -(define-syntax (defidform/inline stx) - (syntax-case stx (unsyntax) - [(_ id) - (identifier? #'id) - #'(defform-site (quote-syntax id))] - [(_ (unsyntax id-expr)) - #'(defform-site id-expr)])) - -(define-syntax (defidform stx) - (syntax-parse stx - [(_ k:kind-kw lt:link-target?-kw spec-id desc ...) - #'(with-togetherable-racket-variables - () - () - (*defforms k.kind lt.expr (quote-syntax/loc spec-id) - '(spec-id) - (list (lambda (x) (make-omitable-paragraph (list x)))) - null - null - null - (lambda () (list desc ...))))])) - -(define (into-blockquote s) - (make-blockquote "leftindent" - (if (splice? s) - (flow-paragraphs (decode-flow (splice-run s))) - (list s)))) - -(define-syntax (defsubform stx) - (syntax-case stx () - [(_ . rest) #'(into-blockquote (defform . rest))])) - -(define-syntax (defsubform* stx) - (syntax-case stx () - [(_ . rest) #'(into-blockquote (defform* . rest))])) - -(define-syntax (spec?form/subs stx) - (syntax-parse stx - [(_ has-kw? l:literals-kw spec g:grammar - c:contracts-kw - desc ...) - (syntax/loc stx - (with-racket-variables - (l.lit ...) - ([form/maybe (has-kw? spec)] - [non-term (g.non-term-id g.non-term-form ...)] ...) - (*specsubform 'spec '(l.lit ...) (lambda () (racketblock0/form spec)) - '((g.non-term-id g.non-term-form ...) ...) - (list (list (lambda () (racket g.non-term-id)) - (lambda () (racketblock0/form g.non-term-form)) - ...) - ...) - (list (list (lambda () (racket c.contract-nonterm)) - (lambda () (racketblock0 c.contract-expr))) - ...) - (lambda () (list desc ...)))))])) - -(define-syntax (specsubform stx) - (syntax-parse stx - [(_ l:literals-kw spec subs:subs-kw c:contracts-kw desc ...) - (syntax/loc stx - (spec?form/subs #f #:literals (l.lit ...) spec subs.g #:contracts c.cs desc ...))])) - -(define-syntax (specsubform/subs stx) - (syntax-parse stx - [(_ l:literals-kw spec g:grammar desc ...) - (syntax/loc stx - (spec?form/subs #f #:literals (l.lit ...) spec - ([g.non-term-id g.non-term-form ...] ...) - desc ...))])) - -(define-syntax-rule (specspecsubform spec desc ...) - (make-blockquote "leftindent" (list (specsubform spec desc ...)))) - -(define-syntax-rule (specspecsubform/subs spec subs desc ...) - (make-blockquote "leftindent" (list (specsubform/subs spec subs desc ...)))) - -(define-syntax (specform stx) - (syntax-parse stx - [(_ l:literals-kw spec subs:subs-kw c:contracts-kw desc ...) - (syntax/loc stx - (spec?form/subs #t #:literals (l.lit ...) spec subs.g #:contracts c.cs desc ...))])) - -(define-syntax (specform/subs stx) - (syntax-parse stx - [(_ l:literals-kw spec g:grammar - desc ...) - (syntax/loc stx - (spec?form/subs #t #:literals (l.lit ...) spec ([g.non-term-id g.non-term-form ...] ...) - desc ...))])) - -(define-syntax-rule (specsubform/inline spec desc ...) - (with-racket-variables - () - ([form/maybe (#f spec)]) - (*specsubform 'spec null #f null null null (lambda () (list desc ...))))) - -(define-syntax racketgrammar - (syntax-rules () - [(_ #:literals (lit ...) id clause ...) - (racketgrammar* #:literals (lit ...) [id clause ...])] - [(_ id clause ...) (racketgrammar #:literals () id clause ...)])) - -(define-syntax racketgrammar* - (syntax-rules () - [(_ #:literals (lit ...) [id clause ...] ...) - (with-racket-variables - (lit ...) - ([non-term (id clause ...)] ...) - (*racketgrammar '(lit ...) - '(id ... clause ... ...) - (lambda () - (list (list (racket id) - (racketblock0/form clause) ...) - ...))))] - [(_ [id clause ...] ...) - (racketgrammar* #:literals () [id clause ...] ...)])) - -(define-syntax-rule (var id) - (*var 'id)) - -(define-syntax-rule (svar id) - (*var 'id)) - - -(define (meta-symbol? s) (memq s '(... ...+ ?))) - -(define (defform-site kw-id) - (let ([target-maker (id-to-form-target-maker kw-id #t)]) - (define-values (content ref-content) (definition-site (syntax-e kw-id) kw-id #t)) - (if target-maker - (target-maker - content - (lambda (tag) - (make-toc-target2-element - #f - (if kw-id - (make-index-element - #f content tag - (list (datum-intern-literal (symbol->string (syntax-e kw-id)))) - (list ref-content) - (with-exporting-libraries - (lambda (libs) - (make-form-index-desc (syntax-e kw-id) - libs)))) - content) - tag - ref-content))) - content))) - -(define (*defforms kind link? kw-id forms form-procs subs sub-procs contract-procs content-thunk) - (parameterize ([current-meta-list '(... ...+)]) - (make-box-splice - (cons - (make-blockquote - vertical-inset-style - (list - (make-table - boxed-style - (append - (for/list ([form (in-list forms)] - [form-proc (in-list form-procs)] - [i (in-naturals)]) - (list - ((if (zero? i) (add-background-label (or kind "syntax")) values) - (list - ((or form-proc - (lambda (x) - (make-omitable-paragraph - (list (to-element `(,x . ,(cdr form))))))) - (and kw-id - (if (eq? form (car forms)) - (if link? - (defform-site kw-id) - (to-element #:defn? #t kw-id)) - (to-element #:defn? #t kw-id)))))))) - (if (null? sub-procs) - null - (list (list flow-empty-line) - (list (make-flow - (list (let ([l (map (lambda (sub) - (map (lambda (f) (f)) sub)) - sub-procs)]) - (*racketrawgrammars "specgrammar" - (map car l) - (map cdr l)))))))) - (make-contracts-table contract-procs))))) - (content-thunk))))) - -(define (*specsubform form lits form-thunk subs sub-procs contract-procs content-thunk) - (parameterize ([current-meta-list '(... ...+)]) - (make-blockquote - "leftindent" - (cons - (make-blockquote - vertical-inset-style - (list - (make-table - boxed-style - (cons - (list - (make-flow - (list - (if form-thunk - (form-thunk) - (make-omitable-paragraph (list (to-element form))))))) - (append - (if (null? sub-procs) - null - (list (list flow-empty-line) - (list (make-flow - (list (let ([l (map (lambda (sub) - (map (lambda (f) (f)) sub)) - sub-procs)]) - (*racketrawgrammars "specgrammar" - (map car l) - (map cdr l)))))))) - (make-contracts-table contract-procs)))))) - (flow-paragraphs (decode-flow (content-thunk))))))) - -(define (*racketrawgrammars style nonterms clauseses) - (make-table - `((valignment baseline baseline baseline baseline baseline) - (alignment right left center left left) - (style ,style)) - (cdr - (append-map - (lambda (nonterm clauses) - (list* - (list flow-empty-line flow-empty-line flow-empty-line - flow-empty-line flow-empty-line) - (list (to-flow nonterm) flow-empty-line (to-flow "=") flow-empty-line - (make-flow (list (car clauses)))) - (map (lambda (clause) - (list flow-empty-line flow-empty-line - (to-flow "|") flow-empty-line - (make-flow (list clause)))) - (cdr clauses)))) - nonterms clauseses)))) - -(define (*racketrawgrammar style nonterm clause1 . clauses) - (*racketrawgrammars style (list nonterm) (list (cons clause1 clauses)))) - -(define (*racketgrammar lits s-expr clauseses-thunk) - (let ([l (clauseses-thunk)]) - (*racketrawgrammars #f - (map (lambda (x) - (make-element #f - (list (hspace 2) - (car x)))) - l) - (map cdr l)))) - -(define (*var id) - (to-element (*var-sym id))) - -(define (*var-sym id) - (string->symbol (format "_~a" id))) - -(define (make-contracts-table contract-procs) - (if (null? contract-procs) - null - (append - (list (list flow-empty-line)) - (list (list (make-flow - (map (lambda (c) - (make-table - "argcontract" - (list - (list (to-flow (hspace 2)) - (to-flow ((car c))) - flow-spacer - (to-flow ":") - flow-spacer - (make-flow (list ((cadr c)))))))) - contract-procs))))))) diff --git a/scribble-lib/scribble/private/manual-history.rkt b/scribble-lib/scribble/private/manual-history.rkt deleted file mode 100644 index c08283ea..00000000 --- a/scribble-lib/scribble/private/manual-history.rkt +++ /dev/null @@ -1,60 +0,0 @@ -#lang racket/base -(require (for-syntax racket/base - syntax/parse) - version/utils - scribble/base - scribble/core - "manual-sprop.rkt" - "manual-ex.rkt" - "manual-style.rkt") - -(provide history) - -(struct history-entry (what vers vers-stx expl)) - -(begin-for-syntax - (define-splicing-syntax-class clause - #:attributes (e) - [pattern (~seq #:added vers) - #:attr e #'(history-entry "Added" vers (quote-syntax vers) '("."))] - [pattern (~seq #:changed vers content) - #:attr e #'(history-entry "Changed" vers (quote-syntax vers) - (list ": " content))])) - -(define-syntax (history stx) - (syntax-parse stx - [(_ c:clause ...) - #'(make-history (list c.e ...))])) - -(define (make-history es) - (for ([e (in-list es)]) - (define vers (history-entry-vers e)) - (unless (valid-version? vers) - (raise-syntax-error 'history - (format "not a valid version: ~e" - vers) - (history-entry-vers-stx e)))) - (delayed-block - (lambda (renderer p ri) - (define pkg - (let ([from (resolve-get/tentative p ri '(exporting-packages #f))]) - (and from - (pair? from) - (car from)))) - (para - #:style (style "SHistory" (list scheme-properties)) - (for/list ([e (in-list (sort es (lambda (a b) (versionstring sym))) - (define (mk tag) - (make-element symbol-color - (list (make-link-element (if defn? - value-def-color - value-link-color) - content - (method-tag tag sym))))) - (if (identifier? id/tag) - (make-delayed-element - (λ (ren p ri) - (let ([tag (find-scheme-tag p ri id/tag #f)]) - (if tag (list (mk tag)) content))) - (λ () (car content)) - (λ () (car content))) - (mk id/tag))) - -(define (method-tag vtag sym) - (list 'meth (list (cadr vtag) sym))) - -(define (constructor-tag vtag) - (list 'constructor (cadr vtag))) - -(define (name-this-object type-sym) - (to-element - (string->symbol - (regexp-replace - #rx"(%|<%>|-mixin)$" - (format "_a~a-~s" - (if (member (string-ref (symbol->string type-sym) 0) - '(#\a #\e #\i #\o #\u)) - "n" - "") - type-sym) - "")))) diff --git a/scribble-lib/scribble/private/manual-mod.rkt b/scribble-lib/scribble/private/manual-mod.rkt deleted file mode 100644 index 7f3035a4..00000000 --- a/scribble-lib/scribble/private/manual-mod.rkt +++ /dev/null @@ -1,336 +0,0 @@ -#lang scheme/base -(require "../decode.rkt" - "../struct.rkt" - "../basic.rkt" - "../manual-struct.rkt" - (only-in "../core.rkt" table-columns) - "manual-ex.rkt" - "manual-style.rkt" - "manual-scheme.rkt" - "manual-utils.rkt" - setup/main-collects - pkg/path - racket/list - (for-syntax scheme/base - syntax/parse) - (for-label scheme/base)) - -(provide defmodule defmodule* - defmodulelang defmodulelang* - defmodulereader defmodulereader* - defmodule*/no-declare defmodulelang*/no-declare defmodulereader*/no-declare - declare-exporting) - -;; --------------------------------------------------------------------------------------------------- -(provide deprecated) - -(require (only-in scribble/core make-style make-background-color-property) - (only-in scribble/base para nested)) - -;; @deprecated[Precontent]{Precontent ... } -;; produces a nested paragraph with a yellow NOTE label to warn readers of deprecated modules -(define (deprecated #:what [what "library"] - replacement - . additional-notes) - (apply nested #:style 'inset - (yellow (bold "NOTE:")) - " This " what - " is deprecated; use " - replacement - ", instead. " - additional-notes)) - -(define (yellow . content) - (make-element (make-style #f (list (make-background-color-property "yellow"))) content)) -;; --------------------------------------------------------------------------------------------------- - -(define-syntax (defmodule stx) - (syntax-parse stx - [(_ (~or (~seq #:require-form req) - (~seq)) - (~or (~seq #:multi (name2 ...)) - name) - (~or (~optional (~seq #:link-target? link-target-expr) - #:defaults ([link-target-expr #'#t])) - (~optional (~and #:indirect indirect)) - (~optional (~seq #:use-sources (pname ...))) - (~optional (~seq #:module-paths (modpath ...))) - (~optional (~seq #:packages (pkg ...))) - (~optional (~and #:no-declare no-declare)) - (~optional (~or (~and #:lang language) - (~and #:reader readr)))) - ... - . content) - (with-syntax ([(name2 ...) (if (attribute name) - #'(name) - #'(name2 ...))] - [(pname ...) (if (attribute pname) - #'(pname ...) - #'())] - [(indirect-kw ...) (if (attribute indirect) - #'(#:indirect) - #'())]) - (with-syntax ([(decl-exp ...) - (if (attribute no-declare) - #'() - (with-syntax ([(mod ...) - (if (attribute modpath) - #'(modpath ...) - #'(name2 ...))] - [(pkg-decl ...) - (if (attribute pkg) - #'(#:packages (pkg ...)) - #'())]) - #'((declare-exporting mod ... pkg-decl ... #:use-sources (pname ...)))))] - [kind (cond - [(attribute language) #'#t] - [(attribute readr) #''reader] - [else #'#f])] - [modpaths (if (attribute modpath) - #'(list (racketmodname modpath indirect-kw ...) ...) - #'#f)] - [packages (if (attribute pkg) - #'(list pkg ...) - #'#f)] - [module-path (let ([l (syntax->list - (if (attribute modpath) - #'(modpath ...) - #'(name2 ...)))]) - (and (pair? l) - (car l)))] - [req (if (attribute req) - #'req - #'(racket require))] - [(show-name ...) - (if (attribute modpath) - #'(name2 ...) - #'((racketmodname name2 indirect-kw ...) ...))]) - #'(begin - decl-exp ... - (*defmodule (list show-name ...) - modpaths - 'module-path - packages - link-target-expr - kind - (list . content) - req))))])) - -;; ---------------------------------------- -;; old forms for backward compatibility: - -(define-syntax defmodule*/no-declare - (syntax-rules () - [(_ #:require-form req (name ...) . content) - (defmodule #:require-form req - #:names (name ...) - #:no-declare - . content)] - [(_ (name ...) . content) - (defmodule #:multi (name ...) - #:no-declare - . content)])) - -(define-syntax defmodule* - (syntax-rules () - [(_ #:require-form req (name ...) . options+content) - (defmodule #:require-form req #:multi (name ...) - . options+content)] - [(_ (name ...) . options+content) - (defmodule #:multi (name ...) . options+content)])) - -(define-syntax defmodulelang*/no-declare - (syntax-rules () - [(_ (lang ...) . options+content) - (defmodule #:multi (lang ...) - #:lang - #:no-declare - . options+content)])) - -(define-syntax defmodulelang* - (syntax-rules () - [(_ (name ...) . options+content) - (defmodule #:multi (name ...) - #:lang - . options+content)])) - -(define-syntax defmodulelang - (syntax-rules () - [(_ lang #:module-path modpath . options+content) - (defmodule lang - #:module-paths (modpath) - #:lang - . options+content)] - [(_ lang . options+content) - (defmodule lang - #:lang - . options+content)])) - -(define-syntax-rule (defmodulereader*/no-declare (lang ...) . options+content) - (defmodule #:multi (lang ...) - #:reader - #:no-declare - . options+content)) - -(define-syntax defmodulereader* - (syntax-rules () - [(_ (name ...) . options+content) - (defmodule #:multi (name ...) - #:reader - . options+content)])) - -(define-syntax-rule (defmodulereader lang . options+content) - (defmodule lang - #:reader - . options+content)) - -;; ---------------------------------------- - -(define (compute-packages module-path) - (let* ([path (with-handlers ([exn:missing-module? (lambda (exn) #f)]) - (and module-path - (resolved-module-path-name - (module-path-index-resolve (module-path-index-join module-path #f)))))] - [pkg (and path - (path? path) - (or (path->pkg path) - (let ([c (path->main-collects-relative path)]) - (and c - "base"))))]) - (if pkg - (list pkg) - null))) - -(define (*defmodule names modpaths module-path packages link-target? lang content req) - (let ([modpaths (or modpaths names)]) - (define pkg-spec - (let ([pkgs (or packages - (compute-packages module-path))]) - (and pkgs - (pair? pkgs) - (make-flow - (list - (make-omitable-paragraph - (list (elem #:style "RpackageSpec" - (list* (smaller 'nbsp - (format "package~a:" - (if (null? (cdr pkgs)) - "" - "s"))) - " " - (add-between (map tt pkgs) ", ")))))))))) - (define (flow-width f) (apply max (map block-width f))) - (define libs-specs - ;; make-desc : element -> flow - ;; index-desc : module-path-index-desc - (let-values ([(make-desc index-desc) - (case lang - [(#f) - (values (lambda (modname) (list (racket (#,req #,modname)))) - the-module-path-index-desc)] - [(#t) - (values (lambda (modname) (list (hash-lang) spacer modname)) - the-language-index-desc)] - [(reader) - (values (lambda (modname) (list (racketmetafont "#reader") spacer modname)) - the-reader-index-desc)] - [(just-lang) - (values (lambda (modname) (list (hash-lang) spacer modname)) - the-language-index-desc)] - [else (error 'defmodule "unknown mode: ~e" lang)])]) - (map - (lambda (name modpath) - (define modname (if link-target? - (make-defracketmodname name modpath index-desc) - name)) - (list - (make-flow - (list - (make-omitable-paragraph - (cons spacer (make-desc modname))))) - 'cont)) - names - modpaths))) - - (make-splice - (cons - (make-table - (make-style "defmodule" - (list (table-columns (list - (make-style #f '(left)) - (make-style #f '(right)))))) - (if pkg-spec - (if ((+ (flow-width (caar libs-specs)) - (flow-width pkg-spec) - 8) - . < . (current-display-width)) - (cons - (cons (car (car libs-specs)) - (list pkg-spec)) - (cdr libs-specs)) - (append - libs-specs - (list (list (make-flow (list (make-omitable-paragraph (list 'nbsp)))) - pkg-spec)))) - libs-specs)) - (append (if link-target? - (map (lambda (modpath) - (make-part-tag-decl - (intern-taglet - `(mod-path ,(datum-intern-literal - (element->string modpath)))))) - modpaths) - null) - (flow-paragraphs (decode-flow content))))))) - -(define the-module-path-index-desc (make-module-path-index-desc)) -(define the-language-index-desc (make-language-index-desc)) -(define the-reader-index-desc (make-reader-index-desc)) - -(define (make-defracketmodname mn mp index-desc) - (let ([name-str (datum-intern-literal (element->string mn))] - [path-str (datum-intern-literal (element->string mp))]) - (make-index-element #f - (list mn) - (intern-taglet `(mod-path ,path-str)) - (list name-str) - (list mn) - index-desc))) - -(define-syntax (declare-exporting stx) - (syntax-parse stx - [(_ lib:expr ... - (~optional (~seq #:packages (pkg ...))) - (~optional (~seq #:use-sources (plib ...)))) - (with-syntax ([(plib ...) (if (attribute plib) - #'(plib ...) - #'())] - [packages (if (attribute pkg) - #'(list pkg ...) - #'#f)]) - (let ([libs (syntax->list #'(lib ... plib ...))]) - (for ([l libs]) - (unless (or (syntax-case l (unquote) - [(unquote _) #t] - [_ #f]) - (module-path? (syntax->datum l))) - (raise-syntax-error #f "not a module path" stx l))) - (when (null? libs) - (raise-syntax-error #f "need at least one module path" stx)) - #'(*declare-exporting `(lib ...) `(plib ...) packages)))])) - -(define (*declare-exporting libs source-libs in-pkgs) - (define pkgs (or in-pkgs - (if (null? libs) - null - (compute-packages (car libs))))) - (make-splice - (list - (make-part-collect-decl - (make-collect-element - #f null - (lambda (ri) - (collect-put! ri '(exporting-libraries #f) libs) - (collect-put! ri '(exporting-packages #f) pkgs)))) - (make-part-collect-decl - (make-exporting-libraries #f null (and (pair? libs) libs) source-libs pkgs))))) diff --git a/scribble-lib/scribble/private/manual-proc.rkt b/scribble-lib/scribble/private/manual-proc.rkt deleted file mode 100644 index 4ad930b6..00000000 --- a/scribble-lib/scribble/private/manual-proc.rkt +++ /dev/null @@ -1,1202 +0,0 @@ -#lang racket/base -(require "../struct.rkt" - "../scheme.rkt" - "../basic.rkt" - "../manual-struct.rkt" - (only-in "../core.rkt" - make-style make-table-columns) - "../html-properties.rkt" - "qsloc.rkt" - "manual-utils.rkt" - "manual-vars.rkt" - "manual-style.rkt" - "manual-scheme.rkt" - "manual-bind.rkt" - "manual-method.rkt" - "manual-ex.rkt" - "on-demand.rkt" - scheme/string - scheme/list - (for-syntax racket/base - syntax/parse) - (for-label racket/base - racket/contract - racket/class)) - -(provide defproc defproc* defstruct defstruct* - defparam defparam* defboolparam - defthing defthing* - defthing/proc ; XXX unknown contract - ;; private: - *defthing) ; XXX unknown contract - -(define-on-demand dots0 - (make-element meta-color (list "..."))) -(define-on-demand dots1 - (make-element meta-color (list "...+"))) - -(define (make-openers n) - (racketparenfont - (case n [(1) "("] [(0) ""] [(2) "(("] [else (make-string n #\()]))) -(define (make-closers n) - (racketparenfont - (case n [(1) ")"] [(0) ""] [(2) "))"] [else (make-string n #\()]))) - -(define-syntax (arg-contract stx) - (syntax-case stx (... ...+ _...superclass-args...) - [(_ [id contract]) - (identifier? #'id) - #'(racketblock0 contract)] - [(_ [id contract val]) - (identifier? #'id) - #'(racketblock0 contract)] - [(_ [kw id contract]) - (and (keyword? (syntax-e #'kw)) (identifier? #'id)) - #'(racketblock0 contract)] - [(_ [kw id contract val]) - (and (keyword? (syntax-e #'kw)) (identifier? #'id)) - #'(racketblock0 contract)] - [(_ (... ...)) #'#f] - [(_ (... ...+)) #'#f] - [(_ _...superclass-args...) #'#f] - [(_ arg) (raise-syntax-error 'defproc "bad argument form" #'arg)])) - -(define-syntax (arg-default stx) - (syntax-case stx (... ...+ _...superclass-args...) - [(_ [id contract]) - (identifier? #'id) - #'#f] - [(_ [id contract val]) - (identifier? #'id) - #'(racketblock0 val)] - [(_ [kw id contract]) - (keyword? (syntax-e #'kw)) - #'#f] - [(_ [kw id contract val]) - (keyword? (syntax-e #'kw)) - #'(racketblock0 val)] - [_ #'#f])) - -(define-syntax (extract-proc-id stx) - (syntax-case stx () - [(_ k e id) - (identifier? #'id) - (if (and (syntax-e #'k) - (free-identifier=? #'k #'id)) - #'e - #`(quote-syntax/loc id))] - [(_ k e (proto arg ...)) - #'(extract-proc-id k e proto)] - [(_ thing) (raise-syntax-error 'defproc "bad prototype" #'thing)])) - -(define-syntax (arg-contracts stx) - (syntax-case stx () - [(_ id arg ...) - (identifier? #'id) - #'(list (lambda () (arg-contract arg)) ...)] - [(_ (proto arg1 ...) arg ...) - #'(arg-contracts proto arg1 ... arg ...)] - [_ (raise-syntax-error 'defproc "bad prototype" stx)])) - -(define-syntax (arg-defaults stx) - (syntax-case stx () - [(_ id arg ...) - (identifier? #'id) - #'(list (lambda () (arg-default arg)) ...)] - [(_ (proto arg1 ...) arg ...) - #'(arg-defaults proto arg1 ... arg ...)] - [_ (raise-syntax-error 'defproc "bad prototype" stx)])) - -(define-syntax (result-contract stx) - (syntax-case stx (values) - [(_ (values c ...)) - #'(list (racketblock0 c) ...)] - [(_ c) - (if (string? (syntax-e #'c)) - (raise-syntax-error 'defproc - "expected a result contract, found a string" #'c) - #'(racketblock0 c))])) - -(define no-value #f) - -(define-syntax (result-value stx) - (syntax-case stx (no-value let) - [(_ no-value) #'#f] - [(_ (let () e ...)) #'(racketblock0 e ...)] - [(_ v) #'(racketblock0 v)])) - -(begin-for-syntax - (define-splicing-syntax-class kind-kw - #:description "#:kind keyword" - (pattern (~optional (~seq #:kind kind) - #:defaults ([kind #'#f])))) - - (define-splicing-syntax-class value-kw - #:description "#:value keyword" - (pattern (~optional (~seq #:value value) - #:defaults ([value #'no-value])))) - - (define-splicing-syntax-class link-target?-kw - #:description "#:link-target? keyword" - (pattern (~seq #:link-target? expr)) - (pattern (~seq) - #:with expr #'#t)) - - (define-syntax-class id-or-false - (pattern i:id) - (pattern #f #:with i #'#f)) - - (define-splicing-syntax-class id-kw - #:description "#:id keyword" - (pattern (~optional (~seq #:id [key:id-or-false expr]) - #:defaults ([key #'#f] - [expr #'#f])))) - - (define-splicing-syntax-class mode-kw - #:description "#:mode keyword" - (pattern (~optional (~seq #:mode m:id) - #:defaults ([m #'procedure])))) - - (define-splicing-syntax-class within-kw - #:description "#:within keyword" - (pattern (~optional (~seq #:within cl:id) - #:defaults ([cl #'#f])))) - ) - -(define-syntax (defproc stx) - (syntax-parse stx - [(_ kind:kind-kw - lt:link-target?-kw - i:id-kw - (id arg ...) - result - value:value-kw - desc ...) - (syntax/loc stx - (defproc* - #:kind kind.kind - #:link-target? lt.expr - #:id [i.key i.expr] - [[(id arg ...) result #:value value.value]] - desc ...))])) - -(define-syntax (defproc* stx) - (syntax-parse stx - [(_ kind:kind-kw - lt:link-target?-kw - d:id-kw - mode:mode-kw - within:within-kw - [[proto result value:value-kw] ...] - desc ...) - (syntax/loc stx - (with-togetherable-racket-variables - () - ([proc proto] ...) - (let ([alt-id d.expr]) - (*defproc kind.kind - lt.expr - 'mode.m (quote-syntax/loc within.cl) - (list (extract-proc-id d.key alt-id proto) ...) - 'd.key - '[proto ...] - (list (arg-contracts proto) ...) - (list (arg-defaults proto) ...) - (list (lambda () (result-contract result)) ...) - (lambda () (list desc ...)) - (list (result-value value.value) ...)))))])) - -(define-struct arg - (special? kw id optional? starts-optional? ends-optional? num-closers)) - -(define (*defproc kind link? mode within-id - stx-ids sym prototypes arg-contractss arg-valss result-contracts content-thunk - [result-values (map (lambda (x) #f) result-contracts)]) - (define max-proto-width (current-display-width)) - (define ((arg->elem show-opt-start?) arg) - (let* ([e (cond [(not (arg-special? arg)) - (if (arg-kw arg) - (if (eq? mode 'new) - (make-element - #f (list (racketparenfont "[") - (racketidfont (datum-intern-literal (keyword->string (arg-kw arg)))) - spacer - (to-element (make-var-id (arg-id arg))) - (racketparenfont "]"))) - (make-element - #f (list (to-element (arg-kw arg)) - spacer - (to-element (make-var-id (arg-id arg)))))) - (to-element (make-var-id (arg-id arg))))] - [(eq? (arg-id arg) '...+) dots1] - [(eq? (arg-id arg) '...) dots0] - [(eq? (arg-id arg) '_...superclass-args...) (to-element (arg-id arg))] - [else (to-element (make-var-id (arg-id arg)))])] - [e (if (arg-ends-optional? arg) - (make-element #f (list e "]")) - e)] - [e (if (zero? (arg-num-closers arg)) - e - (make-element - #f (list e (make-closers (arg-num-closers arg)))))]) - (if (and show-opt-start? (arg-starts-optional? arg)) - (make-element #f (list "[" e)) - e))) - (define (prototype-depth p) - (let loop ([p (car p)]) - (if (symbol? p) 0 (+ 1 (loop (car p)))))) - (define (prototype-args p) - (define (parse-arg v in-optional? depth next-optional? next-special-dots?) - (let* ([id (if (pair? v) ((if (keyword? (car v)) cadr car) v) v)] - [kw (and (pair? v) (keyword? (car v)) (car v))] - [default? (and (pair? v) (pair? ((if kw cdddr cddr) v)))]) - (make-arg (symbol? v) kw id default? - (and default? (not in-optional?)) - (or (and (not default?) - in-optional?) ; => must be special - (and default? - (not next-optional?) - (not next-special-dots?))) - depth))) - (let loop ([p p] [last-depth 0]) - (append - (if (symbol? (car p)) - null - (loop (car p) (add1 last-depth))) - (let loop ([p (cdr p)][in-optional? #f]) - (cond - [(null? p) null] - [(null? (cdr p)) - (list (parse-arg (car p) in-optional? last-depth #f #f))] - [else - (let ([a (parse-arg - (car p) - in-optional? - 0 - (let ([v (cadr p)]) - (and (pair? v) - (not - (null? ((if (keyword? (car v)) cdddr cddr) v))))) - (and (not (pair? (cadr p))) - (not (eq? '_...superclass-args... (cadr p)))))]) - (cons a (loop (cdr p) - (and (arg-optional? a) - (not (arg-ends-optional? a))))))]))))) - (define (prototype-size args first-combine next-combine special-combine?) - (let loop ([s args] [combine first-combine]) - (if (null? s) - 0 - (combine - (loop (cdr s) next-combine) - (let ([a (car s)]) - (+ (arg-num-closers a) - (if (arg-special? a) - (string-length (symbol->string (arg-id a))) - (+ (if (arg-kw a) - (+ (if (eq? mode 'new) 2 0) - (string-length (keyword->string (arg-kw a))) - 3 - (string-length (symbol->string (arg-id a)))) - (string-length (symbol->string (arg-id a)))) - (if (and special-combine? - (pair? (cdr s)) - (arg-special? (cadr s)) - (not (eq? '_...superclass-args... - (arg-id (cadr s))))) - (+ 1 (string-length (symbol->string (arg-id (cadr s))))) - 0))))))))) - (define (extract-id p stx-id) - (let loop ([p p]) - (if (symbol? (car p)) - (let ([s (car p)]) - (if (eq? s sym) - (syntax-e stx-id) - (car p))) - (loop (car p))))) - (define (do-one stx-id prototype args arg-contracts arg-vals result-contract result-value - first? add-background-label?) - (let ([names (remq* '(... ...+) (map arg-id args))]) - (unless (= (length names) (length (remove-duplicates names eq?))) - (error 'defproc "duplicate argument names in prototype for ~s: ~s" - (syntax->datum stx-id) names))) - (define tagged - (cond - [(or (eq? mode 'new) - (eq? mode 'make)) - (define content - (list (if (eq? mode 'new) - (racket new) - (racket make-object)))) - (define new-elem - (if (and first? link?) - (let* ([target-maker (id-to-target-maker within-id #f)]) - (if target-maker - (target-maker - content - (lambda (ctag) - (let ([tag (constructor-tag ctag)]) - (make-toc-target-element - #f - (list (make-index-element - #f - content - tag - (list (datum-intern-literal (symbol->string (syntax-e within-id))) - (if (eq? mode 'new) - "new" - "make-object")) - content - (with-exporting-libraries - (lambda (libs) - (make-constructor-index-desc - (syntax-e within-id) - libs ctag))))) - tag)))) - (car content))) - (car content))) - (make-element #f (list new-elem spacer (to-element within-id)))] - [(eq? mode 'send) - (make-element - #f - (list (racket send) spacer - (name-this-object (syntax-e within-id)) spacer - (if (and first? link?) - (let* ([mname (extract-id prototype stx-id)] - [target-maker (id-to-target-maker within-id #f)] - [content (*method mname within-id #:defn? #t)] - [ref-content (*method mname within-id)]) - (if target-maker - (target-maker - content - (lambda (ctag) - (let ([tag (method-tag ctag mname)]) - (make-toc-target2-element - #f - (list (make-index-element - #f - content - tag - (list (datum-intern-literal (symbol->string mname))) - (list ref-content) - (with-exporting-libraries - (lambda (libs) - (make-method-index-desc - (syntax-e within-id) - libs mname ctag))))) - tag - ref-content)))) - content)) - (*method (extract-id prototype stx-id) within-id #:defn? #t))))] - [(and first? link?) - (define the-id (extract-id prototype stx-id)) - (let ([target-maker (id-to-target-maker stx-id #t)]) - (define-values (content ref-content) (definition-site the-id stx-id #f)) - (if target-maker - (target-maker - content - (lambda (tag) - (make-toc-target2-element - #f - (make-index-element - #f content tag - (list (datum-intern-literal (symbol->string the-id))) - (list ref-content) - (with-exporting-libraries - (lambda (libs) - (make-procedure-index-desc the-id libs)))) - tag - ref-content))) - content))] - [else - (define the-id (extract-id prototype stx-id)) - ((if link? annote-exporting-library values) - (let ([sig (current-signature)]) - (if sig - (*sig-elem #:defn? #t (sig-id sig) the-id) - (to-element #:defn? #t (make-just-context the-id stx-id)))))])) - (define p-depth (prototype-depth prototype)) - (define flat-size (+ (prototype-size args + + #f) - p-depth - (element-width tagged))) - (define short? (or (flat-size . < . 40) ((length args) . < . 2))) - (define res - (let ([res (result-contract)]) - (if (list? res) - ;; multiple results - (if (null? res) - 'nbsp - (let ([w (apply + (map block-width res))]) - (if (or (ormap table? res) (w . > . 40)) - (make-table - #f (map (lambda (fe) (list (make-flow (list fe)))) res)) - (make-table - #f - (list (let loop ([res res]) - (if (null? (cdr res)) - (list (make-flow (list (car res)))) - (list* (make-flow (list (car res))) - flow-spacer - (loop (cdr res)))))))))) - res))) - (define tagged+arg-width (+ (prototype-size args max max #t) - p-depth - (element-width tagged))) - (define result-next-line? - ((+ (if short? flat-size tagged+arg-width) (block-width res)) - . >= . (- max-proto-width 7))) - (define end (list flow-spacer (to-flow 'rarr) - flow-spacer (make-flow (list res)))) - (define (get-label) - (case mode - [(new make) "constructor"] - [(send) "method"] - [else (or kind "procedure")])) - (append - (list - (list - ((if add-background-label? (add-background-label (get-label)) values) - (make-flow - (if short? - ;; The single-line case: - (top-align - make-table-if-necessary - "prototype" - (list - (cons - (to-flow - (make-element - #f - `(,(make-openers (add1 p-depth)) - ,tagged - ,@(if (null? args) - (list (make-closers p-depth)) - (append-map (lambda (arg) - (list spacer ((arg->elem #t) arg))) - args)) - ,(racketparenfont ")")))) - (if result-next-line? null end)))) - ;; The multi-line case: - (let ([not-end (if result-next-line? - (list flow-spacer) - (list flow-spacer flow-spacer - flow-spacer flow-spacer))] - [one-ok? (and (not (eq? mode 'new)) (tagged+arg-width . < . (- max-proto-width 5)))]) - (list - (top-align - make-table - "prototype" - (cons - (cons - (to-flow - (make-element - #f - (list - (make-openers (add1 p-depth)) - tagged))) - (if one-ok? - (list* - (if (arg-starts-optional? (car args)) - (to-flow (make-element #f (list spacer "["))) - flow-spacer) - (to-flow ((arg->elem #f) (car args))) - not-end) - (list* 'cont 'cont not-end))) - (let loop ([args (if one-ok? (cdr args) args)]) - (if (null? args) - null - (let ([dots-next? - (or (and (pair? (cdr args)) - (arg-special? (cadr args)) - (not (eq? '_...superclass-args... - (arg-id (cadr args))))))]) - (cons - (list* - (if (eq? mode 'new) - (flow-spacer/n 3) - flow-spacer) - (if (arg-starts-optional? (car args)) - (to-flow (make-element #f (list spacer "["))) - flow-spacer) - (let ([a ((arg->elem #f) (car args))] - [next (if dots-next? - (make-element - #f (list spacer - ((arg->elem #f) - (cadr args)))) - "")]) - (to-flow - (cond - [(null? ((if dots-next? cddr cdr) args)) - (make-element - #f - (list a next (racketparenfont ")")))] - [(equal? next "") a] - [else - (make-element #f (list a next))]))) - (if (and (null? ((if dots-next? cddr cdr) args)) - (not result-next-line?)) - end - not-end)) - (loop ((if dots-next? cddr cdr) - args))))))))))))))) - (if result-next-line? - (list (list (make-flow (top-align - make-table-if-necessary - "prototype" - (list end))))) - null) - (append-map - (lambda (arg arg-contract arg-val) - (cond - [(not (arg-special? arg)) - (let* ([arg-cont (arg-contract)] - [base-len (+ 5 (string-length (symbol->string (arg-id arg))) - (block-width arg-cont))] - [arg-val (and arg-val (arg-val))] - [def-len (if (arg-optional? arg) (block-width arg-val) 0)] - [base-list - (list (to-flow (hspace 2)) - (to-flow (to-element (make-var-id (arg-id arg)))) - flow-spacer - (to-flow ":") - flow-spacer - (make-flow (list arg-cont)))]) - (list - (list - (make-flow - (if (and (arg-optional? arg) - ((+ base-len 3 def-len) . >= . max-proto-width)) - (list - (top-align - make-table - "argcontract" - (list base-list (list flow-spacer flow-spacer flow-spacer - (to-flow "=") flow-spacer - (make-flow (list arg-val)))))) - (let ([show-default? - (and (arg-optional? arg) - ((+ base-len 3 def-len) . < . max-proto-width))]) - (top-align - make-table-if-necessary - "argcontract" - (list - (append - base-list - (if show-default? - (list flow-spacer (to-flow "=") flow-spacer - (make-flow (list arg-val))) - null))))))))))] - [else null])) - args - arg-contracts - arg-vals) - (if result-value - (let ([result-block (if (block? result-value) - result-value - (make-omitable-paragraph (list result-value)))]) - (list (list (list (top-align - make-table - "argcontract" - (list (list - (to-flow (make-element #f (list spacer "=" spacer))) - (make-flow (list result-block))))))))) - null))) - (define all-args (map prototype-args prototypes)) - (define var-list - (filter-map (lambda (a) (and (not (arg-special? a)) (arg-id a))) - (append* all-args))) - (make-box-splice - (cons - (make-blockquote - vertical-inset-style - (list - (make-table - boxed-style - (append-map - do-one - stx-ids prototypes all-args arg-contractss arg-valss result-contracts result-values - (let loop ([ps prototypes] [stx-ids stx-ids] [accum null]) - (cond [(null? ps) null] - [(ormap (lambda (a) (eq? (extract-id (car ps) (car stx-ids)) a)) accum) - (cons #f (loop (cdr ps) (cdr stx-ids) accum))] - [else (cons #t (loop (cdr ps) - (cdr stx-ids) - (cons (extract-id (car ps) (car stx-ids)) accum)))])) - (for/list ([p (in-list prototypes)] - [i (in-naturals)]) - (= i 0)))))) - (content-thunk)))) - -(define-syntax (defparam stx) - (syntax-parse stx - [(_ lt:link-target?-kw id arg contract value:value-kw desc ...) - #'(defproc* #:kind "parameter" #:link-target? lt.expr - ([(id) contract] [(id [arg contract]) void? #:value value.value]) - desc ...)])) -(define-syntax (defparam* stx) - (syntax-parse stx - [(_ lt:link-target?-kw id arg in-contract out-contract value:value-kw desc ...) - #'(defproc* #:kind "parameter" #:link-target? lt.expr - ([(id) out-contract] [(id [arg in-contract]) void? #:value value.value]) - desc ...)])) -(define-syntax (defboolparam stx) - (syntax-parse stx - [(_ lt:link-target?-kw id arg value:value-kw desc ...) - #'(defproc* #:kind "parameter" #:link-target? lt.expr - ([(id) boolean?] [(id [arg any/c]) void? #:value value.value]) - desc ...)])) - -(define top-align-styles (make-hash)) -(define (top-align make-table style-name cols) - (if (null? cols) - (make-table style-name null) - (let* ([n (length (car cols))] - [k (cons style-name n)]) - (make-table - (hash-ref top-align-styles - k - (lambda () - (define s - (make-style style-name - (list (make-table-columns (for/list ([i n]) - (make-style #f '(top))))))) - (hash-set! top-align-styles k s) - s)) - cols)))) - -;; ---------------------------------------- - -(begin-for-syntax - (define-splicing-syntax-class mutable-kw - #:description "#:mutable keyword" - (pattern (~seq #:mutable) - #:with immutable? #'#f) - (pattern (~seq) - #:with immutable? #'#t)) - - (define-splicing-syntax-class opacity-kw - #:description "#:prefab, #:transparent, or #:inspector keyword" - (pattern (~seq #:prefab) - #:with opacity #''prefab) - (pattern (~seq #:transparent) - #:with opacity #''transparent) - (pattern (~seq #:inspector #f) - #:with opacity #''transparent) - (pattern (~seq) - #:with opacity #''opaque)) - - (define-splicing-syntax-class constructor-kw - #:description "#:constructor-name, #:extra-constructor-name, or #:omit-constructor keyword" - (pattern (~seq #:constructor-name id) - #:with omit? #'#f - #:with given? #'#t - #:with extra? #'#f) - (pattern (~seq #:extra-constructor-name id) - #:with omit? #'#f - #:with given? #'#t - #:with extra? #'#t) - (pattern (~seq #:omit-constructor) - #:with omit? #'#t - #:with id #'#f - #:with given? #'#f - #:with extra? #'#f) - (pattern (~seq) - #:with omit? #'#f - #:with id #'#f - #:with given? #'#f - #:with extra? #'#f))) - -(define-syntax-rule (define-defstruct defstruct default-extra?) - (... - (define-syntax (defstruct stx) - (syntax-parse stx - [(_ lt:link-target?-kw name fields - m:mutable-kw o:opacity-kw c:constructor-kw - desc ...) - #`(**defstruct lt.expr name fields - m.immutable? o.opacity - c.id c.given? c.extra? default-extra? c.omit? - desc ...)])))) - -(define-defstruct defstruct #t) -(define-defstruct defstruct* #f) - -(define-syntax-rule (**defstruct link? name ([field field-contract] ...) - immutable? opacity - cname cname-given? extra-cname? default-extra? omit-constructor? - desc ...) - (with-togetherable-racket-variables - () - () - (*defstruct link? (quote-syntax/loc name) 'name - (quote-syntax/loc cname) cname-given? extra-cname? default-extra? omit-constructor? - '([field field-contract] ...) - (list (lambda () (racketblock0 field-contract)) ...) - immutable? opacity - (lambda () (list desc ...))))) - -(define (*defstruct link? stx-id name - alt-cname-id cname-given? extra-cname? default-extra? omit-constructor? - fields field-contracts - immutable? opacity - content-thunk) - (define transparent? (or (eq? opacity 'transparent) - (eq? opacity 'prefab))) - (define prefab? (eq? opacity 'prefab)) - (define max-proto-width (current-display-width)) - (define (field-name f) ((if (pair? (car f)) caar car) f)) - (define (field-view f) - (if (pair? (car f)) (make-shaped-parens (car f) #\[) (car f))) - (define cname-id - (cond - [omit-constructor? #f] - [(identifier? alt-cname-id) alt-cname-id] - [(not default-extra?) #f] - [else (let ([name-id (if (identifier? stx-id) - stx-id - (car (syntax-e stx-id)))]) - (datum->syntax name-id - (string->symbol (format "make-~a" (syntax-e name-id))) - name-id - name-id))])) - (define keyword-modifiers? (or (not immutable?) - transparent? - cname-id)) - (define keyword-spacer (hspace 4)) ; 2 would match DrRacket indentation, but 4 looks better with field contracts after - (define main-table - (make-table - boxed-style - (append - ;; First line in "boxed" table is struct name and fields: - (list - (list - ((add-background-label "struct") - (list - (let* ([the-name - (let ([just-name - (let ([name-id (if (pair? name) - (make-just-context (car name) - (car (syntax-e stx-id))) - stx-id)]) - (if link? - (let () - (define (gen defn?) - ((if defn? annote-exporting-library values) - (to-element #:defn? defn? name-id))) - (define content (gen #t)) - (define ref-content (gen #f)) - (make-target-element* - (lambda (s c t) - (make-toc-target2-element s c t ref-content)) - (if (pair? name) - (car (syntax-e stx-id)) - stx-id) - content - (let ([name (if (pair? name) (car name) name)]) - (list* (list 'info name) - (list 'type 'struct: name) - (list 'predicate name '?) - (append - (if cname-id - (list (list 'constructor (syntax-e cname-id))) - null) - (map (lambda (f) - (list 'accessor name '- - (field-name f))) - fields) - (filter-map - (lambda (f) - (if (or (not immutable?) - (and (pair? (car f)) - (memq '#:mutable - (car f)))) - (list 'mutator 'set- name '- - (field-name f) '!) - #f)) - fields)))))) - (to-element #:defn? #t name-id)))]) - (if (pair? name) - (make-element - #f - (list just-name - (hspace 1) - (to-element - (make-just-context - (cadr name) - (cadr (syntax-e stx-id)))))) - just-name))] - [sym-length (lambda (s) - (string-length (symbol->string s)))] - [short-width - (apply + - (length fields) ; spaces between field names - 8 ; "struct" + "(" + ")" - (append - (map sym-length - (append (if (pair? name) name (list name)) - (map field-name fields))) - (map (lambda (f) - (if (pair? (car f)) - (+ 3 2 (string-length (keyword->string - (cadar f)))) - 0)) - fields)))]) - (if (and (short-width . < . max-proto-width) - (not keyword-modifiers?)) - ;; All on one line: - (make-omitable-paragraph - (list - (to-element - `(,(racket struct) - ,the-name - ,(map field-view fields))))) - ;; Multi-line view (leaving out last paren if keywords follow): - (let* ([one-right-column? - ;; Does the struct name and fields fit on a single line? - (or (null? fields) - (short-width . < . max-proto-width))] - [split-field-line? - ;; start fields on the line after "struct"? - (max-proto-width . < . (+ 8 - (if (pair? name) - (+ (sym-length (car name)) - 1 - (sym-length (cadr name))) - (sym-length name)) - 1 - (if (pair? fields) - (sym-length (field-name (car fields))) - 0) - 1))]) - (make-table - #f - ;; First four columns: "(struct" ( - ;; If all fields on the first line, extra columns follow; - ;; If only first field on same line, filds are in fourth column - ;; If no field is on the first line, no fourth column after all - ;; and fields are in the second column - (append - (list - (append - (list (to-flow (make-element #f - (list - (racketparenfont "(") - (racket struct)))) - flow-spacer) - (if one-right-column? - ;; struct name and fields on one line: - (list (to-flow (list the-name - spacer - (to-element (map field-view - fields)) - (if (and immutable? - (not transparent?) - (not cname-id)) - (racketparenfont ")") - null)))) - (if split-field-line? - ;; Field start on line after "struct": - (list (to-flow (make-element 'no-break the-name))) - ;; First field on the same line as "struct": - (list (to-flow (make-element 'no-break the-name)) - (to-flow (make-element - #f (list spacer (racketparenfont "(")))) - (to-flow (make-element 'no-break - (let ([f (to-element (field-view (car fields)))]) - (if (null? (cdr fields)) - (list f (racketparenfont ")")) - f))))))))) - (if split-field-line? - ;; First field, which starts on the next line: - (list - (list flow-spacer flow-spacer - (to-flow (list - (racketparenfont "(") - (make-element 'no-break - (let ([f (to-element (field-view (car fields)))]) - (if (null? (cdr fields)) - (list f (racketparenfont ")")) - f))))))) - null) - ;; Remaining fields: - (if one-right-column? - null - (let loop ([fields (if (null? fields) - fields - (cdr fields))]) - (if (null? fields) - null - (cons - (let ([fld (car fields)]) - (append - (list flow-spacer flow-spacer) - (if split-field-line? null (list flow-spacer flow-spacer)) - (list (to-flow - (list - (if split-field-line? spacer null) - (let ([e (to-element (field-view fld))]) - (if (null? (cdr fields)) - (list e - (racketparenfont - (if (and immutable? - (not transparent?) - (not cname-id)) - "))" - ")"))) - e))))))) - (loop (cdr fields))))))))))))))) - ;; Next lines at "boxed" level are construct-name keywords: - (if cname-id - (let ([kw (to-element (if (if cname-given? - extra-cname? - default-extra?) - '#:extra-constructor-name - '#:constructor-name))] - [nm (to-element cname-id)] - [close? (and immutable? - (not transparent?))]) - (if (max-proto-width . < . (+ (element-width keyword-spacer) - 1 ; space between kw & name - (element-width kw) - (element-width nm) - (if close? 1 0))) - ;; use two lines for #:constructor-name - (list (list (to-flow (list keyword-spacer kw))) - (list (to-flow - (list - keyword-spacer - (if close? - (make-element #f (list nm (racketparenfont ")"))) - nm))))) - ;; use one line for #:constructor-name - (list (list - (to-flow (make-element - #f - (list - keyword-spacer - kw (hspace 1) nm - (if close? - (racketparenfont ")") - null)))))))) - null) - ;; Next lines at "boxed" level are prefab/transparent/mutable - (cond - [(and (not immutable?) transparent?) - (list - (list (to-flow (list keyword-spacer (to-element '#:mutable)))) - (list (to-flow (list keyword-spacer - (if prefab? - (to-element '#:prefab) - (to-element '#:transparent)) - (racketparenfont ")")))))] - [(not immutable?) - (list - (list (to-flow (list keyword-spacer - (to-element '#:mutable) - (racketparenfont ")")))))] - [transparent? - (list - (list (to-flow (list keyword-spacer - (if prefab? - (to-element '#:prefab) - (to-element '#:transparent)) - (racketparenfont ")")))))] - [else null]) - ;; Remaining lines at "boxed" level are field contracts: - (map (lambda (v field-contract) - (cond - [(pair? v) - (list - (top-align - make-table-if-necessary - "argcontract" - (list (list (to-flow (hspace 2)) - (to-flow (to-element (field-name v))) - flow-spacer - (to-flow ":") - flow-spacer - (make-flow (list (field-contract)))))))] - [else null])) - fields field-contracts)))) - (make-box-splice - (cons - (make-blockquote - vertical-inset-style - (list main-table)) - (content-thunk)))) - -;; ---------------------------------------- - -(define-syntax (defthing stx) - (syntax-parse stx - [(_ kind:kind-kw - lt:link-target?-kw - (~optional (~seq #:id id-expr) - #:defaults ([id-expr #'#f])) - id - result - value:value-kw - desc ...) - #'(with-togetherable-racket-variables - () - () - (*defthing kind.kind - lt.expr - (list (or id-expr (quote-syntax/loc id))) (list 'id) #f - (list (racketblock0 result)) - (lambda () (list desc ...)) - (list (result-value value.value))))])) - -(define-syntax (defthing* stx) - (syntax-parse stx - [(_ kind:kind-kw lt:link-target?-kw ([id result value:value-kw] ...) desc ...) - #'(with-togetherable-racket-variables - () - () - (*defthing kind.kind - lt.expr - (list (quote-syntax/loc id) ...) (list 'id ...) #f - (list (racketblock0 result) ...) - (lambda () (list desc ...)) - (list (result-value value.value) ...)))])) - -(define (*defthing kind link? stx-ids names form? result-contracts content-thunk - [result-values (map (lambda (x) #f) result-contracts)]) - (define max-proto-width (current-display-width)) - (make-box-splice - (cons - (make-blockquote - vertical-inset-style - (list - (make-table - boxed-style - (append* - (for/list ([stx-id (in-list stx-ids)] - [name (in-list names)] - [result-contract (in-list result-contracts)] - [result-value (in-list result-values)] - [i (in-naturals)]) - (let* ([result-block - (and result-value - (if (block? result-value) - result-value - (make-omitable-paragraph (list result-value))))] - [contract-block - (if (block? result-contract) - result-contract - (make-omitable-paragraph (list result-contract)))] - [name+contract-width (+ (string-length (format "~a" name)) - 3 - (block-width contract-block))] - [total-width (+ name+contract-width - (if result-block - (+ (block-width result-block) 3) - 0))] - [thing-id (let ([target-maker - (and link? - ((if form? id-to-form-target-maker id-to-target-maker) - stx-id #t))]) - (define-values (content ref-content) - (if link? - (definition-site name stx-id form?) - (let ([s (make-just-context name stx-id)]) - (values (to-element #:defn? #t s) - (to-element s))))) - (if target-maker - (target-maker - content - (lambda (tag) - (make-toc-target2-element - #f - (make-index-element - #f - content - tag - (list (datum-intern-literal (symbol->string name))) - (list ref-content) - (with-exporting-libraries - (lambda (libs) (make-thing-index-desc name libs)))) - tag - ref-content))) - content))] - [contract-on-first-line? (name+contract-width . < . max-proto-width)] - [single-line? (and contract-on-first-line? - (total-width . < . max-proto-width) - (not (table? result-value)))]) - (append - (list - (list - ((if (zero? i) (add-background-label (or kind "value")) values) - (top-align - make-table-if-necessary - "argcontract" - (append - (list - (append - (list (list (make-omitable-paragraph - (list thing-id)))) - (if contract-on-first-line? - (list - (to-flow (list spacer ":" spacer)) - (list contract-block)) - null) - (if (and result-block single-line?) - (list - (to-flow (list spacer "=" spacer)) - (list result-block)) - null)))))))) - (if contract-on-first-line? - null - (list (list (top-align - make-table-if-necessary - "argcontract" - (list - (list (to-flow (list spacer ":" spacer)) - (list contract-block))))))) - (if (or single-line? (not result-block)) - null - (list (list (top-align - make-table-if-necessary - "argcontract" - (list (list - (to-flow (list spacer "=" spacer)) - (list result-block)))))))))))))) - (content-thunk)))) - -(define (defthing/proc kind id contract descs) - (*defthing kind #t (list id) (list (syntax-e id)) #f (list contract) - (lambda () descs))) - -(define (make-target-element* inner-make-target-element stx-id content wrappers) - (if (null? wrappers) - content - (make-target-element* - make-target-element - stx-id - (let* ([name (datum-intern-literal (string-append* (map symbol->string (cdar wrappers))))] - [target-maker - (id-to-target-maker (datum->syntax stx-id (string->symbol name)) - #t)]) - (if target-maker - (target-maker - content - (lambda (tag) - (inner-make-target-element - #f - (make-index-element - #f - content - tag - (list name) - (list (racketidfont (make-element value-link-color - (list name)))) - (with-exporting-libraries - (lambda (libs) - (let ([name (string->symbol name)]) - (if (eq? 'info (caar wrappers)) - (make-struct-index-desc name libs) - (make-procedure-index-desc name libs)))))) - tag))) - content)) - (cdr wrappers)))) - diff --git a/scribble-lib/scribble/private/manual-sprop.rkt b/scribble-lib/scribble/private/manual-sprop.rkt deleted file mode 100644 index 29bde67e..00000000 --- a/scribble-lib/scribble/private/manual-sprop.rkt +++ /dev/null @@ -1,13 +0,0 @@ -#lang scheme/base -(require "../html-properties.rkt" - "../latex-properties.rkt" - "on-demand.rkt" - setup/collects) - -(provide scheme-properties) - -(define-on-demand scheme-properties - (let ([abs (lambda (s) - (path->collects-relative (collection-file-path s "scribble")))]) - (list (make-css-addition (abs "racket.css")) - (make-tex-addition (abs "racket.tex"))))) diff --git a/scribble-lib/scribble/private/manual-style.rkt b/scribble-lib/scribble/private/manual-style.rkt deleted file mode 100644 index 2d64e11d..00000000 --- a/scribble-lib/scribble/private/manual-style.rkt +++ /dev/null @@ -1,256 +0,0 @@ -#lang racket/base -(require "../decode.rkt" - "../struct.rkt" - "../base.rkt" - (only-in "../basic.rkt" aux-elem itemize) - "../scheme.rkt" - (only-in "../core.rkt" make-style plain - make-nested-flow nested-flow? box-mode box-mode* - [element? core:element?]) - "manual-utils.rkt" - "on-demand.rkt" - "manual-sprop.rkt" - racket/list - racket/contract/base - racket/string) - -(provide (rename-out [hyperlink link]) - (rename-out [other-doc other-manual]) - (rename-out [centered centerline]) - image - (rename-out [image image/plain]) - itemize - aux-elem - code-inset) -(provide/contract [filebox (((or/c core:element? string?)) () #:rest (listof pre-flow?) . ->* . block?)]) - -(define styling-f/c - (() () #:rest (listof pre-content?) . ->* . element?)) -(define-syntax-rule (provide-styling id ...) - (provide/contract [id styling-f/c] ...)) -(provide-styling racketmodfont racketoutput - racketerror racketfont racketplainfont racketvalfont racketidfont racketvarfont - racketcommentfont racketparenfont racketkeywordfont racketmetafont - onscreen defterm filepath exec envvar Flag DFlag PFlag DPFlag math - procedure - indexed-file indexed-envvar idefterm pidefterm) -(provide - (contract-out [racketresultfont (->* () (#:decode? boolean?) #:rest (listof pre-content?) element?)])) -(define-syntax-rule (provide-scheme-styling [rid sid] ...) - (provide/contract [rename rid sid styling-f/c] ...)) -(provide-scheme-styling [racketmodfont schememodfont] - [racketoutput schemeoutput] - [racketerror schemeerror] - [racketfont schemefont] - [racketvalfont schemevalfont] - [racketresultfont schemeresultfont] - [racketidfont schemeidfont] - [racketvarfont schemevarfont] - [racketparenfont schemeparenfont] - [racketkeywordfont schemekeywordfont] - [racketmetafont schememetafont]) - -(provide void-const - undefined-const) -(provide/contract - [PLaneT element?] - [hash-lang (-> element?)] - [etc element?] - [inset-flow (() () #:rest (listof pre-content?) . ->* . nested-flow?)] - [litchar (() () #:rest (listof string?) . ->* . element?)] - [t (() () #:rest (listof pre-content?) . ->* . paragraph?)] - [commandline (() () #:rest (listof pre-content?) . ->* . paragraph?)] - [menuitem (string? string? . -> . element?)]) - -(define PLaneT (make-element "planetName" '("PLaneT"))) - -(define etc (make-element #f (list "etc" ._))) - -(define (litchar . strs) - (let ([s (string-append* (map (lambda (s) (regexp-replace* "\n" s " ")) - strs))]) - (if (regexp-match? #rx"^ *$" s) - (make-element input-background-color (list (hspace (string-length s)))) - (let ([^spaces (car (regexp-match-positions #rx"^ *" s))] - [$spaces (car (regexp-match-positions #rx" *$" s))]) - (make-element - input-background-color - (list (hspace (cdr ^spaces)) - (make-element input-color - (list (substring s (cdr ^spaces) (car $spaces)))) - (hspace (- (cdr $spaces) (car $spaces))))))))) - -(define (onscreen . str) - (make-element 'sf (decode-content str))) -(define (menuitem menu item) - (make-element 'sf (list menu "|" item))) -(define (defterm . str) - (make-element 'italic (decode-content str))) -(define (idefterm . str) - (let ([c (decode-content str)]) - (make-element 'italic c))) -(define (racketfont . str) - (apply tt str)) -(define (racketplainfont . str) - (make-element 'tt (decode-content str))) -(define (racketvalfont . str) - (make-element value-color (decode-content str))) -(define (racketresultfont #:decode? [decode? #t] . str) - (make-element result-color (if decode? (decode-content str) str))) -(define (racketidfont . str) - (make-element symbol-color (decode-content str))) -(define (racketvarfont . str) - (make-element variable-color (decode-content str))) -(define (racketparenfont . str) - (make-element paren-color (decode-content str))) -(define (racketmetafont . str) - (make-element meta-color (decode-content str))) -(define (racketcommentfont . str) - (make-element comment-color (decode-content str))) -(define (racketmodfont . str) - (make-element module-color (decode-content str))) -(define (racketkeywordfont . str) - (make-element keyword-color (decode-content str))) -(define (filepath . str) - (make-element 'tt (append (list "\"") (decode-content str) (list "\"")))) -(define (indexed-file . str) - (let* ([f (apply filepath str)] - [s (element->string f)]) - (index* (list (datum-intern-literal - (clean-up-index-string - (substring s 1 (sub1 (string-length s)))))) - (list f) - f))) -(define (exec . str) - (if (andmap string? str) - (make-element 'tt str) - (make-element #f (map (lambda (s) - (if (string? s) - (make-element 'tt (list s)) - s)) - str)))) -(define (Flag . str) - (make-element 'no-break - (list (make-element 'tt (cons "-" (decode-content str)))))) -(define (DFlag . str) - (make-element 'no-break - (list (make-element 'tt (cons "--" (decode-content str)))))) -(define (PFlag . str) - (make-element 'no-break - (list (make-element 'tt (cons "+" (decode-content str)))))) -(define (DPFlag . str) - (make-element 'no-break - (list (make-element 'tt (cons "++" (decode-content str)))))) -(define (envvar . str) - (make-element 'tt (decode-content str))) -(define (indexed-envvar . str) - (let* ([f (apply envvar str)] - [s (element->string f)]) - (index* (list s) (list f) f))) -(define (procedure . str) - (make-element result-color `("#"))) - -(define (racketoutput . str) - (make-element output-color (decode-content str))) -(define (racketerror . str) - (make-element error-color (decode-content str))) - -(define (t . str) - (decode-paragraph str)) - -(define (inset-flow . c) - (make-blockquote "insetpara" (flow-paragraphs (decode-flow c)))) - -(define code-inset-style - (make-style 'code-inset '(never-indents))) -(define (code-inset b) - (make-blockquote code-inset-style (list b))) - -(define (commandline . s) - (make-paragraph (cons (hspace 2) (map (lambda (s) - (if (string? s) - (make-element 'tt (list s)) - s)) - s)))) - -(define (pidefterm . s) - (let ([c (apply defterm s)]) - (index (string-append (content->string (element-content c)) "s") - c))) - -(define (hash-lang) - (make-link-element - module-link-color - (list (racketmodfont "#lang")) - `(part ,(doc-prefix '(lib "scribblings/guide/guide.scrbl") "hash-lang")))) - -(define (make-v+u-link p) - (make-link-element - module-link-color - p - `(part ,(doc-prefix '(lib "scribblings/guide/guide.scrbl") "void+undefined")))) - -(define-on-demand void-const - (make-v+u-link - (nonbreaking (racketresultfont "#")))) -(define-on-demand undefined-const - (make-v+u-link - (nonbreaking (racketresultfont "#")))) - -(define (link url - #:underline? [underline? #t] - #:style [style (if underline? #f "plainlink")] - . str) - (apply hyperlink url #:style (if style (make-style style null) plain) str)) - -(define (math . s) - (let ([c (decode-content s)]) - (make-element - #f - (append-map - (lambda (i) - (let loop ([i i]) - (cond - [(string? i) - (cond - [(regexp-match #px"^(.*)_([a-zA-Z0-9]+)(.*)$" i) - => (lambda (m) - (append (loop (cadr m)) - (list (make-element 'subscript - (loop (caddr m)))) - (loop (cadddr m))))] - [(regexp-match #px"^(.*)\\^([a-zA-Z0-9]+)(.*)$" i) - => (lambda (m) - (append (loop (cadr m)) - (list (make-element 'superscript - (loop (caddr m)))) - (loop (cadddr m))))] - [(regexp-match #px"^(.*)([()0-9{}\\[\\]\u03C0])(.*)$" i) - => (lambda (m) - (append (loop (cadr m)) - (list (caddr m)) - (loop (cadddr m))))] - [else - (list (make-element 'italic (list i)))])] - [(eq? i 'rsquo) (list 'prime)] - [else (list i)]))) - c)))) - -(define (filebox filename . inside) - (make-nested-flow - (make-style "Rfilebox" (list* 'multicommand - (box-mode "RfileboxBoxT" "RfileboxBoxC" "RfileboxBoxB") - scheme-properties)) - (list - (make-styled-paragraph - (list (make-element - (make-style "Rfilename" scheme-properties) - (if (string? filename) - (filepath filename) - filename))) - (make-style "Rfiletitle" (cons (box-mode* "RfiletitleBox") scheme-properties))) - (make-nested-flow - (make-style "Rfilecontent" (cons (box-mode* "RfilecontentBox") scheme-properties)) - (decode-flow inside))))) - - diff --git a/scribble-lib/scribble/private/manual-tech.rkt b/scribble-lib/scribble/private/manual-tech.rkt deleted file mode 100644 index 3779a824..00000000 --- a/scribble-lib/scribble/private/manual-tech.rkt +++ /dev/null @@ -1,76 +0,0 @@ -#lang scheme/base -(require racket/contract/base - "../decode.rkt" - "../struct.rkt" - "manual-utils.rkt" - "manual-style.rkt") - -(provide/contract - [deftech (() (#:normalize? any/c - #:style? any/c - #:key (or/c string? #f)) - #:rest (listof pre-content?) . ->* . element?)] - [tech (() - (#:doc (or/c module-path? false/c) - #:tag-prefixes (or/c (listof string?) false/c) - #:key (or/c string? #f) - #:normalize? any/c) - #:rest (listof pre-content?) - . ->* . element?)] - [techlink (() - (#:doc (or/c module-path? false/c) - #:tag-prefixes (or/c (listof string?) false/c) - #:key (or/c string? #f) - #:normalize? any/c) - #:rest (listof pre-content?) - . ->* . element?)]) - -(define (*tech make-elem style doc prefix s key normalize?) - (let* ([c (decode-content s)] - [s (or key (content->string c))] - [s (if normalize? - (let* ([s (string-foldcase s)] - [s (regexp-replace #rx"ies$" s "y")] - [s (regexp-replace #rx"s$" s "")] - [s (regexp-replace* #px"[-\\s]+" s " ")]) - s) - s)] - [s (datum-intern-literal s)]) - (make-elem style c (list 'tech (doc-prefix doc prefix s))))) - -(define (deftech #:style? [style? #t] - #:normalize? [normalize? #t] - #:key [key #f] - . s) - (let* ([e (if style? - (apply defterm s) - (make-element #f (decode-content s)))] - [t (*tech make-target-element #f #f #f (list e) key normalize?)]) - (make-index-element #f - (list t) - (target-element-tag t) - (list (datum-intern-literal - (clean-up-index-string (element->string e)))) - (list e) - 'tech))) - -(define (tech #:doc [doc #f] - #:tag-prefixes [prefix #f] - #:key [key #f] - #:normalize? [normalize? #t] - . s) - (*tech (lambda (style c tag) - (make-link-element - style - (list (make-element "techinside" c)) - tag)) - "techoutside" - doc prefix s key - normalize?)) - -(define (techlink #:doc [doc #f] - #:tag-prefixes [prefix #f] - #:key [key #f] - #:normalize? [normalize? #t] - . s) - (*tech make-link-element #f doc prefix s key normalize?)) diff --git a/scribble-lib/scribble/private/manual-unit.rkt b/scribble-lib/scribble/private/manual-unit.rkt deleted file mode 100644 index 29d88933..00000000 --- a/scribble-lib/scribble/private/manual-unit.rkt +++ /dev/null @@ -1,67 +0,0 @@ -#lang scheme/base -(require "../decode.rkt" - "../struct.rkt" - "manual-vars.rkt" - "manual-bind.rkt" - "manual-ex.rkt" - "manual-proc.rkt" - racket/contract/base - (for-syntax scheme/base) - (for-label scheme/base)) - -(provide defsignature - defsignature/splice - sigelem) - -(define-syntax-rule (defsignature name (super ...) body ...) - (with-togetherable-racket-variables - () - () - (*defsignature (quote-syntax name) - (list (quote-syntax super) ...) - (lambda () (list body ...)) - #t))) - -(define-syntax-rule (defsignature/splice name (super ...) body ...) - (with-togetherable-racket-variables - () - () - (*defsignature (quote-syntax name) - (list (quote-syntax super) ...) - (lambda () (list body ...)) - #f))) - -(define-struct sig-desc (in)) -(define (signature-desc . l) - (make-sig-desc l)) - -(provide/contract - [signature-desc (() () #:rest (listof pre-flow?) . ->* . sig-desc?)]) - -(define (*defsignature stx-id supers body-thunk indent?) - (*defthing - "signature" - #t - (list stx-id) - (list (syntax-e stx-id)) - #t - (list (make-element #f '("signature"))) - (lambda () - (define in - (parameterize ([current-signature (make-sig stx-id)]) (body-thunk))) - (if indent? - (let-values ([(pre-body post-body) - (let loop ([in in][pre-accum null]) - (cond [(null? in) (values (reverse pre-accum) null)] - [(whitespace? (car in)) - (loop (cdr in) (cons (car in) pre-accum))] - [(sig-desc? (car in)) - (loop (cdr in) - (append (reverse (sig-desc-in (car in))) - pre-accum))] - [else (values (reverse pre-accum) in)]))]) - `(,@pre-body - ,(make-blockquote - "leftindent" - (flow-paragraphs (decode-flow post-body))))) - in)))) diff --git a/scribble-lib/scribble/private/manual-utils.rkt b/scribble-lib/scribble/private/manual-utils.rkt deleted file mode 100644 index 00599e60..00000000 --- a/scribble-lib/scribble/private/manual-utils.rkt +++ /dev/null @@ -1,36 +0,0 @@ -#lang scheme/base -(require "../struct.rkt" - "../base.rkt" - (only-in "../core.rkt" - content? - style?) - racket/contract/base - scheme/list) - -(provide doc-prefix) -(provide/contract - [spacer element?] - [to-flow (content? . -> . flow?)] - [flow-spacer flow?] - [flow-spacer/n (-> exact-nonnegative-integer? flow?)] - [flow-empty-line flow?] - [make-table-if-necessary ((or/c style? string?) list? . -> . (list/c (or/c omitable-paragraph? table?)))] - [current-display-width (parameter/c exact-nonnegative-integer?)]) - -(define spacer (hspace 1)) - -(define (to-flow e) - (make-flow (list (make-omitable-paragraph (list e))))) -(define flow-spacer (to-flow spacer)) -(define (flow-spacer/n n) (to-flow (hspace n))) -(define flow-empty-line (to-flow (tt 'nbsp))) - -(define (make-table-if-necessary style content) - (if (= 1 (length content)) - (let ([paras (append-map flow-paragraphs (car content))]) - (if (andmap paragraph? paras) - (list (make-omitable-paragraph (append-map paragraph-content paras))) - (list (make-table style content)))) - (list (make-table style content)))) - -(define current-display-width (make-parameter 65)) diff --git a/scribble-lib/scribble/private/manual-vars.rkt b/scribble-lib/scribble/private/manual-vars.rkt deleted file mode 100644 index dd2158d4..00000000 --- a/scribble-lib/scribble/private/manual-vars.rkt +++ /dev/null @@ -1,218 +0,0 @@ -#lang scheme/base -(require "../decode.rkt" - "../scheme.rkt" - "../struct.rkt" - (only-in "../core.rkt" - make-style style-name style-properties - nested-flow? nested-flow-blocks nested-flow-style - make-nested-flow) - "../html-properties.rkt" - racket/contract/base - (for-syntax scheme/base - syntax/kerncase - syntax/boundmap) - (for-label scheme/base - scheme/class)) - -(define-struct (box-splice splice) ()) - -(provide/contract - [struct (box-splice splice) ([run list?])]) ; XXX ugly copying -(provide deftogether *deftogether - with-racket-variables - with-togetherable-racket-variables - vertical-inset-style - boxed-style - add-background-label) - -(define vertical-inset-style - (make-style 'vertical-inset null)) - -(define boxed-style - (make-style 'boxed (list (make-attributes (list (cons 'class "RBoxed")))))) - -(define ((add-background-label what) l) - (list - (make-nested-flow - (make-style "RBackgroundLabel" (list 'decorative 'command (alt-tag "div") - (make-attributes '((class . "SIEHidden"))))) - (list - (make-nested-flow - (make-style "RBackgroundLabelInner" (list (alt-tag "div"))) - (list (make-omitable-paragraph what))))) - (let* ([a (car l)] - [remake (if (paragraph? a) - (lambda (sa) - (paragraph - (sa (paragraph-style a)) - (paragraph-content a))) - (lambda (sa) - (table - (sa (table-style a)) - (table-blockss a))))]) - (remake - (lambda (s) - (make-style (style-name s) - (let ([p (style-properties s)]) - (if (ormap attributes? p) - (for/list ([i (in-list p)]) - (if (attributes? i) - (let ([al (attributes-assoc i)]) - (if (assq 'class al) - (for/list ([a (in-list al)]) - (if (eq? (car a) 'class) - (cons 'class (string-append (cdr a) " RForeground")) - a)) - (attributes (cons '(class . "RForeground") - al)))) - i)) - (cons (attributes '((class . "RForeground"))) - p))))))))) - -(begin-for-syntax (define-struct deftogether-tag () #:omit-define-syntaxes)) - -(define-syntax (with-togetherable-racket-variables stx) - (syntax-case stx () - [(_ lits vars decl) - (with-syntax ([vars (syntax-property #'vars 'taint-mode 'none)]) - (syntax-property - #'(with-togetherable-racket-variables* lits vars decl) - 'taint-mode - 'transparent))])) - -(define-syntax-rule (with-togetherable-racket-variables* . rest) - (with-racket-variables . rest)) - -(define-syntax (with-racket-variables stx) - (syntax-case stx () - [(_ lits ([kind s-exp] ...) body) - (let ([ht (make-bound-identifier-mapping)] - [lits (syntax->datum #'lits)]) - (for-each (lambda (kind s-exp) - (case (syntax-e kind) - [(proc) - (letrec ([do-proc - (lambda (s-exp) - (let ([s-exp (syntax->list s-exp)]) - (for-each - (lambda (arg) - (if (identifier? arg) - (unless (or (eq? (syntax-e arg) '...) - (eq? (syntax-e arg) '...+) - (eq? (syntax-e arg) '_...superclass-args...) - (memq (syntax-e arg) lits)) - (bound-identifier-mapping-put! ht arg #t)) - (syntax-case arg () - [(kw arg . rest) - (and (keyword? (syntax-e #'kw)) - (identifier? #'arg)) - (bound-identifier-mapping-put! ht #'arg #t)] - [(arg . rest) - (identifier? #'arg) - (bound-identifier-mapping-put! ht #'arg #t)] - [else (void)]))) - (cdr s-exp)) - (unless (identifier? (car s-exp)) - ;; Curried: - (do-proc (car s-exp)))))]) - (do-proc s-exp))] - [(form form/none form/maybe non-term) - (define skip-id (case (syntax-e kind) - [(form) - (syntax-case s-exp () - [(defined-id actual-s-exp) (let ([id #'defined-id]) - (and (identifier? id) - id))] - [_ #f])] - [else #f])) - (let loop ([form (case (syntax-e kind) - [(form) - (syntax-case s-exp () - [(defined-id actual-s-exp) #'actual-s-exp])] - [(form/none) s-exp] - [(form/maybe) - (syntax-case s-exp () - [(#f form) #'form] - [(#t (id . form)) #'form])] - [(non-term) s-exp])]) - (if (identifier? form) - (unless (or (and skip-id - (free-identifier=? skip-id form)) - (eq? (syntax-e form) '...) - (eq? (syntax-e form) '...+) - (eq? (syntax-e form) 'code:line) - (eq? (syntax-e form) 'code:blank) - (eq? (syntax-e form) 'code:comment) - (eq? (syntax-e form) '?) - (memq (syntax-e form) lits)) - (bound-identifier-mapping-put! ht form #t)) - (syntax-case form (unsyntax) - [(unsyntax _) (void)] - [(a . b) (loop #'a) (loop #'b)] - [#(a ...) (loop #'(a ...))] - [_ (void)])))] - [else - (raise-syntax-error - #f - "unknown variable mode" - stx - kind)])) - (syntax->list #'(kind ...)) - (syntax->list #'(s-exp ...))) - (with-syntax ([(id ...) (bound-identifier-mapping-map ht (lambda (k v) k))]) - #'(letrec-syntaxes ([(id) (make-variable-id 'id)] ...) - body)))])) - - -(define (*deftogether boxes body-thunk) - (make-box-splice - (cons - (make-blockquote - vertical-inset-style - (list - (make-table - boxed-style - (map - (lambda (box) - (unless (and (box-splice? box) - (= 1 (length (splice-run box))) - (nested-flow? (car (splice-run box))) - (eq? vertical-inset-style (nested-flow-style (car (splice-run box)))) - (let ([l (nested-flow-blocks (car (splice-run box)))]) - (= 1 (length l)) - (table? (car l)) - (eq? boxed-style (table-style (car l))))) - (error 'deftogether - "element is not a boxing splice containing a single nested-flow with a single table: ~e" - box)) - (list (make-flow (list (make-table - "together" - (table-flowss (car (nested-flow-blocks (car (splice-run box)))))))))) - boxes)))) - (body-thunk)))) - -(define-syntax (deftogether stx) - (syntax-case stx () - [(_ (def ...) . body) - (with-syntax ([((_ (lit ...) (var ...) decl) ...) - (map (lambda (def) - (let ([exp-def (local-expand - def - (list (make-deftogether-tag)) - (cons - #'with-togetherable-racket-variables* - (kernel-form-identifier-list)))]) - (syntax-case exp-def (with-togetherable-racket-variables*) - [(with-togetherable-racket-variables* lits vars decl) - exp-def] - [_ - (raise-syntax-error - #f - "sub-form is not a documentation form that can be combined" - stx - def)]))) - (syntax->list #'(def ...)))]) - #'(with-togetherable-racket-variables - (lit ... ...) - (var ... ...) - (*deftogether (list decl ...) (lambda () (list . body)))))])) diff --git a/scribble-lib/scribble/private/on-demand.rkt b/scribble-lib/scribble/private/on-demand.rkt deleted file mode 100644 index 4ba95a92..00000000 --- a/scribble-lib/scribble/private/on-demand.rkt +++ /dev/null @@ -1,12 +0,0 @@ -#lang racket/base -(require racket/promise - (for-syntax racket/base)) -(provide define-on-demand) - -(define-syntax-rule (define-on-demand id rhs) - (begin - (define define-on-demand-bound-promise (delay rhs)) - (define-syntax (id stx) - (if (identifier? stx) - #'(force define-on-demand-bound-promise) - (raise-syntax-error #f "bad syntax" stx))))) diff --git a/scribble-lib/scribble/private/provide-structs.rkt b/scribble-lib/scribble/private/provide-structs.rkt deleted file mode 100644 index 2d58d371..00000000 --- a/scribble-lib/scribble/private/provide-structs.rkt +++ /dev/null @@ -1,37 +0,0 @@ -#lang scheme/base -(require scheme/serialize - racket/contract/base - (for-syntax scheme/base)) - -(provide provide-structs) - -(define-syntax (provide-structs stx) - (syntax-case stx () - [(_ (id ([field ct] ...)) ...) - #`(begin - (define-serializable-struct id (field ...) #:transparent) ... - (provide/contract - #,@(let ([ids (syntax->list #'(id ...))] - [fields+cts (syntax->list #'(([field ct] ...) ...))]) - (define (get-fields super-id) - (ormap (lambda (id fields+cts) - (if (identifier? id) - (and (free-identifier=? id super-id) - fields+cts) - (syntax-case id () - [(my-id next-id) - (free-identifier=? #'my-id super-id) - #`[#,@(get-fields #'next-id) - #,@fields+cts]] - [_else #f]))) - ids fields+cts)) - (map (lambda (id fields+cts) - (if (identifier? id) - #`[struct #,id #,fields+cts] - (syntax-case id () - [(id super) - #`[struct id (#,@(get-fields #'super) - #,@fields+cts)]]))) - ids - fields+cts))))])) - diff --git a/scribble-lib/scribble/private/qsloc.rkt b/scribble-lib/scribble/private/qsloc.rkt deleted file mode 100644 index 03412ba5..00000000 --- a/scribble-lib/scribble/private/qsloc.rkt +++ /dev/null @@ -1,8 +0,0 @@ -#lang scheme/base -(require (for-syntax scheme/base)) - -(provide quote-syntax/loc) - -;; Source locations are now preserved in the bytecode form of `quote-syntax`: -(define-syntax-rule (quote-syntax/loc d) - (quote-syntax d)) diff --git a/scribble-lib/scribble/private/render-utils.rkt b/scribble-lib/scribble/private/render-utils.rkt deleted file mode 100644 index 1abd03e7..00000000 --- a/scribble-lib/scribble/private/render-utils.rkt +++ /dev/null @@ -1,55 +0,0 @@ -#lang scheme/base -(require "../core.rkt") - -(provide part-style? - select-suffix - extract-table-cell-styles - empty-content?) - -(define (part-style? p s) - (memq s (style-properties (part-style p)))) - -(define (select-suffix path suggested-suffixes accepted-suffixes) - (or (ormap (lambda (suggested) - (and (member suggested accepted-suffixes) - (let ([p (bytes->path - (bytes-append (path->bytes (if (string? path) - (string->path path) - path)) - (string->bytes/utf-8 suggested)))]) - (and (file-exists? p) - p)))) - suggested-suffixes) - path)) - -(define (extract-table-cell-styles t) - (let ([vars (style-properties (table-style t))]) - (or (let ([l (ormap (lambda (v) - (and (table-cells? v) - (table-cells-styless v))) - vars)]) - (and l - (unless (= (length l) (length (table-blockss t))) - (error 'table - "table-cells property list's length does not match row count: ~e vs. ~e" - l (length (table-blockss t)))) - (for-each (lambda (l row) - (unless (= (length l) (length row)) - (error 'table - "table-cells property list contains a row whose length does not match the content: ~e vs. ~e" - l (length row)))) - l (table-blockss t)) - l)) - (let ([cols (ormap (lambda (v) (and (table-columns? v) v)) vars)]) - (and cols - (let ([cols (table-columns-styles cols)]) - (map (lambda (row) - (unless (= (length cols) (length row)) - (error 'table - "table-columns property list's length does not match a row length: ~e vs. ~e" - cols (length row))) - cols) - (table-blockss t))))) - (map (lambda (row) (map (lambda (c) plain) row)) (table-blockss t))))) - -(define (empty-content? c) (null? c)) diff --git a/scribble-lib/scribble/private/run-pdflatex.rkt b/scribble-lib/scribble/private/run-pdflatex.rkt deleted file mode 100644 index 0bae4eab..00000000 --- a/scribble-lib/scribble/private/run-pdflatex.rkt +++ /dev/null @@ -1,95 +0,0 @@ -#lang scheme/base - -(require scheme/system scheme/port) - -(provide run-pdflatex run-dvipdf-latex) - -(define (run-pdflatex file [notify void]) (run file notify #f)) -(define (run-dvipdf-latex file [notify void]) - (parameterize ([function-name 'run-dvipdf-latex]) - (run file notify #t))) - -(define max-runs 5) -(define (run file notify via-dvipdf?) - (define latex-cmd-name (if via-dvipdf? "latex" "pdflatex")) - (define cmd - (list (get-latex-binary latex-cmd-name) - "-interaction=batchmode" - (format "~a" file))) - (define logfile (path-replace-suffix file #".log")) - (define (run) - (unless (parameterize ([current-output-port (open-output-nowhere)]) - (apply system* cmd)) - (unless (file-exists? logfile) - (err "did not generate a log file at ~a" logfile)) - (call-with-input-file* logfile - (lambda (log) (copy-port log (current-error-port)))) - (err "got error exit code"))) - (let loop ([n 0]) - (when (= n max-runs) - (err "didn't get a stable result after ~a runs" n)) - (if (zero? n) - (notify "running ~a on ~a" latex-cmd-name file) - (notify " running ~a~a time" - (add1 n) - (case (normalize-for-suffix (add1 n)) [(2) 'nd] [(3) 'rd] [else 'th]))) - (run) - ;; see if we get a "Rerun" note, these seem to come in two flavors - ;; * Label(s) may have changed. Rerun to get cross-references right. - ;; * Package longtable Warning: Table widths have changed. Rerun LaTeX. - (cond [(call-with-input-file* logfile - (lambda (log) (regexp-match? #px#"changed\\.\\s+Rerun" log))) - (loop (add1 n))] - [(zero? n) - (notify "WARNING: no \"Rerun\" found in first run of pdflatex for ~a" - file)])) - (when via-dvipdf? - (define dvi-file (path-replace-suffix file #".dvi")) - (define ps-file (path-replace-suffix file #".ps")) - (unless (file-exists? dvi-file) (err "didn't find .dvi file")) - (define dvips (get-latex-binary "dvips")) - (define pstopdf (get-latex-binary "pstopdf")) - (notify "running dvips on ~a" dvi-file) - (define stderr (open-output-bytes)) - (unless (parameterize ([current-output-port (open-output-nowhere)] - [current-error-port stderr]) - (system* dvips dvi-file)) - (displayln (get-output-bytes stderr)) - (err "got error exit code")) - (unless (parameterize ([current-output-port (open-output-nowhere)] - [current-error-port stderr]) - (system* pstopdf ps-file)) - (displayln (get-output-bytes stderr)) - (err "got error exit code"))) - (path-replace-suffix file #".pdf")) - -(define (normalize-for-suffix n) - (cond - [(<= 10 n 20) 0] - [else (modulo n 10)])) - -(define (get-latex-binary name) - (define ans - (case (system-type) - [(macosx) (or (find-executable-path name) - (for/or ([macosx-candidate-dir (in-list macosx-candidate-dirs)]) - (define macosx-candidate (build-path macosx-candidate-dir name)) - (and (file-exists? macosx-candidate) - macosx-candidate)))] - [(windows) (or (find-executable-path name) - (find-executable-path (format "~a.exe" name)))] - [(unix) (find-executable-path name)])) - (unless ans - (err (format "could not find a `~a' executable" name))) - ans) - -(define function-name (make-parameter 'run-pdflatex)) -(define (err fmt . args) (apply error (function-name) fmt args)) - -;; under mac os x, gui apps do not get started with -;; a good path environment, so put likely candidates -;; for directories holding latex/pdflatex binaries -;; here so that the "scribble pdf" button is more -;; likely to work in drracket -(define macosx-candidate-dirs - '("/usr/texbin" "/Library/TeX/texbin")) diff --git a/scribble-lib/scribble/private/serialize.rkt b/scribble-lib/scribble/private/serialize.rkt deleted file mode 100644 index cc3f26f1..00000000 --- a/scribble-lib/scribble/private/serialize.rkt +++ /dev/null @@ -1,18 +0,0 @@ -#lang racket/base -(require racket/serialize - file/convertible) - -(provide make-serialized-convertible) - -(struct serialized-convertible (ser [deser #:mutable]) - #:property prop:convertible (lambda (v mode default) - (unless (serialized-convertible-deser v) - (set-serialized-convertible-deser! - v - (deserialize (serialized-convertible-ser v)))) - (convert (serialized-convertible-deser v) mode default))) - -(define (make-serialized-convertible ser) - (serialized-convertible ser #f)) - - diff --git a/scribble-lib/scribble/provide-doc-transform.rkt b/scribble-lib/scribble/provide-doc-transform.rkt deleted file mode 100644 index 81451633..00000000 --- a/scribble-lib/scribble/provide-doc-transform.rkt +++ /dev/null @@ -1,7 +0,0 @@ -#lang racket/base -(require "srcdoc.rkt") - -(provide define-provide/doc-transformer - (for-syntax - provide/doc-transformer? - provide/doc-transformer-proc)) diff --git a/scribble-lib/scribble/racket.css b/scribble-lib/scribble/racket.css deleted file mode 100644 index b44fef59..00000000 --- a/scribble-lib/scribble/racket.css +++ /dev/null @@ -1,249 +0,0 @@ - -/* See the beginning of "scribble.css". */ - -/* Monospace: */ -.RktIn, .RktRdr, .RktPn, .RktMeta, -.RktMod, .RktKw, .RktVar, .RktSym, -.RktRes, .RktOut, .RktCmt, .RktVal, -.RktBlk { - font-family: monospace; - white-space: inherit; -} - -/* Serif: */ -.inheritedlbl { - font-family: serif; -} - -/* Sans-serif: */ -.RBackgroundLabelInner { - font-family: sans-serif; -} - -/* ---------------------------------------- */ -/* Inherited methods, left margin */ - -.inherited { - width: 100%; - margin-top: 0.5em; - text-align: left; - background-color: #ECF5F5; -} - -.inherited td { - font-size: 82%; - padding-left: 1em; - text-indent: -0.8em; - padding-right: 0.2em; -} - -.inheritedlbl { - font-style: italic; -} - -/* ---------------------------------------- */ -/* Racket text styles */ - -.RktIn { - color: #cc6633; - background-color: #eeeeee; -} - -.RktInBG { - background-color: #eeeeee; -} - -.RktRdr { -} - -.RktPn { - color: #843c24; -} - -.RktMeta { - color: black; -} - -.RktMod { - color: black; -} - -.RktOpt { - color: black; -} - -.RktKw { - color: black; -} - -.RktErr { - color: red; - font-style: italic; -} - -.RktVar { - color: #262680; - font-style: italic; -} - -.RktSym { - color: #262680; -} - -.RktSymDef { /* used with RktSym at def site */ -} - -.RktValLink { - text-decoration: none; - color: blue; -} - -.RktValDef { /* used with RktValLink at def site */ -} - -.RktModLink { - text-decoration: none; - color: blue; -} - -.RktStxLink { - text-decoration: none; - color: black; -} - -.RktStxDef { /* used with RktStxLink at def site */ -} - -.RktRes { - color: #0000af; -} - -.RktOut { - color: #960096; -} - -.RktCmt { - color: #c2741f; -} - -.RktVal { - color: #228b22; -} - -/* ---------------------------------------- */ -/* Some inline styles */ - -.together { - width: 100%; -} - -.prototype, .argcontract, .RBoxed { - white-space: nowrap; -} - -.prototype td { - vertical-align: text-top; -} - -.RktBlk { - white-space: inherit; - text-align: left; -} - -.RktBlk tr { - white-space: inherit; -} - -.RktBlk td { - vertical-align: baseline; - white-space: inherit; -} - -.argcontract td { - vertical-align: text-top; -} - -.highlighted { - background-color: #ddddff; -} - -.defmodule { - width: 100%; - background-color: #F5F5DC; -} - -.specgrammar { - float: right; -} - -.RBibliography td { - vertical-align: text-top; -} - -.leftindent { - margin-left: 1em; - margin-right: 0em; -} - -.insetpara { - margin-left: 1em; - margin-right: 1em; -} - -.Rfilebox { -} - -.Rfiletitle { - text-align: right; - margin: 0em 0em 0em 0em; -} - -.Rfilename { - border-top: 1px solid #6C8585; - border-right: 1px solid #6C8585; - padding-left: 0.5em; - padding-right: 0.5em; - background-color: #ECF5F5; -} - -.Rfilecontent { - margin: 0em 0em 0em 0em; -} - -.RpackageSpec { - padding-right: 0.5em; -} - -/* ---------------------------------------- */ -/* For background labels */ - -.RBackgroundLabel { - float: right; - width: 0px; - height: 0px; -} - -.RBackgroundLabelInner { - position: relative; - width: 25em; - left: -25.5em; - top: 0px; - text-align: right; - color: white; - z-index: 0; - font-weight: bold; -} - -.RForeground { - position: relative; - left: 0px; - top: 0px; - z-index: 1; -} - -/* ---------------------------------------- */ -/* History */ - -.SHistory { - font-size: 82%; -} diff --git a/scribble-lib/scribble/racket.tex b/scribble-lib/scribble/racket.tex deleted file mode 100644 index fae0ceb7..00000000 --- a/scribble-lib/scribble/racket.tex +++ /dev/null @@ -1,74 +0,0 @@ - -% Redefine \SColorize to produce B&W Scheme text -\newcommand{\SColorize}[2]{\color{#1}{#2}} - -\newcommand{\inColor}[2]{{\Scribtexttt{\SColorize{#1}{#2}}}} -\definecolor{PaleBlue}{rgb}{0.90,0.90,1.0} -\definecolor{LightGray}{rgb}{0.90,0.90,0.90} -\definecolor{CommentColor}{rgb}{0.76,0.45,0.12} -\definecolor{ParenColor}{rgb}{0.52,0.24,0.14} -\definecolor{IdentifierColor}{rgb}{0.15,0.15,0.50} -\definecolor{ResultColor}{rgb}{0.0,0.0,0.69} -\definecolor{ValueColor}{rgb}{0.13,0.55,0.13} -\definecolor{OutputColor}{rgb}{0.59,0.00,0.59} - -\newcommand{\RktPlain}[1]{\inColor{black}{#1}} -\newcommand{\RktKw}[1]{{\SColorize{black}{\Scribtexttt{#1}}}} % no \textbf anymore -\newcommand{\RktStxLink}[1]{\RktKw{#1}} -\newcommand{\RktStxDef}[1]{\RktStxLink{#1}} -\newcommand{\RktCmt}[1]{\inColor{CommentColor}{#1}} -\newcommand{\RktPn}[1]{\inColor{ParenColor}{#1}} -\newcommand{\RktInBG}[1]{\inColor{ParenColor}{#1}} -\newcommand{\RktSym}[1]{\inColor{IdentifierColor}{#1}} -\newcommand{\RktSymDef}[1]{\RktSym{#1}} -\newcommand{\RktVal}[1]{\inColor{ValueColor}{#1}} -\newcommand{\RktValLink}[1]{\inColor{blue}{#1}} -\newcommand{\RktValDef}[1]{\RktValLink{#1}} -\newcommand{\RktModLink}[1]{\inColor{blue}{#1}} -\newcommand{\RktRes}[1]{\inColor{ResultColor}{#1}} -\newcommand{\RktOut}[1]{\inColor{OutputColor}{#1}} -\newcommand{\RktMeta}[1]{\inColor{IdentifierColor}{#1}} -\newcommand{\RktMod}[1]{\inColor{black}{#1}} -\newcommand{\RktRdr}[1]{\inColor{black}{#1}} -\newcommand{\RktVarCol}[1]{\inColor{IdentifierColor}{#1}} -\newcommand{\RktVar}[1]{{\RktVarCol{\textsl{#1}}}} -\newcommand{\RktErrCol}[1]{\inColor{red}{#1}} -\newcommand{\RktErr}[1]{{\RktErrCol{\textrm{\textit{#1}}}}} -\newcommand{\RktOpt}[1]{#1} -\newcommand{\RktIn}[1]{\incolorbox{LightGray}{\RktInBG{#1}}} -\newcommand{\highlighted}[1]{\colorbox{PaleBlue}{\hspace{-0.5ex}\RktInBG{#1}\hspace{-0.5ex}}} - -\newenvironment{RktBlk}{}{} -\newenvironment{defmodule}{}{} -\newenvironment{prototype}{}{} -\newenvironment{argcontract}{}{} -\newenvironment{together}{}{} - -\newenvironment{specgrammar}{}{} - - -\newenvironment{RBibliography}{}{} -\newcommand{\bibentry}[1]{\parbox[t]{0.8\linewidth}{#1}} - -\newenvironment{leftindent}{\begin{quote}}{\end{quote}} -\newenvironment{insetpara}{\begin{quote}}{\end{quote}} - -\newcommand{\Rfilebox}[2]{\begin{list}{}{\topsep=0pt\partopsep=0pt% -\listparindent=0pt\itemindent=0pt\labelwidth=0pt\leftmargin=0ex\rightmargin=0ex% -\itemsep=0pt\parsep=0pt}\item #1 - -#2\end{list}} -\newcommand{\RfileboxBox}[3]{#3{\halign{\hfil##\cr #1 \cr #2 \cr}}} -\newcommand{\RfileboxBoxT}[2]{\RfileboxBox{#1}{#2}{\vtop}} -\newcommand{\RfileboxBoxC}[2]{\RfileboxBox{#1}{#2}{\Svcenter}} -\newcommand{\RfileboxBoxB}[2]{\RfileboxBox{#1}{#2}{\vbox}} -\newcommand{\Rfiletitle}[1]{\hfill \fbox{#1}} -\newcommand{\RfiletitleBox}[1]{\fbox{#1}} -\newcommand{\Rfilename}[1]{#1} -\newenvironment{Rfilecontent}{}{} -\newcommand{\RfilecontentBox}[1]{#1} - -\newcommand{\RBackgroundLabel}[1]{} -\newenvironment{RBackgroundLabelInner}{}{} - -\newcommand{\RpackageSpec}[1]{\hspace{5ex} #1} diff --git a/scribble-lib/scribble/render-struct.rkt b/scribble-lib/scribble/render-struct.rkt deleted file mode 100644 index 24b27b54..00000000 --- a/scribble-lib/scribble/render-struct.rkt +++ /dev/null @@ -1,8 +0,0 @@ -#lang scheme/base - -(require scheme/serialize) -(provide (struct-out mobile-root)) - -(define-serializable-struct mobile-root (path) - #:mutable - #:transparent) diff --git a/scribble-lib/scribble/render.rkt b/scribble-lib/scribble/render.rkt deleted file mode 100644 index 75bf4322..00000000 --- a/scribble-lib/scribble/render.rkt +++ /dev/null @@ -1,95 +0,0 @@ -#lang racket/base - -(require "core.rkt" - "base-render.rkt" - "xref.rkt" - racket/file - racket/class - racket/contract/base - (prefix-in html: "html-render.rkt")) - -(provide/contract - [render (((listof part?) - (listof path-string?)) - (#:render-mixin - (class? . -> . class?) - #:dest-dir (or/c #f path-string?) - #:helper-file-prefix (or/c #f string?) - #:prefix-file (or/c #f path-string?) - #:style-file (or/c #f path-string?) - #:style-extra-files (listof path-string?) - #:extra-files (listof path-string?) - #:image-preferences (listof (or/c 'ps 'pdf 'png 'svg 'gif)) - #:redirect (or/c #f string?) - #:redirect-main (or/c #f string?) - #:directory-depth exact-nonnegative-integer? - #:xrefs (listof xref?) - #:info-in-files (listof path-string?) - #:info-out-file (or/c #f path-string?) - #:quiet? any/c - #:warn-undefined? any/c) - . ->* . void?)]) - -(define (render docs - names - #:render-mixin [render-mixin html:render-mixin] - #:dest-dir [dest-dir #f] - #:helper-file-prefix [helper-file-prefix #f] - #:prefix-file [prefix-file #f] - #:style-file [style-file #f] - #:style-extra-files [style-extra-files null] - #:extra-files [extra-files null] - #:image-preferences [image-preferences null] - #:redirect [redirect #f] - #:redirect-main [redirect-main #f] - #:directory-depth [directory-depth 0] - #:xrefs [xrefs null] - #:info-in-files [info-input-files null] - #:info-out-file [info-output-file #f] - #:quiet? [quiet? #t] - #:warn-undefined? [warn-undefined? (not quiet?)]) - (when dest-dir (make-directory* dest-dir)) - (let ([renderer (new (render-mixin render%) - [dest-dir dest-dir] - [prefix-file prefix-file] - [style-file style-file] - [style-extra-files style-extra-files] - [extra-files extra-files] - [image-preferences image-preferences] - [helper-file-prefix helper-file-prefix])]) - (when redirect - (send renderer set-external-tag-path redirect)) - (when redirect-main - (send renderer set-external-root-url redirect-main)) - (unless (zero? directory-depth) - (send renderer set-directory-depth directory-depth)) - (unless quiet? - (send renderer report-output!)) - (let* ([fns (map (lambda (fn) - (let-values ([(base name dir?) (split-path fn)]) - (let ([fn (path-replace-suffix - name - (send renderer get-suffix))]) - (if dest-dir (build-path dest-dir fn) fn)))) - names)] - [fp (send renderer traverse docs fns)] - [info (send renderer collect docs fns fp)]) - (for ([file (in-list info-input-files)]) - (let ([s (with-input-from-file file read)]) - (send renderer deserialize-info s info))) - (for ([xr (in-list xrefs)]) - (xref-transfer-info renderer info xr)) - (let ([r-info (send renderer resolve docs fns info)]) - (send renderer render docs fns r-info) - (when info-output-file - (let ([s (send renderer serialize-info r-info)]) - (with-output-to-file info-output-file - #:exists 'truncate/replace - (lambda () (write s))))) - (when warn-undefined? - (let ([undef (send renderer get-undefined r-info)]) - (unless (null? undef) - (eprintf "Warning: some cross references may be broken due to undefined tags:\n") - (for ([t (in-list undef)]) - (eprintf " ~s\n" t)))))) - (void)))) diff --git a/scribble-lib/scribble/report/lang.rkt b/scribble-lib/scribble/report/lang.rkt deleted file mode 100644 index 90dbae9b..00000000 --- a/scribble-lib/scribble/report/lang.rkt +++ /dev/null @@ -1,20 +0,0 @@ -#lang racket/base -(require scribble/doclang - scribble/base - "../private/defaults.rkt" - scribble/latex-prefix) - -(provide (except-out (all-from-out scribble/doclang) #%module-begin) - (all-from-out scribble/base) - (rename-out [module-begin #%module-begin])) - -(define-syntax-rule (module-begin id . body) - (#%module-begin id (post-process) () . body)) - -(define ((post-process) doc) - (add-defaults doc - (string->bytes/utf-8 (string-append "\\documentclass{report}\n" - unicode-encoding-packages)) - (scribble-file "book/style.tex") - null - #f)) diff --git a/scribble-lib/scribble/report/lang/reader.rkt b/scribble-lib/scribble/report/lang/reader.rkt deleted file mode 100644 index 51db5d66..00000000 --- a/scribble-lib/scribble/report/lang/reader.rkt +++ /dev/null @@ -1,3 +0,0 @@ -#lang s-exp scribble/base/reader -scribble/report/lang -#:wrapper1 (lambda (t) (cons 'doc (t))) diff --git a/scribble-lib/scribble/run.rkt b/scribble-lib/scribble/run.rkt deleted file mode 100644 index 97bf16ba..00000000 --- a/scribble-lib/scribble/run.rkt +++ /dev/null @@ -1,183 +0,0 @@ -#lang racket/base -(require "xref.rkt" - "render.rkt" - scheme/cmdline - raco/command-name - (prefix-in text: "text-render.rkt") - (prefix-in markdown: "markdown-render.rkt") - (prefix-in html: "html-render.rkt") - (prefix-in latex: "latex-render.rkt") - (prefix-in pdf: "pdf-render.rkt")) - -(module test racket/base) - -(define multi-html:render-mixin - (lambda (%) (html:render-multi-mixin (html:render-mixin %)))) - -(define current-render-mixin (make-parameter html:render-mixin)) -(define current-html (make-parameter #t)) -(define current-dest-directory (make-parameter #f)) -(define current-dest-name (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-extra-files (make-parameter null)) -(define current-redirect (make-parameter #f)) -(define current-redirect-main (make-parameter #f)) -(define current-directory-depth (make-parameter 0)) -(define current-quiet (make-parameter #f)) -(define helper-file-prefix (make-parameter #f)) -(define doc-command-line-arguments (make-parameter null)) -(define current-image-prefs (make-parameter null)) ; reverse order - -(define (read-one str) - (let ([i (open-input-string str)]) - (with-handlers ([exn:fail:read? (lambda (x) #f)]) - (let ([v (read i)]) - (and (eof-object? (read i)) v))))) - -(define (run) - (command-line - #:program (short-program+command-name) - #:once-any - [("--html") "generate HTML-format output file (the default)" - (current-html #t) - (current-render-mixin html:render-mixin)] - [("--htmls") "generate HTML-format output directory" - (current-html #t) - (current-render-mixin multi-html:render-mixin)] - [("--html-tree") n "generate HTML-format output directories deep" - (let ([nv (string->number n)]) - (unless (exact-nonnegative-integer? nv) - (raise-user-error 'scribble - "invalid depth: ~a" - n)) - (current-directory-depth nv) - (current-html #t) - (current-render-mixin (if (zero? nv) - html:render-mixin - multi-html:render-mixin)))] - [("--latex") "generate LaTeX-format output" - (current-html #f) - (current-render-mixin latex:render-mixin)] - [("--pdf") "generate PDF-format output (via PDFLaTeX)" - (current-html #f) - (current-render-mixin pdf:render-mixin)] - [("--dvipdf") "generate PDF-format output (via LaTeX, dvips, and pstopdf)" - (current-html #f) - (current-render-mixin pdf:dvi-render-mixin)] - [("--latex-section") n "generate LaTeX-format output for section depth " - (current-html #f) - (let ([v (string->number n)]) - (unless (exact-nonnegative-integer? v) - (raise-user-error 'scribble (format "bad section depth: ~a" n))) - (current-render-mixin (latex:make-render-part-mixin v)))] - [("--text") "generate text-format output" - (current-html #f) - (current-render-mixin text:render-mixin)] - [("--markdown") "generate markdown-format output" - (current-html #f) - (current-render-mixin markdown:render-mixin)] - #:once-each - [("--dest") dir "write output in

      " - (current-dest-directory dir)] - [("--dest-name") name "write output as " - (current-dest-name name)] - [("--dest-base") prefix "start support-file names with " - (helper-file-prefix prefix)] - #:multi - [("++convert") fmt ("prefer image conversion to (in given order)" - " as one of: ps pdf svg png gif") - (define sym (string->symbol fmt)) - (unless (member sym '(ps pdf svg png gif)) - (raise-user-error 'scribble "bad format for ++convert: ~s" fmt)) - (current-image-prefs (cons sym (current-image-prefs)))] - [("++style") file "add given .css/.tex file after others" - (current-style-extra-files (cons file (current-style-extra-files)))] - #:once-each - [("--style") file "use given base .css/.tex file" - (current-style-file file)] - [("--prefix") file "use given .html/.tex prefix (for doctype/documentclass)" - (current-prefix-file file)] - #:multi - [("++extra") file "add given file" - (current-extra-files (cons file (current-extra-files)))] - [("--redirect-main") url "redirect main doc links to " - (current-redirect-main url)] - [("--redirect") url "redirect external links to tag search via " - (current-redirect url)] - [("+m" "++main-xref-in") ("load format-specific cross-ref info for" - "all installed library collections") - (current-xref-input-modules - (cons (cons 'setup/xref 'load-collections-xref) (current-xref-input-modules)))] - [("++xref-in") module-path proc-id ("load format-specific cross-ref info by" - "calling as exported by ") - (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))))] - [("--info-out") file "write format-specific cross-ref info to " - (current-info-output-file file)] - [("++info-in") file "load format-specific cross-ref info from " - (current-info-input-files - (cons file (current-info-input-files)))] - [("++arg") arg "add to current-command-line-arguments" - (doc-command-line-arguments - (cons arg (doc-command-line-arguments)))] - #:once-each - [("--quiet") "suppress output-file and undefined-tag reporting" - (current-quiet #t)] - #:args (file . another-file) - (let ([files (cons file another-file)]) - (parameterize ([current-command-line-arguments - (list->vector (reverse (doc-command-line-arguments)))]) - (build-docs (map (lambda (file) - ;; Try `doc' submodule, first: - (if (module-declared? `(submod (file ,file) doc) #t) - (dynamic-require `(submod (file ,file) doc) 'doc) - (dynamic-require `(file ,file) 'doc))) - files) - files))))) - -(define (build-docs docs files) - (when (and (current-dest-name) - ((length files) . > . 1)) - (raise-user-error 'scribble "cannot supply a destination name with multiple inputs")) - (render docs - (map (lambda (fn) - (let-values ([(base name dir?) (split-path fn)]) - (or (current-dest-name) name))) - files) - #:dest-dir (current-dest-directory) - #:render-mixin (current-render-mixin) - #:image-preferences (reverse (current-image-prefs)) - #:prefix-file (current-prefix-file) - #:style-file (current-style-file) - #:style-extra-files (reverse (current-style-extra-files)) - #:extra-files (reverse (current-extra-files)) - #:helper-file-prefix (helper-file-prefix) - #:redirect (and (current-html) (current-redirect)) - #:redirect-main (and (current-html) (current-redirect-main)) - #:directory-depth (current-directory-depth) - #:quiet? (current-quiet) - #:info-in-files (reverse (current-info-input-files)) - #:xrefs (for/list ([mod+id (in-list (reverse (current-xref-input-modules)))]) - (let* ([get-xref (dynamic-require (car mod+id) (cdr mod+id))] - [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)) - xr)) - #:info-out-file (current-info-output-file))) - -(run) diff --git a/scribble-lib/scribble/scheme.rkt b/scribble-lib/scribble/scheme.rkt deleted file mode 100644 index e7b11319..00000000 --- a/scribble-lib/scribble/scheme.rkt +++ /dev/null @@ -1,3 +0,0 @@ -#lang racket/base -(require "racket.rkt") -(provide (all-from-out "racket.rkt")) diff --git a/scribble-lib/scribble/scribble-common.js b/scribble-lib/scribble/scribble-common.js deleted file mode 100644 index 1ec7da58..00000000 --- a/scribble-lib/scribble/scribble-common.js +++ /dev/null @@ -1,170 +0,0 @@ -// Common functionality for PLT documentation pages - -// Page Parameters ------------------------------------------------------------ - -var page_query_string = location.search.substring(1); - -var page_args = - ((function(){ - if (!page_query_string) return []; - var args = page_query_string.split(/[&;]/); - for (var i=0; i= 0) args[i] = [a.substring(0,p), a.substring(p+1)]; - else args[i] = [a, false]; - } - return args; - })()); - -function GetPageArg(key, def) { - for (var i=0; i= 0 && cur.substring(0,eql) == key) - return unescape(cur.substring(eql+1)); - } - return def; - } -} - -function SetCookie(key, val) { - try { - localStorage[key] = val; - } catch(e) { - var d = new Date(); - d.setTime(d.getTime()+(365*24*60*60*1000)); - try { - document.cookie = - key + "=" + escape(val) + "; expires="+ d.toGMTString() + "; path=/"; - } catch (e) {} - } -} - -// note that this always stores a directory name, ending with a "/" -function SetPLTRoot(ver, relative) { - var root = location.protocol + "//" + location.host - + NormalizePath(location.pathname.replace(/[^\/]*$/, relative)); - SetCookie("PLT_Root."+ver, root); -} - -// adding index.html works because of the above -function GotoPLTRoot(ver, relative) { - var u = GetCookie("PLT_Root."+ver, null); - if (u == null) return true; // no cookie: use plain up link - // the relative path is optional, default goes to the toplevel start page - if (!relative) relative = "index.html"; - location = u + relative; - return false; -} - -// Utilities ------------------------------------------------------------------ - -var normalize_rxs = [/\/\/+/g, /\/\.(\/|$)/, /\/[^\/]*\/\.\.(\/|$)/]; -function NormalizePath(path) { - var tmp, i; - for (i = 0; i < normalize_rxs.length; i++) - while ((tmp = path.replace(normalize_rxs[i], "/")) != path) path = tmp; - return path; -} - -// `noscript' is problematic in some browsers (always renders as a -// block), use this hack instead (does not always work!) -// document.write(""); - -// Interactions --------------------------------------------------------------- - -function DoSearchKey(event, field, ver, top_path) { - var val = field.value; - if (event && event.keyCode == 13) { - var u = GetCookie("PLT_Root."+ver, null); - if (u == null) u = top_path; // default: go to the top path - u += "search/index.html?q=" + encodeURIComponent(val); - u = MergePageArgsIntoUrl(u); - location = u; - return false; - } - return true; -} - -function TocviewToggle(glyph, id) { - var s = document.getElementById(id).style; - var expand = s.display == "none"; - s.display = expand ? "block" : "none"; - glyph.innerHTML = expand ? "▼" : "►"; -} - -// Page Init ------------------------------------------------------------------ - -// Note: could make a function that inspects and uses window.onload to chain to -// a previous one, but this file needs to be required first anyway, since it -// contains utilities for all other files. -var on_load_funcs = []; -function AddOnLoad(fun) { on_load_funcs.push(fun); } -window.onload = function() { - for (var i=0; i diff --git a/scribble-lib/scribble/scribble-prefix.tex b/scribble-lib/scribble/scribble-prefix.tex deleted file mode 100644 index e57dd4f9..00000000 --- a/scribble-lib/scribble/scribble-prefix.tex +++ /dev/null @@ -1,5 +0,0 @@ -% This is the default prefix for Scribble-generated Latex -\documentclass{article} - -\usepackage[utf8]{inputenc} -\usepackage[T1]{fontenc} diff --git a/scribble-lib/scribble/scribble-skull.tex b/scribble-lib/scribble/scribble-skull.tex deleted file mode 100644 index 3834c40a..00000000 --- a/scribble-lib/scribble/scribble-skull.tex +++ /dev/null @@ -1 +0,0 @@ -\usepackage{skull} diff --git a/scribble-lib/scribble/scribble-style.css b/scribble-lib/scribble/scribble-style.css deleted file mode 100644 index e69de29b..00000000 diff --git a/scribble-lib/scribble/scribble-style.tex b/scribble-lib/scribble/scribble-style.tex deleted file mode 100644 index e69de29b..00000000 diff --git a/scribble-lib/scribble/scribble.css b/scribble-lib/scribble/scribble.css deleted file mode 100644 index 9733e69d..00000000 --- a/scribble-lib/scribble/scribble.css +++ /dev/null @@ -1,484 +0,0 @@ - -/* This file is used by default by all Scribble documents. - See also "manual.css", which is added by default by the - `scribble/manual` language. */ - -/* CSS seems backward: List all the classes for which we want a - particular font, so that the font can be changed in one place. (It - would be nicer to reference a font definition from all the places - that we want it.) - - As you read the rest of the file, remember to double-check here to - see if any font is set. */ - -/* Monospace: */ -.maincolumn, .refpara, .refelem, .tocset, .stt, .hspace, .refparaleft, .refelemleft { - font-family: monospace; -} - -/* Serif: */ -.main, .refcontent, .tocview, .tocsub, .sroman, i { - font-family: serif; -} - -/* Sans-serif: */ -.version, .versionNoNav, .ssansserif { - font-family: sans-serif; -} -.ssansserif { - font-size: 80%; - font-weight: bold; -} - -/* ---------------------------------------- */ - -p, .SIntrapara { - display: block; - margin: 1em 0; -} - -h2 { /* per-page main title */ - margin-top: 0; -} - -h3, h4, h5, h6, h7, h8 { - margin-top: 1.75em; - margin-bottom: 0.5em; -} - -.SSubSubSubSection { - font-weight: bold; - font-size: 0.83em; /* should match h5; from HTML 4 reference */ -} - -/* Needed for browsers like Opera, and eventually for HTML 4 conformance. - This means that multiple paragraphs in a table element do not have a space - between them. */ -table p { - margin-top: 0; - margin-bottom: 0; -} - -/* ---------------------------------------- */ -/* Main */ - -body { - color: black; - background-color: #ffffff; -} - -table td { - padding-left: 0; - padding-right: 0; -} - -.maincolumn { - width: 43em; - margin-right: -40em; - margin-left: 15em; -} - -.main { - text-align: left; -} - -/* ---------------------------------------- */ -/* Navigation */ - -.navsettop, .navsetbottom { - background-color: #f0f0e0; - padding: 0.25em 0 0.25em 0; -} - -.navsettop { - margin-bottom: 1.5em; - border-bottom: 2px solid #e0e0c0; -} - -.navsetbottom { - margin-top: 2em; - border-top: 2px solid #e0e0c0; -} - -.navleft { - margin-left: 1ex; - position: relative; - float: left; - white-space: nowrap; -} -.navright { - margin-right: 1ex; - position: relative; - float: right; - white-space: nowrap; -} -.nonavigation { - color: #e0e0e0; -} - -.searchform { - display: inline; - margin: 0; - padding: 0; -} - -.nosearchform { - display: none; -} - -.searchbox { - width: 16em; - margin: 0px; - padding: 0px; - background-color: #eee; - border: 1px solid #ddd; - text-align: center; - vertical-align: middle; -} - -#contextindicator { - position: fixed; - background-color: #c6f; - color: #000; - font-family: monospace; - font-weight: bold; - padding: 2px 10px; - display: none; - right: 0; - bottom: 0; -} - -/* ---------------------------------------- */ -/* Version */ - -.versionbox { - position: relative; - float: right; - left: 2em; - height: 0em; - width: 13em; - margin: 0em -13em 0em 0em; -} -.version { - font-size: small; -} -.versionNoNav { - font-size: xx-small; /* avoid overlap with author */ -} - -.version:before, .versionNoNav:before { - content: "Version "; -} - -/* ---------------------------------------- */ -/* Margin notes */ - -.refpara, .refelem { - position: relative; - float: right; - left: 2em; - height: 0em; - width: 13em; - margin: 0em -13em 0em 0em; -} - -.refpara, .refparaleft { - top: -1em; -} - -.refcolumn { - background-color: #F5F5DC; - display: block; - position: relative; - width: 13em; - font-size: 85%; - border: 0.5em solid #F5F5DC; - margin: 0 0 0 0; -} - -.refcontent { - margin: 0 0 0 0; -} - -.refcontent p { - margin-top: 0; - margin-bottom: 0; -} - -.refparaleft, .refelemleft { - position: relative; - float: left; - right: 2em; - height: 0em; - width: 13em; - margin: 0em 0em 0em -13em; -} - -.refcolumnleft { - background-color: #F5F5DC; - display: block; - position: relative; - width: 13em; - font-size: 85%; - border: 0.5em solid #F5F5DC; - margin: 0 0 0 0; -} - - -/* ---------------------------------------- */ -/* Table of contents, inline */ - -.toclink { - text-decoration: none; - color: blue; - font-size: 85%; -} - -.toptoclink { - text-decoration: none; - color: blue; - font-weight: bold; -} - -/* ---------------------------------------- */ -/* Table of contents, left margin */ - -.tocset { - position: relative; - float: left; - width: 12.5em; - margin-right: 2em; -} -.tocset td { - vertical-align: text-top; -} - -.tocview { - text-align: left; - background-color: #f0f0e0; -} - -.tocsub { - text-align: left; - margin-top: 0.5em; - background-color: #f0f0e0; -} - -.tocviewlist, .tocsublist { - margin-left: 0.2em; - margin-right: 0.2em; - padding-top: 0.2em; - padding-bottom: 0.2em; -} -.tocviewlist table { - font-size: 82%; -} - -.tocviewlisttopspace { - margin-bottom: 1em; -} - -.tocviewsublist, .tocviewsublistonly, .tocviewsublisttop, .tocviewsublistbottom { - margin-left: 0.4em; - border-left: 1px solid #bbf; - padding-left: 0.8em; -} -.tocviewsublist { - margin-bottom: 1em; -} -.tocviewsublist table, -.tocviewsublistonly table, -.tocviewsublisttop table, -.tocviewsublistbottom table { - font-size: 75%; -} - -.tocviewtitle * { - font-weight: bold; -} - -.tocviewlink { - text-decoration: none; - color: blue; -} - -.tocviewselflink { - text-decoration: underline; - color: blue; -} - -.tocviewtoggle { - text-decoration: none; - color: blue; - font-size: 75%; /* looks better, and avoids bounce when toggling sub-sections due to font alignments */ -} - -.tocsublist td { - padding-left: 1em; - text-indent: -1em; -} - -.tocsublinknumber { - font-size: 82%; -} - -.tocsublink { - font-size: 82%; - text-decoration: none; -} - -.tocsubseclink { - font-size: 82%; - text-decoration: none; -} - -.tocsubnonseclink { - font-size: 82%; - text-decoration: none; - padding-left: 0.5em; -} - -.tocsubtitle { - font-size: 82%; - font-style: italic; - margin: 0.2em; -} - -/* ---------------------------------------- */ -/* Some inline styles */ - -.indexlink { - text-decoration: none; -} - -.nobreak { - white-space: nowrap; -} - -pre { margin-left: 2em; } -blockquote { margin-left: 2em; } - -ol { list-style-type: decimal; } -ol ol { list-style-type: lower-alpha; } -ol ol ol { list-style-type: lower-roman; } -ol ol ol ol { list-style-type: upper-alpha; } - -.SCodeFlow { - display: block; - margin-left: 1em; - margin-bottom: 0em; - margin-right: 1em; - margin-top: 0em; - white-space: nowrap; -} - -.SVInsetFlow { - display: block; - margin-left: 0em; - margin-bottom: 0em; - margin-right: 0em; - margin-top: 0em; -} - -.SubFlow { - display: block; - margin: 0em; -} - -.boxed { - width: 100%; - background-color: #E8E8FF; -} - -.hspace { -} - -.slant { - font-style: oblique; -} - -.badlink { - text-decoration: underline; - color: red; -} - -.plainlink { - text-decoration: none; - color: blue; -} - -.techoutside { text-decoration: underline; color: #b0b0b0; } -.techoutside:hover { text-decoration: underline; color: blue; } - -/* .techinside:hover doesn't work with FF, .techinside:hover> - .techinside doesn't work with IE, so use both (and IE doesn't - work with inherit in the second one, so use blue directly) */ -.techinside { color: black; } -.techinside:hover { color: blue; } -.techoutside:hover>.techinside { color: inherit; } - -.SCentered { - text-align: center; -} - -.imageleft { - float: left; - margin-right: 0.3em; -} - -.Smaller { - font-size: 82%; -} - -.Larger { - font-size: 122%; -} - -/* A hack, inserted to break some Scheme ids: */ -.mywbr { - display: inline-block; - height: 0; - width: 0; - font-size: 1px; -} - -.compact li p { - margin: 0em; - padding: 0em; -} - -.noborder img { - border: 0; -} - -.SAuthorListBox { - position: relative; - float: right; - left: 2em; - top: -2.5em; - height: 0em; - width: 13em; - margin: 0em -13em 0em 0em; -} -.SAuthorList { - font-size: 82%; -} -.SAuthorList:before { - content: "by "; -} -.author { - display: inline; - white-space: nowrap; -} - -/* print styles : hide the navigation elements */ -@media print { - .tocset, - .navsettop, - .navsetbottom { display: none; } - .maincolumn { - width: auto; - margin-right: 13em; - margin-left: 0; - } -} diff --git a/scribble-lib/scribble/scribble.tex b/scribble-lib/scribble/scribble.tex deleted file mode 100644 index 0ae9df23..00000000 --- a/scribble-lib/scribble/scribble.tex +++ /dev/null @@ -1,397 +0,0 @@ -% This is the default style configuration for Scribble-generated Latex - -\packageGraphicx -\packageHyperref -\renewrmdefault -\packageRelsize -\packageMathabx -\packageWasysym -\packageTextcomp -\packageFramed -\packageHyphenat -\packageColor -\doHypersetup -\packageTocstyle -\packageCJK - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% Configuration that is especially meant to be overridden: - -% Inserted before every ``chapter'', useful for starting each one on a new page: -\newcommand{\sectionNewpage}{} -% Inserted before every book ``part'' -\newcommand{\partNewpage}{\sectionNewpage} - -% Hooks for actions within the `document' environment: -\newcommand{\preDoc}{} -\newcommand{\postDoc}{} - -% Generated by `secref'; first arg is section number, second is section title: -\newcommand{\BookRef}[2]{\emph{#2}} -\newcommand{\ChapRef}[2]{\SecRef{#1}{#2}} -\newcommand{\SecRef}[2]{section~#1} -\newcommand{\PartRef}[2]{part~#1} -% Generated by `Secref': -\newcommand{\BookRefUC}[2]{\BookRef{#1}{#2}} -\newcommand{\ChapRefUC}[2]{\SecRefUC{#1}{#2}} -\newcommand{\SecRefUC}[2]{Section~#1} -\newcommand{\PartRefUC}[2]{Part~#1} - -% Variants of the above with a label for an internal reference: -\newcommand{\BookRefLocal}[3]{\hyperref[#1]{\BookRef{#2}{#3}}} -\newcommand{\ChapRefLocal}[3]{\hyperref[#1]{\ChapRef{#2}{#3}}} -\newcommand{\SecRefLocal}[3]{\hyperref[#1]{\SecRef{#2}{#3}}} -\newcommand{\PartRefLocal}[3]{\hyperref[#1]{\PartRef{#2}{#3}}} -\newcommand{\BookRefLocalUC}[3]{\hyperref[#1]{\BookRefUC{#2}{#3}}} -\newcommand{\ChapRefLocalUC}[3]{\hyperref[#1]{\ChapRefUC{#2}{#3}}} -\newcommand{\SecRefLocalUC}[3]{\hyperref[#1]{\SecRefUC{#2}{#3}}} -\newcommand{\PartRefLocalUC}[3]{\hyperref[#1]{\PartRefUC{#2}{#3}}} - -% Variants of the above with a section number is empty (i.e., UnNumbered): -\newcommand{\BookRefUN}[1]{\BookRef{}{#1}} -\newcommand{\ChapRefUN}[1]{\SecRefUN{#1}} -\newcommand{\SecRefUN}[1]{``#1''} -\newcommand{\PartRefUN}[1]{\SecRefUN{#1}} -\newcommand{\BookRefUCUN}[1]{\BookRefUN{#1}} -\newcommand{\ChapRefUCUN}[1]{\ChapRefUN{#1}} -\newcommand{\SecRefUCUN}[1]{\SecRefUN{#1}} -\newcommand{\PartRefUCUN}[1]{\PartRefUN{#1}} - -\newcommand{\BookRefLocalUN}[2]{\hyperref[#1]{\BookRefUN{#2}}} -\newcommand{\ChapRefLocalUN}[2]{\SecRefLocalUN{#1}{#2}} -\newcommand{\SecRefLocalUN}[2]{\SecRefUN{#2} on page~\pageref{#1}} -\newcommand{\PartRefLocalUN}[2]{\SecRefLocalUN{#1}{#2}} -\newcommand{\BookRefLocalUCUN}[2]{\BookRefLocalUN{#1}{#2}} -\newcommand{\ChapRefLocalUCUN}[2]{\ChapRefLocalUN{#1}{#2}} -\newcommand{\SecRefLocalUCUN}[2]{\SecRefLocalUN{#1}{#2}} -\newcommand{\PartRefLocalUCUN}[2]{\PartRefLocalUN{#1}{#2}} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% Fonts - -% Font commands used by generated text: -\newcommand{\Scribtexttt}[1]{{\texttt{#1}}} -\newcommand{\textsub}[1]{$_{\hbox{\textsmaller{#1}}}$} -\newcommand{\textsuper}[1]{$^{\hbox{\textsmaller{#1}}}$} -\newcommand{\intextcolor}[2]{\textcolor{#1}{#2}} -\newcommand{\intextrgbcolor}[2]{\textcolor[rgb]{#1}{#2}} -\newcommand{\incolorbox}[2]{{\fboxrule=0pt\fboxsep=0pt\colorbox{#1}{#2}}} -\newcommand{\inrgbcolorbox}[2]{{\fboxrule=0pt\fboxsep=0pt\colorbox[rgb]{#1}{#2}}} -\newcommand{\plainlink}[1]{#1} -\newcommand{\techoutside}[1]{#1} -\newcommand{\techinside}[1]{#1} -\newcommand{\badlink}[1]{#1} -\newcommand{\indexlink}[1]{#1} -\newcommand{\noborder}[1]{#1} -\newcommand{\Smaller}[1]{\textsmaller{#1}} -\newcommand{\Larger}[1]{\textlarger{#1}} -\newcommand{\planetName}[1]{PLane\hspace{-0.1ex}T} -\newcommand{\slant}[1]{{\textsl{#1}}} - -% Used for <, >, and | in tt mode. For some fonts and installations, -% there seems to be an encoding issue, so pick T1 explicitly: -\newcommand{\Stttextmore}{{\fontencoding{T1}\selectfont>}} -\newcommand{\Stttextless}{{\fontencoding{T1}\selectfont<}} -\newcommand{\Stttextbar}{{\fontencoding{T1}\selectfont|}} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% Tables - -% The `stabular' environment seems to be the lesser of evils among -% page-breaking table environments (and we've made a copy as ``pltstabular' -% to make sure that it doesn't change). - -\makeatletter -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\message{pltstabular is a modification of stabular} -%% A renamed vsetion of: -%% stabular.sty -%% Copyright 1998 Sigitas Tolu\v sis -%% VTeX Ltd., Akademijos 4, Vilnius, Lithuania -%% e-mail sigitas@vtex.lt -%% http://www.vtex.lt/tex/download/macros/ -%% -% This program can redistributed and/or modified under the terms -% of the LaTeX Project Public License Distributed from CTAN -% archives in directory macros/latex/base/lppl.txt; either -% version 1 of the License, or (at your option) any later version. -% -% PURPOSE: Improve tabular environment. -% -% SHORT DESCRIPTION: -% -% Changed internal commands: \@mkpream, \@addamp, \@xhline -% -% Provides new commands in tabular (used after command \\): -% \emptyrow[#1] -% ------------- -% Adds empty row, #1 - height of the row -% -% \tabrow{#1}[#2] -% --------------- -% Adds row of natural height: #1\\[#2] -% -% Provides new environments: pltstabular and pltstabular* -% -------- --------- -% One more multi-page version of tabular -% -% -\def\empty@finalstrut#1{% - \unskip\ifhmode\nobreak\fi\vrule\@width\z@\@height\z@\@depth\z@} -\def\no@strut{\global\setbox\@arstrutbox\hbox{% - \vrule \@height\z@ - \@depth\z@ - \@width\z@}% - \gdef\@endpbox{\empty@finalstrut\@arstrutbox\par\egroup\hfil}% -}% -\def\yes@strut{\global\setbox\@arstrutbox\hbox{% - \vrule \@height\arraystretch \ht\strutbox - \@depth\arraystretch \dp\strutbox - \@width\z@}% - \gdef\@endpbox{\@finalstrut\@arstrutbox\par\egroup\hfil}% -}% -\def\@mkpream#1{\@firstamptrue\@lastchclass6 - \let\@preamble\@empty\def\empty@preamble{\add@ins}% - \let\protect\@unexpandable@protect - \let\@sharp\relax\let\add@ins\relax - \let\@startpbox\relax\let\@endpbox\relax - \@expast{#1}% - \expandafter\@tfor \expandafter - \@nextchar \expandafter:\expandafter=\reserved@a\do - {\@testpach\@nextchar - \ifcase \@chclass \@classz \or \@classi \or \@classii \or \@classiii - \or \@classiv \or\@classv \fi\@lastchclass\@chclass}% - \ifcase \@lastchclass \@acol - \or \or \@preamerr \@ne\or \@preamerr \tw@\or \or \@acol \fi} -\def\@addamp{% - \if@firstamp - \@firstampfalse - \edef\empty@preamble{\add@ins}% - \else - \edef\@preamble{\@preamble &}% - \edef\empty@preamble{\expandafter\noexpand\empty@preamble &\add@ins}% - \fi} -\newif\iftw@hlines \tw@hlinesfalse -\def\@xhline{\ifx\reserved@a\hline - \tw@hlinestrue - \else\ifx\reserved@a\Hline - \tw@hlinestrue - \else - \tw@hlinesfalse - \fi\fi - \iftw@hlines - \aftergroup\do@after - \fi - \ifnum0=`{\fi}% -} -\def\do@after{\emptyrow[\the\doublerulesep]} -\def\emptyrow{\noalign\bgroup\@ifnextchar[\@emptyrow{\@emptyrow[\z@]}} -\def\@emptyrow[#1]{\no@strut\gdef\add@ins{\vrule \@height\z@ \@depth#1 \@width\z@}\egroup% -\empty@preamble\\ -\noalign{\yes@strut\gdef\add@ins{\vrule \@height\z@ \@depth\z@ \@width\z@}}% -} -\def\tabrow#1{\noalign\bgroup\@ifnextchar[{\@tabrow{#1}}{\@tabrow{#1}[]}} -\def\@tabrow#1[#2]{\no@strut\egroup#1\ifx.#2.\\\else\\[#2]\fi\noalign{\yes@strut}} -% -\def\endpltstabular{\crcr\egroup\egroup \egroup} -\expandafter \let \csname endpltstabular*\endcsname = \endpltstabular -\def\pltstabular{\let\@halignto\@empty\@pltstabular} -\@namedef{pltstabular*}#1{\def\@halignto{to#1}\@pltstabular} -\def\@pltstabular{\leavevmode \bgroup \let\@acol\@tabacol - \let\@classz\@tabclassz - \let\@classiv\@tabclassiv \let\\\@tabularcr\@stabarray} -\def\@stabarray{\m@th\@ifnextchar[\@sarray{\@sarray[c]}} -\def\@sarray[#1]#2{% - \bgroup - \setbox\@arstrutbox\hbox{% - \vrule \@height\arraystretch\ht\strutbox - \@depth\arraystretch \dp\strutbox - \@width\z@}% - \@mkpream{#2}% - \edef\@preamble{% - \ialign \noexpand\@halignto - \bgroup \@arstrut \@preamble \tabskip\z@skip \cr}% - \let\@startpbox\@@startpbox \let\@endpbox\@@endpbox - \let\tabularnewline\\% -% \let\par\@empty - \let\@sharp##% - \set@typeset@protect - \lineskip\z@skip\baselineskip\z@skip - \@preamble} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\makeatother - -\newenvironment{bigtabular}{\begin{pltstabular}}{\end{pltstabular}} -% For the 'boxed table style: -\newcommand{\SBoxedLeft}{\textcolor[rgb]{0.6,0.6,1.0}{\vrule width 3pt\hspace{3pt}}} -% Formerly used to keep the horizontal line for a definition on the same page: -\newcommand{\SEndFirstHead}[0]{ \nopagebreak \\ } -% Corrects weirdness when a table is the first thing in -% an itemization: -\newcommand{\bigtableinlinecorrect}[0]{~ - -\vspace{-\baselineskip}\vspace{\parskip}} -% Used to indent the table correctly in an itemization, since that's -% one of the things stabular gets wrong: -\newlength{\stabLeft} -\newcommand{\bigtableleftpad}{\hspace{\stabLeft}} -\newcommand{\atItemizeStart}[0]{\addtolength{\stabLeft}{\labelsep} - \addtolength{\stabLeft}{\labelwidth}} - - -% For a single-column table in simple environments, it's better to -% use the `list' environment instead of `stabular'. -\newenvironment{SingleColumn}{\begin{list}{}{\topsep=0pt\partopsep=0pt% -\listparindent=0pt\itemindent=0pt\labelwidth=0pt\leftmargin=0pt\rightmargin=0pt% -\itemsep=0pt\parsep=0pt}\item}{\end{list}} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% Etc. - -% ._ and .__ -\newcommand{\Sendabbrev}[1]{#1\@} -\newcommand{\Sendsentence}[1]{\@#1} - -% Default style for a nested flow: -\newenvironment{Subflow}{\begin{list}{}{\topsep=0pt\partopsep=0pt% -\listparindent=0pt\itemindent=0pt\labelwidth=0pt\leftmargin=0pt\rightmargin=0pt% -\itemsep=0pt}\item}{\end{list}} - -% For the 'inset nested-flow style: -\newenvironment{SInsetFlow}{\begin{quote}}{\end{quote}} - -% Indent a 'code-inset nested flow: -\newcommand{\SCodePreSkip}{\vskip\abovedisplayskip} -\newcommand{\SCodePostSkip}{\vskip\belowdisplayskip} -\newenvironment{SCodeFlow}{\SCodePreSkip\begin{list}{}{\topsep=0pt\partopsep=0pt% -\listparindent=0pt\itemindent=0pt\labelwidth=0pt\leftmargin=2ex\rightmargin=2ex% -\itemsep=0pt\parsep=0pt}\item}{\end{list}\SCodePostSkip} -\newcommand{\SCodeInsetBox}[1]{\setbox1=\hbox{\hbox{\hspace{2ex}#1\hspace{2ex}}}\vbox{\SCodePreSkip\vtop{\box1\SCodePostSkip}}} - -% Inset a 'vertical-inset nested flow: -\newcommand{\SVInsetPreSkip}{\vskip\abovedisplayskip} -\newcommand{\SVInsetPostSkip}{\vskip\belowdisplayskip} -\newenvironment{SVInsetFlow}{\SVInsetPreSkip\begin{list}{}{\topsep=0pt\partopsep=0pt% -\listparindent=0pt\itemindent=0pt\labelwidth=0pt\leftmargin=0pt\rightmargin=0pt% -\itemsep=0pt\parsep=0pt}\item}{\end{list}\SVInsetPostSkip} -\newcommand{\SVInsetBox}[1]{\setbox1=\hbox{\hbox{#1}}\vbox{\SCodePreSkip\vtop{\box1\SCodePostSkip}}} - -% The 'compact itemization style: -\newenvironment{compact}{\begin{itemize}}{\end{itemize}} -\newcommand{\compactItem}[1]{\item #1} - -% The nested-flow style for `centerline': -\newenvironment{SCentered}{\begin{trivlist}\item \centering}{\end{trivlist}} - -% The \refpara command corresponds to `margin-note'. The -% refcolumn and refcontent environments also wrap the note, -% because they simplify the CSS side. -\newcommand{\refpara}[1]{\normalmarginpar\marginpar{\raggedright \footnotesize #1}} -\newcommand{\refelem}[1]{\refpara{#1}} -\newenvironment{refcolumn}{}{} -\newenvironment{refcontent}{}{} - -\newcommand{\refparaleft}[1]{\reversemarginpar\marginpar{\raggedright \footnotesize #1}} -\newcommand{\refelemleft}[1]{\refparaleft{#1}} -\newenvironment{refcolumnleft}{}{} - -% Macros used by `title' and `author': -\newcommand{\titleAndVersionAndAuthors}[3]{\title{#1\\{\normalsize \SVersionBefore{}#2}}\author{#3}\maketitle} -\newcommand{\titleAndVersionAndEmptyAuthors}[3]{\title{#1\\{\normalsize \SVersionBefore{}#2}}#3\maketitle} -\newcommand{\titleAndEmptyVersionAndAuthors}[3]{\title{#1}\author{#3}\maketitle} -\newcommand{\titleAndEmptyVersionAndEmptyAuthors}[3]{\title{#1}\maketitle} -\newcommand{\SAuthor}[1]{#1} -\newcommand{\SAuthorSep}[1]{\qquad} -\newcommand{\SVersionBefore}[1]{Version } - -% Useful for some styles, such as sigalternate: -\newcommand{\SNumberOfAuthors}[1]{} - -\let\SOriginalthesubsection\thesubsection -\let\SOriginalthesubsubsection\thesubsubsection - -% sections -\newcommand{\Spart}[2]{\part[#1]{#2}} -\newcommand{\Ssection}[2]{\section[#1]{#2}\let\thesubsection\SOriginalthesubsection} -\newcommand{\Ssubsection}[2]{\subsection[#1]{#2}\let\thesubsubsection\SOriginalthesubsubsection} -\newcommand{\Ssubsubsection}[2]{\subsubsection[#1]{#2}} -\newcommand{\Ssubsubsubsection}[2]{{\bf #2}} -\newcommand{\Ssubsubsubsubsection}[2]{\Ssubsubsubsection{#1}{#2}} - -% "star" means unnumbered and not in ToC: -\newcommand{\Spartstar}[1]{\part*{#1}} -\newcommand{\Ssectionstar}[1]{\section*{#1}\renewcommand*\thesubsection{\arabic{subsection}}\setcounter{subsection}{0}} -\newcommand{\Ssubsectionstar}[1]{\subsection*{#1}\renewcommand*\thesubsubsection{\arabic{section}.\arabic{subsubsection}}\setcounter{subsubsection}{0}} -\newcommand{\Ssubsubsectionstar}[1]{\subsubsection*{#1}} -\newcommand{\Ssubsubsubsectionstar}[1]{{\bf #1}} -\newcommand{\Ssubsubsubsubsectionstar}[1]{\Ssubsubsubsectionstar{#1}} - -% "starx" means unnumbered but in ToC: -\newcommand{\Spartstarx}[2]{\Spartstar{#2}\addcontentsline{toc}{part}{#1}} -\newcommand{\Ssectionstarx}[2]{\Ssectionstar{#2}\addcontentsline{toc}{section}{#1}} -\newcommand{\Ssubsectionstarx}[2]{\Ssubsectionstar{#2}\addcontentsline{toc}{subsection}{#1}} -\newcommand{\Ssubsubsectionstarx}[2]{\Ssubsubsectionstar{#2}\addcontentsline{toc}{subsubsection}{#1}} -\newcommand{\Ssubsubsubsectionstarx}[2]{\Ssubsubsubsectionstar{#2}} -\newcommand{\Ssubsubsubsubsectionstarx}[2]{\Ssubsubsubsubsectionstar{#2}} - -% "grouper" is for the 'grouper style variant --- on subsections and lower, -% because \Spart is used for grouper at the section level. Grouper implies -% unnumbered. -\newcounter{GrouperTemp} -\newcommand{\Ssubsectiongrouper}[2]{\setcounter{GrouperTemp}{\value{subsection}}\Ssubsectionstarx{#1}{#2}\setcounter{subsection}{\value{GrouperTemp}}} -\newcommand{\Ssubsubsectiongrouper}[2]{\setcounter{GrouperTemp}{\value{subsubsection}}\Ssubsubsectionstarx{#1}{#2}\setcounter{subsubsection}{\value{GrouperTemp}}} -\newcommand{\Ssubsubsubsectiongrouper}[2]{\Ssubsubsubsectionstarx{#1}{#2}} -\newcommand{\Ssubsubsubsubsectiongrouper}[2]{\Ssubsubsubsubsectionstarx{#1}{#2}} - -\newcommand{\Ssubsectiongrouperstar}[1]{\setcounter{GrouperTemp}{\value{subsection}}\Ssubsectionstar{#1}\setcounter{subsection}{\value{GrouperTemp}}} -\newcommand{\Ssubsubsectiongrouperstar}[1]{\setcounter{GrouperTemp}{\value{subsubsection}}\Ssubsubsectionstar{#1}\setcounter{subsubsection}{\value{GrouperTemp}}} -\newcommand{\Ssubsubsubsectiongrouperstar}[1]{\Ssubsubsubsectionstar{#1}} -\newcommand{\Ssubsubsubsubsectiongrouperstar}[1]{\Ssubsubsubsubsectionstar{#1}} - -\newcommand{\Ssubsectiongrouperstarx}[2]{\setcounter{GrouperTemp}{\value{subsection}}\Ssubsectionstarx{#1}{#2}\setcounter{subsection}{\value{GrouperTemp}}} -\newcommand{\Ssubsubsectiongrouperstarx}[2]{\setcounter{GrouperTemp}{\value{subsubsection}}\Ssubsubsectionstarx{#1}{#2}\setcounter{subsubsection}{\value{GrouperTemp}}} -\newcommand{\Ssubsubsubsectiongrouperstarx}[2]{\Ssubsubsubsectionstarx{#1}{#2}} -\newcommand{\Ssubsubsubsubsectiongrouperstarx}[2]{\Ssubsubsubsubsectionstarx{#1}{#2}} - -% Generated by `subsubsub*section': -\newcommand{\SSubSubSubSection}[1]{\Ssubsubsubsubsectionstar{#1}} - -% For hidden parts with an empty title: -\newcommand{\notitlesection}{\vspace{2ex}\phantomsection\noindent} - -% To increments section numbers: -\newcommand{\Sincpart}{\stepcounter{part}} -\newcommand{\Sincsection}{\stepcounter{section}} -\newcommand{\Sincsubsection}{\stepcounter{subsection}} -\newcommand{\Sincsubsubsection}{\stepcounter{subsubsection}} -\newcommand{\Sincsubsubsubsection}{} -\newcommand{\Sincsubsubsubsubsection}{} - -% When brackets appear in section titles: -\newcommand{\SOpenSq}{[} -\newcommand{\SCloseSq}{]} - -% Helper for box-mode macros: -\newcommand{\Svcenter}[1]{$\vcenter{#1}$} - -% Helper to work around a problem with "#"s for URLs within \href -% within other macros: -\newcommand{\Shref}[3]{\href{#1\##2}{#3}} - -% For URLs: -\newcommand{\Snolinkurl}[1]{\nolinkurl{#1}} - -% History note: -\newcommand{\SHistory}[1]{\begin{smaller}#1\end{smaller}} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -% Scribble then generates the following: -% -% \begin{document} -% \preDoc -% \titleAndVersion{...}{...} -% ... document content ... -% \postDoc -% \end{document} diff --git a/scribble-lib/scribble/search.rkt b/scribble-lib/scribble/search.rkt deleted file mode 100644 index 458056dc..00000000 --- a/scribble-lib/scribble/search.rkt +++ /dev/null @@ -1,179 +0,0 @@ -(module search racket/base - (require "struct.rkt" - "basic.rkt" - syntax/modcode) - - (provide find-racket-tag - (rename-out [find-racket-tag find-scheme-tag])) - - (define module-info-cache (make-hasheq)) - - (define (module-path-index-rejoin mpi rel-to) - (let-values ([(name base) (module-path-index-split mpi)]) - (cond - [(not name) rel-to] - [(not base) mpi] - [else - (module-path-index-join name - (module-path-index-rejoin base rel-to))]))) - - (define (try thunk fail-thunk) - (with-handlers* ([exn:fail? (lambda (exn) (fail-thunk))]) - (thunk))) - - (define (find-racket-tag part ri stx/binding phase-level) - ;; The phase-level argument is used only when `stx/binding' - ;; is an identifier. - ;; - ;; Note: documentation keys currently don't distinguish different - ;; phase definitions of an identifier from a source module. - ;; That is, there's no way to document (define x ....) differently - ;; from (define-for-syntax x ...). This isn't a problem in practice, - ;; because no one uses the same name for different-phase exported - ;; bindings. - ;; - ;; Formerly, we assumed that bindings are defined as originating from some - ;; module at phase 0. [Maybe it's defined at phase 1 and re-exported - ;; later for phase 0 (after a require-for-template), in which case the - ;; re-exporting module is the one we find.] That assumption has been - ;; lifted, however; search for "GONE" below. - (let ([b (cond - [(identifier? stx/binding) - (identifier-binding stx/binding phase-level)] - [(and (list? stx/binding) - (= 7 (length stx/binding))) - stx/binding] - [else - (and (not (symbol? (car stx/binding))) - (list #f - (cadr stx/binding) - (car stx/binding) - (cadr stx/binding) - (if (= 2 (length stx/binding)) - 0 - (caddr stx/binding)) - (if (= 2 (length stx/binding)) - 0 - (cadddr stx/binding)) - (if (= 2 (length stx/binding)) - 0 - (cadddr (cdr stx/binding)))))])]) - (and - (pair? b) - (let ([seen (make-hash)] - [search-key #f]) - (let loop ([queue (list (list (caddr b) (cadddr b) (list-ref b 4) (list-ref b 5) (list-ref b 6)))] - [rqueue null] - [need-result? #t]) - (cond - [(null? queue) - (if (null? rqueue) - ;; Not documented - #f - (loop (reverse rqueue) null need-result?))] - [else - (let ([mod (list-ref (car queue) 0)] - [id (list-ref (car queue) 1)] - [defn-phase (list-ref (car queue) 2)] - [import-phase (list-ref (car queue) 3)] - [export-phase (list-ref (car queue) 4)] - [queue (cdr queue)]) - (let* ([rmp (module-path-index-resolve mod)] - [eb (and ;; GONE: (equal? 0 export-phase) ;; look for the phase-0 export; good idea? - (list (module-path-index->taglet mod) - id))]) - (when (and eb - (not search-key)) - (set! search-key eb)) - (let ([v (and eb (resolve-search search-key part ri `(dep ,eb)))]) - (let* ([here-result - (and need-result? - v - (let ([v (resolve-get/tentative part ri `(form ,eb))]) - (or (and v `(form ,eb)) - `(def ,eb))))] - [need-result? (and need-result? (not here-result))]) - ;; Even if we've found `here-result', look deeper so that we have - ;; consistent `dep' results. - (let ([nest-result - ;; Maybe it's re-exported from this module... - ;; Try a shortcut: - (if (eq? rmp (and (car b) (module-path-index-resolve (car b)))) - ;; Not defined through this path, so keep looking - (loop queue rqueue need-result?) - ;; Check parents, if we can get the source: - (if (and (path? (resolved-module-path-name rmp)) - (not (hash-ref seen (cons export-phase rmp) #f))) - (let ([exports - (hash-ref - module-info-cache - rmp - (lambda () - (let-values ([(valss stxess) - (try - (lambda () - ;; First, try using bytecode: - (module-compiled-exports - (get-module-code (resolved-module-path-name rmp) - #:choose (lambda (src zo so) 'zo)))) - (lambda () - (try - (lambda () - ;; Bytecode not available. Declaration in the - ;; current namespace? - (module->exports rmp)) - (lambda () - (values null null)))))]) - (let ([t - ;; Merge the two association lists: - (let loop ([base valss] - [stxess stxess]) - (cond - [(null? stxess) base] - [(assoc (caar stxess) base) - => (lambda (l) - (loop (cons (cons (car l) - (append (cdar stxess) - (cdr l))) - (remq l base)) - (cdr stxess)))] - [else (loop (cons (car stxess) - base) - (cdr stxess))]))]) - (hash-set! module-info-cache rmp t) - t))))]) - (hash-set! seen (cons export-phase rmp) #t) - (let ([a (assq id (let ([a (assoc export-phase exports)]) - (if a - (cdr a) - null)))]) - (if a - (loop queue - (append (map (lambda (m) - (if (pair? m) - (list (module-path-index-rejoin (car m) mod) - (list-ref m 2) - defn-phase - (list-ref m 1) - (list-ref m 3)) - (list (module-path-index-rejoin m mod) - id - defn-phase - import-phase - export-phase))) - (reverse (cadr a))) - rqueue) - need-result?) - (begin - ;; A dead end may not be our fault: the files could - ;; have changed in inconsistent ways. So just say #f - ;; for now. - #; - (error 'find-racket-tag - "dead end when looking for binding source: ~e" - id) - (loop queue rqueue need-result?))))) - ;; Can't get the module source, so continue with queue: - (loop queue rqueue need-result?)))]) - (or here-result - nest-result))))))]))))))) diff --git a/scribble-lib/scribble/sigplan.rkt b/scribble-lib/scribble/sigplan.rkt deleted file mode 100644 index ca818882..00000000 --- a/scribble-lib/scribble/sigplan.rkt +++ /dev/null @@ -1,177 +0,0 @@ -#lang scheme/base -(require setup/collects - racket/contract/base - scribble/core - scribble/base - scribble/decode - scribble/html-properties - scribble/latex-properties - (for-syntax scheme/base)) - -(provide/contract - [abstract - (->* () () #:rest (listof pre-content?) - block?)] - [subtitle - (->* () () #:rest (listof pre-content?) - content?)] - [authorinfo - (-> pre-content? pre-content? pre-content? - block?)] - [conferenceinfo - (-> pre-content? pre-content? - block?)] - [copyrightyear - (->* () () #:rest (listof pre-content?) - block?)] - [copyrightdata - (->* () () #:rest (listof pre-content?) - block?)] - [exclusive-license - (->* () () - block?)] - [doi - (->* () () #:rest (listof pre-content?) - block?)] - [to-appear - (->* () () #:rest pre-content? - block?)] - [category - (->* (pre-content? pre-content? pre-content?) - ((or/c false/c pre-content?)) - content?)] - [terms - (->* () () #:rest (listof pre-content?) - content?)] - [keywords - (->* () () #:rest (listof pre-content?) - content?)]) - -(provide preprint 10pt nocopyright onecolumn noqcourier notimes - include-abstract) - -(define-syntax-rule (defopts name ...) - (begin (define-syntax (name stx) - (raise-syntax-error #f - "option must appear on the same line as `#lang scribble/sigplan'" - stx)) - ... - (provide name ...))) -(defopts preprint 10pt nocopyright onecolumn noqcourier notimes) - -(define sigplan-extras - (let ([abs (lambda (s) - (path->collects-relative - (collection-file-path s "scribble" "sigplan")))]) - (list - (make-css-addition (abs "sigplan.css")) - (make-tex-addition (abs "sigplan.tex"))))) - -;; ---------------------------------------- -;; Abstracts: - -(define abstract-style (make-style "abstract" sigplan-extras)) - -(define (abstract . strs) - (make-nested-flow - abstract-style - (decode-flow strs))) - -(define (extract-abstract p) - (unless (part? p) - (error 'include-abstract "doc binding is not a part: ~e" p)) - (unless (null? (part-parts p)) - (error 'include-abstract "abstract part has sub-parts: ~e" (part-parts p))) - (when (part-title-content p) - (error 'include-abstract "abstract part has title content: ~e" (part-title-content p))) - (part-blocks p)) - -(define-syntax-rule (include-abstract mp) - (begin - (require (only-in mp [doc abstract-doc])) - (make-nested-flow abstract-style (extract-abstract abstract-doc)))) - -;; ---------------------------------------- -;; Authors and conference info: - -(define (authorinfo name affiliation e-mail) - ;; The \SAuthor macro in "style.tex" looks specifically - ;; for an \SAuthorinfo as its argument, and handles it - ;; specially in that case: - (author - (make-multiarg-element - (make-style "SAuthorinfo" sigplan-extras) - (list - (make-element #f (decode-content (list name))) - (make-element (make-style "SAuthorPlace" sigplan-extras) - (decode-content (list affiliation))) - (make-element (make-style "SAuthorEmail" sigplan-extras) - (decode-content (list e-mail))))))) - -(define (subtitle . str) - (make-element (make-style "SSubtitle" (append '(aux) sigplan-extras)) - (decode-content str))) - -(define (conferenceinfo what where) - (make-paragraph - (make-style 'pretitle null) - (make-multiarg-element - (make-style "SConferenceInfo" sigplan-extras) - (list - (make-element #f (decode-content (list what))) - (make-element #f (decode-content (list where))))))) - -(define (copyrightyear . when) - (make-paragraph - (make-style 'pretitle null) - (make-element - (make-style "SCopyrightYear" sigplan-extras) - (decode-content when)))) - -(define (copyrightdata . what) - (make-paragraph - (make-style 'pretitle null) - (make-element - (make-style "SCopyrightData" sigplan-extras) - (decode-content what)))) - -(define (doi . what) - (make-paragraph - (make-style 'pretitle null) - (make-element - (make-style "Sdoi" sigplan-extras) - (decode-content what)))) - -(define (exclusive-license . what) - (make-paragraph - (make-style 'pretitle null) - (make-element - (make-style "SPexclusivelicense" sigplan-extras) - (decode-content what)))) - -(define (to-appear . what) - (make-paragraph - (make-style 'pretitle null) - (make-element - (make-style "toappear" sigplan-extras) - (decode-content what)))) - -;; ---------------------------------------- -;; Categories, terms, and keywords: - -(define (category sec title sub [more #f]) - (make-multiarg-element - (make-style (format "SCategory~a" (if more "Plus" "")) sigplan-extras) - (list* - (make-element #f (decode-content (list sec))) - (make-element #f (decode-content (list title))) - (make-element #f (decode-content (list sub))) - (if more - (list (make-element #f (decode-content (list more)))) - null)))) - -(define (terms . str) - (make-element (make-style "STerms" sigplan-extras) (decode-content str))) - -(define (keywords . str) - (make-element (make-style "SKeywords" sigplan-extras) (decode-content str))) diff --git a/scribble-lib/scribble/sigplan/lang.rkt b/scribble-lib/scribble/sigplan/lang.rkt deleted file mode 100644 index 92c00a85..00000000 --- a/scribble-lib/scribble/sigplan/lang.rkt +++ /dev/null @@ -1,88 +0,0 @@ -#lang scheme/base -(require scribble/doclang - scribble/core - scribble/base - scribble/sigplan - scribble/latex-prefix - racket/list - "../private/defaults.rkt" - (for-syntax scheme/base)) -(provide (except-out (all-from-out scribble/doclang) #%module-begin) - (all-from-out scribble/sigplan) - (all-from-out scribble/base) - (rename-out [module-begin #%module-begin])) - -(define-syntax (module-begin stx) - (syntax-case stx () - [(_ id . body) - (let ([preprint? #f] - [10pt? #f] - [onecolumn? #f] - [nocopyright? #f] - [times? #t] - [qcourier? #t]) - (let loop ([stuff #'body]) - (syntax-case* stuff (onecolumn preprint 10pt nocopyright notimes noqcourier) (lambda (a b) (eq? (syntax-e a) (syntax-e b))) - [(ws . body) - ;; Skip intraline whitespace to find options: - (and (string? (syntax-e #'ws)) - (regexp-match? #rx"^ *$" (syntax-e #'ws))) - (loop #'body)] - [(preprint . body) - (set! preprint? "preprint") - (loop #'body)] - [(onecolumn . body) - (set! onecolumn? "onecolumn") - (loop #'body)] - [(nocopyright . body) - (set! nocopyright? "nocopyrightspace") - (loop #'body)] - [(10pt . body) - (set! 10pt? "10pt") - (loop #'body)] - [(noqcourier . body) - (set! qcourier? #f) - (loop #'body)] - [(notimes . body) - (set! times? #f) - (loop #'body)] - [body - #`(#%module-begin id (post-process #,times? #,qcourier? #,preprint? #,10pt? #,nocopyright? #,onecolumn?) () . body)])))])) -#| - -The docs for the times.sty package suggests that it should not be used -so maybe we want to disable it permanently (or replace it with something else). - -Read here for more: - - http://www.ctan.org/tex-archive/macros/latex/required/psnfss/psnfss2e.pdf - -|# - -(define ((post-process times? qcourier? . opts) doc) - (let ([options - (if (ormap values opts) - (format "[~a]" (apply string-append (add-between (filter values opts) ", "))) - "")]) - (add-sigplan-styles - (add-defaults doc - (string->bytes/utf-8 - (format "\\documentclass~a{sigplanconf}\n~a~a~a" - options - unicode-encoding-packages - (if times? - "\\usepackage{times}\n" - "") - (if qcourier? - "\\usepackage{qcourier}\n" - ""))) - (scribble-file "sigplan/style.tex") - (list (scribble-file "sigplan/sigplanconf.cls")) - #f)))) - -(define (add-sigplan-styles doc) - ;; Ensure that "sigplan.tex" is used, since "style.tex" - ;; re-defines commands. - (struct-copy part doc [to-collect - (cons (terms) - (part-to-collect doc))])) diff --git a/scribble-lib/scribble/sigplan/lang/reader.rkt b/scribble-lib/scribble/sigplan/lang/reader.rkt deleted file mode 100644 index 3963d6e5..00000000 --- a/scribble-lib/scribble/sigplan/lang/reader.rkt +++ /dev/null @@ -1,3 +0,0 @@ -#lang s-exp scribble/base/reader -scribble/sigplan/lang -#:wrapper1 (lambda (t) (cons 'doc (t))) diff --git a/scribble-lib/scribble/sigplan/sigplan.css b/scribble-lib/scribble/sigplan/sigplan.css deleted file mode 100644 index e46ab8cc..00000000 --- a/scribble-lib/scribble/sigplan/sigplan.css +++ /dev/null @@ -1,13 +0,0 @@ -/* Support for styles in scribble/sigplan */ - -.SAuthorPlace, .SAuthorEmail, -.SConferenceInfo, .SCopyrightYear, .SCopyrightData, -.Sdoi, .SPexclusivelicense, -.SCategory, .SCategoryPlus, .STerms, .SKeywords { - display: none; -} - -.SSubtitle { - display: block; - font-size: smaller; -} diff --git a/scribble-lib/scribble/sigplan/sigplan.tex b/scribble-lib/scribble/sigplan/sigplan.tex deleted file mode 100644 index fc2e1f52..00000000 --- a/scribble-lib/scribble/sigplan/sigplan.tex +++ /dev/null @@ -1,23 +0,0 @@ - -% Support for styles in scribble/sigplan - -% These are replaced by scribble/sigplan/style.tex, -% which is used in combination with sigplanconf.sty - -\newcommand{\SAuthorinfo}[3]{#1} -\newcommand{\SAuthorPlace}[1]{#1} -\newcommand{\SAuthorEmail}[1]{#1} - -\newcommand{\SConferenceInfo}[2]{} -\newcommand{\SCopyrightYear}[1]{} -\newcommand{\SCopyrightData}[1]{} -\newcommand{\Sdoi}[1]{} -\newcommand{\SPexclusivelicense}[0]{} - -\newcommand{\SCategory}[3]{} -\newcommand{\SCategoryPlus}[4]{} -\newcommand{\STerms}[1]{} -\newcommand{\SKeywords}[1]{} - -% Normally gets re-written by the title macro: -\newcommand{\SSubtitle}[1]{{\bf #1}} diff --git a/scribble-lib/scribble/sigplan/sigplanconf.cls b/scribble-lib/scribble/sigplan/sigplanconf.cls deleted file mode 100644 index 2dcfeb64..00000000 --- a/scribble-lib/scribble/sigplan/sigplanconf.cls +++ /dev/null @@ -1,1311 +0,0 @@ -%----------------------------------------------------------------------------- -% -% LaTeX Class/Style File -% -% Name: sigplanconf.cls -% -% Purpose: A LaTeX 2e class file for SIGPLAN conference proceedings. -% This class file supercedes acm_proc_article-sp, -% sig-alternate, and sigplan-proc. -% -% Author: Paul C. Anagnostopoulos -% Windfall Software -% 978 371-2316 -% paul [atsign] windfall.com -% -% Created: 12 September 2004 -% -% Revisions: See end of file. -% -% This work is licensed under the Creative Commons Attribution License. -% To view a copy of this license, visit -% http://creativecommons.org/licenses/by/3.0/ -% or send a letter to Creative Commons, 171 2nd Street, Suite 300, -% San Francisco, California, 94105, U.S.A. -% -%----------------------------------------------------------------------------- - - -\NeedsTeXFormat{LaTeX2e}[1995/12/01] -\ProvidesClass{sigplanconf}[2013/07/02 v2.8 ACM SIGPLAN Proceedings] - -% The following few pages contain LaTeX programming extensions adapted -% from the ZzTeX macro package. - -% Token Hackery -% ----- ------- - - -\def \@expandaftertwice {\expandafter\expandafter\expandafter} -\def \@expandafterthrice {\expandafter\expandafter\expandafter\expandafter - \expandafter\expandafter\expandafter} - -% This macro discards the next token. - -\def \@discardtok #1{}% token - -% This macro removes the `pt' following a dimension. - -{\catcode `\p = 12 \catcode `\t = 12 - -\gdef \@remover #1pt{#1} - -} % \catcode - -% This macro extracts the contents of a macro and returns it as plain text. -% Usage: \expandafter\@defof \meaning\macro\@mark - -\def \@defof #1:->#2\@mark{#2} - -% Control Sequence Names -% ------- -------- ----- - - -\def \@name #1{% {\tokens} - \csname \expandafter\@discardtok \string#1\endcsname} - -\def \@withname #1#2{% {\command}{\tokens} - \expandafter#1\csname \expandafter\@discardtok \string#2\endcsname} - -% Flags (Booleans) -% ----- ---------- - -% The boolean literals \@true and \@false are appropriate for use with -% the \if command, which tests the codes of the next two characters. - -\def \@true {TT} -\def \@false {FL} - -\def \@setflag #1=#2{\edef #1{#2}}% \flag = boolean - -% IF and Predicates -% -- --- ---------- - -% A "predicate" is a macro that returns \@true or \@false as its value. -% Such values are suitable for use with the \if conditional. For example: -% -% \if \@oddp{\x} \else \fi - -% A predicate can be used with \@setflag as follows: -% -% \@setflag \flag = {} - -% Here are the predicates for TeX's repertoire of conditional -% commands. These might be more appropriately interspersed with -% other definitions in this module, but what the heck. -% Some additional "obvious" predicates are defined. - -\def \@eqlp #1#2{\ifnum #1 = #2\@true \else \@false \fi} -\def \@neqlp #1#2{\ifnum #1 = #2\@false \else \@true \fi} -\def \@lssp #1#2{\ifnum #1 < #2\@true \else \@false \fi} -\def \@gtrp #1#2{\ifnum #1 > #2\@true \else \@false \fi} -\def \@zerop #1{\ifnum #1 = 0\@true \else \@false \fi} -\def \@onep #1{\ifnum #1 = 1\@true \else \@false \fi} -\def \@posp #1{\ifnum #1 > 0\@true \else \@false \fi} -\def \@negp #1{\ifnum #1 < 0\@true \else \@false \fi} -\def \@oddp #1{\ifodd #1\@true \else \@false \fi} -\def \@evenp #1{\ifodd #1\@false \else \@true \fi} -\def \@rangep #1#2#3{\if \@orp{\@lssp{#1}{#2}}{\@gtrp{#1}{#3}}\@false \else - \@true \fi} -\def \@tensp #1{\@rangep{#1}{10}{19}} - -\def \@dimeqlp #1#2{\ifdim #1 = #2\@true \else \@false \fi} -\def \@dimneqlp #1#2{\ifdim #1 = #2\@false \else \@true \fi} -\def \@dimlssp #1#2{\ifdim #1 < #2\@true \else \@false \fi} -\def \@dimgtrp #1#2{\ifdim #1 > #2\@true \else \@false \fi} -\def \@dimzerop #1{\ifdim #1 = 0pt\@true \else \@false \fi} -\def \@dimposp #1{\ifdim #1 > 0pt\@true \else \@false \fi} -\def \@dimnegp #1{\ifdim #1 < 0pt\@true \else \@false \fi} - -\def \@vmodep {\ifvmode \@true \else \@false \fi} -\def \@hmodep {\ifhmode \@true \else \@false \fi} -\def \@mathmodep {\ifmmode \@true \else \@false \fi} -\def \@textmodep {\ifmmode \@false \else \@true \fi} -\def \@innermodep {\ifinner \@true \else \@false \fi} - -\long\def \@codeeqlp #1#2{\if #1#2\@true \else \@false \fi} - -\long\def \@cateqlp #1#2{\ifcat #1#2\@true \else \@false \fi} - -\long\def \@tokeqlp #1#2{\ifx #1#2\@true \else \@false \fi} -\long\def \@xtokeqlp #1#2{\expandafter\ifx #1#2\@true \else \@false \fi} - -\long\def \@definedp #1{% - \expandafter\ifx \csname \expandafter\@discardtok \string#1\endcsname - \relax \@false \else \@true \fi} - -\long\def \@undefinedp #1{% - \expandafter\ifx \csname \expandafter\@discardtok \string#1\endcsname - \relax \@true \else \@false \fi} - -\def \@emptydefp #1{\ifx #1\@empty \@true \else \@false \fi}% {\name} - -\let \@emptylistp = \@emptydefp - -\long\def \@emptyargp #1{% {#n} - \@empargp #1\@empargq\@mark} -\long\def \@empargp #1#2\@mark{% - \ifx #1\@empargq \@true \else \@false \fi} -\def \@empargq {\@empargq} - -\def \@emptytoksp #1{% {\tokenreg} - \expandafter\@emptoksp \the#1\@mark} - -\long\def \@emptoksp #1\@mark{\@emptyargp{#1}} - -\def \@voidboxp #1{\ifvoid #1\@true \else \@false \fi} -\def \@hboxp #1{\ifhbox #1\@true \else \@false \fi} -\def \@vboxp #1{\ifvbox #1\@true \else \@false \fi} - -\def \@eofp #1{\ifeof #1\@true \else \@false \fi} - - -% Flags can also be used as predicates, as in: -% -% \if \flaga \else \fi - - -% Now here we have predicates for the common logical operators. - -\def \@notp #1{\if #1\@false \else \@true \fi} - -\def \@andp #1#2{\if #1% - \if #2\@true \else \@false \fi - \else - \@false - \fi} - -\def \@orp #1#2{\if #1% - \@true - \else - \if #2\@true \else \@false \fi - \fi} - -\def \@xorp #1#2{\if #1% - \if #2\@false \else \@true \fi - \else - \if #2\@true \else \@false \fi - \fi} - -% Arithmetic -% ---------- - -\def \@increment #1{\advance #1 by 1\relax}% {\count} - -\def \@decrement #1{\advance #1 by -1\relax}% {\count} - -% Options -% ------- - - -\@setflag \@authoryear = \@false -\@setflag \@blockstyle = \@false -\@setflag \@copyrightwanted = \@true -\@setflag \@explicitsize = \@false -\@setflag \@mathtime = \@false -\@setflag \@natbib = \@true -\@setflag \@ninepoint = \@true -\newcount{\@numheaddepth} \@numheaddepth = 3 -\@setflag \@onecolumn = \@false -\@setflag \@preprint = \@false -\@setflag \@reprint = \@false -\@setflag \@tenpoint = \@false -\@setflag \@times = \@false - -% Note that all the dangerous article class options are trapped. - -\DeclareOption{9pt}{\@setflag \@ninepoint = \@true - \@setflag \@explicitsize = \@true} - -\DeclareOption{10pt}{\PassOptionsToClass{10pt}{article}% - \@setflag \@ninepoint = \@false - \@setflag \@tenpoint = \@true - \@setflag \@explicitsize = \@true} - -\DeclareOption{11pt}{\PassOptionsToClass{11pt}{article}% - \@setflag \@ninepoint = \@false - \@setflag \@explicitsize = \@true} - -\DeclareOption{12pt}{\@unsupportedoption{12pt}} - -\DeclareOption{a4paper}{\@unsupportedoption{a4paper}} - -\DeclareOption{a5paper}{\@unsupportedoption{a5paper}} - -\DeclareOption{authoryear}{\@setflag \@authoryear = \@true} - -\DeclareOption{b5paper}{\@unsupportedoption{b5paper}} - -\DeclareOption{blockstyle}{\@setflag \@blockstyle = \@true} - -\DeclareOption{cm}{\@setflag \@times = \@false} - -\DeclareOption{computermodern}{\@setflag \@times = \@false} - -\DeclareOption{executivepaper}{\@unsupportedoption{executivepaper}} - -\DeclareOption{indentedstyle}{\@setflag \@blockstyle = \@false} - -\DeclareOption{landscape}{\@unsupportedoption{landscape}} - -\DeclareOption{legalpaper}{\@unsupportedoption{legalpaper}} - -\DeclareOption{letterpaper}{\@unsupportedoption{letterpaper}} - -\DeclareOption{mathtime}{\@setflag \@mathtime = \@true} - -\DeclareOption{natbib}{\@setflag \@natbib = \@true} - -\DeclareOption{nonatbib}{\@setflag \@natbib = \@false} - -\DeclareOption{nocopyrightspace}{\@setflag \@copyrightwanted = \@false} - -\DeclareOption{notitlepage}{\@unsupportedoption{notitlepage}} - -\DeclareOption{numberedpars}{\@numheaddepth = 4} - -\DeclareOption{numbers}{\@setflag \@authoryear = \@false} - -%%%\DeclareOption{onecolumn}{\@setflag \@onecolumn = \@true} - -\DeclareOption{preprint}{\@setflag \@preprint = \@true} - -\DeclareOption{reprint}{\@setflag \@reprint = \@true} - -\DeclareOption{times}{\@setflag \@times = \@true} - -\DeclareOption{titlepage}{\@unsupportedoption{titlepage}} - -\DeclareOption{twocolumn}{\@setflag \@onecolumn = \@false} - -\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}} - -\ExecuteOptions{9pt,indentedstyle,times} -\@setflag \@explicitsize = \@false -\ProcessOptions - -\if \@onecolumn - \if \@notp{\@explicitsize}% - \@setflag \@ninepoint = \@false - \PassOptionsToClass{11pt}{article}% - \fi - \PassOptionsToClass{twoside,onecolumn}{article} -\else - \PassOptionsToClass{twoside,twocolumn}{article} -\fi -\LoadClass{article} - -\def \@unsupportedoption #1{% - \ClassError{proc}{The standard '#1' option is not supported.}} - -% This can be used with the 'reprint' option to get the final folios. - -\def \setpagenumber #1{% - \setcounter{page}{#1}} - -\AtEndDocument{\label{sigplanconf@finalpage}} - -% Utilities -% --------- - - -\newcommand{\setvspace}[2]{% - #1 = #2 - \advance #1 by -1\parskip} - -% Document Parameters -% -------- ---------- - - -% Page: - -\setlength{\hoffset}{-1in} -\setlength{\voffset}{-1in} - -\setlength{\topmargin}{1in} -\setlength{\headheight}{0pt} -\setlength{\headsep}{0pt} - -\if \@onecolumn - \setlength{\evensidemargin}{.75in} - \setlength{\oddsidemargin}{.75in} -\else - \setlength{\evensidemargin}{.75in} - \setlength{\oddsidemargin}{.75in} -\fi - -% Text area: - -\newdimen{\standardtextwidth} -\setlength{\standardtextwidth}{42pc} - -\if \@onecolumn - \setlength{\textwidth}{40.5pc} -\else - \setlength{\textwidth}{\standardtextwidth} -\fi - -\setlength{\topskip}{8pt} -\setlength{\columnsep}{2pc} -\setlength{\textheight}{54.5pc} - -% Running foot: - -\setlength{\footskip}{30pt} - -% Paragraphs: - -\if \@blockstyle - \setlength{\parskip}{5pt plus .1pt minus .5pt} - \setlength{\parindent}{0pt} -\else - \setlength{\parskip}{0pt} - \setlength{\parindent}{12pt} -\fi - -\setlength{\lineskip}{.5pt} -\setlength{\lineskiplimit}{\lineskip} - -\frenchspacing -\pretolerance = 400 -\tolerance = \pretolerance -\setlength{\emergencystretch}{5pt} -\clubpenalty = 10000 -\widowpenalty = 10000 -\setlength{\hfuzz}{.5pt} - -% Standard vertical spaces: - -\newskip{\standardvspace} -\setvspace{\standardvspace}{5pt plus 1pt minus .5pt} - -% Margin paragraphs: - -\setlength{\marginparwidth}{36pt} -\setlength{\marginparsep}{2pt} -\setlength{\marginparpush}{8pt} - - -\setlength{\skip\footins}{8pt plus 3pt minus 1pt} -\setlength{\footnotesep}{9pt} - -\renewcommand{\footnoterule}{% - \hrule width .5\columnwidth height .33pt depth 0pt} - -\renewcommand{\@makefntext}[1]{% - \noindent \@makefnmark \hspace{1pt}#1} - -% Floats: - -\setcounter{topnumber}{4} -\setcounter{bottomnumber}{1} -\setcounter{totalnumber}{4} - -\renewcommand{\fps@figure}{tp} -\renewcommand{\fps@table}{tp} -\renewcommand{\topfraction}{0.90} -\renewcommand{\bottomfraction}{0.30} -\renewcommand{\textfraction}{0.10} -\renewcommand{\floatpagefraction}{0.75} - -\setcounter{dbltopnumber}{4} - -\renewcommand{\dbltopfraction}{\topfraction} -\renewcommand{\dblfloatpagefraction}{\floatpagefraction} - -\setlength{\floatsep}{18pt plus 4pt minus 2pt} -\setlength{\textfloatsep}{18pt plus 4pt minus 3pt} -\setlength{\intextsep}{10pt plus 4pt minus 3pt} - -\setlength{\dblfloatsep}{18pt plus 4pt minus 2pt} -\setlength{\dbltextfloatsep}{20pt plus 4pt minus 3pt} - -% Miscellaneous: - -\errorcontextlines = 5 - -% Fonts -% ----- - - -\if \@times - \renewcommand{\rmdefault}{ptm}% - \if \@mathtime - \usepackage[mtbold,noTS1]{mathtime}% - \else -%%% \usepackage{mathptm}% - \fi -\else - \relax -\fi - -\if \@ninepoint - -\renewcommand{\normalsize}{% - \@setfontsize{\normalsize}{9pt}{10pt}% - \setlength{\abovedisplayskip}{5pt plus 1pt minus .5pt}% - \setlength{\belowdisplayskip}{\abovedisplayskip}% - \setlength{\abovedisplayshortskip}{3pt plus 1pt minus 2pt}% - \setlength{\belowdisplayshortskip}{\abovedisplayshortskip}} - -\renewcommand{\tiny}{\@setfontsize{\tiny}{5pt}{6pt}} - -\renewcommand{\scriptsize}{\@setfontsize{\scriptsize}{7pt}{8pt}} - -\renewcommand{\small}{% - \@setfontsize{\small}{8pt}{9pt}% - \setlength{\abovedisplayskip}{4pt plus 1pt minus 1pt}% - \setlength{\belowdisplayskip}{\abovedisplayskip}% - \setlength{\abovedisplayshortskip}{2pt plus 1pt}% - \setlength{\belowdisplayshortskip}{\abovedisplayshortskip}} - -\renewcommand{\footnotesize}{% - \@setfontsize{\footnotesize}{8pt}{9pt}% - \setlength{\abovedisplayskip}{4pt plus 1pt minus .5pt}% - \setlength{\belowdisplayskip}{\abovedisplayskip}% - \setlength{\abovedisplayshortskip}{2pt plus 1pt}% - \setlength{\belowdisplayshortskip}{\abovedisplayshortskip}} - -\renewcommand{\large}{\@setfontsize{\large}{11pt}{13pt}} - -\renewcommand{\Large}{\@setfontsize{\Large}{14pt}{18pt}} - -\renewcommand{\LARGE}{\@setfontsize{\LARGE}{18pt}{20pt}} - -\renewcommand{\huge}{\@setfontsize{\huge}{20pt}{25pt}} - -\renewcommand{\Huge}{\@setfontsize{\Huge}{25pt}{30pt}} - -\else\if \@tenpoint - -\relax - -\else - -\relax - -\fi\fi - -% Abstract -% -------- - - -\renewenvironment{abstract}{% - \section*{Abstract}% - \normalsize}{% - } - -% Bibliography -% ------------ - - -\renewenvironment{thebibliography}[1] - {\section*{\refname - \@mkboth{\MakeUppercase\refname}{\MakeUppercase\refname}}% - \list{\@biblabel{\@arabic\c@enumiv}}% - {\settowidth\labelwidth{\@biblabel{#1}}% - \leftmargin\labelwidth - \advance\leftmargin\labelsep - \@openbib@code - \usecounter{enumiv}% - \let\p@enumiv\@empty - \renewcommand\theenumiv{\@arabic\c@enumiv}}% - \bibfont - \clubpenalty4000 - \@clubpenalty \clubpenalty - \widowpenalty4000% - \sfcode`\.\@m} - {\def\@noitemerr - {\@latex@warning{Empty `thebibliography' environment}}% - \endlist} - -\if \@natbib - -\if \@authoryear - \typeout{Using natbib package with 'authoryear' citation style.} - \usepackage[authoryear,square]{natbib} - \bibpunct{(}{)}{;}{a}{}{,} % Change fences to parentheses; - % citation separator to semicolon; - % eliminate comma between author and year. - \let \cite = \citep -\else - \typeout{Using natbib package with 'numbers' citation style.} - \usepackage[numbers,sort&compress,square]{natbib} -\fi -\setlength{\bibsep}{3pt plus .5pt minus .25pt} - -\fi - -\def \bibfont {\small} - -% Categories -% ---------- - - -\@setflag \@firstcategory = \@true - -\newcommand{\category}[3]{% - \if \@firstcategory - \paragraph*{Categories and Subject Descriptors}% - \@setflag \@firstcategory = \@false - \else - \unskip ;\hspace{.75em}% - \fi - \@ifnextchar [{\@category{#1}{#2}{#3}}{\@category{#1}{#2}{#3}[]}} - -\def \@category #1#2#3[#4]{% - {\let \and = \relax - #1 [\textit{#2}]% - \if \@emptyargp{#4}% - \if \@notp{\@emptyargp{#3}}: #3\fi - \else - :\space - \if \@notp{\@emptyargp{#3}}#3---\fi - \textrm{#4}% - \fi}} - -% Copyright Notice -% --------- ------ - - -\def \ftype@copyrightbox {8} -\def \@toappear {} -\def \@permission {} -\def \@reprintprice {} - -\def \@copyrightspace {% - \@float{copyrightbox}[b]% - \vbox to 1.2in{% - \vfill - \parbox[b]{20pc}{% - \scriptsize - \if \@preprint - [Copyright notice will appear here - once 'preprint' option is removed.]\par - \else - \@toappear - \fi - \if \@reprint - \noindent Reprinted from \@conferencename, - \@proceedings, - \@conferenceinfo, - pp.~\number\thepage--\pageref{sigplanconf@finalpage}.\par - \fi}}% - \end@float} - -\newcommand{\reprintprice}[1]{% - \gdef \@reprintprice {#1}} - -\reprintprice{\$15.00} - -\long\def \toappear #1{% - \def \@toappear {#1}} - -\toappear{% - \noindent \@permission \par - \vspace{2pt} - \noindent \textsl{\@conferencename}, \quad \@conferenceinfo. \par - \noindent Copyright \copyright\ \@copyrightyear\ ACM \@copyrightdata - \dots \@reprintprice.\par - \noindent http://dx.doi.org/10.1145/\@doi } - -\newcommand{\permission}[1]{% - \gdef \@permission {#1}} - -\permission{% - Permission to make digital or hard copies of all or part of this work for - personal or classroom use is granted without fee provided that copies are - not made or distributed for profit or commercial advantage and that copies - bear this notice and the full citation on the first page. Copyrights for - components of this work owned by others than ACM must be honored. - Abstracting with credit is permitted. To copy otherwise, or republish, to - post on servers or to redistribute to lists, requires prior specific - permission and/or a fee. Request permissions from permissions@acm.org.} - -% These are two new rights management and bibstrip text blocks. - -\newcommand{\exclusivelicense}{% - \permission{% - Permission to make digital or hard copies of all or part of this work for - personal or classroom use is granted without fee provided that copies are - not made or distributed for profit or commercial advantage and that copies - bear this notice and the full citation on the first page. Copyrights for - components of this work owned by others than the author(s) must be honored. - Abstracting with credit is permitted. To copy otherwise, or republish, to - post on servers or to redistribute to lists, requires prior specific - permission and/or a fee. Request permissions from permissions@acm.org.} - \toappear{% - \noindent \@permission \par - \vspace{2pt} - \noindent \textsl{\@conferencename}, \quad \@conferenceinfo. \par - \noindent Copyright is held by the owner/author(s). Publication rights licensed to ACM. \par - \noindent ACM \@copyrightdata \dots \@reprintprice.\par - \noindent http://dx.doi.org/10.1145/\@doi}} - -\newcommand{\permissiontopublish}{% - \permission{% - Permission to make digital or hard copies of part or all of this work for - personal or classroom use is granted without fee provided that copies are - not made or distributed for profit or commercial advantage and that copies - bear this notice and the full citation on the first page. Copyrights for - third-party components of this work must be honored. - For all other uses, contact the owner/author(s).}% - \toappear{% - \noindent \@permission \par - \vspace{2pt} - \noindent \textsl{\@conferencename}, \quad \@conferenceinfo. \par - \noindent Copyright is held by the owner/author(s). \par - \noindent ACM \@copyrightdata.\par - \noindent http://dx.doi.org/10.1145/\@doi}} - -% The following permission notices are -% for the traditional copyright transfer agreement option. - -% Exclusive license and permission-to-publish -% give more complicated permission notices. -% These are not covered here. - -\newcommand{\ACMCanadapermission}{% - \permission{% - ACM acknowledges that this contribution was authored or - co-authored by an affiliate of the Canadian National - Government. As such, the Crown in Right of Canada retains an equal - interest in the copyright. Reprint requests should be forwarded to - ACM.}} - -\newcommand{\ACMUSpermission}{% - \permission{% - ACM acknowledges that this contribution was authored or - co-authored by a contractor or affiliate of the United States - Government. As such, the United States Government retains a - nonexclusive, royalty-free right to publish or reproduce this - article, or to allow others to do so, for Government purposes - only.}} - -\newcommand{\USpublicpermission}{% - \permission{% - This paper is authored by an employee(s) of the United States - Government and is in the public domain. Non-exclusive copying or - redistribution is allowed, provided that the article citation is - given and the authors and the agency are clearly identified as its - source.}% - \toappear{% - \noindent \@permission \par - \vspace{2pt} - \noindent \textsl{\@conferencename}, \quad \@conferenceinfo. \par - \noindent ACM \@copyrightdata.\par - \noindent http://dx.doi.org/10.1145/\@doi}} - -\newcommand{\authorversion}[4]{% - \permission{% - Copyright \copyright\ ACM, #1. This is the author's version of the work. - It is posted here by permission of ACM for your personal use. - Not for redistribution. The definitive version was published in - #2, #3, http://dx.doi.org/10.1145/#4.}} - -% Enunciations -% ------------ - - -\def \@begintheorem #1#2{% {name}{number} - \trivlist - \item[\hskip \labelsep \textsc{#1 #2.}]% - \itshape\selectfont - \ignorespaces} - -\def \@opargbegintheorem #1#2#3{% {name}{number}{title} - \trivlist - \item[% - \hskip\labelsep \textsc{#1\ #2}% - \if \@notp{\@emptyargp{#3}}\nut (#3).\fi]% - \itshape\selectfont - \ignorespaces} - -% Figures -% ------- - - -\@setflag \@caprule = \@true - -\long\def \@makecaption #1#2{% - \addvspace{4pt} - \if \@caprule - \hrule width \hsize height .33pt - \vspace{4pt} - \fi - \setbox \@tempboxa = \hbox{\@setfigurenumber{#1.}\nut #2}% - \if \@dimgtrp{\wd\@tempboxa}{\hsize}% - \noindent \@setfigurenumber{#1.}\nut #2\par - \else - \centerline{\box\@tempboxa}% - \fi} - -\newcommand{\nocaptionrule}{% - \@setflag \@caprule = \@false} - -\def \@setfigurenumber #1{% - {\rmfamily \bfseries \selectfont #1}} - -% Hierarchy -% --------- - - -\setcounter{secnumdepth}{\@numheaddepth} - -\newskip{\@sectionaboveskip} -\setvspace{\@sectionaboveskip}{10pt plus 3pt minus 2pt} - -\newskip{\@sectionbelowskip} -\if \@blockstyle - \setlength{\@sectionbelowskip}{0.1pt}% -\else - \setlength{\@sectionbelowskip}{4pt}% -\fi - -\renewcommand{\section}{% - \@startsection - {section}% - {1}% - {0pt}% - {-\@sectionaboveskip}% - {\@sectionbelowskip}% - {\large \bfseries \raggedright}} - -\newskip{\@subsectionaboveskip} -\setvspace{\@subsectionaboveskip}{8pt plus 2pt minus 2pt} - -\newskip{\@subsectionbelowskip} -\if \@blockstyle - \setlength{\@subsectionbelowskip}{0.1pt}% -\else - \setlength{\@subsectionbelowskip}{4pt}% -\fi - -\renewcommand{\subsection}{% - \@startsection% - {subsection}% - {2}% - {0pt}% - {-\@subsectionaboveskip}% - {\@subsectionbelowskip}% - {\normalsize \bfseries \raggedright}} - -\renewcommand{\subsubsection}{% - \@startsection% - {subsubsection}% - {3}% - {0pt}% - {-\@subsectionaboveskip} - {\@subsectionbelowskip}% - {\normalsize \bfseries \raggedright}} - -\newskip{\@paragraphaboveskip} -\setvspace{\@paragraphaboveskip}{6pt plus 2pt minus 2pt} - -\renewcommand{\paragraph}{% - \@startsection% - {paragraph}% - {4}% - {0pt}% - {\@paragraphaboveskip} - {-1em}% - {\normalsize \bfseries \if \@times \itshape \fi}} - -\renewcommand{\subparagraph}{% - \@startsection% - {subparagraph}% - {4}% - {0pt}% - {\@paragraphaboveskip} - {-1em}% - {\normalsize \itshape}} - -% Standard headings: - -\newcommand{\acks}{\section*{Acknowledgments}} - -\newcommand{\keywords}{\paragraph*{Keywords}} - -\newcommand{\terms}{\paragraph*{General Terms}} - -% Identification -% -------------- - - -\def \@conferencename {} -\def \@conferenceinfo {} -\def \@copyrightyear {} -\def \@copyrightdata {[to be supplied]} -\def \@proceedings {[Unknown Proceedings]} - - -\newcommand{\conferenceinfo}[2]{% - \gdef \@conferencename {#1}% - \gdef \@conferenceinfo {#2}} - -\newcommand{\copyrightyear}[1]{% - \gdef \@copyrightyear {#1}} - -\let \CopyrightYear = \copyrightyear - -\newcommand{\copyrightdata}[1]{% - \gdef \@copyrightdata {#1}} - -\let \crdata = \copyrightdata - -\newcommand{\doi}[1]{% - \gdef \@doi {#1}} - -\newcommand{\proceedings}[1]{% - \gdef \@proceedings {#1}} - -% Lists -% ----- - - -\setlength{\leftmargini}{13pt} -\setlength\leftmarginii{13pt} -\setlength\leftmarginiii{13pt} -\setlength\leftmarginiv{13pt} -\setlength{\labelsep}{3.5pt} - -\setlength{\topsep}{\standardvspace} -\if \@blockstyle - \setlength{\itemsep}{1pt} - \setlength{\parsep}{3pt} -\else - \setlength{\itemsep}{1pt} - \setlength{\parsep}{3pt} -\fi - -\renewcommand{\labelitemi}{{\small \centeroncapheight{\textbullet}}} -\renewcommand{\labelitemii}{\centeroncapheight{\rule{2.5pt}{2.5pt}}} -\renewcommand{\labelitemiii}{$-$} -\renewcommand{\labelitemiv}{{\Large \textperiodcentered}} - -\renewcommand{\@listi}{% - \leftmargin = \leftmargini - \listparindent = 0pt} -%%% \itemsep = 1pt -%%% \parsep = 3pt} -%%% \listparindent = \parindent} - -\let \@listI = \@listi - -\renewcommand{\@listii}{% - \leftmargin = \leftmarginii - \topsep = 1pt - \labelwidth = \leftmarginii - \advance \labelwidth by -\labelsep - \listparindent = \parindent} - -\renewcommand{\@listiii}{% - \leftmargin = \leftmarginiii - \labelwidth = \leftmarginiii - \advance \labelwidth by -\labelsep - \listparindent = \parindent} - -\renewcommand{\@listiv}{% - \leftmargin = \leftmarginiv - \labelwidth = \leftmarginiv - \advance \labelwidth by -\labelsep - \listparindent = \parindent} - -% Mathematics -% ----------- - - -\def \theequation {\arabic{equation}} - -% Miscellaneous -% ------------- - - -\newcommand{\balancecolumns}{% - \vfill\eject - \global\@colht = \textheight - \global\ht\@cclv = \textheight} - -\newcommand{\nut}{\hspace{.5em}} - -\newcommand{\softraggedright}{% - \let \\ = \@centercr - \leftskip = 0pt - \rightskip = 0pt plus 10pt} - -% Program Code -% ------- ---- - - -\newcommand{\mono}[1]{% - {\@tempdima = \fontdimen2\font - \texttt{\spaceskip = 1.1\@tempdima #1}}} - -% Running Heads and Feet -% ------- ----- --- ---- - - -\def \@preprintfooter {} - -\newcommand{\preprintfooter}[1]{% - \gdef \@preprintfooter {#1}} - -\if \@preprint - -\def \ps@plain {% - \let \@mkboth = \@gobbletwo - \let \@evenhead = \@empty - \def \@evenfoot {\scriptsize - \rlap{\textit{\@preprintfooter}}\hfil - \thepage \hfil - \llap{\textit{\@formatyear}}}% - \let \@oddhead = \@empty - \let \@oddfoot = \@evenfoot} - -\else\if \@reprint - -\def \ps@plain {% - \let \@mkboth = \@gobbletwo - \let \@evenhead = \@empty - \def \@evenfoot {\scriptsize \hfil \thepage \hfil}% - \let \@oddhead = \@empty - \let \@oddfoot = \@evenfoot} - -\else - -\let \ps@plain = \ps@empty -\let \ps@headings = \ps@empty -\let \ps@myheadings = \ps@empty - -\fi\fi - -\def \@formatyear {% - \number\year/\number\month/\number\day} - -% Special Characters -% ------- ---------- - - -\DeclareRobustCommand{\euro}{% - \protect{\rlap{=}}{\sf \kern .1em C}} - -% Title Page -% ----- ---- - - -\@setflag \@addauthorsdone = \@false - -\def \@titletext {\@latex@error{No title was provided}{}} -\def \@subtitletext {} - -\newcount{\@authorcount} - -\newcount{\@titlenotecount} -\newtoks{\@titlenotetext} - -\def \@titlebanner {} - -\renewcommand{\title}[1]{% - \gdef \@titletext {#1}} - -\newcommand{\subtitle}[1]{% - \gdef \@subtitletext {#1}} - -\newcommand{\authorinfo}[3]{% {names}{affiliation}{email/URL} - \global\@increment \@authorcount - \@withname\gdef {\@authorname\romannumeral\@authorcount}{#1}% - \@withname\gdef {\@authoraffil\romannumeral\@authorcount}{#2}% - \@withname\gdef {\@authoremail\romannumeral\@authorcount}{#3}} - -\renewcommand{\author}[1]{% - \@latex@error{The \string\author\space command is obsolete; - use \string\authorinfo}{}} - -\newcommand{\titlebanner}[1]{% - \gdef \@titlebanner {#1}} - -\renewcommand{\maketitle}{% - \pagestyle{plain}% - \if \@onecolumn - {\hsize = \standardtextwidth - \@maketitle}% - \else - \twocolumn[\@maketitle]% - \fi - \@placetitlenotes - \if \@copyrightwanted \@copyrightspace \fi} - -\def \@maketitle {% - \begin{center} - \@settitlebanner - \let \thanks = \titlenote - {\leftskip = 0pt plus 0.25\linewidth - \rightskip = 0pt plus 0.25 \linewidth - \parfillskip = 0pt - \spaceskip = .7em - \noindent \LARGE \bfseries \@titletext \par} - \vskip 6pt - \noindent \Large \@subtitletext \par - \vskip 12pt - \ifcase \@authorcount - \@latex@error{No authors were specified for this paper}{}\or - \@titleauthors{i}{}{}\or - \@titleauthors{i}{ii}{}\or - \@titleauthors{i}{ii}{iii}\or - \@titleauthors{i}{ii}{iii}\@titleauthors{iv}{}{}\or - \@titleauthors{i}{ii}{iii}\@titleauthors{iv}{v}{}\or - \@titleauthors{i}{ii}{iii}\@titleauthors{iv}{v}{vi}\or - \@titleauthors{i}{ii}{iii}\@titleauthors{iv}{v}{vi}% - \@titleauthors{vii}{}{}\or - \@titleauthors{i}{ii}{iii}\@titleauthors{iv}{v}{vi}% - \@titleauthors{vii}{viii}{}\or - \@titleauthors{i}{ii}{iii}\@titleauthors{iv}{v}{vi}% - \@titleauthors{vii}{viii}{ix}\or - \@titleauthors{i}{ii}{iii}\@titleauthors{iv}{v}{vi}% - \@titleauthors{vii}{viii}{ix}\@titleauthors{x}{}{}\or - \@titleauthors{i}{ii}{iii}\@titleauthors{iv}{v}{vi}% - \@titleauthors{vii}{viii}{ix}\@titleauthors{x}{xi}{}\or - \@titleauthors{i}{ii}{iii}\@titleauthors{iv}{v}{vi}% - \@titleauthors{vii}{viii}{ix}\@titleauthors{x}{xi}{xii}% - \else - \@latex@error{Cannot handle more than 12 authors}{}% - \fi - \vspace{1.75pc} - \end{center}} - -\def \@settitlebanner {% - \if \@andp{\@preprint}{\@notp{\@emptydefp{\@titlebanner}}}% - \vbox to 0pt{% - \vskip -32pt - \noindent \textbf{\@titlebanner}\par - \vss}% - \nointerlineskip - \fi} - -\def \@titleauthors #1#2#3{% - \if \@andp{\@emptyargp{#2}}{\@emptyargp{#3}}% - \noindent \@setauthor{40pc}{#1}{\@false}\par - \else\if \@emptyargp{#3}% - \noindent \@setauthor{17pc}{#1}{\@false}\hspace{3pc}% - \@setauthor{17pc}{#2}{\@false}\par - \else - \noindent \@setauthor{12.5pc}{#1}{\@false}\hspace{2pc}% - \@setauthor{12.5pc}{#2}{\@false}\hspace{2pc}% - \@setauthor{12.5pc}{#3}{\@true}\par - \relax - \fi\fi - \vspace{20pt}} - -\def \@setauthor #1#2#3{% {width}{text}{unused} - \vtop{% - \def \and {% - \hspace{16pt}} - \hsize = #1 - \normalfont - \centering - \large \@name{\@authorname#2}\par - \vspace{5pt} - \normalsize \@name{\@authoraffil#2}\par - \vspace{2pt} - \textsf{\@name{\@authoremail#2}}\par}} - -\def \@maybetitlenote #1{% - \if \@andp{#1}{\@gtrp{\@authorcount}{3}}% - \titlenote{See page~\pageref{@addauthors} for additional authors.}% - \fi} - -\newtoks{\@fnmark} - -\newcommand{\titlenote}[1]{% - \global\@increment \@titlenotecount - \ifcase \@titlenotecount \relax \or - \@fnmark = {\ast}\or - \@fnmark = {\dagger}\or - \@fnmark = {\ddagger}\or - \@fnmark = {\S}\or - \@fnmark = {\P}\or - \@fnmark = {\ast\ast}% - \fi - \,$^{\the\@fnmark}$% - \edef \reserved@a {\noexpand\@appendtotext{% - \noexpand\@titlefootnote{\the\@fnmark}}}% - \reserved@a{#1}} - -\def \@appendtotext #1#2{% - \global\@titlenotetext = \expandafter{\the\@titlenotetext #1{#2}}} - -\newcount{\@authori} - -\iffalse -\def \additionalauthors {% - \if \@gtrp{\@authorcount}{3}% - \section{Additional Authors}% - \label{@addauthors}% - \noindent - \@authori = 4 - {\let \\ = ,% - \loop - \textbf{\@name{\@authorname\romannumeral\@authori}}, - \@name{\@authoraffil\romannumeral\@authori}, - email: \@name{\@authoremail\romannumeral\@authori}.% - \@increment \@authori - \if \@notp{\@gtrp{\@authori}{\@authorcount}} \repeat}% - \par - \fi - \global\@setflag \@addauthorsdone = \@true} -\fi - -\let \addauthorsection = \additionalauthors - -\def \@placetitlenotes { - \the\@titlenotetext} - -% Utilities -% --------- - - -\newcommand{\centeroncapheight}[1]{% - {\setbox\@tempboxa = \hbox{#1}% - \@measurecapheight{\@tempdima}% % Calculate ht(CAP) - ht(text) - \advance \@tempdima by -\ht\@tempboxa % ------------------ - \divide \@tempdima by 2 % 2 - \raise \@tempdima \box\@tempboxa}} - -\newbox{\@measbox} - -\def \@measurecapheight #1{% {\dimen} - \setbox\@measbox = \hbox{ABCDEFGHIJKLMNOPQRSTUVWXYZ}% - #1 = \ht\@measbox} - -\long\def \@titlefootnote #1#2{% - \insert\footins{% - \reset@font\footnotesize - \interlinepenalty\interfootnotelinepenalty - \splittopskip\footnotesep - \splitmaxdepth \dp\strutbox \floatingpenalty \@MM - \hsize\columnwidth \@parboxrestore -%%% \protected@edef\@currentlabel{% -%%% \csname p@footnote\endcsname\@thefnmark}% - \color@begingroup - \def \@makefnmark {$^{#1}$}% - \@makefntext{% - \rule\z@\footnotesep\ignorespaces#2\@finalstrut\strutbox}% - \color@endgroup}} - -% LaTeX Modifications -% ----- ------------- - -\def \@seccntformat #1{% - \@name{\the#1}% - \@expandaftertwice\@seccntformata \csname the#1\endcsname.\@mark - \quad} - -\def \@seccntformata #1.#2\@mark{% - \if \@emptyargp{#2}.\fi} - -% Revision History -% -------- ------- - - -% Date Person Ver. Change -% ---- ------ ---- ------ - -% 2004.09.12 PCA 0.1--4 Preliminary development. - -% 2004.11.18 PCA 0.5 Start beta testing. - -% 2004.11.19 PCA 0.6 Obsolete \author and replace with -% \authorinfo. -% Add 'nocopyrightspace' option. -% Compress article opener spacing. -% Add 'mathtime' option. -% Increase text height by 6 points. - -% 2004.11.28 PCA 0.7 Add 'cm/computermodern' options. -% Change default to Times text. - -% 2004.12.14 PCA 0.8 Remove use of mathptm.sty; it cannot -% coexist with latexsym or amssymb. - -% 2005.01.20 PCA 0.9 Rename class file to sigplanconf.cls. - -% 2005.03.05 PCA 0.91 Change default copyright data. - -% 2005.03.06 PCA 0.92 Add at-signs to some macro names. - -% 2005.03.07 PCA 0.93 The 'onecolumn' option defaults to '11pt', -% and it uses the full type width. - -% 2005.03.15 PCA 0.94 Add at-signs to more macro names. -% Allow margin paragraphs during review. - -% 2005.03.22 PCA 0.95 Implement \euro. -% Remove proof and newdef environments. - -% 2005.05.06 PCA 1.0 Eliminate 'onecolumn' option. -% Change footer to small italic and eliminate -% left portion if no \preprintfooter. -% Eliminate copyright notice if preprint. -% Clean up and shrink copyright box. - -% 2005.05.30 PCA 1.1 Add alternate permission statements. - -% 2005.06.29 PCA 1.1 Publish final first edition of guide. - -% 2005.07.14 PCA 1.2 Add \subparagraph. -% Use block paragraphs in lists, and adjust -% spacing between items and paragraphs. - -% 2006.06.22 PCA 1.3 Add 'reprint' option and associated -% commands. - -% 2006.08.24 PCA 1.4 Fix bug in \maketitle case command. - -% 2007.03.13 PCA 1.5 The title banner only displays with the -% 'preprint' option. - -% 2007.06.06 PCA 1.6 Use \bibfont in \thebibliography. -% Add 'natbib' option to load and configure -% the natbib package. - -% 2007.11.20 PCA 1.7 Balance line lengths in centered article -% title (thanks to Norman Ramsey). - -% 2009.01.26 PCA 1.8 Change natbib \bibpunct values. - -% 2009.03.24 PCA 1.9 Change natbib to use the 'numbers' option. -% Change templates to use 'natbib' option. - -% 2009.09.01 PCA 2.0 Add \reprintprice command (suggested by -% Stephen Chong). - -% 2009.09.08 PCA 2.1 Make 'natbib' the default; add 'nonatbib'. -% SB Add 'authoryear' and 'numbers' (default) to -% control citation style when using natbib. -% Add \bibpunct to change punctuation for -% 'authoryear' style. - -% 2009.09.21 PCA 2.2 Add \softraggedright to the thebibliography -% environment. Also add to template so it will -% happen with natbib. - -% 2009.09.30 PCA 2.3 Remove \softraggedright from thebibliography. -% Just include in the template. - -% 2010.05.24 PCA 2.4 Obfuscate class author's email address. - -% 2011.11.08 PCA 2.5 Add copyright notice to this file. -% Remove 'sort' option from natbib when using -% 'authoryear' style. -% Add the \authorversion command. - -% 2013.02.22 PCA 2.6 Change natbib fences to parentheses when -% using 'authoryear' style. - -% 2013.05.17 PCA 2.7 Change standard and author copyright text. - -% 2013.07.02 TU 2.8 More changes to permission/copyright notes. -% Replaced ambiguous \authorpermission with -% \exclusivelicense and \permissiontopublish - - diff --git a/scribble-lib/scribble/sigplan/style.tex b/scribble-lib/scribble/sigplan/style.tex deleted file mode 100644 index 2ebb8aac..00000000 --- a/scribble-lib/scribble/sigplan/style.tex +++ /dev/null @@ -1,41 +0,0 @@ - -% Define \SXtitle to lift \SSubtitle out: -\def\SXtitle#1{\title{\let\SSubtitle\SSubtitleDrop#1}\SExtractSubtitle#1\SExtractSubtitleDone} -\def\SSubtitleDrop#1{} -\def\SExtractSubtitleDone {} -\def\SExtractSubtitle{\futurelet\next\SExtractSubtitleX} -\def\SExtractSubtitleX#1{\ifx#1\SSubtitle \let\Snext\SWithSubtitle \else \let\Snext\SExtractSubtitleY \fi \Snext} -\def\SExtractSubtitleY{\ifx\next\SExtractSubtitleDone \let\Snext\relax \else \let\Snext\SExtractSubtitle \fi \Snext} -\def\SWithSubtitle#1{\subtitle{#1}\SExtractSubtitle} - -\renewcommand{\titleAndVersionAndAuthors}[3]{\SXtitle{#1}#3\maketitle} -\renewcommand{\titleAndEmptyVersionAndAuthors}[3]{\titleAndVersionAndAuthors{#1}{#2}{#3}} -\renewcommand{\titleAndVersionAndEmptyAuthors}[3]{\SXtitle{#1}\authorinfo{Anonymous}{}{}\maketitle} -\renewcommand{\titleAndEmptyVersionAndEmptyAuthors}[3]{\titleAndVersionAndEmptyAuthors{#1}{#2}{#3}} - -% Support plain `author' while enabling `authorinfo': for each -% use of \SAuthor, check whether it contains an \SAuthorinfo form: -\def\SAuthor#1{\SAutoAuthor#1\SAutoAuthorDone{#1}} -\def\SAutoAuthorDone#1{} -\def\SAutoAuthor{\futurelet\next\SAutoAuthorX} -\def\SAutoAuthorX{\ifx\next\SAuthorinfo \let\Snext\relax \else \let\Snext\SToAuthorDone \fi \Snext} -\def\SToAuthorDone{\futurelet\next\SToAuthorDoneX} -\def\SToAuthorDoneX#1{\ifx\next\SAutoAuthorDone \let\Snext\SAddAuthorInfo \else \let\Snext\SToAuthorDone \fi \Snext} -\newcommand{\SAddAuthorInfo}[1]{\authorinfo{#1}{}{}} - -\renewcommand{\SAuthorinfo}[3]{\authorinfo{#1}{#2}{#3}} -\renewcommand{\SAuthorSep}[1]{} - -\renewcommand{\SConferenceInfo}[2]{\conferenceinfo{#1}{#2}} -\renewcommand{\SCopyrightYear}[1]{\copyrightyear{#1}} -\renewcommand{\SCopyrightData}[1]{\copyrightdata{#1}} -\renewcommand{\Sdoi}[1]{\doi{#1}} -\renewcommand{\SPexclusivelicense}[0]{\exclusivelicense} - -\renewcommand{\SCategory}[3]{\category{#1}{#2}{#3}} -\renewcommand{\SCategoryPlus}[4]{\category{#1}{#2}{#3}[#4]} -\renewcommand{\STerms}[1]{\terms{#1}} -\renewcommand{\SKeywords}[1]{\keywords{#1}} - -% A later \doi will replace this one: -\doi{} diff --git a/scribble-lib/scribble/srcdoc.rkt b/scribble-lib/scribble/srcdoc.rkt deleted file mode 100644 index ee977a16..00000000 --- a/scribble-lib/scribble/srcdoc.rkt +++ /dev/null @@ -1,710 +0,0 @@ -#lang racket/base -(require racket/contract/base - (for-syntax racket/base - racket/require-transform - racket/provide-transform - syntax/stx - syntax/private/modcollapse-noctc - syntax/parse)) - -(provide for-doc require/doc - provide/doc ; not needed anymore - thing-doc - parameter-doc - proc-doc - proc-doc/names - struct-doc - struct*-doc - form-doc - generate-delayed-documents - begin-for-doc) - -(begin-for-syntax - (define requires null) - (define doc-body null) - (define doc-exprs null) - (define generated? #f) - (define delayed? #f) - - (define (add-requires!/decl specs) - (unless delayed? - (syntax-local-lift-module-end-declaration - #`(begin-for-syntax (add-relative-requires! (#%variable-reference) - (quote-syntax #,specs))))) - (with-syntax ([(spec ...) (syntax-local-introduce specs)]) - ;; Using `combine-in` protects `spec` against - ;; matching `(op arg ...)` in `doc-submodule`: - (add-requires! #'((combine-in spec) ...)))) - - (define (add-relative-requires! varref specs) - (define mpi (variable-reference->module-path-index varref)) - (define-values (name base) (module-path-index-split mpi)) - (if name - (add-requires! - (with-syntax ([(spec ...) specs] - [rel-to (collapse-module-path-index - mpi - (build-path (or (current-load-relative-directory) - (current-directory)) - "here.rkt"))]) - #'((relative-in rel-to spec) ...))) - (add-requires! specs))) - - (define (add-requires! specs) - (set! requires (cons specs requires))) - - (define (generate-doc-submodule!) - (unless generated? - (set! generated? #t) - (syntax-local-lift-module-end-declaration #'(doc-submodule))))) - -(define-syntax for-doc - (make-require-transformer - (lambda (stx) - (syntax-case stx () - [(_ spec ...) - (add-requires!/decl #'(spec ...))]) - (values null null)))) - -(define-syntax (doc-submodule stx) - (define (shift-and-introduce s) - (syntax-local-introduce - (syntax-shift-phase-level s #f))) - (with-syntax ([((req ...) ...) - (map (lambda (rs) - (map (lambda (r) - (syntax-case r () - [(op arg ...) - (with-syntax ([(arg ...) - (map shift-and-introduce - (syntax->list #'(arg ...)))]) - #'(op arg ...))] - [else - (shift-and-introduce r)])) - (syntax->list rs))) - (reverse requires))] - [(expr ...) - (map shift-and-introduce (reverse doc-exprs))] - [doc-body - (map shift-and-introduce (reverse doc-body))]) - ;; This module will be required `for-template': - (if delayed? - ;; delayed mode: return syntax objects to drop into context: - #'(begin-for-syntax - (module* srcdoc #f - (require (for-syntax racket/base syntax/quote)) - (begin-for-syntax - (provide get-docs) - (define (get-docs) - (list (quote-syntax (req ... ...)) - (quote-syntax (expr ...)) - (quote-syntax/keep-srcloc #:source 'doc doc-body)))))) - ;; normal mode: return an identifier that holds the document: - (with-syntax ([((id d) ...) #'doc-body]) - #'(begin-for-syntax - (module* srcdoc #f - (require req ... ...) - expr ... - (define docs (list (cons 'id d) ...)) - (require (for-syntax racket/base)) - (begin-for-syntax - (provide get-docs) - (define (get-docs) - #'docs)))))))) - -(define-syntax (require/doc stx) - (syntax-case stx () - [(_ spec ...) - (add-requires!/decl #'(spec ...)) - #'(begin)])) - -(define-for-syntax (do-provide/doc stx modes) - (let ([forms (list stx)]) - (with-syntax ([((for-provide/contract (req ...) d id) ...) - (map (lambda (form) - (syntax-case form () - [(id . _) - (identifier? #'id) - (let ([t (syntax-local-value #'id (lambda () #f))]) - (unless (provide/doc-transformer? t) - (raise-syntax-error - #f - "not bound as a provide/doc transformer" - stx - #'id)) - (let* ([i (make-syntax-introducer)] - [i2 (lambda (x) (syntax-local-introduce (i x)))]) - (let-values ([(p/c d req/d id) - ((provide/doc-transformer-proc t) - (i (syntax-local-introduce form)))]) - (list (i2 p/c) (i req/d) (i d) (i id)))))] - [_ - (raise-syntax-error - #f - "not a provide/doc sub-form" - stx - form)])) - forms)]) - (with-syntax ([(p/c ...) - (map (lambda (form f) - (if (identifier? f) - f - (quasisyntax/loc form - (contract-out #,f)))) - forms - (syntax->list #'(for-provide/contract ...)))]) - (generate-doc-submodule!) - (set! doc-body (append (reverse (syntax->list #'((id d) ...))) - doc-body)) - (set! requires (cons #'(req ... ...) requires)) - (pre-expand-export #'(combine-out p/c ...) modes))))) - -(define-syntax (begin-for-doc stx) - (syntax-case stx () - [(_ d ...) - (set! doc-exprs (append (reverse (syntax->list - (syntax-local-introduce - #'(d ...)))) - doc-exprs)) - #'(begin)])) - -(define-syntax-rule (provide/doc form ...) - (provide form ...)) - - - -(provide define-provide/doc-transformer - (for-syntax - provide/doc-transformer? - provide/doc-transformer-proc)) - -(begin-for-syntax - (define-struct provide/doc-transformer (proc) - #:property - prop:provide-pre-transformer - (lambda (self) - (lambda (stx mode) - (do-provide/doc stx mode))))) - -(define-syntax-rule (define-provide/doc-transformer id rhs) - (define-syntax id - (make-provide/doc-transformer rhs))) - -(module transformers racket/base - (require (for-template racket/base racket/contract) - racket/contract) - (provide proc-doc-transformer proc-doc/names-transformer) - - (define (remove->i-deps stx-lst arg?) - (let loop ([stx-lst stx-lst]) - (cond - [(null? stx-lst) '()] - [else - (define fst (car stx-lst)) - (syntax-case fst () - [kwd - (and arg? (keyword? (syntax-e #'kwd))) - (let () - (when (null? (cdr stx-lst)) - (raise-syntax-error 'proc-doc "expected something to follow keyword" stx-lst)) - (define snd (cadr stx-lst)) - (syntax-case snd () - [(id (id2 ...) ctc) - (cons #'(kwd id ctc) (loop (cddr stx-lst)))] - [(id ctc) - (cons #'(kwd id ctc) (loop (cddr stx-lst)))] - [else - (raise-syntax-error 'proc-doc "unknown argument spec in ->i" snd)]))] - [(id (id2 ...) ctc) - (cons #'(id ctc) (loop (cdr stx-lst)))] - [(id ctc) - (cons #'(id ctc) (loop (cdr stx-lst)))] - [else - (raise-syntax-error 'proc-doc (if arg? "unknown argument spec in ->i" "unknown result spec in ->i") fst)])]))) - - (define (proc-doc-transformer stx) - (syntax-case stx () - [(_ id contract . desc+stuff) - (let () - (define (one-desc desc+stuff) - (syntax-case desc+stuff () - [(desc) #'desc] - [() (raise-syntax-error 'proc-doc "expected a description expression" stx)] - [(a b . c) (raise-syntax-error 'proc-doc "expected just a single description expression" stx #'a)])) - (define (parse-opts opts desc+stuff) - (syntax-case opts () - [() #`(() #,(one-desc desc+stuff))] - [(opt ...) - (with-syntax ([(opt ...) (remove->i-deps (syntax->list #'(opt ...)) #t)]) - (syntax-case desc+stuff () - [((defaults ...) . desc+stuff) - (let () - (define def-list (syntax->list #'(defaults ...))) - (define opt-list (syntax->list #'(opt ...))) - (unless (= (length def-list) (length opt-list)) - (raise-syntax-error 'proc-doc - (format "expected ~a default values, but got ~a" - (length opt-list) (length def-list)) - stx - opts)) - #`(#,(for/list ([opt (in-list opt-list)] - [def (in-list def-list)]) - (syntax-case opt () - [(id ctc) - #`(id ctc #,def)] - [(kwd id ctc) - #`(kwd id ctc #,def)])) - #,(one-desc #'desc+stuff)))]))])) - (define-values (header result body-extras desc) - (syntax-case #'contract (->d ->i -> values) - [(->d (req ...) () (values [name res] ...)) - (values #'(id req ...) #'(values res ...) #'() (one-desc #'desc+stuff))] - [(->d (req ...) () #:pre-cond condition (values [name res] ...)) - (values #'(id req ...) #'(values res ...) #'((bold "Pre-condition: ") (racket condition) "\n" "\n") (one-desc #'desc+stuff))] - [(->d (req ...) () [name res]) - (values #'(id req ...) #'res #'() (one-desc #'desc+stuff))] - [(->d (req ...) () #:pre-cond condition [name res]) - (values #'(id req ...) #'res #'((bold "Pre-condition: ") (racket condition) "\n" "\n" ) (one-desc #'desc+stuff))] - [(->d (req ...) () #:rest rest rest-ctc [name res]) - (values #'(id req ... [rest rest-ctc] (... ...)) #'res #'() (one-desc #'desc+stuff))] - [(->d (req ...) (one more ...) whatever) - (raise-syntax-error - #f - (format "unsupported ->d contract form for ~a, optional arguments non-empty, must use proc-doc/names" - (syntax->datum #'id)) - stx - #'contract)] - [(->d whatever ...) - (raise-syntax-error - #f - (format "unsupported ->d contract form for ~a" (syntax->datum #'id)) - stx - #'contract)] - - [(->i (req ...) (opt ...) (values ress ...)) - (with-syntax ([(req ...) (remove->i-deps (syntax->list #'(req ...)) #t)] - [((opt ...) desc) (parse-opts #'(opt ...) #'desc+stuff)] - [([name res] ...) (remove->i-deps (syntax->list #'(req ...)) #f)]) - (values #'(id req ... opt ...) #'(values res ...) #'() #'desc))] - [(->i (req ...) (opt ...) #:pre (pre-id ...) condition (values ress ...)) - (with-syntax ([(req ...) (remove->i-deps (syntax->list #'(req ...)) #t)] - [((opt ...) desc) (parse-opts #'(opt ...) #'desc+stuff)] - [([name res] ...) (remove->i-deps (syntax->list #'(req ...)) #f)]) - (values #'(id req ... opt ...) #'(values res ...) #'((bold "Pre-condition: ") (racket condition) "\n" "\n") #'desc))] - [(->i (req ...) (opt ...) res) - (with-syntax ([(req ...) (remove->i-deps (syntax->list #'(req ...)) #t)] - [((opt ...) desc) (parse-opts #'(opt ...) #'desc+stuff)] - [([name res]) (remove->i-deps (list #'res) #f)]) - (values #'(id req ... opt ...) #'res #'() #'desc))] - [(->i (req ...) (opt ...) #:pre (pre-id ...) condition [name res]) - (with-syntax ([(req ...) (remove->i-deps (syntax->list #'(req ...)) #t)] - [((opt ...) desc) (parse-opts #'(opt ...) #'desc+stuff)] - [([name res]) (remove->i-deps (list #'res) #f)]) - (values #'(id req ... opt ...) #'res #'((bold "Pre-condition: ") (racket condition) "\n" "\n" ) #'desc))] - [(->i (req ...) (opt ...) #:rest rest res) - (with-syntax ([(req ...) (remove->i-deps (syntax->list #'(req ...)) #t)] - [((opt ...) desc) (parse-opts #'(opt ...) #'desc+stuff)] - [([name-t rest-ctc]) (remove->i-deps (list #'rest) #t)] - [([name res]) (remove->i-deps (list #'res) #f)]) - (values #'(id req ... opt ... [name-t rest-ctc] (... ...)) #'res #'() #'desc))] - [(->i whatever ...) - (raise-syntax-error - #f - (format "unsupported ->i contract form for ~a" (syntax->datum #'id)) - stx - #'contract)] - - [(-> result) - (values #'(id) #'result #'() (one-desc #'desc+stuff))] - [(-> whatever ...) - (raise-syntax-error - #f - (format "unsupported -> contract form for ~a, must use proc-doc/names if there are arguments" - (syntax->datum #'id)) - stx - #'contract)] - [(id whatever ...) - (raise-syntax-error - #f - (format "unsupported ~a contract form (unable to synthesize argument names)" (syntax->datum #'id)) - stx - #'contract)])) - (values - #'[id contract] - #`(defproc #,header #,result #,@body-extras #,@desc) - #'(scribble/manual - racket/base) ; for `...' - #'id))])) - - (define (proc-doc/names-transformer stx) - (syntax-case stx () - [(_ id contract names desc) - (with-syntax ([header - (syntax-case #'(contract names) (->d -> ->* values case->) - [((-> ctcs ... result) (arg-names ...)) - (begin - (unless (= (length (syntax->list #'(ctcs ...))) - (length (syntax->list #'(arg-names ...)))) - (raise-syntax-error #f "mismatched argument list and domain contract count" stx)) - #'([(id (arg-names ctcs) ...) result]))] - - [((->* (mandatory ...) (optional ...) result) - names) - (syntax-case #'names () - [((mandatory-names ...) - ((optional-names optional-default) ...)) - - (let ([build-mandatories/optionals - (λ (names contracts extras) - (let ([names-length (length names)] - [contracts-length (length contracts)]) - (let loop ([contracts contracts] - [names names] - [extras extras]) - (cond - [(and (null? names) (null? contracts)) '()] - [(or (null? names) (null? contracts)) - (raise-syntax-error #f - (format "mismatched ~a argument list count and domain contract count (~a)" - (if extras "optional" "mandatory") - (if (null? names) - "ran out of names" - "ran out of contracts")) - stx)] - [else - (let ([fst-name (car names)] - [fst-ctc (car contracts)]) - (if (keyword? (syntax-e fst-ctc)) - (begin - (unless (pair? (cdr contracts)) - (raise-syntax-error #f - "keyword not followed by a contract" - stx)) - (cons (if extras - (list fst-ctc fst-name (cadr contracts) (car extras)) - (list fst-ctc fst-name (cadr contracts))) - (loop (cddr contracts) - (cdr names) - (if extras - (cdr extras) - extras)))) - (cons (if extras - (list fst-name fst-ctc (car extras)) - (list fst-name fst-ctc)) - (loop (cdr contracts) (cdr names) (if extras - (cdr extras) - extras)))))]))))]) - - #`([(id #,@(build-mandatories/optionals (syntax->list #'(mandatory-names ...)) - (syntax->list #'(mandatory ...)) - #f) - #,@(build-mandatories/optionals (syntax->list #'(optional-names ...)) - (syntax->list #'(optional ...)) - (syntax->list #'(optional-default ...)))) - result]))] - [(mandatory-names optional-names) - (begin - (syntax-case #'mandatory-names () - [(mandatory-names ...) - (andmap identifier? (syntax->list #'(mandatory-names ...)))] - [x - (raise-syntax-error #f "mandatory names should be a sequence of identifiers" - stx - #'mandatory-names)]) - (syntax-case #'optional-names () - [((x y) ...) - (andmap identifier? (syntax->list #'(x ... y ...)))] - [((x y) ...) - (for-each - (λ (var) - (unless (identifier? var) - (raise-syntax-error #f "expected an identifier in the optional names" stx var))) - (syntax->list #'(x ... y ...)))] - [(a ...) - (for-each - (λ (a) - (syntax-case stx () - [(x y) (void)] - [other - (raise-syntax-error #f "expected an sequence of two idenfiers" stx #'other)])) - (syntax->list #'(a ...)))]))] - [x - (raise-syntax-error - #f - "expected two sequences, one of mandatory names and one of optionals" - stx - #'x)])] - [((case-> (-> doms ... rng) ...) - ((args ...) ...)) - (begin - (unless (= (length (syntax->list #'((doms ...) ...))) - (length (syntax->list #'((args ...) ...)))) - (raise-syntax-error #f - "number of cases and number of arg lists do not have the same size" - stx)) - (for-each - (λ (doms args) - (unless (= (length (syntax->list doms)) - (length (syntax->list args))) - (raise-syntax-error #f "mismatched case argument list and domain contract" stx - #f - (list doms args)))) - (syntax->list #'((doms ...) ...)) - (syntax->list #'((args ...) ...))) - #'([(id (args doms) ...) rng] ...))] - [else - (raise-syntax-error - #f - "unsupported procedure contract form (no argument names)" - stx - #'contract)])]) - (values - #'[id contract] - #'(defproc* header . desc) - #'((only-in scribble/manual defproc*)) - #'id))]))) - -(require (for-syntax (submod "." transformers))) -(define-provide/doc-transformer proc-doc proc-doc-transformer) -(define-provide/doc-transformer proc-doc/names proc-doc/names-transformer) - -(define-provide/doc-transformer parameter-doc - (lambda (stx) - (syntax-case stx (parameter/c) - [(_ id (parameter/c contract) arg-id desc) - (begin - (unless (identifier? #'arg-id) - (raise-syntax-error 'parameter-doc - "expected an identifier" - stx - #'arg-id)) - (unless (identifier? #'id) - (raise-syntax-error 'parameter-doc - "expected an identifier" - stx - #'id)) - (values - #'[id (parameter/c contract)] - #'(defparam id arg-id contract . desc) - #'((only-in scribble/manual defparam)) - #'id))]))) - -(define-for-syntax (struct-doc-transformer stx result-form) - (syntax-case stx () - [(_ struct-name ([field-name contract-expr-datum] ...) . stuff) - (let () - (define the-name #f) - (syntax-case #'struct-name () - [x (identifier? #'x) (set! the-name #'x)] - [(x y) (and (identifier? #'x) (identifier? #'y)) - (set! the-name #'x)] - [_ - (raise-syntax-error #f - "expected an identifier or sequence of two identifiers" - stx - #'struct-name)]) - (for ([f (in-list (syntax->list #'(field-name ...)))]) - (unless (identifier? f) - (raise-syntax-error #f - "expected an identifier" - stx - f))) - (define omit-constructor? #f) - (define-values (ds-args desc) - (let loop ([ds-args '()] - [stuff #'stuff]) - (syntax-case stuff () - [(#:mutable . more-stuff) - (loop (cons (stx-car stuff) ds-args) - #'more-stuff)] - [(#:inspector #f . more-stuff) - (loop (list* (stx-car (stx-cdr stuff)) - (stx-car stuff) - ds-args) - #'more-stuff)] - [(#:prefab . more-stuff) - (loop (cons (stx-car stuff) ds-args) - #'more-stuff)] - [(#:transparent . more-stuff) - (loop (cons (stx-car stuff) ds-args) - #'more-stuff)] - [(#:constructor-name id . more-stuff) - (loop (list* (stx-car (stx-cdr stuff)) - (stx-car stuff) - ds-args) - #'more-stuff)] - [(#:extra-constructor-name id . more-stuff) - (loop (list* (stx-car (stx-cdr stuff)) - (stx-car stuff) - ds-args) - #'more-stuff)] - [(#:omit-constructor . more-stuff) - (begin - (set! omit-constructor? #t) - (loop (cons (stx-car stuff) ds-args) - #'more-stuff))] - [(x . more-stuff) - (keyword? (syntax-e #'x)) - (raise-syntax-error #f - "unknown keyword" - stx - (stx-car stuff))] - [(desc) - (values (reverse ds-args) #'desc)] - [_ - (raise-syntax-error #f "bad syntax" stx)]))) - (values - #`(struct struct-name ((field-name contract-expr-datum) ...) - #,@(if omit-constructor? - '(#:omit-constructor) - '())) - #`(#,result-form struct-name ([field-name contract-expr-datum] ...) - #,@(reverse ds-args) - #,@desc) - #`((only-in scribble/manual #,result-form)) - the-name))])) - -(define-provide/doc-transformer struct-doc - (λ (stx) - (struct-doc-transformer stx #'defstruct))) -(define-provide/doc-transformer struct*-doc - (λ (stx) - (struct-doc-transformer stx #'defstruct*))) - -(define-provide/doc-transformer thing-doc - (lambda (stx) - (syntax-case stx () - [(_ id contract desc) - (begin - (unless (identifier? #'id) - (raise-syntax-error 'parameter/doc - "expected an identifier" - stx - #'id)) - (values - #'[id contract] - #'(defthing id contract . desc) - #'((only-in scribble/manual defthing)) - #'id))]))) - -(begin-for-syntax - (define-splicing-syntax-class kind-kw - #:description "#:kind keyword" - (pattern (~seq #:kind kind) - #:with (kind-seq ...) #'(#:kind kind)) - (pattern (~seq) - #:with (kind-seq ...) #'())) - - (define-splicing-syntax-class link-target?-kw - #:description "#:link-target? keyword" - (pattern (~seq #:link-target? expr) - #:with (link-target-seq ...) #'(#:link-target? expr)) - (pattern (~seq) - #:with (link-target-seq ...) #'())) - - (define-splicing-syntax-class id-kw - #:description "#:id keyword" - (pattern (~seq #:id [defined-id:id defined-id-expr]) - #:with (id-seq ...) #'(#:id [defined-id:id defined-id-expr])) - (pattern (~seq #:id defined-id:id) - #:with (id-seq ...) #'(#:id defined-id)) - (pattern (~seq #:id other) - #:with defined-id #'#f - #:with (id-seq ...) #'(#:id other)) - (pattern (~seq) - #:with defined-id #'#f - #:with (id-seq ...) #'())) - - (define-splicing-syntax-class literals-kw - #:description "#:literals keyword" - (pattern (~seq #:literals l) - #:with (literals-seq ...) #'(#:literals l)) - (pattern (~seq) - #:with (literals-seq ...) #'())) - - (define-splicing-syntax-class subs-kw - #:description "#:grammar keyword" - (pattern (~seq #:grammar g) - #:with (grammar-seq ...) #'(#:grammar g)) - (pattern (~seq) - #:with (grammar-seq ...) #'())) - - (define-splicing-syntax-class contracts-kw - #:description "#:contracts keyword" - (pattern (~seq #:contracts c) - #:with (contracts-seq ...) #'(#:contracts c)) - (pattern (~seq) - #:with (contracts-seq ...) #'()))) - -(define-provide/doc-transformer form-doc - (lambda (stx) - (syntax-parse stx - [(_ k:kind-kw lt:link-target?-kw d:id-kw l:literals-kw spec - subs:subs-kw c:contracts-kw desc) - (with-syntax ([id (if (syntax-e #'d.defined-id) - #'d.defined-id - (syntax-case #'spec () - [(id . rest) - (identifier? #'id) - #'id] - [_ #'unknown]))]) - (values - #'id - #'(defform - k.kind-seq ... - lt.link-target-seq ... - d.id-seq ... - l.literals-seq ... - spec - subs.grammar-seq ... - c.contracts-seq ... - . desc) - #'((only-in scribble/manual defform)) - #'id))]))) - -(define-syntax (generate-delayed-documents stx) - (syntax-case stx () - [(_) - (begin - (set! delayed? #t) - #'(begin))])) - - -(module+ test - (require (submod ".." transformers) - rackunit - racket/contract) - - (define (try-docs transformer input) - (define-values (_0 docs _1 _2) (transformer input)) - (syntax->datum docs)) - - (check-equal? (try-docs proc-doc-transformer #'(_ f (-> void?) ())) - '(defproc (f) void?)) - (check-equal? (try-docs proc-doc-transformer #'(_ f (->i ([x integer?]) () [result void?]) ())) - '(defproc (f [x integer?]) void?)) - (check-equal? (try-docs proc-doc-transformer #'(_ f (->i ([x integer?] #:y [y boolean?]) () [res void?]) ())) - '(defproc (f [x integer?] [#:y y boolean?]) void?)) - (check-equal? (try-docs proc-doc-transformer #'(_ f (->i ([x integer?]) ([y boolean?] [z char?]) [result void?]) (#t #\x) ())) - '(defproc (f [x integer?] [y boolean? #t] [z char? #\x]) void?)) - (check-equal? (try-docs proc-doc-transformer #'(_ f (->i ([x integer?] #:y [y boolean?]) ([z char?] #:w [w string?]) [res void?]) (#\a "b") ())) - '(defproc (f [x integer?] [#:y y boolean?] [z char? #\a] [#:w w string? "b"]) void?)) - - (check-equal? (try-docs proc-doc-transformer - #'(_ g - (->i ([str string?]) - () - #:rest [rest (listof any/c)] - [res (str) integer?]) - ())) - '(defproc (g (str string?) (rest (listof any/c)) ...) integer?)) - - (check-equal? (try-docs proc-doc/names-transformer #'(_ f (-> integer? char? boolean?) (a b) ())) - '(defproc* (((f [a integer?] [b char?]) boolean?)))) - (check-equal? (try-docs proc-doc/names-transformer #'(_ f (->* (integer? char?) () boolean?) ((a b) ()) ())) - '(defproc* (((f [a integer?] [b char?]) boolean?)))) - (check-equal? (try-docs proc-doc/names-transformer #'(_ f (->* (integer? char?) (string? number?) boolean?) ((a b) ((c "a") (d 11))) ())) - '(defproc* (((f [a integer?] [b char?] [c string? "a"] [d number? 11]) boolean?)))) - (check-equal? (try-docs proc-doc/names-transformer #'(_ f (case-> (-> integer? char?) (-> string? number? boolean? void?)) ((a) (b c d)) ())) - '(defproc* (((f [a integer?]) char?) - ((f [b string?] [c number?] [d boolean?]) void?))))) diff --git a/scribble-lib/scribble/struct.rkt b/scribble-lib/scribble/struct.rkt deleted file mode 100644 index 3b430454..00000000 --- a/scribble-lib/scribble/struct.rkt +++ /dev/null @@ -1,429 +0,0 @@ -#lang scheme/base -(require (rename-in (except-in "core.rkt" - target-url struct:target-url target-url? target-url-addr) - [make-target-url core:make-target-url]) - "private/provide-structs.rkt" - "html-properties.rkt" - scheme/provide-syntax - scheme/struct-info - racket/contract/base - (for-syntax scheme/base)) - -(define-provide-syntax (compat**-out stx) - (syntax-case stx () - [(_ struct-out o) - (let ([id (syntax-case #'o () - [(id (field-id ...)) #'id] - [id #'id])]) - (with-syntax ([make-id (datum->syntax id - (string->symbol (format "make-~a" (syntax-e id))) - id)] - [make-id/compat (datum->syntax id - (string->symbol (format "make-~a/compat" (syntax-e id))) - id)]) - #'(combine-out - (except-out (struct-out o) make-id) - (rename-out [make-id/compat make-id]))))] - [(_ struct-out o ...) #'(combine-out (compat**-out struct-out o) ...)])) - -(define-provide-syntax (compat-out stx) - (syntax-case stx () - [(_ . outs) #'(compat**-out struct-out . outs)])) - -(define-provide-syntax (compat*-out stx) - (syntax-case stx () - [(_ . outs) #'(compat**-out struct*-out . outs)])) - -(define-provide-syntax (struct*-out stx) - (syntax-case stx () - [(_ [id (field-id ...)]) - (with-syntax ([id? (datum->syntax #'id - (string->symbol (format "~a?" (syntax-e #'id))) - #'id)] - [struct:id (datum->syntax #'id - (string->symbol (format "struct:~a" (syntax-e #'id))) - #'id)] - [make-id (datum->syntax #'id - (string->symbol (format "make-~a" (syntax-e #'id))) - #'id)] - [(sel-id ...) - (map (lambda (field-id) - (datum->syntax field-id - (string->symbol (format "~a-~a" (syntax-e #'id) (syntax-e field-id))) - field-id)) - (syntax->list #'(field-id ...)))]) - #'(combine-out - id struct:id make-id id? sel-id ...))] - [(_ [id (field-id ...)]...) - #'(combine-out (struct*-out [id (field-id ...)]) ...)])) - -(provide (struct-out collect-info) - (struct-out resolve-info) - tag? block? - - make-flow flow? flow-paragraphs - - (except-out (compat-out part) part-title-content) - (rename-out [part-blocks part-flow] - [part-title-content/compat part-title-content]) - make-versioned-part versioned-part? - make-unnumbered-part unnumbered-part? - - (except-out (compat-out paragraph) paragraph-content) - (rename-out [paragraph-content/compat paragraph-content]) - make-styled-paragraph - (rename-out [paragraph? styled-paragraph?] - [paragraph-style styled-paragraph-style]) - make-omitable-paragraph omitable-paragraph? - - (compat-out table) - table-flowss - make-auxiliary-table auxiliary-table? - - (struct-out delayed-block) - - (compat-out itemization) - (rename-out [itemization-blockss itemization-flows] - [itemization? styled-itemization?] - [itemization-style styled-itemization-style]) - make-styled-itemization - - make-blockquote - - (compat-out compound-paragraph) - - (except-out (compat-out element) element? element-style element-content) - (rename-out [element?/compat element?] - [element-style/compat element-style] - [element-content/compat element-content]) - (except-out (compat*-out [toc-element (toc-content)]) - toc-element-toc-content) - (rename-out [toc-element-toc-content/compat toc-element-toc-content]) - (compat*-out [target-element (tag)] - [toc-target-element ()] - [toc-target2-element (toc-content)]) - (compat*-out [page-target-element ()] - [redirect-target-element (alt-path alt-anchor)] - [link-element (tag)] - [index-element (tag plain-seq entry-seq desc)]) - make-aux-element aux-element? - make-hover-element hover-element? hover-element-text - make-script-element script-element? script-element-type script-element-script - - (struct-out collected-info) - - (struct-out delayed-element) - ; delayed-element-content delayed-block-blocks current-serialize-resolve-info - - (struct-out part-relative-element) - ; part-relative-element-content collect-info-parents - - (struct-out delayed-index-desc) - - (struct*-out [collect-element (collect)]) - - (struct*-out [render-element (render)]) - - (struct-out generated-tag) - ; generate-tag tag-key current-tag-prefixes add-current-tag-prefix - - content->string - (rename-out [content->string element->string] - [content-width element-width]) - ; strip-aux - - block-width - - info-key? part-collected-info collect-put! - resolve-get resolve-get/tentative resolve-get/ext? resolve-search resolve-get-keys) - -(provide-structs - [with-attributes ([style any/c] - [assoc (listof (cons/c symbol? string?))])] - [image-file ([path (or/c path-string? - (cons/c (one-of/c 'collects) - (listof bytes?)))] - [scale real?])] - [target-url ([addr path-string?] [style any/c])]) - -(define (make-flow l) l) -(define (flow? l) (and (list? l) (andmap block? l))) -(define (flow-paragraphs l) l) - -(define (list->content l) - (if (and (pair? l) (null? (cdr l))) - (car l) - l)) - -(define (content->list v) - (if (list? v) - v - (list v))) - -(define (make-part/compat tag-prefix tags title-content orig-style to-collect flow parts) - (make-part tag-prefix - tags - (list->content title-content) - (convert-style orig-style) - to-collect - (flow-paragraphs flow) - parts)) - -(define (part-title-content/compat p) - (list (part-title-content p))) - -(define (make-versioned-part tag-prefix tags title-content orig-style to-collect flow parts version) - (make-part tag-prefix - tags - (list->content title-content) - (let ([s (convert-style orig-style)]) - (make-style (style-name s) - (cons - (make-document-version version) - (style-properties s)))) - to-collect - (flow-paragraphs flow) - parts)) -(define (versioned-part? p) - (and (part? p) (ormap document-version? (style-properties (part-style p))))) - -(define (make-unnumbered-part tag-prefix tags title-content orig-style to-collect flow parts) - (make-part tag-prefix - tags - (list->content title-content) - (let ([s (convert-style orig-style)]) - (make-style (style-name s) - (cons 'unnumbered (style-properties s)))) - to-collect - (flow-paragraphs flow) - parts)) -(define (unnumbered-part? p) - (and (part? p) (memq 'unnumbered (style-properties (part-style p))))) - -(define (make-paragraph/compat content) - (make-paragraph plain (list->content content))) -(define (paragraph-content/compat p) - (content->list (paragraph-content p))) -(define (make-styled-paragraph content style) - (make-paragraph (convert-style style) (list->content content))) - -(define (make-omitable-paragraph content) - (make-paragraph (make-style #f '(omitable)) (list->content content))) -(define (omitable-paragraph? p) - (and (paragraph? p) (memq 'omitable (style-properties (paragraph-style p))))) - -(define (make-table/compat style cellss) - (make-table (convert-style style) - (map (lambda (cells) - (map (lambda (cell) - (cond - [(eq? cell 'cont) 'cont] - [(= 1 (length cell)) (car cell)] - [else (make-nested-flow plain cell)])) - cells)) - cellss))) -(define (table-flowss t) - (map (lambda (row) (map (lambda (c) (make-flow (list c))) row)) - (table-blockss t))) - -(define (make-auxiliary-table style cells) - (let ([t (make-table/compat style cells)]) - (make-table (make-style (style-name (table-style t)) - (cons 'aux - (style-properties (table-style t)))) - (table-blockss t)))) - -(define (auxiliary-table? t) - (ormap (lambda (v) (eq? v 'aux) (style-properties (table-style t))))) - -(define (make-itemization/compat flows) - (make-itemization plain flows)) -(define (make-styled-itemization style flows) - (make-itemization (convert-style style) flows)) - -(define (make-blockquote style blocks) - (make-nested-flow (convert-style (or style 'inset)) blocks)) - -(define (make-compound-paragraph/compat style blocks) - (make-compound-paragraph (convert-style style) blocks)) - -(define (element-style-name s) - (if (style? s) - (style-name s) - s)) -(define (element-style-properties s) - (if (style? s) - (style-properties s) - null)) - -(define (add-element-property v e) - (make-element (make-style (element-style-name (element-style e)) - (cons v - (element-style-properties (element-style e)))) - (element-content e))) -(define (check-element-style e pred) - (ormap pred (style-properties (element-style e)))) - -(define (handle-image-style ctr style . args) - (if (image-file? style) - (make-image-element #f (list (apply ctr #f args)) - (image-file-path style) - null - (image-file-scale style)) - (apply ctr (convert-element-style style) args))) - -(define (convert-element-style style) - (cond - [(not style) style] - [(string? style) style] - [(symbol? style) style] - [else (convert-style style)])) - -(define (element?/compat e) - (or (element? e) (and (list? e) (content? e)))) -(define (element-content/compat e) - (cond - [(element? e) (content->list (element-content e))] - [else e])) -(define (element-style/compat e) - (cond - [(element? e) (element-style e)] - [else #f])) - -(define (make-element/compat style content) - (handle-image-style make-element style (list->content content))) -(define (make-toc-element/compat style content toc-content) - (handle-image-style make-toc-element style (list->content content) (list->content toc-content))) -(define (toc-element-toc-content/compat e) - (content->list (toc-element-toc-content e))) -(define (make-target-element/compat style content tag) - (handle-image-style make-target-element style (list->content content) tag)) -(define (make-toc-target-element/compat style content tag) - (handle-image-style make-toc-target-element style (list->content content) tag)) -(define (make-toc-target2-element/compat style content tag toc-content) - (handle-image-style make-toc-target2-element style (list->content content) tag toc-content)) -(define (make-page-target-element/compat style content tag) - (handle-image-style make-page-target-element style (list->content content) tag)) -(define (make-redirect-target-element/compat style content tag alt-path alt-anchor) - (handle-image-style make-redirect-target-element style (list->content content) tag alt-path alt-anchor)) -(define (make-link-element/compat style content tag) - (handle-image-style make-link-element style (list->content content) tag)) -(define (make-index-element/compat style content tag plain-seq etry-seq desc) - (handle-image-style make-index-element style (list->content content) tag plain-seq etry-seq desc)) - -(define (make-aux-element style content) - (add-element-property 'aux (make-element/compat style content))) -(define (aux-element? e) - (check-element-style e (lambda (v) (eq? v 'aux)))) - -(define (make-hover-element style content text) - (add-element-property (make-hover-property text) - (make-element/compat style content))) -(define (hover-element? e) - (check-element-style e hover-property?)) -(define (hover-element-text e) - (ormap (lambda (v) - (and (hover-property? v) (hover-property-text e))) - (style-properties (element-style e)))) - -(define (make-script-element style content type script) - (add-element-property (make-script-property type script) - (make-element/compat style content))) -(define (script-element? e) - (check-element-style e script-property?)) -(define (script-element-type e) - (ormap (lambda (v) - (and (script-property? v) (script-property-type e))) - (style-properties (element-style e)))) -(define (script-element-script e) - (ormap (lambda (v) - (and (script-property? v) (script-property-script e))) - (style-properties (element-style e)))) - -;; ---------------------------------------- - -(define (convert-style s) - (cond - [(not s) plain] - [(style? s) s] - [(string? s) (make-style s null)] - [(symbol? s) (make-style s null)] - [(and (list? s) (andmap symbol? s)) (make-style #f s)] - [(with-attributes? s) (let* ([wa (flatten-style s)] - [s (convert-style (with-attributes-style wa))]) - (make-style (style-name s) - (cons - (make-attributes (with-attributes-assoc wa)) - (style-properties s))))] - [(target-url? s) (let ([s (convert-style (target-url-style s))]) - (make-style (style-name s) - (cons - (core:make-target-url (target-url-addr s)) - (style-properties s))))] - [(image-file? s) (make-style #f null)] - [(and (list? s) (pair? s) (eq? (car s) 'color)) - (make-style #f (list (make-color-property - (if (string? (cadr s)) (cadr s) (cdr s)))))] - [(and (list? s) (pair? s) (eq? (car s) 'bg-color)) - (make-style #f (list (make-background-color-property - (if (string? (cadr s)) (cadr s) (cdr s)))))] - [(and (pair? s) - (list? s) - (andmap (lambda (v) (and (pair? v) - (memq (car v) '(alignment valignment row-styles style)))) - s)) - (let ([gen-columns (lambda (sn a va) - (map (lambda (sn a va) - (make-style sn - (append (if a (list a) null) - (if va (list va) null)))) - (cdr (or sn (map (lambda (x) #f) (or va a)))) - (cdr (or a (map (lambda (x) #f) (or va sn)))) - (cdr (or va (map (lambda (x) #f) (or a sn))))))]) - (make-style (let ([s (assq 'style s)]) - (and s (cadr s))) - (let ([a (assq 'alignment s)] - [va (assq 'valignment s)]) - (if (or a va) - (list (make-table-columns (gen-columns #f a va))) - (let ([l (cdr (assq 'row-styles s))]) - (list - (make-table-cells - (map (lambda (row) - (let ([sn (assq 'style row)] - [a (assq 'alignment row)] - [va (assq 'valignment row)]) - (if (or sn a va) - (gen-columns sn a va) - (error 'convert-style "no row style found")))) - l))))))))] - [else (error 'convert-style "unrecognized style: ~e" s)])) - -(define (flatten-style s) - (cond - [(with-attributes? s) - (let ([rest (flatten-style (with-attributes-style s))]) - (if (with-attributes? rest) - ;; collapse nested with-attributes - (make-with-attributes - (with-attributes-style rest) - (append (with-attributes-assoc s) - (with-attributes-assoc rest))) - ;; rebuild with flattened inner: - (make-with-attributes - rest - (with-attributes-assoc s))))] - [(target-url? s) - (let ([rest (flatten-style (target-url-style s))]) - (if (with-attributes? rest) - ;; lift nested attributes out: - (make-with-attributes - (make-target-url - (target-url-addr s) - (with-attributes-style rest)) - (with-attributes-assoc rest)) - ;; rebuild with flattened inner: - (make-target-url - (target-url-addr s) - rest)))] - [else s])) diff --git a/scribble-lib/scribble/tag.rkt b/scribble-lib/scribble/tag.rkt deleted file mode 100644 index 3d2c4eef..00000000 --- a/scribble-lib/scribble/tag.rkt +++ /dev/null @@ -1,132 +0,0 @@ -#lang racket/base -(require racket/contract/base - syntax/modcollapse - setup/collects - scribble/core - racket/match - ;; Needed to normalize planet version numbers: - (only-in planet/resolver get-planet-module-path/pkg) - (only-in planet/private/data pkg-maj pkg-min)) - -(provide - (contract-out - [make-section-tag ((string?) - (#:doc (or/c #f module-path?) - #:tag-prefixes (or/c #f (listof string?))) - . ->* . - tag?)] - [make-module-language-tag (-> symbol? tag?)] - [taglet? (any/c . -> . boolean?)] - [module-path-prefix->string (module-path? . -> . string?)] - [module-path-index->taglet (module-path-index? . -> . taglet?)] - [intern-taglet (any/c . -> . any/c)] - [doc-prefix (case-> - ((or/c #f module-path?) taglet? . -> . taglet?) - ((or/c #f module-path?) (or/c #f (listof string?)) taglet? . -> . taglet?))] - [definition-tag->class/interface-tag (-> definition-tag? class/interface-tag?)] - [class/interface-tag->constructor-tag (-> class/interface-tag? constructor-tag?)] - [get-class/interface-and-method (-> method-tag? (values symbol? symbol?))] - [definition-tag? (-> any/c boolean?)] - [class/interface-tag? (-> any/c boolean?)] - [method-tag? (-> any/c boolean?)] - [constructor-tag? (-> any/c boolean?)])) - - -(define (make-section-tag s #:doc [doc #f] #:tag-prefixes [prefix #f]) - `(part ,(doc-prefix doc prefix s))) - -(define (make-module-language-tag langname) - `(mod-path ,(symbol->string langname))) - -(define (taglet? v) - (and (not (generated-tag? v)) - (tag? (list 'something (list v))))) - -(define interned (make-weak-hash)) - -(define (intern-taglet v) - (let ([v (if (list? v) - (map intern-taglet v) - (datum-intern-literal v))]) - (if (or (string? v) - (bytes? v) - (list? v)) - (let ([b (hash-ref interned v #f)]) - (if b - (or (weak-box-value b) - ;; just in case the value is GCed before we extract it: - (intern-taglet v)) - (begin - (hash-set! interned v (make-weak-box v)) - v))) - v))) - -(define (do-module-path-index->taglet mod) - ;; Derive the name from the module path: - (let ([p (collapse-module-path-index - mod - (lambda () (build-path (current-directory) "dummy")))]) - (if (path? p) - ;; If we got a path back anyway, then it's best to use the resolved - ;; name; if the current directory has changed since we - ;; the path-index was resolved, then p might not be right. Also, - ;; the resolved path might be a symbol instead of a path. - (let ([rp (resolved-module-path-name - (module-path-index-resolve mod))]) - (if (path? rp) - (intern-taglet - (path->collects-relative rp)) - rp)) - (let ([p (if (and (pair? p) - (eq? (car p) 'planet)) - ;; Normalize planet verion number based on current - ;; linking: - (let-values ([(path pkg) - (get-planet-module-path/pkg p #f #f)]) - (list* 'planet - (cadr p) - (list (car (caddr p)) - (cadr (caddr p)) - (pkg-maj pkg) - (pkg-min pkg)) - (cdddr p))) - ;; Otherwise the path is fully normalized: - p)]) - (intern-taglet p))))) - -(define collapsed (make-weak-hasheq)) -(define (module-path-index->taglet mod) - (or (hash-ref collapsed mod #f) - (let ([v (do-module-path-index->taglet mod)]) - (hash-set! collapsed mod v) - v))) - -(define (module-path-prefix->string p) - (datum-intern-literal - (format "~a" (module-path-index->taglet (module-path-index-join p #f))))) - -(define doc-prefix - (case-lambda - [(doc s) - (if doc - (if (list? s) - (cons (module-path-prefix->string doc) s) - (list (module-path-prefix->string doc) s)) - s)] - [(doc prefix s) - (doc-prefix doc (if prefix - (append prefix (if (list? s) - s - (list s))) - s))])) - -(define (definition-tag->class/interface-tag t) (cons 'class/intf (cdr t))) -(define (class/interface-tag->constructor-tag t) (cons 'constructor (cdr t))) -(define (get-class/interface-and-method meth-tag) - (match meth-tag - [`(meth ((,_ ,class/interface) ,method)) - (values class/interface method)])) -(define (definition-tag? x) (and (tag? x) (equal? (car x) 'def))) -(define (class/interface-tag? x) (and (tag? x) (equal? (car x) 'class/intf))) -(define (method-tag? x) (and (tag? x) (equal? (car x) 'meth))) -(define (constructor-tag? x) (and (tag? x) (equal? (car x) 'constructor))) diff --git a/scribble-lib/scribble/text-render.rkt b/scribble-lib/scribble/text-render.rkt deleted file mode 100644 index 45686e6a..00000000 --- a/scribble-lib/scribble/text-render.rkt +++ /dev/null @@ -1,305 +0,0 @@ -#lang racket/base -(require "core.rkt" - "base-render.rkt" - "private/render-utils.rkt" - racket/class racket/port racket/list racket/string - scribble/text/wrap) -(provide render-mixin) - -(define current-preserve-spaces (make-parameter #f)) - -(define current-indent (make-parameter 0)) -(define (make-indent amt) - (+ amt (current-indent))) -(define (indent) - (define i (current-indent)) - (unless (zero? i) (display (make-string i #\space)))) -(define (indented-newline) - (newline) - (indent)) - -(define render-mixin - (mixin (render<%>) () - - (define/override (current-render-mode) - '(text)) - - (define/override (get-substitutions) - '((#rx"---" "\U2014") - (#rx"--" "\U2013") - (#rx"``" "\U201C") - (#rx"''" "\U201D") - (#rx"'" "\U2019"))) - - (inherit render-block - format-number) - - (define/override (render-part d ht) - (let ([number (collected-info-number (part-collected-info d ht))]) - (unless (part-style? d 'hidden) - (let ([s (format-number number '() #t)]) - (unless (null? s) - (printf "~a~a" - (car s) - (if (part-title-content d) - " " - ""))) - (when (part-title-content d) - (render-content (part-title-content d) d ht)) - (when (or (pair? number) (part-title-content d)) - (newline) - (newline)))) - (render-flow (part-blocks d) d ht #f) - (let loop ([pos 1] - [secs (part-parts d)] - [need-newline? (pair? (part-blocks d))]) - (unless (null? secs) - (when need-newline? (newline)) - (render-part (car secs) ht) - (loop (add1 pos) (cdr secs) #t))))) - - (define/override (render-flow f part ht starting-item?) - (if (null? f) - null - (append* - (render-block (car f) part ht starting-item?) - (for/list ([p (in-list (cdr f))]) - (indented-newline) - (render-block p part ht #f))))) - - (define/override (render-intrapara-block p part ri first? last? starting-item?) - (unless first? (indented-newline)) - (super render-intrapara-block p part ri first? last? starting-item?)) - - (define/override (render-table i part ht inline?) - (define flowss (table-blockss i)) - (if (null? flowss) - null - (let* ([strs (map (lambda (flows) - (map (lambda (d) - (if (eq? d 'cont) - d - (let ([o (open-output-string)]) - (parameterize ([current-indent 0] - [current-output-port o]) - (render-block d part ht #f)) - (regexp-split - #rx"\n" - (regexp-replace #rx"\n$" (get-output-string o) ""))))) - flows)) - flowss)] - [extract-align - (lambda (s) - (define p (style-properties s)) - (cond - [(member 'right p) 'right] - [(member 'center p) 'center] - [else 'left]))] - [alignss - (cond - [(ormap (lambda (v) (and (table-cells? v) v)) (style-properties (table-style i))) - => (lambda (tc) - (for/list ([l (in-list (table-cells-styless tc))]) - (for/list ([s (in-list l)]) - (extract-align s))))] - [(ormap (lambda (v) (and (table-columns? v) v)) (style-properties (table-style i))) - => (lambda (tc) - (make-list - (length flowss) - (for/list ([s (in-list (table-columns-styles tc))]) - (extract-align s))))] - [else - (if (null? flowss) - null - (make-list (length flowss) (make-list (length (car flowss)) 'left)))])] - [extract-border - (lambda (s) - (define p (style-properties s)) - (cond - [(memq 'border p) '#(#t #t #t #t)] - [else - (vector (memq 'left-border p) (memq 'right-border p) - (memq 'top-border p) (memq 'bottom-border p))]))] - [borderss - ;; A border is (vector left? right? top? bottom?) - (cond - [(ormap (lambda (v) (and (table-cells? v) v)) (style-properties (table-style i))) - => (lambda (tc) - (for/list ([l (in-list (table-cells-styless tc))]) - (for/list ([s (in-list l)]) - (extract-border s))))] - [(ormap (lambda (v) (and (table-columns? v) v)) (style-properties (table-style i))) - => (lambda (tc) - (make-list - (length flowss) - (for/list ([s (in-list (table-columns-styles tc))]) - (extract-border s))))] - [else - (if (null? flowss) - null - (make-list (length flowss) (make-list (length (car flowss)) '#(#f #f #f #f))))])] - [border-left? (lambda (v) (vector-ref v 0))] - [border-right? (lambda (v) (vector-ref v 1))] - [border-top? (lambda (v) (vector-ref v 2))] - [border-bottom? (lambda (v) (vector-ref v 3))] - [col-borders ; has only left and right - (for/list ([i (in-range (length (car borderss)))]) - (for/fold ([v '#(#f #f)]) ([borders (in-list borderss)]) - (define v2 (list-ref borders i)) - (vector (or (border-left? v) (border-left? v2)) - (or (border-right? v) (border-right? v2)))))] - [widths (map (lambda (col) - (for/fold ([d 0]) ([i (in-list col)]) - (if (eq? i 'cont) - d - (apply max d (map string-length i))))) - (apply map list strs))] - [x-length (lambda (col) (if (eq? col 'cont) 0 (length col)))]) - - (define (show-row-border prev-borders borders) - (when (for/or ([prev-border (in-list prev-borders)] - [border (in-list borders)]) - (or (border-bottom? prev-border) - (border-top? border))) - (define-values (end-h-border? end-v-border?) - (for/fold ([left-border? #f] - [prev-border? #f]) - ([w (in-list widths)] - [prev-border (in-list prev-borders)] - [border (in-list borders)] - [col-border (in-list col-borders)]) - (define border? (or (and prev-border (border-bottom? prev-border)) - (border-top? border))) - (when (or left-border? (border-left? col-border)) - (display (if (or prev-border? border?) "-" " "))) - (display (make-string w (if border? #\- #\space))) - (values (border-right? col-border) border?))) - (when end-h-border? - (display (if end-v-border? "-" " "))) - (newline))) - - (define-values (last-indent? last-borders) - (for/fold ([indent? #f] [prev-borders #f]) ([row (in-list strs)] - [aligns (in-list alignss)] - [borders (in-list borderss)]) - (values - (let ([h (apply max 0 (map x-length row))]) - (let ([row* (for/list ([i (in-range h)]) - (for/list ([col (in-list row)]) - (if (i . < . (x-length col)) - (list-ref col i) - (if (eq? col 'cont) - 'cont - ""))))]) - (for/fold ([indent? indent?]) ([sub-row (in-list row*)] - [pos (in-naturals)]) - (when indent? (indent)) - - (when (zero? pos) - (show-row-border (or prev-borders (map (lambda (b) '#(#f #f #f #f)) borders)) - borders)) - - (define-values (end-border? end-col-border?) - (for/fold ([left-border? #f] [left-col-border? #f]) - ([col (in-list sub-row)] - [w (in-list widths)] - [align (in-list aligns)] - [border (in-list borders)] - [col-border (in-list col-borders)]) - (when (or left-col-border? (border-left? col-border)) - (display (if (and (or left-border? (border-left? border)) - (not (eq? col 'cont))) - "|" - " "))) - (let ([col (if (eq? col 'cont) "" col)]) - (define gap (max 0 (- w (string-length col)))) - (case align - [(right) (display (make-string gap #\space))] - [(center) (display (make-string (quotient gap 2) #\space))]) - (display col) - (case align - [(left) (display (make-string gap #\space))] - [(center) (display (make-string (- gap (quotient gap 2)) #\space))])) - (values (border-right? border) - (border-right? col-border)))) - (when end-col-border? - (display (if end-border? "|" " "))) - (newline) - #t))) - borders))) - - (show-row-border last-borders (map (lambda (b) '#(#f #f #f #f)) last-borders)) - - null))) - - (define/override (render-itemization i part ht) - (let ([flows (itemization-blockss i)]) - (if (null? flows) - null - (append* - (begin (printf "* ") - (parameterize ([current-indent (make-indent 2)]) - (render-flow (car flows) part ht #t))) - (for/list ([d (in-list (cdr flows))]) - (indented-newline) - (printf "* ") - (parameterize ([current-indent (make-indent 2)]) - (render-flow d part ht #f))))))) - - (define/override (render-paragraph p part ri) - (define o (open-output-string)) - (parameterize ([current-output-port o]) - (super render-paragraph p part ri)) - (define to-wrap (regexp-replace* #rx"\n" (get-output-string o) " ")) - (define lines (wrap-line (string-trim to-wrap) (- 72 (current-indent)))) - (write-string (car lines)) - (for ([line (in-list (cdr lines))]) - (newline) (indent) (write-string line)) - (newline) - null) - - (define/override (render-content i part ri) - (if (and (element? i) - (let ([s (element-style i)]) - (or (eq? 'hspace s) - (and (style? s) - (eq? 'hspace (style-name s)))))) - (parameterize ([current-preserve-spaces #t]) - (super render-content i part ri)) - (super render-content i part ri))) - - (define/override (render-nested-flow i part ri starting-item?) - (define s (nested-flow-style i)) - (unless (memq 'decorative (style-properties s)) - (if (and s (or (eq? (style-name s) 'inset) - (eq? (style-name s) 'code-inset))) - (begin (printf " ") - (parameterize ([current-indent (make-indent 2)]) - (super render-nested-flow i part ri starting-item?))) - (super render-nested-flow i part ri starting-item?)))) - - (define/override (render-other i part ht) - (cond - [(symbol? i) - (display (case i - [(mdash) "\U2014"] - [(ndash) "\U2013"] - [(ldquo) "\U201C"] - [(rdquo) "\U201D"] - [(lsquo) "\U2018"] - [(rsquo) "\U2019"] - [(lang) ">"] - [(rang) "<"] - [(rarr) "->"] - [(nbsp) "\uA0"] - [(prime) "'"] - [(alpha) "\u03B1"] - [(infin) "\u221E"] - [else (error 'text-render "unknown element symbol: ~e" i)]))] - [(string? i) (if (current-preserve-spaces) - (display (regexp-replace* #rx" " i "\uA0")) - (display i))] - [else (write i)]) - null) - - (super-new))) diff --git a/scribble-lib/scribble/urls.rkt b/scribble-lib/scribble/urls.rkt deleted file mode 100644 index c680cbce..00000000 --- a/scribble-lib/scribble/urls.rkt +++ /dev/null @@ -1,10 +0,0 @@ -#lang racket/base - -(provide (all-defined-out) - (rename-out [url:drracket url:drscheme] - [url:download-drracket url:download-drscheme])) - -(define url:drracket "http://racket-lang.org/") -(define url:download-drracket "http://download.racket-lang.org/") - -(define url:planet "http://planet.racket-lang.org/") diff --git a/scribble-lib/scribble/valid-blueboxes-info.rkt b/scribble-lib/scribble/valid-blueboxes-info.rkt deleted file mode 100644 index 7b657e0d..00000000 --- a/scribble-lib/scribble/valid-blueboxes-info.rkt +++ /dev/null @@ -1,14 +0,0 @@ -#lang racket/base - -(provide valid-blueboxes-info?) - -(require scribble/core racket/contract/base) - -(define valid-blueboxes-info? - (hash/c - tag? - (listof (cons/dc [hd exact-nonnegative-integer?] - [tl (hd) (and/c exact-nonnegative-integer? - (>/c hd))] - #:flat)) - #:flat? #t)) diff --git a/scribble-lib/scribble/xref.rkt b/scribble-lib/scribble/xref.rkt deleted file mode 100644 index 333333d9..00000000 --- a/scribble-lib/scribble/xref.rkt +++ /dev/null @@ -1,173 +0,0 @@ -#lang scheme/base - -(require scribble/struct - (only-in scribble/core known-doc? known-doc-v) - scribble/base-render - scribble/search - (prefix-in html: scribble/html-render) - scheme/class - scheme/path) - -(provide load-xref - xref? - xref-render - xref-index - xref-binding->definition-tag - xref-tag->path+anchor - xref-tag->index-entry - xref-transfer-info - (struct-out entry) - make-data+root - data+root? - make-data+root+doc-id - data+root+doc-id?) - -(define-struct entry - (words ; list of strings: main term, sub-term, etc. - content ; Scribble content to the index label - tag ; for generating a Scribble link - desc)) ; further info that depends on the kind of index entry - -(define-struct data+root (data root)) -(define-struct (data+root+doc-id data+root) (doc-id)) - -;; Private: -(define-struct xrefs (renderer ri)) - -(define (xref? x) (xrefs? x)) - -;; ---------------------------------------- -;; Xref loading - -(define-namespace-anchor here) - -(define (load-xref sources - #:demand-source [demand-source (lambda (key) #f)] - #:render% [render% (html:render-mixin render%)] - #:root [root-path #f] - #:doc-id [doc-id-str #f]) - (let* ([renderer (new render% [dest-dir (find-system-path 'temp-dir)])] - [fp (send renderer traverse null null)] - [load-source (lambda (src ci) - (parameterize ([current-namespace - (namespace-anchor->empty-namespace here)]) - (let ([vs (src)]) - (for ([v (in-list (if (procedure? vs) (vs) (list vs)))]) - (when v - (define data (if (data+root? v) (data+root-data v) v)) - (define root (if (data+root? v) (data+root-root v) root-path)) - (define doc-id (or (and (data+root+doc-id? v) (data+root+doc-id-doc-id v)) - doc-id-str)) - (send renderer deserialize-info data ci - #:root root - #:doc-id doc-id))))))] - [ci (send renderer collect null null fp - (lambda (key ci) - (define src (demand-source key)) - (and src - (load-source src ci))))]) - (for ([src sources]) - (load-source src ci)) - (make-xrefs renderer (send renderer resolve null null ci)))) - -;; ---------------------------------------- -;; Xref reading - -(define (xref-index xrefs) - (define ci (resolve-info-ci (xrefs-ri xrefs))) - ;; Force all xref info: - ((collect-info-ext-demand ci) #f ci) - ;; look for `index-entry' keys: - (for/list ([(k v) (in-hash (collect-info-ext-ht ci))] - #:when - (and (pair? k) - (eq? (car k) 'index-entry))) - (let ([v (if (known-doc? v) - (known-doc-v v) - v)]) - (make-entry (car v) (cadr v) (cadr k) (caddr v))))) - -;; dest-file can be #f, which will make it return a string holding the -;; resulting html -(define (xref-render xrefs doc dest-file - #:render% [render% (html:render-mixin render%)] - #:refer-to-existing-files? [use-existing? (not dest-file)]) - (let* ([dest-file (if (string? dest-file) (string->path dest-file) dest-file)] - [renderer (new render% - [dest-dir (and dest-file (path-only dest-file))] - [refer-to-existing-files use-existing?] - [css-path 'inline] - [script-path 'inline])] - [ci (send renderer collect (list doc) (list dest-file))] - [_ (send renderer transfer-info ci (resolve-info-ci (xrefs-ri xrefs)))] - [ri (send renderer resolve (list doc) (list dest-file) ci)] - [xs (send renderer render (list doc) (list dest-file) ri)]) - (if dest-file - (void) - (car xs)))) - -(define (xref-transfer-info renderer ci xrefs) - (send renderer transfer-info ci (resolve-info-ci (xrefs-ri xrefs)))) - -;; Returns (values ) -(define xref-binding-tag - (case-lambda - [(xrefs id/binding mode) - (let ([search - (lambda (id/binding) - (let ([tag (find-scheme-tag #f (xrefs-ri xrefs) id/binding mode)]) - (if tag - (values tag (eq? (car tag) 'form)) - (values #f #f))))]) - (cond - [(identifier? id/binding) - (search id/binding)] - [(and (list? id/binding) - (= 7 (length id/binding))) - (search id/binding)] - [(and (list? id/binding) - (= 2 (length id/binding))) - (let loop ([src (car id/binding)]) - (cond - [(module-path-index? src) - (search (list src (cadr id/binding)))] - [(module-path? src) - (loop (module-path-index-join src #f))] - [else - (raise-argument-error 'xref-binding-definition->tag - "(list/c (or/c module-path? module-path-index?) any/c)" - id/binding)]))] - [else (raise-argument-error 'xref-binding-definition->tag - (string-append - "(or/c identifier? (lambda (l)\n" - " (and (list? l)\n" - " (or (= (length l) 2)\n" - " (= (length l) 7)))))") - id/binding)]))])) - -(define (xref-binding->definition-tag xrefs id/binding mode) - (let-values ([(tag form?) (xref-binding-tag xrefs id/binding mode)]) - tag)) - -(define (xref-tag->path+anchor xrefs tag - #:render% [render% (html:render-mixin render%)] - #:external-root-url [redirect-main #f]) - (send (let ([r (new render% [dest-dir (find-system-path 'temp-dir)])]) - (when redirect-main - (send r set-external-root-url redirect-main)) - r) - tag->path+anchor (xrefs-ri xrefs) tag)) - -(define (xref-tag->index-entry xrefs tag) - (let ([v (hash-ref - (collect-info-ext-ht (resolve-info-ci (xrefs-ri xrefs))) - `(index-entry ,tag) - #f)]) - (let ([v (if (known-doc? v) - (known-doc-v v) - v)]) - (cond [v (make-entry (car v) (cadr v) (cadr tag) (caddr v))] - [(and (pair? tag) (eq? 'form (car tag))) - ;; Try again with 'def: - (xref-tag->index-entry xrefs (cons 'def (cdr tag)))] - [else #f])))) diff --git a/scribble-lib/scriblib/autobib.css b/scribble-lib/scriblib/autobib.css deleted file mode 100644 index 8a083029..00000000 --- a/scribble-lib/scriblib/autobib.css +++ /dev/null @@ -1,9 +0,0 @@ - -.AutoBibliography p { - padding-left: 1em; - text-indent: -1em; -} - -.AutoBibliography td { - vertical-align: text-top; -} diff --git a/scribble-lib/scriblib/autobib.rkt b/scribble-lib/scriblib/autobib.rkt deleted file mode 100644 index 30bbad6e..00000000 --- a/scribble-lib/scriblib/autobib.rkt +++ /dev/null @@ -1,608 +0,0 @@ -#lang at-exp racket/base -(require scribble/manual - racket/list - racket/date - racket/class - scribble/core - scribble/decode - scribble/html-properties - scribble/latex-properties - (for-syntax syntax/parse - racket/base) - scheme/string - setup/main-collects - racket/contract) - -(provide define-cite - author+date-style number-style - make-bib in-bib (rename-out [auto-bib? bib?]) - proceedings-location journal-location book-location - techrpt-location dissertation-location - author-name org-author-name - (contract-out - [authors (->* (content?) #:rest (listof content?) element?)]) - other-authors - editor - abbreviate-given-names) - -(define abbreviate-given-names (make-parameter #f)) - -(define autobib-style-extras - (let ([abs (lambda (s) - (path->main-collects-relative - (collection-file-path s "scriblib")))]) - (list - (make-css-addition (abs "autobib.css")) - (make-tex-addition (abs "autobib.tex"))))) - -(define bib-single-style (make-style "AutoBibliography" autobib-style-extras)) -(define bib-columns-style (make-style #f autobib-style-extras)) - -(define bibentry-style (make-style "Autobibentry" autobib-style-extras)) -(define colbibnumber-style (make-style "Autocolbibnumber" autobib-style-extras)) -(define colbibentry-style (make-style "Autocolbibentry" autobib-style-extras)) - -(define-struct auto-bib (author date title location url note is-book? key specific)) -(define-struct bib-group (ht)) - -(define-struct (author-element element) (names cite)) -(define-struct (other-author-element author-element) ()) - -(define (author-element-names* x) - (and x (author-element-names x))) - -;; render the use of a citation. -(define (add-cite group bib-entry which with-specific? disambiguation style) - (let ([key (auto-bib-key bib-entry)]) - (when disambiguation - (for ([bib disambiguation]) - (hash-set! (bib-group-ht group) (auto-bib-key bib) bib))) - (hash-set! (bib-group-ht group) key bib-entry) - (make-delayed-element - (lambda (renderer part ri) - ;; (list which key) should be mapped to the bibliography element. - (define s (resolve-get part ri `(,which ,key))) - (make-link-element #f - (list (or s "???") - (cond [(not (send style disambiguate-date?)) '()] - [disambiguation ;; should be a list of bib-entries with same author/date - (define disambiguation* - (add-between (for/list ([bib (in-list disambiguation)]) - (define key (auto-bib-key bib)) - (define maybe-disambiguation - (resolve-get part ri `(autobib-disambiguation ,key))) - (case maybe-disambiguation - [(#f) #f] - [(unambiguous) #f] - [else (make-link-element #f maybe-disambiguation `(autobib ,key))])) - ",")) - (cond [(not (car disambiguation*)) '()] ;; the bib was unambiguous - [else disambiguation*])] - [else '()]) - (if with-specific? - (auto-bib-specific bib-entry) - "")) - `(autobib ,(auto-bib-key bib-entry)))) - (lambda () "(???)") - (lambda () "(???)")))) - -(define (add-date-cites group bib-entries delimiter style sort? maybe-datestring (date-year date))))) -(define (default-render-date-cite date) - (make-element #f (list (number->string (date-year date))))) -(define (default-date a, 1 -> b, etc. -(define (default-disambiguation n) - (when (>= n 26) - (error 'default-disambiguation "Citations too ambiguous for default disambiguation scheme.")) - (make-element #f (list (format "~a" (integer->char (+ 97 n)))))) - -(define author+date-style - (new - (class object% - (define/public (bibliography-table-style) bib-single-style) - (define/public (entry-style) bibentry-style) - (define/public (disambiguate-date?) #t) - (define/public (collapse-for-date?) #t) - (define/public (get-cite-open) "(") - (define/public (get-cite-close) ")") - (define/public (get-group-sep) "; ") - (define/public (get-item-sep) ", ") - (define/public (render-citation date-cite i) date-cite) - (define/public (render-author+dates author dates) (list* author " " dates)) - (define/public (bibliography-line i e) (list e)) - (super-new)))) - -(define number-style - (new - (class object% - (define/public (bibliography-table-style) bib-columns-style) - (define/public (entry-style) colbibentry-style) - (define/public (disambiguate-date?) #f) - (define/public (collapse-for-date?) #f) - (define/public (get-cite-open) "[") - (define/public (get-cite-close) "]") - (define/public (get-group-sep) ", ") - (define/public (get-item-sep) ", ") - (define/public (render-citation date-cite i) (number->string i)) - (define/public (render-author+dates author dates) dates) - (define/public (bibliography-line i e) - (list (make-paragraph plain - (make-element colbibnumber-style (list "[" (number->string i) "]"))) - e)) - (super-new)))) - -(define (gen-bib tag group sec-title - style maybe-disambiguator - maybe-render-date-bib maybe-render-date-cite - maybe-datepara bib disambiguation i) - (define collect-target - (list (make-target-element - #f - (bib->entry bib style disambiguation render-date-bib i) - `(autobib ,(auto-bib-key bib))))) - ;; Communicate to scribble's resolve step. - (define (collect ci) - ;; store the author - (collect-put! ci - `(autobib-author ,(auto-bib-key bib)) ;; (list which key) - (make-element - #f - (list (author-element-cite (extract-bib-author bib))))) - ;; store the date - (when (auto-bib-date bib) - (collect-put! ci - `(autobib-date ,(auto-bib-key bib)) ;; (list which key) - (make-element #f (list - (send style - render-citation - (render-date-cite (auto-bib-date bib)) - i))))) - ;; store how to disambiguate it from other like citations. - (collect-put! ci - `(autobib-disambiguation ,(auto-bib-key bib)) - (or disambiguation 'unambiguous))) - (send style - bibliography-line - i - (make-paragraph plain - (list (make-collect-element #f collect-target collect))))) - ;; create the bibliography with disambiguations added. - (define-values (last num-ambiguous rev-disambiguated*) - (for/fold ([last #f] [num-ambiguous 0] [rev-disambiguated '()]) ([bib (in-list bibs)] - [i (in-naturals 1)]) - (define ambiguous?? (and (send style disambiguate-date?) - last - (ambiguous? last bib))) - (define num-ambiguous* - (cond [ambiguous?? (add1 num-ambiguous)] - [else 0])) - ;; the current entry is ambiguous with the last. Modify the last - ;; to have the first disambiguation. - (define rev-disambiguated* - (cond [(and ambiguous?? (= 0 num-ambiguous)) - (cons (bib->para last (disambiguator num-ambiguous) i) - (cdr rev-disambiguated))] - [else rev-disambiguated])) - (define para* - (bib->para bib (and ambiguous?? (disambiguator num-ambiguous*)) i)) - (values bib num-ambiguous* (cons para* rev-disambiguated*)))) - (reverse rev-disambiguated*))) - - (define (make-space) - (list - (make-paragraph (make-style #f '()) '("")) - (make-paragraph (make-style #f '()) '("")))) - - (make-part #f - `((part ,tag)) - (list sec-title) - (make-style #f '(unnumbered)) - null - (list (make-table (send style bibliography-table-style) - (add-between #:splice? #t - disambiguated - (for/list ([i (in-range 1 spaces)]) - (make-space))))) - null)) - -(define (bib->entry bib style disambiguation render-date-bib i) - (define-values (author date title location url note is-book?) - (values (auto-bib-author bib) - (auto-bib-date bib) - (auto-bib-title bib) - (auto-bib-location bib) - (auto-bib-url bib) - (auto-bib-note bib) - (auto-bib-is-book? bib))) - (make-element (send style entry-style) - (append - (if author - `(,author - ,@(if (ends-in-punc? author) - '(" ") - '(". "))) - null) - ;; (if is-book? null '(ldquo)) - (if is-book? - (list (italic title)) - (decode-content (list title))) - (if (ends-in-punc? title) - null - '(".")) - ;; (if is-book? null '(rdquo)) - (if location - `(" " ,@(decode-content (list location)) ,(if date "," ".")) - null) - (if date `(" " - ,@(if disambiguation - `(,@(decode-content (list (render-date-bib date))) ,disambiguation) - (decode-content (list (render-date-bib date)))) - ".") - null) - (if url `(" " ,(link url (make-element 'url (list url)))) null) - (if note `(" " ,note) null)))) - -(define-syntax (define-cite stx) - (syntax-parse stx - [(_ (~var ~cite) citet generate-bibliography - (~or (~optional (~seq #:style style) #:defaults ([style #'author+date-style])) - (~optional (~seq #:disambiguate fn) #:defaults ([fn #'#f])) - (~optional (~seq #:render-date-in-bib render-date-bib) #:defaults ([render-date-bib #'#f])) - (~optional (~seq #:spaces spaces) #:defaults ([spaces #'1])) - (~optional (~seq #:render-date-in-cite render-date-cite) #:defaults ([render-date-cite #'#f])) - (~optional (~seq #:datestring e))) - -(define (understand-date inp) - ;; Currently there is no string->date function. - ;; Common usage of autobib has assumed that this should be the year. - (cond [(or (string? inp) (number? inp)) - (define year - (cond [(string? inp) (string->number inp)] - [else inp])) - (date 0 0 0 1 1 ;; second/minute/hour/day/month - year - ;; week-day/year-day/daylight savings time?/timezone offset - 0 0 #f 0)] - [(date? inp) inp] - [(not inp) #f] ;; no date is fine too. - [else (error 'make-bib "Not given a value that represents a date.")])) - -;; We delay making the element for the bib-entry because we may need to add -;; disambiguations during gen-bib. -(define (make-bib #:title title - #:author [author #f] - #:is-book? [is-book? #f] - #:location [location #f] - #:date [date #f] - #:url [url #f] - #:note [note #f]) - (define author* - (cond [(not author) #f] - [(author-element? author) author] - [else (parse-author author)])) - (define parsed-date (understand-date date)) - (make-auto-bib author* parsed-date title location url note is-book? - (content->string - (make-element #f - (append - (if author* (list author*) null) - (list title) - (if location (decode-content (list location)) null) - (if date (decode-content (list (default-render-date-bib parsed-date))) null) - (if url (list (link url (make-element 'url (list url)))) null) - (if note (list note) null)))) - "")) - -(define (in-bib bib where) - (make-auto-bib - (auto-bib-author bib) - (auto-bib-date bib) - (auto-bib-title bib) - (auto-bib-location bib) - (auto-bib-url bib) - (auto-bib-note bib) - (auto-bib-is-book? bib) - (auto-bib-key bib) - ;; "where" is the only specific part of auto-bib elements currently. - (string-append (auto-bib-specific bib) where))) - -(define (parse-author a) - (cond [(author-element? a) a] - [else - (define s (content->string a)) ;; plain text rendering - (define m (regexp-match #px"^(.*) (([\\-]|\\p{L})+)$" s)) - (define given-names (and m (cadr m))) - (define family-name (and m (caddr m))) - (define names - (cond [m (string-append family-name " " given-names)] - [else s])) - (define cite - (cond [m (caddr m)] - [else s])) - (define element-content - (cond - [(and given-names (abbreviate-given-names)) - (string-append (given-names->initials given-names) family-name)] - [else a])) - (make-author-element #f (list element-content) names cite)])) - -(define (given-names->initials str) - (regexp-replace* #rx"(.)[^ ]*( |$)" str "\\1. ")) - -(module+ test - (require rackunit) - (check-equal? (given-names->initials "Matthew") "M. ") - (check-equal? (given-names->initials "Matthew R.") "M. R. ") - (check-equal? (given-names->initials "Matthew Raymond") "M. R. ")) - -(define (proceedings-location - location - #:pages [pages #f] - #:series [series #f] - #:volume [volume #f]) - (let* ([s @elem{In @italic{@elem{Proc. @|location|}}}] - [s (if series - @elem{@|s|, @(format "~a" series)} - s)] - [s (if volume - @elem{@|s| volume @(format "~a" volume)} - s)] - [s (if pages - @elem{@|s|, pp. @(to-string (car pages))--@(to-string (cadr pages))} - s)]) - s)) - -(define (journal-location - location - #:pages [pages #f] - #:number [number #f] - #:volume [volume #f]) - (let* ([s @italic{@|location|}] - [s (if volume - @elem{@|s| @(to-string volume)} - s)] - [s (if number - @elem{@|s|(@(to-string number))} - s)] - [s (if pages - @elem{@|s|, pp. @(to-string (car pages))--@(to-string (cadr pages))} - s)]) - s)) - -(define (book-location - #:edition [edition #f] - #:publisher [publisher #f]) - (let* ([s (if edition - @elem{@(string-titlecase edition) edition} - #f)] - [s (if publisher - (if s - @elem{@|s|. @|publisher|} - publisher) - s)]) - (unless s - (error 'book-location "no arguments")) - s)) - -(define (techrpt-location - #:institution org - #:number num) - @elem{@|org|, @|num|}) - -(define (dissertation-location - #:institution org - #:degree [degree "PhD"]) - @elem{@|degree| dissertation, @|org|}) - -;; ---------------------------------------- - -(define (author-name first last #:suffix [suffix #f]) - (make-author-element - #f - (list - (format "~a ~a~a" - (if (abbreviate-given-names) - (given-names->initials first) - first) - last - (if suffix - (format " ~a" suffix) - ""))) - (format "~a ~a~a" last first (if suffix - (format " ~a" suffix) - "")) - last)) - -(define (org-author-name org) - (make-author-element - #f - (list org) - org - org)) - -(define (other-authors) - (make-other-author-element - #f - (list "Alia") - "al." - "al.")) - -(define (authors name . names*) - (define names (map parse-author (cons name names*))) - (define slash-names (string-join (map author-element-names names) " / ")) - (define cite - (case (length names) - [(1) (author-element-cite (car names))] - [(2) (if (other-author-element? (cadr names)) - (format "~a et al." (author-element-cite (car names))) - (format "~a and ~a" - (author-element-cite (car names)) - (author-element-cite (cadr names))))] - [else (format "~a et al." (author-element-cite (car names)))])) - (make-author-element - #f - (let loop ([names names] [prefix 0]) - (cond [(null? (cdr names)) - (case prefix - [(0) names] - [(1) (if (other-author-element? (car names)) - (list " et al.") - (list " and " (car names)))] - [else (if (other-author-element? (car names)) - (list ", et al.") - (list ", and " (car names)))])] - [else - (case prefix - [(0) (list* (car names) - (loop (cdr names) (add1 prefix)))] - [else (list* ", " - (car names) - (loop (cdr names) (add1 prefix)))])])) - slash-names - cite)) - -(define (editor name) - (let ([name (parse-author name)]) - (make-author-element - #f - (append (element-content name) - '(" (Ed.)")) - (author-element-names name) - (author-element-cite name)))) - -(define (to-string v) (format "~a" v)) diff --git a/scribble-lib/scriblib/autobib.tex b/scribble-lib/scriblib/autobib.tex deleted file mode 100644 index ac67197d..00000000 --- a/scribble-lib/scriblib/autobib.tex +++ /dev/null @@ -1,8 +0,0 @@ - -\newenvironment{AutoBibliography}{\begin{small}}{\end{small}} -\newcommand{\Autobibentry}[1]{\hspace{0.05\linewidth}\parbox[t]{0.95\linewidth}{\parindent=-0.05\linewidth#1\vspace{1.0ex}}} - -\usepackage{calc} -\newlength{\ABcollength} -\newcommand{\Autocolbibnumber}[1]{\parbox[t]{5ex}{\hfill#1~~\vspace{1.0ex}}} -\newcommand{\Autocolbibentry}[1]{\setlength{\ABcollength}{\linewidth-5ex}\parbox[t]{\ABcollength}{#1\vspace{1.0ex}}} diff --git a/scribble-lib/scriblib/bibtex.rkt b/scribble-lib/scriblib/bibtex.rkt deleted file mode 100644 index 82d3fb97..00000000 --- a/scribble-lib/scriblib/bibtex.rkt +++ /dev/null @@ -1,334 +0,0 @@ -#lang at-exp racket/base -(require racket/function - racket/match - racket/list) - -(struct bibdb (raw bibs)) - -(define (bibtex-parse ip) - (define STRING-DB (make-hash)) - (define ENTRY-DB (make-hash)) - - (define (perror ip sym fmt . args) - (define loc (call-with-values (λ () (port-next-location ip)) list)) - (apply error sym (string-append fmt " @ line ~a column ~a byte ~a") (append args loc))) - - (define (read-while pred ip) - (list->string - (let loop () - (match (peek-char ip) - [(and (? char?) (? pred)) - (cons (read-char ip) - (loop))] - [_ - empty])))) - - (define (read-until pred ip) - (read-while (negate pred) ip)) - - (define (slurp-whitespace ip) - (read-while (λ (c) (and (char? c) (char-whitespace? c))) ip)) - - (define (read-entries ip) - (slurp-whitespace ip) - (match (read-char ip) - [#\% - (read-line ip) - (read-entries ip)] - [#\@ - (read-entry ip) - (read-entries ip)] - [(? eof-object?) - (void)] - [c - ;; All other characters are comments. - (read-entries ip)])) - - (define (read-entry ip) - (match (read-until (λ (c) (or (char=? c #\{) - (char=? c #\())) - ip) - [(app string-downcase "string") - (slurp-whitespace ip) - (match (read-char ip) - [#\{ - (void)] - [c - (perror ip 'read-entry "Parsing entry, expected {, got ~v" c)]) - (define tag (read-tag ip)) - (slurp-whitespace ip) - (match (read-char ip) - [#\= - (slurp-whitespace ip) - (define string (read-value ip)) - (slurp-whitespace ip) - (match (read-char ip) - [#\} - (hash-set! STRING-DB tag string)] - [c - (perror ip 'read-entry "Parsing string, expected }, got ~v; tag is ~v; string is ~v" c tag string)])] - [c - (perror ip 'read-entry "Parsing string, expected =, got ~v; tag is ~v" c tag)])] - [(or (app string-downcase "comment") - (app string-downcase "preamble")) - (read-char ip) - (let loop () - (read-until (λ (c) (or (char=? c #\{) (char=? c #\}))) ip) - (match (read-char ip) - [#\{ - (loop) (loop)] - [#\} - (void)]))] - [typ - (read-char ip) - (slurp-whitespace ip) - (define label (read-until (λ (c) (char=? c #\,)) ip)) - (read-char ip) - (define alist - (let loop () - (slurp-whitespace ip) - (define atag (read-tag ip)) - (cond - [(string=? "" atag) - (read-char ip) - (hash)] - [else - (slurp-whitespace ip) - (match (read-char ip) - [#\= - (slurp-whitespace ip) - (define aval (read-value ip)) - (slurp-whitespace ip) - (match (read-char ip) - [#\, - (hash-set (loop) atag aval)] - [#\} - (hash atag aval)] - [c - (perror ip 'read-entry "Parsing entry, expected , or }, got ~v; label is ~v; atag is ~v; aval is ~v" c label atag aval)])] - [c - (perror ip 'read-entry "Parsing entry tag, expected =, got ~v; label is ~v; atag is ~v" c label atag)])]))) - (hash-set! ENTRY-DB label - (hash-set alist 'type typ))])) - - (define (read-tag ip) - (slurp-whitespace ip) - (string-downcase - (read-until - (λ (c) (or (char-whitespace? c) - (char=? c #\=) - (char=? c #\{) - (char=? c #\}))) - ip))) - - (define (read-braced-value ip) - (read-char ip) - (let loop () - (define first-part (read-until (λ (c) (or (char=? c #\{) (char=? c #\}))) - ip)) - (match (peek-char ip) - [#\{ - (string-append first-part (read-value ip) (loop))] - [#\} - (read-char ip) - first-part]))) - - (define (read-value ip) - (slurp-whitespace ip) - (define first-part (read-value-single ip)) - (slurp-whitespace ip) - (match (peek-char ip) - [#\# - (read-char ip) - (string-append first-part (read-value ip))] - [_ - first-part])) - - (define (read-value-single ip) - (slurp-whitespace ip) - (match (peek-char ip) - [#\{ - (read-braced-value ip)] - [#\" - (read-char ip) - (let loop () - (define first-part (read-until (λ (c) (or (char=? c #\{) (char=? c #\"))) - ip)) - (match (peek-char ip) - [#\{ - (string-append first-part (read-braced-value ip) (loop))] - [#\" - (read-char ip) - first-part]))] - [(? char-numeric?) - (read-while char-numeric? ip)] - [(? char-alphabetic?) - (define string-tag (read-until (λ (c) (or (char-whitespace? c) - (char=? c #\,))) - ip)) - (hash-ref STRING-DB string-tag - (λ () string-tag))] - [c - (perror ip 'read-value "Parsing value, expected {, got ~v" c)])) - - (read-entries ip) - - (bibdb ENTRY-DB (make-hash))) - -(define (path->bibdb pth) - (define bibdb - (with-input-from-file - pth - (λ () - (port-count-lines! (current-input-port)) - (bibtex-parse (current-input-port))))) - bibdb) - -(require scriblib/autobib - scribble/manual) - -(define-syntax-rule - (define-bibtex-cite bib-pth - ~cite-id citet-id generate-bibliography-id . options) - (begin - (define-cite autobib-cite autobib-citet generate-bibliography-id . options) - (define-bibtex-cite* bib-pth - autobib-cite autobib-citet - ~cite-id citet-id))) - -(define-syntax-rule - (define-bibtex-cite* bib-pth - autobib-cite autobib-citet - ~cite-id citet-id) - (begin - (define bibtex-db (path->bibdb bib-pth)) - (define ((make-citer citer) f . r) - (apply citer - (filter-map - (λ (key) - (and (not (string=? "\n" key)) - (generate-bib bibtex-db key))) - (append-map (curry regexp-split #rx" +") - (cons f r))))) - (define ~cite-id (make-citer autobib-cite)) - (define citet-id (make-citer autobib-citet)))) - -(define (parse-author as) - (and as - (apply authors - (for/list ([a (in-list (regexp-split #rx" +and *" as))]) - (match (regexp-split #rx" +" a) - [(list one) (org-author-name one)] - [(list one two) (author-name one two)] - [(list-rest first rest) - (author-name (apply string-append (add-between (cons first (drop-right rest 1)) - " ")) - (last rest))]))))) - -(module+ test - (require rackunit) - - ;; use this as a predicate to hack around lack of - ;; ability to use equal? on author element structs; - ;; unfortunately, it ony compares the composed strings - (define (print-as-equal-string? a b) - (equal? (format "~s" a) - (format "~s" b))) - - (check - print-as-equal-string? - (parse-author "James Earl Jones") - (authors - (author-name "James Earl" "Jones"))) - - (check - print-as-equal-string? - (parse-author "Tim Robbins and Morgan Freeman") - (authors (author-name "Tim" "Robbins") - (author-name "Morgan" "Freeman"))) - - (check - print-as-equal-string? - (parse-author "Edward L. Deci and Robert J. Vallerand and Luc G. Pelletier and Richard M. Ryan") - (authors (author-name "Edward L." "Deci") - (author-name "Robert J." "Vallerand") - (author-name "Luc G." "Pelletier") - (author-name "Richard M." "Ryan")))) - -(define (parse-pages ps) - (match ps - [(regexp #rx"^([0-9]+)\\-+([0-9]+)$" (list _ f l)) - (list f l)] - [#f - #f] - [_ - (error 'parse-pages "Invalid page format ~e" ps)])) - -(define (generate-bib db key) - (match-define (bibdb raw bibs) db) - (hash-ref! bibs key - (λ () - (define the-raw (hash-ref raw key (λ () (error 'bibtex "Unknown citation ~e" key)))) - (define (raw-attr a [def #f]) - (hash-ref the-raw a def)) - (define (raw-attr* a) - (hash-ref the-raw a - (λ () (error 'bibtex "Key ~a is missing attribute ~a, has ~a" - key a the-raw)))) - (match (raw-attr 'type) - ["misc" - (make-bib #:title (raw-attr "title") - #:author (parse-author (raw-attr "author")) - #:date (raw-attr "year") - #:url (raw-attr "url"))] - ["book" - (make-bib #:title (raw-attr "title") - #:author (parse-author (raw-attr "author")) - #:date (raw-attr "year") - #:is-book? #t - #:url (raw-attr "url"))] - ["article" - (make-bib #:title (raw-attr "title") - #:author (parse-author (raw-attr "author")) - #:date (raw-attr "year") - #:location (journal-location (raw-attr* "journal") - #:pages (parse-pages (raw-attr "pages")) - #:number (raw-attr "number") - #:volume (raw-attr "volume")) - #:url (raw-attr "url"))] - ["inproceedings" - (make-bib #:title (raw-attr "title") - #:author (parse-author (raw-attr "author")) - #:date (raw-attr "year") - #:location (proceedings-location (raw-attr "booktitle")) - #:url (raw-attr "url"))] - ["webpage" - (make-bib #:title (raw-attr "title") - #:author (parse-author (raw-attr "author")) - #:date (raw-attr "year") - #:url (raw-attr "url"))] - ["mastersthesis" - (make-bib #:title (raw-attr "title") - #:author (parse-author (raw-attr "author")) - #:date (raw-attr "year") - #:location (raw-attr "school") - #:url (raw-attr "url"))] - ["techreport" - (make-bib #:title (raw-attr "title") - #:author (parse-author (raw-attr "author")) - #:date (raw-attr "year") - #:location - (match* ((raw-attr "institution") (raw-attr "number")) - [(#f #f) @elem{}] - [(l #f) @elem{@|l|}] - [(#f n) @elem{@|n|}] - [(l n) @elem{@|l|, @|n|}]) - #:url (raw-attr "url"))] - [_ - (make-bib #:title (format "~v" the-raw))])))) - -(provide (struct-out bibdb) - path->bibdb - bibtex-parse - define-bibtex-cite - define-bibtex-cite*) diff --git a/scribble-lib/scriblib/figure.css b/scribble-lib/scriblib/figure.css deleted file mode 100644 index 905d5b67..00000000 --- a/scribble-lib/scriblib/figure.css +++ /dev/null @@ -1,37 +0,0 @@ - -.Centertext { - text-align: center; - margin: 0 0 0 0; -} - -.Figure, .FigureMulti, .FigureMultiWide, .Herefigure { - margin: 1em 0 1em 0; - border: 1px solid #1818FF; -} - -.Figure, .FigureMulti, .Herefigure { - width: 100%; -} - -.FigureMultiWide { - width: 125%; -} - -.Centerfigure { - text-align: center; - margin: 0 0 0 0; -} - -.Leftfigure { - text-align: left; - margin: 0 0 0 0; -} - -.Rightfigure { - text-align: right; - margin: 0 0 0 0; -} - -.FigureInside { - margin: 1em 1em 1em 1em; -} diff --git a/scribble-lib/scriblib/figure.js b/scribble-lib/scriblib/figure.js deleted file mode 100644 index b85af46c..00000000 --- a/scribble-lib/scriblib/figure.js +++ /dev/null @@ -1,27 +0,0 @@ - -AddOnLoad(function () { - /* Lift figure targets to the start of the figure's blockquote, - so that clicking on a target reference shows the figure - content, instead of scrolling the figure caption to the - top of the page. */ - var targets = document.getElementsByTagName("a"); - for (var i = 0; i < targets.length; i++) { - var a = targets[i]; - var n = a.attributes["x-target-lift"]; - if (n) { - var s = n.value; - var p = a.parentNode; - while (p && (p.className != s)) { - p = p.parentNode; - } - if (p) { - var cs = p.children; - a.parentNode.removeChild(a); - if (cs.length > 0) - p.insertBefore(a, cs[0]); - else - p.appendChild(a); - } - } - } -}); diff --git a/scribble-lib/scriblib/figure.rkt b/scribble-lib/scriblib/figure.rkt deleted file mode 100644 index 16780d49..00000000 --- a/scribble-lib/scriblib/figure.rkt +++ /dev/null @@ -1,140 +0,0 @@ -#lang scheme/base - -(require scribble/manual - scribble/core - scribble/decode - scribble/html-properties - scribble/latex-properties - setup/main-collects - "private/counter.rkt") - -(provide figure - figure* - figure** - figure-here - Figure-target - Figure-ref - figure-ref - left-figure-style - center-figure-style - right-figure-style - suppress-floats - (rename-out [left-figure-style left])) - -(define figure-style-extras - (let ([abs (lambda (s) - (path->main-collects-relative - (collection-file-path s "scriblib")))]) - (list 'never-indents - (make-css-addition (abs "figure.css")) - (make-tex-addition (abs "figure.tex"))))) - -;; outer layer: -(define herefigure-style (make-style "Herefigure" figure-style-extras)) -(define figure-style (make-style "Figure" figure-style-extras)) -(define figuremulti-style (make-style "FigureMulti" figure-style-extras)) -(define figuremultiwide-style (make-style "FigureMultiWide" figure-style-extras)) - -;; middle layer: -(define center-figure-style (make-style "Centerfigure" figure-style-extras)) -(define left-figure-style (make-style "Leftfigure" figure-style-extras)) -(define right-figure-style (make-style "Rightfigure" figure-style-extras)) - -;; inner layer: -(define figureinside-style (make-style "FigureInside" figure-style-extras)) - -(define legend-style (make-style "Legend" figure-style-extras)) -(define legend-continued-style (make-style "LegendContinued" figure-style-extras)) - -(define centertext-style (make-style "Centertext" figure-style-extras)) - -;; See "figure.js": -(define figure-target-style - (make-style #f - (list - (make-attributes '((x-target-lift . "Figure"))) - (make-js-addition - (path->main-collects-relative - (collection-file-path "figure.js" "scriblib")))))) - -(define (make-figure-ref c s) - (element (style "FigureRef" (list* (command-extras (list s)) - figure-style-extras)) - c)) -(define (make-figure-target c s) - (element (style "FigureTarget" (cons (command-extras (list s)) - figure-style-extras)) - c)) - -(define (figure tag caption - #:style [style center-figure-style] - #:continue? [continue? #f] - . content) - (figure-helper figure-style style tag caption content continue?)) - -(define (figure-here tag caption - #:style [style center-figure-style] - #:continue? [continue? #f] - . content) - (figure-helper herefigure-style style tag caption content continue?)) - -(define (figure* tag caption - #:style [style center-figure-style] - #:continue? [continue? #f] - . content) - (figure-helper figuremulti-style style tag caption content continue?)) -(define (figure** tag caption - #:style [style center-figure-style] - #:continue? [continue? #f] - . content) - (figure-helper figuremultiwide-style style tag caption content continue?)) - -(define (figure-helper figure-style content-style tag caption content continue?) - (make-nested-flow - figure-style - (list - (make-nested-flow - content-style - (list (make-nested-flow figureinside-style (decode-flow content)))) - (make-paragraph - centertext-style - (list (make-element (if continue? - legend-continued-style - legend-style) - (list (Figure-target tag #:continue? continue?) caption))))))) - -(define figures (new-counter "figure" - #:target-wrap make-figure-target - #:ref-wrap make-figure-ref)) -(define (Figure-target tag #:continue? [continue? #f]) - (counter-target figures tag - "Figure" - (if continue? " (continued): " ": ") - #:target-style figure-target-style - #:continue? continue?)) - -(define (ref-proc initial) - (case-lambda - [(tag) - (make-element #f (list (counter-ref figures tag (string-append initial "igure"))))] - [(tag1 tag2) - (make-element #f (list (counter-ref figures tag1 (string-append initial "igures")) - " and " - (counter-ref figures tag2 #f)))] - [(tag . tags) - (make-element #f (cons (counter-ref figures tag (string-append initial "igures")) - (let loop ([tags tags]) - (cond - [(null? (cdr tags)) - (list ", and " - (counter-ref figures (car tags) #f))] - [else - (list* ", " - (counter-ref figures (car tags) #f) - (loop (cdr tags)))]))))])) - -(define Figure-ref (ref-proc "F")) -(define figure-ref (ref-proc "f")) - -(define (suppress-floats) - (make-element "suppressfloats" null)) diff --git a/scribble-lib/scriblib/figure.tex b/scribble-lib/scriblib/figure.tex deleted file mode 100644 index 22d7bdc4..00000000 --- a/scribble-lib/scriblib/figure.tex +++ /dev/null @@ -1,42 +0,0 @@ -\usepackage{ccaption} - -% \legend relies on \belowcaptionskip, which is not defined -% by the JFP class file: -\makeatletter -\@ifundefined{belowcaptionskip}{\newlength{\belowcaptionskip}}{} -\makeatother - -\newcommand{\Legend}[1]{~ - - \hrule width \hsize height .33pt - \vspace{4pt} - \legend{#1}} - -\newcommand{\LegendContinued}[1]{\Legend{#1}} - -\newcommand{\FigureTarget}[2]{#1} -\newcommand{\FigureRef}[2]{\hyperref[#2]{#1}} - -\newlength{\FigOrigskip} -\FigOrigskip=\parskip - -% Put this before the figure content, so that a hyperref goes to -% the start of the content: -\newcommand{\FigureSetRef}{\refstepcounter{figure}} - -\newenvironment{Figure}{\begin{figure}\FigureSetRef}{\end{figure}} -\newenvironment{FigureMulti}{\begin{figure*}[t!p]\FigureSetRef}{\end{figure*}} -\newenvironment{FigureMultiWide}{\begin{FigureMulti}\FigureSetRef}{\end{FigureMulti}} -\newenvironment{Herefigure}{\begin{figure}[ht!]\FigureSetRef\centering}{\end{figure}} - -\newenvironment{Centerfigure}{\begin{Xfigure}\centering\item}{\end{Xfigure}} -\newenvironment{Leftfigure}{\begin{Xfigure}\item}{\end{Xfigure}} -\newenvironment{Rightfigure}{\begin{Xfigure}\item}{\end{Xfigure}} - -\newenvironment{Xfigure}{\begin{list}{}{\leftmargin=0pt\topsep=0pt\parsep=\FigOrigskip\partopsep=0pt}}{\end{list}} - -\newenvironment{FigureInside}{}{} - -\newcommand{\Centertext}[1]{\begin{center}#1\end{center}} - - diff --git a/scribble-lib/scriblib/footnote.css b/scribble-lib/scriblib/footnote.css deleted file mode 100644 index 5d9ebcdf..00000000 --- a/scribble-lib/scriblib/footnote.css +++ /dev/null @@ -1,27 +0,0 @@ - -.NoteBox { - position: relative; - float: right; - left: 2em; - height: 0em; - width: 13em; - margin: 0em -13em 0em 0em; -} - -.NoteContent { - margin: 0 0 0 0; - font-size: 85%; -} - -.FootnoteContent { - display: none; -} - -.FootnoteBlock { - border-top: 1px solid black; -} - -.FootnoteBlockContent { - padding-left: 1em; - text-indent: -0.5em; -} diff --git a/scribble-lib/scriblib/footnote.rkt b/scribble-lib/scriblib/footnote.rkt deleted file mode 100644 index 81dda967..00000000 --- a/scribble-lib/scriblib/footnote.rkt +++ /dev/null @@ -1,86 +0,0 @@ -#lang scheme/base - -(require scribble/core - scribble/decode - scribble/html-properties - scribble/latex-properties - racket/promise - setup/main-collects - "private/counter.rkt") - -(provide note - define-footnote) - -(define footnote-style-extras - (let ([abs (lambda (s) - (path->main-collects-relative - (collection-file-path s "scriblib")))]) - (list (make-css-addition (abs "footnote.css")) - (make-tex-addition (abs "footnote.tex"))))) - - -(define note-box-style (make-style "NoteBox" footnote-style-extras)) -(define note-content-style (make-style "NoteContent" footnote-style-extras)) - -(define (note . text) - (make-element - note-box-style - (make-element note-content-style - (decode-content text)))) - - -(define footnote-style (make-style "Footnote" footnote-style-extras)) -(define footnote-ref-style (make-style "FootnoteRef" footnote-style-extras)) -(define footnote-content-style (make-style "FootnoteContent" footnote-style-extras)) -(define footnote-target-style (make-style "FootnoteTarget" footnote-style-extras)) -(define footnote-block-style (make-style "FootnoteBlock" footnote-style-extras)) -(define footnote-block-content-style (make-style "FootnoteBlockContent" footnote-style-extras)) - -(define-syntax-rule (define-footnote footnote footnote-part) - (begin - (define footnotes (new-counter "footnote")) - (define id (gensym)) - (define (footnote . text) (do-footnote footnotes id text)) - (define (footnote-part . text) (do-footnote-part footnotes id)))) - -(define (do-footnote footnotes id text) - (let ([tag (generated-tag)] - [content (decode-content text)]) - (make-traverse-element - (lambda (get set) - (set id (cons (cons - (make-element footnote-target-style - (make-element - 'superscript - (counter-target footnotes tag #f))) - content) - (get id null))) - (make-element footnote-style - (list - (make-element - footnote-ref-style - (make-element - 'superscript - (counter-ref footnotes tag #f))) - (make-element - footnote-content-style - content))))))) - -(define (do-footnote-part footnotes id) - (make-part - #f - (list `(part ,(generated-tag))) - #f - (make-style #f '(hidden toc-hidden)) - null - (list - (make-traverse-block - (lambda (get set) - (make-compound-paragraph - footnote-block-style - (map (lambda (content) - (make-paragraph - footnote-block-content-style - content)) - (reverse (get id null))))))) - null)) diff --git a/scribble-lib/scriblib/footnote.tex b/scribble-lib/scriblib/footnote.tex deleted file mode 100644 index ad0676b9..00000000 --- a/scribble-lib/scriblib/footnote.tex +++ /dev/null @@ -1,12 +0,0 @@ - -\newcommand{\NoteBox}[1]{\footnote{#1}} -\newcommand{\NoteContent}[1]{#1} - -\newcommand{\Footnote}[1]{\footnote{#1}} -\newcommand{\FootnoteRef}[1]{} -\newcommand{\FootnoteTarget}[1]{} -\newcommand{\FootnoteContent}[1]{#1} - -% Redefine \noindent to avoid generating any output at all: -\newenvironment{FootnoteBlock}{\renewcommand{\noindent}{}}{} -\newcommand{\FootnoteBlockContent}[1]{} diff --git a/scribble-lib/scriblib/gui-eval.rkt b/scribble-lib/scriblib/gui-eval.rkt deleted file mode 100644 index 69b3ee35..00000000 --- a/scribble-lib/scriblib/gui-eval.rkt +++ /dev/null @@ -1,174 +0,0 @@ -#lang racket/base - -(require scribble/eval - scribble/core - scribble/scheme - racket/class - racket/file - racket/runtime-path - racket/serialize - "private/gui-eval-exn.rkt" - racket/system - racket/sandbox - (for-syntax racket/base)) - -(define-syntax define-mr - (syntax-rules () - [(_ mr orig) - (begin - (provide mr) - (define-syntax (mr stx) - (syntax-case stx () - [(_ #:eval+opts the-eval get-predicate? get-render get-get-width get-get-height x (... ...)) - #'(let ([the-eval-x the-eval]) - (parameterize ([scribble-eval-handler (gui-eval-handler the-eval-x - get-predicate? - get-render - get-get-width - get-get-height)]) - (orig #:eval the-eval-x x (... ...))))] - [(_ x (... ...)) - #'(parameterize ([scribble-eval-handler (gui-eval-handler gui-eval - (λ () (gui-eval 'pict?)) - (λ () (gui-eval 'draw-pict)) - (λ () (gui-eval 'pict-width)) - (λ () (gui-eval 'pict-height)))]) - (orig #:eval gui-eval x (... ...)))])))])) - -(define gui-eval (make-base-eval #:pretty-print? #f)) - -(define mred? (getenv "MREVAL")) -(define-namespace-anchor anchor) - -(when mred? - (call-in-sandbox-context gui-eval - (lambda () - (namespace-attach-module (namespace-anchor->namespace anchor) - 'racket/class))) - (gui-eval '(require racket/gui/base)) - (gui-eval '(require slideshow))) - -(define-mr gui-interaction interaction) -(define-mr gui-interaction-eval interaction-eval) -(define-mr gui-interaction-eval-show interaction-eval-show) -(define-mr gui-def+int def+int) -(define-mr gui-defs+int defs+int) -(define-mr gui-racketmod+eval racketmod+eval) -(define-mr gui-racketblock+eval racketblock+eval) - -(provide (rename-out [gui-racketmod+eval gui-schememod+eval] - [gui-racketblock+eval gui-schemeblock+eval])) - -;; This one needs to be relative, because it ends up in the -;; exprs.dat file: -(define img-dir "images") ; relative to src dir - -;; This one can be absolute: -(define exprs-dat-file (build-path "images" - "exprs.dat")) - -(define gui-eval-handler - (if mred? - (let ([eh (scribble-eval-handler)] - [log-file (open-output-file exprs-dat-file #:exists 'truncate/replace)]) - (λ (gui-eval get-predicate? get-render get-get-width get-get-height) - (lambda (ev catching-exns? expr) - (write (serialize (if (syntax? expr) (syntax->datum expr) expr)) log-file) - (newline log-file) - (flush-output log-file) - (let ([result - (with-handlers ([exn:fail? - (lambda (exn) - (make-gui-exn (exn-message exn)))]) - ;; put the call to fixup-picts in the handlers - ;; so that errors in the user-supplied predicates & - ;; conversion functions show up in the rendered output - (fixup-picts (get-predicate?) (get-render) (get-get-width) (get-get-height) - (eh ev catching-exns? expr)))]) - (write (serialize result) log-file) - (newline log-file) - (flush-output log-file) - (if (gui-exn? result) - (raise (make-exn:fail - (gui-exn-message result) - (current-continuation-marks))) - result))))) - (let ([log-file (with-handlers ([exn:fail:filesystem? - (lambda (exn) - (open-input-string ""))]) - (open-input-file exprs-dat-file))]) - (λ (gui-eval get-predicate? get-render get-get-width get-get-height) - (lambda (ev catching-exns? expr) - (with-handlers ([exn:fail? (lambda (exn) - (if catching-exns? - (raise exn) - (void)))]) - (let ([v (read log-file)]) - (if (eof-object? v) - (error "expression not in log file") - (let ([v (deserialize v)]) - (if (equal? v (if (syntax? expr) - (syntax->datum expr) - expr)) - (let ([v (read log-file)]) - (if (eof-object? v) - (error "expression result missing in log file") - (let ([v (deserialize v)]) - (if (gui-exn? v) - (raise (make-exn:fail - (gui-exn-message v) - (current-continuation-marks))) - v)))) - (error 'mreval - "expression does not match log file: ~e versus: ~e" - expr - v))))))))))) - -(define image-counter 0) - -;; This path will be marshaled for use on multiple platforms -(define (build-string-path a b) (string-append a "/" b)) - -(define (fixup-picts predicate? render get-width get-height v) - (let loop ([v v]) - (cond - [(predicate? v) - (let ([fn (build-string-path img-dir - (format "img~a.png" image-counter))]) - (set! image-counter (add1 image-counter)) - (let ([dc (let ([pss (make-object (gui-eval 'ps-setup%))]) - (send pss set-mode 'file) - (send pss set-file (path-replace-suffix fn #".pdf")) - (parameterize ([(gui-eval 'current-ps-setup) pss]) - (let ([xb (box 0)] - [yb (box 0)]) - (send pss get-scaling xb yb) - (new (gui-eval 'pdf-dc%) - [interactive #f] - [width (* (unbox xb) (get-width v))] - [height (* (unbox yb) (get-height v))]))))]) - (send dc start-doc "Image") - (send dc start-page) - (render v dc 0 0) - (send dc end-page) - (send dc end-doc)) - (let* ([bm (make-object (gui-eval 'bitmap%) - (inexact->exact (ceiling (get-width v))) - (inexact->exact (ceiling (get-height v))))] - [dc (make-object (gui-eval 'bitmap-dc%) bm)]) - (send dc set-smoothing 'aligned) - (send dc clear) - (render v dc 0 0) - (send bm save-file fn 'png) - (make-image-element - #f - (list "[image]") - ;; Be sure to use a string rather than a path, because - ;; it gets recorded in "exprs.dat". - (path->string (path-replace-suffix fn #"")) - '(".pdf" ".png") - 1.0)))] - [(pair? v) (cons (loop (car v)) - (loop (cdr v)))] - [(serializable? v) v] - [else (make-element #f (list (format "~s" v)))]))) diff --git a/scribble-lib/scriblib/info.rkt b/scribble-lib/scriblib/info.rkt deleted file mode 100644 index ed05f03a..00000000 --- a/scribble-lib/scriblib/info.rkt +++ /dev/null @@ -1,3 +0,0 @@ -#lang info - -(define purpose "This collect contains auxiliary scribble libraries, they have their own documentation linked from the top level.") diff --git a/scribble-lib/scriblib/private/counter.rkt b/scribble-lib/scriblib/private/counter.rkt deleted file mode 100644 index ff85a685..00000000 --- a/scribble-lib/scriblib/private/counter.rkt +++ /dev/null @@ -1,99 +0,0 @@ -#lang racket/base -(require scribble/core - scribble/decode) - -(provide new-counter - counter-target - counter-ref - counter-collect-value) - -(define-struct counter ([n #:mutable] name target-wrap ref-wrap)) - -(define (new-counter name - #:target-wrap [target-wrap (lambda (c s) c)] - #:ref-wrap [ref-wrap (lambda (c s) c)]) - (make-counter 0 name target-wrap ref-wrap)) - -(define (tag->counter-tag counter tag . kind) - (if (generated-tag? tag) - `(,(string->symbol (format "counter-~a" kind)) ,tag) - `(counter (,(counter-name counter) ,tag ,@kind)))) - -(define (counter-target counter tag label - #:target-style [target-style #f] - #:continue? [continue? #f] - . content) - (let ([content (decode-content content)]) - (define c - (make-target-element - target-style - (list - (make-collect-element - #f - (list - (make-delayed-element - (lambda (renderer part ri) - (let ([n (resolve-get part ri (tag->counter-tag counter tag "value"))]) - (let ([l (cons (format "~a" n) content)]) - (if label - (list* label 'nbsp l) - l)))) - (lambda () (if label - (list* label 'nbsp "N" content) - (cons "N" content))) - (lambda () (if label - (list* label 'nbsp "N" content) - (cons "N" content))))) - (lambda (ci) - (let ([n (if continue? - (counter-n counter) - (add1 (counter-n counter)))]) - (set-counter-n! counter n) - (collect-put! ci (generate-tag (tag->counter-tag counter tag "value") ci) n))))) - (tag->counter-tag counter tag))) - (if (counter-target-wrap counter) - ((counter-target-wrap counter) - c - (format "t:~a" (t-encode (tag->counter-tag counter tag)))) - c))) - -(define (t-encode s) - (apply - string-append - (map (lambda (c) - (cond - [(and (or (char-alphabetic? c) (char-numeric? c)) - ((char->integer c) . < . 128)) - (string c)] - [(char=? c #\space) "_"] - [else (format "x~x" (char->integer c))])) - (string->list (format "~s" s))))) - -(define (counter-ref counter tag label) - (let ([n (make-delayed-element - (lambda (renderer part ri) - (let ([n (resolve-get part ri (tag->counter-tag counter tag "value"))]) - (if (counter-ref-wrap counter) - (let ([id (format "t:~a" (t-encode (list 'counter (list (counter-name counter) tag))))]) - ((counter-ref-wrap counter) - (format "~a" n) - id)) - (list (format "~a" n))))) - (lambda () (if label - (list label 'nbsp "N") - (list "N"))) - (lambda () (if label - (list label 'nbsp "N") - (list "N"))))]) - (make-link-element - #f - (if label - (list - label - 'nbsp - n) - n) - (tag->counter-tag counter tag)))) - -(define (counter-collect-value counter) - (counter-n counter)) diff --git a/scribble-lib/scriblib/private/gui-eval-exn.rkt b/scribble-lib/scriblib/private/gui-eval-exn.rkt deleted file mode 100644 index daad531f..00000000 --- a/scribble-lib/scriblib/private/gui-eval-exn.rkt +++ /dev/null @@ -1,6 +0,0 @@ -#lang scheme/base -(require mzlib/serialize) - -(define-serializable-struct gui-exn (message)) - -(provide (struct-out gui-exn)) diff --git a/scribble-lib/scriblib/render-cond.rkt b/scribble-lib/scriblib/render-cond.rkt deleted file mode 100644 index b76eabd8..00000000 --- a/scribble-lib/scriblib/render-cond.rkt +++ /dev/null @@ -1,75 +0,0 @@ -#lang racket/base -(require scribble/core - (for-syntax racket/base)) - -(provide cond-element - cond-block) - -(define-for-syntax (render-cond stx mk check-result no-matching-case) - (syntax-case stx () - [(_ [test body0 body ...] ...) - (let ([tests (syntax->list #'(test ...))]) - (with-syntax ([(test-expr ...) - (for/list ([test (in-list tests)] - [pos (in-naturals)]) - (let loop ([test test]) - (syntax-case test (else and or not) - [else - (unless (= pos (sub1 (length tests))) - (raise-syntax-error - #f - "found `else' not in last clause" - stx - test)) - #'#t] - [(and test ...) - #`(and . #,(map loop (syntax->list #'(test ...))))] - [(or test ...) - #`(or . #,(map loop (syntax->list #'(test ...))))] - [(not test) - #`(not #,(loop #'test))] - [id - (identifier? #'id) - #'(memq 'id mode)])))] - [mk mk] - [check-result check-result] - [no-matching-case no-matching-case]) - #'(mk - (lambda (get put) - (let ([mode (get 'scribble:current-render-mode 'text)]) - (cond - [test-expr (check-result (let () body0 body ...))] - ... - [else (no-matching-case)]))))))])) - -(define-syntax (cond-block stx) - (render-cond stx #'traverse-block #'check-block #'no-block-case)) - -(define-syntax (cond-element stx) - (render-cond stx #'traverse-element #'check-content #'no-element-case)) - -(define (check-block v) - (unless (block? v) - (raise-mismatch-error - 'cond-block - "clause result is not a block: " - v)) - v) - -(define (check-content v) - (unless (content? v) - (raise-mismatch-error - 'cond-element - "clause result is not content: " - v)) - v) - -(define (no-block-case) - (raise (make-exn:fail:contract - "cond-element: no clause matched" - (current-continuation-marks)))) - -(define (no-element-case) - (raise (make-exn:fail:contract - "cond-element: no clause matched" - (current-continuation-marks)))) diff --git a/scribble-test/LICENSE.txt b/scribble-test/LICENSE.txt deleted file mode 100644 index 614b7cd9..00000000 --- a/scribble-test/LICENSE.txt +++ /dev/null @@ -1,11 +0,0 @@ -scribble-test -Copyright (c) 2010-2014 PLT Design Inc. - -This package is distributed under the GNU Lesser General Public -License (LGPL). This means that you can link this package into proprietary -applications, provided you follow the rules stated in the LGPL. You -can also modify this package; if you distribute a modified version, -you must distribute it under the terms of the LGPL, which in -particular means that you must release the source code for the -modified software. See http://www.gnu.org/copyleft/lesser.html -for more information. diff --git a/scribble-test/info.rkt b/scribble-test/info.rkt deleted file mode 100644 index 4122e1b9..00000000 --- a/scribble-test/info.rkt +++ /dev/null @@ -1,18 +0,0 @@ -#lang info - -(define collection 'multi) - -(define deps '("at-exp-lib" - "base" - "eli-tester" - "rackunit-lib" - "sandbox-lib" - "scribble-doc" ;; because some tests are examples from the docs - "scribble-lib" - "scribble-text-lib")) - -(define pkg-desc "tests for \"scribble\"") - -(define pkg-authors '(mflatt eli)) -(define build-deps '("racket-index")) -(define update-implies '("scribble-lib")) diff --git a/scribble-test/tests/help/test-docs-complete2.rkt b/scribble-test/tests/help/test-docs-complete2.rkt deleted file mode 100644 index 7ce64afc..00000000 --- a/scribble-test/tests/help/test-docs-complete2.rkt +++ /dev/null @@ -1,3 +0,0 @@ -#lang racket/base -(require rackunit/docs-complete) -(check-docs (quote help/search)) diff --git a/scribble-test/tests/scribble/decode.rkt b/scribble-test/tests/scribble/decode.rkt deleted file mode 100644 index 4594fd40..00000000 --- a/scribble-test/tests/scribble/decode.rkt +++ /dev/null @@ -1,52 +0,0 @@ -#lang racket/base -(require scribble/decode - scribble/core - rackunit - racket/contract/base) - -(check-true (pre-content? "x")) -(check-true (pre-content? null)) -(check-true (pre-content? '("x"))) -(check-true (pre-content? (list (element plain "x") "x"))) -(check-true (pre-content? (splice (list (element plain "x") "x")))) -(check-true (not (pre-content? 11))) -(check-true (not (pre-content? '(11)))) - -(check-true (pre-flow? "x")) -(check-true (pre-flow? '("x"))) -(check-true (pre-flow? (list (element plain "x") "x"))) -(check-true (pre-flow? (list (paragraph plain (element plain "x")) (element plain "x") "x"))) -(check-true (pre-flow? (splice (list (paragraph plain (element plain "x")) (element plain "x") "x")))) -(check-true (not (pre-flow? 11))) -(check-true (not (pre-flow? '(11)))) - -(check-true (pre-part? "x")) -(check-true (pre-part? '("x"))) -(check-true (pre-part? (list (element plain "x") "x"))) -(check-true (pre-part? (list (paragraph plain (element plain "x")) (element plain "x") "x"))) -(check-true (pre-part? (list (paragraph plain (element plain "x")) (element plain "x") "x" - (decode-part '("x") null #f 0) - (part-start 0 #f null plain "start") - (part-index-decl '("a" "b") '("a")) - (part-collect-decl (element plain "x")) - (part-tag-decl '(something "x")) - (void) - (title-decl #f null #f plain "title")))) -(check-true (not (pre-part? 11))) -(check-true (not (pre-part? '(11)))) - -(check-true (part? (decode '("x")))) -(check-true (part? (decode-part '("x") null #f 0))) -(check-true (andmap block? (decode-flow '("x")))) -(check-true (block? (decode-compound-paragraph '("x")))) -(check-true (paragraph? (decode-paragraph '("x")))) -(check-true (content? (decode-content '("x")))) -(check-true (content? (decode-elements '("x")))) -(check-true (content? (decode-string "x"))) - -(check-true (whitespace? " \n\t\r")) -(check-true (not (whitespace? " \n\t\rx "))) - -(check-equal? "a b c" (clean-up-index-string " a b c ")) - -(check-true (contract? (spliceof integer?))) diff --git a/scribble-test/tests/scribble/docs.rkt b/scribble-test/tests/scribble/docs.rkt deleted file mode 100644 index 57458426..00000000 --- a/scribble-test/tests/scribble/docs.rkt +++ /dev/null @@ -1,83 +0,0 @@ -#lang racket/base - -;; Use text renderer to check some Scribble functionality - -(require scribble/base-render - (prefix-in text: scribble/text-render) - (prefix-in html: scribble/html-render) - (prefix-in latex: scribble/latex-render) - (prefix-in markdown: scribble/markdown-render) - racket/file - racket/class - racket/runtime-path - tests/eli-tester) - -(define-runtime-path source-dir "docs") -(define work-dir (build-path (find-system-path 'temp-dir) - "scribble-docs-tests")) - -(define (build-doc render% src-file dest-file) - (let* ([renderer (new render% [dest-dir work-dir])] - [docs (list (if (module-declared? `(submod ,src-file doc) #t) - (dynamic-require `(submod ,src-file doc) 'doc) - (dynamic-require src-file 'doc)))] - [fns (list (build-path work-dir dest-file))] - [fp (send renderer traverse docs fns)] - [info (send renderer collect docs fns fp)] - [r-info (send renderer resolve docs fns info)]) - (send renderer render docs fns r-info) - (send renderer get-undefined r-info))) - -(define (build-text-doc src-file dest-file) - (build-doc (text:render-mixin render%) src-file dest-file)) - -(define (build-html-doc src-file dest-file) - (build-doc (html:render-mixin render%) src-file dest-file)) - -(define (build-htmls-doc src-file dest-file) - (build-doc (html:render-multi-mixin (html:render-mixin render%)) src-file dest-file)) - -(define (build-latex-doc src-file dest-file) - (build-doc (latex:render-mixin render%) src-file dest-file)) - -(define (build-markdown-doc src-file dest-file) - (build-doc (markdown:render-mixin render%) src-file dest-file)) - -(provide docs-tests) -(module+ main (docs-tests)) -(define (docs-tests) - (when (or (file-exists? work-dir) (directory-exists? work-dir)) - (delete-directory/files work-dir)) - (dynamic-wind - (λ() (make-directory work-dir)) - (λ() - (define files (map path-element->string (directory-list source-dir))) - (test do - (for ([scrbl (in-list files)] - #:when (regexp-match? #rx"\\.scrbl$" scrbl) - [txt (in-value (regexp-replace #rx"\\.scrbl$" scrbl ".txt"))] - #:when (member txt files)) - ;; (printf "Testing ~s -> ~s\n" scrbl txt) - (define src-file (build-path source-dir scrbl)) - (define expect-file (build-path source-dir txt)) - (define generated-file (build-path work-dir "gen.txt")) - (define (contents file) - (regexp-replace #rx"\n+$" (file->string file) "")) - (define undefineds (build-text-doc src-file "gen.txt")) - (for ([u (in-list undefineds)]) - (when (eq? 'tech (car u)) - (test #:failure-message - (format "undefined tech: ~e" u) - #f))) - (test #:failure-message - (format - "mismatch for: \"~a\", expected text in: \"~a\", got:\n~a" - scrbl txt (contents generated-file)) - (string=? (contents expect-file) (contents generated-file))) - - ;; Make sure the document at least renders in other modes: - (void (build-html-doc src-file "gen.html")) - (void (build-htmls-doc src-file "gen")) - (void (build-latex-doc src-file "gen.tex")) - (void (build-markdown-doc src-file "gen.md"))))) - (λ() (delete-directory/files work-dir)))) diff --git a/scribble-test/tests/scribble/docs/autobib-broken.scrbl b/scribble-test/tests/scribble/docs/autobib-broken.scrbl deleted file mode 100644 index d6c73646..00000000 --- a/scribble-test/tests/scribble/docs/autobib-broken.scrbl +++ /dev/null @@ -1,17 +0,0 @@ -#lang scribble/base -@(require scriblib/autobib) - -@(define-cite cite citet gen) - -@(define redex - (make-bib - #:author (authors "Matthias Felleisen" "Robert Bruce Findler" "Matthew Flatt") - #:title "Semantics Engineering with PLT Redex" - #:location (book-location #:publisher "MIT Press") - #:is-book? #t - #:date "2010")) - -Since there's no bibliography, this link won't work: -@cite[redex]. - - diff --git a/scribble-test/tests/scribble/docs/autobib-broken.txt b/scribble-test/tests/scribble/docs/autobib-broken.txt deleted file mode 100644 index 6f97337c..00000000 --- a/scribble-test/tests/scribble/docs/autobib-broken.txt +++ /dev/null @@ -1 +0,0 @@ -Since there’s no bibliography, this link won’t work:  (??? ???). diff --git a/scribble-test/tests/scribble/docs/autobib-disambiguation-corner.scrbl b/scribble-test/tests/scribble/docs/autobib-disambiguation-corner.scrbl deleted file mode 100644 index 468bbbd7..00000000 --- a/scribble-test/tests/scribble/docs/autobib-disambiguation-corner.scrbl +++ /dev/null @@ -1,19 +0,0 @@ -#lang scribble/base -@(require scriblib/autobib) -@(define-cite cite citet gen-bib) - -@(define a (make-bib #:title "Diss A" - #:is-book? #t - #:location (dissertation-location #:institution "NEU") - #:author (authors "Little" "Bo" "Peep") - #:date "2012")) -@(define b (make-bib #:title "Diss B" - #:is-book? #t - #:location (dissertation-location #:institution "NEU") - #:author (authors "Little" "Bo" "Peep") - #:date "2012")) -@;{Citing ambiguous entries without other single citations} -@;{should not cause a warning} -@cite[a b] - -@gen-bib[] diff --git a/scribble-test/tests/scribble/docs/autobib-disambiguation-corner.txt b/scribble-test/tests/scribble/docs/autobib-disambiguation-corner.txt deleted file mode 100644 index c07dc3af..00000000 --- a/scribble-test/tests/scribble/docs/autobib-disambiguation-corner.txt +++ /dev/null @@ -1,6 +0,0 @@ - (Little et al. 2012a,b) - -Bibliography - -Little, Bo, and Peep. Diss A. PhD dissertation, NEU, 2012a. -Little, Bo, and Peep. Diss B. PhD dissertation, NEU, 2012b. diff --git a/scribble-test/tests/scribble/docs/autobib-disambiguation-more.scrbl b/scribble-test/tests/scribble/docs/autobib-disambiguation-more.scrbl deleted file mode 100644 index 66772628..00000000 --- a/scribble-test/tests/scribble/docs/autobib-disambiguation-more.scrbl +++ /dev/null @@ -1,56 +0,0 @@ -#lang scribble/manual -@(require scriblib/autobib) - -@(define-cite ~cite citet generate-bibliography) - -@(define a1 - (make-bib - #:title "One" - #:author "A" - #:date "2012" - #:location "There")) - -@(define a2 - (make-bib - #:title "Two" - #:author "A" - #:date "2012" - #:location "Here")) - -@(define a2x - (make-bib - #:title "Twoish" - #:author "A" - #:date "2012" - #:location "HereX")) - -@(define a3 - (make-bib - #:title "Three" - #:author "A" - #:date "2013" - #:location "Where?")) - -@(define b1 - (make-bib - #:title "Uno" - #:author "B" - #:date "2012" - #:location "Ici")) - -A1@~cite[a1 a2 b1]. - -A1@~cite[a1 a2 a3]. - -@citet[a1 a2 a3]. - -In A2@~cite[(in-bib a2 " p. 17")] - -In A2 and A3@~cite[(in-bib a2 " p. 17") a3] - -In A1 and more@~cite[a1 (in-bib a2 " p. 17") a3] - -B&B@~cite[b1 a1]. - - -@generate-bibliography[] diff --git a/scribble-test/tests/scribble/docs/autobib-disambiguation-more.txt b/scribble-test/tests/scribble/docs/autobib-disambiguation-more.txt deleted file mode 100644 index e4d867df..00000000 --- a/scribble-test/tests/scribble/docs/autobib-disambiguation-more.txt +++ /dev/null @@ -1,20 +0,0 @@ -A1 (A 2012a,b; B 2012). - -A1 (A 2012a,b, 2013). - -A (2012a,b; 2013). - -In A2 (A 2012b p. 17) - -In A2 and A3 (A 2012b p. 17, 2013) - -In A1 and more (A 2012a, 2012b p. 17, 2013) - -B&B (A 2012a; B 2012). - -Bibliography - -A. One. There, 2012a. -A. Two. Here, 2012b. -A. Three. Where?, 2013. -B. Uno. Ici, 2012. diff --git a/scribble-test/tests/scribble/docs/autobib-disambiguation.scrbl b/scribble-test/tests/scribble/docs/autobib-disambiguation.scrbl deleted file mode 100644 index 7aea6a21..00000000 --- a/scribble-test/tests/scribble/docs/autobib-disambiguation.scrbl +++ /dev/null @@ -1,32 +0,0 @@ -#lang scribble/base -@(require scriblib/autobib) -@(define-cite cite citet gen-bib) - -@(define a (make-bib #:title "Diss 1" - #:is-book? #t - #:location (dissertation-location #:institution "NEU") - #:author (authors "Little" "Bo" "Peep") - #:date "2012")) -@(define b (make-bib #:title "Diss 2" - #:is-book? #t - #:location (dissertation-location #:institution "NEU") - #:author (authors "Little" "Bo" "Peep") - #:date "2012")) -@(define c (make-bib #:title "Diss 3" - #:is-book? #t - #:location (dissertation-location #:institution "NEU") - #:author (authors "Little" "Bo" "Peep" "Peep2") - #:date "2012")) -According to the following people, -@cite[a] -@cite[b] -@cite[c] -@citet[a] -@citet[b] -@citet[c] -@cite[a b] -@cite[b a] -@citet[a b] -@citet[b a] - -@gen-bib[] diff --git a/scribble-test/tests/scribble/docs/autobib-disambiguation.txt b/scribble-test/tests/scribble/docs/autobib-disambiguation.txt deleted file mode 100644 index 656e127b..00000000 --- a/scribble-test/tests/scribble/docs/autobib-disambiguation.txt +++ /dev/null @@ -1,10 +0,0 @@ -According to the following people,  (Little et al. 2012a)  (Little et -al. 2012b)  (Little et al. 2012c) Little et al. (2012a) Little et -al. (2012b) Little et al. (2012c)  (Little et al. 2012a,b)  (Little et -al. 2012b,a) Little et al. (2012a,b) Little et al. (2012b,a) - -Bibliography - -Little, Bo, and Peep. Diss 1. PhD dissertation, NEU, 2012a. -Little, Bo, and Peep. Diss 2. PhD dissertation, NEU, 2012b. -Little, Bo, Peep, and Peep2. Diss 3. PhD dissertation, NEU, 2012c. diff --git a/scribble-test/tests/scribble/docs/autobib-numbered.scrbl b/scribble-test/tests/scribble/docs/autobib-numbered.scrbl deleted file mode 100644 index 455e68a7..00000000 --- a/scribble-test/tests/scribble/docs/autobib-numbered.scrbl +++ /dev/null @@ -1,57 +0,0 @@ -#lang scribble/manual -@(require scriblib/autobib) - -@(define-cite ~cite citet generate-bibliography - #:style number-style) - -@(define a1 - (make-bib - #:title "One" - #:author "A" - #:date "2012" - #:location "There")) - -@(define a2 - (make-bib - #:title "Two" - #:author "A" - #:date "2012" - #:location "Here")) - -@(define a2x - (make-bib - #:title "Twoish" - #:author "A" - #:date "2012" - #:location "HereX")) - -@(define a3 - (make-bib - #:title "Three" - #:author "A" - #:date "2013" - #:location "Where?")) - -@(define b1 - (make-bib - #:title "Uno" - #:author "B" - #:date "2012" - #:location "Ici")) - -A1@~cite[a1 a2 b1]. - -A1@~cite[a1 a2 a3]. - -@citet[a1 a2 a3]. - -In A2@~cite[(in-bib a2 " p. 17")] - -In A2 and A3@~cite[(in-bib a2 " p. 17") a3] - -In A1 and more@~cite[a1 (in-bib a2 " p. 17") a3] - -B&B@~cite[b1 a1]. - - -@generate-bibliography[] diff --git a/scribble-test/tests/scribble/docs/autobib-numbered.txt b/scribble-test/tests/scribble/docs/autobib-numbered.txt deleted file mode 100644 index 123f2384..00000000 --- a/scribble-test/tests/scribble/docs/autobib-numbered.txt +++ /dev/null @@ -1,20 +0,0 @@ -A1 [1, 2, 4]. - -A1 [1, 2, 3]. - -A [1, 2, 3]. - -In A2 [2 p. 17] - -In A2 and A3 [2 p. 17, 3] - -In A1 and more [1, 2 p. 17, 3] - -B&B [1, 4]. - -Bibliography - -[1]A. One. There, 2012. -[2]A. Two. Here, 2012. -[3]A. Three. Where?, 2013. -[4]B. Uno. Ici, 2012. diff --git a/scribble-test/tests/scribble/docs/autobib-order.scrbl b/scribble-test/tests/scribble/docs/autobib-order.scrbl deleted file mode 100644 index 3d96a0e8..00000000 --- a/scribble-test/tests/scribble/docs/autobib-order.scrbl +++ /dev/null @@ -1,19 +0,0 @@ -#lang scribble/base -@(require scriblib/autobib) -@(define-cite cite citet gen) - -@(define a (make-bib #:title "Diss 1" - #:is-book? #t - #:location (dissertation-location #:institution "NEU") - #:author (authors (author-name "Little Bo" "Peep") (author-name "Samwise" "Gamgee")) - #:date "2012")) -@(define b (make-bib #:title "Diss 2" - #:is-book? #t - #:location (dissertation-location #:institution "NEU") - #:author (authors (author-name "Ayo" "Shucks")) - #:date "2012")) -Order matters. Must sort by last names. -@cite[b] -@cite[a] - -@(gen) diff --git a/scribble-test/tests/scribble/docs/autobib-order.txt b/scribble-test/tests/scribble/docs/autobib-order.txt deleted file mode 100644 index b2e6261a..00000000 --- a/scribble-test/tests/scribble/docs/autobib-order.txt +++ /dev/null @@ -1,7 +0,0 @@ -Order matters. Must sort by last names.  (Shucks 2012)  (Peep and Gamgee -2012) - -Bibliography - -Little Bo Peep and Samwise Gamgee. Diss 1. PhD dissertation, NEU, 2012. -Ayo Shucks. Diss 2. PhD dissertation, NEU, 2012. diff --git a/scribble-test/tests/scribble/docs/autobib.scrbl b/scribble-test/tests/scribble/docs/autobib.scrbl deleted file mode 100644 index 2a4f173a..00000000 --- a/scribble-test/tests/scribble/docs/autobib.scrbl +++ /dev/null @@ -1,32 +0,0 @@ -#lang scribble/base -@(require scriblib/autobib) - -@(define-cite cite citet gen) - -@(define redex - (make-bib - #:author (authors "Matthias Felleisen" "Robert Bruce Findler" "Matthew Flatt") - #:title "Semantics Engineering with PLT Redex" - #:location (book-location #:publisher "MIT Press") - #:is-book? #t - #:date "2010")) - -@(define schelog ; tests that urls work - (make-bib #:title "Programming in Schelog" - #:author "Dorai Sitaram" - #:url "http://www.ccs.neu.edu/~dorai/schelog/schelog.html" - #:date "1993")) - - -@cite[redex] -@cite[(in-bib redex ", part I")] -@cite[(in-bib redex ", part II")] -@cite[redex] - -@cite[schelog] - -@cite[(make-bib #:title "Look ma, no authors")] - -@cite[(make-bib #:title "Look ma, no authors" #:author "And no date")] - -@(gen) diff --git a/scribble-test/tests/scribble/docs/autobib.txt b/scribble-test/tests/scribble/docs/autobib.txt deleted file mode 100644 index 43f236c2..00000000 --- a/scribble-test/tests/scribble/docs/autobib.txt +++ /dev/null @@ -1,17 +0,0 @@ - (Felleisen et al. 2010)  (Felleisen et al. 2010, part I)  (Felleisen et -al. 2010, part II)  (Felleisen et al. 2010) - - (Sitaram 1993) - - (Look ma, no authors ???) - - (date ???) - -Bibliography - -And no date. Look ma, no authors. -Matthias Felleisen, Robert Bruce Findler, and Matthew Flatt. Semantics -Engineering with PLT Redex. MIT Press, 2010. -Look ma, no authors. -Dorai Sitaram. Programming in Schelog. 1993. -http://www.ccs.neu.edu/~dorai/schelog/schelog.html diff --git a/scribble-test/tests/scribble/docs/box-chars.scrbl b/scribble-test/tests/scribble/docs/box-chars.scrbl deleted file mode 100644 index daf2ec1d..00000000 --- a/scribble-test/tests/scribble/docs/box-chars.scrbl +++ /dev/null @@ -1,41 +0,0 @@ -#lang scribble/base - -@;{ This test is mainly intended for checking Latex - rendering of box characters, but it should render - ok with text, too. } - -@(define charss - '((#\┌ #\─ #\┐ #\│ #\└ #\┘ #\┬ #\├ #\┤ #\┼ #\┴) - (#\╔ #\═ #\╗ #\║ #\╚ #\╝ #\╦ #\╠ #\╣ #\╬ #\╩) - (#\┏ #\━ #\┓ #\┃ #\┗ #\┛ #\┳ #\┣ #\┫ #\╋ #\┻))) - -@(define (adj-verbatim which . strs) - (define ht (for/hash ([c1 (in-list (car charss))] - [c2 (in-list (list-ref charss which))]) - (values c1 c2))) - (apply verbatim - (for/list ([s (in-list strs)]) - (list->string - (for/list ([c (in-string s)]) - (hash-ref ht c c)))))) - -@verbatim{ -┌┬─┐ -├┤ │ -└┼─┼┐ - └─┴┘ - } - -@adj-verbatim[1]{ -┌┬─┐ -├┤ │ -└┼─┼┐ - └─┴┘ - } - -@adj-verbatim[2]{ -┌┬─┐ -├┤ │ -└┼─┼┐ - └─┴┘ - } diff --git a/scribble-test/tests/scribble/docs/box-chars.txt b/scribble-test/tests/scribble/docs/box-chars.txt deleted file mode 100644 index 2b69feb8..00000000 --- a/scribble-test/tests/scribble/docs/box-chars.txt +++ /dev/null @@ -1,14 +0,0 @@ -┌┬─┐ -├┤ │ -└┼─┼┐ - └─┴┘ - -╔╦═╗ -╠╣ ║ -╚╬═╬╗ - ╚═╩╝ - -┏┳━┓ -┣┫ ┃ -┗╋━╋┓ - ┗━┻┛ diff --git a/scribble-test/tests/scribble/docs/codeblock-quote.scrbl b/scribble-test/tests/scribble/docs/codeblock-quote.scrbl deleted file mode 100644 index 81a18266..00000000 --- a/scribble-test/tests/scribble/docs/codeblock-quote.scrbl +++ /dev/null @@ -1,10 +0,0 @@ -#lang scribble/manual -@(require (for-label racket/base)) - -@; Make sure this id's typesetting doesn't affect ' below: -@racket[quote] - -@codeblock|{ - @itemlist[#:style 'ordered - @item{Eat cookie.}] - }| diff --git a/scribble-test/tests/scribble/docs/codeblock-quote.txt b/scribble-test/tests/scribble/docs/codeblock-quote.txt deleted file mode 100644 index b87b3a37..00000000 --- a/scribble-test/tests/scribble/docs/codeblock-quote.txt +++ /dev/null @@ -1,4 +0,0 @@ -quote - - @itemlist[#:style 'ordered -           @item{Eat cookie.}] diff --git a/scribble-test/tests/scribble/docs/codeblock-utf8.scrbl b/scribble-test/tests/scribble/docs/codeblock-utf8.scrbl deleted file mode 100644 index 9fa83465..00000000 --- a/scribble-test/tests/scribble/docs/codeblock-utf8.scrbl +++ /dev/null @@ -1,12 +0,0 @@ -#lang scribble/base -@(require scribble/manual) - -@defmodulereader[scribble/manual] - -@codeblock|{ -#lang scribble/manual -(λ x x) -@interaction[1 - - 42] -}| diff --git a/scribble-test/tests/scribble/docs/codeblock-utf8.txt b/scribble-test/tests/scribble/docs/codeblock-utf8.txt deleted file mode 100644 index c5b01f4a..00000000 --- a/scribble-test/tests/scribble/docs/codeblock-utf8.txt +++ /dev/null @@ -1,7 +0,0 @@ - #reader scribble/manual package: scribble-lib - - #lang scribble/manual - (λ x x) - @interaction[1 -   -              42] diff --git a/scribble-test/tests/scribble/docs/cond.scrbl b/scribble-test/tests/scribble/docs/cond.scrbl deleted file mode 100644 index 949b62b1..00000000 --- a/scribble-test/tests/scribble/docs/cond.scrbl +++ /dev/null @@ -1,20 +0,0 @@ -#lang scribble/base -@(require scriblib/render-cond) - -@(cond-element - [text "Text!"] - [html "HTML!"] - [latex "Latex!"] - [markdown "Markdown!"]) - -@(cond-element - [(or text html) "Text or HTML!"] - [else "Latex!"]) - -@(cond-element - [(and text html) "Text and HTML?!"] - [else "Other!"]) - -@(cond-element - [(not text) "Not Text!"] - [else "Text!"]) diff --git a/scribble-test/tests/scribble/docs/cond.txt b/scribble-test/tests/scribble/docs/cond.txt deleted file mode 100644 index 6fc7dfaf..00000000 --- a/scribble-test/tests/scribble/docs/cond.txt +++ /dev/null @@ -1,7 +0,0 @@ -Text! - -Text or HTML! - -Other! - -Text! diff --git a/scribble-test/tests/scribble/docs/decode.scrbl b/scribble-test/tests/scribble/docs/decode.scrbl deleted file mode 100644 index 271cc196..00000000 --- a/scribble-test/tests/scribble/docs/decode.scrbl +++ /dev/null @@ -1,4 +0,0 @@ -#lang scribble/base - -``To make your so--so document look `pretty,' use fancy quotes,'' he -said---with practically audible quotes. diff --git a/scribble-test/tests/scribble/docs/decode.txt b/scribble-test/tests/scribble/docs/decode.txt deleted file mode 100644 index c666d56a..00000000 --- a/scribble-test/tests/scribble/docs/decode.txt +++ /dev/null @@ -1,2 +0,0 @@ -“To make your so–so document look ‘pretty,’ use fancy quotes,” he -said—with practically audible quotes. diff --git a/scribble-test/tests/scribble/docs/diamond.rkt b/scribble-test/tests/scribble/docs/diamond.rkt deleted file mode 100644 index 28a203d0..00000000 --- a/scribble-test/tests/scribble/docs/diamond.rkt +++ /dev/null @@ -1,15 +0,0 @@ -#lang racket/base -(require (only-in scribble/reader make-at-readtable)) - -(provide (rename-out [diamond-read read] - [diamond-read-syntax read-syntax])) - -(define diamond-readtable (make-at-readtable #:command-char #\◇)) - -(define (diamond-read p) - (parameterize ([current-readtable diamond-readtable]) - (read p))) - -(define (diamond-read-syntax name p) - (parameterize ([current-readtable diamond-readtable]) - (read-syntax name p))) diff --git a/scribble-test/tests/scribble/docs/diamond.scrbl b/scribble-test/tests/scribble/docs/diamond.scrbl deleted file mode 100644 index f8a257b8..00000000 --- a/scribble-test/tests/scribble/docs/diamond.scrbl +++ /dev/null @@ -1,14 +0,0 @@ -#lang scribble/base -@#reader "diamond.rkt" - -◇begin{ - - This example checks that @ is not an escape character - if we make a reader that uses a different escape character. - - ◇(define ch "diamond") - - It also makes sure that a non-ASCII character like ◇ch - is ok as an escape character. - - } diff --git a/scribble-test/tests/scribble/docs/diamond.txt b/scribble-test/tests/scribble/docs/diamond.txt deleted file mode 100644 index ef48f8a9..00000000 --- a/scribble-test/tests/scribble/docs/diamond.txt +++ /dev/null @@ -1,5 +0,0 @@ -This example checks that @ is not an escape character if we make a -reader that uses a different escape character. - -It also makes sure that a non-ASCII character like diamond is ok as an -escape character. diff --git a/scribble-test/tests/scribble/docs/empty-onthispage.scrbl b/scribble-test/tests/scribble/docs/empty-onthispage.scrbl deleted file mode 100644 index b155cbf6..00000000 --- a/scribble-test/tests/scribble/docs/empty-onthispage.scrbl +++ /dev/null @@ -1,9 +0,0 @@ -#lang scribble/manual - -@title[#:style '(unnumbered)]{Example} - -Content. - -@section[#:style '(toc unnumbered)]{X} - -@subsection[#:style '(toc-hidden unnumbered)]{A} diff --git a/scribble-test/tests/scribble/docs/empty-onthispage.txt b/scribble-test/tests/scribble/docs/empty-onthispage.txt deleted file mode 100644 index d3b85c98..00000000 --- a/scribble-test/tests/scribble/docs/empty-onthispage.txt +++ /dev/null @@ -1,8 +0,0 @@ -Example - -Content. - -X - -A - diff --git a/scribble-test/tests/scribble/docs/eval-false.scrbl b/scribble-test/tests/scribble/docs/eval-false.scrbl deleted file mode 100644 index fb82995d..00000000 --- a/scribble-test/tests/scribble/docs/eval-false.scrbl +++ /dev/null @@ -1,4 +0,0 @@ -#lang scribble/manual -@(require scribble/eval) - -@examples[#f] diff --git a/scribble-test/tests/scribble/docs/eval-false.txt b/scribble-test/tests/scribble/docs/eval-false.txt deleted file mode 100644 index 426b2c5f..00000000 --- a/scribble-test/tests/scribble/docs/eval-false.txt +++ /dev/null @@ -1,4 +0,0 @@ -Example: - - > #f - #f diff --git a/scribble-test/tests/scribble/docs/eval-special.scrbl b/scribble-test/tests/scribble/docs/eval-special.scrbl deleted file mode 100644 index bcb12e53..00000000 --- a/scribble-test/tests/scribble/docs/eval-special.scrbl +++ /dev/null @@ -1,14 +0,0 @@ -#lang scribble/manual -@(require scribble/eval) - -@interaction[ - (+ 1 2) - (code:line (+ 1 2) (code:comment "three")) - (eval:alts (+ 1 2) 5) - (eval:result @bold{example}) - (eval:alts (+ 1 2) (eval:result @bold{same})) - (eval:alts (+ 1 2) (eval:result @elem{really the same} "Again...")) - (eval:alts (+ 1 2) (eval:result @bold{still the same} "!" "error: too many repeats")) - (eval:alts (+ 1 2) (eval:results (list @racketresult[1] @elem{2} "3") "counting")) -] - diff --git a/scribble-test/tests/scribble/docs/eval-special.txt b/scribble-test/tests/scribble/docs/eval-special.txt deleted file mode 100644 index 418139be..00000000 --- a/scribble-test/tests/scribble/docs/eval-special.txt +++ /dev/null @@ -1,22 +0,0 @@ - > (+ 1 2) - 3 - > (+ 1 2) ; three - 3 - > (+ 1 2) - 5 - > (bold "example") - example - > (+ 1 2) - same - > (+ 1 2) - Again... - really the same - > (+ 1 2) - ! - error: too many repeats - still the same - > (+ 1 2) - counting - 1 - 2 - 3 diff --git a/scribble-test/tests/scribble/docs/examples.scrbl b/scribble-test/tests/scribble/docs/examples.scrbl deleted file mode 100644 index 31f5e9b0..00000000 --- a/scribble-test/tests/scribble/docs/examples.scrbl +++ /dev/null @@ -1,93 +0,0 @@ -#lang scribble/base -@(require scribble/examples) - -@(define shared-eval (make-base-eval)) -@examples[#:hidden #:eval shared-eval "just testing"] - -@examples[ -(+ 1 2) -] - -@examples[ -(+ 3 4) -(string-append "5" - "6") -] - -@examples[ -#:label #f -(+ 2 3) -] - -@examples[ -#:label "Another example:" -(+ 2 4) -] - -@examples[ -#:no-inset -(+ 2 5) -(* 3 4) -] - -@examples[ -#:no-prompt -(+ 2 6) -(* 3 5) -] - -@examples[ -#:result-only -"Just the result."] - -@examples[ -#:preserve-source-locations -(syntax-line (quote-syntax here)) -] - -@examples[ -#:no-result -"don't show the result" -] - -@examples[ -#:lang racket/base -(define x "don't show") -"the result" -] - -@examples[ -(eval:error (/ 1 0)) -] - -@examples[ -(code:line (+ 1 2) (* 3 4)) -] - -@examples[ -(eval:check (+ 1 2) (* 3 1)) -] - -@examples[ -(eval:alts (/ 1 0) +inf.0) -] - -@examples[ -(eval:result "(/ 1 0)") -] - -@examples[ -(eval:result "(/ 1 0)" "getting +inf.0") -] - -@examples[ -(eval:result "(/ 1 0)" "getting +inf.0" "oops") -] - -@examples[ -(eval:alts (/ 100 0) (eval:result "(/ 1 0)" "getting +inf.0" "oops")) -] - -@examples[ -(eval:alts (/ 100 0) (eval:results (list "(/ 1 0)" "'=") "getting +inf.0" "oops")) -] diff --git a/scribble-test/tests/scribble/docs/examples.txt b/scribble-test/tests/scribble/docs/examples.txt deleted file mode 100644 index 6d2b03b3..00000000 --- a/scribble-test/tests/scribble/docs/examples.txt +++ /dev/null @@ -1,100 +0,0 @@ -Example: - - > (+ 1 2) - 3 - -Examples: - - > (+ 3 4) - 7 - > (string-append "5" -                  "6") - "56" - - > (+ 2 3) - 5 - -Another example: - - > (+ 2 4) - 6 - -Examples: - -> (+ 2 5) -7 -> (* 3 4) -12 - -Examples: - - (+ 2 6) - 8 - (* 3 5) - 15 - -"Just the result." - -Example: - - > (syntax-line (quote-syntax here)) - 45 - - "don't show the result" - - #lang racket/base - (define x "don't show") - "the result" - -Example: - - > (/ 1 0) - /: division by zero - -Example: - - > (+ 1 2) (* 3 4) - 12 - -Example: - - > (+ 1 2) - 3 - -Example: - - > (/ 1 0) - +inf.0 - -Example: - - > "(/ 1 0)" - (/ 1 0) - -Example: - - > "(/ 1 0)" - getting +inf.0 - (/ 1 0) - -Example: - - > "(/ 1 0)" - getting +inf.0 - oops - (/ 1 0) - -Example: - - > (/ 100 0) - getting +inf.0 - oops - (/ 1 0) - -Example: - - > (/ 100 0) - getting +inf.0 - oops - (/ 1 0) - '= diff --git a/scribble-test/tests/scribble/docs/figure.scrbl b/scribble-test/tests/scribble/docs/figure.scrbl deleted file mode 100644 index ab443ad9..00000000 --- a/scribble-test/tests/scribble/docs/figure.scrbl +++ /dev/null @@ -1,20 +0,0 @@ -#lang scribble/base -@(require scriblib/figure) - -@title{Waterfowl} - -@figure[ -"one" -"The Figure" -@para{Duck}] - -@figure[ -#:continue? #t -"two" -"More of The Figure" -@para{Duck}] - -@figure[ -"three" -"A Different Figure" -@para{Goose!}] diff --git a/scribble-test/tests/scribble/docs/figure.txt b/scribble-test/tests/scribble/docs/figure.txt deleted file mode 100644 index 85ccafe0..00000000 --- a/scribble-test/tests/scribble/docs/figure.txt +++ /dev/null @@ -1,10 +0,0 @@ -Waterfowl - -Duck -Figure 1: The Figure - -Duck -Figure 1 (continued): More of The Figure - -Goose! -Figure 2: A Different Figure diff --git a/scribble-test/tests/scribble/docs/filebox.scrbl b/scribble-test/tests/scribble/docs/filebox.scrbl deleted file mode 100644 index 3ab95b5d..00000000 --- a/scribble-test/tests/scribble/docs/filebox.scrbl +++ /dev/null @@ -1,12 +0,0 @@ -#lang scribble/manual - -@; An empty filebox -@filebox["zero.txt"] - -@filebox["one.txt"]{ -A file box with one thing in it. -} - -@filebox["two.txt" -(tt "A filebox ") -(tt "with multiple things in it.")] diff --git a/scribble-test/tests/scribble/docs/filebox.txt b/scribble-test/tests/scribble/docs/filebox.txt deleted file mode 100644 index e50efdd5..00000000 --- a/scribble-test/tests/scribble/docs/filebox.txt +++ /dev/null @@ -1,7 +0,0 @@ -"zero.txt" - -"one.txt" -A file box with one thing in it. - -"two.txt" -A filebox with multiple things in it. diff --git a/scribble-test/tests/scribble/docs/footnote.scrbl b/scribble-test/tests/scribble/docs/footnote.scrbl deleted file mode 100644 index dfa908e3..00000000 --- a/scribble-test/tests/scribble/docs/footnote.scrbl +++ /dev/null @@ -1,12 +0,0 @@ -#lang scribble/base -@(require scriblib/footnote) - -@(define-footnote footnote generate-footnotes) - -@title{Document} - -Left.@footnote{A} - -Right.@footnote{A♯} - -@generate-footnotes[] diff --git a/scribble-test/tests/scribble/docs/footnote.txt b/scribble-test/tests/scribble/docs/footnote.txt deleted file mode 100644 index 23f3b1da..00000000 --- a/scribble-test/tests/scribble/docs/footnote.txt +++ /dev/null @@ -1,9 +0,0 @@ -Document - -Left.1A - -Right.2A♯ - -1A - -2A♯ diff --git a/scribble-test/tests/scribble/docs/grouper-sub.scrbl b/scribble-test/tests/scribble/docs/grouper-sub.scrbl deleted file mode 100644 index 28cf7a85..00000000 --- a/scribble-test/tests/scribble/docs/grouper-sub.scrbl +++ /dev/null @@ -1,41 +0,0 @@ -#lang scribble/manual - -@title{Hello} - -@table-of-contents[] - -@section{One} - -@subsection{A Section} - -@subsubsection{A Subsection} - -This is some prose. - -@subsubsection{A Subsection, Revisited} - -This is also some prose. - - -@section{Two} - -@subsection[#:style 'grouper]{Another Section} - -@subsubsection{Another Subsection} - -More prose. - -@subsubsection{Another Subsection, Revisited} - -More prose, also. - -@subsection[#:style 'grouper]{Third Section} - -@subsubsection{Yet Another Subsection} - -Yet more prose. - -@subsubsection{Yet Another Subsection, Revisited} - -Yet more prose, also. - diff --git a/scribble-test/tests/scribble/docs/grouper-sub.txt b/scribble-test/tests/scribble/docs/grouper-sub.txt deleted file mode 100644 index dda44f58..00000000 --- a/scribble-test/tests/scribble/docs/grouper-sub.txt +++ /dev/null @@ -1,48 +0,0 @@ -Hello - -    1 One -      1.1 A Section -        1.1.1 A Subsection -        1.1.2 A Subsection, Revisited - -    2 Two -      2.I Another Section -        2.1 Another Subsection -        2.2 Another Subsection, Revisited -      2.II Third Section -        2.3 Yet Another Subsection -        2.4 Yet Another Subsection, Revisited - -1. One - -1.1. A Section - -1.1.1. A Subsection - -This is some prose. - -1.1.2. A Subsection, Revisited - -This is also some prose. - -2. Two - -2.I. Another Section - -2.1. Another Subsection - -More prose. - -2.2. Another Subsection, Revisited - -More prose, also. - -2.II. Third Section - -2.3. Yet Another Subsection - -Yet more prose. - -2.4. Yet Another Subsection, Revisited - -Yet more prose, also. diff --git a/scribble-test/tests/scribble/docs/grouper.scrbl b/scribble-test/tests/scribble/docs/grouper.scrbl deleted file mode 100644 index f3b8054d..00000000 --- a/scribble-test/tests/scribble/docs/grouper.scrbl +++ /dev/null @@ -1,46 +0,0 @@ -#lang scribble/manual - -@title{Hello} - -@table-of-contents[] - -@section[#:style 'grouper]{One} - -@subsection{A Section} - -@subsubsection{A Subsection} - -This is some prose. - -@subsubsection{A Subsection, Revisited} - -This is also some prose. - - -@section[#:style 'grouper]{Two} - -@subsection{Another Section} - -@subsubsection{Another Subsection} - -More prose. - -@subsubsection[#:style 'unnumbered]{>> Unnumbered Subsection} - -Nothing to see here. - -@subsubsection{Another Subsection, Revisited} - -More prose, also. - -@subsubsection[#:style 'hidden-number]{>> Hidden Number} - -Nothing to see here, either. - -@subsubsection{Last Subsection} - -The last subsection has some prose. - -@subsection[#:style '(hidden toc-hidden)]{} - -This is actually in a hidden section. diff --git a/scribble-test/tests/scribble/docs/grouper.txt b/scribble-test/tests/scribble/docs/grouper.txt deleted file mode 100644 index 7d7ee1b8..00000000 --- a/scribble-test/tests/scribble/docs/grouper.txt +++ /dev/null @@ -1,52 +0,0 @@ -Hello - -    I One -      1 A Section -        1.1 A Subsection -        1.2 A Subsection, Revisited - -    II Two -      2 Another Section -        2.1 Another Subsection -        >> Unnumbered Subsection -        2.2 Another Subsection, Revisited -        >> Hidden Number -        2.4 Last Subsection - -I. One - -1. A Section - -1.1. A Subsection - -This is some prose. - -1.2. A Subsection, Revisited - -This is also some prose. - -II. Two - -2. Another Section - -2.1. Another Subsection - -More prose. - ->> Unnumbered Subsection - -Nothing to see here. - -2.2. Another Subsection, Revisited - -More prose, also. - ->> Hidden Number - -Nothing to see here, either. - -2.4. Last Subsection - -The last subsection has some prose. - -This is actually in a hidden section. diff --git a/scribble-test/tests/scribble/docs/include-section.scrbl b/scribble-test/tests/scribble/docs/include-section.scrbl deleted file mode 100644 index b09b87a2..00000000 --- a/scribble-test/tests/scribble/docs/include-section.scrbl +++ /dev/null @@ -1,6 +0,0 @@ -#lang scribble/base - -@; Check that a macro-introduced `include-section' works: -@(define-syntax-rule (inc) (include-section "diamond.scrbl")) - -@(inc) diff --git a/scribble-test/tests/scribble/docs/include-section.txt b/scribble-test/tests/scribble/docs/include-section.txt deleted file mode 100644 index 2da76d86..00000000 --- a/scribble-test/tests/scribble/docs/include-section.txt +++ /dev/null @@ -1,7 +0,0 @@ -1. - -This example checks that @ is not an escape character if we make a -reader that uses a different escape character. - -It also makes sure that a non-ASCII character like diamond is ok as an -escape character. diff --git a/scribble-test/tests/scribble/docs/itemlist.scrbl b/scribble-test/tests/scribble/docs/itemlist.scrbl deleted file mode 100644 index 9a0b2408..00000000 --- a/scribble-test/tests/scribble/docs/itemlist.scrbl +++ /dev/null @@ -1,10 +0,0 @@ -#lang scribble/base -@(require scribble/decode) - -@itemlist[ - (list @item{a} - (list @item{b})) - @para{c} - @item{d} - (splice (list @item{e} (list @para{f}))) -] diff --git a/scribble-test/tests/scribble/docs/itemlist.txt b/scribble-test/tests/scribble/docs/itemlist.txt deleted file mode 100644 index 29bac4c9..00000000 --- a/scribble-test/tests/scribble/docs/itemlist.txt +++ /dev/null @@ -1,11 +0,0 @@ -* a - -* b - -* c - -* d - -* e - -* f diff --git a/scribble-test/tests/scribble/docs/list-section.scrbl b/scribble-test/tests/scribble/docs/list-section.scrbl deleted file mode 100644 index bbc8a90a..00000000 --- a/scribble-test/tests/scribble/docs/list-section.scrbl +++ /dev/null @@ -1,9 +0,0 @@ -#lang scribble/base - -@title{A} - -@section{B} - -@(list @subsection{C}) - -@(list @subsection{D}) diff --git a/scribble-test/tests/scribble/docs/list-section.txt b/scribble-test/tests/scribble/docs/list-section.txt deleted file mode 100644 index ee3c33c0..00000000 --- a/scribble-test/tests/scribble/docs/list-section.txt +++ /dev/null @@ -1,9 +0,0 @@ -A - -1. B - -1.1. C - - -1.2. D - diff --git a/scribble-test/tests/scribble/docs/lp-comment.scrbl b/scribble-test/tests/scribble/docs/lp-comment.scrbl deleted file mode 100644 index a1795cb8..00000000 --- a/scribble-test/tests/scribble/docs/lp-comment.scrbl +++ /dev/null @@ -1,8 +0,0 @@ -#lang scribble/lp2 - -@chunk[<%> - (code:contract f : number -> number) - 1 (code:comment "The number 1") - code:blank - (code:line (code:hilite 2) (code:quote 3)) -] diff --git a/scribble-test/tests/scribble/docs/lp-comment.txt b/scribble-test/tests/scribble/docs/lp-comment.txt deleted file mode 100644 index 7a91c0e1..00000000 --- a/scribble-test/tests/scribble/docs/lp-comment.txt +++ /dev/null @@ -1,6 +0,0 @@ -<%> ::= - - ; f : number -> number - 1 ; The number 1 -   - 2 (quote 3) diff --git a/scribble-test/tests/scribble/docs/manual-ex.rkt b/scribble-test/tests/scribble/docs/manual-ex.rkt deleted file mode 100644 index 2f3a0b28..00000000 --- a/scribble-test/tests/scribble/docs/manual-ex.rkt +++ /dev/null @@ -1,22 +0,0 @@ -#lang racket/base -(require (for-syntax racket/base)) - -(provide (all-defined-out)) - -(define (f) 10) -(define (g x y) (void)) -(define (h x #:y y) (void)) -(define (i x #:y [y #f]) (void)) -(define (j) (void)) - -(define-syntax-rule (m x) 'x) - -(define-syntax n (lambda (stx) #`(quote #,stx))) - -(define p (make-parameter 10)) -(define q (make-parameter #f)) - -(define-struct pt (x y)) -(struct pn (x y)) - -(define v 10) diff --git a/scribble-test/tests/scribble/docs/manual.scrbl b/scribble-test/tests/scribble/docs/manual.scrbl deleted file mode 100644 index 564d74db..00000000 --- a/scribble-test/tests/scribble/docs/manual.scrbl +++ /dev/null @@ -1,135 +0,0 @@ -#lang scribble/manual -@(require (for-label racket/base - "manual-ex.rkt")) - -@defmodule["manual-ex.rkt" #:packages ("manual-test")] - -@defproc[(f) integer?]{A function.} - -@defproc[(g [x void?] [y void?]) integer?]{A function with two arguments.} - -@defproc[#:kind "function" (h [x void?] [#:y y void?]) integer?]{A ``function'' with a keyword argument.} - -@defproc[(i [x void?] [#:y y void? (void)]) integer?]{A function with an optional keyword argument.} - -@defproc[#:link-target? #f (f) integer?]{A function, again, not a link target.} - -@defproc[#:link-target? #f (f) integer? #:value 10]{A function, again, not a link target, documented to return @racket[10].} - -@defproc[#:link-target? #f (f) integer? #:value (let () - (define x 10) - x)]{ -A function, again, not a link target, documented to return @racket[10] using a definition. -} - -@defproc[#:kind "function" #:link-target? #f (g [x void?]) integer?]{A ``function,'' again, not a link target.} - -@defproc[#:id [i #'j] (i) void?]{Source is @racket[i], documents @racket[j].} - -@defproc*[#:link-target? #f ([(f) integer?] [(g [x void?] [y void?]) void?])]{Functions, yet again.} - - -@defform[(m datum)]{A syntactic form.} - -@defform[#:link-target? #f (m datum)]{A syntactic form, again.} - -@defform[#:kind "macro" #:link-target? #f (m datum)]{A ``macro,'' again.} - -@defform*[#:kind "macro" #:link-target? #f [(m datum) (m same-datum)]]{A ``macro,'' yet again.} - -@defform/none[(m datum)]{Yet again.} - -@defidform[n]{An identifier form.} - -@defidform[#:link-target? #f n]{An identifier form, again.} - -@specform[(m datum)]{Specification of @racket[m].} - - -@defparam[p k integer?]{A parameter} - -@defparam[#:link-target? #f p k integer?]{A parameter, again.} - -@defparam[#:link-target? #f p k integer? #:value 10]{A parameter, again, with a documented default value.} - -@defparam*[#:link-target? #f p k real? integer?]{A parameter, yet again.} - -@defparam*[#:link-target? #f p k real? integer? #:value 10]{A parameter, yet again, with a documented default value.} - -@defboolparam[q on?]{A boolean parameter.} - -@defboolparam[#:link-target? #f q still-on?]{A boolean parameter, again.} - -@defboolparam[#:link-target? #f q still-on? #:value #f]{A boolean parameter, again, with a documented default value.} - - -@defthing[v integer?]{A thing.} - -@defthing[#:link-target? #f v integer?]{A thing, again.} - -@defthing[#:link-target? #f v integer? #:value 10]{A thing, again, with a documented value.} - -@defthing[#:link-target? #f v integer? #:value 12345678901234567890123456789012345678901234567890]{A thing, again, with a documented value that's too wide to fit on one line.} - - -@defstruct[pt ([x real?] [y real?])]{A structure type with extra name.} - -@defstruct*[pn ([x real?] [y real?])]{A structure type.} - -@defstruct*[#:link-target? #f pn ([x real?] [y real?])]{A structure type, again.} - -@defstruct*[#:link-target? #f pn ([x real?] [y real?]) #:transparent]{A transparent structure type, again.} - -@defstruct*[#:link-target? #f pn ([x real?] [y real?]) #:inspector #f]{A transparent structure type, again.} - -@defstruct*[#:link-target? #f pn ([x real?] [y real?]) #:prefab]{A prefab structure type, again.} - -@defstruct*[#:link-target? #f pn ([x real?] [y real?]) #:constructor-name pt]{A structure type with name, again.} - -@defstruct*[#:link-target? #f pn ([x real?] [y real?]) #:extra-constructor-name pt]{A structure type with extra name, again.} - -@defstruct[#:link-target? #f pt ([x real?] [y real?]) #:mutable]{A mutable structure type with extra name, again.} - - -@defmodule["manual-ex0.rkt" #:no-declare #:link-target? #f #:packages ()] -@defmodule["manual-ex0.rkt" #:lang #:no-declare #:link-target? #f #:packages ()] -@defmodule["manual-ex0.rkt" #:reader #:no-declare #:link-target? #f #:packages ()] - -@section{Sub2} -@defmodule["manual-ex2.rkt" #:no-declare #:packages ()] - -@section{Sub2a} -@defmodule*/no-declare[("manual-ex2a.rkt") #:packages ()] - -@section{Sub3} -@defmodule["manual-ex3.rkt" #:lang #:no-declare #:packages ()] - -@section{Sub3a} -@defmodulelang*/no-declare[("manual-ex3a.rkt") #:packages ()] - -@section{Sub4-5} -@defmodule[#:multi ("manual-ex4.rkt" "manual-ex5.rkt") #:packages ()] - -@section{Sub4a-5a} -@defmodule*[("manual-ex4a.rkt" "manual-ex5a.rkt") #:packages ()] - -@section{Sub6} -@defmodule[#:require-form (racket load) "manual-ex6.rkt" #:packages ()] - -@section{Sub6a} -@defmodule*[#:require-form (racket load) ("manual-ex6a.rkt") #:packages ()] - -@section{Sub7} -@defmodule["manual-ex7.rkt" #:use-sources (racket/base) #:packages ()] - -@section{Sub7a} -@defmodule*[("manual-ex7a.rkt") #:use-sources (racket/base) #:packages ()] - -@section{Sub8} -@defmodule["manual-ex8.rkt" #:reader #:packages ()] - -@section{Sub8a} -@defmodulereader["manual-ex8a.rkt" #:packages ()] - -@section{Sub8b} -@defmodulereader*[("manual-ex8b.rkt") #:packages ()] diff --git a/scribble-test/tests/scribble/docs/manual.txt b/scribble-test/tests/scribble/docs/manual.txt deleted file mode 100644 index 5f2ed82e..00000000 --- a/scribble-test/tests/scribble/docs/manual.txt +++ /dev/null @@ -1,278 +0,0 @@ - (require "manual-ex.rkt") package: manual-test - -(f) -> integer? - -A function. - -(g x y) -> integer? -  x : void? -  y : void? - -A function with two arguments. - -(h x #:y y) -> integer? -  x : void? -  y : void? - -A “function” with a keyword argument. - -(i x [#:y y]) -> integer? -  x : void? -  y : void? = (void) - -A function with an optional keyword argument. - -(f) -> integer? - -A function, again, not a link target. - -(f) -> integer? - = 10 - -A function, again, not a link target, documented to return 10. - -(f) -> integer? - = (define x 10) - x - -A function, again, not a link target, documented to return 10 using a -definition. - -(g x) -> integer? -  x : void? - -A “function,” again, not a link target. - -(j) -> void? - -Source is i, documents j. - -(f) -> integer? -(g x y) -> void? -  x : void? -  y : void? - -Functions, yet again. - -(m datum) - -A syntactic form. - -(m datum) - -A syntactic form, again. - -(m datum) - -A “macro,” again. - -(m datum) -(m same-datum) - -A “macro,” yet again. - -(m datum) - -Yet again. - -n - -An identifier form. - -n - -An identifier form, again. - -(m datum) -Specification of m. - -(p) -> integer? -(p k) -> void? -  k : integer? - -A parameter - -(p) -> integer? -(p k) -> void? -  k : integer? - -A parameter, again. - -(p) -> integer? -(p k) -> void? -  k : integer? - = 10 - -A parameter, again, with a documented default value. - -(p) -> integer? -(p k) -> void? -  k : real? - -A parameter, yet again. - -(p) -> integer? -(p k) -> void? -  k : real? - = 10 - -A parameter, yet again, with a documented default value. - -(q) -> boolean? -(q on?) -> void? -  on? : any/c - -A boolean parameter. - -(q) -> boolean? -(q still-on?) -> void? -  still-on? : any/c - -A boolean parameter, again. - -(q) -> boolean? -(q still-on?) -> void? -  still-on? : any/c - = #f - -A boolean parameter, again, with a documented default value. - -v : integer? - -A thing. - -v : integer? - -A thing, again. - -v : integer? = 10 - -A thing, again, with a documented value. - -v : integer? - = 12345678901234567890123456789012345678901234567890 - -A thing, again, with a documented value that’s too wide to fit on one -line. - -(struct pt (x y) -    #:extra-constructor-name make-pt) -  x : real? -  y : real? - -A structure type with extra name. - -(struct pn (x y)) -  x : real? -  y : real? - -A structure type. - -(struct pn (x y)) -  x : real? -  y : real? - -A structure type, again. - -(struct pn (x y) -    #:transparent) -  x : real? -  y : real? - -A transparent structure type, again. - -(struct pn (x y) -    #:transparent) -  x : real? -  y : real? - -A transparent structure type, again. - -(struct pn (x y) -    #:prefab) -  x : real? -  y : real? - -A prefab structure type, again. - -(struct pn (x y) -    #:constructor-name pt) -  x : real? -  y : real? - -A structure type with name, again. - -(struct pn (x y) -    #:extra-constructor-name pt) -  x : real? -  y : real? - -A structure type with extra name, again. - -(struct pt (x y) -    #:extra-constructor-name make-pt -    #:mutable) -  x : real? -  y : real? - -A mutable structure type with extra name, again. - - (require "manual-ex0.rkt") - - #lang "manual-ex0.rkt" - - #reader "manual-ex0.rkt" - -1. Sub2 - - (require "manual-ex2.rkt") - -2. Sub2a - - (require "manual-ex2a.rkt") - -3. Sub3 - - #lang "manual-ex3.rkt" - -4. Sub3a - - #lang "manual-ex3a.rkt" - -5. Sub4-5 - - (require "manual-ex4.rkt") - (require "manual-ex5.rkt") - -6. Sub4a-5a - - (require "manual-ex4a.rkt") - (require "manual-ex5a.rkt") - -7. Sub6 - - (load "manual-ex6.rkt") - -8. Sub6a - - (load "manual-ex6a.rkt") - -9. Sub7 - - (require "manual-ex7.rkt") - -10. Sub7a - - (require "manual-ex7a.rkt") - -11. Sub8 - - #reader "manual-ex8.rkt" - -12. Sub8a - - #reader "manual-ex8a.rkt" - -13. Sub8b - - #reader "manual-ex8b.rkt" diff --git a/scribble-test/tests/scribble/docs/numberer.scrbl b/scribble-test/tests/scribble/docs/numberer.scrbl deleted file mode 100644 index 758aa9eb..00000000 --- a/scribble-test/tests/scribble/docs/numberer.scrbl +++ /dev/null @@ -1,37 +0,0 @@ -#lang scribble/base -@(require scribble/core) - -@(define P (make-numberer (lambda (v parent-number) - (values (list (format "[~a]" v) ; number in brackets - "") ; no separator afterward - (add1 v))) ; increment section number - 1)) @; count from 1 -@(define PL (make-numberer (lambda (v parent-number) - (values (list (if (null? parent-number) - (string v) ; top-level section is uppercase - (string-downcase (string v))) ; nested is lowercase - ",") ; "," as separator - (integer->char (add1 (char->integer v))))) ; increment letter - #\A)) @; count from A - -@(define (P-section . s) (section #:style (style #f (list P)) s)) -@(define (PL-section . s) (section #:style (style #f (list PL)) s)) -@(define (PL-subsection . s) (subsection #:style (style #f (list PL)) s)) - -@title{Two Tracks} - -@P-section{Px} - -@PL-section{Py} - -@PL-section{PLx} - -@P-section{Pz} -@PL-subsection{PL-subx} -@subsection{Normal} -@PL-subsection{PL-suby} - -@PL-section{PLy} - -@PL-section{PLz} -@subsection{Normal2} diff --git a/scribble-test/tests/scribble/docs/numberer.txt b/scribble-test/tests/scribble/docs/numberer.txt deleted file mode 100644 index eeb43267..00000000 --- a/scribble-test/tests/scribble/docs/numberer.txt +++ /dev/null @@ -1,29 +0,0 @@ -Two Tracks - -[1] Px - - -A, Py - - -B, PLx - - -[2] Pz - -[2]a, PL-subx - - -[2]1. Normal - - -[2]b, PL-suby - - -C, PLy - - -D, PLz - -D,1. Normal2 - diff --git a/scribble-test/tests/scribble/docs/print-lines.scrbl b/scribble-test/tests/scribble/docs/print-lines.scrbl deleted file mode 100644 index 20f4fc99..00000000 --- a/scribble-test/tests/scribble/docs/print-lines.scrbl +++ /dev/null @@ -1,21 +0,0 @@ -#lang scribble/manual - -@(require scribble/eval) - -@title{Pretty-Print-Handler Bug Example} - -@(define the-eval (make-base-eval)) -@(interaction-eval - #:eval the-eval - (begin - (require racket/pretty) - (current-print pretty-print-handler))) - -@examples[#:eval the-eval -'((x "positional 1") - (rest ("positional 2" "positional 3")) - (a ()) - (b ("b-arg")) - (c (("first c1" "second c1") ("first c2" "second c2"))) - (d #f) - (e ()))] diff --git a/scribble-test/tests/scribble/docs/print-lines.txt b/scribble-test/tests/scribble/docs/print-lines.txt deleted file mode 100644 index b63c7e9b..00000000 --- a/scribble-test/tests/scribble/docs/print-lines.txt +++ /dev/null @@ -1,18 +0,0 @@ -Pretty-Print-Handler Bug Example - -Example: - - > '((x "positional 1") -       (rest ("positional 2" "positional 3")) -       (a ()) -       (b ("b-arg")) -       (c (("first c1" "second c1") ("first c2" "second c2"))) -       (d #f) -       (e ())) - '((x "positional 1") -   (rest ("positional 2" "positional 3")) -   (a ()) -   (b ("b-arg")) -   (c (("first c1" "second c1") ("first c2" "second c2"))) -   (d #f) -   (e ())) diff --git a/scribble-test/tests/scribble/docs/read-alts.scrbl b/scribble-test/tests/scribble/docs/read-alts.scrbl deleted file mode 100644 index 42f941d8..00000000 --- a/scribble-test/tests/scribble/docs/read-alts.scrbl +++ /dev/null @@ -1,13 +0,0 @@ -#lang scribble/manual -@(require scribble/manual) -@; test that various alternatives in reader syntax get -@; turned into the right things when rendered -@racketblock[#t - #true - #f - #false - (a . < . b) - (< a b) - "abcdef" - ([{}])] - diff --git a/scribble-test/tests/scribble/docs/read-alts.txt b/scribble-test/tests/scribble/docs/read-alts.txt deleted file mode 100644 index 1bf94c16..00000000 --- a/scribble-test/tests/scribble/docs/read-alts.txt +++ /dev/null @@ -1,8 +0,0 @@ - #t - #true - #f - #false - (a . < . b) - (< a b) - "abcdef" - ([{}]) diff --git a/scribble-test/tests/scribble/docs/secref.scrbl b/scribble-test/tests/scribble/docs/secref.scrbl deleted file mode 100644 index 384ac202..00000000 --- a/scribble-test/tests/scribble/docs/secref.scrbl +++ /dev/null @@ -1,36 +0,0 @@ -#lang scribble/base - -@title[#:tag "top"]{Title} - -@section[#:tag "1" #:style 'grouper]{Section One} - -This is @secref["1"] in @secref["top"]. - -See @secref["2"] and @secref["2.1"]. - -See @secref["3"], @secref["3.1"], @secref["3.2"], @secref["3.2.1"], and -@secref["3.3"]. - - -@section[#:tag "2" #:style 'grouper]{Section Two} - -@subsection[#:tag "2.1"]{Section Two.One} - -[content a] - - -@section[#:style '(grouper unnumbered) #:tag "3"]{Section Three} - -@subsection[#:tag "3.1"]{Section Three.One} - -[content b] - -@subsection[#:tag "3.2"]{Section Three.Two} - -@subsubsection[#:tag "3.2.1"]{Section Three.Two.One} - -[content c] - -@subsection[#:tag "3.3" #:style 'unnumbered]{Section Three.Three} - -[content d] diff --git a/scribble-test/tests/scribble/docs/secref.txt b/scribble-test/tests/scribble/docs/secref.txt deleted file mode 100644 index ab7b4256..00000000 --- a/scribble-test/tests/scribble/docs/secref.txt +++ /dev/null @@ -1,32 +0,0 @@ -Title - -I. Section One - -This is Section One in Title. - -See Section Two and Section Two.One. - -See Section Three, Section Three.One, Section Three.Two, Section -Three.Two.One, and Section Three.Three. - -II. Section Two - -1. Section Two.One - -[content a] - -Section Three - -2. Section Three.One - -[content b] - -3. Section Three.Two - -3.1. Section Three.Two.One - -[content c] - -Section Three.Three - -[content d] diff --git a/scribble-test/tests/scribble/docs/secref2.scrbl b/scribble-test/tests/scribble/docs/secref2.scrbl deleted file mode 100644 index 3985fe71..00000000 --- a/scribble-test/tests/scribble/docs/secref2.scrbl +++ /dev/null @@ -1,55 +0,0 @@ -#lang scribble/base - -@title[#:tag "top"]{Title} - -@table-of-contents[] - -@section[#:tag "1"]{Section One} - -This is @secref["1"] in @secref["top"]. - -See @secref["2"] and @secref["2.1"]. - -See @secref["3"], @secref["3.1"], @secref["3.1.1"], @secref["3.2"], -@secref["3.2.1"], and @secref["3.3"]. - -See @secref["4"]. - -See @secref["5"] and @secref["5.1"]. - -@section[#:tag "2"]{Section Two} - -@subsection[#:tag "2.1"]{Section Two.One} - -[content a] - - -@section[#:style '(unnumbered) #:tag "3"]{Section Three} - -@subsection[#:tag "3.1" #:style 'grouper]{Section Three.One} - -@subsubsection[#:tag "3.1.1"]{Section Three.One.One} - -[content b] - -@subsection[#:tag "3.2" #:style 'grouper]{Section Three.Two} - -@subsubsection[#:tag "3.2.1"]{Section Three.Two.One} - -[content c] - -@subsection[#:tag "3.3" #:style '(unnumbered grouper)]{Section Three.Three} - -[content d] - - -@section[#:style '(unnumbered) #:tag "4"]{Section Four} - -[content e] - - -@section[#:tag "5"]{Section Five} - -@subsection[#:tag "5.1"]{Section Five.One} - -[content f] diff --git a/scribble-test/tests/scribble/docs/secref2.txt b/scribble-test/tests/scribble/docs/secref2.txt deleted file mode 100644 index e44443ea..00000000 --- a/scribble-test/tests/scribble/docs/secref2.txt +++ /dev/null @@ -1,65 +0,0 @@ -Title - -    1 Section One - -    2 Section Two -      2.1 Section Two.One - -    Section Three -      I Section Three.One -        1 Section Three.One.One -      II Section Three.Two -        2 Section Three.Two.One -      Section Three.Three - -    Section Four - -    3 Section Five -      3.1 Section Five.One - -1. Section One - -This is Section One in Title. - -See Section Two and Section Two.One. - -See Section Three, Section Three.One, Section Three.One.One, Section -Three.Two, Section Three.Two.One, and Section Three.Three. - -See Section Four. - -See Section Five and Section Five.One. - -2. Section Two - -2.1. Section Two.One - -[content a] - -Section Three - -I. Section Three.One - -1. Section Three.One.One - -[content b] - -II. Section Three.Two - -2. Section Three.Two.One - -[content c] - -Section Three.Three - -[content d] - -Section Four - -[content e] - -3. Section Five - -3.1. Section Five.One - -[content f] diff --git a/scribble-test/tests/scribble/docs/secref3.scrbl b/scribble-test/tests/scribble/docs/secref3.scrbl deleted file mode 100644 index a946dafc..00000000 --- a/scribble-test/tests/scribble/docs/secref3.scrbl +++ /dev/null @@ -1,55 +0,0 @@ -#lang scribble/base - -@title[#:tag "top"]{Title} - -@table-of-contents[] - -@section[#:tag "1"]{Section One} - -This is @secref["1"] in @secref["top"]. - -See @secref["2"] and @secref["2.1"]. - -See @secref["3"], @secref["3.1"], @secref["3.1.1"], @secref["3.2"], -@secref["3.2.1"], and @secref["3.3"]. - -See @secref["4"]. - -See @secref["5"] and @secref["5.1"]. - -@section[#:tag "2"]{Section Two} - -@subsection[#:tag "2.1"]{Section Two.One} - -[content a] - - -@section[#:tag "3"]{Section Three} - -@subsection[#:tag "3.1" #:style 'grouper]{Section Three.One} - -@subsubsection[#:tag "3.1.1"]{Section Three.One.One} - -[content b] - -@subsection[#:tag "3.2" #:style 'grouper]{Section Three.Two} - -@subsubsection[#:tag "3.2.1"]{Section Three.Two.One} - -[content c] - -@subsection[#:tag "3.3" #:style '(unnumbered grouper)]{Section Three.Three} - -[content d] - - -@section[#:style '(unnumbered) #:tag "4"]{Section Four} - -[content e] - - -@section[#:tag "5"]{Section Five} - -@subsection[#:tag "5.1"]{Section Five.One} - -[content f] diff --git a/scribble-test/tests/scribble/docs/secref3.txt b/scribble-test/tests/scribble/docs/secref3.txt deleted file mode 100644 index 6860e292..00000000 --- a/scribble-test/tests/scribble/docs/secref3.txt +++ /dev/null @@ -1,65 +0,0 @@ -Title - -    1 Section One - -    2 Section Two -      2.1 Section Two.One - -    3 Section Three -      3.I Section Three.One -        3.1 Section Three.One.One -      3.II Section Three.Two -        3.2 Section Three.Two.One -      Section Three.Three - -    Section Four - -    4 Section Five -      4.1 Section Five.One - -1. Section One - -This is Section One in Title. - -See Section Two and Section Two.One. - -See Section Three, Section Three.One, Section Three.One.One, Section -Three.Two, Section Three.Two.One, and Section Three.Three. - -See Section Four. - -See Section Five and Section Five.One. - -2. Section Two - -2.1. Section Two.One - -[content a] - -3. Section Three - -3.I. Section Three.One - -3.1. Section Three.One.One - -[content b] - -3.II. Section Three.Two - -3.2. Section Three.Two.One - -[content c] - -Section Three.Three - -[content d] - -Section Four - -[content e] - -4. Section Five - -4.1. Section Five.One - -[content f] diff --git a/scribble-test/tests/scribble/docs/srcdoc.rkt b/scribble-test/tests/scribble/docs/srcdoc.rkt deleted file mode 100644 index d271d675..00000000 --- a/scribble-test/tests/scribble/docs/srcdoc.rkt +++ /dev/null @@ -1,12 +0,0 @@ -#lang racket -(require scribble/srcdoc - (for-doc racket/base - scribble/manual)) - -(provide - (proc-doc f (-> integer?) ["Stuff"]) - (form-doc #:id a #:literals (foo) (expr foo a) ["Returns " (racket expr) "."])) - -(define (f) 5) - -(define-syntax-rule (a x) x) diff --git a/scribble-test/tests/scribble/docs/srcdoc.scrbl b/scribble-test/tests/scribble/docs/srcdoc.scrbl deleted file mode 100644 index 132dc2cf..00000000 --- a/scribble-test/tests/scribble/docs/srcdoc.scrbl +++ /dev/null @@ -1,6 +0,0 @@ -#lang scribble/manual -@(require scribble/extract) - -@defmodule["srcdoc.rkt" #:packages ("manual-test")] - -@(include-extracted "srcdoc.rkt") diff --git a/scribble-test/tests/scribble/docs/srcdoc.txt b/scribble-test/tests/scribble/docs/srcdoc.txt deleted file mode 100644 index 7d1e6649..00000000 --- a/scribble-test/tests/scribble/docs/srcdoc.txt +++ /dev/null @@ -1,9 +0,0 @@ - (require "srcdoc.rkt") package: manual-test - -(f) -> integer? - -Stuff - -(expr foo a) - -Returns expr. diff --git a/scribble-test/tests/scribble/docs/stxobj.scrbl b/scribble-test/tests/scribble/docs/stxobj.scrbl deleted file mode 100644 index 330cdfb3..00000000 --- a/scribble-test/tests/scribble/docs/stxobj.scrbl +++ /dev/null @@ -1,6 +0,0 @@ -#lang scribble/manual -@(require scribble/eval) - -@interaction[ -(syntax-e #'(+ 1 2)) -] diff --git a/scribble-test/tests/scribble/docs/stxobj.txt b/scribble-test/tests/scribble/docs/stxobj.txt deleted file mode 100644 index bab5ef76..00000000 --- a/scribble-test/tests/scribble/docs/stxobj.txt +++ /dev/null @@ -1,2 +0,0 @@ - > (syntax-e #'(+ 1 2)) - '(# # #) diff --git a/scribble-test/tests/scribble/docs/table-border.scrbl b/scribble-test/tests/scribble/docs/table-border.scrbl deleted file mode 100644 index cab4b72c..00000000 --- a/scribble-test/tests/scribble/docs/table-border.scrbl +++ /dev/null @@ -1,9 +0,0 @@ -#lang scribble/base -@(require scribble/decode) - -@(define sub-table (tabular #:row-properties (list null '(border)) - '(("B" "B2") ("T" cont)))) - -@tabular[#:column-properties (list null '(border) '(bottom-border right-border)) - (list (list "Apple" sub-table "Cat") (list "C" "D" "Elephant")) -] diff --git a/scribble-test/tests/scribble/docs/table-border.txt b/scribble-test/tests/scribble/docs/table-border.txt deleted file mode 100644 index 1341cabc..00000000 --- a/scribble-test/tests/scribble/docs/table-border.txt +++ /dev/null @@ -1,8 +0,0 @@ - -------- -Apple| B B2 |Cat | - |------| | - ||T || | - |------| | - ----------------- -C |D |Elephant| - ----------------- diff --git a/scribble-test/tests/scribble/docs/table.scrbl b/scribble-test/tests/scribble/docs/table.scrbl deleted file mode 100644 index f2410b95..00000000 --- a/scribble-test/tests/scribble/docs/table.scrbl +++ /dev/null @@ -1,24 +0,0 @@ -#lang scribble/manual - -@(tabular #:column-properties (list 'left 'center 'right) - #:sep "-" - (list (list "A" "B" "C" "D") - (list "apple" "banana" "coconut" "donut"))) - - -@(tabular #:cell-properties (list (list 'right 'center 'left) - (list)) - #:sep "-" - (list (list "A" "B" "C" "D") - (list "apple" "banana" "coconut" "donut") - (list "a" "b" "c" "d"))) - -@(tabular #:column-properties (list '() '() 'left) - #:cell-properties (list (list 'right 'center '())) - #:sep "-" - (list (list "A" "B" "C" "D") - (list "apple" "banana" "coconut" "donut"))) - -@(tabular #:sep "-" - (list (list "A" 'cont "C" 'cont 'cont) - (list "apple" "banana" "coconut" "donut" "eclair"))) diff --git a/scribble-test/tests/scribble/docs/table.txt b/scribble-test/tests/scribble/docs/table.txt deleted file mode 100644 index 2d5d2837..00000000 --- a/scribble-test/tests/scribble/docs/table.txt +++ /dev/null @@ -1,12 +0,0 @@ -A - B - C- D -apple-banana-coconut-donut - - A- B -C -D -apple-banana-coconut-donut -a -b -c -d - - A- B -C -D -apple-banana-coconut-donut - -A -C -apple-banana-coconut-donut-eclair diff --git a/scribble-test/tests/scribble/docs/tech.scrbl b/scribble-test/tests/scribble/docs/tech.scrbl deleted file mode 100644 index 1d78262e..00000000 --- a/scribble-test/tests/scribble/docs/tech.scrbl +++ /dev/null @@ -1,27 +0,0 @@ -#lang scribble/manual - -Check case and ``s'' normalization: -Here is @deftech{apple}. -@tech{Apples} are great! -We all like the -@techlink[#:key "APPLE"]{fruit of an apple tree}. - -Check case and ``ies'' normalization: -Here is @deftech{cherry}. -@tech{CHERRIES} are great! - -Check non-normalization: -Here is @deftech[#:normalize? #f]{egGPlant}. -No one likes @tech[#:normalize? #f]{egGPlant}. -It's the @techlink[#:key "egGPlant" #:normalize? #f]{fruit of an egGPlant plant}. -Here is @deftech[#:normalize? #f]{EGgpLANT}, -which is completely different. - -Check space and hyphen normalization: -Here is @deftech{granola bar}. -A @tech{granola-bar} breakfast is good enough. -A @tech{granola--bar} combination is close enough. -You can eat a spacey @tech{granola bar}, too. - - - diff --git a/scribble-test/tests/scribble/docs/tech.txt b/scribble-test/tests/scribble/docs/tech.txt deleted file mode 100644 index eb99d000..00000000 --- a/scribble-test/tests/scribble/docs/tech.txt +++ /dev/null @@ -1,12 +0,0 @@ -Check case and “s” normalization: Here is apple. Apples are great! We -all like the fruit of an apple tree. - -Check case and “ies” normalization: Here is cherry. CHERRIES are great! - -Check non-normalization: Here is egGPlant. No one likes egGPlant. It’s -the fruit of an egGPlant plant. Here is EGgpLANT, which is completely -different. - -Check space and hyphen normalization: Here is granola bar. A granola-bar -breakfast is good enough. A granola–bar combination is close enough. You -can eat a spacey granola bar, too. diff --git a/scribble-test/tests/scribble/docs/text.scrbl b/scribble-test/tests/scribble/docs/text.scrbl deleted file mode 100644 index 051cfbbf..00000000 --- a/scribble-test/tests/scribble/docs/text.scrbl +++ /dev/null @@ -1,76 +0,0 @@ -#lang scribble/manual -@(require (for-label racket/base)) - -@title{Document} - -This document exercises various constructs to check text output. - -@section{Part A} - -Scribble is a collection of tools for creating prose documents---papers, books, library documentation, etc.---in HTML or PDF (via Latex) -form. More generally, Scribble helps you -write programs that are rich -in textual content, whether the content is prose to be typeset or any -other form of text to be generated -programmatically. - -@subsection{A Subsection} - -Here's some Racket code: - -@racketblock[ - (define half (lambda (x) - (x x))) - (x x) -] - -@subsection{Another Subsection} - -@defmodule[racket/base] - -@defproc[(cons [car (or/c #f - other?)] - [cdr any?]) - stuff?]{ - -Ok?} - -@section{B} - - @itemlist[ - - @item{Run - @commandline{scribble --pdf mouse.scrbl} - to generate PDF as @filepath{mouse.pdf}. This will - work only if you have @exec{pdflatex} installed. - If you'd like to see the intermediate Latex, try - @commandline{scribble --latex mouse.scrbl} - to generate @filepath{mouse.tex}.} - - @item{Run - @commandline{scribble --html mouse.scrbl} - to generate HTML as @filepath{mouse.html}. You may - notice that the apostrophe in ``he's'' turned into a - curly apostrophe.} - - @item{Run - @commandline{scribble --htmls mouse.scrbl} - to generate HTML as @filepath{mouse/index.html}. - Sub-sections (which we add next) will appear as separate - HTML files in the @filepath{mouse} directory.} - - ] - -Run the @exec{scribble} command(s) from the old section -again. You may notice the curly double-quotes in the output, and -the @litchar{---} turned into an em dash. - -@section{C} - -@subsection{Inside C} - -Section C had no text before its subsections. - -@subsection{Inside C, Again} - -But the subsections have text. diff --git a/scribble-test/tests/scribble/docs/text.txt b/scribble-test/tests/scribble/docs/text.txt deleted file mode 100644 index 5d481d97..00000000 --- a/scribble-test/tests/scribble/docs/text.txt +++ /dev/null @@ -1,71 +0,0 @@ -Document - -This document exercises various constructs to check text output. - -1. Part A - -Scribble is a collection of tools for creating prose documents—papers, -books, library documentation, etc.—in HTML or PDF (via Latex) form. More -generally, Scribble helps you write programs that are rich in textual -content, whether the content is prose to be typeset or any other form of -text to be generated programmatically. - -1.1. A Subsection - -Here’s some Racket code: - - (define half (lambda (x) -                (x x))) - (x x) - -1.2. Another Subsection - - (require racket/base) package: base - -(cons car cdr) -> stuff? -  car : (or/c #f -       other?) -  cdr : any? - -Ok? - -2. B - -* Run - -   scribble --pdf mouse.scrbl - - to generate PDF as "mouse.pdf". This will work only if you have - pdflatex installed. If you’d like to see the intermediate Latex, try - -   scribble --latex mouse.scrbl - - to generate "mouse.tex". - -* Run - -   scribble --html mouse.scrbl - - to generate HTML as "mouse.html". You may notice that the apostrophe - in “he’s” turned into a curly apostrophe. - -* Run - -   scribble --htmls mouse.scrbl - - to generate HTML as "mouse/index.html". Sub-sections (which we add - next) will appear as separate HTML files in the "mouse" directory. - -Run the scribble command(s) from the old section again. You may notice -the curly double-quotes in the output, and the --- turned into an em -dash. - -3. C - -3.1. Inside C - -Section C had no text before its subsections. - -3.2. Inside C, Again - -But the subsections have text. diff --git a/scribble-test/tests/scribble/docs/traverse.scrbl b/scribble-test/tests/scribble/docs/traverse.scrbl deleted file mode 100644 index f5e8bf48..00000000 --- a/scribble-test/tests/scribble/docs/traverse.scrbl +++ /dev/null @@ -1,41 +0,0 @@ -#lang scribble/base -@(require scribble/core) - -@(traverse-element - (lambda (get set) - ;; Not delayed, and so result is "not ready, yet" - (get 'glossary "not ready, yet"))) - -@(traverse-element - (lambda (get set) - ;; Delayed until second traversal: - (lambda (get set) - (get 'glossary "BROKEN")))) - -@; Same thing, but with blocks: - -@(traverse-block - (lambda (get set) - ;; Not delayed: - (para "The glossary is " - (get 'glossary "not ready, yet")))) - -@(traverse-block - (lambda (get set) - ;; Delayed: - (lambda (get set) - (para "The glossary is " - (get 'glossary "BROKEN"))))) - -@(traverse-block - (lambda (get set) - ;; Adding a `delayed-block' doesn't delay: - (traverse-block - (lambda (get set) - (para "The glossary is " - (get 'glossary "not ready, yet")))))) - -@(traverse-block - (lambda (get set) - (set 'glossary "ready") - (para "Here is the glossary."))) diff --git a/scribble-test/tests/scribble/docs/traverse.txt b/scribble-test/tests/scribble/docs/traverse.txt deleted file mode 100644 index 06ca4e03..00000000 --- a/scribble-test/tests/scribble/docs/traverse.txt +++ /dev/null @@ -1,11 +0,0 @@ -not ready, yet - -ready - -The glossary is not ready, yet - -The glossary is ready - -The glossary is not ready, yet - -Here is the glossary. diff --git a/scribble-test/tests/scribble/docs/verbatim.scrbl b/scribble-test/tests/scribble/docs/verbatim.scrbl deleted file mode 100644 index 443782e7..00000000 --- a/scribble-test/tests/scribble/docs/verbatim.scrbl +++ /dev/null @@ -1,39 +0,0 @@ -#lang scribble/base - -@verbatim{One fish.} - -@verbatim{ - One fish. - Two fish. -} - -@verbatim[#:indent 3]{ - One fish. - Two fish. -} - -@verbatim[#:indent 3]{ - One fish. - Two fish. - @bold{Red} fish. -} - -@verbatim[#:indent 3]|{ - One fish. - Two fish. - @bold{Red} fish. -}| - -@verbatim[#:indent 3]|{ - One fish. - Two fish. - |@bold{Red} fish. -}| - -@verbatim[@bold{One fish.} "\nTwo fish."] - -@verbatim["One fish\n" @bold{Two fish.}] - -@verbatim[@bold{One fish.}] - -@verbatim["One fish\n" @bold{Two fish.} "\nRed fish."] diff --git a/scribble-test/tests/scribble/docs/verbatim.txt b/scribble-test/tests/scribble/docs/verbatim.txt deleted file mode 100644 index c2887912..00000000 --- a/scribble-test/tests/scribble/docs/verbatim.txt +++ /dev/null @@ -1,31 +0,0 @@ -One fish. - -One fish. -Two fish. - -   One fish. -   Two fish. - -   One fish. -   Two fish. -   Red fish. - -   One fish. -   Two fish. -   @bold{Red} fish. - -   One fish. -   Two fish. -   Red fish. - -One fish. -Two fish. - -One fish -Two fish. - -One fish. - -One fish -Two fish. -Red fish. diff --git a/scribble-test/tests/scribble/docs/wrap.scrbl b/scribble-test/tests/scribble/docs/wrap.scrbl deleted file mode 100644 index 4df4cbac..00000000 --- a/scribble-test/tests/scribble/docs/wrap.scrbl +++ /dev/null @@ -1,20 +0,0 @@ -#lang scribble/manual -@(require (for-label racket/base)) - -@title{Document} - -@itemlist[ - @item{WHEN Zarathustra was thirty years old, he left his home and the - lake of his home, and went into the mountains. There he enjoyed his - xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx - spirit and his solitude, and for ten years did not weary of it. But - at last his heart changed, - and rising one morning with the rosy - dawn, he went before the sun, and spake thus unto it: Thou great - star! What would be thy happiness if thou hadst not those for whom - thou shinest!}] - -Some text xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx@; -xxxxxxxxxxxxxxx some more text - - x xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx@; -xxxxxxxxxxxxxxx blah blah diff --git a/scribble-test/tests/scribble/docs/wrap.txt b/scribble-test/tests/scribble/docs/wrap.txt deleted file mode 100644 index 9686a568..00000000 --- a/scribble-test/tests/scribble/docs/wrap.txt +++ /dev/null @@ -1,18 +0,0 @@ -Document - -* WHEN Zarathustra was thirty years old, he left his home and the lake - of his home, and went into the mountains. There he enjoyed his - xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx - spirit and his solitude, and for ten years did not weary of it. But - at last his heart changed, - and rising one morning with the rosy - dawn, he went before the sun, and spake thus unto it: Thou great star! - What would be thy happiness if thou hadst not those for whom thou - shinest! - -Some text -xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -some more text - -x -xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -blah blah diff --git a/scribble-test/tests/scribble/eval.rkt b/scribble-test/tests/scribble/eval.rkt deleted file mode 100644 index e303ad9e..00000000 --- a/scribble-test/tests/scribble/eval.rkt +++ /dev/null @@ -1,71 +0,0 @@ -#lang racket/base -(require scribble/eval scribble/core rackunit racket/match) - -(check-not-exn (λ () (make-base-eval))) -(check-not-exn (λ () (make-base-eval #:pretty-print? #t #:lang 'racket/base))) -(check-not-exn (λ () (make-base-eval #:pretty-print? #t #:lang 'racket))) -(check-not-exn (λ () (make-base-eval #:pretty-print? #t #:lang 'typed/racket))) -(check-not-exn (λ () (make-base-eval #:pretty-print? #t #:lang 'lazy))) -(check-not-exn (λ () (make-base-eval #:pretty-print? #f #:lang 'racket/base))) -(check-not-exn (λ () (make-base-eval #:pretty-print? #f #:lang 'racket))) -(check-not-exn (λ () (make-base-eval #:pretty-print? #f #:lang 'typed/racket))) -(check-not-exn (λ () (make-base-eval #:pretty-print? #f #:lang 'lazy))) - -(check-not-exn (λ () ((make-base-eval-factory '() #:pretty-print? #t)))) -(check-not-exn (λ () ((make-base-eval-factory '() #:pretty-print? #t #:lang 'racket/base)))) -(check-not-exn (λ () ((make-base-eval-factory '() #:pretty-print? #t #:lang 'racket)))) -(check-not-exn (λ () ((make-base-eval-factory '() #:pretty-print? #t #:lang 'typed/racket)))) -(check-not-exn (λ () ((make-base-eval-factory '() #:pretty-print? #t #:lang 'lazy)))) - -(check-not-exn (λ () ((make-eval-factory '() #:pretty-print? #t)))) -(check-not-exn (λ () ((make-eval-factory '() #:pretty-print? #t #:lang 'racket/base)))) -(check-not-exn (λ () ((make-eval-factory '() #:pretty-print? #t #:lang 'racket)))) -(check-not-exn (λ () ((make-eval-factory '() #:pretty-print? #t #:lang 'typed/racket)))) -(check-not-exn (λ () ((make-eval-factory '() #:pretty-print? #t #:lang 'lazy)))) - -(define (get-result-blocks nf) - (match (nested-flow-blocks nf) [(list (table _ (list _ res))) res])) - -(define filter-datum '(define (filter p? lst) - (if (null? lst) - null - (let ([x (car lst)]) - (if (p? x) - (cons x (filter p? (cdr lst))) - (filte p? (cdr lst))))))) -;; check that pretty printing is working -(define pp-blocks - (car - (get-result-blocks - (interaction #:eval (make-base-eval #:pretty-print? #t #:lang 'racket) - '(define (filter p? lst) - (if (null? lst) - null - (let ([x (car lst)]) - (if (p? x) - (cons x (filter p? (cdr lst))) - (filter p? (cdr lst)))))))))) -(check-true (table? pp-blocks)) ; multiple line result gets put in a table of paragraphs -(check-equal? (length (table-blockss pp-blocks)) 5) ;; pretty printed into 5 lines - -(define non-pp-blocks - (car - (get-result-blocks - (interaction #:eval (make-base-eval #:pretty-print? #f #:lang 'racket) - '(define (filter p? lst) - (if (null? lst) - null - (let ([x (car lst)]) - (if (p? x) - (cons x (filter p? (cdr lst))) - (filter p? (cdr lst)))))))))) -(check-true (paragraph? non-pp-blocks)) ;; single line result is just 1 paragraph - -;; check that different evaluators do not share a single namespace -(define e1 (make-base-eval)) -(define e2 (make-base-eval)) -(check-exn exn:fail:contract:variable? (λ () (e1 '(current-date)))) -(check-exn exn:fail:contract:variable? (λ () (e2 '(current-date)))) -(e1 '(require racket/date)) -(check-not-exn (λ () (e1 '(current-date)))) -(check-exn exn:fail:contract:variable? (λ () (e2 '(current-date)))) diff --git a/scribble-test/tests/scribble/exe.rkt b/scribble-test/tests/scribble/exe.rkt deleted file mode 100644 index a36018e1..00000000 --- a/scribble-test/tests/scribble/exe.rkt +++ /dev/null @@ -1,33 +0,0 @@ -#lang racket/base -(require racket/file - compiler/embed - racket/system) - -;; Check that `scribble/manual` can be embedded in an executable - -(define src (make-temporary-file)) -(define exe (make-temporary-file)) - -(call-with-output-file src - #:exists 'truncate - (lambda (o) - (write '(module m racket/base - (require scribble/manual)) - o))) - -(define mod-sym (string->symbol - (format "~a" - (let-values ([(base name dir?) - (split-path src)]) - (path->bytes (path-replace-suffix name #"")))))) - -(create-embedding-executable exe - #:cmdline '("-U") - #:collects-path null - #:modules `((#f ,src)) - #:configure-via-first-module? #t - #:literal-expression - (parameterize ([current-namespace (make-base-namespace)]) - (compile `(namespace-require '',mod-sym)))) - -(system* exe) diff --git a/scribble-test/tests/scribble/main.rkt b/scribble-test/tests/scribble/main.rkt deleted file mode 100644 index cb542ae1..00000000 --- a/scribble-test/tests/scribble/main.rkt +++ /dev/null @@ -1,14 +0,0 @@ -#lang racket/base - -(require tests/eli-tester - "reader.rkt" "text-collect.rkt" "text-lang.rkt" "text-wrap.rkt" - "docs.rkt" "render.rkt" "xref.rkt" "markdown.rkt") - -(test do (reader-tests) - do (begin/collect-tests) - do (text-lang-tests) - do (wrap-tests) - do (docs-tests) - do (render-tests) - do (xref-tests) - do (markdown-tests)) diff --git a/scribble-test/tests/scribble/markdown-docs/example.md b/scribble-test/tests/scribble/markdown-docs/example.md deleted file mode 100644 index bcb599d0..00000000 --- a/scribble-test/tests/scribble/markdown-docs/example.md +++ /dev/null @@ -1,98 +0,0 @@ -# Title - -## 1. Section - -This is a top-level section. - -### 1.1. Subsection - -This is a subsection. - -#### 1.1.1. Subsubsection - -This is a subsubsection. - -Here is an itemize: - -* Item 1. - -* Item 2. - -Here is a hyperlink: - -[I am a hyperlink to Racket.](http://racket-lang.org/) - -[I am a **Bold** hyperlink to Racket.](http://racket-lang.org/) - -[I am a **Bold** hyperlink to Racket with \[wacky characters\]\(blah -blah\).](http://racket-lang.org/) - -_Italic_. \_Just underlines\_. - -**Bold**. \*Just asterisks.\* - -“Dobule quoted”. ‘Single quoted’. - -This should NOT be ‘code‘ in Markdown. - -Example of vebatim: - -`Hi, world.` -`A “quote”.` -`Second line.` -`Last line.` - -Another example of verbatim, with ticks/quotes: - -`THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS` -`“AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT` -`LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR` -`A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT` -`HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,` -`SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT` -`LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,` -`DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY` -`THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT` -`(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE` -`OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.` - -Example of a defmodule: - -```racket - (require racket/string) -``` - -Example of a defproc: - -```racket -(make-string k [char]) -> string? - k : exact-nonnegative-integer? - char : char? = #\nul -``` - -Returns a new mutable string of length `k` where each position in the -string is initialized with the character `char` - -Blah blah `(or/c string? bytes?)`. - -Example of Scribble `examples`: - -Examples: - -```racket -> (define x 0) -> (displayln x) -0 -``` - -Example of Scribble `interaction`: - -```racket -> (define x 0) -> x -0 -``` - -> Note: This is a note. Let’s make it long enough that the markdown output -> will have to line-wrap, to make sure the > mark starts each line -> properly. diff --git a/scribble-test/tests/scribble/markdown-docs/example.scrbl b/scribble-test/tests/scribble/markdown-docs/example.scrbl deleted file mode 100644 index 4f938b52..00000000 --- a/scribble-test/tests/scribble/markdown-docs/example.scrbl +++ /dev/null @@ -1,104 +0,0 @@ -#lang scribble/manual - -@(require scribble/eval - (for-label racket/base racket/contract racket/string)) -@(define my-eval (make-base-eval)) -@(my-eval '(require racket/base)) - -@title{Title} - -@section{Section} - -This is a top-level section. - -@subsection{Subsection} - -This is a subsection. - -@subsubsection{Subsubsection} - -This is a subsubsection. - -Here is an itemize: - -@itemize[ -@item{Item 1.} -@item{Item 2.} -] - -Here is a hyperlink: - -@hyperlink["http://racket-lang.org/" "I am a hyperlink to Racket."] - -@hyperlink["http://racket-lang.org/"]{I am a @bold{Bold} hyperlink to Racket.} - -@hyperlink["http://racket-lang.org/"]{I am a @bold{Bold} hyperlink to Racket with [wacky characters](blah blah).} - -@italic{Italic}. -_Just underlines_. - -@bold{Bold}. -*Just asterisks.* - -``Dobule quoted''. -`Single quoted'. - -This should NOT be `code` in Markdown. - -Example of vebatim: - -@verbatim{ -Hi, world. -A ``quote''. -Second line. -Last line. -} - -Another example of verbatim, with ticks/quotes: - -@verbatim{ -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -} - -Example of a defmodule: - -@defmodule[racket/string #:packages ()] - -Example of a defproc: - -@defproc[(make-string [k exact-nonnegative-integer?][char char? #\nul]) string?]{ - -Returns a new mutable string of length @racket[k] where each position in the -string is initialized with the character @racket[char] - -Blah blah @racket[(or/c string? bytes?)]. - -} - -Example of Scribble @racket[examples]: - -@examples[#:eval my-eval -(define x 0) -(displayln x) -] - -Example of Scribble @racket[interaction]: - -@interaction[#:eval my-eval -(define x 0) -x -] - -@margin-note{Note: This is a note. Let's make it long enough that the -markdown output will have to line-wrap, to make sure the > mark starts -each line properly.} diff --git a/scribble-test/tests/scribble/markdown.rkt b/scribble-test/tests/scribble/markdown.rkt deleted file mode 100644 index 8cc7dd70..00000000 --- a/scribble-test/tests/scribble/markdown.rkt +++ /dev/null @@ -1,53 +0,0 @@ -#lang racket/base - -;; Use text renderer to check some Scribble functionality - -(require scribble/base-render (prefix-in markdown: scribble/markdown-render) - racket/file racket/class racket/runtime-path tests/eli-tester) - -(define-runtime-path source-dir "markdown-docs") -(define work-dir (build-path (find-system-path 'temp-dir) - "scribble-docs-tests")) - -(define (build-markdown-doc src-file dest-file) - (let* ([renderer (new (markdown:render-mixin render%) [dest-dir work-dir])] - [docs (list (dynamic-require src-file 'doc))] - [fns (list (build-path work-dir dest-file))] - [fp (send renderer traverse docs fns)] - [info (send renderer collect docs fns fp)] - [r-info (send renderer resolve docs fns info)]) - (send renderer render docs fns r-info) - (send renderer get-undefined r-info))) - -(provide markdown-tests) -(module+ main (markdown-tests)) -(define (markdown-tests) - (when (or (file-exists? work-dir) (directory-exists? work-dir)) - (delete-directory/files work-dir)) - (dynamic-wind - (λ() (make-directory work-dir)) - (λ() - (define files (map path-element->string (directory-list source-dir))) - (test do - (for ([scrbl (in-list files)] - #:when (regexp-match? #rx"\\.scrbl$" scrbl) - [md (in-value (regexp-replace #rx"\\.scrbl$" scrbl ".md"))] - #:when (member md files)) - ;; (printf "Testing ~s -> ~s\n" scrbl md) - (define src-file (build-path source-dir scrbl)) - (define expect-file (build-path source-dir md)) - (define generated-file (build-path work-dir "gen.md")) - (define (contents file) - (regexp-replace #rx"\n+$" (file->string file) "")) - (define undefineds (build-markdown-doc src-file "gen.md")) - (for ([u (in-list undefineds)]) - (when (eq? 'tech (car u)) - (test #:failure-message - (format "undefined tech: ~e" u) - #f))) - (test #:failure-message - (format - "mismatch for: \"~a\", expected text in: \"~a\", got:\n~a" - scrbl md (contents generated-file)) - (string=? (contents expect-file) (contents generated-file)))))) - (λ() (delete-directory/files work-dir)))) diff --git a/scribble-test/tests/scribble/reader.rkt b/scribble-test/tests/scribble/reader.rkt deleted file mode 100644 index 5b225963..00000000 --- a/scribble-test/tests/scribble/reader.rkt +++ /dev/null @@ -1,966 +0,0 @@ -#lang racket/base - -(require tests/eli-tester (prefix-in scr: scribble/reader) racket/list) - -(define the-tests #<-> marks a kind of reader test -;; (put on a new line if whitespace matters) -;; * lines with semicolon comments flushed at the left column ignored, - ---- -;; -------------------- simple uses, test identifiers ---- -@foo -@-> foo ---- -@foo{} -@-> (foo) ---- -@foo[] -@-> (foo) ---- -@foo[]{} -@-> (foo) ---- -foo@ -@-> foo@ ---- -fo@o -@-> fo@o ---- -\@foo -@-> @foo ---- -|@foo| -@-> @foo ---- -@foo@bar -@-> foo@bar ---- -@foo@bar. -@-> foo@bar. ---- -@foo@bar: -@-> foo@bar: ---- -@foo@bar; -@-> foo@bar ---- -@foo[]@bar{} -@-> (foo) (bar) ---- -@foo{foo@|bar|.} --@-> -(foo "foo" bar ".") ---- -@foo{foo@bar;} --@-> -(foo "foo" bar ";") ---- -(define |@foo| '\@bar@baz) -@-> (define @foo '@bar@baz) ---- -@foo{foo@2.} --@-> -(foo "foo" 2.0) ---- -;; -------------------- simple args and texts ---- -@foo{bar} -@-> (foo "bar") ---- -@foo[]{bar} -@-> (foo "bar") ---- -@foo[bar] -@-> (foo bar) ---- -@foo[bar]{} -@-> (foo bar) ---- -@foo[bar][baz] -@-> (foo bar) [baz] ---- -@foo[bar]{baz} -@-> (foo bar "baz") ---- -@foo[bar]{baz}[blah] -@-> (foo bar "baz") [blah] ---- -@foo[bar]{baz}@foo[blah] -@-> (foo bar "baz") (foo blah) ---- -@foo[#:x y]{bar} -@-> (foo #:x y "bar") ---- -@foo[1 (* 2 3)]{bar} -@-> (foo 1 (* 2 3) "bar") ---- -@foo[@bar{...}]{blah} --@-> -(foo (bar "...") "blah") ---- -;; -------------------- no exprs or text ---- -@{} -@-> () ---- -@[] -@-> () ---- -@{foo} -@-> ("foo") ---- -@[foo] -@-> (foo) ---- -@{@foo bar} -@-> (foo " bar") ---- -@|{blah}| -@-> ("blah") ---- -@|{blah|@foo bleh}| -@-> ("blah" foo " bleh") ---- -@|{|@meh blah|@foo bleh}| -@-> (meh " blah" foo " bleh") ---- -;; -------------------- newlines and spaces in text ---- -@foo{bar baz} -@-> (foo "bar baz") ---- -@foo{bar baz} -@-> (foo "bar baz") ---- -@foo{ bar } -@-> (foo " bar ") ---- -@foo{ bar } -@-> (foo " bar ") ---- -@foo{ } -@-> (foo " ") ---- -@foo{ } -@-> (foo " ") ---- -@foo[1]{bar baz} -@-> (foo 1 "bar baz") ---- -@foo[1]{bar baz} -@-> (foo 1 "bar baz") ---- -@foo[1]{ bar } -@-> (foo 1 " bar ") ---- -@foo[1]{ bar } -@-> (foo 1 " bar ") ---- -@foo[1]{ } -@-> (foo 1 " ") ---- -@foo[1]{ } -@-> (foo 1 " ") ---- -@foo{bar baz - blah} --@-> -(foo "bar baz" "\n" "blah") ---- -@foo[1]{bar baz - blah} --@-> -(foo 1 "bar baz" "\n" "blah") ---- -@foo{bar baz - - blah} --@-> -(foo "bar baz" "\n" "\n" "blah") ---- -@foo{bar baz - - - blah} --@-> -(foo "bar baz" "\n" "\n" "\n" "blah") ---- -@foo{bar - } --@-> -(foo "bar") ---- -@foo{ - bar} --@-> -(foo "bar") ---- -@foo{ - bar - } --@-> -(foo "bar") ---- -@foo{ - - bar - } --@-> -(foo "\n" "bar") ---- -@foo{ - bar - - } --@-> -(foo "bar" "\n") ---- -@foo{ - - bar - - } --@-> -(foo "\n" "bar" "\n") ---- -@foo{ - } --@-> -(foo "\n") ---- -@foo{ - - } --@-> -(foo "\n" "\n") ---- -@foo{ - - - } --@-> -(foo "\n" "\n" "\n") ---- -;; -------------------- nested forms ---- -@foo{@bar} -@-> (foo bar) ---- -@foo{@bar{}} -@-> (foo (bar)) ---- -@foo{111@bar{222}333} -@-> (foo "111" (bar "222") "333") ---- -@foo{111@bar[222]333} -@-> (foo "111" (bar 222) "333") ---- -@foo[111 @bar{222} 333] -@-> (foo 111 (bar "222") 333) ---- -@foo[111 @bar{222}333] -@-> (foo 111 (bar "222") 333) ---- -@foo[111 @bar[222]333] -@-> (foo 111 (bar 222) 333) ---- -@foo[111 @bar 222] -@-> (foo 111 bar 222) ---- -@foo{111 @bar 222} -@-> (foo "111 " bar " 222") ---- -@foo{@bar 111} -@-> (foo bar " 111") ---- -@foo{111 @bar} -@-> (foo "111 " bar) ---- -@foo{ @bar } -@-> (foo " " bar " ") ---- -@foo{bar @baz[3] - blah} --@-> -(foo "bar " (baz 3) "\n" "blah") ---- -@foo{bar @baz{3} - blah} --@-> -(foo "bar " (baz "3") "\n" "blah") ---- -@foo{bar @baz[2 3]{4 5} - blah} --@-> -(foo "bar " (baz 2 3 "4 5") "\n" "blah") ---- -@foo{bar @baz[2 3] {4 5}} --@-> -(foo "bar " (baz 2 3) " {4 5}") ---- -;; -------------------- cannot have spaces before args or text ---- -@foo [bar] -@-> foo (bar) ---- -@foo {bar} -@-> foo (bar) ---- -@foo[bar] {baz} -@-> (foo bar) (baz) ---- -@foo{bar @baz {bleh}} -@-> (foo "bar " baz " {bleh}") ---- -;; -------------------- expression escapes, operators, currying ---- -@foo{1 @(+ 2 3) 4} -@-> (foo "1 " (+ 2 3) " 4") ---- -@(lambda (x) x){blah} -@-> ((lambda (x) x) "blah") ---- -@(lambda (x) x)[blah] -@-> ((lambda (x) x) blah) ---- -@foo{bar}{baz} -@-> (foo "bar") (baz) ---- -@@foo{bar}{baz} -@-> ((foo "bar") "baz") ---- -@@foo{bar} {baz} -@-> (foo "bar") (baz) ---- -@@foo{bar}{baz}{} -@-> ((foo "bar") "baz") () ---- -@@@foo{bar}{baz}{} -@-> (((foo "bar") "baz")) ---- -@@@foo[]{}[][] -@-> (((foo))) ---- -@@@foo[]{}[][][] -@-> (((foo))) () ---- -@foo{foo@|3|.} --@-> -(foo "foo" 3 ".") ---- -@foo{foo@|(f 1)|{bar}} --@-> -(foo "foo" (f 1) "{bar}") ---- -@foo{foo@|bar|[1]{baz}} --@-> -(foo "foo" bar "[1]{baz}") ---- -;; -------------------- pulling punctuations outside ---- -@'foo -@-> 'foo ---- -@'foo[1 2] -@-> '(foo 1 2) ---- -@'foo{bar} -@-> '(foo "bar") ---- -@`foo{bar} -@-> `(foo "bar") ---- -@,foo{bar} -@-> ,(foo "bar") ---- -@,@foo{bar} -@-> ,@(foo "bar") ---- -@`',foo{bar} -@-> `',(foo "bar") ---- -@`',`',foo{bar} -@-> `',`',(foo "bar") ---- -@``'',,foo{bar} -@-> ``'',,(foo "bar") ---- -@`',@foo{bar} -@-> `',@(foo "bar") ---- -@`',@`',@foo{bar} -@-> `',@`',@(foo "bar") ---- -@``'',@,@foo{bar} -@-> ``'',@,@(foo "bar") ---- -@``'',,,@,@foo{bar} -@-> ``'',,,@,@(foo "bar") ---- -@#'foo{bar} -@-> #'(foo "bar") ---- -@#`foo{bar} -@-> #`(foo "bar") ---- -@#,foo{bar} -@-> #,(foo "bar") ---- -@#''foo{bar} -@-> #''(foo "bar") ---- -@#`'#,foo{bar} -@-> #`'#,(foo "bar") ---- -@`foo{123 @,bar{456} 789} --@-> -`(foo "123 " ,(bar "456") " 789") ---- -@`(unquote foo){blah} --@-> -`(,foo "blah") ---- -;; -------------------- balanced braces are allowed ---- -@foo{f{o}o} -@-> (foo "f{o}o") ---- -@foo{{{}}{}} -@-> (foo "{{}}{}") ---- -@foo{f[o]o} -@-> (foo "f[o]o") ---- -@foo{[{}]{}} -@-> (foo "[{}]{}") ---- -;; -------------------- string escapes ---- -@foo{x@"y"z} -@-> (foo "xyz") ---- -@foo{A @"}" marks the end} --@-> -(foo "A } marks the end") ---- -@foo{The prefix is: @"@".} --@-> -(foo "The prefix is: @.") --- -@foo{@"@x{y}" => (x "y")} --@-> -(foo "@x{y} => (x \"y\")") ---- -;; -------------------- alternative delimiters ---- -@foo|{...}| -@-> (foo "...") ---- -@foo|{"}" after "{"}| -@-> (foo "\"}\" after \"{\"") ---- -@foo|{Nesting |{is}| ok}| -@-> (foo "Nesting |{is}| ok") ---- -@foo|{Nested @form{not}}| -@-> (foo "Nested @form{not}") ---- -@foo|{Nested |@form|{yes}|}| -@-> (foo "Nested " (form "yes")) ---- -@foo|{Nested |@form{indep@{end}ence}}| --@-> -(foo "Nested " (form "indep" ("end") "ence")) ---- -@foo|{Nested |@|name|}| -@-> (foo "Nested " name) ---- -@foo|{With - |@bar{multiple} - lines.}| --@-> -(foo "With" "\n" (bar "multiple") "\n" "lines.") ---- -@t|{In |@i|{sub|@"@"s}| too}| -@-> (t "In " (i "sub@s") " too") ---- -@foo|<<<{@x{foo} |@{bar}|.}>>>| -@-> (foo "@x{foo} |@{bar}|.") ---- -@foo|<<<{@x{foo} |<<<@{bar}|.}>>>| -@-> (foo "@x{foo} " ("bar") "|.") ---- -@foo|!!{X |!!@b{Y}...}!!| -@-> (foo "X " (b "Y") "...") ---- -;; -------------------- comments ---- -(1 2 @; comment - 3 4) --@-> -(1 2 3 4) ---- -@foo{bar @; comment - baz@; - blah} --@-> -(foo "bar bazblah") ---- -@foo{bar @; comment, with space and newline - - baz} --@-> -(foo "bar " "\n" "baz") ---- -hello @; comment at eof --@-> -hello ---- -@foo{bar @;{a balanced comment} baz} --@-> -(foo "bar baz") ---- -@foo|{bar @;{a non-comment} baz}| --@-> -(foo "bar @;{a non-comment} baz") ---- -@foo|{bar |@;{a balanced comment again} baz}| --@-> -(foo "bar baz") ---- -@foo{First line@;{there is still a - newline here;} - Second line} --@-> -(foo "First line" "\n" "Second line") ---- -@foo{A long @; - single-@; - string arg.} --@-> -(foo "A long single-string arg.") ---- -;; -------------------- indentation management ---- -@foo{ bar - baz } --@-> -(foo " bar" "\n" "baz ") ---- -@foo{bar -} --@-> -(foo "bar") ---- -@foo{ -bar} --@-> -(foo "bar") ---- -@foo{ - bar -} --@-> -(foo "bar") ---- -@foo{ - - bar - -} --@-> -(foo "\n" "bar" "\n") ---- -@foo{ - bar - - baz -} --@-> -(foo "bar" "\n" "\n" "baz") ---- -@foo{ -} --@-> -(foo "\n") ---- -@foo{ - bar - baz - blah -} --@-> -(foo "bar" "\n" "baz" "\n" "blah") ---- -@foo{ - begin - x++; - end} --@-> -(foo "begin" "\n" " " "x++;" "\n" "end") ---- -@foo{ - a - b - c} --@-> -(foo " " "a" "\n" " " "b" "\n" "c") ---- -@foo{bar - baz - bbb} --@-> -(foo "bar" "\n" " " "baz" "\n" "bbb") ---- -;; requires location tracking -@foo{ bar - baz - bbb} --@-> -(foo " bar" "\n" " " "baz" "\n" " " "bbb") ---- -@foo{bar - baz - bbb} --@-> -(foo "bar" "\n" "baz" "\n" "bbb") ---- -@foo{ bar - baz - bbb} --@-> -(foo " bar" "\n" "baz" "\n" "bbb") ---- -@foo{ bar - baz - bbb} --@-> -(foo " bar" "\n" "baz" "\n" " " "bbb") ---- -@text{Some @b{bold - text}, and - more text.} --@-> -(text "Some " (b "bold" "\n" "text") ", and" "\n" "more text.") ---- -@code{ - begin - i = 1, r = 1 - @bold{while i < n do - r *= i++ - done} - end -} --@-> -(code "begin" "\n" - " " "i = 1, r = 1" "\n" - " " (bold "while i < n do" "\n" - " " "r *= i++" "\n" - "done") "\n" - "end") ---- -@foo{x1 - x2@; - y2 - x3@;{ - ;}y3 - x4@| - |y4 - x5} --@-> -(foo "x1" "\n" "x2y2" "\n" "x3y3" "\n" "x4" "y4" "\n" "x5") ---- -;; -------------------- ||-quotes for artificial separators and multi-exprs ---- -@foo{x@||z} -@-> (foo "x" "z") ---- -@foo{x@|"y"|z} -@-> (foo "x" "y" "z") ---- -@foo{x@|"y" "z"|} -@-> (foo "x" "y" "z") ---- -@foo{x@|1 (+ 2 3) 4|y} -@-> (foo "x" 1 (+ 2 3) 4 "y") ---- -@foo{x@|* - *|y} --@-> -(foo "x" * * "y") ---- -@foo{Alice@||Bob@| - |Carol} --@-> -(foo "Alice" "Bob" "Carol") ---- -@foo{Alice@||Bob@| x - |Carol} --@-> -(foo "Alice" "Bob" x "Carol") ---- -@foo{@|| - bar - @||} --@-> -(foo "\n" "bar" "\n") ---- -@foo{ - @|| bar @|| - @|| baz} --@-> -(foo " bar " "\n" " baz") ---- -@foo{bar - @|baz| bbb - @|x1 x2| x3 x4 - @|| waaaah - } --@-> -(foo "bar" "\n" baz " bbb" "\n" x1 x2 " x3 x4" "\n" " waaaah") ---- -;; -------------------- inside-reader ---- -foo bar baz -@i-> "foo bar baz" ---- -foo @bar baz -@i-> "foo " bar " baz" ---- -foo @bar{blah} baz -@i-> "foo " (bar "blah") " baz" ---- -{{{ -@i-> "{{{" ---- -}}} -@i-> "}}}" ---- -foo - bar -baz --@i-> -"foo" "\n" " " "bar" "\n" "baz" ---- - foo - bar - baz --@i-> -" foo" "\n" " " "bar" "\n" " " "baz" ---- -;; -------------------- using a different command character ---- -\foo --\-> -foo ---- -\foo[1]{bar - baz \nested|{\form{}}| - blah} --\-> -(foo 1 "bar" "\n" " " "baz " (nested "\\form{}") "\n" "blah") ---- -\foo --\i-> -foo ---- -\foo[1]{bar - baz \nested|{\form{}}| - blah} -\bar[] --\i-> -(foo 1 "bar" "\n" " " "baz " (nested "\\form{}") "\n" "blah") "\n" (bar) ---- -;; -------------------- syntax information ---- -foo --@syntax-> (stx: line= 1 column= 0 position= 1 span= 3) ---- -\foo -|foo| --@syntax-> -(stx: line= 1 column= 0 position= 1 span= 4) -(stx: line= 2 column= 0 position= 6 span= 5) ---- -(foo bar) --@syntax-> ((stx: line= 1 column= 1 position= 2 span= 3) - (stx: line= 1 column= 5 position= 6 span= 3)) ---- -;; this test should break soon -@foo --@syntax-> -(stx: line= 1 column= 1 position= 2 span= 3) -;; NOT this: (stx: line= 1 column= 0 position= 1 span= 4) ---- -;; -------------------- errors ---- -( -@error-> "inp:1:0: read: expected a `)' to close `('" ; check -@error-> ---- -@foo{ -@error-> #rx":1:0: missing closing `}'$" ---- -\foo{ -\error-> #rx":1:0: missing closing `}'$" ---- -@foo{@bar{ -@error-> #rx":1:5: missing closing `}'$" ---- -\foo{\bar{ -\error-> #rx":1:5: missing closing `}'$" ---- -@foo{@bar{} -@error-> #rx":1:0: missing closing `}'$" ---- -@foo{@bar|{} -@error-> #rx":1:5: missing closing `}\\|'$" ---- -@foo{@bar|-{} -@error-> #rx":1:5: missing closing `}-\\|'$" ---- -@foo{@bar|-{} -@error-> #rx":1:5: missing closing `}-\\|'$" ---- -\foo{\bar|-{} -\error-> #rx":1:5: missing closing `}-\\|'$" ---- -@foo{@" -@error-> #rx":1:6: read: expected a closing '\"'$" -;; " <-- (balance this file) ---- -\foo{\" -\error-> #rx":1:6: read: expected a closing '\"'$" ---- -@|1 2| --@error-> -#rx"a @|...| form in Scheme mode must have exactly one escaped expression" ---- -@|| --@error-> -#rx"a @|...| form in Scheme mode must have exactly one escaped expression" ---- -\|1 2| --\error-> -#rx"a \\\\|...| form in Scheme mode must have exactly one escaped expression" ---- -\|| --\error-> -#rx"a \\\\|...| form in Scheme mode must have exactly one escaped expression" ---- -;; -------------------- some code tests ---- -@string-append{1 @(number->string (+ 2 3)) 4} -@eval-> "1 5 4" ---- -(let* ([formatter (lambda (fmt) - (lambda args (format fmt (apply string-append args))))] - [bf (formatter "*~a*")] - [it (formatter "/~a/")] - [ul (formatter "_~a_")] - [text string-append]) - @text{@it{Note}: @bf{This is @ul{not} a pipe}.}) --@eval-> -"/Note/: *This is _not_ a pipe*." ---- -(require (for-syntax scheme/base)) -(let-syntax ([foo - (lambda (stx) - (let ([p (syntax-property stx 'scribble)]) - (syntax-case stx () - [(_ x ...) - (and (pair? p) (eq? (car p) 'form) (even? (cadr p))) - (let loop ([n (/ (cadr p) 2)] - [as '()] - [xs (syntax->list #'(x ...))]) - (if (zero? n) - #`(list 'foo `#,(reverse as) #,@xs) - (loop (sub1 n) - (cons #`(#,(car xs) ,#,(cadr xs)) as) - (cddr xs))))])))]) - @foo[x 1 y (* 2 3)]{blah}) --@eval-> -(foo ((x 1) (y 6)) "blah") ---- -(let-syntax ([verb - (lambda (stx) - (syntax-case stx () - [(_ cmd item ...) - #`(cmd - #,@(let loop ([items (syntax->list #'(item ...))]) - (if (null? items) - '() - (let* ([fst (car items)] - [prop (syntax-property fst 'scribble)] - [rst (loop (cdr items))]) - (cond [(eq? prop 'indentation) rst] - [(not (and (pair? prop) - (eq? (car prop) - 'newline))) - (cons fst rst)] - [else (cons (datum->syntax - fst (cadr prop) fst) - rst)])))))]))]) - @verb[string-append]{ - foo - bar - }) --@eval-> -"foo\n bar" ---- -;; -------------------- empty input tests ---- - --@-> - ---- - --@i-> - ---- - --\-> - ---- - --\i-> - ---- - - -END-OF-TESTS -) - -;; get a tester function - -(define-namespace-anchor anchor) -(define ns (namespace-anchor->namespace anchor)) -(define (string->tester name) (eval (string->symbol name) ns)) - -;; reader utilities - -(define the-name (string->path "inp")) - -(define (read-all str reader [whole? #f]) - (define i (open-input-string str the-name)) - (if whole? - (reader i) - (let loop () - (let ([x (reader i)]) - (if (eof-object? x) '() (cons x (loop))))))) - -(define read/BS (scr:make-at-reader #:command-char #\\ #:syntax? #f)) -(define read-syntax/BS (scr:make-at-reader #:command-char #\\ #:syntax? #t)) - -(define read-inside/BS - (scr:make-at-reader #:inside? #t #:command-char #\\ #:syntax? #f)) - -;; tester makers - -(define (x . (mk-reader-test reader) . y) - (values (read-all x reader) (read-all y read))) - -(define (x . (mk-inside-reader-test inside-reader) . y) - (values (read-all x inside-reader #t) (read-all y read))) - -(define (x . (mk-eval-test syntax-reader) . y) - (define r (void)) - (for ([x (read-all x (lambda (i) (syntax-reader 'test i)))]) - (set! r (call-with-values (lambda () (eval x ns)) list))) - (values r (read-all y read))) - -(define (x . (mk-syntax-test syntax-reader) . y) - (let ([x (read-all x (lambda (i) (syntax-reader 'test i)))] - [y (read-all y read)]) - (define (check x y) - (cond [(or (equal? x y) (eq? y '_)) #t] - [(not (pair? y)) #f] - [(eq? 'stx: (car y)) (check-stx x (cdr y))] - [(pair? x) (and (check (car x) (car y)) (check (cdr x) (cdr y)))] - [(syntax? x) (check (syntax-e x) y)] - [else #f])) - (define (check-stx x y) - (cond [(null? y) #t] - [(null? (cdr y)) (check x (car y))] - [(check - ((case (car y) - [(line=) syntax-line] - [(column=) syntax-column] - [(position=) syntax-position] - [(span=) syntax-span] - [else (error 'syntax-test "unknown test form: ~.s" (car y))]) - x) - (cadr y)) - (check-stx x (cddr y))] - [else #f])) - (values #t (check x y)))) - -(define (x . (mk-error-test reader) . y) - (define (get-exn-data e) - (cons (exn-message e) - null #; - (append-map (lambda (s) (list (srcloc-line s) (srcloc-column s))) - (exn:fail:read-srclocs e)) - )) - (values (with-handlers ([exn:fail:read? get-exn-data]) - (read-all x reader) "no error!") - (read-all y read))) - -;; testers - -(define -@-> (mk-reader-test scr:read)) -(define -\\-> (mk-reader-test read/BS)) -(define -@i-> (mk-inside-reader-test scr:read-inside)) -(define -\\i-> (mk-inside-reader-test read-inside/BS)) -(define -@eval-> (mk-eval-test scr:read-syntax)) -(define -\\eval-> (mk-eval-test read-syntax/BS)) -(define -@syntax-> (mk-syntax-test scr:read-syntax)) -(define -\\syntax-> (mk-syntax-test read-syntax/BS)) -(define -@error-> (mk-error-test scr:read)) -(define -\\error-> (mk-error-test read/BS)) - -(define (make-@+-readtable #:command-readtable [command-readtable (current-readtable)] - #:datum-readtable [datum-readtable (current-readtable)]) - (make-readtable (scr:make-at-readtable #:command-readtable command-readtable - #:datum-readtable datum-readtable) - #\+ 'terminating-macro (lambda args 'PLUS))) -(define @+-readtable (make-@+-readtable)) -(define @c+-readtable (make-@+-readtable #:command-readtable 'dynamic)) -(define @d+-readtable (make-@+-readtable #:datum-readtable 'dynamic)) -(define @cd+-readtable (make-@+-readtable #:command-readtable 'dynamic - #:datum-readtable 'dynamic)) - -(define-syntax-rule (@+checker a b readtable) - (equal? (parameterize ([current-readtable readtable]) - (read (open-input-string a))) - b)) -(define-syntax-rule (a . -@+> . b) (@+checker a b @+-readtable)) -(define-syntax-rule (a . -@c+> . b) (@+checker a b @c+-readtable)) -(define-syntax-rule (a . -@d+> . b) (@+checker a b @d+-readtable)) -(define-syntax-rule (a . -@cd+> . b) (@+checker a b @cd+-readtable)) - -;; running the tests -(provide reader-tests) -(module+ main (reader-tests)) -(define (reader-tests) - (define (matching? x y) - (cond [(equal? x y) #t] - [(pair? x) (and (pair? y) - (matching? (car x) (car y)) - (matching? (cdr x) (cdr y)))] - [(and (regexp? x) (string? y)) (matching? y x)] - [(and (string? x) (regexp? y)) (regexp-match? y x)] - [(procedure? x) (x y)] - [(procedure? y) (y x)] - [else #f])) - (test do - (let* ([ts the-tests] - ;; remove all comment lines - [ts (regexp-replace* #px"(?m:^;.*\r?\n)" ts "")] - ;; split the tests - [ts (regexp-split #px"(?m:^)-+(?:$|\r?\n)" ts)]) - (parameterize ([port-count-lines-enabled #t]) - (for ([t ts] #:unless (regexp-match? #px"^\\s*$" t)) - (let ([m (or (regexp-match #px"^(.*)\n\\s*(-\\S+->)\\s*\n(.*)$" - t) - (regexp-match #px"^(.*\\S)\\s+(-\\S+->)\\s+(\\S.*)$" - t))]) - (if (not (and m (= 4 (length m)))) - (error 'bad-test "~a" t) - (let-values ([(x y) - ((string->tester (caddr m)) (cadr m) (cadddr m))]) - (test #:failure-message - (format "bad result in\n ~a\n results:\n ~s != ~s" - (regexp-replace* #rx"\n" t "\n ") - x y) - (matching? x y)))))))) - - ;; Check static versus dynamic readtable for command (dynamic when "c" in the - ;; name) and datum (dynamic when "d" in the name) parts: - (-@+> "10" 10) - (-@+> "(+ @+[+] +)" '(PLUS (+ +) PLUS)) - (-@+> "@+[+]" '(+ +)) - (-@d+> "@+[+]" '(+ PLUS)) - (-@d+> "(+ @+[+])" '(PLUS (+ PLUS))) - (-@c+> "@+[+]" '(PLUS +)) - (-@c+> "@|+|" 'PLUS) - (-@cd+> "@+[+]" '(PLUS PLUS)))) diff --git a/scribble-test/tests/scribble/render.rkt b/scribble-test/tests/scribble/render.rkt deleted file mode 100644 index 78f20ff8..00000000 --- a/scribble-test/tests/scribble/render.rkt +++ /dev/null @@ -1,23 +0,0 @@ -#lang racket/base -(require scribble/render - scribble/text-render - scribble/core - racket/file - tests/eli-tester) - -(provide render-tests) -(module+ main (render-tests)) -(define (render-tests) - (dynamic-wind - (λ() (render (list (part #f - null - (list "Render") - (style #f null) - null - (list (paragraph (style #f null) "The content.")) - null)) - (list "example-for-render-test") - #:render-mixin render-mixin)) - (λ() (test (file->string "example-for-render-test.txt") - => "Render\n\nThe content.\n")) - (λ() (delete-file "example-for-render-test.txt")))) diff --git a/scribble-test/tests/scribble/text-collect.rkt b/scribble-test/tests/scribble/text-collect.rkt deleted file mode 100644 index cbc19619..00000000 --- a/scribble-test/tests/scribble/text-collect.rkt +++ /dev/null @@ -1,82 +0,0 @@ -#lang racket/base - -(require tests/eli-tester scribble/text/syntax-utils) - -(provide begin/collect-tests) -(module+ main (begin/collect-tests)) -(define (begin/collect-tests) - (test - - ;; begin/collect scope etc - (begin/collect 1) => 1 - (begin/collect 1 2 3) => '(1 2 3) - (begin/collect) => '() - (begin/collect (define x 1) x) => 1 - (begin/collect (define x 1)) => '() - (begin/collect (define x 1) x x x) => '(1 1 1) - (begin/collect (define x 1) (define y 2) x y x y) => '(1 2 1 2) - (begin/collect (define x 1) x (define y 2) y) => '(1 2) - (begin/collect (define x 1) x (define y 2)) => '(1) - (begin/collect (define x 1) x x (define y 2) y y) => '(1 1 2 2) - (begin/collect (define x 1) x (define x 2) x) => '(1 2) - (begin/collect (define x 1) x x (define x 2) x x) => '(1 1 2 2) - (begin/collect (define (x) y) (define y 1) (x) (x) (x)) => '(1 1 1) - (begin/collect (define x 1) x (define y 2) x) => '(1 1) - (begin/collect (define x 1) x x (define y 2) x x) => '(1 1 1 1) - (begin/collect (define x 1) x x (define y x) y y) => '(1 1 1 1) - (begin/collect (define (x) y) (define y 1) (x) (x) - (define (x) y) (define y 2) (x) (x)) - => '(1 1 2 2) - (begin/collect (define-syntax-rule (DEF x y) (define x y)) (DEF x 1) x x) - => '(1 1) - (begin/collect (define-syntax-rule (DEF x y) (define x y)) 1 (DEF x 2) x) - => '(1 2) - (begin/collect (define-syntax-rule (DEF x y) (define x y)) - (DEF x 1) x x - (DEF x 2) x x) - => '(1 1 2 2) - (begin/collect (define (x) y) - (define-syntax-rule (DEF x y) (define x y)) - (DEF y 1) (x) (x) - (DEF y 2) (x) (x)) - => '(1 1 1 1) - (let ([y 1]) (begin/collect y y (define x y) x y x)) => '(1 1 1 1 1) - (let ([y 1]) (begin/collect y y (define y 2) y y)) => '(1 1 2 2) - (let ([y 1]) (begin/collect (define (x) y) (x) (x))) => '(1 1) - (let ([y 1]) (begin/collect (define (x) y) (define y 2) (x) (x))) => '(2 2) - (let ([y 1]) (begin/collect (define (x) y) (x) (x) (define y 2) y y)) - => '(1 1 2 2) - (let ([y 1]) (begin/collect (define (x) y) (x) (x) (define y 2) y y (x))) - => '(1 1 2 2 1) - (let ([y 1]) (begin/collect (define (x) y) (x) (x) (define y 2) (x) y y)) - => '(1 1 1 2 2) - (begin/collect (begin (define (x) y) - (define-syntax-rule (DEF x y) (define x y)) - (define y 2)) - (x) (x)) - => '(2 2) - (begin/collect (define (x) y) - (begin (define-syntax-rule (DEF x y) (define x y)) - (define y 2)) - (x) (x)) - => '(2 2) - (begin/collect (define (x) y) - (define-syntax-rule (DEF x y) (define x y)) - (begin (define y 2)) - (x) (x)) - => '(2 2) - (begin/collect (begin (begin (begin (define (x) y)) - (begin (define-syntax-rule (DEF x y) - (define x y)))) - (begin (begin (define y 2)) - (begin (x))) - (begin (x)))) - => '(2 2) - (begin/collect 1 - (define (f x #:< [< "<"] #:> [> ">"]) (list < x >)) - (f 1) - (f #:< "[" 2) - (f 3 #:> "]" #:< "[")) - => '(1 ("<" 1 ">") ("[" 2 ">") ("[" 3 "]")) - - )) diff --git a/scribble-test/tests/scribble/text-lang.rkt b/scribble-test/tests/scribble/text-lang.rkt deleted file mode 100644 index e9111bc9..00000000 --- a/scribble-test/tests/scribble/text-lang.rkt +++ /dev/null @@ -1,66 +0,0 @@ -#lang racket/base - -(require tests/eli-tester racket/runtime-path racket/port racket/sandbox - (prefix-in doc: (lib "scribblings/scribble/text.scrbl"))) - -(provide text-lang-tests) -(module+ main (text-lang-tests)) -(define (text-lang-tests) - ;; (sample-file-tests) - (test do (in-documentation-tests))) - -;; unused now -(define-runtime-path text-dir "text") -(define (sample-file-tests) - (parameterize ([current-directory text-dir]) - (for ([ifile (map path->string (directory-list))] - #:when (and (file-exists? ifile) - (regexp-match? #rx"^i[0-9]+\\.ss$" ifile))) - (define ofile (regexp-replace #rx"^i([0-9]+)\\..*$" ifile "o\\1.txt")) - (define expected (call-with-input-file ofile - (lambda (i) (read-bytes (file-size ofile) i)))) - (define o (open-output-bytes)) - (parameterize ([current-output-port o]) - (dynamic-require (path->complete-path ifile) #f)) - (test (get-output-bytes o) => expected)))) - -(define-runtime-path this-dir ".") -(define (in-documentation-tests) - (define (text-test line in-text out-text more) - (define-values (i o) (make-pipe 512)) - (define-values (expected len-to-read) - (let ([m (regexp-match-positions #rx"\n\\.\\.\\.$" out-text)]) - (if m - (values (substring out-text 0 (caar m)) (caar m)) - (values out-text #f)))) - ;; test with name indicating the source - (define-syntax-rule (t . stuff) - (test ;; #:failure-message - ;; (format "text-lang test failure at line ~s" line) - . stuff)) - (parameterize ([current-directory this-dir] - [sandbox-output o] - [sandbox-error-output current-output-port] - [sandbox-eval-limits '(2 10)]) - (define exn #f) - (define thd #f) - (define (run) - ;; only need to evaluate the module, so we have its output; but do that - ;; in a thread, since we might want to look at just a prefix of an - ;; infinite output - (with-handlers ([void (lambda (e) (set! exn e))]) - (make-module-evaluator in-text) - (close-output-port o))) - (for ([m more]) - (call-with-output-file (car m) #:exists 'truncate - (lambda (o) (display (cdr m) o)))) - (set! thd (thread run)) - (t (if len-to-read (read-string len-to-read i) (port->string i)) - => expected) - (t (begin (kill-thread thd) (cond [exn => raise] [else #t]))) - (for ([m more]) - (when (file-exists? (car m)) (delete-file (car m)))))) - (call-with-trusted-sandbox-configuration - (lambda () - (for ([t (in-list (doc:tests))]) - (begin (apply text-test t)))))) diff --git a/scribble-test/tests/scribble/text-wrap.rkt b/scribble-test/tests/scribble/text-wrap.rkt deleted file mode 100644 index 0d2c489d..00000000 --- a/scribble-test/tests/scribble/text-wrap.rkt +++ /dev/null @@ -1,121 +0,0 @@ -#lang racket/base - -(require tests/eli-tester scribble/text/wrap) - -#; ; generate test cases from Emacs -(defmacro wrap-line (str col &rest dummy) - (let ((r (with-temp-buffer - (fundamental-mode) - (insert str) - (let (; straightforward filling, no fanciness - (left-margin 0) (fill-column col) - (adaptive-fill-regexp "\\`\\'") - (adaptive-fill-first-line-regexp "\\`\\'") - (filladapt-mode nil)) - (fill-region-as-paragraph (point-min) (point-max) nil t) - (format "'%S" (split-string - (buffer-substring (point-min) (point-max)) - "\n")))))) - `(insert ,r))) - -(provide wrap-tests) -(module+ main (wrap-tests)) -(define (wrap-tests) - (define (w line width result1 result2) - (test (wrap-line line width) => result1 - (wrap-line line width - (λ (w n) (values (substring w 0 n) (substring w n) #f))) - => result2)) - (test (w "eli barzilay maze is life" 25 - '("eli barzilay maze is life") - '("eli barzilay maze is life")) - (w "eli barzilay maze is life" 10 - '("eli" "barzilay" "maze is" "life") - '("eli barzil" "ay maze is" "life")) - (w "eli barzilay maze is life" 11 - '("eli" "barzilay" "maze is" "life") - '("eli barzila" "y maze is l" "ife")) - (w "eli barzilay maze is life" 12 - '("eli barzilay" "maze is life") - '("eli barzilay" "maze is life")) - (w "eli barzilay maze is life" 13 - '("eli barzilay" "maze is life") - '("eli barzilay" "maze is life")) - (w "eli barzilay maze is life" 14 - '("eli barzilay" "maze is life") - '("eli barzilay m" "aze is life")) - (w "eli barzilay maze is life" 15 - '("eli barzilay" "maze is life") - '("eli barzilay m" "aze is life")) - (w "eli barzilay maze is life" 15 - '("eli barzilay" "maze is life") - '("eli barzilay m" "aze is life")) - (w "eli barzilay maze is life" 15 - '("eli barzilay" "maze is life") - '("eli barzilay ma" "ze is life")) - (w "0123456789" 10 - '("0123456789") - '("0123456789")) - (w " xxxxx" 10 - '(" xxxxx") - '(" xxxxx")) - (w " xxxxxx" 10 - '(" xxxxxx") - '(" xxxxx" "x")) - (w " xxxxxxxxxxx" 10 - '(" xxxxxxxxxxx") - '(" xxxxx" "xxxxxx")) - (w "xxxxx " 10 - '("xxxxx ") - '("xxxxx ")) - (w "xxxxxx " 10 - '("xxxxxx ") - '("xxxxxx " " ")) - (w " xxxxx " 10 - '(" xxxxx ") - '(" xxxxx " " ")) - (w " x " 10 - '(" x ") - '(" x " " ")) - (w "" 10 - '("") - '("")) - (w " " 10 - '(" ") - '(" ")) - (w " " 10 - '(" ") - '(" ")) - (w " " 10 - '(" ") - '(" " " ")) - (w "xxxxxxxxxxx " 10 - '("xxxxxxxxxxx ") - '("xxxxxxxxxx" "x ")) - (w " xxxxxxxxxxx " 10 - '(" xxxxxxxxxxx ") - '(" xxxxx" "xxxxxx ")) - (w " xxxxxxxxxxx " 10 - '(" xxxxxxxxxxx ") - '(" xxxxx" "xxxxxx ")) - (w " xxxxxxxxxxx x" 10 - '(" xxxxxxxxxxx" "x") - '(" xxxxx" "xxxxxx x")) - (w " xxxxxxxxxxx x" 10 - '(" xxxxxxxxxxx" "x") - '(" xxxxx" "xxxxxx x")) - (w "x x x x x x x x x x x" '(10 . 8) - '("x x x x x" "x x x x" "x x") - '("x x x x x" "x x x x" "x x")) - (w "xx x x x x x x x x x x" '(10 . 8) - '("xx x x x x" "x x x x" "x x") - '("xx x x x x" "x x x x" "x x")) - (w "x x x x xxx x x x x x" '(10 . 8) - '("x x x x" "xxx x x" "x x x") - '("x x x x xx" "x x x x" "x x")) - (w "xxxx xxxx xxxx xxxx" '(10 . 5) - '("xxxx xxxx" "xxxx" "xxxx") - '("xxxx xxxx" "xxxx" "xxxx")) - (w "xxxx xxxxxxxx xxxx" '(10 . 5) - '("xxxx" "xxxxxxxx" "xxxx") - '("xxxx xxxxx" "xxx x" "xxx")))) diff --git a/scribble-test/tests/scribble/xref.rkt b/scribble-test/tests/scribble/xref.rkt deleted file mode 100644 index accf998d..00000000 --- a/scribble-test/tests/scribble/xref.rkt +++ /dev/null @@ -1,18 +0,0 @@ -#lang racket/base -(require scribble/xref - racket/fasl - setup/dirs - tests/eli-tester) - -;; FIXME: need to look for out.sxref files - -(provide xref-tests) -(module+ main (xref-tests)) -(define (xref-tests) - (define sxref (build-path (find-doc-dir) "reference" "out.sxref")) - (when (file-exists? sxref) - (define xref - (load-xref (list (λ () (cadr (call-with-input-file* sxref fasl->s-exp)))))) - (test (xref-binding->definition-tag - xref (list '(lib "contract.rkt" "racket") '->) #f) - => '(form ((lib "racket/contract/base.rkt") ->))))) diff --git a/scribble-test/tests/scriblib/bibtex.normal.txt b/scribble-test/tests/scriblib/bibtex.normal.txt deleted file mode 100644 index c29bdb96..00000000 --- a/scribble-test/tests/scriblib/bibtex.normal.txt +++ /dev/null @@ -1,8 +0,0 @@ -Bibliography - -Ran Canetti. Universally Composable Security: A New Paradigm for -Cryptographic Protocols. 2000. -Michael Salib. Starkiller: A Static Type Inferencer and Compiler for -Python. Massachusetts Institute of Technology, 2004. -Sam Tobin-Hochstadt, Vincent St-Amour, Ryan Culpepper, Matthew Flatt, -and Matthias Felleisen. Languages as Libraries. In Proc. PLDI, 2011. diff --git a/scribble-test/tests/scriblib/bibtex.number.txt b/scribble-test/tests/scriblib/bibtex.number.txt deleted file mode 100644 index de687b03..00000000 --- a/scribble-test/tests/scriblib/bibtex.number.txt +++ /dev/null @@ -1,8 +0,0 @@ -Bibliography - -[1]Ran Canetti. Universally Composable Security: A New Paradigm for - Cryptographic Protocols. 2000. -[2]Michael Salib. Starkiller: A Static Type Inferencer and Compiler for - Python. Massachusetts Institute of Technology, 2004. -[3]Sam Tobin-Hochstadt, Vincent St-Amour, Ryan Culpepper, Matthew Flatt, - and Matthias Felleisen. Languages as Libraries. In Proc. PLDI, 2011. diff --git a/scribble-test/tests/scriblib/bibtex.rkt b/scribble-test/tests/scriblib/bibtex.rkt deleted file mode 100644 index a73089ef..00000000 --- a/scribble-test/tests/scriblib/bibtex.rkt +++ /dev/null @@ -1,76 +0,0 @@ -#lang racket -(require racket/runtime-path - tests/eli-tester - scriblib/bibtex - scriblib/autobib - scribble/render - (prefix-in text: scribble/text-render)) - -(define-runtime-path example.bib "example.bib") - -(define-runtime-path normal-expected-path "bibtex.normal.txt") -(define-runtime-path number-expected-path "bibtex.number.txt") - -(define-syntax-rule (test-render* definer expected-path body generate-bibliography-id) - (let () - definer - - body - - (define actual-path - (make-temporary-file "~a-bibtex.txt")) - - (render (list (generate-bibliography-id)) - (list actual-path) - #:dest-dir (path-only actual-path) - #:render-mixin text:render-mixin) - - (test - (file->string actual-path) => (file->string expected-path)))) - -(define-syntax-rule (test-render expected-path options body) - (begin - (test-render* (define-bibtex-cite example.bib - ~cite-id citet-id generate-bibliography-id . options) - expected-path - (body ~cite-id citet-id) - generate-bibliography-id) - (test-render* (begin - (define-cite autobib-cite autobib-citet - generate-bibliography-id . options) - (define-bibtex-cite* example.bib - autobib-cite autobib-citet - ~cite-id citet-id)) - expected-path - (body ~cite-id citet-id) - generate-bibliography-id))) - -(test - (let () - (define example (path->bibdb example.bib)) - (define raw (bibdb-raw example)) - - (test - (hash-ref (hash-ref raw "sweig42") "month") => "march" - (hash-ref (hash-ref raw "sweig42a") "month") => "1~mar" - (hash-ref (hash-ref raw "sweig42b") "month") => "1~march" - (hash-ref (hash-ref raw "sweig42c") "month") => "1~marcha")) - - (test-render normal-expected-path () - (λ (~cite-id citet-id) - (~cite-id "salib:starkiller") - (~cite-id "cryptoeprint:2000:067") - (~cite-id "Tobin-Hochstadt:2011fk") - (~cite-id "cryptoeprint:2000:067" "Tobin-Hochstadt:2011fk") - (~cite-id "cryptoeprint:2000:067 Tobin-Hochstadt:2011fk") - - (citet-id "salib:starkiller") - (citet-id "cryptoeprint:2000:067") - (citet-id "Tobin-Hochstadt:2011fk") - (citet-id "Tobin-Hochstadt:2011fk" "Tobin-Hochstadt:2011fk") - (citet-id "Tobin-Hochstadt:2011fk Tobin-Hochstadt:2011fk"))) - (test-render number-expected-path (#:style number-style) - (λ (~cite-id citet-id) - (citet-id "salib:starkiller") - (citet-id "cryptoeprint:2000:067") - (citet-id "Tobin-Hochstadt:2011fk")))) diff --git a/scribble-test/tests/scriblib/example.bib b/scribble-test/tests/scriblib/example.bib deleted file mode 100644 index 9d5d44b0..00000000 --- a/scribble-test/tests/scriblib/example.bib +++ /dev/null @@ -1,407 +0,0 @@ -%% This BibTeX bibliography file was created using BibDesk. -%% http://bibdesk.sourceforge.net/ - - -%% Created for Jay McCarthy at 2011-05-13 19:46:09 -0600 - - -%% Saved with string encoding Unicode (UTF-8) - - -@string{aadebug = {International Workshop on Automated and Algorithmic Debugging}} - -@string{acm = {Association for Computing Machinery}} - -@string{addison-wesley = {Addison-Wesley}} - -@string{addison-wesley-longman = {Addison Wesley Longman}} - -@string{aosd = {International Conference on Aspect-Oriented Software Development}} - -@string{ase = {{IEEE} International Symposium on Automated Software Engineering}} - -@string{asej = {Automated Software Engineering}} - -@string{aspnetpro = {asp.net{PRO}}} - -@string{aug = {August}} - -@string{brown-cs = {Computer Science Department, Brown University}} - -@string{cacm = {Communications of the {ACM}}} - -@string{cbse = {{ICSE} Workshop on Component-Based Software Engineering}} - -@string{cc = {Compiler Construction}} - -@string{computing-surveys = {{ACM} Computing Surveys}} - -@string{cup = {Cambridge University Press}} - -@string{dec = {December}} - -@string{dr-dobbs = {{Dr.\ Dobb's Journal}}} - -@string{dsl = {{USENIX} Conference on Domain-Specific Languages}} - -@string{ecoop = {European Conference on Object-Oriented Programming}} - -@string{esec/fse = {Joint European Software Engineering Conference and {ACM SIGSOFT} Symposium on the Foundations of Software Engineering}} - -@string{esop = {European Symposium on Programming}} - -@string{fdpe = {Functional and Declarative Programming in Education}} - -@string{foal = {Foundations of Aspect-Oriented Languages}} - -@string{fool = {Foundations of Object-Oriented Languages}} - -@string{fse = {{ACM SIGSOFT} International Symposium on the Foundations of Software Engineering}} - -@string{fsf = {Free Software Foundation}} - -@string{gcse = {International Symposium on Generative and Component-Based Software Engineering}} - -@string{gpce = {International Conference on Generative Programming and Component Engineering}} - -@string{hosc = {Higher-Order and Symbolic Computation}} - -@string{ic = {Information \& Computation}} - -@string{icalp = {International Conference on Automata, Languages and Programming}} - -@string{iccc = {Internationl Conference on Compiler Construction}} - -@string{icfp = {{ACM SIGPLAN} International Conference on Functional Programming}} - -@string{icse = {International Conference on Software Engineering}} - -@string{icsr = {International Conference on Software Reuse}} - -@string{ieee-software = {{IEEE} Software}} - -@string{ieee-tose = {{IEEE} Transactions on Software Engineering}} - -@string{info-proc-let = {Information Processing Letters}} - -@string{j-jucs = {Journal of Universal Computer Science}} - -@string{jan = {January}} - -@string{jcss = {Journal of Computer and System Sciences}} - -@string{jfp = {Journal of Functional Programming}} - -@string{jul = {July}} - -@string{jun = {June}} - -@string{lasc = {Lisp and Symbolic Computation}} - -@string{lfp = {{ACM} Symposium on Lisp and Functional Programming}} - -@string{lics = {{IEEE} Symposium on Logic in Computer Science}} - -@string{lncs = {Lecture Notes in Computer Science}} - -@string{manuscript = {Unpublished manuscript}} - -@string{mar = {March}} - -@string{mcgraw-hill = {McGraw-Hill}} - -@string{mit-lcs = {MIT Laboratory for Computer Science}} - -@string{mit-press = {{MIT} Press}} - -@string{monterey2001 = {Monterey Workshop on Engineering Automation for Software Intensive System Integration}} - -@string{nytimes = {New York Times}} - -@string{oopsla = {{ACM SIGPLAN} Conference on Object-Oriented Programming Systems, Languages \& Applications}} - -@string{padl = {Symposium on the Practical Aspects of Declarative Languages}} - -@string{paste = {Workshop on Program Analysis for Software Tools and Engineering}} - -@string{pepm = {{ACM SIGPLAN} Symposium on Partial Evaluation and Semantics-Based Program Manipulation}} - -@string{personal = {Personal communication}} - -@string{pldi = {{ACM SIGPLAN} Conference on Programming Language Design and Implementation}} - -@string{plilp = {International Symposium on Programming Languages: Implementations, Logics, and Programs}} - -@string{plop = {Pattern Languages of Program Design}} - -@string{pls = {Programming Languages and Systems}} - -@string{popl = {{ACM SIGPLAN-SIGACT} Symposium on Principles of Programming Languages}} - -@string{prentice-hall = {Prentice-Hall}} - -@string{pws = {{PWS} Publishing}} - -@string{schemecookbook = {Scheme Cookbook}} - -@string{scp = {Science of Computer Programming}} - -@string{sigplan-notices = {{ACM SIGPLAN} Notices}} - -@string{sosp = {Symposium on Operating System Principles}} - -@string{spe = {Software--Practice and Experience}} - -@string{spin-sw-mc = {{SPIN} Workshop on Software Model Checking}} - -@string{springer = {Springer-Verlag}} - -@string{sw = {Scheme Workshop}} - -@string{swconfmgmt = {International Workshop on Software Configuration Management}} - -@string{sws = {{ACM} Workshop on Secure Web Services (SWS)}} - -@string{tacas = {Conference on Tools and Algorithms for the Construction and Analysis of Systems}} - -@string{tcs = {Theoretical Computer Science}} - -@string{tocs = {{ACM} Transactions on Computer Systems}} - -@string{toit = {{ACM} Transactions on Internet Technology}} - -@string{tools-symp = {Technology of Object-Oriented Languages and Systems}} - -@string{toplas = {{ACM} Transactions on Programming Languages and Systems}} - -@string{tose = {{IEEE} Transactions on Software Engineering}} - -@string{tosem = {{ACM} Transactions on Software Engineering and Methodology}} - -@string{tr = {Technical Report}} - -@string{w3c = {{W}orld {W}ide {W}eb {C}onsortium}} - -@string{wiley = {Wiley}} - - -@misc{cryptoeprint:2000:067, - Author = {Ran Canetti}, - Date-Added = {2011-04-11 11:28:01 -0600}, - Date-Modified = {2011-04-11 11:29:32 -0600}, - Howpublished = {Cryptology ePrint Archive, Report 2000/067}, - Title = {Universally Composable Security: A New Paradigm for Cryptographic Protocols}, - Year = {2000}} - -@inproceedings{Tobin-Hochstadt:2011fk, - Author = {Sam Tobin-Hochstadt and Vincent St-Amour and Ryan Culpepper and Matthew Flatt and Matthias Felleisen}, - Booktitle = {PLDI}, - Date-Added = {2011-04-11 10:04:33 -0600}, - Date-Modified = {2011-04-11 10:28:07 -0600}, - Read = {1}, - Title = {Languages as Libraries}, - Year = {2011}, - Bdsk-File-1 = {YnBsaXN0MDDUAQIDBAUIJidUJHRvcFgkb2JqZWN0c1gkdmVyc2lvblkkYXJjaGl2ZXLRBgdUcm9vdIABqAkKFRYXGyIjVSRudWxs0wsMDQ4RFFpOUy5vYmplY3RzV05TLmtleXNWJGNsYXNzog8QgASABqISE4ACgAOAB1lhbGlhc0RhdGFccmVsYXRpdmVQYXRo0hgNGRpXTlMuZGF0YU8RAc4AAAAAAc4AAgAADE1hY2ludG9zaCBIRAAAAAAAAAAAAAAAAAAAAMkCFiVIKwAAAC/hFxFwbGRpMTEtdGhhY2ZmLnBkZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAT5pXyakRQgAAAAAAAAAAAAgABwAACSAAAAAAAAAAAAAAAAAAAAAFLVRtcC0AABAACAAAyQJ4lQAAABEACAAAyallogAAAAEAGAAv4RcACE4PAAhODgAAYloAAADYAAAA1gACAFdNYWNpbnRvc2ggSEQ6cHJpdmF0ZTp2YXI6Zm9sZGVyczpBLTpBLU5pTGNGSEdCaWw5bWJFYUR0dkYrKysrVEk6LVRtcC06cGxkaTExLXRoYWNmZi5wZGYAAA4AJAARAHAAbABkAGkAMQAxAC0AdABoAGEAYwBmAGYALgBwAGQAZgAPABoADABNAGEAYwBpAG4AdABvAHMAaAAgAEgARAASAEpwcml2YXRlL3Zhci9mb2xkZXJzL0EtL0EtTmlMY0ZIR0JpbDltYkVhRHR2RisrKytUSS8tVG1wLS9wbGRpMTEtdGhhY2ZmLnBkZgATAAEvAP//AACABdIcHR4fWCRjbGFzc2VzWiRjbGFzc25hbWWjHyAhXU5TTXV0YWJsZURhdGFWTlNEYXRhWE5TT2JqZWN0XxBaLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vdmFyL2ZvbGRlcnMvQS0vQS1OaUxjRkhHQmlsOW1iRWFEdHZGKysrK1RJLy1UbXAtL3BsZGkxMS10aGFjZmYucGRm0hwdJCWiJSFcTlNEaWN0aW9uYXJ5EgABhqBfEA9OU0tleWVkQXJjaGl2ZXIACAARABYAHwAoADIANQA6ADwARQBLAFIAXQBlAGwAbwBxAHMAdgB4AHoAfACGAJMAmACgAnICdAJ5AoICjQKRAp8CpgKvAwwDEQMUAyEDJgAAAAAAAAIBAAAAAAAAACgAAAAAAAAAAAAAAAAAAAM4}} - -@unpublished{cite-key, - Date-Added = {2011-04-11 10:04:14 -0600}, - Date-Modified = {2011-04-11 10:04:14 -0600}} - -@inproceedings{Braberman:2008:PPH:1375634.1375655, - Acmid = {1375655}, - Address = {New York, NY, USA}, - Author = {Braberman, V\'{\i}ctor and Fern\'{a}ndez, Federico and Garbervetsky, Diego and Yovine, Sergio}, - Booktitle = {Proceedings of the 7th international symposium on Memory management}, - Date-Added = {2011-02-18 10:02:51 -0700}, - Date-Modified = {2011-02-18 10:16:34 -0700}, - Doi = {http://doi.acm.org/10.1145/1375634.1375655}, - Isbn = {978-1-60558-134-7}, - Keywords = {heap consumption, heap space analysis, java, memory regions, Games, To-implement}, - Location = {Tucson, AZ, USA}, - Numpages = {10}, - Pages = {141--150}, - Publisher = {ACM}, - Read = {1}, - Series = {ISMM '08}, - Title = {Parametric prediction of heap memory requirements}, - Url = {http://doi.acm.org/10.1145/1375634.1375655}, - Year = {2008}, - Bdsk-Url-1 = {http://doi.acm.org/10.1145/1375634.1375655}} - -@inproceedings{Henglein:2011:REC:1926385.1926429, - Acmid = {1926429}, - Address = {New York, NY, USA}, - Author = {Henglein, Fritz and Nielsen, Lasse}, - Booktitle = {Proceedings of the 38th annual ACM SIGPLAN-SIGACT symposium on Principles of programming languages}, - Date-Added = {2011-02-16 12:26:15 -0700}, - Date-Modified = {2011-02-16 13:03:08 -0700}, - Doi = {http://doi.acm.org/10.1145/1926385.1926429}, - Isbn = {978-1-4503-0490-0}, - Keywords = {axiomatization, coercion, coinduction, computational interpretation, containment, equivalence, regular expression, type, To-implement}, - Location = {Austin, Texas, USA}, - Numpages = {14}, - Pages = {385--398}, - Publisher = {ACM}, - Read = {1}, - Series = {POPL '11}, - Title = {Regular expression containment: coinductive axiomatization and computational interpretation}, - Url = {http://doi.acm.org/10.1145/1926385.1926429}, - Year = {2011}, - Bdsk-Url-1 = {http://doi.acm.org/10.1145/1926385.1926429}} - -@inproceedings{Hofmann:2011:SL:1926385.1926428, - Acmid = {1926428}, - Address = {New York, NY, USA}, - Author = {Hofmann, Martin and Pierce, Benjamin and Wagner, Daniel}, - Booktitle = {Proceedings of the 38th annual ACM SIGPLAN-SIGACT symposium on Principles of programming languages}, - Date-Added = {2011-02-15 13:41:22 -0700}, - Date-Modified = {2011-02-15 14:17:16 -0700}, - Doi = {http://doi.acm.org/10.1145/1926385.1926428}, - Isbn = {978-1-4503-0490-0}, - Keywords = {algebra, category theory, lens, view-update}, - Location = {Austin, Texas, USA}, - Numpages = {14}, - Pages = {371--384}, - Publisher = {ACM}, - Read = {1}, - Series = {POPL '11}, - Title = {Symmetric lenses}, - Url = {http://doi.acm.org/10.1145/1926385.1926428}, - Year = {2011}, - Bdsk-Url-1 = {http://doi.acm.org/10.1145/1926385.1926428}} - -@inproceedings{Novark:2010:DSH:1866307.1866371, - Acmid = {1866371}, - Address = {New York, NY, USA}, - Author = {Novark, Gene and Berger, Emery D.}, - Booktitle = {Proceedings of the 17th ACM conference on Computer and communications security}, - Date-Added = {2011-02-14 12:53:15 -0700}, - Date-Modified = {2011-02-14 12:53:16 -0700}, - Doi = {http://doi.acm.org/10.1145/1866307.1866371}, - Isbn = {978-1-4503-0245-6}, - Keywords = {buffer overflow, dangling pointer, dynamic memory allocation, memory errors}, - Location = {Chicago, Illinois, USA}, - Numpages = {12}, - Pages = {573--584}, - Publisher = {ACM}, - Read = {1}, - Series = {CCS '10}, - Title = {DieHarder: securing the heap}, - Url = {http://doi.acm.org/10.1145/1866307.1866371}, - Year = {2010}, - Bdsk-Url-1 = {http://doi.acm.org/10.1145/1866307.1866371}} - -@inproceedings{Felleisen:1987:CAH:41625.41654, - Acmid = {41654}, - Address = {New York, NY, USA}, - Author = {Felleisen, Mattias and Friedman, D. P.}, - Booktitle = {Proceedings of the 14th ACM SIGACT-SIGPLAN symposium on Principles of programming languages}, - Date-Added = {2011-02-11 13:56:52 -0700}, - Date-Modified = {2011-02-11 13:56:52 -0700}, - Doi = {http://doi.acm.org/10.1145/41625.41654}, - Isbn = {0-89791-215-2}, - Location = {Munich, West Germany}, - Pages = {314--}, - Publisher = {ACM}, - Series = {POPL '87}, - Title = {A calculus for assignments in higher-order languages}, - Url = {http://doi.acm.org/10.1145/41625.41654}, - Year = {1987}, - Bdsk-Url-1 = {http://doi.acm.org/10.1145/41625.41654}} - -@article{hochreiter_long_1997, - author = {Hochreiter, S. and Schmidhuber, J.}, - title = {Long {Short-Term} Memory}, - volume = {9}, - number = {8}, - journal = {Neural Computation}, - year = {1997}, - pages = {1735--1780} -} - -@Article{py03, - author = {Xavier D\'ecoret}, - title = "PyBiTex", - year = 2003 -} - -@Article{key03, - title = "A {bunch {of} braces {in}} title" -} - -@Article{key01, - author = "Simon {"}the {saint"} Templar", -} - -@Article{key01, - title = "The history of @ sign" -} - -Some {{comments} with unbalanced braces -....and a "commented" entry... - -Book{landru21, - author = {Landru, Henri D\'esir\'e}, - title = {A hundred recipes for you wife}, - publisher = {Culinary Expert Series}, - year = 1921 -} - -..some other comments..before a valid entry... - -@Book{steward03, - author = { Martha Steward }, - title = {Cooking behind bars}, - publisher = {Culinary Expert Series}, - year = 2003 -} - -...and finally an entry commented by the use of the special @Comment entry type. - -@Comment{steward03, - author = {Martha Steward}, - title = {Cooking behind bars}, - publisher = {Culinary Expert Series}, - year = 2003 -} - -@Comment{ - @Book{steward03, - author = {Martha Steward}, - title = {Cooking behind bars}, - publisher = {Culinary Expert Series}, - year = 2003 - } -} - -@String{mar = "march"} - -@Book{sweig42, - Author = { Stefan Sweig }, - title = { The impossible book }, - publisher = { Dead Poet Society}, - year = 1942, - month = mar -} - -@Book{sweig42a, - month = "1~mar" -} - -@Book{sweig42b, - month = "1~" # mar -} - -@Book{sweig42c, - month = "1~" # mar # "a" -} - -@preamble{"This bibliography was generated on \today"} - -@mastersthesis{salib:starkiller, - author = "Michael Salib", - title = "Starkiller: A Static Type Inferencer and Compiler for Python", - school = "Massachusetts Institute of Technology", - month = "May", - year = 2004 -} diff --git a/scribble-test/tests/scriblib/info.rkt b/scribble-test/tests/scriblib/info.rkt deleted file mode 100644 index 629436e3..00000000 --- a/scribble-test/tests/scriblib/info.rkt +++ /dev/null @@ -1,3 +0,0 @@ -#lang info - -(define test-responsibles '((all mflatt))) diff --git a/scribble-text-lib/LICENSE.txt b/scribble-text-lib/LICENSE.txt deleted file mode 100644 index f31116b7..00000000 --- a/scribble-text-lib/LICENSE.txt +++ /dev/null @@ -1,11 +0,0 @@ -scribble-text-lib -Copyright (c) 2010-2014 PLT Design Inc. - -This package is distributed under the GNU Lesser General Public -License (LGPL). This means that you can link this package into proprietary -applications, provided you follow the rules stated in the LGPL. You -can also modify this package; if you distribute a modified version, -you must distribute it under the terms of the LGPL, which in -particular means that you must release the source code for the -modified software. See http://www.gnu.org/copyleft/lesser.html -for more information. diff --git a/scribble-text-lib/info.rkt b/scribble-text-lib/info.rkt deleted file mode 100644 index d75dabcc..00000000 --- a/scribble-text-lib/info.rkt +++ /dev/null @@ -1,12 +0,0 @@ -#lang info - -(define collection 'multi) - -(define deps '("scheme-lib" - "base" "at-exp-lib")) - -(define pkg-desc "Language for text with embedded Racket code") - -(define pkg-authors '(mflatt eli)) - -(define version "1.1") diff --git a/scribble-text-lib/scribble/info.rkt b/scribble-text-lib/scribble/info.rkt deleted file mode 100644 index 4ef45358..00000000 --- a/scribble-text-lib/scribble/info.rkt +++ /dev/null @@ -1,3 +0,0 @@ -#lang info - -(define test-responsibles '(("text.rkt" eli))) diff --git a/scribble-text-lib/scribble/text.rkt b/scribble-text-lib/scribble/text.rkt deleted file mode 100644 index 36f57156..00000000 --- a/scribble-text-lib/scribble/text.rkt +++ /dev/null @@ -1,4 +0,0 @@ -#lang racket/base - -(require "text/main.rkt") -(provide (all-from-out "text/main.rkt")) diff --git a/scribble-text-lib/scribble/text/lang.rkt b/scribble-text-lib/scribble/text/lang.rkt deleted file mode 100644 index 1a8bf836..00000000 --- a/scribble-text-lib/scribble/text/lang.rkt +++ /dev/null @@ -1,9 +0,0 @@ -#lang racket/base - -(require "syntax-utils.rkt" "output.rkt" - racket/promise racket/list racket/string) - -(provide (except-out (all-from-out racket/base) #%module-begin) - (all-from-out "output.rkt" racket/promise racket/list racket/string) - (rename-out [module-begin/text #%module-begin] - [begin/text text] [include/text include])) diff --git a/scribble-text-lib/scribble/text/lang/reader.rkt b/scribble-text-lib/scribble/text/lang/reader.rkt deleted file mode 100644 index 19581ab1..00000000 --- a/scribble-text-lib/scribble/text/lang/reader.rkt +++ /dev/null @@ -1,11 +0,0 @@ -#lang s-exp syntax/module-reader - -scribble/text/lang - -#:read scribble:read-inside -#:read-syntax scribble:read-syntax-inside -#:whole-body-readers? #t -#:info (scribble-base-reader-info) - -(require (prefix-in scribble: scribble/reader) - (only-in scribble/base/reader scribble-base-reader-info)) diff --git a/scribble-text-lib/scribble/text/main.rkt b/scribble-text-lib/scribble/text/main.rkt deleted file mode 100644 index b6cdb1e9..00000000 --- a/scribble-text-lib/scribble/text/main.rkt +++ /dev/null @@ -1,7 +0,0 @@ -#lang racket/base - -(require "output.rkt" "syntax-utils.rkt" - racket/promise racket/list racket/string) - -(provide (all-from-out "output.rkt" racket/promise racket/list racket/string) - begin/text include/text) diff --git a/scribble-text-lib/scribble/text/output.rkt b/scribble-text-lib/scribble/text/output.rkt deleted file mode 100644 index 90eb78da..00000000 --- a/scribble-text-lib/scribble/text/output.rkt +++ /dev/null @@ -1,329 +0,0 @@ -#lang racket/base -(require racket/promise - racket/contract/base) - -(provide - outputable/c - (contract-out - [output (->* (outputable/c) (output-port?) void?)])) -;; See also `provide-special` below - -;; Outputs values for the `scribble/text' language: -;; - several atomic values are printed as in `display', -;; - promises, thunks, and boxes are indirections for the value they contain -;; (useful in various cases), -;; - some "special" values are used for controlling output (eg, flushing, -;; prefix changes, etc), -;; - specifically, `block's delimit indentation levels, `splice's do not, -;; - lists (more generally, pairs) are like either one depending on the context -;; (same as blocks/splices when inside a `block'/`splice'), at the toplevel -;; they default to blocks. -;; -;; Uses global state because `output' is wrapped around each expression in a -;; scribble/text file so this is much more convenient than wrapping the whole -;; module's body in a `list' (which will be difficult with definitions etc). -;; The state is a pair of prefixes -- one that is the prefix for the current -;; value (which gets extended with nested blocks), and the other is the prefix -;; for the current "line" (which is reset after a newline). The line-prefix is -;; needed because a line can hold a block, which means that the line-prefix -;; will apply for the contents of the block including newlines in it. This -;; state is associated with a port via a hash table. Another state that is -;; used is the port's column position, which is maintained by the system (when -;; line counts are enabled) -- this is used to tell what part of a prefix is -;; already displayed. -;; -;; Each prefix is either an integer (for a number of spaces) or a string. The -;; prefix mechanism can be disabled by using #f for the global prefix, and in -;; this case the line prefix can have (cons pfx lpfx) so it can be restored -- -;; used by `disable-prefix' and `restore-prefix' resp. (This is different from -;; a 0 prefix -- #f means that no prefix will be accumulated). -;; -(define (output x [p (current-output-port)]) - ;; these are the global prefix and the one that is local to the current line - (define pfxs (port->state p)) - ;; the current mode for lists - (define list=block? #t) - ;; the low-level string output function (can change with `with-writer') - (define write write-string) - ;; to get the output column - (define (getcol) (let-values ([(line col pos) (port-next-location p)]) col)) - ;; total size of the two prefixes - (define (2pfx-length pfx1 pfx2) - (if (and pfx1 pfx2) - (+ (if (number? pfx1) pfx1 (string-length pfx1)) - (if (number? pfx2) pfx2 (string-length pfx2))) - 0)) - ;; combines a prefix with a target column to get to - (define (pfx+col pfx) - (and pfx (let ([col (getcol)]) - (cond [(number? pfx) (max pfx col)] - [(>= (string-length pfx) col) pfx] - [else (string-append - pfx (make-spaces (- col (string-length pfx))))])))) - ;; adds two prefixes - (define (pfx+ pfx1 pfx2) - (and pfx1 pfx2 - (if (and (number? pfx1) (number? pfx2)) (+ pfx1 pfx2) - (string-append (if (number? pfx1) (make-spaces pfx1) pfx1) - (if (number? pfx2) (make-spaces pfx2) pfx2))))) - ;; prints two prefixes - (define (output-pfx col pfx1 pfx2) - (define-syntax-rule (->str pfx) (if (number? pfx) (make-spaces pfx) pfx)) - (define-syntax-rule (show pfx) ; optimize when not needed - (unless (eq? pfx 0) (write (->str pfx) p))) - (when (and pfx1 pfx2) - (if (eq? 0 col) - (begin (show pfx1) (show pfx2)) - (let ([len1 (if (number? pfx1) pfx1 (string-length pfx1))]) - (cond [(< col len1) (write (->str pfx1) p col) (show pfx2)] - [(= col len1) (show pfx2)] - [(eq? 0 pfx2)] - [else - (let ([col (- col len1)] - [len2 (if (number? pfx2) pfx2 (string-length pfx2))]) - (when (< col len2) (write (->str pfx2) p col)))]))))) - ;; the basic printing unit: strings - (define (output-string x) - (define pfx (mcar pfxs)) - (if (not pfx) ; prefix disabled? - (write x p) - (let ([len (string-length x)] - [nls (regexp-match-positions* #rx"\n" x)]) - (let loop ([start 0] [nls nls] [lpfx (mcdr pfxs)] [col (getcol)]) - (cond [(pair? nls) - (define nl (car nls)) - (if (regexp-match? #rx"^ *$" x start (car nl)) - (newline p) ; only spaces before the end of the line - (begin (output-pfx col pfx lpfx) - (write x p start (cdr nl)))) - (loop (cdr nl) (cdr nls) 0 0)] - ;; last substring from here (always set lpfx state when done) - [(start . = . len) - (set-mcdr! pfxs lpfx)] - [(col . > . (2pfx-length pfx lpfx)) - (set-mcdr! pfxs lpfx) - ;; the prefix was already shown, no accumulation needed - (write x p start)] - [else - (define m (regexp-match-positions #rx"^ +" x start)) - ;; accumulate spaces to lpfx, display if it's not all spaces - (define lpfx* (if m (pfx+ lpfx (- (cdar m) (caar m))) lpfx)) - (set-mcdr! pfxs lpfx*) - (unless (and m (= len (cdar m))) - (output-pfx col pfx lpfx*) - ;; the spaces were already added to lpfx - (write x p (if m (cdar m) start)))]))))) - ;; blocks and splices - (define (output-block c) - (define pfx (mcar pfxs)) - (define lpfx (mcdr pfxs)) - (define npfx (pfx+col (pfx+ pfx lpfx))) - (set-mcar! pfxs npfx) (set-mcdr! pfxs 0) - (if (list? c) - (for ([c (in-list c)]) (loop c)) - (begin (loop (car c)) (loop (cdr c)))) - (set-mcar! pfxs pfx) (set-mcdr! pfxs lpfx)) - (define (output-splice c) - (for-each loop c)) - ;; main loop - (define (loop x) - (cond - ;; no output for these - [(or (void? x) (not x) (null? x)) (void)] - ;; for lists and pairs the current line prefix is added to the global - ;; one, then output the contents recursively (no need to change the - ;; state, since we pass the values in the loop, and we'd need to restore - ;; it afterwards anyway) - [(pair? x) (if list=block? (output-block x) (output-splice x))] - ;; delayed values - [(and (procedure? x) (procedure-arity-includes? x 0)) (loop (x))] - [(promise? x) (loop (force x))] - [(box? x) (loop (unbox x))] - ;; special output wrappers - [(special? x) - (define c (special-contents x)) - (case (special-flag x) - ;; preserve tailness & avoid `set!' for blocks/splices if possible - [(block) (if list=block? - (output-block c) - (begin (set! list=block? #t) - (output-block c) - (set! list=block? #f)))] - [(splice) (if list=block? - (begin (set! list=block? #f) - (output-splice c) - (set! list=block? #t)) - (output-splice c))] - [(flush) ; useful before `disable-prefix' - (output-pfx (getcol) (mcar pfxs) (mcdr pfxs))] - [(disable-prefix) ; save the previous pfxs - (define pfx (mcar pfxs)) - (define lpfx (mcdr pfxs)) - (set-mcar! pfxs #f) (set-mcdr! pfxs (cons pfx lpfx)) - (for-each loop c) - (set-mcar! pfxs pfx) (set-mcdr! pfxs lpfx)] - [(restore-prefix) ; restore the previous pfxs - (define pfx (mcar pfxs)) - (define lpfx (mcdr pfxs)) - (define npfx (pfx+col (if (and (not pfx) (pair? lpfx)) - (pfx+ (car lpfx) (cdr lpfx)) - (pfx+ pfx lpfx)))) - (set-mcar! pfxs npfx) (set-mcdr! pfxs 0) - (for-each loop c) - (set-mcar! pfxs pfx) (set-mcdr! pfxs lpfx)] - [(add-prefix) ; add to the current prefix (unless it's #f) - (define pfx (mcar pfxs)) - (define lpfx (mcdr pfxs)) - (define npfx (pfx+ (pfx+col (pfx+ pfx lpfx)) (car c))) - (set-mcar! pfxs npfx) (set-mcdr! pfxs 0) - (for-each loop (cdr c)) - (set-mcar! pfxs pfx) (set-mcdr! pfxs lpfx)] - [(set-prefix) - (define pfx (mcar pfxs)) - (define lpfx (mcdr pfxs)) - (set-mcar! pfxs (car c)) (set-mcdr! pfxs 0) - (for-each loop (cdr c)) - (set-mcar! pfxs pfx) (set-mcdr! pfxs lpfx)] - [(with-writer) - (define old write) - (set! write (or (car c) write-string)) - (for-each loop (cdr c)) - (set! write old)] - #; ; no need for this hack yet - [(with-writer-change) - ;; The function gets the old writer and return a new one (useful to - ;; save the current writer and restore it inside). Could also be - ;; used to extend a writer, but that shows why a customizable writer - ;; is a bad choice: instead, it should be a list of substitutions - ;; that can be extended more conveniently. A simple implementation - ;; would be to chain functions that do substitutions. But that runs - ;; into problems when functions want to substitute the same thing, - ;; and worse: when the output of one function would get substituted - ;; again by another. Another approach would be to join matcher - ;; regexps with "|" after wrapping each one with parens, then find - ;; out which one matched by looking at the result and applying its - ;; substitution, but the problem with that is that is that it forbids - ;; having parens in the regexps -- this could be fixed by not - ;; parenthesizing each expression, and instead running the found - ;; match against each of the input regexps to find the matching one, - ;; but that can be very inefficient. Yet another issue is that in - ;; some cases we might *want* the "worse" feature mentioned earlier: - ;; for example, when we want to do some massaging of the input texts - ;; yet still have the result encoded for HTML output -- so perhaps - ;; the simple approach is still better. The only difference from the - ;; current `with-writer' is using a substituting function, so it can - ;; be composed with the current one instead of replacing it - ;; completely. - (define old write) - (set! write ((car c) write)) - (for-each loop (cdr c)) - (set! write old)] - [else (error 'output "unknown special value flag: ~e" - (special-flag x))])] - [else - (output-string - (cond [(string? x) x] - [(bytes? x) (bytes->string/utf-8 x)] - [(symbol? x) (symbol->string x)] - [(path? x) (path->string x)] - [(keyword? x) (keyword->string x)] - [(number? x) (number->string x)] - [(char? x) (string x)] - ;; generic fallback: throw an error (could use `display' so new - ;; values can define how they're shown, but the same - ;; functionality can be achieved with thunks and prop:procedure) - [else (error 'output "don't know how to render value: ~v" x)]))])) - ;; - (port-count-lines! p) - (loop x) - (void)) - -(define port->state - (let ([t (make-weak-hasheq)] - [last '(#f #f)]) ; cache for the last port, to avoid a hash lookup - (λ (p) - (if (eq? p (car last)) (cdr last) - (let ([s (or (hash-ref t p #f) - (let ([s (mcons 0 0)]) (hash-set! t p s) s))]) - (set! last (cons p s)) - s))))) - -;; special constructs - -(define-struct special (flag contents)) - -(define-syntax define/provide-special - (syntax-rules () - [(_ (name)) - (begin (provide (contract-out [name (->* () () #:rest (listof outputable/c) any/c)])) - (define (name . contents) - (make-special 'name contents)))] - [(_ (name [x ctc] ...)) - (begin (provide (contract-out [name (->* (ctc ...) () #:rest (listof outputable/c) any/c)])) - (define (name x ... . contents) - (make-special 'name (list* x ... contents))))] - [(_ name) - (begin (provide name) - (define name (make-special 'name #f)))])) - -(define/provide-special (block)) -(define/provide-special (splice)) -(define/provide-special flush) -(define/provide-special (disable-prefix)) -(define/provide-special (restore-prefix)) -(define/provide-special (add-prefix [pfx (or/c string? exact-nonnegative-integer?)])) -(define/provide-special (set-prefix [pfx (or/c string? exact-nonnegative-integer?)])) -(define/provide-special (with-writer [writer (or/c #f (->* (string? output-port?) (exact-nonnegative-integer? exact-nonnegative-integer?) any/c))])) -#; ; no need for this hack yet -(define/provide-special (with-writer-change writer)) - -(define make-spaces ; (efficiently) - (let ([t (make-hasheq)] [v (make-vector 200 #f)]) - (λ (n) - (or (if (< n 200) (vector-ref v n) (hash-ref t n #f)) - (let ([spaces (make-string n #\space)]) - (if (< n 200) (vector-set! v n spaces) (hash-set! t n spaces)) - spaces))))) - -;; Convenient utilities - -(provide add-newlines) -(define (add-newlines list #:sep [sep "\n"]) - (define r - (let loop ([list list]) - (if (null? list) - null - (let ([1st (car list)]) - (if (or (not 1st) (void? 1st)) - (loop (cdr list)) - (list* sep 1st (loop (cdr list)))))))) - (if (null? r) r (cdr r))) - -(provide split-lines) -(define (split-lines list) - (let loop ([list list] [cur '()] [r '()]) - (cond - [(null? list) (reverse (cons (reverse cur) r))] - [(equal? "\n" (car list)) (loop (cdr list) '() (cons (reverse cur) r))] - [else (loop (cdr list) (cons (car list) cur) r)]))) - -(define outputable/c - (lambda (v) #t) - ;; too expensive: - #; - (recursive-contract - (or/c void? - #f - null? - (cons/c outputable/c outputable/c) - (-> outputable/c) - promise? - (box/c outputable/c) - special? - string? - bytes? - symbol? - path? - keyword? - number? - char?))) diff --git a/scribble-text-lib/scribble/text/syntax-utils.rkt b/scribble-text-lib/scribble/text/syntax-utils.rkt deleted file mode 100644 index e3691cf3..00000000 --- a/scribble-text-lib/scribble/text/syntax-utils.rkt +++ /dev/null @@ -1,213 +0,0 @@ -#lang scheme/base - -(require "output.rkt" (for-syntax scheme/base syntax/kerncase)) - -(provide module-begin/text begin/text include/text begin/collect - process-begin/text) - -(begin-for-syntax - (define definition-ids ; ids that don't require forcing - (syntax->list #'(define-values define-syntaxes begin-for-syntax - require provide #%require #%provide #%declare))) - (define stoplist (append definition-ids (kernel-form-identifier-list))) - (define (definition-id? id) - (and (identifier? id) - (ormap (λ (i) (free-identifier=? id i)) definition-ids))) - (define (definition? x) - (syntax-case x () [(id . rest) (and (definition-id? #'id) #'id)] [_ #f])) - (define (begin?->list x) - (syntax-case x (begin) [(begin x ...) (syntax->list #'(x ...))] [_ #f])) - ;; This function is used to group a syntax list into triplets of consecutive - ;; scribble indentation syntaxes, an input expression, and scribble newlines. - ;; It is used to ignore indentations before a definition and newlines after - ;; it. See the following test cases for how it works. - (define (group-by pred? xs fun) - (let loop ([xs xs] [before '()] [cur #f] [after '()] [r '()]) - (define (add) (cons (fun (reverse before) cur (reverse after)) r)) - (if (null? xs) - (reverse (if (or cur (pair? before) (pair? after)) (add) r)) - (let* ([x (car xs)] [xs (cdr xs)] [p (pred? x)]) - (cond [(eq? '> p) (loop xs before cur (cons x after) r)] - [(eq? '< p) (if (or cur (pair? after)) - (loop xs (list x) #f '() (add)) - (loop xs (cons x before) cur after r))] - [(or cur (pair? after)) (loop xs '() x '() (add))] - [else (loop xs before x '() r)]))))) - (define (group-stxs stxs fun) - (group-by (λ (stx) - (define p (syntax-property stx 'scribble)) - (cond [(and (pair? p) (eq? (car p) 'newline)) '>] - [(eq? 'indentation p) '<] - [else #f])) - stxs fun)) - #; ; tests for this - (for-each - (λ (t) - (define r (group-by (λ (x) - (cond [(number? x) '<] [(symbol? x) '>] [else #f])) - (car t) - list)) - (unless (equal? r (cadr t)) (printf "FAILURE: ~s -> ~s\n" (car t) r))) - '([() ()] - [("a") ((() "a" ()))] - [("a" "b") ((() "a" ()) (() "b" ()))] - [(1 "a" x) (((1) "a" (x)))] - [(1 2 3 "a" x y z) (((1 2 3) "a" (x y z)))] - [(1 2 3 "a" "b" x y z) (((1 2 3) "a" ()) (() "b" (x y z)))] - [(1 2 "a" x 3 "b" y z) (((1 2) "a" (x)) ((3) "b" (y z)))] - [(1 2 "a" 3 "b" y z) (((1 2) "a" ()) ((3) "b" (y z)))] - [(1 2 "a" 3 x "b" y z) (((1 2) "a" ()) ((3) #f (x)) (() "b" (y z)))] - [(1 2 "a" 3 4 x "b" y z) (((1 2) "a" ()) ((3 4) #f (x)) (() "b" (y z)))] - [(1 2 "a" 3 w x "b" y z) (((1 2) "a" ()) ((3) #f (w x)) (() "b" (y z)))] - [(1) (((1) #f ()))] - [(x) ((() #f (x)))] - [(1 2 3) (((1 2 3) #f ()))] - [(x y z) ((() #f (x y z)))] - [(1 2 3 x y z) (((1 2 3) #f (x y z)))] - [(1 x 2 y 3 z) (((1) #f (x)) ((2) #f (y)) ((3) #f (z)))] - [(1 x y 2 3 z) (((1) #f (x y)) ((2 3) #f (z)))] - [(1 2 x 3) (((1 2) #f (x)) ((3) #f ()))] - [(w x 3 y z) ((() #f (w x)) ((3) #f (y z)))]))) - -(define-syntax (toplevel-decorate stx) - (define context (syntax-local-context)) - (syntax-case stx () - [(this decor (pre ...) expr (post ...)) - (let ([expr* (local-expand #'expr context stoplist)]) - (define pre? (not (null? (syntax-e #'(pre ...))))) - (define post? (not (null? (syntax-e #'(post ...))))) - (define (wrap expr) - (if (or pre? post?) - #`(begin #,@(if pre? #'((decor 'pre) ...) #'()) - #,expr - #,@(if post? #'((decor 'post) ...) #'())) - expr)) - (cond [(begin?->list expr*) - => (λ (xs) - (if (null? xs) - (if (or pre? post?) - #'(begin (decor 'pre) ... (decor 'post) ...) - expr*) - #`(process-begin/text begin decor - pre ... #,@xs post ...)))] - [(definition? expr*) expr*] ; dump pre/post - [else (wrap #`(decor #,expr*))]))])) - -(define-syntax (process-begin/text stx) - (define (process-body decor body) - (group-stxs - (syntax->list body) - (λ (pre expr post) - (with-syntax ([decor decor]) - (if (not expr) ; no need to decorate these - (with-syntax ([(x ...) (append pre post)]) #`(decor '(x ...))) - (with-syntax ([pre pre] - [post post]) - #`(toplevel-decorate decor pre #,expr post))))))) - (syntax-case stx () - [(_ beginner decor expr ...) - ;; add a dummy define and throw it away, to get rid of initial newlines - (with-syntax ([(_ expr ...) (process-body #'decor #'((define) expr ...))]) - #'(beginner expr ...))])) - -;; module-begin for text files -(define-syntax-rule (module-begin/text expr ...) - (#%plain-module-begin - (port-count-lines! (current-output-port)) - (process-begin/text begin output expr ...))) - -;; `begin'-like utility that allows definitions and collects values -(define-for-syntax (split-collect-body exprs ctx) - (let loop ([exprs exprs] ; expressions to scan - [ds '()] [es '()]) ; collected definitions and expressions - (if (null? exprs) - (values (reverse ds) (reverse es) '()) - (let ([expr* (local-expand (car exprs) ctx stoplist (car ctx))]) - (define (rebuild-bindings) - (syntax-case expr* () - [(def ids rhs) - (datum->syntax expr* - (list #'def - (map syntax-local-identifier-as-binding - (syntax->list #'ids)) - #'rhs) - expr* - expr*)])) - (syntax-case expr* (begin define-syntaxes define-values) - [(begin x ...) - (loop (append (syntax->list #'(x ...)) (cdr exprs)) ds es)] - [(define-syntaxes (id ...) rhs) - (andmap identifier? (syntax->list #'(id ...))) - (if (null? es) - (let ([ids (syntax->list #'(id ...))]) - (syntax-local-bind-syntaxes - ids (local-transformer-expand #'rhs 'expression '()) (car ctx)) - (loop (cdr exprs) (cons (rebuild-bindings) ds) es)) - ;; return the unexpanded expr, to be re-expanded later, in the - ;; right contexts - (values (reverse ds) (reverse es) exprs))] - [(define-values (id ...) rhs) - (andmap identifier? (syntax->list #'(id ...))) - (if (null? es) - (begin (syntax-local-bind-syntaxes - (syntax->list #'(id ...)) #f (car ctx)) - (loop (cdr exprs) (cons (rebuild-bindings) ds) es)) - ;; same note here - (values (reverse ds) (reverse es) exprs))] - [_ (loop (cdr exprs) ds (cons expr* es))]))))) -(define-syntax (begin/collect* stx) ; helper, has a boolean flag first - (define-values [exprs always-list?] - (let ([exprs (syntax->list stx)]) - (if (and (pair? exprs) (pair? (cdr exprs))) - (values (cddr exprs) (syntax-e (cadr exprs))) - (raise-syntax-error #f "bad syntax" stx)))) - (define context - (cons (syntax-local-make-definition-context) - (let ([old (syntax-local-context)]) (if (list? old) old '())))) - (define-values (defns nondefns rest) (split-collect-body exprs context)) - (define body - (cond [(pair? rest) #`(list* #,@nondefns (begin/collect* #t #,@rest))] - [(and (not always-list?) (= 1 (length nondefns))) (car nondefns)] - [else #`(list #,@nondefns)])) - (begin0 - (local-expand (if (null? defns) body #`(let () #,@defns #,body)) - context stoplist (car context)) - (internal-definition-context-seal (car context)))) -(define-syntax-rule (begin/collect x ...) (begin/collect* #f x ...)) - -;; begin for templates (allowing definition blocks) -(define-syntax (begin/text stx) - (syntax-case stx () - [(begin/text expr ...) - #'(process-begin/text begin/collect begin expr ...)])) - -;; include for templates -(require (for-syntax scheme/base (prefix-in scribble: scribble/reader) syntax/parse) - scheme/include) -(define-syntax (include/text stx) - (syntax-case stx () - [(_ path-spec) - (syntax/loc stx - (include/text #:command-char #f path-spec))] - [(_ #:command-char command-char path-spec) - (syntax/loc stx - (begin/text - (include-at/relative-to/reader - path-spec path-spec path-spec - (let ([xs #f] - [command-char-v command-char]) - (λ (src inp) - (unless xs - (set! xs (if command-char-v - (scribble:read-syntax-inside #:command-char command-char-v src inp) - (scribble:read-syntax-inside src inp))) - (when (syntax? xs) (set! xs (or (syntax->list xs) (list xs))))) - (if (null? xs) - eof - (let ([x (car xs)]) - (set! xs (cdr xs)) - (if (and (null? xs) - (let ([p (syntax-property x 'scribble)]) - (and (pair? p) (eq? (car p) 'newline)))) - eof ; throw away the last newline from the included file - x))))))))])) diff --git a/scribble-text-lib/scribble/text/wrap.rkt b/scribble-text-lib/scribble/text/wrap.rkt deleted file mode 100644 index b7336856..00000000 --- a/scribble-text-lib/scribble/text/wrap.rkt +++ /dev/null @@ -1,105 +0,0 @@ -#lang racket/base - -(provide wrap-width wrap-line) - -;; The default wrap width for `wrape-line'. -(define wrap-width (make-parameter 79)) - -;; `wrap-line' wraps the `line' string into a list of strings that fit `width' -;; characters. -;; -;; This is intended to be a building block for fancier wrappers -- for -;; examples, ones that have a prefix for all lines, that indent/outdent of the -;; first line, that treat some prefix regexp as a known indentation, that -;; "squeeze" all whitespaces, that can be used as part of some other output and -;; use the starting column to set the width, or even ones that take a multiline -;; string and identify paragraphs to wrap individually. For now, it's not -;; intended to be used directly so it's only documented here -- this is likely -;; to change if the interface is stable enough. -;; -;; `width' can be either a width or an improper list of widths, where the last -;; element is used for the rest. For example, (cons 72 70) indicates a width -;; of 72 characters for the first line, and 70 for the rest. -;; -;; `split-word' controls what happens when a word is split: it is invoked with -;; the word that is to be split, and an integer indicating how many characters -;; could fit on the first line. In most cases the string will be just a word, -;; but if it was the first/last word with only spaces before/after it, then the -;; string will have these spaces too. It is expected to return three values: -;; the first two are a string to put on the current line and a string that goes -;; first on the next one. Either of these can be `#f' to indicate nothing -;; (this is different from returning "", since that will keep the spaces next -;; to it). The third result is relevant when the second result is longer than -;; the wrapping width: #t indicates that the second result is considered a word -;; and should not be rewrapped, and #f indicates that it can. Spaces from the -;; original string are preserved, even if there are more than one space between -;; words; spaces between a word that moves to the next line and the preceding -;; word are usually dropped, but they can be preserved too if the first result -;; is "" rather than #f (and same for the space between a word that stays on -;; the same line when the following word moves down). If the first result is -;; `#f' and it was the only word on the line, then the line that would -;; otherwise be empty is dropped. Note that depending on what `split-word' -;; chooses to do, the result may still have lines that are longer than `width' -;; characters. The default `split-word' returns (values #f the-word #t). -;; -;; Side note: never returns an empty list. -;; -;; Caveats: considers only spaces as whitespace; not too efficient since it -;; constructs intermediate strings for its processing; the need for the third -;; boolean result from `split-word' is suspicious and might be dropped or -;; changed. -;; -(define (wrap-line line [width* (wrap-width)] [split-word #f]) - (define (loop str strs width*) - (define width (if (pair? width*) (car width*) width*)) - (define strlen (string-length str)) - (define (do-word s1 w1 w2 s2) ; s1--spaces--w1--word--w2--spaces--s2 - (define w1* (if (eq? 0 s1) 0 w1)) ;\ w1*..w2* includes spaces - (define w2* (if (eq? strlen s2) s2 w2)) ;/ for first/last word - (define word (substring str w1* w2*)) - (define-values [r1 r2 r3] - (if split-word (split-word word (- width w1*)) (values #f word #t))) - (let* ([1st (cond [r1 (string-append (substring str 0 w1*) r1)] - [(eq? w1* 0) #f] - [else (substring str 0 s1)])] - [strs (if 1st (cons 1st strs) strs)] - [width* (cond [(not r1) width*] - [(pair? width*) (cdr width*)] - [else width*])] - [2nd (and r2 r3 - (>= (string-length r2) - (if (pair? width*) (car width*) width*)) - r2)] - [strs (if 2nd (cons 2nd strs) strs)] - [width* (cond [(not r2) width*] - [(pair? width*) (cdr width*)] - [else width*])] - [rst (cond [(and (not 2nd) r2) - (string-append r2 (substring str w2*))] - [(eq? w2* strlen) #f] - [else (substring str s2)])]) - (if rst (loop rst strs width*) (reverse strs)))) - (cond - [(strlen . <= . width) (reverse (cons str strs))] - ;; wrapping point is inside a word - [(regexp-match-positions #rx"^([^ ][^ ]+) *" str (sub1 width)) - => (λ (m2) - (define m1 (regexp-match-positions #rx" *([^ ]+)$" str 0 width)) - (do-word (caar m1) (caadr m1) (cdadr m2) (cdar m2)))] - ;; wrapping point is probably between words - [(regexp-match-positions #rx" *([^ ]+) *$" str 0 width) - => (λ (m1) - (define m2 (regexp-match-positions #rx"[^ ]" str width)) - (if m2 ; there is a following word, so we are between words - (loop (substring str (caar m2)) - (cons (substring str 0 (cdadr m1)) strs) - (if (pair? width*) (cdr width*) width*)) - ;; no following word, so the following spaces are part of a word - ;; that does need to be split - (do-word (caar m1) (caadr m1) strlen strlen)))] - ;; all spaces in first line => part of the following word - [(regexp-match-positions #rx"([^ ]+) *" str width) - => (λ (m) (do-word 0 (caar m) (cdadr m) (cdar m)))] - ;; no word at all => split the whole "word" (which is all spaces) - [else (do-word 0 0 strlen strlen)])) - (loop line '() width*)) diff --git a/scribble/LICENSE.txt b/scribble/LICENSE.txt deleted file mode 100644 index ba83018d..00000000 --- a/scribble/LICENSE.txt +++ /dev/null @@ -1,11 +0,0 @@ -scribble -Copyright (c) 2010-2014 PLT Design Inc. - -This package is distributed under the GNU Lesser General Public -License (LGPL). This means that you can link this package into proprietary -applications, provided you follow the rules stated in the LGPL. You -can also modify this package; if you distribute a modified version, -you must distribute it under the terms of the LGPL, which in -particular means that you must release the source code for the -modified software. See http://www.gnu.org/copyleft/lesser.html -for more information. diff --git a/scribble/info.rkt b/scribble/info.rkt deleted file mode 100644 index 79e4d459..00000000 --- a/scribble/info.rkt +++ /dev/null @@ -1,12 +0,0 @@ -#lang info - -(define collection 'multi) - -(define deps '("scribble-lib" - "scribble-doc")) -(define implies '("scribble-lib" - "scribble-doc")) - -(define pkg-desc "Racket documentatation and typesetting tool") - -(define pkg-authors '(mflatt eli))