private void outputComponent(ComponentInfo component, StringBuilder sb) {
   sb.append("{ \"name\": \"");
   sb.append(component.name);
   sb.append("\",\n  \"version\": \"");
   sb.append(component.getVersion());
   sb.append("\",\n  \"categoryString\": \"");
   sb.append(component.getCategoryString());
   sb.append("\",\n  \"helpString\": ");
   sb.append(formatDescription(component.getHelpDescription()));
   sb.append(",\n  \"showOnPalette\": \"");
   sb.append(component.getShowOnPalette());
   sb.append("\",\n  \"nonVisible\": \"");
   sb.append(component.getNonVisible());
   sb.append("\",\n  \"iconName\": \"");
   sb.append(component.getIconName());
   sb.append("\",\n  \"properties\": [");
   String separator = "";
   for (Map.Entry<String, DesignerProperty> entry : component.designerProperties.entrySet()) {
     String propertyName = entry.getKey();
     DesignerProperty dp = entry.getValue();
     sb.append(separator);
     outputProperty(propertyName, dp, sb);
     separator = ",\n";
   }
   // We need additional information about properties in the blocks editor,
   // and we need all of them, not just the Designer properties. We output
   // the entire set separately for use by the blocks editor to keep things simple.
   sb.append("],\n  \"blockProperties\": [");
   separator = "";
   for (Property prop : component.properties.values()) {
     sb.append(separator);
     // Output properties that are not user-visible, but mark them as invisible
     // Note: carrying this over from the old Java blocks editor. I'm not sure
     // that we'll actually do anything with invisible properties in the blocks
     // editor. ([email protected])
     outputBlockProperty(prop.name, prop, sb);
     separator = ",\n    ";
   }
   sb.append("],\n  \"events\": [");
   separator = "";
   for (Event event : component.events.values()) {
     if (event.userVisible) {
       sb.append(separator);
       outputBlockEvent(event.name, event, sb);
       separator = ",\n    ";
     }
   }
   sb.append("],\n  \"methods\": [");
   separator = "";
   for (Method method : component.methods.values()) {
     if (method.userVisible) {
       sb.append(separator);
       outputBlockMethod(method.name, method, sb);
       separator = ",\n    ";
     }
   }
   sb.append("]}\n");
 }