@kayahr/text-encoding
Version:
Text encoder and decoder
77 lines • 2.64 kB
JavaScript
/*
* Copyright (C) 2021 Klaus Reimer <k@ailis.de>
* See LICENSE.md for licensing information.
*/
import jis0208 from "../../../data/jis0208.cp.js";
import { AbstractEncoder } from "../AbstractEncoder.js";
import { END_OF_BUFFER } from "../ByteBuffer.js";
import { FINISHED } from "../constants.js";
import { indexOf, isASCII } from "../util.js";
const State = {
ASCII: 0,
Roman: 1,
jis0208: 2
};
/**
* Encoder for iso-2022-jp encoding.
*/
export class ISO2022JPEncoder extends AbstractEncoder {
state = State.ASCII;
/** @inheritdoc */
encode(buffer) {
let codePoint = buffer.read();
if (codePoint === END_OF_BUFFER && this.state !== State.ASCII) {
buffer.write(codePoint);
this.state = State.ASCII;
return [0x1B, 0x28, 0x42];
}
if (codePoint === END_OF_BUFFER && this.state === State.ASCII) {
return FINISHED;
}
if ((this.state === State.ASCII || this.state === State.Roman)
&& (codePoint === 0x000E || codePoint === 0x000F || codePoint === 0x001B)) {
return this.fail(0xFFFD);
}
if (this.state === State.ASCII && isASCII(codePoint)) {
return codePoint;
}
if (this.state === State.Roman && ((isASCII(codePoint) && codePoint !== 0x005C
&& codePoint !== 0x007E) || (codePoint === 0x00A5 || codePoint === 0x203E))) {
if (isASCII(codePoint)) {
return codePoint;
}
if (codePoint === 0x00A5) {
return 0x5C;
}
if (codePoint === 0x203E) {
return 0x7E;
}
}
if (isASCII(codePoint) && this.state !== State.ASCII) {
buffer.write(codePoint);
this.state = State.ASCII;
return [0x1B, 0x28, 0x42];
}
if ((codePoint === 0x00A5 || codePoint === 0x203E) && this.state !== State.Roman) {
buffer.write(codePoint);
this.state = State.Roman;
return [0x1B, 0x28, 0x4A];
}
if (codePoint === 0x2212) {
codePoint = 0xFF0D;
}
const index = indexOf(jis0208, codePoint);
if (index == null) {
return this.fail(codePoint);
}
if (this.state !== State.jis0208) {
buffer.write(codePoint);
this.state = State.jis0208;
return [0x1B, 0x24, 0x42];
}
const lead = Math.floor(index / 94) + 0x21;
const trail = index % 94 + 0x21;
return [lead, trail];
}
}
//# sourceMappingURL=ISO2022JPEncoder.js.map