2
0
mirror of https://github.com/tenrok/BBob.git synced 2026-06-17 19:21:20 +03:00

feat(parser): optimize size

This commit is contained in:
Nikolay Kostyurin
2018-07-14 01:50:33 +02:00
parent 0bea22d3ca
commit 4c8dbed95f
4 changed files with 37 additions and 66 deletions
+4 -12
View File
@@ -80,6 +80,10 @@ class Token {
return isAttrValueToken(this); return isAttrValueToken(this);
} }
isStart() {
return isTagStart(this);
}
isEnd() { isEnd() {
return isTagEnd(this); 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_ATTR_VALUE = TOKEN_TYPE_ATTR_VALUE;
module.exports.TYPE_SPACE = TOKEN_TYPE_SPACE; module.exports.TYPE_SPACE = TOKEN_TYPE_SPACE;
module.exports.TYPE_NEW_LINE = TOKEN_TYPE_NEW_LINE; 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;
+1 -18
View File
@@ -339,27 +339,10 @@ class Tokenizer {
} }
isTokenNested(token) { 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; return this.buffer.indexOf(value) > -1;
} }
} }
new Tokenizer('[ [g]G[/g] ]').tokenize()
module.exports = Tokenizer; module.exports = Tokenizer;
module.exports.createTokenOfType = createTokenOfType; 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,
};
+23 -35
View File
@@ -1,17 +1,3 @@
const {
convertTagToText,
getTagName,
getTokenColumn,
getTokenLine,
getTokenValue,
isAttrNameToken,
isAttrValueToken,
isTagStart,
isTagToken,
isTextToken,
isTagEnd,
} = require('./Token');
const Tokenizer = require('./Tokenizer'); const Tokenizer = require('./Tokenizer');
const TagNode = require('./TagNode'); const TagNode = require('./TagNode');
@@ -67,14 +53,16 @@ const getTagNode = () => (tagNodes.length ? tagNodes[tagNodes.length - 1] : null
/** /**
* @private * @private
* @param {Token} token
* @return {Array} * @return {Array}
*/ */
const createTagNode = token => tagNodes.push(newTagNode(getTokenValue(token))); const createTagNode = token => tagNodes.push(newTagNode(token.getValue()));
/** /**
* @private * @private
* @param {Token} token
* @return {Array} * @return {Array}
*/ */
const createTagNodeAttrName = token => tagNodesAttrName.push(getTokenValue(token)); const createTagNodeAttrName = token => tagNodesAttrName.push(token.getValue());
/** /**
* @private * @private
@@ -140,10 +128,10 @@ const isAllowedTag = (value) => {
}; };
/** /**
* @private * @private
* @param token * @param {Token} token
*/ */
const handleTagStart = (token) => { const handleTagStart = (token) => {
if (isTagStart(token)) { if (token.isStart()) {
createTagNode(token); createTagNode(token);
if (isTagNested(token)) { if (isTagNested(token)) {
@@ -157,10 +145,10 @@ const handleTagStart = (token) => {
/** /**
* @private * @private
* @param token * @param {Token} token
*/ */
const handleTagEnd = (token) => { const handleTagEnd = (token) => {
if (isTagEnd(token)) { if (token.isEnd()) {
clearTagNode(); clearTagNode();
const lastNestedNode = nestedNodes.pop(); const lastNestedNode = nestedNodes.pop();
@@ -168,9 +156,9 @@ const handleTagEnd = (token) => {
if (lastNestedNode) { if (lastNestedNode) {
appendNode(lastNestedNode); appendNode(lastNestedNode);
} else if (options.onError) { } else if (options.onError) {
const tag = getTokenValue(token); const tag = token.getValue();
const line = getTokenLine(token); const line = token.getLine();
const column = getTokenColumn(token); const column = token.getColumn();
options.onError({ options.onError({
message: `Inconsistent tag '${tag}' on line ${line} and column ${column}`, message: `Inconsistent tag '${tag}' on line ${line} and column ${column}`,
lineNumber: line, lineNumber: line,
@@ -182,41 +170,41 @@ const handleTagEnd = (token) => {
/** /**
* @private * @private
* @param token * @param {Token} token
*/ */
const handleTagToken = (token) => { const handleTagToken = (token) => {
if (isTagToken(token)) { if (token.isTag()) {
if (isAllowedTag(getTagName(token))) { if (isAllowedTag(token.getName())) {
// [tag] // [tag]
handleTagStart(token); handleTagStart(token);
// [/tag] // [/tag]
handleTagEnd(token); handleTagEnd(token);
} else { } else {
appendNode(convertTagToText(token)); appendNode(token.toString());
} }
} }
}; };
/** /**
* @private * @private
* @param token * @param {Token} token
*/ */
const handleTagNode = (token) => { const handleTagNode = (token) => {
const tagNode = getTagNode(); const tagNode = getTagNode();
if (tagNode) { if (tagNode) {
if (isAttrNameToken(token)) { if (token.isAttrName()) {
createTagNodeAttrName(token); createTagNodeAttrName(token);
tagNode.attr(getTagNodeAttrName(), null); tagNode.attr(getTagNodeAttrName(), null);
} else if (isAttrValueToken(token)) { } else if (token.isAttrValue()) {
tagNode.attr(getTagNodeAttrName(), getTokenValue(token)); tagNode.attr(getTagNodeAttrName(), token.getValue());
clearTagNodeAttrName(); clearTagNodeAttrName();
} else if (isTextToken(token)) { } else if (token.isText()) {
tagNode.append(getTokenValue(token)); tagNode.append(token.getValue());
} }
} else if (isTextToken(token)) { } else if (token.isText()) {
appendNode(getTokenValue(token)); appendNode(token.getValue());
} }
}; };
+9 -1
View File
@@ -1,6 +1,14 @@
const Tokenizer = require('../lib/Tokenizer'); 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()); const tokenize = input => (new Tokenizer(input).tokenize());