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