diff options
| author | Michael Williamson <mike@zwobble.org> | 2021-01-23 15:35:10 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2021-01-23 15:35:10 +0000 |
| commit | 9900b88419abc1bf8f29c856f620fbbfda358d1c (patch) | |
| tree | 4bba2af78a9e064f0a52303cdba6a8a92f579358 /src/main/java/org/zwobble/mammoth/internal/docx/StatefulBodyXmlReader.java | |
| parent | 18d8561d42b28061b12b350a236de08b70b0c67f (diff) | |
Convert symbols in supported fonts to corresponding Unicode characters
Diffstat (limited to 'src/main/java/org/zwobble/mammoth/internal/docx/StatefulBodyXmlReader.java')
| -rw-r--r-- | src/main/java/org/zwobble/mammoth/internal/docx/StatefulBodyXmlReader.java | 34 |
1 files changed, 32 insertions, 2 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 0cf141e..366cf16 100644 --- a/src/main/java/org/zwobble/mammoth/internal/docx/StatefulBodyXmlReader.java +++ b/src/main/java/org/zwobble/mammoth/internal/docx/StatefulBodyXmlReader.java @@ -15,8 +15,7 @@ import java.util.function.Function; import java.util.regex.Matcher; import java.util.regex.Pattern; -import static org.zwobble.mammoth.internal.docx.ReadResult.EMPTY_SUCCESS; -import static org.zwobble.mammoth.internal.docx.ReadResult.success; +import static org.zwobble.mammoth.internal.docx.ReadResult.*; import static org.zwobble.mammoth.internal.docx.Uris.uriToZipEntryName; import static org.zwobble.mammoth.internal.util.Iterables.lazyFilter; import static org.zwobble.mammoth.internal.util.Iterables.tryGetLast; @@ -93,6 +92,8 @@ class StatefulBodyXmlReader { return success(new Text("\u2011")); case "w:softHyphen": return success(new Text("\u00ad")); + case "w:sym": + return readSymbol(element); case "w:br": return readBreak(element); @@ -359,6 +360,35 @@ class StatefulBodyXmlReader { ); } + private ReadResult readSymbol(XmlElement element) { + Optional<String> font = element.getAttributeOrNone("w:font"); + Optional<String> charValue = element.getAttributeOrNone("w:char"); + if (font.isPresent() && charValue.isPresent()) { + Optional<Integer> dingbat = Dingbats.findDingbat(font.get(), Integer.parseInt(charValue.get(), 16)); + + if (!dingbat.isPresent() && Pattern.matches("F0..", charValue.get())) { + dingbat = Dingbats.findDingbat(font.get(), Integer.parseInt(charValue.get().substring(2), 16)); + } + + if (dingbat.isPresent()) { + return ReadResult.success(new Text(codepointToString(dingbat.get()))); + } + } + return emptyWithWarning( + "A w:sym element with an unsupported character was ignored: char " + + charValue.orElse("null") + " in font " + font.orElse("null") + ); + } + + public String codepointToString(int codePoint) { + if (Character.isBmpCodePoint(codePoint)) { + return String.valueOf((char) codePoint); + } else { + return String.valueOf(Character.highSurrogate(codePoint)) + + Character.lowSurrogate(codePoint); + } + } + private ReadResult readBreak(XmlElement element) { String breakType = element.getAttributeOrNone("w:type").orElse("textWrapping"); switch (breakType) { |
