From 0963c5863fc43e6d20b34e8348824995f84f2230 Mon Sep 17 00:00:00 2001 From: wangyi7099 <724003548@qq.com> Date: Tue, 30 Jul 2019 21:07:25 +0800 Subject: [PATCH] feat(antdsite): add searchMaxSuggestions for searchbox --- .../antdsite/__default__/default-config.js | 3 +- packages/antdsite/src/assets/index.less | 1 + .../search-box.less} | 4 + packages/antdsite/src/assets/toc.less | 2 +- .../src/components/search-box/index.tsx | 37 +++--- packages/antdsite/src/layout/Header.tsx | 6 +- .../docs/docs/zh/guide/getting-started.md | 107 +++++++++++++++++- packages/docs/docs/zh/guide/introduction.md | 36 ------ 8 files changed, 141 insertions(+), 55 deletions(-) rename packages/antdsite/src/{components/search-box/index.module.less => assets/search-box.less} (96%) diff --git a/packages/antdsite/__default__/default-config.js b/packages/antdsite/__default__/default-config.js index 103398f..d33285a 100644 --- a/packages/antdsite/__default__/default-config.js +++ b/packages/antdsite/__default__/default-config.js @@ -16,6 +16,7 @@ module.exports = { showAvatarList: true, showBackToTop: true, maxTocDeep: 3, - showSearchBox: true, + search: true, + searchMaxSuggestions: 10, }, }; diff --git a/packages/antdsite/src/assets/index.less b/packages/antdsite/src/assets/index.less index b7fc2fd..918ca4f 100644 --- a/packages/antdsite/src/assets/index.less +++ b/packages/antdsite/src/assets/index.less @@ -21,3 +21,4 @@ @import './theme'; @import './docsearch'; @import './page-scrollbar'; +@import './search-box'; diff --git a/packages/antdsite/src/components/search-box/index.module.less b/packages/antdsite/src/assets/search-box.less similarity index 96% rename from packages/antdsite/src/components/search-box/index.module.less rename to packages/antdsite/src/assets/search-box.less index ad31dd5..4e1c326 100644 --- a/packages/antdsite/src/components/search-box/index.module.less +++ b/packages/antdsite/src/assets/search-box.less @@ -3,6 +3,10 @@ margin: 16px auto 0; position: relative; + .hight-light { + color: #1890ff; + } + input { border-radius: 32px; width: 200px; diff --git a/packages/antdsite/src/assets/toc.less b/packages/antdsite/src/assets/toc.less index e8a1161..fee2fca 100644 --- a/packages/antdsite/src/assets/toc.less +++ b/packages/antdsite/src/assets/toc.less @@ -11,7 +11,7 @@ position: absolute; top: 8px; right: 20px; - max-width: 174px; + max-width: 170px; .ant-affix { background: #fff; max-height: 80vh; diff --git a/packages/antdsite/src/components/search-box/index.tsx b/packages/antdsite/src/components/search-box/index.tsx index e65e959..a721de1 100644 --- a/packages/antdsite/src/components/search-box/index.tsx +++ b/packages/antdsite/src/components/search-box/index.tsx @@ -1,6 +1,5 @@ import React from 'react'; import { List, Input, Icon, Breadcrumb } from 'antd'; -import styles from './index.module.less'; import { PageInfo } from '../utils'; import { OneToc } from '../../templates/docs'; import { Link } from 'gatsby'; @@ -19,6 +18,7 @@ interface SearchState { interface SearchProps { datas: Array; + max: number; } function match(a: string, b: string) { @@ -77,22 +77,27 @@ export default class Search extends React.Component { }; search = () => { - const { datas } = this.props; + const { datas, max } = this.props; const query = this.state.query.trim(); const results: filterDatas = []; + function hightlightRes(res: string) { + return res.replace(new RegExp(query, 'g'), `${query}`); + } + function resolveOnePageItem(currentItem: PageInfo) { if (match(currentItem.title, query)) { results.push([ { url: currentItem.slug, - title: currentItem.title, + title: hightlightRes(currentItem.title), important: currentItem.important, }, ]); } else if (currentItem.toc && currentItem.toc.items.length) { let tocs = flattenToc(currentItem.toc.items); - tocs.forEach(t => { + for (let i = 0; i < tocs.length && results.length < max; i++) { + let t = tocs[i]; if (match(t.title, query)) { results.push([ { @@ -101,15 +106,15 @@ export default class Search extends React.Component { }, { url: currentItem.slug + t.url, - title: t.title, + title: hightlightRes(t.title), }, ]); } - }); + } } } - for (let i = 0; i < datas.length; i++) { + for (let i = 0; i < datas.length && results.length < max; i++) { const currentItem = datas[i]; if (currentItem.slug) { resolveOnePageItem(currentItem); @@ -129,8 +134,8 @@ export default class Search extends React.Component { const { filterDatas } = this.state; return ( -