package org.wordpress.android.ui.reader.utils; import android.net.Uri; import org.wordpress.android.util.StringUtils; import java.util.regex.Matcher; import java.util.regex.Pattern; public class ReaderHtmlUtils { public interface HtmlScannerListener { void onTagFound(String tag, String src); } // regex for matching oriwidth attributes in tags private static final Pattern ORIGINAL_WIDTH_ATTR_PATTERN = Pattern.compile( "data-orig-size\\s*=\\s*(?:'|\")(.*?),.*?(?:'|\")", Pattern.DOTALL|Pattern.CASE_INSENSITIVE); private static final Pattern ORIGINAL_HEIGHT_ATTR_PATTERN = Pattern.compile( "data-orig-size\\s*=\\s*(?:'|\").*?,(.*?)(?:'|\")", Pattern.DOTALL|Pattern.CASE_INSENSITIVE); // regex for matching width attributes in tags private static final Pattern WIDTH_ATTR_PATTERN = Pattern.compile( "width\\s*=\\s*(?:'|\")(.*?)(?:'|\")", Pattern.DOTALL|Pattern.CASE_INSENSITIVE); // regex for matching height attributes in tags private static final Pattern HEIGHT_ATTR_PATTERN = Pattern.compile( "height\\s*=\\s*(?:'|\")(.*?)(?:'|\")", Pattern.DOTALL|Pattern.CASE_INSENSITIVE); // regex for matching src attributes in tags private static final Pattern SRC_ATTR_PATTERN = Pattern.compile( "src\\s*=\\s*(?:'|\")(.*?)(?:'|\")", Pattern.DOTALL|Pattern.CASE_INSENSITIVE); /* * returns the integer value from the data-orig-size attribute in the passed html tag */ public static int getOriginalWidthAttrValue(final String tag) { if (tag == null) { return 0; } Matcher matcher = ORIGINAL_WIDTH_ATTR_PATTERN.matcher(tag); if (matcher.find()) { return StringUtils.stringToInt(matcher.group(1), 0); } else { return 0; } } public static int getOriginalHeightAttrValue(final String tag) { if (tag == null) { return 0; } Matcher matcher = ORIGINAL_HEIGHT_ATTR_PATTERN.matcher(tag); if (matcher.find()) { return StringUtils.stringToInt(matcher.group(1), 0); } else { return 0; } } /* * returns the integer value from the width attribute in the passed html tag */ public static int getWidthAttrValue(final String tag) { if (tag == null) { return 0; } Matcher matcher = WIDTH_ATTR_PATTERN.matcher(tag); if (matcher.find()) { // remove "width=" and quotes from the result return StringUtils.stringToInt(tag.substring(matcher.start() + 7, matcher.end() - 1), 0); } else { return 0; } } public static int getHeightAttrValue(final String tag) { if (tag == null) { return 0; } Matcher matcher = HEIGHT_ATTR_PATTERN.matcher(tag); if (matcher.find()) { return StringUtils.stringToInt(tag.substring(matcher.start() + 8, matcher.end() - 1), 0); } else { return 0; } } /* * returns the value from the src attribute in the passed html tag */ public static String getSrcAttrValue(final String tag) { if (tag == null) { return null; } Matcher matcher = SRC_ATTR_PATTERN.matcher(tag); if (matcher.find()) { // remove "src=" and quotes from the result return tag.substring(matcher.start() + 5, matcher.end() - 1); } else { return null; } } /* * returns the integer value of the passed query param in the passed url - returns zero * if the url is invalid, or the param doesn't exist, or the param value could not be * converted to an int */ public static int getIntQueryParam(final String url, @SuppressWarnings("SameParameterValue") final String param) { if (url == null || param == null || !url.startsWith("http") || !url.contains(param + "=")) { return 0; } return StringUtils.stringToInt(Uri.parse(url).getQueryParameter(param)); } }