From 5c4d0dfa6f780df25455dff2a7192642e4d453e6 Mon Sep 17 00:00:00 2001 From: 0x01fe Date: Mon, 11 Mar 2024 14:27:53 -0500 Subject: [PATCH 01/12] made flask server able to read markdown files for posts --- .gitignore | 4 +- Dockerfile | 18 ++++++ app/post.py | 25 +++++++++ app/posts/POST_TEMPLATE.md | 9 +++ app/static/IBMPlexMono-Regular.woff | Bin 0 -> 57132 bytes index_style.css => app/static/index_style.css | 11 +++- app/templates/index.html | 31 ++++++++++ app/website.py | 53 ++++++++++++++++++ config.ini | 5 ++ index.html | 41 -------------- requirements.txt | 2 + 11 files changed, 155 insertions(+), 44 deletions(-) create mode 100644 Dockerfile create mode 100644 app/post.py create mode 100644 app/posts/POST_TEMPLATE.md create mode 100644 app/static/IBMPlexMono-Regular.woff rename index_style.css => app/static/index_style.css (94%) create mode 100644 app/templates/index.html create mode 100644 app/website.py create mode 100644 config.ini delete mode 100644 index.html create mode 100644 requirements.txt diff --git a/.gitignore b/.gitignore index 90ac1a7..d82a1b0 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ -*.woff \ No newline at end of file +__pycache__ +*.md +!POST_TEMPLATE.md diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..963ed85 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,18 @@ +# syntax=docker/dockerfile:1 + +FROM python:3.12.2-slim-bookworm + +RUN apt-get update && apt-get upgrade -y + +RUN useradd -m app + +USER app + +COPY . . + +RUN python3 -m pip install --upgrade pip +RUN python3 -m pip install -r requirements.txt + +WORKDIR ./app + +CMD ["python3", "-u", "./app.py"] diff --git a/app/post.py b/app/post.py new file mode 100644 index 0000000..16d54cf --- /dev/null +++ b/app/post.py @@ -0,0 +1,25 @@ +import markdown +import datetime + +class Post: + + category : str + author : str + date : datetime.datetime + body : str + file : str + + def __init__(self, file_path): + self.file = file_path + + with open(file_path, 'r') as file: + lines = file.readlines() + + self.category = lines[1].split(":")[1].strip() + self.author = lines[2].split(":")[1].strip() + + date = lines[3].split(":")[1].strip() + self.date = datetime.datetime.strptime(date, "%d-%m-%Y") + + self.body = markdown.markdown(''.join(lines[6:])) + diff --git a/app/posts/POST_TEMPLATE.md b/app/posts/POST_TEMPLATE.md new file mode 100644 index 0000000..9d1363d --- /dev/null +++ b/app/posts/POST_TEMPLATE.md @@ -0,0 +1,9 @@ +# Metadata +category: category +author: author +date: date + +# POST +## TITLE +### DATE OR SUBTITLE +POST TEXT diff --git a/app/static/IBMPlexMono-Regular.woff b/app/static/IBMPlexMono-Regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..dd3070d3c50ddba7f9931de467e75bb3e8517658 GIT binary patch literal 57132 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

f64H1P*#;eRy6(b_2epum?W#fA3QfcxW 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 literal 0 HcmV?d00001 diff --git a/index_style.css b/app/static/index_style.css similarity index 94% rename from index_style.css rename to app/static/index_style.css index 89e3df0..e769f78 100644 --- a/index_style.css +++ b/app/static/index_style.css @@ -12,7 +12,6 @@ body { a { color: black; - text-decoration: none; } a:hover { @@ -70,11 +69,15 @@ a:hover { line-height: 30pt; } +.sidebar a { + text-decoration: none; +} + .dlog { order: 2; flex: 3; - text-align: center; + /* text-align: center; */ display: flex; flex-direction: column; @@ -104,3 +107,7 @@ a:hover { background-color: #C9D6DF; } + +.post p { + text-indent: 3em; +} diff --git a/app/templates/index.html b/app/templates/index.html new file mode 100644 index 0000000..f697cd3 --- /dev/null +++ b/app/templates/index.html @@ -0,0 +1,31 @@ + + +

+ + + 0x01fe.net +
+ +
+

0x01fe.net

+

Catchy Right‽

+
+
+ + + + + +
+ {% for post in posts %} +
{{ post|safe }}
+ {% endfor %} +
+
+ + diff --git a/app/website.py b/app/website.py new file mode 100644 index 0000000..86c2cc5 --- /dev/null +++ b/app/website.py @@ -0,0 +1,53 @@ +import glob +import configparser + +import flask + +from post import Post + +app = flask.Flask(__name__, static_url_path='', static_folder='static') + +config = configparser.ConfigParser() +config.read("config.ini") + +POSTS_FOLDER = config['POSTS']['POSTS_FOLDER'] + +def get_posts() -> list[Post]: + post_files= glob.glob(f'{POSTS_FOLDER}/*') + post_files.remove(f'{POSTS_FOLDER}\\POST_TEMPLATE.md') + + posts: list[Post] = [] + for post_file in post_files: + post = Post(post_file) + + posts.append(post) + + # Order Posts by Date + ordered_posts = [] + for i in range(len(posts)): + + most_recent = posts[0] + for p in posts: + if p.date < most_recent.date: + most_recent = p + + ordered_posts.append(most_recent) + posts.remove(most_recent) + + return reversed(ordered_posts) + +@app.route('/') +def index(): + + # Get posts + posts = get_posts() + + post_bodies = [] + for post in posts: + post_bodies.append(post.body) + + return flask.render_template('index.html', posts=post_bodies) + + +if __name__ == "__main__": + app.run() diff --git a/config.ini b/config.ini new file mode 100644 index 0000000..1d1d915 --- /dev/null +++ b/config.ini @@ -0,0 +1,5 @@ +[POSTS] +posts_folder=./posts + +[NETWORK] +PORT=1111 diff --git a/index.html b/index.html deleted file mode 100644 index f71eae4..0000000 --- a/index.html +++ /dev/null @@ -1,41 +0,0 @@ - - -
- - - 0x01fe.net -
- -
-

0x01fe.net

