Compare commits

...

No commits in common. "main" and "start" have entirely different histories.
main ... start

88 changed files with 126 additions and 5748 deletions

View file

@ -1,27 +0,0 @@
#!/usr/bin/env bash
# Do not edit this file. It is automatically generated by https://www.oliverdavies.uk/build-configs.
# Load the issue ID from an `.issue-id` file within the project and replace the
# `ISSUE_ID` placeholder within a Git commit message.
#
# For example, running `echo "OD-123" > .issue-id` will add `Refs: OD-123` to
# the commit message.
#
# This also works with multiple issue IDs in the same string, e.g.
# "OD-123 OD-456", or IDs on multiple lines.
set -o errexit
set -o nounset
set -o pipefail
PROJECT_DIR=$(git rev-parse --show-toplevel)
ISSUE_FILE="$PROJECT_DIR/.issue-id"
if [ -f "${ISSUE_FILE}" ]; then
ISSUE_IDS=$(cat "${ISSUE_FILE}" | tr '\n' ',' | tr ' ' ',' | sed 's/,$//' | sed 's/,/, /g')
if [ -n "${ISSUE_IDS}" ]; then
sed -i.bak "s/# Refs:/Refs: $ISSUE_IDS/" "$1"
fi
fi

14
.gitignore vendored
View file

@ -1,11 +1,15 @@
# Do not edit this file. It is automatically generated by https://www.oliverdavies.uk/build-configs.
/.phpunit.result.cache
/output_*/
/vendor/
/*
/.direnv/
!/.gitignore
!/app/
!/build.yaml
!/composer.{json,lock}
!/justfile
!/source/
!/flake.{nix,lock}
!/assets/
/source/build/
/node_modules/

View file

@ -1,2 +0,0 @@
MD013: false
MD041: false

View file

@ -1,17 +0,0 @@
# This file is used by editors and IDEs to unify coding standards
# @see http://EditorConfig.org
# @standards PHP: http://www.php-fig.org/psr/psr-2/
root = true
# Default configuration (applies to all file types)
[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
indent_size = 4
indent_style = space
# Markdown customizations
[*.md]
trim_trailing_whitespace = false

View file

@ -1 +0,0 @@
use flake

View file

@ -1,27 +0,0 @@
#!/usr/bin/env bash
# Do not edit this file. It is automatically generated by https://www.oliverdavies.uk/build-configs.
# Load the issue ID from an `.issue-id` file within the project and replace the
# `ISSUE_ID` placeholder within a Git commit message.
#
# For example, running `echo "OD-123" > .issue-id` will add `Refs: OD-123` to
# the commit message.
#
# This also works with multiple issue IDs in the same string, e.g.
# "OD-123 OD-456", or IDs on multiple lines.
set -o errexit
set -o nounset
set -o pipefail
PROJECT_DIR=$(git rev-parse --show-toplevel)
ISSUE_FILE="$PROJECT_DIR/.issue-id"
if [ -f "${ISSUE_FILE}" ]; then
ISSUE_IDS=$(cat "${ISSUE_FILE}" | tr '\n' ',' | tr ' ' ',' | sed 's/,$//' | sed 's/,/, /g')
if [ -n "${ISSUE_IDS}" ]; then
sed -i.bak "s/# Refs:/Refs: $ISSUE_IDS/" "$1"
fi
fi

11
_finish/.gitignore vendored
View file

@ -1,11 +0,0 @@
# Do not edit this file. It is automatically generated by https://www.oliverdavies.uk/build-configs.
/.phpunit.result.cache
/output_*/
/vendor/
/.direnv/
!/assets/
/source/build/
/node_modules/

View file

@ -1,2 +0,0 @@
MD013: false
MD041: false

View file

@ -1,5 +0,0 @@
sculpin_content_types:
speakers:
permalink: /speaker/:basename/
posts:
enabled: false

View file

