Files
ha.mr/standalone.js
T
Matthew Yang (杨佳明) 2f7e26b02b Fix other domains (#7)
* Make main compressor capable of other domains

* Fix missing bracket

* Domain needs to contain port as well

* Add decode functionality for other domains

---------

Co-authored-by: p2r3 <41925384+p2r3@users.noreply.github.com>
2026-08-16 13:06:17 +03:00

53 lines
1.7 KiB
JavaScript

import { compress, decompress } from "./compress.js";
import {
outputAlphabetASCII,
outputAlphabetQR,
outputAlphabetEmoji
} from "./alphabets.js";
const input = process.argv[2]?.trim();
const alphabetName = process.argv[3]?.trim() || "ascii";
const command = process.argv[4]?.trim() || "encode";
if (!input) {
console.error(`Usage: hamr <link> [ascii|qr|emoji] {decode|encode}`);
console.error(`The final argument is optional and defaults to "encode".`);
process.exit(1);
}
let payload = "";
if (input.toLowerCase().startsWith("http://ha.mr")) {
payload = input.slice(12);
} else if (input.toLowerCase().startsWith("https://ha.mr")) {
payload = input.slice(13);
} else if (input.toLowerCase().startsWith("ha.mr")) {
payload = input.slice(5);
} else if (command === "decode") {
const pos = input.indexOf("#");
payload = input.slice(pos);
console.log(`Payload: ${payload}`);
}
if (payload || command === "decode") {
const isQRCode = input[0] === "/";
payload = payload.slice(1);
const useEmoji = Array.from(payload).some(c => !outputAlphabetASCII.includes(c));
if (isQRCode) console.log(decompress(payload, outputAlphabetQR));
else console.log(decompress(payload, useEmoji ? outputAlphabetEmoji : outputAlphabetASCII));
process.exit(0);
}
let alphabet = outputAlphabetASCII;
if (alphabetName === "qr") alphabet = outputAlphabetQR;
else if (alphabetName === "emoji") alphabet = outputAlphabetEmoji;
else if (alphabetName !== "ascii") {
console.error(`Unknown alphabet "${alphabetName}".`);
console.error("Select one of: ascii, qr, emoji");
process.exit(2);
}
if (alphabetName === "qr") {
console.log("HTTP://HA.MR/" + compress(input, alphabet));
} else {
console.log("http://ha.mr#" + compress(input, alphabet));
}