def _make_start_format(tag_uri, tag_name, attributes, encoding): # We must search for translatable attributes result = [(u'<%s' % get_qname(tag_uri, tag_name), False, None)] for attr_uri, attr_name in attributes: qname = get_attribute_qname(attr_uri, attr_name) qname = Unicode.decode(qname, encoding=encoding) value = attributes[(attr_uri, attr_name)] value = Unicode.decode(value, encoding=encoding) value = XMLAttribute.encode(value) datatype = get_attr_datatype(tag_uri, tag_name, attr_uri, attr_name, attributes) if issubclass(datatype, Unicode): result[-1] = (result[-1][0] + u' %s="' % qname, False, None) context = _get_attr_context(datatype, tag_name, attr_name) result.append((value, True, context)) result.append((u'"', False, None)) else: result[-1] = (result[-1][0] + u' %s="%s"' % (qname, value), False, None) # Close the start tag if is_empty(tag_uri, tag_name): result[-1] = (result[-1][0] + u'/>', False, None) else: result[-1] = (result[-1][0] + u'>', False, None) return result
def get_units(events, srx_handler=None): keep_spaces = False keep_spaces_level = 0 for type, value, line in _get_translatable_blocks(events): if type == START_ELEMENT: tag_uri, tag_name, attributes = value # Attributes for attr_uri, attr_name in attributes: datatype = get_attr_datatype(tag_uri, tag_name, attr_uri, attr_name, attributes) if not issubclass(datatype, Unicode): continue value = attributes[(attr_uri, attr_name)] if not value.strip(): continue unit = ((srx_TEXT, value),) yield (unit, _get_attr_context(datatype, tag_name, attr_name), line) # Keep spaces ? schema = get_element_schema(tag_uri, tag_name) if schema.keep_spaces: keep_spaces = True keep_spaces_level += 1 elif type == END_ELEMENT: # Keep spaces ? tag_uri, tag_name = value schema = get_element_schema(tag_uri, tag_name) if schema.keep_spaces: keep_spaces_level -= 1 if keep_spaces_level == 0: keep_spaces = False elif type == MESSAGE: # Segmentation for segment in get_segments(value, keep_spaces, srx_handler): yield segment
def get_units(events, srx_handler=None): keep_spaces = False keep_spaces_level = 0 for type, value, line in _get_translatable_blocks(events): if type == START_ELEMENT: tag_uri, tag_name, attributes = value # Attributes for attr_uri, attr_name in attributes: datatype = get_attr_datatype(tag_uri, tag_name, attr_uri, attr_name, attributes) if not issubclass(datatype, Unicode): continue value = attributes[(attr_uri, attr_name)] if not value.strip(): continue unit = ((srx_TEXT, value), ) yield (unit, _get_attr_context(datatype, tag_name, attr_name), line) # Keep spaces ? schema = get_element_schema(tag_uri, tag_name) if schema.keep_spaces: keep_spaces = True keep_spaces_level += 1 elif type == END_ELEMENT: # Keep spaces ? tag_uri, tag_name = value schema = get_element_schema(tag_uri, tag_name) if schema.keep_spaces: keep_spaces_level -= 1 if keep_spaces_level == 0: keep_spaces = False elif type == MESSAGE: # Segmentation for segment in get_segments(value, keep_spaces, srx_handler): yield segment
def process_start_tag(tag_uri, tag_name, attributes, stack, repeat, encoding): # Skip "<stl:block>" and "<stl:inline>" if tag_uri == stl_uri: return None # stl:omit-tag if stl_omit_tag in attributes: expression = attributes[stl_omit_tag] if evaluate_if(expression, stack, repeat): return None # Process attributes aux = {} for attr_uri, attr_name in attributes: # Omit stl attributes if attr_uri == stl_uri: continue # Omit stl namespace if attr_uri == xmlns_uri and attr_name == 'stl': continue value = attributes[(attr_uri, attr_name)] # Process "${...}" expressions datatype = get_attr_datatype(tag_uri, tag_name, attr_uri, attr_name, attributes) # Boolean attributes if issubclass(datatype, Boolean): value = substitute_boolean(value, stack, repeat, encoding) if value is True: aux[(attr_uri, attr_name)] = attr_name continue # Non Boolean attributes value, n = substitute_attribute(value, stack, repeat, encoding) # Output only values different than None if value is None: continue aux[(attr_uri, attr_name)] = value return START_ELEMENT, (tag_uri, tag_name, aux), None
def process_start_tag(tag_uri, tag_name, attributes, stack, repeat, encoding): # Skip "<stl:block>" and "<stl:inline>" if tag_uri == stl_uri: return None # stl:omit-tag if stl_omit_tag in attributes: expression = attributes[stl_omit_tag] if evaluate_if(expression, stack, repeat): return None # Process attributes aux = {} for attr_uri, attr_name in attributes: # Omit stl attributes if attr_uri == stl_uri: continue # Omit stl namespace if attr_uri == xmlns_uri and attr_name == 'stl': continue value = attributes[(attr_uri, attr_name)] # Process "${...}" expressions datatype = get_attr_datatype(tag_uri, tag_name, attr_uri, attr_name, attributes) # Boolean attributes if issubclass(datatype, Boolean): value = substitute_boolean(value, stack, repeat, encoding) if value is True: aux[(attr_uri, attr_name)] = attr_name continue # Non Boolean attributes value, n = substitute_attribute(value, stack, repeat, encoding) # Output only values different than None if value is None: continue aux[(attr_uri, attr_name)] = value return START_ELEMENT, (tag_uri, tag_name, aux), None
def translate(events, catalog, srx_handler=None): # Default values encoding = 'utf-8' doctype = None keep_spaces = False keep_spaces_level = 0 namespaces = {} for event in _get_translatable_blocks(events): type, value, line = event # Set the good encoding if type == XML_DECL: encoding = value[1] yield event # Store the current DTD elif type == DOCUMENT_TYPE: name, doctype = value yield event # GO ! elif type == START_ELEMENT: tag_uri, tag_name, attributes = value # Attributes (translate) for attr_uri, attr_name in attributes: value = attributes[(attr_uri, attr_name)] datatype = get_attr_datatype(tag_uri, tag_name, attr_uri, attr_name, attributes) if issubclass(datatype, Unicode): value = value.strip() if value: value = datatype.decode(value, encoding) unit = ((srx_TEXT, value),) context = _get_attr_context(datatype,tag_name, attr_name) unit = catalog.gettext(unit, context) value = unit[0][1] value = value.encode(encoding) attributes[(attr_uri, attr_name)] = value # Namespaces # FIXME We must support xmlns="...." too. # FIXME We must consider the end of the declaration if attr_uri == xmlns_uri: namespaces[attr_name] = value yield START_ELEMENT, (tag_uri, tag_name, attributes), None # Keep spaces ? schema = get_element_schema(tag_uri, tag_name) if schema.keep_spaces: keep_spaces = True keep_spaces_level += 1 elif type == END_ELEMENT: yield event # Keep spaces ? tag_uri, tag_name = value schema = get_element_schema(tag_uri, tag_name) if schema.keep_spaces: keep_spaces_level -= 1 if keep_spaces_level == 0: keep_spaces = False elif type == MESSAGE: translation = translate_message(value, catalog, keep_spaces, srx_handler) try: for event in XMLParser(translation.encode(encoding), namespaces, doctype=doctype): yield event except XMLError: raise XMLError, ('please have a look in your source file, ' 'line ~ %d:\n%s') % (line, value.to_str()) else: yield event