diff options
| -rw-r--r-- | assets/js/main_new.js | 58 | ||||
| -rw-r--r-- | index.html | 4 |
2 files changed, 16 insertions, 46 deletions
diff --git a/assets/js/main_new.js b/assets/js/main_new.js index fc4b6ce..a6c10c6 100644 --- a/assets/js/main_new.js +++ b/assets/js/main_new.js @@ -1,51 +1,21 @@ -/** - * 根据 URL ?kw= 参数高亮页面内匹配的关键词。 - * 提取为全局函数,供 pjax.js 在页面切换后复用,避免重复实现。 - */ function highlightKeyword() { - const urlParams = new URLSearchParams(window.location.search); - const keyword = urlParams.get('kw')?.trim(); + var match = location.search.match(/[?&]kw=([^&]+)/); + var kw = match ? $.trim(decodeURIComponent(match[1].replace(/\+/g, ' '))) : ''; + if (!kw) return; - if (!keyword) return; + var reg = new RegExp('(' + kw.replace(/[.*+?^${}()|[\]\\]/g, '\\$&') + ')', 'gi'); + var escapeMap = { '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }; - // 转义正则表达式特殊字符,避免安全问题 - const escapedKeyword = keyword.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); - // 创建不区分大小写的正则表达式(全局匹配) - const regex = new RegExp(`(${escapedKeyword})`, 'gi'); - - // 递归遍历并高亮文本节点 - const escapeHTML = str => str.replace(/[&<>"']/g, - tag => ({ - '&': '&', - '<': '<', - '>': '>', - '"': '"', - "'": ''' - }[tag] || tag)); - function highlightTextNodes(element) { - $(element).contents().each(function () { - if (this.nodeType === Node.TEXT_NODE) { - const $this = $(this); - const text = escapeHTML($this.text()); - - // 使用正则替换并保留原始大小写 - if (regex.test(text)) { - const replaced = text.replace(regex, '<mark>$1</mark>'); - $this.replaceWith(replaced); - } - } else if ( - this.nodeType === Node.ELEMENT_NODE && - !$(this).is('script, style, noscript, textarea') - ) { - highlightTextNodes(this); - } - }); - } - - $('section').each(function () { - highlightTextNodes(this); + $('section, section *').not('script, style, textarea').contents().filter(function() { + return this.nodeType === 3; + }).each(function() { + var escapedText = this.nodeValue.replace(/[&<>"']/g, function(m) { return escapeMap[m]; }); + var highlighted = escapedText.replace(reg, '<mark>$1</mark>'); + if (escapedText !== highlighted) { + $(this).replaceWith(highlighted); + } }); -}; +} function initCopyButtons() { $('.copy').remove(); @@ -12,7 +12,7 @@ image: https://screenshot.mayx.eu.org/ <!-- 遍历分页后的文章 --> <table class="entry-content h-feed"> {% for post in paginator.posts %} - <tr><td class="h-entry" data-url="{{ post.url }}"> + <tr><td class="h-entry post-row" data-url="{{ post.url }}"> <h2 class="p-name"><a class="post-link u-url" href="{{ post.url }}">{{ post.title }}{% if post.layout == "encrypt" %} [加密] {% endif %}</a></h2> <p> <time class="date dt-published" datetime="{{ post.date | date_to_xmlschema }}">{{ post.date | date: "%-d %B %Y" }}</time> @@ -79,7 +79,7 @@ image: https://screenshot.mayx.eu.org/ <a href="https://xn--sr8hvo.ws/next">→</a><br /><a href="https://icp.gov.moe/?keyword=20218888" target="_blank">萌ICP备 20218888号</a></small> <input name="live2dBGM" value="https://music.163.com/song/media/outer/url?id=523658881.mp3" type="hidden" /> <script> -$(document).on('click', '.h-entry', function(e) { +$(document).on('click', '.post-row', function(e) { if ($(e.target).closest('.p-category').length === 0) { go($(this).attr('data-url')); } |
