diff --git a/app.py b/app.py index 3a1f049c0109313ce467022701e5e0861060c5be..884defea98c89721380ba1b0217226d71f3bf98c 100644 --- a/app.py +++ b/app.py @@ -5,7 +5,8 @@ import re import sys import tempfile import io -from svg_to_hpgl import svgToHPGL +import requests +# from svg_to_hpgl import svgToHPGL app = Flask(__name__) @@ -16,7 +17,32 @@ possible_extensions = [".flf"] etherpad = 'https://pad.constantvzw.org/p/' prefix = 'cobbled-pad-' -# VARIABLES +# VARIABLES 4 CATALOGUE +# ------------------------------ + +output = { + 'stroke': { 'ascii': ' | ' , 'fonts': [] }, + 'script': { 'ascii': ' _/' , 'fonts': [] }, + 'block': { 'ascii': '|_|' , 'fonts': [] }, + 'outline': { 'ascii': '/ /' , 'fonts': [] }, + 'effect': { 'ascii': ': :' , 'fonts': [] }, + 'pattern': { 'ascii': ')()' , 'fonts': [] }, + + # 'fill': { 'ascii': '_/', 'fonts': {} }, + + # 'directions': { 'ascii': '_/', 'fonts': {} }, + # '3d': { 'ascii': '_/', 'fonts': {} }, + + # 'frame': { 'ascii': '_/', 'fonts': {} }, + # 'code': { 'ascii': '_/', 'fonts': {} }, +} +databases = { + 'default': 'fonts made by the figlet developpers and given with the program, early 1993', + 'contributed': 'fonts made by figlet amateurs and submitted to the official figlet ftp, from before 1993 to 2005', + 'jave': 'figlet font library of JavE (a free Ascii drawing Editor)', +} + +# VARIABLES 4 REGEX # ------------------------------ # all the character that svgbob understand @@ -43,13 +69,46 @@ autofix = [ [re.compile(r_nspec), "#"], ] +# FUNCTIONS +# ------------------------------ def most_common(lst): return max(set(lst), key=lst.count) +def text2figlet(input, figfont): + figlet = subprocess.run(["figlet", input, "-f", figfont, "-w", "160"], stdout = subprocess.PIPE, text=True) + return figlet.stdout + +def ascii2svg(ascii_input, weight): + svgbob = subprocess.run(["svgbob_cli", '--stroke-width', weight], input = ascii_input, stdout = subprocess.PIPE, text=True) + return svgbob.stdout + +def ascii_autofix(ascii): + for regex, replace in autofix: + ascii = re.sub(regex, replace, ascii) + return ascii + +def autofix_indication(ascii): + for regex, replace in autofix: + # the two markers have to not appear in any regex + ascii = re.sub(regex, "$" + replace + "€", ascii) + + ascii = re.sub("[\$]", "<span class='fix'>", ascii) + ascii = re.sub("[\€]", "</span>", ascii) + return ascii + + # ROUTES # ------------------------------ +# _ _ +# (_)_ __ __| | _____ __ +# | | '_ \ / _` |/ _ \ \/ / +# | | | | | (_| | __/> < +# |_|_| |_|\__,_|\___/_/\_\ +# +# PRESENT THE TOOL + @app.route("/") def index(): @@ -57,6 +116,16 @@ def index(): 'index.html', title = title) +# _ +# __| |_ __ __ ___ __ +# / _` | '__/ _` \ \ /\ / / +# | (_| | | | (_| |\ V V / +# \__,_|_| \__,_| \_/\_/ +# +# ETHERPAD 2 SVGBOB INTERFACE +# one iframe for the etherpad +# another iframe to dump the generated svg + @app.route("/draw.html") def draw(): @@ -71,6 +140,39 @@ def draw(): title = title, params = params) +# this is the route of the iframe where the svg is generated and dumped + +@app.route("/drawing/<id>") +def drawing(id): + + params = { + 'pad': id or 'default', + 'weight': request.args.get('w') or '3', + } + params['pad-full'] = etherpad + prefix + params['pad'] + + # get pad content + print(' getting ' + params['pad-full']) + pad_export = requests.get(params['pad-full'] + '/export/txt') + ascii_input = pad_export.text + + # to SVG + svg = ascii2svg(ascii_input, params['weight']); + + return render_template( + 'drawing.html', + title = title, + params = params, + svg = svg) + +# _ _ +# ___ __ _| |_ __ _| | ___ __ _ _ _ ___ +# / __/ _` | __/ _` | |/ _ \ / _` | | | |/ _ \ +# | (_| (_| | || (_| | | (_) | (_| | |_| | __/ +# \___\__,_|\__\__,_|_|\___/ \__, |\__,_|\___| +# |___/ +# +# FIGLET 2 SVGBOB INTERACTIVE CATALOGUE @app.route("/catalogue.html") def catalogue(): @@ -80,27 +182,6 @@ def catalogue(): 'text': request.args.get('t') or 'Echoes', 'weight': request.args.get('w') or '3', } - output = { - 'stroke': { 'ascii': ' | ' , 'fonts': [] }, - 'script': { 'ascii': ' _/' , 'fonts': [] }, - 'block': { 'ascii': '|_|' , 'fonts': [] }, - 'outline': { 'ascii': '/ /' , 'fonts': [] }, - 'effect': { 'ascii': ': :' , 'fonts': [] }, - 'pattern': { 'ascii': ')()' , 'fonts': [] }, - - # 'fill': { 'ascii': '_/', 'fonts': {} }, - - # 'directions': { 'ascii': '_/', 'fonts': {} }, - # '3d': { 'ascii': '_/', 'fonts': {} }, - - # 'frame': { 'ascii': '_/', 'fonts': {} }, - # 'code': { 'ascii': '_/', 'fonts': {} }, - } - databases = { - 'default': 'fonts made by the figlet developpers and given with the program, early 1993', - 'contributed': 'fonts made by figlet amateurs and submitted to the official figlet ftp, from before 1993 to 2005', - 'jave': 'figlet font library of JavE (a free Ascii drawing Editor)', - } # walk in the figlet font directory for root, dirs, files in os.walk(fonts_directory): @@ -109,8 +190,8 @@ def catalogue(): (basename, ext) = os.path.splitext(name) if ext in possible_extensions: - path = os.path.join(root, name) - print(path) + figfont = os.path.join(root, name) + print(figfont) # get font category out of last folder catalogue = root.split('/')[-2] @@ -121,37 +202,16 @@ def catalogue(): output[type]['fonts'].append(f) f['name'] = name f['catalogue'] = catalogue - - figlet = subprocess.run(["figlet", params['text'], "-f", path, "-w", "160"], stdout = subprocess.PIPE, text=True) - f['ascii'] = figlet.stdout - - font_info = subprocess.run(["figlet", "-I", path, "-w", "160"], stdout = subprocess.PIPE, text=True) - f['info'] = font_info - - svgbob = subprocess.run(["svgbob_cli", '--stroke-width', params['weight']], input = f['ascii'], stdout = subprocess.PIPE, text=True) - f['svg'] = svgbob.stdout + f['ascii'] = text2figlet(params['text'], figfont) + f['svg'] = ascii2svg(f['ascii'], params['weight']) # regex auto_fix - fixed = f['ascii'] - for regex, replace in autofix: - fixed = re.sub(regex, replace, fixed) - f['ascii_fix'] = fixed + f['ascii_fix'] = ascii_autofix(f['ascii']) if f['ascii'] != f['ascii_fix']: f['autofix'] = True - - fix_indication = f['ascii'] - for regex, replace in autofix: - # the two markers have to not appear in any regex - fix_indication = re.sub(regex, "$" + replace + "€", fix_indication) - fix_indication = re.sub("[\$]", "<span class='fix'>", fix_indication) - fix_indication = re.sub("[\€]", "</span>", fix_indication) - f['ascii_fix_indication'] = fix_indication - - svgbob_fix = subprocess.run(["svgbob_cli", '--stroke-width', params['weight']], input = f['ascii_fix'], stdout = subprocess.PIPE, text=True) - f['svg_fix'] = svgbob_fix.stdout - - + f['ascii_fix_indication'] = autofix_indication(f['ascii_fix']) + f['svg_fix'] = ascii2svg(f['ascii_fix'], params['weight']) return render_template( 'catalogue.html', @@ -160,6 +220,9 @@ def catalogue(): output = output, params = params) + +# ---------------------------------------------------------- + def make_svg (): return '' diff --git a/templates/draw.html b/templates/draw.html index b1781cf57c904da617d171ec3c146e6ba0213d1a..dcdbdaba8871f5b72024854c88a69262e0cedd96 100644 --- a/templates/draw.html +++ b/templates/draw.html @@ -6,57 +6,76 @@ <header class="controls"> <label>etherpad</label> - <input class="get-input" type="text" value="{{params['pad']}}" data-name="p"/> - <button>go</button> + <input id="pad-name" type="text" value="{{params['pad']}}" data-name="p"/> + <button id="button-pad" data-use="pad-name">go</button> <hr> - <button onClick="window.location.reload();">generate</button> + <button id="button-svg">generate</button> - <label>weight</label> - <input class="get-input" type="range" min="1" max="8" value="{{params['weight']}}" data-name="w"/> + <!-- <label>weight</label> + <input class="get-input" type="range" min="1" max="8" value="{{params['weight']}}" data-name="w"/> --> - <label class="text-label" for="text-checkbox" + <!-- <label class="text-label" for="text-checkbox" title="display the remaining text in the svg output in red"> output text</label> <input id="text-checkbox" type="checkbox" - class="body-class-check" value="check-text" checked/> + class="body-class-check" value="check-text" checked/> --> <script> - let inputs = document.getElementsByClassName('get-input'); - for(let input of inputs){ - input.addEventListener('input', function(){ - const url = new URL(window.location.href); - url.searchParams.set(input.dataset.name, input.value); - window.history.replaceState(null, null, url); - }); + function updateGET(frame, param, value){ + // object from GET parameters + let [base_src, params_src] = frame.src.split("?"); + let params = new URLSearchParams(params_src); + // update param + params.set(param, value); + // reconstituate URL + let new_src = base_src + "?" + params.toString(); + // set and refresh + frame.src = new_src; } - </script> - <script> - function toggle_class(classname, val){ - if(val){ - document.body.classList.add(classname); - } - else{ - document.body.classList.remove(classname); - } - } - let body_class_checkboxes = document.getElementsByClassName("body-class-check"); - for(let checkbox of body_class_checkboxes){ - let classname = checkbox.value; - checkbox.addEventListener('input', function(){ - toggle_class(classname, checkbox.checked); - }); - toggle_class(classname, checkbox.checked); - } + let button_pad = document.getElementById('button-pad'); + let button_svg = document.getElementById('button-svg'); + + // --- pad go button + button_pad.addEventListener('click', function(){ + let svg_iframe = document.getElementById('svg-iframe'); + let pad_iframe = document.getElementById('pad-iframe'); + let input = document.getElementById(button_pad.dataset.use); + let value = input.value; + let param = input.dataset.name; + + let pad_src = pad_iframe.src; + pad_src = pad_src.split('-'); + pad_src[pad_src.length-1] = value; + pad_src = pad_src.join('-'); + pad_iframe.src = pad_src; + + let svg_src = svg_iframe.src; + svg_src = svg_src.split('/'); + svg_src[svg_src.length-1] = value; + svg_src = svg_src.join('/'); + svg_iframe.src = svg_src; + + }); + + // --- svg generation button + button_svg.addEventListener('click', function(){ + let svg_iframe = document.getElementById('svg-iframe'); + svg_iframe.contentWindow.location.reload(); + }); + </script> </header> <div class="font"> - <iframe class="f-ascii" src="{{params['pad-full']}}"> + <iframe class="f-ascii" id="pad-iframe" src="{{params['pad-full']}}"> </iframe> - <div class="f-svg"></div> + <div class="f-svg"> + <iframe id="svg-iframe" src="/drawing/{{params['pad']}}"> + </iframe> + </div> <aside class="right"> <button>> SVG</button> <button>> HPGL</button> diff --git a/templates/drawing.html b/templates/drawing.html new file mode 100644 index 0000000000000000000000000000000000000000..b4000ac6e3043444986ca43a2d927e18dd79cbbc --- /dev/null +++ b/templates/drawing.html @@ -0,0 +1,12 @@ +<!DOCTYPE html> +<html lang="en"> + <head> + <meta http-equiv="content-type" content="text/html; charset=utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1"> + <link rel="stylesheet" type="text/css" href="static/css/reset.css" /> + <link rel="stylesheet" type="text/css" href="static/css/interface.css" /> + </head> + <body class=""> + {{ svg|safe }} + </body> +</html> \ No newline at end of file