特定のurl表記がレンダリングされない

利用環境

  • Platform: (macOS)
  • Platform version: (Sierra)
  • App Version: (3.10.2)

再現方法

http://tobysoft.net/wiki/index.php?git%2F%A5%B3%A5%DF%A5%C3%A5%C8%A5%ED%A5%B0%A4%F2%BD%A4%C0%B5%A4%B9%A4%EB%CA%FD%CB%A1

こんなURLを書き込んだ場合、Markdownがうまくレンダリングされないようです。

エラー内容

Failed to render Markdown
If the problem persists, please report it. Sorry for the inconvenience.

URIError: URI malformed
    at decodeURI (<anonymous>:null:null)
    at normalize (/Applications/Inkdrop.app/Contents/Resources/app.asar/node_modules/normalize-uri/index.js:12:20)
    at link (/Applications/Inkdrop.app/Contents/Resources/app.asar/node_modules/mdast-util-to-hast/lib/handlers/link.js:10:22)
    at one (/Applications/Inkdrop.app/Contents/Resources/app.asar/node_modules/mdast-util-to-hast/lib/one.js:28:51)
    at all (/Applications/Inkdrop.app/Contents/Resources/app.asar/node_modules/mdast-util-to-hast/lib/all.js:18:14)
    at paragraph (/Applications/Inkdrop.app/Contents/Resources/app.asar/node_modules/mdast-util-to-hast/lib/handlers/paragraph.js:9:23)
    at one (/Applications/Inkdrop.app/Contents/Resources/app.asar/node_modules/mdast-util-to-hast/lib/one.js:28:51)
    at all (/Applications/Inkdrop.app/Contents/Resources/app.asar/node_modules/mdast-util-to-hast/lib/all.js:18:14)
    at root (/Applications/Inkdrop.app/Contents/Resources/app.asar/node_modules/mdast-util-to-hast/lib/handlers/root.js:11:41)
    at one (/Applications/Inkdrop.app/Contents/Resources/app.asar/node_modules/mdast-util-to-hast/lib/one.js:28:51)
    at toHAST (/Applications/Inkdrop.app/Contents/Resources/app.asar/node_modules/mdast-util-to-hast/lib/index.js:92:14)
    at compile (/Applications/Inkdrop.app/Contents/Resources/app.asar/node_modules/remark-react/index.js:84:17)
    at Function.stringify (/Applications/Inkdrop.app/Contents/Resources/app.asar/node_modules/unified/index.js:349:12)
    at pipelineStringify (/Applications/Inkdrop.app/Contents/Resources/app.asar/node_modules/unified/index.js:40:25)
    at wrapped (/Applications/Inkdrop.app/Contents/Resources/app.asar/node_modules/trough/index.js:128:19)
    at next (/Applications/Inkdrop.app/Contents/Resources/app.asar/node_modules/trough/index.js:81:24)
    at done (/Applications/Inkdrop.app/Contents/Resources/app.asar/node_modules/trough/index.js:163:12)
    at done (/Applications/Inkdrop.app/Contents/Resources/app.asar/node_modules/unified/index.js:34:7)
    at done (/Applications/Inkdrop.app/Contents/Resources/app.asar/node_modules/unified/index.js:308:11)
    at next (/Applications/Inkdrop.app/Contents/Resources/app.asar/node_modules/trough/index.js:83:14)
    at Object.run (/Applications/Inkdrop.app/Contents/Resources/app.asar/node_modules/trough/index.js:48:10)
    at executor (/Applications/Inkdrop.app/Contents/Resources/app.asar/node_modules/unified/index.js:299:20)
    at Function.run (/Applications/Inkdrop.app/Contents/Resources/app.asar/node_modules/unified/index.js:296:5)
    at pipelineRun (/Applications/Inkdrop.app/Contents/Resources/app.asar/node_modules/unified/index.js:26:5)
    at wrapped (/Applications/Inkdrop.app/Contents/Resources/app.asar/node_modules/trough/index.js:128:19)
    at next (/Applications/Inkdrop.app/Contents/Resources/app.asar/node_modules/trough/index.js:81:24)
    at done (/Applications/Inkdrop.app/Contents/Resources/app.asar/node_modules/trough/index.js:163:12)
    at then (/Applications/Inkdrop.app/Contents/Resources/app.asar/node_modules/trough/index.js:174:5)
    at wrapped (/Applications/Inkdrop.app/Contents/Resources/app.asar/node_modules/trough/index.js:149:9)
    at next (/Applications/Inkdrop.app/Contents/Resources/app.asar/node_modules/trough/index.js:81:24)
    at Object.run (/Applications/Inkdrop.app/Contents/Resources/app.asar/node_modules/trough/index.js:48:10)
    at executor (/Applications/Inkdrop.app/Contents/Resources/app.asar/node_modules/unified/index.js:371:16)
    at Function.process (/Applications/Inkdrop.app/Contents/Resources/app.asar/node_modules/unified/index.js:366:5)
    at file:///Applications/Inkdrop.app/Contents/Resources/app.asar/browser-main.js:1:298086
    at Object.<anonymous> (file:///Applications/Inkdrop.app/Contents/Resources/app.asar/browser-main.js:1:298058)
    at tryCatch (/Applications/Inkdrop.app/Contents/Resources/app.asar/node_modules/regenerator-runtime/runtime.js:63:40)
    at Generator.invoke [as _invoke] (/Applications/Inkdrop.app/Contents/Resources/app.asar/node_modules/regenerator-runtime/runtime.js:337:22)
    at Generator.prototype.(anonymous function) [as next] (/Applications/Inkdrop.app/Contents/Resources/app.asar/node_modules/regenerator-runtime/runtime.js:96:21)
    at r (file:///Applications/Inkdrop.app/Contents/Resources/app.asar/browser-main.js:1:169895)
    at file:///Applications/Inkdrop.app/Contents/Resources/app.asar/browser-main.js:1:170043
    at t (file:///Applications/Inkdrop.app/Contents/Resources/app.asar/browser-main.js:1:192820)
    at file:///Applications/Inkdrop.app/Contents/Resources/app.asar/browser-main.js:1:169837
    at file:///Applications/Inkdrop.app/Contents/Resources/app.asar/browser-main.js:1:298965
    at Object.action (/Applications/Inkdrop.app/Contents/Resources/app.asar/node_modules/alt/lib/actions/index.js:47:24)
    at i (file:///Applications/Inkdrop.app/Contents/Resources/app.asar/browser-main.js:1:287385)
    at file:///Applications/Inkdrop.app/Contents/Resources/app.asar/browser-main.js:1:290598
    at /Applications/Inkdrop.app/Contents/Resources/app.asar/node_modules/lodash/index.js:1773:clock430:

スクリーンショット

こんにちは。ご報告ありがとうございます!

んーこれは仕様ですね。エラーメッセージの示す通り、そのURLは不正です。
ブラウザで以下のJSを実行すると、同様のエラーが得られます:

decodeURI('http://tobysoft.net/wiki/index.php?git%2F%A5%B3%A5%DF%A5%C3%A5%C8%A5%ED%A5%B0%A4%F2%BD%A4%C0%B5%A4%B9%A4%EB%CA%FD%CB%A1')
// -> VM218:1 Uncaught URIError: URI malformed
//      at decodeURI (<anonymous>)
//      at <anonymous>:1:1

原因は、URLエンコードされた部分が正しいUTF-8文字列では無いためと推測されます。
RFC 3986 ではUTF-8を使わなければならないと定義されています。
http://tools.ietf.org/html/rfc3986#section-2.5

残念ながらアプリ側で出来る対処はありません。ご了承下さい。

ちなみに蛇足ですが、この処理はURLをノーマライズするために行われています。
以下のように、不正な文字をエンコードしてあげる処理です。

normalizeURI('foo bar'); //=> 'foo%20bar'
normalizeURI('foo%20bar'); //=> 'foo%20bar'
normalizeURI('👌'); //=> '%F0%9F%91%8C'
1 Like

なるほど、了解しました :face_with_hand_over_mouth:
早速の返信と、補足ありがとうございました!

1 Like