From 9395a399c11a82882fc0697a3321cb50cb6e30ff Mon Sep 17 00:00:00 2001 From: Dennis Reimann Date: Thu, 5 Oct 2023 09:47:49 +0200 Subject: [PATCH] Updates --- content/meta.json | 2 +- helpers.js | 9 +------- src/css/sections/meetups.css | 13 +---------- src/css/sections/team.css | 43 +++++----------------------------- src/episode.pug | 14 ----------- src/includes/mixins.pug | 30 ++++-------------------- src/includes/template.pug | 6 ++--- src/index.pug | 6 ++--- src/kurse.pug | 45 ------------------------------------ src/member.pug | 35 ++++++++++++++++++++++++++++ src/spenden.pug | 2 +- static/js/main.js | 16 ------------- tasks/fetch_feed.js | 20 ++++++---------- tasks/generate_pages.js | 12 ++++++---- 14 files changed, 71 insertions(+), 182 deletions(-) delete mode 100644 src/kurse.pug create mode 100644 src/member.pug diff --git a/content/meta.json b/content/meta.json index e83ffa7b7d7..7bc97650155 100644 --- a/content/meta.json +++ b/content/meta.json @@ -23,7 +23,7 @@ "nostr": "npub1qv02xpsc3lhxxx5x7xswf88w3u7kykft9ea7t78tz7ywxf7mxs9qrxujnc", "nostrTalk": "npub1talku5l4z88dys5eg8zvz8em2qxv8nfxxanjszzdsrmke0ssaekqqxvkq9", "ticker": [ - "Sende uns einen Shout-Out: 21.000 Sats und du bist dabei", + "Sende uns einen Shoutout: 21.000 Sats und du bist dabei", "\"Hosp oder top!\" ist Spiel des Jahres 2020", "Sei kein Holger, lass einen Fullnode laufen!", "Sei kein Vollknoten, komm in die Gruppe!", diff --git a/helpers.js b/helpers.js index 2f395ff215e..8cd0fd2eeec 100644 --- a/helpers.js +++ b/helpers.js @@ -37,17 +37,10 @@ const truncate = (str, wordCount) => { return [head, tail] } -const memberUrl = member => { - if (member.url) return member.url - else if (member.nostr) return `https://snort.social/p/${member.nostr}` - else if (member.twitter) return `https://twitter.com/${member.twitter}` -} - module.exports = { markdown: mdTransformer.render, replacements, slugify, stripHTML, - truncate, - memberUrl + truncate } diff --git a/src/css/sections/meetups.css b/src/css/sections/meetups.css index 06d73051984..2f1d679e0ad 100644 --- a/src/css/sections/meetups.css +++ b/src/css/sections/meetups.css @@ -15,8 +15,7 @@ margin-top: var(--space-xl); & img, - & .dot, - & .tooltip { + & .dot { display: none; } } @@ -80,16 +79,6 @@ animation-name: pulse; } } - - & .tooltip { - position: absolute; - z-index: 2; - min-width: 7rem; - font-size: .65rem; - padding: var(--space-xs) var(--space-m); - background: var(--color-overlay-bg); - border-radius: var(--border-radius); - } } } diff --git a/src/css/sections/team.css b/src/css/sections/team.css index 8ebb516b44a..dfbb22956e7 100644 --- a/src/css/sections/team.css +++ b/src/css/sections/team.css @@ -1,53 +1,22 @@ #team { - & .members { - display: grid; - grid-gap: var(--space-xl); - margin: 0; - list-style: none; - - @media (--up_to_M) { - grid-template-columns: 1fr; - } - @media (--M_and_up) { - grid-template-columns: 1fr 1fr; - } - } - & .member { - margin: 0; - padding: var(--space-xl); - border-radius: var(--space-l); - background-color: var(--color-card-bg); - transition-property: background-color; - transition-duration: var(--transition-duration-fast); + display: flex; + flex-wrap: wrap; + gap: var(--space-l); & img { - display: inline-block; border-radius: 50%; height: 100px; width: 100px; } - & header { - display: flex; - flex-wrap: wrap; - align-items: center; - justify-content: space-between; - margin-top: var(--space-l); - } - - & h2 { - font-size: var(--font-size-xl); - margin: 0 var(--space-l) var(--space-l) 0; - } - - & p { - margin-bottom: 0; + & .info { + flex: 1 0 17rem; + min-width: 10rem; } & .links { display: flex; - margin-bottom: var(--space-l); & a { color: var(--color-secondary); diff --git a/src/episode.pug b/src/episode.pug index ff1d200b91d..651b4ad371c 100644 --- a/src/episode.pug +++ b/src/episode.pug @@ -26,17 +26,3 @@ block main .content !=episode.content - - if episode.participants.length - h2 Teilnehmer - ul.partcipants - for participant in episode.participants - - const member = team[participant.toLowerCase()] - li - if member - a(href=memberUrl(member)) - img.avatar(src=assetPath(member.image || "/img/avatar.svg") alt=member.name) - span= member.name - else - img.avatar(src=assetPath("/img/avatar.svg") alt=participant) - span= participant diff --git a/src/includes/mixins.pug b/src/includes/mixins.pug index 585f923e8c3..a10ed444dc6 100644 --- a/src/includes/mixins.pug +++ b/src/includes/mixins.pug @@ -18,27 +18,6 @@ mixin categories(current) li: a(href="/podcast/on-tour/" class=(current === 'On Tour' && 'current')).on-tour On Tour li: a(href="/podcast/verschiedenes/" class=(current === 'Verschiedenes' && 'current')).verschiedenes Verschiedenes -mixin member(m) - li.member(id=m.name) - img(src=assetPath(m.image || "/img/avatar.svg") alt=m.name loading="lazy") - header - h2=m.name - .links - if m.nostr - a(href=`https://snort.social/p/${m.nostr}` target="_blank" rel="nofollow noopener" title=`${m.name} on Nostr`) - +sprite("nostr") - if m.twitter - a(href=`https://twitter.com/${m.twitter}` target="_blank" rel="nofollow noopener" title=`${m.name} on Twitter`) - +sprite("twitter") - if m.github - a(href=`https://github.com/${m.github}` target="_blank" rel="nofollow noopener" title=`${m.name} on GitHub`) - +sprite("github") - if m.url - a(href=m.url target="_blank" rel="nofollow noopener") - +sprite("url") - if m.text - !=markdown(m.text) - mixin map(id, markers) - const modalId = `modal-${id}` .vectorMap(id=id) @@ -127,16 +106,17 @@ mixin spende(d, trunc = false) mixin participants(ps, link) .participants - for participant in ps - - const member = team[participant.toLowerCase()] + for name in ps + - const id = name.toLowerCase() + - const member = team[id] if member if link - a(href=memberUrl(member)) + a(href=`/team/${slugify(id)}` title=member.name) img.avatar(src=assetPath(member.image || "/img/avatar.svg") alt=member.name) else img.avatar(src=assetPath(member.image || "/img/avatar.svg") alt=member.name) else - img.avatar(src=assetPath("/img/avatar.svg") alt=participant) + img.avatar(src=assetPath("/img/avatar.svg") alt=name) mixin episodeItem(e) article.episodeItem&attributes(attributes) diff --git a/src/includes/template.pug b/src/includes/template.pug index e92839846f6..8a78872af4b 100644 --- a/src/includes/template.pug +++ b/src/includes/template.pug @@ -27,17 +27,17 @@ html(lang="de") a(href="/meetups/" class=(navCurrent === 'meetups' && 'current')) Meetups a(href="https://portal.einundzwanzig.space/de/event/overview?l=de" rel="nofollow noopener") Events a(href="https://portal.einundzwanzig.space/de/school/city?l=de" rel="nofollow noopener") Kurse - a(href="/spenden/" class=(navCurrent === 'spenden' && 'current')) Spenden a(href="/telegram/" class=(navCurrent === 'telegram' && 'current')) Telegram a(href="/shops/" class=(navCurrent === 'shops' && 'current')) Shops a(href=site.meta.youtubeUrl target="_blank" rel="nofollow noopener") YouTube - a(href=site.meta.shoutoutUrl target="_blank" rel="nofollow noopener") Shout-Out + a(href=site.meta.shoutoutUrl target="_blank" rel="nofollow noopener") Shoutout .navItem a(href="#" onclick="return false;") Mehr .more + a(href="/verein/" class=(navCurrent === 'verein' && 'current')) Verein + a(href="/spenden/" class=(navCurrent === 'spenden' && 'current')) Spenden a(href="/media/" class=(navCurrent === 'media' && 'current')) Media a(href="/soundboard/" class=(navCurrent === 'soundboard' && 'current')) Sounds - a(href="/verein/" class=(navCurrent === 'verein' && 'current')) Verein a(href="/kontakt/" class=(navCurrent === 'kontakt' && 'current')) Kontakt button(type="button").theme +sprite("theme") diff --git a/src/index.pug b/src/index.pug index 9a335aa14b5..f48baf792b3 100644 --- a/src/index.pug +++ b/src/index.pug @@ -79,12 +79,12 @@ block main :markdown-it(html linkify typographer) ## 🗣 Sei laut, shout out! - Wenn du möchtest, dass wir im Podcast deinen "Shout-Out" vorlesen, dann bist du mit 21.000 Sats dabei! + Wenn du möchtest, dass wir im Podcast deinen Shoutout vorlesen, dann bist du mit 21.000 Sats dabei! Wir sammeln alle Einnahmen bis die 1.000.000 Sats voll sind. Dann lassen wir in unserer Telegram-Gruppe darüber abstimmen welches Bitcoin-Projekt aus Deutschland diese kostbaren Sats bekommen soll. - Wenn du also einen Shout-Out in unserem Podcast kaufst, [unterstützt](/spenden/) du damit auch ein Bitcoin Projekt. + Wenn du also einen Shoutout in unserem Podcast kaufst, [unterstützt](/spenden/) du damit auch ein Bitcoin Projekt. - a.button(href=site.meta.shoutoutUrl target="_blank" rel="nofollow noopener") Shout-Out senden + a.button(href=site.meta.shoutoutUrl target="_blank" rel="nofollow noopener") Shoutout senden section#youtube :markdown-it(html linkify typographer) diff --git a/src/kurse.pug b/src/kurse.pug deleted file mode 100644 index 03b942ef9aa..00000000000 --- a/src/kurse.pug +++ /dev/null @@ -1,45 +0,0 @@ -extends /template.pug - -block vars - - const title = 'Bitcoin-Kurse' - - const description = 'Eine Liste von Bitcoin-Kursen und Lehrveranstaltungen im D/A/CH-Raum.' - - const filterUnmapped = (list) => list.filter(kurs => !kurs.top || !kurs.left) - - const unmapped = filterUnmapped(kurse) - - const style = m => m.top && m.left ? `top:${m.top}%;left:${m.left}%;` : null - - const clss = m => m.top && m.left ? null : 'unmapped' - - let j = 0 - -block main - #kurse.wrap - section - h1= title - p= description - - :markdown-it(html linkify typographer) - Neue Kurse können gerne [per Pull Request](https://github.com/Einundzwanzig-Podcast/einundzwanzig.space/edit/master/content/kurse.json) hinzugefügt werden. - Hier gibt es ein [Video-Tutorial](https://www.youtube.com/watch?v=BNJc9LExEzU), wie ein neuer Pull Request erstellt werden kann. - Die Werte für `top/left` geben prozentual die Position des Ortes auf der Karte an. - - Außerdem findest du hier unsere [Präsentationsvorlage](https://github.com/Einundzwanzig-Podcast/slides) mit der du eine Ausgangsbasis für deine Vorträge hast. - - #map - h2 Lehrveranstaltungen im D/A/CH-Raum - ul.kurse - each m in kurse - li.official(class=clss(m) style=style(m)) - a(href=m.url target="_blank" rel="nofollow noopener") - .dot(style=`animation-delay:${((j*2000) + random(3000))}ms;animation-duration:${kurse.length*2}s;`) - = m.name - - j++ - - img#dach(src=assetPath('/img/dach.svg') alt="DE, AT, CH") - #tooltip.tooltip(hidden) - - if unmapped.length - #unmapped - h2 Weitere Kurse - ul.kurse - each m in unmapped - li(class=clss(m) style=style(m)) - a(href=m.url target="_blank" rel="nofollow noopener") - = m.name diff --git a/src/member.pug b/src/member.pug new file mode 100644 index 00000000000..17eaab360c2 --- /dev/null +++ b/src/member.pug @@ -0,0 +1,35 @@ +extends /template.pug + +block vars + - const title = member.name + - const description = member.text +block main + #team.wrap + section + h1= title + + .member + img(src=assetPath(member.image || "/img/avatar.svg") alt=member.name) + .info + if member.text + !=markdown(member.text) + .links + if member.nostr + a(href=`https://snort.social/p/${member.nostr}` target="_blank" rel="nofollow noopener" title=`${member.name} on Nostr`) + +sprite("nostr") + if member.twitter + a(href=`https://twitter.com/${member.twitter}` target="_blank" rel="nofollow noopener" title=`${member.name} on Twitter`) + +sprite("twitter") + if member.github + a(href=`https://github.com/${member.github}` target="_blank" rel="nofollow noopener" title=`${member.name} on GitHub`) + +sprite("github") + if member.url + a(href=member.url target="_blank" rel="nofollow noopener") + +sprite("url") + + if episodes.length + section + h2= `Episoden mit ${member.name}` + .episodes + each e in episodes + +episodeItem(e) diff --git a/src/spenden.pug b/src/spenden.pug index 8d8196ca1d4..d23d1b493ca 100644 --- a/src/spenden.pug +++ b/src/spenden.pug @@ -2,7 +2,7 @@ extends /template.pug block vars - const title = 'Spenden' - - const description = 'Die folgenden Projekte, Initiativen und Entwickler haben wir mit den Shout-Out-Beiträgen der Community bereits unterstützt.' + - const description = 'Die folgenden Projekte, Initiativen und Entwickler haben wir mit den Shoutout-Beiträgen der Community bereits unterstützt.' block main #spenden.wrap diff --git a/static/js/main.js b/static/js/main.js index 9ea4c3339d8..ace215413a3 100644 --- a/static/js/main.js +++ b/static/js/main.js @@ -161,20 +161,4 @@ document.addEventListener("DOMContentLoaded", () => { document.querySelectorAll('[data-modal]').forEach(modalLink => { modalLink.addEventListener('click', e => toggleModal(modalLink.dataset.modal)) }) - - // Map - const map = document.getElementById('map') - const mapImg = document.getElementById('dach') - const tooltip = document.getElementById('tooltip') - if (map && mapImg && tooltip) { - mapImg.onclick = e => { - const top = Math.round((e.offsetY / e.target.height) * 100) - 2 - const left = Math.round((e.offsetX / e.target.width) * 100) + 1 - console.log({ top, left }, map) - tooltip.innerText = `Top: ${top} / Left: ${left}` - tooltip.removeAttribute('hidden') - tooltip.style.top = `${top + 1}%` - tooltip.style.left = `${left}%` - } - } }) diff --git a/tasks/fetch_feed.js b/tasks/fetch_feed.js index 48cbb8c0505..f57b2dd65ab 100644 --- a/tasks/fetch_feed.js +++ b/tasks/fetch_feed.js @@ -1,6 +1,6 @@ const { writeFileSync } = require('fs') const { join, resolve } = require('path') -const { replacements, slugify, stripHTML, memberUrl } = require('../helpers') +const { replacements, slugify, stripHTML } = require('../helpers') const { masterFeedUrl, publicFeedUrl } = require('../content/meta.json') const team = require('../content/team.json') const request = require('sync-request') @@ -67,7 +67,7 @@ const parseEpisode = e => { const duration = e['itunes:duration'] const enclosure = e.enclosure.__attr const [, participantsString] = - firstLine.match(/(?:(?:von\sund\s)?mit\s)([^.]*)/i) || [] + firstLine.match(/[-–—]\s?(?:(?:von\sund\s)?mit\s)([^.]*)/i) || [] const participants = participantsString ? participantsString .replace(/(\s*,\s*|\s*und\s*|\s*&\s*)/gi, '%') @@ -107,15 +107,8 @@ const parseEpisode = e => { const feed = parser.parse(xml) const episodes = [] - const _noParticipants = [], - _noNode = [] - const members = [ - { name: 'Dennis', ...team.dennis.v4v }, - { name: 'Fab', ...team.fab.v4v }, - { name: 'Gigi', ...team.gigi.v4v }, - { name: 'Markus', ...team.markus.v4v }, - { name: 'Daniel', ...team.daniel.v4v } - ] + const _noParticipants = [], _noNode = [] + const members = [team.dennis, team.fab, team.gigi, team.markus, team.daniel] // remove invalid tag delete feed.rss.channel.author @@ -128,9 +121,10 @@ const parseEpisode = e => { }, 'podcast:valueRecipient': members.map(p => ({ __attr: { - ...p, + name: p.name, type: 'node', - split: Math.round(100 / members.length) + split: Math.round(100 / members.length), + ...p.v4v } })) } diff --git a/tasks/generate_pages.js b/tasks/generate_pages.js index ad2f5a9b73c..ec41a58fe95 100644 --- a/tasks/generate_pages.js +++ b/tasks/generate_pages.js @@ -1,14 +1,13 @@ const pug = require('pug') const { mkdirSync, writeFileSync } = require('fs') const { dirname, resolve } = require('path') - +const { slugify } = require('../helpers') const config = require('../pug.config') const site = require('../generated/site-data.json') const episodes = require('../generated/episodes.json') const spendenregister = require('../generated/spendenregister.json') const spendenuebersicht = require('../content/spendenuebersicht.json').reverse() const team = require('../content/team.json') -const kurse = require('../content/kurse.json') const shops = require('../content/shops.json') const soundboard = require('../content/soundboard.json') const adventskalender = require('../content/adventskalender-2022.json') @@ -44,7 +43,6 @@ renderPage('index', 'index', { navCurrent: 'index', currentEpisode: episodes[0], renderPage('podcast', 'podcast', { navCurrent: 'podcast', episodes: [...episodes], team }) renderPage('adventskalender', 'adventskalender', { adventskalender }) renderPage('meetups', 'meetups', { navCurrent: 'meetups', meetups: site.meetups }) -renderPage('kurse', 'kurse', { navCurrent: 'kurse', kurse }) renderPage('spenden', 'spenden', { navCurrent: 'spenden', spendenregister, spendenuebersicht }) renderPage('media', 'media', { navCurrent: 'media' }) renderPage('soundboard', 'soundboard', { navCurrent: 'soundboard', soundboard }) @@ -56,4 +54,10 @@ renderPage('datenschutz', 'datenschutz', { navCurrent: 'datenschutz' }) renderPage('adventskalender', 'adventskalender', { adventskalender }) episodes.forEach(episode => renderPage('episode', `podcast/${episode.slug}`, { navCurrent: 'podcast', episode, team })) -Object.keys(categories).forEach(category => renderPage('category', `podcast/${category}`, { navCurrent: 'podcast', category, categoryName: categories[category], episodes: episodes.filter(e => e.category === category), team })) +Object.keys(categories).forEach(category => renderPage('category', `podcast/${slugify(categories[category])}`, { navCurrent: 'podcast', category, categoryName: categories[category], episodes: episodes.filter(e => e.category === category), team })) +Object.keys(team).forEach(id => { + const member = team[id] + const alias = member.name.toLowerCase() + const eps = episodes.filter(e => e.participants.find(p => [id, alias].includes(p.toLowerCase()))) + renderPage('member', `team/${slugify(id)}`, { navCurrent: 'podcast', member, episodes: eps, team }) +})