styles-reader.js 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. exports.readStylesXml = readStylesXml;
  2. exports.Styles = Styles;
  3. exports.defaultStyles = new Styles({}, {});
  4. function Styles(paragraphStyles, characterStyles, tableStyles, numberingStyles) {
  5. return {
  6. findParagraphStyleById: function(styleId) {
  7. return paragraphStyles[styleId];
  8. },
  9. findCharacterStyleById: function(styleId) {
  10. return characterStyles[styleId];
  11. },
  12. findTableStyleById: function(styleId) {
  13. return tableStyles[styleId];
  14. },
  15. findNumberingStyleById: function(styleId) {
  16. return numberingStyles[styleId];
  17. }
  18. };
  19. }
  20. Styles.EMPTY = new Styles({}, {}, {}, {});
  21. function readStylesXml(root) {
  22. var paragraphStyles = {};
  23. var characterStyles = {};
  24. var tableStyles = {};
  25. var numberingStyles = {};
  26. var styles = {
  27. "paragraph": paragraphStyles,
  28. "character": characterStyles,
  29. "table": tableStyles
  30. };
  31. root.getElementsByTagName("w:style").forEach(function(styleElement) {
  32. var style = readStyleElement(styleElement);
  33. if (style.type === "numbering") {
  34. numberingStyles[style.styleId] = readNumberingStyleElement(styleElement);
  35. } else {
  36. var styleSet = styles[style.type];
  37. if (styleSet) {
  38. styleSet[style.styleId] = style;
  39. }
  40. }
  41. });
  42. return new Styles(paragraphStyles, characterStyles, tableStyles, numberingStyles);
  43. }
  44. function readStyleElement(styleElement) {
  45. var type = styleElement.attributes["w:type"];
  46. var styleId = styleElement.attributes["w:styleId"];
  47. var name = styleName(styleElement);
  48. return {type: type, styleId: styleId, name: name};
  49. }
  50. function styleName(styleElement) {
  51. var nameElement = styleElement.first("w:name");
  52. return nameElement ? nameElement.attributes["w:val"] : null;
  53. }
  54. function readNumberingStyleElement(styleElement) {
  55. var numId = styleElement
  56. .firstOrEmpty("w:pPr")
  57. .firstOrEmpty("w:numPr")
  58. .firstOrEmpty("w:numId")
  59. .attributes["w:val"];
  60. return {numId: numId};
  61. }