r=dveditz, sr=brendan, a=asa git-svn-id: svn://10.0.0.236/trunk@102185 18797224-902f-48f8-a5cc-f745e15eee43
151 lines
5.2 KiB
C++
151 lines
5.2 KiB
C++
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
*
|
|
* The contents of this file are subject to the Netscape 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/NPL/
|
|
*
|
|
* 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 Mozilla Communicator client code.
|
|
*
|
|
* The Initial Developer of the Original Code is Netscape Communications
|
|
* Corporation. Portions created by Netscape are
|
|
* Copyright (C) 1998 Netscape Communications Corporation. All
|
|
* Rights Reserved.
|
|
*
|
|
* Contributor(s):
|
|
*/
|
|
|
|
#include "nsParserUtils.h"
|
|
#include "nsIParser.h" // for kQuote et. al.
|
|
#include "jsapi.h"
|
|
|
|
// This method starts at aOffSet in aStr and tries to find aChar. It keeps
|
|
// skipping whitespace till it finds aChar or some other non-whitespace character. If
|
|
// it finds aChar, it returns aChar's offset. If it finds some other non-whitespace character
|
|
// or runs into the end of the string, it returns -1.
|
|
static PRInt32
|
|
FindWhileSkippingWhitespace(nsString& aStr, PRUnichar aChar, PRInt32 aOffset)
|
|
{
|
|
PRInt32 i = aOffset;
|
|
PRUnichar ch = aStr.CharAt(i);
|
|
PRInt32 index = -1;
|
|
|
|
while (ch == '\n' || ch == '\t' || ch == '\r') {
|
|
ch = aStr.CharAt(++i);
|
|
}
|
|
|
|
if (ch == aChar)
|
|
index = i;
|
|
|
|
return index;
|
|
}
|
|
|
|
|
|
nsresult
|
|
nsParserUtils::GetQuotedAttributeValue(nsString& aSource,
|
|
const nsString& aAttribute,
|
|
nsString& aValue)
|
|
{
|
|
PRInt32 startOfAttribute = 0; // Index into aSource where the attribute name starts
|
|
PRInt32 startOfValue = 0; // Index into aSource where the attribute value starts
|
|
PRInt32 posnOfValueDelimeter = 0;
|
|
nsresult result = NS_ERROR_FAILURE;
|
|
|
|
// While there are more characters to look at
|
|
while (startOfAttribute != -1) {
|
|
// Find the attribute starting at offset
|
|
startOfAttribute = aSource.Find(aAttribute, PR_FALSE, startOfAttribute);
|
|
// If attribute found
|
|
if (startOfAttribute != -1) {
|
|
// Find the '=' character while skipping whitespace
|
|
startOfValue = FindWhileSkippingWhitespace(aSource, '=', startOfAttribute + aAttribute.Length());
|
|
// If '=' found
|
|
if (startOfValue != -1) {
|
|
PRUnichar delimeter = kQuote;
|
|
// Find the quote or apostrophe while skipping whitespace
|
|
posnOfValueDelimeter = FindWhileSkippingWhitespace(aSource, kQuote, startOfValue + 1);
|
|
if (posnOfValueDelimeter == -1) {
|
|
posnOfValueDelimeter = FindWhileSkippingWhitespace(aSource, kApostrophe, startOfValue + 1);
|
|
delimeter = kApostrophe;
|
|
}
|
|
// If quote or apostrophe found
|
|
if (posnOfValueDelimeter != -1) {
|
|
startOfValue = posnOfValueDelimeter + 1;
|
|
// Find the ending quote or apostrophe
|
|
posnOfValueDelimeter = aSource.FindChar(delimeter, PR_FALSE, startOfValue);
|
|
// If found
|
|
if (posnOfValueDelimeter != -1) {
|
|
// Set the value of the attibute and exit the loop
|
|
// The attribute value starts at startOfValue and ends at (posnOfValueDelimeter - 1)
|
|
aSource.Mid(aValue, startOfValue, posnOfValueDelimeter - startOfValue);
|
|
result = NS_OK;
|
|
break;
|
|
}
|
|
else {
|
|
// Try to find the attribute in the remainder of the string
|
|
startOfAttribute++;
|
|
continue;
|
|
} // Endif found
|
|
}
|
|
else {
|
|
// Try to find the attribute in the remainder of the string
|
|
startOfAttribute++;
|
|
continue;
|
|
} // Endif quote or apostrophe found
|
|
}
|
|
else {
|
|
// Try to find the attribute in the remainder of the string
|
|
startOfAttribute++;
|
|
continue;
|
|
} // Endif '=' found
|
|
} // Endif attribute found
|
|
} // End while
|
|
|
|
return result;
|
|
}
|
|
|
|
|
|
// XXX Stolen from nsHTMLContentSink. Needs to be shared.
|
|
// XXXbe share also with nsRDFParserUtils.cpp and nsHTMLContentSink.cpp
|
|
// Returns PR_TRUE if the language name is a version of JavaScript and
|
|
// PR_FALSE otherwise
|
|
PRBool
|
|
nsParserUtils::IsJavaScriptLanguage(const nsString& aName, const char* *aVersion)
|
|
{
|
|
JSVersion version = JSVERSION_UNKNOWN;
|
|
|
|
if (aName.EqualsIgnoreCase("JavaScript") ||
|
|
aName.EqualsIgnoreCase("LiveScript") ||
|
|
aName.EqualsIgnoreCase("Mocha")) {
|
|
version = JSVERSION_DEFAULT;
|
|
}
|
|
else if (aName.EqualsIgnoreCase("JavaScript1.0")) {
|
|
version = JSVERSION_1_0;
|
|
}
|
|
else if (aName.EqualsIgnoreCase("JavaScript1.1")) {
|
|
version = JSVERSION_1_1;
|
|
}
|
|
else if (aName.EqualsIgnoreCase("JavaScript1.2")) {
|
|
version = JSVERSION_1_2;
|
|
}
|
|
else if (aName.EqualsIgnoreCase("JavaScript1.3")) {
|
|
version = JSVERSION_1_3;
|
|
}
|
|
else if (aName.EqualsIgnoreCase("JavaScript1.4")) {
|
|
version = JSVERSION_1_4;
|
|
}
|
|
else if (aName.EqualsIgnoreCase("JavaScript1.5")) {
|
|
version = JSVERSION_1_5;
|
|
}
|
|
if (version == JSVERSION_UNKNOWN)
|
|
return PR_FALSE;
|
|
*aVersion = JS_VersionToString(version);
|
|
return PR_TRUE;
|
|
}
|
|
|