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.12-pp311-pypy311_pp73-win_amd64.whl (1.2 MB view details)

Uploaded PyPyWindows x86-64

markdown_query-0.5.12-cp313-cp313t-win_amd64.whl (1.2 MB view details)

Uploaded CPython 3.13tWindows x86-64

markdown_query-0.5.12-cp39-abi3-win_amd64.whl (1.2 MB view details)

Uploaded CPython 3.9+Windows x86-64

markdown_query-0.5.12-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.2 MB view details)

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

markdown_query-0.5.12-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.12-cp39-abi3-macosx_11_0_arm64.whl (1.2 MB view details)

Uploaded CPython 3.9+macOS 11.0+ ARM64

markdown_query-0.5.12-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.12-pp311-pypy311_pp73-win_amd64.whl.

File metadata

File hashes

Hashes for markdown_query-0.5.12-pp311-pypy311_pp73-win_amd64.whl
Algorithm Hash digest
SHA256 79eb62a80967aa58a70520ca3f79a6049c3990528a5e6b67b3de8a465807caff
MD5 8e1879657661baaf774ff29af61a38cf
BLAKE2b-256 d015e4c83967b9f568cc56d532579373636f392348520beebded88ea2468e45d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for markdown_query-0.5.12-cp313-cp313t-win_amd64.whl
Algorithm Hash digest
SHA256 becbe1e3804e6113531e39b91732926bb810651a909ab66d5c50be45ba9f41a5
MD5 99e053f8cd0b973ceb42261f1dc6ae31
BLAKE2b-256 7dd8356f678795c63fe87de5fc163578b4931af8e11bb43e10f2fc5a9e5249d3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for markdown_query-0.5.12-cp39-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 5e916b5b6c83186aab56e7e3c4879d2d31ac0304766292f6b7060ccf5e345dd7
MD5 80ee4bd7b038b6158d4b4bb3f39d751c
BLAKE2b-256 aad756b9199340f7f0a6c77529895c4be30ff8264e19c0756eac0680d0baa8e2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for markdown_query-0.5.12-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 6176f580f8014507ccea2c5e41dc7c891fd4da91445aee772edacacb06e64fc6
MD5 192fc4fb6323fd79d72ff69e8ee136f3
BLAKE2b-256 3c8cfdc4f04100cc25a78d29559376dcb97572b3bca9d221d44f19871895038b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for markdown_query-0.5.12-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 6b622377440c8d9e7bfc290503dbeebfad92ffaf9ea57bedf59e2ed824fe67cf
MD5 f3e23e46c80c8f99601eaa23dbd7a446
BLAKE2b-256 926cf22d4e6471e134d12fff42e271b3f538aeba3b112c24499abc6b0159b1ec

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for markdown_query-0.5.12-cp39-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f4d26628ed631672c7d5560960e1b9fb659b30d40b4260d9884f71782e6d8993
MD5 95cce3830f29f41660e00d7953674504
BLAKE2b-256 f54d83eb3a7dc7c8a5b50691fa1186182767542f8aaf0c8d068c27a5b11a19ea

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for markdown_query-0.5.12-cp39-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 800cafac0c475887ea53dedd2affa29cf00be555e698400d3038cf37b4c47280
MD5 b5bfff9f5b3810b7eee663f79c6f5031
BLAKE2b-256 0993b19aa3a16dd6abca081b8cc113a949f378dff0f4a8d7c1053b445f8c7809

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