mirror of
https://github.com/tenrok/BBob.git
synced 2026-06-17 19:21:20 +03:00
feat(parser): better line and column counting support in tokens
This commit is contained in:
@@ -52,6 +52,12 @@ const convertTagToText = (token) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
class Token {
|
class Token {
|
||||||
|
/**
|
||||||
|
* @param {String} type
|
||||||
|
* @param {String} value
|
||||||
|
* @param line
|
||||||
|
* @param row
|
||||||
|
*/
|
||||||
constructor(type, value, line, row) {
|
constructor(type, value, line, row) {
|
||||||
this[TOKEN_TYPE_ID] = String(type);
|
this[TOKEN_TYPE_ID] = String(type);
|
||||||
this[TOKEN_VALUE_ID] = String(value);
|
this[TOKEN_VALUE_ID] = String(value);
|
||||||
|
|||||||
@@ -15,11 +15,15 @@ import { Token, TYPE_ATTR_NAME, TYPE_ATTR_VALUE, TYPE_NEW_LINE, TYPE_SPACE, TYPE
|
|||||||
|
|
||||||
const EM = '!';
|
const EM = '!';
|
||||||
|
|
||||||
const createCharGrabber = (source) => {
|
const createCharGrabber = (source, { onSkip } = {}) => {
|
||||||
let idx = 0;
|
let idx = 0;
|
||||||
|
|
||||||
const skip = () => {
|
const skip = () => {
|
||||||
idx += 1;
|
idx += 1;
|
||||||
|
|
||||||
|
if (onSkip) {
|
||||||
|
onSkip();
|
||||||
|
}
|
||||||
};
|
};
|
||||||
const hasNext = () => source.length > idx;
|
const hasNext = () => source.length > idx;
|
||||||
const getRest = () => source.substr(idx);
|
const getRest = () => source.substr(idx);
|
||||||
@@ -40,9 +44,6 @@ const createCharGrabber = (source) => {
|
|||||||
getNext: () => source[idx + 1],
|
getNext: () => source[idx + 1],
|
||||||
getPrev: () => source[idx - 1],
|
getPrev: () => source[idx - 1],
|
||||||
getCurr: () => source[idx],
|
getCurr: () => source[idx],
|
||||||
moveIdxTo: (val) => {
|
|
||||||
idx += val;
|
|
||||||
},
|
|
||||||
getRest,
|
getRest,
|
||||||
substrUntilChar: (char) => {
|
substrUntilChar: (char) => {
|
||||||
const restStr = getRest();
|
const restStr = getRest();
|
||||||
@@ -72,6 +73,20 @@ const trimChar = (str, charToRemove) => {
|
|||||||
const unquote = str => str.replace(BACKSLASH + QUOTEMARK, QUOTEMARK);
|
const unquote = str => str.replace(BACKSLASH + QUOTEMARK, QUOTEMARK);
|
||||||
const createToken = (type, value, r = 0, cl = 0) => new Token(type, value, r, cl);
|
const createToken = (type, value, r = 0, cl = 0) => new Token(type, value, r, cl);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @typedef {Object} Lexer
|
||||||
|
* @property {Function} tokenize
|
||||||
|
* @property {Function} isTokenNested
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {String} buffer
|
||||||
|
* @param {Object} options
|
||||||
|
* @param {Function} options.onToken
|
||||||
|
* @param {String} options.openTag
|
||||||
|
* @param {String} options.closeTag
|
||||||
|
* @return {Lexer}
|
||||||
|
*/
|
||||||
function createLexer(buffer, options = {}) {
|
function createLexer(buffer, options = {}) {
|
||||||
let row = 0;
|
let row = 0;
|
||||||
let col = 0;
|
let col = 0;
|
||||||
@@ -158,7 +173,11 @@ function createLexer(buffer, options = {}) {
|
|||||||
return { tag: tagName, attrs: attrTokens };
|
return { tag: tagName, attrs: attrTokens };
|
||||||
};
|
};
|
||||||
|
|
||||||
const bufferGrabber = createCharGrabber(buffer);
|
const bufferGrabber = createCharGrabber(buffer, {
|
||||||
|
onSkip: () => {
|
||||||
|
col++;
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
const next = () => {
|
const next = () => {
|
||||||
const char = bufferGrabber.getCurr();
|
const char = bufferGrabber.getCurr();
|
||||||
|
|||||||
Reference in New Issue
Block a user