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 lstItemType = doc.getChildren(); if(null == lstItemType || lstItemType.isEmpty()){ return ; } //µÚ¶þ²ãItem ItemType objItemType = (ItemType)lstItemType.get(lstItemType.size() - 1); List 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