Initial commit

This commit is contained in:
Oliver Davies 2024-02-06 08:00:00 +00:00
commit 6357cf0c60
69 changed files with 10490 additions and 0 deletions

17
.editorconfig Normal file
View file

@ -0,0 +1,17 @@
# 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

1
.envrc Normal file
View file

@ -0,0 +1 @@
use flake

27
.githooks/prepare-commit-msg Executable file
View file

@ -0,0 +1,27 @@
#!/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
.gitignore vendored Normal file
View file

@ -0,0 +1,11 @@
# 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/

2
.markdownlint.yaml Normal file
View file

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

17
_finish/.editorconfig Normal file
View file

@ -0,0 +1,17 @@
# 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

1
_finish/.envrc Normal file
View file

@ -0,0 +1 @@
use flake

View file

@ -0,0 +1,27 @@
#!/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 Normal file
View file

@ -0,0 +1,11 @@
# 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

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

View file

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

View file

@ -0,0 +1,39 @@
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

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

View file

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

View file

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

10
_finish/composer.json Normal file
View file

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

3607
_finish/composer.lock generated Normal file

File diff suppressed because it is too large Load diff

23
_finish/dev.kdl Normal file
View file

@ -0,0 +1,23 @@
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
}
}

27
_finish/flake.lock Normal file
View file

@ -0,0 +1,27 @@
{
"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
}

19
_finish/flake.nix Normal file
View file

@ -0,0 +1,19 @@
# 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 Normal file

File diff suppressed because it is too large Load diff

5
_finish/package.json Normal file
View file

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

43
_finish/run Executable file
View file

@ -0,0 +1,43 @@
#!/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

View file

@ -0,0 +1,41 @@
{% 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

@ -0,0 +1,13 @@
<!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

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

View file

@ -0,0 +1,34 @@
{% 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

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

View file

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

View file

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

View file

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

View file

@ -0,0 +1,6 @@
---
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

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

View file

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

View file

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

View file

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

View file

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

View file

@ -0,0 +1,6 @@
---
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

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 758 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 154 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 794 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

View file

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

View file

@ -0,0 +1,3 @@
sculpin_content_types:
posts:
enabled: false

View file

@ -0,0 +1,2 @@
name: 'My New Sculpin Site'
locale: en

View file

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

14
assets/tailwind.config.ts Normal file
View file

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

15
build-configs.yaml Normal file
View file

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

10
composer.json Normal file
View file

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

3607
composer.lock generated Normal file

File diff suppressed because it is too large Load diff

132
flake.lock Normal file
View file

@ -0,0 +1,132 @@
{
"nodes": {
"devshell": {
"inputs": {
"flake-utils": "flake-utils",
"nixpkgs": "nixpkgs"
},
"locked": {
"lastModified": 1705332421,
"narHash": "sha256-USpGLPme1IuqG78JNqSaRabilwkCyHmVWY0M9vYyqEA=",
"owner": "numtide",
"repo": "devshell",
"rev": "83cb93d6d063ad290beee669f4badf9914cc16ec",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "devshell",
"type": "github"
}
},
"flake-parts": {
"inputs": {
"nixpkgs-lib": "nixpkgs-lib"
},
"locked": {
"lastModified": 1706569497,
"narHash": "sha256-oixb0IDb5eZYw6BaVr/R/1pSoMh4rfJHkVnlgeRIeZs=",
"owner": "hercules-ci",
"repo": "flake-parts",
"rev": "60c614008eed1d0383d21daac177a3e036192ed8",
"type": "github"
},
"original": {
"id": "flake-parts",
"type": "indirect"
}
},
"flake-utils": {
"inputs": {
"systems": "systems"
},
"locked": {
"lastModified": 1701680307,
"narHash": "sha256-kAuep2h5ajznlPMD9rnQyffWG8EM/C73lejGofXvdM8=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "4022d587cbbfd70fe950c1e2083a02621806a725",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "flake-utils",
"type": "github"
}
},
"nixpkgs": {
"locked": {
"lastModified": 1704161960,
"narHash": "sha256-QGua89Pmq+FBAro8NriTuoO/wNaUtugt29/qqA8zeeM=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "63143ac2c9186be6d9da6035fa22620018c85932",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixpkgs-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs-lib": {
"locked": {
"dir": "lib",
"lastModified": 1703961334,
"narHash": "sha256-M1mV/Cq+pgjk0rt6VxoyyD+O8cOUiai8t9Q6Yyq4noY=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "b0d36bd0a420ecee3bc916c91886caca87c894e9",
"type": "github"
},
"original": {
"dir": "lib",
"owner": "NixOS",
"ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs_2": {
"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": {
"devshell": "devshell",
"flake-parts": "flake-parts",
"nixpkgs": "nixpkgs_2"
}
},
"systems": {
"locked": {
"lastModified": 1681028828,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
"owner": "nix-systems",
"repo": "default",
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"type": "github"
},
"original": {
"owner": "nix-systems",
"repo": "default",
"type": "github"
}
}
},
"root": "root",
"version": 7
}

19
flake.nix Normal file
View file

@ -0,0 +1,19 @@
# 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
package-lock.json generated Normal file

File diff suppressed because it is too large Load diff

5
package.json Normal file
View file

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

43
run Executable file
View file

@ -0,0 +1,43 @@
#!/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

0
source/_includes/.keep Normal file
View file

View file

@ -0,0 +1,13 @@
<!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

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

5
source/index.md Normal file
View file

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