From 477d134cd1fd2c93de5b7d6e3fa72753b15176e6 Mon Sep 17 00:00:00 2001 From: relikd Date: Tue, 28 Feb 2023 20:47:52 +0100 Subject: [PATCH] chore: cleanup old scripts --- Makefile | 3 +- extras/find-dead-links.py | 15 ++- extras/generate-alternates.py | 59 ---------- extras/yummysoup-import.py | 196 ---------------------------------- 4 files changed, 12 insertions(+), 261 deletions(-) delete mode 100644 extras/generate-alternates.py delete mode 100644 extras/yummysoup-import.py diff --git a/Makefile b/Makefile index a610663..cb05cd2 100644 --- a/Makefile +++ b/Makefile @@ -63,7 +63,7 @@ build: dist @$(LEKTOR) build --output-path ../bin --buildstate-path build-state -f ENABLE_PDF_EXPORT @echo @echo 'Checking dead links ...' - @python3 extras/find-dead-links.py + @python3 extras/find-dead-links.py 'data/development' .PHONY: deploy deploy: @@ -73,6 +73,7 @@ deploy: @echo # --dry-run rsync -rclzv --exclude=.lektor --exclude=.DS_Store --delete bin/ vps:/srv/http/recipe-lekture +# technically this isnt needed anymore but it simplyfies latex development .PHONY: pdf pdf: @SECONDS=0; \ diff --git a/extras/find-dead-links.py b/extras/find-dead-links.py index 8809217..0730d40 100755 --- a/extras/find-dead-links.py +++ b/extras/find-dead-links.py @@ -1,24 +1,29 @@ #!/usr/bin/env python3 import os import re +import sys from contextlib import closing from mmap import mmap, ACCESS_READ +from typing import Iterator + +if len(sys.argv) != 2 or not os.path.isdir(sys.argv[1]): + print('Usage: {} /path/to/recipe_dir'.format(os.path.basename(__file__)), + file=sys.stderr) + exit(1) + rx_a = re.compile(br'[@(]\.\./([^/]*)') -def regex_file(file): +def regex_file(file: str) -> Iterator[str]: with open(file, 'r') as f: with closing(mmap(f.fileno(), 0, access=ACCESS_READ)) as d: for x in re.finditer(rx_a, d): yield x.group(1).decode('utf-8') -base_dir = os.path.dirname(os.path.dirname(os.path.realpath(__file__))) -dist_dir = os.path.join(base_dir, 'data', 'distribution') all_ids = None - -for path, dirs, files in os.walk(dist_dir): +for path, dirs, files in os.walk(sys.argv[1]): if not all_ids: all_ids = dirs for lr_file in files: diff --git a/extras/generate-alternates.py b/extras/generate-alternates.py deleted file mode 100644 index 46f5e5c..0000000 --- a/extras/generate-alternates.py +++ /dev/null @@ -1,59 +0,0 @@ -#!/usr/bin/env python3 -import os -import sys - -''' -Usage: python3 generate-alternates.py development/* - -Input is a recipe folder. -Will take the `contents.lr` and extract `contents+de.lr` and `contents+en.lr`. -The content will be identical but its easier to edit this way. -No necessary redundant data fields. -''' - - -def prnt(key, val, inline=True): - return '' if not val else '{}:{}{}\n---\n'.format( - key, ' ' if inline else '\n\n', str(val).strip()) - - -def splitContent(path): - mode = 1 - idx = 0 - with open(os.path.join(path, 'contents.lr'), 'r') as fin: - tmp = ['', ''] - for line in fin: - if mode == 1: - tag = line.split(':')[0] - if tag in ['name', 'yield', 'ingredients', 'directions']: - idx = 1 - else: - idx = 0 - tmp[idx] += line - mode = 2 - else: - tmp[idx] += line - if line == '---\n': - mode = 1 - tmp[1] = tmp[1][:-4] - return tmp - - -def writeSplit(path): - de_file = os.path.join(path, 'contents+de.lr') - if not os.path.isdir(path) or os.path.exists(de_file): - return - print(path) - content = splitContent(path) - if not content[1]: - return - with open(de_file, 'w') as f: - f.write(content[1]) - with open(os.path.join(path, 'contents+en.lr'), 'w') as f: - f.write(content[1]) - with open(os.path.join(path, 'contents.lr'), 'w') as f: - f.write(content[0]) - - -for x in sys.argv[1:]: - writeSplit(x) diff --git a/extras/yummysoup-import.py b/extras/yummysoup-import.py deleted file mode 100644 index 9062f90..0000000 --- a/extras/yummysoup-import.py +++ /dev/null @@ -1,196 +0,0 @@ -#!/usr/bin/env python3 -import sqlite3 -import os -import sys -from datetime import datetime - -''' -Usage: python3 generate-alternates.py '…/YummySoup.library/Database.SQL' - -You may have to adjust `mapTag`, `clearUTF()`, and `slugify()` below. -Output is generated in the current folder under `yummysoup-exported`. -''' - -# check if input param is SQL database file -try: - inputPath = os.path.abspath(sys.argv[1]) - if not os.path.isfile(inputPath) or not inputPath.upper().endswith('SQL'): - raise Exception() - base = os.path.dirname(inputPath) - print('connecting...') - db = sqlite3.connect(inputPath) -except Exception: - print() - print(f'usage: {os.path.basename(sys.argv[0])} "path/to/db.SQL"') - print('(e.g., "…/YummySoup! Librarys.library/Library Database.SQL")') - print() - exit() - -# create output export dir if necessary -_out = os.path.abspath('./yummysoup-exported/') -if not os.path.exists(_out): - os.mkdir(_out) - -# map old tags to new one. Should be all available tags in YummySoup! -# right hand side must be lower case string or None -mapTag = { - '': None, - 'Weihnachten': 'xmas', - 'Wurst': None, - 'Dressing': 'dressing', - 'Soße': 'sauce', - 'Hauptspeise': 'main-dish', - 'Süßes': 'sweet', - 'Zutat': 'ingredient', - 'Raw': 'raw', - 'Aufstrich': 'spread', - 'Brot': 'bread', - 'Kuchen': 'cake', - 'Kekse': 'cookies', - 'trocken': None, - 'Salat': 'salad', - 'Drink': 'drinks', - 'Riegel': None, - 'Schokolade': 'chocolate', - 'Dip': 'dip', - 'fruchtig': None, - 'Glutenfrei': 'glutenfree' -} - - -def ttoint(txt): - i, n = txt.split(' ') if txt else (0, 'M') - return int(i) * [1, 60, 1440]['MST'.index(n[0])] - - -# def matchTime(time): -# if time in [0, 25, 135, 165, 300]: -# return [None, 30, 150, 150, 360][[0, 25, 135, 165, 300].index(time)] -# prev = 99999 -# val = time -# for x in [5, 10, 15, 20, 30, 45, 60, 75, 90, 105, -# 120, 150, 180, 240, 360, 480, 720, 1440]: -# diff = abs(time - x) -# if diff < prev: -# prev = diff -# val = x -# elif diff == prev: -# print(time) -# return val - - -def clearUTF(txt): - return txt.replace('\\U00df', 'ß').replace('\\U00f1', 'ñ')\ - .replace('\\U00c4', 'Ä').replace('\\U00e4', 'ä')\ - .replace('\\U00d6', 'Ö').replace('\\U00f6', 'ö')\ - .replace('\\U00dc', 'Ü').replace('\\U00fc', 'ü') - - -def slugify(txt): - return txt.lower().replace(' ', '-').replace(':', '').replace('ß', 'ss')\ - .replace('(', '').replace(')', '').replace(',', '').replace('ê', 'e')\ - .replace('ä', 'ae').replace('ü', 'ue').replace('ö', 'oe').strip('-') - - -def formatIngredient(info): - try: - if info['isG'] in ['YES', '1']: - return '\n' + info['nam'] - except KeyError: - pass - txt = info['nam'].replace(',', ' ') - if info['mea']: - txt = '{} {}'.format(info['mea'], txt) - if info['qua']: - txt = '{} {}'.format(info['qua'], txt) - if info['met']: - txt = '{}, {}'.format(txt, info['met']) - return txt - - -def ingredientToStr(txt): - res = '' - for ing in clearUTF(txt).split('},'): - ing = ing.strip('{()} \n') - info = {'qua': '', 'mea': '', 'nam': '', 'met': ''} - for prop in ing.split(';'): - if not prop: - continue - k, v = [x.strip('\n "') for x in prop.split('=')] - info[k[:3]] = v - res += '\n' + formatIngredient(info) - return res - - -def directionsToStr(txt): - return txt.replace('', '').replace(' ', '')\ - .replace('', '').replace('
', '').replace('', '__').\ - replace('', '__').replace('', '_').replace('', '_')\ - .replace('℃', '°C').replace(' °C', '°C')\ - .replace('½', '1/2').replace('¼', '1/4').replace('⅛', '1/8')\ - .replace('⅓', '1/3').replace('⅔', '2/3').replace('¾', '3/4') - - -def prnt(key, val, inline=True): - return '' if not val else '{}:{}{}\n---\n'.format( - key, ' ' if inline else '\n\n', str(val).strip()) - - -def export(slug, content, img): - output = os.path.join(_out, slug) - for i in range(10): - folder = output - if i > 0: - folder += '-%d' % i - if not os.path.isdir(folder): - output = folder - break - os.mkdir(output) - with open(os.path.join(output, 'contents.lr'), 'w') as f: - f.write(txt.strip().rstrip('-')) - - for i in range(1, 10): - src = img % i - dest = os.path.join(output, f'image{"" if i == 1 else i}.jpg') - if not os.path.isfile(src): - break - with open(src, 'rb') as a, open(dest, 'wb') as b: - b.write(a.read()) - - -print('exporting...') -for row in db.cursor().execute('''SELECT * FROM ZRECIPES'''): - difficulty, rating, date, img = row[4], row[7], row[9], row[10] - duration, tags, name, yields = row[12:15], row[15], row[17], row[21] - notes, directions, source, ingredients = row[23], row[25], row[26], row[27] - - # preprocess - date = datetime.fromtimestamp(date + 978307200).strftime('%Y-%m-%d') - img = os.path.join(base, 'Images', img + '-Image%d.jpg') - duration = sum([ttoint(x) for x in duration]) # matchTime() - tags = ', '.join(sorted([mapTag[x] for x in tags.split(',') if mapTag[x]])) - slug = slugify(name) - if yields: - y = yields.split(' ') - if len(y) == 3 and y[1].endswith('form'): - yields = '{} {}'.format(y[2], y[1]) - - txt = '' - txt += prnt('name', name) - txt += prnt('tags', tags) - txt += prnt('time', duration) - txt += prnt('difficulty', [None, 'easy', 'medium', 'hard'][difficulty]) - txt += prnt('rating', rating) - txt += prnt('yield', yields) - txt += prnt('ingredients', ingredientToStr(ingredients), False) - desc = directionsToStr(directions) - if notes: - desc = '{}\n\n__Notes:__ {}'.format(desc.strip(), notes) - txt += prnt('directions', desc, False) - txt += prnt('source', source) - txt += prnt('date', date) - - export(slug, txt, img) - -db.close() -print('done.')