X-Git-Url: https://git.decadent.org.uk/gitweb/?p=memories.git;a=blobdiff_plain;f=Tagtools.pm;h=44c5405ef50a770785eed8b50495fa8fd7eb384e;hp=f161c475b4e9bcf9edd4090cfe1ffbfd697d0078;hb=3b371b0c2e584c3b9164fef7df7faae8d58401d0;hpb=d5e41d4d638ff5f6c5428172dede8ca882e76ccf diff --git a/Tagtools.pm b/Tagtools.pm index f161c47..44c5405 100644 --- a/Tagtools.pm +++ b/Tagtools.pm @@ -1,4 +1,6 @@ package Tagtools; +use warnings; +use Lingua::EN::Inflect::Number qw(to_PL); use URI::Escape; use HTML::TagCloud; use Carp; @@ -6,6 +8,7 @@ use Cache::FileCache; use Storable qw(freeze); use MIME::Base64; use Calendar::Simple; use Text::Balanced qw(extract_multiple extract_quotelike); + sub import { my $whence = caller; my ($class) = @_; @@ -34,6 +37,7 @@ sub import { }; *{$whence."::_calendar"} = sub { my $arg = shift; + require Time::Piece; my ($y, $m) = split /-/, ($arg || Time::Piece->new->ymd); my @m = Calendar::Simple::calendar($m, $y); my @month; @@ -55,7 +59,53 @@ sub import { for my $thing (qw(tagcloud calendar)) { *{$whence."::$thing"} = sub { shift->do_cached(\&{$whence."::_".$thing}, @_) } } + *{$whence."::setup_tagging"} = \&Tagtools::_setup_tagging; +} + +sub _setup_tagging { + my ($maypole_class, $target_table, $tag_table_name) = @_; + my $class_for = sub { + $maypole_class->config->model->class_of($maypole_class, shift) + }; + $tag_table_name ||= "tag"; + my $target = $class_for->($target_table) + || die "Couldn't find a class representing $target_table"; + my $via_table = $tag_table_name . "ging"; + + # Does the tag table exist? + # If not create it or at least moan + # If so configure it as a new class + + # At this point, the $via_table should now be able to be named as... + my $tag_class = $class_for->($tag_table_name); + my $via = $tag_class."ging"; + # Set up the class + @{$via."::ISA"} = @{$tag_class."::ISA"}; + $via->table($via_table); + $via->columns(TEMP => qw/count/); + $via->columns(Essential => "id", $tag_table_name, $target_table); + # Set up the auxilliary methods + $via->set_sql(summary => qq/ + SELECT id, $tag_table_name, count(*) AS count + FROM $via_table + GROUP BY $tag_table_name + ORDER BY count DESC + LIMIT 50 + /); + $via->set_sql(all => qq/ + SELECT id, $tag_table_name, count(*) AS count + FROM $via_table + GROUP BY $tag_table_name + ORDER BY count DESC + /); + # Set up the has_many relations + $via->has_a($target_table => $target); + $via->has_a($tag_table_name => $tag_class); + $target->has_many(to_PL($tag_table_name) => [ $via => $tag_table_name ]); + $target->has_many(to_PL($via) => $via); + $tag_class->has_many(to_PL($target_table) => [ $via => $target_table ]); + $tag_class->has_many(to_PL($via_table) => $via); } sub separate_tags {