CopyAndInlineStylesheet.java

/* *******************************************************************
 * Copyright (c) 1999-2001 Xerox Corporation,
 *               2002 Palo Alto Research Center, Incorporated (PARC).
 * All rights reserved.
 * This program and the accompanying materials are made available
 * under the terms of the Eclipse Public License v 2.0
 * which accompanies this distribution and is available at
 * https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.txt
 *
 * Contributors:
 *     Xerox/PARC     initial implementation
 * ******************************************************************/

package org.aspectj.internal.tools.ant.taskdefs;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintStream;

import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Task;
import org.apache.tools.ant.taskdefs.Mkdir;

public class CopyAndInlineStylesheet extends Task {

    private File file;
    public void setFile(String file) {
        this.file = project.resolveFile(file);
    }

    private File todir;
    public void setTodir(String todir) {
        this.todir = project.resolveFile(todir);
    }


    public void execute() throws BuildException {
        try {
            if (todir == null) {
                throw new BuildException("must set 'todir' attribute");
            }
            if (file == null) {
                throw new BuildException("must set 'file' attribute");
            }
            log("copying html from" + file + " to " + todir.getAbsolutePath());

            File toFile = new File(todir, file.getName());

            Mkdir mkdir = (Mkdir) project.createTask("mkdir");
            mkdir.setDir(todir);
            mkdir.execute();

            BufferedReader in = new BufferedReader(new FileReader(file));
            PrintStream out = new PrintStream(new FileOutputStream(toFile));

        outer:
            while (true) {
                String line = in.readLine();
                if (line == null) break;
                if (isStyleSheet(line)) {
                    doStyleSheet(line, out, file);
                    while (true) {
                        String line2 = in.readLine();
                        if (line2 == null) break outer;
                        out.println(line2);
                    }
                } else {
                    out.println(line);
                }
            }

            in.close();
            out.close();
        } catch (IOException e) {
            throw new BuildException(e.getMessage());
        }
    }

    private static void doStyleSheet(String line, PrintStream out, File file) throws IOException {
        int srcIndex = line.indexOf("href");
        int startQuotIndex = line.indexOf('"', srcIndex);
        int endQuotIndex = line.indexOf('"', startQuotIndex + 1);

        String stylesheetLocation = line.substring(startQuotIndex + 1, endQuotIndex);

        File styleSheetFile = new File(file.getParent(), stylesheetLocation);

        out.println("<style type=\"text/css\">");
        out.println("<!--");

        BufferedReader inStyle = new BufferedReader(new FileReader(styleSheetFile));

        while (true) {
            String line2 = inStyle.readLine();
            if (line2 == null) break;
            out.println(line2);
        }
        inStyle.close();

        out.println("-->");
        out.println("</style>");
    }


    private static boolean isStyleSheet(String line) throws IOException {
        line = line.toLowerCase();
        int len = line.length();
        int i = 0;

        while (true) {
            if (i == len) return false;
            if (! Character.isWhitespace(line.charAt(i))) break;
        }

        return line.startsWith("<link", i);
    }
}