package com.github.signed.changelog; import static java.lang.String.format; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; public class MarkdownSerializer implements ChangelogVisitor { private static class RenderedLink { private final String name; private final Link link; private RenderedLink(String name, Link link) { this.name = name; this.link = link; } } private final List<String> lines = new ArrayList<>(); @Override public void visit(Header header) { lines.add("# Change Log"); lines.add(header.text()); lines.add(""); } @Override public void visit(Version version) { List<RenderedLink> renderedLinks = new ArrayList<>(); String versionAsPlainString = version.versionNumber().map(VersionNumber::asString).orElse("Unreleased"); String releaseDatePartOfHeadlineString = version.releaseDate().map((releaseDate) -> " - " + releaseDate.asString()).orElse(""); String versionPartOfHeadline; if (version.link().isPresent()) { versionPartOfHeadline = format("[%s]", versionAsPlainString); renderedLinks.add(new RenderedLink(versionAsPlainString, version.link().get())); } else { versionPartOfHeadline = versionAsPlainString; } lines.add(format("## %s%s", versionPartOfHeadline, releaseDatePartOfHeadlineString)); boolean remove = false; for (Category category : version) { lines.add("### " + category.name()); for (Item item : category) { lines.add("- " +String.join("\n ",item.lines())); } lines.add(""); remove = true; } if (remove) { lines.remove(lines.size() - 1); } if (!renderedLinks.isEmpty()) { lines.add(""); renderedLinks.stream() .map(renderedLink -> format("[%s]: %s", renderedLink.name, renderedLink.link.asString())) .forEachOrdered(lines::add); } lines.add(""); } public String markdown() { return lines.stream().collect(Collectors.joining("\n")); } }