UNPKG

7.59 kBJavaScriptView Raw
1export class UnitToPx {
2 // cache this.con, el for reused
3 static con = undefined;
4 static el = undefined;
5 // high sample will more accurate?
6 static sample = 100;
7 static pxPerUnitCache = {};
8 static initElements() {
9 if (!document) {
10 return;
11 }
12 if (!this.con || !this.el) {
13 this.con = document.createElement('div');
14 this.el = document.createElement('div');
15 }
16 this.con.style.position = 'absolute';
17 this.con.style.width = '0';
18 this.con.style.height = '0';
19 this.con.style.visibility = 'hidden';
20 this.con.style.overflow = 'hidden';
21 this.con.appendChild(this.el);
22 }
23 static pxPerUnit(unit) {
24 if (!this.pxPerUnitCache[unit]) {
25 if (!this.con || !this.el) {
26 this.initElements();
27 }
28 if (!this.con || !this.el) {
29 // dummy implementation for server-side rendering
30 return 1;
31 }
32 this.el.style.width = this.sample + unit;
33 document.body.appendChild(this.con);
34 const dimension = this.el.getBoundingClientRect();
35 this.con.parentNode.removeChild(this.con);
36 this.pxPerUnitCache[unit] = dimension.width / this.sample;
37 }
38 return this.pxPerUnitCache[unit];
39 }
40 static toPx(length) {
41 const unitRe = /^\s*([+-]?[\d\.]*)\s*(.*)\s*$/i; // NOSONAR
42 const match = unitRe.exec(length);
43 if (match != null && match.length > 2) {
44 const bare = match[1] === '';
45 const val = bare ? 1 : Number(match[1]);
46 const unit = match[2];
47 const valid = !isNaN(val) && unit;
48 if (valid) {
49 return unit === 'px' ? val : this.pxPerUnit(unit) * val;
50 }
51 }
52 throw new TypeError('Error parsing length');
53 }
54}
55//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5pdC10by1weC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1leHRlbmRlZC1wZGYtdmlld2VyL3NyYy9saWIvdW5pdC10by1weC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLE9BQU8sUUFBUTtJQUNuQixnQ0FBZ0M7SUFDeEIsTUFBTSxDQUFDLEdBQUcsR0FBK0IsU0FBUyxDQUFDO0lBQ25ELE1BQU0sQ0FBQyxFQUFFLEdBQStCLFNBQVMsQ0FBQztJQUUxRCxrQ0FBa0M7SUFDMUIsTUFBTSxDQUFVLE1BQU0sR0FBRyxHQUFHLENBQUM7SUFFN0IsTUFBTSxDQUFDLGNBQWMsR0FBOEIsRUFBRSxDQUFDO0lBRXRELE1BQU0sQ0FBQyxZQUFZO1FBQ3pCLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDYixPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUU7WUFDekIsSUFBSSxDQUFDLEdBQUcsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3pDLElBQUksQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUN6QztRQUNELElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUM7UUFDckMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQztRQUMzQixJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDO1FBQzVCLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFVBQVUsR0FBRyxRQUFRLENBQUM7UUFDckMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUNuQyxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVPLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBWTtRQUNuQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUM5QixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUU7Z0JBQ3pCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQzthQUNyQjtZQUNELElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRTtnQkFDekIsaURBQWlEO2dCQUNqRCxPQUFPLENBQUMsQ0FBQzthQUNWO1lBQ0QsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1lBQ3pDLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNwQyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDbEQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFXLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMzQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxHQUFHLFNBQVMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztTQUMzRDtRQUNELE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRU0sTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNO1FBQ3ZCLE1BQU0sTUFBTSxHQUFHLGdDQUFnQyxDQUFDLENBQUMsVUFBVTtRQUMzRCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2xDLElBQUksS0FBSyxJQUFJLElBQUksSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUNyQyxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzdCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDeEMsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLE1BQU0sS0FBSyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQztZQUNsQyxJQUFJLEtBQUssRUFBRTtnQkFDVCxPQUFPLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUM7YUFDekQ7U0FDRjtRQUNELE1BQU0sSUFBSSxTQUFTLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUM5QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNsYXNzIFVuaXRUb1B4IHtcbiAgLy8gY2FjaGUgdGhpcy5jb24sIGVsIGZvciByZXVzZWRcbiAgcHJpdmF0ZSBzdGF0aWMgY29uOiBIVE1MRGl2RWxlbWVudCB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBzdGF0aWMgZWw6IEhUTUxEaXZFbGVtZW50IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gIC8vIGhpZ2ggc2FtcGxlIHdpbGwgbW9yZSBhY2N1cmF0ZT9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc2FtcGxlID0gMTAwO1xuXG4gIHByaXZhdGUgc3RhdGljIHB4UGVyVW5pdENhY2hlOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge307XG5cbiAgcHJpdmF0ZSBzdGF0aWMgaW5pdEVsZW1lbnRzKCk6IHZvaWQge1xuICAgIGlmICghZG9jdW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmNvbiB8fCAhdGhpcy5lbCkge1xuICAgICAgdGhpcy5jb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHRoaXMuZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB9XG4gICAgdGhpcy5jb24uc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgIHRoaXMuY29uLnN0eWxlLndpZHRoID0gJzAnO1xuICAgIHRoaXMuY29uLnN0eWxlLmhlaWdodCA9ICcwJztcbiAgICB0aGlzLmNvbi5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgdGhpcy5jb24uc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcbiAgICB0aGlzLmNvbi5hcHBlbmRDaGlsZCh0aGlzLmVsKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHB4UGVyVW5pdCh1bml0OiBzdHJpbmcpOiBudW1iZXIge1xuICAgIGlmICghdGhpcy5weFBlclVuaXRDYWNoZVt1bml0XSkge1xuICAgICAgaWYgKCF0aGlzLmNvbiB8fCAhdGhpcy5lbCkge1xuICAgICAgICB0aGlzLmluaXRFbGVtZW50cygpO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLmNvbiB8fCAhdGhpcy5lbCkge1xuICAgICAgICAvLyBkdW1teSBpbXBsZW1lbnRhdGlvbiBmb3Igc2VydmVyLXNpZGUgcmVuZGVyaW5nXG4gICAgICAgIHJldHVybiAxO1xuICAgICAgfVxuICAgICAgdGhpcy5lbC5zdHlsZS53aWR0aCA9IHRoaXMuc2FtcGxlICsgdW5pdDtcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5jb24pO1xuICAgICAgY29uc3QgZGltZW5zaW9uID0gdGhpcy5lbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIHRoaXMuY29uLnBhcmVudE5vZGUhLnJlbW92ZUNoaWxkKHRoaXMuY29uKTtcbiAgICAgIHRoaXMucHhQZXJVbml0Q2FjaGVbdW5pdF0gPSBkaW1lbnNpb24ud2lkdGggLyB0aGlzLnNhbXBsZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucHhQZXJVbml0Q2FjaGVbdW5pdF07XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHRvUHgobGVuZ3RoKTogbnVtYmVyIHtcbiAgICBjb25zdCB1bml0UmUgPSAvXlxccyooWystXT9bXFxkXFwuXSopXFxzKiguKilcXHMqJC9pOyAvLyBOT1NPTkFSXG4gICAgY29uc3QgbWF0Y2ggPSB1bml0UmUuZXhlYyhsZW5ndGgpO1xuICAgIGlmIChtYXRjaCAhPSBudWxsICYmIG1hdGNoLmxlbmd0aCA+IDIpIHtcbiAgICAgIGNvbnN0IGJhcmUgPSBtYXRjaFsxXSA9PT0gJyc7XG4gICAgICBjb25zdCB2YWwgPSBiYXJlID8gMSA6IE51bWJlcihtYXRjaFsxXSk7XG4gICAgICBjb25zdCB1bml0ID0gbWF0Y2hbMl07XG4gICAgICBjb25zdCB2YWxpZCA9ICFpc05hTih2YWwpICYmIHVuaXQ7XG4gICAgICBpZiAodmFsaWQpIHtcbiAgICAgICAgcmV0dXJuIHVuaXQgPT09ICdweCcgPyB2YWwgOiB0aGlzLnB4UGVyVW5pdCh1bml0KSAqIHZhbDtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRXJyb3IgcGFyc2luZyBsZW5ndGgnKTtcbiAgfVxufVxuIl19
\No newline at end of file