提交 4cf23077 编写于 作者: fxy060608's avatar fxy060608

wip(app): nvue styler

上级 2c277aaf
...@@ -106,8 +106,8 @@ export function uniAppNVuePlugin({ ...@@ -106,8 +106,8 @@ export function uniAppNVuePlugin({
} }
const { code, messages } = await parse(source, { const { code, messages } = await parse(source, {
filename, filename,
descendant: false,
logLevel: 'WARNING', logLevel: 'WARNING',
combinators: false,
}) })
messages.forEach((message) => { messages.forEach((message) => {
if (message.type === 'warning') { if (message.type === 'warning') {
......
import { parse } from '../src'
async function objectifierRule(input: string) {
const { code, messages } = await parse(input, {
combinators: true,
logLevel: 'NOTE',
})
return {
json: JSON.parse(code),
messages,
}
}
describe('nvue-styler: combinators', () => {
test('descendant', async () => {
const { json, messages } = await objectifierRule(
` .bar {left:5;}.foo .bar {left: 0;}.foo .bar{left:5;right:10;}.bar .bar{left:2}.foo .bar .foobar{left:1}`
)
console.log(json, messages)
expect(json).toEqual({
bar: {
left: 5,
},
'.bar': {
'.foo': {
left: 5,
right: 10,
},
'.bar': {
left: 2,
},
},
'.foobar': { '.foo .bar': { left: 1 } },
})
expect(messages.length).toBe(0)
})
})
...@@ -11,13 +11,13 @@ import { normalizeMap } from './map' ...@@ -11,13 +11,13 @@ import { normalizeMap } from './map'
const normalized = Symbol('normalized') const normalized = Symbol('normalized')
export interface NormalizeOptions { export interface NormalizeOptions {
descendant?: boolean combinators?: boolean
logLevel?: 'NOTE' | 'WARNING' | 'ERROR' logLevel?: 'NOTE' | 'WARNING' | 'ERROR'
} }
export function normalize(opts: NormalizeOptions = {}): Plugin { export function normalize(opts: NormalizeOptions = {}): Plugin {
if (!hasOwn(opts, 'descendant')) { if (!hasOwn(opts, 'combinators')) {
opts.descendant = false opts.combinators = false
} }
if (!hasOwn(opts, 'logLevel')) { if (!hasOwn(opts, 'logLevel')) {
opts.logLevel = 'WARNING' opts.logLevel = 'WARNING'
...@@ -32,19 +32,22 @@ export function normalize(opts: NormalizeOptions = {}): Plugin { ...@@ -32,19 +32,22 @@ export function normalize(opts: NormalizeOptions = {}): Plugin {
return plugin return plugin
} }
function createRuleProcessor({ descendant }: NormalizeOptions) { function createRuleProcessor({ combinators }: NormalizeOptions) {
return (rule: Rule, helper: Helpers) => { return (rule: Rule, helper: Helpers) => {
if ((rule as any)[normalized]) { if ((rule as any)[normalized]) {
return return
} }
const regx = descendant const regx = combinators
? /^((?:(?:\.[A-Za-z0-9_\-]+)+[\+\~\> ])*)((?:\.[A-Za-z0-9_\-\:]+)+)$/ ? /^((?:(?:\.[A-Za-z0-9_\-]+)+[\+\~\> ])*)((?:\.[A-Za-z0-9_\-\:]+)+)$/
: /^(\.)([A-Za-z0-9_\-:]+)$/ : /^(\.)([A-Za-z0-9_\-:]+)$/
rule.selector = rule.selectors rule.selector = rule.selectors
.filter((selector) => { .map((selector) => {
selector = selector
.replace(/\s*([\+\~\>])\s*/g, '$1')
.replace(/\s+/, ' ')
if (regx.test(selector)) { if (regx.test(selector)) {
return true return selector
} }
rule.warn( rule.warn(
helper.result, helper.result,
...@@ -52,8 +55,9 @@ function createRuleProcessor({ descendant }: NormalizeOptions) { ...@@ -52,8 +55,9 @@ function createRuleProcessor({ descendant }: NormalizeOptions) {
selector + selector +
'` is not supported. nvue only support classname selector' '` is not supported. nvue only support classname selector'
) )
return false return ''
}) })
.filter(Boolean)
.join(', ') .join(', ')
if (!rule.selector) { if (!rule.selector) {
rule.remove() rule.remove()
......
...@@ -10,7 +10,10 @@ export function objectifier(node: Root | Document | Container | null) { ...@@ -10,7 +10,10 @@ export function objectifier(node: Root | Document | Container | null) {
if (!node) { if (!node) {
return {} return {}
} }
const context: ObjectifierContext = { 'FONT-FACE': [], TRANSITION: {} } const context: ObjectifierContext = {
'FONT-FACE': [],
TRANSITION: {},
}
const result = transform(node, context) const result = transform(node, context)
if (context['FONT-FACE'].length) { if (context['FONT-FACE'].length) {
result['@FONT-FACE'] = context['FONT-FACE'] result['@FONT-FACE'] = context['FONT-FACE']
...@@ -37,7 +40,28 @@ function transform( ...@@ -37,7 +40,28 @@ function transform(
} else if (child.type === 'rule') { } else if (child.type === 'rule') {
const body = transform(child, context) const body = transform(child, context)
child.selectors.forEach((selector) => { child.selectors.forEach((selector) => {
transformSelector(selector, body, result, context)
})
} else if (child.type === 'decl') {
result[child.prop] = child.value
}
})
return result
}
function transformSelector(
selector: string,
body: Record<string, unknown>,
result: Record<string, unknown | Record<string, unknown>>,
context: ObjectifierContext
) {
let className = selector.slice(1) let className = selector.slice(1)
let isCombinators = false
const lastDotIndex = className.lastIndexOf('.')
if (lastDotIndex > 0) {
isCombinators = true
className = className.substring(lastDotIndex + 1)
}
const pseudoIndex = className.indexOf(':') const pseudoIndex = className.indexOf(':')
if (pseudoIndex > -1) { if (pseudoIndex > -1) {
const pseudoClass = className.slice(pseudoIndex) const pseudoClass = className.slice(pseudoIndex)
...@@ -48,18 +72,20 @@ function transform( ...@@ -48,18 +72,20 @@ function transform(
}) })
} }
transition(className, body, context) transition(className, body, context)
if (isCombinators) {
className = '.' + className
result = (result[className] || (result[className] = {})) as Record<
string,
unknown
>
className = selector.replace(className, '').trim()
}
if (result[className]) { if (result[className]) {
// clone // clone
result[className] = extend({}, result[className], body) result[className] = extend({}, result[className], body)
} else { } else {
result[className] = body result[className] = body
} }
})
} else if (child.type === 'decl') {
result[child.prop] = child.value
}
})
return result
} }
function transition( function transition(
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册