Sublime Forum

Niche markdown syntax extension

#1

I’ve held out as long as possible. I cannot solve this issue despite pouring over endless forum posts and other resources. I’m trying to extend Markdown syntax so that a niche feature of pandoc’s “fenced_divs” extension are scoped. Specifically, I want

::::::::::{.columns}
::: column
* a two-column list
* with all default markdown scopes
:::
::: column
* like *italics* and **bold** or x^2^ or ~~this~~
* to apply
::::::::::

I write a lot in markdown and use pandoc to convert .md to .pptx, which enables setting two-column text in the slides. I want to be able to style the markup within the column blocks, if i want, and i want to be able to style the column blocks themselves, so that I can subject them to code folding, for example, or different highlight. My syntax file is below. One thing I know, though, is that the patience of forum users is generous, for which i’m thankful.

%YAML 1.2
---
# https://forum.sublimetext.com/t/additional-markdown-context-hugo-sites/65054/12
# https://forum.sublimetext.com/t/syntax-inheritance-and-the-extends-key/66672/2

file_extensions:
  - md
  - Rmd
scope: text.md
#scope: text.html.markdown
#scope: text.html.markdown.pptx
version: 2
name: Markdown PPTX
extends: Packages/Markdown/Markdown.sublime-syntax

contexts:

  markdown:
    - meta_prepend: true
    - include: pptx-columns

  # New context for a columns block
  pptx-columns:
    #- match: '^{10,}\{\s*\.columns\s*\}\s*$'
    - match: '^::::::::::{.columns}$'
      #scope: meta.tag.pptx.columns.begin
      scope: text.html.columns-begin.markdown.pptx
      push: columns-container-content

  # Context for the content inside a columns container.
  columns-container-content:
    # Recognize the start of a column block.
    - match: '^::: column$'
      push: column-block
    # Recognize the closing of the columns container.
    - match: '^::::::::::$'
      pop: true
    # For any other content, include the parent Markdown rules.
    - include: Packages/Markdown/Markdown.sublime-syntax

  column-block:
    - meta_scope: meta.block.column.markdown
  # Embed the full Markdown syntax for the content within a column.
      escape: '^:::$'
      pop: true
0 Likes

#2

Syntax:

%YAML 1.2
---
# http://www.sublimetext.com/docs/syntax.html
name: Markdown (Pandoc)
scope: text.html.markdown.pandoc
version: 2

extends: Packages/Markdown/Markdown.sublime-syntax

contexts:

  fenced-code-blocks:
    - meta_prepend: true
    - include: fenced-divs

  fenced-divs:
    - match: ^\s*(:+)(?!:)
      captures:
        1: punctuation.section.block.begin.markdown.pandoc
      embed: fenced-div-body
      escape: ^\s*(\1)(\s*\n)
      escape_captures:
        0: meta.block.markdown.pandoc
        1: punctuation.section.block.end.markdown.pandoc

  fenced-div-body:
    - meta_include_prototype: false
    - meta_scope: meta.block.div.markdown.pandoc
    - match: ''
      push: [indented-markdown, link-def-attr, fenced-div-title]

  fenced-div-title:
    - meta_scope: markup.heading.div.markdown.pandoc
    - match: (?=\s*[{\n])
      pop: 1
    - include: emphasis
    - include: images
    - include: literals
    - include: links
    - include: markups

tests

| SYNTAX TEST "Markdown (Pandoc).sublime-syntax"

::: {.border}
| <- meta.block.div.markdown punctuation.section.block.begin.markdown
|^^^^^^^^^^^^^ meta.block.div.markdown
|^^ meta.block.div.markdown punctuation.section.block.begin.markdown
|   ^^^^^^^^^ meta.block.div.markdown meta.attributes.markdown
|   ^ punctuation.definition.attributes.begin.markdown
|    ^^^^^^^ entity.other.attribute-name.markdown
|           ^ punctuation.definition.attributes.end.markdown
This content can be styled with a border
:::
| <- meta.block.markdown punctuation.section.block.end.markdown
|^^ meta.block.markdown punctuation.section.block.end.markdown

::::: {#special .sidebar}
|^^^^^^^^^^^^^^^^^^^^^^^^ meta.block.div.markdown
|^^^^ punctuation.section.block.begin.markdown
|     ^^^^^^^^^^^^^^^^^^^ meta.attributes.markdown
|     ^ punctuation.definition.attributes.begin.markdown
|      ^^^^^^^^^^^^^^^^^ meta.attribute-with-value.markdown
|      ^^^^^^^^ entity.other.attribute-name.markdown
|               ^^^^^^^^ entity.other.attribute-name.markdown
|                       ^ punctuation.definition.attributes.end.markdown

::: {.warning}
|^^^^^^^^^^^^^ meta.block.div.markdown meta.block.div.markdown
|^^ punctuation.section.block.begin.markdown
|   ^^^^^^^^^^ meta.attributes.markdown
|   ^ punctuation.definition.attributes.begin.markdown
|    ^^^^^^^^ meta.attribute-with-value.markdown entity.other.attribute-name.markdown
|            ^ punctuation.definition.attributes.end.markdown
Here is a warning.
:::
|^^ meta.block.div.markdown meta.block.markdown punctuation.section.block.end.markdown

More content.
:::::
|^^^^ meta.block.markdown punctuation.section.block.end.markdown

::::::::::{.columns}
::: column
|^^^^^^^^^ meta.block.div.markdown meta.block.div.markdown
|^^ punctuation.section.block.begin.markdown
|  ^^^^^^^ markup.heading.div.markdown
* a two-column list
|^^^^^^^^^^^^^^^^^^ meta.block.div.markdown meta.block.div.markdown
|^ markup.list.unnumbered.markdown
| ^^^^^^^^^^^^^^^^^ meta.paragraph.list.markdown
* with all default markdown scopes
|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.block.div.markdown meta.block.div.markdown
|^ markup.list.unnumbered.markdown
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.paragraph.list.markdown
:::
|^^ meta.block.div.markdown meta.block.markdown punctuation.section.block.end.markdown
::: column
* like *italics* and **bold** or x^2^ or ~~this~~
|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.block.div.markdown
|^ markup.list.unnumbered.markdown
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.paragraph.list.markdown
|      ^^^^^^^^^ markup.italic.markdown
|      ^ punctuation.definition.italic.begin.markdown
|              ^ punctuation.definition.italic.end.markdown
|                    ^^^^^^^^ markup.bold.markdown
|                    ^^ punctuation.definition.bold.begin.markdown
|                          ^^ punctuation.definition.bold.end.markdown
|                                        ^^^^^^^^ markup.strikethrough.markdown-gfm
|                                        ^^ punctuation.definition.strikethrough.begin.markdown
|                                              ^^ punctuation.definition.strikethrough.end.markdown
* to apply
|^^^^^^^^^ meta.block.div.markdown
|^ markup.list.unnumbered.markdown
| ^^^^^^^^ meta.paragraph.list.markdown
::::::::::
|^^^^^^^^^ meta.block.markdown punctuation.section.block.end.markdown

1 Like

#3
  1. Your code works.
  2. You gave me a needed sanity check bc as you saw I was flailing about.
  3. Plans on adding this to the MarkdownEditing repo, or should I keep it local?
  4. Thank you very much.
0 Likes