11from __future__ import annotations
22
33import os
4+ import posixpath
45from pathlib import Path
56from typing import TYPE_CHECKING
67from urllib .parse import urljoin , urlparse , urlsplit , urlunsplit
@@ -100,11 +101,16 @@ def get_tags(
100101 tags ["og:type" ] = config .ogp_type
101102
102103 if not config .ogp_site_url and os .getenv ("READTHEDOCS" ):
103- config .ogp_site_url = read_the_docs_site_url (config .html_baseurl )
104+ ogp_site_url = read_the_docs_site_url (config .html_baseurl )
105+ else :
106+ ogp_site_url = config .ogp_site_url
107+
108+ # If ogp_canonical_url is not set, default to the value of ogp_site_url
109+ ogp_canonical_url = config .ogp_canonical_url or ogp_site_url
104110
105111 # url tag
106112 # Get the URL of the specific page
107- page_url = urljoin (config . ogp_site_url , builder .get_target_uri (context ["pagename" ]))
113+ page_url = urljoin (ogp_canonical_url , builder .get_target_uri (context ["pagename" ]))
108114 tags ["og:url" ] = page_url
109115
110116 # site name tag, False disables, default to project if ogp_site_name not
@@ -156,6 +162,8 @@ def get_tags(
156162 title = title ,
157163 description = description ,
158164 pagename = context ["pagename" ],
165+ ogp_site_url = ogp_site_url ,
166+ ogp_canonical_url = ogp_canonical_url ,
159167 srcdir = srcdir ,
160168 outdir = outdir ,
161169 config = config ,
@@ -202,7 +210,7 @@ def get_tags(
202210 else : # ogp_image is set
203211 # ogp_image is defined as being relative to the site root.
204212 # This workaround is to keep that functionality from breaking.
205- root = config . ogp_site_url
213+ root = ogp_site_url
206214
207215 image_url = urljoin (root , image_url_parsed .path )
208216 tags ["og:image" ] = image_url
@@ -251,6 +259,8 @@ def social_card_for_page(
251259 title : str ,
252260 description : str ,
253261 pagename : str ,
262+ ogp_site_url : str ,
263+ ogp_canonical_url : str ,
254264 * ,
255265 srcdir : str | Path ,
256266 outdir : str | Path ,
@@ -272,7 +282,7 @@ def social_card_for_page(
272282 # Site URL
273283 site_url = config_social .get ("site_url" , True )
274284 if site_url is True :
275- url_text = config . ogp_site_url .split ("://" )[- 1 ]
285+ url_text = ogp_canonical_url .split ("://" )[- 1 ]
276286 elif isinstance (site_url , str ):
277287 url_text = site_url
278288
@@ -286,15 +296,12 @@ def social_card_for_page(
286296 pagename ,
287297 srcdir = srcdir ,
288298 outdir = outdir ,
289- config = config ,
290299 env = env ,
300+ html_logo = config .html_logo ,
291301 )
292302
293303 # Link the image in our page metadata
294- # We use os.path.sep to standardize behavior acros *nix and Windows
295- url = config .ogp_site_url .strip ("/" )
296- image_path = str (image_path ).replace (os .path .sep , "/" ).strip ("/" )
297- return f"{ url } /{ image_path } "
304+ return posixpath .join (ogp_site_url , image_path .as_posix ())
298305
299306
300307def html_page_context (
@@ -320,6 +327,7 @@ def setup(app: Sphinx) -> ExtensionMetadata:
320327 # ogp_site_url="" allows relative by default, even though it's not
321328 # officially supported by OGP.
322329 app .add_config_value ("ogp_site_url" , "" , "html" )
330+ app .add_config_value ("ogp_canonical_url" , "" , "html" )
323331 app .add_config_value ("ogp_description_length" , DEFAULT_DESCRIPTION_LENGTH , "html" )
324332 app .add_config_value ("ogp_image" , None , "html" )
325333 app .add_config_value ("ogp_image_alt" , None , "html" )
0 commit comments