Browse Source

added importer for events of the Engelsburg in Erfurt

Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
main
Stephan Richter 6 months ago
parent
commit
0d1215558e
  1. 175
      de.srsoftware.cal.importer/src/main/java/de/srsoftware/cal/importer/erfurt/Eburg.java
  2. 6
      de.srsoftware.cal.web/src/main/resources/index.html
  3. 8
      de.srsoftware.cal.web/src/main/resources/occ.css
  4. 1
      de.srsoftware.cal.web/src/main/resources/script/index.js

175
de.srsoftware.cal.importer/src/main/java/de/srsoftware/cal/importer/erfurt/Eburg.java

@ -0,0 +1,175 @@ @@ -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<Tag> extractAttachmentsFilter() {
return attributeHas(CLASS,"post-content");
}
@Override
protected Predicate<Tag> extractDescriptionFilter() {
return attributeEquals(CLASS,"row");
}
@Override
protected Result<Coords> extractCoords(Tag eventTag) {
return Payload.of(DEFAULT_COORDS);
}
@Override
protected Predicate<Tag> extractEndDateFilter() {
return null;
}
@Override
protected Predicate<Tag> extractEndTimeFilter() {
return null;
}
@Override
protected Predicate<Tag> extractEventTagFilter() {
return attributeHas(CLASS,"post-content");
}
@Override
protected Result<List<String>> extractEventUrls(Result<Tag> 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<Link> extractLinks(Tag appointmentTag) {
return super.extractLinks(appointmentTag).stream().filter(link -> !link.url().toString().contains("program-punkt")).toList();
}
@Override
protected Predicate<Tag> extractLinksFilter() {
return attributeEquals(CLASS,"row");
}
@Override
protected Result<String> 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<Tag> extractLocationFilter() {
return attributeHas(CLASS,"location");
}
@Override
protected Predicate<Tag> extractStartDateFilter() {
return ofType("h4");
}
@Override
protected Predicate<Tag> extractStartTimeFilter() {
return ofType("h4");
}
@Override
protected List<String> extractTags(Tag eventTag) {
return List.of("Engelsburg","Erfurt");
}
@Override
protected Predicate<Tag> extractTitleFilter() {
return ofType("h1");
}
@Override
protected Result<LocalDate> parseEndDate(String string) {
return null;
}
@Override
protected Result<LocalTime> parseEndTime(String string) {
return null;
}
@Override
protected Result<LocalDate> 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<LocalTime> 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";
}
}

6
de.srsoftware.cal.web/src/main/resources/index.html

@ -21,12 +21,8 @@ @@ -21,12 +21,8 @@
<table id="eventlist">
<tr class="head">
<th>Start
<div class="buttons">
</div>
<div class="buttons"></div>
</th>
<th>End</th>
<th>Title</th>
<th>Location</th>
<th>Tags <span id="tag_selection"></span></th>

8
de.srsoftware.cal.web/src/main/resources/occ.css

@ -3,7 +3,7 @@ body { @@ -3,7 +3,7 @@ body {
}
.index tr:hover td,
.index tr:hover th{
background-color: khaki;
background-color: darksalmon;
}
a {
@ -164,3 +164,9 @@ table#eventlist{ @@ -164,3 +164,9 @@ table#eventlist{
.event h1{
margin-top: 40px;
}
td:nth-child(1) {
text-align: center;
}
tr:nth-child(4n) {
background: khaki;
}

1
de.srsoftware.cal.web/src/main/resources/script/index.js

@ -24,7 +24,6 @@ function addRow(json){ @@ -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));

Loading…
Cancel
Save