Beispiel #1
0
            annos.forEach(function(anno) {
                // Certain annotations can temporarily be disabled
                if (disabledMarkerTypes[anno.type])
                    return;
                if (ignoreInfoMarkers && anno.type == "info")
                    return;
                // Multi-line markers are not supported, and typically are a result from a bad error recover, ignore
                if (anno.pos.el && anno.pos.sl !== anno.pos.el)
                    return;
                
                var pos = anno.pos || {};
                
                if (pos.sl > lastLine)
                    pos.sl = lastLine;
                
                if (pos.sc > MAX_COLUMN)
                    return;
                
                var range = new Range(pos.sl, pos.sc || 0, pos.el, pos.ec || 0);
                if (anno.type == "occurrence_other" || anno.type == "occurrence_main") {
                    if (!showOccurenceMarkers) {
                        if (showOccurenceMarkers === false)
                            return;
                        if (range.containsRange(sel))
                            showOccurenceMarkers = true;
                        occurrenceMarkers.push(mySession.markerAnchors.length);
                    }
                }

                mySession.markerAnchors.push(anno);
                
                anno.start = new SimpleAnchor(pos.sl, pos.sc);
                
                if (pos.sc !== undefined && pos.ec !== undefined) {
                    anno.range = range;
                    anno.id = mySession.addMarker(anno.range, "language_highlight_" + (anno.type ? anno.type : "default"));
                    anno.range.start = anno.start;
                    anno.colDiff = pos.ec - pos.sc;
                    anno.rowDiff = pos.el - pos.sl;
                }

                try {
                    if (!anno.message || anno.message.match(ignoredMarkers))
                        return;
                }
                catch (e) {
                    showError("Illegal ignore message filter: " + e.message);
                }
                var gutterAnno = {
                    guttertext: anno.message,
                    type: anno.type || anno.level || "warning",
                    text: anno.message,
                    pos: anno.pos,
                    resolutions: anno.resolutions,
                    row: pos.sl
                };
                anno.gutterAnno = gutterAnno;
                mySession.languageAnnos.push(gutterAnno);
            });
Beispiel #2
0
    setState : function(doc, state){
        var aceDoc = doc ? doc.acesession : this.getDocument();
        if (!aceDoc || !state || typeof aceDoc.getSelection != "function")
            return;

        var sel = aceDoc.getSelection();

        //are those 3 lines set the values in per document base or are global for editor
        sel.setSelectionRange(state.selection, false);

        aceDoc.setScrollTop(state.scrolltop);
        aceDoc.setScrollLeft(state.scrollleft);

        if (state.folds) {
            for (var i = 0, l=state.folds.length; i < l; i++) {
                var fold = state.folds[i];
                aceDoc.addFold(fold.placeholder, Range.fromPoints(fold.start, fold.end));
            }
        }

        // if newfile == 1 and there is text cached, restore it
        var node = doc.getNode && doc.getNode();
        if (node && parseInt(node.getAttribute("newfile") || 0, 10) === 1 && node.childNodes.length) {
            // the text is cached within a CDATA block as first childNode of the <file>
            if (doc.getNode().childNodes[0] instanceof CDATASection) {
                aceDoc.setValue(doc.getNode().childNodes[0].nodeValue);
            }
        }
    },
 tabstops.forEach(function(ts, index) {
     var dest = this.$openTabstops[index] || ts;
         
     for (var i = ts.length; i--;) {
         var p = ts[i];
         var range = Range.fromPoints(p.start, p.end || p.start);
         movePoint(range.start, start);
         movePoint(range.end, start);
         range.original = p;
         range.tabstop = dest;
         ranges.push(range);
         if (dest != ts)
             dest.unshift(range);
         else
             dest[i] = range;
         if (p.fmtString) {
             range.linked = true;
             dest.hasLinkedRanges = true;
         } else if (!dest.firstNonLinked)
             dest.firstNonLinked = range;
     }
     if (!dest.firstNonLinked)
         dest.hasLinkedRanges = false;
     if (dest === ts) {
         arg.push(dest);
         this.$openTabstops[index] = dest;
     }
     this.addTabstopMarkers(dest);
 }, this);
