1
0
forked from 0ad/0ad

Support 'replace' attribute in entity template inheritance.

Escape whitespace when emitting XML, to avoid attribute-value
normalization.

This was SVN commit r7448.
This commit is contained in:
Ykkrosh 2010-04-09 18:43:50 +00:00
parent 0ccd4b50ca
commit 1fa8052cbe
2 changed files with 25 additions and 4 deletions

View File

@ -53,8 +53,9 @@ void CParamNode::ApplyLayer(const XMBFile& xmb, const XMBElement& element)
utf16string value = element.GetText();
// Look for special attributes
int at_disable = xmb.GetAttributeID("disable");
int at_replace = xmb.GetAttributeID("replace");
{
int at_disable = xmb.GetAttributeID("disable");
XERO_ITER_ATTR(element, attr)
{
if (attr.Name == at_disable)
@ -62,6 +63,11 @@ void CParamNode::ApplyLayer(const XMBFile& xmb, const XMBElement& element)
m_Childs.erase(name);
return;
}
else if (attr.Name == at_replace)
{
m_Childs.erase(name);
break;
}
}
}
@ -78,6 +84,9 @@ void CParamNode::ApplyLayer(const XMBFile& xmb, const XMBElement& element)
// Add the element's attributes, prefixing names with "@"
XERO_ITER_ATTR(element, attr)
{
// Skip special attributes
if (attr.Name == at_replace) continue;
// Add any others
std::string attrName = xmb.GetAttributeString(attr.Name);
std::wstring attrValue(attr.Value.begin(), attr.Value.end());
node.m_Childs["@" + attrName].m_Value = attrValue;
@ -162,8 +171,11 @@ std::wstring CParamNode::EscapeXMLString(const std::wstring& str)
case '>': ret += L">"; break;
case '&': ret += L"&"; break;
case '"': ret += L"""; break;
case '\t': ret += L"	"; break;
case '\n': ret += L"
"; break;
case '\r': ret += L"
"; break;
default:
if (c == 0x09 || c == 0x0A || c == 0x0D || (0x20 <= c && c <= 0xD7FF) || (0xE000 <= c && c <= 0xFFFD))
if ((0x20 <= c && c <= 0xD7FF) || (0xE000 <= c && c <= 0xFFFD))
ret += c;
else
ret += 0xFFFD;

View File

@ -101,6 +101,14 @@ public:
TS_ASSERT_WSTR_EQUALS(node.ToXML(), L"<test><b>2</b></test>");
}
void test_overlay_replace()
{
CParamNode node;
TS_ASSERT_EQUALS(CParamNode::LoadXMLString(node, "<test> <a x='1'>2<b/></a> <c y='3'/></test>"), PSRETURN_OK);
TS_ASSERT_EQUALS(CParamNode::LoadXMLString(node, "<test> <a replace=''><d/></a> <e replace=''/> </test>"), PSRETURN_OK);
TS_ASSERT_WSTR_EQUALS(node.ToXML(), L"<test><a><d></d></a><c y=\"3\"></c><e></e></test>");
}
void test_types()
{
CParamNode node;
@ -119,10 +127,11 @@ public:
TS_ASSERT_WSTR_EQUALS(CParamNode::EscapeXMLString(L"test"), L"test");
TS_ASSERT_WSTR_EQUALS(CParamNode::EscapeXMLString(L"x < y << z"), L"x &lt; y &lt;&lt; z");
TS_ASSERT_WSTR_EQUALS(CParamNode::EscapeXMLString(L"x < y \"&' y > z ]]> "), L"x &lt; y &quot;&amp;' y &gt; z ]]&gt; ");
TS_ASSERT_WSTR_EQUALS(CParamNode::EscapeXMLString(L" \r\n\t "), L" &#13;&#10;&#9; ");
wchar_t r = 0xFFFD;
wchar_t a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 0xD7FF, 0xD800, 0xDFFF, 0xE000, 0xFFFE, 0xFFFF, 0 };
wchar_t b[] = { r, r, r, r, r, r, r, r, 9, 10, r, r, 13, r, r, r, r, r, r, r, r, r, r, r, r, r, r, r, r, r, r, 32, 0xD7FF, r, r, 0xE000, r, r, 0 };
wchar_t a[] = { 1, 2, 3, 4, 5, 6, 7, 8, /* 9, 10, */ 11, 12, /* 13, */ 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 0xD7FF, 0xD800, 0xDFFF, 0xE000, 0xFFFE, 0xFFFF, 0 };
wchar_t b[] = { r, r, r, r, r, r, r, r, /*&#9;&#10;*/ r, r, /*&#13;*/ r, r, r, r, r, r, r, r, r, r, r, r, r, r, r, r, r, r, 32, 0xD7FF, r, r, 0xE000, r, r, 0 };
TS_ASSERT_WSTR_EQUALS(CParamNode::EscapeXMLString(a), b);
}
};