Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 | 2x 2x 9x 78x 9x 9x 8x 8x 8x 8x 6x 6x 6x 1x 6x 2x 2x 31x 31x 31x 2x 31x 24x 6x 6x 6x 6x 6x 36x 36x 69x 69x 69x 3x 69x 69x 30x 30x 30x 69x 69x 47x 47x 69x 52x 60x 60x 60x 2x 58x | const DEFAULT_RAWS = {
colon: ': ',
indent: ' ',
commentLeft: ' ',
commentRight: ' '
}
module.exports = class Stringifier {
constructor(builder) {
this.builder = builder
}
stringify(node, semicolon) {
this[node.type](node, semicolon)
}
root(node) {
this.body(node)
if (node.raws.after) this.builder(node.raws.after)
}
comment(node) {
let left = DEFAULT_RAWS.commentLeft
let right = DEFAULT_RAWS.commentRight
Eif (this.has(node.raws.left)) left = node.raws.left
if (node.raws.inline) {
Eif (this.has(node.raws.inlineRight)) {
right = node.raws.inlineRight
} else {
right = ''
}
if (node.raws.extraIndent) {
this.builder(node.raws.extraIndent)
}
this.builder('//' + left + node.text + right, node)
} else {
Iif (this.has(node.raws.right)) right = node.raws.right
this.builder('/*' + left + node.text + right + '*/', node)
}
}
decl(node) {
let between = node.raws.between || DEFAULT_RAWS.colon
let string = node.prop + between + this.rawValue(node, 'value')
if (node.important) {
string += node.raws.important || ' !important'
}
this.builder(string, node)
}
rule(node) {
this.block(node, this.rawValue(node, 'selector'))
}
atrule(node) {
let name = '@' + node.name
let params = node.params ? this.rawValue(node, 'params') : ''
Eif (this.has(node.raws.afterName)) {
name += node.raws.afterName
} else if (params) {
name += ' '
}
this.block(node, name + params)
}
body(node) {
let indent = node.root().raws.indent || DEFAULT_RAWS.indent
for (let i = 0; i < node.nodes.length; i++) {
let child = node.nodes[i]
let before =
child.raws.before.replace(/[^\n]*$/, '') + this.indent(node, indent)
if (child.type === 'comment' && !child.raws.before.includes('\n')) {
before = child.raws.before
}
if (before) this.builder(before)
this.stringify(child)
}
}
block(node, start) {
let between = node.raws.sssBetween || ''
this.builder(start + between, node, 'start')
if (this.has(node.nodes)) this.body(node)
}
indent(node, step) {
let result = ''
while (node.parent) {
result += step
node = node.parent
}
return result
}
has(value) {
return typeof value !== 'undefined'
}
rawValue(node, prop) {
let value = node[prop]
let raw = node.raws[prop]
if (raw && raw.value === value) {
return raw.sss || raw.raw
} else {
return value
}
}
}
|