From 701e732eb66eb205ba9a2a71a06185af3568cadd Mon Sep 17 00:00:00 2001 From: Peet Date: Wed, 4 Jun 2025 18:25:35 +0200 Subject: [PATCH] uebung08 --- uebung08/src/doc/Book.java | 63 ++++++++ uebung08/src/doc/BookDemo.java | 148 +++++++++++++++++++ uebung08/src/doc/CountWordsVisitor.java | 38 +++++ uebung08/src/doc/Image.java | 29 ++++ uebung08/src/doc/Paragraph.java | 39 +++++ uebung08/src/doc/Section.java | 35 +++++ uebung08/src/doc/TableOfContentsVisitor.java | 77 ++++++++++ uebung08/src/doc/TextComponent.java | 7 + uebung08/src/doc/ToTextVisitor.java | 38 +++++ uebung08/src/doc/Visitor.java | 10 ++ 10 files changed, 484 insertions(+) create mode 100644 uebung08/src/doc/Book.java create mode 100644 uebung08/src/doc/BookDemo.java create mode 100644 uebung08/src/doc/CountWordsVisitor.java create mode 100644 uebung08/src/doc/Image.java create mode 100644 uebung08/src/doc/Paragraph.java create mode 100644 uebung08/src/doc/Section.java create mode 100644 uebung08/src/doc/TableOfContentsVisitor.java create mode 100644 uebung08/src/doc/TextComponent.java create mode 100644 uebung08/src/doc/ToTextVisitor.java create mode 100644 uebung08/src/doc/Visitor.java diff --git a/uebung08/src/doc/Book.java b/uebung08/src/doc/Book.java new file mode 100644 index 0000000..e205bd5 --- /dev/null +++ b/uebung08/src/doc/Book.java @@ -0,0 +1,63 @@ +package doc; +import java.util.List; +import java.util.ArrayList; + +public class Book{ + private String title; + private String author; + private List contents; + + public Book(String author, String title, List contents){ + this.title = title; + this.author = author; + this.contents = contents; + } + + public int countWords(){ + Section helpSection = new Section("help", contents); + return helpSection.countWords(); + } + + public int countWordsByVisitor(){ + CountWordsVisitor countWords = new CountWordsVisitor(); + int wordCount = 0; + for(TextComponent i : contents){ + wordCount += i.accept(countWords); + } + return wordCount; + } + + + public List tableOfContents(){ + TableOfContentsVisitor contentTable = new TableOfContentsVisitor(); + List returnedContent = new ArrayList(); + + for(TextComponent e : contents){ + //contentTable.setPrefix(Integer.toString(itteration)); + List returned = e.accept(contentTable); + if(returned != null){ + returnedContent.addAll(returned); + } + } + + return returnedContent; + } + + + public String toText(){ + StringBuilder st = new StringBuilder(); + ToTextVisitor textVisitor = new ToTextVisitor(); + st.append(" "); + st.append(author); + st.append("\n"); + st.append(title); + st.append("\n\n"); + for(TextComponent i : contents){ + st.append(i.accept(textVisitor)); + st.append("\n"); + } + return st.toString(); + } +} + + diff --git a/uebung08/src/doc/BookDemo.java b/uebung08/src/doc/BookDemo.java new file mode 100644 index 0000000..6a82f61 --- /dev/null +++ b/uebung08/src/doc/BookDemo.java @@ -0,0 +1,148 @@ +package doc; + +import java.util.List; + +public class BookDemo { + private static final String TEXT0 = "Über Entwurf und Realisierung eierlegender Wollmilchsäue."; + private static final String TEXT1 = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod " + + "tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. " + + "At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd " + + "gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum " + + "dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor " + + "invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua."; + private static final String TEXT2 = "Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie " + + "consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan " + + "et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis " + + "dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer " + + "adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore " + + "magna aliquam erat volutpat."; + private static final String TEXT3 = "Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit " + + "lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure " + + "dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore " + + "eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim " + + "qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla " + + "facilisi."; + private static final String TEXT4 = "Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming " + + "id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, " + + "consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet " + + "dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud " + + "exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo " + + "consequat."; + private static final String TEXT5 = "Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie " + + "consequat, vel illum dolore eu feugiat nulla facilisis."; + private static final String TEXT6 = "At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, " + + "no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, " + + "consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et " + + "dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo " + + "duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est " + + "Lorem ipsum dolor sit amet."; + private static final String TEXT7 = "Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore " + + "et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et " + + "justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata " + + "sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur " + + "sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore " + + "magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo " + + "dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est " + + "Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing " + + "elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam " + + "erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea " + + "rebum. Stet clita kasd gubergren, no sea takimata sanctus."; + private static final String TEXT8 = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy " + + "eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam " + + "voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet " + + "clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit " + + "amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam " + + "nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed " + + "diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet " + + "clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. "; + private static final String TEXT9 = "Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie " + + "consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan " + + "et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis " + + "dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer " + + "adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore " + + "magna aliquam erat volutpat."; + private static final String TEXT10 = "Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit " + + "lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure " + + "dolor in hendrerit in vulputate velit esse molestie consequat, vel illum " + + "dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio " + + "dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te " + + "feugait nulla facilisi."; + private static final String TEXT11 = "Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet " + + "doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, " + + "consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut " + + "laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, " + + "quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex " + + "ea commodo"; + private static final String TEXT12 = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy " + + "eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam " + + "voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet " + + "clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit " + + "amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam " + + "nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed " + + "diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet " + + "clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet."; + private static final String TEXT13 = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy " + + "eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam " + + "voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita " + + "kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet."; + private static final String TEXT14 = "At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, " + + "no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit " + + "amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut " + + "labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam " + + "et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata " + + "sanctus est Lorem ipsum dolor sit amet."; + private static final String TEXT15 = "Lorem ipsum dolor sit amet, consetetur sadipscing " + + "elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et " + + "nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd " + + "magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum " + + "dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed " + + "diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat."; + + public static void main(String[] args) { + final Book book = makeBook(); + + // Aufgabe 1 + System.out.println("Buch enthält " + book.countWords() + " Wörter"); + + // Aufgabe 2 + System.out.println("Buch enthält " + book.countWordsByVisitor() + " Wörter"); + System.out.println("Inhalt: " + book.tableOfContents()); + System.out.println(book.toText()); + } + + private static Book makeBook() { + final Section sec1 = new Section("Einführung", + List.of(new Paragraph(TEXT1), + new Paragraph(TEXT2))); + final Section sec2 = new Section("Hintergrund", + List.of(new Paragraph(TEXT3), + new Section("Geschichte", + List.of(new Paragraph(TEXT4), + new Image("https://www.bekannt.de/p1.pdf", + "Bild 1"), + new Paragraph(TEXT5))), + new Section("Literatur", + List.of(new Paragraph(TEXT6), + new Image("https://www.eh-klar.de/p2.pdf", + "Bild 2"), + new Paragraph(TEXT7), + new Image("https://www.jeder-weiss-es.de/p3.pdf", + "Bild 3"), + new Paragraph(TEXT8))))); + final Section sec3 = new Section("Idee", + List.of(new Paragraph(TEXT9))); + final Section sec4 = new Section("Umsetzung", + List.of(new Paragraph(TEXT10), + new Section("Entwurf", + List.of(new Paragraph(TEXT11), + new Section("Grobentwurf", + List.of(new Paragraph(TEXT12))), + new Section("Feinentwurf", + List.of(new Paragraph(TEXT13))))), + new Section("Realisierung", + List.of(new Paragraph(TEXT14))))); + final Section sec5 = new Section("Zusammenfassung und Ausblick", List.of(new Paragraph(TEXT15))); + return new Book("Peter Mustermann", "Die eierlegende Wollmilchsau", + List.of(new Paragraph(TEXT0), sec1, sec2, sec3, sec4, sec5)); + } +} diff --git a/uebung08/src/doc/CountWordsVisitor.java b/uebung08/src/doc/CountWordsVisitor.java new file mode 100644 index 0000000..5a2a015 --- /dev/null +++ b/uebung08/src/doc/CountWordsVisitor.java @@ -0,0 +1,38 @@ +package doc; +import java.util.List; + +public class CountWordsVisitor implements Visitor{ + + public Integer visit(Paragraph e){ + String text = e.getText(); + int wordCount = 0; + boolean open = false; + for (char i : text.toCharArray()){ + if(!open && Character.isAlphabetic(i)){ + open = true; + } + else if(open && !Character.isAlphabetic(i)){ + open = false; + wordCount++; + } + } + if (open){ + open = false; + wordCount++; + } + return wordCount; + } + + public Integer visit(Image e){ + return 0; + } + + public Integer visit(Section e){ + List contents = e.getContents(); + int wordCount = 0; + for (TextComponent c: contents){ + wordCount += c.accept(this); + } + return wordCount; + } +} \ No newline at end of file diff --git a/uebung08/src/doc/Image.java b/uebung08/src/doc/Image.java new file mode 100644 index 0000000..eac835f --- /dev/null +++ b/uebung08/src/doc/Image.java @@ -0,0 +1,29 @@ +package doc; + + +public class Image implements TextComponent{ + private String url; + private String caption; + + public Image(String url, String caption) { + + this.url = url; + this.caption = caption; + } + + public int countWords(){ + return 0; + } + + public String getUrl(){ + return url; + } + + public String getCaption(){ + return caption; + } + + public T accept(Visitor v){ + return v.visit(this); + } +} \ No newline at end of file diff --git a/uebung08/src/doc/Paragraph.java b/uebung08/src/doc/Paragraph.java new file mode 100644 index 0000000..4d8b814 --- /dev/null +++ b/uebung08/src/doc/Paragraph.java @@ -0,0 +1,39 @@ +package doc; + +public class Paragraph implements TextComponent{ + private String text; + + public Paragraph(String text){ + this.text = text; + } + + public String getText(){ + return text; + } + + public int countWords(){ + int wordCount = 0; + boolean open = false; + + for(char i : text.toCharArray()){ + if(!open && Character.isAlphabetic(i)){ + open = true;} + else if(open && !Character.isAlphabetic(i)){ + open = false; + wordCount ++; + } + } + if(open){ + open = false; + wordCount++; + } + return wordCount; + } + + public T accept(Visitor v){ + return v.visit(this); + } +} + + + diff --git a/uebung08/src/doc/Section.java b/uebung08/src/doc/Section.java new file mode 100644 index 0000000..76c7bbb --- /dev/null +++ b/uebung08/src/doc/Section.java @@ -0,0 +1,35 @@ +package doc; +import java.util.List; + +public class Section implements TextComponent{ + + private String header; + private List contents; + + public Section(String header, List contents){ + this.header = header; + this.contents = contents; + } + + public String getHeader(){ + return header; + } + + public List getContents(){ + return contents; + } + + public int countWords(){ + int wordCount = 0; + for(TextComponent i : contents){ + wordCount = wordCount + i.countWords(); + } + return wordCount; + } + + + + public T accept(Visitor v){ + return v.visit(this); + } +} diff --git a/uebung08/src/doc/TableOfContentsVisitor.java b/uebung08/src/doc/TableOfContentsVisitor.java new file mode 100644 index 0000000..bbf7e99 --- /dev/null +++ b/uebung08/src/doc/TableOfContentsVisitor.java @@ -0,0 +1,77 @@ +package doc; + +import java.util.ArrayList; +import java.util.List; + +public class TableOfContentsVisitor implements Visitor >{ + + private String prefix = "1"; + + public TableOfContentsVisitor(){ + } + + public void setPrefix(String pre){ + prefix = pre; + } + + public List visit(Paragraph e){ + return null; + + } + + public List visit(Image e){ + return null; + } + + /*public List visit(Section e){ + List tabelOfContentsList = new ArrayList(); + List copied = e.getContents(); + + String oldPrefix = prefix; + + if(prefix.length() == 0){ + tabelOfContentsList.add(prefix+ " " + e.getHeader()); + } + else { + tabelOfContentsList.add(prefix + " " + e.getHeader()); + } + + int chapter = 1; + for(TextComponent i : e.getContents()){ + + String savedPrefix = prefix; + setPrefix(prefix + "." + Integer.toString(chapter)); + + List returnedContent = i.accept(this); + if (returnedContent != null){ + tabelOfContentsList.addAll(i.accept(this)); + chapter++; + } + setPrefix(savedPrefix); + } + setPrefix(oldPrefix); + return tabelOfContentsList; + + }*/ + + //Alternative die immer den aktuellen Stand übergibt und somit auf jeder "Ebene" ein eigener Visitor agiert + + private int sectionCtr = 1; + + public TableOfContentsVisitor(String prefix) { + this.prefix = prefix; + } + + @Override + public List visit(Section section) { + final List list = new ArrayList<>(); + sectionCtr++; + list.add(prefix + sectionCtr + " " + section.getHeader()); + final TableOfContentsVisitor subVisitor = + new TableOfContentsVisitor(prefix + sectionCtr + "."); + for (TextComponent c : section.getContents()) + list.addAll(c.accept(subVisitor)); + return list; + } + +} \ No newline at end of file diff --git a/uebung08/src/doc/TextComponent.java b/uebung08/src/doc/TextComponent.java new file mode 100644 index 0000000..56f8453 --- /dev/null +++ b/uebung08/src/doc/TextComponent.java @@ -0,0 +1,7 @@ +package doc; + +public interface TextComponent { + int countWords(); + T accept(Visitor visitor); + +} diff --git a/uebung08/src/doc/ToTextVisitor.java b/uebung08/src/doc/ToTextVisitor.java new file mode 100644 index 0000000..26eb46a --- /dev/null +++ b/uebung08/src/doc/ToTextVisitor.java @@ -0,0 +1,38 @@ +package doc; + +class ToTextVisitor implements Visitor { + private final String prefix; + private int sectionCtr = 0; + private int imageCtr = 0; + + public ToTextVisitor() { + this(""); + } + + public ToTextVisitor(String prefix) { + this.prefix = prefix; + } + + @Override + public String visit(Paragraph section) { + return section.getText(); + } + + @Override + public String visit(Image image) { + imageCtr++; + final String num = prefix + imageCtr; + return "\nFig. " + num + ": " + image.getCaption(); + } + + @Override + public String visit(Section section) { + final StringBuilder b = new StringBuilder(); + sectionCtr++; + b.append(prefix).append(sectionCtr).append(" ").append(section.getHeader()); + final ToTextVisitor subVisitor = new ToTextVisitor(prefix + sectionCtr + "."); + for (TextComponent c : section.getContents()) + b.append("\n\n").append(c.accept(subVisitor)); + return b.toString(); + } +} diff --git a/uebung08/src/doc/Visitor.java b/uebung08/src/doc/Visitor.java new file mode 100644 index 0000000..5e730ee --- /dev/null +++ b/uebung08/src/doc/Visitor.java @@ -0,0 +1,10 @@ +package doc; + +public interface Visitor { + T visit(Image image); + T visit(Paragraph paragraph); + T visit(Section section); + + // semantisch falsch + //T visit(TextComponent c); +}