Compare commits

..

3 commits

3175 changed files with 0 additions and 1069765 deletions

1
.envrc
View file

@ -1 +0,0 @@
use flake

View file

@ -1,2 +0,0 @@
# Move source files into an `src` directory.
51c5f5759d667821fc94b9ed170de9a43dfbc848

8
.gitignore vendored
View file

@ -1,8 +0,0 @@
# Nix.
/.direnv/
/result
# pdfpc.
/**/*.pdfpc
/**/*.pdf

View file

@ -1,5 +0,0 @@
vim.keymap.set("n", "<leader>ta", '_iTextAnnotation "<Esc>A"<Esc>j')
vim.keymap.set("v", "<leader>ta", ':norm ITextAnnotation "<Esc>gv:norm A"<Esc>')
vim.keymap.set("n", "<Left>", "gT")
vim.keymap.set("n", "<Right>", "gt")

View file

@ -1,4 +0,0 @@
Talks and Presentations by Oliver Davies
########################################
The source files for `my presentation slides <https://www.oliverdavies.uk/presentations>`_, written in reStructuredText and compiled using `rst2pdf <https://rst2pdf.org>`_.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

View file

@ -1,27 +0,0 @@
.. raw:: pdf
PageBreak standardPage
Result
======
- Easier and faster to create and onboard projects.
- One canonical source of truth.
- Easy to add new features and fixes for all projects.
- Automation is easier due to consistency (e.g. Docker Compose service names).
Thanks!
=======
References:
- https://opdavi.es/build-configs
- https://github.com/opdavies/docker-example-drupal
- https://github.com/opdavies/docker-example-drupal-commerce-kickstart
- https://github.com/opdavies/docker-example-drupal-localgov
|
Me:
- https://www.oliverdavies.uk

View file

@ -1,52 +0,0 @@
.. raw:: pdf
PageBreak standardPage
Overriding Values
=================
.. code-block:: yaml
php:
version: 8.1-fpm-bullseye
# Disable PHPCS, PHPStan and PHPUnit.
phpcs: false
phpstan: false
phpunit: false
# Ignore more directories from Git.
git:
ignore:
- /bin/
- /libraries/
- /web/profiles/contrib/
.. raw:: pdf
TextAnnotation "Drupal Commerce Kickstart demo. No custom modules to test, and additional paths to ignore from Git."
PageBreak
.. code-block:: yaml
dockerfile:
stages:
build:
# What additional directories do we need?
extra_directories:
- config
- patches
- scripts
commands:
- composer validate --strict
- composer install
# What additional PHP extensions do we need?
extensions:
install: [bcmath]
.. raw:: pdf
TextAnnotation "Extra directories and PHP extensions that need to be added".

View file

@ -1,92 +0,0 @@
Example
=======
build.yaml:
.. code-block:: yaml
name: my-example-project
type: drupal
language: php
php:
version: 8.1-fpm-bullseye
|
Dockerfile:
.. raw:: pdf
TextAnnotation "Abstract the project-specific values and configuration into this file."
.. code-block:: yaml
FROM php:8.1-fpm-bullseye AS base
Configuring a Project
=====================
.. code-block:: yaml
php:
version: 8.1-fpm-bullseye
# Which PHPCS standards should be used and on which paths?
phpcs:
paths: [web/modules/custom]
standards: [Drupal, DrupalPractice]
# What level should PHPStan run and on what paths?
phpstan:
level: max
paths: [web/modules/custom]
.. raw:: pdf
PageBreak
.. code-block:: yaml
docker-compose:
# Which Docker Compose services do we need?
services:
- database
- php
- web
dockerfile:
stages:
build:
# What commands do we need to run?
commands:
- composer validate --strict
- composer install
.. raw:: pdf
PageBreak
.. code-block:: yaml
web:
type: nginx # nginx, apache, caddy
database:
type: mariadb # mariadb, mysql
version: 10
# Where is Drupal located?
drupal:
docroot: web # web, docroot, null
experimental:
createGitHubActionsConfiguration: true
runGitHooksBeforePush: true
useNewDatabaseCredentials: true
.. raw:: pdf
TextAnnotation "Experimental opt-in features that I want to trial on certain projects or to disable non-applicable features - e.g. GitHub Actions on Bitbucket."
PageBreak