@ -1,39 +0,0 @@
name: 'PHPSW'
locale: en
talks:
- title: Building Static Websites with PHP and Sculpin
speaker: Oliver Davies
date: 2024-02-14
- title: 'FPGA^2: An open-source FPGA'
speaker: Robin Hodson
date: 2024-02-14
- title: Introducing Domain Driven Design
speaker: Rob Allen
date: 2024-01-10
- title: Building Better TUIs (with PHP)
speaker: Dan Leech
date: 2023-11-08
- title: Thoughts on Ubiquitous Language
speaker: Rob Allen
date: 2023-11-08
- title: Testing Legacy
speaker: Mike Karthauser
date: 2023-11-08
- title: Building "Build Configs"
speaker: Oliver Davies
date: 2023-11-08
- title: Terraform from a devs perspective
speaker: Nigel Dunn
date: 2023-10-11
- title: What is TDD and why should I care?
speaker: Naomi Gotts
date: 2023-07-12
- title: Go for PHP
speaker: Dan Leech
date: 2023-02-08
- title: What's new in PHP 8.*
speaker: Derick Rethans
date: 2023-02-11
- title: Behaviour Driven Development (BDD) in Practice
speaker: Ciaran McNulty
date: 2022-09-14

View file

@ -1,3 +0,0 @@
---
imports:
- sculpin_site.yml

View file

@ -1,14 +0,0 @@
import type { Config } from 'tailwindcss'
export default {
content: ['./source/**/*.{html,md,twig}'],
theme: {
extend: {
fontFamily: {
sans: ['Inter', 'sans-serif'],
}
},
},
plugins: [],
} satisfies Config

View file

@ -1,15 +0,0 @@
name: phpsw-sculpin-demo
template: sculpin-site
parameters:
flake:
devshell:
packages:
- nodejs
- php81
- php81Packages.composer
git:
ignore:
- '!/assets/'
- '/source/build/'
experimental:
createInclusiveGitIgnoreFile: true

View file

@ -1,10 +0,0 @@
{
"require": {
"sculpin/sculpin": "^3.0"
},
"config": {
"allow-plugins": {
"sculpin/sculpin-theme-composer-plugin": true
}
}
}

3607
_finish/composer.lock generated

File diff suppressed because it is too large Load diff

View file

@ -1,23 +0,0 @@
layout {
pane size=2 borderless=true {
plugin location="zellij:tab-bar"
}
pane split_direction="vertical" {
pane name="Editor" size="60%"
pane split_direction="horizontal" {
bash { args "-c" "vendor/bin/sculpin generate --server --watch"; }
bash { args "-c" "watch -n 1 tree output_dev"; }
}
}
pane size=2 borderless=true {
plugin location="zellij:status-bar"
}
pane_template name="bash" {
command "bash"
start_suspended true
}
}

View file

