[Debtags-commits] [svn] r1482 - central-database/branches/alioth/webfrontend

Enrico Zini enrico at costa.debian.org
Sat Nov 12 14:47:37 UTC 2005


Author: enrico
Date: Sat Nov 12 14:47:36 2005
New Revision: 1482

Added:
   central-database/branches/alioth/webfrontend/search.cgi
      - copied, changed from r1472, central-database/branches/alioth/webfrontend/index.cgi
   central-database/branches/alioth/webfrontend/searchtemplate.html
      - copied, changed from r1481, central-database/branches/alioth/webfrontend/browsetemplate.html
Modified:
   central-database/branches/alioth/webfrontend/Engine.pm
   central-database/branches/alioth/webfrontend/main.css
Log:
Added smart search interface

Modified: central-database/branches/alioth/webfrontend/Engine.pm
==============================================================================
--- central-database/branches/alioth/webfrontend/Engine.pm	(original)
+++ central-database/branches/alioth/webfrontend/Engine.pm	Sat Nov 12 14:47:36 2005
@@ -371,7 +371,10 @@
 
 
 # Check if a tag exists
-sub hasTag ($) { return exists $db->{tags}{$_[0]}; }
+sub hasTag ($) {
+	return undef if not defined $_[0];
+	return exists $db->{tags}{$_[0]};
+}
 
 # Get the list of tags
 sub tags () { return map { Engine::Tag->new($_) } keys %{$db->{tags}}; }
@@ -390,16 +393,23 @@
 
 #	&main::msg("Match %s with t:%s w:%s\n", $p->name(), join(', ', @{$parms->{tags}}), join(', ', @{$parms->{words}}));
 
-	if (@{$parms->{tags}})
+	if ($parms->{tags} && @{$parms->{tags}})
 	{
 		return undef if not $p->hasTag(@{$parms->{tags}});
 	}
-	for my $w (@{$parms->{words}})
+	if ($parms->{notags} && @{$parms->{notags}})
 	{
-		return undef if
-			index($p->name(), $w) == -1 &&
-			index($p->sdesc(), $w) == -1 &&
-			index($p->ldesc(), $w) == -1;
+		return undef if $p->hasTag(@{$parms->{notags}});
+	}
+	if ($parms->{words})
+	{
+		for my $w (@{$parms->{words}})
+		{
+			return undef if
+				index($p->name(), $w) == -1 &&
+				index($p->sdesc(), $w) == -1 &&
+				index($p->ldesc(), $w) == -1;
+		}
 	}
 
 #	&main::msg("OK %s\n", $p->name());
@@ -415,7 +425,7 @@
 {
 	my ($parms) = @_;
 
-	if (my @tags = @{$parms->{tags}})
+	if (my @tags = $parms->{tags} ? @{$parms->{tags}} : ())
 	{
 #		&main::msg("Tags search (%s)\n", join(', ',map{$_->name} @tags));
         # Use the last tag as the beginning of the search, because it is usually
@@ -430,6 +440,29 @@
 	}
 }
 
+# Return the $max_tags most frequent tags among the packages resulting for the
+# full-text search with the words given as arguments
+sub tagsForSearch ($@)
+{
+	my $max_tags = shift;
+	my $search = { words => [@_] };
+	my %tags;
+	for my $pkg (grep { matchPackage($search, $_) } packages())
+	{
+		for my $tag ($pkg->tags())
+		{
+			++$tags{$tag->name()} if $tag->name() !~ /^special::/;
+		}
+	}
+	my @res = (sort { $tags{$b} <=> $tags{$a} } keys %tags)[0 .. $max_tags];
+	while (!findPackages({tags => [tag(@res)]}))
+	{
+		&main::msg("No entries with %s, trying to remove %s\n", join(',', at res), $res[$#res]);
+		pop @res;
+	}
+	return @res;
+}
+
 ##
 ## Update functions
 ##

Modified: central-database/branches/alioth/webfrontend/main.css
==============================================================================
--- central-database/branches/alioth/webfrontend/main.css	(original)
+++ central-database/branches/alioth/webfrontend/main.css	Sat Nov 12 14:47:36 2005
@@ -214,6 +214,35 @@
 padding-right: 4pt;
 }
 
+#wtags {
+width: 23%;
+float: left;
+padding: 0.5em;
+}
+#utags {
+width: 23%;
+float: left;
+padding: 0.5em;
+}
+#itags {
+width: 23%;
+float: left;
+padding: 0.5em;
+}
+#ttags {
+width: 23%;
+float: left;
+padding: 0.5em;
+}
+.sebuttons {
+font-size: small;
+}
+.sefacet {
+}
+.setag {
+padding-left: 1em;
+font-style: italic;
+}
 
 #close {
 padding-top: 2px;

