var readXmlFromZipFile = require("./office-xml-reader").readXmlFromZipFile; exports.readNumberingXml = readNumberingXml; exports.readNumberingFromZipFile = readNumberingFromZipFile; exports.Numbering = Numbering; function readNumberingFromZipFile(file) { return readXmlFromZipFile(file, "word/numbering.xml") .then(function(xml) { return xml ? readNumberingXml(xml) : new Numbering({}); }); } function Numbering(nums) { return { findLevel: function(numId, level) { var num = nums[numId]; if (num) { return num[level]; } else { return null; } } }; } function readNumberingXml(xml) { var abstractNums = readAbstractNums(xml); var nums = readNums(xml, abstractNums); return new Numbering(nums); } function readAbstractNums(xml) { var abstractNums = {}; xml.root.getElementsByTagName("w:abstractNum").forEach(function(element) { var id = element.attributes["w:abstractNumId"]; abstractNums[id] = readAbstractNum(element); }); return abstractNums; } function readAbstractNum(element) { var levels = {}; element.getElementsByTagName("w:lvl").forEach(function(levelElement) { var levelIndex = levelElement.attributes["w:ilvl"]; var numFmt = levelElement.first("w:numFmt").attributes["w:val"]; levels[levelIndex] = { isOrdered: numFmt !== "bullet", level: levelIndex }; }); return levels; } function readNums(xml, abstractNums) { var nums = {}; xml.root.getElementsByTagName("w:num").forEach(function(element) { var id = element.attributes["w:numId"]; var abstractNumId = element.first("w:abstractNumId").attributes["w:val"]; nums[id] = abstractNums[abstractNumId]; }); return nums; }