- return new OutputState(getPlainTextOutput(movies), getHtmlOutput(movies));
- }
-
- private Optional<String> getHtmlOutput(Collection<Movie> movies) {
- Document document = createShell("");
- document.head().appendElement("style").attr("type", "text/css").text(generateStyleSheet());
- document.body().appendElement("h1").text("Kinoprogramm: Savoy");
- document.body().appendElement("h2").text("Filme");
- movies.stream().filter(withPerformances).sorted(byName).forEach(movie -> {
- document.body().appendChild(createMovieNode(movie));
- });
- document.body().appendElement("h2").text("Zeiten");
- movies.stream().flatMap(movie -> movie.getPerformances().stream().map(performance -> new Presentation(movie, performance))).sorted((leftPresentation, rightPresentation) -> leftPresentation.getTicketLink().getTime().compareTo(rightPresentation.getTicketLink().getTime())).collect(Collectors.<Presentation, LocalDate>groupingBy(presentation -> presentation.getTicketLink().getTime().toLocalDate())).entrySet().stream().sorted((leftEntry, rightEntry) -> leftEntry.getKey().compareTo(rightEntry.getKey())).forEach(dateEntry -> {
- document.body().appendChild(createDayNode(dateEntry.getKey(), dateEntry.getValue()));
- });
- document.body().appendElement("h2").text("Vorschau");
- movies.stream().filter(withPerformances.negate()).sorted(byName).forEach(movie -> {
- document.body().appendElement("div").attr("class", "name").text(movie.getName());
- });
- return of(document.toString());
- }
-
- private String generateStyleSheet() {
- StringBuilder styleSheet = new StringBuilder();
- styleSheet.append(".movie .name { font-weight: bold; }\n");
- styleSheet.append(".day:first-child { margin-top: 1em; }\n");
- styleSheet.append(".date { display: table-cell; font-weight: bold; }\n");
- styleSheet.append(".presentation { display: inline; }\n");
- styleSheet.append(".time, .movie { display: inline; }\n");
- return styleSheet.toString();
- }
-
- private Node createMovieNode(Movie movie) {
- Element movieNode = new Element(valueOf("div"), "");
- movieNode.attr("class", "movie");
- movieNode.appendElement("div").attr("class", "name").text(movie.getName());
- movie.getPerformances().stream().sorted(byTime).forEach(performance -> {
- Element presentationNode = movieNode.appendElement("div").attr("class", "presentation");
- presentationNode.appendElement("div").attr("class", "time").text("» ").appendElement("a").attr("href", performance.getLink()).text(performance.getTime().format(dateTimeFormatter));
- });
- return movieNode;
- }
-
- private Node createDayNode(LocalDate date, List<Presentation> presentations) {
- Element dayNode = new Element(valueOf("div"), "").attr("class", "day");
- dayNode.appendElement("div").attr("class", "date").text(date.format(dateFormatter));
- presentations.stream().forEach(presentation -> {
- Element presentationNode = dayNode.appendElement("div").attr("class", "presentation");
- presentationNode.appendElement("div").attr("class", "time").text("» " + presentation.getTicketLink().getTime().format(timeFormatter));
- presentationNode.appendElement("div").attr("class", "movie").appendElement("a").attr("href", presentation.getTicketLink().getLink()).text(presentation.getMovie().getName());
- });
- return dayNode;
- }
-
- private Optional<String> getPlainTextOutput(Collection<Movie> movies) {
- return empty();
- }
-
- private static class Presentation {
-
- private final Movie movie;
- private final Performance performance;
-
- private Presentation(Movie movie, Performance performance) {
- this.movie = movie;
- this.performance = performance;
- }
-
- private Movie getMovie() {
- return movie;
- }
-
- private Performance getTicketLink() {
- return performance;
- }
-