Skip to content

Commit b143fd7

Browse files
committed
new version
1 parent 29a7167 commit b143fd7

File tree

8 files changed

+289
-119
lines changed

8 files changed

+289
-119
lines changed

app/__init__.py

Whitespace-only changes.

example/__init__.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
from flask import Flask
2+
from flask_html import Page, Head
3+
4+
def create_app():
5+
6+
app = Flask(__name__)
7+
from .blueprint import pages
8+
app.register_blueprint(pages)
9+
return app
10+
11+

example/blueprint/__init__.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
from flask import Blueprint, request
2+
from flask_html import Page, Head
3+
from flask_html.tags import Body, Div, P, Style
4+
pages = Blueprint("pages", __name__, url_prefix="/")
5+
6+
7+
@pages.route("/")
8+
def index():
9+
head = Head('Title', [],['https://code.jquery.com/jquery-3.6.1.min.js'], [{"meta_property": "value"}])
10+
page = Page(head)
11+
page.register_js("""
12+
$(document).ready(function(){
13+
$("body").append("<p>hello world</p>");
14+
})
15+
16+
""")
17+
body = Body(page, styles=Style(color="red", padding_top="15px"),classes=['class1', 'class2'], id='body_id',elements=[
18+
Div(styles=Style(margin="10px"), classes=['class1', 'class2'], id='div_id', elements=[
19+
P(styles=Style(color="blue"), classes=['class1', 'class2'], id='p_id', elements=[
20+
"Hello World"
21+
])
22+
])
23+
])
24+
return page.render(body, request)

example/config.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
SECRET_KEY = "kldsl3lsoq0dljvlek"

flask_html/__init__.py

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22
from flask import request, make_response
33

44
class Head:
5-
custom_styles = ""
65
def __init__(self, title: str, styles : List[str] = [], scripts : List[str] = [], metas : List[Dict[str, str]] = []):
76
styles.append(request.url + "?css=1")
7+
scripts.append(request.url + "?js=1")
88
_cont = """
99
<head>
1010
<meta charset="UTF-8">
@@ -37,29 +37,27 @@ def __repr__(self):
3737
return self.content
3838

3939
def render(self):
40-
if self.custom_styles != "":
41-
self.content+="""
42-
<style>
43-
{styles}
44-
</style>
45-
""".format(styles=self.custom_styles)
4640
self.content += """</head>"""
4741
return self.content
48-
49-
def register_style(self, style: str):
50-
self.custom_styles += style
42+
5143

5244
class Page:
5345
def __init__(self, head : Head, lang: str = "en"):
5446
self.head = head
5547
self.lang = lang
5648
custom_classes = ""
49+
custom_js = ""
5750
def render(self, content, request):
5851
css = request.args.get("css")
52+
_js = request.args.get("js")
5953
if css:
6054
resp = make_response(self.custom_classes)
6155
resp.headers['Content-Type'] = 'text/css ;charset=utf-8'
6256
return resp
57+
if _js:
58+
resp = make_response(self.custom_js)
59+
resp.headers['Content-Type'] = 'text/javascript ;charset=utf-8'
60+
return resp
6361
content = """
6462
<!DOCTYPE html>
6563
<html lang="{lang}">
@@ -72,4 +70,7 @@ def render(self, content, request):
7270
return content
7371

7472
def register_style(self, style: str):
75-
self.custom_classes += style
73+
self.custom_classes += style
74+
75+
def register_js(self, js: str):
76+
self.custom_js += js

