Repository: gutenbergtools/gutenbergsite
Pull request #50: deploy updates to bibrec from #48, remove some dead files
Author: login: eshellman
Created: 2025-04-15T16:43:12Z | Merged: 2025-04-18T20:45:32Z

the changes from #48 have been merged into this PR

this is now running on dev.gutenberg.org the "bibrec" is pages like https://dev.gutenberg.org/ebooks/75387
I'm going to welcome comment on this PR 

I wanted to use the dev branch to track the website assets used for dev.gutenberg.org 
the branch needed cleanup. in the course of cleanup I found some dead files which made for a dirty repo.

With this merge, we will be able to set the dev site static assets to track the dev branch, and the www site static assets to track the master branch, and more easily develop site assets.  

I have not made changes on to the jekyll build of web pages.


Diff:
diff --git a/ebooks/book_landing_page.css b/ebooks/book_landing_page.css
deleted file mode 100644
index 27bd938b..00000000
--- a/ebooks/book_landing_page.css
+++ /dev/null
@@ -1,67 +0,0 @@
-/*.tab_structure {
-  box-sizing: border-box;
-}*/
-.tabs {
-  display: flex;
-  flex-wrap: wrap;
-  max-width: 700px;
-  #background: #efefef;
-  /*box-shadow: 0 48px 80px -32px rgba(0,0,0,0.3);*/
-}
-.tabs .input {
-  position: absolute;
-  opacity: 0;
-}
-.tabs .label {
-  width: 100%;
-  padding: 20px 30px;
-  background: #e5e5e5;
-  cursor: pointer;
-  font-weight: bold;
-  font-size: 18px;
-  color: #7f7f7f;
-  transition: background 0.1s, color 0.1s;
-}
-
-.tabs .label:hover {
-  background: #d8d8d8;
-}
-
-.tabs .label:active {
-  background: #ccc;
-}
-
-.tabs .input:focus + .label {
-  box-shadow: inset 0px 0px 0px 3px #2aa1c0;
-  z-index: 1;
-}
-
-.tabs .input:checked + .label {
-  background: #fff;
-  color: #000;
-}
-
-.book_container{
-  display: table;
-}
-
-@media (min-width: 600px) {
-  .tabs .label {
-    width: auto;
-  }
-}
-.tabs .panel {
-  display: none;
-  padding: 20px 30px 30px;
-  background: #fff;
-}
-
-@media (min-width: 600px) {
-  .tabs .panel {
-    order: 99;
-  }
-}
-
-.tabs .input:checked + .label + .panel {
-  display: block;
-}
diff --git a/ebooks/tab.html b/ebooks/tab.html
deleted file mode 100644
index 5ac038f8..00000000
--- a/ebooks/tab.html
+++ /dev/null
@@ -1,130 +0,0 @@
-<!DOCTYPE html>
-<html class="client-nojs" lang="en" dir="ltr" xmlns="http://www.w3.org/1999/xhtml" xmlns:og="http://opengraphprotocol.org/schema/" xmlns:fb="http://www.facebook.com/2008/fbml">
-<head>
-<meta charset="UTF-8"/>
-<title>Project Gutenberg</title>
-<link rel="stylesheet" href="../gutenberg/style.css?v=1.1">
-<link rel="stylesheet" href="../gutenberg/nav.css?v=1.1">
-<link rel="stylesheet" href="book_landing_page.css">
-<meta name="viewport" content="width=device-width, initial-scale=1">
-
-
-<meta name="keywords" content="books, ebooks, free, kindle, android, iphone, ipad"/>
-<meta name="google-site-verification" content="wucOEvSnj5kP3Ts_36OfP64laakK-1mVTg-ptrGC9io"/>
-<meta name="alexaVerifyID" content="4WNaCljsE-A82vP_ih2H_UqXZvM"/>
-<link rel="copyright" href="http://www.gnu.org/copyleft/fdl.html"/>
-<link rel="shortcut icon" href="/gutenberg/fav/favicon.ico"/>
-
-<meta property="og:title"        content="Project Gutenberg" />
-<meta property="og:type"         content="website" />
-<meta property="og:url"          content="http://www.gutenberg.org/" />
-<meta property="og:description"  content="Project Gutenberg offers free ebooks to download." />
-<meta property="fb:admins"       content="615269807" />
-<meta property="fb:app_id"       content="115319388529183" />
-<meta property="og:site_name"    content="Project Gutenberg" />
-<meta property="og:image"        content="http://www.gutenberg.org/pics/logo-144x144.png" />
-</head>
-<body>
-  <div class="container">
-    <nav role="navigation">
-      <a href="/index.html" class="no-hover">
-        <img class="logo" src="../gutenberg/pg-logo-129x80.png" alt="Project Gutenberg" >
-      </a>
-      <label for="show-menu" class="show-menu"><img src="gutenberg/menu-icon.png" class="menu"></label>
-      <input type="checkbox" id="show-menu" role="button">
-      <!--<a href="#" class="show-menu"></a>-->
-
-      <ul id="menu">
-        <li><a href="/ebooks/index.html">Find a Book</a></li>
-        <li><a href="#">How to Help</a></li>
-        <li><a href="#">Help</a>
-          <ul class="hidden">
-            <li><a href="/help/mobile.html">Mobile How-To</a></li>
-            <li><a href="#">Sub-2</a></li>
-            <li><a href="#">Sub-3</a></li>
-          </ul>
-        </li>
-        <li><a href="#">About</a>
-          <ul class="hidden">
-            <li><a href="about/history.html">About Us</a></li>
-            <li><a href="policy/privacy_policy.html">Privacy Policy</a></li>
-            <li><a href="about/contact_information.html">Contact Us</a></li>
-          </ul>
-        </li>
-        <li><a href="/donate/donate.html">Donate</a></li>
-      </ul>
-     <div class="donate">
-      <div class="searchbox">
-      <form method="get" action="/ebooks/search/"
-      accept-charset="utf-8" enctype="multipart/form-data">
-          <input type="text" value="" id="menu-book-search" name="query" class="searchInput" title="" alt="undefined string" tabindex="20" size="20" maxlength="80"
-          placeholder="Search for Books"/>
-      </form>
-      </div>
-        <form class="donatelink" action="https://www.paypal.com/cgi-bin/webscr" method="post" target="new">
-            <p><a href="/donate/">Donation</a></p>
-            <input type="hidden" name="cmd" value="_s-xclick" />
-            <input type="hidden" name="hosted_button_id" value="XKAL6BZL3YPSN" />
-            <input class="donbtn" type="image" src="/pics/en_US.gif" name="submit" alt="Donate via PayPal" />
-          </form>
-      </div>
-
-    </nav>
-<div class="page_content">
-  <div class="tabs">
-    <input name="tabs" type="radio" id="tab-1" checked="checked" class="input"/>
-    <label for="tab-1" class="label">Download</label>
-    <div class="panel">
-      <table class="files" summary="Table of available file types and sizes.">
-      <tr>
-      <th>Format </th>
-      <th>Size</th>
-      </tr>
-      <tr>
-      <td property="dcterms:format" content="text/html; charset=us-ascii" datatype="dcterms:IMT" class="unpadded icon_save"><a href="//www.gutenberg.org/files/58784/58784-h/58784-h.htm" type="text/html; charset=us-ascii" class="link" title="Download">Read this book online: HTML</a></td>
-      <td class="right" property="dcterms:extent" content="85678">84 kB</td>
-      </tr>
-      <tr>
-      <td property="dcterms:format" content="application/epub+zip" datatype="dcterms:IMT" class="unpadded icon_save"><a href="//www.gutenberg.org/ebooks/58784.epub.images?session_id=0af6e2780e30727ccae4a943f9e318f748fa1f99" type="application/epub+zip" class="link" title="Download">EPUB (with images)</a></td>
-      <td class="right" property="dcterms:extent" content="357863">349 kB</td>
-      </tr>
-      <tr>
-      <td property="dcterms:format" content="application/epub+zip" datatype="dcterms:IMT" class="unpadded icon_save"><a href="//www.gutenberg.org/ebooks/58784.epub.noimages?session_id=0af6e2780e30727ccae4a943f9e318f748fa1f99" type="application/epub+zip" class="link" title="Download">EPUB (no images)</a></td>
-      </tr>
-      <tr>
-      <td property="dcterms:format" content="application/x-mobipocket-ebook" datatype="dcterms:IMT" class="unpadded icon_save"><a href="//www.gutenberg.org/ebooks/58784.kindle.images?session_id=0af6e2780e30727ccae4a943f9e318f748fa1f99" type="application/x-mobipocket-ebook" class="link" title="Download">Kindle (with images)</a></td>
-      <td class="right" property="dcterms:extent" content="767711">750 kB</td>
-      </tr>
-      <tr>
-      <td property="dcterms:format" content="application/x-mobipocket-ebook" datatype="dcterms:IMT" class="unpadded icon_save"><a href="//www.gutenberg.org/ebooks/58784.kindle.noimages?session_id=0af6e2780e30727ccae4a943f9e318f748fa1f99" type="application/x-mobipocket-ebook" class="link" title="Download">Kindle (no images)</a></td>
-      <td class="right" property="dcterms:extent" content="315421">308 kB</td>
-      </tr>
-      <tr>
-      <td property="dcterms:format" content="text/plain" datatype="dcterms:IMT" class="unpadded icon_save"><a href="//www.gutenberg.org/ebooks/58784.txt.utf-8" type="text/plain" class="link" title="Download">Plain Text UTF-8</a></td>
-      <td class="right" property="dcterms:extent" content="80713">79 kB</td>
-      </tr>
-      <tr>
-      <td class="unpadded icon_file"><a href="/files/58784/" class="link">More Files…</a></td>
-      </tr>
-      </table>
-
-    </div>
-
-  <input name="tabs" type="radio" id="tab-2" class="input"/>
-  <label for="tab-2" class="label">Tangerine</label>
-  <div class="panel">
-    <h1>Tangerine</h1>
-    <p>The tangerine (Citrus tangerina) is an orange-colored citrus fruit that is closely related to, or possibly a type of, mandarin orange (Citrus reticulata).</p>
-    <p>The name was first used for fruit coming from Tangier, Morocco, described as a mandarin variety. Under the Tanaka classification system, Citrus tangerina is considered a separate species.</p>
-  </div>
-
-  <input name="tabs" type="radio" id="tab-3" class="input"/>
-  <label for="tab-3" class="label">Clemantine</label>
-  <div class="panel">
-    <h1>Clemantine</h1>
-    <p>A clementine (Citrus ×clementina) is a hybrid between a mandarin orange and a sweet orange, so named in 1902. The exterior is a deep orange colour with a smooth, glossy appearance. Clementines can be separated into 7 to 14 segments. Similarly to tangerines, they tend to be easy to peel.</p>
-  </div>
-</div>
-</div>
-</div>
-</body>
diff --git a/ebooks/xxxresults.php b/ebooks/xxxresults.php
deleted file mode 100644
index 51d4c3d5..00000000
--- a/ebooks/xxxresults.php
+++ /dev/null
@@ -1,490 +0,0 @@
-<?php
-
-// config section
-$pagesize = 100;
-$max_results = 1000;
-$max_ft_results = 5000;
-
-// gbn 20200203: Need to set this differently than the old site:
-set_include_path(get_include_path() . PATH_SEPARATOR . "/public/vhost/g/gutenberg/private/lib/php");
-include_once ("pgcat.phh");
-
-$db = $config->db ();
-// gbn 20200203: not sure where rate_limit is:
-// rate_limit ();
-// userobots ();
-
-pageheader ("Search on Titles &gt; Results");
-privatecache ();
-
-$db2 = $config->db ();
-$dofulltext = false;
-
-// For debugging:
-// $time_start  = getmicrotime ();
-// $time_query1 = getmicrotime ();
-// $time_query2 = getmicrotime ();
-
-function getall ($db, $field, $filterfunc = null) {
-  $f = array ();
-  $g = array ();
-  if ($db->FirstRow ()) {
-    do {
-      if (!$filterfunc || $filterfunc ($db)) {
-	$f[] = $db->get ($field, SQLCHAR);
-      } else {
-	$g[] = $db->get ($field, SQLCHAR);
-      }
-    } while ($db->NextRow ());
-  }
-  return array ($f, $g);;
-}
-
-function mkurl ($fields) {
-  $u = array ();
-  foreach ($fields as $f) {
-    if (!empty ($_REQUEST[$f])) {
-      $u[] = "$f=" . urlencode ($_REQUEST[$f]);
-    }
-  }
-  return join ("&amp;", $u);
-}
-
-class CalcFieldAuthorDateRoleLink {
-  function f ($db) {
-    global $config;
-    $fk_authors = $db->get ("fk_authors", SQLINT);
-    $author     = $db->get ("author",     SQLCHAR);
-    $page = find_browse_page ($author);
-    return "<a href=\"/browse/authors/$page#a$fk_authors\">" . 
-      FormatAuthorDateRole ($db) . "</a>";
-  }
-}
-
-class BooksTable extends ListTable {
-  function BooksTable () {
-    global $dofulltext, $config;
-    $this->AddSimpleColumn ("fk_books", "Etext-No.", "narrow right");
-    $this->AddSimpleColumn ("c_audioicon", "<img src=\"/pics/stock_volume-16.png\" width=\"16\" height=\"16\" alt=\"Audio\" title=\"Audio Book\"$config->endtag>", "narrow");
-    $this->AddSimpleColumn ("c_author", "Author", "pgdbdataauthor");
-    $this->AddColumn ("<a href=\"/ebooks/#fk_books#\">#c_title#</a>", "Title", "pgdbdatatitle");
-    $this->AddSimpleColumn ("lang", "Language", "narrow");
-    if ($dofulltext) {
-      $this->AddSimpleColumn ("", "Fulltext Context", "narrow");
-    }
-  }
-
-  function PrintRow ($db) {
-    global $dofulltext, $fulltext, $config, $db2, $fk_files;
-    // print out a row of the table (w/o <tr> tags)
-
-    $pk = $db->get ("pk", SQLINT);
-
-    echo ("<td>$pk</td>");
-
-    $db2->exec ("select * from mn_books_categories where fk_books = $pk and fk_categories <= 2");
-    if ($db2->FirstRow ()) {
-      echo ("<td><img src=\"/pics/stock_volume-16.png\" width=\"16\" height=\"16\" alt=\"Audio\" title=\"Audio Book\"$config->endtag></td>");
-    } else {
-      echo ("<td>&nbsp;</td>");
-    }
-
-    $db2->exec ("select * from v_books_authors where fk_books = $pk order by heading, role, author");
-    $db2->calcfields ["c_author"] = new CalcFieldAuthorDateRoleLink ();
-
-    echo ("<td>");
-    list ($a, $b) = getall ($db2, "c_author", 
-			    create_function ('$db', 'return $db->get ("heading", SQLINT) == 1;'));
-    echo (join ("<br$config->endtag>", $a));
-
-    if (count ($b)) {
-      echo ("<ul><li>");
-      echo (join ("</li>\n<li>", $b));
-      echo ("</li></ul>");
-    }
-    echo ("</td>");
-
-    $db2->exec ("select text, fk_attriblist from attributes " . 
-		"where fk_books = $pk order by fk_attriblist, substr (attributes.text, attributes.nonfiling + 1)");
-    $db2->calcfields ["c_title"] = new CalcFieldTitle ();
-
-    echo ("<td>");
-    list ($a, $b) = getall ($db2, "c_title", 
-			    create_function ('$db', 'return in_array 
-                                            ($db->get ("fk_attriblist", SQLINT), array (240, 245, 246));'));
-    echo ("<a href=\"/ebooks/$pk\">" . join ("<br$config->endtag>", $a)  . "</a>");
-    echo ("</td>");
-
-    $db2->exec ("select * from mn_books_langs, langs " . 
-                "where fk_books = $pk and mn_books_langs.fk_langs = langs.pk order by lang");
-    list ($a, $b) = getall ($db2, "lang");
-    echo ("<td>" . join (" ", $a) . "</td>");
-
-    if ($dofulltext) {
-      $fks = "fk_files[]=" . join ("&amp;fk_files[]=", $fk_files[$pk]);
-      $url = "fulltext-context?fulltext=" . urlencode ($fulltext) . "&amp;$fks";
-      echo ("<td><a href=\"$url\">Context</a></td>\n");
-    }
-  }
-}
-
-getstr ("author");
-getstr ("title");
-getstr ("subject");
-getstr ("lang");
-getstr ("locc");
-getint ("category");
-getstr ("filetype");
-getstr ("filemtime");
-getint ("etextnr");
-getstr ("fulltext");
-getint ("pageno");
-
-if (isset ($author)) {
-  $author = str_replace ("_", " ", $author);
-}
-if (isset ($title)) {
-  $title  = str_replace ("_", " ", $title);
-}
-
-if (isset ($filemtime)) {
-  list ($year, $month, $day, $hour, $minute, $second) = sscanf ($filemtime, "%d-%d-%d %d:%d:%d");
-  $filemtime = mktime ($hour, $minute, $second, $month, $day, $year);
-}
-
-// check if we can redirect to a browse page
-// this we can always do if the user selects just one search item
-
-$selections = 0;
-$location = null;
-
-if (isset ($etextnr)) {
-  $selections++;
-  $location = "ebooks/$etextnr";
-}
-if (isset ($filetype)) { 
-  $selections++;
-}
-if (isset ($filemtime)) { 
-  $selections++;
-}
-if (isset ($lang)) { 
-  $selections++;
-  $location = "browse/languages/$lang";
-}
-if (isset ($locc)) { 
-  $selections++;
-  $location = "browse/loccs/" . strtolower ($locc);
-}
-if (isset ($category)) {
-  $selections++;
-  $location = "browse/categories/$category";
-}
-if (isset ($author)) {
-  $selections++;
-//  $location = "author/$author";
-}
-if (isset ($title)) { 
-  $selections++;
-}
-if (isset ($subject)) { 
-  $selections++;
-}
-if (isset ($fulltext)) {
-  $selections++;
-}
-if ($selections == 1) {
-  // the user selected just one thing
-  if (isset ($location)) {
-    // and there is a static page listing just that
-    http_redirect ("/$location");
-    exit;
-  }
-}
-
-if ($selections == 0) {
-  p ("<a href=\"/ebooks\">New Search</a> &mdash; You didn't select anything!");
-  pagefooter ();
-  exit;
-}
-
-// user selected more than one thing
-
-// note: we are dealing with UTF-8 encoded strings !
-// strtolower etc. don't work !
-// explode on ' ' works. 
-
-$sqland   = array ();
-$yousel   = array ();
-$pks      = array ();
-$fk_files = array ();
-$pkcnt    = 0;
-
-function merge (&$a) {
-  global $pks;
-  if (count ($pks)) {
-    $pks = array_intersect ($pks, $a);
-  } else {
-    $pks = $a;
-  }
-  if (!count ($pks)) {
-    p ("No record found. Please retry.");
-    pagefooter ();
-    exit ();
-  }
-}
-
-function getpks () {
-  global $db, $pks, $pkcnt;
-  $a = array ();
-  if ($db->FirstRow ()) {
-    do {
-      $pk = $db->get ("fk_books", SQLINT);
-      if ($pk)
-	$a[$pk] = "$pk";
-    } while ($db->NextRow ());
-  }
-  $pkcnt = count ($a);
-  merge ($a);
-}
-
-function yousel ($what) {
-  global $yousel, $pkcnt;
-  $yousel[] = "$what ($pkcnt books match)";
-}
-
-// fast queries first, so we can bail out soon if nothing found
-
-if (isset ($etextnr)) {
-  $sql_etextnr = $db->f ($etextnr, SQLINT);
-  $db->exec ("select pk as fk_books from books where pk = $sql_etextnr");
-  getpks ();
-  yousel ("Etext-No. = $etextnr");
-}
-if (isset ($filetype)) { 
-  $sql_filetype = $db->f ($filetype, SQLCHAR);
-  $db->exec ("select fk_books from files where fk_filetypes = $sql_filetype");
-  getpks ();
-  yousel ("Filetype = $filetype");
-}
-if (isset ($filemtime)) { 
-  $sql_filemtime = $db->f ($filemtime, SQLDATE);
-  $db->exec ("select fk_books from files where filemtime >= $sql_filemtime");
-  getpks ();
-  yousel ("Book Modified Since: " . date ("Y-m-d H:i:s", $filemtime));
-}
-if (isset ($locc)) {
-  if ($locc=="nolocc") {
-    if (is_maintainer ()) {
-      $db->exec ("select books.pk as fk_books from books left join mn_books_loccs on books.pk=mn_books_loccs.fk_books where fk_loccs is null");
-      getpks ();
-      yousel ("LoC Class = No LoCC");
-    } else {
-      yousel ("LoC Class = No LoCC (Only available to Catalog Editors, sorry.)");
-    }
-  } else {  
-    $sql_locc = $db->f ($locc, SQLCHAR);
-    $db->exec ("select fk_books from mn_books_loccs where fk_loccs = $sql_locc");
-    getpks ();
-    yousel ("LoC Class = $locc");
-  }
-}
-if (isset ($lang)) { 
-  $sql_lang = $db->f ($lang, SQLCHAR);
-  $db->exec ("select lang from langs where pk = $sql_lang");
-  if ($db->FirstRow ()) {
-    $lang = $db->Get ("lang", SQLCHAR);
-    $db->exec ("select fk_books from mn_books_langs where fk_langs = $sql_lang");
-    getpks ();
-    yousel ("Language = $lang");
-  }
-}
-if (isset ($category)) {
-  $sql_category = $db->f ($category, SQLINT);
-  $db->exec ("select category from categories where pk = $sql_category");
-  if ($db->FirstRow ()) {
-    $category = $db->Get ("category", SQLCHAR);
-    $db->exec ("select fk_books from mn_books_categories where fk_categories = $sql_category");
-    getpks ();
-    yousel ("Category = $category");
-  }
-}
-if (isset ($author)) {
-  foreach (explode (" ", $author) as $tmp) {
-    $sql_author = $db->f ("%$tmp%", SQLCHAR);
-    $db->exec ("select fk_books from authors inner join mn_books_authors on authors.pk = mn_books_authors.fk_authors where author ilike $sql_author or pk in (select fk_authors from aliases where alias ilike $sql_author)");
-    getpks ();
-    yousel ("Author = $tmp");
-  }
-}
-if (isset ($title)) { 
-  foreach (explode (" ", $title) as $tmp) {
-    $sql_title = $db->f ("%$tmp%", SQLCHAR);
-    $db->exec ("select fk_books from attributes where fk_attriblist in (240, 245, 246, 505) and text ilike $sql_title");
-    getpks ();
-    yousel ("Title = $tmp");
-  }
-}
-if (isset ($subject)) { 
-  if ($subject=="&quot;&quot;") {
-    if (is_maintainer ()) {
-      $db->exec ("select books.pk as fk_books from books left join mn_books_subjects on books.pk=mn_books_subjects.fk_books where fk_subjects is null");
-      getpks ();
-      yousel ("Subject = \"\" (No Subject)");
-    } else {
-      yousel ("Subject = \"\" (No Subject) " .
-	      "(Only available to Catalog Editors, sorry.)");
-    }
-  } else {  
-    foreach (explode (" ", $subject) as $tmp) {
-      $sql_subject = $db->f ("%$tmp%", SQLCHAR);
-      $db->exec ("select fk_books from subjects inner join mn_books_subjects on subjects.pk = mn_books_subjects.fk_subjects where subject ilike $sql_subject");
-      getpks ();
-      yousel ("Subject = $tmp");
-    }
-  }
-}
-
-if (isset ($fulltext)) {
-  // get rid of &quot;
-  $fulltext = html_entity_decode ($fulltext);
-  $query = escapeshellarg (utf8_decode ($fulltext));
-
-  $hd = popen ("/public/vhost/g/gutenberg/private/local/bin/swish-e " . 
-	       "-f /public/vhost/g/gutenberg/private/swish-data/index.swish-e " . 
-	       "-w $query", "r");
-
-  $stopwords = "";
-  $ftpks = array ();
-  if ($hd) {
-    while (!feof ($hd)) {
-      $line = trim (fgets ($hd));
-      if (strlen ($line) && $line{0} == '#') {
-	if (preg_match ("/^# Number of hits: (\d+)/", $line, $matches)) {
-	  continue;
-	}
-        if (!strncmp ($line, "# Removed stopwords: ", 21)) {
-	  $stopwords = substr ($line, 21);
-	  continue;
-	}
-        if (!strncmp ($line, "# Indexed on: ", 14)) {
-	  // needs -H2 to turn on
-	  $indexed_on = substr ($line, 14);
-	  continue;
-	}
-	continue;
-      }
-      if (preg_match ("/^(\d+)\s+(\d+)\/(\d+)\//", $line, $matches)) {
-	// line format: rank fk_books/fk_files/...
-	$fk_books_tmp = $matches [2];
-	$ftpks[intval ($fk_books_tmp)] = $fk_books_tmp;
-        // an ebook can have more than one file
-        // eg. part1.html, part2.html etc.
-	$fk_files[$fk_books_tmp][] = $matches [3];
-      }
-    }
-    pclose ($hd);
-  }
-  $pkcnt = count ($ftpks);
-  $yousel[] = "Full Text = " . htmlspecialchars ($fulltext) . " ($pkcnt books match)" . 
-    (empty ($stopwords) ? "" : 
-     "<br$config->endtag>Note: following words were removed from your " . 
-     "full text search: <em>$stopwords</em>.");
-
-  merge ($ftpks);
-  $dofulltext = 1;
-}
-
-$bcnt = count ($pks);
-if ($bcnt > $max_results) {
-  p ("More than $max_results books matched your search. Please refine your query.");
-  pagefooter ();
-  return;
-}
-
-p ("<a href=\"/ebooks\">New Search</a>");
-if ($yousel) {
-  p ("You selected:");
-  echo ("<ul><li>" . implode ("</li><li>", $yousel) . "</li></ul>\n");
-}
-
-// flush (); flushes headers too :-(
-
-// For debugging:
-// $time_query1 = getmicrotime ();
-
-$where  = "books.pk in (" . implode (", ", $pks) . ")";
-$offset = $pageno * $pagesize;
-
-// this will turn our unsorted list of books 
-// into a sorted list of headings
-// note: there may be more (or less) headings than books
-
-$sql = "select books.pk from (books 
-left join v_books_authors on books.pk = fk_books and heading = 1)
-left join attributes on books.pk = attributes.fk_books
-where attributes.fk_attriblist = 245 and 
-$where order by author, substr (attributes.text, attributes.nonfiling + 1), 
-books.pk offset $offset";
-
-// echo ($sql);
-
-$db->exec ($sql);
-
-// For debugging:
-// $time_query2 = getmicrotime ();
-
-$hcnt = $db->CountRows ();
-
-$s = ($bcnt > 1) ? "s" : "";
-$note = ($hcnt > $bcnt) ? 
-"Note: in the following table some books are listed under more than one heading." : "";
-
-p ("$bcnt book$s found. $note");
-  
-$pl = "";
-$pages = intval (($offset + $hcnt - 1) / $pagesize) + 1;
-if ($pages > 1) {
-  $url = mkurl (array ("author", "title", "subject", "lang", "category", 
-                       "locc", "filetype", "filemtime", "etextnr", "fulltext"));
-  $p = $pageno - 1;
-  $previous = $pageno ? "<a href=\"results?$url&amp;pageno=$p\">previous</a>" : "";
-  $p = $pageno + 1;
-  $next = ($p < $pages) ? "<a href=\"results?$url&amp;pageno=$p\">next</a>" : "";
-
-  $pagelinks[] = "$previous ";
-  for ($i = 0; $i < $pages; $i++) {
-    if ($i == $pageno) {
-      $pagelinks[] = "<span class=\"red\">$i</span> ";
-    } else {
-      $pagelinks[] = "<a href=\"results?$url&amp;pageno=$i\">$i</a> ";
-    }
-  }
-  $pagelinks[] = $next;
-  $pl = "<p class=\"center resultpages\">" . join (" ", $pagelinks) . "</p>\n\n";
-}
-
-// For debugging:
-// $time_end = getmicrotime ();
-// $time = $time_end - $time_start;
-
-echo ($pl);
-
-$table = new BooksTable ();
-$table->limit = $pagesize;
-$table->PrintTable ($db, "Titles", "pgdbfiles");
-
-echo ($pl);
-
-// For debugging purposes:
-// $time_end = getmicrotime ();
-// 
-// $time1 = $time_query1 - $time_start;
-// $time2 = $time_query2 - $time_query1;
-// $time3 = $time_end    - $time_query2;
-// $time  = $time_end    - $time_start;
-// p ("Processing time: $time ($time1 + $time2 + $time3) seconds");
-
-pagefooter ();
-
-?>
diff --git a/gutenberg/collapsible.css b/gutenberg/collapsible.css
index 4d3a06a6..5cc4d90f 100644
--- a/gutenberg/collapsible.css
+++ b/gutenberg/collapsible.css
@@ -200,5 +200,4 @@ input[id^="collapsible"] {
   .popup{
     width: 70%;
   }
-}
-
+}
\ No newline at end of file
diff --git a/gutenberg/style2.css b/gutenberg/style2.css
index 0e221e74..e69071c8 100644
--- a/gutenberg/style2.css
+++ b/gutenberg/style2.css
@@ -1,54 +1,54 @@
 html,
 body {
-	background-color: #FFFFFF;  /* #FFFCD7; */
-	color: #000000;  /* #A01F13; */
-	font-family: "Open Sans", Helvetica, Arial, sans-serif;
-	font-size: 1em;
-	line-height: 1.5em;
-	letter-spacing: 0.01mm;
-	margin: 0;
-	max-width: 100vw;
-	padding: 0;
-	width: 100%;
-	height: 100%;
+    background-color: #ffffff; /* #FFFCD7; */
+    color: #000000; /* #A01F13; */
+    font-family: "Open Sans", Helvetica, Arial, sans-serif;
+    font-size: 1em;
+    line-height: 1.5em;
+    letter-spacing: 0.01mm;
+    margin: 0;
+    max-width: 100vw;
+    padding: 0;
+    width: 100%;
+    height: 100%;
 }
 
 html {
-	overflow-y: scroll;
-}
-input[type="submit"]{
-	color: #fff;
-  text-decoration: none;
-  background: #60a3bc;
-  padding: 6px;
-  border-radius: 45px 45px;
-  display: inline-block;
-  border: none;
-  }
+    overflow-y: scroll;
+}
+input[type="submit"] {
+    color: #fff;
+    text-decoration: none;
+    background: #60a3bc;
+    padding: 6px;
+    border-radius: 45px 45px;
+    display: inline-block;
+    border: none;
+}
 input[type="submit"]:hover {
-	text-shadow: 0px 0px 6px rgba(255, 255, 255, 1);
-	-webkit-box-shadow: 0px 5px 40px -10px rgba(0,0,0,0.57);
-	-moz-box-shadow: 0px 5px 40px -10px rgba(0,0,0,0.57);
-	box-shadow: 0px 5px 40px -10px rgba(0,0,0,0.57);
-	transition: all 0.4s ease 0s;
-	}
+    text-shadow: 0px 0px 6px rgba(255, 255, 255, 1);
+    -webkit-box-shadow: 0px 5px 40px -10px rgba(0, 0, 0, 0.57);
+    -moz-box-shadow: 0px 5px 40px -10px rgba(0, 0, 0, 0.57);
+    box-shadow: 0px 5px 40px -10px rgba(0, 0, 0, 0.57);
+    transition: all 0.4s ease 0s;
+}
 /* links */
 a:link {
-	color: currentColor;
-	text-decoration: none;
+    color: currentColor;
+    text-decoration: none;
 }
 a:visited {
-	color: currentColor;
+    color: currentColor;
 }
 a:hover {
-	color: currentColor;
-	text-decoration: underline;
+    color: currentColor;
+    text-decoration: underline;
 }
 a:active {
-	color: currentColor;
+    color: currentColor;
 }
 .no-hover:hover {
-	text-decoration: none;
+    text-decoration: none;
 }
 
 /* text selection
@@ -63,168 +63,162 @@ a:active {
 }*/
 
 .no-select {
-	user-select: none;
+    user-select: none;
 }
 
 /* animations */
 .fadein {
-	animation: fadein 1s;
+    animation: fadein 1s;
 }
 
 @-moz-keyframes fadein {
-	from {
-		opacity: 0;
-	}
+    from {
+        opacity: 0;
+    }
 
-	to {
-		opacity: 1;
-	}
+    to {
+        opacity: 1;
+    }
 }
 
 @-webkit-keyframes fadein {
-	from {
-		opacity: 0;
-	}
+    from {
+        opacity: 0;
+    }
 
-	to {
-		opacity: 1;
-	}
+    to {
+        opacity: 1;
+    }
 }
 
 @keyframes fadein {
-	from {
-		opacity: 0;
-	}
+    from {
+        opacity: 0;
+    }
 
-	to {
-		opacity: 1;
-	}
+    to {
+        opacity: 1;
+    }
 }
 
 .fadeinup {
-	animation: fadeInUp 1s both ease;
+    animation: fadeInUp 1s both ease;
 }
 
 @-moz-keyframes fadeInUp {
-	from {
-		opacity: 0;
-		transform: translate3d(0, 40px, 0);
-	}
+    from {
+        opacity: 0;
+        transform: translate3d(0, 40px, 0);
+    }
 
-	to {
-		opacity: 1;
-		transform: translate3d(0, 0, 0);
-	}
+    to {
+        opacity: 1;
+        transform: translate3d(0, 0, 0);
+    }
 }
 
 @-webkit-keyframes fadeInUp {
-	from {
-		opacity: 0;
-		transform: translate3d(0, 40px, 0);
-	}
+    from {
+        opacity: 0;
+        transform: translate3d(0, 40px, 0);
+    }
 
-	to {
-		opacity: 1;
-		transform: translate3d(0, 0, 0);
-	}
+    to {
+        opacity: 1;
+        transform: translate3d(0, 0, 0);
+    }
 }
 
 @keyframes fadeInUp {
-	from {
-		opacity: 0;
-		transform: translate3d(0, 50px, 0);
-	}
+    from {
+        opacity: 0;
+        transform: translate3d(0, 50px, 0);
+    }
 
-	to {
-		opacity: 1;
-		transform: translate3d(0, 0, 0);
-	}
+    to {
+        opacity: 1;
+        transform: translate3d(0, 0, 0);
+    }
 }
 
 /* ==================================================
 container */
 .container {
-	max-width: 100%;
-	min-height:75vh;
-	position: relative;
+    max-width: 100%;
+    min-height: 75vh;
+    position: relative;
 }
 
 @media screen and (orientation: landscape) {
-	.container {
-		min-height: 75vh;
-		padding: 10vh 5vw;
-
-	}
-
+    .container {
+        min-height: 75vh;
+        padding: 10vh 5vw;
+    }
 }
 
 @media screen and (orientation: portrait) {
-	.container {
-		min-height: 75vh;
-		padding: 10vh 5vw;
-		}
-
+    .container {
+        min-height: 75vh;
+        padding: 10vh 5vw;
+    }
 }
 /*.content h1 {
 	margin-top:40px;
 }*/
 
