https://github.com/htdebeer/pandocomatic
Automate the use of pandoc
https://github.com/htdebeer/pandocomatic
pandoc paru ruby static-site-generator
Last synced: 5 months ago
JSON representation
Automate the use of pandoc
- Host: GitHub
- URL: https://github.com/htdebeer/pandocomatic
- Owner: htdebeer
- License: gpl-3.0
- Created: 2014-03-31T12:36:42.000Z (almost 12 years ago)
- Default Branch: master
- Last Pushed: 2025-04-19T07:18:32.000Z (9 months ago)
- Last Synced: 2025-07-28T07:40:15.270Z (6 months ago)
- Topics: pandoc, paru, ruby, static-site-generator
- Language: Ruby
- Homepage: https://heerdebeer.org/Software/markdown/pandocomatic/
- Size: 4.86 MB
- Stars: 165
- Watchers: 8
- Forks: 14
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
[](https://badge.fury.io/rb/pandocomatic)
# Pandocomatic—Automate the use of pandoc
Pandocomatic automates the use of [pandoc](https://pandoc.org/). With
pandocomatic you can express common patterns of using pandoc for
generating your documents. Applied to a directory, pandocomatic acts as
a static site generator. For example, this manual is generated with
pandocomatic!
Pandocomatic is [free
software](https://www.gnu.org/philosophy/free-sw.en.html); pandocomatic
is released under the
[GPLv3](https://www.gnu.org/licenses/gpl-3.0.en.html). You will find the
source code of pandocomatic in its
[repository](https://github.com/htdebeer/pandocomatic) on
[Github](https://github.com).
**Note.** Pandocomatic is build on top of
[paru](https://github.com/htdebeer/paru), which is a wrapper around
pandoc.
**Note.** As I am a GNU/Linux user, I do not officially support other
operating systems like Mac OSX or Windows. Fixes and patches for those
operating systems are welcome.
See [pandocomatic’s
manual](https://heerdebeer.org/Software/markdown/pandocomatic/) for an
extensive description of pandocomatic.
## Why pandocomatic?
I use pandoc a lot. I use it to write all my papers, notes, websites,
reports, outlines, summaries, and books. Time and again I was invoking
pandoc like:
``` bash
pandoc --from markdown \
--to html \
--standalone \
--csl apa.csl \
--bibliography my-bib.bib \
--mathjax \
--output result.html \
source.md
```
Sure, when I write about history, the [CSL](https://citationstyles.org/)
file and bibliography change. And I do not need the `--mathjax` option
like I do when I am writing about mathematics education. Still, all
these invocations are quite similar.
I already wrote the program *do-pandoc.rb* as part of a Ruby wrapper
around pandoc, [paru](https://heerdebeer.org/Software/markdown/paru/).
Using *do-pandoc.rb* I can specify the options to pandoc in a metadata
block in the source file itself. With *do-pandoc.rb* the invocation
above is simplified to:
``` bash
do-pandoc.rb source.md
```
It saves me from typing out the whole pandoc invocation each time I run
pandoc on a source file. However, I have still to setup the same options
to use in each document that I am writing, even though these options do
not differ that much from document to document.
*Pandocomatic* is a tool to re-use these common configurations by
specifying a so-called *pandocomatic template* in a
[YAML](https://yaml.org/) configuration file. For example, by placing
the following file, `pandocomatic.yaml`, in pandoc’s data directory:
``` yaml
templates:
education-research:
preprocessors: []
pandoc:
from: markdown
to: html
standalone: true
csl: 'apa.csl'
toc: true
bibliography: /path/to/bibliography.bib
mathjax: true
postprocessors: []
```
In this configuration file a single *pandocomatic template* is being
defined: *education-research*. This template specifies that the source
files it is applied to are not being preprocessed. Furthermore, the
source files are converted with pandoc by invoking
`pandoc --from markdown --to html --standalone --csl apa.csl --toc --bibliography /path/to/bibliography.bib --mathjax`.
Finally, the template specifies that pandoc’s output is not being
postprocessed.
I now can create a new document that uses this template by including the
following metadata block in my source file, `on_teaching_maths.md`:
``` pandoc
---
title: On teaching mathematics
author: Huub de Beer
pandocomatic_:
use-template: education-research
pandoc:
output: on_teaching_mathematics.html
...
Here goes the contents of my new paper ...
```
To convert this file to `on_teaching_mathematics.html` I run
pandocomatic:
``` bash
pandocomatic -i on_teaching_maths.md
```
With just two extra lines in a metadata block I can tell pandocomatic
what template to use when converting a file. You can also use multiple
templates in a document, for example to convert a markdown file to both
HTML and PDF. Adding file-specific pandoc options to the conversion
process is as easy as adding a `pandoc` property with those options to
the `pandocomatic_` metadata property in the source file like I did with
the `output` property in the example above.
Once I had written a number of related documents this way, it was a
small step to enable pandocomatic to convert directories as well. Just
like that, pandocomatic can be used as a *static site generator*!
Pandocomatic is [free
software](https://www.gnu.org/philosophy/free-sw.en.html); pandocomatic
is released under the
[GPLv3](https://www.gnu.org/licenses/gpl-3.0.en.html). You find
pandocomatic’s source code on
[github](https://github.com/htdebeer/pandocomatic).
## Installation
Pandocomatic is a [Ruby](https://www.ruby-lang.org/en/) program and can
be installed through [RubyGems](https://rubygems.org/) as follows:
``` bash
gem install pandocomatic
```
This will install pandocomatic and
[paru](https://heerdebeer.org/Software/markdown/paru/), a Ruby wrapper
around pandoc. To use pandocomatic, you also need a working pandoc
installation. See [pandoc’s installation
guide](https://pandoc.org/installing.html) for more information about
installing pandoc.
### Docker
You can also build and install the latest version yourself by running
the following commands:
``` bash
cd /directory/you/downloaded/the/gem/to
docker image build --tag pandocomatic:dev .
docker container run --rm -it --volume $(pwd):/home/pandocomatic-user pandocomatic:dev bundle exec rake build
gem install pkg/pandocomatic-2.1.0.gem
```
You only have to do the second step one time. Once you’ve created a
docker image, you can reuse it as is until `Dockerfile` changes.
### MacOS: Brew
Alternatively, MacOS users can install pandocomatic via
[homebrew](https://formulae.brew.sh/formula/pandocomatic):
``` bash
brew install pandocomatic
```
## Examples
### Convert a single file
Convert `hello.md` to `hello.html` according to the configuration in
`pandocomatic.yaml`:
``` bash
pandocomatic --config pandocomatic.yaml -o hello.html -i hello.md
```
### Convert a directory
Generate a static site using data directory `assets`, but only convert
files that have been updated since the last time pandocomatic has been
run:
``` bash
pandocomatic --data-dir assets/ -o website/ -i source/ -m
```
### Generating pandocomatic’s manual and README files
Generate the markdown files for pandocomatic’s
[manual](https://heerdebeer.org/Software/markdown/pandocomatic/) and its
[github repository](https://github.com/htdebeer/pandocomatic) README:
``` bash
git clone https://github.com/htdebeer/pandocomatic.git
cd documentation
pandocomatic -d data-dir -c config.yaml -i README.md -o ../README.md
pandocomatic -d data-dir -c config.yaml -i manual.md -o ../index.md
```
Be careful to not overwrite the input file with the output file! I would
suggest using different names for both, or different directories.
Looking more closely to the pandocomatic configuration file
`config.yaml`, we see it contains one template, `mddoc`:
``` yaml
templates:
mddoc:
pandoc:
from: markdown
to: markdown
standalone: true
filter:
- filters/insert_document.rb
- filters/insert_code_block.rb
- filters/remove_pandocomatic_metadata.rb
- filters/insert_pandocomatic_version.rb
indexdoc:
extends: mddoc
postprocessors: ['postprocessors/setup_for_website.rb']
```
The `mddoc` template tells pandocomatic to convert a markdown file to a
standalone markdown file using three filters: `insert_document.rb`,
`insert_code_block.rb`, and `remove_pandocomatic_metadata.rb`. The first
two filters allow you to include another markdown file or to include a
source code file (see the README listing below). The last filter removes
the pandocomatic metadata block from the file so the settings in it do
not interfere when, later on, `manual.md` is converted to HTML. These
filters are located in the
[`filters`](https://github.com/htdebeer/pandocomatic/tree/master/documentation/data-dir/filters)
subdirectory in the specified data directory `data-dir`.
However, the `mddoc` template converts from and to pandoc’s markdown
variant, which differs slightly from the markdown variant used by
[Github](https://github.com/) for README files. Luckily, pandoc does
support writing Github’s markdown variant. There is no need to create
and use a different template for generating the README, though, as you
can override all template’s settings inside a pandocomatic block in a
markdown file:
``` markdown
---
pandocomatic_:
use-template: mddoc
pandoc:
to: markdown_github
...
# Pandocomatic—Automate the use of pandoc
::paru::insert introduction.md
## Why pandocomatic?
::paru::insert why_pandocomatic.md
## Licence
::paru::insert license.md
## Installation
::paru::insert install.md
## Examples
::paru::insert usage_examples.md
## More information
See [pandocomatic's
manual](https://heerdebeer.org/Software/markdown/pandocomatic/) for more
extensive examples of using pandocomatic. Notably, the manual contains two
typical use cases of pandocomatic:
1. [automating setting up and running pandoc for a series of related papers](https://heerdebeer.org/Software/markdown/pandocomatic/#automating-setting-up-and-running-pandoc-for-a-series-of-related-papers), and
2. [using pandocomatic as a static site
generator](https://heerdebeer.org/Software/markdown/pandocomatic/#using-pandocomatic-as-a-static-site-generator).
```
Here you see that the README uses the `mddoc` template and it overwrites
the `to` property with `markdown_github`.
Similarly, in the input file
[`manual.md`](https://github.com/htdebeer/pandocomatic/blob/master/documentation/manual.md),
an extra filter is specified,
[‘number_chapters_and_sections_and_figures.rb’](https://github.com/htdebeer/pandocomatic/blob/master/documentation/data-dir/filters/number_chapters_and_sections_and_figures.rb),
to number the chapters and sections in the manual, which is not needed
for the README, by using the following pandocomatic metadata in the
manual input file:
``` yaml
pandocomatic_:
use-template: mddoc
pandoc:
filter:
- 'filters/number_chapters_and_sections_and_figures.rb'
```
Pandocomatic allows you to generalize common aspects of running pandoc
while still offering the ability to be as specific as needed.
## More information
See [pandocomatic’s
manual](https://heerdebeer.org/Software/markdown/pandocomatic/) for more
extensive examples of using pandocomatic.