/*******************************************************************************
* Copyright (c) 2010, 2015 David Green and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* David Green - initial API and implementation
* Torkild U. Resheim - bugs 336592 and 336813
*******************************************************************************/
package org.eclipse.mylyn.wikitext.parser.builder;
import java.io.IOException;
import java.io.StringWriter;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.regex.Pattern;
import org.eclipse.mylyn.wikitext.mediawiki.MediaWikiLanguage;
import org.eclipse.mylyn.wikitext.parser.MarkupParser;
import org.eclipse.mylyn.wikitext.parser.builder.XslfoDocumentBuilder;
import org.eclipse.mylyn.wikitext.parser.outline.OutlineItem;
import org.eclipse.mylyn.wikitext.parser.outline.OutlineParser;
import org.eclipse.mylyn.wikitext.textile.TextileLanguage;
import org.eclipse.mylyn.wikitext.util.DefaultXmlStreamWriter;
import com.google.common.base.Throwables;
import com.google.common.io.Resources;
import junit.framework.TestCase;
/**
* @author David Green
* @author Torkild U. Resheim
*/
public class XslfoDocumentBuilderIntegrationTest extends TestCase {
private StringWriter out;
private XslfoDocumentBuilder documentBuilder;
private MarkupParser parser;
@Override
protected void setUp() throws Exception {
out = new StringWriter();
documentBuilder = new XslfoDocumentBuilder(new DefaultXmlStreamWriter(out));
parser = new MarkupParser();
parser.setBuilder(documentBuilder);
}
// test for bug 304013: [wikitext-to-xslfo] Missing </block> in <static-content>
public void testXslFoNoMissingBlock_bug304013() {
documentBuilder.getConfiguration().setPageNumbering(true);
documentBuilder.getConfiguration().setTitle("Title");
parser.setMarkupLanguage(new MediaWikiLanguage());
parser.parse("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n{{NonExistantTemplate}}\n" + "\n" + "= H1 =\n" + "\n"
+ "== H2 ==\n" + "\n" + "some text");
assertFalse(Pattern.compile("<static-content[^>]*></static-content>").matcher(out.toString()).find());
}
public void testForXslFoBookmarks_bug336592() {
final String markup = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n= Bookmark H1 =\n== Bookmark H2 ==\n";
documentBuilder.getConfiguration().setPageNumbering(true);
documentBuilder.getConfiguration().setTitle("Title");
OutlineItem op = new OutlineParser(new MediaWikiLanguage()).parse(markup);
documentBuilder.setOutline(op);
parser.setMarkupLanguage(new MediaWikiLanguage());
parser.parse(markup, true);
final String xslfo = out.toString();
assertTrue(Pattern.compile(
"<bookmark-tree>\\s*<bookmark internal-destination=\"Bookmark_H1\">\\s*<bookmark-title>Bookmark H1</bookmark-title>\\s*<bookmark internal-destination=\"Bookmark_H2\">\\s*<bookmark-title>Bookmark H2</bookmark-title>\\s*</bookmark>\\s*</bookmark>\\s*</bookmark-tree>")
.matcher(xslfo)
.find());
}
public void testforTableCSSAttributes_bug336813() {
final String markup = "{| style=\"border-style: solid; border-color: #000; border-width: 1px;\"\n" + "|-\n"
+ "! header 1\n" + "! header 2\n" + "! header 3\n" + "|-\n" + "| row 1, cell 1\n" + "| row 1, cell 2\n"
+ "| row 1, cell 3\n" + "|- style=\"border-style: solid; border-color: #000; border-width: 1px;\" \n"
+ "| row 2, cell 1\n" + "| row 2, cell 2\n"
+ "| style=\"border-style: solid; border-color: #000; border-width: 1px;\" | row 2, cell 3\n" + "|}";
documentBuilder.getConfiguration().setPageNumbering(true);
documentBuilder.getConfiguration().setTitle("Title");
OutlineItem op = new OutlineParser(new MediaWikiLanguage()).parse(markup);
documentBuilder.setOutline(op);
parser.setMarkupLanguage(new MediaWikiLanguage());
parser.parse(markup, true);
final String xslfo = out.toString();
// Test for border attributes in table
assertTrue(Pattern.compile("<table-body border-color=\"#000\" border-style=\"solid\" border-width=\"1px\">")
.matcher(xslfo)
.find());
// Test for border attributes in row
assertTrue(Pattern.compile("<table-row border-color=\"#000\" border-style=\"solid\" border-width=\"1px\">")
.matcher(xslfo)
.find());
// Test for border attributes in cell
assertTrue(Pattern.compile(
"<block font-size=\"10.0pt\" border-color=\"#000\" border-style=\"solid\" border-width=\"1px\">")
.matcher(xslfo)
.find());
}
public void testforTableSpan_bug336813() {
final String markup = "{|\n|-\n" + "| Column 1 || Column 2 || Column 3\n" + "|-\n" + "| rowspan=\"2\"| A\n"
+ "| colspan=\"2\" | B\n" + "|-\n" + "| C <!-- column 1 occupied by cell A -->\n" + "| D \n" + "|-\n"
+ "| E\n" + "| rowspan=\"2\" colspan=\"2\" | F\n" + "|- \n"
+ "| G <!-- column 2+3 occupied by cell F -->\n" + "|- \n" + "| colspan=\"3\" | H\n" + "|}";
documentBuilder.getConfiguration().setPageNumbering(true);
documentBuilder.getConfiguration().setTitle("Title");
OutlineItem op = new OutlineParser(new MediaWikiLanguage()).parse(markup);
documentBuilder.setOutline(op);
parser.setMarkupLanguage(new MediaWikiLanguage());
parser.parse(markup, true);
final String xslfo = out.toString();
// Test for rowspan
assertTrue(Pattern.compile(
"<table-cell number-rows-spanned=\"2\" padding-left=\"2pt\" padding-right=\"2pt\" padding-top=\"2pt\" padding-bottom=\"2pt\">")
.matcher(xslfo)
.find());
// Test for colspan
assertTrue(Pattern.compile(
"<table-cell number-columns-spanned=\"2\" padding-left=\"2pt\" padding-right=\"2pt\" padding-top=\"2pt\" padding-bottom=\"2pt\">")
.matcher(xslfo)
.find());
}
public void testforTableRowAlign_bug336813() {
final String markup = "{|\n" + "|- valign=\"top\"\n |'''Row heading'''\n"
+ "| A longer piece of text. Lorem ipsum...\n |A shorter piece of text.\n"
+ "|- style=\"vertical-align: bottom;\"\n |'''Row heading'''\n"
+ "|A longer piece of text. Lorem ipsum... \n |A shorter piece of text.\n" + "|}";
documentBuilder.getConfiguration().setPageNumbering(true);
documentBuilder.getConfiguration().setTitle("Title");
OutlineItem op = new OutlineParser(new MediaWikiLanguage()).parse(markup);
documentBuilder.setOutline(op);
parser.setMarkupLanguage(new MediaWikiLanguage());
parser.parse(markup, true);
final String xslfo = out.toString();
// From "valign" attribute
assertTrue(Pattern.compile("<table-row display-align=\"before\">").matcher(xslfo).find());
// From css styling
assertTrue(Pattern.compile("<table-row display-align=\"after\">").matcher(xslfo).find());
}
public void testforTableCellAlign_bug336813() {
final String markup = "{|\n"
+ "|- \n |'''Row heading'''\n"
+ "| valign=\"top\" | A longer piece of text. Lorem ipsum...\n |A shorter piece of text.\n"
+ "|- \n |'''Row heading'''\n"
+ "| style=\"vertical-align: bottom;\" | A longer piece of text. Lorem ipsum... \n |A shorter piece of text.\n"
+ "|}";
documentBuilder.getConfiguration().setPageNumbering(true);
documentBuilder.getConfiguration().setTitle("Title");
OutlineItem op = new OutlineParser(new MediaWikiLanguage()).parse(markup);
documentBuilder.setOutline(op);
parser.setMarkupLanguage(new MediaWikiLanguage());
parser.parse(markup, true);
final String xslfo = out.toString();
// From "valign" attribute
assertTrue(Pattern.compile("<table-cell display-align=\"before\"").matcher(xslfo).find());
// From css styling
assertTrue(Pattern.compile("<block font-size=\"10.0pt\" display-align=\"after\">").matcher(xslfo).find());
}
public void testforTableCellTextAlign_bug336813() {
final String markup = "{|\n"
+ "|- \n |'''Row heading'''\n"
+ "| align=\"left\" | A longer piece of text. Lorem ipsum...\n |A shorter piece of text.\n"
+ "|- \n |'''Row heading'''\n"
+ "| style=\"text-align: right;\" | A longer piece of text. Lorem ipsum... \n |A shorter piece of text.\n"
+ "|}";
documentBuilder.getConfiguration().setPageNumbering(true);
documentBuilder.getConfiguration().setTitle("Title");
OutlineItem op = new OutlineParser(new MediaWikiLanguage()).parse(markup);
documentBuilder.setOutline(op);
parser.setMarkupLanguage(new MediaWikiLanguage());
parser.parse(markup, true);
final String xslfo = out.toString();
// From "text-align" attribute
assertTrue(Pattern.compile("<table-cell text-align=\"left\"").matcher(xslfo).find());
// From css styling
assertTrue(Pattern.compile("<block font-size=\"10.0pt\" text-align=\"right\">").matcher(xslfo).find());
}
public void testforXslFoLinks() {
final String markup = "\"INTERN-LABEL\":#intern_label\n" + "\"*INTERN-BOLD-LABEL*\":#intern_bold_label\n"
+ "\"EXTERN-LABEL\":http://extern-label.com/\n";
documentBuilder.getConfiguration().setPageNumbering(false);
documentBuilder.getConfiguration().setTitle("Title");
parser.setMarkupLanguage(new TextileLanguage());
parser.parse(markup);
final String xslfo = out.toString();
assertTrue(xslfo.contains("<basic-link internal-destination=\"intern_label\">INTERN-LABEL</basic-link>"));
assertTrue(xslfo.contains("<basic-link internal-destination=\"intern_bold_label\"><inline font-weight=\"bold\">INTERN-BOLD-LABEL</inline></basic-link>"));
assertTrue(xslfo.contains("<basic-link external-destination=\"url(http://extern-label.com/)\">EXTERN-LABEL</basic-link>"));
}
public void testCopyrightExtent() {
documentBuilder.getConfiguration().setCopyright("Test Copyright");
parser.setMarkupLanguage(new TextileLanguage());
parser.parse("test");
assertEquals(resource("testCopyrightExtent.xml"), out.toString());
}
private String resource(String resourceName) {
URL resource = XslfoDocumentBuilderIntegrationTest.class.getResource("resources/"
+ XslfoDocumentBuilderIntegrationTest.class.getSimpleName() + "_" + resourceName);
try {
return Resources.toString(resource, StandardCharsets.UTF_8);
} catch (IOException e) {
throw Throwables.propagate(e);
}
}
}