package com.vistatec.ocelot.segment.model.okapi; import java.util.List; import com.google.common.collect.Lists; import com.vistatec.ocelot.segment.model.BaseSegmentVariant; import com.vistatec.ocelot.segment.model.SegmentAtom; import com.vistatec.ocelot.segment.model.SegmentVariant; import com.vistatec.ocelot.segment.model.TextAtom; import net.sf.okapi.common.resource.Code; import net.sf.okapi.common.resource.TextFragment; /** * Contains methods for handling {@link net.sf.okapi.common.resource.TextFragment}s * and {@link net.sf.okapi.common.resource.Code}s. */ public abstract class OkapiSegmentVariant extends BaseSegmentVariant { // XXX problem - in paired tags, they both have the same IDs. // IDs aren't unique! protected List<SegmentAtom> convertTextFragment(TextFragment tf) { List<SegmentAtom> atoms = Lists.newArrayList(); StringBuilder sb = new StringBuilder(); for (int i = 0; i < tf.length(); i++) { char tfChar = tf.charAt(i); if (TextFragment.isMarker(tfChar)) { if (sb.length() > 0) { // Flush as text atoms.add(new TextAtom(sb.toString())); sb.setLength(0); } char codeMarker = tf.charAt(++i); int codeIndex = TextFragment.toIndex(codeMarker); Code code = tf.getCode(codeIndex); atoms.add(new OkapiCodeAtom(codeIndex + "", getCodeText(code, false), getCodeText(code, true), code)); } else { sb.append(tfChar); } } // Flush trailing markup if (sb.length() > 0) { atoms.add(new TextAtom(sb.toString())); } return atoms; } private String getCodeText(Code code, boolean verbose) { if (verbose) { return code.hasOuterData() ? code.getOuterData() : code.getData(); } switch (code.getTagType()) { case OPENING: return "<" + code.getType() + code.getId() + ">"; case CLOSING: return "</" + code.getType() + code.getId() + ">"; case PLACEHOLDER: return "<" + code.getType() + code.getId() + "/>"; } throw new IllegalStateException(); } @Override public abstract List<SegmentAtom> getAtoms(); @Override protected abstract void setAtoms(List<SegmentAtom> atoms); @Override public abstract SegmentVariant createEmptyTarget(); @Override public abstract SegmentVariant createCopy(); @Override public abstract void setContent(SegmentVariant variant); }