ace-rails-ap 3.0.1 → 3.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (101) hide show
  1. checksums.yaml +4 -4
  2. data/lib/ace/rails/version.rb +1 -1
  3. data/vendor/assets/javascripts/ace/ace.js +210 -161
  4. data/vendor/assets/javascripts/ace/ext-beautify.js +0 -1
  5. data/vendor/assets/javascripts/ace/ext-chromevox.js +0 -1
  6. data/vendor/assets/javascripts/ace/ext-elastic_tabstops_lite.js +0 -1
  7. data/vendor/assets/javascripts/ace/ext-emmet.js +66 -48
  8. data/vendor/assets/javascripts/ace/ext-keybinding_menu.js +9 -19
  9. data/vendor/assets/javascripts/ace/ext-language_tools.js +108 -10
  10. data/vendor/assets/javascripts/ace/ext-linking.js +0 -1
  11. data/vendor/assets/javascripts/ace/ext-modelist.js +4 -1
  12. data/vendor/assets/javascripts/ace/ext-old_ie.js +23 -2
  13. data/vendor/assets/javascripts/ace/ext-searchbox.js +23 -2
  14. data/vendor/assets/javascripts/ace/ext-settings_menu.js +10 -1
  15. data/vendor/assets/javascripts/ace/ext-spellcheck.js +0 -1
  16. data/vendor/assets/javascripts/ace/ext-split.js +0 -1
  17. data/vendor/assets/javascripts/ace/ext-static_highlight.js +0 -1
  18. data/vendor/assets/javascripts/ace/ext-statusbar.js +2 -4
  19. data/vendor/assets/javascripts/ace/ext-textarea.js +0 -1
  20. data/vendor/assets/javascripts/ace/ext-themelist.js +0 -1
  21. data/vendor/assets/javascripts/ace/ext-whitespace.js +0 -1
  22. data/vendor/assets/javascripts/ace/keybinding-emacs.js +159 -50
  23. data/vendor/assets/javascripts/ace/mode-autohotkey.js +1 -1
  24. data/vendor/assets/javascripts/ace/mode-c_cpp.js +32 -14
  25. data/vendor/assets/javascripts/ace/mode-coffee.js +1 -1
  26. data/vendor/assets/javascripts/ace/mode-coldfusion.js +62 -24
  27. data/vendor/assets/javascripts/ace/mode-csharp.js +14 -8
  28. data/vendor/assets/javascripts/ace/mode-css.js +2 -2
  29. data/vendor/assets/javascripts/ace/mode-curly.js +62 -24
  30. data/vendor/assets/javascripts/ace/mode-d.js +13 -7
  31. data/vendor/assets/javascripts/ace/mode-dart.js +32 -14
  32. data/vendor/assets/javascripts/ace/mode-django.js +62 -24
  33. data/vendor/assets/javascripts/ace/mode-dockerfile.js +3 -3
  34. data/vendor/assets/javascripts/ace/mode-dot.js +12 -6
  35. data/vendor/assets/javascripts/ace/mode-ejs.js +126 -27
  36. data/vendor/assets/javascripts/ace/mode-elixir.js +493 -0
  37. data/vendor/assets/javascripts/ace/mode-elm.js +248 -0
  38. data/vendor/assets/javascripts/ace/mode-forth.js +1 -1
  39. data/vendor/assets/javascripts/ace/mode-ftl.js +20 -10
  40. data/vendor/assets/javascripts/ace/mode-gitignore.js +1 -0
  41. data/vendor/assets/javascripts/ace/mode-glsl.js +32 -14
  42. data/vendor/assets/javascripts/ace/mode-golang.js +14 -8
  43. data/vendor/assets/javascripts/ace/mode-groovy.js +22 -12
  44. data/vendor/assets/javascripts/ace/mode-haml.js +64 -3
  45. data/vendor/assets/javascripts/ace/mode-handlebars.js +72 -34
  46. data/vendor/assets/javascripts/ace/mode-haxe.js +14 -8
  47. data/vendor/assets/javascripts/ace/mode-html.js +62 -24
  48. data/vendor/assets/javascripts/ace/mode-html_ruby.js +126 -27
  49. data/vendor/assets/javascripts/ace/mode-jack.js +2 -2
  50. data/vendor/assets/javascripts/ace/mode-jade.js +21 -11
  51. data/vendor/assets/javascripts/ace/mode-java.js +22 -12
  52. data/vendor/assets/javascripts/ace/mode-javascript.js +22 -12
  53. data/vendor/assets/javascripts/ace/mode-json.js +2 -2
  54. data/vendor/assets/javascripts/ace/mode-jsoniq.js +47 -1835
  55. data/vendor/assets/javascripts/ace/mode-jsp.js +22 -12
  56. data/vendor/assets/javascripts/ace/mode-jsx.js +14 -8
  57. data/vendor/assets/javascripts/ace/mode-less.js +2 -2
  58. data/vendor/assets/javascripts/ace/mode-liquid.js +20 -10
  59. data/vendor/assets/javascripts/ace/mode-logiql.js +2 -2
  60. data/vendor/assets/javascripts/ace/mode-lsl.js +2 -2
  61. data/vendor/assets/javascripts/ace/mode-luapage.js +62 -24
  62. data/vendor/assets/javascripts/ace/mode-markdown.js +62 -24
  63. data/vendor/assets/javascripts/ace/mode-mel.js +2 -2
  64. data/vendor/assets/javascripts/ace/mode-mysql.js +12 -6
  65. data/vendor/assets/javascripts/ace/mode-nix.js +32 -14
  66. data/vendor/assets/javascripts/ace/mode-objectivec.js +30 -12
  67. data/vendor/assets/javascripts/ace/mode-pgsql.js +20 -10
  68. data/vendor/assets/javascripts/ace/mode-php.js +1126 -40
  69. data/vendor/assets/javascripts/ace/mode-powershell.js +2 -2
  70. data/vendor/assets/javascripts/ace/mode-protobuf.js +32 -14
  71. data/vendor/assets/javascripts/ace/mode-rhtml.js +62 -24
  72. data/vendor/assets/javascripts/ace/mode-ruby.js +66 -5
  73. data/vendor/assets/javascripts/ace/mode-rust.js +36 -3
  74. data/vendor/assets/javascripts/ace/mode-scad.js +14 -8
  75. data/vendor/assets/javascripts/ace/mode-scala.js +22 -12
  76. data/vendor/assets/javascripts/ace/mode-scss.js +2 -2
  77. data/vendor/assets/javascripts/ace/mode-sh.js +2 -2
  78. data/vendor/assets/javascripts/ace/mode-sjs.js +22 -12
  79. data/vendor/assets/javascripts/ace/mode-smarty.js +62 -24
  80. data/vendor/assets/javascripts/ace/mode-soy_template.js +63 -25
  81. data/vendor/assets/javascripts/ace/mode-stylus.js +4 -1
  82. data/vendor/assets/javascripts/ace/mode-svg.js +62 -24
  83. data/vendor/assets/javascripts/ace/mode-textile.js +1 -0
  84. data/vendor/assets/javascripts/ace/mode-twig.js +62 -24
  85. data/vendor/assets/javascripts/ace/mode-typescript.js +22 -12
  86. data/vendor/assets/javascripts/ace/mode-vala.js +2 -2
  87. data/vendor/assets/javascripts/ace/mode-velocity.js +62 -24
  88. data/vendor/assets/javascripts/ace/mode-xml.js +40 -12
  89. data/vendor/assets/javascripts/ace/mode-xquery.js +47 -1835
  90. data/vendor/assets/javascripts/ace/theme-cobalt.js +1 -1
  91. data/vendor/assets/javascripts/ace/theme-idle_fingers.js +1 -1
  92. data/vendor/assets/javascripts/ace/theme-tomorrow_night_bright.js +2 -2
  93. data/vendor/assets/javascripts/ace/worker-coffee.js +15 -5
  94. data/vendor/assets/javascripts/ace/worker-css.js +15 -5
  95. data/vendor/assets/javascripts/ace/worker-html.js +15 -5
  96. data/vendor/assets/javascripts/ace/worker-javascript.js +15 -5
  97. data/vendor/assets/javascripts/ace/worker-json.js +17 -6
  98. data/vendor/assets/javascripts/ace/worker-lua.js +15 -5
  99. data/vendor/assets/javascripts/ace/worker-php.js +15 -5
  100. data/vendor/assets/javascripts/ace/worker-xquery.js +15 -5
  101. metadata +4 -2
@@ -120,11 +120,11 @@ var SAFE_INSERT_BEFORE_TOKENS =
120
120
  ["text", "paren.rparen", "punctuation.operator", "comment"];
121
121
 
122
122
  var context;
123
- var contextCache = {}
123
+ var contextCache = {};
124
124
  var initContext = function(editor) {
125
125
  var id = -1;
126
126
  if (editor.multiSelect) {
127
- id = editor.selection.id;
127
+ id = editor.selection.index;
128
128
  if (contextCache.rangeCount != editor.multiSelect.rangeCount)
129
129
  contextCache = {rangeCount: editor.multiSelect.rangeCount};
130
130
  }
@@ -2083,11 +2083,11 @@ var SAFE_INSERT_BEFORE_TOKENS =
2083
2083
  ["text", "paren.rparen", "punctuation.operator", "comment"];
2084
2084
 
2085
2085
  var context;
2086
- var contextCache = {}
2086
+ var contextCache = {};
2087
2087
  var initContext = function(editor) {
2088
2088
  var id = -1;
2089
2089
  if (editor.multiSelect) {
2090
- id = editor.selection.id;
2090
+ id = editor.selection.index;
2091
2091
  if (contextCache.rangeCount != editor.multiSelect.rangeCount)
2092
2092
  contextCache = {rangeCount: editor.multiSelect.rangeCount};
2093
2093
  }
@@ -2427,12 +2427,13 @@ oop.inherits(CstyleBehaviour, Behaviour);
2427
2427
  exports.CstyleBehaviour = CstyleBehaviour;
2428
2428
  });
2429
2429
 
