Skip to content

Commit

Permalink
add autogen drafts for ML, Socials, etc.
Browse files Browse the repository at this point in the history
  • Loading branch information
tarilabs committed Feb 4, 2024
1 parent ebce0a8 commit e7f5c03
Show file tree
Hide file tree
Showing 8 changed files with 119 additions and 13 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ jobs:
distribution: 'temurin'
java-version: '21'
- name: Build with Maven
run: mvn -B clean compile exec:java --fae --file pom.xml
run: mvn -B clean compile test exec:java --fae --file pom.xml
- name: Deploy
uses: JamesIves/github-pages-deploy-action@v4
with:
Expand Down
5 changes: 4 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,15 @@ JUG Milano website

This is the website of JVM User Group Milano.

> [!IMPORTANT]
> Per le procedure, processi per l'organizzazione dei talks, meetings fare riferimento alla guida [new_meeting_instructions.md](/misc/new_meeting_instructions.md).
## Build website

Maven-based build of JBake extensions, and programmatic website generation.

```
mvn clean compile exec:java
mvn clean compile test exec:java
```

## Preview website locally
Expand Down
20 changes: 9 additions & 11 deletions misc/new_meeting_instructions.md
Original file line number Diff line number Diff line change
@@ -1,15 +1,11 @@
# Istruzioni per l'organizzazione di un nuovo meeting

Per definire la data del meeting, bisogna fare riferimento al calendario dello spazio Venini 42:
Per definire la data del meeting, fare riferimento alle procedure definite per la Sede ospitante e fare riferimento a JUG Admins.

[http://meeting.venini42.it/venini42](http://meeting.venini42.it/venini42)

Quando la proposta di un relatore viene accettata, bisogna chiedere al relatore di fornire titolo e abstract dell'intervento oltre a una sua breve bio.
Quando la proposta di un talk viene accettata, bisogna chiedere al relatore di fornire **Titolo** e **Abstract** dell'intervento oltre a una sua breve **Bio**.
Per pubblicare l'evento bisogna:
* verificare libro Manning sull'argomento
* creare la pagina relativa al meeting sul sito www.jugmilano.it
* attivare il form di registrazione
* mandare una mail alla mailing list [email protected]
* mandare una mail sulla Mailing-List del JUG Milano
* pubblicizzare l'evento su
* Twitter
* Linkedin
Expand All @@ -30,9 +26,6 @@ Per info, scrivere a [email protected] una mail tipo questa:

Thanks in advance and regards,




## Creazione nuovo meeting sul sito
Per creare un nuovo meeting sul sito, è necessario creare un nuovo file nella directory /_posts del repository github del nostro sito. Il nome del file ha formato YYYY-MM-DD-meeting-NN.md, dove i placeholder Y, M e D hanno i soliti valori e N indica il numero del meeting: **la data nel nome file dev'essere quella di creazione del file e non del meeting**.

Expand Down Expand Up @@ -81,10 +74,15 @@ Vedi README.md nella root di questo repositori per l'esecuzione del rendering de

Quando il rendering è completo, si può pushare sul repo e nel giro di pochi secondi il nuovo meeting sarà visualizzato sul sito http://www.jugmilano.it .

## Bozza autogenerata per la Mailing-List, Socials, etc

Il template dei nuovi meeting genera nel HTML finale un DIV nascosto che se messo visibile nel browser (tasto dx, inspect, modifica) contiene
diverse utili bozze per l'utilizzo in mailing-list, per i social, etc.
Questo perché più che automazione completa, ho trovato utile avere una traccia pronta per le comunicazioni.

## Mail alla ML

Si può fare riferimento all'ultima email di announce sulla mailing list.
In alternativa all'uso della bozza autogenerata di cui sopra, si può fare riferimento all'ultima email di announce sulla mailing list.

La mail alla mailing list ha solitamente questo formato:

Expand Down
5 changes: 5 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,11 @@
<artifactId>slf4j-api</artifactId>
<version>2.0.10</version>
</dependency>
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.17.2</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import java.io.IOException;
import java.io.Writer;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.jbake.app.ContentStore;
Expand All @@ -15,6 +16,9 @@
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import freemarker.template.TemplateMethodModel;
import freemarker.template.TemplateModelException;
import it.jugmilano.website.utils.AsPlainText;

/**
* Customized FreemarkerTemplateEngine to override FreeMarker configuration with additional settings.
Expand Down Expand Up @@ -44,6 +48,13 @@ private void createTemplateConfiguration() {
Map<String, TemplateDateFormatFactory> customDateFormats = new HashMap<>();
customDateFormats.put("jugmilanomeetingdate", JUGMilanoMeetingdateDateFormatFactory.INSTANCE);
templateCfg.setCustomDateFormats(customDateFormats);

templateCfg.setSharedVariable("asPlainText", new TemplateMethodModel() {
@Override
public Object exec(List arguments) throws TemplateModelException {
return AsPlainText.asPlainText((String) arguments.get(0)); // TemplateMethodModel args are String coerced by FTL
}
});
}

@Override
Expand Down
23 changes: 23 additions & 0 deletions src/main/java/it/jugmilano/website/utils/AsPlainText.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package it.jugmilano.website.utils;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.TextNode;
import org.jsoup.safety.Safelist;

public class AsPlainText {

/**
* Parse an HTML fragment and returns a meaningful text representation,
* where A html tags are replaced with a MarkDown-equivalent,
* and preserving newlines.
*/
public static String asPlainText(String html) {
Document.OutputSettings outputSettings = new Document.OutputSettings();
outputSettings.prettyPrint(false);
Document doc = Jsoup.parseBodyFragment(html);
doc.outputSettings(outputSettings);
doc.select("a").forEach(a-> a.replaceWith(new TextNode("[" + a.text() + "](" + a.attr("href") + ")")));
return Jsoup.clean(doc.html(), "", Safelist.none(), outputSettings);
}
}
20 changes: 20 additions & 0 deletions src/test/java/it/jugmilano/website/utils/AsPlainTextTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package it.jugmilano.website.utils;