-
 ul {
-	list-style-type: "\2022";
-	margin: 0;
-	padding-left: 10px;
+    list-style-type: "\2022";
+    margin: 0;
+    padding-left: 10px;
 }
 
-
-
 /* ==================================================
 library */
 .library .latest {
-	white-space: nowrap;
-	width: 100%;
+    white-space: nowrap;
+    width: 100%;
 }
 
 .library .latest::-webkit-scrollbar {
-	height: 3px;
+    height: 3px;
 }
 
 .library .latest::-webkit-scrollbar-track {
-	background-color: #cccccc
+    background-color: #cccccc;
 }
 
 .library .latest::-webkit-scrollbar-thumb {
-	background-color: #333333
+    background-color: #333333;
 }
 
 .library .latest a {
-	display: inline-block;
-	margin: 0;
-	padding: 10px
+    display: inline-block;
+    margin: 0;
+    padding: 10px;
 }
 
 .library .latest a:hover {
-	background-color: transparent;
+    background-color: transparent;
 }
 
 .bookshelves {
-	margin: 0 auto;
-	padding: 0;
-	width: 100%;
+    margin: 0 auto;
+    padding: 0;
+    width: 100%;
 }
 
 .bookshelves ul {
-column-count: 3;
-	column-gap: 0px;
-	cursor: default;
-	width: 100%;
-	/*height: 620px;*/
-}
- .bookshelves > ul li::before {
-	color: #A01F13;
-	display: inline-block;
-	width: 1em;
-	margin-left: -1em;
+    column-count: 3;
+    column-gap: 0px;
+    cursor: default;
+    width: 100%;
+    /*height: 620px;*/
+}
+.bookshelves > ul li::before {
+    color: #a01f13;
+    display: inline-block;
+    width: 1em;
+    margin-left: -1em;
 }
 /*.bookshelves ul li {
 	color: #808080;
@@ -235,7 +229,7 @@ column-count: 3;
 }*/
 
 .page_content .bookshelves h2 {
-	border-bottom: 0px none #FFFFFF;
+    border-bottom: 0px none #ffffff;
 }
 /*.library .bookshelves h2:hover,
 .library .bookshelves ul li:hover {
@@ -249,7 +243,7 @@ column-count: 3;
 }
 */
 .page_content.library .lib {
-	margin-bottom: 50px;
+    margin-bottom: 50px;
 }
 
 /*@media only screen and (max-width: 1200px),
@@ -284,105 +278,105 @@ only screen and (max-device-width: 1000px) {
 /* ==================================================
 book */
 .book-container {
-	align-items: center;
-	justify-content: center;
-	margin: 50px;
-	max-width: 1000px;
+    align-items: center;
+    justify-content: center;
+    margin: 50px;
+    max-width: 1000px;
 }
 
 @media only screen and (min-width: 1001px) {
-	.book-container {
-		display: flex;
-	}
+    .book-container {
+        display: flex;
+    }
 }
 
 .book.page_content {
-	background-color: #f5f5f5;
-	box-shadow: none;
-	padding: 50px;
-	transition: box-shadow 0.2s ease-in-out, background-color 0.5s ease-in-out;
+    background-color: #f5f5f5;
+    box-shadow: none;
+    padding: 50px;
+    transition:
+        box-shadow 0.2s ease-in-out,
+        background-color 0.5s ease-in-out;
 }
 
 .book.page_content:hover {
-	background-color: #ffffff;
-	box-shadow: 0 25px 75px rgba(0, 0, 0, 0.1);
-	transition: box-shadow 0.2s ease-in-out, background-color 0.5s ease-in-out;
+    background-color: #ffffff;
+    box-shadow: 0 25px 75px rgba(0, 0, 0, 0.1);
+    transition:
+        box-shadow 0.2s ease-in-out,
+        background-color 0.5s ease-in-out;
 }
 
