Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Test Drive Twig with Sculpin
Search
Oliver Davies
July 25, 2015
Programming
1
710
Test Drive Twig with Sculpin
Oliver Davies
July 25, 2015
Tweet
Share
More Decks by Oliver Davies
See All by Oliver Davies
Building Static Websites with Sculpin
opdavies
0
1.7k
Taking Flight with Tailwind CSS
opdavies
0
5.4k
TDD - Test Driven Drupal
opdavies
0
4.2k
Building "Build Configs"
opdavies
0
510
Communities and contribution
opdavies
0
250
Working without Workspace
opdavies
0
300
Things you should know about PHP
opdavies
1
850
An Introduction to Mob Programming
opdavies
0
360
Deploying PHP applications with Ansible, Ansible Vault and Ansistrano
opdavies
0
6.5k
Other Decks in Programming
See All in Programming
著者と進める!『AIと個人開発したくなったらまずCursorで要件定義だ!』
yasunacoffee
0
140
Microservices rules: What good looks like
cer
PRO
0
1.4k
React Native New Architecture 移行実践報告
taminif
1
160
愛される翻訳の秘訣
kishikawakatsumi
3
330
堅牢なフロントエンドテスト基盤を構築するために行った取り組み
shogo4131
8
2.4k
Integrating WordPress and Symfony
alexandresalome
0
150
AIエンジニアリングのご紹介 / Introduction to AI Engineering
rkaga
8
2.8k
DevFest Android in Korea 2025 - 개발자 커뮤니티를 통해 얻는 가치
wisemuji
0
150
WebRTC、 綺麗に見るか滑らかに見るか
sublimer
1
190
Rubyで鍛える仕組み化プロヂュース力
muryoimpl
0
130
まだ間に合う!Claude Code元年をふりかえる
nogu66
5
840
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
120
Featured
See All Featured
Writing Fast Ruby
sferik
630
62k
Context Engineering - Making Every Token Count
addyosmani
9
520
Scaling GitHub
holman
464
140k
How To Stay Up To Date on Web Technology
chriscoyier
791
250k
Documentation Writing (for coders)
carmenintech
76
5.2k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
970
[SF Ruby Conf 2025] Rails X
palkan
0
530
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
54k
The Language of Interfaces
destraynor
162
25k
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.6k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Transcript
Test Drive Twig with Sculpin AKA Get Ready for Theming
in Drupal 8
• What is Sculpin, and why should I use it?
• How to install Sculpin • How to build a Sculpin site • How to do cool things with Twig This Talk
Oliver Davies (opdavies) • Drupaler since 2007 • Senior Developer
at Microserve • Drupal 7 and 8 core contributor • Contrib project maintainer • User group, sprint, conference organiser whoami
Oliver Davies (opdavies) • Sculpin hobbyist • Twig enthusiast •
Former Jekyll user whoami
Sculpin
• Static site generator • Open source • Written in
PHP, based on Symfony components • CLI tool, based on Symfony Console • Markdown/HTML/Twig > HTML • Awesome for small sites, HTML prototypes and learning Twig. What is Sculpin?
Why use a static site generator at all? • Reduces
duplication / D.R.Y. • Better performance compared to dynamic sites • Faster to develop (maybe?) Why?
Drupal 8’s little brother • Both use YAML and Twig
• Both have content types • Both have taxonomies • Both have “fieldable entities” Similarities
Getting Started Installation and Configuration
$ curl -O https://download.sculpin.io/sculpin.phar $ chmod +x sculpin.phar $ mv
sculpin.phar /usr/local/bin/sculpin https://sculpin.io/download/ Install
Alternatives • Download via Composer • Clone from GitHub •
Use Sculpin Blog Skeleton or Sculpin Minimal • Use the Ansible role Install
Basic Site Structure app/ config/ sculpin_kernel.yml sculpin_site.yml source/ _layouts/ default.html
index.md
Configure app/config/sculpin_site.yml title: Oliver Davies source/_layouts/default.html {{ site.title }}
Configure app/config/sculpin_site_prod.yml imports: - sculpin_site.yml url: http://www.oliverdavies.uk google_analytics_tracking_code: UA-XXXXXX-1
Configure source/_layouts/default.html {% if site.google_analytics_tracking_code %} ... {% endif %}
app/config/sculpin_kernel.yml sculpin_content_types: posts: permalink: blog/:slug_title/ talks: Content Types
app/config/sculpin_kernel.yml sculpin_content_types: posts: permalink: blog/:slug_title/ taxonomies: [ tags, categories ]
talks: Taxonomies
source/_posts/2015-07-24-drupalcamp-north.md --- title: DrupalCamp North tags: - drupalcamp - drupalcamp-north
Taxonomies
source/_layouts/post.html --- use: [ ‘tags’ ] --- {% for tag
in page.tags %} {{ tag }} {% endfor %} Taxonomies
app/config/sculpin_kernel.yml sculpin_theme: theme: opdavies/oliverdavies15 Themes (Experimental)
Adding custom functionality. They are a thing. Bundles
$ sculpin generate $ sculpin generate --server $ sculpin generate
--server --watch $ sculpin generate --env=prod Build
Adding Content
Simplest Source File source/index.md --- --- # Hello World
Simplest Source File output_dev/ index.html
--- layout: default title: About --- # Hello World YAML
Front Matter
--- layout: default title: About foo: bar --- # Hello
World YAML Front Matter
Twig
source/_layouts/default.html <body class=”{% block body_classes ‘’ %}”> {% block content
%}{% endblock %} </body> Layouts
source/about.html --- {% block body_classes ‘page--about’ %} {% block content
%} <p>Content</p> {% endblock %} Blocks
source/about.md --- {% block body_classes ‘page--about’ %} {% block content
%} Content {% endblock %} Blocks
source/_layouts/post.html {% extends ‘default’ %} {% block content %}{% endblock
%} Template Inheritance
source/_partials/talk-listing-item.html <li> {% if talk.link -%}<a href="{{ talk.link }}">{%- endif
-%} {{ talk.title }} {% if talk.link %}</a>{% endif %} </li> Partials
source/talks.html <ul> {% for talk in page.talks %} {% include(‘talk-listing-item’)
%} {% endfor %} </ul> Partials
source/_partials/head.html {% if page.meta.og %} {% include "og" with {
og: page.meta.og } %} {% endif %} Partials
Twig Tips & Tricks
Filters {{ foo|upper }} {{ bar|lower }} {{ page.excerpt|replace( {
‘h2’: ‘h3’ } ) }} Tips & Tricks
Rendering objects and arrays {{ site.drupalorg.url }} Tips & Tricks
Loops {% for meetup in site.meetups %} {% if loop.first
%} ... {% endif %} {% endfor %} Tips & Tricks
Conditional logic {% if site.foo == ‘bar’ %} ... {%
else %} ... {% endif %} Tips & Tricks
Conditional logic {% set date = ‘now’|date(‘Y’) %} {% for
talk in page.talks if talk.date >= now %} ... {% endfor %} Tips & Tricks
Shorthand blocks {% block body_classes %}page--blog page--blog__list {% endblock %}
{% block body_classes ‘page--blog page--blog__list’ %} Tips & Tricks
Block appending {% block sidebar %} {{ parent() }} {%
endblock %} Tips & Tricks
Whitespace {% if site.foo == ‘bar’ -%} ... {%- endif
%} Tips & Tricks
Spaceless {% spaceless %} ... {% endspaceless %} Tips &
Tricks
Raw output {% raw %} {% if site.foo == ‘bar’
%} ... {% endif %} {% endraw %} Tips & Tricks
Links Links
Useful Links • http://bit.ly/sculpin-twig-resources
Questions @opdavies