(cm, realLine, measure)
| 3942 | } |
| 3943 | |
| 3944 | function lineContent(cm, realLine, measure) { |
| 3945 | var merged, line = realLine, lineBefore, sawBefore, simple = true; |
| 3946 | while (merged = collapsedSpanAtStart(line)) { |
| 3947 | simple = false; |
| 3948 | line = getLine(cm.doc, merged.find().from.line); |
| 3949 | if (!lineBefore) lineBefore = line; |
| 3950 | } |
| 3951 | |
| 3952 | var builder = {pre: elt("pre"), col: 0, pos: 0, display: !measure, |
| 3953 | measure: null, addedOne: false, cm: cm}; |
| 3954 | if (line.textClass) builder.pre.className = line.textClass; |
| 3955 | |
| 3956 | do { |
| 3957 | builder.measure = line == realLine && measure; |
| 3958 | builder.pos = 0; |
| 3959 | builder.addToken = builder.measure ? buildTokenMeasure : buildToken; |
| 3960 | if (measure && sawBefore && line != realLine && !builder.addedOne) { |
| 3961 | measure[0] = builder.pre.appendChild(zeroWidthElement(cm.display.measure)); |
| 3962 | builder.addedOne = true; |
| 3963 | } |
| 3964 | var next = insertLineContent(line, builder, getLineStyles(cm, line)); |
| 3965 | sawBefore = line == lineBefore; |
| 3966 | if (next) { |
| 3967 | line = getLine(cm.doc, next.to.line); |
| 3968 | simple = false; |
| 3969 | } |
| 3970 | } while (next); |
| 3971 | |
| 3972 | if (measure && !builder.addedOne) |
| 3973 | measure[0] = builder.pre.appendChild(simple ? elt("span", "\u00a0") : zeroWidthElement(cm.display.measure)); |
| 3974 | if (!builder.pre.firstChild && !lineIsHidden(cm.doc, realLine)) |
| 3975 | builder.pre.appendChild(document.createTextNode("\u00a0")); |
| 3976 | |
| 3977 | var order; |
| 3978 | // Work around problem with the reported dimensions of single-char |
| 3979 | // direction spans on IE (issue #1129). See also the comment in |
| 3980 | // cursorCoords. |
| 3981 | if (measure && ie && (order = getOrder(line))) { |
| 3982 | var l = order.length - 1; |
| 3983 | if (order[l].from == order[l].to) --l; |
| 3984 | var last = order[l], prev = order[l - 1]; |
| 3985 | if (last.from + 1 == last.to && prev && last.level < prev.level) { |
| 3986 | var span = measure[builder.pos - 1]; |
| 3987 | if (span) span.parentNode.insertBefore(span.measureRight = zeroWidthElement(cm.display.measure), |
| 3988 | span.nextSibling); |
| 3989 | } |
| 3990 | } |
| 3991 | |
| 3992 | return builder.pre; |
| 3993 | } |
| 3994 | |
| 3995 | var tokenSpecialChars = /[\t\u0000-\u0019\u200b\u2028\u2029\uFEFF]/g; |
| 3996 | function buildToken(builder, text, style, startStyle, endStyle) { |
no test coverage detected