diff options
| author | Michael Williamson <mike@zwobble.org> | 2021-01-19 20:25:21 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2021-01-19 20:25:21 +0000 |
| commit | a423d1a368eb1e81951e5d8a75347fa7997152bf (patch) | |
| tree | 4c8cf748c3f01552831ca538a9846ac19a075bfa | |
| parent | f141817b947e36a9db7c56600c5031de32bb0fb9 (diff) | |
Convert symbols in supported fonts to corresponding Unicode characters
| -rw-r--r-- | NEWS | 4 | ||||
| -rw-r--r-- | lib/docx/body-reader.js | 20 | ||||
| -rw-r--r-- | package-lock.json | 7 | ||||
| -rw-r--r-- | package.json | 1 | ||||
| -rw-r--r-- | test/docx/body-reader.tests.js | 21 |
5 files changed, 52 insertions, 1 deletions
@@ -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", {}, [ |
