package org.jabref.logic.importer.util;
import java.io.BufferedReader;
import java.io.FilterReader;
import java.io.IOException;
import java.io.Reader;
import java.util.regex.Pattern;
/**
*
* Warning -- it is not a generic filter, only read is implemented!
*
* Note: this is just a quick port of the original SPIRESBibtexFilterReader.
*
* @author Fedor Bezrukov
* @author Sheer El-Showk
*
* @version $Id$
*
* TODO: Fix grammar in bibtex entries -- it ma return invalid bibkeys (with space)
*
*/
public class INSPIREBibtexFilterReader extends FilterReader {
private static final Pattern PATTERN = Pattern.compile("@Article\\{.*,");
private final BufferedReader inReader;
private String line;
private int pos;
private boolean pre;
public INSPIREBibtexFilterReader(final Reader initialReader) {
super(initialReader);
inReader = new BufferedReader(initialReader);
pos = -1;
pre = false;
}
private String readpreLine() throws IOException {
String l;
do {
l = inReader.readLine();
if (l == null) {
return null;
}
if (l.contains("<pre>")) {
pre = true;
l = inReader.readLine();
}
if (l == null) {
return null;
}
if (l.contains("</pre>")) {
pre = false;
}
} while (!pre);
return l;
}
private String fixBibkey(final String preliminaryLine) {
if (preliminaryLine == null) {
return null;
}
if (PATTERN.matcher(preliminaryLine).find()) {
return preliminaryLine.replace(' ', '_');
} else {
return preliminaryLine;
}
}
@Override
public int read() throws IOException {
if (pos < 0) {
line = fixBibkey(readpreLine());
pos = 0;
if (line == null) {
return -1;
}
}
if (pos >= line.length()) {
pos = -1;
return '\n';
}
return line.charAt(pos++);
}
}