mirror of
				https://github.com/tiyn/beaker-blog.git
				synced 2025-11-04 12:51:15 +01:00 
			
		
		
		
	markdown-support added
This commit is contained in:
		
							
								
								
									
										79
									
								
								app.py
									
									
									
									
									
								
							
							
						
						
									
										79
									
								
								app.py
									
									
									
									
									
								
							@@ -1,14 +1,10 @@
 | 
			
		||||
from flask import Flask, flash, make_response, render_template, request, redirect
 | 
			
		||||
import datetime
 | 
			
		||||
from datetime import datetime
 | 
			
		||||
import os
 | 
			
		||||
from os import path
 | 
			
		||||
import pathlib
 | 
			
		||||
 | 
			
		||||
import content as con_gen
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
app = Flask(__name__)
 | 
			
		||||
 | 
			
		||||
website = 'localhost:5000'
 | 
			
		||||
 | 
			
		||||
@app.errorhandler(404)
 | 
			
		||||
def page_not_found(e):
 | 
			
		||||
@@ -18,91 +14,26 @@ def page_not_found(e):
 | 
			
		||||
@app.route('/')
 | 
			
		||||
@app.route('/index.html')
 | 
			
		||||
def index():
 | 
			
		||||
    content = gen_index_string()
 | 
			
		||||
    print('content is: ', content)
 | 
			
		||||
    content = con_gen.gen_index_string()
 | 
			
		||||
    return render_template('index.html', title='Blog', content_string=content)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@app.route('/archive')
 | 
			
		||||
@app.route('/archive.html')
 | 
			
		||||
def blog_archive():
 | 
			
		||||
    content = gen_arch_string()
 | 
			
		||||
    content = con_gen.gen_arch_string()
 | 
			
		||||
    return render_template('archive.html', title='Blog Archive', content_string=content)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@app.route('/feed.xml')
 | 
			
		||||
@app.route('/rss.xml')
 | 
			
		||||
def feed():
 | 
			
		||||
    content = get_rss_string()
 | 
			
		||||
    content = con_gen.get_rss_string()
 | 
			
		||||
    rss_xml = render_template('rss.xml', content_string=content)
 | 
			
		||||
    response = make_response(rss_xml)
 | 
			
		||||
    response.headers['Content-Type'] = 'application/rss+xml'
 | 
			
		||||
    return response
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def gen_arch_string():
 | 
			
		||||
    path_ex = 'templates/entry'
 | 
			
		||||
    if path.exists(path_ex):
 | 
			
		||||
        name_list = os.listdir(path_ex)
 | 
			
		||||
        full_list = [os.path.join(path_ex,i) for i in name_list]
 | 
			
		||||
        contents = sorted(full_list, key=os.path.getctime)
 | 
			
		||||
        content_string = ''
 | 
			
		||||
        for file in contents:
 | 
			
		||||
            filename = pathlib.PurePath(file)
 | 
			
		||||
            title = open(filename).readline().rstrip('\n')
 | 
			
		||||
            filename = filename.name
 | 
			
		||||
            if filename[0] != '.':
 | 
			
		||||
                filename = filename.split('.',1)[0]
 | 
			
		||||
            content_string += '<a href="' + '/index.html#' + filename + '">' + title + '</a><br>\n'
 | 
			
		||||
        return content_string
 | 
			
		||||
 | 
			
		||||
def gen_index_string():
 | 
			
		||||
    path_ex = 'templates/entry'
 | 
			
		||||
    content_string = ''
 | 
			
		||||
    if path.exists(path_ex):
 | 
			
		||||
        name_list = os.listdir(path_ex)
 | 
			
		||||
        full_list = [os.path.join(path_ex,i) for i in name_list]
 | 
			
		||||
        contents = sorted(full_list, key=os.path.getctime)
 | 
			
		||||
        for file in contents:
 | 
			
		||||
            filename = pathlib.PurePath(file)
 | 
			
		||||
            title = open(filename).readline().rstrip('\n')
 | 
			
		||||
            text = open(filename).readlines()[1:]
 | 
			
		||||
            filename = filename.name
 | 
			
		||||
            if filename[0] != '.':
 | 
			
		||||
                filename = filename.split('.',1)[0]
 | 
			
		||||
            content_string += '<div class=\'entry\'>\n'
 | 
			
		||||
            content_string += '<h2 id=\'' + filename + '\'>' + title + '</h2>\n'
 | 
			
		||||
            for line in text:
 | 
			
		||||
                content_string += line
 | 
			
		||||
            content_string += '<br><small>' + datetime.fromtimestamp(os.path.getctime(file)).strftime('%Y-%m-%d') + '</small>'
 | 
			
		||||
            content_string += '</div>'
 | 
			
		||||
    return content_string
 | 
			
		||||
 | 
			
		||||
