Search in sources :

Example 36 with XMLModifier

use of com.ximpleware.XMLModifier in project translationstudio8 by heartsome.

the class XLFHandler method updateLanguages.

/**
	 * 设置指定 XLIFF 文件中指定 file 节点的语言代码信息(source-language、target-language 属性值)
	 * @param fileName
	 *            指定文件名
	 * @param XliffBeans
	 *            XliffBean 集合;
	 */
public void updateLanguages(String fileName, List<XliffBean> xliffBeans) {
    if (xliffBeans == null || xliffBeans.isEmpty()) {
        return;
    }
    VTDNav vn = vnMap.get(fileName);
    AutoPilot ap = new AutoPilot(vn);
    AutoPilot subAp = new AutoPilot(vn);
    try {
        VTDUtils vu = new VTDUtils(vn);
        XMLModifier xm = new XMLModifier(vn);
        for (XliffBean bean : xliffBeans) {
            Set<String> originals = bean.getOriginals();
            for (String original : originals) {
                int index = vu.pilot(subAp, "/xliff/file[@original='" + original + "']");
                if (index != -1) {
                    xm = vu.update(ap, xm, "./@source-language", bean.getSourceLanguage(), VTDUtils.CREATE_IF_NOT_EXIST);
                    xm = vu.update(ap, xm, "./@target-language", bean.getTargetLanguage(), VTDUtils.CREATE_IF_NOT_EXIST);
                }
            }
        }
        saveAndReparse(xm, fileName);
    } catch (NavException e) {
        LOGGER.error("", e);
        e.printStackTrace();
    } catch (ModifyException e) {
        LOGGER.error("", e);
        e.printStackTrace();
    }
}
Also used : XMLModifier(com.ximpleware.XMLModifier) VTDUtils(net.heartsome.xml.vtdimpl.VTDUtils) AutoPilot(com.ximpleware.AutoPilot) NavException(com.ximpleware.NavException) ModifyException(com.ximpleware.ModifyException) XliffBean(net.heartsome.cat.ts.core.bean.XliffBean) VTDNav(com.ximpleware.VTDNav)

Example 37 with XMLModifier

use of com.ximpleware.XMLModifier in project translationstudio8 by heartsome.

the class XLFHandler method addNewInfoToSplitXlf.

/**
	 * 向新切割的xliff文件添加分割信息
	 * @param newXlfPath
	 * @param infoMap
	 *            robert 2011-10-23
	 */
