⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 parser.java

📁 云网论坛CWBBS 源码,内容丰富,学习,参考,教学的好资料,具体见内说明,
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
package com.cloudwebsoft.framework.template;

import java.util.regex.Pattern;
import java.io.BufferedReader;
import java.util.Stack;
import java.util.List;
import java.io.IOException;
import java.io.InputStream;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import com.cloudwebsoft.framework.template.plugin.PluginMgr;
import java.util.regex.Matcher;
import javax.servlet.http.HttpServletRequest;
import com.cloudwebsoft.framework.util.LogUtil;
import java.util.ArrayList;
import com.cloudwebsoft.framework.template.plugin.PluginUnit;

/**
 * <p>Title: </p>
 *
 * <p>Description: </p>
 * 文章列表
 * <!-- begin.list.doc dirCode=xxb-->
 * <table><tr><td>#title(20)</td><td>#modifiedDate(yyyy-MM-dd)</td></tr></table>
 * <!-- end.list.doc-->
 * $表示表示域变量
 * #表示全局的变量
 * $doc.dirCode(code).summary 提取文章的摘要
 * $doc.id(id).title 提取文章的标题
 * $foo 全局变量
 * <p>Copyright: Copyright (c) 2005</p>
 *
 * <p>Company: </p>
 *
 * @author not attributable
 * @version 1.0
 */
public class Parser {
    HttpServletRequest request;

    public Parser(HttpServletRequest request) {
        this.request = request;
    }

    static final Pattern varPat = Pattern.compile("\\$(\\S+)",
                                                  Pattern.DOTALL |
                                                  Pattern.CASE_INSENSITIVE);
    static final Pattern beginPat = Pattern.compile(
            "<!--\\s*begin:(\\S+)\\s*(.*?)-->",
            Pattern.DOTALL | Pattern.CASE_INSENSITIVE);
    static final Pattern fieldVarPat = Pattern.compile("@(\\S+)",
            Pattern.DOTALL |
            Pattern.CASE_INSENSITIVE);
    static final Pattern endPat = Pattern.compile(
            "<!--\\s*?end:(\\S+)(.*?)-->",
            Pattern.DOTALL | Pattern.CASE_INSENSITIVE);

    static final Pattern patArray[] = {
                                      varPat,
                                      beginPat,
                                      fieldVarPat,
                                      endPat
    };

    static final int tokenTypeArray[] = {Token.VAR, Token.BEGIN, Token.FIELD,
                                        Token.END};

    /**
     *
     * @param fileName
     * @return
     * @throws IOException
     */
    public ITemplate parse(String fileName) throws IOException {
        LogUtil.getLog(getClass()).info("parse:fileName=" + fileName);

        return parse(fileName, "utf-8");
    }

    /**
     * parse a file to template
     *
     * @param fileName String
     * @param charsetName String
     * @throws IOException
     * @return ITemplate
     */
    public ITemplate parse(String fileName, String charsetName) throws
            IOException {
        FileInputStream fileStream = new FileInputStream(fileName);
        LogUtil.getLog(getClass()).info("parse:charsetName=" + charsetName);

        ITemplate template = parse(fileStream, charsetName);
        fileStream.close();

        return template;
    }

    /**
     *
     * @param stream
     * @param charsetName
     * @return
     * @throws IOException
     */
    public ITemplate parse(InputStream stream, String charsetName) throws
            IOException {
        if (charsetName == null) charsetName = "utf-8";
        InputStreamReader streamReader = new InputStreamReader(stream,
                charsetName);
        BufferedReader reader = new BufferedReader(streamReader);

        ITemplate template = parse(reader);
        streamReader.close();
        reader.close();
        return template;
    }

    public ListPart getListPartByName(String line) {
        // LogUtil.getLog(getClass()).info("getListPartByName: line=" + line);
        Matcher m = beginPat.matcher(line);
        boolean result = m.find();
        String name = "";
        String propStr = "";
        // 解析属性
        if (result) {
            name = m.group(1);
            if (m.groupCount() >= 2)
                propStr = m.group(2);
        }
        PluginMgr pm = new PluginMgr();
        ListPart lp = (ListPart) pm.getPluginUnit(name).getITemplate();
        // LogUtil.getLog(getClass()).info("getListPartByName: propStr=" + propStr);
        lp.request = request;
        if (!propStr.equals(""))
            lp.parseProps(propStr);
        return lp;
    }

