Если использование интерфейса командной строки не подходит для вашего рабочего процесса, вы можете напрямую использовать API CSS Windi.
Добавьте пакет:
npm i -D windicss
const { Processor } = require('windicss/lib')
const { HTMLParser } = require('windicss/utils/parser')
export function generateStyles(html) {
// Получите процессор Windi
const processor = new Processor()
// Разберите все классы и поместите в одну строку, чтобы упростить операции
const htmlClasses = new HTMLParser(html)
.parseClasses()
.map(i => i.result)
.join(' ')
// Генерация предпечатной проверки на основе введенного html
const preflightSheet = processor.preflight(html)
// Обработка классов html в интерпретируемую таблицу стилей
const interpretedSheet = processor.interpret(htmlClasses).styleSheet
// Стили сборки
const APPEND = false
const MINIFY = false
const styles = interpretedSheet.extend(preflightSheet, APPEND).build(MINIFY)
return styles
}
В режиме компиляции требуется немного больше усилий, чтобы заменить скомпилированные имена классов на текущие.
Подробнее о режиме компиляции здесь.
const { Processor } = require('windicss/lib')
const { HTMLParser } = require('windicss/utils/parser')
export function generateStyles(html) {
// Получите процессор Windi
const processor = new Processor()
// Разберите html, чтобы получить массив совпадений классов с местоположением
const parser = new HTMLParser(html)
// Генерация предпечатной проверки на основе введенного html
const preflightSheet = processor.preflight(html)
const PREFIX = 'windi-'
const outputCSS = []
let outputHTML = ''
let indexStart = 0
parser.parseClasses().forEach((p) => {
// добавить подстроку HTML из индекса для соответствия началу
outputHTML += html.substring(indexStart, p.start)
// создать таблицу стилей
const style = processor.compile(p.result, PREFIX)
// добавить таблицу стилей в стек стилей
outputCSS.push(style.styleSheet)
// добавить игнорируемые классы и нажать на вывод
outputHTML += [style.className, ...style.ignored].join(' ')
// отметьте конец как новый старт для следующей итерации
indexStart = p.end
})
// добавить оставшуюся часть HTML
outputHTML += html.substring(indexStart)
// Стили сборки
const MINIFY = false
const styles = outputCSS
// расширять предпечатный лист каждым листом из стопки
.reduce((acc, curr) => acc.extend(curr), preflightSheet)
.build(MINIFY)
return {
styles,
outputHTML,
}
}
В режиме атрибуции требуется немного больше работы для анализа каждого отдельного атрибута.
Подробнее о режиме атрибуции здесь И вы можете найти синтаксис здесь
const { Processor } = require('windicss/lib')
const { HTMLParser } = require('windicss/utils/parser')
export function generateStyles(html) {
// Получите процессор Windi
const processor = new Processor()
// Разберите html, чтобы получить массив совпадений классов с местоположением
const parser = new HTMLParser(html)
// Генерация предпечатной проверки на основе введенного html
const preflightSheet = processor.preflight(html)
// Всегда возвращает массив
const castArray = val => (Array.isArray(val) ? val : [val])
const attrs = parser.parseAttrs().reduceRight((acc, curr) => {
// получить текущий ключ соответствия
const attrKey = curr.key
// игнорировать атрибуты class или className
if (attrKey === 'class' || attrKey === 'className') return acc
// получить текущее значение соответствия в виде массива
const attrValue = castArray(curr.value)
// если текущий ключ совпадения уже находится в аккумуляторе
if (attrKey in acc) {
// получить текущее значение ключа attr в виде массива
const attrKeyValue = castArray(acc[attrKey])
// добавить текущее значение к значению аккумулятора
acc[attrKey] = [...attrKeyValue, ...attrValue]
} else {
// иначе добавить массив значений атрибута в аккумулятор
acc[attrKey] = attrValue
}
return acc
}, {})
// Стили сборки
const MINIFY = false
const styles = processor
.attributify(attrs)
.styleSheet.extend(preflightSheet)
.build(MINIFY)
return styles
}