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.
@@ -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/
@@ -0,0 +1,9 @@
1
+ /target
2
+ Cargo.lock
3
+ __pycache__/
4
+ *.py[cod]
5
+ .venv/
6
+ venv/
7
+ *.so
8
+ *.pyd
9
+ *.dll
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):`, ...).
@@ -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"
@@ -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"