code: func massageSVG(svg string) string {
  	// Work around for dot bug which misses quoting some ampersands,
  	// resulting on unparsable SVG.
  	svg = strings.Replace(svg, "&;", "&amp;;", -1)
  
  	// Dot's SVG output is
  	//
  	//    <svg width="___" height="___"
  	//     viewBox="___" xmlns=...>
  	//    <g id="graph0" transform="...">
  	//    ...
  	//    </g>
  	//    </svg>
  	//
  	// Change it to
  	//
  	//    <svg width="100%" height="100%"
  	//     xmlns=...>
  
  	//    <script type="text/ecmascript"><![CDATA[` ..$(svgpan.JSSource)... `]]></script>`
  	//    <g id="viewport" transform="translate(0,0)">
  	//    <g id="graph0" transform="...">
  	//    ...
  	//    </g>
  	//    </g>
  	//    </svg>
  
  	if loc := viewBox.FindStringIndex(svg); loc != nil {
  		svg = svg[:loc[0]] +
  			`<svg width="100%" height="100%"` +
  			svg[loc[1]:]
  	}
  
  	if loc := graphID.FindStringIndex(svg); loc != nil {
  		svg = svg[:loc[0]] +
  			`<script type="text/ecmascript"><![CDATA[` + string(svgpan.JSSource) + `]]></script>` +
  			`<g id="viewport" transform="scale(0.5,0.5) translate(0,0)">` +
  			svg[loc[0]:]
  	}
  
  	if loc := svgClose.FindStringIndex(svg); loc != nil {
  		svg = svg[:loc[0]] +
  			`</g>` +
  			svg[loc[0]:]
  	}
  
  	return svg
  }
docs: // massageSVG enhances the SVG output from DOT to provide better
  // panning inside a web browser. It uses the svgpan library, which is
  // embedded into the svgpan.JSSource variable.