#include "nsCOMPtr.h" #include "nsString.h" #include "nsIServiceManager.h" #include #include #include "nsIDOMDocument.h" #include "nsIDOMParser.h" #include "nsIDOMSerializer.h" #include "nsIDOMNode.h" #include "nsIDOMElement.h" #include "nsIDOMText.h" #define kXHTMLNamespace NS_LITERAL_STRING("http://www.w3.org/1999/xhtml") #define kHighlightDelimiter NS_LITERAL_STRING("\01") nsresult ParseHighlightString(nsIDOMDocument* document, const nsAString& string, nsIDOMNode* root) { nsresult rv; nsCOMPtr container; nsCOMPtr junk; rv = document->CreateElementNS(kXHTMLNamespace, NS_LITERAL_STRING("div"), getter_AddRefs(container)); NS_ENSURE_SUCCESS(rv, rv); rv = root->AppendChild(container, getter_AddRefs(junk)); NS_ENSURE_SUCCESS(rv, rv); nsAString::const_iterator delimStart, delimEnd, start, end, chunkStart; string.BeginReading(start); string.EndReading(end); delimStart = start; chunkStart = start; delimEnd = end; PRBool inHighlight = PR_FALSE; while(FindInReadable(kHighlightDelimiter, delimStart, delimEnd)) { nsCOMPtr parent; /* * If we're in a highlight, this piece of text needs to be surrounded * by bold tags */ if(inHighlight) { rv = document->CreateElementNS(kXHTMLNamespace, NS_LITERAL_STRING("b"), getter_AddRefs(parent)); NS_ENSURE_SUCCESS(rv, rv); container->AppendChild(parent, getter_AddRefs(junk)); NS_ENSURE_SUCCESS(rv, rv); } else { parent = container; } nsCOMPtr text; rv = document->CreateTextNode(Substring(chunkStart, delimStart), getter_AddRefs(text)); NS_ENSURE_SUCCESS(rv, rv); rv = parent->AppendChild(text, getter_AddRefs(junk)); chunkStart = ++delimStart; delimStart = delimEnd; delimEnd = end; inHighlight = !inHighlight; } /* * If anything remiains, tack on the rest of the string */ if(chunkStart != end) { nsCOMPtr text; rv = document->CreateTextNode(Substring(chunkStart, end), getter_AddRefs(text)); NS_ENSURE_SUCCESS(rv, rv); rv = container->AppendChild(text, getter_AddRefs(junk)); } return NS_OK; } int main (int argc, char* argv[]) { nsresult rv; nsIServiceManager *servMgr; rv = NS_InitXPCOM2(&servMgr, nsnull, nsnull); if (NS_FAILED(rv)) return rv; { nsCOMPtr domParser; domParser = do_CreateInstance("@mozilla.org/xmlextras/domparser;1", &rv); NS_ENSURE_TRUE(domParser, NS_ERROR_OUT_OF_MEMORY); nsCOMPtr contentDoc; rv = domParser->ParseFromString(NS_LITERAL_STRING("").get(), "application/xml", getter_AddRefs(contentDoc)); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr root; contentDoc->GetFirstChild(getter_AddRefs(root)); nsAutoString s; s.Assign(NS_LITERAL_STRING("Hello \01Crazy\01 World")); rv = ParseHighlightString(contentDoc, s, root); nsCOMPtr domSerializer(do_CreateInstance("@mozilla.org/xmlextras/xmlserializer;1")); NS_ENSURE_TRUE(domSerializer, NS_ERROR_OUT_OF_MEMORY); nsAutoString xml; rv = domSerializer->SerializeToString(contentDoc, xml); NS_ENSURE_SUCCESS(rv, rv); printf("%s\n", NS_ConvertUTF16toUTF8(xml).get()); } if (servMgr) { rv = NS_ShutdownXPCOM(servMgr); } return rv; }