-

Catchy Right‽

-
-
- - - - - -
-
-

It's Peaks, Peaks of Yore

-

March 8th, 2024

-

Excuse the awful title please, but it truly is peak. Peaks of Yore has been a more enjoyable title than I could've ever expected. At first glance it seems like a "rage bait" game akin to the likes of Getting Over It With Bennett Foddy or Super Meatboy, but after the first few fundamental courses you realize the controls aren't fighting you, you just haven't mastered them yet.

-
-
-

Post Title

-

foobar

-
-
-

Post Title

-

foobar

-
-
-
- - diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..67443c6 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +Markdown==3.5.2 +Flask==2.2.3 \ No newline at end of file From 4e7429bd15a5dee2b90c71194bc291c15fe7b097 Mon Sep 17 00:00:00 2001 From: 0x01fe Date: Mon, 11 Mar 2024 14:30:32 -0500 Subject: [PATCH 02/12] forgot to unignore the readme --- .gitignore | 1 + README.md | 9 +++++++++ 2 files changed, 10 insertions(+) create mode 100644 README.md diff --git a/.gitignore b/.gitignore index d82a1b0..2ed48ce 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ __pycache__ *.md !POST_TEMPLATE.md +!README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..9368da6 --- /dev/null +++ b/README.md @@ -0,0 +1,9 @@ +# My-Website + +Code of the website hosted at https://www.0x01fe.net + +Could I gitignore the config files? +Yes. +Do I? +no. + From d22af9734e5e9a345674012f7cd26603f93dd7cc Mon Sep 17 00:00:00 2001 From: 0x01fe Date: Mon, 11 Mar 2024 15:30:26 -0500 Subject: [PATCH 03/12] css changes --- app/resources/status.text | 28 ++++++++++++++++++++++++++++ app/static/index_style.css | 4 ++++ app/templates/index.html | 2 +- app/website.py | 25 +++++++++++++++++++++---- config.ini | 3 +++ 5 files changed, 57 insertions(+), 5 deletions(-) create mode 100644 app/resources/status.text diff --git a/app/resources/status.text b/app/resources/status.text new file mode 100644 index 0000000..a00b8ec --- /dev/null +++ b/app/resources/status.text @@ -0,0 +1,28 @@ +Catchy Right? +Everybody's lazy when they're tired +As long as there is delusion, there is hope +It's 510. +Mindful of the weary inkling that is lurking +Mortal traffic lights signaling when to stay or go +Cyber surgeon, Javascript person +Bone-dried swamplands swallow me +House of dust, land of bone +I ate dirt, I drank stone +Come on, snake, punish me +Drip, drip from the tap, don't slip on the drip +His name really is Tim. +Just wait until you see the 1 in 1000 message. +I'm open to suggestions on how to improve the look of the website +Open the curtains +Don't miss a moment of this experiment +Needles +Sally forth Rocinante! +The multitude tightens its hold. +It's amazing what you'll find face to face +It's not hard to go the distance, When you finally get involved face to face +A tourist in a dream, A visitor, it seems, A half-forgotten song, Where do I belong? +What do you mean ... You can't see it? +I don't believe you, your eyes deceive you, better check yourself in +You will say I'm crazy, I will go on my way 'cause it's what I need +I'd cross a thousand seas just to prove I'm not mad +I thoguht I saw a statue blink, and a bird with no head, Land on a golden thread, I rub my eyes, What am I saying? There's nothing there \ No newline at end of file diff --git a/app/static/index_style.css b/app/static/index_style.css index e769f78..ba2680c 100644 --- a/app/static/index_style.css +++ b/app/static/index_style.css @@ -100,12 +100,16 @@ a:hover { border-radius: 10px; padding: 10pt; + padding-left: 20pt; + padding-right: 20pt; margin: 10pt; margin-left: 20pt; margin-right: 20pt; background-color: #C9D6DF; + + line-height: 1.25em; } .post p { diff --git a/app/templates/index.html b/app/templates/index.html index f697cd3..e23ece6 100644 --- a/app/templates/index.html +++ b/app/templates/index.html @@ -8,7 +8,7 @@

0x01fe.net

-

Catchy Right‽

+

{{ status }}

