[calm - Cygwin server-side packaging maintenance script] branch master, updated. 20230209-60-g9506eb5

Jon Turney jturney@sourceware.org
Sat Jan 6 16:40:49 GMT 2024




https://sourceware.org/git/gitweb.cgi?p=cygwin-apps/calm.git;h=9506eb50062b2a431c9cf866ef55b09ec0150e97

commit 9506eb50062b2a431c9cf866ef55b09ec0150e97
Author: Jon Turney <jon.turney@dronecode.org.uk>
Date:   Sat Jan 6 14:58:14 2024 +0000

    Ensure announce mail ends with a blank line

https://sourceware.org/git/gitweb.cgi?p=cygwin-apps/calm.git;h=a9826e13ff7e19a0b446ca22d58d8819ffcabd06

commit a9826e13ff7e19a0b446ca22d58d8819ffcabd06
Author: Jon Turney <jon.turney@dronecode.org.uk>
Date:   Wed Dec 13 13:26:31 2023 +0000

    Improve rendering of minimal Markdown for description in package summary
    
    Retain the heuristic which makes URLs in the description, and improve
    it's handling of some cases.

https://sourceware.org/git/gitweb.cgi?p=cygwin-apps/calm.git;h=72a36434339e74676904906db287e720a0b75a0d

commit 72a36434339e74676904906db287e720a0b75a0d
Author: Jon Turney <jon.turney@dronecode.org.uk>
Date:   Wed Jan 3 19:33:24 2024 +0000

    Add rdepends and build_rdepends to package summary
    
    Use the HTML <details> widget to avoid showing large lists by default.

https://sourceware.org/git/gitweb.cgi?p=cygwin-apps/calm.git;h=31fbf0ae13b2faba1df22385862eabb2a4947eb6

commit 31fbf0ae13b2faba1df22385862eabb2a4947eb6
Author: Jon Turney <jon.turney@dronecode.org.uk>
Date:   Wed Jan 3 19:25:32 2024 +0000

    Factor out writing the details in the package summary page
    
    Contain the details in a table of class 'pkgdetails' for more layout
    control.

https://sourceware.org/git/gitweb.cgi?p=cygwin-apps/calm.git;h=d77f50aab8f7727eebcfb122a10607f2f9f7d835

commit d77f50aab8f7727eebcfb122a10607f2f9f7d835
Author: Jon Turney <jon.turney@dronecode.org.uk>
Date:   Thu Jan 4 14:30:01 2024 +0000

    Isolate tests from a local repodir
    
    This fixes the tests if a local /git/cygwin-packages happens to exist,
    and adds some test coverage of code which examines repodir.

https://sourceware.org/git/gitweb.cgi?p=cygwin-apps/calm.git;h=48dafae913459780cb081c8c31191ecbaf6b26f0

commit 48dafae913459780cb081c8c31191ecbaf6b26f0
Author: Jon Turney <jon.turney@dronecode.org.uk>
Date:   Wed Jan 3 18:25:08 2024 +0000

    Avoid an exception if package.merge() fails and returns None


Diff:
---
 calm/calm.py                                       |  8 ++
 calm/package.py                                    | 15 ++--
 calm/pkg2html.py                                   | 96 ++++++++++++++--------
 requirements.txt                                   |  1 +
 test/test_calm.py                                  |  2 +
 test/testdata/htdocs.expected/summary/arc-src.html | 17 ++--
 test/testdata/htdocs.expected/summary/arc.html     | 17 ++--
 .../htdocs.expected/summary/base-cygwin.html       | 18 ++--
 .../htdocs.expected/summary/corrupt-src.html       | 15 ++--
 test/testdata/htdocs.expected/summary/corrupt.html | 15 ++--
 .../htdocs.expected/summary/cygwin-debuginfo.html  | 20 +++--
 .../htdocs.expected/summary/cygwin-devel.html      | 16 ++--
 .../htdocs.expected/summary/cygwin-src.html        | 20 ++---
 test/testdata/htdocs.expected/summary/cygwin.html  | 18 ++--
 .../htdocs.expected/summary/keychain-src.html      | 17 ++--
 .../testdata/htdocs.expected/summary/keychain.html | 19 +++--
 .../htdocs.expected/summary/libdns_sd-devel.html   | 19 +++--
 .../htdocs.expected/summary/libdns_sd1.html        | 18 ++--
 .../htdocs.expected/summary/mDNSResponder-src.html | 17 ++--
 .../htdocs.expected/summary/mDNSResponder.html     | 19 +++--
 .../htdocs.expected/summary/obs-a-src.html         | 15 ++--
 test/testdata/htdocs.expected/summary/obs-a.html   | 17 ++--
 .../htdocs.expected/summary/obs-b-src.html         | 15 ++--
 test/testdata/htdocs.expected/summary/obs-b.html   | 17 ++--
 .../htdocs.expected/summary/openssh-src.html       | 19 +++--
 test/testdata/htdocs.expected/summary/openssh.html | 20 +++--
 .../per-version-replacement-hint-only-src.html     | 15 ++--
 .../summary/per-version-replacement-hint-only.html | 17 ++--
 .../htdocs.expected/summary/per-version-src.html   | 15 ++--
 .../htdocs.expected/summary/per-version.html       | 17 ++--
 .../summary/perl-Net-SMTP-SSL-src.html             | 17 ++--
 .../htdocs.expected/summary/perl-Net-SMTP-SSL.html | 17 ++--
 .../htdocs.expected/summary/rpm-doc-src.html       | 10 ++-
 test/testdata/htdocs.expected/summary/rpm-doc.html | 10 ++-
 .../htdocs.expected/summary/staleversion-src.html  | 15 ++--
 .../htdocs.expected/summary/staleversion.html      | 15 ++--
 .../htdocs.expected/summary/test-c-src.html        | 15 ++--
 test/testdata/htdocs.expected/summary/test-c.html  | 19 +++--
 .../htdocs.expected/summary/test-d-src.html        | 15 ++--
 test/testdata/htdocs.expected/summary/test-d.html  | 16 ++--
 .../htdocs.expected/summary/test-e-src.html        | 17 ++--
 test/testdata/htdocs.expected/summary/test-e.html  | 16 ++--
 .../htdocs.expected/summary/testpackage-src.html   | 15 ++--
 .../htdocs.expected/summary/testpackage.html       | 15 ++--
 test/testdata/process_arch/packages.json.expected  |  1 +
 test/testdata/repodir/cygwin.git/cygwin.cygport    |  0
 46 files changed, 428 insertions(+), 339 deletions(-)

diff --git a/calm/calm.py b/calm/calm.py
index e092468..4e6c035 100755
--- a/calm/calm.py
+++ b/calm/calm.py
@@ -308,6 +308,7 @@ The following packages have been uploaded to the Cygwin distribution:
 %s
 
 %s
+
 ''' % ('\n'.join('* ' + p + '-' + version for p in sorted(pkglist)), ldesc, cl)
 
     # TODO: add an attachment: sha512 hashes of packages, gpg signed?
@@ -343,6 +344,11 @@ def _process_maintainer_uploads(scan_result, args, state, all_packages, m, based
         # remove files which are to be removed
         scan_result[arch].to_vault.map(lambda p, f: package.delete(merged_packages[arch], p, f))
 
+    # if an error occurred ...
+    if not valid:
+        # ... discard move list and merged_packages
+        return False
+
     # validate the package set
     state.valid_provides = db.update_package_names(args, merged_packages)
     for arch in common_constants.ARCHES:
@@ -856,6 +862,7 @@ def main():
     pidfile_default = '/sourceware/cygwin-staging/calm.pid'
     pkglist_default = common_constants.PKGMAINT
     relarea_default = common_constants.FTP
+    repodir_default = '/git/cygwin-packages'
     setupdir_default = common_constants.HTDOCS
     vault_default = common_constants.VAULT
     logdir_default = '/sourceware/cygwin-staging/logs'
@@ -872,6 +879,7 @@ def main():
     parser.add_argument('--pkglist', action='store', metavar='FILE', help="package maintainer list (default: " + pkglist_default + ")", default=pkglist_default)
     parser.add_argument('--release', action='store', help='value for setup-release key (default: cygwin)', default='cygwin')
     parser.add_argument('--releasearea', action='store', metavar='DIR', help="release directory (default: " + relarea_default + ")", default=relarea_default, dest='rel_area')
+    parser.add_argument('--repodir', action='store', metavar='DIR', help="packaging repositories directory (default: " + repodir_default + ")", default=repodir_default)
     parser.add_argument('--setupdir', action='store', metavar='DIR', help="setup executable directory (default: " + setupdir_default + ")", default=setupdir_default)
     parser.add_argument('--stagingdir', action='store', metavar='DIR', help="automated build staging directory (default: " + stagingdir_default + ")", default=stagingdir_default)
     parser.add_argument('--no-stale', action='store_false', dest='stale', help="don't vault stale packages")
diff --git a/calm/package.py b/calm/package.py
index d135d80..f84d494 100755
--- a/calm/package.py
+++ b/calm/package.py
@@ -1396,12 +1396,13 @@ def upper_first_character(s):
 #
 #
 
-def _find_build_recipe_file(pn):
-    repo = '/git/cygwin-packages/%s.git' % pn
-    if os.path.exists(repo):
-        # XXX: we might want to check contents of the repo to determine if this
-        # package has a cygport or g-b-s build script
-        return 'https://cygwin.com/cgit/cygwin-packages/%s/tree/%s.cygport' % (pn, pn)
+def _find_build_recipe_file(args, pn):
+    if args.repodir:
+        repo = os.path.join(args.repodir, '%s.git' % pn)
+        if os.path.exists(repo):
+            # XXX: we might want to check contents of the repo to determine if this
+            # package has a cygport or g-b-s build script
+            return 'https://cygwin.com/cgit/cygwin-packages/%s/tree/%s.cygport' % (pn, pn)
 
     return None
 
@@ -1457,7 +1458,7 @@ def write_repo_json(args, packages, f):
         if 'license' in po.version_hints[bv]:
             d['license'] = po.version_hints[bv]['license']
 
-        build_recipe = _find_build_recipe_file(po.orig_name)
+        build_recipe = _find_build_recipe_file(args, po.orig_name)
         if build_recipe:
             d['build_recipe'] = build_recipe
 
diff --git a/calm/pkg2html.py b/calm/pkg2html.py
index 43591ff..ea4cb8f 100755
--- a/calm/pkg2html.py
+++ b/calm/pkg2html.py
@@ -50,6 +50,9 @@ import string
 import sys
 import textwrap
 import time
+from typing import NamedTuple
+
+import markdown
 
 import xtarfile
 
@@ -79,13 +82,18 @@ def ldesc(po, bv):
         return sdesc(po, bv)
 
     header = header.strip('"')
-    # escape html entities
-    header = html.escape(header, quote=False)
-    header = header.replace('\n\n', '\n<br>\n')
-    # try to recognize things which look like bullet points
-    header = re.sub(r'\n(\s*[*-]\s)', r'<br>\n\1', header)
-    # linkify things which look like hyperlinks
-    header = re.sub(r'http(s|)://[^\s\)]*', r'<a href="\g<0>">\g<0></a>', header)
+    header = markdown.markdown(header)
+
+    # linkify things which look like URLs
+    def linkify_without_fullstop(m):
+        url = m.group(0)
+        suffix = ''
+        if url[-1] == '.':
+            suffix = url[-1]
+            url = url[0:-1]
+        return '<a href="{0}">{0}</a>{1}'.format(url, suffix)
+
+    header = re.sub(r'http(s|)://[\w./_-]*', linkify_without_fullstop, header)
 
     return header
 
@@ -205,16 +213,27 @@ def update_package_listings(args, packages):
                     <!--#include virtual="/top.html" -->
                     <h1>%s: %s</h1>''' % (title, kind, pn)), file=f)
 
