static/js/zamboni/truncation.js (63 lines of code) (raw):
import $ from 'jquery';
import { truncate } from '../lib/truncate';
$.fn.truncate = function (opts) {
this.each(function () {
truncate(this, opts);
});
return this;
};
$.fn.untruncate = function () {
this.each(function () {
let $el = $(this),
oTxt = $el.attr('oldtext');
if (oTxt) {
$el.text(oTxt);
}
});
return this;
};
$.fn.lineclamp = function (lines) {
// This function limits the number of visible `lines` of text. Overflown
// text is gracefully ellipsed: http://en.wiktionary.org/wiki/ellipse#Verb.
if (!lines) {
return this;
}
return this.each(function () {
let $this = $(this),
lh = $this.css('line-height');
if (typeof lh == 'string' && lh.substr(-2) == 'px') {
lh = parseFloat(lh.replace('px', ''));
let maxHeight = Math.ceil(lh) * lines,
truncated;
if (this.scrollHeight - maxHeight > 2) {
$this.css({
height: maxHeight + 2,
overflow: 'hidden',
'text-overflow': 'ellipsis',
});
// Add an ellipsis.
$this.truncate({ dir: 'v' });
} else {
$this.css({
'max-height': maxHeight,
overflow: 'hidden',
'text-overflow': 'ellipsis',
});
}
}
});
};
$.fn.linefit = function (lines) {
// This function shrinks text to fit on one line.
let min_font_size = 7;
lines = lines || 1;
return this.each(function () {
let $this = $(this),
fs = parseFloat($this.css('font-size').replace('px', '')),
max_height =
Math.ceil(parseFloat($this.css('line-height').replace('px', ''))) *
lines,
height = $this.height();
while (height > max_height && fs > min_font_size) {
// Repeatedly shrink the text by 0.5px until all the text fits.
fs -= 0.5;
$this.css('font-size', fs);
height = $this.height();
}
});
};