@@ -37,6 +37,7 @@ const defaultOptions: ITwToSassOptions = {
3737 printHtmlComments : true ,
3838 printSassComments : true ,
3939 formatterOptions : formatterOptions ,
40+ preventDuplicateClasses : true ,
4041 classNameOptions : {
4142 lowercase : true ,
4243 replacement : '-' ,
@@ -351,7 +352,6 @@ function peerUtilityToSass(
351352
352353 nodeTree . forEach ( ( node : IHtmlNode ) => {
353354 if ( node . filterAttributes ) {
354- console . log ( node . filterAttributes . class ?. match ( groupPattern ) )
355355 if (
356356 node . filterAttributes . class &&
357357 node . filterAttributes . class ?. match ( groupPattern )
@@ -365,8 +365,6 @@ function peerUtilityToSass(
365365 className : getClassName ( node , node . order ) ,
366366 }
367367
368- console . log ( groupModifierPair )
369-
370368 peerModifierList . push ( groupModifierPair )
371369 } )
372370
@@ -424,6 +422,40 @@ function peerUtilityToSass(
424422 return ''
425423}
426424
425+ /**
426+ * Get class name and styles of node as SASS format
427+ *
428+ * @param node IHtmlNode
429+ *
430+ * @returns string
431+ */
432+ function getNodeClassAndStyles ( node : IHtmlNode ) : string {
433+ let nodeClassAndStyles = ''
434+
435+ if ( node . filterAttributes ) {
436+ // print tailwind class names
437+ if ( node . filterAttributes . class ) {
438+ nodeClassAndStyles += node . filterAttributes . class
439+ ? `@apply ${ node . filterAttributes . class } ;`
440+ : ''
441+ }
442+
443+ // inline style printing
444+ if ( node . filterAttributes . style ) {
445+ node . filterAttributes . style = Utils . addMissingSuffix (
446+ node . filterAttributes . style ,
447+ ';'
448+ )
449+
450+ nodeClassAndStyles += node . filterAttributes . style
451+ ? `\n\n${ node . filterAttributes . style } `
452+ : ''
453+ }
454+ }
455+
456+ return nodeClassAndStyles
457+ }
458+
427459/**
428460 * Extract SASS tree from HTML JSON tree
429461 *
@@ -432,9 +464,11 @@ function peerUtilityToSass(
432464 * @returns string
433465 */
434466function getSassTree ( nodeTree : IHtmlNode [ ] ) : string {
435- let sassTree = ''
467+ let sassTree = '' ,
468+ isLastLevel = false ,
469+ duplicatedItems : string [ ] = [ ]
436470
437- nodeTree . forEach ( ( node : IHtmlNode ) => {
471+ nodeTree . forEach ( ( node : IHtmlNode , index ) => {
438472 let treeString = '' ,
439473 subTreeString = ''
440474
@@ -444,29 +478,46 @@ function getSassTree(nodeTree: IHtmlNode[]): string {
444478
445479 if ( hasSubElement ) {
446480 subTreeString = getSassTree ( node . children )
447- }
448481
449- if ( node . filterAttributes ) {
450- // print tailwind class names
451- if ( node . filterAttributes . class ) {
452- treeString += node . filterAttributes . class
453- ? `@apply ${ node . filterAttributes . class } ;`
454- : ''
455- }
456-
457- // inline style printing
458- if ( node . filterAttributes . style ) {
459- node . filterAttributes . style = Utils . addMissingSuffix (
460- node . filterAttributes . style ,
461- ';'
462- )
482+ isLastLevel = false
483+ } else if ( _defaultOptions . preventDuplicateClasses ) {
484+ isLastLevel = true
485+ }
463486
464- treeString += node . filterAttributes . style
465- ? `\n\n${ node . filterAttributes . style } `
466- : ''
487+ let nodeClassAndStyles = ''
488+
489+ nodeClassAndStyles += getNodeClassAndStyles ( node )
490+
491+ if (
492+ _defaultOptions . preventDuplicateClasses &&
493+ isLastLevel &&
494+ nodeTree [ index + 1 ]
495+ ) {
496+ const _hasSubElement = nodeTree [ index + 1 ] . children ?. filter (
497+ ( child ) => child . type === 'element'
498+ ) . length
499+
500+ if ( ! _hasSubElement ) {
501+ const _nodeClassAndStyles = getNodeClassAndStyles ( nodeTree [ index + 1 ] )
502+
503+ // compare node sass content with next node sass content or
504+ // in same level other nodes
505+ if ( nodeClassAndStyles != '' && _nodeClassAndStyles != '' ) {
506+ if (
507+ nodeClassAndStyles == _nodeClassAndStyles ||
508+ ! duplicatedItems . includes ( nodeClassAndStyles )
509+ ) {
510+ duplicatedItems . push ( _nodeClassAndStyles )
511+
512+ // clear duplicated node sass content
513+ nodeClassAndStyles = ''
514+ }
515+ }
467516 }
468517 }
469518
519+ treeString += nodeClassAndStyles
520+
470521 if ( treeString . length || subTreeString . length ) {
471522 const classComment = _defaultOptions . printSassComments
472523 ? `/* ${ node . comment ? node . comment : node . tagName } ${
0 commit comments