denoflate
例:
PlantUML online serverにファイルを送ってsvgへのリンクを受け取る
shdeno run --allow-net https://scrapbox.io/api/code/deno-ja/denoflate/index.ts https://scrapbox.io/api/code/deno-ja/denoflate/sample.pu
# http://www.plantuml.com/plantuml/svg/0J80pVz2Rs8jFa5iQMDb83eWQ6LiR6yAGMnfOsKjFa9lOY0w8EQNfUQShEYgdkE1f-E1Yk-zYm00
index.tsimport { deflate } from "https://deno.land/x/denoflate@1.1/mod.ts";
import { encode64 } from "./encoder.ts";
import { textToBuffer } from "./converter.ts";
const res = await fetch(Deno.args[0]);
const text = await res.text();
console.log(`http://www.plantuml.com/plantuml/svg/${encode64(deflate(textToBuffer(text), 9))}`);
converter.tsexport function textToBuffer(text: string) {
const ascii_string = unescape(encodeURIComponent(text)); // 間にこれを噛まさないと文字化けする
let buffer = new Uint8Array(ascii_string.length);
for (let i = 0; i < ascii_string.length; i++) {
buffer[i] = ascii_string.charCodeAt(i);
}
return buffer;
}
sample.puBob->Alice : hello
Alice->Bob : 日本語でおk
encoder.tsexport function encode64(data: Uint8Array) {
let r = '';
for (let i = 0; i < data.length; i += 3) {
if (i + 2 === data.length) {
r += append3bytes(data[i], data[i + 1], 0);
} else if (i + 1 === data.length) {
r += append3bytes(data[i], 0, 0);
} else {
r += append3bytes(data[i], data[i + 1], data[i + 2]);
}
}
return r;
}
function encode6bit(b: number) {
if (b < 10) return String.fromCharCode(48 + b);
b -= 10;
if (b < 26) return String.fromCharCode(65 + b);
b -= 26;
if (b < 26) return String.fromCharCode(97 + b);
b -= 26;
if (b === 0) return '-';
if (b === 1) return '_';
return '?';
}
function append3bytes(b1: number, b2: number, b3: number) {
const c1 = b1 >> 2;
const c2 = ((b1 & 0x3) << 4) | (b2 >> 4);
const c3 = ((b2 & 0xF) << 2) | (b3 >> 6);
const c4 = b3 & 0x3F;
return encode6bit(c1 & 0x3F)
+ encode6bit(c2 & 0x3F)
+ encode6bit(c3 & 0x3F)
+ encode6bit(c4 & 0x3F);
}