public void addNewInfoToSplitXlf(String newXlfPath, Map<String, String> infoMap) {
    // --robert split
    VTDNav vn = vnMap.get(newXlfPath);
    Assert.isNotNull(vn, Messages.getString("file.XLFHandler.msg4") + newXlfPath);
    try {
        AutoPilot ap = new AutoPilot(vn);
        ap.declareXPathNameSpace(hsNSPrefix, hsR7NSUrl);
        ap.selectXPath("/xliff/file/header/hs:splitInfos");
        boolean hasSplitInfos = false;
        XMLModifier xm = new XMLModifier(vn);
        VTDUtils vUtils = new VTDUtils(vn);
        String splitInfo = "\n    <hs:splitInfo count=\"" + infoMap.get("count") + "\" " + " depth=\"" + infoMap.get("depth") + "\" id=\"" + infoMap.get("id") + "\" " + "index=\"" + infoMap.get("index") + "\" name=\"" + infoMap.get("name") + "\" splitTime=\"" + infoMap.get("splitTime") + "\"/>";
        while (ap.evalXPath() != -1) {
            xm.insertBeforeTail(splitInfo + "\n");
            hasSplitInfos = true;
        }
        if (hasSplitInfos) {
            vnMap.put(newXlfPath, vUtils.updateVTDNav(xm, newXlfPath));
        }
        // 如果是第一次分割,那么添加相关信息
        if (!hasSplitInfos) {
            String firstSplitInfo = "\n  <hs:splitInfos original=\"" + infoMap.get("original") + "\">" + splitInfo + "</hs:splitInfos>";
            AutoPilot ap1 = new AutoPilot(vn);
            ap1.selectXPath("/xliff/file/header");
            while (ap1.evalXPath() != -1) {
                xm.insertBeforeTail(firstSplitInfo + "\n");
            }
            vnMap.put(newXlfPath, vUtils.updateVTDNav(xm, newXlfPath));
        }
    } catch (Exception e) {
        LOGGER.error("", e);
        e.printStackTrace();
    }
/*
		 * VTDNav vn = vnMap.get(newXlfPath); Assert.isNotNull(vn, "未在已解析的缓存中找到该文件:" + newXlfPath); try { AutoPilot ap =
		 * new AutoPilot(vn); ap.selectXPath("/xliff/file/header/splitInfos"); boolean hasSplitInfos = false;
		 * XMLModifier xm = new XMLModifier(vn); VTDUtils vUtils = new VTDUtils(vn); String splitInfo =
		 * "\n    <splitInfo count=\"" + infoMap.get("count") + "\" " + " depth=\"" + infoMap.get("depth") + "\" id=\""
		 * + infoMap.get("id") + "\" " + "index=\"" + infoMap.get("index") + "\" name=\"" + infoMap.get("name") +
		 * "\" splitTime=\"" + infoMap.get("splitTime") + "\"/>";
		 * 
		 * while (ap.evalXPath() != -1) { xm.insertBeforeTail(splitInfo + "\n"); hasSplitInfos = true; } if
		 * (hasSplitInfos) { vnMap.put(newXlfPath, vUtils.updateVTDNav(xm, newXlfPath)); }
		 * 
		 * // 如果是第一次分割,那么添加相关信息 if (!hasSplitInfos) { String firstSplitInfo = "\n  <splitInfos>" + splitInfo +
		 * "</splitInfos>";
		 * 
		 * AutoPilot ap1 = new AutoPilot(vn); ap1.selectXPath("/xliff/file/header"); while (ap1.evalXPath() != -1) {
		 * xm.insertBeforeTail(firstSplitInfo + "\n"); } vnMap.put(newXlfPath, vUtils.updateVTDNav(xm, newXlfPath)); } }
		 * catch (Exception e) { e.printStackTrace(); }
		 */
}
Also used : XMLModifier(com.ximpleware.XMLModifier) VTDUtils(net.heartsome.xml.vtdimpl.VTDUtils) AutoPilot(com.ximpleware.AutoPilot) VTDNav(com.ximpleware.VTDNav) NavException(com.ximpleware.NavException) CoreException(org.eclipse.core.runtime.CoreException) OperationCanceledException(org.eclipse.core.runtime.OperationCanceledException) XPathParseException(com.ximpleware.XPathParseException) FileNotFoundException(java.io.FileNotFoundException) XQException(javax.xml.xquery.XQException) UnsupportedEncodingException(java.io.UnsupportedEncodingException) TranscodeException(com.ximpleware.TranscodeException) XPathEvalException(com.ximpleware.XPathEvalException) IOException(java.io.IOException) ModifyException(com.ximpleware.ModifyException)

Example 38 with XMLModifier

use of com.ximpleware.XMLModifier in project translationstudio8 by heartsome.

the class XLFHandler method deleteAndSave.

/**
	 * 删除翻译单元内容并保存
	 * @param rowId
	 * @param subXPath
	 * @param newValue
	 *            ;
	 */
private void deleteAndSave(String rowId, String subXPath) {
    String tuXPath = RowIdUtil.parseRowIdToXPath(rowId);
    String fileName = RowIdUtil.getFileNameByRowId(rowId);
    VTDNav vn = vnMap.get(fileName);
    try {
        VTDUtils vu = new VTDUtils(vn);
        XMLModifier xm = vu.delete(tuXPath + subXPath);
        saveAndReparse(xm, fileName);
    } catch (NavException e) {
        LOGGER.error("", e);
        e.printStackTrace();
    }
}
Also used : XMLModifier(com.ximpleware.XMLModifier) VTDUtils(net.heartsome.xml.vtdimpl.VTDUtils) NavException(com.ximpleware.NavException) VTDNav(com.ximpleware.VTDNav)

