| OLD | NEW |
| 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2011, 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 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 137 | 137 |
| 138 /// Represents one kind of markdown tag that can be parsed. | 138 /// Represents one kind of markdown tag that can be parsed. |
| 139 class InlineSyntax { | 139 class InlineSyntax { |
| 140 final RegExp pattern; | 140 final RegExp pattern; |
| 141 | 141 |
| 142 InlineSyntax(String pattern) | 142 InlineSyntax(String pattern) |
| 143 : pattern = new RegExp(pattern, multiLine: true); | 143 : pattern = new RegExp(pattern, multiLine: true); |
| 144 | 144 |
| 145 bool tryMatch(InlineParser parser) { | 145 bool tryMatch(InlineParser parser) { |
| 146 final startMatch = pattern.firstMatch(parser.currentSource); | 146 final startMatch = pattern.firstMatch(parser.currentSource); |
| 147 if ((startMatch != null) && (startMatch.start() == 0)) { | 147 if ((startMatch != null) && (startMatch.start == 0)) { |
| 148 // Write any existing plain text up to this point. | 148 // Write any existing plain text up to this point. |
| 149 parser.writeText(); | 149 parser.writeText(); |
| 150 | 150 |
| 151 if (onMatch(parser, startMatch)) { | 151 if (onMatch(parser, startMatch)) { |
| 152 parser.consume(startMatch[0].length); | 152 parser.consume(startMatch[0].length); |
| 153 } | 153 } |
| 154 return true; | 154 return true; |
| 155 } | 155 } |
| 156 return false; | 156 return false; |
| 157 } | 157 } |
| (...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 335 /// The children of this node. Will be `null` for text nodes. | 335 /// The children of this node. Will be `null` for text nodes. |
| 336 final List<Node> children; | 336 final List<Node> children; |
| 337 | 337 |
| 338 TagState(this.startPos, this.endPos, this.syntax) | 338 TagState(this.startPos, this.endPos, this.syntax) |
| 339 : children = <Node>[]; | 339 : children = <Node>[]; |
| 340 | 340 |
| 341 /// Attempts to close this tag by matching the current text against its end | 341 /// Attempts to close this tag by matching the current text against its end |
| 342 /// pattern. | 342 /// pattern. |
| 343 bool tryMatch(InlineParser parser) { | 343 bool tryMatch(InlineParser parser) { |
| 344 Match endMatch = syntax.endPattern.firstMatch(parser.currentSource); | 344 Match endMatch = syntax.endPattern.firstMatch(parser.currentSource); |
| 345 if ((endMatch != null) && (endMatch.start() == 0)) { | 345 if ((endMatch != null) && (endMatch.start == 0)) { |
| 346 // Close the tag. | 346 // Close the tag. |
| 347 close(parser, endMatch); | 347 close(parser, endMatch); |
| 348 return true; | 348 return true; |
| 349 } | 349 } |
| 350 | 350 |
| 351 return false; | 351 return false; |
| 352 } | 352 } |
| 353 | 353 |
| 354 /// Pops this tag off the stack, completes it, and adds it to the output. | 354 /// Pops this tag off the stack, completes it, and adds it to the output. |
| 355 /// Will discard any unmatched tags that happen to be above it on the stack. | 355 /// 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... |
| 387 parser.consume(endMatch[0].length); | 387 parser.consume(endMatch[0].length); |
| 388 } else { | 388 } else { |
| 389 // Didn't close correctly so revert to text. | 389 // Didn't close correctly so revert to text. |
| 390 parser.start = startPos; | 390 parser.start = startPos; |
| 391 parser.advanceBy(endMatch[0].length); | 391 parser.advanceBy(endMatch[0].length); |
| 392 } | 392 } |
| 393 | 393 |
| 394 return null; | 394 return null; |
| 395 } | 395 } |
| 396 } | 396 } |
| OLD | NEW |