1
0
mirror of https://github.com/laurent22/joplin.git synced 2025-08-27 20:29:45 +02:00

Compare commits

..

145 Commits

Author SHA1 Message Date
yashpalgoyal1304
96475f82b2 Doc: Add Badge "Get it on F-Droid" ... (#6216) 2022-03-18 10:54:02 +00:00
Reinhart Previano K
e720c91f72 Mobile: Fixes #3533: Add marker to Geolocation URL (#3977)
* Update React Native build documentation

* Mobile: Fixes #3533: Add marker to Geolocation URL

* Try to remove BUILD.md from #3977
2020-10-29 11:15:26 +00:00
Arda Kılıçdağı
771acbe463 All: Translation: Update tr_TR.po (#3773) 2020-09-19 13:34:18 -04:00
Laurent Cozic
a5e4c13759 Merge branch 'dev' 2020-09-06 12:59:20 +01:00
Laurent Cozic
0998fc0ad7 Doc: Update dontate page 2020-09-05 22:49:40 +01:00
Laurent Cozic
d5f3e860b9 Merge branch 'dev' of github.com:laurent22/joplin into dev 2020-09-05 22:48:42 +01:00
Laurent Cozic
4e624f7db5 Doc: Added new sponsor 2020-09-05 22:28:28 +01:00
Anton Deriabin
5b697b7e16 Doc: Fixed wrong e2ee spec link (#3655) 2020-09-05 00:14:49 +01:00
Laurent Cozic
62c3945b8f Doc: Restored E2EE spec 2020-09-05 00:14:16 +01:00
Laurent Cozic
f8a3f509e7 Doc: Restored E2EE spec 2020-09-05 00:13:49 +01:00
Caleb John
30e0d69a74 Desktop: Load Codemirror css in index.html (#3673) 2020-09-05 00:02:20 +01:00
Caleb John
652816fd26 Desktop: Change codemirror default home and end to be visual line based (#3672) 2020-09-05 00:01:06 +01:00
Laurent Cozic
3a33e5f416 Electron release v1.0.242 2020-09-04 22:46:26 +01:00
Laurent Cozic
277dac5512 Desktop: Fixes sync target upgrade issue when custom TLS settings are used 2020-09-04 22:46:09 +01:00
Laurent Cozic
81d97d9f9d Update website 2020-09-04 19:34:43 +01:00
Laurent Cozic
a4873cd40d Android release v1.0.340 2020-09-04 19:22:28 +01:00
Laurent Cozic
20cb2daf43 Merge branch 'dev' of github.com:laurent22/joplin into dev 2020-09-04 19:15:04 +01:00
Laurent Cozic
e5b5250a91 Tools: Make it easier to create Android pre-releases 2020-09-04 19:11:46 +01:00
Laurent Cozic
db7d617e2b Update website 2020-09-04 19:06:36 +01:00
Laurent Cozic
a627884876 Merge branch 'dev' of github.com:laurent22/joplin into dev 2020-09-04 18:31:01 +01:00
Laurent Cozic
ed30d09e07 ios-v10.0.53 2020-09-04 18:30:43 +01:00
Laurent Cozic
179e3f9aee Electron release v1.0.241 2020-09-04 18:25:04 +01:00
Laurent Cozic
a67aedba35 Tools: Fixed changelog script 2020-09-04 18:24:53 +01:00
Laurent Cozic
199c411a7d CLI v1.0.167 2020-09-04 18:17:24 +01:00
Laurent Cozic
5cd7bb5bdb Electron release v1.0.240 2020-09-04 18:01:38 +01:00
Laurent Cozic
30b8f5e2aa Merge branch 'dev' of github.com:laurent22/joplin into dev 2020-09-04 18:01:05 +01:00
Laurent Cozic
44f2842820 Android release v1.0.339-3 2020-09-04 17:28:18 +01:00
Laurent Cozic
569355a318 Mobile: Add startup screen to show progress of db migration 2020-09-04 17:07:57 +01:00
Laurent Cozic
8464e16d5d Doc: Added note on how to update Katex or Mermaid package 2020-09-02 22:54:58 +01:00
Laurent Cozic
874c1e3e82 Fixing mermaid script 2020-09-02 22:51:16 +01:00
Laurent Cozic
2530ecfc86 All: Fixes #3664: Fixed Katex font rendering 2020-09-02 22:48:24 +01:00
Laurent Cozic
6b49f1dfcc Desktop: Fixes #3618: Fix links within Mermaid documents 2020-09-02 22:44:24 +01:00
Laurent Cozic
b1af25ea18 Electron release v1.0.239 2020-09-01 22:26:52 +01:00
Laurent Cozic
3086007a9c Electron release v1.0.238 2020-09-01 22:25:42 +01:00
Laurent Cozic
bdfb6b97f5 Desktop: Fixes #3645: Improved handling of startup errors, and prevent window from being invisible when upgrading sync target 2020-09-01 22:25:23 +01:00
Laurent Cozic
c01219e6be Merge branch 'dev' of github.com:laurent22/joplin into dev 2020-09-01 20:55:12 +01:00
Laurent Cozic
743c11c279 Android release v1.0.338 2020-08-30 20:42:09 +01:00
Laurent Cozic
11646d1c21 Desktop: Added more logging info to sync target upgrade process 2020-08-29 19:12:02 +01:00
Laurent Cozic
797f4a9669 Electron release v1.0.237 2020-08-29 11:28:12 +01:00
Laurent Cozic
815775ad8f Linux: Fixes #3645: Prevent lock when restarting app 2020-08-29 11:27:13 +01:00
Eduardo Kimmel
085109288f All: Translation: Update pt_BR.po (#3668)
Updated some pt_br translations.
2020-08-28 17:43:30 -04:00
Alexander Knyazev
c6cf0f3ba5 All: Translation: Update ru_RU.po (#3666)
Co-authored-by: Alexander Knyazev <a.knyazev@omprussia.ru>
2020-08-28 17:42:31 -04:00
rnbastos
f9bdce7e24 All: Translation: Update pt_BR.po (#3642)
Update pt_BR translation.
2020-08-28 17:41:29 -04:00
Kourosh
f8cf4db5db All: Translation: Update fa.po (#3637) 2020-08-28 17:40:33 -04:00
Laurent Cozic
14e6ae373f Electron release v1.0.236 2020-08-28 09:49:48 +01:00
jonath92
39bffd2790 Regression: Fixed OneDrive synchronisation (#3674) 2020-08-28 09:46:41 +01:00
Laurent
f3cb903901 Doc: Mentioned that we don't accept pull requests created using an automated tool 2020-08-20 11:55:13 +01:00
Laurent Cozic
abad1883bc Merge branch 'master' into dev 2020-08-19 14:30:36 +01:00
Laurent Cozic
bb8770a967 Update website 2020-08-19 14:29:49 +01:00
Laurent Cozic
c903947704 Merge branch 'dev' of github.com:laurent22/joplin into dev 2020-08-19 00:12:33 +01:00
Naveen M V
82e96840e9 All: When searching, weight notes using Okapi BM25 score (#3454) 2020-08-18 23:53:28 +01:00
Laurent Cozic
e190d90832 Desktop: Fixed restarting portable app 2020-08-18 23:51:23 +01:00
Caleb John
0ae8d454ad Focus the editor whenever the user toggles the visible panes (#3646) 2020-08-18 22:26:57 +01:00
Laurent Cozic
77c7f966cf Electron release v1.0.235 2020-08-18 21:56:50 +01:00
Laurent Cozic
619fa1d607 Revert "Desktop, Mobile: Add support for media player for video and audio files"
Reverted as it now attempts to render note links as images. See:

https://discourse.joplinapp.org/t/joplin-for-windows-1-0-234-bug/10558?u=laurent

This reverts commit 13280ce1b3.
2020-08-18 21:52:00 +01:00
Laurent Cozic
157736ff7e Desktop: Fixed regression: Several menu items did not work anymore 2020-08-18 21:45:22 +01:00
Naveen M V
0b57d906f8 Doc: Update search engine doc (#3614)
Add documentation for search filters
2020-08-18 00:15:00 +01:00
Laurent Cozic
86bfdb5c79 Android release v1.0.337 2020-08-17 21:48:37 +01:00
Laurent Cozic
fc7d34f79c Electron release v1.0.234 2020-08-17 21:44:40 +01:00
Matias Laporte
9d962f0328 All: Translation: Update es_ES.po (#3629) 2020-08-13 20:38:30 -04:00
Laurent Cozic
79e1a33b28 Fixed tabs 2020-08-08 10:21:25 +01:00
Caleb John
0eedae1f62 Desktop: Fixed vim mode issue where status bar was not visible (#3606) 2020-08-08 10:15:01 +01:00
Caleb John
e1144c098e Desktop: Fixed scrolling issue when editing while searching in CodeMirror (#3593)
Only scroll to search matchs when the user changes the search or
explicitly changes the search index
https://discourse.joplinapp.org/t/codemirror-feedback/10397
2020-08-08 10:11:55 +01:00
Caleb John
5c5cb0f781 Desktop: Implement scroll-past-end on CodeMirror editor (#3589) 2020-08-08 09:55:10 +01:00
Laurent Cozic
656615b571 Merge branch 'dev' of github.com:laurent22/joplin into dev 2020-08-08 00:35:55 +01:00
jonath92
799a9e810d All: Resolves #1266: Add support for OneDrive for Business (#3433) 2020-08-08 00:35:30 +01:00
R3dError
aa147bbcdc Desktop: Added attach file to menu bar (#3540) 2020-08-08 00:32:49 +01:00
alexchee
8c7a24282c All: Fixes #3591: Fixed sync fetching issue (#3599) 2020-08-08 00:30:11 +01:00
Naveen M V
f99f3f8a6d All: Resolves #1877: Add search filters (#3213) 2020-08-08 00:13:21 +01:00
Laurent Cozic
29fbafdfff Mobile: Fixed issue when creating new notebook and going back 2020-08-07 02:03:33 +00:00
Laurent Cozic
3253146dae Merge branch 'master' into dev 2020-08-06 15:30:00 +01:00
Laurent Cozic
7e4ac0fd73 Tools: Add complexity rule 2020-08-05 23:16:51 +00:00
Laurent Cozic
60d77cb5ea ios-v10.0.52 2020-08-05 15:57:21 +01:00
Laurent Cozic
8299164964 Android release v1.0.336 2020-08-05 00:18:42 +01:00
Laurent Cozic
488393e75d Mobile: Fixes #3597: Fixed regression when saving a new notebook 2020-08-05 00:08:11 +01:00
Laurent Cozic
c19f8c8035 Mobile: Fixes #3597: Fixed regression when saving a new notebook 2020-08-05 00:07:55 +01:00
Laurent Cozic
b0b55718cc Merge branch 'dev' of github.com:laurent22/joplin into dev 2020-08-04 23:00:38 +01:00
Laurent Cozic
5ade9ff2f6 Tools: Updated eslint and clarified comma-dangle rule 2020-08-04 23:00:11 +01:00
Allan Jacquet-Cretides
e4cfb518ba Desktop: Resolves #3569: Show full folder name in mouse-over pop-up text (#3590) 2020-08-04 22:45:32 +01:00
Laurent Cozic
89864de1ff Tools: Added eslint radix rule 2020-08-04 22:36:50 +01:00
Laurent
ee2a474611 Update .travis.yml 2020-08-04 22:31:59 +01:00
Caleb John
223caca0f5 Desktop: Enable CodeMirror keybindings (#3545) 2020-08-02 16:26:26 +01:00
Laurent Cozic
ee358f70dd Desktop: Add version info to error screen 2020-08-02 16:21:30 +01:00
Laurent Cozic
0718828d60 Merge branch 'master' into dev 2020-08-02 16:12:11 +01:00
Laurent Cozic
d13f54c2ce CLI v1.0.166 2020-08-02 15:03:57 +01:00
Laurent Cozic
90f7f99cd1 ios-v10.0.51 2020-08-02 15:01:39 +01:00
Laurent Cozic
a273bbaeee Fixed Android build 2020-08-02 13:37:32 +01:00
Laurent Cozic
619b426689 Android release v1.0.335 2020-08-02 13:34:09 +01:00
Laurent Cozic
97c752a39e Fixed config 2020-08-02 13:16:41 +01:00
Laurent Cozic
7565f1cada Fixed mobile version build 2020-08-02 12:38:36 +01:00
Laurent
0c147236a3 All: Add mechanism to lock and upgrade sync targets (#3524) 2020-08-02 12:28:50 +01:00
Anjula Karunarathne
88f22fabf7 Desktop: Added KeymapService to manage keyboard shortcuts (#3252) 2020-08-02 12:26:55 +01:00
Thatcher Chamberlin
5f46d60c5e Desktop, Cli, Update Katex to v0.12.0 (#3571) 2020-08-02 12:24:03 +01:00
Jess
cc8c200826 Desktop: Resolves #3529: Fix AppImage Icon (#3570) 2020-08-02 12:17:51 +01:00
Laurent
4485947b0f Desktop: Fixed copy, cut and paste in Rich Text editor (#3565) 2020-08-02 12:16:42 +01:00
Roman Musin
9f1a877f96 Android: remove hardcoded portrait screen orientation for share activity (#3418) 2020-08-02 12:14:56 +01:00
Laurent Cozic
13280ce1b3 Desktop, Mobile: Add support for media player for video and audio files
Co-authored-by: Bryan <bryan.r.gerlach@gmail.com>
2020-08-02 12:03:49 +01:00
Caleb John
7f73931530 Desktop: Fixes #3560: Modify the CodeMirror linter plugin to fix katex (#3582)
Rewrite the joplin mode to manually handle parsing.

This gives us more control over katex parsing and the ability to upgrade
in the future
2020-08-02 11:33:59 +01:00
Caleb John
bbfed9bca8 Desktop: Codemirror: clean up list indent code (#3581) 2020-08-01 19:09:52 +01:00
Caleb John
bab29cd582 Desktop: Toggle Editor rather than setting split mode on search (#3561) 2020-08-01 19:07:52 +01:00
Laurent Cozic
baea44cbd6 Fixed mobile version build 2020-08-01 18:56:56 +01:00
Laurent Cozic
ab0538df43 All: Security: Apply latest package security updates 2020-08-01 18:56:26 +01:00
Laurent Cozic
58d4a69053 Merge branch 'dev' of github.com:laurent22/joplin into dev 2020-08-01 18:21:42 +01:00
Laurent
9147b3061a Desktop: Hide completed to-dos in GotoAnything (#3580) 2020-08-01 18:17:40 +01:00
Laurent
1b0102f62c Update stale.yml 2020-08-01 18:15:17 +01:00
j-krl
471631933b CLI: Resolves #3217: Added link navigation shortcuts (#3275) 2020-08-01 17:57:45 +01:00
Laurent
cd761932c1 Merge branch 'dev' into cli-shortcuts-ts 2020-08-01 17:50:03 +01:00
Laurent Cozic
e63eee89ef Electron release v1.0.233 2020-08-01 15:27:30 +01:00
Laurent Cozic
4393ebbcc6 Desktop: Fixed potential crash when notebook does not have a title 2020-08-01 15:20:17 +01:00
Laurent Cozic
ed82390a8d Desktop: Fixed toolbar button state when going from setting screen to main screen 2020-08-01 15:11:14 +01:00
Laurent Cozic
79e708779f Merge branch 'master' of github.com:laurent22/joplin 2020-08-01 14:49:31 +01:00
Laurent Cozic
98905f6892 Tools: Cleaned up and improve build config, and fixed TypeScript Watch high CPU usage 2020-08-01 14:48:56 +01:00
Retew
44e57c3959 All: Translation: Update ru_RU.po (#3579) 2020-07-29 23:35:43 -04:00
voltinus
35d48394ce All: Translation: Update pl_PL.po (#3577) 2020-07-29 23:32:24 -04:00
Laurent Cozic
eb42a5f34b Mobile: Reduced auto-sync interval when opening app, and fixed Amazon S3 config 2020-07-28 22:47:24 +00:00
Laurent Cozic
729c8c6fac Electron release v1.0.232 2020-07-28 19:11:14 +01:00
Laurent Cozic
7a1707d864 Finished reverting hierarchical tag feature 2020-07-28 19:09:50 +01:00
Laurent Cozic
64d7603eed Revert "All: Added support for hierarchical/nested tags (#2572)"
This reverts commit e11e57f1d8.
2020-07-28 18:50:34 +01:00
Laurent Cozic
89e6b680a6 Revert "Desktop: Regression: Fix sort tags alphabetically in side-menu (#3489)"
This reverts commit 10ff43f4f0.
2020-07-28 18:49:34 +01:00
Helmut K. C. Tessarek
da071a804c Update website 2020-07-27 13:27:45 -04:00
Helmut K. C. Tessarek
7833ca5ae6 https://joplin.cozic.net -> https://joplinapp.org 2020-07-27 13:26:17 -04:00
Mehrad Mahmoudian
44d49b57b9 fixed a typo and added checked checkbox in Markdown Guide (#3556)
* Doc: Fixed a typo in a markdown syntax of a link

* Doc: added an example of a checked checkbox

and added how the checkboxes would get translated when turned to HTML

* Doc: added a picture of a rendered markdown checkbox in Joplin
2020-07-27 13:19:11 -04:00
Laurent
9db150f8ff Update stale.yml 2020-07-27 11:06:45 +01:00
Laurent Cozic
e2d3630783 Tools: Added sync target snapshots 2020-07-25 11:38:43 +01:00
Laurent Cozic
cb1b5cae9f Update website 2020-07-24 19:46:27 +01:00
Laurent Cozic
3af5b31c1c Merge branch 'master' of github.com:laurent22/joplin 2020-07-24 19:44:33 +01:00
Laurent Cozic
b6dafd6da6 Doc: Showcasing plugins as screenshots (#3549)
Co-authored-by: Mehrad Mahmoudian <m.mahmoudian@gmail.com>
2020-07-24 19:42:44 +01:00
j-krl
fd568b5300 interop unnecessary 2020-06-18 15:50:19 -06:00
j-krl
f19f148297 word choice 2020-05-25 20:18:13 -06:00
j-krl
79c6eb5503 Added to docs and rewrote LinkSelector as ts file 2020-05-25 20:14:38 -06:00
j-krl
1204bed80a Merge branch 'cli-shortcuts-ts' of https://github.com/j-krl/joplin into cli-shortcuts-ts 2020-05-25 20:10:04 -06:00
j-krl
dc91b1f7d6 Added to docs and rewrote LinkSelector as ts file 2020-05-25 20:09:53 -06:00
j-krl
66dc2b33de Added to docs and rewrote LinkSelector as ts file 2020-05-25 20:00:16 -06:00
j-krl
811942d45e Merge branch 'cli-shortcuts' of https://github.com/j-krl/joplin into cli-shortcuts 2020-05-24 03:20:44 -06:00
j-krl
dbde239a25 formatting 2020-05-24 03:20:05 -06:00
j-krl
ab3ba3e2ca formatting 2020-05-24 03:11:45 -06:00
j-krl
79e77b5a10 removed personal comments 2020-05-24 02:44:24 -06:00
j-krl
c3395133c9 automatic page scrolling, docs updated 2020-05-24 02:38:14 -06:00
j-krl
b1d073cdeb next/prev link index is buggy on page change 2020-05-23 21:09:22 -06:00
j-krl
25d723b373 switched to class based implementation 2020-05-23 07:23:55 -06:00
j-krl
e9783d050b I'm going to have to rewrite this entire thing... 2020-05-22 15:26:42 -06:00
j-krl
e1be1ead86 big link doesn't work but regular link does 2020-05-22 06:39:08 -06:00
j-krl
b129bed69f installed open package 2020-05-22 06:06:28 -06:00
j-krl
265ad50ce4 app 2020-05-22 05:50:56 -06:00
j-krl
3e2570601f app-gui 2020-05-22 05:48:27 -06:00
355 changed files with 12157 additions and 5265 deletions

View File

@@ -61,6 +61,9 @@ Modules/TinyMCE/IconPack/postinstall.js
Modules/TinyMCE/langs/
# AUTO-GENERATED - EXCLUDED TYPESCRIPT BUILD
CliClient/app/LinkSelector.js
CliClient/tests/synchronizer_LockHandler.js
CliClient/tests/synchronizer_MigrationHandler.js
ElectronClient/commands/focusElement.js
ElectronClient/commands/startExternalEditing.js
ElectronClient/commands/stopExternalEditing.js
@@ -131,6 +134,7 @@ ElectronClient/gui/NoteList/commands/focusElementNoteList.js
ElectronClient/gui/NoteListItem.js
ElectronClient/gui/NoteToolbar/NoteToolbar.js
ElectronClient/gui/ResourceScreen.js
ElectronClient/gui/Root_UpgradeSyncTarget.js
ElectronClient/gui/ShareNoteDialog.js
ElectronClient/gui/SideBar/commands/focusElementSideBar.js
ReactNativeClient/lib/AsyncActionQueue.js
@@ -138,6 +142,7 @@ ReactNativeClient/lib/checkPermissions.js
ReactNativeClient/lib/commands/historyBackward.js
ReactNativeClient/lib/commands/historyForward.js
ReactNativeClient/lib/commands/synchronize.js
ReactNativeClient/lib/components/screens/UpgradeSyncTargetScreen.js
ReactNativeClient/lib/hooks/useEffectDebugger.js
ReactNativeClient/lib/hooks/useImperativeHandlerDebugger.js
ReactNativeClient/lib/hooks/usePrevious.js
@@ -152,14 +157,24 @@ ReactNativeClient/lib/services/keychain/KeychainServiceDriver.dummy.js
ReactNativeClient/lib/services/keychain/KeychainServiceDriver.mobile.js
ReactNativeClient/lib/services/keychain/KeychainServiceDriver.node.js
ReactNativeClient/lib/services/keychain/KeychainServiceDriverBase.js
ReactNativeClient/lib/services/KeymapService.js
ReactNativeClient/lib/services/ResourceEditWatcher/index.js
ReactNativeClient/lib/services/ResourceEditWatcher/reducer.js
ReactNativeClient/lib/services/rest/actionApi.desktop.js
ReactNativeClient/lib/services/rest/errors.js
ReactNativeClient/lib/services/searchengine/filterParser.js
ReactNativeClient/lib/services/searchengine/queryBuilder.js
ReactNativeClient/lib/services/SettingUtils.js
ReactNativeClient/lib/services/synchronizer/gui/useSyncTargetUpgrade.js
ReactNativeClient/lib/services/synchronizer/LockHandler.js
ReactNativeClient/lib/services/synchronizer/MigrationHandler.js
ReactNativeClient/lib/services/synchronizer/migrations/1.js
ReactNativeClient/lib/services/synchronizer/migrations/2.js
ReactNativeClient/lib/services/synchronizer/utils/types.js
ReactNativeClient/lib/services/UndoRedoService.js
ReactNativeClient/lib/ShareExtension.js
ReactNativeClient/lib/shareHandler.js
ReactNativeClient/lib/versionInfo.js
ReactNativeClient/PluginAssetsLoader.js
ReactNativeClient/setUpQuickActions.js
# AUTO-GENERATED - EXCLUDED TYPESCRIPT BUILD

View File

@@ -4,9 +4,9 @@ module.exports = {
'es6': true,
'node': true,
},
"parser": "@typescript-eslint/parser",
'parser': '@typescript-eslint/parser',
'extends': ['eslint:recommended'],
"settings": {
'settings': {
'react': {
'version': '16.12',
},
@@ -37,33 +37,38 @@ module.exports = {
},
'parserOptions': {
'ecmaVersion': 2018,
"ecmaFeatures": {
"jsx": true,
},
"sourceType": "module",
'ecmaFeatures': {
'jsx': true,
},
'sourceType': 'module',
},
'rules': {
// -------------------------------
// Code correctness
// -------------------------------
"react/jsx-uses-react": "error",
"react/jsx-uses-vars": "error",
"no-unused-vars": "error",
"@typescript-eslint/no-unused-vars": "error",
"no-constant-condition": 0,
"no-prototype-builtins": 0,
'react/jsx-uses-react': 'error',
'react/jsx-uses-vars': 'error',
'no-unused-vars': 'error',
'@typescript-eslint/no-unused-vars': 'error',
'no-constant-condition': 0,
'no-prototype-builtins': 0,
// This error is always a false positive so far since it detects
// possible race conditions in contexts where we know it cannot happen.
"require-atomic-updates": 0,
"prefer-const": ["error"],
"no-var": ["error"],
"no-new-func": ["error"],
"import/prefer-default-export": ["error"],
"import/first": ["error"],
"no-array-constructor": ["error"],
'require-atomic-updates': 0,
'prefer-const': ['error'],
'no-var': ['error'],
'no-new-func': ['error'],
'import/prefer-default-export': ['error'],
'import/first': ['error'],
'no-array-constructor': ['error'],
'radix': ['error'],
// Warn only for now because fixing everything would take too much
// refactoring, but new code should try to stick to it.
'complexity': ['warn', { max: 10 }],
// Checks rules of Hooks
"react-hooks/rules-of-hooks": "error",
'react-hooks/rules-of-hooks': 'error',
// Checks effect dependencies
// Disable because of this: https://github.com/facebook/react/issues/16265
// "react-hooks/exhaustive-deps": "warn",
@@ -71,43 +76,49 @@ module.exports = {
// -------------------------------
// Formatting
// -------------------------------
"space-in-parens": ["error", "never"],
"space-infix-ops": ["error"],
"curly": ["error", "multi-line", "consistent"],
"semi": ["error", "always"],
"eol-last": ["error", "always"],
"quotes": ["error", "single"],
"indent": ["error", "tab"],
"comma-dangle": ["error", "always-multiline"],
"no-trailing-spaces": "error",
"linebreak-style": ["error", "unix"],
"prefer-template": ["error"],
"template-curly-spacing": ["error", "never"],
"object-curly-spacing": ["error", "always"],
"array-bracket-spacing": ["error", "never"],
"key-spacing": ["error", {
"beforeColon": false,
"afterColon": true,
"mode": "strict"
'space-in-parens': ['error', 'never'],
'space-infix-ops': ['error'],
'curly': ['error', 'multi-line', 'consistent'],
'semi': ['error', 'always'],
'eol-last': ['error', 'always'],
'quotes': ['error', 'single'],
'indent': ['error', 'tab'],
'comma-dangle': ['error', {
'arrays': 'always-multiline',
'objects': 'always-multiline',
'imports': 'always-multiline',
'exports': 'always-multiline',
'functions': 'never',
}],
"block-spacing": ["error"],
"brace-style": ["error", "1tbs", { "allowSingleLine": true }],
"no-spaced-func": ["error"],
"func-call-spacing": ["error"],
"space-before-function-paren": ["error", {
"anonymous": "never",
"named": "never",
"asyncArrow": "always"
'no-trailing-spaces': 'error',
'linebreak-style': ['error', 'unix'],
'prefer-template': ['error'],
'template-curly-spacing': ['error', 'never'],
'object-curly-spacing': ['error', 'always'],
'array-bracket-spacing': ['error', 'never'],
'key-spacing': ['error', {
'beforeColon': false,
'afterColon': true,
'mode': 'strict',
}],
"multiline-comment-style": ["error", "separate-lines"],
"space-before-blocks": "error",
"spaced-comment": ["error", "always"],
"keyword-spacing": ["error", { "before": true, "after": true }],
'block-spacing': ['error'],
'brace-style': ['error', '1tbs', { 'allowSingleLine': true }],
'no-spaced-func': ['error'],
'func-call-spacing': ['error'],
'space-before-function-paren': ['error', {
'anonymous': 'never',
'named': 'never',
'asyncArrow': 'always',
}],
'multiline-comment-style': ['error', 'separate-lines'],
'space-before-blocks': 'error',
'spaced-comment': ['error', 'always'],
'keyword-spacing': ['error', { 'before': true, 'after': true }],
},
"plugins": [
"react",
"@typescript-eslint",
"react-hooks",
"import",
'plugins': [
'react',
'@typescript-eslint',
'react-hooks',
'import',
],
};

1
.github/stale.yml vendored
View File

@@ -9,6 +9,7 @@ exemptLabels:
- "upstream"
- "backlog"
- "high"
- "spec"
# Label to use when marking an issue as stale
staleLabel: stale
# Comment to post when marking an issue as stale. Set to `false` to disable

15
.gitignore vendored
View File

@@ -52,6 +52,9 @@ Tools/commit_hook.txt
*.map
# AUTO-GENERATED - EXCLUDED TYPESCRIPT BUILD
CliClient/app/LinkSelector.js
CliClient/tests/synchronizer_LockHandler.js
CliClient/tests/synchronizer_MigrationHandler.js
ElectronClient/commands/focusElement.js
ElectronClient/commands/startExternalEditing.js
ElectronClient/commands/stopExternalEditing.js
@@ -122,6 +125,7 @@ ElectronClient/gui/NoteList/commands/focusElementNoteList.js
ElectronClient/gui/NoteListItem.js
ElectronClient/gui/NoteToolbar/NoteToolbar.js
ElectronClient/gui/ResourceScreen.js
ElectronClient/gui/Root_UpgradeSyncTarget.js
ElectronClient/gui/ShareNoteDialog.js
ElectronClient/gui/SideBar/commands/focusElementSideBar.js
ReactNativeClient/lib/AsyncActionQueue.js
@@ -129,6 +133,7 @@ ReactNativeClient/lib/checkPermissions.js
ReactNativeClient/lib/commands/historyBackward.js
ReactNativeClient/lib/commands/historyForward.js
ReactNativeClient/lib/commands/synchronize.js
ReactNativeClient/lib/components/screens/UpgradeSyncTargetScreen.js
ReactNativeClient/lib/hooks/useEffectDebugger.js
ReactNativeClient/lib/hooks/useImperativeHandlerDebugger.js
ReactNativeClient/lib/hooks/usePrevious.js
@@ -143,14 +148,24 @@ ReactNativeClient/lib/services/keychain/KeychainServiceDriver.dummy.js
ReactNativeClient/lib/services/keychain/KeychainServiceDriver.mobile.js
ReactNativeClient/lib/services/keychain/KeychainServiceDriver.node.js
ReactNativeClient/lib/services/keychain/KeychainServiceDriverBase.js
ReactNativeClient/lib/services/KeymapService.js
ReactNativeClient/lib/services/ResourceEditWatcher/index.js
ReactNativeClient/lib/services/ResourceEditWatcher/reducer.js
ReactNativeClient/lib/services/rest/actionApi.desktop.js
ReactNativeClient/lib/services/rest/errors.js
ReactNativeClient/lib/services/searchengine/filterParser.js
ReactNativeClient/lib/services/searchengine/queryBuilder.js
ReactNativeClient/lib/services/SettingUtils.js
ReactNativeClient/lib/services/synchronizer/gui/useSyncTargetUpgrade.js
ReactNativeClient/lib/services/synchronizer/LockHandler.js
ReactNativeClient/lib/services/synchronizer/MigrationHandler.js
ReactNativeClient/lib/services/synchronizer/migrations/1.js
ReactNativeClient/lib/services/synchronizer/migrations/2.js
ReactNativeClient/lib/services/synchronizer/utils/types.js
ReactNativeClient/lib/services/UndoRedoService.js
ReactNativeClient/lib/ShareExtension.js
ReactNativeClient/lib/shareHandler.js
ReactNativeClient/lib/versionInfo.js
ReactNativeClient/PluginAssetsLoader.js
ReactNativeClient/setUpQuickActions.js
# AUTO-GENERATED - EXCLUDED TYPESCRIPT BUILD

View File

@@ -9,6 +9,7 @@ rvm: 2.3.3
branches:
only:
- master
- dev
- /^v\d+\.\d+(\.\d+)?(-\S*)?$/
matrix:
@@ -69,7 +70,7 @@ script:
# and that would break the desktop release.
if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then
cd CliClient
npm run test
npm run test-ci
testResult=$?
if [ $testResult -ne 0 ]; then
exit $testResult

Binary file not shown.

Before

Width:  |  Height:  |  Size: 71 KiB

After

Width:  |  Height:  |  Size: 71 KiB

View File

@@ -87,6 +87,10 @@ It still requires you to quit the application each time you want it to rebuild,
2. Switch to the Electron app and <kbd>cmd</kbd>+<kbd>Q</kbd> to quit it.
3. `watchman` immediately restarts the app for you (whereas usually you'd have to switch back to the terminal, type `"npm start"`, and hit enter).
# Updating Markdown renderer packages
The Markdown renderer is located under ReactNativeClient/lib/joplin-renderer. Whenever updating one of its dependencies, such as Mermaid or Katex, please run `npm run buildAssets` to make sure all assets such as fonts or CSS files are deployed correctly.
# Troubleshooting
Please read for the [Build Troubleshooting Document](https://github.com/laurent22/joplin/blob/master/readme/build_troubleshooting.md) for various tips on how to get the build working.

View File

@@ -36,6 +36,7 @@ If you want to start contributing to the project's code, please follow these gui
- Before adding a new feature, ask about it in the [Github Issue Tracker](https://github.com/laurent22/joplin/issues?utf8=%E2%9C%93&q=is%3Aissue) or the [Joplin Forum](https://discourse.joplinapp.org/), or check if existing discussions exist to make sure the new functionality is desired.
- **Changes that will consist in more than 50 lines of code should be discussed the [Joplin Forum](https://discourse.joplinapp.org/)**, so that you don't spend too much time implementing something that might not be accepted.
- All the applications share the same backend (database, synchronisation, settings, models, business logic, etc.) so if you change something in the backend in one app, makes sure it still work in the other apps. Usually it does, but keep this in mind.
- Pull requests that make many changes using an automated tool, like for spell fixing, styling, etc. will not be accepted. An exception would be if the changes have been discussed in the forum and someone has agreed to review **and test** the pull request.
Building the apps is relatively easy - please [see the build instructions](https://github.com/laurent22/joplin/blob/master/BUILD.md) for more details.

View File

@@ -1,13 +1,13 @@
module.exports = {
"overrides": [
'overrides': [
{
"files": ["tests/**/*.js"],
'files': ['tests/**/*.js'],
'rules': {
// Ignore all unused function arguments, because in some
// case they are kept to indicate the function signature.
"no-unused-vars": ["error", { "argsIgnorePattern": ".*" }],
"@typescript-eslint/no-unused-vars": 0,
}
'no-unused-vars': ['error', { 'argsIgnorePattern': '.*' }],
'@typescript-eslint/no-unused-vars': 0,
},
},
],
};
};

View File

@@ -20,4 +20,6 @@ out.txt
linkToLocal.sh
yarn-error.log
tests/support/dropbox-auth.txt
tests/support/nextcloud-auth.json
tests/support/onedrive-auth.txt
build/

View File

@@ -0,0 +1,134 @@
const open = require('open');
interface LinkStoreEntry {
link: string;
noteX: number;
noteY: number;
}
class LinkSelector {
noteId_: string;
scrollTop_: number;
renderedText_: string;
currentLinkIndex_: number;
linkStore_: LinkStoreEntry[];
linkRegex_: RegExp;
constructor() {
this.noteId_ = null;
this.scrollTop_ = null; // used so 'o' won't open unhighlighted link after scrolling
this.renderedText_ = null;
this.currentLinkIndex_ = null;
this.linkStore_ = null;
this.linkRegex_ = /http:\/\/[0-9.]+:[0-9]+\/[0-9]+/g;
}
get link(): string | null {
if (this.currentLinkIndex_ === null) return null;
return this.linkStore_[this.currentLinkIndex_].link;
}
get noteX(): number | null {
if (this.currentLinkIndex_ === null) return null;
return this.linkStore_[this.currentLinkIndex_].noteX;
}
get noteY(): number | null {
if (this.currentLinkIndex_ === null) return null;
return this.linkStore_[this.currentLinkIndex_].noteY;
}
findLinks(renderedText: string): LinkStoreEntry[] {
const newLinkStore: LinkStoreEntry[] = [];
const lines: string[] = renderedText.split('\n');
for (let i = 0; i < lines.length; i++) {
const matches = [...lines[i].matchAll(this.linkRegex_)];
matches.forEach((_e, n) => {
newLinkStore.push(
{
link: matches[n][0],
noteX: matches[n].index,
noteY: i,
}
);
});
}
return newLinkStore;
}
updateText(renderedText: string): void {
this.currentLinkIndex_ = null;
this.renderedText_ = renderedText;
this.linkStore_ = this.findLinks(this.renderedText_);
}
updateNote(textWidget: any): void {
this.noteId_ = textWidget.noteId;
this.scrollTop_ = textWidget.scrollTop_;
this.updateText(textWidget.renderedText_);
}
scrollWidget(textWidget: any): void {
if (this.currentLinkIndex_ === null) return;
const noteY = this.linkStore_[this.currentLinkIndex_].noteY;
let viewBoxMin = textWidget.scrollTop_ + 1;
let viewBoxMax = viewBoxMin + textWidget.innerHeight - 2;
if (noteY < viewBoxMin) {
for (; noteY < viewBoxMin; textWidget.pageUp()) {
viewBoxMin = textWidget.scrollTop_;
viewBoxMax = viewBoxMin + textWidget.innerHeight;
}
return;
} else if (noteY > viewBoxMax) {
for (; noteY > viewBoxMax; textWidget.pageDown()) {
viewBoxMin = textWidget.scrollTop_;
viewBoxMax = viewBoxMin + textWidget.innerHeight;
}
return;
}
return;
}
changeLink(textWidget: any, offset: number): void | null {
if (textWidget.noteId !== this.noteId_) {
this.updateNote(textWidget);
this.changeLink(textWidget, offset);
return;
}
if (textWidget.renderedText_ !== this.renderedText_) {
this.updateText(textWidget.renderedText_);
this.changeLink(textWidget, offset);
return;
}
if (textWidget.scrollTop_ !== this.scrollTop_) this.scrollTop_ = textWidget.scrollTop_;
if (!this.linkStore_.length) return null;
let offsetMod = (offset + this.currentLinkIndex_) % this.linkStore_.length;
if (this.currentLinkIndex_ === null) {
if (offsetMod < 0) this.currentLinkIndex_ = this.linkStore_.length + offsetMod;
else if (!offsetMod) this.currentLinkIndex_ = 0;
else this.currentLinkIndex_ = offsetMod - 1;
return;
}
if (offsetMod < 0) offsetMod = this.linkStore_.length + offsetMod;
this.currentLinkIndex_ = offsetMod;
return;
}
openLink(textWidget: any): void {
if (textWidget.noteId !== this.noteId_) return;
if (textWidget.renderedText_ !== this.renderedText_) return;
if (textWidget.scrollTop_ !== this.scrollTop_) return;
open(this.linkStore_[this.currentLinkIndex_].link);
}
}
export default LinkSelector;

View File

@@ -33,6 +33,8 @@ const FolderListWidget = require('./gui/FolderListWidget.js');
const NoteListWidget = require('./gui/NoteListWidget.js');
const StatusBarWidget = require('./gui/StatusBarWidget.js');
const ConsoleWidget = require('./gui/ConsoleWidget.js');
const LinkSelector = require('./LinkSelector.js').default;
class AppGui {
constructor(app, store, keymap) {
@@ -74,6 +76,8 @@ class AppGui {
this.currentShortcutKeys_ = [];
this.lastShortcutKeyTime_ = 0;
this.linkSelector_ = new LinkSelector();
// Recurrent sync is setup only when the GUI is started. In
// a regular command it's not necessary since the process
// exits right away.
@@ -455,6 +459,30 @@ class AppGui {
} else {
this.stdout(_('Please select the note or notebook to be deleted first.'));
}
} else if (cmd === 'next_link' || cmd === 'previous_link') {
const noteText = this.widget('noteText');
noteText.render();
if (cmd === 'next_link') this.linkSelector_.changeLink(noteText, 1);
else this.linkSelector_.changeLink(noteText, -1);
this.linkSelector_.scrollWidget(noteText);
const cursorOffsetX = this.widget('mainWindow').width - noteText.innerWidth - 8;
const cursorOffsetY = 1 - noteText.scrollTop_;
if (this.linkSelector_.link) {
this.term_.moveTo(
this.linkSelector_.noteX + cursorOffsetX,
this.linkSelector_.noteY + cursorOffsetY
);
setTimeout(() => this.term_.term().inverse(this.linkSelector_.link), 50);
}
} else if (cmd === 'open_link') {
if (this.widget('noteText').hasFocus) {
this.linkSelector_.openLink(this.widget('noteText'));
}
} else if (cmd === 'toggle_console') {
if (!this.consoleIsShown()) {
this.showConsole();

View File

@@ -324,6 +324,9 @@ class Application extends BaseApplication {
{ keys: ['PAGE_DOWN'], type: 'function', command: 'page_down' },
{ keys: ['ENTER'], type: 'function', command: 'activate' },
{ keys: ['DELETE', 'BACKSPACE'], type: 'function', command: 'delete' },
{ keys: ['n'], type: 'function', command: 'next_link' },
{ keys: ['b'], type: 'function', command: 'previous_link' },
{ keys: ['o'], type: 'function', command: 'open_link' },
{ keys: [' '], command: 'todo toggle $n' },
{ keys: ['tc'], type: 'function', command: 'toggle_console' },
{ keys: ['tm'], type: 'function', command: 'toggle_metadata' },

View File

@@ -95,8 +95,8 @@ async function handleAutocompletionPromise(line) {
}
if (argName == 'tag') {
const tags = await Tag.search({ fullTitleRegex: `${next}.*` });
l.push(...tags.map(tag => Tag.getCachedFullTitle(tag.id)));
const tags = await Tag.search({ titlePattern: `${next}*` });
l.push(...tags.map(n => n.title));
}
if (argName == 'file') {

View File

@@ -2,6 +2,7 @@ const yargParser = require('yargs-parser');
const { _ } = require('lib/locale.js');
const { time } = require('lib/time-utils.js');
const stringPadding = require('string-padding');
const { Logger } = require('lib/logger.js');
const cliUtils = {};
@@ -245,4 +246,17 @@ cliUtils.redrawDone = function() {
redrawStarted_ = false;
};
cliUtils.stdoutLogger = function(stdout) {
const stdoutFn = (...s) => stdout(s.join(' '));
const logger = new Logger();
logger.addTarget('console', { console: {
info: stdoutFn,
warn: stdoutFn,
error: stdoutFn,
} });
return logger;
};
module.exports = { cliUtils };

View File

@@ -11,6 +11,7 @@ const md5 = require('md5');
const locker = require('proper-lockfile');
const fs = require('fs-extra');
const SyncTargetRegistry = require('lib/SyncTargetRegistry');
const MigrationHandler = require('lib/services/synchronizer/MigrationHandler').default;
class Command extends BaseCommand {
constructor() {
@@ -29,7 +30,10 @@ class Command extends BaseCommand {
}
options() {
return [['--target <target>', _('Sync to provided target (defaults to sync.target config value)')]];
return [
['--target <target>', _('Sync to provided target (defaults to sync.target config value)')],
['--upgrade', _('Upgrade the sync target to the latest version.')],
];
}
static lockFile(filePath) {
@@ -148,12 +152,8 @@ class Command extends BaseCommand {
const syncTarget = reg.syncTarget(this.syncTargetId_);
if (!(await syncTarget.isAuthenticated())) {
app()
.gui()
.showConsole();
app()
.gui()
.maximizeConsole();
app().gui().showConsole();
app().gui().maximizeConsole();
const authDone = await this.doAuth();
if (!authDone) return cleanUp();
@@ -176,6 +176,34 @@ class Command extends BaseCommand {
if (!sync) throw new Error(_('Cannot initialise synchroniser.'));
if (args.options.upgrade) {
let migrationError = null;
try {
const migrationHandler = new MigrationHandler(
sync.api(),
sync.lockHandler(),
Setting.value('appType'),
Setting.value('clientId')
);
migrationHandler.setLogger(cliUtils.stdoutLogger(this.stdout.bind(this)));
await migrationHandler.upgrade();
} catch (error) {
migrationError = error;
}
if (!migrationError) {
Setting.setValue('sync.upgradeState', Setting.SYNC_UPGRADE_STATE_IDLE);
await Setting.saveAll();
}
if (migrationError) throw migrationError;
return cleanUp();
}
this.stdout(_('Starting synchronisation...'));
const contextKey = `sync.${this.syncTargetId_}.context`;
@@ -210,6 +238,12 @@ class Command extends BaseCommand {
throw error;
}
if (Setting.value('sync.upgradeState') > Setting.SYNC_UPGRADE_STATE_IDLE) {
this.stdout(`/!\\ ${_('Sync target must be upgraded! Run `%s` to proceed.', 'sync --upgrade')}`);
app().gui().showConsole();
app().gui().maximizeConsole();
}
cleanUp();
}

View File

@@ -34,7 +34,7 @@ class Command extends BaseCommand {
if (command == 'add') {
if (!notes.length) throw new Error(_('Cannot find "%s".', args.note));
if (!tag) tag = await Tag.saveNested({}, args.tag, { userSideValidation: true });
if (!tag) tag = await Tag.save({ title: args.tag }, { userSideValidation: true });
for (let i = 0; i < notes.length; i++) {
await Tag.addNote(tag.id, notes[i].id);
}
@@ -72,7 +72,7 @@ class Command extends BaseCommand {
} else {
const tags = await Tag.all();
tags.map(tag => {
this.stdout(Tag.getCachedFullTitle(tag.id));
this.stdout(tag.title);
});
}
} else if (command == 'notetags') {

View File

@@ -4,9 +4,10 @@ const utils = require('../Tools/gulp/utils');
const tasks = {
copyLib: require('../Tools/gulp/tasks/copyLib'),
tsc: require('../Tools/gulp/tasks/tsc'),
updateIgnoredTypeScriptBuild: require('../Tools/gulp/tasks/updateIgnoredTypeScriptBuild'),
};
tasks.build = {
tasks.prepareBuild = {
fn: async () => {
const buildDir = `${__dirname}/build`;
await utils.copyDir(`${__dirname}/app`, buildDir, {
@@ -28,7 +29,7 @@ tasks.build = {
},
};
tasks.buildTests = {
tasks.prepareTestBuild = {
fn: async () => {
const testBuildDir = `${__dirname}/tests-build`;
@@ -37,6 +38,8 @@ tasks.buildTests = {
'lib/',
'locales/',
'node_modules/',
'*.ts',
'*.tsx',
],
});
@@ -46,16 +49,14 @@ tasks.buildTests = {
},
};
const buildTestSeries = [
tasks.buildTests.fn,
];
utils.registerGulpTasks(gulp, tasks);
if (require('os').platform() === 'win32') {
gulp.task('copyLib', tasks.copyLib.fn);
gulp.task('tsc', tasks.tsc.fn);
buildTestSeries.push('copyLib');
buildTestSeries.push('tsc');
}
gulp.task('build', gulp.series([
'prepareBuild',
'copyLib',
]));
gulp.task('build', tasks.build.fn);
gulp.task('buildTests', gulp.series(...buildTestSeries));
gulp.task('buildTests', gulp.series([
'prepareTestBuild',
'copyLib',
]));

View File

@@ -18,9 +18,11 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 2.3.1\n"
"X-Generator: Poedit 2.3\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Poedit-SourceCharset: UTF-8\n"
"POT-Creation-Date: \n"
"PO-Revision-Date: \n"
#: CliClient/app/command-cp.js:13
msgid ""
@@ -110,9 +112,9 @@ msgid "Do not ask for confirmation."
msgstr "No requiere confirmación."
#: CliClient/app/command-import.js:27
#, fuzzy, javascript-format
#, javascript-format
msgid "Output format: %s"
msgstr "Formato de origen: %s"
msgstr "Formato de destino: %s"
#: CliClient/app/command-import.js:47 ElectronClient/gui/ImportScreen.min.js:69
#, javascript-format
@@ -373,7 +375,6 @@ msgid "Synchronisation target: %s (%s)"
msgstr "Destino de la sincronización: %s (%s)"
#: CliClient/app/command-sync.js:177
#, fuzzy
msgid "Cannot initialise synchroniser."
msgstr "No se puede inicializar sincronizador."
@@ -560,7 +561,6 @@ msgstr ""
"segundo plano y estarán disponibles en breve."
#: CliClient/app/gui/NoteWidget.js:50
#, fuzzy
msgid "You may also type `status` for more information."
msgstr "También puede escribir `status` para obtener más información."
@@ -813,7 +813,6 @@ msgid "Cancel"
msgstr "Cancelar"
#: ElectronClient/plugins/GotoAnything.min.js:454
#, fuzzy
msgid ""
"Type a note title or part of its content to jump to it. Or type # followed "
"by a tag name, or @ followed by a notebook name."
@@ -832,7 +831,7 @@ msgid "Exporting to \"%s\" as \"%s\" format. Please wait..."
msgstr "Exportando el formato de «%s» a «%s». Por favor espere..."
#: ElectronClient/InteropServiceHelper.js:164
#, fuzzy, javascript-format
#, javascript-format
msgid "Could not export notes: %s"
msgstr "No se pudo exportar las notas: %s"
@@ -944,7 +943,7 @@ msgid "Delete"
msgstr "Eliminar"
#: ElectronClient/gui/SideBar/SideBar.min.js:276
#, fuzzy, javascript-format
#, javascript-format
msgid "Remove tag \"%s\" and its descendant tags from all notes?"
msgstr "Desea borrar las etiquetas pertenecientes a «%s» de todas las notas?"
@@ -1016,7 +1015,6 @@ msgstr "texto destacado"
#: ElectronClient/gui/NoteEditor/NoteBody/CodeMirror/CodeMirror.js:145
#: ElectronClient/gui/NoteEditor/NoteBody/AceEditor/AceEditor.js:261
#, fuzzy
msgid "emphasised text"
msgstr "texto resaltado"
@@ -1076,7 +1074,6 @@ msgstr ""
"la nota."
#: ElectronClient/gui/NoteEditor/NoteBody/TinyMCE/plugins/lists.js:2151
#, fuzzy
msgid "Checkbox list"
msgstr "Casilla"
@@ -1095,11 +1092,11 @@ msgstr "Adjuntar archivo"
#: ElectronClient/gui/NoteEditor/NoteBody/TinyMCE/TinyMCE.js:535
msgid "Code Block"
msgstr ""
msgstr "Bloque de Código"
#: ElectronClient/gui/NoteEditor/NoteBody/TinyMCE/TinyMCE.js:544
msgid "Inline Code"
msgstr ""
msgstr "Código Integrado"
#: ElectronClient/gui/NoteEditor/NoteBody/TinyMCE/TinyMCE.js:559
#: ElectronClient/gui/NoteEditor/commands/editorCommandDeclarations.js:80
@@ -1109,11 +1106,10 @@ msgstr "Introduce fecha"
#: ElectronClient/gui/NoteEditor/NoteBody/TinyMCE/TinyMCE.js:903
msgid "Drop notes or files here"
msgstr ""
msgstr "Suelta notas o archivos aquí"
#: ElectronClient/gui/NoteEditor/NoteBody/TinyMCE/TinyMCE.js:903
#: ElectronClient/gui/MainScreen/MainScreen.min.js:401
#, fuzzy
msgid "Code View"
msgstr "Código"
@@ -1123,6 +1119,8 @@ msgid ""
"Please wait for all attachments to be downloaded and decrypted. You may also "
"switch to %s to edit the note."
msgstr ""
"Por favor espere a que todos los adjuntos hayan sido descargados y "
"descifrados. Puede también cambiar a %s para editar la nota."
#: ElectronClient/gui/NoteEditor/utils/useMessageHandler.js:70
#: ElectronClient/gui/NoteText.min.js:833
@@ -1133,7 +1131,7 @@ msgstr "Ha habido un error descargando este adjunto:"
#: ElectronClient/gui/NoteText.min.js:835
#: ReactNativeClient/lib/services/ResourceEditWatcher.js:146
msgid "This attachment is not downloaded or not decrypted yet"
msgstr "Este adjunto no ha sido descargado o desencriptado todavía"
msgstr "Este adjunto no ha sido descargado o descifrado todavía"
#: ElectronClient/gui/NoteEditor/utils/contextMenu.js:39
#: ElectronClient/gui/NoteText.min.js:778
@@ -1147,7 +1145,7 @@ msgstr "Guardar como..."
#: ElectronClient/gui/NoteEditor/utils/contextMenu.js:65
msgid "Reveal file in folder"
msgstr ""
msgstr "Mostrar archivo en directorio"
#: ElectronClient/gui/NoteEditor/utils/contextMenu.js:73
#: ElectronClient/gui/NoteText.min.js:797
@@ -1307,21 +1305,18 @@ msgid "Set the password"
msgstr "Establecer la contraseña"
#: ElectronClient/gui/MainScreen/MainScreen.min.js:331
#, fuzzy
msgid "One of your master keys use an obsolete encryption method."
msgstr "Una o más llaves maestras necesitan una contraseña."
msgstr "Una de tus llaves maestras usa un método de encripción obsoleto."
#: ElectronClient/gui/MainScreen/MainScreen.min.js:343
#, fuzzy
msgid ""
"The default encryption method has been changed, you should re-encrypt your "
"data."
msgstr ""
"El método de cifrado predeterminado se ha cambiado por uno más seguro y se "
"recomienda que lo aplique a sus datos."
"El método de cifrado predeterminado ha sido cambiado, se recomienda re-"
"cifrar los datos."
#: ElectronClient/gui/MainScreen/MainScreen.min.js:348
#, fuzzy
msgid "More info"
msgstr "Más información"
@@ -1435,9 +1430,8 @@ msgstr "Imprimir"
#: ElectronClient/gui/MainScreen/commands/print.js:25
#: ElectronClient/gui/NoteText.min.js:1321
#, fuzzy
msgid "Only one note can be printed at a time."
msgstr "Solo una nota puede ser impresa o exportada a PDF a la vez."
msgstr "Solo una nota puede ser impresa a la vez."
#: ElectronClient/gui/NoteToolbar/NoteToolbar.js:32
#: ElectronClient/gui/NoteText.min.js:1656
@@ -1558,7 +1552,6 @@ msgid "Options"
msgstr "Opciones"
#: ElectronClient/gui/Root.min.js:93
#, fuzzy
msgid "Note attachments"
msgstr "Adjuntos"
@@ -1607,7 +1600,7 @@ msgstr "Ordenar notas por"
#: ElectronClient/gui/NoteList.min.js:147
#: ElectronClient/gui/NoteList/NoteList.min.js:152
#, fuzzy, javascript-format
#, javascript-format
msgid ""
"To manually sort the notes, the sort order must be changed to \"%s\" in the "
"menu \"%s\" > \"%s\""
@@ -1617,9 +1610,8 @@ msgstr ""
#: ElectronClient/gui/NoteList.min.js:148
#: ElectronClient/gui/NoteList/NoteList.min.js:153
#, fuzzy
msgid "Do it now"
msgstr "Obtenerlo ahora en:"
msgstr "Hazlo ahora"
#: ElectronClient/gui/NoteList.min.js:452
#: ElectronClient/gui/NoteList/NoteList.min.js:425
@@ -1678,7 +1670,6 @@ msgid "Icon"
msgstr "Icono"
#: ElectronClient/gui/FolderPropertiesDialog.min.js:272
#, fuzzy
msgid "Notebook properties"
msgstr "Propiedades de libreta"
@@ -1705,9 +1696,8 @@ msgid "Edit in external editor"
msgstr "Editar con un editor externo"
#: ElectronClient/gui/NoteText.min.js:1852
#, fuzzy
msgid "Content Properties"
msgstr "Propiedades de nota"
msgstr "Propiedades del Contenido"
#: ElectronClient/gui/EncryptionConfigScreen.min.js:95
#: ReactNativeClient/lib/components/screens/encryption-config.js:125
@@ -1719,7 +1709,6 @@ msgid "Master keys that need upgrading"
msgstr "Claves maestras que necesitan actualización"
#: ElectronClient/gui/EncryptionConfigScreen.min.js:149
#, fuzzy
msgid ""
"The following master keys use an out-dated encryption algorithm and it is "
"recommended to upgrade them. The upgraded master key will still be able to "
@@ -1735,7 +1724,7 @@ msgstr "Actualizar"
#: ElectronClient/gui/EncryptionConfigScreen.min.js:181
msgid "Re-encrypt data"
msgstr "Encriptar datos nuevamente"
msgstr "Cifrar datos nuevamente"
#: ElectronClient/gui/EncryptionConfigScreen.min.js:183
msgid ""
@@ -1755,7 +1744,7 @@ msgstr ""
"cifrado obsoleto."
#: ElectronClient/gui/EncryptionConfigScreen.min.js:185
#, fuzzy, javascript-format
#, javascript-format
msgid ""
"In order to do so, your entire data set will have to be encrypted and "
"synchronised, so it is best to run it overnight.\n"
@@ -1771,8 +1760,8 @@ msgid ""
"\n"
"Important: you only need to run this ONCE on one device."
msgstr ""
"Para hacerlo, todo sus datos deberán estar encriptados y sincronizados, por "
"lo que es mejor ejecutarlo durante la noche.\n"
"Para hacerlo, todo sus datos deberán ser cifrados y sincronizados, por lo "
"que es mejor ejecutarlo durante la noche.\n"
"\n"
"Para empezar, siga estas instrucciones:\n"
"\n"
@@ -1803,7 +1792,6 @@ msgstr "Seleccione a dónde se debería exportar el estado de sincronización"
#: ElectronClient/gui/StatusScreen.min.js:71
#: ReactNativeClient/lib/components/screens/status.js:112
#, fuzzy
msgid "Retry All"
msgstr "Reintentar todos"
@@ -1855,14 +1843,13 @@ msgid "Viewer"
msgstr "Visor"
#: ElectronClient/gui/NoteContentPropertiesDialog.js:107
#, fuzzy
msgid "Statistics"
msgstr "Estadísticas..."
msgstr "Estadísticas"
#: ElectronClient/gui/NoteContentPropertiesDialog.js:111
#, javascript-format
msgid "Read time: %s min"
msgstr ""
msgstr "Tiempo de lectura: %s minutos"
#: ElectronClient/gui/NoteContentPropertiesDialog.js:112
#: ElectronClient/gui/ShareNoteDialog.js:175
@@ -1933,11 +1920,8 @@ msgid "Usage"
msgstr "Uso"
#: ElectronClient/gui/NoteList/commands/focusElementNoteList.js:15
#, fuzzy
msgid "Note list"
msgstr ""
"Historial\n"
" de notas"
msgstr "Historial de notas"
#: ElectronClient/gui/Header/commands/focusSearch.js:15
msgid "Search in all the notes"
@@ -1952,9 +1936,8 @@ msgid "Size"
msgstr "Tamaño"
#: ElectronClient/gui/ResourceScreen.js:39
#, fuzzy
msgid "Action"
msgstr "Localización"
msgstr "Acción"
#: ElectronClient/gui/ResourceScreen.js:42
#: ReactNativeClient/lib/path-utils.js:65
@@ -1964,9 +1947,9 @@ msgid "Untitled"
msgstr "Sin título"
#: ElectronClient/gui/ResourceScreen.js:93
#, fuzzy, javascript-format
#, javascript-format
msgid "Delete attachment \"%s\"?"
msgstr "¿Borrar nota «%s»?"
msgstr "¿Borrar adjunto «%s»?"
#: ElectronClient/gui/ResourceScreen.js:139
msgid ""
@@ -1979,9 +1962,8 @@ msgstr ""
"ellos, ya que no pueden ser recuperados después."
#: ElectronClient/gui/ResourceScreen.js:140
#, fuzzy
msgid "Please wait..."
msgstr "Comprobando... Por favor espere."
msgstr "Por favor espere..."
#: ElectronClient/gui/ResourceScreen.js:142
msgid "No resources!"
@@ -2052,7 +2034,6 @@ msgid "Insert template"
msgstr "Insertar plantilla"
#: ElectronClient/app.js:541
#, fuzzy
msgid "Open template directory"
msgstr "Abrir directorio de plantillas"
@@ -2061,7 +2042,6 @@ msgid "Refresh templates"
msgstr "Actualizar plantillas"
#: ElectronClient/app.js:574
#, fuzzy
msgid "Note attachments..."
msgstr "Adjuntos..."
@@ -2220,7 +2200,6 @@ msgstr ""
"con terceros."
#: ReactNativeClient/lib/registry.js:156
#, fuzzy
msgid ""
"Could not synchronise with OneDrive.\n"
"\n"
@@ -2231,10 +2210,10 @@ msgid ""
msgstr ""
"No se ha podido sincronizar con OneDrive.\n"
"\n"
"Este error suele ocurrir al utilizar OneDrive for Business. Este producto no "
"es soportado.\n"
"Este error suele ocurrir al utilizar OneDrive for Business, que "
"desafortunadamente no puede ser soportado.\n"
"\n"
"Podría considerar utilizar una cuenta Personal de OneDrive."
"Por favor considere utilizar una cuenta Personal de OneDrive."
#: ReactNativeClient/lib/logger.js:178
#, javascript-format
@@ -2347,7 +2326,6 @@ msgid "Aritim Dark"
msgstr ""
#: ReactNativeClient/lib/models/Setting.js:58
#, fuzzy
msgid "OLED Dark"
msgstr "Oscuro"
@@ -2500,7 +2478,7 @@ msgstr "Auto-emparejar llaves, paréntesis, comillas, etc."
#: ReactNativeClient/lib/models/Setting.js:395
msgid "Use CodeMirror as the code editor (WARNING: BETA)."
msgstr ""
msgstr "Utilizar CodeMirror como editor de código (PRECAUCIÓN: BETA)"
#: ReactNativeClient/lib/models/Setting.js:397
#: ReactNativeClient/lib/models/Setting.js:415
@@ -2550,9 +2528,8 @@ msgid "Enable Fountain syntax support"
msgstr "Habilitar el soporte de sintaxis de Fountain"
#: ReactNativeClient/lib/models/Setting.js:468
#, fuzzy
msgid "Enable Mermaid diagrams support"
msgstr "Habilitar el soporte de tipógrafo"
msgstr "Habilitar el soporte de diagramas de Mermaid"
#: ReactNativeClient/lib/models/Setting.js:470
msgid "Enable ==mark== syntax"
@@ -2629,13 +2606,12 @@ msgid "Editor font family"
msgstr "Editor de familia de fuente"
#: ReactNativeClient/lib/models/Setting.js:550
#, fuzzy
msgid ""
"This should be a *monospace* font or some elements will render incorrectly. "
"If the font is incorrect or empty, it will default to a generic monospace "
"font."
msgstr ""
"Esta debe ser una fuente *monoespaciada* o no funcionará correctamente. Si "
"Ésta debe ser una fuente *monoespaciada* o no funcionará correctamente. Si "
"la fuente es incorrecta o vacía, se configurará una fuente monoespaciada "
"genérica."
@@ -2808,12 +2784,11 @@ msgstr "Mantener historial de la nota durante"
#: ReactNativeClient/lib/models/Setting.js:741
msgid "Notebook list growth factor"
msgstr ""
msgstr "Factor de crecimiento de la lista de libretas"
#: ReactNativeClient/lib/models/Setting.js:743
#: ReactNativeClient/lib/models/Setting.js:756
#: ReactNativeClient/lib/models/Setting.js:769
#, fuzzy
msgid ""
"The factor property sets how the item will grow or shrink to fit the "
"available space in its container with respect to the other items. Thus an "
@@ -2828,11 +2803,11 @@ msgstr ""
#: ReactNativeClient/lib/models/Setting.js:754
msgid "Note list growth factor"
msgstr ""
msgstr "Factor de crecimiento de la lista de notas"
#: ReactNativeClient/lib/models/Setting.js:767
msgid "Note area growth factor"
msgstr ""
msgstr "Factor de crecimiento del área de la nota"
#: ReactNativeClient/lib/models/Setting.js:919
#, javascript-format
@@ -2865,14 +2840,13 @@ msgstr "Aplicación"
#: ReactNativeClient/lib/models/Setting.js:1254
msgid "Encryption"
msgstr "Encriptación"
msgstr "Cifrado"
#: ReactNativeClient/lib/models/Setting.js:1255
msgid "Web Clipper"
msgstr "Web Clipper"
#: ReactNativeClient/lib/models/Setting.js:1260
#, fuzzy
msgid ""
"These plugins enhance the Markdown renderer with additional features. Please "
"note that, while these features might be useful, they are not standard "
@@ -2908,30 +2882,32 @@ msgid "Downloaded"
msgstr "Descargado"
#: ReactNativeClient/lib/models/Resource.js:371
#, fuzzy, javascript-format
#, javascript-format
msgid "Attachment conflict: \"%s\""
msgstr "Adjuntos"
msgstr "Conflicto en los adjuntos: \"%s\""
#: ReactNativeClient/lib/models/Resource.js:372
#, fuzzy, javascript-format
#, javascript-format
msgid ""
"There was a [conflict](%s) on the attachment below.\n"
"\n"
"%s"
msgstr "Ha habido un error descargando este adjunto:"
msgstr ""
"Ha habido un [conflicto](%s) descargando este adjunto:.\n"
"\n"
"%s"
#: ReactNativeClient/lib/models/Tag.js:384
#, fuzzy
msgid "Cannot move tag to this location."
msgstr "No se puede mover la libreta a este lugar"
msgstr "No se puede mover la etiqueta a este lugar."
#: ReactNativeClient/lib/models/Tag.js:429
msgid "Tag name cannot start or end with a `/`."
msgstr ""
msgstr "El nombre de la etiqueta no puede empezar o terminar con `/`."
#: ReactNativeClient/lib/models/Tag.js:431
msgid "Tag name cannot contain `//`."
msgstr ""
msgstr "El nombre de la etiqueta no puede contener `//`."
#: ReactNativeClient/lib/models/Tag.js:482
#, javascript-format
@@ -3104,11 +3080,11 @@ msgstr ""
msgid ""
"Please confirm that you would like to re-encrypt your complete database."
msgstr ""
"Por favor, confirme que desea volver a encriptar su base de datos completa."
"Por favor, confirme que desea volver a cifrar su base de datos completa."
#: ReactNativeClient/lib/components/shared/encryption-config-shared.js:37
msgid "Your data is going to be re-encrypted and synced again."
msgstr "Sus datos van a ser encriptados y sincronizados nuevamente."
msgstr "Sus datos van a ser cifrados y sincronizados nuevamente."
#: ReactNativeClient/lib/components/shared/encryption-config-shared.js:47
msgid ""
@@ -3381,7 +3357,7 @@ msgstr "No hay elementos con el ID %s"
#: ReactNativeClient/lib/components/screens/note.js:180
msgid "This attachment is not downloaded or not decrypted yet."
msgstr "El adjunto no ha sido descargado o desencriptado todavía."
msgstr "El adjunto no ha sido descargado o descifrado todavía."
#: ReactNativeClient/lib/components/screens/note.js:184
#, javascript-format
@@ -3554,10 +3530,9 @@ msgstr "Sistema de archivos"
#: ReactNativeClient/lib/commands/historyForward.js:16
msgid "Forward"
msgstr ""
msgstr "Avanzar"
#: ReactNativeClient/lib/commands/synchronize.js:17
#, fuzzy
msgid "Synchronize"
msgstr "Sincronizar"
@@ -3617,7 +3592,7 @@ msgstr "Adjuntos"
#: ReactNativeClient/lib/services/report.js:190
msgid "Downloaded and decrypted"
msgstr "Descargado y desencriptado"
msgstr "Descargado y descifrado"
#: ReactNativeClient/lib/services/report.js:190
#: ReactNativeClient/lib/services/report.js:191
@@ -3628,7 +3603,7 @@ msgstr "%s: %d"
#: ReactNativeClient/lib/services/report.js:191
msgid "Downloaded and encrypted"
msgstr "Descargado y desencriptado"
msgstr "Descargado y cifrado"
#: ReactNativeClient/lib/services/report.js:204
msgid "Attachments that could not be downloaded"
@@ -3665,7 +3640,7 @@ msgstr "Borrar: %d"
#: ReactNativeClient/lib/services/report.js:236
msgid "Folders"
msgstr "Carpetas"
msgstr "Directorios"
#: ReactNativeClient/lib/services/report.js:244
#, javascript-format
@@ -3725,9 +3700,10 @@ msgid "Directory"
msgstr "Directorio"
#: ReactNativeClient/lib/services/InteropService.js:174
#, fuzzy, javascript-format
#, javascript-format
msgid "Cannot load \"%s\" module for format \"%s\" and output \"%s\""
msgstr "No se puede cargar el módulo «%s» para el formato «%s»"
msgstr ""
"No se puede cargar el módulo «%s» para el formato «%s» y destino \"%s\""
#: ReactNativeClient/lib/services/InteropService.js:232
#, javascript-format

File diff suppressed because it is too large Load Diff

View File

@@ -13,9 +13,11 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 2.3.1\n"
"X-Generator: Poedit 2.4\n"
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 "
"|| n%100>14) ? 1 : 2);\n"
"POT-Creation-Date: \n"
"PO-Revision-Date: \n"
#: CliClient/app/command-cp.js:13
msgid ""
@@ -105,9 +107,9 @@ msgid "Do not ask for confirmation."
msgstr "Nie pytaj o potwierdzenie."
#: CliClient/app/command-import.js:27
#, fuzzy, javascript-format
#, javascript-format
msgid "Output format: %s"
msgstr "Format źródłowy: %s"
msgstr "Format docelowy: %s"
#: CliClient/app/command-import.js:47 ElectronClient/gui/ImportScreen.min.js:69
#, javascript-format
@@ -221,14 +223,16 @@ msgstr ""
"w zależności od ilości danych."
#: CliClient/app/command-e2ee.js:53
#, fuzzy, javascript-format
#, javascript-format
msgid "Decrypted items: %d"
msgstr "Deszyfrowane obiekty: %s / %s"
msgstr "Deszyfrowane obiekty: %d"
#: CliClient/app/command-e2ee.js:54
#, javascript-format
msgid "Skipped items: %d (use --retry-failed-items to retry decrypting them)"
msgstr ""
"Pominięte obiekty: %d (użyj --retry-failed-items żeby ponownie spróbować je "
"odszyfrować)"
#: CliClient/app/command-e2ee.js:68
msgid "Completed decryption."
@@ -369,7 +373,6 @@ msgid "Synchronisation target: %s (%s)"
msgstr "Serwis synchronizacji: %s (%s)"
#: CliClient/app/command-sync.js:177
#, fuzzy
msgid "Cannot initialise synchroniser."
msgstr "Nie można zainicjalizować synchronizatora."
@@ -558,9 +561,8 @@ msgstr ""
"deszyfrowane w tle i będą dostępne wkrótce."
#: CliClient/app/gui/NoteWidget.js:50
#, fuzzy
msgid "You may also type `status` for more information."
msgstr "Nie pytaj o potwierdzenie."
msgstr "Możesz też wpisać `status` po więcej informacji."
#: CliClient/app/gui/FolderListWidget.js:31
msgid "Search:"
@@ -720,7 +722,7 @@ msgstr "N"
#: CliClient/app/app.js:136
msgid "y"
msgstr "y"
msgstr "t"
#: CliClient/app/app.js:169
msgid "Cancelling background synchronisation... Please wait."
@@ -745,19 +747,20 @@ msgstr "Wyświetla podsumowanie o notatkach i notatnikach."
msgid ""
"To retry decryption of these items. Run `e2ee decrypt --retry-failed-items`"
msgstr ""
"Żeby spróbować ponownie odszyfrować te obiekty, uruchom `e2ee decrypt --"
"retry-failed-items`"
#: CliClient/app/command-tag.js:14
#, fuzzy
msgid ""
"<tag-command> can be \"add\", \"remove\", \"list\", or \"notetags\" to "
"assign or 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 all the tags (use -l for long option)."
msgstr ""
"<tag-command> może \"add\", \"remove\" lub \"list\" aby przypisać lub usunąć "
"[tag] z [note], lub wyświetlić listę notatek połączonych z [tag]. Komenda "
"`tag list` może zostać użyta do wyświetlenia wszystkich znaczników (użyj -l "
"dla wyświetlenia długich)."
"<tag-command> może być \"add\", \"remove\" lub \"list\" aby przypisać lub "
"usunąć [tag] z [note], wyświetlić listę notatek połączonych z [tag], lub "
"wyświetlić znaczniki powiązane z [note]. Komenda `tag list` może zostać "
"użyta do wyświetlenia wszystkich znaczników (użyj -l dla długiego wypisania)."
#: CliClient/app/command-tag.js:90
#, javascript-format
@@ -812,13 +815,12 @@ msgid "Cancel"
msgstr "Anuluj"
#: ElectronClient/plugins/GotoAnything.min.js:454
#, fuzzy
msgid ""
"Type a note title or part of its content to jump to it. Or type # followed "
"by a tag name, or @ followed by a notebook name."
msgstr ""
"Wpisz tytuł notatki, aby do niej przejść. Lub wpisz # i następnie nazwę "
"tagu, lub @ i następnie nazwę notatnika."
"Wpisz tytuł notatki lub jej fragment, aby do niej przejść. Lub wpisz # i "
"następnie nazwę tagu, lub @ i następnie nazwę notatnika."
#: ElectronClient/plugins/GotoAnything.min.js:493
msgid "Goto Anything..."
@@ -830,9 +832,9 @@ msgid "Exporting to \"%s\" as \"%s\" format. Please wait..."
msgstr "Eksportowanie do \"%s\" jako \"%s\". Proszę czekać..."
#: ElectronClient/InteropServiceHelper.js:164
#, fuzzy, javascript-format
#, javascript-format
msgid "Could not export notes: %s"
msgstr "Nie udało się zaktualizować klucza głównego: %s"
msgstr "Nie udało się wyeksportować notatek: %s"
#: ElectronClient/checkForUpdates.js:138
msgid "Current version is up-to-date."
@@ -870,9 +872,8 @@ msgid "No"
msgstr "Nie"
#: ElectronClient/checkForUpdates.js:153
#, fuzzy
msgid "Full Release Notes"
msgstr "Całę informacje o wersji \\ Cały opis zmian"
msgstr "Całe informacje o wersji / opis zmian"
#: ElectronClient/gui/NoteRevisionViewer.min.js:75
#, javascript-format
@@ -945,9 +946,9 @@ msgid "Delete"
msgstr "Usuń"
#: ElectronClient/gui/SideBar/SideBar.min.js:276
#, fuzzy, javascript-format
#, javascript-format
msgid "Remove tag \"%s\" and its descendant tags from all notes?"
msgstr "Usunąć znacznik \"%s\" ze wszystkich notatek?"
msgstr "Usunąć znacznik \"%s\" i jemu pokrewne ze wszystkich notatek?"
#: ElectronClient/gui/SideBar/SideBar.min.js:278
#: ElectronClient/gui/SideBar.min.js:292
@@ -1001,9 +1002,9 @@ msgstr "Deszyfrowanie obiektów %d/%d"
#: ElectronClient/gui/SideBar/SideBar.min.js:740
#: ElectronClient/gui/SideBar.min.js:802
#: ReactNativeClient/lib/components/side-menu-content.js:330
#, fuzzy, javascript-format
#, javascript-format
msgid "Fetching resources: %d/%d"
msgstr "Pobieranie zasobów: %d"
msgstr "Pobieranie zasobów: %d/%d"
#: ElectronClient/gui/SideBar/commands/focusElementSideBar.js:15
msgid "Sidebar"
@@ -1017,9 +1018,8 @@ msgstr "pogrubienie"
#: ElectronClient/gui/NoteEditor/NoteBody/CodeMirror/CodeMirror.js:145
#: ElectronClient/gui/NoteEditor/NoteBody/AceEditor/AceEditor.js:261
#, fuzzy
msgid "emphasised text"
msgstr "podkreślenie"
msgstr "wyszczególnienie"
#: ElectronClient/gui/NoteEditor/NoteBody/CodeMirror/CodeMirror.js:147
#: ElectronClient/gui/NoteEditor/NoteBody/AceEditor/AceEditor.js:263
@@ -1077,9 +1077,8 @@ msgstr ""
"edytować notatkę."
#: ElectronClient/gui/NoteEditor/NoteBody/TinyMCE/plugins/lists.js:2151
#, fuzzy
msgid "Checkbox list"
msgstr "Pole wyboru"
msgstr "Lista checkboxów"
#: ElectronClient/gui/NoteEditor/NoteBody/TinyMCE/TinyMCE.js:470
#: ElectronClient/gui/ConfigScreen.min.js:642
@@ -1096,11 +1095,11 @@ msgstr "Załącz plik"
#: ElectronClient/gui/NoteEditor/NoteBody/TinyMCE/TinyMCE.js:535
msgid "Code Block"
msgstr ""
msgstr "Blok kodu"
#: ElectronClient/gui/NoteEditor/NoteBody/TinyMCE/TinyMCE.js:544
msgid "Inline Code"
msgstr ""
msgstr "Kod w linii"
#: ElectronClient/gui/NoteEditor/NoteBody/TinyMCE/TinyMCE.js:559
#: ElectronClient/gui/NoteEditor/commands/editorCommandDeclarations.js:80
@@ -1110,13 +1109,12 @@ msgstr "Wstaw stempel czasowy"
#: ElectronClient/gui/NoteEditor/NoteBody/TinyMCE/TinyMCE.js:903
msgid "Drop notes or files here"
msgstr ""
msgstr "Upuść notatki lub pliki tutaj"
#: ElectronClient/gui/NoteEditor/NoteBody/TinyMCE/TinyMCE.js:903
#: ElectronClient/gui/MainScreen/MainScreen.min.js:401
#, fuzzy
msgid "Code View"
msgstr "Kod"
msgstr "Widok kodu"
#: ElectronClient/gui/NoteEditor/NoteBody/TinyMCE/TinyMCE.js:903
#, javascript-format
@@ -1124,6 +1122,8 @@ msgid ""
"Please wait for all attachments to be downloaded and decrypted. You may also "
"switch to %s to edit the note."
msgstr ""
"Poczekaj na pobranie I odszyfrowanie wszystkich załączników. Możesz też "
"przenieść się do %s żeby edytować notatkę."
#: ElectronClient/gui/NoteEditor/utils/useMessageHandler.js:70
#: ElectronClient/gui/NoteText.min.js:833
@@ -1133,9 +1133,8 @@ msgstr "Wystąpił błąd pobierania załącznika:"
#: ElectronClient/gui/NoteEditor/utils/useMessageHandler.js:73
#: ElectronClient/gui/NoteText.min.js:835
#: ReactNativeClient/lib/services/ResourceEditWatcher.js:146
#, fuzzy
msgid "This attachment is not downloaded or not decrypted yet"
msgstr "Załącznik nie został jeszcze pobrany lub deszyfrowany."
msgstr "Załącznik nie został jeszcze pobrany lub deszyfrowany"
#: ElectronClient/gui/NoteEditor/utils/contextMenu.js:39
#: ElectronClient/gui/NoteText.min.js:778
@@ -1149,7 +1148,7 @@ msgstr "Zapisz jako..."
#: ElectronClient/gui/NoteEditor/utils/contextMenu.js:65
msgid "Reveal file in folder"
msgstr ""
msgstr "Odkryj plik w folderze"
#: ElectronClient/gui/NoteEditor/utils/contextMenu.js:73
#: ElectronClient/gui/NoteText.min.js:797
@@ -1254,9 +1253,8 @@ msgid "Updated"
msgstr "Zaaktualizowano"
#: ElectronClient/gui/NotePropertiesDialog.min.js:29
#, fuzzy
msgid "Completed"
msgstr "Ukończono: %s"
msgstr "Ukończono"
#: ElectronClient/gui/NotePropertiesDialog.min.js:30
msgid "Location"
@@ -1328,7 +1326,7 @@ msgstr "Wyszukaj..."
#: ElectronClient/gui/MainScreen/commands/showNoteContentProperties.js:16
msgid "Statistics..."
msgstr ""
msgstr "Statystyki…"
#: ElectronClient/gui/MainScreen/commands/renameFolder.js:17
#: ElectronClient/gui/MainScreen/commands/renameTag.js:17
@@ -1351,9 +1349,8 @@ msgstr "Nowe zadanie"
#: ElectronClient/gui/MainScreen/commands/toggleNoteList.js:15
#: ElectronClient/gui/MainScreen/commands/toggleNoteList.js:26
#, fuzzy
msgid "Toggle note list"
msgstr "Lista notatek"
msgstr "Przełącz listę notatek"
#: ElectronClient/gui/MainScreen/commands/toggleSidebar.js:15
#: ElectronClient/gui/MainScreen/commands/toggleSidebar.js:26
@@ -1391,9 +1388,8 @@ msgstr "Przenieś do notatnika"
#: ElectronClient/gui/MainScreen/commands/moveToFolder.js:36
#: ElectronClient/gui/MainScreen.min.js:272
#, fuzzy
msgid "Move to notebook:"
msgstr "Przenieś do notatnika..."
msgstr "Przenieś do notatnika:"
#: ElectronClient/gui/MainScreen/commands/toggleVisiblePanes.js:15
msgid "Toggle editor layout"
@@ -1435,7 +1431,6 @@ msgstr "Drukuj"
# Not sure about wydrukowana\drukowana here
#: ElectronClient/gui/MainScreen/commands/print.js:25
#: ElectronClient/gui/NoteText.min.js:1321
#, fuzzy
msgid "Only one note can be printed at a time."
msgstr "Tylko jedna notatka może być wydrukowana w tym samym czasie."
@@ -1556,9 +1551,8 @@ msgid "Options"
msgstr "Opcje"
#: ElectronClient/gui/Root.min.js:93
#, fuzzy
msgid "Note attachments"
msgstr "Załącz plik"
msgstr "Załączniki notatki"
#: ElectronClient/gui/Root.min.js:94 ElectronClient/app.js:500
msgid "Synchronisation Status"
@@ -1574,7 +1568,7 @@ msgstr "Chrome Web Store"
#: ElectronClient/gui/ExtensionBadge.min.js:44
msgid "Get it now:"
msgstr "Pobierz teraz"
msgstr "Pobierz teraz:"
#: ElectronClient/gui/ImportScreen.min.js:62
#, javascript-format
@@ -1592,13 +1586,12 @@ msgstr "Wyślij"
#: ElectronClient/gui/NoteList.min.js:147
#: ElectronClient/gui/NoteList/NoteList.min.js:152
msgid "Custom order"
msgstr ""
msgstr "Własny kierunek sortowania"
#: ElectronClient/gui/NoteList.min.js:147
#: ElectronClient/gui/NoteList/NoteList.min.js:152
#, fuzzy
msgid "View"
msgstr "&Wyświetl"
msgstr "Widok"
#: ElectronClient/gui/NoteList.min.js:147
#: ElectronClient/gui/NoteList/NoteList.min.js:152
@@ -1613,12 +1606,13 @@ msgid ""
"To manually sort the notes, the sort order must be changed to \"%s\" in the "
"menu \"%s\" > \"%s\""
msgstr ""
"Żeby posortować notatki ręcznie, kierunek sortowania musi zostać zmieniony "
"na \"%s\" w menu \"%s\" > \"%s\""
#: ElectronClient/gui/NoteList.min.js:148
#: ElectronClient/gui/NoteList/NoteList.min.js:153
#, fuzzy
msgid "Do it now"
msgstr "Pobierz teraz"
msgstr "Zrób to teraz"
#: ElectronClient/gui/NoteList.min.js:452
#: ElectronClient/gui/NoteList/NoteList.min.js:425
@@ -1703,9 +1697,8 @@ msgid "Edit in external editor"
msgstr "Edytuj w edytorze zewnętrznym"
#: ElectronClient/gui/NoteText.min.js:1852
#, fuzzy
msgid "Content Properties"
msgstr "Właściwośći notatki"
msgstr "Właściwości zawartości"
#: ElectronClient/gui/EncryptionConfigScreen.min.js:95
#: ReactNativeClient/lib/components/screens/encryption-config.js:125
@@ -1752,7 +1745,6 @@ msgstr ""
"metodą."
#: ElectronClient/gui/EncryptionConfigScreen.min.js:185
#, fuzzy, javascript-format
msgid ""
"In order to do so, your entire data set will have to be encrypted and "
"synchronised, so it is best to run it overnight.\n"
@@ -1771,7 +1763,16 @@ msgstr ""
"Aby to zrobić należy zaszyfrować i zsynchronizować wszystkie twoje dane, "
"więc najlepiej będzie zrobić to przez noc.\n"
"\n"
"Aby rozpocząć postępuj zgodnie z instrukcją:"
"Aby rozpocząć postępuj zgodnie z instrukcją:\n"
"\n"
"1. Zsynchronizuj wszystkie swoje urządzenia.\n"
"2. Naciśnij \"%s%.\n"
"3. Poczekaj na zakończenie. W trakcie tego procesu postaraj się nie zmieniać "
"żadnych notatek na swoich urządzeniach, aby uniknąć konfliktów.\n"
"4. Kiedy synchronizacja się zakończy na tym urządzeniu, zsynchronizuj inne "
"urządzenia.\n"
"\n"
"Ważne: musisz wykonać powyższe kroki tylko RAZ na jednym urządzeniu."
#: ElectronClient/gui/EncryptionConfigScreen.min.js:432
#: ReactNativeClient/lib/components/screens/encryption-config.js:279
@@ -1829,27 +1830,24 @@ msgstr "Wiersze"
#: ReactNativeClient/lib/models/Setting.js:355
#: ReactNativeClient/lib/models/Setting.js:356
#: ReactNativeClient/lib/models/Setting.js:357
#, fuzzy
msgid "Editor"
msgstr "Edytuj"
msgstr "Edytor"
#: ElectronClient/gui/NoteContentPropertiesDialog.js:99
#: ReactNativeClient/lib/models/Setting.js:355
#: ReactNativeClient/lib/models/Setting.js:356
#: ReactNativeClient/lib/models/Setting.js:358
#, fuzzy
msgid "Viewer"
msgstr "&Wyświetl"
msgstr "Wyświetlacz"
#: ElectronClient/gui/NoteContentPropertiesDialog.js:107
#, fuzzy
msgid "Statistics"
msgstr "Status"
msgstr "Statystyki"
#: ElectronClient/gui/NoteContentPropertiesDialog.js:111
#, javascript-format
msgid "Read time: %s min"
msgstr ""
msgstr "Czas czytania: %s min"
#: ElectronClient/gui/NoteContentPropertiesDialog.js:112
#: ElectronClient/gui/ShareNoteDialog.js:175
@@ -1866,9 +1864,8 @@ msgid "Check synchronisation configuration"
msgstr "Sprawdź konfigurację synchronizacji"
#: ElectronClient/gui/ConfigScreen.min.js:179
#, fuzzy
msgid "Unknown"
msgstr "Nieznana flaga: %s"
msgstr "Nieznany"
#: ElectronClient/gui/ConfigScreen.min.js:183
msgid "Checking..."
@@ -1921,7 +1918,6 @@ msgid "Usage"
msgstr "Przykłady"
#: ElectronClient/gui/NoteList/commands/focusElementNoteList.js:15
#, fuzzy
msgid "Note list"
msgstr "Historia notatek"
@@ -1938,9 +1934,8 @@ msgid "Size"
msgstr "Rozmiar"
#: ElectronClient/gui/ResourceScreen.js:39
#, fuzzy
msgid "Action"
msgstr "Lokacja"
msgstr "Akcja"
#: ElectronClient/gui/ResourceScreen.js:42
#: ReactNativeClient/lib/path-utils.js:65
@@ -1950,9 +1945,9 @@ msgid "Untitled"
msgstr "Bez nazwy"
#: ElectronClient/gui/ResourceScreen.js:93
#, fuzzy, javascript-format
#, javascript-format
msgid "Delete attachment \"%s\"?"
msgstr "Usunąć notatkę \"%s\"?"
msgstr "Usunąć załącznik \"%s\"?"
#: ElectronClient/gui/ResourceScreen.js:139
msgid ""
@@ -1960,6 +1955,9 @@ msgid ""
"notes. Please be careful when deleting one of them as they cannot be "
"restored afterwards."
msgstr ""
"To zaawansowane narzędzie do wyświetlania załączników, które są powiązane z "
"twoimi notatkami. Bądź ostrożny przy usuwaniu jednego z nich, ponieważ nie "
"będzie on mógł zostać przywrócony."
#: ElectronClient/gui/ResourceScreen.js:140
msgid "Please wait..."
@@ -2011,9 +2009,8 @@ msgstr[1] "Kopiuj udostępnione linki"
msgstr[2] "Kopiuj udostępnione linki"
#: ElectronClient/commands/stopExternalEditing.js:16
#, fuzzy
msgid "Stop external editing"
msgstr "Naciśnij aby skończ edytowanie w programie zewnętrznym"
msgstr "Zakończ edytowanie w programie zewnętrznym"
#: ElectronClient/commands/startExternalEditing.js:29
#, javascript-format
@@ -2034,14 +2031,12 @@ msgid "Create to-do from template"
msgstr "Utwórz notatkę z szablonu"
#: ElectronClient/app.js:534
#, fuzzy
msgid "Insert template"
msgstr "Dodaj szablon"
msgstr "Wstaw szablon"
#: ElectronClient/app.js:541
#, fuzzy
msgid "Open template directory"
msgstr "Katalog Joplin Export"
msgstr "Otwórz katalog szablonów"
#: ElectronClient/app.js:548
msgid "Refresh templates"
@@ -2052,9 +2047,9 @@ msgid "Note attachments..."
msgstr "Załączenia notatki..."
#: ElectronClient/app.js:596
#, fuzzy, javascript-format
#, javascript-format
msgid "Revision: %s (%s)"
msgstr "%s %s (%s)"
msgstr "Rewizja: %s (%s)"
#: ElectronClient/app.js:603
#, javascript-format
@@ -2062,19 +2057,19 @@ msgid "%s %s (%s, %s)"
msgstr "%s %s (%s, %s)"
#: ElectronClient/app.js:605
#, fuzzy, javascript-format
#, javascript-format
msgid "Client ID: %s"
msgstr "Ukończono: %s"
msgstr "ID klienta: %s"
#: ElectronClient/app.js:606
#, fuzzy, javascript-format
#, javascript-format
msgid "Sync Version: %s"
msgstr "Nowa wersja: %s"
msgstr "Wersja synchronizacji: %s"
#: ElectronClient/app.js:607
#, fuzzy, javascript-format
#, javascript-format
msgid "Profile Version: %s"
msgstr "Nowa wersja: %s"
msgstr "Wersja profilu: %s"
#: ElectronClient/app.js:608
#, javascript-format
@@ -2206,7 +2201,6 @@ msgstr ""
"organizacji."
#: ReactNativeClient/lib/registry.js:156
#, fuzzy
msgid ""
"Could not synchronise with OneDrive.\n"
"\n"
@@ -2234,7 +2228,7 @@ msgstr "Nieznany poziom ID: %s"
#: ReactNativeClient/lib/SyncTargetAmazonS3.js:28
msgid "AWS S3"
msgstr ""
msgstr "AWS S3"
#: ReactNativeClient/lib/SyncTargetDropbox.js:25
msgid "Dropbox"
@@ -2287,7 +2281,7 @@ msgstr "tak"
#: ReactNativeClient/lib/models/Setting.js:40
#, javascript-format
msgid "(wysiwyg: %s)"
msgstr ""
msgstr "(wysiwyg: %s)"
#: ReactNativeClient/lib/models/Setting.js:40
msgid "no"
@@ -2331,12 +2325,11 @@ msgstr "Nord"
#: ReactNativeClient/lib/models/Setting.js:57
msgid "Aritim Dark"
msgstr ""
msgstr "Aritim ciemny"
#: ReactNativeClient/lib/models/Setting.js:58
#, fuzzy
msgid "OLED Dark"
msgstr "Ciemny"
msgstr "OLED ciemny"
#: ReactNativeClient/lib/models/Setting.js:80
msgid "Synchronisation target"
@@ -2380,15 +2373,15 @@ msgstr "Hasło użytkownika WebDAV"
#: ReactNativeClient/lib/models/Setting.js:189
msgid "AWS S3 bucket"
msgstr ""
msgstr "Bucket AWS S3"
#: ReactNativeClient/lib/models/Setting.js:200
msgid "AWS key"
msgstr ""
msgstr "Klucz AWS"
#: ReactNativeClient/lib/models/Setting.js:210
msgid "AWS secret"
msgstr ""
msgstr "Tajny klucz AWS"
#: ReactNativeClient/lib/models/Setting.js:224
msgid "Attachment download behaviour"
@@ -2439,20 +2432,19 @@ msgstr "Motyw"
#: ReactNativeClient/lib/models/Setting.js:315
msgid "Automatically switch theme to match system theme"
msgstr ""
msgstr "Automatycznie dopasyj motyw do motywu systemowego"
#: ReactNativeClient/lib/models/Setting.js:327
msgid "Preferred light theme"
msgstr ""
msgstr "Preferuj jasny motyw"
#: ReactNativeClient/lib/models/Setting.js:341
msgid "Preferred dark theme"
msgstr ""
msgstr "Preferuj ciemny motyw"
#: ReactNativeClient/lib/models/Setting.js:346
#, fuzzy
msgid "Show note counts"
msgstr "Pokaż ikonę w zasobniku systemowym"
msgstr "Pokaż liczbę notatek"
#: ReactNativeClient/lib/models/Setting.js:355
#: ReactNativeClient/lib/models/Setting.js:357
@@ -2461,9 +2453,9 @@ msgid "Split View"
msgstr "Podzielony podgląd"
#: ReactNativeClient/lib/models/Setting.js:355
#, fuzzy, javascript-format
#, javascript-format
msgid "%s / %s / %s"
msgstr "%s = %s (%s)"
msgstr "%s / %s / %s"
#: ReactNativeClient/lib/models/Setting.js:356
#: ReactNativeClient/lib/models/Setting.js:357
@@ -2486,7 +2478,7 @@ msgstr "Zamykaj klamry, nawiasy, cudzysłowy itd."
#: ReactNativeClient/lib/models/Setting.js:395
msgid "Use CodeMirror as the code editor (WARNING: BETA)."
msgstr ""
msgstr "Użyj CodeMirror jako edytora kodu (UWAGA: BETA)"
#: ReactNativeClient/lib/models/Setting.js:397
#: ReactNativeClient/lib/models/Setting.js:415
@@ -2524,23 +2516,20 @@ msgid "Enable soft breaks"
msgstr "Aktywuj miękkie łamanie linii"
#: ReactNativeClient/lib/models/Setting.js:465
#, fuzzy
msgid "Enable typographer support"
msgstr "Aktywuj składnię ~sub~"
msgstr "Aktywuj składnię typografu"
#: ReactNativeClient/lib/models/Setting.js:466
msgid "Enable math expressions"
msgstr "Atywuj wyrażenia matematyczne"
#: ReactNativeClient/lib/models/Setting.js:467
#, fuzzy
msgid "Enable Fountain syntax support"
msgstr "Aktywuj składnię ~sub~"
msgstr "Aktywuj składnię Fountain"
#: ReactNativeClient/lib/models/Setting.js:468
#, fuzzy
msgid "Enable Mermaid diagrams support"
msgstr "Aktywuj składnię ~sub~"
msgstr "Aktywuj składnię Mermaid"
#: ReactNativeClient/lib/models/Setting.js:470
msgid "Enable ==mark== syntax"
@@ -2617,7 +2606,6 @@ msgid "Editor font family"
msgstr "Rodzina czcionek edytora"
#: ReactNativeClient/lib/models/Setting.js:550
#, fuzzy
msgid ""
"This should be a *monospace* font or some elements will render incorrectly. "
"If the font is incorrect or empty, it will default to a generic monospace "
@@ -2690,9 +2678,8 @@ msgid "A4"
msgstr "A4"
#: ReactNativeClient/lib/models/Setting.js:626
#, fuzzy
msgid "Letter"
msgstr "List\\Litera"
msgstr "List"
#: ReactNativeClient/lib/models/Setting.js:627
msgid "A3"
@@ -2761,15 +2748,15 @@ msgstr "Ignoruj błędy certyfikatu TLS"
#: ReactNativeClient/lib/models/Setting.js:689
msgid "Fail-safe"
msgstr ""
msgstr "Bezpieczny"
#: ReactNativeClient/lib/models/Setting.js:690
msgid ""
"Fail-safe: Do not wipe out local data when sync target is empty (often the "
"result of a misconfiguration or bug)"
msgstr ""
"Zabezpieczenie: nie usuwaj lokalnych danych kiedy cel synchronizacji jest "
"pusty (często w wyniku nieprawidłowej konfiguracji lub błędu)"
"Bezpieczny: nie usuwaj lokalnych danych kiedy cel synchronizacji jest pusty "
"(często w wyniku nieprawidłowej konfiguracji lub błędu)"
#: ReactNativeClient/lib/models/Setting.js:694
msgid ""
@@ -2797,7 +2784,7 @@ msgstr "Zachowuj historię przez"
#: ReactNativeClient/lib/models/Setting.js:741
msgid "Notebook list growth factor"
msgstr ""
msgstr "Czynnik rośnięcia listy notatników"
#: ReactNativeClient/lib/models/Setting.js:743
#: ReactNativeClient/lib/models/Setting.js:756
@@ -2808,14 +2795,18 @@ msgid ""
"item with a factor of 2 will take twice as much space as an item with a "
"factor of 1.Restart app to see changes."
msgstr ""
"Wartość czynnika ustala jak element będzie rósł, bądź zmniejszał się w "
"odniesieniu do sąsiadujących elementów w kontenerze. Przykładowo, element z "
"czynnikiem 2 będzie zajmował 2 razy więcej, niż ten z czynnikiem 1,. "
"Zrestartuj aplikację, aby zobaczyć zmiany."
#: ReactNativeClient/lib/models/Setting.js:754
msgid "Note list growth factor"
msgstr ""
msgstr "Czynnik rośnięcia listy notatek"
#: ReactNativeClient/lib/models/Setting.js:767
msgid "Note area growth factor"
msgstr ""
msgstr "Czynnik rośnięcia pola notatek"
#: ReactNativeClient/lib/models/Setting.js:919
#, javascript-format
@@ -2851,9 +2842,8 @@ msgid "Encryption"
msgstr "Szyfrowanie"
#: ReactNativeClient/lib/models/Setting.js:1255
#, fuzzy
msgid "Web Clipper"
msgstr "Opcje Web clipper"
msgstr "Web clipper"
#: ReactNativeClient/lib/models/Setting.js:1260
msgid ""
@@ -2865,6 +2855,13 @@ msgid ""
"formatting. It is indicated below which plugins are compatible or not with "
"the WYSIWYG editor."
msgstr ""
"Te wtyczki usprawniają wyświtlanie Markdownu. Miej na uwadze, że mimo, że te "
"znaczniki mogą być przydatne, to nie są one częścią standardowego Markdownu "
"i z uwagi na to większość z nich będzie działała wyłącznie w Joplinie. "
"Dodatkowo, część z nich jest *niekompatybilna* z edytorem WYSIWYG. Jeśli "
"otworzysz notatkę używającą tego formatowania w tym edytorze, utracisz to "
"formatowanie. Poniżej jest widoczne które pluginy są kompatybilne z edytorem "
"WYSIWYG."
#: ReactNativeClient/lib/models/Setting.js:1261
#, javascript-format
@@ -2884,30 +2881,32 @@ msgid "Downloaded"
msgstr "Pobrano"
#: ReactNativeClient/lib/models/Resource.js:371
#, fuzzy, javascript-format
#, javascript-format
msgid "Attachment conflict: \"%s\""
msgstr "Załączenia"
msgstr "Konflikt załącznika: \"%s\""
#: ReactNativeClient/lib/models/Resource.js:372
#, fuzzy, javascript-format
#, javascript-format
msgid ""
"There was a [conflict](%s) on the attachment below.\n"
"\n"
"%s"
msgstr "Wystąpił błąd pobierania załącznika:"
msgstr ""
"Wystąpił [konflikt](%s) w załączniku poniżej.\n"
"\n"
"%s"
#: ReactNativeClient/lib/models/Tag.js:384
#, fuzzy
msgid "Cannot move tag to this location."
msgstr "Nie można przenieść notatnika do tej lokacji"
msgstr "Nie można przenieść tagu do tej lokacji."
#: ReactNativeClient/lib/models/Tag.js:429
msgid "Tag name cannot start or end with a `/`."
msgstr ""
msgstr "Nazwa tagu nie może rozpoczynać ani kończyć się na `/`."
#: ReactNativeClient/lib/models/Tag.js:431
msgid "Tag name cannot contain `//`."
msgstr ""
msgstr "Nazwa tagu nie może zawierać `//`."
#: ReactNativeClient/lib/models/Tag.js:482
#, javascript-format
@@ -2920,7 +2919,7 @@ msgstr "data utworzenia"
#: ReactNativeClient/lib/models/Note.js:28
msgid "custom order"
msgstr ""
msgstr "własny kierunek sortowania"
#: ReactNativeClient/lib/models/Note.js:92
msgid "This note does not have geolocation information."
@@ -3292,7 +3291,7 @@ msgstr "Tylko w celu debugowania: eksportuj profil na zewnętrzną kartę SD."
#: ReactNativeClient/lib/components/screens/config.js:461
msgid "More information"
msgstr "Więcej informacji "
msgstr "Więcej informacji"
#: ReactNativeClient/lib/components/screens/config.js:471
msgid ""
@@ -3527,10 +3526,9 @@ msgstr "System plików"
#: ReactNativeClient/lib/commands/historyForward.js:16
msgid "Forward"
msgstr ""
msgstr "Przekaż"
#: ReactNativeClient/lib/commands/synchronize.js:17
#, fuzzy
msgid "Synchronize"
msgstr "Synchronizuj"
@@ -3585,9 +3583,8 @@ msgstr ""
"odszyfrować."
#: ReactNativeClient/lib/services/report.js:182
#, fuzzy
msgid "Attachments"
msgstr "Załączenia"
msgstr "Załączniki"
#: ReactNativeClient/lib/services/report.js:190
msgid "Downloaded and decrypted"
@@ -3596,23 +3593,22 @@ msgstr "Pobrane i odszyfrowane"
#: ReactNativeClient/lib/services/report.js:190
#: ReactNativeClient/lib/services/report.js:191
#: ReactNativeClient/lib/services/report.js:194
#, fuzzy, javascript-format
#, javascript-format
msgid "%s: %d"
msgstr "%s: %s"
msgstr "%s: %d"
#: ReactNativeClient/lib/services/report.js:191
msgid "Downloaded and encrypted"
msgstr "Pobrane i zaszyfrowane"
#: ReactNativeClient/lib/services/report.js:204
#, fuzzy
msgid "Attachments that could not be downloaded"
msgstr "Obiekt \"%s\" nie może być pobrany: %s"
msgstr "Załączniki nie mogą zostać pobrane"
#: ReactNativeClient/lib/services/report.js:209
#, fuzzy, javascript-format
#, javascript-format
msgid "%s (%s): %s"
msgstr "%s %s (%s)"
msgstr "%s (%s): %s"
#: ReactNativeClient/lib/services/report.js:222
msgid "Sync status (synced items / total items)"
@@ -3672,12 +3668,10 @@ msgid "Joplin Export Directory"
msgstr "Katalog Joplin Export"
#: ReactNativeClient/lib/services/InteropService.js:47
#, fuzzy
msgid "Evernote Export File (as Markdown)"
msgstr "Plik eksportu Evernote (jako Markdown)"
#: ReactNativeClient/lib/services/InteropService.js:55
#, fuzzy
msgid "Evernote Export File (as HTML)"
msgstr "Plik eksportu Evernote (jako HTML)"
@@ -3702,9 +3696,9 @@ msgid "Directory"
msgstr "Katalog"
#: ReactNativeClient/lib/services/InteropService.js:174
#, fuzzy, javascript-format
#, javascript-format
msgid "Cannot load \"%s\" module for format \"%s\" and output \"%s\""
msgstr "Nie można załadować modułu \"%s\" dla formatu \"%s\""
msgstr "Nie można załadować modułu \"%s\" dla formatu \"%s\" i wyniku \"%s\""
#: ReactNativeClient/lib/services/InteropService.js:232
#, javascript-format

View File

@@ -14,8 +14,10 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 2.3.1\n"
"X-Generator: Poedit 2.4.1\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
"POT-Creation-Date: \n"
"PO-Revision-Date: \n"
#: CliClient/app/command-cp.js:13
msgid ""
@@ -822,7 +824,7 @@ msgstr "Exportando para \"%s\" com o formato \"%s\". Por favor, aguarde..."
#: ElectronClient/InteropServiceHelper.js:164
#, javascript-format
msgid "Could not export notes: %s"
msgstr "Não foi possível exportar a nota: %s"
msgstr "Não foi possível exportar notas: %s"
#: ElectronClient/checkForUpdates.js:138
msgid "Current version is up-to-date."
@@ -932,9 +934,9 @@ msgid "Delete"
msgstr "Excluir"
#: ElectronClient/gui/SideBar/SideBar.min.js:276
#, fuzzy, javascript-format
#, javascript-format
msgid "Remove tag \"%s\" and its descendant tags from all notes?"
msgstr "Remover a tag \"%s\" de todas as notas?"
msgstr "Remover a tag \"%s\" e seus descendentes de todas as notas?"
#: ElectronClient/gui/SideBar/SideBar.min.js:278
#: ElectronClient/gui/SideBar.min.js:292
@@ -1837,7 +1839,7 @@ msgstr "Estatísticas"
#: ElectronClient/gui/NoteContentPropertiesDialog.js:111
#, javascript-format
msgid "Read time: %s min"
msgstr ""
msgstr "Tempo de leitura: %s min"
#: ElectronClient/gui/NoteContentPropertiesDialog.js:112
#: ElectronClient/gui/ShareNoteDialog.js:175
@@ -2214,7 +2216,7 @@ msgstr "Nível ID desconhecido: %s"
#: ReactNativeClient/lib/SyncTargetAmazonS3.js:28
msgid "AWS S3"
msgstr ""
msgstr "AWS S3"
#: ReactNativeClient/lib/SyncTargetDropbox.js:25
msgid "Dropbox"
@@ -2358,15 +2360,15 @@ msgstr "Senha do WebDAV"
#: ReactNativeClient/lib/models/Setting.js:189
msgid "AWS S3 bucket"
msgstr ""
msgstr "AWS S3 bucket"
#: ReactNativeClient/lib/models/Setting.js:200
msgid "AWS key"
msgstr ""
msgstr "AWS key"
#: ReactNativeClient/lib/models/Setting.js:210
msgid "AWS secret"
msgstr ""
msgstr "AWS secret"
#: ReactNativeClient/lib/models/Setting.js:224
msgid "Attachment download behaviour"
@@ -2609,12 +2611,12 @@ msgstr "Atualizar automaticamente o aplicativo"
#: ReactNativeClient/lib/models/Setting.js:596
msgid "Get pre-releases when checking for updates"
msgstr "Obter pre-releases quando for checar atualizações"
msgstr "Obter pre-lançamentos quando checar por atualizações"
#: ReactNativeClient/lib/models/Setting.js:596
#, javascript-format
msgid "See the pre-release page for more details: %s"
msgstr "Ver página de pre-release para mais detalhes: %s"
msgstr "Ver página de pre-lançamentos para mais detalhes: %s"
#: ReactNativeClient/lib/models/Setting.js:604
msgid "Synchronisation interval"
@@ -2697,7 +2699,7 @@ msgstr "Modo do Teclado"
#: ReactNativeClient/lib/models/Setting.js:650
msgid "Default"
msgstr "Default"
msgstr "Padrão"
#: ReactNativeClient/lib/models/Setting.js:651
msgid "Emacs"
@@ -2881,17 +2883,16 @@ msgstr ""
"%s"
#: ReactNativeClient/lib/models/Tag.js:384
#, fuzzy
msgid "Cannot move tag to this location."
msgstr "Não é possível mover a nota para este local"
msgstr "Não é possível mover a tag para este local"
#: ReactNativeClient/lib/models/Tag.js:429
msgid "Tag name cannot start or end with a `/`."
msgstr ""
msgstr "O nome da tag não pode começar ou terminar com `/`."
#: ReactNativeClient/lib/models/Tag.js:431
msgid "Tag name cannot contain `//`."
msgstr ""
msgstr "O nome da tag não pode conter `//`."
#: ReactNativeClient/lib/models/Tag.js:482
#, javascript-format
@@ -3514,7 +3515,6 @@ msgid "Forward"
msgstr "Encaminhar"
#: ReactNativeClient/lib/commands/synchronize.js:17
#, fuzzy
msgid "Synchronize"
msgstr "Sincronizar"

View File

@@ -13,17 +13,19 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 2.3\n"
"X-Generator: Poedit 2.3.1\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
"POT-Creation-Date: \n"
"PO-Revision-Date: \n"
#: CliClient/app/command-cp.js:13
msgid ""
"Duplicates the notes matching <note> to [notebook]. If no notebook is "
"specified the note is duplicated in the current notebook."
msgstr ""
"Дублирует заметки соответствующие выражению <note> в блокнот [notebook]. "
"Если блокнот не указан - заметки дублируются в текущем блокноте."
"Дублирует заметки, соответствующие выражению <note>, в блокнот [notebook]. "
"Если блокнот не указан, заметки дублируются в текущем блокноте."
#: CliClient/app/command-cp.js:24 CliClient/app/command-cp.js:27
#: CliClient/app/command-import.js:34 CliClient/app/command-mv.js:22
@@ -73,7 +75,7 @@ msgid ""
msgstr ""
"Отображает только элементы заданного типа(ов). Поддерживаемые типы: `n` для "
"заметок, `t` для задач или `nt` для заметок и задач (напр. `-tt` выведет "
"только задачи, в то время как `-ttd` выведет и заметки и задачи)."
"только задачи, в то время как `-ttd` выведет и заметки, и задачи)."
#: CliClient/app/command-ls.js:31
msgid "Either \"text\" or \"json\""
@@ -105,9 +107,9 @@ msgid "Do not ask for confirmation."
msgstr "Не запрашивать подтверждение."
#: CliClient/app/command-import.js:27
#, fuzzy, javascript-format
#, javascript-format
msgid "Output format: %s"
msgstr "Исходный формат: %s"
msgstr "Выходной формат: %s"
#: CliClient/app/command-import.js:47 ElectronClient/gui/ImportScreen.min.js:69
#, javascript-format
@@ -220,14 +222,16 @@ msgstr ""
"несколько минут в зависимости от объема данных."
#: CliClient/app/command-e2ee.js:53
#, fuzzy, javascript-format
#, javascript-format
msgid "Decrypted items: %d"
msgstr "Расшифрованные элементы: %s / %s"
msgstr "Расшифровано элементов: %d"
#: CliClient/app/command-e2ee.js:54
#, javascript-format
msgid "Skipped items: %d (use --retry-failed-items to retry decrypting them)"
msgstr ""
"Пропущено элементов: %d (используйте команду --retry-failed-items, чтобы "
"повторить попытку расшифровки)"
#: CliClient/app/command-e2ee.js:68
msgid "Completed decryption."
@@ -269,7 +273,7 @@ msgstr "Создает новый блокнот."
#: CliClient/app/command-mv.js:14
msgid "Moves the notes matching <note> to [notebook]."
msgstr ""
"Перемещает заметки соответствующие выражению <note> в блокнот [notebook]."
"Перемещает заметки, соответствующие выражению <note>, в блокнот [notebook]."
#: CliClient/app/command-config.js:13
msgid ""
@@ -278,12 +282,12 @@ msgid ""
"current configuration."
msgstr ""
"Выводит или задает значение параметра конфигурации. Если значение [value] не "
"указано - выведет текущее значение параметра [name]. Если не указаны ни имя "
"[name], ни значение [value] - выведет всю текущую конфигурацию."
"указано, выведет текущее значение параметра [name]. Если не указаны ни имя "
"[name], ни значение [value], выведет всю текущую конфигурацию."
#: CliClient/app/command-config.js:18
msgid "Also displays unset and hidden config variables."
msgstr "Также выводит не установленные и скрытые параметры конфигурации."
msgstr "Также выводит неустановленные и скрытые параметры конфигурации."
#: CliClient/app/command-config.js:79
#, javascript-format
@@ -360,7 +364,7 @@ msgid ""
"operation."
msgstr ""
"Файл блокировки уже существует. Если вы уверены, что синхронизация не "
"выполняется - вы можете вручную удалить файл блокировки \"%s\" и возобновить "
"выполняется, вы можете вручную удалить файл блокировки \"%s\" и возобновить "
"операцию."
#: CliClient/app/command-sync.js:175
@@ -551,13 +555,12 @@ msgid ""
msgstr ""
"Один или несколько элементов зашифрованы. Для расшифровки может "
"потребоваться мастер-пароль. Для начала расшифровки введите `e2ee decrypt`. "
"Если мастер-пароль уже был введен - зашифрованные элементы уже "
"Если мастер-пароль уже был введен, зашифрованные элементы уже "
"расшифровываются в фоновом режиме и вскоре будут доступны."
#: CliClient/app/gui/NoteWidget.js:50
#, fuzzy
msgid "You may also type `status` for more information."
msgstr "Не запрашивать подтверждение."
msgstr "Наберите `status` для получения дополнительной информации."
#: CliClient/app/gui/FolderListWidget.js:31
msgid "Search:"
@@ -644,7 +647,7 @@ msgid ""
msgstr ""
"В любой команде можно ссылаться на заметку или блокнот по названию или ID, "
"либо используя ярлыки `$n` или `$b`, указывающие на текущую заметку или "
"блокнот соответственно. С помощью `$c` можно ссылаться на текущий выбранный "
"блокнот, соответственно. С помощью `$c` можно ссылаться на текущий выбранный "
"элемент."
#: CliClient/app/command-help.js:79
@@ -661,7 +664,7 @@ msgstr ""
#: CliClient/app/command-help.js:81
msgid "To maximise/minimise the console, press \"tc\"."
msgstr "Чтобы развернуть/свернуть консоль используйте комбинацию \"tc\"."
msgstr "Чтобы развернуть/свернуть консоль, используйте комбинацию \"tc\"."
#: CliClient/app/command-help.js:82
msgid "To enter command line mode, press \":\""
@@ -675,7 +678,7 @@ msgstr "Для выхода из режима командной строки н
msgid ""
"For the list of keyboard shortcuts and config options, type `help keymap`"
msgstr ""
"Чтобы получить список сочетаний клавиш и настроек конфигурации введите `help "
"Чтобы получить список сочетаний клавиш и настроек конфигурации, введите `help "
"keymap`"
#: CliClient/app/command-todo.js:14
@@ -687,7 +690,7 @@ msgid ""
msgstr ""
"<todo-command> может принимать значения \"toggle\" или \"clear\". \"toggle\" "
"переключает статус выбранной задачи (с завершенной на незавершенную и "
"наоборот). При применении к обычной заметке - заметка преобразуется в "
"наоборот). При применении к обычной заметке она преобразуется в "
"задачу. \"clear\" преобразует выбранную задачу в обычную заметку."
#: CliClient/app/command-exit.js:11
@@ -739,6 +742,7 @@ msgstr "Выводит общую информацию о заметках и б
msgid ""
"To retry decryption of these items. Run `e2ee decrypt --retry-failed-items`"
msgstr ""
"Повторить попытку расшифровки элементов: `e2ee decrypt --retry-failed-items`"
#: CliClient/app/command-tag.js:14
msgid ""
@@ -811,12 +815,12 @@ msgid ""
"Type a note title or part of its content to jump to it. Or type # followed "
"by a tag name, or @ followed by a notebook name."
msgstr ""
"Введите название заметки чтобы перейти к ней, либо введите #имя_метки или "
"Введите название заметки, чтобы перейти к ней, либо введите #имя_метки или "
"@имя_блокнота."
#: ElectronClient/plugins/GotoAnything.min.js:493
msgid "Goto Anything..."
msgstr "Перейти к чему угодно…"
msgstr "Перейти к чему-либо…"
#: ElectronClient/InteropServiceHelper.js:147
#, javascript-format
@@ -824,9 +828,9 @@ msgid "Exporting to \"%s\" as \"%s\" format. Please wait..."
msgstr "Экспорт в \"%s\" в формате \"%s\". Пожалуйста, подождите..."
#: ElectronClient/InteropServiceHelper.js:164
#, fuzzy, javascript-format
#, javascript-format
msgid "Could not export notes: %s"
msgstr "Не удалось обновить мастер-ключ: %s"
msgstr "Не удалось экспортировать заметки: %s"
#: ElectronClient/checkForUpdates.js:138
msgid "Current version is up-to-date."
@@ -936,9 +940,9 @@ msgid "Delete"
msgstr "Удалить"
#: ElectronClient/gui/SideBar/SideBar.min.js:276
#, fuzzy, javascript-format
#, javascript-format
msgid "Remove tag \"%s\" and its descendant tags from all notes?"
msgstr "Удалить метку “%s” из всех заметок?"
msgstr "Удалить метку “%s” и её производные из всех заметок?"
#: ElectronClient/gui/SideBar/SideBar.min.js:278
#: ElectronClient/gui/SideBar.min.js:292
@@ -1068,9 +1072,8 @@ msgstr ""
"отредактировать ее."
#: ElectronClient/gui/NoteEditor/NoteBody/TinyMCE/plugins/lists.js:2151
#, fuzzy
msgid "Checkbox list"
msgstr "Флажок"
msgstr "Список флажков"
#: ElectronClient/gui/NoteEditor/NoteBody/TinyMCE/TinyMCE.js:470
#: ElectronClient/gui/ConfigScreen.min.js:642
@@ -1087,11 +1090,11 @@ msgstr "Прикрепить файл"
#: ElectronClient/gui/NoteEditor/NoteBody/TinyMCE/TinyMCE.js:535
msgid "Code Block"
msgstr ""
msgstr "Блок кода"
#: ElectronClient/gui/NoteEditor/NoteBody/TinyMCE/TinyMCE.js:544
msgid "Inline Code"
msgstr ""
msgstr "Инлайн код"
#: ElectronClient/gui/NoteEditor/NoteBody/TinyMCE/TinyMCE.js:559
#: ElectronClient/gui/NoteEditor/commands/editorCommandDeclarations.js:80
@@ -1101,13 +1104,12 @@ msgstr "Вставить дату и время"
#: ElectronClient/gui/NoteEditor/NoteBody/TinyMCE/TinyMCE.js:903
msgid "Drop notes or files here"
msgstr ""
msgstr "Перетащите сюда заметки или файлы"
#: ElectronClient/gui/NoteEditor/NoteBody/TinyMCE/TinyMCE.js:903
#: ElectronClient/gui/MainScreen/MainScreen.min.js:401
#, fuzzy
msgid "Code View"
msgstr "Код"
msgstr "Просмотр кода"
#: ElectronClient/gui/NoteEditor/NoteBody/TinyMCE/TinyMCE.js:903
#, javascript-format
@@ -1115,6 +1117,8 @@ msgid ""
"Please wait for all attachments to be downloaded and decrypted. You may also "
"switch to %s to edit the note."
msgstr ""
"Пожалуйста, дождитесь окончания загрузки и расшифровки всех вложений. Вы "
"можете переключиться на %s для редактирования заметки."
#: ElectronClient/gui/NoteEditor/utils/useMessageHandler.js:70
#: ElectronClient/gui/NoteText.min.js:833
@@ -1139,7 +1143,7 @@ msgstr "Сохранить как..."
#: ElectronClient/gui/NoteEditor/utils/contextMenu.js:65
msgid "Reveal file in folder"
msgstr ""
msgstr "Показать файл в папке"
#: ElectronClient/gui/NoteEditor/utils/contextMenu.js:73
#: ElectronClient/gui/NoteText.min.js:797
@@ -1214,7 +1218,7 @@ msgstr "Заголовок"
#: ElectronClient/gui/NoteEditor/commands/editorCommandDeclarations.js:75
#: ElectronClient/gui/NoteText.min.js:1770
msgid "Horizontal Rule"
msgstr "Горизотальный разделитель"
msgstr "Горизонтальный разделитель"
#: ElectronClient/gui/NoteEditor/commands/focusElementNoteTitle.js:15
msgid "Note title"
@@ -1318,7 +1322,7 @@ msgstr "Поиск..."
#: ElectronClient/gui/MainScreen/commands/showNoteContentProperties.js:16
msgid "Statistics..."
msgstr ""
msgstr "Статистика..."
#: ElectronClient/gui/MainScreen/commands/renameFolder.js:17
#: ElectronClient/gui/MainScreen/commands/renameTag.js:17
@@ -1375,15 +1379,13 @@ msgid "New note"
msgstr "Новая заметка"
#: ElectronClient/gui/MainScreen/commands/moveToFolder.js:17
#, fuzzy
msgid "Move to notebook"
msgstr "Переместить в блокнот..."
msgstr "Переместить в блокнот"
#: ElectronClient/gui/MainScreen/commands/moveToFolder.js:36
#: ElectronClient/gui/MainScreen.min.js:272
#, fuzzy
msgid "Move to notebook:"
msgstr "Переместить в блокнот..."
msgstr "Переместить в блокнот:"
#: ElectronClient/gui/MainScreen/commands/toggleVisiblePanes.js:15
msgid "Toggle editor layout"
@@ -1544,9 +1546,8 @@ msgid "Options"
msgstr "Настройки"
#: ElectronClient/gui/Root.min.js:93
#, fuzzy
msgid "Note attachments"
msgstr "Вложения"
msgstr "Вложения заметки"
#: ElectronClient/gui/Root.min.js:94 ElectronClient/app.js:500
msgid "Synchronisation Status"
@@ -1579,13 +1580,12 @@ msgstr "Отправить"
#: ElectronClient/gui/NoteList.min.js:147
#: ElectronClient/gui/NoteList/NoteList.min.js:152
msgid "Custom order"
msgstr ""
msgstr "Пользовательский порядок"
#: ElectronClient/gui/NoteList.min.js:147
#: ElectronClient/gui/NoteList/NoteList.min.js:152
#, fuzzy
msgid "View"
msgstr "&Вид"
msgstr "Вид"
#: ElectronClient/gui/NoteList.min.js:147
#: ElectronClient/gui/NoteList/NoteList.min.js:152
@@ -1600,12 +1600,13 @@ msgid ""
"To manually sort the notes, the sort order must be changed to \"%s\" in the "
"menu \"%s\" > \"%s\""
msgstr ""
"Для сортировки заметок вручную порядок должен быть изменён на \"%s\" в меню "
"\"%s\" > \"%s\""
#: ElectronClient/gui/NoteList.min.js:148
#: ElectronClient/gui/NoteList/NoteList.min.js:153
#, fuzzy
msgid "Do it now"
msgstr "Загрузить сейчас:"
msgstr "Загрузить сейчас"
#: ElectronClient/gui/NoteList.min.js:452
#: ElectronClient/gui/NoteList/NoteList.min.js:425
@@ -1761,7 +1762,7 @@ msgstr ""
"\n"
"1. Синхронизируйте все ваши устройства.\n"
"2. Нажмите “%s”.\n"
"3. Ждите завершения. Во время работы избегайте изменения заметок на других "
"3. Ждите завершения. Во время работы не изменяйте заметки на других "
"устройствах, чтобы избежать конфликтов.\n"
"4. После завершения синхронизации на этом устройстве синхронизируйте все "
"остальные устройства и ждите завершения.\n"
@@ -1781,13 +1782,12 @@ msgstr "Шифрование:"
#: ElectronClient/gui/StatusScreen.min.js:33
msgid "Please select where the sync status should be exported to"
msgstr ""
"Пожалуйста, выберите куда должен быть экспортирован статус синхронизации"
"Пожалуйста, выберите, куда должен быть экспортирован статус синхронизации"
#: ElectronClient/gui/StatusScreen.min.js:71
#: ReactNativeClient/lib/components/screens/status.js:112
#, fuzzy
msgid "Retry All"
msgstr "Повторить попытку"
msgstr "Повторить попытку для всех"
#: ElectronClient/gui/StatusScreen.min.js:96
#: ReactNativeClient/lib/components/screens/status.js:118
@@ -1837,14 +1837,13 @@ msgid "Viewer"
msgstr "Просмотрщик"
#: ElectronClient/gui/NoteContentPropertiesDialog.js:107
#, fuzzy
msgid "Statistics"
msgstr "Статус"
msgstr "Статистика"
#: ElectronClient/gui/NoteContentPropertiesDialog.js:111
#, javascript-format
msgid "Read time: %s min"
msgstr ""
msgstr "Продолжительность чтения: %s мин"
#: ElectronClient/gui/NoteContentPropertiesDialog.js:112
#: ElectronClient/gui/ShareNoteDialog.js:175
@@ -1942,9 +1941,9 @@ msgid "Untitled"
msgstr "Без имени"
#: ElectronClient/gui/ResourceScreen.js:93
#, fuzzy, javascript-format
#, javascript-format
msgid "Delete attachment \"%s\"?"
msgstr "Удалить заметку \"%s\"?"
msgstr "Удалить вложение \"%s\"?"
#: ElectronClient/gui/ResourceScreen.js:139
msgid ""
@@ -1952,6 +1951,9 @@ msgid ""
"notes. Please be careful when deleting one of them as they cannot be "
"restored afterwards."
msgstr ""
"Это продвинутый инструмент для отображения вложений, прикреплённых к вашим "
"заметкам. Удаляйте вложения с осторожностью - они не могут быть "
"восстановлены."
#: ElectronClient/gui/ResourceScreen.js:140
msgid "Please wait..."
@@ -2040,9 +2042,8 @@ msgid "Refresh templates"
msgstr "Обновить шаблоны"
#: ElectronClient/app.js:574
#, fuzzy
msgid "Note attachments..."
msgstr "Вложения"
msgstr "Вложения..."
#: ElectronClient/app.js:596
#, javascript-format
@@ -2072,7 +2073,7 @@ msgstr "Версия профиля: %s"
#: ElectronClient/app.js:608
#, javascript-format
msgid "Keychain Supported: %s"
msgstr ""
msgstr "Поддерживаемая связка ключей: %s"
#: ElectronClient/app.js:630 ElectronClient/app.js:706
msgid "&File"
@@ -2136,9 +2137,8 @@ msgid "Zoom Out"
msgstr "Отдалить"
#: ElectronClient/app.js:860
#, fuzzy
msgid "&Note"
msgstr "Заметки"
msgstr "&Заметки"
#: ElectronClient/app.js:870
msgid "&Tools"
@@ -2194,7 +2194,7 @@ msgstr ""
"Откройте следующую ссылку в вашем браузере для аутентификации приложения. "
"Приложением будет создан отдельный каталог \"Apps/Joplin\", в котором будет "
"происходить работа с файлами. У приложения не будет доступа ни к каким-либо "
"файлам за пределами этого каталога ни к каким-либо другим личным данным. "
"файлам за пределами этого каталога, ни к каким-либо другим личным данным. "
"Никакая информация не будет передана третьим лицам."
#: ReactNativeClient/lib/registry.js:156
@@ -2226,7 +2226,7 @@ msgstr "Неизвестный уровень ID: %s"
#: ReactNativeClient/lib/SyncTargetAmazonS3.js:28
msgid "AWS S3"
msgstr ""
msgstr "AWS S3"
#: ReactNativeClient/lib/SyncTargetDropbox.js:25
msgid "Dropbox"
@@ -2239,6 +2239,8 @@ msgid ""
"You are about to attach a large image (%dx%d pixels). Would you like to "
"resize it down to %d pixels before attaching it?"
msgstr ""
"Вы собираетесь прикрепить крупное изображение (%dx%d пикселей). Вы хотите "
"сжать его до %d пикселей перед прикреплением?"
#: ReactNativeClient/lib/shim-init-node.js:156
#, javascript-format
@@ -2261,7 +2263,7 @@ msgstr "Конфликты"
#: ReactNativeClient/lib/models/Folder.js:374
msgid "Cannot move notebook to this location"
msgstr "Не удается переместить блокнот в указанное местоположение"
msgstr "Не удается переместить блокнот в указанное расположение"
#: ReactNativeClient/lib/models/Folder.js:426
#, javascript-format
@@ -2270,20 +2272,18 @@ msgstr ""
"Блокнот не может быть назван \"%s\", так как это зарезервированное название."
#: ReactNativeClient/lib/models/Setting.js:39
#, fuzzy
msgid "yes"
msgstr "Да"
msgstr "да"
#: ReactNativeClient/lib/models/Setting.js:39
#: ReactNativeClient/lib/models/Setting.js:40
#, javascript-format
msgid "(wysiwyg: %s)"
msgstr ""
msgstr "(wysiwyg: %s)"
#: ReactNativeClient/lib/models/Setting.js:40
#, fuzzy
msgid "no"
msgstr "n"
msgstr "нет"
#: ReactNativeClient/lib/models/Setting.js:43
#, javascript-format
@@ -2311,11 +2311,11 @@ msgstr "Дракула"
#: ReactNativeClient/lib/models/Setting.js:54
msgid "Solarised Light"
msgstr "Ярко-светлая"
msgstr "Солнечная светлая"
#: ReactNativeClient/lib/models/Setting.js:55
msgid "Solarised Dark"
msgstr "Ярко-тёмная"
msgstr "Солнечная тёмная"
#: ReactNativeClient/lib/models/Setting.js:56
msgid "Nord"
@@ -2323,7 +2323,7 @@ msgstr "Север"
#: ReactNativeClient/lib/models/Setting.js:57
msgid "Aritim Dark"
msgstr ""
msgstr "Aritim тёмная"
#: ReactNativeClient/lib/models/Setting.js:58
msgid "OLED Dark"
@@ -2371,15 +2371,15 @@ msgstr "Пароль WebDAV"
#: ReactNativeClient/lib/models/Setting.js:189
msgid "AWS S3 bucket"
msgstr ""
msgstr "AWS S3 bucket"
#: ReactNativeClient/lib/models/Setting.js:200
msgid "AWS key"
msgstr ""
msgstr "Ключ AWS"
#: ReactNativeClient/lib/models/Setting.js:210
msgid "AWS secret"
msgstr ""
msgstr "Секрет AWS"
#: ReactNativeClient/lib/models/Setting.js:224
msgid "Attachment download behaviour"
@@ -2391,9 +2391,9 @@ msgid ""
"In \"Auto\", they are downloaded when you open the note. In \"Always\", all "
"the attachments are downloaded whether you open the note or not."
msgstr ""
"В режиме “Ручной” вложения загружаются толко если на них кликнуть. В режиме "
"В режиме “Ручной” вложения загружаются, только если на них кликнуть. В режиме "
"“Автоматически” вложения загружаются при открытии заметки. В режиме “Всегда” "
"вложения загружаются не зависимо от того была заметка открыта или нет."
"вложения загружаются вне зависимости от того, была заметка открыта или нет."
#: ReactNativeClient/lib/models/Setting.js:228
msgid "Always"
@@ -2429,15 +2429,15 @@ msgstr "Тема"
#: ReactNativeClient/lib/models/Setting.js:315
msgid "Automatically switch theme to match system theme"
msgstr ""
msgstr "Автоматическая смена темы в соответствии с настройками системы"
#: ReactNativeClient/lib/models/Setting.js:327
msgid "Preferred light theme"
msgstr ""
msgstr "Предпочитаемая светлая тема"
#: ReactNativeClient/lib/models/Setting.js:341
msgid "Preferred dark theme"
msgstr ""
msgstr "Предпочитаемая тёмная тема"
#: ReactNativeClient/lib/models/Setting.js:346
msgid "Show note counts"
@@ -2475,7 +2475,7 @@ msgstr "Автоматическое закрытие скобок, кавыче
#: ReactNativeClient/lib/models/Setting.js:395
msgid "Use CodeMirror as the code editor (WARNING: BETA)."
msgstr ""
msgstr "Использовать CodeMirror в качестве редактора кода (ВНИМАНИЕ: BETA)."
#: ReactNativeClient/lib/models/Setting.js:397
#: ReactNativeClient/lib/models/Setting.js:415
@@ -2525,9 +2525,8 @@ msgid "Enable Fountain syntax support"
msgstr "Включить поддержку синтаксиса Fountain"
#: ReactNativeClient/lib/models/Setting.js:468
#, fuzzy
msgid "Enable Mermaid diagrams support"
msgstr "Включить поддержку Mermaid диаграм"
msgstr "Включить поддержку диаграмм Mermaid"
#: ReactNativeClient/lib/models/Setting.js:470
msgid "Enable ==mark== syntax"
@@ -2604,15 +2603,14 @@ msgid "Editor font family"
msgstr "Семейство шрифтов редактора"
#: ReactNativeClient/lib/models/Setting.js:550
#, fuzzy
msgid ""
"This should be a *monospace* font or some elements will render incorrectly. "
"If the font is incorrect or empty, it will default to a generic monospace "
"font."
msgstr ""
"Для корректной работы должно быть указано название *моноширинного* шрифта. "
"Если название шрифта не указано или указано некорректно - будет использован "
"шрифт по умолчанию."
"Для корректного отображения требуется задать *моноширинный* шрифт. Если "
"шрифт не был задан или выбран некорректный шрифт, будет использован шрифт по "
"умолчанию."
#: ReactNativeClient/lib/models/Setting.js:589
msgid "Custom stylesheet for Joplin-wide app styles"
@@ -2665,7 +2663,7 @@ msgid ""
"If none is provided it will try to auto-detect the default editor."
msgstr ""
"Команда запуска внешнего текстового редактора (может включать аргументы "
"командной строки). Если команда не задана - будет произведена попытка "
"командной строки). Если команда не задана, будет произведена попытка "
"автоматического определения редактора по умолчанию."
#: ReactNativeClient/lib/models/Setting.js:623
@@ -2678,7 +2676,7 @@ msgstr "A4"
#: ReactNativeClient/lib/models/Setting.js:626
msgid "Letter"
msgstr "Letter"
msgstr "Письмо"
#: ReactNativeClient/lib/models/Setting.js:627
msgid "A3"
@@ -2694,7 +2692,7 @@ msgstr "Tabloid"
#: ReactNativeClient/lib/models/Setting.js:630
msgid "Legal"
msgstr "Legal"
msgstr "Юр. сведения"
#: ReactNativeClient/lib/models/Setting.js:633
msgid "Page orientation for PDF export"
@@ -2736,7 +2734,7 @@ msgid ""
"changes before clicking on \"Check synchronisation configuration\"."
msgstr ""
"Разделенный запятыми список путей к файлам сертификатов (поддерживаются как "
"каталоги так и абсолютные пути к отдельным файлам). Например: /my/cert_dir, /"
"каталоги, так и абсолютные пути к отдельным файлам). Например: /my/cert_dir, /"
"other/custom.pem. Обратите внимание, что если вы вносите изменения в "
"настройки TLS, вы должны сохранить внесенные изменения перед нажатием на "
"\"Проверить настройки синхронизации\"."
@@ -2747,7 +2745,7 @@ msgstr "Игнорировать ошибки сертификата TLS"
#: ReactNativeClient/lib/models/Setting.js:689
msgid "Fail-safe"
msgstr ""
msgstr "Режим защиты от сбоев"
#: ReactNativeClient/lib/models/Setting.js:690
msgid ""
@@ -2784,7 +2782,7 @@ msgstr "Хранить историю заметки"
#: ReactNativeClient/lib/models/Setting.js:741
msgid "Notebook list growth factor"
msgstr ""
msgstr "Фактор роста списка блокнотов"
#: ReactNativeClient/lib/models/Setting.js:743
#: ReactNativeClient/lib/models/Setting.js:756
@@ -2795,14 +2793,18 @@ msgid ""
"item with a factor of 2 will take twice as much space as an item with a "
"factor of 1.Restart app to see changes."
msgstr ""
"Параметр \"фактор\" отвечает за то, как элемент будет расти или уменьшаться, "
"чтобы поместиться в свободное пространство контейнера. Элемент с фактором 2 "
"займёт в 2 раза больше места, чем элемент с фактором 1. Перезапустите "
"приложение, чтобы изменения вступили в силу."
#: ReactNativeClient/lib/models/Setting.js:754
msgid "Note list growth factor"
msgstr ""
msgstr "Фактор роста списка заметки"
#: ReactNativeClient/lib/models/Setting.js:767
msgid "Note area growth factor"
msgstr ""
msgstr "Фактор роста поля заметки"
#: ReactNativeClient/lib/models/Setting.js:919
#, javascript-format
@@ -2851,6 +2853,12 @@ msgid ""
"formatting. It is indicated below which plugins are compatible or not with "
"the WYSIWYG editor."
msgstr ""
"Данные плагины расширяют отрисовщик Markdown доп. функциями. Учтите, что эти "
"функции не являются стандартными для Markdown и большинство из них будет "
"работать только в Joplin. Кроме того, некоторые из них *несовместимы* с "
"редактором WYSIWYG. При открытии заметки с такими плагинами в WYSIWYG "
"форматирование будет утеряно. Ниже отмечены плагины, совместимые с "
"редактором WYSIWYG."
#: ReactNativeClient/lib/models/Setting.js:1261
#, javascript-format
@@ -2870,30 +2878,32 @@ msgid "Downloaded"
msgstr "Загружено"
#: ReactNativeClient/lib/models/Resource.js:371
#, fuzzy, javascript-format
#, javascript-format
msgid "Attachment conflict: \"%s\""
msgstr "Вложения"
msgstr "Конфликт вложения: \"%s\""
#: ReactNativeClient/lib/models/Resource.js:372
#, fuzzy, javascript-format
#, javascript-format
msgid ""
"There was a [conflict](%s) on the attachment below.\n"
"\n"
"%s"
msgstr "Произошла ошибка при загрузке вложения:"
msgstr ""
"[Конфликт](%s) При загрузке вложения.\n"
"\n"
"%s"
#: ReactNativeClient/lib/models/Tag.js:384
#, fuzzy
msgid "Cannot move tag to this location."
msgstr "Не удается переместить блокнот в указанное местоположение"
msgstr "Не удается переместить метку в указанное расположение."
#: ReactNativeClient/lib/models/Tag.js:429
msgid "Tag name cannot start or end with a `/`."
msgstr ""
msgstr "Название тега не может начинаться или оканчиваться на `/`."
#: ReactNativeClient/lib/models/Tag.js:431
msgid "Tag name cannot contain `//`."
msgstr ""
msgstr "Название тега не может содержать `//`."
#: ReactNativeClient/lib/models/Tag.js:482
#, javascript-format
@@ -2906,7 +2916,7 @@ msgstr "дата создания"
#: ReactNativeClient/lib/models/Note.js:28
msgid "custom order"
msgstr ""
msgstr "пользовательский порядок"
#: ReactNativeClient/lib/models/Note.js:92
msgid "This note does not have geolocation information."
@@ -3093,7 +3103,7 @@ msgstr "Не удалось обновить мастер-ключ: %s"
#: ReactNativeClient/lib/components/shared/encryption-config-shared.js:110
#, javascript-format
msgid "Decrypted items: %s / %s"
msgstr "Расшифрованные элементы: %s / %s"
msgstr "Расшифровано элементов: %s / %s"
#: ReactNativeClient/lib/components/screens/folder.js:87
#, javascript-format
@@ -3225,7 +3235,7 @@ msgstr "Только ошибки"
#: ReactNativeClient/lib/components/screens/config.js:50
msgid "Warning"
msgstr "Предупрежение"
msgstr "Предупреждение"
#: ReactNativeClient/lib/components/screens/config.js:50
msgid ""
@@ -3253,7 +3263,7 @@ msgstr "Экспортировать отладочный отчет"
#: ReactNativeClient/lib/components/screens/config.js:443
msgid "Fixing search index..."
msgstr "Исправление индекса поиска"
msgstr "Исправление индекса поиска..."
#: ReactNativeClient/lib/components/screens/config.js:443
msgid "Fix search index"
@@ -3516,7 +3526,7 @@ msgstr "Файловая система"
#: ReactNativeClient/lib/commands/historyForward.js:16
msgid "Forward"
msgstr ""
msgstr "Вперёд"
#: ReactNativeClient/lib/commands/synchronize.js:17
#, fuzzy
@@ -3734,7 +3744,7 @@ msgstr ""
#~ "to continue?"
#~ msgstr ""
#~ "Отключение шифрования означает, что *все* ваши заметки и вложения будут "
#~ "расшифрованы и отправлены в незашифрованом виде к цели синхронизации. Вы "
#~ "расшифрованы и отправлены в незашифрованном виде к цели синхронизации. Вы "
#~ "хотите продолжить?"
#~ msgid "Master Keys"

View File

@@ -14,7 +14,9 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 2.3.1\n"
"X-Generator: Poedit 2.4.1\n"
"POT-Creation-Date: \n"
"PO-Revision-Date: \n"
#: CliClient/app/command-cp.js:13
msgid ""
@@ -2221,7 +2223,7 @@ msgstr "Bilinmeyen ID seviyesi: %s"
#: ReactNativeClient/lib/SyncTargetAmazonS3.js:28
msgid "AWS S3"
msgstr ""
msgstr "AWS S3"
#: ReactNativeClient/lib/SyncTargetDropbox.js:25
msgid "Dropbox"
@@ -2364,15 +2366,15 @@ msgstr "WebDAV şifresi"
#: ReactNativeClient/lib/models/Setting.js:189
msgid "AWS S3 bucket"
msgstr ""
msgstr "AWS S3 deposu"
#: ReactNativeClient/lib/models/Setting.js:200
msgid "AWS key"
msgstr ""
msgstr "AWS anahtarı"
#: ReactNativeClient/lib/models/Setting.js:210
msgid "AWS secret"
msgstr ""
msgstr "AWS gizli anahtarı"
#: ReactNativeClient/lib/models/Setting.js:224
msgid "Attachment download behaviour"

View File

@@ -1,6 +1,6 @@
{
"name": "joplin",
"version": "1.0.165",
"version": "1.0.167",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
@@ -69,14 +69,6 @@
"json-schema-traverse": "^0.3.0"
}
},
"ansi-align": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz",
"integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=",
"requires": {
"string-width": "^2.0.0"
}
},
"ansi-colors": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz",
@@ -551,20 +543,6 @@
}
}
},
"boxen": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz",
"integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==",
"requires": {
"ansi-align": "^2.0.0",
"camelcase": "^4.0.0",
"chalk": "^2.0.1",
"cli-boxes": "^1.0.0",
"string-width": "^2.0.0",
"term-size": "^1.2.0",
"widest-line": "^2.0.0"
}
},
"brace-expansion": {
"version": "1.1.8",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz",
@@ -658,11 +636,6 @@
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
"integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0="
},
"capture-stack-trace": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz",
"integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw=="
},
"caseless": {
"version": "0.12.0",
"resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
@@ -800,9 +773,9 @@
}
},
"minimist": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
"integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
"version": "1.2.5",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
"integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
},
"readable-stream": {
"version": "3.6.0",
@@ -829,11 +802,6 @@
}
}
},
"cli-boxes": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz",
"integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM="
},
"cliss": {
"version": "0.0.2",
"resolved": "https://registry.npmjs.org/cliss/-/cliss-0.0.2.tgz",
@@ -1096,19 +1064,6 @@
"typedarray": "^0.0.6"
}
},
"configstore": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz",
"integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==",
"requires": {
"dot-prop": "^4.1.0",
"graceful-fs": "^4.1.2",
"make-dir": "^1.0.0",
"unique-string": "^1.0.0",
"write-file-atomic": "^2.0.0",
"xdg-basedir": "^3.0.0"
}
},
"console-control-strings": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
@@ -1143,14 +1098,6 @@
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
},
"create-error-class": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz",
"integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=",
"requires": {
"capture-stack-trace": "^1.0.0"
}
},
"cross-spawn": {
"version": "6.0.5",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
@@ -1175,11 +1122,6 @@
"resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz",
"integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs="
},
"crypto-random-string": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz",
"integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4="
},
"css": {
"version": "2.2.4",
"resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz",
@@ -1448,19 +1390,6 @@
"domhandler": "^3.0.0"
}
},
"dot-prop": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz",
"integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==",
"requires": {
"is-obj": "^1.0.0"
}
},
"duplexer3": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
"integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI="
},
"duplexify": {
"version": "3.7.1",
"resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz",
@@ -1676,32 +1605,6 @@
"resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz",
"integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ="
},
"execa": {
"version": "0.7.0",
"resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz",
"integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=",
"requires": {
"cross-spawn": "^5.0.1",
"get-stream": "^3.0.0",
"is-stream": "^1.1.0",
"npm-run-path": "^2.0.0",
"p-finally": "^1.0.0",
"signal-exit": "^3.0.0",
"strip-eof": "^1.0.0"
},
"dependencies": {
"cross-spawn": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
"integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
"requires": {
"lru-cache": "^4.0.1",
"shebang-command": "^1.2.0",
"which": "^1.2.9"
}
}
}
},
"expand-brackets": {
"version": "2.1.4",
"resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
@@ -2766,11 +2669,6 @@
"resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz",
"integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g="
},
"get-stream": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
"integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ="
},
"get-value": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
@@ -2855,14 +2753,6 @@
"object.defaults": "^1.1.0"
}
},
"global-dirs": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz",
"integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=",
"requires": {
"ini": "^1.3.4"
}
},
"global-modules": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz",
@@ -2912,24 +2802,6 @@
"sparkles": "^1.0.0"
}
},
"got": {
"version": "6.7.1",
"resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz",
"integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=",
"requires": {
"create-error-class": "^3.0.0",
"duplexer3": "^0.1.4",
"get-stream": "^3.0.0",
"is-redirect": "^1.0.0",
"is-retry-allowed": "^1.0.0",
"is-stream": "^1.0.0",
"lowercase-keys": "^1.0.0",
"safe-buffer": "^5.0.1",
"timed-out": "^4.0.0",
"unzip-response": "^2.0.1",
"url-parse-lax": "^1.0.0"
}
},
"graceful-fs": {
"version": "4.1.11",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
@@ -3350,16 +3222,6 @@
"file-type": "^4.1.0"
}
},
"import-lazy": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz",
"integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM="
},
"imurmurhash": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
"integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o="
},
"inflight": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
@@ -3604,6 +3466,11 @@
}
}
},
"is-docker": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.0.0.tgz",
"integrity": "sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ=="
},
"is-extendable": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
@@ -3629,26 +3496,12 @@
"is-extglob": "^2.1.1"
}
},
"is-installed-globally": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz",
"integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=",
"requires": {
"global-dirs": "^0.1.0",
"is-path-inside": "^1.0.0"
}
},
"is-negated-glob": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz",
"integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=",
"dev": true
},
"is-npm": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz",
"integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ="
},
"is-number": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
@@ -3667,19 +3520,6 @@
}
}
},
"is-obj": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
"integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8="
},
"is-path-inside": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz",
"integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=",
"requires": {
"path-is-inside": "^1.0.1"
}
},
"is-plain-object": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
@@ -3688,11 +3528,6 @@
"isobject": "^3.0.1"
}
},
"is-redirect": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz",
"integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ="
},
"is-relative": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/is-relative/-/is-relative-0.2.1.tgz",
@@ -3701,11 +3536,6 @@
"is-unc-path": "^0.1.1"
}
},
"is-retry-allowed": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz",
"integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg=="
},
"is-stream": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
@@ -3741,6 +3571,14 @@
"resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz",
"integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw="
},
"is-wsl": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
"integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
"requires": {
"is-docker": "^2.0.0"
}
},
"is2": {
"version": "0.0.9",
"resolved": "https://registry.npmjs.org/is2/-/is2-0.0.9.tgz",
@@ -3922,9 +3760,9 @@
"dev": true
},
"katex": {
"version": "0.11.1",
"resolved": "https://registry.npmjs.org/katex/-/katex-0.11.1.tgz",
"integrity": "sha512-5oANDICCTX0NqYIyAiFCCwjQ7ERu3DQG2JFHLbYOf+fXaMoH8eg/zOq5WSYJsKMi/QebW+Eh3gSM+oss1H/bww==",
"version": "0.12.0",
"resolved": "https://registry.npmjs.org/katex/-/katex-0.12.0.tgz",
"integrity": "sha512-y+8btoc/CK70XqcHqjxiGWBOeIL8upbS0peTPXTvgrh21n1RiWWcIpSWM+4uXq+IAgNh9YYQWdc7LVDPDAEEAg==",
"requires": {
"commander": "^2.19.0"
},
@@ -3945,10 +3783,37 @@
"prebuild-install": "5.3.3"
},
"dependencies": {
"minimist": {
"version": "1.2.5",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
"integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
},
"nan": {
"version": "2.14.1",
"resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz",
"integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw=="
},
"prebuild-install": {
"version": "5.3.3",
"resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.3.3.tgz",
"integrity": "sha512-GV+nsUXuPW2p8Zy7SarF/2W/oiK8bFQgJcncoJ0d7kRpekEA0ftChjfEaF9/Y+QJEc/wFR7RAEa8lYByuUIe2g==",
"requires": {
"detect-libc": "^1.0.3",
"expand-template": "^2.0.3",
"github-from-package": "0.0.0",
"minimist": "^1.2.0",
"mkdirp": "^0.5.1",
"napi-build-utils": "^1.0.1",
"node-abi": "^2.7.0",
"noop-logger": "^0.1.1",
"npmlog": "^4.0.1",
"pump": "^3.0.0",
"rc": "^1.2.7",
"simple-get": "^3.0.3",
"tar-fs": "^2.0.0",
"tunnel-agent": "^0.6.0",
"which-pm-runs": "^1.0.0"
}
}
}
},
@@ -3983,14 +3848,6 @@
"es6-weak-map": "^2.0.1"
}
},
"latest-version": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz",
"integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=",
"requires": {
"package-json": "^4.0.0"
}
},
"lazyness": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/lazyness/-/lazyness-1.1.1.tgz",
@@ -4092,9 +3949,9 @@
}
},
"lodash": {
"version": "4.17.15",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
"integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A=="
"version": "4.17.19",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz",
"integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ=="
},
"lodash-es": {
"version": "4.17.4",
@@ -4134,11 +3991,6 @@
"resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz",
"integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw="
},
"lowercase-keys": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
"integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA=="
},
"lowlight": {
"version": "1.9.2",
"resolved": "https://registry.npmjs.org/lowlight/-/lowlight-1.9.2.tgz",
@@ -4155,22 +4007,6 @@
}
}
},
"lru-cache": {
"version": "4.1.5",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
"integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
"requires": {
"pseudomap": "^1.0.2",
"yallist": "^2.1.2"
},
"dependencies": {
"yallist": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
"integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI="
}
}
},
"magicli": {
"version": "0.0.8",
"resolved": "https://registry.npmjs.org/magicli/-/magicli-0.0.8.tgz",
@@ -4182,14 +4018,6 @@
"inspect-property": "0.0.6"
}
},
"make-dir": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz",
"integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==",
"requires": {
"pify": "^3.0.0"
}
},
"make-iterator": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz",
@@ -4422,11 +4250,6 @@
"brace-expansion": "^1.1.7"
}
},
"minimist": {
"version": "0.0.8",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
"integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
},
"minipass": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/minipass/-/minipass-2.2.1.tgz",
@@ -4463,13 +4286,25 @@
}
},
"mkdirp": {
"version": "0.5.1",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
"integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
"version": "0.5.5",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
"integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
"requires": {
"minimist": "0.0.8"
"minimist": "^1.2.5"
},
"dependencies": {
"minimist": {
"version": "1.2.5",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
"integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
}
}
},
"mkdirp-classic": {
"version": "0.5.3",
"resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
"integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A=="
},
"moment": {
"version": "2.24.0",
"resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz",
@@ -4729,14 +4564,6 @@
"npm-bundled": "^1.0.1"
}
},
"npm-run-path": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
"integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
"requires": {
"path-key": "^2.0.0"
}
},
"npmlog": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
@@ -4911,6 +4738,15 @@
"wrappy": "1"
}
},
"open": {
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/open/-/open-7.1.0.tgz",
"integrity": "sha512-lLPI5KgOwEYCDKXf4np7y1PBEkj7HYIyP2DY8mVDRnx0VIIu6bNrRB0R66TuO7Mack6EnTNLm4uvcl1UoklTpA==",
"requires": {
"is-docker": "^2.0.0",
"is-wsl": "^2.1.1"
}
},
"optionator": {
"version": "0.8.3",
"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
@@ -4968,11 +4804,6 @@
"os-tmpdir": "^1.0.0"
}
},
"p-finally": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
"integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4="
},
"p-limit": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
@@ -4994,17 +4825,6 @@
"resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
"integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M="
},
"package-json": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz",
"integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=",
"requires": {
"got": "^6.7.1",
"registry-auth-token": "^3.0.1",
"registry-url": "^3.0.3",
"semver": "^5.1.0"
}
},
"param-case": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz",
@@ -5092,9 +4912,9 @@
"integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ="
},
"patch-package": {
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/patch-package/-/patch-package-6.2.0.tgz",
"integrity": "sha512-HWlQflaBBMjLBfOWomfolF8aqsFDeNbSNro1JDUgYqnVvPM5OILJ9DQdwIRiKmGaOsmHvhkl1FYkvv1I9r2ZJw==",
"version": "6.2.2",
"resolved": "https://registry.npmjs.org/patch-package/-/patch-package-6.2.2.tgz",
"integrity": "sha512-YqScVYkVcClUY0v8fF0kWOjDYopzIM8e3bj/RU1DPeEF14+dCGm6UeOYm4jvCyxqIEQ5/eJzmbWfDWnUleFNMg==",
"requires": {
"@yarnpkg/lockfile": "^1.1.0",
"chalk": "^2.4.2",
@@ -5107,8 +4927,7 @@
"rimraf": "^2.6.3",
"semver": "^5.6.0",
"slash": "^2.0.0",
"tmp": "^0.0.33",
"update-notifier": "^2.5.0"
"tmp": "^0.0.33"
},
"dependencies": {
"chalk": {
@@ -5145,9 +4964,9 @@
}
},
"minimist": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
"integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
"version": "1.2.5",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
"integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
},
"rimraf": {
"version": "2.7.1",
@@ -5180,11 +4999,6 @@
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
},
"path-is-inside": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
"integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM="
},
"path-key": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
@@ -5281,14 +5095,14 @@
"integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs="
},
"prebuild-install": {
"version": "5.3.3",
"resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.3.3.tgz",
"integrity": "sha512-GV+nsUXuPW2p8Zy7SarF/2W/oiK8bFQgJcncoJ0d7kRpekEA0ftChjfEaF9/Y+QJEc/wFR7RAEa8lYByuUIe2g==",
"version": "5.3.5",
"resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.3.5.tgz",
"integrity": "sha512-YmMO7dph9CYKi5IR/BzjOJlRzpxGGVo1EsLSUZ0mt/Mq0HWZIHOKHHcHdT69yG54C9m6i45GpItwRHpk0Py7Uw==",
"requires": {
"detect-libc": "^1.0.3",
"expand-template": "^2.0.3",
"github-from-package": "0.0.0",
"minimist": "^1.2.0",
"minimist": "^1.2.3",
"mkdirp": "^0.5.1",
"napi-build-utils": "^1.0.1",
"node-abi": "^2.7.0",
@@ -5303,9 +5117,9 @@
},
"dependencies": {
"minimist": {
"version": "1.2.0",
"resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
"integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
"version": "1.2.5",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
"integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
}
}
},
@@ -5314,11 +5128,6 @@
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
"integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ="
},
"prepend-http": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz",
"integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw="
},
"pretty-hrtime": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz",
@@ -5347,11 +5156,6 @@
"retry": "^0.10.0"
}
},
"pseudomap": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
"integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM="
},
"psl": {
"version": "1.1.29",
"resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz",
@@ -5440,9 +5244,9 @@
},
"dependencies": {
"minimist": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
"integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
"version": "1.2.5",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
"integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
}
}
},
@@ -5556,23 +5360,6 @@
"safe-regex": "^1.1.0"
}
},
"registry-auth-token": {
"version": "3.4.0",
"resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz",
"integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==",
"requires": {
"rc": "^1.1.6",
"safe-buffer": "^5.0.1"
}
},
"registry-url": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz",
"integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=",
"requires": {
"rc": "^1.0.1"
}
},
"relateurl": {
"version": "0.2.7",
"resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
@@ -5910,14 +5697,6 @@
"resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz",
"integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg=="
},
"semver-diff": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz",
"integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=",
"requires": {
"semver": "^5.0.3"
}
},
"semver-greatest-satisfied-range": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz",
@@ -6428,11 +6207,6 @@
"is-utf8": "^0.2.0"
}
},
"strip-eof": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
"integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8="
},
"strip-json-comments": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
@@ -6524,12 +6298,12 @@
}
},
"tar-fs": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.0.0.tgz",
"integrity": "sha512-vaY0obB6Om/fso8a8vakQBzwholQ7v5+uy+tF3Ozvxv1KNezmVQAiWtcNmMHFSFPqL3dJA8ha6gdtFbfX9mcxA==",
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.0.tgz",
"integrity": "sha512-9uW5iDvrIMCVpvasdFHW0wJPez0K4JnMZtsuIeDI7HyMGJNxmDZDOCQROr7lXyS+iL/QMpj07qcjGYTSdRFXUg==",
"requires": {
"chownr": "^1.1.1",
"mkdirp": "^0.5.1",
"mkdirp-classic": "^0.5.2",
"pump": "^3.0.0",
"tar-stream": "^2.0.0"
}
@@ -6602,14 +6376,6 @@
"rimraf": "~2.6.2"
}
},
"term-size": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz",
"integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=",
"requires": {
"execa": "^0.7.0"
}
},
"terminal-kit": {
"version": "1.31.2",
"resolved": "https://registry.npmjs.org/terminal-kit/-/terminal-kit-1.31.2.tgz",
@@ -6683,11 +6449,6 @@
"integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=",
"dev": true
},
"timed-out": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz",
"integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8="
},
"tkwidgets": {
"version": "0.5.26",
"resolved": "https://registry.npmjs.org/tkwidgets/-/tkwidgets-0.5.26.tgz",
@@ -6976,14 +6737,6 @@
"through2-filter": "^3.0.0"
}
},
"unique-string": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz",
"integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=",
"requires": {
"crypto-random-string": "^1.0.0"
}
},
"universalify": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz",
@@ -7035,49 +6788,12 @@
}
}
},
"unzip-response": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz",
"integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c="
},
"upath": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz",
"integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==",
"dev": true
},
"update-notifier": {
"version": "2.5.0",
"resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz",
"integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==",
"requires": {
"boxen": "^1.2.1",
"chalk": "^2.0.1",
"configstore": "^3.0.0",
"import-lazy": "^2.1.0",
"is-ci": "^1.0.10",
"is-installed-globally": "^0.1.0",
"is-npm": "^1.0.0",
"latest-version": "^3.0.0",
"semver-diff": "^2.0.0",
"xdg-basedir": "^3.0.0"
},
"dependencies": {
"ci-info": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz",
"integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A=="
},
"is-ci": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz",
"integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==",
"requires": {
"ci-info": "^1.5.0"
}
}
}
},
"upper-case": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz",
@@ -7128,14 +6844,6 @@
"requires-port": "^1.0.0"
}
},
"url-parse-lax": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz",
"integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=",
"requires": {
"prepend-http": "^1.0.1"
}
},
"use": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
@@ -7336,14 +7044,6 @@
"string-width": "^1.0.2 || 2"
}
},
"widest-line": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz",
"integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==",
"requires": {
"string-width": "^2.1.1"
}
},
"word-wrap": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
@@ -7372,26 +7072,11 @@
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
},
"write-file-atomic": {
"version": "2.4.3",
"resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz",
"integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==",
"requires": {
"graceful-fs": "^4.1.11",
"imurmurhash": "^0.1.4",
"signal-exit": "^3.0.2"
}
},
"ws": {
"version": "7.3.1",
"resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz",
"integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA=="
},
"xdg-basedir": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz",
"integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ="
},
"xml-name-validator": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz",