2430
- define("ace/mode/behaviour/xml",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator"], function(require, exports, module) {
2430
+ define("ace/mode/behaviour/xml",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"], function(require, exports, module) {
2431
2431
  "use strict";
2432
2432
 
2433
2433
  var oop = require("../../lib/oop");
2434
2434
  var Behaviour = require("../behaviour").Behaviour;
2435
2435
  var TokenIterator = require("../../token_iterator").TokenIterator;
2436
+ var lang = require("../../lib/lang");
2436
2437
 
2437
2438
  function is(token, type) {
2438
2439
  return token.type.lastIndexOf(type + ".xml") > -1;
@@ -2530,29 +2531,56 @@ var XmlBehaviour = function () {
2530
2531
  return;
2531
2532
 
2532
2533
  return {
2533
- text: '>' + '</' + element + '>',
2534
+ text: ">" + "</" + element + ">",
2534
2535
  selection: [1, 1]
2535
2536
  };
2536
2537
  }
2537
2538
  });
2538
2539
 
2539
- this.add('autoindent', 'insertion', function (state, action, editor, session, text) {
2540
+ this.add("autoindent", "insertion", function (state, action, editor, session, text) {
2540
2541
  if (text == "\n") {
2541
2542
  var cursor = editor.getCursorPosition();
2542
2543
  var line = session.getLine(cursor.row);
2543
- var rightChars = line.substring(cursor.column, cursor.column + 2);
2544
- if (rightChars == '</') {
2545
- var next_indent = this.$getIndent(line);
2546
- var indent = next_indent + session.getTabString();
2544
+ var iterator = new TokenIterator(session, cursor.row, cursor.column);
2545
+ var token = iterator.getCurrentToken();
2547
2546
 
2548
- return {
2549
- text: '\n' + indent + '\n' + next_indent,
2550
- selection: [1, indent.length, 1, indent.length]
2551
- };
2547
+ if (token && token.type.indexOf("tag-close") !== -1) {
2548
+ while (token && token.type.indexOf("tag-name") === -1) {
2549
+ token = iterator.stepBackward();
2550
+ }
2551
+
2552
+ if (!token) {
2553
+ return;
2554
+ }
2555
+
2556
+ var tag = token.value;
2557
+ var row = iterator.getCurrentTokenRow();
2558
+ token = iterator.stepBackward();
2559
+ if (!token || token.type.indexOf("end-tag") !== -1) {
2560
+ return;
2561
+ }
2562
+
2563
+ if (this.voidElements && !this.voidElements[tag]) {
2564
+ var nextToken = session.getTokenAt(cursor.row, cursor.column+1);
2565
+ var line = session.getLine(row);
2566
+ var nextIndent = this.$getIndent(line);
2567
+ var indent = nextIndent + session.getTabString();
2568
+
2569
+ if (nextToken && nextToken.value === "</") {
2570
+ return {
2571
+ text: "\n" + indent + "\n" + nextIndent,
2572
+ selection: [1, indent.length, 1, indent.length]
2573
+ };
2574
+ } else {
2575
+ return {
2576
+ text: "\n" + indent
2577
+ };
2578
+ }
2579
+ }
2552
2580
  }
2553
2581
  }
2554
2582
  });
2555
-
2583
+
2556
2584
  };
2557
2585
 
2558
2586
  oop.inherits(XmlBehaviour, Behaviour);
@@ -2719,1824 +2747,7 @@ oop.inherits(FoldMode, BaseFoldMode);
2719
2747
 
2720
2748
  });
2721
2749
 
2722
- define("ace/snippets",["require","exports","module","ace/lib/oop","ace/lib/event_emitter","ace/lib/lang","ace/range","ace/anchor","ace/keyboard/hash_handler","ace/tokenizer","ace/lib/dom","ace/editor"], function(require, exports, module) {
2723
- "use strict";
2724
- var oop = require("./lib/oop");
2725
- var EventEmitter = require("./lib/event_emitter").EventEmitter;
2726
- var lang = require("./lib/lang");
2727
- var Range = require("./range").Range;
2728
- var Anchor = require("./anchor").Anchor;
2729
- var HashHandler = require("./keyboard/hash_handler").HashHandler;
2730
- var Tokenizer = require("./tokenizer").Tokenizer;
2731
- var comparePoints = Range.comparePoints;
2732
-
2733
- var SnippetManager = function() {
2734
- this.snippetMap = {};
2735
- this.snippetNameMap = {};
2736
- };
2737
-
2738
- (function() {
2739
- oop.implement(this, EventEmitter);
2740
-
2741
- this.getTokenizer = function() {
2742
- function TabstopToken(str, _, stack) {
2743
- str = str.substr(1);
2744
- if (/^\d+$/.test(str) && !stack.inFormatString)
2745
- return [{tabstopId: parseInt(str, 10)}];
2746
- return [{text: str}];
2747
- }
2748
- function escape(ch) {
2749
- return "(?:[^\\\\" + ch + "]|\\\\.)";
2750
- }
2751
- SnippetManager.$tokenizer = new Tokenizer({
2752
- start: [
2753
- {regex: /:/, onMatch: function(val, state, stack) {
2754
- if (stack.length && stack[0].expectIf) {
2755
- stack[0].expectIf = false;
2756
- stack[0].elseBranch = stack[0];
2757
- return [stack[0]];
2758
- }
2759
- return ":";
2760
- }},
2761
- {regex: /\\./, onMatch: function(val, state, stack) {
2762
- var ch = val[1];
2763
- if (ch == "}" && stack.length) {
2764
- val = ch;
2765
- }else if ("`$\\".indexOf(ch) != -1) {
2766
- val = ch;
2767
- } else if (stack.inFormatString) {
2768
- if (ch == "n")
2769
- val = "\n";
2770
- else if (ch == "t")
2771
- val = "\n";
2772
- else if ("ulULE".indexOf(ch) != -1) {
2773
- val = {changeCase: ch, local: ch > "a"};
2774
- }
2775
- }
2776
-
2777
- return [val];
2778
- }},
2779
- {regex: /}/, onMatch: function(val, state, stack) {
2780
- return [stack.length ? stack.shift() : val];
2781
- }},
2782
- {regex: /\$(?:\d+|\w+)/, onMatch: TabstopToken},
2783
- {regex: /\$\{[\dA-Z_a-z]+/, onMatch: function(str, state, stack) {
2784
- var t = TabstopToken(str.substr(1), state, stack);
2785
- stack.unshift(t[0]);
2786
- return t;
2787
- }, next: "snippetVar"},
2788
- {regex: /\n/, token: "newline", merge: false}
2789
- ],
2790
- snippetVar: [
2791
- {regex: "\\|" + escape("\\|") + "*\\|", onMatch: function(val, state, stack) {
2792
- stack[0].choices = val.slice(1, -1).split(",");
2793
- }, next: "start"},
2794
- {regex: "/(" + escape("/") + "+)/(?:(" + escape("/") + "*)/)(\\w*):?",
2795
- onMatch: function(val, state, stack) {
2796
- var ts = stack[0];
2797
- ts.fmtString = val;
2798
-
2799
- val = this.splitRegex.exec(val);
2800
- ts.guard = val[1];
2801
- ts.fmt = val[2];
2802
- ts.flag = val[3];
2803
- return "";
2804
- }, next: "start"},
2805
- {regex: "`" + escape("`") + "*`", onMatch: function(val, state, stack) {
2806
- stack[0].code = val.splice(1, -1);
2807
- return "";
2808
- }, next: "start"},
2809
- {regex: "\\?", onMatch: function(val, state, stack) {
2810
- if (stack[0])
2811
- stack[0].expectIf = true;
2812
- }, next: "start"},
2813
- {regex: "([^:}\\\\]|\\\\.)*:?", token: "", next: "start"}
2814
- ],
2815
- formatString: [
2816
- {regex: "/(" + escape("/") + "+)/", token: "regex"},
2817
- {regex: "", onMatch: function(val, state, stack) {
2818
- stack.inFormatString = true;
2819
- }, next: "start"}
2820
- ]
2821
- });
2822
- SnippetManager.prototype.getTokenizer = function() {
2823
- return SnippetManager.$tokenizer;
2824
- };
2825
- return SnippetManager.$tokenizer;
2826
- };
2827
-
2828
- this.tokenizeTmSnippet = function(str, startState) {
2829
- return this.getTokenizer().getLineTokens(str, startState).tokens.map(function(x) {
2830
- return x.value || x;
2831
- });
2832
- };
2833
-
2834
- this.$getDefaultValue = function(editor, name) {
2835
- if (/^[A-Z]\d+$/.test(name)) {
2836
- var i = name.substr(1);
2837
- return (this.variables[name[0] + "__"] || {})[i];
2838
- }
2839
- if (/^\d+$/.test(name)) {
2840
- return (this.variables.__ || {})[name];
2841
- }
2842
- name = name.replace(/^TM_/, "");
2843
-
2844
- if (!editor)
2845
- return;
2846
- var s = editor.session;
2847
- switch(name) {
2848
- case "CURRENT_WORD":
2849
- var r = s.getWordRange();
2850
- case "SELECTION":
2851
- case "SELECTED_TEXT":
2852
- return s.getTextRange(r);
2853
- case "CURRENT_LINE":
2854
- return s.getLine(editor.getCursorPosition().row);
2855
- case "PREV_LINE": // not possible in textmate
2856
- return s.getLine(editor.getCursorPosition().row - 1);
2857
- case "LINE_INDEX":
2858
- return editor.getCursorPosition().column;
2859
- case "LINE_NUMBER":
2860
- return editor.getCursorPosition().row + 1;
2861
- case "SOFT_TABS":
2862
- return s.getUseSoftTabs() ? "YES" : "NO";
2863
- case "TAB_SIZE":
2864
- return s.getTabSize();
2865
- case "FILENAME":
2866
- case "FILEPATH":
2867
- return "";
2868
- case "FULLNAME":
2869
- return "Ace";
2870
- }
2871
- };
2872
- this.variables = {};
2873
- this.getVariableValue = function(editor, varName) {
2874
- if (this.variables.hasOwnProperty(varName))
2875
- return this.variables[varName](editor, varName) || "";
2876
- return this.$getDefaultValue(editor, varName) || "";
2877
- };
2878
- this.tmStrFormat = function(str, ch, editor) {
2879
- var flag = ch.flag || "";
2880
- var re = ch.guard;
2881
- re = new RegExp(re, flag.replace(/[^gi]/, ""));
2882
- var fmtTokens = this.tokenizeTmSnippet(ch.fmt, "formatString");
2883
- var _self = this;
2884
- var formatted = str.replace(re, function() {
2885
- _self.variables.__ = arguments;
2886
- var fmtParts = _self.resolveVariables(fmtTokens, editor);
2887
- var gChangeCase = "E";
2888
- for (var i = 0; i < fmtParts.length; i++) {
2889
- var ch = fmtParts[i];
2890
- if (typeof ch == "object") {
2891
- fmtParts[i] = "";
2892
- if (ch.changeCase && ch.local) {
2893
- var next = fmtParts[i + 1];
2894
- if (next && typeof next == "string") {
2895
- if (ch.changeCase == "u")
2896
- fmtParts[i] = next[0].toUpperCase();
2897
- else
2898
- fmtParts[i] = next[0].toLowerCase();
2899
- fmtParts[i + 1] = next.substr(1);
2900
- }
2901
- } else if (ch.changeCase) {
2902
- gChangeCase = ch.changeCase;
2903
- }
2904
- } else if (gChangeCase == "U") {
2905
- fmtParts[i] = ch.toUpperCase();
2906
- } else if (gChangeCase == "L") {
2907
- fmtParts[i] = ch.toLowerCase();
2908
- }
2909
- }
2910
- return fmtParts.join("");
2911
- });
2912
- this.variables.__ = null;
2913
- return formatted;
2914
- };
2915
-
2916
- this.resolveVariables = function(snippet, editor) {
2917
- var result = [];
2918
- for (var i = 0; i < snippet.length; i++) {
2919
- var ch = snippet[i];
2920
- if (typeof ch == "string") {
2921
- result.push(ch);
2922
- } else if (typeof ch != "object") {
2923
- continue;
2924
- } else if (ch.skip) {
2925
- gotoNext(ch);
2926
- } else if (ch.processed < i) {
2927
- continue;
2928
- } else if (ch.text) {
2929
- var value = this.getVariableValue(editor, ch.text);
2930
- if (value && ch.fmtString)
2931
- value = this.tmStrFormat(value, ch);
2932
- ch.processed = i;
2933
- if (ch.expectIf == null) {
2934
- if (value) {
2935
- result.push(value);
2936
- gotoNext(ch);
2937
- }
2938
- } else {
2939
- if (value) {
2940
- ch.skip = ch.elseBranch;
2941
- } else
2942
- gotoNext(ch);
2943
- }
2944
- } else if (ch.tabstopId != null) {
2945
- result.push(ch);
2946
- } else if (ch.changeCase != null) {
2947
- result.push(ch);
2948
- }
2949
- }
2950
- function gotoNext(ch) {
2951
- var i1 = snippet.indexOf(ch, i + 1);
2952
- if (i1 != -1)
2953
- i = i1;
2954
- }
2955
- return result;
2956
- };
2957
-
2958
- this.insertSnippetForSelection = function(editor, snippetText) {
2959
- var cursor = editor.getCursorPosition();
2960
- var line = editor.session.getLine(cursor.row);
2961
- var tabString = editor.session.getTabString();
2962
- var indentString = line.match(/^\s*/)[0];
2963
-
2964
- if (cursor.column < indentString.length)
2965
- indentString = indentString.slice(0, cursor.column);
2966
-
2967
- var tokens = this.tokenizeTmSnippet(snippetText);
2968
- tokens = this.resolveVariables(tokens, editor);
2969
- tokens = tokens.map(function(x) {
2970
- if (x == "\n")
2971
- return x + indentString;
2972
- if (typeof x == "string")
2973
- return x.replace(/\t/g, tabString);
2974
- return x;
2975
- });
2976
- var tabstops = [];
2977
- tokens.forEach(function(p, i) {
2978
- if (typeof p != "object")
2979
- return;
2980
- var id = p.tabstopId;
2981
- var ts = tabstops[id];
2982
- if (!ts) {
2983
- ts = tabstops[id] = [];
2984
- ts.index = id;
2985
- ts.value = "";
2986
- }
2987
- if (ts.indexOf(p) !== -1)
2988
- return;
2989
- ts.push(p);
2990
- var i1 = tokens.indexOf(p, i + 1);
2991
- if (i1 === -1)
2992
- return;
2993
-
2994
- var value = tokens.slice(i + 1, i1);
2995
- var isNested = value.some(function(t) {return typeof t === "object"});
2996
- if (isNested && !ts.value) {
2997
- ts.value = value;
2998
- } else if (value.length && (!ts.value || typeof ts.value !== "string")) {
2999
- ts.value = value.join("");
3000
- }
3001
- });
3002
- tabstops.forEach(function(ts) {ts.length = 0});
3003
- var expanding = {};
3004
- function copyValue(val) {
3005
- var copy = [];
3006
- for (var i = 0; i < val.length; i++) {
3007
- var p = val[i];
3008
- if (typeof p == "object") {
3009
- if (expanding[p.tabstopId])
3010
- continue;
3011
- var j = val.lastIndexOf(p, i - 1);
3012
- p = copy[j] || {tabstopId: p.tabstopId};
3013
- }
3014
- copy[i] = p;
3015
- }
3016
- return copy;
3017
- }
3018
- for (var i = 0; i < tokens.length; i++) {
3019
- var p = tokens[i];
3020
- if (typeof p != "object")
3021
- continue;
3022
- var id = p.tabstopId;
3023
- var i1 = tokens.indexOf(p, i + 1);
3024
- if (expanding[id]) {
3025
- if (expanding[id] === p)
3026
- expanding[id] = null;
3027
- continue;
3028
- }
3029
-
3030
- var ts = tabstops[id];
3031
- var arg = typeof ts.value == "string" ? [ts.value] : copyValue(ts.value);
3032
- arg.unshift(i + 1, Math.max(0, i1 - i));
3033
- arg.push(p);
3034
- expanding[id] = p;
3035
- tokens.splice.apply(tokens, arg);
3036
-
3037
- if (ts.indexOf(p) === -1)
3038
- ts.push(p);
3039
- }
3040
- var row = 0, column = 0;
3041
- var text = "";
3042
- tokens.forEach(function(t) {
3043
- if (typeof t === "string") {
3044
- if (t[0] === "\n"){
3045
- column = t.length - 1;
3046
- row ++;
3047
- } else
3048
- column += t.length;
3049
- text += t;
3050
- } else {
3051
- if (!t.start)
3052
- t.start = {row: row, column: column};
3053
- else
3054
- t.end = {row: row, column: column};
3055
- }
3056
- });
3057
- var range = editor.getSelectionRange();
3058
- var end = editor.session.replace(range, text);
3059
-
3060
- var tabstopManager = new TabstopManager(editor);
3061
- var selectionId = editor.inVirtualSelectionMode && editor.selection.index;
3062
- tabstopManager.addTabstops(tabstops, range.start, end, selectionId);
3063
- };
3064
-
3065
- this.insertSnippet = function(editor, snippetText) {
3066
- var self = this;
3067
- if (editor.inVirtualSelectionMode)
3068
- return self.insertSnippetForSelection(editor, snippetText);
3069
-
3070
- editor.forEachSelection(function() {
3071
- self.insertSnippetForSelection(editor, snippetText);
3072
- }, null, {keepOrder: true});
3073
-
3074
- if (editor.tabstopManager)
3075
- editor.tabstopManager.tabNext();
3076
- };
3077
-
3078
- this.$getScope = function(editor) {
3079
- var scope = editor.session.$mode.$id || "";
3080
- scope = scope.split("/").pop();
3081
- if (scope === "html" || scope === "php") {
3082
- if (scope === "php" && !editor.session.$mode.inlinePhp)
3083
- scope = "html";
3084
- var c = editor.getCursorPosition();
3085
- var state = editor.session.getState(c.row);
3086
- if (typeof state === "object") {
3087
- state = state[0];
3088
- }
3089
- if (state.substring) {
3090
- if (state.substring(0, 3) == "js-")
3091
- scope = "javascript";
3092
- else if (state.substring(0, 4) == "css-")
3093
- scope = "css";
3094
- else if (state.substring(0, 4) == "php-")
3095
- scope = "php";
3096
- }
3097
- }
3098
-
3099
- return scope;
3100
- };
3101
-
3102
- this.getActiveScopes = function(editor) {
3103
- var scope = this.$getScope(editor);
3104
- var scopes = [scope];
3105
- var snippetMap = this.snippetMap;
3106
- if (snippetMap[scope] && snippetMap[scope].includeScopes) {
3107
- scopes.push.apply(scopes, snippetMap[scope].includeScopes);
3108
- }
3109
- scopes.push("_");
3110
- return scopes;
3111
- };
3112
-
3113
- this.expandWithTab = function(editor, options) {
3114
- var self = this;
3115
- var result = editor.forEachSelection(function() {
3116
- return self.expandSnippetForSelection(editor, options);
3117
- }, null, {keepOrder: true});
3118
- if (result && editor.tabstopManager)
3119
- editor.tabstopManager.tabNext();
3120
- return result;
3121
- };
3122
-
3123
- this.expandSnippetForSelection = function(editor, options) {
3124
- var cursor = editor.getCursorPosition();
3125
- var line = editor.session.getLine(cursor.row);
3126
- var before = line.substring(0, cursor.column);
3127
- var after = line.substr(cursor.column);
3128
-
3129
- var snippetMap = this.snippetMap;
3130
- var snippet;
3131
- this.getActiveScopes(editor).some(function(scope) {
3132
- var snippets = snippetMap[scope];
3133
- if (snippets)
3134
- snippet = this.findMatchingSnippet(snippets, before, after);
3135
- return !!snippet;
3136
- }, this);
3137
- if (!snippet)
3138
- return false;
3139
- if (options && options.dryRun)
3140
- return true;
3141
- editor.session.doc.removeInLine(cursor.row,
3142
- cursor.column - snippet.replaceBefore.length,
3143
- cursor.column + snippet.replaceAfter.length
3144
- );
3145
-
3146
- this.variables.M__ = snippet.matchBefore;
3147
- this.variables.T__ = snippet.matchAfter;
3148
- this.insertSnippetForSelection(editor, snippet.content);
3149
-
3150
- this.variables.M__ = this.variables.T__ = null;
3151
- return true;
3152
- };
3153
-
3154
- this.findMatchingSnippet = function(snippetList, before, after) {
3155
- for (var i = snippetList.length; i--;) {
3156
- var s = snippetList[i];
3157
- if (s.startRe && !s.startRe.test(before))
3158
- continue;
3159
- if (s.endRe && !s.endRe.test(after))
3160
- continue;
3161
- if (!s.startRe && !s.endRe)
3162
- continue;
3163
-
3164
- s.matchBefore = s.startRe ? s.startRe.exec(before) : [""];
3165
- s.matchAfter = s.endRe ? s.endRe.exec(after) : [""];
3166
- s.replaceBefore = s.triggerRe ? s.triggerRe.exec(before)[0] : "";
3167
- s.replaceAfter = s.endTriggerRe ? s.endTriggerRe.exec(after)[0] : "";
3168
- return s;
3169
- }
3170
- };
3171
-
3172
- this.snippetMap = {};
3173
- this.snippetNameMap = {};
3174
- this.register = function(snippets, scope) {
3175
- var snippetMap = this.snippetMap;
3176
- var snippetNameMap = this.snippetNameMap;
3177
- var self = this;
3178
-
3179
- if (!snippets)
3180
- snippets = [];
3181
-
3182
- function wrapRegexp(src) {
3183
- if (src && !/^\^?\(.*\)\$?$|^\\b$/.test(src))
3184
- src = "(?:" + src + ")";
3185
-
3186
- return src || "";
3187
- }
3188
- function guardedRegexp(re, guard, opening) {
3189
- re = wrapRegexp(re);
3190
- guard = wrapRegexp(guard);
3191
- if (opening) {
3192
- re = guard + re;
3193
- if (re && re[re.length - 1] != "$")
3194
- re = re + "$";
3195
- } else {
3196
- re = re + guard;
3197
- if (re && re[0] != "^")
3198
- re = "^" + re;
3199
- }
3200
- return new RegExp(re);
3201
- }
3202
-
3203
- function addSnippet(s) {
3204
- if (!s.scope)
3205
- s.scope = scope || "_";
3206
- scope = s.scope;
3207
- if (!snippetMap[scope]) {
3208
- snippetMap[scope] = [];
3209
- snippetNameMap[scope] = {};
3210
- }
3211
-
3212
- var map = snippetNameMap[scope];
3213
- if (s.name) {
3214
- var old = map[s.name];
3215
- if (old)
3216
- self.unregister(old);
3217
- map[s.name] = s;
3218
- }
3219
- snippetMap[scope].push(s);
3220
-
3221
- if (s.tabTrigger && !s.trigger) {
3222
- if (!s.guard && /^\w/.test(s.tabTrigger))
3223
- s.guard = "\\b";
3224
- s.trigger = lang.escapeRegExp(s.tabTrigger);
3225
- }
3226
-
3227
- s.startRe = guardedRegexp(s.trigger, s.guard, true);
3228
- s.triggerRe = new RegExp(s.trigger, "", true);
3229
-
3230
- s.endRe = guardedRegexp(s.endTrigger, s.endGuard, true);
3231
- s.endTriggerRe = new RegExp(s.endTrigger, "", true);
3232
- }
3233
-
3234
- if (snippets && snippets.content)
3235
- addSnippet(snippets);
3236
- else if (Array.isArray(snippets))
3237
- snippets.forEach(addSnippet);
3238
-
3239
- this._signal("registerSnippets", {scope: scope});
3240
- };
3241
- this.unregister = function(snippets, scope) {
3242
- var snippetMap = this.snippetMap;
3243
- var snippetNameMap = this.snippetNameMap;
3244
-
3245
- function removeSnippet(s) {
3246
- var nameMap = snippetNameMap[s.scope||scope];
3247
- if (nameMap && nameMap[s.name]) {
3248
- delete nameMap[s.name];
3249
- var map = snippetMap[s.scope||scope];
3250
- var i = map && map.indexOf(s);
3251
- if (i >= 0)
3252
- map.splice(i, 1);
3253
- }
3254
- }
3255
- if (snippets.content)
3256
- removeSnippet(snippets);
3257
- else if (Array.isArray(snippets))
3258
- snippets.forEach(removeSnippet);
3259
- };
3260
- this.parseSnippetFile = function(str) {
3261
- str = str.replace(/\r/g, "");
3262
- var list = [], snippet = {};
3263
- var re = /^#.*|^({[\s\S]*})\s*$|^(\S+) (.*)$|^((?:\n*\t.*)+)/gm;
3264
- var m;
3265
- while (m = re.exec(str)) {
3266
- if (m[1]) {
3267
- try {
3268
- snippet = JSON.parse(m[1]);
3269
- list.push(snippet);
3270
- } catch (e) {}
3271
- } if (m[4]) {
3272
- snippet.content = m[4].replace(/^\t/gm, "");
3273
- list.push(snippet);
3274
- snippet = {};
3275
- } else {
3276
- var key = m[2], val = m[3];
3277
- if (key == "regex") {
3278
- var guardRe = /\/((?:[^\/\\]|\\.)*)|$/g;
3279
- snippet.guard = guardRe.exec(val)[1];
3280
- snippet.trigger = guardRe.exec(val)[1];
3281
- snippet.endTrigger = guardRe.exec(val)[1];
3282
- snippet.endGuard = guardRe.exec(val)[1];
3283
- } else if (key == "snippet") {
3284
- snippet.tabTrigger = val.match(/^\S*/)[0];
3285
- if (!snippet.name)
3286
- snippet.name = val;
3287
- } else {
3288
- snippet[key] = val;
3289
- }
3290
- }
3291
- }
3292
- return list;
3293
- };
3294
- this.getSnippetByName = function(name, editor) {
3295
- var snippetMap = this.snippetNameMap;
3296
- var snippet;
3297
- this.getActiveScopes(editor).some(function(scope) {
3298
- var snippets = snippetMap[scope];
3299
- if (snippets)
3300
- snippet = snippets[name];
3301
- return !!snippet;
3302
- }, this);
3303
- return snippet;
3304
- };
3305
-
3306
- }).call(SnippetManager.prototype);
3307
-
3308
-
3309
- var TabstopManager = function(editor) {
3310
- if (editor.tabstopManager)
3311
- return editor.tabstopManager;
3312
- editor.tabstopManager = this;
3313
- this.$onChange = this.onChange.bind(this);
3314
- this.$onChangeSelection = lang.delayedCall(this.onChangeSelection.bind(this)).schedule;
3315
- this.$onChangeSession = this.onChangeSession.bind(this);
3316
- this.$onAfterExec = this.onAfterExec.bind(this);
3317
- this.attach(editor);
3318
- };
3319
- (function() {
3320
- this.attach = function(editor) {
3321
- this.index = 0;
3322
- this.ranges = [];
3323
- this.tabstops = [];
3324
- this.$openTabstops = null;
3325
- this.selectedTabstop = null;
3326
-
3327
- this.editor = editor;
3328
- this.editor.on("change", this.$onChange);
3329
- this.editor.on("changeSelection", this.$onChangeSelection);
3330
- this.editor.on("changeSession", this.$onChangeSession);
3331
- this.editor.commands.on("afterExec", this.$onAfterExec);
3332
- this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler);
3333
- };
3334
- this.detach = function() {
3335
- this.tabstops.forEach(this.removeTabstopMarkers, this);
3336
- this.ranges = null;
3337
- this.tabstops = null;
3338
- this.selectedTabstop = null;
3339
- this.editor.removeListener("change", this.$onChange);
3340
- this.editor.removeListener("changeSelection", this.$onChangeSelection);
3341
- this.editor.removeListener("changeSession", this.$onChangeSession);
3342
- this.editor.commands.removeListener("afterExec", this.$onAfterExec);
3343
- this.editor.keyBinding.removeKeyboardHandler(this.keyboardHandler);
3344
- this.editor.tabstopManager = null;
3345
- this.editor = null;
3346
- };
3347
-
3348
- this.onChange = function(e) {
3349
- var changeRange = e.data.range;
3350
- var isRemove = e.data.action[0] == "r";
3351
- var start = changeRange.start;
3352
- var end = changeRange.end;
3353
- var startRow = start.row;
3354
- var endRow = end.row;
3355
- var lineDif = endRow - startRow;
3356
- var colDiff = end.column - start.column;
3357
-
3358
- if (isRemove) {
3359
- lineDif = -lineDif;
3360
- colDiff = -colDiff;
3361
- }
3362
- if (!this.$inChange && isRemove) {
3363
- var ts = this.selectedTabstop;
3364
- var changedOutside = ts && !ts.some(function(r) {
3365
- return comparePoints(r.start, start) <= 0 && comparePoints(r.end, end) >= 0;
3366
- });
3367
- if (changedOutside)
3368
- return this.detach();
3369
- }
3370
- var ranges = this.ranges;
3371
- for (var i = 0; i < ranges.length; i++) {
3372
- var r = ranges[i];
3373
- if (r.end.row < start.row)
3374
- continue;
3375
-
3376
- if (isRemove && comparePoints(start, r.start) < 0 && comparePoints(end, r.end) > 0) {
3377
- this.removeRange(r);
3378
- i--;
3379
- continue;
3380
- }
3381
-
3382
- if (r.start.row == startRow && r.start.column > start.column)
3383
- r.start.column += colDiff;
3384
- if (r.end.row == startRow && r.end.column >= start.column)
3385
- r.end.column += colDiff;
3386
- if (r.start.row >= startRow)
3387
- r.start.row += lineDif;
3388
- if (r.end.row >= startRow)
3389
- r.end.row += lineDif;
3390
-
3391
- if (comparePoints(r.start, r.end) > 0)
3392
- this.removeRange(r);
3393
- }
3394
- if (!ranges.length)
3395
- this.detach();
3396
- };
3397
- this.updateLinkedFields = function() {
3398
- var ts = this.selectedTabstop;
3399
- if (!ts || !ts.hasLinkedRanges)
3400
- return;
3401
- this.$inChange = true;
3402
- var session = this.editor.session;
3403
- var text = session.getTextRange(ts.firstNonLinked);
3404
- for (var i = ts.length; i--;) {
3405
- var range = ts[i];
3406
- if (!range.linked)
3407
- continue;
3408
- var fmt = exports.snippetManager.tmStrFormat(text, range.original);
3409
- session.replace(range, fmt);
3410
- }
3411
- this.$inChange = false;
3412
- };
3413
- this.onAfterExec = function(e) {
3414
- if (e.command && !e.command.readOnly)
3415
- this.updateLinkedFields();
3416
- };
3417
- this.onChangeSelection = function() {
3418
- if (!this.editor)
3419
- return;
3420
- var lead = this.editor.selection.lead;
3421
- var anchor = this.editor.selection.anchor;
3422
- var isEmpty = this.editor.selection.isEmpty();
3423
- for (var i = this.ranges.length; i--;) {
3424
- if (this.ranges[i].linked)
3425
- continue;
3426
- var containsLead = this.ranges[i].contains(lead.row, lead.column);
3427
- var containsAnchor = isEmpty || this.ranges[i].contains(anchor.row, anchor.column);
3428
- if (containsLead && containsAnchor)
3429
- return;
3430
- }
3431
- this.detach();
3432
- };
3433
- this.onChangeSession = function() {
3434
- this.detach();
3435
- };
3436
- this.tabNext = function(dir) {
3437
- var max = this.tabstops.length;
3438
- var index = this.index + (dir || 1);
3439
- index = Math.min(Math.max(index, 1), max);
3440
- if (index == max)
3441
- index = 0;
3442
- this.selectTabstop(index);
3443
- if (index === 0)
3444
- this.detach();
3445
- };
3446
- this.selectTabstop = function(index) {
3447
- this.$openTabstops = null;
3448
- var ts = this.tabstops[this.index];
3449
- if (ts)
3450
- this.addTabstopMarkers(ts);
3451
- this.index = index;
3452
- ts = this.tabstops[this.index];
3453
- if (!ts || !ts.length)
3454
- return;
3455
-
3456
- this.selectedTabstop = ts;
3457
- if (!this.editor.inVirtualSelectionMode) {
3458
- var sel = this.editor.multiSelect;
3459
- sel.toSingleRange(ts.firstNonLinked.clone());
3460
- for (var i = ts.length; i--;) {
3461
- if (ts.hasLinkedRanges && ts[i].linked)
3462
- continue;
3463
- sel.addRange(ts[i].clone(), true);
3464
- }
3465
- if (sel.ranges[0])
3466
- sel.addRange(sel.ranges[0].clone());
3467
- } else {
3468
- this.editor.selection.setRange(ts.firstNonLinked);
3469
- }
3470
-
3471
- this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler);
3472
- };
3473
- this.addTabstops = function(tabstops, start, end) {
3474
- if (!this.$openTabstops)
3475
- this.$openTabstops = [];
3476
- if (!tabstops[0]) {
3477
- var p = Range.fromPoints(end, end);
3478
- moveRelative(p.start, start);
3479
- moveRelative(p.end, start);
3480
- tabstops[0] = [p];
3481
- tabstops[0].index = 0;
3482
- }
3483
-
3484
- var i = this.index;
3485
- var arg = [i + 1, 0];
3486
- var ranges = this.ranges;
3487
- tabstops.forEach(function(ts, index) {
3488
- var dest = this.$openTabstops[index] || ts;
3489
-
3490
- for (var i = ts.length; i--;) {
3491
- var p = ts[i];
3492
- var range = Range.fromPoints(p.start, p.end || p.start);
3493
- movePoint(range.start, start);
3494
- movePoint(range.end, start);
3495
- range.original = p;
3496
- range.tabstop = dest;
3497
- ranges.push(range);
3498
- if (dest != ts)
3499
- dest.unshift(range);
3500
- else
3501
- dest[i] = range;
3502
- if (p.fmtString) {
3503
- range.linked = true;
3504
- dest.hasLinkedRanges = true;
3505
- } else if (!dest.firstNonLinked)
3506
- dest.firstNonLinked = range;
3507
- }
3508
- if (!dest.firstNonLinked)
3509
- dest.hasLinkedRanges = false;
3510
- if (dest === ts) {
3511
- arg.push(dest);
3512
- this.$openTabstops[index] = dest;
3513
- }
3514
- this.addTabstopMarkers(dest);
3515
- }, this);
3516
-
3517
- if (arg.length > 2) {
3518
- if (this.tabstops.length)
3519
- arg.push(arg.splice(2, 1)[0]);
3520
- this.tabstops.splice.apply(this.tabstops, arg);
3521
- }
3522
- };
3523
-
3524
- this.addTabstopMarkers = function(ts) {
3525
- var session = this.editor.session;
3526
- ts.forEach(function(range) {
3527
- if (!range.markerId)
3528
- range.markerId = session.addMarker(range, "ace_snippet-marker", "text");
3529
- });
3530
- };
3531
- this.removeTabstopMarkers = function(ts) {
3532
- var session = this.editor.session;
3533
- ts.forEach(function(range) {
3534
- session.removeMarker(range.markerId);
3535
- range.markerId = null;
3536
- });
3537
- };
3538
- this.removeRange = function(range) {
3539
- var i = range.tabstop.indexOf(range);
3540
- range.tabstop.splice(i, 1);
3541
- i = this.ranges.indexOf(range);
3542
- this.ranges.splice(i, 1);
3543
- this.editor.session.removeMarker(range.markerId);
3544
- if (!range.tabstop.length) {
3545
- i = this.tabstops.indexOf(range.tabstop);
3546
- if (i != -1)
3547
- this.tabstops.splice(i, 1);
3548
- if (!this.tabstops.length)
3549
- this.detach();
3550
- }
3551
- };
3552
-
3553
- this.keyboardHandler = new HashHandler();
3554
- this.keyboardHandler.bindKeys({
3555
- "Tab": function(ed) {
3556
- if (exports.snippetManager && exports.snippetManager.expandWithTab(ed)) {
3557
- return;
3558
- }
3559
-
3560
- ed.tabstopManager.tabNext(1);
3561
- },
3562
- "Shift-Tab": function(ed) {
3563
- ed.tabstopManager.tabNext(-1);
3564
- },
3565
- "Esc": function(ed) {
3566
- ed.tabstopManager.detach();
3567
- },
3568
- "Return": function(ed) {
3569
- return false;
3570
- }
3571
- });
3572
- }).call(TabstopManager.prototype);
3573
-
3574
-
3575
-
3576
- var changeTracker = {};
3577
- changeTracker.onChange = Anchor.prototype.onChange;
3578
- changeTracker.setPosition = function(row, column) {
3579
- this.pos.row = row;
3580
- this.pos.column = column;
3581
- };
3582
- changeTracker.update = function(pos, delta, $insertRight) {
3583
- this.$insertRight = $insertRight;
3584
- this.pos = pos;
3585
- this.onChange(delta);
3586
- };
3587
-
3588
- var movePoint = function(point, diff) {
3589
- if (point.row == 0)
3590
- point.column += diff.column;
3591
- point.row += diff.row;
3592
- };
3593
-
3594
- var moveRelative = function(point, start) {
3595
- if (point.row == start.row)
3596
- point.column -= start.column;
3597
- point.row -= start.row;
3598
- };
3599
-
3600
-
3601
- require("./lib/dom").importCssString("\
3602
- .ace_snippet-marker {\
3603
- -moz-box-sizing: border-box;\
3604
- box-sizing: border-box;\
3605
- background: rgba(194, 193, 208, 0.09);\
3606
- border: 1px dotted rgba(211, 208, 235, 0.62);\
3607
- position: absolute;\
3608
- }");
3609
-
3610
- exports.snippetManager = new SnippetManager();
3611
-
3612
-
3613
- var Editor = require("./editor").Editor;
3614
- (function() {
3615
- this.insertSnippet = function(content, options) {
3616
- return exports.snippetManager.insertSnippet(this, content, options);
3617
- };
3618
- this.expandSnippet = function(options) {
3619
- return exports.snippetManager.expandWithTab(this, options);
3620
- };
3621
- }).call(Editor.prototype);
3622
-
3623
- });
3624
-
3625
- define("ace/autocomplete/popup",["require","exports","module","ace/edit_session","ace/virtual_renderer","ace/editor","ace/range","ace/lib/event","ace/lib/lang","ace/lib/dom"], function(require, exports, module) {
3626
- "use strict";
3627
-
3628
- var EditSession = require("../edit_session").EditSession;
3629
- var Renderer = require("../virtual_renderer").VirtualRenderer;
3630
- var Editor = require("../editor").Editor;
3631
- var Range = require("../range").Range;
3632
- var event = require("../lib/event");
3633
- var lang = require("../lib/lang");
3634
- var dom = require("../lib/dom");
3635
-
3636
- var $singleLineEditor = function(el) {
3637
- var renderer = new Renderer(el);
3638
-
3639
- renderer.$maxLines = 4;
3640
-
3641
- var editor = new Editor(renderer);
3642
-
3643
- editor.setHighlightActiveLine(false);
3644
- editor.setShowPrintMargin(false);
3645
- editor.renderer.setShowGutter(false);
3646
- editor.renderer.setHighlightGutterLine(false);
3647
-
3648
- editor.$mouseHandler.$focusWaitTimout = 0;
3649
- editor.$highlightTagPending = true;
3650
-
3651
- return editor;
3652
- };
3653
-
3654
- var AcePopup = function(parentNode) {
3655
- var el = dom.createElement("div");
3656
- var popup = new $singleLineEditor(el);
3657
-
3658
- if (parentNode)
3659
- parentNode.appendChild(el);
3660
- el.style.display = "none";
3661
- popup.renderer.content.style.cursor = "default";
3662
- popup.renderer.setStyle("ace_autocomplete");
3663
-
3664
- popup.setOption("displayIndentGuides", false);
3665
- popup.setOption("dragDelay", 150);
3666
-
3667
- var noop = function(){};
3668
-
3669
- popup.focus = noop;
3670
- popup.$isFocused = true;
3671
-
3672
- popup.renderer.$cursorLayer.restartTimer = noop;
3673
- popup.renderer.$cursorLayer.element.style.opacity = 0;
3674
-
3675
- popup.renderer.$maxLines = 8;
3676
- popup.renderer.$keepTextAreaAtCursor = false;
3677
-
3678
- popup.setHighlightActiveLine(false);
3679
- popup.session.highlight("");
3680
- popup.session.$searchHighlight.clazz = "ace_highlight-marker";
3681
-
3682
- popup.on("mousedown", function(e) {
3683
- var pos = e.getDocumentPosition();
3684
- popup.selection.moveToPosition(pos);
3685
- selectionMarker.start.row = selectionMarker.end.row = pos.row;
3686
- e.stop();
3687
- });
3688
-
3689
- var lastMouseEvent;
3690
- var hoverMarker = new Range(-1,0,-1,Infinity);
3691
- var selectionMarker = new Range(-1,0,-1,Infinity);
3692
- selectionMarker.id = popup.session.addMarker(selectionMarker, "ace_active-line", "fullLine");
3693
- popup.setSelectOnHover = function(val) {
3694
- if (!val) {
3695
- hoverMarker.id = popup.session.addMarker(hoverMarker, "ace_line-hover", "fullLine");
3696
- } else if (hoverMarker.id) {
3697
- popup.session.removeMarker(hoverMarker.id);
3698
- hoverMarker.id = null;
3699
- }
3700
- };
3701
- popup.setSelectOnHover(false);
3702
- popup.on("mousemove", function(e) {
3703
- if (!lastMouseEvent) {
3704
- lastMouseEvent = e;
3705
- return;
3706
- }
3707
- if (lastMouseEvent.x == e.x && lastMouseEvent.y == e.y) {
3708
- return;
3709
- }
3710
- lastMouseEvent = e;
3711
- lastMouseEvent.scrollTop = popup.renderer.scrollTop;
3712
- var row = lastMouseEvent.getDocumentPosition().row;
3713
- if (hoverMarker.start.row != row) {
3714
- if (!hoverMarker.id)
3715
- popup.setRow(row);
3716
- setHoverMarker(row);
3717
- }
3718
- });
3719
- popup.renderer.on("beforeRender", function() {
3720
- if (lastMouseEvent && hoverMarker.start.row != -1) {
3721
- lastMouseEvent.$pos = null;
3722
- var row = lastMouseEvent.getDocumentPosition().row;
3723
- if (!hoverMarker.id)
3724
- popup.setRow(row);
3725
- setHoverMarker(row, true);
3726
- }
3727
- });
3728
- popup.renderer.on("afterRender", function() {
3729
- var row = popup.getRow();
3730
- var t = popup.renderer.$textLayer;
3731
- var selected = t.element.childNodes[row - t.config.firstRow];
3732
- if (selected == t.selectedNode)
3733
- return;
3734
- if (t.selectedNode)
3735
- dom.removeCssClass(t.selectedNode, "ace_selected");
3736
- t.selectedNode = selected;
3737
- if (selected)
3738
- dom.addCssClass(selected, "ace_selected");
3739
- });
3740
- var hideHoverMarker = function() { setHoverMarker(-1) };
3741
- var setHoverMarker = function(row, suppressRedraw) {
3742
- if (row !== hoverMarker.start.row) {
3743
- hoverMarker.start.row = hoverMarker.end.row = row;
3744
- if (!suppressRedraw)
3745
- popup.session._emit("changeBackMarker");
3746
- popup._emit("changeHoverMarker");
3747
- }
3748
- };
3749
- popup.getHoveredRow = function() {
3750
- return hoverMarker.start.row;
3751
- };
3752
-
3753
- event.addListener(popup.container, "mouseout", hideHoverMarker);
3754
- popup.on("hide", hideHoverMarker);
3755
- popup.on("changeSelection", hideHoverMarker);
3756
-
3757
- popup.session.doc.getLength = function() {
3758
- return popup.data.length;
3759
- };
3760
- popup.session.doc.getLine = function(i) {
3761
- var data = popup.data[i];
3762
- if (typeof data == "string")
3763
- return data;
3764
- return (data && data.value) || "";
3765
- };
3766
-
3767
- var bgTokenizer = popup.session.bgTokenizer;
3768
- bgTokenizer.$tokenizeRow = function(row) {
3769
- var data = popup.data[row];
3770
- var tokens = [];
3771
- if (!data)
3772
- return tokens;
3773
- if (typeof data == "string")
3774
- data = {value: data};
3775
- if (!data.caption)
3776
- data.caption = data.value || data.name;
3777
-
3778
- var last = -1;
3779
- var flag, c;
3780
- for (var i = 0; i < data.caption.length; i++) {
3781
- c = data.caption[i];
3782
- flag = data.matchMask & (1 << i) ? 1 : 0;
3783
- if (last !== flag) {
3784
- tokens.push({type: data.className || "" + ( flag ? "completion-highlight" : ""), value: c});
3785
- last = flag;
3786
- } else {
3787
- tokens[tokens.length - 1].value += c;
3788
- }
3789
- }
3790
-
3791
- if (data.meta) {
3792
- var maxW = popup.renderer.$size.scrollerWidth / popup.renderer.layerConfig.characterWidth;
3793
- if (data.meta.length + data.caption.length < maxW - 2)
3794
- tokens.push({type: "rightAlignedText", value: data.meta});
3795
- }
3796
- return tokens;
3797
- };
3798
- bgTokenizer.$updateOnChange = noop;
3799
- bgTokenizer.start = noop;
3800
-
3801
- popup.session.$computeWidth = function() {
3802
- return this.screenWidth = 0;
3803
- };
3804
- popup.isOpen = false;
3805
- popup.isTopdown = false;
3806
-
3807
- popup.data = [];
3808
- popup.setData = function(list) {
3809
- popup.data = list || [];
3810
- popup.setValue(lang.stringRepeat("\n", list.length), -1);
3811
- popup.setRow(0);
3812
- };
3813
- popup.getData = function(row) {
3814
- return popup.data[row];
3815
- };
3816
-
3817
- popup.getRow = function() {
3818
- return selectionMarker.start.row;
3819
- };
3820
- popup.setRow = function(line) {
3821
- line = Math.max(-1, Math.min(this.data.length, line));
3822
- if (selectionMarker.start.row != line) {
3823
- popup.selection.clearSelection();
3824
- selectionMarker.start.row = selectionMarker.end.row = line || 0;
3825
- popup.session._emit("changeBackMarker");
3826
- popup.moveCursorTo(line || 0, 0);
3827
- if (popup.isOpen)
3828
- popup._signal("select");
3829
- }
3830
- };
3831
-
3832
- popup.on("changeSelection", function() {
3833
- if (popup.isOpen)
3834
- popup.setRow(popup.selection.lead.row);
3835
- });
3836
-
3837
- popup.hide = function() {
3838
- this.container.style.display = "none";
3839
- this._signal("hide");
3840
- popup.isOpen = false;
3841
- };
3842
- popup.show = function(pos, lineHeight, topdownOnly) {
3843
- var el = this.container;
3844
- var screenHeight = window.innerHeight;
3845
- var screenWidth = window.innerWidth;
3846
- var renderer = this.renderer;
3847
- var maxH = renderer.$maxLines * lineHeight * 1.4;
3848
- var top = pos.top + this.$borderSize;
3849
- if (top + maxH > screenHeight - lineHeight && !topdownOnly) {
3850
- el.style.top = "";
3851
- el.style.bottom = screenHeight - top + "px";
3852
- popup.isTopdown = false;
3853
- } else {
3854
- top += lineHeight;
3855
- el.style.top = top + "px";
3856
- el.style.bottom = "";
3857
- popup.isTopdown = true;
3858
- }
3859
-
3860
- el.style.display = "";
3861
- this.renderer.$textLayer.checkForSizeChanges();
3862
-
3863
- var left = pos.left;
3864
- if (left + el.offsetWidth > screenWidth)
3865
- left = screenWidth - el.offsetWidth;
3866
-
3867
- el.style.left = left + "px";
3868
-
3869
- this._signal("show");
3870
- lastMouseEvent = null;
3871
- popup.isOpen = true;
3872
- };
3873
-
3874
- popup.getTextLeftOffset = function() {
3875
- return this.$borderSize + this.renderer.$padding + this.$imageSize;
3876
- };
3877
-
3878
- popup.$imageSize = 0;
3879
- popup.$borderSize = 1;
3880
-
3881
- return popup;
3882
- };
3883
-
3884
- dom.importCssString("\
3885
- .ace_editor.ace_autocomplete .ace_marker-layer .ace_active-line {\
3886
- background-color: #CAD6FA;\
3887
- z-index: 1;\
3888
- }\
3889
- .ace_editor.ace_autocomplete .ace_line-hover {\
3890
- border: 1px solid #abbffe;\
3891
- margin-top: -1px;\
3892
- background: rgba(233,233,253,0.4);\
3893
- }\
3894
- .ace_editor.ace_autocomplete .ace_line-hover {\
3895
- position: absolute;\
3896
- z-index: 2;\
3897
- }\
3898
- .ace_editor.ace_autocomplete .ace_scroller {\
3899
- background: none;\
3900
- border: none;\
3901
- box-shadow: none;\
3902
- }\
3903
- .ace_rightAlignedText {\
3904
- color: gray;\
3905
- display: inline-block;\
3906
- position: absolute;\
3907
- right: 4px;\
3908
- text-align: right;\
3909
- z-index: -1;\
3910
- }\
3911
- .ace_editor.ace_autocomplete .ace_completion-highlight{\
3912
- color: #000;\
3913
- text-shadow: 0 0 0.01em;\
3914
- }\
3915
- .ace_editor.ace_autocomplete {\
3916
- width: 280px;\
3917
- z-index: 200000;\
3918
- background: #fbfbfb;\
3919
- color: #444;\
3920
- border: 1px lightgray solid;\
3921
- position: fixed;\
3922
- box-shadow: 2px 3px 5px rgba(0,0,0,.2);\
3923
- line-height: 1.4;\
3924
- }");
3925
-
3926
- exports.AcePopup = AcePopup;
3927
-
3928
- });
3929
-
3930
- define("ace/autocomplete/util",["require","exports","module"], function(require, exports, module) {
3931
- "use strict";
3932
-
3933
- exports.parForEach = function(array, fn, callback) {
3934
- var completed = 0;
3935
- var arLength = array.length;
3936
- if (arLength === 0)
3937
- callback();
3938
- for (var i = 0; i < arLength; i++) {
3939
- fn(array[i], function(result, err) {
3940
- completed++;
3941
- if (completed === arLength)
3942
- callback(result, err);
3943
- });
3944
- }
3945
- };
3946
-
3947
- var ID_REGEX = /[a-zA-Z_0-9\$\-\u00A2-\uFFFF]/;
3948
-
3949
- exports.retrievePrecedingIdentifier = function(text, pos, regex) {
3950
- regex = regex || ID_REGEX;
3951
- var buf = [];
3952
- for (var i = pos-1; i >= 0; i--) {
3953
- if (regex.test(text[i]))
3954
- buf.push(text[i]);
3955
- else
3956
- break;
3957
- }
3958
- return buf.reverse().join("");
3959
- };
3960
-
3961
- exports.retrieveFollowingIdentifier = function(text, pos, regex) {
3962
- regex = regex || ID_REGEX;
3963
- var buf = [];
3964
- for (var i = pos; i < text.length; i++) {
3965
- if (regex.test(text[i]))
3966
- buf.push(text[i]);
3967
- else
3968
- break;
3969
- }
3970
- return buf;
3971
- };
3972
-
3973
- });
3974
-
3975
- define("ace/autocomplete",["require","exports","module","ace/keyboard/hash_handler","ace/autocomplete/popup","ace/autocomplete/util","ace/lib/event","ace/lib/lang","ace/snippets"], function(require, exports, module) {
3976
- "use strict";
3977
-
3978
- var HashHandler = require("./keyboard/hash_handler").HashHandler;
3979
- var AcePopup = require("./autocomplete/popup").AcePopup;
3980
- var util = require("./autocomplete/util");
3981
- var event = require("./lib/event");
3982
- var lang = require("./lib/lang");
3983
- var snippetManager = require("./snippets").snippetManager;
3984
-
3985
- var Autocomplete = function() {
3986
- this.autoInsert = true;
3987
- this.autoSelect = true;
3988
- this.keyboardHandler = new HashHandler();
3989
- this.keyboardHandler.bindKeys(this.commands);
3990
-
3991
- this.blurListener = this.blurListener.bind(this);
3992
- this.changeListener = this.changeListener.bind(this);
3993
- this.mousedownListener = this.mousedownListener.bind(this);
3994
- this.mousewheelListener = this.mousewheelListener.bind(this);
3995
-
3996
- this.changeTimer = lang.delayedCall(function() {
3997
- this.updateCompletions(true);
3998
- }.bind(this));
3999
- };
4000
-
4001
- (function() {
4002
- this.gatherCompletionsId = 0;
4003
-
4004
- this.$init = function() {
4005
- this.popup = new AcePopup(document.body || document.documentElement);
4006
- this.popup.on("click", function(e) {
4007
- this.insertMatch();
4008
- e.stop();
4009
- }.bind(this));
4010
- this.popup.focus = this.editor.focus.bind(this.editor);
4011
- };
4012
-
4013
- this.openPopup = function(editor, prefix, keepPopupPosition) {
4014
- if (!this.popup)
4015
- this.$init();
4016
-
4017
- this.popup.setData(this.completions.filtered);
4018
-
4019
- var renderer = editor.renderer;
4020
- this.popup.setRow(this.autoSelect ? 0 : -1);
4021
- if (!keepPopupPosition) {
4022
- this.popup.setTheme(editor.getTheme());
4023
- this.popup.setFontSize(editor.getFontSize());
4024
-
4025
- var lineHeight = renderer.layerConfig.lineHeight;
4026
-
4027
- var pos = renderer.$cursorLayer.getPixelPosition(this.base, true);
4028
- pos.left -= this.popup.getTextLeftOffset();
4029
-
4030
- var rect = editor.container.getBoundingClientRect();
4031
- pos.top += rect.top - renderer.layerConfig.offset;
4032
- pos.left += rect.left - editor.renderer.scrollLeft;
4033
- pos.left += renderer.$gutterLayer.gutterWidth;
4034
-
4035
- this.popup.show(pos, lineHeight);
4036
- } else if (keepPopupPosition && !prefix) {
4037
- this.detach();
4038
- }
4039
- };
4040
-
4041
- this.detach = function() {
4042
- this.editor.keyBinding.removeKeyboardHandler(this.keyboardHandler);
4043
- this.editor.off("changeSelection", this.changeListener);
4044
- this.editor.off("blur", this.blurListener);
4045
- this.editor.off("mousedown", this.mousedownListener);
4046
- this.editor.off("mousewheel", this.mousewheelListener);
4047
- this.changeTimer.cancel();
4048
-
4049
- if (this.popup && this.popup.isOpen) {
4050
- this.gatherCompletionsId += 1;
4051
- this.popup.hide();
4052
- }
4053
-
4054
- if (this.base)
4055
- this.base.detach();
4056
- this.activated = false;
4057
- this.completions = this.base = null;
4058
- };
4059
-
4060
- this.changeListener = function(e) {
4061
- var cursor = this.editor.selection.lead;
4062
- if (cursor.row != this.base.row || cursor.column < this.base.column) {
4063
- this.detach();
4064
- }
4065
- if (this.activated)
4066
- this.changeTimer.schedule();
4067
- else
4068
- this.detach();
4069
- };
4070
-
4071
- this.blurListener = function() {
4072
- var el = document.activeElement;
4073
- if (el != this.editor.textInput.getElement() && el.parentNode != this.popup.container)
4074
- this.detach();
4075
- };
4076
-
4077
- this.mousedownListener = function(e) {
4078
- this.detach();
4079
- };
4080
-
4081
- this.mousewheelListener = function(e) {
4082
- this.detach();
4083
- };
4084
-
4085
- this.goTo = function(where) {
4086
- var row = this.popup.getRow();
4087
- var max = this.popup.session.getLength() - 1;
4088
-
4089
- switch(where) {
4090
- case "up": row = row <= 0 ? max : row - 1; break;
4091
- case "down": row = row >= max ? -1 : row + 1; break;
4092
- case "start": row = 0; break;
4093
- case "end": row = max; break;
4094
- }
4095
-
4096
- this.popup.setRow(row);
4097
- };
4098
-
4099
- this.insertMatch = function(data) {
4100
- if (!data)
4101
- data = this.popup.getData(this.popup.getRow());
4102
- if (!data)
4103
- return false;
4104
-
4105
- if (data.completer && data.completer.insertMatch) {
4106
- data.completer.insertMatch(this.editor);
4107
- } else {
4108
- if (this.completions.filterText) {
4109
- var ranges = this.editor.selection.getAllRanges();
4110
- for (var i = 0, range; range = ranges[i]; i++) {
4111
- range.start.column -= this.completions.filterText.length;
4112
- this.editor.session.remove(range);
4113
- }
4114
- }
4115
- if (data.snippet)
4116
- snippetManager.insertSnippet(this.editor, data.snippet);
4117
- else
4118
- this.editor.execCommand("insertstring", data.value || data);
4119
- }
4120
- this.detach();
4121
- };
4122
-
4123
- this.commands = {
4124
- "Up": function(editor) { editor.completer.goTo("up"); },
4125
- "Down": function(editor) { editor.completer.goTo("down"); },
4126
- "Ctrl-Up|Ctrl-Home": function(editor) { editor.completer.goTo("start"); },
4127
- "Ctrl-Down|Ctrl-End": function(editor) { editor.completer.goTo("end"); },
4128
-
4129
- "Esc": function(editor) { editor.completer.detach(); },
4130
- "Space": function(editor) { editor.completer.detach(); editor.insert(" ");},
4131
- "Return": function(editor) { return editor.completer.insertMatch(); },
4132
- "Shift-Return": function(editor) { editor.completer.insertMatch(true); },
4133
- "Tab": function(editor) {
4134
- var result = editor.completer.insertMatch();
4135
- if (!result && !editor.tabstopManager)
4136
- editor.completer.goTo("down");
4137
- else
4138
- return result;
4139
- },
4140
-
4141
- "PageUp": function(editor) { editor.completer.popup.gotoPageUp(); },
4142
- "PageDown": function(editor) { editor.completer.popup.gotoPageDown(); }
4143
- };
4144
-
4145
- this.gatherCompletions = function(editor, callback) {
4146
- var session = editor.getSession();
4147
- var pos = editor.getCursorPosition();
4148
-
4149
- var line = session.getLine(pos.row);
4150
- var prefix = util.retrievePrecedingIdentifier(line, pos.column);
4151
-
4152
- this.base = session.doc.createAnchor(pos.row, pos.column - prefix.length);
4153
- this.base.$insertRight = true;
4154
-
4155
- var matches = [];
4156
- var total = editor.completers.length;
4157
- editor.completers.forEach(function(completer, i) {
4158
- completer.getCompletions(editor, session, pos, prefix, function(err, results) {
4159
- if (!err)
4160
- matches = matches.concat(results);
4161
- var pos = editor.getCursorPosition();
4162
- var line = session.getLine(pos.row);
4163
- callback(null, {
4164
- prefix: util.retrievePrecedingIdentifier(line, pos.column, results[0] && results[0].identifierRegex),
4165
- matches: matches,
4166
- finished: (--total === 0)
4167
- });
4168
- });
4169
- });
4170
- return true;
4171
- };
4172
-
4173
- this.showPopup = function(editor) {
4174
- if (this.editor)
4175
- this.detach();
4176
-
4177
- this.activated = true;
4178
-
4179
- this.editor = editor;
4180
- if (editor.completer != this) {
4181
- if (editor.completer)
4182
- editor.completer.detach();
4183
- editor.completer = this;
4184
- }
4185
-
4186
- editor.keyBinding.addKeyboardHandler(this.keyboardHandler);
4187
- editor.on("changeSelection", this.changeListener);
4188
- editor.on("blur", this.blurListener);
4189
- editor.on("mousedown", this.mousedownListener);
4190
- editor.on("mousewheel", this.mousewheelListener);
4191
-
4192
- this.updateCompletions();
4193
- };
4194
-
4195
- this.updateCompletions = function(keepPopupPosition) {
4196
- if (keepPopupPosition && this.base && this.completions) {
4197
- var pos = this.editor.getCursorPosition();
4198
- var prefix = this.editor.session.getTextRange({start: this.base, end: pos});
4199
- if (prefix == this.completions.filterText)
4200
- return;
4201
- this.completions.setFilter(prefix);
4202
- if (!this.completions.filtered.length)
4203
- return this.detach();
4204
- if (this.completions.filtered.length == 1
4205
- && this.completions.filtered[0].value == prefix
4206
- && !this.completions.filtered[0].snippet)
4207
- return this.detach();
4208
- this.openPopup(this.editor, prefix, keepPopupPosition);
4209
- return;
4210
- }
4211
- var _id = this.gatherCompletionsId;
4212
- this.gatherCompletions(this.editor, function(err, results) {
4213
- var detachIfFinished = function() {
4214
- if (!results.finished) return;
4215
- return this.detach();
4216
- }.bind(this);
4217
-
4218
- var prefix = results.prefix;
4219
- var matches = results && results.matches;
4220
-
4221
- if (!matches || !matches.length)
4222
- return detachIfFinished();
4223
- if (prefix.indexOf(results.prefix) !== 0 || _id != this.gatherCompletionsId)
4224
- return;
4225
-
4226
- this.completions = new FilteredList(matches);
4227
- this.completions.setFilter(prefix);
4228
- var filtered = this.completions.filtered;
4229
- if (!filtered.length)
4230
- return detachIfFinished();
4231
- if (filtered.length == 1 && filtered[0].value == prefix && !filtered[0].snippet)
4232
- return detachIfFinished();
4233
- if (this.autoInsert && filtered.length == 1 && results.finished)
4234
- return this.insertMatch(filtered[0]);
4235
-
4236
- this.openPopup(this.editor, prefix, keepPopupPosition);
4237
- }.bind(this));
4238
- };
4239
-
4240
- this.cancelContextMenu = function() {
4241
- this.editor.$mouseHandler.cancelContextMenu();
4242
- };
4243
-
4244
- }).call(Autocomplete.prototype);
4245
-
4246
- Autocomplete.startCommand = {
4247
- name: "startAutocomplete",
4248
- exec: function(editor) {
4249
- if (!editor.completer)
4250
- editor.completer = new Autocomplete();
4251
- editor.completer.autoInsert =
4252
- editor.completer.autoSelect = true;
4253
- editor.completer.showPopup(editor);
4254
- editor.completer.cancelContextMenu();
4255
- },
4256
- bindKey: "Ctrl-Space|Ctrl-Shift-Space|Alt-Space"
4257
- };
4258
-
4259
- var FilteredList = function(array, filterText, mutateData) {
4260
- this.all = array;
4261
- this.filtered = array;
4262
- this.filterText = filterText || "";
4263
- };
4264
- (function(){
4265
- this.setFilter = function(str) {
4266
- if (str.length > this.filterText && str.lastIndexOf(this.filterText, 0) === 0)
4267
- var matches = this.filtered;
4268
- else
4269
- var matches = this.all;
4270
-
4271
- this.filterText = str;
4272
- matches = this.filterCompletions(matches, this.filterText);
4273
- matches = matches.sort(function(a, b) {
4274
- return b.exactMatch - a.exactMatch || b.score - a.score;
4275
- });
4276
- var prev = null;
4277
- matches = matches.filter(function(item){
4278
- var caption = item.snippet || item.caption || item.value;
4279
- if (caption === prev) return false;
4280
- prev = caption;
4281
- return true;
4282
- });
4283
-
4284
- this.filtered = matches;
4285
- };
4286
- this.filterCompletions = function(items, needle) {
4287
- var results = [];
4288
- var upper = needle.toUpperCase();
4289
- var lower = needle.toLowerCase();
4290
- loop: for (var i = 0, item; item = items[i]; i++) {
4291
- var caption = item.value || item.caption || item.snippet;
4292
- if (!caption) continue;
4293
- var lastIndex = -1;
4294
- var matchMask = 0;
4295
- var penalty = 0;
4296
- var index, distance;
4297
- for (var j = 0; j < needle.length; j++) {
4298
- var i1 = caption.indexOf(lower[j], lastIndex + 1);
4299
- var i2 = caption.indexOf(upper[j], lastIndex + 1);
4300
- index = (i1 >= 0) ? ((i2 < 0 || i1 < i2) ? i1 : i2) : i2;
4301
- if (index < 0)
4302
- continue loop;
4303
- distance = index - lastIndex - 1;
4304
- if (distance > 0) {
4305
- if (lastIndex === -1)
4306
- penalty += 10;
4307
- penalty += distance;
4308
- }
4309
- matchMask = matchMask | (1 << index);
4310
- lastIndex = index;
4311
- }
4312
- item.matchMask = matchMask;
4313
- item.exactMatch = penalty ? 0 : 1;
4314
- item.score = (item.score || 0) - penalty;
4315
- results.push(item);
4316
- }
4317
- return results;
4318
- };
4319
- }).call(FilteredList.prototype);
4320
-
4321
- exports.Autocomplete = Autocomplete;
4322
- exports.FilteredList = FilteredList;
4323
-
4324
- });
4325
-
4326
- define("ace/autocomplete/text_completer",["require","exports","module","ace/range"], function(require, exports, module) {
4327
- var Range = require("../range").Range;
4328
-
4329
- var splitRegex = /[^a-zA-Z_0-9\$\-\u00C0-\u1FFF\u2C00-\uD7FF\w]+/;
4330
-
4331
- function getWordIndex(doc, pos) {
4332
- var textBefore = doc.getTextRange(Range.fromPoints({row: 0, column:0}, pos));
4333
- return textBefore.split(splitRegex).length - 1;
4334
- }
4335
- function wordDistance(doc, pos) {
4336
- var prefixPos = getWordIndex(doc, pos);
4337
- var words = doc.getValue().split(splitRegex);
4338
- var wordScores = Object.create(null);
4339
-
4340
- var currentWord = words[prefixPos];
4341
-
4342
- words.forEach(function(word, idx) {
4343
- if (!word || word === currentWord) return;
4344
-
4345
- var distance = Math.abs(prefixPos - idx);
4346
- var score = words.length - distance;
4347
- if (wordScores[word]) {
4348
- wordScores[word] = Math.max(score, wordScores[word]);
4349
- } else {
4350
- wordScores[word] = score;
4351
- }
4352
- });
4353
- return wordScores;
4354
- }
4355
-
4356
- exports.getCompletions = function(editor, session, pos, prefix, callback) {
4357
- var wordScore = wordDistance(session, pos, prefix);
4358
- var wordList = Object.keys(wordScore);
4359
- callback(null, wordList.map(function(word) {
4360
- return {
4361
- caption: word,
4362
- value: word,
4363
- score: wordScore[word],
4364
- meta: "local"
4365
- };
4366
- }));
4367
- };
4368
- });
4369
-
4370
- define("ace/ext/language_tools",["require","exports","module","ace/snippets","ace/autocomplete","ace/config","ace/autocomplete/util","ace/autocomplete/text_completer","ace/editor","ace/config"], function(require, exports, module) {
4371
- "use strict";
4372
-
4373
- var snippetManager = require("../snippets").snippetManager;
4374
- var Autocomplete = require("../autocomplete").Autocomplete;
4375
- var config = require("../config");
4376
- var util = require("../autocomplete/util");
4377
-
4378
- var textCompleter = require("../autocomplete/text_completer");
4379
- var keyWordCompleter = {
4380
- getCompletions: function(editor, session, pos, prefix, callback) {
4381
- var state = editor.session.getState(pos.row);
4382
- var completions = session.$mode.getCompletions(state, session, pos, prefix);
4383
- callback(null, completions);
4384
- }
4385
- };
4386
-
4387
- var snippetCompleter = {
4388
- getCompletions: function(editor, session, pos, prefix, callback) {
4389
- var snippetMap = snippetManager.snippetMap;
4390
- var completions = [];
4391
- snippetManager.getActiveScopes(editor).forEach(function(scope) {
4392
- var snippets = snippetMap[scope] || [];
4393
- for (var i = snippets.length; i--;) {
4394
- var s = snippets[i];
4395
- var caption = s.name || s.tabTrigger;
4396
- if (!caption)
4397
- continue;
4398
- completions.push({
4399
- caption: caption,
4400
- snippet: s.content,
4401
- meta: s.tabTrigger && !s.name ? s.tabTrigger + "\u21E5 " : "snippet"
4402
- });
4403
- }
4404
- }, this);
4405
- callback(null, completions);
4406
- }
4407
- };
4408
-
4409
- var completers = [snippetCompleter, textCompleter, keyWordCompleter];
4410
- exports.addCompleter = function(completer) {
4411
- completers.push(completer);
4412
- };
4413
- exports.textCompleter = textCompleter;
4414
- exports.keyWordCompleter = keyWordCompleter;
4415
- exports.snippetCompleter = snippetCompleter;
4416
-
4417
- var expandSnippet = {
4418
- name: "expandSnippet",
4419
- exec: function(editor) {
4420
- var success = snippetManager.expandWithTab(editor);
4421
- if (!success)
4422
- editor.execCommand("indent");
4423
- },
4424
- bindKey: "Tab"
4425
- };
4426
-
4427
- var onChangeMode = function(e, editor) {
4428
- loadSnippetsForMode(editor.session.$mode);
4429
- };
4430
-
4431
- var loadSnippetsForMode = function(mode) {
4432
- var id = mode.$id;
4433
- if (!snippetManager.files)
4434
- snippetManager.files = {};
4435
- loadSnippetFile(id);
4436
- if (mode.modes)
4437
- mode.modes.forEach(loadSnippetsForMode);
4438
- };
4439
-
4440
- var loadSnippetFile = function(id) {
4441
- if (!id || snippetManager.files[id])
4442
- return;
4443
- var snippetFilePath = id.replace("mode", "snippets");
4444
- snippetManager.files[id] = {};
4445
- config.loadModule(snippetFilePath, function(m) {
4446
- if (m) {
4447
- snippetManager.files[id] = m;
4448
- if (!m.snippets && m.snippetText)
4449
- m.snippets = snippetManager.parseSnippetFile(m.snippetText);
4450
- snippetManager.register(m.snippets || [], m.scope);
4451
- if (m.includeScopes) {
4452
- snippetManager.snippetMap[m.scope].includeScopes = m.includeScopes;
4453
- m.includeScopes.forEach(function(x) {
4454
- loadSnippetFile("ace/mode/" + x);
4455
- });
4456
- }
4457
- }
4458
- });
4459
- };
4460
-
4461
- function getCompletionPrefix(editor) {
4462
- var pos = editor.getCursorPosition();
4463
- var line = editor.session.getLine(pos.row);
4464
- var prefix = util.retrievePrecedingIdentifier(line, pos.column);
4465
- editor.completers.forEach(function(completer) {
4466
- if (completer.identifierRegexps) {
4467
- completer.identifierRegexps.forEach(function(identifierRegex) {
4468
- if (!prefix && identifierRegex)
4469
- prefix = util.retrievePrecedingIdentifier(line, pos.column, identifierRegex);
4470
- });
4471
- }
4472
- });
4473
- return prefix;
4474
- }
4475
-
4476
- var doLiveAutocomplete = function(e) {
4477
- var editor = e.editor;
4478
- var text = e.args || "";
4479
- var hasCompleter = editor.completer && editor.completer.activated;
4480
- if (e.command.name === "backspace") {
4481
- if (hasCompleter && !getCompletionPrefix(editor))
4482
- editor.completer.detach();
4483
- }
4484
- else if (e.command.name === "insertstring") {
4485
- var prefix = getCompletionPrefix(editor);
4486
- if (prefix && !hasCompleter) {
4487
- if (!editor.completer) {
4488
- editor.completer = new Autocomplete();
4489
- }
4490
- editor.completer.autoSelect = false;
4491
- editor.completer.autoInsert = false;
4492
- editor.completer.showPopup(editor);
4493
- }
4494
- }
4495
- };
4496
-
4497
- var Editor = require("../editor").Editor;
4498
- require("../config").defineOptions(Editor.prototype, "editor", {
4499
- enableBasicAutocompletion: {
4500
- set: function(val) {
4501
- if (val) {
4502
- if (!this.completers)
4503
- this.completers = Array.isArray(val)? val: completers;
4504
- this.commands.addCommand(Autocomplete.startCommand);
4505
- } else {
4506
- this.commands.removeCommand(Autocomplete.startCommand);
4507
- }
4508
- },
4509
- value: false
4510
- },
4511
- enableLiveAutocompletion: {
4512
- set: function(val) {
4513
- if (val) {
4514
- if (!this.completers)
4515
- this.completers = Array.isArray(val)? val: completers;
4516
- this.commands.on('afterExec', doLiveAutocomplete);
4517
- } else {
4518
- this.commands.removeListener('afterExec', doLiveAutocomplete);
4519
- }
4520
- },
4521
- value: false
4522
- },
4523
- enableSnippets: {
4524
- set: function(val) {
4525
- if (val) {
4526
- this.commands.addCommand(expandSnippet);
4527
- this.on("changeMode", onChangeMode);
4528
- onChangeMode(null, this);
4529
- } else {
4530
- this.commands.removeCommand(expandSnippet);
4531
- this.off("changeMode", onChangeMode);
4532
- }
4533
- },
4534
- value: false
4535
- }
4536
- });
4537
- });
4538
-
4539
- define("ace/mode/jsoniq",["require","exports","module","ace/worker/worker_client","ace/lib/oop","ace/mode/text","ace/mode/text_highlight_rules","ace/mode/xquery/jsoniq_lexer","ace/range","ace/mode/behaviour/xquery","ace/mode/folding/cstyle","ace/anchor","ace/ext/language_tools"], function(require, exports, module) {
2750
+ define("ace/mode/jsoniq",["require","exports","module","ace/worker/worker_client","ace/lib/oop","ace/mode/text","ace/mode/text_highlight_rules","ace/mode/xquery/jsoniq_lexer","ace/range","ace/mode/behaviour/xquery","ace/mode/folding/cstyle","ace/anchor"], function(require, exports, module) {
4540
2751
  "use strict";
4541
2752
 
4542
2753
  var WorkerClient = require("../worker/worker_client").WorkerClient;
@@ -4548,7 +2759,6 @@ var Range = require("../range").Range;
4548
2759
  var XQueryBehaviour = require("./behaviour/xquery").XQueryBehaviour;
4549
2760
  var CStyleFoldMode = require("./folding/cstyle").FoldMode;
4550
2761
  var Anchor = require("../anchor").Anchor;
4551
- var LanguageTools = require("../ext/language_tools");
4552
2762
 
4553
2763
  var Mode = function() {
4554
2764
  this.$tokenizer = new JSONiqLexer();
@@ -4561,14 +2771,16 @@ oop.inherits(Mode, TextMode);
4561
2771
 
4562
2772
  (function() {
4563
2773
 
4564
- LanguageTools.addCompleter({
2774
+ this.completer = {
4565
2775
  getCompletions: function(editor, session, pos, prefix, callback) {
2776
+ if (!session.$worker)
2777
+ return callback();
4566
2778
  session.$worker.emit("complete", { data: { pos: pos, prefix: prefix } });
4567
2779
  session.$worker.on("complete", function(e){
4568
2780
  callback(null, e.data);
4569
2781
  });
4570
2782
  }
4571
- });
2783
+ };
4572
2784
 
4573
2785
  this.getNextLineIndent = function(state, line, tab) {
4574
2786
  var indent = this.$getIndent(line);