001
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
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 }