'use strict'; var SimpleBlogSearch = function(args) { 'use strict'; $.ajax({ url: args.searchDataPath, dataType: args.dataType, success: function( response ) { // get the contents from search data var datas = args.processDataFunc(response); var $input = document.getElementById(args.searchInputID); if (!$input) return; var $resultContent = document.getElementById(args.resultsDivID); if ($("#" + args.searchInputID).length > 0) { $input.addEventListener('input', function () { var str = `<ul class="${args.resultULClass}">`; var keywordRegex = new RegExp(this.value.toLowerCase(), "g") $resultContent.innerHTML = ""; if (this.value.trim().length <= 0) { return; } // perform local searching var count = 0 datas.some(function (data) { var isMatch = false; var content_index = []; if (!data.title || data.title.trim() === '') { data.title = "Untitled"; } var data_title = data.title.trim().toLowerCase(); var data_content = data.content.trim().replace(/(\r\n\t|\n|\r\t|\s)+/gm, " ") var data_content_lowercase = data_content.toLowerCase() var data_url = data.url; var index_content = -1; var first_occur = -1; // only match artiles with not empty contents if (data_content_lowercase !== '') { var matchTitles = data_title.match(keywordRegex) var matchContents = data_content_lowercase.match(keywordRegex) if (matchTitles != null) { isMatch = true } if (matchContents != null) { isMatch = true index_content = data_content_lowercase.indexOf(matchContents[0]); } if (index_content < 0) { index_content = 0 } first_occur = index_content } // show search results if (isMatch) { str += `<li><a href='${data_url}'>${data.title}</a>`; var content = data.content.trim(); if (first_occur >= 0) { // cut out 100 characters var start = first_occur - 20; var end = first_occur + 80; if (start < 0) { start = 0; } if (start == 0) { end = 100; } if (end > data_content.length) { end = data_content.length; } var match_content = data_content.substring(start, end); // highlight search result if (matchContents != null) { var regStr; if (match_content.toLowerCase().includes(matchContents[0])) { regStr = matchContents[0] } else { regStr = match_content.substring(20) } var reg = new RegExp(regStr.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), "gi"); match_content = match_content.replace(reg, `<em class="${args.highlightKeywordClass}">${regStr}</em>`); } str += `<p class="${args.resultParagraphClass}">${match_content}...</p>` } str += "</li>"; count += 1; } return count == args.limit; }); str += "</ul>"; $resultContent.innerHTML = str; }); } } }); } module.exports = SimpleBlogSearch;