방금 간단한 클래스를 썼습니다. 그것이 않는 모든 @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을 사용하여 나머지 문자열을 가져옵니다). "청크 "텍스트의. 정규식을 사용하여 전체 변수 이름을 어떻게 얻을 수 있을지 모르겠습니다.
이 클래스는 훨씬 더 복잡해 지므로 앞으로 더 가야하기 전에 올바른 접근 방식을 갖고 싶습니다.
내이 문제는 다음과 같습니다
- 카운터를 현재 위치에서 텍스트의 체크를 꺼내하고 발전 할 수있는 좋은 방법은 무엇입니까? 예를 들어, 일단 텍스트의 다음 비트가 사실 변수 이름이어야한다고 결정하면 변수 이름을 추출합니다.
- 빨리 템플릿을 반복해서 렌더링 할 수있는 노드 (이 경우 텍스트 및 변수 노드 만)를 어떻게 저장해야합니까? 텍스트를 구문 분석 할 때 또한
s = s.Replace("@name", name); s = s.Replace("@Adjective", adjective);
, 나는 예외를 던지는 피할 것 :에 대해 무엇
템플릿으로 렌더링하려는 텍스트가 텍스트입니까? RegExes는 분기 된 구조에는 적합하지 않습니다. – pbalaga
@rook : 예, "text"는 "문자열"을 의미하지만 HTML이면 ... JSON 또는 XML입니다. 명확하게 말하면 * 출력 *은 입력이 아닌 HTML입니다. – mpen