(line, fromArg, toArg)
| 4513 | } |
| 4514 | |
| 4515 | function drawForLine(line, fromArg, toArg) { |
| 4516 | var lineObj = getLine(doc, line) |
| 4517 | var lineLen = lineObj.text.length |
| 4518 | var start, end |
| 4519 | function coords(ch, bias) { |
| 4520 | return charCoords(cm, Pos(line, ch), "div", lineObj, bias) |
| 4521 | } |
| 4522 | |
| 4523 | function wrapX(pos, dir, side) { |
| 4524 | var extent = wrappedLineExtentChar(cm, lineObj, null, pos) |
| 4525 | var prop = (dir == "ltr") == (side == "after") ? "left" : "right" |
| 4526 | var ch = side == "after" ? extent.begin : extent.end - (/\s/.test(lineObj.text.charAt(extent.end - 1)) ? 2 : 1) |
| 4527 | return coords(ch, prop)[prop] |
| 4528 | } |
| 4529 | |
| 4530 | var order = getOrder(lineObj, doc.direction) |
| 4531 | iterateBidiSections(order, fromArg || 0, toArg == null ? lineLen : toArg, function (from, to, dir, i) { |
| 4532 | var ltr = dir == "ltr" |
| 4533 | var fromPos = coords(from, ltr ? "left" : "right") |
| 4534 | var toPos = coords(to - 1, ltr ? "right" : "left") |
| 4535 | |
| 4536 | var openStart = fromArg == null && from == 0, |
| 4537 | openEnd = toArg == null && to == lineLen |
| 4538 | var first = i == 0, |
| 4539 | last = !order || i == order.length - 1 |
| 4540 | if (toPos.top - fromPos.top <= 3) { |
| 4541 | // Single line |
| 4542 | var openLeft = (docLTR ? openStart : openEnd) && first |
| 4543 | var openRight = (docLTR ? openEnd : openStart) && last |
| 4544 | var left = openLeft ? leftSide : (ltr ? fromPos : toPos).left |
| 4545 | var right = openRight ? rightSide : (ltr ? toPos : fromPos).right |
| 4546 | add(left, fromPos.top, right - left, fromPos.bottom) |
| 4547 | } else { |
| 4548 | // Multiple lines |
| 4549 | var topLeft, topRight, botLeft, botRight |
| 4550 | if (ltr) { |
| 4551 | topLeft = docLTR && openStart && first ? leftSide : fromPos.left |
| 4552 | topRight = docLTR ? rightSide : wrapX(from, dir, "before") |
| 4553 | botLeft = docLTR ? leftSide : wrapX(to, dir, "after") |
| 4554 | botRight = docLTR && openEnd && last ? rightSide : toPos.right |
| 4555 | } else { |
| 4556 | topLeft = !docLTR ? leftSide : wrapX(from, dir, "before") |
| 4557 | topRight = !docLTR && openStart && first ? rightSide : fromPos.right |
| 4558 | botLeft = !docLTR && openEnd && last ? leftSide : toPos.left |
| 4559 | botRight = !docLTR ? rightSide : wrapX(to, dir, "after") |
| 4560 | } |
| 4561 | add(topLeft, fromPos.top, topRight - topLeft, fromPos.bottom) |
| 4562 | if (fromPos.bottom < toPos.top) { |
| 4563 | add(leftSide, fromPos.bottom, null, toPos.top) |
| 4564 | } |
| 4565 | add(botLeft, toPos.top, botRight - botLeft, toPos.bottom) |
| 4566 | } |
| 4567 | |
| 4568 | if (!start || cmpCoords(fromPos, start) < 0) { |
| 4569 | start = fromPos |
| 4570 | } |
| 4571 | if (cmpCoords(toPos, start) < 0) { |
| 4572 | start = toPos |
no test coverage detected