OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 /// Maintains the internal state needed to parse inline span elements in | 5 /// Maintains the internal state needed to parse inline span elements in |
6 /// markdown. | 6 /// markdown. |
7 class InlineParser { | 7 class InlineParser { |
8 static List<InlineSyntax> get syntaxes() { | 8 static List<InlineSyntax> get syntaxes { |
9 // Lazy initialize. | 9 // Lazy initialize. |
10 if (_syntaxes == null) { | 10 if (_syntaxes == null) { |
11 _syntaxes = <InlineSyntax>[ | 11 _syntaxes = <InlineSyntax>[ |
12 new AutolinkSyntax(), | 12 new AutolinkSyntax(), |
13 new LinkSyntax(), | 13 new LinkSyntax(), |
14 // "*" surrounded by spaces is left alone. | 14 // "*" surrounded by spaces is left alone. |
15 new TextSyntax(@' \* '), | 15 new TextSyntax(@' \* '), |
16 // "_" surrounded by spaces is left alone. | 16 // "_" surrounded by spaces is left alone. |
17 new TextSyntax(@' _ '), | 17 new TextSyntax(@' _ '), |
18 // Leave already-encoded HTML entities alone. Ensures we don't turn | 18 // Leave already-encoded HTML entities alone. Ensures we don't turn |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
114 } | 114 } |
115 } | 115 } |
116 } | 116 } |
117 | 117 |
118 addNode(Node node) { | 118 addNode(Node node) { |
119 _stack.last().children.add(node); | 119 _stack.last().children.add(node); |
120 } | 120 } |
121 | 121 |
122 // TODO(rnystrom): Only need this because RegExp doesn't let you start | 122 // TODO(rnystrom): Only need this because RegExp doesn't let you start |
123 // searching from a given offset. | 123 // searching from a given offset. |
124 String get currentSource() => source.substring(pos, source.length); | 124 String get currentSource => source.substring(pos, source.length); |
125 | 125 |
126 bool get isDone() => pos == source.length; | 126 bool get isDone => pos == source.length; |
127 | 127 |
128 void advanceBy(int length) { | 128 void advanceBy(int length) { |
129 pos += length; | 129 pos += length; |
130 } | 130 } |
131 | 131 |
132 void consume(int length) { | 132 void consume(int length) { |
133 pos += length; | 133 pos += length; |
134 start = pos; | 134 start = pos; |
135 } | 135 } |
136 } | 136 } |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
220 parser.addNode(new Element(tag, state.children)); | 220 parser.addNode(new Element(tag, state.children)); |
221 return true; | 221 return true; |
222 } | 222 } |
223 } | 223 } |
224 | 224 |
225 /// Matches inline links like `[blah] [id]` and `[blah] (url)`. | 225 /// Matches inline links like `[blah] [id]` and `[blah] (url)`. |
226 class LinkSyntax extends TagSyntax { | 226 class LinkSyntax extends TagSyntax { |
227 /// The regex for the end of a link needs to handle both reference style and | 227 /// The regex for the end of a link needs to handle both reference style and |
228 /// inline styles as well as optional titles for inline links. To make that | 228 /// inline styles as well as optional titles for inline links. To make that |
229 /// a bit more palatable, this breaks it into pieces. | 229 /// a bit more palatable, this breaks it into pieces. |
230 static get linkPattern() { | 230 static get linkPattern { |
231 final refLink = @'\s?\[([^\]]*)\]'; // "[id]" reflink id. | 231 final refLink = @'\s?\[([^\]]*)\]'; // "[id]" reflink id. |
232 final title = @'(?:[ ]*"([^"]+)"|)'; // Optional title in quotes. | 232 final title = @'(?:[ ]*"([^"]+)"|)'; // Optional title in quotes. |
233 final inlineLink = '\\s?\\(([^ )]+)$title\\)'; // "(url "title")" link. | 233 final inlineLink = '\\s?\\(([^ )]+)$title\\)'; // "(url "title")" link. |
234 return '\](?:($refLink|$inlineLink)|)'; | 234 return '\](?:($refLink|$inlineLink)|)'; |
235 | 235 |
236 // The groups matched by this are: | 236 // The groups matched by this are: |
237 // 1: Will be non-empty if it's either a ref or inline link. Will be empty | 237 // 1: Will be non-empty if it's either a ref or inline link. Will be empty |
238 // if it's just a bare pair of square brackets with nothing after them. | 238 // if it's just a bare pair of square brackets with nothing after them. |
239 // 2: Contains the id inside [] for a reference-style link. | 239 // 2: Contains the id inside [] for a reference-style link. |
240 // 3: Contains the URL for an inline link. | 240 // 3: Contains the URL for an inline link. |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
389 parser.consume(endMatch[0].length); | 389 parser.consume(endMatch[0].length); |
390 } else { | 390 } else { |
391 // Didn't close correctly so revert to text. | 391 // Didn't close correctly so revert to text. |
392 parser.start = startPos; | 392 parser.start = startPos; |
393 parser.advanceBy(endMatch[0].length); | 393 parser.advanceBy(endMatch[0].length); |
394 } | 394 } |
395 | 395 |
396 return null; | 396 return null; |
397 } | 397 } |
398 } | 398 } |
OLD | NEW |