
# @clevertree/md2ast

Markdown → JSON AST for CleverScript / Relay hosts (WASM, JNI, Rust).

## Architecture

```mermaid
graph TD
    subgraph "Input"
        MD[Markdown Source]
    end

    subgraph "Parser Core (Rust)"
        CM[pulldown-cmark]
        HTML[HTML Tag Filter]
        AST[AST Generator]
    end

    subgraph "Output"
        JSON[JSON AST]
    end

    MD --> CM
    CM --> HTML
    HTML --> AST
    AST --> JSON
```

This library parses Markdown (including GitHub Flavored Markdown) and converts it into a JSON-serializable Abstract Syntax Tree (AST) for CleverScript, Relay, React, or other JSX-like runtimes.

## Features

- **Fast**: Powered by Rust and `pulldown-cmark`.
- **Cross-Platform**: WASM for Web, JNI for Android.
- **HTML Support**: Supports nested HTML tags within Markdown.
- **Custom Tag Filtering**: Only renders HTML tags explicitly allowed in `allowed_tags`.
- **GFM Support**: Tables, task lists, and strikethrough enabled by default.

## Installation

### NPM (Web)

```bash
npm install @clevertree/md2ast
```

### Maven (Android)

Add to your `build.gradle`:

```gradle
dependencies {
    implementation 'com.clevertree:md2ast:1.0.0'
}
```

### Cargo (Rust)

```toml
[dependencies]
md2ast = "1.0.0"
```

## Usage

### Web (WASM)

```javascript
import init, { parse_markdown } from '@clevertree/md2ast';

async function run() {
    await init();
    const markdown = "# Hello\n<CustomBox title=\"Alert\">Content</CustomBox>";
    const options = {
        allowed_tags: ["CustomBox"]
    };
    const ast = parse_markdown(markdown, options);
    console.log(ast);
}
```

### Android (Kotlin)

```kotlin
val astJson = MarkdownParser.parse(markdown, allowedTags = listOf("CustomBox"))
```

## AST Structure

The output is a list of nodes:

```json
[
  {
    "type": "element",
    "tag": "h1",
    "props": {},
    "children": [
      { "type": "text", "content": "Hello" }
    ]
  }
]
```

## License

MIT OR Apache-2.0
