Track url as an absolute Path and add Site.url_for helper
This commit is contained in:
@@ -26,9 +26,10 @@ class Output(ABC):
|
||||
raise OutputError("destination path must be normalized")
|
||||
self.destination = destination
|
||||
|
||||
url = site.base_dir + "/" + destination.as_posix()
|
||||
url = url.removesuffix("/index.html") or "/"
|
||||
self.url = url
|
||||
url = site.base_dir / destination
|
||||
if url.name == "index.html":
|
||||
url = url.parent
|
||||
self.url = url.as_posix()
|
||||
|
||||
@property
|
||||
def site(self) -> Site:
|
||||
|
||||
+14
-5
@@ -64,9 +64,9 @@ class Site:
|
||||
return cast(dict[str, Any], config)
|
||||
|
||||
@staticmethod
|
||||
def parse_base_url(value: str | None) -> tuple[str, str]:
|
||||
def parse_base_url(value: str | None) -> tuple[str, Path]:
|
||||
if not value:
|
||||
return ("", "")
|
||||
return ("", Path("/"))
|
||||
parsed = urlparse(value)
|
||||
if parsed.scheme and parsed.netloc:
|
||||
origin = f"{parsed.scheme}://{parsed.netloc}"
|
||||
@@ -75,7 +75,11 @@ class Site:
|
||||
else:
|
||||
origin = ""
|
||||
|
||||
path = parsed.path.removesuffix("/")
|
||||
if parsed.path:
|
||||
path = Path(parsed.path)
|
||||
else:
|
||||
path = Path("/")
|
||||
|
||||
return (origin, path)
|
||||
|
||||
@staticmethod
|
||||
@@ -120,7 +124,12 @@ class Site:
|
||||
self.directories.append(d)
|
||||
|
||||
def home_url(self) -> str:
|
||||
return self.base_dir or "/"
|
||||
return self.base_dir.as_posix()
|
||||
|
||||
def url_for(self, path: str) -> str:
|
||||
if Path(path).is_absolute():
|
||||
raise OutputError("path must be relative")
|
||||
return (self.base_dir / path).as_posix()
|
||||
|
||||
def section_url(self, section: str) -> str:
|
||||
path = Index.build_path("section", 1, section)
|
||||
@@ -179,7 +188,7 @@ class Site:
|
||||
"base_url config value is missing a domain name, "
|
||||
"can't add canonical url to content"
|
||||
)
|
||||
if self.base_dir and not self.base_dir.startswith("/"):
|
||||
if not self.base_dir.is_absolute():
|
||||
raise ConfigError("base_url config value must be an absolute path")
|
||||
self.discover()
|
||||
outputs: list[Output] = [*self.directories, *self.content]
|
||||
|
||||
@@ -4,8 +4,8 @@
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>{% block title %}{{ site.name }}{% endblock %}</title>
|
||||
<link rel="stylesheet" href="{{ site.base_dir }}/assets/style.css">
|
||||
<link rel="stylesheet" href="{{ site.base_dir }}/assets/pygments.css">
|
||||
<link rel="stylesheet" href="{{ site.url_for('assets/style.css') }}">
|
||||
<link rel="stylesheet" href="{{ site.url_for('assets/pygments.css') }}">
|
||||
{% if site.origin %}<link rel="canonical" href="{{ site.origin }}{{ page.url }}">{% endif %}
|
||||
{% block head %}{% endblock %}
|
||||
</head>
|
||||
|
||||
Reference in New Issue
Block a user