У меня есть строки формата, предоставленные пользователем, и для каждой есть соответствующий фрагмент. Например, у меня могут быть Test string {{1}}: {{2}}
и ["number 1", "The Bit Afterwards"]
. Я хочу сгенерировать из этого Test string number 1: The Bit Afterwards
.
Формат предоставленных пользователем строк не фиксирован и может быть изменен при необходимости. Однако я не могу гарантировать их вменяемость или безопасность; я также не могу гарантировать, что любой заданный символ не будет использоваться в строке, поэтому любые теги (например, {}
в моем примере) должны быть экранируемыми. Я также не могу гарантировать, что такое же количество значений срезов будет существовать как теги в шаблоне - например, у меня вполне разумно могут быть Test string {{1}}
и ["number 1", "another parameter", "yet another parameter"]
.
Как я могу эффективно отформатировать эти строки в в соответствии с введенными данными? Они используются только как строки и не требуют HTML, SQL или любого другого вида экранирования.
То, что я уже рассмотрел:
fmt.Sprintf
- две проблемы: 1) использование с пользовательскими шаблонами не идеально; 2) Sprintf плохо работает с рядом параметров, которые не соответствуют его строке формата, добавляя %!(EXTRA type=value)
в конец. - Библиотека
text/template
. Теоретически это могло бы работать нормально, но я не хочу, чтобы пользователи вводили {{index .arr n}}
для каждого из своих тегов; в этом случае мне нужны только индексы срезов. - Библиотека valyala / fasttemplate . Это в значительной степени именно то, что я ищу, но из-за того факта, что в настоящее время он не поддерживает экранирование разделителей, которые он использует для своих тегов, на момент написания. Я открыл проблему для этого, но я бы подумал, что уже есть решение этой проблемы где-то - не кажется, что оно такое уникальное.
- Просто пишу свое парсер для него. Это сработает ... но, как указано выше, я не могу быть первым, кто столкнулся с этим!
Мы будем очень благодарны за любые советы или предложения.