/************************************************************************** OmegaT - Computer Assisted Translation (CAT) tool with fuzzy matching, translation memory, keyword search, glossaries, and translation leveraging into updated projects. Copyright (C) 2000-2006 Keith Godfrey and Maxym Mykhalchuk 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.util.xml; import java.util.ArrayList; import java.util.List; import org.omegat.util.OConsts; /* * XML Block is either a tag (with optional attributes), or a string * * @author Keith Godfrey */ public class XMLBlock { public XMLBlock() { reset(); } private void reset() { m_text = ""; m_isClose = false; m_isStandalone = false; m_isComment = false; m_isTag = false; m_typeChar = 0; m_hasText = false; m_shortcut = ""; if (m_attrList != null) m_attrList.clear(); } // //////////////////////////////////////////////// // initialization methods public void setAttribute(String attribute, String value) { XMLAttribute attr = new XMLAttribute(attribute, value); setAttribute(attr); } private void setAttribute(XMLAttribute attr) { if (m_attrList == null) m_attrList = new ArrayList<XMLAttribute>(8); // assume that this attribute doesn't exist already m_attrList.add(attr); } public void setText(String text) { setTag(false); m_text = text; // block considered text if it has length=1 and includes non ws m_hasText = false; if (text.codePointCount(0, text.length()) == 1) { int cp = text.codePointAt(0); if (cp != 9 && cp != 10 && cp != 13 && cp != ' ') { m_hasText = true; } } else { m_hasText = true; } } public void setTypeChar(char c) { m_typeChar = c; } public void setShortcut(String shortcut) { m_shortcut = shortcut; } public String getShortcut() { if (m_shortcut != null && !m_shortcut.equals("")) { if (m_isClose) return "/" + m_shortcut; else if (m_isComment) return OConsts.XB_COMMENT_SHORTCUT; } return m_shortcut; } /** Sets that this block is a closing tag. */ public void setCloseFlag() { m_isClose = true; m_isStandalone = false; } /** Sets that this block is a stand-alone tag. */ public void setStandaloneFlag() { m_isStandalone = true; m_isClose = false; } public void setComment() { m_isTag = true; setTypeChar('!'); m_isComment = true; m_isClose = false; m_isStandalone = false; } public void setTagName(String name) { setTag(true); m_text = name; } private void setTag(boolean isTag) { m_isTag = isTag; } // /////////////////////////////////////////////// // data retrieval functions /** Whether this block is a chunk of text (not a tag). */ public boolean hasText() { return m_hasText; } /** Whether this block is a tag. */ public boolean isTag() { return m_isTag; } /** Whether this block is a standalone tag. */ public boolean isStandalone() { return m_isStandalone; } /** Whether this is a closing tag. */ public boolean isClose() { return m_isClose; } /** Whether this block is a comment. */ public boolean isComment() { return m_isComment; } /** * Returns the block as text - either raw text if not a tag, or the tag and * attributes in text form if it is */ public String getText() { if (m_typeChar == '?') { // write < + [/ +] tagname + attributes + [/ +] > StringBuilder tag = new StringBuilder("<?").append(m_text); if (m_attrList != null) { for (XMLAttribute attr : m_attrList) { // add attribute/value pair tag.append(' ').append(attr.name).append("=\"").append(attr.value).append('"'); } } tag.append("?>"); return tag.toString(); } else if (m_typeChar == '!') { StringBuilder tag = new StringBuilder("<!"); if (m_text.equals("CDATA")) { tag.append('[').append(m_text).append('['); } else if (m_text.equals("]]")) { tag.append("]]>"); } else if (m_isComment) { tag.append("-- ").append(m_text).append(" -->"); } else { tag.append(m_text).append(' '); if (m_attrList != null) { if (!m_attrList.isEmpty()) { tag.append(m_attrList.get(0).name); } } tag.append('>'); } return tag.toString(); } else if (isTag()) { // write < + [/ +] tagname + attributes + [/ +] > StringBuilder tag = new StringBuilder("<"); if (m_isClose) { tag.append('/'); } tag.append(m_text); if (m_attrList != null) { for (XMLAttribute attr : m_attrList) { // add attribute/value pair tag.append(' ').append(attr.name).append("=\"").append(attr.value).append('"'); } } if (m_isStandalone) tag.append(" /"); tag.append('>'); return tag.toString(); } else return m_text; } public String getTagName() { if (isTag()) return m_text; else return ""; } public int numAttributes() { if (m_attrList == null) return 0; else return m_attrList.size(); } public XMLAttribute getAttribute(int n) { if (n < 0 || !isTag() || m_attrList == null || n > m_attrList.size()) { return null; } else return m_attrList.get(n); } public String getAttribute(String name) { if (!isTag() || m_attrList == null) return null; XMLAttribute attr = null; for (int i = 0; i < m_attrList.size(); i++) { attr = m_attrList.get(i); if (attr.name.equals(name)) break; else attr = null; } if (attr == null) return null; else return attr.value; } private String m_text; // tagname if tag; text if not private String m_shortcut; // user display for tag private boolean m_isClose; private boolean m_isComment; private boolean m_isStandalone; private boolean m_isTag; private boolean m_hasText; private char m_typeChar; private List<XMLAttribute> m_attrList; /** Returns a string representation for debugging purposes mainly. */ public String toString() { return getText(); } /** holds the shortcut number of this tag. */ private int shortcutNumber; /** What's the shortcut number of this tag. */ public int getShortcutNumber() { return this.shortcutNumber; } /** Sets the shortcut number of this tag. */ public void setShortcutNumber(int shortcutNumber) { this.shortcutNumber = shortcutNumber; } }