DOCX: Generate OPF file

This commit is contained in:
Kovid Goyal 2013-05-24 10:58:30 +05:30
parent 8d234da162
commit ae1029f452
2 changed files with 17 additions and 3 deletions

View File

@ -11,7 +11,7 @@ import os, sys, shutil
from lxml import etree from lxml import etree
from calibre import walk, guess_type from calibre import walk, guess_type
from calibre.ebooks.metadata import string_to_authors from calibre.ebooks.metadata import string_to_authors, authors_to_sort_string
from calibre.ebooks.metadata.book.base import Metadata from calibre.ebooks.metadata.book.base import Metadata
from calibre.ebooks.docx import InvalidDOCX from calibre.ebooks.docx import InvalidDOCX
from calibre.ebooks.docx.names import DOCUMENT, DOCPROPS, XPath, APPPROPS from calibre.ebooks.docx.names import DOCUMENT, DOCPROPS, XPath, APPPROPS
@ -49,6 +49,7 @@ def read_doc_props(raw, mi):
aut.extend(string_to_authors(author.text)) aut.extend(string_to_authors(author.text))
if aut: if aut:
mi.authors = aut mi.authors = aut
mi.author_sort = authors_to_sort_string(aut)
desc = XPath('//dc:description')(root) desc = XPath('//dc:description')(root)
if desc: if desc:

View File

@ -22,6 +22,7 @@ from calibre.ebooks.docx.numbering import Numbering
from calibre.ebooks.docx.fonts import Fonts from calibre.ebooks.docx.fonts import Fonts
from calibre.ebooks.docx.images import Images from calibre.ebooks.docx.images import Images
from calibre.ebooks.docx.footnotes import Footnotes from calibre.ebooks.docx.footnotes import Footnotes
from calibre.ebooks.metadata.opf2 import OPFCreator
from calibre.utils.localization import canonicalize_lang, lang_as_iso639_1 from calibre.utils.localization import canonicalize_lang, lang_as_iso639_1
class Text: class Text:
@ -145,7 +146,7 @@ class Convert(object):
notes_header.set('class', '%s notes-header' % cls) notes_header.set('class', '%s notes-header' % cls)
break break
self.write() return self.write()
def read_page_properties(self, doc): def read_page_properties(self, doc):
current = [] current = []
@ -235,6 +236,13 @@ class Convert(object):
with open(os.path.join(self.dest_dir, 'docx.css'), 'wb') as f: with open(os.path.join(self.dest_dir, 'docx.css'), 'wb') as f:
f.write(css.encode('utf-8')) f.write(css.encode('utf-8'))
opf = OPFCreator(self.dest_dir, self.mi)
opf.create_manifest_from_files_in([self.dest_dir])
opf.create_spine(['index.html'])
with open(os.path.join(self.dest_dir, 'metadata.opf'), 'wb') as of, open(os.path.join(self.dest_dir, 'toc.ncx'), 'wb') as ncx:
opf.render(of, ncx, 'toc.ncx')
return os.path.join(self.dest_dir, 'metadata.opf')
def convert_p(self, p): def convert_p(self, p):
dest = P() dest = P()
self.object_map[dest] = p self.object_map[dest] = p
@ -413,7 +421,12 @@ class Convert(object):
self.styles.register(css, 'frame') self.styles.register(css, 'frame')
if __name__ == '__main__': if __name__ == '__main__':
import shutil
from calibre.utils.logging import default_log from calibre.utils.logging import default_log
default_log.filter_level = default_log.DEBUG default_log.filter_level = default_log.DEBUG
Convert(sys.argv[-1], log=default_log)() dest_dir = os.path.join(os.getcwdu(), 'docx_input')
if os.path.exists(dest_dir):
shutil.rmtree(dest_dir)
os.mkdir(dest_dir)
Convert(sys.argv[-1], dest_dir=dest_dir, log=default_log)()