plugins/ImportArtboards.js

const lib = require('../');

/**
 * Plugin to import pages and artboards from external sketch files.
 * This fixes some issues in sketch on copy/paste artboards containing symbols.
 * It only imports pages and artboards not existing in the destination sketch (with the same name)
 * It also imports the library symbols used
 *
 * @alias module:plugins.ImportArtboards
 * @example
 * sketch.use(new ImportArtboards('path/to/source.sketch'));
 */
class ImportArtboards {
    /**
     * @constructor
     *
     * @param {string} source Path to the sketch file containing the pages to import
     */
    constructor(source) {
        this.source = source;
    }

    run(sketch) {
        return lib.read(this.source)
            .then(source => {
                source.pages.forEach(srcPage => {
                    const page = sketch.pages.find(page => page.name === srcPage.name);

                    if (page) {
                        const offsetY = getOffsetY(page, srcPage) + 50;

                        srcPage.layers.forEach(srcLayer => {
                            const layer = page.layers.find(layer => layer.name === srcLayer.name);

                            if (!layer) {
                                page.push('layers', srcLayer).frame.y += offsetY;
                            }
                        });
                    } else {
                        sketch.pages.push(srcPage);
                    }
                });

                //Import foreign symbols
                const foreignSymbols = sketch.foreignSymbols;

                source.foreignSymbols.forEach(symbol => {
                    const existing = foreignSymbols.find(fs => fs.symbolID === symbol.symbolID);

                    if (!existing) {
                        sketch.document.push('foreignSymbols', symbol.parent);
                    }
                });
            });
    }
}

function getOffsetY(page, srcPage) {
    let pageY = 0, srcPageY;

    page.layers.forEach(layer => {
        const y = layer.frame.y + layer.frame.height;

        if (y > pageY) {
            pageY = y;
        }
    });

    srcPage.layers.forEach(layer => {
        const y = layer.frame.y;

        if (srcPageY === undefined) {
            srcPageY = y;
        } else if (srcPageY > y) {
            srcPageY = y;
        }
    });

    return pageY - srcPageY;
}

module.exports = ImportArtboards;