001    /**
002     * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
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    }