diff options
author | Eric Wong <e@80x24.org> | 2015-08-24 02:25:46 +0000 |
---|---|---|
committer | Eric Wong <e@80x24.org> | 2015-08-24 09:29:00 +0000 |
commit | 71040e5ff8a68eb0cfaf20c273e227cdceb9dc23 (patch) | |
tree | 6dcdeff527049c7c98fa7ec347b0afb26eae41db /lib | |
parent | 94f2f2bd84a3569912cc27b42c21b67917333f58 (diff) | |
download | public-inbox-71040e5ff8a68eb0cfaf20c273e227cdceb9dc23.tar.gz |
Using hash means we no longer have to document and remember what every field does. The original array form was insane premature optimization and crazy. Who wrote that? Oh wait, I was on drugs :<
Diffstat (limited to 'lib')
-rw-r--r-- | lib/PublicInbox/Feed.pm | 12 | ||||
-rw-r--r-- | lib/PublicInbox/View.pm | 37 | ||||
-rw-r--r-- | lib/PublicInbox/WWW.pm | 8 |
3 files changed, 32 insertions, 25 deletions
diff --git a/lib/PublicInbox/Feed.pm b/lib/PublicInbox/Feed.pm index f4d19e02..969fc110 100644 --- a/lib/PublicInbox/Feed.pm +++ b/lib/PublicInbox/Feed.pm @@ -89,7 +89,12 @@ sub emit_html_index { $srch and $topics = [ [], {} ]; my (undef, $last) = each_recent_blob($ctx, sub { my ($path, $commit, $ts, $u, $subj) = @_; - $state ||= [ undef, {}, $commit, 0 ]; + $state ||= { + ctx => $ctx, + seen => {}, + first_commit => $commit, + anchor_idx => 0, + }; if ($srch) { add_topic($git, $srch, $topics, $path, $ts, $u, $subj); @@ -119,9 +124,8 @@ sub nav_footer { my $old_r = $cgi->param('r'); my $head = ' '; my $next = ' '; - # $state = [ undef, {}, $first_commit, $last_anchor ]; - my $first = $state->[2]; - my $anchor = $state->[3]; + my $first = $state->{first_commit}; + my $anchor = $state->{anchor_idx}; if ($last) { $next = qq!<a\nhref="?r=$last">next</a>!; diff --git a/lib/PublicInbox/View.pm b/lib/PublicInbox/View.pm index cf582688..64a2086d 100644 --- a/lib/PublicInbox/View.pm +++ b/lib/PublicInbox/View.pm @@ -25,16 +25,17 @@ my $enc_utf8 = find_encoding('UTF-8'); # public functions: sub msg_html { - my ($class, $mime, $full_pfx, $footer, $srch) = @_; + my ($ctx, $mime, $full_pfx, $footer) = @_; if (defined $footer) { $footer = "\n" . $footer; } else { $footer = ''; } + my $srch = $ctx->{srch} if $ctx; headers_to_html_header($mime, $full_pfx, $srch) . multipart_text_as_html($mime, $full_pfx) . '</pre><hr /><pre>' . - html_footer($mime, 1, $full_pfx, $srch) . + html_footer($mime, 1, $full_pfx, $ctx) . $footer . '</pre></body></html>'; } @@ -46,11 +47,11 @@ sub feed_entry { } # this is already inside a <pre> -# state = [ time, seen = {}, first_commit, page_nr = 0 ] sub index_entry { my ($fh, $mime, $level, $state) = @_; - my ($srch, $seen, $first_commit) = @$state; - my $midx = $state->[3]++; + my $midx = $state->{anchor_idx}++; + my $ctx = $state->{ctx}; + my $srch = $ctx->{srch}; my ($prev, $next) = ($midx - 1, $midx + 1); my $part_nr = 0; my $enc = enc_for($mime->header("Content-Type")); @@ -59,6 +60,7 @@ sub index_entry { my $mid_raw = $header_obj->header('Message-ID'); my $id = anchor_for($mid_raw); + my $seen = $state->{seen}; $seen->{$id} = "#$id"; # save the anchor for later my $mid = PublicInbox::Hval->new_msgid($mid_raw); @@ -68,8 +70,8 @@ sub index_entry { $from = PublicInbox::Hval->new_oneline($from)->as_html; $subj = PublicInbox::Hval->new_oneline($subj)->as_html; - my $root_anchor = $seen->{root_anchor}; my $more = 'permalink'; + my $root_anchor = $state->{root_anchor}; my $path = $root_anchor ? '../' : ''; my $href = $mid->as_href; my $irt = $header_obj->header('In-Reply-To'); @@ -81,7 +83,7 @@ sub index_entry { } else { $t_anchor = ''; } - if (defined $srch) { + if ($srch) { $subj = "<a\nhref=\"${path}t/$href.html#u\">$subj</a>"; } if ($root_anchor && $root_anchor eq $id) { @@ -121,7 +123,7 @@ sub index_entry { my $txt = "${path}m/$href.txt"; $rv = "\n<a\nhref=\"$mhref\">$more</a> <a\nhref=\"$txt\">raw</a> "; - $rv .= html_footer($mime, 0); + $rv .= html_footer($mime, 0, undef, $ctx); if (defined $irt) { unless (defined $anchor) { @@ -157,13 +159,18 @@ sub emit_thread_html { return missing_thread($cb) if $nr == 0; my $fh = $cb->([200,['Content-Type'=>'text/html; charset=UTF-8']]); my $th = thread_results($msgs); - my $state = [ $srch, { root_anchor => anchor_for($mid) }, undef, 0 ]; + my $state = { + ctx => $ctx, + seen => {}, + root_anchor => anchor_for($mid), + anchor_idx => 0, + }; { require PublicInbox::GitCatFile; my $git = PublicInbox::GitCatFile->new($ctx->{git_dir}); thread_entry($fh, $git, $state, $_, 0) for $th->rootset; } - my $final_anchor = $state->[3]; + my $final_anchor = $state->{anchor_idx}; my $next = "<a\nid=\"s$final_anchor\">"; $next .= $final_anchor == 1 ? 'only message in' : 'end of'; $next .= " thread</a>, back to <a\nhref=\"../\">index</a>\n"; @@ -401,7 +408,7 @@ sub headers_to_html_header { } sub html_footer { - my ($mime, $standalone, $full_pfx, $srch) = @_; + my ($mime, $standalone, $full_pfx, $ctx) = @_; my %cc; # everyone else my $to; # this is the From address @@ -429,6 +436,7 @@ sub html_footer { my $cc = uri_escape_utf8(join(',', sort values %cc)); my $href = "mailto:$to?In-Reply-To=$irt&Cc=${cc}&Subject=$subj"; + my $srch = $ctx->{srch} if $ctx; my $idx = $standalone ? " <a\nhref=\"../\">index</a>" : ''; if ($idx && $srch) { $irt = $mime->header('In-Reply-To') || ''; @@ -541,18 +549,13 @@ sub thread_html_head { sub thread_entry { my ($fh, $git, $state, $node, $level) = @_; return unless $node; - # $state = [ $search_res, $seen, undef, 0 (msg_nr) ]; - # $seen is overloaded with 3 types of fields: - # 1) "root_anchor" => anchor_for(Message-ID), - # 2) seen subject hashes: sha1(subject) => 1 - # 3) anchors hashes: "#$sha1_hex" (same as $seen in index_entry) if (my $mime = $node->message) { # lazy load the full message from mini_mime: my $path = mid2path(mid_clean($mime->header('Message-ID'))); $mime = eval { Email::MIME->new($git->cat_file("HEAD:$path")) }; if ($mime) { - if ($state->[3] == 0) { + if ($state->{anchor_idx} == 0) { $fh->write(thread_html_head($mime)); } index_entry($fh, $mime, $level, $state); diff --git a/lib/PublicInbox/WWW.pm b/lib/PublicInbox/WWW.pm index 86c64fb6..eeae3d32 100644 --- a/lib/PublicInbox/WWW.pm +++ b/lib/PublicInbox/WWW.pm @@ -176,9 +176,9 @@ sub get_mid_html { my $foot = footer($ctx); require Email::MIME; my $mime = Email::MIME->new($x); - my $srch = searcher($ctx); + searcher($ctx); [ 200, [ 'Content-Type' => 'text/html; charset=UTF-8' ], - [ PublicInbox::View->msg_html($mime, $pfx, $foot, $srch) ] ]; + [ PublicInbox::View::msg_html($ctx, $mime, $pfx, $foot) ] ]; } # /$LISTNAME/f/$MESSAGE_ID.html -> HTML content (fullquotes) @@ -190,9 +190,9 @@ sub get_full_html { my $foot = footer($ctx); require Email::MIME; my $mime = Email::MIME->new($x); - my $srch = searcher($ctx); + searcher($ctx); [ 200, [ 'Content-Type' => 'text/html; charset=UTF-8' ], - [ PublicInbox::View->msg_html($mime, undef, $foot, $srch)] ]; + [ PublicInbox::View::msg_html($ctx, $mime, undef, $foot)] ]; } # /$LISTNAME/t/$MESSAGE_ID.html |