001    /**
002     * Copyright (c) 2000-2012 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;
016    
017    import com.liferay.portal.kernel.exception.SystemException;
018    import com.liferay.portal.kernel.log.Log;
019    import com.liferay.portal.kernel.log.LogFactoryUtil;
020    import com.liferay.portal.parsers.creole.ast.ASTNode;
021    import com.liferay.portal.parsers.creole.ast.WikiPageNode;
022    import com.liferay.portal.parsers.creole.ast.link.LinkNode;
023    import com.liferay.portal.parsers.creole.parser.Creole10Lexer;
024    import com.liferay.portal.parsers.creole.parser.Creole10Parser;
025    import com.liferay.portal.parsers.creole.visitor.impl.LinkNodeCollectorVisitor;
026    import com.liferay.portlet.wiki.PageContentException;
027    import com.liferay.portlet.wiki.engines.WikiEngine;
028    import com.liferay.portlet.wiki.engines.antlrwiki.translator.XhtmlTranslator;
029    import com.liferay.portlet.wiki.model.WikiPage;
030    import com.liferay.portlet.wiki.service.WikiPageLocalServiceUtil;
031    
032    import java.util.HashMap;
033    import java.util.List;
034    import java.util.Map;
035    
036    import javax.portlet.PortletURL;
037    
038    import org.antlr.runtime.ANTLRStringStream;
039    import org.antlr.runtime.CommonTokenStream;
040    import org.antlr.runtime.RecognitionException;
041    
042    /**
043     * @author Miguel Pastor
044     */
045    public class CreoleWikiEngine implements WikiEngine {
046    
047            public String convert(
048                    WikiPage page, PortletURL viewPageURL, PortletURL editPageURL,
049                    String attachmentURLPrefix) {
050    
051                    XhtmlTranslator xhtmlTranslator = new XhtmlTranslator();
052    
053                    return xhtmlTranslator.translate(
054                            page, viewPageURL, editPageURL, attachmentURLPrefix, parse(
055                            page.getContent()));
056            }
057    
058            public Map<String, Boolean> getOutgoingLinks(WikiPage page)
059                    throws PageContentException {
060    
061                    Map<String, Boolean> outgoingLinks = new HashMap<String, Boolean>();
062    
063                    LinkNodeCollectorVisitor linkNodeCollectorVisitor =
064                            new LinkNodeCollectorVisitor();
065    
066                    List<ASTNode> astNodes = linkNodeCollectorVisitor.collect(
067                            parse(page.getContent()));
068    
069                    try {
070                            for (ASTNode astNode : astNodes) {
071                                    LinkNode linkNode = (LinkNode)astNode;
072    
073                                    String title = linkNode.getLink();
074    
075                                    boolean existingLink = false;
076    
077                                    if (WikiPageLocalServiceUtil.getPagesCount(
078                                                    page.getNodeId(), title, true) > 0) {
079    
080                                            existingLink = true;
081                                    }
082    
083                                    if (existingLink) {
084                                            title = title.toLowerCase();
085                                    }
086    
087                                    outgoingLinks.put(title, existingLink);
088                            }
089                    }
090                    catch (SystemException se) {
091                            throw new PageContentException(se);
092                    }
093    
094                    return outgoingLinks;
095            }
096    
097            public void setInterWikiConfiguration(String interWikiConfiguration) {
098            }
099    
100            public void setMainConfiguration(String mainConfiguration) {
101            }
102    
103            public boolean validate(long nodeId, String content) {
104                    return true;
105            }
106    
107            protected Creole10Parser build(String creoleCode) {
108                    ANTLRStringStream antlrStringStream = new ANTLRStringStream(creoleCode);
109    
110                    Creole10Lexer creole10Lexer = new Creole10Lexer(antlrStringStream);
111    
112                    CommonTokenStream commonTokenStream = new CommonTokenStream(
113                            creole10Lexer);
114    
115                    return new Creole10Parser(commonTokenStream);
116            }
117    
118            protected WikiPageNode parse(String creoleCode) {
119                    Creole10Parser creole10Parser = build(creoleCode);
120    
121                    try {
122                            creole10Parser.wikipage();
123                    }
124                    catch (RecognitionException re) {
125                            if (_log.isDebugEnabled()) {
126                                    _log.debug("Unable to parse:\n" + creoleCode, re);
127                            }
128                    }
129    
130                    return creole10Parser.getWikiPageNode();
131            }
132    
133            private Log _log = LogFactoryUtil.getLog(CreoleWikiEngine.class);
134    
135    }