1
0
mirror of https://github.com/laurent22/joplin.git synced 2025-12-17 23:27:48 +02:00

Compare commits

..

6 Commits

Author SHA1 Message Date
Laurent Cozic
f7917d42c3 test 2021-01-19 22:51:47 +00:00
Laurent Cozic
db785f7aee update 2021-01-19 22:38:42 +00:00
Laurent Cozic
4ed9bd1bc6 update 2021-01-19 18:10:54 +00:00
Laurent Cozic
fcec52122f Merge branch 'dev' into plugin_repo_update 2021-01-19 17:12:29 +00:00
Laurent Cozic
0e5a31b9d4 update 2021-01-19 16:47:08 +00:00
Laurent Cozic
aafd30f92f updaet 2021-01-19 16:02:11 +00:00
505 changed files with 3935 additions and 20845 deletions

View File

@@ -7,7 +7,6 @@ _releases/
Assets/ Assets/
docs/ docs/
packages/plugins/**/dist packages/plugins/**/dist
packages/plugins/**/api
packages/server/dist/ packages/server/dist/
highlight.pack.js highlight.pack.js
Modules/TinyMCE/IconPack/postinstall.js Modules/TinyMCE/IconPack/postinstall.js
@@ -103,9 +102,6 @@ packages/app-cli/tests/Synchronizer.tags.js.map
packages/app-cli/tests/fsDriver.d.ts packages/app-cli/tests/fsDriver.d.ts
packages/app-cli/tests/fsDriver.js packages/app-cli/tests/fsDriver.js
packages/app-cli/tests/fsDriver.js.map packages/app-cli/tests/fsDriver.js.map
packages/app-cli/tests/htmlUtils.d.ts
packages/app-cli/tests/htmlUtils.js
packages/app-cli/tests/htmlUtils.js.map
packages/app-cli/tests/models_Folder.d.ts packages/app-cli/tests/models_Folder.d.ts
packages/app-cli/tests/models_Folder.js packages/app-cli/tests/models_Folder.js
packages/app-cli/tests/models_Folder.js.map packages/app-cli/tests/models_Folder.js.map
@@ -148,6 +144,144 @@ packages/app-cli/tests/services_keychainService.js.map
packages/app-cli/tests/services_rest_Api.d.ts packages/app-cli/tests/services_rest_Api.d.ts
packages/app-cli/tests/services_rest_Api.js packages/app-cli/tests/services_rest_Api.js
packages/app-cli/tests/services_rest_Api.js.map packages/app-cli/tests/services_rest_Api.js.map
packages/app-cli/tests/support/plugins/codemirror_content_script/api/index.d.ts
packages/app-cli/tests/support/plugins/codemirror_content_script/api/index.js
packages/app-cli/tests/support/plugins/codemirror_content_script/api/index.js.map
packages/app-cli/tests/support/plugins/codemirror_content_script/api/types.d.ts
packages/app-cli/tests/support/plugins/codemirror_content_script/api/types.js
packages/app-cli/tests/support/plugins/codemirror_content_script/api/types.js.map
packages/app-cli/tests/support/plugins/codemirror_content_script/src/index.d.ts
packages/app-cli/tests/support/plugins/codemirror_content_script/src/index.js
packages/app-cli/tests/support/plugins/codemirror_content_script/src/index.js.map
packages/app-cli/tests/support/plugins/content_script/api/index.d.ts
packages/app-cli/tests/support/plugins/content_script/api/index.js
packages/app-cli/tests/support/plugins/content_script/api/index.js.map
packages/app-cli/tests/support/plugins/content_script/api/types.d.ts
packages/app-cli/tests/support/plugins/content_script/api/types.js
packages/app-cli/tests/support/plugins/content_script/api/types.js.map
packages/app-cli/tests/support/plugins/content_script/src/index.d.ts
packages/app-cli/tests/support/plugins/content_script/src/index.js
packages/app-cli/tests/support/plugins/content_script/src/index.js.map
packages/app-cli/tests/support/plugins/content_script/src/markdownItTestPlugin.d.ts
packages/app-cli/tests/support/plugins/content_script/src/markdownItTestPlugin.js
packages/app-cli/tests/support/plugins/content_script/src/markdownItTestPlugin.js.map
packages/app-cli/tests/support/plugins/dialog/api/index.d.ts
packages/app-cli/tests/support/plugins/dialog/api/index.js
packages/app-cli/tests/support/plugins/dialog/api/index.js.map
packages/app-cli/tests/support/plugins/dialog/api/types.d.ts
packages/app-cli/tests/support/plugins/dialog/api/types.js
packages/app-cli/tests/support/plugins/dialog/api/types.js.map
packages/app-cli/tests/support/plugins/dialog/src/index.d.ts
packages/app-cli/tests/support/plugins/dialog/src/index.js
packages/app-cli/tests/support/plugins/dialog/src/index.js.map
packages/app-cli/tests/support/plugins/editor_context_menu/api/index.d.ts
packages/app-cli/tests/support/plugins/editor_context_menu/api/index.js
packages/app-cli/tests/support/plugins/editor_context_menu/api/index.js.map
packages/app-cli/tests/support/plugins/editor_context_menu/api/types.d.ts
packages/app-cli/tests/support/plugins/editor_context_menu/api/types.js
packages/app-cli/tests/support/plugins/editor_context_menu/api/types.js.map
packages/app-cli/tests/support/plugins/editor_context_menu/src/index.d.ts
packages/app-cli/tests/support/plugins/editor_context_menu/src/index.js
packages/app-cli/tests/support/plugins/editor_context_menu/src/index.js.map
packages/app-cli/tests/support/plugins/events/api/index.d.ts
packages/app-cli/tests/support/plugins/events/api/index.js
packages/app-cli/tests/support/plugins/events/api/index.js.map
packages/app-cli/tests/support/plugins/events/api/types.d.ts
packages/app-cli/tests/support/plugins/events/api/types.js
packages/app-cli/tests/support/plugins/events/api/types.js.map
packages/app-cli/tests/support/plugins/events/src/index.d.ts
packages/app-cli/tests/support/plugins/events/src/index.js
packages/app-cli/tests/support/plugins/events/src/index.js.map
packages/app-cli/tests/support/plugins/jpl_test/api/index.d.ts
packages/app-cli/tests/support/plugins/jpl_test/api/index.js
packages/app-cli/tests/support/plugins/jpl_test/api/index.js.map
packages/app-cli/tests/support/plugins/jpl_test/api/types.d.ts
packages/app-cli/tests/support/plugins/jpl_test/api/types.js
packages/app-cli/tests/support/plugins/jpl_test/api/types.js.map
packages/app-cli/tests/support/plugins/jpl_test/src/index.d.ts
packages/app-cli/tests/support/plugins/jpl_test/src/index.js
packages/app-cli/tests/support/plugins/jpl_test/src/index.js.map
packages/app-cli/tests/support/plugins/json_export/api/index.d.ts
packages/app-cli/tests/support/plugins/json_export/api/index.js
packages/app-cli/tests/support/plugins/json_export/api/index.js.map
packages/app-cli/tests/support/plugins/json_export/api/types.d.ts
packages/app-cli/tests/support/plugins/json_export/api/types.js
packages/app-cli/tests/support/plugins/json_export/api/types.js.map
packages/app-cli/tests/support/plugins/json_export/src/index.d.ts
packages/app-cli/tests/support/plugins/json_export/src/index.js
packages/app-cli/tests/support/plugins/json_export/src/index.js.map
packages/app-cli/tests/support/plugins/menu/api/index.d.ts
packages/app-cli/tests/support/plugins/menu/api/index.js
packages/app-cli/tests/support/plugins/menu/api/index.js.map
packages/app-cli/tests/support/plugins/menu/api/types.d.ts
packages/app-cli/tests/support/plugins/menu/api/types.js
packages/app-cli/tests/support/plugins/menu/api/types.js.map
packages/app-cli/tests/support/plugins/menu/src/index.d.ts
packages/app-cli/tests/support/plugins/menu/src/index.js
packages/app-cli/tests/support/plugins/menu/src/index.js.map
packages/app-cli/tests/support/plugins/multi_selection/api/index.d.ts
packages/app-cli/tests/support/plugins/multi_selection/api/index.js
packages/app-cli/tests/support/plugins/multi_selection/api/index.js.map
packages/app-cli/tests/support/plugins/multi_selection/api/types.d.ts
packages/app-cli/tests/support/plugins/multi_selection/api/types.js
packages/app-cli/tests/support/plugins/multi_selection/api/types.js.map
packages/app-cli/tests/support/plugins/multi_selection/src/index.d.ts
packages/app-cli/tests/support/plugins/multi_selection/src/index.js
packages/app-cli/tests/support/plugins/multi_selection/src/index.js.map
packages/app-cli/tests/support/plugins/post_messages/api/index.d.ts
packages/app-cli/tests/support/plugins/post_messages/api/index.js
packages/app-cli/tests/support/plugins/post_messages/api/index.js.map
packages/app-cli/tests/support/plugins/post_messages/api/types.d.ts
packages/app-cli/tests/support/plugins/post_messages/api/types.js
packages/app-cli/tests/support/plugins/post_messages/api/types.js.map
packages/app-cli/tests/support/plugins/post_messages/src/index.d.ts
packages/app-cli/tests/support/plugins/post_messages/src/index.js
packages/app-cli/tests/support/plugins/post_messages/src/index.js.map
packages/app-cli/tests/support/plugins/register_command/api/index.d.ts
packages/app-cli/tests/support/plugins/register_command/api/index.js
packages/app-cli/tests/support/plugins/register_command/api/index.js.map
packages/app-cli/tests/support/plugins/register_command/api/types.d.ts
packages/app-cli/tests/support/plugins/register_command/api/types.js
packages/app-cli/tests/support/plugins/register_command/api/types.js.map
packages/app-cli/tests/support/plugins/register_command/src/index.d.ts
packages/app-cli/tests/support/plugins/register_command/src/index.js
packages/app-cli/tests/support/plugins/register_command/src/index.js.map
packages/app-cli/tests/support/plugins/selected_text/api/index.d.ts
packages/app-cli/tests/support/plugins/selected_text/api/index.js
packages/app-cli/tests/support/plugins/selected_text/api/index.js.map
packages/app-cli/tests/support/plugins/selected_text/api/types.d.ts
packages/app-cli/tests/support/plugins/selected_text/api/types.js
packages/app-cli/tests/support/plugins/selected_text/api/types.js.map
packages/app-cli/tests/support/plugins/selected_text/src/index.d.ts
packages/app-cli/tests/support/plugins/selected_text/src/index.js
packages/app-cli/tests/support/plugins/selected_text/src/index.js.map
packages/app-cli/tests/support/plugins/settings/api/index.d.ts
packages/app-cli/tests/support/plugins/settings/api/index.js
packages/app-cli/tests/support/plugins/settings/api/index.js.map
packages/app-cli/tests/support/plugins/settings/api/types.d.ts
packages/app-cli/tests/support/plugins/settings/api/types.js
packages/app-cli/tests/support/plugins/settings/api/types.js.map
packages/app-cli/tests/support/plugins/settings/src/index.d.ts
packages/app-cli/tests/support/plugins/settings/src/index.js
packages/app-cli/tests/support/plugins/settings/src/index.js.map
packages/app-cli/tests/support/plugins/toc/api/index.d.ts
packages/app-cli/tests/support/plugins/toc/api/index.js
packages/app-cli/tests/support/plugins/toc/api/index.js.map
packages/app-cli/tests/support/plugins/toc/api/types.d.ts
packages/app-cli/tests/support/plugins/toc/api/types.js
packages/app-cli/tests/support/plugins/toc/api/types.js.map
packages/app-cli/tests/support/plugins/toc/src/index.d.ts
packages/app-cli/tests/support/plugins/toc/src/index.js
packages/app-cli/tests/support/plugins/toc/src/index.js.map
packages/app-cli/tests/support/plugins/withExternalModules/api/index.d.ts
packages/app-cli/tests/support/plugins/withExternalModules/api/index.js
packages/app-cli/tests/support/plugins/withExternalModules/api/index.js.map
packages/app-cli/tests/support/plugins/withExternalModules/api/types.d.ts
packages/app-cli/tests/support/plugins/withExternalModules/api/types.js
packages/app-cli/tests/support/plugins/withExternalModules/api/types.js.map
packages/app-cli/tests/support/plugins/withExternalModules/src/index.d.ts
packages/app-cli/tests/support/plugins/withExternalModules/src/index.js
packages/app-cli/tests/support/plugins/withExternalModules/src/index.js.map
packages/app-cli/tests/synchronizer_LockHandler.d.ts packages/app-cli/tests/synchronizer_LockHandler.d.ts
packages/app-cli/tests/synchronizer_LockHandler.js packages/app-cli/tests/synchronizer_LockHandler.js
packages/app-cli/tests/synchronizer_LockHandler.js.map packages/app-cli/tests/synchronizer_LockHandler.js.map
@@ -667,9 +801,6 @@ packages/app-desktop/services/plugins/hooks/useWebviewToPluginMessages.js.map
packages/app-desktop/services/spellChecker/SpellCheckerServiceDriverNative.d.ts packages/app-desktop/services/spellChecker/SpellCheckerServiceDriverNative.d.ts
packages/app-desktop/services/spellChecker/SpellCheckerServiceDriverNative.js packages/app-desktop/services/spellChecker/SpellCheckerServiceDriverNative.js
packages/app-desktop/services/spellChecker/SpellCheckerServiceDriverNative.js.map packages/app-desktop/services/spellChecker/SpellCheckerServiceDriverNative.js.map
packages/app-desktop/utils/markupLanguageUtils.d.ts
packages/app-desktop/utils/markupLanguageUtils.js
packages/app-desktop/utils/markupLanguageUtils.js.map
packages/app-mobile/PluginAssetsLoader.d.ts packages/app-mobile/PluginAssetsLoader.d.ts
packages/app-mobile/PluginAssetsLoader.js packages/app-mobile/PluginAssetsLoader.js
packages/app-mobile/PluginAssetsLoader.js.map packages/app-mobile/PluginAssetsLoader.js.map
@@ -718,9 +849,6 @@ packages/app-mobile/utils/ShareExtension.js.map
packages/app-mobile/utils/checkPermissions.d.ts packages/app-mobile/utils/checkPermissions.d.ts
packages/app-mobile/utils/checkPermissions.js packages/app-mobile/utils/checkPermissions.js
packages/app-mobile/utils/checkPermissions.js.map packages/app-mobile/utils/checkPermissions.js.map
packages/app-mobile/utils/fs-driver-rn.d.ts
packages/app-mobile/utils/fs-driver-rn.js
packages/app-mobile/utils/fs-driver-rn.js.map
packages/app-mobile/utils/shareHandler.d.ts packages/app-mobile/utils/shareHandler.d.ts
packages/app-mobile/utils/shareHandler.js packages/app-mobile/utils/shareHandler.js
packages/app-mobile/utils/shareHandler.js.map packages/app-mobile/utils/shareHandler.js.map
@@ -805,9 +933,6 @@ packages/lib/PoorManIntervals.js.map
packages/lib/SyncTargetJoplinServer.d.ts packages/lib/SyncTargetJoplinServer.d.ts
packages/lib/SyncTargetJoplinServer.js packages/lib/SyncTargetJoplinServer.js
packages/lib/SyncTargetJoplinServer.js.map packages/lib/SyncTargetJoplinServer.js.map
packages/lib/SyncTargetOneDrive.d.ts
packages/lib/SyncTargetOneDrive.js
packages/lib/SyncTargetOneDrive.js.map
packages/lib/Synchronizer.d.ts packages/lib/Synchronizer.d.ts
packages/lib/Synchronizer.js packages/lib/Synchronizer.js
packages/lib/Synchronizer.js.map packages/lib/Synchronizer.js.map
@@ -838,9 +963,6 @@ packages/lib/fs-driver-base.js.map
packages/lib/fs-driver-node.d.ts packages/lib/fs-driver-node.d.ts
packages/lib/fs-driver-node.js packages/lib/fs-driver-node.js
packages/lib/fs-driver-node.js.map packages/lib/fs-driver-node.js.map
packages/lib/htmlUtils.d.ts
packages/lib/htmlUtils.js
packages/lib/htmlUtils.js.map
packages/lib/import-enex-md-gen.d.ts packages/lib/import-enex-md-gen.d.ts
packages/lib/import-enex-md-gen.js packages/lib/import-enex-md-gen.js
packages/lib/import-enex-md-gen.js.map packages/lib/import-enex-md-gen.js.map
@@ -856,51 +978,12 @@ packages/lib/markupLanguageUtils.js.map
packages/lib/models/Alarm.d.ts packages/lib/models/Alarm.d.ts
packages/lib/models/Alarm.js packages/lib/models/Alarm.js
packages/lib/models/Alarm.js.map packages/lib/models/Alarm.js.map
packages/lib/models/BaseItem.d.ts
packages/lib/models/BaseItem.js
packages/lib/models/BaseItem.js.map
packages/lib/models/Folder.d.ts
packages/lib/models/Folder.js
packages/lib/models/Folder.js.map
packages/lib/models/ItemChange.d.ts
packages/lib/models/ItemChange.js
packages/lib/models/ItemChange.js.map
packages/lib/models/MasterKey.d.ts
packages/lib/models/MasterKey.js
packages/lib/models/MasterKey.js.map
packages/lib/models/Migration.d.ts
packages/lib/models/Migration.js
packages/lib/models/Migration.js.map
packages/lib/models/Note.d.ts
packages/lib/models/Note.js
packages/lib/models/Note.js.map
packages/lib/models/NoteResource.d.ts packages/lib/models/NoteResource.d.ts
packages/lib/models/NoteResource.js packages/lib/models/NoteResource.js
packages/lib/models/NoteResource.js.map packages/lib/models/NoteResource.js.map
packages/lib/models/NoteTag.d.ts
packages/lib/models/NoteTag.js
packages/lib/models/NoteTag.js.map
packages/lib/models/Resource.d.ts
packages/lib/models/Resource.js
packages/lib/models/Resource.js.map
packages/lib/models/ResourceLocalState.d.ts
packages/lib/models/ResourceLocalState.js
packages/lib/models/ResourceLocalState.js.map
packages/lib/models/Revision.d.ts
packages/lib/models/Revision.js
packages/lib/models/Revision.js.map
packages/lib/models/Search.d.ts
packages/lib/models/Search.js
packages/lib/models/Search.js.map
packages/lib/models/Setting.d.ts packages/lib/models/Setting.d.ts
packages/lib/models/Setting.js packages/lib/models/Setting.js
packages/lib/models/Setting.js.map packages/lib/models/Setting.js.map
packages/lib/models/SmartFilter.d.ts
packages/lib/models/SmartFilter.js
packages/lib/models/SmartFilter.js.map
packages/lib/models/Tag.d.ts
packages/lib/models/Tag.js
packages/lib/models/Tag.js.map
packages/lib/models/utils/paginatedFeed.d.ts packages/lib/models/utils/paginatedFeed.d.ts
packages/lib/models/utils/paginatedFeed.js packages/lib/models/utils/paginatedFeed.js
packages/lib/models/utils/paginatedFeed.js.map packages/lib/models/utils/paginatedFeed.js.map
@@ -913,9 +996,6 @@ packages/lib/models/utils/types.js.map
packages/lib/ntpDate.d.ts packages/lib/ntpDate.d.ts
packages/lib/ntpDate.js packages/lib/ntpDate.js
packages/lib/ntpDate.js.map packages/lib/ntpDate.js.map
packages/lib/onedrive-api.d.ts
packages/lib/onedrive-api.js
packages/lib/onedrive-api.js.map
packages/lib/path-utils.d.ts packages/lib/path-utils.d.ts
packages/lib/path-utils.js packages/lib/path-utils.js
packages/lib/path-utils.js.map packages/lib/path-utils.js.map
@@ -934,18 +1014,9 @@ packages/lib/services/BaseService.js.map
packages/lib/services/CommandService.d.ts packages/lib/services/CommandService.d.ts
packages/lib/services/CommandService.js packages/lib/services/CommandService.js
packages/lib/services/CommandService.js.map packages/lib/services/CommandService.js.map
packages/lib/services/DecryptionWorker.d.ts
packages/lib/services/DecryptionWorker.js
packages/lib/services/DecryptionWorker.js.map
packages/lib/services/EncryptionService.d.ts
packages/lib/services/EncryptionService.js
packages/lib/services/EncryptionService.js.map
packages/lib/services/ExternalEditWatcher.d.ts packages/lib/services/ExternalEditWatcher.d.ts
packages/lib/services/ExternalEditWatcher.js packages/lib/services/ExternalEditWatcher.js
packages/lib/services/ExternalEditWatcher.js.map packages/lib/services/ExternalEditWatcher.js.map
packages/lib/services/ItemChangeUtils.d.ts
packages/lib/services/ItemChangeUtils.js
packages/lib/services/ItemChangeUtils.js.map
packages/lib/services/KeymapService.d.ts packages/lib/services/KeymapService.d.ts
packages/lib/services/KeymapService.js packages/lib/services/KeymapService.js
packages/lib/services/KeymapService.js.map packages/lib/services/KeymapService.js.map
@@ -958,33 +1029,18 @@ packages/lib/services/KeymapService_keysRegExp.js.map
packages/lib/services/KvStore.d.ts packages/lib/services/KvStore.d.ts
packages/lib/services/KvStore.js packages/lib/services/KvStore.js
packages/lib/services/KvStore.js.map packages/lib/services/KvStore.js.map
packages/lib/services/MigrationService.d.ts
packages/lib/services/MigrationService.js
packages/lib/services/MigrationService.js.map
packages/lib/services/NavService.d.ts
packages/lib/services/NavService.js
packages/lib/services/NavService.js.map
packages/lib/services/PostMessageService.d.ts packages/lib/services/PostMessageService.d.ts
packages/lib/services/PostMessageService.js packages/lib/services/PostMessageService.js
packages/lib/services/PostMessageService.js.map packages/lib/services/PostMessageService.js.map
packages/lib/services/ReportService.d.ts
packages/lib/services/ReportService.js
packages/lib/services/ReportService.js.map
packages/lib/services/ResourceEditWatcher/index.d.ts packages/lib/services/ResourceEditWatcher/index.d.ts
packages/lib/services/ResourceEditWatcher/index.js packages/lib/services/ResourceEditWatcher/index.js
packages/lib/services/ResourceEditWatcher/index.js.map packages/lib/services/ResourceEditWatcher/index.js.map
packages/lib/services/ResourceEditWatcher/reducer.d.ts packages/lib/services/ResourceEditWatcher/reducer.d.ts
packages/lib/services/ResourceEditWatcher/reducer.js packages/lib/services/ResourceEditWatcher/reducer.js
packages/lib/services/ResourceEditWatcher/reducer.js.map packages/lib/services/ResourceEditWatcher/reducer.js.map
packages/lib/services/ResourceFetcher.d.ts
packages/lib/services/ResourceFetcher.js
packages/lib/services/ResourceFetcher.js.map
packages/lib/services/ResourceService.d.ts packages/lib/services/ResourceService.d.ts
packages/lib/services/ResourceService.js packages/lib/services/ResourceService.js
packages/lib/services/ResourceService.js.map packages/lib/services/ResourceService.js.map
packages/lib/services/RevisionService.d.ts
packages/lib/services/RevisionService.js
packages/lib/services/RevisionService.js.map
packages/lib/services/SettingUtils.d.ts packages/lib/services/SettingUtils.d.ts
packages/lib/services/SettingUtils.js packages/lib/services/SettingUtils.js
packages/lib/services/SettingUtils.js.map packages/lib/services/SettingUtils.js.map
@@ -1246,12 +1302,6 @@ packages/lib/services/rest/utils/requestFields.js.map
packages/lib/services/rest/utils/requestPaginationOptions.d.ts packages/lib/services/rest/utils/requestPaginationOptions.d.ts
packages/lib/services/rest/utils/requestPaginationOptions.js packages/lib/services/rest/utils/requestPaginationOptions.js
packages/lib/services/rest/utils/requestPaginationOptions.js.map packages/lib/services/rest/utils/requestPaginationOptions.js.map
packages/lib/services/searchengine/SearchEngine.d.ts
packages/lib/services/searchengine/SearchEngine.js
packages/lib/services/searchengine/SearchEngine.js.map
packages/lib/services/searchengine/SearchEngineUtils.d.ts
packages/lib/services/searchengine/SearchEngineUtils.js
packages/lib/services/searchengine/SearchEngineUtils.js.map
packages/lib/services/searchengine/filterParser.d.ts packages/lib/services/searchengine/filterParser.d.ts
packages/lib/services/searchengine/filterParser.js packages/lib/services/searchengine/filterParser.js
packages/lib/services/searchengine/filterParser.js.map packages/lib/services/searchengine/filterParser.js.map
@@ -1324,33 +1374,12 @@ packages/lib/uuid.js.map
packages/lib/versionInfo.d.ts packages/lib/versionInfo.d.ts
packages/lib/versionInfo.js packages/lib/versionInfo.js
packages/lib/versionInfo.js.map packages/lib/versionInfo.js.map
packages/plugin-repo-cli/dummy.test.d.ts
packages/plugin-repo-cli/dummy.test.js
packages/plugin-repo-cli/dummy.test.js.map
packages/plugin-repo-cli/index.d.ts packages/plugin-repo-cli/index.d.ts
packages/plugin-repo-cli/index.js packages/plugin-repo-cli/index.js
packages/plugin-repo-cli/index.js.map packages/plugin-repo-cli/index.js.map
packages/plugin-repo-cli/lib/checkIfPluginCanBeAdded.d.ts
packages/plugin-repo-cli/lib/checkIfPluginCanBeAdded.js
packages/plugin-repo-cli/lib/checkIfPluginCanBeAdded.js.map
packages/plugin-repo-cli/lib/checkIfPluginCanBeAdded.test.d.ts
packages/plugin-repo-cli/lib/checkIfPluginCanBeAdded.test.js
packages/plugin-repo-cli/lib/checkIfPluginCanBeAdded.test.js.map
packages/plugin-repo-cli/lib/errorsHaveChanged.d.ts
packages/plugin-repo-cli/lib/errorsHaveChanged.js
packages/plugin-repo-cli/lib/errorsHaveChanged.js.map
packages/plugin-repo-cli/lib/errorsHaveChanged.test.d.ts
packages/plugin-repo-cli/lib/errorsHaveChanged.test.js
packages/plugin-repo-cli/lib/errorsHaveChanged.test.js.map
packages/plugin-repo-cli/lib/gitCompareUrl.d.ts
packages/plugin-repo-cli/lib/gitCompareUrl.js
packages/plugin-repo-cli/lib/gitCompareUrl.js.map
packages/plugin-repo-cli/lib/gitCompareUrl.test.d.ts
packages/plugin-repo-cli/lib/gitCompareUrl.test.js
packages/plugin-repo-cli/lib/gitCompareUrl.test.js.map
packages/plugin-repo-cli/lib/types.d.ts
packages/plugin-repo-cli/lib/types.js
packages/plugin-repo-cli/lib/types.js.map
packages/plugin-repo-cli/lib/updateReadme.d.ts
packages/plugin-repo-cli/lib/updateReadme.js
packages/plugin-repo-cli/lib/updateReadme.js.map
packages/plugins/ToggleSidebars/api/index.d.ts packages/plugins/ToggleSidebars/api/index.d.ts
packages/plugins/ToggleSidebars/api/index.js packages/plugins/ToggleSidebars/api/index.js
packages/plugins/ToggleSidebars/api/index.js.map packages/plugins/ToggleSidebars/api/index.js.map
@@ -1654,12 +1683,6 @@ packages/server/src/utils/uuidgen.js.map
packages/tools/lerna-add.d.ts packages/tools/lerna-add.d.ts
packages/tools/lerna-add.js packages/tools/lerna-add.js
packages/tools/lerna-add.js.map packages/tools/lerna-add.js.map
packages/tools/release-cli.d.ts
packages/tools/release-cli.js
packages/tools/release-cli.js.map
packages/tools/release-electron.d.ts
packages/tools/release-electron.js
packages/tools/release-electron.js.map
packages/tools/release-server.d.ts packages/tools/release-server.d.ts
packages/tools/release-server.js packages/tools/release-server.js
packages/tools/release-server.js.map packages/tools/release-server.js.map

View File

