53 lines
1.0 KiB
JavaScript
53 lines
1.0 KiB
JavaScript
"use strict";
|
|
const Literal = require("./literal");
|
|
const isLiteral = token => token[0] === "word" && /^\$\{[\s\S]*\}$/.test(token[1]);
|
|
function literal (start) {
|
|
if (!isLiteral(start)) {
|
|
return;
|
|
}
|
|
const tokens = [];
|
|
let hasWord;
|
|
let type;
|
|
let token;
|
|
while ((token = this.tokenizer.nextToken())) {
|
|
tokens.push(token);
|
|
type = token[0];
|
|
if (type.length === 1) {
|
|
break;
|
|
} else if (type === "word") {
|
|
hasWord = true;
|
|
}
|
|
}
|
|
|
|
while (tokens.length) {
|
|
this.tokenizer.back(tokens.pop());
|
|
}
|
|
|
|
if (type === "{" || (type === ":" && !hasWord)) {
|
|
return;
|
|
}
|
|
|
|
const node = new Literal({
|
|
text: start[1],
|
|
});
|
|
|
|
this.init(node, start[2], start[3]);
|
|
|
|
return node;
|
|
}
|
|
|
|
function freeSemicolon (token) {
|
|
this.spaces += token[1];
|
|
const nodes = this.current.nodes;
|
|
const prev = nodes && nodes[nodes.length - 1];
|
|
if (prev && /^(rule|literal)$/.test(prev.type) && !prev.raws.ownSemicolon) {
|
|
prev.raws.ownSemicolon = this.spaces;
|
|
this.spaces = "";
|
|
}
|
|
}
|
|
|
|
module.exports = {
|
|
freeSemicolon: freeSemicolon,
|
|
literal: literal,
|
|
};
|