| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469 | 
							- // CodeMirror, copyright (c) by Marijn Haverbeke and others
 
- // Distributed under an MIT license: https://codemirror.net/LICENSE
 
- (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 TOKEN_STYLES = {
 
-     addition: "positive",
 
-     attributes: "attribute",
 
-     bold: "strong",
 
-     cite: "keyword",
 
-     code: "atom",
 
-     definitionList: "number",
 
-     deletion: "negative",
 
-     div: "punctuation",
 
-     em: "em",
 
-     footnote: "variable",
 
-     footCite: "qualifier",
 
-     header: "header",
 
-     html: "comment",
 
-     image: "string",
 
-     italic: "em",
 
-     link: "link",
 
-     linkDefinition: "link",
 
-     list1: "variable-2",
 
-     list2: "variable-3",
 
-     list3: "keyword",
 
-     notextile: "string-2",
 
-     pre: "operator",
 
-     p: "property",
 
-     quote: "bracket",
 
-     span: "quote",
 
-     specialChar: "tag",
 
-     strong: "strong",
 
-     sub: "builtin",
 
-     sup: "builtin",
 
-     table: "variable-3",
 
-     tableHeading: "operator"
 
-   };
 
-   function startNewLine(stream, state) {
 
-     state.mode = Modes.newLayout;
 
-     state.tableHeading = false;
 
-     if (state.layoutType === "definitionList" && state.spanningLayout &&
 
-         stream.match(RE("definitionListEnd"), false))
 
-       state.spanningLayout = false;
 
-   }
 
-   function handlePhraseModifier(stream, state, ch) {
 
-     if (ch === "_") {
 
-       if (stream.eat("_"))
 
-         return togglePhraseModifier(stream, state, "italic", /__/, 2);
 
-       else
 
-         return togglePhraseModifier(stream, state, "em", /_/, 1);
 
-     }
 
-     if (ch === "*") {
 
-       if (stream.eat("*")) {
 
-         return togglePhraseModifier(stream, state, "bold", /\*\*/, 2);
 
-       }
 
-       return togglePhraseModifier(stream, state, "strong", /\*/, 1);
 
-     }
 
-     if (ch === "[") {
 
-       if (stream.match(/\d+\]/)) state.footCite = true;
 
-       return tokenStyles(state);
 
-     }
 
-     if (ch === "(") {
 
-       var spec = stream.match(/^(r|tm|c)\)/);
 
-       if (spec)
 
-         return tokenStylesWith(state, TOKEN_STYLES.specialChar);
 
-     }
 
-     if (ch === "<" && stream.match(/(\w+)[^>]+>[^<]+<\/\1>/))
 
-       return tokenStylesWith(state, TOKEN_STYLES.html);
 
-     if (ch === "?" && stream.eat("?"))
 
-       return togglePhraseModifier(stream, state, "cite", /\?\?/, 2);
 
-     if (ch === "=" && stream.eat("="))
 
-       return togglePhraseModifier(stream, state, "notextile", /==/, 2);
 
-     if (ch === "-" && !stream.eat("-"))
 
-       return togglePhraseModifier(stream, state, "deletion", /-/, 1);
 
-     if (ch === "+")
 
-       return togglePhraseModifier(stream, state, "addition", /\+/, 1);
 
-     if (ch === "~")
 
-       return togglePhraseModifier(stream, state, "sub", /~/, 1);
 
-     if (ch === "^")
 
-       return togglePhraseModifier(stream, state, "sup", /\^/, 1);
 
-     if (ch === "%")
 
-       return togglePhraseModifier(stream, state, "span", /%/, 1);
 
-     if (ch === "@")
 
-       return togglePhraseModifier(stream, state, "code", /@/, 1);
 
-     if (ch === "!") {
 
-       var type = togglePhraseModifier(stream, state, "image", /(?:\([^\)]+\))?!/, 1);
 
-       stream.match(/^:\S+/); // optional Url portion
 
-       return type;
 
-     }
 
-     return tokenStyles(state);
 
-   }
 