-
 .book .cover img {
-	box-shadow: 0px 20px 50px rgba(0, 0, 0, 0.1);
-	max-height: 200px;
-	max-width: 150px;
-	vertical-align: top;
+    box-shadow: 0px 20px 50px rgba(0, 0, 0, 0.1);
+    max-height: 200px;
+    max-width: 150px;
+    vertical-align: top;
 }
 
 .book .details .id {
-	font-family: Consolas, Courier, monospace;
+    font-family: Consolas, Courier, monospace;
 }
 
 .book .bib_rec ul {
-	list-style: square inside;
+    list-style: square inside;
 }
 
 @media only screen and (min-width: 1001px) {
-	.book .download {
-		width: 75px;
-	}
-	.book .download{
-		line-height: 25px;
-		width:130px;
-	}
-	.book .download a li{
-		display: block;
-	}
-	.book .download ul{
-		list-style: square inside;
-	}
+    .book .download {
+        width: 75px;
+    }
+    .book .download {
+        line-height: 25px;
+        width: 130px;
+    }
+    .book .download a li {
+        display: block;
+    }
+    .book .download ul {
+        list-style: square inside;
+    }
 
-	.book .share {
-		line-height:25px;
-		width: 20px;
-		word-wrap: break-word;
-	}
+    .book .share {
+        line-height: 25px;
+        width: 20px;
+        word-wrap: break-word;
+    }
 
-	.book .share a {
-		display: block;
-		margin: 10px 0;
-	}
+    .book .share a {
+        display: block;
+        margin: 10px 0;
+    }
 }
 
 @media only screen and (max-width: 1000px) {
-	.book .section {
-		display: block;
-		text-align: center;
-	}
+    .book .section {
+        display: block;
+        text-align: center;
+    }
 
-	.book h1 {
-		text-align: center;
-	}
+    .book h1 {
+        text-align: center;
+    }
 
-	.book .download a {
-		display: inline-block;
-		text-align: center;
-		width: 20%;
-		max-width: 75px;
-	}
+    .book .download a {
+        display: inline-block;
+        text-align: center;
+        width: 20%;
+        max-width: 75px;
+    }
 
-	.book .share a {
-		display: inline-block;
-		margin: 5px;
-	}
+    .book .share a {
+        display: inline-block;
+        margin: 5px;
+    }
 }
 
