| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- const colCache = require('../../../utils/col-cache');
- const XmlStream = require('../../../utils/xml-stream');
- const BaseXform = require('../base-xform');
- const TwoCellAnchorXform = require('./two-cell-anchor-xform');
- const OneCellAnchorXform = require('./one-cell-anchor-xform');
- function getAnchorType(model) {
- const range = typeof model.range === 'string' ? colCache.decode(model.range) : model.range;
- return range.br ? 'xdr:twoCellAnchor' : 'xdr:oneCellAnchor';
- }
- class DrawingXform extends BaseXform {
- constructor() {
- super();
- this.map = {
- 'xdr:twoCellAnchor': new TwoCellAnchorXform(),
- 'xdr:oneCellAnchor': new OneCellAnchorXform(),
- };
- }
- prepare(model) {
- model.anchors.forEach((item, index) => {
- item.anchorType = getAnchorType(item);
- const anchor = this.map[item.anchorType];
- anchor.prepare(item, {index});
- });
- }
- get tag() {
- return 'xdr:wsDr';
- }
- render(xmlStream, model) {
- xmlStream.openXml(XmlStream.StdDocAttributes);
- xmlStream.openNode(this.tag, DrawingXform.DRAWING_ATTRIBUTES);
- model.anchors.forEach(item => {
- const anchor = this.map[item.anchorType];
- anchor.render(xmlStream, item);
- });
- xmlStream.closeNode();
- }
- parseOpen(node) {
- if (this.parser) {
- this.parser.parseOpen(node);
- return true;
- }
- switch (node.name) {
- case this.tag:
- this.reset();
- this.model = {
- anchors: [],
- };
- break;
- default:
- this.parser = this.map[node.name];
- if (this.parser) {
- this.parser.parseOpen(node);
- }
- break;
- }
- return true;
- }
- parseText(text) {
- if (this.parser) {
- this.parser.parseText(text);
- }
- }
- parseClose(name) {
- if (this.parser) {
- if (!this.parser.parseClose(name)) {
- this.model.anchors.push(this.parser.model);
- this.parser = undefined;
- }
- return true;
- }
- switch (name) {
- case this.tag:
- return false;
- default:
- // could be some unrecognised tags
- return true;
- }
- }
- reconcile(model, options) {
- model.anchors.forEach(anchor => {
- if (anchor.br) {
- this.map['xdr:twoCellAnchor'].reconcile(anchor, options);
- } else {
- this.map['xdr:oneCellAnchor'].reconcile(anchor, options);
- }
- });
- }
- }
- DrawingXform.DRAWING_ATTRIBUTES = {
- 'xmlns:xdr': 'http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing',
- 'xmlns:a': 'http://schemas.openxmlformats.org/drawingml/2006/main',
- };
- module.exports = DrawingXform;
|