diff --git a/postprocessor/__main__.py b/postprocessor/__main__.py index 9a83bc2..59c20e7 100644 --- a/postprocessor/__main__.py +++ b/postprocessor/__main__.py @@ -70,182 +70,179 @@ for row in raw_data_object["data"]: for row in raw_data_object["notes"]: notes_by_type[(row["chemistry"], row["format"], row["subformat"])] = row["note"] +acc = """--- +title: "Film Development Price Comparison" +hideAside: true +asDirectory: false +--- +{% extends "_layouts/base.html" %} +{% block head %} + + + +{% endblock %} + +{% block main %} +""" + doc, tag, text, line = Doc().ttl() -doc.asis("") -with tag("html"): - with tag("head"): - line("title", "Film Development Price Comparison :: abi abi") - doc.stag("meta", charset="utf-8") - doc.stag("meta", name="viewport", content="width=device-width, initial-scale=1") - doc.stag( - "link", - rel="stylesheet", - href="https://www.akpain.net/assets/css/risotto.css", +with tag("div", klass="container pt-3"): + + line("a", "Back to photography", href="https://www.akpain.net/photography/") + + line("h1", "Film Development Price Comparison") + + line("p", "This is my attempt to work out the best value for money film developing and scanning service that's available in the UK. Labs are compared as like-for-like as possible, but some variation (especially in scan size) is inevitable.") + with tag("p"): + text("If your favourite/local/whatever lab isn't listed here, ") + line("a", "let me know", href="https://www.akpain.net#contact") + text(" and I'll add it! Likewise, if you want to see E6, ECN2, half frame, 120 or anything else here, please do tell me.") + + with tag("p"): + text( + "Development costs last updated " + + datetime.datetime.utcfromtimestamp(raw_data_object["time"]).strftime( + "%Y-%m-%d %H:%M:%S" ) - doc.stag( - "link", - rel="stylesheet", - href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css", + + ". Price per pixel figures do not include estimates for outbound or return shipping. " ) - doc.stag( - "link", - rel="stylesheet", - href="https://cdn.jsdelivr.net/npm/simple-datatables@latest/dist/style.css", + line("a", "Raw data available here", href="rawdata.json") + text(". ") + line("a", "Git repo", href="https://git.tdpain.net/codemicro/film-dev-cost-scraper") + text(".") + + + with tag("div", klass="toc-container", style="width: 18rem;"): + with tag("div", klass="header"): + line("span", "On this page", klass="h4 font--monospace-bold") + with tag("div", klass="content"): + with tag("ul"): + for key in entries_by_type: + chemistry, format, subformat = key + slug = slugify(chemistry + format + subformat) + with tag("li"): + line("a", f"{chemistry} {format} ({subformat})", href=f"#{slug}-title") + + slugs = [] + + for key in entries_by_type: + chemistry, format, subformat = key + + slug = slugify(chemistry + format + subformat) + slugs.append(slug) + + line( + "h2", + f"{chemistry} {format} ({subformat})", + id=slug + "-title", ) - with tag("script", src="https://cdn.jsdelivr.net/npm/simple-datatables@latest"): - doc.asis("") - with tag("body"): - with tag("div", klass="container pt-3"): + if key in notes_by_type: + line("p", notes_by_type[key]) - line("a", "[abi abi] $", klass="pe-3", href="https://www.akpain.net") - line("a", "back to photography", href="https://www.akpain.net/photography/") - - line("h1", "Film Development Price Comparison", klass="pt-2") - - line("p", "This is my attempt to work out the best value for money film developing and scanning service that's available in the UK. Labs are compared as like-for-like as possible, but some variation (especially in scan size) is inevitable.") - with tag("p"): - text("If your favourite/local/whatever lab isn't listed here, ") - line("a", "let me know", href="https://www.akpain.net#contact") - text(" and I'll add it! Likewise, if you want to see E6, ECN2, half frame, 120 or anything else here, please do tell me.") - - with tag("p"): - text( - "Development costs last updated " - + datetime.datetime.utcfromtimestamp(raw_data_object["time"]).strftime( - "%Y-%m-%d %H:%M:%S" + cols = [ + ("lab", lambda x: x["lab"]), + ( + "outboundShipping", + lambda x: "×" + if x["includesSendShipping"].lower() == "no" + else x["sendShippingType"], + ), + ( + "returnShipping", + lambda x: ( + "Free" + if (c := float(x["returnShippingCost"])) == 0 + else _format_price(c) ) - + ". Price per pixel figures do not include estimates for outbound or return shipping. " - ) - line("a", "Raw data available here", href="rawdata.json") - text(". ") - line("a", "Git repo", href="https://git.tdpain.net/codemicro/film-dev-cost-scraper") - text(".") - - - with tag("div", klass="card", style="width: 18rem;"): - with tag("div", klass="card-body"): - line("div", "Contents", klass="card-title", style="font-family: var(--font-monospace)") - with tag("ul", klass="card-text"): - for key in entries_by_type: - chemistry, format, subformat = key - slug = slugify(chemistry + format + subformat) - with tag("li"): - line("a", f"{chemistry} {format} ({subformat})", href=f"#{slug}-title") - - slugs = [] - - for key in entries_by_type: - chemistry, format, subformat = key - - slug = slugify(chemistry + format + subformat) - slugs.append(slug) - - line( - "h2", - f"{chemistry} {format} ({subformat})", - klass="h3 pt-4", - id=slug + "-title", - ) - - if key in notes_by_type: - line("p", notes_by_type[key]) - - cols = [ - ("lab", lambda x: x["lab"]), - ( - "outboundShipping", - lambda x: "×" - if x["includesSendShipping"].lower() == "no" - else x["sendShippingType"], - ), - ( - "returnShipping", - lambda x: ( - "Free" - if (c := float(x["returnShippingCost"])) == 0 - else _format_price(c) - ) - + f" ({x['returnShippingType']})", - ), - ("cost", lambda x: _format_price(float(x["cost"]))), - ( - "renderResolution", - lambda x: f"{x['resolution']} ({repr(x['resolutionName'])})", - ), - ( - "pricePerPixel", - lambda x: "{:.5f}p".format( - float(x["cost"]) - * 100 - / reduce( - lambda y, z: y * z, - map(int, x["resolution"].split("x")), - 1, - ) - ), - ), - ("link", lambda x: _render_line("a", "Link", href=x["url"])), - ] - - # begin working out price per pixel colour scales - pppfn = None - for i, item in enumerate(cols): - if item[0] == "pricePerPixel": - pppfn = item[1] - break - assert pppfn is not None - pppcolours = {pppfn(data): "" for data in entries_by_type[key]} - coldiff = ( - int(120 / (len(pppcolours) - 1)) if len(pppcolours) - 1 != 0 else 0 - ) - for i, (val, rawval) in enumerate( - sorted( - map(lambda x: (float(x[:-1]), x), pppcolours.keys()), - key=lambda y: y[0], + + f" ({x['returnShippingType']})", + ), + ("cost", lambda x: _format_price(float(x["cost"]))), + ( + "renderResolution", + lambda x: f"{x['resolution']} ({repr(x['resolutionName'])})", + ), + ( + "pricePerPixel", + lambda x: "{:.5f}p".format( + float(x["cost"]) + * 100 + / reduce( + lambda y, z: y * z, + map(int, x["resolution"].split("x")), + 1, ) - ): - pppcolours[rawval] = f"hsl({120 - (i * coldiff)}, 71%, 73%)" - # end + ), + ), + ("link", lambda x: _render_line("a", "Link", href=x["url"])), + ] - with tag("table", klass="table table-hover", id=slug): - with tag("thead"): - with tag("tr"): - for t, _ in cols: - line("th", col_titles[t], scope="col") - - with tag("tbody"): - for data in sorted( - entries_by_type[key], key=lambda x: x["lab"] - ): - with tag("tr"): - for i, (key, fn) in enumerate(cols): - if i == 0: - line("th", fn(data), scope="row") - else: - with tag("td"): - val = fn(data) - doc.asis(val) - - if key == "pricePerPixel": - doc.attr( - style="background-color: " - + pppcolours[val] - ) - - with tag("script"): - doc.asis("const slugs = ") - doc.asis(json.dumps(slugs)) - doc.asis(";\n") - with open(Path(__file__).resolve().parent / "page.js") as f: - doc.asis(f.read()) - - with tag( - "script", - src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js", + # begin working out price per pixel colour scales + pppfn = None + for i, item in enumerate(cols): + if item[0] == "pricePerPixel": + pppfn = item[1] + break + assert pppfn is not None + pppcolours = {pppfn(data): "" for data in entries_by_type[key]} + coldiff = ( + int(120 / (len(pppcolours) - 1)) if len(pppcolours) - 1 != 0 else 0 + ) + for i, (val, rawval) in enumerate( + sorted( + map(lambda x: (float(x[:-1]), x), pppcolours.keys()), + key=lambda y: y[0], + ) ): - doc.asis() + pppcolours[rawval] = f"hsl({120 - (i * coldiff)}, 71%, 73%)" + # end + + with tag("table", klass="table table-hover", id=slug): + with tag("thead"): + with tag("tr"): + for t, _ in cols: + line("th", col_titles[t], scope="col") + + with tag("tbody"): + for data in sorted( + entries_by_type[key], key=lambda x: x["lab"] + ): + with tag("tr"): + for i, (key, fn) in enumerate(cols): + if i == 0: + line("th", fn(data), scope="row") + else: + with tag("td"): + val = fn(data) + doc.asis(val) + + if key == "pricePerPixel": + doc.attr( + style="background-color: " + + pppcolours[val] + ) + + with tag("script"): + doc.asis("const slugs = ") + doc.asis(json.dumps(slugs)) + doc.asis(";\n") + with open(Path(__file__).resolve().parent / "page.js") as f: + doc.asis(f.read()) + +with tag( + "script", + src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js", +): + doc.asis() + +acc += doc.getvalue() +acc += """ +{% endblock %}""" with open(OUTPUTFILE, "w") as f: - f.write(doc.getvalue()) + f.write(acc)