Sun, 01 Sep 2013 16:18:24 +0100
[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, '''); |
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, '''); |
simon@7346 | 245 | |
simon@7016 | 246 | </script> |