commit 0fc800b6dd2de7e042e3d0c8a8c6a1d4edba9c30
parent 7ecdaf6fcc09f025e48095870217cb94418538f1
Author: Kyle Milz <kyle@getaddrinfo.net>
Date: Sat, 25 Apr 2015 01:07:00 -0600
pc_html: first steps at special character handling
Diffstat:
M | pc_html | | | 92 | +++++++++++++++++++++++++++++++++---------------------------------------------- |
M | tt/coarse_list.tt | | | 59 | ++++++++++++++++++++--------------------------------------- |
M | tt/fine_list.tt | | | 47 | ++++++++++++++++++++++------------------------- |
M | tt/index.tt | | | 41 | +++++++++++++++++++---------------------- |
M | tt/product.tt | | | 44 | ++++++++++++++++++++++++-------------------- |
M | tt/summary.tt | | | 5 | ----- |
6 files changed, 123 insertions(+), 165 deletions(-)
diff --git a/pc_html b/pc_html
@@ -24,14 +24,6 @@ $| = 1 if ($args{v});
my $cfg = get_config();
my $dbh = get_dbh($cfg->{http}, undef, $args{v});
-my $clause = $args{a} ? "" : "where svg_stale = 1";
-my ($n) = $dbh->selectrow_array("select count(*) from products $clause");
-if ($n < 1) {
- print "info: nothing stale\n" if ($args{v});
- $dbh->disconnect();
- exit;
-}
-
my $work_dir = $cfg->{http}{chroot} . $cfg->{http}{htdocs};
my $svg_dir = $work_dir . "/svg";
print "info: work, svg dirs $work_dir\{,svg\}\n" if ($args{v});
@@ -131,27 +123,27 @@ generate_folder($stale_list, $types, $products_fine, "Types", $coarse, $summary)
#
# products
#
+print "info: products: " if ($args{v});
+
$stale_clause = $args{a} ? "" : "where svg_stale = 1";
my $sql = "select * from products $stale_clause";
my $products = $dbh->selectall_hashref($sql, "part_num");
-$n = scalar keys %$products;
-print "info: products: " if ($args{v});
+my $n = scalar keys %$products;
while (my ($part_num, $row) = each %$products) {
- my $part_num_lc = lc($part_num);
- my $manufacturer_lc = lc($row->{manufacturer});
+ my $part_link = linkify($part_num);
+ my $manuf_link = linkify($row->{manufacturer});
spin() if ($args{v});
$row->{description} =
get_description($row->{manufacturer}, $row->{part_num});
$template->process("product.tt", $row,
- "products/$manufacturer_lc/$part_num_lc.html")
+ "products/$manuf_link/$part_link.html")
|| die "template: " . $template->error() . "\n";
}
print "\b$n processed\n" if ($args{v});
-
#
# index
#
@@ -168,78 +160,73 @@ my ($p, $m) = $dbh->selectrow_array($sql);
$sql = "select count(*) from retailers";
my ($r) = $dbh->selectrow_array($sql);
-my $vars = {
- nret => $r, nmanuf => $m, nprod => $p, nnew => scalar @$new,
- news => $new, nupd => scalar @$upd, upds => $upd
-};
+my $vars = { nret => $r, nmanuf => $m, nprod => $p, news => $new, upds => $upd };
print "info: index: $p products, $m manufacturers, $r retailers\n" if ($args{v});
$template->process("index.tt", $vars, "index.html")
or die "template: " . $template->error() . "\n";
-
#
# svg
#
+print "info: svg: " if ($args{v});
+
my ($left, $center, $right, $top, $middle, $bottom) = (3, 957, 40, 15, 150, 20);
my $width = $right + $center + $left;
my $height = $top + $middle + $bottom;
-my $where_clause = $args{a} ? "" : "where svg_stale = 1";
-$sql = "select manufacturer, part_num from products $where_clause";
-my $parts_sth = $dbh->prepare($sql);
-
$sql = "select distinct retailer from prices where part_num = ? and manufacturer = ?";
my $retailer_sth = $dbh->prepare($sql);
-$sql = "select date, price from prices where " .
- "part_num = ? and retailer = ? order by date";
+$sql = qq{select date, price from prices where part_num = ? and retailer = ?
+ order by date};
my $point_sth = $dbh->prepare($sql);
-$parts_sth->execute();
-print "info: svg: " if ($args{v});
+$sql = qq{select min(date), max(date), min(price), max(price) from prices
+ where manufacturer = ? and part_num = ?};
+my $extremes_sth = $dbh->prepare($sql);
+
+$sql = "select url, color from retailers where name = ?";
+my $ret_info_sth = $dbh->prepare($sql);
+
my ($raw_total, $rendered_total, $points, $series) = (0, 0, 0, 0);
-while (my ($manufacturer, $part_num) = $parts_sth->fetchrow_array()) {
+
+my $where_clause = $args{a} ? "" : "where svg_stale = 1";
+my $parts_sql = "select manufacturer, part_num from products $where_clause";
+for (@{$dbh->selectall_arrayref($parts_sql)}) {
+ my ($manufacturer, $part_num) = @$_;
+
$raw_total++;
spin() if ($args{v});
- my %series;
- $sql = qq{select min(date), max(date), min(price), max(price)
- from prices where manufacturer = ? and part_num = ?};
my ($x_min, $x_max, $y_min, $y_max) =
- $dbh->selectrow_array($sql, undef, $manufacturer, $part_num);
+ $dbh->selectrow_array($extremes_sth, undef, $manufacturer, $part_num);
next unless (defined $x_min);
- # each series on the chart represents a retailers prices
+ my %series;
$retailer_sth->execute($part_num, $manufacturer);
while (my ($retailer) = $retailer_sth->fetchrow_array()) {
- $sql = "select url, color from retailers where name = ?";
- my ($url, $color) = $dbh->selectrow_array($sql, undef, $retailer);
+ my ($url, $color) =
+ $dbh->selectrow_array($ret_info_sth, undef, $retailer);
# xlink:href's don't like raw ampersands
$url =~ s/&/&/g;
$series{$retailer}{url} = $url;
$series{$retailer}{color} = $color;
-
- $point_sth->execute($part_num, $retailer);
- $series{$retailer}{data} = $point_sth->fetchall_arrayref();
+ $series{$retailer}{data} =
+ $dbh->selectall_arrayref($point_sth, undef, $part_num, $retailer);
$points += scalar @{$series{$retailer}{data}};
$series++;
}
my $svg = make_svg(\%series, $x_min, $x_max, $y_min, $y_max, $part_num);
- # all links lower case
- my $part_num_cased = $part_num;
- $part_num = lc($part_num);
+ my $manufacturer_dir = linkify($manufacturer);
+ my $part_link = linkify($part_num);
+ make_path("$svg_dir/$manufacturer_dir", { verbose => $args{v} });
- # giant hack, if the part number has / in it, make some directories
- if ($part_num =~ /\//) {
- my $needed_dirs = substr($part_num, 0, rindex($part_num, '/'));
- make_path("$svg_dir/$needed_dirs", { verbose => $args{v} });
- }
- open my $svg_fh, ">", "$svg_dir/$part_num.svg" or
- die "couldn't open $svg_dir/$part_num: $!";
+ my $svg_path = "$svg_dir/$manufacturer_dir/$part_link.svg";
+ open my $svg_fh, ">", "$svg_path" or die "couldn't open $svg_path: $!";
# XXX: not sure how to add this programatically, hack around for now
my @buf = split("\n", $svg->xmlify);
@@ -259,7 +246,6 @@ $dbh->do("update products set svg_stale = 0");
$dbh->disconnect();
-
#
# generate an entire tree of html structure
#
@@ -314,7 +300,7 @@ sub linkify
my $type = shift;
my $type_link = lc($type);
- $type_link =~ s/ /_/;
+ $type_link =~ s/[ #\/]/_/g;
return $type_link;
}
@@ -341,7 +327,6 @@ sub get_description
return $best;
}
-
#
# make a new svg with provided coordinate and label data
#
@@ -414,9 +399,6 @@ sub make_svg
my $retailer_id = lc($retailer);
$retailer_id =~ s/ /_/;
- my $url = $values->{url};
- my $color = $values->{color};
-
my (@xs, @ys, @pts);
for (@{$values->{data}}) {
my ($x, $y) = @$_;
@@ -436,6 +418,8 @@ sub make_svg
$defs->tag("path", "d" => $d, id => "path_$retailer_id");
}
+ my ($url, $color) = ($values->{url}, $values->{color});
+
# the line, points, and label can be grouped under one anchor
my $anchor = $svg->anchor(-href => $url . $part_num,
target => "new_window");
diff --git a/tt/coarse_list.tt b/tt/coarse_list.tt
@@ -1,59 +1,40 @@
[% WRAPPER wrapper.tt %]
-[% PERL %]
- use Lingua::EN::Inflect qw(PL);
- # all url references are lower case
- my $dir_prefix = lc($stash->get("name"));
- $stash->set("dir_prefix", $dir_prefix);
-
- my $total = scalar(keys %{$stash->get("list")});
- $stash->set("num", $total);
- $stash->set("i", -1);
- $stash->set("boundary", POSIX::ceil($total / 3));
-[% END %]
- <h1>[% name %] ([% num %])</h1>
+ <h1>[% name %] ([% list.keys.size %])</h1>
+ <div class="thirds_column">
+ <ul>
+ [% i = 0 %]
[% FOREACH item IN list.keys.sort %]
+ [% item_link = item.lower.replace('[ #\/]', '_') %]
[% PERL %]
- # all url references are lower case
- my $link = lc $stash->get("item");
- $link =~ s/ /_/;
- $stash->set("link", $link);
-
- my $i = $stash->get("i");
- $stash->set("i", ++$i);
-
+ my $link = $stash->get("item_link");
my ($logo) = glob("logo/$link.*");
$stash->set("logo", $logo);
[% END %]
- [% IF (i % boundary) == 0 %]
- [% IF i != 0 %]
- </ul>
- </div>
- [% END %]
+
+ [% i = i + 1 %]
+ [% IF (i % (list.keys.size / 3)) == 0 %]
+ </ul>
+ </div>
<div class="thirds_column">
<ul>
[% END %]
<li><div class="list_item">
- <a href="/[% dir_prefix %]/[% link %].html">
- <img alt="[% item %]" class="[% dir_prefix %]"
+ [% name_link = name.lower.replace('[ #\/]', '_') %]
+ <a href="/[% name_link %]/[% item_link %].html">
+ <img alt="[% item %]" class="[% name_link %]"
src="/[% logo %]" />
- </a>
+ </a><br>
- <br><div class="breakdown">
+ <div class="breakdown">
[% FOREACH type IN list.$item.keys %]
- [% PERL %]
- my $type = $stash->get("type");
- my $count = $stash->get("list.\$item.\$type.count");
- my $type_link = lc $type;
- $type_link =~ s/ /_/;
- $stash->set("type_link", $type_link);
- $stash->set("type_pl", PL($type, $count));
- [% END %]
[% list.$item.$type.count %]
- <a href="/[% dir_prefix %]/[% link %]/[% type_link %].html">
- [% type_pl %]</a>,
+
+ [% type_link = type.lower.replace('[ #\/]', '_') %]
+ <a href="/[% name_link %]/[% item_link %]/[% type_link %].html">
+ [% type %]</a>,
[% END %]
</div></div>
[% END %]
diff --git a/tt/fine_list.tt b/tt/fine_list.tt
@@ -1,40 +1,37 @@
[% WRAPPER wrapper.tt %]
+[% name_link = name.lower.replace('[ #\/]', '_') %]
[% PERL %]
- my $name_lc = lc($stash->get("name"));
- $stash->set("name_lc", $name_lc);
-
- my $num = scalar @{$stash->get("products")};
- $stash->set("num", $num);
-
- $name_lc =~ s/ /_/;
- my ($logo) = glob("logo/$name_lc*");
+ my $name_html = $stash->get("name_link");
+ my ($logo) = glob("logo/$name_html*");
$stash->set("logo", $logo);
[% END %]
<h1><img alt="[% name %]" class="logo_small" src="/[% logo %]"/>
- [% num %] [% type %]</h1>
- [% FOREACH product IN products %]
- [% PERL %]
- my $manufacturer = lc $stash->get("product.0");
- $stash->set("manufacturer_lc", $manufacturer);
- my $part_num = $stash->get("product.1");
- $stash->set("part_lc", lc($part_num));
+ [% products.size %] [% type %]</h1>
- my ($logo) = glob("logo/$manufacturer*");
- $stash->set("logo", $logo);
- [% END %]
+ [% FOREACH product IN products %]
<div class="product">
- <!-- make the manufacturer logo into a link -->
- <a href="/manufacturers/[% manufacturer_lc %].html">
+ [% manuf_html = product.0.lower.replace('[ #\/]', '_') %]
+ [% part_link = product.1.lower.replace('[ #\/]', '_') %]
+
+ [% PERL %]
+ my $manuf_html = $stash->get("manuf_html");
+ my ($logo) = glob("logo/$manuf_html*");
+ $stash->set("logo", $logo);
+ [% END %]
+
+ [%# make the manufacturer logo into a link %]
+ <a href="/manufacturers/[% manuf_html %].html">
<img alt="[% product.0 %]" class="logo_small"
src="/[% logo %]"/></a>
- <!-- display the description -->
+ [%# display the description %]
[% product.2 %]
- <!-- inline link to the products page, in parenthesis -->
- (<a href="/products/[% manufacturer_lc %]/[% part_lc %].html">[% product.1 %]</a>)<br>
- <!-- show the chart -->
- <object data="/svg/[% part_lc %].svg" type="image/svg+xml">
+ [%# inline link to the products page, in parenthesis %]
+ (<a href="/products/[% manuf_html %]/[% part_link %].html">[% product.1 %]</a>)<br>
+
+ [%# show the chart %]
+ <object data="/svg/[% manuf_html %]/[% part_link %].svg" type="image/svg+xml">
</object>
</div>
[% END %]
diff --git a/tt/index.tt b/tt/index.tt
@@ -35,36 +35,33 @@
</div>
<div class="column">
- <h1>New Products ([% nnew %])</h1>
+ <h1>New Products ([% news.size %])</h1>
<ul>
- [% FOREACH new IN news %]
- [% PERL %]
- my $part_num = $stash->get("new.1");
- $stash->set("part_lc", lc($part_num));
- my $manufacturer = $stash->get("new.0");
- $stash->set("manuf_lc", lc($manufacturer));
- [% END %]
+ [% FOREACH new IN news %]
+ [% manuf_link = new.0.lower.replace('[ #\/]', '_') %]
+ [% part_link = new.1.lower.replace('[ #\/]', '_') %]
+
<li><img class="logo_small" alt="[% new.0 %]"
- src="/logo/[% manuf_lc %].svg"></img>
- <a href="/products/[% manuf_lc %]/[% part_lc %].html">[% new.1 %]</a>
- [% END %]
+ src="/logo/[% manuf_link %].svg"></img>
+
+ <a href="/products/[% manuf_link %]/[% part_link %].html">
+ [% new.1 %]</a>
+ [% END %]
</ul>
</div>
<div class="column">
- <h1>Recently Updated ([% nupd %])</h1>
+ <h1>Recently Updated ([% upds.size %])</h1>
<ul>
- [% FOREACH upd IN upds %]
- [% PERL %]
- my $part_num = $stash->get("upd.1");
- $stash->set("part_lc", lc($part_num));
- my $manufacturer = $stash->get("upd.0");
- $stash->set("manuf_lc", lc($manufacturer));
- [% END %]
+ [% FOREACH upd IN upds %]
+ [% manuf_link = upd.0.lower.replace('[ #\/]', '_') %]
+ [% part_link = upd.1.lower.replace('[ #\/]', '_') %]
+
<li><img class="logo_small" alt="[% upd.0 %]"
- src="/logo/[% manuf_lc %].svg"></img>
- <a href="/products/[% manuf_lc %]/[% part_lc %].html">[% upd.1 %]</a>
- [% END %]
+ src="/logo/[% manuf_link %].svg"></img>
+ <a href="/products/[% manuf_link %]/[% part_link %].html">
+ [% upd.1 %]</a>
+ [% END %]
</ul>
</div>
[% END %]
diff --git a/tt/product.tt b/tt/product.tt
@@ -1,29 +1,33 @@
[% WRAPPER wrapper.tt %]
[% PERL %]
- my $manuf = $stash->get("manufacturer");
- $stash->set("manufacturer_lc", lc($manuf));
- my $part_num = $stash->get("part_num");
- $stash->set("part_num_lc", lc($part_num));
-
+ # drop the exact time on this somehow
my $time_str = scalar localtime($stash->get('first_seen'));
$stash->set("first_seen_proc", $time_str);
- # drop the exact time on this somehow
$time_str = scalar localtime($stash->get('last_seen'));
$stash->set("last_seen_proc", $time_str);
[% END %]
- <h1><a href="/manufacturers/[% manufacturer_lc %].html">
+ [% manuf_link = manufacturer.lower.replace('[ #\/]', '_') %]
+ <h1><a href="/manufacturers/[% manuf_link %].html">
<img class="logo_small" alt="[% manufacturer %]"
- src="/logo/[% manufacturer_lc %].svg"/></a>
- [% part_num %]</h1>
- <div class="product">
- <table>
- <tr><td>Manufacturer:</td><td>[% manufacturer %]</td></tr>
- <tr><td>Description:</td><td>[% description %]</td></tr>
- <tr><td>Type:</td><td>[% type %]</td></tr>
- <tr><td>First Seen:</td><td>[% first_seen_proc %]</td></tr>
- <tr><td>Last Seen:</td><td>[% last_seen_proc %]</td></tr>
- </table>
- <object data="/svg/[% part_num_lc %].svg" type="image/svg+xml">
- </object>
- </div>
+ src="/logo/[% manuf_link %].svg"/></a>
+ [% part_num %]</h1>
+
+ [% BLOCK row %]
+ <tr>
+ <td>[% first %]:</td>
+ <td>[% second %]</td>
+ </tr>
+ [% END %]
+
+ <table>
+ [% PROCESS row first='Manufacturer' second=manufacturer %]
+ [% PROCESS row first='Description' second=description %]
+ [% PROCESS row first='Type' second=type %]
+ [% PROCESS row first='First Seen' second=first_seen_proc %]
+ [% PROCESS row first='Last Seen' second=last_seen_proc %]
+ </table>
+
+ [% part_link = part_num.lower.replace('[ #\/]', '_') %]
+ <object data="/svg/[% manuf_link %]/[% part_link %].svg" type="image/svg+xml">
+ </object>
[% END %]
diff --git a/tt/summary.tt b/tt/summary.tt
@@ -1,9 +1,4 @@
[% WRAPPER wrapper.tt %]
-[% PERL %]
- # all url references are lower case
- my $dir_prefix = lc($stash->get("name"));
- $stash->set("name_lc", $dir_prefix);
-[% END %]
<h1><img alt="[% name %]" class="logo_small" src="/logo/[% logo %]"/></h1>
<ul>