/******************************************************************************* * Copyright (c) 2006-2010 eBay Inc. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 *******************************************************************************/ /******************************************************************************* * Copyright (c) 2007, 2009 David Green and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * David Green - initial API and implementation *******************************************************************************/ package org.ebayopensource.mylyn.wikitext.confluence.core.tasks; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.io.Reader; import java.net.MalformedURLException; import java.net.URL; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.Project; import org.apache.tools.ant.taskdefs.Get; class HtmlSourceImageFetchingStrategy extends ImageFetchingStrategy { private String base; private File src; @Override public void fetchImages() { if (!src.exists()) { throw new BuildException("@src does not exist: " + src); //$NON-NLS-1$ } if (!src.isFile()) { throw new BuildException("@src is not a file: " + src); //$NON-NLS-1$ } if (base == null) { throw new BuildException("Must specify @base"); //$NON-NLS-1$ } if (base.endsWith("/")) { //$NON-NLS-1$ base = base.substring(0, base.length() - 1); } Pattern fragmentUrlPattern = Pattern.compile("src=\"([^\"]+)\""); //$NON-NLS-1$ Pattern imagePattern = Pattern.compile("alt=\"Image:([^\"]*)\"([^>]+)", Pattern.MULTILINE); //$NON-NLS-1$ String htmlSrc; try { htmlSrc = readSrc(); } catch (IOException e) { throw new BuildException("Cannot read src: " + src + ": " + e.getMessage(), e); //$NON-NLS-1$ //$NON-NLS-2$ } log("Parsing " + src, Project.MSG_INFO); //$NON-NLS-1$ int fileCount = 0; Matcher imagePatternMatcher = imagePattern.matcher(htmlSrc); while (imagePatternMatcher.find()) { String alt = imagePatternMatcher.group(1); String imageFragment = imagePatternMatcher.group(2); if (imageFragment != null) { Matcher fragmentUrlMatcher = fragmentUrlPattern.matcher(imageFragment); if (fragmentUrlMatcher.find()) { String url = fragmentUrlMatcher.group(1); String qualifiedUrl = base + url; log("Fetching " + qualifiedUrl, Project.MSG_INFO); //$NON-NLS-1$ Get get = new Get(); get.setProject(getProject()); get.setLocation(getLocation()); try { get.setSrc(new URL(qualifiedUrl)); } catch (MalformedURLException e) { log("Skipping " + url + ": " + e.getMessage(), Project.MSG_WARN); //$NON-NLS-1$ //$NON-NLS-2$ continue; } // note: we use the alt text for the name since for some files there is a case-difference between // the server URL and the text used in the image src of the markup String name = alt == null ? url.substring(url.lastIndexOf('/')) : alt; name = name.replace(' ', '_'); get.setDest(new File(dest, name)); get.execute(); ++fileCount; } } } log("Fetched " + fileCount + " image files for " + src, Project.MSG_INFO); //$NON-NLS-1$ //$NON-NLS-2$ } private String readSrc() throws IOException { StringBuilder buf = new StringBuilder((int) src.length()); Reader reader = new BufferedReader(new FileReader(src)); try { int i; while ((i = reader.read()) != -1) { buf.append((char) i); } } finally { reader.close(); } return buf.toString(); } public String getBase() { return base; } public void setBase(String base) { this.base = base; } public File getSrc() { return src; } public void setSrc(File src) { this.src = src; } }