+ return format("ComicState[comics=%s]", comics());
+ }
+
+ @Nonnull
+ @Override
+ protected String summary(Reaction reaction) {
+ return format("New Comic found for “%s!”", reaction.name());
+ }
+
+ @Nonnull
+ @Override
+ protected String plainText() {
+ StringBuilder text = new StringBuilder();
+
+ for (Comic newComic : newComics) {
+ text.append("Comic Found: ").append(newComic.title()).append("\n\n");
+ for (Strip strip : newComic) {
+ text.append("Image: ").append(strip.imageUrl()).append("\n");
+ if (!StringUtils.isBlank(strip.comment())) {
+ text.append("Comment: ").append(strip.comment()).append("\n");
+ }
+ }
+ text.append("\n\n");
+ }
+
+ return text.toString();
+ }
+
+ @Nullable
+ @Override
+ protected String htmlText() {
+ StringBuilder html = new StringBuilder();
+ html.append("<body>");
+
+ for (Comic newComic : newComics) {
+ generateComicHtml(html, newComic);
+ }
+
+ List<Comic> latestComics = new ArrayList<>(comics());
+ Collections.reverse(latestComics);
+ int comicCount = 0;
+ for (Comic comic : latestComics) {
+ if (newComics.contains(comic)) {
+ continue;
+ }
+ generateComicHtml(html, comic);
+ if (++comicCount == 7) {
+ break;
+ }
+ }
+
+ return html.append("</body>").toString();
+ }
+
+ private void generateComicHtml(StringBuilder html, Comic comic) {
+ html.append("<h1>").append(StringEscapeUtils.escapeHtml4(comic.title())).append("</h1>\n");
+ for (Strip strip : comic) {
+ html.append("<div><img src=\"").append(StringEscapeUtils.escapeHtml4(strip.imageUrl()));
+ html.append("\" alt=\"").append(StringEscapeUtils.escapeHtml4(strip.comment()));
+ html.append("\" title=\"").append(StringEscapeUtils.escapeHtml4(strip.comment()));
+ html.append("\"></div>\n");
+ html.append("<div>").append(StringEscapeUtils.escapeHtml4(strip.comment())).append("</div>\n");
+ }