|
6944 | 6944 | var content = elt("span", null, null, webkit ? "padding-right: .1px" : null); |
6945 | 6945 | var builder = {pre: elt("pre", [content], "CodeMirror-line"), content: content, |
6946 | 6946 | col: 0, pos: 0, cm: cm, |
| 6947 | + trailingSpace: false, |
6947 | 6948 | splitSpaces: (ie || webkit) && cm.getOption("lineWrapping")}; |
6948 | 6949 | lineView.measure = {}; |
6949 | 6950 |
|
|
7005 | 7006 | // the line map. Takes care to render special characters separately. |
7006 | 7007 | function buildToken(builder, text, style, startStyle, endStyle, title, css) { |
7007 | 7008 | if (!text) return; |
7008 | | - var displayText = builder.splitSpaces ? text.replace(/ {3,}/g, splitSpaces) : text; |
| 7009 | + var displayText = builder.splitSpaces ? splitSpaces(text, builder.trailingSpace) : text |
7009 | 7010 | var special = builder.cm.state.specialChars, mustWrap = false; |
7010 | 7011 | if (!special.test(text)) { |
7011 | 7012 | builder.col += text.length; |
|
7050 | 7051 | builder.pos++; |
7051 | 7052 | } |
7052 | 7053 | } |
| 7054 | + builder.trailingSpace = displayText.charCodeAt(text.length - 1) == 32 |
7053 | 7055 | if (style || startStyle || endStyle || mustWrap || css) { |
7054 | 7056 | var fullStyle = style || ""; |
7055 | 7057 | if (startStyle) fullStyle += startStyle; |
|
7061 | 7063 | builder.content.appendChild(content); |
7062 | 7064 | } |
7063 | 7065 |
|
7064 | | - function splitSpaces(old) { |
7065 | | - var out = " "; |
7066 | | - for (var i = 0; i < old.length - 2; ++i) out += i % 2 ? " " : "\u00a0"; |
7067 | | - out += " "; |
7068 | | - return out; |
| 7066 | + function splitSpaces(text, trailingBefore) { |
| 7067 | + if (text.length > 1 && !/ /.test(text)) return text |
| 7068 | + var spaceBefore = trailingBefore, result = "" |
| 7069 | + for (var i = 0; i < text.length; i++) { |
| 7070 | + var ch = text.charAt(i) |
| 7071 | + if (ch == " " && spaceBefore && (i == text.length - 1 || text.charCodeAt(i + 1) == 32)) |
| 7072 | + ch = "\u00a0" |
| 7073 | + result += ch |
| 7074 | + spaceBefore = ch == " " |
| 7075 | + } |
| 7076 | + return result |
7069 | 7077 | } |
7070 | 7078 |
|
7071 | 7079 | // Work around nonsense dimensions being reported for stretches of |
|
7102 | 7110 | builder.content.appendChild(widget); |
7103 | 7111 | } |
7104 | 7112 | builder.pos += size; |
| 7113 | + builder.trailingSpace = false |
7105 | 7114 | } |
7106 | 7115 |
|
7107 | 7116 | // Outputs a number of spans to make up a line, taking highlighting |
|
0 commit comments