51 lines
1.6 KiB
JavaScript
51 lines
1.6 KiB
JavaScript
import { writeCrc } from './crc';
|
|
// https://www.w3.org/TR/png/#11tEXt
|
|
export const textChunkName = 'tEXt';
|
|
const NULL = 0;
|
|
const latin1Decoder = new TextDecoder('latin1');
|
|
function validateKeyword(keyword) {
|
|
validateLatin1(keyword);
|
|
if (keyword.length === 0 || keyword.length > 79) {
|
|
throw new Error('keyword length must be between 1 and 79');
|
|
}
|
|
}
|
|
// eslint-disable-next-line no-control-regex
|
|
const latin1Regex = /^[\u0000-\u00FF]*$/;
|
|
function validateLatin1(text) {
|
|
if (!latin1Regex.test(text)) {
|
|
throw new Error('invalid latin1 text');
|
|
}
|
|
}
|
|
export function decodetEXt(text, buffer, length) {
|
|
const keyword = readKeyword(buffer);
|
|
text[keyword] = readLatin1(buffer, length - keyword.length - 1);
|
|
}
|
|
export function encodetEXt(buffer, keyword, text) {
|
|
validateKeyword(keyword);
|
|
validateLatin1(text);
|
|
const length = keyword.length + 1 /* NULL */ + text.length;
|
|
buffer.writeUint32(length);
|
|
buffer.writeChars(textChunkName);
|
|
buffer.writeChars(keyword);
|
|
buffer.writeByte(NULL);
|
|
buffer.writeChars(text);
|
|
writeCrc(buffer, length + 4);
|
|
}
|
|
// https://www.w3.org/TR/png/#11keywords
|
|
export function readKeyword(buffer) {
|
|
buffer.mark();
|
|
while (buffer.readByte() !== NULL) {
|
|
/* advance */
|
|
}
|
|
const end = buffer.offset;
|
|
buffer.reset();
|
|
const keyword = latin1Decoder.decode(buffer.readBytes(end - buffer.offset - 1));
|
|
// NULL
|
|
buffer.skip(1);
|
|
validateKeyword(keyword);
|
|
return keyword;
|
|
}
|
|
export function readLatin1(buffer, length) {
|
|
return latin1Decoder.decode(buffer.readBytes(length));
|
|
}
|
|
//# sourceMappingURL=text.js.map
|