Skip to content
Snippets Groups Projects
Commit be36e3e9 authored by Grzegorz Mazur's avatar Grzegorz Mazur Committed by Marijn Haverbeke
Browse files

[yacas mode] Add

parent 6fa57522
No related branches found
No related tags found
No related merge requests found
......@@ -151,6 +151,7 @@ option.</p>
<li><a href="vue/index.html">Vue.js app</a></li>
<li><a href="xml/index.html">XML/HTML</a></li>
<li><a href="xquery/index.html">XQuery</a></li>
<li><a href="yacas/index.html">Yacas</a></li>
<li><a href="yaml/index.html">YAML</a></li>
<li><a href="yaml-frontmatter/index.html">YAML frontmatter</a></li>
<li><a href="z80/index.html">Z80</a></li>
......
......@@ -152,6 +152,7 @@
{name: "VHDL", mime: "text/x-vhdl", mode: "vhdl", ext: ["vhd", "vhdl"]},
{name: "XML", mimes: ["application/xml", "text/xml"], mode: "xml", ext: ["xml", "xsl", "xsd"], alias: ["rss", "wsdl", "xsd"]},
{name: "XQuery", mime: "application/xquery", mode: "xquery", ext: ["xy", "xquery"]},
{name: "Yacas", mime: "text/x-yacas", mode: "yacas", ext: ["ys"]},
{name: "YAML", mime: "text/x-yaml", mode: "yaml", ext: ["yaml", "yml"], alias: ["yml"]},
{name: "Z80", mime: "text/x-z80", mode: "z80", ext: ["z80"]},
{name: "mscgen", mime: "text/x-mscgen", mode: "mscgen", ext: ["mscgen", "mscin", "msc"]},
......
<!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>
// 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'
});
});
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment