package javacodebook.regex.html;

import java.util.regex.*;
import java.net.*;
import java.io.*;
/**
 * Alle Links (Bilder, externe Scripts, Style-Sheets etc.) 
 * einer HTML-Seite herausfinden und durch einen Visitor 
 * bearbeiten lassen.
 * @author  Mark Donnermeyer
 */
public class LinkProcessor {
    
    public String execute(String content, LinkVisitor visitor) 
            throws IOException {
        
        String resource =
        "(<[^>]*?(href|src) *?= *?['\"](.*?)['\"].*?>)";
        
        // Inhalt der URL in einen String einlesen
        StringBuffer newContent = new StringBuffer();

        // Alle Links herausfinden und vom Visitor bearbeiten lassen.
        Pattern pattern = Pattern.compile(resource, Pattern.CASE_INSENSITIVE);
        Matcher matcher = pattern.matcher(content);
        
        int start = 0;
        while (matcher.find()) {
            String tag = matcher.group(1);
            String link = matcher.group(3);
            boolean href = matcher.group(2).equalsIgnoreCase("href");

            // Der Visitor bearbeitet nun den Link
            String newLink = visitor.processLink(tag,link,href);

            // Wenn null zurückgegeben wird, dann nichts tun.
            if (link == null)
                continue;
            
            // Den neuen Link anhängen. Dazu erst einmal die
            // Position des Link in der alten HTML-Seite finden
            int matchStart = matcher.start(3);
            int matchEnd   = matcher.end(3);
            // Text bis zum Link an die neue HTML-Seite anfügen
            newContent.append(content.substring(start, matchStart));
            // Neuen Link an die neue HTML-Seite anfügen
            newContent.append(newLink);
            // Ende des Link als Anfang des neuen Textes deklarieren
            start = matchEnd;
        }
        // Letzten Teil des Textes aus der alten HTML-Seite
        // in die neue kopieren.
        newContent.append(content.substring(start));

        return newContent.toString();   
    }
}