Skip to main content

A beautiful python syntax to generate HTML.

Project description

Syntags: Write your markup in Python, easily

Features  •  Install  •  License  •  Docs

Syntags lets you generate HTML, XML, SVG, etc. by writing concise, real Python code.

Syntags was built from the ground up for readable code. First-class support for components, custom elements, and fragments is baked into the design.

Syntags takes a different approach to Pyxl — taking Python's own syntax and repurposing it, rather than using a custom character encoding and transforming your invalid code into valid code.

  • The code you write is real Python, no magic.
  • You don't need to learn the quirks of a new syntax.
  • It's easy to get started with and integrate into your code.
  • Highlighting works, and your linter will only be slightly angry.

A brief note on the syntax ~

PEP 8 isn't gospel. Creating a beautiful syntax means ignoring certain parts of it, and that's okay! The second section, "A Foolish Consistency is the Hobgoblin of Little Minds," even summarises this.

View a relevant excerpt

. . . know when to be inconsistent -- sometimes style guide recommendations just aren't applicable. When in doubt, use your best judgment. Look at other examples and decide what looks best.

Some other good reasons to ignore a particular guideline:

  1. When applying the guideline would make the code less readable, even for someone who is used to reading code that follows this PEP.

  2. . . .

Check out the Syntags styleguide for recommendations on how to maintain good code quality.

Features

an expressive syntax that makes sense

Structured like a programming language, because it is one. No context switching between templating and programming.

import syntags as tags
from syntags.html import *

app = html (lang="en") [
  head [
    title ["Some basic markup"]
  ],
  body [
    main [
      ...  # etc...
    ]
  ]
]

rendered = tags.render(app)

intuitive syntax shorthands

It's effortless to write compact code that's easy to read and maintain.

body [
  div .main_wrapper / main [
    ...
  ]
]

# The same, but without the shorthand:
body [
  div (classes={"main-wrapper"}) [
    main [
      ...
    ]
  ]
]

reusable, declarative components

Similar to React, but very much Python.

import syntags as tags
from syntags.html import *

@tags.component
def hello_message(name, **attrs):
  return div [
    f"Hello {name}"
  ]


rv = tags.render(hello_message (name="world"))
View the React JSX equivalent
import React from "react";
import ReactDOMServer from "react-dom/server";

function HelloMessage({ name, ...props }) {
  return (
    <div>
      Hello {name}
    </div>
  );
}


rv = ReactDOMServer.renderToStaticMarkup(<HelloMessage name="world" />)

Keep in mind, this is in JSX. Compiling it is yet another step. Syntags' syntax is pure Python, no intermediate steps required.

first-class fragments, no wizardry required

Fragments are just a sequence of elements, and they can be nested infinitely.

HEAD_DATA = [
  link (rel="canonical", href="https://rob.ac/"),
  link (rel="stylesheet", href="dist/css/layout.css"),
  link (rel="shortcut icon", href="favicon.ico", type="image/x-icon")
]

html (lang="en") [
  head [
    HEAD_DATA
  ],
  ...
]

simple, safe rendering

Everything becomes a string and gets escaped, except for raw strings.

import syntags as tags
from syntags.html import *

rendered = tags.render(
  html (lang="en") [
    tags.raw("""
    <head>
      <title>A good example</title>
      <meta charset="UTF-8">
    </head>
    """),
    body [
      p [
        "<b>This will get escaped</b>"
      ]
    ]
  ]
)

more than just HTML

Syntags comes with a bunch of namespaces to make your life easy.

  • HTML tags: html
  • XML prolog and tag factory: xml
  • Some predefined XML namespaces: svg, rss, sitemap
  • Common, useful components: ext

Install

You can use Pip, or anything that can install from PyPI, such as Poetry or Pipenv.

$ pip install syntags
+ Markdown component (syntags.ext.markdown)
$ pip install syntags[markdown]

License

Syntags is licensed under the ISC license, a simplified version of the MIT license. You can modify this project and use it in whatever you want! The only condition for redistribution is that you must include a copy of the license.

There's a copy in syntags/__init__.py, so you'll be fine as long as you don't remove that! Otherwise, you can include the copy found in the root of the repository.

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

syntags-0.1.0.tar.gz (18.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

syntags-0.1.0-py3-none-any.whl (19.9 kB view details)

Uploaded Python 3

File details

Details for the file syntags-0.1.0.tar.gz.

File metadata

  • Download URL: syntags-0.1.0.tar.gz
  • Upload date:
  • Size: 18.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.0.3 CPython/3.8.1 Windows/10

File hashes

Hashes for syntags-0.1.0.tar.gz
Algorithm Hash digest
SHA256 7077f17437d4fe7e7d0453e5c30860473650b60b7d42ced05a09fd9dc3522629
MD5 6681216eada8e01be5897d6990485efb
BLAKE2b-256 54fe88cccdf6b99565de6de9a5eeb3e188096d8b87a6a04e8d52e50dbbfddafb

See more details on using hashes here.

File details

Details for the file syntags-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: syntags-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 19.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.0.3 CPython/3.8.1 Windows/10

File hashes

Hashes for syntags-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 cf59fe41b9963dbb084f3ad4ab1e90d6b924d4f28aacd710bc0da40fa3449d04
MD5 c0a3ddea5a23a1e6cedea4719fa55c7a
BLAKE2b-256 5edde6914b17997f611bdfc7a17c1277b05d45624505dcf8dd8c1fd33769ea06

See more details on using hashes here.

Supported by

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