Artifact
d41167ae7edf5b9e061a8554d7b24f9b9394f0c1c966a2cf5e28071723878b4a:
0000: 27 75 73 65 20 73 74 72 69 63 74 27 3b 0a 0a 0a 'use strict';...
0010: 2f 2f 20 70 6f 6c 79 66 69 6c 6c 20 77 69 6e 64 // polyfill wind
0020: 6f 77 2e 67 65 74 4d 61 74 63 68 65 64 43 53 53 ow.getMatchedCSS
0030: 52 75 6c 65 73 28 29 20 69 6e 20 46 69 72 65 46 Rules() in FireF
0040: 6f 78 20 36 2b 0a 2f 2f 69 66 20 28 74 79 70 65 ox 6+.//if (type
0050: 6f 66 20 77 69 6e 64 6f 77 2e 67 65 74 4d 61 74 of window.getMat
0060: 63 68 65 64 43 53 53 52 75 6c 65 73 20 21 3d 3d chedCSSRules !==
0070: 20 27 66 75 6e 63 74 69 6f 6e 27 29 20 7b 0a 20 'function') {.
0080: 20 76 61 72 20 45 4c 45 4d 45 4e 54 5f 52 45 20 var ELEMENT_RE
0090: 3d 20 2f 5b 5c 77 2d 5d 2b 2f 67 2c 0a 20 20 20 = /[\w-]+/g,.
00a0: 20 20 20 20 20 20 20 49 44 5f 52 45 20 3d 20 2f ID_RE = /
00b0: 23 5b 5c 77 2d 5d 2b 2f 67 2c 0a 20 20 20 20 20 #[\w-]+/g,.
00c0: 20 20 20 20 20 43 4c 41 53 53 5f 52 45 20 3d 20 CLASS_RE =
00d0: 2f 5c 2e 5b 5c 77 2d 5d 2b 2f 67 2c 0a 20 20 20 /\.[\w-]+/g,.
00e0: 20 20 20 20 20 20 20 41 54 54 52 5f 52 45 20 3d ATTR_RE =
00f0: 20 2f 5c 5b 5b 5e 5c 5d 5d 2b 5c 5d 2f 67 2c 0a /\[[^\]]+\]/g,.
0100: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 3a 6e 6f // :no
0110: 74 28 29 20 70 73 65 75 64 6f 2d 63 6c 61 73 73 t() pseudo-class
0120: 20 64 6f 65 73 20 6e 6f 74 20 61 64 64 20 74 6f does not add to
0130: 20 73 70 65 63 69 66 69 63 69 74 79 2c 20 62 75 specificity, bu
0140: 74 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 64 6f t its content do
0150: 65 73 20 61 73 20 69 66 20 69 74 20 77 61 73 20 es as if it was
0160: 6f 75 74 73 69 64 65 20 69 74 0a 20 20 20 20 20 outside it.
0170: 20 20 20 20 20 50 53 45 55 44 4f 5f 43 4c 41 53 PSEUDO_CLAS
0180: 53 45 53 5f 52 45 20 3d 20 2f 5c 3a 28 3f 21 6e SES_RE = /\:(?!n
0190: 6f 74 29 5b 5c 77 2d 5d 2b 28 5c 28 2e 2a 5c 29 ot)[\w-]+(\(.*\)
01a0: 29 3f 2f 67 2c 0a 20 20 20 20 20 20 20 20 20 20 )?/g,.
01b0: 50 53 45 55 44 4f 5f 45 4c 45 4d 45 4e 54 53 5f PSEUDO_ELEMENTS_
01c0: 52 45 20 3d 20 2f 5c 3a 5c 3a 3f 28 61 66 74 65 RE = /\:\:?(afte
01d0: 72 7c 62 65 66 6f 72 65 7c 66 69 72 73 74 2d 6c r|before|first-l
01e0: 65 74 74 65 72 7c 66 69 72 73 74 2d 6c 69 6e 65 etter|first-line
01f0: 7c 73 65 6c 65 63 74 69 6f 6e 29 2f 67 3b 0a 20 |selection)/g;.
0200: 20 20 20 20 20 2f 2f 20 63 6f 6e 76 65 72 74 20 // convert
0210: 61 6e 20 61 72 72 61 79 2d 6c 69 6b 65 20 6f 62 an array-like ob
0220: 6a 65 63 74 20 74 6f 20 61 72 72 61 79 0a 20 20 ject to array.
0230: 20 20 66 75 6e 63 74 69 6f 6e 20 74 6f 41 72 72 function toArr
0240: 61 79 28 6c 69 73 74 29 20 7b 0a 20 20 20 20 20 ay(list) {.
0250: 20 20 20 72 65 74 75 72 6e 20 5b 5d 2e 73 6c 69 return [].sli
0260: 63 65 2e 63 61 6c 6c 28 6c 69 73 74 29 3b 0a 20 ce.call(list);.
0270: 20 20 20 7d 0a 0a 20 20 20 20 2f 2f 20 68 61 6e }.. // han
0280: 64 6c 65 73 20 65 78 74 72 61 63 74 69 6f 6e 20 dles extraction
0290: 6f 66 20 60 63 73 73 52 75 6c 65 73 60 20 61 73 of `cssRules` as
02a0: 20 61 6e 20 60 41 72 72 61 79 60 20 66 72 6f 6d an `Array` from
02b0: 20 61 20 73 74 79 6c 65 73 68 65 65 74 20 6f 72 a stylesheet or
02c0: 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 something that
02d0: 62 65 68 61 76 65 73 20 74 68 65 20 73 61 6d 65 behaves the same
02e0: 0a 20 20 20 20 66 75 6e 63 74 69 6f 6e 20 67 65 . function ge
02f0: 74 53 68 65 65 74 52 75 6c 65 73 28 73 74 79 6c tSheetRules(styl
0300: 65 73 68 65 65 74 29 20 7b 0a 20 20 20 20 20 20 esheet) {.
0310: 20 20 76 61 72 20 73 68 65 65 74 5f 6d 65 64 69 var sheet_medi
0320: 61 20 3d 20 73 74 79 6c 65 73 68 65 65 74 2e 6d a = stylesheet.m
0330: 65 64 69 61 20 26 26 20 73 74 79 6c 65 73 68 65 edia && styleshe
0340: 65 74 2e 6d 65 64 69 61 2e 6d 65 64 69 61 54 65 et.media.mediaTe
0350: 78 74 3b 0a 20 20 20 20 20 20 20 20 2f 2f 20 69 xt;. // i
0360: 66 20 74 68 69 73 20 73 68 65 65 74 20 69 73 20 f this sheet is
0370: 64 69 73 61 62 6c 65 64 20 73 6b 69 70 20 69 74 disabled skip it
0380: 0a 20 20 20 20 20 20 20 20 69 66 20 28 20 73 74 . if ( st
0390: 79 6c 65 73 68 65 65 74 2e 64 69 73 61 62 6c 65 ylesheet.disable
03a0: 64 20 29 20 72 65 74 75 72 6e 20 5b 5d 3b 0a 20 d ) return [];.
03b0: 20 20 20 20 20 20 20 2f 2f 20 69 66 20 74 68 69 // if thi
03c0: 73 20 73 68 65 65 74 27 73 20 6d 65 64 69 61 20 s sheet's media
03d0: 69 73 20 73 70 65 63 69 66 69 65 64 20 61 6e 64 is specified and
03e0: 20 64 6f 65 73 6e 27 74 20 6d 61 74 63 68 20 74 doesn't match t
03f0: 68 65 20 76 69 65 77 70 6f 72 74 20 74 68 65 6e he viewport then
0400: 20 73 6b 69 70 20 69 74 0a 20 20 20 20 20 20 20 skip it.
0410: 20 69 66 20 28 20 73 68 65 65 74 5f 6d 65 64 69 if ( sheet_medi
0420: 61 20 26 26 20 73 68 65 65 74 5f 6d 65 64 69 61 a && sheet_media
0430: 2e 6c 65 6e 67 74 68 20 26 26 20 21 20 77 69 6e .length && ! win
0440: 64 6f 77 2e 6d 61 74 63 68 4d 65 64 69 61 28 73 dow.matchMedia(s
0450: 68 65 65 74 5f 6d 65 64 69 61 29 2e 6d 61 74 63 heet_media).matc
0460: 68 65 73 20 29 20 72 65 74 75 72 6e 20 5b 5d 3b hes ) return [];
0470: 0a 20 20 20 20 20 20 20 20 2f 2f 20 67 65 74 20 . // get
0480: 74 68 65 20 73 74 79 6c 65 20 72 75 6c 65 73 20 the style rules
0490: 6f 66 20 74 68 69 73 20 73 68 65 65 74 0a 20 20 of this sheet.
04a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 6f 41 return toA
04b0: 72 72 61 79 28 73 74 79 6c 65 73 68 65 65 74 2e rray(stylesheet.
04c0: 63 73 73 52 75 6c 65 73 29 3b 0a 20 20 20 20 7d cssRules);. }
04d0: 0a 0a 20 20 20 20 66 75 6e 63 74 69 6f 6e 20 5f .. function _
04e0: 66 69 6e 64 28 73 74 72 69 6e 67 2c 20 72 65 29 find(string, re)
04f0: 20 7b 0a 20 20 20 20 20 20 20 20 76 61 72 20 6d {. var m
0500: 61 74 63 68 65 73 20 3d 20 73 74 72 69 6e 67 2e atches = string.
0510: 6d 61 74 63 68 28 72 65 29 3b 0a 20 20 20 20 20 match(re);.
0520: 20 20 20 72 65 74 75 72 6e 20 6d 61 74 63 68 65 return matche
0530: 73 20 3f 20 6d 61 74 63 68 65 73 2e 6c 65 6e 67 s ? matches.leng
0540: 74 68 20 3a 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 th : 0;. }..
0550: 20 20 20 2f 2f 20 46 69 6e 64 20 63 6f 72 72 65 // Find corre
0560: 63 74 20 6d 61 74 63 68 65 73 53 65 6c 65 63 74 ct matchesSelect
0570: 6f 72 20 69 6d 70 6c 0a 20 20 20 20 66 75 6e 63 or impl. func
0580: 74 69 6f 6e 20 6d 61 74 63 68 65 73 53 65 6c 65 tion matchesSele
0590: 63 74 6f 72 28 65 6c 2c 20 73 65 6c 65 63 74 6f ctor(el, selecto
05a0: 72 29 20 7b 0a 20 20 20 20 20 20 76 61 72 20 6d r) {. var m
05b0: 61 74 63 68 65 72 20 3d 20 65 6c 2e 6d 61 74 63 atcher = el.matc
05c0: 68 65 73 53 65 6c 65 63 74 6f 72 20 7c 7c 20 65 hesSelector || e
05d0: 6c 2e 6d 6f 7a 4d 61 74 63 68 65 73 53 65 6c 65 l.mozMatchesSele
05e0: 63 74 6f 72 20 7c 7c 0a 20 20 20 20 20 20 20 20 ctor ||.
05f0: 20 20 65 6c 2e 77 65 62 6b 69 74 4d 61 74 63 68 el.webkitMatch
0600: 65 73 53 65 6c 65 63 74 6f 72 20 7c 7c 20 65 6c esSelector || el
0610: 2e 6f 4d 61 74 63 68 65 73 53 65 6c 65 63 74 6f .oMatchesSelecto
0620: 72 20 7c 7c 20 65 6c 2e 6d 73 4d 61 74 63 68 65 r || el.msMatche
0630: 73 53 65 6c 65 63 74 6f 72 3b 0a 0a 20 20 20 20 sSelector;..
0640: 20 20 73 65 6c 65 63 74 6f 72 20 3d 20 27 2a 27 selector = '*'
0650: 3b 0a 20 20 20 20 20 20 63 6f 6e 73 6f 6c 65 2e ;. console.
0660: 6c 6f 67 28 73 65 6c 65 63 74 6f 72 29 3b 0a 20 log(selector);.
0670: 20 20 20 20 20 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 console.log
0680: 28 6d 61 74 63 68 65 72 29 3b 0a 20 20 20 20 20 (matcher);.
0690: 20 76 61 72 20 72 65 73 75 6c 74 20 3d 20 65 6c var result = el
06a0: 2e 77 65 62 6b 69 74 4d 61 74 63 68 65 73 53 65 .webkitMatchesSe
06b0: 6c 65 63 74 6f 72 28 27 2a 27 29 3b 0a 20 20 20 lector('*');.
06c0: 20 20 20 2f 2f 72 65 74 75 72 6e 20 6d 61 74 63 //return matc
06d0: 68 65 72 28 73 65 6c 65 63 74 6f 72 29 3b 0a 20 her(selector);.
06e0: 20 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 75 return resu
06f0: 6c 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f lt;. }.. /
0700: 2f 20 63 61 6c 63 75 6c 61 74 65 73 20 74 68 65 / calculates the
0710: 20 73 70 65 63 69 66 69 63 69 74 79 20 6f 66 20 specificity of
0720: 61 20 67 69 76 65 6e 20 60 73 65 6c 65 63 74 6f a given `selecto
0730: 72 60 0a 20 20 20 20 66 75 6e 63 74 69 6f 6e 20 r`. function
0740: 63 61 6c 63 75 6c 61 74 65 53 63 6f 72 65 28 73 calculateScore(s
0750: 65 6c 65 63 74 6f 72 29 20 7b 0a 20 20 20 20 20 elector) {.
0760: 20 20 20 76 61 72 20 73 63 6f 72 65 20 3d 20 5b var score = [
0770: 30 2c 30 2c 30 5d 2c 0a 20 20 20 20 20 20 20 20 0,0,0],.
0780: 20 20 20 20 70 61 72 74 73 20 3d 20 73 65 6c 65 parts = sele
0790: 63 74 6f 72 2e 73 70 6c 69 74 28 27 20 27 29 2c ctor.split(' '),
07a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 61 72 . par
07b0: 74 2c 20 6d 61 74 63 68 3b 0a 20 20 20 20 20 20 t, match;.
07c0: 20 20 2f 2f 54 4f 44 4f 3a 20 63 6c 65 61 6e 20 //TODO: clean
07d0: 74 68 65 20 27 3a 6e 6f 74 27 20 70 61 72 74 20 the ':not' part
07e0: 73 69 6e 63 65 20 74 68 65 20 6c 61 73 74 20 45 since the last E
07f0: 4c 45 4d 45 4e 54 5f 52 45 20 77 69 6c 6c 20 70 LEMENT_RE will p
0800: 69 63 6b 20 69 74 20 75 70 0a 20 20 20 20 20 20 ick it up.
0810: 20 20 77 68 69 6c 65 20 28 70 61 72 74 20 3d 20 while (part =
0820: 70 61 72 74 73 2e 73 68 69 66 74 28 29 2c 20 74 parts.shift(), t
0830: 79 70 65 6f 66 20 70 61 72 74 20 3d 3d 20 27 73 ypeof part == 's
0840: 74 72 69 6e 67 27 29 20 7b 0a 20 20 20 20 20 20 tring') {.
0850: 20 20 20 20 20 20 2f 2f 20 66 69 6e 64 20 61 6c // find al
0860: 6c 20 70 73 65 75 64 6f 2d 65 6c 65 6d 65 6e 74 l pseudo-element
0870: 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 61 s. ma
0880: 74 63 68 20 3d 20 5f 66 69 6e 64 28 70 61 72 74 tch = _find(part
0890: 2c 20 50 53 45 55 44 4f 5f 45 4c 45 4d 45 4e 54 , PSEUDO_ELEMENT
08a0: 53 5f 52 45 29 3b 0a 20 20 20 20 20 20 20 20 20 S_RE);.
08b0: 20 20 20 73 63 6f 72 65 5b 32 5d 20 2b 3d 20 6d score[2] += m
08c0: 61 74 63 68 3b 0a 20 20 20 20 20 20 20 20 20 20 atch;.
08d0: 20 20 2f 2f 20 61 6e 64 20 72 65 6d 6f 76 65 20 // and remove
08e0: 74 68 65 6d 0a 20 20 20 20 20 20 20 20 20 20 20 them.
08f0: 20 70 61 72 74 20 3d 20 70 61 72 74 2e 72 65 70 part = part.rep
0900: 6c 61 63 65 28 50 53 45 55 44 4f 5f 45 4c 45 4d lace(PSEUDO_ELEM
0910: 45 4e 54 53 5f 52 45 2c 20 27 27 29 3b 0a 20 20 ENTS_RE, '');.
0920: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 66 69 6e // fin
0930: 64 20 61 6c 6c 20 70 73 65 75 64 6f 2d 63 6c 61 d all pseudo-cla
0940: 73 73 65 73 0a 20 20 20 20 20 20 20 20 20 20 20 sses.
0950: 20 6d 61 74 63 68 20 3d 20 5f 66 69 6e 64 28 70 match = _find(p
0960: 61 72 74 2c 20 50 53 45 55 44 4f 5f 43 4c 41 53 art, PSEUDO_CLAS
0970: 53 45 53 5f 52 45 29 3b 0a 20 20 20 20 20 20 20 SES_RE);.
0980: 20 20 20 20 20 73 63 6f 72 65 5b 31 5d 20 2b 3d score[1] +=
0990: 20 6d 61 74 63 68 3b 0a 20 20 20 20 20 20 20 20 match;.
09a0: 20 20 20 20 2f 2f 20 61 6e 64 20 72 65 6d 6f 76 // and remov
09b0: 65 20 74 68 65 6d 0a 20 20 20 20 20 20 20 20 20 e them.
09c0: 20 20 20 70 61 72 74 20 3d 20 70 61 72 74 2e 72 part = part.r
09d0: 65 70 6c 61 63 65 28 50 53 45 55 44 4f 5f 43 4c eplace(PSEUDO_CL
09e0: 41 53 53 45 53 5f 52 45 2c 20 27 27 29 3b 0a 20 ASSES_RE, '');.
09f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 66 69 // fi
0a00: 6e 64 20 61 6c 6c 20 61 74 74 72 69 62 75 74 65 nd all attribute
0a10: 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 61 s. ma
0a20: 74 63 68 20 3d 20 5f 66 69 6e 64 28 70 61 72 74 tch = _find(part
0a30: 2c 20 41 54 54 52 5f 52 45 29 3b 0a 20 20 20 20 , ATTR_RE);.
0a40: 20 20 20 20 20 20 20 20 73 63 6f 72 65 5b 31 5d score[1]
0a50: 20 2b 3d 20 6d 61 74 63 68 3b 0a 20 20 20 20 20 += match;.
0a60: 20 20 20 20 20 20 20 2f 2f 20 61 6e 64 20 72 65 // and re
0a70: 6d 6f 76 65 20 74 68 65 6d 0a 20 20 20 20 20 20 move them.
0a80: 20 20 20 20 20 20 70 61 72 74 20 3d 20 70 61 72 part = par
0a90: 74 2e 72 65 70 6c 61 63 65 28 41 54 54 52 5f 52 t.replace(ATTR_R
0aa0: 45 2c 20 27 27 29 3b 0a 20 20 20 20 20 20 20 20 E, '');.
0ab0: 20 20 20 20 2f 2f 20 66 69 6e 64 20 61 6c 6c 20 // find all
0ac0: 49 44 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 IDs.
0ad0: 6d 61 74 63 68 20 3d 20 5f 66 69 6e 64 28 70 61 match = _find(pa
0ae0: 72 74 2c 20 49 44 5f 52 45 29 3b 0a 20 20 20 20 rt, ID_RE);.
0af0: 20 20 20 20 20 20 20 20 73 63 6f 72 65 5b 30 5d score[0]
0b00: 20 2b 3d 20 6d 61 74 63 68 3b 0a 20 20 20 20 20 += match;.
0b10: 20 20 20 20 20 20 20 2f 2f 20 61 6e 64 20 72 65 // and re
0b20: 6d 6f 76 65 20 74 68 65 6d 0a 20 20 20 20 20 20 move them.
0b30: 20 20 20 20 20 20 70 61 72 74 20 3d 20 70 61 72 part = par
0b40: 74 2e 72 65 70 6c 61 63 65 28 49 44 5f 52 45 2c t.replace(ID_RE,
0b50: 20 27 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 '');.
0b60: 20 20 2f 2f 20 66 69 6e 64 20 61 6c 6c 20 63 6c // find all cl
0b70: 61 73 73 65 73 0a 20 20 20 20 20 20 20 20 20 20 asses.
0b80: 20 20 6d 61 74 63 68 20 3d 20 5f 66 69 6e 64 28 match = _find(
0b90: 70 61 72 74 2c 20 43 4c 41 53 53 5f 52 45 29 3b part, CLASS_RE);
0ba0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 63 6f . sco
0bb0: 72 65 5b 31 5d 20 2b 3d 20 6d 61 74 63 68 3b 0a re[1] += match;.
0bc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 61 // a
0bd0: 6e 64 20 72 65 6d 6f 76 65 20 74 68 65 6d 0a 20 nd remove them.
0be0: 20 20 20 20 20 20 20 20 20 20 20 70 61 72 74 20 part
0bf0: 3d 20 70 61 72 74 2e 72 65 70 6c 61 63 65 28 43 = part.replace(C
0c00: 4c 41 53 53 5f 52 45 2c 20 27 27 29 3b 0a 20 20 LASS_RE, '');.
0c10: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 66 69 6e // fin
0c20: 64 20 61 6c 6c 20 65 6c 65 6d 65 6e 74 73 0a 20 d all elements.
0c30: 20 20 20 20 20 20 20 20 20 20 20 73 63 6f 72 65 score
0c40: 5b 32 5d 20 2b 3d 20 5f 66 69 6e 64 28 70 61 72 [2] += _find(par
0c50: 74 2c 20 45 4c 45 4d 45 4e 54 5f 52 45 29 3b 0a t, ELEMENT_RE);.
0c60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 }.
0c70: 20 20 72 65 74 75 72 6e 20 70 61 72 73 65 49 6e return parseIn
0c80: 74 28 73 63 6f 72 65 2e 6a 6f 69 6e 28 27 27 29 t(score.join('')
0c90: 2c 20 31 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 , 10);. }..
0ca0: 20 20 2f 2f 20 72 65 74 75 72 6e 73 20 74 68 65 // returns the
0cb0: 20 68 65 69 67 68 74 73 20 70 6f 73 73 69 62 6c heights possibl
0cc0: 65 20 73 70 65 63 69 66 69 63 69 74 79 20 73 63 e specificity sc
0cd0: 6f 72 65 20 61 6e 20 65 6c 65 6d 65 6e 74 20 63 ore an element c
0ce0: 61 6e 20 67 65 74 20 66 72 6f 6d 20 61 20 67 69 an get from a gi
0cf0: 76 65 20 72 75 6c 65 27 73 20 73 65 6c 65 63 74 ve rule's select
0d00: 6f 72 54 65 78 74 0a 20 20 20 20 66 75 6e 63 74 orText. funct
0d10: 69 6f 6e 20 67 65 74 53 70 65 63 69 66 69 63 69 ion getSpecifici
0d20: 74 79 53 63 6f 72 65 28 65 6c 65 6d 65 6e 74 2c tyScore(element,
0d30: 20 73 65 6c 65 63 74 6f 72 5f 74 65 78 74 29 20 selector_text)
0d40: 7b 0a 20 20 20 20 20 20 20 20 76 61 72 20 73 65 {. var se
0d50: 6c 65 63 74 6f 72 73 20 3d 20 73 65 6c 65 63 74 lectors = select
0d60: 6f 72 5f 74 65 78 74 2e 73 70 6c 69 74 28 27 2c or_text.split(',
0d70: 27 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 '),.
0d80: 73 65 6c 65 63 74 6f 72 2c 20 73 63 6f 72 65 2c selector, score,
0d90: 20 72 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 20 result = 0;.
0da0: 20 20 20 20 20 73 65 6c 65 63 74 6f 72 20 3d 20 selector =
0db0: 73 65 6c 65 63 74 6f 72 73 2e 73 68 69 66 74 28 selectors.shift(
0dc0: 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 );. while
0dd0: 20 28 73 65 6c 65 63 74 6f 72 29 20 7b 0a 20 20 (selector) {.
0de0: 20 20 20 20 20 20 20 20 69 66 20 28 6d 61 74 63 if (matc
0df0: 68 65 73 53 65 6c 65 63 74 6f 72 28 65 6c 65 6d hesSelector(elem
0e00: 65 6e 74 2c 20 73 65 6c 65 63 74 6f 72 29 29 20 ent, selector))
0e10: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 {.
0e20: 73 63 6f 72 65 20 3d 20 63 61 6c 63 75 6c 61 74 score = calculat
0e30: 65 53 63 6f 72 65 28 73 65 6c 65 63 74 6f 72 29 eScore(selector)
0e40: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;.
0e50: 72 65 73 75 6c 74 20 3d 20 73 63 6f 72 65 20 3e result = score >
0e60: 20 72 65 73 75 6c 74 20 3f 20 73 63 6f 72 65 20 result ? score
0e70: 3a 20 72 65 73 75 6c 74 3b 0a 20 20 20 20 20 20 : result;.
0e80: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 }.
0e90: 73 65 6c 65 63 74 6f 72 20 3d 20 73 65 6c 65 63 selector = selec
0ea0: 74 6f 72 73 2e 73 68 69 66 74 28 29 3b 0a 20 20 tors.shift();.
0eb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 }.
0ec0: 72 65 74 75 72 6e 20 72 65 73 75 6c 74 3b 0a 20 return result;.
0ed0: 20 20 20 7d 0a 0a 20 20 20 20 66 75 6e 63 74 69 }.. functi
0ee0: 6f 6e 20 73 6f 72 74 42 79 53 70 65 63 69 66 69 on sortBySpecifi
0ef0: 63 69 74 79 28 65 6c 65 6d 65 6e 74 2c 20 72 75 city(element, ru
0f00: 6c 65 73 29 20 7b 0a 20 20 20 20 20 20 20 20 2f les) {. /
0f10: 2f 20 63 6f 6d 70 61 72 69 6e 67 20 66 75 6e 63 / comparing func
0f20: 74 69 6f 6e 20 74 68 61 74 20 73 6f 72 74 73 20 tion that sorts
0f30: 43 53 53 53 74 79 6c 65 52 75 6c 65 73 20 61 63 CSSStyleRules ac
0f40: 63 6f 72 64 69 6e 67 20 74 6f 20 73 70 65 63 69 cording to speci
0f50: 66 69 63 69 74 79 20 6f 66 20 74 68 65 69 72 20 ficity of their
0f60: 60 73 65 6c 65 63 74 6f 72 54 65 78 74 60 0a 20 `selectorText`.
0f70: 20 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 20 function
0f80: 63 6f 6d 70 61 72 65 53 70 65 63 69 66 69 63 69 compareSpecifici
0f90: 74 79 20 28 61 2c 20 62 29 20 7b 0a 20 20 20 20 ty (a, b) {.
0fa0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 67 return g
0fb0: 65 74 53 70 65 63 69 66 69 63 69 74 79 53 63 6f etSpecificitySco
0fc0: 72 65 28 65 6c 65 6d 65 6e 74 2c 20 62 2e 73 65 re(element, b.se
0fd0: 6c 65 63 74 6f 72 54 65 78 74 29 20 2d 20 67 65 lectorText) - ge
0fe0: 74 53 70 65 63 69 66 69 63 69 74 79 53 63 6f 72 tSpecificityScor
0ff0: 65 28 65 6c 65 6d 65 6e 74 2c 20 61 2e 73 65 6c e(element, a.sel
1000: 65 63 74 6f 72 54 65 78 74 29 3b 0a 20 20 20 20 ectorText);.
1010: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 72 }.. r
1020: 65 74 75 72 6e 20 72 75 6c 65 73 2e 73 6f 72 74 eturn rules.sort
1030: 28 63 6f 6d 70 61 72 65 53 70 65 63 69 66 69 63 (compareSpecific
1040: 69 74 79 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 ity);. }..
1050: 20 2f 2f 54 4f 44 4f 3a 20 6e 6f 74 20 73 75 70 //TODO: not sup
1060: 70 6f 72 74 69 6e 67 20 32 6e 64 20 61 72 67 75 porting 2nd argu
1070: 6d 65 6e 74 20 66 6f 72 20 73 65 6c 65 63 74 69 ment for selecti
1080: 6e 67 20 70 73 65 75 64 6f 20 65 6c 65 6d 65 6e ng pseudo elemen
1090: 74 73 0a 20 20 20 20 2f 2f 54 4f 44 4f 3a 20 6e ts. //TODO: n
10a0: 6f 74 20 73 75 70 70 6f 72 74 69 6e 67 20 33 72 ot supporting 3r
10b0: 64 20 61 72 67 75 6d 65 6e 74 20 66 6f 72 20 63 d argument for c
10c0: 68 65 63 6b 69 6e 67 20 61 75 74 68 6f 72 20 73 hecking author s
10d0: 74 79 6c 65 20 73 68 65 65 74 73 20 6f 6e 6c 79 tyle sheets only
10e0: 0a 20 20 20 20 76 61 72 20 67 65 74 43 53 53 52 . var getCSSR
10f0: 75 6c 65 73 20 3d 20 66 75 6e 63 74 69 6f 6e 28 ules = function(
1100: 65 6c 65 6d 65 6e 74 29 20 7b 0a 20 20 20 20 20 element) {.
1110: 20 20 20 20 76 61 72 20 73 74 79 6c 65 5f 73 68 var style_sh
1120: 65 65 74 73 2c 20 73 68 65 65 74 2c 20 2f 2a 20 eets, sheet, /*
1130: 73 68 65 65 74 5f 6d 65 64 69 61 2c 20 2a 2f 0a sheet_media, */.
1140: 20 20 20 20 20 20 20 20 20 20 20 20 72 75 6c 65 rule
1150: 73 2c 20 72 75 6c 65 2c 0a 20 20 20 20 20 20 20 s, rule,.
1160: 20 20 20 20 20 72 65 73 75 6c 74 20 3d 20 5b 5d result = []
1170: 3b 0a 20 20 20 20 20 20 20 20 2f 2f 20 67 65 74 ;. // get
1180: 20 73 74 79 6c 65 73 68 65 65 74 73 20 61 6e 64 stylesheets and
1190: 20 63 6f 6e 76 65 72 74 20 74 6f 20 61 20 72 65 convert to a re
11a0: 67 75 6c 61 72 20 41 72 72 61 79 0a 20 20 20 20 gular Array.
11b0: 20 20 20 20 73 74 79 6c 65 5f 73 68 65 65 74 73 style_sheets
11c0: 20 3d 20 74 6f 41 72 72 61 79 28 77 69 6e 64 6f = toArray(windo
11d0: 77 2e 64 6f 63 75 6d 65 6e 74 2e 73 74 79 6c 65 w.document.style
11e0: 53 68 65 65 74 73 29 3b 0a 0a 20 20 20 20 20 20 Sheets);..
11f0: 20 20 2f 2f 20 61 73 73 75 6d 69 6e 67 20 74 68 // assuming th
1200: 65 20 62 72 6f 77 73 65 72 20 68 61 6e 64 73 20 e browser hands
1210: 75 73 20 73 74 79 6c 65 73 68 65 65 74 73 20 69 us stylesheets i
1220: 6e 20 6f 72 64 65 72 20 6f 66 20 61 70 70 65 61 n order of appea
1230: 72 61 6e 63 65 0a 20 20 20 20 20 20 20 20 2f 2f rance. //
1240: 20 77 65 20 69 74 65 72 61 74 65 20 74 68 65 6d we iterate them
1250: 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e from the beginn
1260: 69 6e 67 20 74 6f 20 66 6f 6c 6c 6f 77 20 70 72 ing to follow pr
1270: 6f 70 65 72 20 63 61 73 63 61 64 65 20 6f 72 64 oper cascade ord
1280: 65 72 0a 20 20 20 20 20 20 20 20 73 68 65 65 74 er. sheet
1290: 20 3d 20 73 74 79 6c 65 5f 73 68 65 65 74 73 2e = style_sheets.
12a0: 73 68 69 66 74 28 29 3b 0a 20 20 20 20 20 20 20 shift();.
12b0: 20 77 68 69 6c 65 20 28 73 68 65 65 74 29 20 7b while (sheet) {
12c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 . //
12d0: 67 65 74 20 74 68 65 20 73 74 79 6c 65 20 72 75 get the style ru
12e0: 6c 65 73 20 6f 66 20 74 68 69 73 20 73 68 65 65 les of this shee
12f0: 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 75 t. ru
1300: 6c 65 73 20 3d 20 67 65 74 53 68 65 65 74 52 75 les = getSheetRu
1310: 6c 65 73 28 73 68 65 65 74 29 3b 0a 20 20 20 20 les(sheet);.
1320: 20 20 20 20 20 20 20 20 2f 2f 20 6c 6f 6f 70 20 // loop
1330: 74 68 65 20 72 75 6c 65 73 20 69 6e 20 6f 72 64 the rules in ord
1340: 65 72 20 6f 66 20 61 70 70 65 61 72 61 6e 63 65 er of appearance
1350: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 75 6c . rul
1360: 65 20 3d 20 72 75 6c 65 73 2e 73 68 69 66 74 28 e = rules.shift(
1370: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 77 );. w
1380: 68 69 6c 65 20 28 72 75 6c 65 29 20 7b 0a 20 20 hile (rule) {.
1390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f //
13a0: 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 40 if this is an @
13b0: 69 6d 70 6f 72 74 20 72 75 6c 65 0a 20 20 20 20 import rule.
13c0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 if (
13d0: 72 75 6c 65 2e 73 74 79 6c 65 53 68 65 65 74 29 rule.styleSheet)
13e0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 {.
13f0: 20 20 20 20 20 20 20 2f 2f 20 69 6e 73 65 72 74 // insert
1400: 20 74 68 65 20 69 6d 70 6f 72 74 65 64 20 73 74 the imported st
1410: 79 6c 65 73 68 65 65 74 27 73 20 72 75 6c 65 73 ylesheet's rules
1420: 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e at the beginnin
1430: 67 20 6f 66 20 74 68 69 73 20 73 74 79 6c 65 73 g of this styles
1440: 68 65 65 74 27 73 20 72 75 6c 65 73 0a 20 20 20 heet's rules.
1450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1460: 20 72 75 6c 65 73 20 3d 20 67 65 74 53 68 65 65 rules = getShee
1470: 74 52 75 6c 65 73 28 72 75 6c 65 2e 73 74 79 6c tRules(rule.styl
1480: 65 53 68 65 65 74 29 2e 63 6f 6e 63 61 74 28 72 eSheet).concat(r
1490: 75 6c 65 73 29 3b 0a 20 20 20 20 20 20 20 20 20 ules);.
14a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 61 6e // an
14b0: 64 20 73 6b 69 70 20 74 68 69 73 20 72 75 6c 65 d skip this rule
14c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
14d0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 continue;.
14e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d }
14f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
1500: 20 2f 2f 20 69 66 20 74 68 65 72 65 27 73 20 6e // if there's n
1510: 6f 20 73 74 79 6c 65 73 68 65 65 74 20 61 74 74 o stylesheet att
1520: 72 69 62 75 74 65 20 42 55 54 20 74 68 65 72 65 ribute BUT there
1530: 20 49 53 20 61 20 6d 65 64 69 61 20 61 74 74 72 IS a media attr
1540: 69 62 75 74 65 20 69 74 27 73 20 61 20 6d 65 64 ibute it's a med
1550: 69 61 20 72 75 6c 65 0a 20 20 20 20 20 20 20 20 ia rule.
1560: 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66 20 else if
1570: 28 72 75 6c 65 2e 6d 65 64 69 61 29 20 7b 0a 20 (rule.media) {.
1580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1590: 20 20 20 2f 2f 20 69 6e 73 65 72 74 20 74 68 65 // insert the
15a0: 20 63 6f 6e 74 61 69 6e 65 64 20 72 75 6c 65 73 contained rules
15b0: 20 6f 66 20 74 68 69 73 20 6d 65 64 69 61 20 72 of this media r
15c0: 75 6c 65 20 74 6f 20 74 68 65 20 62 65 67 69 6e ule to the begin
15d0: 6e 69 6e 67 20 6f 66 20 74 68 69 73 20 73 74 79 ning of this sty
15e0: 6c 65 73 68 65 65 74 27 73 20 72 75 6c 65 73 0a lesheet's rules.
15f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1600: 20 20 20 20 72 75 6c 65 73 20 3d 20 67 65 74 53 rules = getS
1610: 68 65 65 74 52 75 6c 65 73 28 72 75 6c 65 29 2e heetRules(rule).
1620: 63 6f 6e 63 61 74 28 72 75 6c 65 73 29 3b 0a 20 concat(rules);.
1630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1640: 20 20 20 2f 2f 20 61 6e 64 20 73 6b 69 70 20 69 // and skip i
1650: 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 t.
1660: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a continue;.
1670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1680: 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 }..
1690: 20 20 20 2f 2f 20 63 68 65 63 6b 20 69 66 20 74 // check if t
16a0: 68 69 73 20 65 6c 65 6d 65 6e 74 20 6d 61 74 63 his element matc
16b0: 68 65 73 20 74 68 69 73 20 72 75 6c 65 27 73 20 hes this rule's
16c0: 73 65 6c 65 63 74 6f 72 0a 20 20 20 20 20 20 20 selector.
16d0: 20 20 20 20 20 20 20 20 20 69 66 20 28 6d 61 74 if (mat
16e0: 63 68 65 73 53 65 6c 65 63 74 6f 72 28 65 6c 65 chesSelector(ele
16f0: 6d 65 6e 74 2c 20 72 75 6c 65 2e 73 65 6c 65 63 ment, rule.selec
1700: 74 6f 72 54 65 78 74 29 29 20 7b 0a 20 20 20 20 torText)) {.
1710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1720: 2f 2f 20 70 75 73 68 20 74 68 65 20 72 75 6c 65 // push the rule
1730: 20 74 6f 20 74 68 65 20 72 65 73 75 6c 74 73 20 to the results
1740: 73 65 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 set.
1750: 20 20 20 20 20 20 20 20 72 65 73 75 6c 74 2e 70 result.p
1760: 75 73 68 28 72 75 6c 65 29 3b 0a 20 20 20 20 20 ush(rule);.
1770: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 }.
1780: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 75 6c rul
1790: 65 20 3d 20 72 75 6c 65 73 2e 73 68 69 66 74 28 e = rules.shift(
17a0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d );. }
17b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 68 65 . she
17c0: 65 74 20 3d 20 73 74 79 6c 65 5f 73 68 65 65 74 et = style_sheet
17d0: 73 2e 73 68 69 66 74 28 29 3b 0a 20 20 20 20 20 s.shift();.
17e0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2f 20 }. //
17f0: 73 6f 72 74 20 61 63 63 6f 72 64 69 6e 67 20 74 sort according t
1800: 6f 20 73 70 65 63 69 66 69 63 69 74 79 0a 20 20 o specificity.
1810: 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 6f 72 return sor
1820: 74 42 79 53 70 65 63 69 66 69 63 69 74 79 28 65 tBySpecificity(e
1830: 6c 65 6d 65 6e 74 2c 20 72 65 73 75 6c 74 29 3b lement, result);
1840: 0a 20 20 20 20 7d 3b 0a 2f 2f 20 20 7d 0a 0a 0a . };.// }...
1850: 65 78 70 6f 72 74 73 2e 70 61 72 73 65 53 69 7a exports.parseSiz
1860: 65 20 3d 20 66 75 6e 63 74 69 6f 6e 28 65 6c 65 e = function(ele
1870: 6d 65 6e 74 29 20 7b 0a 20 20 6c 65 74 20 72 75 ment) {. let ru
1880: 6c 65 73 20 3d 20 67 65 74 43 53 53 52 75 6c 65 les = getCSSRule
1890: 73 28 65 6c 65 6d 65 6e 74 29 3b 0a 20 20 63 6f s(element);. co
18a0: 6e 73 6f 6c 65 2e 6c 6f 67 28 72 75 6c 65 73 29 nsole.log(rules)
18b0: 3b 0a 7d 3b 0a ;.};.