View File

@@ -4,7 +4,8 @@
"license": "MIT",
"author": "Laurent Cozic",
"scripts": {
"test": "gulp buildTests -L && node node_modules/jasmine/bin/jasmine.js --config=tests/support/jasmine.json",
"test": "gulp buildTests -L && node node_modules/jasmine/bin/jasmine.js --fail-fast=true --config=tests/support/jasmine.json",
"test-ci": "gulp buildTests -L && node node_modules/jasmine/bin/jasmine.js --config=tests/support/jasmine.json",
"postinstall": "npm run build && patch-package --patch-dir ../patches",
"build": "gulp build",
"start": "gulp build -L && node 'build/main.js' --stack-trace-enabled --log-level debug --env dev"
@@ -27,7 +28,7 @@
],
"owner": "Laurent Cozic"
},
"version": "1.0.165",
"version": "1.0.167",
"bin": {
"joplin": "./main.js"
},
@@ -60,7 +61,7 @@
"joplin-turndown-plugin-gfm": "^1.0.12",
"json-stringify-safe": "^5.0.1",
"jssha": "^2.3.0",
"katex": "^0.11.1",
"katex": "^0.12.0",
"keytar": "^5.4.0",
"levenshtein": "^1.0.5",
"markdown-it": "^10.0.0",
@@ -85,7 +86,8 @@
"node-emoji": "^1.8.1",
"node-fetch": "^1.7.1",
"node-persist": "^2.1.0",
"patch-package": "^6.2.0",
"open": "^7.0.4",
"patch-package": "^6.2.2",
"promise": "^7.1.1",
"proper-lockfile": "^2.0.1",
"query-string": "4.3.4",

