Mercurial
comparison third_party/highlight/es/languages/c.js @ 157:2db6253f355d
[ThirdParty] Added highlight library for better readability on blog.
| author | June Park <parkjune1995@gmail.com> |
|---|---|
| date | Tue, 13 Jan 2026 19:18:47 -0800 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 156:cd35e600ae34 | 157:2db6253f355d |
|---|---|
| 1 /*! `c` grammar compiled for Highlight.js 11.11.1 */ | |
| 2 var hljsGrammar = (function () { | |
| 3 'use strict'; | |
| 4 | |
| 5 /* | |
| 6 Language: C | |
| 7 Category: common, system | |
| 8 Website: https://en.wikipedia.org/wiki/C_(programming_language) | |
| 9 */ | |
| 10 | |
| 11 /** @type LanguageFn */ | |
| 12 function c(hljs) { | |
| 13 const regex = hljs.regex; | |
| 14 // added for historic reasons because `hljs.C_LINE_COMMENT_MODE` does | |
| 15 // not include such support nor can we be sure all the grammars depending | |
| 16 // on it would desire this behavior | |
| 17 const C_LINE_COMMENT_MODE = hljs.COMMENT('//', '$', { contains: [ { begin: /\\\n/ } ] }); | |
| 18 const DECLTYPE_AUTO_RE = 'decltype\\(auto\\)'; | |
| 19 const NAMESPACE_RE = '[a-zA-Z_]\\w*::'; | |
| 20 const TEMPLATE_ARGUMENT_RE = '<[^<>]+>'; | |
| 21 const FUNCTION_TYPE_RE = '(' | |
| 22 + DECLTYPE_AUTO_RE + '|' | |
| 23 + regex.optional(NAMESPACE_RE) | |
| 24 + '[a-zA-Z_]\\w*' + regex.optional(TEMPLATE_ARGUMENT_RE) | |
| 25 + ')'; | |
| 26 | |
| 27 | |
| 28 const TYPES = { | |
| 29 className: 'type', | |
| 30 variants: [ | |
| 31 { begin: '\\b[a-z\\d_]*_t\\b' }, | |
| 32 { match: /\batomic_[a-z]{3,6}\b/ } | |
| 33 ] | |
| 34 | |
| 35 }; | |
| 36 | |
| 37 // https://en.cppreference.com/w/cpp/language/escape | |
| 38 // \\ \x \xFF \u2837 \u00323747 \374 | |
| 39 const CHARACTER_ESCAPES = '\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)'; | |
| 40 const STRINGS = { | |
| 41 className: 'string', | |
| 42 variants: [ | |
| 43 { | |
| 44 begin: '(u8?|U|L)?"', | |
| 45 end: '"', | |
| 46 illegal: '\\n', | |
| 47 contains: [ hljs.BACKSLASH_ESCAPE ] | |
| 48 }, | |
| 49 { | |
| 50 begin: '(u8?|U|L)?\'(' + CHARACTER_ESCAPES + "|.)", | |
| 51 end: '\'', | |
| 52 illegal: '.' | |
| 53 }, | |
| 54 hljs.END_SAME_AS_BEGIN({ | |
| 55 begin: /(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/, | |
| 56 end: /\)([^()\\ ]{0,16})"/ | |
| 57 }) | |
| 58 ] | |
| 59 }; | |
| 60 | |
| 61 const NUMBERS = { | |
| 62 className: 'number', | |
| 63 variants: [ | |
| 64 { match: /\b(0b[01']+)/ }, | |
| 65 { match: /(-?)\b([\d']+(\.[\d']*)?|\.[\d']+)((ll|LL|l|L)(u|U)?|(u|U)(ll|LL|l|L)?|f|F|b|B)/ }, | |
| 66 { match: /(-?)\b(0[xX][a-fA-F0-9]+(?:'[a-fA-F0-9]+)*(?:\.[a-fA-F0-9]*(?:'[a-fA-F0-9]*)*)?(?:[pP][-+]?[0-9]+)?(l|L)?(u|U)?)/ }, | |
| 67 { match: /(-?)\b\d+(?:'\d+)*(?:\.\d*(?:'\d*)*)?(?:[eE][-+]?\d+)?/ } | |
| 68 ], | |
| 69 relevance: 0 | |
| 70 }; | |
| 71 | |
| 72 const PREPROCESSOR = { | |
| 73 className: 'meta', | |
| 74 begin: /#\s*[a-z]+\b/, | |
| 75 end: /$/, | |
| 76 keywords: { keyword: | |
| 77 'if else elif endif define undef warning error line ' | |
| 78 + 'pragma _Pragma ifdef ifndef elifdef elifndef include' }, | |
| 79 contains: [ | |
| 80 { | |
| 81 begin: /\\\n/, | |
| 82 relevance: 0 | |
| 83 }, | |
| 84 hljs.inherit(STRINGS, { className: 'string' }), | |
| 85 { | |
| 86 className: 'string', | |
| 87 begin: /<.*?>/ | |
| 88 }, | |
| 89 C_LINE_COMMENT_MODE, | |
| 90 hljs.C_BLOCK_COMMENT_MODE | |
| 91 ] | |
| 92 }; | |
| 93 | |
| 94 const TITLE_MODE = { | |
| 95 className: 'title', | |
| 96 begin: regex.optional(NAMESPACE_RE) + hljs.IDENT_RE, | |
| 97 relevance: 0 | |
| 98 }; | |
| 99 | |
| 100 const FUNCTION_TITLE = regex.optional(NAMESPACE_RE) + hljs.IDENT_RE + '\\s*\\('; | |
| 101 | |
| 102 const C_KEYWORDS = [ | |
| 103 "asm", | |
| 104 "auto", | |
| 105 "break", | |
| 106 "case", | |
| 107 "continue", | |
| 108 "default", | |
| 109 "do", | |
| 110 "else", | |
| 111 "enum", | |
| 112 "extern", | |
| 113 "for", | |
| 114 "fortran", | |
| 115 "goto", | |
| 116 "if", | |
| 117 "inline", | |
| 118 "register", | |
| 119 "restrict", | |
| 120 "return", | |
| 121 "sizeof", | |
| 122 "typeof", | |
| 123 "typeof_unqual", | |
| 124 "struct", | |
| 125 "switch", | |
| 126 "typedef", | |
| 127 "union", | |
| 128 "volatile", | |
| 129 "while", | |
| 130 "_Alignas", | |
| 131 "_Alignof", | |
| 132 "_Atomic", | |
| 133 "_Generic", | |
| 134 "_Noreturn", | |
| 135 "_Static_assert", | |
| 136 "_Thread_local", | |
| 137 // aliases | |
| 138 "alignas", | |
| 139 "alignof", | |
| 140 "noreturn", | |
| 141 "static_assert", | |
| 142 "thread_local", | |
| 143 // not a C keyword but is, for all intents and purposes, treated exactly like one. | |
| 144 "_Pragma" | |
| 145 ]; | |
| 146 | |
| 147 const C_TYPES = [ | |
| 148 "float", | |
| 149 "double", | |
| 150 "signed", | |
| 151 "unsigned", | |
| 152 "int", | |
| 153 "short", | |
| 154 "long", | |
| 155 "char", | |
| 156 "void", | |
| 157 "_Bool", | |
| 158 "_BitInt", | |
| 159 "_Complex", | |
| 160 "_Imaginary", | |
| 161 "_Decimal32", | |
| 162 "_Decimal64", | |
| 163 "_Decimal96", | |
| 164 "_Decimal128", | |
| 165 "_Decimal64x", | |
| 166 "_Decimal128x", | |
| 167 "_Float16", | |
| 168 "_Float32", | |
| 169 "_Float64", | |
| 170 "_Float128", | |
| 171 "_Float32x", | |
| 172 "_Float64x", | |
| 173 "_Float128x", | |
| 174 // modifiers | |
| 175 "const", | |
| 176 "static", | |
| 177 "constexpr", | |
| 178 // aliases | |
| 179 "complex", | |
| 180 "bool", | |
| 181 "imaginary" | |
| 182 ]; | |
| 183 | |
| 184 const KEYWORDS = { | |
| 185 keyword: C_KEYWORDS, | |
| 186 type: C_TYPES, | |
| 187 literal: 'true false NULL', | |
| 188 // TODO: apply hinting work similar to what was done in cpp.js | |
| 189 built_in: 'std string wstring cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream ' | |
| 190 + 'auto_ptr deque list queue stack vector map set pair bitset multiset multimap unordered_set ' | |
| 191 + 'unordered_map unordered_multiset unordered_multimap priority_queue make_pair array shared_ptr abort terminate abs acos ' | |
| 192 + 'asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp ' | |
| 193 + 'fscanf future isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper ' | |
| 194 + 'isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow ' | |
| 195 + 'printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp ' | |
| 196 + 'strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan ' | |
| 197 + 'vfprintf vprintf vsprintf endl initializer_list unique_ptr', | |
| 198 }; | |
| 199 | |
| 200 const EXPRESSION_CONTAINS = [ | |
| 201 PREPROCESSOR, | |
| 202 TYPES, | |
| 203 C_LINE_COMMENT_MODE, | |
| 204 hljs.C_BLOCK_COMMENT_MODE, | |
| 205 NUMBERS, | |
| 206 STRINGS | |
| 207 ]; | |
| 208 | |
| 209 const EXPRESSION_CONTEXT = { | |
| 210 // This mode covers expression context where we can't expect a function | |
| 211 // definition and shouldn't highlight anything that looks like one: | |
| 212 // `return some()`, `else if()`, `(x*sum(1, 2))` | |
| 213 variants: [ | |
| 214 { | |
| 215 begin: /=/, | |
| 216 end: /;/ | |
| 217 }, | |
| 218 { | |
| 219 begin: /\(/, | |
| 220 end: /\)/ | |
| 221 }, | |
| 222 { | |
| 223 beginKeywords: 'new throw return else', | |
| 224 end: /;/ | |
| 225 } | |
| 226 ], | |
| 227 keywords: KEYWORDS, | |
| 228 contains: EXPRESSION_CONTAINS.concat([ | |
| 229 { | |
| 230 begin: /\(/, | |
| 231 end: /\)/, | |
| 232 keywords: KEYWORDS, | |
| 233 contains: EXPRESSION_CONTAINS.concat([ 'self' ]), | |
| 234 relevance: 0 | |
| 235 } | |
| 236 ]), | |
| 237 relevance: 0 | |
| 238 }; | |
| 239 | |
| 240 const FUNCTION_DECLARATION = { | |
| 241 begin: '(' + FUNCTION_TYPE_RE + '[\\*&\\s]+)+' + FUNCTION_TITLE, | |
| 242 returnBegin: true, | |
| 243 end: /[{;=]/, | |
| 244 excludeEnd: true, | |
| 245 keywords: KEYWORDS, | |
| 246 illegal: /[^\w\s\*&:<>.]/, | |
| 247 contains: [ | |
| 248 { // to prevent it from being confused as the function title | |
| 249 begin: DECLTYPE_AUTO_RE, | |
| 250 keywords: KEYWORDS, | |
| 251 relevance: 0 | |
| 252 }, | |
| 253 { | |
| 254 begin: FUNCTION_TITLE, | |
| 255 returnBegin: true, | |
| 256 contains: [ hljs.inherit(TITLE_MODE, { className: "title.function" }) ], | |
| 257 relevance: 0 | |
| 258 }, | |
| 259 // allow for multiple declarations, e.g.: | |
| 260 // extern void f(int), g(char); | |
| 261 { | |
| 262 relevance: 0, | |
| 263 match: /,/ | |
| 264 }, | |
| 265 { | |
| 266 className: 'params', | |
| 267 begin: /\(/, | |
| 268 end: /\)/, | |
| 269 keywords: KEYWORDS, | |
| 270 relevance: 0, | |
| 271 contains: [ | |
| 272 C_LINE_COMMENT_MODE, | |
| 273 hljs.C_BLOCK_COMMENT_MODE, | |
| 274 STRINGS, | |
| 275 NUMBERS, | |
| 276 TYPES, | |
| 277 // Count matching parentheses. | |
| 278 { | |
| 279 begin: /\(/, | |
| 280 end: /\)/, | |
| 281 keywords: KEYWORDS, | |
| 282 relevance: 0, | |
| 283 contains: [ | |
| 284 'self', | |
| 285 C_LINE_COMMENT_MODE, | |
| 286 hljs.C_BLOCK_COMMENT_MODE, | |
| 287 STRINGS, | |
| 288 NUMBERS, | |
| 289 TYPES | |
| 290 ] | |
| 291 } | |
| 292 ] | |
| 293 }, | |
| 294 TYPES, | |
| 295 C_LINE_COMMENT_MODE, | |
| 296 hljs.C_BLOCK_COMMENT_MODE, | |
| 297 PREPROCESSOR | |
| 298 ] | |
| 299 }; | |
| 300 | |
| 301 return { | |
| 302 name: "C", | |
| 303 aliases: [ 'h' ], | |
| 304 keywords: KEYWORDS, | |
| 305 // Until differentiations are added between `c` and `cpp`, `c` will | |
| 306 // not be auto-detected to avoid auto-detect conflicts between C and C++ | |
| 307 disableAutodetect: true, | |
| 308 illegal: '</', | |
| 309 contains: [].concat( | |
| 310 EXPRESSION_CONTEXT, | |
| 311 FUNCTION_DECLARATION, | |
| 312 EXPRESSION_CONTAINS, | |
| 313 [ | |
| 314 PREPROCESSOR, | |
| 315 { | |
| 316 begin: hljs.IDENT_RE + '::', | |
| 317 keywords: KEYWORDS | |
| 318 }, | |
| 319 { | |
| 320 className: 'class', | |
| 321 beginKeywords: 'enum class struct union', | |
| 322 end: /[{;:<>=]/, | |
| 323 contains: [ | |
| 324 { beginKeywords: "final class struct" }, | |
| 325 hljs.TITLE_MODE | |
| 326 ] | |
| 327 } | |
| 328 ]), | |
| 329 exports: { | |
| 330 preprocessor: PREPROCESSOR, | |
| 331 strings: STRINGS, | |
| 332 keywords: KEYWORDS | |
| 333 } | |
| 334 }; | |
| 335 } | |
| 336 | |
| 337 return c; | |
| 338 | |
| 339 })(); | |
| 340 ; | |
| 341 export default hljsGrammar; |