@ -1,27 +0,0 @@
{
"nodes": {
"nixpkgs": {
"locked": {
"lastModified": 1706550542,
"narHash": "sha256-UcsnCG6wx++23yeER4Hg18CXWbgNpqNXcHIo5/1Y+hc=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "97b17f32362e475016f942bbdfda4a4a72a8a652",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"root": {
"inputs": {
"nixpkgs": "nixpkgs"
}
}
},
"root": "root",
"version": 7
}

View file

@ -1,19 +0,0 @@
# Do not edit this file. It is automatically generated by https://www.oliverdavies.uk/build-configs.
{
description = "A Nix Flake for phpsw-sculpin-demo";
inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
outputs = { nixpkgs, ... }:
let
system = "x86_64-linux";
pkgs = nixpkgs.legacyPackages.${system};
inherit (pkgs) mkShell;
in {
devShells.${system}.default =
mkShell { buildInputs = with pkgs; [ nodejs php81 php81Packages.composer ]; };
formatter.${system} = pkgs.nixfmt;
};
}

1260
_finish/package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -1,5 +0,0 @@
{
"dependencies": {
"tailwindcss": "^3.4.0"
}
}

View file

@ -1,43 +0,0 @@
#!/usr/bin/env bash
# Do not edit this file. It is automatically generated by https://www.oliverdavies.uk/build-configs.
set -o errexit
set -o nounset
set -o pipefail
PATH="${PATH}:./vendor/bin"
# Generate the site.
function generate {
local args=()
if [[ "${APP_ENV:-}" == "production" ]]; then
args=(--env="prod")
else
args=(--server --watch)
fi
sculpin generate "${args[@]}" "${@}"
}
function help {
printf "%s <task> [args]\n\nTasks:\n" "${0}"
compgen -A function | grep -v "^_" | cat -n
printf "\nExtended help:\n Each task has comments for general usage\n"
}
# Start the project.
function start {
sculpin generate --server --watch "${@}"
}
# Include any local tasks.
[[ -e run.local ]] && source run.local
TIMEFORMAT="Task completed in %3lR"
time "${@:-help}"
# vim: ft=bash

View file

@ -1,41 +0,0 @@
{% if speakers is not empty %}
<section>
<h2 class="text-3xl font-bold text-center">Speakers</h2>
<div class="mt-8">
<div class="grid grid-cols-2 gap-10 px-4 mx-auto max-w-sm md:grid-cols-3 md:max-w-md lg:grid-cols-4 lg:gap-8 lg:max-w-full xl:grid-cols-6">
{% set speakersAndDates = [] %}
{% for speaker in speakers %}
{% set talksForSpeaker = talks|default([])|filter(talk => talk.speaker == speaker.name) %}
{% set mostRecentTalk = talksForSpeaker|first %}
{% set speakersAndDates = speakersAndDates|merge([{
date: mostRecentTalk.date,
speaker,
}]) %}
{% endfor %}
{% set sortedSpeakers = speakersAndDates|sort((a, b) => b.date <=> a.date) %}
{% for speaker in sortedSpeakers|column('speaker') %}
<div>
<a href="{{ speaker.url }}" class="flex flex-col-reverse gap-3 items-center group">
<div class="text-center">
<p class="text-base group-hover:underline">{{ speaker.name }}</p>
</div>
<div>
<img
alt="Photo of {{ speaker.name }}"
class="object-cover flex-shrink-0 rounded-full shadow-lg size-20 lg:size-32 xl:size-24"
src="{{ speaker.imageUrl }}"
/>
</div>
</a>
</div>
{% endfor %}
</div>
</div>
</section>
{% endif %}

View file

@ -1,13 +0,0 @@
<!DOCTYPE html>
<html lang="{{ site.locale|default('en') }}">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>{{ site.name|default('Sculpin Skeleton') }}</title>
<link rel="stylesheet" href="/build/tailwind.css">
</head>
<body class="font-sans text-lg text-gray-800">
{% block body %}{% endblock %}
</body>
</html>

View file

@ -1,9 +0,0 @@
{% extends 'app' %}
{% block body %}
<div class="p-10 mx-auto max-w-4xl">
{% block content_wrapper %}
{% block content %}{% endblock %}
{% endblock %}
</div>
{% endblock %}

View file

@ -1,34 +0,0 @@
{% extends 'default' %}
{% block content_wrapper %}
<h1 class="text-3xl font-bold text-center md:text-left">{{ page.name }}</h1>
<div class="mt-6">
<img
alt="Photo of {{ page.name }}"
class="object-cover flex-shrink-0 rounded-full shadow-lg size-40"
src="{{ page.imageUrl }}"
/>
</div>
<div class="mt-10">
<em>{{ block('content') }}</em>
</div>
{% set talks = site.talks|filter(talk => talk.speaker == page.name) %}
{% if talks is not empty %}
<section class="mt-10">
<h2 class="text-2xl font-bold">Talks <span class="sr-only"> by {{ page.name }}</span></h2>
<div class="mt-6">
<ul class="pl-4 list-disc">
{% for talk in talks %}
<li>
<a class="hover:underline" href="#0">{{ talk.title }}</a>
</li>
{% endfor %}
</ul>
</div>
</section>
{% endif %}
{% endblock %}

View file

@ -1,4 +0,0 @@
---
name: Ciaran McNulty
imageUrl: /images/ciaran.jpg
---

View file

@ -1,4 +0,0 @@
---
name: Dan Leech
imageUrl: /images/highres_257208698.jpeg
---

View file

@ -1,6 +0,0 @@
---
name: Dave Liddament
imageUrl: /images/highres_203797572.jpeg
---
Director and Developer at Lamp Bristol. PHP, Java and Python software developer.

View file

@ -1,4 +0,0 @@
---
name: Derick Rethans
imageUrl: /images/highres_276685584.jpeg
---

View file

@ -1,6 +0,0 @@
---
name: James Titcumb
imageUrl: /images/highres_134740252.jpeg
---
James is the founder of the UK based PHP Hampshire user group, a Zend Certified Engineer and Development Manager at Protected.co.uk.

View file

@ -1,6 +0,0 @@
---
name: Mike Karthauser
imageUrl: /images/highres_80709042.jpeg
---
Dev since '98. PHP since '03.

View file

@ -1,4 +0,0 @@
---
name: Naomi Gotts
imageUrl: /images/highres_311941362.jpeg
---

View file

@ -1,4 +0,0 @@
---
name: Nigel Dunn
imageUrl: /images/highres_131268052.jpeg
---

View file

@ -1,6 +0,0 @@
---
name: Oliver Davies
imageUrl: /images/highres_317091329.jpeg
---
Full Stack Software Consultant. Drupal and PHP expert.

View file

@ -1,6 +0,0 @@
---
name: Rob Allen
imageUrl: /images/highres_312615346.jpeg
---
PHP developer from Worcester.

View file

@ -1,6 +0,0 @@
---
name: Robin Hodson
imageUrl: /images/highres_243972257.jpeg
---
Ready to look for coding/hardware work post-lockdown, now largely recovered from stressful experiences. Accepted work from the government in September/October; currently realigning goals plus getting things I've been working on a bit more tangible.

View file

@ -1,4 +0,0 @@
---
name: Ryan Lee
imageUrl: /images/highres_273691940.jpeg
---

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 758 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 154 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 794 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.2 KiB

View file

@ -1,9 +0,0 @@
---
layout: default
use: [speakers]
---
{% include 'speakers/recent-speakers' with {
speakers: data.speakers,
talks: site.talks,
} %}

View file

@ -1,5 +1,3 @@
sculpin_content_types:
speakers:
permalink: /speaker/:basename/
posts:
enabled: false

View file

@ -1,39 +1,40 @@
name: 'PHPSW'
locale: en
talks:
- title: Building Static Websites with PHP and Sculpin
speaker: Oliver Davies
date: 2024-02-14
- title: 'FPGA^2: An open-source FPGA'
speaker: Robin Hodson
date: 2024-02-14
- title: Introducing Domain Driven Design
speaker: Rob Allen
date: 2024-01-10
- title: Building Better TUIs (with PHP)
speaker: Dan Leech
date: 2023-11-08
- title: Thoughts on Ubiquitous Language
speaker: Rob Allen
date: 2023-11-08
- title: Testing Legacy
speaker: Mike Karthauser
date: 2023-11-08
- title: Building "Build Configs"
speaker: Oliver Davies
date: 2023-11-08
- title: Terraform from a devs perspective
speaker: Nigel Dunn
date: 2023-10-11
- title: What is TDD and why should I care?
speaker: Naomi Gotts
date: 2023-07-12
- title: Go for PHP
speaker: Dan Leech
date: 2023-02-08
- title: What's new in PHP 8.*
speaker: Derick Rethans
date: 2023-02-11
- title: Behaviour Driven Development (BDD) in Practice
speaker: Ciaran McNulty
date: 2022-09-14
speakers:
-
name: Oliver Davies
imageUrl: https://secure.meetupstatic.com/photos/member/c/8/8/1/highres_317091329.jpeg
-
name: Robin Hodson
imageUrl: https://secure.meetupstatic.com/photos/member/2/f/e/1/highres_243972257.jpeg
-
name: Rob Allen
imageUrl: https://secure.meetupstatic.com/photos/member/3/b/f/2/highres_312615346.jpeg
-
name: Dan Leech
imageUrl: https://secure.meetupstatic.com/photos/member/b/e/3/a/highres_257208698.jpeg
-
name: Mike Karthauser
imageUrl: https://secure.meetupstatic.com/photos/member/2/3/5/2/highres_80709042.jpeg
-
name: Nigel Dunn
imageUrl: https://secure.meetupstatic.com/photos/member/b/b/b/4/highres_131268052.jpeg
-
name: Naomi Gotts
imageUrl: https://secure.meetupstatic.com/photos/member/5/5/2/highres_311941362.jpeg
-
name: Ryan Lee
imageUrl: https://secure.meetupstatic.com/photos/member/7/c/c/4/highres_273691940.jpeg
-
name: James Titcumb
imageUrl: https://secure.meetupstatic.com/photos/member/9/d/3/c/highres_134740252.jpeg
-
name: Derick Rethans
imageUrl: https://secure.meetupstatic.com/photos/member/6/3/f/0/highres_276685584.jpeg
-
name: Dave Liddament
imageUrl: https://secure.meetupstatic.com/photos/member/9/2/c/4/highres_203797572.jpeg
-
name: Ciaran McNulty
imageUrl: /images/ciaran.jpg

View file

@ -1,15 +0,0 @@
name: phpsw-sculpin-demo
template: sculpin-site
parameters:
flake:
devshell:
packages:
- nodejs
- php81
- php81Packages.composer
git:
ignore:
- '!/assets/'
- '/source/build/'
experimental:
createInclusiveGitIgnoreFile: true

18
build.yaml Normal file
View file

@ -0,0 +1,18 @@
name: phpsw-sculpin-demo
type: sculpin
language: php
flake:
devshell:
packages:
- nodejs
- php81
- php81Packages.composer
git:
ignore:
- '!/assets/'
- '/source/build/'
experimental:
createInclusiveGitIgnoreFile: true

View file

@ -1,19 +1,26 @@
# Do not edit this file. It is automatically generated by https://www.oliverdavies.uk/build-configs.
{
description = "A Nix Flake for phpsw-sculpin-demo";
inputs = {
devshell.url = "github:numtide/devshell";
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
};
inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
outputs = inputs@{ flake-parts, ... }:
flake-parts.lib.mkFlake { inherit inputs; } {
imports = [ inputs.devshell.flakeModule ];
outputs = { nixpkgs, ... }:
let
system = "x86_64-linux";
pkgs = nixpkgs.legacyPackages.${system};
systems = [ "x86_64-linux" ];
inherit (pkgs) mkShell;
in {
devShells.${system}.default =
mkShell { buildInputs = with pkgs; [ nodejs php81 php81Packages.composer ]; };
formatter.${system} = pkgs.nixfmt;
perSystem = { config, self', inputs', pkgs, system, ... }: {
devshells.default = {
packages = with pkgs; [
"just"
"nodejs"
"php81"
"php81Packages.composer"
];
};
};
};
}

36
justfile Normal file
View file

@ -0,0 +1,36 @@
_default:
just --list
build-css:
#!/usr/bin/env bash
args=()
if [[ "${NODE_ENV:-}" == "production" ]]; then
args=(--minify)
else
args=(--watch)
fi
npx tailwindcss \
--config assets/tailwind.config.ts \
--output source/build/tailwind.css "${args[@]}"
clean:
rm -fr output_*/ source/build/
generate *args:
#!/usr/bin/env bash
args=()
if [[ "${APP_ENV:-}" == "production" ]]; then
args=(--env="prod")
else
args=(--server --watch)
fi
./vendor/bin/sculpin generate "${args[@]}" {{ args }}
start *args:
just generate {{ args }} \
& just build-css \
& wait

View file

@ -1,16 +0,0 @@
Install dependencies:
composer install
npm install
Build the CSS:
./vendor/bin/sculpin generate -e prod
npx tailwindcss -c assets/tailwind.config.ts -o source/build/tailwind.css
NODE_ENV=production npx tailwindcss -c assets/tailwind.config.ts -o source/build/tailwind.css
Generate the site:
./vendor/bin/sculpin generate -e prod
rsync -avz output_prod ssh.oliverdavies.uk:~/phpsw-sculpin-demo

43
run
View file

@ -1,43 +0,0 @@
#!/usr/bin/env bash
# Do not edit this file. It is automatically generated by https://www.oliverdavies.uk/build-configs.
set -o errexit
set -o nounset
set -o pipefail
PATH="${PATH}:./vendor/bin"
# Generate the site.
function generate {
local args=()
if [[ "${APP_ENV:-}" == "production" ]]; then
args=(--env="prod")
else
args=(--server --watch)
fi
sculpin generate "${args[@]}" "${@}"
}
function help {
printf "%s <task> [args]\n\nTasks:\n" "${0}"
compgen -A function | grep -v "^_" | cat -n
printf "\nExtended help:\n Each task has comments for general usage\n"
}
# Start the project.
function start {
sculpin generate --server --watch "${@}"
}
# Include any local tasks.
[[ -e run.local ]] && source run.local
TIMEFORMAT="Task completed in %3lR"
time "${@:-help}"
# vim: ft=bash

View file

@ -1,148 +0,0 @@
local fmt = require("luasnip.extras.fmt").fmt
local ls = require "luasnip"
local s = ls.snippet
local t = ls.text_node
ls.add_snippets("twig", {
s(
"sortdate",
fmt(
[[
{{% set speakersAndDates = [] %}}
{{% for speaker in speakers %}}
{{% set talksForSpeaker = talks|default([])|filter(talk =>> talk.speaker == speaker.name) %}}
{{% set mostRecentTalk = talksForSpeaker|first %}}
{{% set speakersAndDates = speakersAndDates|merge([{{
date: mostRecentTalk.date,
speaker,
}}]) %}}
{{% endfor %}}
{{% set sortedSpeakers = speakersAndDates|sort((a, b) => b.date <=> a.date) %}}
{{% for speaker in sortedSpeakers|column('speaker') %}}
]],
{}
)
),
s("sortname", { t "{% for speaker in site.speakers|sort((a, b) => a.name <=> b.name) %}" }),
s(
"speakerpage",
fmt(
[[
{{% block content_wrapper %}}
<h1 class="text-3xl font-bold text-center md:text-left">{{{{ page.name }}}}</h1>
<div class="mt-6">
<img
alt="Photo of {{{{ page.name }}}}"
class="object-cover flex-shrink-0 rounded-full shadow-lg size-40"
src="{{{{ page.imageUrl }}}}"
/>
</div>
<div class="mt-10">
<em>{{{{ block('content') }}}}</em>
</div>
{{% endblock %}}
]],
{}
)
),
s(
"speaker",
fmt(
[[
<div>
<a href="#" class="flex flex-col-reverse gap-3 items-center group">
<div class="text-center">
<p class="text-base group-hover:underline">{{{{ speaker.name }}}}</p>
</div>
<div>
<img
alt="Photo of {{{{ speaker.name }}}}"
class="object-cover flex-shrink-0 rounded-full shadow-lg size-20 lg:size-32 xl:size-24"
src="{{{{ speaker.imageUrl }}}}" /> </div>
</a>
</div>
]],
{}
)
),
s(
"speakers",
fmt(
[[
<section>
<h2 class="text-3xl font-bold text-center">Speakers</h2>
<div class="mt-8">
<div class="grid grid-cols-2 gap-10 px-4 mx-auto max-w-sm md:grid-cols-3 md:max-w-md lg:grid-cols-4 lg:gap-8 lg:max-w-full xl:grid-cols-6">
{{% for speaker in site.speakers %}}
{{% endfor %}}
</div>
</div>
</section>
]],
{}
)
),
})
ls.add_snippets("yaml", {
s(
"talks",
fmt(
[[
talks:
- title: Building Static Websites with PHP and Sculpin
speaker: Oliver Davies
date: 2024-02-14
- title: 'FPGA^2: An open-source FPGA'
speaker: Robin Hodson
date: 2024-02-14
- title: Introducing Domain Driven Design
speaker: Rob Allen
date: 2024-01-10
- title: Building Better TUIs (with PHP)
speaker: Dan Leech
date: 2023-11-08
- title: Thoughts on Ubiquitous Language
speaker: Rob Allen
date: 2023-11-08
- title: Testing Legacy
speaker: Mike Karthauser
date: 2023-11-08
- title: Building "Build Configs"
speaker: Oliver Davies
date: 2023-11-08
- title: Terraform from a devs perspective
speaker: Nigel Dunn
date: 2023-10-11
- title: What is TDD and why should I care?
speaker: Naomi Gotts
date: 2023-07-12
- title: Go for PHP
speaker: Dan Leech
date: 2023-02-08
- title: What's new in PHP 8.*
speaker: Derick Rethans
date: 2023-02-11
- title: Behaviour Driven Development (BDD) in Practice
speaker: Ciaran McNulty
date: 2022-09-14
]],
{}
)
),
})

View file

@ -1,41 +0,0 @@
{% if speakers is not empty %}
<section>
<h2 class="text-3xl font-bold text-center">Speakers</h2>
<div class="mt-8">
<div class="grid grid-cols-2 gap-10 px-4 mx-auto max-w-sm md:grid-cols-3 md:max-w-md lg:grid-cols-4 lg:gap-8 lg:max-w-full xl:grid-cols-6">
{% set speakersAndDates = [] %}
{% for speaker in speakers %}
{% set talksForSpeaker = talks|default([])|filter(talk => talk.speaker == speaker.name) %}
{% set mostRecentTalk = talksForSpeaker|first %}
{% set speakersAndDates = speakersAndDates|merge([{
date: mostRecentTalk.date,
speaker,
}]) %}
{% endfor %}
{% set sortedSpeakers = speakersAndDates|sort((a, b) => b.date <=> a.date) %}
{% for speaker in sortedSpeakers|column('speaker') %}
<div>
<a href="{{ speaker.url }}" class="flex flex-col-reverse gap-3 items-center group">
<div class="text-center">
<p class="text-base group-hover:underline">{{ speaker.name }}</p>
</div>
<div>
<img
alt="Photo of {{ speaker.name }}"
class="object-cover flex-shrink-0 rounded-full shadow-lg size-20 lg:size-32 xl:size-24"
src="{{ speaker.imageUrl }}"
/>
</div>
</a>
</div>
{% endfor %}
</div>
</div>
</section>
{% endif %}

View file

@ -2,8 +2,6 @@
{% block body %}
<div class="p-10 mx-auto max-w-4xl">
{% block content_wrapper %}
{% block content %}{% endblock %}
{% endblock %}
</div>
{% endblock %}

View file

@ -1,34 +0,0 @@
{% extends 'default' %}
{% block content_wrapper %}
<h1 class="text-3xl font-bold text-center md:text-left">{{ page.name }}</h1>
<div class="mt-6">
<img
alt="Photo of {{ page.name }}"
class="object-cover flex-shrink-0 rounded-full shadow-lg size-40"
src="{{ page.imageUrl }}"
/>
</div>
<div class="mt-10">
<em>{{ block('content') }}</em>
</div>
{% set talks = site.talks|filter(talk => talk.speaker == page.name) %}
{% if talks is not empty %}
<section class="mt-10">
<h2 class="text-2xl font-bold">Talks <span class="sr-only"> by {{ page.name }}</span></h2>
<div class="mt-6">
<ul class="pl-4 list-disc">
{% for talk in talks %}
<li>
<a class="hover:underline" href="#0">{{ talk.title }}</a>
</li>
{% endfor %}
</ul>
</div>
</section>
{% endif %}
{% endblock %}

View file

@ -1,4 +0,0 @@
---
name: Ciaran McNulty
imageUrl: /images/ciaran.jpg
---

View file

@ -1,4 +0,0 @@
---
name: Dan Leech
imageUrl: /images/highres_257208698.jpeg
---

View file

@ -1,6 +0,0 @@
---
name: Dave Liddament
imageUrl: /images/highres_203797572.jpeg
---
Director and Developer at Lamp Bristol. PHP, Java and Python software developer.

View file

@ -1,4 +0,0 @@
---
name: Derick Rethans
imageUrl: /images/highres_276685584.jpeg
---

View file

@ -1,6 +0,0 @@
---
name: James Titcumb
imageUrl: /images/highres_134740252.jpeg
---
James is the founder of the UK based PHP Hampshire user group, a Zend Certified Engineer and Development Manager at Protected.co.uk.

View file

@ -1,6 +0,0 @@
---
name: Mike Karthauser
imageUrl: /images/highres_80709042.jpeg
---
Dev since '98. PHP since '03.

View file

@ -1,4 +0,0 @@
---
name: Naomi Gotts
imageUrl: /images/highres_311941362.jpeg
---

View file

@ -1,4 +0,0 @@
---
name: Nigel Dunn
imageUrl: /images/highres_131268052.jpeg
---

View file

@ -1,6 +0,0 @@
---
name: Oliver Davies
imageUrl: /images/highres_317091329.jpeg
---
Full Stack Software Consultant. Drupal and PHP expert.

View file

@ -1,6 +0,0 @@
---
name: Rob Allen
imageUrl: /images/highres_312615346.jpeg
---
PHP developer from Worcester.

View file

@ -1,6 +0,0 @@
---
name: Robin Hodson
imageUrl: /images/highres_243972257.jpeg
---
Ready to look for coding/hardware work post-lockdown, now largely recovered from stressful experiences. Accepted work from the government in September/October; currently realigning goals plus getting things I've been working on a bit more tangible.

View file

@ -1,4 +0,0 @@
---
name: Ryan Lee
imageUrl: /images/highres_273691940.jpeg
---

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 758 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 154 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 794 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.2 KiB

View file

@ -1,9 +0,0 @@
---
layout: default
use: [speakers]
---
{% include 'speakers/recent-speakers' with {
speakers: data.speakers,
talks: site.talks,
} %}

5
source/index.md Normal file
View file

@ -0,0 +1,5 @@
---
layout: default
---
Hello, PHPSW!