From 7e2b2dd94d8d2f671d1c6fa9baa0fd4230b10b76 Mon Sep 17 00:00:00 2001 From: Tom Forbes Date: Mon, 26 Jun 2017 14:46:50 +0100 Subject: [PATCH] Add support for more word fields in hyperlinks using the `@` prefix. --- CHANGELOG.md | 3 ++ setup.py | 2 +- tests/comparison/generate_report.py | 48 ++++++++++++++---- .../images/cross_references.html.html.png | Bin 4597 -> 11644 bytes .../images/cross_references.html.png | Bin 3612 -> 13911 bytes tests/docs/cross_references.html | 5 ++ wordinserter/renderers/com.py | 13 ++++- 7 files changed, 57 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e3bdd0c..e0b1ed4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +## 1.0.5 +Add support for more word fields in hyperlinks. The syntax is ``. Currently only `FILENAME` is supported + ## 1.0.4 Add support for text-alignment in paragraphs. diff --git a/setup.py b/setup.py index 3eca00b..963f524 100644 --- a/setup.py +++ b/setup.py @@ -21,7 +21,7 @@ setup( name='wordinserter', - version='1.0.4', + version='1.0.5', packages=find_packages(), url='https://github.com/orf/wordinserter', license='MIT', diff --git a/tests/comparison/generate_report.py b/tests/comparison/generate_report.py index d70c6ed..dc89a9e 100644 --- a/tests/comparison/generate_report.py +++ b/tests/comparison/generate_report.py @@ -1,25 +1,30 @@ import pathlib -import shutil import subprocess import sys +import tempfile +import dhash from selenium import webdriver -from wand.color import Color from wand.image import Image image_directory = pathlib.Path("images") -if image_directory.exists(): - shutil.rmtree(str(image_directory)) - # If the directory is open in explorer it won't be removed. if not image_directory.exists(): image_directory.mkdir() +temp_directory = pathlib.Path(tempfile.mkdtemp()) # [(file name, word image, html image)] results = [] + +def is_same_image(img1, img2): + current_hash = dhash.dhash_int(img1) + old_hash = dhash.dhash_int(img2) + return dhash.get_num_bits_different(current_hash, old_hash) == 0 + + if __name__ == "__main__": if len(sys.argv) != 1: file_names = [pathlib.Path(p) for p in sys.argv[1:]] @@ -35,20 +40,41 @@ print('- Handling {0}'.format(file.absolute())) word_save = image_directory / (file.name + '.png') + word_save_temp = temp_directory / (file.name + '.png') + browser_save = image_directory / (file.name + '.html.png') + browser_save_temp = temp_directory / (file.name + '.html.png') + + subprocess.call(['wordinserter', str(file), '--close', '--save={save}'.format(save=word_save_temp)]) - subprocess.call(['wordinserter', str(file), '--close', '--save={save}'.format(save=word_save)]) + if word_save.exists(): + with Image(filename=str(word_save)) as current_word_image,\ + Image(filename=str(word_save_temp)) as new_word_img: + if not is_same_image(current_word_image, new_word_img): + word_save.write_bytes(word_save_temp.read_bytes()) + else: + print('{0} and {1} are the same, not overwriting'.format(word_save, word_save_temp)) + else: + word_save.write_bytes(word_save_temp.read_bytes()) browser.get('file://{0}'.format(file.absolute())) browser.execute_script("document.body.style.margin = '0px'") browser.execute_script("document.body.style.padding = '10px'") browser.execute_script("document.body.style.display = 'inline-block'") body_size = browser.find_element_by_tag_name('body').size - browser.save_screenshot(str(browser_save)) - - with Image(filename=str(browser_save)) as browser_img: - browser_img.crop(**body_size) - browser_img.save(filename=str(browser_save)) + browser.save_screenshot(str(browser_save_temp)) + + with Image(filename=str(browser_save_temp)) as new_browser_img: + new_browser_img.crop(**body_size) + + if browser_save.exists(): + with Image(filename=str(browser_save)) as current_img: + if not is_same_image(current_img, new_browser_img): + new_browser_img.save(filename=str(browser_save)) + else: + print('{0} and {1} are the same, not overwriting'.format(browser_save, browser_save_temp)) + else: + new_browser_img.save(filename=str(browser_save)) results.append((file.name, word_save, browser_save)) diff --git a/tests/comparison/images/cross_references.html.html.png b/tests/comparison/images/cross_references.html.html.png index 960192279c84ce0bf2b5afb4ada7fb544216c9e6..06dc2713291e870f3dda20e3971d7bd6329e4816 100644 GIT binary patch literal 11644 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 diff --git a/tests/comparison/images/cross_references.html.png b/tests/comparison/images/cross_references.html.png index 3415ccbb49d4e1dae592b3d0d211add83c7c7139..5c12694123ed07b8e0e8a21a36d04d00839b5d37 100644 GIT binary patch literal 13911 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 delta 3467 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 Text Here + +

Can use '@CODE' to insert document fields, or '!ref' to insert field REF codes

+

Invalid Code: Nothing goes here

+

Document Name: Filename Goes Here

+ diff --git a/wordinserter/renderers/com.py b/wordinserter/renderers/com.py index 0f76a12..f2bf325 100644 --- a/wordinserter/renderers/com.py +++ b/wordinserter/renderers/com.py @@ -281,11 +281,20 @@ def hyperlink(self, op: HyperLink): if op.location.startswith('#'): self.document.Hyperlinks.Add(Anchor=rng, TextToDisplay="", SubAddress=op.location.replace('#', '', 1)) - elif op.location.startswith('!'): + elif op.location.startswith('!') or op.location.startswith('@'): + if op.location.startswith('!'): + text = "REF {} \h".format(op.location.replace('!', '', 1)) + else: + text = op.location.replace('@', '', 1) + code = text.split(' ')[0] + # Whitelist document codes. + if code not in {'FILENAME'}: + return + field = self.document.Fields.Add( Range=rng, Type=self.constants.wdFieldEmpty, - Text="REF {} \h".format(op.location.replace('!', '', 1)), + Text=text, PreserveFormatting=True ) # When inserting fields, the cursor stays at the beginning, select it so it collapses to the end of it

Reference: Should not appear in the word doc