diff --git a/lib/ace/mode/folding/cstyle.js b/lib/ace/mode/folding/cstyle.js index dd151e24..d7541f06 100644 --- a/lib/ace/mode/folding/cstyle.js +++ b/lib/ace/mode/folding/cstyle.js @@ -51,9 +51,48 @@ oop.inherits(FoldMode, BaseFoldMode); this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + // this.startBlockRegionRe = /^\s*\/\*#region\b/; + // this.startLineRegionRe = /^\s*\/\/#region\b/; + this.startRegionRe = /^\s*((\/\*)|(\/\/))#region\b/; + this.getFoldWidgetBase = this.getFoldWidget; + + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row).trim(); + + var isRegionStart = this.startRegionRe.test(line); + + if (line.length > 3 && line.substring(0, 2) === '/*' && line.substring(line.length - 2) === '*/') { + // Don't create fold widgets for single line block comments + // unless its a region start comment, or it starts with 3 stars [/***] + if (line.substring(0, 4) !== '/***' && !isRegionStart /*!this.startBlockRegionRe.test(line)*/) + return ""; + } + + var fw = this.getFoldWidgetBase(session, foldStyle, row); + if (!fw) { + // check for block comment region start + if(isRegionStart) /*if (this.startLineRegionRe.test(line)) */ + return "start"; + } + + return fw; + }; this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { var line = session.getLine(row); + + if(this.startRegionRe.test(line)) + return this.getRegionBlock(session, line, row); + + /*// first check for block comment region + if (this.startBlockRegionRe.test(line)) + return this.getRegionBlock(session, line, row, true); + + // now check for line comment region + if (this.startLineRegionRe.test(line)) + return this.getRegionBlock(session, line, row, false);*/ + + var match = line.match(this.foldingStartMarker); if (match) { var i = match.index; @@ -118,6 +157,30 @@ oop.inherits(FoldMode, BaseFoldMode); return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); }; + + this.getRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*((\/\*)|(\/\/))#(end)?region\b/;// isBlock? /^\s*\/\*#(end)?region\b/ : /^\s*\/\/#(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + var endColumn = line.search(/\S/); + return new Range(startRow, startColumn, endRow, endColumn); + } + }; }).call(FoldMode.prototype); diff --git a/lib/ace/mode/folding/html.js b/lib/ace/mode/folding/html.js index a84f4478..5edbe0b8 100644 --- a/lib/ace/mode/folding/html.js +++ b/lib/ace/mode/folding/html.js @@ -34,7 +34,7 @@ define(function(require, exports, module) { var oop = require("../../lib/oop"); var MixedFoldMode = require("./mixed").FoldMode; var XmlFoldMode = require("./xml").FoldMode; -var CStyleFoldMode = require("./javascript").FoldMode; +var CStyleFoldMode = require("./cstyle").FoldMode; var FoldMode = exports.FoldMode = function(voidElements, optionalTags) { MixedFoldMode.call(this, new XmlFoldMode(voidElements, optionalTags), { diff --git a/lib/ace/mode/javascript.js b/lib/ace/mode/javascript.js index 4e7f0dac..af62ae76 100644 --- a/lib/ace/mode/javascript.js +++ b/lib/ace/mode/javascript.js @@ -38,7 +38,7 @@ var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutd var Range = require("../range").Range; var WorkerClient = require("../worker/worker_client").WorkerClient; var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; -var CStyleFoldMode = require("./folding/javascript").FoldMode; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; var Mode = function() { this.HighlightRules = JavaScriptHighlightRules;