-
 .share-icon img {
-	height: 20px;
-	width: 20px;
+    height: 20px;
+    width: 20px;
 }
 
-
-
 /*@media only screen and (max-width: 1200px),
 only screen and (max-device-width: 1200px) {
 	.about {
@@ -404,30 +398,30 @@ only screen and (max-device-width: 1200px) {
 	}
 }*/
 .page_content {
-	margin-top: 40px;
-	padding-bottom: 30px;
+    margin-top: 40px;
+    padding-bottom: 30px;
 }
 
 .page_content figure {
     /*border: 3px solid #ddd;*/
-	border-radius: 5px;
-    	padding: 10px;
-	max-width: 100%;
-	height: auto;
-	float:right;
-	text-align:center;
+    border-radius: 5px;
+    padding: 10px;
+    max-width: 100%;
+    height: auto;
+    float: right;
+    text-align: center;
 }
 .page_content figure img {
-	width:100%;
-	vertical-align:baseline;
+    width: 100%;
+    vertical-align: baseline;
 }
 /*.thumbnail a {
 	text-align:center;
 }*/
 .box_shadow {
-	margin-top: 1em;
-	margin-bottom: 1em;
-	padding: 1ex 1em;
+    margin-top: 1em;
+    margin-bottom: 1em;
+    padding: 1ex 1em;
 }
 /*.page_content .page_heading {
 	font-size: 30px;
@@ -435,62 +429,62 @@ only screen and (max-device-width: 1200px) {
 	color:#A01F13;
 }*/
 .page_content h1::before {
-	display: block;
-	content: "";
-	visibility: hidden;
-	pointer-events: none;
+    display: block;
+    content: "";
+    visibility: hidden;
+    pointer-events: none;
 }
 .page_content h1 {
-	font-size: 1.875em;
-	font-weight: bold;
-	margin-top: 2em;
-	width: 100%;
-	line-height: 1em;
+    font-size: 1.875em;
+    font-weight: bold;
+    margin-top: 2em;
+    width: 100%;
+    line-height: 1em;
 }
