diff --git a/assets/index.js b/assets/index.js index b01730bc..c0146b0c 100644 --- a/assets/index.js +++ b/assets/index.js @@ -1,8 +1,3 @@ -// 正则转义 -escapeRe = s => { - return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); -} - // html实体编码 escapeHtml = s => { return s.replace(/ { .replace(/'/g, "'"); } -// 列表 -list = (path, initial, type, name ,desc) => { - return `
-
${initial}
-
${type}
-
${name}
-
${desc}
-
` -} - // 显示列表 showList = (text, index, listnum) => { - window.ResultList = []; - window.ResultIndex = []; - var obn = []; - var obd = []; + window.infoRows = []; + var topRows = [], + tailRows = []; index.forEach(i => { - let reg = new RegExp(escapeRe(text), "i",) - match1 = reg.exec(i.name), - match2 = reg.exec(i.desc), - name = escapeHtml(i.name), - desc = i.desc != undefined ? escapeHtml(i.desc) : "", - type = i.type != undefined ? escapeHtml(i.type) : ""; - let initial = i.name.slice(0, 1).toUpperCase(); - // let initial = /^([a-zA-Z])/.exec(i.name); - // initial = initial ? initial[1].toUpperCase() : '*'; - // 优先显示名称匹配的内容 - if (match1) { - name = highlightList(name, match1[0]); - if (match2) desc = highlightList(desc, match2[0]); - // 置顶全字匹配的内容 - if (i.name.toUpperCase() == text.toUpperCase()) { - obn.unshift(list(i.path, initial, type, name, desc)); - window.ResultIndex.push(i); - } else { - obn.push(list(i.path, initial, type, name, desc)); - window.ResultIndex.push(i); - } - // 其次显示描述匹配的内容 - } else if (match2) { - desc = highlightList(desc, match2[0]); - obd.push(list(i.path, initial, type, name, desc)); - } + let displayName = escapeHtml(i.name), + displatDesc = i.desc != undefined ? escapeHtml(i.desc) : "", + displayType = i.type != undefined ? escapeHtml(i.type) : "", + upName = i.name.toUpperCase(), + upDesc = i.desc.toUpperCase(), + initial = upName.slice(0, 1), + topRow = true, + matched = true; + // 多关键词搜索 + text.trim().split(' ').forEach(keyword => { + upName.includes(keyword) || (topRow = false); + (upName.includes(keyword) || upDesc.includes(keyword)) || (matched = false); + }) + var list = `
+
${initial}
+
${displayType}
+
${displayName}
+
${displatDesc}
+
` + // 排序规则:置顶全字匹配,优先显示名称匹配 + topRow && ((upName == text) && topRows.unshift(list) || topRows.push(list)) || (matched && tailRows.push(list)); }); - window.ResultList = obn.concat(obd); - $("#mainlist").html(window.ResultList.slice(0, listnum).join('')); + window.infoRows = topRows.concat(tailRows); + $("#mainlist").html(window.infoRows.slice(0, listnum).join('')); let num = $(".info").length utools.setExpendHeight(num > 11 ? 550 : 50 * num); $(".select").removeClass('select'); $(".info:first").addClass('select'); + $('html').getNiceScroll().resize(); // 鼠标锁,方式鼠标抢占选择条 window.mouseLockTime = new Date().getTime(); } + // 显示手册 showManual = path => { utools.setExpendHeight(550); @@ -106,16 +87,13 @@ showManual = path => { // 手册/配置页搜索结果高亮 highlightManual = (selector, text) => { - $(selector).removeHighlight() ; + $(selector).removeHighlight('founds') ; if (text) { - $(selector).highlight(text); + $(selector).highlight(text, 'founds'); window.findex = 0; } } -// 列表搜索结果高亮 -highlightList = (string, match) => string.replace(match, `${match}`) - // 初始化 init = () => { $("#mainlist").fadeOut(0); @@ -132,52 +110,28 @@ sendText = text => { window.paste(); } -// 检查升级 -checkUpdate = () => { - let cv = 'v0.0.2', - pg = 'https://yuanliao.info/d/356'; - if (!utools.db.get(cv)) { - $.get(pg, data => { - data = /\[插件\]\[程序员手册 (.*?)\](.*?) - 猿料<\/title>/.exec(data); - let lv = data[1], - desc = data[2]; - if (lv != cv) { - options = { - type: 'info', - title: '插件有可用更新', - icon: window.getLogo(), - cancelId: 1, - message: `发现新版本 ${lv},是否前往更新?\n更新内容:\n${desc}`, - buttons: ['起驾', '朕知道了', '别再烦朕'] - }; - window.messageBox(options, index => { - if (index == 0) { - window.open(pg) - } else if (index == 2) { - utools.db.put({ _id: cv, data: "pass" }) - } - }) - } - }) - } -} - // 切换列表和手册视图 toggleView = () => { if ($("#manual").is(":hidden") && $("#mainlist").is(":visible")) { $("#manual").fadeIn(); $("#mainlist").fadeOut(); + utools.setExpendHeight(550); } else if ($("#manual").is(":visible") && $("#mainlist").is(":hidden")) { $("#manual").fadeOut(); $("#mainlist").fadeIn(); + let num = $(".info").length + utools.setExpendHeight(num > 11 ? 550 : 50 * num); } } -// 加载剩余列表 -loadList = listnum => { - if ($(window).scrollTop() >= (listnum * 50 - 550) && $(".info").length <= listnum) { - $("#mainlist").append(window.ResultList.slice(listnum).join('')); - $('html').getNiceScroll().resize(); +// 继续加载内容 +loadList = addnum => { + if ($('#manual').is(':hidden') && $("#mainlist").is(":visible")) { + var listnum = $(".info").length; + if ($(window).scrollTop() >= (listnum * 50 - 550)) { + $("#mainlist").append(window.infoRows.slice(listnum, listnum + addnum).join('')); + $('html').getNiceScroll().resize(); + } } } @@ -249,12 +203,11 @@ utools.onPluginEnter( async ({ code, type, payload }) => { utools.setSubInput(({ text }) => { // 列表搜索 if ($('#manual').is(':hidden')) { - // 空格进行多关键词搜索 - if (text.includes(' ')) { - showList(text.split(' ').pop(), window.ResultIndex, 500) - } else { - showList(text, index, 500); - } + showList(text.toUpperCase(), index, 500); + // 高亮结果 + text.split(' ').forEach(keyword => { + keyword && $(".name,.description").highlight(keyword, 'listFounds'); + }); // 手册搜索 } else { highlightManual("#manual", text); diff --git a/assets/options.js b/assets/options.js index 13788dc4..3d9c6042 100644 --- a/assets/options.js +++ b/assets/options.js @@ -220,12 +220,12 @@ $("#options").on('click', '.selectBtn', function () { }) // 保存 -$("#options").on('click', '.saveBtn', function () { +$("#options").on('click', '.saveBtn', async function () { var code = $('#code').val() - var allFts = getManuals(); + var allFts = await getManuals(); if (code in allFts && $("#code").prop('disabled') == false) { $('#code').css({ 'border-bottom-color': '#ec1212' }) - window.messageBox({ type: 'error', message: "名称与现有的手册重复!", buttons: ['朕知道了'] }) + window.messageBox({ type: 'error', icon: window.logo, message: "名称与现有的手册重复!", buttons: ['朕知道了'] }) } else { var kw = $('#kw').val().split(','), desc = $('#desc').val(), diff --git a/assets/style.css b/assets/style.css index af2fcf35..a6e11bea 100644 --- a/assets/style.css +++ b/assets/style.css @@ -85,6 +85,10 @@ border-radius: 4px; } +.listFounds { + color: #FF5722; +} + .firstFound{ box-shadow: 0px 0px 5px 1px #FF5722; } diff --git a/plugin.json b/plugin.json index 54a772d2..cfe3d27c 100644 --- a/plugin.json +++ b/plugin.json @@ -1,10 +1,10 @@ { "pluginName": "程序员手册", - "description": "内置了多个实用的离线中文手册,包括:Linux、PHP、Python、JS、C、Vim、Git、Docker、Sql、uTools等", + "description": "内置了十多个实用的离线中文手册,包括:Linux、PHP、Python、JS等,以及提供了搜索devdocs、dash上的文档的功能", "main": "index.html", "homepage": "https://github.com/fofolee/uTools-Manuals", "publishPage": "https://yuanliao.info/d/356", - "version": "0.0.2", + "version": "0.0.3", "author": "云之轩", "logo": "logo.png", "platform": [ "win32", "darwin" ], diff --git a/preload.js b/preload.js index 26e3f461..ab554860 100644 --- a/preload.js +++ b/preload.js @@ -1,17 +1,30 @@ -const fs = require('fs'); -const { shell, clipboard } = require('electron'); -const { dialog, BrowserWindow, nativeImage } = require('electron').remote -const path = require("path") +const { clipboard } = require('electron'); const { exec } = require('child_process'); const robot = require('./robotjs') -dirname = __dirname; +//-------checkUpdate------ +const fs = require('fs'); +const path = require("path") +const { dialog, BrowserWindow, nativeImage } = require('electron').remote +const { shell } = require('electron'); -isWin = process.platform == 'win32' ? true : false; +pluginInfo = JSON.parse(fs.readFileSync(path.join(__dirname, 'plugin.json'))); +logo = nativeImage.createFromPath(path.join(__dirname, 'logo.png')); + +messageBox = (options, callback) => { + dialog.showMessageBox(BrowserWindow.getFocusedWindow(), options, index => { + callback(index); + }) +} open = url => { shell.openExternal(url); } +// ------------------------ + +dirname = __dirname; + +isWin = process.platform == 'win32' ? true : false; openFolder = () => { return dialog.showOpenDialog(BrowserWindow.getFocusedWindow(), { @@ -28,14 +41,6 @@ readFile = file => }); }); -getLogo = () => nativeImage.createFromPath(path.join(__dirname, 'logo.png')); - -messageBox = (options, callback) => { - dialog.showMessageBox(BrowserWindow.getFocusedWindow(), options, index => { - callback(index); - }) -} - exists = path => { return fs.existsSync(path); }