Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 1 | 'use strict' |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 2 | |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 3 | const DEFAULT_RAW = { |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 4 | colon: ': ', |
| 5 | indent: ' ', |
| 6 | beforeDecl: '\n', |
| 7 | beforeRule: '\n', |
| 8 | beforeOpen: ' ', |
| 9 | beforeClose: '\n', |
| 10 | beforeComment: '\n', |
| 11 | after: '\n', |
| 12 | emptyBody: '', |
| 13 | commentLeft: ' ', |
| 14 | commentRight: ' ', |
| 15 | semicolon: false |
Tim van der Lippe | f2ea2c9 | 2021-11-08 10:55:56 +0000 | [diff] [blame] | 16 | } |
| 17 | |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 18 | function capitalize(str) { |
| 19 | return str[0].toUpperCase() + str.slice(1) |
| 20 | } |
| 21 | |
| 22 | class Stringifier { |
| 23 | constructor(builder) { |
| 24 | this.builder = builder |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 25 | } |
| 26 | |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 27 | stringify(node, semicolon) { |
| 28 | /* istanbul ignore if */ |
| 29 | if (!this[node.type]) { |
| 30 | throw new Error( |
| 31 | 'Unknown AST node type ' + |
| 32 | node.type + |
| 33 | '. ' + |
| 34 | 'Maybe you need to change PostCSS stringifier.' |
| 35 | ) |
| 36 | } |
| 37 | this[node.type](node, semicolon) |
| 38 | } |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 39 | |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 40 | document(node) { |
| 41 | this.body(node) |
| 42 | } |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 43 | |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 44 | root(node) { |
| 45 | this.body(node) |
| 46 | if (node.raws.after) this.builder(node.raws.after) |
| 47 | } |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 48 | |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 49 | comment(node) { |
| 50 | let left = this.raw(node, 'left', 'commentLeft') |
| 51 | let right = this.raw(node, 'right', 'commentRight') |
| 52 | this.builder('/*' + left + node.text + right + '*/', node) |
| 53 | } |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 54 | |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 55 | decl(node, semicolon) { |
| 56 | let between = this.raw(node, 'between', 'colon') |
| 57 | let string = node.prop + between + this.rawValue(node, 'value') |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 58 | |
| 59 | if (node.important) { |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 60 | string += node.raws.important || ' !important' |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 61 | } |
| 62 | |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 63 | if (semicolon) string += ';' |
| 64 | this.builder(string, node) |
| 65 | } |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 66 | |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 67 | rule(node) { |
| 68 | this.block(node, this.rawValue(node, 'selector')) |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 69 | if (node.raws.ownSemicolon) { |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 70 | this.builder(node.raws.ownSemicolon, node, 'end') |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 71 | } |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 72 | } |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 73 | |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 74 | atrule(node, semicolon) { |
| 75 | let name = '@' + node.name |
| 76 | let params = node.params ? this.rawValue(node, 'params') : '' |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 77 | |
| 78 | if (typeof node.raws.afterName !== 'undefined') { |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 79 | name += node.raws.afterName |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 80 | } else if (params) { |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 81 | name += ' ' |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 82 | } |
| 83 | |
| 84 | if (node.nodes) { |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 85 | this.block(node, name + params) |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 86 | } else { |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 87 | let end = (node.raws.between || '') + (semicolon ? ';' : '') |
| 88 | this.builder(name + params + end, node) |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 89 | } |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 90 | } |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 91 | |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 92 | body(node) { |
| 93 | let last = node.nodes.length - 1 |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 94 | while (last > 0) { |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 95 | if (node.nodes[last].type !== 'comment') break |
| 96 | last -= 1 |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 97 | } |
| 98 | |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 99 | let semicolon = this.raw(node, 'semicolon') |
| 100 | for (let i = 0; i < node.nodes.length; i++) { |
| 101 | let child = node.nodes[i] |
| 102 | let before = this.raw(child, 'before') |
| 103 | if (before) this.builder(before) |
| 104 | this.stringify(child, last !== i || semicolon) |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 105 | } |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 106 | } |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 107 | |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 108 | block(node, start) { |
| 109 | let between = this.raw(node, 'between', 'beforeOpen') |
| 110 | this.builder(start + between + '{', node, 'start') |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 111 | |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 112 | let after |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 113 | if (node.nodes && node.nodes.length) { |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 114 | this.body(node) |
| 115 | after = this.raw(node, 'after') |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 116 | } else { |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 117 | after = this.raw(node, 'after', 'emptyBody') |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 118 | } |
| 119 | |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 120 | if (after) this.builder(after) |
| 121 | this.builder('}', node, 'end') |
| 122 | } |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 123 | |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 124 | raw(node, own, detect) { |
| 125 | let value |
| 126 | if (!detect) detect = own |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 127 | |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 128 | // Already had |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 129 | if (own) { |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 130 | value = node.raws[own] |
| 131 | if (typeof value !== 'undefined') return value |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 132 | } |
| 133 | |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 134 | let parent = node.parent |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 135 | |
| 136 | if (detect === 'before') { |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 137 | // Hack for first rule in CSS |
| 138 | if (!parent || (parent.type === 'root' && parent.first === node)) { |
| 139 | return '' |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 140 | } |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 141 | |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 142 | // `root` nodes in `document` should use only their own raws |
| 143 | if (parent && parent.type === 'document') { |
| 144 | return '' |
| 145 | } |
| 146 | } |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 147 | |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 148 | // Floating child without parent |
| 149 | if (!parent) return DEFAULT_RAW[detect] |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 150 | |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 151 | // Detect style by other nodes |
| 152 | let root = node.root() |
| 153 | if (!root.rawCache) root.rawCache = {} |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 154 | if (typeof root.rawCache[detect] !== 'undefined') { |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 155 | return root.rawCache[detect] |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 156 | } |
| 157 | |
| 158 | if (detect === 'before' || detect === 'after') { |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 159 | return this.beforeAfter(node, detect) |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 160 | } else { |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 161 | let method = 'raw' + capitalize(detect) |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 162 | if (this[method]) { |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 163 | value = this[method](root, node) |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 164 | } else { |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 165 | root.walk(i => { |
| 166 | value = i.raws[own] |
| 167 | if (typeof value !== 'undefined') return false |
| 168 | }) |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 169 | } |
| 170 | } |
| 171 | |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 172 | if (typeof value === 'undefined') value = DEFAULT_RAW[detect] |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 173 | |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 174 | root.rawCache[detect] = value |
| 175 | return value |
| 176 | } |
| 177 | |
| 178 | rawSemicolon(root) { |
| 179 | let value |
| 180 | root.walk(i => { |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 181 | if (i.nodes && i.nodes.length && i.last.type === 'decl') { |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 182 | value = i.raws.semicolon |
| 183 | if (typeof value !== 'undefined') return false |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 184 | } |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 185 | }) |
| 186 | return value |
| 187 | } |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 188 | |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 189 | rawEmptyBody(root) { |
| 190 | let value |
| 191 | root.walk(i => { |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 192 | if (i.nodes && i.nodes.length === 0) { |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 193 | value = i.raws.after |
| 194 | if (typeof value !== 'undefined') return false |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 195 | } |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 196 | }) |
| 197 | return value |
| 198 | } |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 199 | |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 200 | rawIndent(root) { |
| 201 | if (root.raws.indent) return root.raws.indent |
| 202 | let value |
| 203 | root.walk(i => { |
| 204 | let p = i.parent |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 205 | if (p && p !== root && p.parent && p.parent === root) { |
| 206 | if (typeof i.raws.before !== 'undefined') { |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 207 | let parts = i.raws.before.split('\n') |
| 208 | value = parts[parts.length - 1] |
| 209 | value = value.replace(/\S/g, '') |
| 210 | return false |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 211 | } |
| 212 | } |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 213 | }) |
| 214 | return value |
| 215 | } |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 216 | |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 217 | rawBeforeComment(root, node) { |
| 218 | let value |
| 219 | root.walkComments(i => { |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 220 | if (typeof i.raws.before !== 'undefined') { |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 221 | value = i.raws.before |
| 222 | if (value.includes('\n')) { |
| 223 | value = value.replace(/[^\n]+$/, '') |
Tim van der Lippe | 2b4a9df | 2021-11-08 12:58:12 +0000 | [diff] [blame] | 224 | } |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 225 | return false |
Tim van der Lippe | 2b4a9df | 2021-11-08 12:58:12 +0000 | [diff] [blame] | 226 | } |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 227 | }) |
Tim van der Lippe | 2b4a9df | 2021-11-08 12:58:12 +0000 | [diff] [blame] | 228 | if (typeof value === 'undefined') { |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 229 | value = this.raw(node, null, 'beforeDecl') |
Tim van der Lippe | 2b4a9df | 2021-11-08 12:58:12 +0000 | [diff] [blame] | 230 | } else if (value) { |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 231 | value = value.replace(/\S/g, '') |
Tim van der Lippe | 2b4a9df | 2021-11-08 12:58:12 +0000 | [diff] [blame] | 232 | } |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 233 | return value |
| 234 | } |
Tim van der Lippe | 2b4a9df | 2021-11-08 12:58:12 +0000 | [diff] [blame] | 235 | |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 236 | rawBeforeDecl(root, node) { |
| 237 | let value |
| 238 | root.walkDecls(i => { |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 239 | if (typeof i.raws.before !== 'undefined') { |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 240 | value = i.raws.before |
| 241 | if (value.includes('\n')) { |
| 242 | value = value.replace(/[^\n]+$/, '') |
Tim van der Lippe | 2b4a9df | 2021-11-08 12:58:12 +0000 | [diff] [blame] | 243 | } |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 244 | return false |
Tim van der Lippe | 2b4a9df | 2021-11-08 12:58:12 +0000 | [diff] [blame] | 245 | } |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 246 | }) |
Tim van der Lippe | 2b4a9df | 2021-11-08 12:58:12 +0000 | [diff] [blame] | 247 | if (typeof value === 'undefined') { |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 248 | value = this.raw(node, null, 'beforeRule') |
Tim van der Lippe | 2b4a9df | 2021-11-08 12:58:12 +0000 | [diff] [blame] | 249 | } else if (value) { |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 250 | value = value.replace(/\S/g, '') |
Tim van der Lippe | 2b4a9df | 2021-11-08 12:58:12 +0000 | [diff] [blame] | 251 | } |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 252 | return value |
| 253 | } |
Tim van der Lippe | 2b4a9df | 2021-11-08 12:58:12 +0000 | [diff] [blame] | 254 | |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 255 | rawBeforeRule(root) { |
| 256 | let value |
| 257 | root.walk(i => { |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 258 | if (i.nodes && (i.parent !== root || root.first !== i)) { |
| 259 | if (typeof i.raws.before !== 'undefined') { |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 260 | value = i.raws.before |
| 261 | if (value.includes('\n')) { |
| 262 | value = value.replace(/[^\n]+$/, '') |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 263 | } |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 264 | return false |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 265 | } |
| 266 | } |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 267 | }) |
| 268 | if (value) value = value.replace(/\S/g, '') |
| 269 | return value |
| 270 | } |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 271 | |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 272 | rawBeforeClose(root) { |
| 273 | let value |
| 274 | root.walk(i => { |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 275 | if (i.nodes && i.nodes.length > 0) { |
| 276 | if (typeof i.raws.after !== 'undefined') { |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 277 | value = i.raws.after |
| 278 | if (value.includes('\n')) { |
| 279 | value = value.replace(/[^\n]+$/, '') |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 280 | } |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 281 | return false |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 282 | } |
| 283 | } |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 284 | }) |
| 285 | if (value) value = value.replace(/\S/g, '') |
| 286 | return value |
| 287 | } |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 288 | |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 289 | rawBeforeOpen(root) { |
| 290 | let value |
| 291 | root.walk(i => { |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 292 | if (i.type !== 'decl') { |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 293 | value = i.raws.between |
| 294 | if (typeof value !== 'undefined') return false |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 295 | } |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 296 | }) |
| 297 | return value |
| 298 | } |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 299 | |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 300 | rawColon(root) { |
| 301 | let value |
| 302 | root.walkDecls(i => { |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 303 | if (typeof i.raws.between !== 'undefined') { |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 304 | value = i.raws.between.replace(/[^\s:]/g, '') |
| 305 | return false |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 306 | } |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 307 | }) |
| 308 | return value |
| 309 | } |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 310 | |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 311 | beforeAfter(node, detect) { |
| 312 | let value |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 313 | if (node.type === 'decl') { |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 314 | value = this.raw(node, null, 'beforeDecl') |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 315 | } else if (node.type === 'comment') { |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 316 | value = this.raw(node, null, 'beforeComment') |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 317 | } else if (detect === 'before') { |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 318 | value = this.raw(node, null, 'beforeRule') |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 319 | } else { |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 320 | value = this.raw(node, null, 'beforeClose') |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 321 | } |
| 322 | |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 323 | let buf = node.parent |
| 324 | let depth = 0 |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 325 | while (buf && buf.type !== 'root') { |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 326 | depth += 1 |
| 327 | buf = buf.parent |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 328 | } |
| 329 | |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 330 | if (value.includes('\n')) { |
| 331 | let indent = this.raw(node, null, 'indent') |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 332 | if (indent.length) { |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 333 | for (let step = 0; step < depth; step++) value += indent |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 334 | } |
| 335 | } |
| 336 | |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 337 | return value |
| 338 | } |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 339 | |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 340 | rawValue(node, prop) { |
| 341 | let value = node[prop] |
| 342 | let raw = node.raws[prop] |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 343 | if (raw && raw.value === value) { |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 344 | return raw.raw |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 345 | } |
| 346 | |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 347 | return value |
| 348 | } |
| 349 | } |
Mathias Bynens | 79e2cf0 | 2020-05-29 16:46:17 +0200 | [diff] [blame] | 350 | |
Tim van der Lippe | 16b8228 | 2021-11-08 13:50:26 +0000 | [diff] [blame] | 351 | module.exports = Stringifier |