-.page_content .header h1{
-	margin-top: 3.5em;
+.page_content .header h1 {
+    margin-top: 3.5em;
 }
 .page_content h2::before {
-	display: block;
-	content: "";
-	visibility: hidden;
-	pointer-events: none;
+    display: block;
+    content: "";
+    visibility: hidden;
+    pointer-events: none;
 }
 .page_content h2 {
-	font-size: 1.5em;
-	font-weight: bold;
-	margin-top: 15px;
-	margin-bottom: 15px;
-	width: 100%;
+    font-size: 1.5em;
+    font-weight: bold;
+    margin-top: 15px;
+    margin-bottom: 15px;
+    width: 100%;
 }
 
 .page_content h3::before {
-	display: block;
-	content: "";
-	margin-top: -120px;
-	height: 120px;
-	visibility: hidden;
-	pointer-events: none;
+    display: block;
+    content: "";
+    margin-top: -120px;
+    height: 120px;
+    visibility: hidden;
+    pointer-events: none;
 }
 .page_content > ul li::before {
-	color: #A01F13;
-	display: inline-block;
-	width: 1em;
-	/*margin-left: -1em;*/
-	/*font-size: small;*/
+    color: #a01f13;
+    display: inline-block;
+    width: 1em;
+    /*margin-left: -1em;*/
+    /*font-size: small;*/
 }
 @media only screen and (min-width: 750px) {
-	.page_content > ul li::before {
-		font-size: small;
-	}
-	/* .bookshelves > ul li::before {
+    .page_content > ul li::before {
+        font-size: small;
+    }
+    /* .bookshelves > ul li::before {
 		font-size: small;
 	} */
 }
 
 .page_content ul li {
-	/* list-style: none; */
-	padding: 5px;
+    /* list-style: none; */
+    padding: 5px;
 }
 
 /*.page_content ul {
@@ -498,66 +492,65 @@ only screen and (max-device-width: 1200px) {
 }*/
 
 .page_content p {
-	/*color: #999999;*/
-	margin-top: 10px;
-	margin-bottom: 10px;
-	padding-top:10px;
-	padding-bottom: 10px;
+    /*color: #999999;*/
+    margin-top: 10px;
+    margin-bottom: 10px;
+    padding-top: 10px;
+    padding-bottom: 10px;
 }
 .page_content a:link {
-	color: #003366;
-	text-decoration: underline;
+    color: #003366;
+    text-decoration: underline;
 }
 
 .page_content a:visited {
-	color: #3E444D;
+    color: #3e444d;
 }
 .page_content a:hover {
-	color: currentColor;
-	/*background:#E7E292;*/
-	text-decoration: underline;
-	/*background: #BDAE92;*/
+    color: currentColor;
+    /*background:#E7E292;*/
+    text-decoration: underline;
+    /*background: #BDAE92;*/
 }
-.page_content	a:active {
-	color: brown;
+.page_content a:active {
+    color: brown;
 }
 
-
 .page-body {
-	padding-top: 1px;
+    padding-top: 1px;
 }
 
-
 .anchor a {
-	top:-80px;
-
+    top: -80px;
 }
 .contents {
-	background-color: #f9f9f9;
-	border: 1px solid #a2a9b1;
-	padding: 5px;
-	display: inline-block;
+    background-color: #f9f9f9;
+    border: 1px solid #a2a9b1;
+    padding: 5px;
+    display: inline-block;
 }
 
 .contents ol .inner_1 {
-	list-style-type: lower-roman;
+    list-style-type: lower-roman;
 }
 .contents ol .inner_2 {
-	list-style-type: lower-alpha;
+    list-style-type: lower-alpha;
 }
 pre {
-	border: 1px dashed #2f6fab;
-	background-color: #f9f9f9;
-	padding: 1em;
+    border: 1px dashed #2f6fab;
+    background-color: #f9f9f9;
+    padding: 1em;
 }
 table {
-	border-collapse: collapse;
+    border-collapse: collapse;
 }
-table, th, td {
-	background-color: #f8f9fa;
-	color: #222;
-	margin: 1em 0;
-	border: 1px solid #a2a9b1;
+table,
+th,
+td {
+    background-color: #f8f9fa;
+    color: #222;
+    margin: 1em 0;
+    border: 1px solid #a2a9b1;
 }
 /*table > * > tr > th{
 border: 1px solid #a2a9b1;
@@ -565,18 +558,18 @@ text-align:center;
 }*/
 
 .search_category li {
-	display: inline-block;
+    display: inline-block;
 }
 .search_category a {
-	font-weight: bold;
+    font-weight: bold;
 }
 
 ul.icon-list {
-	list-style-type: none;
+    list-style-type: none;
 }
 
 ul.icon-list li {
-	display: inline-block;
+    display: inline-block;
     padding: 30px;
     font-size: 1.3em;
 }
@@ -584,47 +577,46 @@ ul.icon-list li {
 /* ==================================================
 footer */
 .footer {
-	position: inherit;
-	left: 0;
-	right: 0;
-	bottom: -32px;
-	text-align: center;
-	font-size: 0.9em;
-	width: 100%;
+    position: inherit;
+    left: 0;
+    right: 0;
+    bottom: -32px;
+    text-align: center;
+    font-size: 0.9em;
+    width: 100%;
 }
 
 .footer ul li {
-	display: inline-block;
-	padding: 10px;
+    display: inline-block;
+    padding: 10px;
 }
 .footer img {
-	vertical-align: baseline;
+    vertical-align: baseline;
 }
 .cover_title h5 {
-	white-space: break-spaces;
-	overflow: hidden;
-	height: 5em;
-	text-decoration: none;
+    white-space: break-spaces;
+    overflow: hidden;
+    height: 5em;
+    text-decoration: none;
     text-align: center;
     position: absolute;
-	width: 100px;
-	background-color: #d9eaef;
+    width: 100px;
+    background-color: #d9eaef;
 }
 .cover_title h5:hover {
-	overflow-y: visible;
-	height: auto;
-
+    overflow-y: visible;
+    height: auto;
 }
 .cover_image img {
-	height: 150px;
-	width: 100px;
-	margin-left: auto;
-	margin-right: auto;
-	display: block;
+    height: 150px;
+    width: 100px;
+    margin-left: auto;
+    margin-right: auto;
+    display: block;
 }
 .cover_image {
-	height: 250px;
-	width: 100px;
+    height: 250px;
+    width: 100px;
 }
 /*.cover_image h5 {
 	white-space: break-spaces;
@@ -634,80 +626,77 @@ footer */
 
 /*=====CLASS RULES IMPLEMENTED in pg-desktop-one.css========*/
 ul.results li::before {
-	content: unset;
+    content: unset;
 }
 @media only screen and (max-width: 750px) {
-	container {
-		left: 0;
-		padding: 10% 10vw;
-		position: relative;
-		right: 0;
-		width: 80vw;
-
-	}
-	/*.content {
+    container {
+        left: 0;
+        padding: 10% 10vw;
+        position: relative;
+        right: 0;
+        width: 80vw;
+    }
+    /*.content {
 		margin-top: 180px;
 	}*/
-	.page_content {
-		margin-top: 60px;
-		height: auto;
-	}
-	.page_content h1 {
-		font-size: 1.125em;
-		text-align: center;
-	}
-	.page_content h2 {
-		font-size: 1em;
-		text-align: center;
-	}
-	body {
-
-		font-size: 1em;
-	}
+    .page_content {
+        margin-top: 60px;
+        height: auto;
+    }
+    .page_content h1 {
+        font-size: 1.125em;
+        text-align: center;
+    }
+    .page_content h2 {
+        font-size: 1em;
+        text-align: center;
+    }
+    body {
+        font-size: 1em;
+    }
 
-	.bookshelves ul {
-	       	column-count: 1;
-        	column-gap: 0px;
-        	cursor: default;
-        	width: 100%;
-                height: unset;
+    .bookshelves ul {
+        column-count: 1;
+        column-gap: 0px;
+        cursor: default;
+        width: 100%;
+        height: unset;
 
-	/*.page_content img{
+        /*.page_content img{
 		width: 50%;
 		height: 50%;
 	}*/
-}
-.cover_title h5 {
-	overflow-y: scroll;
-	height: 100px;
-}
-
+    }
+    .cover_title h5 {
+        overflow-y: scroll;
+        height: 100px;
+    }
 }
 
 /*New Cover_image rules only applicable to test_index for latest covers from gutenberg1*/
 .library .latest a {
-	vertical-align: top;
+    vertical-align: top;
 }
 .library .latest a:link {
-	text-decoration: none;
+    text-decoration: none;
 }
 .library .latest a:hover h5 {
-	overflow-y: visible;
-	height: auto;
+    overflow-y: visible;
+    height: auto;
 }
 /*Old Cover image rules orginally declated in CoverPages.py on autocat3. Keep them so it doesn't break anything if it is used somewhere else on autocat3.*/
 .cover-thumb {
-	display: inline-block;
-	background-position: center;
-	background-repeat: no-repeat;
+    display: inline-block;
+    background-position: center;
+    background-repeat: no-repeat;
 }
 .cover-thumb-small {
-	width:  100px;
-	height: 150px;
+    width: 100px;
+    height: 150px;
 }
 .cover-thumb-medium {
-	width: 210px;
-	height: 310px;
+    width: 210px;
+    height: 310px;
 }
 
 .box_announce {
@@ -717,18 +706,18 @@ ul.results li::before {
 /* Different HTML for mobile and Desktop display */
 
 #standard {
-	display: block;
-  }
+    display: block;
+}
 #mobile {
-	display: none;
-  }
-@media screen and /*(orientation: portrait)*/(max-width : 1024px) {
-	#standard {
-		display: none;
+    display: none;
+}
+@media screen and /*(orientation: portrait) */(max-width : 1024px) {
+    #standard {
+        display: none;
     }
     #mobile {
-		display: block !important;
-	}
+        display: block !important;
+    }
 }
 
 /* Put theme-specific colors here to make it easy to switch between themes */
