package com.qxueyou.scc.exercise.service.impl;
|
|
import java.util.List;
|
import java.util.regex.Matcher;
|
import java.util.regex.Pattern;
|
|
import org.apache.commons.lang3.StringUtils;
|
|
import com.qxueyou.scc.exercise.model.ExerciseParse;
|
import com.qxueyou.scc.exercise.service.impl.node.Doc;
|
import com.qxueyou.scc.exercise.service.impl.node.Item;
|
import com.qxueyou.scc.exercise.service.impl.node.ItemType;
|
import com.qxueyou.scc.exercise.service.impl.node.Option;
|
import com.qxueyou.scc.exercise.service.impl.parser.ItemParser;
|
import com.qxueyou.scc.exercise.service.impl.parser.OptionParser;
|
|
public class Handler {
|
|
private Doc doc;
|
|
private Node currentNode;
|
|
/** ʧ°Ü */
|
public static final Integer HANDLER_RESULT_FAIL = 1 ;
|
|
/** ÉÏÒ»ÀàÐÍ */
|
public static final Integer HANDLER_RESULT_CONTINUE = 2;
|
|
/** ³É¹¦*/
|
public static final Integer HANDLER_RESULT_SUCCESS = 3;
|
|
/** УÑéÊÇ·ñÓÐÖÐÎÄ */
|
private static String regEx = "[\u4e00-\u9fa5]";
|
private static Pattern pat = Pattern.compile(regEx);
|
|
public Handler(){
|
doc = new Doc();
|
currentNode = doc;
|
}
|
|
/**
|
* ½âÎöÎı¾,ÿ´Î¶Áȡһ¸ö¶ÎÂä
|
* @param content ¶ÎÂäÎı¾ÄÚÈÝ
|
*/
|
public ExerciseParse parse(String content){
|
|
ParseResult result = null;
|
|
content = content.replace((char)12288, (char)32);
|
content = content.replace((char)160, (char)32);
|
|
//½«µÃµ½µÄÎı¾È«½Çת°ë½Ç
|
//content = formatFullToHalf(content);
|
content = content.replace('£¨', '(');
|
content = content.replace('£©', ')');
|
|
// ·ÇÈ«²¿Ó¢ÎÄÌâ ·ÇÈ«²¿¿Õ¸ñ£¬ ÐèÒª½«¿Õ¸ñÌæ»»µô
|
if(isContentContainsChinese(content) || content.trim().isEmpty()){
|
content = content.replace(" ", "");
|
}
|
|
content = content.replace("\t", "");
|
|
if(StringUtils.isEmpty(content)||content.equals("\r")){
|
return new ExerciseParse(HANDLER_RESULT_SUCCESS,content);
|
}
|
|
//ÊÇ·ñÐèÒªÈËΪȥµô»Ø³µ
|
content = content.replace("\r", "");
|
|
int count = 0;
|
|
do{
|
result = currentNode.getParser().parse(currentNode, content);
|
|
if(result.isSuccess()){
|
if(ParseResult.STEP_CUR.equals(result.getNextStep())){
|
//³É¹¦ºó£¬È¡µÃµ±Ç°parser
|
generateLastSuccessType(doc,currentNode,result.getNextNode());
|
return new ExerciseParse(HANDLER_RESULT_SUCCESS,content);
|
}
|
if(ParseResult.STEP_PRE.equals(result.getNextStep())){
|
currentNode = currentNode.getParent();
|
return new ExerciseParse(HANDLER_RESULT_SUCCESS,content);
|
}
|
if(ParseResult.STEP_NEXT.equals(result.getNextStep())){
|
currentNode = result.getNextNode();
|
return new ExerciseParse(HANDLER_RESULT_SUCCESS,content);
|
}
|
}else{
|
if(ParseResult.STEP_CUR.equals(result.getNextStep())){
|
//20150907 ÐÞ¸Ä;Å×µ½×îÉϲãdoc½âÎöÆ÷ÈÔÈ»ÎÞ·¨¶¨Î»£¬Ö±½Ó½«Îı¾ÄÚÈÝÌí¼Óµ½ÉÏÒ»¸ö½âÎö³É¹¦µÄλÖÃ
|
appendTextToLastPosition(doc,content);
|
return new ExerciseParse(HANDLER_RESULT_CONTINUE,doc.getLastSuccessType(),content);
|
}
|
if(ParseResult.STEP_PRE.equals(result.getNextStep())){
|
if(currentNode.getParent()==null){
|
return new ExerciseParse(HANDLER_RESULT_FAIL,content);
|
}
|
currentNode = currentNode.getParent();
|
}
|
if(ParseResult.STEP_NEXT.equals(result.getNextStep())){
|
if(result.getNextNode()==null){
|
return new ExerciseParse(HANDLER_RESULT_FAIL,content);
|
}
|
currentNode = result.getNextNode();
|
}
|
}
|
|
}while( count++ < 15);
|
|
return new ExerciseParse(HANDLER_RESULT_FAIL,content);
|
|
}
|
|
public Doc result(){
|
return doc;
|
}
|
|
|
/**
|
* µÃµ½×îгɹ¦µÄ½âÎöÀàÐÍ
|
*
|
* @param doc doc
|
* @param currNode µ±Ç°½Úµã
|
* @param analysisNode Èç¹ûÊǽâÎö ²¿·ÖµÄ½âÎöÆ÷£¬·µ»Ø·Ç¿ÕÊý¾Ý£¬ÓÃÓÚ»ñÈ¡½âÎöÆ÷ÀàÐÍ
|
*/
|
private void generateLastSuccessType(Doc doc,Node currNode,Node analysisNode){
|
Parser currParser = currNode.getParser();
|
if(null != analysisNode){
|
doc.setLastSuccessType(Doc.CURR_SUCCESS_ANALYSIS);
|
return ;
|
}
|
if(currParser instanceof OptionParser){
|
doc.setLastSuccessType(Doc.CURR_SUCCESS_OPTION);
|
return ;
|
}
|
if(currParser instanceof ItemParser){
|
doc.setLastSuccessType(Doc.CURR_SUCCESS_CONTENT);
|
return ;
|
}
|
}
|
|
/**
|
* µÃµ½µ±Ç°½âÎö³É¹¦µÄ×îÐÂλÖãºÈç¹ûÊÇÌâÄ¿µÄ£ºÌâ¸É¡¢Ñ¡Ïî»òÕß½âÎö£¬½«ËûÃÇ×é×°¶ÔӦλÖÃ
|
*
|
* @param doc
|
* @param content
|
*/
|
private void appendTextToLastPosition(Doc doc,String content){
|
String currSuccessType = doc.getLastSuccessType();
|
|
//µÚÒ»²ã ItemType
|
List<Node> lstItemType = doc.getChildren();
|
if(null == lstItemType || lstItemType.isEmpty()){
|
return ;
|
}
|
|
//µÚ¶þ²ãItem
|
ItemType objItemType = (ItemType)lstItemType.get(lstItemType.size() - 1);
|
List<Node> lstItem = objItemType.getChildren();
|
if(null == lstItem || lstItem.isEmpty()){
|
return ;
|
}
|
|
//È¡µ½×îÐÂλÖõÄItem
|
Item objItem = (Item)lstItem.get(lstItem.size() - 1);
|
if(null != objItem){
|
appendTextToCurrPosition(objItem,currSuccessType,content);
|
}
|
}
|
|
/**
|
* ½«µ±Ç°Ã»Óй鵵µÄÄÚÈݼÓÈëµ½¶ÔÓ¦µÄλÖÃ
|
*
|
* @param objItem
|
* @param currSuccessType
|
* @param content
|
*/
|
private void appendTextToCurrPosition(Item objItem,String currSuccessType,String content){
|
if(Doc.CURR_SUCCESS_CONTENT == currSuccessType){
|
objItem.setTitle(objItem.getTitle()+ content);
|
currentNode = objItem;
|
|
}else if(Doc.CURR_SUCCESS_ANALYSIS == currSuccessType){
|
objItem.setAnalysis(objItem.getAnalysis() + content);
|
currentNode = objItem;
|
|
}else if(Doc.CURR_SUCCESS_OPTION == currSuccessType){
|
|
List<Option> lstOptions = objItem.getOptions();
|
if(null == lstOptions || lstOptions.isEmpty()){
|
return ;
|
}
|
|
Option opt = null ;
|
for(int i = lstOptions.size() -1 ; i>=0 ; i --){
|
opt = lstOptions.get(i);
|
if(null == opt){
|
return ;
|
}
|
//½«Ñ¡ÏîÌí¼Óµ½×îÐÂλÖÃ
|
if(StringUtils.isNotBlank(opt.getNo())){
|
opt.setContent(opt.getContent() + content);
|
currentNode = objItem;
|
return ;
|
}
|
}
|
}
|
}
|
|
/**
|
* ×Ö·û´®ÊÇ·ñ°üº¬ÖÐÎÄ
|
* @param content
|
* @return
|
*/
|
private boolean isContentContainsChinese( String content ){
|
|
Matcher matcher = pat.matcher(content);
|
boolean flg = false;
|
if (matcher.find()) {
|
flg = true;
|
}
|
return flg;
|
}
|
|
}
|