add basic css

This commit is contained in:
Sebastian Hugentobler 2017-01-05 15:55:20 +01:00
parent 014fa45826
commit e6911ff520
6 changed files with 86 additions and 32 deletions

View File

@ -5,42 +5,72 @@
# To the extent possible under law, the author(s) have dedicated all copyright # To the extent possible under law, the author(s) have dedicated all copyright
# and related and neighboring rights to this software to the public domain # and related and neighboring rights to this software to the public domain
# worldwide. This software is distributed without any warranty. # worldwide. This software is distributed without any warranty.
# See http://creativecommons.org/publicdomain/zero/1.0/ for a description of CC0. # See http://creativecommons.org/publicdomain/zero/1.0/ for a description
# of CC0.
import argparse, json, os, re, shutil import argparse
import json
import os
import re
import shutil
from datetime import datetime from datetime import datetime
from jinja2 import Environment, FileSystemLoader from jinja2 import Environment, FileSystemLoader
css = """
body {
margin: 2em auto;
max-width: 50em;
line-height: 1.6;
font-size: 1.1em;
color: #444;
padding: 0 1em;
}
h1,h2,h3 {
line-height: 1.2;
}
"""
def fromunixtime(value): def fromunixtime(value):
return datetime.fromtimestamp(value).strftime('%Y-%m-%d %H:%M:%S') return datetime.fromtimestamp(value).strftime('%Y-%m-%d %H:%M:%S')
def url_replacer(value): def url_replacer(value):
return re.sub('[^a-zA-Z0-9\n\.]', '_', value) return re.sub('[^a-zA-Z0-9\n\.]', '_', value)
def user_replacer(match): def user_replacer(match):
return '[url=../../user/' + url_replacer(match.group(2)) + '.html]' + match.group(2) + '[/url]' return '[url=../../user/' + url_replacer(match.group(2)) + '.html]' + match.group(2) + '[/url]'
def tohtml(value): def tohtml(value):
value = value.replace('{{baseurl}}', 'static') value = value.replace('{{baseurl}}', 'static')
value = value.replace('\n', '<br />') value = value.replace('\n', '<br />')
value = re.sub(r'\[url=\/user\/(.*?)\](.*?)\[\/url\]', user_replacer, value) value = re.sub(r'\[url=\/user\/(.*?)\](.*?)\[\/url\]',
value = re.sub(r'\[url=(.*?)\](.*?)\[/url\]', r'<a href="\1">\2</a>', value) user_replacer, value)
value = re.sub(r'\[url=(.*?)\](.*?)\[/url\]',
r'<a href="\1">\2</a>', value)
value = re.sub(r'\[video\](.*?)\[/video\]', r'<a href="\1">\1</a>', value) value = re.sub(r'\[video\](.*?)\[/video\]', r'<a href="\1">\1</a>', value)
value = re.sub(r'\[colour=(.*?)\](.*?)\[/colour\]', r'<font color="\1">\2</font>', value) value = re.sub(r'\[colour=(.*?)\](.*?)\[/colour\]',
r'<font color="\1">\2</font>', value)
value = re.sub(r'\[b\](.*?)\[/b\]', r'<b>\1</b>', value) value = re.sub(r'\[b\](.*?)\[/b\]', r'<b>\1</b>', value)
value = re.sub(r'\[i\](.*?)\[/i\]', r'<i>\1</i>', value) value = re.sub(r'\[i\](.*?)\[/i\]', r'<i>\1</i>', value)
value = re.sub(r'\[u\](.*?)\[/u\]', r'<u>\1</u>', value) value = re.sub(r'\[u\](.*?)\[/u\]', r'<u>\1</u>', value)
value = re.sub(r'\[img\](.*?)\[/img\]', r'<img src="\1">', value) value = re.sub(r'\[img\](.*?)\[/img\]', r'<img src="\1">', value)
for i in range(25): # ugly hack but works good enough for i in range(25): # ugly hack but works good enough
value = re.sub(r'\[quote=(.+?)\](.+)\[/quote\]', '<fieldset><legend>' + '<a href="../../user/' + url_replacer(r'\1') + '.html">' + r'\1</a></legend>\2</fieldset>', value, count=1) value = re.sub(r'\[quote=(.+?)\](.+)\[/quote\]', '<fieldset><legend>' + '<a href="../../user/' +
url_replacer(r'\1') + '.html">' + r'\1</a></legend>\2</fieldset>', value, count=1)
for i in range(25): # same here, shut up for i in range(25): # same here, shut up
value = re.sub(r'\[quote\](.*?)\[/quote\]', r'<fieldset>\1</fieldset>', value) value = re.sub(r'\[quote\](.*?)\[/quote\]',
r'<fieldset>\1</fieldset>', value)
return value return value
def write_render(rendered, name, outpath): def write_render(rendered, name, outpath):
if not os.path.exists(os.path.join(outpath, 'board', 'thread')): if not os.path.exists(os.path.join(outpath, 'board', 'thread')):
os.makedirs(os.path.join(outpath, 'board', 'thread')) os.makedirs(os.path.join(outpath, 'board', 'thread'))
@ -51,6 +81,7 @@ def write_render(rendered, name, outpath):
with open(os.path.join(outpath, name), 'w') as f: with open(os.path.join(outpath, name), 'w') as f:
f.write(rendered) f.write(rendered)
def find_unregistered_users(data): def find_unregistered_users(data):
unregistered_users = [] unregistered_users = []
for board in data['boards']: for board in data['boards']:
@ -68,27 +99,38 @@ def find_unregistered_users(data):
return unregistered_users return unregistered_users
def find_board_id(board): def find_board_id(board):
return board['link'].split('/')[-2] return board['link'].split('/')[-2]
def render_boards(boards, template_board, template_thread, outpath, title): def render_boards(boards, template_board, template_thread, outpath, title):
for board in boards: for board in boards:
rendered_board = template_board.render(board=board, title=title + ' - ' + board['title']) rendered_board = template_board.render(
write_render(rendered_board, os.path.join('board', find_board_id(board) + '_' + url_replacer(board['title']) + '.html'), outpath) board=board, title=title + ' - ' + board['title'])
write_render(rendered_board, os.path.join('board', find_board_id(
board) + '_' + url_replacer(board['title']) + '.html'), outpath)
for thread in board['threads']: for thread in board['threads']:
rendered_thread = template_thread.render(board=board, thread=thread, title=title + ' - ' + thread['title']) rendered_thread = template_thread.render(
write_render(rendered_thread, os.path.join('board', 'thread', thread['id'] + '_' + url_replacer(thread['title']) + '.html'), outpath) board=board, thread=thread, title=title + ' - ' + thread['title'])
write_render(rendered_thread, os.path.join('board', 'thread', thread[
'id'] + '_' + url_replacer(thread['title']) + '.html'), outpath)
render_boards(board['boards'], template_board,
template_thread, outpath, title)
render_boards(board['boards'], template_board, template_thread, outpath, title)
def render(inputfile, staticpath, outpath, title): def render(inputfile, staticpath, outpath, title):
write_render(css, 'styles.css', outpath)
with open(inputfile) as data_file: with open(inputfile) as data_file:
data = json.load(data_file) data = json.load(data_file)
unregistered_users = find_unregistered_users(data) unregistered_users = find_unregistered_users(data)
for unregistered_user in unregistered_users: for unregistered_user in unregistered_users:
data['users'].append({ 'name': unregistered_user, 'registered': None }) data['users'].append(
{'name': unregistered_user, 'registered': None})
env = Environment(loader=FileSystemLoader('./templates')) env = Environment(loader=FileSystemLoader('./templates'))
env.filters['fromunixtime'] = fromunixtime env.filters['fromunixtime'] = fromunixtime
@ -102,27 +144,39 @@ def render(inputfile, staticpath, outpath, title):
template_board = env.get_template('board.html.j2') template_board = env.get_template('board.html.j2')
template_thread = env.get_template('thread.html.j2') template_thread = env.get_template('thread.html.j2')
rendered_users = template_users.render(users=data['users'], title=title + ' - Users') rendered_users = template_users.render(
rendered_boards = template_boards.render(boards=data['boards'], title=title + ' - Boards') users=data['users'], title=title + ' - Users')
rendered_boards = template_boards.render(
boards=data['boards'], title=title + ' - Boards')
write_render(rendered_users, 'users.html', outpath) write_render(rendered_users, 'users.html', outpath)
write_render(rendered_boards, 'boards.html', outpath) write_render(rendered_boards, 'boards.html', outpath)
shutil.rmtree(os.path.join(outpath, 'board', 'thread', 'static'), ignore_errors=True) shutil.rmtree(os.path.join(outpath, 'board',
shutil.copytree(staticpath, os.path.join(outpath, 'board', 'thread', 'static')) 'thread', 'static'), ignore_errors=True)
shutil.copytree(staticpath, os.path.join(
outpath, 'board', 'thread', 'static'))
for user in data['users']: for user in data['users']:
rendered_user = template_user.render(user=user, title=title + ' - ' + user['name']) rendered_user = template_user.render(
write_render(rendered_user, os.path.join('user', url_replacer(user['name']) + '.html'), outpath) user=user, title=title + ' - ' + user['name'])
write_render(rendered_user, os.path.join(
'user', url_replacer(user['name']) + '.html'), outpath)
render_boards(data['boards'], template_board, template_thread, outpath, title) render_boards(data['boards'], template_board,
template_thread, outpath, title)
if __name__ == "__main__": if __name__ == "__main__":
parser = argparse.ArgumentParser(description='build a static website out of a proboard json dump') parser = argparse.ArgumentParser(
parser.add_argument('--data', default='board.json', help='board data (json file)') description='build a static website out of a proboard json dump')
parser.add_argument('--static', default='static', help='path to the static files (images, attachments)') parser.add_argument('--data', default='board.json',
parser.add_argument('--out', default='rendered', help='path where the website gets rendered to') help='board data (json file)')
parser.add_argument('--title', default='Proboard', help='title for your pages') parser.add_argument('--static', default='static',
help='path to the static files (images, attachments)')
parser.add_argument('--out', default='rendered',
help='path where the website gets rendered to')
parser.add_argument('--title', default='Proboard',
help='title for your pages')
args = parser.parse_args() args = parser.parse_args()