Copied: central-database/branches/alioth/webfrontend/search.cgi (from r1472, central-database/branches/alioth/webfrontend/index.cgi)
==============================================================================
--- central-database/branches/alioth/webfrontend/index.cgi	(original)
+++ central-database/branches/alioth/webfrontend/search.cgi	Sat Nov 12 14:47:36 2005
@@ -1,12 +1,5 @@
 #!/usr/bin/perl -w
 
-#
-# WARNING:
-#
-# This is not the cleanest code, and it really needs a rewrite
-# Use at your own risk!
-#
-
 use strict;
 use warnings;
 use English;
@@ -22,7 +15,7 @@
 ##
 
 #my $release="unstable";
-my $max_facets = 5;
+my $max_tags = 5;
 
 ##
 ## Generic functions
@@ -38,15 +31,6 @@
 	return $1;
 }
 
-#sub array_index ($$);
-#sub array_index($$) { my($haystack,$needle) = @_;
-#	for (my $i=0; $i <= $#$haystack; $i++) {
-#		return $i if ($$haystack[$i] eq $needle);
-#	}
-#	return -1;
-#}
-
-
 ##
 ## Startup
 ##
@@ -56,204 +40,350 @@
 
 # Load the template file
 my $template = HTML::Template->new(
-	filename => 'browsetemplate.html',
+	filename => 'searchtemplate.html',
 	die_on_bad_params => 0)
 || die "Could not open template";
 
 #Web::timing("init");
 
 # Parse input values
-my (@sel_tags, @sel_words);
-my %hidden_facets;
+my (@want_tags, @unwant_tags, @ignore_tags, @sel_words);
 
