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:
parent
0ccd4b50ca
commit
1fa8052cbe
@ -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;
|
||||
|
@ -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 < y << z");
|
||||
TS_ASSERT_WSTR_EQUALS(CParamNode::EscapeXMLString(L"x < y \"&' y > z ]]> "), L"x < y "&' y > z ]]> ");
|
||||
TS_ASSERT_WSTR_EQUALS(CParamNode::EscapeXMLString(L" \r\n\t "), L" 	 ");
|
||||
|
||||
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, /*	 */ r, r, /* */ 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);
|
||||
}
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user