Skip to main content

Python bindings for mq, a jq-like command-line tool for Markdown processing

Project description

mq-python

PyPI ci GitHub Release codecov CodSpeed Badge

Python bindings for the mq Markdown processor.

Installation

pip install markdown-query

Usage

Basic Usage

Use the run function to process Markdown with mq queries:

import mq

# Extract all level 1 headings
result = mq.run(".h1", "# Hello World\n\n## Heading2\n\nText")
print(result.values)  # ['# Hello World']

# Extract all level 2 headings
result = mq.run(".h2", "# Main Title\n\n## Section A\n\n## Section B")
print(result.values)  # ['## Section A', '## Section B']

# Get all results as a single string
print(result.text)  # '## Section A\n## Section B'

Filtering and Transforming

Use mq query syntax to filter and transform Markdown:

import mq

markdown = """
# Product

## Features
Great features here.

## Installation
Install instructions.
"""

# Filter headings containing specific text
result = mq.run('.h2 | select(contains("Feature"))', markdown)
print(result.values)  # ['## Features']

# Extract list items
result = mq.run(".[]", "# List\n\n- Item 1\n- Item 2\n- Item 3")
print(result.values)  # ['- Item 1', '- Item 2', '- Item 3']

# Extract code blocks
result = mq.run(".code", "# Code\n\n```python\nprint('Hello')\n```")
print(result.values)  # ["```python\nprint('Hello')\n```"]

Input Formats

mq supports multiple input formats:

import mq

# Markdown (default)
options = mq.Options()
options.input_format = mq.InputFormat.MARKDOWN
result = mq.run(".h1", "# Heading", options)

# MDX (Markdown with JSX)
options = mq.Options()
options.input_format = mq.InputFormat.MDX
result = mq.run("select(is_mdx())", "# MDX\n\n<Component />", options)
print(result.values)  # ['<Component />']

# HTML
options = mq.Options()
options.input_format = mq.InputFormat.HTML
result = mq.run('select(contains("Hello"))', "<h1>Hello</h1><p>World</p>", options)
print(result.values)  # ['# Hello']

# Plain text
options = mq.Options()
options.input_format = mq.InputFormat.TEXT
result = mq.run('select(contains("2"))', "Line 1\nLine 2\nLine 3", options)
print(result.values)  # ['Line 2']

Available input formats:

  • InputFormat.MARKDOWN - Standard Markdown (default)
  • InputFormat.MDX - Markdown with JSX
  • InputFormat.HTML - HTML content
  • InputFormat.TEXT - Plain text
  • InputFormat.RAW - Raw string input
  • InputFormat.NULL - Null input

Rendering Options

Customize the output rendering:

import mq

options = mq.Options()
options.input_format = mq.InputFormat.MARKDOWN
options.list_style = mq.ListStyle.PLUS        # Use '+' for list items
options.link_title_style = mq.TitleSurroundStyle.SINGLE  # Use single quotes for link titles
options.link_url_style = mq.UrlSurroundStyle.ANGLE       # Use angle brackets for URLs

result = mq.run(".", markdown, options)

Available options:

  • ListStyle: DASH (default), PLUS, STAR
  • TitleSurroundStyle: DOUBLE (default), SINGLE, PAREN
  • UrlSurroundStyle: NONE (default), ANGLE

HTML to Markdown Conversion

Convert HTML to Markdown:

import mq

html = "<h1>Hello World</h1><p>This is a <strong>test</strong>.</p>"
markdown = mq.html_to_markdown(html)
print(markdown)  # '# Hello World\n\nThis is a **test**.'

# With conversion options
options = mq.ConversionOptions()
options.extract_scripts_as_code_blocks = True  # Convert <script> tags to code blocks
options.generate_front_matter = True           # Generate front matter from metadata
options.use_title_as_h1 = True                 # Use <title> as h1 heading

markdown = mq.html_to_markdown(html, options)

Working with Results

The run function returns an MQResult object:

import mq

result = mq.run(".h", "# H1\n\n## H2\n\n### H3")

# Get the number of results
print(len(result))  # 3

# Access individual results by index
print(result[0].text)  # '# H1'

# Iterate over results
for value in result.values:
    print(value)

# Get all results as a single string
print(result.text)  # '# H1\n## H2\n### H3'

# Check if a value is in the result
print("# H1" in result.values)  # True

Each MQValue has the following properties:

  • text - The string representation of the value
  • values - For arrays, returns the list of values
  • markdown_type - The type of Markdown element (e.g., Heading, Code, List)
  • is_array() - Check if the value is an array
  • is_markdown() - Check if the value is a Markdown element

Error Handling

Invalid queries raise a RuntimeError:

import mq

