templatefuncs.go - randomcrap - random crap programs of varying quality
(HTM) git clone git://git.codemadness.org/randomcrap
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
templatefuncs.go (1698B)
---
1 package main
2
3 import (
4 "bytes"
5 "encoding/xml"
6 "regexp"
7 "strings"
8 "text/template"
9 )
10
11 var re_cache = make(map[string]*regexp.Regexp)
12
13 func compileRegex(regex string) (*regexp.Regexp, error) {
14 var re *regexp.Regexp
15 var err error
16
17 if re_cache[regex] != nil {
18 // exists
19 re = re_cache[regex]
20 } else {
21 // doesn't exist: compile and store.
22 re, err = regexp.Compile(regex)
23 if err != nil {
24 return nil, err
25 }
26 re_cache[regex] = re
27 }
28 return re, nil
29 }
30
31 func RegexReplace(s, regex, rep string) (string, error) {
32 re, err := compileRegex(regex)
33 if err != nil {
34 return "", err
35 }
36 return re.ReplaceAllString(s, rep), nil
37 }
38
39 func RegexMatch(s, regex string) (bool, error) {
40 re, err := compileRegex(regex)
41 if err != nil {
42 return false, err
43 }
44 return re.MatchString(s), nil
45 }
46
47 func Replace(s, f, rep string) string {
48 return strings.Replace(s, f, rep, -1)
49 }
50
51 // Cdata must be used inside <![CDATA[]]>
52 func Cdata(s string) string {
53 return strings.Replace(s, "]]>", "]]]]><![CDATA[>", -1)
54 }
55
56 func EscapeXML(s string) (string, error) {
57 var buf bytes.Buffer
58 err := xml.EscapeText(&buf, []byte(s))
59 return buf.String(), err
60 }
61
62 func AddTemplateFuncs(t *template.Template) *template.Template {
63 funcmap := make(map[string]interface{})
64
65 funcmap["RegexReplace"] = RegexReplace
66 funcmap["RegexMatch"] = RegexMatch
67 funcmap["Replace"] = Replace
68
69 // escape CDATA end, see: http://www.w3.org/TR/REC-xml/#sec-cdata-sect.
70 funcmap["Cdata"] = Cdata // Cdata must be used inside <![CDATA[]]>
71 funcmap["cdata"] = Cdata // Cdata must be used inside <![CDATA[]]>
72
73 // Escape XML text.
74 funcmap["XML"] = EscapeXML
75 funcmap["xml"] = EscapeXML
76 funcmap["Xml"] = EscapeXML
77
78 return t.Funcs(funcmap)
79 }