Compare commits

...

6 Commits

Author SHA1 Message Date
Peter J. Holzer b09e1b4613 Beautify 2020-04-17 01:01:26 +02:00
Peter J. Holzer 17e68334ca Mark the current message in the thread 2020-04-17 01:00:36 +02:00
Peter J. Holzer 8e1337bc8f Add links to the nodes in the thread graph
Currently it's just the nodes themselves which are kind of tiny and hard
to hit. Probably should add some invisible overlay.
2020-04-17 00:57:11 +02:00
Peter J. Holzer 15c70e6836 Split calendar view into months
There is one overview page with one entry per month (currently the
longest thread, could also be an abbreviated list of threads, but not
all of the threads (or we are back where we started).The entries link to
the monthly pages which contain links to all threads with at least one
mail in that month.
2020-04-17 00:53:07 +02:00
Peter J. Holzer 10ce9fad8b Escape from and subject 2020-04-15 21:39:56 +02:00
Peter J. Holzer 6fa5f0ab2e Start luga style (based on my 2018 design) 2020-04-13 13:13:21 +02:00
7 changed files with 628 additions and 31 deletions

View File

@ -1,5 +1,6 @@
#!/usr/bin/python3
from collections import defaultdict
import datetime
import email.header
import email.parser
@ -927,8 +928,8 @@ class Message:
in_reply_to_msgid = [references_msgids[-1]]
self.in_reply_to = in_reply_to_msgids
self.references = references_msgids
self.mfrom = msg["From"]
self.subject = msg["Subject"]
self.mfrom = decode_rfc2047(msg["From"])
self.subject = decode_rfc2047(msg["Subject"])
self.msg = msg
self.kids = False
if self.date.tzinfo is None:
@ -961,10 +962,14 @@ class Message:
"date": msg["Date"],
"bodyhtml": bodyhtml,
"threadhtml": self.thread.as_html(),
"threadindex": self.threadindex(),
}
msghtml = msgtmpl.render(context)
hfd.write(msghtml)
def threadindex(self):
return self.thread.index(self)
# For each message-id, record the thread it belongs to.
# This should probably be an instance variable of Archive instead of global,
@ -1052,7 +1057,7 @@ class Thread:
if y == 0:
# first message in thread
# Just add a node
nodes.append((x, y))
nodes.append((x, y, m.encmsgid))
m.x = x
m.y = y
else:
@ -1063,7 +1068,7 @@ class Thread:
# or Thread-Index)
# Just start a new column to get out of the way
x += 1
nodes.append((x, y))
nodes.append((x, y, m.encmsgid))
m.x = x
m.y = y
@ -1084,7 +1089,7 @@ class Thread:
# Just put the new kid directly below the parent
m.x = p.x
m.y = y
nodes.append((m.x, m.y))
nodes.append((m.x, m.y, m.encmsgid))
edges.append((p.x, p.y, m.x, m.y))
p.kids = True
else:
@ -1095,7 +1100,7 @@ class Thread:
x += 1
m.x = x
m.y = y
nodes.append((m.x, m.y))
nodes.append((m.x, m.y, m.encmsgid))
for r in m.in_reply_to:
p = self.messages[r]
edges.append((p.x, p.y, m.x, m.y))
@ -1119,21 +1124,23 @@ class Thread:
yc = e[1] + 1
s += f"<path d='M {e[0] * fx + fx/2} {e[1] * fy + fy/2} Q {e[2] * fx + fx/2} {yc * fy + fy/2} {e[2] * fx + fx/2} {e[3] * fy + fy/2}' stroke='black' fill='none' />"
for n in nodes:
s += f"<a xlink:href='../../msg/{n[2]}/' >"
s += f"<circle cx={n[0] * fx + fx/2} cy={n[1] * fy + fy/2} r={r} />"
s += f"</a>"
s += "</svg>"
s += "</td>"
# XXX - escape!
s += f"<td class='date'><a href='/msg/{lines[0][3]}/'>{lines[0][0]}</a></td>"
s += f"<td class='from'>{lines[0][1]}</td>"
s += f"<td class='subject'>{lines[0][2]}</td>"
s += f"<td class='date'><a href='../../msg/{lines[0][3]}/'>{lines[0][0]}</a></td>"
s += f"<td class='from'>{html.escape(lines[0][1])}</td>"
s += f"<td class='subject'>{html.escape(lines[0][2])}</td>"
s += "</tr>"
for ln in lines[1:]:
s += "<tr>"
s += f"<td class='date'><a href='/msg/{ln[3]}/'>{ln[0]}</a></td>"
s += f"<td class='from'>{ln[1]}</td>"
s += f"<td class='subject'>{ln[2]}</td>"
s += f"<td class='date'><a href='../../msg/{ln[3]}/'>{ln[0]}</a></td>"
s += f"<td class='from'>{html.escape(ln[1])}</td>"
s += f"<td class='subject'>{html.escape(ln[2])}</td>"
s += "</tr>"
s += "</table>"
self._as_html = s
@ -1144,6 +1151,31 @@ class Thread:
def subject(self):
return list(self.messages.values())[0].subject
def index(self, message):
for i, m in enumerate(sorted(self.messages.values(), key=lambda x: x.date)):
if m == message:
return i
class Month:
def __init__(self, year, month):
self.year = year
self.month = month
self.threads = defaultdict(int)
def add(self, thread):
self.threads[thread] += 1
@property
def longest_thread(self):
thread = None
maxcount = 0
for t, c in self.threads.items():
if c > maxcount:
maxcount = c
thread = t
print("longest_thread: found thread", thread)
return thread
class Archive:
def __init__(self):
@ -1215,16 +1247,19 @@ class Archive:
def webify_calendar(self):
caltmpl = jenv.get_template("calendar.html")
ovrtmpl = jenv.get_template("overview.html")
bmotmpl = jenv.get_template("by_month.html")
cal = {}
for t in self.thread_list:
y = t.date.year
m = t.date.month
if y not in cal:
cal[y] = {}
if m not in cal[y]:
cal[y][m] = []
cal[y][m].append(t)
for m in t.messages.values():
y = m.date.year
m = m.date.month
if y not in cal:
cal[y] = {}
if m not in cal[y]:
cal[y][m] = Month(y, m)
cal[y][m].add(t)
caldir = basedir + "/cal"
os.makedirs(caldir, exist_ok=True)
with open(caldir + "/index.html", "w") as hfd:
@ -1232,8 +1267,18 @@ class Archive:
"list": "LUGA",
"cal": cal,
}
calhtml = caltmpl.render(context)
calhtml = ovrtmpl.render(context)
hfd.write(calhtml)
for y in cal.keys():
for m in cal[y].keys():
monthdir = f"{caldir}/{y}/{m}"
os.makedirs(monthdir, exist_ok=True)
with open(monthdir + "/index.html", "w") as hfd:
context = {
"month": cal[y][m]
}
monthhtml = bmotmpl.render(context)
hfd.write(monthhtml)
def self_check(self):