View file

@ -1,300 +0,0 @@
.. raw:: pdf
PageBreak titlePage
.. class:: centredtitle
Build Configs internals
.. raw:: pdf
PageBreak standardPage
.. code-block::
src/
Action/
CreateFinalConfigurationData.php
CreateListOfFilesToGenerate.php
GenerateConfigurationFiles.php
ValidateConfigurationData.php
Command/
GenerateCommand.php
InitCommand.php
DataTransferObject/
ConfigDto.php
TemplateFile.php
Enum/
Language.php
ProjectType.php
WebServer.php
.. code-block:: php
:linenos:
:startinline: true
protected function configure(): void
$this
->addOption(
name: 'config-file',
shortcut: ['c'],
mode: InputOption::VALUE_REQUIRED,
description: 'The path to the project\'s build.yaml file',
default: 'build.yaml',
)
->addOption(
name: 'output-dir',
shortcut: ['o'],
mode: InputOption::VALUE_REQUIRED,
description: 'The directory to create files in',
default: '.',
);
}
.. code-block:: php
:linenos:
:startinline: true
protected function execute(InputInterface $input, OutputInterface $output): int
{
$io = new SymfonyStyle($input, $output);
$configFile = $input->getOption(name: 'config-file');
$outputDir = $input->getOption(name: 'output-dir');
}
.. raw:: pdf
PageBreak
.. code-block:: php
:linenos:
:startinline: true
protected function execute(InputInterface $input, OutputInterface $output): int
{
// ...
$pipelines = [
new CreateFinalConfigurationData(),
new ValidateConfigurationData(),
new CreateListOfFilesToGenerate(),
new GenerateConfigurationFiles(
$this->filesystem,
$this->twig,
$outputDir,
),
];
}
.. code-block:: php
:linenos:
:startinline: true
protected function execute(InputInterface $input, OutputInterface $output): int
{
// ...
/**
* @var Collection<int,TemplateFile> $generatedFiles
* @var ConfigDto $configurationData
*/
[$configurationData, $generatedFiles] = (new Pipeline())
->send($configFile)
->through($pipelines)
->thenReturn();
$io->info("Building configuration for {$configurationData->name}.");
$io->write('Generated files:');
$io->listing(static::getListOfFiles(filesToGenerate: $generatedFiles)->toArray());
return Command::SUCCESS;
}
.. code-block:: php
:linenos:
:startinline: true
// CreateFinalConfigurationData.php
public function handle(string $configFile, \Closure $next) {
{
$configurationData = Yaml::parseFile(filename: $configFile);
$configurationData = array_replace_recursive(
Yaml::parseFile(filename: __DIR__ . '/../../resources/build.defaults.yaml'),
$configurationData,
);
// ...
return $next($configurationData);
}
.. raw:: pdf
PageBreak
.. code-block:: php
:linenos:
:startinline: true
// ValidateConfigurationData.php
public function handle(array $configurationData, \Closure $next)
{
// Convert the input to a configuration data object.
$normalizer = new ObjectNormalizer(null, new CamelCaseToSnakeCaseNameConverter());
$serializer = new Serializer([$normalizer], [new JsonEncoder()]);
$configurationDataDto = $serializer->deserialize(
json_encode($configurationData),
ConfigDto::class,
'json',
);
// ...
}
.. raw:: pdf
PageBreak
.. code-block:: php
:linenos:
:startinline: true
// ValidateConfigurationData.php
public function handle(array $configurationData, \Closure $next)
{
// ...
$validator = Validation::createValidatorBuilder()
->enableAnnotationMapping()
->getValidator();
$violations = $validator->validate($configurationDataDto);
if (0 < $violations->count()) {
throw new \RuntimeException('Configuration is invalid.');
}
return $next([$configurationData, $configurationDataDto]);
}
.. code-block:: php
:linenos:
:startinline: true
// ConfigDto.php
#[Assert\Collection(
allowExtraFields: false,
fields: ['docroot' => new Assert\Choice([null, 'web', 'docroot'])],
)]
public array $drupal;
#[Assert\Collection([
'ignore' => new Assert\Optional([
new Assert\All([
new Assert\Type('string'),
]),
]),
])]
public array $git;
#[Assert\Choice(choices: ['javascript', 'php', 'typescript'])]
public string $language;
#[Assert\NotBlank]
#[Assert\Type('string')]
public string $name;
#[Assert\Type('string')]
public string $projectRoot;
#[Assert\Choice(choices: [
'drupal',
'fractal',
'php-library',
'symfony',
])]
public string $type;
.. code-block:: php
:startinline: true
:linenos:
// CreateListOfFilesToGenerate.php
public function handle(array $configurationDataAndDto, \Closure $next)
{
/**
* @var ConfigDto $configDto,
* @var array<string,mixed> $configurationData
*/
[$configurationData, $configDto] = $configurationDataAndDto;
/** @var Collection<int, TemplateFile> */
$filesToGenerate = collect();
// ...
}
.. code-block:: php
:startinline: true
:linenos:
// CreateListOfFilesToGenerate.php
public function handle(array $configurationDataAndDto, \Closure $next)
{
// ...
if (!isset($configDto->php['phpunit']) || $configDto->php['phpunit'] !== false) {
$filesToGenerate->push(
new TemplateFile(
data: 'drupal/phpunit.xml.dist',
name: 'phpunit.xml.dist',
)
);
}
// ...
return $next([$configurationData, $configDto, $filesToGenerate]);
}
.. code-block:: php
:linenos:
:startinline: true
// GenerateConfigurationFiles.php
public function handle(array $filesToGenerateAndConfigurationData, \Closure $next)
{
// ...
$filesToGenerate->each(function(TemplateFile $templateFile) use ($configurationData): void {
if ($templateFile->path !== null) {
if (!$this->filesystem->exists($templateFile->path)) {
$this->filesystem->mkdir("{$this->outputDir}/{$templateFile->path}");
}
}
$sourceFile = "{$templateFile->data}.twig";
$outputFile = collect([$this->outputDir, $templateFile->path, $templateFile->name])
->filter()->implode('/');
$this->filesystem->dumpFile($outputFile, $this->twig->render($sourceFile, $configurationData));
});
return $next([$configurationDataDto, $filesToGenerate]);
}

