1
0
mirror of https://github.com/laurent22/joplin.git synced 2025-09-05 20:56:22 +02:00

Compare commits

...

35 Commits

Author SHA1 Message Date
Laurent Cozic
075e55c077 Android release v1.0.269 2019-06-15 01:23:12 +01:00
Laurent Cozic
dc818e8a0c Electron release v1.0.160 2019-06-15 00:57:36 +01:00
Laurent Cozic
caa58dd913 name 2019-06-15 00:57:13 +01:00
Laurent Cozic
c84c3cd026 Merge pull request #1655 from laurent22/react-native-5-9
React Native 5 9
2019-06-14 23:32:12 +01:00
Laurent Cozic
bda5ac9fb5 Upgraded RNdocument-picker 2019-06-14 23:23:01 +01:00
Laurent Cozic
f928f645e5 Upgraded RNSqlite to remove warnings 2019-06-14 23:16:37 +01:00
Laurent Cozic
53d7e906d4 Removed unneeded class that was causing a require cycle 2019-06-14 23:04:05 +01:00
Laurent Cozic
e670b5d03f Upgraded RNDialogbox to remove warnings 2019-06-14 23:02:35 +01:00
Laurent Cozic
2a7d555859 Replaced deprecated Slider component 2019-06-14 22:59:27 +01:00
Laurent Cozic
e6675f500c Removed no longer used WebView module 2019-06-14 22:46:08 +01:00
Laurent Cozic
c3f20d3ebc Getting latest RNCamera to work with Android 2019-06-14 22:45:35 +01:00
Laurent Cozic
ff257060d1 Trying get RNCamera to work in iOS 2019-06-14 22:31:01 +01:00
Laurent Cozic
68cde202a4 Added JSC to improve performances of Android app 2019-06-14 18:37:46 +01:00
Laurent Cozic
1a7a87e170 Remove this for now as are not on AndroidX yet 2019-06-14 18:30:16 +01:00
Laurent Cozic
2990642923 Trying to fix rn-camera but cannot be full fixed yet due to https://github.com/react-native-community/react-native-camera/pull/2306 2019-06-14 09:15:38 +01:00
Laurent Cozic
0818de036e Fixing issue with webview so that WebKit rendering can be used 2019-06-14 09:14:01 +01:00
Laurent Cozic
122bc29035 Mobile: Upgraded WebView 2019-06-14 08:11:15 +01:00
Laurent Cozic
861cf8a1b2 Merge branch 'master' into react-native-5-9 2019-06-14 07:22:57 +01:00
Laurent Cozic
7d6959e9e4 Merge branch 'master' of github.com:laurent22/joplin 2019-06-14 07:22:38 +01:00
Laurent Cozic
85091052e7 iOS: Fixed missing Confirm and Cancel buttons on Alarm dialog 2019-06-14 07:22:25 +01:00
Laurent Cozic
f46ad5bfda Upgrading to React Native 5.9 2019-06-14 07:12:24 +01:00
Laurent Cozic
29f7937fc2 Merge branch 'master' of github.com:laurent22/joplin 2019-06-13 08:48:30 +01:00
Laurent Cozic
7fae9fda10 Desktop: Fixes #1443: Allow opening external editor on new notes 2019-06-13 08:48:19 +01:00
Laurent Cozic
a37961dccc Desktop: Removed placeholder in tag list because it repeats the label 2019-06-13 08:47:47 +01:00
Helmut K. C. Tessarek
55155646aa Clipper release v1.0.15 2019-06-12 19:38:32 -04:00
Laurent Cozic
7bffe86439 Merge branch 'master' of github.com:laurent22/joplin 2019-06-13 00:26:55 +01:00
Laurent Cozic
86136e0c6c Clipper: Fixes #1622: Import named anchors from clipped pages 2019-06-13 00:26:19 +01:00
Helmut K. C. Tessarek
21ae447d9c Clipper: Create a zip file of the source (for validation by Firefox reviewers) (#1648)
The file `joplin-webclipper-source.zip` will be in the `dist` directory of the webclipper.
2019-06-12 23:11:24 +01:00
Laurent Cozic
ad211b4b4e Clipper: Fixes #1600: Handle SVG images and fix issue with invalid file extensions 2019-06-12 09:45:31 +01:00
Laurent Cozic
d6218f35fe Clipper: Fixes #1526: Local files can be clipped again 2019-06-11 01:09:48 +01:00
Laurent Cozic
7af0dcd19a Merge branch 'master' of github.com:laurent22/joplin 2019-06-11 00:11:57 +01:00
Laurent Cozic
e1a52c5606 CLI: Remove Welcome notes because they are mostly relevent to desktop and mobile, and there is already intro text on CLI 2019-06-11 00:11:49 +01:00
Helmut K. C. Tessarek
468c345527 Desktop: Improved: Added shortuct for tags (Cmd+Opt+T / Ctrl+Alt+T) (#1638)
fixes #1626
2019-06-10 23:45:49 +01:00
Caleb John
041bdc08a2 Desktop: New: Highlight notebooks based on depth (#1634)
* Highlight notebooks based on depth

* Adjusted notebook depth targets, and dark theme select color
2019-06-10 23:44:51 +01:00
Laurent Cozic
7535f1a8c6 Update website 2019-06-10 23:41:32 +01:00
63 changed files with 2738 additions and 2228 deletions

View File

@@ -378,8 +378,6 @@ class Application extends BaseApplication {
return this.stdout(object);
});
await WelcomeUtils.install(this.dispatch.bind(this));
// If we have some arguments left at this point, it's a command
// so execute it.
if (argv.length) {

View File

@@ -20,18 +20,18 @@
"integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw=="
},
"acorn-globals": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.0.tgz",
"integrity": "sha512-hMtHj3s5RnuhvHPowpBYvJVj3rAar82JiDQHvGs1zO0l10ocX/xEdBShNHTJaboucJUsScghp74pH3s7EnHHQw==",
"version": "4.3.2",
"resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.2.tgz",
"integrity": "sha512-BbzvZhVtZP+Bs1J1HcwrQe8ycfO0wStkSGxuul3He3GkHOIZ6eTqOkPuw9IP1X3+IkOo4wiJmwkobzXYz4wewQ==",
"requires": {
"acorn": "^6.0.1",
"acorn-walk": "^6.0.1"
},
"dependencies": {
"acorn": {
"version": "6.0.6",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.6.tgz",
"integrity": "sha512-5M3G/A4uBSMIlfJ+h9W125vJvPFH/zirISsW5qfxF5YzEvXJCtolLoQvM5yZft0DvMcUrPGKPOlgEu55I6iUtA=="
"version": "6.1.1",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz",
"integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA=="
}
}
},
@@ -454,14 +454,14 @@
}
},
"cssom": {
"version": "0.3.4",
"resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.4.tgz",
"integrity": "sha512-+7prCSORpXNeR4/fUP3rL+TzqtiFfhMvTd7uEqMdgPvLPt4+uzFUeufx5RHjGTACCargg/DiEt/moMQmvnfkog=="
"version": "0.3.6",
"resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.6.tgz",
"integrity": "sha512-DtUeseGk9/GBW0hl0vVPpU22iHL6YB5BUX7ml1hB+GMpo0NX5G4voX3kdWiMSEguFtcW3Vh3djqNF4aIe6ne0A=="
},
"cssstyle": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.1.1.tgz",
"integrity": "sha512-364AI1l/M5TYcFH83JnOH/pSqgaNnKmYgKrm0didZMGKWjQB60dymwWy1rKUgL3J1ffdq9xVi2yGLHdSjjSNog==",
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.2.2.tgz",
"integrity": "sha512-43wY3kl1CVQSvL7wUY1qXkxVGkStjpkDmVjiIKX8R97uhajy8Bybay78uOtqvh7Q5GK75dNPfW0geWjE6qQQow==",
"requires": {
"cssom": "0.3.x"
}
@@ -661,9 +661,9 @@
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
},
"escodegen": {
"version": "1.11.0",
"resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.0.tgz",
"integrity": "sha512-IeMV45ReixHS53K/OmfKAIztN/igDHzTJUhZM3k1jMhIZWjk45SMwAtBsEXiJp3vSPmTcu6CXn7mDvFHRN66fw==",
"version": "1.11.1",
"resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.1.tgz",
"integrity": "sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw==",
"requires": {
"esprima": "^3.1.3",
"estraverse": "^4.2.0",
@@ -1437,10 +1437,11 @@
"dev": true
},
"joplin-turndown": {
"version": "4.0.11",
"resolved": "https://registry.npmjs.org/joplin-turndown/-/joplin-turndown-4.0.11.tgz",
"integrity": "sha512-2oiwWX0nKYi1NVcaprSsrXQkYdGoRtPWFmnXdWQnQW44jlgjFV38B4VrgliwX5ZMq7cbx6A9IBwfXcBL2YV2NA==",
"version": "4.0.12",
"resolved": "https://registry.npmjs.org/joplin-turndown/-/joplin-turndown-4.0.12.tgz",
"integrity": "sha512-HlxkcIiNFSMLBvYktoXqLLHFGuwQYlcPclo0Peeatw3cPe6iFqSsEgEGY/0bYM/fubA/zpPULrJcjST99BO9wQ==",
"requires": {
"html-entities": "^1.2.1",
"jsdom": "^11.9.0"
}
},
@@ -1499,9 +1500,9 @@
},
"dependencies": {
"ajv": {
"version": "6.7.0",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.7.0.tgz",
"integrity": "sha512-RZXPviBTtfmtka9n9sy1N5M5b82CbxWIR6HIis4s3WQTXDJamc/0gpCWNGz6EWdWp4DOfjzJfhz/AS9zVPjjWg==",
"version": "6.10.0",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz",
"integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==",
"requires": {
"fast-deep-equal": "^2.0.1",
"fast-json-stable-stringify": "^2.0.0",
@@ -1515,9 +1516,9 @@
"integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ=="
},
"combined-stream": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz",
"integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==",
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
"requires": {
"delayed-stream": "~1.0.0"
}
@@ -1557,16 +1558,16 @@
"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
},
"mime-db": {
"version": "1.37.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz",
"integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg=="
"version": "1.40.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz",
"integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA=="
},
"mime-types": {
"version": "2.1.21",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz",
"integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==",
"version": "2.1.24",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz",
"integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==",
"requires": {
"mime-db": "~1.37.0"
"mime-db": "1.40.0"
}
},
"oauth-sign": {
@@ -2030,9 +2031,9 @@
"integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0="
},
"nwsapi": {
"version": "2.0.9",
"resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.0.9.tgz",
"integrity": "sha512-nlWFSCTYQcHk/6A9FFnfhKc14c3aFhfdNBXgo8Qgi9QTBu/qg3Ww+Uiz9wMzXd1T8GFxPc2QIHB6Qtf2XFryFQ=="
"version": "2.1.4",
"resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.1.4.tgz",
"integrity": "sha512-iGfd9Y6SFdTNldEy2L0GUhcarIutFmk+MPWIn9dmj8NMIup03G08uUF2KGbbmv/Ux4RT0VZJoP/sVbWA6d/VIw=="
},
"oauth-sign": {
"version": "0.8.2",
@@ -2411,21 +2412,28 @@
}
},
"request-promise-core": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.1.tgz",
"integrity": "sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY=",
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.2.tgz",
"integrity": "sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==",
"requires": {
"lodash": "^4.13.1"
"lodash": "^4.17.11"
},
"dependencies": {
"lodash": {
"version": "4.17.11",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
"integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg=="
}
}
},
"request-promise-native": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.5.tgz",
"integrity": "sha1-UoF3D2jgyXGeUWP9P6tIIhX0/aU=",
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.7.tgz",
"integrity": "sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w==",
"requires": {
"request-promise-core": "1.1.1",
"stealthy-require": "^1.1.0",
"tough-cookie": ">=2.3.3"
"request-promise-core": "1.1.2",
"stealthy-require": "^1.1.1",
"tough-cookie": "^2.3.3"
}
},
"requires-port": {
@@ -2852,9 +2860,9 @@
"integrity": "sha1-Kb9hXUqnEhvdiYsi1LP5vE4qoD0="
},
"symbol-tree": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz",
"integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY="
"version": "3.2.4",
"resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
"integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw=="
},
"syswide-cas": {
"version": "5.2.0",

View File

@@ -43,7 +43,7 @@
"html-minifier": "^3.5.15",
"image-data-uri": "^2.0.0",
"image-type": "^3.0.0",
"joplin-turndown": "^4.0.11",
"joplin-turndown": "^4.0.12",
"joplin-turndown-plugin-gfm": "^1.0.8",
"jssha": "^2.3.0",
"levenshtein": "^1.0.5",

View File

@@ -37,12 +37,22 @@ describe('HtmlToMd', function() {
const htmlPath = basePath + '/' + htmlFilename;
const mdPath = basePath + '/' + filename(htmlFilename) + '.md';
// if (htmlFilename !== 'picture.html') continue;
// if (htmlFilename !== 'anchor_local.html') continue;
const htmlToMdOptions = {}
if (htmlFilename === 'anchor_local.html') {
// Normally the list of anchor names in the document are retrieved from the HTML code
// This is straightforward when the document is still in DOM format, as with the clipper,
// but otherwise it would need to be somehow parsed out from the HTML. Here we just
// hard code the anchors that we know are in the file.
htmlToMdOptions.anchorNames = ['first', 'second']
}
const html = await shim.fsDriver().readFile(htmlPath);
let expectedMd = await shim.fsDriver().readFile(mdPath);
let actualMd = await htmlToMd.parse('<div>' + html + '</div>', []);
let actualMd = await htmlToMd.parse('<div>' + html + '</div>', htmlToMdOptions);
if (os.EOL === '\r\n') {
expectedMd = expectedMd.replace(/\r\n/g, '\n')

View File

@@ -0,0 +1,6 @@
<p><a href="#first">First</a></p>
<p><a href="#second">Second</a></p>
<p>Third</p>
<p><a name="first"></a>First</p>
<p><a id="second"></a>Second</p>
<p><a id="third"></a>Third</p>

View File

@@ -0,0 +1,11 @@
[First](#first)
[Second](#second)
Third
<a id="first"></a>First
<a id="second"></a>Second
Third

View File

@@ -1 +1 @@
[Some text]()
Some text

View File

@@ -30,6 +30,7 @@ describe('urlUtils', function() {
expect(urlUtils.prependBaseUrl('mailto:emailme@example.com', 'http://example.com')).toBe('mailto:emailme@example.com');
expect(urlUtils.prependBaseUrl('javascript:var%20testing=true', 'http://example.com')).toBe('javascript:var%20testing=true');
expect(urlUtils.prependBaseUrl('http://alreadyabsolute.com', 'http://example.com')).toBe('http://alreadyabsolute.com');
expect(urlUtils.prependBaseUrl('#local-anchor', 'http://example.com')).toBe('#local-anchor');
done();
});

View File

@@ -23,11 +23,12 @@ window.joplinEnv = function() {
return env_;
}
async function browserCaptureVisibleTabs(windowId, options) {
if (browserSupportsPromises_) return browser_.tabs.captureVisibleTab(windowId, { format: 'jpeg' });
async function browserCaptureVisibleTabs(windowId) {
const options = { format: 'jpeg' };
if (browserSupportsPromises_) return browser_.tabs.captureVisibleTab(windowId, options);
return new Promise((resolve, reject) => {
browser_.tabs.captureVisibleTab(windowId, { format: 'jpeg' }, (image) => {
browser_.tabs.captureVisibleTab(windowId, options, (image) => {
resolve(image);
});
});
@@ -56,7 +57,7 @@ browser_.runtime.onMessage.addListener(async (command) => {
const zoom = await browserGetZoom();
const imageDataUrl = await browserCaptureVisibleTabs(null, { format: 'jpeg' });
const imageDataUrl = await browserCaptureVisibleTabs(null);
content = Object.assign({}, command.content);
content.image_data_url = imageDataUrl;

View File

@@ -19,7 +19,7 @@
const protocol = url.toLowerCase().split(':')[0];
if (['http', 'https', 'file'].indexOf(protocol) >= 0) return url;
if (url.indexOf('//')) {
if (url.indexOf('//') === 0) {
return location.protocol + url;
} else if (url[0] === '/') {
return location.protocol + '//' + location.host + url;
@@ -34,8 +34,20 @@
return document.title.trim();
}
function pageLocationOrigin() {
// location.origin normally returns the protocol + domain + port (eg. https://example.com:8080)
// but for file:// protocol this is browser dependant and in particular Firefox returns "null"
// in this case.
if (location.protocol === 'file:') {
return 'file://';
} else {
return location.origin;
}
}
function baseUrl() {
let output = location.origin + location.pathname;
let output = pageLocationOrigin() + location.pathname;
if (output[output.length - 1] !== '/') {
output = output.split('/');
output.pop();
@@ -60,6 +72,20 @@
return output;
}
function getAnchorNames(element) {
const anchors = element.getElementsByTagName('a');
const output = [];
for (let i = 0; i < anchors.length; i++) {
const anchor = anchors[i];
if (anchor.id) {
output.push(anchor.id);
} else if (anchor.name) {
output.push(anchor.name);
}
}
return output;
}
// Cleans up element by removing all its invisible children (which we don't want to render as Markdown)
function cleanUpElement(element, imageSizes) {
const childNodes = element.childNodes;
@@ -117,16 +143,17 @@
async function prepareCommandResponse(command) {
console.info('Got command: ' + command.name);
const clippedContentResponse = (title, html, imageSizes) => {
const clippedContentResponse = (title, html, imageSizes, anchorNames) => {
return {
name: 'clippedContent',
title: title,
html: html,
base_url: baseUrl(),
url: location.origin + location.pathname + location.search,
url: pageLocationOrigin() + location.pathname + location.search,
parent_id: command.parent_id,
tags: command.tags || '',
image_sizes: imageSizes,
anchor_names: anchorNames,
};
}
@@ -143,7 +170,7 @@
response.warning = 'Could not retrieve simplified version of page - full page has been saved instead.';
return response;
}
return clippedContentResponse(article.title, article.body, getImageSizes(document));
return clippedContentResponse(article.title, article.body, getImageSizes(document), getAnchorNames(document));
} else if (command.name === "isProbablyReaderable") {
@@ -156,14 +183,14 @@
const cleanDocument = document.body.cloneNode(true);
const imageSizes = getImageSizes(document, true);
cleanUpElement(cleanDocument, imageSizes);
return clippedContentResponse(pageTitle(), cleanDocument.innerHTML, imageSizes);
return clippedContentResponse(pageTitle(), cleanDocument.innerHTML, imageSizes, getAnchorNames(document));
} else if (command.name === "selectedHtml") {
const range = window.getSelection().getRangeAt(0);
const container = document.createElement('div');
container.appendChild(range.cloneContents());
return clippedContentResponse(pageTitle(), container.innerHTML, getImageSizes(document));
return clippedContentResponse(pageTitle(), container.innerHTML, getImageSizes(document), getAnchorNames(document));
} else if (command.name === 'screenshot') {
@@ -265,7 +292,7 @@
const content = {
title: pageTitle(),
crop_rect: selectionArea,
url: location.origin + location.pathname,
url: pageLocationOrigin() + location.pathname,
parent_id: command.parent_id,
tags: command.tags,
};
@@ -286,8 +313,8 @@
} else if (command.name === "pageUrl") {
let url = location.origin + location.pathname + location.search;
return clippedContentResponse(pageTitle(), url, getImageSizes(document));
let url = pageLocationOrigin() + location.pathname + location.search;
return clippedContentResponse(pageTitle(), url, getImageSizes(document), getAnchorNames(document));
} else {
throw new Error('Unknown command: ' + JSON.stringify(command));

View File

@@ -1,7 +1,7 @@
{
"manifest_version": 2,
"name": "Joplin Web Clipper [DEV]",
"version": "1.0.14",
"version": "1.0.15",
"description": "Capture and save web pages and screenshots from your browser to Joplin.",
"homepage_url": "https://joplinapp.org",
"content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'",

View File

@@ -34,6 +34,7 @@ class Bridge {
parent_id: command.parent_id,
tags: command.tags || '',
image_sizes: command.image_sizes || {},
anchor_names: command.anchor_names || [],
};
this.dispatch({ type: 'CLIPPED_CONTENT_SET', content: content });

View File

@@ -704,6 +704,16 @@ class Application extends BaseApplication {
name: 'commandStartExternalEditing',
});
},
}, {
label: _('Tags'),
screens: ['Main'],
accelerator: 'CommandOrControl+Alt+T',
click: () => {
this.dispatch({
type: 'WINDOW_COMMAND',
name: 'setTags',
});
},
}, {
type: 'separator',
screens: ['Main'],

View File

@@ -398,7 +398,7 @@ class NoteTextComponent extends React.Component {
return this.webviewRef_.current.wrappedInstance;
}
async saveIfNeeded(saveIfNewNote = false) {
async saveIfNeeded(saveIfNewNote = false, options = {}) {
const forceSave = saveIfNewNote && (this.state.note && !this.state.note.id);
if (this.scheduleSaveTimeout_) clearTimeout(this.scheduleSaveTimeout_);
@@ -406,7 +406,7 @@ class NoteTextComponent extends React.Component {
if (!forceSave) {
if (!shared.isModified(this)) return;
}
await shared.saveNoteButton_press(this);
await shared.saveNoteButton_press(this, null, options);
ExternalEditWatcher.instance().updateNoteFile(this.state.note);
}
@@ -1172,6 +1172,9 @@ class NoteTextComponent extends React.Component {
async commandStartExternalEditing() {
try {
await this.saveIfNeeded(true, {
autoTitle: false,
});
await ExternalEditWatcher.instance().openAndWatch(this.state.note);
} catch (error) {
bridge().showErrorMessageBox(_('Error opening note in editor: %s', error.message));

View File

@@ -210,7 +210,7 @@ class PromptDialog extends React.Component {
theme={styles.tagListTheme}
ref={this.answerInput_}
value={this.state.answer}
placeholder={this.props.label ? this.props.label.replace(':', '') : ''}
placeholder=""
components={makeAnimated()}
isMulti={true}
isClearable={false}

View File

@@ -103,7 +103,7 @@ class SideBarComponent extends React.Component {
};
}
style() {
style(depth) {
const theme = themeStyle(this.props.theme);
const itemHeight = 25;
@@ -118,6 +118,8 @@ class SideBarComponent extends React.Component {
// paddingLeft: 14,
display: "flex",
alignItems: "stretch",
// Allow 3 levels of color depth
backgroundColor: theme.depthColor.replace('OPACITY', Math.min(depth * 0.1, 0.3)),
},
listItem: {
fontFamily: theme.fontFamily,
@@ -417,7 +419,7 @@ class SideBarComponent extends React.Component {
const itemTitle = Folder.displayTitle(folder);
let containerStyle = Object.assign({}, this.style().listItemContainer);
let containerStyle = Object.assign({}, this.style(depth).listItemContainer);
if (selected) containerStyle = Object.assign(containerStyle, this.style().listItemSelected);
let expandLinkStyle = Object.assign({}, this.style().listItemExpandIcon);

View File

@@ -1,6 +1,6 @@
{
"name": "Joplin",
"version": "1.0.159",
"version": "1.0.160",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
@@ -159,18 +159,18 @@
"integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw=="
},
"acorn-globals": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.0.tgz",
"integrity": "sha512-hMtHj3s5RnuhvHPowpBYvJVj3rAar82JiDQHvGs1zO0l10ocX/xEdBShNHTJaboucJUsScghp74pH3s7EnHHQw==",
"version": "4.3.2",
"resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.2.tgz",
"integrity": "sha512-BbzvZhVtZP+Bs1J1HcwrQe8ycfO0wStkSGxuul3He3GkHOIZ6eTqOkPuw9IP1X3+IkOo4wiJmwkobzXYz4wewQ==",
"requires": {
"acorn": "^6.0.1",
"acorn-walk": "^6.0.1"
},
"dependencies": {
"acorn": {
"version": "6.0.5",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.5.tgz",
"integrity": "sha512-i33Zgp3XWtmZBMNvCr4azvOFeWVw1Rk6p3hfi3LUDvIFraOMywb1kAtrbi+med14m4Xfpqm3zRZMT+c0FNE7kg=="
"version": "6.1.1",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz",
"integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA=="
}
}
},
@@ -1640,14 +1640,14 @@
"dev": true
},
"cssom": {
"version": "0.3.4",
"resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.4.tgz",
"integrity": "sha512-+7prCSORpXNeR4/fUP3rL+TzqtiFfhMvTd7uEqMdgPvLPt4+uzFUeufx5RHjGTACCargg/DiEt/moMQmvnfkog=="
"version": "0.3.6",
"resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.6.tgz",
"integrity": "sha512-DtUeseGk9/GBW0hl0vVPpU22iHL6YB5BUX7ml1hB+GMpo0NX5G4voX3kdWiMSEguFtcW3Vh3djqNF4aIe6ne0A=="
},
"cssstyle": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.1.1.tgz",
"integrity": "sha512-364AI1l/M5TYcFH83JnOH/pSqgaNnKmYgKrm0didZMGKWjQB60dymwWy1rKUgL3J1ffdq9xVi2yGLHdSjjSNog==",
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.2.2.tgz",
"integrity": "sha512-43wY3kl1CVQSvL7wUY1qXkxVGkStjpkDmVjiIKX8R97uhajy8Bybay78uOtqvh7Q5GK75dNPfW0geWjE6qQQow==",
"requires": {
"cssom": "0.3.x"
}
@@ -2223,9 +2223,9 @@
"dev": true
},
"escodegen": {
"version": "1.11.0",
"resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.0.tgz",
"integrity": "sha512-IeMV45ReixHS53K/OmfKAIztN/igDHzTJUhZM3k1jMhIZWjk45SMwAtBsEXiJp3vSPmTcu6CXn7mDvFHRN66fw==",
"version": "1.11.1",
"resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.1.tgz",
"integrity": "sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw==",
"requires": {
"esprima": "^3.1.3",
"estraverse": "^4.2.0",
@@ -3752,10 +3752,11 @@
"integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
},
"joplin-turndown": {
"version": "4.0.11",
"resolved": "https://registry.npmjs.org/joplin-turndown/-/joplin-turndown-4.0.11.tgz",
"integrity": "sha512-2oiwWX0nKYi1NVcaprSsrXQkYdGoRtPWFmnXdWQnQW44jlgjFV38B4VrgliwX5ZMq7cbx6A9IBwfXcBL2YV2NA==",
"version": "4.0.12",
"resolved": "https://registry.npmjs.org/joplin-turndown/-/joplin-turndown-4.0.12.tgz",
"integrity": "sha512-HlxkcIiNFSMLBvYktoXqLLHFGuwQYlcPclo0Peeatw3cPe6iFqSsEgEGY/0bYM/fubA/zpPULrJcjST99BO9wQ==",
"requires": {
"html-entities": "^1.2.1",
"jsdom": "^11.9.0"
}
},
@@ -4613,9 +4614,9 @@
"integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0="
},
"nwsapi": {
"version": "2.0.9",
"resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.0.9.tgz",
"integrity": "sha512-nlWFSCTYQcHk/6A9FFnfhKc14c3aFhfdNBXgo8Qgi9QTBu/qg3Ww+Uiz9wMzXd1T8GFxPc2QIHB6Qtf2XFryFQ=="
"version": "2.1.4",
"resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.1.4.tgz",
"integrity": "sha512-iGfd9Y6SFdTNldEy2L0GUhcarIutFmk+MPWIn9dmj8NMIup03G08uUF2KGbbmv/Ux4RT0VZJoP/sVbWA6d/VIw=="
},
"oauth-sign": {
"version": "0.8.2",
@@ -5601,21 +5602,28 @@
}
},
"request-promise-core": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.1.tgz",
"integrity": "sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY=",
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.2.tgz",
"integrity": "sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==",
"requires": {
"lodash": "^4.13.1"
"lodash": "^4.17.11"
},
"dependencies": {
"lodash": {
"version": "4.17.11",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
"integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg=="
}
}
},
"request-promise-native": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.5.tgz",
"integrity": "sha1-UoF3D2jgyXGeUWP9P6tIIhX0/aU=",
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.7.tgz",
"integrity": "sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w==",
"requires": {
"request-promise-core": "1.1.1",
"stealthy-require": "^1.1.0",
"tough-cookie": ">=2.3.3"
"request-promise-core": "1.1.2",
"stealthy-require": "^1.1.1",
"tough-cookie": "^2.3.3"
}
},
"require-directory": {
@@ -6045,9 +6053,9 @@
"integrity": "sha1-Kb9hXUqnEhvdiYsi1LP5vE4qoD0="
},
"symbol-tree": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz",
"integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY="
"version": "3.2.4",
"resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
"integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw=="
},
"syswide-cas": {
"version": "5.1.0",

View File

@@ -1,6 +1,6 @@
{
"name": "Joplin",
"version": "1.0.159",
"version": "1.0.160",
"description": "Joplin for Desktop",
"main": "main.js",
"scripts": {
@@ -101,7 +101,7 @@
"highlight.js": "^9.15.6",
"html-entities": "^1.2.1",
"image-type": "^3.0.0",
"joplin-turndown": "^4.0.11",
"joplin-turndown": "^4.0.12",
"joplin-turndown-plugin-gfm": "^1.0.8",
"jssha": "^2.3.1",
"katex": "^0.10.0",

View File

@@ -82,6 +82,7 @@ const lightStyle = {
urlColor: '#155BDA',
backgroundColor2: "#162B3D",
depthColor: 'rgb(100, 182, 253, OPACITY)',
color2: "#f5f5f5",
selectedColor2: "#0269C2",
colorError2: "#ff6c6c",
@@ -119,8 +120,9 @@ const darkStyle = {
urlColor: '#4E87EE',
backgroundColor2: "#181A1D",
depthColor: 'rgb(200, 200, 200, OPACITY)',
color2: "#ffffff",
selectedColor2: "#333333",
selectedColor2: "#013F74",
colorError2: "#ff6c6c",
raisedBackgroundColor: "#474747",

View File

@@ -20,15 +20,15 @@ Three types of applications are available: for the **desktop** (Windows, macOS a
Operating System | Download | Alternative
-----------------|--------|-------------------
Windows (32 and 64-bit) | <a href='https://github.com/laurent22/joplin/releases/download/v1.0.152/Joplin-Setup-1.0.152.exe'><img alt='Get it on Windows' width="134px" src='https://joplinapp.org/images/BadgeWindows.png'/></a> | Or get the <a href='https://github.com/laurent22/joplin/releases/download/v1.0.152/JoplinPortable.exe'>Portable version</a><br><br>The [portable application](https://en.wikipedia.org/wiki/Portable_application) allows installing the software on a portable device such as a USB key. Simply copy the file JoplinPortable.exe in any directory on that USB key ; the application will then create a directory called "JoplinProfile" next to the executable file.
macOS | <a href='https://github.com/laurent22/joplin/releases/download/v1.0.152/Joplin-1.0.152.dmg'><img alt='Get it on macOS' width="134px" src='https://joplinapp.org/images/BadgeMacOS.png'/></a> | You can also use Homebrew: `brew cask install joplin`
Linux | <a href='https://github.com/laurent22/joplin/releases/download/v1.0.152/Joplin-1.0.152-x86_64.AppImage'><img alt='Get it on Linux' width="134px" src='https://joplinapp.org/images/BadgeLinux.png'/></a> | An Arch Linux package [is also available](#terminal-application).<br><br>If it works with your distribution (it has been tested on Ubuntu, Fedora, Gnome and Mint), the recommended way is to use this script as it will handle the desktop icon too:<br><br> `wget -O - https://raw.githubusercontent.com/laurent22/joplin/master/Joplin_install_and_update.sh \| bash`
Windows (32 and 64-bit) | <a href='https://github.com/laurent22/joplin/releases/download/v1.0.159/Joplin-Setup-1.0.159.exe'><img alt='Get it on Windows' width="134px" src='https://joplinapp.org/images/BadgeWindows.png'/></a> | Or get the <a href='https://github.com/laurent22/joplin/releases/download/v1.0.159/JoplinPortable.exe'>Portable version</a><br><br>The [portable application](https://en.wikipedia.org/wiki/Portable_application) allows installing the software on a portable device such as a USB key. Simply copy the file JoplinPortable.exe in any directory on that USB key ; the application will then create a directory called "JoplinProfile" next to the executable file.
macOS | <a href='https://github.com/laurent22/joplin/releases/download/v1.0.159/Joplin-1.0.159.dmg'><img alt='Get it on macOS' width="134px" src='https://joplinapp.org/images/BadgeMacOS.png'/></a> | You can also use Homebrew: `brew cask install joplin`
Linux | <a href='https://github.com/laurent22/joplin/releases/download/v1.0.159/Joplin-1.0.159-x86_64.AppImage'><img alt='Get it on Linux' width="134px" src='https://joplinapp.org/images/BadgeLinux.png'/></a> | An Arch Linux package [is also available](#terminal-application).<br><br>If it works with your distribution (it has been tested on Ubuntu, Fedora, Gnome and Mint), the recommended way is to use this script as it will handle the desktop icon too:<br><br> `wget -O - https://raw.githubusercontent.com/laurent22/joplin/master/Joplin_install_and_update.sh \| bash`
## Mobile applications
Operating System | Download | Alt. Download
-----------------|----------|----------------
Android | <a href='https://play.google.com/store/apps/details?id=net.cozic.joplin&utm_source=GitHub&utm_campaign=README&pcampaignid=MKT-Other-global-all-co-prtnr-py-PartBadge-Mar2515-1'><img alt='Get it on Google Play' height="40px" src='https://joplinapp.org/images/BadgeAndroid.png'/></a> | or [Download APK File](https://github.com/laurent22/joplin-android/releases/download/android-v1.0.261/joplin-v1.0.261.apk)
Android | <a href='https://play.google.com/store/apps/details?id=net.cozic.joplin&utm_source=GitHub&utm_campaign=README&pcampaignid=MKT-Other-global-all-co-prtnr-py-PartBadge-Mar2515-1'><img alt='Get it on Google Play' height="40px" src='https://joplinapp.org/images/BadgeAndroid.png'/></a> | or [Download APK File](https://github.com/laurent22/joplin-android/releases/download/android-v1.0.269/joplin-v1.0.269.apk)
iOS | <a href='https://itunes.apple.com/us/app/joplin/id1315599797'><img alt='Get it on the App Store' height="40px" src='https://joplinapp.org/images/BadgeIOS.png'/></a> | -
## Terminal application

View File

@@ -1,3 +0,0 @@
{
"presets": ["module:metro-react-native-babel-preset"]
}

View File

@@ -19,7 +19,6 @@
[libs]
node_modules/react-native/Libraries/react-native/react-native-interface.js
node_modules/react-native/flow
flow/
[options]
emoji=true
@@ -44,4 +43,4 @@ suppress_comment=\\(.\\|\n\\)*\\$FlowExpectedError
unsafe.enable_getters_and_setters=true
[version]
^0.42.0
^0.92.0

View File

@@ -8,23 +8,13 @@
# - `buck install -r android/app` - compile, install and run application
#
load(":build_defs.bzl", "create_aar_targets", "create_jar_targets")
lib_deps = []
for jarfile in glob(['libs/*.jar']):
name = 'jars__' + jarfile[jarfile.rindex('/') + 1: jarfile.rindex('.jar')]
lib_deps.append(':' + name)
prebuilt_jar(
name = name,
binary_jar = jarfile,
)
create_aar_targets(glob(["libs/*.aar"]))
for aarfile in glob(['libs/*.aar']):
name = 'aars__' + aarfile[aarfile.rindex('/') + 1: aarfile.rindex('.aar')]
lib_deps.append(':' + name)
android_prebuilt_aar(
name = name,
aar = aarfile,
)
create_jar_targets(glob(["libs/*.jar"]))
android_library(
name = "all-libs",

View File

@@ -84,24 +84,29 @@ def enableProguardInReleaseBuilds = false
android {
compileSdkVersion rootProject.ext.compileSdkVersion
buildToolsVersion rootProject.ext.buildToolsVersion
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
defaultConfig {
applicationId "net.cozic.joplin"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 2097497
versionName "1.0.261"
versionCode 2097505
versionName "1.0.269"
ndk {
abiFilters "armeabi-v7a", "x86"
}
missingDimensionStrategy 'react-native-camera', 'general'
}
splits {
abi {
reset()
enable enableSeparateBuildPerCPUArchitecture
universalApk false // If true, also generate a universal APK
include "armeabi-v7a", "x86"
include "armeabi-v7a", "x86", "arm64-v8a", "x86_64"
}
}
signingConfigs {
@@ -126,7 +131,7 @@ android {
variant.outputs.each { output ->
// For each separate APK per architecture, set a unique version code as described here:
// http://tools.android.com/tech-docs/new-build-system/user-guide/apk-splits
def versionCodes = ["armeabi-v7a":1, "x86":2]
def versionCodes = ["armeabi-v7a":1, "x86":2, "arm64-v8a": 3, "x86_64": 4]
def abi = output.getFilter(OutputFile.ABI)
if (abi != null) { // null for the universal-debug, universal-release variants
output.versionCodeOverride =
@@ -134,21 +139,28 @@ android {
}
}
}
packagingOptions {
pickFirst '**/libjsc.so'
pickFirst '**/libc++_shared.so'
}
}
dependencies {
implementation project(':@react-native-community_slider')
implementation "org.webkit:android-jsc:r241213"
implementation project(':react-native-webview')
compile project(':react-native-push-notification')
implementation (project(':react-native-camera')) {
// This is required because com.google.firebase requires v16.0.x of com.google.android.gms
// while react-native-camera requires v15.x, which results in broken dependencies with
// this error message:
//
// The library com.google.android.gms:play-services-base is being requested by various other libraries at [[15.0.1,15.0.1]], but resolves to 16.0.1
//
// For the record: found solution by removing all Firebase stuff here and running "gradlew.bat :app:dependencies"
// That shows that react-native-camera was the one requiring v15.0.1.
exclude group: "com.google.android.gms"
}
// implementation (project(':react-native-camera')) {
// // This is required because com.google.firebase requires v16.0.x of com.google.android.gms
// // while react-native-camera requires v15.x, which results in broken dependencies with
// // this error message:
// //
// // The library com.google.android.gms:play-services-base is being requested by various other libraries at [[15.0.1,15.0.1]], but resolves to 16.0.1
// //
// // For the record: found solution by removing all Firebase stuff here and running "gradlew.bat :app:dependencies"
// // That shows that react-native-camera was the one requiring v15.0.1.
// exclude group: "com.google.android.gms"
// }
implementation project(':react-native-file-viewer')
implementation project(':react-native-securerandom')
implementation project(':react-native-fs')
@@ -164,6 +176,7 @@ dependencies {
implementation project(':react-native-image-resizer')
implementation project(':react-native-share-extension')
implementation project(':react-native-version-info')
implementation project(':react-native-camera')
implementation "com.facebook.react:react-native:+"
// implementation "com.google.android.gms:play-services-base:16.0.1" // For Firebase

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<application android:usesCleartextTraffic="true" tools:targetApi="28" tools:ignore="GoogleAppIndexingWarning" />
</manifest>

View File

@@ -3,8 +3,9 @@ package net.cozic.joplin;
import android.app.Application;
import com.facebook.react.ReactApplication;
import com.reactnativecommunity.slider.ReactSliderPackage;
import com.reactnativecommunity.webview.RNCWebViewPackage;
import com.dieam.reactnativepushnotification.ReactNativePushNotificationPackage;
import org.reactnative.camera.RNCameraPackage;
import com.vinzscam.reactnativefileviewer.RNFileViewerPackage;
import net.rhogan.rnsecurerandom.RNSecureRandomPackage;
import com.imagepicker.ImagePickerPackage;
@@ -19,6 +20,7 @@ import com.RNFetchBlob.RNFetchBlobPackage;
import com.rnfs.RNFSPackage;
import fr.bamlab.rnimageresizer.ImageResizerPackage;
import org.pgsqlite.SQLitePluginPackage;
import org.reactnative.camera.RNCameraPackage;
import com.alinz.parkerdan.shareextension.SharePackage;
@@ -39,9 +41,10 @@ public class MainApplication extends Application implements ReactApplication {
protected List<ReactPackage> getPackages() {
return Arrays.<ReactPackage>asList(
new MainReactPackage(),
new ReactSliderPackage(),
new RNCWebViewPackage(),
new ReactNativePushNotificationPackage(),
new ImageResizerPackage(),
new RNCameraPackage(),
new RNFileViewerPackage(),
new RNSecureRandomPackage(),
new ImagePickerPackage(),
@@ -51,6 +54,7 @@ public class MainApplication extends Application implements ReactApplication {
new SQLitePluginPackage(),
new VectorIconsPackage(),
new SharePackage(),
new RNCameraPackage(),
new RNVersionInfoPackage()
);
}

View File

@@ -2,18 +2,18 @@
buildscript {
ext {
buildToolsVersion = "27.0.3"
buildToolsVersion = "28.0.3"
minSdkVersion = 16
compileSdkVersion = 27
targetSdkVersion = 26
supportLibVersion = "27.1.1"
compileSdkVersion = 28
targetSdkVersion = 28
supportLibVersion = "28.0.0"
}
repositories {
jcenter()
google()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.2.0' // Upgraded from 3.1.4 to 3.2.0 for Firebase
classpath("com.android.tools.build:gradle:3.4.0")
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
@@ -25,6 +25,7 @@ allprojects {
mavenLocal()
google()
jcenter() // Was added by me - still needed?
maven { url "https://jitpack.io" }
maven {
url "https://maven.google.com"
}
@@ -32,23 +33,22 @@ allprojects {
// All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
url "$rootDir/../node_modules/react-native/android"
}
maven {
url "$rootDir/../node_modules/jsc-android/dist"
}
}
}
// TODO: Maybe remove this (forgot why it was needed - probably to make some module work)
subprojects {
afterEvaluate {project ->
if (project.hasProperty("android")) {
android {
compileSdkVersion 26
buildToolsVersion "27.0.3"
compileSdkVersion 28
buildToolsVersion "28.0.3"
}
}
}
}
task wrapper(type: Wrapper) {
gradleVersion = '4.4'
distributionUrl = distributionUrl.replace("bin", "all")
}

View File

@@ -16,3 +16,8 @@
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true
# Required for react-native-webview
# https://github.com/react-native-community/react-native-webview/blob/master/docs/Getting-Started.md
# android.useAndroidX=true
# android.enableJetifier=true

View File

@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip

View File

@@ -1,5 +1,21 @@
#!/usr/bin/env sh
#
# Copyright 2015 the original author or authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
##############################################################################
##
## Gradle start up script for UN*X
@@ -28,7 +44,7 @@ APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS=""
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"

View File

@@ -1,3 +1,19 @@
@rem
@rem Copyright 2015 the original author or authors.
@rem
@rem Licensed under the Apache License, Version 2.0 (the "License");
@rem you may not use this file except in compliance with the License.
@rem You may obtain a copy of the License at
@rem
@rem http://www.apache.org/licenses/LICENSE-2.0
@rem
@rem Unless required by applicable law or agreed to in writing, software
@rem distributed under the License is distributed on an "AS IS" BASIS,
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@@ -14,7 +30,7 @@ set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS=
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome

View File

@@ -1,6 +1,8 @@
rootProject.name = 'Joplin'
include ':react-native-camera'
project(':react-native-camera').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-camera/android')
include ':@react-native-community_slider'
project(':@react-native-community_slider').projectDir = new File(rootProject.projectDir, '../node_modules/@react-native-community/slider/android')
include ':react-native-webview'
project(':react-native-webview').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-webview/android')
include ':react-native-file-viewer'
project(':react-native-file-viewer').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-file-viewer/android')
include ':react-native-securerandom'
@@ -33,4 +35,7 @@ include ':react-native-version-info'
project(':react-native-version-info').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-version-info/android')
include ':react-native-push-notification'
project(':react-native-push-notification').projectDir = file('../node_modules/react-native-push-notification/android')
project(':react-native-push-notification').projectDir = file('../node_modules/react-native-push-notification/android')
include ':react-native-camera'
project(':react-native-camera').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-camera/android')

View File

@@ -14,7 +14,6 @@
00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */; };
065B3D792187B61200002863 /* libRNVersionInfo.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 065B3D772187B5E300002863 /* libRNVersionInfo.a */; };
0DAD2E67F6A14BDC8250B927 /* libRNDocumentPicker.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 82214D3345D846709A314868 /* libRNDocumentPicker.a */; };
12AE298E1C0E445682922DAB /* libRNCamera.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E132B594F4FB4C96A2E2B0FF /* libRNCamera.a */; };
133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 78C398B91ACF4ADC00677621 /* libRCTLinking.a */; };
139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */; };
139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */; };
@@ -25,9 +24,12 @@
146834051AC3E58100842450 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; };
1E71C4672AEC47CE94DFF507 /* Feather.ttf in Resources */ = {isa = PBXBuildFile; fileRef = FD370E24D76E461D960DD85D /* Feather.ttf */; };
350318CF7C9E4BD68821EBE9 /* Ionicons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = FF411B45E68B4A8CBCC35777 /* Ionicons.ttf */; };
45E8D3F9FBA0410E82E28A0D /* libRNCWebView.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C7A5EE79128470A920D4971 /* libRNCWebView.a */; };
4D05897622B446600072ECCC /* libRNCamera.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4D05896A22B4464B0072ECCC /* libRNCamera.a */; };
4DDA31241FC88F2400B5A80D /* libRCTPushNotification.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4DDA310F1FC88EEB00B5A80D /* libRCTPushNotification.a */; };
5AFCE00CC1414FE6BD618F0D /* MaterialIcons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 15FD7D2C8F0A445BBA807A9D /* MaterialIcons.ttf */; };
5E9157361DD0AC6A00FF2AA8 /* libRCTAnimation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */; };
65B672EE2B5A43E0919683EA /* libRNCSlider.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 090D1FCD537D494CBC153ED6 /* libRNCSlider.a */; };
725A77EC604947A0AFF12C2B /* libRNFetchBlob.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F5E37D05726A4A08B2EE323A /* libRNFetchBlob.a */; };
73F8D08845494D1396B6CD0B /* Entypo.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 1F79F2CD7CED446B986A6252 /* Entypo.ttf */; };
82C61D3DAE0A4666883001E9 /* libRNFileViewer.a in Frameworks */ = {isa = PBXBuildFile; fileRef = CCDC2774CD86466F897D88E2 /* libRNFileViewer.a */; };
@@ -45,6 +47,8 @@
E8DD8252C0DD4CF1B53590E9 /* SimpleLineIcons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 69B8EE98BFBC4AABA4885BB0 /* SimpleLineIcons.ttf */; };
EA501DCDCF4745E9B63ECE98 /* Octicons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 7D46CBDF8846409890AD7A84 /* Octicons.ttf */; };
EC11356C90E9419799A2626F /* EvilIcons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 51BCEC3BC28046C8BB19531F /* EvilIcons.ttf */; };
ED297163215061F000B7C4FE /* JavaScriptCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED297162215061F000B7C4FE /* JavaScriptCore.framework */; };
ED2971652150620600B7C4FE /* JavaScriptCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED2971642150620600B7C4FE /* JavaScriptCore.framework */; };
F3D0BB525E6C490294D73075 /* libRNSecureRandom.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 22647ACF9A4C45918C44C599 /* libRNSecureRandom.a */; };
FBF57CE2F0F448FA9A8985E2 /* libsqlite3.0.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 0EB8BCAEA9AA41CAAE460443 /* libsqlite3.0.tbd */; };
/* End PBXBuildFile section */
@@ -127,12 +131,47 @@
remoteGlobalIDString = 3D3CD9251DE5FBEC00167DC4;
remoteInfo = cxxreact;
};
3DAD3EAC1DF850E9000B6D8A /* PBXContainerItemProxy */ = {
4D0588F522B444490072ECCC /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 3D3CD90B1DE5FBD600167DC4;
remoteInfo = jschelpers;
remoteGlobalIDString = EDEBC6D6214B3E7000DD5AC8;
remoteInfo = jsi;
};
4D0588F722B444490072ECCC /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = EDEBC73B214B45A300DD5AC8;
remoteInfo = jsiexecutor;
};
4D0588F922B444490072ECCC /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = ED296FB6214C9A0900B7C4FE;
remoteInfo = "jsi-tvOS";
};
4D0588FB22B444490072ECCC /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = ED296FEE214C9CF800B7C4FE;
remoteInfo = "jsiexecutor-tvOS";
};
4D05890B22B444490072ECCC /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = DECA9B559982480BBD8F9E84 /* RNCWebView.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 134814201AA4EA6300B7C361;
remoteInfo = RNCWebView;
};
4D05896922B4464B0072ECCC /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 4D05893D22B4464B0072ECCC /* RNCamera.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 4107012F1ACB723B00C6AA39;
remoteInfo = RNCamera;
};
4D2A44E7200015A2001CA388 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
@@ -281,13 +320,6 @@
remoteGlobalIDString = 3D3CD9321DE5FBEE00167DC4;
remoteInfo = "cxxreact-tvOS";
};
4D2AFF8E1FDA002000599716 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 3D3CD9181DE5FBD800167DC4;
remoteInfo = "jschelpers-tvOS";
};
4D2AFF901FDA002000599716 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;
@@ -330,20 +362,6 @@
remoteGlobalIDString = EBF21BFA1FC4989A0052F4D5;
remoteInfo = "jsinspector-tvOS";
};
4D7F8DA420A32BA0008B757D /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 9936F3131F5F2E4B0010BF04;
remoteInfo = privatedata;
};
4D7F8DA620A32BA0008B757D /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 9936F32F1F5F2E5B0010BF04;
remoteInfo = "privatedata-tvOS";
};
4D8B719B2163E8C500136BBC /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 59F5448FAF7345F8B568BD00 /* RNFileViewer.xcodeproj */;
@@ -351,13 +369,6 @@
remoteGlobalIDString = 134814201AA4EA6300B7C361;
remoteInfo = RNFileViewer;
};
4D8C5643217161BF00E93280 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = FC908F114F494130A324B402 /* RNCamera.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 4107012F1ACB723B00C6AA39;
remoteInfo = RNCamera;
};
4DA7F80C1FC1DA9C00353191 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = A4716DB8654B431D894F89E1 /* RNImagePicker.xcodeproj */;
@@ -365,6 +376,13 @@
remoteGlobalIDString = 014A3B5C1C6CF33500B6D375;
remoteInfo = RNImagePicker;
};
4DC3B74E22B44EC300447A39 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = E839F3056BD643A7B4377288 /* RNCSlider.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 28C79A09220DC4CC0061DE82;
remoteInfo = RNCSlider;
};
4DDA310E1FC88EEB00B5A80D /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 4DDA31011FC88EEA00B5A80D /* RCTPushNotification.xcodeproj */;
@@ -418,6 +436,7 @@
00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTVibration.xcodeproj; path = "../node_modules/react-native/Libraries/Vibration/RCTVibration.xcodeproj"; sourceTree = "<group>"; };
02C42EA98156482DB00BF86D /* RNDocumentPicker.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RNDocumentPicker.xcodeproj; path = "../node_modules/react-native-document-picker/ios/RNDocumentPicker.xcodeproj"; sourceTree = "<group>"; };
065B3D412187B5E300002863 /* RNVersionInfo.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RNVersionInfo.xcodeproj; path = "../node_modules/react-native-version-info/ios/RNVersionInfo.xcodeproj"; sourceTree = "<group>"; };
090D1FCD537D494CBC153ED6 /* libRNCSlider.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNCSlider.a; sourceTree = "<group>"; };
0EB8BCAEA9AA41CAAE460443 /* libsqlite3.0.tbd */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libsqlite3.0.tbd; path = usr/lib/libsqlite3.0.tbd; sourceTree = SDKROOT; };
139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTSettings.xcodeproj; path = "../node_modules/react-native/Libraries/Settings/RCTSettings.xcodeproj"; sourceTree = "<group>"; };
139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTWebSocket.xcodeproj; path = "../node_modules/react-native/Libraries/WebSocket/RCTWebSocket.xcodeproj"; sourceTree = "<group>"; };
@@ -436,6 +455,8 @@
381C047F2739439CB3E6452A /* libRNVectorIcons.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNVectorIcons.a; sourceTree = "<group>"; };
3FFC0F5EFDC54862B1F998DD /* Foundation.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Foundation.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Foundation.ttf"; sourceTree = "<group>"; };
44A39642217548C8ADA91CBA /* libRNImagePicker.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNImagePicker.a; sourceTree = "<group>"; };
4C7A5EE79128470A920D4971 /* libRNCWebView.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNCWebView.a; sourceTree = "<group>"; };
4D05893D22B4464B0072ECCC /* RNCamera.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RNCamera.xcodeproj; path = "../node_modules/react-native-camera/ios/RNCamera.xcodeproj"; sourceTree = "<group>"; };
4DA7F7A61FC1196F00353191 /* Joplin.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; name = Joplin.entitlements; path = Joplin/Joplin.entitlements; sourceTree = "<group>"; };
4DDA31011FC88EEA00B5A80D /* RCTPushNotification.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTPushNotification.xcodeproj; path = "../node_modules/react-native/Libraries/PushNotificationIOS/RCTPushNotification.xcodeproj"; sourceTree = "<group>"; };
508DD20D1EA341CA8F730F22 /* libRCTImageResizer.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRCTImageResizer.a; sourceTree = "<group>"; };
@@ -457,12 +478,14 @@
CC3CF4044A914711B8D30D1A /* Zocial.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Zocial.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Zocial.ttf"; sourceTree = "<group>"; };
CCDC2774CD86466F897D88E2 /* libRNFileViewer.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNFileViewer.a; sourceTree = "<group>"; };
CCDE9E9AF09B45F391B1C2AF /* SQLite.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = SQLite.xcodeproj; path = "../node_modules/react-native-sqlite-storage/src/ios/SQLite.xcodeproj"; sourceTree = "<group>"; };
DECA9B559982480BBD8F9E84 /* RNCWebView.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RNCWebView.xcodeproj; path = "../node_modules/react-native-webview/ios/RNCWebView.xcodeproj"; sourceTree = "<group>"; };
DF1C50EBC11E46A3AF87F80A /* RCTImageResizer.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RCTImageResizer.xcodeproj; path = "../node_modules/react-native-image-resizer/ios/RCTImageResizer.xcodeproj"; sourceTree = "<group>"; };
E132B594F4FB4C96A2E2B0FF /* libRNCamera.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNCamera.a; sourceTree = "<group>"; };
E2638D52624B477FABB52B8F /* FontAwesome.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = FontAwesome.ttf; path = "../node_modules/react-native-vector-icons/Fonts/FontAwesome.ttf"; sourceTree = "<group>"; };
E839F3056BD643A7B4377288 /* RNCSlider.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RNCSlider.xcodeproj; path = "../node_modules/@react-native-community/slider/ios/RNCSlider.xcodeproj"; sourceTree = "<group>"; };
ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; };
ED2971642150620600B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS12.0.sdk/System/Library/Frameworks/JavaScriptCore.framework; sourceTree = DEVELOPER_DIR; };
F098E1ACCB594C828C851A57 /* libRNFS.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNFS.a; sourceTree = "<group>"; };
F5E37D05726A4A08B2EE323A /* libRNFetchBlob.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNFetchBlob.a; sourceTree = "<group>"; };
FC908F114F494130A324B402 /* RNCamera.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RNCamera.xcodeproj; path = "../node_modules/react-native-camera/ios/RNCamera.xcodeproj"; sourceTree = "<group>"; };
FD370E24D76E461D960DD85D /* Feather.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Feather.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Feather.ttf"; sourceTree = "<group>"; };
FF411B45E68B4A8CBCC35777 /* Ionicons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Ionicons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Ionicons.ttf"; sourceTree = "<group>"; };
/* End PBXFileReference section */
@@ -472,10 +495,12 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
ED297163215061F000B7C4FE /* JavaScriptCore.framework in Frameworks */,
065B3D792187B61200002863 /* libRNVersionInfo.a in Frameworks */,
4DDA31241FC88F2400B5A80D /* libRCTPushNotification.a in Frameworks */,
ADBDB9381DFEBF1600ED6528 /* libRCTBlob.a in Frameworks */,
5E9157361DD0AC6A00FF2AA8 /* libRCTAnimation.a in Frameworks */,
ED2971652150620600B7C4FE /* JavaScriptCore.framework in Frameworks */,
146834051AC3E58100842450 /* libReact.a in Frameworks */,
5E9157361DD0AC6A00FF2AA8 /* libRCTAnimation.a in Frameworks */,
00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */,
@@ -497,7 +522,9 @@
AF99EEC6C55042F7BFC87583 /* libRNImagePicker.a in Frameworks */,
F3D0BB525E6C490294D73075 /* libRNSecureRandom.a in Frameworks */,
82C61D3DAE0A4666883001E9 /* libRNFileViewer.a in Frameworks */,
12AE298E1C0E445682922DAB /* libRNCamera.a in Frameworks */,
45E8D3F9FBA0410E82E28A0D /* libRNCWebView.a in Frameworks */,
4D05897622B446600072ECCC /* libRNCamera.a in Frameworks */,
65B672EE2B5A43E0919683EA /* libRNCSlider.a in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -549,6 +576,8 @@
04FA5E9085024E3A9DAF0E03 /* Frameworks */ = {
isa = PBXGroup;
children = (
ED297162215061F000B7C4FE /* JavaScriptCore.framework */,
ED2971642150620600B7C4FE /* JavaScriptCore.framework */,
0EB8BCAEA9AA41CAAE460443 /* libsqlite3.0.tbd */,
);
name = Frameworks;
@@ -606,16 +635,32 @@
4D2AFF8B1FDA002000599716 /* libyoga.a */,
3DAD3EA91DF850E9000B6D8A /* libcxxreact.a */,
4D2AFF8D1FDA002000599716 /* libcxxreact.a */,
3DAD3EAD1DF850E9000B6D8A /* libjschelpers.a */,
4D2AFF8F1FDA002000599716 /* libjschelpers.a */,
4D7F8DA120A32BA0008B757D /* libjsinspector.a */,
4D7F8DA320A32BA0008B757D /* libjsinspector-tvOS.a */,
4D3A19271FBDDA9400457703 /* libthird-party.a */,
4D2AFF911FDA002000599716 /* libthird-party.a */,
4D3A192B1FBDDA9400457703 /* libdouble-conversion.a */,
4D2AFF931FDA002000599716 /* libdouble-conversion.a */,
4D7F8DA520A32BA0008B757D /* libprivatedata.a */,
4D7F8DA720A32BA0008B757D /* libprivatedata-tvOS.a */,
4D0588F622B444490072ECCC /* libjsi.a */,
4D0588F822B444490072ECCC /* libjsiexecutor.a */,
4D0588FA22B444490072ECCC /* libjsi-tvOS.a */,
4D0588FC22B444490072ECCC /* libjsiexecutor-tvOS.a */,
);
name = Products;
sourceTree = "<group>";
};
4D05890822B444490072ECCC /* Products */ = {
isa = PBXGroup;
children = (
4D05890C22B444490072ECCC /* libRNCWebView.a */,
);
name = Products;
sourceTree = "<group>";
};
4D05893E22B4464B0072ECCC /* Products */ = {
isa = PBXGroup;
children = (
4D05896A22B4464B0072ECCC /* libRNCamera.a */,
);
name = Products;
sourceTree = "<group>";
@@ -640,7 +685,8 @@
44A39642217548C8ADA91CBA /* libRNImagePicker.a */,
22647ACF9A4C45918C44C599 /* libRNSecureRandom.a */,
CCDC2774CD86466F897D88E2 /* libRNFileViewer.a */,
E132B594F4FB4C96A2E2B0FF /* libRNCamera.a */,
4C7A5EE79128470A920D4971 /* libRNCWebView.a */,
090D1FCD537D494CBC153ED6 /* libRNCSlider.a */,
);
name = "Recovered References";
sourceTree = "<group>";
@@ -702,14 +748,6 @@
name = Products;
sourceTree = "<group>";
};
4D8C5640217161BF00E93280 /* Products */ = {
isa = PBXGroup;
children = (
4D8C5644217161BF00E93280 /* libRNCamera.a */,
);
name = Products;
sourceTree = "<group>";
};
4DA7F8091FC1DA9C00353191 /* Products */ = {
isa = PBXGroup;
children = (
@@ -718,6 +756,14 @@
name = Products;
sourceTree = "<group>";
};
4DC3B74B22B44EC300447A39 /* Products */ = {
isa = PBXGroup;
children = (
4DC3B74F22B44EC300447A39 /* libRNCSlider.a */,
);
name = Products;
sourceTree = "<group>";
};
4DDA31021FC88EEA00B5A80D /* Products */ = {
isa = PBXGroup;
children = (
@@ -766,6 +812,7 @@
832341AE1AAA6A7D00B99B32 /* Libraries */ = {
isa = PBXGroup;
children = (
4D05893D22B4464B0072ECCC /* RNCamera.xcodeproj */,
065B3D412187B5E300002863 /* RNVersionInfo.xcodeproj */,
4DDA31011FC88EEA00B5A80D /* RCTPushNotification.xcodeproj */,
5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */,
@@ -789,7 +836,8 @@
A4716DB8654B431D894F89E1 /* RNImagePicker.xcodeproj */,
252BD7B86BF7435B960DA901 /* RNSecureRandom.xcodeproj */,
59F5448FAF7345F8B568BD00 /* RNFileViewer.xcodeproj */,
FC908F114F494130A324B402 /* RNCamera.xcodeproj */,
DECA9B559982480BBD8F9E84 /* RNCWebView.xcodeproj */,
E839F3056BD643A7B4377288 /* RNCSlider.xcodeproj */,
);
name = Libraries;
sourceTree = "<group>";
@@ -949,8 +997,16 @@
ProjectRef = 146833FF1AC3E56700842450 /* React.xcodeproj */;
},
{
ProductGroup = 4D8C5640217161BF00E93280 /* Products */;
ProjectRef = FC908F114F494130A324B402 /* RNCamera.xcodeproj */;
ProductGroup = 4D05893E22B4464B0072ECCC /* Products */;
ProjectRef = 4D05893D22B4464B0072ECCC /* RNCamera.xcodeproj */;
},
{
ProductGroup = 4DC3B74B22B44EC300447A39 /* Products */;
ProjectRef = E839F3056BD643A7B4377288 /* RNCSlider.xcodeproj */;
},
{
ProductGroup = 4D05890822B444490072ECCC /* Products */;
ProjectRef = DECA9B559982480BBD8F9E84 /* RNCWebView.xcodeproj */;
},
{
ProductGroup = 4D2A85AD1FBCE3AC0028537D /* Products */;
@@ -1074,11 +1130,46 @@
remoteRef = 3DAD3EA81DF850E9000B6D8A /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
3DAD3EAD1DF850E9000B6D8A /* libjschelpers.a */ = {
4D0588F622B444490072ECCC /* libjsi.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
path = libjschelpers.a;
remoteRef = 3DAD3EAC1DF850E9000B6D8A /* PBXContainerItemProxy */;
path = libjsi.a;
remoteRef = 4D0588F522B444490072ECCC /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
4D0588F822B444490072ECCC /* libjsiexecutor.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
path = libjsiexecutor.a;
remoteRef = 4D0588F722B444490072ECCC /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
4D0588FA22B444490072ECCC /* libjsi-tvOS.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
path = "libjsi-tvOS.a";
remoteRef = 4D0588F922B444490072ECCC /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
4D0588FC22B444490072ECCC /* libjsiexecutor-tvOS.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
path = "libjsiexecutor-tvOS.a";
remoteRef = 4D0588FB22B444490072ECCC /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
4D05890C22B444490072ECCC /* libRNCWebView.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
path = libRNCWebView.a;
remoteRef = 4D05890B22B444490072ECCC /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
4D05896A22B4464B0072ECCC /* libRNCamera.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
path = libRNCamera.a;
remoteRef = 4D05896922B4464B0072ECCC /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
4D2A44E8200015A2001CA388 /* libRNSecureRandom.a */ = {
@@ -1228,13 +1319,6 @@
remoteRef = 4D2AFF8C1FDA002000599716 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
4D2AFF8F1FDA002000599716 /* libjschelpers.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
path = libjschelpers.a;
remoteRef = 4D2AFF8E1FDA002000599716 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
4D2AFF911FDA002000599716 /* libthird-party.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
@@ -1277,20 +1361,6 @@
remoteRef = 4D7F8DA220A32BA0008B757D /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
4D7F8DA520A32BA0008B757D /* libprivatedata.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
path = libprivatedata.a;
remoteRef = 4D7F8DA420A32BA0008B757D /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
4D7F8DA720A32BA0008B757D /* libprivatedata-tvOS.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
path = "libprivatedata-tvOS.a";
remoteRef = 4D7F8DA620A32BA0008B757D /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
4D8B719C2163E8C500136BBC /* libRNFileViewer.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
@@ -1298,13 +1368,6 @@
remoteRef = 4D8B719B2163E8C500136BBC /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
4D8C5644217161BF00E93280 /* libRNCamera.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
path = libRNCamera.a;
remoteRef = 4D8C5643217161BF00E93280 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
4DA7F80D1FC1DA9C00353191 /* libRNImagePicker.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
@@ -1312,6 +1375,13 @@
remoteRef = 4DA7F80C1FC1DA9C00353191 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
4DC3B74F22B44EC300447A39 /* libRNCSlider.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
path = libRNCSlider.a;
remoteRef = 4DC3B74E22B44EC300447A39 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
4DDA310F1FC88EEB00B5A80D /* libRCTPushNotification.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
@@ -1439,18 +1509,23 @@
"$(SRCROOT)/../node_modules/react-native-image-resizer/ios/RCTImageResizer",
"$(SRCROOT)/../node_modules/react-native-sqlite-storage/src/ios",
"$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager",
"$(SRCROOT)..\node_modules\neact-native-image-pickerios",
"$(SRCROOT)..\node_modules\neact-native-securerandomios",
"$(SRCROOT)..\node_modules\neact-native-file-viewerios",
"$(SRCROOT)/../node_modules/react-native-camera/ios/**",
"$(SRCROOT)..",
ode_modules,
"eact-native-image-pickerios",
"$(SRCROOT)..",
ode_modules,
"eact-native-securerandomios",
"$(SRCROOT)..",
ode_modules,
"eact-native-file-viewerios",
"$(SRCROOT)/../node_modules/react-native-webview/ios",
"$(SRCROOT)/../node_modules/@react-native-community/slider/ios",
);
INFOPLIST_FILE = Joplin/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
"\"$(SRCROOT)/Joplin\"",
"\"$(SRCROOT)/Joplin\"",
"\"$(SRCROOT)/Joplin\"",
);
OTHER_LDFLAGS = (
"$(inherited)",
@@ -1486,15 +1561,14 @@
"$(SRCROOT)..\node_modules\neact-native-image-pickerios",
"$(SRCROOT)..\node_modules\neact-native-securerandomios",
"$(SRCROOT)..\node_modules\neact-native-file-viewerios",
"$(SRCROOT)/../node_modules/react-native-camera/ios/**",
"$(SRCROOT)/../node_modules/react-native-webview/ios",
"$(SRCROOT)/../node_modules/@react-native-community/slider/ios",
);
INFOPLIST_FILE = Joplin/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
"\"$(SRCROOT)/Joplin\"",
"\"$(SRCROOT)/Joplin\"",
"\"$(SRCROOT)/Joplin\"",
);
OTHER_LDFLAGS = (
"$(inherited)",

View File

@@ -1,5 +1,5 @@
/**
* Copyright (c) 2015-present, Facebook, Inc.
* Copyright (c) Facebook, Inc. and its affiliates.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
@@ -7,9 +7,10 @@
* of patent rights can be found in the PATENTS file in the same directory.
*/
#import <React/RCTBridgeDelegate.h>
#import <UIKit/UIKit.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@interface AppDelegate : UIResponder <UIApplicationDelegate, RCTBridgeDelegate>
@property (nonatomic, strong) UIWindow *window;

View File

@@ -1,5 +1,5 @@
/**
* Copyright (c) 2015-present, Facebook, Inc.
* Copyright (c) Facebook, Inc. and its affiliates.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
@@ -9,6 +9,7 @@
#import "AppDelegate.h"
#import <React/RCTBridge.h>
#import <React/RCTBundleURLProvider.h>
#import <React/RCTRootView.h>
#import <React/RCTPushNotificationManager.h>
@@ -17,14 +18,11 @@
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
NSURL *jsCodeLocation;
RCTBridge *bridge = [[RCTBridge alloc] initWithDelegate:self launchOptions:launchOptions];
RCTRootView *rootView = [[RCTRootView alloc] initWithBridge:bridge
moduleName:@"Joplin"
initialProperties:nil];
jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil];
RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation
moduleName:@"Joplin"
initialProperties:nil
launchOptions:launchOptions];
rootView.backgroundColor = [[UIColor alloc] initWithRed:1.0f green:1.0f blue:1.0f alpha:1];
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
@@ -42,4 +40,13 @@
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error { [RCTPushNotificationManager didFailToRegisterForRemoteNotificationsWithError:error]; } // Required for the localNotification event.
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification { [RCTPushNotificationManager didReceiveLocalNotification:notification]; }
- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge
{
#if DEBUG
return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil];
#else
return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];
#endif
}
@end

View File

@@ -1,5 +1,5 @@
/**
* Copyright (c) 2015-present, Facebook, Inc.
* Copyright (c) Facebook, Inc. and its affiliates.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the

View File

@@ -7,6 +7,7 @@ class HtmlToMd {
const turndownPluginGfm = require('joplin-turndown-plugin-gfm').gfm
const turndown = new TurndownService({
headingStyle: 'atx',
anchorNames: options.anchorNames ? options.anchorNames.map(n => n.trim().toLowerCase()) : [],
})
turndown.use(turndownPluginGfm)
turndown.remove('script');

View File

@@ -48,8 +48,13 @@ class CameraView extends Component {
style={{flex:1}}
ref={ref => { this.camera = ref; }}
type={RNCamera.Constants.Type.back}
permissionDialogTitle={_('Permission to use camera')}
permissionDialogMessage={_('Your permission to use your camera is required.')}
captureAudio={false}
androidCameraPermissionOptions={{
title: _('Permission to use camera'),
message: _('Your permission to use your camera is required.'),
buttonPositive: _('OK'),
buttonNegative: _('Cancel'),
}}
>
<View style={{flex:1, justifyContent:'space-between', flexDirection:'column'}}>
<View style={{flex:1, justifyContent:'flex-start'}}>

View File

@@ -1,5 +1,6 @@
const React = require('react'); const Component = React.Component;
const { Platform, WebView, View } = require('react-native');
const { Platform, View } = require('react-native');
const { WebView } = require('react-native-webview');
const { themeStyle } = require('lib/components/global-style.js');
const Resource = require('lib/models/Resource.js');
const Setting = require('lib/models/Setting.js');
@@ -99,6 +100,7 @@ class NoteBodyViewer extends Component {
highlightedKeywords: this.props.highlightedKeywords,
resources: this.props.noteResources,//await shared.attachedResources(bodyToRender),
codeTheme: theme.codeThemeCss,
postMessageSyntax: 'window.ReactNativeWebView.postMessage',
};
let result = this.mdToHtml_.render(bodyToRender, this.props.webViewStyle, mdOptions);
@@ -108,7 +110,7 @@ class NoteBodyViewer extends Component {
const injectedJs = [this.mdToHtml_.injectedJavaScript()];
injectedJs.push(shim.injectedJs('webviewLib'));
injectedJs.push('webviewLib.initialize({ postMessage: msg => { return postMessage(msg); } });');
injectedJs.push('webviewLib.initialize({ postMessage: msg => { return window.ReactNativeWebView.postMessage(msg); } });');
injectedJs.push(`
const readyStateCheckInterval = setInterval(function() {
if (document.readyState === "complete") {
@@ -122,7 +124,7 @@ class NoteBodyViewer extends Component {
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
` + html + `
@@ -162,10 +164,15 @@ class NoteBodyViewer extends Component {
baseUrl: 'file://' + Setting.value('resourceDir') + '/',
};
// Note: useWebKit={false} is needed to go around this bug:
// https://github.com/react-native-community/react-native-webview/issues/376
// However, if we add the <meta> tag as described there, it is no longer necessary and WebKit can be used!
// https://github.com/react-native-community/react-native-webview/issues/312#issuecomment-501991406
return (
<View style={style}>
<WebView
scalesPageToFit={Platform.OS !== 'ios'}
useWebKit={true}
style={webViewStyle}
source={source}
injectedJavaScript={injectedJs.join('\n')}
@@ -175,7 +182,8 @@ class NoteBodyViewer extends Component {
onLoadEnd={() => this.onLoadEnd()}
onError={() => reg.logger().error('WebView error') }
onMessage={(event) => {
let msg = event.nativeEvent.data;
// Since RN 58 (or 59) messages are now escaped twice???
let msg = unescape(unescape(event.nativeEvent.data));
console.info('Got IPC message: ', msg);

View File

@@ -364,6 +364,7 @@ class ScreenHeaderComponent extends Component {
const addFolderChildren = (folders, pickerItems, indent) => {
folders.sort((a, b) => {
if (!a || !b) return -1; // No idea why "a" was undefined at one point
return a.title.toLowerCase() < b.title.toLowerCase() ? -1 : +1;
});

View File

@@ -1,5 +1,5 @@
const React = require('react'); const Component = React.Component;
const { Platform, TouchableOpacity, Linking, View, Switch, Slider, StyleSheet, Text, Button, ScrollView, TextInput } = require('react-native');
const { Platform, TouchableOpacity, Linking, View, Switch, StyleSheet, Text, Button, ScrollView, TextInput } = require('react-native');
const { connect } = require('react-redux');
const { ScreenHeader } = require('lib/components/screen-header.js');
const { _, setLocale } = require('lib/locale.js');
@@ -12,6 +12,8 @@ const SyncTargetRegistry = require('lib/SyncTargetRegistry');
const { reg } = require('lib/registry.js');
const VersionInfo = require('react-native-version-info').default;
import Slider from '@react-native-community/slider';
class ConfigScreenComponent extends BaseScreenComponent {
static navigationOptions(options) {

View File

@@ -1,5 +1,5 @@
const React = require('react'); const Component = React.Component;
const { TextInput, TouchableOpacity, Linking, View, Switch, Slider, StyleSheet, Text, Button, ScrollView, Platform } = require('react-native');
const { TextInput, TouchableOpacity, Linking, View, Switch, StyleSheet, Text, Button, ScrollView, Platform } = require('react-native');
const EncryptionService = require('lib/services/EncryptionService');
const { connect } = require('react-redux');
const { ScreenHeader } = require('lib/components/screen-header.js');

View File

@@ -1,5 +1,5 @@
const React = require('react'); const Component = React.Component;
const { Platform, Clipboard, Keyboard, BackHandler, View, Button, TextInput, WebView, Text, StyleSheet, Linking, Image, Share } = require('react-native');
const { Platform, Clipboard, Keyboard, BackHandler, View, Button, TextInput, Text, StyleSheet, Linking, Image, Share } = require('react-native');
const { connect } = require('react-redux');
const { uuid } = require('lib/uuid.js');
const RNFS = require('react-native-fs');
@@ -157,7 +157,11 @@ class NoteScreenComponent extends BaseScreenComponent {
throw new Error(_('The Joplin mobile app does not currently support this type of link: %s', BaseModel.modelTypeToName(item.type_)));
}
} else {
Linking.openURL(msg);
if (msg.indexOf('file://') === 0) {
throw new Error(_('Links with protocol "%s" are not supported', 'file://'));
} else {
Linking.openURL(msg);
}
}
} catch (error) {
dialogs.error(this, error.message);

View File

@@ -1,6 +1,7 @@
const React = require('react'); const Component = React.Component;
const { View } = require('react-native');
const { WebView, Button, Text } = require('react-native');
const { Button, Text } = require('react-native');
const { WebView } = require('react-native-webview');
const { connect } = require('react-redux');
const Setting = require('lib/models/Setting.js');
const { ScreenHeader } = require('lib/components/screen-header.js');

View File

@@ -85,6 +85,14 @@ class SelectDateTimeDialog extends Component {
cancelBtnText={_('Cancel')}
onDateChange={(date) => { this.setState({ date: this.stringToDate(date) }); }}
style={{width:300}}
customStyles={{
btnConfirm: {
paddingVertical: 0,
},
btnCancel: {
paddingVertical: 0,
},
}}
/>
</View>
</PopupDialog>

View File

@@ -19,7 +19,11 @@ shared.noteExists = async function(noteId) {
return !!existingNote;
}
shared.saveNoteButton_press = async function(comp, folderId = null) {
shared.saveNoteButton_press = async function(comp, folderId = null, options = null) {
options = Object.assign({}, {
autoTitle: true,
}, options);
const releaseMutex = await saveNoteMutex_.acquire();
let note = Object.assign({}, comp.state.note);
@@ -40,18 +44,18 @@ shared.saveNoteButton_press = async function(comp, folderId = null) {
let isNew = !note.id;
let options = { userSideValidation: true };
let saveOptions = { userSideValidation: true };
if (!isNew) {
options.fields = BaseModel.diffObjectsFields(comp.state.lastSavedNote, note);
saveOptions.fields = BaseModel.diffObjectsFields(comp.state.lastSavedNote, note);
}
const hasAutoTitle = comp.state.newAndNoTitleChangeNoteId || (isNew && !note.title);
if (hasAutoTitle) {
if (hasAutoTitle && options.autoTitle) {
note.title = Note.defaultTitle(note);
if (options.fields && options.fields.indexOf('title') < 0) options.fields.push('title');
if (saveOptions.fields && saveOptions.fields.indexOf('title') < 0) saveOptions.fields.push('title');
}
const savedNote = ('fields' in options) && !options.fields.length ? Object.assign({}, note) : await Note.save(note, options);
const savedNote = ('fields' in saveOptions) && !saveOptions.fields.length ? Object.assign({}, note) : await Note.save(note, saveOptions);
const stateNote = comp.state.note;
@@ -80,6 +84,8 @@ shared.saveNoteButton_press = async function(comp, folderId = null) {
if (isNew && hasAutoTitle) newState.newAndNoTitleChangeNoteId = note.id;
if (!options.autoTitle) newState.newAndNoTitleChangeNoteId = null;
comp.setState(newState);
// await shared.refreshAttachedResources(comp, newState.note.body);

View File

@@ -1,5 +1,4 @@
const BaseModel = require('lib/BaseModel.js');
const Resource = require('lib/models/Resource.js');
const { Database } = require('lib/database.js');
class ResourceLocalState extends BaseModel {

View File

@@ -30,4 +30,11 @@ netUtils.findAvailablePort = async (possiblePorts, extraRandomPortsToTry = 20) =
return port;
}
netUtils.mimeTypeFromHeaders = headers => {
if (!headers || !headers['content-type']) return null;
const splitted = headers['content-type'].split(';');
return splitted[0].trim().toLowerCase();
}
module.exports = { netUtils };

View File

@@ -37,9 +37,10 @@ function isHidden(path) {
return b[0] === '.';
}
function safeFileExtension(e) {
function safeFileExtension(e, maxLength = null) {
if (maxLength === null) maxLength = 8;
if (!e || !e.replace) return '';
return e.replace(/[^a-zA-Z0-9]/g, '')
return e.replace(/[^a-zA-Z0-9]/g, '').substr(0, maxLength);
}
function safeFilename(e, maxLength = null, allowSpaces = false) {

View File

@@ -12,6 +12,7 @@ const md5 = require('md5');
const { shim } = require('lib/shim');
const HtmlToMd = require('lib/HtmlToMd');
const urlUtils = require('lib/urlUtils.js');
const { netUtils } = require('lib/net-utils');
const { fileExtension, safeFileExtension, safeFilename, filename } = require('lib/path-utils');
const ApiResponse = require('lib/services/rest/ApiResponse');
const SearchEngineUtils = require('lib/services/SearchEngineUtils');
@@ -365,7 +366,7 @@ class Api {
const imageSizes = requestNote.image_sizes ? requestNote.image_sizes : {};
let note = await this.requestNoteToNote(requestNote);
let note = await this.requestNoteToNote_(requestNote);
const imageUrls = markdownUtils.extractImageUrls(note.body);
@@ -415,7 +416,7 @@ class Api {
return this.htmlToMdParser_;
}
async requestNoteToNote(requestNote) {
async requestNoteToNote_(requestNote) {
const output = {
title: requestNote.title ? requestNote.title : '',
body: requestNote.body ? requestNote.body : '',
@@ -429,6 +430,7 @@ class Api {
// rendering but it makes sure everything will be parsed.
output.body = await this.htmlToMdParser().parse('<div>' + requestNote.body_html + '</div>', {
baseUrl: requestNote.base_url ? requestNote.base_url : '',
anchorNames: requestNote.anchor_names ? requestNote.anchor_names : [],
});
}
@@ -459,6 +461,18 @@ class Api {
return await shim.attachFileToNote(note, tempFilePath);
}
async tryToGuessImageExtFromMimeType_(response, imagePath) {
const mimeType = netUtils.mimeTypeFromHeaders(response.headers);
if (!mimeType) return imagePath;
const newExt = mimeUtils.toFileExtension(mimeType);
if (!newExt) return imagePath;
const newImagePath = imagePath + '.' + newExt;
await shim.fsDriver().move(imagePath, newImagePath);
return newImagePath;
}
async downloadImage_(url, allowFileProtocolImages) {
const tempDir = Setting.value('tempDir');
@@ -466,6 +480,7 @@ class Api {
const name = isDataUrl ? md5(Math.random() + '_' + Date.now()) : filename(url);
let fileExt = isDataUrl ? mimeUtils.toFileExtension(mimeUtils.fromDataUrl(url)) : safeFileExtension(fileExtension(url).toLowerCase());
if (!mimeUtils.fromFileExtension(fileExt)) fileExt = ''; // If the file extension is unknown - clear it.
if (fileExt) fileExt = '.' + fileExt;
let imagePath = tempDir + '/' + safeFilename(name) + fileExt;
if (await shim.fsDriver().exists(imagePath)) imagePath = tempDir + '/' + safeFilename(name) + '_' + md5(Math.random() + '_' + Date.now()).substr(0,10) + fileExt;
@@ -479,7 +494,11 @@ class Api {
const localPath = uri2path(url);
await shim.fsDriver().copy(localPath, imagePath);
} else {
await shim.fetchBlob(url, { path: imagePath });
const response = await shim.fetchBlob(url, { path: imagePath, maxRetry: 1 });
// If we could not find the file extension from the URL, try to get it
// now based on the Content-Type header.
if (!fileExt) imagePath = this.tryToGuessImageExtFromMimeType_(response, imagePath);
}
return imagePath;
} catch (error) {

View File

@@ -155,7 +155,7 @@ class Synchronizer {
// Stop queue but don't set it to null as it may be used to
// retrieve the last few downloads.
this.downloadQueue_.stop();
if (this.downloadQueue_) this.downloadQueue_.stop();
this.logSyncOperation('cancelling', null, null, '');
this.cancelling_ = true;

View File

@@ -25,6 +25,7 @@ urlUtils.prependBaseUrl = function(url, baseUrl) {
if (!url) url = '';
if (!baseUrl) return url;
if (url.indexOf('#') === 0) return url; // Don't prepend if it's a local anchor
if (urlUtils.urlProtocol(url)) return url; // Don't prepend the base URL if the URL already has a scheme
if (url.length >= 2 && url.indexOf('//') === 0) { // If it starts with // it's a protcol-relative URL

View File

@@ -0,0 +1,16 @@
/**
* Metro configuration for React Native
* https://github.com/facebook/react-native
*
* @format
*/
module.exports = {
transformer: {
getTransformOptions: async () => ({
transform: {
experimentalImportSupport: false,
inlineRequires: false,
},
}),
},
};

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
{
"name": "Joplin",
"description": "Joplin for Android",
"description": "Joplin for Mobile",
"license": "MIT",
"version": "0.8.0",
"private": true,
@@ -9,6 +9,7 @@
"postinstall": "node ../Tools/copycss.js && node ../Tools/buildReactNativeInjectedJs.js"
},
"dependencies": {
"@react-native-community/slider": "^1.1.3",
"async-mutex": "^0.1.3",
"base-64": "^0.1.0",
"buffer": "^5.0.8",
@@ -18,6 +19,7 @@
"form-data": "^2.1.4",
"highlight.js": "^9.15.6",
"html-entities": "^1.2.1",
"jsc-android": "241213.1.0",
"katex": "^0.10.0",
"markdown-it": "^8.4.0",
"markdown-it-abbr": "^1.0.4",
@@ -37,15 +39,15 @@
"prop-types": "^15.6.0",
"punycode": "^2.1.1",
"query-string": "4.3.4",
"react": "^16.6.3",
"react-native": "^0.57.8",
"react": "^16.8.3",
"react-native": "^0.59.9",
"react-native-action-button": "^2.6.9",
"react-native-camera": "^1.3.0",
"react-native-camera": "^2.10.2",
"react-native-datepicker": "^1.6.0",
"react-native-dialogbox": "^0.6.6",
"react-native-document-picker": "^2.1.0",
"react-native-dialogbox": "^0.6.10",
"react-native-document-picker": "^2.3.0",
"react-native-dropdownalert": "^3.1.2",
"react-native-file-viewer": "^1.0.5",
"react-native-file-viewer": "^1.0.15",
"react-native-fs": "^2.11.17",
"react-native-image-picker": "^0.26.7",
"react-native-image-resizer": "^1.0.0",
@@ -56,9 +58,10 @@
"react-native-securerandom": "^0.1.1",
"react-native-share-extension": "^1.2.1",
"react-native-side-menu": "^1.1.3",
"react-native-sqlite-storage": "3.3.*",
"react-native-sqlite-storage": "^3.3.10",
"react-native-vector-icons": "^4.4.2",
"react-native-version-info": "^0.5.1",
"react-native-webview": "^5.12.0",
"react-navigation": "^1.0.0-beta.21",
"react-redux": "5.0.7",
"redux": "4.0.0",
@@ -75,7 +78,9 @@
"xml2js": "^0.4.19"
},
"devDependencies": {
"babel-preset-react-native": "1.9.1",
"react-test-renderer": "^16.6.3"
"@babel/core": "^7.4.5",
"@babel/runtime": "^7.4.5",
"metro-react-native-babel-preset": "^0.54.1",
"react-test-renderer": "^16.8.3"
}
}

1
ReactNativeClient/run_ios.sh Executable file
View File

@@ -0,0 +1 @@
react-native run-ios --simulator 'iPhone 6'

View File

@@ -64,19 +64,19 @@ async function main() {
console.info('Building APK file v' + version + '...');
let restoreDir = null;
let apkBuildCmd = 'assembleRelease -PbuildDir=build'; // --console plain
if (await fileExists('/mnt/c/Windows/System32/cmd.exe')) {
apkBuildCmd = '/mnt/c/Windows/System32/cmd.exe /c "cd ReactNativeClient\\android && gradlew.bat ' + apkBuildCmd + '"';
} else {
process.chdir(rnDir + '/android');
apkBuildCmd = './gradlew ' + apkBuildCmd;
restoreDir = rootDir;
}
// let apkBuildCmd = 'assembleRelease -PbuildDir=build'; // --console plain
// if (await fileExists('/mnt/c/Windows/System32/cmd.exe')) {
// apkBuildCmd = '/mnt/c/Windows/System32/cmd.exe /c "cd ReactNativeClient\\android && gradlew.bat ' + apkBuildCmd + '"';
// } else {
// process.chdir(rnDir + '/android');
// apkBuildCmd = './gradlew ' + apkBuildCmd;
// restoreDir = rootDir;
// }
// const output = await execCommand('/mnt/c/Windows/System32/cmd.exe /c "cd ReactNativeClient\\android && gradlew.bat assembleRelease -PbuildDir=build --console plain"');
console.info(apkBuildCmd);
const output = await execCommand(apkBuildCmd);
console.info(output);
// // const output = await execCommand('/mnt/c/Windows/System32/cmd.exe /c "cd ReactNativeClient\\android && gradlew.bat assembleRelease -PbuildDir=build --console plain"');
// console.info(apkBuildCmd);
// const output = await execCommand(apkBuildCmd);
// console.info(output);
if (restoreDir) process.chdir(restoreDir);

View File

@@ -1,7 +1,8 @@
const fs = require('fs-extra');
const { execCommand } = require('./tool-utils.js');
const clipperDir = __dirname + '/../Clipper/joplin-webclipper';
const clipperDir = __dirname + '/../Clipper/joplin-webclipper';
const tmpSourceDir = __dirname + '/../Clipper/joplin-webclipper-source';
async function copyDir(baseSourceDir, sourcePath, baseDestDir) {
await fs.mkdirp(baseDestDir + '/' + sourcePath);
@@ -76,6 +77,12 @@ async function main() {
console.info(await execCommand('mv ' + dist.name + '.zip ..'));
}
console.info('Creating source tarball for code validation...');
process.chdir(clipperDir + '/../');
console.info(await execCommand("rsync -a --delete --exclude 'node_modules/' --exclude 'build/' --exclude 'dist/' " + clipperDir + '/ ' + tmpSourceDir + '/'));
console.info(await execCommand('7z a -tzip joplin-webclipper-source.zip joplin-webclipper-source'));
console.info(await execCommand('mv joplin-webclipper-source.zip ' + clipperDir + '/dist/ && rm -rf joplin-webclipper-source'));
console.info(await execCommand('git pull'));
console.info(await execCommand('git add -A'));
console.info(await execCommand('git commit -m "Clipper release v' + newVersion + '"'));

View File

@@ -270,6 +270,43 @@
</ul>
</div>
<h1><a name="joplin-changelog" href="#joplin-changelog" class="heading-anchor">🔗</a>Joplin changelog</h1>
<h2><a name="v1-0-159-https-github-com-laurent22-joplin-releases-tag-v1-0-159-2019-06-08t00-00-19z" href="#v1-0-159-https-github-com-laurent22-joplin-releases-tag-v1-0-159-2019-06-08t00-00-19z" class="heading-anchor">🔗</a><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.159">v1.0.159</a> - 2019-06-08T00:00:19Z</h2>
<ul>
<li>New: Added option to open development tools, to make it easier to create custom CSS</li>
<li>Improved: Improved tag dialog to make it easier to add and remove tags (<a href="https://github.com/laurent22/joplin/issues/1589">#1589</a>)</li>
<li>Improved: Speed up synchronisation by allowing multiple connections when downloading items (<a href="https://github.com/laurent22/joplin/issues/1633">#1633</a>)</li>
<li>Improved: Better handling of items that cannot be decrypted, including those that cause crashes</li>
<li>Improved: Upgrade TOC plugin version to 4.0.0 to fix various issues (<a href="https://github.com/laurent22/joplin/issues/1603">#1603</a>)</li>
<li>Improved: Improve how font size is applied (<a href="https://github.com/laurent22/joplin/issues/1601">#1601</a>)</li>
<li>Improved: Improved workflow of downloading and decrypting data during sync</li>
<li>Fixed: Fix icon path and directory in Linux install script (<a href="https://github.com/laurent22/joplin/issues/1612">#1612</a>)</li>
<li>Fixed: Handle multiple lines in attributes when importing Enex files (<a href="https://github.com/laurent22/joplin/issues/1583">#1583</a>)</li>
<li>Fixed: Fix issue with revisions being needlessly created when decrypting notes</li>
</ul>
<h2><a name="v1-0-158-https-github-com-laurent22-joplin-releases-tag-v1-0-158-2019-05-27t19-01-18z" href="#v1-0-158-https-github-com-laurent22-joplin-releases-tag-v1-0-158-2019-05-27t19-01-18z" class="heading-anchor">🔗</a><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.158">v1.0.158</a> - 2019-05-27T19:01:18Z</h2>
<ul>
<li>Improved: Enable more options on multimd-table plugin (<a href="https://github.com/laurent22/joplin/issues/1586">#1586</a>)</li>
<li>Improved: Improved config screen with dark theme</li>
<li>Improved: Make bold text more visible (<a href="https://github.com/laurent22/joplin/issues/1575">#1575</a>)</li>
<li>Fixed: Fix internal note links (<a href="https://github.com/laurent22/joplin/issues/1587">#1587</a>)</li>
<li>Fixed: Fixed empty separators in menu</li>
</ul>
<h2><a name="v1-0-157-https-github-com-laurent22-joplin-releases-tag-v1-0-157-2019-05-26t17-55-53z" href="#v1-0-157-https-github-com-laurent22-joplin-releases-tag-v1-0-157-2019-05-26t17-55-53z" class="heading-anchor">🔗</a><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.157">v1.0.157</a> - 2019-05-26T17:55:53Z</h2>
<ul>
<li>New: Added Persian translation (<a href="https://github.com/laurent22/joplin/issues/1539">#1539</a>)</li>
<li>New: Allow downloading attachments on demand or automatically (<a href="https://github.com/laurent22/joplin/issues/1527">#1527</a>) (<a href="https://github.com/laurent22/joplin/issues/1481">#1481</a>)</li>
<li>Improved: Make bold text more visible (<a href="https://github.com/laurent22/joplin/issues/1575">#1575</a>)</li>
<li>Improved: Add number of characters removed and added in revision list</li>
<li>Improved: Remove tags from Welcome item due to issue with cleaning them up afterwards</li>
<li>Improved: Handle missing resource blob when setting resource size</li>
<li>Improved: Gray out checkboxes that have been ticked inside notes</li>
<li>Improved: Put back &quot;Fetched items&quot; message during sync</li>
<li>Improved: When opening a note using Goto Anything, open all its parent notebooks too</li>
<li>Fixed: Clears search when clicking on a notebook. (<a href="https://github.com/laurent22/joplin/issues/1504">#1504</a>) (<a href="https://github.com/laurent22/joplin/issues/1186">#1186</a>)</li>
<li>Fixed: Default sort order for notebooks should be title and ascending (<a href="https://github.com/laurent22/joplin/issues/1541">#1541</a>)</li>
<li>Fixed: Added backticks to auto-wrapping quotes. (<a href="https://github.com/laurent22/joplin/issues/1534">#1534</a>) (<a href="https://github.com/laurent22/joplin/issues/1426">#1426</a>)</li>
<li>Fixed: Prevent app from trying to upload resource it has not downloaded yet</li>
</ul>
<h2><a name="v1-0-153-https-github-com-laurent22-joplin-releases-tag-v1-0-153-2019-05-15t06-27-29z" href="#v1-0-153-https-github-com-laurent22-joplin-releases-tag-v1-0-153-2019-05-15t06-27-29z" class="heading-anchor">🔗</a><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.153">v1.0.153</a> - 2019-05-15T06:27:29Z</h2>
<p>This release only adds additional logging for the note history feature.</p>
<h2><a name="v1-0-152-https-github-com-laurent22-joplin-releases-tag-v1-0-152-2019-05-13t09-08-07z" href="#v1-0-152-https-github-com-laurent22-joplin-releases-tag-v1-0-152-2019-05-13t09-08-07z" class="heading-anchor">🔗</a><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.152">v1.0.152</a> - 2019-05-13T09:08:07Z</h2>
@@ -506,7 +543,7 @@
<h2><a name="v1-0-119-https-github-com-laurent22-joplin-releases-tag-v1-0-119-2018-12-18t12-40-22z" href="#v1-0-119-https-github-com-laurent22-joplin-releases-tag-v1-0-119-2018-12-18t12-40-22z" class="heading-anchor">🔗</a><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.119">v1.0.119</a> - 2018-12-18T12:40:22Z</h2>
<p>Important: This release might be slow on startup due to the need to index all the notes, especially if you have many of them with lots of content. The best is simply to wait for it even if it takes several minutes. This is just a one off and afterwards startup time will be the same as before.</p>
<ul>
<li>New: Fast full text search engine. Works with multiple terms, support for prefixes, can restrict search to either note title or body. See <a href="https://joplinapp.org/#searching">https://joplinapp.org/#searching</a> for more info.</li>
<li>New: Fast full text search engine. Works with multiple terms, support for prefixes, can restrict search to either note title or body. See <a href="https://joplin.cozic.net/#searching">https://joplin.cozic.net/#searching</a> for more info.</li>
<li>New: Search within current note (Ctrl+F).</li>
<li>New: Add separate editor font size option (<a href="https://github.com/laurent22/joplin/issues/1027">#1027</a>)</li>
<li>Changed: Changed global search shortcut to F6.</li>
@@ -519,7 +556,7 @@
<h2><a name="v1-0-118-https-github-com-laurent22-joplin-releases-tag-v1-0-118-2019-01-11t08-34-13z" href="#v1-0-118-https-github-com-laurent22-joplin-releases-tag-v1-0-118-2019-01-11t08-34-13z" class="heading-anchor">🔗</a><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.118">v1.0.118</a> - 2019-01-11T08:34:13Z</h2>
<p>Important: This release might be slow on startup due to the need to index all the notes, especially if you have many of them with lots of content. The best is simply to wait for it even if it takes several minutes. This is just a one off and afterwards startup time will be the same as before.</p>
<ul>
<li>New: Fast full text search engine. Works with multiple terms, support for prefixes, can restrict search to either note title or body. See <a href="https://joplinapp.org/#searching">https://joplinapp.org/#searching</a> for more info.</li>
<li>New: Fast full text search engine. Works with multiple terms, support for prefixes, can restrict search to either note title or body. See <a href="https://joplin.cozic.net/#searching">https://joplin.cozic.net/#searching</a> for more info.</li>
<li>New: Search within current note (Ctrl+F).</li>
<li>New: Add separate editor font size option (<a href="https://github.com/laurent22/joplin/issues/1027">#1027</a>)</li>
<li>Changed: Changed global search shortcut to F6.</li>
@@ -720,7 +757,7 @@
</ul>
<h2><a name="v1-0-93-https-github-com-laurent22-joplin-releases-tag-v1-0-93-2018-05-14t11-36-01z" href="#v1-0-93-https-github-com-laurent22-joplin-releases-tag-v1-0-93-2018-05-14t11-36-01z" class="heading-anchor">🔗</a><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.93">v1.0.93</a> - 2018-05-14T11:36:01Z</h2>
<ul>
<li>New: A portable version is now available. To install it simply copy the file &quot;JoplinPortable.exe&quot; to your USB device. See the documentation for more information - <a href="https://joplinapp.org/#desktop-applications">https://joplinapp.org/#desktop-applications</a></li>
<li>New: A portable version is now available. To install it simply copy the file &quot;JoplinPortable.exe&quot; to your USB device. See the documentation for more information - <a href="https://joplin.cozic.net/#desktop-applications">https://joplin.cozic.net/#desktop-applications</a></li>
<li>Improved: Made import of ENEX files more robust and accurate</li>
<li>Improved: Auto-update process should be more reliable.</li>
<li>Fixed: Made sync-after-save interval longer to made synchronisations less frequent.</li>
@@ -737,7 +774,7 @@
</ul>
<h2><a name="v1-0-89-https-github-com-laurent22-joplin-releases-tag-v1-0-89-2018-05-09t13-05-05z" href="#v1-0-89-https-github-com-laurent22-joplin-releases-tag-v1-0-89-2018-05-09t13-05-05z" class="heading-anchor">🔗</a><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.89">v1.0.89</a> - 2018-05-09T13:05:05Z</h2>
<ul>
<li>New: Resolves <a href="https://github.com/laurent22/joplin/issues/122">#122</a>: Added support for sub-notebooks. Please see doc for more info: <a href="https://joplinapp.org/#sub-notebooks">https://joplinapp.org/#sub-notebooks</a></li>
<li>New: Resolves <a href="https://github.com/laurent22/joplin/issues/122">#122</a>: Added support for sub-notebooks. Please see doc for more info: <a href="https://joplin.cozic.net/#sub-notebooks">https://joplin.cozic.net/#sub-notebooks</a></li>
<li>Improved: Export/Import links to notes</li>
<li>Fixes <a href="https://github.com/laurent22/joplin/issues/480">#480</a>: Ignore invalid flag automatically passed by macOS</li>
<li>Fixes <a href="https://github.com/laurent22/joplin/issues/61">#61</a>: Handle path that ends with slash for file system sync</li>

View File

@@ -289,17 +289,17 @@
<tbody>
<tr>
<td>Windows (32 and 64-bit)</td>
<td><a href='https://github.com/laurent22/joplin/releases/download/v1.0.152/Joplin-Setup-1.0.152.exe'><img alt='Get it on Windows' width="134px" src='https://joplinapp.org/images/BadgeWindows.png'/></a></td>
<td>Or get the <a href='https://github.com/laurent22/joplin/releases/download/v1.0.152/JoplinPortable.exe'>Portable version</a><br><br>The <a href="https://en.wikipedia.org/wiki/Portable_application">portable application</a> allows installing the software on a portable device such as a USB key. Simply copy the file JoplinPortable.exe in any directory on that USB key ; the application will then create a directory called &quot;JoplinProfile&quot; next to the executable file.</td>
<td><a href='https://github.com/laurent22/joplin/releases/download/v1.0.159/Joplin-Setup-1.0.159.exe'><img alt='Get it on Windows' width="134px" src='https://joplinapp.org/images/BadgeWindows.png'/></a></td>
<td>Or get the <a href='https://github.com/laurent22/joplin/releases/download/v1.0.159/JoplinPortable.exe'>Portable version</a><br><br>The <a href="https://en.wikipedia.org/wiki/Portable_application">portable application</a> allows installing the software on a portable device such as a USB key. Simply copy the file JoplinPortable.exe in any directory on that USB key ; the application will then create a directory called &quot;JoplinProfile&quot; next to the executable file.</td>
</tr>
<tr>
<td>macOS</td>
<td><a href='https://github.com/laurent22/joplin/releases/download/v1.0.152/Joplin-1.0.152.dmg'><img alt='Get it on macOS' width="134px" src='https://joplinapp.org/images/BadgeMacOS.png'/></a></td>
<td><a href='https://github.com/laurent22/joplin/releases/download/v1.0.159/Joplin-1.0.159.dmg'><img alt='Get it on macOS' width="134px" src='https://joplinapp.org/images/BadgeMacOS.png'/></a></td>
<td>You can also use Homebrew: <code>brew cask install joplin</code></td>
</tr>
<tr>
<td>Linux</td>
<td><a href='https://github.com/laurent22/joplin/releases/download/v1.0.152/Joplin-1.0.152-x86_64.AppImage'><img alt='Get it on Linux' width="134px" src='https://joplinapp.org/images/BadgeLinux.png'/></a></td>
<td><a href='https://github.com/laurent22/joplin/releases/download/v1.0.159/Joplin-1.0.159-x86_64.AppImage'><img alt='Get it on Linux' width="134px" src='https://joplinapp.org/images/BadgeLinux.png'/></a></td>
<td>An Arch Linux package <a href="#terminal-application">is also available</a>.<br><br>If it works with your distribution (it has been tested on Ubuntu, Fedora, Gnome and Mint), the recommended way is to use this script as it will handle the desktop icon too:<br><br> <code>wget -O - https://raw.githubusercontent.com/laurent22/joplin/master/Joplin_install_and_update.sh \| bash</code></td>
</tr>
</tbody>
@@ -317,7 +317,7 @@
<tr>
<td>Android</td>
<td><a href='https://play.google.com/store/apps/details?id=net.cozic.joplin&utm_source=GitHub&utm_campaign=README&pcampaignid=MKT-Other-global-all-co-prtnr-py-PartBadge-Mar2515-1'><img alt='Get it on Google Play' height="40px" src='https://joplinapp.org/images/BadgeAndroid.png'/></a></td>
<td>or <a href="https://github.com/laurent22/joplin-android/releases/download/android-v1.0.261/joplin-v1.0.261.apk">Download APK File</a></td>
<td>or <a href="https://github.com/laurent22/joplin-android/releases/download/android-v1.0.269/joplin-v1.0.269.apk">Download APK File</a></td>
</tr>
<tr>
<td>iOS</td>

View File

@@ -280,19 +280,19 @@
<tbody>
<tr>
<td>Total Windows downloads</td>
<td>256,045</td>
<td>273,919</td>
</tr>
<tr>
<td>Total macOs downloads</td>
<td>110,964</td>
<td>116,805</td>
</tr>
<tr>
<td>Total Linux downloads</td>
<td>88,124</td>
<td>92,419</td>
</tr>
<tr>
<td>Windows %</td>
<td>56%</td>
<td>57%</td>
</tr>
<tr>
<td>macOS %</td>
@@ -317,92 +317,116 @@
</thead>
<tbody>
<tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.159">v1.0.159</a></td>
<td>2019-06-08T00:00:19Z</td>
<td>121</td>
<td>26</td>
<td>65</td>
<td>212</td>
</tr>
<tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.158">v1.0.158</a></td>
<td>2019-05-27T19:01:18Z</td>
<td>9,384</td>
<td>3,440</td>
<td>1,914</td>
<td>14,738</td>
</tr>
<tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.157">v1.0.157</a></td>
<td>2019-05-26T17:55:53Z</td>
<td>2,126</td>
<td>807</td>
<td>272</td>
<td>3,205</td>
</tr>
<tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.153">v1.0.153</a></td>
<td>2019-05-15T06:27:29Z</td>
<td>358</td>
<td>54</td>
<td>62</td>
<td>474</td>
<td>806</td>
<td>73</td>
<td>94</td>
<td>973</td>
</tr>
<tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.152">v1.0.152</a></td>
<td>2019-05-13T09:08:07Z</td>
<td>8,246</td>
<td>2,954</td>
<td>2,241</td>
<td>13,441</td>
<td>13,703</td>
<td>4,369</td>
<td>4,040</td>
<td>22,112</td>
</tr>
<tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.151">v1.0.151</a></td>
<td>2019-05-12T15:14:32Z</td>
<td>1,926</td>
<td>510</td>
<td>946</td>
<td>3,382</td>
<td>1,927</td>
<td>511</td>
<td>947</td>
<td>3,385</td>
</tr>
<tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.150">v1.0.150</a></td>
<td>2019-05-12T11:27:48Z</td>
<td>395</td>
<td>108</td>
<td>54</td>
<td>557</td>
<td>109</td>
<td>56</td>
<td>560</td>
</tr>
<tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.148">v1.0.148</a></td>
<td>2019-05-08T19:12:24Z</td>
<td>109</td>
<td>33</td>
<td>73</td>
<td>215</td>
<td>111</td>
<td>36</td>
<td>77</td>
<td>224</td>
</tr>
<tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.145">v1.0.145</a></td>
<td>2019-05-03T09:16:53Z</td>
<td>6,841</td>
<td>2,822</td>
<td>1,423</td>
<td>11,086</td>
<td>6,862</td>
<td>2,827</td>
<td>1,425</td>
<td>11,114</td>
</tr>
<tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.143">v1.0.143</a></td>
<td>2019-04-22T10:51:38Z</td>
<td>11,726</td>
<td>3,507</td>
<td>2,761</td>
<td>17,994</td>
<td>11,860</td>
<td>3,512</td>
<td>2,765</td>
<td>18,137</td>
</tr>
<tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.142">v1.0.142</a></td>
<td>2019-04-02T16:44:51Z</td>
<td>14,482</td>
<td>4,510</td>
<td>4,707</td>
<td>23,699</td>
<td>14,490</td>
<td>4,511</td>
<td>4,708</td>
<td>23,709</td>
</tr>
<tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.140">v1.0.140</a></td>
<td>2019-03-10T20:59:58Z</td>
<td>13,478</td>
<td>4,116</td>
<td>2,988</td>
<td>20,582</td>
<td>13,522</td>
<td>4,120</td>
<td>2,994</td>
<td>20,636</td>
</tr>
<tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.139">v1.0.139</a></td>
<td>2019-03-09T10:06:48Z</td>
<td>83</td>
<td>20</td>
<td>24</td>
<td>127</td>
<td>25</td>
<td>128</td>
</tr>
<tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.138">v1.0.138</a></td>
<td>2019-03-03T17:23:00Z</td>
<td>111</td>
<td>113</td>
<td>42</td>
<td>68</td>
<td>221</td>
<td>223</td>
</tr>
<tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.137">v1.0.137</a></td>
@@ -415,10 +439,10 @@
<tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.135">v1.0.135</a></td>
<td>2019-02-27T23:36:57Z</td>
<td>12,160</td>
<td>12,182</td>
<td>3,915</td>
<td>4,044</td>
<td>20,119</td>
<td>4,045</td>
<td>20,142</td>
</tr>
<tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.134">v1.0.134</a></td>
@@ -439,26 +463,26 @@
<tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.127">v1.0.127</a></td>
<td>2019-02-14T23:12:48Z</td>
<td>9,399</td>
<td>9,420</td>
<td>3,127</td>
<td>2,904</td>
<td>15,430</td>
<td>2,905</td>
<td>15,452</td>
</tr>
<tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.126">v1.0.126</a></td>
<td>2019-02-09T19:46:16Z</td>
<td>914</td>
<td>53</td>
<td>108</td>
<td>1,075</td>
<td>109</td>
<td>1,076</td>
</tr>
<tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.125">v1.0.125</a></td>
<td>2019-01-26T18:14:33Z</td>
<td>10,230</td>
<td>3,521</td>
<td>1,689</td>
<td>15,440</td>
<td>3,522</td>
<td>1,693</td>
<td>15,445</td>
</tr>
<tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.120">v1.0.120</a></td>
@@ -473,8 +497,8 @@
<td>2018-12-18T12:40:22Z</td>
<td>8,855</td>
<td>3,203</td>
<td>1,993</td>
<td>14,051</td>
<td>1,994</td>
<td>14,052</td>
</tr>
<tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.118">v1.0.118</a></td>
@@ -488,9 +512,9 @@
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.117">v1.0.117</a></td>
<td>2018-11-24T12:05:24Z</td>
<td>16,208</td>
<td>4,848</td>
<td>4,849</td>
<td>6,359</td>
<td>27,415</td>
<td>27,416</td>
</tr>
<tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.116">v1.0.116</a></td>
@@ -519,10 +543,10 @@
<tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.111">v1.0.111</a></td>
<td>2018-09-30T20:15:09Z</td>
<td>11,879</td>
<td>3,134</td>
<td>3,650</td>
<td>18,663</td>
<td>11,887</td>
<td>3,135</td>
<td>3,653</td>
<td>18,675</td>
</tr>
<tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.110">v1.0.110</a></td>
@@ -537,8 +561,8 @@
<td>2018-09-27T18:01:41Z</td>
<td>2,074</td>
<td>681</td>
<td>311</td>
<td>3,066</td>
<td>314</td>
<td>3,069</td>
</tr>
<tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.108">v1.0.108</a></td>
@@ -577,16 +601,16 @@
<td>2018-06-28T20:25:36Z</td>
<td>14,990</td>
<td>4,656</td>
<td>7,086</td>
<td>26,732</td>
<td>7,102</td>
<td>26,748</td>
</tr>
<tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.103">v1.0.103</a></td>
<td>2018-06-21T19:38:13Z</td>
<td>2,012</td>
<td>858</td>
<td>2,014</td>
<td>859</td>
<td>668</td>
<td>3,538</td>
<td>3,541</td>
</tr>
<tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.101">v1.0.101</a></td>
@@ -623,10 +647,10 @@
<tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.96">v1.0.96</a></td>
<td>2018-05-26T16:36:39Z</td>
<td>2,686</td>
<td>2,688</td>
<td>1,200</td>
<td>1,266</td>
<td>5,152</td>
<td>1,276</td>
<td>5,164</td>
</tr>
<tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.95">v1.0.95</a></td>
@@ -648,17 +672,17 @@
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.93">v1.0.93</a></td>
<td>2018-05-14T11:36:01Z</td>
<td>1,770</td>
<td>924</td>
<td>928</td>
<td>743</td>
<td>3,437</td>
<td>3,441</td>
</tr>
<tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.91">v1.0.91</a></td>
<td>2018-05-10T14:48:04Z</td>
<td>814</td>
<td>535</td>
<td>816</td>
<td>536</td>
<td>290</td>
<td>1,639</td>
<td>1,642</td>
</tr>
<tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.89">v1.0.89</a></td>
@@ -679,202 +703,202 @@
<tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.83">v1.0.83</a></td>
<td>2018-04-04T19:43:58Z</td>
<td>4,565</td>
<td>2,437</td>
<td>2,634</td>
<td>9,636</td>
<td>4,571</td>
<td>2,443</td>
<td>2,639</td>
<td>9,653</td>
</tr>
<tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.82">v1.0.82</a></td>
<td>2018-03-31T19:16:31Z</td>
<td>684</td>
<td>387</td>
<td>100</td>
<td>1,171</td>
<td>686</td>
<td>388</td>
<td>106</td>
<td>1,180</td>
</tr>
<tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.81">v1.0.81</a></td>
<td>2018-03-28T08:13:58Z</td>
<td>985</td>
<td>570</td>
<td>750</td>
<td>2,305</td>
<td>986</td>
<td>572</td>
<td>754</td>
<td>2,312</td>
</tr>
<tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.79">v1.0.79</a></td>
<td>2018-03-23T18:00:11Z</td>
<td>919</td>
<td>513</td>
<td>358</td>
<td>1,790</td>
<td>920</td>
<td>516</td>
<td>361</td>
<td>1,797</td>
</tr>
<tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.78">v1.0.78</a></td>
<td>2018-03-17T15:27:18Z</td>
<td>1,302</td>
<td>841</td>
<td>850</td>
<td>2,993</td>
<td>1,303</td>
<td>845</td>
<td>853</td>
<td>3,001</td>
</tr>
<tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.77">v1.0.77</a></td>
<td>2018-03-16T15:12:35Z</td>
<td>165</td>
<td>87</td>
<td>25</td>
<td>277</td>
<td>166</td>
<td>89</td>
<td>28</td>
<td>283</td>
</tr>
<tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.72">v1.0.72</a></td>
<td>2018-03-14T09:44:35Z</td>
<td>396</td>
<td>235</td>
<td>39</td>
<td>670</td>
<td>397</td>
<td>238</td>
<td>41</td>
<td>676</td>
</tr>
<tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.70">v1.0.70</a></td>
<td>2018-02-28T20:04:30Z</td>
<td>1,844</td>
<td>1,026</td>
<td>1,228</td>
<td>4,098</td>
<td>1,845</td>
<td>1,030</td>
<td>1,233</td>
<td>4,108</td>
</tr>
<tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.67">v1.0.67</a></td>
<td>2018-02-19T22:51:08Z</td>
<td>1,805</td>
<td>583</td>
<td>1,806</td>
<td>585</td>
<td>0</td>
<td>2,388</td>
<td>2,391</td>
</tr>
<tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.66">v1.0.66</a></td>
<td>2018-02-18T23:09:09Z</td>
<td>314</td>
<td>107</td>
<td>72</td>
<td>493</td>
<td>315</td>
<td>109</td>
<td>73</td>
<td>497</td>
</tr>
<tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.65">v1.0.65</a></td>
<td>2018-02-17T20:02:25Z</td>
<td>185</td>
<td>109</td>
<td>119</td>
<td>413</td>
<td>186</td>
<td>110</td>
<td>120</td>
<td>416</td>
</tr>
<tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.64">v1.0.64</a></td>
<td>2018-02-16T00:58:20Z</td>
<td>1,074</td>
<td>529</td>
<td>1,116</td>
<td>2,719</td>
<td>1,076</td>
<td>531</td>
<td>1,117</td>
<td>2,724</td>
</tr>
<tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.63">v1.0.63</a></td>
<td>2018-02-14T19:40:36Z</td>
<td>291</td>
<td>143</td>
<td>83</td>
<td>517</td>
<td>292</td>
<td>145</td>
<td>84</td>
<td>521</td>
</tr>
<tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v1.0.62">v1.0.62</a></td>
<td>2018-02-12T20:19:58Z</td>
<td>549</td>
<td>277</td>
<td>356</td>
<td>1,182</td>
<td>550</td>
<td>281</td>
<td>358</td>
<td>1,189</td>
</tr>
<tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v0.10.61">v0.10.61</a></td>
<td>2018-02-08T18:27:39Z</td>
<td>963</td>
<td>606</td>
<td>945</td>
<td>2,514</td>
<td>964</td>
<td>609</td>
<td>947</td>
<td>2,520</td>
</tr>
<tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v0.10.60">v0.10.60</a></td>
<td>2018-02-06T13:09:56Z</td>
<td>711</td>
<td>498</td>
<td>543</td>
<td>1,752</td>
<td>713</td>
<td>503</td>
<td>545</td>
<td>1,761</td>
</tr>
<tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v0.10.54">v0.10.54</a></td>
<td>2018-01-31T20:21:30Z</td>
<td>1,811</td>
<td>1,442</td>
<td>310</td>
<td>3,563</td>
<td>1,813</td>
<td>1,444</td>
<td>311</td>
<td>3,568</td>
</tr>
<tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v0.10.52">v0.10.52</a></td>
<td>2018-01-31T19:25:18Z</td>
<td>37</td>
<td>616</td>
<td>6</td>
<td>659</td>
<td>38</td>
<td>618</td>
<td>7</td>
<td>663</td>
</tr>
<tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v0.10.51">v0.10.51</a></td>
<td>2018-01-28T18:47:02Z</td>
<td>1,316</td>
<td>1,581</td>
<td>318</td>
<td>3,215</td>
<td>1,317</td>
<td>1,584</td>
<td>319</td>
<td>3,220</td>
</tr>
<tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v0.10.48">v0.10.48</a></td>
<td>2018-01-23T11:19:51Z</td>
<td>1,956</td>
<td>1,733</td>
<td>1,958</td>
<td>1,736</td>
<td>21</td>
<td>3,710</td>
<td>3,715</td>
</tr>
<tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v0.10.47">v0.10.47</a></td>
<td>2018-01-16T17:27:17Z</td>
<td>1,216</td>
<td>1,249</td>
<td>59</td>
<td>2,524</td>
<td>1,218</td>
<td>1,251</td>
<td>60</td>
<td>2,529</td>
</tr>
<tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v0.10.43">v0.10.43</a></td>
<td>2018-01-08T10:12:10Z</td>
<td>3,427</td>
<td>2,328</td>
<td>1,199</td>
<td>6,954</td>
<td>3,428</td>
<td>2,332</td>
<td>1,200</td>
<td>6,960</td>
</tr>
<tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v0.10.41">v0.10.41</a></td>
<td>2018-01-05T20:38:12Z</td>
<td>1,029</td>
<td>1,530</td>
<td>229</td>
<td>2,788</td>
<td>1,030</td>
<td>1,533</td>
<td>231</td>
<td>2,794</td>
</tr>
<tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v0.10.40">v0.10.40</a></td>
<td>2018-01-02T23:16:57Z</td>
<td>1,586</td>
<td>1,753</td>
<td>328</td>
<td>3,667</td>
<td>1,587</td>
<td>1,756</td>
<td>329</td>
<td>3,672</td>
</tr>
<tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v0.10.39">v0.10.39</a></td>
<td>2017-12-11T21:19:44Z</td>
<td>5,518</td>
<td>4,008</td>
<td>2,915</td>
<td>12,441</td>
<td>5,542</td>
<td>4,030</td>
<td>2,937</td>
<td>12,509</td>
</tr>
<tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v0.10.38">v0.10.38</a></td>
@@ -929,8 +953,8 @@
<td>2017-12-01T09:56:44Z</td>
<td>884</td>
<td>1,436</td>
<td>400</td>
<td>2,720</td>
<td>401</td>
<td>2,721</td>
</tr>
<tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v0.10.30">v0.10.30</a></td>
@@ -943,10 +967,10 @@
<tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v0.10.28">v0.10.28</a></td>
<td>2017-11-30T01:07:46Z</td>
<td>1,278</td>
<td>1,280</td>
<td>1,683</td>
<td>864</td>
<td>3,825</td>
<td>3,827</td>
</tr>
<tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v0.10.26">v0.10.26</a></td>
@@ -959,50 +983,50 @@
<tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v0.10.25">v0.10.25</a></td>
<td>2017-11-24T14:27:49Z</td>
<td>136</td>
<td>676</td>
<td>5,473</td>
<td>6,285</td>
<td>138</td>
<td>679</td>
<td>5,547</td>
<td>6,364</td>
</tr>
<tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v0.10.23">v0.10.23</a></td>
<td>2017-11-21T19:38:41Z</td>
<td>124</td>
<td>628</td>
<td>20</td>
<td>772</td>
<td>125</td>
<td>630</td>
<td>21</td>
<td>776</td>
</tr>
<tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v0.10.22">v0.10.22</a></td>
<td>2017-11-20T21:45:57Z</td>
<td>76</td>
<td>627</td>
<td>11</td>
<td>714</td>
<td>77</td>
<td>629</td>
<td>13</td>
<td>719</td>
</tr>
<tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v0.10.21">v0.10.21</a></td>
<td>2017-11-18T00:53:15Z</td>
<td>44</td>
<td>619</td>
<td>4</td>
<td>667</td>
<td>45</td>
<td>622</td>
<td>5</td>
<td>672</td>
</tr>
<tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v0.10.20">v0.10.20</a></td>
<td>2017-11-17T17:18:25Z</td>
<td>23</td>
<td>628</td>
<td>14</td>
<td>665</td>
<td>25</td>
<td>630</td>
<td>15</td>
<td>670</td>
</tr>
<tr>
<td><a href="https://github.com/laurent22/joplin/releases/tag/v0.10.19">v0.10.19</a></td>
<td>2017-11-20T18:59:48Z</td>
<td>5</td>
<td>618</td>
<td>5</td>
<td>628</td>
<td>6</td>
<td>621</td>
<td>6</td>
<td>633</td>
</tr>
</tbody>
</table>

View File

@@ -1,5 +1,42 @@
# Joplin changelog
## [v1.0.159](https://github.com/laurent22/joplin/releases/tag/v1.0.159) - 2019-06-08T00:00:19Z
- New: Added option to open development tools, to make it easier to create custom CSS
- Improved: Improved tag dialog to make it easier to add and remove tags ([#1589](https://github.com/laurent22/joplin/issues/1589))
- Improved: Speed up synchronisation by allowing multiple connections when downloading items ([#1633](https://github.com/laurent22/joplin/issues/1633))
- Improved: Better handling of items that cannot be decrypted, including those that cause crashes
- Improved: Upgrade TOC plugin version to 4.0.0 to fix various issues ([#1603](https://github.com/laurent22/joplin/issues/1603))
- Improved: Improve how font size is applied ([#1601](https://github.com/laurent22/joplin/issues/1601))
- Improved: Improved workflow of downloading and decrypting data during sync
- Fixed: Fix icon path and directory in Linux install script ([#1612](https://github.com/laurent22/joplin/issues/1612))
- Fixed: Handle multiple lines in attributes when importing Enex files ([#1583](https://github.com/laurent22/joplin/issues/1583))
- Fixed: Fix issue with revisions being needlessly created when decrypting notes
## [v1.0.158](https://github.com/laurent22/joplin/releases/tag/v1.0.158) - 2019-05-27T19:01:18Z
- Improved: Enable more options on multimd-table plugin ([#1586](https://github.com/laurent22/joplin/issues/1586))
- Improved: Improved config screen with dark theme
- Improved: Make bold text more visible ([#1575](https://github.com/laurent22/joplin/issues/1575))
- Fixed: Fix internal note links ([#1587](https://github.com/laurent22/joplin/issues/1587))
- Fixed: Fixed empty separators in menu
## [v1.0.157](https://github.com/laurent22/joplin/releases/tag/v1.0.157) - 2019-05-26T17:55:53Z
- New: Added Persian translation ([#1539](https://github.com/laurent22/joplin/issues/1539))
- New: Allow downloading attachments on demand or automatically ([#1527](https://github.com/laurent22/joplin/issues/1527)) ([#1481](https://github.com/laurent22/joplin/issues/1481))
- Improved: Make bold text more visible ([#1575](https://github.com/laurent22/joplin/issues/1575))
- Improved: Add number of characters removed and added in revision list
- Improved: Remove tags from Welcome item due to issue with cleaning them up afterwards
- Improved: Handle missing resource blob when setting resource size
- Improved: Gray out checkboxes that have been ticked inside notes
- Improved: Put back "Fetched items" message during sync
- Improved: When opening a note using Goto Anything, open all its parent notebooks too
- Fixed: Clears search when clicking on a notebook. ([#1504](https://github.com/laurent22/joplin/issues/1504)) ([#1186](https://github.com/laurent22/joplin/issues/1186))
- Fixed: Default sort order for notebooks should be title and ascending ([#1541](https://github.com/laurent22/joplin/issues/1541))
- Fixed: Added backticks to auto-wrapping quotes. ([#1534](https://github.com/laurent22/joplin/issues/1534)) ([#1426](https://github.com/laurent22/joplin/issues/1426))
- Fixed: Prevent app from trying to upload resource it has not downloaded yet
## [v1.0.153](https://github.com/laurent22/joplin/releases/tag/v1.0.153) - 2019-05-15T06:27:29Z
This release only adds additional logging for the note history feature.
@@ -251,7 +288,7 @@ This big release aims at improving the overall usability of the application and
Important: This release might be slow on startup due to the need to index all the notes, especially if you have many of them with lots of content. The best is simply to wait for it even if it takes several minutes. This is just a one off and afterwards startup time will be the same as before.
- New: Fast full text search engine. Works with multiple terms, support for prefixes, can restrict search to either note title or body. See https://joplinapp.org/#searching for more info.
- New: Fast full text search engine. Works with multiple terms, support for prefixes, can restrict search to either note title or body. See https://joplin.cozic.net/#searching for more info.
- New: Search within current note (Ctrl+F).
- New: Add separate editor font size option ([#1027](https://github.com/laurent22/joplin/issues/1027))
- Changed: Changed global search shortcut to F6.
@@ -265,7 +302,7 @@ Important: This release might be slow on startup due to the need to index all th
Important: This release might be slow on startup due to the need to index all the notes, especially if you have many of them with lots of content. The best is simply to wait for it even if it takes several minutes. This is just a one off and afterwards startup time will be the same as before.
- New: Fast full text search engine. Works with multiple terms, support for prefixes, can restrict search to either note title or body. See https://joplinapp.org/#searching for more info.
- New: Fast full text search engine. Works with multiple terms, support for prefixes, can restrict search to either note title or body. See https://joplin.cozic.net/#searching for more info.
- New: Search within current note (Ctrl+F).
- New: Add separate editor font size option ([#1027](https://github.com/laurent22/joplin/issues/1027))
- Changed: Changed global search shortcut to F6.
@@ -479,7 +516,7 @@ This release is mainly to fix various issues with the recently released Web Clip
## [v1.0.93](https://github.com/laurent22/joplin/releases/tag/v1.0.93) - 2018-05-14T11:36:01Z
- New: A portable version is now available. To install it simply copy the file "JoplinPortable.exe" to your USB device. See the documentation for more information - https://joplinapp.org/#desktop-applications
- New: A portable version is now available. To install it simply copy the file "JoplinPortable.exe" to your USB device. See the documentation for more information - https://joplin.cozic.net/#desktop-applications
- Improved: Made import of ENEX files more robust and accurate
- Improved: Auto-update process should be more reliable.
- Fixed: Made sync-after-save interval longer to made synchronisations less frequent.
@@ -497,7 +534,7 @@ Same as v1.0.90 but with a fix for [#510](https://github.com/laurent22/joplin/is
## [v1.0.89](https://github.com/laurent22/joplin/releases/tag/v1.0.89) - 2018-05-09T13:05:05Z
- New: Resolves [#122](https://github.com/laurent22/joplin/issues/122): Added support for sub-notebooks. Please see doc for more info: https://joplinapp.org/#sub-notebooks
- New: Resolves [#122](https://github.com/laurent22/joplin/issues/122): Added support for sub-notebooks. Please see doc for more info: https://joplin.cozic.net/#sub-notebooks
- Improved: Export/Import links to notes
- Fixes [#480](https://github.com/laurent22/joplin/issues/480): Ignore invalid flag automatically passed by macOS
- Fixes [#61](https://github.com/laurent22/joplin/issues/61): Handle path that ends with slash for file system sync

View File

@@ -2,98 +2,101 @@
Name | Value
--- | ---
Total Windows downloads | 256,045
Total macOs downloads | 110,964
Total Linux downloads | 88,124
Windows % | 56%
Total Windows downloads | 273,919
Total macOs downloads | 116,805
Total Linux downloads | 92,419
Windows % | 57%
macOS % | 24%
Linux % | 19%
Version | Date | Windows | macOS | Linux | Total
--- | --- | --- | --- | --- | ---
[v1.0.153](https://github.com/laurent22/joplin/releases/tag/v1.0.153) | 2019-05-15T06:27:29Z | 358 | 54 | 62 | 474
[v1.0.152](https://github.com/laurent22/joplin/releases/tag/v1.0.152) | 2019-05-13T09:08:07Z | 8,246 | 2,954 | 2,241 | 13,441
[v1.0.151](https://github.com/laurent22/joplin/releases/tag/v1.0.151) | 2019-05-12T15:14:32Z | 1,926 | 510 | 946 | 3,382
[v1.0.150](https://github.com/laurent22/joplin/releases/tag/v1.0.150) | 2019-05-12T11:27:48Z | 395 | 108 | 54 | 557
[v1.0.148](https://github.com/laurent22/joplin/releases/tag/v1.0.148) | 2019-05-08T19:12:24Z | 109 | 33 | 73 | 215
[v1.0.145](https://github.com/laurent22/joplin/releases/tag/v1.0.145) | 2019-05-03T09:16:53Z | 6,841 | 2,822 | 1,423 | 11,086
[v1.0.143](https://github.com/laurent22/joplin/releases/tag/v1.0.143) | 2019-04-22T10:51:38Z | 11,726 | 3,507 | 2,761 | 17,994
[v1.0.142](https://github.com/laurent22/joplin/releases/tag/v1.0.142) | 2019-04-02T16:44:51Z | 14,482 | 4,510 | 4,707 | 23,699
[v1.0.140](https://github.com/laurent22/joplin/releases/tag/v1.0.140) | 2019-03-10T20:59:58Z | 13,478 | 4,116 | 2,988 | 20,582
[v1.0.139](https://github.com/laurent22/joplin/releases/tag/v1.0.139) | 2019-03-09T10:06:48Z | 83 | 20 | 24 | 127
[v1.0.138](https://github.com/laurent22/joplin/releases/tag/v1.0.138) | 2019-03-03T17:23:00Z | 111 | 42 | 68 | 221
[v1.0.159](https://github.com/laurent22/joplin/releases/tag/v1.0.159) | 2019-06-08T00:00:19Z | 121 | 26 | 65 | 212
[v1.0.158](https://github.com/laurent22/joplin/releases/tag/v1.0.158) | 2019-05-27T19:01:18Z | 9,384 | 3,440 | 1,914 | 14,738
[v1.0.157](https://github.com/laurent22/joplin/releases/tag/v1.0.157) | 2019-05-26T17:55:53Z | 2,126 | 807 | 272 | 3,205
[v1.0.153](https://github.com/laurent22/joplin/releases/tag/v1.0.153) | 2019-05-15T06:27:29Z | 806 | 73 | 94 | 973
[v1.0.152](https://github.com/laurent22/joplin/releases/tag/v1.0.152) | 2019-05-13T09:08:07Z | 13,703 | 4,369 | 4,040 | 22,112
[v1.0.151](https://github.com/laurent22/joplin/releases/tag/v1.0.151) | 2019-05-12T15:14:32Z | 1,927 | 511 | 947 | 3,385
[v1.0.150](https://github.com/laurent22/joplin/releases/tag/v1.0.150) | 2019-05-12T11:27:48Z | 395 | 109 | 56 | 560
[v1.0.148](https://github.com/laurent22/joplin/releases/tag/v1.0.148) | 2019-05-08T19:12:24Z | 111 | 36 | 77 | 224
[v1.0.145](https://github.com/laurent22/joplin/releases/tag/v1.0.145) | 2019-05-03T09:16:53Z | 6,862 | 2,827 | 1,425 | 11,114
[v1.0.143](https://github.com/laurent22/joplin/releases/tag/v1.0.143) | 2019-04-22T10:51:38Z | 11,860 | 3,512 | 2,765 | 18,137
[v1.0.142](https://github.com/laurent22/joplin/releases/tag/v1.0.142) | 2019-04-02T16:44:51Z | 14,490 | 4,511 | 4,708 | 23,709
[v1.0.140](https://github.com/laurent22/joplin/releases/tag/v1.0.140) | 2019-03-10T20:59:58Z | 13,522 | 4,120 | 2,994 | 20,636
[v1.0.139](https://github.com/laurent22/joplin/releases/tag/v1.0.139) | 2019-03-09T10:06:48Z | 83 | 20 | 25 | 128
[v1.0.138](https://github.com/laurent22/joplin/releases/tag/v1.0.138) | 2019-03-03T17:23:00Z | 113 | 42 | 68 | 223
[v1.0.137](https://github.com/laurent22/joplin/releases/tag/v1.0.137) | 2019-03-03T01:12:51Z | 547 | 26 | 68 | 641
[v1.0.135](https://github.com/laurent22/joplin/releases/tag/v1.0.135) | 2019-02-27T23:36:57Z | 12,160 | 3,915 | 4,044 | 20,119
[v1.0.135](https://github.com/laurent22/joplin/releases/tag/v1.0.135) | 2019-02-27T23:36:57Z | 12,182 | 3,915 | 4,045 | 20,142
[v1.0.134](https://github.com/laurent22/joplin/releases/tag/v1.0.134) | 2019-02-27T10:21:44Z | 1,431 | 532 | 201 | 2,164
[v1.0.132](https://github.com/laurent22/joplin/releases/tag/v1.0.132) | 2019-02-26T23:02:05Z | 1,046 | 411 | 79 | 1,536
[v1.0.127](https://github.com/laurent22/joplin/releases/tag/v1.0.127) | 2019-02-14T23:12:48Z | 9,399 | 3,127 | 2,904 | 15,430
[v1.0.126](https://github.com/laurent22/joplin/releases/tag/v1.0.126) | 2019-02-09T19:46:16Z | 914 | 53 | 108 | 1,075
[v1.0.125](https://github.com/laurent22/joplin/releases/tag/v1.0.125) | 2019-01-26T18:14:33Z | 10,230 | 3,521 | 1,689 | 15,440
[v1.0.127](https://github.com/laurent22/joplin/releases/tag/v1.0.127) | 2019-02-14T23:12:48Z | 9,420 | 3,127 | 2,905 | 15,452
[v1.0.126](https://github.com/laurent22/joplin/releases/tag/v1.0.126) | 2019-02-09T19:46:16Z | 914 | 53 | 109 | 1,076
[v1.0.125](https://github.com/laurent22/joplin/releases/tag/v1.0.125) | 2019-01-26T18:14:33Z | 10,230 | 3,522 | 1,693 | 15,445
[v1.0.120](https://github.com/laurent22/joplin/releases/tag/v1.0.120) | 2019-01-10T21:42:53Z | 15,555 | 5,164 | 6,489 | 27,208
[v1.0.119](https://github.com/laurent22/joplin/releases/tag/v1.0.119) | 2018-12-18T12:40:22Z | 8,855 | 3,203 | 1,993 | 14,051
[v1.0.119](https://github.com/laurent22/joplin/releases/tag/v1.0.119) | 2018-12-18T12:40:22Z | 8,855 | 3,203 | 1,994 | 14,052
[v1.0.118](https://github.com/laurent22/joplin/releases/tag/v1.0.118) | 2019-01-11T08:34:13Z | 676 | 215 | 75 | 966
[v1.0.117](https://github.com/laurent22/joplin/releases/tag/v1.0.117) | 2018-11-24T12:05:24Z | 16,208 | 4,848 | 6,359 | 27,415
[v1.0.117](https://github.com/laurent22/joplin/releases/tag/v1.0.117) | 2018-11-24T12:05:24Z | 16,208 | 4,849 | 6,359 | 27,416
[v1.0.116](https://github.com/laurent22/joplin/releases/tag/v1.0.116) | 2018-11-20T19:09:24Z | 3,458 | 1,087 | 704 | 5,249
[v1.0.115](https://github.com/laurent22/joplin/releases/tag/v1.0.115) | 2018-11-16T16:52:02Z | 3,628 | 1,280 | 784 | 5,692
[v1.0.114](https://github.com/laurent22/joplin/releases/tag/v1.0.114) | 2018-10-24T20:14:10Z | 11,369 | 3,475 | 3,822 | 18,666
[v1.0.111](https://github.com/laurent22/joplin/releases/tag/v1.0.111) | 2018-09-30T20:15:09Z | 11,879 | 3,134 | 3,650 | 18,663
[v1.0.111](https://github.com/laurent22/joplin/releases/tag/v1.0.111) | 2018-09-30T20:15:09Z | 11,887 | 3,135 | 3,653 | 18,675
[v1.0.110](https://github.com/laurent22/joplin/releases/tag/v1.0.110) | 2018-09-29T12:29:21Z | 926 | 376 | 103 | 1,405
[v1.0.109](https://github.com/laurent22/joplin/releases/tag/v1.0.109) | 2018-09-27T18:01:41Z | 2,074 | 681 | 311 | 3,066
[v1.0.109](https://github.com/laurent22/joplin/releases/tag/v1.0.109) | 2018-09-27T18:01:41Z | 2,074 | 681 | 314 | 3,069
[v1.0.108](https://github.com/laurent22/joplin/releases/tag/v1.0.108) | 2018-09-29T18:49:29Z | 13 | 6 | 6 | 25
[v1.0.107](https://github.com/laurent22/joplin/releases/tag/v1.0.107) | 2018-09-16T19:51:07Z | 7,127 | 2,117 | 1,699 | 10,943
[v1.0.106](https://github.com/laurent22/joplin/releases/tag/v1.0.106) | 2018-09-08T15:23:40Z | 4,529 | 1,440 | 309 | 6,278
[v1.0.105](https://github.com/laurent22/joplin/releases/tag/v1.0.105) | 2018-09-05T11:29:36Z | 4,593 | 1,554 | 1,441 | 7,588
[v1.0.104](https://github.com/laurent22/joplin/releases/tag/v1.0.104) | 2018-06-28T20:25:36Z | 14,990 | 4,656 | 7,086 | 26,732
[v1.0.103](https://github.com/laurent22/joplin/releases/tag/v1.0.103) | 2018-06-21T19:38:13Z | 2,012 | 858 | 668 | 3,538
[v1.0.104](https://github.com/laurent22/joplin/releases/tag/v1.0.104) | 2018-06-28T20:25:36Z | 14,990 | 4,656 | 7,102 | 26,748
[v1.0.103](https://github.com/laurent22/joplin/releases/tag/v1.0.103) | 2018-06-21T19:38:13Z | 2,014 | 859 | 668 | 3,541
[v1.0.101](https://github.com/laurent22/joplin/releases/tag/v1.0.101) | 2018-06-17T18:35:11Z | 1,290 | 581 | 401 | 2,272
[v1.0.100](https://github.com/laurent22/joplin/releases/tag/v1.0.100) | 2018-06-14T17:41:43Z | 857 | 410 | 228 | 1,495
[v1.0.99](https://github.com/laurent22/joplin/releases/tag/v1.0.99) | 2018-06-10T13:18:23Z | 1,238 | 581 | 372 | 2,191
[v1.0.97](https://github.com/laurent22/joplin/releases/tag/v1.0.97) | 2018-06-09T19:23:34Z | 297 | 138 | 54 | 489
[v1.0.96](https://github.com/laurent22/joplin/releases/tag/v1.0.96) | 2018-05-26T16:36:39Z | 2,686 | 1,200 | 1,266 | 5,152
[v1.0.96](https://github.com/laurent22/joplin/releases/tag/v1.0.96) | 2018-05-26T16:36:39Z | 2,688 | 1,200 | 1,276 | 5,164
[v1.0.95](https://github.com/laurent22/joplin/releases/tag/v1.0.95) | 2018-05-25T13:04:30Z | 387 | 190 | 87 | 664
[v1.0.94](https://github.com/laurent22/joplin/releases/tag/v1.0.94) | 2018-05-21T20:52:59Z | 1,099 | 557 | 362 | 2,018
[v1.0.93](https://github.com/laurent22/joplin/releases/tag/v1.0.93) | 2018-05-14T11:36:01Z | 1,770 | 924 | 743 | 3,437
[v1.0.91](https://github.com/laurent22/joplin/releases/tag/v1.0.91) | 2018-05-10T14:48:04Z | 814 | 535 | 290 | 1,639
[v1.0.93](https://github.com/laurent22/joplin/releases/tag/v1.0.93) | 2018-05-14T11:36:01Z | 1,770 | 928 | 743 | 3,441
[v1.0.91](https://github.com/laurent22/joplin/releases/tag/v1.0.91) | 2018-05-10T14:48:04Z | 816 | 536 | 290 | 1,642
[v1.0.89](https://github.com/laurent22/joplin/releases/tag/v1.0.89) | 2018-05-09T13:05:05Z | 476 | 212 | 97 | 785
[v1.0.85](https://github.com/laurent22/joplin/releases/tag/v1.0.85) | 2018-05-01T21:08:24Z | 1,641 | 934 | 617 | 3,192
[v1.0.83](https://github.com/laurent22/joplin/releases/tag/v1.0.83) | 2018-04-04T19:43:58Z | 4,565 | 2,437 | 2,634 | 9,636
[v1.0.82](https://github.com/laurent22/joplin/releases/tag/v1.0.82) | 2018-03-31T19:16:31Z | 684 | 387 | 100 | 1,171
[v1.0.81](https://github.com/laurent22/joplin/releases/tag/v1.0.81) | 2018-03-28T08:13:58Z | 985 | 570 | 750 | 2,305
[v1.0.79](https://github.com/laurent22/joplin/releases/tag/v1.0.79) | 2018-03-23T18:00:11Z | 919 | 513 | 358 | 1,790
[v1.0.78](https://github.com/laurent22/joplin/releases/tag/v1.0.78) | 2018-03-17T15:27:18Z | 1,302 | 841 | 850 | 2,993
[v1.0.77](https://github.com/laurent22/joplin/releases/tag/v1.0.77) | 2018-03-16T15:12:35Z | 165 | 87 | 25 | 277
[v1.0.72](https://github.com/laurent22/joplin/releases/tag/v1.0.72) | 2018-03-14T09:44:35Z | 396 | 235 | 39 | 670
[v1.0.70](https://github.com/laurent22/joplin/releases/tag/v1.0.70) | 2018-02-28T20:04:30Z | 1,844 | 1,026 | 1,228 | 4,098
[v1.0.67](https://github.com/laurent22/joplin/releases/tag/v1.0.67) | 2018-02-19T22:51:08Z | 1,805 | 583 | 0 | 2,388
[v1.0.66](https://github.com/laurent22/joplin/releases/tag/v1.0.66) | 2018-02-18T23:09:09Z | 314 | 107 | 72 | 493
[v1.0.65](https://github.com/laurent22/joplin/releases/tag/v1.0.65) | 2018-02-17T20:02:25Z | 185 | 109 | 119 | 413
[v1.0.64](https://github.com/laurent22/joplin/releases/tag/v1.0.64) | 2018-02-16T00:58:20Z | 1,074 | 529 | 1,116 | 2,719
[v1.0.63](https://github.com/laurent22/joplin/releases/tag/v1.0.63) | 2018-02-14T19:40:36Z | 291 | 143 | 83 | 517
[v1.0.62](https://github.com/laurent22/joplin/releases/tag/v1.0.62) | 2018-02-12T20:19:58Z | 549 | 277 | 356 | 1,182
[v0.10.61](https://github.com/laurent22/joplin/releases/tag/v0.10.61) | 2018-02-08T18:27:39Z | 963 | 606 | 945 | 2,514
[v0.10.60](https://github.com/laurent22/joplin/releases/tag/v0.10.60) | 2018-02-06T13:09:56Z | 711 | 498 | 543 | 1,752
[v0.10.54](https://github.com/laurent22/joplin/releases/tag/v0.10.54) | 2018-01-31T20:21:30Z | 1,811 | 1,442 | 310 | 3,563
[v0.10.52](https://github.com/laurent22/joplin/releases/tag/v0.10.52) | 2018-01-31T19:25:18Z | 37 | 616 | 6 | 659
[v0.10.51](https://github.com/laurent22/joplin/releases/tag/v0.10.51) | 2018-01-28T18:47:02Z | 1,316 | 1,581 | 318 | 3,215
[v0.10.48](https://github.com/laurent22/joplin/releases/tag/v0.10.48) | 2018-01-23T11:19:51Z | 1,956 | 1,733 | 21 | 3,710
[v0.10.47](https://github.com/laurent22/joplin/releases/tag/v0.10.47) | 2018-01-16T17:27:17Z | 1,216 | 1,249 | 59 | 2,524
[v0.10.43](https://github.com/laurent22/joplin/releases/tag/v0.10.43) | 2018-01-08T10:12:10Z | 3,427 | 2,328 | 1,199 | 6,954
[v0.10.41](https://github.com/laurent22/joplin/releases/tag/v0.10.41) | 2018-01-05T20:38:12Z | 1,029 | 1,530 | 229 | 2,788
[v0.10.40](https://github.com/laurent22/joplin/releases/tag/v0.10.40) | 2018-01-02T23:16:57Z | 1,586 | 1,753 | 328 | 3,667
[v0.10.39](https://github.com/laurent22/joplin/releases/tag/v0.10.39) | 2017-12-11T21:19:44Z | 5,518 | 4,008 | 2,915 | 12,441
[v1.0.83](https://github.com/laurent22/joplin/releases/tag/v1.0.83) | 2018-04-04T19:43:58Z | 4,571 | 2,443 | 2,639 | 9,653
[v1.0.82](https://github.com/laurent22/joplin/releases/tag/v1.0.82) | 2018-03-31T19:16:31Z | 686 | 388 | 106 | 1,180
[v1.0.81](https://github.com/laurent22/joplin/releases/tag/v1.0.81) | 2018-03-28T08:13:58Z | 986 | 572 | 754 | 2,312
[v1.0.79](https://github.com/laurent22/joplin/releases/tag/v1.0.79) | 2018-03-23T18:00:11Z | 920 | 516 | 361 | 1,797
[v1.0.78](https://github.com/laurent22/joplin/releases/tag/v1.0.78) | 2018-03-17T15:27:18Z | 1,303 | 845 | 853 | 3,001
[v1.0.77](https://github.com/laurent22/joplin/releases/tag/v1.0.77) | 2018-03-16T15:12:35Z | 166 | 89 | 28 | 283
[v1.0.72](https://github.com/laurent22/joplin/releases/tag/v1.0.72) | 2018-03-14T09:44:35Z | 397 | 238 | 41 | 676
[v1.0.70](https://github.com/laurent22/joplin/releases/tag/v1.0.70) | 2018-02-28T20:04:30Z | 1,845 | 1,030 | 1,233 | 4,108
[v1.0.67](https://github.com/laurent22/joplin/releases/tag/v1.0.67) | 2018-02-19T22:51:08Z | 1,806 | 585 | 0 | 2,391
[v1.0.66](https://github.com/laurent22/joplin/releases/tag/v1.0.66) | 2018-02-18T23:09:09Z | 315 | 109 | 73 | 497
[v1.0.65](https://github.com/laurent22/joplin/releases/tag/v1.0.65) | 2018-02-17T20:02:25Z | 186 | 110 | 120 | 416
[v1.0.64](https://github.com/laurent22/joplin/releases/tag/v1.0.64) | 2018-02-16T00:58:20Z | 1,076 | 531 | 1,117 | 2,724
[v1.0.63](https://github.com/laurent22/joplin/releases/tag/v1.0.63) | 2018-02-14T19:40:36Z | 292 | 145 | 84 | 521
[v1.0.62](https://github.com/laurent22/joplin/releases/tag/v1.0.62) | 2018-02-12T20:19:58Z | 550 | 281 | 358 | 1,189
[v0.10.61](https://github.com/laurent22/joplin/releases/tag/v0.10.61) | 2018-02-08T18:27:39Z | 964 | 609 | 947 | 2,520
[v0.10.60](https://github.com/laurent22/joplin/releases/tag/v0.10.60) | 2018-02-06T13:09:56Z | 713 | 503 | 545 | 1,761
[v0.10.54](https://github.com/laurent22/joplin/releases/tag/v0.10.54) | 2018-01-31T20:21:30Z | 1,813 | 1,444 | 311 | 3,568
[v0.10.52](https://github.com/laurent22/joplin/releases/tag/v0.10.52) | 2018-01-31T19:25:18Z | 38 | 618 | 7 | 663
[v0.10.51](https://github.com/laurent22/joplin/releases/tag/v0.10.51) | 2018-01-28T18:47:02Z | 1,317 | 1,584 | 319 | 3,220
[v0.10.48](https://github.com/laurent22/joplin/releases/tag/v0.10.48) | 2018-01-23T11:19:51Z | 1,958 | 1,736 | 21 | 3,715
[v0.10.47](https://github.com/laurent22/joplin/releases/tag/v0.10.47) | 2018-01-16T17:27:17Z | 1,218 | 1,251 | 60 | 2,529
[v0.10.43](https://github.com/laurent22/joplin/releases/tag/v0.10.43) | 2018-01-08T10:12:10Z | 3,428 | 2,332 | 1,200 | 6,960
[v0.10.41](https://github.com/laurent22/joplin/releases/tag/v0.10.41) | 2018-01-05T20:38:12Z | 1,030 | 1,533 | 231 | 2,794
[v0.10.40](https://github.com/laurent22/joplin/releases/tag/v0.10.40) | 2018-01-02T23:16:57Z | 1,587 | 1,756 | 329 | 3,672
[v0.10.39](https://github.com/laurent22/joplin/releases/tag/v0.10.39) | 2017-12-11T21:19:44Z | 5,542 | 4,030 | 2,937 | 12,509
[v0.10.38](https://github.com/laurent22/joplin/releases/tag/v0.10.38) | 2017-12-08T10:12:06Z | 1,041 | 1,213 | 299 | 2,553
[v0.10.37](https://github.com/laurent22/joplin/releases/tag/v0.10.37) | 2017-12-07T19:38:05Z | 256 | 829 | 74 | 1,159
[v0.10.36](https://github.com/laurent22/joplin/releases/tag/v0.10.36) | 2017-12-05T09:34:40Z | 1,008 | 1,340 | 431 | 2,779
[v0.10.35](https://github.com/laurent22/joplin/releases/tag/v0.10.35) | 2017-12-02T15:56:08Z | 1,570 | 1,532 | 739 | 3,841
[v0.10.34](https://github.com/laurent22/joplin/releases/tag/v0.10.34) | 2017-12-02T14:50:28Z | 80 | 652 | 53 | 785
[v0.10.33](https://github.com/laurent22/joplin/releases/tag/v0.10.33) | 2017-12-02T13:20:39Z | 52 | 641 | 13 | 706
[v0.10.31](https://github.com/laurent22/joplin/releases/tag/v0.10.31) | 2017-12-01T09:56:44Z | 884 | 1,436 | 400 | 2,720
[v0.10.31](https://github.com/laurent22/joplin/releases/tag/v0.10.31) | 2017-12-01T09:56:44Z | 884 | 1,436 | 401 | 2,721
[v0.10.30](https://github.com/laurent22/joplin/releases/tag/v0.10.30) | 2017-11-30T20:28:16Z | 711 | 1,352 | 410 | 2,473
[v0.10.28](https://github.com/laurent22/joplin/releases/tag/v0.10.28) | 2017-11-30T01:07:46Z | 1,278 | 1,683 | 864 | 3,825
[v0.10.28](https://github.com/laurent22/joplin/releases/tag/v0.10.28) | 2017-11-30T01:07:46Z | 1,280 | 1,683 | 864 | 3,827
[v0.10.26](https://github.com/laurent22/joplin/releases/tag/v0.10.26) | 2017-11-29T16:02:17Z | 180 | 685 | 255 | 1,120
[v0.10.25](https://github.com/laurent22/joplin/releases/tag/v0.10.25) | 2017-11-24T14:27:49Z | 136 | 676 | 5,473 | 6,285
[v0.10.23](https://github.com/laurent22/joplin/releases/tag/v0.10.23) | 2017-11-21T19:38:41Z | 124 | 628 | 20 | 772
[v0.10.22](https://github.com/laurent22/joplin/releases/tag/v0.10.22) | 2017-11-20T21:45:57Z | 76 | 627 | 11 | 714
[v0.10.21](https://github.com/laurent22/joplin/releases/tag/v0.10.21) | 2017-11-18T00:53:15Z | 44 | 619 | 4 | 667
[v0.10.20](https://github.com/laurent22/joplin/releases/tag/v0.10.20) | 2017-11-17T17:18:25Z | 23 | 628 | 14 | 665
[v0.10.19](https://github.com/laurent22/joplin/releases/tag/v0.10.19) | 2017-11-20T18:59:48Z | 5 | 618 | 5 | 628
[v0.10.25](https://github.com/laurent22/joplin/releases/tag/v0.10.25) | 2017-11-24T14:27:49Z | 138 | 679 | 5,547 | 6,364
[v0.10.23](https://github.com/laurent22/joplin/releases/tag/v0.10.23) | 2017-11-21T19:38:41Z | 125 | 630 | 21 | 776
[v0.10.22](https://github.com/laurent22/joplin/releases/tag/v0.10.22) | 2017-11-20T21:45:57Z | 77 | 629 | 13 | 719
[v0.10.21](https://github.com/laurent22/joplin/releases/tag/v0.10.21) | 2017-11-18T00:53:15Z | 45 | 622 | 5 | 672
[v0.10.20](https://github.com/laurent22/joplin/releases/tag/v0.10.20) | 2017-11-17T17:18:25Z | 25 | 630 | 15 | 670
[v0.10.19](https://github.com/laurent22/joplin/releases/tag/v0.10.19) | 2017-11-20T18:59:48Z | 6 | 621 | 6 | 633