Compare commits

...

10 Commits

@ -1,4 +1,4 @@
from flask import Flask, abort, make_response, render_template, request
from flask import (Flask, abort, make_response, redirect, render_template, request, url_for)
from flask_font_awesome import FontAwesome
import config
@ -28,8 +28,12 @@ def page_not_found(e):
language=LANGUAGE), 404
@app.route("/")
@app.route("/index.html")
def index_re():
return redirect(url_for("index"))
@app.route("/")
def index():
content = con_gen.gen_index_string()
return render_template("index.html",
@ -40,8 +44,12 @@ def index():
language=LANGUAGE)
@app.route("/search", methods=["GET", "POST"])
@app.route("/search.html", methods=["GET", "POST"])
def search_re():
return redirect(url_for("search"))
@app.route("/search", methods=["GET", "POST"])
def search():
form = SearchForm()
if request.method == "POST":
@ -63,8 +71,12 @@ def search():
language=LANGUAGE), 200
@app.route("/imprint")
@app.route("/imprint.html")
def imprint_re():
return redirect(url_for("imprint"))
@app.route("/imprint")
def imprint():
return render_template("imprint.html",
title=TITLE,
@ -74,8 +86,12 @@ def imprint():
language=LANGUAGE)
@app.route("/archive")
@app.route("/archive.html")
def archive_re():
return redirect(url_for("archive"))
@app.route("/archive")
def archive():
content = con_gen.gen_arch_string()
return render_template("archive.html",
@ -101,14 +117,21 @@ def entry(path):
@app.route("/feed.xml")
@app.route("/rss.xml")
@app.route("/rss")
def feed_re():
return redirect(url_for("feed"))
@app.route("/feed")
def feed():
content = con_gen.get_rss_string()
rss_xml = render_template("rss.xml",
feed_xml = render_template("feed.xml",
content_string=content,
title=TITLE,
description=DESCRIPTION,
website=WEBSITE)
response = make_response(rss_xml)
website=WEBSITE,
language=LANGUAGE)
response = make_response(feed_xml)
response.headers["Content-Type"] = "application/rss+xml"
return response

@ -1,14 +1,17 @@
import locale
import os
import pathlib
import urllib.parse
from datetime import datetime
from os import path
import markdown
from bs4 import BeautifulSoup
import config
import search
WEBSITE = config.WEBSITE
ENTRY_DIR = config.ENTRY_DIR
LANGUAGE = config.LANGUAGE
LOCAL = "de_DE.UTF-8" if LANGUAGE == "de-de" else "en_US.UTF-8"
@ -90,9 +93,32 @@ def gen_index_string():
if file.endswith(".md"):
content_string += gen_md_content(file, 2)
content_string += "</div>"
content_string = absolutize_html(content_string)
return content_string
def absolutize_html(string):
"""
Creates a html string from another string that only uses absolute links that use the full domain.
Parameters:
string: html-formatted string.
Returns:
string: html-formatted string with absolute linksn
"""
soup = BeautifulSoup(string, "html.parser")
for a_tag in soup.find_all("a"):
href = str(a_tag.get("href"))
if href.startswith("/") or href.startswith("."):
a_tag["href"] = urllib.parse.urljoin(WEBSITE, href)
for img_tag in soup.find_all("img"):
src = str(img_tag.get("src"))
if src.startswith("/") or src.startswith("."):
img_tag["src"] = urllib.parse.urljoin(WEBSITE, src)
return str(soup)
def gen_stand_string(path_ex):
"""
Creates a html-string for a file.
@ -122,6 +148,7 @@ def gen_stand_string(path_ex):
content_string += line
if filename.endswith(".md"):
content_string += gen_md_content(filename, 1)
content_string = absolutize_html(content_string)
return content_string
@ -138,10 +165,8 @@ def gen_md_content(path_ex, depth):
"""
content_string = ""
if path.exists(path_ex):
filename = path_ex.split(".", 1)
fileend = filename[len(filename) - 1]
header = "#"
for i in range(depth):
for _ in range(depth):
header += "#"
header += " "
markdown_lines = open(path_ex, "r").readlines()[1:]
@ -159,6 +184,7 @@ def get_rss_string():
Returns:
string: rss-string of everything that is in the ENTRY_DIR.
"""
locale.setlocale(locale.LC_TIME, "en_US.UTF-8")
path_ex = ENTRY_DIR
content_string = ""
if path.exists(path_ex):
@ -174,16 +200,19 @@ def get_rss_string():
filename = filename.split(".", 1)[0]
content_string += "<item>\n"
content_string += "<title>" + title + "</title>\n"
content_string += "<guid>" + config.WEBSITE + \
content_string += "<guid>" + WEBSITE + \
"/index.html#" + filename + "</guid>\n"
content_string += "<pubDate>" + \
datetime.fromtimestamp(os.path.getmtime(file)).strftime(
"%Y-%m-%d") + "</pubDate>\n"
content_string += "<description>"
"%a, %d %b %Y %H:%M:%S") + " +0100</pubDate>\n"
content_string += "<description>\n<![CDATA[<html>\n<head>\n</head>\n<body>\n"
html_string = ""
for line in text:
content_string += line
content_string += "</description>\n"
html_string += line
content_string += absolutize_html(html_string)
content_string += "\n</body></html>\n]]>\n</description>\n"
content_string += "</item>\n"
locale.setlocale(locale.LC_TIME, LOCAL)
return content_string
@ -231,20 +260,12 @@ def create_preview(path, is_markdown):
string: html-formated preview
"""
file = open(path, "r", encoding="utf-8")
first_lines = file.readlines()
preview = ""
preview_length = 3
for i, line in enumerate(first_lines):
if i == 0:
continue
if i > preview_length:
break
if not line.isspace():
lines = file.read()
if is_markdown:
preview += markdown.markdown(line)
else:
preview += line
else:
preview_length += 1
preview += "<br>...<br>"
lines += markdown.markdown(lines)
preview = ""
first_p = BeautifulSoup(lines).find('p')
if first_p is not None:
preview = "\n<p>" + first_p.text + "</p>\n"
preview += "...<br>"
return preview

@ -4,3 +4,4 @@ Whoosh
WTForms
Flask_WTF
Font-Awesome-Flask
BeautifulSoup4

@ -14,7 +14,6 @@ ENTRY_DIR = config.ENTRY_DIR
def createSearchableData(root):
"""
Schema definition: title(name of file), path(as ID), content(indexed but not stored), textdata (stored text content)
source:
https://appliedmachinelearning.blog/2018/07/31/developing-a-fast-indexing-and-full-text-search-engine-with-whoosh-a-pure-pythhon-library/

@ -76,7 +76,6 @@ span {
}
@media screen and (max-width:800px) {
.main-menu {
background: var(--menubg0);
}

@ -24,7 +24,6 @@ body {
body,
html {
font-family: sans-serif;
height: 100%;
max-width: 100%;
overflow-x: hidden;
}
@ -80,6 +79,7 @@ footer .center {
.main-menu-dropdown img {
float: left;
}
.main-menu-dropdown span,
.main-menu-dropdown a {
float: left;
@ -147,6 +147,7 @@ footer .center {
transition: var(--transtime);
width: 100%;
}
.main-menu a {
display: block;
padding: 20px;
@ -161,8 +162,13 @@ form {
margin-bottom: 40px;
}
.standalone {
max-height: 100%;
}
.entry {
border-radius: 0 10px 30px 0;
max-height: 100%;
/* border-radius: 0 10px 30px 0; */
margin-bottom: 20px;
padding-left: 20px;
}
@ -225,7 +231,7 @@ ol {
}
code {
border-radius: 25px;
/* border-radius: 25px; */
padding-left: 20px;
padding-right: 20px;
page-break-inside: avoid;
@ -258,3 +264,10 @@ form.search::after {
clear: both;
display: table;
}
.standalone img {
width: 50%;
}
.entry img {
width: 50%;
}

@ -5,8 +5,8 @@
<title>{{ title }}</title>
<description>{{ description }}</description>
<language>{{ language }}</language>
<link>{{ website }}/feed.xml</link>
<atom:link href="/feed.xml" rel="self" type="application/rss+xml" />
<link>{{ website }}</link>
<atom:link href="{{ website }}{{ url_for('feed') }}" rel="self" type="application/rss+xml"/>
{% autoescape off %}
{{ content_string }}

@ -1,11 +1,12 @@
<html>
<!DOCTYPE html>
<html lang={% if language=="de-de" %}de{% else %}en{% endif %}>
<head>
<title>{{ title }}</title>
<link href="{{ url_for('static', filename='css/' + style + '.css') }}" rel="stylesheet" type="text/css">
<link rel="icon" type="image/x-icon" href="{{ url_for('static', filename='graphics/logo.png') }}">
<link rel="icon" type="image/x-icon" href="{{ url_for('static', filename='graphics/logo.png')}}">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width" initial-scale=1.0>
<meta name="viewport" content="width=device-width">
{{ font_awesome.load_js() }}
</head>
@ -13,7 +14,9 @@
<!-- Menu -->
<div class="main-menu-dropdown">
<a href="{{ url_for('index') }}">
<img class="logo" src="{{ url_for('static', filename='graphics/logo.png') }}">
<img class="logo" src="{{ url_for('static', filename='graphics/logo.png') }}" alt="Logo von
Mittelerde mit Marten. Zu sehen sind 3 'M's mit Serifen, wobei die beiden Äußeren etwas
kleiner sind">
{{ stitle }}
</a>
<input type="checkbox" id="main-menu-check">

Loading…
Cancel
Save