Feature: add giggity support for SOTM
This commit is contained in:
parent
6235e23192
commit
70423773be
4 changed files with 132 additions and 38 deletions
|
@ -117,6 +117,7 @@
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"popupInFloatover": true,
|
||||||
"pointRendering": [
|
"pointRendering": [
|
||||||
{
|
{
|
||||||
"label": {
|
"label": {
|
||||||
|
@ -218,6 +219,14 @@
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"tagRenderings": [
|
"tagRenderings": [
|
||||||
|
{"id":"sotm-events",
|
||||||
|
"render": {
|
||||||
|
"special": {
|
||||||
|
"type": "giggity",
|
||||||
|
"giggityUrl":"https://sotm.osmz.ru/sotmeu2023.xml"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"images",
|
"images",
|
||||||
"level",
|
"level",
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,42 +1,14 @@
|
||||||
import { Utils } from "../../Utils"
|
import { Utils } from "../../Utils"
|
||||||
/** This code is autogenerated - do not edit. Edit ./assets/layers/usersettings/usersettings.json instead */
|
/** This code is autogenerated - do not edit. Edit ./assets/layers/usersettings/usersettings.json instead */
|
||||||
export class ThemeMetaTagging {
|
export class ThemeMetaTagging {
|
||||||
public static readonly themeName = "usersettings"
|
public static readonly themeName = "usersettings"
|
||||||
|
|
||||||
public metaTaggging_for_usersettings(feat: { properties: Record<string, string> }) {
|
public metaTaggging_for_usersettings(feat: {properties: Record<string, string>}) {
|
||||||
Utils.AddLazyProperty(feat.properties, "_mastodon_candidate_md", () =>
|
Utils.AddLazyProperty(feat.properties, '_mastodon_candidate_md', () => feat.properties._description.match(/\[[^\]]*\]\((.*(mastodon|en.osm.town).*)\).*/)?.at(1) )
|
||||||
feat.properties._description
|
Utils.AddLazyProperty(feat.properties, '_d', () => feat.properties._description?.replace(/</g,'<')?.replace(/>/g,'>') ?? '' )
|
||||||
.match(/\[[^\]]*\]\((.*(mastodon|en.osm.town).*)\).*/)
|
Utils.AddLazyProperty(feat.properties, '_mastodon_candidate_a', () => (feat => {const e = document.createElement('div');e.innerHTML = feat.properties._d;return Array.from(e.getElementsByTagName("a")).filter(a => a.href.match(/mastodon|en.osm.town/) !== null)[0]?.href }) (feat) )
|
||||||
?.at(1)
|
Utils.AddLazyProperty(feat.properties, '_mastodon_link', () => (feat => {const e = document.createElement('div');e.innerHTML = feat.properties._d;return Array.from(e.getElementsByTagName("a")).filter(a => a.getAttribute("rel")?.indexOf('me') >= 0)[0]?.href})(feat) )
|
||||||
)
|
Utils.AddLazyProperty(feat.properties, '_mastodon_candidate', () => feat.properties._mastodon_candidate_md ?? feat.properties._mastodon_candidate_a )
|
||||||
Utils.AddLazyProperty(
|
feat.properties['__current_backgroun'] = 'initial_value'
|
||||||
feat.properties,
|
}
|
||||||
"_d",
|
}
|
||||||
() => feat.properties._description?.replace(/</g, "<")?.replace(/>/g, ">") ?? ""
|
|
||||||
)
|
|
||||||
Utils.AddLazyProperty(feat.properties, "_mastodon_candidate_a", () =>
|
|
||||||
((feat) => {
|
|
||||||
const e = document.createElement("div")
|
|
||||||
e.innerHTML = feat.properties._d
|
|
||||||
return Array.from(e.getElementsByTagName("a")).filter(
|
|
||||||
(a) => a.href.match(/mastodon|en.osm.town/) !== null
|
|
||||||
)[0]?.href
|
|
||||||
})(feat)
|
|
||||||
)
|
|
||||||
Utils.AddLazyProperty(feat.properties, "_mastodon_link", () =>
|
|
||||||
((feat) => {
|
|
||||||
const e = document.createElement("div")
|
|
||||||
e.innerHTML = feat.properties._d
|
|
||||||
return Array.from(e.getElementsByTagName("a")).filter(
|
|
||||||
(a) => a.getAttribute("rel")?.indexOf("me") >= 0
|
|
||||||
)[0]?.href
|
|
||||||
})(feat)
|
|
||||||
)
|
|
||||||
Utils.AddLazyProperty(
|
|
||||||
feat.properties,
|
|
||||||
"_mastodon_candidate",
|
|
||||||
() => feat.properties._mastodon_candidate_md ?? feat.properties._mastodon_candidate_a
|
|
||||||
)
|
|
||||||
feat.properties["__current_backgroun"] = "initial_value"
|
|
||||||
}
|
|
||||||
}
|
|
89
src/UI/BigComponents/Giggity.svelte
Normal file
89
src/UI/BigComponents/Giggity.svelte
Normal file
|
@ -0,0 +1,89 @@
|
||||||
|
<script lang="ts">
|
||||||
|
|
||||||
|
import { Store, UIEventSource } from "../../Logic/UIEventSource";
|
||||||
|
import type { SpecialVisualizationState } from "../SpecialVisualization";
|
||||||
|
import { Utils } from "../../Utils";
|
||||||
|
import Loading from "../../assets/svg/Loading.svelte";
|
||||||
|
|
||||||
|
export let tags: Store<Record<string, string>>;
|
||||||
|
export let giggityUrl: string;
|
||||||
|
export let state: SpecialVisualizationState;
|
||||||
|
|
||||||
|
let name = $tags["name"];
|
||||||
|
let events: UIEventSource<{
|
||||||
|
date: Date,
|
||||||
|
start: string,
|
||||||
|
duration: string,
|
||||||
|
room: string,
|
||||||
|
slug: string,
|
||||||
|
url: string,
|
||||||
|
title: string,
|
||||||
|
track: string,
|
||||||
|
type: string,
|
||||||
|
language: string,
|
||||||
|
abstract: string,
|
||||||
|
description: string,
|
||||||
|
persons: string,
|
||||||
|
} []> = new UIEventSource(undefined);
|
||||||
|
|
||||||
|
async function loadXml() {
|
||||||
|
if (!name) {
|
||||||
|
console.log("Not fetching giggity events as name is", name, tags);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const xmlStr = await Utils.downloadAdvanced(giggityUrl);
|
||||||
|
console.log("Raw xml", xmlStr);
|
||||||
|
const parser = new DOMParser();
|
||||||
|
let doc = parser.parseFromString(xmlStr.content, "application/xml");
|
||||||
|
let days = Array.from(doc.documentElement.getElementsByTagName("day"));
|
||||||
|
let today = new Date().toISOString().split("T")[0];
|
||||||
|
const eventsToday = days.find(day => day.getAttribute("date") === today);
|
||||||
|
console.log("Events today", eventsToday);
|
||||||
|
const childs = ["date", "start", "duration", "room", "slug", "url", "title", "track", "type", "language", "abstract", "description", "persons"];
|
||||||
|
|
||||||
|
const now = new Date().toISOString().split("T")[1].substring(0, 5)
|
||||||
|
let eventsList = [];
|
||||||
|
for (const eventXml of Array.from(eventsToday.getElementsByTagName("event"))) {
|
||||||
|
const event: Record<string, string> = {};
|
||||||
|
for (const child of childs) {
|
||||||
|
const v = Array.from(eventXml.getElementsByTagName(child)).map(xml => xml.textContent).join("; ");
|
||||||
|
event[child] = v;
|
||||||
|
}
|
||||||
|
if(!name.startsWith(event.room)){
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if(now > event.start){
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
eventsList.push(event);
|
||||||
|
}
|
||||||
|
events.setData(eventsList);
|
||||||
|
}
|
||||||
|
|
||||||
|
loadXml();
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
{#if $events === undefined}
|
||||||
|
<Loading class="h-4">Loading giggity events from {giggityUrl}</Loading>
|
||||||
|
{:else}
|
||||||
|
<div>
|
||||||
|
<h2>Upcoming events</h2>
|
||||||
|
{#each $events as event}
|
||||||
|
<div class="flex flex-col m-2 border border-gray-200 border-dotted">
|
||||||
|
{#if event.url}
|
||||||
|
<h3><a href={event.url} target="_blank">{event.title}</a></h3>
|
||||||
|
|
||||||
|
{:else }
|
||||||
|
<h3>{event.title}</h3>
|
||||||
|
{/if}
|
||||||
|
<div><b>{event.start}</b></div>
|
||||||
|
<i>By {event.persons}</i>
|
||||||
|
<div>
|
||||||
|
{event.abstract}
|
||||||
|
</div>
|
||||||
|
{event.url}
|
||||||
|
</div>
|
||||||
|
{/each}
|
||||||
|
</div>
|
||||||
|
{/if}
|
|
@ -76,6 +76,7 @@ import StarsBarIcon from "./Reviews/StarsBarIcon.svelte"
|
||||||
import ReviewForm from "./Reviews/ReviewForm.svelte"
|
import ReviewForm from "./Reviews/ReviewForm.svelte"
|
||||||
import Questionbox from "./Popup/TagRendering/Questionbox.svelte"
|
import Questionbox from "./Popup/TagRendering/Questionbox.svelte"
|
||||||
import { TagUtils } from "../Logic/Tags/TagUtils"
|
import { TagUtils } from "../Logic/Tags/TagUtils"
|
||||||
|
import Giggity from "./BigComponents/Giggity.svelte"
|
||||||
|
|
||||||
class NearbyImageVis implements SpecialVisualization {
|
class NearbyImageVis implements SpecialVisualization {
|
||||||
// Class must be in SpecialVisualisations due to weird cyclical import that breaks the tests
|
// Class must be in SpecialVisualisations due to weird cyclical import that breaks the tests
|
||||||
|
@ -90,6 +91,7 @@ class NearbyImageVis implements SpecialVisualization {
|
||||||
"A component showing nearby images loaded from various online services such as Mapillary. In edit mode and when used on a feature, the user can select an image to add to the feature"
|
"A component showing nearby images loaded from various online services such as Mapillary. In edit mode and when used on a feature, the user can select an image to add to the feature"
|
||||||
funcName = "nearby_images"
|
funcName = "nearby_images"
|
||||||
needsUrls = NearbyImagesSearch.apiUrls
|
needsUrls = NearbyImagesSearch.apiUrls
|
||||||
|
|
||||||
constr(
|
constr(
|
||||||
state: SpecialVisualizationState,
|
state: SpecialVisualizationState,
|
||||||
tags: UIEventSource<Record<string, string>>,
|
tags: UIEventSource<Record<string, string>>,
|
||||||
|
@ -1447,6 +1449,28 @@ export default class SpecialVisualizations {
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
funcName: "giggity",
|
||||||
|
args: [
|
||||||
|
{
|
||||||
|
name: "giggityUrl",
|
||||||
|
required: true,
|
||||||
|
doc: "The URL of the giggity-XML",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
docs: "Shows events that are happening based on a Giggity URL",
|
||||||
|
needsUrls: ["*"],
|
||||||
|
constr(
|
||||||
|
state: SpecialVisualizationState,
|
||||||
|
tagSource: UIEventSource<Record<string, string>>,
|
||||||
|
argument: string[],
|
||||||
|
feature: Feature,
|
||||||
|
layer: LayerConfig
|
||||||
|
): BaseUIElement {
|
||||||
|
const giggityUrl = argument[0]
|
||||||
|
return new SvelteUIElement(Giggity, { tags: tagSource, state, giggityUrl })
|
||||||
|
},
|
||||||
|
},
|
||||||
]
|
]
|
||||||
|
|
||||||
specialVisualizations.push(new AutoApplyButton(specialVisualizations))
|
specialVisualizations.push(new AutoApplyButton(specialVisualizations))
|
||||||
|
|
Loading…
Reference in a new issue