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