微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

自己写的模板引擎,模板生成静态页面

    开发网站需要用到模板引擎,自己写了一个支持foreach嵌套,支持if else嵌套,支持foreach和if else混合嵌套,支持include,支持set,支持cutstr和html2text函数

html模板示例代码如下:

index.html页面

<!DOCTYPE html>
<htmlhead>
    Meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    content="width=device-width,minimum-scale=1,initial-scale=1,maximum-scale=1,user-scalable=1;" id="viewport" name="viewport" ="X-UA-Compatible"="IE=edge,chrome=1" name="keywords"="${site.keywords}" ="description"="${site.description}" link href="theme/css/Int.css" rel="stylesheet" ="theme/css/head.css"="theme/css/index.css"="theme/css/lrtk.css"="theme/css/more.css"script type="text/javascript" src="theme/js/jquery-1.11.3.js"></script="theme/js/layout.js"="theme/js/more.js"src="theme/js/jquery.superslide.2.1.1.js" type="text/javascript"title>首页-${site.siteName}</>
        
    body<!--头部开始-->
    div class="header">
        ="w">
            ="fl logo">
                a ="/">
                    img ="${site.logoUrl}"adiv="sj_language"#if ${site.id}=="1"="/en/index.html"><em ="china" style="background: url(theme/images/eng.jpg) left center no-repeat;">Englishemi style="background: url(theme/images/china.jpg) left center no-repeat;">中文i#else="/cn/index.html"="china"#end if菜单-->
            #include ="/templates/${site.folder}/rootmenu.html" />
            ="language"span span="clear"菜单-->
        ="/templates/${site.folder}/submenu.html" />
        头部结束="SimpoAll" 新的轮播图开始 >
                var scrollImg;
            ="mrBox"="next" onclick="scrollImg.next()"="imgBox"ul>
                        #foreach list="banners" model="ban" where="siteId=1" li="${ban.linkUrl}" target="_blank">
                            ="${ban.imgurl}" /></#/foreach="prve"="scrollImg.prev()"="theme/js/slider-H5.js">
                (function () {


                    $(window).resize( () {
                         ul = $('.imgBox).clone().html();
                        $().html("");
                         id  (new Date()).getTime();
                        $(ul).attr(id,id).appendTo($());

                         height body).height();
                         width ).width();
                         newwidth ).width();
                        $().css(width.imgBox ul li.imgBox ul li img/*
                            注意:$.mggScrollImg返回的scrollImg对象上有
                                    next,prev,go三个方法,可以实现外部对滚动索引的控制。
                            如:scrollImg.next();//会切换到下一张图片
                                scrollImg.go(0);//会切换到第一张图片
                        */
                        scrollImg  $.mggScrollImg(#' + id,{
                            loop: true//循环切换
                            auto: 自动切换
                            auto_wait_time: 3000轮播间隔
                            scroll_time: 300滚动时长
                            callback:  (ind) {这里传过来的是索引值
                                $(#page).text(ind + 1);
                            }
                        });

                    });
                    $(window).resize();
                })()
            >

             新的轮播图结束 -->

            关于我们开始="about_bg"="about"#set data="channel"="gywm"="title='关于我们'" />
                    ="qyjj"="title='企业简介'" h1 ="biaot"="/${site.folder}/list${qyjj.id}.html">${gywm.title}h1="subMenu"="parent.Title='关于我们'"  dldt="/${site.folder}/list${subMenu.id}.html"="${subMenu.iconUrl}" dd>${subMenu.title}关于我们结束-->


            业务单元开始="ywdy"="title='业务单元'" ="Business_bg"="#"="Business">${ywdy.title}="yw_pic"="theme/images/yw.png" />
                        业务单元结束投资者关系开始="investor_bg"="investor"="tzzgx"="title='投资者关系'" ="cwbg"="title='财务报告'" ="/${site.folder}/list${cwbg.id}.html">投资者关系="content"="con"="channel.title='投资者关系'" page="1" pageSize="1"  p>${cutstr(${con.contents},315)}...="/${site.folder}/content${con.id}.html">【详情】="parent.Title='投资者关系'"  投资者关系结束新闻综合类开始="@R_712_4045@ion">



                新闻资讯开始-->
                ="news"="xwzx"="title='新闻中心'" ="mtjj"="title='媒体聚焦'" ="/${site.folder}/list${mtjj.id}.html">${xwzx.title}="current news1"="news2"="newBox1"="channel.title='媒体聚焦'"="3"  >
                                ="${con.imgurl}" h2>${con.title}label>${con.publishTime}>

                    ="newBox2"="display: none"="channel.title='最新公告'">

                新闻资讯结束-->



                社会责任开始="responsibility"="shzr"="title='社会责任'" ="/${site.folder}/list${shzr.id}.html">${shzr.title}="zeren"="border"="zr_list"="channel.title='社会责任'"="5"  ${con.curPageSort}==1>
                                    button ="btn_on btn"="button"button="btn">

                                    ="neir">
                                        >

                        社会责任结束新闻综合类结束总裁寄语开始="President_bg"="President"="zcjy"="title='总裁寄语'" >${zcjy.title}="Message_Box"="Message"="channel.title='总裁寄语'">
                             ="j${con.curPageSort}">
                                 ="j${con.curPageSort}"="display: none;">
                           
                                ${con.contents}
                             ="qh"="y1 qh_on"="y2"="y3"总裁寄语结束合作伙伴开始="Partner_bg"="Partner"h3>合作伙伴="links"="lk"="type=2 and siteId=1" ="${lk.linkUrl}">${lk.title}合作伙伴结束-->

                底部开始="cai_bg"="Web_Icon"底部结束="copyright_bottom"
                    ${site.copyright}br />
                    备案号:${site.siteRecord}
                
                    ${site.statScript}
                >
