Compare commits

..

2 Commits

4 changed files with 66 additions and 32 deletions

View File

@ -56,6 +56,8 @@ stylesheet = "dragonglass.css"
[metadata] [metadata]
# If true, use page title as default description. # If true, use page title as default description.
description-title = false description-title = false
# The language of the site, expressed as a RFC5646 language identifier.
lang = "en"
# The site base URL. If supplied, this will be added to a <base> element in the page metadata. # The site base URL. If supplied, this will be added to a <base> element in the page metadata.
sitebase = "" sitebase = ""
# The site title. If supplied, this will be included in page metadata and used to formulate the default title. # The site title. If supplied, this will be included in page metadata and used to formulate the default title.

View File

@ -1,20 +1,23 @@
TEMPLATE VARIABLES PROVIDED BY DRAGONGLASS WHEN RENDERING A DOCUMENT TEMPLATE VARIABLES PROVIDED BY DRAGONGLASS WHEN RENDERING A DOCUMENT
backlinks backlinks:
A list of pages that link to the page being rendered. Formatted as a list of dicts with A list of pages that link to the page being rendered. Formatted as a list of dicts with
two elements, "name" and "link", containing the page title and the link to it, respectively. two elements, "name" and "link", containing the page title and the link to it, respectively.
default_stylesheet default_stylesheet:
The filename of the default stylesheet which is generated by dragonglass and added to the The filename of the default stylesheet which is generated by dragonglass and added to the
generated pages. generated pages.
description description:
The description of this page. May be empty. The description of this page. May be empty.
dragonglass_version dragonglass_version:
The version number of dragonglass. The version number of dragonglass.
python_version lang:
The configured site language, as a RFC5646 language identifier.
python_version:
The version number of Python that's running dragonglass. The version number of Python that's running dragonglass.
site_base: site_base:
@ -26,8 +29,8 @@ site_title:
tags: tags:
A list of all tags the page being rendered has, in sorted order. A list of all tags the page being rendered has, in sorted order.
text text:
The text of the page being rendered. The text of the page being rendered.
title title:
The title of the page being rendered. The title of the page being rendered.

View File

@ -121,14 +121,20 @@ class Context:
@property @property
def site_base(self) -> str | None: def site_base(self) -> str | None:
"""Returns the configured site base URL.""" """Returns the configured site base URL."""
generate_section = self.config.get("metadata", {}) metadata_section = self.config.get("metadata", {})
return generate_section.get("sitebase", None) return metadata_section.get("sitebase", None)
@property
def site_language(self) -> str:
"""Returns the defayult language for the site."""
metadata_section = self.config.get("metadata", {})
return metadata_section.get("lang", "en")
@property @property
def site_title(self) -> str | None: def site_title(self) -> str | None:
"""Returns the configured site title.""" """Returns the configured site title."""
generate_section = self.config.get("metadata", {}) metadata_section = self.config.get("metadata", {})
return generate_section.get("sitetitle", None) return metadata_section.get("sitetitle", None)
@property @property
def url_prefix(self) -> str: def url_prefix(self) -> str:

View File

