Upgrade CodeMirror to 5.10.1 and now support fullscreen, jump-to-line in editor

This commit is contained in:
Wu Cheng-Han 2016-01-17 14:28:04 -06:00
parent ce65e58096
commit eaa8ccaccb
381 changed files with 6726 additions and 2636 deletions

View file

@ -0,0 +1,151 @@
<!doctype html>
<title>CodeMirror: MscGen 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="mscgen.js"></script>
<style>.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="#">MscGen</a>
</ul>
</div>
<article>
<h2>MscGen mode</h2>
<div><textarea id="mscgen-code">
# Sample mscgen program
# See http://www.mcternan.me.uk/mscgen or
# https://sverweij.github.io/mscgen_js for more samples
msc {
# options
hscale="1.2";
# entities/ lifelines
a [label="Entity A"],
b [label="Entity B", linecolor="red", arclinecolor="red", textbgcolor="pink"],
c [label="Entity C"];
# arcs/ messages
a => c [label="doSomething(args)"];
b => c [label="doSomething(args)"];
c >> * [label="everyone asked me", arcskip="1"];
c =>> c [label="doing something"];
c -x * [label="report back", arcskip="1"];
|||;
--- [label="shows's over, however ..."];
b => a [label="did you see c doing something?"];
a -> b [label="nope"];
b :> a [label="shall we ask again?"];
a => b [label="naah"];
...;
}
</textarea></div>
<h2>Xù mode</h2>
<div><textarea id="xu-code">
# Xù - expansions to MscGen to support inline expressions
# https://github.com/sverweij/mscgen_js/blob/master/wikum/xu.md
# More samples: https://sverweij.github.io/mscgen_js
msc {
hscale="0.8",
width="700";
a,
b [label="change store"],
c,
d [label="necro queue"],
e [label="natalis queue"],
f;
a =>> b [label="get change list()"];
a alt f [label="changes found"] { /* alt is a xu specific keyword*/
b >> a [label="list of changes"];
a =>> c [label="cull old stuff (list of changes)"];
b loop e [label="for each change"] { // loop is xu specific as well...
/*
* Interesting stuff happens.
*/
c =>> b [label="get change()"];
b >> c [label="change"];
c alt e [label="change too old"] {
c =>> d [label="queue(change)"];
--- [label="change newer than latest run"];
c =>> e [label="queue(change)"];
--- [label="all other cases"];
||| [label="leave well alone"];
};
};
c >> a [label="done
processing"];
/* shucks! nothing found ...*/
--- [label="nothing found"];
b >> a [label="nothing"];
a note a [label="silent exit"];
};
}
</textarea></div>
<h2>MsGenny mode</h2>
<div><textarea id="msgenny-code">
# MsGenny - simplified version of MscGen / Xù
# https://github.com/sverweij/mscgen_js/blob/master/wikum/msgenny.md
# More samples: https://sverweij.github.io/mscgen_js
a -> b : a -> b (signal);
a => b : a => b (method);
b >> a : b >> a (return value);
a =>> b : a =>> b (callback);
a -x b : a -x b (lost);
a :> b : a :> b (emphasis);
a .. b : a .. b (dotted);
a -- b : "a -- b straight line";
a note a : a note a\n(note),
b box b : b box b\n(action);
a rbox a : a rbox a\n(reference),
b abox b : b abox b\n(state/ condition);
||| : ||| (empty row);
... : ... (omitted row);
--- : --- (comment);
</textarea></div>
<p>
Simple mode for highlighting MscGen and two derived sequence
chart languages.
</p>
<script>
var mscgenEditor = CodeMirror.fromTextArea(document.getElementById("mscgen-code"), {
lineNumbers: true,
mode: "text/x-mscgen",
});
var xuEditor = CodeMirror.fromTextArea(document.getElementById("xu-code"), {
lineNumbers: true,
mode: "text/x-xu",
});
var msgennyEditor = CodeMirror.fromTextArea(document.getElementById("msgenny-code"), {
lineNumbers: true,
mode: "text/x-msgenny",
});
</script>
<p><strong>MIME types defined:</strong>
<code>text/x-mscgen</code>
<code>text/x-xu</code>
<code>text/x-msgenny</code>
</p>
</article>

View file

@ -0,0 +1,169 @@
// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE
// mode(s) for the sequence chart dsl's mscgen, xù and msgenny
// For more information on mscgen, see the site of the original author:
// http://www.mcternan.me.uk/mscgen
//
// This mode for mscgen and the two derivative languages were
// originally made for use in the mscgen_js interpreter
// (https://sverweij.github.io/mscgen_js)
(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";
var languages = {
mscgen: {
"keywords" : ["msc"],
"options" : ["hscale", "width", "arcgradient", "wordwraparcs"],
"attributes" : ["label", "idurl", "id", "url", "linecolor", "linecolour", "textcolor", "textcolour", "textbgcolor", "textbgcolour", "arclinecolor", "arclinecolour", "arctextcolor", "arctextcolour", "arctextbgcolor", "arctextbgcolour", "arcskip"],
"brackets" : ["\\{", "\\}"], // [ and ] are brackets too, but these get handled in with lists
"arcsWords" : ["note", "abox", "rbox", "box"],
"arcsOthers" : ["\\|\\|\\|", "\\.\\.\\.", "---", "--", "<->", "==", "<<=>>", "<=>", "\\.\\.", "<<>>", "::", "<:>", "->", "=>>", "=>", ">>", ":>", "<-", "<<=", "<=", "<<", "<:", "x-", "-x"],
"singlecomment" : ["//", "#"],
"operators" : ["="]
},
xu: {
"keywords" : ["msc"],
"options" : ["hscale", "width", "arcgradient", "wordwraparcs", "watermark"],
"attributes" : ["label", "idurl", "id", "url", "linecolor", "linecolour", "textcolor", "textcolour", "textbgcolor", "textbgcolour", "arclinecolor", "arclinecolour", "arctextcolor", "arctextcolour", "arctextbgcolor", "arctextbgcolour", "arcskip"],
"brackets" : ["\\{", "\\}"], // [ and ] are brackets too, but these get handled in with lists
"arcsWords" : ["note", "abox", "rbox", "box", "alt", "else", "opt", "break", "par", "seq", "strict", "neg", "critical", "ignore", "consider", "assert", "loop", "ref", "exc"],
"arcsOthers" : ["\\|\\|\\|", "\\.\\.\\.", "---", "--", "<->", "==", "<<=>>", "<=>", "\\.\\.", "<<>>", "::", "<:>", "->", "=>>", "=>", ">>", ":>", "<-", "<<=", "<=", "<<", "<:", "x-", "-x"],
"singlecomment" : ["//", "#"],
"operators" : ["="]
},
msgenny: {
"keywords" : null,
"options" : ["hscale", "width", "arcgradient", "wordwraparcs", "watermark"],
"attributes" : null,
"brackets" : ["\\{", "\\}"],
"arcsWords" : ["note", "abox", "rbox", "box", "alt", "else", "opt", "break", "par", "seq", "strict", "neg", "critical", "ignore", "consider", "assert", "loop", "ref", "exc"],
"arcsOthers" : ["\\|\\|\\|", "\\.\\.\\.", "---", "--", "<->", "==", "<<=>>", "<=>", "\\.\\.", "<<>>", "::", "<:>", "->", "=>>", "=>", ">>", ":>", "<-", "<<=", "<=", "<<", "<:", "x-", "-x"],
"singlecomment" : ["//", "#"],
"operators" : ["="]
}
}
CodeMirror.defineMode("mscgen", function(_, modeConfig) {
var language = languages[modeConfig && modeConfig.language || "mscgen"]
return {
startState: startStateFn,
copyState: copyStateFn,
token: produceTokenFunction(language),
lineComment : "#",
blockCommentStart : "/*",
blockCommentEnd : "*/"
};
});
CodeMirror.defineMIME("text/x-mscgen", "mscgen");
CodeMirror.defineMIME("text/x-xu", {name: "mscgen", language: "xu"});
CodeMirror.defineMIME("text/x-msgenny", {name: "mscgen", language: "msgenny"});
function wordRegexpBoundary(pWords) {
return new RegExp("\\b(" + pWords.join("|") + ")\\b", "i");
}
function wordRegexp(pWords) {
return new RegExp("(" + pWords.join("|") + ")", "i");
}
function startStateFn() {
return {
inComment : false,
inString : false,
inAttributeList : false,
inScript : false
};
}
function copyStateFn(pState) {
return {
inComment : pState.inComment,
inString : pState.inString,
inAttributeList : pState.inAttributeList,
inScript : pState.inScript
};
}
function produceTokenFunction(pConfig) {
return function(pStream, pState) {
if (pStream.match(wordRegexp(pConfig.brackets), true, true)) {
return "bracket";
}
/* comments */
if (!pState.inComment) {
if (pStream.match(/\/\*[^\*\/]*/, true, true)) {
pState.inComment = true;
return "comment";
}
if (pStream.match(wordRegexp(pConfig.singlecomment), true, true)) {
pStream.skipToEnd();
return "comment";
}
}
if (pState.inComment) {
if (pStream.match(/[^\*\/]*\*\//, true, true))
pState.inComment = false;
else
pStream.skipToEnd();
return "comment";
}
/* strings */
if (!pState.inString && pStream.match(/\"(\\\"|[^\"])*/, true, true)) {
pState.inString = true;
return "string";
}
if (pState.inString) {
if (pStream.match(/[^\"]*\"/, true, true))
pState.inString = false;
else
pStream.skipToEnd();
return "string";
}
/* keywords & operators */
if (!!pConfig.keywords && pStream.match(wordRegexpBoundary(pConfig.keywords), true, true))
return "keyword";
if (pStream.match(wordRegexpBoundary(pConfig.options), true, true))
return "keyword";
if (pStream.match(wordRegexpBoundary(pConfig.arcsWords), true, true))
return "keyword";
if (pStream.match(wordRegexp(pConfig.arcsOthers), true, true))
return "keyword";
if (!!pConfig.operators && pStream.match(wordRegexp(pConfig.operators), true, true))
return "operator";
/* attribute lists */
if (!pConfig.inAttributeList && !!pConfig.attributes && pStream.match(/\[/, true, true)) {
pConfig.inAttributeList = true;
return "bracket";
}
if (pConfig.inAttributeList) {
if (pConfig.attributes !== null && pStream.match(wordRegexpBoundary(pConfig.attributes), true, true)) {
return "attribute";
}
if (pStream.match(/]/, true, true)) {
pConfig.inAttributeList = false;
return "bracket";
}
}
pStream.next();
return "base";
};
}
});

View file

@ -0,0 +1,75 @@
// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE
(function() {
var mode = CodeMirror.getMode({indentUnit: 2}, "mscgen");
function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); }
MT("empty chart",
"[keyword msc][bracket {]",
"[base ]",
"[bracket }]"
);
MT("comments",
"[comment // a single line comment]",
"[comment # another single line comment /* and */ ignored here]",
"[comment /* A multi-line comment even though it contains]",
"[comment msc keywords and \"quoted text\"*/]");
MT("strings",
"[string \"// a string\"]",
"[string \"a string running over]",
"[string two lines\"]",
"[string \"with \\\"escaped quote\"]"
);
MT("xù/ msgenny keywords classify as 'base'",
"[base watermark]",
"[base alt loop opt ref else break par seq assert]"
);
MT("mscgen options classify as keyword",
"[keyword hscale]", "[keyword width]", "[keyword arcgradient]", "[keyword wordwraparcs]"
);
MT("mscgen arcs classify as keyword",
"[keyword note]","[keyword abox]","[keyword rbox]","[keyword box]",
"[keyword |||...---]", "[keyword ..--==::]",
"[keyword ->]", "[keyword <-]", "[keyword <->]",
"[keyword =>]", "[keyword <=]", "[keyword <=>]",
"[keyword =>>]", "[keyword <<=]", "[keyword <<=>>]",
"[keyword >>]", "[keyword <<]", "[keyword <<>>]",
"[keyword -x]", "[keyword x-]", "[keyword -X]", "[keyword X-]",
"[keyword :>]", "[keyword <:]", "[keyword <:>]"
);
MT("within an attribute list, attributes classify as attribute",
"[bracket [[][attribute label]",
"[attribute id]","[attribute url]","[attribute idurl]",
"[attribute linecolor]","[attribute linecolour]","[attribute textcolor]","[attribute textcolour]","[attribute textbgcolor]","[attribute textbgcolour]",
"[attribute arclinecolor]","[attribute arclinecolour]","[attribute arctextcolor]","[attribute arctextcolour]","[attribute arctextbgcolor]","[attribute arctextbgcolour]",
"[attribute arcskip][bracket ]]]"
);
MT("outside an attribute list, attributes classify as base",
"[base label]",
"[base id]","[base url]","[base idurl]",
"[base linecolor]","[base linecolour]","[base textcolor]","[base textcolour]","[base textbgcolor]","[base textbgcolour]",
"[base arclinecolor]","[base arclinecolour]","[base arctextcolor]","[base arctextcolour]","[base arctextbgcolor]","[base arctextbgcolour]",
"[base arcskip]"
);
MT("a typical program",
"[comment # typical mscgen program]",
"[keyword msc][base ][bracket {]",
"[keyword wordwraparcs][operator =][string \"true\"][base , ][keyword hscale][operator =][string \"0.8\"][keyword arcgradient][operator =][base 30;]",
"[base a][bracket [[][attribute label][operator =][string \"Entity A\"][bracket ]]][base ,]",
"[base b][bracket [[][attribute label][operator =][string \"Entity B\"][bracket ]]][base ,]",
"[base c][bracket [[][attribute label][operator =][string \"Entity C\"][bracket ]]][base ;]",
"[base a ][keyword =>>][base b][bracket [[][attribute label][operator =][string \"Hello entity B\"][bracket ]]][base ;]",
"[base a ][keyword <<][base b][bracket [[][attribute label][operator =][string \"Here's an answer dude!\"][bracket ]]][base ;]",
"[base c ][keyword :>][base *][bracket [[][attribute label][operator =][string \"What about me?\"][base , ][attribute textcolor][operator =][base red][bracket ]]][base ;]",
"[bracket }]"
);
})();

View file

@ -0,0 +1,71 @@
// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE
(function() {
var mode = CodeMirror.getMode({indentUnit: 2}, "text/x-msgenny");
function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1), "msgenny"); }
MT("comments",
"[comment // a single line comment]",
"[comment # another single line comment /* and */ ignored here]",
"[comment /* A multi-line comment even though it contains]",
"[comment msc keywords and \"quoted text\"*/]");
MT("strings",
"[string \"// a string\"]",
"[string \"a string running over]",
"[string two lines\"]",
"[string \"with \\\"escaped quote\"]"
);
MT("xù/ msgenny keywords classify as 'keyword'",
"[keyword watermark]",
"[keyword alt]","[keyword loop]","[keyword opt]","[keyword ref]","[keyword else]","[keyword break]","[keyword par]","[keyword seq]","[keyword assert]"
);
MT("mscgen options classify as keyword",
"[keyword hscale]", "[keyword width]", "[keyword arcgradient]", "[keyword wordwraparcs]"
);
MT("mscgen arcs classify as keyword",
"[keyword note]","[keyword abox]","[keyword rbox]","[keyword box]",
"[keyword |||...---]", "[keyword ..--==::]",
"[keyword ->]", "[keyword <-]", "[keyword <->]",
"[keyword =>]", "[keyword <=]", "[keyword <=>]",
"[keyword =>>]", "[keyword <<=]", "[keyword <<=>>]",
"[keyword >>]", "[keyword <<]", "[keyword <<>>]",
"[keyword -x]", "[keyword x-]", "[keyword -X]", "[keyword X-]",
"[keyword :>]", "[keyword <:]", "[keyword <:>]"
);
MT("within an attribute list, mscgen/ xù attributes classify as base",
"[base [[label]",
"[base idurl id url]",
"[base linecolor linecolour textcolor textcolour textbgcolor textbgcolour]",
"[base arclinecolor arclinecolour arctextcolor arctextcolour arctextbgcolor arctextbgcolour]",
"[base arcskip]]]"
);
MT("outside an attribute list, mscgen/ xù attributes classify as base",
"[base label]",
"[base idurl id url]",
"[base linecolor linecolour textcolor textcolour textbgcolor textbgcolour]",
"[base arclinecolor arclinecolour arctextcolor arctextcolour arctextbgcolor arctextbgcolour]",
"[base arcskip]"
);
MT("a typical program",
"[comment # typical msgenny program]",
"[keyword wordwraparcs][operator =][string \"true\"][base , ][keyword hscale][operator =][string \"0.8\"][base , ][keyword arcgradient][operator =][base 30;]",
"[base a : ][string \"Entity A\"][base ,]",
"[base b : Entity B,]",
"[base c : Entity C;]",
"[base a ][keyword =>>][base b: ][string \"Hello entity B\"][base ;]",
"[base a ][keyword alt][base c][bracket {]",
"[base a ][keyword <<][base b: ][string \"Here's an answer dude!\"][base ;]",
"[keyword ---][base : ][string \"sorry, won't march - comm glitch\"]",
"[base a ][keyword x-][base b: ][string \"Here's an answer dude! (won't arrive...)\"][base ;]",
"[bracket }]",
"[base c ][keyword :>][base *: What about me?;]"
);
})();

View file

@ -0,0 +1,75 @@
// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE
(function() {
var mode = CodeMirror.getMode({indentUnit: 2}, "text/x-xu");
function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1), "xu"); }
MT("empty chart",
"[keyword msc][bracket {]",
"[base ]",
"[bracket }]"
);
MT("comments",
"[comment // a single line comment]",
"[comment # another single line comment /* and */ ignored here]",
"[comment /* A multi-line comment even though it contains]",
"[comment msc keywords and \"quoted text\"*/]");
MT("strings",
"[string \"// a string\"]",
"[string \"a string running over]",
"[string two lines\"]",
"[string \"with \\\"escaped quote\"]"
);
MT("xù/ msgenny keywords classify as 'keyword'",
"[keyword watermark]",
"[keyword alt]","[keyword loop]","[keyword opt]","[keyword ref]","[keyword else]","[keyword break]","[keyword par]","[keyword seq]","[keyword assert]"
);
MT("mscgen options classify as keyword",
"[keyword hscale]", "[keyword width]", "[keyword arcgradient]", "[keyword wordwraparcs]"
);
MT("mscgen arcs classify as keyword",
"[keyword note]","[keyword abox]","[keyword rbox]","[keyword box]",
"[keyword |||...---]", "[keyword ..--==::]",
"[keyword ->]", "[keyword <-]", "[keyword <->]",
"[keyword =>]", "[keyword <=]", "[keyword <=>]",
"[keyword =>>]", "[keyword <<=]", "[keyword <<=>>]",
"[keyword >>]", "[keyword <<]", "[keyword <<>>]",
"[keyword -x]", "[keyword x-]", "[keyword -X]", "[keyword X-]",
"[keyword :>]", "[keyword <:]", "[keyword <:>]"
);
MT("within an attribute list, attributes classify as attribute",
"[bracket [[][attribute label]",
"[attribute id]","[attribute url]","[attribute idurl]",
"[attribute linecolor]","[attribute linecolour]","[attribute textcolor]","[attribute textcolour]","[attribute textbgcolor]","[attribute textbgcolour]",
"[attribute arclinecolor]","[attribute arclinecolour]","[attribute arctextcolor]","[attribute arctextcolour]","[attribute arctextbgcolor]","[attribute arctextbgcolour]",
"[attribute arcskip][bracket ]]]"
);
MT("outside an attribute list, attributes classify as base",
"[base label]",
"[base id]","[base url]","[base idurl]",
"[base linecolor]","[base linecolour]","[base textcolor]","[base textcolour]","[base textbgcolor]","[base textbgcolour]",
"[base arclinecolor]","[base arclinecolour]","[base arctextcolor]","[base arctextcolour]","[base arctextbgcolor]","[base arctextbgcolour]",
"[base arcskip]"
);
MT("a typical program",
"[comment # typical mscgen program]",
"[keyword msc][base ][bracket {]",
"[keyword wordwraparcs][operator =][string \"true\"][keyword hscale][operator =][string \"0.8\"][keyword arcgradient][operator =][base 30;]",
"[base a][bracket [[][attribute label][operator =][string \"Entity A\"][bracket ]]][base ,]",
"[base b][bracket [[][attribute label][operator =][string \"Entity B\"][bracket ]]][base ,]",
"[base c][bracket [[][attribute label][operator =][string \"Entity C\"][bracket ]]][base ;]",
"[base a ][keyword =>>][base b][bracket [[][attribute label][operator =][string \"Hello entity B\"][bracket ]]][base ;]",
"[base a ][keyword <<][base b][bracket [[][attribute label][operator =][string \"Here's an answer dude!\"][bracket ]]][base ;]",
"[base c ][keyword :>][base *][bracket [[][attribute label][operator =][string \"What about me?\"][base , ][attribute textcolor][operator =][base red][bracket ]]][base ;]",
"[bracket }]"
);
})();