}
static char *
-_its_encode_special_chars (const char *content)
+_its_encode_special_chars (const char *content, bool is_attribute)
{
const char *str;
size_t amount = 0;
case '>':
amount += 4;
break;
+ case '"':
+ if (is_attribute)
+ amount += 5;
+ else
+ amount += 1;
+ break;
default:
amount += 1;
break;
case '>':
p = stpcpy (p, ">");
break;
+ case '"':
+ if (is_attribute)
+ p = stpcpy (p, """);
+ else
+ *p++ = '"';
+ break;
default:
*p++ = *str;
break;
/* We can't expect xmlTextWriterWriteString() encode
special characters as we write text outside of the
element. */
- ccontent = _its_encode_special_chars ((const char *) xcontent);
+ ccontent = _its_encode_special_chars ((const char *) xcontent,
+ node->type == XML_ATTRIBUTE_NODE);
xmlFree (xcontent);
/* Skip whitespaces at the beginning of the text, if this
free (prop);
}
+const char *
+_its_pool_get_value_for_node (struct its_pool_ty *pool, xmlNode *node,
+ const char *name)
+{
+ intptr_t index = (intptr_t) node->_private;
+ if (index > 0)
+ {
+ struct its_value_list_ty *values;
+
+ assert (index <= pool->nitems);
+ values = &pool->items[index - 1];
+
+ return its_value_list_get_value (values, name);
+ }
+ return NULL;
+}
+
struct its_value_list_ty *
its_translate_rule_eval (struct its_rule_ty *pop, struct its_pool_ty *pool,
xmlNode *node)
return result;
}
- /* Inherit from the parent elements. */
- for (n = node; n && n->type == XML_ELEMENT_NODE; n = n->parent)
+ switch (node->type)
{
- intptr_t index = (intptr_t) n->_private;
- if (index > 0)
- {
- struct its_value_list_ty *values;
- const char *value;
+ case XML_ATTRIBUTE_NODE:
+ /* Attribute nodes don't inherit from the parent elements. */
+ {
+ const char *value =
+ _its_pool_get_value_for_node (pool, node, "translate");
+ if (value != NULL)
+ {
+ its_value_list_set_value (result, "translate", value);
+ return result;
+ }
- assert (index <= pool->nitems);
- values = &pool->items[index - 1];
+ /* The default value is translate="no". */
+ its_value_list_append (result, "translate", "no");
+ }
+ break;
- value = its_value_list_get_value (values, "translate");
- if (value != NULL)
- {
- its_value_list_set_value (result, "translate", value);
- return result;
- }
- }
+ case XML_ELEMENT_NODE:
+ /* Inherit from the parent elements. */
+ {
+ for (n = node; n && n->type == XML_ELEMENT_NODE; n = n->parent)
+ {
+ const char *value =
+ _its_pool_get_value_for_node (pool, n, "translate");
+ if (value != NULL)
+ {
+ its_value_list_set_value (result, "translate", value);
+ return result;
+ }
+ }
+
+ /* The default value is translate="yes". */
+ its_value_list_append (result, "translate", "yes");
+ }
+ break;
+
+ default:
+ break;
}
- /* The default value is translate="yes". */
- its_value_list_append (result, "translate", "yes");
return result;
}
/* Inherit from the parent elements. */
for (n = node; n && n->type == XML_ELEMENT_NODE; n = n->parent)
{
- intptr_t index = (intptr_t) n->_private;
- if (index > 0)
- {
- struct its_value_list_ty *values;
- const char *value;
-
- assert (index <= pool->nitems);
- values = &pool->items[index - 1];
+ const char *value;
- value = its_value_list_get_value (values, "locNote");
- if (value != NULL)
- {
- its_value_list_set_value (result, "locNote", value);
- return result;
- }
+ value = _its_pool_get_value_for_node (pool, n, "locNote");
+ if (value != NULL)
+ {
+ its_value_list_set_value (result, "locNote", value);
+ return result;
+ }
- value = its_value_list_get_value (values, "locNotePointer");
- if (value != NULL)
- {
- its_value_list_set_value (result, "locNotePointer", value);
- return result;
- }
+ value = _its_pool_get_value_for_node (pool, n, "locNotePointer");
+ if (value != NULL)
+ {
+ its_value_list_set_value (result, "locNotePointer", value);
+ return result;
}
}
xmlNode *node)
{
struct its_value_list_ty *result;
- intptr_t index;
+ const char *value;
result = XCALLOC (1, struct its_value_list_ty);
/* Doesn't inherit from the parent elements, and the default value
is None. */
- index = (intptr_t) node->_private;
- if (index > 0)
- {
- struct its_value_list_ty *values;
- const char *value;
-
- assert (index <= pool->nitems);
- values = &pool->items[index - 1];
-
- value = its_value_list_get_value (values, "withinText");
- if (value != NULL)
- its_value_list_set_value (result, "withinText", value);
- }
+ value = _its_pool_get_value_for_node (pool, node, "withinText");
+ if (value != NULL)
+ its_value_list_set_value (result, "withinText", value);
return result;
}
xmlNode *node)
{
struct its_value_list_ty *result;
- intptr_t index;
+ const char *value;
result = XCALLOC (1, struct its_value_list_ty);
/* Doesn't inherit from the parent elements, and the default value
is None. */
- index = (intptr_t) node->_private;
- if (index > 0)
+ value = _its_pool_get_value_for_node (pool, node, "space");
+ if (value != NULL)
{
- struct its_value_list_ty *values;
- const char *value;
-
- assert (index <= pool->nitems);
- values = &pool->items[index - 1];
-
- value = its_value_list_get_value (values, "space");
- if (value != NULL)
- {
- its_value_list_set_value (result, "space", value);
- return result;
- }
+ its_value_list_set_value (result, "space", value);
+ return result;
}
/* The default value is space="default". */
const char *value;
xmlNode *n;
- if (node->type != XML_ELEMENT_NODE)
+ if (node->type != XML_ELEMENT_NODE
+ && node->type != XML_ATTRIBUTE_NODE)
return false;
values = its_rule_list_eval (rules, node);
{
xmlNode *n;
+ if (node->properties)
+ {
+ xmlAttr *attr = node->properties;
+ for (; attr; attr = attr->next)
+ {
+ xmlNode *n = (xmlNode *) attr;
+ if (its_rule_list_is_translatable (rules, n, 0))
+ its_node_list_append (nodes, n);
+ }
+ }
+
if (its_rule_list_is_translatable (rules, node, 0))
its_node_list_append (nodes, node);
else
flag_context_list_table_ty *flag_table,
message_list_ty *mlp)
{
- if (node->type == XML_ELEMENT_NODE)
+ if (node->type == XML_ELEMENT_NODE
+ || node->type == XML_ATTRIBUTE_NODE)
{
struct its_value_list_ty *values;
const char *value;