[ Index ] |
PHP Cross Reference of Joomla 4.2.2 documentation |
[Summary view] [Print] [Text view]
1 // CodeMirror, copyright (c) by Marijn Haverbeke and others 2 // Distributed under an MIT license: https://codemirror.net/5/LICENSE 3 4 (function(mod) { 5 if (typeof exports == "object" && typeof module == "object") // CommonJS 6 mod(require("../../lib/codemirror")); 7 else if (typeof define == "function" && define.amd) // AMD 8 define(["../../lib/codemirror"], mod); 9 else // Plain browser env 10 mod(CodeMirror); 11 })(function(CodeMirror) { 12 "use strict"; 13 14 CodeMirror.defineMode("verilog", function(config, parserConfig) { 15 16 var indentUnit = config.indentUnit, 17 statementIndentUnit = parserConfig.statementIndentUnit || indentUnit, 18 dontAlignCalls = parserConfig.dontAlignCalls, 19 // compilerDirectivesUseRegularIndentation - If set, Compiler directive 20 // indentation follows the same rules as everything else. Otherwise if 21 // false, compiler directives will track their own indentation. 22 // For example, `ifdef nested inside another `ifndef will be indented, 23 // but a `ifdef inside a function block may not be indented. 24 compilerDirectivesUseRegularIndentation = parserConfig.compilerDirectivesUseRegularIndentation, 25 noIndentKeywords = parserConfig.noIndentKeywords || [], 26 multiLineStrings = parserConfig.multiLineStrings, 27 hooks = parserConfig.hooks || {}; 28 29 function words(str) { 30 var obj = {}, words = str.split(" "); 31 for (var i = 0; i < words.length; ++i) obj[words[i]] = true; 32 return obj; 33 } 34 35 /** 36 * Keywords from IEEE 1800-2012 37 */ 38 var keywords = words( 39 "accept_on alias always always_comb always_ff always_latch and assert assign assume automatic before begin bind " + 40 "bins binsof bit break buf bufif0 bufif1 byte case casex casez cell chandle checker class clocking cmos config " + 41 "const constraint context continue cover covergroup coverpoint cross deassign default defparam design disable " + 42 "dist do edge else end endcase endchecker endclass endclocking endconfig endfunction endgenerate endgroup " + 43 "endinterface endmodule endpackage endprimitive endprogram endproperty endspecify endsequence endtable endtask " + 44 "enum event eventually expect export extends extern final first_match for force foreach forever fork forkjoin " + 45 "function generate genvar global highz0 highz1 if iff ifnone ignore_bins illegal_bins implements implies import " + 46 "incdir include initial inout input inside instance int integer interconnect interface intersect join join_any " + 47 "join_none large let liblist library local localparam logic longint macromodule matches medium modport module " + 48 "nand negedge nettype new nexttime nmos nor noshowcancelled not notif0 notif1 null or output package packed " + 49 "parameter pmos posedge primitive priority program property protected pull0 pull1 pulldown pullup " + 50 "pulsestyle_ondetect pulsestyle_onevent pure rand randc randcase randsequence rcmos real realtime ref reg " + 51 "reject_on release repeat restrict return rnmos rpmos rtran rtranif0 rtranif1 s_always s_eventually s_nexttime " + 52 "s_until s_until_with scalared sequence shortint shortreal showcancelled signed small soft solve specify " + 53 "specparam static string strong strong0 strong1 struct super supply0 supply1 sync_accept_on sync_reject_on " + 54 "table tagged task this throughout time timeprecision timeunit tran tranif0 tranif1 tri tri0 tri1 triand trior " + 55 "trireg type typedef union unique unique0 unsigned until until_with untyped use uwire var vectored virtual void " + 56 "wait wait_order wand weak weak0 weak1 while wildcard wire with within wor xnor xor"); 57 58 /** Operators from IEEE 1800-2012 59 unary_operator ::= 60 + | - | ! | ~ | & | ~& | | | ~| | ^ | ~^ | ^~ 61 binary_operator ::= 62 + | - | * | / | % | == | != | === | !== | ==? | !=? | && | || | ** 63 | < | <= | > | >= | & | | | ^ | ^~ | ~^ | >> | << | >>> | <<< 64 | -> | <-> 65 inc_or_dec_operator ::= ++ | -- 66 unary_module_path_operator ::= 67 ! | ~ | & | ~& | | | ~| | ^ | ~^ | ^~ 68 binary_module_path_operator ::= 69 == | != | && | || | & | | | ^ | ^~ | ~^ 70 */ 71 var isOperatorChar = /[\+\-\*\/!~&|^%=?:<>]/; 72 var isBracketChar = /[\[\]{}()]/; 73 74 var unsignedNumber = /\d[0-9_]*/; 75 var decimalLiteral = /\d*\s*'s?d\s*\d[0-9_]*/i; 76 var binaryLiteral = /\d*\s*'s?b\s*[xz01][xz01_]*/i; 77 var octLiteral = /\d*\s*'s?o\s*[xz0-7][xz0-7_]*/i; 78 var hexLiteral = /\d*\s*'s?h\s*[0-9a-fxz?][0-9a-fxz?_]*/i; 79 var realLiteral = /(\d[\d_]*(\.\d[\d_]*)?E-?[\d_]+)|(\d[\d_]*\.\d[\d_]*)/i; 80 81 var closingBracketOrWord = /^((`?\w+)|[)}\]])/; 82 var closingBracket = /[)}\]]/; 83 var compilerDirectiveRegex = new RegExp( 84 "^(`(?:ifdef|ifndef|elsif|else|endif|undef|undefineall|define|include|begin_keywords|celldefine|default|" + 85 "nettype|end_keywords|endcelldefine|line|nounconnected_drive|pragma|resetall|timescale|unconnected_drive))\\b"); 86 var compilerDirectiveBeginRegex = /^(`(?:ifdef|ifndef|elsif|else))\b/; 87 var compilerDirectiveEndRegex = /^(`(?:elsif|else|endif))\b/; 88 89 var curPunc; 90 var curKeyword; 91 92 // Block openings which are closed by a matching keyword in the form of ("end" + keyword) 93 // E.g. "task" => "endtask" 94 var blockKeywords = words( 95 "case checker class clocking config function generate interface module package " + 96 "primitive program property specify sequence table task" 97 ); 98 99 // Opening/closing pairs 100 var openClose = {}; 101 for (var keyword in blockKeywords) { 102 openClose[keyword] = "end" + keyword; 103 } 104 openClose["begin"] = "end"; 105 openClose["casex"] = "endcase"; 106 openClose["casez"] = "endcase"; 107 openClose["do" ] = "while"; 108 openClose["fork" ] = "join;join_any;join_none"; 109 openClose["covergroup"] = "endgroup"; 110 openClose["macro_begin"] = "macro_end"; 111 112 for (var i in noIndentKeywords) { 113 var keyword = noIndentKeywords[i]; 114 if (openClose[keyword]) { 115 openClose[keyword] = undefined; 116 } 117 } 118 119 // Keywords which open statements that are ended with a semi-colon 120 var statementKeywords = words("always always_comb always_ff always_latch assert assign assume else export for foreach forever if import initial repeat while extern typedef"); 121 122 function tokenBase(stream, state) { 123 var ch = stream.peek(), style; 124 if (hooks[ch] && (style = hooks[ch](stream, state)) != false) return style; 125 if (hooks.tokenBase && (style = hooks.tokenBase(stream, state)) != false) 126 return style; 127 128 if (/[,;:\.]/.test(ch)) { 129 curPunc = stream.next(); 130 return null; 131 } 132 if (isBracketChar.test(ch)) { 133 curPunc = stream.next(); 134 return "bracket"; 135 } 136 // Macros (tick-defines) 137 if (ch == '`') { 138 stream.next(); 139 if (stream.eatWhile(/[\w\$_]/)) { 140 var cur = stream.current(); 141 curKeyword = cur; 142 // Macros that end in _begin, are start of block and end with _end 143 if (cur.startsWith("`uvm_") && cur.endsWith("_begin")) { 144 var keywordClose = curKeyword.substr(0,curKeyword.length - 5) + "end"; 145 openClose[cur] = keywordClose; 146 curPunc = "newblock"; 147 } else { 148 stream.eatSpace(); 149 if (stream.peek() == '(') { 150 // Check if this is a block 151 curPunc = "newmacro"; 152 } 153 var withSpace = stream.current(); 154 // Move the stream back before the spaces 155 stream.backUp(withSpace.length - cur.length); 156 } 157 return "def"; 158 } else { 159 return null; 160 } 161 } 162 // System calls 163 if (ch == '$') { 164 stream.next(); 165 if (stream.eatWhile(/[\w\$_]/)) { 166 return "meta"; 167 } else { 168 return null; 169 } 170 } 171 // Time literals 172 if (ch == '#') { 173 stream.next(); 174 stream.eatWhile(/[\d_.]/); 175 return "def"; 176 } 177 // Event 178 if (ch == '@') { 179 stream.next(); 180 stream.eatWhile(/[@]/); 181 return "def"; 182 } 183 // Strings 184 if (ch == '"') { 185 stream.next(); 186 state.tokenize = tokenString(ch); 187 return state.tokenize(stream, state); 188 } 189 // Comments 190 if (ch == "/") { 191 stream.next(); 192 if (stream.eat("*")) { 193 state.tokenize = tokenComment; 194 return tokenComment(stream, state); 195 } 196 if (stream.eat("/")) { 197 stream.skipToEnd(); 198 return "comment"; 199 } 200 stream.backUp(1); 201 } 202 203 // Numeric literals 204 if (stream.match(realLiteral) || 205 stream.match(decimalLiteral) || 206 stream.match(binaryLiteral) || 207 stream.match(octLiteral) || 208 stream.match(hexLiteral) || 209 stream.match(unsignedNumber) || 210 stream.match(realLiteral)) { 211 return "number"; 212 } 213 214 // Operators 215 if (stream.eatWhile(isOperatorChar)) { 216 curPunc = stream.current(); 217 return "meta"; 218 } 219 220 // Keywords / plain variables 221 if (stream.eatWhile(/[\w\$_]/)) { 222 var cur = stream.current(); 223 if (keywords[cur]) { 224 if (openClose[cur]) { 225 curPunc = "newblock"; 226 if (cur === "fork") { 227 // Fork can be a statement instead of block in cases of: 228 // "disable fork;" and "wait fork;" (trailing semicolon) 229 stream.eatSpace() 230 if (stream.peek() == ';') { 231 curPunc = "newstatement"; 232 } 233 stream.backUp(stream.current().length - cur.length); 234 } 235 } 236 if (statementKeywords[cur]) { 237 curPunc = "newstatement"; 238 } 239 curKeyword = cur; 240 return "keyword"; 241 } 242 return "variable"; 243 } 244 245 stream.next(); 246 return null; 247 } 248 249 function tokenString(quote) { 250 return function(stream, state) { 251 var escaped = false, next, end = false; 252 while ((next = stream.next()) != null) { 253 if (next == quote && !escaped) {end = true; break;} 254 escaped = !escaped && next == "\\"; 255 } 256 if (end || !(escaped || multiLineStrings)) 257 state.tokenize = tokenBase; 258 return "string"; 259 }; 260 } 261 262 function tokenComment(stream, state) { 263 var maybeEnd = false, ch; 264 while (ch = stream.next()) { 265 if (ch == "/" && maybeEnd) { 266 state.tokenize = tokenBase; 267 break; 268 } 269 maybeEnd = (ch == "*"); 270 } 271 return "comment"; 272 } 273 274 function Context(indented, column, type, scopekind, align, prev) { 275 this.indented = indented; 276 this.column = column; 277 this.type = type; 278 this.scopekind = scopekind; 279 this.align = align; 280 this.prev = prev; 281 } 282 function pushContext(state, col, type, scopekind) { 283 var indent = state.indented; 284 var c = new Context(indent, col, type, scopekind ? scopekind : "", null, state.context); 285 return state.context = c; 286 } 287 function popContext(state) { 288 var t = state.context.type; 289 if (t == ")" || t == "]" || t == "}") { 290 state.indented = state.context.indented; 291 } 292 return state.context = state.context.prev; 293 } 294 295 function isClosing(text, contextClosing) { 296 if (text == contextClosing) { 297 return true; 298 } else { 299 // contextClosing may be multiple keywords separated by ; 300 var closingKeywords = contextClosing.split(";"); 301 for (var i in closingKeywords) { 302 if (text == closingKeywords[i]) { 303 return true; 304 } 305 } 306 return false; 307 } 308 } 309 310 function isInsideScopeKind(ctx, scopekind) { 311 if (ctx == null) { 312 return false; 313 } 314 if (ctx.scopekind === scopekind) { 315 return true; 316 } 317 return isInsideScopeKind(ctx.prev, scopekind); 318 } 319 320 function buildElectricInputRegEx() { 321 // Reindentation should occur on any bracket char: {}()[] 322 // or on a match of any of the block closing keywords, at 323 // the end of a line 324 var allClosings = []; 325 for (var i in openClose) { 326 if (openClose[i]) { 327 var closings = openClose[i].split(";"); 328 for (var j in closings) { 329 allClosings.push(closings[j]); 330 } 331 } 332 } 333 var re = new RegExp("[{}()\\[\\]]|(" + allClosings.join("|") + ")$"); 334 return re; 335 } 336 337 // Interface 338 return { 339 340 // Regex to force current line to reindent 341 electricInput: buildElectricInputRegEx(), 342 343 startState: function(basecolumn) { 344 var state = { 345 tokenize: null, 346 context: new Context((basecolumn || 0) - indentUnit, 0, "top", "top", false), 347 indented: 0, 348 compilerDirectiveIndented: 0, 349 startOfLine: true 350 }; 351 if (hooks.startState) hooks.startState(state); 352 return state; 353 }, 354 355 token: function(stream, state) { 356 var ctx = state.context; 357 if (stream.sol()) { 358 if (ctx.align == null) ctx.align = false; 359 state.indented = stream.indentation(); 360 state.startOfLine = true; 361 } 362 if (hooks.token) { 363 // Call hook, with an optional return value of a style to override verilog styling. 364 var style = hooks.token(stream, state); 365 if (style !== undefined) { 366 return style; 367 } 368 } 369 if (stream.eatSpace()) return null; 370 curPunc = null; 371 curKeyword = null; 372 var style = (state.tokenize || tokenBase)(stream, state); 373 if (style == "comment" || style == "meta" || style == "variable") { 374 if (((curPunc === "=") || (curPunc === "<=")) && !isInsideScopeKind(ctx, "assignment")) { 375 // '<=' could be nonblocking assignment or lessthan-equals (which shouldn't cause indent) 376 // Search through the context to see if we are already in an assignment. 377 // '=' could be inside port declaration with comma or ')' afterward, or inside for(;;) block. 378 pushContext(state, stream.column() + curPunc.length, "assignment", "assignment"); 379 if (ctx.align == null) ctx.align = true; 380 } 381 return style; 382 } 383 if (ctx.align == null) ctx.align = true; 384 385 var isClosingAssignment = ctx.type == "assignment" && 386 closingBracket.test(curPunc) && ctx.prev && ctx.prev.type === curPunc; 387 if (curPunc == ctx.type || isClosingAssignment) { 388 if (isClosingAssignment) { 389 ctx = popContext(state); 390 } 391 ctx = popContext(state); 392 if (curPunc == ")") { 393 // Handle closing macros, assuming they could have a semicolon or begin/end block inside. 394 if (ctx && (ctx.type === "macro")) { 395 ctx = popContext(state); 396 while (ctx && (ctx.type == "statement" || ctx.type == "assignment")) ctx = popContext(state); 397 } 398 } else if (curPunc == "}") { 399 // Handle closing statements like constraint block: "foreach () {}" which 400 // do not have semicolon at end. 401 if (ctx && (ctx.type === "statement")) { 402 while (ctx && (ctx.type == "statement")) ctx = popContext(state); 403 } 404 } 405 } else if (((curPunc == ";" || curPunc == ",") && (ctx.type == "statement" || ctx.type == "assignment")) || 406 (ctx.type && isClosing(curKeyword, ctx.type))) { 407 ctx = popContext(state); 408 while (ctx && (ctx.type == "statement" || ctx.type == "assignment")) ctx = popContext(state); 409 } else if (curPunc == "{") { 410 pushContext(state, stream.column(), "}"); 411 } else if (curPunc == "[") { 412 pushContext(state, stream.column(), "]"); 413 } else if (curPunc == "(") { 414 pushContext(state, stream.column(), ")"); 415 } else if (ctx && ctx.type == "endcase" && curPunc == ":") { 416 pushContext(state, stream.column(), "statement", "case"); 417 } else if (curPunc == "newstatement") { 418 pushContext(state, stream.column(), "statement", curKeyword); 419 } else if (curPunc == "newblock") { 420 if (curKeyword == "function" && ctx && (ctx.type == "statement" || ctx.type == "endgroup")) { 421 // The 'function' keyword can appear in some other contexts where it actually does not 422 // indicate a function (import/export DPI and covergroup definitions). 423 // Do nothing in this case 424 } else if (curKeyword == "task" && ctx && ctx.type == "statement") { 425 // Same thing for task 426 } else if (curKeyword == "class" && ctx && ctx.type == "statement") { 427 // Same thing for class (e.g. typedef) 428 } else { 429 var close = openClose[curKeyword]; 430 pushContext(state, stream.column(), close, curKeyword); 431 } 432 } else if (curPunc == "newmacro" || (curKeyword && curKeyword.match(compilerDirectiveRegex))) { 433 if (curPunc == "newmacro") { 434 // Macros (especially if they have parenthesis) potentially have a semicolon 435 // or complete statement/block inside, and should be treated as such. 436 pushContext(state, stream.column(), "macro", "macro"); 437 } 438 if (curKeyword.match(compilerDirectiveEndRegex)) { 439 state.compilerDirectiveIndented -= statementIndentUnit; 440 } 441 if (curKeyword.match(compilerDirectiveBeginRegex)) { 442 state.compilerDirectiveIndented += statementIndentUnit; 443 } 444 } 445 446 state.startOfLine = false; 447 return style; 448 }, 449 450 indent: function(state, textAfter) { 451 if (state.tokenize != tokenBase && state.tokenize != null) return CodeMirror.Pass; 452 if (hooks.indent) { 453 var fromHook = hooks.indent(state); 454 if (fromHook >= 0) return fromHook; 455 } 456 var ctx = state.context, firstChar = textAfter && textAfter.charAt(0); 457 if (ctx.type == "statement" && firstChar == "}") ctx = ctx.prev; 458 var closing = false; 459 var possibleClosing = textAfter.match(closingBracketOrWord); 460 if (possibleClosing) 461 closing = isClosing(possibleClosing[0], ctx.type); 462 if (!compilerDirectivesUseRegularIndentation && textAfter.match(compilerDirectiveRegex)) { 463 if (textAfter.match(compilerDirectiveEndRegex)) { 464 return state.compilerDirectiveIndented - statementIndentUnit; 465 } 466 return state.compilerDirectiveIndented; 467 } 468 if (ctx.type == "statement") return ctx.indented + (firstChar == "{" ? 0 : statementIndentUnit); 469 else if ((closingBracket.test(ctx.type) || ctx.type == "assignment") 470 && ctx.align && !dontAlignCalls) return ctx.column + (closing ? 0 : 1); 471 else if (ctx.type == ")" && !closing) return ctx.indented + statementIndentUnit; 472 else return ctx.indented + (closing ? 0 : indentUnit); 473 }, 474 475 blockCommentStart: "/*", 476 blockCommentEnd: "*/", 477 lineComment: "//", 478 fold: "indent" 479 }; 480 }); 481 482 CodeMirror.defineMIME("text/x-verilog", { 483 name: "verilog" 484 }); 485 486 CodeMirror.defineMIME("text/x-systemverilog", { 487 name: "verilog" 488 }); 489 490 491 492 // TL-Verilog mode. 493 // See tl-x.org for language spec. 494 // See the mode in action at makerchip.com. 495 // Contact: [email protected] 496 497 // TLV Identifier prefixes. 498 // Note that sign is not treated separately, so "+/-" versions of numeric identifiers 499 // are included. 500 var tlvIdentifierStyle = { 501 "|": "link", 502 ">": "property", // Should condition this off for > TLV 1c. 503 "$": "variable", 504 "$$": "variable", 505 "?$": "qualifier", 506 "?*": "qualifier", 507 "-": "hr", 508 "/": "property", 509 "/-": "property", 510 "@": "variable-3", 511 "@-": "variable-3", 512 "@++": "variable-3", 513 "@+=": "variable-3", 514 "@+=-": "variable-3", 515 "@--": "variable-3", 516 "@-=": "variable-3", 517 "%+": "tag", 518 "%-": "tag", 519 "%": "tag", 520 ">>": "tag", 521 "<<": "tag", 522 "<>": "tag", 523 "#": "tag", // Need to choose a style for this. 524 "^": "attribute", 525 "^^": "attribute", 526 "^!": "attribute", 527 "*": "variable-2", 528 "**": "variable-2", 529 "\\": "keyword", 530 "\"": "comment" 531 }; 532 533 // Lines starting with these characters define scope (result in indentation). 534 var tlvScopePrefixChars = { 535 "/": "beh-hier", 536 ">": "beh-hier", 537 "-": "phys-hier", 538 "|": "pipe", 539 "?": "when", 540 "@": "stage", 541 "\\": "keyword" 542 }; 543 var tlvIndentUnit = 3; 544 var tlvTrackStatements = false; 545 var tlvIdentMatch = /^([~!@#\$%\^&\*-\+=\?\/\\\|'"<>]+)([\d\w_]*)/; // Matches an identifier. 546 // Note that ':' is excluded, because of it's use in [:]. 547 var tlvFirstLevelIndentMatch = /^[! ] /; 548 var tlvLineIndentationMatch = /^[! ] */; 549 var tlvCommentMatch = /^\/[\/\*]/; 550 551 552 // Returns a style specific to the scope at the given indentation column. 553 // Type is one of: "indent", "scope-ident", "before-scope-ident". 554 function tlvScopeStyle(state, indentation, type) { 555 // Begin scope. 556 var depth = indentation / tlvIndentUnit; // TODO: Pass this in instead. 557 return "tlv-" + state.tlvIndentationStyle[depth] + "-" + type; 558 } 559 560 // Return true if the next thing in the stream is an identifier with a mnemonic. 561 function tlvIdentNext(stream) { 562 var match; 563 return (match = stream.match(tlvIdentMatch, false)) && match[2].length > 0; 564 } 565 566 CodeMirror.defineMIME("text/x-tlv", { 567 name: "verilog", 568 569 hooks: { 570 571 electricInput: false, 572 573 574 // Return undefined for verilog tokenizing, or style for TLV token (null not used). 575 // Standard CM styles are used for most formatting, but some TL-Verilog-specific highlighting 576 // can be enabled with the definition of cm-tlv-* styles, including highlighting for: 577 // - M4 tokens 578 // - TLV scope indentation 579 // - Statement delimitation (enabled by tlvTrackStatements) 580 token: function(stream, state) { 581 var style = undefined; 582 var match; // Return value of pattern matches. 583 584 // Set highlighting mode based on code region (TLV or SV). 585 if (stream.sol() && ! state.tlvInBlockComment) { 586 // Process region. 587 if (stream.peek() == '\\') { 588 style = "def"; 589 stream.skipToEnd(); 590 if (stream.string.match(/\\SV/)) { 591 state.tlvCodeActive = false; 592 } else if (stream.string.match(/\\TLV/)){ 593 state.tlvCodeActive = true; 594 } 595 } 596 // Correct indentation in the face of a line prefix char. 597 if (state.tlvCodeActive && stream.pos == 0 && 598 (state.indented == 0) && (match = stream.match(tlvLineIndentationMatch, false))) { 599 state.indented = match[0].length; 600 } 601 602 // Compute indentation state: 603 // o Auto indentation on next line 604 // o Indentation scope styles 605 var indented = state.indented; 606 var depth = indented / tlvIndentUnit; 607 if (depth <= state.tlvIndentationStyle.length) { 608 // not deeper than current scope 609 610 var blankline = stream.string.length == indented; 611 var chPos = depth * tlvIndentUnit; 612 if (chPos < stream.string.length) { 613 var bodyString = stream.string.slice(chPos); 614 var ch = bodyString[0]; 615 if (tlvScopePrefixChars[ch] && ((match = bodyString.match(tlvIdentMatch)) && 616 tlvIdentifierStyle[match[1]])) { 617 // This line begins scope. 618 // Next line gets indented one level. 619 indented += tlvIndentUnit; 620 // Style the next level of indentation (except non-region keyword identifiers, 621 // which are statements themselves) 622 if (!(ch == "\\" && chPos > 0)) { 623 state.tlvIndentationStyle[depth] = tlvScopePrefixChars[ch]; 624 if (tlvTrackStatements) {state.statementComment = false;} 625 depth++; 626 } 627 } 628 } 629 // Clear out deeper indentation levels unless line is blank. 630 if (!blankline) { 631 while (state.tlvIndentationStyle.length > depth) { 632 state.tlvIndentationStyle.pop(); 633 } 634 } 635 } 636 // Set next level of indentation. 637 state.tlvNextIndent = indented; 638 } 639 640 if (state.tlvCodeActive) { 641 // Highlight as TLV. 642 643 var beginStatement = false; 644 if (tlvTrackStatements) { 645 // This starts a statement if the position is at the scope level 646 // and we're not within a statement leading comment. 647 beginStatement = 648 (stream.peek() != " ") && // not a space 649 (style === undefined) && // not a region identifier 650 !state.tlvInBlockComment && // not in block comment 651 //!stream.match(tlvCommentMatch, false) && // not comment start 652 (stream.column() == state.tlvIndentationStyle.length * tlvIndentUnit); // at scope level 653 if (beginStatement) { 654 if (state.statementComment) { 655 // statement already started by comment 656 beginStatement = false; 657 } 658 state.statementComment = 659 stream.match(tlvCommentMatch, false); // comment start 660 } 661 } 662 663 var match; 664 if (style !== undefined) { 665 // Region line. 666 style += " " + tlvScopeStyle(state, 0, "scope-ident") 667 } else if (((stream.pos / tlvIndentUnit) < state.tlvIndentationStyle.length) && 668 (match = stream.match(stream.sol() ? tlvFirstLevelIndentMatch : /^ /))) { 669 // Indentation 670 style = // make this style distinct from the previous one to prevent 671 // codemirror from combining spans 672 "tlv-indent-" + (((stream.pos % 2) == 0) ? "even" : "odd") + 673 // and style it 674 " " + tlvScopeStyle(state, stream.pos - tlvIndentUnit, "indent"); 675 // Style the line prefix character. 676 if (match[0].charAt(0) == "!") { 677 style += " tlv-alert-line-prefix"; 678 } 679 // Place a class before a scope identifier. 680 if (tlvIdentNext(stream)) { 681 style += " " + tlvScopeStyle(state, stream.pos, "before-scope-ident"); 682 } 683 } else if (state.tlvInBlockComment) { 684 // In a block comment. 685 if (stream.match(/^.*?\*\//)) { 686 // Exit block comment. 687 state.tlvInBlockComment = false; 688 if (tlvTrackStatements && !stream.eol()) { 689 // Anything after comment is assumed to be real statement content. 690 state.statementComment = false; 691 } 692 } else { 693 stream.skipToEnd(); 694 } 695 style = "comment"; 696 } else if ((match = stream.match(tlvCommentMatch)) && !state.tlvInBlockComment) { 697 // Start comment. 698 if (match[0] == "//") { 699 // Line comment. 700 stream.skipToEnd(); 701 } else { 702 // Block comment. 703 state.tlvInBlockComment = true; 704 } 705 style = "comment"; 706 } else if (match = stream.match(tlvIdentMatch)) { 707 // looks like an identifier (or identifier prefix) 708 var prefix = match[1]; 709 var mnemonic = match[2]; 710 if (// is identifier prefix 711 tlvIdentifierStyle.hasOwnProperty(prefix) && 712 // has mnemonic or we're at the end of the line (maybe it hasn't been typed yet) 713 (mnemonic.length > 0 || stream.eol())) { 714 style = tlvIdentifierStyle[prefix]; 715 if (stream.column() == state.indented) { 716 // Begin scope. 717 style += " " + tlvScopeStyle(state, stream.column(), "scope-ident") 718 } 719 } else { 720 // Just swallow one character and try again. 721 // This enables subsequent identifier match with preceding symbol character, which 722 // is legal within a statement. (E.g., !$reset). It also enables detection of 723 // comment start with preceding symbols. 724 stream.backUp(stream.current().length - 1); 725 style = "tlv-default"; 726 } 727 } else if (stream.match(/^\t+/)) { 728 // Highlight tabs, which are illegal. 729 style = "tlv-tab"; 730 } else if (stream.match(/^[\[\]{}\(\);\:]+/)) { 731 // [:], (), {}, ;. 732 style = "meta"; 733 } else if (match = stream.match(/^[mM]4([\+_])?[\w\d_]*/)) { 734 // m4 pre proc 735 style = (match[1] == "+") ? "tlv-m4-plus" : "tlv-m4"; 736 } else if (stream.match(/^ +/)){ 737 // Skip over spaces. 738 if (stream.eol()) { 739 // Trailing spaces. 740 style = "error"; 741 } else { 742 // Non-trailing spaces. 743 style = "tlv-default"; 744 } 745 } else if (stream.match(/^[\w\d_]+/)) { 746 // alpha-numeric token. 747 style = "number"; 748 } else { 749 // Eat the next char w/ no formatting. 750 stream.next(); 751 style = "tlv-default"; 752 } 753 if (beginStatement) { 754 style += " tlv-statement"; 755 } 756 } else { 757 if (stream.match(/^[mM]4([\w\d_]*)/)) { 758 // m4 pre proc 759 style = "tlv-m4"; 760 } 761 } 762 return style; 763 }, 764 765 indent: function(state) { 766 return (state.tlvCodeActive == true) ? state.tlvNextIndent : -1; 767 }, 768 769 startState: function(state) { 770 state.tlvIndentationStyle = []; // Styles to use for each level of indentation. 771 state.tlvCodeActive = true; // True when we're in a TLV region (and at beginning of file). 772 state.tlvNextIndent = -1; // The number of spaces to autoindent the next line if tlvCodeActive. 773 state.tlvInBlockComment = false; // True inside /**/ comment. 774 if (tlvTrackStatements) { 775 state.statementComment = false; // True inside a statement's header comment. 776 } 777 } 778 779 } 780 }); 781 });
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Wed Sep 7 05:41:13 2022 | Chilli.vc Blog - For Webmaster,Blog-Writer,System Admin and Domainer |