Example 39 with XMLModifier

use of com.ximpleware.XMLModifier in project translationstudio8 by heartsome.

the class XLFHandler method mergeSegment.

/**
	 * 合并两个文本段(注意:rowId1 和 rowId2 有可能不相邻,中间可能会间隔几个源文为空的文本段)
	 * @param rowId1
	 *            第一个文本段的 rowId
	 * @param rowId2
	 *            第二个文本段的 rowId;
	 */
public String mergeSegment(String rowId1, String rowId2) {
    // if (rowIndex + 1 >= rowIds.size()) {
    // return "";
    // }
    // String rowId1 = getRowId(rowIndex);
    // String rowId2 = getRowId(rowIndex + 1);
    String fileName1 = RowIdUtil.getFileNameByRowId(rowId1);
    String fileName2 = RowIdUtil.getFileNameByRowId(rowId2);
    if (fileName1 == null || fileName2 == null || !fileName1.equals(fileName2)) {
        return "";
    }
    VTDNav vn = vnMap.get(fileName1);
    // TransUnitBean tuTop = getTransUnit(rowIndex);
    // TransUnitBean tuBottom = getTransUnit(rowIndex + 1);
    // String srcContent = tuTop.getSrcContent() + "<ph id=\"hs-merge" +
    // tuTop.getId() + "~" + tuBottom.getId()
    // + "\"/>" + tuBottom.getSrcContent();
    // tuTop.setSrcContent(srcContent);
    // String tgtContent = tuTop.getTgtContent() + "<ph id=\"hs-merge" +
    // tuTop.getId() + "~" + tuBottom.getId()
    // + "\"/>" + tuBottom.getTgtContent();
    // tuTop.setTgtContent(tgtContent);
    // tuTop.setMatches(null);
    //
    // String tuXPath1 = RowIdUtil.parseRowIdToXPath(rowId1);
    // String tuXPath2 = RowIdUtil.parseRowIdToXPath(rowId2);
    // AutoPilot ap = new AutoPilot(vn);
    //
    // XMLModifier xm = new XMLModifier(vn);
    // delete(ap, xm, fileName2, tuXPath2, true);
    // update(ap, xm, fileName1, tuXPath2, tuTop.toXMLString(), true);
    // ap.selectXPath(tuXPath2);
    //
    // saveAndReparse(xm, fileName1);
    String tuXPath1 = RowIdUtil.parseRowIdToXPath(rowId1);
    String tuXPath2 = RowIdUtil.parseRowIdToXPath(rowId2);
    String tuid1 = RowIdUtil.getTUIdByRowId(rowId1);
    String tuid2 = RowIdUtil.getTUIdByRowId(rowId2);
    // 不需加数据库
    boolean isNotSendToTM = false;
    // 是否是疑问行
    boolean isNeeds_review = false;
    // 是否添加属性“不需添加到数据库”
    boolean isAddNotSendToTm = false;
    // 是否添加属性“疑问行”
    boolean isAddNeeds_review = false;
    StringBuffer nodeSB = new StringBuffer();
    AutoPilot ap = new AutoPilot(vn);
    try {
        VTDUtils vu = new VTDUtils(vn);
        String oldElementFragment = "";
        ap.selectXPath(tuXPath1);
        String xmlSpace = null;
        if (ap.evalXPath() != -1) {
            xmlSpace = vu.getCurrentElementAttribut("xml:space", "preserve");
            oldElementFragment += vu.getElementFragment();
            // 获取当前tu节点的属性 hs:send-to-tm="no" hs:needs-review="yes"
            isNotSendToTM = "no".equals(vu.getCurrentElementAttribut("hs:send-to-tm", ""));
            isNeeds_review = "yes".equals(vu.getCurrentElementAttribut("hs:needs-review", ""));
        }
        ap.selectXPath(tuXPath2);
        if (ap.evalXPath() != -1) {
            oldElementFragment += vu.getElementFragment();
            if (!isNotSendToTM) {
                isAddNotSendToTm = "no".equals(vu.getCurrentElementAttribut("hs:send-to-tm", ""));
            }
            if (!isNeeds_review) {
                isAddNeeds_review = "yes".equals(vu.getCurrentElementAttribut("hs:needs-review", ""));
            }
            // 开始获取批注
            ap.selectXPath("./note");
            while (ap.evalXPath() != -1) {
                nodeSB.append(vu.getElementFragment());
            }
        }
        XMLModifier xm = new XMLModifier(vn);
        String sourceContent2 = "";
        String targetContent2 = "";
        ap.selectXPath(tuXPath2 + "/source");
        String srcLang = null;
        if (ap.evalXPath() != -1) {
            srcLang = vu.getCurrentElementAttribut("xml:lang", null);
            sourceContent2 = vu.getElementContent();
            sourceContent2 = sourceContent2 == null ? "" : sourceContent2;
        }
        ap.selectXPath(tuXPath2 + "/target");
        if (ap.evalXPath() != -1) {
            targetContent2 = vu.getElementContent();
            targetContent2 = targetContent2 == null ? "" : targetContent2;
        }
        String curTime = "" + System.nanoTime();
        ap.selectXPath(tuXPath1 + "/source");
        if (ap.evalXPath() != -1) {
            String sourceContent1 = vu.getElementContent();
            sourceContent1 = sourceContent1 == null ? "" : sourceContent1;
            String newValue = sourceContent1 + "<ph id=\"hs-merge" + tuid1 + "~" + tuid2 + "\" splitMergeIndex=\"" + curTime + "\"/>" + sourceContent2;
            vu.update(ap, xm, tuXPath1 + "/source/text()", newValue);
        }
        ap.selectXPath(tuXPath1 + "/target");
        if (ap.evalXPath() != -1) {
            String targetContent1 = vu.getElementContent();
            targetContent1 = targetContent1 == null ? "" : targetContent1;
            String newValue = targetContent1 + "<ph id=\"hs-merge" + tuid1 + "~" + tuid2 + "\" splitMergeIndex=\"" + curTime + "\"/>" + targetContent2;
            vu.update(ap, xm, tuXPath1 + "/target/text()", newValue);
        } else {
            String newValue = "<ph id=\"hs-merge" + tuid1 + "~" + tuid2 + "\" splitMergeIndex=\"" + curTime + "\"/>" + targetContent2;
            vu.insert(ap, xm, tuXPath1 + "/target/text()", newValue);
        }
        // 移除alt-trans节点
        ap.selectXPath(tuXPath1 + "/alt-trans");
        while (ap.evalXPath() != -1) {
            xm.remove();
        }
        ap.selectXPath(tuXPath2);
        if (ap.evalXPath() != -1) {
            // xm.remove();
            // Bug #1054:合并文本段时不应丢失第二个文本段的 trans-unit 节点
            String transUnit = "<trans-unit id=\"" + tuid2 + "\" xml:space=\"" + xmlSpace + "\"><target/>" + "<source xml:lang=\"" + srcLang + "\"/></trans-unit>";
            vu.update(ap, xm, tuXPath2, transUnit);
        }
        // 整合并集中的属性以及批注
        ap.selectXPath(tuXPath1);
        if (ap.evalXPath() != -1) {
            // 注意添加属性时必须保持应有的空格
            String insertAttri = isAddNotSendToTm ? " hs:send-to-tm=\"no\" " : "";
            insertAttri += isAddNeeds_review ? " hs:needs-review=\"yes\" " : "";
            if (insertAttri.length() > 0) {
                xm.insertAttribute(insertAttri);
            }
            // 开始添加批注
            if (nodeSB.length() > 0) {
                xm.insertBeforeTail(nodeSB.toString().getBytes("UTF-8"));
            }
            vn.push();
            // 开始处理合并后的状态,保持草稿状态
            ap.selectXPath("./target");
            if (ap.evalXPath() != -1) {
                int index = vn.getAttrVal("state");
                if (index != -1) {
                    xm.updateToken(index, "new");
                } else {
                    xm.insertAttribute(" state=\"new\" ");
                }
            }
            vn.pop();
            // 删除批准状态
            int index = vn.getAttrVal("approved");
            if (index != -1) {
                xm.removeAttribute(index - 1);
            }
        }
        saveAndReparse(xm, fileName1);
        // 删除下面的行
        rowIds.remove(rowId2);
        tuSizeMap.put(fileName1, tuSizeMap.get(fileName1) - 1);
        return oldElementFragment;
    } catch (XPathParseException e) {
        LOGGER.error("", e);
        e.printStackTrace();
    } catch (XPathEvalException e) {
        LOGGER.error("", e);
        e.printStackTrace();
    } catch (NavException e) {
        LOGGER.error("", e);
        e.printStackTrace();
    } catch (ModifyException e) {
        LOGGER.error("", e);
        e.printStackTrace();
    } catch (UnsupportedEncodingException e) {
        LOGGER.error("", e);
        e.printStackTrace();
    }
    return "";
}
Also used : XMLModifier(com.ximpleware.XMLModifier) XPathEvalException(com.ximpleware.XPathEvalException) NavException(com.ximpleware.NavException) UnsupportedEncodingException(java.io.UnsupportedEncodingException) XPathParseException(com.ximpleware.XPathParseException) VTDUtils(net.heartsome.xml.vtdimpl.VTDUtils) AutoPilot(com.ximpleware.AutoPilot) ModifyException(com.ximpleware.ModifyException) VTDNav(com.ximpleware.VTDNav)

