private void writeCoverage(OutputStream out) throws IOException {

    out.write("<h3 id=\"coverageDetail\">Coverage Detail</h3>\n".getBytes());

    StringBuilder key = new StringBuilder();
    key.append("<table>");
    key.append("<tr><th style=\"background-color:#dddddd\">Colour Key</th></tr>");
    key.append(
        "<tr><td style=\"background-color:"
            + COLOUR_SHADE_GREEN
            + ";text-align:center\">Assertion is covered</td></tr>");
    key.append(
        "<tr><td style=\"background-color:"
            + COLOUR_SHADE_RED
            + ";text-align:center\">Assertion is not covered</td></tr>");
    key.append(
        "<tr><td style=\"background-color:"
            + COLOUR_SHADE_ORANGE
            + ";text-align:center\">Assertion test is unimplemented</td></tr>");
    key.append(
        "<tr><td style=\"background-color:"
            + COLOUR_SHADE_BLUE
            + ";text-align:center\">Assertion is untestable</td></tr>");
    key.append("</table>");
    out.write(key.toString().getBytes());

    for (String sectionId : auditParser.getSectionIds()) {

      List<AuditAssertion> sectionAssertions = auditParser.getAssertionsForSection(sectionId);

      if (sectionAssertions != null && !sectionAssertions.isEmpty()) {
        StringBuilder sb = new StringBuilder();

        out.write(
            ("<h4 class=\"sectionHeader\" id=\""
                    + sectionId
                    + "\">Section "
                    + sectionId
                    + " - "
                    + escape(auditParser.getSectionTitle(sectionId))
                    + "</h4>\n")
                .getBytes());

        for (AuditAssertion assertion : sectionAssertions) {
          List<SpecReference> coverage = getCoverageForAssertion(sectionId, assertion.getId());
          TestStatus status = getStatus(coverage);

          String divClass = null;

          if (assertion.isTestable()) {
            if (status.equals(TestStatus.UNCOVERED)) {
              divClass = "fail";
            } else if (status.equals(TestStatus.UNIMPLEMENTED)) {
              divClass = "skip";
            } else {
              divClass = "pass";
            }
          } else {
            divClass = "untestable";
          }

          sb.append("  <div class=\"" + divClass + "\">\n");

          if (assertion.isImplied()) {
            sb.append(
                "<span class=\"implied\">The following assertion is not made explicitly by the spec, however it is implied</span>");
          }

          sb.append("    <span class=\"code\">");
          sb.append(assertion.getId());
          sb.append(")");

          if (!Strings.isEmpty(assertion.getNote())) {
            sb.append(
                "<img title=\""
                    + assertion.getNote()
                    + "\" src=\"images/blank.png\" class=\"stickynote\"/>");
            // sb.append("<a title=\"" + assertion.getNote() + "\"><img title=\"" +
            // assertion.getNote() + "\" src=\"images/blank.png\" class=\"stickynote\"/></a>");
          }

          sb.append("</span>\n");

          sb.append("    <div class=\"results\">");

          sb.append("<p class=\"description\">");
          String imageFilename = sectionId + "." + assertion.getId() + ".png";
          File imageFile = new File(imageSrcDir, imageFilename);

          if (imageFile.exists()) {
            sb.append("<img src=\"images/" + imageFile.getName() + "\" class=\"embeddedImage\"/>");
            copyFile(imageFile, new File(imageTargetDir, imageFilename));
          }

          String assertionText =
              parseStrikethrough(parseBold(parseLiteral(escape(assertion.getText()))));
          sb.append(assertionText);
          sb.append("</p>\n");

          if (assertion.isTestable()) {
            sb.append("    <div class=\"coverage\">\n");
            sb.append("      <p class=\"coverageHeader\">Coverage</p>\n");

            String currentPackageName = null;

            if (status.equals(TestStatus.UNCOVERED)) {
              sb.append("        <p class=\"noCoverage\">No tests exist for this assertion</p>\n");
            } else {
              for (SpecReference ref : coverage) {
                if (!ref.getPackageName().equals(currentPackageName)) {
                  currentPackageName = ref.getPackageName();
                  sb.append("        <div class=\"packageName\">");
                  sb.append(currentPackageName);
                  sb.append("        </div>\n");
                }

                sb.append("        <div class=\"coverageMethod\">");
                sb.append(ref.getClassName());
                sb.append(".");
                sb.append(ref.getMethodName());
                sb.append("()");

                if (fisheyeBaseUrl != null) {
                  sb.append("<a class=\"external\" target=\"_blank\" href=\"");
                  sb.append(fisheyeBaseUrl);
                  sb.append(currentPackageName.replace('.', '/'));
                  sb.append("/");
                  sb.append(ref.getClassName());
                  sb.append(".java");
                  sb.append("\">fisheye</a>");
                }

                if (svnBaseUrl != null) {
                  if (fisheyeBaseUrl != null) {
                    sb.append("|");
                  }

                  sb.append("<a class=\"external\" target=\"_blank\" href=\"");
                  sb.append(svnBaseUrl);
                  sb.append(currentPackageName.replace('.', '/'));
                  sb.append("/");
                  sb.append(ref.getClassName());
                  sb.append(".java");
                  sb.append("\">svn</a>");
                }

                sb.append("</div>\n");
              }
            }

            sb.append("    </div>\n");
          } else if (!coverage.isEmpty()) {
            sb.append("<b>A test exists for this untestable assertion!</b>");
          }

          sb.append("</div></div>");
        }

        out.write(sb.toString().getBytes());
      } else {
        // We still want to be able to jump to this section by clicking on the links
        // in the chapter and section summaries
        out.write(
            ("<div style=\"visibility:hidden\" id=\"" + sectionId + "\"></div>\n").getBytes());
      }
    }
  }