文档章节

zhcms内置的模板引擎(三)

zhcms
 zhcms
发布于 2014/04/08 00:46
字数 822
阅读 54
收藏 1

进行html代码分析后,我们就要开始处理代码了,为了满足我规定的功能的第一项:必须能够自己定义开始和结束标识符,所以我设置了两个变量:   

private String gytFrontSeparator = "{";
private String gytBackSeparator = "}";

初始值分别是{和},作为默认的开始和结束标识符,然后定义了两个方法去处理这个默认的变量:

public void setFrontSeparator(String gytemp) {
        this.gytFrontSeparator = gytemp;
    }
public void setBackSeparator(String gytemp) {
        this.gytBackSeparator = gytemp;
    }

然后在遇到变量的时候就使用这个变量就可以了。

然后我们开始处理RepInclude();

首先我先开始定义一个变量,作为所有只是简单替换的公用变量:

public HashMap<String, String> gytInVar;
@SuppressWarnings("rawtypes")
public HashMap setInVtrParameter(String ParameterName, String ParameterVale) {
    this.gytInVar.put(ParameterName, ParameterVale);
    return this.gytInVar;
}

然后使用这个公用变量进行处理包含,具体的方法是:

    private void RepInclude() throws IOException {
        String tempS = gydContent.getContent();
        String[] gytParameterArray = null;
        GySplit a = new GySplit();
        a.tool(tempS, this.gytFrontSeparator + "include=");
        String[] tempContent = a.Show();
        a = null;
        int temp_count = tempContent.length;
        if (temp_count == 0) {

        } else {
            gytParameterArray = new String[temp_count - 1];
            for (int i = 1; i < temp_count; i++) {
                GySplit b = new GySplit();
                b.tool(tempContent[i], this.gytBackSeparator);
                String[] temp_end_array = b.Show();
                b = null;
                gytParameterArray[i - 1] = temp_end_array[0];
            }
            
            for (int i = 0; i < gytParameterArray.length; i++) {
                String tempC = "";
                try {
                    if (gytiCharset == null && gytiCharset.length() < 1) {
                        tempC = readFile(gytParameterArray[i]);
                    } else {
                        tempC = readFile(gytParameterArray[i], gytiCharset);
                    }
    
                } catch (IOException e) {
                    e.printStackTrace();
                }
                // 使用自定义函数进行字符串替换
                GyReplace r = new GyReplace();
                tempS = r.replace(tempS, this.gytFrontSeparator + "include="
                        + gytParameterArray[i] + this.gytBackSeparator, tempC);
                r = null;
            }
        }
        gydContent.setContent(tempS);
    }

核心的思想很简单,就是先取出"开始变量+include=+内容+结束变量",根据内容得到要包含的html模板内容,然后把最后的html进行组装形成新的模板字符串。(应该说这是整个模板引擎的核心思想。)

处理完包含就开始处理if(判断)了,思想还是刚才说的思想,获取if中的内容,抛弃为假的进行重新封装。具体代码如下:

private void RepIf() {
        String tempS=gydContent.getContent();
        String[] gytParameterArray = null;
        String[] gyitParameterArray = null;// 当前的if标签
        Vector<String> v = new Vector<String>();
        String[] tempContent = null;
        int temp_count = 0;
        GySplit h = new GySplit();
        h.tool(tempS, this.gytFrontSeparator);
        tempContent = h.Show();
        h = null;
        temp_count = tempContent.length;
        
        if(temp_count==0)
        {
            
        }
        else
        {
            gytParameterArray = new String[temp_count - 1];
            if (temp_count > 0) {
                for (int i = 1; i < temp_count; i++) {
                    GySplit b = new GySplit();
                    b.tool(tempContent[i], this.gytBackSeparator);
                    String[] temp_end_array = b.Show();
                    b = null;
                    gytParameterArray[i - 1] = temp_end_array[0];
                }
            }
            for (int i = 0; i < gytParameterArray.length; i++) {
                if (gytParameterArray[i].substring(0, 3).toString().equals("if:")) {
                    v.add(gytParameterArray[i]);
                }
            }
            if (v == null || v.size() == 0) {
                gydContent.setContent(tempS);
            } else {
                gyitParameterArray = new String[v.size()];
                for (int i = 0; i < gyitParameterArray.length; i++) {
                    gyitParameterArray[i] = new String((String) v.elementAt(i));
                }
                v = null;
                String tempSpStart = "";// 循环前的字符串
                String tempSpEnd = "";// 循环后的字符串
                String tempSpIf = "";// 循环的字符串
                Iterator<Entry<String, String>> iSer = this.gytInIf.entrySet()
                        .iterator();
                GySplit a = new GySplit();
                a.tool(tempS, this.gytFrontSeparator + gyitParameterArray[0] + this.gytBackSeparator);
                String[] tempSIfHead = a.Show();
                a = null;
                GySplit f = new GySplit();
                f.tool(gyitParameterArray[0], " ");
                String[] tempParameterArray = f.Show();
                f = null;
                GySplit b = new GySplit();
                b.tool(tempSIfHead[1], this.gytFrontSeparator + "end" + tempParameterArray[0] + this.gytBackSeparator);
                String[] tempSIfEnd = b.Show();
                b = null;
                tempSpStart = tempSIfHead[0];// 开始的 内容
                tempSpIf = tempSIfEnd[0];// 要判断的内容
                for (int af = 1; af < tempSIfEnd.length; af++) {
                    tempSpEnd = tempSpEnd + this.gytFrontSeparator + "end" + tempParameterArray[0] + this.gytBackSeparator + tempSIfEnd[af];
                }
                String tempsub = this.gytFrontSeparator + "end" + tempParameterArray[0] + this.gytBackSeparator;
                tempSpEnd = tempSpEnd.substring(tempsub.length(),
                        tempSpEnd.length());
                tempSIfHead = null;
                tempSIfEnd = null;
                GySplit c = new GySplit();
                c.tool(tempParameterArray[0], ":");
                String[] tempIfParameterArray = c.Show();
                c = null;
                while (iSer.hasNext()) {
                    @SuppressWarnings("rawtypes")
                    Map.Entry entry = (Map.Entry) iSer.next();
                    if (tempIfParameterArray[1].equals(entry.getKey().toString())) {
                        String gytempA = entry.getValue().toString();
                        String tempSS = "";
                        if (tempSpIf.indexOf(this.gytFrontSeparator + "else:"
                                + tempIfParameterArray[1] + this.gytBackSeparator) > 0) {
                            GySplit e = new GySplit();
                            e.tool(tempSpIf, this.gytFrontSeparator + "else:"
                                    + tempIfParameterArray[1] + this.gytBackSeparator);
                            String[] tempSSIf = e.Show();
                            e = null;
                            if (tempParameterArray[1].toString().equals(gytempA)) {
                                tempSS = tempSSIf[0];
                            } else {
                                tempSS = tempSSIf[1];
                            }
                        } else {
                            tempSS = tempSpIf;
                        }
                        gydContent.setContent(tempSpStart + tempSS + tempSpEnd);
                        RepIf();
                    }
                }
            }
        }
    }

