package games.strategy.util; import java.net.URL; import java.util.regex.Matcher; import java.util.regex.Pattern; import games.strategy.triplea.ResourceLoader; import games.strategy.triplea.ui.AbstractUIContext; public class LocalizeHTML { public static final String ASSET_IMAGE_FOLDER = "doc/images/"; public static final String ASSET_IMAGE_NOT_FOUND = "notFound.png"; /* * You would think that there would be a single standardized REGEX for pulling html links out of <img> tags and <a> * tags. * But there isn't, and the internet seems to give million different answers, none of which work perfectly. * So here are the best one I could find. * Regex's found at http://www.mkyong.com/ */ /* * Match an <a></a> tag. * ( # start of group #1 * ?i # all checking are case insensive * ) # end of group #1 * <a # start with "<a" * ( # start of group #2 * [^>]+ # anything except (">"), at least one character * ) # end of group #2 * > # follow by ">" * (.*?) # match anything * </a> # end with "</a> */ public static final String PATTERN_HTML_A_TAG = "(?i)<a([^>]+)>(.*?)</a>"; /* * Match the href attribute. * \s* # can start with whitespace * (?i) # all checking are case insensive * href # follow by "href" word * \s*=\s* # allows spaces on either side of the equal sign, * ( # start of group #1 * "([^"]*") # allow string with double quotes enclosed - "string" * | # ..or * '[^']*' # allow string with single quotes enclosed - 'string' * | # ..or * ([^'">]+) # can't contains one single quotes, double quotes ">" * ) # end of group #1 */ public static final String PATTERN_HTML_A_HREF_TAG = "\\s*(?i)href\\s*=\\s*(\"([^\"]*\")|'[^']*'|([^'\">\\s]+))"; /* Match the <img /> tag */ public static final String PATTERN_HTML_IMG_TAG = "(?i)<img([^>]+)/>"; /* Match the src attribute */ public static final String PATTERN_HTML_IMG_SRC_TAG = "\\s*(?i)src\\s*=\\s*(\"([^\"]*\")|'[^']*'|([^'\">\\s]+))"; /** * This is only useful once we are IN a game. Before we go into the game, resource loader will either be null, or be * the last game's * resource loader. */ public static String localizeImgLinksInHTML(final String htmlText) { return localizeImgLinksInHTML(htmlText, AbstractUIContext.getResourceLoader(), null); } public static String localizeImgLinksInHTML(final String htmlText, final ResourceLoader resourceLoader, final String mapNameDir) { if (htmlText == null || (resourceLoader == null && (mapNameDir == null || mapNameDir.trim().length() == 0))) { return htmlText; } ResourceLoader ourResourceLoader = resourceLoader; String rVal = htmlText; final Pattern patternTag = Pattern.compile(PATTERN_HTML_IMG_TAG); final Pattern patternLink = Pattern.compile(PATTERN_HTML_IMG_SRC_TAG); final Matcher matcherTag = patternTag.matcher(htmlText); Matcher matcherLink; while (matcherTag.find()) { // img tag final String href = matcherTag.group(1); if (href == null) { continue; } matcherLink = patternLink.matcher(href); while (matcherLink.find()) { // src link final String fullLink = matcherLink.group(1); if (fullLink != null && fullLink.length() > 2) { if (ourResourceLoader == null) { ourResourceLoader = ResourceLoader.getMapResourceLoader(mapNameDir); } // remove quotes final String link = fullLink.substring(1, fullLink.length() - 1); // remove full parent path final String imageFileName = link.substring(Math.max((link.lastIndexOf("/") + 1), 0)); // replace when testing with: "REPLACEMENTPATH/" + imageFileName; URL replacementURL = ourResourceLoader.getResource(ASSET_IMAGE_FOLDER + imageFileName); if (replacementURL == null || replacementURL.toString().length() == 0) { System.out.println("Could not find: " + mapNameDir + "/" + ASSET_IMAGE_FOLDER + imageFileName); replacementURL = ourResourceLoader.getResource(ASSET_IMAGE_FOLDER + ASSET_IMAGE_NOT_FOUND); } if (replacementURL == null || replacementURL.toString().length() == 0) { System.err.println("Could not find: " + ASSET_IMAGE_FOLDER + ASSET_IMAGE_NOT_FOUND); continue; } rVal = rVal.replaceAll(link, replacementURL.toString()); } } } return rVal; } }