vml-textbox-xform.js 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. const BaseXform = require('../base-xform');
  2. class VmlTextboxXform extends BaseXform {
  3. get tag() {
  4. return 'v:textbox';
  5. }
  6. conversionUnit(value, multiple, unit) {
  7. return `${parseFloat(value) * multiple.toFixed(2)}${unit}`;
  8. }
  9. reverseConversionUnit(inset) {
  10. return (inset || '').split(',').map(margin => {
  11. return Number(parseFloat(this.conversionUnit(parseFloat(margin), 0.1, '')).toFixed(2));
  12. });
  13. }
  14. render(xmlStream, model) {
  15. const attributes = {
  16. style: 'mso-direction-alt:auto',
  17. };
  18. if (model && model.note) {
  19. let {inset} = model.note && model.note.margins;
  20. if (Array.isArray(inset)) {
  21. inset = inset
  22. .map(margin => {
  23. return this.conversionUnit(margin, 10, 'mm');
  24. })
  25. .join(',');
  26. }
  27. if (inset) {
  28. attributes.inset = inset;
  29. }
  30. }
  31. xmlStream.openNode('v:textbox', attributes);
  32. xmlStream.leafNode('div', {style: 'text-align:left'});
  33. xmlStream.closeNode();
  34. }
  35. parseOpen(node) {
  36. switch (node.name) {
  37. case this.tag:
  38. this.model = {
  39. inset: this.reverseConversionUnit(node.attributes.inset),
  40. };
  41. return true;
  42. default:
  43. return true;
  44. }
  45. }
  46. parseText() {}
  47. parseClose(name) {
  48. switch (name) {
  49. case this.tag:
  50. return false;
  51. default:
  52. return true;
  53. }
  54. }
  55. }
  56. module.exports = VmlTextboxXform;