View File

@ -3,7 +3,7 @@
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width"> <meta name="viewport" content="width=device-width">
<link href="thread/static/styles.css" rel="stylesheet" type="text/css" /> <link href="/styles.css" rel="stylesheet" type="text/css" />
<title>{{ title }}</title> <title>{{ title }}</title>
</head> </head>
<body> <body>

View File

@ -3,7 +3,7 @@
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width"> <meta name="viewport" content="width=device-width">
<link href="board/thread/static/styles.css" rel="stylesheet" type="text/css" /> <link href="/styles.css" rel="stylesheet" type="text/css" />
<title>{{ title }}</title> <title>{{ title }}</title>
</head> </head>
<body> <body>

View File

@ -3,7 +3,7 @@
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width"> <meta name="viewport" content="width=device-width">
<link href="static/styles.css" rel="stylesheet" type="text/css" /> <link href="/styles.css" rel="stylesheet" type="text/css" />
<title>{{ title }}</title> <title>{{ title }}</title>
</head> </head>
<body> <body>

View File

@ -3,7 +3,7 @@
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width"> <meta name="viewport" content="width=device-width">
<link href="../board/thread/static/styles.css" rel="stylesheet" type="text/css" /> <link href="/styles.css" rel="stylesheet" type="text/css" />
<title>{{ title }}</title> <title>{{ title }}</title>
</head> </head>
<body> <body>

View File

@ -3,7 +3,7 @@
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width"> <meta name="viewport" content="width=device-width">
<link href="board/thread/static/styles.css" rel="stylesheet" type="text/css" /> <link href="/styles.css" rel="stylesheet" type="text/css" />
<title>{{ title }}</title> <title>{{ title }}</title>
</head> </head>
<body> <body>