@@ -757,34 +746,37 @@ library .latest h1 {
 /* BLUE THEME */
 
 .library .latest h1 {
-	color: #A01F13;
-	border-bottom: 2px solid #A01F13;
+    color: #a01f13;
+    border-bottom: 2px solid #a01f13;
 }
 .box_shadow {
-	background-color: #d9eaef;
-	border: 1px solid #b2c3c4;
+    background-color: #d9eaef;
+    border: 1px solid #b2c3c4;
 }
 .box_announce {
-	background-color: #f2dede;
-	border: 1px solid #ebccd1;
+    background-color: #f2dede;
+    border: 1px solid #ebccd1;
 }
 .page_content h1 {
-	color: #aa873b;
+    color: #aa873b;
 }
 .page_content h2 {
-	color: #9b8053;
+    color: #9b8053;
 }
 .page_content h2.subtitle {
-	color: #9b8053;
+    color: #9b8053;
 }
 .page_content a:hover {
-        background: #C7DDE3;
+    background: #c7dde3;
 }
 .footer {
-	background-color: #f0efea;
+    background-color: #f0efea;
 }
-.footer a:link, .footer a:visited, .footer a:hover, .footer a:active  {
-	color: #006479;
+.footer a:link,
+.footer a:visited,
+.footer a:hover,
+.footer a:active {
+    color: #006479;
 }
 
 /* Hide the extended text by default */
@@ -824,7 +816,6 @@ library .latest h1 {
     display: none;
 }
 
-
 /* Hide the summary on small screens for now 
 @media screen and (max-width: 550px) {
     .summary-text-container {
@@ -832,40 +823,149 @@ library .latest h1 {
     }
 } */
 
-
 /* Attempt to "fix" the mobile page */
 @media (max-width: 768px) {
-    h1{
+    h1 {
         padding-bottom: 8px;
     }
-    
+
     .page-body {
-            display: flex;
-            flex-direction: column;
-            align-items: center;
+        display: flex;
+        flex-direction: column;
+        align-items: center;
     }
 
     #cover-social-wrapper {
-            display: flex;
-            flex-direction: column;
-            align-items: center;
-            width: 100%;
+        display: flex;
+        flex-direction: column;
+        align-items: center;
+        width: 100%;
     }
 
     #tabs-wrapper {
-            margin: 50px 0 0 0;
+        margin: 50px 0 0 0;
     }
 
     #tabs {
-            margin-left: 0;
+        margin-left: 0;
     }
 
     .summary-text-container {
         text-align: center;
     }
 
-	table.bibrec td {
-		word-wrap: break-word;
-		word-break: break-word;
-	}
+    table.bibrec td {
+        word-wrap: break-word;
+        word-break: break-word;
+    }
+}
+
+/* CUSTOM CSS FOR STYLE UPGRADE OF BIBREC.html */
+/* Styling for the "read online" link */
+.read_html {
+    display: inline-block;
+    padding: 8px 40px; /* Fallback for browsers that don't support clamp() */
+    padding: 8px clamp(8px, 7vw, 50px);
+    background-color: #c7dde3;
+    color: black !important;
+    border-radius: 8px;
+    text-decoration: none !important;
+    transition: all 0.3s ease;
+    font-size: 16px;
+    font-weight: bold;
+    border: 1px solid #d6d3d1;
+    max-width: 100%;
+    box-sizing: border-box;
+    white-space: nowrap;
+}
+
+.read_html:hover {
+    background-color: #e6e6e6;
+    transform: translateY(-1px);
+    box-shadow: 0 3px 6px rgba(0, 0, 0, 0.15);
+}
+
+/* Increase font size for similar books links */
+.similar-books-link {
+    font-size: 1.1em;
+    font-weight: 500;
+    transition: font-size 0.2s ease;
+}
+
+.similar-books-link:hover {
+    font-size: 1.15em;
+}
+
+/* Custom styles for tables and headers */
+#download_options_table,
+#about_book_table {
+    background-color: white;
+    border-collapse: collapse;
+    border: none;
+}
+
+#download_options_table th,
+#download_options_table td,
+#about_book_table th,
+#about_book_table td {
+    border-color: #d6d3d1;
+    padding: 8px 6px;
+}
+
+#download_options_table th,
+#about_book_table th {
+    background-color: #e7e5e4;
+}
+
+#download_options_table td,
+#about_book_table td {
+    background-color: #fafafa;
+}
+
+/* Headers styling */
+#book_title {
+    color: black;
+    border-bottom: 1px solid black;
+    padding-bottom: 0.75rem;
+    margin: 2rem 0 2.25rem;
+    font-size: 2rem;
+    line-height: 1.2;
+}
+
+.header.middle_section_header,
+#about_book_header,
+#download_options_header {
+    color: black;
+    margin-top: 3.25rem;
+    font-size: 1.5rem;
+}
+
+/* Page layout */
+.page_content {
+    margin-top: 36px;
+    padding-bottom: 24px;
+}
+
+#content .breadcrumbs {
+    margin-top: 0;
+}
+
+.breadcrumbs li a:link {
+    color: black;
+    text-decoration: none;
+}
+
+/* Responsive book title for small screens */
+@media screen and (max-width: 768px) {
+    #book_title {
+        font-size: 1.5rem;
+    }
+
+    .breadcrumbs ul {
+        line-height: 1;
+    }
+
+    #qr {
+        display: none;
+    }
 }


