Fixes silent disappearance of Markdown (pseudo-)link when it's detected as unsafe protocol. Now it will be converted to plain text in spirit of [the specification](https://spec.commonmark.org/0.30/#links). For that sake the check for protocol is added to rst.nim also.
This commit is contained in:
parent
4b0636fba0
commit
801c0f0369
4 changed files with 81 additions and 40 deletions
|
|
@ -40,7 +40,7 @@
|
|||
## can be done by simply searching for [footnoteName].
|
||||
|
||||
import strutils, os, hashes, strtabs, rstast, rst, highlite, tables, sequtils,
|
||||
algorithm, parseutils, std/strbasics, strscans
|
||||
algorithm, parseutils, std/strbasics
|
||||
|
||||
import ../../std/private/since
|
||||
|
||||
|
|
@ -826,17 +826,6 @@ proc renderOverline(d: PDoc, n: PRstNode, result: var string) =
|
|||
"\\rstov$4[$5]{$3}$2\n", [$n.level,
|
||||
rstnodeToRefname(n).idS, tmp, $chr(n.level - 1 + ord('A')), tocName])
|
||||
|
||||
|
||||
proc safeProtocol(linkStr: var string) =
|
||||
var protocol = ""
|
||||
if scanf(linkStr, "$w:", protocol):
|
||||
# if it has a protocol at all, ensure that it's not 'javascript:' or worse:
|
||||
if cmpIgnoreCase(protocol, "http") == 0 or cmpIgnoreCase(protocol, "https") == 0 or
|
||||
cmpIgnoreCase(protocol, "ftp") == 0:
|
||||
discard "it's fine"
|
||||
else:
|
||||
linkStr = ""
|
||||
|
||||
proc renderTocEntry(d: PDoc, e: TocEntry, result: var string) =
|
||||
dispA(d.target, result,
|
||||
"<li><a class=\"reference\" id=\"$1_toc\" href=\"#$1\">$2</a></li>\n",
|
||||
|
|
@ -901,7 +890,7 @@ proc renderImage(d: PDoc, n: PRstNode, result: var string) =
|
|||
|
||||
# support for `:target:` links for images:
|
||||
var target = esc(d.target, getFieldValue(n, "target").strip(), escMode=emUrl)
|
||||
safeProtocol(target)
|
||||
discard safeProtocol(target)
|
||||
|
||||
if target.len > 0:
|
||||
# `htmlOut` needs to be of the following format for link to work for images:
|
||||
|
|
@ -1205,7 +1194,7 @@ proc renderHyperlink(d: PDoc, text, link: PRstNode, result: var string,
|
|||
d.escMode = emUrl
|
||||
renderRstToOut(d, link, linkStr)
|
||||
d.escMode = mode
|
||||
safeProtocol(linkStr)
|
||||
discard safeProtocol(linkStr)
|
||||
var textStr = ""
|
||||
renderRstToOut(d, text, textStr)
|
||||
let nimDocStr = if nimdoc: " nimdoc" else: ""
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue