214 lines
7.1 KiB
JavaScript
214 lines
7.1 KiB
JavaScript
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
|
// Distributed under an MIT license: https://codemirror.net/5/LICENSE
|
|
|
|
/*
|
|
* =====================================================================================
|
|
*
|
|
* Filename: mode/tightwiki/tightwiki.js
|
|
*
|
|
* Description: CodeMirror mode for tightwiki
|
|
*
|
|
* Created: 10/30/2022
|
|
*
|
|
* Author: Josh Patterson
|
|
* Company: NetworkDLS
|
|
*
|
|
* =====================================================================================
|
|
*/
|
|
|
|
(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("tightwiki", function () {
|
|
var functions = ["##systememojicategorylist", "##systememojilist", "##set", "##seq", "##get", "##color", "##searchlist", "##taglist", "##searchcloud", "##tagglossary", "##recentlymodified", "##textglossary", "##tagcloud", "##image", "##file", "##related", "##tags", "##editlink", "##inject", "##include", "##br", "##hr", "##revisions", "##attachments", "##toc", "##title", "##navigation", "##name", "##created", "##lastmodified", "##sitename", "##appversion", "##profileglossary", "##profilelist", "##namespaceglossary", "##namespacelist","##namespace", "##snippet"],
|
|
instructions = ["@@protect", "@@hidefooterlastmodified", "@@tags", "@@title", "@@hidefootercomments", "@@nocache", "@@draft", "@@review", "@@deprecate", "@@include", "@@template"],
|
|
scopes = ["bullets", "alert", "background", "collapse", "callout", "code", "foreground", "jumbotron", "card", "table", "stripedtable", "definesnippet", "order"];
|
|
|
|
function basicToken(stream, state) {
|
|
|
|
var cur = '';
|
|
var ch = stream.next();
|
|
var cc = '';
|
|
|
|
// Comment (Single-line)
|
|
if (ch == ";") {
|
|
if (stream.peek() == ';') {
|
|
stream.skipToEnd();
|
|
return "comment";
|
|
}
|
|
}
|
|
// Highlight
|
|
if (ch == "!") {
|
|
if (stream.peek() == '!') {
|
|
if (stream.skipTo("!!")) {
|
|
stream.eatWhile('!');
|
|
return "highlight";
|
|
}
|
|
}
|
|
}
|
|
// Emoji
|
|
if (ch == "%") {
|
|
if (stream.peek() == '%') {
|
|
if (stream.skipTo("%%")) {
|
|
stream.eatWhile('%');
|
|
return "strong";
|
|
}
|
|
}
|
|
}
|
|
// Bold
|
|
if (ch == "*") {
|
|
if (stream.peek() == '*') {
|
|
if (stream.skipTo("**")) {
|
|
stream.eatWhile('*');
|
|
return "strong";
|
|
}
|
|
}
|
|
}
|
|
// Italics
|
|
if (ch == "/") {
|
|
if (stream.peek() == '/') {
|
|
if (stream.skipTo("//")) {
|
|
stream.eatWhile('/');
|
|
return "italics";
|
|
}
|
|
}
|
|
}
|
|
// Underline
|
|
if (ch == "_") {
|
|
if (stream.peek() == '_') {
|
|
if (stream.skipTo("__")) {
|
|
stream.eatWhile('_');
|
|
return "underline";
|
|
}
|
|
}
|
|
}
|
|
// Strike though
|
|
if (ch == "~") {
|
|
if (stream.peek() == '~') {
|
|
if (stream.skipTo("~~")) {
|
|
stream.eatWhile('~');
|
|
return "strike";
|
|
}
|
|
}
|
|
}
|
|
// Headings
|
|
if (ch == "=") {
|
|
if (stream.peek() == '=') {
|
|
stream.skipToEnd();
|
|
return "heading";
|
|
}
|
|
}
|
|
|
|
// Links
|
|
if (ch == '[') {
|
|
stream.eatWhile(/\[/);
|
|
cur = stream.current();
|
|
if (cur == "[[") {
|
|
stream.skipTo(']');
|
|
stream.eatWhile(']');
|
|
return "atom";
|
|
}
|
|
}
|
|
|
|
// String "..."
|
|
if (ch == '"') {
|
|
stream.skipTo('"');
|
|
return "string";
|
|
}
|
|
|
|
// String '...'
|
|
if (ch == "'") {
|
|
stream.skipTo("'");
|
|
return "string-2";
|
|
}
|
|
|
|
// Instructions
|
|
cc = '#';
|
|
if (ch == cc) {
|
|
if (stream.peek() == cc) {
|
|
stream.eat(cc);
|
|
stream.eatWhile(/\w/);
|
|
cur = stream.current().toLowerCase();
|
|
if (functions.indexOf(cur) !== -1) {
|
|
return "variable-3 strong";
|
|
}
|
|
}
|
|
}
|
|
|
|
// Instructions
|
|
cc = '@';
|
|
if (ch == cc) {
|
|
if (stream.peek() == cc) {
|
|
stream.eat(cc);
|
|
stream.eatWhile(/\w/);
|
|
cur = stream.current().toLowerCase();
|
|
if (instructions.indexOf(cur) !== -1) {
|
|
return "variable-2 strong";
|
|
}
|
|
}
|
|
}
|
|
|
|
//Enter scope
|
|
if (ch == '{') {
|
|
stream.eatWhile('{');
|
|
if (stream.current() == "{{") {
|
|
state.scopeLevel++;
|
|
state.inScopeFirstLine = true;
|
|
return "";
|
|
}
|
|
}
|
|
|
|
//Exit scope
|
|
if (ch == '}') {
|
|
stream.eatWhile('}');
|
|
if (stream.current() == "}}") {
|
|
state.scopeLevel--;
|
|
state.inScopeFirstLine = false;
|
|
return "";
|
|
}
|
|
}
|
|
|
|
// Variables
|
|
if (ch == '$') {
|
|
if (stream.peek() == '{') {
|
|
stream.skipTo('}');
|
|
stream.eat('}');
|
|
return "variable-2";
|
|
}
|
|
}
|
|
|
|
// Everything else
|
|
stream.eatWhile(/\w/);
|
|
cur = stream.current().toLowerCase();
|
|
|
|
//Scope functions (must be a scope function and be on the first line of the scrop definition)
|
|
if (state.inScopeFirstLine == true && scopes.indexOf(cur) !== -1) {
|
|
state.inScopeFirstLine = false;
|
|
return "variable-2 strong";
|
|
}
|
|
}
|
|
|
|
return {
|
|
startState: function () {
|
|
return {
|
|
scopeLevel: 0,
|
|
inScopeFirstLine: false
|
|
};
|
|
},
|
|
token: function (stream, state) {
|
|
if (stream.eatSpace()) return null;
|
|
return basicToken(stream, state);
|
|
}
|
|
};
|
|
});
|
|
|
|
CodeMirror.defineMIME("text/x-tightwiki", "tightwiki");
|
|
});
|