Я просто написал простой класс. Все это делает принимает строку ввода, какКак улучшить этот простой класс рендеринга шаблонов?
Здравствуйте @name, вы смотрите @adjective сегодня!
И заменяет @variables
своими значениями из словаря. Например, проходящий в new Dictionary<string,object>{{"name","Ralph"},{"adjective","stunning"}}
даст:
Здравствуйте, Ральф, вы сегодня выглядите потрясающе!
Вот класс:
class Template
{
List<object> nodes = new List<object>();
public Template(string content)
{
for (int i = 0; i < content.Length; ++i)
{
char ch = content[i];
if (ch == '@')
{
var match = Regex.Match(content.Substring(i + 1), @"\w+");
if (match.Success)
{
nodes.Add(new Variable(match.Value));
i += match.Value.Length;
}
else
{
throw new Exception(string.Format("Expected variable name after @ symbol at character {0}", i));
}
}
else
{
nodes.Add(ch.ToString());
}
}
}
public string Render(Dictionary<string,object> dict)
{
var sb = new StringBuilder();
foreach (var item in nodes)
{
if (item is Variable)
{
sb.Append(dict[((Variable)item).Name]);
}
else
{
sb.Append(item);
}
}
return sb.ToString();
}
class Variable
{
public readonly string Name;
public Variable(string name)
{
Name = name;
}
}
}
Это хороший подход к такой проблеме? Я хочу сделать как можно больше обработки в конструкторе, чтобы я мог повторно отображать шаблон снова и снова, не переупаковывая его.
Прямо сейчас я перебираю весь список узлов, ищущих переменные узлы, чтобы их можно было заменить. Может быть, есть способ, которым я могу «пропустить» эти узлы? Это поможет?
Кроме того, я разбираю его символ по символу, но затем я использую регулярное выражение (которое я хочу начать с следующего символа, поэтому я использую .Substring, чтобы получить оставшуюся часть строки), чтобы получить «кусок» "текста. Я не уверен, как еще я могу получить полное имя переменной w/out с помощью регулярного выражения?
Этот класс собирается стать намного более сложным, поэтому я хочу убедиться, что у меня есть правильный подход, прежде чем я пойду дальше.
Мои 2 проблемы являются:
- Что такое хороший способ, чтобы вытащить кусок текста из текущей позиции, и продвигать счетчик? Например, извлечение имени переменной после того, как я определил, что следующий бит текста должен быть именем переменной.
- Как хранить узлы (в данном случае, только текстовые и переменные узлы), чтобы я мог быстро визуализировать шаблон снова и снова?
Это текст, который вы попытаетесь сделать с помощью своих шаблонов? RegExes не подходят для разветвленных структур. – pbalaga
@rook: Да, если под «текстом» вы подразумеваете «строки», но это будет HTML ... возможно, JSON или XML в будущем. Чтобы быть ясным, * output * будет HTML, а не входным. – mpen