header-footer-xform.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. const BaseXform = require('../base-xform');
  2. class HeaderFooterXform extends BaseXform {
  3. get tag() {
  4. return 'headerFooter';
  5. }
  6. render(xmlStream, model) {
  7. if (model) {
  8. xmlStream.addRollback();
  9. let createTag = false;
  10. xmlStream.openNode('headerFooter');
  11. if (model.differentFirst) {
  12. xmlStream.addAttribute('differentFirst', '1');
  13. createTag = true;
  14. }
  15. if (model.differentOddEven) {
  16. xmlStream.addAttribute('differentOddEven', '1');
  17. createTag = true;
  18. }
  19. if (model.oddHeader && typeof model.oddHeader === 'string') {
  20. xmlStream.leafNode('oddHeader', null, model.oddHeader);
  21. createTag = true;
  22. }
  23. if (model.oddFooter && typeof model.oddFooter === 'string') {
  24. xmlStream.leafNode('oddFooter', null, model.oddFooter);
  25. createTag = true;
  26. }
  27. if (model.evenHeader && typeof model.evenHeader === 'string') {
  28. xmlStream.leafNode('evenHeader', null, model.evenHeader);
  29. createTag = true;
  30. }
  31. if (model.evenFooter && typeof model.evenFooter === 'string') {
  32. xmlStream.leafNode('evenFooter', null, model.evenFooter);
  33. createTag = true;
  34. }
  35. if (model.firstHeader && typeof model.firstHeader === 'string') {
  36. xmlStream.leafNode('firstHeader', null, model.firstHeader);
  37. createTag = true;
  38. }
  39. if (model.firstFooter && typeof model.firstFooter === 'string') {
  40. xmlStream.leafNode('firstFooter', null, model.firstFooter);
  41. createTag = true;
  42. }
  43. if (createTag) {
  44. xmlStream.closeNode();
  45. xmlStream.commit();
  46. } else {
  47. xmlStream.rollback();
  48. }
  49. }
  50. }
  51. parseOpen(node) {
  52. switch (node.name) {
  53. case 'headerFooter':
  54. this.model = {};
  55. if (node.attributes.differentFirst) {
  56. this.model.differentFirst = parseInt(node.attributes.differentFirst, 0) === 1;
  57. }
  58. if (node.attributes.differentOddEven) {
  59. this.model.differentOddEven = parseInt(node.attributes.differentOddEven, 0) === 1;
  60. }
  61. return true;
  62. case 'oddHeader':
  63. this.currentNode = 'oddHeader';
  64. return true;
  65. case 'oddFooter':
  66. this.currentNode = 'oddFooter';
  67. return true;
  68. case 'evenHeader':
  69. this.currentNode = 'evenHeader';
  70. return true;
  71. case 'evenFooter':
  72. this.currentNode = 'evenFooter';
  73. return true;
  74. case 'firstHeader':
  75. this.currentNode = 'firstHeader';
  76. return true;
  77. case 'firstFooter':
  78. this.currentNode = 'firstFooter';
  79. return true;
  80. default:
  81. return false;
  82. }
  83. }
  84. parseText(text) {
  85. switch (this.currentNode) {
  86. case 'oddHeader':
  87. this.model.oddHeader = text;
  88. break;
  89. case 'oddFooter':
  90. this.model.oddFooter = text;
  91. break;
  92. case 'evenHeader':
  93. this.model.evenHeader = text;
  94. break;
  95. case 'evenFooter':
  96. this.model.evenFooter = text;
  97. break;
  98. case 'firstHeader':
  99. this.model.firstHeader = text;
  100. break;
  101. case 'firstFooter':
  102. this.model.firstFooter = text;
  103. break;
  104. default:
  105. break;
  106. }
  107. }
  108. parseClose() {
  109. switch (this.currentNode) {
  110. case 'oddHeader':
  111. case 'oddFooter':
  112. case 'evenHeader':
  113. case 'evenFooter':
  114. case 'firstHeader':
  115. case 'firstFooter':
  116. this.currentNode = undefined;
  117. return true;
  118. default:
  119. return false;
  120. }
  121. }
  122. }
  123. module.exports = HeaderFooterXform;