示例#1
0
 def callback(node):
     if (node.nodeType
             == node.ELEMENT_NODE) and (node.nodeName.startswith("s:")):
         hook_name = node.nodeName[2:]
         if hook_name not in cls._SPECIAL:
             if hook_name in cls._HOOKS:
                 hook_class = cls._HOOKS[hook_name]
                 replace_by = hook_class.handle(rendered_presentation,
                                                node)
                 if replace_by is None:
                     # Delete node
                     XMLTools.remove_node(node)
                 elif replace_by is node:
                     # Keep node
                     pass
                 else:
                     XMLTools.replace_node(node, replace_by)
                     continue_descent_with_replaced_elements = node.nodeName not in cls._BREAK_DESCENT_ON
                     if continue_descent_with_replaced_elements:
                         if not isinstance(replace_by, list):
                             XMLTools.walk(replace_by, callback)
                         else:
                             for new_child in replace_by:
                                 XMLTools.walk(new_child, callback)
             else:
                 _log.warning(
                     "Unknown hook '%s' used in source document.",
                     hook_name)
     elif node.nodeType == node.TEXT_NODE:
         text = node.wholeText
         new_text = cls._replace_text(text)
         if text != new_text:
             node.replaceWholeText(new_text)
示例#2
0
    def handle(cls, rendered_presentation, node):
        properties = {
            "formula": XMLTools.inner_text(node),
            "long": XMLTools.get_bool_attr(node, "long"),
        }
        if node.hasAttribute("scale"):
            user_scale = float(node.getAttribute("scale"))
        else:
            user_scale = 1
        tex_renderer = rendered_presentation.renderer.get_custom_renderer(
            "latex")
        rendered_formula = tex_renderer.render(properties)
        local_filename = "imgs/latex/%s.png" % (rendered_formula.keyhash)
        uri = "%simgs/latex/%s.png" % (
            rendered_presentation.renderer.rendering_params.resource_uri,
            rendered_formula.keyhash)

        scale_factor = 0.625 * user_scale
        width_px = round(rendered_formula.data["info"]["width"] * scale_factor)
        baseline_px = round(rendered_formula.data["info"]["baseline"] *
                            scale_factor)
        #print(properties["formula"], rendered_formula.data["info"], width_px)

        # For now, always wrap in div for long formulae. Could easily add an
        # option to override this if it's useful.
        wrap_in_div = properties["long"]

        img_node = node.ownerDocument.createElement("img")
        img_node.setAttribute("src", uri)
        if properties["long"]:
            img_node.setAttribute("style",
                                  "width: %dpx; margin-top: 5px" % (width_px))
        else:
            img_node.setAttribute(
                "style", "width: %dpx; margin-bottom: %dpx; margin-top: 5px" %
                (width_px, -baseline_px + 1))
        img_node.setAttribute("alt", properties["formula"])

        if not wrap_in_div:
            replacement_node = img_node
        else:
            replacement_node = node.ownerDocument.createElement("div")
            replacement_node.setAttribute("class", "texformula")
            replacement_node.appendChild(img_node)

        rendered_presentation.add_file(local_filename,
                                       rendered_formula.data["png_data"])
        return replacement_node
示例#3
0
    def handle(cls, rendered_presentation, node):
        acronym_id = XMLTools.inner_text(node)

        acronym = rendered_presentation.renderer.get_custom_renderer("acronym")
        resolved = acronym.resolve(acronym_id)
        if resolved is None:
            replacement_node = node.ownerDocument.createTextNode(acronym_id)
        else:
            rendered_presentation.add_feature(PresentationFeature.Acronyms)

            outer_span_node = node.ownerDocument.createElement("span")
            replacement_node = outer_span_node

            if resolved.uri is not None:
                link_node = outer_span_node.appendChild(
                    node.ownerDocument.createElement("a"))
                link_node.setAttribute("href", resolved.uri)
                link_node.setAttribute("class", "tooltip-link")
                chain_node = link_node
            else:
                chain_node = outer_span_node

            chain_node.setAttribute("class", "tooltip")
            chain_node.appendChild(
                node.ownerDocument.createTextNode(resolved.acronym))

            inner_span = chain_node.appendChild(
                node.ownerDocument.createElement("span"))
            inner_span.setAttribute("class", "text")
            inner_span.appendChild(
                node.ownerDocument.createTextNode(resolved.text))

        return replacement_node
示例#4
0
	def handle(cls, rendered_presentation, node):
		text = XMLTools.inner_text(node).strip()
		style = {
			"fr":	"«»",
			"de":	"„“",
			"sgl":	"‘’",
		}.get(node.getAttribute("type"), "“”")
		replacement_text = style[0] + text + style[1]
		replacement_node = node.ownerDocument.createTextNode(replacement_text)
		return replacement_node
示例#5
0
    def handle(cls, rendered_presentation, node):
        if node.hasAttribute("src"):
            with open(
                    rendered_presentation.renderer.lookup_include(
                        node.getAttribute("src"))) as f:
                text = f.read()
        else:
            text = XMLTools.inner_text(node)

        text = text.strip("\n")
        text = textwrap.dedent(text)
        text = text.strip("\n")
        text = text.expandtabs(4)

        return cls.handle_text(text, rendered_presentation, node)