View file

@ -1,55 +0,0 @@
.. raw:: pdf
PageBreak standardPage
What is "Build Configs"?
========================
- Command-line tool.
- Inspired by Workspace, name from the TheAltF4Stream.
- Built with Symfony.
- Creates and manages build configuration files.
- Customisable per-project.
- Drupal, PHP library, Fractal (TypeScript).
- "Sprint zero in a box".
What Problem Does it Solve?
===========================
- I work on multiple similar projects.
- Different configuration values - e.g. ``web`` vs. ``docroot``.
- Different versions of PHP, node, etc.
- Different Docker Compose (``fpm`` vs. ``apache`` images).
- Each project was separate.
- Difficult to add new features and fix bugs across all projects.
- Inconsistencies across projects.
- Out of the box solutions didn't seem like the best fit.
.. raw:: pdf
TextAnnotation "Multiple projects with similar but different configurations."
TextAnnotation ""
TextAnnotation "Out of the box solutions tend to focus on one technology, could be hard to customise, and usually had more than I nedeed."
TextAnnotation ""
TextAnnotation "Start small and build up instead of removing additional things."
TextAnnotation ""
TextAnnotation "More opportunities to learn the underlying technologies."
How Does it Work?
=================
.. image:: diagram.png
:width: 18cm
.. raw:: pdf
TextAnnotation "Canonical templates and project-specific configuration goes in, templates come out."
What Files Does it Generate?
============================
- Dockerfile, Docker Compose, Nix Flake, php.ini, NGINX default.conf.
- ``run`` file.
- PHPUnit, PHPCS, PHPStan.
- GitHub Actions workflow.
- Git hooks.

View file

