scriptencoding utf-8 " " Language: Pandoc (superset of Markdown) " Maintainer: Felipe Morales " Maintainer: Caleb Maclennan " Upstream: https://github.com/vim-pandoc/vim-pandoc-syntax " " Contributor: David Sanson " Jorge Israel Peña " Original Author: Jeremy Schultz " Version: 5.0 " Last Change: 2024 Apr 08 let s:cpo_save = &cpo set cpo&vim " Configuration: {{{1 " " use conceal? {{{2 if !exists('g:pandoc#syntax#conceal#use') let g:pandoc#syntax#conceal#use = 1 endif "}}}2 " what groups not to use conceal in. works as a blacklist {{{2 if !exists('g:pandoc#syntax#conceal#blacklist') let g:pandoc#syntax#conceal#blacklist = [] endif " }}}2 " cchars used in conceal rules {{{2 " utf-8 defaults (preferred) if &encoding ==# 'utf-8' let s:cchars = { \'newline': '↵', \'image': '▨', \'super': 'ⁿ', \'sub': 'ₙ', \'strike': 'x̶', \'atx': '§', \'codelang': 'λ', \'codeend': '—', \'abbrev': '→', \'footnote': '†', \'definition': ' ', \'li': '•', \'html_c_s': '‹', \'html_c_e': '›', \'quote_s': '“', \'quote_e': '”'} else " ascii defaults let s:cchars = { \'newline': ' ', \'image': 'i', \'super': '^', \'sub': '_', \'strike': '~', \'atx': '#', \'codelang': 'l', \'codeend': '-', \'abbrev': 'a', \'footnote': 'f', \'definition': ' ', \'li': '*', \'html_c_s': '+', \'html_c_e': '+'} endif " }}}2 " if the user has a dictionary with replacements for the default cchars, use those {{{2 if exists('g:pandoc#syntax#conceal#cchar_overrides') let s:cchars = extend(s:cchars, g:pandoc#syntax#conceal#cchar_overrides) endif " }}}2 "should the urls in links be concealed? {{{2 if !exists('g:pandoc#syntax#conceal#urls') let g:pandoc#syntax#conceal#urls = 0 endif " should backslashes in escapes be concealed? {{{2 if !exists('g:pandoc#syntax#conceal#backslash') let g:pandoc#syntax#conceal#backslash = 0 endif " }}}2 " leave specified codeblocks as Normal (i.e. 'unhighlighted') {{{2 if !exists('g:pandoc#syntax#codeblocks#ignore') let g:pandoc#syntax#codeblocks#ignore = [] endif " }}}2 " use embedded highlighting for delimited codeblocks where a language is specifed. {{{2 if !exists('g:pandoc#syntax#codeblocks#embeds#use') let g:pandoc#syntax#codeblocks#embeds#use = 1 endif " }}}2 " for what languages and using what vim syntax files highlight those embeds. {{{2 " defaults to None. if !exists('g:pandoc#syntax#codeblocks#embeds#langs') let g:pandoc#syntax#codeblocks#embeds#langs = [] endif " }}}2 " use italics ? {{{2 if !exists('g:pandoc#syntax#style#emphases') let g:pandoc#syntax#style#emphases = 1 endif " if 0, we don't conceal the emphasis marks, otherwise there wouldn't be a way " to tell where the styles apply. if g:pandoc#syntax#style#emphases == 0 call add(g:pandoc#syntax#conceal#blacklist, 'block') endif " }}}2 " underline subscript, superscript and strikeout? {{{2 if !exists('g:pandoc#syntax#style#underline_special') let g:pandoc#syntax#style#underline_special = 1 endif " }}}2 " protect code blocks? {{{2 if !exists('g:pandoc#syntax#protect#codeblocks') let g:pandoc#syntax#protect#codeblocks = 1 endif " }}}2 " use color column? {{{2 if !exists('g:pandoc#syntax#colorcolumn') let g:pandoc#syntax#colorcolumn = 0 endif " }}}2 " highlight new lines? {{{2 if !exists('g:pandoc#syntax#newlines') let g:pandoc#syntax#newlines = 1 endif " }}} " detect roman-numeral list items? {{{2 if !exists('g:pandoc#syntax#roman_lists') let g:pandoc#syntax#roman_lists = 0 endif " }}}2 " disable syntax highlighting for definition lists? (better performances) {{{2 if !exists('g:pandoc#syntax#use_definition_lists') let g:pandoc#syntax#use_definition_lists = 1 endif " }}}2 " }}}1 " Functions: {{{1 " EnableEmbedsforCodeblocksWithLang {{{2 function! EnableEmbedsforCodeblocksWithLang(entry) " prevent embedded language syntaxes from changing 'foldmethod' if has('folding') let s:foldmethod = &l:foldmethod let s:foldtext = &l:foldtext endif try let s:langname = matchstr(a:entry, '^[^=]*') let s:langsyntaxfile = matchstr(a:entry, '[^=]*$') unlet! b:current_syntax exe 'syn include @'.toupper(s:langname).' syntax/'.s:langsyntaxfile.'.vim' " We might have just turned off spellchecking by including the file, " so we turn it back on here. exe 'syntax spell toplevel' exe 'syn region pandocDelimitedCodeBlock_' . s:langname . ' start=/\(\_^\( \+\|\t\)\=\(`\{3,}`*\|\~\{3,}\~*\)\s*\%({[^.]*\.\)\=' . s:langname . '\>.*\n\)\@<=\_^/' . \' end=/\_$\n\(\( \+\|\t\)\=\(`\{3,}`*\|\~\{3,}\~*\)\_$\n\_$\)\@=/ contained containedin=pandocDelimitedCodeBlock' . \' contains=@' . toupper(s:langname) exe 'syn region pandocDelimitedCodeBlockinBlockQuote_' . s:langname . ' start=/>\s\(`\{3,}`*\|\~\{3,}\~*\)\s*\%({[^.]*\.\)\=' . s:langname . '\>/' . \ ' end=/\(`\{3,}`*\|\~\{3,}\~*\)/ contained containedin=pandocDelimitedCodeBlock' . \' contains=@' . toupper(s:langname) . \',pandocDelimitedCodeBlockStart,pandocDelimitedCodeBlockEnd,pandodDelimitedCodeblockLang,pandocBlockQuoteinDelimitedCodeBlock' catch /E484/ echo "No syntax file found for '" . s:langsyntaxfile . "'" endtry if exists('s:foldmethod') && s:foldmethod !=# &l:foldmethod let &l:foldmethod = s:foldmethod endif if exists('s:foldtext') && s:foldtext !=# &l:foldtext let &l:foldtext = s:foldtext endif endfunction " }}}2 " DisableEmbedsforCodeblocksWithLang {{{2 function! DisableEmbedsforCodeblocksWithLang(langname) try exe 'syn clear pandocDelimitedCodeBlock_'.a:langname exe 'syn clear pandocDelimitedCodeBlockinBlockQuote_'.a:langname catch /E28/ echo "No existing highlight definitions found for '" . a:langname . "'" endtry endfunction " }}}2 " WithConceal {{{2 function! s:WithConceal(rule_group, rule, conceal_rule) let l:rule_tail = '' if g:pandoc#syntax#conceal#use != 0 if index(g:pandoc#syntax#conceal#blacklist, a:rule_group) == -1 let l:rule_tail = ' ' . a:conceal_rule endif endif execute a:rule . l:rule_tail endfunction " }}}2 " }}}1 " Commands: {{{1 command! -buffer -nargs=1 -complete=syntax PandocHighlight call EnableEmbedsforCodeblocksWithLang() command! -buffer -nargs=1 -complete=syntax PandocUnhighlight call DisableEmbedsforCodeblocksWithLang() " }}}1 " BASE: syntax clear syntax spell toplevel " }}}1 " Syntax Rules: {{{1 " Embeds: {{{2 " prevent embedded language syntaxes from changing 'foldmethod' if has('folding') let s:foldmethod = &l:foldmethod endif " HTML: {{{3 " Set embedded HTML highlighting syn include @HTML syntax/html.vim syn match pandocHTML /<\/\?\a\_.\{-}>/ contains=@HTML " Support HTML multi line comments syn region pandocHTMLComment start=// keepend contains=pandocHTMLCommentStart,pandocHTMLCommentEnd call s:WithConceal('html_c_s', 'syn match pandocHTMLCommentStart // contained', 'conceal cchar='.s:cchars['html_c_e']) " }}}3 " LaTeX: {{{3 " Set embedded LaTex (pandoc extension) highlighting " Unset current_syntax so the 2nd include will work unlet b:current_syntax syn include @LATEX syntax/tex.vim if index(g:pandoc#syntax#conceal#blacklist, 'inlinemath') == -1 " Can't use WithConceal here because it will mess up all other conceals " when dollar signs are used normally. It must be skipped entirely if " inlinemath is blacklisted syn region pandocLaTeXInlineMath start=/\v\\@.*\n\(.*\n\@1/ contained containedin=pandocEmphasis,pandocStrong,pandocPCite,pandocSuperscript,pandocSubscript,pandocStrikeout,pandocUListItem,pandocNoFormatted " }}}2 " Code Blocks: {{{2 if g:pandoc#syntax#protect#codeblocks == 1 syn match pandocCodeblock /\([ ]\{4}\|\t\).*$/ endif syn region pandocCodeBlockInsideIndent start=/\(\(\d\|\a\|*\).*\n\)\@/ contains=NONE " }}}3 " }}}2 " Citations: {{{2 " parenthetical citations syn match pandocPCite "\^\@~/]*.\{-}\]" contains=pandocEmphasis,pandocStrong,pandocLatex,pandocCiteKey,@Spell,pandocAmpersandEscape display " in-text citations with location syn match pandocICite "@[[:alnum:]_][[:digit:][:lower:][:upper:]_:.#$%&\-+?<>~/]*\s\[.\{-1,}\]" contains=pandocCiteKey,@Spell display " cite keys syn match pandocCiteKey /\(-\=@[[:alnum:]_][[:digit:][:lower:][:upper:]_:.#$%&\-+?<>~/]*\)/ containedin=pandocPCite,pandocICite contains=@NoSpell display syn match pandocCiteAnchor /[-@]/ contained containedin=pandocCiteKey display syn match pandocCiteLocator /[\[\]]/ contained containedin=pandocPCite,pandocICite " }}}2 " Text Styles: {{{2 " Emphasis: {{{3 call s:WithConceal('block', 'syn region pandocEmphasis matchgroup=pandocOperator start=/\\\@1.*\n\|^\s*\n\)\@<=#\{1,6}.*\n/ contains=pandocEmphasis,pandocStrong,pandocNoFormatted,pandocLaTeXInlineMath,pandocEscapedDollar,@Spell,pandocAmpersandEscape,pandocReferenceLabel,pandocReferenceURL display syn match pandocAtxHeaderMark /\(^#\{1,6}\|\\\@/ contained containedin=pandocGridTableHeader,pandocPipeTableHeader contains=@Spell " }}}2 " Delimited Code Blocks: {{{2 " this is here because we can override strikeouts and subscripts syn region pandocDelimitedCodeBlock start=/^\(>\s\)\?\z(\([ ]\+\|\t\)\=\~\{3,}\~*\)/ end=/^\z1\~*/ skipnl contains=pandocDelimitedCodeBlockStart,pandocDelimitedCodeBlockEnd keepend syn region pandocDelimitedCodeBlock start=/^\(>\s\)\?\z(\([ ]\+\|\t\)\=`\{3,}`*\)/ end=/^\z1`*/ skipnl contains=pandocDelimitedCodeBlockStart,pandocDelimitedCodeBlockEnd keepend call s:WithConceal('codeblock_start', 'syn match pandocDelimitedCodeBlockStart /\(\(\_^\n\_^\|\%^\)\(>\s\)\?\( \+\|\t\)\=\)\@<=\(\~\{3,}\~*\|`\{3,}`*\)/ contained containedin=pandocDelimitedCodeBlock nextgroup=pandocDelimitedCodeBlockLanguage', 'conceal cchar='.s:cchars['codelang']) syn match pandocDelimitedCodeBlockLanguage /\(\s\?\)\@<=.\+\(\_$\)\@=/ contained call s:WithConceal('codeblock_delim', 'syn match pandocDelimitedCodeBlockEnd /\(`\{3,}`*\|\~\{3,}\~*\)\(\_$\n\(>\s\)\?\_$\)\@=/ contained containedin=pandocDelimitedCodeBlock', 'conceal cchar='.s:cchars['codeend']) syn match pandocBlockQuoteinDelimitedCodeBlock '^>' contained containedin=pandocDelimitedCodeBlock syn match pandocCodePre /
.\{-}<\/pre>/ skipnl
syn match pandocCodePre /.\{-}<\/code>/ skipnl

" enable highlighting for embedded region in codeblocks if there exists a
" g:pandoc#syntax#codeblocks#embeds#langs *list*.
"
" entries in this list are the language code interpreted by pandoc,
" if this differs from the name of the vim syntax file, append =vimname
" e.g. let g:pandoc#syntax#codeblocks#embeds#langs = ["haskell", "literatehaskell=lhaskell"]
"
if g:pandoc#syntax#codeblocks#embeds#use != 0
    for l in g:pandoc#syntax#codeblocks#embeds#langs
      call EnableEmbedsforCodeblocksWithLang(l)
    endfor
endif
" }}}2

" Abbreviations: {{{2
syn region pandocAbbreviationDefinition start=/^\*\[.\{-}\]:\s*/ end='$' contains=pandocNoFormatted,@Spell,pandocAmpersandEscape
call s:WithConceal('abbrev', 'syn match pandocAbbreviationSeparator /:/ contained containedin=pandocAbbreviationDefinition', 'conceal cchar='.s:cchars['abbrev'])
syn match pandocAbbreviation /\*\[.\{-}\]/ contained containedin=pandocAbbreviationDefinition
call s:WithConceal('abbrev', 'syn match pandocAbbreviationHead /\*\[/ contained containedin=pandocAbbreviation', 'conceal')
call s:WithConceal('abbrev', 'syn match pandocAbbreviationTail /\]/ contained containedin=pandocAbbreviation', 'conceal')
" }}}2

" Footnotes: {{{2
" we put these here not to interfere with superscripts.
syn match pandocFootnoteID /\[\^[^\]]\+\]/ nextgroup=pandocFootnoteDef

"   Inline footnotes
syn region pandocFootnoteDef start=/\^\[/ skip=/\[.\{-}]/ end=/\]/ contains=pandocReferenceLabel,pandocReferenceURL,pandocLatex,pandocPCite,pandocCiteKey,pandocStrong,pandocEmphasis,pandocStrongEmphasis,pandocNoFormatted,pandocSuperscript,pandocSubscript,pandocStrikeout,pandocEnDash,pandocEmDash,pandocEllipses,pandocBeginQuote,pandocEndQuote,@Spell,pandocAmpersandEscape skipnl keepend
call s:WithConceal('footnote', 'syn match pandocFootnoteDefHead /\^\[/ contained containedin=pandocFootnoteDef', 'conceal cchar='.s:cchars['footnote'])
call s:WithConceal('footnote', 'syn match pandocFootnoteDefTail /\]/ contained containedin=pandocFootnoteDef', 'conceal')

" regular footnotes
syn region pandocFootnoteBlock start=/\[\^.\{-}\]:\s*\n*/ end=/^\n^\s\@!/ contains=pandocReferenceLabel,pandocReferenceURL,pandocLatex,pandocPCite,pandocCiteKey,pandocStrong,pandocEmphasis,pandocNoFormatted,pandocSuperscript,pandocSubscript,pandocStrikeout,pandocEnDash,pandocEmDash,pandocNewLine,pandocStrongEmphasis,pandocEllipses,pandocBeginQuote,pandocEndQuote,pandocLaTeXInlineMath,pandocEscapedDollar,pandocLaTeXCommand,pandocLaTeXMathBlock,pandocLaTeXRegion,pandocAmpersandEscape,@Spell skipnl
syn match pandocFootnoteBlockSeparator /:/ contained containedin=pandocFootnoteBlock
syn match pandocFootnoteID /\[\^.\{-}\]/ contained containedin=pandocFootnoteBlock
call s:WithConceal('footnote', 'syn match pandocFootnoteIDHead /\[\^/ contained containedin=pandocFootnoteID', 'conceal cchar='.s:cchars['footnote'])
call s:WithConceal('footnote', 'syn match pandocFootnoteIDTail /\]/ contained containedin=pandocFootnoteID', 'conceal')
" }}}2

" List Items: {{{2
" Unordered lists
syn match pandocUListItem /^>\=\s*[*+-]\s\+-\@!.*$/ nextgroup=pandocUListItem,pandocLaTeXMathBlock,pandocLaTeXInlineMath,pandocEscapedDollar,pandocDelimitedCodeBlock,pandocListItemContinuation contains=@Spell,pandocEmphasis,pandocStrong,pandocNoFormatted,pandocStrikeout,pandocSubscript,pandocSuperscript,pandocStrongEmphasis,pandocStrongEmphasis,pandocPCite,pandocICite,pandocCiteKey,pandocReferenceLabel,pandocLaTeXCommand,pandocLaTeXMathBlock,pandocLaTeXInlineMath,pandocEscapedDollar,pandocReferenceURL,pandocAutomaticLink,pandocFootnoteDef,pandocFootnoteBlock,pandocFootnoteID,pandocAmpersandEscape skipempty display
call s:WithConceal('list', 'syn match pandocUListItemBullet /^>\=\s*\zs[*+-]/ contained containedin=pandocUListItem', 'conceal cchar='.s:cchars['li'])

" Ordered lists
syn match pandocListItem /^\s*(\?\(\d\+\|\l\|\#\|@\)[.)].*$/ nextgroup=pandocListItem,pandocLaTeXMathBlock,pandocLaTeXInlineMath,pandocEscapedDollar,pandocDelimitedCodeBlock,pandocListItemContinuation contains=@Spell,pandocEmphasis,pandocStrong,pandocNoFormatted,pandocStrikeout,pandocSubscript,pandocSuperscript,pandocStrongEmphasis,pandocStrongEmphasis,pandocPCite,pandocICite,pandocCiteKey,pandocReferenceLabel,pandocLaTeXCommand,pandocLaTeXMathBlock,pandocLaTeXInlineMath,pandocEscapedDollar,pandocAutomaticLink,pandocFootnoteDef,pandocFootnoteBlock,pandocFootnoteID,pandocAmpersandEscape skipempty display

" support for roman numerals up to 'c'
if g:pandoc#syntax#roman_lists != 0
    syn match pandocListItem /^\s*(\?x\=l\=\(i\{,3}[vx]\=\)\{,3}c\{,3}[.)].*$/ nextgroup=pandocListItem,pandocMathBlock,pandocLaTeXInlineMath,pandocEscapedDollar,pandocDelimitedCodeBlock,pandocListItemContinuation,pandocAutomaticLink skipempty display
endif
syn match pandocListItemBullet /^(\?.\{-}[.)]/ contained containedin=pandocListItem
syn match pandocListItemBulletId /\(\d\+\|\l\|\#\|@.\{-}\|x\=l\=\(i\{,3}[vx]\=\)\{,3}c\{,3}\)/ contained containedin=pandocListItemBullet

syn match pandocListItemContinuation /^\s\+\([-+*]\s\+\|(\?.\+[).]\)\@[[:punct:]]*\)\@<="[[:blank:][:punct:]\n]\@=/  containedin=pandocEmphasis,pandocStrong,pandocUListItem,pandocListItem,pandocListItemContinuation display', 'conceal cchar='.s:cchars['quote_e'])
endif
" }}}3

" Hrule: {{{3
syn match pandocHRule /^\s*\([*\-_]\)\s*\%(\1\s*\)\{2,}$/ display
" }}}3

" Backslashes: {{{3
if g:pandoc#syntax#conceal#backslash == 1
    syn match pandocBackslash /\v\\@