void nsHtml5Highlighter::Start(const nsAutoString& aTitle) { // Doctype mOpQueue.AppendElement()->Init(nsGkAtoms::html, EmptyString(), EmptyString()); mOpQueue.AppendElement()->Init(STANDARDS_MODE); nsIContent** root = CreateElement(nsHtml5Atoms::html, nullptr); mOpQueue.AppendElement()->Init(eTreeOpAppendToDocument, root); mStack.AppendElement(root); Push(nsGkAtoms::head, nullptr); Push(nsGkAtoms::title, nullptr); // XUL will add the "Source of: " prefix. uint32_t length = aTitle.Length(); if (length > INT32_MAX) { length = INT32_MAX; } AppendCharacters(aTitle.get(), 0, (int32_t)length); Pop(); // title Push(nsGkAtoms::link, nsHtml5ViewSourceUtils::NewLinkAttributes()); mOpQueue.AppendElement()->Init(eTreeOpUpdateStyleSheet, CurrentNode()); Pop(); // link Pop(); // head Push(nsGkAtoms::body, nsHtml5ViewSourceUtils::NewBodyAttributes()); nsHtml5HtmlAttributes* preAttrs = new nsHtml5HtmlAttributes(0); nsString* preId = new nsString(NS_LITERAL_STRING("line1")); preAttrs->addAttribute(nsHtml5AttributeName::ATTR_ID, preId); Push(nsGkAtoms::pre, preAttrs); StartCharacters(); mOpQueue.AppendElement()->Init(eTreeOpStartLayout); }
PRBool nsPropertiesParser::ParseValueCharacter( PRUnichar c, const PRUnichar* cur, const PRUnichar* &tokenStart, nsAString& oldValue) { switch (mSpecialState) { // the normal state - look for special characters case eParserSpecial_None: switch (c) { case '\\': if (mHaveMultiLine) // there is nothing to append to mValue yet mHaveMultiLine = PR_FALSE; else mValue += Substring(tokenStart, cur); mSpecialState = eParserSpecial_Escaped; break; case '\n': // if we detected multiline and got only "\\\r" ignore next "\n" if any if (mHaveMultiLine && mMultiLineCanSkipN) { // but don't allow another '\n' to be skipped mMultiLineCanSkipN = PR_FALSE; // Now there is nothing to append to the mValue since we are skipping // whitespaces at the beginning of the new line of the multiline // property. Set tokenStart properly to ensure that nothing is appended // if we find regular line-end or the end of the buffer. tokenStart = cur+1; break; } // no break case '\r': // we're done! We have a key and value mValue += Substring(tokenStart, cur); FinishValueState(oldValue); mHaveMultiLine = PR_FALSE; break; default: // there is nothing to do with normal characters, // but handle multilines correctly if (mHaveMultiLine) { if (c == ' ' || c == '\t') { // don't allow another '\n' to be skipped mMultiLineCanSkipN = PR_FALSE; // Now there is nothing to append to the mValue since we are skipping // whitespaces at the beginning of the new line of the multiline // property. Set tokenStart properly to ensure that nothing is appended // if we find regular line-end or the end of the buffer. tokenStart = cur+1; break; } mHaveMultiLine = PR_FALSE; tokenStart = cur; } break; // from switch on (c) } break; // from switch on (mSpecialState) // saw a \ character, so parse the character after that case eParserSpecial_Escaped: // probably want to start parsing at the next token // other characters, like 'u' might override this tokenStart = cur+1; mSpecialState = eParserSpecial_None; switch (c) { // the easy characters - \t, \n, and so forth case 't': mValue += PRUnichar('\t'); mMinLength = mValue.Length(); break; case 'n': mValue += PRUnichar('\n'); mMinLength = mValue.Length(); break; case 'r': mValue += PRUnichar('\r'); mMinLength = mValue.Length(); break; case '\\': mValue += PRUnichar('\\'); break; // switch to unicode mode! case 'u': case 'U': mSpecialState = eParserSpecial_Unicode; mUnicodeValuesRead = 0; mUnicodeValue = 0; break; // a \ immediately followed by a newline means we're going multiline case '\r': case '\n': mHaveMultiLine = PR_TRUE; mMultiLineCanSkipN = (c == '\r'); mSpecialState = eParserSpecial_None; break; default: // don't recognize the character, so just append it mValue += c; break; } break; // we're in the middle of parsing a 4-character unicode value // like \u5f39 case eParserSpecial_Unicode: if(('0' <= c) && (c <= '9')) mUnicodeValue = (mUnicodeValue << 4) | (c - '0'); else if(('a' <= c) && (c <= 'f')) mUnicodeValue = (mUnicodeValue << 4) | (c - 'a' + 0x0a); else if(('A' <= c) && (c <= 'F')) mUnicodeValue = (mUnicodeValue << 4) | (c - 'A' + 0x0a); else { // non-hex character. Append what we have, and move on. mValue += mUnicodeValue; mMinLength = mValue.Length(); mSpecialState = eParserSpecial_None; // leave tokenStart at this unknown character, so it gets appended tokenStart = cur; // ensure parsing this non-hex character again return PR_FALSE; } if (++mUnicodeValuesRead >= 4) { tokenStart = cur+1; mSpecialState = eParserSpecial_None; mValue += mUnicodeValue; mMinLength = mValue.Length(); } break; } return PR_TRUE; }