120
style/logo3.svg Normal file
View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="190"
height="270"
viewBox="0 0 50.270832 71.437501"
version="1.1"
id="svg4508"
inkscape:version="0.92.1 r15371"
sodipodi:docname="logo3.svg">
<defs
id="defs4502" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="3.4851852"
inkscape:cx="82.662061"
inkscape:cy="135"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="true"
units="px"
inkscape:window-width="1600"
inkscape:window-height="1150"
inkscape:window-x="1024"
inkscape:window-y="0"
inkscape:window-maximized="1">
<inkscape:grid
type="xygrid"
id="grid5053"
empspacing="10" />
<inkscape:grid
type="xygrid"
id="grid5055" />
</sodipodi:namedview>
<metadata
id="metadata4505">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-225.56249)">
<path
sodipodi:nodetypes="sscccss"
inkscape:connector-curvature="0"
id="path5296"
d="m 25.450397,225.95053 c -12.469359,0 -22.5777773,10.10842 -22.5777773,22.57778 0,12.46936 10.1084183,22.57778 22.5777773,22.57778 l -3.225395,9.03111 14.816665,-12.24139 c 6.57855,-3.94568 10.986508,-11.13812 10.986508,-19.3675 0,-12.46936 -10.108419,-22.57778 -22.577778,-22.57778 z"
style="fill:none;stroke:#000000;stroke-width:0.95408529;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<g
aria-label="LUGA"
style="font-style:normal;font-weight:normal;font-size:3.38666677px;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.28222224"
id="text5298">
<path
d="m 2.2381847,286.89925 c 0,-1.524 0.04064,-2.98704 0.2032,-4.064 l -0.02032,-0.061 c -0.24384,0.0406 -0.8128001,0.061 -1.0566401,0.061 -0.24384,0 -0.79248006,-0.0203 -1.03632008,-0.061 l -0.04064,0.061 c 0.16256001,1.15824 0.20320001,2.54 0.20320001,4.064 v 4.9784 c 0,1.524 -0.04064,2.96672 -0.20320001,4.064 l 0.02032,0.061 c 0,0 0.36576003,-0.061 1.05664008,-0.061 H 6.911785 c 0.4267201,0 0.8940801,0.0203 1.2192001,0.061 l 0.04064,-0.061 c -0.02032,-0.28448 -0.04064,-0.69088 -0.04064,-0.89408 0,-0.2032 0.02032,-0.54864 0.04064,-0.7112 l -0.04064,-0.0813 c 0,0 -3.0073602,0.44704 -5.7302404,0.44704 -0.14224,-0.48768 -0.16256,-2.47904 -0.16256,-2.82448 z"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:20.3200016px;line-height:1.25;font-family:'Linux Biolinum O';-inkscape-font-specification:'Linux Biolinum O';stroke-width:0.28222224"
id="path18" />
<path
d="m 19.888646,286.89925 v 3.41376 c 0,2.27584 -0.34544,4.69392 -3.77952,4.69392 -3.41376,0 -3.41376,-3.43408 -3.41376,-4.53136 v -3.57632 c 0,-1.524 0.04064,-2.98704 0.2032,-4.064 l -0.04064,-0.061 c -0.24384,0.0406 -0.79248,0.061 -1.03632,0.061 -0.243841,0 -0.792481,-0.0203 -1.036321,-0.061 l -0.04064,0.061 c 0.16256,1.15824 0.2032,2.54 0.2032,4.064 v 4.24688 c 0,4.14528 2.905761,4.99872 4.734561,4.99872 4.1656,0 5.30352,-2.58064 5.30352,-6.1976 v -3.048 c 0,-1.524 0.04064,-2.98704 0.2032,-4.064 l -0.04064,-0.061 c -0.24384,0.0406 -0.46736,0.061 -0.7112,0.061 -0.24384,0 -0.46736,-0.0203 -0.7112,-0.061 l -0.04064,0.061 c 0.16256,1.15824 0.2032,2.54 0.2032,4.064 z"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:20.3200016px;line-height:1.25;font-family:'Linux Biolinum O';-inkscape-font-specification:'Linux Biolinum O';stroke-width:0.28222224"
id="path20" />
<path
d="m 33.978664,293.56421 v 0.9144 c -0.69088,0.65024 -1.889761,0.77216 -2.987041,0.77216 -3.61696,0 -4.95808,-3.27152 -4.95808,-5.95376 0,-3.556 1.97104,-5.83184 4.71424,-5.83184 1.8288,0 3.393441,1.016 4.307841,2.56032 l 0.24384,-0.0203 c 0.06096,-1.03632 0.18288,-1.58496 0.4064,-2.35712 l -0.04064,-0.061 c 0,0 -2.15392,-1.016 -4.632961,-1.016 -3.49504,0 -7.09168,2.45872 -7.09168,6.92912 0,3.51536 2.49936,6.64464 6.58368,6.64464 2.357121,0 4.023361,-0.67056 5.405121,-1.8288 v -0.061 c -0.18288,-0.2032 -0.2032,-0.75184 -0.2032,-0.97536 v -0.12192 c 0,-1.524 0.04064,-2.37744 0.2032,-3.4544 l -0.02032,-0.061 c 0,0 -0.34544,0.061 -1.05664,0.061 -0.69088,0 -1.03632,-0.061 -1.03632,-0.061 l -0.04064,0.061 c 0.16256,1.15824 0.2032,2.3368 0.2032,3.8608 z"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:20.3200016px;line-height:1.25;font-family:'Linux Biolinum O';-inkscape-font-specification:'Linux Biolinum O';stroke-width:0.28222224"
id="path22" />
<path
d="m 45.719495,290.35365 c -0.67056,0.0203 -1.524,0.0406 -2.11328,0.0406 -0.58928,0 -1.68656,-0.0203 -2.133601,-0.0406 l 2.153921,-4.99872 h 0.04064 c 0.83312,1.91008 1.50368,3.57632 2.05232,4.99872 z m -4.632961,0.95504 c 0.508,-0.0406 1.910081,-0.061 2.621281,-0.061 0.77216,0 1.88976,0.0203 2.37744,0.061 0.99568,2.66192 1.44272,4.24688 1.58496,4.69392 0.34544,-0.061 0.67056,-0.061 1.016,-0.061 0.34544,0 0.87376,0 1.2192,0.061 -1.016,-2.05232 -3.69824,-8.98144 -5.56768,-13.43152 h -0.56896 c -1.950721,4.51104 -3.942081,8.9408 -5.994401,13.43152 0.24384,-0.061 0.48768,-0.061 0.7112,-0.061 0.22352,0 0.67056,0 0.9144,0.061 0.32512,-1.23952 0.95504,-2.90576 1.68656,-4.69392 z"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:20.3200016px;line-height:1.25;font-family:'Linux Biolinum O';-inkscape-font-specification:'Linux Biolinum O';stroke-width:0.28222224"
id="path24" />
</g>
<path
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;stroke:none;stroke-width:87.20666504;marker:none;enable-background:accumulate"
d="m 20.723177,242.88387 c -0.186172,0.40167 -0.415275,0.81466 -0.723197,1.25236 -1.142082,1.35814 -2.757238,3.55025 -3.518958,5.83847 -0.277593,0.83391 -0.444595,1.68125 -0.432152,2.50472 h 1.12889 c -0.0109,-0.82347 0.136229,-1.67081 0.379235,-2.50472 0.666803,-2.28822 2.078212,-4.48033 3.077985,-5.83847 0.269555,-0.4377 0.472028,-0.85069 0.635,-1.25236 z m 10.054165,0 c 0.28525,0.5001 0.61691,0.98048 0.9525,1.46402 0.804897,1.0867 1.856803,2.67484 2.460625,4.49792 0.377634,1.14047 0.580707,2.37495 0.432152,3.63361 h 1.358193 c 0.169704,-1.25866 -0.0625,-2.49314 -0.493887,-3.63361 -0.689766,-1.82308 -1.893935,-3.41122 -2.813404,-4.49792 -0.383358,-0.48354 -0.758939,-0.96392 -1.084792,-1.46402 z"
id="path5294"
inkscape:connector-curvature="0" />
<path
style="fill:#c00810;fill-opacity:1;stroke:#ff0000;stroke-width:1.12888896;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
d="m 16.04887,252.47942 c 0.0037,0.24296 0.02574,0.48586 0.06174,0.7232 -0.04949,0.0443 -0.09631,0.0933 -0.14111,0.14111 -0.335314,0.35798 -0.579416,0.78394 -0.855486,1.07597 -0.25792,0.25728 -0.628055,0.35783 -1.031875,0.50271 -0.403976,0.14495 -0.850844,0.3565 -1.12007,0.87312 -5.55e-4,8e-4 5.56e-4,0.008 0,0.009 -0.243718,0.45522 -0.171444,0.97836 -0.09701,1.46403 0.07444,0.48567 0.152942,0.94099 0.05292,1.25236 -0.319718,0.87388 -0.357361,1.48418 -0.132291,1.92264 0.225552,0.43938 0.68412,0.63136 1.208263,0.74083 1.048284,0.21895 2.470668,0.16548 3.589514,0.75848 1.197788,0.62623 2.409034,0.84746 3.377849,0.62618 0.702405,-0.16043 1.277035,-0.58233 1.56986,-1.22591 0.757766,-0.004 1.587248,-0.32353 2.919235,-0.39687 0.903618,-0.0728 2.035372,0.31904 3.333749,0.24694 0.03394,0.14087 0.08269,0.27695 0.149931,0.4057 5.29e-4,0.001 -5.29e-4,0.007 0,0.009 0.503314,1.00647 1.437526,1.46331 2.434167,1.38465 0.997953,-0.0788 2.061559,-0.66382 2.919235,-1.68451 0.817491,-0.99124 2.16943,-1.40644 3.069167,-1.9491 0.449871,-0.27134 0.818459,-0.60896 0.846666,-1.10243 0.02819,-0.49323 -0.260186,-1.05123 -0.926041,-1.79035 -0.218776,-0.24723 -0.319987,-0.70266 -0.432152,-1.19062 -0.112086,-0.48767 -0.243451,-1.01728 -0.643819,-1.3582 -0.159342,-0.13884 -0.327139,-0.22773 -0.49389,-0.29104 0.129281,-0.38341 0.222068,-0.76577 0.273402,-1.14653 H 16.04887 Z"
id="rect5320"
inkscape:connector-curvature="0" />
<path
style="fill:#c00810;fill-opacity:1;stroke:#ff0000;stroke-width:1.12888896;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
d="m 26.076578,232.05359 c -0.198736,-5.6e-4 -0.410011,0.009 -0.626181,0.0265 -5.463429,0.44 -4.011134,6.21636 -4.09222,8.14916 -0.06817,0.96573 -0.233426,1.78823 -0.635,2.65466 h 10.865552 c -0.548955,-0.84252 -0.947301,-1.75047 -0.93486,-2.89278 0.03066,-2.77829 0.311663,-7.93083 -4.577291,-7.9375 z m -4.224514,8.65187 v 0.27341 c -0.01998,-0.0966 -0.01961,-0.18687 0,-0.27341 z"
id="rect5322"
inkscape:connector-curvature="0" />
<g
transform="matrix(0.26458333,0,0,0.26458333,-96.22184,391.91056)"
id="g5337">
<g
id="g5341"
transform="matrix(0.73659472,0,0,0.73659472,114.96869,-150.52526)">
<g
style="fill:#101760;fill-opacity:1"
transform="rotate(120,399.74656,78.12011)"
id="g5361" />
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 10 KiB

