limberer


Namelimberer JSON
Version 0.9.0 PyPI version JSON
download
home_page
SummaryA flexible document generator based on weasyprint, mustache templates, and pandoc.
upload_time2023-12-09 11:16:23
maintainer
docs_urlNone
author
requires_python>=3.9
licenseCopyright (c) 2023 Jeff Dileo. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
keywords pandoc panflute markdown html pdf report document generator
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # Limberer: Flexible document generation based on WeasyPrint, mustache templates, and Pandoc.

`limberer` is a utility for assembling markdown into documents.

## Usage

```
$ limberer create projname
$ cd projname
$ limberer build report.toml
$ open projname.pdf
```

## Features

* Markdown-based
* Consistent builds
* Automatic table of contents generation
* Mustache template hardening (disable `__` access and lambda evaluation)
* WeasyPrint hardening (restricts file access)
* Source code snippet syntax highlighting
* 2-column layouts
* Footnote support
* Image/figure support
* Markdown within HTML tables
* Flexible

## Installation

### Prerequisites

```
$ sudo apt-get install pandoc
```

***Note:*** If your distro has an older version of pandoc (e.g. 2.9.x), get it from <https://github.com/jgm/pandoc/releases/>.

```
$ wget https://github.com/jgm/pandoc/releases/download/<ver>/pandoc-<...>.deb
$ sudo dpkg -i ./pandoc-*.deb
```

### Install

```
$ pip3 install --user limberer
```

### From Source

```
$ git clone https://github.com/ChaosData/limberer && cd limberer
$ python3 -m pip install --user --upgrade pip setuptools
$ python3 -m pip install --user .
```

### Packaging

```
$ python3 -m pip install --user wheel build
$ python3 -m build --sdist --wheel .
$ python3 -m pip install --user dist/limberer-*.whl
```

### Cleaning

```
$ rm -rf ./build ./dist ./src/limberer.egg-info ./src/limberer/__pycache__
```

## Guide

`limberer` is primarily about structuring documents through the use of
"sections," which are ordered in a document's `<project>.toml` file.

These sections are based on HTML Mustache templates. For the most part, the
`section` template will be used to write document content. For such
`type = "section"` sections, the content will be sourced from a (currently)
Markdown file based on the section `name` value (`sections/<name>.md`). By
default, sections will be rendered against the `template/section.html`
template, but the template used can be changed via an `alt = "othertemplate"`
section list setting.

### Project TOML Example

```toml
title = "Example Document"
subheading = "..."
#globaloption=value
#...

authors = [
  { name = "Example Person", email = "example@example.com" },
  ...
]

sections = [
  { type = "cover" },
  { type = "toc" },
  { name = "example", type = "section" },
  { name = "example2", type = "section", sectionoption = "value" },
  ...
]
```

Additional or overriding settings or Mustache template variables can be
configured by passing additional TOML file paths into the `limberer build`
command:

```
$ limberer build report.toml stats.toml
```

### Section Templates

Out of the box, `limberer` comes with some initial section templates:

* `cover`: A title page section.
* `toc`: A table of contents section.
* `section`: The underlying template for custom sections.

Additionally, `limberer` supports the following template-like pseudo-sections:

* `appendix_start`: Subsequent sections will be treated as appendices.
* `appendix_end`: Disables the above setting; subsequent sections are not
  treated as appendices. The appendix counter will not be cleared.

### Custom Sections

Custom sections ("sections") are a mix of Markdown (and, in some cases, HTML),
with support for Mustache expressions (using the TOML configuration), where
most document content is written. A section can begin with a block of Markdown
metadata:

```markdown
---
toc_header_level: 2
columns: true
title: Example3
classes: foo bar baz
---
```

The metadata options are merged with the section entry options. Currently
supported options are the following:

* `toc_header_level`: Header level limit to use for table of contents entry
  generation.
* `columns`: Whether or not to use the 2-column format for the section.
* `title`: Section title for 2-column format.
* `classes`: List of HTML class names to apply to the section (`<article>`)
* `end_footnotes`: Footnotes will be placed at the end of the section instead
   of at/near the site of placement.

