aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-03-12 21:24:22 +0000
committerMichael Williamson <mike@zwobble.org>2026-03-12 21:24:22 +0000
commit271b5f05d16576d479530663657c31ef37f1391b (patch)
tree55fe0e95f5ece9c79447b62b705caa237390458d /src/main/java/org/zwobble
parent076de3f0567b44e349f7f7af99e5c4ad215646a2 (diff)
Handle hyperlink complex fields with unquoted hrefs
Diffstat (limited to 'src/main/java/org/zwobble')
-rw-r--r--src/main/java/org/zwobble/mammoth/internal/docx/StatefulBodyXmlReader.java21
1 files changed, 9 insertions, 12 deletions
diff --git a/src/main/java/org/zwobble/mammoth/internal/docx/StatefulBodyXmlReader.java b/src/main/java/org/zwobble/mammoth/internal/docx/StatefulBodyXmlReader.java
index 9983d09..dab5fa6 100644
--- a/src/main/java/org/zwobble/mammoth/internal/docx/StatefulBodyXmlReader.java
+++ b/src/main/java/org/zwobble/mammoth/internal/docx/StatefulBodyXmlReader.java
@@ -346,18 +346,15 @@ class StatefulBodyXmlReader {
}
private ComplexField parseInstrText(String instrText, XmlElementLike fldChar) {
- Pattern externalLinkPattern = Pattern.compile("\\s*HYPERLINK \"(.*)\"");
- Matcher externalLinkMatcher = externalLinkPattern.matcher(instrText);
- if (externalLinkMatcher.lookingAt()) {
- String href = externalLinkMatcher.group(1);
- return ComplexField.hyperlink(children -> Hyperlink.href(href, Optional.empty(), children));
- }
-
- Pattern internalLinkPattern = Pattern.compile("\\s*HYPERLINK\\s+\\\\l\\s+\"(.*)\"");
- Matcher internalLinkMatcher = internalLinkPattern.matcher(instrText);
- if (internalLinkMatcher.lookingAt()) {
- String anchor = internalLinkMatcher.group(1);
- return ComplexField.hyperlink(children -> Hyperlink.anchor(anchor, Optional.empty(), children));
+ Pattern linkPattern = Pattern.compile("^\\s*HYPERLINK\\s+(\\\\l\\s+)?(?:\"(.*)\"|([^\\\\]\\S*))");
+ Matcher linkMatcher = linkPattern.matcher(instrText);
+ if (linkMatcher.lookingAt()) {
+ String location = linkMatcher.group(2) == null ? linkMatcher.group(3) : linkMatcher.group(2);
+ if (linkMatcher.group(1) == null) {
+ return ComplexField.hyperlink(children -> Hyperlink.href(location, Optional.empty(), children));
+ } else {
+ return ComplexField.hyperlink(children -> Hyperlink.anchor(location, Optional.empty(), children));
+ }
}
Pattern checkboxPattern = Pattern.compile("\\s*FORMCHECKBOX\\s*");