parser.java
来自「cwbbs 云网论坛源码」· Java 代码 · 共 521 行 · 第 1/2 页
JAVA
521 行
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;import cn.js.fan.util.ErrMsgException;import java.io.Reader;public class Parser { public Parser() { } 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}; public ITemplate parse(String fileName) throws IOException,ErrMsgException { return parse(fileName, "utf-8"); } public ITemplate parse(String fileName, String charsetName) throws IOException,ErrMsgException { FileInputStream fileStream = new FileInputStream(fileName); ITemplate template = null; try { template = parse(fileStream, charsetName); } finally { fileStream.close(); } return template; } public ITemplate parse(InputStream stream, String charsetName) throws IOException,ErrMsgException { if (charsetName == null) charsetName = "utf-8"; InputStreamReader streamReader = new InputStreamReader(stream, charsetName); BufferedReader reader = new BufferedReader(streamReader); ITemplate template = null; try { template = parse(reader); } finally { streamReader.close(); reader.close(); } return template; } public ITemplate parse(Reader reader) throws IOException,ErrMsgException { BufferedReader bufreader = new BufferedReader(reader); ITemplate template = null; try { template = parse(bufreader); } finally { reader.close(); bufreader.close(); } return template; } public ListPart getListPartByName(String 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(); if (!propStr.equals("")) lp.parseProps(propStr); return lp; } public VarPart getVarPartByNameString(String nameStr) throws ErrMsgException { Pattern varNamePat = Pattern.compile( "\\$(\\S+)\\.(\\S+)\\((\\S+)\\)\\.([^\\(]+)?(\\((.*?)\\))?", Pattern.DOTALL | Pattern.CASE_INSENSITIVE); Matcher m = varNamePat.matcher(nameStr); 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(); if (vp==null) throw new IllegalArgumentException( " ITemplate is not found. Name string is " + nameStr); vp.setName(name); vp.setKeyName(keyName); vp.setKeyValue(keyValue); vp.setField(field); if (props != null && !props.equals("")) vp.parseProps(props); return vp; } else { Pattern varNamePat2 = Pattern.compile( "\\$([A-Z0-9a-z]+)\\.([^\\(]+)(\\((.*?)\\))?", 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(); PluginUnit pu = pm.getPluginUnit(name); if (pu == null) throw new ErrMsgException("Plugin unit of " + name + " is not found!"); VarPart vp = (VarPart) pu.getITemplate(); if (vp == null) throw new ErrMsgException("ITemplate of " + name + " is not found!"); 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.startsWith("<!--") && line.endsWith("-->")) { int commentBeginPos = line.indexOf("<!--") + "<!--".length(); int commentEndPos = line.indexOf("-->", commentBeginPos); String tag = line.substring(commentBeginPos, commentEndPos).trim(); tag = line; 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) { token.setName(m.group(1)); } else if (token.getType() == Token.END) { token.setName(m.group(1)); } return token; } int begin = 0; List posPairs = null; while (true) { int lBracketPos = line.indexOf("{", begin); if (lBracketPos < 0)break; int rBracketPos = line.indexOf("}", lBracketPos); if (rBracketPos < 0)break; int nestedLeftBracketPos = line.indexOf("{", lBracketPos + 1); while (nestedLeftBracketPos >= 0 && nestedLeftBracketPos < rBracketPos) { lBracketPos = nestedLeftBracketPos; nestedLeftBracketPos = line.indexOf("{", lBracketPos + 1); }
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?