Source File
util.go
Belonging Package
github.com/yuin/goldmark/util
package util
import (
)
type CopyOnWriteBuffer struct {
buffer []byte
copied bool
}
func ( []byte) CopyOnWriteBuffer {
return CopyOnWriteBuffer{
buffer: ,
copied: false,
}
}
func ( *CopyOnWriteBuffer) ( string) {
.Write(StringToReadOnlyBytes())
}
func ( *CopyOnWriteBuffer) ( string) {
.Append(StringToReadOnlyBytes())
}
func ( *CopyOnWriteBuffer) () []byte {
return .buffer
}
func ( *CopyOnWriteBuffer) () bool {
return .copied
}
func ( []byte, , byte, , bool) int {
:= 0
:= 1
:= 0
for < len() {
:= []
if && != 0 && == '`' {
:= 0
for ; < len(); ++ {
if [] == '`' {
++
} else {
--
break
}
}
if == {
= 0
}
} else if == 0 && == '\\' && < len()-1 && IsPunct([+1]) {
+= 2
continue
} else if && == 0 && == '`' {
for ; < len(); ++ {
if [] == '`' {
++
} else {
--
break
}
}
} else if ( && == 0) || ! {
if == {
--
if == 0 {
return
}
} else if == {
if ! {
return -1
}
++
}
}
++
}
return -1
}
func ( []byte) []byte {
var []byte
:= NewCopyOnWriteBuffer()
:= 0
for := 0; < len(); ++ {
:= []
if < 0xb5 {
.Write([:])
.WriteByte( + 32)
= + 1
}
continue
}
if !utf8.RuneStart() {
continue
}
, := utf8.DecodeRune([:])
if == utf8.RuneError {
continue
}
, := unicodeCaseFoldings[]
if ! {
continue
}
.Write([:])
if == nil {
= make([]byte, 4)
}
for , := range {
:= utf8.EncodeRune(, )
.Write([:])
}
+= - 1
= + 1
}
if .IsCopied() {
.Write([:])
}
return .Bytes()
}
func ( []byte, byte) []byte {
var []byte
:= -1
for , := range {
:= IsSpace()
if < 0 && {
=
continue
} else if >= 0 && {
continue
} else if >= 0 {
if == nil {
= make([]byte, 0, len())
= append(, [:]...)
}
= append(, )
= -1
}
if != nil {
= append(, )
}
}
if >= 0 && != nil {
= append(, )
}
if == nil {
return
}
return
}
func ( []byte) string {
= TrimLeftSpace()
= TrimRightSpace()
= DoFullUnicodeCaseFolding()
return string(ReplaceSpaces(, ' '))
}
var htmlEscapeTable = [256][]byte{nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, []byte("""), nil, nil, nil, []byte("&"), nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, []byte("<"), nil, []byte(">"), nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil}
func ( byte) []byte {
return htmlEscapeTable[]
}
if < && == 'x' || == 'X' {
:= + 1
, = ReadWhile(, [2]int{, }, IsHexDecimal)
if && < && [] == ';' {
, := strconv.ParseUint(BytesToReadOnlyString([:]), 16, 32)
.Write([:])
= + 1
:= utf8.EncodeRune(, ToValidRune(rune()))
.Write([:])
continue
} else if >= '0' && <= '9' {
:=
, = ReadWhile(, [2]int{, }, IsNumeric)
if && < && - < 8 && [] == ';' {
, := strconv.ParseUint(BytesToReadOnlyString([:]), 0, 32)
.Write([:])
= + 1
:= utf8.EncodeRune(, ToValidRune(rune()))
.Write([:])
continue
}
}
}
}
= - 1
}
}
if .IsCopied() {
.Write([:])
}
return .Bytes()
}
func ( []byte) []byte {
:= NewCopyOnWriteBuffer()
:= len()
:= false
:= 0
for := 0; < ; ++ {
if [] == '&' {
:=
:= + 1
if !( < && [] == '#') {
:=
, = ReadWhile(, [2]int{, }, IsAlphaNumeric)
if && < && [] == ';' {
:= BytesToReadOnlyString([:])
, := LookUpHTML5EntityByName()
if {
.Write([:])
= + 1
.Write(.Characters)
continue
}
}
}
= - 1
}
}
if .IsCopied() {
.Write([:])
}
return .Bytes()
}
var htmlSpace = []byte("%20")
func ( []byte, bool) []byte {
if {
= UnescapePunctuations()
= ResolveNumericReferences()
= ResolveEntityNames()
}
:= NewCopyOnWriteBuffer()
:= len()
:= 0
for := 0; < ; {
:= []
if urlEscapeTable[] == 1 {
++
continue
}
if == '%' && +2 < && IsHexDecimal([+1]) && IsHexDecimal([+1]) {
+= 3
continue
}
:= utf8lenTable[]
if == 99 { // invalid utf8 leading byte, skip it
++
continue
}
if == ' ' {
.Write([:])
.Write(htmlSpace)
++
=
continue
}
if int() >= len() {
= int8(len() - 1)
}
if == 0 {
++
=
continue
}
.Write([:])
:= + int()
if > len() {
++
=
continue
}
.Write(StringToReadOnlyBytes(url.QueryEscape(string([:]))))
+= int()
=
}
if .IsCopied() && < {
.Write([:])
}
return .Bytes()
}
func ( []byte) int {
:= 0
if !(len() > 0 && urlTable[[]]&7 == 7) {
return -1
}
++
for ; < len(); ++ {
:= []
if urlTable[]&4 != 4 {
break
}
}
if == 1 || > 33 || >= len() {
return -1
}
if [] != ':' {
return -1
}
++
for ; < len(); ++ {
:= []
if urlTable[]&1 != 1 {
break
}
}
return
}
var emailDomainRegexp = regexp.MustCompile(`^[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*`)
:= 0
for ; < len(); ++ {
:= []
if emailTable[]&1 != 1 {
break
}
}
if == 0 {
return -1
}
if >= len() || [] != '@' {
return -1
}
++
if >= len() {
return -1
}
:= emailDomainRegexp.FindSubmatchIndex([:])
if == nil {
return -1
}
return + [1]
}
var spaces = []byte(" \t\n\x0b\x0c\x0d")
var spaceTable = [256]int8{0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
var punctTable = [256]int8{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
var urlEscapeTable = [256]int8{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
var utf8lenTable = [256]int8{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 99, 99, 99, 99, 99, 99, 99, 99}
var urlTable = [256]uint8{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 5, 5, 1, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1, 1, 0, 1, 0, 1, 1, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 1, 1, 1, 1, 1, 1, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}
var emailTable = [256]uint8{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
func ( byte) int8 {
return utf8lenTable[]
}
func ( byte) bool {
return punctTable[] == 1
}
func ( byte) bool {
return spaceTable[] == 1
}
type PrioritizedSlice []PrioritizedValue
func ( PrioritizedSlice) ( interface{}) PrioritizedSlice {
:= 0
:= false
for ; < len(); ++ {
if [].Value == {
= true
break
}
}
if ! {
return
}
return append([:], [+1:]...)
}
func ( interface{}, int) PrioritizedValue {
return PrioritizedValue{, }
}
func ( []byte) uint64 {
var uint64 = 5381
for , := range {
= (( << 5) + ) + uint64()
}
return
}
Add([]byte)
Extend(...[]byte) BytesFilter
}
type bytesFilter struct {
chars [256]uint8
threshold int
slots [][][]byte
}
func ( ...[]byte) BytesFilter {
:= &bytesFilter{
threshold: 3,
slots: make([][][]byte, 64),
}
for , := range {
.Add()
}
return
}
func ( *bytesFilter) ( []byte) {
:= len()
:= .threshold
if < .threshold {
=
}
for := 0; < ; ++ {
.chars[[]] |= 1 << uint8()
}
:= bytesHash() % uint64(len(.slots))
:= .slots[]
if == nil {
= [][]byte{}
}
.slots[] = append(, )
}
func ( *bytesFilter) ( ...[]byte) BytesFilter {
:= NewBytesFilter().(*bytesFilter)
.chars = .chars
.threshold = .threshold
for , := range .slots {
:= make([][]byte, len())
copy(, )
.slots[] =
}
for , := range {
.Add()
}
return
}
func ( *bytesFilter) ( []byte) bool {
:= len()
:= .threshold
if < .threshold {
=
}
for := 0; < ; ++ {
if (.chars[[]] & (1 << uint8())) == 0 {
return false
}
}
:= bytesHash() % uint64(len(.slots))
:= .slots[]
if == nil || len() == 0 {
return false
}
for , := range {
if bytes.Equal(, ) {
return true
}
}
return false
![]() |
The pages are generated with Golds v0.3.2-preview. (GOOS=darwin GOARCH=amd64) Golds is a Go 101 project developed by Tapir Liu. PR and bug reports are welcome and can be submitted to the issue list. Please follow @Go100and1 (reachable from the left QR code) to get the latest news of Golds. |