Beispiel #4
0
 function updateFloat(single) {
     if (markerId)
         mySession.removeMarker(markerId);
     gutterAnno.row = anchor.row;
     if (anno.pos.sc !== undefined && anno.pos.ec !== undefined) {
         var range = Range.fromPoints(anchor.getPosition(), {
             row: anchor.row + rowDiff,
             column: anchor.column + colDiff
         });
         markerId = mySession.addMarker(range, "language_highlight_" + (anno.type ? anno.type : "default"));
     }
     if (single) mySession.setAnnotations(mySession.languageAnnos);
 }
Beispiel #5
0
    beautify: function () {
        if (this.disabled === true)
            return;

        var editor = editors.currentEditor;

        var sel = editor.getSelection();
        var doc = editor.getDocument();
        var range = sel.getRange();
        var value = doc.getTextRange(range);

        // Load up current settings data
        var preserveEmpty = apf.isTrue(extSettings.model.queryValue("beautify/jsbeautify/@preserveempty"));
        var keepIndentation = apf.isTrue(extSettings.model.queryValue("beautify/jsbeautify/@keeparrayindentation"));
        var jsLintHappy = apf.isTrue(extSettings.model.queryValue("beautify/jsbeautify/@jslinthappy"));
        var braces = extSettings.model.queryValue("beautify/jsbeautify/@braces") || "end-expand";
        var indentSize = extSettings.model.queryValue("editors/code/@tabsize");
        var indentTab = apf.isTrue(extSettings.model.queryValue("editors/code/@softtabs")) ? " " : "\t";

        if (indentTab == "\t") indentSize = 1;

        var line = doc.getLine(range.start.row);
        var indent = line.match(/^\s*/)[0];
        var trim = false;

        if (range.start.column < indent.length)
            range.start.column = 0;
        else
            trim = true;

        try {
            value = jsbeautify.js_beautify(value, {
                indent_size: indentSize,
                indent_char: indentTab,
                preserve_newlines: preserveEmpty,
                keep_array_indentation: keepIndentation,
                brace_style: braces,
                jslint_happy: jsLintHappy
            });
            value = value.replace(/^/gm, indent);
            if (trim) value = value.trim();
        }
        catch (e) {
            util.alert("Error", "This code could not be beautified", "Please correct any JavaScript errors and try again");
            return;
        }

        var end = doc.replace(range, value);
        sel.setSelectionRange(Range.fromPoints(range.start, end));
    },
Beispiel #6
0
    this.addTabstops = function(tabstops, start, end) {
        if (!this.$openTabstops)
            this.$openTabstops = [];
        if (!tabstops[0]) {
            var p = Range.fromPoints(end, end);
            moveRelative(p.start, start);
            moveRelative(p.end, start);
            tabstops[0] = [p];
            tabstops[0].index = 0;
        }

        var i = this.index;
        var arg = [i + 1, 0];
        var ranges = this.ranges;
        tabstops.forEach(function(ts, index) {
            var dest = this.$openTabstops[index] || ts;
                
            for (var i = ts.length; i--;) {
                var p = ts[i];
                var range = Range.fromPoints(p.start, p.end || p.start);
                movePoint(range.start, start);
                movePoint(range.end, start);
                range.original = p;
                range.tabstop = dest;
                ranges.push(range);
                if (dest != ts)
                    dest.unshift(range);
                else
                    dest[i] = range;
                if (p.fmtString) {
                    range.linked = true;
                    dest.hasLinkedRanges = true;
                } else if (!dest.firstNonLinked)
                    dest.firstNonLinked = range;
            }
            if (!dest.firstNonLinked)
                dest.hasLinkedRanges = false;
            if (dest === ts) {
                arg.push(dest);
                this.$openTabstops[index] = dest;
            }
            this.addTabstopMarkers(dest);
        }, this);
        
        if (arg.length > 2) {
            if (this.tabstops.length)
                arg.push(arg.splice(2, 1)[0]);
            this.tabstops.splice.apply(this.tabstops, arg);
        }
    };
Beispiel #7
0
 editor.selection.fromJSON(data.map(function(x) {
     var start = {row: x[0], column: x[1]};
     var end = x.length == 2 ? start : {row: x[2], column: x[3]};
     var isBackwards = Range.comparePoints(start, end) > 0;
     return isBackwards ? {
         start: end,
         end: start,
         isBackwards: true
     } : {
         start: start,
         end: end,
         isBackwards: true
     };
 }));
