docs: static String generateGraphVizDotFileFromInterClassDependencies(final ClassInfoList classInfoList,
              final float sizeX, final float sizeY, final boolean includeExternalClasses) {
  
          final StringBuilder buf = new StringBuilder(1024 * 1024);
          buf.append("digraph {\n");
          buf.append("size=\"").append(sizeX).append(',').append(sizeY).append("\";\n");
          buf.append("layout=dot;\n");
          buf.append("rankdir=\"BT\";\n");
          buf.append("overlap=false;\n");
          buf.append("splines=true;\n");
          buf.append("pack=true;\n");
          buf.append("graph [fontname = \"Courier, Regular\"]\n");
          buf.append("node [fontname = \"Courier, Regular\"]\n");
          buf.append("edge [fontname = \"Courier, Regular\"]\n");
  
          final Set<ClassInfo> allVisibleNodes = new HashSet<>(classInfoList);
          if (includeExternalClasses) {
              for (final ClassInfo ci : classInfoList) {
                  allVisibleNodes.addAll(ci.getClassDependencies());
              }
          }
  
          for (final ClassInfo ci : allVisibleNodes) {
              buf.append('"').append(ci.getName()).append('"');
              buf.append("[shape=").append(ci.isAnnotation() ? "oval" : ci.isInterface() ? "diamond" : "box")
                      .append(",style=filled,fillcolor=\"#").append(ci.isAnnotation() ? ANNOTATION_COLOR
                              : ci.isInterface() ? INTERFACE_COLOR : STANDARD_CLASS_COLOR)
                      .append("\",label=");
              buf.append('<');
              buf.append("<table border='0' cellborder='0' cellspacing='1'>");
  
              // Class modifiers
              buf.append("<tr><td><font point-size='12'>").append(ci.getModifiersStr()).append(' ')
                      .append(ci.isEnum() ? "enum"
                              : ci.isAnnotation() ? "@interface" : ci.isInterface() ? "interface" : "class")
                      .append("</font></td></tr>");
  
              if (ci.getName().contains(".")) {
                  buf.append("<tr><td><font point-size='14'><b>");
                  htmlEncode(ci.getPackageName(), buf);
                  buf.append("</b></font></td></tr>");
              }
  
              // Class name
              buf.append("<tr><td><font point-size='20'><b>");
              htmlEncode(ci.getSimpleName(), buf);
              buf.append("</b></font></td></tr>");
              buf.append("</table>");
              buf.append(">];\n");
          }
  
          buf.append('\n');
          for (final ClassInfo ci : classInfoList) {
              for (final ClassInfo dep : ci.getClassDependencies()) {
                  if (includeExternalClasses || allVisibleNodes.contains(dep)) {
                      // class --> dep
                      buf.append("  \"").append(ci.getName()).append("\" -> \"").append(dep.getName())
                              .append("\" [arrowsize=2.5]\n");
                  }
              }
          }
  
          buf.append('}');
          return buf.toString();
      }