Create MVP Pandoc->Rust compiler

finchie
Oct 26, 2023, 5:08 AM
2N3KOCP74PCK2ETO5PCWBDR5PA57DDNT2KR4JLBPZPQPA56SAR4QC

Dependencies

Change contents

  • edit in Cargo.lock at line 124
    [4.2635]
    [4.2635]
    [[package]]
    name = "either"
    version = "1.9.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07"
  • edit in Cargo.lock at line 169
    [5.3483]
    [4.3394]
    [[package]]
    name = "itertools"
    version = "0.8.2"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "f56a2d0bc861f9165be4eb3442afd3c236d8a98afd426f65d92324ae1091a484"
    dependencies = [
    "either",
    ]
  • edit in Cargo.lock at line 224
    [6.2363]
    [2.2217]
    "typst_rust_gen",
  • edit in Cargo.lock at line 236
    [4.4555]
    [6.2364]
    [[package]]
    name = "pandoc"
    version = "0.8.10"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "2eb8469d27ed9fd7925629076a3675fea964c3f44c49662bdf549a8b7ddf0820"
    dependencies = [
    "itertools",
    ]
    [[package]]
    name = "pandoc_ast"
    version = "0.8.5"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "56f639abb4745696d0f9c43da6818011da7ba7a4923bfe2d18d28dfdc5a595c9"
    dependencies = [
    "serde",
    "serde_derive",
    "serde_json",
    ]
  • edit in Cargo.lock at line 417
    [6.4337]
    [4.6185]
    name = "typst_rust_gen"
    version = "0.1.0"
    dependencies = [
    "pandoc",
    "pandoc_ast",
    ]
    [[package]]
  • edit in Cargo.toml at line 1
    [4.1280]
    [4.1281]
    [workspace]
    memebers = ["src", "crates/*"]
  • edit in Cargo.toml at line 20
    [2.2198]
    [2.2198]
    typst_rust_gen = { path = "crates/typst_rust_gen" }
  • file addition: crates (d--r------)
    [7.1]
  • file addition: typst_rust_gen (d--r------)
    [0.1132]
  • file addition: src (d--r------)
    [0.1160]
  • file addition: lib.rs (----------)
    [0.1177]
    use std::path::Path;
    use pandoc::{OutputFormat, PandocOutput};
    use pandoc_ast::{Block, Inline};
    pub fn transform_pandoc(path: &Path) -> String {
    let mut pandoc = pandoc::new();
    pandoc.add_input(path);
    pandoc.set_output_format(OutputFormat::Json, Vec::new());
    pandoc.set_output(pandoc::OutputKind::Pipe);
    let output = if let PandocOutput::ToBuffer(json) = pandoc.execute().unwrap() {
    json
    } else {
    panic!("Pandoc produced unexpected output format");
    };
    let ast = pandoc_ast::Pandoc::from_json(&output);
    dbg!(&ast);
    let blocks: String = ast
    .blocks
    .iter()
    .map(transform_block)
    .collect::<Vec<String>>()
    .join(", ");
    dbg!(&blocks);
    blocks
    }
    fn transform_block(block: &Block) -> String {
    match block {
    Block::Header(level, _attr, inlines) => {
    let transformed_inlines = transform_inlines(inlines);
    format!(r#"el::h{}("{}")"#, level, transformed_inlines)
    }
    Block::Para(inlines) => {
    let transformed_inlines = transform_inlines(inlines);
    format!(r#"el::p("{}")"#, transformed_inlines)
    }
    _ => todo!(),
    }
    }
    fn transform_inline(inline: &Inline) -> String {
    match inline {
    Inline::Str(text) => text.to_owned(),
    Inline::Space => String::from(" "),
    _ => todo!(),
    }
    }
    fn transform_inlines(inlines: &Vec<Inline>) -> String {
    let transformed: String = inlines.iter().map(transform_inline).collect();
    dbg!(&transformed);
    transformed
    }
  • file addition: examples (d--r------)
    [0.1160]
  • file addition: basic.rs (----------)
    [0.2807]
    use std::path::Path;
    use typst_rust_gen::transform_pandoc;
    fn main() {
    dbg!(transform_pandoc(Path::new("docs/test.typ")));
    }
  • file addition: Cargo.toml (----------)
    [0.1160]
    [package]
    name = "typst_rust_gen"
    version = "0.1.0"
    edition = "2021"
    [dependencies]
    pandoc = "0.8.10"
    pandoc_ast = "0.8.5"