From b23cdc30c11ab738648a50e9fdbb20676d02270d Mon Sep 17 00:00:00 2001
From: Oliver Davies <oliver@oliverdavies.uk>
Date: Tue, 5 Sep 2017 20:22:34 +0100
Subject: [PATCH 1/4] Remove talk IDs

---
 app/data/events.yml                           | 21 +++----
 source/_includes/talk/events.html.twig        | 12 ++--
 source/_includes/talks-table.html.twig        | 62 +++++++------------
 source/_talks/dancing-for-drupal.md           |  2 -
 source/_talks/deploying-php-with-fabric.md    | 32 ----------
 source/_talks/drupal-8-module-development.md  |  2 -
 source/_talks/drupal-8-rejoining-the-herd.md  |  2 -
 source/_talks/drupal-8.md                     |  1 -
 .../drupal-development-with-composer.md       |  1 -
 source/_talks/drupal-vm-generator.md          |  1 -
 .../_talks/drupal-vm-meet-symfony-console.md  |  2 -
 source/_talks/drupalorg-2015.md               |  2 -
 source/_talks/drush-make-drupalbristol.md     |  2 -
 .../_talks/getting-your-data-into-drupal-8.md |  3 +-
 source/_talks/git-flow.md                     |  2 -
 .../goodbye-drush-make-hello-composer.md      |  2 -
 source/_talks/it-all-started-with-a-patch.md  |  1 -
 source/_talks/sculpin.md                      |  1 -
 ...t-phpunit.md => tdd-test-driven-drupal.md} |  8 ++-
 source/_talks/test-drive-twig-with-sculpin.md |  2 -
 source/_talks/what-is-this-drupal-thing.md    |  2 -
 source/talks.md                               |  6 +-
 source/talks/archive.md                       |  3 +-
 23 files changed, 45 insertions(+), 127 deletions(-)
 delete mode 100644 source/_talks/deploying-php-with-fabric.md
 rename source/_talks/{test-driven-drupal-simpletest-phpunit.md => tdd-test-driven-drupal.md} (91%)

diff --git a/app/data/events.yml b/app/data/events.yml
index ec3b6220..13977a34 100644
--- a/app/data/events.yml
+++ b/app/data/events.yml
@@ -99,11 +99,11 @@ events:
           date: '2014-08-19'
           talk: drush-make-drupalbristol
 
-        - event: swdug
-          date: '2014-08-19'
-          talk:
-              title: About the Drupal Association
-              type: Talk
+        # - event: swdug
+        #   date: '2014-08-19'
+        #   talk:
+        #       title: About the Drupal Association
+        #       type: Talk
 
         - event: drupalcamp-brighton-15
           date: '2015-01-18'
@@ -171,7 +171,7 @@ events:
         - event: drupalcamp-london-17
           date: '2017-03-04'
           time: '16:15 - 17:00'
-          talk: test-driven-drupal-simpletest-phpunit
+          talk: tdd-test-driven-drupal
 
         - event: drupalcamp-london-17
           date: '2017-03-04'
@@ -181,17 +181,16 @@ events:
         - event: nomad-php
           date: '2017-04-20'
           time: '19:00 (CET)'
-          talk:
-              id: deploying-php-with-fabric
-              type: Lightning talk
+          type: Lightning talk
+          talk: deploying-php-fabric
 
         - event: phpsw
           date: '2017-09-13'
           time: ~
-          talk: deploying-php-with-fabric
           feedback: https://joind.in/talk/a5ff3
+          talk: deploying-php-fabric
 
         - event: phpnw17
           date: '2017-10-01'
           time: '09:00 - 09:45'
-          talk: deploying-php-with-fabric
+          talk: deploying-php-fabric
diff --git a/source/_includes/talk/events.html.twig b/source/_includes/talk/events.html.twig
index a43848a6..b14c1085 100644
--- a/source/_includes/talk/events.html.twig
+++ b/source/_includes/talk/events.html.twig
@@ -3,14 +3,10 @@
 
     {% set events = [] %}
     {% for date in site.events.dates %}
