docparser-sdk 0.1.0

docparser 一体化入口:一次依赖拿到 core + PDF + Office 后端,输出统一 IR
Documentation
//! 门面 crate 的端到端冒烟:默认特性(pdf + office)注册后,纯文本路径仍可离线跑通。
//! 不触碰 PDFium / OCR 运行库,CI 无需 native 依赖。
//!
//! 全部用例走 markdown,因此整文件按 `md` feature 编译;裁剪组合的行为见 `features.rs`。
#![cfg(feature = "md")]

use docparser_sdk::{emit, parse, parse_json, parse_markdown, BlockKind};

fn write_tmp(name: &str, content: &str) -> std::path::PathBuf {
    let dir = std::env::temp_dir().join("docparser_sdk_facade_test");
    std::fs::create_dir_all(&dir).unwrap();
    let p = dir.join(name);
    std::fs::write(&p, content).unwrap();
    p
}

#[test]
fn parses_markdown_through_default_engine() {
    let p = write_tmp(
        "a.md",
        "# 标题\n\n- 甲\n- 乙\n\n| a | b |\n| --- | --- |\n| 1 | 2 |\n",
    );
    let doc = parse(p.to_str().unwrap()).unwrap();
    std::fs::remove_file(&p).ok();

    assert_eq!(doc.meta.file_type, "md");
    let kinds: Vec<BlockKind> = doc.pages[0].blocks.iter().map(|b| b.kind).collect();
    assert_eq!(
        kinds,
        vec![BlockKind::Heading, BlockKind::List, BlockKind::Table]
    );

    let md = emit::to_markdown(&doc);
    assert!(md.starts_with("# 标题"));
    assert!(md.contains("- 甲"));
    assert!(md.contains("| --- | --- |"));
}

#[test]
fn markdown_and_json_shortcuts_agree() {
    let p = write_tmp("b.md", "## 小节\n\n正文\n");
    let md = parse_markdown(p.to_str().unwrap()).unwrap();
    let json = parse_json(p.to_str().unwrap()).unwrap();
    std::fs::remove_file(&p).ok();

    assert!(md.contains("## 小节"));
    assert!(json.contains("\"heading\""));
    assert!(json.contains("\"level\":2"));
}

#[test]
fn missing_file_reports_corrupt_not_panic() {
    let err = parse("/definitely/not/here.md").unwrap_err();
    assert_eq!(err.code.as_str(), "corrupt");
}