diff --git a/.coveragerc b/.coveragerc new file mode 100644 index 00000000..321e5ca0 --- /dev/null +++ b/.coveragerc @@ -0,0 +1,2 @@ +[run] +omit = */tests/* diff --git a/.editorconfig b/.editorconfig index d3a33e2f..212f7d0c 100644 --- a/.editorconfig +++ b/.editorconfig @@ -7,14 +7,35 @@ indent_size = 4 insert_final_newline = true trim_trailing_whitespace = true -[*.json] -indent_style = tab +# Markdown [*.md] +indent_style = space +indent_size = 2 trim_trailing_whitespace = false +# JSON + +[*.json] +indent_style = tab +indent_size = 4 + [*.sublime-*] indent_style = tab +indent_size = 4 + +# XML [*.tmPreferences] indent_style = tab +indent_size = 4 + +# YAML + +[*.sublime-syntax] +indent_style = space +indent_size = 2 + +[*.yml] +indent_style = space +indent_size = 2 diff --git a/.github/workflows/ci-lint.yml b/.github/workflows/ci-lint.yml index cbb14a66..8557f1ad 100644 --- a/.github/workflows/ci-lint.yml +++ b/.github/workflows/ci-lint.yml @@ -21,7 +21,7 @@ on: jobs: lint: name: Python ${{ matrix.python }} - runs-on: ubuntu-20.04 + runs-on: ubuntu-latest strategy: matrix: python: @@ -30,9 +30,9 @@ jobs: - 'x64' steps: - name: Checkout Repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python }} - uses: actions/setup-python@v3 + uses: actions/setup-python@v5 with: python-version: ${{ matrix.python }} architecture: ${{ matrix.arch }} diff --git a/.github/workflows/ci-syntax-tests.yml b/.github/workflows/ci-syntax-tests.yml index 58d3628e..02406dbb 100644 --- a/.github/workflows/ci-syntax-tests.yml +++ b/.github/workflows/ci-syntax-tests.yml @@ -30,10 +30,16 @@ jobs: include: - build: 4107 default_packages: v4107 + - build: 4126 + default_packages: v4126 + - build: 4152 + default_packages: v4152 + - build: 4169 + default_packages: v4169 - build: latest default_packages: master steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: SublimeText/syntax-test-action@v2 with: build: ${{ matrix.build }} diff --git a/.github/workflows/ci-unit-tests.yml b/.github/workflows/ci-unit-tests.yml index e3c7c36f..b28fc2d2 100644 --- a/.github/workflows/ci-unit-tests.yml +++ b/.github/workflows/ci-unit-tests.yml @@ -28,11 +28,11 @@ jobs: matrix: st-version: [4] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: SublimeText/UnitTesting/actions/setup@v1 with: sublime-text-version: ${{ matrix.st-version }} - uses: SublimeText/UnitTesting/actions/run-tests@v1 with: coverage: true - codecov-upload: true + - uses: codecov/codecov-action@v4 diff --git a/.github/workflows/deploy-gh-pages.yml b/.github/workflows/deploy-gh-pages.yml index 24a3c5cc..d59b0d2f 100644 --- a/.github/workflows/deploy-gh-pages.yml +++ b/.github/workflows/deploy-gh-pages.yml @@ -14,11 +14,11 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout Repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 - name: Set up Python - uses: actions/setup-python@v2 + uses: actions/setup-python@v5 with: python-version: '3.8' - name: Install MkDocs diff --git a/Default (Linux).sublime-keymap b/Default (Linux).sublime-keymap index 712cdc9d..d0f839e7 100644 --- a/Default (Linux).sublime-keymap +++ b/Default (Linux).sublime-keymap @@ -190,7 +190,7 @@ }, { "keys": ["`"], "command": "move", "args": {"by": "characters", "forward": true}, "context": [ - { "key": "selector", "operator": "equal", "operand": "text.html.markdown markup.raw - meta.code-fence - markup.raw.code-fence", "match_all": true }, + { "key": "selector", "operator": "equal", "operand": "text.html.markdown markup.raw - markup.raw.code-fence", "match_all": true }, { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, { "key": "following_text", "operator": "regex_contains", "operand": "^`", "match_all": true } ] diff --git a/Default (OSX).sublime-keymap b/Default (OSX).sublime-keymap index 92e23afd..e7500b82 100644 --- a/Default (OSX).sublime-keymap +++ b/Default (OSX).sublime-keymap @@ -190,7 +190,7 @@ }, { "keys": ["`"], "command": "move", "args": {"by": "characters", "forward": true}, "context": [ - { "key": "selector", "operator": "equal", "operand": "text.html.markdown markup.raw - meta.code-fence - markup.raw.code-fence", "match_all": true }, + { "key": "selector", "operator": "equal", "operand": "text.html.markdown markup.raw - markup.raw.code-fence", "match_all": true }, { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, { "key": "following_text", "operator": "regex_contains", "operand": "^`", "match_all": true } ] diff --git a/Default (Windows).sublime-keymap b/Default (Windows).sublime-keymap index 712cdc9d..d0f839e7 100644 --- a/Default (Windows).sublime-keymap +++ b/Default (Windows).sublime-keymap @@ -190,7 +190,7 @@ }, { "keys": ["`"], "command": "move", "args": {"by": "characters", "forward": true}, "context": [ - { "key": "selector", "operator": "equal", "operand": "text.html.markdown markup.raw - meta.code-fence - markup.raw.code-fence", "match_all": true }, + { "key": "selector", "operator": "equal", "operand": "text.html.markdown markup.raw - markup.raw.code-fence", "match_all": true }, { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, { "key": "following_text", "operator": "regex_contains", "operand": "^`", "match_all": true } ] diff --git a/messages.json b/messages.json index b31e0c3d..9180ee9c 100644 --- a/messages.json +++ b/messages.json @@ -46,5 +46,6 @@ "3.1.9": "messages/3.1.9.md", "3.1.10": "messages/3.1.10.md", "3.1.11": "messages/3.1.11.md", - "3.1.12": "messages/3.1.12.md" + "3.1.12": "messages/3.1.12.md", + "3.1.13": "messages/3.1.13.md" } diff --git a/messages/3.1.13.md b/messages/3.1.13.md new file mode 100644 index 00000000..b69f320a --- /dev/null +++ b/messages/3.1.13.md @@ -0,0 +1,18 @@ +# MarkdownEditing 3.1.13 Changelog + +Your _MarkdownEditing_ plugin is updated. Enjoy new version. For any type of +feedback you can use [GitHub issues][issues]. + +## Bug Fixes + +- fix premature block quote termination +- fix extra backticks when creating fenced code blocks (#749) +- fix syntax highlighting of single backticks and code-spans in table cells + +## New Features + +- syntax highlighting for LaTeX in fenced code blocks + +## Changes + +[issues]: https://github.com/SublimeText-Markdown/MarkdownEditing/issues diff --git a/syntaxes/Fold.tmPreferences b/syntaxes/Fold.tmPreferences index 8b1b5e32..364879c9 100644 --- a/syntaxes/Fold.tmPreferences +++ b/syntaxes/Fold.tmPreferences @@ -1,29 +1,29 @@ - scope - text.html.markdown - settings - - foldScopes - - - begin - markup.heading meta.whitespace.newline - markup.quote - meta.list - end - markup.heading - markup.quote - meta.list - excludeTrailingNewlines - - - - begin - meta.fold.code-fence.begin - end - meta.fold.code-fence.end - excludeTrailingNewlines - - - - + scope + text.html.markdown + settings + + foldScopes + + + begin + markup.heading meta.whitespace.newline - markup.quote - meta.list + end + markup.heading - markup.quote - meta.list + excludeTrailingNewlines + + + + begin + meta.fold.code-fence.begin + end + meta.fold.code-fence.end + excludeTrailingNewlines + + + + diff --git a/syntaxes/Markdown.sublime-syntax b/syntaxes/Markdown.sublime-syntax index 3fb1fe31..acc59671 100644 --- a/syntaxes/Markdown.sublime-syntax +++ b/syntaxes/Markdown.sublime-syntax @@ -9,7 +9,7 @@ # # The scope suffix should indicate which flavor of Markdown the feature came from, # to help make this syntax definition easier to maintain. -name: Markdown +name: Markdown (MDE) scope: text.html.markdown version: 2 hidden: true @@ -378,7 +378,6 @@ contexts: push: - block-quote-caution-meta - block-quote-body - - block-quote-punctuation-body - match: '[ \t]{,3}(>)[ ]?((\[)!WARNING(\]))' captures: 1: punctuation.definition.blockquote.markdown @@ -388,7 +387,6 @@ contexts: push: - block-quote-warning-meta - block-quote-body - - block-quote-punctuation-body - match: '[ \t]{,3}(>)[ ]?((\[)!IMPORTANT(\]))' captures: 1: punctuation.definition.blockquote.markdown @@ -398,7 +396,6 @@ contexts: push: - block-quote-important-meta - block-quote-body - - block-quote-punctuation-body - match: '[ \t]{,3}(>)[ ]?((\[)!NOTE(\]))' captures: 1: punctuation.definition.blockquote.markdown @@ -408,7 +405,6 @@ contexts: push: - block-quote-note-meta - block-quote-body - - block-quote-punctuation-body - match: '[ \t]{,3}(>)[ ]?((\[)!TIP(\]))' captures: 1: punctuation.definition.blockquote.markdown @@ -418,7 +414,6 @@ contexts: push: - block-quote-tip-meta - block-quote-body - - block-quote-punctuation-body - match: '[ \t]{,3}(>)[ ]?' captures: 1: punctuation.definition.blockquote.markdown @@ -646,14 +641,14 @@ contexts: 4: markup.checkbox.begin.markdown-gfm punctuation.definition.checkbox.begin.markdown-gfm 5: markup.checkbox.mark.markdown-gfm 6: markup.checkbox.end.markdown-gfm punctuation.definition.checkbox.end.markdown-gfm - set: block-quote-unordered-list-block-body + push: block-quote-unordered-list-block-body - match: ([ \t]*)(\d{1,9}([.)]))(\s) captures: 1: markup.list.numbered.markdown 2: markup.list.numbered.bullet.markdown 3: punctuation.definition.list_item.markdown 4: markup.list.numbered.markdown - set: block-quote-ordered-list-block-body + push: block-quote-ordered-list-block-body block-quote-ordered-list-block-body: - meta_content_scope: markup.list.numbered.markdown @@ -712,7 +707,7 @@ contexts: block-quote-paragraph: - match: '[ \t]*(?=\S)' - set: block-quote-paragraph-body + push: block-quote-paragraph-body block-quote-paragraph-body: - meta_scope: markup.paragraph.markdown @@ -808,7 +803,6 @@ contexts: push: - block-quote-caution-meta - list-block-quote-body - - block-quote-punctuation-body - match: '[ \t]{,3}(>)[ ]?((\[)!WARNING(\]))' captures: 1: punctuation.definition.blockquote.markdown @@ -818,7 +812,6 @@ contexts: push: - block-quote-warning-meta - list-block-quote-body - - block-quote-punctuation-body - match: '[ \t]{,3}(>)[ ]?((\[)!IMPORTANT(\]))' captures: 1: punctuation.definition.blockquote.markdown @@ -828,7 +821,6 @@ contexts: push: - block-quote-important-meta - list-block-quote-body - - block-quote-punctuation-body - match: '[ \t]{,3}(>)[ ]?((\[)!NOTE(\]))' captures: 1: punctuation.definition.blockquote.markdown @@ -838,7 +830,6 @@ contexts: push: - block-quote-note-meta - list-block-quote-body - - block-quote-punctuation-body - match: '[ \t]{,3}(>)[ ]?((\[)!TIP(\]))' captures: 1: punctuation.definition.blockquote.markdown @@ -848,7 +839,6 @@ contexts: push: - block-quote-tip-meta - list-block-quote-body - - block-quote-punctuation-body - match: '[ \t]*(>)[ ]?' captures: 1: punctuation.definition.blockquote.markdown @@ -875,7 +865,7 @@ contexts: list-block-quote-paragraph: - match: '[ \t]*(?=\S)' - set: list-block-quote-paragraph-body + push: list-block-quote-paragraph-body list-block-quote-paragraph-body: - meta_scope: markup.paragraph.markdown @@ -1130,6 +1120,7 @@ contexts: - include: fenced-jsonc - include: fenced-jspx - include: fenced-jsx + - include: fenced-latex - include: fenced-lisp - include: fenced-lua - include: fenced-makefile @@ -1626,6 +1617,28 @@ contexts: 1: punctuation.definition.raw.code-fence.end.markdown 2: meta.fold.code-fence.end.markdown + fenced-latex: + - match: |- + (?x) + {{fenced_code_block_start}} + (?i:\s*(latex|tex)) + {{fenced_code_block_trailing_infostring_characters}} + captures: + 0: meta.code-fence.definition.begin.latex.markdown-gfm + 2: punctuation.definition.raw.code-fence.begin.markdown + 5: constant.other.language-name.markdown + 6: comment.line.infostring.markdown + 7: meta.fold.code-fence.begin.markdown + embed: scope:text.tex.latex + embed_scope: + markup.raw.code-fence.latex.markdown-gfm + text.tex.latex + escape: '{{fenced_code_block_escape}}' + escape_captures: + 0: meta.code-fence.definition.end.latex.markdown-gfm + 1: punctuation.definition.raw.code-fence.end.markdown + 2: meta.fold.code-fence.end.markdown + fenced-lisp: - match: |- (?x) @@ -3122,14 +3135,22 @@ contexts: table-cell-content: - match: (?={{balanced_emphasis}}) push: table-cell-emphasis - - match: (?!{{backticks}})`+ - scope: invalid.deprecated.unescaped-backticks.markdown + - include: table-cell-code-spans - include: table-cell-separators - include: images - - include: literals + - include: critics + - include: math-inline + - include: escapes - include: links - include: markups + table-cell-code-spans: + - match: (`+)[^`|]+(\1) + scope: markup.raw.inline.markdown + captures: + 1: punctuation.definition.raw.begin.markdown + 2: punctuation.definition.raw.end.markdown + table-cell-emphasis: - include: emphasis - include: immediately-pop diff --git a/syntaxes/MultiMarkdown.sublime-settings b/syntaxes/MultiMarkdown.sublime-settings index 29c7779c..acf72111 100644 --- a/syntaxes/MultiMarkdown.sublime-settings +++ b/syntaxes/MultiMarkdown.sublime-settings @@ -1,3 +1,3 @@ { - "trim_trailing_white_space_on_save": false + "trim_trailing_white_space_on_save": "none" } diff --git a/tests/syntax_test_markdown.md b/tests/syntax_test_markdown.md index 0095a86e..0e1a07c7 100644 --- a/tests/syntax_test_markdown.md +++ b/tests/syntax_test_markdown.md @@ -1911,6 +1911,18 @@ for (var i = 0; i < 10; i++) { |^^ meta.code-fence.definition.end.jsx.markdown-gfm punctuation.definition.raw.code-fence.end.markdown | ^ meta.code-fence.definition.end.jsx.markdown-gfm meta.fold.code-fence.end - punctuation +```latex +| <- meta.code-fence.definition.begin.latex.markdown-gfm punctuation.definition.raw.code-fence.begin.markdown +|^^ meta.code-fence.definition.begin.latex.markdown-gfm punctuation.definition.raw.code-fence.begin.markdown +| ^^^^^ meta.code-fence.definition.begin.latex.markdown-gfm constant.other.language-name.markdown +| ^ meta.code-fence.definition.begin.latex.markdown-gfm meta.fold.code-fence.begin.markdown - punctuation + +| <- markup.raw.code-fence.latex.markdown-gfm text.tex.latex +``` +| <- meta.code-fence.definition.end.latex.markdown-gfm punctuation.definition.raw.code-fence.end.markdown +|^^ meta.code-fence.definition.end.latex.markdown-gfm punctuation.definition.raw.code-fence.end.markdown +| ^ meta.code-fence.definition.end.latex.markdown-gfm meta.fold.code-fence.end.markdown - punctuation + ```lisp |^^^^^^ meta.code-fence.definition.begin - meta.fold | ^ meta.code-fence.definition.begin meta.fold.code-fence.begin @@ -3166,8 +3178,9 @@ bar | baz | f\|oo | | ------ | | b `|` az | -| ^^^ meta.table markup.raw.inline - meta.table.header-separator -| ^ meta.table punctuation.separator.table-cell +|^^^^^^^^^^^ meta.table.markdown-gfm - markup.raw +| ^ punctuation.separator.table-cell.markdown +| ^ punctuation.separator.table-cell.markdown | b **|** im | | <- meta.table punctuation.separator.table-cell | ^^^^^ meta.table markup.bold - punctuation.separator.table-cell @@ -3236,8 +3249,17 @@ not a table | | ^ punctuation.separator.table-cell | ^ punctuation.separator.table-cell |`test | me | -|^ invalid.deprecated.unescaped-backticks +|^^^^^^^^^^^^^ meta.table.markdown-gfm - markup.raw | ^ punctuation.separator.table-cell +| ` ` | ` me ` | +| <- meta.table.markdown-gfm punctuation.separator.table-cell.markdown +| ^^^ meta.table.markdown-gfm markup.raw.inline.markdown +| ^ punctuation.definition.raw.begin.markdown +| ^ punctuation.definition.raw.end.markdown +| ^ punctuation.separator.table-cell +| ^^^^^^ markup.raw.inline.markdown +| ^ punctuation.definition.raw.begin.markdown +| ^ punctuation.definition.raw.end.markdown | table | followed by paragraph @@ -8208,6 +8230,66 @@ This is a [[wiki link]]. |^ markup.quote.alert.caution.markdown - markup.paragraph | ^^^^^ markup.quote.alert.caution.markdown markup.paragraph.markdown +> [!CAUTION] +> +> Paragraph 1 +> +> Paragraph 2 +| <- markup.quote.alert.caution.markdown punctuation.definition.blockquote.markdown +|^ markup.quote.alert.caution.markdown - markup.paragraph +| ^^^^^^^^^^^ markup.quote.alert.caution.markdown markup.paragraph.markdown + +> [!CAUTION] +> +> - list item +> +> - list item +| <- markup.quote.alert.caution.markdown punctuation.definition.blockquote.markdown +|^ markup.quote.alert.caution.markdown +| ^ markup.quote.alert.caution.markdown markup.list.unnumbered.bullet.markdown punctuation.definition.list_item.markdown +| ^^^^^^^^^^^ markup.quote.alert.caution.markdown markup.list.unnumbered.markdown + +> [!CAUTION] +> +> 1. list item +> +> 2. list item +| <- markup.quote.alert.caution.markdown punctuation.definition.blockquote.markdown +|^ markup.quote.alert.caution.markdown +| ^^ markup.quote.alert.caution.markdown markup.list.numbered.bullet.markdown +| ^ punctuation.definition.list_item.markdown +| ^^^^^^^^^^ markup.quote.alert.caution.markdown markup.list.numbered.markdown + +> [!CAUTION] +> +> 1. list item +> +> 2. list item paragraph 1 +> +> list item paragraph 2 +| <- markup.quote.alert.caution.markdown markup.list.numbered.markdown punctuation.definition.blockquote.markdown +|^^^^^^^^^^^^^^^^^^^^^^^^^^ markup.quote.alert.caution.markdown markup.list.numbered.markdown + +> [!CAUTION] +> +> Paragraph 1 +> +> # Heading +> +> Paragraph 2 +| <- markup.quote.alert.caution.markdown punctuation.definition.blockquote.markdown +|^^^^^^^^^^^^^ markup.quote.alert.caution.markdown + +> [!CAUTION] +> +> ``` +> fenced code +> ``` +> +> Paragraph 2 +| <- markup.quote.alert.caution.markdown punctuation.definition.blockquote.markdown +|^^^^^^^^^^^^^ markup.quote.alert.caution.markdown + > [!WARNING] | <- markup.quote.alert.warning.markdown punctuation.definition.blockquote.markdown |^^^^^^^^^^^^ markup.quote.alert.warning.markdown @@ -8280,6 +8362,66 @@ This is a [[wiki link]]. |^ markup.quote.alert.caution.markdown - markup.paragraph | ^^^^^ markup.quote.alert.caution.markdown markup.paragraph.markdown + > [!CAUTION] + > + > Paragraph 1 + > + > Paragraph 2 + | <- markup.quote.alert.caution.markdown punctuation.definition.blockquote.markdown + |^ markup.quote.alert.caution.markdown - markup.paragraph + | ^^^^^^^^^^^ markup.quote.alert.caution.markdown markup.paragraph.markdown + + > [!CAUTION] + > + > - list item + > + > - list item + | <- markup.quote.alert.caution.markdown punctuation.definition.blockquote.markdown + |^ markup.quote.alert.caution.markdown + | ^ markup.quote.alert.caution.markdown markup.list.unnumbered.bullet.markdown punctuation.definition.list_item.markdown + | ^^^^^^^^^^^ markup.quote.alert.caution.markdown markup.list.unnumbered.markdown + + > [!CAUTION] + > + > 1. list item + > + > 2. list item + | <- markup.quote.alert.caution.markdown punctuation.definition.blockquote.markdown + |^ markup.quote.alert.caution.markdown + | ^^ markup.quote.alert.caution.markdown markup.list.numbered.bullet.markdown + | ^ punctuation.definition.list_item.markdown + | ^^^^^^^^^^ markup.quote.alert.caution.markdown markup.list.numbered.markdown + + > [!CAUTION] + > + > 1. list item + > + > 2. list item paragraph 1 + > + > list item paragraph 2 + | <- markup.quote.alert.caution.markdown markup.list.numbered.markdown punctuation.definition.blockquote.markdown + |^^^^^^^^^^^^^^^^^^^^^^^^^^ markup.quote.alert.caution.markdown markup.list.numbered.markdown + + > [!CAUTION] + > + > Paragraph 1 + > + > # Heading + > + > Paragraph 2 + | <- markup.quote.alert.caution.markdown punctuation.definition.blockquote.markdown + |^^^^^^^^^^^^^ markup.quote.alert.caution.markdown + + > [!CAUTION] + > + > ``` + > fenced code + > ``` + > + > Paragraph 2 + | <- markup.quote.alert.caution.markdown punctuation.definition.blockquote.markdown + |^^^^^^^^^^^^^ markup.quote.alert.caution.markdown + 1. list item > [!WARNING] | <- markup.quote.alert.warning.markdown punctuation.definition.blockquote.markdown @@ -8437,21 +8579,21 @@ $$ foo = 1 + 2 * \sqrt{a^2+b^2} | <- markup.math.block.markdown text.tex.latex.embedded.markdown meta.environment.math.block.dollar variable.other.math |^^^^^^^^^^^^^^^^^^^^^^^^^^^^ markup.math.block.markdown text.tex.latex.embedded.markdown meta.environment.math.block.dollar -| ^ keyword.operator.math -| ^ constant.numeric.math -| ^ keyword.operator.math -| ^ constant.numeric.math -| ^ keyword.operator.math +| ^ keyword.operator +| ^ constant.numeric +| ^ keyword.operator +| ^ constant.numeric +| ^ keyword.operator | ^^^^^ support.function.math | ^^^^^^^^^ meta.group.brace | ^ punctuation.definition.group.brace.begin | ^ variable.other.math -| ^ keyword.operator.math -| ^ constant.numeric.math -| ^ keyword.operator.math +| ^ keyword.operator +| ^ constant.numeric +| ^ keyword.operator | ^ variable.other.math -| ^ keyword.operator.math -| ^ constant.numeric.math +| ^ keyword.operator +| ^ constant.numeric | ^ punctuation.definition.group.brace.end $$ | <- markup.math.block.markdown text.tex.latex.embedded.markdown meta.environment.math.block.dollar punctuation.definition.math.end @@ -8569,9 +8711,9 @@ Math $1+1$ setext heading This is math $1+1$ expression, but $ 1+1 $ ,$ 1+1$, $1+1 $ and 1+1$ or $1+1 are not. | ^^^^^ meta.paragraph.markdown markup.math.inline.markdown text.tex.latex.embedded.markdown meta.environment.math.block.dollar | ^ punctuation.definition.math.begin -| ^ constant.numeric.math -| ^ keyword.operator.math -| ^ constant.numeric.math +| ^ constant.numeric +| ^ keyword.operator +| ^ constant.numeric | ^ punctuation.definition.math.end | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.paragraph.markdown - markup.math