PageRenderTime 22ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 0ms

/src/com/atlassian/uwc/converters/twiki/ImageConverter.java

https://bitbucket.org/atlassianlabs/universal-wiki-connector
Java | 227 lines | 210 code | 16 blank | 1 comment | 30 complexity | 9f60f371909532faeab0c07be644d01c MD5 | raw file
  1. package com.atlassian.uwc.converters.twiki;
  2. import java.util.HashMap;
  3. import java.util.Iterator;
  4. import java.util.regex.Matcher;
  5. import java.util.regex.Pattern;
  6. import com.atlassian.uwc.converters.tikiwiki.RegexUtil;
  7. import com.atlassian.uwc.ui.Page;
  8. public class ImageConverter extends PropertyConverter {
  9. public void convert(Page page) {
  10. String input = page.getOriginalText();
  11. String converted = convertImage(input);
  12. page.setConvertedText(converted);
  13. }
  14. protected String convertImage(String input) {
  15. input = convertHtmlImage(input);
  16. input = convertPlainImage(input);
  17. input = convertPlainLink(input);
  18. return input;
  19. }
  20. Pattern htmlImage = Pattern.compile("<img([^>]*?)src=\"([^\"]+)\"([^>]+)>");
  21. Pattern lastSlash = Pattern.compile("^(.*)\\/([^/]+)$");
  22. private String convertHtmlImage(String input) {
  23. HashMap<String,String> removes = getRemovals();
  24. Matcher htmlImageFinder = htmlImage.matcher(input);
  25. StringBuffer sb = new StringBuffer();
  26. boolean found = false;
  27. while (htmlImageFinder.find()) {
  28. found = true;
  29. String src = htmlImageFinder.group(2);
  30. for (Iterator iter = removes.keySet().iterator(); iter.hasNext();) {
  31. String remove = removes.get((String) iter.next());
  32. src = src.replaceAll("\\Q" + remove + "\\E", "");
  33. }
  34. Matcher slashFinder = lastSlash.matcher(src);
  35. if (slashFinder.find()) {
  36. src = slashFinder.group(1) + "^" + slashFinder.group(2);
  37. slashFinder = lastSlash.matcher(src); //in case we have a slash between web and page
  38. if (slashFinder.find()) {
  39. src = slashFinder.group(1) + ":" + slashFinder.group(2);
  40. }
  41. }
  42. String attributes = htmlImageFinder.group(1).trim() + " " + htmlImageFinder.group(3).trim();
  43. attributes = convertImageAttributes(attributes);
  44. String replacement = "!" + src + attributes + "!";
  45. replacement = RegexUtil.handleEscapesInReplacement(replacement);
  46. htmlImageFinder.appendReplacement(sb, replacement);
  47. }
  48. if (found) {
  49. htmlImageFinder.appendTail(sb);
  50. return sb.toString();
  51. }
  52. return input;
  53. }
  54. Pattern attributes = Pattern.compile("" +
  55. "(\\w+=)[\"']?([^ \"']+)[\"' ] ?");
  56. private String convertImageAttributes(String input) {
  57. input = input.replaceAll("[/]\\s*$", "");
  58. input = input.trim();
  59. Matcher attFinder = attributes.matcher(input);
  60. StringBuffer sb = new StringBuffer();
  61. boolean found = false;
  62. boolean first = true;
  63. while (attFinder.find()) {
  64. found = true;
  65. String key = attFinder.group(1);
  66. String value = attFinder.group(2);
  67. String replacement = (first?"|":", ") + key + "\"" + value + "\"";
  68. replacement = RegexUtil.handleEscapesInReplacement(replacement);
  69. attFinder.appendReplacement(sb, replacement);
  70. first = false;
  71. }
  72. if (found) {
  73. attFinder.appendTail(sb);
  74. return sb.toString();
  75. }
  76. return input;
  77. }
  78. Pattern image = Pattern.compile("(?<!\\[)!?(http://[^|!\n]+[|]?[^!\n]+)!?");
  79. Pattern confpath = Pattern.compile("^([^/]+)\\/(.*)$");
  80. private String convertPlainImage(String input) {
  81. HashMap<String,String> variables = getVars();
  82. HashMap<String,String> removes = getRemovals();
  83. Matcher imageFinder = image.matcher(input);
  84. StringBuffer sb = new StringBuffer();
  85. boolean found = false;
  86. while (imageFinder.find()) {
  87. found = true;
  88. String src = imageFinder.group(1);
  89. String justSrc = src.replaceFirst("[|].*$", "");
  90. if (!hasExtension(justSrc)) continue;
  91. src = src.replaceAll("\\Q" + variables.get("url") + "\\E", "");
  92. src = src.replaceFirst("\\Q" + variables.get("puburl").replaceAll("~UWCTOKENURL~", ""), "");
  93. for (Iterator iter = removes.keySet().iterator(); iter.hasNext();) {
  94. String remove = removes.get((String) iter.next());
  95. src = src.replaceAll("\\Q" + remove + "\\E", "");
  96. }
  97. src = src.replaceFirst("\\?rev=\\d;filename=", "^");
  98. src = src.replaceFirst("^[/]", "");
  99. src = src.replaceFirst("[/]", ":");
  100. String replacement = "!" + src + "!";
  101. Matcher confpathFinder = confpath.matcher(src);
  102. if (confpathFinder.find()) {
  103. String page = confpathFinder.group(1);
  104. String file = confpathFinder.group(2);
  105. replacement = "!" + page + "^" + file + "!";
  106. }
  107. replacement = RegexUtil.handleEscapesInReplacement(replacement);
  108. imageFinder.appendReplacement(sb, replacement);
  109. }
  110. if (found) {
  111. imageFinder.appendTail(sb);
  112. return sb.toString();
  113. }
  114. return input;
  115. }
  116. Pattern imagelink = Pattern.compile("" +
  117. "(?<=\\[\\[)" +
  118. "([^\\]]+)" +
  119. "");
  120. private String convertPlainLink(String input) {
  121. HashMap<String,String> variables = getVars();
  122. HashMap<String,String> removes = getRemovals();
  123. Matcher imagelinkFinder = imagelink.matcher(input);
  124. StringBuffer sb = new StringBuffer();
  125. boolean found = false;
  126. while (imagelinkFinder.find()) {
  127. found = true;
  128. String src = imagelinkFinder.group(1);
  129. if (!hasExtension(src)) continue;
  130. src = src.replaceAll("\\Q" + variables.get("url") + "\\E", "");
  131. src = src.replaceFirst("\\Q" + variables.get("puburl").replaceAll("~UWCTOKENURL~", ""), "");
  132. for (Iterator iter = removes.keySet().iterator(); iter.hasNext();) {
  133. String remove = removes.get((String) iter.next());
  134. src = src.replaceAll("\\Q" + remove + "\\E", "");
  135. }
  136. src = src.replaceFirst("\\?rev=\\d;filename=", "^");
  137. src = removeExtraSlashes(src);
  138. src = src.replaceFirst("[/]", ":");
  139. String replacement = src;
  140. Matcher confpathFinder = confpath.matcher(src);
  141. if (confpathFinder.find()) {
  142. String page = confpathFinder.group(1);
  143. String file = confpathFinder.group(2);
  144. replacement = page + "^" + file;
  145. }
  146. replacement = RegexUtil.handleEscapesInReplacement(replacement);
  147. imagelinkFinder.appendReplacement(sb, replacement);
  148. }
  149. if (found) {
  150. imagelinkFinder.appendTail(sb);
  151. return sb.toString();
  152. }
  153. return input;
  154. }
  155. Pattern extraSlashes = Pattern.compile("^(.*\\/)([^/]+\\/[^/]+\\/[^/]+)$");
  156. private String removeExtraSlashes(String input) {
  157. Matcher extraFinder = extraSlashes.matcher(input);
  158. StringBuffer sb = new StringBuffer();
  159. boolean found = false;
  160. while (extraFinder.find()) {
  161. found = true;
  162. String replacement = extraFinder.group(2);
  163. replacement = RegexUtil.handleEscapesInReplacement(replacement);
  164. extraFinder.appendReplacement(sb, replacement);
  165. }
  166. if (found) {
  167. extraFinder.appendTail(sb);
  168. return sb.toString();
  169. }
  170. //else
  171. input = input.replaceFirst("^[/]", "");
  172. return input;
  173. }
  174. Pattern extPattern = Pattern.compile("\\.([^.]+)$");
  175. private boolean hasExtension(String src) {
  176. HashMap<String,String> extensions = getExtensions();
  177. Matcher extFinder = extPattern.matcher(src);
  178. boolean extfound = false;
  179. if (extFinder.find()) {
  180. String extension = extFinder.group(1);
  181. for (Iterator iter = extensions.keySet().iterator(); iter.hasNext();) {
  182. String extString = extensions.get((String) iter.next());
  183. String[] extArray = extString.split(",");
  184. for (int i = 0; i < extArray.length; i++) {
  185. String e = extArray[i];
  186. if (e.equals(extension)) extfound = true;
  187. }
  188. if (extfound) break;
  189. }
  190. }
  191. return extfound;
  192. }
  193. HashMap<String, String> vars;
  194. private HashMap<String, String> getVars() {
  195. if (vars == null)
  196. vars = getPropsWithPrefix("vars-");
  197. return vars;
  198. }
  199. HashMap<String, String> ext;
  200. private HashMap<String, String> getExtensions() {
  201. if (ext == null)
  202. ext = getPropsWithPrefix("extensions-");
  203. return ext;
  204. }
  205. HashMap<String, String> removes;
  206. private HashMap<String, String> getRemovals() {
  207. if (removes == null)
  208. removes = getPropsWithPrefix("remove-twiki-path-");
  209. return removes;
  210. }
  211. }