(token)
| 40 | } |
| 41 | |
| 42 | atrule(token) { |
| 43 | let node = new AtRule() |
| 44 | node.name = token[1].slice(1) |
| 45 | if (node.name === '') { |
| 46 | this.unnamedAtrule(node, token) |
| 47 | } |
| 48 | this.init(node, token[2]) |
| 49 | |
| 50 | let type |
| 51 | let prev |
| 52 | let shift |
| 53 | let last = false |
| 54 | let open = false |
| 55 | let params = [] |
| 56 | let brackets = [] |
| 57 | |
| 58 | while (!this.tokenizer.endOfFile()) { |
| 59 | token = this.tokenizer.nextToken() |
| 60 | type = token[0] |
| 61 | |
| 62 | if (type === '(' || type === '[') { |
| 63 | brackets.push(type === '(' ? ')' : ']') |
| 64 | } else if (type === '{' && brackets.length > 0) { |
| 65 | brackets.push('}') |
| 66 | } else if (type === brackets[brackets.length - 1]) { |
| 67 | brackets.pop() |
| 68 | } |
| 69 | |
| 70 | if (brackets.length === 0) { |
| 71 | if (type === ';') { |
| 72 | node.source.end = this.getPosition(token[2]) |
| 73 | node.source.end.offset++ |
| 74 | this.semicolon = true |
| 75 | break |
| 76 | } else if (type === '{') { |
| 77 | open = true |
| 78 | break |
| 79 | } else if (type === '}') { |
| 80 | if (params.length > 0) { |
| 81 | shift = params.length - 1 |
| 82 | prev = params[shift] |
| 83 | while (prev && prev[0] === 'space') { |
| 84 | prev = params[--shift] |
| 85 | } |
| 86 | if (prev) { |
| 87 | node.source.end = this.getPosition(prev[3] || prev[2]) |
| 88 | node.source.end.offset++ |
| 89 | } |
| 90 | } |
| 91 | this.end(token) |
| 92 | break |
| 93 | } else { |
| 94 | params.push(token) |
| 95 | } |
| 96 | } else { |
| 97 | params.push(token) |
| 98 | } |
| 99 |
no test coverage detected