001    /**
002     * Copyright (c) 2000-2011 Liferay, Inc. All rights reserved.
003     *
004     * The contents of this file are subject to the terms of the Liferay Enterprise
005     * Subscription License ("License"). You may not use this file except in
006     * compliance with the License. You can obtain a copy of the License by
007     * contacting Liferay, Inc. See the License for the specific language governing
008     * permissions and limitations under the License, including but not limited to
009     * distribution rights of the Software.
010     *
011     *
012     *
013     */
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    /**
025     * @author Miguel Pastor
026     */
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    }