X-Git-Url: http://git.ieval.ro/?a=blobdiff_plain;f=lib%2FPlack%2FApp%2FGruntmaster%2FHTML.pm;h=d6f6c254d7c4fecfba70277e3202a07df1ada3fc;hb=57566ce2c8083b69a0d1664d504d0500be42e280;hp=1e0f7889870101de3c74c793ac537e51bfc99b98;hpb=7e158d3c2f023119628265310fdb8f85d9b1c29e;p=plack-app-gruntmaster.git diff --git a/lib/Plack/App/Gruntmaster/HTML.pm b/lib/Plack/App/Gruntmaster/HTML.pm index 1e0f788..d6f6c25 100644 --- a/lib/Plack/App/Gruntmaster/HTML.pm +++ b/lib/Plack/App/Gruntmaster/HTML.pm @@ -4,12 +4,20 @@ use parent qw/Exporter/; our @EXPORT = qw/render render_article/; use File::Slurp qw/read_file/; -use HTML::Seamstress; +use HTML::Element::Library; +use HTML::TreeBuilder; use POSIX qw//; use Data::Dumper qw/Dumper/; sub ftime ($) { POSIX::strftime '%c', localtime shift } -sub literal ($) { HTML::Element::Library::super_literal shift // '' } +sub literal ($) { + my ($html) = @_; + return unless $html; + my $b = HTML::TreeBuilder->new; + $b->ignore_unknown(0); + $b->parse($html); + HTML::Element::Library::super_literal $b->guts->as_HTML; +} sub HTML::Element::edit_href { my ($self, $sub) = @_; @@ -42,6 +50,14 @@ sub HTML::Element::namedlink { $self->replace_content($name); } +my %page_cache; +for () { + my ($tmpl, $lang) = m,tmpl/(\w+)\.(\w+),; + my $builder = HTML::TreeBuilder->new; + $builder->ignore_unknown(0); + $page_cache{$tmpl, $lang} = $builder->parse_file($_); +} + sub render { my ($tmpl, $lang, %args) = @_; $lang //= 'en'; @@ -50,22 +66,24 @@ sub render { } sub render_article { - my ($art, $lang) = @_; + my ($art, $lang, %args) = @_; $lang //= 'en'; my $title = read_file "a/$art.$lang.title"; + chomp $title; my $meat = read_file "a/$art.$lang"; - _render('skel', $lang, title => $title , meat => $meat) + _render('skel', $lang, title => $title , meat => $meat, %args) } sub _render { my ($tmpl, $lang, %args) = @_; - my $builder = HTML::Seamstress->new; - $builder->ignore_unknown(0); - my $tree = $builder->parse_file("tmpl/$tmpl.$lang"); + my $tree = $page_cache{$tmpl, $lang}->clone or die "No such template/language combination: $tmpl/$lang\n"; $tree = $tree->guts unless $tmpl eq 'skel'; $tree->defmap(smap => \%args); my $process = __PACKAGE__->can("process_$tmpl"); $process->($tree, %args) if $process; + $_->detach for $tree->look_down(static => $args{static} ? 'no' : 'yes'); + $_->attr('static', undef) for $tree->look_down(sub {$_[0]->attr('static')}); + $_->attr('smap', undef) for $tree->look_down(sub {$_[0]->attr('smap')}); $tree->as_HTML; } @@ -143,7 +161,6 @@ sub process_pb_entry { $tree->fid('owner')->edit_href(sub{s/owner_id/$args{owner}/}); $tree->fid('job_log')->edit_href(sub{s/problem_id/$args{id}/}); $tree->fid('solution')->edit_href(sub{s/problem_id/$args{id}/}); - $tree->fid('job_log')->edit_href(sub{$_ .= "&private=$args{private}"}) if $args{private}; $tree->content_handler( statement => literal $args{statement}, level => ucfirst $args{level}, @@ -163,6 +180,7 @@ sub process_pb_entry { $score->attr('data-value' => $args{value}); $tree->fid('countdown')->attr('data-stop' => $args{contest_stop}); } else { + $tree->fid('job_log')->edit_href(sub{$_ .= "&private=$args{private}"}) if $args{private}; $tree->fid('solution')->detach unless $args{solution}; $_->detach for $tree->fclass('rc'); # requires contest $tree->fid('solution_modal')->fclass('modal-body')->replace_content(literal $args{solution}); @@ -240,7 +258,7 @@ sub process_log { $tr->fclass('contest')->namedlink($data->{contest}, $data->{contest_name}) if $data->{contest}; $tr->fclass('contest')->replace_content('None') unless $data->{contest}; $tr->fclass('date')->replace_content(ftime $data->{date}); - $tr->fclass('source')->namedlink("$data->{id}.$data->{extension}", sprintf "%.2fKB %s", $data->{size}/1024, $data->{format}); + $tr->fclass('source')->namedlink("$data->{id}.$data->{extension}", sprintf "%.2fKB %s", $data->{size}/1024, Plack::App::Gruntmaster::FORMAT_EXTENSION()->{$data->{format}}); $tr->fclass('owner')->namedlink($data->{owner}, $data->{owner_name}); $tr->fclass('result_text')->replace_content($data->{result_text}); $tr->fclass('result_text')->attr(class => "r$data->{result}"); @@ -257,6 +275,10 @@ sub process_log { $elem->find('a')->edit_href(sub{s/$/&$str/}) if $str; } $tree->fclass('current')->replace_content("Page $args{current_page} of $args{last_page}"); + + my @detach; + push @detach, $args{args}{$_} ? $tree->fclass($_) : () for qw/problem contest owner/; + $_->detach for @detach; } sub process_st { @@ -292,3 +314,6 @@ sub process_ed { my @pb = map { @{$args{$_} // []} } qw/beginner easy medium hard/; $tree->fclass('well')->iter3(\@pb, $iter); } + +1; +__END__