text: import boundMark from '../bound/boundMark';
  
  var keys = [
    'marktype', 'name', 'role', 'interactive', 'clip', 'items', 'zindex',
    'x', 'y', 'width', 'height', 'align', 'baseline',             // layout
    'fill', 'fillOpacity', 'opacity', 'blend',                    // fill
    'stroke', 'strokeOpacity', 'strokeWidth', 'strokeCap',        // stroke
    'strokeDash', 'strokeDashOffset',                             // stroke dash
    'strokeForeground', 'strokeOffset',                           // group
    'startAngle', 'endAngle', 'innerRadius', 'outerRadius',       // arc
    'cornerRadius', 'padAngle',                                   // arc, rect
    'cornerRadiusTopLeft', 'cornerRadiusTopRight',                // rect, group
    'cornerRadiusBottomLeft', 'cornerRadiusBottomRight',
    'interpolate', 'tension', 'orient', 'defined',                // area, line
    'url', 'aspect', 'smooth',                                    // image
    'path', 'scaleX', 'scaleY',                                   // path
    'x2', 'y2',                                                   // rule
    'size', 'shape',                                              // symbol
    'text', 'angle', 'theta', 'radius', 'dir', 'dx', 'dy',        // text
    'ellipsis', 'limit', 'lineBreak', 'lineHeight',
    'font', 'fontSize', 'fontWeight', 'fontStyle', 'fontVariant'  // font
  ];
  
  export function sceneToJSON(scene, indent) {
    return JSON.stringify(scene, keys, indent);
  }
  
  export function sceneFromJSON(json) {
    var scene = (typeof json === 'string' ? JSON.parse(json) : json);
    return initialize(scene);
  }
  
  function initialize(scene) {
    var type = scene.marktype,
        items = scene.items,
        parent, i, n;
  
    if (items) {
      for (i=0, n=items.length; i<n; ++i) {
        parent = type ? 'mark' : 'group';
        items[i][parent] = scene;
        if (items[i].zindex) items[i][parent].zdirty = true;
        if ('group' === (type || parent)) initialize(items[i]);
      }
    }
  
    if (type) boundMark(scene);
    return scene;
  }
  