Skip to content

Commit

Permalink
compile arguments & events, consistent formatting
Browse files Browse the repository at this point in the history
  • Loading branch information
kbrsh committed May 13, 2018
1 parent 8118cad commit c123582
Show file tree
Hide file tree
Showing 9 changed files with 72 additions and 22 deletions.
45 changes: 35 additions & 10 deletions dist/moon.js
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@
continue;
} else {
var key = "";
var argument = "";
var value = "";
var expression = false;

Expand All @@ -87,6 +88,12 @@
} else if (char === "=") {
index += 1;
break;
} else if (char === ":" && key[0] === "m" && key[1] === "-") {
argument += input[index + 1];
index += 2;
} else if (argument.length !== 0) {
argument += char;
index += 1;
} else {
key += char;
index += 1;
Expand Down Expand Up @@ -126,6 +133,7 @@
attributes.push({
key: key,
value: value,
argument: argument,
expression: expression,
dynamic: expression && parseTemplate(value, dependencies, locals)
});
Expand Down Expand Up @@ -260,7 +268,7 @@
var parse = function (input) {
var length = input.length;
var dependencies = [];
var locals = ["NaN", "false", "in", "null", "true", "typeof", "undefined"];
var locals = ["NaN", "event", "false", "in", "null", "true", "typeof", "undefined"];

var root = {
type: "m-fragment",
Expand Down Expand Up @@ -295,20 +303,37 @@

var mapReduce = function (arr, fn) { return arr.reduce(function (result, current) { return result + fn(current); }, ""); };

var attributeValue = function (attribute) { return attribute.expression ? attribute.value : ("\"" + (attribute.value) + "\""); };

var generateCreateAttributes = function (element) { return mapReduce(element.attributes, function (attribute) {
var key = attribute.key;

switch (key) {
case "m-for":
break;
case "m-if":
break;
case "m-on":
return ("m[" + (element.index) + "].addEventListener(\"" + (attribute.argument) + "\", function(event){" + (attributeValue(attribute)) + "});");
break;
default:
return ("m[" + (element.index) + "].setAttribute(\"" + key + "\"," + (attributeValue(attribute)) + ");");
}
}); };

var generateCreate = function (element) {
switch (element.type) {
case "m-fragment":
return mapReduce(element.children, generateCreate);
break;
case "m-expression":
return ("m[" + (element.index) + "] = m.ct(" + (element.content) + ");");
return ("m[" + (element.index) + "]=m.ct(" + (element.content) + ");");
break;
case "m-text":
return ("m[" + (element.index) + "] = m.ct(\"" + (element.content) + "\");");
return ("m[" + (element.index) + "]=m.ct(\"" + (element.content) + "\");");
break;
default:
var elementPath = "m[" + (element.index) + "]";
return ("" + (mapReduce(element.children, generateCreate)) + elementPath + " = m.ce(\"" + (element.type) + "\");" + (mapReduce(element.attributes, function (attribute) { return (elementPath + ".setAttribute(\"" + (attribute.key) + "\", " + (attribute.expression ? attribute.value : ("\"" + (attribute.value) + "\"")) + ");"); })));
return ((mapReduce(element.children, generateCreate)) + "m[" + (element.index) + "]=m.ce(\"" + (element.type) + "\");" + (generateCreateAttributes(element)));
}
};

Expand All @@ -326,7 +351,7 @@
generatedMount += mapReduce(element.children, function (child) { return generateMount(child, elementPath); });
}

generatedMount += "m.ma(" + elementPath + ", " + parent + ");";
generatedMount += "m.ma(" + elementPath + "," + parent + ");";
}

return generatedMount;
Expand All @@ -335,20 +360,20 @@
var generateUpdate = function (element) {
switch (element.type) {
case "m-expression":
return element.dynamic ? ("m.ut(m[" + (element.index) + "], " + (element.content) + ");") : "";
return element.dynamic ? ("m.ut(m[" + (element.index) + "]," + (element.content) + ");") : "";
break;
case "m-text":
return "";
break;
default:
var elementPath = "m[" + (element.index) + "]";
return mapReduce(element.attributes, function (attribute) { return attribute.dynamic ? (elementPath + ".setAttribute(\"" + (attribute.key) + "\", " + (attribute.value) + ");") : ""; }) + mapReduce(element.children, generateUpdate);
return mapReduce(element.attributes, function (attribute) { return attribute.dynamic ? (elementPath + ".setAttribute(\"" + (attribute.key) + "\"," + (attribute.value) + ");") : ""; }) + mapReduce(element.children, generateUpdate);
}
};

var generate = function (tree) {
var prelude = "var m = this.m;" + mapReduce(tree.dependencies, function (dependency) { return ("var " + dependency + " = this.data." + dependency + ";"); });
return new Function(("return [function(){" + prelude + (generateCreate(tree)) + "},function(root){var m = this.m;" + (generateMount(tree, "root")) + "},function(){" + prelude + (generateUpdate(tree)) + "}]"))();
var prelude = "var m=this.m;" + mapReduce(tree.dependencies, function (dependency) { return ("var " + dependency + "=this.data." + dependency + ";"); });
return new Function(("return [function(){" + prelude + (generateCreate(tree)) + "},function(root){var m=this.m;" + (generateMount(tree, "root")) + "},function(){" + prelude + (generateUpdate(tree)) + "}]"))();
};

var compile = function (input) {
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.

25 changes: 20 additions & 5 deletions src/compiler/generator/create.js
Original file line number Diff line number Diff line change
@@ -1,18 +1,33 @@
import { mapReduce } from "./util";
import { attributeValue, mapReduce } from "./util";

const generateCreateAttributes = (element) => mapReduce(element.attributes, (attribute) => {
const key = attribute.key;

switch (key) {
case "m-for":
break;
case "m-if":
break;
case "m-on":
return `m[${element.index}].addEventListener("${attribute.argument}", function(event){${attributeValue(attribute)}});`;
break;
default:
return `m[${element.index}].setAttribute("${key}",${attributeValue(attribute)});`;
}
});

export const generateCreate = (element) => {
switch (element.type) {
case "m-fragment":
return mapReduce(element.children, generateCreate);
break;
case "m-expression":
return `m[${element.index}] = m.ct(${element.content});`;
return `m[${element.index}]=m.ct(${element.content});`;
break;
case "m-text":
return `m[${element.index}] = m.ct("${element.content}");`;
return `m[${element.index}]=m.ct("${element.content}");`;
break;
default:
const elementPath = `m[${element.index}]`;
return `${mapReduce(element.children, generateCreate)}${elementPath} = m.ce("${element.type}");${mapReduce(element.attributes, (attribute) => `${elementPath}.setAttribute("${attribute.key}", ${attribute.expression ? attribute.value : `"${attribute.value}"`});`)}`;
return `${mapReduce(element.children, generateCreate)}m[${element.index}]=m.ce("${element.type}");${generateCreateAttributes(element)}`;
}
};
4 changes: 2 additions & 2 deletions src/compiler/generator/generator.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,6 @@ import { generateMount } from "./mount";
import { generateUpdate } from "./update";

export const generate = (tree) => {
const prelude = "var m = this.m;" + mapReduce(tree.dependencies, (dependency) => `var ${dependency} = this.data.${dependency};`);
return new Function(`return [function(){${prelude}${generateCreate(tree)}},function(root){var m = this.m;${generateMount(tree, "root")}},function(){${prelude}${generateUpdate(tree)}}]`)();
const prelude = "var m=this.m;" + mapReduce(tree.dependencies, (dependency) => `var ${dependency}=this.data.${dependency};`);
return new Function(`return [function(){${prelude}${generateCreate(tree)}},function(root){var m=this.m;${generateMount(tree, "root")}},function(){${prelude}${generateUpdate(tree)}}]`)();
};
2 changes: 1 addition & 1 deletion src/compiler/generator/mount.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ export const generateMount = (element, parent) => {
generatedMount += mapReduce(element.children, (child) => generateMount(child, elementPath));
}

generatedMount += `m.ma(${elementPath}, ${parent});`;
generatedMount += `m.ma(${elementPath},${parent});`;
}

return generatedMount;
Expand Down
4 changes: 2 additions & 2 deletions src/compiler/generator/update.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,13 @@ import { mapReduce } from "./util";
export const generateUpdate = (element) => {
switch (element.type) {
case "m-expression":
return element.dynamic ? `m.ut(m[${element.index}], ${element.content});` : "";
return element.dynamic ? `m.ut(m[${element.index}],${element.content});` : "";
break;
case "m-text":
return "";
break;
default:
const elementPath = `m[${element.index}]`;
return mapReduce(element.attributes, (attribute) => attribute.dynamic ? `${elementPath}.setAttribute("${attribute.key}", ${attribute.value});` : "") + mapReduce(element.children, generateUpdate);
return mapReduce(element.attributes, (attribute) => attribute.dynamic ? `${elementPath}.setAttribute("${attribute.key}",${attribute.value});` : "") + mapReduce(element.children, generateUpdate);
}
};
2 changes: 2 additions & 0 deletions src/compiler/generator/util.js
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
export const mapReduce = (arr, fn) => arr.reduce((result, current) => result + fn(current), "");

export const attributeValue = (attribute) => attribute.expression ? attribute.value : `"${attribute.value}"`;
2 changes: 1 addition & 1 deletion src/compiler/parser/parser.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import { parseExpression } from "./expression";
export const parse = (input) => {
const length = input.length;
let dependencies = [];
let locals = ["NaN", "false", "in", "null", "true", "typeof", "undefined"];
let locals = ["NaN", "event", "false", "in", "null", "true", "typeof", "undefined"];

const root = {
type: "m-fragment",
Expand Down
8 changes: 8 additions & 0 deletions src/compiler/parser/tag.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ const parseAttributes = (index, input, length, attributes, dependencies, locals)
continue;
} else {
let key = "";
let argument = "";
let value = "";
let expression = false;

Expand All @@ -26,6 +27,12 @@ const parseAttributes = (index, input, length, attributes, dependencies, locals)
} else if (char === "=") {
index += 1;
break;
} else if (char === ":" && key[0] === "m" && key[1] === "-") {
argument += input[index + 1];
index += 2;
} else if (argument.length !== 0) {
argument += char;
index += 1;
} else {
key += char;
index += 1;
Expand Down Expand Up @@ -65,6 +72,7 @@ const parseAttributes = (index, input, length, attributes, dependencies, locals)
attributes.push({
key: key,
value: value,
argument: argument,
expression: expression,
dynamic: expression && parseTemplate(value, dependencies, locals)
});
Expand Down

0 comments on commit c123582

Please sign in to comment.