본문 바로가기

C#/근웹 연대기

c#으로 근본 없는 웹서버 개발기 26 : cshtml 파싱 - 코드 조립

⚠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>
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;
}

 

다음 포스팅에서는 이것을 이용하여 클래스 파일을 생성하는 부분을 다룰예정.