-for my $par (param())
+if (my $selwords = param('start'))
 {
-#	msg "Testing: %s\n", $par;
-	if ($par =~ /^facet-/)
+#	msg "Found: start->%s\n", $selwords;
+	if ($selwords =~ m/[A-Za-z0-9 ._-]+/)
+	{
+		@sel_words = grep { $_ } split(/\s+/, $selwords);
+		@want_tags = Engine::tagsForSearch($max_tags, @sel_words);
+	}
+} else {
+	if (my $selwords = param('oldstart'))
 	{
-		my $tag = param($par);
-		next if $tag eq ':NONE:';
-#		msg "Found: %s->%s\n", $par, $tag;
-		push @sel_tags, $tag if ($tag =~ /^[a-z0-9\-:]+$/);
-	}
-	elsif ($par eq 'tags')
-	{
-		my $seltags = param($par);
-#		msg "Found: %s->%s\n", $par, $seltags;
-		if ($seltags && $seltags =~ m/([a-z0-9\-:.,]+)/)
+#		msg "Found: oldstart->%s\n", $selwords;
+		if ($selwords =~ m/[A-Za-z0-9 ._-]+/)
 		{
-			push @sel_tags, split(/,/, $1);
-#		} else {
-#			$packages_limit = 0;
-#			$subgroup_limit = 0;
+			@sel_words = grep { $_ } split(/\s+/, $selwords);
 		}
 	}
-	elsif ($par eq 'words')
+	if (my $want = param('want'))
 	{
-		my $selwords = param($par);
-#		msg "Found: %s->%s\n", $par, $selwords;
-		if ($selwords && $selwords =~ m/([a-z0-9\-:.,]+)/)
+#		msg "Found: want->%s\n", $want;
+		if ($want =~ m/([a-z0-9\-:.,]+)/)
 		{
-			@sel_words = split(/\s+/, $1);
+			@want_tags = split(/,/, $1);
 		}
 	}
-	elsif ($par eq 'hf')
+	if (my $unwant = param('unwant'))
 	{
-#		msg "HF: %s\n", param($par);
-		for my $f (grep { Engine::hasFacet(sanitize($_)) } split(',', param($par)))
+#		msg "Found: unwant->%s\n", $unwant;
+		if ($unwant =~ m/([a-z0-9\-:.,]+)/)
 		{
-			$hidden_facets{$f} = 1;
-#			msg "Accepted HF: %s\n", $f;
+			@unwant_tags = split(/,/, $1);
 		}
 	}
-	elsif ($par =~ /^hf-(.+)/)
+	if (my $ignore = param('ignore'))
+	{
+#		msg "Found: unwant->%s\n", $unwant;
+		if ($ignore =~ m/([a-z0-9\-:.,]+)/)
+		{
+			@ignore_tags = split(/,/, $1);
+		}
+	}
+	if (my $tag = param('addwa'))
+	{
+#		msg "Found: addwa->%s\n", $tag;
+		push @want_tags, $tag if ($tag =~ /^[a-z0-9\-:]+$/);
+		@unwant_tags = grep { $_ ne $tag } @unwant_tags;
+		@ignore_tags = grep { $_ ne $tag } @ignore_tags;
+	}
+	if (my $tag = param('addun'))
+	{
+#		msg "Found: addun->%s\n", $tag;
+		push @unwant_tags, $tag if ($tag =~ /^[a-z0-9\-:]+$/);
+		@want_tags = grep { $_ ne $tag } @want_tags;
+		@ignore_tags = grep { $_ ne $tag } @ignore_tags;
+	}
+	if (my $tag = param('addig'))
+	{
+#		msg "Found: addig->%s\n", $tag;
+		push @ignore_tags, $tag if ($tag =~ /^[a-z0-9\-:]+$/);
+		@want_tags = grep { $_ ne $tag } @want_tags;
+		@unwant_tags = grep { $_ ne $tag } @unwant_tags;
+	}
+	if (my $tag = param('rmwa'))
 	{
-#		msg "HF-%s: %s\n", $1, $1;
-		if (Engine::hasFacet($1))
+#		msg "Found: rmwa->%s\n", $tag;
+		if ($tag =~ /^[a-z0-9\-:]+$/)
 		{
-			$hidden_facets{$1} = 1;
-#			msg "Accepted HF: %s\n", $1;
+			@want_tags = grep { $_ ne $tag } @want_tags;
+		}
+	}
+	if (my $tag = param('rmun'))
+	{
+#		msg "Found: rmun->%s\n", $tag;
+		if ($tag =~ /^[a-z0-9\-:]+$/)
+		{
+			@unwant_tags = grep { $_ ne $tag } @unwant_tags;
+		}
+	}
+	if (my $tag = param('rmig'))
+	{
+#		msg "Found: rmig->%s\n", $tag;
+		if ($tag =~ /^[a-z0-9\-:]+$/)
+		{
+			@ignore_tags = grep { $_ ne $tag } @ignore_tags;
 		}
 	}
 }
-if (param('uhf'))
+
+# Only take input tags once, and validate them
 {
-	%hidden_facets = ();
+	my %tags = map { $_ => 1 } @want_tags;
+	@want_tags = Engine::tag(sort keys %tags);
+
+	%tags = map { $_ => 1 } @unwant_tags;
+	@unwant_tags = Engine::tag(sort keys %tags);
+
+	%tags = map { $_ => 1 } @ignore_tags;
+	@ignore_tags = Engine::tag(sort keys %tags);
 }
 
-# Only take input tags once, and validate them
+sub linkself (@)
 {
-	my %tags = map { $_ => 1 } @sel_tags;
-	@sel_tags = Engine::tag(sort keys %tags);
+	return '?'.join('&',
+					'oldstart='.uri_escape(join(' ', @sel_words)),
+					'want='.join(',', map { uri_escape($_->name) } @want_tags),
+					'unwant='.join(',', map { uri_escape($_->name) } @unwant_tags),
+					'ignore='.join(',', map { uri_escape($_->name) } @ignore_tags),
+					@_);
 }
 
 #Web::timing("parms");
 
 #msg "Tags: %s\n", join(', ', map { $_->name } @sel_tags);
 