Additionally, the following options may be passed in a section entry within the
project TOML:

* `conf = "path/to/config.toml"`: This specifies a path to a TOML file that
  is loaded for the context of the section. This is useful for loading
  generated data into a section containing Mustache templating, or for reusing
  a section that is itself a "config template" combining Mustache and Markdown.
* `cont = true`: This specifies that the section's Markdown should be directly
  concatenated instead of being handled as a full section. This is useful for
  combining "config templates" together, or, more simply, just managing large
  single sections that are not intended to be divided across multiple
  `<article>` elements within the underlying HTML.

#### Tables

Tables can be written using the pipe-delimited GitHub-flavored Markdown
convention, or with HTML tables.

```markdown
| First Header  | Second Header |
| ------------- | ------------- |
| Content Cell  | Content Cell  |
| Content Cell  | Content Cell  |
```

````HTML
<table>
  <thead>
    <tr>
      <th style="width: 20%">a</th>
      <th style="width: 40%">b</th>
      <th>c</th>
      <th>d</th>
    </tr>
  </thead>
  <tbody>
    <tr><td>**Bold**</td><td>_italic_</td>
<td>
```
code block
```
</td>
<td>
* list
* of
* things
</td>
    </tr>
    <tr><td></td><td></td><td></td><td></td></tr>
    <tr><td></td><td></td><td></td><td></td></tr>
    <tr><td></td><td></td><td></td><td></td></tr>
  </tbody>
</table>
````

#### Images

A simple image can be embedded with custom CSS to place/style it:

```markdown
![](./images/test1.jpg){style="width: 30%; margin: auto; display: block;"}
```

However, for the most part, figures are a better way to embed images:

```markdown
![An example image](./images/test1.jpg){style="width: 30%; border: 1px solid red;"}
```

The figures themselves can be styled with the `figstyle` and `figclass` options:

```markdown
![Another example image](./images/test1.jpg){style="width: 1.5in" figstyle="color: red; width: 35%;" figclass="aaa bbb"}
```

Additionally, there is support for a side-by-side image-and-text in the default
layout/theme using a little HTML:

```markdown
<div class="two-col-fig">
![This is on the left](./images/test1.jpg)
<div style="width: 40%">
## A Header

Lorem ipsum dolor sit amet...
</div>
</div>
```

The order of these can also be swapped:

```markdown
<div class="two-col-fig">
<div style="width: 40%">
## A Header

Lorem ipsum dolor sit amet...
</div>
![This is on the right](./images/test1.jpg){style="width: 1.5in"}
</div>
```

#### Cross-References

