From 62c48b9a4669841871dcd4e6f6eb6894aec2a52b Mon Sep 17 00:00:00 2001 From: Laurent Cozic Date: Mon, 10 Jun 2019 08:55:36 +0100 Subject: [PATCH 01/14] CLI: Fixed regression which was preventing decryption on newly created profiles --- CliClient/run.sh | 3 +-- .../lib/services/DecryptionWorker.js | 17 +++++++++++++---- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/CliClient/run.sh b/CliClient/run.sh index 43f11e2a3..3bee194e2 100755 --- a/CliClient/run.sh +++ b/CliClient/run.sh @@ -3,5 +3,4 @@ set -e CLIENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" bash "$CLIENT_DIR/build.sh" && node "$CLIENT_DIR/build/main.js" --profile ~/Temp/TestNotes2 --stack-trace-enabled --log-level debug --env dev "$@" - -# bash $CLIENT_DIR/build.sh && NODE_PATH="$CLIENT_DIR/build/" node build/main.js --profile ~/.config/joplin --stack-trace-enabled --log-level debug "$@" \ No newline at end of file +# bash "$CLIENT_DIR/build.sh" && node "$CLIENT_DIR/build/main.js" --profile ~/.config/joplin --stack-trace-enabled --log-level debug --env dev "$@" \ No newline at end of file diff --git a/ReactNativeClient/lib/services/DecryptionWorker.js b/ReactNativeClient/lib/services/DecryptionWorker.js index 71b22117a..d654270c7 100644 --- a/ReactNativeClient/lib/services/DecryptionWorker.js +++ b/ReactNativeClient/lib/services/DecryptionWorker.js @@ -106,16 +106,25 @@ class DecryptionWorker { return; } + // Note: the logic below is an optimisation to avoid going through the loop if no master key exists + // or if none is loaded. It means this logic needs to be duplicate a bit what's in the loop, like the + // "throw" and "dispatch" logic. const loadedMasterKeyCount = await this.encryptionService().loadedMasterKeysCount(); if (!loadedMasterKeyCount) { this.logger().info('DecryptionWorker: cannot start because no master key is currently loaded.'); const ids = await MasterKey.allIds(); if (ids.length) { - this.dispatch({ - type: 'MASTERKEY_SET_NOT_LOADED', - ids: ids, - }); + if (options.masterKeyNotLoadedHandler === 'throw') { + // By trying to load the master key here, we throw the "masterKeyNotLoaded" error + // which the caller needs. + await this.encryptionService().loadedMasterKey(ids[0]); + } else { + this.dispatch({ + type: 'MASTERKEY_SET_NOT_LOADED', + ids: ids, + }); + } } return; } From 0b24433db316349c893bb7294cb0a0d38071fafb Mon Sep 17 00:00:00 2001 From: Laurent Cozic Date: Mon, 10 Jun 2019 08:56:11 +0100 Subject: [PATCH 02/14] CLI v1.0.140 --- CliClient/package-lock.json | 2 +- CliClient/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CliClient/package-lock.json b/CliClient/package-lock.json index 413748f01..d8ec10ebb 100644 --- a/CliClient/package-lock.json +++ b/CliClient/package-lock.json @@ -1,6 +1,6 @@ { "name": "joplin", - "version": "1.0.139", + "version": "1.0.140", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/CliClient/package.json b/CliClient/package.json index 0a067ceaf..526e9dfdd 100644 --- a/CliClient/package.json +++ b/CliClient/package.json @@ -20,7 +20,7 @@ ], "owner": "Laurent Cozic" }, - "version": "1.0.139", + "version": "1.0.140", "bin": { "joplin": "./main.js" }, From 7535f1a8c6b2976cc78da0ede76aa42c0ad648fd Mon Sep 17 00:00:00 2001 From: Laurent Cozic Date: Mon, 10 Jun 2019 23:41:32 +0100 Subject: [PATCH 03/14] Update website --- README.md | 6 +- docs/changelog/index.html | 45 +++- docs/index.html | 8 +- docs/stats/index.html | 430 ++++++++++++++++++++------------------ readme/changelog.md | 45 +++- readme/stats.md | 125 +++++------ 6 files changed, 380 insertions(+), 279 deletions(-) diff --git a/README.md b/README.md index b950a951d..0af3e52ba 100644 --- a/README.md +++ b/README.md @@ -20,9 +20,9 @@ Three types of applications are available: for the **desktop** (Windows, macOS a Operating System | Download | Alternative -----------------|--------|------------------- -Windows (32 and 64-bit) | Get it on Windows | Or get the Portable version

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 | Get it on macOS | You can also use Homebrew: `brew cask install joplin` -Linux | Get it on Linux | An Arch Linux package [is also available](#terminal-application).

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:

`wget -O - https://raw.githubusercontent.com/laurent22/joplin/master/Joplin_install_and_update.sh \| bash` +Windows (32 and 64-bit) | Get it on Windows | Or get the Portable version

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 | Get it on macOS | You can also use Homebrew: `brew cask install joplin` +Linux | Get it on Linux | An Arch Linux package [is also available](#terminal-application).

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:

`wget -O - https://raw.githubusercontent.com/laurent22/joplin/master/Joplin_install_and_update.sh \| bash` ## Mobile applications diff --git a/docs/changelog/index.html b/docs/changelog/index.html index ce9d39c02..b4a68c68f 100644 --- a/docs/changelog/index.html +++ b/docs/changelog/index.html @@ -270,6 +270,43 @@

🔗Joplin changelog

+

🔗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)
  • +
  • Improved: Speed up synchronisation by allowing multiple connections when downloading items (#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)
  • +
  • Improved: Improve how font size is applied (#1601)
  • +
  • Improved: Improved workflow of downloading and decrypting data during sync
  • +
  • Fixed: Fix icon path and directory in Linux install script (#1612)
  • +
  • Fixed: Handle multiple lines in attributes when importing Enex files (#1583)
  • +
  • Fixed: Fix issue with revisions being needlessly created when decrypting notes
  • +
+

🔗v1.0.158 - 2019-05-27T19:01:18Z

+
    +
  • Improved: Enable more options on multimd-table plugin (#1586)
  • +
  • Improved: Improved config screen with dark theme
  • +
  • Improved: Make bold text more visible (#1575)
  • +
  • Fixed: Fix internal note links (#1587)
  • +
  • Fixed: Fixed empty separators in menu
  • +
+

🔗v1.0.157 - 2019-05-26T17:55:53Z

+
    +
  • New: Added Persian translation (#1539)
  • +
  • New: Allow downloading attachments on demand or automatically (#1527) (#1481)
  • +
  • Improved: Make bold text more visible (#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) (#1186)
  • +
  • Fixed: Default sort order for notebooks should be title and ascending (#1541)
  • +
  • Fixed: Added backticks to auto-wrapping quotes. (#1534) (#1426)
  • +
  • Fixed: Prevent app from trying to upload resource it has not downloaded yet
  • +

🔗v1.0.153 - 2019-05-15T06:27:29Z

This release only adds additional logging for the note history feature.

🔗v1.0.152 - 2019-05-13T09:08:07Z

@@ -506,7 +543,7 @@

🔗v1.0.119 - 2018-12-18T12:40:22Z

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)
  • Changed: Changed global search shortcut to F6.
  • @@ -519,7 +556,7 @@

    🔗v1.0.118 - 2019-01-11T08:34:13Z

    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)
    • Changed: Changed global search shortcut to F6.
    • @@ -720,7 +757,7 @@

    🔗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.
    • @@ -737,7 +774,7 @@

    🔗v1.0.89 - 2018-05-09T13:05:05Z

      -
    • New: Resolves #122: Added support for sub-notebooks. Please see doc for more info: https://joplinapp.org/#sub-notebooks
    • +
    • New: Resolves #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: Ignore invalid flag automatically passed by macOS
    • Fixes #61: Handle path that ends with slash for file system sync
    • diff --git a/docs/index.html b/docs/index.html index b5c48eabd..871c91af8 100644 --- a/docs/index.html +++ b/docs/index.html @@ -289,17 +289,17 @@ Windows (32 and 64-bit) -Get it on Windows -Or get the Portable version

      The 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. +Get it on Windows +Or get the Portable version

      The 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 -Get it on macOS +Get it on macOS You can also use Homebrew: brew cask install joplin Linux -Get it on Linux +Get it on Linux An Arch Linux package is also available.

      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:

      wget -O - https://raw.githubusercontent.com/laurent22/joplin/master/Joplin_install_and_update.sh \| bash diff --git a/docs/stats/index.html b/docs/stats/index.html index b68496cb6..e7a3337b2 100644 --- a/docs/stats/index.html +++ b/docs/stats/index.html @@ -280,19 +280,19 @@ Total Windows downloads -256,045 +273,919 Total macOs downloads -110,964 +116,805 Total Linux downloads -88,124 +92,419 Windows % -56% +57% macOS % @@ -317,92 +317,116 @@ +v1.0.159 +2019-06-08T00:00:19Z +121 +26 +65 +212 + + +v1.0.158 +2019-05-27T19:01:18Z +9,384 +3,440 +1,914 +14,738 + + +v1.0.157 +2019-05-26T17:55:53Z +2,126 +807 +272 +3,205 + + v1.0.153 2019-05-15T06:27:29Z -358 -54 -62 -474 +806 +73 +94 +973 v1.0.152 2019-05-13T09:08:07Z -8,246 -2,954 -2,241 -13,441 +13,703 +4,369 +4,040 +22,112 v1.0.151 2019-05-12T15:14:32Z -1,926 -510 -946 -3,382 +1,927 +511 +947 +3,385 v1.0.150 2019-05-12T11:27:48Z 395 -108 -54 -557 +109 +56 +560 v1.0.148 2019-05-08T19:12:24Z -109 -33 -73 -215 +111 +36 +77 +224 v1.0.145 2019-05-03T09:16:53Z -6,841 -2,822 -1,423 -11,086 +6,862 +2,827 +1,425 +11,114 v1.0.143 2019-04-22T10:51:38Z -11,726 -3,507 -2,761 -17,994 +11,860 +3,512 +2,765 +18,137 v1.0.142 2019-04-02T16:44:51Z -14,482 -4,510 -4,707 -23,699 +14,490 +4,511 +4,708 +23,709 v1.0.140 2019-03-10T20:59:58Z -13,478 -4,116 -2,988 -20,582 +13,522 +4,120 +2,994 +20,636 v1.0.139 2019-03-09T10:06:48Z 83 20 -24 -127 +25 +128 v1.0.138 2019-03-03T17:23:00Z -111 +113 42 68 -221 +223 v1.0.137 @@ -415,10 +439,10 @@ v1.0.135 2019-02-27T23:36:57Z -12,160 +12,182 3,915 -4,044 -20,119 +4,045 +20,142 v1.0.134 @@ -439,26 +463,26 @@ v1.0.127 2019-02-14T23:12:48Z -9,399 +9,420 3,127 -2,904 -15,430 +2,905 +15,452 v1.0.126 2019-02-09T19:46:16Z 914 53 -108 -1,075 +109 +1,076 v1.0.125 2019-01-26T18:14:33Z 10,230 -3,521 -1,689 -15,440 +3,522 +1,693 +15,445 v1.0.120 @@ -473,8 +497,8 @@ 2018-12-18T12:40:22Z 8,855 3,203 -1,993 -14,051 +1,994 +14,052 v1.0.118 @@ -488,9 +512,9 @@ v1.0.117 2018-11-24T12:05:24Z 16,208 -4,848 +4,849 6,359 -27,415 +27,416 v1.0.116 @@ -519,10 +543,10 @@ v1.0.111 2018-09-30T20:15:09Z -11,879 -3,134 -3,650 -18,663 +11,887 +3,135 +3,653 +18,675 v1.0.110 @@ -537,8 +561,8 @@ 2018-09-27T18:01:41Z 2,074 681 -311 -3,066 +314 +3,069 v1.0.108 @@ -577,16 +601,16 @@ 2018-06-28T20:25:36Z 14,990 4,656 -7,086 -26,732 +7,102 +26,748 v1.0.103 2018-06-21T19:38:13Z -2,012 -858 +2,014 +859 668 -3,538 +3,541 v1.0.101 @@ -623,10 +647,10 @@ v1.0.96 2018-05-26T16:36:39Z -2,686 +2,688 1,200 -1,266 -5,152 +1,276 +5,164 v1.0.95 @@ -648,17 +672,17 @@ v1.0.93 2018-05-14T11:36:01Z 1,770 -924 +928 743 -3,437 +3,441 v1.0.91 2018-05-10T14:48:04Z -814 -535 +816 +536 290 -1,639 +1,642 v1.0.89 @@ -679,202 +703,202 @@ v1.0.83 2018-04-04T19:43:58Z -4,565 -2,437 -2,634 -9,636 +4,571 +2,443 +2,639 +9,653 v1.0.82 2018-03-31T19:16:31Z -684 -387 -100 -1,171 +686 +388 +106 +1,180 v1.0.81 2018-03-28T08:13:58Z -985 -570 -750 -2,305 +986 +572 +754 +2,312 v1.0.79 2018-03-23T18:00:11Z -919 -513 -358 -1,790 +920 +516 +361 +1,797 v1.0.78 2018-03-17T15:27:18Z -1,302 -841 -850 -2,993 +1,303 +845 +853 +3,001 v1.0.77 2018-03-16T15:12:35Z -165 -87 -25 -277 +166 +89 +28 +283 v1.0.72 2018-03-14T09:44:35Z -396 -235 -39 -670 +397 +238 +41 +676 v1.0.70 2018-02-28T20:04:30Z -1,844 -1,026 -1,228 -4,098 +1,845 +1,030 +1,233 +4,108 v1.0.67 2018-02-19T22:51:08Z -1,805 -583 +1,806 +585 0 -2,388 +2,391 v1.0.66 2018-02-18T23:09:09Z -314 -107 -72 -493 +315 +109 +73 +497 v1.0.65 2018-02-17T20:02:25Z -185 -109 -119 -413 +186 +110 +120 +416 v1.0.64 2018-02-16T00:58:20Z -1,074 -529 -1,116 -2,719 +1,076 +531 +1,117 +2,724 v1.0.63 2018-02-14T19:40:36Z -291 -143 -83 -517 +292 +145 +84 +521 v1.0.62 2018-02-12T20:19:58Z -549 -277 -356 -1,182 +550 +281 +358 +1,189 v0.10.61 2018-02-08T18:27:39Z -963 -606 -945 -2,514 +964 +609 +947 +2,520 v0.10.60 2018-02-06T13:09:56Z -711 -498 -543 -1,752 +713 +503 +545 +1,761 v0.10.54 2018-01-31T20:21:30Z -1,811 -1,442 -310 -3,563 +1,813 +1,444 +311 +3,568 v0.10.52 2018-01-31T19:25:18Z -37 -616 -6 -659 +38 +618 +7 +663 v0.10.51 2018-01-28T18:47:02Z -1,316 -1,581 -318 -3,215 +1,317 +1,584 +319 +3,220 v0.10.48 2018-01-23T11:19:51Z -1,956 -1,733 +1,958 +1,736 21 -3,710 +3,715 v0.10.47 2018-01-16T17:27:17Z -1,216 -1,249 -59 -2,524 +1,218 +1,251 +60 +2,529 v0.10.43 2018-01-08T10:12:10Z -3,427 -2,328 -1,199 -6,954 +3,428 +2,332 +1,200 +6,960 v0.10.41 2018-01-05T20:38:12Z -1,029 -1,530 -229 -2,788 +1,030 +1,533 +231 +2,794 v0.10.40 2018-01-02T23:16:57Z -1,586 -1,753 -328 -3,667 +1,587 +1,756 +329 +3,672 v0.10.39 2017-12-11T21:19:44Z -5,518 -4,008 -2,915 -12,441 +5,542 +4,030 +2,937 +12,509 v0.10.38 @@ -929,8 +953,8 @@ 2017-12-01T09:56:44Z 884 1,436 -400 -2,720 +401 +2,721 v0.10.30 @@ -943,10 +967,10 @@ v0.10.28 2017-11-30T01:07:46Z -1,278 +1,280 1,683 864 -3,825 +3,827 v0.10.26 @@ -959,50 +983,50 @@ v0.10.25 2017-11-24T14:27:49Z -136 -676 -5,473 -6,285 +138 +679 +5,547 +6,364 v0.10.23 2017-11-21T19:38:41Z -124 -628 -20 -772 +125 +630 +21 +776 v0.10.22 2017-11-20T21:45:57Z -76 -627 -11 -714 +77 +629 +13 +719 v0.10.21 2017-11-18T00:53:15Z -44 -619 -4 -667 +45 +622 +5 +672 v0.10.20 2017-11-17T17:18:25Z -23 -628 -14 -665 +25 +630 +15 +670 v0.10.19 2017-11-20T18:59:48Z -5 -618 -5 -628 +6 +621 +6 +633 diff --git a/readme/changelog.md b/readme/changelog.md index 2d2914b2e..17c418f9d 100644 --- a/readme/changelog.md +++ b/readme/changelog.md @@ -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 diff --git a/readme/stats.md b/readme/stats.md index 0c0b8d02d..86fb82529 100644 --- a/readme/stats.md +++ b/readme/stats.md @@ -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 \ No newline at end of file +[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 \ No newline at end of file From 041bdc08a24a0d87e95399a2351dff067abe2fe2 Mon Sep 17 00:00:00 2001 From: Caleb John Date: Mon, 10 Jun 2019 16:44:51 -0600 Subject: [PATCH 04/14] Desktop: New: Highlight notebooks based on depth (#1634) * Highlight notebooks based on depth * Adjusted notebook depth targets, and dark theme select color --- ElectronClient/app/gui/SideBar.jsx | 6 ++++-- ElectronClient/app/theme.js | 4 +++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/ElectronClient/app/gui/SideBar.jsx b/ElectronClient/app/gui/SideBar.jsx index 1998c33d7..02a883358 100644 --- a/ElectronClient/app/gui/SideBar.jsx +++ b/ElectronClient/app/gui/SideBar.jsx @@ -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); diff --git a/ElectronClient/app/theme.js b/ElectronClient/app/theme.js index 23f279b55..6a5a0e979 100644 --- a/ElectronClient/app/theme.js +++ b/ElectronClient/app/theme.js @@ -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", From 468c34552733691df35abc7748aa95df9d31a6c9 Mon Sep 17 00:00:00 2001 From: "Helmut K. C. Tessarek" Date: Mon, 10 Jun 2019 18:45:49 -0400 Subject: [PATCH 05/14] Desktop: Improved: Added shortuct for tags (`Cmd+Opt+T` / `Ctrl+Alt+T`) (#1638) fixes #1626 --- ElectronClient/app/app.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/ElectronClient/app/app.js b/ElectronClient/app/app.js index e76e2250d..072de4d27 100644 --- a/ElectronClient/app/app.js +++ b/ElectronClient/app/app.js @@ -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'], From e1a52c5606175b43abdc955f00417af48c1e59b9 Mon Sep 17 00:00:00 2001 From: Laurent Cozic Date: Tue, 11 Jun 2019 00:11:49 +0100 Subject: [PATCH 06/14] CLI: Remove Welcome notes because they are mostly relevent to desktop and mobile, and there is already intro text on CLI --- CliClient/app/app.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/CliClient/app/app.js b/CliClient/app/app.js index fc975360a..bc5134638 100644 --- a/CliClient/app/app.js +++ b/CliClient/app/app.js @@ -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) { From d6218f35fe8f47c82d77ae3ce5ff2a0efb1cb2d5 Mon Sep 17 00:00:00 2001 From: Laurent Cozic Date: Tue, 11 Jun 2019 01:09:48 +0100 Subject: [PATCH 07/14] Clipper: Fixes #1526: Local files can be clipped again --- Clipper/joplin-webclipper/background.js | 9 ++++---- .../content_scripts/index.js | 22 ++++++++++++++----- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/Clipper/joplin-webclipper/background.js b/Clipper/joplin-webclipper/background.js index f178b102d..f9fea65e2 100644 --- a/Clipper/joplin-webclipper/background.js +++ b/Clipper/joplin-webclipper/background.js @@ -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; diff --git a/Clipper/joplin-webclipper/content_scripts/index.js b/Clipper/joplin-webclipper/content_scripts/index.js index cf9774c63..67c8af603 100644 --- a/Clipper/joplin-webclipper/content_scripts/index.js +++ b/Clipper/joplin-webclipper/content_scripts/index.js @@ -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(); @@ -123,7 +135,7 @@ 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, @@ -265,7 +277,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,7 +298,7 @@ } else if (command.name === "pageUrl") { - let url = location.origin + location.pathname + location.search; + let url = pageLocationOrigin() + location.pathname + location.search; return clippedContentResponse(pageTitle(), url, getImageSizes(document)); } else { From ad211b4b4ec257f1e6376faa2d04209b5129e301 Mon Sep 17 00:00:00 2001 From: Laurent Cozic Date: Wed, 12 Jun 2019 09:45:31 +0100 Subject: [PATCH 08/14] Clipper: Fixes #1600: Handle SVG images and fix issue with invalid file extensions --- ReactNativeClient/lib/net-utils.js | 7 +++++++ ReactNativeClient/lib/path-utils.js | 5 +++-- ReactNativeClient/lib/services/rest/Api.js | 20 +++++++++++++++++++- 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/ReactNativeClient/lib/net-utils.js b/ReactNativeClient/lib/net-utils.js index e1f62d52b..ca14e95ca 100644 --- a/ReactNativeClient/lib/net-utils.js +++ b/ReactNativeClient/lib/net-utils.js @@ -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 }; \ No newline at end of file diff --git a/ReactNativeClient/lib/path-utils.js b/ReactNativeClient/lib/path-utils.js index df2917d23..4d4a1d8f1 100644 --- a/ReactNativeClient/lib/path-utils.js +++ b/ReactNativeClient/lib/path-utils.js @@ -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) { diff --git a/ReactNativeClient/lib/services/rest/Api.js b/ReactNativeClient/lib/services/rest/Api.js index bd971d19c..4c0ebd6a3 100644 --- a/ReactNativeClient/lib/services/rest/Api.js +++ b/ReactNativeClient/lib/services/rest/Api.js @@ -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'); @@ -459,6 +460,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 +479,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 +493,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) { From 21ae447d9cbac83e4d513bb687aa801670fc7b13 Mon Sep 17 00:00:00 2001 From: "Helmut K. C. Tessarek" Date: Wed, 12 Jun 2019 18:11:24 -0400 Subject: [PATCH 09/14] 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. --- Tools/release-clipper.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Tools/release-clipper.js b/Tools/release-clipper.js index bcd834dab..45ab39df9 100644 --- a/Tools/release-clipper.js +++ b/Tools/release-clipper.js @@ -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 + '"')); From 86136e0c6c6583bd99c3546d6d290c7de37186dc Mon Sep 17 00:00:00 2001 From: Laurent Cozic Date: Thu, 13 Jun 2019 00:26:09 +0100 Subject: [PATCH 10/14] Clipper: Fixes #1622: Import named anchors from clipped pages --- CliClient/package-lock.json | 102 ++++++++++-------- CliClient/package.json | 2 +- CliClient/tests/HtmlToMd.js | 14 ++- CliClient/tests/html_to_md/anchor_local.html | 6 ++ CliClient/tests/html_to_md/anchor_local.md | 11 ++ CliClient/tests/html_to_md/anchor_with_js.md | 2 +- CliClient/tests/urlUtils.js | 1 + .../content_scripts/index.js | 25 ++++- Clipper/joplin-webclipper/popup/src/bridge.js | 1 + ElectronClient/app/package-lock.json | 76 +++++++------ ElectronClient/app/package.json | 2 +- ReactNativeClient/lib/HtmlToMd.js | 1 + ReactNativeClient/lib/services/rest/Api.js | 5 +- ReactNativeClient/lib/urlUtils.js | 1 + 14 files changed, 156 insertions(+), 93 deletions(-) create mode 100644 CliClient/tests/html_to_md/anchor_local.html create mode 100644 CliClient/tests/html_to_md/anchor_local.md diff --git a/CliClient/package-lock.json b/CliClient/package-lock.json index d8ec10ebb..ff783047e 100644 --- a/CliClient/package-lock.json +++ b/CliClient/package-lock.json @@ -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", diff --git a/CliClient/package.json b/CliClient/package.json index 526e9dfdd..b44d9c070 100644 --- a/CliClient/package.json +++ b/CliClient/package.json @@ -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", diff --git a/CliClient/tests/HtmlToMd.js b/CliClient/tests/HtmlToMd.js index 8eb9ae7ee..dd4a55e9b 100644 --- a/CliClient/tests/HtmlToMd.js +++ b/CliClient/tests/HtmlToMd.js @@ -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('
      ' + html + '
      ', []); + let actualMd = await htmlToMd.parse('
      ' + html + '
      ', htmlToMdOptions); if (os.EOL === '\r\n') { expectedMd = expectedMd.replace(/\r\n/g, '\n') diff --git a/CliClient/tests/html_to_md/anchor_local.html b/CliClient/tests/html_to_md/anchor_local.html new file mode 100644 index 000000000..67c35c5d9 --- /dev/null +++ b/CliClient/tests/html_to_md/anchor_local.html @@ -0,0 +1,6 @@ +

      First

      +

      Second

      +

      Third

      +

      First

      +

      Second

      +

      Third

      \ No newline at end of file diff --git a/CliClient/tests/html_to_md/anchor_local.md b/CliClient/tests/html_to_md/anchor_local.md new file mode 100644 index 000000000..0c68275df --- /dev/null +++ b/CliClient/tests/html_to_md/anchor_local.md @@ -0,0 +1,11 @@ +[First](#first) + +[Second](#second) + +Third + +First + +Second + +Third \ No newline at end of file diff --git a/CliClient/tests/html_to_md/anchor_with_js.md b/CliClient/tests/html_to_md/anchor_with_js.md index a1584d3d7..9dbfeeee5 100644 --- a/CliClient/tests/html_to_md/anchor_with_js.md +++ b/CliClient/tests/html_to_md/anchor_with_js.md @@ -1 +1 @@ -[Some text]() \ No newline at end of file +Some text \ No newline at end of file diff --git a/CliClient/tests/urlUtils.js b/CliClient/tests/urlUtils.js index 6c38b7d1c..5d910c456 100644 --- a/CliClient/tests/urlUtils.js +++ b/CliClient/tests/urlUtils.js @@ -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(); }); diff --git a/Clipper/joplin-webclipper/content_scripts/index.js b/Clipper/joplin-webclipper/content_scripts/index.js index 67c8af603..3056d935b 100644 --- a/Clipper/joplin-webclipper/content_scripts/index.js +++ b/Clipper/joplin-webclipper/content_scripts/index.js @@ -72,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; @@ -129,7 +143,7 @@ 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, @@ -139,6 +153,7 @@ parent_id: command.parent_id, tags: command.tags || '', image_sizes: imageSizes, + anchor_names: anchorNames, }; } @@ -155,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") { @@ -168,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') { @@ -299,7 +314,7 @@ } else if (command.name === "pageUrl") { let url = pageLocationOrigin() + location.pathname + location.search; - return clippedContentResponse(pageTitle(), url, getImageSizes(document)); + return clippedContentResponse(pageTitle(), url, getImageSizes(document), getAnchorNames(document)); } else { throw new Error('Unknown command: ' + JSON.stringify(command)); diff --git a/Clipper/joplin-webclipper/popup/src/bridge.js b/Clipper/joplin-webclipper/popup/src/bridge.js index 9cf7efa27..36a1597b5 100644 --- a/Clipper/joplin-webclipper/popup/src/bridge.js +++ b/Clipper/joplin-webclipper/popup/src/bridge.js @@ -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 }); diff --git a/ElectronClient/app/package-lock.json b/ElectronClient/app/package-lock.json index cec43583e..1d6cb73fd 100644 --- a/ElectronClient/app/package-lock.json +++ b/ElectronClient/app/package-lock.json @@ -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", diff --git a/ElectronClient/app/package.json b/ElectronClient/app/package.json index 5dda3a2cb..93f4e9bc2 100644 --- a/ElectronClient/app/package.json +++ b/ElectronClient/app/package.json @@ -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", diff --git a/ReactNativeClient/lib/HtmlToMd.js b/ReactNativeClient/lib/HtmlToMd.js index 9ccefa539..37c2ba7e7 100644 --- a/ReactNativeClient/lib/HtmlToMd.js +++ b/ReactNativeClient/lib/HtmlToMd.js @@ -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'); diff --git a/ReactNativeClient/lib/services/rest/Api.js b/ReactNativeClient/lib/services/rest/Api.js index 4c0ebd6a3..d125be344 100644 --- a/ReactNativeClient/lib/services/rest/Api.js +++ b/ReactNativeClient/lib/services/rest/Api.js @@ -366,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); @@ -416,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 : '', @@ -430,6 +430,7 @@ class Api { // rendering but it makes sure everything will be parsed. output.body = await this.htmlToMdParser().parse('
      ' + requestNote.body_html + '
      ', { baseUrl: requestNote.base_url ? requestNote.base_url : '', + anchorNames: requestNote.anchor_names ? requestNote.anchor_names : [], }); } diff --git a/ReactNativeClient/lib/urlUtils.js b/ReactNativeClient/lib/urlUtils.js index ecb15ed92..c766f9262 100644 --- a/ReactNativeClient/lib/urlUtils.js +++ b/ReactNativeClient/lib/urlUtils.js @@ -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 From 55155646aa01053cd2b0f4348ed248cb6a5750c6 Mon Sep 17 00:00:00 2001 From: "Helmut K. C. Tessarek" Date: Wed, 12 Jun 2019 19:38:32 -0400 Subject: [PATCH 11/14] Clipper release v1.0.15 --- Clipper/joplin-webclipper/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Clipper/joplin-webclipper/manifest.json b/Clipper/joplin-webclipper/manifest.json index e6f276e3c..f1497bf67 100644 --- a/Clipper/joplin-webclipper/manifest.json +++ b/Clipper/joplin-webclipper/manifest.json @@ -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'", From a37961dcccd426e9069d2f159acb72d73749cba6 Mon Sep 17 00:00:00 2001 From: Laurent Cozic Date: Thu, 13 Jun 2019 08:47:47 +0100 Subject: [PATCH 12/14] Desktop: Removed placeholder in tag list because it repeats the label --- ElectronClient/app/gui/PromptDialog.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ElectronClient/app/gui/PromptDialog.jsx b/ElectronClient/app/gui/PromptDialog.jsx index b4771aee4..288ebf7bb 100644 --- a/ElectronClient/app/gui/PromptDialog.jsx +++ b/ElectronClient/app/gui/PromptDialog.jsx @@ -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} From 7fae9fda102a6d6d2d53e53782eff5f4a5d79f5d Mon Sep 17 00:00:00 2001 From: Laurent Cozic Date: Thu, 13 Jun 2019 08:48:19 +0100 Subject: [PATCH 13/14] Desktop: Fixes #1443: Allow opening external editor on new notes --- ElectronClient/app/gui/NoteText.jsx | 7 +++++-- .../components/shared/note-screen-shared.js | 18 ++++++++++++------ 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/ElectronClient/app/gui/NoteText.jsx b/ElectronClient/app/gui/NoteText.jsx index cef429345..4392cb1bb 100644 --- a/ElectronClient/app/gui/NoteText.jsx +++ b/ElectronClient/app/gui/NoteText.jsx @@ -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)); diff --git a/ReactNativeClient/lib/components/shared/note-screen-shared.js b/ReactNativeClient/lib/components/shared/note-screen-shared.js index 3458026b8..eb0bdfaba 100644 --- a/ReactNativeClient/lib/components/shared/note-screen-shared.js +++ b/ReactNativeClient/lib/components/shared/note-screen-shared.js @@ -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); From 85091052e76e56cadf3010854f7ffec4febcdb21 Mon Sep 17 00:00:00 2001 From: Laurent Cozic Date: Fri, 14 Jun 2019 07:22:25 +0100 Subject: [PATCH 14/14] iOS: Fixed missing Confirm and Cancel buttons on Alarm dialog --- .../lib/components/select-date-time-dialog.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/ReactNativeClient/lib/components/select-date-time-dialog.js b/ReactNativeClient/lib/components/select-date-time-dialog.js index 6658d9982..5a80713ba 100644 --- a/ReactNativeClient/lib/components/select-date-time-dialog.js +++ b/ReactNativeClient/lib/components/select-date-time-dialog.js @@ -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, + }, + }} />