1*7e6a515eSBram Moolenaar" Vim syntax file 2*7e6a515eSBram Moolenaar" 3*7e6a515eSBram Moolenaar" Language: Moodle GIFT (General Import Format Template) 4*7e6a515eSBram Moolenaar" Maintainer: Selim Temizer (http://selimtemizer.com) 5*7e6a515eSBram Moolenaar" Creation: November 28, 2020 6*7e6a515eSBram Moolenaar" Latest Revision: December 21, 2020 7*7e6a515eSBram Moolenaar" Note: The order of entities in this file is important! 8*7e6a515eSBram Moolenaar 9*7e6a515eSBram Moolenaarif version < 600 10*7e6a515eSBram Moolenaar syntax clear 11*7e6a515eSBram Moolenaarelseif exists("b:current_syntax") 12*7e6a515eSBram Moolenaar finish 13*7e6a515eSBram Moolenaarendif 14*7e6a515eSBram Moolenaar 15*7e6a515eSBram Moolenaar 16*7e6a515eSBram Moolenaarsetlocal conceallevel=1 17*7e6a515eSBram Moolenaar 18*7e6a515eSBram Moolenaar"----------------------------------------------- 19*7e6a515eSBram Moolenaar" GIFT entities 20*7e6a515eSBram Moolenaar 21*7e6a515eSBram Moolenaarsyn match giftS "\~" contained "GIFT special characters 22*7e6a515eSBram Moolenaarsyn match giftS "=" contained 23*7e6a515eSBram Moolenaarsyn match giftS "#" contained 24*7e6a515eSBram Moolenaarsyn match giftS "{" contained 25*7e6a515eSBram Moolenaarsyn match giftS "}" contained 26*7e6a515eSBram Moolenaarsyn match giftS ":" contained 27*7e6a515eSBram Moolenaar 28*7e6a515eSBram Moolenaarsyn match giftES "\\\~" contained conceal cchar=~ "GIFT escaped special characters 29*7e6a515eSBram Moolenaarsyn match giftES "\\=" contained conceal cchar== 30*7e6a515eSBram Moolenaarsyn match giftES "\\#" contained conceal cchar=# 31*7e6a515eSBram Moolenaarsyn match giftES "\\{" contained conceal cchar={ 32*7e6a515eSBram Moolenaarsyn match giftES "\\}" contained conceal cchar=} 33*7e6a515eSBram Moolenaarsyn match giftES "\\:" contained conceal cchar=: 34*7e6a515eSBram Moolenaar 35*7e6a515eSBram Moolenaarsyn match giftEN "\\n" contained conceal cchar=n "GIFT escaped newline 36*7e6a515eSBram Moolenaar 37*7e6a515eSBram Moolenaarsyn match giftFormat "\[html]" contained "GIFT formats 38*7e6a515eSBram Moolenaarsyn match giftFormat "\[plain]" contained 39*7e6a515eSBram Moolenaarsyn match giftFormat "\[moodle]" contained 40*7e6a515eSBram Moolenaarsyn match giftFormat "\[markdown]" contained 41*7e6a515eSBram Moolenaar 42*7e6a515eSBram Moolenaar"-------------------------------------------------------- 43*7e6a515eSBram Moolenaar" HTML entities 44*7e6a515eSBram Moolenaar 45*7e6a515eSBram Moolenaarsyn match giftH "<" contained "HTML characters that might need to be handled/escaped 46*7e6a515eSBram Moolenaarsyn match giftH ">" contained 47*7e6a515eSBram Moolenaarsyn match giftH "&" contained 48*7e6a515eSBram Moolenaar 49*7e6a515eSBram Moolenaarsyn match giftEH "<" contained conceal cchar=< "HTML escaped characters 50*7e6a515eSBram Moolenaarsyn match giftEH ">" contained conceal cchar=> 51*7e6a515eSBram Moolenaarsyn match giftEH "&" contained conceal cchar=& 52*7e6a515eSBram Moolenaarsyn match giftEH " " contained conceal cchar=_ 53*7e6a515eSBram Moolenaar 54*7e6a515eSBram Moolenaar"------------------------------------------------------- 55*7e6a515eSBram Moolenaar" Answer components: Feedback and general feedback 56*7e6a515eSBram Moolenaar 57*7e6a515eSBram Moolenaarsyn match giftFB "#\_.\{-}\(\_^\|[^\\]\)\ze\(=\|\~\|#\|####\|}\)" contained contains=giftF "Feedback block 58*7e6a515eSBram Moolenaarsyn match giftF "#\zs\_.\{-}\(\_^\|[^\\]\)\ze\(=\|\~\|#\|####\|}\)" contained contains=@giftCEF "Feedback 59*7e6a515eSBram Moolenaar 60*7e6a515eSBram Moolenaarsyn match giftGFB "####\_.\{-}\(\_^\|[^\\]\)\ze}" contained contains=giftGF "General feedback block 61*7e6a515eSBram Moolenaarsyn match giftGF "####\zs\_.\{-}\(\_^\|[^\\]\)\ze}" contained contains=@giftCEF "General feedback 62*7e6a515eSBram Moolenaar 63*7e6a515eSBram Moolenaar"------------------------------------------------------ 64*7e6a515eSBram Moolenaar" Answer components: Other components 65*7e6a515eSBram Moolenaar 66*7e6a515eSBram Moolenaarsyn keyword giftTF T TRUE F FALSE contained 67*7e6a515eSBram Moolenaar 68*7e6a515eSBram Moolenaarsyn match giftNum1 "[-+]\=[.0-9]\+" contained "Something matching a number 69*7e6a515eSBram Moolenaar 70*7e6a515eSBram Moolenaarsyn match giftNum2 "[-+]\=[.0-9]\+\s*:\s*[-+]\=[.0-9]\+" contained contains=giftNum2D "Number with error margin 71*7e6a515eSBram Moolenaarsyn match giftNum2D ":" contained "Associated delimiter 72*7e6a515eSBram Moolenaar 73*7e6a515eSBram Moolenaarsyn match giftNum3 "[-+]\=[.0-9]\+\s*\.\.\s*[-+]\=[.0-9]\+" contained contains=giftNum3D "Number as min/max range 74*7e6a515eSBram Moolenaarsyn match giftNum3D "\.\." contained "Associated delimiter 75*7e6a515eSBram Moolenaar 76*7e6a515eSBram Moolenaarsyn match giftWeightB "%-*[0-9]\{1,2}\.\?[0-9]*%" contained contains=giftWeight "Weight block 77*7e6a515eSBram Moolenaarsyn match giftWeight "%\zs-*[0-9]\{1,2}\.\?[0-9]*\ze%" contained "Weight 78*7e6a515eSBram Moolenaar 79*7e6a515eSBram Moolenaar"----------------------------------------------------- 80*7e6a515eSBram Moolenaar" Answer choices 81*7e6a515eSBram Moolenaar 82*7e6a515eSBram Moolenaarsyn match giftWrongNum "\~\zs\_.\{-}\(\_^\|[^\\]\)\ze\(####\|}\)" contained contains=@giftCEFF "Wrong numeric choice 83*7e6a515eSBram Moolenaarsyn match giftRightNum "=\zs\_.\{-}\(\_^\|[^\\]\)\ze\(=\|\~\|####\|}\)" contained contains=@giftCEFFW,@giftNums "Right numeric choice 84*7e6a515eSBram Moolenaar 85*7e6a515eSBram Moolenaarsyn match giftWrong "\~\zs\_.\{-}\(\_^\|[^\\]\)\ze\(=\|\~\|####\|}\)" contained contains=@giftCEFFW "Wrong choice 86*7e6a515eSBram Moolenaarsyn match giftRight "=\zs\_.\{-}\(\ze->\|\(\_^\|[^\\]\)\ze\(=\|\~\|####\|}\)\)" contained contains=@giftCEFFW "Right choice 87*7e6a515eSBram Moolenaarsyn match giftMatchB "->\_.\{-}\(\_^\|[^\\]\)\ze\(=\|\~\|####\|}\)" contained contains=giftMatch "Match choice block 88*7e6a515eSBram Moolenaarsyn match giftMatch "->\zs\_.\{-}\(\_^\|[^\\]\)\ze\(=\|\~\|####\|}\)" contained contains=@giftCE "Match choice 89*7e6a515eSBram Moolenaar 90*7e6a515eSBram Moolenaar"---------------------------------------------------- 91*7e6a515eSBram Moolenaar" Answer 92*7e6a515eSBram Moolenaar 93*7e6a515eSBram Moolenaarsyn match giftAnswer "{\_.\{-}\(\_^\|[^\\]\)}" contained keepend contains=@giftA "General answer 94*7e6a515eSBram Moolenaarsyn match giftAnswer "{}" contained "Minimal answer 95*7e6a515eSBram Moolenaar 96*7e6a515eSBram Moolenaarsyn match giftAnswerNum "{\_[[:space:]]*#\_[^#]\_.\{-}\(\_^\|[^\\]\)}" contained keepend contains=@giftANum "Numeric answer 97*7e6a515eSBram Moolenaarsyn match giftAnswerNumD "{\zs\_[[:space:]]*#" contained "Associated delimiter 98*7e6a515eSBram Moolenaar 99*7e6a515eSBram Moolenaar"--------------------------------------------------- 100*7e6a515eSBram Moolenaar" Question 101*7e6a515eSBram Moolenaar 102*7e6a515eSBram Moolenaar" The first pattern matches the last question at the end of the file (in case there is no empty line coming after). 103*7e6a515eSBram Moolenaar" However, it slows down parsing (and especially scrolling up), therefore it is commented out. 104*7e6a515eSBram Moolenaar 105*7e6a515eSBram Moolenaar"syn match giftQuestion "[^{[:space:]]\_.\{-}\%$" keepend contains=@giftCEF,giftAnswer,giftAnswerNum 106*7e6a515eSBram Moolenaar syn match giftQuestion "[^{[:space:]]\_.\{-}\n\(\s*\n\)\+" keepend contains=@giftCEF,giftAnswer,giftAnswerNum 107*7e6a515eSBram Moolenaar 108*7e6a515eSBram Moolenaar"-------------------------------------------------- 109*7e6a515eSBram Moolenaar" Question name 110*7e6a515eSBram Moolenaar 111*7e6a515eSBram Moolenaarsyn match giftName "::\_.\{-}::" contains=@giftCE,giftNameD "Question name 112*7e6a515eSBram Moolenaarsyn match giftNameD "::" contained "Associated delimiter 113*7e6a515eSBram Moolenaar 114*7e6a515eSBram Moolenaar"------------------------------------------------- 115*7e6a515eSBram Moolenaar" Category 116*7e6a515eSBram Moolenaar 117*7e6a515eSBram Moolenaarsyn match giftCategoryB "^\s*\$CATEGORY:.*\n\+" contains=giftCategory "Category block 118*7e6a515eSBram Moolenaarsyn match giftCategory "^\s*\$CATEGORY:\zs.*\ze\n" contained "Category 119*7e6a515eSBram Moolenaar 120*7e6a515eSBram Moolenaar"------------------------------------------------ 121*7e6a515eSBram Moolenaar" Comments (may need to be the last entity) 122*7e6a515eSBram Moolenaar 123*7e6a515eSBram Moolenaarsyn keyword giftTodo FIXME TODO NOTE FIX XXX contained 124*7e6a515eSBram Moolenaar 125*7e6a515eSBram Moolenaarsyn match giftIdB "\[id:\(\\]\|[^][:cntrl:]]\)\+]" contained contains=giftId "Id block 126*7e6a515eSBram Moolenaarsyn match giftId "\[id:\zs\(\\]\|[^][:cntrl:]]\)\+\ze]" contained "Id 127*7e6a515eSBram Moolenaar 128*7e6a515eSBram Moolenaarsyn match giftTagB "\[tag:\(\\]\|[^]<>`[:cntrl:]]\)\+]" contained contains=giftTag "Tag block 129*7e6a515eSBram Moolenaarsyn match giftTag "\[tag:\zs\(\\]\|[^]<>`[:cntrl:]]\)\+\ze]" contained "Tag 130*7e6a515eSBram Moolenaar 131*7e6a515eSBram Moolenaarsyn match giftComment "^\s*//.*" contains=giftTodo,giftIdB,giftTagB 132*7e6a515eSBram Moolenaar 133*7e6a515eSBram Moolenaar"----------------------------------------------- 134*7e6a515eSBram Moolenaar" Clusters 135*7e6a515eSBram Moolenaar 136*7e6a515eSBram Moolenaar"Comments and entities (to be escaped) 137*7e6a515eSBram Moolenaarsyn cluster giftCE contains=giftComment,giftS,giftES,giftEN,giftH,giftEH 138*7e6a515eSBram Moolenaar 139*7e6a515eSBram Moolenaar"The above plus format 140*7e6a515eSBram Moolenaarsyn cluster giftCEF contains=@giftCE,giftFormat 141*7e6a515eSBram Moolenaar 142*7e6a515eSBram Moolenaar"The above plus feedback block 143*7e6a515eSBram Moolenaarsyn cluster giftCEFF contains=@giftCEF,giftFB 144*7e6a515eSBram Moolenaar 145*7e6a515eSBram Moolenaar"The above plus weight block 146*7e6a515eSBram Moolenaarsyn cluster giftCEFFW contains=@giftCEFF,giftWeightB 147*7e6a515eSBram Moolenaar 148*7e6a515eSBram Moolenaar"Possible numerical representations 149*7e6a515eSBram Moolenaarsyn cluster giftNums contains=giftNum1,giftNum2,giftNum3 150*7e6a515eSBram Moolenaar 151*7e6a515eSBram Moolenaar"Possible contents of answers 152*7e6a515eSBram Moolenaarsyn cluster giftA contains=giftComment,giftTF,giftWrong,giftRight,giftMatchB,giftFB,giftGFB 153*7e6a515eSBram Moolenaar 154*7e6a515eSBram Moolenaar"Possible contents of numerical answers 155*7e6a515eSBram Moolenaarsyn cluster giftANum contains=giftAnswerNumD,giftComment,@giftNums,giftWrongNum,giftRightNum,giftFB,giftGFB 156*7e6a515eSBram Moolenaar 157*7e6a515eSBram Moolenaar"----------------------------------------------- 158*7e6a515eSBram Moolenaar 159*7e6a515eSBram Moolenaarlet b:current_syntax = "gift" 160*7e6a515eSBram Moolenaar 161*7e6a515eSBram Moolenaar"----------------------------------------------- 162*7e6a515eSBram Moolenaar 163*7e6a515eSBram Moolenaarhi Conceal ctermbg=NONE ctermfg=Blue guibg=NONE guifg=Blue 164*7e6a515eSBram Moolenaarhi Feedback ctermbg=NONE ctermfg=DarkCyan guibg=NONE guifg=DarkCyan 165*7e6a515eSBram Moolenaarhi GFeedback ctermbg=NONE ctermfg=DarkGreen guibg=NONE guifg=DarkGreen 166*7e6a515eSBram Moolenaarhi WeightB ctermbg=NONE ctermfg=DarkYellow guibg=NONE guifg=DarkYellow 167*7e6a515eSBram Moolenaar 168*7e6a515eSBram Moolenaar"----------------------------------------------- 169*7e6a515eSBram Moolenaar 170*7e6a515eSBram Moolenaarhi def link giftS Error 171*7e6a515eSBram Moolenaarhi def link giftES Conceal 172*7e6a515eSBram Moolenaarhi def link giftEN Conceal 173*7e6a515eSBram Moolenaarhi def link giftFormat LineNr 174*7e6a515eSBram Moolenaar 175*7e6a515eSBram Moolenaarhi def link giftH Error 176*7e6a515eSBram Moolenaarhi def link giftEH Conceal 177*7e6a515eSBram Moolenaar 178*7e6a515eSBram Moolenaarhi def link giftFB PreProc 179*7e6a515eSBram Moolenaarhi def link giftF Feedback 180*7e6a515eSBram Moolenaarhi def link giftGFB Title 181*7e6a515eSBram Moolenaarhi def link giftGF GFeedback 182*7e6a515eSBram Moolenaar 183*7e6a515eSBram Moolenaarhi def link giftTF Question 184*7e6a515eSBram Moolenaarhi def link giftNum1 Question 185*7e6a515eSBram Moolenaarhi def link giftNum2 Question 186*7e6a515eSBram Moolenaarhi def link giftNum2D Special 187*7e6a515eSBram Moolenaarhi def link giftNum3 Question 188*7e6a515eSBram Moolenaarhi def link giftNum3D Special 189*7e6a515eSBram Moolenaarhi def link giftWeightB WeightB 190*7e6a515eSBram Moolenaarhi def link giftWeight Identifier 191*7e6a515eSBram Moolenaar 192*7e6a515eSBram Moolenaarhi def link giftWrongNum Constant 193*7e6a515eSBram Moolenaarhi def link giftRightNum Question 194*7e6a515eSBram Moolenaarhi def link giftWrong Constant 195*7e6a515eSBram Moolenaarhi def link giftRight Question 196*7e6a515eSBram Moolenaarhi def link giftMatchB ModeMsg 197*7e6a515eSBram Moolenaarhi def link giftMatch Constant 198*7e6a515eSBram Moolenaar 199*7e6a515eSBram Moolenaarhi def link giftAnswer MoreMsg 200*7e6a515eSBram Moolenaarhi def link giftAnswerNum MoreMsg 201*7e6a515eSBram Moolenaarhi def link giftAnswerNumD Identifier 202*7e6a515eSBram Moolenaar 203*7e6a515eSBram Moolenaarhi def link giftQuestion Identifier 204*7e6a515eSBram Moolenaar 205*7e6a515eSBram Moolenaarhi def link giftName PreProc 206*7e6a515eSBram Moolenaarhi def link giftNameD Directory 207*7e6a515eSBram Moolenaar 208*7e6a515eSBram Moolenaarhi def link giftCategoryB LineNr 209*7e6a515eSBram Moolenaarhi def link giftCategory Directory 210*7e6a515eSBram Moolenaar 211*7e6a515eSBram Moolenaarhi def link giftTodo Todo 212*7e6a515eSBram Moolenaarhi def link giftIdB LineNr 213*7e6a515eSBram Moolenaarhi def link giftId Title 214*7e6a515eSBram Moolenaarhi def link giftTagB LineNr 215*7e6a515eSBram Moolenaarhi def link giftTag Constant 216*7e6a515eSBram Moolenaarhi def link giftComment Comment 217