| 156 | }; |
| 157 | |
| 158 | let highlightCSS = (code) => { |
| 159 | let out = ''; |
| 160 | let i = 0; |
| 161 | let len = code.length; |
| 162 | let inBlock = false; |
| 163 | while (i < len) { |
| 164 | let c = code[i]; |
| 165 | if (c === '/' && code[i + 1] === '*') { |
| 166 | let end = code.indexOf('*/', i + 2); |
| 167 | end = end === -1 ? len : end + 2; |
| 168 | out += span('comment', code.substring(i, end)); |
| 169 | i = end; |
| 170 | } else if (c === '"' || c === "'") { |
| 171 | let q = c, j = i + 1; |
| 172 | while (j < len && code[j] !== q) { if (code[j] === '\\') j++; j++; } |
| 173 | if (j < len) j++; |
| 174 | out += span('string', code.substring(i, j)); |
| 175 | i = j; |
| 176 | } else if (c === '{') { inBlock = true; out += esc(c); i++; } |
| 177 | else if (c === '}') { inBlock = false; out += esc(c); i++; } |
| 178 | else if (c === '@') { |
| 179 | let j = i + 1; |
| 180 | while (j < len && /[a-zA-Z-]/.test(code[j])) j++; |
| 181 | out += span('keyword', code.substring(i, j)); |
| 182 | i = j; |
| 183 | } else if (c === '#' && !inBlock) { |
| 184 | let j = i; |
| 185 | while (j < len && /[a-zA-Z0-9_#-]/.test(code[j])) j++; |
| 186 | out += span('selector-id', code.substring(i, j)); |
| 187 | i = j; |
| 188 | } else if (c === '.' && !inBlock && /[a-zA-Z_-]/.test(code[i + 1] || '')) { |
| 189 | let j = i; |
| 190 | while (j < len && /[a-zA-Z0-9_.-]/.test(code[j])) j++; |
| 191 | out += span('selector-class', code.substring(i, j)); |
| 192 | i = j; |
| 193 | } else if (c === ':' && !inBlock) { |
| 194 | let j = i + 1; |
| 195 | while (j < len && /[a-zA-Z0-9_(-]/.test(code[j])) j++; |
| 196 | out += span('selector-pseudo', code.substring(i, j)); |
| 197 | i = j; |
| 198 | } else if (/[0-9]/.test(c) || (c === '.' && /[0-9]/.test(code[i + 1]))) { |
| 199 | let j = i; |
| 200 | while (j < len && /[0-9.]/.test(code[j])) j++; |
| 201 | while (j < len && /[a-zA-Z%]/.test(code[j])) j++; |
| 202 | out += span('number', code.substring(i, j)); |
| 203 | i = j; |
| 204 | } else if (c === '#' && inBlock) { |
| 205 | let j = i + 1; |
| 206 | while (j < len && /[0-9a-fA-F]/.test(code[j])) j++; |
| 207 | out += span('number', code.substring(i, j)); |
| 208 | i = j; |
| 209 | } else if (inBlock && /[a-zA-Z-]/.test(c)) { |
| 210 | let j = i; |
| 211 | while (j < len && /[a-zA-Z0-9-]/.test(code[j])) j++; |
| 212 | let word = code.substring(i, j); |
| 213 | if (CSS_PROPS.has(word)) out += span('attribute', word); |
| 214 | else out += esc(word); |
| 215 | i = j; |