Xrefs can be made through links to an element's `id`. By default, headings have
autogenerated IDs based on the heading text (e.g. `# Examplely Example` will
have an `id` of `{section}-examplely-example`. However, this can be overridden
as follows:

```markdown
## AAA{#aaah2}
```

***Note:*** The `{section}-` prefix will be applied to all `id` values other
than of the sections themselves.

To xref, any link to `#<id>` will suffice, but to style xrefs, a few options
are available in the default style/layout.

* `.xref`: A simple unstyled segment of text.

  ```
  * [xref to Example2.AAA](#example2-aaah2){.xref}
  * <a class="xref" href="#example2-aaah2">xref to Example2.AAA</a>
  ```

* `.xrefn`: This will autopopulate the target's text content.  
  ***Note:*** Be careful not to use this on elements containing large
  quantities of text via child nodes.

  ```
  * <a class="xrefn" href="#example2-aaah2"></a>
  * [](#example2-aaah2){.xrefn}
  ```

* `.xrefpg`: This will add a " on page XX".

  ```
  * <a class="xrefn xrefpg" href="#example2-aaah2"></a>
  * [](#example2-aaah2){.xrefn .xrefpg}
  ```

#### Code Blocks


````markdown
```js { lines="true" start="99" highlight="1,5" filename="HelloWorld.js" }
let j = await fetch("https://wat.wat", {
  "headers": {
    "x-test": "foo"
  }
}).then((res)=>res.json());
```
<p class="caption">Example Snippet of Code</p>

```js
let j = await fetch("https://wat.wat", {
  "headers": {
    "x-test": "foo"
  }
}).then((res)=>res.json());
```
<figure class="caption"><figcaption>Example Snippet of Code with a figure prefix</figcaption></figure>
````

The following settings can be configured in the project TOML:

* `highlight` (defaults to `"monokai"`)
* `highlight_plaintext` (defaults to `"solarized-dark"`)
* `highlight_font` (defaults to `"'DejaVu Sans Mono', monospace"`)
* `highlight_style` (defaults to `"border-radius: 2px; overflow-x: auto;"`)
* `highlight_padding` (defaults to `"padding: 0.5rem 1rem 0.5rem 1rem;"`)
* `highlight_padding_lines` (defaults to `"padding: 0.25rem 0.5rem 0.25rem 0.5rem;")

#### Breaks

The following can be added to force a break.

```html
<div class="pagebreak"></div>
```

```html
<div class="columnbreak"></div>
```

#### Footnotes

Footnotes should mostly work as expected, but can fit poorly and may be better
shifted to another page.

```markdown
Hello world.[^test]

[^test]: <https://github.com/ChaosData/limberer>
```

### Theming/Styling

By default, `limberer` comes with some core styling and section templates.
It is expected that users will customize their document templates beyond what
is provided. As such, the `limberer create` command supports a `-t <path>`
option to generate a new project from a given template project directory.

Generally speaking, the styling you want to use is up to you. However, for
convenience, the CSS is organized as `core`, `style`, and `custom`. The intent
is for the `assets/core.css` to cover the main layout and functioning of the
document, the `assets/style.css` to cover group theming for consistency, and
`custom/custom.css` to be for any per-document/project styling.

## Todo List

* Support for custom Mustache-generated CSS
* Better footnotes
* Draft builds
* Partial builds of individual sections
* Support for non-Markdown sections

## FAQ

> Why?

For a litany of reasons, but if I had to go out on a limb and pick one, it
would be that LaTeX is a great typesetter, but a terrible build system.

> What!?

Greetz to asch, tanner, agrant, jblatz, and dthiel. <3

            

Raw data

            {
    "_id": null,
    "home_page": "",
    "name": "limberer",
    "maintainer": "",
    "docs_url": null,
    "requires_python": ">=3.9",
    "maintainer_email": "Jeff Dileo <jtdileo@gmail.com>",
    "keywords": "pandoc,panflute,markdown,html,pdf,report,document,generator",
    "author": "",
    "author_email": "Jeff Dileo <jtdileo@gmail.com>",
    "download_url": "https://files.pythonhosted.org/packages/da/05/9f23ee7821fc559f2508831ec62c42e25baa326659060caf1b9d4e29c04c/limberer-0.9.0.tar.gz",
    "platform": null,
    "description": "# Limberer: Flexible document generation based on WeasyPrint, mustache templates, and Pandoc.\n\n`limberer` is a utility for assembling markdown into documents.\n\n## Usage\n\n```\n$ limberer create projname\n$ cd projname\n$ limberer build report.toml\n$ open projname.pdf\n```\n\n## Features\n\n* Markdown-based\n* Consistent builds\n* Automatic table of contents generation\n* Mustache template hardening (disable `__` access and lambda evaluation)\n* WeasyPrint hardening (restricts file access)\n* Source code snippet syntax highlighting\n* 2-column layouts\n* Footnote support\n* Image/figure support\n* Markdown within HTML tables\n* Flexible\n\n## Installation\n\n### Prerequisites\n\n```\n$ sudo apt-get install pandoc\n```\n\n***Note:*** If your distro has an older version of pandoc (e.g. 2.9.x), get it from <https://github.com/jgm/pandoc/releases/>.\n\n```\n$ wget https://github.com/jgm/pandoc/releases/download/<ver>/pandoc-<...>.deb\n$ sudo dpkg -i ./pandoc-*.deb\n```\n\n### Install\n\n```\n$ pip3 install --user limberer\n```\n\n### From Source\n\n```\n$ git clone https://github.com/ChaosData/limberer && cd limberer\n$ python3 -m pip install --user --upgrade pip setuptools\n$ python3 -m pip install --user .\n```\n\n### Packaging\n\n```\n$ python3 -m pip install --user wheel build\n$ python3 -m build --sdist --wheel .\n$ python3 -m pip install --user dist/limberer-*.whl\n```\n\n### Cleaning\n\n```\n$ rm -rf ./build ./dist ./src/limberer.egg-info ./src/limberer/__pycache__\n```\n\n## Guide\n\n`limberer` is primarily about structuring documents through the use of\n\"sections,\" which are ordered in a document's `<project>.toml` file.\n\nThese sections are based on HTML Mustache templates. For the most part, the\n`section` template will be used to write document content. For such\n`type = \"section\"` sections, the content will be sourced from a (currently)\nMarkdown file based on the section `name` value (`sections/<name>.md`). By\ndefault, sections will be rendered against the `template/section.html`\ntemplate, but the template used can be changed via an `alt = \"othertemplate\"`\nsection list setting.\n\n### Project TOML Example\n\n```toml\ntitle = \"Example Document\"\nsubheading = \"...\"\n#globaloption=value\n#...\n\nauthors = [\n  { name = \"Example Person\", email = \"example@example.com\" },\n  ...\n]\n\nsections = [\n  { type = \"cover\" },\n  { type = \"toc\" },\n  { name = \"example\", type = \"section\" },\n  { name = \"example2\", type = \"section\", sectionoption = \"value\" },\n  ...\n]\n```\n\nAdditional or overriding settings or Mustache template variables can be\nconfigured by passing additional TOML file paths into the `limberer build`\ncommand:\n\n```\n$ limberer build report.toml stats.toml\n```\n\n### Section Templates\n\nOut of the box, `limberer` comes with some initial section templates:\n\n* `cover`: A title page section.\n* `toc`: A table of contents section.\n* `section`: The underlying template for custom sections.\n\nAdditionally, `limberer` supports the following template-like pseudo-sections:\n\n* `appendix_start`: Subsequent sections will be treated as appendices.\n* `appendix_end`: Disables the above setting; subsequent sections are not\n  treated as appendices. The appendix counter will not be cleared.\n\n### Custom Sections\n\nCustom sections (\"sections\") are a mix of Markdown (and, in some cases, HTML),\nwith support for Mustache expressions (using the TOML configuration), where\nmost document content is written. A section can begin with a block of Markdown\nmetadata:\n\n```markdown\n---\ntoc_header_level: 2\ncolumns: true\ntitle: Example3\nclasses: foo bar baz\n---\n```\n\nThe metadata options are merged with the section entry options. Currently\nsupported options are the following:\n\n* `toc_header_level`: Header level limit to use for table of contents entry\n  generation.\n* `columns`: Whether or not to use the 2-column format for the section.\n* `title`: Section title for 2-column format.\n* `classes`: List of HTML class names to apply to the section (`<article>`)\n* `end_footnotes`: Footnotes will be placed at the end of the section instead\n   of at/near the site of placement.\n\nAdditionally, the following options may be passed in a section entry within the\nproject TOML:\n\n* `conf = \"path/to/config.toml\"`: This specifies a path to a TOML file that\n  is loaded for the context of the section. This is useful for loading\n  generated data into a section containing Mustache templating, or for reusing\n  a section that is itself a \"config template\" combining Mustache and Markdown.\n* `cont = true`: This specifies that the section's Markdown should be directly\n  concatenated instead of being handled as a full section. This is useful for\n  combining \"config templates\" together, or, more simply, just managing large\n  single sections that are not intended to be divided across multiple\n  `<article>` elements within the underlying HTML.\n\n#### Tables\n\nTables can be written using the pipe-delimited GitHub-flavored Markdown\nconvention, or with HTML tables.\n\n```markdown\n| First Header  | Second Header |\n| ------------- | ------------- |\n| Content Cell  | Content Cell  |\n| Content Cell  | Content Cell  |\n```\n\n````HTML\n<table>\n  <thead>\n    <tr>\n      <th style=\"width: 20%\">a</th>\n      <th style=\"width: 40%\">b</th>\n      <th>c</th>\n      <th>d</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr><td>**Bold**</td><td>_italic_</td>\n<td>\n```\ncode block\n```\n</td>\n<td>\n* list\n* of\n* things\n</td>\n    </tr>\n    <tr><td></td><td></td><td></td><td></td></tr>\n    <tr><td></td><td></td><td></td><td></td></tr>\n    <tr><td></td><td></td><td></td><td></td></tr>\n  </tbody>\n</table>\n````\n\n#### Images\n\nA simple image can be embedded with custom CSS to place/style it:\n\n```markdown\n![](./images/test1.jpg){style=\"width: 30%; margin: auto; display: block;\"}\n```\n\nHowever, for the most part, figures are a better way to embed images:\n\n```markdown\n![An example image](./images/test1.jpg){style=\"width: 30%; border: 1px solid red;\"}\n```\n\nThe figures themselves can be styled with the `figstyle` and `figclass` options:\n\n```markdown\n![Another example image](./images/test1.jpg){style=\"width: 1.5in\" figstyle=\"color: red; width: 35%;\" figclass=\"aaa bbb\"}\n```\n\nAdditionally, there is support for a side-by-side image-and-text in the default\nlayout/theme using a little HTML:\n\n```markdown\n<div class=\"two-col-fig\">\n![This is on the left](./images/test1.jpg)\n<div style=\"width: 40%\">\n## A Header\n\nLorem ipsum dolor sit amet...\n</div>\n</div>\n```\n\nThe order of these can also be swapped:\n\n```markdown\n<div class=\"two-col-fig\">\n<div style=\"width: 40%\">\n## A Header\n\nLorem ipsum dolor sit amet...\n</div>\n![This is on the right](./images/test1.jpg){style=\"width: 1.5in\"}\n</div>\n```\n\n#### Cross-References\n\nXrefs can be made through links to an element's `id`. By default, headings have\nautogenerated IDs based on the heading text (e.g. `# Examplely Example` will\nhave an `id` of `{section}-examplely-example`. However, this can be overridden\nas follows:\n\n```markdown\n## AAA{#aaah2}\n```\n\n***Note:*** The `{section}-` prefix will be applied to all `id` values other\nthan of the sections themselves.\n\nTo xref, any link to `#<id>` will suffice, but to style xrefs, a few options\nare available in the default style/layout.\n\n* `.xref`: A simple unstyled segment of text.\n\n  ```\n  * [xref to Example2.AAA](#example2-aaah2){.xref}\n  * <a class=\"xref\" href=\"#example2-aaah2\">xref to Example2.AAA</a>\n  ```\n\n* `.xrefn`: This will autopopulate the target's text content.  \n  ***Note:*** Be careful not to use this on elements containing large\n  quantities of text via child nodes.\n\n  ```\n  * <a class=\"xrefn\" href=\"#example2-aaah2\"></a>\n  * [](#example2-aaah2){.xrefn}\n  ```\n\n* `.xrefpg`: This will add a \" on page XX\".\n\n  ```\n  * <a class=\"xrefn xrefpg\" href=\"#example2-aaah2\"></a>\n  * [](#example2-aaah2){.xrefn .xrefpg}\n  ```\n\n#### Code Blocks\n\n\n````markdown\n```js { lines=\"true\" start=\"99\" highlight=\"1,5\" filename=\"HelloWorld.js\" }\nlet j = await fetch(\"https://wat.wat\", {\n  \"headers\": {\n    \"x-test\": \"foo\"\n  }\n}).then((res)=>res.json());\n```\n<p class=\"caption\">Example Snippet of Code</p>\n\n```js\nlet j = await fetch(\"https://wat.wat\", {\n  \"headers\": {\n    \"x-test\": \"foo\"\n  }\n}).then((res)=>res.json());\n```\n<figure class=\"caption\"><figcaption>Example Snippet of Code with a figure prefix</figcaption></figure>\n````\n\nThe following settings can be configured in the project TOML:\n\n* `highlight` (defaults to `\"monokai\"`)\n* `highlight_plaintext` (defaults to `\"solarized-dark\"`)\n* `highlight_font` (defaults to `\"'DejaVu Sans Mono', monospace\"`)\n* `highlight_style` (defaults to `\"border-radius: 2px; overflow-x: auto;\"`)\n* `highlight_padding` (defaults to `\"padding: 0.5rem 1rem 0.5rem 1rem;\"`)\n* `highlight_padding_lines` (defaults to `\"padding: 0.25rem 0.5rem 0.25rem 0.5rem;\")\n\n#### Breaks\n\nThe following can be added to force a break.\n\n```html\n<div class=\"pagebreak\"></div>\n```\n\n```html\n<div class=\"columnbreak\"></div>\n```\n\n#### Footnotes\n\nFootnotes should mostly work as expected, but can fit poorly and may be better\nshifted to another page.\n\n```markdown\nHello world.[^test]\n\n[^test]: <https://github.com/ChaosData/limberer>\n```\n\n### Theming/Styling\n\nBy default, `limberer` comes with some core styling and section templates.\nIt is expected that users will customize their document templates beyond what\nis provided. As such, the `limberer create` command supports a `-t <path>`\noption to generate a new project from a given template project directory.\n\nGenerally speaking, the styling you want to use is up to you. However, for\nconvenience, the CSS is organized as `core`, `style`, and `custom`. The intent\nis for the `assets/core.css` to cover the main layout and functioning of the\ndocument, the `assets/style.css` to cover group theming for consistency, and\n`custom/custom.css` to be for any per-document/project styling.\n\n## Todo List\n\n* Support for custom Mustache-generated CSS\n* Better footnotes\n* Draft builds\n* Partial builds of individual sections\n* Support for non-Markdown sections\n\n## FAQ\n\n> Why?\n\nFor a litany of reasons, but if I had to go out on a limb and pick one, it\nwould be that LaTeX is a great typesetter, but a terrible build system.\n\n> What!?\n\nGreetz to asch, tanner, agrant, jblatz, and dthiel. <3\n",
    "bugtrack_url": null,
    "license": "Copyright (c) 2023 Jeff Dileo. All rights reserved.  Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:  1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ",
    "summary": "A flexible document generator based on weasyprint, mustache templates, and pandoc.",
    "version": "0.9.0",
    "project_urls": {
        "repository": "https://github.com/ChaosData/limberer"
    },
    "split_keywords": [
        "pandoc",
        "panflute",
        "markdown",
        "html",
        "pdf",
        "report",
        "document",
        "generator"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "3c12b80f6723e5082d67ca381f74d1df8a36822c0c243d5ed6ec27f896cd6a61",
                "md5": "719d76e7879ad75deb4794de4b43723e",
                "sha256": "27389b7c68ad27c79aea73aee8771289b32ba9f991f7b6ae2abcc80aefdb0e09"
            },
            "downloads": -1,
            "filename": "limberer-0.9.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "719d76e7879ad75deb4794de4b43723e",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.9",
            "size": 82944,
            "upload_time": "2023-12-09T11:16:22",
            "upload_time_iso_8601": "2023-12-09T11:16:22.178660Z",
            "url": "https://files.pythonhosted.org/packages/3c/12/b80f6723e5082d67ca381f74d1df8a36822c0c243d5ed6ec27f896cd6a61/limberer-0.9.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "da059f23ee7821fc559f2508831ec62c42e25baa326659060caf1b9d4e29c04c",
                "md5": "fcbffc1eac2eb9aa2f3b58cad86daa59",
                "sha256": "11886c9d8fef891eff8ad5458894c6e0ab4da794a2ed0ef362757041cd235c51"
            },
            "downloads": -1,
            "filename": "limberer-0.9.0.tar.gz",
            "has_sig": false,
            "md5_digest": "fcbffc1eac2eb9aa2f3b58cad86daa59",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.9",
            "size": 82852,
            "upload_time": "2023-12-09T11:16:23",
            "upload_time_iso_8601": "2023-12-09T11:16:23.644849Z",
            "url": "https://files.pythonhosted.org/packages/da/05/9f23ee7821fc559f2508831ec62c42e25baa326659060caf1b9d4e29c04c/limberer-0.9.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2023-12-09 11:16:23",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "ChaosData",
    "github_project": "limberer",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "lcname": "limberer"
}
        
Elapsed time: 0.14730s