// Instances a single text element containing a string. bool Factory::InstanceElementText(Element* parent, const String& text) { SystemInterface* system_interface = GetSystemInterface(); // Do any necessary translation. If any substitutions were made then new XML may have been introduced, so we'll // have to run the data through the XML parser again. String translated_data; if (system_interface != NULL && (system_interface->TranslateString(translated_data, text) > 0 || translated_data.Find("<") != String::npos)) { StreamMemory* stream = new StreamMemory(translated_data.Length() + 32); stream->Write("<body>", 6); stream->Write(translated_data); stream->Write("</body>", 7); stream->Seek(0, SEEK_SET); InstanceElementStream(parent, stream); stream->RemoveReference(); } else { // Check if this text node contains only white-space; if so, we don't want to construct it. bool only_white_space = true; for (size_t i = 0; i < translated_data.Length(); ++i) { if (!StringUtilities::IsWhitespace(translated_data[i])) { only_white_space = false; break; } } if (only_white_space) return true; // Attempt to instance the element. XMLAttributes attributes; Element* element = Factory::InstanceElement(parent, "#text", "#text", attributes); if (!element) { Log::Message(Log::LT_ERROR, "Failed to instance text element '%s', instancer returned NULL.", translated_data.CString()); return false; } // Assign the element its text value. ElementText* text_element = dynamic_cast< ElementText* >(element); if (text_element == NULL) { Log::Message(Log::LT_ERROR, "Failed to instance text element '%s'. Found type '%s', was expecting a derivative of ElementText.", translated_data.CString(), typeid(element).name()); element->RemoveReference(); return false; } text_element->SetText(translated_data); // Add to active node. parent->AppendChild(element); element->RemoveReference(); } return true; }