Reworking of projects page
This commit is contained in:
@@ -412,7 +412,7 @@ LogLevel warn
|
||||
</IfModule>
|
||||
|
||||
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript
|
||||
DocumentRoot /var/www/jc/static
|
||||
# DocumentRoot /var/www/jc/
|
||||
WSGIErrorOverride On
|
||||
ErrorDocument 400 /error/400
|
||||
ErrorDocument 403 /error/403
|
||||
@@ -426,7 +426,7 @@ WSGISocketPrefix /var/run/wsgi
|
||||
|
||||
WSGIDaemonProcess jc-wsgi user=www-data group=www-data threads=5
|
||||
WSGIProcessGroup jc-wsgi
|
||||
WSGIScriptAlias /projects /var/www/jc/projects.wsgi
|
||||
WSGIScriptAlias / /var/www/jc/projects.wsgi
|
||||
|
||||
<Directory /var/www/jc>
|
||||
WSGIProcessGroup jc-wsgi
|
||||
|
41
src/index.py
Normal file
41
src/index.py
Normal file
@@ -0,0 +1,41 @@
|
||||
#!/usr/bin/python3
|
||||
|
||||
from flask import Flask, render_template, Response
|
||||
|
||||
app = Flask(__name__)
|
||||
|
||||
import projects
|
||||
|
||||
@app.route('/')
|
||||
def index():
|
||||
print('blah')
|
||||
return render_template('index.html')
|
||||
|
||||
@app.route('/error/<code>')
|
||||
def error(code):
|
||||
error_definitions = {
|
||||
400: 'Bad Request',
|
||||
403: 'Forbidden',
|
||||
404: 'Page Not Found',
|
||||
418: 'I\'m a Teapot',
|
||||
500: 'Internal Server Error',
|
||||
503: 'Service Temporarily Unavailable',
|
||||
505: 'HTTP Version Not Supported'
|
||||
}
|
||||
error_desc = {
|
||||
400: 'Sorry, we didn\'t understand your request.',
|
||||
403: 'Sorry, you aren\'t allowed to view this page.',
|
||||
404: 'Sorry, that page doesn\'t exist.',
|
||||
418: 'I can\'t brew coffee as I am, in fact, a teapot.',
|
||||
500: 'Something went wrong on our end.',
|
||||
503: 'Our website is experiencing some issues and will be back shortly.',
|
||||
505: 'Your browser tried to use a HTTP version we don\'t support. Check it is up to date.'
|
||||
}
|
||||
errorText = f'''
|
||||
<div id='error'>
|
||||
<h2>{code}: {error_definitions.get(int(code))}</h2>
|
||||
<p>{error_desc.get(int(code))}</p>
|
||||
<a href='/'>Click here to return to our homepage</a>
|
||||
</div>
|
||||
'''
|
||||
return render_template('error.html', post=errorText)
|
@@ -7,10 +7,9 @@ from markdown import markdown
|
||||
import frontmatter
|
||||
from glob import glob
|
||||
from datetime import datetime
|
||||
from index import app
|
||||
from bs4 import BeautifulSoup
|
||||
|
||||
|
||||
application = Flask(__name__)
|
||||
app = application
|
||||
md_directory = path.join(path.realpath(path.dirname(__file__)), path.normpath('projects/'))
|
||||
|
||||
@app.context_processor
|
||||
@@ -22,6 +21,13 @@ def processor():
|
||||
return ' '.join(all_text.split()[:200])
|
||||
return dict(get_excerpt=get_excerpt)
|
||||
|
||||
@app.template_filter('category_title')
|
||||
def category_title(category_id: str) -> str:
|
||||
with open(path.join(md_directory, 'categories.json')) as categories_file:
|
||||
categories = json.load(categories_file)
|
||||
|
||||
return categories.get(category_id).get('title', '')
|
||||
|
||||
@app.template_filter('human_date')
|
||||
def human_date(iso_date: str) -> str:
|
||||
try:
|
||||
@@ -38,10 +44,10 @@ def get_all_posts(directory: str) -> list:
|
||||
return [frontmatter.load(x) for x in abs_paths]
|
||||
|
||||
def get_by_meta_key(directory: str, key: str, value: str):
|
||||
return [x for x in get_all_posts(directory) if x.get(key) == value]
|
||||
return [x for x in get_all_posts(directory) if x.get(key) == value or type(x.get(key, [])) is list and value in x.get(key, [])]
|
||||
|
||||
@app.route('/')
|
||||
def index():
|
||||
@app.route('/projects/')
|
||||
def projects():
|
||||
articles_to_return = sorted(
|
||||
get_all_posts(
|
||||
md_directory),
|
||||
@@ -49,50 +55,24 @@ def index():
|
||||
reverse=True
|
||||
)
|
||||
|
||||
return render_template('projects.html', articles=articles_to_return)
|
||||
with open(path.join(md_directory, 'categories.json')) as categories_file:
|
||||
categories = json.load(categories_file)
|
||||
|
||||
@app.route('/error/<code>')
|
||||
def error(code):
|
||||
error_definitions = {
|
||||
400: 'Bad Request',
|
||||
403: 'Forbidden',
|
||||
404: 'Page Not Found',
|
||||
418: 'I\'m a Teapot',
|
||||
500: 'Internal Server Error',
|
||||
503: 'Service Temporarily Unavailable',
|
||||
505: 'HTTP Version Not Supported'
|
||||
}
|
||||
error_desc = {
|
||||
400: 'Sorry, we didn\'t understand your request.',
|
||||
403: 'Sorry, you aren\'t allowed to view this page.',
|
||||
404: 'Sorry, that page doesn\'t exist.',
|
||||
418: 'I can\'t brew coffee as I am, in fact, a teapot.',
|
||||
500: 'Something went wrong on our end.',
|
||||
503: 'Our website is experiencing some issues and will be back shortly.',
|
||||
505: 'Your browser tried to use a HTTP version we don\'t support. Check it is up to date.'
|
||||
}
|
||||
errorText = f'''
|
||||
<div id='error'>
|
||||
<h2>{code}: {error_definitions.get(int(code))}</h2>
|
||||
<p>{error_desc.get(int(code))}</p>
|
||||
<a href='/'>Click here to return to our homepage</a>
|
||||
</div>
|
||||
'''
|
||||
return render_template('error.html', post=errorText)
|
||||
return render_template('projects.html', articles=articles_to_return, all_categories=categories)
|
||||
|
||||
@app.route('/<category>/')
|
||||
@app.route('/projects/category/<category>/')
|
||||
def category(category):
|
||||
with open(path.join(md_directory, 'categories.json')) as categories_file:
|
||||
categories = json.load(categories_file)
|
||||
|
||||
the_category = next((x for x in categories if x.get('id') == category), None)
|
||||
the_category = categories.get(category)
|
||||
|
||||
if the_category is None:
|
||||
return Response(status=404)
|
||||
|
||||
articles_to_return = sorted(
|
||||
get_by_meta_key(
|
||||
md_directory, 'category', category),
|
||||
md_directory, 'categories', category),
|
||||
key=lambda d: d.metadata.get('date'),
|
||||
reverse=True
|
||||
)
|
||||
@@ -100,11 +80,16 @@ def category(category):
|
||||
return render_template('projects.html', articles=articles_to_return,
|
||||
title=the_category['title'],
|
||||
description=the_category['long_description'],
|
||||
pageName=f'{the_category["title"]} -')
|
||||
page_title=f'{the_category["title"]} - ',
|
||||
all_categories=categories,
|
||||
current_category=category)
|
||||
|
||||
@app.route('/<category>/<article>')
|
||||
def article(category, article):
|
||||
articles = [x for x in get_by_meta_key(md_directory, 'id', article) if x.metadata.get('category') == category]
|
||||
@app.route('/projects/<article>')
|
||||
def article(article):
|
||||
articles = get_by_meta_key(md_directory, 'id', article)
|
||||
print(articles)
|
||||
for i in articles:
|
||||
print(i.metadata)
|
||||
|
||||
if len(articles) == 0:
|
||||
return Response(status=404)
|
||||
@@ -113,8 +98,8 @@ def article(category, article):
|
||||
|
||||
the_article = articles[0]
|
||||
return render_template('article.html', post=markdown(the_article.content), metadata=the_article.metadata,
|
||||
pageName=f'{the_article.metadata["title"]} - {the_article.metadata["author"]} -')
|
||||
pageName=f'{the_article.metadata["title"]} - ')
|
||||
|
||||
@app.route('/image/<image>')
|
||||
@app.route('/projects/image/<image>')
|
||||
def image(image):
|
||||
return send_from_directory(path.join(md_directory, 'images'), image)
|
||||
|
@@ -3,4 +3,4 @@
|
||||
import sys
|
||||
sys.path.append('/var/www/jc')
|
||||
|
||||
from projects import application
|
||||
from index import app as application
|
||||
|
12
src/projects/categories.json
Normal file
12
src/projects/categories.json
Normal file
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"software": {
|
||||
"title": "Software",
|
||||
"description": "Projects involving software of some kind",
|
||||
"long_description": "Projects involving software of some kind"
|
||||
},
|
||||
"racing": {
|
||||
"title": "Racing",
|
||||
"description": "Projects to do with motorsport",
|
||||
"long_description": "Projects to do with motorsport"
|
||||
}
|
||||
}
|
26
src/projects/test_01.md
Normal file
26
src/projects/test_01.md
Normal file
@@ -0,0 +1,26 @@
|
||||
---
|
||||
id: software_and_racing
|
||||
title: "Software and Racing"
|
||||
date: 2000-07-13
|
||||
categories: [software, racing]
|
||||
---
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas eu tortor pellentesque, hendrerit elit feugiat, lobortis urna. Donec porttitor urna vitae augue scelerisque, sit amet maximus quam blandit. Quisque et diam ut ante tempus placerat. Ut pretium urna sollicitudin egestas mattis. Praesent eu arcu et ex maximus posuere pharetra bibendum dolor. Pellentesque id bibendum quam. Curabitur sapien tellus, vulputate a diam vitae, ultrices lobortis elit. Praesent sodales arcu magna, et commodo mi euismod in.
|
||||
|
||||
Vivamus pellentesque molestie arcu, a varius risus cursus eget. Donec cursus massa quis pulvinar tincidunt. Fusce dignissim mi ac ultrices sagittis. Vestibulum aliquet nulla vel ex mattis porta. Praesent vitae lacus eu tortor tempor venenatis. Nam at ipsum in magna tristique tincidunt. Aliquam feugiat pharetra bibendum. Praesent vitae erat sed lorem congue scelerisque vel ut velit. Phasellus quis sapien ultricies, blandit neque nec, sollicitudin dolor. Aliquam ultricies iaculis dapibus.
|
||||
|
||||
Quisque quis auctor tortor, tincidunt bibendum erat. Curabitur justo nulla, ultrices at velit vel, interdum iaculis libero. Vestibulum semper urna nibh, vitae iaculis dui mollis a. Quisque eget placerat massa. Vivamus vel nisl sit amet nibh ultricies egestas hendrerit a est. In finibus lacinia sapien. Etiam id erat dolor.
|
||||
|
||||
Suspendisse tincidunt leo placerat, elementum nunc id, sagittis lorem. Praesent lectus mi, facilisis sed mauris et, imperdiet sagittis massa. Proin ultrices eros vel elit convallis, ut fermentum neque porta. Praesent sed ullamcorper leo, id dapibus mi. Pellentesque vitae mauris dolor. Suspendisse elementum, odio id tincidunt accumsan, ipsum sem fringilla metus, quis ultrices est est ac dolor. Integer tempus, sem rhoncus consectetur tristique, metus purus sodales leo, eget facilisis quam nunc sit amet neque. Nulla luctus mattis tempor. Sed varius sapien ac erat scelerisque sagittis. Ut augue nunc, vulputate vitae elementum eget, ornare vitae sem. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Maecenas magna neque, efficitur sed pharetra egestas, convallis vel augue. Quisque eu lacinia neque, id ultrices felis. Nunc semper vulputate metus, eget volutpat lectus volutpat eu.
|
||||
|
||||
Praesent mauris sem, eleifend nec ultrices ut, pretium sed massa. Duis faucibus tortor ut dignissim sagittis. Sed odio massa, vulputate eu urna sit amet, tristique fringilla enim. Cras et augue sit amet tortor facilisis pharetra. Fusce eget malesuada sapien. Praesent ultrices sed augue id ornare. Donec eu vestibulum lectus. Ut sed tempor mi. Mauris cursus venenatis fermentum.
|
||||
|
||||
Nunc vulputate auctor enim ut gravida. Proin a suscipit eros. Nunc convallis auctor purus, ut tincidunt lectus euismod et. Duis mattis id leo ac lacinia. Nam ullamcorper metus ullamcorper, commodo ipsum a, rutrum massa. Nam mattis maximus dolor a sagittis. Pellentesque tincidunt ligula nec tortor bibendum, et lobortis massa volutpat. Nulla faucibus aliquet orci, id semper arcu. Mauris facilisis tortor congue, hendrerit risus et, imperdiet ligula. Duis a ligula tempor quam volutpat commodo eu nec nisl. Cras feugiat ornare nisl vel aliquam.
|
||||
|
||||
Quisque consectetur erat lorem, id condimentum mauris vehicula id. Nullam tempus bibendum arcu et tristique. Sed consequat, justo a efficitur feugiat, sapien diam pharetra eros, id commodo augue leo rutrum lectus. Duis aliquet mauris sed odio dapibus, a elementum ante tincidunt. Nulla dictum ultrices posuere. Praesent massa augue, placerat eleifend imperdiet vitae, consectetur non odio. Sed eget pulvinar est. Aenean id varius lorem.
|
||||
|
||||
Vivamus eleifend tellus nec blandit volutpat. Maecenas tempor lorem vel nunc fringilla, eget commodo ipsum lacinia. Morbi elit diam, tincidunt sit amet risus et, eleifend convallis quam. Nunc tempor rhoncus posuere. Pellentesque odio turpis, efficitur eget felis sed, fringilla gravida magna. Interdum et malesuada fames ac ante ipsum primis in faucibus. Integer ipsum neque, varius ac tempor at, dapibus vel tortor. Sed a augue ultricies leo eleifend cursus nec a augue. Donec et elit velit. Mauris sem magna, ultrices sed pulvinar semper, vehicula hendrerit velit. Donec et lorem erat. Sed lobortis ligula vel massa malesuada blandit nec id mauris.
|
||||
|
||||
Ut ullamcorper erat felis, vitae faucibus lorem tempus non. Donec ac nunc dapibus, vehicula turpis non, tincidunt velit. Interdum et malesuada fames ac ante ipsum primis in faucibus. Vivamus quam nibh, feugiat non nunc eget, congue iaculis ex. In vulputate ligula tempus, rhoncus mi ac, scelerisque nibh. Donec nec libero vitae purus blandit egestas. Sed vitae metus ut massa posuere sollicitudin. Ut iaculis eu sem at accumsan. Ut sed tellus pretium, tincidunt dolor sed, pretium quam. Donec ultrices, risus ornare convallis facilisis, augue nibh maximus lacus, vel laoreet ligula diam sit amet tellus. Vestibulum eget nibh nec orci maximus volutpat quis vitae justo. Pellentesque vehicula, ante varius condimentum suscipit, ligula est placerat diam, elementum cursus orci tortor et nisl. Nulla ac rutrum nisi. Suspendisse nisi ipsum, bibendum nec sem quis, fermentum tincidunt libero. Ut ligula dolor, tincidunt a eros rhoncus, rhoncus faucibus risus. Sed tincidunt risus quis lorem mattis mattis.
|
||||
|
||||
Pellentesque elementum, metus id interdum lobortis, libero tortor consequat turpis, quis aliquam nisi ligula a magna. Aenean nec aliquet lorem. Aliquam feugiat viverra tellus ut congue. Morbi a fermentum neque. Nulla facilisi. Maecenas consectetur tincidunt diam, non aliquet lorem tempor vestibulum. Morbi cursus, tellus eget congue ultricies, dolor dui porta ipsum, vel tincidunt nisi eros sed dolor. Fusce ut metus semper, malesuada erat a, tempus diam. Quisque ut pellentesque lorem, ut sodales augue. Proin bibendum consectetur ex, vitae lobortis erat sagittis nec.
|
26
src/projects/test_02.md
Normal file
26
src/projects/test_02.md
Normal file
@@ -0,0 +1,26 @@
|
||||
---
|
||||
id: racing
|
||||
title: "Racing"
|
||||
date: 2000-07-14
|
||||
categories: [racing]
|
||||
---
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas eu tortor pellentesque, hendrerit elit feugiat, lobortis urna. Donec porttitor urna vitae augue scelerisque, sit amet maximus quam blandit. Quisque et diam ut ante tempus placerat. Ut pretium urna sollicitudin egestas mattis. Praesent eu arcu et ex maximus posuere pharetra bibendum dolor. Pellentesque id bibendum quam. Curabitur sapien tellus, vulputate a diam vitae, ultrices lobortis elit. Praesent sodales arcu magna, et commodo mi euismod in.
|
||||
|
||||
Vivamus pellentesque molestie arcu, a varius risus cursus eget. Donec cursus massa quis pulvinar tincidunt. Fusce dignissim mi ac ultrices sagittis. Vestibulum aliquet nulla vel ex mattis porta. Praesent vitae lacus eu tortor tempor venenatis. Nam at ipsum in magna tristique tincidunt. Aliquam feugiat pharetra bibendum. Praesent vitae erat sed lorem congue scelerisque vel ut velit. Phasellus quis sapien ultricies, blandit neque nec, sollicitudin dolor. Aliquam ultricies iaculis dapibus.
|
||||
|
||||
Quisque quis auctor tortor, tincidunt bibendum erat. Curabitur justo nulla, ultrices at velit vel, interdum iaculis libero. Vestibulum semper urna nibh, vitae iaculis dui mollis a. Quisque eget placerat massa. Vivamus vel nisl sit amet nibh ultricies egestas hendrerit a est. In finibus lacinia sapien. Etiam id erat dolor.
|
||||
|
||||
Suspendisse tincidunt leo placerat, elementum nunc id, sagittis lorem. Praesent lectus mi, facilisis sed mauris et, imperdiet sagittis massa. Proin ultrices eros vel elit convallis, ut fermentum neque porta. Praesent sed ullamcorper leo, id dapibus mi. Pellentesque vitae mauris dolor. Suspendisse elementum, odio id tincidunt accumsan, ipsum sem fringilla metus, quis ultrices est est ac dolor. Integer tempus, sem rhoncus consectetur tristique, metus purus sodales leo, eget facilisis quam nunc sit amet neque. Nulla luctus mattis tempor. Sed varius sapien ac erat scelerisque sagittis. Ut augue nunc, vulputate vitae elementum eget, ornare vitae sem. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Maecenas magna neque, efficitur sed pharetra egestas, convallis vel augue. Quisque eu lacinia neque, id ultrices felis. Nunc semper vulputate metus, eget volutpat lectus volutpat eu.
|
||||
|
||||
Praesent mauris sem, eleifend nec ultrices ut, pretium sed massa. Duis faucibus tortor ut dignissim sagittis. Sed odio massa, vulputate eu urna sit amet, tristique fringilla enim. Cras et augue sit amet tortor facilisis pharetra. Fusce eget malesuada sapien. Praesent ultrices sed augue id ornare. Donec eu vestibulum lectus. Ut sed tempor mi. Mauris cursus venenatis fermentum.
|
||||
|
||||
Nunc vulputate auctor enim ut gravida. Proin a suscipit eros. Nunc convallis auctor purus, ut tincidunt lectus euismod et. Duis mattis id leo ac lacinia. Nam ullamcorper metus ullamcorper, commodo ipsum a, rutrum massa. Nam mattis maximus dolor a sagittis. Pellentesque tincidunt ligula nec tortor bibendum, et lobortis massa volutpat. Nulla faucibus aliquet orci, id semper arcu. Mauris facilisis tortor congue, hendrerit risus et, imperdiet ligula. Duis a ligula tempor quam volutpat commodo eu nec nisl. Cras feugiat ornare nisl vel aliquam.
|
||||
|
||||
Quisque consectetur erat lorem, id condimentum mauris vehicula id. Nullam tempus bibendum arcu et tristique. Sed consequat, justo a efficitur feugiat, sapien diam pharetra eros, id commodo augue leo rutrum lectus. Duis aliquet mauris sed odio dapibus, a elementum ante tincidunt. Nulla dictum ultrices posuere. Praesent massa augue, placerat eleifend imperdiet vitae, consectetur non odio. Sed eget pulvinar est. Aenean id varius lorem.
|
||||
|
||||
Vivamus eleifend tellus nec blandit volutpat. Maecenas tempor lorem vel nunc fringilla, eget commodo ipsum lacinia. Morbi elit diam, tincidunt sit amet risus et, eleifend convallis quam. Nunc tempor rhoncus posuere. Pellentesque odio turpis, efficitur eget felis sed, fringilla gravida magna. Interdum et malesuada fames ac ante ipsum primis in faucibus. Integer ipsum neque, varius ac tempor at, dapibus vel tortor. Sed a augue ultricies leo eleifend cursus nec a augue. Donec et elit velit. Mauris sem magna, ultrices sed pulvinar semper, vehicula hendrerit velit. Donec et lorem erat. Sed lobortis ligula vel massa malesuada blandit nec id mauris.
|
||||
|
||||
Ut ullamcorper erat felis, vitae faucibus lorem tempus non. Donec ac nunc dapibus, vehicula turpis non, tincidunt velit. Interdum et malesuada fames ac ante ipsum primis in faucibus. Vivamus quam nibh, feugiat non nunc eget, congue iaculis ex. In vulputate ligula tempus, rhoncus mi ac, scelerisque nibh. Donec nec libero vitae purus blandit egestas. Sed vitae metus ut massa posuere sollicitudin. Ut iaculis eu sem at accumsan. Ut sed tellus pretium, tincidunt dolor sed, pretium quam. Donec ultrices, risus ornare convallis facilisis, augue nibh maximus lacus, vel laoreet ligula diam sit amet tellus. Vestibulum eget nibh nec orci maximus volutpat quis vitae justo. Pellentesque vehicula, ante varius condimentum suscipit, ligula est placerat diam, elementum cursus orci tortor et nisl. Nulla ac rutrum nisi. Suspendisse nisi ipsum, bibendum nec sem quis, fermentum tincidunt libero. Ut ligula dolor, tincidunt a eros rhoncus, rhoncus faucibus risus. Sed tincidunt risus quis lorem mattis mattis.
|
||||
|
||||
Pellentesque elementum, metus id interdum lobortis, libero tortor consequat turpis, quis aliquam nisi ligula a magna. Aenean nec aliquet lorem. Aliquam feugiat viverra tellus ut congue. Morbi a fermentum neque. Nulla facilisi. Maecenas consectetur tincidunt diam, non aliquet lorem tempor vestibulum. Morbi cursus, tellus eget congue ultricies, dolor dui porta ipsum, vel tincidunt nisi eros sed dolor. Fusce ut metus semper, malesuada erat a, tempus diam. Quisque ut pellentesque lorem, ut sodales augue. Proin bibendum consectetur ex, vitae lobortis erat sagittis nec.
|
26
src/projects/test_03.md
Normal file
26
src/projects/test_03.md
Normal file
@@ -0,0 +1,26 @@
|
||||
---
|
||||
id: software
|
||||
title: "Software"
|
||||
date: 2000-07-15
|
||||
categories: [software]
|
||||
---
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas eu tortor pellentesque, hendrerit elit feugiat, lobortis urna. Donec porttitor urna vitae augue scelerisque, sit amet maximus quam blandit. Quisque et diam ut ante tempus placerat. Ut pretium urna sollicitudin egestas mattis. Praesent eu arcu et ex maximus posuere pharetra bibendum dolor. Pellentesque id bibendum quam. Curabitur sapien tellus, vulputate a diam vitae, ultrices lobortis elit. Praesent sodales arcu magna, et commodo mi euismod in.
|
||||
|
||||
Vivamus pellentesque molestie arcu, a varius risus cursus eget. Donec cursus massa quis pulvinar tincidunt. Fusce dignissim mi ac ultrices sagittis. Vestibulum aliquet nulla vel ex mattis porta. Praesent vitae lacus eu tortor tempor venenatis. Nam at ipsum in magna tristique tincidunt. Aliquam feugiat pharetra bibendum. Praesent vitae erat sed lorem congue scelerisque vel ut velit. Phasellus quis sapien ultricies, blandit neque nec, sollicitudin dolor. Aliquam ultricies iaculis dapibus.
|
||||
|
||||
Quisque quis auctor tortor, tincidunt bibendum erat. Curabitur justo nulla, ultrices at velit vel, interdum iaculis libero. Vestibulum semper urna nibh, vitae iaculis dui mollis a. Quisque eget placerat massa. Vivamus vel nisl sit amet nibh ultricies egestas hendrerit a est. In finibus lacinia sapien. Etiam id erat dolor.
|
||||
|
||||
Suspendisse tincidunt leo placerat, elementum nunc id, sagittis lorem. Praesent lectus mi, facilisis sed mauris et, imperdiet sagittis massa. Proin ultrices eros vel elit convallis, ut fermentum neque porta. Praesent sed ullamcorper leo, id dapibus mi. Pellentesque vitae mauris dolor. Suspendisse elementum, odio id tincidunt accumsan, ipsum sem fringilla metus, quis ultrices est est ac dolor. Integer tempus, sem rhoncus consectetur tristique, metus purus sodales leo, eget facilisis quam nunc sit amet neque. Nulla luctus mattis tempor. Sed varius sapien ac erat scelerisque sagittis. Ut augue nunc, vulputate vitae elementum eget, ornare vitae sem. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Maecenas magna neque, efficitur sed pharetra egestas, convallis vel augue. Quisque eu lacinia neque, id ultrices felis. Nunc semper vulputate metus, eget volutpat lectus volutpat eu.
|
||||
|
||||
Praesent mauris sem, eleifend nec ultrices ut, pretium sed massa. Duis faucibus tortor ut dignissim sagittis. Sed odio massa, vulputate eu urna sit amet, tristique fringilla enim. Cras et augue sit amet tortor facilisis pharetra. Fusce eget malesuada sapien. Praesent ultrices sed augue id ornare. Donec eu vestibulum lectus. Ut sed tempor mi. Mauris cursus venenatis fermentum.
|
||||
|
||||
Nunc vulputate auctor enim ut gravida. Proin a suscipit eros. Nunc convallis auctor purus, ut tincidunt lectus euismod et. Duis mattis id leo ac lacinia. Nam ullamcorper metus ullamcorper, commodo ipsum a, rutrum massa. Nam mattis maximus dolor a sagittis. Pellentesque tincidunt ligula nec tortor bibendum, et lobortis massa volutpat. Nulla faucibus aliquet orci, id semper arcu. Mauris facilisis tortor congue, hendrerit risus et, imperdiet ligula. Duis a ligula tempor quam volutpat commodo eu nec nisl. Cras feugiat ornare nisl vel aliquam.
|
||||
|
||||
Quisque consectetur erat lorem, id condimentum mauris vehicula id. Nullam tempus bibendum arcu et tristique. Sed consequat, justo a efficitur feugiat, sapien diam pharetra eros, id commodo augue leo rutrum lectus. Duis aliquet mauris sed odio dapibus, a elementum ante tincidunt. Nulla dictum ultrices posuere. Praesent massa augue, placerat eleifend imperdiet vitae, consectetur non odio. Sed eget pulvinar est. Aenean id varius lorem.
|
||||
|
||||
Vivamus eleifend tellus nec blandit volutpat. Maecenas tempor lorem vel nunc fringilla, eget commodo ipsum lacinia. Morbi elit diam, tincidunt sit amet risus et, eleifend convallis quam. Nunc tempor rhoncus posuere. Pellentesque odio turpis, efficitur eget felis sed, fringilla gravida magna. Interdum et malesuada fames ac ante ipsum primis in faucibus. Integer ipsum neque, varius ac tempor at, dapibus vel tortor. Sed a augue ultricies leo eleifend cursus nec a augue. Donec et elit velit. Mauris sem magna, ultrices sed pulvinar semper, vehicula hendrerit velit. Donec et lorem erat. Sed lobortis ligula vel massa malesuada blandit nec id mauris.
|
||||
|
||||
Ut ullamcorper erat felis, vitae faucibus lorem tempus non. Donec ac nunc dapibus, vehicula turpis non, tincidunt velit. Interdum et malesuada fames ac ante ipsum primis in faucibus. Vivamus quam nibh, feugiat non nunc eget, congue iaculis ex. In vulputate ligula tempus, rhoncus mi ac, scelerisque nibh. Donec nec libero vitae purus blandit egestas. Sed vitae metus ut massa posuere sollicitudin. Ut iaculis eu sem at accumsan. Ut sed tellus pretium, tincidunt dolor sed, pretium quam. Donec ultrices, risus ornare convallis facilisis, augue nibh maximus lacus, vel laoreet ligula diam sit amet tellus. Vestibulum eget nibh nec orci maximus volutpat quis vitae justo. Pellentesque vehicula, ante varius condimentum suscipit, ligula est placerat diam, elementum cursus orci tortor et nisl. Nulla ac rutrum nisi. Suspendisse nisi ipsum, bibendum nec sem quis, fermentum tincidunt libero. Ut ligula dolor, tincidunt a eros rhoncus, rhoncus faucibus risus. Sed tincidunt risus quis lorem mattis mattis.
|
||||
|
||||
Pellentesque elementum, metus id interdum lobortis, libero tortor consequat turpis, quis aliquam nisi ligula a magna. Aenean nec aliquet lorem. Aliquam feugiat viverra tellus ut congue. Morbi a fermentum neque. Nulla facilisi. Maecenas consectetur tincidunt diam, non aliquet lorem tempor vestibulum. Morbi cursus, tellus eget congue ultricies, dolor dui porta ipsum, vel tincidunt nisi eros sed dolor. Fusce ut metus semper, malesuada erat a, tempus diam. Quisque ut pellentesque lorem, ut sodales augue. Proin bibendum consectetur ex, vitae lobortis erat sagittis nec.
|
11
src/static/js/filter_projects.js
Normal file
11
src/static/js/filter_projects.js
Normal file
@@ -0,0 +1,11 @@
|
||||
window.onload = function () {
|
||||
var project_filter = document.getElementById("filter_category");
|
||||
project_filter.onchange = function () {
|
||||
if (project_filter.value == 'all') {
|
||||
window.location.href = '/projects';
|
||||
}
|
||||
else {
|
||||
window.location.href = '/projects/category/' + project_filter.value;
|
||||
}
|
||||
}
|
||||
}
|
@@ -47,6 +47,5 @@
|
||||
.project{
|
||||
width: 20vw;
|
||||
height: 25vw;
|
||||
margin: 10px;
|
||||
}
|
||||
}
|
@@ -2,9 +2,14 @@ body{
|
||||
margin: 0;
|
||||
color: #e5e5e5;
|
||||
font-family: "Noto Sans", sans-serif;
|
||||
background-color: rgba(23, 22, 20, 1);
|
||||
}
|
||||
|
||||
h1, h2{
|
||||
main{
|
||||
padding: 0 10px 0 10px;
|
||||
}
|
||||
|
||||
h1, h2, h3{
|
||||
font-family: "Orbitron", sans-serif;
|
||||
font-optical-sizing: auto;
|
||||
font-weight: 500;
|
||||
@@ -30,6 +35,10 @@ footer{
|
||||
margin: 0 auto 0 auto;
|
||||
}
|
||||
|
||||
#logo>a{
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
footer h2, section h2{
|
||||
margin: 0;
|
||||
}
|
||||
@@ -100,5 +109,6 @@ a{
|
||||
|
||||
.project{
|
||||
width: 80vw;
|
||||
border: 2px solid rgba(23, 22, 20, 1);
|
||||
border: 2px solid #e5e5e5;
|
||||
margin: 10px;
|
||||
}
|
@@ -1,2 +1,10 @@
|
||||
{% include 'header.html' %}
|
||||
<main>
|
||||
<section id="tech-article">
|
||||
<h1>{{ metadata.title}} </h1>
|
||||
<p>{{ metadata.date | human_date }}</p>
|
||||
<hr />
|
||||
{{post|safe}}
|
||||
</section>
|
||||
</main>
|
||||
{% include 'footer.html' %}
|
@@ -1,5 +1,5 @@
|
||||
{% include 'header.html' %}
|
||||
<section id="post">
|
||||
<section id="error">
|
||||
{{ post | safe }}
|
||||
</section>
|
||||
{% include 'footer.html' %}
|
@@ -2,18 +2,19 @@
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Jake Charman</title>
|
||||
<title>{{ page_title }}Jake Charman</title>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Orbitron:wght@400..900&family=Tourney:ital,wght@0,100..900;1,100..900&display=swap" rel="stylesheet">
|
||||
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans:ital,wght@0,100..900;1,100..900&family=Orbitron:wght@400..900&family=Tourney:ital,wght@0,100..900;1,100..900&display=swap" rel="stylesheet">
|
||||
<link rel="stylesheet" href="/style/mobile.css" />
|
||||
<link rel="stylesheet" href="/style/desktop.css" />
|
||||
<link rel="stylesheet" href="/fonts/fontawesome/css/all.min.css" />
|
||||
<link rel="stylesheet" href="/static/style/mobile.css" />
|
||||
<link rel="stylesheet" href="/static/style/desktop.css" />
|
||||
<link rel="stylesheet" href="/static/fonts/fontawesome/css/all.min.css" />
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<script src="/static/js/filter_projects.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<header>
|
||||
<div id="logo">
|
||||
<h1>Jake Charman</h1>
|
||||
<a href='/'><h1>Jake Charman</h1></a>
|
||||
</div>
|
||||
</header>
|
||||
|
@@ -1,22 +1,4 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Jake Charman</title>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Orbitron:wght@400..900&family=Tourney:ital,wght@0,100..900;1,100..900&display=swap" rel="stylesheet">
|
||||
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans:ital,wght@0,100..900;1,100..900&family=Orbitron:wght@400..900&family=Tourney:ital,wght@0,100..900;1,100..900&display=swap" rel="stylesheet">
|
||||
<link rel="stylesheet" href="style/mobile.css" />
|
||||
<link rel="stylesheet" href="style/desktop.css" />
|
||||
<link rel="stylesheet" href="fonts/fontawesome/css/all.min.css" />
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
</head>
|
||||
<body>
|
||||
<header>
|
||||
<div id="logo">
|
||||
<h1>Jake Charman</h1>
|
||||
</div>
|
||||
</header>
|
||||
{% include 'header.html' %}
|
||||
<main>
|
||||
<section id="technology">
|
||||
<div class="gradient gradient-left">
|
||||
@@ -60,8 +42,4 @@
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
<footer>
|
||||
<p>© 2024 Jake Charman. This site uses cookies.</p>
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
||||
{% include 'footer.html' %}
|
@@ -1,17 +1,30 @@
|
||||
{% include 'header.html' %}
|
||||
<main>
|
||||
<h2>Projects</h2>
|
||||
<p>A selection of projects I've worked on.</p>
|
||||
<nav id="filter">
|
||||
<label for="filter_category">Filter:</label>
|
||||
<select id="filter_category" name="filter_category">
|
||||
<option value="all">All Categories</option>
|
||||
{% for category in all_categories %}
|
||||
<option {{ 'selected' if current_category == category }} value="{{ category }}">{{all_categories.get(category).get('title')}}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</nav>
|
||||
<h2>{{ title }}</h2>
|
||||
<p>{{ description }}</p>
|
||||
<section id="projects">
|
||||
{% for row in articles %}
|
||||
<div class="project">
|
||||
<img src="{{ row.image }}">
|
||||
{% if row.get('link') is not none %}
|
||||
<a href="{{ row.link }}"><h2>{{ row.title }}</h2></a>
|
||||
<a href="{{ row.link }}"><h3>{{ row.title }}</h3></a>
|
||||
{% else %}
|
||||
<a href="./{{ row.get('categpry', '.') }}/{{ row.id }}"><h2>{{ row.title }}</h2></a>
|
||||
<a href="/projects/{{ row.id }}"><h3>{{ row.title }}</h3></a>
|
||||
{% endif %}
|
||||
<p class="article-description">{{ row.description }}</p>
|
||||
<p class="article-date">{{ row.date | human_date }}</p>
|
||||
{% for category in row.categories %}
|
||||
<a class="article-category" href="/projects/category/{{ category }}">{{ category | category_title }} </a>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endfor %}
|
||||
</section>
|
||||
|
Reference in New Issue
Block a user