    public VarPart getVarPartByNameString(String nameStr) {
        // $doc.id(id).title 提取文章的标题
        // nameStr = "aaa$doc.id(33).title(len=20,date=yyyy-MM-dd HH:mm:ss,urlEncode=true) ddddddddddf $doc.id(66).title";
        // nameStr = "aaa$doc.id(request.id).title(len=20,date=yyyy-MM-dd HH:mm:ss,urlEncode=true) ddddddddddf $doc.id(66).title";
        // nameStr = "aaa$doc.id(request.id).title(page=1,len=20,date=yyyy-MM-dd HH:mm:ss,urlEncode=true) ddddddddddf $doc.id(66).title";
        // Pattern varNamePat = Pattern.compile("\\$(\\S+)\\.(\\S+)\\((\\S+)\\)\\.(\\S+)",  Pattern.DOTALL | Pattern.CASE_INSENSITIVE);
        Pattern varNamePat = Pattern.compile(
                "\\$(\\S+)\\.(\\S+)\\((\\S+)\\)\\.([^\\(]+)?(\\((.*?)\\))?",
                Pattern.DOTALL | Pattern.CASE_INSENSITIVE);
        Matcher m = varNamePat.matcher(nameStr);
        /*
        boolean result = m.find();
        while (result) {
            // 有四个子串name title size value
            for (int i = 1; i <= m.groupCount(); i++) {
                System.out.println("第" + i + "组的子串内容为: " + m.group(i));
            }
            result = m.find();
        }
        */
        if (m.find()) {
            if (m.groupCount() < 5)
                throw new IllegalArgumentException(nameStr +
                        " is invalid! Regexp match group count is " +
                        m.groupCount());
            String name = m.group(1);
            String keyName = m.group(2);
            String keyValue = m.group(3);
            String field = m.group(4);
            String props = "";
            if (m.groupCount() >= 6) {
                props = m.group(6);
            }
            PluginMgr pm = new PluginMgr();
            PluginUnit pu = pm.getPluginUnit(name);
            if (pu == null)
                throw new IllegalArgumentException(name +
                        " is not found in plugin units. Name string is " +
                        nameStr);
            VarPart vp = (VarPart) pu.getITemplate();
            vp.setRequest(request);
            vp.setName(name);
            vp.setKeyName(keyName);
            vp.setKeyValue(keyValue);
            vp.setField(field);
            if (props != null && !props.equals(""))
                vp.parseProps(props);
            return vp;
        } else {
            // {$Global.AppName}
            Pattern varNamePat2 = Pattern.compile(
                    "\\$(\\S+)\\.([^\\(]+)(\\((.*?)\\))?",
                    Pattern.DOTALL | Pattern.CASE_INSENSITIVE);
            m = varNamePat2.matcher(nameStr);
            if (m.find()) {
                if (m.groupCount() < 2) {
                    throw new IllegalArgumentException(nameStr +
                            " is invalid! varNamePat2 match group count is " +
                            m.groupCount());
                }
                String name = m.group(1);
                String field = m.group(2);
                String props = "";
                if (m.groupCount() >= 4) {
                    props = m.group(4);
                }
                PluginMgr pm = new PluginMgr();
                LogUtil.getLog(getClass()).info(
                        "getVarPartByNameString: nameStr=" +
                        nameStr + " name=" + name + " props=" + props);
                VarPart vp = (VarPart) pm.getPluginUnit(name).getITemplate();
                vp.setRequest(request);
                vp.setName(name);
                vp.setField(field);
                if (props != null && !props.equals(""))
                    vp.parseProps(props);
                return vp;
            } else
                throw new IllegalArgumentException(nameStr + " is invalid!");
        }
    }

    public Token parseLine(String line) {
        Token token = new Token();

        if (line.indexOf("--") != -1)
            LogUtil.getLog(getClass()).info("parseLine:" + line);

        if (line.startsWith("<!--") && line.endsWith("-->")) {
            int commentBeginPos = line.indexOf("<!--") + "<!--".length();
            int commentEndPos = line.indexOf("-->", commentBeginPos);

            String tag = line.substring(commentBeginPos, commentEndPos).trim();
            tag = line;
            LogUtil.getLog(getClass()).info("parseLine:" + tag);
            int nPatterns = patArray.length;
            Matcher m = null;
            for (int i = 0; i < nPatterns; i++) {
                Pattern pattern = patArray[i];
                m = pattern.matcher(tag);
                if (m.find()) {
                    token.setType(tokenTypeArray[i]);
                    break;
                }
            }

            if (token.getType() == Token.BEGIN) { // valid
                token.setName(m.group(1));
            } else if (token.getType() == Token.END) {
                token.setName(m.group(1));
            }

            return token;
        }

        int begin = 0;
        List posPairs = null;

        // 解析如下格式
        // ........{....{.........}....}...{..........}....... etc
        //              ^         ^         ^          ^
        //              begin     end       begin      end
        while (true) {
            int lBracketPos = line.indexOf("{", begin);
            if (lBracketPos < 0)break;

            int rBracketPos = line.indexOf("}", lBracketPos);
            if (rBracketPos < 0)break;

            // pass the nested { { {, use the last one.
            int nestedLeftBracketPos = line.indexOf("{", lBracketPos + 1);
            while (nestedLeftBracketPos >= 0 &&
                   nestedLeftBracketPos < rBracketPos) {
                lBracketPos = nestedLeftBracketPos;
                nestedLeftBracketPos = line.indexOf("{", lBracketPos + 1);
            }

            if (posPairs == null) {
                posPairs = new ArrayList();
            }

            PosPair posPair = new PosPair();

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -