Title: [146188] trunk/Source/WebCore
Revision
146188
Author
commit-qu...@webkit.org
Date
2013-03-19 01:07:09 -0700 (Tue, 19 Mar 2013)

Log Message

Web Inspector: [CodeMirror] add smart braces functionality
https://bugs.webkit.org/show_bug.cgi?id=112138

Patch by Andrey Lushnikov <lushni...@chromium.org> on 2013-03-19
Reviewed by Vsevolod Vlasov.

No new tests.

Add closebrackets add-on to codemirror which implements smart braces
functionality and guard this setting with the "Text Editor smart
braces" experiment.

* WebCore.gypi:
* WebCore.vcproj/WebCore.vcproj:
* WebCore.vcxproj/WebCore.vcxproj:
* WebCore.vcxproj/WebCore.vcxproj.filters:
* inspector/front-end/CodeMirrorTextEditor.js:
* inspector/front-end/WebKit.qrc:
* inspector/front-end/cm/closebrackets.js: Added.
(.):

Modified Paths

Added Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (146187 => 146188)


--- trunk/Source/WebCore/ChangeLog	2013-03-19 08:04:41 UTC (rev 146187)
+++ trunk/Source/WebCore/ChangeLog	2013-03-19 08:07:09 UTC (rev 146188)
@@ -1,5 +1,27 @@
 2013-03-19  Andrey Lushnikov  <lushni...@chromium.org>
 
+        Web Inspector: [CodeMirror] add smart braces functionality
+        https://bugs.webkit.org/show_bug.cgi?id=112138
+
+        Reviewed by Vsevolod Vlasov.
+
+        No new tests.
+
+        Add closebrackets add-on to codemirror which implements smart braces
+        functionality and guard this setting with the "Text Editor smart
+        braces" experiment.
+
+        * WebCore.gypi:
+        * WebCore.vcproj/WebCore.vcproj:
+        * WebCore.vcxproj/WebCore.vcxproj:
+        * WebCore.vcxproj/WebCore.vcxproj.filters:
+        * inspector/front-end/CodeMirrorTextEditor.js:
+        * inspector/front-end/WebKit.qrc:
+        * inspector/front-end/cm/closebrackets.js: Added.
+        (.):
+
+2013-03-19  Andrey Lushnikov  <lushni...@chromium.org>
+
         Web Inspector: Avoid forcing text editor resize
         https://bugs.webkit.org/show_bug.cgi?id=112581
 

Modified: trunk/Source/WebCore/WebCore.gypi (146187 => 146188)


--- trunk/Source/WebCore/WebCore.gypi	2013-03-19 08:04:41 UTC (rev 146187)
+++ trunk/Source/WebCore/WebCore.gypi	2013-03-19 08:07:09 UTC (rev 146188)
@@ -5601,6 +5601,7 @@
             'inspector/front-end/cm/codemirror.js',
             'inspector/front-end/cm/css.js',
             'inspector/front-end/cm/htmlmixed.js',
+            'inspector/front-end/cm/closebrackets.js',
             'inspector/front-end/cm/matchbrackets.js',
             'inspector/front-end/cm/_javascript_.js',
             'inspector/front-end/cm/xml.js',

Modified: trunk/Source/WebCore/WebCore.vcproj/WebCore.vcproj (146187 => 146188)


--- trunk/Source/WebCore/WebCore.vcproj/WebCore.vcproj	2013-03-19 08:04:41 UTC (rev 146187)
+++ trunk/Source/WebCore/WebCore.vcproj/WebCore.vcproj	2013-03-19 08:07:09 UTC (rev 146188)
@@ -77506,6 +77506,10 @@
 					>
 				</File>
 				<File
+					RelativePath="..\inspector\front-end\cm\closebrackets.js"
+					>
+				</File>
+				<File
 					RelativePath="..\inspector\front-end\cm\matchbrackets.js"
 					>
 				</File>

Modified: trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj (146187 => 146188)


--- trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj	2013-03-19 08:04:41 UTC (rev 146187)
+++ trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj	2013-03-19 08:07:09 UTC (rev 146188)
@@ -13475,6 +13475,7 @@
     <None Include="..\inspector\front-end\helpScreen.css" />
     <None Include="..\inspector\front-end\HelpScreen.js" />
     <None Include="..\inspector\front-end\cm\htmlmixed.js" />
+    <None Include="..\inspector\front-end\cm\closebrackets.js" />
     <None Include="..\inspector\front-end\cm\matchbrackets.js" />
     <None Include="..\inspector\front-end\ImageView.js" />
     <None Include="..\inspector\front-end\IndexedDBModel.js" />

Modified: trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj.filters (146187 => 146188)


--- trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj.filters	2013-03-19 08:04:41 UTC (rev 146187)
+++ trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj.filters	2013-03-19 08:07:09 UTC (rev 146188)
@@ -14758,6 +14758,9 @@
     <None Include="..\inspector\front-end\cm\htmlmixed.js">
       <Filter>inspector\front-end</Filter>
     </None>