-
 ##
-## Build navigation
+## Perform the search
 ##
 
-Navigation::build(@sel_tags, @sel_words);
+my %tags;
+my %blacklist = map { $_->name => 1 } (@want_tags, @unwant_tags, @ignore_tags);
+my @ht_pkgs;
+for my $p (Engine::findPackages({
+				tags => \@want_tags,
+				notags => \@unwant_tags,
+			}))
+{
+	for my $t ($p->tags())
+	{
+		++$tags{$t->name()} if not exists $blacklist{$t->name()} and $t->name() !~ /^special::/;
+	}
+	push @ht_pkgs, {
+		NAME    => $p->name(),
+		SDESC   => $p->sdesc(),
+		LDESC   => $p->ldesc(),
+		URL     => "edit.cgi?pkg=".uri_escape($p->name()),
+	};
+}
+
+my @top_tags = Engine::tag((sort { $tags{$b} <=> $tags{$a} } keys %tags)[0 .. $max_tags]);
+
+#Navigation::build(@sel_tags, @sel_words);
 
 #Web::timing("nav");
 
 # Select the facets we want to view
-my @ht_facets;
-my $i = 0;
-foreach (@Navigation::ht_facets)
-{
-	last if $i >= $max_facets;
-	next if not $_->{SELCOUNT} and $hidden_facets{$_->{NAME}};
-	push(@ht_facets, $_);
-	$i++;
-}
+#my @ht_facets;
+#my $i = 0;
+#foreach (@Navigation::ht_facets)
+#{
+#	last if $i >= $max_facets;
+#	next if not $_->{SELCOUNT} and $hidden_facets{$_->{NAME}};
+#	push(@ht_facets, $_);
+#	$i++;
+#}
 
+my @ht_wtags;
+my @ht_utags;
+my @ht_itags;
+my @ht_ttags;
+
+foreach my $t (@want_tags)
+{
+	# Skip the empty tags
+	#next if not exists $tag_counts{$t->name};
+
+	push @ht_wtags, {
+		NAME => $t->name,
+		FNAME => $t->facet()->name(),
+		FSDESC => $t->facet()->sdesc(),
+		FLDESC => $t->facet()->ldesc(),
+		SDESC => $t->sdesc,
+		LDESC => $t->ldesc,
+#		COUNT => $tag_counts{$t->name},
+		REMURL => linkself("rmwa=".uri_escape($t->name)),
+		IGURL => linkself("addig=".uri_escape($t->name)),
+		UNWURL => linkself("addun=".uri_escape($t->name)),
+	};
+}
+foreach my $t (@unwant_tags)
+{
+	# Skip the empty tags
+	#next if not exists $tag_counts{$t->name};
+
+	push @ht_utags, {
+		NAME => $t->name,
+		FNAME => $t->facet()->name(),
+		FSDESC => $t->facet()->sdesc(),
+		FLDESC => $t->facet()->ldesc(),
+		SDESC => $t->sdesc,
+		LDESC => $t->ldesc,
+#		COUNT => $tag_counts{$t->name},
+		REMURL => linkself("rmun=".uri_escape($t->name)),
+		IGURL => linkself("addig=".uri_escape($t->name)),
+		WAURL => linkself("addwa=".uri_escape($t->name)),
+	};
+}
+foreach my $t (@ignore_tags)
+{
+	# Skip the empty tags
+	#next if not exists $tag_counts{$t->name};
+
+	push @ht_itags, {
+		NAME => $t->name,
+		FNAME => $t->facet()->name(),
+		FSDESC => $t->facet()->sdesc(),
+		FLDESC => $t->facet()->ldesc(),
+		SDESC => $t->sdesc,
+		LDESC => $t->ldesc,
+#		COUNT => $tag_counts{$t->name},
+		REMURL => linkself("rmig=".uri_escape($t->name)),
+		WAURL => linkself("addwa=".uri_escape($t->name)),
+		UNWURL => linkself("addun=".uri_escape($t->name)),
+	};
+}
+foreach my $t (@top_tags)
+{
+	# Skip the empty tags
+	#next if not exists $tag_counts{$t->name};
+
+	push @ht_ttags, {
+		NAME => $t->name,
+		FNAME => $t->facet()->name(),
+		FSDESC => $t->facet()->sdesc(),
+		FLDESC => $t->facet()->ldesc(),
+		SDESC => $t->sdesc,
+		LDESC => $t->ldesc,
+#		COUNT => $tag_counts{$t->name},
+		WAURL => linkself("addwa=".uri_escape($t->name)),
+		UNWURL => linkself("addun=".uri_escape($t->name)),
+		IGURL => linkself("addig=".uri_escape($t->name)),
+	};
+}
 
 ##
 ## Compile template structures
 ##
 
