search.js
1 import { CliError } from '@jackwener/opencli/errors'; 2 import { cli, Strategy } from '@jackwener/opencli/registry'; 3 import { wikiFetch } from './utils.js'; 4 cli({ 5 site: 'wikipedia', 6 name: 'search', 7 description: 'Search Wikipedia articles', 8 strategy: Strategy.PUBLIC, 9 browser: false, 10 args: [ 11 { name: 'query', positional: true, required: true, help: 'Search keyword' }, 12 { name: 'limit', type: 'int', default: 10, help: 'Max results' }, 13 { name: 'lang', default: 'en', help: 'Language code (e.g. en, zh, ja)' }, 14 ], 15 columns: ['title', 'snippet', 'url'], 16 func: async (_page, args) => { 17 const limit = Math.max(1, Math.min(Number(args.limit), 50)); 18 const lang = args.lang || 'en'; 19 const q = encodeURIComponent(args.query); 20 const data = (await wikiFetch(lang, `/w/api.php?action=query&list=search&srsearch=${q}&srlimit=${limit}&format=json&utf8=1`)); 21 const results = data?.query?.search; 22 if (!results?.length) 23 throw new CliError('NOT_FOUND', 'No articles found', 'Try a different keyword'); 24 return results.map((r) => ({ 25 title: r.title, 26 snippet: r.snippet.replace(/<[^>]+>/g, '').slice(0, 120), 27 url: `https://${lang}.wikipedia.org/wiki/${encodeURIComponent(r.title.replace(/ /g, '_'))}`, 28 })); 29 }, 30 });