package com.vistatec.ocelot.tm.okapi;
import java.io.File;
import java.io.IOException;
import com.google.common.eventbus.Subscribe;
import com.vistatec.ocelot.Version;
import com.vistatec.ocelot.events.OpenFileEvent;
import com.vistatec.ocelot.events.api.OcelotEventQueueListener;
import com.vistatec.ocelot.segment.model.CodeAtom;
import com.vistatec.ocelot.segment.model.OcelotSegment;
import com.vistatec.ocelot.segment.model.SegmentAtom;
import com.vistatec.ocelot.segment.model.SegmentVariant;
import com.vistatec.ocelot.services.SegmentService;
import com.vistatec.ocelot.tm.TmTmxWriter;
import net.sf.okapi.common.LocaleId;
import net.sf.okapi.common.encoder.EncoderContext;
import net.sf.okapi.common.encoder.QuoteMode;
import net.sf.okapi.common.encoder.XMLEncoder;
import net.sf.okapi.common.filterwriter.TMXWriter;
import net.sf.okapi.common.resource.Code;
import net.sf.okapi.common.resource.TextFragment;
/**
* Export currently open file as a TMX file using the Okapi TMXWriter.
*/
public class OkapiTmxWriter implements TmTmxWriter, OcelotEventQueueListener {
private final String CREATION_TOOL = "Ocelot-Okapi-Tmx-Writer";
private final String SEGMENTATION = "sentence";
private final SegmentService segService;
private boolean hasOpenFile = false;
private LocaleId sourceLang, targetLang;
private XMLEncoder attributeEncoder = new XMLEncoder("UTF-8", "\n",
true, true, false, QuoteMode.ALL);
public OkapiTmxWriter(SegmentService segService) {
this.segService = segService;
attributeEncoder.getParameters();
}
@Subscribe
public void setOpenFileLangs(OpenFileEvent fileEvent) {
this.sourceLang = fileEvent.getDocument().getSrcLocale();
this.targetLang = fileEvent.getDocument().getTgtLocale();
this.hasOpenFile = true;
}
@Override
public void exportTmx(File tmx) throws IOException {
if (!this.hasOpenFile) {
throw new IOException("No open file to export to TMX!");
}
TMXWriter writer = new TMXWriter(tmx.getAbsolutePath());
writer.writeStartDocument(this.sourceLang, this.targetLang, CREATION_TOOL,
Version.SOURCE_VERSION, SEGMENTATION, null, null);
for (int row = 0; row < segService.getNumSegments(); row++) {
OcelotSegment segment = segService.getSegment(row);
writer.writeTU(convertVariantToTextFrag(segment.getSource()),
convertVariantToTextFrag(segment.getTarget()),
Integer.toString(segment.getSegmentNumber()),
null);
}
writer.writeEndDocument();
writer.close();
}
private TextFragment convertVariantToTextFrag(SegmentVariant segVar) {
TextFragment tFrag = new TextFragment();
for (SegmentAtom atom : segVar.getAtoms()) {
if (atom instanceof CodeAtom) {
CodeAtom cAtom = (CodeAtom) atom;
// The TMXWriter does not escape inline code content
Code c = new Code(TextFragment.TagType.PLACEHOLDER,
attributeEncoder.encode(cAtom.getData(), EncoderContext.INLINE),
cAtom.getVerboseData());
tFrag.append(c);
} else {
tFrag.append(atom.getData());
}
}
return tFrag;
}
}