mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-08 02:34:06 -04:00
Fix writing metadata to RTF files with no info block
This commit is contained in:
parent
6650029e89
commit
65681cf015
@ -69,7 +69,7 @@ def get_metadata(stream):
|
|||||||
stream.seek(0)
|
stream.seek(0)
|
||||||
if stream.read(5) != r'{\rtf':
|
if stream.read(5) != r'{\rtf':
|
||||||
raise Exception('Not a valid RTF file')
|
raise Exception('Not a valid RTF file')
|
||||||
block, pos = get_document_info(stream)
|
block = get_document_info(stream)[0]
|
||||||
if not block:
|
if not block:
|
||||||
return MetaInformation(None, None)
|
return MetaInformation(None, None)
|
||||||
title, author, comment, category = None, None, None, None
|
title, author, comment, category = None, None, None, None
|
||||||
@ -90,6 +90,29 @@ def get_metadata(stream):
|
|||||||
mi.category = category
|
mi.category = category
|
||||||
return mi
|
return mi
|
||||||
|
|
||||||
|
|
||||||
|
def create_metadata(stream, options):
|
||||||
|
md = r'{\info'
|
||||||
|
if options.title:
|
||||||
|
title = options.title.encode('ascii', 'replace')
|
||||||
|
md += r'{\title %s}'%(title,)
|
||||||
|
if options.authors:
|
||||||
|
author = options.authors.encode('ascii', 'replace')
|
||||||
|
md += r'{\author %s}'%(author,)
|
||||||
|
if options.category:
|
||||||
|
category = options.category.encode('ascii', 'replace')
|
||||||
|
md += r'{\category %s}'%(category,)
|
||||||
|
if options.comment:
|
||||||
|
comment = options.comment.encode('ascii', 'replace')
|
||||||
|
md += r'{\subject %s}'%(comment,)
|
||||||
|
if len(md) > 6:
|
||||||
|
md += '}'
|
||||||
|
stream.seek(0)
|
||||||
|
src = stream.read()
|
||||||
|
ans = src[:6] + md + src[6:]
|
||||||
|
stream.seek(0)
|
||||||
|
stream.write(ans)
|
||||||
|
|
||||||
def set_metadata(stream, options):
|
def set_metadata(stream, options):
|
||||||
'''
|
'''
|
||||||
Modify/add RTF metadata in stream
|
Modify/add RTF metadata in stream
|
||||||
@ -99,46 +122,50 @@ def set_metadata(stream, options):
|
|||||||
index = src.rindex('}')
|
index = src.rindex('}')
|
||||||
return src[:index] + r'{\ '[:-1] + name + ' ' + val + '}}'
|
return src[:index] + r'{\ '[:-1] + name + ' ' + val + '}}'
|
||||||
src, pos = get_document_info(stream)
|
src, pos = get_document_info(stream)
|
||||||
olen = len(src)
|
if not src:
|
||||||
base_pat = r'\{\\name(.*?)(?<!\\)\}'
|
create_metadata(stream, options)
|
||||||
title = options.title
|
else:
|
||||||
if title != None:
|
olen = len(src)
|
||||||
title = title.encode('ascii', 'replace')
|
|
||||||
pat = re.compile(base_pat.replace('name', 'title'), re.DOTALL)
|
base_pat = r'\{\\name(.*?)(?<!\\)\}'
|
||||||
if pat.search(src):
|
title = options.title
|
||||||
src = pat.sub(r'{\\title ' + title + r'}', src)
|
if title != None:
|
||||||
else:
|
title = title.encode('ascii', 'replace')
|
||||||
src = add_metadata_item(src, 'title', title)
|
pat = re.compile(base_pat.replace('name', 'title'), re.DOTALL)
|
||||||
comment = options.comment
|
if pat.search(src):
|
||||||
if comment != None:
|
src = pat.sub(r'{\\title ' + title + r'}', src)
|
||||||
comment = comment.encode('ascii', 'replace')
|
else:
|
||||||
pat = re.compile(base_pat.replace('name', 'subject'), re.DOTALL)
|
src = add_metadata_item(src, 'title', title)
|
||||||
if pat.search(src):
|
comment = options.comment
|
||||||
src = pat.sub(r'{\\subject ' + comment + r'}', src)
|
if comment != None:
|
||||||
else:
|
comment = comment.encode('ascii', 'replace')
|
||||||
src = add_metadata_item(src, 'subject', comment)
|
pat = re.compile(base_pat.replace('name', 'subject'), re.DOTALL)
|
||||||
author = options.authors
|
if pat.search(src):
|
||||||
if author != None:
|
src = pat.sub(r'{\\subject ' + comment + r'}', src)
|
||||||
author = author.encode('ascii', 'replace')
|
else:
|
||||||
pat = re.compile(base_pat.replace('name', 'author'), re.DOTALL)
|
src = add_metadata_item(src, 'subject', comment)
|
||||||
if pat.search(src):
|
author = options.authors
|
||||||
src = pat.sub(r'{\\author ' + author + r'}', src)
|
if author != None:
|
||||||
else:
|
author = author.encode('ascii', 'replace')
|
||||||
src = add_metadata_item(src, 'author', author)
|
pat = re.compile(base_pat.replace('name', 'author'), re.DOTALL)
|
||||||
category = options.category
|
if pat.search(src):
|
||||||
if category != None:
|
src = pat.sub(r'{\\author ' + author + r'}', src)
|
||||||
category = category.encode('ascii', 'replace')
|
else:
|
||||||
pat = re.compile(base_pat.replace('name', 'category'), re.DOTALL)
|
src = add_metadata_item(src, 'author', author)
|
||||||
if pat.search(src):
|
category = options.category
|
||||||
src = pat.sub(r'{\\category ' + category + r'}', src)
|
if category != None:
|
||||||
else:
|
category = category.encode('ascii', 'replace')
|
||||||
src = add_metadata_item(src, 'category', category)
|
pat = re.compile(base_pat.replace('name', 'category'), re.DOTALL)
|
||||||
stream.seek(pos + olen)
|
if pat.search(src):
|
||||||
after = stream.read()
|
src = pat.sub(r'{\\category ' + category + r'}', src)
|
||||||
stream.seek(pos)
|
else:
|
||||||
stream.truncate()
|
src = add_metadata_item(src, 'category', category)
|
||||||
stream.write(src)
|
stream.seek(pos + olen)
|
||||||
stream.write(after)
|
after = stream.read()
|
||||||
|
stream.seek(pos)
|
||||||
|
stream.truncate()
|
||||||
|
stream.write(src)
|
||||||
|
stream.write(after)
|
||||||
|
|
||||||
|
|
||||||
def main(args=sys.argv):
|
def main(args=sys.argv):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user