Beispiel #8
0
   this.getFoldWidgetRange = function(session, foldStyle, row) {
      var foldToken = this.$getFoldToken(session, foldStyle, row);
      if (!foldToken)
         return;

      var pos = {row: row, column: foldToken.column + 1};

      if (foldToken.value == '{') {
         var end = session.$findClosingBracket(foldToken.value, pos);
         if (!end)
            return;
         return Range.fromPoints(pos, end);
      }
      else if (foldToken.value == '}') {
         var start = session.$findOpeningBracket(foldToken.value, pos);
         if (!start)
            return;
         return Range.fromPoints({row: start.row, column: start.column+1},
                                 {row: pos.row, column: pos.column-1});
      }

      return;
   };
Beispiel #9
0
now.c_updateCollabCursor    = function(id, name, range, changedByUser){
  if(id == now.core.clientId){
    return;
  }
  var cInfo = allCollabInfo[id];
  if(cInfo == undefined){
    // first time seeing this user!
    allCollabInfo[id] = [];
    cInfo = allCollabInfo[id];
    cInfo['name'] = name;
    // let collaborator know I'm here.
    ifOnlineLetCollaboratorsKnowImHere();
  } 
  cInfo['timeLastSeen'] = (new Date()).getTime();
  var ses = editor.getSession();
  var rSel = Range.fromPoints(range.start, range.end);
  var rCur = Range.fromPoints(range.start, {row: range.start.row, column: range.start.column+1});
  var lastSelID = cInfo['lastSelectionMarkerID'];
  if(lastSelID !== undefined){
     ses.removeMarker(lastSelID);
  }
  var lastCursorID = cInfo['lastCursorMarkerID'];
  if(lastCursorID !== undefined){
     ses.removeMarker(lastCursorID);
  }
  var uid = id;
  if(name.indexOf("_") > 0){
    uid = parseInt(name.substring(name.indexOf("_")+1), 10);
  }
  var userColor = userColorMap[uid%userColorMap.length];
  cInfo['lastSelectionMarkerID'] = ses.addMarker(rSel, "collab_selection", "line", false); // range, clazz, type/fn(), inFront
  cInfo['lastCursorMarkerID']    = ses.addMarker(rCur, "collab_cursor", function(html, range, left, top, config){
    html.push("<div class='collab_cursor' style='top: "+top+"px; left: "+left+"px; border-left-color: "+userColor+"; border-bottom-color: "+userColor+";'><div class='collab_cursor_nametag' style='background: "+userColor+";'>&nbsp;"+cInfo['name']+"&nbsp;<div class='collab_cursor_nametagFlag' style='border-right-color: "+userColor+"; border-bottom-color: "+userColor+";'></div></div>&nbsp;</div>");  
  }, false); // range, clazz, type, inFront
  cInfo['isShown'] = true;  
}
Beispiel #10
0
    this.applyDeltas = function(deltas) {
        for (var i=0; i<deltas.length; i++) {
            var delta = deltas[i];
            var range = Range.fromPoints(delta.range.start, delta.range.end);

            if (delta.action == "insertLines")
                this.insertLines(range.start.row, delta.lines)
            else if (delta.action == "insertText")
                this.insert(range.start, delta.text)
            else if (delta.action == "removeLines")
                this.removeLines(range.start.row, range.end.row - 1)
            else if (delta.action == "removeText")
                this.remove(range)
        }
    };
Beispiel #11
0
    this.revertDeltas = function(deltas) {
        for (var i=deltas.length-1; i>=0; i--) {
            var delta = deltas[i];
            var range = Range.fromPoints(delta.range.start, delta.range.end);

            if (delta.action == "insertLines")
                this.removeLines(range.start.row, range.end.row)
            else if (delta.action == "insertText")
                this.remove(range)
            else if (delta.action == "removeLines")
                this.insertLines(range.start.row, delta.lines)
            else if (delta.action == "removeText")
                this.insert(range.start, delta.text)
        }
    };
