(line, fromArg, toArg)
| 3112 | } |
| 3113 | |
| 3114 | function drawForLine(line, fromArg, toArg) { |
| 3115 | var lineObj = getLine(doc, line); |
| 3116 | var lineLen = lineObj.text.length; |
| 3117 | var start, end; |
| 3118 | function coords(ch, bias) { |
| 3119 | return charCoords(cm, Pos(line, ch), "div", lineObj, bias) |
| 3120 | } |
| 3121 | |
| 3122 | function wrapX(pos, dir, side) { |
| 3123 | var extent = wrappedLineExtentChar(cm, lineObj, null, pos); |
| 3124 | var prop = (dir == "ltr") == (side == "after") ? "left" : "right"; |
| 3125 | var ch = side == "after" ? extent.begin : extent.end - (/\s/.test(lineObj.text.charAt(extent.end - 1)) ? 2 : 1); |
| 3126 | return coords(ch, prop)[prop] |
| 3127 | } |
| 3128 | |
| 3129 | var order = getOrder(lineObj, doc.direction); |
| 3130 | iterateBidiSections(order, fromArg || 0, toArg == null ? lineLen : toArg, function (from, to, dir, i) { |
| 3131 | var ltr = dir == "ltr"; |
| 3132 | var fromPos = coords(from, ltr ? "left" : "right"); |
| 3133 | var toPos = coords(to - 1, ltr ? "right" : "left"); |
| 3134 | |
| 3135 | var openStart = fromArg == null && from == 0, openEnd = toArg == null && to == lineLen; |
| 3136 | var first = i == 0, last = !order || i == order.length - 1; |
| 3137 | if (toPos.top - fromPos.top <= 3) { // Single line |
| 3138 | var openLeft = (docLTR ? openStart : openEnd) && first; |
| 3139 | var openRight = (docLTR ? openEnd : openStart) && last; |
| 3140 | var left = openLeft ? leftSide : (ltr ? fromPos : toPos).left; |
| 3141 | var right = openRight ? rightSide : (ltr ? toPos : fromPos).right; |
| 3142 | add(left, fromPos.top, right - left, fromPos.bottom); |
| 3143 | } else { // Multiple lines |
| 3144 | var topLeft, topRight, botLeft, botRight; |
| 3145 | if (ltr) { |
| 3146 | topLeft = docLTR && openStart && first ? leftSide : fromPos.left; |
| 3147 | topRight = docLTR ? rightSide : wrapX(from, dir, "before"); |
| 3148 | botLeft = docLTR ? leftSide : wrapX(to, dir, "after"); |
| 3149 | botRight = docLTR && openEnd && last ? rightSide : toPos.right; |
| 3150 | } else { |
| 3151 | topLeft = !docLTR ? leftSide : wrapX(from, dir, "before"); |
| 3152 | topRight = !docLTR && openStart && first ? rightSide : fromPos.right; |
| 3153 | botLeft = !docLTR && openEnd && last ? leftSide : toPos.left; |
| 3154 | botRight = !docLTR ? rightSide : wrapX(to, dir, "after"); |
| 3155 | } |
| 3156 | add(topLeft, fromPos.top, topRight - topLeft, fromPos.bottom); |
| 3157 | if (fromPos.bottom < toPos.top) { add(leftSide, fromPos.bottom, null, toPos.top); } |
| 3158 | add(botLeft, toPos.top, botRight - botLeft, toPos.bottom); |
| 3159 | } |
| 3160 | |
| 3161 | if (!start || cmpCoords(fromPos, start) < 0) { start = fromPos; } |
| 3162 | if (cmpCoords(toPos, start) < 0) { start = toPos; } |
| 3163 | if (!end || cmpCoords(fromPos, end) < 0) { end = fromPos; } |
| 3164 | if (cmpCoords(toPos, end) < 0) { end = toPos; } |
| 3165 | }); |
| 3166 | return {start: start, end: end} |
| 3167 | } |
| 3168 | |
| 3169 | var sFrom = range$$1.from(), sTo = range$$1.to(); |
| 3170 | if (sFrom.line == sTo.line) { |
no test coverage detected