public List<BBCodeItem> parse(String text) { List<BBCodeItem> bbCodeItems = new ArrayList<>(); BBCodeLexer bbCodeLexer = new BBCodeLexer(text); Stack<String> tags = new Stack<>(); IntegerWrapper marker = new IntegerWrapper(); BBCodeToken bbCodeToken = null; while ((bbCodeToken = bbCodeLexer.getNextBBCodeToken()) != null) { handleData(bbCodeItems, bbCodeLexer, marker, bbCodeToken, text); if (bbCodeToken.getStartTag() == null) { handleTagEnd(bbCodeItems, tags, bbCodeToken); continue; } handleTagStart(bbCodeItems, tags, bbCodeToken); String startTag = bbCodeToken.getStartTag(); if (!startTag.equals("code")) { continue; } while (true) { bbCodeToken = bbCodeLexer.getNextBBCodeToken(); if (bbCodeToken == null) { break; } String endTag = GetterUtil.getString(bbCodeToken.getEndTag()); if (endTag.equals("code")) { break; } } handleData(bbCodeItems, bbCodeLexer, marker, bbCodeToken, text); if (bbCodeToken != null) { handleTagEnd(bbCodeItems, tags, bbCodeToken); } else { break; } } handleData(bbCodeItems, bbCodeLexer, marker, null, text); handleTagEnd(bbCodeItems, tags, null); return bbCodeItems; }
protected void handleData( List<BBCodeItem> bbCodeItems, BBCodeLexer bbCodeLexer, IntegerWrapper marker, BBCodeToken bbCodeToken, String data) { int length = data.length(); int lastIndex = length; if (bbCodeToken != null) { length = bbCodeToken.getStart(); lastIndex = bbCodeLexer.getLastIndex(); } if (length > marker.getValue()) { BBCodeItem bbCodeItem = new BBCodeItem(TYPE_DATA, null, data.substring(marker.getValue(), length)); bbCodeItems.add(bbCodeItem); } marker.setValue(lastIndex); }