Subversion-Projekte lars-tiefland.ci

Revision

Details | Letzte Änderung | Log anzeigen | RSS feed

Revision Autor Zeilennr. Zeile
776 lars 1
// CodeMirror, copyright (c) by Marijn Haverbeke and others
2
// Distributed under an MIT license: http://codemirror.net/LICENSE
3
 
4
(function(mod) {
5
  if (typeof exports == "object" && typeof module == "object") // CommonJS
6
    mod(require("../../lib/codemirror"));
7
  else if (typeof define == "function" && define.amd) // AMD
8
    define(["../../lib/codemirror"], mod);
9
  else // Plain browser env
10
    mod(CodeMirror);
11
})(function(CodeMirror) {
12
  "use strict";
13
 
14
  var Pos = CodeMirror.Pos;
15
 
16
  function findParagraph(cm, pos, options) {
17
    var startRE = options.paragraphStart || cm.getHelper(pos, "paragraphStart");
18
    for (var start = pos.line, first = cm.firstLine(); start > first; --start) {
19
      var line = cm.getLine(start);
20
      if (startRE && startRE.test(line)) break;
21
      if (!/\S/.test(line)) { ++start; break; }
22
    }
23
    var endRE = options.paragraphEnd || cm.getHelper(pos, "paragraphEnd");
24
    for (var end = pos.line + 1, last = cm.lastLine(); end <= last; ++end) {
25
      var line = cm.getLine(end);
26
      if (endRE && endRE.test(line)) { ++end; break; }
27
      if (!/\S/.test(line)) break;
28
    }
29
    return {from: start, to: end};
30
  }
31
 
32
  function findBreakPoint(text, column, wrapOn, killTrailingSpace) {
33
    for (var at = column; at > 0; --at)
34
      if (wrapOn.test(text.slice(at - 1, at + 1))) break;
35
    if (at == 0) at = column;
36
    var endOfText = at;
37
    if (killTrailingSpace)
38
      while (text.charAt(endOfText - 1) == " ") --endOfText;
39
    return {from: endOfText, to: at};
40
  }
41
 
42
  function wrapRange(cm, from, to, options) {
43
    from = cm.clipPos(from); to = cm.clipPos(to);
44
    var column = options.column || 80;
45
    var wrapOn = options.wrapOn || /\s\S|-[^\.\d]/;
46
    var killTrailing = options.killTrailingSpace !== false;
47
    var changes = [], curLine = "", curNo = from.line;
48
    var lines = cm.getRange(from, to, false);
49
    if (!lines.length) return null;
50
    var leadingSpace = lines[0].match(/^[ \t]*/)[0];
51
 
52
    for (var i = 0; i < lines.length; ++i) {
53
      var text = lines[i], oldLen = curLine.length, spaceInserted = 0;
54
      if (curLine && text && !wrapOn.test(curLine.charAt(curLine.length - 1) + text.charAt(0))) {
55
        curLine += " ";
56
        spaceInserted = 1;
57
      }
58
      var spaceTrimmed = "";
59
      if (i) {
60
        spaceTrimmed = text.match(/^\s*/)[0];
61
        text = text.slice(spaceTrimmed.length);
62
      }
63
      curLine += text;
64
      if (i) {
65
        var firstBreak = curLine.length > column && leadingSpace == spaceTrimmed &&
66
          findBreakPoint(curLine, column, wrapOn, killTrailing);
67
        // If this isn't broken, or is broken at a different point, remove old break
68
        if (!firstBreak || firstBreak.from != oldLen || firstBreak.to != oldLen + spaceInserted) {
69
          changes.push({text: [spaceInserted ? " " : ""],
70
                        from: Pos(curNo, oldLen),
71
                        to: Pos(curNo + 1, spaceTrimmed.length)});
72
        } else {
73
          curLine = leadingSpace + text;
74
          ++curNo;
75
        }
76
      }
77
      while (curLine.length > column) {
78
        var bp = findBreakPoint(curLine, column, wrapOn, killTrailing);
79
        changes.push({text: ["", leadingSpace],
80
                      from: Pos(curNo, bp.from),
81
                      to: Pos(curNo, bp.to)});
82
        curLine = leadingSpace + curLine.slice(bp.to);
83
        ++curNo;
84
      }
85
    }
86
    if (changes.length) cm.operation(function() {
87
      for (var i = 0; i < changes.length; ++i) {
88
        var change = changes[i];
89
        cm.replaceRange(change.text, change.from, change.to);
90
      }
91
    });
92
    return changes.length ? {from: changes[0].from, to: CodeMirror.changeEnd(changes[changes.length - 1])} : null;
93
  }
94
 
95
  CodeMirror.defineExtension("wrapParagraph", function(pos, options) {
96
    options = options || {};
97
    if (!pos) pos = this.getCursor();
98
    var para = findParagraph(this, pos, options);
99
    return wrapRange(this, Pos(para.from, 0), Pos(para.to - 1), options);
100
  });
101
 
102
  CodeMirror.commands.wrapLines = function(cm) {
103
    cm.operation(function() {
104
      var ranges = cm.listSelections(), at = cm.lastLine() + 1;
105
      for (var i = ranges.length - 1; i >= 0; i--) {
106
        var range = ranges[i], span;
107
        if (range.empty()) {
108
          var para = findParagraph(cm, range.head, {});
109
          span = {from: Pos(para.from, 0), to: Pos(para.to - 1)};
110
        } else {
111
          span = {from: range.from(), to: range.to()};
112
        }
113
        if (span.to.line >= at) continue;
114
        at = span.from.line;
115
        wrapRange(cm, span.from, span.to, {});
116
      }
117
    });
118
  };
119
 
120
  CodeMirror.defineExtension("wrapRange", function(from, to, options) {
121
    return wrapRange(this, from, to, options || {});
122
  });
123
 
124
  CodeMirror.defineExtension("wrapParagraphsInRange", function(from, to, options) {
125
    options = options || {};
126
    var cm = this, paras = [];
127
    for (var line = from.line; line <= to.line;) {
128
      var para = findParagraph(cm, Pos(line, 0), options);
129
      paras.push(para);
130
      line = para.to;
131
    }
132
    var madeChange = false;
133
    if (paras.length) cm.operation(function() {
134
      for (var i = paras.length - 1; i >= 0; --i)
135
        madeChange = madeChange || wrapRange(cm, Pos(paras[i].from, 0), Pos(paras[i].to - 1), options);
136
    });
137
    return madeChange;
138
  });
139
});