You've already forked joplin
mirror of
https://github.com/laurent22/joplin.git
synced 2025-08-27 20:29:45 +02:00
Compare commits
145 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
96475f82b2 | ||
|
e720c91f72 | ||
|
771acbe463 | ||
|
a5e4c13759 | ||
|
0998fc0ad7 | ||
|
d5f3e860b9 | ||
|
4e624f7db5 | ||
|
5b697b7e16 | ||
|
62c3945b8f | ||
|
f8a3f509e7 | ||
|
30e0d69a74 | ||
|
652816fd26 | ||
|
3a33e5f416 | ||
|
277dac5512 | ||
|
81d97d9f9d | ||
|
a4873cd40d | ||
|
20cb2daf43 | ||
|
e5b5250a91 | ||
|
db7d617e2b | ||
|
a627884876 | ||
|
ed30d09e07 | ||
|
179e3f9aee | ||
|
a67aedba35 | ||
|
199c411a7d | ||
|
5cd7bb5bdb | ||
|
30b8f5e2aa | ||
|
44f2842820 | ||
|
569355a318 | ||
|
8464e16d5d | ||
|
874c1e3e82 | ||
|
2530ecfc86 | ||
|
6b49f1dfcc | ||
|
b1af25ea18 | ||
|
3086007a9c | ||
|
bdfb6b97f5 | ||
|
c01219e6be | ||
|
743c11c279 | ||
|
11646d1c21 | ||
|
797f4a9669 | ||
|
815775ad8f | ||
|
085109288f | ||
|
c6cf0f3ba5 | ||
|
f9bdce7e24 | ||
|
f8cf4db5db | ||
|
14e6ae373f | ||
|
39bffd2790 | ||
|
f3cb903901 | ||
|
abad1883bc | ||
|
bb8770a967 | ||
|
c903947704 | ||
|
82e96840e9 | ||
|
e190d90832 | ||
|
0ae8d454ad | ||
|
77c7f966cf | ||
|
619fa1d607 | ||
|
157736ff7e | ||
|
0b57d906f8 | ||
|
86bfdb5c79 | ||
|
fc7d34f79c | ||
|
9d962f0328 | ||
|
79e1a33b28 | ||
|
0eedae1f62 | ||
|
e1144c098e | ||
|
5c5cb0f781 | ||
|
656615b571 | ||
|
799a9e810d | ||
|
aa147bbcdc | ||
|
8c7a24282c | ||
|
f99f3f8a6d | ||
|
29fbafdfff | ||
|
3253146dae | ||
|
7e4ac0fd73 | ||
|
60d77cb5ea | ||
|
8299164964 | ||
|
488393e75d | ||
|
c19f8c8035 | ||
|
b0b55718cc | ||
|
5ade9ff2f6 | ||
|
e4cfb518ba | ||
|
89864de1ff | ||
|
ee2a474611 | ||
|
223caca0f5 | ||
|
ee358f70dd | ||
|
0718828d60 | ||
|
d13f54c2ce | ||
|
90f7f99cd1 | ||
|
a273bbaeee | ||
|
619b426689 | ||
|
97c752a39e | ||
|
7565f1cada | ||
|
0c147236a3 | ||
|
88f22fabf7 | ||
|
5f46d60c5e | ||
|
cc8c200826 | ||
|
4485947b0f | ||
|
9f1a877f96 | ||
|
13280ce1b3 | ||
|
7f73931530 | ||
|
bbfed9bca8 | ||
|
bab29cd582 | ||
|
baea44cbd6 | ||
|
ab0538df43 | ||
|
58d4a69053 | ||
|
9147b3061a | ||
|
1b0102f62c | ||
|
471631933b | ||
|
cd761932c1 | ||
|
e63eee89ef | ||
|
4393ebbcc6 | ||
|
ed82390a8d | ||
|
79e708779f | ||
|
98905f6892 | ||
|
44e57c3959 | ||
|
35d48394ce | ||
|
eb42a5f34b | ||
|
729c8c6fac | ||
|
7a1707d864 | ||
|
64d7603eed | ||
|
89e6b680a6 | ||
|
da071a804c | ||
|
7833ca5ae6 | ||
|
44d49b57b9 | ||
|
9db150f8ff | ||
|
e2d3630783 | ||
|
cb1b5cae9f | ||
|
3af5b31c1c | ||
|
b6dafd6da6 | ||
|
fd568b5300 | ||
|
f19f148297 | ||
|
79c6eb5503 | ||
|
1204bed80a | ||
|
dc91b1f7d6 | ||
|
66dc2b33de | ||
|
811942d45e | ||
|
dbde239a25 | ||
|
ab3ba3e2ca | ||
|
79e77b5a10 | ||
|
c3395133c9 | ||
|
b1d073cdeb | ||
|
25d723b373 | ||
|
e9783d050b | ||
|
e1be1ead86 | ||
|
b129bed69f | ||
|
265ad50ce4 | ||
|
3e2570601f |
@@ -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
|
||||
|
121
.eslintrc.js
121
.eslintrc.js
@@ -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
1
.github/stale.yml
vendored
@@ -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
15
.gitignore
vendored
@@ -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
|
||||
|
@@ -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 |
4
BUILD.md
4
BUILD.md
@@ -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.
|
@@ -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.
|
||||
|
||||
|
@@ -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,
|
||||
},
|
||||
},
|
||||
],
|
||||
};
|
||||
};
|
||||
|
2
CliClient/.gitignore
vendored
2
CliClient/.gitignore
vendored
@@ -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/
|
134
CliClient/app/LinkSelector.ts
Normal file
134
CliClient/app/LinkSelector.ts
Normal 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;
|
||||
|
@@ -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();
|
||||
|
@@ -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' },
|
||||
|
@@ -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') {
|
||||
|
@@ -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 };
|
||||
|
@@ -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();
|
||||
}
|
||||
|
||||
|
@@ -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') {
|
||||
|
@@ -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',
|
||||
]));
|
||||
|
@@ -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 "
|
||||
"está 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
@@ -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ńczyć 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
|
||||
|
@@ -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"
|
||||
|
||||
|
@@ -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"
|
||||
|
@@ -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"
|
||||
|
507
CliClient/package-lock.json
generated
507
CliClient/package-lock.json
generated
@@ -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",
|
||||
|
@@ -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",
|
||||
|
@@ -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);
|
||||
});
|
||||
|
@@ -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);
|
||||
});
|
||||
|
@@ -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);
|
||||
});
|
||||
|
@@ -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);
|
||||
});
|
||||
|
@@ -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);
|
||||
});
|
||||
|
@@ -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
|
||||
|
||||
});
|
||||
// });
|
||||
|
155
CliClient/tests/filterParser.js
Normal file
155
CliClient/tests/filterParser.js
Normal 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'));
|
||||
|
||||
});
|
||||
});
|
@@ -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');
|
||||
|
@@ -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);
|
||||
});
|
||||
|
@@ -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);
|
||||
}));
|
||||
});
|
||||
|
@@ -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() {
|
||||
|
@@ -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);
|
||||
});
|
||||
|
@@ -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) => {
|
||||
|
319
CliClient/tests/services_KeymapService.js
Normal file
319
CliClient/tests/services_KeymapService.js
Normal 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]);
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
@@ -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());
|
||||
|
@@ -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`;
|
||||
}
|
||||
|
@@ -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);
|
||||
}));
|
||||
|
||||
});
|
||||
|
752
CliClient/tests/services_SearchFilter.js
Normal file
752
CliClient/tests/services_SearchFilter.js
Normal 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);
|
||||
|
||||
}));
|
||||
|
||||
});
|
@@ -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) => {
|
||||
|
@@ -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);
|
||||
});
|
||||
|
8
CliClient/tests/support/createSyncTargetSnapshot.js
Normal file
8
CliClient/tests/support/createSyncTargetSnapshot.js
Normal 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);
|
||||
});
|
@@ -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
@@ -0,0 +1 @@
|
||||
1
|
@@ -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
|
@@ -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
|
@@ -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
|
@@ -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
|
@@ -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
|
@@ -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
|
@@ -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
|
@@ -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
|
@@ -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
|
@@ -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
|
@@ -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
|
@@ -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
|
@@ -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
|
@@ -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
|
@@ -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
|
@@ -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
|
@@ -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
|
@@ -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
|
@@ -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
|
@@ -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 |
@@ -0,0 +1 @@
|
||||
1
|
@@ -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
|
@@ -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
|
@@ -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
|
@@ -0,0 +1,28 @@
|
||||
note1
|
||||
|
||||

|
||||
|
||||
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
|
@@ -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
|
@@ -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
|
@@ -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
|
@@ -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
|
@@ -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
|
@@ -0,0 +1,28 @@
|
||||
note5
|
||||
|
||||

|
||||
|
||||
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
|
@@ -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
|
@@ -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
|
@@ -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
|
@@ -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
|
@@ -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
|
@@ -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
|
@@ -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
|
@@ -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
|
@@ -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
@@ -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.
|
@@ -0,0 +1 @@
|
||||
2
|
@@ -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
|
@@ -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
|
@@ -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
Reference in New Issue
Block a user