hmleqx 0.2.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- hmleqx-0.2.0/.github/workflows/ci.yml +40 -0
- hmleqx-0.2.0/.github/workflows/publish.yml +82 -0
- hmleqx-0.2.0/.gitignore +9 -0
- hmleqx-0.2.0/CLAUDE.md +55 -0
- hmleqx-0.2.0/Cargo.lock +398 -0
- hmleqx-0.2.0/Cargo.toml +25 -0
- hmleqx-0.2.0/PKG-INFO +160 -0
- hmleqx-0.2.0/README.md +146 -0
- hmleqx-0.2.0/bindings/python/Cargo.toml +17 -0
- hmleqx-0.2.0/bindings/python/src/lib.rs +36 -0
- hmleqx-0.2.0/docs/DESIGN.md +296 -0
- hmleqx-0.2.0/docs/REFERENCE.md +291 -0
- hmleqx-0.2.0/docs/TESTING.md +22 -0
- hmleqx-0.2.0/pyproject.toml +23 -0
- hmleqx-0.2.0/python/hmleqx/__init__.py +18 -0
- hmleqx-0.2.0/src/ast.rs +146 -0
- hmleqx-0.2.0/src/error.rs +29 -0
- hmleqx-0.2.0/src/latex.rs +560 -0
- hmleqx-0.2.0/src/lexer.rs +331 -0
- hmleqx-0.2.0/src/lib.rs +54 -0
- hmleqx-0.2.0/src/parser.rs +695 -0
- hmleqx-0.2.0/src/symbols.rs +726 -0
- hmleqx-0.2.0/src/token.rs +43 -0
- hmleqx-0.2.0/tests/examples.rs +311 -0
- hmleqx-0.2.0/tests/python/test_api.py +39 -0
- hmleqx-0.2.0/tests/serde_roundtrip.rs +71 -0
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main, dev]
|
|
6
|
+
pull_request:
|
|
7
|
+
|
|
8
|
+
env:
|
|
9
|
+
CARGO_TERM_COLOR: always
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
ci:
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
steps:
|
|
15
|
+
- uses: actions/checkout@v4
|
|
16
|
+
- uses: dtolnay/rust-toolchain@stable
|
|
17
|
+
with:
|
|
18
|
+
components: rustfmt, clippy
|
|
19
|
+
- uses: Swatinem/rust-cache@v2
|
|
20
|
+
- run: cargo fmt --all --check
|
|
21
|
+
- run: cargo clippy --workspace --all-features -- -D warnings
|
|
22
|
+
- run: cargo test --workspace --all-features
|
|
23
|
+
# the parser/AST-only build the README advertises must keep compiling
|
|
24
|
+
- run: cargo check -p hmleq --no-default-features
|
|
25
|
+
|
|
26
|
+
python:
|
|
27
|
+
runs-on: ubuntu-latest
|
|
28
|
+
strategy:
|
|
29
|
+
matrix:
|
|
30
|
+
python-version: ["3.10", "3.13"]
|
|
31
|
+
steps:
|
|
32
|
+
- uses: actions/checkout@v4
|
|
33
|
+
- uses: dtolnay/rust-toolchain@stable
|
|
34
|
+
- uses: actions/setup-python@v5
|
|
35
|
+
with:
|
|
36
|
+
python-version: ${{ matrix.python-version }}
|
|
37
|
+
- run: python -m pip install --upgrade pip
|
|
38
|
+
# pip invokes the maturin build backend and compiles the Rust extension.
|
|
39
|
+
- run: python -m pip install .
|
|
40
|
+
- run: python -m unittest discover -s tests/python -v
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
|
|
2
|
+
name: Publish Python Package
|
|
3
|
+
|
|
4
|
+
on:
|
|
5
|
+
push:
|
|
6
|
+
tags:
|
|
7
|
+
- "v*"
|
|
8
|
+
|
|
9
|
+
permissions:
|
|
10
|
+
contents: read
|
|
11
|
+
|
|
12
|
+
jobs:
|
|
13
|
+
build-wheels:
|
|
14
|
+
name: Build wheels (${{ matrix.os }})
|
|
15
|
+
runs-on: ${{ matrix.os }}
|
|
16
|
+
strategy:
|
|
17
|
+
fail-fast: false
|
|
18
|
+
matrix:
|
|
19
|
+
os:
|
|
20
|
+
- ubuntu-latest
|
|
21
|
+
- windows-latest
|
|
22
|
+
- macos-latest
|
|
23
|
+
|
|
24
|
+
steps:
|
|
25
|
+
- uses: actions/checkout@v4
|
|
26
|
+
|
|
27
|
+
- uses: dtolnay/rust-toolchain@stable
|
|
28
|
+
|
|
29
|
+
- uses: PyO3/maturin-action@v1
|
|
30
|
+
with:
|
|
31
|
+
command: build
|
|
32
|
+
args: --release --out dist
|
|
33
|
+
|
|
34
|
+
- uses: actions/upload-artifact@v4
|
|
35
|
+
with:
|
|
36
|
+
name: wheels-${{ matrix.os }}
|
|
37
|
+
path: dist
|
|
38
|
+
if-no-files-found: error
|
|
39
|
+
|
|
40
|
+
build-sdist:
|
|
41
|
+
runs-on: ubuntu-latest
|
|
42
|
+
steps:
|
|
43
|
+
- uses: actions/checkout@v4
|
|
44
|
+
- uses: dtolnay/rust-toolchain@stable
|
|
45
|
+
|
|
46
|
+
- uses: PyO3/maturin-action@v1
|
|
47
|
+
with:
|
|
48
|
+
command: sdist
|
|
49
|
+
args: --out dist
|
|
50
|
+
|
|
51
|
+
- uses: actions/upload-artifact@v4
|
|
52
|
+
with:
|
|
53
|
+
name: sdist
|
|
54
|
+
path: dist
|
|
55
|
+
if-no-files-found: error
|
|
56
|
+
|
|
57
|
+
publish:
|
|
58
|
+
needs: [build-wheels, build-sdist]
|
|
59
|
+
runs-on: ubuntu-latest
|
|
60
|
+
|
|
61
|
+
environment:
|
|
62
|
+
name: pypi
|
|
63
|
+
url: https://pypi.org/p/hmleqx
|
|
64
|
+
|
|
65
|
+
permissions:
|
|
66
|
+
id-token: write
|
|
67
|
+
|
|
68
|
+
steps:
|
|
69
|
+
- uses: actions/download-artifact@v4
|
|
70
|
+
with:
|
|
71
|
+
pattern: wheels-*
|
|
72
|
+
path: dist
|
|
73
|
+
merge-multiple: true
|
|
74
|
+
|
|
75
|
+
- uses: actions/download-artifact@v4
|
|
76
|
+
with:
|
|
77
|
+
name: sdist
|
|
78
|
+
path: dist
|
|
79
|
+
|
|
80
|
+
- uses: pypa/gh-action-pypi-publish@release/v1
|
|
81
|
+
with:
|
|
82
|
+
packages-dir: dist/
|
hmleqx-0.2.0/.gitignore
ADDED
hmleqx-0.2.0/CLAUDE.md
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# CLAUDE.md
|
|
2
|
+
|
|
3
|
+
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
|
4
|
+
|
|
5
|
+
## What this is
|
|
6
|
+
|
|
7
|
+
`hmleq` parses the Hancom HWP(한글) equation script language (`x = {-b +- sqrt{b^2 - 4ac}} over {2a}`) into a serde-serializable AST, with an optional LaTeX emitter. Cargo workspace: the root crate is the `hmleq` library; `cli/` holds the `hmleq-cli` package, whose binary is named `hmleq`.
|
|
8
|
+
|
|
9
|
+
README.md and docs/REFERENCE.md are written in Korean; docs/DESIGN.md and all code comments are in English.
|
|
10
|
+
|
|
11
|
+
## Commands
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
cargo test # default features (latex)
|
|
15
|
+
cargo test --all-features # + serde round-trip tests
|
|
16
|
+
cargo test --all-features canonical_reference_examples # single test by name
|
|
17
|
+
cargo fmt --all --check
|
|
18
|
+
cargo clippy --workspace --all-features -- -D warnings
|
|
19
|
+
cargo check -p hmleq --no-default-features # zero-dep parser/AST-only build must keep compiling
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
CI runs exactly those four check/test commands. The `--no-default-features` build is advertised in the README, so it must not break.
|
|
23
|
+
|
|
24
|
+
Run the CLI:
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
cargo run -q -p hmleq-cli -- 'lim _{x rarrow 0} {sin x} over x = 1' # LaTeX out
|
|
28
|
+
cargo run -q -p hmleq-cli -- --json '1 over pi' # AST as JSON
|
|
29
|
+
echo 'pmatrix { a & b # c & d }' | cargo run -q -p hmleq-cli # stdin
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Architecture
|
|
33
|
+
|
|
34
|
+
Single pipeline, one module per stage:
|
|
35
|
+
|
|
36
|
+
- `src/lexer.rs` -- delimiter-based tokenizer. Whitespace splits and is dropped; maximal alphabetic runs become one `Word` token; 2-char operator ligatures (`+-`, `!=`, ...) are tried before single-char `Op`s. Every token carries its byte span; `ParseError` positions are byte offsets.
|
|
37
|
+
- `src/symbols.rs` -- keyword tables (~250 `SymDef` entries, linear search) plus `lookup()`. **Whole-word exact matching only**: the exact case-sensitive table is tried first (keywords where capitalization changes meaning: `Lim`, `RARROW`, capital Greek...), then a case-insensitive table keyed by the ASCII-lowercased word. `None` means ordinary italic identifier -- so `sinh` is one keyword, `sinx` is the identifier *sinx*. Lookup is never called on a prefix.
|
|
38
|
+
- `src/parser.rs` -- recursive descent over the token stream. Sequences are parsed to a `Stop` (EOF / `}` / `RIGHT` / matrix cell); `over`/`atop`/`choose` are infix and pop the last already-parsed item as their left operand, which makes them left-associative. Matrix row/cell splitting on `#`/`&` is depth-local.
|
|
39
|
+
- `src/ast.rs` -- `Node`. There is no Group node: a `{...}` group collapses to its content (`Node::seq`), binding already decided by the parser. With the `serde` feature, `Symbol`/`Accent` serialize as the canonical keyword name and deserialize by re-resolving through the keyword table, so only real keywords are accepted; `Big` sizes are validated against the four LaTeX size commands.
|
|
40
|
+
- `src/latex.rs` -- emitter. Golden rules: `Row` children are joined with exactly one space; macro arguments are always braced, even single tokens (exceptions: script bases, bare unless a `Row` of ≥2 items, and root degrees). Ligature->LaTeX mapping and delimiter mapping live here, not in the parser. The `aligned`/`gathered` wrapper is decided only at top level in `to_latex`.
|
|
41
|
+
|
|
42
|
+
Features: `latex` (default) gates the emitter; `serde` gates AST serialization. With `default-features = false` the core is dependency-free.
|
|
43
|
+
|
|
44
|
+
## The docs are the spec
|
|
45
|
+
|
|
46
|
+
- `docs/REFERENCE.md` -- source of truth for **language semantics** (token rules, keyword matching, full command list).
|
|
47
|
+
- `docs/DESIGN.md` -- source of truth for **implementation behavior**: exact grammar decisions, exact LaTeX output, symbol-table mappings, exact error messages. Where DESIGN.md decides something REFERENCE.md leaves open, DESIGN.md wins.
|
|
48
|
+
- `tests/examples.rs` asserts every row of DESIGN.md §6's canonical table as an **exact string**, plus the listed error cases. These strings are the contract: an intentional output change means updating the §6 table and the test together; otherwise a failing test means the implementation is wrong, not the expectation.
|
|
49
|
+
- The FROZEN / per-file agent-ownership annotations in DESIGN.md's module map are historical (from the initial multi-agent build) -- the behavioral spec still binds, the ownership rules do not.
|
|
50
|
+
|
|
51
|
+
## Conventions
|
|
52
|
+
|
|
53
|
+
- Code comments must be self-contained: describe the behavior in place, never cite DESIGN.md/REFERENCE.md section numbers or table rows (deliberate decision, commit 37477bf).
|
|
54
|
+
- Comments and string literals in source stay ASCII.
|
|
55
|
+
- Conventional-commit messages (`feat:`, `chore(comments):`, `refactor(cli):`, ...).
|
hmleqx-0.2.0/Cargo.lock
ADDED
|
@@ -0,0 +1,398 @@
|
|
|
1
|
+
# This file is automatically @generated by Cargo.
|
|
2
|
+
# It is not intended for manual editing.
|
|
3
|
+
version = 4
|
|
4
|
+
|
|
5
|
+
[[package]]
|
|
6
|
+
name = "anstream"
|
|
7
|
+
version = "1.0.0"
|
|
8
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
9
|
+
checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d"
|
|
10
|
+
dependencies = [
|
|
11
|
+
"anstyle",
|
|
12
|
+
"anstyle-parse",
|
|
13
|
+
"anstyle-query",
|
|
14
|
+
"anstyle-wincon",
|
|
15
|
+
"colorchoice",
|
|
16
|
+
"is_terminal_polyfill",
|
|
17
|
+
"utf8parse",
|
|
18
|
+
]
|
|
19
|
+
|
|
20
|
+
[[package]]
|
|
21
|
+
name = "anstyle"
|
|
22
|
+
version = "1.0.14"
|
|
23
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
24
|
+
checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000"
|
|
25
|
+
|
|
26
|
+
[[package]]
|
|
27
|
+
name = "anstyle-parse"
|
|
28
|
+
version = "1.0.0"
|
|
29
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
30
|
+
checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e"
|
|
31
|
+
dependencies = [
|
|
32
|
+
"utf8parse",
|
|
33
|
+
]
|
|
34
|
+
|
|
35
|
+
[[package]]
|
|
36
|
+
name = "anstyle-query"
|
|
37
|
+
version = "1.1.5"
|
|
38
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
39
|
+
checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc"
|
|
40
|
+
dependencies = [
|
|
41
|
+
"windows-sys",
|
|
42
|
+
]
|
|
43
|
+
|
|
44
|
+
[[package]]
|
|
45
|
+
name = "anstyle-wincon"
|
|
46
|
+
version = "3.0.11"
|
|
47
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
48
|
+
checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d"
|
|
49
|
+
dependencies = [
|
|
50
|
+
"anstyle",
|
|
51
|
+
"once_cell_polyfill",
|
|
52
|
+
"windows-sys",
|
|
53
|
+
]
|
|
54
|
+
|
|
55
|
+
[[package]]
|
|
56
|
+
name = "autocfg"
|
|
57
|
+
version = "1.5.1"
|
|
58
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
59
|
+
checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53"
|
|
60
|
+
|
|
61
|
+
[[package]]
|
|
62
|
+
name = "clap"
|
|
63
|
+
version = "4.6.7"
|
|
64
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
65
|
+
checksum = "aa8876b300ab35ba921adea3dfd70157a46249b33f95c9084ae5709785478946"
|
|
66
|
+
dependencies = [
|
|
67
|
+
"clap_builder",
|
|
68
|
+
"clap_derive",
|
|
69
|
+
]
|
|
70
|
+
|
|
71
|
+
[[package]]
|
|
72
|
+
name = "clap_builder"
|
|
73
|
+
version = "4.6.7"
|
|
74
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
75
|
+
checksum = "ec0797fb7aeb1406c84efac526901f7ec3ead2124f946b494e72879d4b54704d"
|
|
76
|
+
dependencies = [
|
|
77
|
+
"anstream",
|
|
78
|
+
"anstyle",
|
|
79
|
+
"clap_lex",
|
|
80
|
+
"strsim",
|
|
81
|
+
]
|
|
82
|
+
|
|
83
|
+
[[package]]
|
|
84
|
+
name = "clap_derive"
|
|
85
|
+
version = "4.6.7"
|
|
86
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
87
|
+
checksum = "f9c751b79415d4e559e3d1fcf128e09e720eb673a06d26cf6f392d37d75b66e0"
|
|
88
|
+
dependencies = [
|
|
89
|
+
"heck",
|
|
90
|
+
"proc-macro2",
|
|
91
|
+
"quote",
|
|
92
|
+
"syn 3.0.10",
|
|
93
|
+
]
|
|
94
|
+
|
|
95
|
+
[[package]]
|
|
96
|
+
name = "clap_lex"
|
|
97
|
+
version = "1.1.1"
|
|
98
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
99
|
+
checksum = "1c133bc6a41be0d194c306b5506d15e6feeea7b1d6604bd3f8310dfb2ca96486"
|
|
100
|
+
|
|
101
|
+
[[package]]
|
|
102
|
+
name = "colorchoice"
|
|
103
|
+
version = "1.0.5"
|
|
104
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
105
|
+
checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570"
|
|
106
|
+
|
|
107
|
+
[[package]]
|
|
108
|
+
name = "heck"
|
|
109
|
+
version = "0.5.0"
|
|
110
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
111
|
+
checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
|
|
112
|
+
|
|
113
|
+
[[package]]
|
|
114
|
+
name = "hmleq"
|
|
115
|
+
version = "0.2.0"
|
|
116
|
+
dependencies = [
|
|
117
|
+
"serde",
|
|
118
|
+
"serde_json",
|
|
119
|
+
]
|
|
120
|
+
|
|
121
|
+
[[package]]
|
|
122
|
+
name = "hmleq-cli"
|
|
123
|
+
version = "0.2.0"
|
|
124
|
+
dependencies = [
|
|
125
|
+
"clap",
|
|
126
|
+
"hmleq",
|
|
127
|
+
"serde_json",
|
|
128
|
+
]
|
|
129
|
+
|
|
130
|
+
[[package]]
|
|
131
|
+
name = "hmleqx-python"
|
|
132
|
+
version = "0.2.0"
|
|
133
|
+
dependencies = [
|
|
134
|
+
"hmleq",
|
|
135
|
+
"pyo3",
|
|
136
|
+
"serde_json",
|
|
137
|
+
]
|
|
138
|
+
|
|
139
|
+
[[package]]
|
|
140
|
+
name = "indoc"
|
|
141
|
+
version = "2.0.8"
|
|
142
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
143
|
+
checksum = "a37b2691796cffeb8a8cd305ac66e65841559f147f4e63231d0eafa4db5384d1"
|
|
144
|
+
dependencies = [
|
|
145
|
+
"rustversion",
|
|
146
|
+
]
|
|
147
|
+
|
|
148
|
+
[[package]]
|
|
149
|
+
name = "is_terminal_polyfill"
|
|
150
|
+
version = "1.70.2"
|
|
151
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
152
|
+
checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695"
|
|
153
|
+
|
|
154
|
+
[[package]]
|
|
155
|
+
name = "itoa"
|
|
156
|
+
version = "1.0.19"
|
|
157
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
158
|
+
checksum = "3bd1574e617a9a6c1f8f8181bd7e841e1f20e4277607ef28945765188d6284d4"
|
|
159
|
+
|
|
160
|
+
[[package]]
|
|
161
|
+
name = "libc"
|
|
162
|
+
version = "0.2.191"
|
|
163
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
164
|
+
checksum = "65cd87c9a6d60536580b316ad985726104730a5151c99845f2490428ef91240a"
|
|
165
|
+
|
|
166
|
+
[[package]]
|
|
167
|
+
name = "memchr"
|
|
168
|
+
version = "2.8.3"
|
|
169
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
170
|
+
checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98"
|
|
171
|
+
|
|
172
|
+
[[package]]
|
|
173
|
+
name = "memoffset"
|
|
174
|
+
version = "0.9.1"
|
|
175
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
176
|
+
checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a"
|
|
177
|
+
dependencies = [
|
|
178
|
+
"autocfg",
|
|
179
|
+
]
|
|
180
|
+
|
|
181
|
+
[[package]]
|
|
182
|
+
name = "once_cell"
|
|
183
|
+
version = "1.21.4"
|
|
184
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
185
|
+
checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50"
|
|
186
|
+
|
|
187
|
+
[[package]]
|
|
188
|
+
name = "once_cell_polyfill"
|
|
189
|
+
version = "1.70.2"
|
|
190
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
191
|
+
checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe"
|
|
192
|
+
|
|
193
|
+
[[package]]
|
|
194
|
+
name = "portable-atomic"
|
|
195
|
+
version = "1.15.0"
|
|
196
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
197
|
+
checksum = "05c8b63e8d9609db387f0324918f81d68fe27748f084ef092fb35954d0539a85"
|
|
198
|
+
|
|
199
|
+
[[package]]
|
|
200
|
+
name = "proc-macro2"
|
|
201
|
+
version = "1.0.107"
|
|
202
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
203
|
+
checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9"
|
|
204
|
+
dependencies = [
|
|
205
|
+
"unicode-ident",
|
|
206
|
+
]
|
|
207
|
+
|
|
208
|
+
[[package]]
|
|
209
|
+
name = "pyo3"
|
|
210
|
+
version = "0.27.2"
|
|
211
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
212
|
+
checksum = "ab53c047fcd1a1d2a8820fe84f05d6be69e9526be40cb03b73f86b6b03e6d87d"
|
|
213
|
+
dependencies = [
|
|
214
|
+
"indoc",
|
|
215
|
+
"libc",
|
|
216
|
+
"memoffset",
|
|
217
|
+
"once_cell",
|
|
218
|
+
"portable-atomic",
|
|
219
|
+
"pyo3-build-config",
|
|
220
|
+
"pyo3-ffi",
|
|
221
|
+
"pyo3-macros",
|
|
222
|
+
"unindent",
|
|
223
|
+
]
|
|
224
|
+
|
|
225
|
+
[[package]]
|
|
226
|
+
name = "pyo3-build-config"
|
|
227
|
+
version = "0.27.2"
|
|
228
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
229
|
+
checksum = "b455933107de8642b4487ed26d912c2d899dec6114884214a0b3bb3be9261ea6"
|
|
230
|
+
dependencies = [
|
|
231
|
+
"target-lexicon",
|
|
232
|
+
]
|
|
233
|
+
|
|
234
|
+
[[package]]
|
|
235
|
+
name = "pyo3-ffi"
|
|
236
|
+
version = "0.27.2"
|
|
237
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
238
|
+
checksum = "1c85c9cbfaddf651b1221594209aed57e9e5cff63c4d11d1feead529b872a089"
|
|
239
|
+
dependencies = [
|
|
240
|
+
"libc",
|
|
241
|
+
"pyo3-build-config",
|
|
242
|
+
]
|
|
243
|
+
|
|
244
|
+
[[package]]
|
|
245
|
+
name = "pyo3-macros"
|
|
246
|
+
version = "0.27.2"
|
|
247
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
248
|
+
checksum = "0a5b10c9bf9888125d917fb4d2ca2d25c8df94c7ab5a52e13313a07e050a3b02"
|
|
249
|
+
dependencies = [
|
|
250
|
+
"proc-macro2",
|
|
251
|
+
"pyo3-macros-backend",
|
|
252
|
+
"quote",
|
|
253
|
+
"syn 2.0.119",
|
|
254
|
+
]
|
|
255
|
+
|
|
256
|
+
[[package]]
|
|
257
|
+
name = "pyo3-macros-backend"
|
|
258
|
+
version = "0.27.2"
|
|
259
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
260
|
+
checksum = "03b51720d314836e53327f5871d4c0cfb4fb37cc2c4a11cc71907a86342c40f9"
|
|
261
|
+
dependencies = [
|
|
262
|
+
"heck",
|
|
263
|
+
"proc-macro2",
|
|
264
|
+
"pyo3-build-config",
|
|
265
|
+
"quote",
|
|
266
|
+
"syn 2.0.119",
|
|
267
|
+
]
|
|
268
|
+
|
|
269
|
+
[[package]]
|
|
270
|
+
name = "quote"
|
|
271
|
+
version = "1.0.47"
|
|
272
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
273
|
+
checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001"
|
|
274
|
+
dependencies = [
|
|
275
|
+
"proc-macro2",
|
|
276
|
+
]
|
|
277
|
+
|
|
278
|
+
[[package]]
|
|
279
|
+
name = "rustversion"
|
|
280
|
+
version = "1.0.23"
|
|
281
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
282
|
+
checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f"
|
|
283
|
+
|
|
284
|
+
[[package]]
|
|
285
|
+
name = "serde"
|
|
286
|
+
version = "1.0.229"
|
|
287
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
288
|
+
checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba"
|
|
289
|
+
dependencies = [
|
|
290
|
+
"serde_core",
|
|
291
|
+
"serde_derive",
|
|
292
|
+
]
|
|
293
|
+
|
|
294
|
+
[[package]]
|
|
295
|
+
name = "serde_core"
|
|
296
|
+
version = "1.0.229"
|
|
297
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
298
|
+
checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48"
|
|
299
|
+
dependencies = [
|
|
300
|
+
"serde_derive",
|
|
301
|
+
]
|
|
302
|
+
|
|
303
|
+
[[package]]
|
|
304
|
+
name = "serde_derive"
|
|
305
|
+
version = "1.0.229"
|
|
306
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
307
|
+
checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348"
|
|
308
|
+
dependencies = [
|
|
309
|
+
"proc-macro2",
|
|
310
|
+
"quote",
|
|
311
|
+
"syn 3.0.10",
|
|
312
|
+
]
|
|
313
|
+
|
|
314
|
+
[[package]]
|
|
315
|
+
name = "serde_json"
|
|
316
|
+
version = "1.0.154"
|
|
317
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
318
|
+
checksum = "e7e9cc8b1b85264074fbcc02a88680c4096b1e47df8f739dceb03bf482f04bd6"
|
|
319
|
+
dependencies = [
|
|
320
|
+
"itoa",
|
|
321
|
+
"memchr",
|
|
322
|
+
"serde",
|
|
323
|
+
"serde_core",
|
|
324
|
+
"zmij",
|
|
325
|
+
]
|
|
326
|
+
|
|
327
|
+
[[package]]
|
|
328
|
+
name = "strsim"
|
|
329
|
+
version = "0.11.1"
|
|
330
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
331
|
+
checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
|
|
332
|
+
|
|
333
|
+
[[package]]
|
|
334
|
+
name = "syn"
|
|
335
|
+
version = "2.0.119"
|
|
336
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
337
|
+
checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297"
|
|
338
|
+
dependencies = [
|
|
339
|
+
"proc-macro2",
|
|
340
|
+
"quote",
|
|
341
|
+
"unicode-ident",
|
|
342
|
+
]
|
|
343
|
+
|
|
344
|
+
[[package]]
|
|
345
|
+
name = "syn"
|
|
346
|
+
version = "3.0.10"
|
|
347
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
348
|
+
checksum = "4ae9ccbea3a7b0b09443036490c8f34a8b1b760fd345e5c0dae0aac718faea79"
|
|
349
|
+
dependencies = [
|
|
350
|
+
"proc-macro2",
|
|
351
|
+
"quote",
|
|
352
|
+
"unicode-ident",
|
|
353
|
+
]
|
|
354
|
+
|
|
355
|
+
[[package]]
|
|
356
|
+
name = "target-lexicon"
|
|
357
|
+
version = "0.13.5"
|
|
358
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
359
|
+
checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca"
|
|
360
|
+
|
|
361
|
+
[[package]]
|
|
362
|
+
name = "unicode-ident"
|
|
363
|
+
version = "1.0.27"
|
|
364
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
365
|
+
checksum = "a2c754d6c33795a1c324727428e5a7dedb5b06195f9890bdbcba760d3e246563"
|
|
366
|
+
|
|
367
|
+
[[package]]
|
|
368
|
+
name = "unindent"
|
|
369
|
+
version = "0.2.4"
|
|
370
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
371
|
+
checksum = "7264e107f553ccae879d21fbea1d6724ac785e8c3bfc762137959b5802826ef3"
|
|
372
|
+
|
|
373
|
+
[[package]]
|
|
374
|
+
name = "utf8parse"
|
|
375
|
+
version = "0.2.2"
|
|
376
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
377
|
+
checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
|
|
378
|
+
|
|
379
|
+
[[package]]
|
|
380
|
+
name = "windows-link"
|
|
381
|
+
version = "0.2.1"
|
|
382
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
383
|
+
checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5"
|
|
384
|
+
|
|
385
|
+
[[package]]
|
|
386
|
+
name = "windows-sys"
|
|
387
|
+
version = "0.61.2"
|
|
388
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
389
|
+
checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc"
|
|
390
|
+
dependencies = [
|
|
391
|
+
"windows-link",
|
|
392
|
+
]
|
|
393
|
+
|
|
394
|
+
[[package]]
|
|
395
|
+
name = "zmij"
|
|
396
|
+
version = "1.0.23"
|
|
397
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
398
|
+
checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b"
|
hmleqx-0.2.0/Cargo.toml
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
[package]
|
|
2
|
+
name = "hmleq"
|
|
3
|
+
version = "0.2.0"
|
|
4
|
+
edition = "2021"
|
|
5
|
+
description = "Parser for the Hancom HWP(한글) equation script language — serde-serializable AST, optional LaTeX emitter"
|
|
6
|
+
license = "MIT"
|
|
7
|
+
repository = "https://github.com/alphaiv-project/hmleq"
|
|
8
|
+
keywords = ["hwp", "hml", "equation", "latex", "parser"]
|
|
9
|
+
categories = ["parser-implementations"]
|
|
10
|
+
|
|
11
|
+
[workspace]
|
|
12
|
+
members = ["bindings/python"]
|
|
13
|
+
|
|
14
|
+
[features]
|
|
15
|
+
default = ["latex"]
|
|
16
|
+
# LaTeX emitter (`latex` module, `to_latex`/`eq_to_latex`).
|
|
17
|
+
latex = []
|
|
18
|
+
# serde Serialize/Deserialize on the AST (symbols round-trip by canonical name).
|
|
19
|
+
serde = ["dep:serde"]
|
|
20
|
+
|
|
21
|
+
[dependencies]
|
|
22
|
+
serde = { version = "1", features = ["derive"], optional = true }
|
|
23
|
+
|
|
24
|
+
[dev-dependencies]
|
|
25
|
+
serde_json = "1"
|