diff --git a/scripts/helpers/aside_categories.js b/scripts/helpers/aside_categories.js index 8fa89d3..0bf44f5 100644 --- a/scripts/helpers/aside_categories.js +++ b/scripts/helpers/aside_categories.js @@ -18,7 +18,7 @@ hexo.extend.helper.register('aside_categories', function (categories, options) { const depth = options.depth ? parseInt(options.depth, 10) : 0 const orderby = options.orderby || 'name' const order = options.order || 1 - const tagDir = this.url_for(config.tag_dir) + const categoryDir = this.url_for(config.category_dir) const limit = options.limit === 0 ? categories.length : options.limit const buttonLabel = this._p('aside.more_button') const prepareQuery = parent => { @@ -74,7 +74,7 @@ hexo.extend.helper.register('aside_categories', function (categories, options) { var moreHtml = '' if (categories.length <= limit) return '' moreHtml += '
  • ' - moreHtml += `` + moreHtml += `` moreHtml += buttonLabel moreHtml += '
  • ' return moreHtml diff --git a/source/css/_search/index.styl b/source/css/_search/index.styl index bf3794e..79bb359 100644 --- a/source/css/_search/index.styl +++ b/source/css/_search/index.styl @@ -50,4 +50,5 @@ height: 100% .search-result-list - max-height: 100% !important + max-height: 75vh !important + padding-bottom: 2rem diff --git a/source/css/_search/local-search.styl b/source/css/_search/local-search.styl index e1861f9..534117f 100644 --- a/source/css/_search/local-search.styl +++ b/source/css/_search/local-search.styl @@ -18,7 +18,8 @@ .local-search__hit-item position: relative - padding-left: 1.5rem + padding-left: 1.3rem + line-height: 1.7 &:hover &:before @@ -27,7 +28,7 @@ &:before $w = .3rem position: absolute - top: .4rem + top: .3rem left: 0 width: w = $w height: h = w @@ -41,12 +42,20 @@ a display: block color: $font-black + font-weight: 600 font-size: 14px cursor: pointer &:hover color: $search-color + .search-result + margin: 0 0 .4rem + + .search-keyword + color: $search-keyword-highlight + font-weight: bold + .local-search-stats__hr display: none !important diff --git a/source/css/var.styl b/source/css/var.styl index 9be3e5d..49fb7d4 100644 --- a/source/css/var.styl +++ b/source/css/var.styl @@ -79,6 +79,7 @@ $reward-pop-up-color = #858585 // search $search-bg = #f6f8fa $search-color = $theme-color +$search-keyword-highlight = #F47466 //gallery $gallery-color = #fff // tag-hide diff --git a/source/js/search/local-search.js b/source/js/search/local-search.js index efcec8a..c2bee81 100644 --- a/source/js/search/local-search.js +++ b/source/js/search/local-search.js @@ -1,7 +1,10 @@ $(function () { var loadFlag = false $('a.social-icon.search').on('click', function () { - $('body').css({ width: '100%', overflow: 'hidden' }) + $('body').css({ + width: '100%', + overflow: 'hidden' + }) $('.search-dialog').css('display', 'block') $('#local-search-input input').focus() $('.search-mask').fadeIn() @@ -52,6 +55,7 @@ $(function () { url: $('url', this).text() } }).get() + var $input = $('#local-search-input input')[0] var $resultContent = $('#local-hits')[0] $input.addEventListener('input', function () { @@ -66,13 +70,17 @@ $(function () { // perform local searching datas.forEach(function (data) { var isMatch = true + if (!data.title || data.title.trim() === '') { + data.title = 'Untitled' + } var dataTitle = data.title.trim().toLowerCase() var dataContent = data.content.trim().replace(/<[^>]+>/g, '').toLowerCase() var dataUrl = data.url var indexTitle = -1 var indexContent = -1 + var firstOccur = -1 // only match artiles with not empty titles and contents - if (dataTitle !== '' && dataContent !== '') { + if (dataTitle !== '' || dataContent !== '') { keywords.forEach(function (keyword, i) { indexTitle = dataTitle.indexOf(keyword) indexContent = dataContent.indexOf(keyword) @@ -82,20 +90,60 @@ $(function () { if (indexContent < 0) { indexContent = 0 } + if (i === 0) { + firstOccur = indexContent + } } }) + } else { + isMatch = false } + // show search results if (isMatch) { - str += '
    ' + dataTitle + '' + '
    ' - count += 1 - $('.local-search-stats__hr').show() + var content = data.content.trim().replace(/<[^>]+>/g, '') + if (firstOccur >= 0) { + // cut out 130 characters + var start = firstOccur - 30 + var end = firstOccur + 100 + + if (start < 0) { + start = 0 + } + + if (start === 0) { + end = 100 + } + + if (end > content.length) { + end = content.length + } + + var matchContent = content.substring(start, end) + + // highlight all keywords + keywords.forEach(function (keyword) { + var regS = new RegExp(keyword, 'gi') + matchContent = matchContent.replace(regS, '' + keyword + '') + dataTitle = dataTitle.replace(regS, '' + keyword + '') + }) + + str += '
    ' + dataTitle + '' + count += 1 + $('.local-search-stats__hr').show() + + if (dataContent !== '') { + str += '

    ' + matchContent + '...

    ' + } + } + str += '
    ' } }) if (count === 0) { str += '
    ' + GLOBAL_CONFIG.localSearch.languages.hits_empty.replace(/\$\{query}/, this.value.trim()) + '
    ' } + str += '' $resultContent.innerHTML = str }) }