From 24f13e8fd5a197ba304b1ff57ddd2d2c365987b0 Mon Sep 17 00:00:00 2001 From: Itay Ziv Date: Thu, 23 Jul 2020 03:25:55 +0300 Subject: [PATCH 01/18] Mostly match current functionality --- dev-requirements.txt | 5 +-- {sphinxext => old}/opengraph.py | 0 sphinxext/opengraph/__init__.py | 23 +++++++++++++ sphinxext/opengraph/directive.py | 11 +++++++ sphinxext/opengraph/event_handler.py | 14 ++++++++ sphinxext/opengraph/util.py | 15 +++++++++ sphinxext/opengraph/visitor.py | 48 ++++++++++++++++++++++++++++ 7 files changed, 114 insertions(+), 2 deletions(-) rename {sphinxext => old}/opengraph.py (100%) create mode 100644 sphinxext/opengraph/__init__.py create mode 100644 sphinxext/opengraph/directive.py create mode 100644 sphinxext/opengraph/event_handler.py create mode 100644 sphinxext/opengraph/util.py create mode 100644 sphinxext/opengraph/visitor.py diff --git a/dev-requirements.txt b/dev-requirements.txt index 4e642f5..dfef3bc 100644 --- a/dev-requirements.txt +++ b/dev-requirements.txt @@ -1,5 +1,6 @@ -sphinx +sphinx==3.1.2 wheel==0.34.2 pytest==5.4.3 beautifulsoup4==4.9.1 -setuptools==47.3.1 \ No newline at end of file +setuptools==49.2.0 +docutils==0.16 \ No newline at end of file diff --git a/sphinxext/opengraph.py b/old/opengraph.py similarity index 100% rename from sphinxext/opengraph.py rename to old/opengraph.py diff --git a/sphinxext/opengraph/__init__.py b/sphinxext/opengraph/__init__.py new file mode 100644 index 0000000..a995325 --- /dev/null +++ b/sphinxext/opengraph/__init__.py @@ -0,0 +1,23 @@ +from typing import Any, Dict +from .directive import OpenGraphDirective +from .event_handler import html_page_context +from sphinx.application import Sphinx + + +def setup(app: Sphinx) -> Dict[str, Any]: + app.add_config_value("ogp_site_url", None, "html") + app.add_config_value("ogp_description_length", 200, "html") + app.add_config_value("ogp_image", None, "html") + app.add_config_value("ogp_image_alt", True, "html") + app.add_config_value("ogp_type", "website", "html") + app.add_config_value("ogp_site_name", None, "html") + app.add_config_value("ogp_custom_meta_tags", [], "html") + + # app.add_directive("opengraph", OpenGraphDirective) + + app.connect("html-page-context", html_page_context) + + return { + "parallel_read_safe": True, + "parallel_write_safe": True, + } diff --git a/sphinxext/opengraph/directive.py b/sphinxext/opengraph/directive.py new file mode 100644 index 0000000..3785c44 --- /dev/null +++ b/sphinxext/opengraph/directive.py @@ -0,0 +1,11 @@ +from typing import List +from sphinx.util.docutils import SphinxDirective +from docutils.nodes import Node + + +class OpenGraphDirective(SphinxDirective): + + def run(self) -> List[Node]: + pass + + pass diff --git a/sphinxext/opengraph/event_handler.py b/sphinxext/opengraph/event_handler.py new file mode 100644 index 0000000..5730773 --- /dev/null +++ b/sphinxext/opengraph/event_handler.py @@ -0,0 +1,14 @@ +from typing import Dict, Any +from sphinx.application import Sphinx +from docutils import nodes +from .util import insert_tags + + +def html_page_context( + app: Sphinx, + pagename: str, + templatename: str, + context: Dict[str, Any], + doctree: nodes.document) -> None: + if doctree: + insert_tags(context, doctree, app.config) diff --git a/sphinxext/opengraph/util.py b/sphinxext/opengraph/util.py new file mode 100644 index 0000000..b438943 --- /dev/null +++ b/sphinxext/opengraph/util.py @@ -0,0 +1,15 @@ +from typing import Dict, Any +from sphinx.config import Config +from docutils import nodes +from .visitor import OpenGraphVisitor +from sphinx.util import logging +logger = logging.getLogger(__name__) + + +def insert_tags(context: Dict[str, Any], + doctree: nodes.document, + config: Config) -> None: + visitor = OpenGraphVisitor(doctree, 300) + doctree.walkabout(visitor) + logger.info(visitor.description) + logger.info(len(visitor.description)) diff --git a/sphinxext/opengraph/visitor.py b/sphinxext/opengraph/visitor.py new file mode 100644 index 0000000..e2a1121 --- /dev/null +++ b/sphinxext/opengraph/visitor.py @@ -0,0 +1,48 @@ +from typing import List +from docutils import nodes +from sphinx.util import logging +logger = logging.getLogger(__name__) + + +class OpenGraphVisitor(nodes.GenericNodeVisitor): + + def __init__( + self, + document: nodes.document, + desc_len: int, + title_count: int = 1) -> None: + super().__init__(document) + self.description = "" + self.desc_len = desc_len + self.title_count = title_count + + def default_visit(self, node: nodes.Element): + if len(self.description) >= self.desc_len: + # Stop the traversal if the description is long enough + #raise nodes.StopTraversal + pass + + if isinstance(node, (nodes.Invisible, nodes.Admonition)): + # Skip all comments and admonitions + raise nodes.SkipNode + + if isinstance(node, nodes.title): + # title count refers to the amount of titles remaining + self.title_count -= 1 + if self.title_count < 0: + pass + #raise nodes.StopTraversal + + logger.info(type(node)) + logger.info(node.astext()) + if isinstance(node, nodes.paragraph): + # Add only paragraphs to the description + logger.debug(f"Adding node {type(node)} to description.") + self.description += node.astext() + "\n" + + def default_departure(self, node: nodes.Element): + if len(self.description) > self.desc_len: + self.description = self.description[:self.desc_len] + + if self.desc_len > 3: + self.description = self.description[:-3] + "..." From 1b121da1e478dad0a1f16755356f4c72b26349de Mon Sep 17 00:00:00 2001 From: Itay Ziv Date: Sat, 25 Jul 2020 02:41:54 +0300 Subject: [PATCH 02/18] Run black --- sphinxext/opengraph/directive.py | 1 - sphinxext/opengraph/event_handler.py | 11 ++++++----- sphinxext/opengraph/util.py | 7 ++++--- sphinxext/opengraph/visitor.py | 14 ++++++-------- 4 files changed, 16 insertions(+), 17 deletions(-) diff --git a/sphinxext/opengraph/directive.py b/sphinxext/opengraph/directive.py index 3785c44..eb3c44b 100644 --- a/sphinxext/opengraph/directive.py +++ b/sphinxext/opengraph/directive.py @@ -4,7 +4,6 @@ class OpenGraphDirective(SphinxDirective): - def run(self) -> List[Node]: pass diff --git a/sphinxext/opengraph/event_handler.py b/sphinxext/opengraph/event_handler.py index 5730773..69bff32 100644 --- a/sphinxext/opengraph/event_handler.py +++ b/sphinxext/opengraph/event_handler.py @@ -5,10 +5,11 @@ def html_page_context( - app: Sphinx, - pagename: str, - templatename: str, - context: Dict[str, Any], - doctree: nodes.document) -> None: + app: Sphinx, + pagename: str, + templatename: str, + context: Dict[str, Any], + doctree: nodes.document, +) -> None: if doctree: insert_tags(context, doctree, app.config) diff --git a/sphinxext/opengraph/util.py b/sphinxext/opengraph/util.py index b438943..fa928d7 100644 --- a/sphinxext/opengraph/util.py +++ b/sphinxext/opengraph/util.py @@ -3,12 +3,13 @@ from docutils import nodes from .visitor import OpenGraphVisitor from sphinx.util import logging + logger = logging.getLogger(__name__) -def insert_tags(context: Dict[str, Any], - doctree: nodes.document, - config: Config) -> None: +def insert_tags( + context: Dict[str, Any], doctree: nodes.document, config: Config +) -> None: visitor = OpenGraphVisitor(doctree, 300) doctree.walkabout(visitor) logger.info(visitor.description) diff --git a/sphinxext/opengraph/visitor.py b/sphinxext/opengraph/visitor.py index e2a1121..fbebc5a 100644 --- a/sphinxext/opengraph/visitor.py +++ b/sphinxext/opengraph/visitor.py @@ -1,16 +1,14 @@ from typing import List from docutils import nodes from sphinx.util import logging + logger = logging.getLogger(__name__) class OpenGraphVisitor(nodes.GenericNodeVisitor): - def __init__( - self, - document: nodes.document, - desc_len: int, - title_count: int = 1) -> None: + self, document: nodes.document, desc_len: int, title_count: int = 1 + ) -> None: super().__init__(document) self.description = "" self.desc_len = desc_len @@ -19,7 +17,7 @@ def __init__( def default_visit(self, node: nodes.Element): if len(self.description) >= self.desc_len: # Stop the traversal if the description is long enough - #raise nodes.StopTraversal + # raise nodes.StopTraversal pass if isinstance(node, (nodes.Invisible, nodes.Admonition)): @@ -31,7 +29,7 @@ def default_visit(self, node: nodes.Element): self.title_count -= 1 if self.title_count < 0: pass - #raise nodes.StopTraversal + # raise nodes.StopTraversal logger.info(type(node)) logger.info(node.astext()) @@ -42,7 +40,7 @@ def default_visit(self, node: nodes.Element): def default_departure(self, node: nodes.Element): if len(self.description) > self.desc_len: - self.description = self.description[:self.desc_len] + self.description = self.description[: self.desc_len] if self.desc_len > 3: self.description = self.description[:-3] + "..." From 55717cf016549661b735ee634fb8cd8ef297e756 Mon Sep 17 00:00:00 2001 From: Itay Ziv Date: Sat, 25 Jul 2020 02:56:31 +0300 Subject: [PATCH 03/18] Use a list if the page is empty --- sphinxext/opengraph/util.py | 1 + sphinxext/opengraph/visitor.py | 11 +++++++++++ 2 files changed, 12 insertions(+) diff --git a/sphinxext/opengraph/util.py b/sphinxext/opengraph/util.py index fa928d7..08ad717 100644 --- a/sphinxext/opengraph/util.py +++ b/sphinxext/opengraph/util.py @@ -12,5 +12,6 @@ def insert_tags( ) -> None: visitor = OpenGraphVisitor(doctree, 300) doctree.walkabout(visitor) + visitor.end_walkabout() logger.info(visitor.description) logger.info(len(visitor.description)) diff --git a/sphinxext/opengraph/visitor.py b/sphinxext/opengraph/visitor.py index fbebc5a..4621abf 100644 --- a/sphinxext/opengraph/visitor.py +++ b/sphinxext/opengraph/visitor.py @@ -13,6 +13,7 @@ def __init__( self.description = "" self.desc_len = desc_len self.title_count = title_count + self.first_list = "" # todo: rename def default_visit(self, node: nodes.Element): if len(self.description) >= self.desc_len: @@ -31,6 +32,11 @@ def default_visit(self, node: nodes.Element): pass # raise nodes.StopTraversal + if not self.first_list and isinstance( + node, (nodes.bullet_list, nodes.enumerated_list) + ): + self.first_list = node.astext().replace("\n\n", ", ") + logger.info(type(node)) logger.info(node.astext()) if isinstance(node, nodes.paragraph): @@ -44,3 +50,8 @@ def default_departure(self, node: nodes.Element): if self.desc_len > 3: self.description = self.description[:-3] + "..." + + def end_walkabout(self): + if not self.description: + self.description = self.first_list + print(self.first_list) From 7a7b861f34fd3c71379b5bc720b4f3d2dea565c2 Mon Sep 17 00:00:00 2001 From: Itay Ziv Date: Mon, 27 Jul 2020 23:15:53 +0300 Subject: [PATCH 04/18] Finish up previous functionality --- sphinxext/opengraph/__init__.py | 3 ++ sphinxext/opengraph/html_parser.py | 15 +++++++ sphinxext/opengraph/util.py | 68 +++++++++++++++++++++++++++--- sphinxext/opengraph/visitor.py | 36 +++++++++------- 4 files changed, 101 insertions(+), 21 deletions(-) create mode 100644 sphinxext/opengraph/html_parser.py diff --git a/sphinxext/opengraph/__init__.py b/sphinxext/opengraph/__init__.py index a995325..c9dc535 100644 --- a/sphinxext/opengraph/__init__.py +++ b/sphinxext/opengraph/__init__.py @@ -3,6 +3,9 @@ from .event_handler import html_page_context from sphinx.application import Sphinx +# todo: rtd option to grab READTHEDOCS_LANGUAGE and READTHEDOCS_VERSION for link +# todo: grab first image on a page + def setup(app: Sphinx) -> Dict[str, Any]: app.add_config_value("ogp_site_url", None, "html") diff --git a/sphinxext/opengraph/html_parser.py b/sphinxext/opengraph/html_parser.py new file mode 100644 index 0000000..01dd8a7 --- /dev/null +++ b/sphinxext/opengraph/html_parser.py @@ -0,0 +1,15 @@ +from html.parser import HTMLParser + + +class HTMLTextParser(HTMLParser): + """ + Parse HTML into text + """ + + def __init__(self): + super().__init__() + # Text from html tags + self.text = "" + + def handle_data(self, data) -> None: + self.text += data diff --git a/sphinxext/opengraph/util.py b/sphinxext/opengraph/util.py index 08ad717..876768f 100644 --- a/sphinxext/opengraph/util.py +++ b/sphinxext/opengraph/util.py @@ -1,17 +1,73 @@ from typing import Dict, Any from sphinx.config import Config from docutils import nodes +from urllib.parse import urljoin from .visitor import OpenGraphVisitor -from sphinx.util import logging +from .html_parser import HTMLTextParser -logger = logging.getLogger(__name__) + +def make_tag(property: str, content: str) -> str: + return f'\n ' def insert_tags( context: Dict[str, Any], doctree: nodes.document, config: Config ) -> None: - visitor = OpenGraphVisitor(doctree, 300) + # Set length of description + try: + desc_len = int(config["ogp_description_length"]) + except ValueError: + desc_len = 300 + + # parse out any html from the title + html_parser = HTMLTextParser() + if context["title"] != "<no title>": + # only use title if its exists + html_parser.feed(context["title"]) + html_parser.close() + + # grab the description from the page + visitor = OpenGraphVisitor(doctree, desc_len) doctree.walkabout(visitor) - visitor.end_walkabout() - logger.info(visitor.description) - logger.info(len(visitor.description)) + + # title tag + context["metatags"] += make_tag("og:title", html_parser.text) + + # type tag + context["metatags"] += make_tag("og:type", config["ogp_type"]) + + # url tag + # Get the url to the specific page + page_url = urljoin( + config["ogp_site_url"], context["pagename"] + context["file_suffix"] + ) + context["metatags"] += make_tag("og:url", page_url) + + # site name tag + site_name = config["ogp_site_name"] + if site_name: + context["metatags"] += make_tag("og:site_name", site_name) + + # description tag + context["metatags"] += make_tag("og:description", visitor.description) + + # image tag + # Get the image from the config + image_url = config["ogp_image"] + if image_url: + context["metatags"] += make_tag("og:image", image_url) + + # image alt text (provided by config falls back to page title, then site name) + ogp_image_alt = config["ogp_image_alt"] + if ogp_image_alt and not isinstance(ogp_image_alt, str): + # replace the alt text with the page title if it exists otherwise site name + if html_parser.text: + ogp_image_alt = html_parser.text + else: + ogp_image_alt = site_name + + if ogp_image_alt: + context["metatags"] += make_tag("og:image:alt", ogp_image_alt) + + # custom tags + context["metatags"] += "\n".join(config["ogp_custom_meta_tags"]) diff --git a/sphinxext/opengraph/visitor.py b/sphinxext/opengraph/visitor.py index 4621abf..66cc08a 100644 --- a/sphinxext/opengraph/visitor.py +++ b/sphinxext/opengraph/visitor.py @@ -1,8 +1,4 @@ -from typing import List from docutils import nodes -from sphinx.util import logging - -logger = logging.getLogger(__name__) class OpenGraphVisitor(nodes.GenericNodeVisitor): @@ -15,7 +11,7 @@ def __init__( self.title_count = title_count self.first_list = "" # todo: rename - def default_visit(self, node: nodes.Element): + def default_visit(self, node: nodes.Element) -> None: if len(self.description) >= self.desc_len: # Stop the traversal if the description is long enough # raise nodes.StopTraversal @@ -29,29 +25,39 @@ def default_visit(self, node: nodes.Element): # title count refers to the amount of titles remaining self.title_count -= 1 if self.title_count < 0: - pass # raise nodes.StopTraversal + pass if not self.first_list and isinstance( node, (nodes.bullet_list, nodes.enumerated_list) ): + # get the first list on a page to be used instead of description self.first_list = node.astext().replace("\n\n", ", ") - logger.info(type(node)) - logger.info(node.astext()) if isinstance(node, nodes.paragraph): # Add only paragraphs to the description - logger.debug(f"Adding node {type(node)} to description.") - self.description += node.astext() + "\n" - def default_departure(self, node: nodes.Element): + if self.description: + # add a space between paragraphs in case one does not exist + # if there is a double space it will be removed automatically + self.description += " " + + self.description += node.astext() + + def default_departure(self, node: nodes.Element) -> None: + # remove all double spaces + self.description = self.description.replace(" ", " ") + if len(self.description) > self.desc_len: self.description = self.description[: self.desc_len] if self.desc_len > 3: self.description = self.description[:-3] + "..." - def end_walkabout(self): - if not self.description: - self.description = self.first_list - print(self.first_list) + # runs only when this is the last node + if node.parent is None: + # switch to use the list if the description is only the same list + if self.description == self.first_list.replace( + ",", "" + ): + self.description = self.first_list From 71235eaae8b0fa3323280f6e639c2f092e6febe1 Mon Sep 17 00:00:00 2001 From: Itay Ziv Date: Mon, 27 Jul 2020 23:51:18 +0300 Subject: [PATCH 05/18] Clean imports --- sphinxext/opengraph/__init__.py | 5 +---- sphinxext/opengraph/event_handler.py | 2 +- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/sphinxext/opengraph/__init__.py b/sphinxext/opengraph/__init__.py index c9dc535..6a6bc00 100644 --- a/sphinxext/opengraph/__init__.py +++ b/sphinxext/opengraph/__init__.py @@ -1,7 +1,6 @@ from typing import Any, Dict -from .directive import OpenGraphDirective -from .event_handler import html_page_context from sphinx.application import Sphinx +from .event_handler import html_page_context # todo: rtd option to grab READTHEDOCS_LANGUAGE and READTHEDOCS_VERSION for link # todo: grab first image on a page @@ -16,8 +15,6 @@ def setup(app: Sphinx) -> Dict[str, Any]: app.add_config_value("ogp_site_name", None, "html") app.add_config_value("ogp_custom_meta_tags", [], "html") - # app.add_directive("opengraph", OpenGraphDirective) - app.connect("html-page-context", html_page_context) return { diff --git a/sphinxext/opengraph/event_handler.py b/sphinxext/opengraph/event_handler.py index 69bff32..069690d 100644 --- a/sphinxext/opengraph/event_handler.py +++ b/sphinxext/opengraph/event_handler.py @@ -1,6 +1,6 @@ from typing import Dict, Any from sphinx.application import Sphinx -from docutils import nodes +from .docutils import nodes from .util import insert_tags From 5297e2ac7060cf3f76427307391ae6a4cfba322b Mon Sep 17 00:00:00 2001 From: Itay Ziv Date: Mon, 27 Jul 2020 23:54:03 +0300 Subject: [PATCH 06/18] Change default value --- sphinxext/opengraph/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sphinxext/opengraph/__init__.py b/sphinxext/opengraph/__init__.py index 6a6bc00..99aaba1 100644 --- a/sphinxext/opengraph/__init__.py +++ b/sphinxext/opengraph/__init__.py @@ -8,7 +8,7 @@ def setup(app: Sphinx) -> Dict[str, Any]: app.add_config_value("ogp_site_url", None, "html") - app.add_config_value("ogp_description_length", 200, "html") + app.add_config_value("ogp_description_length", 300, "html") app.add_config_value("ogp_image", None, "html") app.add_config_value("ogp_image_alt", True, "html") app.add_config_value("ogp_type", "website", "html") From fd9921c51acb71f02e9fe1427b60af0bbee1b2bd Mon Sep 17 00:00:00 2001 From: Itay Ziv Date: Tue, 28 Jul 2020 00:01:21 +0300 Subject: [PATCH 07/18] Change img:alt --- sphinxext/opengraph/util.py | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/sphinxext/opengraph/util.py b/sphinxext/opengraph/util.py index 876768f..d789d61 100644 --- a/sphinxext/opengraph/util.py +++ b/sphinxext/opengraph/util.py @@ -57,15 +57,9 @@ def insert_tags( if image_url: context["metatags"] += make_tag("og:image", image_url) - # image alt text (provided by config falls back to page title, then site name) + # image alt text + # todo: change readme ogp_image_alt = config["ogp_image_alt"] - if ogp_image_alt and not isinstance(ogp_image_alt, str): - # replace the alt text with the page title if it exists otherwise site name - if html_parser.text: - ogp_image_alt = html_parser.text - else: - ogp_image_alt = site_name - if ogp_image_alt: context["metatags"] += make_tag("og:image:alt", ogp_image_alt) From 61edae6f63b3ea7d3c588b895873aa862608e6f7 Mon Sep 17 00:00:00 2001 From: Itay Ziv Date: Tue, 28 Jul 2020 15:33:31 +0300 Subject: [PATCH 08/18] Remove special casing for --- sphinxext/opengraph/util.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/sphinxext/opengraph/util.py b/sphinxext/opengraph/util.py index d789d61..07163de 100644 --- a/sphinxext/opengraph/util.py +++ b/sphinxext/opengraph/util.py @@ -21,9 +21,7 @@ def insert_tags( # parse out any html from the title html_parser = HTMLTextParser() - if context["title"] != "<no title>": - # only use title if its exists - html_parser.feed(context["title"]) + html_parser.feed(context["title"]) html_parser.close() # grab the description from the page From 08a3fd6cb364412371707877ca99b29eb07da090 Mon Sep 17 00:00:00 2001 From: Itay Ziv Date: Tue, 28 Jul 2020 15:39:41 +0300 Subject: [PATCH 09/18] Fix import --- sphinxext/opengraph/event_handler.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sphinxext/opengraph/event_handler.py b/sphinxext/opengraph/event_handler.py index 069690d..69bff32 100644 --- a/sphinxext/opengraph/event_handler.py +++ b/sphinxext/opengraph/event_handler.py @@ -1,6 +1,6 @@ from typing import Dict, Any from sphinx.application import Sphinx -from .docutils import nodes +from docutils import nodes from .util import insert_tags From b93701213260982abd11dfabf68c8d28f0448db2 Mon Sep 17 00:00:00 2001 From: Itay Ziv Date: Tue, 28 Jul 2020 15:48:52 +0300 Subject: [PATCH 10/18] Fix default desc_len --- sphinxext/opengraph/__init__.py | 2 +- sphinxext/opengraph/util.py | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/sphinxext/opengraph/__init__.py b/sphinxext/opengraph/__init__.py index 99aaba1..6a6bc00 100644 --- a/sphinxext/opengraph/__init__.py +++ b/sphinxext/opengraph/__init__.py @@ -8,7 +8,7 @@ def setup(app: Sphinx) -> Dict[str, Any]: app.add_config_value("ogp_site_url", None, "html") - app.add_config_value("ogp_description_length", 300, "html") + app.add_config_value("ogp_description_length", 200, "html") app.add_config_value("ogp_image", None, "html") app.add_config_value("ogp_image_alt", True, "html") app.add_config_value("ogp_type", "website", "html") diff --git a/sphinxext/opengraph/util.py b/sphinxext/opengraph/util.py index 07163de..9665562 100644 --- a/sphinxext/opengraph/util.py +++ b/sphinxext/opengraph/util.py @@ -4,6 +4,8 @@ from urllib.parse import urljoin from .visitor import OpenGraphVisitor from .html_parser import HTMLTextParser +from sphinx.util import logging +logger = logging.getLogger(__name__) def make_tag(property: str, content: str) -> str: @@ -17,7 +19,9 @@ def insert_tags( try: desc_len = int(config["ogp_description_length"]) except ValueError: - desc_len = 300 + desc_len = 200 + logger.info(config["ogp_description_length"]) + logger.info(desc_len) # parse out any html from the title html_parser = HTMLTextParser() From fa804c697a2d1c915d30563e9654f55fec23da80 Mon Sep 17 00:00:00 2001 From: Itay Ziv Date: Tue, 28 Jul 2020 15:52:06 +0300 Subject: [PATCH 11/18] Remove temporary logging --- sphinxext/opengraph/util.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/sphinxext/opengraph/util.py b/sphinxext/opengraph/util.py index 9665562..8154454 100644 --- a/sphinxext/opengraph/util.py +++ b/sphinxext/opengraph/util.py @@ -4,8 +4,6 @@ from urllib.parse import urljoin from .visitor import OpenGraphVisitor from .html_parser import HTMLTextParser -from sphinx.util import logging -logger = logging.getLogger(__name__) def make_tag(property: str, content: str) -> str: @@ -20,8 +18,6 @@ def insert_tags( desc_len = int(config["ogp_description_length"]) except ValueError: desc_len = 200 - logger.info(config["ogp_description_length"]) - logger.info(desc_len) # parse out any html from the title html_parser = HTMLTextParser() From f9dc9d4dab15278094438612fad34f1fb0433d97 Mon Sep 17 00:00:00 2001 From: Itay Ziv Date: Tue, 28 Jul 2020 16:33:10 +0300 Subject: [PATCH 12/18] Combine insert_tags into html_page_context --- sphinxext/opengraph/event_handler.py | 57 ++++++++++++++++++++++- sphinxext/opengraph/util.py | 67 +--------------------------- 2 files changed, 57 insertions(+), 67 deletions(-) diff --git a/sphinxext/opengraph/event_handler.py b/sphinxext/opengraph/event_handler.py index 69bff32..4db694c 100644 --- a/sphinxext/opengraph/event_handler.py +++ b/sphinxext/opengraph/event_handler.py @@ -1,7 +1,10 @@ from typing import Dict, Any from sphinx.application import Sphinx from docutils import nodes -from .util import insert_tags +from urllib.parse import urljoin +from .visitor import OpenGraphVisitor +from .html_parser import HTMLTextParser +from .util import make_tag def html_page_context( @@ -12,4 +15,54 @@ def html_page_context( doctree: nodes.document, ) -> None: if doctree: - insert_tags(context, doctree, app.config) + return + # Set length of description + try: + desc_len = int(app.config["ogp_description_length"]) + except ValueError: + desc_len = 200 + + # parse out any html from the title + html_parser = HTMLTextParser() + html_parser.feed(context["title"]) + html_parser.close() + + # grab the description from the page + visitor = OpenGraphVisitor(doctree, desc_len) + doctree.walkabout(visitor) + + # title tag + context["metatags"] += make_tag("og:title", html_parser.text) + + # type tag + context["metatags"] += make_tag("og:type", app.config["ogp_type"]) + + # url tag + # Get the url to the specific page + page_url = urljoin( + app.config["ogp_site_url"], context["pagename"] + context["file_suffix"] + ) + context["metatags"] += make_tag("og:url", page_url) + + # site name tag + site_name = app.config["ogp_site_name"] + if site_name: + context["metatags"] += make_tag("og:site_name", site_name) + + # description tag + context["metatags"] += make_tag("og:description", visitor.description) + + # image tag + # Get the image from the app.config + image_url = app.config["ogp_image"] + if image_url: + context["metatags"] += make_tag("og:image", image_url) + + # image alt text + # todo: change readme + ogp_image_alt = app.config["ogp_image_alt"] + if ogp_image_alt: + context["metatags"] += make_tag("og:image:alt", ogp_image_alt) + + # custom tags + context["metatags"] += "\n".join(app.config["ogp_custom_meta_tags"]) diff --git a/sphinxext/opengraph/util.py b/sphinxext/opengraph/util.py index 8154454..a100b22 100644 --- a/sphinxext/opengraph/util.py +++ b/sphinxext/opengraph/util.py @@ -1,65 +1,2 @@ -from typing import Dict, Any -from sphinx.config import Config -from docutils import nodes -from urllib.parse import urljoin -from .visitor import OpenGraphVisitor -from .html_parser import HTMLTextParser - - -def make_tag(property: str, content: str) -> str: - return f'\n ' - - -def insert_tags( - context: Dict[str, Any], doctree: nodes.document, config: Config -) -> None: - # Set length of description - try: - desc_len = int(config["ogp_description_length"]) - except ValueError: - desc_len = 200 - - # parse out any html from the title - html_parser = HTMLTextParser() - html_parser.feed(context["title"]) - html_parser.close() - - # grab the description from the page - visitor = OpenGraphVisitor(doctree, desc_len) - doctree.walkabout(visitor) - - # title tag - context["metatags"] += make_tag("og:title", html_parser.text) - - # type tag - context["metatags"] += make_tag("og:type", config["ogp_type"]) - - # url tag - # Get the url to the specific page - page_url = urljoin( - config["ogp_site_url"], context["pagename"] + context["file_suffix"] - ) - context["metatags"] += make_tag("og:url", page_url) - - # site name tag - site_name = config["ogp_site_name"] - if site_name: - context["metatags"] += make_tag("og:site_name", site_name) - - # description tag - context["metatags"] += make_tag("og:description", visitor.description) - - # image tag - # Get the image from the config - image_url = config["ogp_image"] - if image_url: - context["metatags"] += make_tag("og:image", image_url) - - # image alt text - # todo: change readme - ogp_image_alt = config["ogp_image_alt"] - if ogp_image_alt: - context["metatags"] += make_tag("og:image:alt", ogp_image_alt) - - # custom tags - context["metatags"] += "\n".join(config["ogp_custom_meta_tags"]) +def make_tag(tag: str, content: str) -> str: + return f'\n ' From 04d2054dde459ca07e53346b3209c95146a887c4 Mon Sep 17 00:00:00 2001 From: Itay Ziv Date: Wed, 29 Jul 2020 01:36:09 +0300 Subject: [PATCH 13/18] Make sanitize_title a separate function --- sphinxext/opengraph/event_handler.py | 25 ++++++++++--------------- sphinxext/opengraph/util.py | 12 ++++++++++++ 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/sphinxext/opengraph/event_handler.py b/sphinxext/opengraph/event_handler.py index 4db694c..835d25c 100644 --- a/sphinxext/opengraph/event_handler.py +++ b/sphinxext/opengraph/event_handler.py @@ -2,9 +2,8 @@ from sphinx.application import Sphinx from docutils import nodes from urllib.parse import urljoin +import util from .visitor import OpenGraphVisitor -from .html_parser import HTMLTextParser -from .util import make_tag def html_page_context( @@ -22,47 +21,43 @@ def html_page_context( except ValueError: desc_len = 200 - # parse out any html from the title - html_parser = HTMLTextParser() - html_parser.feed(context["title"]) - html_parser.close() - # grab the description from the page visitor = OpenGraphVisitor(doctree, desc_len) doctree.walkabout(visitor) - # title tag - context["metatags"] += make_tag("og:title", html_parser.text) + # title tag# parse out any html from the title + page_title = util.santitize_title(context["title"]) + context["metatags"] += util.make_tag("og:title", page_title) # type tag - context["metatags"] += make_tag("og:type", app.config["ogp_type"]) + context["metatags"] += util.make_tag("og:type", app.config["ogp_type"]) # url tag # Get the url to the specific page page_url = urljoin( app.config["ogp_site_url"], context["pagename"] + context["file_suffix"] ) - context["metatags"] += make_tag("og:url", page_url) + context["metatags"] += util.make_tag("og:url", page_url) # site name tag site_name = app.config["ogp_site_name"] if site_name: - context["metatags"] += make_tag("og:site_name", site_name) + context["metatags"] += util.make_tag("og:site_name", site_name) # description tag - context["metatags"] += make_tag("og:description", visitor.description) + context["metatags"] += util.make_tag("og:description", visitor.description) # image tag # Get the image from the app.config image_url = app.config["ogp_image"] if image_url: - context["metatags"] += make_tag("og:image", image_url) + context["metatags"] += util.make_tag("og:image", image_url) # image alt text # todo: change readme ogp_image_alt = app.config["ogp_image_alt"] if ogp_image_alt: - context["metatags"] += make_tag("og:image:alt", ogp_image_alt) + context["metatags"] += util.make_tag("og:image:alt", ogp_image_alt) # custom tags context["metatags"] += "\n".join(app.config["ogp_custom_meta_tags"]) diff --git a/sphinxext/opengraph/util.py b/sphinxext/opengraph/util.py index a100b22..1eb2756 100644 --- a/sphinxext/opengraph/util.py +++ b/sphinxext/opengraph/util.py @@ -1,2 +1,14 @@ +from .html_parser import HTMLTextParser + + def make_tag(tag: str, content: str) -> str: return f'\n ' + + +def sanitize_title(title: str) -> str: + # take in a title and return a clean version. + html_parser = HTMLTextParser() + html_parser.feed(title) + html_parser.close() + + return html_parser.text From fc30491ee87074f2c585f2be8782e6687633202c Mon Sep 17 00:00:00 2001 From: Itay Ziv Date: Wed, 29 Jul 2020 01:38:55 +0300 Subject: [PATCH 14/18] Fix imports and modify make_tag --- sphinxext/opengraph/event_handler.py | 18 +++++++++--------- sphinxext/opengraph/util.py | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/sphinxext/opengraph/event_handler.py b/sphinxext/opengraph/event_handler.py index 835d25c..b8b5e30 100644 --- a/sphinxext/opengraph/event_handler.py +++ b/sphinxext/opengraph/event_handler.py @@ -2,7 +2,7 @@ from sphinx.application import Sphinx from docutils import nodes from urllib.parse import urljoin -import util +from .util import sanitize_title, make_tag from .visitor import OpenGraphVisitor @@ -26,38 +26,38 @@ def html_page_context( doctree.walkabout(visitor) # title tag# parse out any html from the title - page_title = util.santitize_title(context["title"]) - context["metatags"] += util.make_tag("og:title", page_title) + page_title = sanitize_title(context["title"]) + context["metatags"] += make_tag("title", page_title) # type tag - context["metatags"] += util.make_tag("og:type", app.config["ogp_type"]) + context["metatags"] += make_tag("type", app.config["ogp_type"]) # url tag # Get the url to the specific page page_url = urljoin( app.config["ogp_site_url"], context["pagename"] + context["file_suffix"] ) - context["metatags"] += util.make_tag("og:url", page_url) + context["metatags"] += make_tag("url", page_url) # site name tag site_name = app.config["ogp_site_name"] if site_name: - context["metatags"] += util.make_tag("og:site_name", site_name) + context["metatags"] += make_tag("site_name", site_name) # description tag - context["metatags"] += util.make_tag("og:description", visitor.description) + context["metatags"] += make_tag("description", visitor.description) # image tag # Get the image from the app.config image_url = app.config["ogp_image"] if image_url: - context["metatags"] += util.make_tag("og:image", image_url) + context["metatags"] += make_tag("image", image_url) # image alt text # todo: change readme ogp_image_alt = app.config["ogp_image_alt"] if ogp_image_alt: - context["metatags"] += util.make_tag("og:image:alt", ogp_image_alt) + context["metatags"] += make_tag("image:alt", ogp_image_alt) # custom tags context["metatags"] += "\n".join(app.config["ogp_custom_meta_tags"]) diff --git a/sphinxext/opengraph/util.py b/sphinxext/opengraph/util.py index 1eb2756..992c449 100644 --- a/sphinxext/opengraph/util.py +++ b/sphinxext/opengraph/util.py @@ -2,7 +2,7 @@ def make_tag(tag: str, content: str) -> str: - return f'\n ' + return f'\n ' def sanitize_title(title: str) -> str: From 61da438b508e5840fb190c66fab431acc1c86817 Mon Sep 17 00:00:00 2001 From: Itay Ziv Date: Wed, 29 Jul 2020 01:41:18 +0300 Subject: [PATCH 15/18] Fix doctree check --- sphinxext/opengraph/event_handler.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sphinxext/opengraph/event_handler.py b/sphinxext/opengraph/event_handler.py index b8b5e30..f206013 100644 --- a/sphinxext/opengraph/event_handler.py +++ b/sphinxext/opengraph/event_handler.py @@ -13,7 +13,7 @@ def html_page_context( context: Dict[str, Any], doctree: nodes.document, ) -> None: - if doctree: + if not doctree: return # Set length of description try: From 7c76fdb78127497fb3a8d8c8582c0ce983ee4866 Mon Sep 17 00:00:00 2001 From: Itay Ziv Date: Fri, 31 Jul 2020 00:27:03 +0300 Subject: [PATCH 16/18] Change "walrus" case --- sphinxext/opengraph/event_handler.py | 14 ++++---------- sphinxext/opengraph/util.py | 13 +++++++++++++ 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/sphinxext/opengraph/event_handler.py b/sphinxext/opengraph/event_handler.py index f206013..7cbc46a 100644 --- a/sphinxext/opengraph/event_handler.py +++ b/sphinxext/opengraph/event_handler.py @@ -2,7 +2,7 @@ from sphinx.application import Sphinx from docutils import nodes from urllib.parse import urljoin -from .util import sanitize_title, make_tag +from .util import sanitize_title, make_tag, add_tag_from_config from .visitor import OpenGraphVisitor @@ -40,24 +40,18 @@ def html_page_context( context["metatags"] += make_tag("url", page_url) # site name tag - site_name = app.config["ogp_site_name"] - if site_name: - context["metatags"] += make_tag("site_name", site_name) + add_tag_from_config(context, app.config, "site_name") # description tag context["metatags"] += make_tag("description", visitor.description) # image tag # Get the image from the app.config - image_url = app.config["ogp_image"] - if image_url: - context["metatags"] += make_tag("image", image_url) + add_tag_from_config(context, app.config, "image") # image alt text # todo: change readme - ogp_image_alt = app.config["ogp_image_alt"] - if ogp_image_alt: - context["metatags"] += make_tag("image:alt", ogp_image_alt) + add_tag_from_config(context, app.config, "image:alt") # custom tags context["metatags"] += "\n".join(app.config["ogp_custom_meta_tags"]) diff --git a/sphinxext/opengraph/util.py b/sphinxext/opengraph/util.py index 992c449..66f3844 100644 --- a/sphinxext/opengraph/util.py +++ b/sphinxext/opengraph/util.py @@ -1,3 +1,5 @@ +from typing import Dict, Any +from sphinx.config import Config from .html_parser import HTMLTextParser @@ -5,6 +7,17 @@ def make_tag(tag: str, content: str) -> str: return f'\n ' +def add_tag_from_config(context: Dict[str, Any], config: Config, tag: str, conf_name: str = ""): + if not conf_name: + conf_name = tag.replace(":", "_") + + conf_name = f"ogp_{conf_name}" + + value = config[conf_name] + if value: + context["metatags"] += make_tag(tag, value) + + def sanitize_title(title: str) -> str: # take in a title and return a clean version. html_parser = HTMLTextParser() From 653df47fa50d09f810c4252010819c4a3dae093b Mon Sep 17 00:00:00 2001 From: Itay Ziv Date: Tue, 4 Aug 2020 03:43:56 +0300 Subject: [PATCH 17/18] Clean up tag insertion --- sphinxext/opengraph/event_handler.py | 23 ++++++----------------- 1 file changed, 6 insertions(+), 17 deletions(-) diff --git a/sphinxext/opengraph/event_handler.py b/sphinxext/opengraph/event_handler.py index 7cbc46a..6eed6f2 100644 --- a/sphinxext/opengraph/event_handler.py +++ b/sphinxext/opengraph/event_handler.py @@ -25,32 +25,21 @@ def html_page_context( visitor = OpenGraphVisitor(doctree, desc_len) doctree.walkabout(visitor) - # title tag# parse out any html from the title + # parse out html from the page title page_title = sanitize_title(context["title"]) - context["metatags"] += make_tag("title", page_title) - - # type tag - context["metatags"] += make_tag("type", app.config["ogp_type"]) - # url tag - # Get the url to the specific page + # get the page's url page_url = urljoin( app.config["ogp_site_url"], context["pagename"] + context["file_suffix"] ) - context["metatags"] += make_tag("url", page_url) - # site name tag + # add all the tags which need to be added + context["metatags"] += make_tag("title", page_title) + context["metatags"] += make_tag("type", app.config["ogp_type"]) + context["metatags"] += make_tag("url", page_url) add_tag_from_config(context, app.config, "site_name") - - # description tag context["metatags"] += make_tag("description", visitor.description) - - # image tag - # Get the image from the app.config add_tag_from_config(context, app.config, "image") - - # image alt text - # todo: change readme add_tag_from_config(context, app.config, "image:alt") # custom tags From 18ab1ebb04e7cd8dbc500b2c7de3550d2bdd2b41 Mon Sep 17 00:00:00 2001 From: Itay Ziv Date: Tue, 4 Aug 2020 03:46:05 +0300 Subject: [PATCH 18/18] Run black --- sphinxext/opengraph/util.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/sphinxext/opengraph/util.py b/sphinxext/opengraph/util.py index 66f3844..6933dfe 100644 --- a/sphinxext/opengraph/util.py +++ b/sphinxext/opengraph/util.py @@ -7,7 +7,9 @@ def make_tag(tag: str, content: str) -> str: return f'\n ' -def add_tag_from_config(context: Dict[str, Any], config: Config, tag: str, conf_name: str = ""): +def add_tag_from_config( + context: Dict[str, Any], config: Config, tag: str, conf_name: str = "" +): if not conf_name: conf_name = tag.replace(":", "_")