try:
    result = mq.run(".invalid!!!", "# Heading")
except RuntimeError as e:
    print(f"Query error: {e}")

Development

Building from Source

git clone https://github.com/harehare/mq
cd mq/crates/mq-python
pip install maturin
maturin develop

Running Tests

pytest tests/

Support

License

Licensed under the MIT License.

Project details


Download files

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

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

markdown_query-0.5.16-pp311-pypy311_pp73-win_amd64.whl (1.3 MB view details)

Uploaded PyPyWindows x86-64

markdown_query-0.5.16-cp313-cp313t-win_amd64.whl (1.3 MB view details)

Uploaded CPython 3.13tWindows x86-64

markdown_query-0.5.16-cp39-abi3-win_amd64.whl (1.3 MB view details)

Uploaded CPython 3.9+Windows x86-64

markdown_query-0.5.16-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.9+manylinux: glibc 2.17+ x86-64

markdown_query-0.5.16-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.2 MB view details)

Uploaded CPython 3.9+manylinux: glibc 2.17+ ARM64

markdown_query-0.5.16-cp39-abi3-macosx_11_0_arm64.whl (1.2 MB view details)

Uploaded CPython 3.9+macOS 11.0+ ARM64

markdown_query-0.5.16-cp39-abi3-macosx_10_12_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.9+macOS 10.12+ x86-64

File details

Details for the file markdown_query-0.5.16-pp311-pypy311_pp73-win_amd64.whl.

File metadata

File hashes

Hashes for markdown_query-0.5.16-pp311-pypy311_pp73-win_amd64.whl
Algorithm Hash digest
SHA256 fd5fc45e4bd354055cdcb99050e921cdc54d6bef30c6a58c31c949eed0d09a46
MD5 4707346333abc220c7c0bf83b9c3ea3f
BLAKE2b-256 deecd55eb3a8146fc8a7554530542cf33df58cdd2eaeaf853c54ba0de1da4550

See more details on using hashes here.

File details

Details for the file markdown_query-0.5.16-cp313-cp313t-win_amd64.whl.

File metadata

File hashes

Hashes for markdown_query-0.5.16-cp313-cp313t-win_amd64.whl
Algorithm Hash digest
SHA256 80c35f104bdd715f3531c0c29e932ddc798048d3b881fbbe7973035a573fddf7
MD5 7b1c4b9657f917e4d4417f22db216064
BLAKE2b-256 c7746e62b1b47f4e98c887ce122100e5a9132fe109d25f66a4939a19d54887bb

See more details on using hashes here.

File details

Details for the file markdown_query-0.5.16-cp39-abi3-win_amd64.whl.

File metadata

File hashes

Hashes for markdown_query-0.5.16-cp39-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 b14619220807d92665b02b609fd114e050d8b027462a8281af310752b362b13d
MD5 a6114589757e28465b47d57430ac72a7
BLAKE2b-256 e77e23efc1557716af1a02fe01ff2c11a039fa34238e0d7919385792c468be2a

See more details on using hashes here.

File details

Details for the file markdown_query-0.5.16-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for markdown_query-0.5.16-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 168fdac0e235381edd8456136beeca39f5b59b5286ff53d1a12980416c5bef2a
MD5 ec5b43570ccda6fffcb9092ae003da59
BLAKE2b-256 c150fb04973baf5d064390f2702dd28bf69e29d30a583db5af307258a0e4c699

See more details on using hashes here.

File details

Details for the file markdown_query-0.5.16-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for markdown_query-0.5.16-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 d93d27059a737927b699448649196da23cb70e9c7dd726ed5b2219d5201c92c5
MD5 3bec163eec7d81c9d1177e44c7965d11
BLAKE2b-256 7b83e26ba891be18ac5d1d756d3b27dfd8475ea9092aa34c481ae114f9221fb4

See more details on using hashes here.

File details

Details for the file markdown_query-0.5.16-cp39-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for markdown_query-0.5.16-cp39-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 085df12bed814b6b3e413f6771708b62da2f61f46396983d0cab2398284d2f80
MD5 68f5eb3e2664732cc90c2071e1dea8c4
BLAKE2b-256 09fa189a947da5ed74023e9e3470ccc00cd9e96bc74afd06474afbe47ce410c1

See more details on using hashes here.

File details

Details for the file markdown_query-0.5.16-cp39-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for markdown_query-0.5.16-cp39-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 eafa8df6228f552eb2c98fc3e8b888325dd4c791fd402494fba82d57eb89ddf8
MD5 a362a14e2375bc82b1da4d34c22325f8
BLAKE2b-256 17cd289a14788d73d7b21de5efa89825c7949c88ffa60addb64bffbd69166df5

See more details on using hashes here.

Supported by

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