(line, fromArg, toArg)
| 3192 | } |
| 3193 | |
| 3194 | function drawForLine(line, fromArg, toArg) { |
| 3195 | var lineObj = getLine(doc, line); |
| 3196 | var lineLen = lineObj.text.length; |
| 3197 | var start, end; |
| 3198 | function coords(ch, bias) { |
| 3199 | return charCoords(cm, Pos(line, ch), "div", lineObj, bias) |
| 3200 | } |
| 3201 | |
| 3202 | function wrapX(pos, dir, side) { |
| 3203 | var extent = wrappedLineExtentChar(cm, lineObj, null, pos); |
| 3204 | var prop = (dir == "ltr") == (side == "after") ? "left" : "right"; |
| 3205 | var ch = side == "after" ? extent.begin : extent.end - (/\s/.test(lineObj.text.charAt(extent.end - 1)) ? 2 : 1); |
| 3206 | return coords(ch, prop)[prop] |
| 3207 | } |
| 3208 | |
| 3209 | var order = getOrder(lineObj, doc.direction); |
| 3210 | iterateBidiSections(order, fromArg || 0, toArg == null ? lineLen : toArg, function (from, to, dir, i) { |
| 3211 | var ltr = dir == "ltr"; |
| 3212 | var fromPos = coords(from, ltr ? "left" : "right"); |
| 3213 | var toPos = coords(to - 1, ltr ? "right" : "left"); |
| 3214 | |
| 3215 | var openStart = fromArg == null && from == 0, openEnd = toArg == null && to == lineLen; |
| 3216 | var first = i == 0, last = !order || i == order.length - 1; |
| 3217 | if (toPos.top - fromPos.top <= 3) { // Single line |
| 3218 | var openLeft = (docLTR ? openStart : openEnd) && first; |
| 3219 | var openRight = (docLTR ? openEnd : openStart) && last; |
| 3220 | var left = openLeft ? leftSide : (ltr ? fromPos : toPos).left; |
| 3221 | var right = openRight ? rightSide : (ltr ? toPos : fromPos).right; |
| 3222 | add(left, fromPos.top, right - left, fromPos.bottom); |
| 3223 | } else { // Multiple lines |
| 3224 | var topLeft, topRight, botLeft, botRight; |
| 3225 | if (ltr) { |
| 3226 | topLeft = docLTR && openStart && first ? leftSide : fromPos.left; |
| 3227 | topRight = docLTR ? rightSide : wrapX(from, dir, "before"); |
| 3228 | botLeft = docLTR ? leftSide : wrapX(to, dir, "after"); |
| 3229 | botRight = docLTR && openEnd && last ? rightSide : toPos.right; |
| 3230 | } else { |
| 3231 | topLeft = !docLTR ? leftSide : wrapX(from, dir, "before"); |
| 3232 | topRight = !docLTR && openStart && first ? rightSide : fromPos.right; |
| 3233 | botLeft = !docLTR && openEnd && last ? leftSide : toPos.left; |
| 3234 | botRight = !docLTR ? rightSide : wrapX(to, dir, "after"); |
| 3235 | } |
| 3236 | add(topLeft, fromPos.top, topRight - topLeft, fromPos.bottom); |
| 3237 | if (fromPos.bottom < toPos.top) { add(leftSide, fromPos.bottom, null, toPos.top); } |
| 3238 | add(botLeft, toPos.top, botRight - botLeft, toPos.bottom); |
| 3239 | } |
| 3240 | |
| 3241 | if (!start || cmpCoords(fromPos, start) < 0) { start = fromPos; } |
| 3242 | if (cmpCoords(toPos, start) < 0) { start = toPos; } |
| 3243 | if (!end || cmpCoords(fromPos, end) < 0) { end = fromPos; } |
| 3244 | if (cmpCoords(toPos, end) < 0) { end = toPos; } |
| 3245 | }); |
| 3246 | return {start: start, end: end} |
| 3247 | } |
| 3248 | |
| 3249 | var sFrom = range.from(), sTo = range.to(); |
| 3250 | if (sFrom.line == sTo.line) { |
no test coverage detected