@ -1,117 +0,0 @@
.. raw:: pdf
PageBreak standardPage
Dockerfile.twig
===============
.. code-block:: twig
:linenos:
FROM php:{{ php.version }} AS base
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
RUN which composer && composer -V
ARG DOCKER_UID=1000
ENV DOCKER_UID="${DOCKER_UID}"
WORKDIR {{ project_root }}
RUN adduser --disabled-password --uid "${DOCKER_UID}" app \
&& chown app:app -R {{ project_root }}
Dockerfile.twig
===============
.. code-block:: twig
:linenos:
{% if dockerfile.stages.build.extensions.install %}
RUN docker-php-ext-install
{{ dockerfile.stages.build.extensions.install|join(' ') }}
{% endif %}
COPY --chown=app:app phpunit.xml* ./
{% if dockerfile.stages.build.extra_files %}
COPY --chown=app:app {{ dockerfile.stages.build.extra_files|join(" ") }} ./
{% endif %}
{% for directory in dockerfile.stages.build.extra_directories %}
COPY --chown=app:app {{ directory }} {{ directory }}
{% endfor %}
docker-compose.yaml.twig
========================
.. code-block:: twig
:linenos:
services:
{% if "web" in dockerCompose.services %}
web:
<<: [*default-proxy, *default-app]
build:
context: .
target: web
depends_on:
- php
profiles: [web]
{% endif %}
phpstan.neon.dist.twig
======================
.. code-block:: twig
:linenos:
parameters:
level: {{ php.phpstan.level }}
excludePaths:
- *Test.php
- *TestBase.php
paths:
{% for path in php.phpstan.paths -%}
- {{ path }}
{%- endfor %}
{% if php.phpstan.baseline %}
includes:
- phpstan-baseline.neon
{% endif %}
phpunit.xml.dist.twig
=====================
.. code-block:: twig
:linenos:
<phpunit
beStrictAboutChangesToGlobalState="true"
beStrictAboutOutputDuringTests="false"
beStrictAboutTestsThatDoNotTestAnything="true"
bootstrap="{{ drupal.docroot }}/core/tests/bootstrap.php"
cacheResult="false"
colors="true"
failOnWarning="true"
printerClass="\Drupal\Tests\Listeners\HtmlOutputPrinter"
>
phpunit.xml.dist.twig
=====================
.. code-block:: twig
:linenos:
<testsuites>
<testsuite name="functional">
<directory>./{{ drupal.docroot }}/modules/custom/**/tests/**/Functional</directory>
</testsuite>
<testsuite name="kernel">
<directory>./{{ drupal.docroot }}/modules/custom/**/tests/**/Kernel</directory>
</testsuite>
<testsuite name="unit">
<directory>./{{ drupal.docroot }}/modules/custom/**/tests/**/Unit</directory>
</testsuite>
</testsuites>

View file

@ -1,29 +0,0 @@
.. footer:: @opdavies
Building "Build Configs"
########################
.. class:: titleslideinfo
Oliver Davies (@opdavies)
|
.. class:: titleslideinfo
https://opdavi.es/bco
.. include:: ./sections/intro.rst
.. include:: ./sections/example.rst
.. include:: ./sections/customisation.rst
.. include:: ./sections/templates.rst
.. raw:: pdf
PageBreak titlePage
.. class:: centredtitle
Demo
.. include:: ./sections/conclusion.rst

View file

@ -1,4 +0,0 @@
Building and presenting slide decks with rst2pdf
################################################
https://www.oliverdavies.uk/talks/building-presenting-slide-decks-rst2pdf

View file

@ -1,12 +0,0 @@
rst2pdf slides.rst
rst2pdf slides.rst --break-level 1 --stylesheets main
rst2pdf slides.rst \
--output slides.pdf \
--stylesheets main \
--break-level 1 \
--fit-background-mode scale \
--extension-module preprocess

View file

@ -1,4 +0,0 @@
.. code-block:: javascript
:include: code/additional-config-options.txt
:hl_lines: 2 3 4
:linenos:

View file

@ -1 +0,0 @@
.. include:: sections/intro.rst

View file

@ -1,3 +0,0 @@
.. raw:: pdf
PageBreak standardPage

View file

@ -1,6 +0,0 @@
pageTemplates:
standardPage:
frames: []
[3%, 3%, 92%, 92%]
showFooter: true
showHeader: false

View file

@ -1,29 +0,0 @@
linkColor: #24608a
styles:
normal:
fontSize: 24
leading: 32
textColor: #383745
bodytext:
alignment: TA_LEFT
heading:
fontSize: 20
spaceAfter: 16
textColor: #24608a
title:
fontSize: 300%
parent: heading
textColor: white
bullet-list:
commands: []
[LEFTPADDING, [0, 0], [1, -1], 10]
[RIGHTPADDING, [0, 0], [1, -1], 0]
[VALIGN, [0, 0], [-1, -1], TOP]
colWidths: ["20", null]
textColor: #aaaaaa

