⚠WARNING
ASP.NET에 대한 포스팅이 아닙니다
나가실 문은 오른쪽 하단입니다
나가실 문은 오른쪽 하단입니다
이전 글에서 만든 노드가
이번에는 목적 코드(C#)로 변환하는 과정이다.
코드로 들어갈 자리가 딱딱 구분이 되었기 때문에 재귀적으로 간단하게 구현할 수 있는 부분이다.
그런데 또 이것을 가시적으로 하겠다는 집착? 때문에 적잖은 시간을 소비하였다.
화면에 어떻게 뿌리는지에 대한 것은 하나의 프런트엔드의 영역이기 때문에 어떻게 했는지는 따로 언급하지 않겠다.
마음의 여유가 생기면 프론트엔드의 비중이 큰 SPA(Single Page Application)에 대한 연대기도 생각해 볼 예정이다.
...
각각의 노드들이 어떻게 변환 되는지 찬찬히 살펴보자.
<!--Hello World-->
<head>
<title>@ViewData["title"]</title>
</head>
<body>
@{
string p="Layout Page";
<p> @p </p>
<div> @RenderBody() </div>
<script>
console.log( 123 );
</script>
}
</body>
<head>
<title>@ViewData["title"]</title>
</head>
<body>
@{
string p="Layout Page";
<p> @p </p>
<div> @RenderBody() </div>
<script>
console.log( 123 );
</script>
}
</body>
Need Javascript Enabled.
변환 코드.
private String Node2String(ParseNode node)
{
StringBuilder sb = new();
foreach (var child in node.childs) sb.Append(child switch
{
ParseNode o => Node2String(o),
string o => node.NType == NTYPE.CLIENT ? o.Replace('\"', '"') : o,
_ => throw new ArgumentException("???")
});
var rt = sb.ToString();
var parentType = node.parent?.NType;
switch (node.NType)
{
case NTYPE.STRING: if(node is not CS_StrNode) rt = rt.Replace('\"', '"'); break;
case NTYPE.LAYOUT: layout = rt; return "";
case NTYPE.FUNCTION: sb_func.AddL(rt); return "";
case NTYPE.USING: sb_using.AddL(rt.Last() == ';' ? rt : rt + ";"); return "";
case NTYPE.SECTION:
rt = "\nSetSection(\"" + (node as SectionNode).Name + "\");\n" + rt;
rt += "\nOffSection(\"" + (node as SectionNode).Name + "\");\n";
if (parentType == NTYPE.CLIENT) return "\");" + rt + "W(@\"";
break;
case NTYPE.CLIENT:
if (parentType != NTYPE.CLIENT) return "W(@\"" + rt + "\");";
break;
case NTYPE.CSHARP:
if (parentType == NTYPE.CLIENT) return "\");" + rt + "W(@\"";
break;
case NTYPE.EXPRESS:
if (parentType == NTYPE.CLIENT) return "\"+" + rt + "+@\"";
return "W(" + rt + ");";
}
return rt;
}
다음 포스팅에서는 이것을 이용하여 클래스 파일을 생성하는 부분을 다룰예정.
'C# > 근웹 연대기' 카테고리의 다른 글
c#으로 근본 없는 웹서버 개발기 28 : cshtml - 빌드 및 dll (0) | 2022.02.01 |
---|---|
c#으로 근본 없는 웹서버 개발기 27 : cshtml 클래스 파일 만들기 (0) | 2022.01.30 |
c#으로 근본 없는 웹서버 개발기 25 : cshtml 파싱 - 파스노드(코드) (0) | 2022.01.24 |
c#으로 근본 없는 웹서버 개발기 24 : cshtml 파싱 - 파스노드 공통함수 (0) | 2022.01.22 |
c#으로 근본 없는 웹서버 개발기 23 : cshtml 파싱 - 파스노드 분류 (0) | 2022.01.19 |