hugo

Unnamed repository; edit this file 'description' to name the repository.

git clone git://git.shimmy1996.com/hugo.git
commit ce264b936ce9f589bd889e18762881cff8bc9cd0
parent 91f49c0700dde13e16f42c745584a0bef60c6fe2
Author: Cameron Moore <moorereason@gmail.com>
Date:   Tue,  2 Oct 2018 09:41:48 -0500

tpl: Add a delimiter parameter to lang.NumFmt

The original implementation of NumFmt did not take into account that the
options delimiter (a space) could be a valid option.  Adding a delim
parameter seems like the simplest, safest, and most flexible way to
solve this oversight in a backwards-compatible way.

Fixes #5260

Diffstat:
Mdocs/content/en/functions/NumFmt.md | 7+++++--
Mtpl/lang/lang.go | 16++++++++++++++--
Mtpl/lang/lang_test.go | 29+++++++++++++++++++----------
3 files changed, 38 insertions(+), 14 deletions(-)
diff --git a/docs/content/en/functions/NumFmt.md b/docs/content/en/functions/NumFmt.md
@@ -12,7 +12,7 @@ menu:
   docs:
     parent: "functions"
 toc: false
-signature: ["lang.NumFmt PRECISION NUMBER [OPTIONS]"]
+signature: ["lang.NumFmt PRECISION NUMBER [OPTIONS [DELIMITER]]"]
 workson: []
 hugoversion:
 relatedfuncs: []
@@ -22,7 +22,9 @@ aliases: []
 comments:
 ---
 
-The default options value is `- . ,`.
+The default options value is `- . ,`.  The default delimiter within the options
+value is a space.  If you need to use a space as one of the options, set a
+custom delimiter.
 
 Numbers greater than or equal to 5 are rounded up. For example, if precision is set to `0`, `1.5` becomes `2`, and `1.4` becomes `1`.
 
@@ -31,5 +33,6 @@ Numbers greater than or equal to 5 are rounded up. For example, if precision is 
 {{ lang.NumFmt 2 12345.6789 "- , ." }} → 12.345,68
 {{ lang.NumFmt 0 -12345.6789 "- . ," }} → -12,346
 {{ lang.NumFmt 6 -12345.6789 "- ." }} → -12345.678900
+{{ lang.NumFmt 6 -12345.6789 "-|.| " "|" }} → -1 2345.678900
 {{ -98765.4321 | lang.NumFmt 2 }} → -98,765.43
 ```
diff --git a/tpl/lang/lang.go b/tpl/lang/lang.go
@@ -67,15 +67,27 @@ func (ns *Namespace) NumFmt(precision, number interface{}, options ...interface{
 	var neg, dec, grp string
 
 	if len(options) == 0 {
-		// TODO(moorereason): move to site config
+		// defaults
 		neg, dec, grp = "-", ".", ","
 	} else {
+		delim := " "
+
+		if len(options) == 2 {
+			// custom delimiter
+			s, err := cast.ToStringE(options[1])
+			if err != nil {
+				return "", nil
+			}
+
+			delim = s
+		}
+
 		s, err := cast.ToStringE(options[0])
 		if err != nil {
 			return "", nil
 		}
 
-		rs := strings.Fields(s)
+		rs := strings.Split(s, delim)
 		switch len(rs) {
 		case 0:
 		case 1:
diff --git a/tpl/lang/lang_test.go b/tpl/lang/lang_test.go
@@ -18,22 +18,27 @@ func TestNumFormat(t *testing.T) {
 		prec  int
 		n     float64
 		runes string
+		delim string
 
 		want string
 	}{
-		{2, -12345.6789, "", "-12,345.68"},
-		{2, -12345.6789, "- . ,", "-12,345.68"},
-		{2, -12345.1234, "- . ,", "-12,345.12"},
+		{2, -12345.6789, "", "", "-12,345.68"},
+		{2, -12345.6789, "- . ,", "", "-12,345.68"},
+		{2, -12345.1234, "- . ,", "", "-12,345.12"},
 
-		{2, 12345.6789, "- . ,", "12,345.68"},
-		{0, 12345.6789, "- . ,", "12,346"},
-		{11, -12345.6789, "- . ,", "-12,345.67890000000"},
+		{2, 12345.6789, "- . ,", "", "12,345.68"},
+		{0, 12345.6789, "- . ,", "", "12,346"},
+		{11, -12345.6789, "- . ,", "", "-12,345.67890000000"},
 
-		{3, -12345.6789, "- ,", "-12345,679"},
-		{6, -12345.6789, "- , .", "-12.345,678900"},
+		{3, -12345.6789, "- ,", "", "-12345,679"},
+		{6, -12345.6789, "- , .", "", "-12.345,678900"},
+
+		{3, -12345.6789, "-|,| ", "|", "-12 345,679"},
+		{6, -12345.6789, "-|,| ", "|", "-12 345,678900"},
 
 		// Arabic, ar_AE
-		{6, -12345.6789, "‏- ٫ ٬", "‏-12٬345٫678900"},
+		{6, -12345.6789, "‏- ٫ ٬", "", "‏-12٬345٫678900"},
+		{6, -12345.6789, "‏-|٫| ", "|", "‏-12 345٫678900"},
 	}
 
 	for i, c := range cases {
@@ -45,7 +50,11 @@ func TestNumFormat(t *testing.T) {
 		if len(c.runes) == 0 {
 			s, err = ns.NumFmt(c.prec, c.n)
 		} else {
-			s, err = ns.NumFmt(c.prec, c.n, c.runes)
+			if c.delim == "" {
+				s, err = ns.NumFmt(c.prec, c.n, c.runes)
+			} else {
+				s, err = ns.NumFmt(c.prec, c.n, c.runes, c.delim)
+			}
 		}
 
 		require.NoError(t, err, errMsg)