docs: private String buildErrorChapter(final BuildData buildData) {
          log.info("\tBuilding Error Chapter");
  
          String errorItemizedLists = "";
  
          if (buildData.getErrorDatabase().hasItems(buildData.getBuildLocale())) {
              for (final TopicErrorData topicErrorData : buildData.getErrorDatabase().getErrors(buildData.getBuildLocale())) {
                  // Check if the app should be shutdown
                  if (isShuttingDown.get()) {
                      return null;
                  }
  
                  final BaseTopicWrapper<?> topic = topicErrorData.getTopic();
  
                  final List<String> topicErrorItems = new ArrayList<String>();
  
                  final String tags = EntityUtilities.getCommaSeparatedTagList(topic);
                  final String url = topic.getPressGangURL();
  
                  topicErrorItems.add(DocBookUtilities.buildListItem("INFO: " + StringEscapeUtils.escapeXml(topic.getTitle())));
                  if (tags != null && !tags.isEmpty()) {
                      topicErrorItems.add(DocBookUtilities.buildListItem("INFO: " + StringEscapeUtils.escapeXml(tags)));
                  }
  
                  if (buildData.getDocBookVersion() == DocBookVersion.DOCBOOK_50) {
                      topicErrorItems.add(DocBookUtilities.buildListItem("INFO: <link xlink:href=\"" + url + "\">Topic URL</link>"));
                  } else {
                      topicErrorItems.add(DocBookUtilities.buildListItem("INFO: <ulink url=\"" + url + "\">Topic URL</ulink>"));
                  }
  
                  for (final String error : topicErrorData.getItemsOfType(ErrorLevel.ERROR)) {
                      topicErrorItems.add(DocBookUtilities.buildListItem("ERROR: " + error));
                  }
  
                  for (final String warning : topicErrorData.getItemsOfType(ErrorLevel.WARNING)) {
                      topicErrorItems.add(DocBookUtilities.buildListItem("WARNING: " + warning));
                  }
  
                  /*
                   * this should never be false, because a topic will only be listed in the errors collection once a error or
                   * warning has been added. The count of 2 comes from the standard list items we added above for the title and
                   * url.
                   */
                  if (topicErrorItems.size() > 2) {
                      final String title;
                      if (topic instanceof TranslatedTopicWrapper) {
                          title = "Topic ID " + topic.getTopicId() + ", Revision " + topic.getTopicRevision();
                      } else {
                          title = "Topic ID " + topic.getTopicId();
                      }
                      final String id = topic.getErrorXRefId();
  
                      errorItemizedLists += DocBookUtilities.wrapListItems(buildData.getDocBookVersion(), topicErrorItems, title, id);
                  }
              }
  
              // Create the glossary
              final String errorGlossary = buildErrorChapterGlossary(buildData, "Compiler Glossary");
              if (errorGlossary != null) {
                  errorItemizedLists += errorGlossary;
              }
          } else {
              errorItemizedLists = "<para>No Errors Found</para>";
          }
  
          if (buildData.getContentSpec().getBookType() == BookType.ARTICLE || buildData.getContentSpec().getBookType() == BookType
                  .ARTICLE_DRAFT) {
              return DocBookBuildUtilities.addDocBookPreamble(buildData.getDocBookVersion(),
                      DocBookUtilities.buildSection(errorItemizedLists, "Compiler Output"), "section", buildData.getEntityFileName());
          } else {
              return DocBookBuildUtilities.addDocBookPreamble(buildData.getDocBookVersion(),
                      DocBookUtilities.buildChapter(errorItemizedLists, "Compiler Output"), "chapter", buildData.getEntityFileName());
          }
      }