Fix writing metadata to RTF files with no info block

This commit is contained in:
Kovid Goyal 2007-08-05 15:40:26 +00:00
parent 6650029e89
commit 65681cf015

View File

@ -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):