28 return character ==
':'
30 || (character >=
'a' && character <=
'z')
31 || (character >=
'A' && character <=
'Z')
32 || (character >= 0xc0 && character <= 0xd6)
33 || (character >= 0xd8 && character <= 0xf6)
34 || (character >= 0xf8 && character <= 0x2ff)
35 || (character >= 0x370 && character <= 0x37d)
36 || (character >= 0x37f && character <= 0x1fff)
37 || (character >= 0x200c && character <= 0x200d)
38 || (character >= 0x2070 && character <= 0x218f)
39 || (character >= 0x2c00 && character <= 0x2fef)
40 || (character >= 0x3001 && character <= 0xd7ff)
41 || (character >= 0xf900 && character <= 0xfdcf)
42 || (character >= 0xfdf0 && character <= 0xfffd)
43 || (character >= 0x10000 && character <= 0xeffff);
52 || (character >=
'0' && character <=
'9')
53 || (character >= 0x300 && character <= 0x036f)
54 || (character >= 0x203f && character <= 0x2040);
70 :
name (nameStart, nameEnd)
101 :
tagName (
StringPool::getGlobalPool().getPooledString (tagNameStart, tagNameEnd))
133 tagName (std::move (other.tagName))
147 tagName = std::move (other.tagName);
175 enum {
v = ((
c >=
'a' &&
c <=
'z')
176 || (
c >=
'A' &&
c <=
'Z')
177 || (
c >=
'0' &&
c <=
'9')
178 ||
c ==
' ' ||
c ==
'.' ||
c ==
',' ||
c ==
';'
179 ||
c ==
':' ||
c ==
'-' ||
c ==
'(' ||
c ==
')'
180 ||
c ==
'_' ||
c ==
'+' ||
c ==
'=' ||
c ==
'?'
181 ||
c ==
'!' ||
c ==
'$' ||
c ==
'#' ||
c ==
'@'
182 ||
c ==
'[' ||
c ==
']' ||
c ==
'/' ||
c ==
'|'
183 ||
c ==
'*' ||
c ==
'%' ||
c ==
'~' ||
c ==
'{'
184 ||
c ==
'}' ||
c ==
'\'' ||
c ==
'\\')
185 ? (1 << (
c & 7)) : 0 };
188 template <
int tableIndex>
204 return c <
sizeof (legalChars) * 8
205 && (legalChars[
c >> 3] & (1 << (
c & 7))) != 0;
211 auto t =
text.getCharPointer();
215 auto character = (
uint32)
t.getAndAdvance();
222 outputStream << (char) character;
228 case '&': outputStream <<
"&";
break;
229 case '"': outputStream <<
""";
break;
230 case '>': outputStream <<
">";
break;
231 case '<': outputStream <<
"<";
break;
235 if (! changeNewLines)
237 outputStream << (char) character;
242 outputStream <<
"&#" << ((
int) character) <<
';';
251 out.writeRepeatedByte (
' ', numSpaces);
256 int indentationLevel,
258 const char* newLineChars)
const
260 if (indentationLevel >= 0)
269 auto attIndent = (size_t) (indentationLevel +
tagName.length() + 1);
272 for (
auto* att =
attributes.get(); att !=
nullptr; att = att->nextListItem)
274 if (lineLen > lineWrapLength && indentationLevel >= 0)
276 outputStream << newLineChars;
283 outputStream << att->name;
284 outputStream.
write (
"=\"", 2);
294 bool lastWasTextNode =
false;
296 for (; child !=
nullptr; child = child->nextListItem)
298 if (child->isTextElement())
301 lastWasTextNode =
true;
305 if (indentationLevel >= 0 && ! lastWasTextNode)
306 outputStream << newLineChars;
308 child->writeElementAsText (outputStream,
309 lastWasTextNode ? 0 : (indentationLevel + (indentationLevel >= 0 ? 2 : 0)), lineWrapLength,
311 lastWasTextNode =
false;
315 if (indentationLevel >= 0 && ! lastWasTextNode)
317 outputStream << newLineChars;
321 outputStream.
write (
"</", 2);
327 outputStream.
write (
"/>", 2);
341 f.newLineChars =
nullptr;
348 f.addDefaultHeader =
false;
373 output <<
"<?xml version=\"1.0\" encoding=\"";
391 output << options.
dtd;
414 if (!
out.openedOk())
420 if (
out.getStatus().failed())
428 StringRef encodingType,
int lineWrapLength)
const
431 options.
dtd = dtdToUse;
443 bool allOnOneLine,
bool includeXmlHeader,
444 StringRef encodingType,
int lineWrapLength)
const
447 options.
dtd = dtdToUse;
459 StringRef encodingType,
int lineWrapLength)
const
462 options.
dtd = dtdToUse;
472 const bool matches =
tagName.equalsIgnoreCase (possibleTagName);
483 return tagName.upToFirstOccurrenceOf (
":",
false,
false);
488 return tagName.fromLastOccurrenceOf (
":",
false,
false);
500 while (
e !=
nullptr && !
e->hasTagName (requiredTagName))
527 return att->name.toString();
542 for (
auto* att =
attributes.get(); att !=
nullptr; att = att->nextListItem)
543 if (att->name == attributeName)
568 return defaultReturnValue;
576 return defaultReturnValue;
582 return att->value.getDoubleValue();
584 return defaultReturnValue;
591 auto firstChar = *(att->value.getCharPointer().findEndOfWhitespace());
593 return firstChar ==
'1'
600 return defaultReturnValue;
605 const bool ignoreCase)
const noexcept
608 return ignoreCase ? att->value.equalsIgnoreCase (stringToCompareAgainst)
609 : att->value == stringToCompareAgainst;
623 for (
auto* att =
attributes.get(); ; att = att->nextListItem)
625 if (att->name == attributeName)
631 if (att->nextListItem ==
nullptr)
654 if (att->get()->name == attributeName)
656 delete att->removeNext();
680 jassert (! childName.isEmpty());
682 for (
auto* child =
firstChildElement.get(); child !=
nullptr; child = child->nextListItem)
683 if (child->hasTagName (childName))
691 jassert (! attributeName.isEmpty());
693 for (
auto* child =
firstChildElement.get(); child !=
nullptr; child = child->nextListItem)
694 if (child->compareAttribute (attributeName, attributeValue))
702 if (newNode !=
nullptr)
705 jassert (newNode->nextListItem ==
nullptr);
713 if (newNode !=
nullptr)
716 jassert (newNode->nextListItem ==
nullptr);
724 if (newNode !=
nullptr)
727 jassert (newNode->nextListItem ==
nullptr);
735 auto newElement =
new XmlElement (childTagName);
743 if (newNode !=
nullptr)
747 if (currentChildElement != newNode)
748 delete p->replaceNext (newNode);
758 const bool shouldDeleteTheChild)
noexcept
760 if (childToRemove !=
nullptr)
766 if (shouldDeleteTheChild)
767 delete childToRemove;
772 const bool ignoreOrderOfAttributes)
const noexcept
776 if (other ==
nullptr ||
tagName != other->tagName)
779 if (ignoreOrderOfAttributes)
783 for (
auto* att =
attributes.get(); att !=
nullptr; att = att->nextListItem)
785 if (! other->compareAttribute (att->name, att->value))
791 if (totalAtts != other->getNumAttributes())
797 auto* otherAtt = other->attributes.get();
801 if (thisAtt ==
nullptr || otherAtt ==
nullptr)
803 if (thisAtt == otherAtt)
809 if (thisAtt->name != otherAtt->name
810 || thisAtt->value != otherAtt->value)
815 thisAtt = thisAtt->nextListItem;
816 otherAtt = otherAtt->nextListItem;
821 auto* otherChild = other->firstChildElement.get();
825 if (thisChild ==
nullptr || otherChild ==
nullptr)
827 if (thisChild == otherChild)
833 if (! thisChild->isEquivalentTo (otherChild, ignoreOrderOfAttributes))
836 thisChild = thisChild->nextListItem;
837 otherChild = otherChild->nextListItem;
853 auto* nextChild = child->nextListItem.get();
855 if (child->hasTagName (
name))
869 if (
this == elementToLookFor || elementToLookFor ==
nullptr)
872 for (
auto* child =
firstChildElement.get(); child !=
nullptr; child = child->nextListItem)
874 if (elementToLookFor == child)
877 if (
auto* found = child->findParentElementOf (elementToLookFor))
894 for (
int i = 1;
i < num; ++
i)
896 e->nextListItem = elems[
i];
900 e->nextListItem =
nullptr;
938 for (
auto* child =
firstChildElement.get(); child !=
nullptr; child = child->nextListItem)
939 mem << child->getAllSubText();
947 return child->getAllSubText();
949 return defaultReturnValue;
983 auto* next = child->nextListItem.get();
985 if (child->isTextElement())
996class XmlElementTests :
public UnitTest
1003 void runTest()
override
1006 beginTest (
"Float formatting");
1008 auto element = std::make_unique<XmlElement> (
"test");
1009 Identifier number (
"number");
1011 std::map<double, String>
tests;
1014 tests[1.01] =
"1.01";
1015 tests[0.76378] =
"0.76378";
1016 tests[-10] =
"-10.0";
1017 tests[10.01] =
"10.01";
1018 tests[0.0123] =
"0.0123";
1019 tests[-3.7e-27] =
"-3.7e-27";
1021 tests[-12345678901234567.0] =
"-1.234567890123457e16";
1022 tests[192000] =
"192000.0";
1023 tests[1234567] =
"1.234567e6";
1024 tests[0.00006] =
"0.00006";
1025 tests[0.000006] =
"6.0e-6";
1029 element->setAttribute (number,
test.first);
1030 expectEquals (element->getStringAttribute (number),
test.second);
1036static XmlElementTests xmlElementTests;
#define noexcept
Definition DistrhoDefines.h:72
const std::string & getAttributeName(int attributeIndex) const noexcept
Definition XmlElement.cpp:457
void copyChildrenAndAttributesFrom(const XmlElement &)
Definition XmlElement.cpp:136
XmlElement * getChildByName(StringRef tagNameToLookFor) const noexcept
Definition XmlElement.cpp:613
XmlElement * getChildElement(int index) const noexcept
Definition XmlElement.cpp:608
bool hasTagName(StringRef possibleTagName) const noexcept
Definition XmlElement.cpp:403
bool compareAttribute(StringRef attributeName, StringRef stringToCompareAgainst, bool ignoreCase=false) const noexcept
Definition XmlElement.cpp:536
XmlElement * createNewChildElement(StringRef tagName)
Definition XmlElement.cpp:668
XmlElement * getChildByAttribute(StringRef attributeName, StringRef attributeValue) const noexcept
Definition XmlElement.cpp:624
bool hasAttribute(StringRef attributeName) const noexcept
Definition XmlElement.cpp:482
void addChildElement(XmlElement *newChildElement) noexcept
Definition XmlElement.cpp:635
String createDocument(StringRef dtdToUse, bool allOnOneLine=false, bool includeXmlHeader=true, StringRef encodingType="UTF-8", int lineWrapLength=60) const
Definition XmlElement.cpp:327
void deleteAllTextElements() noexcept
Definition XmlElement.cpp:909
void setText(const String &newText)
Definition XmlElement.cpp:852
bool replaceChildElement(XmlElement *currentChildElement, XmlElement *newChildNode) noexcept
Definition XmlElement.cpp:675
void prependChildElement(XmlElement *newChildElement) noexcept
Definition XmlElement.cpp:657
void deleteAllChildElementsWithTagName(StringRef tagName) noexcept
Definition XmlElement.cpp:782
int getIntAttribute(StringRef attributeName, int defaultReturnValue=0) const
Definition XmlElement.cpp:504
void writeElementAsText(OutputStream &, int indentationLevel, int lineWrapLength) const
Definition XmlElement.cpp:243
XmlElement(const String &tagName)
Definition XmlElement.cpp:83
double getDoubleAttribute(StringRef attributeName, double defaultReturnValue=0.0) const
Definition XmlElement.cpp:512
XmlElement * getNextElementWithTagName(StringRef requiredTagName) const
Definition XmlElement.cpp:429
int getNumChildElements() const noexcept
Definition XmlElement.cpp:603
const String & getStringAttribute(StringRef attributeName) const noexcept
Definition XmlElement.cpp:488
String getAllSubText() const
Definition XmlElement.cpp:858
void removeChildElement(XmlElement *childToRemove, bool shouldDeleteTheChild) noexcept
Definition XmlElement.cpp:692
bool isTextElement() const noexcept
Definition XmlElement.cpp:836
bool isEquivalentTo(const XmlElement *other, bool ignoreOrderOfAttributes) const noexcept
Definition XmlElement.cpp:704
void getChildElementsAsArray(XmlElement **) const noexcept
Definition XmlElement.cpp:817
String getChildElementAllSubText(StringRef childTagName, const String &defaultReturnValue) const
Definition XmlElement.cpp:874
void removeAttribute(const Identifier &attributeName) noexcept
Definition XmlElement.cpp:583
bool hasTagNameIgnoringNamespace(StringRef possibleTagName) const
Definition XmlElement.cpp:424
void reorderChildElements(XmlElement **, int) noexcept
Definition XmlElement.cpp:822
void insertChildElement(XmlElement *newChildElement, int indexToInsertAt) noexcept
Definition XmlElement.cpp:646
XmlAttributeNode * getAttribute(StringRef) const noexcept
Definition XmlElement.cpp:473
const String & getAttributeValue(int attributeIndex) const noexcept
Definition XmlElement.cpp:465
XmlElement & operator=(const XmlElement &)
Definition XmlElement.cpp:123
int getNumAttributes() const noexcept
Definition XmlElement.cpp:440
static XmlElement * createTextElement(const String &text)
Definition XmlElement.cpp:882
void addTextElement(const String &text)
Definition XmlElement.cpp:904
String getTagNameWithoutNamespace() const
Definition XmlElement.cpp:419
void writeToStream(OutputStream &output, StringRef dtdToUse, bool allOnOneLine=false, bool includeXmlHeader=true, StringRef encodingType="UTF-8", int lineWrapLength=60) const
Definition XmlElement.cpp:339
const String & getText() const noexcept
Definition XmlElement.cpp:843
static bool isValidXmlName(StringRef possibleName) noexcept
Definition XmlElement.cpp:889
~XmlElement() noexcept
Definition XmlElement.cpp:145
void setAttribute(const Identifier &attributeName, const String &newValue)
Definition XmlElement.cpp:548
bool getBoolAttribute(StringRef attributeName, bool defaultReturnValue=false) const
Definition XmlElement.cpp:520
void removeAllAttributes() noexcept
Definition XmlElement.cpp:597
String getNamespace() const
Definition XmlElement.cpp:414
bool containsChildElement(const XmlElement *possibleChild) const noexcept
Definition XmlElement.cpp:795
XmlElement * findParentElementOf(const XmlElement *childToSearchFor) noexcept
Definition XmlElement.cpp:800
void deleteAllChildElements() noexcept
Definition XmlElement.cpp:777
Definition juce_File.h:45
Definition juce_FileOutputStream.h:35
Definition juce_Identifier.h:39
Definition juce_MemoryOutputStream.h:36
String toUTF8() const
Definition juce_MemoryOutputStream.cpp:189
Definition juce_OutputStream.h:38
virtual bool write(const void *dataToWrite, size_t numberOfBytes)=0
virtual int64 getPosition()=0
virtual bool writeByte(char byte)
Definition juce_OutputStream.cpp:83
Definition juce_String.h:53
int getIntValue() const noexcept
Definition juce_String.cpp:1871
bool isNotEmpty() const noexcept
Definition juce_String.h:316
Definition juce_StringPool.h:40
static StringPool & getGlobalPool() noexcept
Definition juce_StringPool.cpp:158
Definition juce_StringRef.h:62
Definition juce_TemporaryFile.h:65
bool overwriteTargetFileWithTemporary() const
Definition juce_TemporaryFile.cpp:93
const File & getFile() const noexcept
Definition juce_TemporaryFile.h:126
Definition juce_UnitTest.h:70
void setTagName(StringRef newTagName)
Definition juce_XmlElement.cpp:506
int getNumChildElements() const noexcept
Definition juce_XmlElement.cpp:668
XmlElement(const String &tagName)
Definition juce_XmlElement.cpp:76
XmlElement * getChildByName(StringRef tagNameToLookFor) const noexcept
Definition juce_XmlElement.cpp:678
bool isTextElement() const noexcept
Definition juce_XmlElement.cpp:904
String toString(const TextFormat &format={}) const
Definition juce_XmlElement.cpp:352
void addChildElement(XmlElement *newChildElement) noexcept
Definition juce_XmlElement.cpp:700
LinkedListPointer< XmlElement > firstChildElement
Definition juce_XmlElement.h:782
LinkedListPointer< XmlAttributeNode > attributes
Definition juce_XmlElement.h:783
String getTagNameWithoutNamespace() const
Definition juce_XmlElement.cpp:486
void writeElementAsText(OutputStream &, int, int, const char *) const
Definition juce_XmlElement.cpp:255
const String & getText() const noexcept
Definition juce_XmlElement.cpp:911
void copyChildrenAndAttributesFrom(const XmlElement &)
Definition juce_XmlElement.cpp:152
String tagName
Definition juce_XmlElement.h:784
void removeAllAttributes() noexcept
Definition juce_XmlElement.cpp:662
static XmlElement * createTextElement(const String &text)
Definition juce_XmlElement.cpp:952
LinkedListPointer< XmlElement > nextListItem
Definition juce_XmlElement.h:782
bool containsChildElement(const XmlElement *possibleChild) const noexcept
Definition juce_XmlElement.cpp:862
void writeTo(OutputStream &output, const TextFormat &format={}) const
Definition juce_XmlElement.cpp:359
bool writeToFile(const File &destinationFile, StringRef dtdToUse, StringRef encodingType="UTF-8", int lineWrapLength=60) const
Definition juce_XmlElement.cpp:458
void deleteAllChildElements() noexcept
Definition juce_XmlElement.cpp:844
bool hasTagName(StringRef possibleTagName) const noexcept
Definition juce_XmlElement.cpp:470
XmlAttributeNode * getAttribute(StringRef) const noexcept
Definition juce_XmlElement.cpp:540
void removeChildElement(XmlElement *childToRemove, bool shouldDeleteTheChild) noexcept
Definition juce_XmlElement.cpp:757
static bool isValidXmlName(StringRef possibleName) noexcept
Definition juce_XmlElement.cpp:959
const String & getStringAttribute(StringRef attributeName) const noexcept
Definition juce_XmlElement.cpp:555
void setAttribute(const Identifier &attributeName, const String &newValue)
Definition juce_XmlElement.cpp:615
* e
Definition inflate.c:1404
struct huft * t
Definition inflate.c:943
unsigned v[N_MAX]
Definition inflate.c:1584
register unsigned i
Definition inflate.c:1575
unsigned f
Definition inflate.c:1572
static PuglViewHint int value
Definition pugl.h:1708
static const char * name
Definition pugl.h:1582
static struct TestCase tests[]
Definition lilv_test.c:2218
float out
Definition lilv_test.c:1461
Definition juce_UnitTestCategories.h:27
Definition juce_XmlElement.cpp:171
static bool isLegal(uint32 c) noexcept
Definition juce_XmlElement.cpp:197
Definition juce_XmlElement.cpp:169
static void escapeIllegalXmlChars(OutputStream &outputStream, const String &text, bool changeNewLines)
Definition juce_XmlElement.cpp:209
static void writeSpaces(OutputStream &out, const size_t numSpaces)
Definition juce_XmlElement.cpp:249
Definition carla_juce.cpp:31
unsigned int uint32
Definition juce_MathsFunctions.h:45
static const String & getEmptyStringRef() noexcept
Definition juce_XmlElement.cpp:518
static String serialiseDouble(double input)
Definition juce_String.cpp:2260
wchar_t juce_wchar
Definition juce_CharacterFunctions.h:42
static const String juce_xmltextContentAttributeName("text")
static bool isValidXmlNameStartCharacter(juce_wchar character) noexcept
Definition juce_XmlElement.cpp:26
static bool isValidXmlNameBodyCharacter(juce_wchar character) noexcept
Definition juce_XmlElement.cpp:46
static int test(SerdEnv *env, bool top_level, bool pretty_numbers)
Definition sratom_test.c:79
XmlAttributeNode(const XmlAttributeNode &) noexcept
Definition XmlElement.cpp:64
Definition juce_XmlElement.h:136
String customEncoding
Definition juce_XmlElement.h:142
JUCE_NODISCARD TextFormat withoutHeader() const
Definition juce_XmlElement.cpp:345
bool addDefaultHeader
Definition juce_XmlElement.h:143
String dtd
Definition juce_XmlElement.h:140
const char * newLineChars
Definition juce_XmlElement.h:145
String customHeader
Definition juce_XmlElement.h:141
JUCE_NODISCARD TextFormat singleLine() const
Definition juce_XmlElement.cpp:338
int lineWrapLength
Definition juce_XmlElement.h:144
TextFormat()
Definition juce_XmlElement.cpp:336
Definition juce_XmlElement.h:763
Identifier name
Definition juce_XmlElement.h:769
XmlAttributeNode(const XmlAttributeNode &) noexcept
Definition juce_XmlElement.cpp:57
Definition juce_XmlElement.cpp:174
@ v
Definition juce_XmlElement.cpp:175
Definition juce_XmlElement.cpp:190
@ v
Definition juce_XmlElement.cpp:191
const char * text
Definition swell-functions.h:167
int n
Definition crypt.c:458
uch * p
Definition crypt.c:594
return c
Definition crypt.c:175
typedef int(UZ_EXP MsgFn)()
struct zdirent * file
Definition win32.c:1500
#define const
Definition zconf.h:137