diff --git a/app/src/protyle/toolbar/index.ts b/app/src/protyle/toolbar/index.ts index b348cb504..9275b7715 100644 --- a/app/src/protyle/toolbar/index.ts +++ b/app/src/protyle/toolbar/index.ts @@ -1226,24 +1226,24 @@ export class Toolbar { hideElements(["hint"], protyle); window.siyuan.menus.menu.remove(); this.range = getEditorRange(nodeElement); - let html = `
${window.siyuan.languages.clear}
`; + let html = `
${window.siyuan.languages.clear}
`; let hljsLanguages = Constants.ALIAS_CODE_LANGUAGES.concat(window.hljs?.listLanguages() ?? []).sort(); - - const eventDetail = { languages: hljsLanguages }; + + const eventDetail = {languages: hljsLanguages}; if (protyle.app && protyle.app.plugins) { protyle.app.plugins.forEach((plugin: any) => { - plugin.eventBus.emit("code-languages-prepare", eventDetail); + plugin.eventBus.emit("code-language-before", eventDetail); }); } - + hljsLanguages = eventDetail.languages; hljsLanguages.forEach((item, index) => { - html += `
${item}
`; + html += `
${item}
`; }); this.subElement.style.width = ""; this.subElement.style.padding = ""; - this.subElement.innerHTML = `
+ this.subElement.innerHTML = `
${html}
`; @@ -1269,47 +1269,41 @@ export class Toolbar { }); inputElement.addEventListener("input", (event) => { const lowerCaseValue = inputElement.value.toLowerCase(); - let html = `
${window.siyuan.languages.clear}
`; + const matchLanguages = hljsLanguages.filter(item => item.includes(lowerCaseValue)); + let html = ""; + // sort let matchInput = false; - if (inputElement.value.trim()) { - const matchLanguages = hljsLanguages.filter(item => item.includes(lowerCaseValue)); - // sort - matchLanguages.sort((a, b) => { - if (a.startsWith(lowerCaseValue) && b.startsWith(lowerCaseValue)) { - if (a.length < b.length) { - return -1; - } else if (a.length === b.length) { - return 0; - } else { - return 1; - } - } else if (a.startsWith(lowerCaseValue)) { + matchLanguages.sort((a, b) => { + if (a.startsWith(lowerCaseValue) && b.startsWith(lowerCaseValue)) { + if (a.length < b.length) { return -1; - } else if (b.startsWith(lowerCaseValue)) { - return 1; - } else { + } else if (a.length === b.length) { return 0; + } else { + return 1; } - }).forEach((item) => { - if (inputElement.value === item) { - matchInput = true; - } - html += `
${item.replace(lowerCaseValue, "" + lowerCaseValue + "")}
`; - }); - if (!matchInput) { - html += `
${escapeHtml(inputElement.value.replace(/`| /g, "_"))}
`; + } else if (a.startsWith(lowerCaseValue)) { + return -1; + } else if (b.startsWith(lowerCaseValue)) { + return 1; + } else { + return 0; } - } else { - hljsLanguages.forEach((item, index) => { - html += `
${item}
`; - }); + }).forEach((item) => { + if (inputElement.value === item) { + matchInput = true; + } + html += `
${item.replace(lowerCaseValue, "" + lowerCaseValue + "")}
`; + }); + if (inputElement.value.trim() && !matchInput) { + html = `
${escapeHtml(inputElement.value.replace(/`| /g, "_"))}
${html}`; } + html = `
${window.siyuan.languages.clear}
` + html; listElement.innerHTML = html; - for (const item of listElement.children) { - if (item.getAttribute("data-id") !== "clear" && item.getBoundingClientRect().height !== 0) { - item.classList.add("b3-list-item--focus"); - break; - } + if (listElement.childElementCount > 2 && !matchInput && inputElement.value.trim()) { + listElement.firstElementChild.nextElementSibling.nextElementSibling.classList.add("b3-list-item--focus"); + } else { + listElement.firstElementChild.nextElementSibling.classList.add("b3-list-item--focus"); } event.stopPropagation(); }); @@ -1330,12 +1324,6 @@ export class Toolbar { /// #else setPosition(this.subElement, 0, 0); /// #endif - for (const item of listElement.children) { - if (item.getBoundingClientRect().height !== 0) { - item.classList.add("b3-list-item--focus"); - break; - } - } this.element.classList.add("fn__none"); inputElement.select(); } @@ -1767,24 +1755,17 @@ ${item.name} private updateLanguage(languageElements: HTMLElement[], protyle: IProtyle, selectedLang: string) { const currentLang = selectedLang === window.siyuan.languages.clear ? "" : selectedLang; - + if (protyle.app && protyle.app.plugins) { - const languageChanges = languageElements.map(element => { - return { - oldLanguage: element.textContent || "", - languageElement: element - }; - }); - const eventDetail = { - language: currentLang, - languageChanges: languageChanges, - protyle: protyle - }; protyle.app.plugins.forEach((plugin: any) => { - plugin.eventBus.emit("code-languages-change", eventDetail); + plugin.eventBus.emit("code-language-change", { + language: currentLang, + languageElements, + protyle: protyle + }); }); } - + if (!Constants.SIYUAN_RENDER_CODE_LANGUAGES.includes(currentLang)) { window.siyuan.storage[Constants.LOCAL_CODELANG] = currentLang; setStorageVal(Constants.LOCAL_CODELANG, window.siyuan.storage[Constants.LOCAL_CODELANG]); diff --git a/app/src/types/index.d.ts b/app/src/types/index.d.ts index 67cbdf62d..d4eb13657 100644 --- a/app/src/types/index.d.ts +++ b/app/src/types/index.d.ts @@ -86,7 +86,7 @@ type TEventBus = "ws-main" | "sync-start" | "sync-end" | "sync-fail" | "destroy-protyle" | "lock-screen" | "mobile-keyboard-show" | "mobile-keyboard-hide" | - "code-languages-prepare" | "code-languages-change" + "code-language-before" | "code-language-change" type TAVView = "table" | "gallery" type TAVCol = "text"