Mercurial > yakumo_izuru > aya
comparison vendor/github.com/russross/blackfriday/v2/esc.go @ 66:787b5ee0289d draft
Use vendored modules
Signed-off-by: Izuru Yakumo <yakumo.izuru@chaotic.ninja>
| author | yakumo.izuru |
|---|---|
| date | Sun, 23 Jul 2023 13:18:53 +0000 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 65:6d985efa0f7a | 66:787b5ee0289d |
|---|---|
| 1 package blackfriday | |
| 2 | |
| 3 import ( | |
| 4 "html" | |
| 5 "io" | |
| 6 ) | |
| 7 | |
| 8 var htmlEscaper = [256][]byte{ | |
| 9 '&': []byte("&"), | |
| 10 '<': []byte("<"), | |
| 11 '>': []byte(">"), | |
| 12 '"': []byte("""), | |
| 13 } | |
| 14 | |
| 15 func escapeHTML(w io.Writer, s []byte) { | |
| 16 escapeEntities(w, s, false) | |
| 17 } | |
| 18 | |
| 19 func escapeAllHTML(w io.Writer, s []byte) { | |
| 20 escapeEntities(w, s, true) | |
| 21 } | |
| 22 | |
| 23 func escapeEntities(w io.Writer, s []byte, escapeValidEntities bool) { | |
| 24 var start, end int | |
| 25 for end < len(s) { | |
| 26 escSeq := htmlEscaper[s[end]] | |
| 27 if escSeq != nil { | |
| 28 isEntity, entityEnd := nodeIsEntity(s, end) | |
| 29 if isEntity && !escapeValidEntities { | |
| 30 w.Write(s[start : entityEnd+1]) | |
| 31 start = entityEnd + 1 | |
| 32 } else { | |
| 33 w.Write(s[start:end]) | |
| 34 w.Write(escSeq) | |
| 35 start = end + 1 | |
| 36 } | |
| 37 } | |
| 38 end++ | |
| 39 } | |
| 40 if start < len(s) && end <= len(s) { | |
| 41 w.Write(s[start:end]) | |
| 42 } | |
| 43 } | |
| 44 | |
| 45 func nodeIsEntity(s []byte, end int) (isEntity bool, endEntityPos int) { | |
| 46 isEntity = false | |
| 47 endEntityPos = end + 1 | |
| 48 | |
| 49 if s[end] == '&' { | |
| 50 for endEntityPos < len(s) { | |
| 51 if s[endEntityPos] == ';' { | |
| 52 if entities[string(s[end:endEntityPos+1])] { | |
| 53 isEntity = true | |
| 54 break | |
| 55 } | |
| 56 } | |
| 57 if !isalnum(s[endEntityPos]) && s[endEntityPos] != '&' && s[endEntityPos] != '#' { | |
| 58 break | |
| 59 } | |
| 60 endEntityPos++ | |
| 61 } | |
| 62 } | |
| 63 | |
| 64 return isEntity, endEntityPos | |
| 65 } | |
| 66 | |
| 67 func escLink(w io.Writer, text []byte) { | |
| 68 unesc := html.UnescapeString(string(text)) | |
| 69 escapeHTML(w, []byte(unesc)) | |
| 70 } |
