p1: /v2/scrape, /v1/fetch, auth, CLI, contract tests
Single Fetcher.Fetch on the Guard that holds DenyPrefixes. skipTlsVerification is ignored. No 502. keys add writes the secret only to --out. Release binary has no -test-allow-prefix.
This commit is contained in:
+89
@@ -0,0 +1,89 @@
|
||||
package converter
|
||||
|
||||
import (
|
||||
"unicode/utf8"
|
||||
|
||||
"github.com/JohannesKaufmann/html-to-markdown/v2/marker"
|
||||
)
|
||||
|
||||
const (
|
||||
actionKeep = iota
|
||||
actionEscape = iota
|
||||
)
|
||||
|
||||
// IMPORTANT: Only internally we assume it is only byte
|
||||
var placeholderByte byte = marker.BytesMarkerEscaping[0]
|
||||
|
||||
func (conv *Converter) escapeContent(chars []byte) []byte {
|
||||
if conv.escapeMode == EscapeModeDisabled {
|
||||
return chars
|
||||
}
|
||||
|
||||
newChars := make([]byte, 0, len(chars))
|
||||
for index := 0; index < len(chars); index++ {
|
||||
if chars[index] == '\u0000' {
|
||||
// For security reasons, the Unicode character U+0000 must be replaced with the REPLACEMENT CHARACTER (U+FFFD).
|
||||
newChars = append(newChars, []byte(string('\ufffd'))...)
|
||||
continue
|
||||
}
|
||||
|
||||
r, _ := utf8.DecodeRune(chars[index:])
|
||||
|
||||
isMarkdownChar := conv.checkIsEscapedChar(r)
|
||||
if isMarkdownChar {
|
||||
newChars = append(newChars, placeholderByte, chars[index])
|
||||
} else {
|
||||
newChars = append(newChars, chars[index])
|
||||
}
|
||||
}
|
||||
|
||||
return newChars
|
||||
}
|
||||
|
||||
func (conv *Converter) unEscapeContent(chars []byte) []byte {
|
||||
if conv.escapeMode == EscapeModeDisabled {
|
||||
return chars
|
||||
}
|
||||
|
||||
checkElements := func(index int) int {
|
||||
for _, handler := range conv.getUnEscapeHandlers() {
|
||||
if skip := handler.Value(chars, index); skip != -1 {
|
||||
return skip
|
||||
}
|
||||
}
|
||||
|
||||
return -1
|
||||
}
|
||||
|
||||
changes := make([]uint8, len(chars))
|
||||
for index := 0; index < len(chars); index++ {
|
||||
|
||||
if chars[index] != placeholderByte {
|
||||
continue
|
||||
}
|
||||
if index+1 >= len(chars) {
|
||||
break
|
||||
}
|
||||
|
||||
skip := checkElements(index + 1)
|
||||
if skip == -1 {
|
||||
continue
|
||||
}
|
||||
changes[index] = actionEscape
|
||||
index += skip - 1
|
||||
}
|
||||
|
||||
newChars := make([]byte, 0, len(chars))
|
||||
for index, char := range chars {
|
||||
if char != placeholderByte {
|
||||
newChars = append(newChars, char)
|
||||
continue
|
||||
}
|
||||
|
||||
// What to do with this placeholder? Should we escape or not?
|
||||
if changes[index] == actionEscape {
|
||||
newChars = append(newChars, '\\')
|
||||
}
|
||||
}
|
||||
return newChars
|
||||
}
|
||||
Reference in New Issue
Block a user