def get_rss_string():
 | 
			
		||||
    path_ex = 'templates/entry'
 | 
			
		||||
    if path.exists(path_ex):
 | 
			
		||||
        name_list = os.listdir(path_ex)
 | 
			
		||||
        full_list = [os.path.join(path_ex,i) for i in name_list]
 | 
			
		||||
        contents = sorted(full_list, key=os.path.getctime)
 | 
			
		||||
        content_string = ''
 | 
			
		||||
        for file in contents:
 | 
			
		||||
            filename = pathlib.PurePath(file)
 | 
			
		||||
            title = open(filename).readline().rstrip('\n')
 | 
			
		||||
            text = open(filename).readlines()[1:]
 | 
			
		||||
            filename = filename.name
 | 
			
		||||
            if filename[0] != '.':
 | 
			
		||||
                filename = filename.split('.',1)[0]
 | 
			
		||||
            content_string += '<item>\n'
 | 
			
		||||
            content_string += '<title>' + title + '</title>\n'
 | 
			
		||||
            content_string += '<guid>' + '/index.html#' + filename + '</guid>\n'
 | 
			
		||||
            content_string += '<pubDate>' + datetime.fromtimestamp(os.path.getctime(file)).strftime('%Y-%m-%d') + '</pubDate>\n'
 | 
			
		||||
            content_string += '<description>'
 | 
			
		||||
            for line in text:
 | 
			
		||||
                content_string += line
 | 
			
		||||
            content_string += '</description>\n'
 | 
			
		||||
            content_string += '</item>\n'
 | 
			
		||||
    return content_string
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
if __name__ == '__main__':
 | 
			
		||||
    app.run(host='0.0.0.0')
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										104
									
								
								content.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										104
									
								
								content.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,104 @@
 | 
			
		||||
import datetime
 | 
			
		||||
from datetime import datetime
 | 
			
		||||
import markdown
 | 
			
		||||
import os
 | 
			
		||||
from os import path
 | 
			
		||||
import pathlib
 | 
			
		||||
 | 
			
		||||
WEBSITE = 'localhost:5000'
 | 
			
		||||
 | 
			
		||||
