aboutsummaryrefslogtreecommitdiff
path: root/mammoth
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2021-08-01 17:20:33 +0100
committerMichael Williamson <mike@zwobble.org>2021-08-01 17:20:33 +0100
commitb537a3713700b4fc40a23d0ca51b11846d562328 (patch)
tree19a8ddebc9ac8f36c1fc01b806982b46bcded2fc /mammoth
parent30d24cb9dee83df7a1b108fbc83cdfec31b81b9a (diff)
Handle internal hyperlinks created with complex fields
Diffstat (limited to 'mammoth')
-rw-r--r--mammoth/docx/body_xml.py30
-rw-r--r--mammoth/docx/complex_fields.py8
2 files changed, 21 insertions, 17 deletions
diff --git a/mammoth/docx/body_xml.py b/mammoth/docx/body_xml.py
index 8329bcf..4c66ae8 100644
--- a/mammoth/docx/body_xml.py
+++ b/mammoth/docx/body_xml.py
@@ -96,11 +96,11 @@ def _create_reader(numbering, content_types, relationships, styles, docx_file, f
is_small_caps = read_boolean_element(properties.find_child("w:smallCaps"))
def add_complex_field_hyperlink(children):
- hyperlink_href = current_hyperlink_href()
- if hyperlink_href is None:
+ hyperlink_kwargs = current_hyperlink_kwargs()
+ if hyperlink_kwargs is None:
return children
else:
- return [documents.hyperlink(href=hyperlink_href, children=children)]
+ return [documents.hyperlink(children=children, **hyperlink_kwargs)]
return _ReadResult.map_results(
_read_run_style(properties),
@@ -155,10 +155,10 @@ def _create_reader(numbering, content_types, relationships, styles, docx_file, f
current_instr_text = []
complex_field_stack = []
- def current_hyperlink_href():
+ def current_hyperlink_kwargs():
for complex_field in reversed(complex_field_stack):
if isinstance(complex_field, complex_fields.Hyperlink):
- return complex_field.href
+ return complex_field.kwargs
return None
@@ -171,21 +171,25 @@ def _create_reader(numbering, content_types, relationships, styles, docx_file, f
complex_field_stack.pop()
elif fld_char_type == "separate":
instr_text = "".join(current_instr_text)
- hyperlink_href = parse_hyperlink_field_code(instr_text)
- if hyperlink_href is None:
+ hyperlink_kwargs = parse_hyperlink_field_code(instr_text)
+ if hyperlink_kwargs is None:
complex_field = complex_fields.unknown
else:
- complex_field = complex_fields.hyperlink(hyperlink_href)
+ complex_field = complex_fields.hyperlink(hyperlink_kwargs)
complex_field_stack.pop()
complex_field_stack.append(complex_field)
return _empty_result
def parse_hyperlink_field_code(instr_text):
- result = re.match(r'\s*HYPERLINK "(.*)"', instr_text)
- if result is None:
- return None
- else:
- return result.group(1)
+ external_link_result = re.match(r'\s*HYPERLINK "(.*)"', instr_text)
+ if external_link_result is not None:
+ return dict(href=external_link_result.group(1))
+
+ internal_link_result = re.match(r'\s*HYPERLINK\s+\\l\s+"(.*)"', instr_text)
+ if internal_link_result is not None:
+ return dict(anchor=internal_link_result.group(1))
+
+ return None
def read_instr_text(element):
current_instr_text.append(_inner_text(element))
diff --git a/mammoth/docx/complex_fields.py b/mammoth/docx/complex_fields.py
index d1d95af..75bc05a 100644
--- a/mammoth/docx/complex_fields.py
+++ b/mammoth/docx/complex_fields.py
@@ -3,9 +3,9 @@ class unknown(object):
class Hyperlink(object):
- def __init__(self, href):
- self.href = href
+ def __init__(self, kwargs):
+ self.kwargs = kwargs
-def hyperlink(href):
- return Hyperlink(href)
+def hyperlink(kwargs):
+ return Hyperlink(kwargs=kwargs)