package org.jabref.gui.fieldeditors;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Pattern;
import org.jabref.logic.formatter.bibtexfields.HtmlToUnicodeFormatter;
import org.jabref.logic.util.OS;
/**
Based on http://newsgroups.derkeiler.com/Archive/De/de.comp.lang.java/2010-04/msg00203.html
*/
public class HtmlTransferable implements Transferable {
public static final DataFlavor HTML_FLAVOR = new DataFlavor("text/html;charset=utf-8;class=java.lang.String", "HTML Format");
public static final DataFlavor TEXT_FLAVOR = DataFlavor.stringFlavor;
private static final List<DataFlavor> ALL_FLAVORS = Arrays.asList(HTML_FLAVOR, DataFlavor.allHtmlFlavor, TEXT_FLAVOR);
private static final Pattern HTML_NEWLINE = Pattern.compile(" ?<br>|<BR>");
private static final Pattern REMOVE_HTML = Pattern.compile("<(?!br)(?!BR).*?>");
private static final Pattern WHITESPACE_AROUND_NEWLINE = Pattern.compile("(?m)^\\s+|\\v+");
private static final Pattern DOUBLE_WHITESPACES = Pattern.compile("[ ]{2,}");
private final String htmlText;
private final String plainText;
public HtmlTransferable(String html) {
this.htmlText = html;
// convert html to text by stripping out HTML
String plain = html;
plain = REMOVE_HTML.matcher(plain).replaceAll(" ");
plain = WHITESPACE_AROUND_NEWLINE.matcher(plain).replaceAll("");
plain = DOUBLE_WHITESPACES.matcher(plain).replaceAll(" ");
plain = HTML_NEWLINE.matcher(plain).replaceAll(OS.NEWLINE);
// replace all HTML codes such as &
plain = new HtmlToUnicodeFormatter().format(plain);
this.plainText = plain.trim();
}
public HtmlTransferable(String htmlText, String plainText) {
this.htmlText = htmlText;
this.plainText = plainText;
}
@Override
public DataFlavor[] getTransferDataFlavors() {
return ALL_FLAVORS.toArray(new DataFlavor[ALL_FLAVORS.size()]);
}
@Override
public boolean isDataFlavorSupported(DataFlavor flavor) {
return ALL_FLAVORS.parallelStream().anyMatch(flavor::equals);
}
@Override
public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
if (flavor.equals(HTML_FLAVOR) || flavor.equals(DataFlavor.allHtmlFlavor)) {
return htmlText;
} else if (flavor.equals(TEXT_FLAVOR)) {
return plainText;
} else {
throw new UnsupportedFlavorException(flavor);
}
}
}