TransformStreamで長文テキストを特定サイズに分割したString配列に変換する
ReadableStream, TransformStreamを使いこなせるようになりたい。
バイナリを操作するTransformStreamを作ってみたが、いきなりバイナリを触ることから入門下からなのか、なんとなくしか理解できていなかった。
なので、文字列操作などを例に試してみることにした。
type Ctrl = TransformStreamDefaultController<string[]>;
class TextArrayTransformStream extends TransformStream<string, string[]> { #chunk: string[] = []; #chunkSize: number; #splitReg: RegExp;
constructor(chunkSize: number, maxTextLength: number) { super({ transform: (chunk, controller) => this.#handle(chunk, controller), flush: (controller) => this.#flush(controller), }); this.#chunkSize = chunkSize; this.#splitReg = new RegExp(`.{1,${maxTextLength}}`, "g"); }
#handle(chunk: string, controller: Ctrl): void { for (const str of chunk.match(this.#splitReg) || []) { if (this.#chunk.length >= this.#chunkSize) { controller.enqueue(this.#chunk); this.#chunk = []; } else { this.#chunk.push(str); } } }
#flush(controller: Ctrl): void { if (this.#chunk.length > 0) { controller.enqueue(this.#chunk); } }}
AsyncIteratorを実装していないので、for await (const of ...)
構文が使えない
async function main() { const text = "...";
const arrayLength = 5; const textLength = 10;
const stream = toReadableStream(text) .pipeThrough(new TextArrayTransformStream(arrayLength, textLength));
const reader = stream.getReader(); while (true) { const { done, value } = await reader.read(); if (done) break;
console.log(value); }}
入力テキスト
Section titled “入力テキスト”日本国民は、正当に選挙された国会における代表者を通じて行動し、われらとわれらの子孫のために、諸国民との協和による成果と、わが国全土にわたつて自由のもたらす恵沢を確保し、政府の行為によつて再び戦争の惨禍が起ることのないやうにすることを決意し、ここに主権が国民に存することを宣言し、この憲法を確定する。そもそも国政は、国民の厳粛な信託によるものであつて、その権威は国民に由来し、その権力は国民の代表者がこれを行使し、その福利は国民がこれを享受する。これは人類普遍の原理であり、この憲法は、かかる原理に基くものである。われらは、これに反する一切の憲法、法令及び詔勅を排除する。 日本国民は、恒久の平和を念願し、人間相互の関係を支配する崇高な理想を深く自覚するのであつて、平和を愛する諸国民の公正と信義に信頼して、われらの安全と生存を保持しようと決意した。われらは、平和を維持し、専制と隷従、圧迫と偏狭を地上から永遠に除去しようと努めてゐる国際社会において、名誉ある地位を占めたいと思ふ。われらは、全世界の国民が、ひとしく恐怖と欠乏から免かれ、平和のうちに生存する権利を有することを確認する。
われらは、いづれの国家も、自国のことのみに専念して他国を無視してはならないのであつて、政治道徳の法則は、普遍的なものであり、この法則に従ふことは、自国の主権を維持し、他国と対等関係に立たうとする各国の責務であると信ずる。
日本国民は、国家の名誉にかけ、全力をあげてこの崇高な理想と目的を達成することを誓ふ。
[ [ "日本国民は、正当に選", "挙された国会における", "代表者を通じて行動し", "、われらとわれらの子", "孫のために、諸国民と" ], [ "わが国全土にわたつて", "自由のもたらす恵沢を", "確保し、政府の行為に", "よつて再び戦争の惨禍", "が起ることのないやう" ], [ "ここに主権が国民に存", "することを宣言し、こ", "の憲法を確定する。そ", "もそも国政は、国民の", "厳粛な信託によるもの" ], [ "国民に由来し、その権", "力は国民の代表者がこ", "れを行使し、その福利", "は国民がこれを享受す", "る。これは人類普遍の" ], [ "は、かかる原理に基く", "ものである。われらは", "、これに反する一切の", "憲法、法令及び詔勅を", "排除する。 " ], [ "平和を念願し、人間相", "互の関係を支配する崇", "高な理想を深く自覚す", "るのであつて、平和を", "愛する諸国民の公正と" ], [ "らの安全と生存を保持", "しようと決意した。わ", "れらは、平和を維持し", "、専制と隷従、圧迫と", "偏狭を地上から永遠に" ], [ "る国際社会において、", "名誉ある地位を占めた", "いと思ふ。われらは、", "全世界の国民が、ひと", "しく恐怖と欠乏から免" ], [ "存する権利を有するこ", "とを確認する。", "われらは、いづれの国", "家も、自国のことのみ", "に専念して他国を無視" ], [ "つて、政治道徳の法則", "は、普遍的なものであ", "り、この法則に従ふこ", "とは、自国の主権を維", "持し、他国と対等関係" ], [ "責務であると信ずる。", "日本国民は、国家の名", "誉にかけ、全力をあげ", "てこの崇高な理想と目", "的を達成することを誓" ]]