| 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) { |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 149 | 149 |
| 150 /// Represents one kind of markdown tag that can be parsed. | 150 /// Represents one kind of markdown tag that can be parsed. |
| 151 class InlineSyntax { | 151 class InlineSyntax { |
| 152 final RegExp pattern; | 152 final RegExp pattern; |
| 153 | 153 |
| 154 InlineSyntax(String pattern) | 154 InlineSyntax(String pattern) |
| 155 : pattern = new RegExp(pattern, multiLine: true); | 155 : pattern = new RegExp(pattern, multiLine: true); |
| 156 | 156 |
| 157 bool tryMatch(InlineParser parser) { | 157 bool tryMatch(InlineParser parser) { |
| 158 final startMatch = pattern.firstMatch(parser.currentSource); | 158 final startMatch = pattern.firstMatch(parser.currentSource); |
| 159 if ((startMatch != null) && (startMatch.start() == 0)) { | 159 if ((startMatch != null) && (startMatch.start == 0)) { |
| 160 // Write any existing plain text up to this point. | 160 // Write any existing plain text up to this point. |
| 161 parser.writeText(); | 161 parser.writeText(); |
| 162 | 162 |
| 163 if (onMatch(parser, startMatch)) { | 163 if (onMatch(parser, startMatch)) { |
| 164 parser.consume(startMatch[0].length); | 164 parser.consume(startMatch[0].length); |
| 165 } | 165 } |
| 166 return true; | 166 return true; |
| 167 } | 167 } |
| 168 return false; | 168 return false; |
| 169 } | 169 } |
| (...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 347 /// The children of this node. Will be `null` for text nodes. | 347 /// The children of this node. Will be `null` for text nodes. |
| 348 final List<Node> children; | 348 final List<Node> children; |
| 349 | 349 |
| 350 TagState(this.startPos, this.endPos, this.syntax) | 350 TagState(this.startPos, this.endPos, this.syntax) |
| 351 : children = <Node>[]; | 351 : children = <Node>[]; |
| 352 | 352 |
| 353 /// Attempts to close this tag by matching the current text against its end | 353 /// Attempts to close this tag by matching the current text against its end |
| 354 /// pattern. | 354 /// pattern. |
| 355 bool tryMatch(InlineParser parser) { | 355 bool tryMatch(InlineParser parser) { |
| 356 Match endMatch = syntax.endPattern.firstMatch(parser.currentSource); | 356 Match endMatch = syntax.endPattern.firstMatch(parser.currentSource); |
| 357 if ((endMatch != null) && (endMatch.start() == 0)) { | 357 if ((endMatch != null) && (endMatch.start == 0)) { |
| 358 // Close the tag. | 358 // Close the tag. |
| 359 close(parser, endMatch); | 359 close(parser, endMatch); |
| 360 return true; | 360 return true; |
| 361 } | 361 } |
| 362 | 362 |
| 363 return false; | 363 return false; |
| 364 } | 364 } |
| 365 | 365 |
| 366 /// Pops this tag off the stack, completes it, and adds it to the output. | 366 /// Pops this tag off the stack, completes it, and adds it to the output. |
| 367 /// Will discard any unmatched tags that happen to be above it on the stack. | 367 /// Will discard any unmatched tags that happen to be above it on the stack. |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 399 parser.consume(endMatch[0].length); | 399 parser.consume(endMatch[0].length); |
| 400 } else { | 400 } else { |
| 401 // Didn't close correctly so revert to text. | 401 // Didn't close correctly so revert to text. |
| 402 parser.start = startPos; | 402 parser.start = startPos; |
| 403 parser.advanceBy(endMatch[0].length); | 403 parser.advanceBy(endMatch[0].length); |
| 404 } | 404 } |
| 405 | 405 |
| 406 return null; | 406 return null; |
| 407 } | 407 } |
| 408 } | 408 } |
| OLD | NEW |