-                    print('<span class="detail">summary</span>: %s<br><br>' % sdesc(po, bv), file=f)
-                    print('<span class="detail">description</span>: %s<br><br>' % ldesc(po, bv), file=f)
-                    print('<span class="detail">categories</span>: %s<br><br>' % po.version_hints[bv].get('category', ''), file=f)
+                    details_table = {}
+                    details_table['summary'] = sdesc(po, bv)
+                    details_table['description'] = ldesc(po, bv)
+                    details_table['categories'] = po.version_hints[bv].get('category', '')
+
+                    class PackageData(NamedTuple):
+                        is_attr: bool = False
+                        summarize_limit: int = 0
 
                     if po.kind == package.Kind.source:
-                        details = ['build-depends']
+                        details = {'build-depends': PackageData()}
                     else:
-                        details = ['depends', 'obsoletes', 'obsoleted_by', 'provides', 'conflicts']
-
-                    detail_is_attr = ['obsoleted_by']
+                        details = {
+                            'depends': PackageData(),
+                            'obsoletes': PackageData(),
+                            'obsoleted_by': PackageData(is_attr=True),
+                            'provides': PackageData(),
+                            'conflicts': PackageData(),
+                            'rdepends': PackageData(is_attr=True, summarize_limit=10),
+                            'build_rdepends': PackageData(is_attr=True, summarize_limit=10)
+                        }
 
                     for key in details:
                         # make the union of the package list for this detail
@@ -223,7 +242,7 @@ def update_package_listings(args, packages):
                         value = {}
                         values = set()
                         for arch in pos:
-                            if key in detail_is_attr:
+                            if details[key].is_attr:
                                 value[arch] = getattr(pos[arch], key, set())
                             else:
                                 t = pos[arch].version_hints[pos[arch].best_version].get(key, None)
@@ -242,7 +261,11 @@ def update_package_listings(args, packages):
                                 else:
                                     detail.append(linkify_package(detail_pkg) + ' (%s)' % (','.join([arch for arch in pos if detail_pkg in value[arch]])))
 
-                            print('<span class="detail">%s</span>: %s<br><br>' % (key, ', '.join(detail)), file=f)
+                            limit = details[key].summarize_limit
+                            if limit and len(detail) > limit:
+                                details_table[key] = '<details><summary>(%s)</summary>%s</details>' % (len(detail), ', '.join(detail))
+                            else:
+                                details_table[key] = ', '.join(detail)
 
                     if po.kind == package.Kind.source:
                         es = p
@@ -250,19 +273,18 @@ def update_package_listings(args, packages):
                         install_packages = set()
                         for arch in pos:
                             install_packages.update(pos[arch].is_used_by)
-                        print('<span class="detail">install package(s)</span>: %s<br><br>' % ', '.join([linkify_package(p) for p in sorted(install_packages)]), file=f)
+                        details_table['install package(s)'] = ', '.join([linkify_package(p) for p in sorted(install_packages)])
 
                         homepage = po.version_hints[po.best_version].get('homepage', None)
                         if homepage:
-                            print('<span class="detail">homepage</span>: <a href="%s">%s</a><br><br>' % (homepage, homepage), file=f)
+                            details_table['homepage'] = '<a href="%s">%s</a>' % (homepage, homepage)
+
                         lic = po.version_hints[po.best_version].get('license', None)
                         if lic:
-                            print('<span class="detail">license</span>: %s' % (lic), file=f)
-                            print('<span class="smaller">(<a href="https://spdx.org/licenses/">SPDX</a>)</span>', file=f)
-                            print('<br><br>', file=f)
+                            details_table['license'] = '%s <span class="smaller">(<a href="https://spdx.org/licenses/">SPDX</a>)</span>' % (lic)
                     else:
                         es = po.srcpackage(bv)
-                        print('<span class="detail">source package</span>: %s<br><br>' % linkify_package(es), file=f)
+                        details_table['source package'] = linkify_package(es)
 
                     es_po = arch_package(packages, es)
                     if not es_po:
@@ -281,23 +303,29 @@ def update_package_listings(args, packages):
                         pkg_groups = pkg_maintainers[m_pn].groups()
 
                     if m:
