]> git.gir.st - ttxd.git/blob - vt100.cgi
vt100 mode: teletext in the terminal
[ttxd.git] / vt100.cgi
1 #!/usr/bin/perl -X
2 # vim: foldmethod=marker
3
4 use strict;
5 use warnings;
6 use 5.010;
7 use utf8;use open qw/:std :utf8/;
8
9 use ORFText;
10 use Text::Wrap;
11 $Text::Wrap::columns = 60;
12
13 =pod
14 ORFText News for VT100 compatible terminals
15 intended to be called like so (query strings supported):
16 curl -s http://foo/ | less -R
17 TODO:
18 *
19 =cut
20
21 my @pages = (
22 101, 113 .. 125, # Politik: Österreich/EU
23 127 .. 134, # Politik: International
24 102,#136 .. 144, # Chronik
25 # 701 .. 709 # Bundesländer (W-NÖ-B-OÖ-S-T-V-K-St)
26 # 471 .. 478 # Nachrichten leicht verständlich
27 # 103, 146 .. 149 # Leute
28 # 104, 151 .. 159 # Wirtschaft
29 # 161,167,169, # Börse
30 # 170,172,174 # -"-
31 # 105, 203 .. 209, # Sport vom Tag
32 # 210 .. 259, # Sportarten
33 # 261 .. 278, # Wintersport & Großereignisse
34 # 107,110,191..198, # Show und Kultur
35 108,#461 .. 465, # Web/Media
36 # 468 .. 469, # Webtipps
37 # Special Flags:
38 "_noqna", # hide Q-and-A
39 );
40
41 if ($ENV{QUERY_STRING}) {
42 @pages = split /&/, ($ENV{QUERY_STRING} =~ s/(\d{3})-(\d{3})/${\join'&',$1..$2}/gr);
43 }
44
45 print "Content-type: text/plain\r\n\r\n";
46
47 # terminal output formatting {{{
48 my $BOLD = "\033[1m";
49 my $ITAL = "\033[3m";
50 my $GREY = "\033[2m";
51 my $INVR = "\033[7m";
52 my $RESET= "\033[0m";
53 $ORFText::REF_MARKUP = sub { my ($text, $ref) = @_;
54 return "$text<b>$ref</b>"; #Note: can't put escape sequences here, or they'll be dropped by ORFText::trim_ws()
55 };
56 sub format_table {
57 my $text = join("\n",map{s/[\x00-\x20]/ /gr}@{%{$_[0]}{raw}})=~s/^ ,,+//msr=~s/\n+$//r;
58 return {%$_, text=>$text};
59 }
60 sub format_vt100 { my %page = %{$_[0] or return};
61 no warnings 'numeric';
62 use List::Util qw[max];
63 sub ifdef { $_[1]? "$_[0]$_[1]":"" }
64 my $pagespec = substr($page{page},0,1) ."00/$page{page}_000".max($page{subpage},1);
65 my $text = $page{text};
66 $text =~ s{<p>}{\n}g;
67 $text =~ s{<i>(.*?)</i>}{${ITAL}$1${RESET}}g;
68 $text =~ s{<b>(.*?)</b>}{${BOLD}$1${RESET}}g;
69 $text =~ s{<h4>(.*?)</h4>}{\n${BOLD}$1${RESET}\n}g;
70 $text =~ s{\N{SOFT HYPHEN}}{}g;
71 $text =~ s{&lt;}{<}g;
72 $text =~ s{&amp;}{&}g;
73 $text = wrap('', '', $text);
74
75 return <<"HTML";
76 ${GREY}$page{page}${\ifdef('.',$page{subpage})}: ${RESET}${BOLD}$page{title}${RESET}
77 $text
78
79 HTML
80 }
81 # }}}
82 # headings {{{
83 my %headings = (
84 101 => "Politik: Österreich/EU",
85 127 => "Politik: International",
86 102 => "Chronik",
87 103 => "Leute",
88 104 => "Wirtschaft",
89 161 => "Börse",
90 105 => "Sport",
91 #203 => "Sport vom Tag",
92 #260 => "Wintersport und Großereignisse"
93 106 => "Fernsehen",
94 108 => "Multimedia",
95 107 => "Kultur &amp; Show", # XXX: this will show it multiple times!
96 110 => "Kultur &amp; Show",
97 109 => "Wetter",
98 471 => "Nachrichten leicht verständlich",
99 481 => "Nachrichten leichter verständlich",
100 701 => "Wien",
101 702 => "Niederösterreich",
102 703 => "Burgenland",
103 704 => "Oberösterreich",
104 705 => "Salzburg",
105 706 => "Tirol",
106 707 => "Vorarlberg",
107 708 => "Kärnten",
108 709 => "Steiermark",
109
110 );
111 # }}}
112 # html-head {{{
113 print <<'EOF';
114 ___ ___ ___ _____ _
115 / _ \| _ \ __|_ _|____ _| |_
116 | (_) | / _| | |/ -_) \ / _|
117 \___/|_|_\_| |_|\___/_\_\\__|
118
119 EOF
120 # }}}
121 my (@all, @nonempty);
122 page:foreach (grep/[0-9]/,@pages) {
123 print "${BOLD}$headings{$_}${RESET}\n\n" if $headings{$_};
124
125 my $pageno = $_;
126 push @all, $pageno;
127 foreach (glob "/run/ttxd/spool/2/${_}_*.vtx") {
128 my $file_age = time - (stat)[9];
129 next if $file_age > 300;
130
131 for (ORFText::html($_)) {
132 next unless $_; # fail req'd for $nonempty
133 if ("_noqna" ~~ @pages) { # hide Q-and-A
134 next page if %{$_}{text}=~m@[Aa]lle Fra.?gen/Antworten.+?500@;# /.?/ is a soft hyphen
135 }
136 $_ = format_table $_ if %$_{tabular};
137 print format_vt100 $_ ;
138 push @nonempty, $pageno;
139 }
140 }
141 }
142
143 my @empty = sort grep{not $_ ~~ @nonempty} @all;
144 my ($N, $n) = ('n'x!!$#empty, 'n'x!!$#all);
145 print "${GREY}Tafel$N @{[join ', ', @empty]} wurde$N nicht gefunden. ${RESET}" if @empty;
Imprint / Impressum