Loose .md/.txt/.log files rendered as forced-download links in the gallery
and downloaded (or showed raw) when opened. Now they open in a readable
in-booth page via the existing /b/<name>/view route:
- .md -> rendered HTML (Python-Markdown: fenced code, tables, sane lists),
styled in an Australis .markdown-body with the viewer chrome;
- .txt/.log -> preformatted <pre> text view.
The gallery links docs to the viewer (📄) instead of a download; the view
page keeps a ⬇ (?dl=1) for saving. Files over 2 MB hand back raw. New
markdown dep (optional-import: degrades .md to text view if absent).
booth_image_view -> booth_view_file (now handles image + doc + raw-fallback).
9 new tests, suite 44 passing; deployed + verified live on nh3-dev :8090.
45 lines
2.3 KiB
HTML
45 lines
2.3 KiB
HTML
{% extends "base.html" %}
|
|
{% block title %}{{ file }} · {{ name }} · The Booth{% endblock %}
|
|
{% block content %}
|
|
<div class="docview">
|
|
<div class="vbar">
|
|
<a class="vbtn vx" href="/b/{{ name_url }}/" title="back to gallery (Esc)">✕</a>
|
|
<span class="vname">{{ file }}</span>
|
|
<span class="vspacer"></span>
|
|
<a class="vbtn" href="{{ file_url }}?dl=1" title="download {{ file }}">⬇</a>
|
|
</div>
|
|
{% if is_html %}
|
|
<article class="markdown-body">{{ body|safe }}</article>
|
|
{% else %}
|
|
<pre class="textview">{{ body }}</pre>
|
|
{% endif %}
|
|
</div>
|
|
<style>
|
|
.docview{max-width:52rem;margin:0 auto;padding:0 clamp(12px,3vw,20px) 4rem}
|
|
.textview{white-space:pre-wrap;word-break:break-word;font-family:var(--font-mono);
|
|
font-size:.86rem;line-height:1.5;color:var(--fg-1);background:var(--rk-well);
|
|
border:1px solid var(--rk-line,#252a35);border-radius:10px;padding:1rem 1.15rem;overflow-x:auto}
|
|
.markdown-body{color:var(--fg-1);line-height:1.62;font-size:.98rem;overflow-wrap:break-word}
|
|
.markdown-body h1,.markdown-body h2,.markdown-body h3{line-height:1.25;margin:1.6em 0 .5em}
|
|
.markdown-body h1{font-size:1.7em}.markdown-body h2{font-size:1.35em}.markdown-body h3{font-size:1.12em}
|
|
.markdown-body h1,.markdown-body h2{border-bottom:1px solid var(--rk-line,#252a35);padding-bottom:.3em}
|
|
.markdown-body p,.markdown-body ul,.markdown-body ol,.markdown-body blockquote{margin:.7em 0}
|
|
.markdown-body a{color:var(--aus-bright-cyan,#42dcd1)}
|
|
.markdown-body code{font-family:var(--font-mono);font-size:.86em;background:var(--rk-well);
|
|
padding:.12em .38em;border-radius:5px}
|
|
.markdown-body pre{background:var(--rk-well);border:1px solid var(--rk-line,#252a35);
|
|
border-radius:10px;padding:.9rem 1.05rem;overflow-x:auto}
|
|
.markdown-body pre code{background:none;padding:0}
|
|
.markdown-body blockquote{border-left:3px solid var(--aus-bright-cyan,#42dcd1);
|
|
padding-left:1em;color:var(--fg-2);margin-left:0}
|
|
.markdown-body table{border-collapse:collapse;display:block;overflow-x:auto}
|
|
.markdown-body th,.markdown-body td{border:1px solid var(--rk-line,#252a35);padding:.4em .7em}
|
|
.markdown-body img{max-width:100%}
|
|
</style>
|
|
<script>
|
|
document.addEventListener('keydown', function (e) {
|
|
if (e.key === 'Escape') window.location.href = {{ ('/b/' ~ name_url ~ '/')|tojson }};
|
|
});
|
|
</script>
|
|
{% endblock %}
|