/markupify

A simple HTML generator from Python.

Primary LanguagePythonMIT LicenseMIT

HTML5 generator from your Python code

GitHub Release GitHub issue custom search in repo PyPI - Downloads

Features

  • HTML5 tag creation with classes such as A() for <a></a>, Hr() for <hr />, etc.
  • Pretty printing the html content with pretty() method.
  • Create multiple html pages using HTMLPage class.
  • Create a HTMLPage object with specific head and body.
  • Custom tag creation by inheriting Element class which declared at markupify.tags
  • Generate *.html files after creating html content with write() method.

Goals

  • Create an CSSPage class to create some css contents.
  • Generate *.css files.
  • Show tag structure like <body> -> <div> -> h1 -> "This is heading one!" or something.
  • Build html page with several parts.

Installation

pip install markupify

Usage

from markupify.page import HTMLPage
from markupify.tags import Meta, Link, Title, Div, H, Comment

# Alternatively, you can import these classes from markupify directly:
# from markupify import HTMLPage, Meta, Link, Title, Div, H, Comment


page = HTMLPage()

meta = Meta(charset="UTF-8")
link = Link(href="css/styles.css", rel="stylesheet")
title = Title("My first website")
div = Div(
    tag_content=H(
        tag_content="Greetings text"
    )
)
comment = Comment("This is a comment")

page.add_tag_to_head(meta, link, title)
page.add_tag_to_body(comment, div)

print(page)

Output:

<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8" /><link href="css/styles.css" rel="stylesheet" /><title>My first website</title></head><body><!-- This is a comment --><div><h1>Greetings text</h1></div></body></html>

To prettify that, use the pretty() method of the page object:

print(page.pretty())

Output:

<!DOCTYPE html>
<html lang="en">
 <head>
  <meta charset="utf-8"/>
  <link href="css/styles.css" rel="stylesheet"/>
  <title>
   My first website
  </title>
 </head>
 <body>
  <!-- This is a comment -->
  <div>
   <h1>
    Greetings text
   </h1>
  </div>
 </body>
</html>

Also, you can create the page object with default head and body:

page = HTMLPage(
    head=Head(meta, link, title),
    body=Body(comment, div)
)

If you want to get your html content as *.html file, you can use write() method:

page.write("index.html")

Customizing

Devs! Maybe I forgot to create some tags you need. Feel free to create them yourself by inheriting from the Element class.

For example, create a double tag:

from typing import Optional, Union, Iterable
from markupify.tags import Element


class MyCustomTag(Element):
    def __init__(self, *tags: Union[Iterable[str], Iterable[Element]], **props):
        """
        A tag class to represent <my_tag> tag.
        """
        super().__init__(tag_name="my_tag", *tags, **props)


my_tag = MyCustomTag("This my custom tag! 🥳")
print(my_tag)

Output:

<my_tag>This my custom tag! 🥳</my_tag>

Add class property with add_properties

my_tag.add_properties(_class="custom my-tag")
print(my_tag)

Output:

<my_tag class="custom my-tag">This my custom tag! 🥳</my_tag>

Note

Some keywords like class are built-in names in Python. So you need to use them with underscore before them. For example, instead of class, write _class and everything will be fine.

Create a single tag:

from markupify.tags import Element


class Vl(Element):
    def __init__(self, **props):
        """
        A tag class to represent <vl> (Vertical Line) tag.
        """
        super().__init__(tag_name="vl", has_end_tag=False, **props)


vl = Vl()
print(vl)

Output:

<vl />

Add width property with add_property

vl.add_property("width", "5px")
print(vl)

Output:

<vl width="5px" />