-                        print('<span class="detail">maintainer(s)</span>: %s ' % m, file=f)
-
-                        print(textwrap.dedent('''\
+                        details_table['maintainer(s)'] = m + textwrap.dedent('''
                         <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> to report bugs or ask questions.
-                        <a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span>'''), file=f)
-                        print('<br><br>', file=f)
+                        <a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span>''')
 
                     if pkg_groups:
-                        print('<span class="detail">group</span>: %s ' % ','.join(pkg_groups), file=f)
-                        print('<br><br>', file=f)
+                        details_table['groups'] = ','.join(pkg_groups)
 
                     if po.kind == package.Kind.source:
-                        repo = '/git/cygwin-packages/%s.git' % pn
-                        if os.path.exists(repo):
-                            repo_browse_url = '/cgit/cygwin-packages/%s/' % pn
-                            print('<span class="detail">packaging repository</span>: <a href="%s">%s.git</a>' % (repo_browse_url, pn), file=f)
-
+                        if args.repodir:
+                            repo = os.path.join(args.repodir, '%s.git' % pn)
+                            if os.path.exists(repo):
+                                repo_browse_url = '/cgit/cygwin-packages/%s/' % pn
+                                details_table['packaging repository'] = '<a href="%s">%s.git</a>' % (repo_browse_url, pn)
+
+                    # output details table
+                    print('<table class="pkgdetails">', file=f)
+                    for d, v in details_table.items():
+                        if not v.startswith('<p>'):
+                            v = '<p>' + v + '</p>'
+                        print('<tr><td><p><span class="detail">%s</span>:</p></td><td>%s</td></tr>' % (d, v), file=f)
+                    print('</table>', file=f)
+
+                    # output per-arch package versions table
                     print('<ul>', file=f)
                     for arch in sorted(packages):
                         if p in packages[arch]:
diff --git a/requirements.txt b/requirements.txt
index b75566e..3cb6f87 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -5,6 +5,7 @@ flake8-builtins
 flake8-import-order
 license_expression
 lockfile
+markdown
 pycodestyle
 python-daemon
 xtarfile[zstd]
diff --git a/test/test_calm.py b/test/test_calm.py
index 819ce64..c494b76 100755
--- a/test/test_calm.py
+++ b/test/test_calm.py
@@ -149,6 +149,7 @@ class CalmTest(unittest.TestCase):
         args.dryrun = False
         args.force = True
         args.pkglist = 'testdata/pkglist/cygwin-pkg-maint'
+        args.repodir = 'testdata/repodir'
 
         try:
             shutil.rmtree(htdocs)
@@ -421,6 +422,7 @@ class CalmTest(unittest.TestCase):
         args.inifile = os.path.join(args.rel_area, 'setup.ini')
         args.pkglist = 'testdata/pkglist/cygwin-pkg-maint'
         args.release = 'trial'
+        args.repodir = 'testdata/repodir'
         args.setup_version = '3.1415'
         args.stale = True
 
diff --git a/test/testdata/htdocs.expected/summary/arc-src.html b/test/testdata/htdocs.expected/summary/arc-src.html
index 49fcead..439b271 100755
--- a/test/testdata/htdocs.expected/summary/arc-src.html
+++ b/test/testdata/htdocs.expected/summary/arc-src.html
@@ -10,19 +10,20 @@
 <div id="main">
 <!--#include virtual="/top.html" -->
 <h1>Source Package: arc</h1>
-<span class="detail">summary</span>: The ARC archive utility<br><br>
-<span class="detail">description</span>: This program is based on the MSDOS ARC program, version 5.21, plus a
+<table class="pkgdetails">
+<tr><td><p><span class="detail">summary</span>:</p></td><td><p>The ARC archive utility</p></td></tr>
+<tr><td><p><span class="detail">description</span>:</p></td><td><p>This program is based on the MSDOS ARC program, version 5.21, plus a
 few enhancements. ARC performs Huffman Squeezing on data. The Huffman
 Squeeze algorithm was removed from MSDOS ARC after version 5.12. It
 turns out to be more efficient than Lempel-Ziv style compression when
 compressing graphic images. Squeeze analysis is always done now, and
-the best of packing, squeezing, or crunching is used.<br><br>
-<span class="detail">categories</span>: Archive<br><br>
-<span class="detail">install package(s)</span>: <a href="arc.html">arc</a><br><br>
-<span class="detail">maintainer(s)</span>: Jari Aalto 
+the best of packing, squeezing, or crunching is used.</p></td></tr>
+<tr><td><p><span class="detail">categories</span>:</p></td><td><p>Archive</p></td></tr>
+<tr><td><p><span class="detail">install package(s)</span>:</p></td><td><p><a href="arc.html">arc</a></p></td></tr>
+<tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>Jari Aalto
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> to report bugs or ask questions.
-<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span>
-<br><br>
+<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span></p></td></tr>
+</table>
 <ul>
 <li><span class="detail">x86_64</span></li>
 <table class="pkgtable">
diff --git a/test/testdata/htdocs.expected/summary/arc.html b/test/testdata/htdocs.expected/summary/arc.html
index 2662c07..595e278 100644
--- a/test/testdata/htdocs.expected/summary/arc.html
+++ b/test/testdata/htdocs.expected/summary/arc.html
@@ -10,19 +10,20 @@
 <div id="main">
 <!--#include virtual="/top.html" -->
 <h1>Package: arc</h1>
-<span class="detail">summary</span>: The ARC archive utility<br><br>
-<span class="detail">description</span>: This program is based on the MSDOS ARC program, version 5.21, plus a
+<table class="pkgdetails">
+<tr><td><p><span class="detail">summary</span>:</p></td><td><p>The ARC archive utility</p></td></tr>
+<tr><td><p><span class="detail">description</span>:</p></td><td><p>This program is based on the MSDOS ARC program, version 5.21, plus a
 few enhancements. ARC performs Huffman Squeezing on data. The Huffman
 Squeeze algorithm was removed from MSDOS ARC after version 5.12. It
 turns out to be more efficient than Lempel-Ziv style compression when
 compressing graphic images. Squeeze analysis is always done now, and
-the best of packing, squeezing, or crunching is used.<br><br>
-<span class="detail">categories</span>: Archive<br><br>
-<span class="detail">source package</span>: <a href="arc-src.html">arc</a><br><br>
-<span class="detail">maintainer(s)</span>: Jari Aalto 
+the best of packing, squeezing, or crunching is used.</p></td></tr>
+<tr><td><p><span class="detail">categories</span>:</p></td><td><p>Archive</p></td></tr>
+<tr><td><p><span class="detail">source package</span>:</p></td><td><p><a href="arc-src.html">arc</a></p></td></tr>
+<tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>Jari Aalto
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> to report bugs or ask questions.
-<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span>
-<br><br>
+<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span></p></td></tr>
+</table>
 <ul>
 <li><span class="detail">x86_64</span></li>
 <table class="pkgtable">
diff --git a/test/testdata/htdocs.expected/summary/base-cygwin.html b/test/testdata/htdocs.expected/summary/base-cygwin.html
index 2ab918b..4eceb2f 100644
--- a/test/testdata/htdocs.expected/summary/base-cygwin.html
+++ b/test/testdata/htdocs.expected/summary/base-cygwin.html
@@ -10,15 +10,17 @@
 <div id="main">
 <!--#include virtual="/top.html" -->
 <h1>Package: base-cygwin</h1>
-<span class="detail">summary</span>: Initial base installation helper script<br><br>
-<span class="detail">description</span>: Initial base installation helper script.<br><br>
-<span class="detail">categories</span>: Base<br><br>
-<span class="detail">depends</span>: cygwin-api0_291<br><br>
-<span class="detail">source package</span>: base-cygwin-src<br><br>
-<span class="detail">maintainer(s)</span>: Corinna Vinschen 
+<table class="pkgdetails">
+<tr><td><p><span class="detail">summary</span>:</p></td><td><p>Initial base installation helper script</p></td></tr>
+<tr><td><p><span class="detail">description</span>:</p></td><td><p>Initial base installation helper script.</p></td></tr>
+<tr><td><p><span class="detail">categories</span>:</p></td><td><p>Base</p></td></tr>
+<tr><td><p><span class="detail">depends</span>:</p></td><td><p>cygwin-api0_291</p></td></tr>
+<tr><td><p><span class="detail">rdepends</span>:</p></td><td><p><a href="cygwin.html">cygwin</a>, <a href="per-version.html">per-version</a></p></td></tr>
+<tr><td><p><span class="detail">source package</span>:</p></td><td><p>base-cygwin-src</p></td></tr>
+<tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>Corinna Vinschen
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> to report bugs or ask questions.
-<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span>
-<br><br>
+<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span></p></td></tr>
+</table>
 <ul>
 <li><span class="detail">x86_64</span></li>
 <table class="pkgtable">
diff --git a/test/testdata/htdocs.expected/summary/corrupt-src.html b/test/testdata/htdocs.expected/summary/corrupt-src.html
index 76dc66d..0d9f881 100755
--- a/test/testdata/htdocs.expected/summary/corrupt-src.html
+++ b/test/testdata/htdocs.expected/summary/corrupt-src.html
@@ -10,14 +10,15 @@
 <div id="main">
 <!--#include virtual="/top.html" -->
 <h1>Source Package: corrupt</h1>
-<span class="detail">summary</span>: A corrupt package<br><br>
-<span class="detail">description</span>: A package containing corrupt archives<br><br>
-<span class="detail">categories</span>: Devel<br><br>
-<span class="detail">install package(s)</span>: <a href="corrupt.html">corrupt</a><br><br>
-<span class="detail">maintainer(s)</span>: Blooey McFooey 
+<table class="pkgdetails">
+<tr><td><p><span class="detail">summary</span>:</p></td><td><p>A corrupt package</p></td></tr>
+<tr><td><p><span class="detail">description</span>:</p></td><td><p>A package containing corrupt archives</p></td></tr>
+<tr><td><p><span class="detail">categories</span>:</p></td><td><p>Devel</p></td></tr>
+<tr><td><p><span class="detail">install package(s)</span>:</p></td><td><p><a href="corrupt.html">corrupt</a></p></td></tr>
+<tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>Blooey McFooey
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> to report bugs or ask questions.
-<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span>
-<br><br>
+<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span></p></td></tr>
+</table>
 <ul>
 <li><span class="detail">x86_64</span></li>
 <table class="pkgtable">
diff --git a/test/testdata/htdocs.expected/summary/corrupt.html b/test/testdata/htdocs.expected/summary/corrupt.html
index ccc03e5..08442ea 100644
--- a/test/testdata/htdocs.expected/summary/corrupt.html
+++ b/test/testdata/htdocs.expected/summary/corrupt.html
@@ -10,14 +10,15 @@
 <div id="main">
 <!--#include virtual="/top.html" -->
 <h1>Package: corrupt</h1>
-<span class="detail">summary</span>: A corrupt package<br><br>
-<span class="detail">description</span>: A package containing corrupt archives<br><br>
-<span class="detail">categories</span>: Devel<br><br>
-<span class="detail">source package</span>: <a href="corrupt-src.html">corrupt</a><br><br>
-<span class="detail">maintainer(s)</span>: Blooey McFooey 
+<table class="pkgdetails">
+<tr><td><p><span class="detail">summary</span>:</p></td><td><p>A corrupt package</p></td></tr>
+<tr><td><p><span class="detail">description</span>:</p></td><td><p>A package containing corrupt archives</p></td></tr>
+<tr><td><p><span class="detail">categories</span>:</p></td><td><p>Devel</p></td></tr>
+<tr><td><p><span class="detail">source package</span>:</p></td><td><p><a href="corrupt-src.html">corrupt</a></p></td></tr>
+<tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>Blooey McFooey
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> to report bugs or ask questions.
-<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span>
-<br><br>
+<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span></p></td></tr>
+</table>
 <ul>
 <li><span class="detail">x86_64</span></li>
 <table class="pkgtable">
diff --git a/test/testdata/htdocs.expected/summary/cygwin-debuginfo.html b/test/testdata/htdocs.expected/summary/cygwin-debuginfo.html
index 3f2ccff..9d017df 100644
--- a/test/testdata/htdocs.expected/summary/cygwin-debuginfo.html
+++ b/test/testdata/htdocs.expected/summary/cygwin-debuginfo.html
@@ -10,16 +10,18 @@
 <div id="main">
 <!--#include virtual="/top.html" -->
 <h1>Package: cygwin-debuginfo</h1>
-<span class="detail">summary</span>: Debug info for cygwin<br><br>
-<span class="detail">description</span>: This package contains files necessary for debugging the
-cygwin package with gdb.<br><br>
-<span class="detail">categories</span>: Debug<br><br>
-<span class="detail">depends</span>: <a href="cygwin-debuginfo.html">cygwin-debuginfo</a><br><br>
-<span class="detail">source package</span>: <a href="cygwin-src.html">cygwin</a><br><br>
-<span class="detail">maintainer(s)</span>: Corinna Vinschen, Yaakov Selkowitz 
+<table class="pkgdetails">
+<tr><td><p><span class="detail">summary</span>:</p></td><td><p>Debug info for cygwin</p></td></tr>
+<tr><td><p><span class="detail">description</span>:</p></td><td><p>This package contains files necessary for debugging the
+cygwin package with gdb.</p></td></tr>
+<tr><td><p><span class="detail">categories</span>:</p></td><td><p>Debug</p></td></tr>
+<tr><td><p><span class="detail">depends</span>:</p></td><td><p><a href="cygwin-debuginfo.html">cygwin-debuginfo</a></p></td></tr>
+<tr><td><p><span class="detail">rdepends</span>:</p></td><td><p><a href="cygwin-debuginfo.html">cygwin-debuginfo</a></p></td></tr>
+<tr><td><p><span class="detail">source package</span>:</p></td><td><p><a href="cygwin-src.html">cygwin</a></p></td></tr>
+<tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>Corinna Vinschen, Yaakov Selkowitz
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> to report bugs or ask questions.
-<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span>
-<br><br>
+<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span></p></td></tr>
+</table>
 <ul>
 <li><span class="detail">x86_64</span></li>
 <table class="pkgtable">
diff --git a/test/testdata/htdocs.expected/summary/cygwin-devel.html b/test/testdata/htdocs.expected/summary/cygwin-devel.html
index 8081737..c4e6b59 100644
--- a/test/testdata/htdocs.expected/summary/cygwin-devel.html
+++ b/test/testdata/htdocs.expected/summary/cygwin-devel.html
@@ -10,14 +10,16 @@
 <div id="main">
 <!--#include virtual="/top.html" -->
 <h1>Package: cygwin-devel</h1>
-<span class="detail">summary</span>: Core development files<br><br>
-<span class="detail">description</span>: Core development files required to build Cygwin packages<br><br>
-<span class="detail">categories</span>: Devel<br><br>
-<span class="detail">source package</span>: <a href="cygwin-src.html">cygwin</a><br><br>
-<span class="detail">maintainer(s)</span>: Corinna Vinschen, Yaakov Selkowitz 
+<table class="pkgdetails">
+<tr><td><p><span class="detail">summary</span>:</p></td><td><p>Core development files</p></td></tr>
+<tr><td><p><span class="detail">description</span>:</p></td><td><p>Core development files required to build Cygwin packages</p></td></tr>
+<tr><td><p><span class="detail">categories</span>:</p></td><td><p>Devel</p></td></tr>
+<tr><td><p><span class="detail">build_rdepends</span>:</p></td><td><p><a href="test-e-src.html">test-e</a></p></td></tr>
+<tr><td><p><span class="detail">source package</span>:</p></td><td><p><a href="cygwin-src.html">cygwin</a></p></td></tr>
+<tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>Corinna Vinschen, Yaakov Selkowitz
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> to report bugs or ask questions.
-<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span>
-<br><br>
+<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span></p></td></tr>
+</table>
 <ul>
 <li><span class="detail">x86_64</span></li>
 <table class="pkgtable">
diff --git a/test/testdata/htdocs.expected/summary/cygwin-src.html b/test/testdata/htdocs.expected/summary/cygwin-src.html
index 87d13f0..9ad7b0d 100755
--- a/test/testdata/htdocs.expected/summary/cygwin-src.html
+++ b/test/testdata/htdocs.expected/summary/cygwin-src.html
@@ -10,17 +10,17 @@
 <div id="main">
 <!--#include virtual="/top.html" -->
 <h1>Source Package: cygwin</h1>
-<span class="detail">summary</span>: The UNIX emulation engine<br><br>
-<span class="detail">description</span>: The UNIX emulation engine<br><br>
-<span class="detail">categories</span>: Base<br><br>
-<span class="detail">install package(s)</span>: <a href="cygwin.html">cygwin</a>, <a href="cygwin-debuginfo.html">cygwin-debuginfo</a>, <a href="cygwin-devel.html">cygwin-devel</a><br><br>
-<span class="detail">license</span>: LGPL-3.0-or-later WITH LGPL-3.0-linking-exception
-<span class="smaller">(<a href="https://spdx.org/licenses/">SPDX</a>)</span>
-<br><br>
-<span class="detail">maintainer(s)</span>: Corinna Vinschen, Yaakov Selkowitz 
+<table class="pkgdetails">
+<tr><td><p><span class="detail">summary</span>:</p></td><td><p>The UNIX emulation engine</p></td></tr>
+<tr><td><p><span class="detail">description</span>:</p></td><td><p>The UNIX emulation engine</p></td></tr>
+<tr><td><p><span class="detail">categories</span>:</p></td><td><p>Base</p></td></tr>
+<tr><td><p><span class="detail">install package(s)</span>:</p></td><td><p><a href="cygwin.html">cygwin</a>, <a href="cygwin-debuginfo.html">cygwin-debuginfo</a>, <a href="cygwin-devel.html">cygwin-devel</a></p></td></tr>
+<tr><td><p><span class="detail">license</span>:</p></td><td><p>LGPL-3.0-or-later WITH LGPL-3.0-linking-exception <span class="smaller">(<a href="https://spdx.org/licenses/">SPDX</a>)</span></p></td></tr>
+<tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>Corinna Vinschen, Yaakov Selkowitz
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> to report bugs or ask questions.
-<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span>
-<br><br>
+<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span></p></td></tr>
+<tr><td><p><span class="detail">packaging repository</span>:</p></td><td><p><a href="/cgit/cygwin-packages/cygwin/">cygwin.git</a></p></td></tr>
+</table>
 <ul>
 <li><span class="detail">x86_64</span></li>
 <table class="pkgtable">
diff --git a/test/testdata/htdocs.expected/summary/cygwin.html b/test/testdata/htdocs.expected/summary/cygwin.html
index c3fffef..fd9801b 100644
--- a/test/testdata/htdocs.expected/summary/cygwin.html
+++ b/test/testdata/htdocs.expected/summary/cygwin.html
@@ -10,15 +10,17 @@
 <div id="main">
 <!--#include virtual="/top.html" -->
 <h1>Package: cygwin</h1>
-<span class="detail">summary</span>: The UNIX emulation engine<br><br>
-<span class="detail">description</span>: The UNIX emulation engine<br><br>
-<span class="detail">categories</span>: Base<br><br>
-<span class="detail">depends</span>: <a href="base-cygwin.html">base-cygwin</a><br><br>
-<span class="detail">source package</span>: <a href="cygwin-src.html">cygwin</a><br><br>
-<span class="detail">maintainer(s)</span>: Corinna Vinschen, Yaakov Selkowitz 
+<table class="pkgdetails">
+<tr><td><p><span class="detail">summary</span>:</p></td><td><p>The UNIX emulation engine</p></td></tr>
+<tr><td><p><span class="detail">description</span>:</p></td><td><p>The UNIX emulation engine</p></td></tr>
+<tr><td><p><span class="detail">categories</span>:</p></td><td><p>Base</p></td></tr>
+<tr><td><p><span class="detail">depends</span>:</p></td><td><p><a href="base-cygwin.html">base-cygwin</a></p></td></tr>
+<tr><td><p><span class="detail">rdepends</span>:</p></td><td><p><a href="per-version.html">per-version</a>, <a href="per-version-replacement-hint-only.html">per-version-replacement-hint-only</a></p></td></tr>
+<tr><td><p><span class="detail">source package</span>:</p></td><td><p><a href="cygwin-src.html">cygwin</a></p></td></tr>
+<tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>Corinna Vinschen, Yaakov Selkowitz
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> to report bugs or ask questions.
-<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span>
-<br><br>
+<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span></p></td></tr>
+</table>
 <ul>
 <li><span class="detail">x86_64</span></li>
 <table class="pkgtable">
diff --git a/test/testdata/htdocs.expected/summary/keychain-src.html b/test/testdata/htdocs.expected/summary/keychain-src.html
index 5dd1558..6a7b984 100755
--- a/test/testdata/htdocs.expected/summary/keychain-src.html
+++ b/test/testdata/htdocs.expected/summary/keychain-src.html
@@ -10,8 +10,9 @@
 <div id="main">
 <!--#include virtual="/top.html" -->
 <h1>Source Package: keychain</h1>
-<span class="detail">summary</span>: Key manager for OpenSSH<br><br>
-<span class="detail">description</span>: Keychain is an OpenSSH key manager, typically run from
+<table class="pkgdetails">
+<tr><td><p><span class="detail">summary</span>:</p></td><td><p>Key manager for OpenSSH</p></td></tr>
+<tr><td><p><span class="detail">description</span>:</p></td><td><p>Keychain is an OpenSSH key manager, typically run from
 ~/.bash_profile. When keychain is run, it checks for a running
 ssh-agent, otherwise it starts one. It saves the ssh-agent environment
 variables to ~/.keychain/$HOSTNAME-sh, so that subsequent logins
@@ -19,13 +20,13 @@ and non-interactive shells such as cron jobs can source the file and
 make passwordless ssh connections. In addition, when keychain runs, it
 verifies that the key files specified on the command-line are known to
 ssh-agent, otherwise it loads them, prompting you for a password if
-necessary<br><br>
-<span class="detail">categories</span>: Utils<br><br>
-<span class="detail">install package(s)</span>: <a href="keychain.html">keychain</a><br><br>
-<span class="detail">maintainer(s)</span>: Jari Aalto 
+necessary</p></td></tr>
+<tr><td><p><span class="detail">categories</span>:</p></td><td><p>Utils</p></td></tr>
+<tr><td><p><span class="detail">install package(s)</span>:</p></td><td><p><a href="keychain.html">keychain</a></p></td></tr>
+<tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>Jari Aalto
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> to report bugs or ask questions.
-<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span>
-<br><br>
+<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span></p></td></tr>
+</table>
 <ul>
 <li><span class="detail">x86_64</span></li>
 <table class="pkgtable">
diff --git a/test/testdata/htdocs.expected/summary/keychain.html b/test/testdata/htdocs.expected/summary/keychain.html
index d2b7ac9..91f916b 100644
--- a/test/testdata/htdocs.expected/summary/keychain.html
+++ b/test/testdata/htdocs.expected/summary/keychain.html
@@ -10,8 +10,9 @@
 <div id="main">
 <!--#include virtual="/top.html" -->
 <h1>Package: keychain</h1>
-<span class="detail">summary</span>: Key manager for OpenSSH<br><br>
-<span class="detail">description</span>: Keychain is an OpenSSH key manager, typically run from
+<table class="pkgdetails">
+<tr><td><p><span class="detail">summary</span>:</p></td><td><p>Key manager for OpenSSH</p></td></tr>
+<tr><td><p><span class="detail">description</span>:</p></td><td><p>Keychain is an OpenSSH key manager, typically run from
 ~/.bash_profile. When keychain is run, it checks for a running
 ssh-agent, otherwise it starts one. It saves the ssh-agent environment
 variables to ~/.keychain/$HOSTNAME-sh, so that subsequent logins
@@ -19,14 +20,14 @@ and non-interactive shells such as cron jobs can source the file and
 make passwordless ssh connections. In addition, when keychain runs, it
 verifies that the key files specified on the command-line are known to
 ssh-agent, otherwise it loads them, prompting you for a password if
-necessary<br><br>
-<span class="detail">categories</span>: Utils<br><br>
-<span class="detail">depends</span>: <a href="openssh.html">openssh</a><br><br>
-<span class="detail">source package</span>: <a href="keychain-src.html">keychain</a><br><br>
-<span class="detail">maintainer(s)</span>: Jari Aalto 
+necessary</p></td></tr>
+<tr><td><p><span class="detail">categories</span>:</p></td><td><p>Utils</p></td></tr>
+<tr><td><p><span class="detail">depends</span>:</p></td><td><p><a href="openssh.html">openssh</a></p></td></tr>
+<tr><td><p><span class="detail">source package</span>:</p></td><td><p><a href="keychain-src.html">keychain</a></p></td></tr>
+<tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>Jari Aalto
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> to report bugs or ask questions.
-<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span>
-<br><br>
+<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span></p></td></tr>
+</table>
 <ul>
 <li><span class="detail">x86_64</span></li>
 <table class="pkgtable">
diff --git a/test/testdata/htdocs.expected/summary/libdns_sd-devel.html b/test/testdata/htdocs.expected/summary/libdns_sd-devel.html
index 7596bd2..14b43b7 100644
--- a/test/testdata/htdocs.expected/summary/libdns_sd-devel.html
+++ b/test/testdata/htdocs.expected/summary/libdns_sd-devel.html
@@ -10,17 +10,18 @@
 <div id="main">
 <!--#include virtual="/top.html" -->
 <h1>Package: libdns_sd-devel</h1>
-<span class="detail">summary</span>: Bonjour Zeroconf implementation<br><br>
-<span class="detail">description</span>: Bonjour, also known as zero-configuration networking, enables
+<table class="pkgdetails">
+<tr><td><p><span class="detail">summary</span>:</p></td><td><p>Bonjour Zeroconf implementation</p></td></tr>
+<tr><td><p><span class="detail">description</span>:</p></td><td><p>Bonjour, also known as zero-configuration networking, enables
 automatic discovery of computers, devices, and services on IP networks using
-industry standard IP protocols.<br><br>
-<span class="detail">categories</span>: Net<br><br>
-<span class="detail">depends</span>: <a href="libdns_sd1.html">libdns_sd1</a><br><br>
-<span class="detail">source package</span>: <a href="mDNSResponder-src.html">mDNSResponder</a><br><br>
-<span class="detail">maintainer(s)</span>: Yaakov Selkowitz 
+industry standard IP protocols.</p></td></tr>
+<tr><td><p><span class="detail">categories</span>:</p></td><td><p>Net</p></td></tr>
+<tr><td><p><span class="detail">depends</span>:</p></td><td><p><a href="libdns_sd1.html">libdns_sd1</a></p></td></tr>
+<tr><td><p><span class="detail">source package</span>:</p></td><td><p><a href="mDNSResponder-src.html">mDNSResponder</a></p></td></tr>
+<tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>Yaakov Selkowitz
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> to report bugs or ask questions.
-<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span>
-<br><br>
+<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span></p></td></tr>
+</table>
 <ul>
 <li><span class="detail">x86_64</span></li>
 <table class="pkgtable">
diff --git a/test/testdata/htdocs.expected/summary/libdns_sd1.html b/test/testdata/htdocs.expected/summary/libdns_sd1.html
index 964a73a..d099261 100644
--- a/test/testdata/htdocs.expected/summary/libdns_sd1.html
+++ b/test/testdata/htdocs.expected/summary/libdns_sd1.html
@@ -10,16 +10,18 @@
 <div id="main">
 <!--#include virtual="/top.html" -->
 <h1>Package: libdns_sd1</h1>
-<span class="detail">summary</span>: Bonjour Zeroconf implementation<br><br>
-<span class="detail">description</span>: Bonjour, also known as zero-configuration networking, enables
+<table class="pkgdetails">
+<tr><td><p><span class="detail">summary</span>:</p></td><td><p>Bonjour Zeroconf implementation</p></td></tr>
+<tr><td><p><span class="detail">description</span>:</p></td><td><p>Bonjour, also known as zero-configuration networking, enables
 automatic discovery of computers, devices, and services on IP networks using
-industry standard IP protocols.<br><br>
-<span class="detail">categories</span>: Net<br><br>
-<span class="detail">source package</span>: <a href="mDNSResponder-src.html">mDNSResponder</a><br><br>
-<span class="detail">maintainer(s)</span>: Yaakov Selkowitz 
+industry standard IP protocols.</p></td></tr>
+<tr><td><p><span class="detail">categories</span>:</p></td><td><p>Net</p></td></tr>
+<tr><td><p><span class="detail">rdepends</span>:</p></td><td><p><a href="libdns_sd-devel.html">libdns_sd-devel</a>, <a href="mDNSResponder.html">mDNSResponder</a></p></td></tr>
+<tr><td><p><span class="detail">source package</span>:</p></td><td><p><a href="mDNSResponder-src.html">mDNSResponder</a></p></td></tr>
+<tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>Yaakov Selkowitz
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> to report bugs or ask questions.
-<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span>
-<br><br>
+<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span></p></td></tr>
+</table>
 <ul>
 <li><span class="detail">x86_64</span></li>
 <table class="pkgtable">
diff --git a/test/testdata/htdocs.expected/summary/mDNSResponder-src.html b/test/testdata/htdocs.expected/summary/mDNSResponder-src.html
index 3c22768..38ccab9 100755
--- a/test/testdata/htdocs.expected/summary/mDNSResponder-src.html
+++ b/test/testdata/htdocs.expected/summary/mDNSResponder-src.html
@@ -10,16 +10,17 @@
 <div id="main">
 <!--#include virtual="/top.html" -->
 <h1>Source Package: mDNSResponder</h1>
-<span class="detail">summary</span>: Bonjour Zeroconf implementation<br><br>
-<span class="detail">description</span>: Bonjour, also known as zero-configuration networking, enables
+<table class="pkgdetails">
+<tr><td><p><span class="detail">summary</span>:</p></td><td><p>Bonjour Zeroconf implementation</p></td></tr>
+<tr><td><p><span class="detail">description</span>:</p></td><td><p>Bonjour, also known as zero-configuration networking, enables
 automatic discovery of computers, devices, and services on IP networks using
-industry standard IP protocols.<br><br>
-<span class="detail">categories</span>: Net<br><br>
-<span class="detail">install package(s)</span>: <a href="libdns_sd-devel.html">libdns_sd-devel</a>, <a href="libdns_sd1.html">libdns_sd1</a>, <a href="mDNSResponder.html">mDNSResponder</a><br><br>
-<span class="detail">maintainer(s)</span>: Yaakov Selkowitz 
+industry standard IP protocols.</p></td></tr>
+<tr><td><p><span class="detail">categories</span>:</p></td><td><p>Net</p></td></tr>
+<tr><td><p><span class="detail">install package(s)</span>:</p></td><td><p><a href="libdns_sd-devel.html">libdns_sd-devel</a>, <a href="libdns_sd1.html">libdns_sd1</a>, <a href="mDNSResponder.html">mDNSResponder</a></p></td></tr>
+<tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>Yaakov Selkowitz
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> to report bugs or ask questions.
-<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span>
-<br><br>
+<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span></p></td></tr>
+</table>
 <ul>
 <li><span class="detail">x86_64</span></li>
 <table class="pkgtable">
diff --git a/test/testdata/htdocs.expected/summary/mDNSResponder.html b/test/testdata/htdocs.expected/summary/mDNSResponder.html
index 07697eb..3c304de 100644
--- a/test/testdata/htdocs.expected/summary/mDNSResponder.html
+++ b/test/testdata/htdocs.expected/summary/mDNSResponder.html
@@ -10,17 +10,18 @@
 <div id="main">
 <!--#include virtual="/top.html" -->
 <h1>Package: mDNSResponder</h1>
-<span class="detail">summary</span>: Bonjour Zeroconf implementation<br><br>
-<span class="detail">description</span>: Bonjour, also known as zero-configuration networking, enables
+<table class="pkgdetails">
+<tr><td><p><span class="detail">summary</span>:</p></td><td><p>Bonjour Zeroconf implementation</p></td></tr>
+<tr><td><p><span class="detail">description</span>:</p></td><td><p>Bonjour, also known as zero-configuration networking, enables
 automatic discovery of computers, devices, and services on IP networks using
-industry standard IP protocols.<br><br>
-<span class="detail">categories</span>: Net<br><br>
-<span class="detail">depends</span>: <a href="libdns_sd1.html">libdns_sd1</a><br><br>
-<span class="detail">source package</span>: <a href="mDNSResponder-src.html">mDNSResponder</a><br><br>
-<span class="detail">maintainer(s)</span>: Yaakov Selkowitz 
+industry standard IP protocols.</p></td></tr>
+<tr><td><p><span class="detail">categories</span>:</p></td><td><p>Net</p></td></tr>
+<tr><td><p><span class="detail">depends</span>:</p></td><td><p><a href="libdns_sd1.html">libdns_sd1</a></p></td></tr>
+<tr><td><p><span class="detail">source package</span>:</p></td><td><p><a href="mDNSResponder-src.html">mDNSResponder</a></p></td></tr>
+<tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>Yaakov Selkowitz
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> to report bugs or ask questions.
-<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span>
-<br><br>
+<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span></p></td></tr>
+</table>
 <ul>
 <li><span class="detail">x86_64</span></li>
 <table class="pkgtable">
diff --git a/test/testdata/htdocs.expected/summary/obs-a-src.html b/test/testdata/htdocs.expected/summary/obs-a-src.html
index 5c445a6..74467e2 100755
--- a/test/testdata/htdocs.expected/summary/obs-a-src.html
+++ b/test/testdata/htdocs.expected/summary/obs-a-src.html
@@ -10,14 +10,15 @@
 <div id="main">
 <!--#include virtual="/top.html" -->
 <h1>Source Package: obs-a</h1>
-<span class="detail">summary</span>: obsolete package A<br><br>
-<span class="detail">description</span>: obsolete package A<br><br>
-<span class="detail">categories</span>: Devel<br><br>
-<span class="detail">install package(s)</span>: <a href="obs-a.html">obs-a</a><br><br>
-<span class="detail">maintainer(s)</span>: ORPHANED 
+<table class="pkgdetails">
+<tr><td><p><span class="detail">summary</span>:</p></td><td><p>obsolete package A</p></td></tr>
+<tr><td><p><span class="detail">description</span>:</p></td><td><p>obsolete package A</p></td></tr>
+<tr><td><p><span class="detail">categories</span>:</p></td><td><p>Devel</p></td></tr>
+<tr><td><p><span class="detail">install package(s)</span>:</p></td><td><p><a href="obs-a.html">obs-a</a></p></td></tr>
+<tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>ORPHANED
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> to report bugs or ask questions.
-<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span>
-<br><br>
+<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span></p></td></tr>
+</table>
 <ul>
 <li><span class="detail">x86_64</span></li>
 <table class="pkgtable">
diff --git a/test/testdata/htdocs.expected/summary/obs-a.html b/test/testdata/htdocs.expected/summary/obs-a.html
index c7164d7..298db09 100644
--- a/test/testdata/htdocs.expected/summary/obs-a.html
+++ b/test/testdata/htdocs.expected/summary/obs-a.html
@@ -10,15 +10,16 @@
 <div id="main">
 <!--#include virtual="/top.html" -->
 <h1>Package: obs-a</h1>
-<span class="detail">summary</span>: obsolete package A<br><br>
-<span class="detail">description</span>: obsolete package A<br><br>
-<span class="detail">categories</span>: Devel<br><br>
-<span class="detail">obsoleted_by</span>: <a href="test-c.html">test-c</a><br><br>
-<span class="detail">source package</span>: <a href="obs-a-src.html">obs-a</a><br><br>
-<span class="detail">maintainer(s)</span>: ORPHANED 
+<table class="pkgdetails">
+<tr><td><p><span class="detail">summary</span>:</p></td><td><p>obsolete package A</p></td></tr>
+<tr><td><p><span class="detail">description</span>:</p></td><td><p>obsolete package A</p></td></tr>
+<tr><td><p><span class="detail">categories</span>:</p></td><td><p>Devel</p></td></tr>
+<tr><td><p><span class="detail">obsoleted_by</span>:</p></td><td><p><a href="test-c.html">test-c</a></p></td></tr>
+<tr><td><p><span class="detail">source package</span>:</p></td><td><p><a href="obs-a-src.html">obs-a</a></p></td></tr>
+<tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>ORPHANED
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> to report bugs or ask questions.
-<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span>
-<br><br>
+<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span></p></td></tr>
+</table>
 <ul>
 <li><span class="detail">x86_64</span></li>
 <table class="pkgtable">
diff --git a/test/testdata/htdocs.expected/summary/obs-b-src.html b/test/testdata/htdocs.expected/summary/obs-b-src.html
index 14e8c1f..877fcf9 100755
--- a/test/testdata/htdocs.expected/summary/obs-b-src.html
+++ b/test/testdata/htdocs.expected/summary/obs-b-src.html
@@ -10,14 +10,15 @@
 <div id="main">
 <!--#include virtual="/top.html" -->
 <h1>Source Package: obs-b</h1>
-<span class="detail">summary</span>: obsolete package B<br><br>
-<span class="detail">description</span>: obsolete package B<br><br>
-<span class="detail">categories</span>: Devel<br><br>
-<span class="detail">install package(s)</span>: <a href="obs-b.html">obs-b</a><br><br>
-<span class="detail">maintainer(s)</span>: ORPHANED 
+<table class="pkgdetails">
+<tr><td><p><span class="detail">summary</span>:</p></td><td><p>obsolete package B</p></td></tr>
+<tr><td><p><span class="detail">description</span>:</p></td><td><p>obsolete package B</p></td></tr>
+<tr><td><p><span class="detail">categories</span>:</p></td><td><p>Devel</p></td></tr>
+<tr><td><p><span class="detail">install package(s)</span>:</p></td><td><p><a href="obs-b.html">obs-b</a></p></td></tr>
+<tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>ORPHANED
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> to report bugs or ask questions.
-<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span>
-<br><br>
+<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span></p></td></tr>
+</table>
 <ul>
 <li><span class="detail">x86_64</span></li>
 <table class="pkgtable">
diff --git a/test/testdata/htdocs.expected/summary/obs-b.html b/test/testdata/htdocs.expected/summary/obs-b.html
index a560262..e56bbc1 100644
--- a/test/testdata/htdocs.expected/summary/obs-b.html
+++ b/test/testdata/htdocs.expected/summary/obs-b.html
@@ -10,15 +10,16 @@
 <div id="main">
 <!--#include virtual="/top.html" -->
 <h1>Package: obs-b</h1>
-<span class="detail">summary</span>: obsolete package B<br><br>
-<span class="detail">description</span>: obsolete package B<br><br>
-<span class="detail">categories</span>: Devel<br><br>
-<span class="detail">obsoleted_by</span>: <a href="test-c.html">test-c</a><br><br>
-<span class="detail">source package</span>: <a href="obs-b-src.html">obs-b</a><br><br>
-<span class="detail">maintainer(s)</span>: ORPHANED 
+<table class="pkgdetails">
+<tr><td><p><span class="detail">summary</span>:</p></td><td><p>obsolete package B</p></td></tr>
+<tr><td><p><span class="detail">description</span>:</p></td><td><p>obsolete package B</p></td></tr>
+<tr><td><p><span class="detail">categories</span>:</p></td><td><p>Devel</p></td></tr>
+<tr><td><p><span class="detail">obsoleted_by</span>:</p></td><td><p><a href="test-c.html">test-c</a></p></td></tr>
+<tr><td><p><span class="detail">source package</span>:</p></td><td><p><a href="obs-b-src.html">obs-b</a></p></td></tr>
+<tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>ORPHANED
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> to report bugs or ask questions.
-<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span>
-<br><br>
+<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span></p></td></tr>
+</table>
 <ul>
 <li><span class="detail">x86_64</span></li>
 <table class="pkgtable">
diff --git a/test/testdata/htdocs.expected/summary/openssh-src.html b/test/testdata/htdocs.expected/summary/openssh-src.html
index 9c58103..9ac2ab1 100755
--- a/test/testdata/htdocs.expected/summary/openssh-src.html
+++ b/test/testdata/htdocs.expected/summary/openssh-src.html
@@ -10,16 +10,17 @@
 <div id="main">
 <!--#include virtual="/top.html" -->
 <h1>Source Package: openssh</h1>
-<span class="detail">summary</span>: The OpenSSH server and client programs<br><br>
-<span class="detail">description</span>: OpenSSH is a program for logging into a remote machine and for
-	executing commands on a remote machine.  It can replace rlogin and rsh,
-	providing encrypted communication between two machines.<br><br>
-<span class="detail">categories</span>: Net<br><br>
-<span class="detail">install package(s)</span>: <a href="openssh.html">openssh</a><br><br>
-<span class="detail">maintainer(s)</span>: Corinna Vinschen 
+<table class="pkgdetails">
+<tr><td><p><span class="detail">summary</span>:</p></td><td><p>The OpenSSH server and client programs</p></td></tr>
+<tr><td><p><span class="detail">description</span>:</p></td><td><p>OpenSSH is a program for logging into a remote machine and for
+    executing commands on a remote machine.  It can replace rlogin and rsh,
+    providing encrypted communication between two machines.</p></td></tr>
+<tr><td><p><span class="detail">categories</span>:</p></td><td><p>Net</p></td></tr>
+<tr><td><p><span class="detail">install package(s)</span>:</p></td><td><p><a href="openssh.html">openssh</a></p></td></tr>
+<tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>Corinna Vinschen
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> to report bugs or ask questions.
-<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span>
-<br><br>
+<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span></p></td></tr>
+</table>
 <ul>
 <li><span class="detail">x86_64</span></li>
 <table class="pkgtable">
diff --git a/test/testdata/htdocs.expected/summary/openssh.html b/test/testdata/htdocs.expected/summary/openssh.html
index 2f77ed8..75f3bc2 100644
--- a/test/testdata/htdocs.expected/summary/openssh.html
+++ b/test/testdata/htdocs.expected/summary/openssh.html
@@ -10,16 +10,18 @@
 <div id="main">
 <!--#include virtual="/top.html" -->
 <h1>Package: openssh</h1>
-<span class="detail">summary</span>: The OpenSSH server and client programs<br><br>
-<span class="detail">description</span>: OpenSSH is a program for logging into a remote machine and for
-	executing commands on a remote machine.  It can replace rlogin and rsh,
-	providing encrypted communication between two machines.<br><br>
-<span class="detail">categories</span>: Net<br><br>
-<span class="detail">source package</span>: <a href="openssh-src.html">openssh</a><br><br>
-<span class="detail">maintainer(s)</span>: Corinna Vinschen 
+<table class="pkgdetails">
+<tr><td><p><span class="detail">summary</span>:</p></td><td><p>The OpenSSH server and client programs</p></td></tr>
+<tr><td><p><span class="detail">description</span>:</p></td><td><p>OpenSSH is a program for logging into a remote machine and for
+    executing commands on a remote machine.  It can replace rlogin and rsh,
+    providing encrypted communication between two machines.</p></td></tr>
+<tr><td><p><span class="detail">categories</span>:</p></td><td><p>Net</p></td></tr>
+<tr><td><p><span class="detail">rdepends</span>:</p></td><td><p><a href="keychain.html">keychain</a></p></td></tr>
+<tr><td><p><span class="detail">source package</span>:</p></td><td><p><a href="openssh-src.html">openssh</a></p></td></tr>
+<tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>Corinna Vinschen
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> to report bugs or ask questions.
-<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span>
-<br><br>
+<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span></p></td></tr>
+</table>
 <ul>
 <li><span class="detail">x86_64</span></li>
 <table class="pkgtable">
diff --git a/test/testdata/htdocs.expected/summary/per-version-replacement-hint-only-src.html b/test/testdata/htdocs.expected/summary/per-version-replacement-hint-only-src.html
index f8fd5d6..110add2 100755
--- a/test/testdata/htdocs.expected/summary/per-version-replacement-hint-only-src.html
+++ b/test/testdata/htdocs.expected/summary/per-version-replacement-hint-only-src.html
@@ -10,14 +10,15 @@
 <div id="main">
 <!--#include virtual="/top.html" -->
 <h1>Source Package: per-version-replacement-hint-only</h1>
-<span class="detail">summary</span>: Per-version hint test package<br><br>
-<span class="detail">description</span>: Per-version hint test package<br><br>
-<span class="detail">categories</span>: Base<br><br>
-<span class="detail">install package(s)</span>: <a href="per-version-replacement-hint-only.html">per-version-replacement-hint-only</a><br><br>
-<span class="detail">maintainer(s)</span>: Blooey McFooey 
+<table class="pkgdetails">
+<tr><td><p><span class="detail">summary</span>:</p></td><td><p>Per-version hint test package</p></td></tr>
+<tr><td><p><span class="detail">description</span>:</p></td><td><p>Per-version hint test package</p></td></tr>
+<tr><td><p><span class="detail">categories</span>:</p></td><td><p>Base</p></td></tr>
+<tr><td><p><span class="detail">install package(s)</span>:</p></td><td><p><a href="per-version-replacement-hint-only.html">per-version-replacement-hint-only</a></p></td></tr>
+<tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>Blooey McFooey
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> to report bugs or ask questions.
-<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span>
-<br><br>
+<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span></p></td></tr>
+</table>
 <ul>
 <li><span class="detail">x86_64</span></li>
 <table class="pkgtable">
diff --git a/test/testdata/htdocs.expected/summary/per-version-replacement-hint-only.html b/test/testdata/htdocs.expected/summary/per-version-replacement-hint-only.html
index 247fe1d..fce022f 100644
--- a/test/testdata/htdocs.expected/summary/per-version-replacement-hint-only.html
+++ b/test/testdata/htdocs.expected/summary/per-version-replacement-hint-only.html
@@ -10,15 +10,16 @@
 <div id="main">
 <!--#include virtual="/top.html" -->
 <h1>Package: per-version-replacement-hint-only</h1>
-<span class="detail">summary</span>: Per-version hint test package<br><br>
-<span class="detail">description</span>: Per-version hint test package<br><br>
-<span class="detail">categories</span>: Base<br><br>
-<span class="detail">depends</span>: <a href="cygwin.html">cygwin</a><br><br>
-<span class="detail">source package</span>: <a href="per-version-replacement-hint-only-src.html">per-version-replacement-hint-only</a><br><br>
-<span class="detail">maintainer(s)</span>: Blooey McFooey 
+<table class="pkgdetails">
+<tr><td><p><span class="detail">summary</span>:</p></td><td><p>Per-version hint test package</p></td></tr>
+<tr><td><p><span class="detail">description</span>:</p></td><td><p>Per-version hint test package</p></td></tr>
+<tr><td><p><span class="detail">categories</span>:</p></td><td><p>Base</p></td></tr>
+<tr><td><p><span class="detail">depends</span>:</p></td><td><p><a href="cygwin.html">cygwin</a></p></td></tr>
+<tr><td><p><span class="detail">source package</span>:</p></td><td><p><a href="per-version-replacement-hint-only-src.html">per-version-replacement-hint-only</a></p></td></tr>
+<tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>Blooey McFooey
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> to report bugs or ask questions.
-<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span>
-<br><br>
+<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span></p></td></tr>
+</table>
 <ul>
 <li><span class="detail">x86_64</span></li>
 <table class="pkgtable">
diff --git a/test/testdata/htdocs.expected/summary/per-version-src.html b/test/testdata/htdocs.expected/summary/per-version-src.html
index f265123..3703449 100755
--- a/test/testdata/htdocs.expected/summary/per-version-src.html
+++ b/test/testdata/htdocs.expected/summary/per-version-src.html
@@ -10,14 +10,15 @@
 <div id="main">
 <!--#include virtual="/top.html" -->
 <h1>Source Package: per-version</h1>
-<span class="detail">summary</span>: Per-version hint test package<br><br>
-<span class="detail">description</span>: Per-version hint test package<br><br>
-<span class="detail">categories</span>: Base<br><br>
-<span class="detail">install package(s)</span>: <a href="per-version.html">per-version</a><br><br>
-<span class="detail">maintainer(s)</span>: Blooey McFooey 
+<table class="pkgdetails">
+<tr><td><p><span class="detail">summary</span>:</p></td><td><p>Per-version hint test package</p></td></tr>
+<tr><td><p><span class="detail">description</span>:</p></td><td><p>Per-version hint test package</p></td></tr>
+<tr><td><p><span class="detail">categories</span>:</p></td><td><p>Base</p></td></tr>
+<tr><td><p><span class="detail">install package(s)</span>:</p></td><td><p><a href="per-version.html">per-version</a></p></td></tr>
+<tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>Blooey McFooey
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> to report bugs or ask questions.
-<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span>
-<br><br>
+<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span></p></td></tr>
+</table>
 <ul>
 <li><span class="detail">x86_64</span></li>
 <table class="pkgtable">
diff --git a/test/testdata/htdocs.expected/summary/per-version.html b/test/testdata/htdocs.expected/summary/per-version.html
index dc4bdc0..2fdd500 100644
--- a/test/testdata/htdocs.expected/summary/per-version.html
+++ b/test/testdata/htdocs.expected/summary/per-version.html
@@ -10,15 +10,16 @@
 <div id="main">
 <!--#include virtual="/top.html" -->
 <h1>Package: per-version</h1>
-<span class="detail">summary</span>: Per-version hint test package<br><br>
-<span class="detail">description</span>: Per-version hint test package<br><br>
-<span class="detail">categories</span>: Base<br><br>
-<span class="detail">depends</span>: <a href="base-cygwin.html">base-cygwin</a><br><br>
-<span class="detail">source package</span>: <a href="per-version-src.html">per-version</a><br><br>
-<span class="detail">maintainer(s)</span>: Blooey McFooey 
+<table class="pkgdetails">
+<tr><td><p><span class="detail">summary</span>:</p></td><td><p>Per-version hint test package</p></td></tr>
+<tr><td><p><span class="detail">description</span>:</p></td><td><p>Per-version hint test package</p></td></tr>
+<tr><td><p><span class="detail">categories</span>:</p></td><td><p>Base</p></td></tr>
+<tr><td><p><span class="detail">depends</span>:</p></td><td><p><a href="base-cygwin.html">base-cygwin</a></p></td></tr>
+<tr><td><p><span class="detail">source package</span>:</p></td><td><p><a href="per-version-src.html">per-version</a></p></td></tr>
+<tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>Blooey McFooey
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> to report bugs or ask questions.
-<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span>
-<br><br>
+<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span></p></td></tr>
+</table>
 <ul>
 <li><span class="detail">x86_64</span></li>
 <table class="pkgtable">
diff --git a/test/testdata/htdocs.expected/summary/perl-Net-SMTP-SSL-src.html b/test/testdata/htdocs.expected/summary/perl-Net-SMTP-SSL-src.html
index f9cec36..ec4255c 100755
--- a/test/testdata/htdocs.expected/summary/perl-Net-SMTP-SSL-src.html
+++ b/test/testdata/htdocs.expected/summary/perl-Net-SMTP-SSL-src.html
@@ -10,15 +10,16 @@
 <div id="main">
 <!--#include virtual="/top.html" -->
 <h1>Source Package: perl-Net-SMTP-SSL</h1>
-<span class="detail">summary</span>: Perl distribution Net-SMTP-SSL<br><br>
-<span class="detail">description</span>: Implements the same API as Net::SMTP, but uses IO::Socket::SSL for
-its network operations in order to support encrypted connections.<br><br>
-<span class="detail">categories</span>: Perl<br><br>
-<span class="detail">install package(s)</span>: <a href="perl-Net-SMTP-SSL.html">perl-Net-SMTP-SSL</a><br><br>
-<span class="detail">maintainer(s)</span>: Blooey McFooey, Yaakov Selkowitz 
+<table class="pkgdetails">
+<tr><td><p><span class="detail">summary</span>:</p></td><td><p>Perl distribution Net-SMTP-SSL</p></td></tr>
+<tr><td><p><span class="detail">description</span>:</p></td><td><p>Implements the same API as Net::SMTP, but uses IO::Socket::SSL for
+its network operations in order to support encrypted connections.</p></td></tr>
+<tr><td><p><span class="detail">categories</span>:</p></td><td><p>Perl</p></td></tr>
+<tr><td><p><span class="detail">install package(s)</span>:</p></td><td><p><a href="perl-Net-SMTP-SSL.html">perl-Net-SMTP-SSL</a></p></td></tr>
+<tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>Blooey McFooey, Yaakov Selkowitz
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> to report bugs or ask questions.
-<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span>
-<br><br>
+<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span></p></td></tr>
+</table>
 <ul>
 <li><span class="detail">x86_64</span></li>
 <table class="pkgtable">
diff --git a/test/testdata/htdocs.expected/summary/perl-Net-SMTP-SSL.html b/test/testdata/htdocs.expected/summary/perl-Net-SMTP-SSL.html
index 10e040f..0f42fb3 100644
--- a/test/testdata/htdocs.expected/summary/perl-Net-SMTP-SSL.html
+++ b/test/testdata/htdocs.expected/summary/perl-Net-SMTP-SSL.html
@@ -10,15 +10,16 @@
 <div id="main">
 <!--#include virtual="/top.html" -->
 <h1>Package: perl-Net-SMTP-SSL</h1>
-<span class="detail">summary</span>: Perl distribution Net-SMTP-SSL<br><br>
-<span class="detail">description</span>: Implements the same API as Net::SMTP, but uses IO::Socket::SSL for
-its network operations in order to support encrypted connections.<br><br>
-<span class="detail">categories</span>: Perl<br><br>
-<span class="detail">source package</span>: <a href="perl-Net-SMTP-SSL-src.html">perl-Net-SMTP-SSL</a><br><br>
-<span class="detail">maintainer(s)</span>: Blooey McFooey, Yaakov Selkowitz 
+<table class="pkgdetails">
+<tr><td><p><span class="detail">summary</span>:</p></td><td><p>Perl distribution Net-SMTP-SSL</p></td></tr>
+<tr><td><p><span class="detail">description</span>:</p></td><td><p>Implements the same API as Net::SMTP, but uses IO::Socket::SSL for
+its network operations in order to support encrypted connections.</p></td></tr>
+<tr><td><p><span class="detail">categories</span>:</p></td><td><p>Perl</p></td></tr>
+<tr><td><p><span class="detail">source package</span>:</p></td><td><p><a href="perl-Net-SMTP-SSL-src.html">perl-Net-SMTP-SSL</a></p></td></tr>
+<tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>Blooey McFooey, Yaakov Selkowitz
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> to report bugs or ask questions.
-<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span>
-<br><br>
+<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span></p></td></tr>
+</table>
 <ul>
 <li><span class="detail">x86_64</span></li>
 <table class="pkgtable">
diff --git a/test/testdata/htdocs.expected/summary/rpm-doc-src.html b/test/testdata/htdocs.expected/summary/rpm-doc-src.html
index a84abfe..fe14c1b 100755
--- a/test/testdata/htdocs.expected/summary/rpm-doc-src.html
+++ b/test/testdata/htdocs.expected/summary/rpm-doc-src.html
@@ -10,10 +10,12 @@
 <div id="main">
 <!--#include virtual="/top.html" -->
 <h1>Source Package: rpm-doc</h1>
-<span class="detail">summary</span>: Obsolete package for RPM package management system manual pages (extra text to so repr is not one line)<br><br>
-<span class="detail">description</span>: Obsolete package for RPM package management system manual pages (extra text to so repr is not one line)<br><br>
-<span class="detail">categories</span>: _obsolete<br><br>
-<span class="detail">install package(s)</span>: <a href="rpm-doc.html">rpm-doc</a><br><br>
+<table class="pkgdetails">
+<tr><td><p><span class="detail">summary</span>:</p></td><td><p>Obsolete package for RPM package management system manual pages (extra text to so repr is not one line)</p></td></tr>
+<tr><td><p><span class="detail">description</span>:</p></td><td><p>Obsolete package for RPM package management system manual pages (extra text to so repr is not one line)</p></td></tr>
+<tr><td><p><span class="detail">categories</span>:</p></td><td><p>_obsolete</p></td></tr>
+<tr><td><p><span class="detail">install package(s)</span>:</p></td><td><p><a href="rpm-doc.html">rpm-doc</a></p></td></tr>
+</table>
 <ul>
 <li><span class="detail">x86_64</span></li>
 <table class="pkgtable">
diff --git a/test/testdata/htdocs.expected/summary/rpm-doc.html b/test/testdata/htdocs.expected/summary/rpm-doc.html
index c48107e..7f18d06 100644
--- a/test/testdata/htdocs.expected/summary/rpm-doc.html
+++ b/test/testdata/htdocs.expected/summary/rpm-doc.html
@@ -10,10 +10,12 @@
 <div id="main">
 <!--#include virtual="/top.html" -->
 <h1>Package: rpm-doc</h1>
-<span class="detail">summary</span>: Obsolete package for RPM package management system manual pages (extra text to so repr is not one line)<br><br>
-<span class="detail">description</span>: Obsolete package for RPM package management system manual pages (extra text to so repr is not one line)<br><br>
-<span class="detail">categories</span>: _obsolete<br><br>
-<span class="detail">source package</span>: <a href="rpm-doc-src.html">rpm-doc</a><br><br>
+<table class="pkgdetails">
+<tr><td><p><span class="detail">summary</span>:</p></td><td><p>Obsolete package for RPM package management system manual pages (extra text to so repr is not one line)</p></td></tr>
+<tr><td><p><span class="detail">description</span>:</p></td><td><p>Obsolete package for RPM package management system manual pages (extra text to so repr is not one line)</p></td></tr>
+<tr><td><p><span class="detail">categories</span>:</p></td><td><p>_obsolete</p></td></tr>
+<tr><td><p><span class="detail">source package</span>:</p></td><td><p><a href="rpm-doc-src.html">rpm-doc</a></p></td></tr>
+</table>
 <ul>
 <li><span class="detail">x86_64</span></li>
 <table class="pkgtable">
diff --git a/test/testdata/htdocs.expected/summary/staleversion-src.html b/test/testdata/htdocs.expected/summary/staleversion-src.html
index afa229b..c5ef835 100755
--- a/test/testdata/htdocs.expected/summary/staleversion-src.html
+++ b/test/testdata/htdocs.expected/summary/staleversion-src.html
@@ -10,14 +10,15 @@
 <div id="main">
 <!--#include virtual="/top.html" -->
 <h1>Source Package: staleversion</h1>
-<span class="detail">summary</span>: Test package for stale version removal<br><br>
-<span class="detail">description</span>: Test package for stale version removal<br><br>
-<span class="detail">categories</span>: Shells Base<br><br>
-<span class="detail">install package(s)</span>: <a href="staleversion.html">staleversion</a><br><br>
-<span class="detail">maintainer(s)</span>: Blooey McFooey 
+<table class="pkgdetails">
+<tr><td><p><span class="detail">summary</span>:</p></td><td><p>Test package for stale version removal</p></td></tr>
+<tr><td><p><span class="detail">description</span>:</p></td><td><p>Test package for stale version removal</p></td></tr>
+<tr><td><p><span class="detail">categories</span>:</p></td><td><p>Shells Base</p></td></tr>
+<tr><td><p><span class="detail">install package(s)</span>:</p></td><td><p><a href="staleversion.html">staleversion</a></p></td></tr>
+<tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>Blooey McFooey
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> to report bugs or ask questions.
-<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span>
-<br><br>
+<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span></p></td></tr>
+</table>
 <ul>
 <li><span class="detail">x86_64</span></li>
 <table class="pkgtable">
diff --git a/test/testdata/htdocs.expected/summary/staleversion.html b/test/testdata/htdocs.expected/summary/staleversion.html
index 4a86f5e..00e875a 100644
--- a/test/testdata/htdocs.expected/summary/staleversion.html
+++ b/test/testdata/htdocs.expected/summary/staleversion.html
@@ -10,14 +10,15 @@
 <div id="main">
 <!--#include virtual="/top.html" -->
 <h1>Package: staleversion</h1>
-<span class="detail">summary</span>: Test package for stale version removal<br><br>
-<span class="detail">description</span>: Test package for stale version removal<br><br>
-<span class="detail">categories</span>: Shells Base<br><br>
-<span class="detail">source package</span>: <a href="staleversion-src.html">staleversion</a><br><br>
-<span class="detail">maintainer(s)</span>: Blooey McFooey 
+<table class="pkgdetails">
+<tr><td><p><span class="detail">summary</span>:</p></td><td><p>Test package for stale version removal</p></td></tr>
+<tr><td><p><span class="detail">description</span>:</p></td><td><p>Test package for stale version removal</p></td></tr>
+<tr><td><p><span class="detail">categories</span>:</p></td><td><p>Shells Base</p></td></tr>
+<tr><td><p><span class="detail">source package</span>:</p></td><td><p><a href="staleversion-src.html">staleversion</a></p></td></tr>
+<tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>Blooey McFooey
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> to report bugs or ask questions.
-<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span>
-<br><br>
+<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span></p></td></tr>
+</table>
 <ul>
 <li><span class="detail">x86_64</span></li>
 <table class="pkgtable">
diff --git a/test/testdata/htdocs.expected/summary/test-c-src.html b/test/testdata/htdocs.expected/summary/test-c-src.html
index c5d1af7..e53dfe1 100755
--- a/test/testdata/htdocs.expected/summary/test-c-src.html
+++ b/test/testdata/htdocs.expected/summary/test-c-src.html
@@ -10,14 +10,15 @@
 <div id="main">
 <!--#include virtual="/top.html" -->
 <h1>Source Package: test-c</h1>
-<span class="detail">summary</span>: test package C<br><br>
-<span class="detail">description</span>: test package C<br><br>
-<span class="detail">categories</span>: Devel<br><br>
-<span class="detail">install package(s)</span>: <a href="test-c.html">test-c</a><br><br>
-<span class="detail">maintainer(s)</span>: ORPHANED 
+<table class="pkgdetails">
+<tr><td><p><span class="detail">summary</span>:</p></td><td><p>test package C</p></td></tr>
+<tr><td><p><span class="detail">description</span>:</p></td><td><p>test package C</p></td></tr>
+<tr><td><p><span class="detail">categories</span>:</p></td><td><p>Devel</p></td></tr>
+<tr><td><p><span class="detail">install package(s)</span>:</p></td><td><p><a href="test-c.html">test-c</a></p></td></tr>
+<tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>ORPHANED
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> to report bugs or ask questions.
-<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span>
-<br><br>
+<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span></p></td></tr>
+</table>
 <ul>
 <li><span class="detail">x86_64</span></li>
 <table class="pkgtable">
diff --git a/test/testdata/htdocs.expected/summary/test-c.html b/test/testdata/htdocs.expected/summary/test-c.html
index 78f4796..642cf13 100644
--- a/test/testdata/htdocs.expected/summary/test-c.html
+++ b/test/testdata/htdocs.expected/summary/test-c.html
@@ -10,16 +10,17 @@
 <div id="main">
 <!--#include virtual="/top.html" -->
 <h1>Package: test-c</h1>
-<span class="detail">summary</span>: test package C<br><br>
-<span class="detail">description</span>: test package C<br><br>
-<span class="detail">categories</span>: Devel<br><br>
-<span class="detail">depends</span>: <a href="test-d.html">test-d (>= 1.0)</a>, <a href="test-e.html">test-e</a><br><br>
-<span class="detail">obsoletes</span>: <a href="obs-a.html">obs-a</a>, <a href="obs-b.html">obs-b</a><br><br>
-<span class="detail">source package</span>: <a href="test-c-src.html">test-c</a><br><br>
-<span class="detail">maintainer(s)</span>: ORPHANED 
+<table class="pkgdetails">
+<tr><td><p><span class="detail">summary</span>:</p></td><td><p>test package C</p></td></tr>
+<tr><td><p><span class="detail">description</span>:</p></td><td><p>test package C</p></td></tr>
+<tr><td><p><span class="detail">categories</span>:</p></td><td><p>Devel</p></td></tr>
+<tr><td><p><span class="detail">depends</span>:</p></td><td><p><a href="test-d.html">test-d (>= 1.0)</a>, <a href="test-e.html">test-e</a></p></td></tr>
+<tr><td><p><span class="detail">obsoletes</span>:</p></td><td><p><a href="obs-a.html">obs-a</a>, <a href="obs-b.html">obs-b</a></p></td></tr>
+<tr><td><p><span class="detail">source package</span>:</p></td><td><p><a href="test-c-src.html">test-c</a></p></td></tr>
+<tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>ORPHANED
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> to report bugs or ask questions.
-<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span>
-<br><br>
+<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span></p></td></tr>
+</table>
 <ul>
 <li><span class="detail">x86_64</span></li>
 <table class="pkgtable">
diff --git a/test/testdata/htdocs.expected/summary/test-d-src.html b/test/testdata/htdocs.expected/summary/test-d-src.html
index 082e997..81a7bdb 100755
--- a/test/testdata/htdocs.expected/summary/test-d-src.html
+++ b/test/testdata/htdocs.expected/summary/test-d-src.html
@@ -10,14 +10,15 @@
 <div id="main">
 <!--#include virtual="/top.html" -->
 <h1>Source Package: test-d</h1>
-<span class="detail">summary</span>: test package D<br><br>
-<span class="detail">description</span>: test package D<br><br>
-<span class="detail">categories</span>: Devel<br><br>
-<span class="detail">install package(s)</span>: <a href="test-d.html">test-d</a><br><br>
-<span class="detail">maintainer(s)</span>: ORPHANED 
+<table class="pkgdetails">
+<tr><td><p><span class="detail">summary</span>:</p></td><td><p>test package D</p></td></tr>
+<tr><td><p><span class="detail">description</span>:</p></td><td><p>test package D</p></td></tr>
+<tr><td><p><span class="detail">categories</span>:</p></td><td><p>Devel</p></td></tr>
+<tr><td><p><span class="detail">install package(s)</span>:</p></td><td><p><a href="test-d.html">test-d</a></p></td></tr>
+<tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>ORPHANED
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> to report bugs or ask questions.
-<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span>
-<br><br>
+<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span></p></td></tr>
+</table>
 <ul>
 <li><span class="detail">x86_64</span></li>
 <table class="pkgtable">
diff --git a/test/testdata/htdocs.expected/summary/test-d.html b/test/testdata/htdocs.expected/summary/test-d.html
index 79458ea..90ccc9e 100644
--- a/test/testdata/htdocs.expected/summary/test-d.html
+++ b/test/testdata/htdocs.expected/summary/test-d.html
@@ -10,14 +10,16 @@
 <div id="main">
 <!--#include virtual="/top.html" -->
 <h1>Package: test-d</h1>
-<span class="detail">summary</span>: test package D<br><br>
-<span class="detail">description</span>: test package D<br><br>
-<span class="detail">categories</span>: Devel<br><br>
-<span class="detail">source package</span>: <a href="test-d-src.html">test-d</a><br><br>
-<span class="detail">maintainer(s)</span>: ORPHANED 
+<table class="pkgdetails">
+<tr><td><p><span class="detail">summary</span>:</p></td><td><p>test package D</p></td></tr>
+<tr><td><p><span class="detail">description</span>:</p></td><td><p>test package D</p></td></tr>
+<tr><td><p><span class="detail">categories</span>:</p></td><td><p>Devel</p></td></tr>
+<tr><td><p><span class="detail">rdepends</span>:</p></td><td><p><a href="test-c.html">test-c</a></p></td></tr>
+<tr><td><p><span class="detail">source package</span>:</p></td><td><p><a href="test-d-src.html">test-d</a></p></td></tr>
+<tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>ORPHANED
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> to report bugs or ask questions.
-<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span>
-<br><br>
+<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span></p></td></tr>
+</table>
 <ul>
 <li><span class="detail">x86_64</span></li>
 <table class="pkgtable">
diff --git a/test/testdata/htdocs.expected/summary/test-e-src.html b/test/testdata/htdocs.expected/summary/test-e-src.html
index 565206e..81e6a7f 100755
--- a/test/testdata/htdocs.expected/summary/test-e-src.html
+++ b/test/testdata/htdocs.expected/summary/test-e-src.html
@@ -10,15 +10,16 @@
 <div id="main">
 <!--#include virtual="/top.html" -->
 <h1>Source Package: test-e</h1>
-<span class="detail">summary</span>: test package E<br><br>
-<span class="detail">description</span>: test package E<br><br>
-<span class="detail">categories</span>: Devel<br><br>
-<span class="detail">build-depends</span>: <a href="cygwin-devel.html">cygwin-devel</a><br><br>
-<span class="detail">install package(s)</span>: <a href="test-e.html">test-e</a><br><br>
-<span class="detail">maintainer(s)</span>: ORPHANED 
+<table class="pkgdetails">
+<tr><td><p><span class="detail">summary</span>:</p></td><td><p>test package E</p></td></tr>
+<tr><td><p><span class="detail">description</span>:</p></td><td><p>test package E</p></td></tr>
+<tr><td><p><span class="detail">categories</span>:</p></td><td><p>Devel</p></td></tr>
+<tr><td><p><span class="detail">build-depends</span>:</p></td><td><p><a href="cygwin-devel.html">cygwin-devel</a></p></td></tr>
+<tr><td><p><span class="detail">install package(s)</span>:</p></td><td><p><a href="test-e.html">test-e</a></p></td></tr>
+<tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>ORPHANED
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> to report bugs or ask questions.
-<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span>
-<br><br>
+<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span></p></td></tr>
+</table>
 <ul>
 <li><span class="detail">x86_64</span></li>
 <table class="pkgtable">
diff --git a/test/testdata/htdocs.expected/summary/test-e.html b/test/testdata/htdocs.expected/summary/test-e.html
index ed22284..4d742f8 100644
--- a/test/testdata/htdocs.expected/summary/test-e.html
+++ b/test/testdata/htdocs.expected/summary/test-e.html
@@ -10,14 +10,16 @@
 <div id="main">
 <!--#include virtual="/top.html" -->
 <h1>Package: test-e</h1>
-<span class="detail">summary</span>: test package E<br><br>
-<span class="detail">description</span>: test package E<br><br>
-<span class="detail">categories</span>: Devel<br><br>
-<span class="detail">source package</span>: <a href="test-e-src.html">test-e</a><br><br>
-<span class="detail">maintainer(s)</span>: ORPHANED 
+<table class="pkgdetails">
+<tr><td><p><span class="detail">summary</span>:</p></td><td><p>test package E</p></td></tr>
+<tr><td><p><span class="detail">description</span>:</p></td><td><p>test package E</p></td></tr>
+<tr><td><p><span class="detail">categories</span>:</p></td><td><p>Devel</p></td></tr>
+<tr><td><p><span class="detail">rdepends</span>:</p></td><td><p><a href="test-c.html">test-c</a></p></td></tr>
+<tr><td><p><span class="detail">source package</span>:</p></td><td><p><a href="test-e-src.html">test-e</a></p></td></tr>
+<tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>ORPHANED
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> to report bugs or ask questions.
-<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span>
-<br><br>
+<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span></p></td></tr>
+</table>
 <ul>
 <li><span class="detail">x86_64</span></li>
 <table class="pkgtable">
diff --git a/test/testdata/htdocs.expected/summary/testpackage-src.html b/test/testdata/htdocs.expected/summary/testpackage-src.html
index 5864662..1ce0be6 100755
--- a/test/testdata/htdocs.expected/summary/testpackage-src.html
+++ b/test/testdata/htdocs.expected/summary/testpackage-src.html
@@ -10,14 +10,15 @@
 <div id="main">
 <!--#include virtual="/top.html" -->
 <h1>Source Package: testpackage</h1>
-<span class="detail">summary</span>: A test package (stuff & other stuff)<br><br>
-<span class="detail">description</span>: A test package (stuff & other stuff)<br><br>
-<span class="detail">categories</span>: Devel<br><br>
-<span class="detail">install package(s)</span>: <a href="testpackage.html">testpackage</a><br><br>
-<span class="detail">maintainer(s)</span>: Blooey McFooey 
+<table class="pkgdetails">
+<tr><td><p><span class="detail">summary</span>:</p></td><td><p>A test package (stuff & other stuff)</p></td></tr>
+<tr><td><p><span class="detail">description</span>:</p></td><td><p>A test package (stuff & other stuff)</p></td></tr>
+<tr><td><p><span class="detail">categories</span>:</p></td><td><p>Devel</p></td></tr>
+<tr><td><p><span class="detail">install package(s)</span>:</p></td><td><p><a href="testpackage.html">testpackage</a></p></td></tr>
+<tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>Blooey McFooey
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> to report bugs or ask questions.
-<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span>
-<br><br>
+<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span></p></td></tr>
+</table>
 <ul>
 <li><span class="detail">x86_64</span></li>
 <table class="pkgtable">
diff --git a/test/testdata/htdocs.expected/summary/testpackage.html b/test/testdata/htdocs.expected/summary/testpackage.html
index ee6b282..896e12a 100644
--- a/test/testdata/htdocs.expected/summary/testpackage.html
+++ b/test/testdata/htdocs.expected/summary/testpackage.html
@@ -10,14 +10,15 @@
 <div id="main">
 <!--#include virtual="/top.html" -->
 <h1>Package: testpackage</h1>
-<span class="detail">summary</span>: A test package (stuff & other stuff)<br><br>
-<span class="detail">description</span>: A test package (stuff & other stuff)<br><br>
-<span class="detail">categories</span>: Devel<br><br>
-<span class="detail">source package</span>: <a href="testpackage-src.html">testpackage</a><br><br>
-<span class="detail">maintainer(s)</span>: Blooey McFooey 
+<table class="pkgdetails">
+<tr><td><p><span class="detail">summary</span>:</p></td><td><p>A test package (stuff & other stuff)</p></td></tr>
+<tr><td><p><span class="detail">description</span>:</p></td><td><p>A test package (stuff & other stuff)</p></td></tr>
+<tr><td><p><span class="detail">categories</span>:</p></td><td><p>Devel</p></td></tr>
+<tr><td><p><span class="detail">source package</span>:</p></td><td><p><a href="testpackage-src.html">testpackage</a></p></td></tr>
+<tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>Blooey McFooey
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> to report bugs or ask questions.
-<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span>
-<br><br>
+<a href="/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span></p></td></tr>
+</table>
 <ul>
 <li><span class="detail">x86_64</span></li>
 <table class="pkgtable">
diff --git a/test/testdata/process_arch/packages.json.expected b/test/testdata/process_arch/packages.json.expected
index 0a2a7df..a915f4d 100644
--- a/test/testdata/process_arch/packages.json.expected
+++ b/test/testdata/process_arch/packages.json.expected
@@ -51,6 +51,7 @@
  '            "arches": [\n'
  '                "x86_64"\n'
  '            ],\n'
+ '            "build_recipe": "https://cygwin.com/cgit/cygwin-packages/cygwin/tree/cygwin.cygport",\n'
  '            "license": "LGPL-3.0-or-later WITH LGPL-3.0-linking-exception",\n'
  '            "maintainers": [\n'
  '                "Corinna Vinschen",\n'
diff --git a/test/testdata/repodir/cygwin.git/cygwin.cygport b/test/testdata/repodir/cygwin.git/cygwin.cygport
new file mode 100644
index 0000000..e69de29



More information about the Cygwin-apps-cvs mailing list