View file

@ -1,14 +0,0 @@
Building and presenting slide decks with rst2pdf
################################################
.. class:: titleslideinfo
Oliver Davies (@opdavies)
What is rst2pdf?
================
* "Use a text editor. Make a PDF."
* reStructuredText to PDF
* Each slide is a page

View file

@ -1,14 +0,0 @@
.. image:: images/editing.png
:width: 20cm
.. code-block:: php
:startinline: true
:linenos:
echo 'Hello world!';
.. raw:: pdf
TextAnnotation "This is a speaker note."

View file

@ -1,8 +0,0 @@
nodemon --ext rst,style,txt --exec "
rst2pdf slides.rst \
--output slides.pdf \
--stylesheets main \
--break-level 1 \
--fit-background-mode scale \
--extension-module preprocess
"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 225 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 119 KiB

View file

@ -1,169 +0,0 @@
.. footer:: @opdavies
Building and presenting slide decks with rst2pdf
################################################
|
.. class:: titleslideinfo
Oliver Davies (@opdavies)
.. raw:: pdf
TextAnnotation "Gave my first talk in 2012."
TextAnnotation "A talk about a tool (rst2pdf) that I've been using for the last couple of talks."
.. page:: standardPage
What have I used before?
========================
* **UI based:** Keynote, Google Slides, slides.com
* **HTML/JavaScript:** reveal.js
* **Markdown:** Deckset, Marp, reveal-md
What is rst2pdf?
================
* "Use a text editor. Make a PDF."
* reStructuredText to PDF
* Each slide is a page
* Page templates for layouts
* Not just for slide decks
* Table of contents, page numbers, headers, footers
.. raw:: pdf
TextAnnotation "Use the tools you're familiar with."
TextAnnotation "Similar to Markdown."
TextAnnotation "Primarily used for technical documentation within the Python community."
TextAnnotation "Now maintained by PHPers Rob Allen and Lorna Jane Mitchell."
TextAnnotation "Breaks at titles automatically, or you can add manual page breaks."
Advantages
==========
* Easy to start a new presentation, or update an existing one
* Version controllable
* Portable
* Content is searchable
* Easy to re-use content and/or styling
* Slides uploaded to SpeakerDeck straight away
.. page:: imagePage
.. image:: images/editing.png
:width: 23cm
.. page:: standardPage
Useful reStructuredText
=======================
.. code-block:: rst
:include: code/useful-rst-1.txt
:linenos:
Useful reStructuredText
=======================
.. code-block:: rst
:include: code/useful-rst-2.txt
:linenos:
Page Templates
==============
main.style:
.. code-block:: yaml
:include: code/page-templates-style.txt
slides.rst:
.. code-block:: rst
:include: code/page-templates-rst.txt
Keeping things organised
========================
Split slides into different sections:
.. code-block:: rst
:include: code/includes-sections.txt
|
Including code snippets from separate files:
.. code-block:: rst
:include: code/includes-code.txt
.. raw:: pdf
TextAnnotation "Includes!"
Styling
=======
.. code-block:: yaml
:include: code/styling.txt
:linenos:
Building
========
.. code-block::
:include: code/building.txt
Watching
========
Re-compiling when something changes.
|
.. code-block:: bash
:include: code/watching.txt
Presenting
==========
``pdfpc`` - PDF presenter console
|
.. code-block::
pdfpc slides.pdf
.. page:: imagePage
.. image:: images/pdfpc-1.png
:width: 23cm
.. raw:: pdf
PageBreak
.. image:: images/pdfpc-2.png
:width: 23cm
.. page:: standardPage
Thanks!
=======
References:
* https://rst2pdf.org
* https://github.com/rst2pdf/rst2pdf
* https://github.com/opdavies/talks
* https://oliverdavies.link/lorna-rst2pdf-talk
|
Me:
* https://www.oliverdavies.uk

View file

@ -1 +0,0 @@
use flake

View file

@ -1,10 +0,0 @@
/output_*/
/.phpunit.cache
/.phpunit.result.cache
# Nix
/.direnv/
# Composer
/vendor/

View file

