1+ import { SearchTagResult } from 'qiita-js-2' ;
12import { QuickPickItem , window } from 'vscode' ;
23import { client } from '../client' ;
34
@@ -12,26 +13,38 @@ export const makeQuickPickItemFromTag = (id: string, followersCount: number) =>
1213 description : `${ followersCount } 件の投稿` ,
1314} ) ;
1415
16+ /**
17+ * ユーザーからの入力が検索結果に無いときにその入力を結果の先頭に挿入
18+ * @param value ユーザーの入力
19+ * @param suggestions 検索結果
20+ * @return フォーマットされた検索結果
21+ */
22+ export const insertInputRaw = ( value : string , suggestions : SearchTagResult [ ] ) => {
23+ if ( ! value ) {
24+ return suggestions ;
25+ }
26+
27+ if ( suggestions
28+ . map ( ( tag ) => tag . name )
29+ . map ( ( name ) => RegExp ( name , 'i' ) . test ( value ) )
30+ . includes ( true ) ) {
31+ return suggestions ;
32+ }
33+
34+ suggestions . unshift ( { name : value , url_name : value , follower_count : 0 , item_count : 0 } ) ;
35+
36+ return suggestions ;
37+ } ;
38+
1539/**
1640 * キーワードからタグを検索して QuickPickItem の形で返します
1741 * @param value キーワード
1842 * @return QuickPickItem
1943 */
20- async function suggestTags ( value : string ) {
44+ export async function suggestTags ( value : string ) : Promise < QuickPickItem [ ] > {
2145 const results = ( await client . searchTags ( value ) ) . slice ( 0 , 9 ) ;
22-
23- // キーワードに相当するタグがまだ作成されていない場合、候補の一件目にそのタグを挿入
24- // tag.nameをケースインセンシティブで比較
25- if ( value && ! results . map ( ( tag ) => tag . name ) . map ( ( name ) => RegExp ( name , 'i' ) . test ( value ) ) . includes ( true ) ) {
26- results . unshift ( {
27- name : value ,
28- url_name : value ,
29- follower_count : 0 ,
30- item_count : 0 ,
31- } ) ;
32- }
33-
34- return results . map ( ( tag ) => makeQuickPickItemFromTag ( tag . name , tag . follower_count ) ) ;
46+ const formattedResults = insertInputRaw ( value , results ) ;
47+ return formattedResults . map ( ( tag ) => makeQuickPickItemFromTag ( tag . name , tag . follower_count ) ) ;
3548}
3649
3750/**
0 commit comments