Skip to content

Commit afc8aee

Browse files
authored
feat!: Refactor to static frozen-flask site
Rework of Flask to work support static site.
2 parents 2435479 + ef9a87b commit afc8aee

File tree

9 files changed

+80
-30
lines changed

9 files changed

+80
-30
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,3 +34,4 @@ songbook-pdf.log
3434
songbook-py.log
3535
so.py
3636
.vscode/settings.json
37+
src/flask/build/

data/Autorskie/Ameba (Disnejowski shit ;) ).sng renamed to data/Autorskie/Ameba.sng

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#title Ameba (Disnejowski shit ;) )
1+
#title Ameba
22
#author Jagoda Ciszewska
33
#category Autorskie
44

data/Yapa 2023/Pańska 782.sng

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#title Pańska 7/8/2
1+
#title Pańska 7 8 2
22
#author Słodki Całus od Buby
33
#category Yapa 2023
44

frozen_flask.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
from flask_frozen import Freezer
2+
from src.flask.flask import app
3+
from src.obj.Songbook import Songbook
4+
5+
freezer = Freezer(app)
6+
#app.config['FREEZER_BASE_URL'] = "/Users/rjsp4n/Desktop/vscode/songbook/songbook/src/flask/build/"
7+
app.config['FREEZER_RELATIVE_URLS'] = True
8+
app.config['FREEZER_DEFAULT_MIMETYPE'] = 'text/html; charset=utf-8'
9+
10+
@freezer.register_generator
11+
def start():
12+
sb = Songbook()
13+
for cat in sb.sb:
14+
for sng in sb.sb[cat]:
15+
for i in range(0, 12):
16+
yield {'category': cat, 'song': sng.title, 'chordShift': i}
17+
18+
if __name__ == '__main__':
19+
freezer.freeze()

requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
Flask>=2.0.2
33
WTForms>=3.0.0
44
Flask-WTF>=1.0.0
5+
Frozen-Flask
56
requests>=2.27.1
67
pre-commit
78
markdown2

src/flask/flask.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,16 +26,15 @@ def __init__(self):
2626

2727
sb = Songbook()
2828

29+
30+
2931
@app.route("/")
30-
@app.route("/<category>/<song>")
31-
def start(category = None, song = None):
32+
@app.route("/<category>/<song>/<chordShift>.html")
33+
def start(category = None, song = None, chordShift = 0):
3234
filter = FilterForm()
3335
filter.validate_on_submit()
3436
filterString = request.args.get("filter")
35-
try:
36-
chordShift = int(request.args.get("chordShift", 0, int))
37-
except ValueError:
38-
chordShift = 0
37+
chordShift = int(chordShift)
3938
if filterString:
4039
songs = sb.filteredSongs(filterString)
4140
else:

src/flask/templates/page.html

Lines changed: 41 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,49 @@
88
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js"
99
integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN"
1010
crossorigin="anonymous"></script>
11+
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
1112
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.12.9/dist/umd/popper.min.js"
1213
integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q"
1314
crossorigin="anonymous"></script>
1415
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.0.0/dist/js/bootstrap.min.js"
1516
integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl"
1617
crossorigin="anonymous"></script>
17-
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
1818
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.0.0/dist/css/bootstrap.min.css"
1919
integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
2020
<link rel="stylesheet" href={{url_for('static', filename='style.css' )}}>
21-
<link href="//maxcdn.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.min.css" rel="stylesheet">
21+
<link href="https://use.fontawesome.com/releases/v4.7.0/css/font-awesome-css.min.css" rel="stylesheet">
2222
<title>Śpiewnik HK</title>
23+
<script type="text/javascript">
24+
(function($){
25+
26+
}(jQuery || window.jQuery));
27+
</script>
28+
<script>
29+
function filterFunction() {
30+
var input, filter, ul, li, a, i, txtValue, matched;
31+
input = document.getElementById('filterInput');
32+
filter = input.value.toUpperCase();
33+
{% for category in songList.keys() %}
34+
ul = document.getElementById("{{category.replace(' ', '')}}");
35+
li = ul.getElementsByTagName('li');
36+
matched = false;
37+
// Loop through all list items, and hide those who don't match the search query
38+
for (i = 0; i < li.length; i++) {
39+
a = li[i].getElementsByTagName("a")[0];
40+
txtValue = a.textContent || a.innerText;
41+
if (txtValue.toUpperCase().indexOf(filter) > -1) {
42+
li[i].style.display = ""
43+
matched = true;
44+
} else {
45+
li[i].style.display = "none";
46+
}
47+
}
48+
if (matched) {
49+
$("#{{category.replace(' ', '')}}").collapse('show')
50+
}
51+
{% endfor %}
52+
}
53+
</script>
2354
</head>
2455

