static PRBool nsShouldIgnoreFile(nsString& name) { PRUnichar firstChar=name.CharAt(0); if (firstChar == '.' || firstChar == '#' || name.CharAt(name.Length() - 1) == '~') return PR_TRUE; if (name.LowerCaseEqualsLiteral("rules.dat") || name.LowerCaseEqualsLiteral("rulesbackup.dat")) return PR_TRUE; // don't add summary files to the list of folders; // don't add popstate files to the list either, or rules (sort.dat). if (StringEndsWith(name, NS_LITERAL_STRING(".snm")) || name.LowerCaseEqualsLiteral("popstate.dat") || name.LowerCaseEqualsLiteral("sort.dat") || name.LowerCaseEqualsLiteral("mailfilt.log") || name.LowerCaseEqualsLiteral("filters.js") || StringEndsWith(name, NS_LITERAL_STRING(".toc")) || StringEndsWith(name, NS_LITERAL_STRING(".sbd"))) return PR_TRUE; return PR_FALSE; }
void nsEudoraCompose::ExtractCharset(nsString& str) { int32_t idx = MsgFind(str, "charset=", true, 0); if (idx != -1) { str.Cut(0, idx + 8); idx = str.FindChar(';'); if (idx != -1) str.SetLength(idx); str.Trim(kWhitespace); if ((str.CharAt(0) == '"') && (str.Length() > 2)) { str.SetLength(str.Length() - 1); str.Cut(0, 1); str.Trim(kWhitespace); } } else str.Truncate(); }
void nsEudoraCompose::ExtractType(nsString& str) { nsString tStr; int32_t idx = str.FindChar(';'); if (idx != -1) str.SetLength(idx); str.Trim(kWhitespace); if ((str.CharAt(0) == '"') && (str.Length() > 2)) { str.SetLength(str.Length() - 1); str.Cut(0, 1); str.Trim(kWhitespace); } // if multipart then ignore it since no outlook message body is ever // valid multipart! if (StringBeginsWith(str, NS_LITERAL_STRING("multipart/"), nsCaseInsensitiveStringComparator())) str.Truncate(); }
void nsEudoraCompose::ExtractCharset( nsString& str) { nsString tStr; PRInt32 idx = str.Find( "charset=", PR_TRUE); if (idx != -1) { idx += 8; str.Right( tStr, str.Length() - idx); idx = tStr.FindChar( ';'); if (idx != -1) tStr.Left( str, idx); else str = tStr; str.Trim( kWhitespace); if ((str.CharAt( 0) == '"') && (str.Length() > 2)) { str.Mid( tStr, 1, str.Length() - 2); str = tStr; str.Trim( kWhitespace); } } else str.Truncate(); }
nsresult nsRDFParserUtils::GetQuotedAttributeValue(const nsString& aSource, const nsString& aAttribute, nsString& aValue) { static const char kQuote = '\"'; static const char kApostrophe = '\''; PRInt32 offset; PRInt32 endOffset = -1; nsresult result = NS_OK; offset = aSource.Find(aAttribute, 0); if (-1 != offset) { offset = aSource.FindChar('=', offset); PRUnichar next = aSource.CharAt(++offset); if (kQuote == next) { endOffset = aSource.FindChar(kQuote, ++offset); } else if (kApostrophe == next) { endOffset = aSource.FindChar(kApostrophe, ++offset); } if (-1 != endOffset) { aSource.Mid(aValue, offset, endOffset-offset); } else { // Mismatched quotes - return an error result = NS_ERROR_FAILURE; } } else { aValue.Truncate(); } return result; }
void nsEudoraCompose::ExtractType( nsString& str) { nsString tStr; PRInt32 idx = str.FindChar( ';'); if (idx != -1) { str.Left( tStr, idx); str = tStr; } str.Trim( kWhitespace); if ((str.CharAt( 0) == '"') && (str.Length() > 2)) { str.Mid( tStr, 1, str.Length() - 2); str = tStr; str.Trim( kWhitespace); } // if multipart then ignore it since no outlook message body is ever // valid multipart! if (str.Length() > 10) { str.Left( tStr, 10); if (tStr.LowerCaseEqualsLiteral("multipart/")) str.Truncate(); } }
void mozTXTToHTMLConv::ScanHTML(nsString& aInString, uint32_t whattodo, nsString &aOutString) { // some common variables we were recalculating // every time inside the for loop... int32_t lengthOfInString = aInString.Length(); const char16_t * uniBuffer = aInString.get(); #ifdef DEBUG_BenB_Perf PRTime parsing_start = PR_IntervalNow(); #endif // Look for simple entities not included in a tags and scan them. // Skip all tags ("<[...]>") and content in an a link tag ("<a [...]</a>"), // comment tag ("<!--[...]-->"), style tag, script tag or head tag. // Unescape the rest (text between tags) and pass it to ScanTXT. for (int32_t i = 0; i < lengthOfInString;) { if (aInString[i] == '<') // html tag { int32_t start = i; if (Substring(aInString, i + 1, 2).LowerCaseEqualsASCII("a ")) // if a tag, skip until </a>. // Make sure there's a space after, not to match "abbr". { i = aInString.Find("</a>", true, i); if (i == kNotFound) i = lengthOfInString; else i += 4; } else if (Substring(aInString, i + 1, 3).LowerCaseEqualsASCII("!--")) // if out-commended code, skip until --> { i = aInString.Find("-->", false, i); if (i == kNotFound) i = lengthOfInString; else i += 3; } else if (Substring(aInString, i + 1, 5).LowerCaseEqualsASCII("style") && (aInString.CharAt(i + 6) == ' ' || aInString.CharAt(i + 6) == '>')) // if style tag, skip until </style> { i = aInString.Find("</style>", true, i); if (i == kNotFound) i = lengthOfInString; else i += 8; } else if (Substring(aInString, i + 1, 6).LowerCaseEqualsASCII("script") && (aInString.CharAt(i + 7) == ' ' || aInString.CharAt(i + 7) == '>')) // if script tag, skip until </script> { i = aInString.Find("</script>", true, i); if (i == kNotFound) i = lengthOfInString; else i += 9; } else if (Substring(aInString, i + 1, 4).LowerCaseEqualsASCII("head") && (aInString.CharAt(i + 5) == ' ' || aInString.CharAt(i + 5) == '>')) // if head tag, skip until </head> // Make sure not to match <header>. { i = aInString.Find("</head>", true, i); if (i == kNotFound) i = lengthOfInString; else i += 7; } else // just skip tag (attributes etc.) { i = aInString.FindChar('>', i); if (i == kNotFound) i = lengthOfInString; else i++; } aOutString.Append(&uniBuffer[start], i - start); } else { uint32_t start = uint32_t(i); i = aInString.FindChar('<', i); if (i == kNotFound) i = lengthOfInString; nsString tempString; tempString.SetCapacity(uint32_t((uint32_t(i) - start) * growthRate)); UnescapeStr(uniBuffer, start, uint32_t(i) - start, tempString); ScanTXT(tempString.get(), tempString.Length(), whattodo, aOutString); } } #ifdef DEBUG_BenB_Perf printf("ScanHTML time: %d ms\n", PR_IntervalToMilliseconds(PR_IntervalNow() - parsing_start)); #endif }
// XXX Code copied from nsHTMLContentSink. It should be shared. void nsRDFParserUtils::StripAndConvert(nsString& aResult) { if ( !aResult.IsEmpty() ) { // Strip quotes if present PRUnichar first = aResult.First(); if ((first == '"') || (first == '\'')) { if (aResult.Last() == first) { aResult.Cut(0, 1); PRInt32 pos = aResult.Length() - 1; if (pos >= 0) { aResult.Cut(pos, 1); } } else { // Mismatched quotes - leave them in } } } // Reduce any entities // XXX Note: as coded today, this will only convert well formed // entities. This may not be compatible enough. // XXX there is a table in navigator that translates some numeric entities // should we be doing that? If so then it needs to live in two places (bad) // so we should add a translate numeric entity method from the parser... char cbuf[100]; PRUint32 i = 0; while (i < aResult.Length()) { // If we have the start of an entity (and it's not at the end of // our string) then translate the entity into it's unicode value. if ((aResult.CharAt(i++) == '&') && (i < aResult.Length())) { PRInt32 start = i - 1; PRUnichar e = aResult.CharAt(i); if (e == '#') { // Convert a numeric character reference i++; char* cp = cbuf; char* limit = cp + sizeof(cbuf) - 1; PRBool ok = PR_FALSE; PRUint32 slen = aResult.Length(); while ((i < slen) && (cp < limit)) { PRUnichar f = aResult.CharAt(i); if (f == ';') { i++; ok = PR_TRUE; break; } if ((f >= '0') && (f <= '9')) { *cp++ = char(f); i++; continue; } break; } if (!ok || (cp == cbuf)) { continue; } *cp = '\0'; if (cp - cbuf > 5) { continue; } PRInt32 ch = PRInt32( ::atoi(cbuf) ); if (ch > 65535) { continue; } // Remove entity from string and replace it with the integer // value. aResult.Cut(start, i - start); aResult.Insert(PRUnichar(ch), start); i = start + 1; } else if (((e >= 'A') && (e <= 'Z')) || ((e >= 'a') && (e <= 'z'))) { // Convert a named entity i++; char* cp = cbuf; char* limit = cp + sizeof(cbuf) - 1; *cp++ = char(e); PRBool ok = PR_FALSE; PRUint32 slen = aResult.Length(); while ((i < slen) && (cp < limit)) { PRUnichar f = aResult.CharAt(i); if (f == ';') { i++; ok = PR_TRUE; break; } if (((f >= '0') && (f <= '9')) || ((f >= 'A') && (f <= 'Z')) || ((f >= 'a') && (f <= 'z'))) { *cp++ = char(f); i++; continue; } break; } if (!ok || (cp == cbuf)) { continue; } *cp = '\0'; PRInt32 ch; // XXX Um, here's where we should be converting a // named entity. I removed this to avoid a link-time // dependency on core raptor. ch = EntityToUnicode(cbuf); if (ch < 0) { continue; } // Remove entity from string and replace it with the integer // value. aResult.Cut(start, i - start); aResult.Insert(PRUnichar(ch), start); i = start + 1; } else if (e == '{') { // Convert a script entity // XXX write me! NS_NOTYETIMPLEMENTED("convert a script entity"); } } } }