Repository files navigation

htmltoadf Latest VersionRustc Version 1.58+htmltoadf

htmltoadf is an HTML to Atlassian Document Format (ADF) converter written in Rust.

The library can be used in several different ways:

  • As a command line binary (either directly on a compatible host or using Docker)
  • Included as a library within a Rust project
  • Called from a different language or environment (e.g. C, JavaScript, Ruby, PHP, .NET etc.) using FFI
  • Called as a Web Assembly (wasm) module


Demo

See demo of the tool running as a WASM library entirely in the client here: https://wouterken.github.io/htmltoadf/


CLI

Binaries

The htmltoadf tool includes an html2adf binary.

Usage

$ html2adf -h
htmltoadf 0.1.13
An HTML to Atlassian Document Format (ADF) converter
USAGE:
html2adf [OPTIONS] [INPATH]
ARGS:
<INPATH> The path to the file to read
OPTIONS:
-h, --help Print help information
-o, --outpath <OUTPATH>
-V, --version Print version information

Install Binary from Crates.io with cargo install

$ cargo install htmltoadf
installing htmltoadf v0.1.13 (/usr/src/html2adf)
Updating crates.io index
Downloading crates ...
Downloaded lock_api v0.4.6
--snip--
Compiling htmltoadf v0.1.13
Finished release [optimized] target(s) in 1m 42s
Installing ~/.cargo/bin/htmltoadf
Installed package `htmltoadf v0.1.13` (executable `html2adf`)

Download Binary file from Github

Pre-built binaries can be downloaded from here: https://github.com/wouterken/htmltoadf/releases/tag/0.1.13

Docker Image

Docker Repo:

https://hub.docker.com/r/wouterken/html2adf

Usage

