@@ -345,6 +345,63 @@ function transformGlimmer(ast, { env }) {
345
345
} )
346
346
}
347
347
348
+ function transformLiquid ( ast , { env } ) {
349
+ visit ( ast , {
350
+ HtmlElement ( node ) {
351
+ node . source = ''
352
+ console . log ( { node} )
353
+ } ,
354
+
355
+ AttrSingleQuoted ( node , _parent , _key , _index , meta ) {
356
+ if ( node . name !== "class" ) {
357
+ return ;
358
+ }
359
+
360
+ meta . sortTextNodes = true ;
361
+ meta . sourceNode = node ;
362
+ } ,
363
+
364
+ AttrDoubleQuoted ( node , _parent , _key , _index , meta ) {
365
+ if ( node . name !== "class" ) {
366
+ return ;
367
+ }
368
+
369
+ meta . sortTextNodes = true ;
370
+
371
+ // With Liquid Script it uses the "source" of certain nodes as the "source of truth"
372
+ // We must modify that node's source to get the desired output
373
+ // Even if we modify the AST it will be ignored
374
+ meta . sourceNode = node ;
375
+ } ,
376
+
377
+ TextNode ( node , _parent , _key , _index , meta ) {
378
+ if ( ! meta . sortTextNodes ) {
379
+ return ;
380
+ }
381
+
382
+ node . value = sortClasses ( node . value , { env } ) ;
383
+
384
+ // This feels hacky but it's necessary
385
+ node . source = node . source . slice ( 0 , node . position . start ) + node . value + node . source . slice ( node . position . end ) ;
386
+ meta . sourceNode . source = node . source ;
387
+ } ,
388
+
389
+ String ( node , _parent , _key , _index , meta ) {
390
+ if ( ! meta . sortTextNodes ) {
391
+ return ;
392
+ }
393
+
394
+ node . value = sortClasses ( node . value , { env } ) ;
395
+
396
+ // This feels hacky but it's necessary
397
+ // String position includes the quotes even if the value doesn't
398
+ // Hence the +1 and -1 when slicing
399
+ node . source = node . source . slice ( 0 , node . position . start + 1 ) + node . value + node . source . slice ( node . position . end - 1 ) ;
400
+ meta . sourceNode . source = node . source ;
401
+ } ,
402
+ } ) ;
403
+ }
404
+
348
405
function sortStringLiteral ( node , { env } ) {
349
406
let result = sortClasses ( node . value , { env } )
350
407
let didChange = result !== node . value
@@ -500,6 +557,9 @@ export const parsers = {
500
557
...base . parsers . php ? { php : createParser ( 'php' , transformPHP ) } : { } ,
501
558
...base . parsers . melody ? { melody : createParser ( 'melody' , transformMelody ) } : { } ,
502
559
...base . parsers . pug ? { pug : createParser ( 'pug' , transformPug ) } : { } ,
560
+ ...( base . parsers [ 'liquid-html' ]
561
+ ? { 'liquid-html' : createParser ( "liquid-html" , transformLiquid ) }
562
+ : { } ) ,
503
563
// ...base.parsers.blade ? { blade: createParser('blade', transformBlade) } : {},
504
564
}
505
565
@@ -733,6 +793,7 @@ function getBasePlugins() {
733
793
let php = loadIfExists ( '@prettier/plugin-php' )
734
794
let melody = loadIfExists ( 'prettier-plugin-twig-melody' )
735
795
let pug = loadIfExists ( '@prettier/plugin-pug' )
796
+ let liquid = loadIfExists ( '@shopify/prettier-plugin-liquid' )
736
797
// let blade = loadIfExists('@shufo/prettier-plugin-blade')
737
798
738
799
return {
@@ -759,6 +820,7 @@ function getBasePlugins() {
759
820
...( php ?. parsers ?? { } ) ,
760
821
...( melody ?. parsers ?? { } ) ,
761
822
...( pug ?. parsers ?? { } ) ,
823
+ ...( liquid ?. parsers ?? { } ) ,
762
824
// ...(blade?.parsers ?? {}),
763
825
} ,
764
826
printers : {
@@ -782,6 +844,7 @@ function getCompatibleParser(parserFormat, options) {
782
844
'prettier-plugin-organize-imports' ,
783
845
'@prettier/plugin-php' ,
784
846
'@prettier/plugin-pug' ,
847
+ '@shopify/prettier-plugin-liquid' ,
785
848
'@shufo/prettier-plugin-blade' ,
786
849
'prettier-plugin-css-order' ,
787
850
'prettier-plugin-import-sort' ,
0 commit comments