/* * The contents of this file are subject to the Mozilla Public * License Version 1.1 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or * implied. See the License for the specific language governing * rights and limitations under the License. * * The Original Code is TransforMiiX XSLT processor. * * The Initial Developer of the Original Code is The MITRE Corporation. * Portions created by MITRE are Copyright (C) 1999 The MITRE Corporation. * * Portions created by Keith Visco as a Non MITRE employee, * (C) 1999 Keith Visco. All Rights Reserved. * * Contributor(s): * Keith Visco, kvisco@ziplink.net * -- original author. * Lidong, lidong520@263.net * -- unicode bug fix * */ /* * XML utility classes */ #include "XMLUtils.h" nsresult txExpandedName::init(const String& aQName, Node* aResolver, MBool aUseDefault) { NS_ASSERTION(aResolver, "missing resolve node"); if (!XMLUtils::isValidQName(aQName)) return NS_ERROR_FAILURE; int idx = aQName.indexOf(':'); if (idx >= 0) { String localName, prefixStr; aQName.subString(0, idx, prefixStr); txAtom* prefix = TX_GET_ATOM(prefixStr); PRInt32 namespaceID = aResolver->lookupNamespaceID(prefix); if (namespaceID == kNameSpaceID_Unknown) return NS_ERROR_FAILURE; mNamespaceID = namespaceID; aQName.subString(idx+1, localName); TX_IF_RELEASE_ATOM(mLocalName); mLocalName = TX_GET_ATOM(localName); } else { TX_IF_RELEASE_ATOM(mLocalName); mLocalName = TX_GET_ATOM(aQName); if (aUseDefault) mNamespaceID = aResolver->lookupNamespaceID(0); else mNamespaceID = kNameSpaceID_None; } return NS_OK; } //------------------------------/ //- Implementation of XMLUtils -/ //------------------------------/ void XMLUtils::getPrefix(const String& src, String& dest) { //-- anything preceding ':' is the namespace part of the name int idx = src.indexOf(':'); if ( idx > 0 ) { //-- create new String to prevent any chars in dest from being //-- lost String tmp; src.subString(0,idx, tmp); dest.append(tmp); } else dest.append(""); } void XMLUtils::getLocalPart(const String& src, String& dest) { //-- anything after ':' is the local part of the name int idx = src.indexOf(':'); if ( idx < -1 ) idx = -1; //-- create new String to prevent any chars in dest from being //-- lost String tmp; src.subString(idx+1, tmp); dest.append(tmp); } //-- getLocalPart /** * Returns true if the given character represents an Alpha letter **/ MBool XMLUtils::isAlphaChar(PRInt32 ch) { if ((ch >= 'a' ) && (ch <= 'z' )) return MB_TRUE; if ((ch >= 'A' ) && (ch <= 'Z' )) return MB_TRUE; return MB_FALSE; } //-- isAlphaChar /** * Returns true if the given character represents a numeric letter (digit) **/ MBool XMLUtils::isDigit(PRInt32 ch) { if ((ch >= '0') && (ch <= '9')) return MB_TRUE; return MB_FALSE; } //-- isDigit /** * Returns true if the given character is an allowable QName character **/ MBool XMLUtils::isNCNameChar(PRInt32 ch) { if (isDigit(ch) || isAlphaChar(ch)) return MB_TRUE; return (MBool) ((ch == '.') ||(ch == '_') || (ch == '-')); } //-- isNCNameChar /** * Returns true if the given character is an allowable NCName character **/ MBool XMLUtils::isQNameChar(PRInt32 ch) { return (MBool) (( ch == ':') || isNCNameChar(ch)); } //-- isQNameChar /** * Returns true if the given String is a valid XML QName **/ MBool XMLUtils::isValidQName(const String& name) { if (name.isEmpty()) return MB_FALSE; if (!isAlphaChar(name.charAt(0))) return MB_FALSE; int size = name.length(); for (int i = 1; i < size; i++) { if (!isQNameChar(name.charAt(i))) return MB_FALSE; } return MB_TRUE; } //-- isValidQName /** * Returns true if the given string has only whitespace characters **/ MBool XMLUtils::isWhitespace(const String& text) { for ( int i = 0; i < text.length(); i++ ) { PRInt32 ch = text.charAt(i); switch ( ch ) { case ' ' : case '\n' : case '\r' : case '\t' : break; default: return MB_FALSE; } } return MB_TRUE; } //-- isWhitespace /** * Normalizes the value of a XML processing instruction **/ void XMLUtils::normalizePIValue(String& piValue) { PRInt32 size = piValue.length(); //-- make copy of chars UNICODE_CHAR* chars = new UNICODE_CHAR[size]; piValue.toUnicode(chars); //-- clear attValue piValue.clear(); PRInt32 cc = 0; UNICODE_CHAR prevCh = 0x0000; while ( cc < size) { UNICODE_CHAR ch = chars[cc++]; switch (ch) { case '>': if ( prevCh == '?' ) { piValue.append(' '); } piValue.append(ch); break; default: piValue.append(ch); break; } prevCh = ch; } delete chars; } //-- noramlizePIValue /** * Is this a whitespace string to be stripped? * Newlines (#xD), tabs (#x9), spaces (#x20), CRs (#xA) only? * @param data the String to test for whitespace **/ MBool XMLUtils::shouldStripTextnode (const String& data){ MBool toStrip = MB_TRUE; for (PRInt32 i=0;toStrip && i