|
import each from 'licia/each' |
|
import sortKeys from 'licia/sortKeys' |
|
|
|
function formatStyle(style) { |
|
const ret = {} |
|
|
|
for (let i = 0, len = style.length; i < len; i++) { |
|
const name = style[i] |
|
|
|
if (style[name] === 'initial') continue |
|
|
|
ret[name] = style[name] |
|
} |
|
|
|
return sortStyleKeys(ret) |
|
} |
|
|
|
const elProto = Element.prototype |
|
|
|
let matchesSel = function () { |
|
return false |
|
} |
|
|
|
if (elProto.webkitMatchesSelector) { |
|
matchesSel = (el, selText) => el.webkitMatchesSelector(selText) |
|
} else if (elProto.mozMatchesSelector) { |
|
matchesSel = (el, selText) => el.mozMatchesSelector(selText) |
|
} |
|
|
|
export default class CssStore { |
|
constructor(el) { |
|
this._el = el |
|
} |
|
getComputedStyle() { |
|
const computedStyle = window.getComputedStyle(this._el) |
|
|
|
return formatStyle(computedStyle) |
|
} |
|
getMatchedCSSRules() { |
|
const ret = [] |
|
|
|
each(document.styleSheets, (styleSheet) => { |
|
try { |
|
|
|
if (!styleSheet.cssRules) return |
|
} catch { |
|
return |
|
} |
|
|
|
each(styleSheet.cssRules, (cssRule) => { |
|
let matchesEl = false |
|
|
|
|
|
try { |
|
matchesEl = this._elMatchesSel(cssRule.selectorText) |
|
} catch { |
|
|
|
} |
|
|
|
if (!matchesEl) return |
|
|
|
ret.push({ |
|
selectorText: cssRule.selectorText, |
|
style: formatStyle(cssRule.style), |
|
}) |
|
}) |
|
}) |
|
|
|
return ret |
|
} |
|
_elMatchesSel(selText) { |
|
return matchesSel(this._el, selText) |
|
} |
|
} |
|
|
|
function sortStyleKeys(style) { |
|
return sortKeys(style, { |
|
comparator: (a, b) => { |
|
const lenA = a.length |
|
const lenB = b.length |
|
const len = lenA > lenB ? lenB : lenA |
|
|
|
for (let i = 0; i < len; i++) { |
|
const codeA = a.charCodeAt(i) |
|
const codeB = b.charCodeAt(i) |
|
const cmpResult = cmpCode(codeA, codeB) |
|
|
|
if (cmpResult !== 0) return cmpResult |
|
} |
|
|
|
if (lenA > lenB) return 1 |
|
if (lenA < lenB) return -1 |
|
|
|
return 0 |
|
}, |
|
}) |
|
} |
|
|
|
function cmpCode(a, b) { |
|
a = transCode(a) |
|
b = transCode(b) |
|
|
|
if (a > b) return 1 |
|
if (a < b) return -1 |
|
return 0 |
|
} |
|
|
|
function transCode(code) { |
|
|
|
if (code === 45) return 123 |
|
return code |
|
} |
|
|