Skip to content

Commit

Permalink
parse expressions
Browse files Browse the repository at this point in the history
  • Loading branch information
kbrsh committed Apr 29, 2018
1 parent 1da4378 commit c438218
Show file tree
Hide file tree
Showing 3 changed files with 91 additions and 15 deletions.
52 changes: 45 additions & 7 deletions dist/moon.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
}
};

var expressionRE = /"[^"]*"|'[^']*'|\d+[a-zA-Z$_]\w*|\.[a-zA-Z$_]\w*|[a-zA-Z$_]\w*:|([a-zA-Z$_]\w*)/g;
var escapeRE = /(?:(?:&(?:amp|gt|lt|nbsp|quot);)|"|\\|\n)/g;
var escapeMap = {
"&": '&',
Expand All @@ -41,14 +42,14 @@
stack[stack.length - 1].children.push(child);
};

var parseComment = function (index, input, length, stack) {
for (; index < length;) {
var parseComment = function (index, input, length) {
while (index < length) {
var char0 = input[index];
var char1 = input[index + 1];
var char2 = input[index + 2];

if (char0 === "<" && char1 === "!" && char2 === "-" && input[index + 3] === "-") {
index = parseComment(index + 4, input, length, stack);
index = parseComment(index + 4, input, length);
} else if (char0 === "-" && char1 === "-" && char2 === ">") {
index += 3;
break;
Expand Down Expand Up @@ -123,7 +124,7 @@
for (; index < length; index++) {
var char = input[index];

if (char === "<") {
if (char === "<" || char === "{") {
break;
} else {
content += char;
Expand All @@ -139,12 +140,47 @@
return index;
};

var parseExpression = function (index, input, length, stack, dependencies, locals) {
var expression = "";

for (; index < length; index++) {
var char = input[index];

if (char === "}") {
index += 1;
break;
} else {
expression += char;
}
}

var info;
while ((info = expressionRE.exec(expression)) !== null) {
var name = info[1];
if (name !== undefined && locals.indexOf(name) === -1) {
dependencies.push(name);
}
}

pushChild({
index: parseIndex++,
type: "m-expression",
content: expression
}, stack);

return index;
};

var parse = function (input) {
var length = input.length;
var dependencies = [];
var locals = ["NaN", "false", "in", "instance", "m", "null", "true", "typeof", "undefined"];
parseIndex = 0;

var root = {
children: []
type: "@",
children: [],
dependencies: dependencies
};

var stack = [root];
Expand All @@ -154,18 +190,20 @@

if (char === "<") {
if (input[i + 1] === "!" && input[i + 2] === "-" && input[i + 3] === "-") {
i = parseComment(i + 4, input, length, stack);
i = parseComment(i + 4, input, length);
} else if (input[i + 1] === "/") {
i = parseClosingTag(i + 2, input, length, stack);
} else {
i = parseOpeningTag(i + 1, input, length, stack);
}
} else if (char === "{") {
i = parseExpression(i + 1, input, length, stack, dependencies, locals);
} else {
i = parseText(i, input, length, stack);
}
}

return root.children;
return root;
};

var generateCreate = function (element) {
Expand Down
2 changes: 1 addition & 1 deletion dist/moon.min.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

52 changes: 45 additions & 7 deletions src/compiler/parser.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { error } from "../util/util";

const expressionRE = /"[^"]*"|'[^']*'|\d+[a-zA-Z$_]\w*|\.[a-zA-Z$_]\w*|[a-zA-Z$_]\w*:|([a-zA-Z$_]\w*)/g;
const escapeRE = /(?:(?:&(?:amp|gt|lt|nbsp|quot);)|"|\\|\n)/g;
const escapeMap = {
"&amp;": '&',
Expand All @@ -18,14 +19,14 @@ const pushChild = (child, stack) => {
stack[stack.length - 1].children.push(child);
};

const parseComment = (index, input, length, stack) => {
for (; index < length;) {
const parseComment = (index, input, length) => {
while (index < length) {
const char0 = input[index];
const char1 = input[index + 1];
const char2 = input[index + 2];

if (char0 === "<" && char1 === "!" && char2 === "-" && input[index + 3] === "-") {
index = parseComment(index + 4, input, length, stack);
index = parseComment(index + 4, input, length);
} else if (char0 === "-" && char1 === "-" && char2 === ">") {
index += 3;
break;
Expand Down Expand Up @@ -100,7 +101,7 @@ const parseText = (index, input, length, stack) => {
for (; index < length; index++) {
const char = input[index];

if (char === "<") {
if (char === "<" || char === "{") {
break;
} else {
content += char;
Expand All @@ -116,12 +117,47 @@ const parseText = (index, input, length, stack) => {
return index;
};

const parseExpression = (index, input, length, stack, dependencies, locals) => {
let expression = "";

for (; index < length; index++) {
const char = input[index];

if (char === "}") {
index += 1;
break;
} else {
expression += char;
}
}

let info;
while ((info = expressionRE.exec(expression)) !== null) {
let name = info[1];
if (name !== undefined && locals.indexOf(name) === -1) {
dependencies.push(name);
}
}

pushChild({
index: parseIndex++,
type: "m-expression",
content: expression
}, stack);

return index;
};

export const parse = (input) => {
const length = input.length;
let dependencies = [];
let locals = ["NaN", "false", "in", "instance", "m", "null", "true", "typeof", "undefined"];
parseIndex = 0;

const root = {
children: []
type: "@",
children: [],
dependencies: dependencies
};

let stack = [root];
Expand All @@ -131,16 +167,18 @@ export const parse = (input) => {

if (char === "<") {
if (input[i + 1] === "!" && input[i + 2] === "-" && input[i + 3] === "-") {
i = parseComment(i + 4, input, length, stack);
i = parseComment(i + 4, input, length);
} else if (input[i + 1] === "/") {
i = parseClosingTag(i + 2, input, length, stack);
} else {
i = parseOpeningTag(i + 1, input, length, stack);
}
} else if (char === "{") {
i = parseExpression(i + 1, input, length, stack, dependencies, locals);
} else {
i = parseText(i, input, length, stack);
}
}

return root.children;
return root;
};

0 comments on commit c438218

Please sign in to comment.