hangulang์ HWP 5.0 ๋ฐ HWPX ๋ฌธ์(ํ์ปด์คํผ์ค / ํ๊ธ)๋ฅผ ์ํ
Rust ๊ธฐ๋ฐ semantic extraction toolkit์
๋๋ค.
ํ์ฌ primary exporter๋ DocLang v0.6์ ๋๋ค. DocLang์ LF AI & Data Foundation์ด ๋ง๋ AI ๋ค์ดํฐ๋ธ ยท LLM ํ ํฌ๋์ด์ ์นํ์ XML ๋ฌธ์ ํฌ๋งท์ ๋๋ค.
hangulang์ rhwp ํ์ ์ฝ์ด ์์์
๋ฌธ์์ ์๋ฏธ ๊ตฌ์กฐ(์ ๋ชฉ, ๋ชฉ๋ก, ํ, ์ธ๋ผ์ธ ์์, ์์, ๊ฐ์ฃผ, ๋จธ๋ฆฌ๋ง/๊ผฌ๋ฆฌ๋ง),
์ด๋ฏธ์ง ๋ฆฌ์์ค, ์์ค ๋ณด๊ณ , ๊ทธ๋ฆฌ๊ณ โ ์ ํ์ ์ผ๋ก โ ๋ ์ด์์ ์ขํ(bounding box)๋ฅผ
์์ ์ ์ธ ๋ด๋ถ IR๋ก ๋ฎ์ถฅ๋๋ค. ํ์ฌ ์ด IR์์ DocLang XML, semantic payload,
Markdown, resource asset/URI ์ฐธ์กฐ๋ฅผ ์ง์ ์์ฑํฉ๋๋ค.
์ํ: v0.1 โ ํ๋ฐํ ๊ฐ๋ฐ ์ค. ํ์ฌ DocLang exporter ์ถ๋ ฅ์ ๊ณต์ DocLang ๋ ํผ๋ฐ์ค ๊ฒ์ฆ๊ธฐ(
doclang validate)๋ก ๊ฒ์ฆ๋ฉ๋๋ค. JSON/Markdown/resource exporter์ rhwp ๊ธฐ๋ฐ bbox join์ unit/golden ํ ์คํธ๋ก ๊ฒ์ฆํฉ๋๋ค. ํ์ฌ ๋งคํ ๋ฒ์๋ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ์ฐธ๊ณ ํ์ธ์.
HWP/HWPX๋ ํ๊ตญ ๊ณต๊ณต๊ธฐ๊ด, ๋ฒ๋ฌด, ๊ต์ก, ๊ธฐ์ ๋ฌธ์ ์ํฌํ๋ก์์ ์ฌ์ ํ ์ค์ํ์ง๋ง, ๊ตฌ์กฐํ๋ extraction ๋๊ตฌ ์ํ๊ณ๋ PDF/DOCX์ ๋นํด ์์ต๋๋ค. ๊ธฐ์กด HWP ์ถ์ถ๊ธฐ๋ ๋๊ฐ plain text ๋๋ Markdown์ ํ๊น์ผ๋ก ํ๋ฉฐ, ๋ณํฉ ์ , ์ ๋ชฉ ์๊ณ, ์์, ๊ฐ์ฃผ, ์ด๋ฏธ์ง, ๋ ์ด์์ provenance๋ฅผ ์๊ธฐ ์ฝ์ต๋๋ค.
hangulang์ ์ด ๊ณต๋ฐฑ์ ๋ค์ ์ญํ ๋ก ์ฑ์๋๋ค:
- ๊ฒ์ฆ๋ ํ์๋ฅผ ์ฌ์ฌ์ฉํฉ๋๋ค. ๋ถ๋ถ์ ์ธ ์์ฒด ์ฌ๊ตฌํ์ด ์๋๋ผ
rhwp(ํ ์คํธ 1,100๊ฐ ์ด์, HWP 5.0 + HWPX ์์ ์ง์) ์์ ๊ตฌ์ถํ์ต๋๋ค. - ํ
์คํธ๊ฐ ์๋๋ผ ๊ตฌ์กฐ๋ฅผ ๋ณด์กดํฉ๋๋ค. ํ์ฌ DocLang exporter์์๋ ๋ณํฉ/์ค์ฒฉ ํ๋ฅผ
OTSL ํ ํฐ์ผ๋ก, ๊ฐ์ ์์ค์ ์ค์
<heading>์ผ๋ก, ์์์ LaTeX๋ก ๋ณํ๋ฉ๋๋ค. rhwpํ์ ์ ์ง์ ๋ ธ์ถํ์ง ์์ต๋๋ค. ์ ์์ค parser model์ ์๋น์์๊ฒ ๋๊ธฐ์ง ์๊ณ , ๋ณํ๊ธฐ/ํ์ดํ๋ผ์ธ์์ ์ฐ๊ธฐ ์ฌ์ด ์์ IR๊ณผ ์ถ๋ ฅ ๊ณ์ฝ์ ์ ๊ณตํฉ๋๋ค.- ๋ฒ๋ฆฐ ๊ฒ์ ๋ณด๊ณ ํฉ๋๋ค. ๋ชจ๋ ๋ณํ์
LossReport๋ฅผ ๋ฐํํ๋ฏ๋ก, ํธ์ถ์๋ ์ด๋ค ์ ๋ณด(๊ธ๊ผด, ์์, ๊ฐ์ฃผ ๋ฑ)๊ฐ ์์ค๋๋์ง ์ ํํ ์ ์ ์์ต๋๋ค โ ์กฐ์ฉํ ๋ฐ์ดํฐ ์์ค์ด ์์ต๋๋ค. - ๊ฒ์ฆ์ ํต๊ณผํฉ๋๋ค. ํ
์คํธ ์ฝํผ์ค ์ ์ฒด๊ฐ ๊ณต์
doclang validate์ XSD + Schematron ๊ฒ์ฌ๋ฅผ 100% ํต๊ณผํฉ๋๋ค.
hangulang์ rhwp์ ๋์ฒด์ ๊ฐ ์๋๋ผ, rhwp ์์ ์ฌ๋ผ๊ฐ๋ ์ ํํ ๋ ์ด์ด์
๋๋ค.
| ๋ ์ด์ด | ์ฑ ์ |
|---|---|
rhwp |
HWP/HWPX ํ์ผ ํฌ๋งท ํ์ฑ, ๋ด๋ถ ๋ฌธ์ ๋ชจ๋ธ, ๋ ๋ ํธ๋ฆฌ ์ ๊ณต |
hangulang Rust core |
rhwp ๋ชจ๋ธ์ semantic IR๋ก ๋ฎ์ถ๊ณ , ์์/ํ/์ด๋ฏธ์ง/๊ฐ์ฃผ/์ขํ/loss๋ฅผ ์ ๊ทํ |
| Exporters | DocLang XML, semantic JSON payload, Markdown, asset references |
hangulang-python |
Python wheel, Pythonic API, typed error, optional integrations(๊ณํ) |
| Integrations | Docling, LangChain, LlamaIndex ๋ฑ ์ธ๋ถ adapter(๊ณํ) |
rhwp-python์ด ์ ์์ค Python binding์ด๋ผ๋ฉด, hangulang-python์ ๋ฐ๋ก ์ฌ์ฉํ ์
์๋ ๋ฌธ์ ๋ณํ API๋ฅผ ์งํฅํฉ๋๋ค. ์ฆ rhwp์ raw model/render tree๋ฅผ Python์
๊ทธ๋๋ก ๋
ธ์ถํ๊ธฐ๋ณด๋ค๋, ์์ ๋ semantic payload์ export ๊ฒฐ๊ณผ๋ฅผ ์ ๊ณตํฉ๋๋ค.
์ต์ ์์ ๋ฒ์ Rust ํด์ฒด์ธ์ด ํ์ํฉ๋๋ค(edition 2021, 1.94 ๊ธฐ์ค ๊ฐ๋ฐ).
rhwp๋ crates.io์ ๊ฒ์๋์ด ์์ง ์์ผ๋ฏ๋ก, ์ฌํ์ฑ์ ์ํด ์ ํํ ์ปค๋ฐ์ผ๋ก ๊ณ ์ ํ
git ์์กด์ฑ์ผ๋ก ์ฌ์ฉํฉ๋๋ค:
[dependencies]
hangulang = { git = "https://github.com/myeolinmalchi/hangulang" }๋น๋ ์ฐธ๊ณ :
rhwp์ ๋ค์ดํฐ๋ธ ๋น๋๋ SVG/PDF ๋ ๋๋ง ์คํ(svg2pdf,usvg,pdf-writer๋ฑ)์ transitiveํ๊ฒ ์ปดํ์ผํฉ๋๋ค. ์ต์ด ๋น๋์ ์ฝ 35์ด๊ฐ ๊ฑธ๋ฆฝ๋๋ค. ์ด๋ ์๋ ค์ง upstream ๋น์ฉ์ ๋๋ค โ ๋ก๋๋งต ์ฐธ๊ณ .
use hangulang::{convert, ConvertOptions};
let data = std::fs::read("document.hwp")?;
let outcome = convert(&data, &ConvertOptions::default())?;
println!("{}", outcome.xml); // DocLang v0.6 XML
for entry in outcome.loss.iter() { // ํํํ ์ ์์๋ ์ ๋ณด
eprintln!("{:?} @ {}: {}", entry.kind, entry.location, entry.detail);
}Semantic payload์ Markdown์ DocLang XML์ ๊ฑฐ์น์ง ์๊ณ ๊ฐ์ IR์์ ์ง์ ์์ฑํฉ๋๋ค:
use hangulang::{convert_to_markdown, convert_to_payload, ConvertOptions};
let payload = convert_to_payload(&data, &ConvertOptions::default())?;
let markdown = convert_to_markdown(&data, &ConvertOptions::default())?;serde feature๋ฅผ ์ผ๋ฉด pretty JSON ๋ฌธ์์ด๋ ๋ฐ๋ก ๋ง๋ค ์ ์์ต๋๋ค:
let json = hangulang::convert_to_json(&data, &ConvertOptions::default())?;์ด๋ฏธ์ง๋ ๊ธฐ๋ณธ์ ์ผ๋ก self-contained data URI๋ก ๋ค์ด๊ฐ๋ฉฐ, ํ์ผ๋ก ๋ถ๋ฆฌํด์ผ ํ๋ ํ์ดํ๋ผ์ธ์์๋ ๋ฆฌ์์ค ์ ์ฑ ์ ๋ฐ๊ฟ ์ ์์ต๋๋ค:
use hangulang::{convert, ConvertOptions, ResourcePolicy};
let opts = ConvertOptions {
resource_policy: ResourcePolicy::asset_dir("assets"),
..Default::default()
};
let outcome = convert(&data, &opts)?;
for asset in outcome.assets {
std::fs::write(format!("assets/{}", asset.path), asset.data)?;
}| API | ์ถ๋ ฅ | ๋น๊ณ |
|---|---|---|
convert |
DocLang XML, assets, LossReport |
๊ธฐ์กด primary exporter |
extract_semantic |
SirDocument, LocationMap, LossReport |
exporter๋ฅผ ์ง์ ๋ง๋ค ๋ ์ฌ์ฉ |
convert_to_payload |
versioned SemanticPayload |
Python wrapper / integration์ฉ ์์ ๊ณ์ฝ |
convert_to_json |
pretty JSON ๋ฌธ์์ด | serde feature ํ์ |
convert_to_markdown |
Markdown, assets, LossReport |
DocLang XML์ ๊ฑฐ์น์ง ์๋ ์ง์ exporter |
cargo run --example convert_cli -- document.hwp --mode lean -o document.dclg.xmlusage: convert_cli <input.hwp|.hwpx> [--mode lean|preserve] [--location] [-o out.dclg.xml]
--mode lean ํ์ค DocLang ์์๋ง ์ถ๋ ฅํ๊ณ ์์ค์ ๋ณด๊ณ (๊ธฐ๋ณธ๊ฐ)
--mode preserve ํํ ๋ถ๊ฐํ HWP ์์ฑ์ ๋ค์์คํ์ด์ค <custom> ์์๋ก ๋ณด์กด
--location <location> bounding box(๋ ์ด์์ ์ขํ)๋ ํจ๊ป ์ถ๋ ฅ
-o <path> ์ถ๋ ฅ ํ์ผ (๊ธฐ๋ณธ๊ฐ: <์
๋ ฅํ์ผ๋ช
>.dclg.xml)
์์ค ๋ณด๊ณ ์์ฝ์ stderr๋ก ์ถ๋ ฅ๋๋ฉฐ, ์ค๋ฅ ์ ์ข ๋ฃ ์ฝ๋๋ 0์ด ์๋๋๋ค.
DocLang์ ์๋์ ์ผ๋ก ๋ฏธ๋๋ฉํฉ๋๋ค(์๋ฏธ + ์ขํ + ์ฝ๊ธฐ ์์; ๊ธ๊ผด/์์/์คํ์ผ ์์). HWP๋ ํจ์ฌ ๋ง์ ์ ๋ณด๋ฅผ ๋ด์ต๋๋ค. ๋ ๋ชจ๋๊ฐ ์ด ๊ฐ๊ทน์ ์ฒ๋ฆฌํฉ๋๋ค:
| ๋ชจ๋ | ์ถ๋ ฅ | ์ฌ์ฉ ์์ |
|---|---|---|
Lean (๊ธฐ๋ณธ๊ฐ) |
์์ ํ์ค DocLang. ํํ ๋ถ๊ฐ ์ ๋ณด โ LossReport์ ๊ธฐ๋ก ํ XML์์ ์ ์ธ. |
ํ ํฐ ํจ์จ์ด ์ค์ํ RAG / LLM ์ธ์ ์ค์ฒ. |
Preserve |
ํํ ๋ถ๊ฐํ HWP ์์ฑ์ <custom ns="hwp:โฆ">๋ก ๋ณด์กด. |
์ ๋ณด ์์ค์ด ์์ด์ผ ํ๋ ๋ผ์ด๋ํธ๋ฆฝ / ์์นด์ด๋น. |
use hangulang::{convert, ConvertOptions, Mode};
let opts = ConvertOptions { mode: Mode::Preserve, ..Default::default() };
let outcome = convert(&data, &opts)?;with_location์ ํ์ฑํํ๋ฉด, ๋ณํ๊ธฐ๋ rhwp::DocumentCore ๋ ๋ ํธ๋ฆฌ๋ก ๊ฐ
ํ์ด์ง๋ฅผ ๋ฐฐ์น(layout)ํ๊ณ , render node์ (section, paragraph, control)
provenance๋ฅผ Hangulang IR์ Prov์ joinํฉ๋๋ค. DocLang XML์๋
<location value="N" resolution="512"/> ๋ค ๊ฐ(x_min, y_min, x_max, y_max)๋ฅผ
๋ถ์ด๊ณ , semantic payload์๋ page, bbox, resolution, status๋ฅผ ๊ธฐ๋กํฉ๋๋ค.
์ขํ๋ page-relative 0โ512 ๊ทธ๋ฆฌ๋๋ก ์ ๊ทํ๋ฉ๋๋ค.
let opts = ConvertOptions { with_location: true, ..Default::default() };๋นํ์ฑํ ์(๊ธฐ๋ณธ๊ฐ) ์ถ๋ ฅ์ ์ขํ ์๋ ๋น๋์ byte-identical์ด๋ฉฐ, ํ์ด์ง ๋ ์ด์์ ํจ์ค๋ ์์ ํ ์๋ต๋ฉ๋๋ค.
ํ์ฌ bbox๊ฐ ๋ถ๋ ๋ฒ์:
| IR ๋ธ๋ก | rhwp render node | ์ฒ๋ฆฌ ๋ฐฉ์ |
|---|---|---|
| ๋ฌธ๋จ / ์ ๋ชฉ / ๋ชฉ๋ก | TextLine(section, para) |
๊ฐ์ paragraph์ line box๋ฅผ ์ฒซ ํ์ด์ง ์์์ union |
| ์ต์์ ํ | Table(section, para, control) |
control provenance๋ก join; 1x1 wrapper flattening ์ผ์ด์ค ํ์ฉ |
| ๋ณธ๋ฌธ ์ด๋ฏธ์ง | Image(section, para, control) |
์ /๋จธ๋ฆฌ๋ง/๊ผฌ๋ฆฌ๋ง ๋ด๋ถ ์ด๋ฏธ์ง๋ ์ ์ธ |
| ๋ณธ๋ฌธ ์์ | Equation(section, para, control) |
์ /๊ฐ์ฃผ ๋ด๋ถ ์์์ ์ ์ธ |
| ๋จธ๋ฆฌ๋ง / ๊ผฌ๋ฆฌ๋ง | Header / Footer group |
section์ header/footer control์ ์ฐ๊ฒฐ |
์ฌ๋ฌ ํ์ด์ง์ ๊ฑธ์น ๋ธ๋ก์ ์ฒซ ํ์ด์ง์ ๋ํ๋ segment๋ง bbox๋ก ์ฌ์ฉํฉ๋๋ค. Semantic
payload์์ bbox๊ฐ ์์ ๋๋ not_requested, no_provenance, unresolved,
not_applicable ์ค ํ๋๋ก ์ด์ ๋ฅผ ๊ตฌ๋ถํฉ๋๋ค.
| HWP ์์ | DocLang | ๋น๊ณ |
|---|---|---|
| ๋ฌธ๋จ | <text> |
|
| ๊ฐ์ ์ ๋ชฉ | <heading level="1โ6"> |
๊ธ๊ผด ํฌ๊ธฐ ์ถ์ธก์ด ์๋ ๊ฐ์ ์์ค ๊ธฐ์ค |
| ๋ชฉ๋ก(๋ฒํธ/๊ธ๋จธ๋ฆฌํ) | <list> / <ldiv> / <marker> |
์ค์ฒฉ ์ง์ |
| ์ธ๋ผ์ธ ์์ | <bold> <italic> <underline> <strikethrough> <superscript> <subscript> |
|
| ํ์ดํผ๋งํฌ | <href uri="โฆ"> |
์ต์ปค ๊ตฌ๊ฐ์ field_ranges๋ก ์๋ณ; ์น/mailto/๋ด๋ถ ์ฑ
๊ฐํผ |
| ํ | OTSL (<fcel> <ched> <lcel> <ucel> <xcel> โฆ) |
๋ณํฉ ยท ์ค์ฒฉ ์ |
| ์์ | <formula> (LaTeX) |
EqEdit โ LaTeX; ๋ณํ ๋๋ฝ ํ ํฐ์ ๋ณด๊ณ ๋จ |
| ์ด๋ฏธ์ง | <picture><src uri="โฆ"/> |
๊ธฐ๋ณธ๊ฐ์ ์ธ๋ผ์ธ base64; asset/URI ์ฐธ์กฐ ์ ์ฑ ์ง์ |
| ๊ฐ์ฃผ | <footnote> |
|
| ๋จธ๋ฆฌ๋ง / ๊ผฌ๋ฆฌ๋ง | <page_header> / <page_footer> |
|
| ์ชฝ ๋๋๊ธฐ | <page_break/> |
|
| ๋ค๋จ ์ฐ์์ฑ | <thread> |
|
| ๋ ์ด์์ ์ขํ (์ต์ ) | <location> / payload location |
rhwp render tree ๊ธฐ๋ฐ; ์ ๋ฒ์ ์ฐธ๊ณ |
- ์
๋ ฅ: ์ํธํ ๋ฌธ์(๊ฑฐ๋ถ), ๋ฐฐํฌ์ฉ ๋ฌธ์(
rhwp๋ ํ์ฑ ๊ฐ๋ฅํ๋ ์ ์ฑ ์ ๊ฑฐ๋ถ), HWP 3.x, ๋ ๊ฑฐ์ HWPML. - ์ถ๋ ฅ: ์ญ๋ณํ(DocLang โ HWP); ๋ ๋๋ง(SVG/PDF โ
rhwp์ ์์ญ). - ์ขํ: ๊ธ์์ ๋ด๋ถ ์ฝํ
์ธ , ๊ฐ์ฃผ/๋ฏธ์ฃผ ๋ณธ๋ฌธ, ์
๋ด๋ถ ๊ฐ์ฒด์๋
<location>์ ๋ถ์ฐฉํ์ง ์์ต๋๋ค(์ด๋ค์ ๋ํผ ํ์๋ ๋ถ์ฐฉ๋จ). Payload์์๋ ์ขํ๊ฐ ์๋ ์ด์ ๋ฅผnot_requested,no_provenance,unresolved,not_applicable์ํ๋ก ๊ตฌ๋ถํฉ๋๋ค.
Lean ๋ชจ๋์์ DocLang์ด ํํํ ์ ์๋ ์ ๋ณด๋ ๋ชจ๋ LossEntry(kind,
location, detail)๋ก ๊ธฐ๋ก๋ฉ๋๋ค. ์ข
๋ฅ์๋ FontInfo, CharColor,
NamedStyle, SectionSettings, FloatingObject, TextBox, TrackChanges,
FormulaFallback, Caption, Other๊ฐ ์์ต๋๋ค. ์ด๋ค ๋ฌธ์์ ๋ณด๊ณ ๊ฐ ๋น์ด ์์ง
์๋ค๋ ๊ฒ์, ์๋ฅผ ๋ค์ด ์ธ์ ์ค์ฒ ํ์ดํ๋ผ์ธ์ด ํด๋น ํ์ผ์ ์กฐ์ฉํ ๋๋ฝ์ํค๋ ๋์
๋ ํ๋ถํ(์: VLM) ๊ฒฝ๋ก๋ก ๋ถ๊ธฐ์ํฌ ์ ์๋ค๋ ์๋ฏธ์
๋๋ค.
DocLang ๋์ ์์๊ฐ ์๋ ์ผ๋ถ ์ปจํธ๋กค(๋ง๋ง(Ruby), ๊ธ์๊ฒน์นจ(CharOverlap))์ ํ
์คํธ๋ฅผ
๋ฒ๋ฆฌ์ง ์๊ณ ํ๋ฌธ ๋ธ๋ก์ผ๋ก ๊ตฌ์ ํ๋ฉฐ, ์์ ์๋ฏธ๋ LossEntry๋ก ๊ธฐ๋กํฉ๋๋ค.
ํ์ดํผ๋งํฌ์ ์ธํ
์คํธ ํ๋ฆ ๊ฐ์ฒด ์์น๋ v2์์ ๊ตฌํ๋์์ต๋๋ค. ๋จ์ ๋ณํ ํ๊ณ๋ก๋
๋ฏธ์ฃผ ๋ณ๋ ํํ, ์ขํ ๋ฏธ๋ถ์ฐฉ ์์ญ(๊ธ์์/๊ฐ์ฃผ/์
๋ด๋ถ) ๋ฑ์ด ์์ต๋๋ค.
HWP 5.0 (.hwp) โโ
โโโบ rhwp::parse_document โโบ Hangulang Semantic IR โโฌโโบ DocLang XML
HWPX (.hwpx) โโโ (parser_adapter) (rhwp ๋น์์กด) โโโบ semantic JSON payload
โโโบ Markdown
โโโบ resource assets / URIs
โโโบ Python API payload (planned)
โฒ
eqedit ํจ์ค โโโโโโโโโโโโโ (EqEdit script โ LaTeX)
geometry ํจ์ค โโโโโโโโโโโ (๋ ๋ ํธ๋ฆฌ โ location/bbox, ์ต์
)
Pandoc์ reader โ IR โ writer ํจํด์ ๋ณธ๋ฌ 3๋จ๊ณ ํ์ดํ๋ผ์ธ์
๋๋ค. Semantic IR์
rhwp ๋น์์กด์ด๋ฉฐ, parser_adapter๋ง rhwp ํ์
์ ๋ค๋ฃน๋๋ค โ upstream ๋ณ๊ฒฝ์ผ๋ก
๋ถํฐ ๋ณํ๊ธฐ๋ฅผ ๊ฒฉ๋ฆฌํฉ๋๋ค.
| ๋ชจ๋ | ์ญํ |
|---|---|
parser_adapter |
rhwp Document โ Semantic IR (์ ์ผํ rhwp ์์กด ๊ณ์ธต) |
ir |
rhwp ๋น์์กด ๋ฌธ์ ๋ชจ๋ธ(๋ธ๋ก, ์ธ๋ผ์ธ, ํ, ์์) |
eqedit |
HWP EqEdit ์์ ์คํฌ๋ฆฝํธ โ LaTeX |
writer |
Semantic IR โ DocLang v0.6 XML (OTSL ํ, ๋ชจ๋, <location>) |
payload |
Semantic IR โ stable payload / JSON schema |
markdown |
Semantic IR โ Markdown |
resources |
์ด๋ฏธ์ง data URI, asset, URI prefix ์ ์ฑ |
loss |
LossReport ์์ง |
cargo test # ๋จ์ + ๊ณจ๋ + ๋๋ฑ์ฑ ํ
์คํธ
cargo test --features serde # JSON payload ์ง๋ ฌํ ๊ฒฝ๋ก ํฌํจ
cargo test --features validator-integration # ๊ณต์ doclang ๊ฒ์ฆ๊ธฐ๊น์ง ์คํ
cargo clippy --all-targets # ๋ฆฐํธ (๊ฒฝ๊ณ 0 ๊ธฐ๋)๋ฆด๋ฆฌ์ฆ ์ ์ ๊ฒ๊ณผ crates.io publish blocker๋
docs/release.md์ ์ ๋ฆฌ๋์ด ์์ต๋๋ค.
validator-integration ํผ์ฒ๋ ๋ณํ๊ธฐ ์ถ๋ ฅ์ ๊ณต์ Python ๋ ํผ๋ฐ์ค ๊ฒ์ฆ๊ธฐ๋ก
ํต๊ณผ์ํต๋๋ค. ์ต์ด 1ํ ์ค์ :
python3 -m venv .venv
.venv/bin/pip install -r tests/requirements.txt # doclang==0.6.0venv๊ฐ ์์ผ๋ฉด ๊ฒ์ฆ๊ธฐ ํ ์คํธ๋ ์๋์ผ๋ก ๊ฑด๋๋๋๋ค.
๊ณจ๋ ํ์ผ ํ๊ท ํ
์คํธ๋ ์ค์ HWP/HWPX ๋ฌธ์๋ฅผ ๋์์ผ๋ก ์คํ๋ฉ๋๋ค. fixture์
์ถ์ฒ์ ๋ผ์ด์ ์ค๋
tests/fixtures/SOURCES.md์ ๋ฌธ์ํ๋์ด ์์ต๋๋ค.
์๋์ ์ธ ์ถ๋ ฅ ๋ณ๊ฒฝ ํ์๋ UPDATE_GOLDEN=1 cargo test --test golden์ผ๋ก ๊ณจ๋ ์
์ฌ์์ฑํ์ธ์.
hangulang-python: Rust core๋ฅผ ๊ฐ์ผ Python wheel๊ณผ Pythonic API.- Docling optional adapter ๋๋ plugin.
- LangChain/LlamaIndex document loader.
- EqEdit โ LaTeX ์ฌ๋ณผ ์ปค๋ฒ๋ฆฌ์ง ํ๋ (ํ์ฌ ๋๋ฝ ํ ํฐ์ ๋ณด๊ณ ๋์ง๋ง ์์ง ์์ ํ ๋ณํ๋์ง๋ ์์).
- CLI์ JSON/Markdown ์ถ๋ ฅ ์ต์ ๊ณผ asset directory ์ฐ๊ธฐ.
- ๊ธ์์ / ๊ฐ์ฃผ / ์ ๋ด๋ถ ์ฝํ ์ธ ์ ์ขํ ์ง์.
- SVG/PDF ๋น๋ ๋น์ฉ์ ์ ๊ฑฐํ๊ธฐ ์ํ
rhwpupstreamparser-onlyํผ์ฒ.
MIT. ์์ธํ ๋ด์ฉ์ LICENSE๋ฅผ ์ฐธ๊ณ ํ์ธ์.
๋ณธ ํ๋ก์ ํธ๋ ๋
๋ฆฝ์ ์ธ ์คํ์์ค ํ๋ก์ ํธ์
๋๋ค. HWP/HWPX๋ ํ๊ธ๊ณผ์ปดํจํฐ(Hancom
Inc.)์ ํฌ๋งท์ด๋ฉฐ, ๋ณธ ํ๋ก์ ํธ๋ ํ์ปด๊ณผ ์ ํด ๊ด๊ณ๊ฐ ์์ต๋๋ค. DocLang์ LF AI &
Data Foundation์ ํ๋ก์ ํธ์
๋๋ค. rhwp๋ ยฉ Edward Kim (MIT)์
๋๋ค.