Seo.Py

manifest plugin

!! function

_create_seo function

_create_seo source


        def _create_seo(
            markata: Markata,
            soup: BeautifulSoup,
            article: "frontmatter.Post",
            site_name: str,
            author_name: str,
            author_email: str,
            twitter_card: str,
            twitter_creator: str,
            config_seo: Dict,
            images_url: str,
        ) -> List:
            if article.metadata["description"] == "" or None:
                try:
                    article.metadata["description"] = " ".join(
                        [p.text for p in soup.find(id="post-body").find_all("p")],
                    ).strip()[:120]
                except AttributeError:
                    article.metadata["description"] = ""

            seo = [
                *config_seo,
                {
                    "name": "og:author",
                    "property": "og:author",
                    "content": author_name,
                },
                {
                    "name": "og:author_email",
                    "property": "og:author_email",
                    "content": author_email,
                },
                {
                    "name": "og:type",
                    "property": "og:type",
                    "content": "website",
                },
                {
                    "name": "description",
                    "property": "description",
                    "content": article.metadata["description"],
                },
                {
                    "name": "og:description",
                    "property": "og:description",
                    "content": article.metadata["description"],
                },
                {
                    "name": "twitter:description",
                    "property": "twitter:description",
                    "content": article.metadata["description"],
                },
                {
                    "name": "og:title",
                    "property": "og:title",
                    "content": f'{article.metadata["title"]} | {site_name}'[:60],
                },
                {
                    "name": "twitter:title",
                    "property": "twitter:title",
                    "content": f'{article.metadata["title"]} | {site_name}'[:60],
                },
                {
                    "name": "og:image",
                    "property": "og:image",
                    "content": f'{images_url}/{article.metadata["slug"]}-og.png',
                },
                {
                    "name": "twitter:image",
                    "property": "twitter:image",
                    "content": f'{images_url}/{article.metadata["slug"]}-og.png',
                },
                {
                    "name": "og:image:width",
                    "property": "og:image:width",
                    "content": "1600",
                },
                {
                    "name": "og:image:width",
                    "property": "og:image:width",
                    "content": "900",
                },
                {
                    "name": "twitter:card",
                    "property": "twitter:card",
                    "content": twitter_card,
                },
                {
                    "name": "og:site_name",
                    "property": "og:site_name",
                    "content": site_name,
                },
                {
                    "name": "twitter:creator",
                    "property": "twitter:creator",
                    "content": twitter_creator,
                },
                {
                    "name": "title",
                    "property": "title",
                    "content": article.metadata["title"],
                },
                {
                    "name": "generator",
                    "property": "generator",
                    "content": f"markata {__version__}",
                },
            ]
            return seo

!! function

_add_seo_tags function

_add_seo_tags source


        def _add_seo_tags(seo: List, article: "frontmatter.Post", soup: BeautifulSoup) -> None:
            for meta in seo:
                soup.head.append(_create_seo_tag(meta, soup))

!! function

_create_seo_tag function

_create_seo_tag source


        def _create_seo_tag(meta: dict, soup: BeautifulSoup) -> "Tag":
            tag = soup.new_tag("meta")
            for k in meta:
                tag.attrs[k] = meta[k]
            return tag

!! function

_get_or_warn function

_get_or_warn source


        def _get_or_warn(config: Dict, key: str, default: str) -> Any:
            if key not in config.keys():
                logger.warning(
                    f"{key} is missing from markata.toml config, using default value {default}",
                )
            return config.get(key, default)

!! function

render function

render source


        def render(markata: Markata) -> None:
            url = _get_or_warn(markata.config, "url", "")
            images_url = markata.config.get("images_url", url)
            site_name = _get_or_warn(markata.config, "site_name", "")
            author_name = _get_or_warn(markata.config, "author_name", "")
            author_email = _get_or_warn(markata.config, "author_email", "")
            twitter_creator = _get_or_warn(markata.config, "twitter_creator", "")
            twitter_card = _get_or_warn(markata.config, "twitter_card", "summary_large_image")
            config_seo = markata.config.get("seo", {})
            should_prettify = markata.config.get("prettify_html", False)

            with markata.cache as cache:
                for article in markata.iter_articles("add seo tags from seo.py"):
                    key = markata.make_hash(
                        "seo",
                        "render",
                        article.html,
                        site_name,
                        url,
                        article.metadata["slug"],
                        twitter_card,
                        article.metadata["title"],
                        str(config_seo),
                    )

                    html_from_cache = markata.precache.get(key)

                    if html_from_cache is None:
                        soup = BeautifulSoup(article.html, features="lxml")
                        seo = _create_seo(
                            markata=markata,
                            soup=soup,
                            article=article,
                            site_name=site_name,
                            author_name=author_name,
                            author_email=author_email,
                            twitter_card=twitter_card,
                            twitter_creator=twitter_creator,
                            config_seo=config_seo,
                            images_url=images_url,
                        )
                        _add_seo_tags(seo, article, soup)
                        canonical_link = soup.new_tag("link")
                        canonical_link.attrs["rel"] = "canonical"
                        if article.metadata["slug"] == "index":
                            canonical_link.attrs["href"] = f"{url}/"
                        else:
                            canonical_link.attrs["href"] = f'{url}/{article.metadata["slug"]}/'
                        soup.head.append(canonical_link)

                        meta_url = soup.new_tag("meta")
                        meta_url.attrs["name"] = "og:url"
                        meta_url.attrs["property"] = "og:url"
                        if article.metadata["slug"] == "index":
                            meta_url.attrs["content"] = f"{url}/"
                        else:
                            meta_url.attrs["content"] = f'{url}/{article.metadata["slug"]}/'
                        soup.head.append(meta_url)

                        html = soup.prettify() if should_prettify else str(soup)
                        cache.add(key, html, expire=markata.config.default_cache_expire)

                    else:
                        html = html_from_cache
                    article.html = html