| 2 | |
| 3 | |
| 4 | export class StringParse { |
| 5 | private static i: StringParse; |
| 6 | public static getInstance(): StringParse { |
| 7 | if (!StringParse.i) { |
| 8 | StringParse.i = new StringParse(); |
| 9 | } |
| 10 | return StringParse.i; |
| 11 | } |
| 12 | |
| 13 | public parseOffset(e: any, o: any = "0,0", wH: any, baseRem: number = 16) { |
| 14 | let ofs = o.split(','); |
| 15 | if (ofs.length === 1) { |
| 16 | ofs = [ofs[0], ofs[0]]; |
| 17 | } |
| 18 | let oV = ofs.map((os: any) => { |
| 19 | os = os.trim(); |
| 20 | if (os.startsWith('calc')) { |
| 21 | return this.parseCalc(os, e, wH, baseRem); |
| 22 | } else { |
| 23 | return this.parseSingle(os, e, wH, baseRem); |
| 24 | } |
| 25 | }); |
| 26 | return oV; |
| 27 | } |
| 28 | public parseSingle(v: string, element: any, wH: any, baseRem: number): number { |
| 29 | let isNegative = v.startsWith('-'); |
| 30 | if (isNegative) { |
| 31 | v = v.slice(1); |
| 32 | } |
| 33 | let pV; |
| 34 | if (v === 'selfHeight') { |
| 35 | pV = element.offsetHeight; |
| 36 | } else if (v.endsWith('px')) { |
| 37 | pV = parseFloat(v); |
| 38 | } else if (v.endsWith('%')) { |
| 39 | pV = parseFloat(v) * wH / 100; |
| 40 | } else if (v.endsWith('rem')) { |
| 41 | pV = parseFloat(v) * baseRem; |
| 42 | } |
| 43 | return isNegative ? -pV : pV; |
| 44 | } |
| 45 | public parseCalc(c: string, element: any, wH: any, baseRem: number): number { |
| 46 | c = c.slice(5, -1); |
| 47 | let ps = c.split(/([-+])/).filter(Boolean); |
| 48 | return ps.reduce((t, p, i) => { |
| 49 | if (p === '-' || p === '+') { |
| 50 | return t; |
| 51 | } else { |
| 52 | let value = this.parseSingle(p.trim(), element, wH, baseRem); |
| 53 | if (ps[i - 1] === '-') { |
| 54 | return t - value; |
| 55 | } else { |
| 56 | return t + value; |
| 57 | } |
| 58 | } |
| 59 | }, 0); |
| 60 | } |
| 61 | public parseOrigin(o: string) { |
nothing calls this directly
no outgoing calls
no test coverage detected