View File

@@ -4,8 +4,6 @@ const { asyncTest, setupDatabaseAndSynchronizer, switchClient } = require('test-
const { shim } = require('lib/shim');
const { enexXmlToHtml } = require('lib/import-enex-html-gen.js');
jasmine.DEFAULT_TIMEOUT_INTERVAL = 60 * 60 * 1000; // Can run for a while since everything is in the same test unit
process.on('unhandledRejection', (reason, p) => {
console.warn('Unhandled Rejection at: Promise', p, 'reason:', reason);
});

View File

@@ -12,8 +12,6 @@ const BaseModel = require('lib/BaseModel.js');
const { shim } = require('lib/shim');
const { enexXmlToMd } = require('lib/import-enex-md-gen.js');
jasmine.DEFAULT_TIMEOUT_INTERVAL = 60 * 60 * 1000; // Can run for a while since everything is in the same test unit
process.on('unhandledRejection', (reason, p) => {
console.log('Unhandled Rejection at: Promise', p, 'reason:', reason);
});

View File

@@ -13,8 +13,6 @@ const { shim } = require('lib/shim');
const HtmlToHtml = require('lib/joplin-renderer/HtmlToHtml');
const { enexXmlToMd } = require('lib/import-enex-md-gen.js');
jasmine.DEFAULT_TIMEOUT_INTERVAL = 60 * 60 * 1000; // Can run for a while since everything is in the same test unit
process.on('unhandledRejection', (reason, p) => {
console.log('Unhandled Rejection at: Promise', p, 'reason:', reason);
});

View File

@@ -13,8 +13,6 @@ const { shim } = require('lib/shim');
const HtmlToMd = require('lib/HtmlToMd');
const { enexXmlToMd } = require('lib/import-enex-md-gen.js');
jasmine.DEFAULT_TIMEOUT_INTERVAL = 60 * 60 * 1000; // Can run for a while since everything is in the same test unit
process.on('unhandledRejection', (reason, p) => {
console.log('Unhandled Rejection at: Promise', p, 'reason:', reason);
});

View File

@@ -14,8 +14,6 @@ const MdToHtml = require('lib/joplin-renderer/MdToHtml');
const { enexXmlToMd } = require('lib/import-enex-md-gen.js');
const { themeStyle } = require('lib/theme');
jasmine.DEFAULT_TIMEOUT_INTERVAL = 60 * 60 * 1000; // Can run for a while since everything is in the same test unit
process.on('unhandledRejection', (reason, p) => {
console.log('Unhandled Rejection at: Promise', p, 'reason:', reason);
});

View File

@@ -9,118 +9,127 @@ const { shim } = require('lib/shim.js');
const fs = require('fs-extra');
const Setting = require('lib/models/Setting.js');
jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;
process.on('unhandledRejection', (reason, p) => {
console.log('Unhandled Rejection at: Promise', p, 'reason:', reason);
});
let api = null;
const api = null;
// NOTE: These tests work with S3 and memory driver, but not
// with other targets like file system or Nextcloud.
// All this is tested in an indirect way in tests/synchronizer
// anyway.
// We keep the file here as it could be useful as a spec for
// what calls a sync target should support, but it would
// need to be fixed first.
// To test out an FileApi implementation:
// * add a SyncTarget for your driver in `test-utils.js`
// * set `syncTargetId_` to your New SyncTarget:
// `const syncTargetId_ = SyncTargetRegistry.nameToId('memory');`
describe('fileApi', function() {
// describe('fileApi', function() {
beforeEach(async (done) => {
api = new fileApi();
api.clearRoot();
done();
});
// beforeEach(async (done) => {
// api = new fileApi();
// api.clearRoot();
// done();
// });
describe('list', function() {
it('should return items with relative path', asyncTest(async () => {
await api.mkdir('.subfolder');
await api.put('1', 'something on root 1');
await api.put('.subfolder/1', 'something subfolder 1');
await api.put('.subfolder/2', 'something subfolder 2');
await api.put('.subfolder/3', 'something subfolder 3');
sleep(0.8);
// describe('list', function() {
// it('should return items with relative path', asyncTest(async () => {
// await api.mkdir('.subfolder');
// await api.put('1', 'something on root 1');
// await api.put('.subfolder/1', 'something subfolder 1');
// await api.put('.subfolder/2', 'something subfolder 2');
// await api.put('.subfolder/3', 'something subfolder 3');
// sleep(0.8);
const response = await api.list('.subfolder');
const items = response.items;
expect(items.length).toBe(3);
expect(items[0].path).toBe('1');
}));
// const response = await api.list('.subfolder');
// const items = response.items;
// expect(items.length).toBe(3);
// expect(items[0].path).toBe('1');
// expect(items[0].updated_time).toMatch(/^\d+$/); // make sure it's using epoch timestamp
// }));
it('should default to only files on root directory', asyncTest(async () => {
await api.mkdir('.subfolder');
await api.put('.subfolder/1', 'something subfolder 1');
await api.put('file1', 'something 1');
await api.put('file2', 'something 2');
sleep(0.6);
// it('should default to only files on root directory', asyncTest(async () => {
// await api.mkdir('.subfolder');
// await api.put('.subfolder/1', 'something subfolder 1');
// await api.put('file1', 'something 1');
// await api.put('file2', 'something 2');
// sleep(0.6);
const response = await api.list();
expect(response.items.length).toBe(2);
}));
}); // list
// const response = await api.list();
// expect(response.items.length).toBe(2);
// }));
// }); // list
describe('delete', function() {
it('should not error if file does not exist', asyncTest(async () => {
const hasThrown = await checkThrowAsync(async () => await api.delete('nonexistant_file'));
expect(hasThrown).toBe(false);
}));
// describe('delete', function() {
// it('should not error if file does not exist', asyncTest(async () => {
// const hasThrown = await checkThrowAsync(async () => await api.delete('nonexistant_file'));
// expect(hasThrown).toBe(false);
// }));
it('should delete specific file given full path', asyncTest(async () => {
await api.mkdir('deleteDir');
await api.put('deleteDir/1', 'something 1');
await api.put('deleteDir/2', 'something 2');
sleep(0.4);
// it('should delete specific file given full path', asyncTest(async () => {
// await api.mkdir('deleteDir');
// await api.put('deleteDir/1', 'something 1');
// await api.put('deleteDir/2', 'something 2');
// sleep(0.4);
await api.delete('deleteDir/1');
let response = await api.list('deleteDir');
expect(response.items.length).toBe(1);
response = await api.list('deleteDir/1');
expect(response.items.length).toBe(0);
}));
}); // delete
// await api.delete('deleteDir/1');
// let response = await api.list('deleteDir');
// expect(response.items.length).toBe(1);
// response = await api.list('deleteDir/1');
// expect(response.items.length).toBe(0);
// }));
// }); // delete
describe('get', function() {
it('should return null if object does not exist', asyncTest(async () => {
const response = await api.get('nonexistant_file');
expect(response).toBe(null);
}));
// describe('get', function() {
// it('should return null if object does not exist', asyncTest(async () => {
// const response = await api.get('nonexistant_file');
// expect(response).toBe(null);
// }));
it('should return UTF-8 encoded string by default', asyncTest(async () => {
await api.put('testnote.md', 'something 2');
// it('should return UTF-8 encoded string by default', asyncTest(async () => {
// await api.put('testnote.md', 'something 2');
const response = await api.get('testnote.md');
expect(response).toBe('something 2');
}));
// const response = await api.get('testnote.md');
// expect(response).toBe('something 2');
// }));
it('should return a Response object and writes file to options.path, if options.target is "file"', asyncTest(async () => {
const localFilePath = `${Setting.value('tempDir')}/${uuid.create()}.md`;
await api.put('testnote.md', 'something 2');
sleep(0.2);
// it('should return a Response object and writes file to options.path, if options.target is "file"', asyncTest(async () => {
// const localFilePath = `${Setting.value('tempDir')}/${uuid.create()}.md`;
// await api.put('testnote.md', 'something 2');
// sleep(0.2);
const response = await api.get('testnote.md', { target: 'file', path: localFilePath });
expect(typeof response).toBe('object');
// expect(response.path).toBe(localFilePath);
expect(fs.existsSync(localFilePath)).toBe(true);
expect(fs.readFileSync(localFilePath, 'utf8')).toBe('something 2');
}));
}); // get
// const response = await api.get('testnote.md', { target: 'file', path: localFilePath });
// expect(typeof response).toBe('object');
// // expect(response.path).toBe(localFilePath);
// expect(fs.existsSync(localFilePath)).toBe(true);
// expect(fs.readFileSync(localFilePath, 'utf8')).toBe('something 2');
// }));
// }); // get
describe('put', function() {
it('should create file to remote path and content', asyncTest(async () => {
await api.put('putTest.md', 'I am your content');
sleep(0.2);
// describe('put', function() {
// it('should create file to remote path and content', asyncTest(async () => {
// await api.put('putTest.md', 'I am your content');
// sleep(0.2);
const response = await api.get('putTest.md');
expect(response).toBe('I am your content');
}));
// const response = await api.get('putTest.md');
// expect(response).toBe('I am your content');
// }));
it('should upload file in options.path to remote path, if options.source is "file"', asyncTest(async () => {
const localFilePath = `${Setting.value('tempDir')}/${uuid.create()}.md`;
fs.writeFileSync(localFilePath, 'I am the local file.');
// it('should upload file in options.path to remote path, if options.source is "file"', asyncTest(async () => {
// const localFilePath = `${Setting.value('tempDir')}/${uuid.create()}.md`;
// fs.writeFileSync(localFilePath, 'I am the local file.');
await api.put('testfile', 'ignore me', { source: 'file', path: localFilePath });
sleep(0.2);
// await api.put('testfile', 'ignore me', { source: 'file', path: localFilePath });
// sleep(0.2);
const response = await api.get('testfile');
expect(response).toBe('I am the local file.');
}));
}); // put
// const response = await api.get('testfile');
// expect(response).toBe('I am the local file.');
// }));
// }); // put
});
// });

View File

@@ -0,0 +1,155 @@
/* eslint-disable no-unused-vars */
require('app-module-path').addPath(__dirname);
const filterParser = require('lib/services/searchengine/filterParser.js').default;
// import filterParser from 'lib/services/searchengine/filterParser.js';
const makeTerm = (name, value, negated) => { return { name, value, negated }; };
describe('filterParser should be correct filter for keyword', () => {
it('title', () => {
const searchString = 'title: something';
expect(filterParser(searchString)).toContain(makeTerm('title', 'something', false));
});
it('negated title', () => {
const searchString = '-title: something';
expect(filterParser(searchString)).toContain(makeTerm('title', 'something', true));
});
it('body', () => {
const searchString = 'body:something';
expect(filterParser(searchString)).toContain(makeTerm('body', 'something', false));
});
it('negated body', () => {
const searchString = '-body:something';
expect(filterParser(searchString)).toContain(makeTerm('body', 'something', true));
});
it('title and body', () => {
const searchString = 'title:testTitle body:testBody';
expect(filterParser(searchString)).toContain(makeTerm('title', 'testTitle', false));
expect(filterParser(searchString)).toContain(makeTerm('body', 'testBody', false));
});
it('title with multiple words', () => {
const searchString = 'title:"word1 word2" body:testBody';
expect(filterParser(searchString)).toContain(makeTerm('title', 'word1', false));
expect(filterParser(searchString)).toContain(makeTerm('title', 'word2', false));
expect(filterParser(searchString)).toContain(makeTerm('body', 'testBody', false));
});
it('body with multiple words', () => {
const searchString = 'title:testTitle body:"word1 word2"';
expect(filterParser(searchString)).toContain(makeTerm('title', 'testTitle', false));
expect(filterParser(searchString)).toContain(makeTerm('body', 'word1', false));
expect(filterParser(searchString)).toContain(makeTerm('body', 'word2', false));
});
it('single word text', () => {
const searchString = 'joplin';
expect(filterParser(searchString)).toContain(makeTerm('text', '"joplin"', false));
});
it('multi word text', () => {
const searchString = 'scott joplin';
expect(filterParser(searchString)).toContain(makeTerm('text', '"scott"', false));
expect(filterParser(searchString)).toContain(makeTerm('text', '"joplin"', false));
});
it('negated word text', () => {
const searchString = 'scott -joplin';
expect(filterParser(searchString)).toContain(makeTerm('text', '"scott"', false));
expect(filterParser(searchString)).toContain(makeTerm('text', '"joplin"', true));
});
it('phrase text search', () => {
const searchString = '"scott joplin"';
expect(filterParser(searchString)).toContain(makeTerm('text', '"scott joplin"', false));
});
it('multi word body', () => {
const searchString = 'body:"foo bar"';
expect(filterParser(searchString)).toContain(makeTerm('body', 'foo', false));
expect(filterParser(searchString)).toContain(makeTerm('body', 'bar', false));
});
it('negated tag queries', () => {
const searchString = '-tag:mozart';
expect(filterParser(searchString)).toContain(makeTerm('tag', 'mozart', true));
});
it('created after', () => {
const searchString = 'created:20151218'; // YYYYMMDD
expect(filterParser(searchString)).toContain(makeTerm('created', '20151218', false));
});
it('created before', () => {
const searchString = '-created:20151218'; // YYYYMMDD
expect(filterParser(searchString)).toContain(makeTerm('created', '20151218', true));
});
it('any', () => {
const searchString = 'any:1 tag:123';
expect(filterParser(searchString)).toContain(makeTerm('any', '1', false));
expect(filterParser(searchString)).toContain(makeTerm('tag', '123', false));
});
it('wildcard tags', () => {
let searchString = 'tag:*';
expect(filterParser(searchString)).toContain(makeTerm('tag', '%', false));
searchString = '-tag:*';
expect(filterParser(searchString)).toContain(makeTerm('tag', '%', true));
searchString = 'tag:bl*sphemy';
expect(filterParser(searchString)).toContain(makeTerm('tag', 'bl%sphemy', false));
});
it('wildcard notebooks', () => {
const searchString = 'notebook:my*notebook';
expect(filterParser(searchString)).toContain(makeTerm('notebook', 'my%notebook', false));
});
it('wildcard MIME types', () => {
const searchString = 'resource:image/*';
expect(filterParser(searchString)).toContain(makeTerm('resource', 'image/%', false));
});
it('sourceurl', () => {
let searchString = 'sourceurl:https://www.google.com';
expect(filterParser(searchString)).toContain(makeTerm('sourceurl', 'https://www.google.com', false));
searchString = 'sourceurl:https://www.google.com -sourceurl:https://www.facebook.com';
expect(filterParser(searchString)).toContain(makeTerm('sourceurl', 'https://www.google.com', false));
expect(filterParser(searchString)).toContain(makeTerm('sourceurl', 'https://www.facebook.com', true));
});
it('handle invalid filters', () => {
let searchString = 'titletitle:123';
expect(() => filterParser(searchString)).toThrow(new Error('Invalid filter: titletitle'));
searchString = 'invalid:abc';
expect(() => filterParser(searchString)).toThrow(new Error('Invalid filter: invalid'));
searchString = ':abc';
expect(() => filterParser(searchString)).toThrow(new Error('Invalid filter: '));
searchString = 'type:blah';
expect(() => filterParser(searchString)).toThrow(new Error('The value of filter "type" must be "note" or "todo"'));
searchString = '-type:note';
expect(() => filterParser(searchString)).toThrow(new Error('type can\'t be negated'));
searchString = 'iscompleted:blah';
expect(() => filterParser(searchString)).toThrow(new Error('The value of filter "iscompleted" must be "1" or "0"'));
searchString = '-notebook:n1';
expect(() => filterParser(searchString)).toThrow(new Error('notebook can\'t be negated'));
searchString = '-iscompleted:1';
expect(() => filterParser(searchString)).toThrow(new Error('iscompleted can\'t be negated'));
});
});

View File

@@ -4,7 +4,7 @@ require('app-module-path').addPath(__dirname);
const { time } = require('lib/time-utils.js');
const { asyncTest, fileContentEqual, revisionService, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('test-utils.js');
const SearchEngine = require('lib/services/SearchEngine');
const SearchEngine = require('lib/services/searchengine/SearchEngine');
const ResourceService = require('lib/services/ResourceService');
const ItemChangeUtils = require('lib/services/ItemChangeUtils');
const Note = require('lib/models/Note');

View File

@@ -10,8 +10,6 @@ const Resource = require('lib/models/Resource.js');
const BaseModel = require('lib/BaseModel.js');
const { shim } = require('lib/shim');
jasmine.DEFAULT_TIMEOUT_INTERVAL = 15000; // The first test is slow because the database needs to be built
process.on('unhandledRejection', (reason, p) => {
console.log('Unhandled Rejection at: Promise', p, 'reason:', reason);
});

View File

@@ -59,7 +59,7 @@ describe('models_Tag', function() {
expect(tags.length).toBe(0);
}));
it('should return correct note counts', asyncTest(async () => {
it('should return tags with note counts', asyncTest(async () => {
const folder1 = await Folder.save({ title: 'folder1' });
const note1 = await Note.save({ title: 'ma note', parent_id: folder1.id });
const note2 = await Note.save({ title: 'ma 2nd note', parent_id: folder1.id });
@@ -68,13 +68,13 @@ describe('models_Tag', function() {
let tags = await Tag.allWithNotes();
expect(tags.length).toBe(1);
expect(Tag.getCachedNoteCount(tags[0].id)).toBe(2);
expect(tags[0].note_count).toBe(2);
await Note.delete(note1.id);
tags = await Tag.allWithNotes();
expect(tags.length).toBe(1);
expect(Tag.getCachedNoteCount(tags[0].id)).toBe(1);
expect(tags[0].note_count).toBe(1);
await Note.delete(note2.id);
@@ -82,6 +82,21 @@ describe('models_Tag', function() {
expect(tags.length).toBe(0);
}));
it('should load individual tags with note count', asyncTest(async () => {
const folder1 = await Folder.save({ title: 'folder1' });
const note1 = await Note.save({ title: 'ma note', parent_id: folder1.id });
const note2 = await Note.save({ title: 'ma 2nd note', parent_id: folder1.id });
const tag = await Tag.save({ title: 'mytag' });
await Tag.addNote(tag.id, note1.id);
let tagWithCount = await Tag.loadWithCount(tag.id);
expect(tagWithCount.note_count).toBe(1);
await Tag.addNote(tag.id, note2.id);
tagWithCount = await Tag.loadWithCount(tag.id);
expect(tagWithCount.note_count).toBe(2);
}));
it('should get common tags for set of notes', asyncTest(async () => {
const folder1 = await Folder.save({ title: 'folder1' });
const taga = await Tag.save({ title: 'mytaga' });
@@ -135,211 +150,4 @@ describe('models_Tag', function() {
expect(commonTagIds.includes(tagc.id)).toBe(true);
}));
it('should create parent tags', asyncTest(async () => {
const tag = await Tag.saveNested({}, 'tag1/subtag1/subtag2');
expect(tag).not.toEqual(null);
let parent_tag = await Tag.loadByTitle('tag1/subtag1');
expect(parent_tag).not.toEqual(null);
parent_tag = await Tag.loadByTitle('tag1');
expect(parent_tag).not.toEqual(null);
}));
it('should should find notes tagged with descendant tag', asyncTest(async () => {
const folder1 = await Folder.save({ title: 'folder1' });
const tag0 = await Tag.saveNested({}, 'tag1/subtag1/subsubtag');
const tag1 = await Tag.loadByTitle('tag1/subtag1');
const note0 = await Note.save({ title: 'my note 0', parent_id: folder1.id });
const note1 = await Note.save({ title: 'my note 1', parent_id: folder1.id });
await Tag.addNote(tag0.id, note0.id);
await Tag.addNote(tag1.id, note1.id);
const parent_tag = await Tag.loadByTitle('tag1');
const noteIds = await Tag.noteIds(parent_tag.id);
expect(noteIds.includes(note0.id)).toBe(true);
expect(noteIds.includes(note1.id)).toBe(true);
}));
it('should untag descendant tags', asyncTest(async () => {
const folder1 = await Folder.save({ title: 'folder1' });
const tag0 = await Tag.saveNested({}, 'tag1/subtag1/subsubtag');
const parent_tag = await Tag.loadByTitle('tag1');
const note0 = await Note.save({ title: 'my note 0', parent_id: folder1.id });
await Tag.addNote(tag0.id, note0.id);
let tagIds = await NoteTag.tagIdsByNoteId(note0.id);
expect(tagIds.includes(tag0.id)).toBe(true);
await Tag.untagAll(parent_tag.id);
tagIds = await NoteTag.tagIdsByNoteId(note0.id);
expect(tagIds.length).toBe(0);
}));
it('should count note_tags of descendant tags', asyncTest(async () => {
const folder1 = await Folder.save({ title: 'folder1' });
const tag0 = await Tag.saveNested({}, 'tag1/subtag1/subsubtag');
let parent_tag = await Tag.loadByTitle('tag1');
const note0 = await Note.save({ title: 'my note 0', parent_id: folder1.id });
await Tag.addNote(tag0.id, note0.id);
parent_tag = await Tag.loadWithCount(parent_tag.id);
expect(Tag.getCachedNoteCount(parent_tag.id)).toBe(1);
}));
it('should delete descendant tags', asyncTest(async () => {
let tag1 = await Tag.saveNested({}, 'tag1/subtag1/subsubtag');
let tag1_subtag1 = await Tag.loadByTitle('tag1/subtag1');
expect(tag1).toBeDefined();
expect(tag1_subtag1).toBeDefined();
let parent_tag = await Tag.loadByTitle('tag1');
await Tag.delete(parent_tag.id);
parent_tag = await Tag.loadByTitle('tag1');
expect(parent_tag).not.toBeDefined();
tag1_subtag1 = await Tag.loadByTitle('tag1/subtag1');
expect(tag1_subtag1).not.toBeDefined();
tag1 = await Tag.loadByTitle('tag1/subtag1/subsubtag');
expect(tag1).not.toBeDefined();
}));
it('should delete noteless parent tags', asyncTest(async () => {
const folder1 = await Folder.save({ title: 'folder1' });
const note0 = await Note.save({ title: 'my note 0', parent_id: folder1.id });
const subsubtag = await Tag.saveNested({}, 'tag1/subtag1/subsubtag');
await Tag.addNote(subsubtag.id, note0.id);
let tag1_subtag1 = await Tag.loadByTitle('tag1/subtag1');
// This will remove the link from tag1 to subsubtag1 (which is removed)
// So tag1 is noteless and should also be removed
await Tag.delete(tag1_subtag1.id);
const parent_tag = await Tag.loadByTitle('tag1');
expect(parent_tag).not.toBeDefined();
tag1_subtag1 = await Tag.loadByTitle('tag1/subtag1');
expect(tag1_subtag1).not.toBeDefined();
const tag1 = await Tag.loadByTitle('tag1/subtag1/subsubtag');
expect(tag1).not.toBeDefined();
}));
it('renaming should change prefix in descendant tags', asyncTest(async () => {
const folder1 = await Folder.save({ title: 'folder1' });
const note0 = await Note.save({ title: 'my note 0', parent_id: folder1.id });
const tag1 = await Tag.saveNested({}, 'tag1/subtag1/subsubtag');
const subtag2 = await Tag.saveNested({}, 'tag1/subtag2');
const subtag1 = await Tag.loadByTitle('tag1/subtag1');
const tag1_parent = await Tag.loadByTitle('tag1');
await Tag.setNoteTagsByIds(note0.id, [tag1.id, subtag2.id]);
await Tag.renameNested(tag1_parent, 'tag2');
expect(Tag.getCachedFullTitle((await Tag.loadWithCount(tag1_parent.id)).id)).toBe('tag2');
expect(Tag.getCachedFullTitle((await Tag.loadWithCount(tag1.id)).id)).toBe('tag2/subtag1/subsubtag');
expect(Tag.getCachedFullTitle((await Tag.loadWithCount(subtag1.id)).id)).toBe('tag2/subtag1');
expect(Tag.getCachedFullTitle((await Tag.loadWithCount(subtag2.id)).id)).toBe('tag2/subtag2');
}));
it('renaming parent prefix should branch-out to two hierarchies', asyncTest(async () => {
const folder1 = await Folder.save({ title: 'folder1' });
const note1 = await Note.save({ title: 'my note 1', parent_id: folder1.id });
const note2 = await Note.save({ title: 'my note 2', parent_id: folder1.id });
const subsubtag1 = await Tag.saveNested({}, 'tag1/subtag1/subsubtag1');
const subsubtag2 = await Tag.saveNested({}, 'tag1/subtag1/subsubtag2');
await Tag.addNote(subsubtag1.id, note1.id);
await Tag.addNote(subsubtag2.id, note2.id);
await Tag.renameNested(subsubtag1, 'tag1/subtag2/subsubtag1');
const subtag1 = await Tag.loadByTitle('tag1/subtag1');
const subtag2 = await Tag.loadByTitle('tag1/subtag2');
expect(subtag1).toBeDefined();
expect(subtag2).toBeDefined();
}));
it('renaming parent prefix to existing tag should remove unused old tag', asyncTest(async () => {
const folder1 = await Folder.save({ title: 'folder1' });
const note1 = await Note.save({ title: 'my note 1', parent_id: folder1.id });
const subsubtag1 = await Tag.saveNested({}, 'tag1/subtag1/subsubtag1');
const subsubtag2 = await Tag.saveNested({}, 'tag1/subtag2/subsubtag2');
await Tag.addNote(subsubtag2.id, note1.id);
await Tag.renameNested(subsubtag1, 'tag1/subtag2/subsubtag1');
expect((await Tag.loadByTitle('tag1/subtag1'))).not.toBeDefined();
}));
it('moving tag should change prefix name', asyncTest(async () => {
const folder1 = await Folder.save({ title: 'folder1' });
const note1 = await Note.save({ title: 'my note 1', parent_id: folder1.id });
const subsubtag1 = await Tag.saveNested({}, 'tag1/subtag1/subsubtag1');
const tag2 = await Tag.saveNested({}, 'tag2');
await Tag.setNoteTagsByIds(note1.id, [tag2.id, subsubtag1.id]);
await Tag.moveTag(subsubtag1.id, tag2.id);
expect(Tag.getCachedFullTitle((await Tag.loadWithCount(subsubtag1.id)).id)).toBe('tag2/subsubtag1');
}));
it('moving tag to itself or its descendant throws error', asyncTest(async () => {
const folder1 = await Folder.save({ title: 'folder1' });
const note1 = await Note.save({ title: 'my note 1', parent_id: folder1.id });
const subsubtag1 = await Tag.saveNested({}, 'tag1/subtag1/subsubtag1');
await Tag.addNote(subsubtag1.id, note1.id);
const tag1 = await Tag.loadByTitle('tag1');
let hasThrown = await checkThrowAsync(async () => await Tag.moveTag(tag1.id, subsubtag1.id));
expect(hasThrown).toBe(true);
hasThrown = await checkThrowAsync(async () => await Tag.moveTag(tag1.id, tag1.id));
expect(hasThrown).toBe(true);
}));
it('renaming tag as a child of itself creates new parent', asyncTest(async () => {
const folder1 = await Folder.save({ title: 'folder1' });
const note1 = await Note.save({ title: 'my note 1', parent_id: folder1.id });
const subtag1 = await Tag.saveNested({}, 'tag1/subtag1');
await Tag.addNote(subtag1.id, note1.id);
const a = await Tag.renameNested(subtag1, 'tag1/subtag1/a/subtag1');
const subtag1_renamed = await Tag.loadByTitle('tag1/subtag1/a/subtag1');
expect(subtag1_renamed.id).toBe(subtag1.id);
const subtag1_new = await Tag.loadByTitle('tag1/subtag1');
expect(subtag1_new.id).not.toBe(subtag1.id);
}));
it('should search by full title regex', asyncTest(async () => {
const folder1 = await Folder.save({ title: 'folder1' });
const note1 = await Note.save({ title: 'my note 1', parent_id: folder1.id });
const abc = await Tag.saveNested({}, 'a/b/c');
const adef = await Tag.saveNested({}, 'a/d/e/f');
await Tag.setNoteTagsByIds(note1.id, [abc.id, adef.id]);
expect((await Tag.search({ fullTitleRegex: '.*c.*' })).length).toBe(1);
expect((await Tag.search({ fullTitleRegex: '.*b.*' })).length).toBe(2);
expect((await Tag.search({ fullTitleRegex: '.*b/c.*' })).length).toBe(1);
expect((await Tag.search({ fullTitleRegex: '.*a.*' })).length).toBe(6);
expect((await Tag.search({ fullTitleRegex: '.*a/d.*' })).length).toBe(3);
}));
it('creating tags with the same name at the same level should throw exception', asyncTest(async () => {
// Should not complain when creating at different levels
await Tag.saveNested({}, 'a/b/c');
await Tag.saveNested({}, 'a/d/e/c');
await Tag.saveNested({}, 'c');
// Should complain when creating at the same level
let hasThrown = await checkThrowAsync(async () => await Tag.saveNested({}, 'a/d', { userSideValidation: true }));
expect(hasThrown).toBe(true);
hasThrown = await checkThrowAsync(async () => await Tag.saveNested({}, 'a', { userSideValidation: true }));
expect(hasThrown).toBe(true);
hasThrown = await checkThrowAsync(async () => await Tag.saveNested({}, 'a/b/c', { userSideValidation: true }));
expect(hasThrown).toBe(true);
}));
});

View File

@@ -19,8 +19,6 @@ process.on('unhandledRejection', (reason, p) => {
console.log('Unhandled Rejection at: Promise', p, 'reason:', reason);
});
jasmine.DEFAULT_TIMEOUT_INTERVAL = 15000; // The first test is slow because the database needs to be built
let service = null;
describe('services_EncryptionService', function() {

View File

@@ -15,8 +15,6 @@ const ArrayUtils = require('lib/ArrayUtils');
const ObjectUtils = require('lib/ObjectUtils');
const { shim } = require('lib/shim.js');
jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;
process.on('unhandledRejection', (reason, p) => {
console.log('Unhandled Rejection at: Promise', p, 'reason:', reason);
});

View File

@@ -11,8 +11,6 @@ const Resource = require('lib/models/Resource.js');
const Note = require('lib/models/Note.js');
const { shim } = require('lib/shim.js');
jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;
const exportDir = `${__dirname}/export`;
process.on('unhandledRejection', (reason, p) => {

View File

@@ -0,0 +1,319 @@
require('app-module-path').addPath(__dirname);
const KeymapService = require('lib/services/KeymapService').default;
const keymapService = KeymapService.instance();
describe('services_KeymapService', () => {
describe('validateAccelerator', () => {
it('should identify valid Accelerators', () => {
const testCases = {
darwin: [
'F4',
'Cmd+F9',
'Option+Z',
'Option+Shift+F',
'Ctrl+Option+U',
'Option+Shift+Cmd+F9',
'Ctrl+Shift+Z',
'Option+Shift+Cmd+B',
],
linux: [
'F4',
'Ctrl+F9',
'Alt+Shift+F',
'Shift+U',
'Ctrl+Shift+T',
'Ctrl+Alt+Shift+Z',
'Alt+E',
'Alt+Shift+F9',
],
};
Object.entries(testCases).forEach(([platform, accelerators]) => {
keymapService.initialize(platform);
accelerators.forEach(accelerator => {
expect(() => keymapService.validateAccelerator(accelerator)).not.toThrow();
});
});
});
it('should identify invalid Accelerators', () => {
const testCases = {
darwin: [
'',
'A+Z',
'Cmd',
'Ctrl+',
'Option+Cmd',
'Ctrl+Shift',
'Cmd+H+A',
'Option+Shift+Cmd+J+O+P',
'Opptionn+F9',
'Ctrl+Shiftt+X',
'Cmd+Option+Shoft+T',
],
win32: [
'+',
'B+F4',
'Ctrl+',
'Ctrl+Shift+',
'Cmd+Alt',
'Ctrl+Shift+Alt',
'Cmd+H+A',
'Ctrl+Shift+Alt+J+O+P',
'Contrl+F9',
'Controller+Shift+X',
'Cmd+Option+Shoft+T',
],
};
Object.entries(testCases).forEach(([platform, accelerators]) => {
keymapService.initialize(platform);
accelerators.forEach(accelerator => {
expect(() => keymapService.validateAccelerator(accelerator)).toThrow();
});
});
});
});
describe('getAccelerator', () => {
beforeEach(() => keymapService.initialize());
it('should return the platform-specific default Accelerator', () => {
keymapService.initialize('darwin');
expect(keymapService.getAccelerator('newNote')).toEqual('Cmd+N');
expect(keymapService.getAccelerator('synchronize')).toEqual('Cmd+S');
expect(keymapService.getAccelerator('textSelectAll')).toEqual('Cmd+A');
expect(keymapService.getAccelerator('textBold')).toEqual('Cmd+B');
keymapService.initialize('linux');
expect(keymapService.getAccelerator('newNote')).toEqual('Ctrl+N');
expect(keymapService.getAccelerator('synchronize')).toEqual('Ctrl+S');
keymapService.initialize('win32');
expect(keymapService.getAccelerator('textSelectAll')).toEqual('Ctrl+A');
expect(keymapService.getAccelerator('textBold')).toEqual('Ctrl+B');
});
if ('should throw when an invalid command is requested', () => {
expect(() => keymapService.getAccelerator('totallyNonExistentCommand')).toThrow();
});
});
describe('setAccelerator', () => {
beforeEach(() => keymapService.initialize());
it('should update the Accelerator', () => {
keymapService.initialize('darwin');
const testCases_Darwin = [
{ command: 'newNote', accelerator: 'Ctrl+Option+Shift+N' },
{ command: 'synchronize', accelerator: 'F11' },
{ command: 'textBold', accelerator: 'Shift+F5' },
{ command: 'showLocalSearch', accelerator: 'Option+Cmd+S' },
{ command: 'gotoAnything', accelerator: 'Ctrl+Shift+G' },
{ command: 'print', accelerator: null /* Disabled */ },
{ command: 'focusElementNoteTitle', accelerator: 'Option+Shift+Cmd+T' },
{ command: 'focusElementNoteBody', accelerator: 'Ctrl+Option+Shift+Cmd+B' },
];
testCases_Darwin.forEach(({ command, accelerator }) => {
keymapService.setAccelerator(command, accelerator);
expect(keymapService.getAccelerator(command)).toEqual(accelerator);
});
keymapService.initialize('linux');
const testCases_Linux = [
{ command: 'newNote', accelerator: 'Ctrl+Alt+Shift+N' },
{ command: 'synchronize', accelerator: 'F15' },
{ command: 'textBold', accelerator: 'Shift+F5' },
{ command: 'showLocalSearch', accelerator: 'Ctrl+Alt+S' },
{ command: 'gotoAnything', accelerator: 'Ctrl+Shift+G' },
{ command: 'print', accelerator: null /* Disabled */ },
{ command: 'focusElementNoteTitle', accelerator: 'Ctrl+Alt+Shift+T' },
{ command: 'focusElementNoteBody', accelerator: 'Ctrl+Alt+Shift+B' },
];
testCases_Linux.forEach(({ command, accelerator }) => {
keymapService.setAccelerator(command, accelerator);
expect(keymapService.getAccelerator(command)).toEqual(accelerator);
});
});
});
describe('resetAccelerator', () => {
beforeEach(() => keymapService.initialize());
it('should reset the Accelerator', () => {
const testCases = [
{ command: 'newNote', accelerator: 'Ctrl+Alt+Shift+N' },
{ command: 'synchronize', accelerator: null /* Disabled */ },
{ command: 'textBold', accelerator: 'Shift+F5' },
{ command: 'showLocalSearch', accelerator: 'Ctrl+Alt+S' },
{ command: 'gotoAnything', accelerator: 'Ctrl+Shift+G' },
{ command: 'print', accelerator: 'Alt+P' },
{ command: 'focusElementNoteTitle', accelerator: 'Ctrl+Alt+Shift+T' },
{ command: 'focusElementNoteBody', accelerator: 'Ctrl+Alt+Shift+B' },
];
testCases.forEach(({ command, accelerator }) => {
// Remember the default Accelerator value
const prevAccelerator = keymapService.getAccelerator(command);
// Update the Accelerator,
keymapService.setAccelerator(command, accelerator);
expect(keymapService.getAccelerator(command)).toEqual(accelerator);
// and then reset it..
keymapService.resetAccelerator(command);
expect(keymapService.getAccelerator(command)).toEqual(prevAccelerator);
});
});
});
describe('setKeymap', () => {
beforeEach(() => keymapService.initialize());
it('should update the keymap', () => {
keymapService.initialize('darwin');
const customKeymap_Darwin = [
{ command: 'newNote', accelerator: 'Option+Shift+Cmd+N' },
{ command: 'synchronize', accelerator: 'F11' },
{ command: 'textBold', accelerator: 'Shift+F5' },
{ command: 'showLocalSearch', accelerator: 'Ctrl+Option+S' },
{ command: 'gotoAnything', accelerator: 'Ctrl+Shift+G' },
{ command: 'print', accelerator: 'Option+P' },
{ command: 'help', accelerator: null /* Disabled */ },
{ command: 'focusElementNoteTitle', accelerator: 'Ctrl+Option+Shift+T' },
{ command: 'focusElementNoteBody', accelerator: 'Option+Shift+Cmd+B' },
{ command: 'focusElementSideBar', accelerator: 'Shift+Cmd+L' /* Default of focusElementNoteList */ },
{ command: 'focusElementNoteList', accelerator: 'Shift+Cmd+S' /* Default of focusElementSideBar */ },
];
expect(() => keymapService.setKeymap(customKeymap_Darwin)).not.toThrow();
customKeymap_Darwin.forEach(({ command, accelerator }) => {
// Also check if keymap is updated or not
expect(keymapService.getAccelerator(command)).toEqual(accelerator);
});
keymapService.initialize('win32');
const customKeymap_Win32 = [
{ command: 'newNote', accelerator: 'Ctrl+Alt+Shift+N' },
{ command: 'synchronize', accelerator: 'F11' },
{ command: 'textBold', accelerator: 'Shift+F5' },
{ command: 'showLocalSearch', accelerator: 'Ctrl+Alt+S' },
{ command: 'gotoAnything', accelerator: 'Ctrl+Shift+G' },
{ command: 'print', accelerator: 'Alt+P' },
{ command: 'help', accelerator: null /* Disabled */ },
{ command: 'focusElementNoteTitle', accelerator: 'Ctrl+Alt+Shift+T' },
{ command: 'focusElementNoteBody', accelerator: 'Ctrl+Alt+Shift+B' },
{ command: 'focusElementSideBar', accelerator: 'Ctrl+Shift+L' /* Default of focusElementNoteList */ },
{ command: 'focusElementNoteList', accelerator: 'Ctrl+Shift+S' /* Default of focusElementSideBar */ },
];
expect(() => keymapService.setKeymap(customKeymap_Win32)).not.toThrow();
customKeymap_Win32.forEach(({ command, accelerator }) => {
// Also check if keymap is updated or not
expect(keymapService.getAccelerator(command)).toEqual(accelerator);
});
});
it('should throw when the required properties are missing', () => {
const customKeymaps = [
[
{ commmmmand: 'gotoAnything', accelerator: 'Ctrl+Shift+G' },
{ command: 'showLocalSearch', accelerator: 'Ctrl+Alt+S' },
{ command: 'print', accelerator: 'Alt+P' },
],
[
{ accelerator: 'Alt+P' },
{ command: 'showLocalSearch', accelerator: 'Ctrl+Alt+S' },
{ command: 'gotoAnything', accelerator: 'Ctrl+Shift+G' },
],
[
{ command: 'showLocalSearch', accel: 'Ctrl+Alt+S' },
{ command: 'print', accelerator: 'Alt+P' },
{ command: 'gotoAnything', accelerator: 'Ctrl+Shift+G' },
],
[
{ command: 'print' },
{ command: 'showLocalSearch', accelerator: 'Ctrl+Alt+S' },
{ command: 'gotoAnything', accelerator: 'Ctrl+Shift+G' },
],
];
for (let i = 0; i < customKeymaps.length; i++) {
const customKeymap = customKeymaps[i];
expect(() => keymapService.setKeymap(customKeymap)).toThrow();
}
});
it('should throw when the provided Accelerators are invalid', () => {
// Only one test case is provided since KeymapService.validateAccelerator() is already tested
const customKeymap = [
{ command: 'gotoAnything', accelerator: 'Ctrl+Shift+G' },
{ command: 'print', accelerator: 'Alt+P' },
{ command: 'focusElementNoteTitle', accelerator: 'Ctrl+Alt+Shift+J+O+P+L+I+N' },
];
expect(() => keymapService.setKeymap(customKeymap)).toThrow();
});
it('should throw when the provided commands are invalid', () => {
const customKeymap = [
{ command: 'totallyInvalidCommand', accelerator: 'Ctrl+Shift+G' },
{ command: 'print', accelerator: 'Alt+P' },
{ command: 'focusElementNoteTitle', accelerator: 'Ctrl+Alt+Shift+J' },
];
expect(() => keymapService.setKeymap(customKeymap)).toThrow();
});
it('should throw when duplicate accelerators are provided', () => {
const customKeymaps_Darwin = [
[
{ command: 'showLocalSearch', accelerator: 'Option+Cmd+S' /* Duplicate */ },
{ command: 'gotoAnything', accelerator: 'Option+Cmd+S' /* Duplicate */ },
{ command: 'print', accelerator: 'Option+P' },
],
[
{ command: 'showLocalSearch', accelerator: 'Option+Cmd+S' },
{ command: 'print', accelerator: 'Cmd+G' /* Default of gotoAnything */ },
{ command: 'focusElementNoteTitle', accelerator: 'Option+Shift+Cmd+J' },
],
];
for (let i = 0; i < customKeymaps_Darwin.length; i++) {
const customKeymap = customKeymaps_Darwin[i];
const defaultAccelerators = customKeymap.map(({ command }) => keymapService.getAccelerator(command));
expect(() => keymapService.setKeymap(customKeymap)).toThrow();
// All items should be reset to default values
for (let j = 0; j < customKeymap.length; j++) {
expect(keymapService.getAccelerator(customKeymap[j].command)).toEqual(defaultAccelerators[j]);
}
}
const customKeymaps_Linux = [
[
{ command: 'showLocalSearch', accelerator: 'Ctrl+Alt+S' /* Duplicate */ },
{ command: 'print', accelerator: 'Alt+P' },
{ command: 'gotoAnything', accelerator: 'Ctrl+Alt+S' /* Duplicate */ },
],
[
{ command: 'showLocalSearch', accelerator: 'Ctrl+Alt+S' },
{ command: 'print', accelerator: 'Ctrl+G' /* Default of gotoAnything */ },
{ command: 'focusElementNoteTitle', accelerator: 'Ctrl+Alt+Shift+J' },
],
];
for (let i = 0; i < customKeymaps_Linux.length; i++) {
const customKeymap = customKeymaps_Linux[i];
const defaultAccelerators = customKeymap.map(({ command }) => keymapService.getAccelerator(command));
expect(() => keymapService.setKeymap(customKeymap)).toThrow();
for (let j = 0; j < customKeymap.length; j++) {
expect(keymapService.getAccelerator(customKeymap[j].command)).toEqual(defaultAccelerators[j]);
}
}
});
});
});

View File

@@ -9,8 +9,6 @@ process.on('unhandledRejection', (reason, p) => {
console.log('Unhandled Rejection at: Promise', p, 'reason:', reason);
});
jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;
function setupStore() {
const store = KvStore.instance();
store.setDb(db());

View File

@@ -17,14 +17,12 @@ const fs = require('fs-extra');
const ArrayUtils = require('lib/ArrayUtils');
const ObjectUtils = require('lib/ObjectUtils');
const { shim } = require('lib/shim.js');
const SearchEngine = require('lib/services/SearchEngine');
const SearchEngine = require('lib/services/searchengine/SearchEngine');
process.on('unhandledRejection', (reason, p) => {
console.log('Unhandled Rejection at: Promise', p, 'reason:', reason);
});
jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;
function exportDir() {
return `${__dirname}/export`;
}

View File

@@ -5,7 +5,7 @@ require('app-module-path').addPath(__dirname);
const { time } = require('lib/time-utils.js');
const { fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, asyncTest, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('test-utils.js');
const SearchEngine = require('lib/services/SearchEngine');
const SearchEngine = require('lib/services/searchengine/SearchEngine');
const Note = require('lib/models/Note');
const ItemChange = require('lib/models/ItemChange');
const Setting = require('lib/models/Setting');
@@ -16,6 +16,39 @@ process.on('unhandledRejection', (reason, p) => {
let engine = null;
const IDF = (N, n) => Math.max(Math.log((N - n + 0.5) / (n + 0.5)), 0);
const frequency = (word, string) => {
const re = new RegExp(`\\b(${word})\\b`, 'g');
return (string.match(re) || []).length;
};
const calculateScore = (searchString, notes) => {
const K1 = 1.2;
const B = 0.75;
const freqTitle = notes.map(note => frequency(searchString, note.title));
const notesWithWord = freqTitle.filter(count => count !== 0).length;
const numTokens = notes.map(note => note.title.split(' ').length);
const avgTokens = Math.round(numTokens.reduce((a, b) => a + b, 0) / notes.length);
let titleBM25 = new Array(notes.length).fill(-1);
if (avgTokens != 0) {
for (let i = 0; i < notes.length; i++) {
titleBM25[i] = IDF(notes.length, notesWithWord) * ((freqTitle[i] * (K1 + 1)) / (freqTitle[i] + K1 * (1 - B + B * (numTokens[i] / avgTokens))));
}
}
const scores = [];
for (let i = 0; i < notes.length; i++) {
if (freqTitle[i]) scores.push(titleBM25[i]);
}
scores.sort().reverse();
return scores;
};
describe('services_SearchEngine', function() {
beforeEach(async (done) => {
@@ -79,17 +112,92 @@ describe('services_SearchEngine', function() {
}));
it('should order search results by relevance (1)', asyncTest(async () => {
it('should order search results by relevance BM25', asyncTest(async () => {
// BM25 is based on term frequency - inverse document frequency
// The tf–idf value increases proportionally to the number of times a word appears in the document
// and is offset by the number of documents in the corpus that contain the word, which helps to adjust
// for the fact that some words appear more frequently in general.
// BM25 returns weight zero for search term which occurs in more than half the notes.
// So terms that are abundant in all notes to have zero relevance w.r.t BM25.
const n1 = await Note.save({ title: 'abcd efgh' }); // 3
const n2 = await Note.save({ title: 'abcd aaaaa abcd abcd' }); // 1
const n2 = await Note.save({ title: 'abcd efgh abcd abcd' }); // 1
const n3 = await Note.save({ title: 'abcd aaaaa bbbb eeee abcd' }); // 2
const n4 = await Note.save({ title: 'xyz xyz' });
const n5 = await Note.save({ title: 'xyz xyz xyz xyz' });
const n6 = await Note.save({ title: 'xyz xyz xyz xyz xyz xyz' });
const n7 = await Note.save({ title: 'xyz xyz xyz xyz xyz xyz' });
const n8 = await Note.save({ title: 'xyz xyz xyz xyz xyz xyz xyz xyz' });
await engine.syncTables();
const rows = await engine.search('abcd');
let rows = await engine.search('abcd');
expect(rows[0].id).toBe(n2.id);
expect(rows[1].id).toBe(n3.id);
expect(rows[2].id).toBe(n1.id);
rows = await engine.search('abcd efgh');
expect(rows[0].id).toBe(n1.id); // shorter note; also 'efgh' is more rare than 'abcd'.
expect(rows[1].id).toBe(n2.id);
}));
it('should correctly weigh notes using BM25', asyncTest(async () => {
const noteData = [
{
title: 'abc test2 test2',
},
{
title: 'foo foo',
},
{
title: 'dead beef',
},
{
title: 'test2 bar',
},
{
title: 'blah blah abc',
},
];
const n0 = await Note.save(noteData[0]);
const n1 = await Note.save(noteData[1]);
const n2 = await Note.save(noteData[2]);
const n3 = await Note.save(noteData[3]);
const n4 = await Note.save(noteData[4]);
await engine.syncTables();
let searchString = 'abc';
let scores = calculateScore(searchString, noteData);
let rows = await engine.search(searchString);
expect(rows[0].weight).toEqual(scores[0]);
expect(rows[1].weight).toEqual(scores[1]);
// console.log(rows);
// console.log(scores);
searchString = 'test2';
scores = calculateScore(searchString, noteData);
rows = await engine.search(searchString);
// console.log(rows);
// console.log(scores);
expect(rows[0].weight).toEqual(scores[0]);
expect(rows[1].weight).toEqual(scores[1]);
searchString = 'foo';
scores = calculateScore(searchString, noteData);
rows = await engine.search(searchString);
// console.log(rows);
// console.log(scores);
expect(rows[0].weight).toEqual(scores[0]);
}));
it('should tell where the results are found', asyncTest(async () => {
@@ -118,28 +226,6 @@ describe('services_SearchEngine', function() {
}
}));
it('should order search results by relevance (2)', asyncTest(async () => {
// 1
const n1 = await Note.save({ title: 'abcd efgh', body: 'XX abcd XX efgh' });
// 4
const n2 = await Note.save({ title: 'abcd aaaaa bbbb eeee efgh' });
// 3
const n3 = await Note.save({ title: 'abcd aaaaa efgh' });
// 2
const n4 = await Note.save({ title: 'blablablabla blabla bla abcd X efgh' });
// 5
const n5 = await Note.save({ title: 'occurence many times but very abcd spread appart spread appart spread appart spread appart spread appart efgh occurence many times but very abcd spread appart spread appart spread appart spread appart spread appart efgh occurence many times but very abcd spread appart spread appart spread appart spread appart spread appart efgh occurence many times but very abcd spread appart spread appart spread appart spread appart spread appart efgh occurence many times but very abcd spread appart spread appart spread appart spread appart spread appart efgh' });
await engine.syncTables();
const rows = await engine.search('abcd efgh');
expect(rows[0].id).toBe(n1.id);
expect(rows[1].id).toBe(n4.id);
expect(rows[2].id).toBe(n3.id);
expect(rows[3].id).toBe(n2.id);
expect(rows[4].id).toBe(n5.id);
}));
it('should order search results by relevance (last updated first)', asyncTest(async () => {
let rows;
@@ -389,5 +475,4 @@ describe('services_SearchEngine', function() {
expect((await engine.search('"- [ ]"', { searchType: SearchEngine.SEARCH_TYPE_BASIC })).length).toBe(1);
expect((await engine.search('"[ ]"', { searchType: SearchEngine.SEARCH_TYPE_BASIC })).length).toBe(2);
}));
});

View File

@@ -0,0 +1,752 @@
/* eslint-disable no-unused-vars */
/* eslint prefer-const: 0*/
require('app-module-path').addPath(__dirname);
const { time } = require('lib/time-utils.js');
const { fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, asyncTest, db, synchronizer, fileApi, sleep, createNTestNotes, switchClient, createNTestFolders } = require('test-utils.js');
const SearchEngine = require('lib/services/searchengine/SearchEngine');
const Note = require('lib/models/Note');
const Folder = require('lib/models/Folder');
const Tag = require('lib/models/Tag');
const ItemChange = require('lib/models/ItemChange');
const Setting = require('lib/models/Setting');
const Resource = require('lib/models/Resource.js');
const { shim } = require('lib/shim');
const ResourceService = require('lib/services/ResourceService.js');
process.on('unhandledRejection', (reason, p) => {
console.log('Unhandled Rejection at: Promise', p, 'reason:', reason);
});
let engine = null;
const ids = (array) => array.map(a => a.id);
// For pretty printing.
// See https://stackoverflow.com/questions/23676459/karma-jasmine-pretty-printing-object-comparison/26324116
// jasmine.pp = function(obj) {
// return JSON.stringify(obj, undefined, 2);
// };
describe('services_SearchFilter', function() {
beforeEach(async (done) => {
await setupDatabaseAndSynchronizer(1);
await switchClient(1);
engine = new SearchEngine();
engine.setDb(db());
done();
});
it('should return note matching title', asyncTest(async () => {
let rows;
const n1 = await Note.save({ title: 'abcd', body: 'body 1' });
const n2 = await Note.save({ title: 'efgh', body: 'body 2' });
await engine.syncTables();
rows = await engine.search('title: abcd');
expect(rows.length).toBe(1);
expect(rows[0].id).toBe(n1.id);
}));
it('should return note matching negated title', asyncTest(async () => {
let rows;
const n1 = await Note.save({ title: 'abcd', body: 'body 1' });
const n2 = await Note.save({ title: 'efgh', body: 'body 2' });
await engine.syncTables();
rows = await engine.search('-title: abcd');
expect(rows.length).toBe(1);
expect(rows[0].id).toBe(n2.id);
}));
it('should return note matching body', asyncTest(async () => {
let rows;
const n1 = await Note.save({ title: 'abcd', body: 'body1' });
const n2 = await Note.save({ title: 'efgh', body: 'body2' });
await engine.syncTables();
rows = await engine.search('body: body1');
expect(rows.length).toBe(1);
expect(rows[0].id).toBe(n1.id);
}));
it('should return note matching negated body', asyncTest(async () => {
let rows;
const n1 = await Note.save({ title: 'abcd', body: 'body1' });
const n2 = await Note.save({ title: 'efgh', body: 'body2' });
await engine.syncTables();
rows = await engine.search('-body: body1');
expect(rows.length).toBe(1);
expect(rows[0].id).toBe(n2.id);
}));
it('should return note matching title containing multiple words', asyncTest(async () => {
let rows;
const n1 = await Note.save({ title: 'abcd xyz', body: 'body1' });
const n2 = await Note.save({ title: 'efgh ijk', body: 'body2' });
await engine.syncTables();
rows = await engine.search('title: "abcd xyz"');
expect(rows.length).toBe(1);
expect(rows[0].id).toBe(n1.id);
}));
it('should return note matching body containing multiple words', asyncTest(async () => {
let rows;
const n1 = await Note.save({ title: 'abcd', body: 'ho ho ho' });
const n2 = await Note.save({ title: 'efgh', body: 'foo bar' });
await engine.syncTables();
rows = await engine.search('body: "foo bar"');
expect(rows.length).toBe(1);
expect(rows[0].id).toBe(n2.id);
}));
it('should return note matching title AND body', asyncTest(async () => {
let rows;
const n1 = await Note.save({ title: 'abcd', body: 'ho ho ho' });
const n2 = await Note.save({ title: 'efgh', body: 'foo bar' });
await engine.syncTables();
rows = await engine.search('title: efgh body: "foo bar"');
expect(rows.length).toBe(1);
expect(rows[0].id).toBe(n2.id);
rows = await engine.search('title: abcd body: "foo bar"');
expect(rows.length).toBe(0);
}));
it('should return note matching title OR body', asyncTest(async () => {
let rows;
const n1 = await Note.save({ title: 'abcd', body: 'ho ho ho' });
const n2 = await Note.save({ title: 'efgh', body: 'foo bar' });
await engine.syncTables();
rows = await engine.search('any:1 title: abcd body: "foo bar"');
expect(rows.length).toBe(2);
expect(rows.map(r=>r.id)).toContain(n1.id);
expect(rows.map(r=>r.id)).toContain(n2.id);
rows = await engine.search('any:1 title: wxyz body: "blah blah"');
expect(rows.length).toBe(0);
}));
it('should return notes matching text', asyncTest(async () => {
let rows;
const n1 = await Note.save({ title: 'foo beef', body: 'dead bar' });
const n2 = await Note.save({ title: 'bar efgh', body: 'foo dog' });
const n3 = await Note.save({ title: 'foo ho', body: 'ho ho ho' });
await engine.syncTables();
// Interpretation: Match with notes containing foo in title/body and bar in title/body
// Note: This is NOT saying to match notes containing foo bar in title/body
rows = await engine.search('foo bar');
expect(rows.length).toBe(2);
expect(rows.map(r=>r.id)).toContain(n1.id);
expect(rows.map(r=>r.id)).toContain(n2.id);
rows = await engine.search('foo -bar');
expect(rows.length).toBe(1);
expect(rows.map(r=>r.id)).toContain(n3.id);
rows = await engine.search('foo efgh');
expect(rows.length).toBe(1);
expect(rows[0].id).toBe(n2.id);
rows = await engine.search('zebra');
expect(rows.length).toBe(0);
}));
it('should return notes matching any negated text', asyncTest(async () => {
let rows;
const n1 = await Note.save({ title: 'abc', body: 'def' });
const n2 = await Note.save({ title: 'def', body: 'ghi' });
const n3 = await Note.save({ title: 'ghi', body: 'jkl' });
await engine.syncTables();
rows = await engine.search('any:1 -abc -ghi');
expect(rows.length).toBe(3);
expect(rows.map(r=>r.id)).toContain(n1.id);
expect(rows.map(r=>r.id)).toContain(n2.id);
expect(rows.map(r=>r.id)).toContain(n3.id);
}));
it('should return notes matching any negated title', asyncTest(async () => {
let rows;
const n1 = await Note.save({ title: 'abc', body: 'def' });
const n2 = await Note.save({ title: 'def', body: 'ghi' });
const n3 = await Note.save({ title: 'ghi', body: 'jkl' });
await engine.syncTables();
rows = await engine.search('any:1 -title:abc -title:ghi');
expect(rows.length).toBe(3);
expect(rows.map(r=>r.id)).toContain(n1.id);
expect(rows.map(r=>r.id)).toContain(n2.id);
expect(rows.map(r=>r.id)).toContain(n3.id);
}));
it('should return notes matching any negated body', asyncTest(async () => {
let rows;
const n1 = await Note.save({ title: 'abc', body: 'def' });
const n2 = await Note.save({ title: 'def', body: 'ghi' });
const n3 = await Note.save({ title: 'ghi', body: 'jkl' });
await engine.syncTables();
rows = await engine.search('any:1 -body:xyz -body:ghi');
expect(rows.length).toBe(3);
expect(rows.map(r=>r.id)).toContain(n1.id);
expect(rows.map(r=>r.id)).toContain(n2.id);
expect(rows.map(r=>r.id)).toContain(n3.id);
}));
it('should support phrase search', asyncTest(async () => {
let rows;
const n1 = await Note.save({ title: 'foo beef', body: 'bar dog' });
const n2 = await Note.save({ title: 'bar efgh', body: 'foo dog' });
await engine.syncTables();
rows = await engine.search('"bar dog"');
expect(rows.length).toBe(1);
expect(rows[0].id).toBe(n1.id);
}));
it('should support prefix search', asyncTest(async () => {
let rows;
const n1 = await Note.save({ title: 'foo beef', body: 'bar dog' });
const n2 = await Note.save({ title: 'bar efgh', body: 'foo dog' });
await engine.syncTables();
rows = await engine.search('"bar*"');
expect(rows.length).toBe(2);
expect(ids(rows)).toContain(n1.id);
expect(ids(rows)).toContain(n2.id);
}));
it('should support filtering by tags', asyncTest(async () => {
let rows;
const n1 = await Note.save({ title: 'But I would', body: 'walk 500 miles' });
const n2 = await Note.save({ title: 'And I would', body: 'walk 500 more' });
const n3 = await Note.save({ title: 'Just to be', body: 'the man who' });
const n4 = await Note.save({ title: 'walked a thousand', body: 'miles to fall' });
const n5 = await Note.save({ title: 'down at your', body: 'door' });
await Tag.setNoteTagsByTitles(n1.id, ['Da', 'da', 'lat', 'da']);
await Tag.setNoteTagsByTitles(n2.id, ['Da', 'da', 'lat', 'da']);
await engine.syncTables();
rows = await engine.search('tag:*');
expect(rows.length).toBe(2);
expect(ids(rows)).toContain(n1.id);
expect(ids(rows)).toContain(n2.id);
rows = await engine.search('-tag:*');
expect(rows.length).toBe(3);
expect(ids(rows)).toContain(n3.id);
expect(ids(rows)).toContain(n4.id);
expect(ids(rows)).toContain(n5.id);
}));
it('should support filtering by tags', asyncTest(async () => {
let rows;
const n1 = await Note.save({ title: 'peace talks', body: 'battle ground' });
const n2 = await Note.save({ title: 'mouse', body: 'mister' });
const n3 = await Note.save({ title: 'dresden files', body: 'harry dresden' });
await Tag.setNoteTagsByTitles(n1.id, ['tag1', 'tag2']);
await Tag.setNoteTagsByTitles(n2.id, ['tag2', 'tag3']);
await Tag.setNoteTagsByTitles(n3.id, ['tag3', 'tag4']);
await engine.syncTables();
rows = await engine.search('tag:tag2');
expect(rows.length).toBe(2);
expect(ids(rows)).toContain(n1.id);
expect(ids(rows)).toContain(n2.id);
rows = await engine.search('tag:tag2 tag:tag3');
expect(rows.length).toBe(1);
expect(ids(rows)).toContain(n2.id);
rows = await engine.search('any:1 tag:tag1 tag:tag2 tag:tag3');
expect(rows.length).toBe(3);
expect(ids(rows)).toContain(n1.id);
expect(ids(rows)).toContain(n2.id);
expect(ids(rows)).toContain(n3.id);
rows = await engine.search('tag:tag2 tag:tag3 tag:tag4');
expect(rows.length).toBe(0);
rows = await engine.search('-tag:tag2');
expect(rows.length).toBe(1);
expect(ids(rows)).toContain(n3.id);
rows = await engine.search('-tag:tag2 -tag:tag3');
expect(rows.length).toBe(0);
rows = await engine.search('-tag:tag2 -tag:tag3');
expect(rows.length).toBe(0);
rows = await engine.search('any:1 -tag:tag2 -tag:tag3');
expect(rows.length).toBe(2);
expect(ids(rows)).toContain(n1.id);
expect(ids(rows)).toContain(n3.id);
}));
it('should support filtering by notebook', asyncTest(async () => {
let rows;
const folder0 = await Folder.save({ title: 'notebook0' });
const folder1 = await Folder.save({ title: 'notebook1' });
const notes0 = await createNTestNotes(5, folder0);
const notes1 = await createNTestNotes(5, folder1);
await engine.syncTables();
rows = await engine.search('notebook:notebook0');
expect(rows.length).toBe(5);
expect(ids(rows).sort()).toEqual(ids(notes0).sort());
}));
it('should support filtering by nested notebook', asyncTest(async () => {
let rows;
const folder0 = await Folder.save({ title: 'notebook0' });
const folder00 = await Folder.save({ title: 'notebook00', parent_id: folder0.id });
const folder1 = await Folder.save({ title: 'notebook1' });
const notes0 = await createNTestNotes(5, folder0);
const notes00 = await createNTestNotes(5, folder00);
const notes1 = await createNTestNotes(5, folder1);
await engine.syncTables();
rows = await engine.search('notebook:notebook0');
expect(rows.length).toBe(10);
expect(ids(rows).sort()).toEqual(ids(notes0.concat(notes00)).sort());
}));
it('should support filtering by multiple notebooks', asyncTest(async () => {
let rows;
const folder0 = await Folder.save({ title: 'notebook0' });
const folder00 = await Folder.save({ title: 'notebook00', parent_id: folder0.id });
const folder1 = await Folder.save({ title: 'notebook1' });
const folder2 = await Folder.save({ title: 'notebook2' });
const notes0 = await createNTestNotes(5, folder0);
const notes00 = await createNTestNotes(5, folder00);
const notes1 = await createNTestNotes(5, folder1);
const notes2 = await createNTestNotes(5, folder2);
await engine.syncTables();
rows = await engine.search('notebook:notebook0 notebook:notebook1');
expect(rows.length).toBe(15);
expect(ids(rows).sort()).toEqual(ids(notes0).concat(ids(notes00).concat(ids(notes1))).sort());
}));
it('should support filtering by created date', asyncTest(async () => {
let rows;
const n1 = await Note.save({ title: 'I made this on', body: 'May 20 2020', user_created_time: Date.parse('2020-05-20') });
const n2 = await Note.save({ title: 'I made this on', body: 'May 19 2020', user_created_time: Date.parse('2020-05-19') });
const n3 = await Note.save({ title: 'I made this on', body: 'May 18 2020', user_created_time: Date.parse('2020-05-18') });
await engine.syncTables();
rows = await engine.search('created:20200520');
expect(rows.length).toBe(1);
expect(ids(rows)).toContain(n1.id);
rows = await engine.search('created:20200519');
expect(rows.length).toBe(2);
expect(ids(rows)).toContain(n1.id);
expect(ids(rows)).toContain(n2.id);
rows = await engine.search('-created:20200519');
expect(rows.length).toBe(1);
expect(ids(rows)).toContain(n3.id);
}));
it('should support filtering by between two dates', asyncTest(async () => {
let rows;
const n1 = await Note.save({ title: 'January 01 2020', body: 'January 01 2020', user_created_time: Date.parse('2020-01-01') });
const n2 = await Note.save({ title: 'February 15 2020', body: 'February 15 2020', user_created_time: Date.parse('2020-02-15') });
const n3 = await Note.save({ title: 'March 25 2019', body: 'March 25 2019', user_created_time: Date.parse('2019-03-25') });
const n4 = await Note.save({ title: 'March 01 2018', body: 'March 01 2018', user_created_time: Date.parse('2018-03-01') });
await engine.syncTables();
rows = await engine.search('created:20200101 -created:20200220');
expect(rows.length).toBe(2);
expect(ids(rows)).toContain(n1.id);
expect(ids(rows)).toContain(n2.id);
rows = await engine.search('created:201901 -created:202002');
expect(rows.length).toBe(2);
expect(ids(rows)).toContain(n3.id);
expect(ids(rows)).toContain(n1.id);
rows = await engine.search('created:2018 -created:2019');
expect(rows.length).toBe(1);
expect(ids(rows)).toContain(n4.id);
}));
it('should support filtering by created with smart value: day', asyncTest(async () => {
let rows;
const n1 = await Note.save({ title: 'I made this', body: 'today', user_created_time: parseInt(time.goBackInTime(Date.now(), 0, 'day'), 10) });
const n2 = await Note.save({ title: 'I made this', body: 'yesterday', user_created_time: parseInt(time.goBackInTime(Date.now(), 1, 'day'), 10) });
const n3 = await Note.save({ title: 'I made this', body: 'day before yesterday', user_created_time: parseInt(time.goBackInTime(Date.now(), 2, 'day'), 10) });
await engine.syncTables();
rows = await engine.search('created:day-0');
expect(rows.length).toBe(1);
expect(ids(rows)).toContain(n1.id);
rows = await engine.search('created:day-1');
expect(rows.length).toBe(2);
expect(ids(rows)).toContain(n1.id);
expect(ids(rows)).toContain(n2.id);
rows = await engine.search('created:day-2');
expect(rows.length).toBe(3);
expect(ids(rows)).toContain(n1.id);
expect(ids(rows)).toContain(n2.id);
expect(ids(rows)).toContain(n3.id);
}));
it('should support filtering by created with smart value: week', asyncTest(async () => {
let rows;
const n1 = await Note.save({ title: 'I made this', body: 'this week', user_created_time: parseInt(time.goBackInTime(Date.now(), 0, 'week'), 10) });
const n2 = await Note.save({ title: 'I made this', body: 'the week before', user_created_time: parseInt(time.goBackInTime(Date.now(), 1, 'week'), 10) });
const n3 = await Note.save({ title: 'I made this', body: 'before before week', user_created_time: parseInt(time.goBackInTime(Date.now(), 2, 'week'), 10) });
await engine.syncTables();
rows = await engine.search('created:week-0');
expect(rows.length).toBe(1);
expect(ids(rows)).toContain(n1.id);
rows = await engine.search('created:week-1');
expect(rows.length).toBe(2);
expect(ids(rows)).toContain(n1.id);
expect(ids(rows)).toContain(n2.id);
rows = await engine.search('created:week-2');
expect(rows.length).toBe(3);
expect(ids(rows)).toContain(n1.id);
expect(ids(rows)).toContain(n2.id);
expect(ids(rows)).toContain(n3.id);
}));
it('should support filtering by created with smart value: month', asyncTest(async () => {
let rows;
const n1 = await Note.save({ title: 'I made this', body: 'this month', user_created_time: parseInt(time.goBackInTime(Date.now(), 0, 'month'), 10) });
const n2 = await Note.save({ title: 'I made this', body: 'the month before', user_created_time: parseInt(time.goBackInTime(Date.now(), 1, 'month'), 10) });
const n3 = await Note.save({ title: 'I made this', body: 'before before month', user_created_time: parseInt(time.goBackInTime(Date.now(), 2, 'month'), 10) });
await engine.syncTables();
rows = await engine.search('created:month-0');
expect(rows.length).toBe(1);
expect(ids(rows)).toContain(n1.id);
rows = await engine.search('created:month-1');
expect(rows.length).toBe(2);
expect(ids(rows)).toContain(n1.id);
expect(ids(rows)).toContain(n2.id);
rows = await engine.search('created:month-2');
expect(rows.length).toBe(3);
expect(ids(rows)).toContain(n1.id);
expect(ids(rows)).toContain(n2.id);
expect(ids(rows)).toContain(n3.id);
}));
it('should support filtering by created with smart value: year', asyncTest(async () => {
let rows;
const n1 = await Note.save({ title: 'I made this', body: 'this year', user_created_time: parseInt(time.goBackInTime(Date.now(), 0, 'year'), 10) });
const n2 = await Note.save({ title: 'I made this', body: 'the year before', user_created_time: parseInt(time.goBackInTime(Date.now(), 1, 'year'), 10) });
const n3 = await Note.save({ title: 'I made this', body: 'before before year', user_created_time: parseInt(time.goBackInTime(Date.now(), 2, 'year'), 10) });
await engine.syncTables();
rows = await engine.search('created:year-0');
expect(rows.length).toBe(1);
expect(ids(rows)).toContain(n1.id);
rows = await engine.search('created:year-1');
expect(rows.length).toBe(2);
expect(ids(rows)).toContain(n1.id);
expect(ids(rows)).toContain(n2.id);
rows = await engine.search('created:year-2');
expect(rows.length).toBe(3);
expect(ids(rows)).toContain(n1.id);
expect(ids(rows)).toContain(n2.id);
expect(ids(rows)).toContain(n3.id);
}));
it('should support filtering by updated date', asyncTest(async () => {
let rows;
const n1 = await Note.save({ title: 'I updated this on', body: 'May 20 2020', updated_time: Date.parse('2020-05-20'), user_updated_time: Date.parse('2020-05-20') }, { autoTimestamp: false });
const n2 = await Note.save({ title: 'I updated this on', body: 'May 19 2020', updated_time: Date.parse('2020-05-19'), user_updated_time: Date.parse('2020-05-19') }, { autoTimestamp: false });
await engine.syncTables();
rows = await engine.search('updated:20200520');
expect(rows.length).toBe(1);
expect(ids(rows)).toContain(n1.id);
rows = await engine.search('updated:20200519');
expect(rows.length).toBe(2);
expect(ids(rows)).toContain(n1.id);
expect(ids(rows)).toContain(n2.id);
}));
it('should support filtering by updated with smart value: day', asyncTest(async () => {
let rows;
const today = parseInt(time.goBackInTime(Date.now(), 0, 'day'), 10);
const yesterday = parseInt(time.goBackInTime(Date.now(), 1, '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 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 n3 = await Note.save({ title: 'I made this', body: 'day before yesterday', updated_time: dayBeforeYesterday ,user_updated_time: dayBeforeYesterday }, { autoTimestamp: false });
await engine.syncTables();
rows = await engine.search('updated:day-0');
expect(rows.length).toBe(2);
expect(ids(rows)).toContain(n1.id);
expect(ids(rows)).toContain(n11.id);
rows = await engine.search('updated:day-1');
expect(rows.length).toBe(3);
expect(ids(rows)).toContain(n1.id);
expect(ids(rows)).toContain(n11.id);
expect(ids(rows)).toContain(n2.id);
rows = await engine.search('updated:day-2');
expect(rows.length).toBe(4);
expect(ids(rows)).toContain(n1.id);
expect(ids(rows)).toContain(n11.id);
expect(ids(rows)).toContain(n2.id);
expect(ids(rows)).toContain(n3.id);
}));
it('should support filtering by type todo', asyncTest(async () => {
let rows;
const t1 = await Note.save({ title: 'This is a ', body: 'todo', is_todo: 1 });
const t2 = await Note.save({ title: 'This is another', body: 'todo but completed', is_todo: 1, todo_completed: 1590085027710 });
const t3 = await Note.save({ title: 'This is NOT a ', body: 'todo' });
await engine.syncTables();
rows = await engine.search('type:todo');
expect(rows.length).toBe(2);
expect(ids(rows)).toContain(t1.id);
expect(ids(rows)).toContain(t2.id);
rows = await engine.search('any:1 type:todo');
expect(rows.length).toBe(2);
expect(ids(rows)).toContain(t1.id);
expect(ids(rows)).toContain(t2.id);
rows = await engine.search('iscompleted:1');
expect(rows.length).toBe(1);
expect(ids(rows)).toContain(t2.id);
rows = await engine.search('iscompleted:0');
expect(rows.length).toBe(1);
expect(ids(rows)).toContain(t1.id);
}));
it('should support filtering by type note', asyncTest(async () => {
let rows;
const t1 = await Note.save({ title: 'This is a ', body: 'todo', is_todo: 1 });
const t2 = await Note.save({ title: 'This is another', body: 'todo but completed', is_todo: 1, todo_completed: 1590085027710 });
const t3 = await Note.save({ title: 'This is NOT a ', body: 'todo' });
await engine.syncTables();
rows = await engine.search('type:note');
expect(rows.length).toBe(1);
expect(ids(rows)).toContain(t3.id);
}));
it('should support filtering by latitude, longitude, altitude', asyncTest(async () => {
let rows;
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 n3 = await Note.save({ title: 'I made this', body: 'before before week', latitude: 82.01, longitude: 66.66, altitude: 13.13 });
await engine.syncTables();
rows = await engine.search('latitude:13.5');
expect(rows.length).toBe(2);
expect(ids(rows)).toContain(n2.id);
expect(ids(rows)).toContain(n3.id);
rows = await engine.search('-latitude:40');
expect(rows.length).toBe(1);
expect(ids(rows)).toContain(n1.id);
rows = await engine.search('latitude:13 -latitude:80');
expect(rows.length).toBe(1);
expect(ids(rows)).toContain(n2.id);
rows = await engine.search('altitude:13.5');
expect(rows.length).toBe(2);
expect(ids(rows)).toContain(n1.id);
expect(ids(rows)).toContain(n2.id);
rows = await engine.search('-altitude:80.12');
expect(rows.length).toBe(3);
expect(ids(rows)).toContain(n1.id);
expect(ids(rows)).toContain(n2.id);
expect(ids(rows)).toContain(n3.id);
rows = await engine.search('longitude:70 -longitude:80');
expect(rows.length).toBe(1);
expect(ids(rows)).toContain(n2.id);
rows = await engine.search('latitude:20 longitude:50 altitude:40');
expect(rows.length).toBe(1);
expect(ids(rows)).toContain(n2.id);
rows = await engine.search('any:1 latitude:20 longitude:50 altitude:40');
expect(rows.length).toBe(3);
expect(ids(rows)).toContain(n1.id);
expect(ids(rows)).toContain(n2.id);
expect(ids(rows)).toContain(n3.id);
}));
it('should support filtering by resource MIME type', asyncTest(async () => {
let rows;
const service = new ResourceService();
// console.log(testImagePath)
const folder1 = await Folder.save({ title: 'folder1' });
let n1 = await Note.save({ title: 'I have a picture', body: 'Im awesome', parent_id: folder1.id });
const n2 = await Note.save({ title: 'Boring note 1', body: 'I just have text', parent_id: folder1.id });
const n3 = await Note.save({ title: 'Boring note 2', body: 'me too', parent_id: folder1.id });
let n4 = await Note.save({ title: 'A picture?', body: 'pfff, I have a pdf', parent_id: folder1.id });
await engine.syncTables();
// let note1 = await Note.save({ title: 'ma note', parent_id: folder1.id });
n1 = await shim.attachFileToNote(n1, `${__dirname}/../tests/support/photo.jpg`);
// const resource1 = (await Resource.all())[0];
n4 = await shim.attachFileToNote(n4, `${__dirname}/../tests/support/welcome.pdf`);
await service.indexNoteResources();
rows = await engine.search('resource:image/jpeg');
expect(rows.length).toBe(1);
expect(ids(rows)).toContain(n1.id);
rows = await engine.search('resource:image/*');
expect(rows.length).toBe(1);
expect(ids(rows)).toContain(n1.id);
rows = await engine.search('resource:application/pdf');
expect(rows.length).toBe(1);
expect(ids(rows)).toContain(n4.id);
rows = await engine.search('-resource:image/jpeg');
expect(rows.length).toBe(3);
expect(ids(rows)).toContain(n2.id);
expect(ids(rows)).toContain(n3.id);
expect(ids(rows)).toContain(n4.id);
rows = await engine.search('any:1 resource:application/pdf resource:image/jpeg');
expect(rows.length).toBe(2);
expect(ids(rows)).toContain(n1.id);
expect(ids(rows)).toContain(n4.id);
}));
it('should ignore dashes in a word', asyncTest(async () => {
const n0 = await Note.save({ title: 'doesnotwork' });
const n1 = await Note.save({ title: 'does not work' });
const n2 = await Note.save({ title: 'does-not-work' });
const n3 = await Note.save({ title: 'does_not_work' });
await engine.syncTables();
let rows = await engine.search('does-not-work');
expect(rows.length).toBe(3);
expect(ids(rows)).toContain(n1.id);
expect(ids(rows)).toContain(n2.id);
expect(ids(rows)).toContain(n3.id);
rows = await engine.search('does not work');
expect(rows.length).toBe(3);
expect(ids(rows)).toContain(n1.id);
expect(ids(rows)).toContain(n2.id);
expect(ids(rows)).toContain(n3.id);
rows = await engine.search('"does not work"');
expect(rows.length).toBe(3);
expect(ids(rows)).toContain(n1.id);
expect(ids(rows)).toContain(n2.id);
expect(ids(rows)).toContain(n3.id);
rows = await engine.search('title:does-not-work');
expect(rows.length).toBe(3);
expect(ids(rows)).toContain(n1.id);
expect(ids(rows)).toContain(n2.id);
expect(ids(rows)).toContain(n3.id);
rows = await engine.search('doesnotwork');
expect(rows.length).toBe(1);
expect(ids(rows)).toContain(n0.id);
}));
it('should support filtering by sourceurl', asyncTest(async () => {
const n0 = await Note.save({ title: 'n0', source_url: 'https://discourse.joplinapp.org' });
const n1 = await Note.save({ title: 'n1', source_url: 'https://google.com' });
const n2 = await Note.save({ title: 'n2', source_url: 'https://reddit.com' });
const n3 = await Note.save({ title: 'n3', source_url: 'https://joplinapp.org' });
await engine.syncTables();
let rows = await engine.search('sourceurl:https://joplinapp.org');
expect(rows.length).toBe(1);
expect(ids(rows)).toContain(n3.id);
rows = await engine.search('sourceurl:https://google.com');
expect(rows.length).toBe(1);
expect(ids(rows)).toContain(n1.id);
rows = await engine.search('any:1 sourceurl:https://google.com sourceurl:https://reddit.com');
expect(rows.length).toBe(2);
expect(ids(rows)).toContain(n1.id);
expect(ids(rows)).toContain(n2.id);
rows = await engine.search('-sourceurl:https://google.com');
expect(rows.length).toBe(3);
expect(ids(rows)).toContain(n0.id);
expect(ids(rows)).toContain(n2.id);
expect(ids(rows)).toContain(n3.id);
rows = await engine.search('sourceurl:*joplinapp.org');
expect(rows.length).toBe(2);
expect(ids(rows)).toContain(n0.id);
expect(ids(rows)).toContain(n3.id);
}));
});

View File

@@ -10,8 +10,6 @@
// console.log('Unhandled Rejection at: Promise', p, 'reason:', reason);
// });
// jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;
// describe('services_UndoRedoService', function() {
// beforeEach(async (done) => {

View File

@@ -11,8 +11,6 @@ const Tag = require('lib/models/Tag');
const NoteTag = require('lib/models/NoteTag');
const { shim } = require('lib/shim');
jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;
process.on('unhandledRejection', (reason, p) => {
console.log('Unhandled Rejection at: Promise', p, 'reason:', reason);
});

View File

@@ -0,0 +1,8 @@
const {main} = require('./syncTargetUtils');
const syncTargetType = process.argv.length <= 2 ? 'normal' : process.argv[2];
main(syncTargetType).catch((error) => {
console.error('Error:', error);
process.exit(1);
});

View File

@@ -4,6 +4,6 @@
"*.js",
"!test-utils.js"
],
"stopSpecOnExpectationFailure": true,
"stopSpecOnExpectationFailure": false,
"random": true
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,14 @@
id: 007d5df404684729a7833e7196d07d88
mime:
filename:
created_time:
updated_time: 2020-07-25T10:37:00.411Z
user_created_time:
user_updated_time:
file_extension:
encryption_cipher_text: JED0100002205c24138199f5b403fa3e9b8b4f22685c5000308{"iv":"i+K3fJqvCqw1qX3Fi1E5qg==","v":1,"iter":101,"ks":128,"ts":64,"mode":"ccm","adata":"","cipher":"aes","salt":"O2duAuTVjV4=","ct":"XckTdEnM03a9XUcZA4tYnQPl2s1lrg5kle1lssNg25XFoTHFiiHOl9Qf6FfFrFk1EHmXWePwtO7ejz+cUPeW+iMY/ZWsGWGHMWkiX+8EeXy+O45onsLdhjObuC2APKFxwsJyDR04PfaYyHCd5CsSoVZ6KEZ7ay0uJT6hMswnGHvhSDdN58jEsyfGyifDmTP4spE2NjgWzUF6ibi57BVEafYSE8ew9SD/IjFcvu1dTjoMvUfbcRZwxu5W7bZp9wuEQtbAKE2S1qJpoObkJkpTuivyOty2URxcLnDl7YKLDYxtvgVxQswTP6AzUdVdqhS6pA2MT0LqsbgHrpmILpW+AiPBc5Cz+g2zQu6wBP1lg/Dra+TiCH+qBh4t+Lq5ClM+7xWFMWM9lFq1uwVIks2Mh/LS7HCjkYE6uJteRK0J/o++l/X/V0memCFIoUjZ9TAlnXubgi9U0fFJYSbInOBS0RcoLGi4iBMtn1l5aMRt3aCEajny14kFB9zY/IBIWV0C3B8vnVbauw4dZDXZbiEW+uT4y/4D1VwFLuZiVmLpdbkrRMvNduoSBkLHqnAmNPxb5GK0v+9gp6lTXvZ4w5tklG4IGHWufsNYbCkYkbnZsZp3tWSPs3A/CUdDPZZnpC8A"}
encryption_applied: 1
encryption_blob_encrypted:
size:
is_shared:
type_: 4

View File

@@ -0,0 +1,10 @@
id: 02ae45554c254114a671fce2928d4bb4
created_time:
updated_time: 2020-07-25T10:37:00.281Z
user_created_time:
user_updated_time:
encryption_cipher_text: JED0100002205c24138199f5b403fa3e9b8b4f22685c500027c{"iv":"CGfuz3tdhFlgIQqRPcx6gw==","v":1,"iter":101,"ks":128,"ts":64,"mode":"ccm","adata":"","cipher":"aes","salt":"O2duAuTVjV4=","ct":"0+4k/qodJ9t7948TjR1VR5BT2VFs9/SUK5fIbXBTBaqCS3tnvHTkWdjQZPQqRoMqCW1bx9QvMUMI+itJy0YghUqzcUfEOP1yM7MPD78/pSkxCapTc+hB4tuLzoqXGt+JOC4ibUGwydVdshgF+5Vie0vinvmdOxoNW9piiY+hf+ZbFEc0NO5gkFcNdY6WNIUFzvCvUkRlr1n1X3XcwjMwF5DtWpxN3kvOEnWU/mSVP0V3oV4TrkVfVK7UJbvv/ntV65tmV3ByiHwjJy5ShRrqdczTj32C5RU9Hd+ZB4BlcdNNgFwnr1Nc0tNYqOmzOHE2T2YYhsSD3m9rowpP94AqB5PQ31JFSbjeDGCOARiyuyIGJsNGFBdHHgvWyzDzTwSRTwtHjQK+NlRtfKPVBBvhNfDxhmSw+0Lkio5gR9DFaMNvV+PStKTJgL1W4p1pHnSPxWkAz6c/ZWt/brHrfXOVUjo5nVcOLTU2OpQeKRLoEphR37GgMQpi"}
encryption_applied: 1
is_shared:
parent_id:
type_: 5

View File

@@ -0,0 +1,24 @@
id: 1241f69ccbf54c0188b2f4a02e862b40
parent_id: fd8204c333c64762b592e19513f38cad
created_time:
updated_time: 2020-07-25T10:37:00.413Z
is_conflict:
latitude:
longitude:
altitude:
author:
source_url:
is_todo:
todo_due:
todo_completed:
source:
source_application:
application_data:
order:
user_created_time:
user_updated_time:
encryption_cipher_text: JED0100002205c24138199f5b403fa3e9b8b4f22685c50004c8{"iv":"Fu/ll4tQJYfxuwjlf8eHgQ==","v":1,"iter":101,"ks":128,"ts":64,"mode":"ccm","adata":"","cipher":"aes","salt":"O2duAuTVjV4=","ct":"gD7KXFmMaqQv8bMGCDyCCZHSseoVOwVJnmJPpYnCCX+W8PkWEcVDY+OGshvrgViIlEGqo0n0wXC2puvjY8vN1pjOFezhwL+nED1e5C4qEEciWHVlPkMgNDGCTB1/WRIZ312q5x+vQAaMWlfN5UyLw+aeZ2TADOFnMV3YfUx1uxTvX3Xk0XkAuYVbMgsudQaqHYfjma0RO4MokGnVfdz6TY5X1drzPWJbVl5ZjLBwWiFQoEeTZhfYh6V6XYXA5jb+yDW8LWkkNuL2HEjVFBpw4r9DpO3f5oy69quYXDarghBM2FCl1FuWhA9CM/6ETb4AABXBxW1ZVdcmjt5uaACzxPprWyZGUNgetgX7osT3+HOJ3OejMlEzin5AiW2Qbxx8N1DiYiTMtlyvfYT0DWH1okX2o/SslsB1tGSFuNHeusJXKkbBs4uFzXVElT1e9E7nrpOLCA8N1Q2rparFA3P5IVvik4i5jJ7lSiWc3sHgJ+VEokBHNkZJ0UxhFxxE5mT6QW4Uh4YcdUJocr6MCPICpY9Kh8jpG4ixwBAQ2VtYlEAEYyjHxARO8jb+TwLp4V0whU5NI+tiuwuGXQMOj7YGnf96MQv/X4HDhQu77R1sfq33AjizWIbhEq+svdOgwqXXEUmt//3JPC82vmASP3OVfDwCGjSy6iLLio/tnlj6UWcJepWciAkNIbXDWbCKzGyvjno6tVH/G12gLz4b0Br9fgzLurRVvhqjtLW38WVvS66reG1XNIUFfTh2ZAQl+tB5KGylrt0Vv1L/WpA3axC70KYZdzsne62r/uFChMt9WbV/wY0s2z95bVvIvPQHdDtS9kTd/8kUk3mM6ZW4IFwrmA5rcMK63ygf46fSqT5CFdMm89hQOxdZqZBtU4fwIINvkPwk4FneyIB7CofjwzijCTuP5NRqlFsYBuKjxDbsV0hK16X1pMxMe/kPiTJvVFCEcJh93kIQVvwFYKTgQjn0w4NByyvbZq3lsLrUEHiGW8yYLKq6Hl0eRhy+70fOb1KEQujhcxVXqE80aQ0+hEinT9qdF5xi9N5rOi/aPvZaA+D6IGOmpevq5FB7D2H4iYE="}
encryption_applied: 1
markup_language:
is_shared:
type_: 1

View File

@@ -0,0 +1,11 @@
id: 13a4818351b14ad8ab0194392c877172
note_id: f0aabe7de88d47c2ad4ce26d8d5ce70c
tag_id: 02ae45554c254114a671fce2928d4bb4
created_time:
updated_time: 2020-07-25T10:37:00.289Z
user_created_time:
user_updated_time:
encryption_cipher_text: JED0100002205c24138199f5b403fa3e9b8b4f22685c50002d8{"iv":"Bzi6SZCXxmvSpAc+WqAoXQ==","v":1,"iter":101,"ks":128,"ts":64,"mode":"ccm","adata":"","cipher":"aes","salt":"O2duAuTVjV4=","ct":"sQvK1uYKaD5mxleN1XLjZxELueRCXxIrI4dGN2hC367ZqXsOiHfaCgatwzEEi5Oh4Em2AhUs2nnzkZ12dgejLXZDFmHHA3X1en+rZ7evHWla8KGa2xwUznFBRZM8VkaML34wC5vu5RiP/hII6/eJTmGPa9dffklSzc+Tu8JfvCMaqGLvFoelqw4WLYzo5k2bYnNJkhIOd65bTtPVzaJ6H3WfBhp9dPGyZ+obodq+SvIaTwhqrEJS9UnmzW7Sbp6E+ySFmrXRjbWxLJv5wjRjCR8IzZVfqzb3XCmbQootyG5bO0jzRfZzLhl5Dnlz2rtgqdL9An4DcGJjD7rp701TTbxk+p90Fi/H7hjUnX7HKG0iacaYzBcsZCIDfF261wTz7wmibfQNEX0ZenRVCPOqxv8tMKZjiDqV5gyzmW5z1eeX1Cf4xJv9NK9TintQtoZJzi7AtuGst9hBSDWjDfe306i1asMhARLVonZBCGT7dkumOTt6dPlaQ49pp4N4IiRLzkMLhkQiAZC6mFy3Hx92J6ttRCS/OO3CK7AjbnpOkyGsqc/l8qoNDl80+VYp281lhSIV/+YdNqInWg=="}
encryption_applied: 1
is_shared:
type_: 6

View File

@@ -0,0 +1,24 @@
id: 273392c6dfee427b90225e7d1de78dfc
parent_id: c65e06fbbe4d456aafbbf0264be59e06
created_time:
updated_time: 2020-07-25T10:37:00.287Z
is_conflict:
latitude:
longitude:
altitude:
author:
source_url:
is_todo:
todo_due:
todo_completed:
source:
source_application:
application_data:
order:
user_created_time:
user_updated_time:
encryption_cipher_text: JED0100002205c24138199f5b403fa3e9b8b4f22685c5000470{"iv":"9h8HViDncwtQ5MTmX6YX5Q==","v":1,"iter":101,"ks":128,"ts":64,"mode":"ccm","adata":"","cipher":"aes","salt":"O2duAuTVjV4=","ct":"pkTL3kN1RHCeAdRM4kzfJSskVi8Bb8MfBDH289hp2GQpH2i10jlvwUMw6wz1CeCdvORS0TajGqvmR3phB02zAv0TmHpxLr2GCfhDA1Qbw1v0h4deT3xic2j0IVfzuCcwsaTi5Fa4y6jm322eiRkDpGNrKSLb8s8ETbED6oXeCAF1fuD7ZEtkPsM4fE3WbGyd5KjfSKbS0gi/f1CgO86iGDZLckt0EgnyuY7Ajo0bOrUR4d1PVKls0PszXrZRxbskMXznFlykhtTWhFGYBn+6jqfx39p2CqIkfMPWHPahSu7QI98rST40sWi62dMLzkMSV21jD20zMdLqSYSuTy7XW4aE7Nt/7P7omRsg/VFuNN7p4oaqRDJ2+jCNtMGKs6ptJ4BI8jZWeWn4YdjWpLVPddaEs9+lR9C/5Ed3WDUXrSGO5iGjLa+XiiT2tv4AbJ6yQDQBL7KTUOtIpXHaecrMj2f0iV63Hkrbj38MbliTyvE4I0gN/XTbhQ6WQoO+nQD0nq2PurwEhqqtWwHk6TgMVDFb+LBHxsNVw3sEhsavCe2WnnKxE4IvcGpg4a7v5xbS1rDb8ESI0R+6UhQw76j68E/HyVbiq7OdvVE1GSbf3soPA7K4sO7oTJPUAwkui467OAJUFmDzuRUd9tFtPagkHkryUKt1ebp+MB7iyZZ3XI/UQ5xZQE3QAo7//ZfV2VToiWJQl4LGX+y0XHZSgepsTu79EwL1J6doaXH5nryxkKbaimJq/K8yUNltLaba3frkrqaDPn8W6xmu0letwQc/KcCxm2DFls1E0GCKdOD2vCjW+m8grilH2WqQUqHdvV7TWjTd2xeUunR+GM+k4+KWUhrk6s/iyZOfIJ2KYUDvE+rC4iqHGz/8NHb2U1dsSveSMz9tJLuHixQ0HaRB4NX4e4G3oOvSMaw3nz4hENtDjKiqbGIaPaascwLb+DCEAo1aXWC+dbjVezcQMnh4eCUMIliDSqWUnVxB83wJ5dE="}
encryption_applied: 1
markup_language:
is_shared:
type_: 1

View File

@@ -0,0 +1,10 @@
id: 38cffde11a904a4e89f831e6229b29f5
created_time:
updated_time: 2020-07-25T10:37:00.305Z
user_created_time:
user_updated_time:
encryption_cipher_text: JED0100002205c24138199f5b403fa3e9b8b4f22685c5000280{"iv":"ufAfgTWBcXyhnZiC1VA8Mg==","v":1,"iter":101,"ks":128,"ts":64,"mode":"ccm","adata":"","cipher":"aes","salt":"O2duAuTVjV4=","ct":"pafLtHeZoT5Vzt3XmifdAude6/2owCdwWeXg3SCVbZCeEExJg0BKfe6Bu55ckud5nNcEpG7btZa5gnMlc0k9RRgAZXydvrOHdH1yCKGX2emBFHD0VOt9sfOPIaoR3UaRLUxFMyWWUXxJm/MfrLvGxv5z/jzkzsQvn4gIXjPRGzNuE/aYL51ZDdwznW0gJzumZCUXXAYQP8vCyuMZhvoxfP8Vb1e37Y1Hl40SaqOOtxqY91luNpsqfRvXB5DPmiEtEsYXOp7913Ya+u0ufKwBhDO8sq7pNzaz60z9RMhKa2ide4N1ngOLTaiwcgpn5N8DhnQfXjzEn1v3ceFX0SBOZQWMGw/OpOBZUocOAFNaUB4f+LiL+Q+e3XFFEf+W1Ut52D5ekVcZzdIEDB/58BGsc4/Ifi8dDI2ASdzriLVSqJRlkv64AvsoGpNSEgMWzWVRtrjqDGbN1dzMddZqAV9/HB08OuNqWYm2sGYfOF44qcUKgv0JADKCa+e6"}
encryption_applied: 1
parent_id:
is_shared:
type_: 2

View File

@@ -0,0 +1,14 @@
id: 49774b5e3e0e460aa70308a43c94cebc
mime:
filename:
created_time:
updated_time: 2020-07-25T10:37:00.276Z
user_created_time:
user_updated_time:
file_extension:
encryption_cipher_text: JED0100002205c24138199f5b403fa3e9b8b4f22685c5000308{"iv":"tYDqKe/kszjggCifj1KUAg==","v":1,"iter":101,"ks":128,"ts":64,"mode":"ccm","adata":"","cipher":"aes","salt":"O2duAuTVjV4=","ct":"i/meCIxFgfziCMlirvSU4Bq/9bMQXXwTYlrD5cw9O9Bs/YSabSzfq1WgR9KX+hX2chBMETjZ1mdrNR9jvm+MXUPFoBn8KSU+KpVVCMK3SsVdpBkvziy3YgToz4lo4nMoVvS+/Uhfd+RgUfDQcs/VTXgWK5zr30/ciDTA4Pe5PvHeEDLG7m/wTpI0YaVNRYiuk3T0/7+njOM8SDfQn3sUXwB0hv1uR0nKEFT6dYcUZ5tVrMH3myJRw0wng6oOH7fUsLqM+dJl8xdn8nabwQZSQHNkJvcGQmvDZR8AKV4RsGHwXZpmx/bl1NnBITd+ymQqJAPs3Mk83bpUPyWLoxWxJOeUxzbXuQ3LXS4WLsR6Z/AUjHEq3W3U013igSZvuBDFrli1AS6Fe7yr1i96B6xaLG59Kd4m+GO0KqyatJ/R5QiSNKL0x8fkmPGyYHvuRBYER6EZ1idRoqjwYo2pNF+OQ9JmLXtrurgczQR7ycnKAcj1s2Hf2ALAXSfrESWppjpfGdh7NzV9PC004wmD2CTTjcbHIKSgitJ5prAwo0WWHN1bo0PwMtJ7uphTiEUB1X0DKqV0S9OkNayXcORqazUYjdg5myHvwIugE34eOEubSO8Ot32V/MVO031Wuud9iwD1"}
encryption_applied: 1
encryption_blob_encrypted:
size:
is_shared:
type_: 4

View File

@@ -0,0 +1,24 @@
id: 4bdf2edea2514750beb9b2e82c7ec544
parent_id: 77c94e3da5d44db28eb485162d1b3f41
created_time:
updated_time: 2020-07-25T10:37:00.300Z
is_conflict:
latitude:
longitude:
altitude:
author:
source_url:
is_todo:
todo_due:
todo_completed:
source:
source_application:
application_data:
order:
user_created_time:
user_updated_time:
encryption_cipher_text: JED0100002205c24138199f5b403fa3e9b8b4f22685c5000470{"iv":"U2fkg8/0GAMH3F00ElUi+A==","v":1,"iter":101,"ks":128,"ts":64,"mode":"ccm","adata":"","cipher":"aes","salt":"O2duAuTVjV4=","ct":"UKWdwk4IkghRmriBiLbxCZGsx/q5T0mkkzIt4Ldzd1IeMeFPN1Du18lWypRaqrg6bKCu/Nxg98xRMTsNImyt+uGjzejN1tCdAp8GicapqwoLZSPaBLVbp1oDRNegL0srlisNkSOnlJTb1fFWk0VPo8tseTVjThiRDUBh3bDhLociZOj254g4V1a084H+Yuik1Prc8GdDlAs6UGiErmuA+g2Rr13u5Pedo/tf9QLmG5+MZvBU3Ix8NFYSzZjtS6cGKiw/FHUyYY2D+cdRJwIqnbz+ORa1UEHwLLGsOUZfdE3BRz5UZYd68vYFWny2RRjokWQwcFoAZpfuNf0160jpZWFQtcL3JpNv3PY/OG06Wz6vm0H5/9sDhHTltVoyZCnt7zyZOobBLyx+0rpfVmwJ5RmkIYheH6JygnBW3OM82Nc1qdyUCo8SUAVjQDMfZPbTBcES0py3IQ/1K97A3/KGgWC+zl49hk/J7yIlN0/EKJS2YyqydDZwlEgbIRGxTWIJKI80Y/zuPMoVCTtE1+vZD71z9LO3XKNMo6jOG51spA0/zZUOolUB02zOi1MVqjKL+6xts1ngJgW+6zDXbafVknK8I+y0/selPC7PQxVctTWJh+sl98PIyWPZZ/sKOwfgtW71lc5Rl8+PtIyFcY1GBbQbGiW8Cv1+/vjymI8ng0d0Yib5aEHRvAwAz2uKEPl0sMZ0HFbfpae5Da4aqBhE21e5YHSx+qIeEIscOiVT/jborw6xkahgv3A7kj6UOLtwkrIrpZQ1GhcwOOkU9YVCt/4urdtU7LJ0X1DlLzdlyMe2ccsSbCpbtHzFRMpIv9ULNT6xQK/ft4KHvcfI3vuJLUGJkFBZ+REgKwOLgY3kpasT5LbmjnaXBbTtQ+nsHjr317UBPt1BwYon/hJ8XKPKrUB+t/r5zMahX60sJzSxyovvf/pk7rV0yfg4/5R4h20X1KmSPUNPDtNvDeX/REDyXV6GIRHHDzgRPGVHqAM="}
encryption_applied: 1
markup_language:
is_shared:
type_: 1

View File

@@ -0,0 +1,10 @@
id: 5d2c4d63c7024c74b00ac408b26ea727
created_time:
updated_time: 2020-07-25T10:37:00.138Z
user_created_time:
user_updated_time:
encryption_cipher_text: JED0100002205c24138199f5b403fa3e9b8b4f22685c50002b0{"iv":"LeW8eFn2oATMCQs0oiCf6A==","v":1,"iter":101,"ks":128,"ts":64,"mode":"ccm","adata":"","cipher":"aes","salt":"O2duAuTVjV4=","ct":"h9zMjfOx/0gYdTS4uXdPLkXvDEiYzhGgr+0GuQeFb9vWOuj+qUqjhV04ZZVqvQiUYRJBzSgCBF25CsBpvOYUF8z0WrAtAANHFMCOTT0zBHXg9nzRBAl934XWrZ92zfeOUZ+U5FWIHVEjpImXGC97nwT0x0W5vHw54tsxguenMkPWFGTbfg/hQFeofmOpWHMZm3CJ/MYgJzw8WCHLyY4gRAeYZv/H789FT1csAtNe9w6zgnUyYlIfkYRmi3HA6wOAN/D4EaPdf4POH6Ma2ZnvONfLYV6n2hJizmCqJwr9uhwnmJWuv5CjTNZ7L1RWudYQRRy8db9c+uH+zFQ3nGutiIDl9ka0NdC/xaBv3QzVVdkgM2rIkbf7w+XnXhSveEfhDDpZaljorc+L+Aw7F45JXczPfKc5B61eiK5Df4R5gNfcwqgqTwhTwVeuHaOVQfOeYIpSRr2Y06RcsvEXfUXkv6+Yve7y7xrkKQw3V8lUD+bERtygyE8x41y7padQJm61bVP6IlYPtOu2v3ctzo/CEY6PP+dV87UmzXpxqPs="}
encryption_applied: 1
parent_id: 77c94e3da5d44db28eb485162d1b3f41
is_shared:
type_: 2

View File

@@ -0,0 +1,11 @@
id: 6db42e4e9c0b43ed891269d8a0508c76
note_id: 1241f69ccbf54c0188b2f4a02e862b40
tag_id: acbba73d7a1a46848ddc96b96c64ec8b
created_time:
updated_time: 2020-07-25T10:37:00.415Z
user_created_time:
user_updated_time:
encryption_cipher_text: JED0100002205c24138199f5b403fa3e9b8b4f22685c50002d8{"iv":"4y/iBWttvQyriXqtS2CGHw==","v":1,"iter":101,"ks":128,"ts":64,"mode":"ccm","adata":"","cipher":"aes","salt":"O2duAuTVjV4=","ct":"0p7EzmL/RzbEWyNcYfAL74fe3biMcNKyzNniXLNFcQphuBFTfLRp7zo6w6wSZ+cX//DTlA7bzPUz4/Vh7KRqbjqdEreSS6ZDRFfc2mT5rMW7msfbxvYOwg4iu3B/FfEUXM55GGHuzHYirkEQvpO0tjI84StZ0vXvUXmXxnOuizcKWrMHWDAAo41pAVIvncOFTnNfYPB+KIlG0WQ1gHgQgclpAYRrm0P/CM/sr/hQQWyH8exc+ToUg0JRmamLs12qHAYmXMlXfwf66vHhYBBGEj8mXErnp0uj6CtENE6AV2QdrEz1QcRa/XwmNb2xDNxS6+UaISzE79UrGNY4uO5om0YQRRhZpmC3A0QUzyd4VF5dEKaar/9W5wXJ/PKSw8l0/KJaNVNGhqLux0mlfEaAhRnzaFkru/JuIGY79hasyJl5l1ANEx9eByRAaLCq8HcQvm7yKva5/7zwHJi/zMVc25sQvmV/owUb+hVFifRfp3azkSj2826kRqJDwc2bXJHRGs7yVCeNuRdoSbAZuve9hUud46MjqOr2/MQ/ml7LQXtufba+WBB0gtheVE12l5ceKps5ejEa6mu2wQ=="}
encryption_applied: 1
is_shared:
type_: 6

View File

@@ -0,0 +1,11 @@
id: 702aeb4225844c19b85bfbd661e7a298
note_id: f0aabe7de88d47c2ad4ce26d8d5ce70c
tag_id: acbba73d7a1a46848ddc96b96c64ec8b
created_time:
updated_time: 2020-07-25T10:37:00.297Z
user_created_time:
user_updated_time:
encryption_cipher_text: JED0100002205c24138199f5b403fa3e9b8b4f22685c50002d8{"iv":"GyiqQTZ3ifi1IQ6X9FwzUg==","v":1,"iter":101,"ks":128,"ts":64,"mode":"ccm","adata":"","cipher":"aes","salt":"O2duAuTVjV4=","ct":"dhwC/A+NRxH2ol++8l/08RXGm/yuspLrMrXgjkaU/E+Twa0szoc4+bOgyTfV5gWpw9zoxHVDW0sq9R8NeS+nYQiIHNdWJuH8Dq2Qz5BIGca4uK+3InOI9zyD4F7YeP9MPZAPT4Kzj2QPbyschS6YaT1D8nYD2ruBZC9rMUY2o3wnjtDjgIV+vFlbbMQ6PlOQ0dmT76ooGUuq+dc1eWmWgKtXynLQoHg4uuBMfAbd5+o08Tkd1OJReW6He1nSOlmEr25ZzXJoC4BrgeY+BAB+jlYR3wENFzX1fdll6JkETRayuOEqpKPRuKhbgu9xeqzOsIoFGiBbmbANt14s8Vrj9OiazCvzQ9XywGQ3dMpKJZn9uLlDuxb8f9TFREuqXJVGcCK0P0xsmffnR8mfqAYOJHF1i6xDl3frSixghgg3giOHeaG14a9dL/acd1QwSia9ufWMMxxz8ZZPjP0z8edVmg/ItsdbQlt8fGwC0XqHAz5r3eRI3CwiFF1iVfzza5aLqXkyFbctJ5frMiMagpS0iRDPZ9srIVAElrHyYIYm4vTjA39H1BaGyNxb2twpT9T0yGOWyeLDNbdG5A=="}
encryption_applied: 1
is_shared:
type_: 6

View File

@@ -0,0 +1,10 @@
id: 77c94e3da5d44db28eb485162d1b3f41
created_time:
updated_time: 2020-07-25T10:37:00.136Z
user_created_time:
user_updated_time:
encryption_cipher_text: JED0100002205c24138199f5b403fa3e9b8b4f22685c5000280{"iv":"aonRUkc+I8fOC0+ddwNXuQ==","v":1,"iter":101,"ks":128,"ts":64,"mode":"ccm","adata":"","cipher":"aes","salt":"O2duAuTVjV4=","ct":"dK5Nx0BnkpiZmIEZ3oZ9xs3r6UmcmCrFqiSwRG2HCDMp79Sigws2x1kPAc+ALcTJfHZbK/9KBNHD7xyyUitqEA1pHVajuTVauKlYmt7M8sZFka0r+e1W5uyZhdUFF0oFnn+uBM+I7ZmMxpEIQSLZs9Nq/m1pmLh/UhmKPazPFTL5SG2rEKC6TVzJ5MgGPG5bohOrkU011drK/F+zokn0EP2VXFLhGVzj6C4AE3s+fQxqV5Ct5ctz6Q1Vj1vgrDSNMdZ9rBYxufvYkZEP/jQvpmmiW2BPWtboX+2M9qJrXoI4hRKh4/NzKsDTZtG8N+wL7nn/h8VCk9XcwTWlkQxH/xZa3MpyYIGT0Q8RaGwdkYC6yYcASJLGoawTj9vxeSUnsFhV7dFYv2IwR+ct4LII7bOtPo6OO7Tf5+kcLURE5WQ+YH1/K72zVA0iOjmrG5hEMKBbwlXpiRJKlc+fc2ZUaCZUfJujjQPsrUGd7x2mPVXEj4wJ6+e1Ban3"}
encryption_applied: 1
parent_id:
is_shared:
type_: 2

View File

@@ -0,0 +1,11 @@
id: 7f038ca8a227471d997a5397fc13eeac
note_id: 8e9ac6678d1e41ef8675ba8127408476
tag_id: 02ae45554c254114a671fce2928d4bb4
created_time:
updated_time: 2020-07-25T10:37:00.283Z
user_created_time:
user_updated_time:
encryption_cipher_text: JED0100002205c24138199f5b403fa3e9b8b4f22685c50002d8{"iv":"0vyocm4M9thhoWfueZcyIw==","v":1,"iter":101,"ks":128,"ts":64,"mode":"ccm","adata":"","cipher":"aes","salt":"O2duAuTVjV4=","ct":"JujW3YpFkqgvTfDZEZW+uK6uxKcjV+e0Q95TAMTucQpaeeFw0RBHrgfyqji0LPvR4Oy4PGtM/f9LBaO2Gx4yJagUHDBe28pPmD3NDMSutRKxYm4yZVleAvQlNnBiRKOzaAYBgYsWFl1q+8NggWuQFmUF16mXOIYYb+MEhinpyQx8fXONc79joHHJ5oBvGKBaTonRdOzyL/+fjG9JhqvIZrcp+A6DSRK20qgafhOcfAlzTd9ISxV9icLIvLS59zn80sNTMiPwst00KpRMzqBFGp0+c7q+r948Xx5p3FiMOP1gO0dUSpklyQnDMUL64smHVYqkqSWj+TI+KMWFXrQg7HQYG7nFbGRBW+I5aICgwfP2IYtPUw8zElso3ONmPqTTFiLfpIvAGNutyc6pVL1w5NVBwvzS8JVOlfMDejXMDI5nSov7lsuwV8CGbrErGev0c3JVvJHyKYiZYYLTX3/BBogTF5L7AR5jx6SvMiczWvmU7Bxhq37P9GaWFKPsB5JysG9gjrVxLTikkxv6evPqxKMHqIhSSCmi8lWR2KQk+EaE4yTu4tkfSYpyirj/WOdi2S+jmrqWOWXiIg=="}
encryption_applied: 1
is_shared:
type_: 6

View File

@@ -0,0 +1,24 @@
id: 8e9ac6678d1e41ef8675ba8127408476
parent_id: c65e06fbbe4d456aafbbf0264be59e06
created_time:
updated_time: 2020-07-25T10:37:00.278Z
is_conflict:
latitude:
longitude:
altitude:
author:
source_url:
is_todo:
todo_due:
todo_completed:
source:
source_application:
application_data:
order:
user_created_time:
user_updated_time:
encryption_cipher_text: JED0100002205c24138199f5b403fa3e9b8b4f22685c50004c8{"iv":"znLFDnyMp5GRMKfPfeStNQ==","v":1,"iter":101,"ks":128,"ts":64,"mode":"ccm","adata":"","cipher":"aes","salt":"O2duAuTVjV4=","ct":"olRcMcvwK5q4sCWDVkCTXMaHFNJk4EL0LGb7/t24wc9g+BsLOOmokfmxNvxMNKnCu2rHQA+DC/0dNK1HZXw5j5QqqSX2Zf3qjYqnIh1oL1VkJBLK+IGViuDYyoF6t+IkHdxpQcB3hESgIgIfgPFj3YzKmuPR8MJDZ17DROPo1dcPUDk6FWPhjQiSAEhcWcALT40Plyy1eEl2QvhXvRXakJLRn/tHVJy4wIxeuV4Uo3xXCqa6mRTjMQSnqeZX4iXO0YFS/Ndwa2msMnXNbABOMuTlVkeEd6XM+RsTaREgBEl91YkZBw3ycqZZO36zdS1u0jWwAl/yNODLdk8MM+mLs2+kwN7XA4+rNOO82K7ZfxlnOQymmcH19M+DLy1lFges5eBZvVVj1eRT60YTcFhu1Kr+i57p6G/yR1kLddCHs3utZqnINcIhPE1HPs8/rvyg/p9z7rWJcIKj1YT4TrvkWqJSsJyrGmXH1QctAGIHf/nHnH8T/Mm9ObfucjfXLZgt7lw+toZNCX6eMph2muEEUW3dequv2Mwi/MWu9Sy2x/dfytrAuaFXnGiUZUk/g6XezFgoXLnHMteqfMTJT9GRN/HFdFZqwsk1NUbPaWoKqUOuExE5hvDLk9JdA4TwNUOuMLLMs2CQECzgiEXqiTo1kpB1O9S16AZBiktXI7exSN5CC3vAjS6rV4z3aGsILDeweKod6LuYlFbYcgmh8BlKpZmZ94VuCmD91tlTy0moYEDZYXaIO/7IowHTL7/ZCIB8ILcUYLb11zOcJeKo4fy6CZSvU4rGPEo1AJ9w7VCOZc2YPYFdEHw+IqXL5s1MtNjsy5YuzZQtxCAA244fhYLRjqQHz05G4YfBDg3tnQ4yMynMEBqU44ppRwAwChCPz/G0r9RT7TaaQDDSsXx42xdjA69ZnZW/ySkrOgAromXCEjLIvLzw8NxG5d+wd+APT7MYsPqvqVRxxp+BJsYuNWGtZHgyPJvMmsshn1JexcJF2s+bFGEMJv7GGL77B4J7yZ+0myARGZ6BuXnk1mdwZfW+Zfwr/AofIxNxe5R1VLBLTHGH3wv357XVj48aqA6TY24="}
encryption_applied: 1
markup_language:
is_shared:
type_: 1

View File

@@ -0,0 +1,10 @@
id: acbba73d7a1a46848ddc96b96c64ec8b
created_time:
updated_time: 2020-07-25T10:37:00.295Z
user_created_time:
user_updated_time:
encryption_cipher_text: JED0100002205c24138199f5b403fa3e9b8b4f22685c500027c{"iv":"kJV7fueU0hsVrt4lTmqJXw==","v":1,"iter":101,"ks":128,"ts":64,"mode":"ccm","adata":"","cipher":"aes","salt":"O2duAuTVjV4=","ct":"4tqgbPmSxX7doVogiIBq20tkQT6qbVWOx7koi6Z696SDsdJZpsZs9NRzfOsLAgZrHjrtjZlMqB3IYV2DIc5UojWQZEKn04CQmLXDL+ypMFHHmxlqV0qrBhYXSBWMRLjUxjNx7fQgnMV8p/0Wq2ImxxKzuG+fhlc3uH+/7AbIiCzAbGovn2TTPF8agZClWutp0mop69/rdHDTA3xwWe+bnQRFxv65VrrPOGDdgdwVz6Fr9GaYEwF3pWmbCE++tEHBjuwEoNNycRPfw0yIzB05/4zN5xxFqiLzDdwTrwYv2W+U6iZnQPbf/NoaLlCM1LgZCtKg4kLnGS7Su/GxhX5paItd3Lix1sY6R+gsTZucsPF0z7kAWhOyI3KTFPHFLhHA/t6E2tjwrccIXEzQIuA3ZX6L4ebojMvUbxcQeiDQk+CMLaFMMJm/tT5MpNhAmjo9UyjQA4OQa+SXEsjAs1h9sYPNtxakwSZgH2KETR4/qEn76F8cmkea"}
encryption_applied: 1
is_shared:
parent_id:
type_: 5

View File

@@ -0,0 +1,8 @@
id: c24138199f5b403fa3e9b8b4f22685c5
created_time: 2020-07-25T10:37:00.483Z
updated_time: 2020-07-25T10:37:00.483Z
source_application: net.cozic.joplintest-cli
encryption_method: 4
checksum:
content: {"iv":"qukPmj886S4Y8nyT9z/WFA==","v":1,"iter":10000,"ks":256,"ts":64,"mode":"ccm","adata":"","cipher":"aes","salt":"FTTpwryRSrM=","ct":"ShoeEpKzYWDzkZa2k0QRX2FN8ucIedwmTIjF/o6hm0HFoE5zP0KG/eLCj5T5IcSxwXOJwRUWV2NCcgN9unr1e75JVeZlfqjS07WLCvfn4hy9acDKN8NwdFVjiCTnzyfbjNlmVcvIdoFBGgsWmkPwIm35feg7UHkeWPa2vq5NGt7UxPJEf9p62eUFptlEHXoRwqk6y4liqkyQGJsqg9OaQR2OJEbQKb5FzjeTYyOG2pQ+XcVa0kXhY6H7nyw8l5BRm+WdDeU6ToFFey4+DFpQ8xYF/e3QGemLbM0YlrDRZzTMkHjgQsswwdKjzZsAX3K3/phKrsX8/kq5+T0BJRpsj4l7Zfp8VsvCEopqDisHKjjIEbPiH8/nZdDA3TiRbWMt/7Ds627LgG8NNPWGV1Ld43Gyg4Xd8mJgSf4ZEksca9Ar/HJkI1knDJHt5dpNzrv29oTvdCrZpDoeqFLYOyWtecYuCFUFXVA46iRSiuuyMpXaJMUY/5FAdJu+Ml00arZEZwScYAMYTfeSIZmdg2EmpPfxBYxE2+LMY7L1LJ28l1MYm030DfyjC5xCrB5cZZ+Q7Uy8+YKdSodfv5wQIMQUR5E9LxcN9kfEkKMywSufBFXR0heUHuhJJvHi4ywKABMD1hivBDJQkxnD9A/jYzq/pIsjKW3uKDWFEzMFYaLEGK+v8iS7WbtWmA=="}
type_: 9

View File

@@ -0,0 +1,10 @@
id: c65e06fbbe4d456aafbbf0264be59e06
created_time:
updated_time: 2020-07-25T10:37:00.139Z
user_created_time:
user_updated_time:
encryption_cipher_text: JED0100002205c24138199f5b403fa3e9b8b4f22685c50002b0{"iv":"y6kwqC0uV752rWyPqtpP5Q==","v":1,"iter":101,"ks":128,"ts":64,"mode":"ccm","adata":"","cipher":"aes","salt":"O2duAuTVjV4=","ct":"/W+EsY2IABoL7uEssSFBi9IukZ28OEf4M9H0oGg4alaPMT8S3nkxLeg0UexwxOb/yGq1QnjbwNUoHo/FHL6tGDS0s3AsTV++v//EdxfZyjx2VfHIQfHJwhKk/HRN8HM4e782wqXVtbrOX9QCKsSEwRTgKJeZ09UWfZ/eVbxCjiiLt4JUtQyhKPEER6czBqGS9uhuyHiPbmAR37d+R9xCZSSVpT5OhIt03ffhNFU8s2yAxrQ/+EEpqBM/3J/SkVhwp/dHke7mRfGwqhKhoxl8ynV1/qVZTgIk4l9xw8refubYkF1q7wAT1r/b31Io7GW4ysHVB4F/tkd8KyEc7AddRcU41feWyNwvf9C4wMmB/FpjunzLYb4QQd0ons6ZN0kyuQnCu/vySSkwdVtX9oRx5K1V89tAEBYsO9BVxFNf8vgNJzdXCpIzK3CTG8IW/ZVB/UgUKxodQBIp9G+iVQWO45b3dJk2Rln00YXVli7rXfyqxAiXnEw9psgFZNPy9jW7f0kNwezcU3Zovix6OSvG0Zu2nWoL4gGXgEAtmKU="}
encryption_applied: 1
parent_id: 77c94e3da5d44db28eb485162d1b3f41
is_shared:
type_: 2

View File

@@ -0,0 +1,24 @@
id: f0aabe7de88d47c2ad4ce26d8d5ce70c
parent_id: 77c94e3da5d44db28eb485162d1b3f41
created_time:
updated_time: 2020-07-25T10:37:00.288Z
is_conflict:
latitude:
longitude:
altitude:
author:
source_url:
is_todo:
todo_due:
todo_completed:
source:
source_application:
application_data:
order:
user_created_time:
user_updated_time:
encryption_cipher_text: JED0100002205c24138199f5b403fa3e9b8b4f22685c5000470{"iv":"OVD9Kpe4iZRhEgnooBGUjA==","v":1,"iter":101,"ks":128,"ts":64,"mode":"ccm","adata":"","cipher":"aes","salt":"O2duAuTVjV4=","ct":"pxkDB+w02CTRMxtwZ7m3k9ovoWh49ggBgPi6ptSrPpByBiVShtrCwzl2ZabrOmxRriK8Pca4Tu8Ektxziqla6kKGpOCslX9rkwuPv/U8H7I+g9BZDwlBkQZPxH/QKdlIP4YeSqqelM1gPGudRDWJPU0rk47AjMSqbugVv0ar1sUsFc0rxxBvHwgNwZx6mlQ1P3ocYk03uyo2qfy8s43o2FSxey55MPBn23b9IJjMduVflzQ2d8pa1YD59qxJ+fwO7EJRcuvakT5JIW5g4D60tql/iog0X4whFGWtN6s9VZomnmEH4joBxxVgxhfEHcgLH51g4pheZzcDiforbPOyf/GJmn9f9ZP9xQO0lq8hFvvzvhWIDfbRhOSVgREdUweH+XPJ4FJqpinlPSdHWq+iU0gI3Rto5ofwNR1nVUF7tT7EwFNPBaUw5AZyAvxRRJU4YQLhQJfHXfk9v7FY+px4tJGA2RLsFlo4GwvAzsZYQeD6B9NGDDLTqQZJWM9IDWN2B8PuZ4Cnj2Cw/Z2LMcImSKKBcidjazsnMqzHTxNAC4FT/4Ysj+UjFAdZ5fUNL9QuaYAkFOrhlXEjTLyz3MVrrFHJhxjWlt8J/uq49JAL97VBZuX4VnVW0/tElCfu2xzMIOwulgaTqeXiYr1d2UYRq1v54HQ8TTD1gw2b9BK7xZEAo5EL8j/LhN8VrFuunOjWt065zDmHvwJqmzuNDKFnnguukUdha9jZJTJnXFMNhJebRKONSjybSEwEGqvFrQUr4xTtaEx3AkCr0yo3zvINq1mdOT23USm2cxFVLNbCQ7VwXM6OwIuqYI/jslQYBE33EHEJLH84fLJTfZgMUK2GjPLt5Et+5OhuLIgYMozt857olrpUE59SFlqEfF1f7acT26u+uqtBo0HoN/flGHT5B6xugvg9XCuWvi6ZtGZ5AEboGByTYNnyTirC1vWgIlLhNMRqzWMNO0PMAmgb3eEl/j/fMmPok9S5aA3e8mk="}
encryption_applied: 1
markup_language:
is_shared:
type_: 1

View File

@@ -0,0 +1,11 @@
id: fd04a61cb0ee4418a21ff0fe85992295
note_id: 4bdf2edea2514750beb9b2e82c7ec544
tag_id: acbba73d7a1a46848ddc96b96c64ec8b
created_time:
updated_time: 2020-07-25T10:37:00.302Z
user_created_time:
user_updated_time:
encryption_cipher_text: JED0100002205c24138199f5b403fa3e9b8b4f22685c50002d8{"iv":"ieBea8X4F4B81d/doK74NA==","v":1,"iter":101,"ks":128,"ts":64,"mode":"ccm","adata":"","cipher":"aes","salt":"O2duAuTVjV4=","ct":"0mD6ejTI5f0PExkRcZYupNH/ni4uPGqk9mAz525h+x9dUFgiFkFIImULlf4j8Z+1himEImYChMsl/ZmHHUckwCUPdIR+NFm8bHkMnf0gwlBEmhe0EuJcNJAAYIMi9VO5ZuGITG0n+pttNtb6EM+tn9FSPyN7OOfgSc1hOqxLUJo4AOK/iB5nT+kO30h5l3gFQbeHFK2MOO7pR1NCy6YXkneZ5uXxnO+2g6GvxDbU67n/mKs9AI/EQun+i49J1ZfF0qFqX9m9iWs6fJiWCUe+OP7PFrFYf6hUiNQCW+gtqLGfWMoeK6VLJigw40qr4EHdeDhlXHAemCH3TfCGAKaDJ6YxmhJ3R/53KI39b4cbfdeNoLfyK1jFu8JSl/2gbzMTdNyFvzFDtf4USjxSlpYSFjnAJiGFF3Cmd4tsBvDUuAGqMhTwagyH39HTfB1lVvAIXOtf+p0vQHuFEs94BkT9u6Tud74HSCSpvxMc4XhBZmcMUOEMMEzVbGQQCGAmffIGU85cgrL48gtE35AreYaPtMA4tHS+x7MAdgWk40QaXjFl3XMDYppb09i5dYcdqeNTZoZ0liAIpRimXw=="}
encryption_applied: 1
is_shared:
type_: 6

View File

@@ -0,0 +1,10 @@
id: fd8204c333c64762b592e19513f38cad
created_time:
updated_time: 2020-07-25T10:37:00.306Z
user_created_time:
user_updated_time:
encryption_cipher_text: JED0100002205c24138199f5b403fa3e9b8b4f22685c5000280{"iv":"r+WaCNs6XZ9Jrx8MRLaeig==","v":1,"iter":101,"ks":128,"ts":64,"mode":"ccm","adata":"","cipher":"aes","salt":"O2duAuTVjV4=","ct":"HLpVq2vzimdeRMPsJUuU0o/GHBXx3PAgtydRd2GsgJo4kNHS5rzlJ+2jeyZ9u69lzuc52Dzyk1i1T+f9gdxxiPLLrDDjOhb3D2symXev7+yHmmLI5MGnxvyNHQhAwEC9DUOgXg7mdWPQgQq23M+ApNo+rcc01VuuOPVLWQaHLB1fLpeDApGU3/R5uH623W/dva9N4SVUknjEjzlxQjws4AGsYBzWpaOHnqYnd/nv3/WfJ7436IyjofpzT4U8IGpKcE0NBUt1FQdWvhewFmPm0csc4Iypbj8w3HQ+L4THX/4XeLDpGAuP7L1yOcflevvjxAQgdbjow68AcFWUdPrDwTzHs1mSA0r9vznF+31uctN6gnCr3i9j9zaXUaUAEnNfoJNy60lYyfxg9E9V9UaZW+PdlL3gRtZ8Os3RL1jcw2lSdPmWbVfZYEvU2UBig6SrmH34obGaBt9m1xY+bJZSvWmN5R2S1iaaBLBHclbXJRSlXRxh89eNJPDr"}
encryption_applied: 1
parent_id:
is_shared:
type_: 2

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

@@ -0,0 +1,26 @@
note2
id: 0e8d296dbef34588b0de060630ad2582
parent_id: 36ad2ccddc2542a9a5c41a1fbde269b1
created_time: 2020-07-25T10:36:57.409Z
updated_time: 2020-07-25T10:36:57.409Z
is_conflict: 0
latitude: 0.00000000
longitude: 0.00000000
altitude: 0.0000
author:
source_url:
is_todo: 0
todo_due: 0
todo_completed: 0
source: joplin
source_application: net.cozic.joplintest-cli
application_data:
order: 1595673417409
user_created_time: 2020-07-25T10:36:57.409Z
user_updated_time: 2020-07-25T10:36:57.409Z
encryption_cipher_text:
encryption_applied: 0
markup_language: 1
is_shared: 0
type_: 1

View File

@@ -0,0 +1,11 @@
id: 142d880fd27e43e1b70ca02722f86dce
note_id: d70c14d1edd54ccaad87ee934a499852
tag_id: 96c03d6a6d19419f8fb95cb21e7f4f22
created_time: 2020-07-25T10:36:57.426Z
updated_time: 2020-07-25T10:36:57.426Z
user_created_time: 2020-07-25T10:36:57.426Z
user_updated_time: 2020-07-25T10:36:57.426Z
encryption_cipher_text:
encryption_applied: 0
is_shared: 0
type_: 6

View File

@@ -0,0 +1,12 @@
subFolder2
id: 36ad2ccddc2542a9a5c41a1fbde269b1
created_time: 2020-07-25T10:36:57.195Z
updated_time: 2020-07-25T10:36:57.195Z
user_created_time: 2020-07-25T10:36:57.195Z
user_updated_time: 2020-07-25T10:36:57.195Z
encryption_cipher_text:
encryption_applied: 0
parent_id: 77007052daa34970ba8c88b56c8789ac
is_shared: 0
type_: 2

View File

@@ -0,0 +1,28 @@
note1
![photo.jpg](:/4b938c5212c24110afdfe523e0d85fef)
id: 4782f467eb8c4d769b3538f069c39cfe
parent_id: 36ad2ccddc2542a9a5c41a1fbde269b1
created_time: 2020-07-25T10:36:57.196Z
updated_time: 2020-07-25T10:36:57.400Z
is_conflict: 0
latitude: 0.00000000
longitude: 0.00000000
altitude: 0.0000
author:
source_url:
is_todo: 0
todo_due: 0
todo_completed: 0
source: joplin
source_application: net.cozic.joplintest-cli
application_data:
order: 1595673417196
user_created_time: 2020-07-25T10:36:57.196Z
user_updated_time: 2020-07-25T10:36:57.400Z
encryption_cipher_text:
encryption_applied: 0
markup_language: 1
is_shared: 0
type_: 1

View File

@@ -0,0 +1,16 @@
photo.jpg
id: 4b938c5212c24110afdfe523e0d85fef
mime: image/jpeg
filename:
created_time: 2020-07-25T10:36:57.397Z
updated_time: 2020-07-25T10:36:57.397Z
user_created_time: 2020-07-25T10:36:57.397Z
user_updated_time: 2020-07-25T10:36:57.397Z
file_extension: jpg
encryption_cipher_text:
encryption_applied: 0
encryption_blob_encrypted: 0
size: 2720
is_shared: 0
type_: 4

View File

@@ -0,0 +1,11 @@
id: 4c0946e2eabf4a16b3451097a85a45b8
note_id: 922bf9d7bfbd4493b54202b25fcb9305
tag_id: 96c03d6a6d19419f8fb95cb21e7f4f22
created_time: 2020-07-25T10:36:57.541Z
updated_time: 2020-07-25T10:36:57.541Z
user_created_time: 2020-07-25T10:36:57.541Z
user_updated_time: 2020-07-25T10:36:57.541Z
encryption_cipher_text:
encryption_applied: 0
is_shared: 0
type_: 6

View File

@@ -0,0 +1,26 @@
note3
id: 70cc44320e52419dbcedeb321d0a3700
parent_id: 77007052daa34970ba8c88b56c8789ac
created_time: 2020-07-25T10:36:57.410Z
updated_time: 2020-07-25T10:36:57.410Z
is_conflict: 0
latitude: 0.00000000
longitude: 0.00000000
altitude: 0.0000
author:
source_url:
is_todo: 0
todo_due: 0
todo_completed: 0
source: joplin
source_application: net.cozic.joplintest-cli
application_data:
order: 1595673417410
user_created_time: 2020-07-25T10:36:57.410Z
user_updated_time: 2020-07-25T10:36:57.410Z
encryption_cipher_text:
encryption_applied: 0
markup_language: 1
is_shared: 0
type_: 1

View File

@@ -0,0 +1,12 @@
folder1
id: 77007052daa34970ba8c88b56c8789ac
created_time: 2020-07-25T10:36:57.192Z
updated_time: 2020-07-25T10:36:57.192Z
user_created_time: 2020-07-25T10:36:57.192Z
user_updated_time: 2020-07-25T10:36:57.192Z
encryption_cipher_text:
encryption_applied: 0
parent_id:
is_shared: 0
type_: 2

View File

@@ -0,0 +1,12 @@
folder2
id: 8151f52ed31442cb9c9ca0a943845de5
created_time: 2020-07-25T10:36:57.432Z
updated_time: 2020-07-25T10:36:57.432Z
user_created_time: 2020-07-25T10:36:57.432Z
user_updated_time: 2020-07-25T10:36:57.432Z
encryption_cipher_text:
encryption_applied: 0
parent_id:
is_shared: 0
type_: 2

View File

@@ -0,0 +1,28 @@
note5
![photo.jpg](:/b50d9136b45e44fd9d40ef1ac5e7250a)
id: 922bf9d7bfbd4493b54202b25fcb9305
parent_id: ef9861f30a724a1491f08656764d64c5
created_time: 2020-07-25T10:36:57.434Z
updated_time: 2020-07-25T10:36:57.539Z
is_conflict: 0
latitude: 0.00000000
longitude: 0.00000000
altitude: 0.0000
author:
source_url:
is_todo: 0
todo_due: 0
todo_completed: 0
source: joplin
source_application: net.cozic.joplintest-cli
application_data:
order: 1595673417434
user_created_time: 2020-07-25T10:36:57.434Z
user_updated_time: 2020-07-25T10:36:57.539Z
encryption_cipher_text:
encryption_applied: 0
markup_language: 1
is_shared: 0
type_: 1

View File

@@ -0,0 +1,12 @@
tag2
id: 96c03d6a6d19419f8fb95cb21e7f4f22
created_time: 2020-07-25T10:36:57.418Z
updated_time: 2020-07-25T10:36:57.418Z
user_created_time: 2020-07-25T10:36:57.418Z
user_updated_time: 2020-07-25T10:36:57.418Z
encryption_cipher_text:
encryption_applied: 0
is_shared: 0
parent_id:
type_: 5

View File

@@ -0,0 +1,16 @@
photo.jpg
id: b50d9136b45e44fd9d40ef1ac5e7250a
mime: image/jpeg
filename:
created_time: 2020-07-25T10:36:57.537Z
updated_time: 2020-07-25T10:36:57.537Z
user_created_time: 2020-07-25T10:36:57.537Z
user_updated_time: 2020-07-25T10:36:57.537Z
file_extension: jpg
encryption_cipher_text:
encryption_applied: 0
encryption_blob_encrypted: 0
size: 2720
is_shared: 0
type_: 4

View File

@@ -0,0 +1,11 @@
id: c3a42938f05c474e8f2835e4a5f51370
note_id: 70cc44320e52419dbcedeb321d0a3700
tag_id: 96c03d6a6d19419f8fb95cb21e7f4f22
created_time: 2020-07-25T10:36:57.419Z
updated_time: 2020-07-25T10:36:57.419Z
user_created_time: 2020-07-25T10:36:57.419Z
user_updated_time: 2020-07-25T10:36:57.419Z
encryption_cipher_text:
encryption_applied: 0
is_shared: 0
type_: 6

View File

@@ -0,0 +1,11 @@
id: cd2541a9f08a4318954450dc9fc66851
note_id: 70cc44320e52419dbcedeb321d0a3700
tag_id: fb4ad5fafb254297949232aff2d7c9ce
created_time: 2020-07-25T10:36:57.412Z
updated_time: 2020-07-25T10:36:57.412Z
user_created_time: 2020-07-25T10:36:57.412Z
user_updated_time: 2020-07-25T10:36:57.412Z
encryption_cipher_text:
encryption_applied: 0
is_shared: 0
type_: 6

View File

@@ -0,0 +1,26 @@
note4
id: d70c14d1edd54ccaad87ee934a499852
parent_id: 77007052daa34970ba8c88b56c8789ac
created_time: 2020-07-25T10:36:57.423Z
updated_time: 2020-07-25T10:36:57.423Z
is_conflict: 0
latitude: 0.00000000
longitude: 0.00000000
altitude: 0.0000
author:
source_url:
is_todo: 0
todo_due: 0
todo_completed: 0
source: joplin
source_application: net.cozic.joplintest-cli
application_data:
order: 1595673417423
user_created_time: 2020-07-25T10:36:57.423Z
user_updated_time: 2020-07-25T10:36:57.423Z
encryption_cipher_text:
encryption_applied: 0
markup_language: 1
is_shared: 0
type_: 1

View File

@@ -0,0 +1,12 @@
subFolder1
id: dfa1b5e0a4d54f4eaa2ee547da91a608
created_time: 2020-07-25T10:36:57.193Z
updated_time: 2020-07-25T10:36:57.193Z
user_created_time: 2020-07-25T10:36:57.193Z
user_updated_time: 2020-07-25T10:36:57.193Z
encryption_cipher_text:
encryption_applied: 0
parent_id: 77007052daa34970ba8c88b56c8789ac
is_shared: 0
type_: 2

View File

@@ -0,0 +1,11 @@
id: e4eeb8778bd14220bff79f2a6713cb6e
note_id: 4782f467eb8c4d769b3538f069c39cfe
tag_id: fb4ad5fafb254297949232aff2d7c9ce
created_time: 2020-07-25T10:36:57.405Z
updated_time: 2020-07-25T10:36:57.405Z
user_created_time: 2020-07-25T10:36:57.405Z
user_updated_time: 2020-07-25T10:36:57.405Z
encryption_cipher_text:
encryption_applied: 0
is_shared: 0
type_: 6

View File

@@ -0,0 +1,12 @@
folder3
id: ef9861f30a724a1491f08656764d64c5
created_time: 2020-07-25T10:36:57.433Z
updated_time: 2020-07-25T10:36:57.433Z
user_created_time: 2020-07-25T10:36:57.433Z
user_updated_time: 2020-07-25T10:36:57.433Z
encryption_cipher_text:
encryption_applied: 0
parent_id:
is_shared: 0
type_: 2

View File

@@ -0,0 +1,12 @@
tag1
id: fb4ad5fafb254297949232aff2d7c9ce
created_time: 2020-07-25T10:36:57.403Z
updated_time: 2020-07-25T10:36:57.403Z
user_created_time: 2020-07-25T10:36:57.403Z
user_updated_time: 2020-07-25T10:36:57.403Z
encryption_cipher_text:
encryption_applied: 0
is_shared: 0
parent_id:
type_: 5

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
2020-07-16: In the new sync format, the version number is stored in /info.json. However, for backward compatibility, we need to keep the old version.txt file here, otherwise old clients will automatically recreate it, and assume a sync target version 1. So we keep it here but set its value to "2", so that old clients know that they need to be upgraded. This directory can be removed after a year or so, once we are confident that all clients have been upgraded to recent versions.

View File

@@ -0,0 +1,24 @@
id: 04c4e932fe3c4c4a9450c09208bd6c21
parent_id: 3d675395b5cd4d1e9d7ca4f045f41493
created_time:
updated_time: 2020-07-25T10:55:20.793Z
is_conflict:
latitude:
longitude:
altitude:
author:
source_url:
is_todo:
todo_due:
todo_completed:
source:
source_application:
application_data:
order:
user_created_time:
user_updated_time:
encryption_cipher_text: JED0100002205a1a0987e82cc400c90582492f814c23c000470{"iv":"gJXa88pt5ZzaYAlD4ZCSkA==","v":1,"iter":101,"ks":128,"ts":64,"mode":"ccm","adata":"","cipher":"aes","salt":"Gyo7bQeqz2w=","ct":"8jM7A4Kx9RfLOHz/uriiE3r5zz6AwnUNVaHFiiF3Sl5La7spsW0hAzoAJuUHncbIE9Rks6RH5g+k7Y4J5zxlpHlsbXYFzvYyh706kemlwg/k/lDPkMK47BPPYICcCCOeUvc+IXAjgcr52RX29yuBYhqQDyJVhFgkaEmbYYmYXbomZrzOWeXF4O0nqVFt7sawFUg3Vu0+gESRK5SV24OL6l9Qw6rRh+kwCO0E8piKq31CDrx3741E3X2LOR2jw6i+EIs/pyPMRDPWg8o3YOF5Ka1u4NkMXM14pSc/VYFiJoR2kDh4alXKIaJaJeIRjQ/rWNz42s3eT/GpoIRxPKwfG5DwD8xT5Ns5HJ0aD2E3es++BjOSeeqi8MkeCdyHLtgIQB9FaILLMtzGu6lUwP6VlxJ7HJhvtA1T+tfKMlTrzNYxJCcKGg2IUU+Qv+8LnSjybIia5weKj58emRNAXyVAWT6CQupoe1c3XxM6hPInggOZkghQOV4rpMuKniZ3DMIuddgFpdXtD8q4pemQkXMQfRtUafyqz69zH9Bkn4RS7yEROfRfqi5TrAUTGnTyPnyAQdyORLHCNBJBheHMa+s37LSe0ZBYmGxhnl1VMWjvUatIZphF7EUlseFC3jzxMv5fYsi8BbmpyLoqH56Odogc6e+ToPuBvRuVdIBHXfT4k5B62+KkWAmedBkjwJIgp6EWaaTGmVwwBL/xWgkKL87qsMmMn+Obj/e/3cDBQm0ubg8gvsWiGsA0cL0jBM3QKMgTb1D123zG2s8DWdIoSSByjwW4sVkb9hH6v3RCPoOyxV1JubcuDsbGnnrL9hhmx/5ahHnoHhUD2vYVLsI5xRmktEUpBbf9BcMY6RGhUXWM40djLLQuTAbYFF49o9X233BlbQrQndEnF6mhy3vLSotJdeGc8PWbSenicXaqJm/2U2beCAeQ5TgcDg5hlru1JitD2TIvJuv5e7Z1UFXSc/P2TEFsIP549bCt7gDpJl8="}
encryption_applied: 1
markup_language:
is_shared:
type_: 1

View File

@@ -0,0 +1,24 @@
id: 26b9c0dc3ff146ed99031e259bc1240b
parent_id: 3d675395b5cd4d1e9d7ca4f045f41493
created_time:
updated_time: 2020-07-25T10:55:20.807Z
is_conflict:
latitude:
longitude:
altitude:
author:
source_url:
is_todo:
todo_due:
todo_completed:
source:
source_application:
application_data:
order:
user_created_time:
user_updated_time:
encryption_cipher_text: JED0100002205a1a0987e82cc400c90582492f814c23c000470{"iv":"4LKOBhs4VTm2kEFjWsE66g==","v":1,"iter":101,"ks":128,"ts":64,"mode":"ccm","adata":"","cipher":"aes","salt":"Gyo7bQeqz2w=","ct":"T4CSUbg3Ma11ffHKa8t6Zfu42DYcKGv6+p87c/V4wXsnHEaLFk2vV9iZg0CDOpAfOZaOCBrWSUsUI3FYIWjIEg8Wb2GsIrYz5i03B68yAjjN4hDtulyuLAlFzQUWw6xyPwaCebHUZHekearKFL/sQl2aNClxsKz/uT1/g27ANiilywFxp+GwQ/MxI0YhR7Qdr7Ri6YbySOSVExInQqMY2ERsWhgLQpR0NFSZLVIi3wJmlG4PR4uAxJgHu29Z2tvaMjW/lKUbCaqt5vsbP4qw1BqgNjt8it0qLkf9TwW3y4sxMCXI5zo5cdlwbMEcuDxvU2zfDBfWHgnIIekSR3csOTBswpQ/csXIKyZomlP+7ys7liGtoDssCrbH8YBwGW1KkzBmaKYhP9Q1JOWC8/HWI/YBkSWX0AQIhkwUjPVY+WgzfKUFD4XpUaKm9xmSCfj67GqSFUlB0MhTer1aFj4L3T/YOSZQevaUwmcnJzRpAmArhEAnHlrm4DO5AqubrAd88hPGWiCo5Ud9PYsLBeDiRJaQroA0VCOuzGLTyq5p/YfPedNBI08cN5cLuKc8bx5W4HBp6ZYv6oDkkbR9eZQyY2qbvkZoOQDlG9QKrenvIprrtRgFCO9NUfEYzxApSpyzVRfBv4LFxRTlpjihaGxKcA77U7xfqszFxJNyQj49hK8/SWR+/m4TOmqMRxwWm638t/NYz1MhLU2Vee9tA847ITVbZCgpxKRCVSJytYuHi8gshrTom/zjJPMJxoZnQpoWRB9nEbd2s+Tqev7U5lLPiMwjBzwNNnRLKkI2EFRxIWhOxSUwZuxGSIzhb8dAC1T6/ngwvtFTmYZxx3/XYZnsZO47IeYUbHb9SPbUSUXoQeU9rNDekcWusfrbod9Y7ON0aHoiytX54xLFOTUXyFLY7OeGM0C6QeumvOLTJ/WLHj6ReBB0vVipJULfNW5r4GEhD3Cf8uMf99mqXIYOFpBJj/WQesO72R9PjYrjk7c="}
encryption_applied: 1
markup_language:
is_shared:
type_: 1

View File

@@ -0,0 +1,24 @@
id: 3a8eaf72f62847689176a952a0b321a0
parent_id: aa7dca873bdc47beaa9465e04610619d
created_time:
updated_time: 2020-07-25T10:55:20.782Z
is_conflict:
latitude:
longitude:
altitude:
author:
source_url:
is_todo:
todo_due:
todo_completed:
source:
source_application:
application_data:
order:
user_created_time:
user_updated_time:
encryption_cipher_text: JED0100002205a1a0987e82cc400c90582492f814c23c0004c8{"iv":"iOtmBH1egyWEQ4howS5ssQ==","v":1,"iter":101,"ks":128,"ts":64,"mode":"ccm","adata":"","cipher":"aes","salt":"Gyo7bQeqz2w=","ct":"BbJdyFskBpsOLSHMogZbAF4GgPJsY07EwoQjmiZl2WDT6QezrTnLQ4BsYjMLiLHphtjs3MqxK2p11cfQLPY4fAoVywQeTLFjMyncWsnAFZaDnCvZ/VCwbI3yTi/XOVgQ342AAIZFQ47tAkNFmH6CEgLK+g9BW2fcBxHcnky70XfyE7FI3HNl/d0qGIBWViv6LJKl5F4ywbky75/Myb029g3u+TQvmxZXDWjbDewWFdvIj82KdR12XSf+oQJQpeuwR2yHioX8qjTC4/3bLeQ9CumCRHrrSpxTqjCcvMH3w3+OnfMnmT83MxQa+mQJzMhZCaFbeEw5Mvbs1lgcyhsCC6yWDmgTFwhfJfz6KqZxtmkqiLt+E26ej8nd344DaEJ2GSHrbpkgIgkzYJndtiFGWnHnMoKKKsgAyOcTB85mQRvwZqsx+StKGkdNkqfbSQhtspi3XWr6TchjJgE2sqchWMZqyk6HSGVNVROptJZELPyEBDqG+vq7JrHPEagUCGUYBHEL2ZfKIy6ecU31Q7Hmpgpqyct/iRKr8mKrCLPbrUGiL27Yov7Mn8+MDwnpyGSw8tGYG29LCOADAkbSHl8dtYsF7dQl0VULipdwVv5KRO0ZFzacIu5/ciw8mx79wfZSVcKy06YYvSsGOYuyvRxXarftPBc9abVhSL7OLfIxwaNJH5GBus97fEcaWPTMTIoZuj7qRWsR5vjG7DQ1PWlWh/5+zNQ7mP5SANJCIjTEu5138hGhOc54sMrP7HPRfzEVIgiX6fOQ9lyJGwn65nn7SRrlsIiVLeT4Hna2y8mcXRw6p+J1WiqZyn5Sq8MyhBx8Q/Uc3IMVwZd7auOnL2BLr2SG+9z0YHUr5xPR9WADQiPw/d6GoXs9Jo0mzqAhFjX6WKjMo0RYeQVCAOnIvm7XTz65pmwVIxqI++nN3RB3e8HQCnS/ERBiSuBb5cEylsP1NV0Mzp7JSJKrPiRF6TJED4pJ+HHScRV4Sg0hrrZiF/ZkxJ+VGEcgCr8IT/QrMesHjXPaZ5f3ov8Amz57Eq7WLaNP+4lOxzyy8AjYaPdBlswx47PN412Yna7a0qG11l4="}
encryption_applied: 1
markup_language:
is_shared:
type_: 1

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