Extension for Visual Studio Code - LaTeX Math for Markdown. With macros and more.
- Markdown to PDF A simple and hackable CLI tool for converting markdown to pdf. It uses Marked to convert markdown to html and Puppeteer (headless Chromium) to further convert the html to pdf. It also uses highlight.js for code highlighting.
- Generate HTML & PDF documentation from Github wiki or any other markdown-based wiki. 1.5.2 - a HTML package on npm - Libraries.io.
- For instance, Markdown is designed to be easier to write. If you need to use a different JavaScript preprocessor, remove the packages in the npm tab.
- Using Pug is as simple as npm i pug-plain-loader pug, and it will modify the Webpack config for you. Tagged with pug, markdown, vue.
Pandoc is a great tool to transform text formats yintoother text formats. I use it to create PDF / HTML / epub / mobi versions out ofmy book from my Markdown files.
It comes with plugins (pandoc filters) that allow transforming the AST(abstract syntax tree) of your text files, so you can build your own syntax andmake it do pretty much anything. The idea is similar to other AST transformationframeworks that you might know, such asjscodeshift orremark. While pandoc and its plugins aremainly written in Haskell, you can also write them in JavaScript using Node.js.
We will write and test a plugin that allows including source code from your filesystem in code blocks. The full-featured plugin is available onGitHub as pandoc-code-file-filter
.
Development
A pandoc plugin is a binary file that can be passed as an option to running thepandoc command:
Which means we will start by setting up an NPM
project and creating abin/filter.js
file with the #!/usr/bin/env node
preamble. We need to installpandoc-filter-promisified
which includes the pandoc bindings.
Our binary file uses this library and applies an action
function to whateverpandoc sends to our filter.
If you want to publish your pandoc-filter through NPM, you need to referencethe binary file in the package.json as 'bin': { 'pandoc-code-file-filter':'bin/filter.js'}
The main part of our logic will be implemented in our src/index.js
file. Theentry point of a pandoc plugin is an action
file. It is passed each block ofthe AST and some meta information about the conversion happening.
The elt
object describes a node of the syntax tree. Its type can be checkedwith the t
key and its header and content can be read by accessing the c
key. Admittedly, these names and keys look like someone who spent too much timein Haskell came up with them. Also, there is no official documentation for thesetypes. I found it easiest to check the source code ofpandoc-filter-nodeand log the results.
Here, we check if the type is a CodeBlock
and check if an include
isspecified in the headers.
Convert Markdown To Pdf Npm
This would match the following code block in Markdown:
After extracting the include
information, we can read the file using Node.js and replace the CodeBlock
’s content with the file content.
Replacing the AST is done by simply returning a new node in the action
function.We call the CodeBlock
constructor with the new headers (old headers minus our include
header) and the new file content.
Testing
To test if our filter works, we can write some jest tests.
Our example Markdown file will have the following contents:
The example.js
file with the content we want to include is just a normal JS file.
Node Markdown To Pdf
We can now run pandoc using our filter on the Markdown file and verify pandoc’s output using jest’s snapshot testing.Create the test in test/index.test.js
:
Here, I ran pandoc to create another Markdown file as the output.The new Markdown output is saved as a snapshot test, which makes it a lot easier as a human to verify than the AST.
You can now publish the pandoc filter on NPM and people can install it with npm -g your-pandoc-filter
.
And that’s all you need to know to get started with developing your own pandoc plugins. ✨