View Code

rootmenu.html页面

="pad-nav"="rootMenu"="channel.siteId=${site.id} and channel.level=1"  ${rootMenu.sort}${channel.id}==0="index.html" class="cpselect"="showPhonesubMenu('${rootMenu.title}')">${rootMenu.title}${rootMenu.listType}=="5"${rootMenu.id}=="${parentChannel.id}"="#"="/${site.folder}/list${rootMenu.id}.html"="two_nav" phone-menu-title="${rootMenu.title}"="parent.Title='${rootMenu.title}'"  ="fl nav"="cur"="smen"> 
            ="cur"="showSubMenu('${rootMenu.title}')"="smen"${parentChannel.id}=="${channel.id}">
View Code

list.html页面

="theme/js/jquery-1.9.1.js"<script src="js/jquery.superslide.2.1.1.js" type="text/javascript"></script> PC端轮播图JS >${channel.title}-${parentChannel.title}-${site.siteName}
        $(document).ready( () {
             topMain ".nav_part).height()对象的的高度
             nav );
            $(window).scroll( () {
                if ($(window).scrollTop()  topMain) {如果滚动条顶部的距离大于topMain则就nav导航就添加类.nav_scroll,否则就移除。
                    nav.addClass(nav_scroll);
                }
                else {
                    nav.removeClass();
                }
            });

        })
    ="index.html"="theme/images/logo.png"/>

        广告图开始="gg_pic"="theme/images/ejbg.jpg" 广告图结束内容区域开始="Main_part"左侧导航开始="/templates/${site.folder}/leftmenu.html" 左侧导航结束右侧内容开始="nr_part"="position"="fl">${channel.title}="fr">当前位置:${parentChannel.id}!=0>${parentChannel.title}>="Media_Focus"="jujiao"delalt=""="${channel.iconUrl}" 
                        ${channel.title}main="true" list channel="${channel.id}"="${pager.page}"="10"  >[${channel.title}]="pag"${pager.prePage}="list${channel.id}.html"="">上一页="list${channel.id}-${pager.prePage}.html"="margin-right: 40px; font-size: 12px; color: #666;">${pager.page} / ${pager.pageCount}${pager.nextPage}="list${channel.id}.html">下一页="list${channel.id}-${pager.nextPage}.html"右侧内容结束-->

        内容结束-->


        合作伙伴结束--

<!--底部开始<iframe src="footer.html" width="100%" height="365" frameborder="0" scrolling="no"></iframe>
            ${site.copyright}
            备案号:${site.siteRecord}
        
            ${site.statScript}
        >
View Code

 

模板引擎代码如下:

Tag类:

using System;
 System.Collections.Generic;
 System.Linq;
 System.Text;

namespace DAL.Parser
{
    /// <summary>
    /// 标签
    </summary>
    public  Tag
    {
        <summary>
         标签开始位置
        </summary>
        int start { get; set; }
         标签标记
        public Token token {  标签字符串
        string tagStr {  标签字符串长度
        int length
        {
            get
            {
                return tagStr.Length;
            }
        }
         标签结束位置
         end
        {
            return start + length;
            }
        }

         标签
        </summary>
        <param name="start">标签开始位置</param>
        <param name="token">标签标记<param name="tagStr">标签字符串</param>
        public Tag(int start,Token token,string tagStr)
        {
            this.start = start;
            this.token = token;
            this.tagStr = tagStr;
        }
    }
}
View Code

Token类:

 标签标记
    enum Token
    {
         标签开始
        </summary>
        TagStart, 标签结束
                TagEnd,1)"> else标签
                ElseTag
    }
}
View Code

