From 045563bb01a3fb9de9371854cbc16b77860c221b Mon Sep 17 00:00:00 2001 From: Karen Arutyunov Date: Mon, 3 Jun 2019 22:56:45 +0300 Subject: Add support for topics and keywords package manifest values --- libbrep/package.cxx | 35 ++++++++----- libbrep/package.hxx | 22 +++++--- libbrep/package.xml | 90 ++++++++++++++++++++++++++++++++ load/load.cxx | 3 +- migrate/migrate.cxx | 33 ++++++++++++ mod/mod-package-details.cxx | 2 +- mod/mod-package-version-details.cxx | 2 +- mod/page.cxx | 58 ++++++++------------ mod/page.hxx | 22 ++------ tests/load/1/math/libfoo-1.2.4+1.tar.gz | Bin 964 -> 990 bytes tests/load/1/math/packages.manifest | 11 ++-- tests/load/1/misc/packages.manifest | 2 +- tests/load/1/stable/packages.manifest | 8 +-- tests/load/1/stable/signature.manifest | 20 +++---- tests/load/driver.cxx | 45 ++++++++++------ www/package-details-body.css | 8 +-- www/package-version-details-body.css | 8 +-- 17 files changed, 250 insertions(+), 119 deletions(-) diff --git a/libbrep/package.cxx b/libbrep/package.cxx index 763cec9..6c6a565 100644 --- a/libbrep/package.cxx +++ b/libbrep/package.cxx @@ -57,7 +57,8 @@ namespace brep priority_type pr, string sm, license_alternatives_type la, - strings tg, + strings tp, + strings kw, optional ds, optional dt, string ch, @@ -87,7 +88,8 @@ namespace brep priority (move (pr)), summary (move (sm)), license_alternatives (move (la)), - tags (move (tg)), + topics (move (tp)), + keywords (move (kw)), description (move (ds)), description_type (move (dt)), changes (move (ch)), @@ -133,8 +135,8 @@ namespace brep if (!internal ()) return weighted_text (); - // Derive keywords from the basic package information: name, - // version. + // Derive search keywords from the basic package information: project, + // name, and version. // //@@ What about 'stable' from cppget.org/stable? Add path of // the repository to keywords? Or is it too "polluting" and @@ -149,12 +151,7 @@ namespace brep if (upstream_version) k += " " + *upstream_version; - // Add tags to keywords. - // - for (const auto& t: tags) - k += " " + t; - - // Add licenses to keywords. + // Add licenses to search keywords. // for (const auto& la: license_alternatives) { @@ -162,7 +159,7 @@ namespace brep { k += " " + l; - // If license is say LGPLv2 then LGPL is also a keyword. + // If license is say LGPLv2 then LGPL is also a search keyword. // size_t n (l.size ()); if (n > 2 && l[n - 2] == 'v' && l[n - 1] >= '0' && l[n - 1] <= '9') @@ -170,7 +167,21 @@ namespace brep } } - return {move (k), summary, description ? *description : "", changes}; + // Derive second-strongest search keywords from the package summary. + // + string k2 (summary); + + // Add topics to the second-strongest search keywords. + // + for (const auto& t: topics) + k2 += " " + t; + + // Add keywords to the second-strongest search keywords. + // + for (const auto& k: keywords) + k2 += " " + k; + + return {move (k), move (k2), description ? *description : "", changes}; } // repository diff --git a/libbrep/package.hxx b/libbrep/package.hxx index c4304f6..18cd629 100644 --- a/libbrep/package.hxx +++ b/libbrep/package.hxx @@ -21,16 +21,16 @@ // #define LIBBREP_PACKAGE_SCHEMA_VERSION_BASE 11 -#pragma db model version(LIBBREP_PACKAGE_SCHEMA_VERSION_BASE, 13, closed) +#pragma db model version(LIBBREP_PACKAGE_SCHEMA_VERSION_BASE, 14, closed) namespace brep { // @@ Might make sense to put some heavy members (e.g., description, // containers) into a separate section. // - // @@ Not sure there is a benefit in making tags a full-blown container - // (i.e., a separate table). Maybe provide a mapping of vector - // to TEXT as a comma-separated list. + // @@ Not sure there is a benefit in making topics/keywords full-blown + // containers (i.e., a separate table). Maybe provide a mapping of + // vector to TEXT as a comma/space-separated list. // // Forward declarations. @@ -366,7 +366,8 @@ namespace brep priority_type, string summary, license_alternatives_type, - strings tags, + strings topics, + strings keywords, optional description, optional description_type, string changes, @@ -418,7 +419,8 @@ namespace brep priority_type priority; string summary; license_alternatives_type license_alternatives; - strings tags; + strings topics; + strings keywords; optional description; // Absent if type is unknown. optional description_type; // Present if description is present. string changes; @@ -481,9 +483,13 @@ namespace brep set(odb::nested_set (this.license_alternatives, std::move (?))) \ id_column("") key_column("") value_column("license") - // tags + // topics // - #pragma db member(tags) id_column("") value_column("tag") + #pragma db member(topics) id_column("") value_column("topic") + + // keywords + // + #pragma db member(keywords) id_column("") value_column("keyword") // dependencies // diff --git a/libbrep/package.xml b/libbrep/package.xml index a1e7602..1a4a5b2 100644 --- a/libbrep/package.xml +++ b/libbrep/package.xml @@ -1,4 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/load/load.cxx b/load/load.cxx index 9b414d5..9c1c31f 100644 --- a/load/load.cxx +++ b/load/load.cxx @@ -507,7 +507,8 @@ load_packages (const shared_ptr& rp, pm.priority ? move (*pm.priority) : priority (), move (pm.summary), move (pm.license_alternatives), - move (pm.tags), + move (pm.topics), + move (pm.keywords), move (dsc), move (dst), move (chn), diff --git a/migrate/migrate.cxx b/migrate/migrate.cxx index 6bb0d48..6cae116 100644 --- a/migrate/migrate.cxx +++ b/migrate/migrate.cxx @@ -227,6 +227,39 @@ package_migrate_v12 ([] (database& db) "WHERE description IS NOT NULL"); }); +static const package_migration_entry<14> +package_migrate_v14 ([] (database& db) +{ + // Save the package tags as the package keywords. + // + db.execute ("INSERT INTO package_keywords (" + "tenant, " + "name, " + "version_epoch, " + "version_canonical_upstream, " + "version_canonical_release, " + "version_revision, " + "index, " + "keyword) " + "SELECT " + "tenant, " + "name, " + "version_epoch, " + "version_canonical_upstream, " + "version_canonical_release, " + "version_revision, " + "index, " + "tag " + "FROM package_tags"); + + // Note that the package keywords are the second-strongest search keywords + // and the package tags where the first-strongest search keywords. So, + // strictly speaking, we should update the package table search_index column + // to reflect the new ordering rules for the package search. But it feels + // like it isn't really worth the trouble. + // +}); + // main() function // int diff --git a/mod/mod-package-details.cxx b/mod/mod-package-details.cxx index 74b3840..fc2e6be 100644 --- a/mod/mod-package-details.cxx +++ b/mod/mod-package-details.cxx @@ -222,7 +222,7 @@ handle (request& rq, response& rs) if (pkg->email) s << TR_EMAIL (*pkg->email); - s << TR_TAGS (pkg->tags, root, tenant) + s << TR_TOPICS (pkg->topics, root, tenant) << ~TBODY << ~TABLE; } diff --git a/mod/mod-package-version-details.cxx b/mod/mod-package-version-details.cxx index d147449..81f18b1 100644 --- a/mod/mod-package-version-details.cxx +++ b/mod/mod-package-version-details.cxx @@ -263,7 +263,7 @@ handle (request& rq, response& rs) if (pe && pe != em) s << TR_EMAIL (*pe, "package-email"); - s << TR_TAGS (pkg->tags, root, tenant) + s << TR_TOPICS (pkg->topics, root, tenant) << ~TBODY << ~TABLE; diff --git a/mod/page.cxx b/mod/page.cxx index 706d052..1061788 100644 --- a/mod/page.cxx +++ b/mod/page.cxx @@ -373,47 +373,35 @@ namespace brep } } - // TR_TAGS + // TR_TOPICS // - void TR_TAGS:: + void TR_TOPICS:: operator() (serializer& s) const { - if (!tags_.empty () || project_) - { - s << TR(CLASS="tags") - << TH << "tags" << ~TH - << TD - << SPAN(CLASS="value"); - - auto print = [&s, this] (const string& t) - { - s << A - << HREF - << tenant_dir (root_, tenant_) << "?packages=" - << mime_url_encode (t) - << ~HREF - << t - << ~A; - }; - - bool pt (project_ != nullptr && - find (tags_.begin (), tags_.end (), *project_) == tags_.end ()); - - if (pt) - print (project_->string ()); - - for (const string& t: tags_) - { - if (&t != &tags_[0] || pt) - s << " "; + // Omit the element if there are no topics. + // + if (topics_.empty ()) + return; - print (t); - } + s << TR(CLASS="topics") + << TH << "topics" << ~TH + << TD + << SPAN(CLASS="value"); - s << ~SPAN - << ~TD - << ~TR; + for (const string& t: topics_) + { + s << A + << HREF + << tenant_dir (root_, tenant_) << "?packages=" + << mime_url_encode (t) + << ~HREF + << t + << ~A; } + + s << ~SPAN + << ~TD + << ~TR; } // TR_DEPENDS diff --git a/mod/page.hxx b/mod/page.hxx index cd2048e..2fc3a0b 100644 --- a/mod/page.hxx +++ b/mod/page.hxx @@ -324,31 +324,19 @@ namespace brep const license_alternatives& licenses_; }; - // Generate package tags element. + // Generate package topics element. // - class TR_TAGS + class TR_TOPICS { public: - // Display the tag link list. - // - TR_TAGS (const strings& ts, const dir_path& r, const string& t) - : project_ (nullptr), tags_ (ts), root_ (r), tenant_ (t) {} - - // As above but prepend the list with a tag link produced from the project - // name, if it differs from other tags. - // - TR_TAGS (const package_name& pr, - const strings& ts, - const dir_path& r, - const string& t) - : project_ (&pr), tags_ (ts), root_ (r), tenant_ (t) {} + TR_TOPICS (const strings& ts, const dir_path& r, const string& t) + : topics_ (ts), root_ (r), tenant_ (t) {} void operator() (xml::serializer&) const; private: - const package_name* project_; - const strings& tags_; + const strings& topics_; const dir_path& root_; const string& tenant_; }; diff --git a/tests/load/1/math/libfoo-1.2.4+1.tar.gz b/tests/load/1/math/libfoo-1.2.4+1.tar.gz index 29b0c55..94deae1 100644 Binary files a/tests/load/1/math/libfoo-1.2.4+1.tar.gz and b/tests/load/1/math/libfoo-1.2.4+1.tar.gz differ diff --git a/tests/load/1/math/packages.manifest b/tests/load/1/math/packages.manifest index 49caea6..74984e9 100644 --- a/tests/load/1/math/packages.manifest +++ b/tests/load/1/math/packages.manifest @@ -7,7 +7,7 @@ upstream-version: 1.2.abc.15-x project: mathLab summary: The exponent license: MIT -tags: mathlab, c++, exponent +keywords: mathlab c++ exponent description: The exponent math function. description-type: text/plain url: http://exp.example.com @@ -46,7 +46,8 @@ priority: high; Critical bug fixes, performance improvement. summary: The Foo Math Library license: LGPLv2, MIT; If using with GNU TLS. license: BSD; If using with OpenSSL. -tags: c++, foo, math +topics: math library, math API, libbaz fork +keywords: c++ foo math best description: \ A modern C++ library with easy to use linear algebra and lot of optimization tools. @@ -79,13 +80,13 @@ requires: c++11 requires: ? ; libc++ standard library if using Clang on Mac OS X. requires: ? vc++ >= 12.0; Only if using VC++ on Windows. location: libfoo-1.2.4+1.tar.gz -sha256sum: 92eb89770be390cbac9e0113763e0c10c43a4530667f5572571895617368369a +sha256sum: 0a206d2b5e575549914ed43b87470b33512e975fffa4fc8f3eb92b3dea66979e : name: libpq version: 0 summary: PostgreSQL C API client library license: PostgreSQL License; Permissive free software license. -tags: postgresql, database, client, library, c, api, interface +keywords: postgresql database client library c description: \ PostgreSQL is an object-relational SQL database management system with libpq being its C client library. Applications can use this library to pass queries @@ -121,7 +122,7 @@ name: libstudxml version: 1.0.0+1 summary: Modern C++ XML API license: MIT -tags: c++, xml, parser, serializer, pull, streaming, modern +keywords: c++ xml parser serializer pull url: http://www.codesynthesis.com/projects/libstudxml/ email: studxml-users@example.com; Public mailing list, posts by non-members\ are allowed but moderated. diff --git a/tests/load/1/misc/packages.manifest b/tests/load/1/misc/packages.manifest index 1f1571b..f02ce01 100644 --- a/tests/load/1/misc/packages.manifest +++ b/tests/load/1/misc/packages.manifest @@ -8,7 +8,7 @@ summary: The Bar library description: very very good library. description-type: text/plain license: GPLv2 -tags: c++, bar +keywords: c++, bar url: http://www.example.com/bar/ email: bar-users@example.com depends: libfoo diff --git a/tests/load/1/stable/packages.manifest b/tests/load/1/stable/packages.manifest index c1d4f1a..85109f6 100644 --- a/tests/load/1/stable/packages.manifest +++ b/tests/load/1/stable/packages.manifest @@ -17,7 +17,7 @@ version: 1.2.2-alpha.1 priority: security summary: The Foo library license: MIT -tags: c++, foo +keywords: c++ foo url: ftp://www.example.com/foo/ email: foo-users@example.com depends: libmisc [0.1 2.0-) | libmisc [2.0 5.0] @@ -30,7 +30,7 @@ name: libfoo version: 1.2.2 summary: The Foo library license: MIT -tags: c++, foo +keywords: c++ foo url: http://www.example.com/foo/ email: foo-users@example.com depends: libbar <= 2.4.0 @@ -43,7 +43,7 @@ version: 1.2.3+4 priority: medium summary: The Foo library license: MIT -tags: c++, foo +keywords: c++ foo url: http://www.example.com/foo/ email: foo-users@example.com depends: libmisc >= 2.0.0 @@ -54,7 +54,7 @@ name: libfoo version: 1.2.4 summary: The Foo Library license: MIT; Permissive free software license. -tags: c++, foo +keywords: c++ foo description: Very good foo library. description-type: text/plain changes: some changes 1 diff --git a/tests/load/1/stable/signature.manifest b/tests/load/1/stable/signature.manifest index 931ecd4..45d160e 100644 --- a/tests/load/1/stable/signature.manifest +++ b/tests/load/1/stable/signature.manifest @@ -1,13 +1,13 @@ : 1 -sha256sum: 880d24ea372048c9d250410d747b330503bdf216df70e3ea11ad6aef7a58b7b9 +sha256sum: f4fadfdc3586c8b94dce871328625f43636e43b4a073c4ee577af41780eeb8f3 signature: \ -rYCyTiDI3qJ7XD1IfzLiJcnUO6hEToJYHH/WwCYXuwWULHZL/utADNVh2dB0zN/Rzm5ONy9qK9Ik -560sE00tZ1XusU9C4o8B/WGvP2yEDIstF4E1ExwhIO8Y9sDgXpqCZfG/iw7hZYsZNJuzTnArUnSu -TK/Eubg8tbKolqVlx9GJ2/LXgbZsi0ZiKmEuY7T1IWboU5xMjfBuGEmh2pe838X4VfyhHanmV3S9 -jvthQJ3BR4vZW66UM20/ZWgKw32baYLKbq9br0lXsfnoEPDXDjtb0lOYjy9osa0dKLRF5++Owg2y -Mtd9RcmI0b8bGdfU8Z176sVXIp53RXlyMgjyewd4ycwWrz+VbIbR0c9AL8ZPHAwBpj8EHh/0IPPI -CqoEnYChJqWZaUQPzIdS7a+6rXbCllGXyyT3RZjgIiY+PCIp7ZMvcOArfOFzqOTMPOptF0JKUIoC -v+dzrrzHTA7duu9g+CT5Ag0WKLR0g+Izq3zyQa6YvOAdTFgUaPzd3W7NWP6N+YNeCc8jzGpCdFHY -1vvDHdNuKVNjSlUtXU5jjJglH2qgnct5SCav76lCKmQBF5PNznwp8R/mb5amIGBOzfRlB9ZN/fSL -XBM66Z5ObCDViMAliO4RBzoVnSv0y2SwpW+phqrSOzFTm+tDZE63oNh802yf+9/PHcIe48nMuhk= +J40HIcLQQI+1rzXzRo0OOJRk1NTmLNNFk+RUi/NM7M6vUFjjq4nIABR+bg8RdenpybVASTyJYNTL +/pLStEF+hg5SnufsYvpJJmstBMY4JXAcOfngUz4UVe8QS9zu3YGL5y/MBnYU+SKBbHnjRsTbRgak +LjoVbTKH6kkPkZ8MZMXzo/0un2L4w4uZLNDeqjJBg2OFztPIV3RYzBdCcxJ+k20UJjVfmNQWaBki +eaXVIsOxQ1bqWfg5uvACYvSgAIB+6ZIQFf8VYAJvnSieTswyWTxBXvj0D6aNnksQisaSbsRUuVb/ +zKYNWDrZFOjlNLEt+3bv3WQ5r0RqeRu7x9tdlXMfX/z9qu3SRe/mmaEpArkO67OKuVW1EDIo4Pwd +6zOQZUBvy3wd5RJWCfEbcuIBNBWL3jWOhWK36V9NzCWzeDzh22D0P9WEYNGd9Xn0+GeXpuiD/1w1 +IkVy9FA/2DYBb/UgNvWLaGWeTFqmv+ZcLKs8uuNHoM33EpI2jQetDS24QeOmqImmRsLROjyCxVye +yU3Dew5HRLK3KxNtC5XewK24eEdAQID7UEesn7X/MYfuyS1hq415YUibZswG7UIChj082xKHHcME +zrEgdJ29+I3ZQkpTBaY/77Pu6UFvcpPbak0SCc6FHPvWKwXHPv2ATsInKs0J/WLdsL8sgaM2f3I= \ diff --git a/tests/load/driver.cxx b/tests/load/driver.cxx index 4f075aa..db4ed8c 100644 --- a/tests/load/driver.cxx +++ b/tests/load/driver.cxx @@ -43,11 +43,22 @@ check_location (shared_ptr& p) static bool check_external (const package& p) { - return p.summary.empty () && p.tags.empty () && !p.description && !p.url && - !p.package_url && !p.email && !p.package_email && !p.internal () && - p.other_repositories.size () > 0 && p.priority == priority () && - p.changes.empty () && p.license_alternatives.empty () && - p.dependencies.empty () && p.requirements.empty () && !p.sha256sum; + return p.summary.empty () && + p.topics.empty () && + p.keywords.empty () && + !p.description && + !p.url && + !p.package_url && + !p.email && + !p.package_email && + !p.internal () && + p.other_repositories.size () > 0 && + p.priority == priority () && + p.changes.empty () && + p.license_alternatives.empty () && + p.dependencies.empty () && + p.requirements.empty () && + !p.sha256sum; } namespace bpkg @@ -348,7 +359,7 @@ test_pkg_repos (const cstrings& loader_args, assert (fpvxy->project == package_name ("libfoo")); assert (fpvxy->summary == "The Foo Library"); - assert (fpvxy->tags.empty ()); + assert (fpvxy->keywords.empty ()); assert (!fpvxy->description); assert (!fpvxy->url); assert (!fpvxy->package_url); @@ -380,7 +391,7 @@ test_pkg_repos (const cstrings& loader_args, package_id (tenant, package_name ("libfoo"), version ("1.0")))); assert (fpv1->summary == "The Foo Library"); - assert (fpv1->tags.empty ()); + assert (fpv1->keywords.empty ()); assert (!fpv1->description); assert (!fpv1->url); assert (!fpv1->package_url); @@ -414,7 +425,7 @@ test_pkg_repos (const cstrings& loader_args, package_id (tenant, package_name ("libfoo"), version ("1.2.2")))); assert (fpv2->summary == "The Foo library"); - assert (fpv2->tags == strings ({"c++", "foo"})); + assert (fpv2->keywords == strings ({"c++", "foo"})); assert (!fpv2->description); assert (fpv2->url && fpv2->url->string () == "http://www.example.com/foo/"); assert (!fpv2->package_url); @@ -458,7 +469,7 @@ test_pkg_repos (const cstrings& loader_args, version ("1.2.2-alpha.1")))); assert (fpv2a->summary == "The Foo library"); - assert (fpv2a->tags == strings ({"c++", "foo"})); + assert (fpv2a->keywords == strings ({"c++", "foo"})); assert (!fpv2a->description); assert (fpv2a->url && fpv2a->url->string () == "ftp://www.example.com/foo/"); assert (!fpv2a->package_url); @@ -518,7 +529,7 @@ test_pkg_repos (const cstrings& loader_args, package_id (tenant, package_name ("libfoo"), version ("1.2.3+4")))); assert (fpv3->summary == "The Foo library"); - assert (fpv3->tags == strings ({"c++", "foo"})); + assert (fpv3->keywords == strings ({"c++", "foo"})); assert (!fpv3->description); assert (fpv3->url && fpv3->url->string () == "http://www.example.com/foo/"); assert (!fpv3->package_url); @@ -554,7 +565,7 @@ test_pkg_repos (const cstrings& loader_args, package_id (tenant, package_name ("libfoo"), version ("1.2.4")))); assert (fpv4->summary == "The Foo Library"); - assert (fpv4->tags == strings ({"c++", "foo"})); + assert (fpv4->keywords == strings ({"c++", "foo"})); assert (*fpv4->description == "Very good foo library."); assert (fpv4->url && fpv4->url->string () == "http://www.example.com/foo/"); assert (!fpv4->package_url); @@ -622,8 +633,8 @@ test_pkg_repos (const cstrings& loader_args, version ("1.0.0+1")))); assert (xpv->summary == "Modern C++ XML API"); - assert (xpv->tags == strings ({"c++", "xml", "parser", "serializer", - "pull", "streaming", "modern"})); + assert (xpv->keywords == + strings ({"c++", "xml", "parser", "serializer", "pull"})); assert (!xpv->description); assert (xpv->url && xpv->url->string () == "http://www.codesynthesis.com/projects/libstudxml/"); @@ -678,7 +689,9 @@ test_pkg_repos (const cstrings& loader_args, package_id (tenant, package_name ("libfoo"), version ("1.2.4+1")))); assert (fpv5->summary == "The Foo Math Library"); - assert (fpv5->tags == strings ({"c++", "foo", "math"})); + assert (fpv5->topics == + strings ({"math library", "math API", "libbaz fork"})); + assert (fpv5->keywords == strings ({"c++", "foo", "math", "best"})); assert (*fpv5->description == "A modern C++ library with easy to use linear algebra and lot " "of optimization\ntools.\n\nThere are over 100 functions in " @@ -782,7 +795,7 @@ test_pkg_repos (const cstrings& loader_args, assert (check_location (fpv5)); assert (fpv5->sha256sum && *fpv5->sha256sum == - "92eb89770be390cbac9e0113763e0c10c43a4530667f5572571895617368369a"); + "0a206d2b5e575549914ed43b87470b33512e975fffa4fc8f3eb92b3dea66979e"); // Verify libexp package version. // @@ -795,7 +808,7 @@ test_pkg_repos (const cstrings& loader_args, assert (epv->upstream_version && *epv->upstream_version == "1.2.abc.15-x"); assert (epv->project == "mathLab"); assert (epv->summary == "The exponent"); - assert (epv->tags == strings ({"mathlab", "c++", "exponent"})); + assert (epv->keywords == strings ({"mathlab", "c++", "exponent"})); assert (epv->description && *epv->description == "The exponent math function."); assert (epv->url && epv->url->string () == "http://exp.example.com"); diff --git a/www/package-details-body.css b/www/package-details-body.css index ee612bb..e3aaa00 100644 --- a/www/package-details-body.css +++ b/www/package-details-body.css @@ -118,7 +118,7 @@ h1, h2 } #package th {width: 7.6em;} -#package tr.tags td a, +#package tr.topics td a, #package tr.project td a { display: inline-block; @@ -126,17 +126,17 @@ h1, h2 background-color: #f1f8ff; border-radius: 0.2em; padding: 0 .5em .06em .5em; - margin: 0 0.06em 0.1em 0; + margin: 0 0.35em 0.1em 0; } -#package tr.tags td a:hover, +#package tr.topics td a:hover, #package tr.project td a:hover { text-decoration: none; background-color: #def; } -#package tr.tags td, +#package tr.topics td, #package tr.project td { padding: 0; diff --git a/www/package-version-details-body.css b/www/package-version-details-body.css index 79fcfe5..25e2dc2 100644 --- a/www/package-version-details-body.css +++ b/www/package-version-details-body.css @@ -172,7 +172,7 @@ h1, h2, h3 } #package th {width: 9.5em;} -#package tr.tags td a, +#package tr.topics td a, #package tr.project td a { display: inline-block; @@ -180,17 +180,17 @@ h1, h2, h3 background-color: #f1f8ff; border-radius: 0.2em; padding: 0 .5em .06em .5em; - margin: 0 0.06em 0.1em 0; + margin: 0 0.35em 0.1em 0; } -#package tr.tags td a:hover, +#package tr.topics td a:hover, #package tr.project td a:hover { text-decoration: none; background-color: #def; } -#package tr.tags td, +#package tr.topics td, #package tr.project td { padding: 0; -- cgit v1.1