11<!DOCTYPE html>
2- <!-- update time 2026/10/06 | version v1.2 -->
2+ <!-- update time 2026/10/10 | version v1.3 -->
33< html lang ="en ">
44< head >
55< meta charset ="UTF-8 ">
@@ -94,14 +94,114 @@ <h2 class="big-title">Quick Links</h2>
9494 'Yandex' : [ 'https://yandex.com/search?text={a}' , 'Search term' ] ,
9595 'DuckDuckGo' : [ 'https://duckduckgo.com/?q={a}' , 'Search term' ] ,
9696 'Qwant' : [ 'https://qwant.com/?q={a}' , 'Search term' ] ,
97- 'Shodan' : [ 'https://www.shodan.io/search?query={a}' , 'Search term' ]
97+ 'Brave' : [ 'https://search.brave.com/search?q={a}' , 'Search term' ] ,
98+ 'Startpage' : [ 'https://www.startpage.com/sp/search?query={a}' , 'Search term' ] ,
99+ 'Mojeek' : [ 'https://www.mojeek.com/search?q={a}' , 'Search term' ] ,
100+ 'Ecosia' : [ 'https://www.ecosia.org/search?q={a}' , 'Search term' ]
101+ } ,
102+ 'Code Search' : {
103+ 'GitHub Code' : [ 'https://github.com/search?q={a}&type=code' , 'Search term' ] ,
104+ 'Sourcegraph' : [ 'https://sourcegraph.com/search?q={a}' , 'Search term' ] ,
105+ 'grep.app' : [ 'https://grep.app/search?q={a}' , 'Search term' ] ,
106+ 'searchcode' : [ 'https://searchcode.com/?q={a}' , 'Search term' ] ,
107+ 'Debian Codesearch' : [ 'https://codesearch.debian.net/search?q={a}' , 'Search term' ]
108+ } ,
109+ 'Dev Docs / API' : {
110+ 'cppreference' : [ 'https://en.cppreference.com/w/index.php?search={a}' , 'Search term' ] ,
111+ 'MS Learn EN' : [ 'https://learn.microsoft.com/en-us/search/?terms={a}' , 'Search term' ] ,
112+ 'MS Learn ZH' : [ 'https://learn.microsoft.com/zh-cn/search/?terms={a}' , 'Search term' ] ,
113+ 'MDN' : [ 'https://developer.mozilla.org/en-US/search?q={a}' , 'Search term' ] ,
114+ 'Stack Overflow' : [ 'https://stackoverflow.com/search?q={a}' , 'Search term' ] ,
115+ 'Mankier' : [ 'https://www.mankier.com/search?q={a}' , 'Search term' ] ,
116+ 'DevDocs' : [ 'https://devdocs.io/#q={a}' , 'Search term' ]
117+ } ,
118+ 'Vulnerability' : {
119+ 'Exploit-DB' : [ 'https://www.exploit-db.com/search?q={a}' , 'Search term' ] ,
120+ 'NVD' : [ 'https://nvd.nist.gov/vuln/search/results?query={a}' , 'Search term' ] ,
121+ 'MITRE CVE' : [ 'https://cve.mitre.org/cgi-bin/cvekey.cgi?keyword={a}' , 'Keyword' ] ,
122+ 'Sploitus' : [ 'https://sploitus.com/?query={a}' , 'Search term' ]
123+ } ,
124+ 'Threat Intel' : {
125+ 'VirusTotal' : [ 'https://www.virustotal.com/gui/search/{a}' , 'Hash, URL, domain or IP' ] ,
126+ 'URLScan' : [ 'https://urlscan.io/search/#{a}' , 'Domain, URL or IP' ] ,
127+ 'Hybrid Analysis' : [ 'https://www.hybrid-analysis.com/search?query={a}' , 'Search term' ] ,
128+ 'ThreatFox' : [ 'https://threatfox.abuse.ch/browse.php?search={a}' , 'Search term' ] ,
129+ 'MalwareBazaar' : [ 'https://bazaar.abuse.ch/browse.php?search={a}' , 'Search term' ] ,
130+ 'GreyNoise' : [ 'https://viz.greynoise.io/query/?gnql={a}' , 'GNQL query' ] ,
131+ 'AlienVault OTX' : [ 'https://otx.alienvault.com/browse/?q={a}' , 'Search term' ]
132+ } ,
133+ 'Asset / Network' : {
134+ 'Shodan' : [ 'https://www.shodan.io/search?query={a}' , 'Search term' ] ,
135+ 'Censys' : [ 'https://search.censys.io/search?resource=hosts&q={a}' , 'Search term' ] ,
136+ 'ZoomEye' : [ 'https://www.zoomeye.org/searchResult?q={a}' , 'Search term' ] ,
137+ 'crt.sh' : [ 'https://crt.sh/?q={a}' , 'Domain or keyword' ] ,
138+ 'BGP.HE.Net' : [ 'https://bgp.he.net/search?search%5Bsearch%5D={a}&commit=Search' , 'IP, ASN or domain' ] ,
139+ 'ICANN Lookup' : [ 'https://lookup.icann.org/en/lookup?name={a}' , 'Domain name' ] ,
140+ 'ipinfo' : [ 'https://ipinfo.io/{a}' , 'IP address' ] ,
141+ 'SecurityTrails' : [ 'https://securitytrails.com/domain/{a}' , 'Domain name' ] ,
142+ 'PublicWWW' : [ 'https://publicwww.com/websites/{a}/' , 'Source code snippet' ]
143+ } ,
144+ 'Package Search' : {
145+ 'repology' : [ 'https://repology.org/projects/?search={a}&maintainer={b}&category={c}&inrepo={d}¬inrepo={e}&repos={f}&families={g}&repos_newest={h}&families_newest={i}' , 'Package name' , 'Maintainer' , 'Category' , 'In repository' , 'Missing in repository' , 'Repository' , 'Repository family' , 'Repositories with newest version' , 'Families with newest version' ] ,
146+ 'msys2' : [ 'https://packages.msys2.org/search?q={a}&t=pkg' , 'Search term' ] ,
147+ 'pkgs.org' : [ 'https://pkgs.org/search/?q={a}' , 'Package name' ] ,
148+ 'AUR' : [ 'https://aur.archlinux.org/packages?K={a}' , 'Package name' ] ,
149+ 'Arch' : [ 'https://archlinux.org/packages/?q={a}' , 'Package name' ] ,
150+ 'Debian' : [ 'https://packages.debian.org/search?keywords={a}' , 'Package name' ] ,
151+ 'Ubuntu' : [ 'https://packages.ubuntu.com/search?keywords={a}' , 'Package name' ]
152+ } ,
153+ 'Language Packages' : {
154+ 'PyPI' : [ 'https://pypi.org/search/?q={a}' , 'Package name' ] ,
155+ 'npm' : [ 'https://www.npmjs.com/search?q={a}' , 'Package name' ] ,
156+ 'crates.io' : [ 'https://crates.io/search?q={a}' , 'Package name' ] ,
157+ 'NuGet' : [ 'https://www.nuget.org/packages?q={a}' , 'Package name' ] ,
158+ 'Go Packages' : [ 'https://pkg.go.dev/search?q={a}' , 'Package name' ] ,
159+ 'Chocolatey' : [ 'https://community.chocolatey.org/packages?q={a}' , 'Package name' ]
160+ } ,
161+ 'Academic / Paper Search' : {
162+ 'Google Scholar' : [ 'https://scholar.google.com/scholar?q={a}' , 'Search term' ] ,
163+ 'Semantic Scholar' : [ 'https://www.semanticscholar.org/search?q={a}' , 'Search term' ] ,
164+ 'DBLP' : [ 'https://dblp.org/search?q={a}' , 'Search term' ] ,
165+ 'Baidu Xueshu' : [ 'https://xueshu.baidu.com/s?wd={a}' , 'Search term' ] ,
166+ 'Wanfang' : [ 'https://s.wanfangdata.com.cn/paper?q={a}' , 'Search term' ] ,
167+ 'PubMed' : [ 'https://pubmed.ncbi.nlm.nih.gov/?term={a}' , 'Search term' ] ,
168+ 'Arxiv' : [ 'https://arxiv.org/search/?query={a}' , 'Search term' ] ,
169+ 'Scielo' : [ 'https://search.scielo.org/?q={a}' , 'Search term' ] ,
170+ 'Scirp' : [ 'https://www.scirp.org/journal/articles.aspx?searchcode={a}' , 'Search term' ]
171+ } ,
172+ 'Open Access / Books' : {
173+ 'Open Library' : [ 'https://openlibrary.org/search?q={a}' , 'Search term' ] ,
174+ 'CORE' : [ 'https://core.ac.uk/search?q={a}' , 'Search term' ] ,
175+ 'Papers with Code' : [ 'https://paperswithcode.com/search?q_meta={a}' , 'Search term' ]
176+ } ,
177+ 'Dictionaries' : {
178+ 'iCIBA' : [ 'https://www.iciba.com/word?w={a}' , 'Word' ] ,
179+ 'Wiktionary' : [ 'https://en.wiktionary.org/w/index.php?search={a}' , 'Word' ] ,
180+ 'Etymonline' : [ 'https://www.etymonline.com/search?q={a}' , 'Word' ] ,
181+ 'WordNet' : [ 'http://wordnetweb.princeton.edu/perl/webwn?s={a}' , 'Word' ] ,
182+ 'Urban Dictionary' : [ 'https://www.urbandictionary.com/define.php?term={a}' , 'Term' ] ,
183+ 'dict.cc' : [ 'https://www.dict.cc/?s={a}' , 'Word' ] ,
184+ 'Thesaurus' : [ 'https://www.thesaurus.com/browse/{a}' , 'Word' ] ,
185+ 'Jisho' : [ 'https://jisho.org/search/{a}' , 'Japanese word' ]
186+ } ,
187+ 'Chinese Dictionaries' : {
188+ 'Youdao' : [ 'https://dict.youdao.com/result?word={a}&lang=en' , 'Word' ] ,
189+ 'Baidu Hanyu' : [ 'https://hanyu.baidu.com/s?wd={a}&ptype=zici' , 'Word' ] ,
190+ 'Zdic' : [ 'https://www.zdic.net/search?word={a}' , 'Word' ]
191+ } ,
192+ 'Media / Archive' : {
193+ 'Internet Archive' : [ 'https://archive.org/search?query={a}' , 'Search term' ] ,
194+ 'Wayback Machine' : [ 'https://web.archive.org/web/*/{a}' , 'URL to look up' ] ,
195+ 'TMDB' : [ 'https://www.themoviedb.org/search?query={a}' , 'Search term' ] ,
196+ 'MusicBrainz' : [ 'https://musicbrainz.org/search?query={a}&type=release' , 'Search term' ] ,
197+ 'Discogs' : [ 'https://www.discogs.com/search/?q={a}' , 'Search term' ]
98198 } ,
99199 'Tor Search' : {
100200 'TorDex' : [ 'http://tordexu73joywapk2txdr54jed4imqledpcvcuf75qsas2gwdgksvnyd.onion/search?query={a}' , 'Search term' ] ,
101201 'OnDex' : [ 'http://ondexcylxxxq6vcc62l3r2m6rypohvvymsvqeadhln5mjo73pf6ksjad.onion?query={a}' , 'Search term' ] ,
102202 'TOR.LINK' : [ 'https://tor.link/?q={a}' , 'Search term' ] ,
103203 'OnionLand' : [ 'https://onionlandsearchengine.net/search?q={a}' , 'Search term' ]
104- } ,
204+ } ,
105205 'I2P Search' : {
106206 'I2P' : [ 'https://i2psearch.com/search?q={a}' , 'Search term' ]
107207 } ,
@@ -115,20 +215,6 @@ <h2 class="big-title">Quick Links</h2>
115215 'xdcc.rocks' : [ 'https://www.xdcc.rocks/search/?searchword={a}' , 'Search term' ] ,
116216 'xdcc-search' : [ 'https://xdcc-search.com/?q={a}' , 'Search term' ]
117217 } ,
118- 'Package Search' : {
119- 'repology' : [ 'https://repology.org/projects/?search={a}&maintainer={b}&category={c}&inrepo={d}¬inrepo={e}&repos={f}&families={g}&repos_newest={h}&families_newest={i}' , 'Package name' , 'Maintainer' , 'Category' , 'In repository' , 'Missing in repository' , 'Repository' , 'Repository family' , 'Repositories with newest version' , 'Families with newest version' ] ,
120- 'msys2' : [ 'https://packages.msys2.org/search?q={a}&t=pkg' , 'Search term' ]
121- } ,
122- 'Academic / Paper Search' : {
123- 'Scirp' : [ 'https://www.scirp.org/journal/articles.aspx?searchcode={a}' , 'Search term' ] ,
124- 'Scielo' : [ 'https://search.scielo.org/?q={a}' , 'Search term' ] ,
125- 'Arxiv' : [ 'https://arxiv.org/search/?query={a}' , 'Search term' ]
126- } ,
127- 'Dictionaries' : {
128- 'iCIBA' : [ 'https://www.iciba.com/word?w={a}' , 'Search term' ] ,
129- 'WordNet' : [ 'http://wordnetweb.princeton.edu/perl/webwn?s={a}' , 'Search term' ] ,
130- 'Urban Dictionary' : [ 'https://www.urbandictionary.com/define.php?term={a}' , 'Search term' ]
131- } ,
132218 'Radio Search' : {
133219 'radio-browser Name' : [ 'http://de1.api.radio-browser.info/xml/stations/search?name={a}&order={b}' , 'Search term' , 'Sort order' ] ,
134220 'radio-browser UUID' : [ 'http://de1.api.radio-browser.info/xml/stations/byuuid?uuids={a}' , 'UUID' ]
@@ -164,7 +250,7 @@ <h2 class="big-title">Quick Links</h2>
164250 'OpenDNS DoH' : 'https://doh.opendns.com/dns-query'
165251 } ,
166252 'MIRROR' : {
167- 'Certnet' : 'https://mirrors.cernet.edu.cn/'
253+ 'Certnet' : 'https://mirrors.cernet.edu.cn/'
168254 }
169255} ;
170256const boxEl = document . getElementById ( 'catBoxes' ) ;
@@ -212,7 +298,7 @@ <h2 class="big-title">Quick Links</h2>
212298 b . className = 'eng' + ( curEng && curEng . name === name && curEng . cat === cat ? ' on' : '' ) ;
213299 b . textContent = name ;
214300 b . title = e . tpl + ( e . phs . length > 1 ? '(Params: ' + e . phs . slice ( 1 ) . map ( p => p . label ) . join ( ' / ' ) + ')' : '' ) ;
215- b . onclick = ( ) => { curEng = { name, tpl : e . tpl , phs : e . phs , cat} ; refresh ( ) ; syncUrl ( ) ; } ;
301+ b . onclick = ( ) => { curEng = { name, tpl : e . tpl , phs : e . phs , cat} ; refresh ( ) ; syncUrl ( ) ; focusInput ( ) ; } ;
216302 engs . appendChild ( b ) ;
217303 } ) ;
218304 box . appendChild ( head ) ;
@@ -283,27 +369,45 @@ <h2 class="big-title">Quick Links</h2>
283369}
284370function buildUrl ( tpl , values ) {
285371 const hi = tpl . indexOf ( '#' ) ;
286- const hash = hi < 0 ? '' : tpl . slice ( hi ) ;
372+ let hash = hi < 0 ? '' : tpl . slice ( hi ) ;
287373 const str = hi < 0 ? tpl : tpl . slice ( 0 , hi ) ;
288374 const qi = str . indexOf ( '?' ) ;
289- const base = qi < 0 ? str : str . slice ( 0 , qi ) ;
375+ let base = qi < 0 ? str : str . slice ( 0 , qi ) ;
290376 const query = qi < 0 ? '' : str . slice ( qi + 1 ) ;
377+ const val = name => {
378+ const v = values [ name ] ;
379+ return v === undefined || v === null || String ( v ) . trim ( ) === '' ? null : String ( v ) . trim ( ) ;
380+ } ;
381+ const fillQ = s => s . replace ( / \{ ( [ ^ { } ] + ) \} / g, ( m , name ) => {
382+ const v = val ( name ) ;
383+ return v === null ? m : encodeURIComponent ( v ) ;
384+ } ) ;
385+ const fillP = s => s . replace ( / \/ ? \{ ( [ ^ { } ] + ) \} / g, ( m , name ) => {
386+ const v = val ( name ) ;
387+ if ( v === null ) return '' ;
388+ const enc = encodeURIComponent ( v ) . replace ( / % 2 F / gi, '/' ) . replace ( / % 3 A / gi, ':' ) ;
389+ return m . charAt ( 0 ) === '/' ? '/' + enc : enc ;
390+ } ) ;
291391 const parts = [ ] ;
292392 query . split ( '&' ) . forEach ( seg => {
293393 if ( ! seg ) return ;
294- const filled = seg . replace ( / \{ ( [ ^ { } ] + ) \} / g, ( m , name ) => {
295- const v = values [ name ] ;
296- return v === undefined || v === null || String ( v ) . trim ( ) === '' ? m : encodeURIComponent ( String ( v ) . trim ( ) ) ;
297- } ) ;
394+ const filled = fillQ ( seg ) ;
298395 if ( filled . indexOf ( '{' ) >= 0 ) return ;
299396 parts . push ( filled ) ;
300397 } ) ;
398+ base = fillP ( base ) ;
399+ hash = fillP ( hash ) ;
301400 return base + ( parts . length > 0 ? '?' + parts . join ( '&' ) : '' ) + hash ;
302401}
303402function jumpTo ( url ) {
304403 if ( ! url ) return ;
305404 location . assign ( url ) ;
306405}
406+ function focusInput ( ) {
407+ if ( window . matchMedia && ! window . matchMedia ( '(hover: hover)' ) . matches ) return ;
408+ q . focus ( ) ;
409+ q . select ( ) ;
410+ }
307411let urlTimer = 0 ;
308412function syncUrl ( ) {
309413 clearTimeout ( urlTimer ) ;
@@ -340,7 +444,6 @@ <h2 class="big-title">Quick Links</h2>
340444 curEng = { name : first , tpl : e0 . tpl , phs : e0 . phs , cat : firstCat } ;
341445 }
342446 }
343- renderBoxes ( ) ;
344447 renderLinks ( ) ;
345448 refresh ( ) ;
346449 const urlParams = new URLSearchParams ( location . search ) ;
0 commit comments