/**************************************************************************
OmegaT - Computer Assisted Translation (CAT) tool
with fuzzy matching, translation memory, keyword search,
glossaries, and translation leveraging into updated projects.
Copyright (C) 2013 Aaron Madlon-Kay
Home page: http://www.omegat.org/
Support center: http://groups.yahoo.com/group/OmegaT/
This file is part of OmegaT.
OmegaT is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OmegaT is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
**************************************************************************/
package org.omegat.core.tagvalidation;
import java.util.List;
import org.omegat.core.data.SourceTextEntry;
import org.omegat.core.tagvalidation.ErrorReport.TagError;
import org.omegat.util.TagUtil;
import org.omegat.util.TagUtil.Tag;
/**
* @author Aaron Madlon-Kay
*/
public class TagRepair {
public static void fixTag(SourceTextEntry ste, Tag tag, TagError error, StringBuilder translation, String source) {
List<Tag> tags;
switch (error) {
case DUPLICATE:
case ORDER:
case MALFORMED:
tags = TagUtil.buildTagList(source, ste.getProtectedParts());
fixMalformed(tags, translation, tag);
break;
case MISSING:
tags = TagUtil.buildTagList(source, ste.getProtectedParts());
fixMissing(tags, translation, tag);
break;
case EXTRANEOUS:
fixExtraneous(translation, tag);
break;
case ORPHANED:
// This is fixed by fixing MISSING.
break;
case WHITESPACE:
fixWhitespace(translation, source);
break;
default:
break;
}
}
protected static void fixWhitespace(StringBuilder translation, String source) {
if (source.startsWith("\n") && translation.charAt(0) != '\n') {
translation.insert(0, '\n');
} else if (!source.startsWith("\n") && translation.charAt(0) == '\n') {
translation.deleteCharAt(0);
}
if (source.endsWith("\n") && translation.charAt(translation.length() - 1) != '\n') {
translation.append('\n');
} else if (!source.endsWith("\n") && translation.charAt(translation.length() - 1) == '\n') {
translation.deleteCharAt(translation.length() - 1);
}
}
protected static void fixMalformed(List<Tag> tags, StringBuilder text, Tag tag) {
fixExtraneous(text, tag);
fixMissing(tags, text, tag);
}
protected static void fixMissing(List<Tag> tags, StringBuilder text, Tag tag) {
// Insert missing tag.
int index = getTagIndex(tags, tag);
Tag prev = index > 0 ? tags.get(index - 1) : null;
Tag next = index + 1 < tags.size() ? tags.get(index + 1) : null;
if (prev != null && text.indexOf(prev.tag) > -1) {
// Insert after a preceding tag.
text.insert(text.indexOf(prev.tag) + prev.tag.length(), tag.tag);
} else if (next != null && text.indexOf(next.tag) > -1) {
// Insert before a proceeding tag.
text.insert(text.indexOf(next.tag), tag.tag);
} else {
// Nothing before or after; append to end.
text.append(tag.tag);
}
}
protected static void fixExtraneous(StringBuilder text, Tag tag) {
int tagEnd = tag.pos + tag.tag.length();
if (tag.pos > 0 && tagEnd < text.length() && text.substring(tag.pos, tagEnd).equals(tag.tag)) {
text.delete(tag.pos, tagEnd);
} else {
int i = text.indexOf(tag.tag);
if (i != -1) {
text.delete(i, i + tag.tag.length());
}
}
}
private static int getTagIndex(List<Tag> tags, Tag tag) {
for (int i = 0; i < tags.size(); i++) {
Tag t = tags.get(i);
if (t.tag.equals(tag.tag)) {
return i;
}
}
return -1;
}
}