2556
<body>
@@ -31,24 +62,17 @@
3162
<li data-toggle="collapse" data-target="#search">
3263
<div class="input-group justify-content-center">
3364
<div class="form-outline">
34-
<form method="GET" class="form-inline my-2 my-lg-0 w-auto"
35-
action="/{{'{}/{}'.format(song.category, song.title) if song and song.category and song.title else ''}}">
36-
{{ filter.filter(class_ = "form-control w-auto", placeholder="Search for songs...",
37-
style="width: auto;") }}
38-
<button type="submit" value="Search" class="btn btn-primary">
39-
<i class="fa fa-search" type="submit" aria-hidden="true"></i>
40-
</button>
41-
</form>
65+
<input type="text" id="filterInput" onkeyup="filterFunction()" placeholder="Search for songs..">
4266
</div>
4367
</div>
4468
</li>
4569
{% for category in songList.keys() %}
46-
<li data-toggle="collapse" data-target="#{{category}}" class="collapsed category">
70+
<li data-toggle="collapse" data-target="#{{category.replace(' ', '')}}" class="collapsed category">
4771
<a href="#">{{category}}<span class="arrow"></span></a>
4872
</li>
49-
<ul class="collapse song {{'show' if filterString or (hasattr(song, 'category') and category == song.category) else ''}}" id="{{category}}">
73+
<ul class="collapse song {{'show' if filterString or (hasattr(song, 'category') and category == song.category) else ''}}" id="{{category.replace(' ', '')}}">
5074
{% for song in songList[category] %}
51-
<li><a href="/{{category}}/{{song.title.replace('/', '')}}">{{song.title}}</a></li>
75+
<li><a href="{{url_for('start', category=category, song=song.title.replace('/', ''), chordShift=0)}}">{{song.title}}</a></li>
5276
{% endfor %}
5377
</ul>
5478
{% endfor %}
@@ -67,18 +91,16 @@
6791
<table width="100%">
6892
<tr>
6993
<td>
70-
<form method="GET" action="" align="center">
71-
<input type="hidden" name="chordShift" value="{{(chordShift-1) % 12}}">
94+
<form action="{{url_for('start', category=song.category, song=song.title.replace('/', ''), chordShift=(chordShift-1) % 12)}}">
7295
<button type="submit" value="Down" class="btn btn-primary">
7396
<i class="fa fa-arrow-down" aria-hidden="true"></i>
7497
</button>
7598
</form>
7699
</td>
77100
<td>
78-
<form method="GET" action="" align="center">
79-
<input type="hidden" name="chordShift" value="{{(chordShift+1) % 12}}">
80-
<button type="submit" value="Up" class="btn btn-primary">
81-
<i class="fa fa-arrow-up" aria-hidden="true"></i>
101+
<form action="{{url_for('start', category=song.category, song=song.title.replace('/', ''), chordShift=(chordShift+1) % 12)}}">
102+
<button type="submit" value="Down" class="btn btn-primary">
103+
<i class="fa fa-arrow-down" aria-hidden="true"></i>
82104
</button>
83105
</form>
84106
</td>

src/obj/Song.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,14 @@
22
import os
33
import itertools
44
import re
5-
65
from src.obj.Config import config
76

7+
try:
8+
from flask import url_for
9+
except ImportError:
10+
flaskSupported = False
11+
else:
12+
flaskSupported = True
813

914
class Song:
1015
def __init__(self, title: str, category: str):
@@ -41,7 +46,10 @@ def expandedSections(self):
4146

4247
@property
4348
def linkedTitle(self) -> str:
44-
return f"{'&nbsp;'*8}<a href=\"/{self.category}/{self.title}\">{self.title}</a>"
49+
if flaskSupported:
50+
return f"{'&nbsp;'*8}<a href={url_for('start', category=self.category, song=self.title.replace('/', ''), chordShift=0)}>{self.title}</a>"
51+
else:
52+
return f"""{'&nbsp;'*8}<a href={f'/{self.category}/{self.title.replace("/", "")}/0'}>{self.title}</a>"""
4553

4654
@property
4755
def filterString(self) -> str:

src/obj/Songbook.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
class Songbook:
1212
def __init__(self):
13-
self.sb = {}
13+
self.sb: dict[str, list[Song]] = {}
1414
for cat in getCategoriesFromDirs():
1515
self.sb[cat] = [Song.loadFromCatAndTitle(cat, songFilename[:-4]) for songFilename in getSongFilenamesFromCatDir(cat)]
1616
for song in self.sb[cat]:

0 commit comments

Comments
 (0)