Skip to main content

Compose HTML (and some XML) using Python

Project description

mrkup

PyPI License: MIT

Just marking things up...

Compose HTML (and some XML) using Python.

mrkup can be used to compose html programatically which can then be converted to string but cannot parse html from external sources.

Installation

You need Python>=3.6 to use mrkup.

It can be installed from PyPI with pip using

pip install mrkup

Usage

mrkup consists of three classes:

  • Tag
  • Comment
  • PI

which may be imported like

from mrkup import Comment, PI, Tag

Tags

Used to compose tags.

Tag(name: str,
    attrs: dict = None,
    children: List[Union[Node, str]] = None,
    close: Optional[bool] = True)

Tag objects have the following attributes:

  • name: tag's name
  • attrs: dictionary with attributes of tag.
  • children: list of children tags and strings of the tag
  • close: value determining whether the tag should be closed separately or self-closed or unclosed.

If an attribute need to be specified without value, it should be present in the attrs dictionary as a key but with its value as None. Like

>>> text = Tag("input", attrs={"type": "text", "required": None},
...            close=None)
>>> text.dumps(indent=None)
'<input type="text" required />'

children would have the list of Tags and strss that comes under the tag object.

close value can be used to control the manner in which the tag is closed as follows:

  • True: Allow a separate closing tag (default)
  • None: Self-closed tag
  • False: Don't close tag

Like, for tags with a distinct closing tag

# close=True (separate closing tag)
>>> text = Tag("p", children=["Hello!"])
>>> print(text.dumps())

<p>
  Hello!
</p>

or self-closing tags like

# close=None (self-closed tag)
>>> text = Tag("img", attrs={"src": "server/img.jpg"}, close=None)
>>> text.dumps(indent=None)
'<img src="server/img.jpg" />'

or tags that are not closed like

# close=False (open tag)
>>> text = Tag("br", close=False)
>>> text.dumps(indent=None)
'<br>'

Note: children attribute of a Tag object is ignored by dump() and dumps() if the close value is not True.

Note: attrs and children attributes of a Tag object can be accessed and modified like a normal dict and list respectively.

Note: In mrkup, the <!DOCTYPE html> declaration is meant to be implemented with the Tag class itself like

>>> doctype = Tag("!DOCTYPE", attrs={"html": None})
>>> doctype.dumps(indent=None)
'<!DOCTYPE html>'

Comments

Used to compose HTML comments.

Comment(text: str)

Like

>>> comment = Comment("Just a comment")
>>> comment.dumps(indent=None)
'<!--Just a comment-->'

Processing instructions

Can be used for composing the XML version declaration like

PI(name: str,
   attrs: dict = None)

Like

>>> xml_pi = PI("xml", attrs={"version": "1.0", "encoding": "UTF-8"})
>>> xml_pi.dumps(indent=None)
'<?xml version="1.0" encoding="UTF-8"?>'

Converting to string

The composed HTML can be converted to an equivalent string using the dumps() method of the objects.

Indentation

Indentation level and number of spaces per indentation level used by the dumps() method can be specified using the level and indent argument respectively.

By default dumps() does pretty-printing with indent value 2.

If indent is None, pretty-printing is disabled and value of level is ignored.

Style and script data

JavaScript contents of <script> and CSS of <style> are simply treated as plain text in mrkup.

Like

>>> content = "p { text-align: center; }"
>>> style = Tag("style", children=[content])
>>> print(style.dumps())
<style>
  p { text-align: center; }
</style>

No HTML validation

mrkup doesn't perform any validation to be sure that the tags are valid HTML.

So we could also use it to create some XML..

Example

from mrkup import Tag, Comment

# doctype is not part of the html tag
doctype = Tag("!DOCTYPE", attrs={"html": None}, close=False)

comment = Comment("Here comes the list!")
ol = Tag("ol")
for loc in ['home', 'about', 'contact']:
    a = Tag("a", attrs={"href": f"/{loc}.html"}, children=[loc.title()])
    li = Tag("li", children=[a])
    ol.children.append(li)
h1 = Tag("h1", children=["Hey there!"])
img = Tag("img", attrs={"src": "server/img.jpg"}, close=False)
br = Tag("br", close=None)
body = Tag("body", children=[h1, img, br, "\n", comment, ol])

title = Tag("title", children=["Mrkup your markup"])
link = Tag("link", attrs={"href": "style.css", "rel": "stylesheet"},
           close=None)
script = Tag("script", attrs={"src": "script.js", "type": "text/javascript"})
head = Tag("head", children=[title, link, script])

html = Tag("html", children=[head, body])

# Generate string version
doc = doctype.dumps() + html.dumps()
print(doc)

This would generate the following:

<!DOCTYPE html>
<html>
  <head>
    <title>
      Mrkup your markup
    </title>
    <link href="style.css" rel="stylesheet" />
    <script src="script.js" type="text/javascript">
    </script>
  </head>
  <body>
    <h1>
      Hey there!
    </h1>
    <img src="server/img.jpg">
    <br />


    <!--Here comes the list!-->
    <ol>
      <li>
        <a href="/home.html">
          Home
        </a>
      </li>
      <li>
        <a href="/about.html">
          About
        </a>
      </li>
      <li>
        <a href="/contact.html">
          Contact
        </a>
      </li>
    </ol>
  </body>
</html>

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

mrkup-0.2.tar.gz (8.6 kB view details)

Uploaded Source

Built Distribution

mrkup-0.2-py3-none-any.whl (6.4 kB view details)

Uploaded Python 3

File details

Details for the file mrkup-0.2.tar.gz.

File metadata

  • Download URL: mrkup-0.2.tar.gz
  • Upload date:
  • Size: 8.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/47.1.0 requests-toolbelt/0.9.1 tqdm/4.45.0 CPython/3.7.9

File hashes

Hashes for mrkup-0.2.tar.gz
Algorithm Hash digest
SHA256 5e8d4b18cd28cedf38355271e6b95432382e961ef72178013b563725ede55d43
MD5 284bb1aad7afc52a975e9b8cae66a937
BLAKE2b-256 b8a4bdf069caa98a8a92076caecd96257008303a624bf6f3ae9ba30d002260cd

See more details on using hashes here.

File details

Details for the file mrkup-0.2-py3-none-any.whl.

File metadata

  • Download URL: mrkup-0.2-py3-none-any.whl
  • Upload date:
  • Size: 6.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/47.1.0 requests-toolbelt/0.9.1 tqdm/4.45.0 CPython/3.7.9

File hashes

Hashes for mrkup-0.2-py3-none-any.whl
Algorithm Hash digest
SHA256 eb60373640e0f2ef4b21f5abf1f8945953c98c88a3d154e11f99ca4199f8cf9a
MD5 324815d491885ab4e5b7e2ca1e55118b
BLAKE2b-256 f01e0f82454eddeeb2b3fb4316423704b90ba090753578437d35b8cfa84be967

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page