Beispiel #12
0
 replaceContent: function(value, start, end, noIndent) {
     if (end == null)
         end = start == null ? this.getContent().length : start;
     if (start == null)
         start = 0;        
     
     var editor = this.ace;
     var range = Range.fromPoints(editor.indexToPosition(start), editor.indexToPosition(end));
     editor.session.remove(range);
     
     range.end = range.start;
     
     value = this.$updateTabstops(value);
     snippetManager.insertSnippet(editor, value)
 },
     editor.session.remove(range);
     
     range.end = range.start;
     
     value = this.$updateTabstops(value);
     snippetManager.insertSnippet(editor, value)
 },
 getContent: function(){
     return this.ace.getValue();
 },
 getSyntax: function() {
     if (this.$syntax)
         return this.$syntax;
     var syntax = this.ace.session.$modeId.split("/").pop();
     if (syntax == "html" || syntax == "php") {
         var cursor = this.ace.getCursorPosition();
Beispiel #14
0
    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<deltas.length; i++) {
            var delta = deltas[i];
            var isInsert = delta.action == "insertText" || delta.action == "insertLines";
            var action = actions[actions.length-1];
            if (action.isInsert !== isInsert) {
                actions.push({
                    isInsert: isInsert,
                    start: isInsert ? delta.range.start : delta.range.end,
                    end: isInsert ? delta.range.end : delta.range.start
                })
            }
            else {
                if (isInsert)    
                    action.end = delta.range.end;
                else
                    action.start = delta.range.start;
            }
        }

        // update selection based on last operation
        this.selection.clearSelection();
        var action = actions[actions.length-1];
        if (action.isInsert) 
            this.selection.setSelectionRange(Range.fromPoints(action.start, action.end));
        else 
            this.selection.moveCursorToPosition(action.end);
    },
Beispiel #15
0
 /**
  * @constructor
  * Subclass of HTMLSimpleDOM.Builder that builds an updated DOM after changes have been made,
  * and maps nodes from the new DOM to the old DOM by tag ID. For non-structural edits, avoids reparsing
  * the whole session. Also updates marks in the session based on the new DOM state.
  *
  * @param {Object} previousDOM The root of the HTMLSimpleDOM tree representing a previous state of the DOM.
  * @param {session} session The session containing the instrumented HTML.
  * @param {Array=} changeList An optional list of CodeMirror change records representing the
  *     edits the user made in the session since previousDOM was built. If provided, and the
  *     edits are not structural, DOMUpdater will do a fast incremental reparse. If not provided,
  *     or if one of the edits changes the DOM structure, DOMUpdater will reparse the whole DOM.
  */
 function DOMUpdater(previousDOM, session, delta) {
     var text, startOffset = 0, startOffsetPos;
     
     this.isIncremental = false;
     
     if (delta) {
         text = delta.text;
         if (typeof text != "string")
             text = delta.lines.join("\n");
         if (previousDOM) 
             updatePositions(previousDOM, delta);
     }
     
     // If the inserted or removed text doesn't have any characters that could change the
     // structure of the DOM (e.g. by adding or removing a tag boundary), then we can do
     // an incremental reparse of just the parent tag containing the edit. This should just
     // be the marked range that contains the beginning of the edit range, since that position
     // isn't changed by the edit.
     if (text && !isDangerousEdit(text)) {
         // If the edit is right at the beginning or end of a tag, we want to be conservative
         // and use the parent as the edit range.
         var startNode = _getNodeAtDocumentPos(session, delta.start, true);
         if (startNode) {
             var range = Range.fromPoints(startNode.startPos, startNode.endPos);
             if (range) {
                 text = session.getTextRange(range);
                 this.changedTagID = startNode.tagID;
                 startOffsetPos = startNode.startPos;
                 startOffset = session.doc.positionToIndex(startOffsetPos);
                 this.isIncremental = true;
             }
         }
     }
     
     
     if (!this.changedTagID) {
         // We weren't able to incrementally update, so just rebuild and diff everything.
         text = session.getValue();
     } 
     
     HTMLSimpleDOM.Builder.call(this, text, startOffset, startOffsetPos);
     this.session = session;
     this.cm = session._codeMirror;
     this.previousDOM = previousDOM;
 }
    this.redoChanges = function(deltas) {
        if (!deltas.length)
            return;

        this.$fromUndo = true;
        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);
    },
Beispiel #17
0
 d.forEach(function(chunk) {
     var op = chunk[0];
     var text = chunk[1];
     
     if (op === 0) {
         i += text.length;
     }
     else if (op === -1) {
         doc.remove(Range.fromPoints(
             doc.indexToPosition(i),
             doc.indexToPosition(i + text.length)
         ));
     }
     else if (op === 1) {
         doc.insert(doc.indexToPosition(i), text);
         i += text.length;
     }
 });
