Compare commits

...

17 Commits

Author SHA1 Message Date
c1563c6efe
Merge remote-tracking branch 'origin/main' into drone_deployment
All checks were successful
continuous-integration/drone/pr Build is passing
2022-08-24 23:06:56 +02:00
bfe8f740f8 Merge pull request 'podcast_s03e01' (#127) from podcast_s03e01 into main
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #127
2022-08-24 22:44:31 +02:00
2213bd2d35 fix: Custom publication messages for podcasts (still not blog posts).
All checks were successful
continuous-integration/drone/pr Build is passing
2022-08-24 22:43:12 +02:00
a6fb09985b fix: Changed naming in podcast makros because a podcast is not a blog. 2022-08-24 22:43:12 +02:00
fdf832f43f feat: Added audio files for new podcast episode. 2022-08-24 22:43:12 +02:00
2304801bb8 fix: Removed space from podcast folder name. 2022-08-24 22:43:12 +02:00
5f59bdcfff fix: Fixed doubled entry due to typo. 2022-08-24 22:43:12 +02:00
b0af165228 Add shownotes for S03E01 2022-08-24 22:43:12 +02:00
5c197f2299 Merge pull request '#125_fehler_im_kontaktformular' (#126) from #125_fehler_im_kontaktformular into main
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #126
2022-08-24 22:41:21 +02:00
ddc89d5bd6 fix: Don't load contact_form.js and contact_from_toggle.js on all pages.
All checks were successful
continuous-integration/drone/pr Build is passing
2022-08-24 20:05:02 +02:00
3b14c01591
Only load or do things if necessary
All checks were successful
continuous-integration/drone/pr Build is passing
2022-08-24 15:27:20 +02:00
0882053a42
Handle request errors 2022-08-24 15:15:08 +02:00
f9229b5998
Make ajax URL relative to webroot and variable name more unique 2022-08-24 15:13:39 +02:00
42b9b3a62e
Set the return path via the envelope sender
All checks were successful
continuous-integration/drone/pr Build is passing
2022-08-24 14:35:01 +02:00
590cbfbb65 feat: Type hinting all the way.
All checks were successful
continuous-integration/drone/pr Build is passing
2022-08-24 08:03:54 +02:00
aebb53e5c1 fix: Fixed undefined variables error. 2022-08-24 08:03:27 +02:00
7df4a24abd fix: Fixed broken replacement for newlines. 2022-08-24 07:59:58 +02:00
12 changed files with 139 additions and 61 deletions

View File

@ -1,29 +1,45 @@
const ajaxUrl = '../php/contact_form.php'; const contactFormAjaxUrl = '/php/contact_form.php';
const contact_form = document.getElementsByClassName('content__contact_form')[0];
const subject = document.getElementsByClassName('contact_form__subject')[0];
const message = document.getElementsByClassName('contact_form__message')[0];
const name = document.getElementsByClassName('contact_form__name')[0];
const email = document.getElementsByClassName('contact_form__email')[0];
const captcha = document.getElementsByClassName('contact_form__captcha')[0];
const now = (new Date().getTime()/1000).toFixed();
const feedback = document.getElementsByClassName('contact_form__feedback')[0];
window.addEventListener('DOMContentLoaded', function(event) { window.addEventListener('DOMContentLoaded', function() {
const contact_form = document.getElementsByClassName('content__contact_form')[0];
if (contact_form) {
contact_form.addEventListener('submit', wtf_submitContactForm, false);
wtf_startContactFormSession();
}
});
function wtf_startContactFormSession() {
let formData = new FormData(); let formData = new FormData();
formData.append('action', 'start_session'); formData.append('action', 'start_session');
fetch(ajaxUrl, { fetch(contactFormAjaxUrl, {
method: 'POST', method: 'POST',
mode: 'same-origin', mode: 'same-origin',
body: formData, body: formData,
}) })
.then(response => response.json()) .then(response => {
if (!response.ok) {
throw new Error('Response was not OK');
}
return response.json();
})
.then(json => { .then(json => {
console.log(json); console.log(json);
}) })
}); .catch(error => {
console.error('Could not start the session:', error);
});
}
contact_form.addEventListener('submit', function(event) { function wtf_submitContactForm(event) {
event.preventDefault(); event.preventDefault();
const subject = document.getElementsByClassName('contact_form__subject')[0];
const message = document.getElementsByClassName('contact_form__message')[0];
const name = document.getElementsByClassName('contact_form__name')[0];
const email = document.getElementsByClassName('contact_form__email')[0];
const captcha = document.getElementsByClassName('contact_form__captcha')[0];
let formData = new FormData(); let formData = new FormData();
formData.append('action', 'handle_form'); formData.append('action', 'handle_form');
formData.append('subject', subject.value); formData.append('subject', subject.value);
@ -39,13 +55,14 @@ contact_form.addEventListener('submit', function(event) {
return; return;
} }
fetch(ajaxUrl, { fetch(contactFormAjaxUrl, {
method: 'POST', method: 'POST',
mode: 'same-origin', mode: 'same-origin',
body: formData, body: formData,
}) })
.then(response => response.json()) .then(response => response.json())
.then(json => { .then(json => {
const feedback = document.getElementsByClassName('contact_form__feedback')[0];
console.log(json); console.log(json);
if (json.errors) { if (json.errors) {
feedback.classList.remove('--success'); feedback.classList.remove('--success');
@ -75,4 +92,4 @@ contact_form.addEventListener('submit', function(event) {
} }
}) })
.catch(error => console.log(error)); .catch(error => console.log(error));
}, false); }

View File

@ -1,5 +1,7 @@
/* Unhide contact form if JS is enabled */ /* Unhide contact form if JS is enabled */
window.addEventListener('DOMContentLoaded', (event) => { window.addEventListener('DOMContentLoaded', (event) => {
const contact_form_wrapper = document.getElementsByClassName('content__contact_form_wrapper')[0]; const contact_form_wrapper = document.getElementsByClassName('content__contact_form_wrapper')[0];
if (contact_form_wrapper) {
contact_form_wrapper.style.setProperty('display', 'block'); contact_form_wrapper.style.setProperty('display', 'block');
}
}); });

View File

@ -6,17 +6,16 @@ function sanitize_text(string $name, string $type) {
'text' => FILTER_SANITIZE_SPECIAL_CHARS, 'text' => FILTER_SANITIZE_SPECIAL_CHARS,
'email' => FILTER_SANITIZE_EMAIL, 'email' => FILTER_SANITIZE_EMAIL,
); );
$text = trim($text); $text = filter_var(trim($_POST[$name]), $filters[$type]);
$text = filter_var($_POST[$name], $filters[$type]);
$text = stripslashes($text); $text = stripslashes($text);
return $text; return $text;
} }
function prepare_message_body($message) { function prepare_message_body(string $message, string $name) {
// Replace HTML-Entities with actual carriage returns and line feeds // Replace HTML-Entities with actual carriage returns and line feeds
$message = str_replace("
", "\r", $message); $message = str_replace("
", "\r", $message);
$message = str_replace("
", "\r", $message); $message = str_replace("
", "\n", $message);
// Ensure line breaks via carriage return + line feed // Ensure line breaks via carriage return + line feed
$message = str_replace("\r\n", "\n", $message); $message = str_replace("\r\n", "\n", $message);
@ -34,22 +33,30 @@ function prepare_message_body($message) {
* mail(): Braucht auf dem Server einen korrekt konfigurierten Mailserver * mail(): Braucht auf dem Server einen korrekt konfigurierten Mailserver
* phpmailer: Bibliothek, der per Composer installiert wird. Tut ganz gut mit SMTP. * phpmailer: Bibliothek, der per Composer installiert wird. Tut ganz gut mit SMTP.
*/ */
function send_message_to_office($subject, $message, $name, $email) { function send_message_to_office(string $subject, string $message, string $name, string $email) {
$returnPath = filter_var(getenv('WTF_RETURN_PATH'), FILTER_VALIDATE_EMAIL);
$to = filter_var(getenv('WTF_CONTACT_TO'), FILTER_VALIDATE_EMAIL);
if (!$returnPath || !$to) {
error_log('Address for "To" or "Return-Path" is invalid');
return false;
}
return mail( return mail(
getenv('WTF_CONTACT_TO'), $to,
"=?UTF-8?B?" . base64_encode($subject) . "?=", "=?UTF-8?B?" . base64_encode($subject) . "?=",
prepare_message_body($message), prepare_message_body($message, $name),
$additional_headers = array( array(
"From" => getenv('WTF_CONTACT_FROM'), "From" => getenv('WTF_CONTACT_FROM'),
"Reply-To" => $email, "Reply-To" => $email,
"Return-Path" => getenv('WTF_RETURN_PATH'),
"Content-Type" => "text/plain; charset=utf-8", "Content-Type" => "text/plain; charset=utf-8",
"Content-Transfer-Encoding" => "base64", "Content-Transfer-Encoding" => "base64",
), ),
"-f $returnPath"
); );
} }
function send_response($response_data) { function send_response(array $response_data) {
$json = json_encode($response_data); $json = json_encode($response_data);
if ($json === false) { if ($json === false) {
// Avoid echo of empty string (which is invalid JSON), and // Avoid echo of empty string (which is invalid JSON), and

View File

@ -10,7 +10,7 @@ season: 2
--- ---
title: WTF eG Podcast S02E06 title: WTF eG Podcast S02E06
--- ---
pocastogg: wtf-s02e06.ogg podcastogg: wtf-s02e06.ogg
--- ---
mp3leng: 23354534 mp3leng: 23354534
--- ---
@ -58,5 +58,3 @@ Herzlich Willkommen!
Achja: Historisches zum Projekt auf media.ccc.de unter dem Stichwort "Hacker eG" Achja: Historisches zum Projekt auf media.ccc.de unter dem Stichwort "Hacker eG"
--- ---
authors: ajuvo/fuchsstein/LittleAlex authors: ajuvo/fuchsstein/LittleAlex
---
podcastogg: wtf-s02e06.ogg

BIN
content/podcast/wtf-s03-e01/WTF_S03E01.mp3 (Stored with Git LFS) Normal file

Binary file not shown.

BIN
content/podcast/wtf-s03-e01/WTF_S03E01.ogg (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,48 @@
authors: Nathan, Vollkorn
---
feed_shownotes:
<h2>S03E01 — Vollkorn über ART OFF Hamburg</h2>
<p>WTF? Hallo und herzlich willkommen zur dritten Staffel vom WTF-Podcast. Mit der dritten Staffel möchten wir wegkommen vom Rundbrief für Genoss*innen und hin zu einem richtigen Podcast.</p>
<p>Wir wollen uns nach außen öffnen. Projekte vorstellen. Zeigen, was geht. Und wir wollen uns auch verkaufen. Kund*innen gewinnen. Wie das geht? Keine Ahnung, aber versuchen wir es so: Wir zeigen, was wir können und ihr denkt vor Projekten an uns. Kommt auf uns zu. Sprecht uns an. Gemeinsam finden wir zusammen. Deal?</p>
<p>In dieser Folge geht es um Vollkorn — so sein Spitzname. Er hat irgendwann mal Informatik studiert, ist beim CCC aktiv und macht auch beruflich irgendwas mit IT. Er wollte aber neben seinem Hauptjob auch mal eine Mark fuffzig nebenbei verdienen. Als <a href="https://art-off-hamburg.de/">ART OFF Hamburg</a>, eine Initiative freier Kunstorte in Hamburg, ihn anfragte, ob er nicht mal eben eine neue, kleine, statische Webseite bauen könnte, hatte er zwar Lust auf das Projekt, aber eben nicht auf den Papierkram.</p>
<p>Und da kam die WTF ins Spiel: Die Genossenschaft schrieb Angebot und Rechnung, Vollkorn baute die Webseite mit <a href="https://gohugo.io/">Hugo</a>, die Künstler*innen bekamen ihre Webseite. Alle glücklich, alle zufrieden.</p>
<p>Mitglieder der WTF erreichen Vollkorn über das <a href="https://ki.wtf-eg.de">Kompetenzinventar</a> und das <a href="https://forum.wtf-eg.de">Forum</a>. Er ist als <a href="https://twitter.com/vollkorn1982">@vollkorn1982 auf Twitter</a> und <a href="https://chaos.social/@vollkorn">@vollkorn@chaos.social</a>.</p>
<p>Vielen Dank für das Interesse und eure Zeit! Für Fragen und Feedback zum Podcast schickt gerne eine E-Mail an <a href="mailto:podcast@wtf-eg.de">podcast@wtf-eg.de</a>. Nathan erreicht ihr als <a href="https://twitter.com/zeitschlag">@zeitschlag auf Twitter</a> oder als <a href="https://chaos.social/@zeitschlag">@zeitschlag@chaos.social auf Mastodon</a> Alle weiteren Informationen zur Genossenschaft gibt es im Internet unter <a href="https://wtf-eg.de">wtf-eg.de</a>. </p>
---
podcast_shownotes:
WTF? Hallo und herzlich willkommen zur dritten Staffel vom WTF-Podcast. Mit der dritten Staffel möchten wir wegkommen vom Rundbrief für Genoss\*innen und hin zu einem richtigen Podcast.
Wir wollen uns nach außen öffnen. Projekte vorstellen. Zeigen, was geht. Und wir wollen uns auch verkaufen. Kund\*innen gewinnen. Wie das geht? Keine Ahnung, aber versuchen wir es so: Wir zeigen, was wir können und ihr denkt vor Projekten an uns. Kommt auf uns zu. Sprecht uns an. Gemeinsam finden wir zusammen. Deal?
In dieser Folge geht es um Vollkorn — so sein Spitzname. Er hat irgendwann mal Informatik studiert, ist beim CCC aktiv und macht auch beruflich irgendwas mit IT. Er wollte aber neben seinem Hauptjob auch mal eine Mark fuffzig nebenbei verdienen. Als [ART OFF Hamburg](https://art-off-hamburg.de/), eine Initiative freier Kunstorte in Hamburg, ihn anfragte, ob er nicht mal eben eine neue, kleine, statische Webseite bauen könnte, hatte er zwar Lust auf das Projekt, aber eben nicht auf den Papierkram.
Und da kam die WTF ins Spiel: Die Genossenschaft schrieb Angebot und Rechnung, Vollkorn baute die Webseite mit [Hugo](https://gohugo.io/), die Künstler\*innen bekamen ihre Webseite. Alle glücklich, alle zufrieden.
Mitglieder der WTF erreichen Vollkorn über das [Kompetenzinventar](https://ki.wtf-eg.de) und das [Forum](https://forum.wtf-eg.de). Er ist als [@vollkorn1982 auf Twitter](https://twitter.com/vollkorn1982) und [@vollkorn@chaos.social](https://chaos.social/@vollkorn).
Vielen Dank für das Interesse und eure Zeit! Für Fragen und Feedback zum Podcast schickt gerne eine E-Mail an [podcast@wtf-eg.de](mailto:podcast@wtf-eg.de). Nathan erreicht ihr als [@zeitschlag auf Twitter](https://twitter.com/zeitschlag) oder als [@zeitschlag@chaos.social auf Mastodon](https://chaos.social/@zeitschlag) Alle weiteren Informationen zur Genossenschaft gibt es im Internet unter [wtf-eg.de](https://wtf-eg.de).
---
podcast_teaser: In der ersten Folge der dritten Staffel spricht Nathan mit Vollkorn über die statische Webseite für eine Künstler*innen-Initiative und wie das gelaufen ist.
---
pub_date: 2022-08-24
---
title: S03E01 — Vollkorn über ART OFF Hamburg
---
podcasttitle: S03E01 — Vollkorn über ART OFF Hamburg
---
season: 3
---
episode: 1
---
duration: 1026
---
mp3leng: 16456030
---
podcastmp3: WTF_S03E01.mp3
---
oggleng: 16820322
---
pocastogg: WTF_S03E01.ogg

View File

@ -51,7 +51,7 @@
</h3> </h3>
<hr class="-odd"> <hr class="-odd">
<p class="content__meat"> <p class="content__meat">
<i>geschrieben von {{ episode.authors }} am {{ episode.pub_date }}</i> <i>aufgenommen von {{ episode.authors }}, veröffentlicht am {{ episode.pub_date }}</i>
</p> </p>
<p> <p>
{{ episode.podcast_teaser }} {{ episode.podcast_teaser }}

View File

@ -63,7 +63,7 @@ __ ____________________
{% if 'manifest.json'|asseturl is defined -%} {% if 'manifest.json'|asseturl is defined -%}
<link rel="manifest" href="{{ 'manifest.json'|asseturl }}"> <link rel="manifest" href="{{ 'manifest.json'|asseturl }}">
{%- endif %} {%- endif %}
{% if '/js/contact_form_toggle.js'|asseturl is defined -%} {% if '/js/contact_form_toggle.js'|asseturl is defined and this.title == 'Kontakt' -%}
<script type="text/javascript" src="{{ '/js/contact_form_toggle.js'|asseturl }}"></script> <script type="text/javascript" src="{{ '/js/contact_form_toggle.js'|asseturl }}"></script>
{%- endif %} {%- endif %}
</head> </head>
@ -131,7 +131,7 @@ __ ____________________
{%- if '/js/nav_toggle.js'|asseturl is defined -%} {%- if '/js/nav_toggle.js'|asseturl is defined -%}
<script type="text/javascript" src="{{ '/js/nav_toggle.js'|asseturl }}"></script> <script type="text/javascript" src="{{ '/js/nav_toggle.js'|asseturl }}"></script>
{%- endif %} {%- endif %}
{% if '/js/contact_form_toggle.js'|asseturl is defined -%} {% if '/js/contact_form_toggle.js'|asseturl is defined and this.title == 'Kontakt' -%}
<script type="text/javascript" src="{{ '/js/contact_form.js'|asseturl }}"></script> <script type="text/javascript" src="{{ '/js/contact_form.js'|asseturl }}"></script>
{%- endif %} {%- endif %}
</body> </body>

View File

@ -1,23 +1,23 @@
{% macro render_blog_post(post, from_index=false, section_class='-odd') %} {% macro render_podcast_episode(episode, from_index=false, section_class='-odd') %}
<section class="content {{ section_class }}"> <section class="content {{ section_class }}">
<div class="content__box -heading"> <div class="content__box -heading">
<div class="content__inner_box"> <div class="content__inner_box">
{% if from_index %} {% if from_index %}
<h2><a class="content__blog_link {{ section_class }}" href="{{ post|url }}">{{ post.title }}</a></h2> <h2><a class="content__blog_link {{ section_class }}" href="{{ episode|url }}">{{ episode.title }}</a></h2>
{% else %} {% else %}
<h2>{{ post.title }}</h2> <h2>{{ episode.title }}</h2>
{% endif %} {% endif %}
<hr class="{{ section_class }}"> <hr class="{{ section_class }}">
<p class="content__meta"> <p class="content__meta">
<i>geschrieben von {{ post.authors }} am {{ post.pub_date }}</i> <i>aufgenommen von {{ episode.authors }}, veröffentlicht am {{ episode.pub_date }}</i>
</p> </p>
</div> </div>
</div> </div>
<div class="content__half_box"> <div class="content__half_box">
<div class="content__inner_half_box"> <div class="content__inner_half_box">
{{ post.podcast_teaser }} {{ episode.podcast_teaser }}
{% if not from_index %} {% if not from_index %}
{{ post.podcast_shownotes }} {{ episode.podcast_shownotes }}
{% endif %} {% endif %}
</div> </div>
@ -25,44 +25,44 @@
<div class="content__inner_half_box"> <div class="content__inner_half_box">
<div class="pod_ctrl_box"> <div class="pod_ctrl_box">
<audio controls class="pod_ctrl_box__audio_controls"> <audio controls class="pod_ctrl_box__audio_controls">
{% if post.podcastogg -%} {% if episode.podcastogg -%}
<source src="{{ post|url(alt='de')}}{{ post.podcastogg }}" type="audio/ogg"> <source src="{{ episode|url(alt='de')}}{{ episode.podcastogg }}" type="audio/ogg">
{%- endif %} {%- endif %}
{% if post.podcastmp3 -%} {% if episode.podcastmp3 -%}
<source src="{{ post|url(alt='de') }}{{ post.podcastmp3 }}" type="audio/mpeg"> <source src="{{ episode|url(alt='de') }}{{ episode.podcastmp3 }}" type="audio/mpeg">
{%- endif %} {%- endif %}
Your browser does not support the audio element. Your browser does not support the audio element.
</audio> </audio>
<div class="pod_ctrl_box__button"> <div class="pod_ctrl_box__button">
<a class="pod_ctrl_box__button_link" href="{{ post|url }}" >Podcastfolge durchst&ouml;bern</a> <a class="pod_ctrl_box__button_link" href="{{ episode|url }}" >Podcastfolge durchst&ouml;bern</a>
</div> </div>
</div> </div>
{% else -%} {% else -%}
<div class="content__inner_half_box"> <div class="content__inner_half_box">
<audio controls> <audio controls>
{% if post.podcastogg -%} {% if episode.podcastogg -%}
<source src="{{ post.podcastogg|url(alt='de') }}" type="audio/ogg"> <source src="{{ episode.podcastogg|url(alt='de') }}" type="audio/ogg">
{%- endif %} {%- endif %}
{% if post.podcastmp3 %} {% if episode.podcastmp3 %}
<source src="{{ post.podcastmp3|url(alt='de') }}" type="audio/mpeg"> <source src="{{ episode.podcastmp3|url(alt='de') }}" type="audio/mpeg">
{%- endif %} {%- endif %}
Your browser does not support the audio element. Your browser does not support the audio element.
</audio> </audio>
<br/> <br/>
{% if post.podcastmp3 -%} {% if episode.podcastmp3 -%}
<a class="" href="{{ post.podcastmp3|url(alt='de') }}" download> <a class="" href="{{ episode.podcastmp3|url(alt='de') }}" download>
{%- if post.podcasttitle -%} {%- if episode.podcasttitle -%}
{{ post.podcasttitle }} {{ episode.podcasttitle }}
{%- else -%} {%- else -%}
Download Folge Download Folge
{%- endif -%} {%- endif -%}
{{ ' als MP3' }} {{ ' als MP3' }}
</a> </a>
{% endif %} {% endif %}
{% if post.podcastogg -%} {% if episode.podcastogg -%}
<a class="" href="{{ post.podcastogg|url(alt='de') }}" download> <a class="" href="{{ episode.podcastogg|url(alt='de') }}" download>
{%- if post.podcasttitle -%} {%- if episode.podcasttitle -%}
{{ post.podcasttitle }} {{ episode.podcasttitle }}
{%- else -%} {%- else -%}
Download Folge Download Folge
{%- endif -%} {%- endif -%}

View File

@ -1,5 +1,5 @@
{% extends "header_slim.html" %} {% extends "header_slim.html" %}
{% from "macros/podcast.html" import render_blog_post %} {% from "macros/podcast.html" import render_podcast_episode %}
{%- block title -%}{{ this.title }}{%- endblock -%} {%- block title -%}{{ this.title }}{%- endblock -%}
{%- block meta_description -%} {%- block meta_description -%}
{%- if this.meta_description is defined and this.meta_description != "" -%} {%- if this.meta_description is defined and this.meta_description != "" -%}
@ -14,5 +14,5 @@
<h1>{{ this.title }}</h1> <h1>{{ this.title }}</h1>
</div> </div>
</div> </div>
{{ render_blog_post(this) }} {{ render_podcast_episode(this) }}
{% endblock %} {% endblock %}

View File

@ -1,5 +1,5 @@
{% extends "header_slim.html" %} {% extends "header_slim.html" %}
{% from "macros/podcast.html" import render_blog_post %} {% from "macros/podcast.html" import render_podcast_episode %}
{% from "macros/pagination.html" import render_pagination %} {% from "macros/pagination.html" import render_pagination %}
{%- block title -%}{{ this.title }}{%- endblock -%} {%- block title -%}{{ this.title }}{%- endblock -%}
@ -45,8 +45,8 @@
{#- Die Podcast Folgen werden aus dem blog template importiert :P -#} {#- Die Podcast Folgen werden aus dem blog template importiert :P -#}
{% for blog_post in this.pagination.items %} {% for episode in this.pagination.items %}
{{ render_blog_post(blog_post, from_index=true) }} {{ render_podcast_episode(episode, from_index=true) }}
{% endfor %} {% endfor %}
<section> <section>
{{ render_pagination(this.pagination, true) }} {{ render_pagination(this.pagination, true) }}