From 80732c1536859d333ce808d6b2919e004cab95e8 Mon Sep 17 00:00:00 2001 From: nanohard Date: Mon, 10 Sep 2018 10:54:08 -0500 Subject: Allow &endash and &emdash. Closes #271. --- system/admin/static/common/js/util.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/system/admin/static/common/js/util.js b/system/admin/static/common/js/util.js index 8d5e74b..b126f2f 100644 --- a/system/admin/static/common/js/util.js +++ b/system/admin/static/common/js/util.js @@ -8,8 +8,6 @@ function replaceBadChars(text) { s = s.replace(/[\u201C\u201D\u201E]/g, "\""); // ellipsis s = s.replace(/\u2026/g, "..."); - // dashes - s = s.replace(/[\u2013\u2014]/g, "-"); // circumflex s = s.replace(/\u02C6/g, "^"); // open angle bracket -- cgit v1.2.3 From f458df6fdcfde9eb35fa6b6d9b66173d1057c7a5 Mon Sep 17 00:00:00 2001 From: nanohard Date: Tue, 11 Sep 2018 11:10:07 -0500 Subject: Compile regex once instead of each time function is called. --- system/item/item.go | 47 ++++++++++++++++++++++------------------------- 1 file 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) -- cgit v1.2.3