+    <None Include="..\inspector\front-end\cm\closebrackets.js">
+      <Filter>inspector\front-end</Filter>
+    </None>
     <None Include="..\inspector\front-end\cm\matchbrackets.js">
       <Filter>inspector\front-end</Filter>
     </None>

Modified: trunk/Source/WebCore/inspector/front-end/CodeMirrorTextEditor.js (146187 => 146188)


--- trunk/Source/WebCore/inspector/front-end/CodeMirrorTextEditor.js	2013-03-19 08:04:41 UTC (rev 146187)
+++ trunk/Source/WebCore/inspector/front-end/CodeMirrorTextEditor.js	2013-03-19 08:07:09 UTC (rev 146188)
@@ -34,6 +34,7 @@
 importScript("cm/xml.js");
 importScript("cm/htmlmixed.js");
 importScript("cm/matchbrackets.js");
+importScript("cm/closebrackets.js");
 
 /**
  * @constructor
@@ -54,7 +55,8 @@
     this._codeMirror = window.CodeMirror(this.element, {
         lineNumbers: true,
         gutters: ["CodeMirror-linenumbers", "breakpoints"],
-        matchBrackets: true
+        matchBrackets: true,
+        autoCloseBrackets: WebInspector.experimentsSettings.textEditorSmartBraces.isEnabled()
     });
 
     var indent = WebInspector.settings.textEditorIndent.get();

Modified: trunk/Source/WebCore/inspector/front-end/WebKit.qrc (146187 => 146188)


--- trunk/Source/WebCore/inspector/front-end/WebKit.qrc	2013-03-19 08:04:41 UTC (rev 146187)
+++ trunk/Source/WebCore/inspector/front-end/WebKit.qrc	2013-03-19 08:07:09 UTC (rev 146188)
@@ -41,6 +41,7 @@
     <file>cm/codemirror.js</file>
     <file>cm/css.js</file>
     <file>cm/htmlmixed.js</file>
+    <file>cm/closebrackets.js</file>
     <file>cm/matchbrackets.js</file>
     <file>cm/_javascript_.js</file>
     <file>cm/xml.js</file>

Added: trunk/Source/WebCore/inspector/front-end/cm/closebrackets.js (0 => 146188)


--- trunk/Source/WebCore/inspector/front-end/cm/closebrackets.js	                        (rev 0)
+++ trunk/Source/WebCore/inspector/front-end/cm/closebrackets.js	2013-03-19 08:07:09 UTC (rev 146188)
@@ -0,0 +1,52 @@
+(function() {
+  var DEFAULT_BRACKETS = "()[]{}''\"\"";
+  var SPACE_CHAR_REGEX = /\s/;
+
+  CodeMirror.defineOption("autoCloseBrackets", false, function(cm, val, old) {
+    var wasOn = old && old != CodeMirror.Init;
+    if (val && !wasOn)
+      cm.addKeyMap(buildKeymap(typeof val == "string" ? val : DEFAULT_BRACKETS));
+    else if (!val && wasOn)
+      cm.removeKeyMap("autoCloseBrackets");
+  });
+
+  function buildKeymap(pairs) {
+    var map = {
+      name : "autoCloseBrackets",
+      Backspace: function(cm) {
+        if (cm.somethingSelected()) return CodeMirror.Pass;
+        var cur = cm.getCursor(), line = cm.getLine(cur.line);
+        if (cur.ch && cur.ch < line.length &&
+            pairs.indexOf(line.slice(cur.ch - 1, cur.ch + 1)) % 2 == 0)
+          cm.replaceRange("", CodeMirror.Pos(cur.line, cur.ch - 1), CodeMirror.Pos(cur.line, cur.ch + 1));
+        else
+          return CodeMirror.Pass;
+      }
+    };
+    var closingBrackets = [];
+    for (var i = 0; i < pairs.length; i += 2) (function(left, right) {
+      if (left != right) closingBrackets.push(right);
+      function surround(cm) {
+          var selection = cm.getSelection();
+          cm.replaceSelection(left + selection + right);
+      }
+      function maybeOverwrite(cm) {
+        var cur = cm.getCursor(), ahead = cm.getRange(cur, CodeMirror.Pos(cur.line, cur.ch + 1));
+        if (ahead != right || cm.somethingSelected()) return CodeMirror.Pass;
+        else cm.execCommand("goCharRight");
+      }
+      map["'" + left + "'"] = function(cm) {
+        if (cm.somethingSelected()) return surround(cm);
+        if (left == right && maybeOverwrite(cm) != CodeMirror.Pass) return;
+        var cur = cm.getCursor(), ahead = CodeMirror.Pos(cur.line, cur.ch + 1);
+        var line = cm.getLine(cur.line), nextChar = line.charAt(cur.ch);
+        if (line.length == cur.ch || closingBrackets.indexOf(nextChar) >= 0 || SPACE_CHAR_REGEX.test(nextChar))
+          cm.replaceSelection(left + right, {head: ahead, anchor: ahead});
+        else
+          return CodeMirror.Pass;
+      };
+      if (left != right) map["'" + right + "'"] = maybeOverwrite;
+    })(pairs.charAt(i), pairs.charAt(i + 1));
+    return map;
+  }
+})();
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to