summaryrefslogtreecommitdiff
path: root/public/vendor/codemirror/mode/stex
diff options
context:
space:
mode:
authorWu Cheng-Han2015-05-04 15:53:29 +0800
committerWu Cheng-Han2015-05-04 15:53:29 +0800
commit4b0ca55eb79e963523eb6c8197825e9e8ae904e2 (patch)
tree574f3923af77b37b41dbf1b00bcd7827ef724a28 /public/vendor/codemirror/mode/stex
parent61eb11d23c65c9e5c493c67d055f785cbec139e2 (diff)
First commit, version 0.2.7
Diffstat (limited to '')
-rwxr-xr-xpublic/vendor/codemirror/mode/stex/index.html110
-rwxr-xr-xpublic/vendor/codemirror/mode/stex/stex.js251
-rwxr-xr-xpublic/vendor/codemirror/mode/stex/test.js123
3 files changed, 484 insertions, 0 deletions
diff --git a/public/vendor/codemirror/mode/stex/index.html b/public/vendor/codemirror/mode/stex/index.html
new file mode 100755
index 00000000..14679da4
--- /dev/null
+++ b/public/vendor/codemirror/mode/stex/index.html
@@ -0,0 +1,110 @@
+<!doctype html>
+
+<title>CodeMirror: sTeX mode</title>
+<meta charset="utf-8"/>
+<link rel=stylesheet href="../../doc/docs.css">
+
+<link rel="stylesheet" href="../../lib/codemirror.css">
+<script src="../../lib/codemirror.js"></script>
+<script src="stex.js"></script>
+<style>.CodeMirror {background: #f8f8f8;}</style>
+<div id=nav>
+ <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>
+
+ <ul>
+ <li><a href="../../index.html">Home</a>
+ <li><a href="../../doc/manual.html">Manual</a>
+ <li><a href="https://github.com/codemirror/codemirror">Code</a>
+ </ul>
+ <ul>
+ <li><a href="../index.html">Language modes</a>
+ <li><a class=active href="#">sTeX</a>
+ </ul>
+</div>
+
+<article>
+<h2>sTeX mode</h2>
+<form><textarea id="code" name="code">
+\begin{module}[id=bbt-size]
+\importmodule[balanced-binary-trees]{balanced-binary-trees}
+\importmodule[\KWARCslides{dmath/en/cardinality}]{cardinality}
+
+\begin{frame}
+ \frametitle{Size Lemma for Balanced Trees}
+ \begin{itemize}
+ \item
+ \begin{assertion}[id=size-lemma,type=lemma]
+ Let $G=\tup{V,E}$ be a \termref[cd=binary-trees]{balanced binary tree}
+ of \termref[cd=graph-depth,name=vertex-depth]{depth}$n>i$, then the set
+ $\defeq{\livar{V}i}{\setst{\inset{v}{V}}{\gdepth{v} = i}}$ of
+ \termref[cd=graphs-intro,name=node]{nodes} at
+ \termref[cd=graph-depth,name=vertex-depth]{depth} $i$ has
+ \termref[cd=cardinality,name=cardinality]{cardinality} $\power2i$.
+ \end{assertion}
+ \item
+ \begin{sproof}[id=size-lemma-pf,proofend=,for=size-lemma]{via induction over the depth $i$.}
+ \begin{spfcases}{We have to consider two cases}
+ \begin{spfcase}{$i=0$}
+ \begin{spfstep}[display=flow]
+ then $\livar{V}i=\set{\livar{v}r}$, where $\livar{v}r$ is the root, so
+ $\eq{\card{\livar{V}0},\card{\set{\livar{v}r}},1,\power20}$.
+ \end{spfstep}
+ \end{spfcase}
+ \begin{spfcase}{$i>0$}
+ \begin{spfstep}[display=flow]
+ then $\livar{V}{i-1}$ contains $\power2{i-1}$ vertexes
+ \begin{justification}[method=byIH](IH)\end{justification}
+ \end{spfstep}
+ \begin{spfstep}
+ By the \begin{justification}[method=byDef]definition of a binary
+ tree\end{justification}, each $\inset{v}{\livar{V}{i-1}}$ is a leaf or has
+ two children that are at depth $i$.
+ \end{spfstep}
+ \begin{spfstep}
+ As $G$ is \termref[cd=balanced-binary-trees,name=balanced-binary-tree]{balanced} and $\gdepth{G}=n>i$, $\livar{V}{i-1}$ cannot contain
+ leaves.
+ \end{spfstep}
+ \begin{spfstep}[type=conclusion]
+ Thus $\eq{\card{\livar{V}i},{\atimes[cdot]{2,\card{\livar{V}{i-1}}}},{\atimes[cdot]{2,\power2{i-1}}},\power2i}$.
+ \end{spfstep}
+ \end{spfcase}
+ \end{spfcases}
+ \end{sproof}
+ \item
+ \begin{assertion}[id=fbbt,type=corollary]
+ A fully balanced tree of depth $d$ has $\power2{d+1}-1$ nodes.
+ \end{assertion}
+ \item
+ \begin{sproof}[for=fbbt,id=fbbt-pf]{}
+ \begin{spfstep}
+ Let $\defeq{G}{\tup{V,E}}$ be a fully balanced tree
+ \end{spfstep}
+ \begin{spfstep}
+ Then $\card{V}=\Sumfromto{i}1d{\power2i}= \power2{d+1}-1$.
+ \end{spfstep}
+ \end{sproof}
+ \end{itemize}
+ \end{frame}
+\begin{note}
+ \begin{omtext}[type=conclusion,for=binary-tree]
+ This shows that balanced binary trees grow in breadth very quickly, a consequence of
+ this is that they are very shallow (and this compute very fast), which is the essence of
+ the next result.
+ \end{omtext}
+\end{note}
+\end{module}
+
+%%% Local Variables:
+%%% mode: LaTeX
+%%% TeX-master: "all"
+%%% End: \end{document}
+</textarea></form>
+ <script>
+ var editor = CodeMirror.fromTextArea(document.getElementById("code"), {});
+ </script>
+
+ <p><strong>MIME types defined:</strong> <code>text/x-stex</code>.</p>
+
+ <p><strong>Parsing/Highlighting Tests:</strong> <a href="../../test/index.html#stex_*">normal</a>, <a href="../../test/index.html#verbose,stex_*">verbose</a>.</p>
+
+ </article>
diff --git a/public/vendor/codemirror/mode/stex/stex.js b/public/vendor/codemirror/mode/stex/stex.js
new file mode 100755
index 00000000..835ed46d
--- /dev/null
+++ b/public/vendor/codemirror/mode/stex/stex.js
@@ -0,0 +1,251 @@
+// CodeMirror, copyright (c) by Marijn Haverbeke and others
+// Distributed under an MIT license: http://codemirror.net/LICENSE
+
+/*
+ * Author: Constantin Jucovschi (c.jucovschi@jacobs-university.de)
+ * Licence: MIT
+ */
+
+(function(mod) {
+ if (typeof exports == "object" && typeof module == "object") // CommonJS
+ mod(require("../../lib/codemirror"));
+ else if (typeof define == "function" && define.amd) // AMD
+ define(["../../lib/codemirror"], mod);
+ else // Plain browser env
+ mod(CodeMirror);
+})(function(CodeMirror) {
+ "use strict";
+
+ CodeMirror.defineMode("stex", function() {
+ "use strict";
+
+ function pushCommand(state, command) {
+ state.cmdState.push(command);
+ }
+
+ function peekCommand(state) {
+ if (state.cmdState.length > 0) {
+ return state.cmdState[state.cmdState.length - 1];
+ } else {
+ return null;
+ }
+ }
+
+ function popCommand(state) {
+ var plug = state.cmdState.pop();
+ if (plug) {
+ plug.closeBracket();
+ }
+ }
+
+ // returns the non-default plugin closest to the end of the list
+ function getMostPowerful(state) {
+ var context = state.cmdState;
+ for (var i = context.length - 1; i >= 0; i--) {
+ var plug = context[i];
+ if (plug.name == "DEFAULT") {
+ continue;
+ }
+ return plug;
+ }
+ return { styleIdentifier: function() { return null; } };
+ }
+
+ function addPluginPattern(pluginName, cmdStyle, styles) {
+ return function () {
+ this.name = pluginName;
+ this.bracketNo = 0;
+ this.style = cmdStyle;
+ this.styles = styles;
+ this.argument = null; // \begin and \end have arguments that follow. These are stored in the plugin
+
+ this.styleIdentifier = function() {
+ return this.styles[this.bracketNo - 1] || null;
+ };
+ this.openBracket = function() {
+ this.bracketNo++;
+ return "bracket";
+ };
+ this.closeBracket = function() {};
+ };
+ }
+
+ var plugins = {};
+
+ plugins["importmodule"] = addPluginPattern("importmodule", "tag", ["string", "builtin"]);
+ plugins["documentclass"] = addPluginPattern("documentclass", "tag", ["", "atom"]);
+ plugins["usepackage"] = addPluginPattern("usepackage", "tag", ["atom"]);
+ plugins["begin"] = addPluginPattern("begin", "tag", ["atom"]);
+ plugins["end"] = addPluginPattern("end", "tag", ["atom"]);
+
+ plugins["DEFAULT"] = function () {
+ this.name = "DEFAULT";
+ this.style = "tag";
+
+ this.styleIdentifier = this.openBracket = this.closeBracket = function() {};
+ };
+
+ function setState(state, f) {
+ state.f = f;
+ }
+
+ // called when in a normal (no environment) context
+ function normal(source, state) {
+ var plug;
+ // Do we look like '\command' ? If so, attempt to apply the plugin 'command'
+ if (source.match(/^\\[a-zA-Z@]+/)) {
+ var cmdName = source.current().slice(1);
+ plug = plugins[cmdName] || plugins["DEFAULT"];
+ plug = new plug();
+ pushCommand(state, plug);
+ setState(state, beginParams);
+ return plug.style;
+ }
+
+ // escape characters
+ if (source.match(/^\\[$&%#{}_]/)) {
+ return "tag";
+ }
+
+ // white space control characters
+ if (source.match(/^\\[,;!\/\\]/)) {
+ return "tag";
+ }
+
+ // find if we're starting various math modes
+ if (source.match("\\[")) {
+ setState(state, function(source, state){ return inMathMode(source, state, "\\]"); });
+ return "keyword";
+ }
+ if (source.match("$$")) {
+ setState(state, function(source, state){ return inMathMode(source, state, "$$"); });
+ return "keyword";
+ }
+ if (source.match("$")) {
+ setState(state, function(source, state){ return inMathMode(source, state, "$"); });
+ return "keyword";
+ }
+
+ var ch = source.next();
+ if (ch == "%") {
+ source.skipToEnd();
+ return "comment";
+ } else if (ch == '}' || ch == ']') {
+ plug = peekCommand(state);
+ if (plug) {
+ plug.closeBracket(ch);
+ setState(state, beginParams);
+ } else {
+ return "error";
+ }
+ return "bracket";
+ } else if (ch == '{' || ch == '[') {
+ plug = plugins["DEFAULT"];
+ plug = new plug();
+ pushCommand(state, plug);
+ return "bracket";
+ } else if (/\d/.test(ch)) {
+ source.eatWhile(/[\w.%]/);
+ return "atom";
+ } else {
+ source.eatWhile(/[\w\-_]/);
+ plug = getMostPowerful(state);
+ if (plug.name == 'begin') {
+ plug.argument = source.current();
+ }
+ return plug.styleIdentifier();
+ }
+ }
+
+ function inMathMode(source, state, endModeSeq) {
+ if (source.eatSpace()) {
+ return null;
+ }
+ if (source.match(endModeSeq)) {
+ setState(state, normal);
+ return "keyword";
+ }
+ if (source.match(/^\\[a-zA-Z@]+/)) {
+ return "tag";
+ }
+ if (source.match(/^[a-zA-Z]+/)) {
+ return "variable-2";
+ }
+ // escape characters
+ if (source.match(/^\\[$&%#{}_]/)) {
+ return "tag";
+ }
+ // white space control characters
+ if (source.match(/^\\[,;!\/]/)) {
+ return "tag";
+ }
+ // special math-mode characters
+ if (source.match(/^[\^_&]/)) {
+ return "tag";
+ }
+ // non-special characters
+ if (source.match(/^[+\-<>|=,\/@!*:;'"`~#?]/)) {
+ return null;
+ }
+ if (source.match(/^(\d+\.\d*|\d*\.\d+|\d+)/)) {
+ return "number";
+ }
+ var ch = source.next();
+ if (ch == "{" || ch == "}" || ch == "[" || ch == "]" || ch == "(" || ch == ")") {
+ return "bracket";
+ }
+
+ if (ch == "%") {
+ source.skipToEnd();
+ return "comment";
+ }
+ return "error";
+ }
+
+ function beginParams(source, state) {
+ var ch = source.peek(), lastPlug;
+ if (ch == '{' || ch == '[') {
+ lastPlug = peekCommand(state);
+ lastPlug.openBracket(ch);
+ source.eat(ch);
+ setState(state, normal);
+ return "bracket";
+ }
+ if (/[ \t\r]/.test(ch)) {
+ source.eat(ch);
+ return null;
+ }
+ setState(state, normal);
+ popCommand(state);
+
+ return normal(source, state);
+ }
+
+ return {
+ startState: function() {
+ return {
+ cmdState: [],
+ f: normal
+ };
+ },
+ copyState: function(s) {
+ return {
+ cmdState: s.cmdState.slice(),
+ f: s.f
+ };
+ },
+ token: function(stream, state) {
+ return state.f(stream, state);
+ },
+ blankLine: function(state) {
+ state.f = normal;
+ state.cmdState.length = 0;
+ },
+ lineComment: "%"
+ };
+ });
+
+ CodeMirror.defineMIME("text/x-stex", "stex");
+ CodeMirror.defineMIME("text/x-latex", "stex");
+
+});
diff --git a/public/vendor/codemirror/mode/stex/test.js b/public/vendor/codemirror/mode/stex/test.js
new file mode 100755
index 00000000..22f027ec
--- /dev/null
+++ b/public/vendor/codemirror/mode/stex/test.js
@@ -0,0 +1,123 @@
+// CodeMirror, copyright (c) by Marijn Haverbeke and others
+// Distributed under an MIT license: http://codemirror.net/LICENSE
+
+(function() {
+ var mode = CodeMirror.getMode({tabSize: 4}, "stex");
+ function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); }
+
+ MT("word",
+ "foo");
+
+ MT("twoWords",
+ "foo bar");
+
+ MT("beginEndDocument",
+ "[tag \\begin][bracket {][atom document][bracket }]",
+ "[tag \\end][bracket {][atom document][bracket }]");
+
+ MT("beginEndEquation",
+ "[tag \\begin][bracket {][atom equation][bracket }]",
+ " E=mc^2",
+ "[tag \\end][bracket {][atom equation][bracket }]");
+
+ MT("beginModule",
+ "[tag \\begin][bracket {][atom module][bracket }[[]]]");
+
+ MT("beginModuleId",
+ "[tag \\begin][bracket {][atom module][bracket }[[]id=bbt-size[bracket ]]]");
+
+ MT("importModule",
+ "[tag \\importmodule][bracket [[][string b-b-t][bracket ]]{][builtin b-b-t][bracket }]");
+
+ MT("importModulePath",
+ "[tag \\importmodule][bracket [[][tag \\KWARCslides][bracket {][string dmath/en/cardinality][bracket }]]{][builtin card][bracket }]");
+
+ MT("psForPDF",
+ "[tag \\PSforPDF][bracket [[][atom 1][bracket ]]{]#1[bracket }]");
+
+ MT("comment",
+ "[comment % foo]");
+
+ MT("tagComment",
+ "[tag \\item][comment % bar]");
+
+ MT("commentTag",
+ " [comment % \\item]");
+
+ MT("commentLineBreak",
+ "[comment %]",
+ "foo");
+
+ MT("tagErrorCurly",
+ "[tag \\begin][error }][bracket {]");
+
+ MT("tagErrorSquare",
+ "[tag \\item][error ]]][bracket {]");
+
+ MT("commentCurly",
+ "[comment % }]");
+
+ MT("tagHash",
+ "the [tag \\#] key");
+
+ MT("tagNumber",
+ "a [tag \\$][atom 5] stetson");
+
+ MT("tagPercent",
+ "[atom 100][tag \\%] beef");
+
+ MT("tagAmpersand",
+ "L [tag \\&] N");
+
+ MT("tagUnderscore",
+ "foo[tag \\_]bar");
+
+ MT("tagBracketOpen",
+ "[tag \\emph][bracket {][tag \\{][bracket }]");
+
+ MT("tagBracketClose",
+ "[tag \\emph][bracket {][tag \\}][bracket }]");
+
+ MT("tagLetterNumber",
+ "section [tag \\S][atom 1]");
+
+ MT("textTagNumber",
+ "para [tag \\P][atom 2]");
+
+ MT("thinspace",
+ "x[tag \\,]y");
+
+ MT("thickspace",
+ "x[tag \\;]y");
+
+ MT("negativeThinspace",
+ "x[tag \\!]y");
+
+ MT("periodNotSentence",
+ "J.\\ L.\\ is");
+
+ MT("periodSentence",
+ "X[tag \\@]. The");
+
+ MT("italicCorrection",
+ "[bracket {][tag \\em] If[tag \\/][bracket }] I");
+
+ MT("tagBracket",
+ "[tag \\newcommand][bracket {][tag \\pop][bracket }]");
+
+ MT("inlineMathTagFollowedByNumber",
+ "[keyword $][tag \\pi][number 2][keyword $]");
+
+ MT("inlineMath",
+ "[keyword $][number 3][variable-2 x][tag ^][number 2.45]-[tag \\sqrt][bracket {][tag \\$\\alpha][bracket }] = [number 2][keyword $] other text");
+
+ MT("displayMath",
+ "More [keyword $$]\t[variable-2 S][tag ^][variable-2 n][tag \\sum] [variable-2 i][keyword $$] other text");
+
+ MT("mathWithComment",
+ "[keyword $][variable-2 x] [comment % $]",
+ "[variable-2 y][keyword $] other text");
+
+ MT("lineBreakArgument",
+ "[tag \\\\][bracket [[][atom 1cm][bracket ]]]");
+})();