Reviews:
user: login: cpeel
body: > the changes from https://github.com/gutenbergtools/gutenbergsite/pull/48 have been merged into this PR

I don't understand this statement. If you want the changes from ^^ why not update that PR to point to the `dev` branch? Or is it that you've pulled selective parts of the PR into this one and if so what's the plan for that PR now?
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-15T22:36:09Z
user: login: eshellman
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-04-15T23:46:07Z

Review comments:
diff_hunk: @@ -869,3 +869,114 @@ library .latest h1 {
 		word-break: break-word;
 	}
 }
+
+
+/* CUSTOM CSS FOR STYLE UPGRADE OF BIBREC.html */
+/* Styling for the "read online" link */
+.read_html {
+	display: inline-block;
path: gutenberg/style2.css
user: login: cpeel
body: Minor: figure out if you want tabs or spaces and stick with one. This is true for the existing stuff above this, but now's a good a time as any to be consistent with new code.
created_at: 2025-04-15T22:32:48Z
author_association: MEMBER
diff_hunk: @@ -869,3 +869,114 @@ library .latest h1 {
 		word-break: break-word;
 	}
 }
+
+
+/* CUSTOM CSS FOR STYLE UPGRADE OF BIBREC.html */
+/* Styling for the "read online" link */
+.read_html {
+	display: inline-block;
path: gutenberg/style2.css
user: login: eshellman
body: I didn't notice that. As I've said, the css files are a real mess. That's a whole 'nother project.
created_at: 2025-04-15T23:46:07Z
author_association: COLLABORATOR

PR comments:
user: login: eshellman
created_at: 2025-04-15T23:43:17Z
body: > > the changes from #48 have been merged into this PR
> 
> I don't understand this statement. If you want the changes from ^^ why not update that PR to point to the `dev` branch? Or is it that you've pulled selective parts of the PR into this one and if so what's the plan for that PR now?

Yes, could have done that. But I was busy cleaning up the branch and things got confusing.
author_association: COLLABORATOR
user: login: eshellman
created_at: 2025-04-18T21:21:42Z
body: deployed to www
author_association: COLLABORATOR