mark(m, scene) {
      const mdef = Marks[scene.marktype],
        tag = mdef.tag,
        attrList = [ariaItemAttributes, mdef.attr];

      // render opening group tag
      m.open('g', {
        'class': cssClass(scene),
        'clip-path': scene.clip ? clip$1(this, scene, scene.group) : null
      }, ariaMarkAttributes(scene), {
        'pointer-events': tag !== 'g' && scene.interactive === false ? 'none' : null
      });

      // render contained elements
      const process = item => {
        const href = this.href(item);
        if (href) m.open('a', href);
        m.open(tag, this.attr(scene, item, attrList, tag !== 'g' ? tag : null));
        if (tag === 'text') {
          const tl = textLines(item);
          if (isArray(tl)) {
            // multi-line text
            const attrs = {
              x: 0,
              dy: lineHeight(item)
            };
            for (let i = 0; i < tl.length; ++i) {
              m.open('tspan', i ? attrs : null).text(textValue(item, tl[i])).close();
            }
          } else {
            // single-line text
            m.text(textValue(item, tl));
          }
        } else if (tag === 'g') {
          const fore = item.strokeForeground,
            fill = item.fill,
            stroke = item.stroke;
          if (fore && stroke) {
            item.stroke = null;
          }
          m.open('path', this.attr(scene, item, mdef.background, 'bgrect')).close();

          // recurse for group content
          m.open('g', this.attr(scene, item, mdef.content));
          visit(item, scene => this.mark(m, scene));
          m.close();
          if (fore && stroke) {
            if (fill) item.fill = null;
            item.stroke = stroke;
            m.open('path', this.attr(scene, item, mdef.foreground, 'bgrect')).close();
            if (fill) item.fill = fill;
          } else {
            m.open('path', this.attr(scene, item, mdef.foreground, 'bgfore')).close();
          }
        }
        m.close(); // </tag>
        if (href) m.close(); // </a>
      };
      if (mdef.nested) {
        if (scene.items && scene.items.length) process(scene.items[0]);
      } else {
        visit(scene, process);
      }

      // render closing group tag
      return m.close(); // </g>
    }
Render a set of mark items.
@param {object} m - The markup context.
@param {object} scene - The mark parent to render.