summaryrefslogtreecommitdiff
path: root/lib/docx/docx-reader.js
blob: ae09adc4ffd4f515ac52be52e30d2a625a32a1be (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
exports.read = read;

var promises = require("../promises");
var unzip = require("../unzip");

var readXmlFromZipFile = require("./office-xml-reader").readXmlFromZipFile;
var documents = require("../documents");
var DocumentXmlReader = require("./document-xml-reader").DocumentXmlReader;
var relationshipsReader = require("./relationships-reader");
var contentTypesReader = require("./content-types-reader");
var numberingXml = require("./numbering-xml");
var stylesReader = require("./styles-reader");


function read(options) {
    var docxFile = unzip.openZip(options);
    return promises.when(docxFile).then(function(docxFile) {
        return promises.all([
            readRelationshipsFromZipFile(docxFile),
            readContentTypesFromZipFile(docxFile),
            readNumberingFromZipFile(docxFile),
            readStylesFromZipFile(docxFile),
            readXmlFromZipFile(docxFile, "word/document.xml"),
        ]).spread(function(relationships, contentTypes, numbering, styles, documentXml) {
            var reader = new DocumentXmlReader({
                relationships: relationships,
                contentTypes: contentTypes,
                docxFile: docxFile,
                numbering: numbering,
                styles: styles
            });
            return reader.convertXmlToDocument(documentXml);
        });
    });
}

function xmlFileReader(options) {
    return function(zipFile) {
        return readXmlFromZipFile(zipFile, options.filename)
            .then(function(element) {
                return element ? options.readElement(element) : options.defaultValue;
            });
    };
}

var readContentTypesFromZipFile = xmlFileReader({
    filename: "[Content_Types].xml",
    readElement: contentTypesReader.readContentTypesFromXml,
    defaultValue: contentTypesReader.defaultContentTypes
});

var readRelationshipsFromZipFile = xmlFileReader({
    filename: "word/_rels/document.xml.rels",
    readElement: relationshipsReader.readRelationships,
    defaultValue: {}
});

var readNumberingFromZipFile = xmlFileReader({
    filename: "word/numbering.xml",
    readElement: numberingXml.readNumberingXml,
    defaultValue: numberingXml.defaultNumbering
});

var readStylesFromZipFile = xmlFileReader({
    filename: "word/styles.xml",
    readElement: stylesReader.readStylesXml,
    defaultValue: stylesReader.defaultStyles
});