Merge remote-tracking branch 'origin/dev' into dev
This commit is contained in:
commit
0eb7c5c896
18 changed files with 274 additions and 231 deletions
|
@ -1453,8 +1453,8 @@
|
|||
"124": "الرجاء تمكين المزامنة السحابية في [الإعدادات - تمكين المزامنة السحابية]",
|
||||
"125": "فشل المزامنة التلقائية مرات كثيرة جداً، الرجاء محاولة تشغيل المزامنة يدوياً، إذا كانت المشكلة لا تزال موجودة، يرجى الإبلاغ عنها عبر <a href=\"https://liuyun.io/article/1686530886208\" target=\"_blank\">GitHub Issues</a>",
|
||||
"126": "لا يمكن أن تكون الإشارة المرجعية فارغة",
|
||||
"127": "هناك [%d] أيام متبقية قبل انتهاء الاشتراك، وبعد ذلك سيتم حذف بيانات السحابة بالكامل. يرجى زيارة <a target='_blank' href='${url}'>هنا</a> للتجديد",
|
||||
"128": "انتهت صلاحية الاشتراك. بعد انتهاء الصلاحية، سيتم حذف بيانات السحابة بالكامل. لم يعد التذكير يظهر بعد يومين من انتهاء الاشتراك. يرجى زيارة <a target='_blank' href='${url}'>هنا</a> للتجديد",
|
||||
"127": "تبقى [%d] يومًا حتى انتهاء الاشتراك، وبعد ذلك سيتم حذف بيانات التخزين السحابي الرسمية بالكامل. لتجديد الاشتراك، قم بزيارة <a target='_blank' href='${url}'>هنا</a>",
|
||||
"128": "انتهت صلاحية الاشتراك، سيتم حذف بيانات التخزين السحابي الرسمية بالكامل (بيانات S3/WebDAV السحابية غير متأثرة)، بعد يومين من انتهاء الاشتراك لن يظهر هذا التذكير مرة أخرى. لتجديد الاشتراك، قم بزيارة <a target='_blank' href='${url}'>هنا</a>",
|
||||
"129": "البيانات السحابية تالفة، يرجى إعادة تعيين مستودع البيانات المحلية ومزامنة السحابة لحل المشكلة",
|
||||
"130": "بدأ تثبيت الإصدار الجديد. نظرًا لأن نظام التشغيل سيقوم بإجراء مسح أمني، قد يستغرق بعض الوقت للبدء. الرجاء الانتظار...",
|
||||
"131": "هذه العملية غير مدعومة، يرجى الذهاب إلى وحدة إدارة موفر التخزين السحابي للعمل",
|
||||
|
|
|
@ -1453,8 +1453,8 @@
|
|||
"124": "Bitte aktivieren Sie die Cloud-Synchronisierung in [Einstellungen - Cloud-Synchronisierung aktivieren]",
|
||||
"125": "Automatische Synchronisierung fehlgeschlagen zu viele Male, bitte versuchen Sie manuell die Synchronisierung auszulösen, wenn das Problem weiterhin besteht, melden Sie es bitte über <a href=\"https://liuyun.io/article/1686530886208\" target=\"_blank\">GitHub Issues</a>",
|
||||
"126": "Lesezeichen kann nicht leer sein",
|
||||
"127": "Es sind noch [%d] Tage bis zur Abonnementsablauffrist, danach werden die Cloud-Daten komplett gelöscht. Um zu erneuern, besuchen Sie bitte <a target='_blank' href='${url}'>hier</a>",
|
||||
"128": "Das Abonnement ist abgelaufen. Nach Ablauf des Abonnements werden die Cloud-Daten vollständig gelöscht. Die Erinnerung wird zwei Tage nach Ablauf des Abonnements nicht mehr angezeigt. Um zu erneuern, besuchen Sie bitte <a target='_blank' href='${url}'>hier</a>",
|
||||
"127": "Es verbleiben [%d] Tage bis zum Ablauf des Abonnements, danach werden die offiziellen Cloud-Speicherdaten vollständig gelöscht. Um zu verlängern, besuchen Sie <a target='_blank' href='${url}'>hier</a>",
|
||||
"128": "Das Abonnement ist abgelaufen, die offiziellen Cloud-Speicherdaten werden vollständig gelöscht (S3/WebDAV-Cloud-Speicherdaten sind nicht betroffen), zwei Tage nach Ablauf des Abonnements wird diese Erinnerung nicht mehr angezeigt. Um zu verlängern, besuchen Sie <a target='_blank' href='${url}'>hier</a>",
|
||||
"129": "Cloud-Daten wurden beschädigt, bitte setzen Sie das lokale Daten-Repository und das Cloud-Sync-Verzeichnis zurück, um das Problem zu beheben",
|
||||
"130": "Der Installer der neuen Version wird gestartet. Da das Betriebssystem eine Sicherheitsprüfung durchführen wird, kann es einige Zeit dauern, bis es startet. Bitte warten Sie...",
|
||||
"131": "Dieser Vorgang wird nicht unterstützt, bitte gehen Sie zur Verwaltungsoberfläche des Cloud-Speicherdienstanbieters, um zu operieren",
|
||||
|
|
|
@ -1453,8 +1453,8 @@
|
|||
"124": "Please enable cloud sync in [Settings - Enable Cloud Sync]",
|
||||
"125": "Auto sync failed too many times, please try to manually trigger sync, if there is still a problem, please report it via <a href=\"https://liuyun.io/article/1686530886208\" target=\"_blank\">GitHub Issues</a>",
|
||||
"126": "Bookmark cannot be empty",
|
||||
"127": "There are [%d] days left before the subscription expires, after which the cloud data will be completely deleted. To renew, please visit <a target='_blank' href='${url}'>here</a>",
|
||||
"128": "The subscription has expired. After the expiration, the cloud data will be completely deleted. The reminder will no longer pop up two days after the subscription expires. To renew, please visit <a target='_blank' href='${url}'>here</a>",
|
||||
"127": "There are [%d] days left until the subscription expires, after which the official cloud storage data will be completely deleted. To renew, visit <a target='_blank' href='${url}'>here</a>",
|
||||
"128": "The subscription has expired, the official cloud storage data will be completely deleted (S3/WebDAV cloud storage data is not affected), two days after the subscription expires this reminder will no longer appear. To renew, visit <a target='_blank' href='${url}'>here</a>",
|
||||
"129": "Cloud data has been corrupted, please reset the local data repo and cloud sync dir to resolve the issue",
|
||||
"130": "The new version installer is starting. Since the operating system will perform a security scan, it may take some time to start. Please wait...",
|
||||
"131": "This operation is not supported, please go to the cloud storage provider management console to operate",
|
||||
|
|
|
@ -1453,8 +1453,8 @@
|
|||
"124": "Por favor, active la sincronización en la nube en [Configuración - Activar sincronización en la nube]",
|
||||
"125": "La sincronización automática ha fallado demasiadas veces, por favor intente activar la sincronización manualmente, si todavía hay un problema, por favor infórmelo a través de <a href=\"https://liuyun.io/article/1686530886208\" target=\"_blank\">Problemas GitHub</a>",
|
||||
"126": "El marcador no puede estar vacío",
|
||||
"127": "There are [%d] days left before the subscription expires, after which the cloud data will be completely deleted. Please visit <a target='_blank' href='${url}'>Aquí</a> para la renovación",
|
||||
"128": "La suscripción caducó. Después de la caducidad, los datos de la nube se eliminarán por completo. El recordatorio ya no aparecerá dos días después de que caduque la suscripción. Para renovar, visite <a target='_blank' href='${url}'>aquí</a>",
|
||||
"127": "Quedan [%d] días para que expire la suscripción, después de lo cual los datos de almacenamiento en la nube oficial se eliminarán por completo. Para renovar, visite <a target='_blank' href='${url}'>aquí</a>",
|
||||
"128": "La suscripción ha expirado, los datos de almacenamiento en la nube oficial se eliminarán por completo (los datos de S3/WebDAV no se ven afectados), dos días después de la expiración de la suscripción, este recordatorio ya no aparecerá. Para renovar, visite <a target='_blank' href='${url}'>aquí</a>",
|
||||
"129": "Los datos de la nube se han dañado, reinicie el repositorio de datos local y el directorio de sincronización en la nube para resolver el problema",
|
||||
"130": "El instalador de la nueva versión se está iniciando. Dado que el sistema operativo realizará un análisis de seguridad, es posible que tarde algún tiempo en iniciarse. Espere...",
|
||||
"131": "Esta solicitud no es compatible, vaya a la consola de administración del proveedor de almacenamiento en la nube para operar",
|
||||
|
|
|
@ -1453,8 +1453,8 @@
|
|||
"124": "Veuillez activer la synchronisation cloud dans [Paramètres - Activer la synchronisation cloud]",
|
||||
"125": "Il y a trop d'échecs de téléchargement dans la synchronisation automatique. Veuillez essayer de déclencher manuellement la synchronisation. Si le problème persiste, veuillez le signaler via <a href=\"https://liuyun.io/article/1686530886208\" target=\"_blank\">GitHub Issues</a>",
|
||||
"126": "Les signets ne peuvent pas être vides",
|
||||
"127": "Il reste [%d] jours avant l'expiration de l'abonnement, après quoi les données cloud seront complètement supprimées. Veuillez visiter <a target='_blank' href='${url}'>ici</a> pour le renouvellement",
|
||||
"128": "L'abonnement a expiré. Après l'expiration, les données cloud seront complètement supprimées. Le rappel ne s'affichera plus deux jours après l'expiration de l'abonnement. Pour renouveler, veuillez visiter <a target='_blank' href='${url}'>ici</a>",
|
||||
"127": "Il reste [%d] jours avant l'expiration de l'abonnement, après quoi les données de stockage cloud officielles seront complètement supprimées. Pour renouveler, visitez <a target='_blank' href='${url}'>ici</a>",
|
||||
"128": "L'abonnement a expiré, les données de stockage cloud officielles seront complètement supprimées (les données S3/WebDAV ne sont pas affectées), deux jours après l'expiration de l'abonnement, ce rappel ne s'affichera plus. Pour renouveler, visitez <a target='_blank' href='${url}'>ici</a>",
|
||||
"129": "Les données cloud ont été corrompues, veuillez réinitialiser le dépôt de données local et le répertoire de synchronisation cloud pour résoudre le problème",
|
||||
"130": "Le programme d'installation de la nouvelle version démarre. Étant donné que le système d'exploitation va effectuer une analyse de sécurité, le démarrage peut prendre un certain temps. Veuillez patienter...",
|
||||
"131": "Cette opération n'est pas prise en charge, veuillez vous rendre sur la console de gestion du fournisseur de stockage cloud pour opérer",
|
||||
|
|
|
@ -1453,8 +1453,8 @@
|
|||
"124": "אנא הפעל סנכרון בענן ב[הגדרות - הפעל סנכרון בענן]",
|
||||
"125": "נכשל מהסנכרון אוטומטי פעמים רבות מדי, אנא נסה להפעיל בידנית את הסנכרון, אם יש עדיין בעיה, אנא דווח על כך דרך <a href=\"https://liuyun.io/article/1686530886208\" target=\"_blank\">בעיות GitHub</a>",
|
||||
"126": "סימניה לא יכולה להיות ריקה",
|
||||
"127": "נותרו [%d] ימים עד שפג המנוי, לאחר מכן הנתונים בענן ימחקו לחלוטין. כדי לחדש, אנא בקר ב<a target='_blank' href='${url}'>כאן</a>",
|
||||
"128": "המנוי פג. לאחר התאריכים, הנתונים בענן ימחקו לחלוטין. ההודעה לא תופיע שבועיים אחרי שפג המנוי. כדי לחדש, אנא בקר ב<a target='_blank' href='${url}'>כאן</a>",
|
||||
"127": "נותרו [%d] ימים עד לפקיעת המנוי, לאחר מכן הנתונים באחסון הענן הרשמי יימחקו לחלוטין. לחידוש בקר ב<a target='_blank' href='${url}'>כאן</a>",
|
||||
"128": "המנוי פג, הנתונים באחסון הענן הרשמי יימחקו לחלוטין (נתוני S3/WebDAV אינם מושפעים), יומיים לאחר פקיעת המנוי תזכורת זו לא תופיע יותר. לחידוש בקר ב<a target='_blank' href='${url}'>כאן</a>",
|
||||
"129": "נתוני הענן פגומים, אנא אפס את מאגר הנתונים המקומי ואת תיקיית הסנכרון בענן כדי לפתור את הבעיה",
|
||||
"130": "המתקין של הגרסה החדשה מתחיל. מאחר שהמערכת תבצע סריקת אבטחה, ידרוש זה להמתין קצת לעבודה. אנא המתן...",
|
||||
"131": "פעולה זו אינה נתמכת, אנא פנה ללוח הניהול של ספק שירותי אחסון הענן כדי פעולה",
|
||||
|
|
|
@ -1453,8 +1453,8 @@
|
|||
"124": "Si prega di abilitare la sincronizzazione cloud in [Impostazioni - Abilita sincronizzazione cloud]",
|
||||
"125": "La sincronizzazione automatica è fallita troppe volte, si prega di tentare di attivare manualmente la sincronizzazione; se il problema persiste, si prega di segnalarlo tramite <a href=\"https://liuyun.io/article/1686530886208\" target=\"_blank\">GitHub Issues</a>",
|
||||
"126": "Il segnalibro non può essere vuoto",
|
||||
"127": "Mancano [%d] giorni prima della scadenza dell'abbonamento, dopodiché i dati cloud verranno completamente eliminati. Per rinnovare, si prega di visitare <a target='_blank' href='${url}'>qui</a>",
|
||||
"128": "L'abbonamento è scaduto. Dopo la scadenza, i dati cloud verranno completamente eliminati. Il promemoria non verrà più visualizzato due giorni dopo la scadenza dell'abbonamento. Per rinnovare, si prega di visitare <a target='_blank' href='${url}'>qui</a>",
|
||||
"127": "サブスクリプションの有効期限があと [%d] 日で切れます。有効期限が切れると、公式クラウドストレージのデータは完全に削除されます。更新するには<a target='_blank' href='${url}'>こちら</a>をご覧ください",
|
||||
"128": "サブスクリプションの有効期限が切れました。有効期限が切れると、公式クラウドストレージのデータは完全に削除されます(S3/WebDAV クラウドストレージのデータは影響を受けません)。サブスクリプションの有効期限が切れてから2日後にはこの通知は表示されなくなります。更新するには<a target='_blank' href='${url}'>こちら</a>をご覧ください",
|
||||
"129": "I dati cloud sono stati corrotti, si prega di ripristinare il repository dati locale e la directory di sincronizzazione cloud per risolvere il problema",
|
||||
"130": "L'installatore della nuova versione sta per avviarsi. Poiché il sistema operativo eseguirà una scansione di sicurezza, potrebbe richiedere del tempo per avviarsi. Si prega di attendere...",
|
||||
"131": "Questa operazione non è supportata, si prega di andare al pannello di gestione del fornitore di archiviazione cloud per operare",
|
||||
|
|
|
@ -1453,8 +1453,8 @@
|
|||
"124": "[設定] - [クラウド] からクラウド同期を有効にしてください",
|
||||
"125": "自動同期の失敗回数が多すぎます。手動で同期を試みてください。それでも問題が解決しない場合は <a href=\"https://liuyun.io/article/1686530886208\" target=\"_blank\">GitHub Issues</a> から報告してください",
|
||||
"126": "ブックマークは空にできません",
|
||||
"127": "サブスクリプションの有効期限が切れるまであと [%d] 日です。有効期限が過ぎるとクラウドデータは完全に削除されます。更新するには<a target='_blank' href='${url}'>こちら</a>にアクセスしてください",
|
||||
"128": "サブスクリプションの有効期限が切れました。有効期限が過ぎるとクラウドデータは完全に削除されます。サブスクリプションの有効期限が切れてから 2 日後にはリマインダーが表示されなくなります。更新するには<a target='_blank' href='${url}'>こちら</a>にアクセスしてください",
|
||||
"127": "サブスクリプションの有効期限があと [%d] 日で切れます。有効期限が切れると、公式クラウドストレージのデータは完全に削除されます。更新するには<a target='_blank' href='${url}'>こちら</a>をご覧ください",
|
||||
"128": "サブスクリプションの有効期限が切れました。有効期限が切れると、公式クラウドストレージのデータは完全に削除されます(S3/WebDAV クラウドストレージのデータは影響を受けません)。サブスクリプションの有効期限が切れてから2日後にはこの通知は表示されなくなります。更新するには<a target='_blank' href='${url}'>こちら</a>をご覧ください",
|
||||
"129": "クラウドデータが破損しています。問題を解決するためにローカルデータリポジトリとクラウド同期ディレクトリをリセットしてください",
|
||||
"130": "新しいバージョンのインストーラーを起動しています。オペレーティングシステムがセキュリティスキャンを実行するため起動に時間がかかる場合があります。しばらくお待ちください...",
|
||||
"131": "この操作はサポートされていません。クラウドストレージプロバイダーの管理コンソールから操作してください",
|
||||
|
|
|
@ -1453,8 +1453,8 @@
|
|||
"124": "Proszę włączyć synchronizację chmury w [Ustawienia - Włącz synchronizację w chmurze]",
|
||||
"125": "Auto synchronizacja nie powiodła się zbyt wiele razy, proszę spróbować ręcznie uruchomić synchronizację, jeśli problem nadal występuje, zgłoś to za pomocą <a href=\"https://liuyun.io/article/1686530886208\" target=\"_blank\">GitHub Issues</a>",
|
||||
"126": "Zakładka nie może być pusta",
|
||||
"127": "Zostało [%d] dni przed wygaśnięciem subskrypcji, po czym dane w chmurze zostaną całkowicie usunięte. Aby odnowić, proszę odwiedzić <a target='_blank' href='${url}'>tutaj</a>",
|
||||
"128": "Subskrypcja wygasła. Po wygaśnięciu, dane w chmurze zostaną całkowicie usunięte. Powiadomienie przestanie się pojawiać dwa dni po wygaśnięciu subskrypcji. Aby odnowić, proszę odwiedzić <a target='_blank' href='${url}'>tutaj</a>",
|
||||
"127": "Do wygaśnięcia subskrypcji pozostało [%d] dni, po czym dane w chmurze zostaną całkowicie usunięte. Aby przedłużyć, odwiedź <a target='_blank' href='${url}'>tutaj</a>",
|
||||
"128": "Subskrypcja wygasła, dane w chmurze zostaną całkowicie usunięte (dane S3/WebDAV nie są dotknięte), dwa dni po wygaśnięciu subskrypcji to powiadomienie nie będzie się już pojawiać. Aby przedłużyć, odwiedź <a target='_blank' href='${url}'>tutaj</a>",
|
||||
"129": "Dane w chmurze zostały uszkodzone, proszę zresetować lokalne repozytorium danych i katalog synchronizacji w chmurze, aby rozwiązać problem",
|
||||
"130": "Instalator nowej wersji się uruchamia. Ponieważ system operacyjny wykona skanowanie zabezpieczeń, rozpoczęcie może zająć trochę czasu. Proszę czekać...",
|
||||
"131": "Ta operacja nie jest obsługiwana, proszę przejść do konsoli zarządzania dostawcy przechowywania w chmurze, aby wykonać operację",
|
||||
|
|
|
@ -1453,8 +1453,8 @@
|
|||
"124": "Пожалуйста, включите облачную синхронизацию в [Настройки - Включите облачную синхронизацию]",
|
||||
"125": "Автосинхронизация не удалась слишком много раз, попробуйте вручную запустить синхронизацию, если проблема все еще сохраняется, пожалуйста, сообщите об этом через <a href=\"https://liuyun.io/article/1686530886208\" target=\"_blank\">GitHub Issues</a>",
|
||||
"126": "Закладка не может быть пустой",
|
||||
"127": "Осталось [%d] дней до истечения подписки, после этого облачные данные будут полностью удалены. Чтобы продлить, пожалуйста, посетите <a target='_blank' href='${url}'>здесь</a>",
|
||||
"128": "Подписка истекла. После истечения срока действия облачные данные будут полностью удалены. Напоминание больше не появится через два дня после истечения подписки. Чтобы продлить, пожалуйста, посетите <a target='_blank' href='${url}'>здесь</a>",
|
||||
"127": "До окончания подписки осталось [%d] дней, после чего данные облачного хранилища будут полностью удалены. Для продления посетите <a target='_blank' href='${url}'>здесь</a>",
|
||||
"128": "Подписка истекла, данные облачного хранилища будут полностью удалены (данные S3/WebDAV не затронуты), через два дня после истечения подписки это уведомление больше не будет появляться. Для продления посетите <a target='_blank' href='${url}'>здесь</a>",
|
||||
"129": "Облачные данные были повреждены, пожалуйста, сбросьте локальный репозиторий данных и директорию облачной синхронизации, чтобы решить проблему",
|
||||
"130": "Установщик новой версии запускается. Поскольку операционная система выполнит проверку безопасности, может потребоваться некоторое время для запуска. Пожалуйста, подождите...",
|
||||
"131": "Эта операция не поддерживается, пожалуйста, перейдите в консоль управления поставщика облачного хранилища для выполнения операций",
|
||||
|
|
|
@ -1453,8 +1453,8 @@
|
|||
"124": "請在 [設置 - 啟用雲端同步] 中開啟雲端同步",
|
||||
"125": "自動同步失敗次數過多,請嘗試手動觸發同步,如果還有問題請<a href=\"https://ld246.com/article/1649901726096\" target=\"_blank\">反饋</a>",
|
||||
"126": "書籤不能為空",
|
||||
"127": "訂閱距過期還剩 [%d] 天,過期後雲端資料會被徹底刪除。續訂請訪問<a target='_blank' href='${url}'>這裡</a>",
|
||||
"128": "訂閱已經過期,過期後雲端資料會被徹底刪除,訂閱過期兩天后不再彈出該提醒,續訂請訪問<a target='_blank' href='${url}'>這裡</a>",
|
||||
"127": "訂閱距過期還剩 [%d] 天,過期後官方雲端存儲數據會被徹底刪除。續訂請訪問<a target='_blank' href='${url}'>這裡</a>",
|
||||
"128": "訂閱已經過期,過期後官方雲端存儲數據會被徹底刪除(S3/WebDAV 雲端存儲數據不受影響),訂閱過期兩天後不再彈出該提醒,續訂請訪問<a target='_blank' href='${url}'>這裡</a>",
|
||||
"129": "雲端資料已經損壞,請參考<a href=\"https://ld246.com/article/1683395267749\" target=\"_blank\">這裡</a>解決該問題",
|
||||
"130": "正在啟動新版本安裝程式,由於作業系統會進行安全掃描,因此啟動可能需要一些時間,請稍等...",
|
||||
"131": "不支持該操作,請到雲端存儲提供商管理控制台進行操作",
|
||||
|
|
|
@ -1453,8 +1453,8 @@
|
|||
"124": "请在 [设置 - 启用云端同步] 中开启云端同步",
|
||||
"125": "自动同步失败次数过多,请尝试手动触发同步,如果还有问题请<a href=\"https://ld246.com/article/1649901726096\" target=\"_blank\">反馈</a>",
|
||||
"126": "书签不能为空",
|
||||
"127": "订阅距过期还剩 [%d] 天,过期后云端数据会被彻底删除。续订请访问<a target='_blank' href='${url}'>这里</a>",
|
||||
"128": "订阅已经过期,过期后云端数据会被彻底删除,订阅过期两天后不再弹出该提醒,续订请访问<a target='_blank' href='${url}'>这里</a>",
|
||||
"127": "订阅距过期还剩 [%d] 天,过期后官方云端存储数据会被彻底删除。续订请访问<a target='_blank' href='${url}'>这里</a>",
|
||||
"128": "订阅已经过期,过期后官方云端存储数据会被彻底删除(S3/WebDAV 云端存储数据不受影响),订阅过期两天后不再弹出该提醒,续订请访问<a target='_blank' href='${url}'>这里</a>",
|
||||
"129": "云端数据已经损坏,请参考<a href=\"https://ld246.com/article/1683395267749\" target=\"_blank\">这里</a>解决该问题",
|
||||
"130": "正在启动新版本安装程序,由于操作系统会进行安全扫描,所以启动可能需要一些时间,请稍等...",
|
||||
"131": "不支持该操作,请到云端存储提供商管理控制台进行操作",
|
||||
|
|
|
@ -395,6 +395,10 @@ export const paste = async (protyle: IProtyle, event: (ClipboardEvent | DragEven
|
|||
const range = getEditorRange(protyle.wysiwyg.element);
|
||||
if (nodeElement.getAttribute("data-type") === "NodeCodeBlock" ||
|
||||
protyle.toolbar.getCurrentType(range).includes("code")) {
|
||||
// https://github.com/siyuan-note/siyuan/issues/13552
|
||||
textPlain = textPlain.replace(/\u200D```/g, "```");
|
||||
textPlain = textPlain.replace(/```/g, "\u200D```");
|
||||
|
||||
insertHTML(textPlain, protyle);
|
||||
return;
|
||||
} else if (siyuanHTML) {
|
||||
|
@ -434,6 +438,10 @@ export const paste = async (protyle: IProtyle, event: (ClipboardEvent | DragEven
|
|||
// 复制 HTML 块粘贴出来的不是 HTML 块 https://github.com/siyuan-note/siyuan/issues/12994
|
||||
tempInnerHTML = Lute.UnEscapeHTMLStr(tempInnerHTML);
|
||||
}
|
||||
|
||||
// https://github.com/siyuan-note/siyuan/issues/13552
|
||||
tempInnerHTML = tempInnerHTML.replace(/\u200D```/g, "```");
|
||||
|
||||
insertHTML(tempInnerHTML, protyle, isBlock, false, true);
|
||||
}
|
||||
filterClipboardHint(protyle, protyle.lute.BlockDOM2StdMd(tempInnerHTML));
|
||||
|
@ -531,6 +539,10 @@ export const paste = async (protyle: IProtyle, event: (ClipboardEvent | DragEven
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
// https://github.com/siyuan-note/siyuan/issues/13552
|
||||
textPlain = textPlain.replace(/\u200D```/g, "```");
|
||||
|
||||
const textPlainDom = protyle.lute.Md2BlockDOM(textPlain);
|
||||
insertHTML(textPlainDom, protyle, false, false, true);
|
||||
filterClipboardHint(protyle, textPlain);
|
||||
|
|
125
kernel/av/av.go
125
kernel/av/av.go
|
@ -23,7 +23,6 @@ import (
|
|||
"path/filepath"
|
||||
"sort"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/88250/gulu"
|
||||
"github.com/88250/lute/ast"
|
||||
|
@ -366,129 +365,7 @@ func SaveAttributeView(av *AttributeView) (err error) {
|
|||
}
|
||||
|
||||
// 做一些数据兼容和订正处理
|
||||
now := util.CurrentTimeMillis()
|
||||
for _, kv := range av.KeyValues {
|
||||
switch kv.Key.Type {
|
||||
case KeyTypeBlock:
|
||||
// 补全 block 的创建时间和更新时间
|
||||
for _, v := range kv.Values {
|
||||
if 0 == v.Block.Created {
|
||||
logging.LogWarnf("block [%s] created time is empty", v.BlockID)
|
||||
if "" == v.Block.ID {
|
||||
v.Block.ID = v.BlockID
|
||||
if "" == v.Block.ID {
|
||||
v.Block.ID = ast.NewNodeID()
|
||||
v.BlockID = v.Block.ID
|
||||
}
|
||||
}
|
||||
|
||||
createdStr := v.Block.ID[:len("20060102150405")]
|
||||
created, parseErr := time.ParseInLocation("20060102150405", createdStr, time.Local)
|
||||
if nil == parseErr {
|
||||
v.Block.Created = created.UnixMilli()
|
||||
} else {
|
||||
v.Block.Created = now
|
||||
}
|
||||
}
|
||||
if 0 == v.Block.Updated {
|
||||
logging.LogWarnf("block [%s] updated time is empty", v.BlockID)
|
||||
v.Block.Updated = v.Block.Created
|
||||
}
|
||||
}
|
||||
case KeyTypeNumber:
|
||||
for _, v := range kv.Values {
|
||||
if nil != v.Number && 0 != v.Number.Content && !v.Number.IsNotEmpty {
|
||||
v.Number.IsNotEmpty = true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for _, v := range kv.Values {
|
||||
if "" == kv.Key.ID {
|
||||
kv.Key.ID = ast.NewNodeID()
|
||||
for _, val := range kv.Values {
|
||||
val.KeyID = kv.Key.ID
|
||||
}
|
||||
if "" == v.KeyID {
|
||||
logging.LogWarnf("value [%s] key id is empty", v.ID)
|
||||
v.KeyID = kv.Key.ID
|
||||
}
|
||||
|
||||
// 校验日期 IsNotEmpty
|
||||
if KeyTypeDate == kv.Key.Type {
|
||||
if nil != v.Date && 0 != v.Date.Content && !v.Date.IsNotEmpty {
|
||||
v.Date.IsNotEmpty = true
|
||||
}
|
||||
}
|
||||
|
||||
// 校验数字 IsNotEmpty
|
||||
if KeyTypeNumber == kv.Key.Type {
|
||||
if nil != v.Number && 0 != v.Number.Content && !v.Number.IsNotEmpty {
|
||||
v.Number.IsNotEmpty = true
|
||||
}
|
||||
}
|
||||
|
||||
// 清空关联实际值
|
||||
if KeyTypeRelation == kv.Key.Type {
|
||||
v.Relation.Contents = nil
|
||||
}
|
||||
|
||||
// 清空汇总实际值
|
||||
if KeyTypeRollup == kv.Key.Type {
|
||||
v.Rollup.Contents = nil
|
||||
}
|
||||
|
||||
for _, view := range av.Views {
|
||||
switch view.LayoutType {
|
||||
case LayoutTypeTable:
|
||||
for _, column := range view.Table.Columns {
|
||||
if "" == column.ID {
|
||||
column.ID = kv.Key.ID
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 补全值的创建时间和更新时间
|
||||
if "" == v.ID {
|
||||
logging.LogWarnf("value id is empty")
|
||||
v.ID = ast.NewNodeID()
|
||||
}
|
||||
|
||||
if 0 == v.CreatedAt {
|
||||
logging.LogWarnf("value [%s] created time is empty", v.ID)
|
||||
createdStr := v.ID[:len("20060102150405")]
|
||||
created, parseErr := time.ParseInLocation("20060102150405", createdStr, time.Local)
|
||||
if nil == parseErr {
|
||||
v.CreatedAt = created.UnixMilli()
|
||||
} else {
|
||||
v.CreatedAt = now
|
||||
}
|
||||
}
|
||||
|
||||
if 0 == v.UpdatedAt {
|
||||
logging.LogWarnf("value [%s] updated time is empty", v.ID)
|
||||
v.UpdatedAt = v.CreatedAt
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 补全过滤器 Value
|
||||
for _, view := range av.Views {
|
||||
if nil != view.Table {
|
||||
for _, f := range view.Table.Filters {
|
||||
if nil != f.Value {
|
||||
continue
|
||||
}
|
||||
|
||||
if k, _ := av.GetKey(f.Column); nil != k {
|
||||
f.Value = &Value{Type: k.Type}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
UpgradeSpec(av)
|
||||
|
||||
// 值去重
|
||||
blockValues := av.GetBlockKeyValues()
|
||||
|
|
160
kernel/av/av_fix.go
Normal file
160
kernel/av/av_fix.go
Normal file
|
@ -0,0 +1,160 @@
|
|||
// SiYuan - Refactor your thinking
|
||||
// Copyright (c) 2020-present, b3log.org
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package av
|
||||
|
||||
import (
|
||||
"github.com/88250/lute/ast"
|
||||
"github.com/siyuan-note/logging"
|
||||
"github.com/siyuan-note/siyuan/kernel/util"
|
||||
"time"
|
||||
)
|
||||
|
||||
func UpgradeSpec(av *AttributeView) {
|
||||
upgradeSpec1(av)
|
||||
}
|
||||
|
||||
func upgradeSpec1(av *AttributeView) {
|
||||
if 1 <= av.Spec {
|
||||
return
|
||||
}
|
||||
|
||||
now := util.CurrentTimeMillis()
|
||||
for _, kv := range av.KeyValues {
|
||||
switch kv.Key.Type {
|
||||
case KeyTypeBlock:
|
||||
// 补全 block 的创建时间和更新时间
|
||||
for _, v := range kv.Values {
|
||||
if 0 == v.Block.Created {
|
||||
logging.LogWarnf("block [%s] created time is empty", v.BlockID)
|
||||
if "" == v.Block.ID {
|
||||
v.Block.ID = v.BlockID
|
||||
if "" == v.Block.ID {
|
||||
v.Block.ID = ast.NewNodeID()
|
||||
v.BlockID = v.Block.ID
|
||||
}
|
||||
}
|
||||
|
||||
createdStr := v.Block.ID[:len("20060102150405")]
|
||||
created, parseErr := time.ParseInLocation("20060102150405", createdStr, time.Local)
|
||||
if nil == parseErr {
|
||||
v.Block.Created = created.UnixMilli()
|
||||
} else {
|
||||
v.Block.Created = now
|
||||
}
|
||||
}
|
||||
if 0 == v.Block.Updated {
|
||||
logging.LogWarnf("block [%s] updated time is empty", v.BlockID)
|
||||
v.Block.Updated = v.Block.Created
|
||||
}
|
||||
}
|
||||
case KeyTypeNumber:
|
||||
for _, v := range kv.Values {
|
||||
if nil != v.Number && 0 != v.Number.Content && !v.Number.IsNotEmpty {
|
||||
v.Number.IsNotEmpty = true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for _, v := range kv.Values {
|
||||
if "" == kv.Key.ID {
|
||||
kv.Key.ID = ast.NewNodeID()
|
||||
for _, val := range kv.Values {
|
||||
val.KeyID = kv.Key.ID
|
||||
}
|
||||
if "" == v.KeyID {
|
||||
logging.LogWarnf("value [%s] key id is empty", v.ID)
|
||||
v.KeyID = kv.Key.ID
|
||||
}
|
||||
|
||||
// 校验日期 IsNotEmpty
|
||||
if KeyTypeDate == kv.Key.Type {
|
||||
if nil != v.Date && 0 != v.Date.Content && !v.Date.IsNotEmpty {
|
||||
v.Date.IsNotEmpty = true
|
||||
}
|
||||
}
|
||||
|
||||
// 校验数字 IsNotEmpty
|
||||
if KeyTypeNumber == kv.Key.Type {
|
||||
if nil != v.Number && 0 != v.Number.Content && !v.Number.IsNotEmpty {
|
||||
v.Number.IsNotEmpty = true
|
||||
}
|
||||
}
|
||||
|
||||
// 清空关联实际值
|
||||
if KeyTypeRelation == kv.Key.Type {
|
||||
v.Relation.Contents = nil
|
||||
}
|
||||
|
||||
// 清空汇总实际值
|
||||
if KeyTypeRollup == kv.Key.Type {
|
||||
v.Rollup.Contents = nil
|
||||
}
|
||||
|
||||
for _, view := range av.Views {
|
||||
switch view.LayoutType {
|
||||
case LayoutTypeTable:
|
||||
for _, column := range view.Table.Columns {
|
||||
if "" == column.ID {
|
||||
column.ID = kv.Key.ID
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 补全值的创建时间和更新时间
|
||||
if "" == v.ID {
|
||||
logging.LogWarnf("value id is empty")
|
||||
v.ID = ast.NewNodeID()
|
||||
}
|
||||
|
||||
if 0 == v.CreatedAt {
|
||||
logging.LogWarnf("value [%s] created time is empty", v.ID)
|
||||
createdStr := v.ID[:len("20060102150405")]
|
||||
created, parseErr := time.ParseInLocation("20060102150405", createdStr, time.Local)
|
||||
if nil == parseErr {
|
||||
v.CreatedAt = created.UnixMilli()
|
||||
} else {
|
||||
v.CreatedAt = now
|
||||
}
|
||||
}
|
||||
|
||||
if 0 == v.UpdatedAt {
|
||||
logging.LogWarnf("value [%s] updated time is empty", v.ID)
|
||||
v.UpdatedAt = v.CreatedAt
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 补全过滤器 Value
|
||||
for _, view := range av.Views {
|
||||
if nil != view.Table {
|
||||
for _, f := range view.Table.Filters {
|
||||
if nil != f.Value {
|
||||
continue
|
||||
}
|
||||
|
||||
if k, _ := av.GetKey(f.Column); nil != k {
|
||||
f.Value = &Value{Type: k.Type}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
av.Spec = 1
|
||||
}
|
|
@ -875,82 +875,7 @@ func renderAttributeView(attrView *av.AttributeView, viewID, query string, page,
|
|||
}
|
||||
|
||||
// 做一些数据兼容和订正处理,保存的时候也会做 av.SaveAttributeView()
|
||||
currentTimeMillis := util.CurrentTimeMillis()
|
||||
for _, kv := range attrView.KeyValues {
|
||||
switch kv.Key.Type {
|
||||
case av.KeyTypeBlock: // 补全 block 的创建时间和更新时间
|
||||
for _, v := range kv.Values {
|
||||
if 0 == v.Block.Created {
|
||||
if "" == v.Block.ID {
|
||||
v.Block.ID = v.BlockID
|
||||
if "" == v.Block.ID {
|
||||
v.Block.ID = ast.NewNodeID()
|
||||
v.BlockID = v.Block.ID
|
||||
}
|
||||
}
|
||||
|
||||
createdStr := v.Block.ID[:len("20060102150405")]
|
||||
created, parseErr := time.ParseInLocation("20060102150405", createdStr, time.Local)
|
||||
if nil == parseErr {
|
||||
v.Block.Created = created.UnixMilli()
|
||||
} else {
|
||||
v.Block.Created = currentTimeMillis
|
||||
}
|
||||
}
|
||||
if 0 == v.Block.Updated {
|
||||
v.Block.Updated = v.Block.Created
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for _, v := range kv.Values {
|
||||
// 校验日期 IsNotEmpty
|
||||
if av.KeyTypeDate == kv.Key.Type {
|
||||
if nil != v.Date && 0 != v.Date.Content && !v.Date.IsNotEmpty {
|
||||
v.Date.IsNotEmpty = true
|
||||
}
|
||||
}
|
||||
|
||||
// 校验数字 IsNotEmpty
|
||||
if av.KeyTypeNumber == kv.Key.Type {
|
||||
if nil != v.Number && 0 != v.Number.Content && !v.Number.IsNotEmpty {
|
||||
v.Number.IsNotEmpty = true
|
||||
}
|
||||
}
|
||||
|
||||
// 补全值的创建时间和更新时间
|
||||
if "" == v.ID {
|
||||
v.ID = ast.NewNodeID()
|
||||
}
|
||||
|
||||
if 0 == v.CreatedAt {
|
||||
createdStr := v.ID[:len("20060102150405")]
|
||||
created, parseErr := time.ParseInLocation("20060102150405", createdStr, time.Local)
|
||||
if nil == parseErr {
|
||||
v.CreatedAt = created.UnixMilli()
|
||||
} else {
|
||||
v.CreatedAt = currentTimeMillis
|
||||
}
|
||||
}
|
||||
|
||||
if 0 == v.UpdatedAt {
|
||||
v.UpdatedAt = v.CreatedAt
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 补全过滤器 Value
|
||||
if nil != view.Table {
|
||||
for _, f := range view.Table.Filters {
|
||||
if nil != f.Value {
|
||||
continue
|
||||
}
|
||||
|
||||
if k, _ := attrView.GetKey(f.Column); nil != k {
|
||||
f.Value = &av.Value{Type: k.Type}
|
||||
}
|
||||
}
|
||||
}
|
||||
upgradeAttributeViewSpec(attrView)
|
||||
|
||||
switch view.LayoutType {
|
||||
case av.LayoutTypeTable:
|
||||
|
|
74
kernel/model/attribute_view_fix.go
Normal file
74
kernel/model/attribute_view_fix.go
Normal file
|
@ -0,0 +1,74 @@
|
|||
// SiYuan - Refactor your thinking
|
||||
// Copyright (c) 2020-present, b3log.org
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package model
|
||||
|
||||
import (
|
||||
"github.com/88250/gulu"
|
||||
"github.com/siyuan-note/siyuan/kernel/av"
|
||||
"github.com/siyuan-note/siyuan/kernel/filesys"
|
||||
"github.com/siyuan-note/siyuan/kernel/treenode"
|
||||
)
|
||||
|
||||
func upgradeAttributeViewSpec(attrView *av.AttributeView) {
|
||||
currentSpec := attrView.Spec
|
||||
|
||||
upgradeAttributeViewSpec1(attrView)
|
||||
av.UpgradeSpec(attrView)
|
||||
|
||||
newSpec := attrView.Spec
|
||||
if currentSpec != newSpec {
|
||||
av.SaveAttributeView(attrView)
|
||||
}
|
||||
}
|
||||
|
||||
func upgradeAttributeViewSpec1(attrView *av.AttributeView) {
|
||||
if 1 <= attrView.Spec {
|
||||
return
|
||||
}
|
||||
|
||||
var blockIDs []string
|
||||
idBlocks := map[string]*av.Value{}
|
||||
for _, kv := range attrView.KeyValues {
|
||||
switch kv.Key.Type {
|
||||
case av.KeyTypeBlock:
|
||||
for _, v := range kv.Values {
|
||||
if !v.IsDetached {
|
||||
blockIDs = append(blockIDs, v.BlockID)
|
||||
idBlocks[v.BlockID] = v
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
blockIDs = gulu.Str.RemoveDuplicatedElem(blockIDs)
|
||||
|
||||
trees := filesys.LoadTrees(blockIDs)
|
||||
for _, id := range blockIDs {
|
||||
tree := trees[id]
|
||||
if nil == tree {
|
||||
continue
|
||||
}
|
||||
|
||||
node := treenode.GetNodeInTree(tree, id)
|
||||
if nil == node {
|
||||
continue
|
||||
}
|
||||
|
||||
if block := idBlocks[id].Block; nil != block {
|
||||
block.Icon = node.IALAttr("icon")
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1473,11 +1473,6 @@ func ExportNotebookMarkdown(boxID string) (zipPath string) {
|
|||
docFiles := box.ListFiles("/")
|
||||
var docPaths []string
|
||||
for _, docFile := range docFiles {
|
||||
id := strings.TrimSuffix(path.Base(docFile.path), ".sy")
|
||||
if !ast.IsNodeIDPattern(id) {
|
||||
continue
|
||||
}
|
||||
|
||||
docPaths = append(docPaths, docFile.path)
|
||||
}
|
||||
|
||||
|
@ -3108,11 +3103,11 @@ func prepareExportTrees(docPaths []string) (defBlockIDs []string, trees *map[str
|
|||
treeCache := &map[string]*parse.Tree{}
|
||||
defBlockIDs = []string{}
|
||||
for _, p := range docPaths {
|
||||
if strings.HasSuffix(p, ".sy") {
|
||||
id := strings.TrimSuffix(path.Base(p), ".sy")
|
||||
if !ast.IsNodeIDPattern(id) {
|
||||
continue
|
||||
}
|
||||
|
||||
id := util.GetTreeID(p)
|
||||
tree, err := loadTreeWithCache(id, treeCache)
|
||||
if err != nil {
|
||||
continue
|
||||
|
|
Loading…
Add table
Reference in a new issue