" Language:    Texte Convivial Technique (TCT)
" License:     GNU General Public License, version 3 or later (at your option)
" Maintainer:  Julien Moutinho <julm+tct@autogeree.net>
" URL:         http://autogeree.net/pad/edition/tct/
" Version:     v2017-08-24
" Installation:
"  Copy this file to ~/.vim/syntax/tct.vim
"  then add this line to ~/.vimrc :
"  autocmd BufNewFile,BufRead *.tct set filetype=tct

if exists("b:current_syntax")
	"finish
 endif

syn clear
syn sync fromstart
syn sync linebreaks=1

" Default
syn match tctPlain /.\+/ contains=@tctInline
hi def link tctPlain Normal

" Block
syn match   tctPath          /^\( *\([^<>:=| *`«»/"_,.;@^!?~%(){}[\]\\#&+-]* *[:>]\|\[[^]]*\]\|- \|\( *\d\+\.\)\+\)\)* *\ze\([^<>:=| *`«»/"_,.;@^!?~%(){}[\]\\#&+-]* *\([>=|@]\|: \|:$\)\|\[[^]]*\]\|-- \|- \|\( *\d\+\.\)\+\|#\+ \)/
    \ contains=tctNodeBird,tctNodeColon,tctNodeComment,tctNodeUL,tctNodeOL,tctNodeBracket
    \ nextgroup=@tctKeyPath
syn cluster tctKeyPath
    \ contains=tctKeyAt,tctKeyBird,tctKeyColon,tctKeyEqual,tctKeyBar,tctKeyComment,tctKeyUL,tctKeyOL,tctKeyBracket,tctKeySection
syn match   tctKeyAt         /[^<>:=| ]* *@/   contained contains=tctNodeAt      nextgroup=tctValueAt
syn match   tctKeyBar        /[^<>:=| ]* *|/   contained contains=tctNodeBar     nextgroup=tctValueBar
syn match   tctKeyBird       /[^<>:=| ]* *>/   contained contains=tctNodeBird    nextgroup=tctValueBird
syn match   tctKeyColon      /[^<>:=| ]* *:\ze\( \|$\)/ contained contains=tctNodeColon nextgroup=tctValueColon
syn match   tctKeyEqual      /[^<>:=| ]* *=/   contained contains=tctNodeEqual   nextgroup=tctValueEqual
syn match   tctKeyBracket    /\[[^]]*\]/       contained contains=tctNodeBracket nextgroup=tctValueBracket
syn match   tctKeyComment    /-- /             contained contains=tctNodeComment nextgroup=tctValueComment
syn match   tctKeyUL         /-\ze /           contained contains=tctNodeUL      nextgroup=tctValueUL
syn match   tctKeyOL         /\( *\d\+\.\)\+\ze\( \|$\)/ contained contains=tctNodeOL nextgroup=tctValueOL
syn match   tctKeySection    /#\+\ze /         contained contains=tctNodeSection nextgroup=tctValueSection

syn match   tctNodeAt        /[^<>:=| ]* *@/   contained contains=tctSymAt,tctSymDot
syn match   tctNodeBar       /[^<>:=| ]* *|/   contained contains=tctSymBar,tctSymDot
syn match   tctNodeBird      /[^<>:=| ]* *>/   contained contains=tctSymBird,tctSymDot
syn match   tctNodeColon     /[^<>:=| ]* *:\ze\( \|$\)/ contained contains=tctSymColon,@tctColons,tctSymDot
syn match   tctNodeEqual     /[^<>:=| ]* *=/   contained contains=tctSymEqual,tctSymDot
syn match   tctNodeBracket   /\[[^]]*\]/       contained contains=tctSymBracket,@tctInline
syn match   tctNodeComment   /--/              contained
syn match   tctNodeUL        /-/               contained
syn match   tctNodeOL        /\( *\d\+\.\)\+/  contained contains=tctSymDot
syn match   tctNodeSection   /#\+/             contained

syn match   tctSymAt         /@/   contained
syn match   tctSymBar        /|/   contained
syn match   tctSymBird       />/   contained
syn match   tctSymColon      /:/   contained
syn match   tctSymDot        /[.]/ contained
syn match   tctSymEqual      /=/   contained
syn match   tctSymBracket    /\(\[\|\]\)/ contained

syn match   tctValueAt       /.*/ contained contains=@tctURL
syn match   tctValueBar      /.*/ contained
syn match   tctValueBird     /.*/ contained contains=@tctInline
syn match   tctValueColon    /.*/ contained contains=@tctInline
syn match   tctValueEqual    /.*/ contained contains=@tctInline
syn match   tctValueBracket  /.*/ contained contains=@tctInline
syn match   tctValueComment  /.*/ contained
syn match   tctValueUL       /.*/ contained contains=@tctInline
syn match   tctValueOL       /.*/ contained contains=@tctInline
syn match   tctValueSection  /.*/ contained contains=@tctInline

"syn match   tctSection       /^ *#\+ .*/ contains=@tctInline


hi tctNodeAt       cterm=NONE ctermfg=yellow      guifg=yellow
hi tctNodeBar      cterm=NONE ctermfg=DarkYellow  guifg=yellow
hi tctNodeBird     cterm=NONE ctermfg=DarkYellow  guifg=yellow
hi tctNodeColon    cterm=bold ctermfg=yellow      guifg=yellow
hi tctNodeEqual    cterm=bold ctermfg=DarkGrey    guifg=yellow
hi tctNodeBracket  cterm=NONE ctermfg=NONE        guifg=NONE
hi tctNodeComment  cterm=bold ctermfg=DarkGrey    guifg=grey
hi tctNodeUL       cterm=bold ctermfg=yellow      guifg=yellow
hi tctNodeOL       cterm=bold ctermfg=yellow      guifg=yellow
hi tctNodeSection  cterm=bold ctermfg=magenta     guifg=magenta gui=bold

hi tctSymAt        cterm=bold ctermfg=cyan     guifg=cyan
hi tctSymBar       cterm=bold ctermfg=cyan     guifg=cyan
hi tctSymBird      cterm=bold ctermfg=cyan     guifg=cyan
hi tctSymColon     cterm=bold ctermfg=cyan     guifg=cyan
hi tctSymDot       cterm=bold ctermfg=DarkGrey guifg=grey
hi tctSymEqual     cterm=bold ctermfg=cyan     guifg=cyan
hi tctSymBracket   cterm=bold ctermfg=cyan     guifg=cyan

hi tctValueAt      cterm=bold gui=bold
hi def link tctValueBar Normal
hi tctValueColon   cterm=bold gui=bold
hi tctValueBird    cterm=NONE gui=NONE
hi tctValueEqual   cterm=NONE gui=NONE
hi tctValueComment ctermfg=DarkGrey cterm=bold gui=NONE guifg=grey
hi tctValueUL      cterm=NONE gui=NONE
hi tctValueOL      cterm=NONE gui=NONE

hi tctComment      cterm=bold ctermfg=DarkGrey guifg=grey
hi tctKeySection   cterm=bold ctermfg=magenta  guifg=magenta gui=bold
hi tctValueSection cterm=bold ctermfg=magenta  guifg=magenta gui=bold


" Semantic node names, these are not necessary but improves the view.
syn cluster tctColons contains=tctColonDONE,tctColonSOLVED,tctColonTODO
syn match   tctColonDONE   /\<DONE\ze *:/   contained
syn match   tctColonSOLVED /\<SOLVED\ze *:/ contained
syn match   tctColonTODO   /\<TODO\ze *:/   contained
hi          tctColonDONE   ctermfg=green
hi          tctColonSOLVED ctermfg=green
hi          tctColonTODO   ctermfg=red

syn cluster tctBlock contains=tctPath,tctSection

" Inline
syn match tctBold
    \ /\(^\|[  `’«»/"|_,.:;@^!?=~%(){}[\]\\&+-]\)\zs\*[^ *]\([^*]*[^ *]\)\?\*\ze\([  `’«»/"|_,.:;@^!?=~%(){}[\]\\&+-]\|$\)/
    \ contained contains=@tctInline
syn match tctCode
    \ /\(^\|[  *’«»/"|_,.:;@^!?=~%(){}[\]\\&+-]\)\zs`[^ `]\([^`]*[^ `]\)\?`\ze\([  *’«»/"|_,.:;@^!?=~%(){}[\]\\&+-]\|$\)/
    \ contained contains=@tctInline
syn match tctE
    \ /<\/\?[^ >]\+\/\?>/
    \ contained contains=tctESym,tctEAttr
syn match tctESym
    \ /[</>]/
    \ contained
syn match tctEAttr
    \ / [^=]\+="[^"]*"/
    \ contained
syn match tctQuoteFrench
    \ /«.\{-}»/
    \ contained contains=@tctInline
syn match tctItalic
    \ /\(^\|[  *`’«»"'’|_,.:;@^!?=~<>%(){}[\]\\#&+-]\)\zs\/[^ /]\([^/]*[^ /]\)\?\/\ze\([  *`’«»"'’|_,.:;@^!?=~<>%(){}[\]\\#&+-]\|$\)/
    \ contained contains=@tctInline
syn match tctQuote
    \ /\(^\|[  *`’«»/'’|_,.:;@^!?=~<>%(){}[\]\\#&+-]\)\zs"[^ "]\([^"]*[^ "]\)\?"\ze\([  *`’«»/'’|_,.:;@^!?=~<>%(){}[\]\\#&+-]\|$\)/
    \ contained contains=@tctInline
syn match tctTag
    \ /\(^\|[  *`’«»/"'’|_,.:;@^!?=~<>%(){}[\]\&+-]\)\zs#\([^ #]\([^#]*[^ #]\)\?#\|[^ #]*[^# *`’«»/"'’|_,.:;@^!?=~<>%(){}[\]\&+-]\)\ze\([  *`’«»/"'’|_,.:;@^!?=~<>%(){}[\]\&+-]\|$\)/
    \ contained contains=@tctInline
syn match tctUnderline
    \ /\(^\|[  *`’«»/"'’|,.:;@!?=~<>%(){}[\]\\#&+-]\)\zs_.*_\ze\([  *`’«»/"'’|,.:;@!?=~<>%(){}[\]\\#&+-]\|$\)/
    \ contained contains=@tctInline
syn match tctURL
    \ /[a-z+-]\+:\/\/[^| \t[\]]*\(\[[^\]]*\]\)\?/
    \ contained contains=tctURLText
syn match tctURLText
    \ /\(\[\zs[^\]]*\ze\]\)\?/
    \ contained contains=@tctInline
syn match tctEntity "&[^; \t]*;" contained contains=tctEntityPunct
syn match tctEntityPunct contained "[&.;]"
syn region tctElem
    \ matchgroup=tctElem start=/<\ze[^ /!?<>"']/
    \ matchgroup=tctElem   end=/>/
    \ contained contains=tctElemName,tctAttr,tctSymEqual,tctAttrValue
syn region tctElemEnd
    \ matchgroup=tctElem start=/<\/\ze[^ /!?<>"']/
    \ matchgroup=tctElem   end=/>/
    \ contained contains=tctElemName,tctAttrPunct
syn match tctNamespace
    \ +\(<\|</\)\@2<=[^ /!?<>"':]\+\ze[:]+
    \ contained
syn match tctElemName
    \ /\(<\|<\/\)\@2<=[^ /!?<>"']\+/
    \ contained contains=tctNamespace,tctAttrPunct
syn match tctAttr
    \ +[-'"<]\@1<!\<[a-zA-Z:_][-.0-9a-zA-Z:_]*\>\%(['">]\@!\|$\)+
    \ contained contains=tctAttrPunct
syn match tctAttrPunct +[:.]+ contained
syn region tctAttrValue contained start=+"+ end=+"+ contains=tctEntity
syn region tctAttrValue contained start=+'+ end=+'+ contains=tctEntity


syn cluster tctInline contains=tctBold,tctCode,tctElem,tctElemEnd,tctEntity,tctQuoteFrench,tctItalic,tctQuote,tctTag,tctUnderline,tctURL


hi def link tctAttr         Type
hi def link tctAttrPunct    Comment
hi          tctBold         cterm=bold                     gui=bold
hi          tctCode         cterm=reverse ctermfg=white    gui=reverse
hi          tctESym         cterm=bold    ctermfg=cyan     guifg=cyan
hi def link tctEntity       Statement
hi def link tctEntityPunct  Type
hi          tctItalic       cterm=italic gui=italic
hi def link tctNamespace    Tag
hi          tctQuote        cterm=bold ctermfg=cyan        guifg=cyan
hi          tctQuoteFrench  cterm=bold ctermfg=green       guifg=green
hi          tctTag          cterm=bold ctermfg=cyan        guifg=cyan
hi def link tctElem         Function
hi def link tctElemEnd      Identifier
hi          tctElemName     cterm=bold ctermfg=yellow      guifg=yellow
hi def link tctAttrValue    String
hi def link tctTodo         Todo
hi def link tctURL          Macro
hi def link tctURLText      tctNormal
hi          tctUnderline                   cterm=underline gui=underline

let b:current_syntax = "tct"