package org.wikipedia.html; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; import org.jsoup.nodes.Element; import java.util.Collections; import java.util.HashMap; import java.util.Map; public class ImageTagParser { @NonNull private static final String TAG_NAME = "img"; @NonNull private static final String ATTR_SRC = "src"; @NonNull private static final String ATTR_SRC_SET = "srcset"; @NonNull private static final String DEFAULT_DESCRIPTOR = "1x"; @NonNull public String tagName() { return TAG_NAME; } @NonNull public ImageElement parse(@NonNull PixelDensityDescriptorParser descriptorParser, @NonNull Element el) { String src = el.attr(ATTR_SRC); String srcSet = el.attr(ATTR_SRC_SET); return new ImageElement(src, parseSrcSet(descriptorParser, srcSet)); } @NonNull private Map<PixelDensityDescriptor, String> parseSrcSet(@NonNull PixelDensityDescriptorParser descriptorParser, @Nullable String srcSet) { if (StringUtils.isBlank(srcSet)) { return Collections.emptyMap(); } Map<PixelDensityDescriptor, String> srcs = new HashMap<>(); for (String src : srcSet.split(",")) { try { Pair<String, String> urlDescriptor = parseSrc(src.trim()); PixelDensityDescriptor descriptor = descriptorParser.parse(urlDescriptor.getRight()); srcs.put(descriptor, urlDescriptor.getLeft()); } catch (ParseException ignore) { } } return Collections.unmodifiableMap(srcs); } @NonNull private Pair<String, String> parseSrc(@NonNull String src) { String[] urlDescriptor = src.split("\\s"); if (urlDescriptor.length == 0 || StringUtils.isBlank(urlDescriptor[0])) { throw new ParseException("srcset source has no URL"); } String url = urlDescriptor[0]; String descriptor = urlDescriptor.length > 1 ? urlDescriptor[1] : DEFAULT_DESCRIPTOR; return new ImmutablePair<>(url, descriptor); } }