" Vim syntax file
" Language:     FlexWiki, http://www.flexwiki.com/
" Maintainer:   George V. Reilly  <george@reilly.org>
" Home:         http://www.georgevreilly.com/vim/flexwiki/
" Other Home:   http://www.vim.org/scripts/script.php?script_id=1529
" Author:       George V. Reilly
" Filenames:    *.wiki
" Last Change: Wed Apr 26 11:00 PM 2006 P
" Version:      0.3

" Note: The horrible regexps were reverse-engineered from
" FlexWikiCore\EngineSource\Formatter.cs, with help from the Regex Analyzer
" in The Regulator, http://regulator.sourceforge.net/  .NET uses Perl-style
" regexes, which use a different syntax than Vim (fewer \s).
" The primary test case is FlexWiki\FormattingRules.wiki

" quit when a syntax file was already loaded
if exists("b:current_syntax")
    finish
endif

" A WikiWord (unqualifiedWikiName)
syntax match  flexwikiWord          /\%(_\?\([A-Z]\{2,}[a-z0-9]\+[A-Za-z0-9]*\)\|\([A-Z][a-z0-9]\+[A-Za-z0-9]*[A-Z]\+[A-Za-z0-9]*\)\)/
" A [bracketed wiki word]
syntax match  flexwikiWord          /\[[[:alnum:]\s]\+\]/

" text: "this is a link (optional tooltip)":http://www.microsoft.com
" TODO: check URL syntax against RFC
syntax match flexwikiLink           `\("[^"(]\+\((\([^)]\+\))\)\?":\)\?\(https\?\|ftp\|gopher\|telnet\|file\|notes\|ms-help\):\(\(\(//\)\|\(\\\\\)\)\+[A-Za-z0-9:#@%/;$~_?+-=.&\-\\\\]*\)`

" text: *strong* 
syntax match flexwikiBold           /\(^\|\W\)\zs\*\([^ ].\{-}\)\*/
" '''bold'''
syntax match flexwikiBold           /'''\([^'].\{-}\)'''/

" text: _emphasis_
syntax match flexwikiItalic         /\(^\|\W\)\zs_\([^ ].\{-}\)_/
" ''italic''
syntax match flexwikiItalic         /''\([^'].\{-}\)''/

" ``deemphasis``
syntax match flexwikiDeEmphasis     /``\([^`].\{-}\)``/

" text: @code@ 
syntax match flexwikiCode           /\(^\|\s\|(\|\[\)\zs@\([^@]\+\)@/

"   text: -deleted text- 
syntax match flexwikiDelText        /\(^\|\s\+\)\zs-\([^ <a ]\|[^ <img ]\|[^ -].*\)-/

"   text: +inserted text+ 
syntax match flexwikiInsText        /\(^\|\W\)\zs+\([^ ].\{-}\)+/

"   text: ^superscript^ 
syntax match flexwikiSuperScript    /\(^\|\W\)\zs^\([^ ].\{-}\)^/

"   text: ~subscript~ 
syntax match flexwikiSubScript      /\(^\|\W\)\zs\~\([^ ].\{-}\)\~/

"   text: ??citation?? 
syntax match flexwikiCitation       /\(^\|\W\)\zs??\([^ ].\{-}\)??/

" Emoticons: must come after the Textilisms, as later rules take precedence
" over earlier ones. This match is an approximation for the ~70 distinct
" patterns that FlexWiki knows.
syntax match flexwikiEmoticons      /\((.)\|:[()|$@]\|:-[DOPS()\]|$@]\|;)\|:'(\)/

" Aggregate all the regular text highlighting into flexwikiText
syntax cluster flexwikiText contains=flexwikiItalic,flexwikiBold,flexwikiCode,flexwikiDeEmphasis,flexwikiDelText,flexwikiInsText,flexwikiSuperScript,flexwikiSubScript,flexwikiCitation,flexwikiLink,flexwikiWord,flexwikiEmoticons

" single-line WikiPropertys
syntax match flexwikiSingleLineProperty /^:\?[A-Z_][_a-zA-Z0-9]\+:/

" TODO: multi-line WikiPropertys

" Header levels, 1-6
syntax match flexwikiH1             /^!.*$/
syntax match flexwikiH2             /^!!.*$/
syntax match flexwikiH3             /^!!!.*$/
syntax match flexwikiH4             /^!!!!.*$/
syntax match flexwikiH5             /^!!!!!.*$/
syntax match flexwikiH6             /^!!!!!!.*$/

" <hr>, horizontal rule
syntax match flexwikiHR             /^----.*$/

" Formatting can be turned off by ""enclosing it in pairs of double quotes""
syntax match flexwikiEscape         /"".\{-}""/

" Tables. Each line starts and ends with '||'; each cell is separated by '||'
syntax match flexwikiTable          /||/

" Bulleted list items start with one or tabs, followed by whitespace, then '*'
" Numeric  list items start with one or tabs, followed by whitespace, then '1.'
" Eight spaces at the beginning of the line is equivalent to the leading tab.
syntax match flexwikiList           /^\(\t\| \{8}\)\s*\(\*\|1\.\).*$/   contains=@flexwikiText

" Treat all other lines that start with spaces as PRE-formatted text.
syntax match flexwikiPre            /^[ \t]\+[^ \t*1].*$/


" Link FlexWiki syntax items to colors
hi def link flexwikiH1                    Title
hi def link flexwikiH2                    flexwikiH1
hi def link flexwikiH3                    flexwikiH2
hi def link flexwikiH4                    flexwikiH3
hi def link flexwikiH5                    flexwikiH4
hi def link flexwikiH6                    flexwikiH5
hi def link flexwikiHR                    flexwikiH6
    
hi def flexwikiBold                       term=bold cterm=bold gui=bold
hi def flexwikiItalic                     term=italic cterm=italic gui=italic

hi def link flexwikiCode                  Statement
hi def link flexwikiWord                  Underlined

hi def link flexwikiEscape                Todo
hi def link flexwikiPre                   PreProc
hi def link flexwikiLink                  Underlined
hi def link flexwikiList                  Type
hi def link flexwikiTable                 Type
hi def link flexwikiEmoticons             Constant
hi def link flexwikiDelText               Comment
hi def link flexwikiDeEmphasis            Comment
hi def link flexwikiInsText               Constant
hi def link flexwikiSuperScript           Constant
hi def link flexwikiSubScript             Constant
hi def link flexwikiCitation              Constant

hi def link flexwikiSingleLineProperty    Identifier

let b:current_syntax="FlexWiki"

" vim:tw=0:
