| Crates.io | rustixml |
| lib.rs | rustixml |
| version | 0.3.1 |
| created_at | 2025-11-21 11:48:01.945928+00 |
| updated_at | 2025-12-08 20:20:15.103212+00 |
| description | Native iXML (Invisible XML) parser with left-recursion support - 76.9% spec conformance, works in Rust and WebAssembly |
| homepage | https://github.com/bigale/rustixml |
| repository | https://github.com/bigale/rustixml |
| max_upload_size | |
| id | 1943447 |
| size | 768,407 |
A pure Rust implementation of the Invisible XML (iXML) specification with WebAssembly support.
๐ Try it live in your browser!
- Standard Demo - Interactive parser with examples
- WASMZ Demo - Native wasm:// routing pattern
Turn any text into XML using simple grammar rules. Works natively in Rust and in the browser via WebAssembly.
unicode-general-category for native buildsAdd to your Cargo.toml:
[dependencies]
rustixml = "0.2"
Example usage:
use rustixml::{parse_ixml_grammar, NativeParser};
fn main() -> Result<(), String> {
// Define an iXML grammar
let grammar = r#"
greeting: "Hello, ", name, "!".
name: letter+.
letter: ["A"-"Z"; "a"-"z"].
"#;
// Parse the grammar
let ast = parse_ixml_grammar(grammar)?;
// Create a parser
let parser = NativeParser::new(ast);
// Parse some input
let xml = parser.parse("Hello, World!")?;
println!("{}", xml);
// Output: <greeting>Hello, <name>World</name>!</greeting>
Ok(())
}
<!DOCTYPE html>
<html>
<head>
<script type="module">
import init, { parse_ixml } from './pkg/rustixml.js';
async function run() {
await init();
const grammar = `
greeting: "Hello, ", name, "!".
name: letter+.
letter: ["A"-"Z"; "a"-"z"].
`;
const result = parse_ixml(grammar, "Hello, World!");
if (result.success) {
console.log('XML:', result.output);
} else {
console.error('Error:', result.error);
}
}
run();
</script>
</head>
<body>
<h1>iXML Parser Demo</h1>
</body>
</html>
Try it online:
Or run locally:
# Clone the repository
git clone https://github.com/bigale/rustixml.git
cd rustixml
# Build WASM
wasm-pack build --target web
# Serve the demo
python3 -m http.server 8080
# Open http://localhost:8080/docs/ in your browser
Three demo versions available:
docs/index.html - Standard demo (recommended for most users)docs/htmz-standalone.html - HTMZ pattern demo (form-driven, no backend)docs/wasmz.html - WASMZ pattern demo โญ (native speed with wasm:// routing!)See docs/HTMZ-README.md for comparison of all three versions.
WASMZ Pattern: The wasmz.html demo showcases true wasm:// routing where HTML forms directly call compiled Rust functions that return HTML templates. This is a reference implementation of the WASMZ pattern (WebAssembly + htmz) offering ~10x performance improvement over JavaScript. See docs/WASMZ-PATTERN.md for technical details.
Invisible XML (iXML) is a specification for describing text formats as grammars and automatically converting text that matches those grammars into XML. It's like regular expressions on steroids!
Example: Parse CSV into XML:
csv: row+.
row: field+separator, field, newline.
field: char*.
@separator: ",".
-char: ~[","; #0A].
-newline: #0A.
Input:
name,age,city
Alice,30,NYC
Bob,25,LA
Output:
<csv>
<row><field>name</field><field>age</field><field>city</field></row>
<row><field>Alice</field><field>30</field><field>NYC</field></row>
<row><field>Bob</field><field>25</field><field>LA</field></row>
</csv>
rustixml uses a native recursive descent parser that directly interprets iXML grammar ASTs. Unlike other implementations that use parser generators, this approach:
See docs/ARCHITECTURE.md for details.
Overall: 50/65 tests (76.9%) Correct tests: 47/49 tests (95.9%)
Major features supported:
See KNOWN_ISSUES.md for detailed status and roadmap.
cargo build --release
# Install wasm-pack if you haven't already
curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh
# Build for web
wasm-pack build --target web
# Build for Node.js
wasm-pack build --target nodejs
# Build for bundlers (webpack, rollup, etc.)
wasm-pack build --target bundler
# Run unit tests
cargo test
# Run conformance tests
cargo run --bin conformance_test
cargo publish
wasm-pack build --target web
cd pkg
npm publish
Contributions are welcome! Please see CONTRIBUTING.md for guidelines.
Areas where help is especially appreciated:
Licensed under either of:
at your option.
Made with โค๏ธ and ๐ฆ by Alex Everitt