@@ -125,7 +125,6 @@ module.exports = {
'space-before-blocks': 'error', 'space-before-blocks': 'error',
'spaced-comment': ['error', 'always'], 'spaced-comment': ['error', 'always'],
'keyword-spacing': ['error', { 'before': true, 'after': true }], 'keyword-spacing': ['error', { 'before': true, 'after': true }],
'no-multi-spaces': ['error'],
}, },
'plugins': [ 'plugins': [
'react', 'react',

1
.github/stale.yml vendored
View File

@@ -9,7 +9,6 @@ exemptLabels:
- "upstream" - "upstream"
- "backlog" - "backlog"
- "high" - "high"
- "medium"
- "spec" - "spec"
# Label to use when marking an issue as stale # Label to use when marking an issue as stale
staleLabel: stale staleLabel: stale

258
.gitignore vendored
View File

@@ -90,9 +90,6 @@ packages/app-cli/tests/Synchronizer.tags.js.map
packages/app-cli/tests/fsDriver.d.ts packages/app-cli/tests/fsDriver.d.ts
packages/app-cli/tests/fsDriver.js packages/app-cli/tests/fsDriver.js
packages/app-cli/tests/fsDriver.js.map packages/app-cli/tests/fsDriver.js.map
packages/app-cli/tests/htmlUtils.d.ts
packages/app-cli/tests/htmlUtils.js
packages/app-cli/tests/htmlUtils.js.map
packages/app-cli/tests/models_Folder.d.ts packages/app-cli/tests/models_Folder.d.ts
packages/app-cli/tests/models_Folder.js packages/app-cli/tests/models_Folder.js
packages/app-cli/tests/models_Folder.js.map packages/app-cli/tests/models_Folder.js.map
@@ -135,6 +132,144 @@ packages/app-cli/tests/services_keychainService.js.map
packages/app-cli/tests/services_rest_Api.d.ts packages/app-cli/tests/services_rest_Api.d.ts
packages/app-cli/tests/services_rest_Api.js packages/app-cli/tests/services_rest_Api.js
packages/app-cli/tests/services_rest_Api.js.map packages/app-cli/tests/services_rest_Api.js.map
packages/app-cli/tests/support/plugins/codemirror_content_script/api/index.d.ts
packages/app-cli/tests/support/plugins/codemirror_content_script/api/index.js
packages/app-cli/tests/support/plugins/codemirror_content_script/api/index.js.map
packages/app-cli/tests/support/plugins/codemirror_content_script/api/types.d.ts
packages/app-cli/tests/support/plugins/codemirror_content_script/api/types.js
packages/app-cli/tests/support/plugins/codemirror_content_script/api/types.js.map
packages/app-cli/tests/support/plugins/codemirror_content_script/src/index.d.ts
packages/app-cli/tests/support/plugins/codemirror_content_script/src/index.js
packages/app-cli/tests/support/plugins/codemirror_content_script/src/index.js.map
packages/app-cli/tests/support/plugins/content_script/api/index.d.ts
packages/app-cli/tests/support/plugins/content_script/api/index.js
packages/app-cli/tests/support/plugins/content_script/api/index.js.map
packages/app-cli/tests/support/plugins/content_script/api/types.d.ts
packages/app-cli/tests/support/plugins/content_script/api/types.js
packages/app-cli/tests/support/plugins/content_script/api/types.js.map
packages/app-cli/tests/support/plugins/content_script/src/index.d.ts
packages/app-cli/tests/support/plugins/content_script/src/index.js
packages/app-cli/tests/support/plugins/content_script/src/index.js.map
packages/app-cli/tests/support/plugins/content_script/src/markdownItTestPlugin.d.ts
packages/app-cli/tests/support/plugins/content_script/src/markdownItTestPlugin.js
packages/app-cli/tests/support/plugins/content_script/src/markdownItTestPlugin.js.map
packages/app-cli/tests/support/plugins/dialog/api/index.d.ts
packages/app-cli/tests/support/plugins/dialog/api/index.js
packages/app-cli/tests/support/plugins/dialog/api/index.js.map
packages/app-cli/tests/support/plugins/dialog/api/types.d.ts
packages/app-cli/tests/support/plugins/dialog/api/types.js
packages/app-cli/tests/support/plugins/dialog/api/types.js.map
packages/app-cli/tests/support/plugins/dialog/src/index.d.ts
packages/app-cli/tests/support/plugins/dialog/src/index.js
packages/app-cli/tests/support/plugins/dialog/src/index.js.map
packages/app-cli/tests/support/plugins/editor_context_menu/api/index.d.ts
packages/app-cli/tests/support/plugins/editor_context_menu/api/index.js
packages/app-cli/tests/support/plugins/editor_context_menu/api/index.js.map
packages/app-cli/tests/support/plugins/editor_context_menu/api/types.d.ts
packages/app-cli/tests/support/plugins/editor_context_menu/api/types.js
packages/app-cli/tests/support/plugins/editor_context_menu/api/types.js.map
packages/app-cli/tests/support/plugins/editor_context_menu/src/index.d.ts
packages/app-cli/tests/support/plugins/editor_context_menu/src/index.js
packages/app-cli/tests/support/plugins/editor_context_menu/src/index.js.map
packages/app-cli/tests/support/plugins/events/api/index.d.ts
packages/app-cli/tests/support/plugins/events/api/index.js
packages/app-cli/tests/support/plugins/events/api/index.js.map
packages/app-cli/tests/support/plugins/events/api/types.d.ts
packages/app-cli/tests/support/plugins/events/api/types.js
packages/app-cli/tests/support/plugins/events/api/types.js.map
packages/app-cli/tests/support/plugins/events/src/index.d.ts
packages/app-cli/tests/support/plugins/events/src/index.js
packages/app-cli/tests/support/plugins/events/src/index.js.map
packages/app-cli/tests/support/plugins/jpl_test/api/index.d.ts
packages/app-cli/tests/support/plugins/jpl_test/api/index.js
packages/app-cli/tests/support/plugins/jpl_test/api/index.js.map
packages/app-cli/tests/support/plugins/jpl_test/api/types.d.ts
packages/app-cli/tests/support/plugins/jpl_test/api/types.js
packages/app-cli/tests/support/plugins/jpl_test/api/types.js.map
packages/app-cli/tests/support/plugins/jpl_test/src/index.d.ts
packages/app-cli/tests/support/plugins/jpl_test/src/index.js
packages/app-cli/tests/support/plugins/jpl_test/src/index.js.map
packages/app-cli/tests/support/plugins/json_export/api/index.d.ts
packages/app-cli/tests/support/plugins/json_export/api/index.js
packages/app-cli/tests/support/plugins/json_export/api/index.js.map
packages/app-cli/tests/support/plugins/json_export/api/types.d.ts
packages/app-cli/tests/support/plugins/json_export/api/types.js
packages/app-cli/tests/support/plugins/json_export/api/types.js.map
packages/app-cli/tests/support/plugins/json_export/src/index.d.ts
packages/app-cli/tests/support/plugins/json_export/src/index.js
packages/app-cli/tests/support/plugins/json_export/src/index.js.map
packages/app-cli/tests/support/plugins/menu/api/index.d.ts
packages/app-cli/tests/support/plugins/menu/api/index.js
packages/app-cli/tests/support/plugins/menu/api/index.js.map
packages/app-cli/tests/support/plugins/menu/api/types.d.ts
packages/app-cli/tests/support/plugins/menu/api/types.js
packages/app-cli/tests/support/plugins/menu/api/types.js.map
packages/app-cli/tests/support/plugins/menu/src/index.d.ts
packages/app-cli/tests/support/plugins/menu/src/index.js
packages/app-cli/tests/support/plugins/menu/src/index.js.map
packages/app-cli/tests/support/plugins/multi_selection/api/index.d.ts
packages/app-cli/tests/support/plugins/multi_selection/api/index.js
packages/app-cli/tests/support/plugins/multi_selection/api/index.js.map
packages/app-cli/tests/support/plugins/multi_selection/api/types.d.ts
packages/app-cli/tests/support/plugins/multi_selection/api/types.js
packages/app-cli/tests/support/plugins/multi_selection/api/types.js.map
packages/app-cli/tests/support/plugins/multi_selection/src/index.d.ts
packages/app-cli/tests/support/plugins/multi_selection/src/index.js
packages/app-cli/tests/support/plugins/multi_selection/src/index.js.map
packages/app-cli/tests/support/plugins/post_messages/api/index.d.ts
packages/app-cli/tests/support/plugins/post_messages/api/index.js
packages/app-cli/tests/support/plugins/post_messages/api/index.js.map
packages/app-cli/tests/support/plugins/post_messages/api/types.d.ts
packages/app-cli/tests/support/plugins/post_messages/api/types.js
packages/app-cli/tests/support/plugins/post_messages/api/types.js.map
packages/app-cli/tests/support/plugins/post_messages/src/index.d.ts
packages/app-cli/tests/support/plugins/post_messages/src/index.js
packages/app-cli/tests/support/plugins/post_messages/src/index.js.map
packages/app-cli/tests/support/plugins/register_command/api/index.d.ts
packages/app-cli/tests/support/plugins/register_command/api/index.js
packages/app-cli/tests/support/plugins/register_command/api/index.js.map
packages/app-cli/tests/support/plugins/register_command/api/types.d.ts
packages/app-cli/tests/support/plugins/register_command/api/types.js
packages/app-cli/tests/support/plugins/register_command/api/types.js.map
packages/app-cli/tests/support/plugins/register_command/src/index.d.ts
packages/app-cli/tests/support/plugins/register_command/src/index.js
packages/app-cli/tests/support/plugins/register_command/src/index.js.map
packages/app-cli/tests/support/plugins/selected_text/api/index.d.ts
packages/app-cli/tests/support/plugins/selected_text/api/index.js
packages/app-cli/tests/support/plugins/selected_text/api/index.js.map
packages/app-cli/tests/support/plugins/selected_text/api/types.d.ts
packages/app-cli/tests/support/plugins/selected_text/api/types.js
packages/app-cli/tests/support/plugins/selected_text/api/types.js.map
packages/app-cli/tests/support/plugins/selected_text/src/index.d.ts
packages/app-cli/tests/support/plugins/selected_text/src/index.js
packages/app-cli/tests/support/plugins/selected_text/src/index.js.map
packages/app-cli/tests/support/plugins/settings/api/index.d.ts
packages/app-cli/tests/support/plugins/settings/api/index.js
packages/app-cli/tests/support/plugins/settings/api/index.js.map
packages/app-cli/tests/support/plugins/settings/api/types.d.ts
packages/app-cli/tests/support/plugins/settings/api/types.js
packages/app-cli/tests/support/plugins/settings/api/types.js.map
packages/app-cli/tests/support/plugins/settings/src/index.d.ts
packages/app-cli/tests/support/plugins/settings/src/index.js
packages/app-cli/tests/support/plugins/settings/src/index.js.map
packages/app-cli/tests/support/plugins/toc/api/index.d.ts
packages/app-cli/tests/support/plugins/toc/api/index.js
packages/app-cli/tests/support/plugins/toc/api/index.js.map
packages/app-cli/tests/support/plugins/toc/api/types.d.ts
packages/app-cli/tests/support/plugins/toc/api/types.js
packages/app-cli/tests/support/plugins/toc/api/types.js.map
packages/app-cli/tests/support/plugins/toc/src/index.d.ts
packages/app-cli/tests/support/plugins/toc/src/index.js
packages/app-cli/tests/support/plugins/toc/src/index.js.map
packages/app-cli/tests/support/plugins/withExternalModules/api/index.d.ts
packages/app-cli/tests/support/plugins/withExternalModules/api/index.js
packages/app-cli/tests/support/plugins/withExternalModules/api/index.js.map
packages/app-cli/tests/support/plugins/withExternalModules/api/types.d.ts
packages/app-cli/tests/support/plugins/withExternalModules/api/types.js
packages/app-cli/tests/support/plugins/withExternalModules/api/types.js.map
packages/app-cli/tests/support/plugins/withExternalModules/src/index.d.ts
packages/app-cli/tests/support/plugins/withExternalModules/src/index.js
packages/app-cli/tests/support/plugins/withExternalModules/src/index.js.map
packages/app-cli/tests/synchronizer_LockHandler.d.ts packages/app-cli/tests/synchronizer_LockHandler.d.ts
packages/app-cli/tests/synchronizer_LockHandler.js packages/app-cli/tests/synchronizer_LockHandler.js
packages/app-cli/tests/synchronizer_LockHandler.js.map packages/app-cli/tests/synchronizer_LockHandler.js.map
@@ -654,9 +789,6 @@ packages/app-desktop/services/plugins/hooks/useWebviewToPluginMessages.js.map
packages/app-desktop/services/spellChecker/SpellCheckerServiceDriverNative.d.ts packages/app-desktop/services/spellChecker/SpellCheckerServiceDriverNative.d.ts
packages/app-desktop/services/spellChecker/SpellCheckerServiceDriverNative.js packages/app-desktop/services/spellChecker/SpellCheckerServiceDriverNative.js
packages/app-desktop/services/spellChecker/SpellCheckerServiceDriverNative.js.map packages/app-desktop/services/spellChecker/SpellCheckerServiceDriverNative.js.map
packages/app-desktop/utils/markupLanguageUtils.d.ts
packages/app-desktop/utils/markupLanguageUtils.js
packages/app-desktop/utils/markupLanguageUtils.js.map
packages/app-mobile/PluginAssetsLoader.d.ts packages/app-mobile/PluginAssetsLoader.d.ts
packages/app-mobile/PluginAssetsLoader.js packages/app-mobile/PluginAssetsLoader.js
packages/app-mobile/PluginAssetsLoader.js.map packages/app-mobile/PluginAssetsLoader.js.map
@@ -705,9 +837,6 @@ packages/app-mobile/utils/ShareExtension.js.map
packages/app-mobile/utils/checkPermissions.d.ts packages/app-mobile/utils/checkPermissions.d.ts
packages/app-mobile/utils/checkPermissions.js packages/app-mobile/utils/checkPermissions.js
packages/app-mobile/utils/checkPermissions.js.map packages/app-mobile/utils/checkPermissions.js.map
packages/app-mobile/utils/fs-driver-rn.d.ts
packages/app-mobile/utils/fs-driver-rn.js
packages/app-mobile/utils/fs-driver-rn.js.map
packages/app-mobile/utils/shareHandler.d.ts packages/app-mobile/utils/shareHandler.d.ts
packages/app-mobile/utils/shareHandler.js packages/app-mobile/utils/shareHandler.js
packages/app-mobile/utils/shareHandler.js.map packages/app-mobile/utils/shareHandler.js.map
@@ -792,9 +921,6 @@ packages/lib/PoorManIntervals.js.map
packages/lib/SyncTargetJoplinServer.d.ts packages/lib/SyncTargetJoplinServer.d.ts
packages/lib/SyncTargetJoplinServer.js packages/lib/SyncTargetJoplinServer.js
packages/lib/SyncTargetJoplinServer.js.map packages/lib/SyncTargetJoplinServer.js.map
packages/lib/SyncTargetOneDrive.d.ts
packages/lib/SyncTargetOneDrive.js
packages/lib/SyncTargetOneDrive.js.map
packages/lib/Synchronizer.d.ts packages/lib/Synchronizer.d.ts
packages/lib/Synchronizer.js packages/lib/Synchronizer.js
packages/lib/Synchronizer.js.map packages/lib/Synchronizer.js.map
@@ -825,9 +951,6 @@ packages/lib/fs-driver-base.js.map
packages/lib/fs-driver-node.d.ts packages/lib/fs-driver-node.d.ts
packages/lib/fs-driver-node.js packages/lib/fs-driver-node.js
packages/lib/fs-driver-node.js.map packages/lib/fs-driver-node.js.map
packages/lib/htmlUtils.d.ts
packages/lib/htmlUtils.js
packages/lib/htmlUtils.js.map
packages/lib/import-enex-md-gen.d.ts packages/lib/import-enex-md-gen.d.ts
packages/lib/import-enex-md-gen.js packages/lib/import-enex-md-gen.js
packages/lib/import-enex-md-gen.js.map packages/lib/import-enex-md-gen.js.map
@@ -843,51 +966,12 @@ packages/lib/markupLanguageUtils.js.map
packages/lib/models/Alarm.d.ts packages/lib/models/Alarm.d.ts
packages/lib/models/Alarm.js packages/lib/models/Alarm.js
packages/lib/models/Alarm.js.map packages/lib/models/Alarm.js.map
packages/lib/models/BaseItem.d.ts
packages/lib/models/BaseItem.js
packages/lib/models/BaseItem.js.map
packages/lib/models/Folder.d.ts
packages/lib/models/Folder.js
packages/lib/models/Folder.js.map
packages/lib/models/ItemChange.d.ts
packages/lib/models/ItemChange.js
packages/lib/models/ItemChange.js.map
packages/lib/models/MasterKey.d.ts
packages/lib/models/MasterKey.js
packages/lib/models/MasterKey.js.map
packages/lib/models/Migration.d.ts
packages/lib/models/Migration.js
packages/lib/models/Migration.js.map
packages/lib/models/Note.d.ts
packages/lib/models/Note.js
packages/lib/models/Note.js.map
packages/lib/models/NoteResource.d.ts packages/lib/models/NoteResource.d.ts
packages/lib/models/NoteResource.js packages/lib/models/NoteResource.js
packages/lib/models/NoteResource.js.map packages/lib/models/NoteResource.js.map
packages/lib/models/NoteTag.d.ts
packages/lib/models/NoteTag.js
packages/lib/models/NoteTag.js.map
packages/lib/models/Resource.d.ts
packages/lib/models/Resource.js
packages/lib/models/Resource.js.map
packages/lib/models/ResourceLocalState.d.ts
packages/lib/models/ResourceLocalState.js
packages/lib/models/ResourceLocalState.js.map
packages/lib/models/Revision.d.ts
packages/lib/models/Revision.js
packages/lib/models/Revision.js.map
packages/lib/models/Search.d.ts
packages/lib/models/Search.js
packages/lib/models/Search.js.map
packages/lib/models/Setting.d.ts packages/lib/models/Setting.d.ts
packages/lib/models/Setting.js packages/lib/models/Setting.js
packages/lib/models/Setting.js.map packages/lib/models/Setting.js.map
packages/lib/models/SmartFilter.d.ts
packages/lib/models/SmartFilter.js
packages/lib/models/SmartFilter.js.map
packages/lib/models/Tag.d.ts
packages/lib/models/Tag.js
packages/lib/models/Tag.js.map
packages/lib/models/utils/paginatedFeed.d.ts packages/lib/models/utils/paginatedFeed.d.ts
packages/lib/models/utils/paginatedFeed.js packages/lib/models/utils/paginatedFeed.js
packages/lib/models/utils/paginatedFeed.js.map packages/lib/models/utils/paginatedFeed.js.map
@@ -900,9 +984,6 @@ packages/lib/models/utils/types.js.map
packages/lib/ntpDate.d.ts packages/lib/ntpDate.d.ts
packages/lib/ntpDate.js packages/lib/ntpDate.js
packages/lib/ntpDate.js.map packages/lib/ntpDate.js.map
packages/lib/onedrive-api.d.ts
packages/lib/onedrive-api.js
packages/lib/onedrive-api.js.map
packages/lib/path-utils.d.ts packages/lib/path-utils.d.ts
packages/lib/path-utils.js packages/lib/path-utils.js
packages/lib/path-utils.js.map packages/lib/path-utils.js.map
@@ -921,18 +1002,9 @@ packages/lib/services/BaseService.js.map
packages/lib/services/CommandService.d.ts packages/lib/services/CommandService.d.ts
packages/lib/services/CommandService.js packages/lib/services/CommandService.js
packages/lib/services/CommandService.js.map packages/lib/services/CommandService.js.map
packages/lib/services/DecryptionWorker.d.ts
packages/lib/services/DecryptionWorker.js
packages/lib/services/DecryptionWorker.js.map
packages/lib/services/EncryptionService.d.ts
packages/lib/services/EncryptionService.js
packages/lib/services/EncryptionService.js.map
packages/lib/services/ExternalEditWatcher.d.ts packages/lib/services/ExternalEditWatcher.d.ts
packages/lib/services/ExternalEditWatcher.js packages/lib/services/ExternalEditWatcher.js
packages/lib/services/ExternalEditWatcher.js.map packages/lib/services/ExternalEditWatcher.js.map
packages/lib/services/ItemChangeUtils.d.ts
packages/lib/services/ItemChangeUtils.js
packages/lib/services/ItemChangeUtils.js.map
packages/lib/services/KeymapService.d.ts packages/lib/services/KeymapService.d.ts
packages/lib/services/KeymapService.js packages/lib/services/KeymapService.js
packages/lib/services/KeymapService.js.map packages/lib/services/KeymapService.js.map
@@ -945,33 +1017,18 @@ packages/lib/services/KeymapService_keysRegExp.js.map
packages/lib/services/KvStore.d.ts packages/lib/services/KvStore.d.ts
packages/lib/services/KvStore.js packages/lib/services/KvStore.js
packages/lib/services/KvStore.js.map packages/lib/services/KvStore.js.map
packages/lib/services/MigrationService.d.ts
packages/lib/services/MigrationService.js
packages/lib/services/MigrationService.js.map
packages/lib/services/NavService.d.ts
packages/lib/services/NavService.js
packages/lib/services/NavService.js.map
packages/lib/services/PostMessageService.d.ts packages/lib/services/PostMessageService.d.ts
packages/lib/services/PostMessageService.js packages/lib/services/PostMessageService.js
packages/lib/services/PostMessageService.js.map packages/lib/services/PostMessageService.js.map
packages/lib/services/ReportService.d.ts
packages/lib/services/ReportService.js
packages/lib/services/ReportService.js.map
packages/lib/services/ResourceEditWatcher/index.d.ts packages/lib/services/ResourceEditWatcher/index.d.ts
packages/lib/services/ResourceEditWatcher/index.js packages/lib/services/ResourceEditWatcher/index.js
packages/lib/services/ResourceEditWatcher/index.js.map packages/lib/services/ResourceEditWatcher/index.js.map
packages/lib/services/ResourceEditWatcher/reducer.d.ts packages/lib/services/ResourceEditWatcher/reducer.d.ts
packages/lib/services/ResourceEditWatcher/reducer.js packages/lib/services/ResourceEditWatcher/reducer.js
packages/lib/services/ResourceEditWatcher/reducer.js.map packages/lib/services/ResourceEditWatcher/reducer.js.map
packages/lib/services/ResourceFetcher.d.ts
packages/lib/services/ResourceFetcher.js
packages/lib/services/ResourceFetcher.js.map
packages/lib/services/ResourceService.d.ts packages/lib/services/ResourceService.d.ts
packages/lib/services/ResourceService.js packages/lib/services/ResourceService.js
packages/lib/services/ResourceService.js.map packages/lib/services/ResourceService.js.map
packages/lib/services/RevisionService.d.ts
packages/lib/services/RevisionService.js
packages/lib/services/RevisionService.js.map
packages/lib/services/SettingUtils.d.ts packages/lib/services/SettingUtils.d.ts
packages/lib/services/SettingUtils.js packages/lib/services/SettingUtils.js
packages/lib/services/SettingUtils.js.map packages/lib/services/SettingUtils.js.map
@@ -1233,12 +1290,6 @@ packages/lib/services/rest/utils/requestFields.js.map
packages/lib/services/rest/utils/requestPaginationOptions.d.ts packages/lib/services/rest/utils/requestPaginationOptions.d.ts
packages/lib/services/rest/utils/requestPaginationOptions.js packages/lib/services/rest/utils/requestPaginationOptions.js
packages/lib/services/rest/utils/requestPaginationOptions.js.map packages/lib/services/rest/utils/requestPaginationOptions.js.map
packages/lib/services/searchengine/SearchEngine.d.ts
packages/lib/services/searchengine/SearchEngine.js
packages/lib/services/searchengine/SearchEngine.js.map
packages/lib/services/searchengine/SearchEngineUtils.d.ts
packages/lib/services/searchengine/SearchEngineUtils.js
packages/lib/services/searchengine/SearchEngineUtils.js.map
packages/lib/services/searchengine/filterParser.d.ts packages/lib/services/searchengine/filterParser.d.ts
packages/lib/services/searchengine/filterParser.js packages/lib/services/searchengine/filterParser.js
packages/lib/services/searchengine/filterParser.js.map packages/lib/services/searchengine/filterParser.js.map
@@ -1311,33 +1362,12 @@ packages/lib/uuid.js.map
packages/lib/versionInfo.d.ts packages/lib/versionInfo.d.ts
packages/lib/versionInfo.js packages/lib/versionInfo.js
packages/lib/versionInfo.js.map packages/lib/versionInfo.js.map
packages/plugin-repo-cli/dummy.test.d.ts
packages/plugin-repo-cli/dummy.test.js
packages/plugin-repo-cli/dummy.test.js.map
packages/plugin-repo-cli/index.d.ts packages/plugin-repo-cli/index.d.ts
packages/plugin-repo-cli/index.js packages/plugin-repo-cli/index.js
packages/plugin-repo-cli/index.js.map packages/plugin-repo-cli/index.js.map
packages/plugin-repo-cli/lib/checkIfPluginCanBeAdded.d.ts
packages/plugin-repo-cli/lib/checkIfPluginCanBeAdded.js
packages/plugin-repo-cli/lib/checkIfPluginCanBeAdded.js.map
packages/plugin-repo-cli/lib/checkIfPluginCanBeAdded.test.d.ts
packages/plugin-repo-cli/lib/checkIfPluginCanBeAdded.test.js
packages/plugin-repo-cli/lib/checkIfPluginCanBeAdded.test.js.map
packages/plugin-repo-cli/lib/errorsHaveChanged.d.ts
packages/plugin-repo-cli/lib/errorsHaveChanged.js
packages/plugin-repo-cli/lib/errorsHaveChanged.js.map
packages/plugin-repo-cli/lib/errorsHaveChanged.test.d.ts
packages/plugin-repo-cli/lib/errorsHaveChanged.test.js
packages/plugin-repo-cli/lib/errorsHaveChanged.test.js.map
packages/plugin-repo-cli/lib/gitCompareUrl.d.ts
packages/plugin-repo-cli/lib/gitCompareUrl.js
packages/plugin-repo-cli/lib/gitCompareUrl.js.map
packages/plugin-repo-cli/lib/gitCompareUrl.test.d.ts
packages/plugin-repo-cli/lib/gitCompareUrl.test.js
packages/plugin-repo-cli/lib/gitCompareUrl.test.js.map
packages/plugin-repo-cli/lib/types.d.ts
packages/plugin-repo-cli/lib/types.js
packages/plugin-repo-cli/lib/types.js.map
packages/plugin-repo-cli/lib/updateReadme.d.ts
packages/plugin-repo-cli/lib/updateReadme.js
packages/plugin-repo-cli/lib/updateReadme.js.map
packages/plugins/ToggleSidebars/api/index.d.ts packages/plugins/ToggleSidebars/api/index.d.ts
packages/plugins/ToggleSidebars/api/index.js packages/plugins/ToggleSidebars/api/index.js
packages/plugins/ToggleSidebars/api/index.js.map packages/plugins/ToggleSidebars/api/index.js.map
@@ -1641,12 +1671,6 @@ packages/server/src/utils/uuidgen.js.map
packages/tools/lerna-add.d.ts packages/tools/lerna-add.d.ts
packages/tools/lerna-add.js packages/tools/lerna-add.js
packages/tools/lerna-add.js.map packages/tools/lerna-add.js.map
packages/tools/release-cli.d.ts
packages/tools/release-cli.js
packages/tools/release-cli.js.map
packages/tools/release-electron.d.ts
packages/tools/release-electron.js
packages/tools/release-electron.js.map
packages/tools/release-server.d.ts packages/tools/release-server.d.ts
packages/tools/release-server.js packages/tools/release-server.js
packages/tools/release-server.js.map packages/tools/release-server.js.map

View File

@@ -20,11 +20,11 @@ Three types of applications are available: for the **desktop** (Windows, macOS a
Operating System | Download Operating System | Download
---|--- ---|---
Windows (32 and 64-bit) | <a href='https://github.com/laurent22/joplin/releases/download/v1.6.8/Joplin-Setup-1.6.8.exe'><img alt='Get it on Windows' width="134px" src='https://joplinapp.org/images/BadgeWindows.png'/></a> Windows (32 and 64-bit) | <a href='https://github.com/laurent22/joplin/releases/download/v1.6.6/Joplin-Setup-1.6.6.exe'><img alt='Get it on Windows' width="134px" src='https://joplinapp.org/images/BadgeWindows.png'/></a>
macOS | <a href='https://github.com/laurent22/joplin/releases/download/v1.6.8/Joplin-1.6.8.dmg'><img alt='Get it on macOS' width="134px" src='https://joplinapp.org/images/BadgeMacOS.png'/></a> macOS | <a href='https://github.com/laurent22/joplin/releases/download/v1.6.6/Joplin-1.6.6.dmg'><img alt='Get it on macOS' width="134px" src='https://joplinapp.org/images/BadgeMacOS.png'/></a>
Linux | <a href='https://github.com/laurent22/joplin/releases/download/v1.6.8/Joplin-1.6.8.AppImage'><img alt='Get it on Linux' width="134px" src='https://joplinapp.org/images/BadgeLinux.png'/></a> Linux | <a href='https://github.com/laurent22/joplin/releases/download/v1.6.6/Joplin-1.6.6.AppImage'><img alt='Get it on Linux' width="134px" src='https://joplinapp.org/images/BadgeLinux.png'/></a>
**On Windows**, you may also use the <a href='https://github.com/laurent22/joplin/releases/download/v1.6.8/JoplinPortable.exe'>Portable version</a>. The [portable application](https://en.wikipedia.org/wiki/Portable_application) allows installing the software on a portable device such as a USB key. Simply copy the file JoplinPortable.exe in any directory on that USB key ; the application will then create a directory called "JoplinProfile" next to the executable file. **On Windows**, you may also use the <a href='https://github.com/laurent22/joplin/releases/download/v1.6.6/JoplinPortable.exe'>Portable version</a>. The [portable application](https://en.wikipedia.org/wiki/Portable_application) allows installing the software on a portable device such as a USB key. Simply copy the file JoplinPortable.exe in any directory on that USB key ; the application will then create a directory called "JoplinProfile" next to the executable file.
**On Linux**, the recommended way is to use the following installation script as it will handle the desktop icon too: **On Linux**, the recommended way is to use the following installation script as it will handle the desktop icon too:
@@ -34,7 +34,7 @@ Linux | <a href='https://github.com/laurent22/joplin/releases/download/v1.6.8/Jo
Operating System | Download | Alt. Download Operating System | Download | Alt. Download
---|---|--- ---|---|---
Android | <a href='https://play.google.com/store/apps/details?id=net.cozic.joplin&utm_source=GitHub&utm_campaign=README&pcampaignid=MKT-Other-global-all-co-prtnr-py-PartBadge-Mar2515-1'><img alt='Get it on Google Play' height="40px" src='https://joplinapp.org/images/BadgeAndroid.png'/></a> | or download the APK file: [64-bit](https://github.com/laurent22/joplin-android/releases/download/android-v1.6.7/joplin-v1.6.7.apk) [32-bit](https://github.com/laurent22/joplin-android/releases/download/android-v1.6.7/joplin-v1.6.7-32bit.apk) Android | <a href='https://play.google.com/store/apps/details?id=net.cozic.joplin&utm_source=GitHub&utm_campaign=README&pcampaignid=MKT-Other-global-all-co-prtnr-py-PartBadge-Mar2515-1'><img alt='Get it on Google Play' height="40px" src='https://joplinapp.org/images/BadgeAndroid.png'/></a> | or download the APK file: [64-bit](https://github.com/laurent22/joplin-android/releases/download/android-v1.4.11/joplin-v1.4.11.apk) [32-bit](https://github.com/laurent22/joplin-android/releases/download/android-v1.4.11/joplin-v1.4.11-32bit.apk)
iOS | <a href='https://itunes.apple.com/us/app/joplin/id1315599797'><img alt='Get it on the App Store' height="40px" src='https://joplinapp.org/images/BadgeIOS.png'/></a> | - iOS | <a href='https://itunes.apple.com/us/app/joplin/id1315599797'><img alt='Get it on the App Store' height="40px" src='https://joplinapp.org/images/BadgeIOS.png'/></a> | -
## Terminal application ## Terminal application
@@ -98,7 +98,7 @@ The Web Clipper is a browser extension that allows you to save web pages and scr
- [Joplin API Overview](https://github.com/laurent22/joplin/blob/dev/readme/api/overview.md) - [Joplin API Overview](https://github.com/laurent22/joplin/blob/dev/readme/api/overview.md)
- [Plugin development](https://github.com/laurent22/joplin/blob/dev/readme/api/get_started/plugins.md) - [Plugin development](https://github.com/laurent22/joplin/blob/dev/readme/api/get_started/plugins.md)
- [Plugin tutorial](https://github.com/laurent22/joplin/blob/dev/readme/api/tutorials/toc_plugin.md) - [Plugin tutorial](https://github.com/laurent22/joplin/blob/dev/readme/api/tutorials/toc_plugin.md)
- Joplin API - References - Joplin API - References
@@ -127,7 +127,6 @@ The Web Clipper is a browser extension that allows you to save web pages and scr
- [Changelog (Desktop App)](https://github.com/laurent22/joplin/blob/dev/readme/changelog.md) - [Changelog (Desktop App)](https://github.com/laurent22/joplin/blob/dev/readme/changelog.md)
- [Changelog (CLI App)](https://github.com/laurent22/joplin/blob/dev/readme/changelog_cli.md) - [Changelog (CLI App)](https://github.com/laurent22/joplin/blob/dev/readme/changelog_cli.md)
- [Changelog (Server)](https://github.com/laurent22/joplin/blob/dev/readme/changelog_server.md)
- [Stats](https://github.com/laurent22/joplin/blob/dev/readme/stats.md) - [Stats](https://github.com/laurent22/joplin/blob/dev/readme/stats.md)
- [Donate](https://github.com/laurent22/joplin/blob/dev/readme/donate.md) - [Donate](https://github.com/laurent22/joplin/blob/dev/readme/donate.md)
<!-- TOC --> <!-- TOC -->
@@ -136,29 +135,22 @@ The Web Clipper is a browser extension that allows you to save web pages and scr
- Desktop, mobile and terminal applications. - Desktop, mobile and terminal applications.
- [Web Clipper](https://github.com/laurent22/joplin/blob/dev/readme/clipper.md) for Firefox and Chrome. - [Web Clipper](https://github.com/laurent22/joplin/blob/dev/readme/clipper.md) for Firefox and Chrome.
- End To End Encryption (E2EE). - End To End Encryption (E2EE)
- Note history (revisions). - Note history (revisions)
- Synchronisation with various services, including Nextcloud, Dropbox, WebDAV and OneDrive. - Synchronisation with various services, including Nextcloud, Dropbox, WebDAV and OneDrive.
- Offline first, so the entire data is always available on the device even without an internet connection.
- Import Enex files (Evernote export format) and Markdown files. - Import Enex files (Evernote export format) and Markdown files.
- Export JEX files (Joplin Export format) and raw files. - Export JEX files (Joplin Export format) and raw files.
- Support notes, to-dos, tags and notebooks. - Support notes, to-dos, tags and notebooks.
- Goto Anything feature.
- Sort notes by multiple criteria - title, updated time, etc. - Sort notes by multiple criteria - title, updated time, etc.
- Support for alarms (notifications) in mobile and desktop applications. - Support for alarms (notifications) in mobile and desktop applications.
- Offline first, so the entire data is always available on the device even without an internet connection.
- Markdown notes, which are rendered with images and formatting in the desktop and mobile applications. Support for extra features such as math notation and checkboxes. - Markdown notes, which are rendered with images and formatting in the desktop and mobile applications. Support for extra features such as math notation and checkboxes.
- Choice of both Markdown and Rich Text (WYSIWYG) editors. - File attachment support - images are displayed, and other files are linked and can be opened in the relevant application.
- File attachment support - images are displayed, other files are linked and can be opened in the relevant application.
- Inline display of PDF, video and audio files.
- Goto Anything feature.
- Search functionality. - Search functionality.
- Geo-location support. - Geo-location support.
- Supports multiple languages. - Supports multiple languages
- External editor support - open notes in your favorite external editor with one click in Joplin. - External editor support - open notes in your favorite external editor with one click in Joplin.
- Extensible functionality through plugin and data APIs.
- Template support with data variables for auto creation of time & dates.
- Custom CSS support for customisation of both the rendered markdown and overall user interface.
- Customisable layout allows toggling, movement and sizing of various elements.
- Keyboard shortcuts are editable and allow binding of most Joplin commands with export/import functionality.
# Importing # Importing
@@ -168,7 +160,7 @@ Joplin was designed as a replacement for Evernote and so can import complete Eve
- Recognition data - Evernote images, in particular scanned (or photographed) documents have [recognition data](https://en.wikipedia.org/wiki/Optical_character_recognition) associated with them. It is the text that Evernote has been able to recognise in the document. This data is not preserved when the note are imported into Joplin. However, should it become supported in the search tool or other parts of Joplin, it should be possible to regenerate this recognition data since the actual image would still be available. - Recognition data - Evernote images, in particular scanned (or photographed) documents have [recognition data](https://en.wikipedia.org/wiki/Optical_character_recognition) associated with them. It is the text that Evernote has been able to recognise in the document. This data is not preserved when the note are imported into Joplin. However, should it become supported in the search tool or other parts of Joplin, it should be possible to regenerate this recognition data since the actual image would still be available.
- Colour, font sizes and faces - Evernote text is stored as HTML and this is converted to Markdown during the import process. For notes that are mostly plain text or with basic formatting (bold, italic, bullet points, links, etc.) this is a lossless conversion, and the note, once rendered back to HTML should be very similar. Tables are also imported and converted to Markdown tables. For very complex notes, some formatting data might be lost - in particular colours, font sizes and font faces will not be imported. The text itself however is always imported in full regardless of formatting. If it is essential that this extra data is preserved then Joplin also allows import of ENEX files as HTML. - Colour, font sizes and faces - Evernote text is stored as HTML and this is converted to Markdown during the import process. For notes that are mostly plain text or with basic formatting (bold, italic, bullet points, links, etc.) this is a lossless conversion, and the note, once rendered back to HTML should be very similar. Tables are also imported and converted to Markdown tables. For very complex notes, some formatting data might be lost - in particular colours, font sizes and font faces will not be imported. The text itself however is always imported in full regardless of formatting.
To import Evernote data, first export your Evernote notebooks to ENEX files as described [here](https://help.evernote.com/hc/en-us/articles/209005557-How-to-back-up-export-and-restore-import-notes-and-notebooks). Then follow these steps: To import Evernote data, first export your Evernote notebooks to ENEX files as described [here](https://help.evernote.com/hc/en-us/articles/209005557-How-to-back-up-export-and-restore-import-notes-and-notebooks). Then follow these steps:
@@ -180,9 +172,7 @@ In the **terminal application**, in [command-line mode](https://github.com/laure
Joplin can import notes from plain Markdown file. You can either import a complete directory of Markdown files or individual files. Joplin can import notes from plain Markdown file. You can either import a complete directory of Markdown files or individual files.
In the **desktop application**: In the **desktop application**, open File > Import > MD and select your Markdown file or directory.
* **File import**: Go to File > Import > MD - Markdown (file) and select the Markdown file. This file will then be imported to the currently selected Notebook.
* **Directory import**: Go to File > Import > MD - Markdown (directory) and select the top level of the directory that is being imported. Directory (folder) structure will be preserved in the Notebook > Subnotebook > Note structure within Joplin.
In the **terminal application**, in [command-line mode](https://github.com/laurent22/joplin/blob/dev/readme/terminal.md#command-line-mode), type `import --format md /path/to/file.md` or `import --format md /path/to/directory/`. In the **terminal application**, in [command-line mode](https://github.com/laurent22/joplin/blob/dev/readme/terminal.md#command-line-mode), type `import --format md /path/to/file.md` or `import --format md /path/to/directory/`.
@@ -198,23 +188,18 @@ In general the way to import notes from any application into Joplin is to conver
# Exporting # Exporting
Joplin can export to the JEX format (Joplin Export file), which is a tar file that can contain multiple notes, notebooks, etc. This is a lossless format in that all the notes, but also metadata such as geo-location, updated time, tags, etc. are preserved. This format is convenient for backup purposes and can be re-imported into Joplin. A "raw" format is also available. This is the same as the JEX format except that the data is saved to a directory and each item represented by a single file. Joplin can export to the JEX format (Joplin Export file), which is a tar file that can contain multiple notes, notebooks, etc. This is a lossless format in that all the notes, but also metadata such as geo-location, updated time, tags, etc. are preserved. This format is convenient for backup purposes and can be re-imported into Joplin. A "raw" format is also available. This is the same as the JEX format except that the data is saved to a directory and each item represented by a single file.
Joplin is also capable of exporting to a number of other formats including HTML and PDF which can be done for single notes, notebooks or everything.
# Synchronisation # Synchronisation
One of the goals of Joplin was to avoid being tied to any particular company or service, whether it is Evernote, Google or Microsoft. As such the synchronisation is designed without any hard dependency to any particular service. Most of the synchronisation process is done at an abstract level and access to external services, such as Nextcloud or Dropbox, is done via lightweight drivers. It is easy to support new services by creating simple drivers that provide a filesystem-like interface, i.e. the ability to read, write, delete and list items. It is also simple to switch from one service to another or to even sync to multiple services at once. Each note, notebook, tags, as well as the relation between items is transmitted as plain text files during synchronisation, which means the data can also be moved to a different application, can be easily backed up, inspected, etc. One of the goals of Joplin was to avoid being tied to any particular company or service, whether it is Evernote, Google or Microsoft. As such the synchronisation is designed without any hard dependency to any particular service. Most of the synchronisation process is done at an abstract level and access to external services, such as Nextcloud or Dropbox, is done via lightweight drivers. It is easy to support new services by creating simple drivers that provide a filesystem-like interface, i.e. the ability to read, write, delete and list items. It is also simple to switch from one service to another or to even sync to multiple services at once. Each note, notebook, tags, as well as the relation between items is transmitted as plain text files during synchronisation, which means the data can also be moved to a different application, can be easily backed up, inspected, etc.
Currently, synchronisation is possible with Nextcloud, WebDAV, Dropbox, OneDrive or the local filesystem. To enable synchronisation please follow the instructions below. After that, the application will synchronise in the background whenever it is running, or you can click on "Synchronise" to start a synchronisation manually. Joplin will background sync automatically after any content change is made on the local application. Currently, synchronisation is possible with Nextcloud, Dropbox, OneDrive or the local filesystem. To enable synchronisation please follow the instructions below. After that, the application will synchronise in the background whenever it is running, or you can click on "Synchronise" to start a synchronisation manually.
If the **terminal client** has been installed, it is possible to also synchronise outside of the user interface by typing `joplin sync` from the terminal. This can be used to setup a cron script to synchronise at a regular interval. For example, this would do it every 30 minutes:
` */30 * * * * /path/to/joplin sync`
## Nextcloud synchronisation ## Nextcloud synchronisation
<img src="https://joplinapp.org/images/nextcloud-logo-background.png" width="100" align="left"> <a href="https://nextcloud.com/">Nextcloud</a> is a self-hosted, private cloud solution. It can store documents, images and videos but also calendars, passwords and countless other things and can sync them to your laptop or phone. As you can host your own Nextcloud server, you own both the data on your device and infrastructure used for synchronisation. As such it is a good fit for Joplin. The platform is also well supported and with a strong community, so it is likely to be around for a while - since it's open source anyway, it is not a service that can be closed, it can exist on a server for as long as one chooses. <img src="https://joplinapp.org/images/nextcloud-logo-background.png" width="100" align="left"> <a href="https://nextcloud.com/">Nextcloud</a> is a self-hosted, private cloud solution. It can store documents, images and videos but also calendars, passwords and countless other things and can sync them to your laptop or phone. As you can host your own Nextcloud server, you own both the data on your device and infrastructure used for synchronisation. As such it is a good fit for Joplin. The platform is also well supported and with a strong community, so it is likely to be around for a while - since it's open source anyway, it is not a service that can be closed, it can exist on a server for as long as one chooses.
In the **desktop application** or **mobile application**, go to the Configuration screen and select Nextcloud as the synchronisation target. Then input the WebDAV URL (to get it, click on Settings in the bottom left corner of the page, in Nextcloud), this is normally `https://example.com/nextcloud/remote.php/webdav/Joplin` (**make sure to create the "Joplin" directory in Nextcloud**), and set the username and password. If it does not work, please [see this explanation](https://github.com/laurent22/joplin/issues/61#issuecomment-373282608) for more details. In the **desktop application** or **mobile application**, go to the config screen and select Nextcloud as the synchronisation target. Then input the WebDAV URL (to get it, click on Settings in the bottom left corner of the page, in Nextcloud), this is normally `https://example.com/nextcloud/remote.php/webdav/Joplin` (**make sure to create the "Joplin" directory in Nextcloud**), and set the username and password. If it does not work, please [see this explanation](https://github.com/laurent22/joplin/issues/61#issuecomment-373282608) for more details.
In the **terminal application**, you will need to set the `sync.target` config variable and all the `sync.5.path`, `sync.5.username` and `sync.5.password` config variables to, respectively the Nextcloud WebDAV URL, your username and your password. This can be done from the command line mode using: In the **terminal application**, you will need to set the `sync.target` config variable and all the `sync.5.path`, `sync.5.username` and `sync.5.password` config variables to, respectively the Nextcloud WebDAV URL, your username and your password. This can be done from the command line mode using:
@@ -225,9 +210,19 @@ In the **terminal application**, you will need to set the `sync.target` config v
If synchronisation does not work, please consult the logs in the app profile directory - it is often due to a misconfigured URL or password. The log should indicate what the exact issue is. If synchronisation does not work, please consult the logs in the app profile directory - it is often due to a misconfigured URL or password. The log should indicate what the exact issue is.
## Dropbox synchronisation
When syncing with Dropbox, Joplin creates a sub-directory in Dropbox, in `/Apps/Joplin` and read/write the notes and notebooks from it. The application does not have access to anything outside this directory.
In the **desktop application** or **mobile application**, select "Dropbox" as the synchronisation target in the config screen (it is selected by default). Then, to initiate the synchronisation process, click on the "Synchronise" button in the sidebar and follow the instructions.
In the **terminal application**, to initiate the synchronisation process, type `:sync`. You will be asked to follow a link to authorise the application. It is possible to also synchronise outside of the user interface by typing `joplin sync` from the terminal. This can be used to setup a cron script to synchronise at regular interval. For example, this would do it every 30 minutes:
*/30 * * * * /path/to/joplin sync
## WebDAV synchronisation ## WebDAV synchronisation
Select the "WebDAV" synchronisation target and follow the same instructions as for Nextcloud above (for the **terminal application** you will need to select sync target 6 rather than 5) Select the "WebDAV" synchronisation target and follow the same instructions as for Nextcloud above.
WebDAV-compatible services that are known to work with Joplin: WebDAV-compatible services that are known to work with Joplin:
@@ -244,19 +239,11 @@ WebDAV-compatible services that are known to work with Joplin:
- [WebDAV Nav](https://www.schimera.com/products/webdav-nav-server/), a macOS server. - [WebDAV Nav](https://www.schimera.com/products/webdav-nav-server/), a macOS server.
- [Zimbra](https://www.zimbra.com/) - [Zimbra](https://www.zimbra.com/)
## Dropbox synchronisation
When syncing with Dropbox, Joplin creates a sub-directory in Dropbox, in `/Apps/Joplin` and read/write the notes and notebooks from it. The application does not have access to anything outside this directory.
In the **desktop application** or **mobile application**, select "Dropbox" as the synchronisation target in the Configuration screen (it is selected by default). Then, to initiate the synchronisation process, click on the "Synchronise" button in the sidebar and follow the instructions.
In the **terminal application**, to initiate the synchronisation process, type `:sync`. You will be asked to follow a link to authorise the application.
## OneDrive synchronisation ## OneDrive synchronisation
When syncing with OneDrive, Joplin creates a sub-directory in OneDrive, in /Apps/Joplin and read/write the notes and notebooks from it. The application does not have access to anything outside this directory. When syncing with OneDrive, Joplin creates a sub-directory in OneDrive, in /Apps/Joplin and read/write the notes and notebooks from it. The application does not have access to anything outside this directory.
In the **desktop application** or **mobile application**, select "OneDrive" as the synchronisation target in the Configuration screen. Then, to initiate the synchronisation process, click on the "Synchronise" button in the sidebar and follow the instructions. In the **desktop application** or **mobile application**, select "OneDrive" as the synchronisation target in the config screen. Then, to initiate the synchronisation process, click on the "Synchronise" button in the sidebar and follow the instructions.
In the **terminal application**, to initiate the synchronisation process, type `:sync`. You will be asked to follow a link to authorise the application (simply input your Microsoft credentials - you do not need to register with OneDrive). In the **terminal application**, to initiate the synchronisation process, type `:sync`. You will be asked to follow a link to authorise the application (simply input your Microsoft credentials - you do not need to register with OneDrive).
@@ -270,9 +257,9 @@ For a more technical description, mostly relevant for development or to review t
The Joplin applications automatically save previous versions of your notes at regular intervals. These versions are synced across devices and can be viewed from the desktop application. To do so, click on the "Information" button on a note, then click on "Previous version of this note". From this screen you can view the previous versions of the note as well as restore any of them. The Joplin applications automatically save previous versions of your notes at regular intervals. These versions are synced across devices and can be viewed from the desktop application. To do so, click on the "Information" button on a note, then click on "Previous version of this note". From this screen you can view the previous versions of the note as well as restore any of them.
This feature can be disabled from the "Note history" section in the Configuration screen, and it is also possible to change for how long the history of a note is saved. This feature can be disabled from the "Note history" section in the settings, and it is also possible to change for how long the history of a note is saved.
More information please see the [Note History page](https://github.com/laurent22/joplin/blob/dev/readme/note_history.md). More information about this feature in the [announcement post](https://www.patreon.com/posts/note-history-now-27083082).
# External text editor # External text editor
@@ -280,7 +267,7 @@ Joplin notes can be opened and edited using an external editor of your choice. I
# Attachments # Attachments
Any kind of file can be attached to a note. In Markdown, links to these files are represented as a simple ID to the attachment, clicking on this link will open the file in the default application. In the case of audio, video and pdf files, these will be displayed inline with the note and so can be viewed or played within Joplin. Any kind of file can be attached to a note. In Markdown, links to these files are represented as a simple ID to the attachment. In the note viewer, these files, if they are images, will be displayed or, if they are other files (PDF, text files, etc.) they will be displayed as links. Clicking on this link will open the file in the default application.
In the **desktop application**, files can be attached either by clicking the "Attach file" icon in the editor or via drag and drop. If you prefer to create a link to a local file instead, hold the ALT key while performing the drag and drop operation. You can also copy and paste images directly in the editor via Ctrl+V. In the **desktop application**, files can be attached either by clicking the "Attach file" icon in the editor or via drag and drop. If you prefer to create a link to a local file instead, hold the ALT key while performing the drag and drop operation. You can also copy and paste images directly in the editor via Ctrl+V.
@@ -322,7 +309,7 @@ Joplin uses and renders a Github-flavoured Markdown with a few variations and ad
# Custom CSS # Custom CSS
Rendered markdown can be customized by placing a userstyle file in the profile directory `~/.config/joplin-desktop/userstyle.css` (This path might be different on your device - check at the top of the `General` page of the Configuration menu for the exact path). This file supports standard CSS syntax. Joplin ***must*** be restarted for the new css to be applied, please ensure that Joplin is not closing to the tray, but is actually exiting. Note that this file is used for both displaying the notes and printing the notes. Be aware how the CSS may look printed (for example, printing white text over a black background is usually not wanted). Rendered markdown can be customized by placing a userstyle file in the profile directory `~/.config/joplin-desktop/userstyle.css` (This path might be different on your device - check at the top of the Config screen for the exact path). This file supports standard CSS syntax. Joplin ***must*** be restarted for the new css to be applied, please ensure that Joplin is not closing to the tray, but is actually exiting. Note that this file is used for both displaying the notes and printing the notes. Be aware how the CSS may look printed (for example, printing white text over a black background is usually not wanted).
The whole UI can be customized by placing a custom editor style file in the profile directory `~/.config/joplin-desktop/userchrome.css`. The whole UI can be customized by placing a custom editor style file in the profile directory `~/.config/joplin-desktop/userchrome.css`.
@@ -330,7 +317,7 @@ Important: userstyle.css and userchrome.css are provided for your convenience, b
# Note templates # Note templates
In the **desktop app**, templates can be used to create new notes or to insert into existing ones by adding a template file to the `templates` directory (File > Templates). For example creating the file `hours.md` in the `templates` directory with the contents: In the **desktop app**, templates can be used to create new notes or to insert into existing ones by creating a `templates` folder in Joplin's config folder and placing Markdown template files into it. For example creating the file `hours.md` in the `templates` directory with the contents:
```markdown ```markdown
Date: {{date}} Date: {{date}}
@@ -351,14 +338,6 @@ The currently supported template variables are:
| `{{bowm}}` | Date of the beginning of the week (when week starts on Monday) based on the settings format | | | `{{bowm}}` | Date of the beginning of the week (when week starts on Monday) based on the settings format | |
| `{{bows}}` | Date of the beginning of the week (when week starts on Sunday) based on the settings format | | | `{{bows}}` | Date of the beginning of the week (when week starts on Sunday) based on the settings format | |
# Plugins
The **desktop app** has the ability to extend beyond its standard functionality by the way of plugins. These plugins adhere to the Joplin plugin API and can be installed & configured within the application via the `Plugins` page in the Configuration screen. This menu allows the manual installation of the plugin using the single 'Joplin Plugin Archive' (*.jpl) file. Once the application is reloaded the plugins will appear within the plugins menu where they can be toggled on/off or removed entirely.
Plugins are currently maintained by the community in the [Joplin Discourse 'plugins' category](https://discourse.joplinapp.org/c/plugins/18).
For more information see [Plugins](https://github.com/laurent22/joplin/blob/dev/readme/plugins.md)
# Searching # Searching
Joplin implements the SQLite Full Text Search (FTS4) extension. It means the content of all the notes is indexed in real time and search queries return results very fast. Both [Simple FTS Queries](https://www.sqlite.org/fts3.html#simple_fts_queries) and [Full-Text Index Queries](https://www.sqlite.org/fts3.html#full_text_index_queries) are supported. See below for the list of supported queries: Joplin implements the SQLite Full Text Search (FTS4) extension. It means the content of all the notes is indexed in real time and search queries return results very fast. Both [Simple FTS Queries](https://www.sqlite.org/fts3.html#simple_fts_queries) and [Full-Text Index Queries](https://www.sqlite.org/fts3.html#full_text_index_queries) are supported. See below for the list of supported queries:

View File

@@ -450,23 +450,11 @@ https://github.com/laurent22/joplin/blob/dev/readme/api/references/plugin_manife
<td>Plugin author name.</td> <td>Plugin author name.</td>
</tr> </tr>
<tr> <tr>
<td><code>keywords</code></td>
<td>string[]</td>
<td>No</td>
<td>Keywords associated with the plugins. They are used in search in particular.</td>
</tr>
<tr>
<td><code>homepage_url</code></td> <td><code>homepage_url</code></td>
<td>string</td> <td>string</td>
<td>No</td> <td>No</td>
<td>Homepage URL of the plugin. It can also be, for example, a link to a GitHub repository.</td> <td>Homepage URL of the plugin. It can also be, for example, a link to a GitHub repository.</td>
</tr> </tr>
<tr>
<td><code>repository_url</code></td>
<td>string</td>
<td>No</td>
<td>Repository URL where the plugin source code is hosted.</td>
</tr>
</tbody> </tbody>
</table> </table>
<h2>Manifest example<a name="manifest-example" href="#manifest-example" class="heading-anchor">🔗</a></h2> <h2>Manifest example<a name="manifest-example" href="#manifest-example" class="heading-anchor">🔗</a></h2>

View File

@@ -402,14 +402,6 @@ https://github.com/laurent22/joplin/blob/dev/readme/changelog.md
<div class="main"> <div class="main">
<h1>Joplin changelog<a name="joplin-changelog" href="#joplin-changelog" class="heading-anchor">🔗</a></h1> <h1>Joplin changelog<a name="joplin-changelog" href="#joplin-changelog" class="heading-anchor">🔗</a></h1>
<h2><a href="https://github.com/laurent22/joplin/releases/tag/v1.6.8">v1.6.8</a> - 2021-01-20T18:11:34Z<a name="v1-6-8-https-github-com-laurent22-joplin-releases-tag-v1-6-8-2021-01-20t18-11-34z" href="#v1-6-8-https-github-com-laurent22-joplin-releases-tag-v1-6-8-2021-01-20t18-11-34z" class="heading-anchor">🔗</a></h2>
<ul>
<li>Fixed: Fixed infinite sync issue with OneDrive (<a href="https://github.com/laurent22/joplin/issues/4305">#4305</a>)</li>
</ul>
<h2><a href="https://github.com/laurent22/joplin/releases/tag/v1.6.7">v1.6.7</a> - 2021-01-11T23:20:33Z<a name="v1-6-7-https-github-com-laurent22-joplin-releases-tag-v1-6-7-2021-01-11t23-20-33z" href="#v1-6-7-https-github-com-laurent22-joplin-releases-tag-v1-6-7-2021-01-11t23-20-33z" class="heading-anchor">🔗</a></h2>
<ul>
<li>Fixed (regression): Some commands were no longer working (<a href="https://github.com/laurent22/joplin/issues/4343">#4343</a>) (<a href="https://github.com/laurent22/joplin/issues/4338">#4338</a> by <a href="https://github.com/CalebJohn">@CalebJohn</a>)</li>
</ul>
<h2><a href="https://github.com/laurent22/joplin/releases/tag/v1.6.6">v1.6.6</a> - 2021-01-09T16:15:31Z<a name="v1-6-6-https-github-com-laurent22-joplin-releases-tag-v1-6-6-2021-01-09t16-15-31z" href="#v1-6-6-https-github-com-laurent22-joplin-releases-tag-v1-6-6-2021-01-09t16-15-31z" class="heading-anchor">🔗</a></h2> <h2><a href="https://github.com/laurent22/joplin/releases/tag/v1.6.6">v1.6.6</a> - 2021-01-09T16:15:31Z<a name="v1-6-6-https-github-com-laurent22-joplin-releases-tag-v1-6-6-2021-01-09t16-15-31z" href="#v1-6-6-https-github-com-laurent22-joplin-releases-tag-v1-6-6-2021-01-09t16-15-31z" class="heading-anchor">🔗</a></h2>
<ul> <ul>
<li>New: Add way to install plugin from file</li> <li>New: Add way to install plugin from file</li>

View File

@@ -402,10 +402,6 @@ https://github.com/laurent22/joplin/blob/dev/readme/changelog_cli.md
<div class="main"> <div class="main">
<h1>Joplin terminal app changelog<a name="joplin-terminal-app-changelog" href="#joplin-terminal-app-changelog" class="heading-anchor">🔗</a></h1> <h1>Joplin terminal app changelog<a name="joplin-terminal-app-changelog" href="#joplin-terminal-app-changelog" class="heading-anchor">🔗</a></h1>
<h2><a href="https://github.com/laurent22/joplin/releases/tag/cli-v1.6.4">cli-v1.6.4</a> - 2021-01-21T10:01:15Z<a name="cli-v1-6-4-https-github-com-laurent22-joplin-releases-tag-cli-v1-6-4-2021-01-21t10-01-15z" href="#cli-v1-6-4-https-github-com-laurent22-joplin-releases-tag-cli-v1-6-4-2021-01-21t10-01-15z" class="heading-anchor">🔗</a></h2>
<ul>
<li>Fixed: Fixed infinite sync issue with OneDrive (#4305)</li>
</ul>
<h2><a href="https://github.com/laurent22/joplin/releases/tag/cli-v1.6.3">cli-v1.6.3</a> - 2021-01-11T11:52:11Z<a name="cli-v1-6-3-https-github-com-laurent22-joplin-releases-tag-cli-v1-6-3-2021-01-11t11-52-11z" href="#cli-v1-6-3-https-github-com-laurent22-joplin-releases-tag-cli-v1-6-3-2021-01-11t11-52-11z" class="heading-anchor">🔗</a></h2> <h2><a href="https://github.com/laurent22/joplin/releases/tag/cli-v1.6.3">cli-v1.6.3</a> - 2021-01-11T11:52:11Z<a name="cli-v1-6-3-https-github-com-laurent22-joplin-releases-tag-cli-v1-6-3-2021-01-11t11-52-11z" href="#cli-v1-6-3-https-github-com-laurent22-joplin-releases-tag-cli-v1-6-3-2021-01-11t11-52-11z" class="heading-anchor">🔗</a></h2>
<ul> <ul>
<li>New: Add more log info when a revision cannot be deleted due to still-encrypted itel</li> <li>New: Add more log info when a revision cannot be deleted due to still-encrypted itel</li>

View File

@@ -424,7 +424,7 @@ https://github.com/laurent22/joplin/blob/dev/readme/faq.md
code -n --wait # Opens Visual Studio Code (code) in a new window (-n) and waits for close (--wait) code -n --wait # Opens Visual Studio Code (code) in a new window (-n) and waits for close (--wait)
gedit --new-window # Opens gedit (Gnome Text Editor) in a new window gedit --new-window # Opens gedit (Gnome Text Editor) in a new window
xterm -e vim # Opens a new terminal and opens vim. Can be replaced with an xterm -e vim # Opens a new terminal and opens vim. Can be replaced with an
# alternative terminal (gnome-terminal, terminator, etc.) # alternative terminal (gnome-terminal, terminator, etc.)
# or terminal text-editor (emacs, nano, etc.) # or terminal text-editor (emacs, nano, etc.)
open -a &lt;application&gt; # Mac only: opens a GUI application open -a &lt;application&gt; # Mac only: opens a GUI application
</code></pre> </code></pre>
@@ -459,7 +459,7 @@ notepad++.exe --openSession # Opens Notepad ++ in new window
<p>On the local device it is assumed that the data is safe due to the OS built-in security features. If additional security is needed it's always possible to put the notes on an encrypted Truecrypt drive for instance.</p> <p>On the local device it is assumed that the data is safe due to the OS built-in security features. If additional security is needed it's always possible to put the notes on an encrypted Truecrypt drive for instance.</p>
<p>For these reasons, because the OS or yourself can easily protect the local data, no PIN or password is currently supported to access Joplin.</p> <p>For these reasons, because the OS or yourself can easily protect the local data, no PIN or password is currently supported to access Joplin.</p>
<p>There is however an issue open about it, so pull requests are welcome: <a href="https://github.com/laurent22/joplin/issues/289">https://github.com/laurent22/joplin/issues/289</a></p> <p>There is however an issue open about it, so pull requests are welcome: <a href="https://github.com/laurent22/joplin/issues/289">https://github.com/laurent22/joplin/issues/289</a></p>
<h2>Why is my WebDAV host not working?<a name="why-is-my-webdav-host-not-working" href="#why-is-my-webdav-host-not-working" class="heading-anchor">🔗</a></h2> <h2>WebDAV synchronisation is not working<a name="webdav-synchronisation-is-not-working" href="#webdav-synchronisation-is-not-working" class="heading-anchor">🔗</a></h2>
<h3>&quot;Forbidden&quot; error in Strato<a name="forbidden-error-in-strato" href="#forbidden-error-in-strato" class="heading-anchor">🔗</a></h3> <h3>&quot;Forbidden&quot; error in Strato<a name="forbidden-error-in-strato" href="#forbidden-error-in-strato" class="heading-anchor">🔗</a></h3>
<p>For example:</p> <p>For example:</p>
<pre><code>MKCOL .sync/: Unknown error 2 (403): &lt;!DOCTYPE HTML PUBLIC &quot;-//IETF//DTD HTML 2.0//EN&quot;&gt; <pre><code>MKCOL .sync/: Unknown error 2 (403): &lt;!DOCTYPE HTML PUBLIC &quot;-//IETF//DTD HTML 2.0//EN&quot;&gt;
@@ -472,10 +472,6 @@ on this server.&lt;/p&gt;
&lt;/body&gt;&lt;/html&gt; &lt;/body&gt;&lt;/html&gt;
</code></pre> </code></pre>
<p>In this case, <a href="https://github.com/laurent22/joplin/issues/309">make sure you enter the correct WebDAV URL</a>.</p> <p>In this case, <a href="https://github.com/laurent22/joplin/issues/309">make sure you enter the correct WebDAV URL</a>.</p>
<h3>The following WebDAV hosts are not supported<a name="the-following-webdav-hosts-are-not-supported" href="#the-following-webdav-hosts-are-not-supported" class="heading-anchor">🔗</a></h3>
<ul>
<li><a href="http://Jianguoyun.com">Jianguoyun.com</a> (see <a href="https://github.com/laurent22/joplin/issues/4294">Github issue</a>)</li>
</ul>
<h3>Nextcloud sync is not working<a name="nextcloud-sync-is-not-working" href="#nextcloud-sync-is-not-working" class="heading-anchor">🔗</a></h3> <h3>Nextcloud sync is not working<a name="nextcloud-sync-is-not-working" href="#nextcloud-sync-is-not-working" class="heading-anchor">🔗</a></h3>
<ul> <ul>
<li>Check your username and password. <strong>Type it manually</strong> (without copying and pasting it) and try again.</li> <li>Check your username and password. <strong>Type it manually</strong> (without copying and pasting it) and try again.</li>

View File

@@ -421,19 +421,19 @@ https://github.com/laurent22/joplin/blob/dev/README.md
<tbody> <tbody>
<tr> <tr>
<td>Windows (32 and 64-bit)</td> <td>Windows (32 and 64-bit)</td>
<td><a href='https://github.com/laurent22/joplin/releases/download/v1.6.8/Joplin-Setup-1.6.8.exe'><img alt='Get it on Windows' width="134px" src='https://joplinapp.org/images/BadgeWindows.png'/></a></td> <td><a href='https://github.com/laurent22/joplin/releases/download/v1.6.6/Joplin-Setup-1.6.6.exe'><img alt='Get it on Windows' width="134px" src='https://joplinapp.org/images/BadgeWindows.png'/></a></td>
</tr> </tr>
<tr> <tr>
<td>macOS</td> <td>macOS</td>
<td><a href='https://github.com/laurent22/joplin/releases/download/v1.6.8/Joplin-1.6.8.dmg'><img alt='Get it on macOS' width="134px" src='https://joplinapp.org/images/BadgeMacOS.png'/></a></td> <td><a href='https://github.com/laurent22/joplin/releases/download/v1.6.6/Joplin-1.6.6.dmg'><img alt='Get it on macOS' width="134px" src='https://joplinapp.org/images/BadgeMacOS.png'/></a></td>
</tr> </tr>
<tr> <tr>
<td>Linux</td> <td>Linux</td>
<td><a href='https://github.com/laurent22/joplin/releases/download/v1.6.8/Joplin-1.6.8.AppImage'><img alt='Get it on Linux' width="134px" src='https://joplinapp.org/images/BadgeLinux.png'/></a></td> <td><a href='https://github.com/laurent22/joplin/releases/download/v1.6.6/Joplin-1.6.6.AppImage'><img alt='Get it on Linux' width="134px" src='https://joplinapp.org/images/BadgeLinux.png'/></a></td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
<p><strong>On Windows</strong>, you may also use the <a href='https://github.com/laurent22/joplin/releases/download/v1.6.8/JoplinPortable.exe'>Portable version</a>. The <a href="https://en.wikipedia.org/wiki/Portable_application">portable application</a> allows installing the software on a portable device such as a USB key. Simply copy the file JoplinPortable.exe in any directory on that USB key ; the application will then create a directory called &quot;JoplinProfile&quot; next to the executable file.</p> <p><strong>On Windows</strong>, you may also use the <a href='https://github.com/laurent22/joplin/releases/download/v1.6.6/JoplinPortable.exe'>Portable version</a>. The <a href="https://en.wikipedia.org/wiki/Portable_application">portable application</a> allows installing the software on a portable device such as a USB key. Simply copy the file JoplinPortable.exe in any directory on that USB key ; the application will then create a directory called &quot;JoplinProfile&quot; next to the executable file.</p>
<p><strong>On Linux</strong>, the recommended way is to use the following installation script as it will handle the desktop icon too:</p> <p><strong>On Linux</strong>, the recommended way is to use the following installation script as it will handle the desktop icon too:</p>
<pre><code style="word-break: break-all">wget -O - https://raw.githubusercontent.com/laurent22/joplin/dev/Joplin_install_and_update.sh | bash</code></pre> <pre><code style="word-break: break-all">wget -O - https://raw.githubusercontent.com/laurent22/joplin/dev/Joplin_install_and_update.sh | bash</code></pre>
<h2>Mobile applications<a name="mobile-applications" href="#mobile-applications" class="heading-anchor">🔗</a></h2> <h2>Mobile applications<a name="mobile-applications" href="#mobile-applications" class="heading-anchor">🔗</a></h2>
@@ -449,7 +449,7 @@ https://github.com/laurent22/joplin/blob/dev/README.md
<tr> <tr>
<td>Android</td> <td>Android</td>
<td><a href='https://play.google.com/store/apps/details?id=net.cozic.joplin&utm_source=GitHub&utm_campaign=README&pcampaignid=MKT-Other-global-all-co-prtnr-py-PartBadge-Mar2515-1'><img alt='Get it on Google Play' height="40px" src='https://joplinapp.org/images/BadgeAndroid.png'/></a></td> <td><a href='https://play.google.com/store/apps/details?id=net.cozic.joplin&utm_source=GitHub&utm_campaign=README&pcampaignid=MKT-Other-global-all-co-prtnr-py-PartBadge-Mar2515-1'><img alt='Get it on Google Play' height="40px" src='https://joplinapp.org/images/BadgeAndroid.png'/></a></td>
<td>or download the APK file: <a href="https://github.com/laurent22/joplin-android/releases/download/android-v1.6.7/joplin-v1.6.7.apk">64-bit</a> <a href="https://github.com/laurent22/joplin-android/releases/download/android-v1.6.7/joplin-v1.6.7-32bit.apk">32-bit</a></td> <td>or download the APK file: <a href="https://github.com/laurent22/joplin-android/releases/download/android-v1.4.11/joplin-v1.4.11.apk">64-bit</a> <a href="https://github.com/laurent22/joplin-android/releases/download/android-v1.4.11/joplin-v1.4.11-32bit.apk">32-bit</a></td>
</tr> </tr>
<tr> <tr>
<td>iOS</td> <td>iOS</td>
@@ -535,29 +535,22 @@ https://github.com/laurent22/joplin/blob/dev/README.md
<ul> <ul>
<li>Desktop, mobile and terminal applications.</li> <li>Desktop, mobile and terminal applications.</li>
<li><a href="https://joplinapp.org/clipper/">Web Clipper</a> for Firefox and Chrome.</li> <li><a href="https://joplinapp.org/clipper/">Web Clipper</a> for Firefox and Chrome.</li>
<li>End To End Encryption (E2EE).</li> <li>End To End Encryption (E2EE)</li>
<li>Note history (revisions).</li> <li>Note history (revisions)</li>
<li>Synchronisation with various services, including Nextcloud, Dropbox, WebDAV and OneDrive.</li> <li>Synchronisation with various services, including Nextcloud, Dropbox, WebDAV and OneDrive.</li>
<li>Offline first, so the entire data is always available on the device even without an internet connection.</li>
<li>Import Enex files (Evernote export format) and Markdown files.</li> <li>Import Enex files (Evernote export format) and Markdown files.</li>
<li>Export JEX files (Joplin Export format) and raw files.</li> <li>Export JEX files (Joplin Export format) and raw files.</li>
<li>Support notes, to-dos, tags and notebooks.</li> <li>Support notes, to-dos, tags and notebooks.</li>
<li>Goto Anything feature.</li>
<li>Sort notes by multiple criteria - title, updated time, etc.</li> <li>Sort notes by multiple criteria - title, updated time, etc.</li>
<li>Support for alarms (notifications) in mobile and desktop applications.</li> <li>Support for alarms (notifications) in mobile and desktop applications.</li>
<li>Offline first, so the entire data is always available on the device even without an internet connection.</li>
<li>Markdown notes, which are rendered with images and formatting in the desktop and mobile applications. Support for extra features such as math notation and checkboxes.</li> <li>Markdown notes, which are rendered with images and formatting in the desktop and mobile applications. Support for extra features such as math notation and checkboxes.</li>
<li>Choice of both Markdown and Rich Text (WYSIWYG) editors.</li> <li>File attachment support - images are displayed, and other files are linked and can be opened in the relevant application.</li>
<li>File attachment support - images are displayed, other files are linked and can be opened in the relevant application.</li>
<li>Inline display of PDF, video and audio files.</li>
<li>Goto Anything feature.</li>
<li>Search functionality.</li> <li>Search functionality.</li>
<li>Geo-location support.</li> <li>Geo-location support.</li>
<li>Supports multiple languages.</li> <li>Supports multiple languages</li>
<li>External editor support - open notes in your favorite external editor with one click in Joplin.</li> <li>External editor support - open notes in your favorite external editor with one click in Joplin.</li>
<li>Extensible functionality through plugin and data APIs.</li>
<li>Template support with data variables for auto creation of time &amp; dates.</li>
<li>Custom CSS support for customisation of both the rendered markdown and overall user interface.</li>
<li>Customisable layout allows toggling, movement and sizing of various elements.</li>
<li>Keyboard shortcuts are editable and allow binding of most Joplin commands with export/import functionality.</li>
</ul> </ul>
<h1>Importing<a name="importing" href="#importing" class="heading-anchor">🔗</a></h1> <h1>Importing<a name="importing" href="#importing" class="heading-anchor">🔗</a></h1>
<h2>Importing from Evernote<a name="importing-from-evernote" href="#importing-from-evernote" class="heading-anchor">🔗</a></h2> <h2>Importing from Evernote<a name="importing-from-evernote" href="#importing-from-evernote" class="heading-anchor">🔗</a></h2>
@@ -567,7 +560,7 @@ https://github.com/laurent22/joplin/blob/dev/README.md
<p>Recognition data - Evernote images, in particular scanned (or photographed) documents have <a href="https://en.wikipedia.org/wiki/Optical_character_recognition">recognition data</a> associated with them. It is the text that Evernote has been able to recognise in the document. This data is not preserved when the note are imported into Joplin. However, should it become supported in the search tool or other parts of Joplin, it should be possible to regenerate this recognition data since the actual image would still be available.</p> <p>Recognition data - Evernote images, in particular scanned (or photographed) documents have <a href="https://en.wikipedia.org/wiki/Optical_character_recognition">recognition data</a> associated with them. It is the text that Evernote has been able to recognise in the document. This data is not preserved when the note are imported into Joplin. However, should it become supported in the search tool or other parts of Joplin, it should be possible to regenerate this recognition data since the actual image would still be available.</p>
</li> </li>
<li> <li>
<p>Colour, font sizes and faces - Evernote text is stored as HTML and this is converted to Markdown during the import process. For notes that are mostly plain text or with basic formatting (bold, italic, bullet points, links, etc.) this is a lossless conversion, and the note, once rendered back to HTML should be very similar. Tables are also imported and converted to Markdown tables. For very complex notes, some formatting data might be lost - in particular colours, font sizes and font faces will not be imported. The text itself however is always imported in full regardless of formatting. If it is essential that this extra data is preserved then Joplin also allows import of ENEX files as HTML.</p> <p>Colour, font sizes and faces - Evernote text is stored as HTML and this is converted to Markdown during the import process. For notes that are mostly plain text or with basic formatting (bold, italic, bullet points, links, etc.) this is a lossless conversion, and the note, once rendered back to HTML should be very similar. Tables are also imported and converted to Markdown tables. For very complex notes, some formatting data might be lost - in particular colours, font sizes and font faces will not be imported. The text itself however is always imported in full regardless of formatting.</p>
</li> </li>
</ul> </ul>
<p>To import Evernote data, first export your Evernote notebooks to ENEX files as described <a href="https://help.evernote.com/hc/en-us/articles/209005557-How-to-back-up-export-and-restore-import-notes-and-notebooks">here</a>. Then follow these steps:</p> <p>To import Evernote data, first export your Evernote notebooks to ENEX files as described <a href="https://help.evernote.com/hc/en-us/articles/209005557-How-to-back-up-export-and-restore-import-notes-and-notebooks">here</a>. Then follow these steps:</p>
@@ -575,11 +568,7 @@ https://github.com/laurent22/joplin/blob/dev/README.md
<p>In the <strong>terminal application</strong>, in <a href="https://joplinapp.org/terminal/#command-line-mode">command-line mode</a>, type <code>import /path/to/file.enex</code>. This will import the notes into a new notebook named after the filename.</p> <p>In the <strong>terminal application</strong>, in <a href="https://joplinapp.org/terminal/#command-line-mode">command-line mode</a>, type <code>import /path/to/file.enex</code>. This will import the notes into a new notebook named after the filename.</p>
<h2>Importing from Markdown files<a name="importing-from-markdown-files" href="#importing-from-markdown-files" class="heading-anchor">🔗</a></h2> <h2>Importing from Markdown files<a name="importing-from-markdown-files" href="#importing-from-markdown-files" class="heading-anchor">🔗</a></h2>
<p>Joplin can import notes from plain Markdown file. You can either import a complete directory of Markdown files or individual files.</p> <p>Joplin can import notes from plain Markdown file. You can either import a complete directory of Markdown files or individual files.</p>
<p>In the <strong>desktop application</strong>:</p> <p>In the <strong>desktop application</strong>, open File &gt; Import &gt; MD and select your Markdown file or directory.</p>
<ul>
<li><strong>File import</strong>: Go to File &gt; Import &gt; MD - Markdown (file) and select the Markdown file. This file will then be imported to the currently selected Notebook.</li>
<li><strong>Directory import</strong>: Go to File &gt; Import &gt; MD - Markdown (directory) and select the top level of the directory that is being imported. Directory (folder) structure will be preserved in the Notebook &gt; Subnotebook &gt; Note structure within Joplin.</li>
</ul>
<p>In the <strong>terminal application</strong>, in <a href="https://joplinapp.org/terminal/#command-line-mode">command-line mode</a>, type <code>import --format md /path/to/file.md</code> or <code>import --format md /path/to/directory/</code>.</p> <p>In the <strong>terminal application</strong>, in <a href="https://joplinapp.org/terminal/#command-line-mode">command-line mode</a>, type <code>import --format md /path/to/file.md</code> or <code>import --format md /path/to/directory/</code>.</p>
<h2>Importing from other applications<a name="importing-from-other-applications" href="#importing-from-other-applications" class="heading-anchor">🔗</a></h2> <h2>Importing from other applications<a name="importing-from-other-applications" href="#importing-from-other-applications" class="heading-anchor">🔗</a></h2>
<p>In general the way to import notes from any application into Joplin is to convert the notes to ENEX files (Evernote format) and to import these ENEX files into Joplin using the method above. Most note-taking applications support ENEX files so it should be relatively straightforward. For help about specific applications, see below:</p> <p>In general the way to import notes from any application into Joplin is to convert the notes to ENEX files (Evernote format) and to import these ENEX files into Joplin using the method above. Most note-taking applications support ENEX files so it should be relatively straightforward. For help about specific applications, see below:</p>
@@ -590,16 +579,13 @@ https://github.com/laurent22/joplin/blob/dev/README.md
<li>NixNote: Synchronise with Evernote, then export the ENEX files and import them into Joplin. More info <a href="https://discourse.joplinapp.org/t/import-from-nixnote/183/3">in this thread</a>.</li> <li>NixNote: Synchronise with Evernote, then export the ENEX files and import them into Joplin. More info <a href="https://discourse.joplinapp.org/t/import-from-nixnote/183/3">in this thread</a>.</li>
</ul> </ul>
<h1>Exporting<a name="exporting" href="#exporting" class="heading-anchor">🔗</a></h1> <h1>Exporting<a name="exporting" href="#exporting" class="heading-anchor">🔗</a></h1>
<p>Joplin can export to the JEX format (Joplin Export file), which is a tar file that can contain multiple notes, notebooks, etc. This is a lossless format in that all the notes, but also metadata such as geo-location, updated time, tags, etc. are preserved. This format is convenient for backup purposes and can be re-imported into Joplin. A &quot;raw&quot; format is also available. This is the same as the JEX format except that the data is saved to a directory and each item represented by a single file.<br> <p>Joplin can export to the JEX format (Joplin Export file), which is a tar file that can contain multiple notes, notebooks, etc. This is a lossless format in that all the notes, but also metadata such as geo-location, updated time, tags, etc. are preserved. This format is convenient for backup purposes and can be re-imported into Joplin. A &quot;raw&quot; format is also available. This is the same as the JEX format except that the data is saved to a directory and each item represented by a single file.</p>
Joplin is also capable of exporting to a number of other formats including HTML and PDF which can be done for single notes, notebooks or everything.</p>
<h1>Synchronisation<a name="synchronisation" href="#synchronisation" class="heading-anchor">🔗</a></h1> <h1>Synchronisation<a name="synchronisation" href="#synchronisation" class="heading-anchor">🔗</a></h1>
<p>One of the goals of Joplin was to avoid being tied to any particular company or service, whether it is Evernote, Google or Microsoft. As such the synchronisation is designed without any hard dependency to any particular service. Most of the synchronisation process is done at an abstract level and access to external services, such as Nextcloud or Dropbox, is done via lightweight drivers. It is easy to support new services by creating simple drivers that provide a filesystem-like interface, i.e. the ability to read, write, delete and list items. It is also simple to switch from one service to another or to even sync to multiple services at once. Each note, notebook, tags, as well as the relation between items is transmitted as plain text files during synchronisation, which means the data can also be moved to a different application, can be easily backed up, inspected, etc.</p> <p>One of the goals of Joplin was to avoid being tied to any particular company or service, whether it is Evernote, Google or Microsoft. As such the synchronisation is designed without any hard dependency to any particular service. Most of the synchronisation process is done at an abstract level and access to external services, such as Nextcloud or Dropbox, is done via lightweight drivers. It is easy to support new services by creating simple drivers that provide a filesystem-like interface, i.e. the ability to read, write, delete and list items. It is also simple to switch from one service to another or to even sync to multiple services at once. Each note, notebook, tags, as well as the relation between items is transmitted as plain text files during synchronisation, which means the data can also be moved to a different application, can be easily backed up, inspected, etc.</p>
<p>Currently, synchronisation is possible with Nextcloud, WebDAV, Dropbox, OneDrive or the local filesystem. To enable synchronisation please follow the instructions below. After that, the application will synchronise in the background whenever it is running, or you can click on &quot;Synchronise&quot; to start a synchronisation manually. Joplin will background sync automatically after any content change is made on the local application.</p> <p>Currently, synchronisation is possible with Nextcloud, Dropbox, OneDrive or the local filesystem. To enable synchronisation please follow the instructions below. After that, the application will synchronise in the background whenever it is running, or you can click on &quot;Synchronise&quot; to start a synchronisation manually.</p>
<p>If the <strong>terminal client</strong> has been installed, it is possible to also synchronise outside of the user interface by typing <code>joplin sync</code> from the terminal. This can be used to setup a cron script to synchronise at a regular interval. For example, this would do it every 30 minutes:</p>
<p><code>*/30 * * * * /path/to/joplin sync</code></p>
<h2>Nextcloud synchronisation<a name="nextcloud-synchronisation" href="#nextcloud-synchronisation" class="heading-anchor">🔗</a></h2> <h2>Nextcloud synchronisation<a name="nextcloud-synchronisation" href="#nextcloud-synchronisation" class="heading-anchor">🔗</a></h2>
<p><img src="https://joplinapp.org/images/nextcloud-logo-background.png" width="100" align="left"> <a href="https://nextcloud.com/">Nextcloud</a> is a self-hosted, private cloud solution. It can store documents, images and videos but also calendars, passwords and countless other things and can sync them to your laptop or phone. As you can host your own Nextcloud server, you own both the data on your device and infrastructure used for synchronisation. As such it is a good fit for Joplin. The platform is also well supported and with a strong community, so it is likely to be around for a while - since it's open source anyway, it is not a service that can be closed, it can exist on a server for as long as one chooses.</p> <p><img src="https://joplinapp.org/images/nextcloud-logo-background.png" width="100" align="left"> <a href="https://nextcloud.com/">Nextcloud</a> is a self-hosted, private cloud solution. It can store documents, images and videos but also calendars, passwords and countless other things and can sync them to your laptop or phone. As you can host your own Nextcloud server, you own both the data on your device and infrastructure used for synchronisation. As such it is a good fit for Joplin. The platform is also well supported and with a strong community, so it is likely to be around for a while - since it's open source anyway, it is not a service that can be closed, it can exist on a server for as long as one chooses.</p>
<p>In the <strong>desktop application</strong> or <strong>mobile application</strong>, go to the Configuration screen and select Nextcloud as the synchronisation target. Then input the WebDAV URL (to get it, click on Settings in the bottom left corner of the page, in Nextcloud), this is normally <code>https://example.com/nextcloud/remote.php/webdav/Joplin</code> (<strong>make sure to create the &quot;Joplin&quot; directory in Nextcloud</strong>), and set the username and password. If it does not work, please <a href="https://github.com/laurent22/joplin/issues/61#issuecomment-373282608">see this explanation</a> for more details.</p> <p>In the <strong>desktop application</strong> or <strong>mobile application</strong>, go to the config screen and select Nextcloud as the synchronisation target. Then input the WebDAV URL (to get it, click on Settings in the bottom left corner of the page, in Nextcloud), this is normally <code>https://example.com/nextcloud/remote.php/webdav/Joplin</code> (<strong>make sure to create the &quot;Joplin&quot; directory in Nextcloud</strong>), and set the username and password. If it does not work, please <a href="https://github.com/laurent22/joplin/issues/61#issuecomment-373282608">see this explanation</a> for more details.</p>
<p>In the <strong>terminal application</strong>, you will need to set the <code>sync.target</code> config variable and all the <code>sync.5.path</code>, <code>sync.5.username</code> and <code>sync.5.password</code> config variables to, respectively the Nextcloud WebDAV URL, your username and your password. This can be done from the command line mode using:</p> <p>In the <strong>terminal application</strong>, you will need to set the <code>sync.target</code> config variable and all the <code>sync.5.path</code>, <code>sync.5.username</code> and <code>sync.5.password</code> config variables to, respectively the Nextcloud WebDAV URL, your username and your password. This can be done from the command line mode using:</p>
<pre><code>:config sync.5.path https://example.com/nextcloud/remote.php/webdav/Joplin <pre><code>:config sync.5.path https://example.com/nextcloud/remote.php/webdav/Joplin
:config sync.5.username YOUR_USERNAME :config sync.5.username YOUR_USERNAME
@@ -607,8 +593,14 @@ Joplin is also capable of exporting to a number of other formats including HTML
:config sync.target 5 :config sync.target 5
</code></pre> </code></pre>
<p>If synchronisation does not work, please consult the logs in the app profile directory - it is often due to a misconfigured URL or password. The log should indicate what the exact issue is.</p> <p>If synchronisation does not work, please consult the logs in the app profile directory - it is often due to a misconfigured URL or password. The log should indicate what the exact issue is.</p>
<h2>Dropbox synchronisation<a name="dropbox-synchronisation" href="#dropbox-synchronisation" class="heading-anchor">🔗</a></h2>
<p>When syncing with Dropbox, Joplin creates a sub-directory in Dropbox, in <code>/Apps/Joplin</code> and read/write the notes and notebooks from it. The application does not have access to anything outside this directory.</p>
<p>In the <strong>desktop application</strong> or <strong>mobile application</strong>, select &quot;Dropbox&quot; as the synchronisation target in the config screen (it is selected by default). Then, to initiate the synchronisation process, click on the &quot;Synchronise&quot; button in the sidebar and follow the instructions.</p>
<p>In the <strong>terminal application</strong>, to initiate the synchronisation process, type <code>:sync</code>. You will be asked to follow a link to authorise the application. It is possible to also synchronise outside of the user interface by typing <code>joplin sync</code> from the terminal. This can be used to setup a cron script to synchronise at regular interval. For example, this would do it every 30 minutes:</p>
<pre><code>*/30 * * * * /path/to/joplin sync
</code></pre>
<h2>WebDAV synchronisation<a name="webdav-synchronisation" href="#webdav-synchronisation" class="heading-anchor">🔗</a></h2> <h2>WebDAV synchronisation<a name="webdav-synchronisation" href="#webdav-synchronisation" class="heading-anchor">🔗</a></h2>
<p>Select the &quot;WebDAV&quot; synchronisation target and follow the same instructions as for Nextcloud above (for the <strong>terminal application</strong> you will need to select sync target 6 rather than 5)</p> <p>Select the &quot;WebDAV&quot; synchronisation target and follow the same instructions as for Nextcloud above.</p>
<p>WebDAV-compatible services that are known to work with Joplin:</p> <p>WebDAV-compatible services that are known to work with Joplin:</p>
<ul> <ul>
<li><a href="https://httpd.apache.org/docs/current/mod/mod_dav.html">Apache WebDAV Module</a></li> <li><a href="https://httpd.apache.org/docs/current/mod/mod_dav.html">Apache WebDAV Module</a></li>
@@ -624,25 +616,21 @@ Joplin is also capable of exporting to a number of other formats including HTML
<li><a href="https://www.schimera.com/products/webdav-nav-server/">WebDAV Nav</a>, a macOS server.</li> <li><a href="https://www.schimera.com/products/webdav-nav-server/">WebDAV Nav</a>, a macOS server.</li>
<li><a href="https://www.zimbra.com/">Zimbra</a></li> <li><a href="https://www.zimbra.com/">Zimbra</a></li>
</ul> </ul>
<h2>Dropbox synchronisation<a name="dropbox-synchronisation" href="#dropbox-synchronisation" class="heading-anchor">🔗</a></h2>
<p>When syncing with Dropbox, Joplin creates a sub-directory in Dropbox, in <code>/Apps/Joplin</code> and read/write the notes and notebooks from it. The application does not have access to anything outside this directory.</p>
<p>In the <strong>desktop application</strong> or <strong>mobile application</strong>, select &quot;Dropbox&quot; as the synchronisation target in the Configuration screen (it is selected by default). Then, to initiate the synchronisation process, click on the &quot;Synchronise&quot; button in the sidebar and follow the instructions.</p>
<p>In the <strong>terminal application</strong>, to initiate the synchronisation process, type <code>:sync</code>. You will be asked to follow a link to authorise the application.</p>
<h2>OneDrive synchronisation<a name="onedrive-synchronisation" href="#onedrive-synchronisation" class="heading-anchor">🔗</a></h2> <h2>OneDrive synchronisation<a name="onedrive-synchronisation" href="#onedrive-synchronisation" class="heading-anchor">🔗</a></h2>
<p>When syncing with OneDrive, Joplin creates a sub-directory in OneDrive, in /Apps/Joplin and read/write the notes and notebooks from it. The application does not have access to anything outside this directory.</p> <p>When syncing with OneDrive, Joplin creates a sub-directory in OneDrive, in /Apps/Joplin and read/write the notes and notebooks from it. The application does not have access to anything outside this directory.</p>
<p>In the <strong>desktop application</strong> or <strong>mobile application</strong>, select &quot;OneDrive&quot; as the synchronisation target in the Configuration screen. Then, to initiate the synchronisation process, click on the &quot;Synchronise&quot; button in the sidebar and follow the instructions.</p> <p>In the <strong>desktop application</strong> or <strong>mobile application</strong>, select &quot;OneDrive&quot; as the synchronisation target in the config screen. Then, to initiate the synchronisation process, click on the &quot;Synchronise&quot; button in the sidebar and follow the instructions.</p>
<p>In the <strong>terminal application</strong>, to initiate the synchronisation process, type <code>:sync</code>. You will be asked to follow a link to authorise the application (simply input your Microsoft credentials - you do not need to register with OneDrive).</p> <p>In the <strong>terminal application</strong>, to initiate the synchronisation process, type <code>:sync</code>. You will be asked to follow a link to authorise the application (simply input your Microsoft credentials - you do not need to register with OneDrive).</p>
<h1>Encryption<a name="encryption" href="#encryption" class="heading-anchor">🔗</a></h1> <h1>Encryption<a name="encryption" href="#encryption" class="heading-anchor">🔗</a></h1>
<p>Joplin supports end-to-end encryption (E2EE) on all the applications. E2EE is a system where only the owner of the notes, notebooks, tags or resources can read them. It prevents potential eavesdroppers - including telecom providers, internet providers, and even the developers of Joplin from being able to access the data. Please see the <a href="https://joplinapp.org/e2ee/">End-To-End Encryption Tutorial</a> for more information about this feature and how to enable it.</p> <p>Joplin supports end-to-end encryption (E2EE) on all the applications. E2EE is a system where only the owner of the notes, notebooks, tags or resources can read them. It prevents potential eavesdroppers - including telecom providers, internet providers, and even the developers of Joplin from being able to access the data. Please see the <a href="https://joplinapp.org/e2ee/">End-To-End Encryption Tutorial</a> for more information about this feature and how to enable it.</p>
<p>For a more technical description, mostly relevant for development or to review the method being used, please see the <a href="https://joplinapp.org/spec/e2ee/">Encryption specification</a>.</p> <p>For a more technical description, mostly relevant for development or to review the method being used, please see the <a href="https://joplinapp.org/spec/e2ee/">Encryption specification</a>.</p>
<h1>Note history<a name="note-history" href="#note-history" class="heading-anchor">🔗</a></h1> <h1>Note history<a name="note-history" href="#note-history" class="heading-anchor">🔗</a></h1>
<p>The Joplin applications automatically save previous versions of your notes at regular intervals. These versions are synced across devices and can be viewed from the desktop application. To do so, click on the &quot;Information&quot; button on a note, then click on &quot;Previous version of this note&quot;. From this screen you can view the previous versions of the note as well as restore any of them.</p> <p>The Joplin applications automatically save previous versions of your notes at regular intervals. These versions are synced across devices and can be viewed from the desktop application. To do so, click on the &quot;Information&quot; button on a note, then click on &quot;Previous version of this note&quot;. From this screen you can view the previous versions of the note as well as restore any of them.</p>
<p>This feature can be disabled from the &quot;Note history&quot; section in the Configuration screen, and it is also possible to change for how long the history of a note is saved.</p> <p>This feature can be disabled from the &quot;Note history&quot; section in the settings, and it is also possible to change for how long the history of a note is saved.</p>
<p>More information please see the <a href="https://joplinapp.org/note_history/">Note History page</a>.</p> <p>More information about this feature in the <a href="https://www.patreon.com/posts/note-history-now-27083082">announcement post</a>.</p>
<h1>External text editor<a name="external-text-editor" href="#external-text-editor" class="heading-anchor">🔗</a></h1> <h1>External text editor<a name="external-text-editor" href="#external-text-editor" class="heading-anchor">🔗</a></h1>
<p>Joplin notes can be opened and edited using an external editor of your choice. It can be a simple text editor like Notepad++ or Sublime Text or an actual Markdown editor like Typora. In that case, images will also be displayed within the editor. To open the note in an external editor, click on the icon in the toolbar or press Ctrl+E (or Cmd+E). Your default text editor will be used to open the note. If needed, you can also specify the editor directly in the General Options, under &quot;Text editor command&quot;.</p> <p>Joplin notes can be opened and edited using an external editor of your choice. It can be a simple text editor like Notepad++ or Sublime Text or an actual Markdown editor like Typora. In that case, images will also be displayed within the editor. To open the note in an external editor, click on the icon in the toolbar or press Ctrl+E (or Cmd+E). Your default text editor will be used to open the note. If needed, you can also specify the editor directly in the General Options, under &quot;Text editor command&quot;.</p>
<h1>Attachments<a name="attachments" href="#attachments" class="heading-anchor">🔗</a></h1> <h1>Attachments<a name="attachments" href="#attachments" class="heading-anchor">🔗</a></h1>
<p>Any kind of file can be attached to a note. In Markdown, links to these files are represented as a simple ID to the attachment, clicking on this link will open the file in the default application. In the case of audio, video and pdf files, these will be displayed inline with the note and so can be viewed or played within Joplin.</p> <p>Any kind of file can be attached to a note. In Markdown, links to these files are represented as a simple ID to the attachment. In the note viewer, these files, if they are images, will be displayed or, if they are other files (PDF, text files, etc.) they will be displayed as links. Clicking on this link will open the file in the default application.</p>
<p>In the <strong>desktop application</strong>, files can be attached either by clicking the &quot;Attach file&quot; icon in the editor or via drag and drop. If you prefer to create a link to a local file instead, hold the ALT key while performing the drag and drop operation. You can also copy and paste images directly in the editor via Ctrl+V.</p> <p>In the <strong>desktop application</strong>, files can be attached either by clicking the &quot;Attach file&quot; icon in the editor or via drag and drop. If you prefer to create a link to a local file instead, hold the ALT key while performing the drag and drop operation. You can also copy and paste images directly in the editor via Ctrl+V.</p>
<p>Resources that are not attached to any note will be automatically deleted in accordance to the <a href="#note-history">Note History</a> settings.</p> <p>Resources that are not attached to any note will be automatically deleted in accordance to the <a href="#note-history">Note History</a> settings.</p>
<p><strong>Important:</strong> Resources larger than 10 MB are not currently supported on mobile. They will crash the application when synchronising so it is recommended not to attach such resources at the moment. The issue is being looked at.</p> <p><strong>Important:</strong> Resources larger than 10 MB are not currently supported on mobile. They will crash the application when synchronising so it is recommended not to attach such resources at the moment. The issue is being looked at.</p>
@@ -669,11 +657,11 @@ Joplin is also capable of exporting to a number of other formats including HTML
<h1>Markdown<a name="markdown" href="#markdown" class="heading-anchor">🔗</a></h1> <h1>Markdown<a name="markdown" href="#markdown" class="heading-anchor">🔗</a></h1>
<p>Joplin uses and renders a Github-flavoured Markdown with a few variations and additions. In particular it adds math formula support, interactive checkboxes and support for note links. Joplin also supports Markdown plugins which allow enabling and disabling various advanced Markdown features. Have a look at the <a href="https://joplinapp.org/markdown/">Markdown Guide</a> for more information.</p> <p>Joplin uses and renders a Github-flavoured Markdown with a few variations and additions. In particular it adds math formula support, interactive checkboxes and support for note links. Joplin also supports Markdown plugins which allow enabling and disabling various advanced Markdown features. Have a look at the <a href="https://joplinapp.org/markdown/">Markdown Guide</a> for more information.</p>
<h1>Custom CSS<a name="custom-css" href="#custom-css" class="heading-anchor">🔗</a></h1> <h1>Custom CSS<a name="custom-css" href="#custom-css" class="heading-anchor">🔗</a></h1>
<p>Rendered markdown can be customized by placing a userstyle file in the profile directory <code>~/.config/joplin-desktop/userstyle.css</code> (This path might be different on your device - check at the top of the <code>General</code> page of the Configuration menu for the exact path). This file supports standard CSS syntax. Joplin <em><strong>must</strong></em> be restarted for the new css to be applied, please ensure that Joplin is not closing to the tray, but is actually exiting. Note that this file is used for both displaying the notes and printing the notes. Be aware how the CSS may look printed (for example, printing white text over a black background is usually not wanted).</p> <p>Rendered markdown can be customized by placing a userstyle file in the profile directory <code>~/.config/joplin-desktop/userstyle.css</code> (This path might be different on your device - check at the top of the Config screen for the exact path). This file supports standard CSS syntax. Joplin <em><strong>must</strong></em> be restarted for the new css to be applied, please ensure that Joplin is not closing to the tray, but is actually exiting. Note that this file is used for both displaying the notes and printing the notes. Be aware how the CSS may look printed (for example, printing white text over a black background is usually not wanted).</p>
<p>The whole UI can be customized by placing a custom editor style file in the profile directory <code>~/.config/joplin-desktop/userchrome.css</code>.</p> <p>The whole UI can be customized by placing a custom editor style file in the profile directory <code>~/.config/joplin-desktop/userchrome.css</code>.</p>
<p>Important: userstyle.css and userchrome.css are provided for your convenience, but they are advanced settings, and styles you define may break from one version to the next. If you want to use them, please know that it might require regular development work from you to keep them working. The Joplin team cannot make a commitment to keep the application HTML structure stable.</p> <p>Important: userstyle.css and userchrome.css are provided for your convenience, but they are advanced settings, and styles you define may break from one version to the next. If you want to use them, please know that it might require regular development work from you to keep them working. The Joplin team cannot make a commitment to keep the application HTML structure stable.</p>
<h1>Note templates<a name="note-templates" href="#note-templates" class="heading-anchor">🔗</a></h1> <h1>Note templates<a name="note-templates" href="#note-templates" class="heading-anchor">🔗</a></h1>
<p>In the <strong>desktop app</strong>, templates can be used to create new notes or to insert into existing ones by adding a template file to the <code>templates</code> directory (File &gt; Templates). For example creating the file <code>hours.md</code> in the <code>templates</code> directory with the contents:</p> <p>In the <strong>desktop app</strong>, templates can be used to create new notes or to insert into existing ones by creating a <code>templates</code> folder in Joplin's config folder and placing Markdown template files into it. For example creating the file <code>hours.md</code> in the <code>templates</code> directory with the contents:</p>
<pre><code class="language-markdown">Date: {{date}} <pre><code class="language-markdown">Date: {{date}}
Hours: Hours:
Details: Details:
@@ -721,10 +709,6 @@ Details:
</tr> </tr>
</tbody> </tbody>
</table> </table>
<h1>Plugins<a name="plugins" href="#plugins" class="heading-anchor">🔗</a></h1>
<p>The <strong>desktop app</strong> has the ability to extend beyond its standard functionality by the way of plugins. These plugins adhere to the Joplin plugin API and can be installed &amp; configured within the application via the <code>Plugins</code> page in the Configuration screen. This menu allows the manual installation of the plugin using the single 'Joplin Plugin Archive' (*.jpl) file. Once the application is reloaded the plugins will appear within the plugins menu where they can be toggled on/off or removed entirely.</p>
<p>Plugins are currently maintained by the community in the <a href="https://discourse.joplinapp.org/c/plugins/18">Joplin Discourse 'plugins' category</a>.</p>
<p>For more information see <a href="https://joplinapp.org/plugins/">Plugins</a></p>
<h1>Searching<a name="searching" href="#searching" class="heading-anchor">🔗</a></h1> <h1>Searching<a name="searching" href="#searching" class="heading-anchor">🔗</a></h1>
<p>Joplin implements the SQLite Full Text Search (FTS4) extension. It means the content of all the notes is indexed in real time and search queries return results very fast. Both <a href="https://www.sqlite.org/fts3.html#simple_fts_queries">Simple FTS Queries</a> and <a href="https://www.sqlite.org/fts3.html#full_text_index_queries">Full-Text Index Queries</a> are supported. See below for the list of supported queries:</p> <p>Joplin implements the SQLite Full Text Search (FTS4) extension. It means the content of all the notes is indexed in real time and search queries return results very fast. Both <a href="https://www.sqlite.org/fts3.html#simple_fts_queries">Simple FTS Queries</a> and <a href="https://www.sqlite.org/fts3.html#full_text_index_queries">Full-Text Index Queries</a> are supported. See below for the list of supported queries:</p>
<h2>Supported queries<a name="supported-queries" href="#supported-queries" class="heading-anchor">🔗</a></h2> <h2>Supported queries<a name="supported-queries" href="#supported-queries" class="heading-anchor">🔗</a></h2>

View File

@@ -404,7 +404,7 @@ https://github.com/laurent22/joplin/blob/dev/readme/nextcloud_app.md
<h1>Joplin Web API for Nextcloud<a name="joplin-web-api-for-nextcloud" href="#joplin-web-api-for-nextcloud" class="heading-anchor">🔗</a></h1> <h1>Joplin Web API for Nextcloud<a name="joplin-web-api-for-nextcloud" href="#joplin-web-api-for-nextcloud" class="heading-anchor">🔗</a></h1>
<hr> <hr>
<p><strong>IMPORTANT: THIS APPLICATION IS DEPRECATED AND WILL NO LONGER BE SUPPORTED FROM JOPLIN 1.6.x</strong></p> <p><strong>IMPORTANT: THIS APPLICATION IS DEPRECATED AND WILL NO LONGER BE SUPPORTED FROM JOPLIN 1.6.x</strong></p>
<p>It is <a href="https://discourse.joplinapp.org/t/joplin-web-api-for-nextcloud/4491/72?u=laurent">deprecated</a> in favour of <a href="https://discourse.joplinapp.org/t/joplin-server-pre-release-is-now-available/13605">Joplin Server</a>, so if you are relying on it please do not upgrade to Joplin 1.6.x till you are ready to migrate to Joplin Server or some other alternative.</p> <p>It is deprecated in favour of <a href="https://discourse.joplinapp.org/t/joplin-web-api-for-nextcloud/4491/72?u=laurent">Joplin Server</a>, so if you are relying on it please do not upgrade to Joplin 1.6.x till you are ready to migrate to Joplin Server or some other alternative.</p>
<hr> <hr>
<p><strong>This is a beta feature, not yet completed. More info coming soon!</strong></p> <p><strong>This is a beta feature, not yet completed. More info coming soon!</strong></p>
<p>The app can be downloaded from there: <a href="https://apps.nextcloud.com/apps/joplin">https://apps.nextcloud.com/apps/joplin</a></p> <p>The app can be downloaded from there: <a href="https://apps.nextcloud.com/apps/joplin">https://apps.nextcloud.com/apps/joplin</a></p>

View File

@@ -1,462 +0,0 @@
<!doctype html>
<html>
<!--
!!! WARNING !!!
This file was auto-generated from readme/note_history.md and any manual change
made to it will be overwritten. To make a change to this file please modify
the source Markdown file:
https://github.com/laurent22/joplin/blob/dev/readme/note_history.md
-->
<head>
<title>Note History | Joplin</title>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://joplinapp.org/css/bootstrap.min.css">
<link rel="shortcut icon" type="image/x-icon" href="https://joplinapp.org/favicon.ico">
<!-- <link rel="stylesheet" href="https://joplinapp.org/css/fontawesome-all.min.css"> -->
<link rel="stylesheet" href="https://joplinapp.org/css/fork-awesome.min.css">
<script src="https://joplinapp.org/js/jquery-3.2.1.slim.min.js"></script>
<style>
body {
background-color: #F1F1F1;
color: #333333;
}
.root {
overflow: hidden;
}
a[href^="mailto:"] {
word-break: break-all;
}
table {
margin-bottom: 1em;
}
td, th {
padding: .8em;
border: 1px solid #ccc;
}
.page-markdown table pre,
.page-markdown table blockquote {
margin-bottom: 0;
}
.page-markdown table pre,
.page-markdown table blockquote {
margin-bottom: 0;
}
.page-markdown table pre {
background-color: rgba(0,0,0,0);
border: none;
margin: 0;
padding: 0;
}
h1, h2 {
border-bottom: 1px solid #eaecef;
padding-bottom: 0.3em;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
font-weight: 600;
font-size: 2em;
margin-bottom: 16px;
}
h2 {
font-size: 1.6em;
}
h3 {
font-size: 1.3em;
}
code {
color: black;
background-color: #eee;
border: 1px solid #ccc;
font-size: .85em;
/* word-break: break-all; */
}
pre code {
border: none;
}
pre {
font-size: .85em;
}
blockquote {
font-size: 1em;
color: #555;
};
#toc ul {
margin-bottom: 10px;
}
#toc > ul > li {
margin-bottom: 10px;
}
#toc {
padding-bottom: 1em;
}
.title {
display: flex;
align-items: center;
}
.title-icon {
display: flex;
height: 1em;
}
.title-text {
display: flex;
font-weight: normal;
margin-bottom: .2em;
margin-left: .5em;
}
.sub-title {
font-weight: normal;
}
.container {
background-color: white;
padding: 0;
box-shadow: 0 10px 20px #888888;
}
table.screenshots {
margin-top: 2em;
margin-bottom: 2em;
}
table.screenshots th {
height: 3em;
text-align: center;
}
table.screenshots th,
table.screenshots td {
border: 1px solid #C2C2C2;
}
img[align="left"] {
margin-right: 10px;
margin-bottom: 10px;
}
.mobile-screenshot {
height: 40em;
padding: 1em;
}
.cli-screenshot-wrapper {
background-color: black;
vertical-align: top;
padding: 1em 2em 1em 1em;
}
.cli-screenshot {
font-family: "Monaco", "Inconsolata", "CONSOLAS", "Deja Vu Sans Mono", "Droid Sans Mono", "Andale Mono", monospace;
background-color: black;
color: white;
border: none;
}
.cli-screenshot .prompt {
color: #48C2F0;
}
.top-screenshot {
margin-top: 2em;
text-align: center;
}
.header {
position: relative;
padding-left: 2em;
padding-right: 2em;
padding-top: 1em;
padding-bottom: 1em;
color: white;
background-color: #2B2B3D;
}
.header a h1 {
color: white;
}
.header a:hover {
text-decoration: none;
}
.content {
padding-left: 2em;
padding-right: 2em;
padding-bottom: 2em;
padding-top: 2em;
}
.forkme {
position: absolute;
right: 0;
top:0;
}
.nav-wrapper {
position: relative;
width: inherit;
}
.nav {
background-color: black;
display: flex;
flex-direction: row;
align-items: center;
}
.nav.sticky {
position:fixed;
top: 0;
width: inherit;
box-shadow: 0 0 10px #000000;
}
.nav a {
color: white;
display: inline-block;
padding: .6em .9em .6em .9em;
}
.nav ul {
padding-left: 2em;
margin-bottom: 0;
display: table-cell;
display: flex;
width: 100%;
}
.nav ul li {
display: inline-block;
padding: 0;
}
.nav li.selected {
background-color: #222;
font-weight: bold;
}
.nav-right {
display: flex;
text-align: right;
vertical-align: middle;
line-height: 0;
margin-right: 10px;
}
.nav-right .share-btn {
display: none;
}
.nav-right .small-share-btn {
display: none;
}
.footer {
padding: 2em;
border-top: 1px solid #d4d4d4;
margin-top: 2em;
color: gray;
font-size: .9em;
}
a.heading-anchor {
display: inline-block;
opacity: 0;
width: 1.3em;
font-size: 0.7em;
margin-left: 0.4em;
line-height: 1em;
text-decoration: none;
transition: opacity 0.3s;
}
a.heading-anchor:hover,
h1:hover a.heading-anchor,
h2:hover a.heading-anchor,
h3:hover a.heading-anchor,
h4:hover a.heading-anchor,
h5:hover a.heading-anchor,
h6:hover a.heading-anchor {
opacity: 1;
}
@media (min-width: 992px) {
.content{
display: flex;
}
#toc{
display: block!important;
align-self: flex-start;
width: 300px;
position: sticky; top: 20px; left: 0;
}
.main{
width: calc(100% - 300px);
}
}
.bottom-links {
display: flex;
justify-content: center;
border-top: 1px solid #d4d4d4;
margin-top: 30px;
padding-top: 25px;
}
@media all and (min-width: 400px) {
.nav-right .share-btn {
display: inline-block;
}
.nav-right .small-share-btn {
display: none;
}
}
</style>
</head>
<body>
<div class="container root page-note_history">
<div class="header">
<a class="forkme" href="https://github.com/laurent22/joplin"><img src="https://joplinapp.org/images/ForkMe.png"/></a>
<a href="https://joplinapp.org"><h1 class="title"><img class="title-icon" src="https://joplinapp.org/images/Icon512.png"><span class="title-text">Joplin</span></h1></a>
<p class="sub-title">An open source note taking and to-do application with synchronisation capabilities</p>
</div>
<div class="nav-wrapper">
<div class="nav">
<ul>
<li class=""><a href="https:&#x2F;&#x2F;joplinapp.org/" title="Home"><i class="fa fa-home"></i></a></li>
<li><a href="https://discourse.joplinapp.org" title="Forum">Forum</a></li>
<li><a class="help" href="#" title="Menu">Menu</a></li>
<!-- <li><a class="gsod" href="https://joplinapp.org/gsod2020/" title="Google Season of Docs 2020">GSoD 2020</a></li> -->
</ul>
<div class="nav-right">
<!--
<iframe class="share-btn" src="https://www.facebook.com/plugins/share_button.php?href=http%3A%2F%2Fjoplinapp.org&layout=button&size=small&mobile_iframe=true&width=60&height=20&appId" width="60" height="20" style="border:none;overflow:hidden" scrolling="no" frameborder="0" allowTransparency="true"></iframe>
<iframe class="share-btn" src="https://platform.twitter.com/widgets/tweet_button.html?url=http%3A%2F%2Fjoplinapp.org" width="62" height="20" title="Tweet" style="border: 0; overflow: hidden;"></iframe>
-->
<iframe class="share-btn share-btn-github" src="https://ghbtns.com/github-btn.html?user=laurent22&repo=joplin&type=star&count=true" frameborder="0" scrolling="0" width="100px" height="20px"></iframe>
</div>
</div>
</div>
<div class="content">
<div id="toc"><ul>
<li>
<p>Applications</p>
<ul>
<li><a href="https://joplinapp.org/desktop/">Desktop application</a></li>
<li><a href="https://joplinapp.org/mobile/">Mobile applications</a></li>
<li><a href="https://joplinapp.org/terminal/">Terminal application</a></li>
<li><a href="https://joplinapp.org/clipper/">Web Clipper</a></li>
</ul>
</li>
<li>
<p>Support</p>
<ul>
<li><a href="https://discourse.joplinapp.org">Joplin Forum</a></li>
<li><a href="https://joplinapp.org/markdown/">Markdown Guide</a></li>
<li><a href="https://joplinapp.org/e2ee/">How to enable end-to-end encryption</a></li>
<li><a href="https://joplinapp.org/conflict/">What is a conflict?</a></li>
<li><a href="https://joplinapp.org/debugging/">How to enable debug mode</a></li>
<li><a href="https://joplinapp.org/rich_text_editor/">About the Rich Text editor limitations</a></li>
<li><a href="https://joplinapp.org/faq/">FAQ</a></li>
</ul>
</li>
<li>
<p>Joplin API - Get Started</p>
<ul>
<li><a href="https://joplinapp.org/api/overview/">Joplin API Overview</a></li>
<li><a href="https://joplinapp.org/api/get_started/plugins/">Plugin development</a></li>
<li><a href="https://joplinapp.org/api/tutorials/toc_plugin/">Plugin tutorial</a></li>
</ul>
</li>
<li>
<p>Joplin API - References</p>
<ul>
<li><a href="https://joplinapp.org/api/references/plugin_api/classes/joplin.html">Plugin API</a></li>
<li><a href="https://joplinapp.org/api/references/rest_api/">Data API</a></li>
<li><a href="https://joplinapp.org/api/references/plugin_manifest/">Plugin manifest</a></li>
<li><a href="https://joplinapp.org/api/references/plugin_loading_rules/">Plugin loading rules</a></li>
</ul>
</li>
<li>
<p>Development</p>
<ul>
<li><a href="https://github.com/laurent22/joplin/blob/dev/BUILD.md">How to build the apps</a></li>
<li><a href="https://joplinapp.org/spec/e2ee/">End-to-end encryption spec</a></li>
<li><a href="https://joplinapp.org/spec/history/">Note History spec</a></li>
<li><a href="https://joplinapp.org/spec/sync_lock/">Sync Lock spec</a></li>
<li><a href="https://joplinapp.org/spec/plugins/">Plugin Architecture spec</a></li>
<li><a href="https://joplinapp.org/spec/search_sorting/">Search Sorting spec</a></li>
<li><a href="https://joplinapp.org/spec/server_file_url_format/">Server: File URL Format</a></li>
<li><a href="https://joplinapp.org/spec/server_delta_sync/">Server: Delta Sync</a></li>
</ul>
</li>
<li>
<p>Google Summer of Code 2020</p>
<ul>
<li><a href="https://joplinapp.org/gsoc2020/index/">Google Summer of Code 2020</a></li>
<li><a href="https://joplinapp.org/gsoc2020/ideas/">Project Ideas</a></li>
</ul>
</li>
<li>
<p>About</p>
<ul>
<li><a href="https://joplinapp.org/changelog/">Changelog (Desktop App)</a></li>
<li><a href="https://joplinapp.org/changelog_cli/">Changelog (CLI App)</a></li>
<li><a href="https://joplinapp.org/stats/">Stats</a></li>
<li><a href="https://joplinapp.org/donate/">Donate</a></li>
</ul>
</li>
</ul>
</div>
<div class="main">
<h1>Note History<a name="note-history" href="#note-history" class="heading-anchor">🔗</a></h1>
<p>Joplin has support for note history. The applications (desktop, mobile and CLI) now preserve previous versions of the notes, so you can inspect or restore them later on as needed.</p>
<p>A common complain with many sync-based note taking apps is that they work in an opaque way - sometimes notes are changed or they disappear and it's not clear why - it could be a user error, or some bug, but regardless it makes it hard to trust the app with thousands of notes. So this feature give transparency over what's happening - if some note seems to be gone or changed when it shouldn't, the redundant data allows investigating the issue and restoring content.</p>
<p>Another medium term goal is to allow the implementation of a recycle bin. Behind the scene, this is essentially already done since whenever a note is deleted, a final revision of that note is preserved. What's missing is a user interface (i.e. the recycle bin) to view these deleted notes.</p>
<h3>How does it work?<a name="how-does-it-work" href="#how-does-it-work" class="heading-anchor">🔗</a></h3>
<p>All the apps save a version of the modified notes every 10 minutes. These revisions are then synced across all the devices so if you're looking for a particular version of a note that was made on mobile, you can later find that version on the desktop app too.</p>
<h3>How to view the history of a note?<a name="how-to-view-the-history-of-a-note" href="#how-to-view-the-history-of-a-note" class="heading-anchor">🔗</a></h3>
<p>While all the apps save revisions, currently only the desktop one allow viewing these revisions.</p>
<p>To do so, click on the Information icon in the toolbar, then select &quot;Previous version of this note&quot;.</p>
<p><img src="https://raw.githubusercontent.com/laurent22/joplin/dev/readme/blog/images/20190523-231026_0.png" alt=""></p>
<p>The next screen will show the latest version of the note. You can then choose to view a different version, if any, or to restore one of them.</p>
<p>To restore a note, simply click on the &quot;Restore&quot; button. The old version of the note will be copied in a folder called &quot;Restored Notes&quot;. The current version of the note will not be replaced or modified.</p>
<p><img src="https://raw.githubusercontent.com/laurent22/joplin/dev/readme/blog/images/20190523-231026_1.png" alt=""></p>
<h3>How to configure the note history feature?<a name="how-to-configure-the-note-history-feature" href="#how-to-configure-the-note-history-feature" class="heading-anchor">🔗</a></h3>
<p>Additional options are available in the <code>Note History</code> page of the Configuration screen. It is possible to enable/disable the note history feature. It is also possible to specify for how long the history of a note should be kept (by default, for 90 days).</p>
<p><strong>IMPORTANT</strong>: Please note that since all the revisions are synced across all devices, it means these settings are kind of global. So for example, if on one device you set it to keep revisions for 30 days, and on another to 100 days, the revisions older than 30 days will be deleted, and then this deletion will be synced. So in practice it means revisions are kept for whatever is the minimum number of days as set on any of the devices. In that particular case, the 100 days setting will be essentially ignored, and only the 30 days one will apply.</p>
<div class="bottom-links">
<a href="https://github.com/laurent22/joplin/blob/dev/readme/note_history.md">
<i class="fa fa-github"></i> Improve this doc
</a>
</div>
<script>
function stickyHeader() {
return; // Disabled
if ($(window).scrollTop() > 179) {
$('.nav').addClass('sticky');
} else {
$('.nav').removeClass('sticky');
}
}
$('#toc').hide();
$('.help').click(function(event) {
event.preventDefault();
$('#toc').show();
});
$(window).scroll(function() {
stickyHeader();
});
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-103586105-1', 'auto');
ga('send', 'pageview');
</script>
</div></div>
<div class="footer">
Copyright (C) 2016-2021 Laurent Cozic
</div>
</body>
</html>

View File

@@ -402,19 +402,9 @@ https://github.com/laurent22/joplin/blob/dev/readme/plugins.md
<div class="main"> <div class="main">
<h1>Plugins<a name="plugins" href="#plugins" class="heading-anchor">🔗</a></h1> <h1>Plugins<a name="plugins" href="#plugins" class="heading-anchor">🔗</a></h1>
<p>The <strong>desktop app</strong> has the ability to extend beyond its standard functionality by the way of plugins. These plugins adhere to the Joplin plugin API and can be installed &amp; configured within the application via the <code>Plugins</code> page of the Settings menu (<em>Windows/Linux</em>: Tools &gt; Options &gt; Plugins; <em>macOS</em>: Joplin &gt; Preferences). This menu allows the manual installation of the plugin using the single 'Joplin Plugin Archive' (*.jpl) file. Once the application is reloaded the plugins will appear within the plugins menu where they can be toggled on/off or removed entirely.</p> <p>Joplin supports plugins, which can be used to add new features or modify the application behaviour.</p>
<h2>Plugin Repository<a name="plugin-repository" href="#plugin-repository" class="heading-anchor">🔗</a></h2>
<p>Plugins are currently maintained by the community in the <a href="https://discourse.joplinapp.org/c/plugins/18">Joplin Discourse 'plugins' category</a>.</p>
<h2>Installing a plugin<a name="installing-a-plugin" href="#installing-a-plugin" class="heading-anchor">🔗</a></h2> <h2>Installing a plugin<a name="installing-a-plugin" href="#installing-a-plugin" class="heading-anchor">🔗</a></h2>
<p>To install a plugin press the Install Plugin button within the <code>Plugins</code> page of the Configuration screen and select the *.jpl file. Alternatively you can copy the *.jpl to your profile's <code>plugins</code> directory directory <code>~/.config/joplin-desktop/plugins</code> (This path might be different on your device - check at the top of the <code>Options</code> page in the Configuration screen). The plugin will be automatically loaded and executed when you restart the application. You may need to check Joplin is not minimising to the system tray/notification area rather than fully closing.</p> <p>To install a plugin, copy its directory to your profile's <code>plugins</code> directory. The plugin will be automatically loaded and executed when you restart the application.</p>
<h2>Managing Plugins<a name="managing-plugins" href="#managing-plugins" class="heading-anchor">🔗</a></h2>
<p>Within the Joplin Plugins page you have the option to turn individual plugins on or off using the toggle control. After changing the state of a plugin Joplin must be restarted, you may need to check Joplin is not minimising to the system tray/notification area rather than fully closing.</p>
<p>As the plugins integrate into the application itself, each plugin may have its own configuration options within Joplin and may be exectuted in a number of different ways. Ensure that you read the author's documentation fully to understand how each plugin is designed to be configured and used.</p>
<h2>Uninstalling plugins<a name="uninstalling-plugins" href="#uninstalling-plugins" class="heading-anchor">🔗</a></h2>
<p>Within the Joplin Plugins page you can hit the 'Delete' button on a plugin and it will be removed from the list. Joplin must be restarted for this to complete. You may need to check Joplin is not minimising to the system tray/notification area rather than fully closing.</p>
<p>Alternatively you can simply remove *.jpl from the plugin directory (see Installing a plugin section). The change will be reflected on application restart.</p>
<h2>Development<a name="development" href="#development" class="heading-anchor">🔗</a></h2>
<p>There is documentation of the plugin API along with documentation on plugin development. Check the <a href="https://joplinapp.org/api/overview/">Joplin API Overview</a> page for these items.</p>
<div class="bottom-links"> <div class="bottom-links">
<a href="https://github.com/laurent22/joplin/blob/dev/readme/plugins.md"> <a href="https://github.com/laurent22/joplin/blob/dev/readme/plugins.md">

View File

@@ -422,9 +422,6 @@ https://github.com/laurent22/joplin/blob/dev/readme/rich_text_editor.md
<li> <li>
<p>Special keyboard modes &quot;vim&quot; and &quot;emacs&quot; are not supported.</p> <p>Special keyboard modes &quot;vim&quot; and &quot;emacs&quot; are not supported.</p>
</li> </li>
<li>
<p>If a note is of 'Markup - Markdown' and contains HTML formatting, this may be lost when editing in the Rich Text editor as it cannot be converted to Markdown. Notes of 'Markup - HTML' are not affected by edits in the Rich Rext editor as this conversion does not take place.</p>
</li>
</ul> </ul>
<p>Those are the known limitations but if you notice any other issue not listed here, please let us know <a href="https://discourse.joplinapp.org/">in the forum</a>.</p> <p>Those are the known limitations but if you notice any other issue not listed here, please let us know <a href="https://discourse.joplinapp.org/">in the forum</a>.</p>

View File

@@ -412,19 +412,19 @@ https://github.com/laurent22/joplin/blob/dev/readme/stats.md
<tbody> <tbody>
<tr> <tr>
<td>Total Windows downloads</td> <td>Total Windows downloads</td>
<td>1,208,821</td> <td>1,184,223</td>
</tr> </tr>
<tr> <tr>
<td>Total macOs downloads</td> <td>Total macOs downloads</td>
<td>470,973</td> <td>461,162</td>
</tr> </tr>
<tr> <tr>
<td>Total Linux downloads</td> <td>Total Linux downloads</td>
<td>353,265</td> <td>343,536</td>
</tr> </tr>
<tr> <tr>
<td>Windows %</td> <td>Windows %</td>
<td>59%</td> <td>60%</td>
</tr> </tr>
<tr> <tr>
<td>macOS %</td> <td>macOS %</td>
@@ -449,212 +449,196 @@ https://github.com/laurent22/joplin/blob/dev/readme/stats.md
</thead> </thead>
<tbody> <tbody>
<tr> <tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.6.8">v1.6.8</a></td>
<td>2021-01-20T18:11:34Z</td>
<td>2,207</td>
<td>1,288</td>
<td>633</td>
<td>4,128</td>
</tr>
<tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.6.7">v1.6.7</a></td>
<td>2021-01-11T23:20:33Z</td>
<td>9,970</td>
<td>4,544</td>
<td>4,502</td>
<td>19,016</td>
</tr>
<tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.6.6">v1.6.6</a></td> <td><a href="https://github.com/laurent22/joplin/releases/tag/v1.6.6">v1.6.6</a></td>
<td>2021-01-09T16:15:31Z</td> <td>2021-01-09T16:15:31Z</td>
<td>12,255</td> <td>686</td>
<td>3,392</td> <td>268</td>
<td>4,752</td> <td>289</td>
<td>20,399</td> <td>1,243</td>
</tr> </tr>
<tr> <tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.5.14">v1.5.14</a></td> <td><a href="https://github.com/laurent22/joplin/releases/tag/v1.5.14">v1.5.14</a></td>
<td>2020-12-30T01:48:46Z</td> <td>2020-12-30T01:48:46Z</td>
<td>10,482</td> <td>10,401</td>
<td>5,133</td> <td>4,955</td>
<td>5,490</td> <td>5,469</td>
<td>21,105</td> <td>20,825</td>
</tr> </tr>
<tr> <tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.5.13">v1.5.13</a></td> <td><a href="https://github.com/laurent22/joplin/releases/tag/v1.5.13">v1.5.13</a></td>
<td>2020-12-29T18:29:15Z</td> <td>2020-12-29T18:29:15Z</td>
<td>587</td> <td>579</td>
<td>209</td> <td>207</td>
<td>186</td> <td>184</td>
<td>982</td> <td>970</td>
</tr> </tr>
<tr> <tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.5.12">v1.5.12</a></td> <td><a href="https://github.com/laurent22/joplin/releases/tag/v1.5.12">v1.5.12</a></td>
<td>2020-12-28T15:14:08Z</td> <td>2020-12-28T15:14:08Z</td>
<td>2,317</td> <td>2,299</td>
<td>1,743</td> <td>1,735</td>
<td>906</td> <td>905</td>
<td>4,966</td> <td>4,939</td>
</tr> </tr>
<tr> <tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.5.11">v1.5.11</a></td> <td><a href="https://github.com/laurent22/joplin/releases/tag/v1.5.11">v1.5.11</a></td>
<td>2020-12-27T19:54:07Z</td> <td>2020-12-27T19:54:07Z</td>
<td>13,829</td> <td>13,738</td>
<td>4,588</td> <td>4,569</td>
<td>4,225</td> <td>4,209</td>
<td>22,642</td> <td>22,516</td>
</tr> </tr>
<tr> <tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.4.19">v1.4.19</a></td> <td><a href="https://github.com/laurent22/joplin/releases/tag/v1.4.19">v1.4.19</a></td>
<td>2020-12-01T11:11:16Z</td> <td>2020-12-01T11:11:16Z</td>
<td>25,176</td> <td>25,136</td>
<td>12,202</td> <td>11,653</td>
<td>11,564</td> <td>11,553</td>
<td>48,942</td> <td>48,342</td>
</tr> </tr>
<tr> <tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.4.18">v1.4.18</a></td> <td><a href="https://github.com/laurent22/joplin/releases/tag/v1.4.18">v1.4.18</a></td>
<td>2020-11-28T12:21:41Z</td> <td>2020-11-28T12:21:41Z</td>
<td>11,048</td> <td>11,040</td>
<td>3,863</td> <td>3,861</td>
<td>3,035</td> <td>3,032</td>
<td>17,946</td> <td>17,933</td>
</tr> </tr>
<tr> <tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.4.16">v1.4.16</a></td> <td><a href="https://github.com/laurent22/joplin/releases/tag/v1.4.16">v1.4.16</a></td>
<td>2020-11-27T19:40:16Z</td> <td>2020-11-27T19:40:16Z</td>
<td>1,402</td> <td>1,397</td>
<td>818</td> <td>816</td>
<td>582</td> <td>582</td>
<td>2,802</td> <td>2,795</td>
</tr> </tr>
<tr> <tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.4.15">v1.4.15</a></td> <td><a href="https://github.com/laurent22/joplin/releases/tag/v1.4.15">v1.4.15</a></td>
<td>2020-11-27T13:25:43Z</td> <td>2020-11-27T13:25:43Z</td>
<td>867</td> <td>863</td>
<td>478</td> <td>477</td>
<td>258</td> <td>258</td>
<td>1,603</td> <td>1,598</td>
</tr> </tr>
<tr> <tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.4.12">v1.4.12</a></td> <td><a href="https://github.com/laurent22/joplin/releases/tag/v1.4.12">v1.4.12</a></td>
<td>2020-11-23T18:58:07Z</td> <td>2020-11-23T18:58:07Z</td>
<td>2,889</td> <td>2,880</td>
<td>1,308</td> <td>1,307</td>
<td>1,279</td> <td>1,278</td>
<td>5,476</td> <td>5,465</td>
</tr> </tr>
<tr> <tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.3.18">v1.3.18</a></td> <td><a href="https://github.com/laurent22/joplin/releases/tag/v1.3.18">v1.3.18</a></td>
<td>2020-11-06T12:07:02Z</td> <td>2020-11-06T12:07:02Z</td>
<td>30,201</td> <td>30,155</td>
<td>11,297</td> <td>11,292</td>
<td>10,483</td> <td>10,481</td>
<td>51,981</td> <td>51,928</td>
</tr> </tr>
<tr> <tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.3.15">v1.3.15</a></td> <td><a href="https://github.com/laurent22/joplin/releases/tag/v1.3.15">v1.3.15</a></td>
<td>2020-11-04T12:22:50Z</td> <td>2020-11-04T12:22:50Z</td>
<td>2,183</td> <td>2,179</td>
<td>1,286</td> <td>1,282</td>
<td>835</td> <td>834</td>
<td>4,304</td> <td>4,295</td>
</tr> </tr>
<tr> <tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.2.6">v1.2.6</a></td> <td><a href="https://github.com/laurent22/joplin/releases/tag/v1.2.6">v1.2.6</a></td>
<td>2020-10-09T13:56:59Z</td> <td>2020-10-09T13:56:59Z</td>
<td>43,792</td> <td>43,738</td>
<td>17,703</td> <td>17,697</td>
<td>14,016</td> <td>14,013</td>
<td>75,511</td> <td>75,448</td>
</tr> </tr>
<tr> <tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.1.4">v1.1.4</a></td> <td><a href="https://github.com/laurent22/joplin/releases/tag/v1.1.4">v1.1.4</a></td>
<td>2020-09-21T11:20:09Z</td> <td>2020-09-21T11:20:09Z</td>
<td>27,466</td> <td>27,456</td>
<td>13,482</td> <td>13,477</td>
<td>7,704</td> <td>7,701</td>
<td>48,652</td> <td>48,634</td>
</tr> </tr>
<tr> <tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.245">v1.0.245</a></td> <td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.245">v1.0.245</a></td>
<td>2020-09-09T12:56:10Z</td> <td>2020-09-09T12:56:10Z</td>
<td>20,892</td> <td>20,870</td>
<td>9,991</td> <td>9,985</td>
<td>5,629</td> <td>5,626</td>
<td>36,512</td> <td>36,481</td>
</tr> </tr>
<tr> <tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.242">v1.0.242</a></td> <td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.242">v1.0.242</a></td>
<td>2020-09-04T22:00:34Z</td> <td>2020-09-04T22:00:34Z</td>
<td>12,356</td> <td>12,346</td>
<td>6,414</td> <td>6,408</td>
<td>3,014</td> <td>3,012</td>
<td>21,784</td> <td>21,766</td>
</tr> </tr>
<tr> <tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.241">v1.0.241</a></td> <td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.241">v1.0.241</a></td>
<td>2020-09-04T18:06:00Z</td> <td>2020-09-04T18:06:00Z</td>
<td>23,202</td> <td>23,141</td>
<td>5,713</td> <td>5,705</td>
<td>4,973</td> <td>4,965</td>
<td>33,888</td> <td>33,811</td>
</tr> </tr>
<tr> <tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.233">v1.0.233</a></td> <td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.233">v1.0.233</a></td>
<td>2020-08-01T14:51:15Z</td> <td>2020-08-01T14:51:15Z</td>
<td>42,686</td> <td>42,630</td>
<td>18,182</td> <td>18,175</td>
<td>12,351</td> <td>12,348</td>
<td>73,219</td> <td>73,153</td>
</tr> </tr>
<tr> <tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.227">v1.0.227</a></td> <td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.227">v1.0.227</a></td>
<td>2020-07-07T20:44:54Z</td> <td>2020-07-07T20:44:54Z</td>
<td>40,243</td> <td>40,227</td>
<td>15,265</td> <td>15,259</td>
<td>9,621</td> <td>9,619</td>
<td>65,129</td> <td>65,105</td>
</tr> </tr>
<tr> <tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.224">v1.0.224</a></td> <td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.224">v1.0.224</a></td>
<td>2020-06-20T22:26:08Z</td> <td>2020-06-20T22:26:08Z</td>
<td>24,745</td> <td>24,738</td>
<td>10,998</td> <td>10,993</td>
<td>6,004</td> <td>6,002</td>
<td>41,747</td> <td>41,733</td>
</tr> </tr>
<tr> <tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.220">v1.0.220</a></td> <td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.220">v1.0.220</a></td>
<td>2020-06-13T18:26:22Z</td> <td>2020-06-13T18:26:22Z</td>
<td>31,587</td> <td>31,578</td>
<td>9,909</td> <td>9,907</td>
<td>6,408</td> <td>6,408</td>
<td>47,904</td> <td>47,893</td>
</tr> </tr>
<tr> <tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.218">v1.0.218</a></td> <td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.218">v1.0.218</a></td>
<td>2020-06-07T10:43:34Z</td> <td>2020-06-07T10:43:34Z</td>
<td>14,524</td> <td>14,520</td>
<td>6,962</td> <td>6,960</td>
<td>2,951</td> <td>2,951</td>
<td>24,437</td> <td>24,431</td>
</tr> </tr>
<tr> <tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.216">v1.0.216</a></td> <td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.216">v1.0.216</a></td>
<td>2020-05-24T14:21:01Z</td> <td>2020-05-24T14:21:01Z</td>
<td>36,882</td> <td>36,829</td>
<td>14,250</td> <td>14,248</td>
<td>10,171</td> <td>10,171</td>
<td>61,303</td> <td>61,248</td>
</tr> </tr>
<tr> <tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.201">v1.0.201</a></td> <td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.201">v1.0.201</a></td>
<td>2020-04-15T22:55:13Z</td> <td>2020-04-15T22:55:13Z</td>
<td>52,917</td> <td>52,843</td>
<td>20,039</td> <td>20,039</td>
<td>18,177</td> <td>18,176</td>
<td>91,133</td> <td>91,058</td>
</tr> </tr>
<tr> <tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.200">v1.0.200</a></td> <td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.200">v1.0.200</a></td>
@@ -667,42 +651,42 @@ https://github.com/laurent22/joplin/blob/dev/readme/stats.md
<tr> <tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.199">v1.0.199</a></td> <td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.199">v1.0.199</a></td>
<td>2020-04-10T18:41:58Z</td> <td>2020-04-10T18:41:58Z</td>
<td>19,282</td> <td>19,274</td>
<td>5,880</td> <td>5,880</td>
<td>3,785</td> <td>3,785</td>
<td>28,947</td> <td>28,939</td>
</tr> </tr>
<tr> <tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.197">v1.0.197</a></td> <td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.197">v1.0.197</a></td>
<td>2020-03-30T17:21:22Z</td> <td>2020-03-30T17:21:22Z</td>
<td>22,151</td> <td>22,129</td>
<td>9,518</td> <td>9,513</td>
<td>5,665</td> <td>5,657</td>
<td>37,334</td> <td>37,299</td>
</tr> </tr>
<tr> <tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.195">v1.0.195</a></td> <td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.195">v1.0.195</a></td>
<td>2020-03-22T19:56:12Z</td> <td>2020-03-22T19:56:12Z</td>
<td>18,880</td> <td>18,879</td>
<td>7,944</td> <td>7,944</td>
<td>4,504</td> <td>4,504</td>
<td>31,328</td> <td>31,327</td>
</tr> </tr>
<tr> <tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.193">v1.0.193</a></td> <td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.193">v1.0.193</a></td>
<td>2020-03-08T08:58:53Z</td> <td>2020-03-08T08:58:53Z</td>
<td>28,618</td> <td>28,611</td>
<td>10,902</td> <td>10,901</td>
<td>7,374</td> <td>7,374</td>
<td>46,894</td> <td>46,886</td>
</tr> </tr>
<tr> <tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.179">v1.0.179</a></td> <td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.179">v1.0.179</a></td>
<td>2020-01-24T22:42:41Z</td> <td>2020-01-24T22:42:41Z</td>
<td>70,977</td> <td>70,976</td>
<td>28,494</td> <td>28,491</td>
<td>22,508</td> <td>22,506</td>
<td>121,979</td> <td>121,973</td>
</tr> </tr>
<tr> <tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.178">v1.0.178</a></td> <td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.178">v1.0.178</a></td>
@@ -715,18 +699,18 @@ https://github.com/laurent22/joplin/blob/dev/readme/stats.md
<tr> <tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.175">v1.0.175</a></td> <td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.175">v1.0.175</a></td>
<td>2019-12-08T11:48:47Z</td> <td>2019-12-08T11:48:47Z</td>
<td>72,235</td> <td>72,131</td>
<td>16,868</td> <td>16,867</td>
<td>16,487</td> <td>16,487</td>
<td>105,590</td> <td>105,485</td>
</tr> </tr>
<tr> <tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.174">v1.0.174</a></td> <td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.174">v1.0.174</a></td>
<td>2019-11-12T18:20:58Z</td> <td>2019-11-12T18:20:58Z</td>
<td>30,396</td> <td>30,396</td>
<td>11,698</td> <td>11,698</td>
<td>8,219</td> <td>8,218</td>
<td>50,313</td> <td>50,312</td>
</tr> </tr>
<tr> <tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.173">v1.0.173</a></td> <td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.173">v1.0.173</a></td>
@@ -741,8 +725,8 @@ https://github.com/laurent22/joplin/blob/dev/readme/stats.md
<td>2019-10-13T22:13:04Z</td> <td>2019-10-13T22:13:04Z</td>
<td>27,388</td> <td>27,388</td>
<td>8,747</td> <td>8,747</td>
<td>7,672</td> <td>7,671</td>
<td>43,807</td> <td>43,806</td>
</tr> </tr>
<tr> <tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.169">v1.0.169</a></td> <td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.169">v1.0.169</a></td>
@@ -789,16 +773,16 @@ https://github.com/laurent22/joplin/blob/dev/readme/stats.md
<td>2019-07-13T18:30:00Z</td> <td>2019-07-13T18:30:00Z</td>
<td>19,280</td> <td>19,280</td>
<td>6,352</td> <td>6,352</td>
<td>4,136</td> <td>4,134</td>
<td>29,768</td> <td>29,766</td>
</tr> </tr>
<tr> <tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.160">v1.0.160</a></td> <td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.160">v1.0.160</a></td>
<td>2019-06-15T00:21:40Z</td> <td>2019-06-15T00:21:40Z</td>
<td>30,495</td> <td>30,491</td>
<td>7,745</td> <td>7,745</td>
<td>8,101</td> <td>8,101</td>
<td>46,341</td> <td>46,337</td>
</tr> </tr>
<tr> <tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.159">v1.0.159</a></td> <td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.159">v1.0.159</a></td>
@@ -844,9 +828,9 @@ https://github.com/laurent22/joplin/blob/dev/readme/stats.md
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.150">v1.0.150</a></td> <td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.150">v1.0.150</a></td>
<td>2019-05-12T11:27:48Z</td> <td>2019-05-12T11:27:48Z</td>
<td>423</td> <td>423</td>
<td>135</td> <td>134</td>
<td>68</td> <td>68</td>
<td>626</td> <td>625</td>
</tr> </tr>
<tr> <tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.145">v1.0.145</a></td> <td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.145">v1.0.145</a></td>
@@ -877,16 +861,16 @@ https://github.com/laurent22/joplin/blob/dev/readme/stats.md
<td>2019-03-10T20:59:58Z</td> <td>2019-03-10T20:59:58Z</td>
<td>13,627</td> <td>13,627</td>
<td>4,170</td> <td>4,170</td>
<td>3,192</td> <td>3,191</td>
<td>20,989</td> <td>20,988</td>
</tr> </tr>
<tr> <tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.135">v1.0.135</a></td> <td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.135">v1.0.135</a></td>
<td>2019-02-27T23:36:57Z</td> <td>2019-02-27T23:36:57Z</td>
<td>12,494</td> <td>12,494</td>
<td>3,956</td> <td>3,956</td>
<td>4,077</td> <td>4,076</td>
<td>20,527</td> <td>20,526</td>
</tr> </tr>
<tr> <tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.134">v1.0.134</a></td> <td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.134">v1.0.134</a></td>
@@ -907,10 +891,10 @@ https://github.com/laurent22/joplin/blob/dev/readme/stats.md
<tr> <tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.127">v1.0.127</a></td> <td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.127">v1.0.127</a></td>
<td>2019-02-14T23:12:48Z</td> <td>2019-02-14T23:12:48Z</td>
<td>9,760</td> <td>9,757</td>
<td>3,170</td> <td>3,169</td>
<td>2,929</td> <td>2,929</td>
<td>15,859</td> <td>15,855</td>
</tr> </tr>
<tr> <tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.125">v1.0.125</a></td> <td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.125">v1.0.125</a></td>
@@ -948,9 +932,9 @@ https://github.com/laurent22/joplin/blob/dev/readme/stats.md
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.117">v1.0.117</a></td> <td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.117">v1.0.117</a></td>
<td>2018-11-24T12:05:24Z</td> <td>2018-11-24T12:05:24Z</td>
<td>16,258</td> <td>16,258</td>
<td>4,896</td> <td>4,895</td>
<td>6,380</td> <td>6,380</td>
<td>27,534</td> <td>27,533</td>
</tr> </tr>
<tr> <tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.116">v1.0.116</a></td> <td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.116">v1.0.116</a></td>
@@ -979,10 +963,10 @@ https://github.com/laurent22/joplin/blob/dev/readme/stats.md
<tr> <tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.111">v1.0.111</a></td> <td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.111">v1.0.111</a></td>
<td>2018-09-30T20:15:09Z</td> <td>2018-09-30T20:15:09Z</td>
<td>12,020</td> <td>12,019</td>
<td>3,300</td> <td>3,298</td>
<td>3,668</td> <td>3,668</td>
<td>18,988</td> <td>18,985</td>
</tr> </tr>
<tr> <tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.110">v1.0.110</a></td> <td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.110">v1.0.110</a></td>
@@ -1021,16 +1005,16 @@ https://github.com/laurent22/joplin/blob/dev/readme/stats.md
<td>2018-09-05T11:29:36Z</td> <td>2018-09-05T11:29:36Z</td>
<td>4,657</td> <td>4,657</td>
<td>1,590</td> <td>1,590</td>
<td>1,455</td> <td>1,454</td>
<td>7,702</td> <td>7,701</td>
</tr> </tr>
<tr> <tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.104">v1.0.104</a></td> <td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.104">v1.0.104</a></td>
<td>2018-06-28T20:25:36Z</td> <td>2018-06-28T20:25:36Z</td>
<td>15,051</td> <td>15,050</td>
<td>4,701</td> <td>4,700</td>
<td>7,334</td> <td>7,333</td>
<td>27,086</td> <td>27,083</td>
</tr> </tr>
<tr> <tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.103">v1.0.103</a></td> <td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.103">v1.0.103</a></td>
@@ -1077,8 +1061,8 @@ https://github.com/laurent22/joplin/blob/dev/readme/stats.md
<td>2018-05-26T16:36:39Z</td> <td>2018-05-26T16:36:39Z</td>
<td>2,721</td> <td>2,721</td>
<td>1,225</td> <td>1,225</td>
<td>1,654</td> <td>1,642</td>
<td>5,600</td> <td>5,588</td>
</tr> </tr>
<tr> <tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.95">v1.0.95</a></td> <td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.95">v1.0.95</a></td>
@@ -1100,9 +1084,9 @@ https://github.com/laurent22/joplin/blob/dev/readme/stats.md
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.93">v1.0.93</a></td> <td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.93">v1.0.93</a></td>
<td>2018-05-14T11:36:01Z</td> <td>2018-05-14T11:36:01Z</td>
<td>1,791</td> <td>1,791</td>
<td>1,109</td> <td>1,106</td>
<td>759</td> <td>759</td>
<td>3,659</td> <td>3,656</td>
</tr> </tr>
<tr> <tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.91">v1.0.91</a></td> <td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.91">v1.0.91</a></td>
@@ -1131,10 +1115,10 @@ https://github.com/laurent22/joplin/blob/dev/readme/stats.md
<tr> <tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.83">v1.0.83</a></td> <td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.83">v1.0.83</a></td>
<td>2018-04-04T19:43:58Z</td> <td>2018-04-04T19:43:58Z</td>
<td>4,833</td> <td>4,826</td>
<td>2,532</td> <td>2,532</td>
<td>2,658</td> <td>2,658</td>
<td>10,023</td> <td>10,016</td>
</tr> </tr>
<tr> <tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.82">v1.0.82</a></td> <td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.82">v1.0.82</a></td>
@@ -1149,24 +1133,24 @@ https://github.com/laurent22/joplin/blob/dev/readme/stats.md
<td>2018-03-28T08:13:58Z</td> <td>2018-03-28T08:13:58Z</td>
<td>1,001</td> <td>1,001</td>
<td>597</td> <td>597</td>
<td>783</td> <td>782</td>
<td>2,381</td> <td>2,380</td>
</tr> </tr>
<tr> <tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.79">v1.0.79</a></td> <td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.79">v1.0.79</a></td>
<td>2018-03-23T18:00:11Z</td> <td>2018-03-23T18:00:11Z</td>
<td>932</td> <td>932</td>
<td>539</td> <td>537</td>
<td>380</td> <td>379</td>
<td>1,851</td> <td>1,848</td>
</tr> </tr>
<tr> <tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.78">v1.0.78</a></td> <td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.78">v1.0.78</a></td>
<td>2018-03-17T15:27:18Z</td> <td>2018-03-17T15:27:18Z</td>
<td>1,313</td> <td>1,313</td>
<td>870</td> <td>870</td>
<td>872</td> <td>871</td>
<td>3,055</td> <td>3,054</td>
</tr> </tr>
<tr> <tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.77">v1.0.77</a></td> <td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.77">v1.0.77</a></td>
@@ -1180,9 +1164,9 @@ https://github.com/laurent22/joplin/blob/dev/readme/stats.md
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.72">v1.0.72</a></td> <td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.72">v1.0.72</a></td>
<td>2018-03-14T09:44:35Z</td> <td>2018-03-14T09:44:35Z</td>
<td>407</td> <td>407</td>
<td>258</td> <td>257</td>
<td>57</td> <td>57</td>
<td>722</td> <td>721</td>
</tr> </tr>
<tr> <tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.70">v1.0.70</a></td> <td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.70">v1.0.70</a></td>
@@ -1196,9 +1180,9 @@ https://github.com/laurent22/joplin/blob/dev/readme/stats.md
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.67">v1.0.67</a></td> <td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.67">v1.0.67</a></td>
<td>2018-02-19T22:51:08Z</td> <td>2018-02-19T22:51:08Z</td>
<td>1,816</td> <td>1,816</td>
<td>603</td> <td>602</td>
<td>0</td> <td>0</td>
<td>2,419</td> <td>2,418</td>
</tr> </tr>
<tr> <tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.66">v1.0.66</a></td> <td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.66">v1.0.66</a></td>
@@ -1236,17 +1220,17 @@ https://github.com/laurent22/joplin/blob/dev/readme/stats.md
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.62">v1.0.62</a></td> <td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.62">v1.0.62</a></td>
<td>2018-02-12T20:19:58Z</td> <td>2018-02-12T20:19:58Z</td>
<td>560</td> <td>560</td>
<td>300</td> <td>299</td>
<td>369</td> <td>369</td>
<td>1,229</td> <td>1,228</td>
</tr> </tr>
<tr> <tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v0.10.61">v0.10.61</a></td> <td><a href="https://github.com/laurent22/joplin/releases/tag/v0.10.61">v0.10.61</a></td>
<td>2018-02-08T18:27:39Z</td> <td>2018-02-08T18:27:39Z</td>
<td>973</td> <td>973</td>
<td>633</td> <td>632</td>
<td>964</td> <td>964</td>
<td>2,570</td> <td>2,569</td>
</tr> </tr>
<tr> <tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v0.10.60">v0.10.60</a></td> <td><a href="https://github.com/laurent22/joplin/releases/tag/v0.10.60">v0.10.60</a></td>
@@ -1309,24 +1293,24 @@ https://github.com/laurent22/joplin/blob/dev/readme/stats.md
<td>2018-01-05T20:38:12Z</td> <td>2018-01-05T20:38:12Z</td>
<td>1,038</td> <td>1,038</td>
<td>1,549</td> <td>1,549</td>
<td>243</td> <td>241</td>
<td>2,830</td> <td>2,828</td>
</tr> </tr>
<tr> <tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v0.10.40">v0.10.40</a></td> <td><a href="https://github.com/laurent22/joplin/releases/tag/v0.10.40">v0.10.40</a></td>
<td>2018-01-02T23:16:57Z</td> <td>2018-01-02T23:16:57Z</td>
<td>1,596</td> <td>1,596</td>
<td>1,790</td> <td>1,789</td>
<td>339</td> <td>339</td>
<td>3,725</td> <td>3,724</td>
</tr> </tr>
<tr> <tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v0.10.39">v0.10.39</a></td> <td><a href="https://github.com/laurent22/joplin/releases/tag/v0.10.39">v0.10.39</a></td>
<td>2017-12-11T21:19:44Z</td> <td>2017-12-11T21:19:44Z</td>
<td>5,809</td> <td>5,806</td>
<td>4,282</td> <td>4,279</td>
<td>3,183</td> <td>3,179</td>
<td>13,274</td> <td>13,264</td>
</tr> </tr>
<tr> <tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v0.10.38">v0.10.38</a></td> <td><a href="https://github.com/laurent22/joplin/releases/tag/v0.10.38">v0.10.38</a></td>
@@ -1413,8 +1397,8 @@ https://github.com/laurent22/joplin/blob/dev/readme/stats.md
<td>2017-11-24T14:27:49Z</td> <td>2017-11-24T14:27:49Z</td>
<td>150</td> <td>150</td>
<td>696</td> <td>696</td>
<td>6,420</td> <td>6,413</td>
<td>7,266</td> <td>7,259</td>
</tr> </tr>
<tr> <tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v0.10.23">v0.10.23</a></td> <td><a href="https://github.com/laurent22/joplin/releases/tag/v0.10.23">v0.10.23</a></td>

View File

@@ -528,10 +528,8 @@ https://github.com/laurent22/joplin/blob/dev/readme/terminal.md
<li>Then repeat the process for each notebook that needs to be imported.</li> <li>Then repeat the process for each notebook that needs to be imported.</li>
</ul> </ul>
<h1>Synchronisation<a name="synchronisation" href="#synchronisation" class="heading-anchor">🔗</a></h1> <h1>Synchronisation<a name="synchronisation" href="#synchronisation" class="heading-anchor">🔗</a></h1>
<p>One of the goals of Joplin was to avoid being tied to any particular company or service, whether it is Evernote, Google or Microsoft. As such the synchronisation is designed without any hard dependency to any particular service. Most of the synchronisation process is done at an abstract level and access to external services, such as Nextcloud or Dropbox, is done via lightweight drivers. It is easy to support new services by creating simple drivers that provide a filesystem-like interface, i.e. the ability to read, write, delete and list items. It is also simple to switch from one service to another or to even sync to multiple services at once. Each note, notebook, tags, as well as the relation between items is transmitted as plain text files during synchronisation, which means the data can also be moved to a different application, can be easily backed up, inspected, etc.</p> <p>One of the goals of Joplin was to avoid being tied to any particular company or service, whether it is Evernote, Google or Microsoft. As such the synchronisation is designed without any hard dependency to any particular service. Most of the synchronisation process is done at an abstract level and access to external services, such as Nextcloud or OneDrive, is done via lightweight drivers. It is easy to support new services by creating simple drivers that provide a filesystem-like interface, i.e. the ability to read, write, delete and list items. It is also simple to switch from one service to another or to even sync to multiple services at once. Each note, notebook, tags, as well as the relation between items is transmitted as plain text files during synchronisation, which means the data can also be moved to a different application, can be easily backed up, inspected, etc.</p>
<p>Currently, synchronisation is possible with Nextcloud, WebDAV, Dropbox, OneDrive or the local filesystem. To enable synchronisation please follow the instructions below. After that, the application will synchronise in the background whenever it is running, or you can click on &quot;Synchronise&quot; to start a synchronisation manually. Joplin will background sync automatically after any content change is made on the local application.<br> <p>Currently, synchronisation is possible with Nextcloud, Dropbox (by default) and OneDrive, or the local filesystem. To setup synchronisation please follow the instructions below. After that, the application will synchronise in the background whenever it is running, or you can click on &quot;Synchronise&quot; to start a synchronisation manually.</p>
If the <strong>terminal client</strong> has been installed, it is possible to also synchronise outside of the user interface by typing <code>joplin sync</code> from the terminal. This can be used to setup a cron script to synchronise at a regular interval. For example, this would do it every 30 minutes:</p>
<p>*/30 * * * * /path/to/joplin sync</p>
<h2>Nextcloud synchronisation<a name="nextcloud-synchronisation" href="#nextcloud-synchronisation" class="heading-anchor">🔗</a></h2> <h2>Nextcloud synchronisation<a name="nextcloud-synchronisation" href="#nextcloud-synchronisation" class="heading-anchor">🔗</a></h2>
<p>You will need to set the <code>sync.target</code> config variable and all the <code>sync.5.path</code>, <code>sync.5.username</code> and <code>sync.5.password</code> config variables to, respectively the Nextcloud WebDAV URL, your username and your password. This can be done from the command line mode using:</p> <p>You will need to set the <code>sync.target</code> config variable and all the <code>sync.5.path</code>, <code>sync.5.username</code> and <code>sync.5.password</code> config variables to, respectively the Nextcloud WebDAV URL, your username and your password. This can be done from the command line mode using:</p>
<pre><code>:config sync.target 5 <pre><code>:config sync.target 5
@@ -541,14 +539,12 @@ If the <strong>terminal client</strong> has been installed, it is possible to al
</code></pre> </code></pre>
<p>If synchronisation does not work, please consult the logs in the app profile directory (<code>~/.config/joplin</code>)- it is often due to a misconfigured URL or password. The log should indicate what the exact issue is.</p> <p>If synchronisation does not work, please consult the logs in the app profile directory (<code>~/.config/joplin</code>)- it is often due to a misconfigured URL or password. The log should indicate what the exact issue is.</p>
<h2>WebDAV synchronisation<a name="webdav-synchronisation" href="#webdav-synchronisation" class="heading-anchor">🔗</a></h2> <h2>WebDAV synchronisation<a name="webdav-synchronisation" href="#webdav-synchronisation" class="heading-anchor">🔗</a></h2>
<p>Select the &quot;WebDAV&quot; synchronisation target and follow the same instructions as for Nextcloud above (for the <strong>terminal application</strong> you will need to select sync target 6 rather than 5).</p> <p>Select the &quot;WebDAV&quot; synchronisation target and follow the same instructions as for Nextcloud above.</p>
<p>For WebDAV-compatible services that are known to work with Joplin see <a href="https://github.com/laurent22/joplin#webdav-synchronisation">WebDAV synchronisation</a>.</p> <h2>OneDrive and Dropbox synchronisation<a name="onedrive-and-dropbox-synchronisation" href="#onedrive-and-dropbox-synchronisation" class="heading-anchor">🔗</a></h2>
<h2>Dropbox synchronisation<a name="dropbox-synchronisation" href="#dropbox-synchronisation" class="heading-anchor">🔗</a></h2> <p>For Dropbox, type <code>:config sync.target 7</code>. For OneDrive, type <code>:config sync.target 3</code>. Then type <code>sync</code> to login to the service and start the synchronisation process.</p>
<p>When syncing with Dropbox, Joplin creates a sub-directory in Dropbox, in <code>/Apps/Joplin</code> and read/write the notes and notebooks from it. The application does not have access to anything outside this directory.</p> <p>It is possible to also synchronise outside of the user interface by typing <code>joplin sync</code> from the terminal. This can be used to setup a cron script to synchronise at regular interval. For example, this would do it every 30 minutes:</p>
<p>To initiate the synchronisation process, type <code>:sync</code>. You will be asked to follow a link to authorise the application.</p> <pre><code>*/30 * * * * /path/to/joplin sync
<h2>OneDrive synchronisation<a name="onedrive-synchronisation" href="#onedrive-synchronisation" class="heading-anchor">🔗</a></h2> </code></pre>
<p>When syncing with OneDrive, Joplin creates a sub-directory in OneDrive, in /Apps/Joplin and read/write the notes and notebooks from it. The application does not have access to anything outside this directory.</p>
<p>To initiate the synchronisation process, type <code>:sync</code>. You will be asked to follow a link to authorise the application (simply input your Microsoft credentials - you do not need to register with OneDrive).</p>
<h1>URLs<a name="urls" href="#urls" class="heading-anchor">🔗</a></h1> <h1>URLs<a name="urls" href="#urls" class="heading-anchor">🔗</a></h1>
<p>When Ctrl+Clicking a URL (or opening with the shortcut 'o' while it is highlighted), most terminals will open that URL in the default browser. However, one issue, especially with long URLs, is that they can end up like this:</p> <p>When Ctrl+Clicking a URL (or opening with the shortcut 'o' while it is highlighted), most terminals will open that URL in the default browser. However, one issue, especially with long URLs, is that they can end up like this:</p>
<img src="https://joplinapp.org/images/UrlCut.png" width="300px"> <img src="https://joplinapp.org/images/UrlCut.png" width="300px">
@@ -730,195 +726,193 @@ cat &lt;note&gt;
config [name] [value] config [name] [value]
Gets or sets a config value. If [value] is not provided, it will show the Gets or sets a config value. If [value] is not provided, it will show the
value of [name]. If neither [name] nor [value] is provided, it will list value of [name]. If neither [name] nor [value] is provided, it will list
the current configuration. the current configuration.
-v, --verbose Also displays unset and hidden config variables. -v, --verbose Also displays unset and hidden config variables.
--export Writes all settings to STDOUT as JSON including --export Writes all settings to STDOUT as JSON including
secure variables. secure variables.
--import Reads in JSON formatted settings from STDIN. --import Reads in JSON formatted settings from STDIN.
--import-file &lt;file&gt; Reads in settings from &lt;file&gt;. &lt;file&gt; must contain --import-file &lt;file&gt; Reads in settings from &lt;file&gt;. &lt;file&gt; must contain
valid JSON. valid JSON.
Possible keys/values: Possible keys/values:
sync.target Synchronisation target. sync.target Synchronisation target.
The target to synchonise to. Each sync The target to synchonise to. Each sync
target may have additional parameters which target may have additional parameters which
are named as `sync.NUM.NAME` (all are named as `sync.NUM.NAME` (all
documented below). documented below).
Type: Enum. Type: Enum.
Possible values: 2 (File system), 3 Possible values: 2 (File system), 3
(OneDrive), 4 (OneDrive Dev (For testing (OneDrive), 4 (OneDrive Dev (For testing
only)), 5 (Nextcloud), 6 (WebDAV), 7 only)), 5 (Nextcloud), 6 (WebDAV), 7
(Dropbox). (Dropbox).
Default: 7 Default: 7
sync.2.path Directory to synchronise with (absolute sync.2.path Directory to synchronise with (absolute
path). path).
Attention: If you change this location, Attention: If you change this location,
make sure you copy all your content to it make sure you copy all your content to it
before syncing, otherwise all files will be before syncing, otherwise all files will be
removed! See the FAQ for more details: removed! See the FAQ for more details:
https://joplinapp.org/faq/ https://joplinapp.org/faq/
Type: string. Type: string.
sync.5.path Nextcloud WebDAV URL. sync.5.path Nextcloud WebDAV URL.
Attention: If you change this location, Attention: If you change this location,
make sure you copy all your content to it make sure you copy all your content to it
before syncing, otherwise all files will be before syncing, otherwise all files will be
removed! See the FAQ for more details: removed! See the FAQ for more details:
https://joplinapp.org/faq/ https://joplinapp.org/faq/
Type: string. Type: string.
sync.5.username Nextcloud username. sync.5.username Nextcloud username.
Type: string. Type: string.
sync.5.password Nextcloud password. sync.5.password Nextcloud password.
Type: string. Type: string.
sync.6.path WebDAV URL. sync.6.path WebDAV URL.
Attention: If you change this location, Attention: If you change this location,
make sure you copy all your content to it make sure you copy all your content to it
before syncing, otherwise all files will be before syncing, otherwise all files will be
removed! See the FAQ for more details: removed! See the FAQ for more details:
https://joplinapp.org/faq/ https://joplinapp.org/faq/
Type: string. Type: string.
sync.6.username WebDAV username. sync.6.username WebDAV username.
Type: string. Type: string.
sync.6.password WebDAV password. sync.6.password WebDAV password.
Type: string. Type: string.
sync.maxConcurrentConnections Max concurrent connections. sync.maxConcurrentConnections Max concurrent connections.
Type: int. Type: int.
Default: 5 Default: 5
locale Language. locale Language.
Please see localisation section on
https://joplinapp.org/#localisation
for info on translation completion progress
Type: Enum. Type: Enum.
Possible values: ar (Arabic), eu (Basque), Possible values: ar (Arabic (92%)), eu
bs_BA (Bosnian), bg_BG (Bulgarian), (Basque (39%)), bs_BA (Bosnian (85%)),
ca (Catalan), hr_HR (Croatian), bg_BG (Bulgarian (77%)), ca (Catalan
cs_CZ (Czech), da_DK (Dansk), (61%)), hr_HR (Croatian (32%)), cs_CZ
de_DE (Deutsch), et_EE (Eesti Keel), (Czech (94%)), da_DK (Dansk (85%)), de_DE
en_GB (English (UK)), en_US (English (US)), (Deutsch (100%)), et_EE (Eesti Keel (76%)),
es_ES (Español), eo (Esperanto), en_GB (English (UK) (100%)), en_US (English
fi_FI (Finnish), fr_FR (Français), (US) (100%)), es_ES (Español (95%)), eo
gl_ES (Galician), id_ID (Indonesian), (Esperanto (44%)), fr_FR (Français (95%)),
it_IT (Italiano), nl_BE (Nederlands), gl_ES (Galician (50%)), it_IT (Italiano
nl_NL (Nederlands), nb_NO (Norwegian), (97%)), nl_BE (Nederlands (39%)), nl_NL
fa (Persian), pl_PL (Polski), (Nederlands (97%)), nb_NO (Norwegian
pt_PT (Português), (89%)), fa (Persian (38%)), pl_PL (Polski
pt_BR (Português (Brasil)), ro (Română), (75%)), pt_PT (Português (91%)), pt_BR
sl_SI (Slovenian), sv (Svenska), (Português (Brasil) (88%)), ro (Română
th_TH (Thai), vi (Tiếng Việt), (39%)), sl_SI (Slovenian (49%)), sv
tr_TR (Türkçe), el_GR (Ελληνικά), (Svenska (68%)), tr_TR (Türkçe (92%)),
ru_RU (Русский), sr_RS (српски језик), el_GR (Ελληνικά (93%)), ru_RU (Русский
zh_CN (中文 (简体)), zh_TW (中文 (繁體)), (95%)), sr_RS (српски језик (75%)), zh_CN
ja_JP (日本語), ko (한국말). (中文 (简体) (97%)), zh_TW (中文 (繁體) (91%)),
ja_JP (日本語 (97%)), ko (한국말 (97%)).
Default: &quot;en_GB&quot; Default: &quot;en_GB&quot;
dateFormat Date format. dateFormat Date format.
Type: Enum. Type: Enum.
Possible values: DD/MM/YYYY (30/01/2017), Possible values: DD/MM/YYYY (30/01/2017),
DD/MM/YY (30/01/17), MM/DD/YYYY DD/MM/YY (30/01/17), MM/DD/YYYY
(01/30/2017), MM/DD/YY (01/30/17), (01/30/2017), MM/DD/YY (01/30/17),
YYYY-MM-DD (2017-01-30), DD.MM.YYYY YYYY-MM-DD (2017-01-30), DD.MM.YYYY
(30.01.2017), YYYY.MM.DD (2017.01.30). (30.01.2017), YYYY.MM.DD (2017.01.30).
Default: &quot;DD/MM/YYYY&quot; Default: &quot;DD/MM/YYYY&quot;
timeFormat Time format. timeFormat Time format.
Type: Enum. Type: Enum.
Possible values: HH:mm (20:30), h:mm A Possible values: HH:mm (20:30), h:mm A
(8:30 PM). (8:30 PM).
Default: &quot;HH:mm&quot; Default: &quot;HH:mm&quot;
uncompletedTodosOnTop Uncompleted to-dos on top. uncompletedTodosOnTop Uncompleted to-dos on top.
Type: bool. Type: bool.
Default: true Default: true
showCompletedTodos Show completed to-dos. showCompletedTodos Show completed to-dos.
Type: bool. Type: bool.
Default: true Default: true
notes.sortOrder.field Sort notes by. notes.sortOrder.field Sort notes by.
Type: Enum. Type: Enum.
Possible values: user_updated_time (Updated Possible values: user_updated_time (Updated
date), user_created_time (Created date), date), user_created_time (Created date),
title (Title). title (Title).
Default: &quot;user_updated_time&quot; Default: &quot;user_updated_time&quot;
notes.sortOrder.reverse Reverse sort order. notes.sortOrder.reverse Reverse sort order.
Type: bool. Type: bool.
Default: true Default: true
folders.sortOrder.field Sort notebooks by. folders.sortOrder.field Sort notebooks by.
Type: Enum. Type: Enum.
Possible values: title (Title), Possible values: title (Title),
last_note_user_updated_time (Updated date). last_note_user_updated_time (Updated date).
Default: &quot;title&quot; Default: &quot;title&quot;
folders.sortOrder.reverse Reverse sort order. folders.sortOrder.reverse Reverse sort order.
Type: bool. Type: bool.
Default: false Default: false
trackLocation Save geo-location with notes. trackLocation Save geo-location with notes.
Type: bool. Type: bool.
Default: true Default: true
sync.interval Synchronisation interval. sync.interval Synchronisation interval.
Type: Enum. Type: Enum.
Possible values: 0 (Disabled), 300 (5 Possible values: 0 (Disabled), 300 (5
minutes), 600 (10 minutes), 1800 (30 minutes), 600 (10 minutes), 1800 (30
minutes), 3600 (1 hour), 43200 (12 hours), minutes), 3600 (1 hour), 43200 (12 hours),
86400 (24 hours). 86400 (24 hours).
Default: 300 Default: 300
editor Text editor command. editor Text editor command.
The editor command (may include arguments) The editor command (may include arguments)
that will be used to open a note. If none that will be used to open a note. If none
is provided it will try to auto-detect the is provided it will try to auto-detect the
default editor. default editor.
Type: string. Type: string.
net.customCertificates Custom TLS certificates. net.customCertificates Custom TLS certificates.
Comma-separated list of paths to Comma-separated list of paths to
directories to load the certificates from, directories to load the certificates from,
or path to individual cert files. For or path to individual cert files. For
example: /my/cert_dir, /other/custom.pem. example: /my/cert_dir, /other/custom.pem.
Note that if you make changes to the TLS Note that if you make changes to the TLS
settings, you must save your changes before settings, you must save your changes before
clicking on &quot;Check synchronisation clicking on &quot;Check synchronisation
configuration&quot;. configuration&quot;.
Type: string. Type: string.
net.ignoreTlsErrors Ignore TLS certificate errors. net.ignoreTlsErrors Ignore TLS certificate errors.
Type: bool. Type: bool.
Default: false Default: false
sync.wipeOutFailSafe Fail-safe: Do not wipe out local data when sync.wipeOutFailSafe Fail-safe: Do not wipe out local data when
sync target is empty (often the result of a sync target is empty (often the result of a
misconfiguration or bug). misconfiguration or bug).
Type: bool. Type: bool.
Default: true Default: true
revisionService.enabled Enable note history. revisionService.enabled Enable note history.
Type: bool. Type: bool.
Default: true Default: true
revisionService.ttlDays Keep note history for. revisionService.ttlDays Keep note history for.
Type: int. Type: int.
Default: 90 Default: 90
cp &lt;note&gt; [notebook] cp &lt;note&gt; [notebook]
Duplicates the notes matching &lt;note&gt; to [notebook]. If no notebook is Duplicates the notes matching &lt;note&gt; to [notebook]. If no notebook is
specified the note is duplicated in the current notebook. specified the note is duplicated in the current notebook.
done &lt;note&gt; done &lt;note&gt;
@@ -927,13 +921,13 @@ done &lt;note&gt;
e2ee &lt;command&gt; [path] e2ee &lt;command&gt; [path]
Manages E2EE configuration. Commands are `enable`, `disable`, `decrypt`, Manages E2EE configuration. Commands are `enable`, `disable`, `decrypt`,
`status`, `decrypt-file` and `target-status`. `status`, `decrypt-file` and `target-status`.
-p, --password &lt;password&gt; Use this password as master password (For -p, --password &lt;password&gt; Use this password as master password (For
security reasons, it is not recommended to use security reasons, it is not recommended to use
this option). this option).
-v, --verbose More verbose output for the `target-status` -v, --verbose More verbose output for the `target-status`
command command
-o, --output &lt;directory&gt; Output directory -o, --output &lt;directory&gt; Output directory
@@ -943,12 +937,12 @@ edit &lt;note&gt;
export &lt;path&gt; export &lt;path&gt;
Exports Joplin data to the given path. By default, it will export the Exports Joplin data to the given path. By default, it will export the
complete database including notebooks, notes, tags and resources. complete database including notebooks, notes, tags and resources.
--format &lt;format&gt; Destination format: jex (Joplin Export File), raw --format &lt;format&gt; Destination format: jex (Joplin Export File), raw
(Joplin Export Directory), json (Json Export (Joplin Export Directory), json (Json Export
Directory), md (Markdown), html (HTML File), html Directory), md (Markdown), html (HTML File), html
(HTML Directory) (HTML Directory)
--note &lt;note&gt; Exports only the given note. --note &lt;note&gt; Exports only the given note.
--notebook &lt;notebook&gt; Exports only the given notebook. --notebook &lt;notebook&gt; Exports only the given notebook.
@@ -970,20 +964,20 @@ import &lt;path&gt; [notebook]
ls [note-pattern] ls [note-pattern]
Displays the notes in the current notebook. Use `ls /` to display the list Displays the notes in the current notebook. Use `ls /` to display the list
of notebooks. of notebooks.
-n, --limit &lt;num&gt; Displays only the first top &lt;num&gt; notes. -n, --limit &lt;num&gt; Displays only the first top &lt;num&gt; notes.
-s, --sort &lt;field&gt; Sorts the item by &lt;field&gt; (eg. title, updated_time, -s, --sort &lt;field&gt; Sorts the item by &lt;field&gt; (eg. title, updated_time,
created_time). created_time).
-r, --reverse Reverses the sorting order. -r, --reverse Reverses the sorting order.
-t, --type &lt;type&gt; Displays only the items of the specific type(s). -t, --type &lt;type&gt; Displays only the items of the specific type(s).
Can be `n` for notes, `t` for to-dos, or `nt` for Can be `n` for notes, `t` for to-dos, or `nt` for
notes and to-dos (eg. `-tt` would display only the notes and to-dos (eg. `-tt` would display only the
to-dos, while `-ttd` would display notes and to-dos, while `-ttd` would display notes and
to-dos. to-dos.
-f, --format &lt;format&gt; Either &quot;text&quot; or &quot;json&quot; -f, --format &lt;format&gt; Either &quot;text&quot; or &quot;json&quot;
-l, --long Use long list format. Format is ID, NOTE_COUNT (for -l, --long Use long list format. Format is ID, NOTE_COUNT (for
notebook), DATE, TODO_CHECKED (for to-dos), TITLE notebook), DATE, TODO_CHECKED (for to-dos), TITLE
mkbook &lt;new-notebook&gt; mkbook &lt;new-notebook&gt;
@@ -1020,24 +1014,24 @@ rmnote &lt;note-pattern&gt;
server &lt;command&gt; server &lt;command&gt;
Start, stop or check the API server. To specify on which port it should Start, stop or check the API server. To specify on which port it should
run, set the api.port config variable. Commands are (start|stop|status). run, set the api.port config variable. Commands are (start|stop|status).
This is an experimental feature - use at your own risks! It is recommended This is an experimental feature - use at your own risks! It is recommended
that the server runs off its own separate profile so that no two CLI that the server runs off its own separate profile so that no two CLI
instances access that profile at the same time. Use --profile to specify instances access that profile at the same time. Use --profile to specify
the profile path. the profile path.
set &lt;note&gt; &lt;name&gt; [value] set &lt;note&gt; &lt;name&gt; [value]
Sets the property &lt;name&gt; of the given &lt;note&gt; to the given [value]. Sets the property &lt;name&gt; of the given &lt;note&gt; to the given [value].
Possible properties are: Possible properties are:
parent_id (text), title (text), body (text), created_time (int), parent_id (text), title (text), body (text), created_time (int),
updated_time (int), is_conflict (int), latitude (numeric), longitude updated_time (int), is_conflict (int), latitude (numeric), longitude
(numeric), altitude (numeric), author (text), source_url (text), is_todo (numeric), altitude (numeric), author (text), source_url (text), is_todo
(int), todo_due (int), todo_completed (int), source (text), (int), todo_due (int), todo_completed (int), source (text),
source_application (text), application_data (text), order (int), source_application (text), application_data (text), order (int),
user_created_time (int), user_updated_time (int), encryption_cipher_text user_created_time (int), user_updated_time (int), encryption_cipher_text
(text), encryption_applied (int), markup_language (int), is_shared (int) (text), encryption_applied (int), markup_language (int), is_shared (int)
status status
@@ -1048,24 +1042,24 @@ sync
Synchronises with remote storage. Synchronises with remote storage.
--target &lt;target&gt; Sync to provided target (defaults to sync.target config --target &lt;target&gt; Sync to provided target (defaults to sync.target config
value) value)
tag &lt;tag-command&gt; [tag] [note] tag &lt;tag-command&gt; [tag] [note]
&lt;tag-command&gt; can be &quot;add&quot;, &quot;remove&quot;, &quot;list&quot;, or &quot;notetags&quot; to assign or &lt;tag-command&gt; can be &quot;add&quot;, &quot;remove&quot;, &quot;list&quot;, or &quot;notetags&quot; to assign or
remove [tag] from [note], to list notes associated with [tag], or to list remove [tag] from [note], to list notes associated with [tag], or to list
tags associated with [note]. The command `tag list` can be used to list tags associated with [note]. The command `tag list` can be used to list
all the tags (use -l for long option). all the tags (use -l for long option).
-l, --long Use long list format. Format is ID, NOTE_COUNT (for notebook), -l, --long Use long list format. Format is ID, NOTE_COUNT (for notebook),
DATE, TODO_CHECKED (for to-dos), TITLE DATE, TODO_CHECKED (for to-dos), TITLE
todo &lt;todo-command&gt; &lt;note-pattern&gt; todo &lt;todo-command&gt; &lt;note-pattern&gt;
&lt;todo-command&gt; can either be &quot;toggle&quot; or &quot;clear&quot;. Use &quot;toggle&quot; to toggle &lt;todo-command&gt; can either be &quot;toggle&quot; or &quot;clear&quot;. Use &quot;toggle&quot; to toggle
the given to-do between completed and uncompleted state (If the target is the given to-do between completed and uncompleted state (If the target is
a regular note it will be converted to a to-do). Use &quot;clear&quot; to convert a regular note it will be converted to a to-do). Use &quot;clear&quot; to convert
the to-do back to a regular note. the to-do back to a regular note.
undone &lt;note&gt; undone &lt;note&gt;
@@ -1074,7 +1068,7 @@ undone &lt;note&gt;
use &lt;notebook&gt; use &lt;notebook&gt;
Switches to [notebook] - all further operations will happen within this Switches to [notebook] - all further operations will happen within this
notebook. notebook.
version version
@@ -1082,7 +1076,7 @@ version
Displays version information Displays version information
</code></pre> </code></pre>
<h1>License<a name="license" href="#license" class="heading-anchor">🔗</a></h1> <h1>License<a name="license" href="#license" class="heading-anchor">🔗</a></h1>
<p>Copyright (c) 2016-2021 Laurent Cozic</p> <p>Copyright (c) 2016-2020 Laurent Cozic</p>
<p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the &quot;Software&quot;), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:</p> <p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the &quot;Software&quot;), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:</p>
<p>The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.</p> <p>The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.</p>
<p>THE SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</p> <p>THE SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</p>

View File

@@ -410,7 +410,7 @@ https://github.com/laurent22/joplin/blob/dev/readme/welcome/3_synchronising_your
<p>Nextcloud is a self-hosted, private cloud solution. It can store documents, images and videos but also calendars, passwords and countless other things and can sync them to your laptop or phone. As you can host your own Nextcloud server, you own both the data on your device and infrastructure used for synchronisation. As such it is a good fit for Joplin.</p> <p>Nextcloud is a self-hosted, private cloud solution. It can store documents, images and videos but also calendars, passwords and countless other things and can sync them to your laptop or phone. As you can host your own Nextcloud server, you own both the data on your device and infrastructure used for synchronisation. As such it is a good fit for Joplin.</p>
<p>To set it up, go to the config screen and select Nextcloud as the synchronisation target. Then input the WebDAV URL (to get it, go to your Nextcloud page, click on Settings in the bottom left corner of the page and copy the URL). Note that it has to be the <strong>full URL</strong>, so for example if you want the notes to be under <code>/Joplin</code>, the URL would be something like <code>https://example.com/remote.php/webdav/Joplin</code> (note that &quot;/Joplin&quot; part). And <strong>make sure to create the &quot;/Joplin&quot; directory in Nextcloud</strong>. Finally set the username and password. If it does not work, please <a href="https://github.com/laurent22/joplin/issues/61#issuecomment-373282608">see this explanation</a> for more details.</p> <p>To set it up, go to the config screen and select Nextcloud as the synchronisation target. Then input the WebDAV URL (to get it, go to your Nextcloud page, click on Settings in the bottom left corner of the page and copy the URL). Note that it has to be the <strong>full URL</strong>, so for example if you want the notes to be under <code>/Joplin</code>, the URL would be something like <code>https://example.com/remote.php/webdav/Joplin</code> (note that &quot;/Joplin&quot; part). And <strong>make sure to create the &quot;/Joplin&quot; directory in Nextcloud</strong>. Finally set the username and password. If it does not work, please <a href="https://github.com/laurent22/joplin/issues/61#issuecomment-373282608">see this explanation</a> for more details.</p>
<h2>Setting up OneDrive or WebDAV synchronisation<a name="setting-up-onedrive-or-webdav-synchronisation" href="#setting-up-onedrive-or-webdav-synchronisation" class="heading-anchor">🔗</a></h2> <h2>Setting up OneDrive or WebDAV synchronisation<a name="setting-up-onedrive-or-webdav-synchronisation" href="#setting-up-onedrive-or-webdav-synchronisation" class="heading-anchor">🔗</a></h2>
<p>OneDrive and WebDAV are also supported as synchronisation services. Please see <a href="https://github.com/laurent22/joplin#synchronisation">the synchronisation documentation</a> for more information.</p> <p>OneDrive and WebDAV are also supported as synchronisation services. Please see <a href="https://github.com/laurent22/joplin#exporting">the export documentation</a> for more information.</p>
<h2>Using End-To-End Encryption<a name="using-end-to-end-encryption" href="#using-end-to-end-encryption" class="heading-anchor">🔗</a></h2> <h2>Using End-To-End Encryption<a name="using-end-to-end-encryption" href="#using-end-to-end-encryption" class="heading-anchor">🔗</a></h2>
<p>Joplin supports end-to-end encryption (E2EE) on all the applications. E2EE is a system where only the owner of the data can read it. It prevents potential eavesdroppers - including telecom providers, internet providers, and even the developers of Joplin from being able to access the data. Please see the <a href="https://joplinapp.org/e2ee/">End-To-End Encryption Tutorial</a> for more information about this feature and how to enable it.</p> <p>Joplin supports end-to-end encryption (E2EE) on all the applications. E2EE is a system where only the owner of the data can read it. It prevents potential eavesdroppers - including telecom providers, internet providers, and even the developers of Joplin from being able to access the data. Please see the <a href="https://joplinapp.org/e2ee/">End-To-End Encryption Tutorial</a> for more information about this feature and how to enable it.</p>

1095
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -17,8 +17,7 @@
"buildTranslations": "npm run tsc && node packages/tools/build-translation.js", "buildTranslations": "npm run tsc && node packages/tools/build-translation.js",
"buildTranslationsNoTsc": "node packages/tools/build-translation.js", "buildTranslationsNoTsc": "node packages/tools/build-translation.js",
"buildWebsite": "npm run buildApiDoc && node ./packages/tools/build-website.js && npm run buildPluginDoc", "buildWebsite": "npm run buildApiDoc && node ./packages/tools/build-website.js && npm run buildPluginDoc",
"circularDependencyCheck": "madge --warning --circular --extensions js ./", "circularDependencyCheck": "npx madge --warning --circular --extensions js ./",
"dependencyTree": "madge",
"clean": "lerna clean -y && lerna run clean", "clean": "lerna clean -y && lerna run clean",
"generateDatabaseTypes": "node packages/tools/generate-database-types", "generateDatabaseTypes": "node packages/tools/generate-database-types",
"linkChecker": "linkchecker https://joplinapp.org", "linkChecker": "linkchecker https://joplinapp.org",
@@ -61,7 +60,6 @@
"husky": "^3.0.2", "husky": "^3.0.2",
"lerna": "^3.22.1", "lerna": "^3.22.1",
"lint-staged": "^9.2.1", "lint-staged": "^9.2.1",
"madge": "^4.0.0",
"typedoc": "^0.17.8", "typedoc": "^0.17.8",
"typescript": "^4.0.5" "typescript": "^4.0.5"
} }

View File

@@ -1,10 +1,10 @@
const Logger = require('@joplin/lib/Logger').default; const Logger = require('@joplin/lib/Logger').default;
const Folder = require('@joplin/lib/models/Folder').default; const Folder = require('@joplin/lib/models/Folder.js');
const BaseItem = require('@joplin/lib/models/BaseItem').default; const BaseItem = require('@joplin/lib/models/BaseItem.js');
const Tag = require('@joplin/lib/models/Tag').default; const Tag = require('@joplin/lib/models/Tag.js');
const BaseModel = require('@joplin/lib/BaseModel').default; const BaseModel = require('@joplin/lib/BaseModel').default;
const Note = require('@joplin/lib/models/Note').default; const Note = require('@joplin/lib/models/Note.js');
const Resource = require('@joplin/lib/models/Resource').default; const Resource = require('@joplin/lib/models/Resource.js');
const Setting = require('@joplin/lib/models/Setting').default; const Setting = require('@joplin/lib/models/Setting').default;
const reducer = require('@joplin/lib/reducer').default; const reducer = require('@joplin/lib/reducer').default;
const { defaultState } = require('@joplin/lib/reducer'); const { defaultState } = require('@joplin/lib/reducer');
@@ -19,7 +19,7 @@ const chalk = require('chalk');
const tk = require('terminal-kit'); const tk = require('terminal-kit');
const TermWrapper = require('tkwidgets/framework/TermWrapper.js'); const TermWrapper = require('tkwidgets/framework/TermWrapper.js');
const Renderer = require('tkwidgets/framework/Renderer.js'); const Renderer = require('tkwidgets/framework/Renderer.js');
const DecryptionWorker = require('@joplin/lib/services/DecryptionWorker').default; const DecryptionWorker = require('@joplin/lib/services/DecryptionWorker');
const BaseWidget = require('tkwidgets/BaseWidget.js'); const BaseWidget = require('tkwidgets/BaseWidget.js');
const TextWidget = require('tkwidgets/TextWidget.js'); const TextWidget = require('tkwidgets/TextWidget.js');

View File

@@ -2,10 +2,10 @@ const BaseApplication = require('@joplin/lib/BaseApplication').default;
const { FoldersScreenUtils } = require('@joplin/lib/folders-screen-utils.js'); const { FoldersScreenUtils } = require('@joplin/lib/folders-screen-utils.js');
const ResourceService = require('@joplin/lib/services/ResourceService').default; const ResourceService = require('@joplin/lib/services/ResourceService').default;
const BaseModel = require('@joplin/lib/BaseModel').default; const BaseModel = require('@joplin/lib/BaseModel').default;
const Folder = require('@joplin/lib/models/Folder').default; const Folder = require('@joplin/lib/models/Folder.js');
const BaseItem = require('@joplin/lib/models/BaseItem').default; const BaseItem = require('@joplin/lib/models/BaseItem.js');
const Note = require('@joplin/lib/models/Note').default; const Note = require('@joplin/lib/models/Note.js');
const Tag = require('@joplin/lib/models/Tag').default; const Tag = require('@joplin/lib/models/Tag.js');
const Setting = require('@joplin/lib/models/Setting').default; const Setting = require('@joplin/lib/models/Setting').default;
const { reg } = require('@joplin/lib/registry.js'); const { reg } = require('@joplin/lib/registry.js');
const { fileExtension } = require('@joplin/lib/path-utils'); const { fileExtension } = require('@joplin/lib/path-utils');
@@ -13,7 +13,7 @@ const { _ } = require('@joplin/lib/locale');
const fs = require('fs-extra'); const fs = require('fs-extra');
const { cliUtils } = require('./cli-utils.js'); const { cliUtils } = require('./cli-utils.js');
const Cache = require('@joplin/lib/Cache'); const Cache = require('@joplin/lib/Cache');
const RevisionService = require('@joplin/lib/services/RevisionService').default; const RevisionService = require('@joplin/lib/services/RevisionService');
const shim = require('@joplin/lib/shim').default; const shim = require('@joplin/lib/shim').default;
class Application extends BaseApplication { class Application extends BaseApplication {

View File

@@ -1,7 +1,7 @@
const { app } = require('./app.js'); const { app } = require('./app.js');
const Note = require('@joplin/lib/models/Note').default; const Note = require('@joplin/lib/models/Note.js');
const Folder = require('@joplin/lib/models/Folder').default; const Folder = require('@joplin/lib/models/Folder.js');
const Tag = require('@joplin/lib/models/Tag').default; const Tag = require('@joplin/lib/models/Tag.js');
const { cliUtils } = require('./cli-utils.js'); const { cliUtils } = require('./cli-utils.js');
const yargParser = require('yargs-parser'); const yargParser = require('yargs-parser');
const fs = require('fs-extra'); const fs = require('fs-extra');

View File

@@ -6,8 +6,8 @@ const { dirname } = require('@joplin/lib/path-utils');
const { DatabaseDriverNode } = require('@joplin/lib/database-driver-node.js'); const { DatabaseDriverNode } = require('@joplin/lib/database-driver-node.js');
const { JoplinDatabase } = require('@joplin/lib/joplin-database.js'); const { JoplinDatabase } = require('@joplin/lib/joplin-database.js');
const BaseModel = require('@joplin/lib/BaseModel').default; const BaseModel = require('@joplin/lib/BaseModel').default;
const Folder = require('@joplin/lib/models/Folder').default; const Folder = require('@joplin/lib/models/Folder.js');
const Note = require('@joplin/lib/models/Note').default; const Note = require('@joplin/lib/models/Note.js');
const Setting = require('@joplin/lib/models/Setting').default; const Setting = require('@joplin/lib/models/Setting').default;
const { sprintf } = require('sprintf-js'); const { sprintf } = require('sprintf-js');
const exec = require('child_process').exec; const exec = require('child_process').exec;

View File

@@ -1,5 +1,5 @@
const { BaseCommand } = require('./base-command.js'); const { BaseCommand } = require('./base-command.js');
const BaseItem = require('@joplin/lib/models/BaseItem').default; const BaseItem = require('@joplin/lib/models/BaseItem');
const BaseModel = require('@joplin/lib/BaseModel').default; const BaseModel = require('@joplin/lib/BaseModel').default;
const { toTitleCase } = require('@joplin/lib/string-utils.js'); const { toTitleCase } = require('@joplin/lib/string-utils.js');
const { reg } = require('@joplin/lib/registry.js'); const { reg } = require('@joplin/lib/registry.js');
@@ -312,20 +312,6 @@ async function fetchAllNotes() {
lines.push(''); lines.push('');
lines.push('The "data" field is required, while the "props" one is not. If not specified, default values will be used.'); lines.push('The "data" field is required, while the "props" one is not. If not specified, default values will be used.');
lines.push(''); lines.push('');
lines.push('**From a plugin** the syntax to create a resource is also a bit special:');
lines.push('');
lines.push('```javascript');
lines.push('\tawait joplin.data.post(');
lines.push('\t\t["resources"],');
lines.push('\t\tnull,');
lines.push('\t\t{ title: "test.jpg" }, // Resource metadata');
lines.push('\t\t[');
lines.push('\t\t\t{');
lines.push('\t\t\t\tpath: "/path/to/test.jpg", // Actual file');
lines.push('\t\t\t},');
lines.push('\t\t]');
lines.push('\t);');
lines.push('```');
} }
if (model.type === BaseModel.TYPE_TAG) { if (model.type === BaseModel.TYPE_TAG) {

View File

@@ -2,8 +2,8 @@ const { BaseCommand } = require('./base-command.js');
const { app } = require('./app.js'); const { app } = require('./app.js');
const { _ } = require('@joplin/lib/locale'); const { _ } = require('@joplin/lib/locale');
const BaseModel = require('@joplin/lib/BaseModel').default; const BaseModel = require('@joplin/lib/BaseModel').default;
const BaseItem = require('@joplin/lib/models/BaseItem').default; const BaseItem = require('@joplin/lib/models/BaseItem.js');
const Note = require('@joplin/lib/models/Note').default; const Note = require('@joplin/lib/models/Note.js');
class Command extends BaseCommand { class Command extends BaseCommand {
usage() { usage() {

View File

@@ -2,7 +2,7 @@ const { BaseCommand } = require('./base-command.js');
const { app } = require('./app.js'); const { app } = require('./app.js');
const { _ } = require('@joplin/lib/locale'); const { _ } = require('@joplin/lib/locale');
const BaseModel = require('@joplin/lib/BaseModel').default; const BaseModel = require('@joplin/lib/BaseModel').default;
const Note = require('@joplin/lib/models/Note').default; const Note = require('@joplin/lib/models/Note.js');
class Command extends BaseCommand { class Command extends BaseCommand {
usage() { usage() {

View File

@@ -2,7 +2,7 @@ const { BaseCommand } = require('./base-command.js');
const { app } = require('./app.js'); const { app } = require('./app.js');
const { _ } = require('@joplin/lib/locale'); const { _ } = require('@joplin/lib/locale');
const BaseModel = require('@joplin/lib/BaseModel').default; const BaseModel = require('@joplin/lib/BaseModel').default;
const Note = require('@joplin/lib/models/Note').default; const Note = require('@joplin/lib/models/Note.js');
const time = require('@joplin/lib/time').default; const time = require('@joplin/lib/time').default;
class Command extends BaseCommand { class Command extends BaseCommand {

View File

@@ -1,7 +1,7 @@
const { BaseCommand } = require('./base-command.js'); const { BaseCommand } = require('./base-command.js');
const Folder = require('@joplin/lib/models/Folder').default; const Folder = require('@joplin/lib/models/Folder.js');
const Note = require('@joplin/lib/models/Note').default; const Note = require('@joplin/lib/models/Note.js');
const Tag = require('@joplin/lib/models/Tag').default; const Tag = require('@joplin/lib/models/Tag.js');
class Command extends BaseCommand { class Command extends BaseCommand {
usage() { usage() {

View File

@@ -1,8 +1,8 @@
const { BaseCommand } = require('./base-command.js'); const { BaseCommand } = require('./base-command.js');
const { _ } = require('@joplin/lib/locale'); const { _ } = require('@joplin/lib/locale');
const EncryptionService = require('@joplin/lib/services/EncryptionService').default; const EncryptionService = require('@joplin/lib/services/EncryptionService');
const DecryptionWorker = require('@joplin/lib/services/DecryptionWorker').default; const DecryptionWorker = require('@joplin/lib/services/DecryptionWorker');
const BaseItem = require('@joplin/lib/models/BaseItem').default; const BaseItem = require('@joplin/lib/models/BaseItem');
const Setting = require('@joplin/lib/models/Setting').default; const Setting = require('@joplin/lib/models/Setting').default;
const shim = require('@joplin/lib/shim').default; const shim = require('@joplin/lib/shim').default;
const pathUtils = require('@joplin/lib/path-utils'); const pathUtils = require('@joplin/lib/path-utils');

View File

@@ -4,7 +4,7 @@ const { splitCommandString } = require('@joplin/lib/string-utils.js');
const uuid = require('@joplin/lib/uuid').default; const uuid = require('@joplin/lib/uuid').default;
const { app } = require('./app.js'); const { app } = require('./app.js');
const { _ } = require('@joplin/lib/locale'); const { _ } = require('@joplin/lib/locale');
const Note = require('@joplin/lib/models/Note').default; const Note = require('@joplin/lib/models/Note.js');
const Setting = require('@joplin/lib/models/Setting').default; const Setting = require('@joplin/lib/models/Setting').default;
const BaseModel = require('@joplin/lib/BaseModel').default; const BaseModel = require('@joplin/lib/BaseModel').default;

View File

@@ -1,7 +1,7 @@
const { BaseCommand } = require('./base-command.js'); const { BaseCommand } = require('./base-command.js');
const { app } = require('./app.js'); const { app } = require('./app.js');
const Setting = require('@joplin/lib/models/Setting').default; const Setting = require('@joplin/lib/models/Setting').default;
const ReportService = require('@joplin/lib/services/ReportService').default; const { ReportService } = require('@joplin/lib/services/report.js');
const fs = require('fs-extra'); const fs = require('fs-extra');
class Command extends BaseCommand { class Command extends BaseCommand {

View File

@@ -2,7 +2,7 @@ const { BaseCommand } = require('./base-command.js');
const { app } = require('./app.js'); const { app } = require('./app.js');
const { _ } = require('@joplin/lib/locale'); const { _ } = require('@joplin/lib/locale');
const BaseModel = require('@joplin/lib/BaseModel').default; const BaseModel = require('@joplin/lib/BaseModel').default;
const Note = require('@joplin/lib/models/Note').default; const Note = require('@joplin/lib/models/Note.js');
class Command extends BaseCommand { class Command extends BaseCommand {
usage() { usage() {

View File

@@ -2,9 +2,9 @@ const { BaseCommand } = require('./base-command.js');
const { app } = require('./app.js'); const { app } = require('./app.js');
const { _ } = require('@joplin/lib/locale'); const { _ } = require('@joplin/lib/locale');
const BaseModel = require('@joplin/lib/BaseModel').default; const BaseModel = require('@joplin/lib/BaseModel').default;
const Folder = require('@joplin/lib/models/Folder').default; const Folder = require('@joplin/lib/models/Folder.js');
const Setting = require('@joplin/lib/models/Setting').default; const Setting = require('@joplin/lib/models/Setting').default;
const Note = require('@joplin/lib/models/Note').default; const Note = require('@joplin/lib/models/Note.js');
const { sprintf } = require('sprintf-js'); const { sprintf } = require('sprintf-js');
const time = require('@joplin/lib/time').default; const time = require('@joplin/lib/time').default;
const { cliUtils } = require('./cli-utils.js'); const { cliUtils } = require('./cli-utils.js');

View File

@@ -1,7 +1,7 @@
const { BaseCommand } = require('./base-command.js'); const { BaseCommand } = require('./base-command.js');
const { app } = require('./app.js'); const { app } = require('./app.js');
const { _ } = require('@joplin/lib/locale'); const { _ } = require('@joplin/lib/locale');
const Folder = require('@joplin/lib/models/Folder').default; const Folder = require('@joplin/lib/models/Folder.js');
class Command extends BaseCommand { class Command extends BaseCommand {
usage() { usage() {

View File

@@ -1,7 +1,7 @@
const { BaseCommand } = require('./base-command.js'); const { BaseCommand } = require('./base-command.js');
const { app } = require('./app.js'); const { app } = require('./app.js');
const { _ } = require('@joplin/lib/locale'); const { _ } = require('@joplin/lib/locale');
const Note = require('@joplin/lib/models/Note').default; const Note = require('@joplin/lib/models/Note.js');
class Command extends BaseCommand { class Command extends BaseCommand {
usage() { usage() {

View File

@@ -1,7 +1,7 @@
const { BaseCommand } = require('./base-command.js'); const { BaseCommand } = require('./base-command.js');
const { app } = require('./app.js'); const { app } = require('./app.js');
const { _ } = require('@joplin/lib/locale'); const { _ } = require('@joplin/lib/locale');
const Note = require('@joplin/lib/models/Note').default; const Note = require('@joplin/lib/models/Note.js');
class Command extends BaseCommand { class Command extends BaseCommand {
usage() { usage() {

View File

@@ -2,8 +2,8 @@ const { BaseCommand } = require('./base-command.js');
const { app } = require('./app.js'); const { app } = require('./app.js');
const { _ } = require('@joplin/lib/locale'); const { _ } = require('@joplin/lib/locale');
const BaseModel = require('@joplin/lib/BaseModel').default; const BaseModel = require('@joplin/lib/BaseModel').default;
const Folder = require('@joplin/lib/models/Folder').default; const Folder = require('@joplin/lib/models/Folder.js');
const Note = require('@joplin/lib/models/Note').default; const Note = require('@joplin/lib/models/Note.js');
class Command extends BaseCommand { class Command extends BaseCommand {
usage() { usage() {

View File

@@ -2,8 +2,8 @@ const { BaseCommand } = require('./base-command.js');
const { app } = require('./app.js'); const { app } = require('./app.js');
const { _ } = require('@joplin/lib/locale'); const { _ } = require('@joplin/lib/locale');
const BaseModel = require('@joplin/lib/BaseModel').default; const BaseModel = require('@joplin/lib/BaseModel').default;
const Folder = require('@joplin/lib/models/Folder').default; const Folder = require('@joplin/lib/models/Folder.js');
const Note = require('@joplin/lib/models/Note').default; const Note = require('@joplin/lib/models/Note.js');
class Command extends BaseCommand { class Command extends BaseCommand {
usage() { usage() {

View File

@@ -1,7 +1,7 @@
const { BaseCommand } = require('./base-command.js'); const { BaseCommand } = require('./base-command.js');
const { app } = require('./app.js'); const { app } = require('./app.js');
const { _ } = require('@joplin/lib/locale'); const { _ } = require('@joplin/lib/locale');
const Folder = require('@joplin/lib/models/Folder').default; const Folder = require('@joplin/lib/models/Folder.js');
const BaseModel = require('@joplin/lib/BaseModel').default; const BaseModel = require('@joplin/lib/BaseModel').default;
class Command extends BaseCommand { class Command extends BaseCommand {

View File

@@ -1,7 +1,7 @@
const { BaseCommand } = require('./base-command.js'); const { BaseCommand } = require('./base-command.js');
const { app } = require('./app.js'); const { app } = require('./app.js');
const { _ } = require('@joplin/lib/locale'); const { _ } = require('@joplin/lib/locale');
const Note = require('@joplin/lib/models/Note').default; const Note = require('@joplin/lib/models/Note.js');
const BaseModel = require('@joplin/lib/BaseModel').default; const BaseModel = require('@joplin/lib/BaseModel').default;
class Command extends BaseCommand { class Command extends BaseCommand {

View File

@@ -1,7 +1,7 @@
const { BaseCommand } = require('./base-command.js'); const { BaseCommand } = require('./base-command.js');
const { _ } = require('@joplin/lib/locale'); const { _ } = require('@joplin/lib/locale');
const BaseModel = require('@joplin/lib/BaseModel').default; const BaseModel = require('@joplin/lib/BaseModel').default;
const Folder = require('@joplin/lib/models/Folder').default; const Folder = require('@joplin/lib/models/Folder.js');
const uuid = require('@joplin/lib/uuid').default; const uuid = require('@joplin/lib/uuid').default;
class Command extends BaseCommand { class Command extends BaseCommand {

View File

@@ -3,7 +3,7 @@ const { app } = require('./app.js');
const { _ } = require('@joplin/lib/locale'); const { _ } = require('@joplin/lib/locale');
const BaseModel = require('@joplin/lib/BaseModel').default; const BaseModel = require('@joplin/lib/BaseModel').default;
const { Database } = require('@joplin/lib/database.js'); const { Database } = require('@joplin/lib/database.js');
const Note = require('@joplin/lib/models/Note').default; const Note = require('@joplin/lib/models/Note.js');
class Command extends BaseCommand { class Command extends BaseCommand {
usage() { usage() {

View File

@@ -2,7 +2,7 @@ const { BaseCommand } = require('./base-command.js');
const { app } = require('./app.js'); const { app } = require('./app.js');
const Setting = require('@joplin/lib/models/Setting').default; const Setting = require('@joplin/lib/models/Setting').default;
const { _ } = require('@joplin/lib/locale'); const { _ } = require('@joplin/lib/locale');
const ReportService = require('@joplin/lib/services/ReportService').default; const { ReportService } = require('@joplin/lib/services/report.js');
class Command extends BaseCommand { class Command extends BaseCommand {
usage() { usage() {

View File

@@ -3,7 +3,7 @@ const { app } = require('./app.js');
const { _ } = require('@joplin/lib/locale'); const { _ } = require('@joplin/lib/locale');
const { OneDriveApiNodeUtils } = require('@joplin/lib/onedrive-api-node-utils.js'); const { OneDriveApiNodeUtils } = require('@joplin/lib/onedrive-api-node-utils.js');
const Setting = require('@joplin/lib/models/Setting').default; const Setting = require('@joplin/lib/models/Setting').default;
const ResourceFetcher = require('@joplin/lib/services/ResourceFetcher').default; const ResourceFetcher = require('@joplin/lib/services/ResourceFetcher');
const Synchronizer = require('@joplin/lib/Synchronizer').default; const Synchronizer = require('@joplin/lib/Synchronizer').default;
const { reg } = require('@joplin/lib/registry.js'); const { reg } = require('@joplin/lib/registry.js');
const { cliUtils } = require('./cli-utils.js'); const { cliUtils } = require('./cli-utils.js');

View File

@@ -1,7 +1,7 @@
const { BaseCommand } = require('./base-command.js'); const { BaseCommand } = require('./base-command.js');
const { app } = require('./app.js'); const { app } = require('./app.js');
const { _ } = require('@joplin/lib/locale'); const { _ } = require('@joplin/lib/locale');
const Tag = require('@joplin/lib/models/Tag').default; const Tag = require('@joplin/lib/models/Tag.js');
const BaseModel = require('@joplin/lib/BaseModel').default; const BaseModel = require('@joplin/lib/BaseModel').default;
const time = require('@joplin/lib/time').default; const time = require('@joplin/lib/time').default;

View File

@@ -2,7 +2,7 @@ const { BaseCommand } = require('./base-command.js');
const { app } = require('./app.js'); const { app } = require('./app.js');
const { _ } = require('@joplin/lib/locale'); const { _ } = require('@joplin/lib/locale');
const BaseModel = require('@joplin/lib/BaseModel').default; const BaseModel = require('@joplin/lib/BaseModel').default;
const Note = require('@joplin/lib/models/Note').default; const Note = require('@joplin/lib/models/Note.js');
const time = require('@joplin/lib/time').default; const time = require('@joplin/lib/time').default;
class Command extends BaseCommand { class Command extends BaseCommand {

View File

@@ -2,7 +2,7 @@
const time = require('@joplin/lib/time').default; const time = require('@joplin/lib/time').default;
const Logger = require('@joplin/lib/Logger').default; const Logger = require('@joplin/lib/Logger').default;
const Resource = require('@joplin/lib/models/Resource').default; const Resource = require('@joplin/lib/models/Resource.js');
const { dirname } = require('@joplin/lib/path-utils'); const { dirname } = require('@joplin/lib/path-utils');
const FsDriverNode = require('@joplin/lib/fs-driver-node').default; const FsDriverNode = require('@joplin/lib/fs-driver-node').default;
const lodash = require('lodash'); const lodash = require('lodash');

View File

@@ -1,5 +1,5 @@
const Folder = require('@joplin/lib/models/Folder').default; const Folder = require('@joplin/lib/models/Folder.js');
const Tag = require('@joplin/lib/models/Tag').default; const Tag = require('@joplin/lib/models/Tag.js');
const BaseModel = require('@joplin/lib/BaseModel').default; const BaseModel = require('@joplin/lib/BaseModel').default;
const ListWidget = require('tkwidgets/ListWidget.js'); const ListWidget = require('tkwidgets/ListWidget.js');
const _ = require('@joplin/lib/locale')._; const _ = require('@joplin/lib/locale')._;

View File

@@ -1,4 +1,4 @@
const Note = require('@joplin/lib/models/Note').default; const Note = require('@joplin/lib/models/Note.js');
const ListWidget = require('tkwidgets/ListWidget.js'); const ListWidget = require('tkwidgets/ListWidget.js');
class NoteListWidget extends ListWidget { class NoteListWidget extends ListWidget {

View File

@@ -1,4 +1,4 @@
const Note = require('@joplin/lib/models/Note').default; const Note = require('@joplin/lib/models/Note.js');
const TextWidget = require('tkwidgets/TextWidget.js'); const TextWidget = require('tkwidgets/TextWidget.js');
class NoteMetadataWidget extends TextWidget { class NoteMetadataWidget extends TextWidget {

View File

@@ -1,4 +1,4 @@
const Note = require('@joplin/lib/models/Note').default; const Note = require('@joplin/lib/models/Note.js');
const TextWidget = require('tkwidgets/TextWidget.js'); const TextWidget = require('tkwidgets/TextWidget.js');
const { _ } = require('@joplin/lib/locale'); const { _ } = require('@joplin/lib/locale');

View File

@@ -11,15 +11,15 @@ if (compareVersion(nodeVersion, '10.0.0') < 0) {
} }
const { app } = require('./app.js'); const { app } = require('./app.js');
const Folder = require('@joplin/lib/models/Folder').default; const Folder = require('@joplin/lib/models/Folder.js');
const Resource = require('@joplin/lib/models/Resource').default; const Resource = require('@joplin/lib/models/Resource.js');
const BaseItem = require('@joplin/lib/models/BaseItem').default; const BaseItem = require('@joplin/lib/models/BaseItem.js');
const Note = require('@joplin/lib/models/Note').default; const Note = require('@joplin/lib/models/Note.js');
const Tag = require('@joplin/lib/models/Tag').default; const Tag = require('@joplin/lib/models/Tag.js');
const NoteTag = require('@joplin/lib/models/NoteTag').default; const NoteTag = require('@joplin/lib/models/NoteTag.js');
const MasterKey = require('@joplin/lib/models/MasterKey').default; const MasterKey = require('@joplin/lib/models/MasterKey');
const Setting = require('@joplin/lib/models/Setting').default; const Setting = require('@joplin/lib/models/Setting').default;
const Revision = require('@joplin/lib/models/Revision').default; const Revision = require('@joplin/lib/models/Revision.js');
const Logger = require('@joplin/lib/Logger').default; const Logger = require('@joplin/lib/Logger').default;
const FsDriverNode = require('@joplin/lib/fs-driver-node').default; const FsDriverNode = require('@joplin/lib/fs-driver-node').default;
const sharp = require('sharp'); const sharp = require('sharp');
@@ -27,7 +27,7 @@ const { shimInit } = require('@joplin/lib/shim-init-node.js');
const shim = require('@joplin/lib/shim').default; const shim = require('@joplin/lib/shim').default;
const { _ } = require('@joplin/lib/locale'); const { _ } = require('@joplin/lib/locale');
const { FileApiDriverLocal } = require('@joplin/lib/file-api-driver-local.js'); const { FileApiDriverLocal } = require('@joplin/lib/file-api-driver-local.js');
const EncryptionService = require('@joplin/lib/services/EncryptionService').default; const EncryptionService = require('@joplin/lib/services/EncryptionService');
const envFromArgs = require('@joplin/lib/envFromArgs'); const envFromArgs = require('@joplin/lib/envFromArgs');
const env = envFromArgs(process.argv); const env = envFromArgs(process.argv);

View File

@@ -1,6 +1,6 @@
{ {
"name": "joplin", "name": "joplin",
"version": "1.7.0", "version": "1.6.3",
"lockfileVersion": 1, "lockfileVersion": 1,
"requires": true, "requires": true,
"dependencies": { "dependencies": {
@@ -865,15 +865,6 @@
"@babel/types": "^7.3.0" "@babel/types": "^7.3.0"
} }
}, },
"@types/fs-extra": {
"version": "9.0.6",
"resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.6.tgz",
"integrity": "sha512-ecNRHw4clCkowNOBJH1e77nvbPxHYnWIXMv1IAoG/9+MYGkgoyr3Ppxr7XYFNL41V422EDhyV4/4SSK8L2mlig==",
"dev": true,
"requires": {
"@types/node": "*"
}
},
"@types/graceful-fs": { "@types/graceful-fs": {
"version": "4.1.4", "version": "4.1.4",
"resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.4.tgz", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.4.tgz",

View File

@@ -39,8 +39,8 @@
"node": ">=10.0.0" "node": ">=10.0.0"
}, },
"dependencies": { "dependencies": {
"@joplin/lib": "^1.7.3", "@joplin/lib": "*",
"@joplin/renderer": "^1.7.3", "@joplin/renderer": "*",
"aws-sdk": "^2.588.0", "aws-sdk": "^2.588.0",
"chalk": "^4.1.0", "chalk": "^4.1.0",
"clean-html": "^1.5.0", "clean-html": "^1.5.0",
@@ -66,7 +66,6 @@
}, },
"devDependencies": { "devDependencies": {
"@joplin/tools": "^1.0.9", "@joplin/tools": "^1.0.9",
"@types/fs-extra": "^9.0.6",
"@types/jest": "^26.0.15", "@types/jest": "^26.0.15",
"@types/node": "^14.14.6", "@types/node": "^14.14.6",
"gulp": "^4.0.2", "gulp": "^4.0.2",

View File

@@ -7,9 +7,9 @@ const { filename } = require('@joplin/lib/path-utils');
const { setupDatabaseAndSynchronizer, switchClient, expectNotThrow } = require('./test-utils.js'); const { setupDatabaseAndSynchronizer, switchClient, expectNotThrow } = require('./test-utils.js');
const { enexXmlToMd } = require('@joplin/lib/import-enex-md-gen.js'); const { enexXmlToMd } = require('@joplin/lib/import-enex-md-gen.js');
const { importEnex } = require('@joplin/lib/import-enex'); const { importEnex } = require('@joplin/lib/import-enex');
import Note from '@joplin/lib/models/Note'; const Note = require('@joplin/lib/models/Note');
import Tag from '@joplin/lib/models/Tag'; const Tag = require('@joplin/lib/models/Tag');
import Resource from '@joplin/lib/models/Resource'; const Resource = require('@joplin/lib/models/Resource');
const enexSampleBaseDir = `${__dirname}/enex_to_md`; const enexSampleBaseDir = `${__dirname}/enex_to_md`;

View File

@@ -5,8 +5,8 @@ const os = require('os');
const time = require('@joplin/lib/time').default; const time = require('@joplin/lib/time').default;
const { filename } = require('@joplin/lib/path-utils'); const { filename } = require('@joplin/lib/path-utils');
const { fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('./test-utils.js'); const { fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('./test-utils.js');
const Folder = require('@joplin/lib/models/Folder').default; const Folder = require('@joplin/lib/models/Folder.js');
const Note = require('@joplin/lib/models/Note').default; const Note = require('@joplin/lib/models/Note.js');
const BaseModel = require('@joplin/lib/BaseModel').default; const BaseModel = require('@joplin/lib/BaseModel').default;
const shim = require('@joplin/lib/shim').default; const shim = require('@joplin/lib/shim').default;
const HtmlToHtml = require('@joplin/renderer/HtmlToHtml').default; const HtmlToHtml = require('@joplin/renderer/HtmlToHtml').default;

View File

@@ -1,5 +1,5 @@
import InMemoryCache from '@joplin/lib/InMemoryCache'; import InMemoryCache from '@joplin/lib/InMemoryCache';
import time from '@joplin/lib/time'; const time = require('@joplin/lib/time').default;
describe('InMemoryCache', function() { describe('InMemoryCache', function() {

View File

@@ -2,7 +2,7 @@ import MdToHtml from '@joplin/renderer/MdToHtml';
const os = require('os'); const os = require('os');
const { filename } = require('@joplin/lib/path-utils'); const { filename } = require('@joplin/lib/path-utils');
const { setupDatabaseAndSynchronizer, switchClient } = require('./test-utils.js'); const { setupDatabaseAndSynchronizer, switchClient } = require('./test-utils.js');
import shim from '@joplin/lib/shim'; const shim = require('@joplin/lib/shim').default;
const { themeStyle } = require('@joplin/lib/theme'); const { themeStyle } = require('@joplin/lib/theme');
function newTestMdToHtml(options: any = null) { function newTestMdToHtml(options: any = null) {
@@ -14,7 +14,7 @@ function newTestMdToHtml(options: any = null) {
...options, ...options,
}; };
return new MdToHtml(options); return new MdToHtml(options);
} }
describe('MdToHtml', function() { describe('MdToHtml', function() {

View File

@@ -1,5 +1,5 @@
const mdImporterService = require('@joplin/lib/services/interop/InteropService_Importer_Md').default; const mdImporterService = require('@joplin/lib/services/interop/InteropService_Importer_Md').default;
const Note = require('@joplin/lib/models/Note').default; const Note = require('@joplin/lib/models/Note.js');
const { setupDatabaseAndSynchronizer, switchClient } = require('./test-utils.js'); const { setupDatabaseAndSynchronizer, switchClient } = require('./test-utils.js');
const importer = new mdImporterService(); const importer = new mdImporterService();

View File

@@ -2,9 +2,9 @@ import Setting from '@joplin/lib/models/Setting';
import { allNotesFolders, remoteNotesAndFolders, localNotesFoldersSameAsRemote } from './test-utils-synchronizer'; import { allNotesFolders, remoteNotesAndFolders, localNotesFoldersSameAsRemote } from './test-utils-synchronizer';
const { syncTargetName, afterAllCleanUp, synchronizerStart, setupDatabaseAndSynchronizer, synchronizer, sleep, switchClient, syncTargetId, fileApi } = require('./test-utils.js'); const { syncTargetName, afterAllCleanUp, synchronizerStart, setupDatabaseAndSynchronizer, synchronizer, sleep, switchClient, syncTargetId, fileApi } = require('./test-utils.js');
import Folder from '@joplin/lib/models/Folder'; const Folder = require('@joplin/lib/models/Folder.js');
import Note from '@joplin/lib/models/Note'; const Note = require('@joplin/lib/models/Note.js');
import BaseItem from '@joplin/lib/models/BaseItem'; const BaseItem = require('@joplin/lib/models/BaseItem.js');
const WelcomeUtils = require('@joplin/lib/WelcomeUtils'); const WelcomeUtils = require('@joplin/lib/WelcomeUtils');
describe('Synchronizer.basics', function() { describe('Synchronizer.basics', function() {

View File

@@ -3,9 +3,9 @@ import Setting from '@joplin/lib/models/Setting';
import { allNotesFolders, localNotesFoldersSameAsRemote } from './test-utils-synchronizer'; import { allNotesFolders, localNotesFoldersSameAsRemote } from './test-utils-synchronizer';
const { synchronizerStart, setupDatabaseAndSynchronizer, sleep, switchClient, syncTargetId, loadEncryptionMasterKey, decryptionWorker } = require('./test-utils.js'); const { synchronizerStart, setupDatabaseAndSynchronizer, sleep, switchClient, syncTargetId, loadEncryptionMasterKey, decryptionWorker } = require('./test-utils.js');
import Folder from '@joplin/lib/models/Folder'; const Folder = require('@joplin/lib/models/Folder.js');
import Note from '@joplin/lib/models/Note'; const Note = require('@joplin/lib/models/Note.js');
import BaseItem from '@joplin/lib/models/BaseItem'; const BaseItem = require('@joplin/lib/models/BaseItem.js');
describe('Synchronizer.conflicts', function() { describe('Synchronizer.conflicts', function() {

View File

@@ -3,12 +3,12 @@ import shim from '@joplin/lib/shim';
import Setting from '@joplin/lib/models/Setting'; import Setting from '@joplin/lib/models/Setting';
const { synchronizerStart, allSyncTargetItemsEncrypted, kvStore, setupDatabaseAndSynchronizer, synchronizer, fileApi, switchClient, encryptionService, loadEncryptionMasterKey, decryptionWorker, checkThrowAsync } = require('./test-utils.js'); const { synchronizerStart, allSyncTargetItemsEncrypted, kvStore, setupDatabaseAndSynchronizer, synchronizer, fileApi, switchClient, encryptionService, loadEncryptionMasterKey, decryptionWorker, checkThrowAsync } = require('./test-utils.js');
import Folder from '@joplin/lib/models/Folder'; const Folder = require('@joplin/lib/models/Folder.js');
import Note from '@joplin/lib/models/Note'; const Note = require('@joplin/lib/models/Note.js');
import Resource from '@joplin/lib/models/Resource'; const Resource = require('@joplin/lib/models/Resource.js');
import ResourceFetcher from '@joplin/lib/services/ResourceFetcher'; const ResourceFetcher = require('@joplin/lib/services/ResourceFetcher');
import MasterKey from '@joplin/lib/models/MasterKey'; const MasterKey = require('@joplin/lib/models/MasterKey');
import BaseItem from '@joplin/lib/models/BaseItem'; const BaseItem = require('@joplin/lib/models/BaseItem.js');
let insideBeforeEach = false; let insideBeforeEach = false;

View File

@@ -5,11 +5,11 @@ import { NoteEntity } from '@joplin/lib/services/database/types';
import { remoteNotesFoldersResources, remoteResources } from './test-utils-synchronizer'; import { remoteNotesFoldersResources, remoteResources } from './test-utils-synchronizer';
const { synchronizerStart, tempFilePath, resourceFetcher, setupDatabaseAndSynchronizer, synchronizer, fileApi, switchClient, syncTargetId, encryptionService, loadEncryptionMasterKey, fileContentEqual, checkThrowAsync } = require('./test-utils.js'); const { synchronizerStart, tempFilePath, resourceFetcher, setupDatabaseAndSynchronizer, synchronizer, fileApi, switchClient, syncTargetId, encryptionService, loadEncryptionMasterKey, fileContentEqual, checkThrowAsync } = require('./test-utils.js');
import Folder from '@joplin/lib/models/Folder'; const Folder = require('@joplin/lib/models/Folder.js');
import Note from '@joplin/lib/models/Note'; const Note = require('@joplin/lib/models/Note.js');
import Resource from '@joplin/lib/models/Resource'; const Resource = require('@joplin/lib/models/Resource.js');
import ResourceFetcher from '@joplin/lib/services/ResourceFetcher'; const ResourceFetcher = require('@joplin/lib/services/ResourceFetcher');
import BaseItem from '@joplin/lib/models/BaseItem'; const BaseItem = require('@joplin/lib/models/BaseItem.js');
let insideBeforeEach = false; let insideBeforeEach = false;
@@ -246,7 +246,7 @@ describe('Synchronizer.resources', function() {
// the content from client 2 // the content from client 2
await resourceFetcher().start(); await resourceFetcher().start();
await resourceFetcher().waitForAllFinished(); await resourceFetcher().waitForAllFinished();
const localContent = await Resource.resourceBlobContent(resource.id, 'utf8'); const localContent = await Resource.resourceBlobContent(resource.id, 'utf8');
expect(localContent).toBe('1234 MOD 2'); expect(localContent).toBe('1234 MOD 2');
// Check that the Conflict note has been generated, with the conflict resource // Check that the Conflict note has been generated, with the conflict resource
@@ -259,7 +259,7 @@ describe('Synchronizer.resources', function() {
expect(!!conflictNote).toBe(true); expect(!!conflictNote).toBe(true);
const resourceIds = await Note.linkedResourceIds(conflictNote.body); const resourceIds = await Note.linkedResourceIds(conflictNote.body);
expect(resourceIds.length).toBe(1); expect(resourceIds.length).toBe(1);
const conflictContent = await Resource.resourceBlobContent(resourceIds[0], 'utf8'); const conflictContent = await Resource.resourceBlobContent(resourceIds[0], 'utf8');
expect(conflictContent).toBe('1234 MOD 1'); expect(conflictContent).toBe('1234 MOD 1');
} }
})); }));

View File

@@ -2,8 +2,8 @@ import Setting from '@joplin/lib/models/Setting';
import BaseModel from '@joplin/lib/BaseModel'; import BaseModel from '@joplin/lib/BaseModel';
const { synchronizerStart, revisionService, setupDatabaseAndSynchronizer, synchronizer, switchClient, encryptionService, loadEncryptionMasterKey, decryptionWorker } = require('./test-utils.js'); const { synchronizerStart, revisionService, setupDatabaseAndSynchronizer, synchronizer, switchClient, encryptionService, loadEncryptionMasterKey, decryptionWorker } = require('./test-utils.js');
import Note from '@joplin/lib/models/Note'; const Note = require('@joplin/lib/models/Note.js');
import Revision from '@joplin/lib/models/Revision'; const Revision = require('@joplin/lib/models/Revision.js');
describe('Synchronizer.revisions', function() { describe('Synchronizer.revisions', function() {

View File

@@ -1,10 +1,10 @@
import Setting from '@joplin/lib/models/Setting'; import Setting from '@joplin/lib/models/Setting';
const { synchronizerStart, setupDatabaseAndSynchronizer, switchClient, encryptionService, loadEncryptionMasterKey } = require('./test-utils.js'); const { synchronizerStart, setupDatabaseAndSynchronizer, switchClient, encryptionService, loadEncryptionMasterKey } = require('./test-utils.js');
import Folder from '@joplin/lib/models/Folder'; const Folder = require('@joplin/lib/models/Folder.js');
import Note from '@joplin/lib/models/Note'; const Note = require('@joplin/lib/models/Note.js');
import Tag from '@joplin/lib/models/Tag'; const Tag = require('@joplin/lib/models/Tag.js');
import MasterKey from '@joplin/lib/models/MasterKey'; const MasterKey = require('@joplin/lib/models/MasterKey');
describe('Synchronizer.tags', function() { describe('Synchronizer.tags', function() {

View File

@@ -3,8 +3,8 @@
const time = require('@joplin/lib/time').default; const time = require('@joplin/lib/time').default;
const { sortedIds, createNTestNotes, fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('./test-utils.js'); const { sortedIds, createNTestNotes, fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('./test-utils.js');
const Folder = require('@joplin/lib/models/Folder').default; const Folder = require('@joplin/lib/models/Folder.js');
const Note = require('@joplin/lib/models/Note').default; const Note = require('@joplin/lib/models/Note.js');
const Setting = require('@joplin/lib/models/Setting').default; const Setting = require('@joplin/lib/models/Setting').default;
const BaseModel = require('@joplin/lib/BaseModel').default; const BaseModel = require('@joplin/lib/BaseModel').default;
const ArrayUtils = require('@joplin/lib/ArrayUtils.js'); const ArrayUtils = require('@joplin/lib/ArrayUtils.js');

View File

@@ -1 +0,0 @@
<span style="color: rgb(5, 5, 5); font-family: &quot;Segoe UI Historic&quot;, &quot;Segoe UI&quot;, Helvetica, Arial, sans-serif; font-size: 15px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(240, 242, 245); text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;">This should not actually be visible</span>

View File

@@ -1 +0,0 @@
This should not actually be visible

View File

@@ -1,8 +1,8 @@
const { id, ids, createNTestFolders, sortedIds, createNTestNotes, TestApp } = require('./test-utils.js'); const { id, ids, createNTestFolders, sortedIds, createNTestNotes, TestApp } = require('./test-utils.js');
const BaseModel = require('@joplin/lib/BaseModel').default; const BaseModel = require('@joplin/lib/BaseModel').default;
const uuid = require('@joplin/lib/uuid').default; const uuid = require('@joplin/lib/uuid').default;
const Note = require('@joplin/lib/models/Note').default; const Note = require('@joplin/lib/models/Note.js');
const Folder = require('@joplin/lib/models/Folder').default; const Folder = require('@joplin/lib/models/Folder.js');
const { ALL_NOTES_FILTER_ID } = require('@joplin/lib/reserved-ids.js'); const { ALL_NOTES_FILTER_ID } = require('@joplin/lib/reserved-ids.js');

View File

@@ -1,9 +1,9 @@
/* eslint-disable no-unused-vars */ /* eslint-disable no-unused-vars */
const { setupDatabaseAndSynchronizer, switchClient, createNTestFolders, createNTestNotes, createNTestTags, TestApp } = require('./test-utils.js'); const { setupDatabaseAndSynchronizer, switchClient, createNTestFolders, createNTestNotes, createNTestTags, TestApp } = require('./test-utils.js');
const Setting = require('@joplin/lib/models/Setting').default; const Setting = require('@joplin/lib/models/Setting').default;
const Folder = require('@joplin/lib/models/Folder').default; const Folder = require('@joplin/lib/models/Folder.js');
const Note = require('@joplin/lib/models/Note').default; const Note = require('@joplin/lib/models/Note.js');
const Tag = require('@joplin/lib/models/Tag').default; const Tag = require('@joplin/lib/models/Tag.js');
const time = require('@joplin/lib/time').default; const time = require('@joplin/lib/time').default;
let testApp = null; let testApp = null;

View File

@@ -1,9 +1,9 @@
/* eslint-disable no-unused-vars */ /* eslint-disable no-unused-vars */
const { setupDatabaseAndSynchronizer, switchClient, id, ids, sortedIds, at, createNTestFolders, createNTestNotes, createNTestTags, TestApp } = require('./test-utils.js'); const { setupDatabaseAndSynchronizer, switchClient, id, ids, sortedIds, at, createNTestFolders, createNTestNotes, createNTestTags, TestApp } = require('./test-utils.js');
const Setting = require('@joplin/lib/models/Setting').default; const Setting = require('@joplin/lib/models/Setting').default;
const Folder = require('@joplin/lib/models/Folder').default; const Folder = require('@joplin/lib/models/Folder.js');
const Note = require('@joplin/lib/models/Note').default; const Note = require('@joplin/lib/models/Note.js');
const Tag = require('@joplin/lib/models/Tag').default; const Tag = require('@joplin/lib/models/Tag.js');
const time = require('@joplin/lib/time').default; const time = require('@joplin/lib/time').default;
const { ALL_NOTES_FILTER_ID } = require('@joplin/lib/reserved-ids.js'); const { ALL_NOTES_FILTER_ID } = require('@joplin/lib/reserved-ids.js');

View File

@@ -1,9 +1,9 @@
/* eslint-disable no-unused-vars */ /* eslint-disable no-unused-vars */
const { setupDatabaseAndSynchronizer, switchClient, createNTestFolders, createNTestNotes, createNTestTags, TestApp } = require('./test-utils.js'); const { setupDatabaseAndSynchronizer, switchClient, createNTestFolders, createNTestNotes, createNTestTags, TestApp } = require('./test-utils.js');
const Setting = require('@joplin/lib/models/Setting').default; const Setting = require('@joplin/lib/models/Setting').default;
const Folder = require('@joplin/lib/models/Folder').default; const Folder = require('@joplin/lib/models/Folder.js');
const Note = require('@joplin/lib/models/Note').default; const Note = require('@joplin/lib/models/Note.js');
const Tag = require('@joplin/lib/models/Tag').default; const Tag = require('@joplin/lib/models/Tag.js');
const time = require('@joplin/lib/time').default; const time = require('@joplin/lib/time').default;
let testApp = null; let testApp = null;

View File

@@ -1,4 +1,6 @@
import htmlUtils from '@joplin/lib/htmlUtils'; /* eslint-disable no-unused-vars */
const htmlUtils = require('@joplin/lib/htmlUtils.js');
describe('htmlUtils', function() { describe('htmlUtils', function() {
@@ -17,8 +19,8 @@ describe('htmlUtils', function() {
]; ];
for (let i = 0; i < testCases.length; i++) { for (let i = 0; i < testCases.length; i++) {
const md = testCases[i][0] as string; const md = testCases[i][0];
const expected = testCases[i][1] as string[]; const expected = testCases[i][1];
expect(htmlUtils.extractImageUrls(md).join(' ')).toBe(expected.join(' ')); expect(htmlUtils.extractImageUrls(md).join(' ')).toBe(expected.join(' '));
} }
@@ -31,19 +33,19 @@ describe('htmlUtils', function() {
['<img src="http://test.com/img.png" alt="testing" >', ['http://other.com/img.png'], '<img src="http://other.com/img.png" alt="testing" >'], ['<img src="http://test.com/img.png" alt="testing" >', ['http://other.com/img.png'], '<img src="http://other.com/img.png" alt="testing" >'],
]; ];
const callback = (urls: string[]) => { const callback = (urls) => {
let i = -1; let i = -1;
return function(_src: string) { return function(src) {
i++; i++;
return urls[i]; return urls[i];
}; };
}; };
for (let i = 0; i < testCases.length; i++) { for (let i = 0; i < testCases.length; i++) {
const md = testCases[i][0] as string; const md = testCases[i][0];
const r = htmlUtils.replaceImageUrls(md, callback(testCases[i][1] as string[])); const r = htmlUtils.replaceImageUrls(md, callback(testCases[i][1]));
expect(r.trim()).toBe((testCases[i][2] as string).trim()); expect(r.trim()).toBe(testCases[i][2].trim());
} }
})); }));

View File

@@ -3,10 +3,10 @@
const time = require('@joplin/lib/time').default; const time = require('@joplin/lib/time').default;
const { fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('./test-utils.js'); const { fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('./test-utils.js');
const Folder = require('@joplin/lib/models/Folder').default; const Folder = require('@joplin/lib/models/Folder.js');
const Note = require('@joplin/lib/models/Note').default; const Note = require('@joplin/lib/models/Note.js');
const BaseItem = require('@joplin/lib/models/BaseItem').default; const BaseItem = require('@joplin/lib/models/BaseItem.js');
const Resource = require('@joplin/lib/models/Resource').default; const Resource = require('@joplin/lib/models/Resource.js');
const BaseModel = require('@joplin/lib/BaseModel').default; const BaseModel = require('@joplin/lib/BaseModel').default;
const shim = require('@joplin/lib/shim').default; const shim = require('@joplin/lib/shim').default;

View File

@@ -1,7 +1,7 @@
import { FolderEntity } from '@joplin/lib/services/database/types'; import { FolderEntity } from '@joplin/lib/services/database/types';
import { createNTestNotes, setupDatabaseAndSynchronizer, sleep, switchClient, checkThrowAsync } from './test-utils'; const { createNTestNotes, setupDatabaseAndSynchronizer, sleep, switchClient, checkThrowAsync } = require('./test-utils.js');
import Folder from '@joplin/lib/models/Folder'; const Folder = require('@joplin/lib/models/Folder.js');
import Note from '@joplin/lib/models/Note'; const Note = require('@joplin/lib/models/Note.js');
async function allItems() { async function allItems() {
const folders = await Folder.all(); const folders = await Folder.all();
@@ -169,9 +169,9 @@ describe('models_Folder', function() {
await Note.save({ title: 'note1', parent_id: f3.id }); await Note.save({ title: 'note1', parent_id: f3.id });
await Note.save({ title: 'note2', parent_id: f3.id }); await Note.save({ title: 'note2', parent_id: f3.id });
await Note.save({ title: 'note3', parent_id: f1.id }); await Note.save({ title: 'note3', parent_id: f1.id });
await Note.save({ title: 'note4', parent_id: f3.id, is_todo: 1, todo_completed: 0 }); await Note.save({ title: 'note4', parent_id: f3.id, is_todo: true, todo_completed: 0 });
await Note.save({ title: 'note5', parent_id: f3.id, is_todo: 1, todo_completed: 999 }); await Note.save({ title: 'note5', parent_id: f3.id, is_todo: true, todo_completed: 999 });
await Note.save({ title: 'note6', parent_id: f3.id, is_todo: 1, todo_completed: 999 }); await Note.save({ title: 'note6', parent_id: f3.id, is_todo: true, todo_completed: 999 });
const folders = await Folder.all(); const folders = await Folder.all();
await Folder.addNoteCounts(folders, false); await Folder.addNoteCounts(folders, false);

View File

@@ -3,12 +3,12 @@
const time = require('@joplin/lib/time').default; const time = require('@joplin/lib/time').default;
const { fileContentEqual, revisionService, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('./test-utils.js'); const { fileContentEqual, revisionService, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('./test-utils.js');
const SearchEngine = require('@joplin/lib/services/searchengine/SearchEngine').default; const SearchEngine = require('@joplin/lib/services/searchengine/SearchEngine');
const ResourceService = require('@joplin/lib/services/ResourceService').default; const ResourceService = require('@joplin/lib/services/ResourceService').default;
const ItemChangeUtils = require('@joplin/lib/services/ItemChangeUtils').default; const ItemChangeUtils = require('@joplin/lib/services/ItemChangeUtils');
const Note = require('@joplin/lib/models/Note').default; const Note = require('@joplin/lib/models/Note');
const Setting = require('@joplin/lib/models/Setting').default; const Setting = require('@joplin/lib/models/Setting').default;
const ItemChange = require('@joplin/lib/models/ItemChange').default; const ItemChange = require('@joplin/lib/models/ItemChange');
let searchEngine = null; let searchEngine = null;

View File

@@ -3,8 +3,8 @@ import BaseModel from '@joplin/lib/BaseModel';
import shim from '@joplin/lib/shim'; import shim from '@joplin/lib/shim';
import markdownUtils from '@joplin/lib/markdownUtils'; import markdownUtils from '@joplin/lib/markdownUtils';
const { sortedIds, createNTestNotes, setupDatabaseAndSynchronizer, switchClient, checkThrowAsync } = require('./test-utils.js'); const { sortedIds, createNTestNotes, setupDatabaseAndSynchronizer, switchClient, checkThrowAsync } = require('./test-utils.js');
import Folder from '@joplin/lib/models/Folder'; const Folder = require('@joplin/lib/models/Folder.js');
import Note from '@joplin/lib/models/Note'; const Note = require('@joplin/lib/models/Note.js');
const ArrayUtils = require('@joplin/lib/ArrayUtils.js'); const ArrayUtils = require('@joplin/lib/ArrayUtils.js');
async function allItems() { async function allItems() {
@@ -55,7 +55,7 @@ describe('models_Note', function() {
for (let i = 0; i < testCases.length; i++) { for (let i = 0; i < testCases.length; i++) {
const t = testCases[i]; const t = testCases[i];
const input = t[0] as string; const input = t[0];
const expected = t[1]; const expected = t[1];
const actual = Note.linkedItemIds(input); const actual = Note.linkedItemIds(input);
const contentEquals = ArrayUtils.contentEquals(actual, expected); const contentEquals = ArrayUtils.contentEquals(actual, expected);
@@ -204,7 +204,7 @@ describe('models_Note', function() {
const folder2 = await Folder.save({ title: Folder.conflictFolderTitle(), id: Folder.conflictFolderId() }); const folder2 = await Folder.save({ title: Folder.conflictFolderTitle(), id: Folder.conflictFolderId() });
const note1 = await Note.save({ title: 'note', parent_id: folder1.id }); const note1 = await Note.save({ title: 'note', parent_id: folder1.id });
const hasThrown = await checkThrowAsync(async () => await Note.copyToFolder(note1.id, folder2.id)); const hasThrown = await checkThrowAsync(async () => await Folder.copyToFolder(note1.id, folder2.id));
expect(hasThrown).toBe(true); expect(hasThrown).toBe(true);
})); }));
@@ -260,7 +260,7 @@ describe('models_Note', function() {
for (const testCase of testCases) { for (const testCase of testCases) {
const [useAbsolutePaths, input, expected] = testCase; const [useAbsolutePaths, input, expected] = testCase;
const internalToExternal = await Note.replaceResourceInternalToExternalLinks(input as string, { useAbsolutePaths }); const internalToExternal = await Note.replaceResourceInternalToExternalLinks(input, { useAbsolutePaths });
expect(internalToExternal).toBe(expected); expect(internalToExternal).toBe(expected);
const externalToInternal = await Note.replaceResourceExternalToInternalLinks(internalToExternal, { useAbsolutePaths }); const externalToInternal = await Note.replaceResourceExternalToInternalLinks(internalToExternal, { useAbsolutePaths });
@@ -280,11 +280,11 @@ describe('models_Note', function() {
}); });
expect(sortedNotes.length).toBe(0); expect(sortedNotes.length).toBe(0);
const note0 = await Note.save({ title: 'A3', parent_id: folder1.id, is_todo: 0 }); const note0 = await Note.save({ title: 'A3', parent_id: folder1.id, is_todo: false });
const note1 = await Note.save({ title: 'A20', parent_id: folder1.id, is_todo: 0 }); const note1 = await Note.save({ title: 'A20', parent_id: folder1.id, is_todo: false });
const note2 = await Note.save({ title: 'A100', parent_id: folder1.id, is_todo: 0 }); const note2 = await Note.save({ title: 'A100', parent_id: folder1.id, is_todo: false });
const note3 = await Note.save({ title: 'égalité', parent_id: folder1.id, is_todo: 0 }); const note3 = await Note.save({ title: 'égalité', parent_id: folder1.id, is_todo: false });
const note4 = await Note.save({ title: 'z', parent_id: folder1.id, is_todo: 0 }); const note4 = await Note.save({ title: 'z', parent_id: folder1.id, is_todo: false });
const sortedNotes2 = await Note.previews(folder1.id, { const sortedNotes2 = await Note.previews(folder1.id, {
fields: ['id', 'title'], fields: ['id', 'title'],

View File

@@ -3,8 +3,8 @@
const time = require('@joplin/lib/time').default; const time = require('@joplin/lib/time').default;
const { sortedIds, createNTestNotes, fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('./test-utils.js'); const { sortedIds, createNTestNotes, fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('./test-utils.js');
const Folder = require('@joplin/lib/models/Folder').default; const Folder = require('@joplin/lib/models/Folder.js');
const Note = require('@joplin/lib/models/Note').default; const Note = require('@joplin/lib/models/Note.js');
const Setting = require('@joplin/lib/models/Setting').default; const Setting = require('@joplin/lib/models/Setting').default;
const BaseModel = require('@joplin/lib/BaseModel').default; const BaseModel = require('@joplin/lib/BaseModel').default;
const ArrayUtils = require('@joplin/lib/ArrayUtils.js'); const ArrayUtils = require('@joplin/lib/ArrayUtils.js');

View File

@@ -3,9 +3,9 @@
const time = require('@joplin/lib/time').default; const time = require('@joplin/lib/time').default;
const { fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('./test-utils.js'); const { fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('./test-utils.js');
const Folder = require('@joplin/lib/models/Folder').default; const Folder = require('@joplin/lib/models/Folder.js');
const Note = require('@joplin/lib/models/Note').default; const Note = require('@joplin/lib/models/Note.js');
const Resource = require('@joplin/lib/models/Resource').default; const Resource = require('@joplin/lib/models/Resource.js');
const BaseModel = require('@joplin/lib/BaseModel').default; const BaseModel = require('@joplin/lib/BaseModel').default;
const shim = require('@joplin/lib/shim').default; const shim = require('@joplin/lib/shim').default;

View File

@@ -3,11 +3,11 @@
const time = require('@joplin/lib/time').default; const time = require('@joplin/lib/time').default;
const { fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('./test-utils.js'); const { fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('./test-utils.js');
const Folder = require('@joplin/lib/models/Folder').default; const Folder = require('@joplin/lib/models/Folder.js');
const Note = require('@joplin/lib/models/Note').default; const Note = require('@joplin/lib/models/Note.js');
const NoteTag = require('@joplin/lib/models/NoteTag').default; const NoteTag = require('@joplin/lib/models/NoteTag.js');
const Tag = require('@joplin/lib/models/Tag').default; const Tag = require('@joplin/lib/models/Tag.js');
const Revision = require('@joplin/lib/models/Revision').default; const Revision = require('@joplin/lib/models/Revision.js');
const BaseModel = require('@joplin/lib/BaseModel').default; const BaseModel = require('@joplin/lib/BaseModel').default;
const shim = require('@joplin/lib/shim').default; const shim = require('@joplin/lib/shim').default;

View File

@@ -1,4 +1,4 @@
import Setting, { SettingSectionSource } from '@joplin/lib/models/Setting'; import Setting from '@joplin/lib/models/Setting';
const { setupDatabaseAndSynchronizer, switchClient, expectThrow, expectNotThrow } = require('./test-utils.js'); const { setupDatabaseAndSynchronizer, switchClient, expectThrow, expectNotThrow } = require('./test-utils.js');
@@ -121,7 +121,7 @@ describe('models_Setting', function() {
})); }));
it('should register new sections', (async () => { it('should register new sections', (async () => {
await Setting.registerSection('mySection', SettingSectionSource.Default, { await Setting.registerSection('mySection', {
label: 'My section', label: 'My section',
}); });

View File

@@ -3,10 +3,10 @@
const time = require('@joplin/lib/time').default; const time = require('@joplin/lib/time').default;
const { fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('./test-utils.js'); const { fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('./test-utils.js');
const Folder = require('@joplin/lib/models/Folder').default; const Folder = require('@joplin/lib/models/Folder.js');
const Note = require('@joplin/lib/models/Note').default; const Note = require('@joplin/lib/models/Note.js');
const NoteTag = require('@joplin/lib/models/NoteTag').default; const NoteTag = require('@joplin/lib/models/NoteTag.js');
const Tag = require('@joplin/lib/models/Tag').default; const Tag = require('@joplin/lib/models/Tag.js');
const BaseModel = require('@joplin/lib/BaseModel').default; const BaseModel = require('@joplin/lib/BaseModel').default;
const shim = require('@joplin/lib/shim').default; const shim = require('@joplin/lib/shim').default;

View File

@@ -1,9 +1,9 @@
/* eslint-disable no-unused-vars */ /* eslint-disable no-unused-vars */
const { setupDatabaseAndSynchronizer, switchClient, createNTestNotes, createNTestFolders, createNTestTags } = require('./test-utils.js'); const { setupDatabaseAndSynchronizer, switchClient, createNTestNotes, createNTestFolders, createNTestTags } = require('./test-utils.js');
const Folder = require('@joplin/lib/models/Folder').default; const Folder = require('@joplin/lib/models/Folder.js');
const Note = require('@joplin/lib/models/Note').default; const Note = require('@joplin/lib/models/Note.js');
const Tag = require('@joplin/lib/models/Tag').default; const Tag = require('@joplin/lib/models/Tag.js');
const reducer = require('@joplin/lib/reducer').default; const reducer = require('@joplin/lib/reducer').default;
const { defaultState, stateUtils, MAX_HISTORY } = require('@joplin/lib/reducer'); const { defaultState, stateUtils, MAX_HISTORY } = require('@joplin/lib/reducer');

View File

@@ -1,7 +1,7 @@
import Setting from '@joplin/lib/models/Setting'; import Setting from '@joplin/lib/models/Setting';
import PluginService from '@joplin/lib/services/plugins/PluginService'; import PluginService from '@joplin/lib/services/plugins/PluginService';
const { waitForFolderCount, newPluginService, newPluginScript, setupDatabaseAndSynchronizer, switchClient, afterEachCleanUp } = require('../../../test-utils'); const { waitForFolderCount, newPluginService, newPluginScript, setupDatabaseAndSynchronizer, switchClient, afterEachCleanUp } = require('../../../test-utils');
import Folder from '@joplin/lib/models/Folder'; const Folder = require('@joplin/lib/models/Folder');
describe('JoplinSettings', () => { describe('JoplinSettings', () => {

View File

@@ -2,9 +2,9 @@ import Setting from '@joplin/lib/models/Setting';
import PluginService from '@joplin/lib/services/plugins/PluginService'; import PluginService from '@joplin/lib/services/plugins/PluginService';
const { newPluginService, newPluginScript, setupDatabaseAndSynchronizer, switchClient, afterEachCleanUp } = require('../../../test-utils'); const { newPluginService, newPluginScript, setupDatabaseAndSynchronizer, switchClient, afterEachCleanUp } = require('../../../test-utils');
import Note from '@joplin/lib/models/Note'; const Note = require('@joplin/lib/models/Note');
import Folder from '@joplin/lib/models/Folder'; const Folder = require('@joplin/lib/models/Folder');
import ItemChange from '@joplin/lib/models/ItemChange'; const ItemChange = require('@joplin/lib/models/ItemChange');
describe('JoplinWorkspace', () => { describe('JoplinWorkspace', () => {

View File

@@ -141,7 +141,7 @@ describe('services_CommandService', function() {
expect(toolbarInfos1[0] === toolbarInfos2[0]).toBe(true); expect(toolbarInfos1[0] === toolbarInfos2[0]).toBe(true);
expect(toolbarInfos1[1] === toolbarInfos2[1]).toBe(true); expect(toolbarInfos1[1] === toolbarInfos2[1]).toBe(true);
const toolbarInfos3 = toolbarButtonUtils.commandsToToolbarButtons(['test1', 'test2'], { const toolbarInfos3 = toolbarButtonUtils.commandsToToolbarButtons(['test1', 'test2'], {
cond1: true, cond1: true,
cond2: true, cond2: true,
}); });

View File

@@ -3,16 +3,16 @@
const time = require('@joplin/lib/time').default; const time = require('@joplin/lib/time').default;
const { fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('./test-utils.js'); const { fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('./test-utils.js');
const Folder = require('@joplin/lib/models/Folder').default; const Folder = require('@joplin/lib/models/Folder.js');
const Note = require('@joplin/lib/models/Note').default; const Note = require('@joplin/lib/models/Note.js');
const Tag = require('@joplin/lib/models/Tag').default; const Tag = require('@joplin/lib/models/Tag.js');
const { Database } = require('@joplin/lib/database.js'); const { Database } = require('@joplin/lib/database.js');
const Setting = require('@joplin/lib/models/Setting').default; const Setting = require('@joplin/lib/models/Setting').default;
const BaseItem = require('@joplin/lib/models/BaseItem').default; const BaseItem = require('@joplin/lib/models/BaseItem.js');
const BaseModel = require('@joplin/lib/BaseModel').default; const BaseModel = require('@joplin/lib/BaseModel').default;
const MasterKey = require('@joplin/lib/models/MasterKey').default; const MasterKey = require('@joplin/lib/models/MasterKey');
const SyncTargetRegistry = require('@joplin/lib/SyncTargetRegistry.js'); const SyncTargetRegistry = require('@joplin/lib/SyncTargetRegistry.js');
const EncryptionService = require('@joplin/lib/services/EncryptionService').default; const EncryptionService = require('@joplin/lib/services/EncryptionService.js');
let service = null; let service = null;
@@ -21,7 +21,7 @@ describe('services_EncryptionService', function() {
beforeEach(async (done) => { beforeEach(async (done) => {
await setupDatabaseAndSynchronizer(1); await setupDatabaseAndSynchronizer(1);
await switchClient(1); await switchClient(1);
service = new EncryptionService(); service = new EncryptionService();
BaseItem.encryptionService_ = service; BaseItem.encryptionService_ = service;
Setting.setValue('encryption.enabled', true); Setting.setValue('encryption.enabled', true);
done(); done();

View File

@@ -3,10 +3,10 @@ import { CustomExportContext, CustomImportContext, Module, ModuleType } from '@j
import shim from '@joplin/lib/shim'; import shim from '@joplin/lib/shim';
const { fileContentEqual, setupDatabaseAndSynchronizer, switchClient, checkThrowAsync, exportDir } = require('./test-utils.js'); const { fileContentEqual, setupDatabaseAndSynchronizer, switchClient, checkThrowAsync, exportDir } = require('./test-utils.js');
import Folder from '@joplin/lib/models/Folder'; const Folder = require('@joplin/lib/models/Folder.js');
import Note from '@joplin/lib/models/Note'; const Note = require('@joplin/lib/models/Note.js');
import Tag from '@joplin/lib/models/Tag'; const Tag = require('@joplin/lib/models/Tag.js');
import Resource from '@joplin/lib/models/Resource'; const Resource = require('@joplin/lib/models/Resource.js');
const fs = require('fs-extra'); const fs = require('fs-extra');
const ArrayUtils = require('@joplin/lib/ArrayUtils'); const ArrayUtils = require('@joplin/lib/ArrayUtils');

View File

@@ -5,9 +5,9 @@ const fs = require('fs-extra');
const { setupDatabaseAndSynchronizer, switchClient, exportDir } = require('./test-utils.js'); const { setupDatabaseAndSynchronizer, switchClient, exportDir } = require('./test-utils.js');
const InteropService_Exporter_Md = require('@joplin/lib/services/interop/InteropService_Exporter_Md').default; const InteropService_Exporter_Md = require('@joplin/lib/services/interop/InteropService_Exporter_Md').default;
const BaseModel = require('@joplin/lib/BaseModel').default; const BaseModel = require('@joplin/lib/BaseModel').default;
const Folder = require('@joplin/lib/models/Folder').default; const Folder = require('@joplin/lib/models/Folder.js');
const Resource = require('@joplin/lib/models/Resource').default; const Resource = require('@joplin/lib/models/Resource.js');
const Note = require('@joplin/lib/models/Note').default; const Note = require('@joplin/lib/models/Note.js');
const shim = require('@joplin/lib/shim').default; const shim = require('@joplin/lib/shim').default;
describe('services_InteropService_Exporter_Md', function() { describe('services_InteropService_Exporter_Md', function() {

View File

@@ -4,11 +4,11 @@ import { ContentScriptType } from '@joplin/lib/services/plugins/api/types';
import MdToHtml from '@joplin/renderer/MdToHtml'; import MdToHtml from '@joplin/renderer/MdToHtml';
import shim from '@joplin/lib/shim'; import shim from '@joplin/lib/shim';
import Setting from '@joplin/lib/models/Setting'; import Setting from '@joplin/lib/models/Setting';
import * as fs from 'fs-extra';
import Note from '@joplin/lib/models/Note'; const fs = require('fs-extra');
import Folder from '@joplin/lib/models/Folder'; const { expectNotThrow, setupDatabaseAndSynchronizer, switchClient, expectThrow, createTempDir } = require('./test-utils.js');
import { newPluginScript } from './test-utils'; const Note = require('@joplin/lib/models/Note');
import { expectNotThrow, setupDatabaseAndSynchronizer, switchClient, expectThrow, createTempDir } from './test-utils.js'; const Folder = require('@joplin/lib/models/Folder');
const testPluginDir = `${__dirname}/../tests/support/plugins`; const testPluginDir = `${__dirname}/../tests/support/plugins`;
@@ -268,7 +268,7 @@ describe('services_PluginService', function() {
const pluginPath = `${testPluginDir}/jpl_test/org.joplinapp.FirstJplPlugin.jpl`; const pluginPath = `${testPluginDir}/jpl_test/org.joplinapp.FirstJplPlugin.jpl`;
await service.installPlugin(pluginPath); await service.installPlugin(pluginPath);
const installedPluginPath = `${Setting.value('pluginDir')}/org.joplinapp.FirstJplPlugin.jpl`; const installedPluginPath = `${Setting.value('pluginDir')}/org.joplinapp.FirstJplPlugin.jpl`;
expect(await fs.pathExists(installedPluginPath)).toBe(true); expect(await fs.existsSync(installedPluginPath)).toBe(true);
})); }));
it('should rename the plugin archive to the right name', (async () => { it('should rename the plugin archive to the right name', (async () => {
@@ -279,30 +279,7 @@ describe('services_PluginService', function() {
await shim.fsDriver().copy(pluginPath, tempPath); await shim.fsDriver().copy(pluginPath, tempPath);
const installedPluginPath = `${Setting.value('pluginDir')}/org.joplinapp.FirstJplPlugin.jpl`; const installedPluginPath = `${Setting.value('pluginDir')}/org.joplinapp.FirstJplPlugin.jpl`;
await service.installPlugin(tempPath); await service.installPlugin(tempPath);
expect(await fs.pathExists(installedPluginPath)).toBe(true); expect(await fs.existsSync(installedPluginPath)).toBe(true);
}));
it('should create the data directory', (async () => {
const pluginScript = newPluginScript(`
joplin.plugins.register({
onStart: async function() {
const dataDir = await joplin.plugins.dataDir();
joplin.data.post(['folders'], null, { title: JSON.stringify(dataDir) });
},
});
`);
const expectedPath = `${Setting.value('pluginDataDir')}/org.joplinapp.plugins.PluginTest`;
expect(await fs.pathExists(expectedPath)).toBe(false);
const service = newPluginService();
const plugin = await service.loadPluginFromJsBundle('', pluginScript);
await service.runPlugin(plugin);
expect(await fs.pathExists(expectedPath)).toBe(true);
const folders = await Folder.all();
expect(JSON.parse(folders[0].title)).toBe(expectedPath);
})); }));
}); });

View File

@@ -4,10 +4,10 @@ import ResourceService from '@joplin/lib/services/ResourceService';
import shim from '@joplin/lib/shim'; import shim from '@joplin/lib/shim';
const { resourceService, decryptionWorker, encryptionService, loadEncryptionMasterKey, allSyncTargetItemsEncrypted, setupDatabaseAndSynchronizer, db, synchronizer, switchClient } = require('./test-utils.js'); const { resourceService, decryptionWorker, encryptionService, loadEncryptionMasterKey, allSyncTargetItemsEncrypted, setupDatabaseAndSynchronizer, db, synchronizer, switchClient } = require('./test-utils.js');
import Folder from '@joplin/lib/models/Folder'; const Folder = require('@joplin/lib/models/Folder.js');
import Note from '@joplin/lib/models/Note'; const Note = require('@joplin/lib/models/Note.js');
import Resource from '@joplin/lib/models/Resource'; const Resource = require('@joplin/lib/models/Resource.js');
import SearchEngine from '@joplin/lib/services/searchengine/SearchEngine'; const SearchEngine = require('@joplin/lib/services/searchengine/SearchEngine');
describe('services_ResourceService', function() { describe('services_ResourceService', function() {

View File

@@ -3,15 +3,15 @@
const time = require('@joplin/lib/time').default; const time = require('@joplin/lib/time').default;
const { fileContentEqual, setupDatabase, revisionService, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('./test-utils.js'); const { fileContentEqual, setupDatabase, revisionService, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('./test-utils.js');
const Folder = require('@joplin/lib/models/Folder').default; const Folder = require('@joplin/lib/models/Folder.js');
const Setting = require('@joplin/lib/models/Setting').default; const Setting = require('@joplin/lib/models/Setting').default;
const Note = require('@joplin/lib/models/Note').default; const Note = require('@joplin/lib/models/Note.js');
const NoteTag = require('@joplin/lib/models/NoteTag').default; const NoteTag = require('@joplin/lib/models/NoteTag.js');
const ItemChange = require('@joplin/lib/models/ItemChange').default; const ItemChange = require('@joplin/lib/models/ItemChange.js');
const Tag = require('@joplin/lib/models/Tag').default; const Tag = require('@joplin/lib/models/Tag.js');
const Revision = require('@joplin/lib/models/Revision').default; const Revision = require('@joplin/lib/models/Revision.js');
const BaseModel = require('@joplin/lib/BaseModel').default; const BaseModel = require('@joplin/lib/BaseModel').default;
const RevisionService = require('@joplin/lib/services/RevisionService').default; const RevisionService = require('@joplin/lib/services/RevisionService.js');
const shim = require('@joplin/lib/shim').default; const shim = require('@joplin/lib/shim').default;
describe('services_Revision', function() { describe('services_Revision', function() {

View File

@@ -4,9 +4,9 @@
const time = require('@joplin/lib/time').default; const time = require('@joplin/lib/time').default;
const { fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync, restoreDate } = require('./test-utils.js'); const { fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync, restoreDate } = require('./test-utils.js');
const SearchEngine = require('@joplin/lib/services/searchengine/SearchEngine').default; const SearchEngine = require('@joplin/lib/services/searchengine/SearchEngine');
const Note = require('@joplin/lib/models/Note').default; const Note = require('@joplin/lib/models/Note');
const ItemChange = require('@joplin/lib/models/ItemChange').default; const ItemChange = require('@joplin/lib/models/ItemChange');
const Setting = require('@joplin/lib/models/Setting').default; const Setting = require('@joplin/lib/models/Setting').default;
let engine = null; let engine = null;

View File

@@ -4,13 +4,13 @@
const time = require('@joplin/lib/time').default; const time = require('@joplin/lib/time').default;
const { fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, createNTestNotes, switchClient, createNTestFolders } = require('./test-utils.js'); const { fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, createNTestNotes, switchClient, createNTestFolders } = require('./test-utils.js');
const SearchEngine = require('@joplin/lib/services/searchengine/SearchEngine').default; const SearchEngine = require('@joplin/lib/services/searchengine/SearchEngine');
const Note = require('@joplin/lib/models/Note').default; const Note = require('@joplin/lib/models/Note');
const Folder = require('@joplin/lib/models/Folder').default; const Folder = require('@joplin/lib/models/Folder');
const Tag = require('@joplin/lib/models/Tag').default; const Tag = require('@joplin/lib/models/Tag');
const ItemChange = require('@joplin/lib/models/ItemChange').default; const ItemChange = require('@joplin/lib/models/ItemChange');
const Setting = require('@joplin/lib/models/Setting').default; const Setting = require('@joplin/lib/models/Setting').default;
const Resource = require('@joplin/lib/models/Resource').default; const Resource = require('@joplin/lib/models/Resource.js');
const shim = require('@joplin/lib/shim').default; const shim = require('@joplin/lib/shim').default;
const ResourceService = require('@joplin/lib/services/ResourceService').default; const ResourceService = require('@joplin/lib/services/ResourceService').default;
@@ -513,8 +513,8 @@ describe('services_SearchFilter', function() {
const today = parseInt(time.goBackInTime(Date.now(), 0, 'day'), 10); const today = parseInt(time.goBackInTime(Date.now(), 0, 'day'), 10);
const yesterday = parseInt(time.goBackInTime(Date.now(), 1, 'day'), 10); const yesterday = parseInt(time.goBackInTime(Date.now(), 1, 'day'), 10);
const dayBeforeYesterday = parseInt(time.goBackInTime(Date.now(), 2, 'day'), 10); const dayBeforeYesterday = parseInt(time.goBackInTime(Date.now(), 2, 'day'), 10);
const n1 = await Note.save({ title: 'I made this', body: 'today', updated_time: today, user_updated_time: today }, { autoTimestamp: false }); const n1 = await Note.save({ title: 'I made this', body: 'today', updated_time: today, user_updated_time: today }, { autoTimestamp: false });
const n11 = await Note.save({ title: 'I also made this', body: 'today', updated_time: today, user_updated_time: today }, { autoTimestamp: false }); const n11 = await Note.save({ title: 'I also made this', body: 'today', updated_time: today, user_updated_time: today }, { autoTimestamp: false });
const n2 = await Note.save({ title: 'I made this', body: 'yesterday', updated_time: yesterday, user_updated_time: yesterday }, { autoTimestamp: false }); const n2 = await Note.save({ title: 'I made this', body: 'yesterday', updated_time: yesterday, user_updated_time: yesterday }, { autoTimestamp: false });
const n3 = await Note.save({ title: 'I made this', body: 'day before yesterday', updated_time: dayBeforeYesterday ,user_updated_time: dayBeforeYesterday }, { autoTimestamp: false }); const n3 = await Note.save({ title: 'I made this', body: 'day before yesterday', updated_time: dayBeforeYesterday ,user_updated_time: dayBeforeYesterday }, { autoTimestamp: false });
@@ -582,9 +582,9 @@ describe('services_SearchFilter', function() {
it('should support filtering by latitude, longitude, altitude', (async () => { it('should support filtering by latitude, longitude, altitude', (async () => {
let rows; let rows;
const n1 = await Note.save({ title: 'I made this', body: 'this week', latitude: 12.97, longitude: 88.88, altitude: 69.96 }); const n1 = await Note.save({ title: 'I made this', body: 'this week', latitude: 12.97, longitude: 88.88, altitude: 69.96 });
const n2 = await Note.save({ title: 'I made this', body: 'the week before', latitude: 42.11, longitude: 77.77, altitude: 42.00 }); const n2 = await Note.save({ title: 'I made this', body: 'the week before', latitude: 42.11, longitude: 77.77, altitude: 42.00 });
const n3 = await Note.save({ title: 'I made this', body: 'before before week', latitude: 82.01, longitude: 66.66, altitude: 13.13 }); const n3 = await Note.save({ title: 'I made this', body: 'before before week', latitude: 82.01, longitude: 66.66, altitude: 13.13 });
await engine.syncTables(); await engine.syncTables();

View File

@@ -3,13 +3,13 @@ import Api, { RequestMethod } from '@joplin/lib/services/rest/Api';
import shim from '@joplin/lib/shim'; import shim from '@joplin/lib/shim';
const { setupDatabaseAndSynchronizer, switchClient, checkThrowAsync, db, msleep } = require('./test-utils.js'); const { setupDatabaseAndSynchronizer, switchClient, checkThrowAsync, db, msleep } = require('./test-utils.js');
import Folder from '@joplin/lib/models/Folder'; const Folder = require('@joplin/lib/models/Folder');
import Resource from '@joplin/lib/models/Resource'; const Resource = require('@joplin/lib/models/Resource');
import Note from '@joplin/lib/models/Note'; const Note = require('@joplin/lib/models/Note');
import Tag from '@joplin/lib/models/Tag'; const Tag = require('@joplin/lib/models/Tag');
import NoteTag from '@joplin/lib/models/NoteTag'; const NoteTag = require('@joplin/lib/models/NoteTag');
import ResourceService from '@joplin/lib/services/ResourceService'; const ResourceService = require('@joplin/lib/services/ResourceService').default;
import SearchEngine from '@joplin/lib/services/searchengine/SearchEngine'; const SearchEngine = require('@joplin/lib/services/searchengine/SearchEngine');
const createFolderForPagination = async (num: number, time: number) => { const createFolderForPagination = async (num: number, time: number) => {
await Folder.save({ await Folder.save({
@@ -422,8 +422,8 @@ describe('services_rest_Api', function() {
const note = await Note.save({ const note = await Note.save({
title: 'ma note un', title: 'ma note un',
}); });
await Tag.addNote(tag1.id, note.id); Tag.addNote(tag1.id, note.id);
await Tag.addNote(tag2.id, note.id); Tag.addNote(tag2.id, note.id);
const response = await api.route(RequestMethod.PUT, `notes/${note.id}`, null, JSON.stringify({ const response = await api.route(RequestMethod.PUT, `notes/${note.id}`, null, JSON.stringify({
tags: `${tag1.title},${tag3.title}`, tags: `${tag1.title},${tag3.title}`,
@@ -443,8 +443,8 @@ describe('services_rest_Api', function() {
const note = await Note.save({ const note = await Note.save({
title: 'ma note un', title: 'ma note un',
}); });
await Tag.addNote(tag1.id, note.id); Tag.addNote(tag1.id, note.id);
await Tag.addNote(tag2.id, note.id); Tag.addNote(tag2.id, note.id);
const response = await api.route(RequestMethod.PUT, `notes/${note.id}`, null, JSON.stringify({ const response = await api.route(RequestMethod.PUT, `notes/${note.id}`, null, JSON.stringify({
tags: `${tag1.title},${newTagTitle}`, tags: `${tag1.title},${newTagTitle}`,
@@ -464,8 +464,8 @@ describe('services_rest_Api', function() {
const note = await Note.save({ const note = await Note.save({
title: 'ma note un', title: 'ma note un',
}); });
await Tag.addNote(tag1.id, note.id); Tag.addNote(tag1.id, note.id);
await Tag.addNote(tag2.id, note.id); Tag.addNote(tag2.id, note.id);
const response = await api.route(RequestMethod.PUT, `notes/${note.id}`, null, JSON.stringify({ const response = await api.route(RequestMethod.PUT, `notes/${note.id}`, null, JSON.stringify({
title: 'Some other title', title: 'Some other title',
@@ -484,8 +484,8 @@ describe('services_rest_Api', function() {
const note = await Note.save({ const note = await Note.save({
title: 'ma note un', title: 'ma note un',
}); });
await Tag.addNote(tag1.id, note.id); Tag.addNote(tag1.id, note.id);
await Tag.addNote(tag2.id, note.id); Tag.addNote(tag2.id, note.id);
const response = await api.route(RequestMethod.PUT, `notes/${note.id}`, null, JSON.stringify({ const response = await api.route(RequestMethod.PUT, `notes/${note.id}`, null, JSON.stringify({
tags: '', tags: '',

View File

@@ -49,17 +49,4 @@ export default class Joplin {
get views(): JoplinViews; get views(): JoplinViews;
get interop(): JoplinInterop; get interop(): JoplinInterop;
get settings(): JoplinSettings; get settings(): JoplinSettings;
/**
* It is not possible to bundle native packages with a plugin, because they
* need to work cross-platforms. Instead access to certain useful native
* packages is provided using this function.
*
* Currently these packages are available:
*
* - [sqlite3](https://www.npmjs.com/package/sqlite3)
* - [fs-extra](https://www.npmjs.com/package/fs-extra)
*
* [View the demo plugin](https://github.com/laurent22/joplin/tree/dev/packages/app-cli/tests/support/plugins/nativeModule)
*/
require(_path: string): any;
} }

View File

@@ -23,21 +23,4 @@ export default class JoplinPlugins {
* @deprecated Use joplin.contentScripts.register() * @deprecated Use joplin.contentScripts.register()
*/ */
registerContentScript(type: ContentScriptType, id: string, scriptPath: string): Promise<void>; registerContentScript(type: ContentScriptType, id: string, scriptPath: string): Promise<void>;
/**
* Gets the plugin own data directory path. Use this to store any
* plugin-related data. Unlike [[installationDir]], any data stored here
* will be persisted.
*/
dataDir(): Promise<string>;
/**
* Gets the plugin installation directory. This can be used to access any
* asset that was packaged with the plugin. This directory should be
* considered read-only because any data you store here might be deleted or
* re-created at any time. To store new persistent data, use [[dataDir]].
*/
installationDir(): Promise<string>;
/**
* @deprecated Use joplin.require()
*/
require(_path: string): any;
} }

View File

@@ -330,57 +330,16 @@ export enum SettingItemType {
export interface SettingItem { export interface SettingItem {
value: any; value: any;
type: SettingItemType; type: SettingItemType;
label: string;
description?: string;
/**
* A public setting will appear in the Configuration screen and will be
* modifiable by the user. A private setting however will not appear there,
* and can only be changed programmatically. You may use this to store some
* values that you do not want to directly expose.
*/
public: boolean; public: boolean;
label: string;
/** description?: string;
* You would usually set this to a section you would have created
* specifically for the plugin.
*/
section?: string;
/**
* To create a setting with multiple options, set this property to `true`.
* That setting will render as a dropdown list in the configuration screen.
*/
isEnum?: boolean; isEnum?: boolean;
section?: string;
/** options?: any;
* This property is required when `isEnum` is `true`. In which case, it
* should contain a map of value => label.
*/
options?: Record<any, any>;
/**
* Reserved property. Not used at the moment.
*/
appTypes?: string[]; appTypes?: string[];
/**
* Set this to `true` to store secure data, such as passwords. Any such
* setting will be stored in the system keychain if one is available.
*/
secure?: boolean; secure?: boolean;
/**
* An advanced setting will be moved under the "Advanced" button in the
* config screen.
*/
advanced?: boolean; advanced?: boolean;
/**
* Set the min, max and step values if you want to restrict an int setting
* to a particular range.
*/
minimum?: number; minimum?: number;
maximum?: number; maximum?: number;
step?: number; step?: number;

View File

@@ -49,17 +49,4 @@ export default class Joplin {
get views(): JoplinViews; get views(): JoplinViews;
get interop(): JoplinInterop; get interop(): JoplinInterop;
get settings(): JoplinSettings; get settings(): JoplinSettings;
/**
* It is not possible to bundle native packages with a plugin, because they
* need to work cross-platforms. Instead access to certain useful native
* packages is provided using this function.
*
* Currently these packages are available:
*
* - [sqlite3](https://www.npmjs.com/package/sqlite3)
* - [fs-extra](https://www.npmjs.com/package/fs-extra)
*
* [View the demo plugin](https://github.com/laurent22/joplin/tree/dev/packages/app-cli/tests/support/plugins/nativeModule)
*/
require(_path: string): any;
} }

View File

@@ -23,21 +23,4 @@ export default class JoplinPlugins {
* @deprecated Use joplin.contentScripts.register() * @deprecated Use joplin.contentScripts.register()
*/ */
registerContentScript(type: ContentScriptType, id: string, scriptPath: string): Promise<void>; registerContentScript(type: ContentScriptType, id: string, scriptPath: string): Promise<void>;
/**
* Gets the plugin own data directory path. Use this to store any
* plugin-related data. Unlike [[installationDir]], any data stored here
* will be persisted.
*/
dataDir(): Promise<string>;
/**
* Gets the plugin installation directory. This can be used to access any
* asset that was packaged with the plugin. This directory should be
* considered read-only because any data you store here might be deleted or
* re-created at any time. To store new persistent data, use [[dataDir]].
*/
installationDir(): Promise<string>;
/**
* @deprecated Use joplin.require()
*/
require(_path: string): any;
} }

Some files were not shown because too many files have changed in this diff Show More