import static org.assertj.core.api.Assertions.assertThat;

import org.junit.jupiter.api.Test;

public class AsPlainTextTest {

@Test
public void test101() {
String html = "<div><p><a href=\"#\">Lorem</a> ipsum.</p>";
assertThat(AsPlainText.asPlainText(html)).isEqualTo("[Lorem](#) ipsum.");
}

@Test
public void test102() {
String html = "<div><p><a href=\"#\">Lorem</a>\n ipsum.</p>";
assertThat(AsPlainText.asPlainText(html)).isEqualTo("[Lorem](#)\n ipsum.");
}
}
46 changes: 46 additions & 0 deletions templates/new_generic.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,52 @@ ${content.bio!""}
</div>
</p>

<div style="display: none;">

<!-- email pro-forma -->
<div>
<pre>
[ANNOUNCE] ${content.title} - ${content.description}

Ciao a tutti,

Siamo lieti di annunciare che un nuovo incontro del JUG Milano si terrà in modalità ibrida, ${content.meetingdate?string.@jugmilanomeetingdate}.

${asPlainText(content.miscdetails)}

Questo il programma:
h 18:45 - JUG news e attività in corso
h 19:00 - "${content.description}", a cura di ${content.speaker!""}
h ~20:30 - Chiusura lavori, varie ed eventuali

Iscriviti al canale YouTube di JUG Milano https://www.youtube.com/c/JUGMilano e JUG Torino https://www.youtube.com/c/JUGTorino e clicca la campanella su YouTube: riceverai notifica direttamente da YouTube quando saremo live!

Potete trovare maggiori dettagli, direttamente sul nostro sito:
http://www.jugmilano.it/${content.uri}

Vi aspettiamo!
- JUG Milano staff
<pre>
</div>
<hr />
<!-- social pro-forma -->
<div>
<pre>
🗓️ ${content.meetingdate?string.@jugmilanomeetingdate}
👉 "${content.description}" in presenza e YouTube live!
🙏 presenta ${content.speaker!""}

Hybrid mode:
🚨 per partecipare in presenza è richiesto questo form:
${asPlainText(content.miscdetails)}

⚠️
Dettagli: http://www.jugmilano.it/${content.uri}
<pre>
</div>

</div>

</div> <!-- #wrapper -->
<#include "footer.ftl">
<#include "script.ftl">
Expand Down

0 comments on commit e7f5c03

Please sign in to comment.