/************************************************************************** OmegaT - Computer Assisted Translation (CAT) tool with fuzzy matching, translation memory, keyword search, glossaries, and translation leveraging into updated projects. Copyright (C) 2013 Alex Buloichik 2015 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.gui.editor.mark; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import javax.swing.text.AttributeSet; import javax.swing.text.Highlighter.HighlightPainter; import org.apache.commons.lang.StringEscapeUtils; import org.omegat.core.Core; import org.omegat.core.data.ProtectedPart; import org.omegat.core.data.SourceTextEntry; import org.omegat.gui.editor.Document3; import org.omegat.gui.editor.EditorController; import org.omegat.util.PatternConsts; import org.omegat.util.Preferences; import org.omegat.util.gui.Styles; /** * Marker for SourceTextEntry.protectedParts and tags. * * @author Alex Buloichik (alex73mail@gmail.com) * @author Aaron Madlon-Kay */ public class ProtectedPartsMarker implements IMarker { protected static final HighlightPainter PAINTERrtl = new TransparentHighlightPainter(Styles.EditorColor.COLOR_PLACEHOLDER.getColor(), 0.2F); protected static final AttributeSet ATTRIBUTESltr = Styles.createAttributeSet(Styles.EditorColor.COLOR_PLACEHOLDER.getColor(), null, null, null); @Override public List<Mark> getMarksForEntry(SourceTextEntry ste, String sourceText, String translationText, boolean isActive) throws Exception { HighlightPainter painter; AttributeSet attrs; if (((EditorController) Core.getEditor()).getOrientation() == Document3.ORIENTATION.ALL_LTR) { attrs = ATTRIBUTESltr; painter = null; } else { attrs = null; painter = PAINTERrtl; } List<Mark> r = new ArrayList<Mark>(); // find protected parts for (ProtectedPart pp : ste.getProtectedParts()) { if (sourceText != null) { int pos = -1; while ((pos = sourceText.indexOf(pp.getTextInSourceSegment(), pos + 1)) >= 0) { Mark m = new Mark(Mark.ENTRY_PART.SOURCE, pos, pos + pp.getTextInSourceSegment().length()); m.painter = painter; m.attributes = attrs; m.toolTipText = escapeHtml(pp.getDetailsFromSourceFile()); r.add(m); } } if (translationText != null) { int pos = -1; while ((pos = translationText.indexOf(pp.getTextInSourceSegment(), pos + 1)) >= 0) { Mark m = new Mark(Mark.ENTRY_PART.TRANSLATION, pos, pos + pp.getTextInSourceSegment().length()); m.painter = painter; m.attributes = attrs; m.toolTipText = escapeHtml(pp.getDetailsFromSourceFile()); r.add(m); } } } return r; } private String escapeHtml(String s) { boolean doSimplify = Preferences.isPreferenceDefault(Preferences.VIEW_OPTION_PPT_SIMPLIFY, Preferences.VIEW_OPTION_PPT_SIMPLIFY_DEFAULT); // See if tooltip is enclosed by tags. If so, either strip the tags (doSimplify == true) // or make the enclosed text bold (doSimplify != true). Matcher m = PatternConsts.PROTECTED_PARTS_PAIRED_TAG_DECOMPILE.matcher(s); if (m.find()) { s = s.replace("&", "&"); // paired tag StringBuilder text = new StringBuilder(s.length() * 2); if (!doSimplify) { text.append(m.group(1).replace("<", "<").replace(">", ">")); text.append("<b>"); } text.append(m.group(2).replace("<", "<").replace(">", ">")); if (!doSimplify) { text.append("</b>"); text.append(m.group(3).replace("<", "<").replace(">", ">")); } return text.toString(); } if (doSimplify) { // See if the tooltip contains an equiv-text attribute. If so, use just the value. m = PatternConsts.EQUIV_TEXT_ATTRIBUTE_DECOMPILE.matcher(s); if (m.find()) { s = StringEscapeUtils.unescapeHtml(m.group(1)); } } // standalone tag return s.replace("&", "&").replace("<", "<").replace(">", ">"); } }