publish_html.py

Sets the articles output_html path, and saves the article's html to the output_html file.

Ouptut Directory

Output will always be written inside of the configured output_dir

[markata]
# markout is the default, but you can override it in your markata.toml file
output_dir = "markout"

Explicityly set the output

markata will save the articles html to the output_html specified in the articles metadata, loaded from frontmatter.

404 example use case

Here is an example use case of explicitly setting the output_html. By default markata will turn pages/404.md into markout/404/index.html, but many hosting providers look for a 404.html to redirect the user to when a page is not found.

---
title: Whoops that page was not found
description: 404, looks like we can't find the page you are looking for
output_html: 404.html

---

404, looks like we can't find the page you are looking for.  Try one of these
pages.

<ul>
{% for post in
    markata.map(
        'post',
        filter='"markata" not in slug and "tests" not in slug and "404" not in slug'
        )
 %}
    <li><a href="{{ post.slug }}">{{ post.title or "CHANGELOG" }}</a></li>
{% endfor %}
</ul>

Index.md is the one special case

If you have a file pages/index.md it will become markout/index.html rather than markout/index/inject.html This is one of the primary ways that markata lets you make your home page

_is_relative_to function

_is_relative_to source
def _is_relative_to(output_dir: Path, output_html: Path):
    try:
        output_html.relative_to(output_dir)
        return True
    except ValueError:
        return False

pre_render function

Sets the output_html in the articles metadata. If the output is explicitly given, it will make sure its in the output_dir, if it is not explicitly set it will use the articles slug.

pre_render source
def pre_render(markata: "Markata") -> None:
    """
    Sets the `output_html` in the articles metadata.  If the output is
    explicitly given, it will make sure its in the `output_dir`, if it is not
    explicitly set it will use the articles slug.
    """
    output_dir = Path(markata.config["output_dir"])  # type: ignore
    output_dir.mkdir(parents=True, exist_ok=True)

    for article in markata.articles:
        if "output_html" in article.metadata:
            article_path = Path(article["output_html"])
            if not _is_relative_to(output_dir, article_path):
                article["output_html"] = output_dir / article["output_html"]
        elif article["slug"] == "index":
            article["output_html"] = output_dir / "index.html"
        else:
            article["output_html"] = output_dir / article["slug"] / "index.html"

save function

Saves all the articles to their set output_html location if that location is relative to the specified output_dir. If its not relative to the output_dir it will log an error and move on.

save source
def save(markata: "Markata") -> None:
    """
    Saves all the articles to their set `output_html` location if that location
    is relative to the specified `output_dir`.  If its not relative to the
    `output_dir` it will log an error and move on.
    """
    output_dir = Path(markata.config["output_dir"])  # type: ignore

    for article in markata.articles:
        article_path = Path(article["output_html"])
        if _is_relative_to(output_dir, article_path):
            article_path.parent.mkdir(parents=True, exist_ok=True)
            with open(article_path, "w+") as f:
                f.write(article.html)
        else:
            markata.console.log(
                f'article "{article["path"]}" '
                f"attempted to write to "
                f'"{article["output_html"]}"'
                f"outside of the configured output_dir "
                f'"{output_dir}"'
            )