/[aya]/vendor/github.com/russross/blackfriday/v2/esc.go
ViewVC logotype

Contents of /vendor/github.com/russross/blackfriday/v2/esc.go

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.1 - (show annotations)
Mon Sep 30 00:42:06 2024 UTC (6 weeks, 4 days ago) by yakumo_izuru
Branch: MAIN
CVS Tags: HEAD
Mirrored from https://git.chaotic.ninja/git/yakumo_izuru/aya

1 package blackfriday
2
3 import (
4 "html"
5 "io"
6 )
7
8 var htmlEscaper = [256][]byte{
9 '&': []byte("&"),
10 '<': []byte("&lt;"),
11 '>': []byte("&gt;"),
12 '"': []byte("&quot;"),
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 }

nishi@chaotic.ninja
ViewVC Help
Powered by ViewVC 1.3.0-dev