(cm, line, lineNo, dims, reuse)
| 627 | } |
| 628 | |
| 629 | function buildLineElement(cm, line, lineNo, dims, reuse) { |
| 630 | var lineElement = lineContent(cm, line); |
| 631 | var markers = line.gutterMarkers, display = cm.display, wrap; |
| 632 | |
| 633 | if (!cm.options.lineNumbers && !markers && !line.bgClass && !line.wrapClass && !line.widgets) |
| 634 | return lineElement; |
| 635 | |
| 636 | // Lines with gutter elements, widgets or a background class need |
| 637 | // to be wrapped again, and have the extra elements added to the |
| 638 | // wrapper div |
| 639 | |
| 640 | if (reuse) { |
| 641 | reuse.alignable = null; |
| 642 | var isOk = true, widgetsSeen = 0; |
| 643 | for (var n = reuse.firstChild, next; n; n = next) { |
| 644 | next = n.nextSibling; |
| 645 | if (!/\bCodeMirror-linewidget\b/.test(n.className)) { |
| 646 | reuse.removeChild(n); |
| 647 | } else { |
| 648 | for (var i = 0, first = true; i < line.widgets.length; ++i) { |
| 649 | var widget = line.widgets[i], isFirst = false; |
| 650 | if (!widget.above) { isFirst = first; first = false; } |
| 651 | if (widget.node == n.firstChild) { |
| 652 | positionLineWidget(widget, n, reuse, dims); |
| 653 | ++widgetsSeen; |
| 654 | if (isFirst) reuse.insertBefore(lineElement, n); |
| 655 | break; |
| 656 | } |
| 657 | } |
| 658 | if (i == line.widgets.length) { isOk = false; break; } |
| 659 | } |
| 660 | } |
| 661 | if (isOk && widgetsSeen == line.widgets.length) { |
| 662 | wrap = reuse; |
| 663 | reuse.className = line.wrapClass || ""; |
| 664 | } |
| 665 | } |
| 666 | if (!wrap) { |
| 667 | wrap = elt("div", null, line.wrapClass, "position: relative"); |
| 668 | wrap.appendChild(lineElement); |
| 669 | } |
| 670 | // Kludge to make sure the styled element lies behind the selection (by z-index) |
| 671 | if (line.bgClass) |
| 672 | wrap.insertBefore(elt("div", "\u00a0", line.bgClass + " CodeMirror-linebackground"), wrap.firstChild); |
| 673 | if (cm.options.lineNumbers || markers) { |
| 674 | var gutterWrap = wrap.insertBefore(elt("div", null, null, "position: absolute; left: " + |
| 675 | (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + "px"), |
| 676 | wrap.firstChild); |
| 677 | if (cm.options.fixedGutter) (wrap.alignable || (wrap.alignable = [])).push(gutterWrap); |
| 678 | if (cm.options.lineNumbers && (!markers || !markers["CodeMirror-linenumbers"])) |
| 679 | wrap.lineNumber = gutterWrap.appendChild( |
| 680 | elt("div", lineNumberFor(cm.options, lineNo), |
| 681 | "CodeMirror-linenumber CodeMirror-gutter-elt", |
| 682 | "left: " + dims.gutterLeft["CodeMirror-linenumbers"] + "px; width: " |
| 683 | + display.lineNumInnerWidth + "px")); |
| 684 | if (markers) |
| 685 | for (var k = 0; k < cm.options.gutters.length; ++k) { |
| 686 | var id = cm.options.gutters[k], found = markers.hasOwnProperty(id) && markers[id]; |
no test coverage detected