mirror of
https://github.com/tenrok/BBob.git
synced 2026-05-15 11:59:37 +03:00
feat(parser): optimize size
This commit is contained in:
@@ -80,6 +80,10 @@ class Token {
|
||||
return isAttrValueToken(this);
|
||||
}
|
||||
|
||||
isStart() {
|
||||
return isTagStart(this);
|
||||
}
|
||||
|
||||
isEnd() {
|
||||
return isTagEnd(this);
|
||||
}
|
||||
@@ -117,15 +121,3 @@ module.exports.TYPE_ATTR_NAME = TOKEN_TYPE_ATTR_NAME;
|
||||
module.exports.TYPE_ATTR_VALUE = TOKEN_TYPE_ATTR_VALUE;
|
||||
module.exports.TYPE_SPACE = TOKEN_TYPE_SPACE;
|
||||
module.exports.TYPE_NEW_LINE = TOKEN_TYPE_NEW_LINE;
|
||||
|
||||
module.exports.convertTagToText = convertTagToText;
|
||||
module.exports.getTagName = getTagName;
|
||||
module.exports.getTokenColumn = getTokenColumn;
|
||||
module.exports.getTokenLine = getTokenLine;
|
||||
module.exports.getTokenValue = getTokenValue;
|
||||
module.exports.isAttrNameToken = isAttrNameToken;
|
||||
module.exports.isAttrValueToken = isAttrValueToken;
|
||||
module.exports.isTagStart = isTagStart;
|
||||
module.exports.isTagToken = isTagToken;
|
||||
module.exports.isTextToken = isTextToken;
|
||||
module.exports.isTagEnd = isTagEnd;
|
||||
|
||||
@@ -339,27 +339,10 @@ class Tokenizer {
|
||||
}
|
||||
|
||||
isTokenNested(token) {
|
||||
const value = getChar(OPEN_BRAKET) + getChar(SLASH) + Token.getTokenValue(token);
|
||||
const value = getChar(OPEN_BRAKET) + getChar(SLASH) + token.getValue();
|
||||
return this.buffer.indexOf(value) > -1;
|
||||
}
|
||||
}
|
||||
|
||||
new Tokenizer('[ [g]G[/g] ]').tokenize()
|
||||
|
||||
module.exports = Tokenizer;
|
||||
module.exports.createTokenOfType = createTokenOfType;
|
||||
module.exports.TYPE = {
|
||||
WORD: Token.TYPE_WORD,
|
||||
TAG: Token.TYPE_TAG,
|
||||
ATTR_NAME: Token.TYPE_ATTR_NAME,
|
||||
ATTR_VALUE: Token.TYPE_ATTR_VALUE,
|
||||
SPACE: Token.TYPE_SPACE,
|
||||
NEW_LINE: Token.TYPE_NEW_LINE,
|
||||
};
|
||||
module.exports.TOKEN = {
|
||||
TYPE_ID: Token.TYPE_ID,
|
||||
VALUE_ID: Token.VALUE_ID,
|
||||
LINE_ID: Token.LINE_ID,
|
||||
COLUMN_ID: Token.COLUMN_ID,
|
||||
};
|
||||
|
||||
|
||||
@@ -1,17 +1,3 @@
|
||||
const {
|
||||
convertTagToText,
|
||||
getTagName,
|
||||
getTokenColumn,
|
||||
getTokenLine,
|
||||
getTokenValue,
|
||||
isAttrNameToken,
|
||||
isAttrValueToken,
|
||||
isTagStart,
|
||||
isTagToken,
|
||||
isTextToken,
|
||||
isTagEnd,
|
||||
} = require('./Token');
|
||||
|
||||
const Tokenizer = require('./Tokenizer');
|
||||
const TagNode = require('./TagNode');
|
||||
|
||||
@@ -67,14 +53,16 @@ const getTagNode = () => (tagNodes.length ? tagNodes[tagNodes.length - 1] : null
|
||||
|
||||
/**
|
||||
* @private
|
||||
* @param {Token} token
|
||||
* @return {Array}
|
||||
*/
|
||||
const createTagNode = token => tagNodes.push(newTagNode(getTokenValue(token)));
|
||||
const createTagNode = token => tagNodes.push(newTagNode(token.getValue()));
|
||||
/**
|
||||
* @private
|
||||
* @param {Token} token
|
||||
* @return {Array}
|
||||
*/
|
||||
const createTagNodeAttrName = token => tagNodesAttrName.push(getTokenValue(token));
|
||||
const createTagNodeAttrName = token => tagNodesAttrName.push(token.getValue());
|
||||
|
||||
/**
|
||||
* @private
|
||||
@@ -140,10 +128,10 @@ const isAllowedTag = (value) => {
|
||||
};
|
||||
/**
|
||||
* @private
|
||||
* @param token
|
||||
* @param {Token} token
|
||||
*/
|
||||
const handleTagStart = (token) => {
|
||||
if (isTagStart(token)) {
|
||||
if (token.isStart()) {
|
||||
createTagNode(token);
|
||||
|
||||
if (isTagNested(token)) {
|
||||
@@ -157,10 +145,10 @@ const handleTagStart = (token) => {
|
||||
|
||||
/**
|
||||
* @private
|
||||
* @param token
|
||||
* @param {Token} token
|
||||
*/
|
||||
const handleTagEnd = (token) => {
|
||||
if (isTagEnd(token)) {
|
||||
if (token.isEnd()) {
|
||||
clearTagNode();
|
||||
|
||||
const lastNestedNode = nestedNodes.pop();
|
||||
@@ -168,9 +156,9 @@ const handleTagEnd = (token) => {
|
||||
if (lastNestedNode) {
|
||||
appendNode(lastNestedNode);
|
||||
} else if (options.onError) {
|
||||
const tag = getTokenValue(token);
|
||||
const line = getTokenLine(token);
|
||||
const column = getTokenColumn(token);
|
||||
const tag = token.getValue();
|
||||
const line = token.getLine();
|
||||
const column = token.getColumn();
|
||||
options.onError({
|
||||
message: `Inconsistent tag '${tag}' on line ${line} and column ${column}`,
|
||||
lineNumber: line,
|
||||
@@ -182,41 +170,41 @@ const handleTagEnd = (token) => {
|
||||
|
||||
/**
|
||||
* @private
|
||||
* @param token
|
||||
* @param {Token} token
|
||||
*/
|
||||
const handleTagToken = (token) => {
|
||||
if (isTagToken(token)) {
|
||||
if (isAllowedTag(getTagName(token))) {
|
||||
if (token.isTag()) {
|
||||
if (isAllowedTag(token.getName())) {
|
||||
// [tag]
|
||||
handleTagStart(token);
|
||||
|
||||
// [/tag]
|
||||
handleTagEnd(token);
|
||||
} else {
|
||||
appendNode(convertTagToText(token));
|
||||
appendNode(token.toString());
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* @private
|
||||
* @param token
|
||||
* @param {Token} token
|
||||
*/
|
||||
const handleTagNode = (token) => {
|
||||
const tagNode = getTagNode();
|
||||
|
||||
if (tagNode) {
|
||||
if (isAttrNameToken(token)) {
|
||||
if (token.isAttrName()) {
|
||||
createTagNodeAttrName(token);
|
||||
tagNode.attr(getTagNodeAttrName(), null);
|
||||
} else if (isAttrValueToken(token)) {
|
||||
tagNode.attr(getTagNodeAttrName(), getTokenValue(token));
|
||||
} else if (token.isAttrValue()) {
|
||||
tagNode.attr(getTagNodeAttrName(), token.getValue());
|
||||
clearTagNodeAttrName();
|
||||
} else if (isTextToken(token)) {
|
||||
tagNode.append(getTokenValue(token));
|
||||
} else if (token.isText()) {
|
||||
tagNode.append(token.getValue());
|
||||
}
|
||||
} else if (isTextToken(token)) {
|
||||
appendNode(getTokenValue(token));
|
||||
} else if (token.isText()) {
|
||||
appendNode(token.getValue());
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -1,6 +1,14 @@
|
||||
const Tokenizer = require('../lib/Tokenizer');
|
||||
const Token = require('../lib/Token');
|
||||
|
||||
const { TYPE } = Tokenizer;
|
||||
const TYPE = {
|
||||
WORD: Token.TYPE_WORD,
|
||||
TAG: Token.TYPE_TAG,
|
||||
ATTR_NAME: Token.TYPE_ATTR_NAME,
|
||||
ATTR_VALUE: Token.TYPE_ATTR_VALUE,
|
||||
SPACE: Token.TYPE_SPACE,
|
||||
NEW_LINE: Token.TYPE_NEW_LINE,
|
||||
};
|
||||
|
||||
const tokenize = input => (new Tokenizer(input).tokenize());
|
||||
|
||||
|
||||
Reference in New Issue
Block a user