diff pkg/xlsx/handlebars.go @ 5321:0919946f624b extented-report

Added a report controller.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Thu, 27 May 2021 01:22:10 +0200
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pkg/xlsx/handlebars.go	Thu May 27 01:22:10 2021 +0200
@@ -0,0 +1,83 @@
+// This is Free Software under GNU Affero General Public License v >= 3.0
+// without warranty, see README.md and license for details.
+//
+// SPDX-License-Identifier: AGPL-3.0-or-later
+// License-Filename: LICENSES/AGPL-3.0.txt
+//
+// Copyright (C) 2021 by via donau
+//   – Österreichische Wasserstraßen-Gesellschaft mbH
+// Software engineering by Intevation GmbH
+//
+// Author(s):
+//  * Sascha L. Teichmann <sascha.teichmann@intevation.de>
+
+package xlsx
+
+import "strings"
+
+func handlebars(s string, replace func(string) string) string {
+
+	var (
+		out, repl strings.Builder
+		mode      int
+	)
+
+	for _, c := range s {
+		switch mode {
+		case 0:
+			if c == '{' {
+				mode = 1
+			} else {
+				out.WriteRune(c)
+			}
+		case 1:
+			if c == '{' {
+				mode = 2
+			} else {
+				out.WriteByte('{')
+				out.WriteRune(c)
+				mode = 0
+			}
+		case 2:
+			switch c {
+			case '\\':
+				mode = 3
+			case '}':
+				mode = 4
+			default:
+				repl.WriteRune(c)
+			}
+		case 3:
+			repl.WriteRune(c)
+			mode = 2
+		case 4:
+			if c == '}' {
+				out.WriteString(replace(repl.String()))
+				repl.Reset()
+				mode = 0
+			} else {
+				repl.WriteByte('}')
+				repl.WriteRune(c)
+				mode = 2
+			}
+		}
+	}
+
+	switch mode {
+	case 1:
+		out.WriteByte('{')
+	case 2:
+		out.WriteString("{{")
+		out.WriteString(repl.String())
+	case 3:
+		out.WriteString("{{")
+		out.WriteString(repl.String())
+		out.WriteByte('\\')
+	case 4:
+		out.WriteString("{{")
+		out.WriteString(repl.String())
+		out.WriteByte('}')
+	}
+
+	return out.String()
+}