aboutsummaryrefslogtreecommitdiff
path: root/lib/docx/docx-reader.js
blob: 80842d7277f0213c2765b1b840a81412b9c43b07 (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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
exports.read = read;

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

var readXmlFromZipFile = require("./office-xml-reader").readXmlFromZipFile;
var BodyReader = require("./body-reader").BodyReader;
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");
var notesReader = require("./notes-reader");


function read(options) {
    return promises.props({
        docxFile: unzip.openZip(options)
    }).also(function(result) {
        return {
            relationships: readRelationshipsFromZipFile(result.docxFile),
            contentTypes: readContentTypesFromZipFile(result.docxFile),
            numbering: readNumberingFromZipFile(result.docxFile),
            styles: readStylesFromZipFile(result.docxFile)
        };
    }).also(function(result) {
        var bodyReader = new BodyReader({
            relationships: result.relationships,
            contentTypes: result.contentTypes,
            docxFile: result.docxFile,
            numbering: result.numbering,
            styles: result.styles
        });
        return {
            documentBodyReader: bodyReader, 
            footnotes: readFootnotesFromZipFile(result.docxFile),
            endnotes: readEndnotesFromZipFile(result.docxFile),
            documentXml: readXmlFromZipFile(result.docxFile, "word/document.xml")
        };
    }).then(function(result) {
        var reader = new DocumentXmlReader({
            bodyReader: result.documentBodyReader,
            footnotes: result.footnotes,
            endnotes: result.endnotes
        });
        return reader.convertXmlToDocument(result.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
});

var readFootnotesFromZipFile = xmlFileReader({
    filename: "word/footnotes.xml",
    readElement: notesReader.readFootnotesXml,
    defaultValue: undefined
});

var readEndnotesFromZipFile = xmlFileReader({
    filename: "word/endnotes.xml",
    readElement: notesReader.readEndnotesXml,
    defaultValue: undefined
});