-   function togglePhraseModifier(stream, state, phraseModifier, closeRE, openSize) {
 
-     var charBefore = stream.pos > openSize ? stream.string.charAt(stream.pos - openSize - 1) : null;
 
-     var charAfter = stream.peek();
 
-     if (state[phraseModifier]) {
 
-       if ((!charAfter || /\W/.test(charAfter)) && charBefore && /\S/.test(charBefore)) {
 
-         var type = tokenStyles(state);
 
-         state[phraseModifier] = false;
 
-         return type;
 
-       }
 
-     } else if ((!charBefore || /\W/.test(charBefore)) && charAfter && /\S/.test(charAfter) &&
 
-                stream.match(new RegExp("^.*\\S" + closeRE.source + "(?:\\W|$)"), false)) {
 
-       state[phraseModifier] = true;
 
-       state.mode = Modes.attributes;
 
-     }
 
-     return tokenStyles(state);
 
-   };
 
-   function tokenStyles(state) {
 
-     var disabled = textileDisabled(state);
 
-     if (disabled) return disabled;
 
-     var styles = [];
 
-     if (state.layoutType) styles.push(TOKEN_STYLES[state.layoutType]);
 
-     styles = styles.concat(activeStyles(
 
-       state, "addition", "bold", "cite", "code", "deletion", "em", "footCite",
 
-       "image", "italic", "link", "span", "strong", "sub", "sup", "table", "tableHeading"));
 
-     if (state.layoutType === "header")
 
-       styles.push(TOKEN_STYLES.header + "-" + state.header);
 
-     return styles.length ? styles.join(" ") : null;
 
-   }
 
-   function textileDisabled(state) {
 
-     var type = state.layoutType;
 
-     switch(type) {
 
-     case "notextile":
 
-     case "code":
 
-     case "pre":
 
-       return TOKEN_STYLES[type];
 
-     default:
 
-       if (state.notextile)
 
-         return TOKEN_STYLES.notextile + (type ? (" " + TOKEN_STYLES[type]) : "");
 
-       return null;
 
-     }
 
-   }
 
-   function tokenStylesWith(state, extraStyles) {
 
-     var disabled = textileDisabled(state);
 
-     if (disabled) return disabled;
 
-     var type = tokenStyles(state);
 
-     if (extraStyles)
 
-       return type ? (type + " " + extraStyles) : extraStyles;
 
-     else
 
-       return type;
 
-   }
 
-   function activeStyles(state) {
 
-     var styles = [];
 
-     for (var i = 1; i < arguments.length; ++i) {
 
-       if (state[arguments[i]])
 
-         styles.push(TOKEN_STYLES[arguments[i]]);
 
-     }
 
-     return styles;
 
-   }
 
-   function blankLine(state) {
 
-     var spanningLayout = state.spanningLayout, type = state.layoutType;
 
-     for (var key in state) if (state.hasOwnProperty(key))
 
-       delete state[key];
 
-     state.mode = Modes.newLayout;
 
-     if (spanningLayout) {
 
-       state.layoutType = type;
 
-       state.spanningLayout = true;
 
-     }
 
-   }
 
