/* * 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 MBool XMLUtils::isValidQName(const String& aName) { if (aName.isEmpty()) { return MB_FALSE; } if (!isLetter(aName.charAt(0))) { return MB_FALSE; } PRUint32 size = aName.length(); PRUint32 i; MBool foundColon = MB_FALSE; for (i = 1; i < size; ++i) { UNICODE_CHAR character = aName.charAt(i); if (character == ':') { foundColon = MB_TRUE; ++i; break; } if (!isNCNameChar(character)) { return MB_FALSE; } } if (i == size) { // If we found a colon as the last letter it is not // a valid QName. return !foundColon; } if (!isLetter(aName.charAt(i))) { return MB_FALSE; } for (++i; i < size; ++i) { if (!isNCNameChar(aName.charAt(i))) { return MB_FALSE; } } return MB_TRUE; } /** * 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