@ -1,12 +0,0 @@
#!/usr/bin/env bash
export PATH="${PATH}:./vendor"
tmux new-window -dn shell
tmux new-window -dn server
tmux send-keys -t server "sculpin generate --server --watch" Enter
xdg-open http://localhost:8000
nvim

View file

@ -1,7 +0,0 @@
sculpin_content_types:
# speakers:
# permalink: /speakers/:basename/
# talks:
# permalink: /talks/:basename/
posts:
enabled: false

View file

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

View file

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

View file

@ -1,7 +0,0 @@
#!/usr/bin/env bash
set -euo pipefail
export PATH="$PATH:./vendor/bin"
sculpin generate "$@"

View file

@ -1,3 +0,0 @@
---
name: demo
template: php-sculpin

View file

@ -1,5 +0,0 @@
#!/usr/bin/env bash
set -euo pipefail
rm -rfv output_* vendor

View file

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

File diff suppressed because it is too large Load diff

View file

@ -1,27 +0,0 @@
{
"nodes": {
"nixpkgs": {
"locked": {
"lastModified": 1740828860,
"narHash": "sha256-cjbHI+zUzK5CPsQZqMhE3npTyYFt9tJ3+ohcfaOF/WM=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "303bd8071377433a2d8f76e684ec773d70c5b642",
"type": "github"
},
"original": {
"owner": "nixos",
"ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"root": {
"inputs": {
"nixpkgs": "nixpkgs"
}
}
},
"root": "root",
"version": 7
}

View file

@ -1,26 +0,0 @@
{
inputs.nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
outputs = inputs:
let
system = "x86_64-linux";
pkgs = import inputs.nixpkgs { inherit system; };
in
{
devShells.${system}.default =
with pkgs;
mkShell {
buildInputs = [
nodePackages.browser-sync
(php83.buildEnv {
extraConfig = ''
error_reporting = E_ALL & ~E_DEPRECATED & ~E_USER_DEPRECATED
'';
})
php83Packages.composer
];
};
};
}

View file

@ -1,19 +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="/css/styles.css">
</head>
<body>
<div class="container">
{% block content_wrapper %}
<h1>{{ page.title }}</h1>
{% block content %}{% endblock %}
{% endblock %}
</div>
</body>
</html>

View file

@ -1,5 +0,0 @@
{% extends 'base' %}
{% block content_wrapper %}
<h1>{{ page.name }}</h1>
{% endblock %}

View file

@ -1,5 +0,0 @@
{% extends 'base' %}
{% block content_wrapper %}
<h1>{{ page.title }}</h1>
{% 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
---

View file

@ -1,6 +0,0 @@
---
title: Behaviour Driven Development (BDD) in Practice
date: 2022-09-14
speakers:
- Ciaran McNulty
---

View file

@ -1,6 +0,0 @@
---
title: Building "Build Configs"
date: 2023-11-08
speakers:
- Oliver Davies
---

View file

@ -1,6 +0,0 @@
---
title: Introducing Domain Driven Design
date: 2024-01-10
speakers:
- Rob Allen
---

View file

@ -1,6 +0,0 @@
---
title: 'FPGA^2: An open-source FPGA'
date: 2024-02-14
speakers:
- Robin Hodson
---

View file

@ -1,6 +0,0 @@
---
title: Go for PHP
date: 2023-02-08
speakers:
- Dan Leech
---

View file

@ -1,6 +0,0 @@
---
title: What's new in PHP 8.*
date: 2023-02-11
speakers:
- Derick Rethans
---

View file

@ -1,6 +0,0 @@
---
title: Building Static Websites with PHP and Sculpin
date: 2024-02-14
speakers:
- Oliver Davies
---

View file

@ -1,6 +0,0 @@
---
title: What is TDD and why should I care?
date: 2023-07-12
speakers:
- Naomi Gotts
---

View file

@ -1,6 +0,0 @@
---
title: Terraform from a devs perspective
date: 2023-10-11
speakers:
- Nigel Dunn
---

View file

@ -1,6 +0,0 @@
---
title: Testing Legacy
date: 2023-11-08
speakers:
- Mike Karthauser
---

View file

@ -1,6 +0,0 @@
---
title: Building Better TUIs (with PHP)
date: 2023-11-08
speakers:
- Dan Leech
---

View file

@ -1,6 +0,0 @@
---
title: Thoughts on Ubiquitous Language
date: 2023-11-08
speakers:
- Rob Allen
---

View file

@ -1,5 +0,0 @@
.container {
margin: 0 auto;
max-width: 768px;
padding: 0 1rem;
}

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,4 +0,0 @@
---
layout: base
title: Hello, World!
---

View file

@ -1,7 +0,0 @@
#!/usr/bin/env bash
set -euo pipefail
export PATH="$PATH:./vendor/bin"
sculpin generate --server --watch "$@"

View file

@ -1,4 +0,0 @@
Building static websites with Sculpin
#####################################
https://www.oliverdavies.uk/talks/building-static-websites-sculpin

View file

@ -1,5 +0,0 @@
---
name: oliverdavies.uk
menu_links:
- { title: Home, href: / }
- { title: About, href: /about }

View file

@ -1,10 +0,0 @@
---
title: My Daily Email Archive
layout: default
use:
- daily_email
---
{% for email in data.daily_emails %}
<p>{{ email.title }}</p>
{% endfor %}

View file

@ -1,12 +0,0 @@
---
...
testimonials:
- { name: ..., role: ..., text: ..., url: ... }
- { name: ..., role: ..., text: ..., url: ... }
- { name: ..., role: ..., text: ..., url: ... }
---
{% for testimonial in page.testimonials %}
<h2>{{ testimonial.name }} - {{ testimonial.role }}</h2>
<p>{{ testimonial.text }}</p>
{% endfor %}

View file

@ -1,5 +0,0 @@
---
layout: post
title: New blog post
draft: yes
---

View file

@ -1,9 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<title>Hello!</title>
</head>
<body>
<p>Hello, World!</p>
</body>
</html>

View file

@ -1,6 +0,0 @@
---
layout: default
title: Hello!
---
Hello, World!

View file

@ -1,11 +0,0 @@
{# source/_layouts/base.html.twig #}
<!DOCTYPE html>
<html lang="{{ site.locale|default('en') }}">
<head>
<title>{{ site.name|default('Sculpin Skeleton') }}</title>
</head>
<body>
{% block body %}{% endblock %}
</body>
</html>

View file

@ -1,7 +0,0 @@
{# source/_layouts/page.html.twig #}
{% extends 'base' %}
{% block body %}
{% block content %}{% endblock %}
{% endblock %}

View file

@ -1,13 +0,0 @@
app/
config/
sculpin_kernel.yml
sculpin_site.yml
composer.json
composer.lock
output_dev/
output_prod/
source/
_includes/
_templates/
index.md
vendor/

View file

@ -1,8 +0,0 @@
{{ 'today' }}
{{ 'today'|date }}
{{ 'today'|date('Y') }}
{{ 'today'|date('Y') - 2007 }} # 18 (years of experience)

View file

@ -1,24 +0,0 @@
---
title: Building Static Websites with Sculpin
events:
- name: PHP Berkshire
date: 2024-08-28
location: Reading, UK
url: https://www.meetup.com/php-berkshire/events/301850284
- name: BrumPHP
date: 2024-05-23
location: Birmingham, UK
url: https://www.eventbrite.com/e/brumphp-23rd-may-2024-tickets-803037766577
---
// end yaml
// start twig
{% set talkCount = 0 %}
{% for talk in data.talks %}
{% for event in talk.events if 'today'|date('U') >= event.date|date('U') %}
{% set talkCount = talkCount + 1 %}
{% endfor %}
{% endfor %}
<p>I have given {{ talkCount }} talks.</p>

View file

@ -1,15 +0,0 @@
{% set talks = site.talks|filter(talk => talk.speaker == page.name) %}
{% if talks is not empty %}
<section>
<h2>Talks by {{ page.name }}</h2>
<div>
<ul>
{% for talk in talks %}
<li><a href="#0">{{ talk.title }}</a></li>
{% endfor %}
</ul>
</div>
</section>
{% endif %}

View file

@ -1,8 +0,0 @@
- Adding a new page (`/talks`)
- Adding a new menu link
- Adding a new content type (talks)
- Add a new talk
- Show how to use page-level variables, adding events to a talk
- Adding the talks page to the menu
- Active menu link styling?
- Generating a production version of the site

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Some files were not shown because too many files have changed in this diff Show more