aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble/mammoth/internal/docx/StatefulBodyXmlReader.java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2021-01-23 15:35:10 +0000
committerMichael Williamson <mike@zwobble.org>2021-01-23 15:35:10 +0000
commit9900b88419abc1bf8f29c856f620fbbfda358d1c (patch)
tree4bba2af78a9e064f0a52303cdba6a8a92f579358 /src/main/java/org/zwobble/mammoth/internal/docx/StatefulBodyXmlReader.java
parent18d8561d42b28061b12b350a236de08b70b0c67f (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.java34
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) {