json.jsf (3590B)
1 # JSON highlighter per json.org 2 3 # Written by Rebecca Turner (@ReBecaOrg) 4 5 # Define colors 6 7 =Idle 8 =Comma 9 =PairSep 10 =Bracket magenta 11 =Brace magenta 12 =Number cyan 13 =String cyan 14 =StringEscape cyan bold 15 =Boolean cyan 16 =Null cyan 17 18 =Bad red bold inverse # Syntax errors detected by the highlighter 19 20 =ERROR bold yellow bg_red # Errors in the highlighter itself 21 22 :json Idle 23 * end noeat call=.value() 24 " \t\n" json 25 26 :end Idle 27 * endBAD noeat 28 " \t\n" end 29 30 :endBAD Bad 31 * end 32 33 .subr value 34 35 :value Idle 36 * valueBAD noeat 37 "\"" end noeat call=.string() 38 "-0-9" end noeat call=.number() 39 "tfn" end noeat call=.bareword() 40 "{" end noeat call=.object() 41 "[" end noeat call=.array() 42 43 :valueBAD Bad 44 * value 45 46 :end Idle 47 * NULL noeat return 48 49 .end 50 51 .subr object 52 53 :object Brace 54 * objectBAD noeat 55 "{" maybeempty 56 57 :objectBAD ERROR 58 * end 59 60 :maybeempty Brace 61 * key noeat 62 " \t\n" maybeempty 63 "}" end recolor=-1 64 65 :key Idle 66 * keyBAD noeat 67 "\"" pairsep noeat call=.string() 68 " \t\n" key 69 70 :keyBAD Bad 71 * key 72 73 :pairsep PairSep 74 * pairsepBAD noeat 75 ":" value 76 " \t\n" pairsep 77 78 :pairsepBAD Bad 79 * pairsep 80 81 :value Idle 82 * nextpair noeat call=.value() 83 " \t\n" value 84 85 :nextpair Comma 86 * nextpairBAD noeat 87 "}" end recolor=-1 88 "," key 89 " \t\n" nextpair 90 91 :nextpairBAD Bad 92 * nextpair 93 94 :end Brace 95 * NULL noeat return 96 .end 97 98 .subr array 99 100 :array Bracket 101 * arrayBAD noeat 102 "[" maybeempty 103 104 :arrayBAD ERROR 105 * end 106 107 :maybeempty Bracket 108 * value noeat 109 " \t\n" maybeempty 110 "]" end recolor=-1 111 112 :value Idle 113 * nextvalue noeat call=.value() 114 " \t\n" value 115 116 :nextvalue Comma 117 * nextvalueBAD noeat 118 "]" end recolor=-1 119 "," value 120 " \t\n" nextvalue 121 122 :nextvalueBAD Bad 123 * nextvalue 124 125 :end Bracket 126 * NULL noeat return 127 128 .end 129 130 .subr string 131 132 :string String 133 * stringBAD noeat 134 "\"" body 135 136 :stringBAD ERROR 137 * end 138 139 :body String 140 * body 141 "\"" end 142 "\\" escape recolor=-1 143 144 :escape StringEscape 145 * escapeBAD recolor=-2 noeat 146 "\"/bfnrt\\" body 147 "u" unicode1 148 149 :escapeBAD Bad 150 * body 151 152 :unicode1 StringEscape 153 * unicodeBAD recolor=-3 noeat 154 "0-9a-fA-F" unicode2 155 156 :unicode2 StringEscape 157 * unicodeBAD recolor=-4 noeat 158 "0-9a-fA-F" unicode3 159 160 :unicode3 StringEscape 161 * unicodeBAD recolor=-5 noeat 162 "0-9a-fA-F" unicode4 163 164 :unicode4 StringEscape 165 * unicodeBAD recolor=-6 noeat 166 "0-9a-fA-F" body 167 168 :unicodeBAD Bad 169 * body 170 171 :end Idle 172 * NULL noeat return 173 174 .end 175 176 .subr bareword 177 178 :bareword Idle 179 * body noeat mark buffer 180 181 :body Bad 182 * end noeat markend strings 183 "true" boolean 184 "false" boolean 185 "null" null 186 187 done 188 "truefalsn" body 189 190 :boolean Boolean 191 * end noeat 192 193 :null Null 194 * end noeat 195 196 :end Idle 197 * NULL noeat return 198 199 .end 200 201 .subr number 202 203 :number Number 204 * numberBAD 205 "0-9" numberA noeat 206 "-" numberA 207 208 :numberBAD ERROR 209 * end 210 211 :numberA Number 212 "0" decimalpoint 213 "1-9" integer 214 215 :integer Number 216 * end noeat 217 "0-9" integer 218 "." decimalpoint 219 "eE" exponentpart 220 221 :decimalpoint Number 222 * end noeat 223 "0-9" decimalpointBAD 224 "eE" exponentpart 225 "." decimalpart 226 227 :decimalpointBAD Bad 228 * end 229 230 :decimalpart Number 231 * decimalpartBAD 232 "0-9" decimalpartA 233 234 :decimalpartBAD Bad 235 * end 236 237 :decimalpartA Number 238 * end noeat 239 "0-9" decimalpartA 240 "eE" exponentpart 241 242 :exponentpart Number 243 * exponentpartBAD 244 "-+" exponentpartA 245 "0-9" exponentpartB 246 247 :exponentpartBAD Bad 248 * end 249 250 :exponentpartA Number 251 * exponentpartBAD 252 "0-9" exponentpartB 253 254 :exponentpartB Number 255 * end noeat 256 "0-9" exponentpartB 257 258 :end Idle 259 * NULL noeat return 260 261 .end