readmoi.core
Functions for generating ReadMoi webpages.
File resources/readmoi_options.edn contains a map with the following key-vals.
Required keys:
:sections, and within each section::section-name:section-href:section-skip-load?
Optional keys:
:clojars-badge?:copyright-holder:fn-map-additions:license-hiccup:project-description:project-name-formatted:preferred-project-metadata:readme-UUID:readme-html-directory:readme-html-filename:readme-markdown-directory:readme-markdown-filename:sections-directory:separator:wrap-at:def-patterns
Default values are sourced from the defaults file.
Dynamic vars that govern output formatting:
Dynamic vars that may be referred for creating content (e.g., Setup section):
See project’s documentation for details.
*def-patterns*
dynamic
A set of strings that governs when print-form-then-eval suppresses printing the evaluated value. Defaults to #{"def" "defn" "defmacro"}.
*fn-map-additions*
dynamic
Additional directives to pass to zprint governing formatting specific function invocations. Default {}.
*project-group*
dynamic
Project group as observed in Leiningen project.clj. Defaults to "" (i.e., empty string). Intended to be referenced within hiccup/html section files.
*project-name*
dynamic
Project name as observed in Leiningen project.clj. Defaults to "" (i.e., empty string). Intended to be referenced within hiccup/html section files.
*project-version*
dynamic
Project version as observed in Leiningen project.clj. Defaults to nil. Intended to be referenced within hiccup/html section files.
*separator*
dynamic
Characters that separate the string representation of the form to be evaluated and the string representation of the result. Default =>.
*wrap-at*
dynamic
Base-case column wrap, override-able by supplying extra args to the function that would otherwise consult this value, e.g., print-form-then-eval. Default 80.
-main
(-main & options-filename)Generate a project ReadMe. Sources options from file options-filename if supplied, otherwise resources/readmoi_options.edn.
Examples:
;; generate ReadMe using options from 'resources/readmoi_options.edn'
(-main)
;; generate ReadMe using options from 'other_directory/custom_readme_opt.edn'
(-main "other_directory/custom_readme_opt.edn")
Running from the command line, there’s a quirk to avoid. The lein run pattern seems to refer only the -main function, but not any of the other useful readmoi.core vars, such as print-form-then-eval, *project-version*, etc.
There are two options for running from the command line:
-
If the ReadMe contains a small number of them, always write the full, namespace-qualified name, e.g.
readmoi.core/print-form-then-eval,readmoi.core/*project-version*, etc. Then, invoke from the command line.Default options file ‘resources/readmoi_options.edn’.
$ lein run -m readmoi.coreExplicit options file ‘other_directory/custom_readme_opt.edn’.
$ lein run -m readmoi.core other_directory/custom_readme_opt.edn -
If the ReadMe contains a multitude of
readmoi.corereferences, then assemble a generator script similar to this:(ns readmoi-generator (:require [*project-version* -main print-form-then-eval])) (-main)Invoking
-mainfrom inside the generator script’s namespace in a REPL-attached editor permits writing simple names, i.e., print-form-then-eval and *project-version*, without their namespace qualifiers.Or, from the command line,
lein runcan now refer to the needed vars fromreadmoi.corebecause they’rerequire-d by the generator script.Default options file ‘resources/readmoi_options.edn’.
$ lein run -m readmoi-generatorExplicit options file ‘other_directory/custom_readme_opt.edn’.
$ lein run -m readmoi-generator other_directory/custom_readme_opt.edn
html-tidy-defaults
A vector of strings to be supplied to tidy-html as if on the command line. The most notable defaults are:
-iindent--quietlimits output report--wrapwrap lines at column160--write-backover-write original file
long-date
(long-date)Long-form date+time, with time zone removed.
Example:
(long-date) ;; => "2024-11-16 07:26:53"
prettyfy
(prettyfy s & width)Apply zprint formatting to string s. Optional integer width over-rides dynamic var *wrap-at*.
Provide zprint alternative function classifications by re-binding *fn-map-additions*.
Examples:
(prettyfy (str (eval (read-string "(repeat 3 (repeat 3 [77 88 99]))"))))
;; => "(([77 88 99] [77 88 99] [77 88 99])\n ([77 88 99] [77 88 99] [77 88 99])\n ([77 88 99] [77 88 99] [77 88 99]))"
…which would render to…
(([77 88 99] [77 88 99] [77 88 99])
([77 88 99] [77 88 99] [77 88 99])
([77 88 99] [77 88 99] [77 88 99]))
print-form-then-eval
(print-form-then-eval str-form)(print-form-then-eval str-form width-fn width-output)Returns a hiccup [:code] block wrapping a Clojure stringified form str-form, separator sep (default ' => '), and evaluated value.
def, defn, defmacro, and require expressions are only evaled; their output is not printed. These exclusions may be adjusted by associating a new (possibly empty) set of strings to option :def-patterns, or by binding *def-patterns*.
The two optional width args supersede *wrap-at*.
width-fngoverns the max-width of the renderedstr-form. Default*wrap-at*.width-outputgoverns the max-width of the rendered evaluation ofstr-form. Default(/ *wrap-at* 2).
Re-bind *wrap-at* to change base-case column-wrap width. The two optional width args, width-fn and width-output, supersede this value.
Re-bind *separator* to change the evaluation arrow.
Re-bind *fn-map-additions* to include additional zprint :fn-map directives.
See also prettyfy.
Note: Evaluated output can not contain an anonymous function of either (fn [x] ...) nor #(...) because zprint requires an internal reference to attempt a backtrack. Since the rendering of an anonymous function changes from one invocation to the next, there is no stable reference.
-
Basic example:
(print-form-then-eval "(+ 1 2)") ;; => [:code "(+ 1 2) ;; => 3"]After hiccup processing, renders as…
(+ 1 2) ;; => 3 -
Another example:
(print-form-then-eval "(map inc (range 1 6))") ;; => [:code "(map inc (range 1 6)) ;; => (2 3 4 5 6)"]Renders as…
(map inc (range 1 6)) ;; => (2 3 4 5 6) -
Example with supplied widths:
(print-form-then-eval "(map inc (range 1 6))" 10 5) ;; => [:code "(map inc\n (range\n 1\n 6))\n;; => (2\n;; 3\n;; 4\n;; 5\n;; 6)"]Renders as…
(map inc (range 1 6)) ;; => (2 ;; 3 ;; 4 ;; 5 ;; 6) -
Example with alternative arrow:
(binding [*separator* " --->> "] (print-form-then-eval "(inc 1)")) ;; => [:code "(inc 1) ;; --->> 2"]Renders as…
(inc 1) ;; --->> 2 -
Example with alternative ‘def’ pattern:
;; note: `defn-` is not included in the default exludes (binding [*def-patterns* #{"defn-"}] (print-form-then-eval "(defn- foo [x] x)")) ;; => [:code "(defn- foo [x] x)"]Renders as…
(defn- foo [x] x)
random-paragraph
(random-paragraph)Generate a random alpha-numeric paragraph.
For similar example, see random-sentence.
random-sentence
(random-sentence)Generates a random alpha-numeric sentence.
Example:
(random-sentence) ;; => "2g 0j45do 2xq n1nwrm 2a41nk g0x47ov v4bbix jo3687i2oh ofrg1o bi 2fc68 15pn1 o82hp3hu49l5d6xhx hk1bgdo2xex2c133bo."
readmoi-defaults
A hash-map residing in readmoi_defaults.clj that supplies the default values for the following options keys:
:clojars-badge:license-hiccup:sections-directory:readme-html-directory:readme-html-filename:readme-markdown-directory:readme-markdown-filename:tidy-html?
Override default values by associating new values into the ReadMoi options hash-map. See also the readmoi.core namespace docstring.
short-date
(short-date)Short-form date, named month.
Example:
(short-date) ;; => "2024 November 16"
tidy-html-body
(tidy-html-body f)(tidy-html-body f options)Given html body (or substantially html-like markdown), contained in file pathname string f, use tidy-html to wrap and indent the html. Tidy-ing settings may be supplied by options vector, which completely replaces html-tidy-defaults.
Useful for tidy-ing only an html body for supplying to GitHub’s markdown processor.
Requires local installation of html-tidy.
See also tidy-html-document for a similar utility that operates on a full html document.
tidy-html-document
(tidy-html-document f)(tidy-html-document f options)For html document (or substantially html-like markdown), contained in file pathname string f, use tidy-html to wrap and indent the html. Tidy-ing settings may be supplied by options vector, which completely replaces html-tidy-defaults.
Requires local installation of html-tidy.
Note: This utility delegates the tidy-ing task to tidy-html, which insists on adding a missing html head, title, etc. To tidy a fragment, i.e., an html body, use tidy-html-body.
Note: When tidy-ing, in-line [:code ...] blocks et. al., may be broken over lines at an undesirable space. Use a Unicode non-breaking space, U+00A0, to maintain a coherent block. An html non-breaking space entity, renders literally, and thus not suitable for this purpose.