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