]>
git.gir.st - ttxd.git/blob - index.cgi
2 # vim: foldmethod=marker
7 use utf8
;use open qw
/:std :utf8/;
12 TODO: %headings won't register when topstory is missing (->sportarten)
13 this is version 2.0 of ttxd
14 values for query string/cookie:
15 - special flags start with _
16 - _noqna: hide "fragen/antworten" (set by default)
17 - numeric: pagenumbers
20 my $pages = $ENV{HTTP_COOKIE
} // join '&', (
21 101, 113 .. 125, # Politik: Österreich/EU
22 127 .. 134, # Politik: International
23 102,#136 .. 144, # Chronik
24 # 701 .. 709 # Bundesländer (W-NÖ-B-OÖ-S-T-V-K-St)
25 # 471 .. 478 # Nachrichten leicht verständlich
26 # 103, 146 .. 149 # Leute
27 # 104, 151 .. 159 # Wirtschaft
28 # 161,167,169, # Börse
30 # 105, 203 .. 209, # Sport vom Tag
31 # 210 .. 259, # Sportarten
32 # 261 .. 278, # Wintersport & Großereignisse
33 # 107,110,191..198, # Show und Kultur
34 108,#461 .. 465, # Web/Media
35 # 468 .. 469, # Webtipps
37 "_noqna", # hide Q-and-A
40 my @pages = split /&/, ($ENV{QUERY_STRING
} =~ s/(\d{3})-(\d{3})/${\join'&',$1..$2}/gr) // $pages;
42 # pages from query string won't affect cookie
43 #print "Set-Cookie: $pages; Max-Age=2147483647\r\n";
44 print "Content-type: text/html\r\n\r\n";
47 $ORFText::REF_MARKUP = sub {
48 return qq{<a href
="?$_[1]" data-page
="$_[1]" class="ttxref" target
="_blank">$_[0]<b
>$_[1]</b></a>}
51 my $text = join("\n",map{s/[\x00-\x20]/ /gr}@{%{$_[0]}{raw
}})=~s/^ ,,+//msr=~s/\n+$//r;
52 return {%$_, text
=>"<pre>$text</pre>"};
54 sub format_html
{ my %page = %{$_[0] or return};
55 no warnings
'numeric';
56 use List
::Util qw
[max
];
57 sub ifdef
{ $_[1]?
"$_[0]$_[1]":"" }
58 my $pagespec = substr($page{page
},0,1) ."00/$page{page}_000".max
($page{subpage
},1);
62 <h3 title='@{[join' - ', $page{ressort}||(), $page{subressort}||(), $page{topic}||()]}'>
63 <a id="page-$page{page}">$page{page}${\ifdef('.',$page{subpage})}:</a>
67 <a title="Permanentlink zum Teilen erstellen" href="https://web.archive.org/save/http://text.orf.at/$pagespec.htm" class="archive" target="_blank">➤</a>
68 <p class=advert title="Werbung">${\($page{advert}=~s|\b(\d{3})\b|<a href="?$1" target="_blank">$1</a>|gr)}</p>
75 101 => "Politik: Österreich/EU",
76 127 => "Politik: International",
82 #203 => "Sport vom Tag",
83 #260 => "Wintersport und Großereignisse"
86 107 => "Kultur & Show", # XXX: this will show it multiple times!
87 110 => "Kultur & Show",
89 471 => "Nachrichten leicht verständlich",
90 481 => "Nachrichten leichter verständlich",
92 702 => "Niederösterreich",
94 704 => "Oberösterreich",
107 <meta charset='utf-8'>
108 <meta name='viewport' content='width=device-width, initial-scale=1'>
109 <title>ORFText News</title>
121 h1{font-family: sans-serif}
122 h1, b { color:white; }
123 body h2 { font-size: larger; }
124 a:link, a:visited { color: white; }
125 a:hover, a:active { color: #eeeeee; }
152 text-decoration:none;
154 vertical-align:middle;
160 text-decoration:none;
169 background: lightgrey;
174 pre { /*sporttablellen*/
179 display: inline-block;
180 vertical-align: text-bottom;
184 document.addEventListener("DOMContentLoaded", function(event) {
185 document.querySelectorAll("a.ttxref").forEach(e=>{
186 var n = e.getAttribute("data-page");
187 if(document.querySelector("#page-"+n) !== null) {
196 <h1><a href="?" title="zur Startseite">ORFText News</a></h1>
199 my (@all, @nonempty);
200 page
:foreach (grep/[0-9]/,@pages) {
201 print "<h2>$headings{$_}</h2>\n" if $headings{$_};
205 foreach (glob "/run/ttxd/spool/2/${_}_*.vtx") {
206 my $file_age = time - (stat)[9];
207 next if $file_age > 300;
209 for (ORFText
::html
($_)) {
210 next unless $_; # fail req'd for $nonempty
211 if ("_noqna" ~~ @pages) { # hide Q-and-A
212 next page
if %{$_}{text
}=~m
@[Aa
]lle Fra
.?gen
/Antworten.+?500@;# /.?
/ is a soft hyphen
214 $_ = format_table
$_ if %$_{tabular
};
215 print format_html
$_ ;
216 push @nonempty, $pageno;
221 sub subtr
{ return grep{not%{{map{$_=>1}@{$_[1]}}}{$_}} @{$_[0]}; }
222 sub uniq
{ return sort keys %{{@_}}; }
223 my @empty = uniq subtr
[sort @all], [@nonempty]; # WARN: uniq breaks when sort is removed!
224 my ($N, $n) = ('n'x
!!$#empty, 'n'x
!!$#all);
225 print "<p class=errors>";
226 print "<small>Tafel$N @{[join ', ', @empty]} wurde$N nicht gefunden. </small>" if @empty;
229 print "<section class=links>";
230 print "<hr><p>".join ' | ', (
231 '<a href="?'.(join '&', 101, '113-125', '127-134').'">Politik</a>',
232 '<a href="?'.(join '&', 102, '136-143' ).'">Chronik</a>',
233 '<a href="?'.(join '&', '701-709' ).'">Bundesländer</a>',
234 '<a href="?'.(join '&', '471-478', '481-488').'">einfache Sprache</a>',
235 '<a href="?'.(join '&', 103, '146-149' ).'">Leute</a>',
236 '<a href="?'.(join '&', 108, '461-465' ).'">Multimedia</a>',
237 '<a href="?'.(join '&', 110, 107, '191-198' ).'">Kultur & Show</a>',
238 '<a href="?'.(join '&', 104, '151-159' ).'">Wirtschaft</a>',
239 '<a href="?'.(join '&', 161, 167, 169,170,172,174).'">Börse</a>',
240 '<a href="?'.(join '&', 105, '203-209' ).'">Sport</a>',
241 '<a href="?'.(join '&', '101-110' ).'">Topstories</a>',