css-syntax/Diagrams.src.html

Sun, 01 Sep 2013 16:18:24 +0100

author
Simon Sapin <simon.sapin@exyr.org>
date
Sun, 01 Sep 2013 16:18:24 +0100
changeset 8996
dec8752a6390
parent 8830
d945246d2184
child 9016
d88caaa3d5fa
permissions
-rw-r--r--

[css-syntax] Revert <unicode-range> changes from CSS 2.1

simon@7016 1 <!doctype html>
simon@7016 2 <meta charset=utf-8>
simon@7016 3 <title>JavaScript source for the railroad diagrams (CSS3 Syntax)</title>
simon@7016 4 <link rel=stylesheet href=railroad-diagrams.css>
simon@7016 5 <script src=railroad-diagrams.js></script>
simon@7016 6
simon@7016 7 <h1>Railroad diagrams for CSS Syntax Level 3</h1>
simon@7048 8 <p>This file contains the JavaScript “source” of the diagrams.
simon@7048 9 The library converting them into SVG is maintained
simon@7048 10 <a href="https://github.com/tabatkins/railroad-diagrams">on GitHub</a>.
simon@7048 11 The <code>update-diagram-lib.sh</code> script can be used to get the
simon@7048 12 latest version of the library.
simon@7048 13 </p>
simon@7048 14 <p>
simon@7016 15 The intent is that edits are done in this file for easy preview.
simon@7016 16 When the diagrams give satisfaction, the <a href="#markup">markup</a>
simon@7016 17 can be copied and pasted into <code>Overview.src.html</code>.
simon@7016 18 </p>
simon@7016 19
simon@7016 20 <h2>Preview</h2>
simon@7346 21 <h3 id=tokens>Tokens</h3>
simon@7346 22 <dl>
simon@7346 23 </dl>
simon@7346 24 <h3 id=parsing>Parsing</h3>
simon@7475 25 <p>All comments are ignored.</p>
simon@7016 26 <dl>
simon@7016 27 </dl>
simon@7016 28
simon@7346 29
simon@7016 30 <h2 id=markup>Markup</h2>
simon@7346 31 <h3>Tokens</h3>
simon@7346 32 <textarea style="box-sizing: border-box; width: 100%; height: 20em">
simon@7346 33 </textarea>
simon@7346 34 <h3>Parsing</h3>
simon@7016 35 <textarea style="box-sizing: border-box; width: 100%; height: 20em">
simon@7016 36 </textarea>
simon@7016 37
simon@7016 38 <script>
simon@7016 39 var preview = document.getElementsByTagName('dl')[0];
simon@7016 40
simon@7016 41 function add(name, diagram) {
simon@7016 42 var dt = document.createElement('dt'),
simon@7016 43 dd = document.createElement('dd');
simon@7016 44 dt.textContent = name;
simon@7475 45 name = name.toLowerCase().replace(/[\/ ]/g, '-').replace(/[*!]/g, '');
simon@7475 46 dt.setAttribute('id', name + '-diagram');
simon@7016 47 dd.appendChild(diagram.toSVG());
simon@7016 48 preview.appendChild(document.createTextNode('\t'));
simon@7016 49 preview.appendChild(dt);
simon@7016 50 preview.appendChild(document.createTextNode('\n\t\t'));
simon@7016 51 preview.appendChild(dd);
simon@7016 52 preview.appendChild(document.createTextNode('\n\n\t'));
simon@7016 53 }
simon@7016 54
simon@7475 55 add('comment', Diagram(
simon@7475 56 '/*',
simon@7475 57 ZeroOrMore(
simon@7475 58 NonTerminal('anything but * followed by /')),
simon@7475 59 '*/'));
simon@7475 60
simon@7475 61 add('newline', Diagram(Choice(0, '\\n', '\\r\\n', '\\r', '\\f')));
simon@7475 62
simon@8830 63 add('whitespace', Diagram(Choice(
simon@7475 64 0, 'space', '\\t', NonTerminal('newline'))));
simon@7475 65
simon@8996 66 add('hex digit', Diagram(NonTerminal('0-9 a-f or A-F')));
simon@8996 67
simon@7017 68 add('escape', Diagram(
simon@7017 69 '\\', Choice(0,
simon@7475 70 NonTerminal('not newline or hex digit'),
simon@7017 71 Sequence(
simon@7017 72 OneOrMore(NonTerminal('hex digit'), Comment('1-6 times')),
simon@8830 73 Optional(NonTerminal('whitespace'), 'skip')))));
simon@7475 74
simon@8830 75 add('〈whitespace〉', Diagram(OneOrMore(NonTerminal('whitespace'))));
simon@7017 76
simon@8252 77 add('〈ident〉', Diagram(
simon@7016 78 Choice(0, Skip(), '-'),
simon@7016 79 Choice(0, NonTerminal('a-z A-Z _ or non-ASCII'), NonTerminal('escape')),
simon@7475 80 ZeroOrMore(Choice(0,
simon@7475 81 NonTerminal('a-z A-Z 0-9 _ - or non-ASCII'), NonTerminal('escape')))));
simon@7016 82
simon@8252 83 add('〈function〉', Diagram(
simon@8252 84 NonTerminal('〈ident〉'), '('));
simon@7016 85
simon@8252 86 add('〈at-keyword〉', Diagram(
simon@8252 87 '@', NonTerminal('〈ident〉')));
simon@7016 88
simon@8252 89 add('〈hash〉', Diagram(
simon@7017 90 '#', OneOrMore(Choice(0,
simon@7017 91 NonTerminal('a-z A-Z 0-9 _ - or non-ASCII'),
simon@7017 92 NonTerminal('escape')))));
simon@7016 93
simon@8252 94 add('〈string〉', Diagram(
simon@7016 95 Choice(0,
simon@7016 96 Sequence(
simon@7016 97 '"',
simon@7016 98 ZeroOrMore(
simon@7016 99 Choice(0,
simon@7475 100 NonTerminal('not " \\ or newline'),
simon@7017 101 NonTerminal('escape'),
simon@7475 102 Sequence('\\', NonTerminal('newline')))),
simon@7016 103 '"'),
simon@7016 104 Sequence(
simon@7016 105 '\'',
simon@7016 106 ZeroOrMore(
simon@7016 107 Choice(0,
simon@7475 108 NonTerminal("not ' \\ or newline"),
simon@7017 109 NonTerminal('escape'),
simon@7475 110 Sequence('\\', NonTerminal('newline')))),
simon@7016 111 '\''))));
simon@7016 112
simon@8252 113 add('〈url〉', Diagram(
simon@8252 114 NonTerminal('〈ident "url"〉'),
simon@7016 115 '(',
simon@8252 116 Optional(NonTerminal('〈whitespace〉'), 'skip'),
simon@7475 117 Optional(Sequence(
simon@7475 118 Choice(0, NonTerminal('url-unquoted'), NonTerminal('STRING')),
simon@8252 119 Optional(NonTerminal('〈whitespace〉'), 'skip'))),
simon@7016 120 ')'));
simon@7016 121
simon@7475 122 add('url-unquoted', Diagram(OneOrMore(
simon@7475 123 Choice(0,
simon@7475 124 NonTerminal('not " \' ( ) \\ whitespace or non-printable'),
simon@7475 125 NonTerminal('escape')))));
simon@7475 126
simon@8252 127 add('〈number〉', Diagram(
simon@7016 128 Choice(1, '+', Skip(), '-'),
simon@7016 129 Choice(0,
simon@7016 130 Sequence(
simon@7016 131 OneOrMore(NonTerminal('digit')),
simon@7016 132 '.',
simon@7016 133 OneOrMore(NonTerminal('digit'))),
simon@7016 134 OneOrMore(NonTerminal('digit')),
simon@7016 135 Sequence(
simon@7016 136 '.',
jackalmage@8081 137 OneOrMore(NonTerminal('digit')))),
simon@7016 138 Choice(0,
simon@7016 139 Skip(),
simon@7016 140 Sequence(
simon@7016 141 Choice(0, 'e', 'E'),
simon@7016 142 Choice(1, '+', Skip(), '-'),
simon@7016 143 OneOrMore(NonTerminal('digit'))))));
simon@7016 144
simon@8252 145 add('〈dimension〉', Diagram(
simon@8252 146 NonTerminal('〈number〉'), NonTerminal('〈ident〉')));
simon@7016 147
simon@8252 148 add('〈percentage〉', Diagram(
simon@8252 149 NonTerminal('〈number〉'), '%'));
simon@7016 150
simon@8252 151 add('〈unicode-range〉', Diagram(
simon@7016 152 Choice(0,
simon@7016 153 'U',
simon@7016 154 'u'),
simon@7016 155 '+',
simon@8996 156 Sequence(OneOrMore(Choice(0, NonTerminal('hex digit'), '?'), Comment('1-6 times'))),
simon@8996 157 Optional(Sequence(
simon@8996 158 '-',
simon@8996 159 OneOrMore(NonTerminal('hex digit'), Comment('1-6 times'))))));
simon@7016 160
simon@8252 161 add('〈include-match〉', Diagram('~='));
simon@7016 162
simon@8252 163 add('〈dash-match〉', Diagram('|='));
simon@7016 164
simon@8252 165 add('〈prefix-match〉', Diagram('^='));
simon@7475 166
simon@8252 167 add('〈suffix-match〉', Diagram('$='));
simon@7475 168
simon@8252 169 add('〈substring-match〉', Diagram('*='));
simon@7475 170
simon@8252 171 add('〈column〉', Diagram('||'));
jackalmage@7895 172
simon@8722 173 add('〈CDO〉', Diagram('<' + '!--'));
simon@7475 174
simon@8722 175 add('〈CDC〉', Diagram('-' + '->'));
simon@7016 176
simon@7016 177
simon@7048 178 document.getElementsByTagName('textarea')[0].value = '\t' + preview.outerHTML
simon@7048 179 // XXX work around a bug/limitation in the spec pre-processor.
simon@7048 180 // Single quotes have a special meaning there.
simon@7048 181 .replace(/'/g, '&apos;');
simon@7346 182
simon@7346 183 preview = document.getElementsByTagName('dl')[1];
simon@7346 184
simon@7346 185 // Tree items:
simon@7346 186
simon@7346 187 var NT = NonTerminal
simon@7346 188
simon@7475 189 add('Stylesheet', Diagram(ZeroOrMore(Choice(3,
simon@8722 190 NT('〈CDO〉'), NT('〈CDC〉'), NT('〈whitespace〉'),
simon@7475 191 NT('Qualified rule'), NT('At-rule')))));
simon@7346 192
simon@8252 193 add('Rule list', Diagram(ZeroOrMore(Choice(1,
simon@8252 194 NT('〈whitespace〉'), NT('Qualified rule'), NT('At-rule')))));
simon@8252 195
simon@7346 196 add('At-rule', Diagram(
simon@8252 197 NT('〈at-keyword〉'), ZeroOrMore(NT('Component value')),
simon@8252 198 Choice(0, NT('{} block'), ';')));
simon@7346 199
simon@7475 200 add('Qualified rule', Diagram(
simon@7475 201 ZeroOrMore(NT('Component value')),
simon@8722 202 NT('{} block')));
simon@7352 203
simon@8252 204 add('Declaration list', Diagram(
simon@7475 205 NT('ws*'),
simon@7475 206 Choice(0,
simon@7475 207 Sequence(
simon@7475 208 Optional(NT('Declaration')),
simon@8252 209 Optional(Sequence(';', NT('Declaration list')))),
simon@7475 210 Sequence(
simon@7475 211 NT('At-rule'),
simon@8252 212 NT('Declaration list')))));
simon@7346 213
simon@7346 214 add('Declaration', Diagram(
simon@8252 215 NT('〈ident〉'), NT('ws*'), ':',
simon@8252 216 ZeroOrMore(NT('Component value')), Optional(NT('!important'))));
simon@7352 217
simon@7352 218 add('!important', Diagram(
simon@8252 219 '!', NT('ws*'), NT('〈ident "important"〉'), NT('ws*')));
simon@7475 220
simon@8252 221 add('ws*', Diagram(ZeroOrMore(NT('〈whitespace〉'))));
simon@7346 222
simon@7346 223 add('Component value', Diagram(Choice(0,
simon@8252 224 NT('Preserved token'),
simon@7475 225 NT('{} block'),
simon@7475 226 NT('() block'),
simon@7475 227 NT('[] block'),
simon@7475 228 NT('Function block'))));
simon@7346 229
simon@7346 230
simon@8252 231 add('{} block', Diagram('{', ZeroOrMore(NT('Component value')), '}'));
simon@8252 232 add('() block', Diagram('(', ZeroOrMore(NT('Component value')), ')'));
simon@8252 233 add('[] block', Diagram('[', ZeroOrMore(NT('Component value')), ']'));
simon@7346 234
simon@7346 235 add('Function block', Diagram(
simon@8252 236 NT('〈function〉'),
jackalmage@8062 237 ZeroOrMore(NT('Component value')),
simon@7475 238 ')'));
simon@7346 239
simon@7346 240
simon@7346 241 document.getElementsByTagName('textarea')[1].value = '\t' + preview.outerHTML
simon@7346 242 // XXX work around a bug/limitation in the spec pre-processor.
simon@7346 243 // Single quotes have a special meaning there.
simon@7346 244 .replace(/'/g, '&apos;');
simon@7346 245
simon@7016 246 </script>

mercurial