352
style/luga.css Normal file
View File

@ -0,0 +1,352 @@
.partouter {
border-style: solid;
border-width: 1px;
border-color: #CCCCCC;
}
.partinner {
border-style: dotted;
border-width: 1px;
border-color: #CCCCCC;
}
.partheader {
background-color: #CCCCCC;
color: #FFFFFF;
font-size: 70%;
}
th {
text-align: left;
}
.subject {
font-size: 1.2em;
color: #000088;
}
.text-enriched {
font-family: monospace;
white-space: pre-wrap;
max-width: 60em;
}
.signature {
font-size: 0.8rem;
}
.dubious {
background-color: #888800;
}
.partinner.html {
max-width: 40rem;
}
p.fixed {
font-family: monospace;
white-space: pre;
margin: 0.2em;
font-size: 1rem;
font-size-adjust: 0.5625;
}
p.flowed {
font-family: monospace;
white-space: pre-wrap;
max-width: 60em;
margin: 0.2em;
font-size: 1rem;
font-size-adjust: 0.5625;
}
.text_plain_flowed blockquote {
border-left: solid 0.2em #004;
padding-left: 0.8em;
margin: 0em;
background: #EEF;
}
body {
--color-accent-light: #fecc04;
--color-accent-dark: #feb204;
--width-column-left: auto
}
@font-face {
font-family: "Linux Biolinum O";
font-style: normal;
src: url(LinBiolinum_R.otf);
}
@font-face {
font-family: "Linux Biolinum O";
font-style: italic;
src: url(LinBiolinum_RI.otf);
}
header {
background-color: var(--color-accent-light);
display: flex;
flex-direction: row;
justify-content: space-between;
align-items: flex-start;
border-radius: 0em 1em 0em 0em;
}
@media only screen and (min-width: 65rem) {
body {
display: grid;
grid-template-columns: var(--width-column-left) auto 20rem;
grid-template-rows: 3rem auto auto auto;
}
#logo {
grid-column: 1;
grid-row: 1 / span 2;
}
header {
grid-column: 2 / span 2;
grid-row: 1;
}
nav {
grid-column: 1;
grid-row: 3;
overflow: hidden;
position: relative; /* to establish formatting context */
}
article {
grid-column: 2;
grid-row: 2 / span 3;
}
footer {
grid-column: 3;
grid-row: 2 / span 3;
text-align: right;
}
}
@media only screen and (min-width: 40rem) and (max-width: 65rem) {
body {
display: grid;
grid-template-columns: var(--width-column-left) auto;
grid-template-rows: auto auto auto auto auto;
}
#logo {
grid-column: 1;
grid-row: 1 / span 2;
}
header {
grid-column: 2;
grid-row: 1;
}
nav {
grid-column: 1;
grid-row: 3;
}
article {
grid-column: 2;
grid-row: 2 / span 3;
}
footer {
grid-column: 1 / span 2;
grid-row: 5;
text-align: left;
}
}
@media only screen and (max-width: 40rem) {
body {
display: grid;
grid-template-columns: var(--width-column-left) auto;
grid-template-rows: auto auto auto auto auto;
}
#logo {
grid-column: 1;
grid-row: 1 / span 2;
width: 3rem;
}
header {
grid-column: 2;
grid-row: 1;
}
nav {
grid-column: 1;
grid-row: 3;
overflow: hidden;
width: 3em;
}
nav:hover {
overflow: visible;
z-index: 1;
width: auto;
}
article {
grid-column: 2;
grid-row: 2 / span 3;
}
footer {
grid-column: 1 / span 2;
grid-row: 5;
text-align: left;
}
}
nav a {
color: #008;
text-decoration: none;
padding-left: 0.5rem;
padding-right: 0.5rem;
}
nav a:focus {
border: 1px dotted #CCF;
}
nav a:hover {
text-decoration: underline;
}
nav a.current {
background-color: var(--color-accent-dark);
}
input.leftfield {
border: 1px black solid;
border-radius: 0.5rem 0px 0px 0.5rem;
padding: 0.3rem 0.5rem;
height: 1.0rem;
}
label.rightbutton {
border: 1px black solid;
border-radius: 0px 0.5rem 0.5rem 0px;
padding: 0.1rem;
background-color: #EEE;
position: relative;
top: 0.1em;
height: 1.4rem;
}
header form {
margin: 0.5em;
}
header button {
margin: 0.6em;
}
body {
font-family: "Linux Biolinum O";
font-size-adjust: 0.5625;
}
h1 {
margin: 0px;
padding-left: 0.5rem;
font-weight: normal;
}
footer {
/* background-color: var(--color-accent-dark); */
color: #888;
}
nav {
background-color: var(--color-accent-light);
border-radius: 0em 0em 0em 1em;
margin-right: 1rem;
margin-top: 1rem;
}
nav ul {
list-style-type: none;
padding-left: 0.7em;
background-color: var(--color-accent-light);
}
footer ul {
list-style-type: none;
padding-left: 1em;
}
p, h2, h3, dl {
max-width: 40rem;
padding-left: 0.5rem;
}
h2 {
border-top: solid 2px var(--color-accent-dark);
font-weight: normal;
font-size: 1.7rem;
}
h3 {
border-top: solid 1px var(--color-accent-light);
font-weight: normal;
font-size: 1.5rem;
}
.oneline {
white-space: nowrap;
}
nav input {
width: 8rem;
}
nav form {
padding: 0.5em;
}
a {
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
.event dl dt {
font-size: 0.8em;
margin-top: 0.5em;
}
dd p:first-child {
margin-top: 0;
}
table.thread {
white-space: nowrap;
}
pre {
font-size: monospace;
font-size: 1rem;
font-size-adjust: 0.5625;
}
.month {
text-align: right;
}
.threadmarker {
width: 1000px; height: 32px;
background-image: linear-gradient(to right, rgba(0, 0, 0, 0.2), rgba(0, 0, 0, 0));
}

33
templates/by_month.html Normal file
View File

@ -0,0 +1,33 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>
{{list}}: {{month.year}}-{{month.month}}
</title>
<link rel="stylesheet" href="../../../style/luga.css">
</head>
<body>
<h1> Mailinglist {{list}} {{month.year}}-{{month.month}}</h1>
<nav>
<ul>
<li>
<a href="../">nach Datum</a>
</li>
</ul>
</nav>
<article>
<ul>
{% for t in month.threads %}
<li>
<a href="../../../thread/{{t.threadid}}/">{{t.subject}}</a>
</li>
{% endfor %}
</ul>
</article>
</body>
</html>

View File

@ -5,20 +5,28 @@
<title>
{{list}}: {{subject}}
</title>
<link rel="stylesheet" href="../../style/debug.css">
<link rel="stylesheet" href="../../style/luga.css">
</head>
<body>
<h1>{{subject}}</h1>
<img id="logo" src="/style/logo3.svg">
<header>
<h1>{{subject}}</h1>
</header>
<nav>
<div class="threadmarker" style="position: absolute; top: {{threadindex * 32}}px">
</div>
{{threadhtml}}
</nav>
<table>
<article class="email">
Message #{{threadindex}}
<table>
<tr> <th>Message-Id </th> <td>{{message_id}} </td> </tr>
<tr> <th>From </th> <td>{{from}} </td> </tr>
<tr> <th>Date </th> <td>{{date}} </td> </tr>
</table>
{{bodyhtml}}
</table>
{{bodyhtml}}
</article>
</body>
</html>

39
templates/overview.html Normal file
View File

@ -0,0 +1,39 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>
{{list}}: Overview
</title>
<link rel="stylesheet" href="../../style/luga.css">
</head>
<body>
<header>
<h1>Mailinglist {{list}} nach Datum</h1>
</header>
<nav>
Hier sollte wohl ein Link zu einer Liste aller Listen
hinkommen
</nav>
<article>
{% for y in cal | dictsort(reverse=True) %}
<h2>{{y.0}}</h2>
<table>
<tr>
<th class="month">Monat</th>
<th>Längster Thread</th>
</tr>
{% for m in y.1 | dictsort(reverse=True) %}
<tr>
<th class="month"><a href="{{y.0}}/{{m.0}}/">{{m.0}}</a></th>
<td>{{m.1.longest_thread.subject}}</td>
</tr>
{% endfor %}
</table>
{% endfor %}
</article>
</body>
</html>

View File

@ -5,13 +5,13 @@
<title>
{{list}}: {{subject}}
</title>
<link rel="stylesheet" href="../../style/debug.css">
<link rel="stylesheet" href="../../style/luga.css">
</head>
<body>
<h1>{{subject}}</h1>
<nav>
<article>
{{threadhtml}}
</nav>
</article>
</body>
</html>