001
014
015 package com.liferay.portlet.wiki.engines.antlrwiki.translator;
016
017 import com.liferay.portal.kernel.util.ListUtil;
018 import com.liferay.portal.kernel.util.TreeNode;
019 import com.liferay.portal.parsers.creole.ast.HeadingNode;
020 import com.liferay.portal.parsers.creole.ast.WikiPageNode;
021 import com.liferay.portal.parsers.creole.visitor.impl.BaseASTVisitor;
022
023 import java.util.List;
024
025
028 public class TableOfContentsVisitor extends BaseASTVisitor {
029
030 public TreeNode<HeadingNode> compose(WikiPageNode wikiPageNode) {
031 _headingNode = new TreeNode<HeadingNode>(
032 new HeadingNode(Integer.MIN_VALUE));
033
034 visit(wikiPageNode);
035
036 return _headingNode;
037 }
038
039 @Override
040 public void visit(HeadingNode headingNode) {
041 addHeadingNode(_headingNode, headingNode);
042 }
043
044 protected boolean addHeadingNode(
045 TreeNode<HeadingNode> treeNode, HeadingNode headingNode) {
046
047 if (!isLastHeadingNode(treeNode, headingNode)) {
048 HeadingNode treeNodeHeadingNode = treeNode.getValue();
049
050 if (headingNode.getLevel() <= treeNodeHeadingNode.getLevel()) {
051 TreeNode<HeadingNode> parentTreeNode = treeNode.getParentNode();
052
053 parentTreeNode.addChildNode(headingNode);
054 }
055 else {
056 treeNode.addChildNode(headingNode);
057 }
058
059 return false;
060 }
061
062 List<TreeNode<HeadingNode>> treeNodes = treeNode.getChildNodes();
063
064 for (int i = treeNodes.size() - 1; i >= 0; --i) {
065 return addHeadingNode(treeNodes.get(i), headingNode);
066 }
067
068 return true;
069 }
070
071 protected boolean isLastHeadingNode(
072 TreeNode<HeadingNode> treeNode, HeadingNode headingNode) {
073
074 HeadingNode treeNodeHeadingNode = treeNode.getValue();
075
076 List<TreeNode<HeadingNode>> treeNodes = treeNode.getChildNodes();
077
078 if ((headingNode.getLevel() > treeNodeHeadingNode.getLevel()) &&
079 ListUtil.isNotEmpty(treeNodes)) {
080
081 return true;
082 }
083
084 return false;
085 }
086
087 private TreeNode<HeadingNode> _headingNode;
088
089 }