Skip to content

Commit 8d4e805

Browse files
committed
fix: add peer-modifier converter
1 parent c3007b1 commit 8d4e805

File tree

1 file changed

+119
-3
lines changed

1 file changed

+119
-3
lines changed

src/twcss-to-sass.ts

Lines changed: 119 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -324,14 +324,113 @@ function groupUtilityToSass(
324324
return ''
325325
}
326326

327+
let peerModifierList: IGroupModifierPair[] = []
328+
329+
/**
330+
* Convert peer-* modifiers to sub-selectors
331+
*
332+
* @param nodeTree IHtmlNode[]
333+
* @param deepth number
334+
* @param isChildNodes boolean
335+
*
336+
* @returns string
337+
*/
338+
function peerUtilityToSass(
339+
nodeTree: IHtmlNode[],
340+
peerClass: string,
341+
isChildNodes = false
342+
): string {
343+
if (!isChildNodes) {
344+
peerModifierList = []
345+
}
346+
347+
let groupSass = ''
348+
349+
const groupPattern = /peer-([a-z0-9]+):([a-z0-9-:\/]+)/gm
350+
351+
nodeTree.forEach((node: IHtmlNode) => {
352+
if (node.filterAttributes) {
353+
console.log(node.filterAttributes.class?.match(groupPattern))
354+
if (
355+
node.filterAttributes.class &&
356+
node.filterAttributes.class?.match(groupPattern)
357+
) {
358+
node.filterAttributes.class?.match(groupPattern)?.forEach((item) => {
359+
const matches = new RegExp(groupPattern).exec(item)
360+
361+
const groupModifierPair = <IGroupModifierPair>{
362+
modifier: matches?.[1],
363+
utility: matches?.[2],
364+
className: getClassName(node, node.order),
365+
}
366+
367+
console.log(groupModifierPair)
368+
369+
peerModifierList.push(groupModifierPair)
370+
})
371+
372+
if (node.filterAttributes.class.match(/(peer)(?!-)/gm)) {
373+
return groupSass
374+
} else if (node.children.length) {
375+
peerUtilityToSass(node.children, peerClass, true)
376+
}
377+
} else {
378+
peerUtilityToSass(node.children, peerClass, true)
379+
}
380+
}
381+
})
382+
383+
if (!isChildNodes) {
384+
if (peerModifierList.length > 0) {
385+
const modifierGroups = peerModifierList.reduce((prev, next) => {
386+
prev[next.modifier] = prev[next.modifier] || []
387+
prev[next.modifier].push(next)
388+
389+
return prev
390+
}, Object.create(null))
391+
392+
Object.entries(modifierGroups)?.forEach(([modifier, utilityList]) => {
393+
const _utilityList = <IGroupModifierPair[]>utilityList
394+
395+
const classGroups = _utilityList.reduce((prev, next) => {
396+
prev[next.className] = prev[next.className] || []
397+
prev[next.className].push(next)
398+
399+
return prev
400+
}, Object.create(null))
401+
402+
groupSass += `\n\n/* #region Peer modifier: ${modifier} */\n\n`
403+
404+
Object.entries(classGroups)?.forEach(([className, utilityList]) => {
405+
const _utilityList = <IGroupModifierPair[]>utilityList
406+
407+
const classList = _utilityList
408+
.map((x: IGroupModifierPair) => x.utility)
409+
.join(' ')
410+
411+
groupSass += `${peerClass}:${modifier} ~ ${className}{\n`
412+
groupSass += `\t\t@apply ${classList};\n`
413+
groupSass += `\t}\n`
414+
})
415+
416+
groupSass += `\n/* #endregion */\n\n`
417+
})
418+
}
419+
420+
return groupSass
421+
}
422+
423+
return ''
424+
}
425+
327426
/**
328427
* Extract SASS tree from HTML JSON tree
329428
*
330429
* @param {IHtmlNode} nodeTree
331430
*
332431
* @returns string
333432
*/
334-
function getSassTree(nodeTree: IHtmlNode[]) {
433+
function getSassTree(nodeTree: IHtmlNode[]): string {
335434
return nodeTree
336435
.map((node: IHtmlNode) => {
337436
let treeString = '',
@@ -374,7 +473,7 @@ function getSassTree(nodeTree: IHtmlNode[]) {
374473
let groupUtilityTree = ''
375474

376475
// convert group utilities
377-
if (node.filterAttributes?.class?.match(/ (group)(?!-)/gm)) {
476+
if (node.filterAttributes?.class?.match(/(group)(?!-)/gm)) {
378477
groupUtilityTree = groupUtilityToSass(node.children)
379478

380479
if (groupUtilityTree !== '') {
@@ -391,7 +490,19 @@ function getSassTree(nodeTree: IHtmlNode[]) {
391490
}
392491
}
393492

394-
return `${classComment}
493+
let peerUtilityTree = ''
494+
495+
// convert peer utilities
496+
if (node.filterAttributes?.class?.match(/(peer)(?!-)/gm)) {
497+
peerUtilityTree = peerUtilityToSass(nodeTree, className)
498+
499+
if (peerUtilityTree !== '') {
500+
// clear parent group class name
501+
treeString = treeString.replace(/(peer)(?!-)/gm, ' ')
502+
}
503+
}
504+
505+
return `${classComment}${peerUtilityTree}
395506
${className} {
396507
${treeString} ${subTreeString}
397508
}`
@@ -527,6 +638,11 @@ export function convertToSass(
527638
htmlTreeResult = ''
528639

529640
if (sassTreeResult) {
641+
sassTreeResult = sassTreeResult.replace(
642+
/ peer-([a-z0-9]+):([a-z0-9-:\/]+)/gm,
643+
''
644+
)
645+
530646
htmlTreeResult = getHtmlTree(filteredHtmlData)
531647

532648
const cssTreeResult = getCssTree(styles)

0 commit comments

Comments
 (0)