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 }