From 9900b88419abc1bf8f29c856f620fbbfda358d1c Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 23 Jan 2021 15:35:10 +0000 Subject: Convert symbols in supported fonts to corresponding Unicode characters --- .../internal/docx/StatefulBodyXmlReader.java | 34 ++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) (limited to 'src/main/java/org/zwobble/mammoth/internal/docx/StatefulBodyXmlReader.java') 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 font = element.getAttributeOrNone("w:font"); + Optional charValue = element.getAttributeOrNone("w:char"); + if (font.isPresent() && charValue.isPresent()) { + Optional 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) { -- cgit v1.2.3