Skip to main content

Zig ANSI syntax highlighting library

Project description

uv Ruff

zig-codeblocks

zig-codeblocks is a CPython 3.10+ library for adding syntax highlighting to Zig code blocks in Markdown files through ANSI escape codes. Originally intended for patching the lack of syntax highlighting for Zig on Discord.

Installation

zig-codeblocks is available on PyPI:

pip install zig-codeblocks

You can also install it from source:

pip install git+https://github.com/trag1c/zig-codeblocks.git

API Reference

extract_codeblocks

def extract_codeblocks(source: str | bytes) -> Iterator[CodeBlock]

Yields CodeBlocks from a Markdown source. Assumes UTF-8 if source is bytes.

Example usage:

from pathlib import Path

from zig_codeblocks import extract_codeblocks

source = Path("examples/riiz.md").read_text()
for codeblock in extract_codeblocks(source):
    print(f"Language: {codeblock.lang}")
    print(f"Body:\n{codeblock.body}")
Language: py
Body:
print("Hello, World!")

Language: zig
Body:
const std = @import("std");
pub fn main() !void {
    std.debug.print("Hello, World!\n", .{});
}

highlight_zig_code

def highlight_zig_code(source: str | bytes, theme: Theme = DEFAULT_THEME) -> str

Returns an ANSI syntax-highlighted version of the given Zig source code. Assumes UTF-8 if source is bytes. An optional Theme can be supplied (defaults to DEFAULT_THEME).

Example usage:

from pathlib import Path

from zig_codeblocks import DEFAULT_THEME, Color, Style, highlight_zig_code

source = Path("examples/hello_world.zig").read_text()

theme = DEFAULT_THEME.copy()
theme.builtin_identifiers = Style(Color.ORANGE, underline=True)
theme.strings = Style(Color.CYAN)
theme.types = None

print(
    highlight_zig_code(source),
    highlight_zig_code(source, theme),
    sep="\n\n",
)

process_markdown

def process_markdown(
    source: str | bytes,
    theme: Theme = DEFAULT_THEME,
    *,
    only_code: bool = False,
) -> str

Returns a Markdown source with Zig code blocks syntax-highlighted. Assumes UTF-8 if source is bytes. An optional Theme can be supplied (defaults to DEFAULT_THEME). If only_code is True, only processed Zig code blocks will be returned.

Example usage:

from pathlib import Path

from zig_codeblocks import process_markdown

source = Path("examples/riiz.md").read_text()
print(process_markdown(source))

CodeBlock

class CodeBlock(NamedTuple):
    lang: str
    body: str

A code block extracted from a Markdown source.

Color

class Color(Enum):
    GRAY = "30"
    RED = "31"
    GREEN = "32"
    ORANGE = "33"
    BLUE = "34"
    MAGENTA = "35"
    CYAN = "36"
    WHITE = "37"  # Black for light mode

An enumeration of 3-bit ANSI colors. Some names were adjusted to match Discord's style.

Style

@dataclass(slots=True, frozen=True)
class Style:
    color: Color
    _: KW_ONLY
    bold: bool = False
    underline: bool = False

A style for syntax highlighting. Takes a Color and can optionally be bold and/or underlined. Immutable. Produces an SGR sequence when converted to a string.

Theme

class Theme(TypedDict, total=False):
    builtin_identifiers: Style
    calls: Style
    comments: Style
    identifiers: Style
    keywords: Style
    numeric: Style
    strings: Style
    primitive_values: Style
    types: Style

A theme dict for syntax highlighting Zig code. Each key is optional and can be provided a Style to apply to the corresponding token type. Can be instantiated with a dict literal or with a Theme call:

from zig_codeblocks import Color, Style, Theme

theme_foo = Theme(
    numeric=Style(Color.BLUE),
    strings=Style(Color.GREEN),
)

theme_bar: Theme = {
    "numeric": Style(Color.BLUE),
    "strings": Style(Color.GREEN),
}

assert theme_foo == theme_bar

DEFAULT_THEME

The default theme used for highlighting, defined as follows:

DEFAULT_THEME = Theme(
    builtin_identifiers=Style(Color.BLUE, bold=True),
    calls=Style(Color.BLUE),
    comments=Style(Color.GRAY),
    keywords=Style(Color.MAGENTA),
    numeric=Style(Color.CYAN),
    primitive_values=Style(Color.CYAN),
    strings=Style(Color.GREEN),
    types=Style(Color.ORANGE),
)

License

zig-codeblocks is licensed under the MIT License.
© trag1c, 2025

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

zig_codeblocks-0.2.3.tar.gz (530.5 kB view details)

Uploaded Source

Built Distribution

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

zig_codeblocks-0.2.3-py3-none-any.whl (8.5 kB view details)

Uploaded Python 3

File details

Details for the file zig_codeblocks-0.2.3.tar.gz.

File metadata

  • Download URL: zig_codeblocks-0.2.3.tar.gz
  • Upload date:
  • Size: 530.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.6.0

File hashes

Hashes for zig_codeblocks-0.2.3.tar.gz
Algorithm Hash digest
SHA256 80ed4bd06f6921ce89d8f79e0cc082c78f2be3e8b7bacebd09b4271b795158c3
MD5 0a97066491f91ae5785943c7832805d6
BLAKE2b-256 f89599e6fbeae363cd75b5df338682f69e96095f4c1b3a6f03cb996c834a01be

See more details on using hashes here.

File details

Details for the file zig_codeblocks-0.2.3-py3-none-any.whl.

File metadata

File hashes

Hashes for zig_codeblocks-0.2.3-py3-none-any.whl
Algorithm Hash digest
SHA256 7700694ed9deb8e0d76519a776aff5663ecb4474bedac359409896c1fb1211bd
MD5 2657258359e0770982550e4610214059
BLAKE2b-256 83ef6fadbdb24b6ab8480b6a868091fd83c186457ff6cf8c8f9fb34f371a770d

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