Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(543)

Side by Side Diff: Source/devtools/front_end/CodeMirrorTextEditor.js

Issue 22638008: DevTools: Use CodeMirror modes instead of highlight tokenizers (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: address comments Created 7 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « Source/devtools/devtools.gyp ('k') | Source/devtools/front_end/CodeMirrorUtils.js » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2012 Google Inc. All rights reserved. 2 * Copyright (C) 2012 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 28 matching lines...) Expand all
39 importScript("cm/markselection.js"); 39 importScript("cm/markselection.js");
40 importScript("cm/comment.js"); 40 importScript("cm/comment.js");
41 importScript("cm/overlay.js"); 41 importScript("cm/overlay.js");
42 42
43 importScript("cm/htmlembedded.js"); 43 importScript("cm/htmlembedded.js");
44 importScript("cm/clike.js"); 44 importScript("cm/clike.js");
45 importScript("cm/coffeescript.js"); 45 importScript("cm/coffeescript.js");
46 importScript("cm/php.js"); 46 importScript("cm/php.js");
47 importScript("cm/python.js"); 47 importScript("cm/python.js");
48 importScript("cm/shell.js"); 48 importScript("cm/shell.js");
49 importScript("CodeMirrorUtils.js");
49 50
50 /** 51 /**
51 * @constructor 52 * @constructor
52 * @extends {WebInspector.View} 53 * @extends {WebInspector.View}
53 * @implements {WebInspector.TextEditor} 54 * @implements {WebInspector.TextEditor}
54 * @param {?string} url 55 * @param {?string} url
55 * @param {WebInspector.TextEditorDelegate} delegate 56 * @param {WebInspector.TextEditorDelegate} delegate
56 */ 57 */
57 WebInspector.CodeMirrorTextEditor = function(url, delegate) 58 WebInspector.CodeMirrorTextEditor = function(url, delegate)
58 { 59 {
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
156 this.element.style.overflow = "hidden"; 157 this.element.style.overflow = "hidden";
157 this.element.firstChild.addStyleClass("source-code"); 158 this.element.firstChild.addStyleClass("source-code");
158 this.element.firstChild.addStyleClass("fill"); 159 this.element.firstChild.addStyleClass("fill");
159 this._elementToWidget = new Map(); 160 this._elementToWidget = new Map();
160 this._nestedUpdatesCounter = 0; 161 this._nestedUpdatesCounter = 0;
161 162
162 this.element.addEventListener("focus", this._handleElementFocus.bind(this), false); 163 this.element.addEventListener("focus", this._handleElementFocus.bind(this), false);
163 this.element.addEventListener("keydown", this._handleKeyDown.bind(this), tru e); 164 this.element.addEventListener("keydown", this._handleKeyDown.bind(this), tru e);
164 this.element.tabIndex = 0; 165 this.element.tabIndex = 0;
165 166
166 this._overrideModeWithPrefixedTokens("css-base", "css-");
167 this._overrideModeWithPrefixedTokens("javascript", "js-");
168 this._overrideModeWithPrefixedTokens("xml", "xml-");
169
170 this._setupSelectionColor(); 167 this._setupSelectionColor();
171 this._setupWhitespaceHighlight(); 168 this._setupWhitespaceHighlight();
172 } 169 }
173 170
174 WebInspector.CodeMirrorTextEditor.autocompleteCommand = function(codeMirror) 171 WebInspector.CodeMirrorTextEditor.autocompleteCommand = function(codeMirror)
175 { 172 {
176 codeMirror._codeMirrorTextEditor._autocompleteController.autocomplete(); 173 codeMirror._codeMirrorTextEditor._autocompleteController.autocomplete();
177 } 174 }
178 CodeMirror.commands.autocomplete = WebInspector.CodeMirrorTextEditor.autocomplet eCommand; 175 CodeMirror.commands.autocomplete = WebInspector.CodeMirrorTextEditor.autocomplet eCommand;
179 176
(...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after
446 if (!element || !element.isSelfOrDescendant(this._codeMirror.getWrapperE lement())) 443 if (!element || !element.isSelfOrDescendant(this._codeMirror.getWrapperE lement()))
447 return null; 444 return null;
448 var gutterBox = this._codeMirror.getGutterElement().boxInWindow(); 445 var gutterBox = this._codeMirror.getGutterElement().boxInWindow();
449 if (x >= gutterBox.x && x <= gutterBox.x + gutterBox.width && 446 if (x >= gutterBox.x && x <= gutterBox.x + gutterBox.width &&
450 y >= gutterBox.y && y <= gutterBox.y + gutterBox.height) 447 y >= gutterBox.y && y <= gutterBox.y + gutterBox.height)
451 return null; 448 return null;
452 var coords = this._codeMirror.coordsChar({left: x, top: y}); 449 var coords = this._codeMirror.coordsChar({left: x, top: y});
453 return this._toRange(coords, coords); 450 return this._toRange(coords, coords);
454 }, 451 },
455 452
456 _convertTokenType: function(tokenType)
457 {
458 if (tokenType.startsWith("js-variable") || tokenType.startsWith("js-prop erty") || tokenType === "js-def")
459 return "javascript-ident";
460 if (tokenType === "js-string-2")
461 return "javascript-regexp";
462 if (tokenType === "js-number" || tokenType === "js-comment" || tokenType === "js-string" || tokenType === "js-keyword")
463 return "javascript-" + tokenType.substring("js-".length);
464 return null;
465 },
466
467 /** 453 /**
468 * @param {number} lineNumber 454 * @param {number} lineNumber
469 * @param {number} column 455 * @param {number} column
470 * @return {?{startColumn: number, endColumn: number, type: string}} 456 * @return {?{startColumn: number, endColumn: number, type: string}}
471 */ 457 */
472 tokenAtTextPosition: function(lineNumber, column) 458 tokenAtTextPosition: function(lineNumber, column)
473 { 459 {
474 if (lineNumber < 0 || lineNumber >= this._codeMirror.lineCount()) 460 if (lineNumber < 0 || lineNumber >= this._codeMirror.lineCount())
475 return null; 461 return null;
476 var token = this._codeMirror.getTokenAt(new CodeMirror.Pos(lineNumber, ( column || 0) + 1)); 462 var token = this._codeMirror.getTokenAt(new CodeMirror.Pos(lineNumber, ( column || 0) + 1));
477 if (!token || !token.type) 463 if (!token || !token.type)
478 return null; 464 return null;
479 var convertedType = this._convertTokenType(token.type); 465 var convertedType = WebInspector.CodeMirrorUtils.convertTokenType(token. type);
480 if (!convertedType) 466 if (!convertedType)
481 return null; 467 return null;
482 return { 468 return {
483 startColumn: token.start, 469 startColumn: token.start,
484 endColumn: token.end - 1, 470 endColumn: token.end - 1,
485 type: convertedType 471 type: convertedType
486 }; 472 };
487 }, 473 },
488 474
489 /** 475 /**
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
550 } 536 }
551 var whitespaceMode = { 537 var whitespaceMode = {
552 token: nextToken 538 token: nextToken
553 }; 539 };
554 return CodeMirror.overlayMode(CodeMirror.getMode(config, mimeType), whitespaceMode, false); 540 return CodeMirror.overlayMode(CodeMirror.getMode(config, mimeType), whitespaceMode, false);
555 } 541 }
556 CodeMirror.defineMode(modeName, modeConstructor); 542 CodeMirror.defineMode(modeName, modeConstructor);
557 return modeName; 543 return modeName;
558 }, 544 },
559 545
560 /**
561 * @param {string} modeName
562 * @param {string} tokenPrefix
563 */
564 _overrideModeWithPrefixedTokens: function(modeName, tokenPrefix)
565 {
566 var oldModeName = modeName + "-old";
567 if (CodeMirror.modes[oldModeName])
568 return;
569
570 CodeMirror.defineMode(oldModeName, CodeMirror.modes[modeName]);
571 CodeMirror.defineMode(modeName, modeConstructor);
572
573 function modeConstructor(config, parserConfig)
574 {
575 var innerConfig = {};
576 for (var i in parserConfig)
577 innerConfig[i] = parserConfig[i];
578 innerConfig.name = oldModeName;
579 var codeMirrorMode = CodeMirror.getMode(config, innerConfig);
580 codeMirrorMode.name = modeName;
581 codeMirrorMode.token = tokenOverride.bind(this, codeMirrorMode.token );
582 return codeMirrorMode;
583 }
584
585 function tokenOverride(superToken, stream, state)
586 {
587 var token = superToken(stream, state);
588 return token ? tokenPrefix + token : token;
589 }
590 },
591
592 _enableLongLinesMode: function() 546 _enableLongLinesMode: function()
593 { 547 {
594 this._codeMirror.setOption("styleSelectedText", false); 548 this._codeMirror.setOption("styleSelectedText", false);
595 this._longLinesMode = true; 549 this._longLinesMode = true;
596 }, 550 },
597 551
598 _disableLongLinesMode: function() 552 _disableLongLinesMode: function()
599 { 553 {
600 this._codeMirror.setOption("styleSelectedText", true); 554 this._codeMirror.setOption("styleSelectedText", true);
601 this._longLinesMode = false; 555 this._longLinesMode = false;
(...skipping 1002 matching lines...) Expand 10 before | Expand all | Expand 10 after
1604 * @param {number} line 1558 * @param {number} line
1605 * @param {number} column 1559 * @param {number} column
1606 * @return {AnchorBox} 1560 * @return {AnchorBox}
1607 */ 1561 */
1608 _anchorBoxForPosition: function(line, column) 1562 _anchorBoxForPosition: function(line, column)
1609 { 1563 {
1610 var metrics = this._textEditor.cursorPositionToCoordinates(line, column) ; 1564 var metrics = this._textEditor.cursorPositionToCoordinates(line, column) ;
1611 return metrics ? new AnchorBox(metrics.x, metrics.y, 0, metrics.height) : null; 1565 return metrics ? new AnchorBox(metrics.x, metrics.y, 0, metrics.height) : null;
1612 }, 1566 },
1613 } 1567 }
OLDNEW
« no previous file with comments | « Source/devtools/devtools.gyp ('k') | Source/devtools/front_end/CodeMirrorUtils.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698