@@ -26,16 +26,9 @@ export function GeneratorList({ predicate }: Props) {
2626 } , [ version , versionFilter ] )
2727
2828 const filteredGenerators = useMemo ( ( ) => {
29- const query = search . split ( ' ' ) . map ( q => q . trim ( ) . toLowerCase ( ) ) . filter ( q => q . length > 0 )
30- return versionedGenerators . filter ( gen => {
31- const content = `${ gen . id } ${ gen . tags ?. join ( ' ' ) ?? '' } ${ gen . path ?? '' } ${ locale ( `generator.${ gen . id } ` ) . toLowerCase ( ) } `
32- return query . every ( q => {
33- if ( q . startsWith ( '!' ) ) {
34- return q . length === 1 || ! content . includes ( q . slice ( 1 ) )
35- }
36- return content . includes ( q )
37- } )
38- } )
29+ const results = versionedGenerators
30+ . map ( g => ( { ...g , name : locale ( `generator.${ g . id } ` ) . toLowerCase ( ) } ) )
31+ return searchGenerators ( results , search )
3932 } , [ versionedGenerators , search , locale ] )
4033
4134 return < div class = "generator-list" >
@@ -52,3 +45,18 @@ export function GeneratorList({ predicate }: Props) {
5245 </ div > }
5346 </ div >
5447}
48+
49+ export function searchGenerators ( generators : ( ConfigGenerator & { name : string } ) [ ] , search ?: string ) {
50+ if ( search ) {
51+ const parts = search . split ( ' ' ) . map ( q => q . trim ( ) . toLowerCase ( ) ) . filter ( q => q . length > 0 )
52+ generators = generators . filter ( g => parts . some ( p => g . name . includes ( p ) )
53+ || parts . some ( p => g . path ?. includes ( p ) ?? false )
54+ || parts . some ( p => g . tags ?. some ( t => t . includes ( p ) ) ?? false )
55+ || parts . some ( p => g . aliases ?. some ( a => a . includes ( p ) ) ?? false ) )
56+ }
57+ generators . sort ( ( a , b ) => a . name . localeCompare ( b . name ) )
58+ if ( search ) {
59+ generators . sort ( ( a , b ) => ( b . name . startsWith ( search ) ? 1 : 0 ) - ( a . name . startsWith ( search ) ? 1 : 0 ) )
60+ }
61+ return generators
62+ }
0 commit comments