rich-text-xform.js 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. const TextXform = require('./text-xform');
  2. const FontXform = require('../style/font-xform');
  3. const BaseXform = require('../base-xform');
  4. // <r>
  5. // <rPr>
  6. // <sz val="11"/>
  7. // <color theme="1" tint="5"/>
  8. // <rFont val="Calibri"/>
  9. // <family val="2"/>
  10. // <scheme val="minor"/>
  11. // </rPr>
  12. // <t xml:space="preserve"> is </t>
  13. // </r>
  14. class RichTextXform extends BaseXform {
  15. constructor(model) {
  16. super();
  17. this.model = model;
  18. }
  19. get tag() {
  20. return 'r';
  21. }
  22. get textXform() {
  23. return this._textXform || (this._textXform = new TextXform());
  24. }
  25. get fontXform() {
  26. return this._fontXform || (this._fontXform = new FontXform(RichTextXform.FONT_OPTIONS));
  27. }
  28. render(xmlStream, model) {
  29. model = model || this.model;
  30. xmlStream.openNode('r');
  31. if (model.font) {
  32. this.fontXform.render(xmlStream, model.font);
  33. }
  34. this.textXform.render(xmlStream, model.text);
  35. xmlStream.closeNode();
  36. }
  37. parseOpen(node) {
  38. if (this.parser) {
  39. this.parser.parseOpen(node);
  40. return true;
  41. }
  42. switch (node.name) {
  43. case 'r':
  44. this.model = {};
  45. return true;
  46. case 't':
  47. this.parser = this.textXform;
  48. this.parser.parseOpen(node);
  49. return true;
  50. case 'rPr':
  51. this.parser = this.fontXform;
  52. this.parser.parseOpen(node);
  53. return true;
  54. default:
  55. return false;
  56. }
  57. }
  58. parseText(text) {
  59. if (this.parser) {
  60. this.parser.parseText(text);
  61. }
  62. }
  63. parseClose(name) {
  64. switch (name) {
  65. case 'r':
  66. return false;
  67. case 't':
  68. this.model.text = this.parser.model;
  69. this.parser = undefined;
  70. return true;
  71. case 'rPr':
  72. this.model.font = this.parser.model;
  73. this.parser = undefined;
  74. return true;
  75. default:
  76. if (this.parser) {
  77. this.parser.parseClose(name);
  78. }
  79. return true;
  80. }
  81. }
  82. }
  83. RichTextXform.FONT_OPTIONS = {
  84. tagName: 'rPr',
  85. fontNameTag: 'rFont',
  86. };
  87. module.exports = RichTextXform;