flask_html/core.py

Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
from hashlib import sha256
2+
from . import Page
3+
from typing import Dict, List
4+
from flask import current_app
5+
6+
class Style:
7+
"""Inline CSS style
8+
Keyword arguments:
9+
keyword -- value
10+
Example:
11+
Style(color="red", padding_top="blue")
12+
"""
13+
def __init__(self, **kwargs):
14+
"""Inline CSS style
15+
Keyword arguments:
16+
keyword -- value
17+
Example:
18+
Style(color="red", padding_top="blue")
19+
"""
20+
self.style = ""
21+
for key, value in kwargs.items():
22+
if "_" in key:
23+
key = key.replace("_", "-")
24+
self.style+="{}:{};\n".format(key, value)
25+
26+
def __str__(self):
27+
return self.render()
28+
29+
def __repr__(self):
30+
return self.render()
31+
32+
def render(self):
33+
return self.style
34+
35+
class Item:
36+
37+
item = "<{tag} {classes} {id} {props}>{content}</{tag}>"
38+
__tag = None
39+
__classes = None
40+
__id = None
41+
__props = None
42+
page = None
43+
elements = []
44+
styles = ""
45+
js = ""
46+
def register_style(self):
47+
if self.styles:
48+
self.page.register_style(self.styles)
49+
for item in self.elements:
50+
if isinstance(item, Item):
51+
item.page = self.page
52+
item.register_style()
53+
54+
def register_js(self):
55+
if self.js:
56+
self.page.register_js(self.js)
57+
for item in self.elements:
58+
if isinstance(item, Item):
59+
item.page = self.page
60+
item.register_js()
61+
62+
def __init__(self, page: Page = None, classes: List[str] = [], id: str = None, style: Style = None, tag: str = "div", content: List[object] = [], props: Dict[str, str] = {}):
63+
"""Base template for all HTML elements
64+
65+
Args:
66+
page (Page, optional): Page element, uses for Body tag. Defaults to None.
67+
classes (List[str], optional): List of class names for tag. Defaults to [].
68+
id (str, optional): Unique ID for tag. Defaults to None.
69+
style (Style, optional): Custom inline styles for tag. Defaults to None.
70+
tag (str, optional): Tag name. Defaults to "div".
71+
content (List[object], optional): List of Elements. Defaults to [].
72+
props (Dict[str, str], optional): Tag rpoperties. Defaults to {}.
73+
"""
74+
if page:
75+
self.page = page
76+
self.elements = content
77+
_cl = None
78+
if style:
79+
_cl = self.__generate_style(style)
80+
classes.append(_cl)
81+
if len(classes) > 0:
82+
self.__append_classes(classes)
83+
else:
84+
self.__classes = ""
85+
if id:
86+
self.__id = "id='{}'".format(id)
87+
else:
88+
self.__id = ""
89+
self.__tag = tag
90+
if len(props) > 0:
91+
_props = ""
92+
for key, value in props.items():
93+
_props += "{}='{}' ".format(key, value)
94+
self.__props = _props.rstrip(" ")
95+
else:
96+
self.__props = ""
97+
98+
def __str__(self):
99+
return self.render()
100+
101+
def __repr__(self):
102+
return self.render()
103+
104+
def render(self):
105+
"""Render HTML element
106+
107+
Returns:
108+
str: String HTML element
109+
"""
110+
_cnt = ""
111+
for item in self.elements:
112+
_cnt += str(item)
113+
return self.item.format(tag=self.__tag, classes=self.__classes, id=self.__id, content=_cnt, props=self.__props)
114+
115+
def __append_classes(self,classes: List[str] = None):
116+
print(classes)
117+
_res = ""
118+
if classes:
119+
_res = "class='"
120+
for _class in classes:
121+
_res += _class + " "
122+
_res = _res.rstrip(" ")
123+
_res = _res + "'"
124+
self.__classes = _res
125+
126+
def __generate_style(self, style: Style):
127+
styles = style.render()
128+
self.hash_code = "o" + sha256("{secret}{styles}".format(secret=current_app.config.get("SECRET_KEY", "123123"), styles=styles).encode()).hexdigest()[:5]
129+
return self.__register_style(self.hash_code, styles)
130+
131+
def __register_style(self, hash_code: str, styles: str):
132+
_st = """
133+
.{hash_code} {{
134+
{styles}
135+
}}
136+
""".format(hash_code = hash_code, styles=styles)
137+
self.styles = _st
138+
return hash_code

0 commit comments

Comments
 (0)