diff --git a/.gitignore b/.gitignore index 38e02923d..1770453b9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ -parser.js +build node_modules +parser.js diff --git a/MJLite.js b/MJLite.js index 819d6e29e..57164ee61 100644 --- a/MJLite.js +++ b/MJLite.js @@ -1,111 +1,109 @@ -var MJLite = (function() { +var parser = require("./parser"); - var buildExpression = function(expression) { - return _.map(expression, function(ex, i) { - var prev = i > 0 ? expression[i-1] : null; +var buildExpression = function(expression) { + return _.map(expression, function(ex, i) { + var prev = i > 0 ? expression[i-1] : null; - return buildGroup(ex, prev); + return buildGroup(ex, prev); + }); +}; + +var makeSpan = function(className, children) { + var span = document.createElement("span"); + span.className = className; + + if (_.isArray(children)) { + _.each(children, function(v) { + span.appendChild(v); }); - }; + } else if (children) { + span.appendChild(children); + } - var makeSpan = function(className, children) { - var span = document.createElement("span"); - span.className = className; + return span; +}; - if (_.isArray(children)) { - _.each(children, function(v) { - span.appendChild(v); - }); - } else if (children) { - span.appendChild(children); +var buildGroup = function(group, prev) { + if (group.type === "ord") { + return makeSpan("mord", mathit(group.value)); + } else if (group.type === "bin") { + var className = "mbin"; + if (prev == null || prev.type === "bin" || prev.type === "open") { + group.type = "ord"; + className = "mord"; } + return makeSpan(className, textit(group.value)); + } else if (group.type === "sup") { + var sup = makeSpan("msup", buildExpression(group.value.sup)); + return makeSpan("mord", buildExpression(group.value.base).concat(sup)); + } else if (group.type === "sub") { + var sub = makeSpan("msub", buildExpression(group.value.sub, sub)); + return makeSpan("mord", buildExpression(group.value.base, elem).concat(sub)); + } else if (group.type === "supsub") { + var sup = makeSpan("msup", buildExpression(group.value.sup, sup)); + var sub = makeSpan("msub", buildExpression(group.value.sub, sub)); - return span; - }; + var supsub = makeSpan("msupsub", [sup, sub]); - var buildGroup = function(group, prev) { - if (group.type === "ord") { - return makeSpan("mord", mathit(group.value)); - } else if (group.type === "bin") { - var className = "mbin"; - if (prev == null || prev.type === "bin" || prev.type === "open") { - group.type = "ord"; - className = "mord"; - } - return makeSpan(className, textit(group.value)); - } else if (group.type === "sup") { - var sup = makeSpan("msup", buildExpression(group.value.sup)); - return makeSpan("mord", buildExpression(group.value.base).concat(sup)); - } else if (group.type === "sub") { - var sub = makeSpan("msub", buildExpression(group.value.sub, sub)); - return makeSpan("mord", buildExpression(group.value.base, elem).concat(sub)); - } else if (group.type === "supsub") { - var sup = makeSpan("msup", buildExpression(group.value.sup, sup)); - var sub = makeSpan("msub", buildExpression(group.value.sub, sub)); + return makeSpan("mord", buildExpression(group.value.base, elem).concat(supsub)); + } else if (group.type === "open") { + return makeSpan("mopen", textit(group.value)); + } else if (group.type === "close") { + return makeSpan("mclose", textit(group.value)); + } else if (group.type === "frac") { + var numer = makeSpan("mfracnum", buildExpression(group.value.numer, numer)); + var mid = makeSpan("mfracmid", makeSpan()); + var denom = makeSpan("mfracden", buildExpression(group.value.denom, denom)); - var supsub = makeSpan("msupsub", [sup, sub]); + return makeSpan("mord mfrac", [numer, mid, denom]); + } else { + console.log("Unknown type:", group.type); + } +}; - return makeSpan("mord", buildExpression(group.value.base, elem).concat(supsub)); - } else if (group.type === "open") { - return makeSpan("mopen", textit(group.value)); - } else if (group.type === "close") { - return makeSpan("mclose", textit(group.value)); - } else if (group.type === "frac") { - var numer = makeSpan("mfracnum", buildExpression(group.value.numer, numer)); - var mid = makeSpan("mfracmid", makeSpan()); - var denom = makeSpan("mfracden", buildExpression(group.value.denom, denom)); +var charLookup = { + "*": "\u2217", + "-": "\u2212", + "cdot": "\u22C5", + "lvert": "|", + "rvert": "|", + "pm": "\u00b1", + "div": "\u00f7" +}; - return makeSpan("mord mfrac", [numer, mid, denom]); - } else { - console.log("Unknown type:", group.type); - } - }; +var textit = function(value) { + if (value in charLookup) { + value = charLookup[value]; + } + return document.createTextNode(value); +}; - var charLookup = { - "*": "\u2217", - "-": "\u2212", - "cdot": "\u22C5", - "lvert": "|", - "rvert": "|", - "pm": "\u00b1", - "div": "\u00f7" - }; +var mathit = function(value) { + var text = textit(value); - var textit = function(value) { - if (value in charLookup) { - value = charLookup[value]; - } - return document.createTextNode(value); - }; + if (/[a-zA-Z]/.test(value)) { + return makeSpan("mathit", text); + } else { + return text; + } +}; - var mathit = function(value) { - var text = textit(value); +var clearNode = function(node) { + if ("textContent" in node) { + node.textContent = ""; + } else { + node.innerText = ""; + } +}; - if (/[a-zA-Z]/.test(value)) { - return makeSpan("mathit", text); - } else { - return text; - } - }; +var process = function(toParse, baseElem) { + var tree = parser.parse(toParse); + clearNode(baseElem); + _.each(buildExpression(tree), function(elem) { + baseElem.appendChild(elem); + }); +}; - var clearNode = function(node) { - if ("textContent" in node) { - node.textContent = ""; - } else { - node.innerText = ""; - } - }; - - var process = function(toParse, baseElem) { - var tree = parser.parse(toParse); - clearNode(baseElem); - _.each(buildExpression(tree), function(elem) { - baseElem.appendChild(elem); - }); - }; - - return { - process: process - }; - -})(); +module.exports = { + process: process +}; diff --git a/Makefile b/Makefile index 841e35685..61c5138f9 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ FILES=parser.js style.css build.js index.html -.PHONY: build ship copy +.PHONY: build ship copy watch build: parser.js ship: build @@ -13,3 +13,6 @@ copy: build parser.js: parser.jison ./node_modules/.bin/jison parser.jison + +watch: + ./node_modules/.bin/watchify MJLite.js --standalone MJLite -o build/MJLite.js diff --git a/build/.gitkeep b/build/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/index.html b/index.html index 00457936a..56c1747d0 100644 --- a/index.html +++ b/index.html @@ -3,8 +3,7 @@