diff --git a/de.srsoftware.cal.importer/src/main/java/de/srsoftware/cal/importer/erfurt/Eburg.java b/de.srsoftware.cal.importer/src/main/java/de/srsoftware/cal/importer/erfurt/Eburg.java new file mode 100644 index 0000000..0efd6f7 --- /dev/null +++ b/de.srsoftware.cal.importer/src/main/java/de/srsoftware/cal/importer/erfurt/Eburg.java @@ -0,0 +1,175 @@ +package de.srsoftware.cal.importer.erfurt; + +import de.srsoftware.cal.BaseImporter; +import de.srsoftware.cal.Util; +import de.srsoftware.cal.api.Coords; +import de.srsoftware.cal.api.Link; +import de.srsoftware.tools.Payload; +import de.srsoftware.tools.Result; +import de.srsoftware.tools.Tag; +import de.srsoftware.tools.TagFilter; + +import java.security.NoSuchAlgorithmException; +import java.time.LocalDate; +import java.time.LocalTime; +import java.util.List; +import java.util.Objects; +import java.util.function.Predicate; +import java.util.regex.Pattern; + +import static de.srsoftware.cal.Util.dump; +import static de.srsoftware.cal.Util.url; +import static de.srsoftware.tools.Error.error; +import static de.srsoftware.tools.Result.transform; +import static de.srsoftware.tools.Tag.CLASS; +import static de.srsoftware.tools.Tag.HREF; +import static de.srsoftware.tools.TagFilter.*; +import static java.lang.System.Logger.Level.INFO; + +public class Eburg extends BaseImporter { + private static final Coords DEFAULT_COORDS = new Coords(50.97840, 11.027004); + private static final Pattern DATE_PATTERN = Pattern.compile("(\\d\\d?)\\.\\s*(\\w+)\\W+(\\d\\d?)[.:](\\d\\d?)"); +public static final String DEFAULT_LOCATION = "Engelsburg, Allerheiligenstraße 20/21, 99084 Erfurt"; + public Eburg() throws NoSuchAlgorithmException { + super(); + } + + @Override + protected String baseUrl() { + return "https://engelsburg.club"; + } + + @Override + public String description() { + return "Importer für Events der Engelsburg in ERfurt"; + } + + @Override + protected Predicate extractAttachmentsFilter() { + return attributeHas(CLASS,"post-content"); + } + + @Override + protected Predicate extractDescriptionFilter() { + return attributeEquals(CLASS,"row"); + } + + @Override + protected Result extractCoords(Tag eventTag) { + return Payload.of(DEFAULT_COORDS); + } + + @Override + protected Predicate extractEndDateFilter() { + return null; + } + + @Override + protected Predicate extractEndTimeFilter() { + return null; + } + + @Override + protected Predicate extractEventTagFilter() { + return attributeHas(CLASS,"post-content"); + } + + @Override + protected Result> extractEventUrls(Result programPage) { + if (programPage.optional().isEmpty()) return transform(programPage); + var tag = programPage.optional().get(); + var list = tag.find(attributeHas(CLASS,"program-teaser")).stream() + .flatMap(teaser -> teaser.find(IS_ANCHOR).stream()) + .map(a -> a.get(HREF)) + .filter(Objects::nonNull) + .map(url -> url.contains("://") ? url : baseUrl()+url) + .filter(url -> url.startsWith(baseUrl())) + .distinct() + .toList(); + return Payload.of(list); + } + + protected List extractLinks(Tag appointmentTag) { + return super.extractLinks(appointmentTag).stream().filter(link -> !link.url().toString().contains("program-punkt")).toList(); + } + + @Override + protected Predicate extractLinksFilter() { + return attributeEquals(CLASS,"row"); + } + + @Override + protected Result extractLocation(Tag eventTag) { + var res = super.extractLocation(eventTag); + var loc = DEFAULT_LOCATION + (res.optional().isPresent() ? ", "+res.optional().get() : ""); + return Payload.of(loc); + } + + @Override + protected Predicate extractLocationFilter() { + return attributeHas(CLASS,"location"); + } + + @Override + protected Predicate extractStartDateFilter() { + return ofType("h4"); + } + + @Override + protected Predicate extractStartTimeFilter() { + return ofType("h4"); + } + + @Override + protected List extractTags(Tag eventTag) { + return List.of("Engelsburg","Erfurt"); + } + + @Override + protected Predicate extractTitleFilter() { + return ofType("h1"); + } + + @Override + protected Result parseEndDate(String string) { + return null; + } + + @Override + protected Result parseEndTime(String string) { + return null; + } + + @Override + protected Result parseStartDate(String string) { + var matcher = DATE_PATTERN.matcher(string); + if (matcher.find()){ + int day = Integer.parseInt(matcher.group(1)); + var m = Util.toNumericMonth(matcher.group(2)); + if (m.optional().isEmpty()) return transform(m); + int month = m.optional().get(); + var now = LocalDate.now(); + int year = now.getYear(); + var start = LocalDate.of(year,month,day); + if (start.isBefore(now)) start = start.withYear(year+1); + return Payload.of(start); + } + return error("Failed to parse date from %s",string); + } + + @Override + protected Result parseStartTime(String string) { + var matcher = DATE_PATTERN.matcher(string); + if (matcher.find()){ + int hour = Integer.parseInt(matcher.group(3)); + int min = Integer.parseInt(matcher.group(4)); + return Payload.of(LocalTime.of(hour,min)); + } + return error("Failed to parse time from %s",string); + } + + @Override + protected String programURL() { + return baseUrl()+"/programm"; + } +} diff --git a/de.srsoftware.cal.web/src/main/resources/index.html b/de.srsoftware.cal.web/src/main/resources/index.html index 7fc4610..e3fb0e9 100644 --- a/de.srsoftware.cal.web/src/main/resources/index.html +++ b/de.srsoftware.cal.web/src/main/resources/index.html @@ -21,12 +21,8 @@ - diff --git a/de.srsoftware.cal.web/src/main/resources/occ.css b/de.srsoftware.cal.web/src/main/resources/occ.css index 62c75ed..9d96bce 100644 --- a/de.srsoftware.cal.web/src/main/resources/occ.css +++ b/de.srsoftware.cal.web/src/main/resources/occ.css @@ -3,7 +3,7 @@ body { } .index tr:hover td, .index tr:hover th{ - background-color: khaki; + background-color: darksalmon; } a { @@ -163,4 +163,10 @@ table#eventlist{ .event h1{ margin-top: 40px; +} +td:nth-child(1) { + text-align: center; +} +tr:nth-child(4n) { + background: khaki; } \ No newline at end of file diff --git a/de.srsoftware.cal.web/src/main/resources/script/index.js b/de.srsoftware.cal.web/src/main/resources/script/index.js index 4b564c8..e5f8140 100644 --- a/de.srsoftware.cal.web/src/main/resources/script/index.js +++ b/de.srsoftware.cal.web/src/main/resources/script/index.js @@ -24,7 +24,6 @@ function addRow(json){ } //addCell(row,json.id,json.id); addCell(row,json.start,json.id); - addCell(row,json.end,json.id); addCell(row,json.title,json.id); addCell(row,json.location,json.id); row.appendChild(createTags(json.tags));
Start -
- -
- +
End Title Location Tags