def format_date(date): """ Format a date. """ if date is None: return '' try: # datetime return date.replace(tzinfo=gg.UTC(), microsecond=0).isoformat() except TypeError: # date return datetime.datetime.combine( date, datetime.time(tzinfo=gg.UTC())).isoformat()
def metadata_item(self, dc): """ Build metadata from DublinCore struct. Example of metadata: <metadata xmlns:dcterms='http://purl.org/dc/terms/' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:opf='http://www.idpf.org/2007/opf'> <dcterms:identifier opf:scheme='URI' id='id'>http://www.gutenberg.org/ebooks/29000</dc:identifier> <dcterms:creator opf:file-as='Trollope, Anthony'>Anthony Trollope</dc:creator> <dcterms:title>The Macdermots of Ballycloran</dc:title> <dcterms:language xsi:type='dcterms:RFC3066'>en</dc:language> <dcterms:subject>Domestic fiction</dc:subject> <dcterms:subject>Ireland -- Fiction</dc:subject> <dcterms:created>1890</dcterms:created> <dcterms:publisher>Project Gutenberg</dc:publisher> <dcterms:date opf:event='publication'>2009-05-31</dc:date> <dcterms:date opf:event='conversion'>2009-08-26T21:11:14Z</dc:date> <dcterms:rights>Public domain</dc:rights> <dcterms:source>29000-h.htm</dc:source> <meta name='cover' content='item0' /> </metadata> """ # OPF 2.0 v1.0 specifies to use the # Dublin Core Metadata Element Set, Version 1.1 # http://dublincore.org/documents/2004/12/20/dces/ # but that has been superseded by DCMI Metadata Terms # http://dublincore.org/documents/dcmi-terms/ # we use NS.dc for now but should switch to NS.dcterms later dcterms = ElementMaker(nsmap=self.nsmap, namespace=str(NS.dc)) if dc.publisher: self.metadata.append(dcterms.publisher(dc.publisher)) if dc.rights: self.metadata.append(dcterms.rights(dc.rights)) self.metadata.append( dcterms.identifier(dc.opf_identifier, { NS.opf.scheme: 'URI', 'id': 'id' })) # should be NS.xml.id for author in dc.authors: pretty_name = dc.make_pretty_name(author.name) if author.marcrel == 'aut' or author.marcrel == 'cre': self.metadata.append( dcterms.creator(pretty_name, {NS.opf['file-as']: author.name})) else: self.metadata.append( dcterms.contributor( pretty_name, { NS.opf.role: author.marcrel, NS.opf['file-as']: author.name })) # replace newlines with / title = re.sub(r'\s*[\r\n]+\s*', ' / ', dc.title) self.metadata.append(dcterms.title(title)) for language in dc.languages: self.metadata.append( dcterms.language(language.id, {NS.xsi.type: 'dcterms:RFC4646'})) for subject in dc.subjects: self.metadata.append(dcterms.subject(subject.subject)) if dc.created: self.metadata.append( dcterms.date(dc.created, {NS.opf.event: 'creation'})) if dc.release_date: self.metadata.append( dcterms.date(dc.release_date.isoformat(), {NS.opf.event: 'publication'})) self.metadata.append( dcterms.date( datetime.datetime.now(gg.UTC()).isoformat(), {NS.opf.event: 'conversion'})) source = dc.source if hasattr(options.config, 'FILESDIR'): if source.startswith(options.config.FILESDIR): source = source[len(options.config.FILESDIR):] source = urllib.parse.urljoin(options.config.PGURL, source) self.metadata.append(dcterms.source(source))