diff options
Diffstat (limited to 'public/vendor/codemirror/mode/yacas')
-rw-r--r-- | public/vendor/codemirror/mode/yacas/index.html | 87 | ||||
-rw-r--r-- | public/vendor/codemirror/mode/yacas/yacas.js | 138 |
2 files changed, 225 insertions, 0 deletions
diff --git a/public/vendor/codemirror/mode/yacas/index.html b/public/vendor/codemirror/mode/yacas/index.html new file mode 100644 index 00000000..8e52cafb --- /dev/null +++ b/public/vendor/codemirror/mode/yacas/index.html @@ -0,0 +1,87 @@ +<!doctype html> + +<title>CodeMirror: yacas 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=../../addon/edit/matchbrackets.js></script> +<script src=yacas.js></script> +<style type=text/css> + .CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;} +</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="#">yacas</a> + </ul> +</div> + +<article> +<h2>yacas mode</h2> + + +<textarea id="yacasCode"> +// example yacas code +Graph(edges_IsList) <-- [ + Local(v, e, f, t); + + vertices := {}; + + ForEach (e, edges) [ + If (IsList(e), e := Head(e)); + {f, t} := Tail(Listify(e)); + + DestructiveAppend(vertices, f); + DestructiveAppend(vertices, t); + ]; + + Graph(RemoveDuplicates(vertices), edges); +]; + +10 # IsGraph(Graph(vertices_IsList, edges_IsList)) <-- True; +20 # IsGraph(_x) <-- False; + +Edges(Graph(vertices_IsList, edges_IsList)) <-- edges; +Vertices(Graph(vertices_IsList, edges_IsList)) <-- vertices; + +AdjacencyList(g_IsGraph) <-- [ + Local(l, vertices, edges, e, op, f, t); + + l := Association'Create(); + + vertices := Vertices(g); + ForEach (v, vertices) + Association'Set(l, v, {}); + + edges := Edges(g); + + ForEach(e, edges) [ + If (IsList(e), e := Head(e)); + {op, f, t} := Listify(e); + DestructiveAppend(Association'Get(l, f), t); + If (String(op) = "<->", DestructiveAppend(Association'Get(l, t), f)); + ]; + + l; +]; +</textarea> + +<script> + var yacasEditor = CodeMirror.fromTextArea(document.getElementById('yacasCode'), { + mode: 'text/x-yacas', + lineNumbers: true, + matchBrackets: true + }); +</script> + +<p><strong>MIME types defined:</strong> <code>text/x-yacas</code> (yacas).</p> +</article> diff --git a/public/vendor/codemirror/mode/yacas/yacas.js b/public/vendor/codemirror/mode/yacas/yacas.js new file mode 100644 index 00000000..2967382b --- /dev/null +++ b/public/vendor/codemirror/mode/yacas/yacas.js @@ -0,0 +1,138 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +// Yacas mode copyright (c) 2015 by Grzegorz Mazur +// Loosely based on mathematica mode by Calin Barbat + +(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('yacas', function(_config, _parserConfig) { + + // patterns + var pFloatForm = "(?:(?:\\.\\d+|\\d+\\.\\d*|\\d+)(?:[eE][+-]?\\d+)?)"; + var pIdentifier = "(?:[a-zA-Z\\$'][a-zA-Z0-9\\$']*)"; + + // regular expressions + var reFloatForm = new RegExp(pFloatForm); + var reIdentifier = new RegExp(pIdentifier); + var rePattern = new RegExp(pIdentifier + "?_" + pIdentifier); + var reFunctionLike = new RegExp(pIdentifier + "\\s*\\("); + + function tokenBase(stream, state) { + var ch; + + // get next character + ch = stream.next(); + + // string + if (ch === '"') { + state.tokenize = tokenString; + return state.tokenize(stream, state); + } + + // comment + if (ch === '/') { + if (stream.eat('*')) { + state.tokenize = tokenComment; + return state.tokenize(stream, state); + } + if (stream.eat("/")) { + stream.skipToEnd(); + return "comment"; + } + } + + // go back one character + stream.backUp(1); + + // look for ordered rules + if (stream.match(/\d+ *#/, true, false)) { + return 'qualifier'; + } + + // look for numbers + if (stream.match(reFloatForm, true, false)) { + return 'number'; + } + + // look for placeholders + if (stream.match(rePattern, true, false)) { + return 'variable-3'; + } + + // match all braces separately + if (stream.match(/(?:\[|\]|{|}|\(|\))/, true, false)) { + return 'bracket'; + } + + // literals looking like function calls + if (stream.match(reFunctionLike, true, false)) { + stream.backUp(1); + return 'variable'; + } + + // all other identifiers + if (stream.match(reIdentifier, true, false)) { + return 'variable-2'; + } + + // operators; note that operators like @@ or /; are matched separately for each symbol. + if (stream.match(/(?:\\|\+|\-|\*|\/|,|;|\.|:|@|~|=|>|<|&|\||_|`|'|\^|\?|!|%)/, true, false)) { + return 'operator'; + } + + // everything else is an error + return 'error'; + } + + function tokenString(stream, state) { + var next, end = false, escaped = false; + while ((next = stream.next()) != null) { + if (next === '"' && !escaped) { + end = true; + break; + } + escaped = !escaped && next === '\\'; + } + if (end && !escaped) { + state.tokenize = tokenBase; + } + return 'string'; + }; + + function tokenComment(stream, state) { + var prev, next; + while((next = stream.next()) != null) { + if (prev === '*' && next === '/') + break; + prev = next; + } + state.tokenize = tokenBase; + return 'comment'; + } + + return { + startState: function() {return {tokenize: tokenBase, commentLevel: 0};}, + token: function(stream, state) { + if (stream.eatSpace()) return null; + return state.tokenize(stream, state); + }, + blockCommentStart: "/*", + blockCommentEnd: "*/", + lineComment: "//" + }; +}); + +CodeMirror.defineMIME('text/x-yacas', { + name: 'yacas' +}); + +}); |