diff --git a/app/website.py b/app/website.py index 86c2cc5..e0976ba 100644 --- a/app/website.py +++ b/app/website.py @@ -1,5 +1,6 @@ import glob import configparser +import random import flask @@ -7,12 +8,14 @@ from post import Post app = flask.Flask(__name__, static_url_path='', static_folder='static') +CONFIG_PATH = "../config.ini" config = configparser.ConfigParser() -config.read("config.ini") +config.read(CONFIG_PATH) POSTS_FOLDER = config['POSTS']['POSTS_FOLDER'] +STATUS_FILE = config['STATUS']['STATUS_FILE'] -def get_posts() -> list[Post]: +def get_posts(category_filter : str | None = None) -> list[Post]: post_files= glob.glob(f'{POSTS_FOLDER}/*') post_files.remove(f'{POSTS_FOLDER}\\POST_TEMPLATE.md') @@ -20,7 +23,10 @@ def get_posts() -> list[Post]: for post_file in post_files: post = Post(post_file) - posts.append(post) + if not category_filter: + posts.append(post) + elif category_filter == post.category: + posts.append(post) # Order Posts by Date ordered_posts = [] @@ -36,6 +42,14 @@ def get_posts() -> list[Post]: return reversed(ordered_posts) +def get_status() -> str: + with open(STATUS_FILE, 'r') as file: + statuses = file.readlines() + + status = random.randint(0, len(statuses) - 1) + + return statuses[status] + @app.route('/') def index(): @@ -46,7 +60,10 @@ def index(): for post in posts: post_bodies.append(post.body) - return flask.render_template('index.html', posts=post_bodies) + # Get status + status = get_status() + + return flask.render_template('index.html', posts=post_bodies, status=status) if __name__ == "__main__": diff --git a/config.ini b/config.ini index 1d1d915..63cc0da 100644 --- a/config.ini +++ b/config.ini @@ -1,5 +1,8 @@ [POSTS] posts_folder=./posts +[STATUS] +status_file=./resources/status.text + [NETWORK] PORT=1111 From 092759e4b1f8a73de5e4fef05b6c4372f239fe47 Mon Sep 17 00:00:00 2001 From: 0x01fe Date: Wed, 13 Mar 2024 13:29:47 -0500 Subject: [PATCH 04/12] various rendering changes --- app/post.py | 2 +- app/resources/status.text | 5 ++++- app/static/index_style.css | 5 +++++ app/templates/index.html | 2 +- app/website.py | 5 +++-- 5 files changed, 14 insertions(+), 5 deletions(-) diff --git a/app/post.py b/app/post.py index 16d54cf..c882e57 100644 --- a/app/post.py +++ b/app/post.py @@ -12,7 +12,7 @@ class Post: def __init__(self, file_path): self.file = file_path - with open(file_path, 'r') as file: + with open(file_path, 'r', encoding='utf-8') as file: lines = file.readlines() self.category = lines[1].split(":")[1].strip() diff --git a/app/resources/status.text b/app/resources/status.text index a00b8ec..07fe762 100644 --- a/app/resources/status.text +++ b/app/resources/status.text @@ -25,4 +25,7 @@ What do you mean ... You can't see it? I don't believe you, your eyes deceive you, better check yourself in You will say I'm crazy, I will go on my way 'cause it's what I need I'd cross a thousand seas just to prove I'm not mad -I thoguht I saw a statue blink, and a bird with no head, Land on a golden thread, I rub my eyes, What am I saying? There's nothing there \ No newline at end of file +I thoguht I saw a statue blink, and a bird with no head, Land on a golden thread, I rub my eyes, What am I saying? There's nothing there +Solar Sect of Mystic Wisdom +~ Nuclear Fusion +Check out [NEUPINK](https://neupink.bandcamp.com/album/swordflower-hills-killer-2)! \ No newline at end of file diff --git a/app/static/index_style.css b/app/static/index_style.css index ba2680c..8044fcd 100644 --- a/app/static/index_style.css +++ b/app/static/index_style.css @@ -38,6 +38,11 @@ a:hover { font-family: Arial, Helvetica, sans-serif; } +.header a { + text-decoration: none; + color: #703be7; +} + .container { display: flex; diff --git a/app/templates/index.html b/app/templates/index.html index e23ece6..6a3ce30 100644 --- a/app/templates/index.html +++ b/app/templates/index.html @@ -8,7 +8,7 @@

0x01fe.net

-

{{ status }}

+

{{ status|safe }}

