diff --git a/demo/demo.js b/demo/demo.js index 2e09a43c..ee13653e 100644 --- a/demo/demo.js +++ b/demo/demo.js @@ -270,6 +270,10 @@ exports.launch = function(env) { env.editor.setHighlightSelectedWord(checked); }); + bindCheckbox("show_hscroll", function(checked) { + env.editor.renderer.setHScrollBarAlwaysVisible(checked); + }); + function bindCheckbox(id, callback) { var el = document.getElementById(id); var onCheck = function() { diff --git a/index.html b/index.html index 7d0557ce..ede48739 100644 --- a/index.html +++ b/index.html @@ -62,6 +62,10 @@ + + + + diff --git a/lib/ace/document.js b/lib/ace/document.js index 490ee225..e969e158 100644 --- a/lib/ace/document.js +++ b/lib/ace/document.js @@ -174,39 +174,17 @@ var Document = function(text) { if (this.getLength() <= 1) this.$detectNewLine(text); - var newLines = this.$split(text); + var lines = this.$split(text); + var firstLine = lines.splice(0, 1)[0]; + var lastLine = lines.length == 0 ? null : lines.splice(lines.length - 1, 1)[0]; - if (this.isNewLine(text)) { - var end = this.insertNewLine(position); + position = this.insertInLine(position, firstLine); + if (lastLine !== null) { + position = this.insertNewLine(position); // terminate first line + position = this.insertLines(position.row, lines); + position = this.insertInLine(position, lastLine || ""); } - else if (newLines.length == 1) { - var end = this.insertInLine(position, text); - } - else { - if (newLines[0].length > 0) { - var end = this.insertInLine(position, newLines[0]); - this.insertNewLine(end); - } - // If we are inserting at the end of the document, we don't need to - // use insertInLine (concorde depends on this optimization!) - if (position.row + 1 == this.getLength()) { - this.insertLines(position.row + 1, - newLines.slice(1, newLines.length)); - var end = { - row: position.row + newLines.length - 1, - column: position.column + newLines[newLines.length - 1].length - }; - } else { - if (newLines.length > 2) - this.insertLines(position.row + 1, - newLines.slice(1, newLines.length - 1)); - var end = this.insertInLine({ - row: position.row + newLines.length - 1, - column: 0 - }, newLines[newLines.length - 1]); - } - } - return end; + return position; }; this.insertLines = function(row, lines) { diff --git a/lib/ace/edit_session.js b/lib/ace/edit_session.js index a16b5ba4..539ca1f2 100644 --- a/lib/ace/edit_session.js +++ b/lib/ace/edit_session.js @@ -536,15 +536,7 @@ var EditSession = function(text, mode) { this.doc.revertDeltas(deltas); this.$fromUndo = false; - // update the selection - var firstDelta = deltas[0]; - var lastDelta = deltas[deltas.length-1]; - - this.selection.clearSelection(); - if (firstDelta.action == "insertText" || firstDelta.action == "insertLines") - this.selection.moveCursorToPosition(firstDelta.range.start); - if (firstDelta.action == "removeText" || firstDelta.action == "removeLines") - this.selection.setSelectionRange(Range.fromPoints(lastDelta.range.start, firstDelta.range.end)); + this.$setUndoSelection(deltas, true); }, this.redoChanges = function(deltas) { @@ -555,17 +547,55 @@ var EditSession = function(text, mode) { this.doc.applyDeltas(deltas); this.$fromUndo = false; - // update the selection - var firstDelta = deltas[0]; - var lastDelta = deltas[deltas.length-1]; - - this.selection.clearSelection(); - if (firstDelta.action == "insertText" || firstDelta.action == "insertLines") - this.selection.setSelectionRange(Range.fromPoints(firstDelta.range.start, lastDelta.range.end)); - if (firstDelta.action == "removeText" || firstDelta.action == "removeLines") - this.selection.moveCursorToPosition(lastDelta.range.start); + this.$setUndoSelection(deltas, false); }, + this.$setUndoSelection = function(deltas, isUndo) { + // invert deltas is they are an undo + if (isUndo) + deltas = deltas.map(function(delta) { + var d = { + range: delta.range + } + if (delta.action == "insertText" || delta.action == "insertLines") + d.action = "removeText" + else + d.action = "insertText" + return d; + }).reverse(); + + + var actions = [{}]; + + // collapse insert and remove operations + for (var i=0; i= 0 && !/[^\w\d]/.test(needle.charAt(0))) || - (endOuter <= lineCols && !/[^\w\d]/.test(needle.charAt(needle.length - 1)))) + if ((startOuter >= 0 && /^[\w\d]/.test(needle)) || + (endOuter <= lineCols && /[\w\d]$/.test(needle))) return; needle = line.substring(selection.start.column, selection.end.column); if (!/^[\w\d]+$/.test(needle)) return; + var cursor = editor.getCursorPosition(); + var newOptions = { wrap: true, wholeWord: true, + caseSensitive: true, needle: needle }; @@ -117,9 +120,8 @@ var Mode = function() { editor.$search.set(newOptions); var ranges = editor.$search.findAll(session); - session.$selectionOccurrences = []; ranges.forEach(function(range) { - if (!range.contains(selection.start.row, selection.start.column)) { + if (!range.contains(cursor.row, cursor.column)) { var marker = session.addMarker(range, "ace_selected_word"); session.$selectionOccurrences.push(marker); } @@ -135,6 +137,8 @@ var Mode = function() { editor.session.$selectionOccurrences.forEach(function(marker) { editor.session.removeMarker(marker); }); + + editor.session.$selectionOccurrences = []; }; }).call(Mode.prototype); diff --git a/lib/ace/scrollbar.js b/lib/ace/scrollbar.js index dfc3e71e..8862af86 100644 --- a/lib/ace/scrollbar.js +++ b/lib/ace/scrollbar.js @@ -52,7 +52,7 @@ var ScrollBar = function(parent) { parent.appendChild(this.element); this.width = dom.scrollbarWidth(); - this.element.style.width = this.width; + this.element.style.width = this.width + "px"; event.addListener(this.element, "scroll", this.onScroll.bind(this)); }; @@ -69,7 +69,7 @@ var ScrollBar = function(parent) { }; this.setHeight = function(height) { - this.element.style.height = Math.max(0, height - this.width) + "px"; + this.element.style.height = height + "px"; }; this.setInnerHeight = function(height) { diff --git a/lib/ace/search.js b/lib/ace/search.js index aed0a8c5..9df4f6f8 100644 --- a/lib/ace/search.js +++ b/lib/ace/search.js @@ -1,4 +1,5 @@ -/* ***** BEGIN LICENSE BLOCK ***** +/* vim:ts=4:sts=4:sw=4: + * ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version @@ -20,6 +21,7 @@ * * Contributor(s): * Fabian Jakobs + * Mihai Sucan * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or @@ -219,12 +221,16 @@ Search.SELECTION = 2; var lastRow = searchSelection ? range.end.row : session.getLength() - 1; var wrap = this.$options.wrap; + var inWrap = false; function getLine(row) { var line = session.getLine(row); if (searchSelection && row == range.end.row) { line = line.substring(0, range.end.column); } + if (inWrap && row == start.row) { + line = line.substring(0, start.column); + } return line; } @@ -236,6 +242,7 @@ Search.SELECTION = 2; var startIndex = start.column; var stop = false; + inWrap = false; while (!callback(line, startIndex, row)) { @@ -250,6 +257,7 @@ Search.SELECTION = 2; if (wrap) { row = firstRow; startIndex = firstColumn; + inWrap = true; } else { return; } @@ -283,6 +291,7 @@ Search.SELECTION = 2; var line = session.getLine(row).substring(0, start.column); var startIndex = 0; var stop = false; + var inWrap = false; while (!callback(line, startIndex, row)) { @@ -295,6 +304,7 @@ Search.SELECTION = 2; if (row < firstRow) { if (wrap) { row = lastRow; + inWrap = true; } else { return; } @@ -310,6 +320,9 @@ Search.SELECTION = 2; else if (row == lastRow) line = line.substring(0, range.end.column); } + + if (inWrap && row == start.row) + startIndex = start.column; } } }; diff --git a/lib/ace/test/all.js b/lib/ace/test/all.js index 81140835..19101373 100644 --- a/lib/ace/test/all.js +++ b/lib/ace/test/all.js @@ -51,6 +51,7 @@ async.concat( require("./search_test"), require("./selection_test"), require("./text_edit_test"), + require("./highlight_selected_word_test"), require("./mode/css_test"), require("./mode/css_tokenizer_test"), require("./mode/html_test"), diff --git a/lib/ace/test/all_browser.js b/lib/ace/test/all_browser.js index b3976fb4..f3d5638e 100644 --- a/lib/ace/test/all_browser.js +++ b/lib/ace/test/all_browser.js @@ -20,6 +20,7 @@ async.concat( require("./selection_test"), require("./text_edit_test"), require("./virtual_renderer_test"), + require("./highlight_selected_word_test"), require("./mode/css_test"), require("./mode/css_tokenizer_test"), require("./mode/html_test"), @@ -72,4 +73,4 @@ async.concat( ].join("") }) -}); \ No newline at end of file +}); diff --git a/lib/ace/test/edit_session_test.js b/lib/ace/test/edit_session_test.js index f5b72140..3cb061bb 100644 --- a/lib/ace/test/edit_session_test.js +++ b/lib/ace/test/edit_session_test.js @@ -325,6 +325,20 @@ var Test = { assert.equal(session.$wrapData.length, 2); assert.equal(session.$wrapData[0].length, 1); assert.equal(session.$wrapData[1].length, 1); + }, + + "test first line blank with wrap": function() { + var session = new EditSession("\nfoo"); + session.setUseWrapMode(true); + assert.equal(session.doc.getValue(), ["", "foo"].join("\n")); + }, + + "test first line blank with wrap 2" : function() { + var session = new EditSession(""); + session.setUseWrapMode(true); + session.setValue("\nfoo"); + + assert.equal(session.doc.getValue(), ["", "foo"].join("\n")); } }; diff --git a/lib/ace/test/highlight_selected_word_test.js b/lib/ace/test/highlight_selected_word_test.js new file mode 100644 index 00000000..34526333 --- /dev/null +++ b/lib/ace/test/highlight_selected_word_test.js @@ -0,0 +1,212 @@ +/* vim:ts=4:sts=4:sw=4: + * ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Ajax.org Code Editor (ACE). + * + * The Initial Developer of the Original Code is + * Mihai Sucan. + * Portions created by the Initial Developer are Copyright (C) 2010 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Mihai Sucan + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +define(function(require, exports, module) { + +var EditSession = require("ace/edit_session").EditSession, + Editor = require("../editor").Editor, + MockRenderer = require("./mockrenderer"), + TextMode = require("ace/mode/text").Mode, + assert = require("./assertions"), + async = require("asyncjs"); + +var lipsum = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. " + + "Mauris at arcu mi, eu lobortis mauris. Quisque ut libero eget " + + "diam congue vehicula. Quisque ut odio ut mi aliquam tincidunt. " + + "Duis lacinia aliquam lorem eget eleifend. Morbi eget felis mi. " + + "Duis quam ligula, consequat vitae convallis volutpat, blandit " + + "nec neque. Nulla facilisi. Etiam suscipit lorem ac justo " + + "sollicitudin tristique. Phasellus ut posuere nunc. Aliquam " + + "scelerisque mollis felis non gravida. Vestibulum lacus sem, " + + "posuere non bibendum id, luctus non dolor. Aenean id metus " + + "lorem, vel dapibus est. Donec gravida feugiat augue nec " + + "accumsan.Lorem ipsum dolor sit amet, consectetur adipiscing " + + "elit. Nulla vulputate, velit vitae tincidunt congue, nunc " + + "augue accumsan velit, eu consequat turpis lectus ac orci. " + + "Pellentesque ornare dolor feugiat dui auctor eu varius nulla " + + "fermentum. Sed aliquam odio at velit lacinia vel fermentum " + + "felis sodales. In dignissim magna eget nunc lobortis non " + + "fringilla nibh ullamcorper. Donec facilisis malesuada elit " + + "at egestas. Etiam bibendum, diam vitae tempor aliquet, dui " + + "libero vehicula odio, eget bibendum mauris velit eu lorem.\n" + + "consectetur"; + +var Test = { + setUp: function() { + this.session = new EditSession(lipsum); + this.editor = new Editor(new MockRenderer(), this.session); + this.selection = this.session.getSelection(); + this.search = this.editor.$search; + }, + + "test: highlight selected words by default": function() { + assert.equal(this.editor.getHighlightSelectedWord(), true); + }, + + "test: highlight a word": function() { + this.editor.moveCursorTo(0, 9); + this.selection.selectWord(); + + var range = this.selection.getRange(); + assert.equal(this.session.getTextRange(range), "ipsum"); + assert.equal(this.session.$selectionOccurrences.length, 1); + }, + + "test: highlight a word and clear highlight": function() { + this.editor.moveCursorTo(0, 8); + this.selection.selectWord(); + + var range = this.selection.getRange(); + assert.equal(this.session.getTextRange(range), "ipsum"); + assert.equal(this.session.$selectionOccurrences.length, 1); + + this.session.getMode().clearSelectionHighlight(this.editor); + assert.equal(this.session.$selectionOccurrences.length, 0); + }, + + "test: highlight another word": function() { + this.selection.moveCursorTo(0, 14); + this.selection.selectWord(); + + var range = this.selection.getRange(); + assert.equal(this.session.getTextRange(range), "dolor"); + assert.equal(this.session.$selectionOccurrences.length, 3); + }, + + "test: no selection, no highlight": function() { + this.selection.clearSelection(); + assert.equal(this.session.$selectionOccurrences.length, 0); + }, + + "test: select a word, no highlight": function() { + this.editor.setHighlightSelectedWord(false); + this.selection.moveCursorTo(0, 14); + this.selection.selectWord(); + + var range = this.selection.getRange(); + assert.equal(this.session.getTextRange(range), "dolor"); + assert.equal(this.session.$selectionOccurrences.length, 0); + }, + + "test: select a word with no matches": function() { + this.editor.setHighlightSelectedWord(true); + + var currentOptions = this.search.getOptions(); + var newOptions = { + wrap: true, + wholeWord: true, + caseSensitive: true, + needle: "Mauris" + }; + this.search.set(newOptions); + + var match = this.search.find(this.session); + assert.notEqual(match, null, "found a match for 'Mauris'"); + + this.search.set(currentOptions); + + this.selection.setSelectionRange(match); + + assert.equal(this.session.getTextRange(match), "Mauris"); + assert.equal(this.session.$selectionOccurrences.length, 0); + }, + + "test: partial word selection 1": function() { + this.selection.moveCursorTo(0, 14); + this.selection.selectWord(); + this.selection.selectLeft(); + + var range = this.selection.getRange(); + assert.equal(this.session.getTextRange(range), "dolo"); + assert.equal(this.session.$selectionOccurrences.length, 0); + }, + + "test: partial word selection 2": function() { + this.selection.moveCursorTo(0, 13); + this.selection.selectWord(); + this.selection.selectRight(); + + var range = this.selection.getRange(); + assert.equal(this.session.getTextRange(range), "dolor "); + assert.equal(this.session.$selectionOccurrences.length, 0); + }, + + "test: partial word selection 3": function() { + this.selection.moveCursorTo(0, 14); + this.selection.selectWord(); + this.selection.selectLeft(); + this.selection.shiftSelection(1); + + var range = this.selection.getRange(); + assert.equal(this.session.getTextRange(range), "olor"); + assert.equal(this.session.$selectionOccurrences.length, 0); + }, + + "test: select last word": function() { + this.selection.moveCursorTo(0, 1); + + var currentOptions = this.search.getOptions(); + var newOptions = { + wrap: true, + wholeWord: true, + caseSensitive: true, + backwards: true, + needle: "consectetur" + }; + this.search.set(newOptions); + + var match = this.search.find(this.session); + assert.notEqual(match, null, "found a match for 'consectetur'"); + assert.position(match.start, 1, 0); + + this.search.set(currentOptions); + + this.selection.setSelectionRange(match); + + assert.equal(this.session.getTextRange(match), "consectetur"); + assert.equal(this.session.$selectionOccurrences.length, 2); + }, +}; + +module.exports = require("asyncjs/test").testcase(Test); +}); + +if (typeof module !== "undefined" && module === require.main) { + require("../../../support/paths"); + exports.exec() +} diff --git a/lib/ace/test/search_test.js b/lib/ace/test/search_test.js index 3bd0a05f..0f9c89e9 100644 --- a/lib/ace/test/search_test.js +++ b/lib/ace/test/search_test.js @@ -20,6 +20,7 @@ * * Contributor(s): * Fabian Jakobs + * Mihai Sucan * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or @@ -341,7 +342,52 @@ var Test = { assert.equal(search.replace("ab12", "cd$1"), "cd12"); assert.equal(search.replace("ab12", "-$&-"), "-ab12-"); assert.equal(search.replace("ab12", "$$"), "$"); - } + }, + + "test: find all matches in a line" : function() { + var session = new EditSession("foo bar foo baz foobar foo"); + + var search = new Search().set({ + needle: "foo", + wrap: true, + wholeWord: true, + }); + + session.getSelection().moveCursorTo(0, 4); + + var ranges = search.findAll(session); + + assert.equal(ranges.length, 3); + assert.position(ranges[0].start, 0, 8); + assert.position(ranges[0].end, 0, 11); + assert.position(ranges[1].start, 0, 23); + assert.position(ranges[1].end, 0, 26); + assert.position(ranges[2].start, 0, 0); + assert.position(ranges[2].end, 0, 3); + }, + + "test: find all matches in a line backwards" : function() { + var session = new EditSession("foo bar foo baz foobar foo"); + + var search = new Search().set({ + needle: "foo", + wrap: true, + wholeWord: true, + backwards: true, + }); + + session.getSelection().moveCursorTo(0, 13); + + var ranges = search.findAll(session); + + assert.equal(ranges.length, 3); + assert.position(ranges[0].start, 0, 8); + assert.position(ranges[0].end, 0, 11); + assert.position(ranges[1].start, 0, 0); + assert.position(ranges[1].end, 0, 3); + assert.position(ranges[2].start, 0, 23); + assert.position(ranges[2].end, 0, 26); + }, }; module.exports = require("asyncjs/test").testcase(Test) diff --git a/lib/ace/virtual_renderer.js b/lib/ace/virtual_renderer.js index 952a20a4..2f1ab138 100644 --- a/lib/ace/virtual_renderer.js +++ b/lib/ace/virtual_renderer.js @@ -88,6 +88,10 @@ var VirtualRenderer = function(container, theme) { this.$cursorLayer = new CursorLayer(this.content); this.$cursorPadding = 8; + // Indicates whether the horizontal scrollbar is visible + this.$horizScroll = true; + this.$horizScrollAlwaysVisible = true; + this.scrollBar = new ScrollBar(container); this.scrollBar.addEventListener("scroll", this.onScroll.bind(this)); @@ -199,7 +203,7 @@ var VirtualRenderer = function(container, theme) { this.$size.height = height; this.scroller.style.height = height + "px"; - this.scrollBar.setHeight(height); + this.scrollBar.setHeight(this.scroller.clientHeight); if (this.session) { this.scrollToY(this.getScrollTop()); @@ -361,6 +365,14 @@ var VirtualRenderer = function(container, theme) { this.$updatePrintMargin(); }; + this.setHScrollBarAlwaysVisible = function(alwaysVisible) { + if (this.$horizScrollAlwaysVisible != alwaysVisible) { + this.$horizScrollAlwaysVisible = alwaysVisible; + if (!this.$horizScrollAlwaysVisible || !this.$horizScroll) + this.$loop.schedule(this.CHANGE_SCROLL); + } + } + this.onScroll = function(e) { this.scrollToY(e.data); }; @@ -446,6 +458,12 @@ var VirtualRenderer = function(container, theme) { var longestLine = this.$getLongestLine(); var widthChanged = !this.layerConfig ? true : (this.layerConfig.width != longestLine); + var horizScroll = this.$horizScrollAlwaysVisible || this.$size.scrollerWidth - longestLine < 0; + var horizScrollChanged = this.$horizScroll !== horizScroll; + this.$horizScroll = horizScroll; + if (horizScrollChanged) + this.scroller.style.overflowX = horizScroll ? "scroll" : "hidden"; + var lineCount = Math.ceil(minHeight / this.lineHeight) - 1; var firstRow = Math.max(0, Math.round((this.scrollTop - offset) / this.lineHeight)); var lastRow = firstRow + lineCount; @@ -480,6 +498,11 @@ var VirtualRenderer = function(container, theme) { this.content.style.marginTop = (-offset) + "px"; this.content.style.width = longestLine + "px"; this.content.style.height = minHeight + "px"; + + // Horizontal scrollbar visibility may have changed, which changes + // the client height of the scroller + if (horizScrollChanged) + this.onResize(true); }; this.$updateLines = function() { @@ -559,6 +582,10 @@ var VirtualRenderer = function(container, theme) { }; this.scrollCursorIntoView = function() { + // the editor is not visible + if (this.$size.scrollerHeight === 0) + return; + var pos = this.$cursorLayer.getPixelPosition(); var left = pos.left + this.$padding; diff --git a/support/pilot b/support/pilot index 3028dbab..6e1fbe1d 160000 --- a/support/pilot +++ b/support/pilot @@ -1 +1 @@ -Subproject commit 3028dbabffa2f16cbfd45cd5709baa1c34e0ba4d +Subproject commit 6e1fbe1dfdff64020f15cd9e23ea72b7803cf406 diff --git a/tool/theme.tmpl.js b/tool/theme.tmpl.js index 38a23553..3c965dac 100644 --- a/tool/theme.tmpl.js +++ b/tool/theme.tmpl.js @@ -1,11 +1,48 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Ajax.org Code Editor (ACE). + * + * The Initial Developer of the Original Code is + * Ajax.org B.V. + * Portions created by the Initial Developer are Copyright (C) 2010 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Fabian Jakobs + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + define(function(require, exports, module) { + var dom = require("pilot/dom"); + var cssText = %css%; // import CSS once dom.importCssString(cssText); - return { - cssClass: "%cssClass%" - }; -}) \ No newline at end of file + exports.cssClass = "%cssClass%"; +}); \ No newline at end of file diff --git a/tool/tmtheme.js b/tool/tmtheme.js index fcb7b121..018594eb 100644 --- a/tool/tmtheme.js +++ b/tool/tmtheme.js @@ -159,17 +159,17 @@ function fillTemplate(template, replacements) { } function createTheme(name, styles, cssTemplate, jsTemplate) { - styles.cssClass = "ace" + hyphenate(name); + styles.cssClass = "ace-" + hyphenate(name); var css = fillTemplate(cssTemplate, styles); return fillTemplate(jsTemplate, { name: name, css: '"' + css.replace(/\\/, "\\\\").replace(/"/g, '\\"').replace(/\n/g, "\\\n") + '"', - cssClass: "ace" + hyphenate(name) + cssClass: "ace-" + hyphenate(name) }); }; function hyphenate(str) { - return str.replace(/([A-Z])/g, "-$1").toLowerCase(); + return str.replace(/([A-Z])/g, "-$1").replace("_", "-").toLowerCase(); } var cssTemplate = fs.readFileSync(__dirname + "/Theme.tmpl.css", "utf8"); @@ -192,5 +192,5 @@ for (var name in themes) { var tmTheme = fs.readFileSync(__dirname + "/tmthemes/" + themes[name] + ".tmTheme", "utf8"); var styles = extractStyles(parseTheme(tmTheme)); - fs.writeFileSync(__dirname + "/../src/ace/theme/" + name + ".js", createTheme(name, styles, cssTemplate, jsTemplate)); + fs.writeFileSync(__dirname + "/../lib/ace/theme/" + name + ".js", createTheme(name, styles, cssTemplate, jsTemplate)); }