Skip to main content

Lossy python to markdown serializer

Project description

markpickle

Markpickle is a Python library for lossy serialization of markdown to simple python data types and back. It will create predictable markdown from a python object, but can't turn all markdown files into sensible python objects (for that use a markdown library that creates an AST). I created this because I wanted a way to turn json into Markdown.

For example this

- 1
- 2

becomes the python list [1, 2]

Almost all markdown libraries use it as intended, as a way to generate HTML fragments from untrusted sources for insertion into some other HTML template. We are using it to represent data.

Libraries.io dependency status for latest release Downloads


Installation

pip install markpickle

Capabilities

This is a lossy serialization. Markdown is missing too many concepts to make a high fidelity representation of a python data structure. If you want an object model that faithfully represents each object in a Markdown document, use the AST of mistune or one of the other markdown parsers.


Supported Types

  • Scalar values
  • Lists of scalar values
  • Dictionaries with scalar values
  • Lists of dictionaries of scalar values
  • Dictionaries with list values
  • Partial support for blanks/string with leading/trailing whitespace

See examples.

Not Supported

  • Things not ordinarily serializable
  • Markdown that uses more than headers, lists, tables
  • Blanks, falsy values, empty iterables don't round trip
  • Scalar type inference doesn't round trip. After a scalar is converted to a markdown string, there is no indication if the original was a string or not.

Serializing and Deserializing


Serializing

Results can be formatted at the cost of speed. Dictionaries can be represented as tables or header-text pairs.

Deserializing

Markdown is deserialized by parsing the document to an abstract syntax tree (AST). This is done by mistune. If the markdown file has the same structure that markpickle uses, then it will create a sensible object. Deserializing a random README.md file is not expected to always work. For that, you should use mistune's AST.

Round Tripping

Some but not all data structures will be round-trippable. The goal is that the sort of dicts you get from loading JSON will be round-trippable, provided everything is a string.

Splitting Files

If typical serialization scenarios, many json files might be written to a single file, or in the case of yaml, you can put multiple documents into one file separated by ---. markpickle can treat the horizontal rule as a document spliter if you use split_file. It works like splitstream, but less efficiently.

CLI

This command will take a deserializable markdown file and output json.

python -m markpickle "docs/individual/list of scalars.md"

Prior Art

People normally want to convert json to markdown. Json looks like python dict, so if you can do that you can probably do both.

Serializing to Markdown

json2md, a node package, will turn json that looks like the HTML document object model into markdown, e.g.

{"h1": "Some Header",
 "p": "Some Text"}

tomark will turn dict into a markdown table. Unmaintained.

pytablewriter also, dict to table, but supports many tabular formats.

Deserializing to Python

Most libraries turn markdown into document object model. Markdown-to-json is the most similar to markpickle's goal of turning a markdown document into a python data types, in this case nested dicts.

markdown-to-json

mistune will turn markdown into an Abstract Syntax Tree. The AST is faithful representation of the Markdown, including concepts that have no semantic equivalent to python datatypes.

beautifulsoup will let you navigate the HTML DOM. So you can turn the markdown into HTML, then parse with Beautiful Soup.

Schema Validation for Markdown

In the case of a serialization library, you'd want something that would indicate if your markdown file will successfully deserialize back into python.

I haven't really found anything that says, for example, "This markdown document shall have one # Header and a 3 column table and nothing else."

Documentation

Change Log

  • 1.1.0 - Basic functionality. See examples for what is supported.
  • 1.2.0 - Add support for binary data, which is serialized as images with data URLs.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

markpickle-1.3.0.tar.gz (18.0 kB view hashes)

Uploaded Source

Built Distribution

markpickle-1.3.0-py2.py3-none-any.whl (19.3 kB view hashes)

Uploaded Python 2 Python 3

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page