$ echo"<h1>Hello world<p>Test</p></h1>"| docker run --rm -i wouterken/html2adf:0.1.13
{"version":1,"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"type":"text","text":"Hello world"},{"type":"text","text":"Test"}]}]}
$ echo"<h1>Hello world<p>Test</p></h1>"| docker run --rm -i wouterken/html2adf:0.1.13 | jq
{
"version": 1,
"type": "doc",
"content": [
{
"type": "heading",
"attrs": {
"level": 1
},
"content": [
{
"type": "text",
"text": "Hello world"
},
{
"type": "text",
"text": "Test"
}
]
}
]
}

Lib

Example Rust Code

Cargo.toml

[dependencies]
htmltoadf = "0.1.13"

Code

use htmltoadf::convert_html_str_to_adf_str;use serde_json::json;let converted = convert_html_str_to_adf_str("<h1>Hello World</h1>".to_string());let expected = json!({"version":1,"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"type":"text","text":"Hello World"}]}]}).to_string();assert_eq!(expected, converted);

WASM

Install package from npm

importinit,{convert}from"htmltoadf";init().then(()=>{alert(convert("<h1>Hello from WebAssembly</h1>"))});

FFI

First compile the code as a library, e.g.:

cargo build --lib --release

Then you can link to the library dynamic from any environment that supports a FFI. It is important to copy the dynamic library from the release directory, and provide a relative link to the library file from the FFI

E.g.

Ruby

require'ffi'moduleHTMLToADFextendFFI::Libraryffi_lib'libhtmltoadf'attach_function:convert,[:string],:stringendputsHTMLToADF.convert("<h1>Hello from Ruby</h1>")

Node/JavaScript

varffi=require('ffi-napi');varhtmltoadf=ffi.Library('libhtmltoadf',{'convert': ['string',['string']]});console.log(htmltoadf.convert("<h1>Hello from Node!</h1>"));

Python

fromcffiimportFFIffi=FFI()
lib=ffi.dlopen("libhtmltoadf")
ffi.cdef("char * convert(char *);")
print(ffi.string(lib.convert(b"<h1>Hello from Python!</h1>")))

Implemented features

This converter only implements a subset of possible mappings between HTML and ADF. The following features are implemented:

  • Headings
  • Images
  • Lists (ordered and unordered)
  • Tables
  • Text and Paragraphs
  • Code
  • Fuzz Tests
  • Support for named CSS colors
  • Smart image sizing
  • Inline Cards
  • Panels
  • Emoji
  • In built JSON Schema Validation

Release Process

  1. Increment the version number in Cargo.toml and README.md.
  2. Update the demo dependency in docs/index.html. Keep this step before the final VCS push. The demo page loads the npm package directly from unpkg, so pushing the page before the npm publish is live can break the demo.
  3. Run local validation and build release artifacts.
    • Requires: cargo-zigbuild, cargo-xwin, zig, wasm-pack, gh, npm, Docker, and the nightly toolchain.
    • Prefer rustup-managed tooling for wasm builds. If Homebrew Rust appears earlier in PATH, run PATH="$HOME/.cargo/bin:$PATH" wasm-pack ... so wasm-pack can see the installed wasm32-unknown-unknown target.
    • Preflight checks:
      • cargo owner --list htmltoadf
      • npm whoami --registry=https://registry.npmjs.org/
      • docker info
      • gh auth status
    • Run sh scripts/release_checklist.sh <version> for fmt, clippy, test, release artifacts, and an amd64 Docker smoke build.
  4. Build the wasm package.
    • PATH="$HOME/.cargo/bin:$PATH" wasm-pack build --release --target web --out-dir pkg
  5. Publish registry artifacts in this order.
    • Docker: docker buildx build --platform linux/amd64,linux/arm64 --build-arg VERSION=<version> -t wouterken/html2adf:<version> -t wouterken/html2adf:latest --push .
    • npm: npm publish ./pkg If npm publish is protected by 2FA, pass --otp=<code>.
    • crates.io: cargo publish
  6. Push to VCS after the registry publishes succeed.
    • Push the release commit.
    • Tag the release.
    • Create the GitHub release and upload the release artifacts from releases/<version>/.
    • GitHub release asset names should be target-prefixed, for example x86_64-unknown-linux-gnu_html2adf, to avoid collisions between files like libhtmltoadf.rlib.

For a scripted publish flow after version bumping, validation, and release artifact generation, use:

sh scripts/release_publish.sh <version> [npm-otp]

Testing

Run cargo test from the repository root.

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/wouterken/htmltoadf. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the Contributor Covenant code of conduct.

About

An HTML to Atlassian Document Format (ADF) converter, written in Rust

Resources

Stars

49 stars

Watchers

5 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

htmltoadf Latest VersionRustc Version 1.58+htmltoadf

htmltoadf is an HTML to Atlassian Document Format (ADF) converter written in Rust.

The library can be used in several different ways:

  • As a command line binary (either directly on a compatible host or using Docker)
  • Included as a library within a Rust project
  • Called from a different language or environment (e.g. C, JavaScript, Ruby, PHP, .NET etc.) using FFI
  • Called as a Web Assembly (wasm) module


Demo

See demo of the tool running as a WASM library entirely in the client here: https://wouterken.github.io/htmltoadf/


CLI

Binaries

The htmltoadf tool includes an html2adf binary.

Usage

$ html2adf -h
htmltoadf 0.1.13
An HTML to Atlassian Document Format (ADF) converter
USAGE:
html2adf [OPTIONS] [INPATH]
ARGS:
<INPATH> The path to the file to read
OPTIONS:
-h, --help Print help information
-o, --outpath <OUTPATH>
-V, --version Print version information

Install Binary from Crates.io with cargo install

$ cargo install htmltoadf
installing htmltoadf v0.1.13 (/usr/src/html2adf)
Updating crates.io index
Downloading crates ...
Downloaded lock_api v0.4.6
--snip--
Compiling htmltoadf v0.1.13
Finished release [optimized] target(s) in 1m 42s
Installing ~/.cargo/bin/htmltoadf
Installed package `htmltoadf v0.1.13` (executable `html2adf`)

Download Binary file from Github

Pre-built binaries can be downloaded from here: https://github.com/wouterken/htmltoadf/releases/tag/0.1.13

Docker Image

Docker Repo:

https://hub.docker.com/r/wouterken/html2adf

Usage

$ echo"<h1>Hello world<p>Test</p></h1>"| docker run --rm -i wouterken/html2adf:0.1.13
{"version":1,"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"type":"text","text":"Hello world"},{"type":"text","text":"Test"}]}]}
$ echo"<h1>Hello world<p>Test</p></h1>"| docker run --rm -i wouterken/html2adf:0.1.13 | jq
{
"version": 1,
"type": "doc",
"content": [
{
"type": "heading",
"attrs": {
"level": 1
},
"content": [
{
"type": "text",
"text": "Hello world"
},
{
"type": "text",
"text": "Test"
}
]
}
]
}

Lib

Example Rust Code

Cargo.toml

[dependencies]
htmltoadf = "0.1.13"

Code

use htmltoadf::convert_html_str_to_adf_str;use serde_json::json;let converted = convert_html_str_to_adf_str("<h1>Hello World</h1>".to_string());let expected = json!({"version":1,"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"type":"text","text":"Hello World"}]}]}).to_string();assert_eq!(expected, converted);

WASM

Install package from npm

importinit,{convert}from"htmltoadf";init().then(()=>{alert(convert("<h1>Hello from WebAssembly</h1>"))});

FFI

First compile the code as a library, e.g.:

cargo build --lib --release

Then you can link to the library dynamic from any environment that supports a FFI. It is important to copy the dynamic library from the release directory, and provide a relative link to the library file from the FFI

E.g.

Ruby

require'ffi'moduleHTMLToADFextendFFI::Libraryffi_lib'libhtmltoadf'attach_function:convert,[:string],:stringendputsHTMLToADF.convert("<h1>Hello from Ruby</h1>")

Node/JavaScript

varffi=require('ffi-napi');varhtmltoadf=ffi.Library('libhtmltoadf',{'convert': ['string',['string']]});console.log(htmltoadf.convert("<h1>Hello from Node!</h1>"));

Python

fromcffiimportFFIffi=FFI()
lib=ffi.dlopen("libhtmltoadf")
ffi.cdef("char * convert(char *);")
print(ffi.string(lib.convert(b"<h1>Hello from Python!</h1>")))

Implemented features

This converter only implements a subset of possible mappings between HTML and ADF. The following features are implemented:

  • Headings
  • Images
  • Lists (ordered and unordered)
  • Tables
  • Text and Paragraphs
  • Code
  • Fuzz Tests
  • Support for named CSS colors
  • Smart image sizing
  • Inline Cards
  • Panels
  • Emoji
  • In built JSON Schema Validation

Release Process

  1. Increment the version number in Cargo.toml and README.md.
  2. Update the demo dependency in docs/index.html. Keep this step before the final VCS push. The demo page loads the npm package directly from unpkg, so pushing the page before the npm publish is live can break the demo.
  3. Run local validation and build release artifacts.
    • Requires: cargo-zigbuild, cargo-xwin, zig, wasm-pack, gh, npm, Docker, and the nightly toolchain.
    • Prefer rustup-managed tooling for wasm builds. If Homebrew Rust appears earlier in PATH, run PATH="$HOME/.cargo/bin:$PATH" wasm-pack ... so wasm-pack can see the installed wasm32-unknown-unknown target.
    • Preflight checks:
      • cargo owner --list htmltoadf
      • npm whoami --registry=https://registry.npmjs.org/
      • docker info
      • gh auth status
    • Run sh scripts/release_checklist.sh <version> for fmt, clippy, test, release artifacts, and an amd64 Docker smoke build.
  4. Build the wasm package.
    • PATH="$HOME/.cargo/bin:$PATH" wasm-pack build --release --target web --out-dir pkg
  5. Publish registry artifacts in this order.
    • Docker: docker buildx build --platform linux/amd64,linux/arm64 --build-arg VERSION=<version> -t wouterken/html2adf:<version> -t wouterken/html2adf:latest --push .
    • npm: npm publish ./pkg If npm publish is protected by 2FA, pass --otp=<code>.
    • crates.io: cargo publish
  6. Push to VCS after the registry publishes succeed.
    • Push the release commit.
    • Tag the release.
    • Create the GitHub release and upload the release artifacts from releases/<version>/.
    • GitHub release asset names should be target-prefixed, for example x86_64-unknown-linux-gnu_html2adf, to avoid collisions between files like libhtmltoadf.rlib.

For a scripted publish flow after version bumping, validation, and release artifact generation, use:

sh scripts/release_publish.sh <version> [npm-otp]

Testing

Run cargo test from the repository root.

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/wouterken/htmltoadf. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the Contributor Covenant code of conduct.

About

An HTML to Atlassian Document Format (ADF) converter, written in Rust

Resources

Stars

49 stars

Watchers

5 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

htmltoadf Latest VersionRustc Version 1.58+htmltoadf

htmltoadf is an HTML to Atlassian Document Format (ADF) converter written in Rust.

The library can be used in several different ways:

  • As a command line binary (either directly on a compatible host or using Docker)
  • Included as a library within a Rust project
  • Called from a different language or environment (e.g. C, JavaScript, Ruby, PHP, .NET etc.) using FFI
  • Called as a Web Assembly (wasm) module


Demo

See demo of the tool running as a WASM library entirely in the client here: https://wouterken.github.io/htmltoadf/


CLI

Binaries

The htmltoadf tool includes an html2adf binary.

Usage

$ html2adf -h
htmltoadf 0.1.13
An HTML to Atlassian Document Format (ADF) converter
USAGE:
html2adf [OPTIONS] [INPATH]
ARGS:
<INPATH> The path to the file to read
OPTIONS:
-h, --help Print help information
-o, --outpath <OUTPATH>
-V, --version Print version information

Install Binary from Crates.io with cargo install

$ cargo install htmltoadf
installing htmltoadf v0.1.13 (/usr/src/html2adf)
Updating crates.io index
Downloading crates ...
Downloaded lock_api v0.4.6
--snip--
Compiling htmltoadf v0.1.13
Finished release [optimized] target(s) in 1m 42s
Installing ~/.cargo/bin/htmltoadf
Installed package `htmltoadf v0.1.13` (executable `html2adf`)

Download Binary file from Github

Pre-built binaries can be downloaded from here: https://github.com/wouterken/htmltoadf/releases/tag/0.1.13

Docker Image

Docker Repo:

https://hub.docker.com/r/wouterken/html2adf

Usage

$ echo"<h1>Hello world<p>Test</p></h1>"| docker run --rm -i wouterken/html2adf:0.1.13
{"version":1,"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"type":"text","text":"Hello world"},{"type":"text","text":"Test"}]}]}
$ echo"<h1>Hello world<p>Test</p></h1>"| docker run --rm -i wouterken/html2adf:0.1.13 | jq
{
"version": 1,
"type": "doc",
"content": [
{
"type": "heading",
"attrs": {
"level": 1
},
"content": [
{
"type": "text",
"text": "Hello world"
},
{
"type": "text",
"text": "Test"
}
]
}
]
}

Lib

Example Rust Code

Cargo.toml

[dependencies]
htmltoadf = "0.1.13"

Code

use htmltoadf::convert_html_str_to_adf_str;use serde_json::json;let converted = convert_html_str_to_adf_str("<h1>Hello World</h1>".to_string());let expected = json!({"version":1,"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"type":"text","text":"Hello World"}]}]}).to_string();assert_eq!(expected, converted);

WASM

Install package from npm

importinit,{convert}from"htmltoadf";init().then(()=>{alert(convert("<h1>Hello from WebAssembly</h1>"))});

FFI

First compile the code as a library, e.g.:

cargo build --lib --release

Then you can link to the library dynamic from any environment that supports a FFI. It is important to copy the dynamic library from the release directory, and provide a relative link to the library file from the FFI

E.g.

Ruby

require'ffi'moduleHTMLToADFextendFFI::Libraryffi_lib'libhtmltoadf'attach_function:convert,[:string],:stringendputsHTMLToADF.convert("<h1>Hello from Ruby</h1>")

Node/JavaScript

varffi=require('ffi-napi');varhtmltoadf=ffi.Library('libhtmltoadf',{'convert': ['string',['string']]});console.log(htmltoadf.convert("<h1>Hello from Node!</h1>"));

Python

fromcffiimportFFIffi=FFI()
lib=ffi.dlopen("libhtmltoadf")
ffi.cdef("char * convert(char *);")
print(ffi.string(lib.convert(b"<h1>Hello from Python!</h1>")))

Implemented features

This converter only implements a subset of possible mappings between HTML and ADF. The following features are implemented:

  • Headings
  • Images
  • Lists (ordered and unordered)
  • Tables
  • Text and Paragraphs
  • Code
  • Fuzz Tests
  • Support for named CSS colors
  • Smart image sizing
  • Inline Cards
  • Panels
  • Emoji
  • In built JSON Schema Validation

Release Process

  1. Increment the version number in Cargo.toml and README.md.
  2. Update the demo dependency in docs/index.html. Keep this step before the final VCS push. The demo page loads the npm package directly from unpkg, so pushing the page before the npm publish is live can break the demo.
  3. Run local validation and build release artifacts.
    • Requires: cargo-zigbuild, cargo-xwin, zig, wasm-pack, gh, npm, Docker, and the nightly toolchain.
    • Prefer rustup-managed tooling for wasm builds. If Homebrew Rust appears earlier in PATH, run PATH="$HOME/.cargo/bin:$PATH" wasm-pack ... so wasm-pack can see the installed wasm32-unknown-unknown target.
    • Preflight checks:
      • cargo owner --list htmltoadf
      • npm whoami --registry=https://registry.npmjs.org/
      • docker info
      • gh auth status
    • Run sh scripts/release_checklist.sh <version> for fmt, clippy, test, release artifacts, and an amd64 Docker smoke build.
  4. Build the wasm package.
    • PATH="$HOME/.cargo/bin:$PATH" wasm-pack build --release --target web --out-dir pkg
  5. Publish registry artifacts in this order.
    • Docker: docker buildx build --platform linux/amd64,linux/arm64 --build-arg VERSION=<version> -t wouterken/html2adf:<version> -t wouterken/html2adf:latest --push .
    • npm: npm publish ./pkg If npm publish is protected by 2FA, pass --otp=<code>.
    • crates.io: cargo publish
  6. Push to VCS after the registry publishes succeed.
    • Push the release commit.
    • Tag the release.
    • Create the GitHub release and upload the release artifacts from releases/<version>/.
    • GitHub release asset names should be target-prefixed, for example x86_64-unknown-linux-gnu_html2adf, to avoid collisions between files like libhtmltoadf.rlib.

For a scripted publish flow after version bumping, validation, and release artifact generation, use:

sh scripts/release_publish.sh <version> [npm-otp]

Testing

Run cargo test from the repository root.

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/wouterken/htmltoadf. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the Contributor Covenant code of conduct.

About

An HTML to Atlassian Document Format (ADF) converter, written in Rust

Resources

Stars

49 stars

Watchers

5 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

htmltoadf Latest VersionRustc Version 1.58+htmltoadf

htmltoadf is an HTML to Atlassian Document Format (ADF) converter written in Rust.

The library can be used in several different ways:

  • As a command line binary (either directly on a compatible host or using Docker)
  • Included as a library within a Rust project
  • Called from a different language or environment (e.g. C, JavaScript, Ruby, PHP, .NET etc.) using FFI
  • Called as a Web Assembly (wasm) module


Demo

See demo of the tool running as a WASM library entirely in the client here: https://wouterken.github.io/htmltoadf/


CLI

Binaries

The htmltoadf tool includes an html2adf binary.

Usage

$ html2adf -h
htmltoadf 0.1.13
An HTML to Atlassian Document Format (ADF) converter
USAGE:
html2adf [OPTIONS] [INPATH]
ARGS:
<INPATH> The path to the file to read
OPTIONS:
-h, --help Print help information
-o, --outpath <OUTPATH>
-V, --version Print version information

Install Binary from Crates.io with cargo install

$ cargo install htmltoadf
installing htmltoadf v0.1.13 (/usr/src/html2adf)
Updating crates.io index
Downloading crates ...
Downloaded lock_api v0.4.6
--snip--
Compiling htmltoadf v0.1.13
Finished release [optimized] target(s) in 1m 42s
Installing ~/.cargo/bin/htmltoadf
Installed package `htmltoadf v0.1.13` (executable `html2adf`)

Download Binary file from Github

Pre-built binaries can be downloaded from here: https://github.com/wouterken/htmltoadf/releases/tag/0.1.13

Docker Image

Docker Repo:

https://hub.docker.com/r/wouterken/html2adf

Usage

$ echo"<h1>Hello world<p>Test</p></h1>"| docker run --rm -i wouterken/html2adf:0.1.13
{"version":1,"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"type":"text","text":"Hello world"},{"type":"text","text":"Test"}]}]}
$ echo"<h1>Hello world<p>Test</p></h1>"| docker run --rm -i wouterken/html2adf:0.1.13 | jq
{
"version": 1,
"type": "doc",
"content": [
{
"type": "heading",
"attrs": {
"level": 1
},
"content": [
{
"type": "text",
"text": "Hello world"
},
{
"type": "text",
"text": "Test"
}
]
}
]
}

Lib

Example Rust Code

Cargo.toml

[dependencies]
htmltoadf = "0.1.13"

Code

use htmltoadf::convert_html_str_to_adf_str;use serde_json::json;let converted = convert_html_str_to_adf_str("<h1>Hello World</h1>".to_string());let expected = json!({"version":1,"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"type":"text","text":"Hello World"}]}]}).to_string();assert_eq!(expected, converted);

WASM

Install package from npm

importinit,{convert}from"htmltoadf";init().then(()=>{alert(convert("<h1>Hello from WebAssembly</h1>"))});

FFI

First compile the code as a library, e.g.:

cargo build --lib --release

Then you can link to the library dynamic from any environment that supports a FFI. It is important to copy the dynamic library from the release directory, and provide a relative link to the library file from the FFI

E.g.

Ruby

require'ffi'moduleHTMLToADFextendFFI::Libraryffi_lib'libhtmltoadf'attach_function:convert,[:string],:stringendputsHTMLToADF.convert("<h1>Hello from Ruby</h1>")

Node/JavaScript

varffi=require('ffi-napi');varhtmltoadf=ffi.Library('libhtmltoadf',{'convert': ['string',['string']]});console.log(htmltoadf.convert("<h1>Hello from Node!</h1>"));

Python

fromcffiimportFFIffi=FFI()
lib=ffi.dlopen("libhtmltoadf")
ffi.cdef("char * convert(char *);")
print(ffi.string(lib.convert(b"<h1>Hello from Python!</h1>")))

Implemented features

This converter only implements a subset of possible mappings between HTML and ADF. The following features are implemented:

  • Headings
  • Images
  • Lists (ordered and unordered)
  • Tables
  • Text and Paragraphs
  • Code
  • Fuzz Tests
  • Support for named CSS colors
  • Smart image sizing
  • Inline Cards
  • Panels
  • Emoji
  • In built JSON Schema Validation

Release Process

  1. Increment the version number in Cargo.toml and README.md.
  2. Update the demo dependency in docs/index.html. Keep this step before the final VCS push. The demo page loads the npm package directly from unpkg, so pushing the page before the npm publish is live can break the demo.
  3. Run local validation and build release artifacts.
    • Requires: cargo-zigbuild, cargo-xwin, zig, wasm-pack, gh, npm, Docker, and the nightly toolchain.
    • Prefer rustup-managed tooling for wasm builds. If Homebrew Rust appears earlier in PATH, run PATH="$HOME/.cargo/bin:$PATH" wasm-pack ... so wasm-pack can see the installed wasm32-unknown-unknown target.
    • Preflight checks:
      • cargo owner --list htmltoadf
      • npm whoami --registry=https://registry.npmjs.org/
      • docker info
      • gh auth status
    • Run sh scripts/release_checklist.sh <version> for fmt, clippy, test, release artifacts, and an amd64 Docker smoke build.
  4. Build the wasm package.
    • PATH="$HOME/.cargo/bin:$PATH" wasm-pack build --release --target web --out-dir pkg
  5. Publish registry artifacts in this order.
    • Docker: docker buildx build --platform linux/amd64,linux/arm64 --build-arg VERSION=<version> -t wouterken/html2adf:<version> -t wouterken/html2adf:latest --push .
    • npm: npm publish ./pkg If npm publish is protected by 2FA, pass --otp=<code>.
    • crates.io: cargo publish
  6. Push to VCS after the registry publishes succeed.
    • Push the release commit.
    • Tag the release.
    • Create the GitHub release and upload the release artifacts from releases/<version>/.
    • GitHub release asset names should be target-prefixed, for example x86_64-unknown-linux-gnu_html2adf, to avoid collisions between files like libhtmltoadf.rlib.

For a scripted publish flow after version bumping, validation, and release artifact generation, use:

sh scripts/release_publish.sh <version> [npm-otp]

Testing

Run cargo test from the repository root.

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/wouterken/htmltoadf. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the Contributor Covenant code of conduct.

About

An HTML to Atlassian Document Format (ADF) converter, written in Rust

Resources

Stars

49 stars

Watchers

5 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

htmltoadf Latest VersionRustc Version 1.58+htmltoadf

htmltoadf is an HTML to Atlassian Document Format (ADF) converter written in Rust.

The library can be used in several different ways:

  • As a command line binary (either directly on a compatible host or using Docker)
  • Included as a library within a Rust project
  • Called from a different language or environment (e.g. C, JavaScript, Ruby, PHP, .NET etc.) using FFI
  • Called as a Web Assembly (wasm) module


Demo

See demo of the tool running as a WASM library entirely in the client here: https://wouterken.github.io/htmltoadf/


CLI

Binaries

The htmltoadf tool includes an html2adf binary.

Usage

$ html2adf -h
htmltoadf 0.1.13
An HTML to Atlassian Document Format (ADF) converter
USAGE:
html2adf [OPTIONS] [INPATH]
ARGS:
<INPATH> The path to the file to read
OPTIONS:
-h, --help Print help information
-o, --outpath <OUTPATH>
-V, --version Print version information

Install Binary from Crates.io with cargo install

$ cargo install htmltoadf
installing htmltoadf v0.1.13 (/usr/src/html2adf)
Updating crates.io index
Downloading crates ...
Downloaded lock_api v0.4.6
--snip--
Compiling htmltoadf v0.1.13
Finished release [optimized] target(s) in 1m 42s
Installing ~/.cargo/bin/htmltoadf
Installed package `htmltoadf v0.1.13` (executable `html2adf`)

Download Binary file from Github

Pre-built binaries can be downloaded from here: https://github.com/wouterken/htmltoadf/releases/tag/0.1.13

Docker Image

Docker Repo:

https://hub.docker.com/r/wouterken/html2adf

Usage

$ echo"<h1>Hello world<p>Test</p></h1>"| docker run --rm -i wouterken/html2adf:0.1.13
{"version":1,"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"type":"text","text":"Hello world"},{"type":"text","text":"Test"}]}]}
$ echo"<h1>Hello world<p>Test</p></h1>"| docker run --rm -i wouterken/html2adf:0.1.13 | jq
{
"version": 1,
"type": "doc",
"content": [
{
"type": "heading",
"attrs": {
"level": 1
},
"content": [
{
"type": "text",
"text": "Hello world"
},
{
"type": "text",
"text": "Test"
}
]
}
]
}

Lib

Example Rust Code

Cargo.toml

[dependencies]
htmltoadf = "0.1.13"

Code

use htmltoadf::convert_html_str_to_adf_str;use serde_json::json;let converted = convert_html_str_to_adf_str("<h1>Hello World</h1>".to_string());let expected = json!({"version":1,"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"type":"text","text":"Hello World"}]}]}).to_string();assert_eq!(expected, converted);

WASM

Install package from npm

importinit,{convert}from"htmltoadf";init().then(()=>{alert(convert("<h1>Hello from WebAssembly</h1>"))});

FFI

First compile the code as a library, e.g.:

cargo build --lib --release

Then you can link to the library dynamic from any environment that supports a FFI. It is important to copy the dynamic library from the release directory, and provide a relative link to the library file from the FFI

E.g.

Ruby

require'ffi'moduleHTMLToADFextendFFI::Libraryffi_lib'libhtmltoadf'attach_function:convert,[:string],:stringendputsHTMLToADF.convert("<h1>Hello from Ruby</h1>")

Node/JavaScript

varffi=require('ffi-napi');varhtmltoadf=ffi.Library('libhtmltoadf',{'convert': ['string',['string']]});console.log(htmltoadf.convert("<h1>Hello from Node!</h1>"));

Python

fromcffiimportFFIffi=FFI()
lib=ffi.dlopen("libhtmltoadf")
ffi.cdef("char * convert(char *);")
print(ffi.string(lib.convert(b"<h1>Hello from Python!</h1>")))

Implemented features

This converter only implements a subset of possible mappings between HTML and ADF. The following features are implemented:

  • Headings
  • Images
  • Lists (ordered and unordered)
  • Tables
  • Text and Paragraphs
  • Code
  • Fuzz Tests
  • Support for named CSS colors
  • Smart image sizing
  • Inline Cards
  • Panels
  • Emoji
  • In built JSON Schema Validation

Release Process

  1. Increment the version number in Cargo.toml and README.md.
  2. Update the demo dependency in docs/index.html. Keep this step before the final VCS push. The demo page loads the npm package directly from unpkg, so pushing the page before the npm publish is live can break the demo.
  3. Run local validation and build release artifacts.
    • Requires: cargo-zigbuild, cargo-xwin, zig, wasm-pack, gh, npm, Docker, and the nightly toolchain.
    • Prefer rustup-managed tooling for wasm builds. If Homebrew Rust appears earlier in PATH, run PATH="$HOME/.cargo/bin:$PATH" wasm-pack ... so wasm-pack can see the installed wasm32-unknown-unknown target.
    • Preflight checks:
      • cargo owner --list htmltoadf
      • npm whoami --registry=https://registry.npmjs.org/
      • docker info
      • gh auth status
    • Run sh scripts/release_checklist.sh <version> for fmt, clippy, test, release artifacts, and an amd64 Docker smoke build.
  4. Build the wasm package.
    • PATH="$HOME/.cargo/bin:$PATH" wasm-pack build --release --target web --out-dir pkg
  5. Publish registry artifacts in this order.
    • Docker: docker buildx build --platform linux/amd64,linux/arm64 --build-arg VERSION=<version> -t wouterken/html2adf:<version> -t wouterken/html2adf:latest --push .
    • npm: npm publish ./pkg If npm publish is protected by 2FA, pass --otp=<code>.
    • crates.io: cargo publish
  6. Push to VCS after the registry publishes succeed.
    • Push the release commit.
    • Tag the release.
    • Create the GitHub release and upload the release artifacts from releases/<version>/.
    • GitHub release asset names should be target-prefixed, for example x86_64-unknown-linux-gnu_html2adf, to avoid collisions between files like libhtmltoadf.rlib.

For a scripted publish flow after version bumping, validation, and release artifact generation, use:

sh scripts/release_publish.sh <version> [npm-otp]

Testing

Run cargo test from the repository root.

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/wouterken/htmltoadf. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the Contributor Covenant code of conduct.

About

An HTML to Atlassian Document Format (ADF) converter, written in Rust

Resources

Stars

49 stars

Watchers

5 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

htmltoadf Latest VersionRustc Version 1.58+htmltoadf

htmltoadf is an HTML to Atlassian Document Format (ADF) converter written in Rust.

The library can be used in several different ways:

  • As a command line binary (either directly on a compatible host or using Docker)
  • Included as a library within a Rust project
  • Called from a different language or environment (e.g. C, JavaScript, Ruby, PHP, .NET etc.) using FFI
  • Called as a Web Assembly (wasm) module


Demo

See demo of the tool running as a WASM library entirely in the client here: https://wouterken.github.io/htmltoadf/


CLI

Binaries

The htmltoadf tool includes an html2adf binary.

Usage

$ html2adf -h
htmltoadf 0.1.13
An HTML to Atlassian Document Format (ADF) converter
USAGE:
html2adf [OPTIONS] [INPATH]
ARGS:
<INPATH> The path to the file to read
OPTIONS:
-h, --help Print help information
-o, --outpath <OUTPATH>
-V, --version Print version information

Install Binary from Crates.io with cargo install

$ cargo install htmltoadf
installing htmltoadf v0.1.13 (/usr/src/html2adf)
Updating crates.io index
Downloading crates ...
Downloaded lock_api v0.4.6
--snip--
Compiling htmltoadf v0.1.13
Finished release [optimized] target(s) in 1m 42s
Installing ~/.cargo/bin/htmltoadf
Installed package `htmltoadf v0.1.13` (executable `html2adf`)

Download Binary file from Github

Pre-built binaries can be downloaded from here: https://github.com/wouterken/htmltoadf/releases/tag/0.1.13

Docker Image

Docker Repo:

https://hub.docker.com/r/wouterken/html2adf

Usage

$ echo"<h1>Hello world<p>Test</p></h1>"| docker run --rm -i wouterken/html2adf:0.1.13
{"version":1,"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"type":"text","text":"Hello world"},{"type":"text","text":"Test"}]}]}
$ echo"<h1>Hello world<p>Test</p></h1>"| docker run --rm -i wouterken/html2adf:0.1.13 | jq
{
"version": 1,
"type": "doc",
"content": [
{
"type": "heading",
"attrs": {
"level": 1
},
"content": [
{
"type": "text",
"text": "Hello world"
},
{
"type": "text",
"text": "Test"
}
]
}
]
}

Lib

Example Rust Code

Cargo.toml

[dependencies]
htmltoadf = "0.1.13"

Code

use htmltoadf::convert_html_str_to_adf_str;use serde_json::json;let converted = convert_html_str_to_adf_str("<h1>Hello World</h1>".to_string());let expected = json!({"version":1,"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"type":"text","text":"Hello World"}]}]}).to_string();assert_eq!(expected, converted);

WASM

Install package from npm

importinit,{convert}from"htmltoadf";init().then(()=>{alert(convert("<h1>Hello from WebAssembly</h1>"))});

FFI

First compile the code as a library, e.g.:

cargo build --lib --release

Then you can link to the library dynamic from any environment that supports a FFI. It is important to copy the dynamic library from the release directory, and provide a relative link to the library file from the FFI

E.g.

Ruby

require'ffi'moduleHTMLToADFextendFFI::Libraryffi_lib'libhtmltoadf'attach_function:convert,[:string],:stringendputsHTMLToADF.convert("<h1>Hello from Ruby</h1>")

Node/JavaScript

varffi=require('ffi-napi');varhtmltoadf=ffi.Library('libhtmltoadf',{'convert': ['string',['string']]});console.log(htmltoadf.convert("<h1>Hello from Node!</h1>"));

Python

fromcffiimportFFIffi=FFI()
lib=ffi.dlopen("libhtmltoadf")
ffi.cdef("char * convert(char *);")
print(ffi.string(lib.convert(b"<h1>Hello from Python!</h1>")))

Implemented features

This converter only implements a subset of possible mappings between HTML and ADF. The following features are implemented:

  • Headings
  • Images
  • Lists (ordered and unordered)
  • Tables
  • Text and Paragraphs
  • Code
  • Fuzz Tests
  • Support for named CSS colors
  • Smart image sizing
  • Inline Cards
  • Panels
  • Emoji
  • In built JSON Schema Validation

Release Process

  1. Increment the version number in Cargo.toml and README.md.
  2. Update the demo dependency in docs/index.html. Keep this step before the final VCS push. The demo page loads the npm package directly from unpkg, so pushing the page before the npm publish is live can break the demo.
  3. Run local validation and build release artifacts.
    • Requires: cargo-zigbuild, cargo-xwin, zig, wasm-pack, gh, npm, Docker, and the nightly toolchain.
    • Prefer rustup-managed tooling for wasm builds. If Homebrew Rust appears earlier in PATH, run PATH="$HOME/.cargo/bin:$PATH" wasm-pack ... so wasm-pack can see the installed wasm32-unknown-unknown target.
    • Preflight checks:
      • cargo owner --list htmltoadf
      • npm whoami --registry=https://registry.npmjs.org/
      • docker info
      • gh auth status
    • Run sh scripts/release_checklist.sh <version> for fmt, clippy, test, release artifacts, and an amd64 Docker smoke build.
  4. Build the wasm package.
    • PATH="$HOME/.cargo/bin:$PATH" wasm-pack build --release --target web --out-dir pkg
  5. Publish registry artifacts in this order.
    • Docker: docker buildx build --platform linux/amd64,linux/arm64 --build-arg VERSION=<version> -t wouterken/html2adf:<version> -t wouterken/html2adf:latest --push .
    • npm: npm publish ./pkg If npm publish is protected by 2FA, pass --otp=<code>.
    • crates.io: cargo publish
  6. Push to VCS after the registry publishes succeed.
    • Push the release commit.
    • Tag the release.
    • Create the GitHub release and upload the release artifacts from releases/<version>/.
    • GitHub release asset names should be target-prefixed, for example x86_64-unknown-linux-gnu_html2adf, to avoid collisions between files like libhtmltoadf.rlib.

For a scripted publish flow after version bumping, validation, and release artifact generation, use:

sh scripts/release_publish.sh <version> [npm-otp]

Testing

Run cargo test from the repository root.

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/wouterken/htmltoadf. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the Contributor Covenant code of conduct.

About

An HTML to Atlassian Document Format (ADF) converter, written in Rust

Resources

Stars

49 stars

Watchers

5 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

htmltoadf Latest VersionRustc Version 1.58+htmltoadf

htmltoadf is an HTML to Atlassian Document Format (ADF) converter written in Rust.

The library can be used in several different ways:

  • As a command line binary (either directly on a compatible host or using Docker)
  • Included as a library within a Rust project
  • Called from a different language or environment (e.g. C, JavaScript, Ruby, PHP, .NET etc.) using FFI
  • Called as a Web Assembly (wasm) module


Demo

See demo of the tool running as a WASM library entirely in the client here: https://wouterken.github.io/htmltoadf/


CLI

Binaries

The htmltoadf tool includes an html2adf binary.

Usage

$ html2adf -h
htmltoadf 0.1.13
An HTML to Atlassian Document Format (ADF) converter
USAGE:
html2adf [OPTIONS] [INPATH]
ARGS:
<INPATH> The path to the file to read
OPTIONS:
-h, --help Print help information
-o, --outpath <OUTPATH>
-V, --version Print version information

Install Binary from Crates.io with cargo install

$ cargo install htmltoadf
installing htmltoadf v0.1.13 (/usr/src/html2adf)
Updating crates.io index
Downloading crates ...
Downloaded lock_api v0.4.6
--snip--
Compiling htmltoadf v0.1.13
Finished release [optimized] target(s) in 1m 42s
Installing ~/.cargo/bin/htmltoadf
Installed package `htmltoadf v0.1.13` (executable `html2adf`)

Download Binary file from Github

Pre-built binaries can be downloaded from here: https://github.com/wouterken/htmltoadf/releases/tag/0.1.13

Docker Image

Docker Repo:

https://hub.docker.com/r/wouterken/html2adf

Usage

$ echo"<h1>Hello world<p>Test</p></h1>"| docker run --rm -i wouterken/html2adf:0.1.13
{"version":1,"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"type":"text","text":"Hello world"},{"type":"text","text":"Test"}]}]}
$ echo"<h1>Hello world<p>Test</p></h1>"| docker run --rm -i wouterken/html2adf:0.1.13 | jq
{
"version": 1,
"type": "doc",
"content": [
{
"type": "heading",
"attrs": {
"level": 1
},
"content": [
{
"type": "text",
"text": "Hello world"
},
{
"type": "text",
"text": "Test"
}
]
}
]
}

Lib

Example Rust Code

Cargo.toml

[dependencies]
htmltoadf = "0.1.13"

Code

use htmltoadf::convert_html_str_to_adf_str;use serde_json::json;let converted = convert_html_str_to_adf_str("<h1>Hello World</h1>".to_string());let expected = json!({"version":1,"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"type":"text","text":"Hello World"}]}]}).to_string();assert_eq!(expected, converted);

WASM

Install package from npm

importinit,{convert}from"htmltoadf";init().then(()=>{alert(convert("<h1>Hello from WebAssembly</h1>"))});

FFI

First compile the code as a library, e.g.:

cargo build --lib --release

Then you can link to the library dynamic from any environment that supports a FFI. It is important to copy the dynamic library from the release directory, and provide a relative link to the library file from the FFI

E.g.

Ruby

require'ffi'moduleHTMLToADFextendFFI::Libraryffi_lib'libhtmltoadf'attach_function:convert,[:string],:stringendputsHTMLToADF.convert("<h1>Hello from Ruby</h1>")

Node/JavaScript

varffi=require('ffi-napi');varhtmltoadf=ffi.Library('libhtmltoadf',{'convert': ['string',['string']]});console.log(htmltoadf.convert("<h1>Hello from Node!</h1>"));

Python

fromcffiimportFFIffi=FFI()
lib=ffi.dlopen("libhtmltoadf")
ffi.cdef("char * convert(char *);")
print(ffi.string(lib.convert(b"<h1>Hello from Python!</h1>")))

Implemented features

This converter only implements a subset of possible mappings between HTML and ADF. The following features are implemented:

  • Headings
  • Images
  • Lists (ordered and unordered)
  • Tables
  • Text and Paragraphs
  • Code
  • Fuzz Tests
  • Support for named CSS colors
  • Smart image sizing
  • Inline Cards
  • Panels
  • Emoji
  • In built JSON Schema Validation

Release Process

  1. Increment the version number in Cargo.toml and README.md.
  2. Update the demo dependency in docs/index.html. Keep this step before the final VCS push. The demo page loads the npm package directly from unpkg, so pushing the page before the npm publish is live can break the demo.
  3. Run local validation and build release artifacts.
    • Requires: cargo-zigbuild, cargo-xwin, zig, wasm-pack, gh, npm, Docker, and the nightly toolchain.
    • Prefer rustup-managed tooling for wasm builds. If Homebrew Rust appears earlier in PATH, run PATH="$HOME/.cargo/bin:$PATH" wasm-pack ... so wasm-pack can see the installed wasm32-unknown-unknown target.
    • Preflight checks:
      • cargo owner --list htmltoadf
      • npm whoami --registry=https://registry.npmjs.org/
      • docker info
      • gh auth status
    • Run sh scripts/release_checklist.sh <version> for fmt, clippy, test, release artifacts, and an amd64 Docker smoke build.
  4. Build the wasm package.
    • PATH="$HOME/.cargo/bin:$PATH" wasm-pack build --release --target web --out-dir pkg
  5. Publish registry artifacts in this order.
    • Docker: docker buildx build --platform linux/amd64,linux/arm64 --build-arg VERSION=<version> -t wouterken/html2adf:<version> -t wouterken/html2adf:latest --push .
    • npm: npm publish ./pkg If npm publish is protected by 2FA, pass --otp=<code>.
    • crates.io: cargo publish
  6. Push to VCS after the registry publishes succeed.
    • Push the release commit.
    • Tag the release.
    • Create the GitHub release and upload the release artifacts from releases/<version>/.
    • GitHub release asset names should be target-prefixed, for example x86_64-unknown-linux-gnu_html2adf, to avoid collisions between files like libhtmltoadf.rlib.

For a scripted publish flow after version bumping, validation, and release artifact generation, use:

sh scripts/release_publish.sh <version> [npm-otp]

Testing

Run cargo test from the repository root.

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/wouterken/htmltoadf. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the Contributor Covenant code of conduct.

About

An HTML to Atlassian Document Format (ADF) converter, written in Rust

Resources

Stars

49 stars

Watchers

5 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

htmltoadf Latest VersionRustc Version 1.58+htmltoadf

htmltoadf is an HTML to Atlassian Document Format (ADF) converter written in Rust.

The library can be used in several different ways:

  • As a command line binary (either directly on a compatible host or using Docker)
  • Included as a library within a Rust project
  • Called from a different language or environment (e.g. C, JavaScript, Ruby, PHP, .NET etc.) using FFI
  • Called as a Web Assembly (wasm) module


Demo

See demo of the tool running as a WASM library entirely in the client here: https://wouterken.github.io/htmltoadf/


CLI

Binaries

The htmltoadf tool includes an html2adf binary.

Usage

$ html2adf -h
htmltoadf 0.1.13
An HTML to Atlassian Document Format (ADF) converter
USAGE:
html2adf [OPTIONS] [INPATH]
ARGS:
<INPATH> The path to the file to read
OPTIONS:
-h, --help Print help information
-o, --outpath <OUTPATH>
-V, --version Print version information

Install Binary from Crates.io with cargo install

$ cargo install htmltoadf
installing htmltoadf v0.1.13 (/usr/src/html2adf)
Updating crates.io index
Downloading crates ...
Downloaded lock_api v0.4.6
--snip--
Compiling htmltoadf v0.1.13
Finished release [optimized] target(s) in 1m 42s
Installing ~/.cargo/bin/htmltoadf
Installed package `htmltoadf v0.1.13` (executable `html2adf`)

Download Binary file from Github

Pre-built binaries can be downloaded from here: https://github.com/wouterken/htmltoadf/releases/tag/0.1.13

Docker Image

Docker Repo:

https://hub.docker.com/r/wouterken/html2adf

Usage

$ echo"<h1>Hello world<p>Test</p></h1>"| docker run --rm -i wouterken/html2adf:0.1.13
{"version":1,"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"type":"text","text":"Hello world"},{"type":"text","text":"Test"}]}]}
$ echo"<h1>Hello world<p>Test</p></h1>"| docker run --rm -i wouterken/html2adf:0.1.13 | jq
{
"version": 1,
"type": "doc",
"content": [
{
"type": "heading",
"attrs": {
"level": 1
},
"content": [
{
"type": "text",
"text": "Hello world"
},
{
"type": "text",
"text": "Test"
}
]
}
]
}

Lib

Example Rust Code

Cargo.toml

[dependencies]
htmltoadf = "0.1.13"

Code

use htmltoadf::convert_html_str_to_adf_str;use serde_json::json;let converted = convert_html_str_to_adf_str("<h1>Hello World</h1>".to_string());let expected = json!({"version":1,"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"type":"text","text":"Hello World"}]}]}).to_string();assert_eq!(expected, converted);

WASM

Install package from npm

importinit,{convert}from"htmltoadf";init().then(()=>{alert(convert("<h1>Hello from WebAssembly</h1>"))});

FFI

First compile the code as a library, e.g.:

cargo build --lib --release

Then you can link to the library dynamic from any environment that supports a FFI. It is important to copy the dynamic library from the release directory, and provide a relative link to the library file from the FFI

E.g.

Ruby

require'ffi'moduleHTMLToADFextendFFI::Libraryffi_lib'libhtmltoadf'attach_function:convert,[:string],:stringendputsHTMLToADF.convert("<h1>Hello from Ruby</h1>")

Node/JavaScript

varffi=require('ffi-napi');varhtmltoadf=ffi.Library('libhtmltoadf',{'convert': ['string',['string']]});console.log(htmltoadf.convert("<h1>Hello from Node!</h1>"));

Python

fromcffiimportFFIffi=FFI()
lib=ffi.dlopen("libhtmltoadf")
ffi.cdef("char * convert(char *);")
print(ffi.string(lib.convert(b"<h1>Hello from Python!</h1>")))

Implemented features

This converter only implements a subset of possible mappings between HTML and ADF. The following features are implemented:

  • Headings
  • Images
  • Lists (ordered and unordered)
  • Tables
  • Text and Paragraphs
  • Code
  • Fuzz Tests
  • Support for named CSS colors
  • Smart image sizing
  • Inline Cards
  • Panels
  • Emoji
  • In built JSON Schema Validation

Release Process

  1. Increment the version number in Cargo.toml and README.md.
  2. Update the demo dependency in docs/index.html. Keep this step before the final VCS push. The demo page loads the npm package directly from unpkg, so pushing the page before the npm publish is live can break the demo.
  3. Run local validation and build release artifacts.
    • Requires: cargo-zigbuild, cargo-xwin, zig, wasm-pack, gh, npm, Docker, and the nightly toolchain.
    • Prefer rustup-managed tooling for wasm builds. If Homebrew Rust appears earlier in PATH, run PATH="$HOME/.cargo/bin:$PATH" wasm-pack ... so wasm-pack can see the installed wasm32-unknown-unknown target.
    • Preflight checks:
      • cargo owner --list htmltoadf
      • npm whoami --registry=https://registry.npmjs.org/
      • docker info
      • gh auth status
    • Run sh scripts/release_checklist.sh <version> for fmt, clippy, test, release artifacts, and an amd64 Docker smoke build.
  4. Build the wasm package.
    • PATH="$HOME/.cargo/bin:$PATH" wasm-pack build --release --target web --out-dir pkg
  5. Publish registry artifacts in this order.
    • Docker: docker buildx build --platform linux/amd64,linux/arm64 --build-arg VERSION=<version> -t wouterken/html2adf:<version> -t wouterken/html2adf:latest --push .
    • npm: npm publish ./pkg If npm publish is protected by 2FA, pass --otp=<code>.
    • crates.io: cargo publish
  6. Push to VCS after the registry publishes succeed.
    • Push the release commit.
    • Tag the release.
    • Create the GitHub release and upload the release artifacts from releases/<version>/.
    • GitHub release asset names should be target-prefixed, for example x86_64-unknown-linux-gnu_html2adf, to avoid collisions between files like libhtmltoadf.rlib.

For a scripted publish flow after version bumping, validation, and release artifact generation, use:

sh scripts/release_publish.sh <version> [npm-otp]

Testing

Run cargo test from the repository root.

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/wouterken/htmltoadf. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the Contributor Covenant code of conduct.

About

An HTML to Atlassian Document Format (ADF) converter, written in Rust

Resources

Stars

49 stars

Watchers

5 watching

Forks

Releases

Packages

Used by

Contributors

Languages