def from_notebook_node(self, nb, resources=None, **kw):
        """Uses nbconvert's HTMLExporter to generate HTML, with slight modifications.

        Notes
        -----
        This exporter will only save cells generated with Altair/Vega if they have an SVG image type
        stored with them. This data is only stored if our fork of `ipyvega` is installed or the onecodex
        # renderer is used--otherwise, they will be low-resolution PNGs, which will not be exported.
        """
        nb = copy.deepcopy(nb)

        # setup our dictionary that's accessible from within jinja templates
        if resources is None:
            resources = {"metadata": {}}
        elif "metadata" not in resources:
            resources["metadata"] = {}

        # iterate over cells in the notebook and transform data as necessary
        do_not_insert_date = False

        for cell in nb.cells:
            if cell["cell_type"] == "code":
                for out in cell["outputs"]:
                    # base64 encode SVGs otherwise Weasyprint can't render them. delete other
                    # types of output in jupyter-vega cells (e.g., image/png, or javascript)
                    if out.get("metadata") and out["metadata"].get("jupyter-vega"):
                        for mimetype in out.get("data", []):
                            if mimetype == "image/svg+xml":
                                img = b64encode(
                                    bytes(out["data"]["image/svg+xml"], encoding="UTF-8")
                                ).decode()
                                img = '<img src="data:image/svg+xml;charset=utf-8;base64,%s">' % (
                                    img,
                                )
                                out["data"] = {"image/svg+xml": img}
                                break
                        else:
                            out["data"] = {}
                    # transfer text/css blocks to HTML <head> tag
                    elif out.get("metadata") and out["metadata"].get("onecodex") == "head.style":
                        for mimetype in out.get("data", []):
                            if mimetype == "text/css":
                                style_block = '<style type="text/css">{}</style>'.format(
                                    out["data"]["text/css"]
                                )
                                head_block = (
                                    resources["metadata"].get("head_block", "") + style_block
                                )
                                resources["metadata"]["head_block"] = head_block
                                break

                        # we don't want this to be output as text, so clear it
                        out["data"] = {"text/plain": ""}
                    # if there's a custom date specified, don't insert it
                    elif out.get("metadata") and out["metadata"].get("onecodex") == "customdate":
                        do_not_insert_date = True

        # add one codex logo unless told not to
        if not os.environ.get("ONE_CODEX_REPORT_NO_LOGO", False):
            img = b64encode(
                bytes(open(os.path.join(ASSETS_PATH, "one_codex_logo.png"), "rb").read())
            ).decode()
            img = "data:image/png;charset=utf-8;base64,%s" % (img,)
            logo_html = report.set_logo(img, position="right")._repr_mimebundle_()["text/html"]
            head_block = resources["metadata"].get("head_block", "") + logo_html
            resources["metadata"]["head_block"] = head_block

        # add today's date unless told not to (i.e. a custom date was specified)
        if not do_not_insert_date:
            date_div = report.set_date()._repr_mimebundle_()[0]["text/html"]
            head_block = resources["metadata"].get("head_block", "") + date_div
            resources["metadata"]["head_block"] = head_block

        # embed the default CSS
        css = open(os.path.join(ASSETS_PATH, CSS_TEMPLATE_FILE), "r").read()
        css = '<style type="text/css">{}</style>'.format(css)
        head_block = resources["metadata"].get("head_block", "") + css
        resources["metadata"]["head_block"] = head_block

        # tag this report for traceability, if run from notebook service. these will be transferred
        # to PDF metadata if the HTML output of this function is used as input for PDF generation
        meta_tags = [("dcterms.created", datetime.datetime.now(pytz.utc).isoformat())]

        user_uuid = os.environ.get("ONE_CODEX_USER_UUID")
        if user_uuid is not None:
            meta_tags.append(("author", "one_codex_user_uuid_{}".format(user_uuid)))

        nb_uuid = os.environ.get("ONE_CODEX_NOTEBOOK_UUID")
        if nb_uuid is not None:
            meta_tags.append(("author", "one_codex_notebook_uuid_{}".format(nb_uuid)))

        meta_html = ""

        for meta_name, meta_val in meta_tags:
            meta_html += '<meta name="{}" content="{}" />\n'.format(meta_name, meta_val)

        head_block = resources["metadata"].get("head_block", "") + meta_html
        resources["metadata"]["head_block"] = head_block

        output, resources = super(OneCodexHTMLExporter, self).from_notebook_node(
            nb, resources=resources, **kw
        )

        return output, resources