📄 parser.java
字号:
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 + -