view pkg/xlsx/handlebars.go @ 5688:6281c18b109f sr-v2

Finsh serializing v2 meshes.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Mon, 12 Feb 2024 02:27:41 +0100
parents 0919946f624b
children
line wrap: on
line source

// 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()
}