mirror of
https://github.com/yuin/goldmark
synced 2025-03-04 23:04:52 +00:00
#248 - 6
This commit is contained in:
parent
cbaee30aee
commit
beafde4b8f
2 changed files with 28 additions and 3 deletions
|
|
@ -392,8 +392,11 @@ a* b c d *e*
|
||||||
OPTIONS: {"enableEscape": true}
|
OPTIONS: {"enableEscape": true}
|
||||||
//- - - - - - - - -//
|
//- - - - - - - - -//
|
||||||
hello\x00world
|
hello\x00world
|
||||||
|
|
||||||
|
<?\x00
|
||||||
//- - - - - - - - -//
|
//- - - - - - - - -//
|
||||||
<p>hello\ufffdworld</p>
|
<p>hello\ufffdworld</p>
|
||||||
|
<?\uFFFD
|
||||||
//= = = = = = = = = = = = = = = = = = = = = = = =//
|
//= = = = = = = = = = = = = = = = = = = = = = = =//
|
||||||
|
|
||||||
27: Newlines in code spans must be preserved as a space
|
27: Newlines in code spans must be preserved as a space
|
||||||
|
|
|
||||||
|
|
@ -296,7 +296,7 @@ func (r *Renderer) renderHTMLBlock(w util.BufWriter, source []byte, node ast.Nod
|
||||||
l := n.Lines().Len()
|
l := n.Lines().Len()
|
||||||
for i := 0; i < l; i++ {
|
for i := 0; i < l; i++ {
|
||||||
line := n.Lines().At(i)
|
line := n.Lines().At(i)
|
||||||
_, _ = w.Write(line.Value(source))
|
r.Writer.SecureWrite(w, line.Value(source))
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
_, _ = w.WriteString("<!-- raw HTML omitted -->\n")
|
_, _ = w.WriteString("<!-- raw HTML omitted -->\n")
|
||||||
|
|
@ -305,7 +305,7 @@ func (r *Renderer) renderHTMLBlock(w util.BufWriter, source []byte, node ast.Nod
|
||||||
if n.HasClosure() {
|
if n.HasClosure() {
|
||||||
if r.Unsafe {
|
if r.Unsafe {
|
||||||
closure := n.ClosureLine
|
closure := n.ClosureLine
|
||||||
_, _ = w.Write(closure.Value(source))
|
r.Writer.SecureWrite(w, closure.Value(source))
|
||||||
} else {
|
} else {
|
||||||
_, _ = w.WriteString("<!-- raw HTML omitted -->\n")
|
_, _ = w.WriteString("<!-- raw HTML omitted -->\n")
|
||||||
}
|
}
|
||||||
|
|
@ -668,8 +668,13 @@ type Writer interface {
|
||||||
// RawWrite writes the given source to writer without resolving references and
|
// RawWrite writes the given source to writer without resolving references and
|
||||||
// unescaping backslash escaped characters.
|
// unescaping backslash escaped characters.
|
||||||
RawWrite(writer util.BufWriter, source []byte)
|
RawWrite(writer util.BufWriter, source []byte)
|
||||||
|
|
||||||
|
// SecureWrite writes the given source to writer with replacing insecure characters.
|
||||||
|
SecureWrite(writer util.BufWriter, source []byte)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var replacementCharacter = []byte("\ufffd")
|
||||||
|
|
||||||
type defaultWriter struct {
|
type defaultWriter struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -684,6 +689,23 @@ func escapeRune(writer util.BufWriter, r rune) {
|
||||||
_, _ = writer.WriteRune(util.ToValidRune(r))
|
_, _ = writer.WriteRune(util.ToValidRune(r))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (d *defaultWriter) SecureWrite(writer util.BufWriter, source []byte) {
|
||||||
|
n := 0
|
||||||
|
l := len(source)
|
||||||
|
for i := 0; i < l; i++ {
|
||||||
|
if source[i] == '\u0000' {
|
||||||
|
_, _ = writer.Write(source[i-n : i])
|
||||||
|
n = 0
|
||||||
|
_, _ = writer.Write(replacementCharacter)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
n++
|
||||||
|
}
|
||||||
|
if n != 0 {
|
||||||
|
_, _ = writer.Write(source[l-n:])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (d *defaultWriter) RawWrite(writer util.BufWriter, source []byte) {
|
func (d *defaultWriter) RawWrite(writer util.BufWriter, source []byte) {
|
||||||
n := 0
|
n := 0
|
||||||
l := len(source)
|
l := len(source)
|
||||||
|
|
@ -719,7 +741,7 @@ func (d *defaultWriter) Write(writer util.BufWriter, source []byte) {
|
||||||
}
|
}
|
||||||
if c == '\x00' {
|
if c == '\x00' {
|
||||||
d.RawWrite(writer, source[n:i])
|
d.RawWrite(writer, source[n:i])
|
||||||
d.RawWrite(writer, []byte("\ufffd"))
|
d.RawWrite(writer, replacementCharacter)
|
||||||
n = i + 1
|
n = i + 1
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue