summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Manuel <nilslice@gmail.com>2018-10-09 00:56:13 -0600
committerGitHub <noreply@github.com>2018-10-09 00:56:13 -0600
commit75d6ae9a1e89ff212e269949a690024e3e362a52 (patch)
treee9cd6a0ead23bb92c5a8e8e7b2f81410d129d0af
parentd86d77b3105dd801cfdfa7ba01c1cc891d3b696a (diff)
parentf458df6fdcfde9eb35fa6b6d9b66173d1057c7a5 (diff)
Merge pull request #277 from nanohard/enhance/regex-compile
Compile regex once instead of each time function is called.
-rw-r--r--system/item/item.go47
1 files changed, 22 insertions, 25 deletions
diff --git a/system/item/item.go b/system/item/item.go
index 32d38f7..1108ae0 100644
--- a/system/item/item.go
+++ b/system/item/item.go
@@ -17,6 +17,24 @@ import (
"golang.org/x/text/unicode/norm"
)
+var rxList map[*regexp.Regexp][]byte
+
+func init() {
+ // Compile regex once to use in stringToSlug().
+ // We store the compiled regex as the key
+ // and assign the replacement as the map's value.
+ rxList = map[*regexp.Regexp][]byte{
+ regexp.MustCompile("`[-]+`"): []byte("-"),
+ regexp.MustCompile("[[:space:]]"): []byte("-"),
+ regexp.MustCompile("[[:blank:]]"): []byte(""),
+ regexp.MustCompile("`[^a-z0-9]`i"): []byte("-"),
+ regexp.MustCompile("[!/:-@[-`{-~]"): []byte(""),
+ regexp.MustCompile("/[^\x20-\x7F]/"): []byte(""),
+ regexp.MustCompile("`&(amp;)?#?[a-z0-9]+;`i"): []byte("-"),
+ regexp.MustCompile("`&([a-z])(acute|uml|circ|grave|ring|cedil|slash|tilde|caron|lig|quot|rsquo);`i"): []byte("\\1"),
+ }
+}
+
// Sluggable makes a struct locatable by URL with it's own path.
// As an Item implementing Sluggable, slugs may overlap. If this is an issue,
// make your content struct (or one which embeds Item) implement Sluggable
@@ -316,31 +334,10 @@ func isMn(r rune) bool {
func stringToSlug(s string) (string, error) {
src := []byte(strings.ToLower(s))
- // convert all spaces to dash
- rx := regexp.MustCompile("[[:space:]]")
- src = rx.ReplaceAll(src, []byte("-"))
-
- // remove all blanks such as tab
- rx = regexp.MustCompile("[[:blank:]]")
- src = rx.ReplaceAll(src, []byte(""))
-
- rx = regexp.MustCompile("[!/:-@[-`{-~]")
- src = rx.ReplaceAll(src, []byte(""))
-
- rx = regexp.MustCompile("/[^\x20-\x7F]/")
- src = rx.ReplaceAll(src, []byte(""))
-
- rx = regexp.MustCompile("`&(amp;)?#?[a-z0-9]+;`i")
- src = rx.ReplaceAll(src, []byte("-"))
-
- rx = regexp.MustCompile("`&([a-z])(acute|uml|circ|grave|ring|cedil|slash|tilde|caron|lig|quot|rsquo);`i")
- src = rx.ReplaceAll(src, []byte("\\1"))
-
- rx = regexp.MustCompile("`[^a-z0-9]`i")
- src = rx.ReplaceAll(src, []byte("-"))
-
- rx = regexp.MustCompile("`[-]+`")
- src = rx.ReplaceAll(src, []byte("-"))
+ // Range over compiled regex and replacements from init().
+ for rx := range rxList {
+ src = rx.ReplaceAll(src, rxList[rx])
+ }
str := strings.Replace(string(src), "'", "", -1)
str = strings.Replace(str, `"`, "", -1)