406 lines
13 KiB
HTML
406 lines
13 KiB
HTML
<?xml version="1.0" encoding="utf-8"?>
|
||
|
||
<!--
|
||
|
||
DON'T USE THIS PAGE FOR SCRAPING.
|
||
|
||
Seriously. You'll only get your IP blocked.
|
||
|
||
Read http://www.gutenberg.org/feeds/ to learn how to download Project
|
||
Gutenberg metadata much faster than by scraping.
|
||
|
||
-->
|
||
|
||
<html xmlns="http://www.w3.org/1999/xhtml"
|
||
xmlns:xi="http://www.w3.org/2001/XInclude"
|
||
xmlns:py="http://genshi.edgewall.org/"
|
||
xmlns:i18n="http://genshi.edgewall.org/i18n"
|
||
xmlns:dcterms="http://purl.org/dc/terms/"
|
||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||
xmlns:ebook="http://www.gutenberg.org/ebooks/"
|
||
xmlns:marcrel="http://www.loc.gov/loc.terms/relators/"
|
||
xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
|
||
xml:lang="${os.lang}"
|
||
version="XHTML+RDFa 1.0">
|
||
|
||
<?python
|
||
import re
|
||
import urllib
|
||
|
||
from libgutenberg.MediaTypes import mediatypes as mt
|
||
from libgutenberg import GutenbergGlobals as gg
|
||
|
||
os.description = "Free kindle book and epub digitized and proofread by %s." % os.pg
|
||
|
||
old_header = os.entries[0].header # suppress first header as already in <h1>
|
||
def help_page (s = ''):
|
||
s = s.replace (' ', '_')
|
||
return '%s#%s' % ('/wiki/Gutenberg:Help_on_Bibliographic_Record_Page', s)
|
||
def explain (s):
|
||
return _('Explain {topic}.').format (topic = _(s))
|
||
def _ (s):
|
||
return s
|
||
i = 0
|
||
|
||
maintainer = 'is-catalog-maintainer' in cherrypy.request.cookie
|
||
?>
|
||
|
||
<xi:include href="site-layout.html" />
|
||
<xi:include href="social-functions.html" />
|
||
|
||
<py:def function="help(topic)">
|
||
<a href="${help_page (topic)}"
|
||
title="${explain (topic)}"><span class="icon icon_help noprint" /></a>
|
||
</py:def>
|
||
|
||
<head profile="http://a9.com/-/spec/opensearch/1.1/"
|
||
xmlns:og="http://opengraphprotocol.org/schema/">
|
||
|
||
${site_head ()}
|
||
|
||
<title>${os.title} - Free Ebook</title>
|
||
|
||
<link rel="alternate nofollow" type="${mt.rdf}"
|
||
href="${os.url ('bibrec', id = os.id, format = 'rdf')}" />
|
||
|
||
<style type="text/css">
|
||
.qrcode { background: transparent url(${os.qrcode_url}) 0 0 no-repeat; }
|
||
</style>
|
||
<meta name="google" content="notranslate" />
|
||
</head>
|
||
|
||
<body>
|
||
<div id="mw-head-dummy" class="noprint" />
|
||
|
||
<div id="content" itemscope="itemscope" itemtype="http://schema.org/Book" i18n:comment="On the 'bibrec' page.">
|
||
|
||
<div class="breadcrumbs noprint">
|
||
<ul>
|
||
<py:for each="n, bc in enumerate (os.breadcrumbs)">
|
||
<li class="breadcrumb ${'first' if n == 0 else 'next'}"
|
||
itemscope="itemscope" itemtype="http://data-vocabulary.org/Breadcrumb">
|
||
<span class="breadcrumb-separator"></span>
|
||
<a href="${bc[2]}" title="${bc[1]}" itemprop="url"><span itemprop="title">${bc[0]}</span></a>
|
||
</li>
|
||
</py:for>
|
||
</ul>
|
||
</div>
|
||
|
||
<div class="header">
|
||
<h1 itemprop="name">${os.title}</h1>
|
||
</div>
|
||
|
||
<div class="body">
|
||
<div property="dcterms:publisher" itemprop="publisher" content="Project Gutenberg" />
|
||
<div itemprop="bookFormat" content="EBook" />
|
||
|
||
<div id="cover-social-wrapper">
|
||
|
||
<div py:if="os.cover_image_url" id="cover">
|
||
<img class="cover-art"
|
||
src="${os.cover_image_url}"
|
||
title="Book Cover"
|
||
alt="Book Cover"
|
||
itemprop="image" />
|
||
</div>
|
||
|
||
<div py:if="not os.cover_image_url" id="no-cover">
|
||
<div class="icon icon_${os.title_icon}" />
|
||
<div class="text">No cover available</div>
|
||
</div>
|
||
|
||
<div id="social" class="noprint">
|
||
<ul>
|
||
<!--! Broken. Dialog opens and closes immediately. Disabled for now.
|
||
<li>
|
||
${fb_share (os.canonical_url, os.title.encode ('utf-8'),
|
||
os.description.encode ('utf-8'), os.cover_thumb_url)}
|
||
</li>
|
||
-->
|
||
<li>
|
||
${gplus_share (os.canonical_url)}
|
||
</li>
|
||
<li>
|
||
${tw_share (os.canonical_url, os.twit)}
|
||
</li>
|
||
<li>
|
||
<a onclick="printpage ()" title="Print this page"><span class="icon icon_print" /></a>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
|
||
<div id="qr">
|
||
<!--! qr code of desktop page for print -->
|
||
<span class="qrcode qrcode-desktop noscreen" />
|
||
<!--! qr code of mobile page for screen -->
|
||
<span class="qrcode qrcode-mobile noprint" title="Go to our mobile site." />
|
||
</div>
|
||
</div>
|
||
|
||
<div id="tabs-wrapper">
|
||
<div id="tabs">
|
||
<ul class="noprint">
|
||
<li><a href="#download">Download</a></li>
|
||
<li><a href="#bibrec">Bibrec</a></li>
|
||
</ul>
|
||
|
||
<div id="bibrec" i18n:comment="On the 'bibrec' tab of the 'bibrec' page.">
|
||
<py:for each="e in os.entries">
|
||
<py:if test="isinstance (e, bs.DC)">
|
||
|
||
<div typeof="pgterms:ebook" about="[ebook:$e.project_gutenberg_id]">
|
||
|
||
<h2>Bibliographic Record <span>${help (_('Table: Bibliographic Record'))}</span></h2>
|
||
|
||
<table class="bibrec" summary="Bibliographic data of author and book.">
|
||
<colgroup>
|
||
<col class="narrow" />
|
||
<col />
|
||
</colgroup>
|
||
|
||
<tr py:for="author in e.authors">
|
||
<th>${author.role}</th>
|
||
<td>
|
||
<a href="${os.url ('author', id = author.id)}"
|
||
rel="marcrel:${author.marcrel}" about="/authors/${author.id}" typeof="pgterms:agent"
|
||
itemprop="creator">${author.name_and_dates}</a></td>
|
||
</tr>
|
||
|
||
<tr py:for="marc in e.marcs">
|
||
<th>${marc.caption}</th>
|
||
<py:choose test="">
|
||
<td py:when="marc.code == '010'">
|
||
<a class="external"
|
||
href="http://lccn.loc.gov/${marc.text}"
|
||
title="Look up this book in the Library of Congress catalog.">${marc.text} <span class="icon icon_external_link"/></a>
|
||
</td>
|
||
<td py:when="marc.code[0]=='5'">
|
||
<?python
|
||
text = gg.xmlspecialchars (marc.text)
|
||
text = re.sub (r'(//\S+)', r'<a href="\1">\1</a>', text)
|
||
text = re.sub (r'#(\d+)', r'<a href="/ebooks/\1">#\1</a>', text)
|
||
?>
|
||
${ Markup (gg.insert_breaks (text)) }
|
||
</td>
|
||
<td py:when="marc.code=='245'" itemprop="headline">
|
||
${ Markup (gg.insert_breaks (gg.xmlspecialchars (marc.text))) }
|
||
</td>
|
||
<td py:when="marc.code=='240'" itemprop="alternativeHeadline">
|
||
${ Markup (gg.insert_breaks (gg.xmlspecialchars (marc.text))) }
|
||
</td>
|
||
<td py:when="marc.code=='246'" itemprop="alternativeHeadline">
|
||
${ Markup (gg.insert_breaks (gg.xmlspecialchars (marc.text))) }
|
||
</td>
|
||
<td py:otherwise="">
|
||
${ Markup (gg.insert_breaks (gg.xmlspecialchars (marc.text))) }
|
||
</td>
|
||
</py:choose>
|
||
</tr>
|
||
|
||
<tr py:for="language in e.languages"
|
||
property="dcterms:language" datatype="dcterms:RFC4646" itemprop="inLanguage" content="${language.id}">
|
||
<th>Language</th>
|
||
<td py:if="language.id != 'en'"><a href="/browse/languages/${language.id}">${language.language}</a></td>
|
||
<td py:if="language.id == 'en'">${language.language}</td>
|
||
</tr>
|
||
|
||
<tr py:for="locc in e.loccs"
|
||
property="dcterms:subject" datatype="dcterms:LCC" content="${locc.id}">
|
||
<th>LoC Class</th>
|
||
<td>
|
||
<a href="/browse/loccs/${locc.id.lower ()}">${locc.id}: ${locc.locc}</a>
|
||
</td>
|
||
</tr>
|
||
|
||
<tr py:for="subject in e.subjects">
|
||
<th>Subject</th>
|
||
<td property="dcterms:subject" datatype="dcterms:LCSH">
|
||
<a class="block" href="${os.url ('subject', id = subject.id)}">
|
||
${subject.subject}
|
||
</a>
|
||
</td>
|
||
</tr>
|
||
|
||
<tr py:for="dcmitype in e.dcmitypes">
|
||
<th>Category</th>
|
||
<td property="dcterms:type" datatype="dcterms:DCMIType">${dcmitype.description}</td>
|
||
</tr>
|
||
|
||
<tr>
|
||
<th>EBook-No.</th>
|
||
<td>${e.project_gutenberg_id}</td>
|
||
</tr>
|
||
|
||
<tr property="dcterms:issued" datatype="xsd:date" content="${e.xsd_release_date_time}">
|
||
<th>Release Date</th>
|
||
<td itemprop="datePublished">${e.hr_release_date}</td>
|
||
</tr>
|
||
|
||
<tr>
|
||
<th>Copyright Status</th>
|
||
<td property="dcterms:rights">${e.rights}</td>
|
||
</tr>
|
||
|
||
<tr>
|
||
<th>Downloads</th>
|
||
<td itemprop="interactionCount" i18n:msg="count">${e.downloads} downloads in the last 30 days.</td>
|
||
</tr>
|
||
|
||
<tr itemprop="offers" itemscope="itemscope" itemtype="http://schema.org/Offer">
|
||
<th>Price</th>
|
||
<td><span itemprop="priceCurrency" content="USD" /><span itemprop="price">$0.00</span><span itemprop="availability" href="http://schema.org/InStock" content="In Stock" /></td>
|
||
</tr>
|
||
|
||
</table>
|
||
|
||
</div>
|
||
</py:if>
|
||
</py:for>
|
||
|
||
<div id="more_stuff">
|
||
<py:for each="n, e in enumerate (os.entries)">
|
||
<py:if test="isinstance (e, bs.Cat) and e.rel not in ('start', )">
|
||
<py:if test="e.header and old_header != e.header">
|
||
<h2 class="header">${e.header}</h2>
|
||
</py:if>
|
||
<?python old_header = e.header ?>
|
||
|
||
<div class="${e.class_}">
|
||
<a rel="nofollow"
|
||
href="${e.url}"
|
||
type="${e.type}"
|
||
charset="${e.charset}"
|
||
accesskey="${str (n % 10)}">
|
||
<span class="cell leftcell">
|
||
<span class="icon icon_${e.icon}" />
|
||
</span>
|
||
<span class="cell content">
|
||
<span class="title">${e.title}</span>
|
||
<span py:if="e.subtitle" class="subtitle">${e.subtitle}</span>
|
||
<span py:if="e.extra" class="extra">${e.extra}</span>
|
||
</span>
|
||
<span class="hstrut" />
|
||
</a>
|
||
</div>
|
||
</py:if>
|
||
</py:for>
|
||
</div> <!-- more stuff -->
|
||
|
||
</div> <!--! bibrec -->
|
||
|
||
<div id="download" i18n:comment="On the 'Download' tab of the 'bibrec' page.">
|
||
|
||
<py:for each="e in os.entries">
|
||
<py:if test="isinstance (e, bs.DC)">
|
||
<div about="[ebook:$e.project_gutenberg_id]" rel="dcterms:hasFormat" rev="dcterms:isFormatOf">
|
||
|
||
<h2>Download This eBook</h2>
|
||
|
||
<table class="files" summary="Table of available file types and sizes.">
|
||
<colgroup>
|
||
<col class="narrow" />
|
||
<col />
|
||
<col />
|
||
<col class="narrow noprint" />
|
||
<col class="narrow noprint" />
|
||
<col class="narrow noprint" />
|
||
</colgroup>
|
||
|
||
<tr>
|
||
<th />
|
||
<th>Format <span>${help ('Format')}</span></th>
|
||
<th class="noscreen">Url</th>
|
||
<th i18n:comment="Size of a file." class="right">Size</th>
|
||
<th class="noprint"><span>${help ('Dropbox')}</span></th>
|
||
<th class="noprint"><span>${help ('Google Drive')}</span></th>
|
||
<th class="noprint"><span>${help ('OneDrive')}</span></th>
|
||
</tr>
|
||
|
||
<tr py:for="i, file_ in enumerate (e.files)"
|
||
py:if="not file_.hidden"
|
||
class="${i%2 and 'odd' or 'even'}"
|
||
about="${file_.url}" typeof="pgterms:file">
|
||
<td><span class="icon icon_${e.icon}" /></td>
|
||
<td property="dcterms:format" content="${file_.mediatypes[-1]}" datatype="dcterms:IMT"
|
||
class="unpadded icon_save"
|
||
><a href="${file_.url}" type="${file_.mediatypes[-1]}" charset="${file_.encoding}"
|
||
class="link"
|
||
title="Download">${file_.hr_filetype}</a></td>
|
||
<td class="noscreen">${file_.url}</td>
|
||
<td class="right"
|
||
property="dcterms:extent" content="${file_.extent}">${file_.hr_extent}</td>
|
||
<td class="noprint">
|
||
<a py:if="file_.dropbox_url"
|
||
href="${file_.dropbox_url}"
|
||
title="Send to Dropbox." rel="nofollow"><span class="icon icon_dropbox" /></a>
|
||
</td>
|
||
<td class="noprint">
|
||
<a py:if="file_.gdrive_url"
|
||
href="${file_.gdrive_url}"
|
||
title="Send to Google Drive." rel="nofollow"><span class="icon icon_gdrive" /></a>
|
||
</td>
|
||
<td class="noprint">
|
||
<a py:if="file_.honeypot_url"
|
||
href="${file_.honeypot_url}"
|
||
title="Send to MegaUpload." rel="nofollow" />
|
||
<a py:if="file_.msdrive_url"
|
||
href="${file_.msdrive_url}"
|
||
title="Send to OneDrive." rel="nofollow"><span class="icon icon_msdrive" /></a>
|
||
</td>
|
||
</tr>
|
||
|
||
<!--! more files ... -->
|
||
<tr py:if="e.base_dir"
|
||
class="${i%2 and 'odd' or 'even'}">
|
||
<td><span class="icon icon_folder" /></td>
|
||
<td class="unpadded icon_file"><a href="${e.base_dir}" class="link"
|
||
i18n:comment="Link to the directory containing all files.">More Files…</a></td>
|
||
<td class="noscreen">https:${os.qualify (e.base_dir)}</td>
|
||
<td/>
|
||
<td class="noprint"><!--! dropbox column --></td>
|
||
<td class="noprint"><!--! gdrive column --></td>
|
||
<td class="noprint"><!--! msdrive column --></td>
|
||
</tr>
|
||
|
||
</table>
|
||
</div>
|
||
</py:if>
|
||
</py:for>
|
||
|
||
</div> <!-- download -->
|
||
|
||
</div> <!--! tabs -->
|
||
</div> <!--! tabs-wrapper -->
|
||
</div> <!--! body -->
|
||
|
||
<div id="dialog" class="hidden">
|
||
</div>
|
||
|
||
<!--!
|
||
<a href="http://validator.w3.org/check?uri=referer" rel="nofollow"
|
||
title="This page contains RDFa metadata."><img
|
||
src="http://www.w3.org/Icons/valid-xhtml-rdfa-blue"
|
||
width="88"
|
||
height="31"
|
||
alt="Valid XHTML + RDFa"
|
||
about=""
|
||
rel="dcterms:conformsTo"
|
||
resource="http://www.w3.org/TR/rdfa-syntax" /></a>
|
||
|
||
<a href="${os.url_carry ('bibrec', format='rdf')}"
|
||
title="Download RDF/XML Metadata for this ebook."><img
|
||
src="http://www.w3.org/RDF/icons/rdf_metadata_button.32"
|
||
width="76"
|
||
height="32"
|
||
alt="RDF/XML Metadata" /></a>
|
||
-->
|
||
|
||
${site_footer ()}
|
||
|
||
</div>
|
||
|
||
${site_top ()}
|
||
|
||
</body>
|
||
</html>
|