2017-03-09 12 views
0

C#의 HTML 템플릿 엔진에서 작업 중입니다. Handlebars.Net (Handlebars.js의 C# 구현)과 같은 라이브러리와 동일한 기능을 일부 수행하려고합니다. 단, 전체 출력 컴파일러가 아닌 기본 문자열 조작 (찾기/바꾸기)을 사용하는 경우는 예외입니다.사용자 지정 HTML 유사 구조에서 시작 및 끝 태그 찾기

뭔가 같은 구문은 다음과 같습니다 제가 정규식으로 간단한 문자열 교체를 할 찾고

{{#each item in items}} 

    <li>{{item.Name}}</li> 

{{/each}} 

,하지만 난 정규식은 예에서 종료 태그를 찾는 등이 분야의 단점을 것이다 실현 아래의 (가 찾아 낼 것입니다 최초의 임베디드 {{/ 각}}보다는 마지막으로 첫 번째 태그 구문 분석 할 때) :

{{#each item in items}} //while parsing this tag... 

    <p>{{item.Name}}'s Hobbies:</p> 

    <ul> 
    {{#each hobby in item}} 

     <li>{{hobby.Name}}</li> 

    {{/each}} //this end tag would be found first 
    </ul> 

{{/each}} //rather than this one 

내가 (예 : 주어진 "태그"의 시작과 끝을 찾을 필요를 { {#each}} ... {{/ each}}) 그리고 파싱하기 위해 DOM과 비슷한 구조를 만듭니다. 각 태그의 내용 "DOM"은 여러 개의 태그를 포함 할 수 있습니다 (foreach 루프 x4가 내장 된 것). 이것을 달성하기위한 좋은 방법은 무엇입니까? 제 생각에는

+1

여러 가지 방법으로 구현해야합니다. 배우는 방법, 할 수 있습니다! *** 뭔가 붙어있을 때 *** 특정 *** 돌아와서 도움을 요청하십시오. – caesay

+1

정말로 "올바르게"하려면 lexing/parsing을해야합니다. 그렇게하기 위해 문자열을 각각 {{#each} 벌금으로 부과하고 {{/ each}}까지 읽습니다. 이 함수는 재귀 적이므로 중첩 된 항목을 지원합니다. 다른 태그가 많으면 모든 태그를 처리해야합니다. 그러한 파서를 작성하는 것은 큰 일입니다. 만약 당신이 시도한 것을 보여주고 싶다면, 기꺼이 도와 드리겠습니다. 그러나 이것은 매우 큰 일이며, 당신이 그것을 위해 할 사람을 찾을 수 있을지는 의심 스럽습니다. 너 여기있어. 그래서 코더 4는 무료가 아니라 도움말입니다. – dman2306

+0

'좋은'방법은 정규 표현식 문자열 교체가 아닌 상태와 중첩 요소 등을 인식하는 파서를 작성하는 것입니다. 왜 파서를 쓰고 싶지 않은가? (필자가 '풀 아웃 컴파일러'라고 가정) – Tim

답변

0

은, 구문 분석은 매우 기능적으로 사물을보고있다 : 문자를 반복, 태그로 구문 분석, 일부 문자 <을> 정규식> 다음 < 정규식 등 문자열 은밀한 내용 inbetween 태그를 ... 얻는다.

필자가 생각하기에이 기능을 수행 할 때마다 구문 분석하는 방식은 텍스트 편집기에 태그 인식, 구문 강조 등과 같은 작업을 수행하도록 요청하는 부산물입니다. 간단히 말하면, 텍스트 편집기의 "목적"은 "모델"객체가 유니 코드 문자로 가득 찬 패널이 될 것이라고 기대하는 것이 었습니다. 객체 모델에 관해서는 '지능적으로'만들 수밖에 없었습니다. .

저는 Monarch 편집자 (아마도 1. 2017과 2에서 할 수있는 최선의 방법입니다) 내부에 "많이 내게 상처를 입힌다"HTML 태그를 사용하여 놀고 난 후 내 자신의 버전을 디자인했습니다. 어리 석음 복잡한).

내가 접근하는 방식은 텍스트 편집기가 아니라 표면적으로 텍스트 편집 표면 인 MVC 관점의보기이지만 실제로는 사용자 동작에 반응하는 템플릿 기반의 정렬 된 모델입니다. .

+0

버전에서 블록 (중간에 내용이있는 태그 시작 및 끝)을 찾는 방법은 무엇입니까? –

+0

태그 나 내용을 찾지 못했습니다.'var nodes = context.Where (n => n.ElementText = "h1")와 같은 모델 객체를 얻습니다. ToList ();' – NWoodsman