added importer for events of the Engelsburg in Erfurt
Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
This commit is contained in:
@@ -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";
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -21,12 +21,8 @@
|
|||||||
<table id="eventlist">
|
<table id="eventlist">
|
||||||
<tr class="head">
|
<tr class="head">
|
||||||
<th>Start
|
<th>Start
|
||||||
<div class="buttons">
|
<div class="buttons"></div>
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</th>
|
</th>
|
||||||
<th>End</th>
|
|
||||||
<th>Title</th>
|
<th>Title</th>
|
||||||
<th>Location</th>
|
<th>Location</th>
|
||||||
<th>Tags <span id="tag_selection"></span></th>
|
<th>Tags <span id="tag_selection"></span></th>
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ body {
|
|||||||
}
|
}
|
||||||
.index tr:hover td,
|
.index tr:hover td,
|
||||||
.index tr:hover th{
|
.index tr:hover th{
|
||||||
background-color: khaki;
|
background-color: darksalmon;
|
||||||
}
|
}
|
||||||
|
|
||||||
a {
|
a {
|
||||||
@@ -163,4 +163,10 @@ table#eventlist{
|
|||||||
|
|
||||||
.event h1{
|
.event h1{
|
||||||
margin-top: 40px;
|
margin-top: 40px;
|
||||||
|
}
|
||||||
|
td:nth-child(1) {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
tr:nth-child(4n) {
|
||||||
|
background: khaki;
|
||||||
}
|
}
|
||||||
@@ -24,7 +24,6 @@ function addRow(json){
|
|||||||
}
|
}
|
||||||
//addCell(row,json.id,json.id);
|
//addCell(row,json.id,json.id);
|
||||||
addCell(row,json.start,json.id);
|
addCell(row,json.start,json.id);
|
||||||
addCell(row,json.end,json.id);
|
|
||||||
addCell(row,json.title,json.id);
|
addCell(row,json.title,json.id);
|
||||||
addCell(row,json.location,json.id);
|
addCell(row,json.location,json.id);
|
||||||
row.appendChild(createTags(json.tags));
|
row.appendChild(createTags(json.tags));
|
||||||
|
|||||||
Reference in New Issue
Block a user