-$template->param(CURTAGS => join(',', map{$_->name} @sel_tags));
 $template->param(CURWORDS => join(' ', at sel_words));
-$template->param(CURHF => join(',',keys %hidden_facets));
-
-$template->param(FACETS => \@ht_facets);
-$template->param(CURPKGS => \@Navigation::ht_curpkgs);
-$template->param(SUBPKGS => \@Navigation::ht_subpkgs);
-
-my $count_hf = keys %hidden_facets;
-if ($count_hf == 1)
-{
-	$template->param(UHF_TEXT => "Unhide one hidden facet");
-} elsif ($count_hf > 1) {
-	$template->param(UHF_TEXT => "Unhide $count_hf hidden facets");
-}
-
-my $facet_intro;
-my $c = scalar(keys %Navigation::tag_counts);
-if ($c == 0)
-{
-	$facet_intro = "There is <b>no</b> tag ";
-} elsif ($c == 1) {
-	$facet_intro = "There is <b>one</b> tag ";
-} else {
-	$facet_intro = "There are <b>$c</b> tags ";
-}
-if ($Navigation::count_unselected == 0)
-{
-	$facet_intro .= "currently selected."
-} else {
-	$c = scalar keys %Navigation::facet_counts;
-	if ($c == 1)
-	{
-		$facet_intro .= "in <b>one</b> facet. ";
-	} else {
-		$facet_intro .= sprintf "in <b>%d</b> facets. ", $c;
-	} 
-	$c = scalar(@sel_tags);	
-	if ($c == 0)
-	{
-		$facet_intro .= "<b>None</b> is currently selected.";
-	}
-	elsif ($c == 1)
-	{
-		$facet_intro .= "<b>One</b> is currently selected.";
-	} else {
-		$facet_intro .= sprintf "<b>%d</b> are currently selected.", $c;
-	} 
-}
-my $cur_facets = scalar(@ht_facets);
-if ($cur_facets > 0)
-{
-	my $count_active_facets = scalar(@Navigation::ht_facets);
-	if ($cur_facets == 1)
-	{
-		$facet_intro .= "  <b>One</b> facet out of <b>$count_active_facets</b> is currently displayed.";
-	} else {
-		$facet_intro .= "  <b>$cur_facets</b> facets out of <b>$count_active_facets</b> are currently displayed.";
-	}
-}
-
-$template->param(FACET_INTRO => $facet_intro);
 
