瀏覽代碼

Added Meta for Pages (#29)

* Added meta changes.


Co-authored-by: Alek Petuskey <alekpetuskey@Aleks-MacBook-Pro.local>
Alek Petuskey 2 年之前
父節點
當前提交
91bb3f0b26
共有 5 個文件被更改,包括 56 次插入9 次删除
  1. 5 1
      pynecone/app.py
  2. 16 5
      pynecone/compiler/utils.py
  3. 1 1
      pynecone/components/base/__init__.py
  4. 28 2
      pynecone/components/base/meta.py
  5. 6 0
      pynecone/constants.py

+ 5 - 1
pynecone/app.py

@@ -179,6 +179,8 @@ class App(Base):
         component: Union[Component, ComponentCallable],
         component: Union[Component, ComponentCallable],
         path: Optional[str] = None,
         path: Optional[str] = None,
         title: str = constants.DEFAULT_TITLE,
         title: str = constants.DEFAULT_TITLE,
+        description: str = constants.DEFAULT_DESCRIPTION,
+        image=constants.DEFAULT_IMAGE,
     ):
     ):
         """Add a page to the app.
         """Add a page to the app.
 
 
@@ -189,6 +191,8 @@ class App(Base):
             component: The component to display at the page.
             component: The component to display at the page.
             path: The path to display the component at.
             path: The path to display the component at.
             title: The title of the page.
             title: The title of the page.
+            description: The description of the page.
+            image: The image to display on the page.
         """
         """
         # If the path is not set, get it from the callable.
         # If the path is not set, get it from the callable.
         if path is None:
         if path is None:
@@ -216,7 +220,7 @@ class App(Base):
         component = component if isinstance(component, Component) else component(*args)
         component = component if isinstance(component, Component) else component(*args)
 
 
         # Add the title to the component.
         # Add the title to the component.
-        compiler_utils.add_title(component, title)
+        compiler_utils.add_meta(component, title, description, image)
 
 
         # Format the route.
         # Format the route.
         route = utils.format_route(path)
         route = utils.format_route(path)

+ 16 - 5
pynecone/compiler/utils.py

@@ -16,6 +16,8 @@ from pynecone.components.base import (
     Main,
     Main,
     Script,
     Script,
     Title,
     Title,
+    Description,
+    Image,
 )
 )
 from pynecone.components.component import ImportDict
 from pynecone.components.component import ImportDict
 from pynecone.state import State
 from pynecone.state import State
@@ -202,15 +204,24 @@ def create_theme(style: Style) -> Dict:
     }
     }
 
 
 
 
-def add_title(page: Component, title: str) -> Component:
-    """Add a title to a page.
+def add_meta(page: Component, title, image, description) -> Component:
+    """Add metadata to a page.
 
 
     Args:
     Args:
         page: The component for the page.
         page: The component for the page.
-        title: The title to add.
+        title: The title of the page.
+        image: The image for the page.
+        description: The description of the page.
 
 
     Returns:
     Returns:
-        The component with the title added.
+        The component with the metadata added.
     """
     """
-    page.children.append(Head.create(Title.create(title)))
+    page.children.append(
+        Head.create(
+            Title.create(title),
+            Description.create(content=description),
+            Image.create(content=image),
+        )
+    )
+
     return page
     return page

+ 1 - 1
pynecone/components/base/__init__.py

@@ -4,4 +4,4 @@ from .body import Body
 from .document import DocumentHead, Html, Main, Script
 from .document import DocumentHead, Html, Main, Script
 from .head import Head
 from .head import Head
 from .link import Link
 from .link import Link
-from .title import Title
+from .meta import Title, Description, Image

+ 28 - 2
pynecone/components/base/title.py → pynecone/components/base/meta.py

@@ -3,13 +3,13 @@
 from pynecone.components.base.bare import Bare
 from pynecone.components.base.bare import Bare
 from pynecone.components.component import Component
 from pynecone.components.component import Component
 from pynecone.components.tags import Tag
 from pynecone.components.tags import Tag
+from typing import Optional
 
 
 
 
 class Title(Component):
 class Title(Component):
     """A component that displays the title of the current page."""
     """A component that displays the title of the current page."""
 
 
-    def _render(self) -> Tag:
-        return Tag(name="title")
+    tag = "title"
 
 
     def render(self) -> str:
     def render(self) -> str:
         """Render the title component.
         """Render the title component.
@@ -23,3 +23,29 @@ class Title(Component):
             self.children[0], Bare
             self.children[0], Bare
         ), "Title must be a single string."
         ), "Title must be a single string."
         return str(tag.set(contents=str(self.children[0].contents)))
         return str(tag.set(contents=str(self.children[0].contents)))
+
+
+class Meta(Component):
+    """A component that displays metadata for the current page."""
+
+    tag = "meta"
+
+
+class Description(Meta):
+    """A component that displays the title of the current page."""
+
+    # The description of the page.
+    content: Optional[str] = None
+
+    # The type of the description.
+    name: str = "description"
+
+
+class Image(Meta):
+    """A component that displays the title of the current page."""
+
+    # The image of the page.
+    content: Optional[str] = None
+
+    # The type of the image.
+    property: str = "og:image"

+ 6 - 0
pynecone/constants.py

@@ -102,6 +102,12 @@ DB_NAME = "pynecone.db"
 DB_URL = f"sqlite:///{DB_NAME}"
 DB_URL = f"sqlite:///{DB_NAME}"
 # The default title to show for Pynecone apps.
 # The default title to show for Pynecone apps.
 DEFAULT_TITLE = "Pynecone App"
 DEFAULT_TITLE = "Pynecone App"
+# The default description to show for Pynecone apps.
+DEFAULT_DESCRIPTION = "A Pynecone app."
+# The default image to show for Pynecone apps.
+DEFAULT_IMAGE = "favicon.ico"
+
+
 # The name of the pynecone config module.
 # The name of the pynecone config module.
 CONFIG_MODULE = "pcconfig"
 CONFIG_MODULE = "pcconfig"
 # The python config file.
 # The python config file.