Beispiel #18
0
   addExpansionRule("matching", false, function(editor, session, selection, range) {

      // Look for matching bracket pairs. Note that this block does not
      // immediately return if a candidate range is found -- if the expansion
      // spans new rows, we may instead choose to just expand the current
      // selection to fill both the start and end rows.
      var iterator = new TokenIterator(session);
      var token = iterator.moveToPosition(range.start);
      do
      {
         if (token == null)
            break;

         if (iterator.bwdToMatchingToken())
            continue;

         if (Utils.isOpeningBracket(token.value) ||
             token.type === "support.function.codebegin")
         {
            var startPos = iterator.getCurrentTokenPosition();
            if (token.type === "support.function.codebegin") {
               startPos.row++;
               startPos.column = 0;
            } else {
               startPos.column += token.value.length;
            }

            var clone = iterator.clone();
            if (clone.fwdToMatchingToken()) {
               var endPos = clone.getCurrentTokenPosition();
               if (token.type === "support.function.codebegin") {
                   endPos.row--;
                   endPos.column = session.getLine(endPos.row).length;
               }
               return Range.fromPoints(startPos, endPos);
            }

         }
      }
      while ((token = iterator.stepBackward()))

      return null;

   });
 tabstops.forEach(function (ts) {
     for (var i = ts.length; i--;) {
         var p = ts[i];
         var range = Range.fromPoints(p.start, p.end || p.start);
         movePoint(range.start, start);
         movePoint(range.end, start);
         range.original = p;
         range.tabstop = ts;
         ranges.push(range);
         ts[i] = range;
         if (p.fmtString) {
             range.linked = true;
             ts.hasLinkedRanges = true;
         } else if (!ts.firstNonLinked) ts.firstNonLinked = range;
     }
     if (!ts.firstNonLinked) ts.hasLinkedRanges = false;
     arg.push(ts);
     this.addTabstopMarkers(ts);
 }, this);
