Index: lib/src/block_parser.dart |
diff --git a/lib/src/block_parser.dart b/lib/src/block_parser.dart |
index ce92867ddf604402227e1646f74dc1842c956cd1..504fdbbed9f8de9670a9e0ecd3951d4d68544258 100644 |
--- a/lib/src/block_parser.dart |
+++ b/lib/src/block_parser.dart |
@@ -9,42 +9,42 @@ import 'document.dart'; |
import 'util.dart'; |
/// The line contains only whitespace or is empty. |
-final _RE_EMPTY = new RegExp(r'^([ \t]*)$'); |
+final _emptyPattern = new RegExp(r'^([ \t]*)$'); |
/// A series of `=` or `-` (on the next line) define setext-style headers. |
-final _RE_SETEXT = new RegExp(r'^((=+)|(-+))$'); |
+final _setextPattern = new RegExp(r'^((=+)|(-+))$'); |
/// Leading (and trailing) `#` define atx-style headers. |
-final _RE_HEADER = new RegExp(r'^(#{1,6})(.*?)#*$'); |
+final _headerPattern = new RegExp(r'^(#{1,6})(.*?)#*$'); |
/// The line starts with `>` with one optional space after. |
-final _RE_BLOCKQUOTE = new RegExp(r'^[ ]{0,3}>[ ]?(.*)$'); |
+final _blockquotePattern = new RegExp(r'^[ ]{0,3}>[ ]?(.*)$'); |
/// A line indented four spaces. Used for code blocks and lists. |
-final _RE_INDENT = new RegExp(r'^(?: |\t)(.*)$'); |
+final _indentPattern = new RegExp(r'^(?: |\t)(.*)$'); |
/// Fenced code block. |
-final _RE_CODE = new RegExp(r'^(`{3,}|~{3,})(.*)$'); |
+final _codePattern = new RegExp(r'^(`{3,}|~{3,})(.*)$'); |
/// Three or more hyphens, asterisks or underscores by themselves. Note that |
/// a line like `----` is valid as both HR and SETEXT. In case of a tie, |
/// SETEXT should win. |
-final _RE_HR = new RegExp(r'^[ ]{0,3}((-+[ ]{0,2}){3,}|' |
+final _hrPattern = new RegExp(r'^[ ]{0,3}((-+[ ]{0,2}){3,}|' |
r'(_+[ ]{0,2}){3,}|' |
r'(\*+[ ]{0,2}){3,})$'); |
/// Really hacky way to detect block-level embedded HTML. Just looks for |
/// "<somename". |
-final _RE_HTML = new RegExp(r'^<[ ]*\w+[ >]'); |
+final _htmlPattern = new RegExp(r'^<[ ]*\w+[ >]'); |
/// A line starting with one of these markers: `-`, `*`, `+`. May have up to |
/// three leading spaces before the marker and any number of spaces or tabs |
/// after. |
-final _RE_UL = new RegExp(r'^[ ]{0,3}[*+-][ \t]+(.*)$'); |
+final _ulPattern = new RegExp(r'^[ ]{0,3}[*+-][ \t]+(.*)$'); |
/// A line starting with a number like `123.`. May have up to three leading |
/// spaces before the marker and any number of spaces or tabs after. |
-final _RE_OL = new RegExp(r'^[ ]{0,3}\d+\.[ \t]+(.*)$'); |
+final _olPattern = new RegExp(r'^[ ]{0,3}\d+\.[ \t]+(.*)$'); |
/// Maintains the internal state needed to parse a series of lines into blocks |
/// of markdown suitable for further inline parsing. |
@@ -120,10 +120,10 @@ abstract class BlockSyntax { |
List<String> parseChildLines(BlockParser parser) { |
// Grab all of the lines that form the blockquote, stripping off the ">". |
- final childLines = <String>[]; |
+ var childLines = <String>[]; |
while (!parser.isDone) { |
- final match = pattern.firstMatch(parser.current); |
+ var match = pattern.firstMatch(parser.current); |
if (match == null) break; |
childLines.add(match[1]); |
parser.advance(); |
@@ -140,7 +140,7 @@ abstract class BlockSyntax { |
} |
class EmptyBlockSyntax extends BlockSyntax { |
- RegExp get pattern => _RE_EMPTY; |
+ RegExp get pattern => _emptyPattern; |
const EmptyBlockSyntax(); |
@@ -159,14 +159,14 @@ class SetextHeaderSyntax extends BlockSyntax { |
bool canParse(BlockParser parser) { |
// Note: matches *next* line, not the current one. We're looking for the |
// underlining after this line. |
- return parser.matchesNext(_RE_SETEXT); |
+ return parser.matchesNext(_setextPattern); |
} |
Node parse(BlockParser parser) { |
- final match = _RE_SETEXT.firstMatch(parser.next); |
+ var match = _setextPattern.firstMatch(parser.next); |
- final tag = (match[1][0] == '=') ? 'h1' : 'h2'; |
- final contents = parser.document.parseInline(parser.current); |
+ var tag = (match[1][0] == '=') ? 'h1' : 'h2'; |
+ var contents = parser.document.parseInline(parser.current); |
parser.advance(); |
parser.advance(); |
@@ -176,30 +176,30 @@ class SetextHeaderSyntax extends BlockSyntax { |
/// Parses atx-style headers: `## Header ##`. |
class HeaderSyntax extends BlockSyntax { |
- RegExp get pattern => _RE_HEADER; |
+ RegExp get pattern => _headerPattern; |
const HeaderSyntax(); |
Node parse(BlockParser parser) { |
- final match = pattern.firstMatch(parser.current); |
+ var match = pattern.firstMatch(parser.current); |
parser.advance(); |
- final level = match[1].length; |
- final contents = parser.document.parseInline(match[2].trim()); |
+ var level = match[1].length; |
+ var contents = parser.document.parseInline(match[2].trim()); |
return new Element('h$level', contents); |
} |
} |
/// Parses email-style blockquotes: `> quote`. |
class BlockquoteSyntax extends BlockSyntax { |
- RegExp get pattern => _RE_BLOCKQUOTE; |
+ RegExp get pattern => _blockquotePattern; |
const BlockquoteSyntax(); |
Node parse(BlockParser parser) { |
- final childLines = parseChildLines(parser); |
+ var childLines = parseChildLines(parser); |
// Recursively parse the contents of the blockquote. |
- final children = parser.document.parseLines(childLines); |
+ var children = parser.document.parseLines(childLines); |
return new Element('blockquote', children); |
} |
@@ -207,12 +207,12 @@ class BlockquoteSyntax extends BlockSyntax { |
/// Parses preformatted code blocks that are indented four spaces. |
class CodeBlockSyntax extends BlockSyntax { |
- RegExp get pattern => _RE_INDENT; |
+ RegExp get pattern => _indentPattern; |
const CodeBlockSyntax(); |
List<String> parseChildLines(BlockParser parser) { |
- final childLines = <String>[]; |
+ var childLines = <String>[]; |
while (!parser.isDone) { |
var match = pattern.firstMatch(parser.current); |
@@ -238,30 +238,32 @@ class CodeBlockSyntax extends BlockSyntax { |
} |
Node parse(BlockParser parser) { |
- final childLines = parseChildLines(parser); |
+ var childLines = parseChildLines(parser); |
// The Markdown tests expect a trailing newline. |
childLines.add(''); |
// Escape the code. |
- final escaped = escapeHtml(childLines.join('\n')); |
+ var escaped = escapeHtml(childLines.join('\n')); |
return new Element('pre', [new Element.text('code', escaped)]); |
} |
} |
/// Parses preformatted code blocks between two ~~~ or ``` sequences. |
-/// [Pandoc's markdown documentation](http://johnmacfarlane.net/pandoc/demo/example9/pandocs-markdown.html). |
+/// |
+/// See [Pandoc's documentation](http://johnmacfarlane.net/pandoc/demo/example9/pandocs-markdown.html). |
class FencedCodeBlockSyntax extends BlockSyntax { |
- RegExp get pattern => _RE_CODE; |
+ RegExp get pattern => _codePattern; |
const FencedCodeBlockSyntax(); |
List<String> parseChildLines(BlockParser parser, [String endBlock]) { |
if (endBlock == null) endBlock = ''; |
- final childLines = <String>[]; |
+ var childLines = <String>[]; |
parser.advance(); |
+ |
while (!parser.isDone) { |
var match = pattern.firstMatch(parser.current); |
if (match == null || !match[1].startsWith(endBlock)) { |
@@ -272,6 +274,7 @@ class FencedCodeBlockSyntax extends BlockSyntax { |
break; |
} |
} |
+ |
return childLines; |
} |
@@ -281,25 +284,24 @@ class FencedCodeBlockSyntax extends BlockSyntax { |
var endBlock = match.group(1); |
var syntax = match.group(2); |
- final childLines = parseChildLines(parser, endBlock); |
+ var childLines = parseChildLines(parser, endBlock); |
// The Markdown tests expect a trailing newline. |
childLines.add(''); |
// Escape the code. |
- final escaped = escapeHtml(childLines.join('\n')); |
+ var escaped = escapeHtml(childLines.join('\n')); |
var element = new Element('pre', [new Element.text('code', escaped)]); |
- if (syntax != '') { |
- element.attributes['class'] = syntax; |
- } |
+ if (syntax != '') element.attributes['class'] = syntax; |
+ |
return element; |
} |
} |
/// Parses horizontal rules like `---`, `_ _ _`, `* * *`, etc. |
class HorizontalRuleSyntax extends BlockSyntax { |
- RegExp get pattern => _RE_HR; |
+ RegExp get pattern => _hrPattern; |
const HorizontalRuleSyntax(); |
@@ -320,17 +322,17 @@ class HorizontalRuleSyntax extends BlockSyntax { |
/// 3. Absolutely no HTML parsing or validation is done. We're a markdown |
/// parser not an HTML parser! |
class BlockHtmlSyntax extends BlockSyntax { |
- RegExp get pattern => _RE_HTML; |
+ RegExp get pattern => _htmlPattern; |
bool get canEndBlock => false; |
const BlockHtmlSyntax(); |
Node parse(BlockParser parser) { |
- final childLines = []; |
+ var childLines = <String>[]; |
// Eat until we hit a blank line. |
- while (!parser.isDone && !parser.matches(_RE_EMPTY)) { |
+ while (!parser.isDone && !parser.matches(_emptyPattern)) { |
childLines.add(parser.current); |
parser.advance(); |
} |
@@ -355,7 +357,7 @@ abstract class ListSyntax extends BlockSyntax { |
const ListSyntax(); |
Node parse(BlockParser parser) { |
- final items = <ListItem>[]; |
+ var items = <ListItem>[]; |
var childLines = <String>[]; |
endItem() { |
@@ -372,14 +374,14 @@ abstract class ListSyntax extends BlockSyntax { |
} |
while (!parser.isDone) { |
- if (tryMatch(_RE_EMPTY)) { |
+ if (tryMatch(_emptyPattern)) { |
// Add a blank line to the current list item. |
childLines.add(''); |
- } else if (tryMatch(_RE_UL) || tryMatch(_RE_OL)) { |
+ } else if (tryMatch(_ulPattern) || tryMatch(_olPattern)) { |
// End the current list item and start a new one. |
endItem(); |
childLines.add(match[1]); |
- } else if (tryMatch(_RE_INDENT)) { |
+ } else if (tryMatch(_indentPattern)) { |
// Strip off indent and add to current item. |
childLines.add(match[1]); |
} else if (BlockSyntax.isAtBlockEnd(parser)) { |
@@ -436,9 +438,9 @@ abstract class ListSyntax extends BlockSyntax { |
// Remove any trailing empty lines and note which items are separated by |
// empty lines. Do this before seeing which items are single-line so that |
// trailing empty lines on the last item don't force it into being a block. |
- for (int i = 0; i < items.length; i++) { |
- for (int j = items[i].lines.length - 1; j > 0; j--) { |
- if (_RE_EMPTY.firstMatch(items[i].lines[j]) != null) { |
+ for (var i = 0; i < items.length; i++) { |
+ for (var j = items[i].lines.length - 1; j > 0; j--) { |
+ if (_emptyPattern.firstMatch(items[i].lines[j]) != null) { |
// Found an empty line. Item and one after it are blocks. |
if (i < items.length - 1) { |
items[i].forceBlock = true; |
@@ -452,22 +454,22 @@ abstract class ListSyntax extends BlockSyntax { |
} |
// Convert the list items to Nodes. |
- final itemNodes = <Node>[]; |
- for (final item in items) { |
- bool blockItem = item.forceBlock || (item.lines.length > 1); |
+ var itemNodes = <Node>[]; |
+ for (var item in items) { |
+ var blockItem = item.forceBlock || (item.lines.length > 1); |
// See if it matches some block parser. |
- final blocksInList = [ |
- _RE_BLOCKQUOTE, |
- _RE_HEADER, |
- _RE_HR, |
- _RE_INDENT, |
- _RE_UL, |
- _RE_OL |
+ var blocksInList = [ |
+ _blockquotePattern, |
+ _headerPattern, |
+ _hrPattern, |
+ _indentPattern, |
+ _ulPattern, |
+ _olPattern |
]; |
if (!blockItem) { |
- for (final pattern in blocksInList) { |
+ for (var pattern in blocksInList) { |
if (pattern.firstMatch(item.lines[0]) != null) { |
blockItem = true; |
break; |
@@ -478,11 +480,11 @@ abstract class ListSyntax extends BlockSyntax { |
// Parse the item as a block or inline. |
if (blockItem) { |
// Block list item. |
- final children = parser.document.parseLines(item.lines); |
+ var children = parser.document.parseLines(item.lines); |
itemNodes.add(new Element('li', children)); |
} else { |
// Raw list item. |
- final contents = parser.document.parseInline(item.lines[0]); |
+ var contents = parser.document.parseInline(item.lines[0]); |
itemNodes.add(new Element('li', contents)); |
} |
} |
@@ -493,7 +495,7 @@ abstract class ListSyntax extends BlockSyntax { |
/// Parses unordered lists. |
class UnorderedListSyntax extends ListSyntax { |
- RegExp get pattern => _RE_UL; |
+ RegExp get pattern => _ulPattern; |
String get listTag => 'ul'; |
const UnorderedListSyntax(); |
@@ -501,7 +503,7 @@ class UnorderedListSyntax extends ListSyntax { |
/// Parses ordered lists. |
class OrderedListSyntax extends ListSyntax { |
- RegExp get pattern => _RE_OL; |
+ RegExp get pattern => _olPattern; |
String get listTag => 'ol'; |
const OrderedListSyntax(); |
@@ -516,7 +518,7 @@ class ParagraphSyntax extends BlockSyntax { |
bool canParse(BlockParser parser) => true; |
Node parse(BlockParser parser) { |
- final childLines = []; |
+ var childLines = <String>[]; |
// Eat until we hit something that ends a paragraph. |
while (!BlockSyntax.isAtBlockEnd(parser)) { |
@@ -524,7 +526,7 @@ class ParagraphSyntax extends BlockSyntax { |
parser.advance(); |
} |
- final contents = parser.document.parseInline(childLines.join('\n')); |
+ var contents = parser.document.parseInline(childLines.join('\n')); |
return new Element('p', contents); |
} |
} |