// Copyright 2014 Thomas Müller
// This file is part of MarMoT, which is licensed under GPLv3.
package marmot.tokenize.preprocess;
import java.util.LinkedList;
import java.util.List;
import marmot.tokenize.openlp.Aligner.Pair;
import marmot.tokenize.openlp.Aligner.Result;
public class Viewer {
private Result result_;
private String tokenized_;
private String untokenized_;
public Viewer(String tokenized, String untokenized, Result result) {
result_ = result;
tokenized_ = tokenized;
untokenized_ = untokenized;
}
public List<String> getView() {
List<Pair> pairs = result_.pairs;
if(pairs == null) return null;
String tokenized = "|" + tokenized_.charAt(0);
String untokenized = pairs.get(0).b == 0 ? "|" + untokenized_.charAt(0) : "|\\";
String tok_nums = "|0";
String untok_nums = "|"+pairs.get(0).b;
int prev = pairs.get(0).b;
for(int i=1; i<pairs.size(); i++) {
int a = pairs.get(i).a;
int b = pairs.get(i).b;
String num_spaces_a = spaceDiff(b, a);
String num_spaces_b = spaceDiff(a, b);
String diff_a = spaceDiff(a, 1);
String diff_b = spaceDiff(b, 1);
String num_spaces = diff_a.length() < diff_b.length() ? diff_b : diff_a;
if(b == -1) {
tok_nums += "|" + i + num_spaces_a;
untok_nums += "|" +-1 + num_spaces_b;
tokenized += "|" + tokenized_.charAt(a) + num_spaces;
untokenized += "|\\" + num_spaces;
continue;
}
if(b == prev) {
tok_nums += " " + i + num_spaces_a;
untok_nums += " " + prev + num_spaces_b;
tokenized += " " + tokenized_.charAt(a) + num_spaces;
untokenized += " " + num_spaces;
continue;
}
tok_nums += "|" + a + num_spaces_a;
untok_nums += "|" + b + num_spaces_b;
tokenized += "|" + tokenized_.charAt(a) + num_spaces;
untokenized += "|" + untokenized_.charAt(b) + num_spaces;
prev = b;
}
List<String> ret = new LinkedList<String>();
ret.add(tokenized);
ret.add(untokenized);
ret.add(tok_nums);
ret.add(untok_nums);
return ret;
}
/**
* If the spaces for a are fewer than for b, the difference is returned
* @param a
* @param b
* @return difference, given that a is 'smaller' than b
*/
private String spaceDiff(int a, int b) {
int a_count = a < 0 ? 1 : 0;
a_count += (int)(Math.log10(Math.abs(a)));
int b_count = b < 0 ? 1 : 0;
b_count += (int)(Math.log10(Math.abs(b)));
String ret = "";
for(int i=0; i<(a_count-b_count); i++) {
ret += " ";
}
return ret;
}
}