diff --git a/server/CODE_OF_CONDUCT b/server/CODE_OF_CONDUCT new file mode 100644 index 0000000..243da37 --- /dev/null +++ b/server/CODE_OF_CONDUCT @@ -0,0 +1,31 @@ + +β”Œβ”€─ Code of Conduct β”œ────────────────────────────────────────────────────────────┐ +β”‚ Khaos im Kiez ist eine Veranstaltung des Chaos Computer Club Berlin e.V. β”‚ +β”‚ (CCCB). Damit sich alle wohlfΓΌhlen, gelten diese Regeln fΓΌr alle β”‚ +β”‚ Teilnehmenden, Vortragenden und Helfenden. β”‚ +β”‚ β”‚ +β”‚ > Sei nett zueinander. Geh respektvoll und freundlich miteinander um, auch β”‚ +β”‚ wenn du anderer Meinung bist. β”‚ +β”‚ > Keine Diskriminierung. Rassismus, Sexismus, Queerfeindlichkeit, Ableismus β”‚ +β”‚ und andere menschenverachtende Haltungen haben hier keinen Platz. β”‚ +β”‚ > Keine BelΓ€stigung. Dazu gehΓΆren Beleidigungen, Bedrohungen, Stalking, β”‚ +β”‚ unerwΓΌnschte kΓΆrperliche BerΓΌhrungen und unerwΓΌnschte sexuelle β”‚ +β”‚ Aufmerksamkeit. Ein Nein ist ein Nein. β”‚ +β”‚ > Frag vor dem Fotografieren. Fotos, Video- und Tonaufnahmen von Personen nur β”‚ +β”‚ mit deren EinverstΓ€ndnis. Das gilt auch fΓΌr Talks und Workshops. β”‚ +β”‚ > Achte auf GerΓ€te und Eigentum. Fass fremde GerΓ€te nicht ohne Erlaubnis an. β”‚ +β”‚ Geh pfleglich mit den RΓ€umen und dem Inventar um. β”‚ +β”‚ > Sei neugierig, nicht ΓΌbergriffig. Chaos ja, GrenzenΓΌberschreitungen nein. β”‚ +β”‚ β”‚ +β”‚ Hausrecht: Die Orga hat Hausrecht. Bei Verstâßen gegen diese Regeln kann sie β”‚ +β”‚ Verwarnungen aussprechen, Personen der Veranstaltung verweisen oder ein β”‚ +β”‚ Hausverbot erteilen. Den Anweisungen der Orga ist Folge zu leisten. β”‚ +β”‚ β”‚ +β”‚ Probleme? Wenn dir etwas passiert oder du etwas beobachtest, sprich eine β”‚ +β”‚ Person aus der Orga an oder schreib an aprl [at] berlin [dot] ccc [dot] de. β”‚ +β”‚ Hinweise werden vertraulich behandelt. β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + +────────────────────────────────────────────────────────────────────────────────── + ]8;;https://berlin.ccc.de/kik/\Startseite]8;;\ Β· ]8;;https://berlin.ccc.de/page/impressum/\Impressum]8;;\ + diff --git a/server/CODE_OF_CONDUCT.en b/server/CODE_OF_CONDUCT.en new file mode 100644 index 0000000..1639082 --- /dev/null +++ b/server/CODE_OF_CONDUCT.en @@ -0,0 +1,30 @@ + +β”Œβ”€─ Code of Conduct β”œ────────────────────────────────────────────────────────────┐ +β”‚ Khaos im Kiez is an event of the Chaos Computer Club Berlin e.V. (CCCB). To β”‚ +β”‚ make everyone feel comfortable, these rules apply to all attendees, speakers β”‚ +β”‚ and helpers. β”‚ +β”‚ β”‚ +β”‚ > Be nice to each other. Treat each other respectfully and kindly, even when β”‚ +β”‚ you disagree. β”‚ +β”‚ > No discrimination. Racism, sexism, queerphobia, ableism and other hateful β”‚ +β”‚ attitudes have no place here. β”‚ +β”‚ > No harassment. This includes insults, threats, stalking, unwanted physical β”‚ +β”‚ contact and unwanted sexual attention. No means no. β”‚ +β”‚ > Ask before taking pictures. Photos, video and audio recordings of people β”‚ +β”‚ only with their consent. This also applies to talks and workshops. β”‚ +β”‚ > Respect devices and property. Do not touch other people's devices without β”‚ +β”‚ permission. Treat the rooms and furniture with care. β”‚ +β”‚ > Be curious, not intrusive. Chaos yes, crossing boundaries no. β”‚ +β”‚ β”‚ +β”‚ House rules: The organizers have the right to exclude people from the premises β”‚ +β”‚ (Hausrecht). In case of violations they may issue warnings, ask people to β”‚ +β”‚ leave, or ban them from the event. Follow the organizers' instructions. β”‚ +β”‚ β”‚ +β”‚ Problems? If something happens to you or you notice something, talk to a β”‚ +β”‚ member of the organizing team or write to aprl [at] berlin [dot] ccc [dot] de. β”‚ +β”‚ Reports are treated confidentially. β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + +────────────────────────────────────────────────────────────────────────────────── + ]8;;https://berlin.ccc.de/kik/en.html\Home]8;;\ Β· ]8;;https://berlin.ccc.de/page/impressum/\Legal notice]8;;\ + diff --git a/server/README b/server/README new file mode 100644 index 0000000..57905aa --- /dev/null +++ b/server/README @@ -0,0 +1,79 @@ + +KHAOS IM KIEZ +CCC Berlin Β· 28. – 29.11.2026 + +────────────────────────────────────────────────────────────────────────────────── +]8;;https://berlin.ccc.de/kik/#infos\[1] Infos]8;;\ ]8;;https://berlin.ccc.de/kik/#mitmachen\[2] Mitmachen]8;;\ ]8;;https://berlin.ccc.de/kik/#anfahrt\[3] Anfahrt]8;;\ +────────────────────────────────────────────────────────────────────────────────── + +β”Œβ”€─ 1 Infos β”œ────────────────────────────────────────────────────────────────────┐ +β”‚ Khaos im Kiez ist ein kleines Chaos-Event, back to the roots: inspiriert von β”‚ +β”‚ anderen kleinen Chaos-Events. Ein Wochenende zum Chillen und um die Seite von β”‚ +β”‚ Chaos-Events zu erleben, fΓΌr die bei grâßeren Events oft keine Zeit mehr β”‚ +β”‚ bleibt. β”‚ +β”‚ β”‚ +β”‚ Du kannst einen Talk oder Workshop halten, an deinen Projekten schrauben, β”‚ +β”‚ gemeinsam hacken, lΓΆten, basteln oder einfach vorbeikommen, zuhΓΆren und Leute β”‚ +β”‚ kennenlernen. Alle sind willkommen, die Lust auf $Dinge, Neugier und Chaos β”‚ +β”‚ mitbringen. β”‚ +β”‚ β”‚ +β”‚ Was : Khaos im Kiez (KiK) β”‚ +β”‚ Wann : Sa 28.11. – So 29.11.2026, 11:00 – 23:59 β”‚ +β”‚ Wo : Marienstraße 11, 10117 Berlin β”‚ +β”‚ Wer : Chaos Computer Club Berlin β”‚ +β”‚ Preis : 0,00 € (Ticket trotzdem nΓΆtig, ~50 PlΓ€tze) β”‚ +β”‚ Fahrplan : ]8;;https://cfp.berlin.ccc.de\cfp.berlin.ccc.de]8;;\ β”‚ +β”‚ Essen : Ewiges FrΓΌhstΓΌck, vegan β”‚ +β”‚ Barrierefrei : Nicht barrierefrei. β”‚ +β”‚ Regeln : ]8;;https://berlin.ccc.de/kik/coc.html\Code of Conduct]8;;\ β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + +β”Œβ”€─ 2 Mitmachen β”œ────────────────────────────────────────────────────────────────┐ +β”‚ Ticket: Anmeldung ΓΌber den Ticketshop. Das Ticket ist kostenlos, aber die β”‚ +β”‚ PlΓ€tze sind begrenzt. β”‚ +β”‚ β”‚ +β”‚ ]8;;https://tickets.berlin.ccc.de/cccb/kik-v0.1/\[ Ticket sichern ]]8;;\ β”‚ +β”‚ β”‚ +β”‚ Talks & Workshops: Reiche deinen Beitrag im Call for Participation ein und β”‚ +β”‚ schau dir spΓ€ter den Fahrplan an. β”‚ +β”‚ β”‚ +β”‚ ]8;;https://cfp.berlin.ccc.de/kik-v01/cfp\[ Talk einreichen ]]8;;\ ]8;;https://cfp.berlin.ccc.de/kik-v01/schedule\[ Fahrplan ]]8;;\ β”‚ +β”‚ β”‚ +β”‚ Sonstiges: Du willst anders helfen oder hast Fragen? Schreib an aprl [at] β”‚ +β”‚ berlin [dot] ccc [dot] de. β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + +β”Œβ”€─ 3 Anfahrt β”œ──────────────────────────────────────────────────────────────────┐ +β”‚ Adresse : ClubrΓ€ume im Hinterhof der Marienstraße 11, 10117 Berlin β”‚ +β”‚ Koordinaten : 52,52194Β° N, 13,38261Β° O β”‚ +β”‚ Fahrrad : Im Innenhof gibt es eine begrenzte Zahl an FahrradstΓ€ndern. Auf β”‚ +β”‚ dem Weg liegen viele Fahrradstraßen, nutz die am besten, z. B. β”‚ +β”‚ mit ]8;;http://www.bbbike.de/\BBBike.de]8;;\. β”‚ +β”‚ Γ–PNV : Der Club liegt direkt beim S+U-Bahnhof Friedrichstraße (auch β”‚ +β”‚ Regionalbahnen). Vom oberirdischen S-Bahn-Steig (S3/S5/S7) β”‚ +β”‚ nimmst du den Ausgang Schiffbauerdamm und gehst unter der β”‚ +β”‚ BahnbrΓΌcke ΓΌber die Spree. Über die Albrechtstraße kommst du β”‚ +β”‚ zur Marienstraße. β”‚ +β”‚ Fernverkehr : Aussteigen in Berlin Hauptbahnhof, dann mit S-Bahn oder β”‚ +β”‚ Regionalbahn Richtung Osten eine Station bis Friedrichstraße. β”‚ +β”‚ Bahnhof Richtung Spree verlassen, ΓΌber die FußgΓ€ngerbrΓΌcke und β”‚ +β”‚ der Albrechtstraße bis zur Stichstraße Marienstraße folgen. β”‚ +β”‚ Flugzeug : BER: Airport Express (RE7, RB14) oder S9 bis Friedrichstraße, β”‚ +β”‚ alternativ FEX bis Hauptbahnhof (dann wie Fernverkehr). β”‚ +β”‚ Achtung: Terminal 5 (frΓΌher SXF) ist nicht mit dem Rest des BER β”‚ +β”‚ verbunden, dort fΓ€hrt nur die S9. Flugplatz Strausberg (EDAY): β”‚ +β”‚ S7 direkt bis Friedrichstraße. β”‚ +β”‚ Auto : Zufahrt von Hauptbahnhof oder Brandenburger Tor ΓΌber die β”‚ +β”‚ Luisenstraße. Von der Friedrichstraße entweder ΓΌber β”‚ +β”‚ Schiffbauerdamm und Albrechtstraße (Außengastronomie und β”‚ +β”‚ Kopfsteinpflaster) oder ΓΌber Reinhardstraße und Luisenstraße β”‚ +β”‚ (die Albrechtstraße ist nur in Gegenrichtung befahrbar). β”‚ +β”‚ Parken : Achtung: Es gibt kaum ParkplΓ€tze, und die Marienstraße und alle β”‚ +β”‚ umliegenden Straßen sind parkraumbewirtschaftet. β”‚ +β”‚ β”‚ +β”‚ ]8;;https://www.openstreetmap.org/node/3872556357#map=20/52.5217003/13.3828041&layers=H\[ Karte (OpenStreetMap) ]]8;;\ β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + +────────────────────────────────────────────────────────────────────────────────── + ]8;;https://berlin.ccc.de/page/impressum/\Impressum]8;;\ Β· ]8;;https://berlin.ccc.de/\CCC Berlin]8;;\ + diff --git a/server/README.en b/server/README.en new file mode 100644 index 0000000..5b524e3 --- /dev/null +++ b/server/README.en @@ -0,0 +1,77 @@ + +KHAOS IM KIEZ +CCC Berlin Β· 2026-11-28 – 2026-11-29 + +────────────────────────────────────────────────────────────────────────────────── +]8;;https://berlin.ccc.de/kik/en.html#infos\[1] Info]8;;\ ]8;;https://berlin.ccc.de/kik/en.html#join\[2] Join in]8;;\ ]8;;https://berlin.ccc.de/kik/en.html#getting-here\[3] Getting here]8;;\ +────────────────────────────────────────────────────────────────────────────────── + +β”Œβ”€─ 1 Info β”œ─────────────────────────────────────────────────────────────────────┐ +β”‚ Khaos im Kiez is a small chaos event, back to the roots: inspired by other β”‚ +β”‚ small chaos events. A weekend to chill and to experience the side of chaos β”‚ +β”‚ events that often gets no time at larger events. β”‚ +β”‚ β”‚ +β”‚ Give a talk or workshop, work on your projects, hack together, solder, tinker, β”‚ +β”‚ or simply drop by, listen and meet people. Everyone who brings a love of β”‚ +β”‚ $things, curiosity and a bit of chaos is welcome. β”‚ +β”‚ β”‚ +β”‚ What : Khaos im Kiez (KiK) β”‚ +β”‚ When : Sat 2026-11-28 – Sun 2026-11-29, 11:00 – 23:59 β”‚ +β”‚ Where : Marienstraße 11, 10117 Berlin, Germany β”‚ +β”‚ Who : Chaos Computer Club Berlin β”‚ +β”‚ Price : €0.00 (ticket still required, ~50 seats) β”‚ +β”‚ Schedule : ]8;;https://cfp.berlin.ccc.de\cfp.berlin.ccc.de]8;;\ β”‚ +β”‚ Food : Eternal breakfast, vegan β”‚ +β”‚ Accessibility : Not accessible. β”‚ +β”‚ Rules : ]8;;https://berlin.ccc.de/kik/coc-en.html\Code of Conduct]8;;\ β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + +β”Œβ”€─ 2 Join in β”œ──────────────────────────────────────────────────────────────────┐ +β”‚ Ticket: Register via the ticket shop. The ticket is free, but seats are β”‚ +β”‚ limited. β”‚ +β”‚ β”‚ +β”‚ ]8;;https://tickets.berlin.ccc.de/cccb/kik-v0.1/\[ Get ticket ]]8;;\ β”‚ +β”‚ β”‚ +β”‚ Talks & workshops: Submit your proposal via the call for participation and β”‚ +β”‚ check the schedule later. β”‚ +β”‚ β”‚ +β”‚ ]8;;https://cfp.berlin.ccc.de/kik-v01/cfp\[ Submit a talk ]]8;;\ ]8;;https://cfp.berlin.ccc.de/kik-v01/schedule\[ Schedule ]]8;;\ β”‚ +β”‚ β”‚ +β”‚ Other: Want to help otherwise or have questions? Write to aprl [at] berlin β”‚ +β”‚ [dot] ccc [dot] de. β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + +β”Œβ”€─ 3 Getting here β”œ─────────────────────────────────────────────────────────────┐ +β”‚ Address : Club rooms in the back yard of Marienstraße 11, 10117 Berlin β”‚ +β”‚ Coordinates : 52.52194Β° N, 13.38261Β° E β”‚ +β”‚ Bicycle : A limited number of bike racks are in the courtyard. Many β”‚ +β”‚ bicycle streets lead there, preferably use those, e.g. with β”‚ +β”‚ ]8;;http://www.bbbike.de/\BBBike.de]8;;\. β”‚ +β”‚ Local transit : The club is right next to S+U Friedrichstraße (regional trains β”‚ +β”‚ stop there too). From the elevated S-Bahn platform (S3/S5/S7) β”‚ +β”‚ take the Schiffbauerdamm exit and walk across the Spree β”‚ +β”‚ beneath the railway bridge. Albrechtstraße leads to β”‚ +β”‚ Marienstraße. β”‚ +β”‚ Long distance : Get off at Berlin Hauptbahnhof, then take any S-Bahn or β”‚ +β”‚ regional train eastbound one stop to Friedrichstraße. Leave β”‚ +β”‚ the station towards the Spree, cross the footbridge and follow β”‚ +β”‚ Albrechtstraße to the dead-end Marienstraße. β”‚ +β”‚ Air : BER: Airport Express (RE7, RB14) or S9 to Friedrichstraße, or β”‚ +β”‚ FEX to Hauptbahnhof (then as above). Note: Terminal 5 β”‚ +β”‚ (formerly SXF) is not connected to the rest of BER, only the β”‚ +β”‚ S9 runs there. Strausberg airfield (EDAY): S7 direct to β”‚ +β”‚ Friedrichstraße. β”‚ +β”‚ Car : Access from Hauptbahnhof or Brandenburger Tor via β”‚ +β”‚ Luisenstraße. From Friedrichstraße either via Schiffbauerdamm β”‚ +β”‚ and Albrechtstraße (outdoor seating and cobblestones) or via β”‚ +β”‚ Reinhardstraße and Luisenstraße (Albrechtstraße is one-way the β”‚ +β”‚ other direction). β”‚ +β”‚ Parking : Warning: parking is scarce, and Marienstraße and all β”‚ +β”‚ surrounding streets are subject to paid parking zones. β”‚ +β”‚ β”‚ +β”‚ ]8;;https://www.openstreetmap.org/node/3872556357#map=20/52.5217003/13.3828041&layers=H\[ Map (OpenStreetMap) ]]8;;\ β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + +────────────────────────────────────────────────────────────────────────────────── + ]8;;https://berlin.ccc.de/page/impressum/\Legal notice]8;;\ Β· ]8;;https://berlin.ccc.de/\CCC Berlin]8;;\ + diff --git a/server/make_files.py b/server/make_files.py new file mode 100644 index 0000000..6822a7a --- /dev/null +++ b/server/make_files.py @@ -0,0 +1,335 @@ +# Builds README, README.en, CODE_OF_CONDUCT and CODE_OF_CONDUCT.en next to this script: the website's pages as +# terminal text with escape sequences, for the home directory of the shell server's root user. +# Usage: python3 server/make_files.py +import pathlib +import textwrap + +ESC = '\x1b' +RESET = f'{ESC}[0m' +BOLD = f'{ESC}[1m' +DIM = f'{ESC}[38;2;31;154;63m' # the page's --dim +HOT = f'{ESC}[38;2;255;42;42m' # the page's --hot +WIDTH = 82 # the web terminal's width, as wide as the page column +INNER = WIDTH - 4 # text width inside "β”‚ " ... " β”‚" +SITE = 'https://berlin.ccc.de/kik/' +IMPRESSUM = 'https://berlin.ccc.de/page/impressum/' +TICKETS = 'https://tickets.berlin.ccc.de/cccb/kik-v0.1/' +CFP = 'https://cfp.berlin.ccc.de/kik-v01/cfp' +SCHEDULE = 'https://cfp.berlin.ccc.de/kik-v01/schedule' +MAP = 'https://www.openstreetmap.org/node/3872556357#map=20/52.5217003/13.3828041&layers=H' + + +def link(url, text, style=''): + return f'{ESC}]8;;{url}{ESC}\\{style}{text}{RESET if style else ""}{ESC}]8;;{ESC}\\' + + +class Line: + """A line of text with its visible width, so boxes can be padded around styled text.""" + def __init__(self, text='', width=None): + self.text, self.width = text, len(text) if width is None else width + + def __add__(self, other): + return Line(self.text + other.text, self.width + other.width) + + +def styled(text, style): + return Line(f'{style}{text}{RESET}', len(text)) + + +def linked(url, text, style=''): + return Line(link(url, text, style), len(text)) + + +def joined(parts, gap=' '): + line = parts[0] + for part in parts[1:]: + line = line + Line(gap) + part + return line + + +def wrap(text, width, links=()): + """Wraps plain text, then turns the given (text, url) pairs into links where they appear.""" + lines = [] + for raw in textwrap.wrap(text, width, break_on_hyphens=False, break_long_words=False): + rendered = raw + for needle, url in links: + rendered = rendered.replace(needle, link(url, needle)) + lines.append(Line(rendered, len(raw))) + return lines + + +def paragraph(text, links=(), lead=None): + """A paragraph, optionally starting with a bold lead-in like "Ticket:".""" + full = f'{lead} {text}' if lead else text + lines = wrap(full, INNER, links) + if lead: + first = lines[0] + lines[0] = Line(first.text.replace(lead, f'{BOLD}{lead}{RESET}', 1), first.width) + return lines + + +def pairs(items, label, links=()): + """A key-value list like the page's: dim "Label :" column, values wrapped with a hanging indent.""" + lines = [] + for key, value in items: + wrapped = wrap(value, INNER - label, links) + lines.append(styled(f'{key} :'.ljust(label), DIM) + wrapped[0]) + lines += [Line(' ' * label) + rest for rest in wrapped[1:]] + return lines + + +def bullets(items): + """A list like the page's: dim "> " marker, bold title, text wrapped with a hanging indent.""" + lines = [] + for title, text in items: + wrapped = wrap(f'{title} {text}', INNER - 2) + first = wrapped[0] + lines.append(styled('> ', DIM) + Line(first.text.replace(title, f'{BOLD}{title}{RESET}', 1), first.width)) + lines += [Line(' ') + rest for rest in wrapped[1:]] + return lines + + +def box(title, lines): + rule = WIDTH - 2 - len(f'── {title} β”œ') + out = [Line('β”Œβ”€') + styled('─ ', DIM) + styled(title, BOLD) + styled(' β”œ', DIM) + Line('─' * rule + '┐')] + out += [Line('β”‚ ') + line + Line(' ' * (INNER - line.width) + ' β”‚') for line in lines] + out.append(Line('β””' + '─' * (WIDTH - 2) + 'β”˜')) + return out + + +def centered(line): + return Line(' ' * ((WIDTH - line.width) // 2)) + line + + +def nav(line): + return [styled('─' * WIDTH, DIM), line, styled('─' * WIDTH, DIM)] + + +def footer(parts): + line = linked(parts[0][1], parts[0][0], DIM) + for text, url in parts[1:]: + line = line + styled(' Β· ', DIM) + linked(url, text, DIM) + return [styled('─' * WIDTH, DIM), centered(line)] + + +def page(lines): + lines = [Line(), *lines, Line()] + for line in lines: + assert line.width <= WIDTH + 2, (line.width, line.text) + return ''.join(f'{line.text}\n' for line in lines) + + +def readme(t): + label = 3 + max(len(key) for key, _ in t['infos'] + t['route']) + return page([ + styled('KHAOS IM ', BOLD) + styled('KIEZ', BOLD + HOT), + styled(t['date'], DIM), + Line(), + *nav(joined([linked(f'{SITE}{t["page"]}#{anchor}', f'[{n}] {title}') for n, title, anchor in t['sections']])), + Line(), + *box('{} {}'.format(*t['sections'][0][:2]), [ + *paragraph(t['intro'][0]), + Line(), + *paragraph(t['intro'][1]), + Line(), + *pairs(t['infos'], label, links=[('cfp.berlin.ccc.de', 'https://cfp.berlin.ccc.de'), ('Code of Conduct', f'{SITE}{t["coc"]}')]), + ]), + Line(), + *box('{} {}'.format(*t['sections'][1][:2]), [ + *paragraph(t['ticket'], lead=t['ticket_lead']), + Line(), + linked(TICKETS, f'[ {t["get_ticket"]} ]', HOT), + Line(), + *paragraph(t['talks'], lead=t['talks_lead']), + Line(), + joined([linked(CFP, f'[ {t["submit"]} ]'), linked(SCHEDULE, f'[ {t["schedule"]} ]')]), + Line(), + *paragraph(t['other'], lead=t['other_lead']), + ]), + Line(), + *box('{} {}'.format(*t['sections'][2][:2]), [ + *pairs(t['route'], label, links=[('BBBike.de', 'http://www.bbbike.de/')]), + Line(), + linked(MAP, f'[ {t["map"]} ]'), + ]), + Line(), + *footer(t['footer']), + ]) + + +def code_of_conduct(t): + return page([ + *box('Code of Conduct', [ + *paragraph(t['intro']), + Line(), + *bullets(t['rules']), + Line(), + *paragraph(t['house'], lead=t['house_lead']), + Line(), + *paragraph(t['problems'], lead=t['problems_lead']), + ]), + Line(), + *footer(t['footer']), + ]) + + +DE = { + 'page': '', 'coc': 'coc.html', + 'date': 'CCC Berlin Β· 28. – 29.11.2026', + 'sections': [(1, 'Infos', 'infos'), (2, 'Mitmachen', 'mitmachen'), (3, 'Anfahrt', 'anfahrt')], + 'intro': [ + 'Khaos im Kiez ist ein kleines Chaos-Event, back to the roots: inspiriert von anderen kleinen Chaos-Events. ' + 'Ein Wochenende zum Chillen und um die Seite von Chaos-Events zu erleben, fΓΌr die bei grâßeren Events oft ' + 'keine Zeit mehr bleibt.', + 'Du kannst einen Talk oder Workshop halten, an deinen Projekten schrauben, gemeinsam hacken, lΓΆten, basteln ' + 'oder einfach vorbeikommen, zuhΓΆren und Leute kennenlernen. Alle sind willkommen, die Lust auf $Dinge, ' + 'Neugier und Chaos mitbringen.', + ], + 'infos': [ + ('Was', 'Khaos im Kiez (KiK)'), + ('Wann', 'Sa 28.11. – So 29.11.2026, 11:00 – 23:59'), + ('Wo', 'Marienstraße 11, 10117 Berlin'), + ('Wer', 'Chaos Computer Club Berlin'), + ('Preis', '0,00 € (Ticket trotzdem nΓΆtig, ~50 PlΓ€tze)'), + ('Fahrplan', 'cfp.berlin.ccc.de'), + ('Essen', 'Ewiges FrΓΌhstΓΌck, vegan'), + ('Barrierefrei', 'Nicht barrierefrei.'), + ('Regeln', 'Code of Conduct'), + ], + 'ticket_lead': 'Ticket:', + 'ticket': 'Anmeldung ΓΌber den Ticketshop. Das Ticket ist kostenlos, aber die PlΓ€tze sind begrenzt.', + 'get_ticket': 'Ticket sichern', + 'talks_lead': 'Talks & Workshops:', + 'talks': 'Reiche deinen Beitrag im Call for Participation ein und schau dir spΓ€ter den Fahrplan an.', + 'submit': 'Talk einreichen', 'schedule': 'Fahrplan', + 'other_lead': 'Sonstiges:', + 'other': 'Du willst anders helfen oder hast Fragen? Schreib an aprl [at] berlin [dot] ccc [dot] de.', + 'route': [ + ('Adresse', 'ClubrΓ€ume im Hinterhof der Marienstraße 11, 10117 Berlin'), + ('Koordinaten', '52,52194Β° N, 13,38261Β° O'), + ('Fahrrad', 'Im Innenhof gibt es eine begrenzte Zahl an FahrradstΓ€ndern. Auf dem Weg liegen viele ' + 'Fahrradstraßen, nutz die am besten, z. B. mit BBBike.de.'), + ('Γ–PNV', 'Der Club liegt direkt beim S+U-Bahnhof Friedrichstraße (auch Regionalbahnen). Vom oberirdischen ' + 'S-Bahn-Steig (S3/S5/S7) nimmst du den Ausgang Schiffbauerdamm und gehst unter der BahnbrΓΌcke ΓΌber ' + 'die Spree. Über die Albrechtstraße kommst du zur Marienstraße.'), + ('Fernverkehr', 'Aussteigen in Berlin Hauptbahnhof, dann mit S-Bahn oder Regionalbahn Richtung Osten eine ' + 'Station bis Friedrichstraße. Bahnhof Richtung Spree verlassen, ΓΌber die FußgΓ€ngerbrΓΌcke und ' + 'der Albrechtstraße bis zur Stichstraße Marienstraße folgen.'), + ('Flugzeug', 'BER: Airport Express (RE7, RB14) oder S9 bis Friedrichstraße, alternativ FEX bis Hauptbahnhof ' + '(dann wie Fernverkehr). Achtung: Terminal 5 (frΓΌher SXF) ist nicht mit dem Rest des BER ' + 'verbunden, dort fΓ€hrt nur die S9. Flugplatz Strausberg (EDAY): S7 direkt bis Friedrichstraße.'), + ('Auto', 'Zufahrt von Hauptbahnhof oder Brandenburger Tor ΓΌber die Luisenstraße. Von der Friedrichstraße ' + 'entweder ΓΌber Schiffbauerdamm und Albrechtstraße (Außengastronomie und Kopfsteinpflaster) oder ' + 'ΓΌber Reinhardstraße und Luisenstraße (die Albrechtstraße ist nur in Gegenrichtung befahrbar).'), + ('Parken', 'Achtung: Es gibt kaum ParkplΓ€tze, und die Marienstraße und alle umliegenden Straßen sind ' + 'parkraumbewirtschaftet.'), + ], + 'map': 'Karte (OpenStreetMap)', + 'footer': [('Impressum', IMPRESSUM), ('CCC Berlin', 'https://berlin.ccc.de/')], +} + +EN = { + 'page': 'en.html', 'coc': 'coc-en.html', + 'date': 'CCC Berlin Β· 2026-11-28 – 2026-11-29', + 'sections': [(1, 'Info', 'infos'), (2, 'Join in', 'join'), (3, 'Getting here', 'getting-here')], + 'intro': [ + 'Khaos im Kiez is a small chaos event, back to the roots: inspired by other small chaos events. A weekend to ' + 'chill and to experience the side of chaos events that often gets no time at larger events.', + 'Give a talk or workshop, work on your projects, hack together, solder, tinker, or simply drop by, listen and ' + 'meet people. Everyone who brings a love of $things, curiosity and a bit of chaos is welcome.', + ], + 'infos': [ + ('What', 'Khaos im Kiez (KiK)'), + ('When', 'Sat 2026-11-28 – Sun 2026-11-29, 11:00 – 23:59'), + ('Where', 'Marienstraße 11, 10117 Berlin, Germany'), + ('Who', 'Chaos Computer Club Berlin'), + ('Price', '€0.00 (ticket still required, ~50 seats)'), + ('Schedule', 'cfp.berlin.ccc.de'), + ('Food', 'Eternal breakfast, vegan'), + ('Accessibility', 'Not accessible.'), + ('Rules', 'Code of Conduct'), + ], + 'ticket_lead': 'Ticket:', + 'ticket': 'Register via the ticket shop. The ticket is free, but seats are limited.', + 'get_ticket': 'Get ticket', + 'talks_lead': 'Talks & workshops:', + 'talks': 'Submit your proposal via the call for participation and check the schedule later.', + 'submit': 'Submit a talk', 'schedule': 'Schedule', + 'other_lead': 'Other:', + 'other': 'Want to help otherwise or have questions? Write to aprl [at] berlin [dot] ccc [dot] de.', + 'route': [ + ('Address', 'Club rooms in the back yard of Marienstraße 11, 10117 Berlin'), + ('Coordinates', '52.52194Β° N, 13.38261Β° E'), + ('Bicycle', 'A limited number of bike racks are in the courtyard. Many bicycle streets lead there, preferably ' + 'use those, e.g. with BBBike.de.'), + ('Local transit', 'The club is right next to S+U Friedrichstraße (regional trains stop there too). From the ' + 'elevated S-Bahn platform (S3/S5/S7) take the Schiffbauerdamm exit and walk across the Spree ' + 'beneath the railway bridge. Albrechtstraße leads to Marienstraße.'), + ('Long distance', 'Get off at Berlin Hauptbahnhof, then take any S-Bahn or regional train eastbound one stop ' + 'to Friedrichstraße. Leave the station towards the Spree, cross the footbridge and follow ' + 'Albrechtstraße to the dead-end Marienstraße.'), + ('Air', 'BER: Airport Express (RE7, RB14) or S9 to Friedrichstraße, or FEX to Hauptbahnhof (then as above). ' + 'Note: Terminal 5 (formerly SXF) is not connected to the rest of BER, only the S9 runs there. ' + 'Strausberg airfield (EDAY): S7 direct to Friedrichstraße.'), + ('Car', 'Access from Hauptbahnhof or Brandenburger Tor via Luisenstraße. From Friedrichstraße either via ' + 'Schiffbauerdamm and Albrechtstraße (outdoor seating and cobblestones) or via Reinhardstraße and ' + 'Luisenstraße (Albrechtstraße is one-way the other direction).'), + ('Parking', 'Warning: parking is scarce, and Marienstraße and all surrounding streets are subject to paid ' + 'parking zones.'), + ], + 'map': 'Map (OpenStreetMap)', + 'footer': [('Legal notice', IMPRESSUM), ('CCC Berlin', 'https://berlin.ccc.de/')], +} + +COC_DE = { + 'intro': 'Khaos im Kiez ist eine Veranstaltung des Chaos Computer Club Berlin e.V. (CCCB). Damit sich alle ' + 'wohlfΓΌhlen, gelten diese Regeln fΓΌr alle Teilnehmenden, Vortragenden und Helfenden.', + 'rules': [ + ('Sei nett zueinander.', 'Geh respektvoll und freundlich miteinander um, auch wenn du anderer Meinung bist.'), + ('Keine Diskriminierung.', 'Rassismus, Sexismus, Queerfeindlichkeit, Ableismus und andere menschenverachtende ' + 'Haltungen haben hier keinen Platz.'), + ('Keine BelΓ€stigung.', 'Dazu gehΓΆren Beleidigungen, Bedrohungen, Stalking, unerwΓΌnschte kΓΆrperliche ' + 'BerΓΌhrungen und unerwΓΌnschte sexuelle Aufmerksamkeit. Ein Nein ist ein Nein.'), + ('Frag vor dem Fotografieren.', 'Fotos, Video- und Tonaufnahmen von Personen nur mit deren EinverstΓ€ndnis. ' + 'Das gilt auch fΓΌr Talks und Workshops.'), + ('Achte auf GerΓ€te und Eigentum.', 'Fass fremde GerΓ€te nicht ohne Erlaubnis an. Geh pfleglich mit den RΓ€umen ' + 'und dem Inventar um.'), + ('Sei neugierig, nicht ΓΌbergriffig.', 'Chaos ja, GrenzenΓΌberschreitungen nein.'), + ], + 'house_lead': 'Hausrecht:', + 'house': 'Die Orga hat Hausrecht. Bei Verstâßen gegen diese Regeln kann sie Verwarnungen aussprechen, Personen ' + 'der Veranstaltung verweisen oder ein Hausverbot erteilen. Den Anweisungen der Orga ist Folge zu leisten.', + 'problems_lead': 'Probleme?', + 'problems': 'Wenn dir etwas passiert oder du etwas beobachtest, sprich eine Person aus der Orga an oder schreib an ' + 'aprl [at] berlin [dot] ccc [dot] de. Hinweise werden vertraulich behandelt.', + 'footer': [('Startseite', SITE), ('Impressum', IMPRESSUM)], +} + +COC_EN = { + 'intro': 'Khaos im Kiez is an event of the Chaos Computer Club Berlin e.V. (CCCB). To make everyone feel ' + 'comfortable, these rules apply to all attendees, speakers and helpers.', + 'rules': [ + ('Be nice to each other.', 'Treat each other respectfully and kindly, even when you disagree.'), + ('No discrimination.', 'Racism, sexism, queerphobia, ableism and other hateful attitudes have no place here.'), + ('No harassment.', 'This includes insults, threats, stalking, unwanted physical contact and unwanted sexual ' + 'attention. No means no.'), + ('Ask before taking pictures.', 'Photos, video and audio recordings of people only with their consent. This ' + 'also applies to talks and workshops.'), + ('Respect devices and property.', "Do not touch other people's devices without permission. Treat the rooms " + 'and furniture with care.'), + ('Be curious, not intrusive.', 'Chaos yes, crossing boundaries no.'), + ], + 'house_lead': 'House rules:', + 'house': 'The organizers have the right to exclude people from the premises (Hausrecht). In case of violations ' + "they may issue warnings, ask people to leave, or ban them from the event. Follow the organizers' " + 'instructions.', + 'problems_lead': 'Problems?', + 'problems': 'If something happens to you or you notice something, talk to a member of the organizing team or ' + 'write to aprl [at] berlin [dot] ccc [dot] de. Reports are treated confidentially.', + 'footer': [('Home', f'{SITE}en.html'), ('Legal notice', IMPRESSUM)], +} + +out = pathlib.Path(__file__).parent +for name, text in [('README', readme(DE)), ('README.en', readme(EN)), + ('CODE_OF_CONDUCT', code_of_conduct(COC_DE)), ('CODE_OF_CONDUCT.en', code_of_conduct(COC_EN))]: + (out / name).write_text(text, encoding='utf-8')