-my $curpkgs_intro;
-my $curpkgs_also;
-my $cur = scalar(@Navigation::ht_curpkgs);
-my $sub = scalar(@Navigation::ht_subpkgs);
-if ($cur == 0)
-{
-	$curpkgs_intro = "There is <b>no</b> package in this group.  ";
-	$curpkgs_also = '';
-} elsif ($cur == 1) {
-	$curpkgs_intro = "There is <b>one</b> package in this group.  ";
-	$curpkgs_also = ' also';
-} else {
-	$curpkgs_intro = "There are <b>$cur</b> packages in this group.  ";
-	$curpkgs_also = ' also';
-}
-if ($sub == 0)
-{
-	$curpkgs_intro .= "More packages can be found by further refining the selection."
-} else {
-	my $cp_verb;
-	if ($sub == 1) {
-		$curpkgs_intro .= "<b>One</b> package from ";
-		$cp_verb = "is";
-	} else {
-		$curpkgs_intro .= "<b>$sub</b> packages from ";
-		$cp_verb = "are";
-	}
-	my $subgroup_count = $Navigation::subgroup_count;
-	if ($subgroup_count == 1) {
-		$curpkgs_intro .= "<b>one</b> subgroup $cp_verb$curpkgs_also displayed below.";
-	} else {
-		$curpkgs_intro .= "<b>$subgroup_count</b> subgroups $cp_verb$curpkgs_also displayed below.";
-	}
-}
-$template->param(PKGS_INTRO => $curpkgs_intro);
+$template->param(WTAGS => \@ht_wtags);
+$template->param(UTAGS => \@ht_utags);
+$template->param(ITAGS => \@ht_itags);
+$template->param(TTAGS => \@ht_ttags);
+$template->param(PKGS => \@ht_pkgs);
+
+#my $count_hf = keys %hidden_facets;
+#if ($count_hf == 1)
+#{
+#	$template->param(UHF_TEXT => "Unhide one hidden facet");
+#} elsif ($count_hf > 1) {
+#	$template->param(UHF_TEXT => "Unhide $count_hf hidden facets");
+#}
+#
+#my $facet_intro;
+#my $c = scalar(keys %Navigation::tag_counts);
+#if ($c == 0)
+#{
+#	$facet_intro = "There is <b>no</b> tag ";
+#} elsif ($c == 1) {
+#	$facet_intro = "There is <b>one</b> tag ";
+#} else {
+#	$facet_intro = "There are <b>$c</b> tags ";
+#}
+#if ($Navigation::count_unselected == 0)
+#{
+#	$facet_intro .= "currently selected."
+#} else {
+#	$c = scalar keys %Navigation::facet_counts;
+#	if ($c == 1)
+#	{
+#		$facet_intro .= "in <b>one</b> facet. ";
+#	} else {
+#		$facet_intro .= sprintf "in <b>%d</b> facets. ", $c;
+#	} 
+#	$c = scalar(@sel_tags);	
+#	if ($c == 0)
+#	{
+#		$facet_intro .= "<b>None</b> is currently selected.";
+#	}
+#	elsif ($c == 1)
+#	{
+#		$facet_intro .= "<b>One</b> is currently selected.";
+#	} else {
+#		$facet_intro .= sprintf "<b>%d</b> are currently selected.", $c;
+#	} 
+#}
+#my $cur_facets = scalar(@ht_facets);
+#if ($cur_facets > 0)
+#{
+#	my $count_active_facets = scalar(@Navigation::ht_facets);
+#	if ($cur_facets == 1)
+#	{
+#		$facet_intro .= "  <b>One</b> facet out of <b>$count_active_facets</b> is currently displayed.";
+#	} else {
+#		$facet_intro .= "  <b>$cur_facets</b> facets out of <b>$count_active_facets</b> are currently displayed.";
+#	}
+#}
+#
+#$template->param(FACET_INTRO => $facet_intro);
+#
+#my $curpkgs_intro;
+#my $curpkgs_also;
+#my $cur = scalar(@Navigation::ht_curpkgs);
+#my $sub = scalar(@Navigation::ht_subpkgs);
+#if ($cur == 0)
+#{
+#	$curpkgs_intro = "There is <b>no</b> package in this group.  ";
+#	$curpkgs_also = '';
+#} elsif ($cur == 1) {
+#	$curpkgs_intro = "There is <b>one</b> package in this group.  ";
+#	$curpkgs_also = ' also';
+#} else {
+#	$curpkgs_intro = "There are <b>$cur</b> packages in this group.  ";
+#	$curpkgs_also = ' also';
+#}
+#if ($sub == 0)
+#{
+#	$curpkgs_intro .= "More packages can be found by further refining the selection."
+#} else {
+#	my $cp_verb;
+#	if ($sub == 1) {
+#		$curpkgs_intro .= "<b>One</b> package from ";
+#		$cp_verb = "is";
+#	} else {
+#		$curpkgs_intro .= "<b>$sub</b> packages from ";
+#		$cp_verb = "are";
+#	}
+#	my $subgroup_count = $Navigation::subgroup_count;
+#	if ($subgroup_count == 1) {
+#		$curpkgs_intro .= "<b>one</b> subgroup $cp_verb$curpkgs_also displayed below.";
+#	} else {
+#		$curpkgs_intro .= "<b>$subgroup_count</b> subgroups $cp_verb$curpkgs_also displayed below.";
+#	}
+#}
+#$template->param(PKGS_INTRO => $curpkgs_intro);
 
 if ($Web::log)
 {

Copied: central-database/branches/alioth/webfrontend/searchtemplate.html (from r1481, central-database/branches/alioth/webfrontend/browsetemplate.html)
==============================================================================
--- central-database/branches/alioth/webfrontend/browsetemplate.html	(original)
+++ central-database/branches/alioth/webfrontend/searchtemplate.html	Sat Nov 12 14:47:36 2005
@@ -14,12 +14,10 @@
   <form name="search" method="get">
 
   <div id="search">
-    Search: <input type="text" name="words" value='<tmpl_var name="CURWORDS">'>
-    <input type="hidden" name="tags" value='<tmpl_var name="CURTAGS">'>
-    <input type="hidden" name="hf" value='<tmpl_var name="CURHF">'>
+    New search: <input type="text" name="start" value='<tmpl_var name="CURWORDS">'>
   </div>
 
-  <h1><a href="index.cgi">Debian Package Browser</a></h1>
+  <h1><a href="search.cgi">Debtags-Enhanced Search</a></h1>
 
   <div id="log">
     <TMPL_VAR NAME="LOG">
@@ -32,68 +30,121 @@
     <a href="http://debtags.alioth.debian.org/">Debtags Homepage</a> at <a href="http://alioth.debian.org/">Alioth</a>.</p>
   </div>
 
-  <div id="subgroups">
-    <div class="intro">
-      <p><tmpl_var name="FACET_INTRO"></p>
-      <tmpl_if name="UHF_TEXT">
-        <input type='submit' name='uhf' value='<tmpl_var name="UHF_text">'>
-      </tmpl_if>
-    </div>
-      <!--div class="intro">
-	<p>There is no further refining and all matching packages are listed
-	   below.</p>
-      </div-->
-    <tmpl_if name="FACETS">
-      <div id="facets">
-      <table>
-      <tmpl_loop name="FACETS">
-      <tr>
-        <td class="tools">
-	  [<tmpl_var name="NAME">]
-	  <br />
-	  <input type="submit" name='hf-<tmpl_var name="NAME">' value='hide'>
-	</td>
-	<td class="body">
-        <div class="facet">
-          <div class="facet-title">
-             <tmpl_var name="SDESC"> (<tmpl_var name="COUNT">):
-          </div>
-          <div class="facet-body">
-            <ul>
-            <tmpl_loop name="SEEN">
-              <li>
-                <tmpl_var name="SDESC"> (<tmpl_var name="COUNT">)
-                <a href='<tmpl_var name="REMURL">'>[remove]</a>
-              </li>
-            </tmpl_loop>
-            <tmpl_if name="TAGS">
-            <li><select name="facet-<tmpl_var name="NAME">" onChange='this.form.submit()'>
-              <option value=":NONE:">Add one
-              <tmpl_loop name="TAGS">
-                <option value='<tmpl_var name="NAME">'><tmpl_var name="SDESC">
-              </tmpl_loop>
-            </select></li>
-            </tmpl_if>
-            </ul>
-          </div>
-        </div>
-      </tr>
+  <div id="wtags">
+    <p>Wanted tags:
+    <tmpl_if name="WTAGS">
+      </p>
+      <ul>
+      <tmpl_loop name="WTAGS">
+        <li>
+	  <div class="sebuttons">
+            <a href='<tmpl_var name="UNWURL">'>[Don't want]</a>
+            <a href='<tmpl_var name="IGURL">'>[Ignore]</a>
+            <a href='<tmpl_var name="REMURL">'>[Remove]</a>
+	  </div>
+	  <div class="sefacet">
+            <span title="<tmpl_var name='FNAME'>: <tmpl_var name='FLDESC'>"><tmpl_var name="FSDESC"></span>:
+	  </div>
+	  <div class="setag">
+	    <span title="<tmpl_var name='NAME'>: <tmpl_var name='LDESC'>"><tmpl_var name="SDESC"></span> <!-- tmpl_var name="COUNT" -->
+	  </div>
+        </li>
       </tmpl_loop>
-      </table>
-      </div>
+      </ul>
+    <tmpl_else>
+      <b>none</b></p>
     </tmpl_if>
-    <div style="clear: both"></div>
-    </div>
   </div>
 
+  <div id="utags">
+    <p>Unwanted tags:
+    <tmpl_if name="UTAGS">
+      </p>
+      <ul>
+      <tmpl_loop name="UTAGS">
+        <li>
+	  <div class="sebuttons">
+            <a href='<tmpl_var name="WAURL">'>[Want]</a>
+            <a href='<tmpl_var name="IGURL">'>[Ignore]</a>
+            <a href='<tmpl_var name="REMURL">'>[Remove]</a>
+	  </div>
+	  <div class="sefacet">
+            <span title="<tmpl_var name='FNAME'>: <tmpl_var name='FLDESC'>"><tmpl_var name="FSDESC"></span>:
+	  </div>
+	  <div class="setag">
+	    <span title="<tmpl_var name='NAME'>: <tmpl_var name='LDESC'>"><tmpl_var name="SDESC"></span> <!-- tmpl_var name="COUNT" -->
+	  </div>
+        </li>
+      </tmpl_loop>
+      </ul>
+    <tmpl_else>
+      <b>none</b></p>
+    </tmpl_if>
+  </div>
+
+  <div id="itags">
+    <p>Ignored tags:
+    <tmpl_if name="ITAGS">
+      </p>
+      <ul>
+      <tmpl_loop name="ITAGS">
+        <li>
+	  <div class="sebuttons">
+            <a href='<tmpl_var name="WAURL">'>[Want]</a>
+            <a href='<tmpl_var name="UNWURL">'>[Don't want]</a>
+            <a href='<tmpl_var name="REMURL">'>[Remove]</a>
+	  </div>
+	  <div class="sefacet">
+            <span title="<tmpl_var name='FNAME'>: <tmpl_var name='FLDESC'>"><tmpl_var name="FSDESC"></span>:
+	  </div>
+	  <div class="setag">
+	    <span title="<tmpl_var name='NAME'>: <tmpl_var name='LDESC'>"><tmpl_var name="SDESC"></span> <!-- tmpl_var name="COUNT" -->
+	  </div>
+        </li>
+      </tmpl_loop>
+      </ul>
+    <tmpl_else>
+      <b>none</b></p>
+    </tmpl_if>
+  </div>
+
+  <div id="ttags">
+    <p>Top tags in the result:
+    <tmpl_if name="TTAGS">
+      </p>
+      <ul>
+      <tmpl_loop name="TTAGS">
+        <li>
+	  <div class="sebuttons">
+            <a href='<tmpl_var name="WAURL">'>[Want]</a>
+            <a href='<tmpl_var name="UNWURL">'>[Don't want]</a>
+            <a href='<tmpl_var name="IGURL">'>[Ignore]</a>
+	  </div>
+	  <div class="sefacet">
+            <span title="<tmpl_var name='FNAME'>: <tmpl_var name='FLDESC'>"><tmpl_var name="FSDESC"></span>:
+	  </div>
+	  <div class="setag">
+	    <span title="<tmpl_var name='NAME'>: <tmpl_var name='LDESC'>"><tmpl_var name="SDESC"></span> <!-- tmpl_var name="COUNT" -->
+	  </div>
+        </li>
+      </tmpl_loop>
+      </ul>
+    <tmpl_else>
+      <b>none</b></p>
+    </tmpl_if>
+  </div>
+
+
+  <div style="clear: both"></div>
+
   <div id="packages">
     <div class="intro">
       <p><tmpl_var name="PKGS_INTRO"></p>
     </div>
   
-    <tmpl_if name="CURPKGS">
+    <tmpl_if name="PKGS">
       <div id="curpkgs">
-        <tmpl_loop name="CURPKGS">
+        <tmpl_loop name="PKGS">
           <a class="pkg" href='<tmpl_var name="URL">'><tmpl_var name="NAME"></a>
           - <tmpl_var name="SDESC"><br />
         </tmpl_loop>



More information about the Debtags-commits mailing list