Как можно динамически форматировать строку с помощью предоставленного пользователем шаблона и фрагмента параметров в Go? - PullRequest
0 голосов
/ 20 июня 2020

У меня есть строки формата, предоставленные пользователем, и для каждой есть соответствующий фрагмент. Например, у меня могут быть 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 . Это в значительной степени именно то, что я ищу, но из-за того факта, что в настоящее время он не поддерживает экранирование разделителей, которые он использует для своих тегов, на момент написания. Я открыл проблему для этого, но я бы подумал, что уже есть решение этой проблемы где-то - не кажется, что оно такое уникальное.
  • Просто пишу свое парсер для него. Это сработает ... но, как указано выше, я не могу быть первым, кто столкнулся с этим!

Мы будем очень благодарны за любые советы или предложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...