diff --git a/README.md b/README.md index cd6b4a89..e271736a 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ A **highly extensible** Markdown editor, designed for productivity. **[Download] [![Download](./help/mas_en.svg?.inline)](https://apps.apple.com/cn/app/yank-note/id1551528618) [Not recommended](https://github.com/purocean/yn/issues/65#issuecomment-1065799677) -English | [中文说明](./README_ZH-CN.md) +English | [中文说明](./README_ZH-CN.md) | [Русский](./README_RU.md) [toc]{level: [2]} @@ -76,12 +76,17 @@ For more information on how to use the following functions, please see [characte ## Changelogs -### [v3.75.4](https://github.com/purocean/yn/releases/tag/v3.75.4) 2024-08-06 +### [v3.76.1](https://github.com/purocean/yn/releases/tag/v3.76.1) 2024-09-06 -[Windows](https://github.com/purocean/yn/releases/download/v3.75.4/Yank-Note-win-x64-3.75.4.exe) | [macOS arm64](https://github.com/purocean/yn/releases/download/v3.75.4/Yank-Note-mac-arm64-3.75.4.dmg) | [macOS x64](https://github.com/purocean/yn/releases/download/v3.75.4/Yank-Note-mac-x64-3.75.4.dmg) | [Linux AppImage](https://github.com/purocean/yn/releases/download/v3.75.4/Yank-Note-linux-x86_64-3.75.4.AppImage) | [Linux deb](https://github.com/purocean/yn/releases/download/v3.75.4/Yank-Note-linux-amd64-3.75.4.deb) +[Windows](https://github.com/purocean/yn/releases/download/v3.76.1/Yank-Note-win-x64-3.76.1.exe) | [macOS arm64](https://github.com/purocean/yn/releases/download/v3.76.1/Yank-Note-mac-arm64-3.76.1.dmg) | [macOS x64](https://github.com/purocean/yn/releases/download/v3.76.1/Yank-Note-mac-x64-3.76.1.dmg) | [Linux AppImage](https://github.com/purocean/yn/releases/download/v3.76.1/Yank-Note-linux-x86_64-3.76.1.AppImage) | [Linux deb](https://github.com/purocean/yn/releases/download/v3.76.1/Yank-Note-linux-amd64-3.76.1.deb) -1. fix: Correct the error in detecting supported file types. -2. fix: Resolve the issue where the shortcut key triggers an accent key and inserts additional characters in the editor on macOS. +1. feat: Added support for the Russian language +2. feat: Added an entry point for usage guidance +3. feat: Optimized the completion of ordered list numbers +4. feat: Added `{docHash}` placeholder to the image save directory configuration +5. fix: Fixed an issue where the input box might not be focusable on Windows +6. fix: Fixed the issue of incorrect read-only status in the editor under certain conditions +7. fix: Fixed the issue of incorrect size calculation for Mermaid rendering under certain conditions [More release notes](https://github.com/purocean/yn/releases) diff --git a/README_RU.md b/README_RU.md new file mode 100644 index 00000000..9a447b86 --- /dev/null +++ b/README_RU.md @@ -0,0 +1,82 @@ +# Yank Note + +**Гибкий, расширяемый** редактор Markdown, создан для повышения производительности. **[Скачать](https://github.com/purocean/yn/releases)** | **[Попробовать онлайн >>>](https://demo.yank-note.com/)** + + +[![Скачать](./help/mas_en.svg?.inline)](https://apps.apple.com/cn/app/yank-note/id1551528618) [Не рекомендуется](https://github.com/purocean/yn/issues/65#issuecomment-1065799677) + +[English](./README.md) | [中文说明](./README_ZH-CN.md) | Русский + +[toc]{level: [2]} + +![Screenshot](./help/1.png) + +## Особенности + +- **Простота использования:** Используется ядро *Monaco*, оптимизированное для редактирования в формате Markdown, и возможности редактирования такие же, как у VSCode. +- **Мощный:** Поддержка контроля версий; в документ можно встраивать апплеты, запускаемые блоки кода, таблицы, PlantUML, Drawio, макрозамены и т.д.; поддержка автодополнения [OpenAI](https://openai.com). +- **Высокая совместимость:** Данные сохраняются в виде локальных файлов Markdown, а функции расширения реализованы в оригинальном синтаксисе Markdown, насколько это возможно. +- **Расширение плагинов:** Поддержка пользователей в написании собственных плагинов для расширения функциональности редактора. +- **Поддержка шифрования:** Используйте шифрование для сохранения приватных файлов, таких как номер счета, а пароль может быть установлен отдельно для каждого файла. + +## Внимание + +- Ради большей расширяемости Yank Note жертвует защитой безопасности (выполнение команд, произвольное чтение и запись файлов). Если вы хотите использовать его для открытия постороннего файла Markdown, ⚠️**убедитесь, что содержимое файла заслуживает доверия**⚠️. +- Шифрование и дешифрование зашифрованных файлов выполняется на клиентской стороне. Пожалуйста, **убедитесь, что вы помните свой пароль**. Если пароль утерян, его можно только взломать. + +## Основнве функции + +Более подробную информацию об использовании следующих функций см. в разделе [описание основных функций](./help/FEATURES.md) + +- **Синхронная прокрутка:** область редактирования и область предварительного просмотра прокручиваются синхронно, а область предварительного просмотра можно прокручивать независимо +- **Конспект:** быстрый переход к соответствующему месту документа через конспект в области предварительного просмотра +- **Управление версиями:** поддержка истории документа +- **Шифрование:** файлы, заканчивающиеся на `.c.md`, обрабатываются как зашифрованные +- **Автосохранение:** автоматическое сохранение файлов после редактирования с напоминанием в строке заголовка для несохраненных файлов (зашифрованные документы не сохраняются автоматически) +- **Редактирование:** автоматическое заполнение списка +- **Вставка изображений:** вы можете быстро вставлять изображения из буфера обмена и вставлять их как файлы или Base64 +- **Вложения:** вы можете добавлять вложения в документ и открывать их в операционной системе щелчком мыши +- **Выполнение кода:** поддержка запуска JavaScript, PHP, nodejs, Python, кода bash +- **Список задач:** поддержка отображения хода выполнения задач в документе. Щелкните, чтобы быстро переключить статус задачи +- **Быстрое открытие:** вы можете использовать сочетание клавиш для открытия панели переключения файлов, чтобы быстро открывать файлы, помеченные файлы и выполнять полнотекстовый поиск по содержимому файлов +- **Интегрированный терминал:** поддержка открытия терминала в редакторе для быстрого переключения текущего рабочего каталога +- **Katex:** поддержка выражений katex +- **Стили:** Markdown использует стили и функции GitHub +- **Репозиторий:** можно определить несколько расположений данных для организации документов +- **Преобразование внешних ссылок:** преобразование внешних ссылок или изображений Base64 в локальные изображения +- **Разрешение HTML:** вы можете использовать HTML-код непосредственно в документе или использовать сочетания клавиш для копирования и вставки HTML в Markdown +- **Экспорт в несколько форматов:** backend использует pandoc в качестве конвертера +- **TOC:** напишите `[toc]{type:** "ol", level:** [1,2,3]}` для генерации TOC (Table Of Content, оглавление), где вам нужно сгенерировать его +- **Изменить ячейку таблицы:** дважды щелкните ячейку таблицы для быстрого редактирования +- **Копирование ссылки на заголовок:** копирование пути ссылки на заголовок в буфер обмена для легкой вставки в другие файлы +- **Встроенные апплеты:** документ поддерживает встроенные HTML-аплеты +- **Встроенная графика PlantUML:** документ поддерживает встроенную графику plantUML +- **Встроенная графика drawio:** документ поддерживает встроенную графику drawio +- **Встроенная графика ECharts:** документ поддерживает встроенную графику Echarts +- **Встроенная графика Mermaid:** документ поддерживает встроенную графику Mermaid +- **Встроенные таблицы Luckysheet:** документ поддерживает встроенные таблицы Luckysheet +- **Mind map:** вложенный список может быть отображен в виде интеллект-карты +- **Запись атрибутов элемента:** любой атрибут элемента может быть настроен +- **Улучшение таблиц:** поддержка заголовка таблицы с несколькими строками текста, списка и других функций +- **Ссылка на документ:** поддержка ссылок на другие документы в документе и перехода друг к другу +- **Сноска:** поддержка написания сносок в документе +- **Пользовательский контейнер:** поддержка пользовательских контейнеров, аналогичных VuePress по умолчанию темы +- **Макросы:** поддержка встроенных выражений JavaScript для динамической замены содержимого документа +- **Служба хостинга изображений:** поддержка службы хостинга изображений [PicGo](https://picgo.github.io/PicGo-Doc/) +- **OpenAI:** поддержка автодополнения [OpenAI](https://openai.com) +- **Пользовательские плагины:** поддержка написания плагинов JavaScript для расширения функциональности редактора. Плагин находится в `home directory/plugins`. См. [руководство по разработке плагинов](./help/PLUGIN.md) + +## Скриншоты + +![Screenshot](./help/6.png) +![Screenshot](./help/7.png) +![Screenshot](./help/2.png) +![Screenshot](./help/3.png) +![Screenshot](./help/4.png) +![Screenshot](./help/5.png) + +## Поддержка + +Wechat Group + + diff --git a/README_ZH-CN.md b/README_ZH-CN.md index d63ea7dd..b0911d91 100644 --- a/README_ZH-CN.md +++ b/README_ZH-CN.md @@ -4,7 +4,7 @@ [![Download](./help/mas_en.svg?.inline)](https://apps.apple.com/cn/app/yank-note/id1551528618) [Mac App Store 版本说明](https://github.com/purocean/yn/issues/65#issuecomment-1065799677) -[English](./README.md) | 中文说明 +[English](./README.md) | 中文说明 | [Русский](./README_RU.md) [toc]{level: [2]} @@ -76,12 +76,17 @@ ## 更新日志 -### [v3.75.4](https://github.com/purocean/yn/releases/tag/v3.75.4) 2024-08-06 +### [v3.76.1](https://github.com/purocean/yn/releases/tag/v3.76.1) 2024-09-06 -[Windows](https://github.com/purocean/yn/releases/download/v3.75.4/Yank-Note-win-x64-3.75.4.exe) | [macOS arm64](https://github.com/purocean/yn/releases/download/v3.75.4/Yank-Note-mac-arm64-3.75.4.dmg) | [macOS x64](https://github.com/purocean/yn/releases/download/v3.75.4/Yank-Note-mac-x64-3.75.4.dmg) | [Linux AppImage](https://github.com/purocean/yn/releases/download/v3.75.4/Yank-Note-linux-x86_64-3.75.4.AppImage) | [Linux deb](https://github.com/purocean/yn/releases/download/v3.75.4/Yank-Note-linux-amd64-3.75.4.deb) +[Windows](https://github.com/purocean/yn/releases/download/v3.76.1/Yank-Note-win-x64-3.76.1.exe) | [macOS arm64](https://github.com/purocean/yn/releases/download/v3.76.1/Yank-Note-mac-arm64-3.76.1.dmg) | [macOS x64](https://github.com/purocean/yn/releases/download/v3.76.1/Yank-Note-mac-x64-3.76.1.dmg) | [Linux AppImage](https://github.com/purocean/yn/releases/download/v3.76.1/Yank-Note-linux-x86_64-3.76.1.AppImage) | [Linux deb](https://github.com/purocean/yn/releases/download/v3.76.1/Yank-Note-linux-amd64-3.76.1.deb) -1. fix: 修复支持的文件类型检测错误 -2. fix: 修复 macOS 上快捷键触发重音键会在编辑器插入额外字符问题 +1. feat: 增加俄语语言支持 +2. feat: 增加使用指引帮助入口 +3. feat: 优化有序列表序号补全 +4. feat: 图片保存目录配置增加 `{docHash}` 占位符 +5. fix: 修复 Windows 上可能出现输入框无法聚焦的问题 +6. fix: 修复某些情况下编辑器只读不正确问题 +7. fix: 修复某些情况下 Mermaid 渲染尺寸计算不正确问题 [更多发布说明](https://github.com/purocean/yn/releases) diff --git a/package.json b/package.json index fd9f30b4..a8871a2c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "yank.note", - "version": "3.75.4", + "version": "3.76.1", "description": "Yank Note: A highly extensible Markdown editor, designed for productivity.", "main": "dist/main/app.js", "license": "AGPL-3.0", diff --git a/scripts/copy-assets.js b/scripts/copy-assets.js index 43d894a8..0ce7015d 100644 --- a/scripts/copy-assets.js +++ b/scripts/copy-assets.js @@ -21,3 +21,8 @@ fs.writeFileSync(path.join(__dirname, '..', './help/README.md'), md) readme = path.join(__dirname, '..', 'README_ZH-CN.md') md = fs.readFileSync(readme).toString('UTF-8').replace(/\]\(\.\/help\//ig, '](./').replace(/src="\.\/help\//ig, 'src="./') fs.writeFileSync(path.join(__dirname, '..', './help/README_ZH-CN.md'), md) + +// copy README_RU.md +readme = path.join(__dirname, '..', 'README_RU.md') +md = fs.readFileSync(readme).toString('UTF-8').replace(/\]\(\.\/help\//ig, '](./').replace(/src="\.\/help\//ig, 'src="./') +fs.writeFileSync(path.join(__dirname, '..', './help/README_RU.md'), md) diff --git a/src/main/app.ts b/src/main/app.ts index 1b4616c3..2a5e0b7f 100644 --- a/src/main/app.ts +++ b/src/main/app.ts @@ -603,6 +603,37 @@ if (!gotTheLock) { app.on('web-contents-created', (_, webContents) => { electronRemote.enable(webContents) + // fix focus issue after dialog show on Windows. + webContents.on('frame-created', (_, { frame }) => { + frame.on('dom-ready', () => { + frame.executeJavaScript(`if ('ctx' in window && ctx?.env?.isWindows) { + window._FIX_ELECTRON_DIALOG_FOCUS ??= function () { + setTimeout(() => { + ctx.env.getElectronRemote().getCurrentWindow().blur(); + ctx.env.getElectronRemote().getCurrentWindow().focus(); + }, 0); + }; + + if (!window._ORIGIN_ALERT) { + window._ORIGIN_ALERT = window.alert; + window.alert = function (...args) { + window._ORIGIN_ALERT(...args); + window._FIX_ELECTRON_DIALOG_FOCUS(); + }; + } + + if (!window._ORIGIN_CONFIRM) { + window._ORIGIN_CONFIRM = window.confirm; + window.confirm = function (...args) { + const res = window._ORIGIN_CONFIRM(...args); + window._FIX_ELECTRON_DIALOG_FOCUS(); + return res; + }; + } + }`) + }) + }) + webContents.setWindowOpenHandler(({ url }) => { if (url.includes('__allow-open-window__')) { return { action: 'allow' } diff --git a/src/main/server/index.ts b/src/main/server/index.ts index dda4fa38..0825e7cd 100644 --- a/src/main/server/index.ts +++ b/src/main/server/index.ts @@ -759,7 +759,7 @@ const server = (port = 3000) => { } }) - const host = config.get('server.host', 'localhost') + const host = config.get('server.host', '127.0.0.1') server.listen(port, host) console.log(`Address: http://${host}:${port}`) diff --git a/src/renderer/components/DefaultEditor.vue b/src/renderer/components/DefaultEditor.vue index 6432cf21..6cfb2de0 100644 --- a/src/renderer/components/DefaultEditor.vue +++ b/src/renderer/components/DefaultEditor.vue @@ -101,17 +101,19 @@ export default defineComponent({ return } + const readOnly = FLAG_READONLY || !current || !current.plain || current.writeable === false + const editor = getEditor() + // change content only if (current && previous && isSameFile(current, previous)) { + editor.updateOptions({ readOnly }) setValue(current.content ?? '\n') } else { getMonacoEditor().createModel(toUri(current), current?.content ?? '\n') } await nextTick() - getEditor().updateOptions({ - readOnly: FLAG_READONLY || !current || !current.plain || current.writeable === false - }) + editor.updateOptions({ readOnly }) if (isDefault()) { await nextTick() diff --git a/src/renderer/components/GetStarted.vue b/src/renderer/components/GetStarted.vue index 6f157215..bb979c0d 100644 --- a/src/renderer/components/GetStarted.vue +++ b/src/renderer/components/GetStarted.vue @@ -31,15 +31,15 @@

{{$t('get-started.help')}}

+ - @@ -78,6 +78,7 @@ import { showPremium, getPurchased } from '@fe/others/premium' import { showSettingPanel } from '@fe/services/setting' import { createDoc, supported, switchDoc } from '@fe/services/document' import { getActionHandler } from '@fe/core/action' +import { GUIDE_URL } from '@share/misc' useI18n() diff --git a/src/renderer/components/Layout.vue b/src/renderer/components/Layout.vue index 333f2608..2c463783 100644 --- a/src/renderer/components/Layout.vue +++ b/src/renderer/components/Layout.vue @@ -16,7 +16,7 @@
-
+
@@ -391,6 +391,12 @@ export default defineComponent({ min-width: 0; box-sizing: border-box; position: relative; + + &.preview-hidden { + visibility: hidden; + width: 0; + flex: none; + } } .footer { diff --git a/src/renderer/components/Setting.vue b/src/renderer/components/Setting.vue index b32c5105..c880e389 100644 --- a/src/renderer/components/Setting.vue +++ b/src/renderer/components/Setting.vue @@ -154,15 +154,16 @@ export default defineComponent({ const onClick = async (e: Event) => { const target = e.target as HTMLInputElement - if (target.name && target.name.endsWith('[path]')) { + if (target.tagName === 'INPUT' && target.name) { const jsonPath = target.name.replace(/\]/g, '').replace(/\[/g, '.') const field = editor.getEditor(jsonPath) - const { canceled, filePaths } = await api.choosePath({ - properties: ['openDirectory', 'createDirectory'], - }) - if (!canceled && filePaths[0]) { - field.setValue(filePaths[0]) + if (field && field.schema.openDialogOptions) { + const { canceled, filePaths } = await api.choosePath(field.schema.openDialogOptions) + + if (!canceled && filePaths[0]) { + field.setValue(filePaths[0]) + } } } } @@ -206,7 +207,7 @@ export default defineComponent({