Example 40 with XMLModifier

use of com.ximpleware.XMLModifier in project translationstudio8 by heartsome.

the class PreMachineTranslation method executeTranslation.

/**
	 * 根据构建参数执行预翻译 ;
	 * @throws InterruptedException
	 */
public List<PreMachineTranslationCounter> executeTranslation(IProgressMonitor monitor) throws InterruptedException {
    if (monitor == null) {
        monitor = new NullProgressMonitor();
    }
    simpleMatchers = getMacthers();
    if (null == simpleMatchers || simpleMatchers.isEmpty()) {
        return this.transCounters;
    }
    monitor.beginTask("", this.xlfFiles.size());
    monitor.setTaskName(Messages.getString("pretranslation.PreTranslation.task1"));
    try {
        for (String xlfPath : xlfFiles) {
            if (monitor != null && monitor.isCanceled()) {
                throw new InterruptedException();
            }
            currentCounter = new PreMachineTranslationCounter(xlfPath);
            this.transCounters.add(currentCounter);
            VTDNav vn = xlfHandler.getVnMap().get(xlfPath);
            VTDUtils vu = new VTDUtils(vn);
            AutoPilot ap = new AutoPilot(vu.getVTDNav());
            int tuNumber = xlfHandler.getNodeCount(xlfPath, "/xliff/file//descendant::trans-unit[(source/text()!='' or source/*)]");
            currentCounter.setTuNumber(tuNumber);
            ap.selectXPath("/xliff/file");
            String srcLang = "";
            String tgtLang = "";
            XMLModifier xm = new XMLModifier(vn);
            IProgressMonitor monitor2 = new SubProgressMonitor(monitor, 1);
            monitor2.beginTask(Messages.getString("pretranslation.PreTranslation.task2"), tuNumber);
            while (ap.evalXPath() != -1) {
                // 循环 file 节点
                String _srcLang = vu.getCurrentElementAttribut("source-language", "");
                String _tgtLang = vu.getCurrentElementAttribut("target-language", "");
                if (!_srcLang.equals("")) {
                    srcLang = _srcLang;
                }
                if (!_tgtLang.equals("")) {
                    tgtLang = _tgtLang;
                }
                if (srcLang.equals("") || tgtLang.equals("")) {
                    continue;
                }
                keepCurrentMatchs(vu, _srcLang, _tgtLang, xm, monitor2);
            }
            monitor2.done();
            FileOutputStream fos = new FileOutputStream(xlfPath);
            BufferedOutputStream bos = new BufferedOutputStream(fos);
            // 写入文件
            xm.output(bos);
            bos.close();
            fos.close();
        }
    } catch (XPathParseException e) {
        logger.error("", e);
        e.printStackTrace();
    } catch (NavException e) {
        logger.error("", e);
        e.printStackTrace();
    } catch (ModifyException e) {
        logger.error("", e);
        e.printStackTrace();
    } catch (XPathEvalException e) {
        logger.error("", e);
        e.printStackTrace();
    } catch (UnsupportedEncodingException e) {
        logger.error("", e);
        e.printStackTrace();
    } catch (FileNotFoundException e) {
        logger.error("", e);
        e.printStackTrace();
    } catch (TranscodeException e) {
        logger.error("", e);
        e.printStackTrace();
    } catch (IOException e) {
        logger.error("", e);
        e.printStackTrace();
    }
    monitor.done();
    return this.transCounters;
}
Also used : NullProgressMonitor(org.eclipse.core.runtime.NullProgressMonitor) PreMachineTranslationCounter(net.heartsome.cat.ts.machinetranslation.bean.PreMachineTranslationCounter) XMLModifier(com.ximpleware.XMLModifier) NavException(com.ximpleware.NavException) XPathEvalException(com.ximpleware.XPathEvalException) FileNotFoundException(java.io.FileNotFoundException) UnsupportedEncodingException(java.io.UnsupportedEncodingException) IOException(java.io.IOException) SubProgressMonitor(org.eclipse.core.runtime.SubProgressMonitor) TranscodeException(com.ximpleware.TranscodeException) XPathParseException(com.ximpleware.XPathParseException) IProgressMonitor(org.eclipse.core.runtime.IProgressMonitor) VTDUtils(net.heartsome.xml.vtdimpl.VTDUtils) AutoPilot(com.ximpleware.AutoPilot) FileOutputStream(java.io.FileOutputStream) ModifyException(com.ximpleware.ModifyException) VTDNav(com.ximpleware.VTDNav) BufferedOutputStream(java.io.BufferedOutputStream)

Aggregations

XMLModifier (com.ximpleware.XMLModifier)80 NavException (com.ximpleware.NavException)54 VTDNav (com.ximpleware.VTDNav)53 AutoPilot (com.ximpleware.AutoPilot)50 ModifyException (com.ximpleware.ModifyException)50 XPathParseException (com.ximpleware.XPathParseException)42 VTDUtils (net.heartsome.xml.vtdimpl.VTDUtils)41 XPathEvalException (com.ximpleware.XPathEvalException)40 IOException (java.io.IOException)38 TranscodeException (com.ximpleware.TranscodeException)34 VTDGen (com.ximpleware.VTDGen)23 UnsupportedEncodingException (java.io.UnsupportedEncodingException)22 CoreException (org.eclipse.core.runtime.CoreException)17 FileNotFoundException (java.io.FileNotFoundException)15 FileOutputStream (java.io.FileOutputStream)15 ParseException (com.ximpleware.ParseException)13 OperationCanceledException (org.eclipse.core.runtime.OperationCanceledException)13 ArrayList (java.util.ArrayList)12 File (java.io.File)11 XQException (javax.xml.xquery.XQException)11