Happy Making!
“Creating Made Simple.” | |
---|---|
Composer CMS v3.1 | License: GPL |
Gary B. Genett | composer@garybgenett.net |
– Formats: webpage / html / pdf / epub / revealjs.html / docx
Composer is a simple but powerful CMS based on Pandoc, Bootstrap and GNU Make. It is a document and website build system that processes directories or individual files in Markdown format.
Traditionally, CMS stands for Content Management System. Composer is designed to be a Content Make System. Written content is vastly easier to manage as plain text, which can be crafted with simple editors and tracked with revision control. However, professional documentation, publications, and websites require formatting that is dynamic and feature-rich.
Pandoc is an extremely powerful document conversion tool, and is a widely used standard for processing Markdown into other formats. While it has reasonable defaults, there are a large number of options, and additional tools are required for some formats and features.
Composer consolidates all the necessary components, simplifies the options, and prettifies the output formats, all in one place. It also serves as a build system, so that large repositories can be managed as documentation archives or published as Static Websites.
Use make help
to get started:
make [-f .../Makefile] [variables] <filename>.<extension>
make [-f .../Makefile] [variables] <target>
Create documents from source Markdown files (see Formatting Variables):
make README.html
make Composer-v3.1.Manual.html c_list="README.md LICENSE.md"
Save a persistent configuration (see Recommended Workflow and Configuration Settings):
make template >.composer.mk
$EDITOR .composer.mk
override COMPOSER_TARGETS := .targets Composer-v3.1.Manual.html
override Composer-v3.1.Manual.html := README.md LICENSE.md
make clean
make all
Recursively install and build an entire directory tree (see Recommended Workflow):
cd .../documents
mv .../composer .Composer
make -f .Composer/Makefile install-all
make all-all
See help-all
for full details and additional targets.
The guiding principles of Composer:
Direct support for key document types (see Document Formatting):
Composer has almost no external dependencies. All needed components are integrated directly into the repository, including Pandoc and YQ. Composer does require a minimal command-line environment based on GNU tools, particularly GNU Make, which is standard for all GNU/Linux systems. The Windows Subsystem for Linux for Windows and MacPorts for macOS both provide suitable environments.
The one large external requirement is TeX Live, and it can be installed using the package managers of each of the above systems. It is only necessary for creating PDF files.
Below are the versions of the components in the repository, and the tested versions of external tools for this iteration of Composer. Use check to validate your system.
Repository | Commit | License |
---|---|---|
Pandoc | 2.18 | GPL |
YQ | v4.24.2 | MIT |
Bootstrap | v5.1.3 | MIT |
Bootlint | v1.1.0 | MIT |
Bootswatch | v5.1.3 | MIT |
Font Awesome | 6.1.2 | MIT / CC-BY |
Water.css | d950cbc9f8607521587f | MIT |
Markdown Viewer | 3bd40d84c071379440b3 | MIT |
Markdown Themes | 6b3643d0f703727d8472 | None |
Reveal.js | 4.3.1 | MIT |
Google Firebase | v12.4.7 | MIT |
Project | Composer Version |
---|---|
GNU Bash | 5.1.16 |
– GNU Coreutils | 8.32 |
– GNU Findutils | 4.9.0 |
– GNU Sed | 4.8 |
GNU Make | 4.3 |
– Pandoc | 2.18 |
– YQ | 4.24.2 |
– TeX Live PDF | 2021 3.141592653-2.6-1.40.22 |
Supporting Tools: | – |
– Git SCM | 2.37.4 |
– GNU Diffutils | 3.8 |
– Rsync | 3.2.4 |
Markdown Viewer is included both for its CSS stylesheets, and for real-time rendering of Markdown files as they are being written. To install, follow the instructions in the README.md
.
Google Firebase is only necessary for uploading via the export-all and export-force targets. Binaries are included in the repository, but do not seem to work with all versions of their respective operating systems. If the included binary fails, use +update-firebase-tools
to build a local version (see +update-*).
The versions of the integrated repositories can be changed, if desired (see Repository Versions).
The ideal workflow is to put Composer in a top-level .Composer
for each directory tree you want to manage, creating a structure similar to this:
.../.Composer
.../
.../tld/
.../tld/sub/
To save on disk space, using a central Composer install for multiple directory trees, the init target can be used to create a linked .Composer
directory:
make -f .../Makefile init
The directory tree can then be converted to a Composer documentation archive (Quick Start example):
make -f .Composer/Makefile install-all
make all-all
If specific settings need to be used, either globally or per-directory, .composer.mk
and .composer.yml
files can be created (see Configuration Settings, Quick Start example):
make template >.composer.mk && $EDITOR .composer.mk
make template.yml >.composer.yml && $EDITOR .composer.yml
Custom targets can also be defined, using standard GNU Make syntax (see Custom Targets).
GNU Make does not support file and directory names with spaces in them, and neither does Composer. Documentation archives which have such files or directories will produce unexpected results.
It is fully supported for input files to be symbolic links to files that reside outside the documentation archive:
cd .../tld
ln -rs .../README.md ./
make README.html
Similarly to source code, GNU Make is meant to only run one instance within the directory at a time, and Composer shares this requirement. It should be run as a single user, to avoid duplication and conflicts. Concurrent runs will produce unexpected results. It is highly recommended to set MAKEJOBS to a value greater than the default, to speed up processing.
It is best practice to install-force after every Composer upgrade, in case there are any changes to the Makefile
template (see Templates). Everything in Composer sources from the main Makefile
, so that is the only file which requires review to see what changes have been made between versions.
The archive is ready, and each directory is both a part of the collective and its own individual instance. Targets can be run per-file, per-directory, or recursively through an entire directory tree. The most commonly used targets are in Primary Targets.
Welcome to Composer. Happy Making!
#WORKING:DOCS###################################################################
.../artifacts/pandoc/template.*
.../artifacts/pandoc/reference.*
.../artifacts/composer/composer-site.css
.../artifacts/composer/composer-html.css
As outlined in Overview and Principles, a primary goal of Composer is to produce beautiful and professional output. Pandoc does reasonably well at this, and yet its primary focus is document conversion, not document formatting. Composer fills this gap by specifically tuning a select list of the most commonly used document formats.
The input Markdown format used by Composer is the Pandoc default. However, the Pandoc Extensions list has been modified slightly. See that section and the Pandoc Markdown documentation for the exact list and details for each.
Further options for each document type are in Formatting Variables. All improvements not exposed as variables will apply to all documents created with a given instance of Composer.
Note that all the files referenced below are embedded in the ‘Embedded Files’ section of the Makefile
. They are exported by the +release target (using +setup), and will be overwritten whenever it is run.
Bootstrap is a leading web development framework, capable of building static webpages that behave dynamically. Static sites are very easy and inexpensive to host, and are extremely responsive compared to truly dynamic webpages.
Composer uses this framework to transform an archive of simple text files into a modern website, with the appearance and behavior of dynamically indexed pages.
#WORKING:DOCS###################################################################
.../artifacts/bootstrap/bootstrap.js
.../artifacts/bootstrap/bootstrap.css
.../artifacts/composer/composer.site.css
.../artifacts/composer/composer.site.overlay.light.css
.../artifacts/composer/composer.site.overlay.dark.css
.../artifacts/images/logo.img
.../artifacts/images/icon.img
.../bootswatch/docs/index.html
– Examples: Example Website / README.site.html
In addition to being a helpful real-time rendering tool, Markdown Viewer includes several CSS stylesheets that are much more visually appealing than the Pandoc default, and which behave like normal webpages, so Composer uses them for all HTML-based document types, including EPUB.
Information on installing Markdown Viewer for use as a Markdown rendering tool is in Requirements.
– Example: README.html
The default formatting for PDF is geared towards academic papers and the typesetting of printed books, instead of documents that are intended to be purely digital.
Internally, Pandoc first converts to LaTeX, and then uses TeX Live to convert into the final PDF. Composer inserts customized LaTeX to modify the final output:
.../artifacts/composer/composer-pdf.header
#WORK # …/artifacts/composer/composer.pdf.latex
– Example: README.pdf
The EPUB format is essentially packaged HTML, so Composer uses the same Markdown Viewer CSS stylesheets for it.
– Example: README.epub
The CSS for Reveal.js presentations has been modified to create a more traditional and readable end result. The customized version is at:
.../artifacts/composer/composer-revealjs.css
#WORK # …/artifacts/composer/composer.revealjs.css
#WORK # rework this
It links in a default theme from the .../reveal.js/dist/theme
directory. Edit the location in the file, or use c_css to select a different theme.
It is set up so that a logo can be placed in the upper right hand corner on each slide, for presentations that need to be branded. Simply copy an image file to the logo location:
.../artifacts/images/logo.img
To have different logos for different directories (using Recommended Workflow, Configuration Settings and Precedence Rules):
#WORK # no longer the best way to do this… cd …/presentations cp …/logo.img ./ ln -rs …/.Composer/artifacts/composer/composer.revealjs.css ./.composer-revealjs.css echo ‘override c_type := revealjs’ >>./.composer.mk make all
– Example: README.revealjs.html
The internal Pandoc templates for these are exported by Composer, so they are available for customization:
.../artifacts/pandoc/reference.docx
.../artifacts/pandoc/reference.pptx
They are not currently modified by Composer.
– Example: README.docx
This output format is still parsable by Pandoc as valid Markdown, but is formatted to read as pure plain text that is only 80
columns wide. There are cases where this conversion is desirable, such as technical documentation, where it is easier to write and format as Pandoc Markdown but the output needs to be in a universally accepted text layout and presentation.
Composer currently does not modify this format, other than using the --columns=80
and --wrap=auto
options to Pandoc.
Output Markdown that is specific to Pandoc. This is for linting or creating standardized versions of source files for shared archives.
Due to the expressed purposes of this format, Composer will never modify it.
#WORKING:DOCS###################################################################
Composer uses .composer.mk
files for persistent settings and definition of Custom Targets. By default, they are chained together across their Makefile
tree (see COMPOSER_INCLUDE in Control Variables). A .composer.mk
in the main Composer directory will be global to all directories. The targets and settings in the most local file override all others (see Precedence Rules).
The easiest way to create new .composer.mk
and .composer.yml
files is with the template and template.yml targets (Quick Start example):
make template >.composer.mk && $EDITOR .composer.mk
make template.yml >.composer.yml && $EDITOR .composer.yml
All variable definitions must be in the override [variable] := [value]
format from the template target. Doing otherwise will result in unexpected behavior, and is not supported. The regular expression that is used to detect them:
override[[:space:]]+([^[:space:]]+)[[:space:]]+[:][=]
Variables can also be specified per-target, using GNU Make syntax:
README.%: override c_toc := 0
README.revealjs.html: override c_toc :=
In this case, there are multiple definitions that could apply to README.revealjs.html
, due to the %
wildcard. Since the most specific target match is used, the final value for c_toc would be empty.
Example configuration files:
.../.composer.mk
.../artifacts/.composer.yml
#WORK …/artifacts/README.site.yml …/README.site.html.yml
All processing in Composer is done in global-to-local order, so that the most local file or value always takes precedence.
Both .composer.mk
and .composer.yml
files follow the model illustrated in COMPOSER_INCLUDE under Control Variables. This means that the values in the most local file override all others.
#WORKING:DOCS###################################################################
All values in .composer.mk
take precedence over everything else, including environment variables.
#WORK # the same for all…
.../artifacts/composer/composer-pdf.header
.../.composer-pdf.header
./README.pdf.header
#WORK # the same for all…
.../artifacts/composer/composer-html.css
.../.composer-html.css
./README.html.css
#WORK # the c_css layering…
<extension>
.css.composer.yml
:: [site-config].[css_overlay]The first four are core to Composer, and are always included. COMPOSER_INCLUDE and CURDIR files are optional, and only used if they exist.
Variable aliases, such as COMPOSER_DEBUGIT
/c_debug
/V
are prioritized in the order shown, with COMPOSER_*
taking precedence over c_*
, over the short alias.
Full COMPOSER_*
variable names should always be used in .composer.mk
files, to avoid being overwritten by recursive environment persistence.
#WORK # does not seem to be documented anywhere… test it, with examples here, regardless… # seems to be: yaml_metadata, –defaults, –metadata*, etc.
If there are files or directories that have dependencies on other files or directories being processed first, this can be done simply using GNU Make syntax in .composer.mk
:
LICENSE.html: README.html
subdirs-all-artifacts: subdirs-all-pandoc
This would require README.html
to be completed before LICENSE.html
, and for pandoc
to be processed before artifacts
. Directories need to be specified with the subdirs-all-*
syntax in order to avoid conflicts with target names (see Custom Targets).
Chaining of dependencies can be as complex and layered as GNU Make will support. Note that if a file or directory is set to depend on a target, that target will be run whenever the file or directory is called.
If needed, custom targets can be defined inside a .composer.mk
file (see Configuration Settings), using standard GNU Make syntax. Naming them as *-export, *-clean or *-all will include them in runs of the respective targets. Targets with any other names will need to be run manually, or included in COMPOSER_TARGETS.
#WORK # …or, via Specifying Dependencies
There are a few limitations when naming custom targets. Targets starting with the regular expression [.+]
are hidden, and are skipped by auto-detection. Additionally, there is a list of reserved targets in Reserved, along with a list of reserved variables.
Any included .composer.mk
files are sourced early in the main Composer Makefile
, so matching targets and most variables will be overridden. In the case of conflicting targets, GNU Make will produce warning messages. Variables will have their values changed silently. Changing the values of internal Composer variables is not recommended or supported.
A final note is that *-export, *-clean and *-all targets are stripped from COMPOSER_TARGETS. In cases where this results in an empty COMPOSER_TARGETS, there will be a message and no actions will be taken.
There are a few internal variables used by +update to select the repository and binary versions of integrated components (see Requirements). These are exposed for configuration, but only within .composer.mk
:
PANDOC_VER
(must be a binary version number)PANDOC_CMT
(defaults to PANDOC_VER
)YQ_VER
(must be a binary version number)YQ_CMT
(defaults to YQ_VER
)BOOTSTRAP_CMT
BOOTLINT_CMT
BOOTSWATCH_CMT
FONTAWES_CMT
WATERCSS_CMT
MDVIEWER_CMT
MDTHEMES_CMT
REVEALJS_CMT
FIREBASE_VER
(must be a binary version number)FIREBASE_CMT
(defaults to FIREBASE_VER
)Binaries for Pandoc, YQ and Google Firebase are installed in their respective directories. By moving or removing them, or changing the version numbers and foregoing all relevant variations of +update, the system versions will be used instead. This will work as long as the commit versions match, so that supporting files are in alignment, particularly for Pandoc.
It is possible that changing the versions will introduce incompatibilities with Composer, which are usually impacts to the prettification of output files (see Document Formatting). There may also be upstream changes to the command-line options for these tools.
Variable | Purpose | Value |
---|---|---|
c_site ~ S |
Enable Static Websites | |
c_type ~ T |
Desired output format | html |
c_base ~ B |
Base of output file | |
c_list ~ L |
List of input files(s) | |
c_lang ~ a |
Language for document headers | en-US |
c_logo ~ g |
Logo image (HTML formats) | logo.img |
c_icon ~ i |
Icon image (HTML formats) | icon.img |
c_css ~ c |
Location of CSS file | theme.html-default.css |
c_toc ~ t |
Table of contents depth | |
c_level ~ l |
Chapter/slide header level | 2 |
c_margin ~ m |
Size of margins (PDF) | 0.8in |
c_options ~ o |
Custom Pandoc options |
Values (c_type) | Format | Extension |
---|---|---|
html |
HyperText Markup Language | *.html |
pdf |
Portable Document Format | |
epub |
Electronic Publication | *.epub |
revealjs |
Reveal.js Presentation | *.revealjs.html |
docx |
Microsoft Word | *.docx |
pptx |
Microsoft PowerPoint | *.pptx |
text |
Plain Text (well-formatted) | *.txt |
markdown |
Markdown (for testing) | *.md.txt |
css_alt
= Use the alternate default stylesheet0
= Revert to the Pandoc default0
= List all headers, and number sections0
= Varies by c_type (see c_level)c_margin_top
~ mt
c_margin_bottom
~ mb
c_margin_left
~ ml
c_margin_right
~ mr
#WORK
The compose target uses these variables to decide what to build and how. The output file is [c_base].<extension>
, and is constructed from the c_list input files, in order. The <extension>
is selected based on the c_type table above. Generally, it is not required to use the compose target directly for supported c_type files, since it is run automatically based on what output file <extension>
is specified.
The automatic input file detection works by matching one of the following (Quick Start example):
make README.html ~ README (empty [COMPOSER_EXT])
make README.html ~ README.md
make README.md.html ~ README.md
make Composer-v3.1.Manual.html c_list="README.md LICENSE.md"
Other values for c_type, such as json
or man
, for example, can be passed through to Pandoc manually:
make compose c_type="json" c_base="README" c_list="README.md"
make compose c_type="man" c_base="Composer-v3.1.Manual" c_list="README.md"
Any of the file types supported by Pandoc can be created this way. The only limitation is that the input files must be in Markdown format.
Finally, note that c_list has alternate meanings for these targets:
#WORK # 1 # revealjs
#WORK # document /.g/_data/zactive/coding/composer/artifacts/images
.../artifacts/images
#WORK # html # revealjs
#WORK # document /.g/_data/zactive/coding/composer/artifacts/theme
.../artifacts/themes
css_alt
selects the alternate default stylesheet. Using 0
reverts to the Pandoc default.[1-6]
creates a table of contents at the beginning of the document. The numerical value is how many header levels deep the table should go. A value of 6
lists all header levels.0
lists all header levels, and additionally numbers all the sections, for reference.section-divs
, which wraps headings and their section content in <section>
tags and attaches identifiers to them instead of the headings themselves. This is for CSS styling, and is generally desired.part
, chapter
, and section
. This sets the top-level header to the specified type, which changes the way the document is presented. Using part
divides the document into “Parts”, each starting with a stand-alone title page. With this division type, each second-level heading starts a new “Chapter”. A chapter
simply starts a new section on a new page, and lower-level headings continue as running portions within it. Finally, section
creates one long running document with no blank pages or section breaks (like a HTML page). To set the desired value:
part
~ 0
chapter
~ 2
section
~ Any other value0
simply sets it to the default value of 2
.0
enables persistent headings, and all other values use the default.c_margin_top
, c_margin_bottom
, c_margin_left
and c_margin_right
.
Variable | Purpose | Value |
---|---|---|
MAKEJOBS | Parallel processing threads | 1 (makejobs) |
COMPOSER_DEBUGIT | Use verbose output | (debugit) |
COMPOSER_DOCOLOR | Enable title/color sequences | (boolean) |
COMPOSER_INCLUDE | Include all: .composer.mk |
1 (boolean) |
COMPOSER_DEPENDS | Sub-directories first: all | (boolean) |
COMPOSER_KEEPING | Log entries / cache files | 100 (keeping) |
COMPOSER_LOG | Timestamped command log | .composer.log |
COMPOSER_EXT | Markdown file extension | .md |
COMPOSER_TARGETS | See: all/clean | config/targets |
COMPOSER_SUBDIRS | See: all/clean/install | config/targets |
COMPOSER_EXPORTS | See: c_site/export | config |
COMPOSER_IGNORES | See: c_site/export | config |
c_jobs
~ J
c_debug
~ V
c_color
~ C
(makejobs)
= empty is disabled / number of threads / 0
is no limit(debugit)
= empty is disabled / any value enables / 0
is full tracing(keeping)
= empty is none / number to keep / 0
is no limit(boolean)
= empty is disabled / any value enables#WORK # a small number of large directories will process faster than a large number of small ones, especially with site # windows subsystem for linux (increase memory…): /mnt/c/Users/*/.wslconfig # [wsl2] # processors=2 # memory=2GB # swap=0
make
that instantiates into a sub-directory has it’s own jobs server, so the total number of threads running can proliferate rapidly.0
does parallel execution with no thread limit.1
.0
outputs complete GNU Make and GNU Bash debugging information. This is extraordinarily verbose, and it is recommended to pipe it to a file for review.$PAGER
, or just make it harder to read for some.MAKEFILE_LIST
, all the way back to the main Makefile
, looking for .composer.mk
files in each directory. By default, it reads all of them in order starting from the main Composer directory. When this option is disabled, only Composer and the current directory will be used..Composer/.composer.mk
, .composer.mk
, tld/.composer.mk
, and finally tld/sub/.composer.mk
. With this disabled, only .Composer/.composer.mk
and tld/sub/.composer.mk
are read..Composer
directory at the top level for each documentation archive (see Recommended Workflow). Not only does it allow for strict version control of Composer per-archive, it also provides a mechanism for setting Composer Variables globally..composer.yml
and .composer-*
files to be processed in an identical manner (see Configuration Files and Header & CSS Files under Precedence Rules).Example directory tree (see Recommended Workflow):
.../.Composer/Makefile
.../.Composer/.composer.mk
.../Makefile
.../.composer.mk
.../tld/Makefile
.../tld/.composer.mk
.../tld/sub/Makefile
.../tld/sub/.composer.mk
.../
, .../tld
, and then .../tld/sub
. If the higher-level directories have dependencies on the sub-directories being run first, this will support that by doing them in reverse order, processing them from bottom to top.#WORK # 0 deletes all… # COMPOSER_KEEPING test & document # clean-clean test & document # clean-clean only runs on all, so single files could go forever…?
.composer.log
log file in the current directory whenever it executes Pandoc. This provides some accounting, and is used by list to determine which *.md
files have been updated since the last time Composer was run.*.md
. This is for auto-detection of files to add to COMPOSER_TARGETS, files to output for list, and other tasks. This is a widely used standard, including GitHub. Another commonly used extension is: *.markdown
.README
and LICENSE
in source code directories. Setting this to an empty value causes them to be detected and output. It also causes all other files to be processed, because it becomes the wildcard *
, so use with care. It is likely best to use COMPOSER_TARGETS to explicitly set the targets list in these situations.#WORK # add a note that a per-target “override README.html :=” is probably best… # come to think of it, probably should just go back to not allowing an empty value…
#WORK # document! # .targets # COMPOSER_TARGETS # COMPOSER_SUBDIRS # COMPOSER_EXPORTS # COMPOSER_IGNORES
#WORK # does not pick up .* files/directories # these are actually excluded in COMPOSER_IGNORES now… # wildcard ’*’ is taken literally
.
are skipped..composer.mk
file (see Custom Targets)..null
target is special, and when used as a value for COMPOSER_TARGETS or COMPOSER_SUBDIRS it will display a message and do nothing. A side-effect of this target is that an actual file or directory named .null
will never be created or removed by Composer.#WORK # wildcard ’*’ is taken literally
.null
target. Hidden directories that start with .
are skipped.#WORK # this one will be complicated… maybe? # has, effectively, the same .null
behavior as above… # also overridden by COMPOSER_IGNORES # document .targets token… # .null has no special meaning and is removed if present # hidden variables… # /.g/_data/zactive/coding/composer/+Composer # # # # # wildcard ’*’ globs
#WORK # either remove site here, or add it to the ones above… # also, there are also implications for site-library… # .targets has no special meaning and is removed if present # .null has no special meaning and is removed if present # hard-coded +Composer .* +* / .* + # . +* should also be documented in the “Operation” section somewhere… # wildcard ’*’ globs
Variable | Purpose | Value |
---|---|---|
CURDIR | GNU Make current directory | $PWD :: make |
COMPOSER_CURDIR | Detects COMPOSER_INCLUDE | CURDIR :: .composer.mk |
COMPOSER_DIR | Location of Composer | …/composer |
COMPOSER_ROOT | Topmost level of current tree | …/composer |
COMPOSER_EXPORT | Target: export | COMPOSER_ROOT/+Composer (mk) |
COMPOSER_LIBRARY | Target: site/site-library | (yml) |
COMPOSER_SRC | Repositories and downloads | COMPOSER_DIR/.sources |
COMPOSER_ART | Composer supporting files | COMPOSER_DIR/artifacts |
COMPOSER_DAT | Pandoc supporting files | COMPOSER_ART/pandoc |
COMPOSER_TMP | Cache and working directory | CURDIR/.composer.tmp |
(mk)
= configurable in .composer.mk
(yml)
= configurable in .composer.yml
These are internal variables only exposed within .composer.mk
files. See Configuration Settings and Custom Targets for more details.
#WORK
#WORK # can also be used to detect first pass, using “ifeq”, to prevent “warning: overriding recipe for target” warnings…
.composer.mk
file in the GNU Make running directory, and is empty otherwise. This provides a way to limit particular portions of the file to the local directory, regardless of whether COMPOSER_INCLUDE is set or not..composer.mk
files with this, except for the specific portions that need to be passed down, similar to template (see Templates).Example usage in a .composer.mk
file:
ifneq ($(COMPOSER_CURDIR),)
...
endif
#WORK
#WORK
#WORK # hidden variables…
#WORK
#WORK
#WORK
#WORK
#WORK
Target | Purpose |
---|---|
help | Basic help overview (default) |
help-all | Console version of README.md (no reference sections) |
template | Print settings template: .composer.mk |
template.yml | Print settings template: .composer.yml |
template.md | Print markdown file template |
compose | Document creation engine (see c_type) |
site | Build HTML files as Static Websites (see c_site) |
site-all | Do site recursively: COMPOSER_SUBDIRS |
site-force | Do site recursively: including COMPOSER_LIBRARY |
site-clean | Remove c_site only: COMPOSER_LIBRARY/COMPOSER_TMP |
install | Current directory initialization: Makefile |
install-all | Do install recursively (no overwrite) |
install-force | Recursively force overwrite of Makefile files |
clean | Remove output files: COMPOSER_TARGETS :: *-clean |
clean-all | Do clean recursively: COMPOSER_SUBDIRS |
*-clean | Any targets named this way will also be run by clean |
all | Create output files: COMPOSER_TARGETS :: *-all |
all-all | Do all recursively: COMPOSER_SUBDIRS |
*-all | Any targets named this way will also be run by all |
list | Show updated files: * COMPOSER_EXT >> COMPOSER_LOG |
.composer.mk
(see Configuration Settings).composer.yml
(see Static Websites and Configuration Settings)markdown
#WORK # site rebuilds indexes, force recursively
#WORK
Makefile
files to set up a directory or a directory tree as a Composer archive. By default, it will not overwrite any existing files.Makefile
files.Makefile
created for it modified to point to Composer.
Target | Purpose |
---|---|
+release | Upgrade all tools and supporting files to next versions |
+release-all | Also make README.* files and Static Websites |
+update | Update all included components (see Requirements) |
+update-all | Additionally perform all source code builds |
+update-list | Show changes made to each (see Repository Versions) |
+update-* | Complete fetch and build for a specific component |
+debug | Diagnostics, tests targets list in COMPOSER_DEBUGIT |
+debug-file | Export +debug results to a plain text file |
check | List system packages and versions (see Requirements) |
check-all | Complete check package list, and system information |
config | Show values of all Composer Variables |
config-all | Complete config, including environment variables |
config.* | Export individual Composer Variables values |
config.yml | JSON export of .composer.yml configuration |
targets | List all available targets for the current directory |
init | Create and link a .Composer in current directory |
init-force | Completely reset and relink an existing .Composer |
commit | Git commit of current directory tree or c_list |
commit-all | Automatic commit, without $EDITOR step |
export | Synchronize +Composer export of COMPOSER_ROOT |
export-all | Also publish to upstream hosting providers |
export-force | Publish only, without synchronizing first |
*-export | Any targets named this way will also be run by export |
site-library | Build or update the COMPOSER_LIBRARY |
site-list | COMPOSER_LIBRARY for current directory or c_list |
site-list-all | Do site-list for current directory tree |
site-list-list | All metadata fields and values, sorted by most used |
site-list-null | List files which are missing metadata fields |
site-list.* | Direct export of metadata or index, c_list searchable |
#WORK break this up into two sections…
README.*
files and create an example Static Websites in the _site
directory.Makefile
, so it is fully self-contained.Creating a development clone:
#WORK # should create a “development/contributing/support” section, and reference this… # also: https://github.com/garybgenett/gary-os/blob/main/.vimrc
mkdir .../composer
cd .../composer
make -f .../.Composer/Makefile +release
Note that some additional external tools may be required to perform the builds, such as npm (see check-all).
For example:
make COMPOSER_DEBUGIT="README.html Composer-v3.1.Manual.html" +debug-file
#WORK break this up into two sections…
.composer.mk
(see Custom Targets)..composer.yml
configuration is exported with config.yml. This is available for any external scripting, such as in .composer.mk
(see Custom Targets), and is parsable with YQ.#WORK
.../
is considered the top-level directory. Meaning, it is the last directory before linking to Composer.<directory>.git
or <directory>/.git
), this target creates a commit of the current directory tree with the title format below..../tld
directory, that entire tree would be in the commit, including .../tld/sub
. The purpose of this is to create quick and easy checkpoints when working on documentation that does not necessarily fit in a process where there are specific atomic steps being accomplished.-f
, the current directory is used.$EDITOR
variable.Commit title format:
[Composer CMS v3.1 :: 2024-07-03T06:52:38-07:00]
Example using c_list:
make commit c_list="Makefile artifacts"
#WORK # … and then runs all *-export targets. # hidden variables… # /.g/_data/zactive/coding/composer/+Composer # # # #
#WORK
#WORK # use site-list-list first, to track down, then site-list-all for details, because it can be expensive to run… # .metadata and .index
Target | Purpose |
---|---|
help-help | Complete README.md content (similar to help-all) |
.headers | Series of targets that handle all informational output |
.headers-template | For testing default .headers output |
.headers-template-all | For testing complete .headers output |
.make | Complete contents of GNU Make internal state |
.targets | Extracted list of all targets from .make |
.null | Placeholder to specify or detect empty values |
+setup | Extracts embedded files from Makefile |
+setup-all | Also builds all README.* output files |
+test | Test suite, validates all supported features |
+test-file | Export +test results to a plain text file |
+test-dir | Only create directory structure, and do +release |
+test-list | Output available test cases, for running directly |
check-help | Minimized check output (used for Requirements) |
site-.composer.mk | COMPOSER_LIBRARY configured template: .composer.mk |
site-.composer.yml | COMPOSER_LIBRARY configured template: .composer.yml |
site-template | Static Websites example _site in COMPOSER_DIR |
site-template-+test | Version configured to test specific variations |
site-template-config | Only create directory structure and source files |
subdirs | Expands COMPOSER_SUBDIRS into subdirs-*-* targets |
list-list | Same as list, but only lists the files (no headers) |
None of these are intended to be run directly during normal use. They are only listed here for completeness.
Composer uses the markdown
input format, with these extensions:
ascii_identifiers
auto_identifiers
emoji
fancy_lists
fenced_divs
footnotes
gfm_auto_identifiers
header_attributes
implicit_figures
implicit_header_references
inline_notes
intraword_underscores
line_blocks
link_attributes
markdown_in_html_blocks
pandoc_title_block
pipe_tables
raw_html
raw_tex
shortcut_reference_links
smart
strikeout
superscript
task_lists
yaml_metadata_block
The install target Makefile
template (for reference only):
override COMPOSER_MY_PATH := $(abspath $(dir $(lastword $(MAKEFILE_LIST))))
override COMPOSER_TEACHER := $(abspath $(dir $(COMPOSER_MY_PATH)))/Makefile
include $(COMPOSER_TEACHER)
Use the template target to create .composer.mk
files:
# override MAKEJOBS := 1
# override COMPOSER_DEBUGIT :=
# override COMPOSER_DOCOLOR :=
# override COMPOSER_INCLUDE := 1
# override COMPOSER_DEPENDS :=
# override COMPOSER_KEEPING := 100
# override COMPOSER_LOG := .composer.log
# override COMPOSER_EXT := .md
# override c_site :=
# override c_type := html
# override c_lang := en-US
# override c_logo := $(COMPOSER_DIR)/artifacts/images/logo.img
# override c_icon := $(COMPOSER_DIR)/artifacts/images/icon.img
# override c_css := $(COMPOSER_DIR)/artifacts/themes/theme.html-default.css
ifneq ($(COMPOSER_CURDIR),)
# override COMPOSER_TARGETS := README.site.html README.html README.pdf README.epub README.revealjs.html README.docx LICENSE.html
# override COMPOSER_SUBDIRS := .null
# override COMPOSER_EXPORTS := *.html *.pdf *.epub *.revealjs.html *.docx *.pptx *.txt *.md.txt
# override COMPOSER_IGNORES := +Composer .* +*
# override c_base :=
# override c_list :=
# override c_toc :=
# override c_level := 2
# override c_margin := 0.8in
# override c_margin_top :=
# override c_margin_bottom :=
# override c_margin_left :=
# override c_margin_right :=
# override c_options :=
endif
Use the template.yml target to create .composer.yml
files:
variables:
title-prefix: null
# site-config:
# brand: null
# homepage: null
# search:
# name: null
# site: null
# call: null
# form: null
# copyright: null
# composer: 1
# header: null
# footer: null
# css_overlay: dark
# copy_protect: null
# cols_break: lg
# cols_scroll: 1
# cols_order:
# - 1
# - 2
# - 3
# cols_reorder:
# - 1
# - 3
# - 2
# cols_size:
# - 3
# - 7
# - 2
# cols_resize:
# - 6
# - 12
# - 6
# metainfo: '<date> :: <title><|> -- <author|; >'
# metainfo_null: '*(none)*'
# metalist:
# author:
# title: Author
# display: '*Authors: <|>, <|>*'
# tags:
# title: Tag
# display: '*Tags: <|>, <|>*'
# readtime: '*Reading time: <word> words, <time> minutes*'
# readtime_wpm: 220
# site-library:
# folder: null
# auto_update: null
# append: null
# digest_title: Latest Updates
# digest_continue: '[...]'
# digest_permalink: '*(permalink to full text)*'
# digest_chars: 1024
# digest_count: 10
# digest_expanded: 0
# digest_spacer: 1
# lists_expanded: 0
# lists_spacer: 1
# sitemap_title: Site Map
# sitemap_expanded: 0
# sitemap_spacer: 1
# site-nav-top: null
# site-nav-bottom: null
# site-nav-left: null
# site-nav-right: null
# site-info-top: null
# site-info-bottom: null
Use the template.md target to create new markdown
files:
---
title: "Composer CMS: Content Make System"
date: 2024-07-03
author:
- Gary B. Genett
tags:
- Composer
---
*Happy Making!*
The default .composer.mk
in the Composer directory:
################################################################################
# Composer CMS :: GNU Make Configuration
################################################################################
ifneq ($(COMPOSER_CURDIR),)
################################################################################
########################################
# Settings
override COMPOSER_TARGETS := \
README.site.html \
README.html \
README.pdf \
README.epub \
README.revealjs.html \
README.docx \
LICENSE.html
#>> README.pptx \
#>> README.txt \
#>> README.md.txt \
override COMPOSER_SUBDIRS := .null
########################################
# Defaults
README.% LICENSE.%: override c_logo := ../../projects/composer/artifacts/images/logo-v1.0.png
README.% LICENSE.%: override c_icon := ../../projects/composer/artifacts/images/icon-v1.0.png
README.% LICENSE.%: override c_toc := 0
########################################
# Files
override README.site.html := ../../projects/composer/artifacts/README.site.md
README.site.html: override c_site := 1
README.site.html: override c_toc :=
override README.pdf := README.md LICENSE.md
override README.revealjs.html := ../../projects/composer/artifacts/README.revealjs.md
README.revealjs.html: override c_toc :=
LICENSE.html: override c_site := 1
LICENSE.html: override c_toc :=
################################################################################
endif
################################################################################
# End Of File
################################################################################
The template .composer.yml
in the artifacts
directory:
################################################################################
# Composer CMS :: YAML Configuration
################################################################################
variables:
########################################
# site
title-prefix: EXAMPLE SITE
########################################
site-config:
brand: LOGO / BRAND
homepage: http://www.garybgenett.net/projects/composer
search:
#>> name: SEARCH
name: |
<!-- composer >> icon search -->
site: https://duckduckgo.com
call: q
form: |
<!-- composer >> form sites garybgenett.net -->
<!-- composer >> form ia web -->
<!-- composer >> form kae d -->
<!-- composer >> form ko 1 -->
<!-- composer >> form kp -1 -->
<!-- composer >> form kv 1 -->
<!-- composer >> form kz -1 -->
#>> copyright: COPYRIGHT
copyright: |
<!-- composer >> icon gpl -->
<!-- composer >> icon cc-by-nc-nd -->
<!-- composer >> icon copyright -->
COPYRIGHT
#>> composer: 1
#>> header: null
#>> footer: null
#>> css_overlay: dark
#>> copy_protect: null
#>> cols_break: lg
#>> cols_scroll: 1
#>> cols_order: [ 1, 2, 3 ]
#>> cols_reorder: [ 1, 3, 2 ]
#>> cols_size: [ 3, 7, 2 ]
#>> cols_resize: [ 6, 12, 6 ]
#>> metainfo: "<date> :: <title><|> -- <author|; >"
#>> metainfo_null: "*(none)*"
#>> metalist:
#>> author:
#>> title: "Author"
#>> display: "*Authors: <|>, <|>*"
#>> tags:
#>> title: "Tag"
#>> display: "*Tags: <|>, <|>*"
#>> readtime: "*Reading time: <word> words, <time> minutes*"
#>> readtime_wpm: 220
########################################
site-library:
folder: #>> null
#>> auto_update: null
#>> append: null
#>> digest_title: "Latest Updates"
#>> digest_continue: "[...]"
#>> digest_permalink: "*(permalink to full text)*"
#>> digest_chars: 1024
#>> digest_count: 10
#>> digest_expanded: 0
#>> digest_spacer: 1
#>> lists_expanded: 0
#>> lists_spacer: 1
#>> sitemap_title: "Site Map"
#>> sitemap_expanded: 0
#>> sitemap_spacer: 1
########################################
site-nav-top:
MENU:
- MAIN: ../../index.html
- PAGES:
- Composer README: ../../../index.html
- spacer
- Introduction:
- _: ../../index.html
- Default Site: ../../null/index.html
- Configured Site: ../../config/index.html
- Pandoc Markdown: ../../pandoc/MANUAL.html
- Bootstrap Default: ../../bootstrap/site/content/docs/5.1/getting-started/introduction.html
- Layout & Elements:
- _: ../../examples.html
- Metainfo Page: ../../config/pages.html
- Metainfo File: ../../config/pages/2022-01-01+template_00.html
- Themes & Overlays: ../../themes/index.html
- Default Library Page:
- _: ../../_library/index.html
- Configured Library Page: ../../config/_library-config/index.html
#>> - Default Digest Page: ../../index-digest.html
#>> - Configured Digest Page: ../../config/index-digest.html
CONTENTS:
- CONTENTS:
- contents
#>> - contents 6
#>> - contents 0
SPACE:
- spacer
LIBRARY:
- DATES:
- library date
- AUTHORS:
- library author
- TAGS:
- library tags
########################################
site-nav-bottom:
PATH:
- SITEMAP: ../../_library/sitemap.html
INFO:
- metalist author
- metalist tags
########################################
site-nav-left:
BEGIN:
MENU:
- fold-begin 0 . 0 LEFT FOLD
- _: |
* ITEM 1
* ITEM 2
* ITEM 3
- fold-end
MIDDLE:
- spacer
TEXT:
- box-begin 0 LEFT BOX
- _: |
LEFT TEXT
- box-end
SPACE:
- spacer
CONTENTS:
- box-begin 0 CONTENTS
- metainfo
- contents
#>> - contents 6
#>> - contents 0
- metalist author
- metalist tags
- readtime
- box-end
END:
########################################
site-nav-right:
BEGIN:
MENU:
- fold-begin 0 . 0 RIGHT FOLD
- _: |
* ITEM 1
* ITEM 2
* ITEM 3
- fold-end
MIDDLE:
- spacer
TEXT:
- box-begin 0 RIGHT BOX
- _: |
RIGHT TEXT
- box-end
SPACE:
- spacer
LIBRARY:
- fold-begin group library
- fold-begin 0 0 library DATES
- library date
- fold-end
- fold-begin 0 0 library AUTHORS
- library author
- fold-end
- fold-begin 0 . library TAGS
- library tags
- fold-end
- fold-end group
END:
########################################
site-info-top:
TEXT:
- _: |
TOP TEXT
INFO:
#>> - metainfo
#>> - metalist author
#>> - metalist tags
#>> - readtime
ICON:
- icon github https://github.com/garybgenett/composer Composer CMS
#>> - _: |
#>> <!-- composer >> icon gpl -->
#>> <!-- composer >> icon cc-by-nc-nd -->
#>> <!-- composer >> icon copyright -->
########################################
site-info-bottom:
TEXT:
- _: |
BOTTOM TEXT
INFO:
#>> - metainfo
#>> - metalist author
#>> - metalist tags
- readtime
ICON:
################################################################################
# End Of File
################################################################################
Do not create targets which match these, or use them as prefixes:
+debug
+release
+setup
+test
+update
.headers
.make
.null
.targets
all
check
clean
commit
compose
config
export
help
init
install
list
site
subdirs
targets
template
Do not create variables which match these, and avoid similar names:
+debug-output
+setup-targets
+test-.headers
+test-COMPOSER_INCLUDE-.composer-html.css
+test-COMPOSER_INCLUDE-.composer.mk
+test-COMPOSER_INCLUDE-.composer.mk-/
+test-COMPOSER_INCLUDE-.composer.yml
+test-COMPOSER_INCLUDE-init
+test-COMPOSER_INCLUDE-init-run
+test-count
+test-done
+test-fail
+test-find
+test-hold
+test-init
+test-load
+test-log
+test-make
+test-mark
+test-name
+test-pwd
+test-run
+test-speed-init
+test-speed-init-site
+update-.null
+update-all
+update-bin
+update-bin-os
+update-bld
+update-bld-list
+update-commands
+update-src
+update-targets
.
.headers
.headers-action
.headers-compose
.headers-compose-options
.headers-dir
.headers-file
.headers-line
.headers-list-make
.headers-list-path
.headers-note
.headers-options
.headers-options-files
.headers-options-out
.headers-rm
.headers-skip
.headers-subdirs
.headers-table
/
7Z
7Z_VER
ASPELL
ASPELL_DIR
BASE64
BASH
BASH_VER
BOOTLINT_CMT
BOOTLINT_DIR
BOOTLINT_HOME
BOOTLINT_LIC
BOOTLINT_NAME
BOOTLINT_SRC
BOOTSTRAP_ART_CSS
BOOTSTRAP_ART_JS
BOOTSTRAP_CMT
BOOTSTRAP_DEF_CSS
BOOTSTRAP_DEF_JS
BOOTSTRAP_DIR
BOOTSTRAP_DIR_CSS
BOOTSTRAP_DIR_JS
BOOTSTRAP_DOC_VER
BOOTSTRAP_HOME
BOOTSTRAP_LIC
BOOTSTRAP_NAME
BOOTSTRAP_SRC
BOOTSWATCH_CMT
BOOTSWATCH_CSS_ALT
BOOTSWATCH_CSS_DARK
BOOTSWATCH_CSS_LIGHT
BOOTSWATCH_CSS_SOLAR_DARK
BOOTSWATCH_CSS_SOLAR_LIGHT
BOOTSWATCH_DIR
BOOTSWATCH_HOME
BOOTSWATCH_LIC
BOOTSWATCH_NAME
BOOTSWATCH_SRC
CAT
CHECKIT
CHMOD
CLEANER
CODEBLOCK
COLUMNS
COLUMN_2
COMMA
COMMENTED
COMPOSER
COMPOSER_ART
COMPOSER_BASENAME
COMPOSER_BIN
COMPOSER_CLOSING
COMPOSER_CMS
COMPOSER_COLOR
COMPOSER_COMPOSER
COMPOSER_CONTACT
COMPOSER_CONTENTS
COMPOSER_CONTENTS_DIRS
COMPOSER_CONTENTS_EXT
COMPOSER_CONTENTS_FILES
COMPOSER_CONV
COMPOSER_CSS
COMPOSER_CSS_PUBLISH
COMPOSER_CURDIR
COMPOSER_CUSTOM
COMPOSER_DAT
COMPOSER_DEBUGIT
COMPOSER_DEBUGIT_ALL
COMPOSER_DEPENDS
COMPOSER_DIR
COMPOSER_DOCOLOR
COMPOSER_DOMAIN
COMPOSER_EXPORT
COMPOSER_EXPORTS
COMPOSER_EXPORTS_DEFAULT
COMPOSER_EXPORTS_EXT
COMPOSER_EXPORTS_LIST
COMPOSER_EXPORT_DEFAULT
COMPOSER_EXPORT_REGEX
COMPOSER_EXT
COMPOSER_EXT_DEFAULT
COMPOSER_EXT_SPECIAL
COMPOSER_FILENAME
COMPOSER_FIND
COMPOSER_FULLNAME
COMPOSER_HEADLINE
COMPOSER_HIDDEN_FILES
COMPOSER_HOMEPAGE
COMPOSER_ICON
COMPOSER_ICON_VER
COMPOSER_IGNORES
COMPOSER_IGNORES_DEFAULT
COMPOSER_IGNORES_EXT
COMPOSER_IGNORES_LIST
COMPOSER_IMAGES
COMPOSER_INCLUDE
COMPOSER_INCLUDES
COMPOSER_INCLUDES_DIRS
COMPOSER_KEEPING
COMPOSER_LIBRARY
COMPOSER_LIBRARY_AUTO_UPDATE
COMPOSER_LIBRARY_DIR
COMPOSER_LIBRARY_PATH
COMPOSER_LIBRARY_ROOT
COMPOSER_LIBRARY_ROOT_REGEX
COMPOSER_LICENSE
COMPOSER_LICENSE_HEADLINE
COMPOSER_LOG
COMPOSER_LOGO
COMPOSER_LOGO_VER
COMPOSER_LOG_DEFAULT
COMPOSER_MY_PATH
COMPOSER_NOCOLOR
COMPOSER_OPTIONS
COMPOSER_OPTIONS_EXPORT
COMPOSER_OPTIONS_GLOBAL
COMPOSER_OPTIONS_LOCAL
COMPOSER_OPTIONS_MAKE
COMPOSER_OPTIONS_PANDOC
COMPOSER_OPTIONS_PUBLISH
COMPOSER_PANDOC
COMPOSER_REGEX
COMPOSER_REGEX_DEFINE
COMPOSER_REGEX_OVERRIDE
COMPOSER_REGEX_PREFIX
COMPOSER_RELEASE
COMPOSER_REPOPAGE
COMPOSER_RESERVED
COMPOSER_RESERVED_DOITALL
COMPOSER_RESERVED_DOITALL_ENV
COMPOSER_RESERVED_SKIP
COMPOSER_ROOT
COMPOSER_ROOT_PATH
COMPOSER_ROOT_REGEX
COMPOSER_SELF
COMPOSER_SETTINGS
COMPOSER_SRC
COMPOSER_SUBDIRS
COMPOSER_SUBDIRS_DEFAULT
COMPOSER_SUBDIRS_LIST
COMPOSER_TAGLINE
COMPOSER_TARGETS
COMPOSER_TARGETS_DEFAULT
COMPOSER_TARGETS_LIST
COMPOSER_TEACHER
COMPOSER_TECHNAME
COMPOSER_TIMESTAMP
COMPOSER_TINYNAME
COMPOSER_TMP
COMPOSER_TMP_FILE
COMPOSER_VERSION
COMPOSER_YML
COMPOSER_YML_DATA
COMPOSER_YML_DATA_METALIST
COMPOSER_YML_DATA_PARSE
COMPOSER_YML_DATA_SKEL
COMPOSER_YML_DATA_SKEL_COMMENT
COMPOSER_YML_DATA_SKEL_METALIST
COMPOSER_YML_DATA_VAL
COMPOSER_YML_LIST
COMPOSER_YML_LIST_FILE
CONFIGS
CONVICT
COPYRIGHT_FULL
COPYRIGHT_SHORT
COREUTILS_VER
CP
CREATED_TAGLINE
CREATOR
CSS_ALT
CSS_ICONS
CSS_ICON_ARROW_D
CSS_ICON_ARROW_L
CSS_ICON_ARROW_R
CSS_ICON_ARROW_U
CSS_ICON_COPYRIGHT
CSS_ICON_GITHUB
CSS_ICON_MENU
CSS_ICON_SEARCH
CSS_THEME
CSS_THEMES
CURL
CURL_VER
CUSTOM_HTML_CSS
CUSTOM_LPDF_LATEX
CUSTOM_PRES_CSS
CUSTOM_PUBLISH_CSS
CUSTOM_PUBLISH_CSS_OVERLAY
CUSTOM_PUBLISH_SH
DATE
DATEMARK
DATENOW
DATESTAMP
DATESTRING
DEBUGIT
DEPTH_DEFAULT
DEPTH_MAX
DESC_DOCX
DESC_EPUB
DESC_HTML
DESC_LINT
DESC_LPDF
DESC_PPTX
DESC_PRES
DESC_TEXT
DIFF
DIFFUTILS_VER
DISTRIB
DIST_ICON_v1.0
DIST_LOGO_v1.0
DIST_SCREENSHOT_v1.0
DIST_SCREENSHOT_v3.0
DIST_SCREENSHOT_v4.0
DIVIDE
DOFORCE
DOITALL
DOMAKE
DONOTDO
DOSETUP
DO_HEREDOC
ECHO
ENDOLINE
ENV
ENV_MAKE
EOL
EXAMPLE
EXPAND
EXPORTS
EXPR
EXTN_DEFAULT
EXTN_DOCX
EXTN_EPUB
EXTN_HTML
EXTN_LINT
EXTN_LPDF
EXTN_OUTPUT
EXTN_PPTX
EXTN_PRES
EXTN_TEXT
EXT_ICON_CC
EXT_ICON_GPL
FIND
FINDUTILS_VER
FIND_ALL
FIREBASE
FIREBASE_BIN
FIREBASE_BIN_BLD
FIREBASE_CMT
FIREBASE_DIR
FIREBASE_HOME
FIREBASE_LIC
FIREBASE_LNX_BIN
FIREBASE_LNX_DST
FIREBASE_LNX_SRC
FIREBASE_LNX_ZIP
FIREBASE_MAC_BIN
FIREBASE_MAC_DST
FIREBASE_MAC_SRC
FIREBASE_MAC_ZIP
FIREBASE_NAME
FIREBASE_RUN
FIREBASE_SRC
FIREBASE_URL
FIREBASE_VER
FIREBASE_VER_COMPOSER
FIREBASE_WIN_BIN
FIREBASE_WIN_DST
FIREBASE_WIN_SRC
FIREBASE_WIN_ZIP
FONTAWES_CMT
FONTAWES_DIR
FONTAWES_HOME
FONTAWES_LIC
FONTAWES_NAME
FONTAWES_SRC
GIT
GITIGNORE_FIREBASE
GITIGNORE_GIT
GITIGNORE_LIST
GITIGNORE_NPM
GITIGNORE_WGET
GIT_LOG_COUNT
GIT_LOG_FORMAT
GIT_OPTS_CONVICT
GIT_REPO
GIT_REPO_DO
GIT_RUN
GIT_RUN_COMPOSER
GIT_RUN_REPO
GIT_VER
GZIP_BIN
GZIP_VER
HEAD
HEADERS
HEADER_L
HEAD_MAIN
HELPOUT
HEREDOC_COMPOSER_MK
HEREDOC_COMPOSER_MK_PUBLISH
HEREDOC_COMPOSER_MK_PUBLISH_BOOTSTRAP_DIR
HEREDOC_COMPOSER_MK_PUBLISH_BOOTSTRAP_TREE
HEREDOC_COMPOSER_MK_PUBLISH_CONFIGS
HEREDOC_COMPOSER_MK_PUBLISH_EXAMPLE
HEREDOC_COMPOSER_MK_PUBLISH_NOTHING
HEREDOC_COMPOSER_MK_PUBLISH_PAGEDIR
HEREDOC_COMPOSER_MK_PUBLISH_PANDOC_DIR
HEREDOC_COMPOSER_MK_PUBLISH_SHOWDIR
HEREDOC_COMPOSER_MK_PUBLISH_SHOWDIR_TARGET
HEREDOC_COMPOSER_YML
HEREDOC_COMPOSER_YML_PUBLISH_BOOTSTRAP_DIR
HEREDOC_COMPOSER_YML_PUBLISH_BOOTSTRAP_TREE
HEREDOC_COMPOSER_YML_PUBLISH_CONFIGS
HEREDOC_COMPOSER_YML_PUBLISH_EXAMPLE
HEREDOC_COMPOSER_YML_PUBLISH_LIBRARY
HEREDOC_COMPOSER_YML_PUBLISH_NOTHING
HEREDOC_COMPOSER_YML_PUBLISH_PAGEDIR
HEREDOC_COMPOSER_YML_PUBLISH_PANDOC_DIR
HEREDOC_COMPOSER_YML_PUBLISH_SHOWDIR
HEREDOC_COMPOSER_YML_PUBLISH_TESTING
HEREDOC_COMPOSER_YML_README
HEREDOC_COMPOSER_YML_README_HACK
HEREDOC_CUSTOM_HTML_CSS
HEREDOC_CUSTOM_HTML_CSS_SOLARIZED
HEREDOC_CUSTOM_HTML_CSS_WATER_CSS_HACK
HEREDOC_CUSTOM_HTML_CSS_WATER_SRC_SOLAR
HEREDOC_CUSTOM_HTML_CSS_WATER_VAR_OVERLAY
HEREDOC_CUSTOM_HTML_CSS_WATER_VAR_SOLAR
HEREDOC_CUSTOM_HTML_PANDOC_HACK
HEREDOC_CUSTOM_HTML_TEMPLATE_HACK
HEREDOC_CUSTOM_LPDF_LATEX
HEREDOC_CUSTOM_PRES_CSS
HEREDOC_CUSTOM_PRES_CSS_HACK
HEREDOC_CUSTOM_PUBLISH_CSS
HEREDOC_CUSTOM_PUBLISH_CSS_HACK
HEREDOC_CUSTOM_PUBLISH_CSS_OVERLAY
HEREDOC_CUSTOM_PUBLISH_CSS_POST
HEREDOC_CUSTOM_PUBLISH_CSS_PRE
HEREDOC_CUSTOM_PUBLISH_CSS_TESTING
HEREDOC_CUSTOM_PUBLISH_CSS_THEME
HEREDOC_CUSTOM_PUBLISH_JS_POST
HEREDOC_CUSTOM_PUBLISH_JS_PRE
HEREDOC_CUSTOM_PUBLISH_SH
HEREDOC_GITATTRIBUTES
HEREDOC_GITCONFIG
HEREDOC_GITIGNORE
HEREDOC_LICENSE
HEREDOC_SPELL_WORDLIST
HTML_BREAK
HTML_HIDE
HTML_SPACE
INCLUDE_FILE_APPEND
INCLUDE_FILE_FOOTER
INCLUDE_FILE_HEADER
INPUT
INSTALL
KEY_FILEPATH
KEY_UPDATED
LIBRARY_APPEND
LIBRARY_APPEND_ALT
LIBRARY_APPEND_MOD
LIBRARY_AUTO_UPDATE
LIBRARY_AUTO_UPDATE_ALT
LIBRARY_DIGEST_CHARS
LIBRARY_DIGEST_CHARS_ALT
LIBRARY_DIGEST_CONTINUE
LIBRARY_DIGEST_CONTINUE_ALT
LIBRARY_DIGEST_COUNT
LIBRARY_DIGEST_COUNT_ALT
LIBRARY_DIGEST_EXPANDED
LIBRARY_DIGEST_EXPANDED_ALT
LIBRARY_DIGEST_EXPANDED_MOD
LIBRARY_DIGEST_PERMALINK
LIBRARY_DIGEST_PERMALINK_ALT
LIBRARY_DIGEST_SPACER
LIBRARY_DIGEST_SPACER_ALT
LIBRARY_DIGEST_TITLE
LIBRARY_DIGEST_TITLE_ALT
LIBRARY_DIGEST_TITLE_MOD
LIBRARY_FOLDER
LIBRARY_FOLDER_ALT
LIBRARY_LISTS_EXPANDED
LIBRARY_LISTS_EXPANDED_ALT
LIBRARY_LISTS_EXPANDED_MOD
LIBRARY_LISTS_SPACER
LIBRARY_LISTS_SPACER_ALT
LIBRARY_SITEMAP_EXPANDED
LIBRARY_SITEMAP_EXPANDED_ALT
LIBRARY_SITEMAP_EXPANDED_MOD
LIBRARY_SITEMAP_SPACER
LIBRARY_SITEMAP_SPACER_ALT
LIBRARY_SITEMAP_TITLE
LIBRARY_SITEMAP_TITLE_ALT
LIBRARY_SITEMAP_TITLE_MOD
LINERULE
LISTING
LN
LS
LS_TIME
MAKEFILE
MAKEFILE_LIST
MAKEFLAGS
MAKEFLAGS_DOFAIL
MAKEFLAGS_END
MAKEFLAGS_ENV
MAKEFLAGS_NOFAIL
MAKEJOBS
MAKEJOBS_DEFAULT
MAKEJOBS_OPTS
MAKE_DB
MAKE_VER
MARKER
MDTHEMES_CMT
MDTHEMES_DIR
MDTHEMES_HOME
MDTHEMES_LIC
MDTHEMES_NAME
MDTHEMES_SRC
MDVIEWER_CMT
MDVIEWER_CSS_ALT
MDVIEWER_CSS_DARK
MDVIEWER_CSS_DIR
MDVIEWER_CSS_LIGHT
MDVIEWER_CSS_SOLAR_DARK
MDVIEWER_CSS_SOLAR_LIGHT
MDVIEWER_DIR
MDVIEWER_HOME
MDVIEWER_LIC
MDVIEWER_MANIFEST
MDVIEWER_MODULES
MDVIEWER_NAME
MDVIEWER_SASS_VER
MDVIEWER_SASS_VER_HACK
MDVIEWER_SRC
MENU_SELF
MKDIR
MV
NEWLINE
NOTHING
NOTHING_IGNORES
NPM
NPM_BUILD
NPM_INSTALL
NPM_NAME
NPM_RUN
NPM_SETUP
NPM_VER
NULL
OS_TYPE
OS_UNAME
OS_VAR_LIST
OS_VAR_LNX
OS_VAR_MAC
OS_VAR_WIN
OUTPUT_FILENAME
OUT_LICENSE
OUT_MANUAL
OUT_README
PANDOC
PANDOC_BIN
PANDOC_CMT
PANDOC_DIR
PANDOC_EXTENSIONS
PANDOC_FILES_CSS
PANDOC_FILES_HEADER
PANDOC_FILES_LIST
PANDOC_FILES_MAIN
PANDOC_FILES_OVERRIDE
PANDOC_FILES_SPLIT
PANDOC_FILES_TYPE
PANDOC_FROM
PANDOC_HOME
PANDOC_JSON_TO_LINT
PANDOC_LIC
PANDOC_LNX_BIN
PANDOC_LNX_DST
PANDOC_LNX_SRC
PANDOC_LNX_ZIP
PANDOC_MAC_BIN
PANDOC_MAC_DST
PANDOC_MAC_SRC
PANDOC_MAC_ZIP
PANDOC_MD_TO_HTML
PANDOC_MD_TO_JSON
PANDOC_MD_TO_TEXT
PANDOC_NAME
PANDOC_OPTIONS
PANDOC_OPTIONS_ERROR
PANDOC_SRC
PANDOC_URL
PANDOC_VER
PANDOC_VER_COMPOSER
PANDOC_WIN_BIN
PANDOC_WIN_DST
PANDOC_WIN_SRC
PANDOC_WIN_ZIP
PATH_LIST
PDF_LATEX
PDF_LATEX_HOME
PDF_LATEX_NAME
PDF_LATEX_VER
PHANTOM
PRINT
PRINTER
PRINTF
PUBLISH
PUBLISH_BOOTSTRAP_TREE
PUBLISH_CMD_BEG
PUBLISH_CMD_END
PUBLISH_CMD_ROOT
PUBLISH_COLS_BREAK
PUBLISH_COLS_BREAK_ALT
PUBLISH_COLS_ORDER_C
PUBLISH_COLS_ORDER_C_ALT
PUBLISH_COLS_ORDER_C_MOD
PUBLISH_COLS_ORDER_L
PUBLISH_COLS_ORDER_L_ALT
PUBLISH_COLS_ORDER_L_MOD
PUBLISH_COLS_ORDER_R
PUBLISH_COLS_ORDER_R_ALT
PUBLISH_COLS_ORDER_R_MOD
PUBLISH_COLS_REORDER_C
PUBLISH_COLS_REORDER_C_ALT
PUBLISH_COLS_REORDER_C_MOD
PUBLISH_COLS_REORDER_L
PUBLISH_COLS_REORDER_L_ALT
PUBLISH_COLS_REORDER_L_MOD
PUBLISH_COLS_REORDER_R
PUBLISH_COLS_REORDER_R_ALT
PUBLISH_COLS_REORDER_R_MOD
PUBLISH_COLS_RESIZE_C
PUBLISH_COLS_RESIZE_C_ALT
PUBLISH_COLS_RESIZE_C_MOD
PUBLISH_COLS_RESIZE_L
PUBLISH_COLS_RESIZE_L_ALT
PUBLISH_COLS_RESIZE_L_MOD
PUBLISH_COLS_RESIZE_R
PUBLISH_COLS_RESIZE_R_ALT
PUBLISH_COLS_RESIZE_R_MOD
PUBLISH_COLS_SCROLL
PUBLISH_COLS_SCROLL_ALT
PUBLISH_COLS_SCROLL_MOD
PUBLISH_COLS_SIZE_C
PUBLISH_COLS_SIZE_C_ALT
PUBLISH_COLS_SIZE_C_MOD
PUBLISH_COLS_SIZE_L
PUBLISH_COLS_SIZE_L_ALT
PUBLISH_COLS_SIZE_L_MOD
PUBLISH_COLS_SIZE_R
PUBLISH_COLS_SIZE_R_ALT
PUBLISH_COLS_SIZE_R_MOD
PUBLISH_COMPOSER
PUBLISH_COMPOSER_ALT
PUBLISH_COMPOSER_MOD
PUBLISH_COPY_PROTECT
PUBLISH_COPY_PROTECT_ALT
PUBLISH_CREATORS
PUBLISH_CREATORS_PRINT
PUBLISH_CREATORS_PRINT_ALT
PUBLISH_CREATORS_PRINT_MOD
PUBLISH_CREATORS_TITLE
PUBLISH_CREATORS_TITLE_ALT
PUBLISH_CREATORS_TITLE_MOD
PUBLISH_CSS_OVERLAY
PUBLISH_CSS_OVERLAY_ALT
PUBLISH_DIRS
PUBLISH_DIRS_CONFIGS
PUBLISH_DIRS_DEBUGIT
PUBLISH_DIRS_PRINTER
PUBLISH_DIRS_PRINTER_LIST
PUBLISH_EXAMPLE
PUBLISH_FILES
PUBLISH_FILE_APPEND
PUBLISH_FILE_FOOTER
PUBLISH_FILE_HEADER
PUBLISH_FOOTER
PUBLISH_FOOTER_ALT
PUBLISH_FOOTER_MOD
PUBLISH_HEADER
PUBLISH_HEADER_ALT
PUBLISH_HEADER_MOD
PUBLISH_INCLUDE
PUBLISH_INCLUDE_ALT
PUBLISH_INDEX
PUBLISH_KEEPING
PUBLISH_LIBRARY
PUBLISH_LIBRARY_ALT
PUBLISH_METAINFO
PUBLISH_METAINFO_ALT
PUBLISH_METAINFO_MOD
PUBLISH_METAINFO_NULL
PUBLISH_METAINFO_NULL_ALT
PUBLISH_METALIST
PUBLISH_METALIST_PRINT
PUBLISH_METALIST_PRINT_ALT
PUBLISH_METALIST_PRINT_MOD
PUBLISH_METALIST_TITLE
PUBLISH_METALIST_TITLE_ALT
PUBLISH_METALIST_TITLE_MOD
PUBLISH_OUT_README
PUBLISH_PAGEDIR
PUBLISH_PAGE_1
PUBLISH_PAGE_1_CONFIGS
PUBLISH_PAGE_1_CONFIGS_LINKS
PUBLISH_PAGE_1_INCLUDE
PUBLISH_PAGE_1_NAME
PUBLISH_PAGE_2
PUBLISH_PAGE_2_NAME
PUBLISH_PAGE_3
PUBLISH_PAGE_3_APPEND
PUBLISH_PAGE_3_CONFIGS
PUBLISH_PAGE_3_FOOTER
PUBLISH_PAGE_3_HEADER
PUBLISH_PAGE_3_NAME
PUBLISH_PAGE_4_HEADER
PUBLISH_PAGE_4_NAME
PUBLISH_PAGE_5_HEADER
PUBLISH_PAGE_5_NAME
PUBLISH_PAGE_EXAMPLE
PUBLISH_PAGE_EXAMPLE_DISPLAY
PUBLISH_PAGE_EXAMPLE_INCLUDE
PUBLISH_PAGE_EXAMPLE_LAYOUT
PUBLISH_PAGE_EXAMPLE_NAME
PUBLISH_PAGE_INCLUDE
PUBLISH_PAGE_INCLUDE_ALT
PUBLISH_PAGE_INCLUDE_ALT_NAME
PUBLISH_PAGE_INCLUDE_EXAMPLE
PUBLISH_PAGE_INCLUDE_NAME
PUBLISH_PAGE_LIBRARY
PUBLISH_PAGE_LIBRARY_ALT
PUBLISH_PAGE_LIBRARY_ALT_NAME
PUBLISH_PAGE_LIBRARY_EXAMPLE
PUBLISH_PAGE_LIBRARY_NAME
PUBLISH_PAGE_PAGEDIR_FOOTER
PUBLISH_PAGE_PAGEDIR_HEADER
PUBLISH_PAGE_PAGEDIR_NAME
PUBLISH_PAGE_SHOWDIR
PUBLISH_PAGE_SHOWDIR_INCLUDE
PUBLISH_PAGE_SHOWDIR_NAME
PUBLISH_PAGE_TESTING
PUBLISH_PAGE_TESTING_NAME
PUBLISH_READTIME
PUBLISH_READTIME_ALT
PUBLISH_READTIME_WPM
PUBLISH_READTIME_WPM_ALT
PUBLISH_ROOT
PUBLISH_SHOWDIR
PUBLISH_SH_GLOBAL
PUBLISH_SH_HELPERS
PUBLISH_SH_LOCAL
PUBLISH_SH_RUN
PUBLISH_TESTING
READ_ALIASES
REALMAKE
REALPATH
REPOSITORIES_LIST
REVEALJS_CMT
REVEALJS_CSS_ALT
REVEALJS_CSS_DARK
REVEALJS_CSS_LIGHT
REVEALJS_CSS_SOLAR_DARK
REVEALJS_CSS_SOLAR_LIGHT
REVEALJS_DIR
REVEALJS_HOME
REVEALJS_LIC
REVEALJS_NAME
REVEALJS_SRC
RM
RSYNC
RSYNC_VER
SED
SED_ESCAPE_COLOR
SED_ESCAPE_CONTROL
SED_ESCAPE_LIST
SED_VER
SORT
SORT_NUM
SOURCE_INCLUDES
SPECIAL_VAL
SPLIT
SUBDIRS
TABLE_C2
TABLE_M2
TABLE_M2_HEADER_L
TABLE_M3
TABLE_M3_HEADER_L
TAIL
TAR
TARGETS
TAR_VER
TEE
TESTING
TESTING_DIR
TESTING_LOGFILE
TESTING_MAKEFILE
TESTING_MAKEJOBS
TITLE_END
TITLE_LN
TMPL_DOCX
TMPL_EPUB
TMPL_HTML
TMPL_LINT
TMPL_LPDF
TMPL_OUTPUT
TMPL_PPTX
TMPL_PRES
TMPL_TEXT
TOAFILE
TOKEN
TOUCH
TR
TRUE
TYPE_DEFAULT
TYPE_DOCX
TYPE_EPUB
TYPE_HTML
TYPE_LINT
TYPE_LPDF
TYPE_PPTX
TYPE_PRES
TYPE_TARGETS
TYPE_TARGETS_LIST
TYPE_TARGETS_OPTIONS
TYPE_TEXT
UNAME
UPGRADE
VIM_FOLDING
VIM_OPTIONS
WATERCSS_CMT
WATERCSS_CSS_ALT
WATERCSS_CSS_DARK
WATERCSS_CSS_LIGHT
WATERCSS_CSS_SOLAR_ALT
WATERCSS_CSS_SOLAR_DARK
WATERCSS_CSS_SOLAR_LIGHT
WATERCSS_DIR
WATERCSS_HOME
WATERCSS_LIC
WATERCSS_NAME
WATERCSS_SRC
WC
WC_CHAR
WC_WORD
WGET
WGET_PACKAGE
WGET_PACKAGE_DO
WGET_VER
YQ
YQ_BIN
YQ_CMT
YQ_DIR
YQ_EVAL
YQ_EVAL_DATA
YQ_EVAL_DATA_FORMAT
YQ_EVAL_FILES
YQ_EVAL_MERGE
YQ_HOME
YQ_LIC
YQ_LNX_BIN
YQ_LNX_DST
YQ_LNX_SRC
YQ_LNX_ZIP
YQ_MAC_BIN
YQ_MAC_DST
YQ_MAC_SRC
YQ_MAC_ZIP
YQ_NAME
YQ_READ
YQ_SRC
YQ_URL
YQ_VER
YQ_VER_COMPOSER
YQ_WIN_BIN
YQ_WIN_DST
YQ_WIN_SRC
YQ_WIN_ZIP
YQ_WRITE
YQ_WRITE_FILE
YQ_WRITE_JSON
YQ_WRITE_OUT
YQ_WRITE_OUT_COLOR
_
_C
_D
_E
_EXPORT_DIRECTORY
_EXPORT_FIRE_ACCT
_EXPORT_FIRE_PROJ
_EXPORT_GIT_BNCH
_EXPORT_GIT_REPO
_F
_H
_M
_N
_S
c_base
c_css
c_css_select
c_css_select_theme
c_icon
c_lang
c_level
c_list
c_list_file
c_list_var
c_list_var_source
c_logo
c_margin
c_margin_bottom
c_margin_left
c_margin_right
c_margin_top
c_options
c_site
c_toc
c_type
check-path
clean-clean
compose-.null
compose-dependencies
compose-list
composer-cp
composer-ln
composer-make
composer-makefile
composer-mkdir
composer-mv
composer-note
composer-rm
config-targets
export-config
help-all-custom
help-all-depends
help-all-files
help-all-formatting
help-all-formatting-epub
help-all-formatting-html
help-all-formatting-office
help-all-formatting-pandoc
help-all-formatting-pdf
help-all-formatting-revealjs
help-all-formatting-text
help-all-formatting-websites
help-all-goals
help-all-links
help-all-links_ext
help-all-overview
help-all-require
help-all-require_post
help-all-rules
help-all-section
help-all-settings
help-all-targets_additional
help-all-targets_internal
help-all-targets_primary
help-all-title
help-all-variables_control
help-all-variables_format
help-all-variables_helper
help-all-versions
help-all-workflow
help-list-template
help-targets-format
help-targets-sections
help-targets-titles
install-Makefile
site-+debug-output
site-cache
site-cache-root
site-caches
site-caches-begin
site-caches-end
site-library
site-library-append
site-library-append-src
site-library-digest
site-library-digest-create
site-library-digest-file
site-library-digest-files
site-library-digest-list
site-library-digest-run
site-library-digest-src
site-library-digest-vars
site-library-index
site-library-index-create
site-library-metadata
site-library-metadata-create
site-library-sitemap
site-library-sitemap-create
site-library-sitemap-file
site-library-sitemap-files
site-library-sitemap-list
site-library-sitemap-run
site-library-sitemap-self
site-library-sitemap-src
site-library-sitemap-vars
site-library-sort-sh
site-library-sort-yq
site-list-dir
site-list-file
site-list-output
site-list-rgx-dir
site-list-rgx-file
site-list-sed-dir
site-list-sed-file
site-list-targets
site-list-tst
site-list-tst-dir
site-list-tst-file
site-targets
site-targets-cache
site-targets-contents
site-targets-contents-done
site-targets-file
site-targets-helpers
site-targets-metainfo
site-targets-metainfo-done
site-targets-metalist
site-targets-metalist-done
site-targets-readtime
site-targets-readtime-done
site-template-install
site-template-targets
subdirs-targets
subdirs-template
targets-list
targets-targets
template-print
template-var
template-var-static
None of the content on this site or on my linked websites was generated by (AI) artificial intelligence. I do my own work and express my own thoughts.