ENTRY_DIR = 'templates/entry'
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def gen_arch_string():
 | 
			
		||||
    path_ex = ENTRY_DIR
 | 
			
		||||
    if path.exists(path_ex):
 | 
			
		||||
        name_list = os.listdir(path_ex)
 | 
			
		||||
        full_list = [os.path.join(path_ex, i) for i in name_list]
 | 
			
		||||
        contents = sorted(full_list, key=os.path.getctime)
 | 
			
		||||
        content_string = ''
 | 
			
		||||
        for file in reversed(contents):
 | 
			
		||||
            filename = pathlib.PurePath(file)
 | 
			
		||||
            title = open(filename).readline().rstrip('\n')
 | 
			
		||||
            filename = filename.name
 | 
			
		||||
            if filename[0] != '.':
 | 
			
		||||
                filename = filename.split('.', 1)[0]
 | 
			
		||||
            content_string += '<a href="' + '/index.html#' + \
 | 
			
		||||
                filename + '">' + title + '</a><br>\n'
 | 
			
		||||
        return content_string
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def gen_index_string():
 | 
			
		||||
    path_ex = ENTRY_DIR
 | 
			
		||||
    content_string = ''
 | 
			
		||||
    if path.exists(path_ex):
 | 
			
		||||
        name_list = os.listdir(path_ex)
 | 
			
		||||
        full_list = [os.path.join(path_ex, i) for i in name_list]
 | 
			
		||||
        contents = sorted(full_list, key=os.path.getctime)
 | 
			
		||||
        for file in reversed(contents):
 | 
			
		||||
            filename = pathlib.PurePath(file)
 | 
			
		||||
            purefile = filename
 | 
			
		||||
            title = open(filename).readline().rstrip('\n')
 | 
			
		||||
            text = open(filename).readlines()[1:]
 | 
			
		||||
            filename = filename.name
 | 
			
		||||
            if filename[0] != '.':
 | 
			
		||||
                filename = filename.split('.', 1)[0]
 | 
			
		||||
            content_string += '<div class=\'entry\'>\n'
 | 
			
		||||
            content_string += '<h2 id=\'' + filename + '\'>' + title + '</h2>\n'
 | 
			
		||||
            if file.endswith('.html'):
 | 
			
		||||
                for line in text:
 | 
			
		||||
                    content_string += line
 | 
			
		||||
                content_string += '<br>'
 | 
			
		||||
            if file.endswith('.md'):
 | 
			
		||||
                content_string += gen_md_content(file)
 | 
			
		||||
            content_string += '<small>' + \
 | 
			
		||||
                datetime.fromtimestamp(os.path.getctime(
 | 
			
		||||
                    file)).strftime('%Y-%m-%d') + '</small>'
 | 
			
		||||
            content_string += '</div>'
 | 
			
		||||
    return content_string
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def gen_md_content(path_ex):
 | 
			
		||||
    content_string = ''
 | 
			
		||||
    if path.exists(path_ex):
 | 
			
		||||
        filename = path_ex.split('.', 1)
 | 
			
		||||
        fileend = filename[len(filename) - 1]
 | 
			
		||||
        markdown_file = open(path_ex, "r")
 | 
			
		||||
        depth = 2
 | 
			
		||||
        header = '#'
 | 
			
		||||
        for i in range(depth):
 | 
			
		||||
            header += '#'
 | 
			
		||||
        header += ' '
 | 
			
		||||
        markdown_text = markdown_file.read().replace('# ', header)
 | 
			
		||||
        content_string = markdown.markdown(
 | 
			
		||||
            markdown_text, extensions=["fenced_code", "tables"]
 | 
			
		||||
        )
 | 
			
		||||
    return content_string
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def get_rss_string():
 | 
			
		||||
    path_ex = ENTRY_DIR
 | 
			
		||||
    if path.exists(path_ex):
 | 
			
		||||
        name_list = os.listdir(path_ex)
 | 
			
		||||
        full_list = [os.path.join(path_ex, i) for i in name_list]
 | 
			
		||||
        contents = sorted(full_list, key=os.path.getctime)
 | 
			
		||||
        content_string = ''
 | 
			
		||||
        for file in reversed(contents):
 | 
			
		||||
            filename = pathlib.PurePath(file)
 | 
			
		||||
            title = open(filename).readline().rstrip('\n')
 | 
			
		||||
            text = open(filename).readlines()[1:]
 | 
			
		||||
            filename = filename.name
 | 
			
		||||
            if filename[0] != '.':
 | 
			
		||||
                filename = filename.split('.', 1)[0]
 | 
			
		||||
            content_string += '<item>\n'
 | 
			
		||||
            content_string += '<title>' + title + '</title>\n'
 | 
			
		||||
            content_string += '<guid>' + '/index.html#' + filename + '</guid>\n'
 | 
			
		||||
            content_string += '<pubDate>' + \
 | 
			
		||||
                datetime.fromtimestamp(os.path.getctime(file)).strftime(
 | 
			
		||||
                    '%Y-%m-%d') + '</pubDate>\n'
 | 
			
		||||
            content_string += '<description>'
 | 
			
		||||
            for line in text:
 | 
			
		||||
                content_string += line
 | 
			
		||||
            content_string += '</description>\n'
 | 
			
		||||
            content_string += '</item>\n'
 | 
			
		||||
    return content_string
 | 
			
		||||
@@ -1 +1,2 @@
 | 
			
		||||
Flask==1.1.2
 | 
			
		||||
Markdown==3.1.1
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										10
									
								
								templates/entry/test-entry3.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								templates/entry/test-entry3.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,10 @@
 | 
			
		||||
Test Entry Title 3
 | 
			
		||||
This is a markdown file
 | 
			
		||||
 | 
			
		||||
- list entry
 | 
			
		||||
- list entry
 | 
			
		||||
- list entry
 | 
			
		||||
 | 
			
		||||
# md-header
 | 
			
		||||
 | 
			
		||||
more content
 | 
			
		||||
@@ -1,12 +1,11 @@
 | 
			
		||||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<?xml-stylesheet type="text/css" href="{{ url_for('static', filename='css/rss.css') }}" ?>
 | 
			
		||||
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
 | 
			
		||||
 | 
			
		||||
<channel>
 | 
			
		||||
<title>The Latest from Marten</title>
 | 
			
		||||
<description>Updates from Marten Kante. Throw this in your RSS feeder for instant updates!</description>
 | 
			
		||||
    <title>Blog Title</title>
 | 
			
		||||
    <description>A short description of the blog.</description>
 | 
			
		||||
<language>en-us</language>
 | 
			
		||||
<link>/blog/feed.xml</link>
 | 
			
		||||
<link>localhost:5000/feed.xml</link>
 | 
			
		||||
<atom:link href="/feed.xml" rel="self" type="application/rss+xml" />
 | 
			
		||||
 | 
			
		||||
{% autoescape off %}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user