mirror of
https://github.com/hedgedoc/hedgedoc.git
synced 2025-06-05 01:04:25 -04:00
First commit, version 0.2.7
This commit is contained in:
parent
61eb11d23c
commit
4b0ca55eb7
1379 changed files with 173000 additions and 0 deletions
110
public/vendor/codemirror/mode/stex/index.html
vendored
Executable file
110
public/vendor/codemirror/mode/stex/index.html
vendored
Executable file
|
@ -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>
|
251
public/vendor/codemirror/mode/stex/stex.js
vendored
Executable file
251
public/vendor/codemirror/mode/stex/stex.js
vendored
Executable file
|
@ -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");
|
||||
|
||||
});
|
123
public/vendor/codemirror/mode/stex/test.js
vendored
Executable file
123
public/vendor/codemirror/mode/stex/test.js
vendored
Executable file
|
@ -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 ]]]");
|
||||
})();
|
Loading…
Add table
Add a link
Reference in a new issue