217 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			VimL
		
	
	
	
	
	
			
		
		
	
	
			217 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			VimL
		
	
	
	
	
	
| " 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
 |