Blame


1 04eab9af 2022-08-25 op package GotMArc;
2 04eab9af 2022-08-25 op use strict;
3 04eab9af 2022-08-25 op use warnings;
4 04eab9af 2022-08-25 op use v5.32;
5 04eab9af 2022-08-25 op use Exporter;
6 04eab9af 2022-08-25 op
7 04eab9af 2022-08-25 op our @ISA = qw(Exporter);
8 de557185 2022-08-26 op our @EXPORT_OK = qw($logo san parse initpage endpage);
9 04eab9af 2022-08-25 op
10 04eab9af 2022-08-25 op our $logo = <<'EOF';
11 04eab9af 2022-08-25 op <a href="https://gameoftrees.org" target="_blank">
12 04eab9af 2022-08-25 op <img srcset='/got-tiny.png, /got-tiny@2x.png 2x'
13 04eab9af 2022-08-25 op src='/got-tiny.png'
14 04eab9af 2022-08-25 op width='64' height='39'
15 04eab9af 2022-08-25 op alt='"GOT", but the "O" is a cute, smiling sun' /></a>
16 04eab9af 2022-08-25 op EOF
17 04eab9af 2022-08-25 op
18 04eab9af 2022-08-25 op sub san {
19 04eab9af 2022-08-25 op my $str = shift;
20 04eab9af 2022-08-25 op $str =~ s/&/\&amp;/g;
21 04eab9af 2022-08-25 op $str =~ s/</\&lt;/g;
22 04eab9af 2022-08-25 op $str =~ s/>/\&gt;/g;
23 04eab9af 2022-08-25 op return $str;
24 04eab9af 2022-08-25 op }
25 04eab9af 2022-08-25 op
26 de557185 2022-08-26 op sub ssan {
27 de557185 2022-08-26 op my $str = shift;
28 de557185 2022-08-26 op $str =~ s/\s+/ /g;
29 de557185 2022-08-26 op $str =~ s/\s+$//;
30 de557185 2022-08-26 op return san($str);
31 de557185 2022-08-26 op }
32 de557185 2022-08-26 op
33 2064ca3f 2022-08-25 op sub mid2path {
34 2064ca3f 2022-08-25 op my $mid = shift;
35 2064ca3f 2022-08-25 op $mid =~ s,_,__,g;
36 2064ca3f 2022-08-25 op $mid =~ s,/,_,g;
37 2064ca3f 2022-08-25 op return $mid;
38 2064ca3f 2022-08-25 op }
39 2064ca3f 2022-08-25 op
40 de557185 2022-08-26 op sub parse {
41 de557185 2022-08-26 op my ($indent, $fname, $mid, $date, $from, $subj) = m{
42 de557185 2022-08-26 op ^([^-]*)- # the indent level
43 de557185 2022-08-26 op ([^ ]+)\s # filename
44 de557185 2022-08-26 op <([^>]+)> # message id
45 de557185 2022-08-26 op (\d{4}-\d\d-\d\d[ ]\d\d:\d\d) # date
46 de557185 2022-08-26 op <([^>]+)> # from
47 de557185 2022-08-26 op (.*) # subject
48 de557185 2022-08-26 op }x or die "can't parse: $_";
49 de557185 2022-08-26 op
50 de557185 2022-08-26 op my $level = length($indent);
51 de557185 2022-08-26 op $level = 10 if $indent =~ m/\.\.\d+\.\./;
52 de557185 2022-08-26 op
53 de557185 2022-08-26 op $mid = mid2path($mid);
54 de557185 2022-08-26 op $from = ssan($from);
55 de557185 2022-08-26 op $subj = ssan($subj);
56 de557185 2022-08-26 op
57 de557185 2022-08-26 op return ($level, $fname, $mid, $date, $from, $subj);
58 de557185 2022-08-26 op }
59 de557185 2022-08-26 op
60 04eab9af 2022-08-25 op my $hdr = do {
61 04eab9af 2022-08-25 op local $/ = undef;
62 04eab9af 2022-08-25 op open my $fh, "<", "head.html"
63 04eab9af 2022-08-25 op or die "can't open head.html: $!";
64 04eab9af 2022-08-25 op <$fh>;
65 04eab9af 2022-08-25 op };
66 04eab9af 2022-08-25 op
67 04eab9af 2022-08-25 op sub initpage {
68 04eab9af 2022-08-25 op my ($fh, $title) = @_;
69 04eab9af 2022-08-25 op say $fh $hdr =~ s/TITLE/$title/r;
70 04eab9af 2022-08-25 op }
71 04eab9af 2022-08-25 op
72 04eab9af 2022-08-25 op my $foot = do {
73 04eab9af 2022-08-25 op local $/ = undef;
74 04eab9af 2022-08-25 op open my $fh, "<", "foot.html"
75 04eab9af 2022-08-25 op or die "can't open foot.html: $!";
76 04eab9af 2022-08-25 op <$fh>;
77 04eab9af 2022-08-25 op };
78 04eab9af 2022-08-25 op
79 04eab9af 2022-08-25 op sub endpage {
80 04eab9af 2022-08-25 op my $fh = shift;
81 04eab9af 2022-08-25 op say $fh $foot;
82 04eab9af 2022-08-25 op }
83 04eab9af 2022-08-25 op
84 04eab9af 2022-08-25 op 1;