|
|
@@ -0,0 +1,734 @@ |
|
|
|
package com.gitblit.wicket; |
|
|
|
|
|
|
|
import static org.junit.Assert.*; |
|
|
|
|
|
|
|
import java.io.IOException; |
|
|
|
import java.util.Collections; |
|
|
|
import java.util.HashMap; |
|
|
|
import java.util.List; |
|
|
|
import java.util.Map; |
|
|
|
|
|
|
|
import com.gitblit.manager.IManager; |
|
|
|
import com.gitblit.manager.IPluginManager; |
|
|
|
import com.gitblit.manager.IRuntimeManager; |
|
|
|
import com.gitblit.models.PluginRegistry; |
|
|
|
import com.gitblit.tests.mock.MockGitblitContext; |
|
|
|
import com.gitblit.tests.mock.MockRuntimeManager; |
|
|
|
import org.apache.wicket.util.tester.WicketTester; |
|
|
|
import org.jsoup.Jsoup; |
|
|
|
import org.jsoup.nodes.Document; |
|
|
|
import org.junit.Before; |
|
|
|
import org.junit.Test; |
|
|
|
|
|
|
|
import com.gitblit.Keys; |
|
|
|
import com.gitblit.tests.mock.MemorySettings; |
|
|
|
import com.gitblit.utils.JSoupXssFilter; |
|
|
|
import com.gitblit.wicket.MarkupProcessor.MarkupDocument; |
|
|
|
import ro.fortsoft.pf4j.PluginState; |
|
|
|
import ro.fortsoft.pf4j.PluginWrapper; |
|
|
|
import ro.fortsoft.pf4j.Version; |
|
|
|
|
|
|
|
public class MarkupProcessorTest |
|
|
|
{ |
|
|
|
private WicketTester tester; |
|
|
|
private MockGitblitContext gbctx; |
|
|
|
|
|
|
|
@Before |
|
|
|
public void setUp() |
|
|
|
{ |
|
|
|
IRuntimeManager rm = new MockRuntimeManager(getSettings()); |
|
|
|
gbctx = new MockGitblitContext(); |
|
|
|
gbctx.addManager(rm); |
|
|
|
tester = new WicketTester(new GitBlitWebApp(null, null, |
|
|
|
rm, |
|
|
|
getPluginManager(), |
|
|
|
null, null, null, |
|
|
|
null, null, null, |
|
|
|
null, null, null)); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
|
* The unit tests for MarkupProcessor have two major goals. |
|
|
|
* One is to check that links are rendered correctly, and |
|
|
|
* the second one is that XSS protection is working. |
|
|
|
* |
|
|
|
* The proper rendering of markup for the various Wiki/Markdown |
|
|
|
* languages is not in focus. This, as a secondary goal, the Wiki/Md |
|
|
|
* syntax rendering can be tested to make sure that when switching to |
|
|
|
* a new or updated wiki syntax library nothing breaks and the pages |
|
|
|
* are still rendered correctly. |
|
|
|
* Or, to make sure things actually render correctly, because currently |
|
|
|
* they don't as cen be seen with reference images and wiki links, |
|
|
|
* for example. |
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
public void testParseMdRepoRelativeLink() |
|
|
|
{ |
|
|
|
MarkupProcessor mp = new MarkupProcessor(getSettings(), new JSoupXssFilter()); |
|
|
|
|
|
|
|
String markup = "link: [a page](file.md)"; |
|
|
|
MarkupDocument mdoc = mp.parse("testrepo", "12345abcde", "main.md", markup); |
|
|
|
Document doc = Jsoup.parseBodyFragment(mdoc.html); |
|
|
|
String href = doc.getElementsByAttribute("href").attr("href"); |
|
|
|
assertEquals("Incorrect link rendered","doc/testrepo/12345abcde/file.md", href); |
|
|
|
} |
|
|
|
|
|
|
|
@Test |
|
|
|
public void testParseMdRepoRelativeLinkSubfolder() |
|
|
|
{ |
|
|
|
String psep ="%2F"; |
|
|
|
MarkupProcessor mp = new MarkupProcessor(getSettings(), new JSoupXssFilter()); |
|
|
|
|
|
|
|
String markup = "link: [a file](folder/file.md)"; |
|
|
|
MarkupDocument mdoc = mp.parse("testrepo", "12345abcde", "main.md", markup); |
|
|
|
Document doc = Jsoup.parseBodyFragment(mdoc.html); |
|
|
|
String href = doc.getElementsByAttribute("href").attr("href"); |
|
|
|
assertEquals("Incorrect link rendered","doc/testrepo/12345abcde/folder"+psep+"file.md", href); |
|
|
|
} |
|
|
|
|
|
|
|
@Test |
|
|
|
public void testParseMdRepoRelativeLinkSubSubfolder() |
|
|
|
{ |
|
|
|
String psep ="%2F"; |
|
|
|
MarkupProcessor mp = new MarkupProcessor(getSettings(), new JSoupXssFilter()); |
|
|
|
|
|
|
|
String markup = "link: [a file](sub/folder/file.md)"; |
|
|
|
MarkupDocument mdoc = mp.parse("testrepo", "12345abcde", "main.md", markup); |
|
|
|
Document doc = Jsoup.parseBodyFragment(mdoc.html); |
|
|
|
String href = doc.getElementsByAttribute("href").attr("href"); |
|
|
|
assertEquals("Incorrect link rendered","doc/testrepo/12345abcde/sub"+psep+"folder"+psep+"file.md", href); |
|
|
|
} |
|
|
|
|
|
|
|
@Test |
|
|
|
public void testParseMdRepoRelativeLinkUtf8() |
|
|
|
{ |
|
|
|
MarkupProcessor mp = new MarkupProcessor(getSettings(), new JSoupXssFilter()); |
|
|
|
|
|
|
|
String markup = "link: [a page](日本語.md)"; |
|
|
|
MarkupDocument mdoc = mp.parse("testrepo", "12345abcde", "main.md", markup); |
|
|
|
Document doc = Jsoup.parseBodyFragment(mdoc.html); |
|
|
|
String href = doc.getElementsByAttribute("href").attr("href"); |
|
|
|
assertEquals("Incorrect link rendered","doc/testrepo/12345abcde/%E6%97%A5%E6%9C%AC%E8%AA%9E.md", href); |
|
|
|
} |
|
|
|
|
|
|
|
@Test |
|
|
|
public void testParseMdRepoRelativeLinkSubfolderUtf8() |
|
|
|
{ |
|
|
|
String psep ="%2F"; |
|
|
|
MarkupProcessor mp = new MarkupProcessor(getSettings(), new JSoupXssFilter()); |
|
|
|
|
|
|
|
String markup = "link: [a file](folder/receitas_de_culinária/file.md)"; |
|
|
|
MarkupDocument mdoc = mp.parse("testrepo", "12345abcde", "main.md", markup); |
|
|
|
Document doc = Jsoup.parseBodyFragment(mdoc.html); |
|
|
|
String href = doc.getElementsByAttribute("href").attr("href"); |
|
|
|
assertEquals("Incorrect link rendered","doc/testrepo/12345abcde/folder"+psep+"receitas_de_culin%C3%A1ria"+psep+"file.md", href); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
public void testParseMdExternalLink() |
|
|
|
{ |
|
|
|
MarkupProcessor mp = new MarkupProcessor(getSettings(), new JSoupXssFilter()); |
|
|
|
|
|
|
|
String markup = "link: [a website](http://example.com/page.html)"; |
|
|
|
MarkupDocument mdoc = mp.parse("testrepo", "12345abcde", "main.md", markup); |
|
|
|
Document doc = Jsoup.parseBodyFragment(mdoc.html); |
|
|
|
String href = doc.getElementsByAttribute("href").attr("href"); |
|
|
|
assertEquals("Incorrect link rendered","http://example.com/page.html", href); |
|
|
|
} |
|
|
|
|
|
|
|
@Test |
|
|
|
public void testParseMdExternalLinkBare() |
|
|
|
{ |
|
|
|
MarkupProcessor mp = new MarkupProcessor(getSettings(), new JSoupXssFilter()); |
|
|
|
|
|
|
|
String markup = "link: <http://example.com/page.html>"; |
|
|
|
MarkupDocument mdoc = mp.parse("testrepo", "12345abcde", "main.md", markup); |
|
|
|
Document doc = Jsoup.parseBodyFragment(mdoc.html); |
|
|
|
String href = doc.getElementsByAttribute("href").attr("href"); |
|
|
|
assertEquals("Incorrect link rendered","http://example.com/page.html", href); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// We leave it up to the document author to write working links in the document |
|
|
|
@Test |
|
|
|
public void testParseMdExternalLinkUtf8() |
|
|
|
{ |
|
|
|
MarkupProcessor mp = new MarkupProcessor(getSettings(), new JSoupXssFilter()); |
|
|
|
|
|
|
|
String markup = "link: [Japanese](http://example.com/lang/日本語.html)"; |
|
|
|
MarkupDocument mdoc = mp.parse("testrepo", "12345abcde", "main.md", markup); |
|
|
|
Document doc = Jsoup.parseBodyFragment(mdoc.html); |
|
|
|
String href = doc.getElementsByAttribute("href").attr("href"); |
|
|
|
assertEquals("Incorrect link rendered","http://example.com/lang/日本語.html", href); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
public void testParseMdRepoRelativeRefLink() |
|
|
|
{ |
|
|
|
MarkupProcessor mp = new MarkupProcessor(getSettings(), new JSoupXssFilter()); |
|
|
|
|
|
|
|
String markup = "link: [a page][1]\n\n[1]: file.md"; |
|
|
|
MarkupDocument mdoc = mp.parse("testrepo", "12345abcde", "main.md", markup); |
|
|
|
Document doc = Jsoup.parseBodyFragment(mdoc.html); |
|
|
|
String href = doc.getElementsByAttribute("href").attr("href"); |
|
|
|
assertEquals("Incorrect link rendered","doc/testrepo/12345abcde/file.md", href); |
|
|
|
} |
|
|
|
|
|
|
|
@Test |
|
|
|
public void testParseMdRepoRelativeRefLinkSubfolder() |
|
|
|
{ |
|
|
|
String psep ="%2F"; |
|
|
|
MarkupProcessor mp = new MarkupProcessor(getSettings(), new JSoupXssFilter()); |
|
|
|
|
|
|
|
String markup = "link: [a file][file]\n\n[file]: folder/file.md"; |
|
|
|
MarkupDocument mdoc = mp.parse("testrepo", "12345abcde", "main.md", markup); |
|
|
|
Document doc = Jsoup.parseBodyFragment(mdoc.html); |
|
|
|
String href = doc.getElementsByAttribute("href").attr("href"); |
|
|
|
assertEquals("Incorrect link rendered","doc/testrepo/12345abcde/folder"+psep+"file.md", href); |
|
|
|
} |
|
|
|
|
|
|
|
@Test |
|
|
|
public void testParseMdRepoRelativeRefLinkSubSubfolder() |
|
|
|
{ |
|
|
|
String psep ="%2F"; |
|
|
|
MarkupProcessor mp = new MarkupProcessor(getSettings(), new JSoupXssFilter()); |
|
|
|
|
|
|
|
String markup = "link: [a file][l1] \n\n[l1]: sub/folder/file.md"; |
|
|
|
MarkupDocument mdoc = mp.parse("testrepo", "12345abcde", "main.md", markup); |
|
|
|
Document doc = Jsoup.parseBodyFragment(mdoc.html); |
|
|
|
String href = doc.getElementsByAttribute("href").attr("href"); |
|
|
|
assertEquals("Incorrect link rendered","doc/testrepo/12345abcde/sub"+psep+"folder"+psep+"file.md", href); |
|
|
|
} |
|
|
|
|
|
|
|
@Test |
|
|
|
public void testParseMdRepoRelativeRefLinkUtf8() |
|
|
|
{ |
|
|
|
MarkupProcessor mp = new MarkupProcessor(getSettings(), new JSoupXssFilter()); |
|
|
|
|
|
|
|
String markup = "link: [a page][x]\n\n[x]: 日本語.md"; |
|
|
|
MarkupDocument mdoc = mp.parse("testrepo", "12345abcde", "main.md", markup); |
|
|
|
Document doc = Jsoup.parseBodyFragment(mdoc.html); |
|
|
|
String href = doc.getElementsByAttribute("href").attr("href"); |
|
|
|
assertEquals("Incorrect link rendered","doc/testrepo/12345abcde/%65%E5%67%2C%8A%Ee.md", href); |
|
|
|
} |
|
|
|
|
|
|
|
@Test |
|
|
|
public void testParseMdRepoRelativeRefLinkSubfolderUtf8() |
|
|
|
{ |
|
|
|
String psep ="%2F"; |
|
|
|
MarkupProcessor mp = new MarkupProcessor(getSettings(), new JSoupXssFilter()); |
|
|
|
|
|
|
|
String markup = "link: [a file][xy]\n\n[xy]: folder/receitas_de_culinária/file.md"; |
|
|
|
MarkupDocument mdoc = mp.parse("testrepo", "12345abcde", "main.md", markup); |
|
|
|
Document doc = Jsoup.parseBodyFragment(mdoc.html); |
|
|
|
String href = doc.getElementsByAttribute("href").attr("href"); |
|
|
|
assertEquals("Incorrect link rendered","doc/testrepo/12345abcde/folder"+psep+"receitas_de_culin%C3%A1ria"+psep+"file.md", href); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
public void testParseMdExternalRefLink() |
|
|
|
{ |
|
|
|
MarkupProcessor mp = new MarkupProcessor(getSettings(), new JSoupXssFilter()); |
|
|
|
|
|
|
|
String markup = "link: [a website][ex]\n\n[ex]: http://example.com/page.html"; |
|
|
|
MarkupDocument mdoc = mp.parse("testrepo", "12345abcde", "main.md", markup); |
|
|
|
Document doc = Jsoup.parseBodyFragment(mdoc.html); |
|
|
|
String href = doc.getElementsByAttribute("href").attr("href"); |
|
|
|
assertEquals("Incorrect link rendered","http://example.com/page.html", href); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
|
* Apparently wiki style links currently do not work in Markdown. |
|
|
|
|
|
|
|
@Test |
|
|
|
public void testParseMdWikiLink() |
|
|
|
{ |
|
|
|
MarkupProcessor mp = new MarkupProcessor(getSettings(), new JSoupXssFilter()); |
|
|
|
|
|
|
|
String markup = "link: [[page]]"; |
|
|
|
MarkupDocument mdoc = mp.parse("testrepo", "12345abcde", "main.md", markup); |
|
|
|
Document doc = Jsoup.parseBodyFragment(mdoc.html); |
|
|
|
String href = doc.getElementsByAttribute("href").attr("href"); |
|
|
|
assertEquals("Incorrect link rendered","doc/testrepo/12345abcde/page", href); |
|
|
|
} |
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
public void testParseMdRepoRelativeImage() |
|
|
|
{ |
|
|
|
MarkupProcessor mp = new MarkupProcessor(getSettings(), new JSoupXssFilter()); |
|
|
|
|
|
|
|
String markup = "image: ![a graphic](graphic.gif)"; |
|
|
|
MarkupDocument mdoc = mp.parse("testrepo", "12345abcde", "main.md", markup); |
|
|
|
Document doc = Jsoup.parseBodyFragment(mdoc.html); |
|
|
|
String ref = doc.getElementsByAttribute("src").attr("src"); |
|
|
|
assertFalse("No reference attribute found: " + mdoc.html, ref.isEmpty()); |
|
|
|
assertEquals("Incorrect image src rendered","../raw/testrepo/12345abcde/graphic.gif", ref); |
|
|
|
|
|
|
|
markup = "image: ![a graphic](graphic.gif \"Some graphic\")"; |
|
|
|
mdoc = mp.parse("testrepo", "12345abcde", "main.md", markup); |
|
|
|
doc = Jsoup.parseBodyFragment(mdoc.html); |
|
|
|
ref = doc.getElementsByAttribute("src").attr("src"); |
|
|
|
assertFalse("No reference attribute found: " + mdoc.html, ref.isEmpty()); |
|
|
|
assertEquals("Incorrect image src rendered","../raw/testrepo/12345abcde/graphic.gif", ref); |
|
|
|
} |
|
|
|
|
|
|
|
@Test |
|
|
|
public void testParseMdRepoRelativeImageUtf8() |
|
|
|
{ |
|
|
|
MarkupProcessor mp = new MarkupProcessor(getSettings(), new JSoupXssFilter()); |
|
|
|
|
|
|
|
String markup = "image: ![look the dog](ドッグ.gif)"; |
|
|
|
MarkupDocument mdoc = mp.parse("testrepo", "12345abcde", "main.md", markup); |
|
|
|
Document doc = Jsoup.parseBodyFragment(mdoc.html); |
|
|
|
String ref = doc.getElementsByAttribute("src").attr("src"); |
|
|
|
assertFalse("No reference attribute found: " + mdoc.html, ref.isEmpty()); |
|
|
|
assertEquals("Incorrect image src rendered","../raw/testrepo/12345abcde/%E3%83%89%E3%83%83%E3%82%B0.gif", ref); |
|
|
|
|
|
|
|
markup = "image: ![look the dog](ドッグ.gif \"シーバ\")"; |
|
|
|
mdoc = mp.parse("testrepo", "12345abcde", "main.md", markup); |
|
|
|
doc = Jsoup.parseBodyFragment(mdoc.html); |
|
|
|
ref = doc.getElementsByAttribute("src").attr("src"); |
|
|
|
assertFalse("No reference attribute found: " + mdoc.html, ref.isEmpty()); |
|
|
|
assertEquals("Incorrect image src rendered","../raw/testrepo/12345abcde/%E3%83%89%E3%83%83%E3%82%B0.gif", ref); |
|
|
|
} |
|
|
|
|
|
|
|
@Test |
|
|
|
public void testParseMdRepoRelativeImageSubfolder() |
|
|
|
{ |
|
|
|
String psep ="!"; |
|
|
|
MarkupProcessor mp = new MarkupProcessor(getSettings(), new JSoupXssFilter()); |
|
|
|
|
|
|
|
String markup = "image: ![a graphic](results/graphic.gif)"; |
|
|
|
MarkupDocument mdoc = mp.parse("testrepo", "12345abcde", "main.md", markup); |
|
|
|
Document doc = Jsoup.parseBodyFragment(mdoc.html); |
|
|
|
String ref = doc.getElementsByAttribute("src").attr("src"); |
|
|
|
assertFalse("No reference attribute found: " + mdoc.html, ref.isEmpty()); |
|
|
|
assertEquals("Incorrect image src rendered","../raw/testrepo/12345abcde/results"+psep+"graphic.gif", ref); |
|
|
|
|
|
|
|
markup = "image: ![a graphic](results/graphic.gif \"Some graphic\")"; |
|
|
|
mdoc = mp.parse("testrepo", "12345abcde", "main.md", markup); |
|
|
|
doc = Jsoup.parseBodyFragment(mdoc.html); |
|
|
|
ref = doc.getElementsByAttribute("src").attr("src"); |
|
|
|
assertFalse("No reference attribute found: " + mdoc.html, ref.isEmpty()); |
|
|
|
assertEquals("Incorrect image src rendered","../raw/testrepo/12345abcde/results"+psep+"graphic.gif", ref); |
|
|
|
} |
|
|
|
|
|
|
|
@Test |
|
|
|
public void testParseMdRepoRelativeImageSubfolderUtf8() |
|
|
|
{ |
|
|
|
String psep ="!"; |
|
|
|
MarkupProcessor mp = new MarkupProcessor(getSettings(), new JSoupXssFilter()); |
|
|
|
|
|
|
|
String markup = "image: ![a cat](folder/картинки/cat.jpg)"; |
|
|
|
MarkupDocument mdoc = mp.parse("testrepo", "12345abcde", "main.md", markup); |
|
|
|
Document doc = Jsoup.parseBodyFragment(mdoc.html); |
|
|
|
String ref = doc.getElementsByAttribute("src").attr("src"); |
|
|
|
assertFalse("No reference attribute found: " + mdoc.html, ref.isEmpty()); |
|
|
|
assertEquals("Incorrect image src rendered","../raw/testrepo/12345abcde/folder"+psep+"%D0%BA%D0%B0%D1%80%D1%82%D0%B8%D0%BD%D0%BA%D0%B8"+psep+"cat.jpg", ref); |
|
|
|
|
|
|
|
markup = "image: ![a cat](folder/картинки/cat.jpg \"Кошка\")"; |
|
|
|
mdoc = mp.parse("testrepo", "12345abcde", "main.md", markup); |
|
|
|
doc = Jsoup.parseBodyFragment(mdoc.html); |
|
|
|
ref = doc.getElementsByAttribute("src").attr("src"); |
|
|
|
assertFalse("No reference attribute found: " + mdoc.html, ref.isEmpty()); |
|
|
|
assertEquals("Incorrect image src rendered","../raw/testrepo/12345abcde/folder"+psep+"%D0%BA%D0%B0%D1%80%D1%82%D0%B8%D0%BD%D0%BA%D0%B8"+psep+"cat.jpg", ref); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
public void testParseMdExternalImage() |
|
|
|
{ |
|
|
|
MarkupProcessor mp = new MarkupProcessor(getSettings(), new JSoupXssFilter()); |
|
|
|
|
|
|
|
String markup = "image: ![a cat](http://example.com/cats/meow.jpg)"; |
|
|
|
MarkupDocument mdoc = mp.parse("testrepo", "12345abcde", "main.md", markup); |
|
|
|
Document doc = Jsoup.parseBodyFragment(mdoc.html); |
|
|
|
String ref = doc.getElementsByAttribute("src").attr("src"); |
|
|
|
assertFalse("No reference attribute found: " + mdoc.html, ref.isEmpty()); |
|
|
|
assertEquals("Incorrect image src rendered","http://example.com/cats/meow.jpg", ref); |
|
|
|
|
|
|
|
markup = "image: ![a cat](http://example.com/cats/meow.jpg \"Miau\")"; |
|
|
|
mdoc = mp.parse("testrepo", "12345abcde", "main.md", markup); |
|
|
|
doc = Jsoup.parseBodyFragment(mdoc.html); |
|
|
|
ref = doc.getElementsByAttribute("src").attr("src"); |
|
|
|
assertFalse("No reference attribute found: " + mdoc.html, ref.isEmpty()); |
|
|
|
assertEquals("Incorrect image src rendered","http://example.com/cats/meow.jpg", ref); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
public void testParseMdRepoRelativeRefImage() |
|
|
|
{ |
|
|
|
MarkupProcessor mp = new MarkupProcessor(getSettings(), new JSoupXssFilter()); |
|
|
|
|
|
|
|
String markup = "image: ![a graphic][1]\n\n[1]: graphic.gif"; |
|
|
|
MarkupDocument mdoc = mp.parse("testrepo", "12345abcde", "main.md", markup); |
|
|
|
Document doc = Jsoup.parseBodyFragment(mdoc.html); |
|
|
|
String ref = doc.getElementsByAttribute("src").attr("src"); |
|
|
|
assertFalse("No reference attribute found: " + mdoc.html, ref.isEmpty()); |
|
|
|
assertEquals("Incorrect image src rendered","../raw/testrepo/12345abcde/graphic.gif", ref); |
|
|
|
|
|
|
|
markup = "image: ![a graphic][2]\n\n[2]: graphic.gif \"Some graphic\""; |
|
|
|
mdoc = mp.parse("testrepo", "12345abcde", "main.md", markup); |
|
|
|
doc = Jsoup.parseBodyFragment(mdoc.html); |
|
|
|
ref = doc.getElementsByAttribute("src").attr("src"); |
|
|
|
assertFalse("No reference attribute found: " + mdoc.html, ref.isEmpty()); |
|
|
|
assertEquals("Incorrect image src rendered","../raw/testrepo/12345abcde/graphic.gif", ref); |
|
|
|
} |
|
|
|
|
|
|
|
@Test |
|
|
|
public void testParseMdRepoRelativeRefImageUtf8() |
|
|
|
{ |
|
|
|
MarkupProcessor mp = new MarkupProcessor(getSettings(), new JSoupXssFilter()); |
|
|
|
|
|
|
|
String markup = "image: ![look the dog][1]\n\n[1]: ドッグ.gif"; |
|
|
|
MarkupDocument mdoc = mp.parse("testrepo", "12345abcde", "main.md", markup); |
|
|
|
Document doc = Jsoup.parseBodyFragment(mdoc.html); |
|
|
|
String ref = doc.getElementsByAttribute("src").attr("src"); |
|
|
|
assertFalse("No reference attribute found: " + mdoc.html, ref.isEmpty()); |
|
|
|
assertEquals("Incorrect image src rendered","../raw/testrepo/12345abcde/%E3%83%89%E3%83%83%E3%82%B0.gif", ref); |
|
|
|
|
|
|
|
markup = "image: ![look the dog][1]\n\n[1]: ドッグ.gif \"シーバ\""; |
|
|
|
mdoc = mp.parse("testrepo", "12345abcde", "main.md", markup); |
|
|
|
doc = Jsoup.parseBodyFragment(mdoc.html); |
|
|
|
ref = doc.getElementsByAttribute("src").attr("src"); |
|
|
|
assertFalse("No reference attribute found: " + mdoc.html, ref.isEmpty()); |
|
|
|
assertEquals("Incorrect image src rendered","../raw/testrepo/12345abcde/%E3%83%89%E3%83%83%E3%82%B0.gif", ref); |
|
|
|
} |
|
|
|
|
|
|
|
@Test |
|
|
|
public void testParseMdRepoRelativeRefImageSubfolder() |
|
|
|
{ |
|
|
|
String psep ="!"; |
|
|
|
MarkupProcessor mp = new MarkupProcessor(getSettings(), new JSoupXssFilter()); |
|
|
|
|
|
|
|
String markup = "image: ![a cat][cat]\n\n[cat]: folder/cat.jpg"; |
|
|
|
MarkupDocument mdoc = mp.parse("testrepo", "12345abcde", "main.md", markup); |
|
|
|
Document doc = Jsoup.parseBodyFragment(mdoc.html); |
|
|
|
String ref = doc.getElementsByAttribute("src").attr("src"); |
|
|
|
assertFalse("No reference attribute found: " + mdoc.html, ref.isEmpty()); |
|
|
|
assertEquals("Incorrect image src rendered","../raw/testrepo/12345abcde/folder"+psep+"cat.jpg", ref); |
|
|
|
|
|
|
|
markup = "image: ![a cat][cat]\n\n[cat]: folder/cat.jpg \"Кошка\""; |
|
|
|
mdoc = mp.parse("testrepo", "12345abcde", "main.md", markup); |
|
|
|
doc = Jsoup.parseBodyFragment(mdoc.html); |
|
|
|
ref = doc.getElementsByAttribute("src").attr("src"); |
|
|
|
assertFalse("No reference attribute found: " + mdoc.html, ref.isEmpty()); |
|
|
|
assertEquals("Incorrect image src rendered","../raw/testrepo/12345abcde/folder"+psep+"cat.jpg", ref); |
|
|
|
} |
|
|
|
|
|
|
|
@Test |
|
|
|
public void testParseMdRepoRelativeRefImageSubfolderUtf8() |
|
|
|
{ |
|
|
|
String psep ="!"; |
|
|
|
MarkupProcessor mp = new MarkupProcessor(getSettings(), new JSoupXssFilter()); |
|
|
|
|
|
|
|
String markup = "image: ![a cat][i1]\n\n[i1]: folder/картинки/cat.jpg"; |
|
|
|
MarkupDocument mdoc = mp.parse("testrepo", "12345abcde", "main.md", markup); |
|
|
|
Document doc = Jsoup.parseBodyFragment(mdoc.html); |
|
|
|
String ref = doc.getElementsByAttribute("src").attr("src"); |
|
|
|
assertFalse("No reference attribute found: " + mdoc.html, ref.isEmpty()); |
|
|
|
assertEquals("Incorrect image src rendered","../raw/testrepo/12345abcde/folder"+psep+"%D0%BA%D0%B0%D1%80%D1%82%D0%B8%D0%BD%D0%BA%D0%B8"+psep+"cat.jpg", ref); |
|
|
|
|
|
|
|
markup = "image: ![a cat][i1]\n\n[i1]: folder/картинки/cat.jpg \"Кошка\""; |
|
|
|
mdoc = mp.parse("testrepo", "12345abcde", "main.md", markup); |
|
|
|
doc = Jsoup.parseBodyFragment(mdoc.html); |
|
|
|
ref = doc.getElementsByAttribute("src").attr("src"); |
|
|
|
assertFalse("No reference attribute found: " + mdoc.html, ref.isEmpty()); |
|
|
|
assertEquals("Incorrect image src rendered","../raw/testrepo/12345abcde/folder"+psep+"%D0%BA%D0%B0%D1%80%D1%82%D0%B8%D0%BD%D0%BA%D0%B8"+psep+"cat.jpg", ref); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
public void testParseMdExternalRefImage() |
|
|
|
{ |
|
|
|
MarkupProcessor mp = new MarkupProcessor(getSettings(), new JSoupXssFilter()); |
|
|
|
|
|
|
|
String markup = "image: ![a cat][1]\n\n[1]: http://example.com/cats/meow.jpg"; |
|
|
|
MarkupDocument mdoc = mp.parse("testrepo", "12345abcde", "main.md", markup); |
|
|
|
Document doc = Jsoup.parseBodyFragment(mdoc.html); |
|
|
|
String ref = doc.getElementsByAttribute("src").attr("src"); |
|
|
|
assertFalse("No reference attribute found: " + mdoc.html, ref.isEmpty()); |
|
|
|
assertEquals("Incorrect image src rendered","http://example.com/cats/meow.jpg", ref); |
|
|
|
|
|
|
|
markup = "image: ![a cat][1]\n\n[1]: http://example.com/cats/meow.jpg \"Miau\""; |
|
|
|
mdoc = mp.parse("testrepo", "12345abcde", "main.md", markup); |
|
|
|
doc = Jsoup.parseBodyFragment(mdoc.html); |
|
|
|
ref = doc.getElementsByAttribute("src").attr("src"); |
|
|
|
assertFalse("No reference attribute found: " + mdoc.html, ref.isEmpty()); |
|
|
|
assertEquals("Incorrect image src rendered","http://example.com/cats/meow.jpg", ref); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
public void testParseMediaWikiRepoRelativeLink() |
|
|
|
{ |
|
|
|
MarkupProcessor mp = new MarkupProcessor(getSettings(), new JSoupXssFilter()); |
|
|
|
|
|
|
|
String psep = "%2F"; |
|
|
|
String markup = "link: [[document]]"; |
|
|
|
MarkupDocument mdoc = mp.parse("wikirepo", "12345abcde", "main.mw", markup); |
|
|
|
Document doc = Jsoup.parseBodyFragment(mdoc.html); |
|
|
|
String ref = doc.getElementsByAttribute("href").attr("href"); |
|
|
|
assertFalse("No reference attribute found: " + mdoc.html, ref.isEmpty()); |
|
|
|
assertEquals("Incorrect link href rendered","doc/wikirepo/12345abcde/wiki"+ psep + "document", ref); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
@Test |
|
|
|
public void testParseMediaWikiRepoRelativeLinkUtf8() |
|
|
|
{ |
|
|
|
MarkupProcessor mp = new MarkupProcessor(getSettings(), new JSoupXssFilter()); |
|
|
|
|
|
|
|
String psep = "%2F"; |
|
|
|
String markup = "link: [[日本語]]"; |
|
|
|
MarkupDocument mdoc = mp.parse("wikirepo", "12345abcde", "main.mw", markup); |
|
|
|
Document doc = Jsoup.parseBodyFragment(mdoc.html); |
|
|
|
String href = doc.getElementsByAttribute("href").attr("href"); |
|
|
|
assertEquals("Incorrect link rendered","doc/wikirepo/12345abcde/wiki" + psep + "%E6%97%A5%E6%9C%AC%E8%AA%9E", href); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
public void testParseMediaWikiExternalLink() |
|
|
|
{ |
|
|
|
MarkupProcessor mp = new MarkupProcessor(getSettings(), new JSoupXssFilter()); |
|
|
|
|
|
|
|
String psep = "%2F"; |
|
|
|
String markup = "link: [http://example.com/some/document.html document]"; |
|
|
|
MarkupDocument mdoc = mp.parse("wikirepo", "12345abcde", "main.mw", markup); |
|
|
|
Document doc = Jsoup.parseBodyFragment(mdoc.html); |
|
|
|
String ref = doc.getElementsByAttribute("href").attr("href"); |
|
|
|
assertFalse("No reference attribute found: " + mdoc.html, ref.isEmpty()); |
|
|
|
assertEquals("Incorrect link href rendered","http://example.com/some/document.html", ref); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
@Test |
|
|
|
public void testParseMediaWikiExternalLinkNumbered() |
|
|
|
{ |
|
|
|
MarkupProcessor mp = new MarkupProcessor(getSettings(), new JSoupXssFilter()); |
|
|
|
|
|
|
|
String psep = "%2F"; |
|
|
|
String markup = "link: [http://example.com/some/document.html]"; |
|
|
|
MarkupDocument mdoc = mp.parse("wikirepo", "12345abcde", "main.mw", markup); |
|
|
|
Document doc = Jsoup.parseBodyFragment(mdoc.html); |
|
|
|
String ref = doc.getElementsByAttribute("href").attr("href"); |
|
|
|
assertFalse("No reference attribute found: " + mdoc.html, ref.isEmpty()); |
|
|
|
assertEquals("Incorrect link href rendered","http://example.com/some/document.html", ref); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
@Test |
|
|
|
public void testParseMediaWikiExternalLinkBare() |
|
|
|
{ |
|
|
|
MarkupProcessor mp = new MarkupProcessor(getSettings(), new JSoupXssFilter()); |
|
|
|
|
|
|
|
String psep = "%2F"; |
|
|
|
String markup = "link: http://example.com/some/document.html"; |
|
|
|
MarkupDocument mdoc = mp.parse("wikirepo", "12345abcde", "main.mw", markup); |
|
|
|
Document doc = Jsoup.parseBodyFragment(mdoc.html); |
|
|
|
String ref = doc.getElementsByAttribute("href").attr("href"); |
|
|
|
assertFalse("No reference attribute found: " + mdoc.html, ref.isEmpty()); |
|
|
|
assertEquals("Incorrect link href rendered","http://example.com/some/document.html", ref); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
// We leave it up to the document author to write working links in the document |
|
|
|
@Test |
|
|
|
public void testParseMediaWikiExternalLinkUtf8() |
|
|
|
{ |
|
|
|
MarkupProcessor mp = new MarkupProcessor(getSettings(), new JSoupXssFilter()); |
|
|
|
|
|
|
|
String psep = "%2F"; |
|
|
|
String markup = "link: [http://example.com/lang/日本語.html Japanese]"; |
|
|
|
MarkupDocument mdoc = mp.parse("wikirepo", "12345abcde", "main.mw", markup); |
|
|
|
Document doc = Jsoup.parseBodyFragment(mdoc.html); |
|
|
|
String href = doc.getElementsByAttribute("href").attr("href"); |
|
|
|
assertEquals("Incorrect link rendered","http://example.com/lang/日本語.html", href); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private MemorySettings getSettings() |
|
|
|
{ |
|
|
|
Map<String, Object> backingMap = new HashMap<String, Object>(); |
|
|
|
|
|
|
|
backingMap.put(Keys.web.documents, "readme"); |
|
|
|
backingMap.put(Keys.web.blobEncodings, "UTF-8 ISO-8859-1"); |
|
|
|
backingMap.put(Keys.web.confluenceExtensions, "confluence"); |
|
|
|
backingMap.put(Keys.web.markdownExtensions, "md mkd markdown MD MKD"); |
|
|
|
backingMap.put(Keys.web.mediawikiExtensions, "mw mediawiki"); |
|
|
|
backingMap.put(Keys.web.textileExtensions, "textile"); |
|
|
|
backingMap.put(Keys.web.tracwikiExtensions, "tracwiki"); |
|
|
|
backingMap.put(Keys.web.twikiExtensions, "twiki"); |
|
|
|
backingMap.put(Keys.web.forwardSlashCharacter, "/"); |
|
|
|
backingMap.put(Keys.web.mountParameters, true); |
|
|
|
|
|
|
|
MemorySettings ms = new MemorySettings(backingMap); |
|
|
|
return ms; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private IPluginManager getPluginManager() |
|
|
|
{ |
|
|
|
return new IPluginManager() |
|
|
|
{ |
|
|
|
@Override |
|
|
|
public Version getSystemVersion() |
|
|
|
{ |
|
|
|
return null; |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public void startPlugins() |
|
|
|
{ |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public void stopPlugins() |
|
|
|
{ |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public PluginState startPlugin(String pluginId) |
|
|
|
{ |
|
|
|
return null; |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public PluginState stopPlugin(String pluginId) |
|
|
|
{ |
|
|
|
return null; |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public List<Class<?>> getExtensionClasses(String pluginId) |
|
|
|
{ |
|
|
|
return null; |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public <T> List<T> getExtensions(Class<T> type) |
|
|
|
{ |
|
|
|
return null; |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public List<PluginWrapper> getPlugins() |
|
|
|
{ |
|
|
|
return Collections.emptyList(); |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public PluginWrapper getPlugin(String pluginId) |
|
|
|
{ |
|
|
|
return null; |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public PluginWrapper whichPlugin(Class<?> clazz) |
|
|
|
{ |
|
|
|
return null; |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public boolean disablePlugin(String pluginId) |
|
|
|
{ |
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public boolean enablePlugin(String pluginId) |
|
|
|
{ |
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public boolean uninstallPlugin(String pluginId) |
|
|
|
{ |
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public boolean refreshRegistry(boolean verifyChecksum) |
|
|
|
{ |
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public boolean installPlugin(String url, boolean verifyChecksum) throws IOException |
|
|
|
{ |
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public boolean upgradePlugin(String pluginId, String url, boolean verifyChecksum) throws IOException |
|
|
|
{ |
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public List<PluginRegistry.PluginRegistration> getRegisteredPlugins() |
|
|
|
{ |
|
|
|
return null; |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public List<PluginRegistry.PluginRegistration> getRegisteredPlugins(PluginRegistry.InstallState state) |
|
|
|
{ |
|
|
|
return null; |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public PluginRegistry.PluginRegistration lookupPlugin(String idOrName) |
|
|
|
{ |
|
|
|
return null; |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public PluginRegistry.PluginRelease lookupRelease(String idOrName, String version) |
|
|
|
{ |
|
|
|
return null; |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public IManager start() |
|
|
|
{ |
|
|
|
return null; |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public IManager stop() |
|
|
|
{ |
|
|
|
return null; |
|
|
|
} |
|
|
|
}; |
|
|
|
} |
|
|
|
|
|
|
|
} |