bbcode - bbcodehtml/tags.go
1 package bbcodehtml // import "vimagination.zapto.org/bbcode/bbcodehtml"
2
3 import (
4 "bytes"
5 "html/template"
6 "strconv"
7 "strings"
8
9 "vimagination.zapto.org/bbcode"
10 )
11
12 var (
13 alignLeft = []byte("left")
14 alignRight = []byte("right")
15 alignCentre = []byte("center")
16 alignFull = []byte("justify")
17
18 leftOpen = []byte("<div style=\"text-align: left\">")
19 centreOpen = []byte("<div style=\"text-align: center\">")
20 rightOpen = []byte("<div style=\"text-align: right\">")
21 fullOpen = []byte("<div style=\"text-align: justify\">")
22
23 divOpen = []byte("<div>")
24 divPartialOpen = divOpen[:4]
25 divClose = []byte("</div>")
26
27 spanOpen = []byte("<span>")
28 spanPartialOpen = spanOpen[:5]
29 spanClose = []byte("</span>")
30
31 attrTagClose = []byte("\">")
32 tagClose = attrTagClose[:1]
33 attrClose = attrTagClose[1:]
34 sizeClose = []byte("pt\"")
35
36 alignAttr = []byte(" style=\"text-align: ")
37 colourAttr = []byte(" style=\"color: ")
38 fontAttr = []byte(" style=\"font-family: ")
39 sizeAttr = []byte(" style=\"font-size: ")
40 )
41
42 // The following are some predefined bbcode tags for common applications
43 var (
44 Align = bbcode.NewAttributeTag("align", divPartialOpen, tagClose, alignAttr, attrClose, divClose, bbcode.AttrFilterFunc(alignFilter))
45
46 LeftAlign = bbcode.NewTag("left", leftOpen, divClose)
47 CentreAlign = bbcode.NewTag("centre", centreOpen, divClose)
48 CenterAlign = bbcode.NewTag("center", centreOpen, divClose)
49 RightAlign = bbcode.NewTag("right", rightOpen, divClose)
50 FullAlign = bbcode.NewTag("full", fullOpen, divClose)
51
52 Color = bbcode.NewAttributeTag("color", spanPartialOpen, tagClose, colourAttr, attrClose, spanClose, Colours)
53 Colour = bbcode.NewAttributeTag("colour", spanPartialOpen, tagClose, colourAttr, attrClose, spanClose, Colours)
54
55 Font = bbcode.NewAttributeTag("font", spanPartialOpen, tagClose, fontAttr, attrClose, spanClose, Fonts)
56
57 Bold = bbcode.NewTag("b", []byte("<b>"), []byte("</b>"))
58 Italic = bbcode.NewTag("i", []byte("<i>"), []byte("</i>"))
59 Strikethough = bbcode.NewTag("s", []byte("<s>"), []byte("</s>"))
60 Underline = bbcode.NewTag("u", []byte("<u>"), []byte("</u>"))
61
62 Size = bbcode.NewAttributeTag("size", spanPartialOpen, tagClose, sizeAttr, sizeClose, spanClose, bbcode.AttrFilterFunc(sizeFilter))
63
64 Heading1 = bbcode.NewTag("h1", []byte("<h1>"), []byte("</h1>"))
65 Heading2 = bbcode.NewTag("h2", []byte("<h2>"), []byte("</h2>"))
66 Heading3 = bbcode.NewTag("h3", []byte("<h3>"), []byte("</h3>"))
67 Heading4 = bbcode.NewTag("h4", []byte("<h4>"), []byte("</h4>"))
68 Heading5 = bbcode.NewTag("h5", []byte("<h5>"), []byte("</h5>"))
69 Heading6 = bbcode.NewTag("h6", []byte("<h6>"), []byte("</h6>"))
70 Heading7 = bbcode.NewTag("h7", []byte("<h7>"), []byte("</h7>"))
71
72 Quote = bbcode.NewAttributeTag("quote", []byte("<fieldset class=\"quote\">"), []byte("<blockquote>"), []byte("<legend>"), []byte("</legend>"), []byte("</blockquote></fieldset>"), bbcode.AttrFilterFunc(notEmptyFilter))
73
74 Code code
75 Image img
76 List list
77 Table table
78 URL url
79 )
80
81 func alignFilter(attr string) []byte {
82 switch strings.ToLower(attr) {
83 case "left":
84 return alignLeft
85 case "center", "centre":
86 return alignCentre
87 case "right":
88 return alignRight
89 case "full", "justify", "fulljustify", "full-justify", "full justify":
90 return alignFull
91 }
92 return nil
93 }
94
95 func sizeFilter(attr string) []byte {
96 n, _ := strconv.Atoi(attr)
97 if n >= 1 && n <= 50 {
98 return []byte(attr)
99 }
100 return nil
101 }
102
103 func notEmptyFilter(attr string) []byte {
104 if len(attr) == 0 {
105 return nil
106 } else if !strings.ContainsAny(attr, "'\"&<>\000") {
107 return []byte(attr)
108 }
109 var b bytes.Buffer
110 template.HTMLEscape(&b, []byte(attr))
111 return b.Bytes()
112 }
113