Skip to content

Commit

Permalink
Modified Markdown PDF
Browse files Browse the repository at this point in the history
  • Loading branch information
ganeshh123 committed Aug 3, 2020
1 parent e43913b commit e5d575c
Show file tree
Hide file tree
Showing 47 changed files with 4,869 additions and 2 deletions.
3 changes: 1 addition & 2 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -104,5 +104,4 @@ dist
.tern-port

markdowns/
pdfs/
markdown-pdf/
pdfs/
7 changes: 7 additions & 0 deletions markdown-pdf/.travis.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
language: node_js
node_js:
- "10"
- "12"
sudo: false
after_script:
- npm run coveralls
22 changes: 22 additions & 0 deletions markdown-pdf/LICENCE
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
Copyright (c) 2013 Alan Shaw

Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following
conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
283 changes: 283 additions & 0 deletions markdown-pdf/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,283 @@
markdown-pdf [![Build Status](https://travis-ci.org/alanshaw/markdown-pdf.svg)](https://travis-ci.org/alanshaw/markdown-pdf) [![Dependency Status](https://david-dm.org/alanshaw/markdown-pdf.svg)](https://david-dm.org/alanshaw/markdown-pdf) [![Coverage Status](https://img.shields.io/coveralls/alanshaw/markdown-pdf.svg?style=flat)](https://coveralls.io/r/alanshaw/markdown-pdf?branch=master)
===

Node module that converts Markdown files to PDFs.

The PDF looks great because it is styled by HTML5 Boilerplate. What? - Yes! Your Markdown is first converted to HTML, then pushed into the HTML5 Boilerplate `index.html`. Phantomjs renders the page and saves it to a PDF. You can even customise the style of the PDF by passing an optional path to your CSS _and_ you can pre-process your markdown file before it is converted to a PDF by passing in a pre-processing function, for templating.

## Install

```sh
npm install -g markdown-pdf --ignore-scripts
```

Note: elevated (sudo) permissions may be needed for `npm install -g`

## Usage

```
Usage: markdown-pdf [options] <markdown-file-path>
Options:
-h, --help output usage information
-V, --version output the version number
<markdown-file-path> Path of the markdown file to convert
-c, --cwd [path] Current working directory
-p, --phantom-path [path] Path to phantom binary
-h, --runnings-path [path] Path to runnings (header, footer)
-s, --css-path [path] Path to custom CSS file
-z, --highlight-css-path [path] Path to custom highlight-CSS file
-m, --remarkable-options [json] Options to pass to Remarkable
-f, --paper-format [format] 'A3', 'A4', 'A5', 'Legal', 'Letter' or 'Tabloid'
-r, --paper-orientation [orientation] 'portrait' or 'landscape'
-b, --paper-border [measurement] Supported dimension units are: 'mm', 'cm', 'in', 'px'
-d, --render-delay [millis] Delay before rendering the PDF
-t, --load-timeout [millis] Timeout before the page is rendered in case `page.onLoadFinished` isn't fired
-o, --out [path] Path of where to save the PDF
```

`markdown-pdf` can also be used programmatically:

```javascript
var markdownpdf = require("markdown-pdf")
, fs = require("fs")

fs.createReadStream("/path/to/document.md")
.pipe(markdownpdf())
.pipe(fs.createWriteStream("/path/to/document.pdf"))

// --- OR ---

markdownpdf().from("/path/to/document.md").to("/path/to/document.pdf", function () {
console.log("Done")
})
```

### Options

Pass an options object (`markdownpdf({/* options */})`) to configure the output.

#### options.cwd
Type: `String`
Default value: `process.cwd()`

Current working directory.

#### options.phantomPath
Type: `String`
Default value: Path provided by phantomjs module

Path to the phantomjs binary.

#### options.cssPath
Type: `String`
Default value: `[module path]/markdown-pdf/css/pdf.css`

Path to custom CSS file, relative to the current directory.

#### options.highlightCssPath
Type: `String`
Default value: `[module path]/markdown-pdf/css/highlight.css`

Path to custom highlight CSS file (for code highlighting with [highlight.js](https://highlightjs.org)), relative to the current directory.

#### options.paperFormat
Type: `String`
Default value: `A4`

'A3', 'A4', 'A5', 'Legal', 'Letter' or 'Tabloid'.

#### options.paperOrientation
Type: `String`
Default value: `portrait`

'portrait' or 'landscape'.

#### options.paperBorder
Type: `String`
Default value: `2cm`

Supported dimension units are: 'mm', 'cm', 'in', 'px'

#### options.runningsPath
Type: `String`
Default value: `runnings.js`

Path to CommonJS module which sets the page header and footer (see [runnings.js](runnings.js)).

#### options.renderDelay
Type: `Number`
Default value: Time until [`page.onLoadFinished`](http://phantomjs.org/api/webpage/handler/on-load-finished.html) event fired

Delay (in ms) before the PDF is rendered.

#### options.loadTimeout
Type: `Number`
Default value: `10000`

If `renderDelay` option isn't set, this is the timeout (in ms) before the page is rendered in case the `page.onLoadFinished` event doesn't fire.

#### options.preProcessMd
Type: `Function`
Default value: `function () { return through() }`

A function that returns a [through2 stream](https://npmjs.org/package/through2) that transforms the markdown before it is converted to HTML.

#### options.preProcessHtml
Type: `Function`
Default value: `function () { return through() }`

A function that returns a [through2 stream](https://npmjs.org/package/through2) that transforms the HTML before it is converted to PDF.

#### options.remarkable
Type: `object`
Default value: `{ breaks: true }`

A config object that is passed to [remarkable](https://www.npmjs.com/package/remarkable#options), the underlying markdown parser.

##### options.remarkable.preset
Type: `String`
Default value: `default`

Use remarkable [presets](https://www.npmjs.com/package/remarkable#presets) as a convenience to quickly enable/disable active syntax rules and options for common use cases.

Supported values are `default`, `commonmark` and `full`

##### options.remarkable.plugins
Type: `Array` of remarkable-plugin `Function`s
Default value: `[]`

An array of Remarkable plugin functions, that extend the markdown parser functionality.

##### options.remarkable.syntax
Type: `Array` of optional remarkable syntax `Strings`s
Default value: `[]`

An array of [optional Remarkable syntax extensions](https://github.com/jonschlinkert/remarkable#syntax-extensions), disabled by default, that extend the markdown parser functionality.

## API

### from.path(path, opts) / from(path, opts)

Create a readable stream from `path` and pipe to markdown-pdf. `path` can be a single path or array of paths.

### from.string(string)

Create a readable stream from `string` and pipe to markdown-pdf. `string` can be a single string or array of strings.

### concat.from.paths(paths, opts)

Create and concatenate readable streams from `paths` and pipe to markdown-pdf.

### concat.from.strings(strings, opts)

Create and concatenate readable streams from `strings` and pipe to markdown-pdf.

### to.path(path, cb) / to(path, cb)

Create a writeable stream to `path` and pipe output from markdown-pdf to it. `path` can be a single path, or array of output paths if you specified an array of inputs. The callback function `cb` will be invoked when data has finished being written.

### to.buffer(opts, cb)

Create a [concat-stream](https://npmjs.org/package/concat-stream) and pipe output from markdown-pdf to it. The callback function `cb` will be invoked when the buffer has been created.

### to.string(opts, cb)

Create a [concat-stream](https://npmjs.org/package/concat-stream) and pipe output from markdown-pdf to it. The callback function `cb` will be invoked when the string has been created.

## More examples

### From string to path

```javascript
var markdownpdf = require("markdown-pdf")

var md = "foo===\n* bar\n* baz\n\nLorem ipsum dolor sit"
, outputPath = "/path/to/doc.pdf"

markdownpdf().from.string(md).to(outputPath, function () {
console.log("Created", outputPath)
})
```

### From multiple paths to multiple paths

```javascript
var markdownpdf = require("markdown-pdf")

var mdDocs = ["home.md", "about.md", "contact.md"]
, pdfDocs = mdDocs.map(function (d) { return "out/" + d.replace(".md", ".pdf") })

markdownpdf().from(mdDocs).to(pdfDocs, function () {
pdfDocs.forEach(function (d) { console.log("Created", d) })
})
```

### Concat from multiple paths to single path

```javascript
var markdownpdf = require("markdown-pdf")

var mdDocs = ["chapter1.md", "chapter2.md", "chapter3.md"]
, bookPath = "/path/to/book.pdf"

markdownpdf().concat.from(mdDocs).to(bookPath, function () {
console.log("Created", bookPath)
})
```

### Transform markdown before conversion

```javascript
var markdownpdf = require("markdown-pdf")
, split = require("split")
, through = require("through")
, duplexer = require("duplexer")

function preProcessMd () {
// Split the input stream by lines
var splitter = split()

// Replace occurences of "foo" with "bar"
var replacer = through(function (data) {
this.queue(data.replace(/foo/g, "bar") + "\n")
})

splitter.pipe(replacer)
return duplexer(splitter, replacer)
}

markdownpdf({preProcessMd: preProcessMd})
.from("/path/to/document.md")
.to("/path/to/document.pdf", function () { console.log("Done") })
```

### Remarkable options and plugins

Example using [remarkable-classy](https://www.npmjs.com/package/remarkable-classy) plugin:

```javascript
var markdownpdf = require("markdown-pdf")

var options = {
remarkable: {
html: true,
breaks: true,
plugins: [ require('remarkable-classy') ],
syntax: [ 'footnote', 'sup', 'sub' ]
}
}

markdownpdf(options)
.from("/path/to/document.md")
.to("/path/to/document.pdf", function () { console.log("Done") })
```

## Contribute

Feel free to dive in! [Open an issue](https://github.com/alanshaw/markdown-pdf/issues/new) or submit PRs.

## License

[MIT](LICENCE) © Alan Shaw
43 changes: 43 additions & 0 deletions markdown-pdf/bin/markdown-pdf
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
#!/usr/bin/env node

var markdownpdf = require('../')
var program = require('commander')

program.version(require('../package.json').version)
.usage('[options] <markdown-file-path>')
.option('<markdown-file-path>', 'Path of the markdown file to convert')
.option('-c, --cwd [path]', 'Current working directory')
.option('-p, --phantom-path [path]', 'Path to phantom binary')
.option('-h, --runnings-path [path]', 'Path to runnings (header, footer)')
.option('-s, --css-path [path]', 'Path to custom CSS file')
.option('-z, --highlight-css-path [path]', 'Path to custom highlight-CSS file')
.option('-m, --remarkable-options [json-options]', 'Options to pass to remarkable')
.option('-f, --paper-format [format]', '"A3", "A4", "A5", "Legal", "Letter" or "Tabloid"')
.option('-r, --paper-orientation [orientation]', '"portrait" or "landscape"')
.option('-b, --paper-border [measurement]', 'Supported dimension units are: "mm", "cm", "in", "px"')
.option('-d, --render-delay [millis]', 'Delay before rendering the PDF')
.option('-t, --load-timeout [millis]', 'Timeout before the page is rendered in case `page.onLoadFinished` isn\'t fired')
.option('-o, --out [path]', 'Path of where to save the PDF')
.parse(process.argv)

if (program.args.length === 0) program.help()

program.out = program.out || program.args[0].replace(/\.m(ark)?d(own)?/gi, '') + '.pdf'

var opts = {
cwd: program.cwd,
phantomPath: program.phantomPath,
runningsPath: program.runningsPath,
cssPath: program.cssPath,
highlightCssPath: program.highlightCssPath,
remarkable: program.remarkableOptions ? JSON.parse(program.remarkableOptions) : null,
paperFormat: program.paperFormat,
paperOrientation: program.paperOrientation,
paperBorder: program.paperBorder,
renderDelay: program.renderDelay,
loadTimeout: program.loadTimeout
}

markdownpdf(opts).concat.from(program.args).to(program.out, function (err) {
if (err) throw err
})
1 change: 1 addition & 0 deletions markdown-pdf/css/highlight.css

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions markdown-pdf/css/pdf.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
body {
font-size: 0.625em;
}
Loading

0 comments on commit e5d575c

Please sign in to comment.