@diplodoc/transform
Version:
A simple transformer of text in YFM (Yandex Flavored Markdown) to HTML
76 lines (59 loc) • 1.57 kB
text/typescript
/* eslint-disable no-param-reassign */
export function parseImageSize(str: string, pos: number, max: number) {
const result = {
ok: false,
pos: 0,
width: '',
height: '',
};
if (pos >= max) {
return result;
}
let code = str.charCodeAt(pos);
if (code !== 0x3d /* = */) {
return result;
}
pos++;
// size must follow = without any white spaces as follows
// (1) =300x200
// (2) =300x
// (3) =x200
code = str.charCodeAt(pos);
if (code !== 0x78 /* x */ && (code < 0x30 || code > 0x39) /* [0-9] */) {
return result;
}
// parse width
const resultW = parseNextNumber(str, pos, max);
pos = resultW.pos;
// next charactor must be 'x'
code = str.charCodeAt(pos);
if (code !== 0x78 /* x */) {
return result;
}
pos++;
// parse height
const resultH = parseNextNumber(str, pos, max);
pos = resultH.pos;
result.width = resultW.value;
result.height = resultH.value;
result.pos = pos;
result.ok = true;
return result;
}
function parseNextNumber(str: string, pos: number, max: number) {
let code;
const start = pos;
const result = {
pos,
ok: false,
value: '',
};
code = str.charCodeAt(pos);
while ((pos < max && code >= 0x30 /* 0 */ && code <= 0x39) /* 9 */ || code === 0x25 /* % */) {
code = str.charCodeAt(++pos);
}
result.ok = true;
result.pos = pos;
result.value = str.slice(start, pos);
return result;
}