Pure-MoonBit QR Code Model 2 encoder with ASCII/SVG renderers, payload templates and a flat JS/wasm API | 纯 MoonBit 实现的 QR Code Model 2 编码器,支持 ASCII/SVG 渲染、载荷模板和扁平 JS/wasm API
moon add allenli178/moon-qrcode///|
test "README quick start" {
let qr = @moon-qrcode.encode("HELLO WORLD", ec_level=@moon-qrcode.EcLevel::M)
assert_eq(qr.version().value(), 1)
assert_eq(qr.size(), 21)
assert_true(qr.get(0, 0))
let svg = @moon-qrcode.to_svg(qr, quiet_zone=4, module_size=4)
assert_true(svg.contains("<svg"))
}| Option | Default | Meaning |
|---|---|---|
| text | — | payload string (UTF-8 in byte mode) |
| ec_level | M | error-correction level |
| min_version / max_version | 1 / 40 | version search range |
| mode | auto | force Numeric, Alphanumeric or Byte |
| mask | auto | force a mask M0–M7 |
| Function | Result |
|---|---|
| size() | side length in modules (4 * version + 17) |
| get(row, col) | Bool for one module |
| modules() | row-major Array[Bool] copy |
| to_bytes() | row-major Array[Byte], 1 = dark |
| version() / ec_level() / mask() | metadata |
///|
test "README rendering" {
let qr = @moon-qrcode.encode("https://moonbitlang.com")
let ascii = @moon-qrcode.to_ascii(qr, quiet_zone=2)
let half = @moon-qrcode.to_ascii_half(qr)
assert_true(ascii.length() > 0)
assert_true(half.length() > 0)
let custom = @moon-qrcode.to_svg(qr, dark="navy", light="#ffffff")
assert_true(custom.contains("fill=\"navy\""))
}///|
test "README templates" {
let wifi = @moon-qrcode.Content::wifi("Cafe", "latte")
assert_eq(wifi.to_text(), "WIFI:T:WPA;S:Cafe;P:latte;;")
let card = @moon-qrcode.Content::vcard(
"Ada Lovelace",
email="ada@example.com",
)
let qr = @moon-qrcode.encode_content(card, ec_level=@moon-qrcode.EcLevel::H)
assert_true(qr.size() >= 21)
}# run from the module checkout
moon run cmd/moonqr --target native -- "HELLO WORLD" -l H -o hello.svg
# release binary: _build/native/release/build/cmd/moonqr/moonqr.exe
moon build cmd/moonqr --target native --releaseUSAGE:
moonqr <payload> [options]
-l, --level <L|M|Q|H> error correction level (default M)
-v, --version <1..40> force an explicit version
--min-version <n> smallest version considered
--max-version <n> largest version considered
-m, --mode <name> numeric | alphanumeric | byte (default auto)
--mask <0..7> force a mask pattern
-q, -qz, --quiet-zone <n> quiet zone width in modules (default 4)
-s, --scale <n> ASCII scale factor (default 1)
--module-size <n> SVG module size in pixels (default 4)
-f, --format <name> ascii | half | svg (default: by output extension)
-o, --output <path> write to a file instead of stdout
--svg / --half format shorthands
--dark / --light SVG colorsmoonqr "https://moonbitlang.com" --svg -o site.svg
moonqr "0123456789" -v 2 -m numeric -s 2
moonqr "payload" --min-version 5 --max-version 10 -l Q -f halfmoon build js --target js --release # _build/js/release/build/js/js.js + .d.ts
moon build js --target wasm-gc --release # _build/wasm-gc/release/build/js/js.wasmimport { encode_flat_buffer } from "./_build/js/release/build/js/js.js";
// ec_level: 0=L, 1=M, 2=Q, 3=H
const result = encode_flat_buffer("HELLO WORLD", 1, 1, 40);
if (result.$tag === 1) {
const buf = result._0; // Uint8Array
const size = (buf[0] << 8) | buf[1]; // side length in modules
const version = buf[2];
const mask = buf[3];
const modules = buf.subarray(4); // size * size bytes, 1 = dark
}| Artifact | Raw | gzip |
|---|---|---|
| wasm-gc encoder + flat API (js.wasm) | 20.6 KB | 8.6 KB |
| JS ESM encoder + flat API (js.js) | 71.7 KB | 10.5 KB |
| native release CLI (moonqr.exe) | 353 KB | — |
moon test --target wasm-gc
moon test --target wasm
moon test --target js
moon test --target native
moon fmt --check && moon info
# ZXing decode check (Node 18+)
moon build cmd/moonqr --target native --release
npm ci --prefix tools/zxing
node tools/zxing/verify.jscore/ encoder: types, capacity, segments, bit buffer, RS, BCH, matrix, penalty
render/ ASCII and SVG renderers
content/ payload templates
js/ flat Uint8Array ABI + ESM/wasm-gc link exports
cmd/moonqr CLI
tools/zxing ZXing decode verification harness (Node)test "encode hello world" {
let qr = @core.encode("HELLO WORLD") // V1-M
assert_eq(qr.size(), 21)
assert_eq(qr.version().value(), 1)
}fn is_valid_color(color : String) -> Boolfn total_codewords(version : Int) -> Intfn version_info(version : Int) -> Int?Install
Download zipPure-MoonBit QR Code Model 2 encoder with ASCII/SVG renderers, payload templates and a flat JS/wasm API | 纯 MoonBit 实现的 QR Code Model 2 编码器,支持 ASCII/SVG 渲染、载荷模板和扁平 JS/wasm API