/*
* Copyright (C) 2003-2010 eXo Platform SAS.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License
* as published by the Free Software Foundation; either version 3
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see<http://www.gnu.org/licenses/>.
*/
package org.exoplatform.wiki.rendering.impl;
import org.exoplatform.container.ExoContainerContext;
import org.exoplatform.portal.config.model.PortalConfig;
import org.exoplatform.wiki.mow.api.Model;
import org.exoplatform.wiki.mow.api.WikiType;
import org.exoplatform.wiki.mow.core.api.WikiStoreImpl;
import org.exoplatform.wiki.mow.core.api.wiki.PortalWiki;
import org.exoplatform.wiki.mow.core.api.wiki.WikiContainer;
import org.exoplatform.wiki.mow.core.api.wiki.WikiHome;
import org.exoplatform.wiki.service.WikiContext;
import org.exoplatform.wiki.service.WikiService;
import org.xwiki.component.manager.ComponentLookupException;
import org.xwiki.component.manager.ComponentRepositoryException;
import org.xwiki.context.Execution;
import org.xwiki.context.ExecutionContext;
import org.xwiki.rendering.syntax.Syntax;
/**
* Created by The eXo Platform SAS
* Author : viet nguyen
* viet.nguyen@exoplatform.com
* Jun 15, 2010
*/
public class TestMacroRendering extends AbstractRenderingTestCase {
@Override
protected void setUp() throws Exception {
super.setUp();
setupDefaultWikiContext();
}
public void testRenderNoteMacro() throws Exception {
String expectedHtml = "<div class=\"box notemessage\">This is a note.</div>";
assertEquals(expectedHtml, renderingService.render("{{note}}This is a note.{{/note}}", Syntax.XWIKI_2_0.toIdString(), Syntax.XHTML_1_0.toIdString(), false));
assertEquals(expectedHtml, renderingService.render("{note}This is a note.{note}", Syntax.CONFLUENCE_1_0.toIdString(), Syntax.XHTML_1_0.toIdString(), false));
}
public void testRenderTipMacro() throws Exception {
String expectedHtml = "<div class=\"box tipmessage\">This is a tip.</div>";
assertEquals(expectedHtml, renderingService.render("{{tip}}This is a tip.{{/tip}}", Syntax.XWIKI_2_0.toIdString(), Syntax.XHTML_1_0.toIdString(), false));
assertEquals(expectedHtml, renderingService.render("{tip}This is a tip.{tip}", Syntax.CONFLUENCE_1_0.toIdString(), Syntax.XHTML_1_0.toIdString(), false));
}
public void testRenderInfoMacro() throws Exception {
String expectedHtml = "<div class=\"box infomessage\">This is an info.</div>";
assertEquals(expectedHtml, renderingService.render("{{info}}This is an info.{{/info}}", Syntax.XWIKI_2_0.toIdString(), Syntax.XHTML_1_0.toIdString(), false));
assertEquals(expectedHtml, renderingService.render("{info}This is an info.{info}", Syntax.CONFLUENCE_1_0.toIdString(), Syntax.XHTML_1_0.toIdString(), false));
}
public void testRenderWarningMacro() throws Exception {
String expectedHtml = "<div class=\"box warningmessage\">This is an warning.</div>";
assertEquals(expectedHtml, renderingService.render("{{warning}}This is an warning.{{/warning}}", Syntax.XWIKI_2_0.toIdString(), Syntax.XHTML_1_0.toIdString(), false));
assertEquals(expectedHtml, renderingService.render("{warning}This is an warning.{warning}", Syntax.CONFLUENCE_1_0.toIdString(), Syntax.XHTML_1_0.toIdString(), false));
}
public void testRenderErrorMacro() throws Exception {
String expectedHtml = "<div class=\"box errormessage\">This is an error.</div>";
assertEquals(expectedHtml, renderingService.render("{{error}}This is an error.{{/error}}", Syntax.XWIKI_2_0.toIdString(), Syntax.XHTML_1_0.toIdString(), false));
}
public void testRenderCodeMacro() throws Exception {
String expectedHtml = "<div class=\"box code\"><span style=\"font-weight: bold; color: #008000; \"><html><head></span>Cool!<span style=\"font-weight: bold; color: #008000; \"></head></html></span></div>";
assertEquals(expectedHtml, renderingService.render("{{code language=\"html\"}}<html><head>Cool!</head></html>{{/code}}", Syntax.XWIKI_2_0.toIdString(), Syntax.XHTML_1_0.toIdString(), false));
}
public void testRenderSectionAndColumnMacro() throws Exception {
String expectedHtml = "<div><div style=\"float:left;width:49.2%;padding-right:1.5%;\"><p>Column one text goes here</p></div><div style=\"float:left;width:49.2%;\"><p>Column two text goes here</p></div><div style=\"clear:both\"></div></div>";
assertEquals(expectedHtml, renderingService.render("{{section}}\n\n{{column}}Column one text goes here{{/column}}\n\n{{column}}Column two text goes here{{/column}}\n\n{{/section}}", Syntax.XWIKI_2_0.toIdString(), Syntax.XHTML_1_0.toIdString(), false));
assertEquals(expectedHtml, renderingService.render("{section}\n{column}Column one text goes here{column}\n{column}Column two text goes here{column}\n{section}", Syntax.CONFLUENCE_1_0.toIdString(), Syntax.XHTML_1_0.toIdString(), false));
}
public void testRenderNoFormatMacro() throws Exception {
String expectedXWikiHtml = "<pre>pre-formatted piece of text so **no** further __formatting__ is done here</pre>";
String expectedConfluenceHtml = "<pre>pre-formatted piece of text so *no* further _formatting_ is done here</pre>";
assertEquals(expectedXWikiHtml, renderingService.render("{{noformat}}pre-formatted piece of text so **no** further __formatting__ is done here{{/noformat}}", Syntax.XWIKI_2_0.toIdString(), Syntax.XHTML_1_0.toIdString(), false));
assertEquals(expectedConfluenceHtml, renderingService.render("{noformat}pre-formatted piece of text so *no* further _formatting_ is done here{noformat}", Syntax.CONFLUENCE_1_0.toIdString(), Syntax.XHTML_1_0.toIdString(), false));
}
public void testRenderPanelMacro() throws Exception {
String expectedHtml = "<div class=\"panel\"><div class=\"panelHeader\">My Title</div><div class=\"panelContent\"><p>Some text with a title</p></div></div>";
assertEquals(expectedHtml, renderingService.render("{{panel title=\"My Title\"}}Some text with a title{{/panel}}", Syntax.XWIKI_2_0.toIdString(), Syntax.XHTML_1_0.toIdString(), false));
assertEquals(expectedHtml, renderingService.render("{panel:title=My Title}Some text with a title{panel}", Syntax.CONFLUENCE_1_0.toIdString(), Syntax.XHTML_1_0.toIdString(), false));
}
public void testTocMacro() throws Exception {
String xwikiExpectedHtml = "<ol><li><span class=\"wikilink\"><a href=\"#HH1\">H1</a></span><ol><li><span class=\"wikilink\"><a href=\"#HH2\">H2</a></span><ol><li><span class=\"wikilink\"><a href=\"#HH3\">H3</a></span></li></ol></li></ol></li></ol><h1 id=\"HH1\"><span>H1</span></h1><p> </p><h2 id=\"HH2\"><span>H2</span></h2><p> </p><h3 id=\"HH3\"><span>H3</span></h3>";
String confluenceExpectedHtml = "<ol><li><span class=\"wikilink\"><a href=\"#HH1\">H1 </a></span><ol><li><span class=\"wikilink\"><a href=\"#HH2\">H2 </a></span><ol><li><span class=\"wikilink\"><a href=\"#HH3\">H3 </a></span></li></ol></li></ol></li></ol><h1 id=\"HH1\"><span>H1 </span></h1><h2 id=\"HH2\"><span>H2 </span></h2><h3 id=\"HH3\"><span>H3 </span></h3>";
assertEquals(xwikiExpectedHtml, renderingService.render("{{toc numbered=\"true\"}} {{/toc}}\n= H1 = \n == H2 == \n === H3 ===", Syntax.XWIKI_2_0.toIdString(), Syntax.XHTML_1_0.toIdString(), false));
assertEquals(confluenceExpectedHtml, renderingService.render("{toc:numbered=\"true\"}\nh1. H1 \nh2. H2 \nh3. H3 ", Syntax.CONFLUENCE_1_0.toIdString(), Syntax.XHTML_1_0.toIdString(), false));
}
public void testIncludePageMacro() throws Exception {
Model model = mowService.getModel();
WikiStoreImpl wStore = (WikiStoreImpl) model.getWikiStore();
WikiContainer<PortalWiki> portalWikiContainer = wStore.getWikiContainer(WikiType.PORTAL);
PortalWiki wiki = portalWikiContainer.addWiki("classic");
WikiHome home = wiki.getWikiHome();
String content = "Test include contents of a page";
home.getContent().setText(content);
String expectedHtml = "<div class=\"IncludePage \" ><p>" + content + "</p></div>";
model.save();
assertEquals(expectedHtml, renderingService.render("{{includepage page=\"Wiki Home\"/}}",
Syntax.XWIKI_2_0.toIdString(),
Syntax.XHTML_1_0.toIdString(),
false));
}
public void testChildrenMacro() throws Exception {
WikiService wikiService = (WikiService) ExoContainerContext.getCurrentContainer()
.getComponentInstanceOfType(WikiService.class);
Model model = mowService.getModel();
WikiStoreImpl wStore = (WikiStoreImpl) model.getWikiStore();
WikiContainer<PortalWiki> portalWikiContainer = wStore.getWikiContainer(WikiType.PORTAL);
PortalWiki wiki = portalWikiContainer.addWiki("classic");
wiki.getWikiHome();
model.save();
wikiService.createPage(PortalConfig.PORTAL_TYPE, "classic", "samplePage", "WikiHome");
wikiService.createPage(PortalConfig.PORTAL_TYPE, "classic", "childPage1", "samplePage");
wikiService.createPage(PortalConfig.PORTAL_TYPE, "classic", "childPage2", "samplePage");
wikiService.createPage(PortalConfig.PORTAL_TYPE, "classic", "testPage", "childPage1");
Execution ec = renderingService.getExecution();
WikiContext wikiContext = (WikiContext) ec.getContext().getProperty(WikiContext.WIKICONTEXT);
wikiContext.setPageId("samplePage");
ec.getContext().setProperty(WikiContext.WIKICONTEXT, wikiContext);
String xwikiExpectedHtml = "<div><ul><li><span class=\"wikilink\"><a href=\"http://localhost:8080/portal/classic/wiki/childPage1\">childPage1</a></span><ul><li><span class=\"wikilink\"><a href=\"http://localhost:8080/portal/classic/wiki/testPage\">testPage</a></span><ul></ul></li></ul></li><li><span class=\"wikilink\"><a href=\"http://localhost:8080/portal/classic/wiki/childPage2\">childPage2</a></span><ul></ul></li></ul></div>";
assertEquals(xwikiExpectedHtml, renderingService.render("{{children descendant=\"true\"/}}",
Syntax.XWIKI_2_0.toIdString(),
Syntax.XHTML_1_0.toIdString(),
false));
}
public void testRenderPageTreeMacro() throws Exception {
WikiService wikiService = (WikiService) ExoContainerContext.getCurrentContainer()
.getComponentInstanceOfType(WikiService.class);
Model model = mowService.getModel();
WikiStoreImpl wStore = (WikiStoreImpl) model.getWikiStore();
WikiContainer<PortalWiki> portalWikiContainer = wStore.getWikiContainer(WikiType.PORTAL);
PortalWiki wiki = portalWikiContainer.addWiki("classic");
wiki.getWikiHome();
model.save();
wikiService.createPage(PortalConfig.PORTAL_TYPE, "classic", "rootPage", "WikiHome");
wikiService.createPage(PortalConfig.PORTAL_TYPE, "classic", "testPageTree1", "rootPage");
wikiService.createPage(PortalConfig.PORTAL_TYPE, "classic", "testPageTree2", "rootPage");
wikiService.createPage(PortalConfig.PORTAL_TYPE, "classic", "testPageTree11", "testPageTree1");
Execution ec = renderingService.getExecution();
WikiContext wikiContext = (WikiContext) ec.getContext().getProperty(WikiContext.WIKICONTEXT);
wikiContext.setPageId("rootPage");
ec.getContext().setProperty(WikiContext.WIKICONTEXT, wikiContext);
StringBuilder xwikiExpectedHtml = new StringBuilder();
xwikiExpectedHtml.append("<div class=\"UITreeExplorer\" id =\"PageTree123\">")
.append(" <div>")
.append(" <input class=\"ChildrenURL\" type=\"hidden\" value=\"/wiki/tree/children/\" />")
.append(" <a class=\"SelectNode\" style=\"display:none\" href=\"http://localhost:8080/portal/classic/\" ></a>")
.append(" <div class=\"NodeGroup\">")
.append(" <script type=\"text/javascript\">")
.append(" function initTree(){eXo.wiki.UITreeExplorer.init(\"PageTree123\",\"?path=portal/classic/rootPage&excerpt=false&depth=\",false );}")
.append(" var isInIFrame = (window.location != window.parent.location) ? true : false;")
.append(" if (isInIFrame) {")
.append(" if (window.attachEvent) {window.attachEvent('onload', initTree);}")
.append(" else if (window.addEventListener) {window.addEventListener('load', initTree, false);}")
.append(" else {document.addEventListener('load', initTree, false);}")
.append(" }")
.append(" else { eXo.core.Browser.addOnLoadCallback(\"initPageTree123\",initTree);}")
.append(" </script>")
.append(" </div>")
.append(" </div>")
.append("</div>");
assertEquals(xwikiExpectedHtml.toString(), renderingService.render("{{pagetree /}}",
Syntax.XWIKI_2_0.toIdString(),
Syntax.XHTML_1_0.toIdString(),
false));
}
public void testExcerptMacro() throws Exception {
String expectedHtml = "<div style=\"display: block\" class=\"ExcerptClass\"><div class=\"box tipmessage\">Test excerpt</div></div>";
assertEquals(expectedHtml, renderingService.render("{{excerpt}}{{tip}}Test excerpt{{/tip}}{{/excerpt}}",
Syntax.XWIKI_2_0.toIdString(),
Syntax.XHTML_1_0.toIdString(),
false));
}
public void testRenderAnchorMacro() throws Exception {
String expectedHtml = "<span class=\"wikilink\"><a name=\"Hlevel1\" href=\"#Hlevel1\">level1</a></span>";
assertEquals(expectedHtml, renderingService.render("{{anchor name=\"level1\" /}}",
Syntax.XWIKI_2_0.toIdString(),
Syntax.XHTML_1_0.toIdString(),
false));
}
public void testRenderDivMacro() throws Exception {
String expectedHtml = "<p style=\"text-align:left;color:red\">example div macro</p>";
String outputConfluence = renderingService.render("{div:style=\"text-align:left;color:red\"}example div macro{div}",
Syntax.CONFLUENCE_1_0.toIdString(),
Syntax.XHTML_1_0.toIdString(),
false);
assertEquals(expectedHtml, outputConfluence);
String outputXwiki = renderingService.render("{{div style=\"text-align:left;color:red\"}}example div macro{{/div}}",
Syntax.XWIKI_2_0.toIdString(),
Syntax.XHTML_1_0.toIdString(),
false);
assertEquals(expectedHtml, outputXwiki);
}
public void testRenderSpanMacro() throws Exception {
String expectedHtml = "<span style=\"font:12pt;color:red\">example span macro</span>";
String outputConfluence = renderingService.render("{span:style=\"font:12pt;color:red\"}example span macro{span}",
Syntax.CONFLUENCE_1_0.toIdString(),
Syntax.XHTML_1_0.toIdString(),
false);
assertEquals(expectedHtml, outputConfluence);
String outputXwiki = renderingService.render("{{span style=\"font:12pt;color:red\"}}example span macro{{/span}}",
Syntax.XWIKI_2_0.toIdString(),
Syntax.XHTML_1_0.toIdString(),
false);
assertEquals(expectedHtml, outputXwiki);
}
private void setupDefaultWikiContext() throws ComponentLookupException, ComponentRepositoryException {
Execution ec = renderingService.getExecution();
ec.setContext(new ExecutionContext());
WikiContext wikiContext = new WikiContext();
wikiContext.setPortalURL("http://localhost:8080/portal/classic/");
wikiContext.setTreeRestURI("/wiki/tree/children/");
wikiContext.setRedirectURI("http://localhost:8080/portal/classic/");
wikiContext.setPortletURI("wiki");
wikiContext.setType("portal");
wikiContext.setOwner("classic");
wikiContext.setPageId("WikiHome");
wikiContext.setPageTreeId("123");
ec.getContext().setProperty(WikiContext.WIKICONTEXT, wikiContext);
}
}