@@ -64,91 +64,100 @@ defmodule Mix.Tasks.GenerateIconCss do
6464 defp generate_heroicons do
6565 base_dir = "deps/heroicons/optimized"
6666
67- if ! File . exists? ( base_dir ) do
67+ if File . exists? ( base_dir ) do
68+ generate_heroicons_from_dir ( base_dir )
69+ else
6870 Mix . shell ( ) . info ( "⚠️ Heroicons not found" )
6971 % { variables: [ ] , utilities: [ ] }
70- else
71- variants = [
72- { "" , "24/outline" , "1.5rem" } ,
73- { "-solid" , "24/solid" , "1.5rem" } ,
74- { "-mini" , "20/solid" , "1.25rem" } ,
75- { "-micro" , "16/solid" , "1rem" }
76- ]
77-
78- Mix . shell ( ) . info ( "🎨 Processing Heroicons..." )
79-
80- { variables , utilities } =
81- Enum . flat_map ( variants , fn { suffix , dir , size } ->
82- full_dir = Path . join ( base_dir , dir )
83-
84- if File . exists? ( full_dir ) do
85- { :ok , files } = File . ls ( full_dir )
86- svg_files = Enum . filter ( files , & String . ends_with? ( & 1 , ".svg" ) )
87- Mix . shell ( ) . info ( " Found #{ length ( svg_files ) } icons in #{ dir } " )
88-
89- Enum . map ( svg_files , fn file ->
90- name = Path . basename ( file , ".svg" ) <> suffix
91- { :ok , content } = File . read ( Path . join ( full_dir , file ) )
92- encoded = encode_svg ( content )
93-
94- variable = " --hero-#{ name } : url('data:image/svg+xml;utf8,#{ encoded } ');"
95- utility = generate_utility_class ( "hero" , name , size )
96-
97- { variable , utility }
98- end )
99- else
100- [ ]
101- end
102- end )
103- |> Enum . unzip ( )
104-
105- Mix . shell ( ) . info ( "✅ Generated #{ length ( variables ) } Heroicon classes" )
106- % { variables: variables , utilities: utilities }
10772 end
10873 end
10974
75+ defp generate_heroicons_from_dir ( base_dir ) do
76+ variants = [
77+ { "" , "24/outline" , "1.5rem" } ,
78+ { "-solid" , "24/solid" , "1.5rem" } ,
79+ { "-mini" , "20/solid" , "1.25rem" } ,
80+ { "-micro" , "16/solid" , "1rem" }
81+ ]
82+
83+ Mix . shell ( ) . info ( "🎨 Processing Heroicons..." )
84+
85+ { variables , utilities } =
86+ variants
87+ |> Enum . flat_map ( & process_variant ( base_dir , & 1 , "hero" ) )
88+ |> Enum . unzip ( )
89+
90+ Mix . shell ( ) . info ( "✅ Generated #{ length ( variables ) } Heroicon classes" )
91+ % { variables: variables , utilities: utilities }
92+ end
93+
11094 defp generate_fontawesome do
11195 base_dir = "deps/fontawesome/svgs"
11296
113- if ! File . exists? ( base_dir ) do
97+ if File . exists? ( base_dir ) do
98+ generate_fontawesome_from_dir ( base_dir )
99+ else
114100 Mix . shell ( ) . info ( "⚠️ FontAwesome not found" )
115101 % { variables: [ ] , utilities: [ ] }
102+ end
103+ end
104+
105+ defp generate_fontawesome_from_dir ( base_dir ) do
106+ variants = [
107+ { "" , "regular" , "" , "1.25rem" } ,
108+ { "-solid" , "solid" , "" , "1.25rem" } ,
109+ { "" , "brands" , "brand-" , "1.25rem" }
110+ ]
111+
112+ Mix . shell ( ) . info ( "🎨 Processing FontAwesome..." )
113+
114+ { variables , utilities } =
115+ variants
116+ |> Enum . flat_map ( & process_fa_variant ( base_dir , & 1 ) )
117+ |> Enum . unzip ( )
118+
119+ Mix . shell ( ) . info ( "✅ Generated #{ length ( variables ) } FontAwesome classes" )
120+ % { variables: variables , utilities: utilities }
121+ end
122+
123+ defp process_variant ( base_dir , { suffix , dir , size } , prefix ) do
124+ full_dir = Path . join ( base_dir , dir )
125+
126+ if File . exists? ( full_dir ) do
127+ process_svg_files ( full_dir , dir , suffix , size , prefix , "" )
128+ else
129+ [ ]
130+ end
131+ end
132+
133+ defp process_fa_variant ( base_dir , { suffix , dir , name_prefix , size } ) do
134+ full_dir = Path . join ( base_dir , dir )
135+
136+ if File . exists? ( full_dir ) do
137+ process_svg_files ( full_dir , dir , suffix , size , "fa" , name_prefix )
116138 else
117- variants = [
118- { "" , "regular" , "" , "1.25rem" } ,
119- { "-solid" , "solid" , "" , "1.25rem" } ,
120- { "" , "brands" , "brand-" , "1.25rem" }
121- ]
122-
123- Mix . shell ( ) . info ( "🎨 Processing FontAwesome..." )
124-
125- { variables , utilities } =
126- Enum . flat_map ( variants , fn { suffix , dir , name_prefix , size } ->
127- full_dir = Path . join ( base_dir , dir )
128-
129- if File . exists? ( full_dir ) do
130- { :ok , files } = File . ls ( full_dir )
131- svg_files = Enum . filter ( files , & String . ends_with? ( & 1 , ".svg" ) )
132- Mix . shell ( ) . info ( " Found #{ length ( svg_files ) } icons in #{ dir } " )
133-
134- Enum . map ( svg_files , fn file ->
135- name = name_prefix <> Path . basename ( file , ".svg" ) <> suffix
136- { :ok , content } = File . read ( Path . join ( full_dir , file ) )
137- encoded = encode_svg ( content )
138-
139- variable = " --fa-#{ name } : url('data:image/svg+xml;utf8,#{ encoded } ');"
140- utility = generate_utility_class ( "fa" , name , size )
141-
142- { variable , utility }
143- end )
144- else
145- [ ]
146- end
147- end )
148- |> Enum . unzip ( )
149-
150- Mix . shell ( ) . info ( "✅ Generated #{ length ( variables ) } FontAwesome classes" )
151- % { variables: variables , utilities: utilities }
139+ [ ]
152140 end
153141 end
142+
143+ defp process_svg_files ( full_dir , dir , suffix , size , prefix , name_prefix ) do
144+ { :ok , files } = File . ls ( full_dir )
145+ svg_files = Enum . filter ( files , & String . ends_with? ( & 1 , ".svg" ) )
146+ Mix . shell ( ) . info ( " Found #{ length ( svg_files ) } icons in #{ dir } " )
147+
148+ Enum . map ( svg_files , fn file ->
149+ generate_icon_css ( full_dir , file , suffix , size , prefix , name_prefix )
150+ end )
151+ end
152+
153+ defp generate_icon_css ( full_dir , file , suffix , size , prefix , name_prefix ) do
154+ name = name_prefix <> Path . basename ( file , ".svg" ) <> suffix
155+ { :ok , content } = File . read ( Path . join ( full_dir , file ) )
156+ encoded = encode_svg ( content )
157+
158+ variable = " --#{ prefix } -#{ name } : url('data:image/svg+xml;utf8,#{ encoded } ');"
159+ utility = generate_utility_class ( prefix , name , size )
160+
161+ { variable , utility }
162+ end
154163end
0 commit comments