今天到此,明天继续说for,for有点麻烦,因为涉及到嵌套循环。

© 著作权归作者所有

zhcms

zhcms

粉丝 0
博文 3
码字总数 1184
作品 1
兰州市
后端工程师
私信 提问
zhcms内置的模板引擎(一)

我是个从其他语言转到java的程序员,使用了几个模板引擎,总是感觉不符合自己的要求,所幸自己写了一个,记录一下开发的整个过程,当成一个回忆。 我自己定义自己的模板引擎的功能: 1.必须能...

zhcms
2014/04/06
75
0
零配置的 CMS 系统--zhcms

zhcms,一个简洁的零配置的cms系统,使用 Java 语言开发,包含了一个模板引擎,一个缓存模块,一个简易的后台管理。系统其他的部分是由插件构成,已经完成了一个广告插件,一个投票插件。...

zhcms
2013/12/01
5.5K
0
zhcms内置的模板引擎(二)

因为没有考虑效率,所以我使用了读取文件然后进行文件内容的处理这种方式进行了代码的编写思路。 读取文件的核心代码 StringBuilder strContent1 = new StringBuilder(""); try { BufferedR...

zhcms
2014/04/06
381
0
HTML 转 excel 工具包 - Html2Excel

Html2excel,是一个以Html table模板为媒介来生成任意复杂布局的Excel的工具包,支持.xls、.xlsx格式,支持对背景色、边框、字体等进行个性化设置,支持合并单元格。 优点 | Advantages 零学...

惟心
2018/12/12
7.3K
10
关于ThinkPHP的一点小小知识点的补充

1.首先将模板加载到模板引擎中去,然后模板开始解析(优先级是:首先解析内置函数(就是模板引擎的内置函数),然后在解析定义函数(如ThinkPHP内置的U,F函数)),最后再返回到模 板。 如果...

笨小熊
2015/09/23
135
0

没有更多内容

加载失败,请刷新页面

加载更多

64.监控平台介绍 安装zabbix 忘记admin密码

19.1 Linux监控平台介绍 19.2 zabbix监控介绍 19.3/19.4/19.6 安装zabbix 19.5 忘记Admin密码如何做 19.1 Linux监控平台介绍: 常见开源监控软件 ~1.cacti、nagios、zabbix、smokeping、ope...

oschina130111
今天
13
0
当餐饮遇上大数据,嗯真香!

之前去开了一场会,主题是「餐饮领袖新零售峰会」。认真听完了餐饮前辈和新秀们的分享,觉得获益匪浅,把脑子里的核心纪要整理了一下,今天和大家做一个简单的分享,欢迎感兴趣的小伙伴一起交...

数澜科技
今天
7
0
DNS-over-HTTPS 的下一代是 DNS ON BLOCKCHAIN

本文作者:PETER LAI ,是 Diode 的区块链工程师。在进入软件开发领域之前,他主要是在做工商管理相关工作。Peter Lai 也是一位活跃的开源贡献者。目前,他正在与 Diode 团队一起开发基于区块...

红薯
今天
10
0
CC攻击带来的危害我们该如何防御?

随着网络的发展带给我们很多的便利,但是同时也带给我们一些网站安全问题,网络攻击就是常见的网站安全问题。其中作为站长最常见的就是CC攻击,CC攻击是网络攻击方式的一种,是一种比较常见的...

云漫网络Ruan
今天
12
0
实验分析性专业硕士提纲撰写要点

为什么您需要研究论文的提纲? 首先当您进行研究时,您需要聚集许多信息和想法,研究论文提纲可以较好地组织你的想法, 了解您研究资料的流畅度和程度。确保你写作时不会错过任何重要资料以此...

论文辅导员
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部