-        {% set key = (date.talk.id is defined) ? date.talk.id : date.talk %}
-        {% set talk = (page.id is defined) ? page.id : page.url|split('/')|last %}
-        {% if key == talk %}
-            {% set events = events|merge([{
-                date: date,
-                event: site.events.events[date.event],
-            }]) %}
-        {% endif %}
+        {% set events = events|merge([{
+            date: date,
+            event: site.events.events[date.event],
+        }]) %}
     {% endfor %}
 
     {% include 'talks-table' with {
diff --git a/source/_includes/talks-table.html.twig b/source/_includes/talks-table.html.twig
index 0ba9615d..f1a581f0 100644
--- a/source/_includes/talks-table.html.twig
+++ b/source/_includes/talks-table.html.twig
@@ -17,62 +17,44 @@
         </thead>
         <tbody>
             {% for row in events %}
-                {% set talk = false %}
-                {% set key = row.date.talk.id ?: row.date.talk %}
-
-                {% for item in row.talks if key == item.filename|split('.')|first %}
-                    {% set talk = item %}
-                {% endfor %}
-                <tr class="striped--near-white">
+                <tr>
                     <td class="pa2">
-                        {{ row.date.date|date(row.date.fuzzy_date ? 'F Y' : 'j F Y') }}
+                        {{ row.date.date }}
 
-                        {% if row.date.time %}
-                            <small class="db">{{ row.date.time }}</small>
+                        {% if row.date.time is defined %}
+                            <small class="db black-50">
+                                {{ row.date.time }}
+                            </small>
                         {% endif %}
                     </td>
 
                     {% if not talk_page %}
                         <td class="pa2">
-                            {% if row.date.talk.title is defined %}
-                               {{ row.date.talk.title }}
+                            {% if row.date.talk.title is not defined %}
+                                {% for talk in data.talks if talk.id ends with '/' ~ row.date.talk ~ '.md' %}
+                                    <a href="{{ talk.url }}">
+                                        {{ talk.title }}
+                                    </a>
+                                {% endfor %}
                             {% else %}
-                                <a href="{{ talk.url }}" class="blue">{{ talk.title }}</a>
+                                {{ row.date.talk.title }}
                             {% endif %}
-
-                            <small class="db">
-                                {{ row.date.talk.type ?: talk.type }}
-                            </small>
                         </td>
                     {% endif %}
 
                     <td class="pa2">
-                        {% if row.event.website %}
-                            <a href="{{ row.event.website }}" class="blue">
-                                {{ row.event.name }}
-                            </a>
-                        {% else %}
-                            {{ row.event.name }}
-                        {% endif %}
+                        {{ row.event.name }}
 
-                        <small class="db">
-                            {{ row.event.location }}
-                        </small>
+                        {% if row.event.location is defined %}
+                            <small class="db black-50">
+                                {{ row.event.location }}
+                            </small>
+                        {% endif %}
                     </td>
 
-                    {% if not upcoming %}
-                        <td class="ph2">
-                            {% if row.date.feedback %}
-                                <a
-                                    href="{{ row.date.feedback }}"
-                                    class="bg-blue br2 pa2 white-90 no-underline dib dim"
-                                    title="Read or leave feedback for this talk">
-                                    <i class="fa fa-comment-o mr1"></i>
-                                    joind.in
-                                </a>
-                            {% endif %}
-                        </td>
-                    {% endif %}
+                    <td class="pa2">
+                        feedback
+                    </td>
                 </tr>
             {% endfor %}
         </tbody>
diff --git a/source/_talks/dancing-for-drupal.md b/source/_talks/dancing-for-drupal.md
index 02a76603..f800d016 100644
--- a/source/_talks/dancing-for-drupal.md
+++ b/source/_talks/dancing-for-drupal.md
@@ -1,7 +1,5 @@
 ---
-id: dancing-for-drupal
 title: Dancing for Drupal
-type: Talk
 slides:
     url: https://speakerdeck.com/opdavies/umbristol-dancing-for-drupal
     embed: <script async class="speakerdeck-embed" data-id="ffa9b6dea6dc4a8eb207b9982ed6e1bd" data-ratio="1.33333333333333" src="//speakerdeck.com/assets/embed.js"></script>
diff --git a/source/_talks/deploying-php-with-fabric.md b/source/_talks/deploying-php-with-fabric.md
deleted file mode 100644
index 7a924282..00000000
--- a/source/_talks/deploying-php-with-fabric.md
+++ /dev/null
@@ -1,32 +0,0 @@
----
-id: deploying-php-with-fabric
-title: Deploying PHP Applications with Fabric
-type: Talk
-slides:
-    url: https://speakerdeck.com/opdavies/deploying-php-applications-with-fabric
-    embed: '<script async class="speakerdeck-embed" data-id="c147618ce07546ca92f92983c52d6a41" data-ratio="1.77777777777778" src="//speakerdeck.com/assets/embed.js"></script>'
-video:
-    embed: '<iframe width="560" height="315" src="https://www.youtube.com/embed/kM0MDUJE8ys" frameborder="0" allowfullscreen></iframe>'
-    url: https://www.youtube.com/watch?v=kM0MDUJE8ys
-tags: [meetup, conference, php, fabric]
-meta:
-    og:
-        title: Deploying PHP Applcations with Fabric
-        description: "You've built your PHP application, now learn how to deploy it with Fabric."
-        type: website
-        image:
-            url: /assets/images/talks/deploying-php-fabric.png
-            width: 1280
-            height: 800
-            type: image/png
-slug: deploying-php-fabric
-redirect:
-    - talks/deploying-php-applications-with-fabric/
----
-You’ve built your application, and now you just need to deploy it. There are various ways that this could be done – from (S)FTP, to SCP and rsync, to running commands like “git pull” and “composer install” directly on the server (not recommended).
-
-My favourite deployment tool of late is [Fabric][1] – a Python based command line tool for running commands locally as well as on remote servers. It’s language and framework agnostic, and unopinionated so you define the steps and workflow that you need – from a basic few-step deployment to a full Capistrano style zero-downtime deployment.
-
-This talk will cover some introduction to Fabric and how to write your own fabfiles, and then look at some examples of different use case deployments for your PHP project.
-
-[1]: http://www.fabfile.org
diff --git a/source/_talks/drupal-8-module-development.md b/source/_talks/drupal-8-module-development.md
index bcd38eb9..8524366f 100644
--- a/source/_talks/drupal-8-module-development.md
+++ b/source/_talks/drupal-8-module-development.md
@@ -1,7 +1,5 @@
 ---
-id: drupal-8-module-development
 title: Getting Started with Drupal 8 Module Development
-type: Talk
 tags: [conference, php, drupal, drupalcamp, drupal-8]
 tweets: yes
 code: https://github.com/opdavies/dclondon16-d8-module
diff --git a/source/_talks/drupal-8-rejoining-the-herd.md b/source/_talks/drupal-8-rejoining-the-herd.md
index 9d4e8c3e..fee35376 100644
--- a/source/_talks/drupal-8-rejoining-the-herd.md
+++ b/source/_talks/drupal-8-rejoining-the-herd.md
@@ -1,7 +1,5 @@
 ---
-id: drupal-8-rejoining-the-herd
 title: Drupal 8: Rejoining the Herd
-type: Talk
 tags: [conference, php, drupal, drupal-8]
 slides:
     url: https://speakerdeck.com/opdavies/drupal-rejoining-the-herd
diff --git a/source/_talks/drupal-8.md b/source/_talks/drupal-8.md
index 3f18f715..ab02d5d6 100644
--- a/source/_talks/drupal-8.md
+++ b/source/_talks/drupal-8.md
@@ -1,5 +1,4 @@
 ---
-id: drupal-8
 title: Drupal 8
 type: Lightning talk
 slides:
diff --git a/source/_talks/drupal-development-with-composer.md b/source/_talks/drupal-development-with-composer.md
index b0fb5ee0..32169ffe 100644
--- a/source/_talks/drupal-development-with-composer.md
+++ b/source/_talks/drupal-development-with-composer.md
@@ -1,5 +1,4 @@
 ---
-id: drupal-development-with-composer
 title: Modern Drupal Development with Composer
 type: Lightning talk
 tags: ['meetups', 'phpsw', 'drupal', 'composer']
diff --git a/source/_talks/drupal-vm-generator.md b/source/_talks/drupal-vm-generator.md
index 02e00fc5..9867c58c 100644
--- a/source/_talks/drupal-vm-generator.md
+++ b/source/_talks/drupal-vm-generator.md
@@ -1,5 +1,4 @@
 ---
-id: drupal-vm-generator
 title: Drupal VM Generator
 type: Lightning talk
 code: https://github.com/opdavies/drupal-vm-generator
diff --git a/source/_talks/drupal-vm-meet-symfony-console.md b/source/_talks/drupal-vm-meet-symfony-console.md
index 737543aa..51487342 100644
--- a/source/_talks/drupal-vm-meet-symfony-console.md
+++ b/source/_talks/drupal-vm-meet-symfony-console.md
@@ -1,7 +1,5 @@
 ---
-id: drupal-vm-meet-symfony-console
 title: Drupal VM, Meet Symfony Console
-type: Talk
 tags: [conference, php, drupal-vm, symfony]
 slides:
     url: https://speakerdeck.com/opdavies/drupal-vm-meet-symfony-console
diff --git a/source/_talks/drupalorg-2015.md b/source/_talks/drupalorg-2015.md
index 72ea6fef..a277fa45 100644
--- a/source/_talks/drupalorg-2015.md
+++ b/source/_talks/drupalorg-2015.md
@@ -1,7 +1,5 @@
 ---
-id: drupalorg-2015
 title: Drupal.org in 2015: What's Coming Next
-type: Talk
 tags: [conference, drupalcamp, drupalcamp-london, drupal-association]
 slides:
     url: https://speakerdeck.com/opdavies/drupal-dot-org-in-15
diff --git a/source/_talks/drush-make-drupalbristol.md b/source/_talks/drush-make-drupalbristol.md
index 30abc360..55f958aa 100644
--- a/source/_talks/drush-make-drupalbristol.md
+++ b/source/_talks/drush-make-drupalbristol.md
@@ -1,7 +1,5 @@
 ---
-id: drush-make-drupalbristol
 title: drush make drupalbristol
-type: Talk
 slides:
     url: https://speakerdeck.com/opdavies/drush-make-drupalbristol
     embed: <script async class="speakerdeck-embed" data-id="42605700f102013198de5a5f6f23ab67" data-ratio="1.29456384323641" src="//speakerdeck.com/assets/embed.js"></script>
diff --git a/source/_talks/getting-your-data-into-drupal-8.md b/source/_talks/getting-your-data-into-drupal-8.md
index 5d7147d1..84f2f0b3 100644
--- a/source/_talks/getting-your-data-into-drupal-8.md
+++ b/source/_talks/getting-your-data-into-drupal-8.md
@@ -1,7 +1,5 @@
 ---
-id: getting-your-data-into-drupal-8
 title: Getting (Your Data) Into Drupal 8
-type: Talk
 slides:
     url: https://speakerdeck.com/opdavies/getting-your-data-into-drupal-8-drupal-bristol
     embed: '<script async class="speakerdeck-embed" data-id="63e5dfce996e46699e304d50e896477b" data-ratio="1.77777777777778" src="//speakerdeck.com/assets/embed.js"></script>'
@@ -22,6 +20,7 @@ meta:
 redirect:
     - talks/2017/01/18/getting-your-data-into-drupal-8-drupal-bristol/
     - talks/2017/03/04/getting-your-data-into-drupal-8-drupalcamp-london-2017/
+use: [talks]
 ---
 If you’ve moved a site from Drupal 6 to 7, the chances are that you’ve either used the upgrade path to update your old site in-place, or you built a new site from scratch and used the Migrate module from contrib to migrate your data from the old database.
 
diff --git a/source/_talks/git-flow.md b/source/_talks/git-flow.md
index c7c32159..15e844a5 100644
--- a/source/_talks/git-flow.md
+++ b/source/_talks/git-flow.md
@@ -1,7 +1,5 @@
 ---
-id: git-flow
 title: Never Commit to Master - An Introduction to Git Flow
-type: Talk
 slides:
     url: https://speakerdeck.com/opdavies/never-commit-to-master-an-introduction-to-git-flow
     embed: <script async class="speakerdeck-embed" data-id="201559e0f103013198dd5a5f6f23ab67" data-ratio="1.29456384323641" src="//speakerdeck.com/assets/embed.js"></script>
diff --git a/source/_talks/goodbye-drush-make-hello-composer.md b/source/_talks/goodbye-drush-make-hello-composer.md
index d5124be3..27dd3dce 100644
--- a/source/_talks/goodbye-drush-make-hello-composer.md
+++ b/source/_talks/goodbye-drush-make-hello-composer.md
@@ -1,7 +1,5 @@
 ---
-id: goodbye-drush-make-hello-composer
 title: Goodbye Drush Make. Hello Composer!
-type: Talk
 tags: ['meetup', 'drupal', 'composer']
 slides:
     url: http://bit.ly/slides-goodbye-drush-make-hello-composer2
diff --git a/source/_talks/it-all-started-with-a-patch.md b/source/_talks/it-all-started-with-a-patch.md
index 9de10ea8..f73efbd4 100644
--- a/source/_talks/it-all-started-with-a-patch.md
+++ b/source/_talks/it-all-started-with-a-patch.md
@@ -1,5 +1,4 @@
 ---
-id: it-all-started-with-a-patch
 title: It All Started With A Patch
 type: Lightning talk
 tags: [meetup, phpsw, open-source]
diff --git a/source/_talks/sculpin.md b/source/_talks/sculpin.md
index 7f380c48..fed58d57 100644
--- a/source/_talks/sculpin.md
+++ b/source/_talks/sculpin.md
@@ -1,5 +1,4 @@
 ---
-id: sculpin
 title: Building Static Websites with Sculpin
 type: Lightning talk
 slides:
diff --git a/source/_talks/test-driven-drupal-simpletest-phpunit.md b/source/_talks/tdd-test-driven-drupal.md
similarity index 91%
rename from source/_talks/test-driven-drupal-simpletest-phpunit.md
rename to source/_talks/tdd-test-driven-drupal.md
index 8daabc00..aacd4541 100644
--- a/source/_talks/test-driven-drupal-simpletest-phpunit.md
+++ b/source/_talks/tdd-test-driven-drupal.md
@@ -1,6 +1,5 @@
 ---
-title: Test Driven Drupal Development with SimpleTest and PHPUnit
-type: Talk
+title: TDD - Test Driven Drupal
 slides:
     url: https://speakerdeck.com/opdavies/test-driven-drupal-development-with-simpletest-and-phpunit-drupalcamp-london-17
     embed: '<script async class="speakerdeck-embed" data-id="4f12722ed400468b93ebb32a23b3c757" data-ratio="1.77777777777778" src="//speakerdeck.com/assets/embed.js"></script>'
@@ -10,7 +9,7 @@ video:
 tags: [drupalcamp, simpletest, phpunit, testing]
 meta:
     og:
-        title: Test Driven Drupal Development with SimpleTest and PHPUnit
+        title: TDD - Test Driven Drupal
         description: "How to write tests and follow TDD for Drupal applications."
         type: website
         image:
@@ -18,6 +17,9 @@ meta:
             width: 2560
             height: 1440
             type: image/png
+redirect:
+    - /talks/test-driven-drupal-development-with-simpletest-and-phpunit/
+use: [talks]
 ---
 Testing is important. Why? It allows developers to add new features and edit and refactor existing code without the worry of adding regressions, reduces the reliance on manual testing to discover bugs, and by taking a test driven approach, your implementation code is leaner as you only write what is needed for your tests to pass.
 
diff --git a/source/_talks/test-drive-twig-with-sculpin.md b/source/_talks/test-drive-twig-with-sculpin.md
index b80400d1..d9c68b47 100644
--- a/source/_talks/test-drive-twig-with-sculpin.md
+++ b/source/_talks/test-drive-twig-with-sculpin.md
@@ -1,7 +1,5 @@
 ---
-id: test-drive-twig-with-sculpin
 title: Test Drive Twig with Sculpin
-type: Talk
 slides:
     url: https://speakerdeck.com/opdavies/test-drive-twig-with-sculpin
     embed: <script async class="speakerdeck-embed" data-id="54589d2e50a3476a9a75aed809e9edf1" data-ratio="1.77777777777778" src="//speakerdeck.com/assets/embed.js"></script>
diff --git a/source/_talks/what-is-this-drupal-thing.md b/source/_talks/what-is-this-drupal-thing.md
index a0c7aacb..268cfc7a 100644
--- a/source/_talks/what-is-this-drupal-thing.md
+++ b/source/_talks/what-is-this-drupal-thing.md
@@ -1,7 +1,5 @@
 ---
-id: what-is-this-drupal-thing
 title: So, what is this Drupal thing?
-type: Talk
 video:
     url: https://vimeo.com/49827006
     embed: <iframe src="https://player.vimeo.com/video/49827006" width="640" height="360" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>
diff --git a/source/talks.md b/source/talks.md
index 6cc77b90..bbe1d8b9 100644
--- a/source/talks.md
+++ b/source/talks.md
@@ -21,14 +21,12 @@ There is also information about events that I’ve attended and spoken at on my
     {% if date.date >= 'today'|date('Y-m-d') %}
         {% set upcoming_events = upcoming_events|reverse|merge([{
             date: date,
-            event: site.events.events[date.event],
-            talks: data.talks,
+            event: site.events.events[date.event]
         }]) %}
     {% else %}
         {% set past_events = past_events|merge([{
             date: date,
-            event: site.events.events[date.event],
-            talks: data.talks,
+            event: site.events.events[date.event]
         }]) %}
     {% endif %}
 {% endfor %}
diff --git a/source/talks/archive.md b/source/talks/archive.md
index 77e03fd9..2e7be820 100644
--- a/source/talks/archive.md
+++ b/source/talks/archive.md
@@ -13,12 +13,11 @@ Here are a list of my previous conference and user group talks:
         {% set events = events|merge([{
             date: date,
             event: site.events.events[date.event],
-            talks: data.talks,
         }]) %}
     {% endif %}
 {% endfor %}
 
-{% include 'talks-table' with { events: events } %}
+{% include 'talks-table' %}
 
 Upcoming talks can be found on the [talks page][0].
 

From 113e4e5f3b51181cd8c526dd9eb4484a50cd0ae7 Mon Sep 17 00:00:00 2001
From: Oliver Davies <oliver@oliverdavies.uk>
Date: Wed, 6 Sep 2017 07:34:18 +0100
Subject: [PATCH 2/4] Use numeric talk IDs

---
 app/data/events.yml                           | 55 +++++++++----------
 source/_includes/talk/events.html.twig        |  4 +-
 source/_includes/talks-table.html.twig        | 40 ++++++++++----
 source/_talks/dancing-for-drupal.md           |  1 +
 source/_talks/deploying-php-fabric.md         | 30 ++++++++++
 source/_talks/drupal-8-module-development.md  |  1 +
 source/_talks/drupal-8-rejoining-the-herd.md  |  1 +
 source/_talks/drupal-8.md                     |  1 +
 .../drupal-development-with-composer.md       |  1 +
 source/_talks/drupal-vm-generator.md          |  1 +
 .../_talks/drupal-vm-meet-symfony-console.md  |  1 +
 source/_talks/drupalorg-2015.md               |  1 +
 source/_talks/drush-make-drupalbristol.md     |  1 +
 .../_talks/getting-your-data-into-drupal-8.md |  1 +
 source/_talks/git-flow.md                     |  1 +
 .../goodbye-drush-make-hello-composer.md      |  1 +
 source/_talks/it-all-started-with-a-patch.md  |  1 +
 source/_talks/sculpin.md                      |  1 +
 source/_talks/tdd-test-driven-drupal.md       |  1 +
 source/_talks/test-drive-twig-with-sculpin.md |  1 +
 source/_talks/what-is-this-drupal-thing.md    |  1 +
 21 files changed, 106 insertions(+), 40 deletions(-)
 create mode 100644 source/_talks/deploying-php-fabric.md

diff --git a/app/data/events.yml b/app/data/events.yml
index 13977a34..f4025794 100644
--- a/app/data/events.yml
+++ b/app/data/events.yml
@@ -83,114 +83,113 @@ events:
     dates:
         - event: unifieddiff
           date: '2012-09-05'
-          talk: what-is-this-drupal-thing
+          talk_id: 1
 
         - event: swdug
           date: '2013-07-10'
-          talk:
-              title: Drupal and the LDAP Module
-              type: Talk
+          talk_title: Drupal and the LDAP Module
 
         - event: drupalcamp-london-14
           date: '2014-03-01'
           talk: git-flow
+          talk_id: 2
 
         - event: drupal-bristol
           date: '2014-08-19'
           talk: drush-make-drupalbristol
+          talk_id: 3
 
-        # - event: swdug
-        #   date: '2014-08-19'
-        #   talk:
-        #       title: About the Drupal Association
+        - event: swdug
+          date: '2014-08-19'
+          talk_title: About the Drupal Association
         #       type: Talk
 
         - event: drupalcamp-brighton-15
           date: '2015-01-18'
-          talk: drupalorg-2015
+          talk_id: 4
 
         - event: drupalcamp-london-15
           date: '2015-02-28'
-          talk: drupalorg-2015
+          talk_id: 4
 
         - event: phpsw
           date: '2015-04-08'
-          talk: drupal-8
+          talk_id: 5
 
         - event: drupalcamp-north-15
           date: '2015-07-25'
-          talk: test-drive-twig-with-sculpin
+          talk_id: 6
 
         - event: umbristol
           date: '2015-08-25'
-          talk: dancing-for-drupal
+          talk_id: 7
 
         - event: phpsw
           date: '2015-10-14'
-          talk: sculpin
+          talk_id: 8
           feedback: https://joind.in/talk/view/15486
 
         - event: drupalcamp-london-16
           date: '2016-03-05'
-          talk: drupal-8-module-development
+          talk_id: 9
 
         - event: nwdug
           date: '2016-03-08'
-          talk: drupal-vm-generator
+          talk_id: 10
 
         - event: drupal-bristol
           date: '2016-04-02'
-          talk: drupal-vm-generator
+          talk_id: 10
 
         - event: phpsc16
           date: '2016-06-11'
-          talk: drupal-8-rejoining-the-herd
+          talk_id: 11
           feedback: https://joind.in/talk/41d0f
 
         - event: drupalcamp-bristol-16
           date: '2016-07-23'
-          talk: drupal-vm-meet-symfony-console
+          talk_id: 12
 
         - event: phpsw
           date: '2016-11-09'
-          talk: drupal-development-with-composer
+          talk_id: 13
 
         - event: drupal-bristol
           date: '2016-11-17'
-          talk: goodbye-drush-make-hello-composer
+          talk_id: 14
 
         - event: drupal-bristol
           date: '2017-01-18'
-          talk: getting-your-data-into-drupal-8
+          talk_id: 15
 
         - event: phpsw
           date: '2017-02-08'
-          talk: it-all-started-with-a-patch
+          talk_id: 16
           feedback: https://joind.in/event/phpsw-new-skills-february-17/it-started-with-a-patch
 
         - event: drupalcamp-london-17
           date: '2017-03-04'
           time: '16:15 - 17:00'
-          talk: tdd-test-driven-drupal
+          talk_id: 17
 
         - event: drupalcamp-london-17
           date: '2017-03-04'
           time: '12:05 - 12:50'
-          talk: getting-your-data-into-drupal-8
+          talk_id: 15
 
         - event: nomad-php
           date: '2017-04-20'
           time: '19:00 (CET)'
           type: Lightning talk
-          talk: deploying-php-fabric
+          talk_id: 18
 
         - event: phpsw
           date: '2017-09-13'
           time: ~
           feedback: https://joind.in/talk/a5ff3
-          talk: deploying-php-fabric
+          talk_id: 18
 
         - event: phpnw17
           date: '2017-10-01'
           time: '09:00 - 09:45'
-          talk: deploying-php-fabric
+          talk_id: 18
diff --git a/source/_includes/talk/events.html.twig b/source/_includes/talk/events.html.twig
index b14c1085..a56554ac 100644
--- a/source/_includes/talk/events.html.twig
+++ b/source/_includes/talk/events.html.twig
@@ -2,7 +2,7 @@
     <h2>Events</h2>
 
     {% set events = [] %}
-    {% for date in site.events.dates %}
+    {% for date in site.events.dates if date.talk_id == page.talk_id %}
         {% set events = events|merge([{
             date: date,
             event: site.events.events[date.event],
@@ -11,6 +11,6 @@
 
     {% include 'talks-table' with {
         events: events,
-        talk_page: true,
+        talk_page: true
     } %}
 </div>
diff --git a/source/_includes/talks-table.html.twig b/source/_includes/talks-table.html.twig
index f1a581f0..6d57ca49 100644
--- a/source/_includes/talks-table.html.twig
+++ b/source/_includes/talks-table.html.twig
@@ -1,7 +1,7 @@
 <div class="w-100 overflow-x-auto overflow-y-hidden">
     <table class="w-100 ba b--moon-gray">
         <thead>
-            <tr class="striped--light-gray">
+            <tr class="striped--near-white">
                 <th class="w-20-l pa2 tl">Date</th>
 
                 {% if not talk_page %}
@@ -17,9 +17,9 @@
         </thead>
         <tbody>
             {% for row in events %}
-                <tr>
+                <tr class="striped--near-white">
                     <td class="pa2">
-                        {{ row.date.date }}
+                        {{ row.date.date|date(row.date.fuzzy_date ? 'F Y' : 'j F Y') }}
 
                         {% if row.date.time is defined %}
                             <small class="db black-50">
@@ -30,20 +30,30 @@
 
                     {% if not talk_page %}
                         <td class="pa2">
-                            {% if row.date.talk.title is not defined %}
-                                {% for talk in data.talks if talk.id ends with '/' ~ row.date.talk ~ '.md' %}
+                            {% if row.date.talk_title is not defined %}
+                                {% for talk in data.talks if talk.talk_id == row.date.talk_id %}
                                     <a href="{{ talk.url }}">
                                         {{ talk.title }}
                                     </a>
                                 {% endfor %}
                             {% else %}
-                                {{ row.date.talk.title }}
+                                {{ row.date.talk_title }}
                             {% endif %}
+
+                            <small class="db black-50">
+                                {{ row.date.type|default('Talk') }}
+                            </small>
                         </td>
                     {% endif %}
 
                     <td class="pa2">
-                        {{ row.event.name }}
+                        {% if row.event.website is defined %}
+                            <a href="{{ row.event.website }}">
+                                {{ row.event.name }}
+                            </a>
+                        {% else %}
+                            {{ row.event.name }}
+                        {% endif %}
 
                         {% if row.event.location is defined %}
                             <small class="db black-50">
@@ -52,9 +62,19 @@
                         {% endif %}
                     </td>
 
-                    <td class="pa2">
-                        feedback
-                    </td>
+                    {% if not upcoming %}
+                        <td class="ph2">
+                            {% if row.date.feedback %}
+                                <a
+                                    href="{{ row.date.feedback }}"
+                                    class="bg-blue br2 pa2 white-90 no-underline dib dim"
+                                    title="Read or leave feedback for this talk">
+                                    <i class="fa fa-comment-o mr1"></i>
+                                    joind.in
+                                </a>
+                            {% endif %}
+                        </td>
+                    {% endif %}
                 </tr>
             {% endfor %}
         </tbody>
diff --git a/source/_talks/dancing-for-drupal.md b/source/_talks/dancing-for-drupal.md
index f800d016..ef107cae 100644
--- a/source/_talks/dancing-for-drupal.md
+++ b/source/_talks/dancing-for-drupal.md
@@ -1,4 +1,5 @@
 ---
+talk_id: 7
 title: Dancing for Drupal
 slides:
     url: https://speakerdeck.com/opdavies/umbristol-dancing-for-drupal
diff --git a/source/_talks/deploying-php-fabric.md b/source/_talks/deploying-php-fabric.md
new file mode 100644
index 00000000..85f72fbb
--- /dev/null
+++ b/source/_talks/deploying-php-fabric.md
@@ -0,0 +1,30 @@
+---
+talk_id: 18
+title: Deploying PHP Applications with Fabric
+slides:
+    url: https://speakerdeck.com/opdavies/deploying-php-applications-with-fabric
+    embed: '<script async class="speakerdeck-embed" data-id="c147618ce07546ca92f92983c52d6a41" data-ratio="1.77777777777778" src="//speakerdeck.com/assets/embed.js"></script>'
+video:
+    embed: '<iframe width="560" height="315" src="https://www.youtube.com/embed/kM0MDUJE8ys" frameborder="0" allowfullscreen></iframe>'
+    url: https://www.youtube.com/watch?v=kM0MDUJE8ys
+tags: [meetup, conference, php, fabric]
+meta:
+    og:
+        title: Deploying PHP Applcations with Fabric
+        description: "You've built your PHP application, now learn how to deploy it with Fabric."
+        type: website
+        image:
+            url: /assets/images/talks/deploying-php-fabric.png
+            width: 1280
+            height: 800
+            type: image/png
+redirect:
+    - talks/deploying-php-applications-with-fabric/
+---
+You’ve built your application, and now you just need to deploy it. There are various ways that this could be done – from (S)FTP, to SCP and rsync, to running commands like “git pull” and “composer install” directly on the server (not recommended).
+
+My favourite deployment tool of late is [Fabric][1] – a Python based command line tool for running commands locally as well as on remote servers. It’s language and framework agnostic, and unopinionated so you define the steps and workflow that you need – from a basic few-step deployment to a full Capistrano style zero-downtime deployment.
+
+This talk will cover some introduction to Fabric and how to write your own fabfiles, and then look at some examples of different use case deployments for your PHP project.
+
+[1]: http://www.fabfile.org
diff --git a/source/_talks/drupal-8-module-development.md b/source/_talks/drupal-8-module-development.md
index 8524366f..cac45f65 100644
--- a/source/_talks/drupal-8-module-development.md
+++ b/source/_talks/drupal-8-module-development.md
@@ -1,4 +1,5 @@
 ---
+talk_id: 9
 title: Getting Started with Drupal 8 Module Development
 tags: [conference, php, drupal, drupalcamp, drupal-8]
 tweets: yes
diff --git a/source/_talks/drupal-8-rejoining-the-herd.md b/source/_talks/drupal-8-rejoining-the-herd.md
index fee35376..b9ad8cbd 100644
--- a/source/_talks/drupal-8-rejoining-the-herd.md
+++ b/source/_talks/drupal-8-rejoining-the-herd.md
@@ -1,4 +1,5 @@
 ---
+talk_id: 11
 title: Drupal 8: Rejoining the Herd
 tags: [conference, php, drupal, drupal-8]
 slides:
diff --git a/source/_talks/drupal-8.md b/source/_talks/drupal-8.md
index ab02d5d6..122119bc 100644
--- a/source/_talks/drupal-8.md
+++ b/source/_talks/drupal-8.md
@@ -1,4 +1,5 @@
 ---
+talk_id: 5
 title: Drupal 8
 type: Lightning talk
 slides:
diff --git a/source/_talks/drupal-development-with-composer.md b/source/_talks/drupal-development-with-composer.md
index 32169ffe..7a074d8f 100644
--- a/source/_talks/drupal-development-with-composer.md
+++ b/source/_talks/drupal-development-with-composer.md
@@ -1,4 +1,5 @@
 ---
+talk_id: 13
 title: Modern Drupal Development with Composer
 type: Lightning talk
 tags: ['meetups', 'phpsw', 'drupal', 'composer']
diff --git a/source/_talks/drupal-vm-generator.md b/source/_talks/drupal-vm-generator.md
index 9867c58c..f7f5688a 100644
--- a/source/_talks/drupal-vm-generator.md
+++ b/source/_talks/drupal-vm-generator.md
@@ -1,4 +1,5 @@
 ---
+talk_id: 10
 title: Drupal VM Generator
 type: Lightning talk
 code: https://github.com/opdavies/drupal-vm-generator
diff --git a/source/_talks/drupal-vm-meet-symfony-console.md b/source/_talks/drupal-vm-meet-symfony-console.md
index 51487342..b4b3dd3c 100644
--- a/source/_talks/drupal-vm-meet-symfony-console.md
+++ b/source/_talks/drupal-vm-meet-symfony-console.md
@@ -1,4 +1,5 @@
 ---
+talk_id: 12
 title: Drupal VM, Meet Symfony Console
 tags: [conference, php, drupal-vm, symfony]
 slides:
diff --git a/source/_talks/drupalorg-2015.md b/source/_talks/drupalorg-2015.md
index a277fa45..1ee3f342 100644
--- a/source/_talks/drupalorg-2015.md
+++ b/source/_talks/drupalorg-2015.md
@@ -1,4 +1,5 @@
 ---
+talk_id: 4
 title: Drupal.org in 2015: What's Coming Next
 tags: [conference, drupalcamp, drupalcamp-london, drupal-association]
 slides:
diff --git a/source/_talks/drush-make-drupalbristol.md b/source/_talks/drush-make-drupalbristol.md
index 55f958aa..7ab8100e 100644
--- a/source/_talks/drush-make-drupalbristol.md
+++ b/source/_talks/drush-make-drupalbristol.md
@@ -1,4 +1,5 @@
 ---
+talk_id: 3
 title: drush make drupalbristol
 slides:
     url: https://speakerdeck.com/opdavies/drush-make-drupalbristol
diff --git a/source/_talks/getting-your-data-into-drupal-8.md b/source/_talks/getting-your-data-into-drupal-8.md
index 84f2f0b3..33ac00ed 100644
--- a/source/_talks/getting-your-data-into-drupal-8.md
+++ b/source/_talks/getting-your-data-into-drupal-8.md
@@ -1,4 +1,5 @@
 ---
+talk_id: 15
 title: Getting (Your Data) Into Drupal 8
 slides:
     url: https://speakerdeck.com/opdavies/getting-your-data-into-drupal-8-drupal-bristol
diff --git a/source/_talks/git-flow.md b/source/_talks/git-flow.md
index 15e844a5..1379176a 100644
--- a/source/_talks/git-flow.md
+++ b/source/_talks/git-flow.md
@@ -1,4 +1,5 @@
 ---
+talk_id: 2
 title: Never Commit to Master - An Introduction to Git Flow
 slides:
     url: https://speakerdeck.com/opdavies/never-commit-to-master-an-introduction-to-git-flow
diff --git a/source/_talks/goodbye-drush-make-hello-composer.md b/source/_talks/goodbye-drush-make-hello-composer.md
index 27dd3dce..044b5f4a 100644
--- a/source/_talks/goodbye-drush-make-hello-composer.md
+++ b/source/_talks/goodbye-drush-make-hello-composer.md
@@ -1,4 +1,5 @@
 ---
+talk_id: 14
 title: Goodbye Drush Make. Hello Composer!
 tags: ['meetup', 'drupal', 'composer']
 slides:
diff --git a/source/_talks/it-all-started-with-a-patch.md b/source/_talks/it-all-started-with-a-patch.md
index f73efbd4..211c3b6b 100644
--- a/source/_talks/it-all-started-with-a-patch.md
+++ b/source/_talks/it-all-started-with-a-patch.md
@@ -1,4 +1,5 @@
 ---
+talk_id: 16
 title: It All Started With A Patch
 type: Lightning talk
 tags: [meetup, phpsw, open-source]
diff --git a/source/_talks/sculpin.md b/source/_talks/sculpin.md
index fed58d57..e769f080 100644
--- a/source/_talks/sculpin.md
+++ b/source/_talks/sculpin.md
@@ -1,4 +1,5 @@
 ---
+talk_id: 8
 title: Building Static Websites with Sculpin
 type: Lightning talk
 slides:
diff --git a/source/_talks/tdd-test-driven-drupal.md b/source/_talks/tdd-test-driven-drupal.md
index aacd4541..67744abc 100644
--- a/source/_talks/tdd-test-driven-drupal.md
+++ b/source/_talks/tdd-test-driven-drupal.md
@@ -1,4 +1,5 @@
 ---
+talk_id: 17
 title: TDD - Test Driven Drupal
 slides:
     url: https://speakerdeck.com/opdavies/test-driven-drupal-development-with-simpletest-and-phpunit-drupalcamp-london-17
diff --git a/source/_talks/test-drive-twig-with-sculpin.md b/source/_talks/test-drive-twig-with-sculpin.md
index d9c68b47..3b6355d6 100644
--- a/source/_talks/test-drive-twig-with-sculpin.md
+++ b/source/_talks/test-drive-twig-with-sculpin.md
@@ -1,4 +1,5 @@
 ---
+talk_id: 6
 title: Test Drive Twig with Sculpin
 slides:
     url: https://speakerdeck.com/opdavies/test-drive-twig-with-sculpin
diff --git a/source/_talks/what-is-this-drupal-thing.md b/source/_talks/what-is-this-drupal-thing.md
index 268cfc7a..0e675854 100644
--- a/source/_talks/what-is-this-drupal-thing.md
+++ b/source/_talks/what-is-this-drupal-thing.md
@@ -1,4 +1,5 @@
 ---
+talk_id: 1
 title: So, what is this Drupal thing?
 video:
     url: https://vimeo.com/49827006

From 3f64be24cdd7086a3cd081c5de6a5b97384e5e3d Mon Sep 17 00:00:00 2001
From: Oliver Davies <oliver@oliverdavies.uk>
Date: Wed, 6 Sep 2017 07:41:30 +0100
Subject: [PATCH 3/4] Update permalink for talks

---
 app/config/sculpin_kernel.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/config/sculpin_kernel.yml b/app/config/sculpin_kernel.yml
index 8ce8aac1..69911e70 100644
--- a/app/config/sculpin_kernel.yml
+++ b/app/config/sculpin_kernel.yml
@@ -6,5 +6,5 @@ sculpin_content_types:
         permalink: projects/:slug_title/
         taxonomies: [skills, tags]
     talks:
-        permalink: talks/:slug_title/
+        permalink: talks/:basename/
         taxonomies: [tags]

From 9ea2fec048a9a6334ce3e19f515ecdf39db0f936 Mon Sep 17 00:00:00 2001
From: Oliver Davies <oliver@oliverdavies.uk>
Date: Wed, 6 Sep 2017 08:43:49 +0100
Subject: [PATCH 4/4] Ensure talk paths match or redirect

---
 .../_talks/{sculpin.md => building-static-websites-sculpin.md}   | 1 +
 source/_talks/drupal-8-module-development.md                     | 1 +
 source/_talks/drupalorg-2015.md                                  | 1 +
 ...th-composer.md => modern-drupal-development-with-composer.md} | 0
 ...t-is-this-drupal-thing.md => so-what-is-this-drupal-thing.md} | 0
 5 files changed, 3 insertions(+)
 rename source/_talks/{sculpin.md => building-static-websites-sculpin.md} (95%)
 rename source/_talks/{drupal-development-with-composer.md => modern-drupal-development-with-composer.md} (100%)
 rename source/_talks/{what-is-this-drupal-thing.md => so-what-is-this-drupal-thing.md} (100%)

diff --git a/source/_talks/sculpin.md b/source/_talks/building-static-websites-sculpin.md
similarity index 95%
rename from source/_talks/sculpin.md
rename to source/_talks/building-static-websites-sculpin.md
index e769f080..71ebe616 100644
--- a/source/_talks/sculpin.md
+++ b/source/_talks/building-static-websites-sculpin.md
@@ -13,6 +13,7 @@ video:
     url: https://www.youtube.com/watch?v=aN53arCKZAU
 redirect:
     - talks/2015/10/14/sculpin-phpsw/
+    - talks/building-static-websites-with-sculpin/
 ---
 [Sculpin][0] is a static site generator written in PHP. It converts Markdown files, Twig templates and standard HTML into a static HTML site that can be easily deployed.
 
diff --git a/source/_talks/drupal-8-module-development.md b/source/_talks/drupal-8-module-development.md
index cac45f65..3733ced5 100644
--- a/source/_talks/drupal-8-module-development.md
+++ b/source/_talks/drupal-8-module-development.md
@@ -20,6 +20,7 @@ meta:
             width: 960
 redirect:
     - talks/2016/03/05/drupal-8-module-development-drupalcamp-london-2016/
+    - talks/getting-started-with-drupal-8-module-development/
 ---
 New to object-orientated PHP, Symfony or YAML, and want to get started building modules in Drupal 8? This is the session for you!
 
diff --git a/source/_talks/drupalorg-2015.md b/source/_talks/drupalorg-2015.md
index 1ee3f342..55acddd0 100644
--- a/source/_talks/drupalorg-2015.md
+++ b/source/_talks/drupalorg-2015.md
@@ -10,4 +10,5 @@ redirect:
     - talks/2015/02/28/drupalorg-2015-drupalcamp-london-2015/
     - talks/drupalorg-2015-2/
     - talks/drupalorg-2015/
+    - talks/drupalorg-in-2015-whats-coming-next/
 ---
diff --git a/source/_talks/drupal-development-with-composer.md b/source/_talks/modern-drupal-development-with-composer.md
similarity index 100%
rename from source/_talks/drupal-development-with-composer.md
rename to source/_talks/modern-drupal-development-with-composer.md
diff --git a/source/_talks/what-is-this-drupal-thing.md b/source/_talks/so-what-is-this-drupal-thing.md
similarity index 100%
rename from source/_talks/what-is-this-drupal-thing.md
rename to source/_talks/so-what-is-this-drupal-thing.md