IfTag类:

 System.Text;
 System.Text.RegularExpressions;

 if标签
     IfTag
    {
         开始标签
        public Tag startIf {  else标签,可为null
        public Tag elseTag {  结束标签
        public Tag endIf { ; }

         页面html
        string pageHtml {  if分支html
         ifHtml
        {
            if (elseTag != null)
                {
                    return pageHtml.Substring(startIf.start + startIf.length,elseTag.start - startIf.start - startIf.length);
                }
                else
                {
                     startIf.length);
                }
            }
        }
         else分支html
         elseHtml
        {
            null && elseTag.start + elseTag.length < endIf.start)
                {
                    return pageHtml.Substring(elseTag.start + elseTag.length,endIf.start - elseTag.start - elseTag.length);
                }
                return .Empty;
                }
            }
        }

         结果html
        string resultHtml {  if标签
        <param name="startIf">开始标签<param name="elseTag">else标签<param name="endIf">结束标签<param name="pageHtml">页面htmlpublic IfTag(Tag startIf,Tag elseTag,Tag endIf,1)"> pageHtml)
        {
            this.startIf = startIf;
            this.endIf = endIf;
            this.elseTag = elseTag;
            this.pageHtml = pageHtml;
            this.resultHtml = .Empty;

            if (!Regex.IsMatch(startIf.tagStr,@"\${([^\${}]+)\.([^\${}]+)}")) //如果没有未解析的Model
            {
                bool compareOr = false;
                foreach (string strOr in startIf.tagStr.Replace("<#if",1)">"").Replace(>"").Split(new string[] {  or " },StringSplitOptions.RemoveEmptyEntries)) 遍历or分隔
                {
                    bool compareAnd = true;
                    string strAnd in strOr.Split( and 遍历and分隔
                    {
                        Regex reg = new Regex(([^\s]*)[\s]*(==|!=|大于|小于)[\s]*([^\s]*)"noreCase);
                        MatchCollection mc = reg.Matches(strAnd);
                        foreach (Match match in mc)
                        {
                            #region 比较
                            switch (match.Groups[2].Value)
                            {
                                case ==:
                                    if (match.Groups[1].Value.Replace(\""") != match.Groups[3].Value.Replace(""))
                                    {
                                        compareAnd = ;
                                    }
                                    break;
                                !="") == match.Groups[大于 d;
                                    if (int.TryParse(match.Groups[1].Value,1)">out d) && 3].Value,1)">out d))
                                    {
                                        if (Convert.ToInt32(match.Groups["")) <= Convert.ToInt32(match.Groups[)))
                                        {
                                            compareAnd = ;
                                        }
                                    }
                                    小于"")) >= Convert.ToInt32(match.Groups[default;
                            }
                            #endregion
                        }
                    }  end 遍历and分隔
                     (compareAnd)
                    {
                        compareOr = ;
                    }
                } 遍历or分隔
                 (compareOr)
                {
                    resultHtml = ifHtml;
                    ;
                }
                resultHtml = elseHtml;
            }

        } end 构造函数

    } end IfTag 类

} end namespace
View Code

ForeachTag类:

 System.Text.RegularExpressions;
 Models;

 Foreach标签
     ForeachTag
    {
        public Tag startForeach { public Tag endForeach {  标签内html
         innerHtml
        {
            return pageHtml.Substring(startForeach.start + startForeach.length,endForeach.start - startForeach.start - startForeach.length);
            }
        }
         列表的标识
        string list {  列表的model
        string model {  where
        string where {  当面页数
        int page {  每页数据条数
        int pageSize {  该foreach是否是当前页面的主列表
        bool main = ;
         栏目名称或栏目ID
        string channel {  Foreach标签
        <param name="startForeach"><param name="endForeach">public ForeachTag(Tag startForeach,Tag endForeach,1)">this.startForeach = startForeach;
            this.endForeach = endForeach;
             pageHtml;

            Regex reg = ([^\s]+)\s*=\s*""([^""]+)""noreCase);
            MatchCollection mc = reg.Matches(startForeach.tagStr);
            foreach (Match m  mc)
            {
                switch (m.Groups[1].Value)
                {
                    list:
                        this.list = m.Groups[].Value;
                        modelthis.model = m.Groups[wherethis.where = m.Groups[pageif (Regex.IsMatch(m.Groups[2].Value,1)">^\d+$))
                        {
                            this.page = Convert.ToInt32(m.Groups[].Value);
                        }
                        pageSizethis.pageSize = Convert.ToInt32(m.Groups[channelthis.channel = m.Groups[mainthis.main = ;
                        ;
                }
            }
        }  end 构造函数
 end ForeachTag 类
}  end namespace
View Code

PageNum类:

 分页数字类
     PageNum
    {
         分页数字
        int num {  是否非数字,1:非数字,0数字,用来显示省略号
        int nan { <param name="num">分页数字<param name="nan">是否非数字,1:非数字,0数字,用来显示省略号public PageNum(int num,1)">int nan = 0)
        {
            this.num = num;
            this.nan = nan;
        }
    }
}
View Code

 

模板引擎TemplateDal类:

 System.IO;
 System.Reflection;
 System.Web;
 DAL.Parser;
 DAL
{
     模板引擎
     TemplateDal
    {
        #region 变量
         分页数字列表
        static List<PageNum> pageNumList = ;
        #endregion

        #region 载入模板
         载入模板
        static string LoadTemplate(HttpServerUtilityBase server,1)"> url)
        {
            string result = .Empty;
            StreamReader sr = new StreamReader(server.MapPath(url),Encoding.UTF8);
            result = sr.ReadToEnd();
            sr.Close();
             result;
        }
        #region 写入模板
         写入模板
        void WriteTemplate(HttpServerUtilityBase server,1)">string url,1)"> html)
        {
            .Empty;
            string path = server.MapPath(url);
            if (!Directory.Exists(Path.GetDirectoryName(path)))
            {
                Directory.CreateDirectory(Path.GetDirectoryName(path));
            }
            FileStream fs =  FileStream(path,FileMode.Create,FileAccess.Write);
            StreamWriter sw =  StreamWriter(fs,Encoding.UTF8);
            sw.Write(html);
            sw.Close();
            fs.Close();
        }
        #region 替换页面model
         替换页面model
        string ReplaceModels(string pageHtml,Dictionary<string,1)">object> data)
        {
            Regex reg =  reg.Matches(pageHtml);
            if (data.Keys.Contains<string>(m.Groups[].Value))
                {
                    object model = data[m.Groups[].Value];
                    Type type = model.GetType();
                    PropertyInfo propertyInfo = type.GetProperty(m.Groups[].Value);
                    object obj = propertyInfo.GetValue(model,1)">);
                    string val = .Empty;
                    if (obj != )
                    {
                        if (obj.GetType() == typeof(DateTime))
                        {
                            val = ((DateTime)obj).ToString(yyyy-MM-dd);
                        }
                        
                        {
                            val = obj.ToString();
                        }
                    }
                    pageHtml = pageHtml.Replace(${" + m.Groups[1].Value + .2].Value + } pageHtml;
        }
        #region 替换列表的model
         替换列表的model
        string html,1)">string model,1)">object\${[^\${}]+\.([^\${}]+)} reg.Matches(html);
             mc)
            {
                Type type = data.GetType();
                PropertyInfo propertyInfo = type.GetProperty(m.Groups[].Value);
                object obj = propertyInfo.GetValue(data,1)">);
                .Empty;
                (DateTime))
                    {
                        val = ((DateTime)obj).ToString();
                    }
                    
                    {
                        val = obj.ToString();
                    }
                }
                html = html.Replace(" + model +  html;
        }
        #region 判断页面是否存在 foreach 标签
         判断页面是否存在 foreach 标签
        bool HasForeach( html)
        {
            Regex reg = <!--[\s]{0,1}#[\s]{0,1}foreach[\s]+[^<>\${}]*-->noreCase | RegexOptions.Singleline);
             reg.IsMatch(html);
        }
        #region 替换foreach
         替换foreach
        string ReplaceLists( data)
        {
            #region 生成标签集合
            Regex regStartForeach =  RegexOptions.Singleline);
            Regex regEndForeach =  RegexOptions.Singleline);
            MatchCollection mcStartForeach = regStartForeach.Matches(pageHtml);
            MatchCollection mcEndForeach = regEndForeach.Matches(pageHtml);
            List<Tag> tagList = new List<Tag>();
            foreach (Match mStartForeach  mcStartForeach)
            {
                Tag tag =  Tag(mStartForeach.Index,Token.TagStart,mStartForeach.Value);
                tagList.Add(tag);
            }
            foreach (Match mEndForeach  mcEndForeach)
            {
                Tag tag =  Tag(mEndForeach.Index,Token.TagEnd,mEndForeach.Value);
                tagList.Add(tag);
            }
            tagList.sort((a,b) => a.start - b.start);
            #endregion

            for (int i = 0; i < tagList.Count; i++) 遍历标签集合
            {
                Tag tag = tagList[i];
                int depth = if (tag.token == Token.TagStart)
                {
                    int j = i + 1; j < tagList.Count; j++if (tagList[j].token == Token.TagEnd && depth == )
                        {
                            string resultHtml = .Empty;
                            ForeachTag foreachTag =  ForeachTag(tag,tagList[j],pageHtml);

                            #region 替换
                            switch (foreachTag.list)
                            {
                                :
                                    StringBuilder sb =  StringBuilder();
                                    ChannelDal m_ChannelDal =  ChannelDal();
                                    List<cms_channel_ext> channelList = m_ChannelDal.GetList(foreachTag.where);
                                    foreach (cms_channel_ext channel  channelList)
                                    {
                                        sb.Append(TemplateDal.ReplaceModels(foreachTag.innerHtml,foreachTag.model,channel));
                                    }
                                    resultHtml = foreachTag.pageHtml.Substring(0,foreachTag.startForeach.start) + sb.ToString() + foreachTag.pageHtml.Substring(foreachTag.endForeach.start + foreachTag.endForeach.length);
                                    content:
                                    sb =  StringBuilder();
                                    ContentDal m_ContentDal =  ContentDal();
                                    PagerModel pager =  PagerModel();
                                    pager.rows = foreachTag.pageSize;
                                    pager.page = foreachTag.page;
                                    List<cms_content_ext> contentList = m_ContentDal.GetList(ref pager,foreachTag.channel,foreachTag.foreach (cms_content_ext content  contentList)
                                    {
                                        sb.Append(TemplateDal.ReplaceModels(foreachTag.innerHtml,content));
                                    }
                                    resultHtml = foreachTag.pageHtml.Substring(links StringBuilder();
                                    LinksDal m_LinksDal =  LinksDal();
                                    List<cms_links_ext> linksList = m_LinksDal.GetList(foreachTag.foreach (cms_links_ext links  linksList)
                                    {
                                        sb.Append(TemplateDal.ReplaceModels(foreachTag.innerHtml,links));
                                    }
                                    resultHtml = foreachTag.pageHtml.Substring(banners StringBuilder();
                                    BannersDal m_BannersDal =  BannersDal();
                                    List<cms_banners_ext> bannersList = m_BannersDal.GetList(foreachTag.foreach (cms_banners_ext banners  bannersList)
                                    {
                                        sb.Append(TemplateDal.ReplaceModels(foreachTag.innerHtml,banners));
                                    }
                                    resultHtml = foreachTag.pageHtml.Substring(pages (data.ContainsKey(foreachTag.list))
                                    {
                                        sb =  StringBuilder();
                                        List<PageNum> pageNumList = data[foreachTag.list] as List<PageNum>;
                                        foreach (PageNum pageNum  pageNumList)
                                        {
                                            sb.Append(TemplateDal.ReplaceModels(foreachTag.innerHtml,pageNum));
                                        }
                                        resultHtml = foreachTag.pageHtml.Substring( foreachTag.endForeach.length);
                                    }
                                    :
                                    resultHtml = foreachTag.pageHtml.Substring(#endregion

                             resultHtml;
                        }
                        if (tagList[j].token == Token.TagStart)
                        {
                            depth++;
                        }
                         Token.TagEnd)
                        {
                            depth--;
                        }
                    }
                }
            }
            #region 判断页面是否存在 if else 标签
         判断页面是否存在 if else 标签
        bool HasIfElse(noreCase);
            #region 替换 if else end if
         替换 if else end if
        string ReplaceIfElse(
            Regex regStartIf =  RegexOptions.Singleline);
            Regex regElseTag =  RegexOptions.Singleline);
            Regex regEndIf =  RegexOptions.Singleline);
            MatchCollection mcStartIf = regStartIf.Matches(pageHtml);
            MatchCollection mcElseTag = regElseTag.Matches(pageHtml);
            MatchCollection mcEndIf = regEndIf.Matches(pageHtml);
            List<Tag> tagList = foreach (Match mStartIf  mcStartIf)
            {
                Tag tag =  Tag(mStartIf.Index,mStartIf.Value);
                tagList.Add(tag);
            }
            foreach (Match mEndIf  mcEndIf)
            {
                Tag tag =  Tag(mEndIf.Index,mEndIf.Value);
                tagList.Add(tag);
            }
            foreach (Match mElseTag  mcElseTag)
            {
                Tag tag =  Tag(mElseTag.Index,Token.ElseTag,mElseTag.Value);
                tagList.Add(tag);
            }
            tagList.sort((a,1)">            {
                Tag tagStartIf = tagList[i];
                Tag tagElseTag = if (tagStartIf.token == Token.TagStart) 是if标签
1; j < tagList.Count; j++) 遍历if标签后面的标签
                    {
                        if (depth == if (tagList[j].token == Token.ElseTag) 是else标签
                            {
                                tagElseTag = tagList[j];
                            }
                             Token.TagEnd)
                            {
                                IfTag ifTag =  IfTag(tagStartIf,tagElseTag,pageHtml);
                                if (!Regex.IsMatch(ifTag.startIf.tagStr,1)">                                {
                                    return pageHtml.Substring( ifTag.endIf.length);
                                }
                            }
                        }
                        ;
                        }
                    }
                }
            }

            #region 替换页面function
         替换页面function
        string ReplaceFunctions(#region 替换cutstr函数
            Regex reg = \${cutstr\((.*),([\d]+)\)}noreCase);

            MatchCollection mc = mc)
            {
                Regex reg2 = (?:<[^<>]+[\s]+[^<>]+[\s]*/>)|(?:<[^<>]+[\s]+[^<>]+[\s]*>)|(?:</[^<>]+>)|(?:&nbsp;)noreCase);
                string html = reg2.Replace(m.Groups[if (html.Length > Convert.ToInt32(m.Groups[].Value))
                {
                    pageHtml = pageHtml.Replace(m.Value,html.Substring(].Value)));
                }
                
                {
                    pageHtml = pageHtml.Replace(m.Value,html);
                }
            }
            #region 替换html2text函数
            reg = \${html2text\((.+),RegexOptions.IgnoreCase);

            mc =);
                pageHtml =#region 替换replace函数\${replace\(([^\(\),]+),([^\(\),]+)\)} mc)
            {
                pageHtml = pageHtml.Replace(m.Value,m.Groups[1].Value.Replace(m.Groups[2].Value.Replace('""),1)">)));
            }
            #region 替换页面include
         替换页面include
        string ReplaceIncludes(HttpServerUtilityBase server,1)"> pageHtml)
        {
            Regex reg =  mc)
            {
                StreamReader sr = new StreamReader(server.MapPath(m.Groups[].Value),Encoding.UTF8);
                string html = sr.ReadToEnd();
                sr.Close();
                pageHtml =#region 替换页面set
         替换页面set
        string ReplaceSets( mc)
            {
                Regex regSub = noreCase);
                MatchCollection mcSub = regSub.Matches(m.Groups[string data = string model = where = foreach (Match mSub  mcSub)
                {
                    switch (mSub.Groups[].Value)
                    {
                        data:
                            data = mSub.Groups[].Value;
                            :
                            model = mSub.Groups[:
                            where = mSub.Groups[;
                    }
                }

                 (data)
                {
                    :
                        ChannelDal m_ChannelDal =  ChannelDal();
                        cms_channel channel = m_ChannelDal.Get();
                        Dictionary<object> dic = new Dictionary<();
                        dic.Add(model,channel);
                        pageHtml = pageHtml.Replace(m.Value,1)">);
                        pageHtml = TemplateDal.ReplaceModels(pageHtml,dic);
                        ;
                }
            }
            #region 获取head内容
         获取head内容
        string GetHeadHtml(<head>([\S\s]*)</head>noreCase);
            Match m = reg.Match(pageHtml);
            return m.Groups[].Value;
        }
        #region 获取body内容
         获取body内容
        string GetBodyHtml(<body>([\S\s]*)</body>#region 获取一个ForeachTag
         获取一个ForeachTag
        static ForeachTag GetForeachTag(string list = )
                        {
                            ForeachTag foreachTag = if (foreachTag.main && foreachTag.list == list)
                            {
                                 foreachTag;
                            }
                        }
                        ;
                        }
                    }
                }
            } end 遍历标签集合 

            ;
        }
        

    } end of class TemplateDal
end of namespace DAL
View Code

 

使用模板引擎生成静态页面

 System.Threading;
 System.Web.Mvc;
 System.Web.Script.Serialization;
 Common;
 Common.Utils;
 DAL;
 DBHelper;
 NetCMS.Web.Areas.Admin.Controllers
{
     前台更新
     FrontPageManageController : Common.ControllerBase
    {
        #region 变量
        private SiteDal m_SiteDal =  SiteDal();
        private ChannelDal m_ChannelDal =  ChannelDal();
        private ContentDal m_ContentDal =  ContentDal();
         进度总数
        private double total =  当前进度
        int cur =  错误信息
        string errMsg = .Empty;
        #region 替换
         替换
        string Replace(string templateHtml,1)"> dic)
        {
            templateHtml = TemplateDal.ReplaceSets(templateHtml);
            templateHtml = TemplateDal.ReplaceModels(templateHtml,dic);
            templateHtml = TemplateDal.ReplaceIncludes(Server,templateHtml);
            templateHtml =while (TemplateDal.HasIfElse(templateHtml))
            {
                templateHtml = TemplateDal.ReplaceIfElse(templateHtml);
            }
             (TemplateDal.HasForeach(templateHtml))
            {
                templateHtml = TemplateDal.ReplaceLists(templateHtml,dic);
            }
             TemplateDal.ReplaceIfElse(templateHtml);
            }
            templateHtml = TemplateDal.ReplaceFunctions(templateHtml);
            string headHtml = TemplateDal.GetHeadHtml(templateHtml);
            string bodyHtml = TemplateDal.GetBodyHtml(templateHtml);

            StringBuilder sb =  StringBuilder();
            sb.AppendFormat(<!DOCTYPE html>\r\n<html>\r\n<head>\r\n{0}\r\n</head>\r\n<body>\r\n{1}\r\n</body>\r\n</html>\r\n sb.ToString();
        }
        #region Index页面
        [Permission(Code = Index)]
        public ActionResult Index()
        {
             View();
        }
        #region Update更新
        [HttpPost]
        [Permission(Code =  ActionResult Update()
        {
            trynew Thread(new ThreadStart(delegate()
                {
                    
                    {
                        UpdateTheme();
                        UpdateIndex();
                        UpdateError();
                        UpdateComments();
                    }
                    catch (Exception ex)
                    {
                        errMsg += ex.Message + <br />" + ex.StackTrace.Replace(\n);
                    }
                })).Start();
                
                    {
                        UpdateList();
                    }
                    
                    {
                        UpdateContent();
                    }
                    );
                    }
                })).Start();

                return Content(OK);
            }
             (Exception ex)
            {
                 Content(ex.Message);
            }
        }
        #region 更新theme
         更新theme
        void UpdateTheme()
        {
            List<cms_site_ext> siteList = m_SiteDal.GetListAll();
            foreach (cms_site_ext site in siteList) 遍历站点
string fromPath = Server.MapPath(string.Format(/templates/{0}/theme/string toPath = Server.MapPath(/{0}/theme/copyThemeFiles(fromPath,toPath);
            }
            cur++;
        }
         更新theme中的文件
        void copyThemeFiles(string fromPath,1)"> toPath)
        {
            Directory.Exists(toPath))
            {
                Directory.CreateDirectory(toPath);
            }
            string filePath  Directory.GetFiles(fromPath))
            {
                System.IO.File.copy(filePath,toPath + Path.GetFileName(filePath),1)">string dirPath  Directory.GetDirectories(fromPath))
            {
                int pos = dirPath.LastIndexOf(\\);
                copyThemeFiles(dirPath,toPath + dirPath.Substring(pos + 1) + );
            }
        }
        #region 更新index页面
         更新index页面
         UpdateIndex()
        {
            List<cms_site_ext> siteList =;
            string templateHtml = TemplateDal.LoadTemplate(Server,1)">/templates/{0}/index.html();
                dic.Add(siteparentParentChannel cms_channel());
                dic.Add(parentChannel cms_channel());
                TemplateDal.WriteTemplate(Server,/{0}/index.htmlif (i++ == /theme//index.html#region 更新list页面
         更新list页面
         UpdateList()
        {
            List<cms_site_ext> siteList =            {
                List<cms_channel_ext> channelList = m_ChannelDal.GetList(channel.siteId={0}in channelList) 遍历栏目
string.IsNullOrWhiteSpace(errMsg)) break; 错误则跳出

                    #region 获取父栏目
                    cms_channel parentParentChannel;
                    cms_channel parentChannel;
                    if (channel.parentId == -)
                    {
                        parentChannel =  cms_channel();
                        parentChannel.parentId = -;
                    }
                    
                    {
                        parentChannel = m_ChannelDal.Get(channel.parentId);
                    }
                    if (parentChannel.parentId == -)
                    {
                        parentParentChannel =  cms_channel();
                        parentParentChannel.parentId = -
                    {
                        parentParentChannel = m_ChannelDal.Get(parentChannel.parentId);
                    }
                    #endregion

                    if (channel.listType == ()Enums.ChannelListType.文字列表
                        || channel.listType == ()Enums.ChannelListType.图片列表
                        || channel.listType == ()Enums.ChannelListType.父级栏目)
                    {
                        #region 取模板
                        string templateFileName = string.IsNullOrWhiteSpace(channel.template) ? list.html : channel.template;
                        /templates/{0}/list/{1}#endregion

                        #region 设置分页参数
                        ForeachTag foreachTag = TemplateDal.GetForeachTag(templateHtml);
                        PagerModel pager =  PagerModel();
                        if (foreachTag != )
                        {
                            pager.rows = foreachTag.pageSize;
                        }
                        
                        {
                            pager.rows = 20;
                        }
                        pager.page = do
                        {
                            List<cms_content_ext> contentList = m_ContentDal.GetList();

                            Dictionary<();
                            dic.Add(pagerPagelist(pager.page,pager.pageCount));

                             filePath;
                            if (pager.page == )
                            {
                                filePath = /{0}/list{1}.html/{0}/list{1}{2}.html-" + pager.page.ToString());
                            TemplateDal.WriteTemplate(Server,dic));
                        } while (pager.page++ <= pager.pageCount); 遍历每页数据
                    }
                    )Enums.ChannelListType.单篇文章)
                    {
                        cms_content content = m_ContentDal.GetByChannelId(channel.id);
                        if (content == )
                        {
                            StringBuilder sb =  StringBuilder();
                            sb.Append(<!DOCTYPE html>\r\n<html>\r\n<head>\r\n);
                            sb.AppendFormat(<script type=\"text/javascript\">window.location = \"error.html\";</script></head>\r\n<body>\r\n</body>\r\n</html>\r\n);
                            string filePath = 
                        {
                            StringBuilder sb = <script type=\"text/javascript\">window.location = \"/{0}/content{1}.html\";</script>)Enums.ChannelListType.页面链接)
                    {
                        string url = .Empty;
                        if (channel.pageUrl == comments.html)
                        {
                            url = /{0}/{1}
                        {
                            url = channel.pageUrl;
                        }
                        StringBuilder sb =  StringBuilder();
                        sb.Append();
                        sb.AppendFormat(<script type=\"text/javascript\">window.location = \"{0}\";</script>);
                        ;
                }  end 遍历 channelList
            } end 遍历 siteList
        }
        #region 更新单个list页面
         更新单个list页面
        public ActionResult UpdateListSingle( id)
        {
            
            {
                cms_channel channel = m_ChannelDal.Get(id);
                cms_site site = m_SiteDal.Get(channel.siteId);

                
                cms_channel parentParentChannel;
                cms_channel parentChannel;
                )
                {
                    parentChannel =  cms_channel();
                    parentChannel.parentId = -;
                }
                
                {
                    parentChannel = m_ChannelDal.Get(channel.parentId);
                }
                )
                {
                    parentParentChannel =  cms_channel();
                    parentParentChannel.parentId = -
                {
                    parentParentChannel = m_ChannelDal.Get(parentChannel.parentId);
                }
                #endregion

                )Enums.ChannelListType.文字列表
                    || channel.listType == ()Enums.ChannelListType.图片列表
                    || channel.listType == ()Enums.ChannelListType.父级栏目)
                {
                    #region 取模板
                     : channel.template;
                    
                    ForeachTag foreachTag = TemplateDal.GetForeachTag(templateHtml);
                    PagerModel pager =  PagerModel();
                    )
                    {
                        pager.rows = foreachTag.pageSize;
                    }
                    
                    {
                        pager.rows = ;
                    }
                    pager.page = 
                    {
                        List<cms_content_ext> contentList = m_ContentDal.GetList();

                        Dictionary<();
                        dic.Add( filePath;
                        )
                        {
                            filePath =  pager.page.ToString());
                        TemplateDal.WriteTemplate(Server,dic));
                    }                 }
                )Enums.ChannelListType.单篇文章)
                {
                    cms_content content = m_ContentDal.GetByChannelId(channel.id);
                    )
                    {
                        StringBuilder sb = 
                    {
                        StringBuilder sb = )Enums.ChannelListType.页面链接)
                {
                    )
                    {
                        url = 
                    {
                        url = channel.pageUrl;
                    }
                    StringBuilder sb =  StringBuilder();
                    sb.Append();
                    sb.AppendFormat(var json = 
                {
                    ok =  Json(json);
            }
            
                {
                    ok = ex.Message
                };
                 Json(json);
            }
        }
        #region 更新content页面
         更新content页面
         UpdateContent()
        {
            List<cms_content_ext> contentListAll = m_ContentDal.GetListAll();
            in contentListAll) 遍历内容详情
错误则跳出

                #region 获取下一篇上一篇、栏目、站点、父栏目等
                cms_content_ext nextContent = m_ContentDal.GetNext(content.id);
                if (nextContent == )
                {
                    nextContent =  cms_content_ext();
                    nextContent.isNull = ;
                }
                cms_content_ext preContent = m_ContentDal.GetPre(content.id);
                if (preContent == )
                {
                    preContent =  cms_content_ext();
                    preContent.isNull = ;
                }
                cms_channel channel = m_ChannelDal.Get(content.channelId);
                cms_site site = m_SiteDal.Get(channel.siteId);
                cms_channel parentParentChannel;
                cms_channel parentChannel;
                if (content.isPageUrl == /{0}/content{1}.html);
                    TemplateDal.WriteTemplate(Server,sb.ToString());
                }
                string.IsNullOrWhiteSpace(content.template) ? content.html : content.template;
                    /templates/{0}/content/{1}

                    Dictionary<();
                    dic.Add(preContentnextContent++;
            }
        }
        #region 更新单个content页面
         更新单个content页面
        public ActionResult UpdateContentSingle(
            {
                cms_content content = m_ContentDal.Get(id);

                #region 更新error页面
         更新error页面
         UpdateError()
        {
            List<cms_site_ext> siteList =/templates/{0}/error.htmlnew cms_channel() { id = -999 });
                TemplateDal.WriteTemplate(Server,1)">/{0}/error.html#region 更新comments页面
         更新comments页面
         UpdateComments()
        {
            List<cms_site_ext> siteList =);

                if (channel != )
                {
                    cms_channel parentParentChannel;
                    cms_channel parentChannel;
                     m_ChannelDal.Get(parentChannel.parentId);
                    }
                    cms_content_ext content = ModelHelper.Convert<cms_content_ext>(m_ContentDal.GetByChannelId(channel.id));
                    )
                    {
                        content =  cms_content_ext();
                        content.isNull = /templates/{0}/comments.html/{0}/comments.html#region GetProcess获取更新进度 ActionResult GetProcess()
        {
            .IsNullOrWhiteSpace(errMsg))
                {
                    if (total == )
                    {
                        total = GetTotal();
                        0%
                    {
                        int percent = (int)(cur / total * 100if (percent == )
                        {
                            cur = ;
                            total = return Content({0}%错误 errMsg);
                }
            }
            #region GetTotal获取进度总数
         获取进度总数
        <returns></returns>
         GetTotal()
        {
            int channelCount = m_ChannelDal.GetList().Count;
            int contentCount = m_ContentDal.GetAllCount();
            return channelCount + contentCount + 4#region GetPagelist生成分页数字列表
         生成分页数字列表
        private List<PageNum> GetPagelist(int currentPage,1)"> pageCount)
        {
            List<PageNum> result = new List<PageNum>();
            result.Add(new PageNum());
            if (currentPage > )
            {
                result.Add());
            }
            int i = currentPage - 2; i <= currentPage + 2; i++)
            {
                if (i > 1 && i < pageCount)
                {
                    result.Add( PageNum(i));
                }
            }
            if (pageCount - currentPage > 3));
            }
            result.Add( PageNum(pageCount));
            

    }
}
View Code

 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