-Given mkd;
+Given markdown;
a **b** c
Execute (bold):
AssertEqual SyntaxOf('b'), 'htmlBold'
AssertNotEqual SyntaxOf('c'), 'htmlBold'
-Given mkd;
+Given markdown;
+a __b__ c
+
+Execute (bold):
+ AssertNotEqual SyntaxOf('a'), 'htmlBold'
+ AssertEqual SyntaxOf('b'), 'htmlBold'
+ AssertNotEqual SyntaxOf('c'), 'htmlBold'
+
+Given markdown;
a *b* c
Execute (italic):
AssertEqual SyntaxOf('b'), 'htmlItalic'
AssertNotEqual SyntaxOf('c'), 'htmlItalic'
+Given markdown;
+a _b_ c
+
+Execute (italic):
+ AssertNotEqual SyntaxOf('a'), 'htmlItalic'
+ AssertEqual SyntaxOf('b'), 'htmlItalic'
+ AssertNotEqual SyntaxOf('c'), 'htmlItalic'
+
+Given markdown;
+a \*b\* c
+
+Execute (not italic with escaped asterisks):
+ AssertNotEqual SyntaxOf('a'), 'htmlItalic'
+ AssertNotEqual SyntaxOf('b'), 'htmlItalic'
+ AssertNotEqual SyntaxOf('c'), 'htmlItalic'
+
+Given markdown;
+a \_b\_ c
+
+Execute (not italic with escaped underscores):
+ AssertNotEqual SyntaxOf('a'), 'htmlItalic'
+ AssertNotEqual SyntaxOf('b'), 'htmlItalic'
+ AssertNotEqual SyntaxOf('c'), 'htmlItalic'
+
+Given markdown;
+a _b\_c_ d
+
+Execute (italic with escaped underscores):
+ AssertNotEqual SyntaxOf('a'), 'htmlItalic'
+ AssertEqual SyntaxOf('b'), 'htmlItalic'
+ AssertEqual SyntaxOf('c'), 'htmlItalic'
+ AssertNotEqual SyntaxOf('d'), 'htmlItalic'
+
+Given markdown;
+a __b\_\_c__ d
+
+Execute (bold with escaped underscores):
+ AssertNotEqual SyntaxOf('a'), 'htmlBold'
+ AssertEqual SyntaxOf('b'), 'htmlBold'
+ AssertEqual SyntaxOf('c'), 'htmlBold'
+ AssertNotEqual SyntaxOf('d'), 'htmlBold'
+
# Links
-Given mkd;
+Given markdown;
[a](b)
Execute (link with title):
AssertEqual SyntaxOf('a'), 'mkdLink'
AssertEqual SyntaxOf('b'), 'mkdURL'
-Given mkd;
+Given markdown;
(a)
(b)
AssertNotEqual SyntaxOf('a'), 'mkdURL'
AssertNotEqual SyntaxOf('b'), 'mkdURL'
-Given mkd;
+Given markdown;
[a](b) c [d](e)
Execute (multiple links on a line):
- AssertEqual SyntaxOf('c'), ''
+ AssertNotEqual SyntaxOf('c'), 'mkdLink'
+ AssertNotEqual SyntaxOf('c'), 'mkdURL'
# Autolinks
-Given mkd;
+Given markdown;
a <http://b> c
Execute (autolink):
AssertEqual SyntaxOf('>'), 'mkdDelimiter'
AssertNotEqual SyntaxOf('c'), 'mkdInlineURL'
-Given mkd;
+Given markdown;
<HtTp://a>
Execute (autolink with scheme case is insensitive):
AssertEqual SyntaxOf('a'), 'mkdInlineURL'
-Given mkd;
+Given markdown;
<notascheme://a>
Execute (autolink without known scheme is not a link):
AssertNotEqual SyntaxOf('n'), 'mkdInlineURL'
-Given mkd;
+Given markdown;
<a>
Execute (autolink without scheme is not a link):
AssertNotEqual SyntaxOf('a'), 'mkdInlineURL'
-Given mkd;
+Given markdown;
< http://a >
<http://b c>
<http://d
AssertNotEqual SyntaxOf('d'), 'mkdInlineURL'
AssertNotEqual SyntaxOf('e'), 'mkdInlineURL'
-Given mkd;
+Given markdown;
\<http://a>
Execute (autolinks can be backslash escaped):
AssertNotEqual SyntaxOf('<'), 'mkdDelimiter'
+Given markdown;
+a (http://b.bb) c
+
+Execute (autolink in parenthesis):
+ AssertNotEqual SyntaxOf('a'), 'mkdInlineURL'
+ AssertEqual SyntaxOf('('), 'mkdDelimiter'
+ AssertEqual SyntaxOf('b'), 'mkdInlineURL'
+ AssertEqual SyntaxOf(')'), 'mkdDelimiter'
+ AssertNotEqual SyntaxOf('c'), 'mkdInlineURL'
+
+Given markdown;
+[![a](http://b)](http://c)
+
+Execute (autolink in link text):
+ AssertEqual SyntaxOf('!'), 'mkdDelimiter'
+ AssertEqual SyntaxOf('a'), 'mkdLink'
+ AssertEqual SyntaxOf('b'), 'mkdURL'
+ AssertEqual SyntaxOf('c'), 'mkdURL'
+
# Code Blocks
-Given mkd;
+Given markdown;
~~~
code
~~~
Execute (code blocks can be fenced with tildes):
AssertEqual SyntaxOf('c'), 'mkdCode'
-Given mkd;
+Given markdown;
~~~ruby
code
~~~
Execute (code blocks can have a language specifier):
AssertEqual SyntaxOf('c'), 'mkdCode'
+Given markdown;
+```c++
+code
+```
+
+text
+
+Execute (code blocks can be fenced with backticks and a language specifier):
+ AssertEqual SyntaxOf('code'), 'mkdCode'
+ AssertNotEqual SyntaxOf('text'), 'mkdCode'
+
+# Indent Code Blocks
+
+Given markdown;
+a
+
+ b
+ c
+
+Execute (indent code blocks):
+ AssertNotEqual SyntaxOf('a'), 'mkdCode'
+ AssertEqual SyntaxOf('b'), 'mkdCode'
+ AssertEqual SyntaxOf('c'), 'mkdCode'
+
+Given markdown;
+# a
+
+b
+
+ c
+
+Execute (indent code blocks after header):
+ AssertNotEqual SyntaxOf('a'), 'mkdCode'
+ AssertNotEqual SyntaxOf('b'), 'mkdCode'
+ AssertEqual SyntaxOf('c'), 'mkdCode'
+
+Given markdown;
+- a
+
+ b
+
+ c
+
+Execute (indent code blocks after list):
+ AssertNotEqual SyntaxOf('a'), 'mkdCode'
+ AssertNotEqual SyntaxOf('b'), 'mkdCode'
+ AssertEqual SyntaxOf('c'), 'mkdCode'
+
+Given markdown;
+```c++
+#include <iostream>
+code
+```
+
+```ruby
+def a
+end
+```
+
+Execute (fenced code block syntax with a language specifier):
+ let b:func = Markdown_GetFunc('vim-markdown/ftplugin/markdown.vim', 'Markdown_refresh_syntax')
+ call b:func(0)
+ AssertEqual SyntaxOf('include'), 'cInclude'
+ AssertEqual SyntaxOf('code'), 'mkdSnippetCPP'
+ AssertEqual SyntaxOf('def'), 'rubyDefine'
+
+Given markdown;
+```a+b-
+code
+```
+
+Execute (fenced code block syntax with an unknown language specifier):
+ let b:func = Markdown_GetFunc('vim-markdown/ftplugin/markdown.vim', 'Markdown_refresh_syntax')
+ call b:func(0)
+ AssertEqual SyntaxOf('code'), 'mkdSnippetA_B_'
+
# Math
-Given mkd;
+Given markdown;
a $x$ b
c $$y$$ d
\$e\$
AssertNotEqual SyntaxOf('x'), 'mkdMath'
AssertNotEqual SyntaxOf('y'), 'mkdMath'
-Given mkd;
+Given markdown;
a
$
AssertEqual SyntaxOf('b'), 'mkdMath'
AssertNotEqual SyntaxOf('c'), 'mkdMath'
+Given markdown;
+$ \sqrt{a}{b} $
+$$ \frac{a}{b} $$
+
+Execute (math tex highlighting):
+ let g:vim_markdown_math=0
+ syn off | syn on
+ AssertNotEqual SyntaxOf('sqrt'), 'texStatement'
+ AssertNotEqual SyntaxOf('frac'), 'texStatement'
+ let g:vim_markdown_math=1
+ syn off | syn on
+ AssertEqual SyntaxOf('sqrt'), 'texStatement'
+ AssertEqual SyntaxOf('frac'), 'texStatement'
+
# YAML frontmatter
-Given mkd;
+Given markdown;
---
a: b
---
syn off | syn on
AssertNotEqual SyntaxOf('a'), 'yamlBlockMappingKey'
-Given mkd;
+Given markdown;
---
a: b
syn off | syn on
AssertNotEqual SyntaxOf('a'), 'yamlBlockMappingKey'
-Given mkd;
+Given markdown;
---
a: b
---
let g:vim_markdown_frontmatter=1
syn off | syn on
AssertEqual SyntaxAt(5, 1), 'mkdRule'
+
+# Header
+
+Given markdown;
+# #a
+ccc
+
+## #b
+ddd
+
+Execute (header title starts with #):
+ AssertEqual SyntaxOf('a'), 'htmlH1'
+ AssertEqual SyntaxOf('b'), 'htmlH2'
+
+Given markdown;
+# h1 space
+
+#h1 nospace
+
+# h1 2 spaces
+
+# h1 trailing hash #
+
+## h2 space
+
+##h2 nospace
+
+## h2 trailing hash ##
+
+### h3 space
+
+###h3 nospace
+
+### h3 trailing hash ###
+
+#### h4
+
+##### h5
+
+###### h6
+
+Execute (atx headers):
+ AssertEqual SyntaxOf('# h1 space'), 'htmlH1'
+ AssertEqual SyntaxOf('#h1 nospace'), 'htmlH1'
+ AssertEqual SyntaxOf('# h1 2 spaces'), 'htmlH1'
+ AssertEqual SyntaxOf('# h1 trailing hash #'), 'htmlH1'
+ AssertEqual SyntaxOf('## h2 space'), 'htmlH2'
+ AssertEqual SyntaxOf('##h2 nospace'), 'htmlH2'
+ AssertEqual SyntaxOf('## h2 trailing hash ##'), 'htmlH2'
+ AssertEqual SyntaxOf('### h3 space'), 'htmlH3'
+ AssertEqual SyntaxOf('###h3 nospace'), 'htmlH3'
+ AssertEqual SyntaxOf('### h3 trailing hash ###'), 'htmlH3'
+ AssertEqual SyntaxOf('#### h4'), 'htmlH4'
+ AssertEqual SyntaxOf('##### h5'), 'htmlH5'
+ AssertEqual SyntaxOf('###### h6'), 'htmlH6'
+
+Given markdown;
+# h1 before h2
+
+## h2 between h1s
+
+# h1 after h2
+
+Execute (atx headers relative positions):
+ AssertEqual SyntaxOf('# h1 before h2'), 'htmlH1'
+ AssertEqual SyntaxOf('## h2 between h1s'), 'htmlH2'
+ AssertEqual SyntaxOf('# h1 after h2'), 'htmlH1'
+
+Given markdown;
+setex h1
+========
+
+setex h2
+--------
+
+setex h1 single punctuation
+=
+
+setex h1 punctuation longer than header
+================================
+
+Execute (setex headers):
+ AssertEqual SyntaxOf('setex h1'), 'htmlH1'
+ AssertEqual SyntaxOf('^========$'), 'htmlH1'
+ AssertEqual SyntaxOf('setex h2'), 'htmlH2'
+ AssertEqual SyntaxOf('--------'), 'htmlH2'
+ AssertEqual SyntaxOf('setex h1 single punctuation'), 'htmlH1'
+ AssertEqual SyntaxOf('^=$'), 'htmlH1'
+ AssertEqual SyntaxOf('setex h1 punctuation longer than header'), 'htmlH1'
+ AssertEqual SyntaxOf('^================================$'), 'htmlH1'
+
+Given markdown;
+- not Setex
+- because list
+
+Execute (prevent list vs Setex confusion):
+ AssertNotEqual SyntaxOf('- not Setex'), 'htmlH2'
+ AssertNotEqual SyntaxOf('- becuase list'), 'htmlH2'
+
+Given markdown;
+setex h1 before atx
+===================
+
+## atx h2
+
+### atx h3
+
+# atx h1
+
+setex h2
+------------------
+
+### atx h3 2
+
+Execute (mixed atx and setex headers):
+ AssertEqual SyntaxOf('setex h1 before atx'), 'htmlH1'
+ AssertEqual SyntaxOf('==================='), 'htmlH1'
+ AssertEqual SyntaxOf('## atx h2'), 'htmlH2'
+ AssertEqual SyntaxOf('### atx h3'), 'htmlH3'
+ AssertEqual SyntaxOf('# atx h1'), 'htmlH1'
+ AssertEqual SyntaxOf('setex h2'), 'htmlH2'
+ AssertEqual SyntaxOf('------------------'), 'htmlH2'
+
+# List
+
+Given markdown;
+- a & b
+1. c > d
+
+Execute (& and > are not marked as htmlError in lists):
+ AssertEqual SyntaxOf('-'), 'mkdListItem'
+ AssertEqual SyntaxOf('1.'), 'mkdListItem'
+ AssertNotEqual SyntaxOf('&'), 'htmlError'
+ AssertNotEqual SyntaxOf('>'), 'htmlError'
+
+# HTML
+
+Given markdown;
+a
+
+<p>b</p>
+
+- <span>c</span>
+
+Execute (HTML tag in text):
+ AssertEqual SyntaxOf('p'), 'htmlTagName'
+ AssertEqual SyntaxOf('<p>'), 'htmlTag'
+ AssertEqual SyntaxOf('</p>'), 'htmlEndTag'
+ AssertEqual SyntaxOf('span'), 'htmlTagName'
+ AssertEqual SyntaxOf('<span>'), 'htmlTag'
+ AssertEqual SyntaxOf('</span>'), 'htmlEndTag'