示例#6
0
    def handle(cls, rendered_presentation, node):
        text = XMLTools.inner_text(node).strip()
        if text not in cls._REPLACEMENTS:
            _log.warning("%s(%s) not available. Ignored the sequence.",
                         cls._TAG_NAME, text)
            return None
        else:
            replacement_text = cls._REPLACEMENTS[text]

            text_node = node.ownerDocument.createTextNode(replacement_text)
            if cls._SPAN_ATTRIBUTES is None:
                replacement_node = text_node
            else:
                replacement_node = node.ownerDocument.createElement("span")
                for (key, value) in cls._SPAN_ATTRIBUTES.items():
                    replacement_node.setAttribute(key, value)
                replacement_node.appendChild(text_node)

            return replacement_node
示例#7
0
    def handle(cls, rendered_presentation, node):
        value = int(XMLTools.inner_text(node))
        last_digit = value % 10
        if last_digit == 1:
            suffix = "st"
        elif last_digit == 2:
            suffix = "nd"
        elif last_digit == 3:
            suffix = "rd"
        else:
            suffix = "th"

        replacement_nodes = [
            node.ownerDocument.createTextNode(str(value)),
            node.ownerDocument.createElement("sup"),
        ]
        replacement_nodes[1].appendChild(
            node.ownerDocument.createTextNode(suffix))
        return replacement_nodes
示例#8
0
	def handle(cls, rendered_presentation, node):
		transformations = [ ]
		for child_node in node.childNodes:
			if (child_node.nodeType == child_node.ELEMENT_NODE) and (child_node.tagName == "transform"):
				transformations.append(cls._parse_transformation(child_node))

		properties = {
			"src":				rendered_presentation.renderer.lookup_include(node.getAttribute("src")),
			"max_dimension":	rendered_presentation.renderer.rendering_params.image_max_dimension,
		}
		if len(transformations) > 0:
			properties["svg_transform"] = transformations
		img_renderer = rendered_presentation.renderer.get_custom_renderer("img")
		rendered_image = img_renderer.render(properties)
		local_filename = "imgs/img/%s.%s" % (rendered_image.keyhash, rendered_image.data["extension"])
		uri = "%simgs/img/%s.%s" % (rendered_presentation.renderer.rendering_params.resource_uri, rendered_image.keyhash, rendered_image.data["extension"])

		img_style = [ ]
		if node.hasAttribute("width"):
			img_style.append(("width", node.getAttribute("width")))
		if node.hasAttribute("height"):
			img_style.append(("height", node.getAttribute("height")))
		if node.hasAttribute("render"):
			img_style.append(("image-rendering", node.getAttribute("render")))

		create_filldiv = XMLTools.get_bool_attr(node, "fill", default_value = True)

		img_node = node.ownerDocument.createElement("img")
		img_node.setAttribute("src", uri)
		img_node.setAttribute("class", "fill")
		if len(img_style) > 0:
			img_node.setAttribute("style", ";".join("%s:%s" %  (key, value) for (key, value) in img_style))

		if create_filldiv:
			replacement_node = node.ownerDocument.createElement("div")
			replacement_node.setAttribute("class", "fillimg")
			replacement_node.appendChild(img_node)
		else:
			replacement_node = img_node

		rendered_presentation.add_file(local_filename, rendered_image.data["img_data"])
		return replacement_node
示例#9
0
    def handle(cls, rendered_presentation, node):
        if not node.hasAttribute("cmd"):
            raise MalformedXMLInputException(
                "An s:exec node must have a 'cmd' attribute.")

        cmd_str = node.getAttribute("cmd")
        cmd = CmdlineParser().parse(cmd_str)
        if not cmd[0].startswith("/"):
            # Not an absolute path given, look up path of executable
            try:
                full_executable_path = rendered_presentation.renderer.lookup_include(
                    cmd[0])
            except FailedToLookupFileException as e:
                # Try if this is a path command
                full_executable_path = shutil.which(cmd[0])
                if full_executable_path is None:
                    raise FailedToLookupFileException(
                        "Could lookup executable \"%s\" neither in include dirs (%s) not in $PATH."
                        % (cmd[0], str(e)))

        cmd[0] = full_executable_path
        properties = {
            "cmd": cmd,
            "cache": XMLTools.get_bool_attr(node, "cache", default_value=True),
        }

        exec_renderer = rendered_presentation.renderer.get_custom_renderer(
            "exec")
        result = exec_renderer.render(properties)

        xml_data = result.data["stdout"]
        try:
            doc = xml.dom.minidom.parseString(xml_data)
        except xml.parsers.expat.ExpatError as e:
            raise MalformedXMLInputException(
                "Ouptut of script execution (%s) returned invalid XML: %s" %
                (CmdlineEscape().cmdline(cmd), str(e)))

        root = doc.firstChild
        return list(root.childNodes)
示例#10
0
	def handle(cls, rendered_presentation, node):
		def callback(inner_node):
			text = inner_node.wholeText.replace(" ", "\u00a0")
			inner_node.replaceWholeText(text)
		XMLTools.walk(node, callback, predicate = lambda node: (node.nodeType == node.TEXT_NODE))
		return list(node.childNodes)