#257: size line number gutter to widest number #266
@@ -44,6 +44,23 @@
|
|||||||
// measured, not derived from span counts or heights.
|
// measured, not derived from span counts or heights.
|
||||||
function renumber() {
|
function renumber() {
|
||||||
var lines = body.querySelectorAll('.codeline');
|
var lines = body.querySelectorAll('.codeline');
|
||||||
|
// #257: size the gutter column to the widest line number so numbers in
|
||||||
|
// the 100s+ fit their own column instead of bleeding into the code text.
|
||||||
|
// The gutter is box-sizing: border-box, so the column width must be the
|
||||||
|
// digits PLUS the 10px left + 10px right padding; at the CSS default 3ch
|
||||||
|
// the padding alone leaves only ~19px of content, and any 2+ digit
|
||||||
|
// number overflows into the code. Numbers are right-aligned, and the
|
||||||
|
// width below fits the widest number exactly. Set via CSSOM (CSP
|
||||||
|
// forbids inline style attributes). Only touch the width when it
|
||||||
|
// changes: the resize observer below re-runs renumber() when the gutter
|
||||||
|
// width reflows the code column, and rewriting the same value would
|
||||||
|
// ping-pong the fixed point forever.
|
||||||
|
var digits = String(lines.length || 1).length;
|
||||||
|
var w = 'calc(' + digits + 'ch + 20px)';
|
||||||
|
if (gutter.style.width !== w) {
|
||||||
|
gutter.style.minWidth = w;
|
||||||
|
gutter.style.width = w;
|
||||||
|
}
|
||||||
if (!wrapOn() || !lines.length) {
|
if (!wrapOn() || !lines.length) {
|
||||||
// wrap OFF: one number per logical line (pre-existing behavior,
|
// wrap OFF: one number per logical line (pre-existing behavior,
|
||||||
// including the gutter scrolling with horizontal scroll).
|
// including the gutter scrolling with horizontal scroll).
|
||||||
|
|||||||
Reference in New Issue
Block a user