@@ -26,16 +26,9 @@ export function GeneratorList({ predicate }: Props) {
26
26
} , [ version , versionFilter ] )
27
27
28
28
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 )
39
32
} , [ versionedGenerators , search , locale ] )
40
33
41
34
return < div class = "generator-list" >
@@ -52,3 +45,18 @@ export function GeneratorList({ predicate }: Props) {
52
45
</ div > }
53
46
</ div >
54
47
}
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