Beispiel #20
0
    this.insertNewLine = function(position) {
        position = this.$clipPosition(position);
        var line = this.$lines[position.row] || "";
        this.$lines[position.row] = line.substring(0, position.column);
        this.$lines.splice(position.row + 1, 0, line.substring(position.column, line.length));

        var end = {
            row : position.row + 1,
            column : 0
        };

        var delta = {
            action: "insertText",
            range: Range.fromPoints(position, end),
            text: this.getNewLineCharacter()
        };
        this._dispatchEvent("change", { data: delta });

        return end;
    };
    };
    this.removeTabstopMarkers = function(ts) {
        var session = this.editor.session;
        ts.forEach(function(range) {
            session.removeMarker(range.markerId);
            range.markerId = null;
        });
    };
    this.removeRange = function(range) {
        var i = range.tabstop.indexOf(range);
        range.tabstop.splice(i, 1);
        i = this.ranges.indexOf(range);
        this.ranges.splice(i, 1);
        this.editor.session.removeMarker(range.markerId);
    };

    this.keyboardHandler = new HashHandler();
    this.keyboardHandler.bindKeys({
        "Tab": function(ed) {
            ed.tabstopManager.tabNext(1);
        },
Beispiel #22
0
    format : function(indent){
        var editor = editors.currentEditor;

        var sel   = editor.getSelection();
        var doc   = editor.getDocument();
        var range = sel.getRange();
        var value = doc.getTextRange(range);
        try {
            value = JSON.stringify(JSON.parse(value), null, indent);
        }
        catch (e) {
            util.alert(
                "Invalid JSON", 
                "The selection contains an invalid or incomplete JSON string",
                "Please correct the JSON and try again");
            return;
        }
        
        var end = doc.replace(range, value);
        sel.setSelectionRange(Range.fromPoints(range.start, end));
    },
Beispiel #23
0
   addExpansionRule("scope", false, function(editor, session, selection, range) {

      var mode = session.getMode();
      if (mode.codeModel == null || mode.codeModel.getCurrentScope == null)
         return null;

      var candidates = [];

      var scope = mode.codeModel.getCurrentScope(range.start);
      while (scope != null)
      {
         var startPos = scope.preamble;
         var endPos = scope.end;

         if (endPos == null && scope.parentScope)
         {
            var siblings = scope.parentScope.$children;
            for (var i = siblings.length - 2; i >= 0; i--)
            {
               if (siblings[i].equals(scope))
               {
                  endPos = siblings[i + 1].preamble;
                  break;
               }
            }
         }

         if (endPos == null)
            endPos = {row: session.getLength(), column: 0};

         candidates.push(Range.fromPoints(startPos, endPos));
         scope = scope.parentScope;
      }

      if (candidates.length === 0)
         return null;

      return candidates;

   });
                ts.hasLinkedRanges = false;
            arg.push(ts);
            this.addTabstopMarkers(ts);
        }, this);
        arg.push(arg.splice(2, 1)[0]);
        this.tabstops.splice.apply(this.tabstops, arg);
    };

    this.addTabstopMarkers = function(ts) {
        var session = this.editor.session;
        ts.forEach(function(range) {
            if  (!range.markerId)
                range.markerId = session.addMarker(range, "ace_snippet-marker", "text");
        });
    };
    this.removeTabstopMarkers = function(ts) {
        var session = this.editor.session;
        ts.forEach(function(range) {
            session.removeMarker(range.markerId);
            range.markerId = null;
        });
    };
    this.removeRange = function(range) {
        var i = range.tabstop.indexOf(range);
        range.tabstop.splice(i, 1);
        i = this.ranges.indexOf(range);
        this.ranges.splice(i, 1);
        this.editor.session.removeMarker(range.markerId);
    };

    this.keyboardHandler = new HashHandler();
    this.keyboardHandler.bindKeys({
        "Tab": function(ed) {
            ed.tabstopManager.tabNext(1);
        },
        "Shift-Tab": function(ed) {
            ed.tabstopManager.tabNext(-1);
        },
        "Esc": function(ed) {
Beispiel #25
0
    this.insertInLine = function(position, text) {
        if (text.length == 0)
            return position;

        var line = this.$lines[position.row] || "";
        this.$lines[position.row] = line.substring(0, position.column) + text
                + line.substring(position.column);

        var end = {
            row : position.row,
            column : position.column + text.length
        };

        var delta = {
            action: "insertText",
            range: Range.fromPoints(position, end),
            text: text
        };
        this._dispatchEvent("change", { data: delta });

        return end;
    };
Beispiel #26
0
   addExpansionRule("includeBoundaries", true, function(editor, session, selection, range) {

      var lhsItr = new TokenIterator(session);
      var lhsToken = lhsItr.moveToPosition(range.start);
      if (range.start.column === 0)
         lhsToken = lhsItr.moveToPreviousToken();

      var rhsItr = new TokenIterator(session);
      var rhsToken = rhsItr.moveToPosition(range.end, true);

      if (lhsToken && rhsToken)
      {
         // Check for complementing types
         var isMatching =
                lhsToken.type === "support.function.codebegin" &&
                rhsToken.type === "support.function.codeend";

         if (!isMatching)
         {
            // Check for complementing brace types
            isMatching =
               Utils.isOpeningBracket(lhsToken.value) &&
               Utils.getComplement(lhsToken.value) === rhsToken.value;
         }

         if (isMatching)
         {
            debuglog("Expanding to match selection");
            var lhsPos = lhsItr.getCurrentTokenPosition();
            var rhsPos = rhsItr.getCurrentTokenPosition();
            rhsPos.column += rhsToken.value.length;
            return Range.fromPoints(lhsPos, rhsPos);
         }
      }

      return null;

   });
Beispiel #27
0
    this.addTabstops = function(tabstops, start, end) {
        if (!tabstops[0]) {
            var p = Range.fromPoints(end, end);
            moveRelative(p.start, start);
            moveRelative(p.end, start);
            tabstops[0] = [p];
            tabstops[0].index = 0;
        }

        var i = this.index;
        var arg = [i, 0];
        var ranges = this.ranges;
        var editor = this.editor;
        tabstops.forEach(function(ts) {
            for (var i = ts.length; i--;) {
                var p = ts[i];
                var range = Range.fromPoints(p.start, p.end || p.start);
                movePoint(range.start, start);
                movePoint(range.end, start);
                range.original = p;
                range.tabstop = ts;
                ranges.push(range);
                ts[i] = range;
                if (p.fmtString) {
                    range.linked = true;
                    ts.hasLinkedRanges = true;
                } else if (!ts.firstNonLinked)
                    ts.firstNonLinked = range;
            }
            if (!ts.firstNonLinked)
                ts.hasLinkedRanges = false;
            arg.push(ts);
            this.addTabstopMarkers(ts);
        }, this);
        arg.push(arg.splice(2, 1)[0]);
        this.tabstops.splice.apply(this.tabstops, arg);
    };
Beispiel #28
0
function restoreState(state) {
	//restore folds and breakpoints
	if (state) {
		console.log('restore state');
		state = JSON.parse(state);

		var Range = require("ace/range").Range;
		var session = editor.getSession();
		//are those 3 lines set the values in per document base or are global for editor
		editor.selection.setSelectionRange(state.selection, false);
		session.setScrollTop(state.scrolltop);
		session.setScrollLeft(state.scrollleft);
		if (state.folds) {
			for (var i = 0, l = state.folds.length; i < l; i++) {
				var fold = state.folds[i];
				//console.log(fold);
				var range = Range.fromPoints(fold.start, fold.end);
				//console.log(range);
				session.addFold(fold.placeholder, range);
			}
		}

		// if newfile == 1 and there is text cached, restore it
		var node = session.getNode && session.getNode();
		if (node && parseInt(node.getAttribute("newfile") || 0, 10) === 1 && node.childNodes.length) {
			// the text is cached within a CDATA block as first childNode of the <file>
			if (session.getNode().childNodes[0] instanceof CDATASection) {
				session.setValue(doc.getNode().childNodes[0].nodeValue);
			}
		}

		//console.log(state.breakpoints);
		if(state.breakpoints){
			session.setBreakpoints(state.breakpoints);
		}
	}
}
Beispiel #29
0
    "test: extend range": function() {
        var range = new Range(2, 10, 2, 30);

        var range = range.extend(2, 5);
        assert.range(range, 2, 5, 2, 30);

        var range = range.extend(2, 35);
        assert.range(range, 2, 5, 2, 35);

        var range = range.extend(2, 15);
        assert.range(range, 2, 5, 2, 35);

        var range = range.extend(1, 4);
        assert.range(range, 1, 4, 2, 35);

        var range = range.extend(6, 10);
        assert.range(range, 1, 4, 6, 10);
    },
Beispiel #30
0
    onChange: function(session, event) {
        if (this.ext.disabled) return;
        var range = new Range(event.start.row, event.start.column, event.end.row, event.end.column);
        var isInserting = event.action[0] !== "r";
        var text = event.lines.join('\n');
        var adaptingId = text && text.search(/[^a-zA-Z0-9\$_]/) === -1;
        var languageAnnos = [];
        var markers = session.markerAnchors || [];
        if (!isInserting) { // Removing some text
            // Run through markers
            var foundOne = false;
            for (var i = 0; i < markers.length; i++) {
                var marker = markers[i];
                
                if (!range.compareInside(marker.start.row, marker.start.column)) {
                    session.removeMarker(marker.id);
                    foundOne = true;
                    continue;
                }
                else if (adaptingId && marker.range && marker.range.contains(event.start.row, event.start.column)) {
                    foundOne = true;
                    marker.colDiff -= text.length;
                }
                
                var start = marker.start
                start.onChange(event);
                if (marker.range) {
                    marker.range.end.row = start.row + marker.rowDiff;
                    marker.range.end.column = start.column + marker.colDiff;
                }

                if (marker.gutterAnno) {
                    languageAnnos.push(marker.gutterAnno);
                    marker.gutterAnno.row = marker.start.row;
                }
            }
            // Didn't find any markers, therefore there will not be any anchors or annotations either
            if (!foundOne)
                return;
        }
        else { // Inserting some text
            // Run through markers
            var foundOne = false;
            for (var i = 0; i < markers.length; i++) {
                var marker = markers[i];
                // Only if inserting an identifier
                if (adaptingId && marker.range && marker.range.contains(event.start.row, event.start.column)) {
                    foundOne = true;
                    marker.colDiff += text.length;
                }
                
                var start = marker.start
                start.onChange(event);
                if (marker.range) {
                    marker.range.end.row = start.row + marker.rowDiff;
                    marker.range.end.column = start.column + marker.colDiff;
                }
                
                if (marker.gutterAnno) {
                    languageAnnos.push(marker.gutterAnno);
                    marker.gutterAnno.row = marker.start.row;
                }
            }
        }
        session._dispatchEvent("changeBackMarker");
        session.setAnnotations(languageAnnos);
    },