| " Vim syntax file |
| " |
| " Language: Moodle GIFT (General Import Format Template) |
| " Maintainer: Selim Temizer (http://selimtemizer.com) |
| " Creation: November 28, 2020 |
| " Latest Revision: December 21, 2020 |
| " Note: The order of entities in this file is important! |
| |
| if version < 600 |
| syntax clear |
| elseif exists("b:current_syntax") |
| finish |
| endif |
| |
| |
| setlocal conceallevel=1 |
| |
| "----------------------------------------------- |
| " GIFT entities |
| |
| syn match giftS "\~" contained "GIFT special characters |
| syn match giftS "=" contained |
| syn match giftS "#" contained |
| syn match giftS "{" contained |
| syn match giftS "}" contained |
| syn match giftS ":" contained |
| |
| syn match giftES "\\\~" contained conceal cchar=~ "GIFT escaped special characters |
| syn match giftES "\\=" contained conceal cchar== |
| syn match giftES "\\#" contained conceal cchar=# |
| syn match giftES "\\{" contained conceal cchar={ |
| syn match giftES "\\}" contained conceal cchar=} |
| syn match giftES "\\:" contained conceal cchar=: |
| |
| syn match giftEN "\\n" contained conceal cchar=n "GIFT escaped newline |
| |
| syn match giftFormat "\[html]" contained "GIFT formats |
| syn match giftFormat "\[plain]" contained |
| syn match giftFormat "\[moodle]" contained |
| syn match giftFormat "\[markdown]" contained |
| |
| "-------------------------------------------------------- |
| " HTML entities |
| |
| syn match giftH "<" contained "HTML characters that might need to be handled/escaped |
| syn match giftH ">" contained |
| syn match giftH "&" contained |
| |
| syn match giftEH "<" contained conceal cchar=< "HTML escaped characters |
| syn match giftEH ">" contained conceal cchar=> |
| syn match giftEH "&" contained conceal cchar=& |
| syn match giftEH " " contained conceal cchar=_ |
| |
| "------------------------------------------------------- |
| " Answer components: Feedback and general feedback |
| |
| syn match giftFB "#\_.\{-}\(\_^\|[^\\]\)\ze\(=\|\~\|#\|####\|}\)" contained contains=giftF "Feedback block |
| syn match giftF "#\zs\_.\{-}\(\_^\|[^\\]\)\ze\(=\|\~\|#\|####\|}\)" contained contains=@giftCEF "Feedback |
| |
| syn match giftGFB "####\_.\{-}\(\_^\|[^\\]\)\ze}" contained contains=giftGF "General feedback block |
| syn match giftGF "####\zs\_.\{-}\(\_^\|[^\\]\)\ze}" contained contains=@giftCEF "General feedback |
| |
| "------------------------------------------------------ |
| " Answer components: Other components |
| |
| syn keyword giftTF T TRUE F FALSE contained |
| |
| syn match giftNum1 "[-+]\=[.0-9]\+" contained "Something matching a number |
| |
| syn match giftNum2 "[-+]\=[.0-9]\+\s*:\s*[-+]\=[.0-9]\+" contained contains=giftNum2D "Number with error margin |
| syn match giftNum2D ":" contained "Associated delimiter |
| |
| syn match giftNum3 "[-+]\=[.0-9]\+\s*\.\.\s*[-+]\=[.0-9]\+" contained contains=giftNum3D "Number as min/max range |
| syn match giftNum3D "\.\." contained "Associated delimiter |
| |
| syn match giftWeightB "%-*[0-9]\{1,2}\.\?[0-9]*%" contained contains=giftWeight "Weight block |
| syn match giftWeight "%\zs-*[0-9]\{1,2}\.\?[0-9]*\ze%" contained "Weight |
| |
| "----------------------------------------------------- |
| " Answer choices |
| |
| syn match giftWrongNum "\~\zs\_.\{-}\(\_^\|[^\\]\)\ze\(####\|}\)" contained contains=@giftCEFF "Wrong numeric choice |
| syn match giftRightNum "=\zs\_.\{-}\(\_^\|[^\\]\)\ze\(=\|\~\|####\|}\)" contained contains=@giftCEFFW,@giftNums "Right numeric choice |
| |
| syn match giftWrong "\~\zs\_.\{-}\(\_^\|[^\\]\)\ze\(=\|\~\|####\|}\)" contained contains=@giftCEFFW "Wrong choice |
| syn match giftRight "=\zs\_.\{-}\(\ze->\|\(\_^\|[^\\]\)\ze\(=\|\~\|####\|}\)\)" contained contains=@giftCEFFW "Right choice |
| syn match giftMatchB "->\_.\{-}\(\_^\|[^\\]\)\ze\(=\|\~\|####\|}\)" contained contains=giftMatch "Match choice block |
| syn match giftMatch "->\zs\_.\{-}\(\_^\|[^\\]\)\ze\(=\|\~\|####\|}\)" contained contains=@giftCE "Match choice |
| |
| "---------------------------------------------------- |
| " Answer |
| |
| syn match giftAnswer "{\_.\{-}\(\_^\|[^\\]\)}" contained keepend contains=@giftA "General answer |
| syn match giftAnswer "{}" contained "Minimal answer |
| |
| syn match giftAnswerNum "{\_[[:space:]]*#\_[^#]\_.\{-}\(\_^\|[^\\]\)}" contained keepend contains=@giftANum "Numeric answer |
| syn match giftAnswerNumD "{\zs\_[[:space:]]*#" contained "Associated delimiter |
| |
| "--------------------------------------------------- |
| " Question |
| |
| " The first pattern matches the last question at the end of the file (in case there is no empty line coming after). |
| " However, it slows down parsing (and especially scrolling up), therefore it is commented out. |
| |
| "syn match giftQuestion "[^{[:space:]]\_.\{-}\%$" keepend contains=@giftCEF,giftAnswer,giftAnswerNum |
| syn match giftQuestion "[^{[:space:]]\_.\{-}\n\(\s*\n\)\+" keepend contains=@giftCEF,giftAnswer,giftAnswerNum |
| |
| "-------------------------------------------------- |
| " Question name |
| |
| syn match giftName "::\_.\{-}::" contains=@giftCE,giftNameD "Question name |
| syn match giftNameD "::" contained "Associated delimiter |
| |
| "------------------------------------------------- |
| " Category |
| |
| syn match giftCategoryB "^\s*\$CATEGORY:.*\n\+" contains=giftCategory "Category block |
| syn match giftCategory "^\s*\$CATEGORY:\zs.*\ze\n" contained "Category |
| |
| "------------------------------------------------ |
| " Comments (may need to be the last entity) |
| |
| syn keyword giftTodo FIXME TODO NOTE FIX XXX contained |
| |
| syn match giftIdB "\[id:\(\\]\|[^][:cntrl:]]\)\+]" contained contains=giftId "Id block |
| syn match giftId "\[id:\zs\(\\]\|[^][:cntrl:]]\)\+\ze]" contained "Id |
| |
| syn match giftTagB "\[tag:\(\\]\|[^]<>`[:cntrl:]]\)\+]" contained contains=giftTag "Tag block |
| syn match giftTag "\[tag:\zs\(\\]\|[^]<>`[:cntrl:]]\)\+\ze]" contained "Tag |
| |
| syn match giftComment "^\s*//.*" contains=giftTodo,giftIdB,giftTagB |
| |
| "----------------------------------------------- |
| " Clusters |
| |
| "Comments and entities (to be escaped) |
| syn cluster giftCE contains=giftComment,giftS,giftES,giftEN,giftH,giftEH |
| |
| "The above plus format |
| syn cluster giftCEF contains=@giftCE,giftFormat |
| |
| "The above plus feedback block |
| syn cluster giftCEFF contains=@giftCEF,giftFB |
| |
| "The above plus weight block |
| syn cluster giftCEFFW contains=@giftCEFF,giftWeightB |
| |
| "Possible numerical representations |
| syn cluster giftNums contains=giftNum1,giftNum2,giftNum3 |
| |
| "Possible contents of answers |
| syn cluster giftA contains=giftComment,giftTF,giftWrong,giftRight,giftMatchB,giftFB,giftGFB |
| |
| "Possible contents of numerical answers |
| syn cluster giftANum contains=giftAnswerNumD,giftComment,@giftNums,giftWrongNum,giftRightNum,giftFB,giftGFB |
| |
| "----------------------------------------------- |
| |
| let b:current_syntax = "gift" |
| |
| "----------------------------------------------- |
| |
| hi Conceal ctermbg=NONE ctermfg=Blue guibg=NONE guifg=Blue |
| hi Feedback ctermbg=NONE ctermfg=DarkCyan guibg=NONE guifg=DarkCyan |
| hi GFeedback ctermbg=NONE ctermfg=DarkGreen guibg=NONE guifg=DarkGreen |
| hi WeightB ctermbg=NONE ctermfg=DarkYellow guibg=NONE guifg=DarkYellow |
| |
| "----------------------------------------------- |
| |
| hi def link giftS Error |
| hi def link giftES Conceal |
| hi def link giftEN Conceal |
| hi def link giftFormat LineNr |
| |
| hi def link giftH Error |
| hi def link giftEH Conceal |
| |
| hi def link giftFB PreProc |
| hi def link giftF Feedback |
| hi def link giftGFB Title |
| hi def link giftGF GFeedback |
| |
| hi def link giftTF Question |
| hi def link giftNum1 Question |
| hi def link giftNum2 Question |
| hi def link giftNum2D Special |
| hi def link giftNum3 Question |
| hi def link giftNum3D Special |
| hi def link giftWeightB WeightB |
| hi def link giftWeight Identifier |
| |
| hi def link giftWrongNum Constant |
| hi def link giftRightNum Question |
| hi def link giftWrong Constant |
| hi def link giftRight Question |
| hi def link giftMatchB ModeMsg |
| hi def link giftMatch Constant |
| |
| hi def link giftAnswer MoreMsg |
| hi def link giftAnswerNum MoreMsg |
| hi def link giftAnswerNumD Identifier |
| |
| hi def link giftQuestion Identifier |
| |
| hi def link giftName PreProc |
| hi def link giftNameD Directory |
| |
| hi def link giftCategoryB LineNr |
| hi def link giftCategory Directory |
| |
| hi def link giftTodo Todo |
| hi def link giftIdB LineNr |
| hi def link giftId Title |
| hi def link giftTagB LineNr |
| hi def link giftTag Constant |
| hi def link giftComment Comment |