import {Menu, showMessage, subMenu} from 'siyuan'; import SpellCheckPlugin from "@/index"; import {getBlockAttrs, setBlockAttrs} from "@/api"; import {Settings} from "@/settings"; import {ProtyleHelpers} from "@/protyleHelpers"; import {SuggestionEngine} from "@/suggestions"; export class Menus { private plugin: SpellCheckPlugin public constructor(plugin: SpellCheckPlugin) { this.plugin = plugin } public addCorrectionsToParagraphMenu(blockID: string, suggestionNumber: number, menu: subMenu) { const storedBlock = this.plugin.suggestions.getStorage()[blockID] if (suggestionNumber == -1) { return } void this.plugin.analytics.sendEvent('menu-open-wrong'); let suggestion = storedBlock.suggestions[suggestionNumber] menu.addItem({ icon: 'info', label: suggestion.shortMessage == '' ? suggestion.message : suggestion.shortMessage, click: async () => { showMessage(suggestion.message, 5000, 'info') void this.plugin.analytics.sendEvent('menu-click-info'); } }) if(suggestion.typeName == 'UnknownWord') { // add to dictionary menu.addItem({ icon: 'add', label: this.plugin.i18nx.textMenu.addToDictionary, click: async () => { void this.plugin.analytics.sendEvent('menu-click-add-to-dictionary'); const word = SuggestionEngine.suggestionToWrongText(suggestion, blockID) await Settings.addToDictionary(word, this.plugin.settingsUtil) showMessage(this.plugin.i18nx.textMenu.addedToDictionary + word, 5000, 'info') await this.plugin.suggestions.renderSuggestions(blockID) } }) } // corrections suggestion.replacements.forEach((replacement, correctionNumber) => { menu.addItem({ icon: 'spellcheck', label: replacement, click: async () => { void this.plugin.analytics.sendEvent('menu-click-correct', { 'type': suggestion.typeName }); if(this.plugin.settingsUtil.get('experimentalCorrect')) { void this.plugin.suggestions.correctSuggestion(blockID, suggestionNumber, correctionNumber) }else{ void navigator.clipboard.writeText(replacement) showMessage(this.plugin.i18nx.errors.correctionNotEnabled, 5000, 'info') } } }) }) } public async addSettingsToDocMenu(docID: string, menu: subMenu) { menu.addItem({ icon: 'info', label: this.plugin.i18nx.docMenu.documentStatus, click: async () => { const settings = await ProtyleHelpers.getDocumentSettings(docID, this.plugin.settingsUtil.get('enabledByDefault'), this.plugin.settingsUtil.get('defaultLanguage')) if(settings == null) { void this.plugin.analytics.sendEvent('docmenu-click-info-notebook'); showMessage(this.plugin.i18nx.errors.notImplementedNotebookSettings, 5000, 'info') return } showMessage(` ${this.plugin.i18nx.docMenu.documentStatus}
${this.plugin.i18nx.docMenu.status}: ${settings.enabled ? this.plugin.i18nx.docMenu.enabled : this.plugin.i18nx.docMenu.disabled}
${this.plugin.i18nx.docMenu.language}: ${settings.language} `, 5000, 'info') void this.plugin.analytics.sendEvent('docmenu-click-info'); } }) menu.addItem({ icon: 'toggle', label: this.plugin.i18nx.docMenu.toggleSpellCheck, click: async () => { void this.plugin.analytics.sendEvent('docmenu-click-toggle'); const attrs = await getBlockAttrs(docID) const settings = await ProtyleHelpers.getDocumentSettings(docID, this.plugin.settingsUtil.get('enabledByDefault'), this.plugin.settingsUtil.get('defaultLanguage')) if(settings == null) { void this.plugin.analytics.sendEvent('docmenu-click-info-notebook'); showMessage(this.plugin.i18nx.errors.notImplementedNotebookSettings, 5000, 'info') return } attrs[SpellCheckPlugin.ENABLED_ATTR] = settings.enabled ? 'false' : 'true' await setBlockAttrs(docID, attrs) location.reload() } }) menu.addItem({ icon: 'language', label: this.plugin.i18nx.docMenu.setDocumentLanguage, click: async (_, ev: MouseEvent) => { void this.plugin.analytics.sendEvent('docmenu-click-setlang-1'); const languages = await this.plugin.onlineSpellChecker.getLanguages() const langMenu = new Menu('spellCheckLangMenu'); langMenu.addItem({ icon: 'autodetect', label: this.plugin.i18nx.docMenu.autodetectLanguage, click: async () => { const attrs = await getBlockAttrs(docID) attrs[SpellCheckPlugin.LANGUAGE_ATTR] = 'auto' await setBlockAttrs(docID, attrs) void this.plugin.analytics.sendEvent('docmenu-click-setlang-2', { 'language': 'auto' }); location.reload() } }); languages.forEach(language => { langMenu.addItem({ icon: 'language', label: language.name + ' [' + language.longCode + ']', click: async () => { const attrs = await getBlockAttrs(docID) attrs[SpellCheckPlugin.LANGUAGE_ATTR] = language.longCode await setBlockAttrs(docID, attrs) void this.plugin.analytics.sendEvent('docmenu-click-setlang-2', { 'language': language.longCode }); location.reload() } }); }); langMenu.open({ x: ev.clientX, y: ev.clientY }); } }) } }