@ -4,7 +4,7 @@
import sys import sys
from jinja2 import Environment, BaseLoader, ChoiceLoader, FunctionLoader, FileSystemLoader from jinja2 import Environment, BaseLoader, ChoiceLoader, FunctionLoader, FileSystemLoader
from typing import Any from typing import Any, Callable
from urllib.parse import quote as urlquote from urllib.parse import quote as urlquote
from .config import Context, DEFAULT_TEMPLATE_NAME from .config import Context, DEFAULT_TEMPLATE_NAME
@ -13,7 +13,7 @@ from ._version import __version__
"""The default template used to render Markdown data.""" """The default template used to render Markdown data."""
DEFAULT_TEMPLATE = """<html> DEFAULT_TEMPLATE = """<html lang="{{ lang }}">
<head> <head>
{% if site_title is defined %} {% if site_title is defined %}
<title>{{ title }} - {{ site_title }}</title> <title>{{ title }} - {{ site_title }}</title>
@ -21,6 +21,7 @@ DEFAULT_TEMPLATE = """<html>
{% else %} {% else %}
<title>{{ title }}</title> <title>{{ title }}</title>
{% endif %} {% endif %}
<meta charset="utf-8"/>
{% if site_base is defined %} {% if site_base is defined %}
<base href="{{ site_base }}"/> <base href="{{ site_base }}"/>
{% endif %} {% endif %}
@ -73,6 +74,28 @@ def _create_loader(ctxt: Context) -> BaseLoader:
return ChoiceLoader(choices) return ChoiceLoader(choices)
def makepath(ctxt: Context, node: SourceNode | None, s: str) -> str:
"""
Turn a string into a proper path reference, based on relative link settings and prefix.
Args:
ctxt (Context): The context to use for the operation.
node (SourceNode): The current node being processed; if this is ``None``, it's taken from the context.
s (str): The string to interpret.
Returns:
str: The resolved link.
"""
if not node:
node = ctxt.current_node
if ctxt.relative_links:
in_path = ctxt.source_dir / s
rel_path = ctxt.source_dir / node.path
return urlquote(in_path.relative_to(rel_path.parent, walk_up=True).as_posix())
else:
return urlquote(ctxt.url_prefix + s)
def create_template_environment(ctxt: Context) -> Environment: def create_template_environment(ctxt: Context) -> Environment:
""" """
Create the template environment used to render the data to the destination. Create the template environment used to render the data to the destination.
@ -83,7 +106,24 @@ def create_template_environment(ctxt: Context) -> Environment:
Returns: Returns:
Environment: The new template environment. Environment: The new template environment.
""" """
return Environment(loader=_create_loader(ctxt)) tenv = Environment(loader=_create_loader(ctxt))
# Add global variables easily calculated.
tenv.globals['dragonglass_version'] = __version__
tenv.globals["python_version"] = f"{sys.version_info[0]}.{sys.version_info[1]}.{sys.version_info[2]}"
# Add values derived from configuration.
tenv.globals["lang"] = ctxt.site_language
t = ctxt.site_base
if t:
tenv.globals["site_base"] = t
t = ctxt.site_title
if t:
tenv.globals["site_title"] = t
# Add global functions.
tenv.globals['makepath'] = lambda s: makepath(ctxt, None, s)
return tenv
def template_vars(node: SourceNode, ctxt: Context) -> dict[str, Any]: def template_vars(node: SourceNode, ctxt: Context) -> dict[str, Any]:
@ -103,18 +143,6 @@ def template_vars(node: SourceNode, ctxt: Context) -> dict[str, Any]:
if not tvars["description"] and ctxt.description_title: if not tvars["description"] and ctxt.description_title:
tvars["description"] = node.page_title tvars["description"] = node.page_title
# Add easily-calculated "global" variables.
tvars["dragonglass_version"] = __version__
tvars["python_version"] = f"{sys.version_info[0]}.{sys.version_info[1]}.{sys.version_info[2]}"
# Add values derived from configuration.
t = ctxt.site_base
if t:
tvars["site_base"] = t
t = ctxt.site_title
if t:
tvars["site_title"] = t
# Compute backlinks for this node. Don't include nodes that aren't published. # Compute backlinks for this node. Don't include nodes that aren't published.
backlinks = sorted([n for n in node.backlinks if n.publish], key=lambda n: n.page_title) backlinks = sorted([n for n in node.backlinks if n.publish], key=lambda n: n.page_title)
tvars['backlinks'] = [{'title': n.page_title, tvars['backlinks'] = [{'title': n.page_title,
@ -122,12 +150,7 @@ def template_vars(node: SourceNode, ctxt: Context) -> dict[str, Any]:
for n in backlinks] for n in backlinks]
# Add reference to the default stylesheet. # Add reference to the default stylesheet.
if ctxt.relative_links: tvars['default_stylesheet'] = makepath(ctxt, node, ctxt.default_stylesheet)
stylesheet_path = ctxt.source_dir / ctxt.default_stylesheet
rel_path = ctxt.source_dir / node.path
tvars['default_stylesheet'] = urlquote(stylesheet_path.relative_to(rel_path.parent, walk_up=True).as_posix())
else:
tvars['default_stylesheet'] = urlquote(ctxt.url_prefix + ctxt.default_stylesheet)
return tvars return tvars