diff --git a/app/website.py b/app/website.py index e0976ba..aba90f7 100644 --- a/app/website.py +++ b/app/website.py @@ -3,6 +3,7 @@ import configparser import random import flask +import markdown from post import Post @@ -43,12 +44,12 @@ def get_posts(category_filter : str | None = None) -> list[Post]: return reversed(ordered_posts) def get_status() -> str: - with open(STATUS_FILE, 'r') as file: + with open(STATUS_FILE, 'r', encoding='utf-8') as file: statuses = file.readlines() status = random.randint(0, len(statuses) - 1) - return statuses[status] + return markdown.markdown(statuses[status]) @app.route('/') def index(): From c172cafdbc0e969609275cab92b9a7bd2091f0b0 Mon Sep 17 00:00:00 2001 From: 0x01FE <0x10FE@0x01fe.net> Date: Thu, 14 Mar 2024 10:34:33 -0500 Subject: [PATCH 05/12] added some stuff for running on my server --- .gitignore | 3 +++ Dockerfile | 2 +- app/{website.py => app.py} | 12 +++++++++--- app/resources/status.text | 2 +- config.ini | 5 +++-- requirements.txt | 4 +++- 6 files changed, 20 insertions(+), 8 deletions(-) rename app/{website.py => app.py} (82%) diff --git a/.gitignore b/.gitignore index 2ed48ce..4028b36 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,6 @@ __pycache__ *.md !POST_TEMPLATE.md !README.md + +docker-compose.yaml +*.sh \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 963ed85..6a5b9c2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -15,4 +15,4 @@ RUN python3 -m pip install -r requirements.txt WORKDIR ./app -CMD ["python3", "-u", "./app.py"] +CMD ["python3", "-u", "app.py"] diff --git a/app/website.py b/app/app.py similarity index 82% rename from app/website.py rename to app/app.py index e0976ba..9d2c99f 100644 --- a/app/website.py +++ b/app/app.py @@ -3,6 +3,7 @@ import configparser import random import flask +import waitress from post import Post @@ -14,10 +15,12 @@ config.read(CONFIG_PATH) POSTS_FOLDER = config['POSTS']['POSTS_FOLDER'] STATUS_FILE = config['STATUS']['STATUS_FILE'] +PORT = int(config['NETWORK']['PORT']) +DEV = int(config['NETWORK']['DEV']) def get_posts(category_filter : str | None = None) -> list[Post]: - post_files= glob.glob(f'{POSTS_FOLDER}/*') - post_files.remove(f'{POSTS_FOLDER}\\POST_TEMPLATE.md') + post_files = glob.glob(f'{POSTS_FOLDER}/*') + post_files.remove(f'{POSTS_FOLDER}/POST_TEMPLATE.md') posts: list[Post] = [] for post_file in post_files: @@ -67,4 +70,7 @@ def index(): if __name__ == "__main__": - app.run() + if DEV: + app.run(port=PORT) + else: + waitress.serve(app, host='0.0.0.0', port=PORT) diff --git a/app/resources/status.text b/app/resources/status.text index a00b8ec..af19294 100644 --- a/app/resources/status.text +++ b/app/resources/status.text @@ -25,4 +25,4 @@ What do you mean ... You can't see it? I don't believe you, your eyes deceive you, better check yourself in You will say I'm crazy, I will go on my way 'cause it's what I need I'd cross a thousand seas just to prove I'm not mad -I thoguht I saw a statue blink, and a bird with no head, Land on a golden thread, I rub my eyes, What am I saying? There's nothing there \ No newline at end of file +I thought I saw a statue blink, and a bird with no head, Land on a golden thread, I rub my eyes, What am I saying? There's nothing there \ No newline at end of file diff --git a/config.ini b/config.ini index 63cc0da..8bc9e69 100644 --- a/config.ini +++ b/config.ini @@ -1,8 +1,9 @@ [POSTS] -posts_folder=./posts +posts_folder=posts [STATUS] -status_file=./resources/status.text +status_file=resources/status.text [NETWORK] +DEV=0 PORT=1111 diff --git a/requirements.txt b/requirements.txt index 67443c6..1308c6c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,4 @@ Markdown==3.5.2 -Flask==2.2.3 \ No newline at end of file +Flask==2.2.3 +waitress==2.1.2 +Werkzeug==2.2.3 \ No newline at end of file From 79c5fc95a7421fee56ec29953ae1e93a8d58d690 Mon Sep 17 00:00:00 2001 From: 0x01FE <0x10FE@0x01fe.net> Date: Thu, 14 Mar 2024 10:39:43 -0500 Subject: [PATCH 06/12] i messed up the merge --- app/app.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/app.py b/app/app.py index 099bc73..82cf16f 100644 --- a/app/app.py +++ b/app/app.py @@ -47,12 +47,12 @@ def get_posts(category_filter : str | None = None) -> list[Post]: return reversed(ordered_posts) def get_status() -> str: - with open(STATUS_FILE, 'r') as file: + with open(STATUS_FILE, 'r', encoding='utf-8') as file: statuses = file.readlines() status = random.randint(0, len(statuses) - 1) - return statuses[status] + return markdown.markdown(statuses[status]) @app.route('/') def index(): From dcb2b6b326cad9b048b2742ddc4a99d196b8437c Mon Sep 17 00:00:00 2001 From: 0x01fe Date: Thu, 14 Mar 2024 13:16:03 -0500 Subject: [PATCH 07/12] some refactors i think --- app/{website.py => app.py} | 0 app/config.ini | 8 ++++++++ app/static/index_style.css | 8 +++++--- 3 files changed, 13 insertions(+), 3 deletions(-) rename app/{website.py => app.py} (100%) create mode 100644 app/config.ini diff --git a/app/website.py b/app/app.py similarity index 100% rename from app/website.py rename to app/app.py diff --git a/app/config.ini b/app/config.ini new file mode 100644 index 0000000..63cc0da --- /dev/null +++ b/app/config.ini @@ -0,0 +1,8 @@ +[POSTS] +posts_folder=./posts + +[STATUS] +status_file=./resources/status.text + +[NETWORK] +PORT=1111 diff --git a/app/static/index_style.css b/app/static/index_style.css index 8044fcd..215d546 100644 --- a/app/static/index_style.css +++ b/app/static/index_style.css @@ -31,7 +31,7 @@ a:hover { border-style: solid; border-color: #1E2022; background-color: #F0F5F9; - border-radius: 5pt; + border-radius: 20px; } .header h1 { @@ -51,14 +51,16 @@ a:hover { border-style: solid; border-color: #1E2022; background-color: #F0F5F9; + border-radius: 20px; } .sidebar { order: 1; + height: fit-content; float: left; padding: 20pt; - padding-bottom: 25%; + padding-bottom: 5em; margin: 15pt; @@ -93,7 +95,7 @@ a:hover { margin-right: 15%; border-style: solid; - border-radius: 10px; + border-radius: 20px; border-color: #1E2022; background-color: #C9D6DF; } From 24fb3c94caf83ce28eadc2254957eb6665a04366 Mon Sep 17 00:00:00 2001 From: 0x01fe Date: Thu, 14 Mar 2024 13:16:35 -0500 Subject: [PATCH 08/12] config.ini got moved --- config.ini | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 config.ini diff --git a/config.ini b/config.ini deleted file mode 100644 index 8bc9e69..0000000 --- a/config.ini +++ /dev/null @@ -1,9 +0,0 @@ -[POSTS] -posts_folder=posts - -[STATUS] -status_file=resources/status.text - -[NETWORK] -DEV=0 -PORT=1111 From af956d09d10a67b33c39a20f9b6146fde12473c3 Mon Sep 17 00:00:00 2001 From: 0x01fe Date: Thu, 14 Mar 2024 13:16:56 -0500 Subject: [PATCH 09/12] forgot to update config path for moved file --- app/app.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/app.py b/app/app.py index 82cf16f..9d93f70 100644 --- a/app/app.py +++ b/app/app.py @@ -10,7 +10,7 @@ from post import Post app = flask.Flask(__name__, static_url_path='', static_folder='static') -CONFIG_PATH = "../config.ini" +CONFIG_PATH = "./config.ini" config = configparser.ConfigParser() config.read(CONFIG_PATH) From ec2a6a7a6dfa3071474eee847424038c47628b8b Mon Sep 17 00:00:00 2001 From: 0x01fe Date: Thu, 14 Mar 2024 14:44:33 -0500 Subject: [PATCH 10/12] redid all the css almost --- Dockerfile | 36 ++--- README.md | 18 +-- app/app.py | 159 ++++++++++----------- app/config.ini | 17 +-- app/post.py | 50 +++---- app/posts/POST_TEMPLATE.md | 18 +-- app/resources/status.text | 60 ++++---- app/static/index_style.css | 276 ++++++++++++++++++++----------------- app/templates/index.html | 62 ++++----- requirements.txt | 6 +- 10 files changed, 368 insertions(+), 334 deletions(-) diff --git a/Dockerfile b/Dockerfile index 6a5b9c2..67b613a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,18 +1,18 @@ -# syntax=docker/dockerfile:1 - -FROM python:3.12.2-slim-bookworm - -RUN apt-get update && apt-get upgrade -y - -RUN useradd -m app - -USER app - -COPY . . - -RUN python3 -m pip install --upgrade pip -RUN python3 -m pip install -r requirements.txt - -WORKDIR ./app - -CMD ["python3", "-u", "app.py"] +# syntax=docker/dockerfile:1 + +FROM python:3.12.2-slim-bookworm + +RUN apt-get update && apt-get upgrade -y + +RUN useradd -m app + +USER app + +COPY . . + +RUN python3 -m pip install --upgrade pip +RUN python3 -m pip install -r requirements.txt + +WORKDIR ./app + +CMD ["python3", "-u", "app.py"] diff --git a/README.md b/README.md index 9368da6..d8282e3 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,9 @@ -# My-Website - -Code of the website hosted at https://www.0x01fe.net - -Could I gitignore the config files? -Yes. -Do I? -no. - +# My-Website + +Code of the website hosted at https://www.0x01fe.net + +Could I gitignore the config files? +Yes. +Do I? +no. + diff --git a/app/app.py b/app/app.py index 9d93f70..5ec5bb0 100644 --- a/app/app.py +++ b/app/app.py @@ -1,77 +1,82 @@ -import glob -import configparser -import random - -import flask -import waitress -import markdown - -from post import Post - -app = flask.Flask(__name__, static_url_path='', static_folder='static') - -CONFIG_PATH = "./config.ini" -config = configparser.ConfigParser() -config.read(CONFIG_PATH) - -POSTS_FOLDER = config['POSTS']['POSTS_FOLDER'] -STATUS_FILE = config['STATUS']['STATUS_FILE'] -PORT = int(config['NETWORK']['PORT']) -DEV = int(config['NETWORK']['DEV']) - -def get_posts(category_filter : str | None = None) -> list[Post]: - post_files = glob.glob(f'{POSTS_FOLDER}/*') - post_files.remove(f'{POSTS_FOLDER}/POST_TEMPLATE.md') - - posts: list[Post] = [] - for post_file in post_files: - post = Post(post_file) - - if not category_filter: - posts.append(post) - elif category_filter == post.category: - posts.append(post) - - # Order Posts by Date - ordered_posts = [] - for i in range(len(posts)): - - most_recent = posts[0] - for p in posts: - if p.date < most_recent.date: - most_recent = p - - ordered_posts.append(most_recent) - posts.remove(most_recent) - - return reversed(ordered_posts) - -def get_status() -> str: - with open(STATUS_FILE, 'r', encoding='utf-8') as file: - statuses = file.readlines() - - status = random.randint(0, len(statuses) - 1) - - return markdown.markdown(statuses[status]) - -@app.route('/') -def index(): - - # Get posts - posts = get_posts() - - post_bodies = [] - for post in posts: - post_bodies.append(post.body) - - # Get status - status = get_status() - - return flask.render_template('index.html', posts=post_bodies, status=status) - - -if __name__ == "__main__": - if DEV: - app.run(port=PORT) - else: - waitress.serve(app, host='0.0.0.0', port=PORT) +import glob +import configparser +import random + +import flask +import waitress +import markdown + +from post import Post + +app = flask.Flask(__name__, static_url_path='', static_folder='static') + +CONFIG_PATH = "./config.ini" +config = configparser.ConfigParser() +config.read(CONFIG_PATH) + +POSTS_FOLDER = config['POSTS']['POSTS_FOLDER'] +STATUS_FILE = config['STATUS']['STATUS_FILE'] +PORT = int(config['NETWORK']['PORT']) +DEV = int(config['NETWORK']['DEV']) + +def get_posts(category_filter : str | None = None) -> list[Post]: + post_files = glob.glob(f'{POSTS_FOLDER}/*') + try: + post_files.remove(f'{POSTS_FOLDER}/POST_TEMPLATE.md') + except ValueError as e: + print(e) + print(f'Couldn\'t remove the template file probably; {post_files}') + exit() + + posts: list[Post] = [] + for post_file in post_files: + post = Post(post_file) + + if not category_filter: + posts.append(post) + elif category_filter == post.category: + posts.append(post) + + # Order Posts by Date + ordered_posts = [] + for i in range(len(posts)): + + most_recent = posts[0] + for p in posts: + if p.date < most_recent.date: + most_recent = p + + ordered_posts.append(most_recent) + posts.remove(most_recent) + + return reversed(ordered_posts) + +def get_status() -> str: + with open(STATUS_FILE, 'r', encoding='utf-8') as file: + statuses = file.readlines() + + status = random.randint(0, len(statuses) - 1) + + return markdown.markdown(statuses[status]) + +@app.route('/') +def index(): + + # Get posts + posts = get_posts() + + post_bodies = [] + for post in posts: + post_bodies.append(post.body) + + # Get status + status = get_status() + + return flask.render_template('index.html', posts=post_bodies, status=status) + + +if __name__ == "__main__": + if DEV: + app.run(port=PORT) + else: + waitress.serve(app, host='0.0.0.0', port=PORT) diff --git a/app/config.ini b/app/config.ini index 63cc0da..4485d75 100644 --- a/app/config.ini +++ b/app/config.ini @@ -1,8 +1,9 @@ -[POSTS] -posts_folder=./posts - -[STATUS] -status_file=./resources/status.text - -[NETWORK] -PORT=1111 +[POSTS] +posts_folder=./posts + +[STATUS] +status_file=./resources/status.text + +[NETWORK] +PORT=1111 +DEV=1 diff --git a/app/post.py b/app/post.py index c882e57..1de822a 100644 --- a/app/post.py +++ b/app/post.py @@ -1,25 +1,25 @@ -import markdown -import datetime - -class Post: - - category : str - author : str - date : datetime.datetime - body : str - file : str - - def __init__(self, file_path): - self.file = file_path - - with open(file_path, 'r', encoding='utf-8') as file: - lines = file.readlines() - - self.category = lines[1].split(":")[1].strip() - self.author = lines[2].split(":")[1].strip() - - date = lines[3].split(":")[1].strip() - self.date = datetime.datetime.strptime(date, "%d-%m-%Y") - - self.body = markdown.markdown(''.join(lines[6:])) - +import markdown +import datetime + +class Post: + + category : str + author : str + date : datetime.datetime + body : str + file : str + + def __init__(self, file_path): + self.file = file_path + + with open(file_path, 'r', encoding='utf-8') as file: + lines = file.readlines() + + self.category = lines[1].split(":")[1].strip() + self.author = lines[2].split(":")[1].strip() + + date = lines[3].split(":")[1].strip() + self.date = datetime.datetime.strptime(date, "%d-%m-%Y") + + self.body = markdown.markdown(''.join(lines[6:])) + diff --git a/app/posts/POST_TEMPLATE.md b/app/posts/POST_TEMPLATE.md index 9d1363d..7fd0fb8 100644 --- a/app/posts/POST_TEMPLATE.md +++ b/app/posts/POST_TEMPLATE.md @@ -1,9 +1,9 @@ -# Metadata -category: category -author: author -date: date - -# POST -## TITLE -### DATE OR SUBTITLE -POST TEXT +# Metadata +category: category +author: author +date: date + +# POST +## TITLE +### DATE OR SUBTITLE +POST TEXT diff --git a/app/resources/status.text b/app/resources/status.text index a5bb9f4..3e80c49 100644 --- a/app/resources/status.text +++ b/app/resources/status.text @@ -1,31 +1,31 @@ -Catchy Right? -Everybody's lazy when they're tired -As long as there is delusion, there is hope -It's 510. -Mindful of the weary inkling that is lurking -Mortal traffic lights signaling when to stay or go -Cyber surgeon, Javascript person -Bone-dried swamplands swallow me -House of dust, land of bone -I ate dirt, I drank stone -Come on, snake, punish me -Drip, drip from the tap, don't slip on the drip -His name really is Tim. -Just wait until you see the 1 in 1000 message. -I'm open to suggestions on how to improve the look of the website -Open the curtains -Don't miss a moment of this experiment -Needles -Sally forth Rocinante! -The multitude tightens its hold. -It's amazing what you'll find face to face -It's not hard to go the distance, When you finally get involved face to face -A tourist in a dream, A visitor, it seems, A half-forgotten song, Where do I belong? -What do you mean ... You can't see it? -I don't believe you, your eyes deceive you, better check yourself in -You will say I'm crazy, I will go on my way 'cause it's what I need -I'd cross a thousand seas just to prove I'm not mad -I thought I saw a statue blink, and a bird with no head, Land on a golden thread, I rub my eyes, What am I saying? There's nothing there -Solar Sect of Mystic Wisdom -~ Nuclear Fusion +Catchy Right? +Everybody's lazy when they're tired +As long as there is delusion, there is hope +It's 510. +Mindful of the weary inkling that is lurking +Mortal traffic lights signaling when to stay or go +Cyber surgeon, Javascript person +Bone-dried swamplands swallow me +House of dust, land of bone +I ate dirt, I drank stone +Come on, snake, punish me +Drip, drip from the tap, don't slip on the drip +His name really is Tim. +Just wait until you see the 1 in 1000 message. +I'm open to suggestions on how to improve the look of the website +Open the curtains +Don't miss a moment of this experiment +Needles +Sally forth Rocinante! +The multitude tightens its hold. +It's amazing what you'll find face to face +It's not hard to go the distance, When you finally get involved face to face +A tourist in a dream, A visitor, it seems, A half-forgotten song, Where do I belong? +What do you mean ... You can't see it? +I don't believe you, your eyes deceive you, better check yourself in +You will say I'm crazy, I will go on my way 'cause it's what I need +I'd cross a thousand seas just to prove I'm not mad +I thought I saw a statue blink, and a bird with no head, Land on a golden thread, I rub my eyes, What am I saying? There's nothing there +Solar Sect of Mystic Wisdom +~ Nuclear Fusion Check out [NEUPINK](https://neupink.bandcamp.com/album/swordflower-hills-killer-2)! \ No newline at end of file diff --git a/app/static/index_style.css b/app/static/index_style.css index 215d546..15efd34 100644 --- a/app/static/index_style.css +++ b/app/static/index_style.css @@ -1,124 +1,152 @@ -/* Global Settings */ -@font-face { - font-family: ibmplexmono; - src: url(./IBMPlexMono-Regular.woff) format('woff'); -} - - -body { - /* font-family: 'Courier New', Courier, monospace; */ - font-family: ibmplexmono; -} - -a { - color: black; -} - -a:hover { - color: hotpink; -} - - - - -/* Other */ - -.header { - text-align: center; - - margin: 10pt; - - border-style: solid; - border-color: #1E2022; - background-color: #F0F5F9; - border-radius: 20px; -} - -.header h1 { - font-family: Arial, Helvetica, sans-serif; -} - -.header a { - text-decoration: none; - color: #703be7; -} - -.container { - - display: flex; - flex-direction: row; - - border-style: solid; - border-color: #1E2022; - background-color: #F0F5F9; - border-radius: 20px; -} - -.sidebar { - order: 1; - height: fit-content; - float: left; - - padding: 20pt; - padding-bottom: 5em; - - margin: 15pt; - - border-style: solid; - border-radius: 10px; - border-color: #1E2022; - background-color: #C9D6DF; - - opacity: 0.9; - - /* Text Settings */ - font-weight: bold; - line-height: 30pt; -} - -.sidebar a { - text-decoration: none; -} - - -.dlog { - order: 2; - flex: 3; - /* text-align: center; */ - - display: flex; - flex-direction: column; - - padding: 10pt; - margin: 15pt; - margin-left: 15%; - margin-right: 15%; - - border-style: solid; - border-radius: 20px; - border-color: #1E2022; - background-color: #C9D6DF; -} - -.post { - /* opacity: 0.9; */ - - border: 2px solid #52616B; - border-radius: 10px; - - padding: 10pt; - padding-left: 20pt; - padding-right: 20pt; - - margin: 10pt; - margin-left: 20pt; - margin-right: 20pt; - - background-color: #C9D6DF; - - line-height: 1.25em; -} - -.post p { - text-indent: 3em; -} +/* Global Stuff */ +@import url('https://fonts.googleapis.com/css?family=PT%20Mono:700|PT%20Mono:400'); + +body { + font-family: 'PT Mono'; + font-weight: 400; +} + +h1, h2, h3, h4, h5 { + font-family: 'PT Mono'; + font-weight: 700; +} + +html { + --text: hsl(224, 83%, 91%); + --background: hsl(224, 31%, 23%); + --primary: hsl(229, 81%, 73%); + --primary10: hsla(209, 61%, 71%, 10%); + --primary20: hsla(209, 61%, 71%, 20%); + --primary40: hsla(209, 61%, 71%, 40%); + --secondary: hsl(277, 81%, 33%); + --accent: hsl(291, 81%, 60%); + --accent75: hsla(291, 81%, 60%, 75%); + --accent50: hsla(291, 81%, 60%, 50%); + + --main-background: var(--primary10); + --borders-style: hidden; + --border-radius: 15px; +} + + +body { + color: var(--text); + background-color: var(--background); +} + +a { + color: var(--text); +} + +a:hover { + color: var(--accent); +} + + + + +/* Other */ + +.header { + text-align: center; + + margin: 0 30%; + padding: 2em; + + border-style: var(--borders-style); + border-color: #1E2022; + background-color: var(--background); + border-radius: var(--border-radius); +} + +.header a { + text-decoration: none; + color: var(--primary); +} + +.container { + + display: flex; + flex-direction: row; + + margin: 0px 20%; + + border-style: var(--borders-style); + border-color: #1E2022; + background-color: var(--main-background); + border-radius: var(--border-radius); +} + +.sidebar { + order: 1; + height: fit-content; + float: left; + + padding: 20pt; + + margin: 5em 0; + margin-left: 2em; + + border-style: var(--borders-style); + border-radius: var(--border-radius); + border-color: #1E2022; + background-color: var(--main-background); + + opacity: 0.9; + + /* Text Settings */ + font-weight: bold; + line-height: 30pt; +} + +.sidebar a { + text-decoration: none; +} + + +.dlog { + order: 2; + flex: 3; + /* text-align: center; */ + + display: flex; + flex-direction: column; + + padding: 10pt; + margin: 0 5%; + margin-left: 0; + + border-style: var(--borders-style); + border-radius: var(--border-radius); + border-color: #1E2022; + /* background-color: var(--main-background); */ +} + +.post { + + border-style: var(--borders-style); + border-radius: var(--border-radius); + + padding: 1.5em 2em; + margin: 1em 2em; + + /* background-color: var(--main-background); */ +} + +.post h2 { + text-decoration: underline; + text-decoration-style: solid; + text-decoration-thickness: 0.25em; + text-underline-offset: 6px; + text-decoration-color: var(--accent75); +} + +.post h3 { + font-weight: 300; + font-size: 18px; +} + +.post p { + line-height: 2.25; + text-indent: 3em; +} diff --git a/app/templates/index.html b/app/templates/index.html index 6a3ce30..f9fb491 100644 --- a/app/templates/index.html +++ b/app/templates/index.html @@ -1,31 +1,31 @@ - - -
- - - 0x01fe.net -
- -
-

0x01fe.net

-

{{ status|safe }}

-
-
- - - - - -
- {% for post in posts %} -
{{ post|safe }}
- {% endfor %} -
-
- - + + +
+ + + 0x01fe.net +
+ +
+

0x01fe.net

+ {{ status|safe }} +
+
+ + + + + +
+ {% for post in posts %} +
{{ post|safe }}
+ {% endfor %} +
+
+ + diff --git a/requirements.txt b/requirements.txt index 1308c6c..bb91e2f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -Markdown==3.5.2 -Flask==2.2.3 -waitress==2.1.2 +Markdown==3.5.2 +Flask==2.2.3 +waitress==2.1.2 Werkzeug==2.2.3 \ No newline at end of file From c38823f2ec53611db7aa82a05d75c67701357ece Mon Sep 17 00:00:00 2001 From: 0x01FE <0x10FE@0x01fe.net> Date: Thu, 14 Mar 2024 20:54:58 -0500 Subject: [PATCH 11/12] more css changes --- app/config.ini | 2 +- app/resources/status.text | 8 ++++---- app/static/index_style.css | 9 ++++----- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/app/config.ini b/app/config.ini index 4485d75..8d00b71 100644 --- a/app/config.ini +++ b/app/config.ini @@ -6,4 +6,4 @@ status_file=./resources/status.text [NETWORK] PORT=1111 -DEV=1 +DEV=0 diff --git a/app/resources/status.text b/app/resources/status.text index 3e80c49..c258209 100644 --- a/app/resources/status.text +++ b/app/resources/status.text @@ -19,11 +19,11 @@ Needles Sally forth Rocinante! The multitude tightens its hold. It's amazing what you'll find face to face -It's not hard to go the distance, When you finally get involved face to face -A tourist in a dream, A visitor, it seems, A half-forgotten song, Where do I belong? +It's not hard to go the distance / When you finally get involved face to face +A tourist in a dream / A visitor, it seems / A half-forgotten song / Where do I belong? What do you mean ... You can't see it? -I don't believe you, your eyes deceive you, better check yourself in -You will say I'm crazy, I will go on my way 'cause it's what I need +I don't believe you / your eyes deceive you / better check yourself in +You will say I'm crazy / I will go on my way 'cause it's what I need I'd cross a thousand seas just to prove I'm not mad I thought I saw a statue blink, and a bird with no head, Land on a golden thread, I rub my eyes, What am I saying? There's nothing there Solar Sect of Mystic Wisdom diff --git a/app/static/index_style.css b/app/static/index_style.css index 15efd34..b91f32c 100644 --- a/app/static/index_style.css +++ b/app/static/index_style.css @@ -69,7 +69,7 @@ a:hover { display: flex; flex-direction: row; - margin: 0px 20%; + margin: 0px 10%; border-style: var(--borders-style); border-color: #1E2022; @@ -78,9 +78,10 @@ a:hover { } .sidebar { - order: 1; height: fit-content; - float: left; + align-self: flex-start; + position: sticky; + top: 10px; padding: 20pt; @@ -105,9 +106,7 @@ a:hover { .dlog { - order: 2; flex: 3; - /* text-align: center; */ display: flex; flex-direction: column; From 83119a6e57e21f8a0c6480f2878bc060aea5b686 Mon Sep 17 00:00:00 2001 From: 0x01FE <0x10FE@0x01fe.net> Date: Sat, 16 Mar 2024 16:11:16 -0500 Subject: [PATCH 12/12] added the other webpages --- app/app.py | 73 ++++++++++++++++++++++ app/static/IBMPlexMono-Regular.woff | Bin 57132 -> 0 bytes app/static/{index_style.css => style.css} | 1 - app/templates/about.html | 41 ++++++++++++ app/templates/games.html | 33 ++++++++++ app/templates/index.html | 12 ++-- app/templates/motion-pictures.html | 33 ++++++++++ app/templates/music.html | 33 ++++++++++ app/templates/programming.html | 33 ++++++++++ 9 files changed, 253 insertions(+), 6 deletions(-) delete mode 100644 app/static/IBMPlexMono-Regular.woff rename app/static/{index_style.css => style.css} (94%) create mode 100644 app/templates/about.html create mode 100644 app/templates/games.html create mode 100644 app/templates/motion-pictures.html create mode 100644 app/templates/music.html create mode 100644 app/templates/programming.html diff --git a/app/app.py b/app/app.py index 5ec5bb0..3492a78 100644 --- a/app/app.py +++ b/app/app.py @@ -59,6 +59,7 @@ def get_status() -> str: return markdown.markdown(statuses[status]) +# Main Page @app.route('/') def index(): @@ -74,6 +75,78 @@ def index(): return flask.render_template('index.html', posts=post_bodies, status=status) +# Games Page +@app.route('/games/') +def games(): + + # Get posts + posts = get_posts(category_filter="games") + + post_bodies = [] + for post in posts: + post_bodies.append(post.body) + + # Get status + status = get_status() + + return flask.render_template('games.html', posts=post_bodies, status=status) + +# Music Page +@app.route('/music/') +def music(): + + # Get posts + posts = get_posts(category_filter="music") + + post_bodies = [] + for post in posts: + post_bodies.append(post.body) + + # Get status + status = get_status() + + return flask.render_template('music.html', posts=post_bodies, status=status) + +# Motion Pictures Page +@app.route('/motion-pictures/') +def motion_pictures(): + + # Get posts + posts = get_posts(category_filter="motion-pictures") + + post_bodies = [] + for post in posts: + post_bodies.append(post.body) + + # Get status + status = get_status() + + return flask.render_template('motion-pictures.html', posts=post_bodies, status=status) + +# Programming Page +@app.route('/programming/') +def programming(): + + # Get posts + posts = get_posts(category_filter="programming") + + post_bodies = [] + for post in posts: + post_bodies.append(post.body) + + # Get status + status = get_status() + + return flask.render_template('programming.html', posts=post_bodies, status=status) + +# About Page +@app.route('/about/') +def about(): + + # Get status + status = get_status() + + return flask.render_template('about.html', status=status) if __name__ == "__main__": if DEV: diff --git a/app/static/IBMPlexMono-Regular.woff b/app/static/IBMPlexMono-Regular.woff deleted file mode 100644 index dd3070d3c50ddba7f9931de467e75bb3e8517658..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57132 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

f64H1P*#;eRy6(b_2epum?W#fA3QfcxW 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 diff --git a/app/static/index_style.css b/app/static/style.css similarity index 94% rename from app/static/index_style.css rename to app/static/style.css index b91f32c..5a6e542 100644 --- a/app/static/index_style.css +++ b/app/static/style.css @@ -104,7 +104,6 @@ a:hover { text-decoration: none; } - .dlog { flex: 3; diff --git a/app/templates/about.html b/app/templates/about.html new file mode 100644 index 0000000..a2663fc --- /dev/null +++ b/app/templates/about.html @@ -0,0 +1,41 @@ + + +

+ + + 0x01fe.net - About +
+ +
+

0x01fe.net

+ {{ status|safe }} +
+
+ + + + + +
+
+

About

+

+ Hi! I'm 0x01fe. This website is a personal project that allows me to express my thoughts online about things I like and also gives me something to program and tinker with on my spare time. If you want to contact me try hitting me up on discord at 0x01fe. +

+
+

Why 0x01fe?

+

+ This is a pretty common question I get regarding my username so I thought I'd put a little section here about it. The thought process behind the username was "I like computers so what's a computer related username I could have?" and the first thing that came to mind was the master boot record boot sector (100% related to that other Master Boot Record). So I opened up the Wikipedia Page on the master boot record and scrolled until something called out to me. When I saw the starting byte of the boot signature in hex was 0x01fe I thought "yeah that'd work", and I've stuck with it. +

+
+
+
+ + diff --git a/app/templates/games.html b/app/templates/games.html new file mode 100644 index 0000000..d023f8b --- /dev/null +++ b/app/templates/games.html @@ -0,0 +1,33 @@ + + +
+ + + 0x01fe.net - Games +
+ +
+

Games

+ {{ status|safe }} +
+
+ + + + + +
+ {% for post in posts %} +
{{ post|safe }}
+ {% endfor %} +
+
+ + diff --git a/app/templates/index.html b/app/templates/index.html index f9fb491..a5bfb0c 100644 --- a/app/templates/index.html +++ b/app/templates/index.html @@ -2,7 +2,7 @@
- + 0x01fe.net
@@ -13,10 +13,12 @@
diff --git a/app/templates/motion-pictures.html b/app/templates/motion-pictures.html new file mode 100644 index 0000000..459f655 --- /dev/null +++ b/app/templates/motion-pictures.html @@ -0,0 +1,33 @@ + + +
+ + + 0x01fe.net - Motion Pictures +
+ +
+

Motion Pictures

+ {{ status|safe }} +
+
+ + + + + +
+ {% for post in posts %} +
{{ post|safe }}
+ {% endfor %} +
+
+ + diff --git a/app/templates/music.html b/app/templates/music.html new file mode 100644 index 0000000..9a00a11 --- /dev/null +++ b/app/templates/music.html @@ -0,0 +1,33 @@ + + +
+ + + 0x01fe.net - Music +
+ +
+

Music

+ {{ status|safe }} +
+
+ + + + + +
+ {% for post in posts %} +
{{ post|safe }}
+ {% endfor %} +
+
+ + diff --git a/app/templates/programming.html b/app/templates/programming.html new file mode 100644 index 0000000..91a5a31 --- /dev/null +++ b/app/templates/programming.html @@ -0,0 +1,33 @@ + + +
+ + + 0x01fe.net - Programming +
+ +
+

Programming

+ {{ status|safe }} +
+
+ + + + + +
+ {% for post in posts %} +
{{ post|safe }}
+ {% endfor %} +
+
+ +