Universal Wiki Converter
-- improved attachment handling


git-svn-id: https://studio.plugins.atlassian.com/svn/UWC/devel@165794 2c54a935-e501-0410-bc05-97a93f6bca70
diff --git a/conf/converter.trac.properties b/conf/converter.trac.properties
index 90e928b..959cf60 100644
--- a/conf/converter.trac.properties
+++ b/conf/converter.trac.properties
@@ -58,8 +58,9 @@
 Trac.0508-restore_single_quotes.java-regex=XXXSINGLEQUOTE4711XXX{replace-with}'
 
 # Macros: Images, line breaks and generic
-Trac.0600-macro_image_on_other_page.java-regex=(?i)\[\[Image\(wiki:([^:]+):([^\)]+)\)\]\]{replace-with}[[Image($1^$2)]]
-Trac.0601-macro_image_attachment.java-regex=(?i)\[\[Image\(([^\)]+)\)\]\]{replace-with}!$1!
+Trac.0600-macro_image_attachment_external.java-regex=(?i)\[\[Image\(http(?:.*?)raw-attachment\/wiki\/([^\)]+)\)\]\]{replace-with}!$1!
+Trac.0601-macro_image_on_other_page.java-regex=(?i)\[\[Image\(wiki:([^:]+):([^\)]+)\)\]\]{replace-with}[[Image($1^$2)]]
+Trac.0602-macro_image_attachment.java-regex=(?i)\[\[Image\(([^\)]+)\)\]\]{replace-with}!$1!
 Trac.0640-pageoutline-toc.java-regex=(?i)\[\[PageOutline(\([^\)]+\))?\]\]{replace-with}{toc}
 Trac.0650-macro_br.java-regex=(?i)\[\[BR\]\] ?{replace-with}NEWLINE
 Trac.0660-doublebracket-links.java-regex=\[{2}([^\]]+)\]{2}{replace-with}[$1]
diff --git a/sampleData/trac/SampleTrac-ExpectedImage.txt b/sampleData/trac/SampleTrac-ExpectedImage.txt
new file mode 100644
index 0000000..8be97cb
--- /dev/null
+++ b/sampleData/trac/SampleTrac-ExpectedImage.txt
@@ -0,0 +1,11 @@
+
+Embed attached images
+!myImage.png!
+
+different wiki pages: 
+!WikiFormatting^picture.gif!
+!WikiToc^toc.gif!
+
+external link (but still internal image)
+!PageTitle^file.png!
+!Subpage^file.png!
diff --git a/sampleData/trac/SampleTrac-InputImage.txt b/sampleData/trac/SampleTrac-InputImage.txt
new file mode 100644
index 0000000..25f672a
--- /dev/null
+++ b/sampleData/trac/SampleTrac-InputImage.txt
@@ -0,0 +1,11 @@
+
+Embed attached images
+[[Image(myImage.png)]]
+
+different wiki pages: 
+[[Image(wiki:WikiFormatting:picture.gif)]]
+[[Image(wiki:WikiToc:toc.gif)]]
+
+external link (but still internal image)
+[[Image(https://mytrac.com/context/raw-attachment/wiki/PageTitle/file.png)]]
+[[Image(https://mytrac.com/context/raw-attachment/wiki/PageTitle/Subpage/file.png)]]
diff --git a/sampleData/trac/testall.sh b/sampleData/trac/testall.sh
index f051651..6e17226 100755
--- a/sampleData/trac/testall.sh
+++ b/sampleData/trac/testall.sh
@@ -12,3 +12,6 @@
 echo "Macros"
 ./compare.sh Macros
 
+echo "Image"
+./compare.sh Image
+
diff --git a/src/com/atlassian/uwc/converters/trac/FilenameHierarchyLinkConverter.java b/src/com/atlassian/uwc/converters/trac/FilenameHierarchyLinkConverter.java
index 421ad93..9ce34d9 100644
--- a/src/com/atlassian/uwc/converters/trac/FilenameHierarchyLinkConverter.java
+++ b/src/com/atlassian/uwc/converters/trac/FilenameHierarchyLinkConverter.java
@@ -13,9 +13,34 @@
 	public void convert(Page page) {
 		String input = page.getOriginalText();
 		String converted = convertLink(input);
+		converted = handleImage(converted);
 		page.setConvertedText(converted);
 	}
 
+	Pattern image = Pattern.compile("!([^!\n]+)!");
+	protected String handleImage(String input) {
+		Matcher imageFinder = image.matcher(input);
+		StringBuffer sb = new StringBuffer();
+		boolean found = false;
+		while (imageFinder.find()) {
+			found = true;
+			String image = imageFinder.group(1);
+			if (!image.contains("/")) continue;
+			String[] parts = image.split("\\/");
+			if (parts.length < 2) continue;
+			String pagetitle = parts[parts.length-2];
+			String file = parts[parts.length-1];
+			String replacement = "!" + pagetitle + "^" + file + "!";
+			replacement = RegexUtil.handleEscapesInReplacement(replacement);
+			imageFinder.appendReplacement(sb, replacement);
+		}
+		if (found) {
+			imageFinder.appendTail(sb);
+			return sb.toString();
+		}
+		return input;
+	}
+
 	Pattern link = Pattern.compile("\\[([^\\]]+)\\]");
 	protected String convertLink(String input) {
 		Matcher linkFinder = link.matcher(input);
diff --git a/src/com/atlassian/uwc/converters/trac/FilenameHierarchyLinkConverterTest.java b/src/com/atlassian/uwc/converters/trac/FilenameHierarchyLinkConverterTest.java
index 0b3c67e..ae39e0f 100644
--- a/src/com/atlassian/uwc/converters/trac/FilenameHierarchyLinkConverterTest.java
+++ b/src/com/atlassian/uwc/converters/trac/FilenameHierarchyLinkConverterTest.java
@@ -73,5 +73,29 @@
 		assertEquals(expected, actual);
 	}
 
+	public void testConvertLinks_handleimage() {
+		String input, expected, actual;
+		input = "!PageTitle/file.png!\n" + 
+				"!PageTitle/Subpage/file.png!\n" + 
+				"";
+		expected = "!PageTitle^file.png!\n" + 
+				"!Subpage^file.png!\n" +
+				"";
+		actual = tester.handleImage(input);
+		assertNotNull(actual);
+		assertEquals(expected, actual);
 
+	}
+	
+	public void testConvertLinks_nothtmlcomment() {
+		String input, expected, actual;
+		input = "<!--PageTitle/file.png-->\n" + 
+				"<!--lalala-->";
+		expected = input;
+		actual = tester.handleImage(input);
+		assertNotNull(actual);
+		assertEquals(expected, actual);
+
+	}
+	
 }