aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2021-01-19 20:25:21 +0000
committerMichael Williamson <mike@zwobble.org>2021-01-19 20:25:21 +0000
commita423d1a368eb1e81951e5d8a75347fa7997152bf (patch)
tree4c8cf748c3f01552831ca538a9846ac19a075bfa
parentf141817b947e36a9db7c56600c5031de32bb0fb9 (diff)
Convert symbols in supported fonts to corresponding Unicode characters
-rw-r--r--NEWS4
-rw-r--r--lib/docx/body-reader.js20
-rw-r--r--package-lock.json7
-rw-r--r--package.json1
-rw-r--r--test/docx/body-reader.tests.js21
5 files changed, 52 insertions, 1 deletions
diff --git a/NEWS b/NEWS
index b458827..937a043 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,7 @@
+# 1.4.16
+
+* Convert symbols in supported fonts to corresponding Unicode characters.
+
# 1.4.15
* Support numbering defined by paragraph style.
diff --git a/lib/docx/body-reader.js b/lib/docx/body-reader.js
index 2616dde..90c2b39 100644
--- a/lib/docx/body-reader.js
+++ b/lib/docx/body-reader.js
@@ -1,6 +1,7 @@
exports.createBodyReader = createBodyReader;
exports._readNumberingProperties = readNumberingProperties;
+var dingbatToUnicode = require("dingbat-to-unicode");
var _ = require("underscore");
var documents = require("../documents");
@@ -167,6 +168,24 @@ function BodyReader(options) {
return emptyResult();
}
+ function readSymbol(element) {
+ // See 17.3.3.30 sym (Symbol Character) of ECMA-376 4th edition Part 1
+ var font = element.attributes["w:font"];
+ var char = element.attributes["w:char"];
+ var unicodeCharacter = dingbatToUnicode.hex(font, char);
+ if (unicodeCharacter == null && /^F0..$/.test(char)) {
+ unicodeCharacter = dingbatToUnicode.hex(font, char.substring(2));
+ }
+
+ if (unicodeCharacter == null) {
+ return emptyResultWithMessages([warning(
+ "A w:sym element with an unsupported character was ignored: char " + char + " in font " + font
+ )]);
+ } else {
+ return elementResult(new documents.Text(unicodeCharacter.string));
+ }
+ }
+
function noteReferenceReader(noteType) {
return function(element) {
var noteId = element.attributes["w:id"];
@@ -240,6 +259,7 @@ function BodyReader(options) {
"w:softHyphen": function(element) {
return elementResult(new documents.Text("\u00AD"));
},
+ "w:sym": readSymbol,
"w:hyperlink": function(element) {
var relationshipId = element.attributes["r:id"];
var anchor = element.attributes["w:anchor"];
diff --git a/package-lock.json b/package-lock.json
index 657116f..d272c6d 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,6 +1,6 @@
{
"name": "mammoth",
- "version": "1.4.12",
+ "version": "1.4.15",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
@@ -739,6 +739,11 @@
"randombytes": "^2.0.0"
}
},
+ "dingbat-to-unicode": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/dingbat-to-unicode/-/dingbat-to-unicode-1.0.1.tgz",
+ "integrity": "sha512-98l0sW87ZT58pU4i61wa2OHwxbiYSbuxsCBozaVnYX2iCnr3bLM3fIes1/ej7h1YdOKuKt/MLs706TVnALA65w=="
+ },
"doctrine": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz",
diff --git a/package.json b/package.json
index 0941be1..624ff53 100644
--- a/package.json
+++ b/package.json
@@ -19,6 +19,7 @@
"dependencies": {
"argparse": "~1.0.3",
"bluebird": "~3.4.0",
+ "dingbat-to-unicode": "^1.0.1",
"jszip": "~2.5.0",
"lop": "~0.4.0",
"path-is-absolute": "^1.0.0",
diff --git a/test/docx/body-reader.tests.js b/test/docx/body-reader.tests.js
index 331ab18..49ea73c 100644
--- a/test/docx/body-reader.tests.js
+++ b/test/docx/body-reader.tests.js
@@ -672,6 +672,27 @@ test("soft hyphens are read as text", function() {
assert.deepEqual(text, new documents.Text("\u00AD"));
});
+test("w:sym with supported font and supported code point in ASCII range is converted to text", function() {
+ var element = new XmlElement("w:sym", {"w:font": "Wingdings", "w:char": "28"}, []);
+ var text = readXmlElementValue(element);
+ assert.deepEqual(text, new documents.Text("🕿"));
+});
+
+test("w:sym with supported font and supported code point in private use area is converted to text", function() {
+ var element = new XmlElement("w:sym", {"w:font": "Wingdings", "w:char": "F028"}, []);
+ var text = readXmlElementValue(element);
+ assert.deepEqual(text, new documents.Text("🕿"));
+});
+
+test("w:sym with unsupported font and code point produces empty result with warning", function() {
+ var element = new XmlElement("w:sym", {"w:font": "Dingwings", "w:char": "28"}, []);
+
+ var result = readXmlElement(element);
+
+ assert.deepEqual(result.value, []);
+ assert.deepEqual(result.messages, [warning("A w:sym element with an unsupported character was ignored: char 28 in font Dingwings")]);
+});
+
test("w:tbl is read as document table element", function() {
var tableXml = new XmlElement("w:tbl", {}, [
new XmlElement("w:tr", {}, [