From 0379523eafe8c82f0909f367654a40a78d350782 Mon Sep 17 00:00:00 2001 From: Laurent Cozic Date: Thu, 12 Sep 2019 21:57:23 +0100 Subject: [PATCH] Desktop, Mobile: Fixes #1870: Support non-alphabetical characters in note link anchors --- ElectronClient/app/package-lock.json | 13 +++++++++++++ ElectronClient/app/package.json | 1 + ReactNativeClient/lib/renderers/MdToHtml.js | 5 ++++- ReactNativeClient/lib/urlUtils.js | 7 ++++++- ReactNativeClient/package-lock.json | 13 +++++++++++++ ReactNativeClient/package.json | 1 + 6 files changed, 38 insertions(+), 2 deletions(-) diff --git a/ElectronClient/app/package-lock.json b/ElectronClient/app/package-lock.json index 2249d40262..ab4c25d5ac 100644 --- a/ElectronClient/app/package-lock.json +++ b/ElectronClient/app/package-lock.json @@ -6662,6 +6662,11 @@ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz", "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=" }, + "unorm": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz", + "integrity": "sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==" + }, "unused-filename": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unused-filename/-/unused-filename-1.0.0.tgz", @@ -6784,6 +6789,14 @@ "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", "dev": true }, + "uslug": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/uslug/-/uslug-1.0.4.tgz", + "integrity": "sha1-uaIvCRTgqGFAYz2swwLl9PpFBnc=", + "requires": { + "unorm": ">= 1.0.0" + } + }, "utf8-byte-length": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", diff --git a/ElectronClient/app/package.json b/ElectronClient/app/package.json index f99557842a..50b307b308 100644 --- a/ElectronClient/app/package.json +++ b/ElectronClient/app/package.json @@ -154,6 +154,7 @@ "tcp-port-used": "^0.1.2", "uglifycss": "0.0.29", "url-parse": "^1.4.3", + "uslug": "^1.0.4", "uuid": "^3.2.1", "valid-url": "^1.0.9", "xml2js": "^0.4.19" diff --git a/ReactNativeClient/lib/renderers/MdToHtml.js b/ReactNativeClient/lib/renderers/MdToHtml.js index 459f8e447f..203924508e 100644 --- a/ReactNativeClient/lib/renderers/MdToHtml.js +++ b/ReactNativeClient/lib/renderers/MdToHtml.js @@ -15,6 +15,7 @@ const rules = { }; const setupLinkify = require('./MdToHtml/setupLinkify'); const hljs = require('highlight.js'); +const uslug = require('uslug'); const markdownItAnchor = require('markdown-it-anchor'); // The keys must match the corresponding entry in Setting.js const plugins = { @@ -142,7 +143,9 @@ class MdToHtml { if (Setting.value('markdown.plugin.fountain')) markdownIt.use(rules.fountain(context, ruleOptions)); markdownIt.use(rules.highlight_keywords(context, ruleOptions)); markdownIt.use(rules.code_inline(context, ruleOptions)); - markdownIt.use(markdownItAnchor); + markdownIt.use(markdownItAnchor, { + slugify: s => uslug(s), + }); for (let key in plugins) { if (Setting.value('markdown.plugin.' + key)) markdownIt.use(plugins[key].module, plugins[key].options); diff --git a/ReactNativeClient/lib/urlUtils.js b/ReactNativeClient/lib/urlUtils.js index 565737559e..44771e6f5f 100644 --- a/ReactNativeClient/lib/urlUtils.js +++ b/ReactNativeClient/lib/urlUtils.js @@ -1,4 +1,5 @@ const { rtrimSlashes } = require('lib/path-utils'); +const { urlDecode } = require('lib/string-utils'); const urlUtils = {}; @@ -55,7 +56,11 @@ urlUtils.parseResourceUrl = function(url) { }; if (splitted.length) output.itemId = splitted[0]; - if (splitted.length >= 2) output.hash = splitted[1]; + + // In general we want the hash to be decoded so that non-alphabetical languages + // appear as-is without being encoded with %. + // Fixes https://github.com/laurent22/joplin/issues/1870 + if (splitted.length >= 2) output.hash = urlDecode(splitted[1]); return output; }; diff --git a/ReactNativeClient/package-lock.json b/ReactNativeClient/package-lock.json index 1afbd04d67..2768a0f310 100644 --- a/ReactNativeClient/package-lock.json +++ b/ReactNativeClient/package-lock.json @@ -7185,6 +7185,11 @@ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" }, + "unorm": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz", + "integrity": "sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==" + }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -7266,6 +7271,14 @@ "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" }, + "uslug": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/uslug/-/uslug-1.0.4.tgz", + "integrity": "sha1-uaIvCRTgqGFAYz2swwLl9PpFBnc=", + "requires": { + "unorm": ">= 1.0.0" + } + }, "utf8": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.2.tgz", diff --git a/ReactNativeClient/package.json b/ReactNativeClient/package.json index 85aa35dca2..68f372b30f 100644 --- a/ReactNativeClient/package.json +++ b/ReactNativeClient/package.json @@ -72,6 +72,7 @@ "timers": "^0.1.1", "url": "^0.11.0", "url-parse": "^1.4.7", + "uslug": "^1.0.4", "uuid": "^3.0.1", "valid-url": "^1.0.9", "word-wrap": "^1.2.3",