55// spell-checker:ignore tldr uuhelp
66
77use clap:: Command ;
8+ use fluent_syntax:: ast:: { Entry , Message , Pattern } ;
9+ use fluent_syntax:: parser;
810use std:: collections:: HashMap ;
911use std:: ffi:: OsString ;
1012use std:: fs:: File ;
@@ -140,7 +142,7 @@ fn main() -> io::Result<()> {
140142 }
141143 let p = format ! ( "docs/src/utils/{name}.md" ) ;
142144
143- let markdown = File :: open ( format ! ( "src/uu/{name}/{name}.md " ) )
145+ let fluent = File :: open ( format ! ( "src/uu/{name}/locales/en-US.ftl " ) )
144146 . and_then ( |mut f : File | {
145147 let mut s = String :: new ( ) ;
146148 f. read_to_string ( & mut s) ?;
@@ -155,7 +157,7 @@ fn main() -> io::Result<()> {
155157 name,
156158 tldr_zip : & mut tldr_zip,
157159 utils_per_platform : & utils_per_platform,
158- markdown ,
160+ fluent ,
159161 }
160162 . markdown ( ) ?;
161163 println ! ( "Wrote to '{p}'" ) ;
@@ -173,7 +175,7 @@ struct MDWriter<'a, 'b> {
173175 name : & ' a str ,
174176 tldr_zip : & ' b mut Option < ZipArchive < File > > ,
175177 utils_per_platform : & ' b HashMap < & ' b str , Vec < String > > ,
176- markdown : Option < String > ,
178+ fluent : Option < String > ,
177179}
178180
179181impl MDWriter < ' _ , ' _ > {
@@ -189,6 +191,33 @@ impl MDWriter<'_, '_> {
189191 self . examples ( )
190192 }
191193
194+ /// Extract value for a Fluent key from the .ftl content
195+ fn extract_fluent_value ( & self , key : & str ) -> Option < String > {
196+ let content = self . fluent . as_ref ( ) ?;
197+ let resource = parser:: parse ( content. clone ( ) ) . ok ( ) ?;
198+
199+ for entry in resource. body {
200+ if let Entry :: Message ( Message {
201+ id,
202+ value : Some ( Pattern { elements } ) ,
203+ ..
204+ } ) = entry
205+ {
206+ if id. name == key {
207+ // Simple text extraction - just concatenate text elements
208+ let mut result = String :: new ( ) ;
209+ for element in elements {
210+ if let fluent_syntax:: ast:: PatternElement :: TextElement { value } = element {
211+ result. push_str ( & value) ;
212+ }
213+ }
214+ return Some ( result) ;
215+ }
216+ }
217+ }
218+ None
219+ }
220+
192221 /// # Errors
193222 /// Returns an error if the writer fails.
194223 fn additional ( & mut self ) -> io:: Result < ( ) > {
@@ -237,10 +266,7 @@ impl MDWriter<'_, '_> {
237266 /// # Errors
238267 /// Returns an error if the writer fails.
239268 fn usage ( & mut self ) -> io:: Result < ( ) > {
240- if let Some ( markdown) = & self . markdown {
241- let usage = uuhelp_parser:: parse_usage ( markdown) ;
242- let usage = usage. replace ( "{}" , self . name ) ;
243-
269+ if let Some ( usage) = self . extract_fluent_value ( & format ! ( "{}-usage" , self . name) ) {
244270 writeln ! ( self . w, "\n ```" ) ?;
245271 writeln ! ( self . w, "{usage}" ) ?;
246272 writeln ! ( self . w, "```" )
@@ -252,8 +278,8 @@ impl MDWriter<'_, '_> {
252278 /// # Errors
253279 /// Returns an error if the writer fails.
254280 fn about ( & mut self ) -> io:: Result < ( ) > {
255- if let Some ( markdown ) = & self . markdown {
256- writeln ! ( self . w, "{}" , uuhelp_parser :: parse_about ( markdown ) )
281+ if let Some ( about ) = self . extract_fluent_value ( & format ! ( "{}-about" , self . name ) ) {
282+ writeln ! ( self . w, "{about}" )
257283 } else {
258284 Ok ( ( ) )
259285 }
@@ -262,13 +288,11 @@ impl MDWriter<'_, '_> {
262288 /// # Errors
263289 /// Returns an error if the writer fails.
264290 fn after_help ( & mut self ) -> io:: Result < ( ) > {
265- if let Some ( markdown ) = & self . markdown {
266- if let Some ( after_help ) = uuhelp_parser :: parse_section ( "after help" , markdown ) {
267- return writeln ! ( self . w , " \n \n {after_help}" ) ;
268- }
291+ if let Some ( after_help ) = self . extract_fluent_value ( & format ! ( "{}-after-help" , self . name ) ) {
292+ writeln ! ( self . w , " \n \n {after_help}" )
293+ } else {
294+ Ok ( ( ) )
269295 }
270-
271- Ok ( ( ) )
272296 }
273297
274298 /// # Errors
@@ -368,13 +392,17 @@ impl MDWriter<'_, '_> {
368392 write ! ( self . w, "</code>" ) ?;
369393 }
370394 writeln ! ( self . w, "</dt>" ) ?;
395+ let help_text = arg. get_help ( ) . unwrap_or_default ( ) . to_string ( ) ;
396+ // Try to resolve Fluent key if it looks like one, otherwise use as-is
397+ let resolved_help = if help_text. starts_with ( & format ! ( "{}-help-" , self . name) ) {
398+ self . extract_fluent_value ( & help_text) . unwrap_or ( help_text)
399+ } else {
400+ help_text
401+ } ;
371402 writeln ! (
372403 self . w,
373404 "<dd>\n \n {}\n \n </dd>" ,
374- arg. get_help( )
375- . unwrap_or_default( )
376- . to_string( )
377- . replace( '\n' , "<br />" )
405+ resolved_help. replace( '\n' , "<br />" )
378406 ) ?;
379407 }
380408 writeln ! ( self . w, "</dl>\n " )
0 commit comments