-   var REs = {
 
-     cache: {},
 
-     single: {
 
-       bc: "bc",
 
-       bq: "bq",
 
-       definitionList: /- .*?:=+/,
 
-       definitionListEnd: /.*=:\s*$/,
 
-       div: "div",
 
-       drawTable: /\|.*\|/,
 
-       foot: /fn\d+/,
 
-       header: /h[1-6]/,
 
-       html: /\s*<(?:\/)?(\w+)(?:[^>]+)?>(?:[^<]+<\/\1>)?/,
 
-       link: /[^"]+":\S/,
 
-       linkDefinition: /\[[^\s\]]+\]\S+/,
 
-       list: /(?:#+|\*+)/,
 
-       notextile: "notextile",
 
-       para: "p",
 
-       pre: "pre",
 
-       table: "table",
 
-       tableCellAttributes: /[\/\\]\d+/,
 
-       tableHeading: /\|_\./,
 
-       tableText: /[^"_\*\[\(\?\+~\^%@|-]+/,
 
-       text: /[^!"_=\*\[\(<\?\+~\^%@-]+/
 
-     },
 
-     attributes: {
 
-       align: /(?:<>|<|>|=)/,
 
-       selector: /\([^\(][^\)]+\)/,
 
-       lang: /\[[^\[\]]+\]/,
 
-       pad: /(?:\(+|\)+){1,2}/,
 
-       css: /\{[^\}]+\}/
 
-     },
 
-     createRe: function(name) {
 
-       switch (name) {
 
-       case "drawTable":
 
-         return REs.makeRe("^", REs.single.drawTable, "$");
 
-       case "html":
 
-         return REs.makeRe("^", REs.single.html, "(?:", REs.single.html, ")*", "$");
 
-       case "linkDefinition":
 
-         return REs.makeRe("^", REs.single.linkDefinition, "$");
 
-       case "listLayout":
 
-         return REs.makeRe("^", REs.single.list, RE("allAttributes"), "*\\s+");
 
-       case "tableCellAttributes":
 
-         return REs.makeRe("^", REs.choiceRe(REs.single.tableCellAttributes,
 
-                                             RE("allAttributes")), "+\\.");
 
-       case "type":
 
-         return REs.makeRe("^", RE("allTypes"));
 
-       case "typeLayout":
 
-         return REs.makeRe("^", RE("allTypes"), RE("allAttributes"),
 
-                           "*\\.\\.?", "(\\s+|$)");
 
-       case "attributes":
 
-         return REs.makeRe("^", RE("allAttributes"), "+");
 
-       case "allTypes":
 
-         return REs.choiceRe(REs.single.div, REs.single.foot,
 
-                             REs.single.header, REs.single.bc, REs.single.bq,
 
-                             REs.single.notextile, REs.single.pre, REs.single.table,
 
-                             REs.single.para);
 
-       case "allAttributes":
 
-         return REs.choiceRe(REs.attributes.selector, REs.attributes.css,
 
-                             REs.attributes.lang, REs.attributes.align, REs.attributes.pad);
 
-       default:
 
-         return REs.makeRe("^", REs.single[name]);
 
-       }
 
-     },
 
-     makeRe: function() {
 
-       var pattern = "";
 
-       for (var i = 0; i < arguments.length; ++i) {
 
-         var arg = arguments[i];
 
-         pattern += (typeof arg === "string") ? arg : arg.source;
 
-       }
 
-       return new RegExp(pattern);
 
-     },
 
-     choiceRe: function() {
 
-       var parts = [arguments[0]];
 
-       for (var i = 1; i < arguments.length; ++i) {
 
-         parts[i * 2 - 1] = "|";
 
-         parts[i * 2] = arguments[i];
 
-       }
 
-       parts.unshift("(?:");
 
-       parts.push(")");
 
-       return REs.makeRe.apply(null, parts);
 
-     }
 
-   };
 
-   function RE(name) {
 
-     return (REs.cache[name] || (REs.cache[name] = REs.createRe(name)));
 
-   }
 
-   var Modes = {
 
-     newLayout: function(stream, state) {
 
-       if (stream.match(RE("typeLayout"), false)) {
 
-         state.spanningLayout = false;
 
-         return (state.mode = Modes.blockType)(stream, state);
 
-       }
 
-       var newMode;
 
-       if (!textileDisabled(state)) {
 
-         if (stream.match(RE("listLayout"), false))
 
-           newMode = Modes.list;
 
-         else if (stream.match(RE("drawTable"), false))
 
-           newMode = Modes.table;
 
-         else if (stream.match(RE("linkDefinition"), false))
 
-           newMode = Modes.linkDefinition;
 
-         else if (stream.match(RE("definitionList")))
 
-           newMode = Modes.definitionList;
 
-         else if (stream.match(RE("html"), false))
 
-           newMode = Modes.html;
 
-       }
 
-       return (state.mode = (newMode || Modes.text))(stream, state);
 
-     },
 
-     blockType: function(stream, state) {
 
-       var match, type;
 
-       state.layoutType = null;
 
-       if (match = stream.match(RE("type")))
 
-         type = match[0];
 
-       else
 
-         return (state.mode = Modes.text)(stream, state);
 
-       if (match = type.match(RE("header"))) {
 
-         state.layoutType = "header";
 
-         state.header = parseInt(match[0][1]);
 
-       } else if (type.match(RE("bq"))) {
 
-         state.layoutType = "quote";
 
-       } else if (type.match(RE("bc"))) {
 
-         state.layoutType = "code";
 
-       } else if (type.match(RE("foot"))) {
 
-         state.layoutType = "footnote";
 
-       } else if (type.match(RE("notextile"))) {
 
-         state.layoutType = "notextile";
 
-       } else if (type.match(RE("pre"))) {
 
-         state.layoutType = "pre";
 
-       } else if (type.match(RE("div"))) {
 
-         state.layoutType = "div";
 
-       } else if (type.match(RE("table"))) {
 
-         state.layoutType = "table";
 
-       }
 
-       state.mode = Modes.attributes;
 
-       return tokenStyles(state);
 
-     },
 
-     text: function(stream, state) {
 
-       if (stream.match(RE("text"))) return tokenStyles(state);
 
-       var ch = stream.next();
 
-       if (ch === '"')
 
-         return (state.mode = Modes.link)(stream, state);
 
-       return handlePhraseModifier(stream, state, ch);
 
-     },
 
-     attributes: function(stream, state) {
 
-       state.mode = Modes.layoutLength;
 
-       if (stream.match(RE("attributes")))
 
-         return tokenStylesWith(state, TOKEN_STYLES.attributes);
 
-       else
 
-         return tokenStyles(state);
 
-     },
 
-     layoutLength: function(stream, state) {
 
-       if (stream.eat(".") && stream.eat("."))
 
-         state.spanningLayout = true;
 
-       state.mode = Modes.text;
 
-       return tokenStyles(state);
 
-     },
 
-     list: function(stream, state) {
 
-       var match = stream.match(RE("list"));
 
-       state.listDepth = match[0].length;
 
-       var listMod = (state.listDepth - 1) % 3;
 
-       if (!listMod)
 
-         state.layoutType = "list1";
 
-       else if (listMod === 1)
 
-         state.layoutType = "list2";
 
-       else
 
-         state.layoutType = "list3";
 
-       state.mode = Modes.attributes;
 
-       return tokenStyles(state);
 
-     },
 
-     link: function(stream, state) {
 
-       state.mode = Modes.text;
 
-       if (stream.match(RE("link"))) {
 
-         stream.match(/\S+/);
 
-         return tokenStylesWith(state, TOKEN_STYLES.link);
 
-       }
 
-       return tokenStyles(state);
 
-     },
 
-     linkDefinition: function(stream, state) {
 
-       stream.skipToEnd();
 
-       return tokenStylesWith(state, TOKEN_STYLES.linkDefinition);
 
-     },
 
-     definitionList: function(stream, state) {
 
-       stream.match(RE("definitionList"));
 
-       state.layoutType = "definitionList";
 
-       if (stream.match(/\s*$/))
 
-         state.spanningLayout = true;
 
-       else
 
-         state.mode = Modes.attributes;
 
-       return tokenStyles(state);
 
-     },
 
-     html: function(stream, state) {
 
-       stream.skipToEnd();
 
-       return tokenStylesWith(state, TOKEN_STYLES.html);
 
-     },
 
-     table: function(stream, state) {
 
-       state.layoutType = "table";
 
-       return (state.mode = Modes.tableCell)(stream, state);
 
-     },
 
-     tableCell: function(stream, state) {
 
-       if (stream.match(RE("tableHeading")))
 
-         state.tableHeading = true;
 
-       else
 
-         stream.eat("|");
 
-       state.mode = Modes.tableCellAttributes;
 
-       return tokenStyles(state);
 
-     },
 
-     tableCellAttributes: function(stream, state) {
 
-       state.mode = Modes.tableText;
 
-       if (stream.match(RE("tableCellAttributes")))
 
-         return tokenStylesWith(state, TOKEN_STYLES.attributes);
 
-       else
 
-         return tokenStyles(state);
 
-     },
 
-     tableText: function(stream, state) {
 
-       if (stream.match(RE("tableText")))
 
-         return tokenStyles(state);
 
-       if (stream.peek() === "|") { // end of cell
 
-         state.mode = Modes.tableCell;
 
-         return tokenStyles(state);
 
-       }
 
-       return handlePhraseModifier(stream, state, stream.next());
 
-     }
 
-   };
 
-   CodeMirror.defineMode("textile", function() {
 
-     return {
 
-       startState: function() {
 
-         return { mode: Modes.newLayout };
 
-       },
 
-       token: function(stream, state) {
 
-         if (stream.sol()) startNewLine(stream, state);
 
-         return state.mode(stream, state);
 
-       },
 
-       blankLine: blankLine
 
-     };
 
-   });
 
-   CodeMirror.defineMIME("text/x-textile", "textile");
 
- });
 
 
  |