annotate .cms/lib/codemirror/demo/simplemode.html @ 0:78edf6b517a0 draft

24.10
author Coffee CMS <info@coffee-cms.ru>
date Fri, 11 Oct 2024 22:40:23 +0000
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
1 <!doctype html>
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
2
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
3 <title>CodeMirror: Simple Mode Demo</title>
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
4 <meta charset="utf-8"/>
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
5 <link rel=stylesheet href="../doc/docs.css">
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
6
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
7 <link rel="stylesheet" href="../lib/codemirror.css">
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
8 <script src="../lib/codemirror.js"></script>
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
9 <script src="../addon/mode/simple.js"></script>
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
10 <script src="../mode/xml/xml.js"></script>
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
11 <style>
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
12 .CodeMirror {border: 1px solid silver; margin-bottom: 1em; }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
13 dt { text-indent: -2em; padding-left: 2em; margin-top: 1em; }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
14 dd { margin-left: 1.5em; margin-bottom: 1em; }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
15 dt {margin-top: 1em;}
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
16 </style>
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
17
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
18 <div id=nav>
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
19 <a href="https://codemirror.net/5"><h1>CodeMirror</h1><img id=logo src="../doc/logo.png"></a>
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
20
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
21 <ul>
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
22 <li><a href="../index.html">Home</a>
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
23 <li><a href="../doc/manual.html">Manual</a>
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
24 <li><a href="https://github.com/codemirror/codemirror5">Code</a>
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
25 </ul>
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
26 <ul>
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
27 <li><a class=active href="#">Simple Mode</a>
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
28 </ul>
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
29 </div>
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
30
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
31 <article>
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
32 <h2>Simple Mode Demo</h2>
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
33
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
34 <p>The <a href="../addon/mode/simple.js"><code>mode/simple</code></a>
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
35 addon allows CodeMirror modes to be specified using a relatively simple
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
36 declarative format. This format is not as powerful as writing code
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
37 directly against the <a href="../doc/manual.html#modeapi">mode
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
38 interface</a>, but is a lot easier to get started with, and
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
39 sufficiently expressive for many simple language modes.</p>
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
40
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
41 <p>This interface is still in flux. It is unlikely to be scrapped or
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
42 overhauled completely, so do start writing code against it, but
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
43 details might change as it stabilizes, and you might have to tweak
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
44 your code when upgrading.</p>
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
45
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
46 <p>Simple modes (loosely based on
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
47 the <a href="https://github.com/mozilla/skywriter/wiki/Common-JavaScript-Syntax-Highlighting-Specification">Common
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
48 JavaScript Syntax Highlighting Specification</a>, which never took
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
49 off), are state machines, where each state has a number of rules that
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
50 match tokens. A rule describes a type of token that may occur in the
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
51 current state, and possibly a transition to another state caused by
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
52 that token.</p>
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
53
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
54 <p>The <code>CodeMirror.defineSimpleMode(name, states)</code> method
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
55 takes a mode name and an object that describes the mode's states. The
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
56 editor below shows an example of such a mode (and is itself
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
57 highlighted by the mode shown in it).</p>
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
58
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
59 <div id="code"></div>
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
60
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
61 <p>Each state is an array of rules. A rule may have the following properties:</p>
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
62
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
63 <dl>
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
64 <dt><code><strong>regex</strong>: string | RegExp</code></dt>
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
65 <dd>The regular expression that matches the token. May be a string
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
66 or a regex object. When a regex, the <code>ignoreCase</code> flag
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
67 will be taken into account when matching the token. This regex
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
68 has to capture groups when the <code>token</code> property is
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
69 an array. If it captures groups, it must capture <em>all</em> of the string
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
70 (since JS provides no way to find out where a group matched).
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
71 Currently negative lookbehind assertion for regex is not supported, regardless of browser support.</dd>
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
72 <dt><code><strong>token</strong></code>: string | array&lt;string&gt; | null</dt>
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
73 <dd>An optional token style. Multiple styles can be specified by
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
74 separating them with dots or spaces. When this property holds an array of token styles,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
75 the <code>regex</code> for this rule must capture a group for each array item.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
76 </dd>
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
77 <dt><code><strong>sol</strong></code>: boolean</dt>
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
78 <dd>When true, this token will only match at the start of the line.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
79 (The <code>^</code> regexp marker doesn't work as you'd expect in
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
80 this context because of limitations in JavaScript's RegExp
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
81 API.)</dd>
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
82 <dt><code><strong>next</strong>: string</code></dt>
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
83 <dd>When a <code>next</code> property is present, the mode will
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
84 transfer to the state named by the property when the token is
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
85 encountered.</dd>
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
86 <dt><code><strong>push</strong>: string</code></dt>
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
87 <dd>Like <code>next</code>, but instead replacing the current state
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
88 by the new state, the current state is kept on a stack, and can be
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
89 returned to with the <code>pop</code> directive.</dd>
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
90 <dt><code><strong>pop</strong>: bool</code></dt>
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
91 <dd>When true, and there is another state on the state stack, will
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
92 cause the mode to pop that state off the stack and transition to
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
93 it.</dd>
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
94 <dt><code><strong>mode</strong>: {spec, end, persistent}</code></dt>
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
95 <dd>Can be used to embed another mode inside a mode. When present,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
96 must hold an object with a <code>spec</code> property that describes
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
97 the embedded mode, and an optional <code>end</code> end property
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
98 that specifies the regexp that will end the extent of the mode. When
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
99 a <code>persistent</code> property is set (and true), the nested
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
100 mode's state will be preserved between occurrences of the mode.</dd>
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
101 <dt><code><strong>indent</strong>: bool</code></dt>
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
102 <dd>When true, this token changes the indentation to be one unit
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
103 more than the current line's indentation.</dd>
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
104 <dt><code><strong>dedent</strong>: bool</code></dt>
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
105 <dd>When true, this token will pop one scope off the indentation
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
106 stack.</dd>
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
107 <dt><code><strong>dedentIfLineStart</strong>: bool</code></dt>
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
108 <dd>If a token has its <code>dedent</code> property set, it will, by
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
109 default, cause lines where it appears at the start to be dedented.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
110 Set this property to false to prevent that behavior.</dd>
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
111 </dl>
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
112
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
113 <p>The <code>meta</code> property of the states object is special, and
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
114 will not be interpreted as a state. Instead, properties set on it will
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
115 be set on the mode, which is useful for properties
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
116 like <a href="../doc/manual.html#addon_comment"><code>lineComment</code></a>,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
117 which sets the comment style for a mode. The simple mode addon also
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
118 recognizes a few such properties:</p>
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
119
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
120 <dl>
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
121 <dt><code><strong>dontIndentStates</strong>: array&lt;string&gt;</code></dt>
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
122 <dd>An array of states in which the mode's auto-indentation should
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
123 not take effect. Usually used for multi-line comment and string
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
124 states.</dd>
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
125 </dl>
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
126
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
127 <script id="modecode">/* Example definition of a simple mode that understands a subset of
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
128 * JavaScript:
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
129 */
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
130
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
131 CodeMirror.defineSimpleMode("simplemode", {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
132 // The start state contains the rules that are initially used
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
133 start: [
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
134 // The regex matches the token, the token property contains the type
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
135 {regex: /"(?:[^\\]|\\.)*?(?:"|$)/, token: "string"},
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
136 // You can match multiple tokens at once. Note that the captured
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
137 // groups must span the whole string in this case
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
138 {regex: /(function)(\s+)([a-z$][\w$]*)/,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
139 token: ["keyword", null, "variable-2"]},
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
140 // Rules are matched in the order in which they appear, so there is
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
141 // no ambiguity between this one and the one above
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
142 {regex: /(?:function|var|return|if|for|while|else|do|this)\b/,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
143 token: "keyword"},
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
144 {regex: /true|false|null|undefined/, token: "atom"},
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
145 {regex: /0x[a-f\d]+|[-+]?(?:\.\d+|\d+\.?\d*)(?:e[-+]?\d+)?/i,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
146 token: "number"},
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
147 {regex: /\/\/.*/, token: "comment"},
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
148 {regex: /\/(?:[^\\]|\\.)*?\//, token: "variable-3"},
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
149 // A next property will cause the mode to move to a different state
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
150 {regex: /\/\*/, token: "comment", next: "comment"},
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
151 {regex: /[-+\/*=<>!]+/, token: "operator"},
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
152 // indent and dedent properties guide autoindentation
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
153 {regex: /[\{\[\(]/, indent: true},
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
154 {regex: /[\}\]\)]/, dedent: true},
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
155 {regex: /[a-z$][\w$]*/, token: "variable"},
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
156 // You can embed other modes with the mode property. This rule
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
157 // causes all code between << and >> to be highlighted with the XML
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
158 // mode.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
159 {regex: /<</, token: "meta", mode: {spec: "xml", end: />>/}}
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
160 ],
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
161 // The multi-line comment state.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
162 comment: [
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
163 {regex: /.*?\*\//, token: "comment", next: "start"},
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
164 {regex: /.*/, token: "comment"}
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
165 ],
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
166 // The meta property contains global information about the mode. It
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
167 // can contain properties like lineComment, which are supported by
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
168 // all modes, and also directives like dontIndentStates, which are
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
169 // specific to simple modes.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
170 meta: {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
171 dontIndentStates: ["comment"],
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
172 lineComment: "//"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
173 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
174 });
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
175 </script>
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
176
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
177 <script>
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
178 var sc = document.getElementById("modecode");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
179 var code = document.getElementById("code");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
180 var editor = CodeMirror(code, {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
181 value: (sc.textContent || sc.innerText || sc.innerHTML),
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
182 mode: "simplemode"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
183 });
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
184 </script>
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
185
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
186 </article>