diff --git a/README.md b/README.md new file mode 100644 index 0000000..1af9de6 --- /dev/null +++ b/README.md @@ -0,0 +1,68 @@ +# Python Flask Wiki + +This is a simple wiki based on Pythons Flask framework. +There is much great wiki software. +Most of them are using some kind of database. +I however just want to put my markdown files in a directory and get a working wiki. + +## Features/To-Dos + +- [ ] Plain text support for blog entries + - [ ] Markdown Files (.md) +- [ ] Entry page +- [ ] Navigation + - [ ] Header + - [ ] Footer +- [ ] Switchable CSS + - [ ] CSS dark-theme + - [ ] CSS light-theme +- [ ] Config file +- [ ] Docker installation + - [ ] Enable variables/environment variables +- [ ] Logo + +## Usage + +### Create entries + +Wiki entries are managed by plain markdown files in the `templates/entry/` directory. +The first line of each document is reserved as the title of the document. + +## Deployment + +### PIP/Python + +- `git clone https://github.com/tiyn/tiyny-blog` +- `cd flaskblog/src` +- edit the `config.py` file according to your needs +- `pip3install -r requirements.txt` - install depenencies +- run `python app.py` +- blog is available on port 5000 + +### Docker + +Make sure you copy an example `config.py` and edit it before running the container. +The `config.py` can be found in the `src` folder. + +#### Volumes + +Set the following volumes with the -v tag. + +| Volume-Name | Container mount | Description | +|-------------|---------------------------|--------------------------------------------------------------| +| config-file | /blog/src/config.py | Config file | +| entries | /blog/src/templates/entry | Directory for blog entries | +| css | /blog/src/static/css | (optional) Directory for css files | +| html | /blog/src/templates | (optional) Directory for templates (entry-volume not needed) | + +#### Ports + +Set the following ports with the -p tag. + +| Container-Port | Recommended outside port | Protocol | Description | +|----------------|--------------------------|----------|-------------| +| 5000 | 80 | TCP | HTTP port | + +#### Example run-command + +`docker run --name wiki --restart unless-stopped -v ./config.py:/wiki/src/config.py -v entries:/wiki/src/templates/entry -p 80:5000 -d tiynger/tiyny-wiki` diff --git a/docker/Dockerfile b/docker/Dockerfile new file mode 100644 index 0000000..2a663fe --- /dev/null +++ b/docker/Dockerfile @@ -0,0 +1,21 @@ +FROM ubuntu + +MAINTAINER Tiyn tiyn@martenkante.eu + +RUN apt-get update + +RUN apt-get install python3 python3-pip git -y + +RUN git clone https://github.com/tiyn/tiyny-wiki /wiki + +WORKDIR /wiki/src + +RUN pip3 install -r requirements.txt + +VOLUME /wiki/src/templates/entry + +EXPOSE 5000 + +ENTRYPOINT [ "python3" ] + +CMD [ "app.py" ] diff --git a/src/app.py b/src/app.py new file mode 100644 index 0000000..5a9538b --- /dev/null +++ b/src/app.py @@ -0,0 +1,22 @@ +from flask import Flask, flash, make_response, render_template, request, redirect, abort + +import content as con_gen +import config + + +app = Flask(__name__) + + +@app.errorhandler(404) +def page_not_found(e): + return render_template('error.html', title=config.TITLE, errorcode='404', style=config.STYLE), 404 + + +@app.route('/') +@app.route('/index.html') +def index(): + return 'ok' + + +if __name__ == '__main__': + app.run(host='0.0.0.0') diff --git a/src/config.py b/src/config.py new file mode 100644 index 0000000..5f251a9 --- /dev/null +++ b/src/config.py @@ -0,0 +1,8 @@ +# Name/title of your blog +TITLE = 'Tiyny-Wiki' + +# URL for your website: e.g. https://domain.tld +WEBSITE = 'localhost:5000' + +# Theme for the blog: dark, light +STYLE = 'dark' diff --git a/src/content.py b/src/content.py new file mode 100644 index 0000000..b5a3320 --- /dev/null +++ b/src/content.py @@ -0,0 +1,10 @@ +import datetime +from datetime import datetime +import markdown +import os +from os import path +import pathlib + +import config + +ENTRY_DIR = 'templates/entry' diff --git a/src/requirements.txt b/src/requirements.txt new file mode 100644 index 0000000..5ab13d0 --- /dev/null +++ b/src/requirements.txt @@ -0,0 +1,2 @@ +Flask==1.1.2 +Markdown==3.1.1 diff --git a/src/static/css/dark.css b/src/static/css/dark.css new file mode 100644 index 0000000..cefc446 --- /dev/null +++ b/src/static/css/dark.css @@ -0,0 +1,72 @@ +@import 'style.css'; + +:root { + --bg0: rgb(29,32,33); + --color0: rgb(220,120,0); + --error: rgb(255,0,0); + --footerbg0: rgb(29,32,33); + --link0: rgb(220, 120, 0); + --link1: rgb(255,255,255); + --menulink0: rgb(220, 120, 0); + --menulink1: rgb(255,255,255); + --menubg0: rgb(29,32,33); + --text0: rgb(235,219,178); + --text1: rgb(220, 120, 0); +} + +a { + color: var(--link0); + transition: var(--transtime); +} + +a:hover { + color: var(--link1); +} + +body { + background: var(--bg0); +} + +footer { + background: var(--footerbg0); + color: var(--text0); +} + +span { + color: var(--text1); +} + +.container { + color: var(--text0); +} + +.container h1, +.container h2 { + color: var(--text1); +} + +.container .flash { + background-color: var(--error); +} + +.hide-menu:hover, +.main-menu a:hover, +.show-menu:hover { + color: var(--menulink1); +} + +.main-menu a { + color: var(--menulink0); +} + +.main-menu-dropdown { + background: var(--menubg0); + color: var(--menulink0); +} + +@media screen and (max-width:800px) { + + .main-menu { + background: var(--menubg0); + } +} diff --git a/src/static/css/light.css b/src/static/css/light.css new file mode 100644 index 0000000..a707ffe --- /dev/null +++ b/src/static/css/light.css @@ -0,0 +1,72 @@ +@import 'style.css'; + +:root { + --bg0: rgb(255,255,255); + --color0: rgb(0,0,120); + --error: rgb(255,0,0); + --footerbg0: rgb(192,192,192); + --link0: rgb(0,0,120); + --link1: rgb(255,255,255); + --menulink0: rgb(0,0,120); + --menulink1: rgb(255,255,255); + --menubg0: rgb(192,192,192); + --text0: rgb(0,0,0); + --text1: rgb(0,0,120); +} + +a { + color: var(--link0); + transition: var(--transtime); +} + +a:hover { + color: var(--link1); +} + +body { + background: var(--bg0); +} + +footer { + background: var(--footerbg0); + color: var(--text0); +} + +span { + color: var(--text1); +} + +.container { + color: var(--text0); +} + +.container h1, +.container h2 { + color: var(--text1); +} + +.container .flash { + background-color: var(--error); +} + +.hide-menu:hover, +.main-menu a:hover, +.show-menu:hover { + color: var(--menulink1); +} + +.main-menu a { + color: var(--menulink0); +} + +.main-menu-dropdown { + background: var(--menubg0); + color: var(--menulink0); +} + +@media screen and (max-width:800px) { + + .main-menu { + background: var(--menubg0); + } +} diff --git a/src/static/css/style.css b/src/static/css/style.css new file mode 100644 index 0000000..4ec6cfe --- /dev/null +++ b/src/static/css/style.css @@ -0,0 +1,153 @@ +:root { + --error: rgb(255,0,0); + --transtime: 0.7s; +} + +* { + margin: 0; + padding: 0; +} + +a { + text-decoration: none; + transition: var(--transtime); +} + +a:hover { + cursor: pointer; +} + +body { + margin: 0; +} + +body, +html { + font-family: sans-serif; + height: 100%; + max-width: 100%; + overflow-x: hidden; +} + +footer { + height: 100px; + padding-top: 20px; +} + +footer .center { + text-align: center; +} + +.container { + min-height: 100%; + padding-bottom: 50px; + padding-left: 10%; + padding-right: 10%; + padding-top: 5%; +} + +.container .flash { + padding: 10px; + width: 400px; +} + +.hide-menu, +.show-menu { + cursor: pointer; + display: none; + font-size: 30px; + transition: var(--transtime); +} + +.important { + font-size: xx-large; + padding-left: 25vw; + padding-right: 25vw; + padding-top: 30vh; + text-align: left; +} + +.important span { + font-weight: bold; +} + +.logo { + height: 80px; + padding-top: 10px; +} + +.main-menu-dropdown span { + float: left; + font-family: monospace; + font-size: 30px; + font-weight: bold; + line-height: 100px; + padding: 0 10px; + text-decoration: none; + text-transform: uppercase; + transition: 0.7s; +} + +.main-menu { + float: right; + font-family: monospace; + font-size: 30px; + font-weight: bold; + line-height: 100px; +} + +.main-menu a { + padding: 0 10px; + text-decoration: none; + text-transform: uppercase; + transition: 0.7s; +} + +.main-menu-dropdown { + height: 100px; + padding: 0 20px; +} + +.show-menu { + float: right; + line-height: 100px; +} + +#main-menu-check { + position: absolute; + visibility: hidden; + z-index: -1111; +} + +@media screen and (max-width:800px) { + .hide-menu { + position: absolute; + right: 40px; + top: 40px; + } + + .hide-menu, + .show-menu { + display: block; + } + + .main-menu { + height: 100vh; + line-height: normal; + padding: 80px 0; + position: fixed; + right: -100%; + text-align: center; + top: 0; + transition: var(--transtime); + width: 100%; + } + .main-menu a { + display: block; + padding: 20px; + } + + #main-menu-check:checked ~ .main-menu { + right: 0; + } +} diff --git a/src/static/images/logo.png b/src/static/images/logo.png new file mode 100644 index 0000000..e69de29 diff --git a/src/templates/entry/test-entry1.md b/src/templates/entry/test-entry1.md new file mode 100644 index 0000000..440dae5 --- /dev/null +++ b/src/templates/entry/test-entry1.md @@ -0,0 +1,10 @@ +Test Entry Title 3 +This is a markdown file + +- list entry +- list entry +- list entry + +# md-header + +more content diff --git a/src/templates/entry/test-entry2.md b/src/templates/entry/test-entry2.md new file mode 100644 index 0000000..440dae5 --- /dev/null +++ b/src/templates/entry/test-entry2.md @@ -0,0 +1,10 @@ +Test Entry Title 3 +This is a markdown file + +- list entry +- list entry +- list entry + +# md-header + +more content diff --git a/src/templates/entry/test-entry3.md b/src/templates/entry/test-entry3.md new file mode 100644 index 0000000..440dae5 --- /dev/null +++ b/src/templates/entry/test-entry3.md @@ -0,0 +1,10 @@ +Test Entry Title 3 +This is a markdown file + +- list entry +- list entry +- list entry + +# md-header + +more content diff --git a/src/templates/error.html b/src/templates/error.html new file mode 100644 index 0000000..84571ce --- /dev/null +++ b/src/templates/error.html @@ -0,0 +1,9 @@ +{% extends "template.html" %} +{% block content %} +