Skip to content
This repository was archived by the owner on Nov 21, 2019. It is now read-only.
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,11 @@ COPY composer.json \
./

RUN mkdir public source && \
composer --no-interaction install --ignore-platform-reqs --classmap-authoritative --no-suggest --prefer-dist
composer --no-interaction install --ignore-platform-reqs --classmap-authoritative --no-autoloader --no-suggest --prefer-dist

COPY source/php/ source/php/

RUN composer --no-interaction dump-autoload --classmap-authoritative


#
Expand Down
3 changes: 3 additions & 0 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@
"autoload": {
"psr-0": {
"PatternLab\\": "core/src/"
},
"psr-4": {
"Libero\\PatternLibrary\\": "source/php"
}
},
"require": {
Expand Down
2 changes: 2 additions & 0 deletions config/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -39,3 +39,5 @@ twigFilterExt: filter.php
twigFunctionExt: function.php
twigTagExt: tag.php
twigTestExt: test.php
twigExtensions:
- Libero\PatternLibrary\Twig\MergeExtension
13 changes: 10 additions & 3 deletions gulpfile.babel.js
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ const buildConfig = (invocationArgs, publicRoot, sourceRoot, testRoot, exportRoo
config.dir.src.fonts = `${config.sourceRoot}/fonts`;
config.dir.src.templates = `${config.sourceRoot}/_patterns`;
config.dir.src.js = `${config.sourceRoot}/js`;
config.dir.src.php = `${config.sourceRoot}/php`;

config.dir.test.sass = `${config.testRoot}/sass`;

Expand All @@ -59,6 +60,7 @@ const buildConfig = (invocationArgs, publicRoot, sourceRoot, testRoot, exportRoo
config.dir.out.images = `${config.exportRoot}/images`;
config.dir.out.fonts = `${config.exportRoot}/fonts`;
config.dir.out.templates = `${config.exportRoot}/templates`;
config.dir.out.php = `${config.exportRoot}/php`;

config.files = {
src: {},
Expand Down Expand Up @@ -86,8 +88,9 @@ const buildConfig = (invocationArgs, publicRoot, sourceRoot, testRoot, exportRoo
config.files.src.templates = [
`${config.dir.src.templates}/*.twig`,
`${config.dir.src.templates}/**/*.twig`,
`!${config.dir.src.templates}/02-pages/**/*.twig`
`!${config.dir.src.templates}/02-pages/**/*.twig`,
];
config.files.src.php = `${config.dir.src.php}/**/*`;
config.files.src.derivedConfigs = [
`${config.dir.src.sass}/variables/**/*`,
`${config.dir.src.js}/derivedConfig.json`,
Expand Down Expand Up @@ -180,7 +183,7 @@ const exportFonts = () =>

const exportTemplates = () =>
gulp.src(config.files.src.templates)
// Rename files to standard Twig usage
// Rename files to standard Twig usage
.pipe(rename(path => {
path.basename = path.basename.replace(/^_/, '');
path.extname = '.html.twig';
Expand All @@ -191,9 +194,13 @@ const exportTemplates = () =>
.pipe(flatten({includeParents: false}))
.pipe(gulp.dest(config.dir.out.templates));

const exportPhp = () =>
gulp.src(config.files.src.php)
.pipe(gulp.dest(config.dir.out.php));

export const exportPatterns = gulp.series(
cleanExport,
gulp.parallel(exportCss, exportSass, exportSassVendor, exportImages, exportFonts, exportTemplates),
gulp.parallel(exportCss, exportSass, exportSassVendor, exportImages, exportFonts, exportTemplates, exportPhp),
);

// Default
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
{% set attributes = attributes|default({})|merge({class: attributes.class|default([])|merge(['content-header', 'wrapper']) }) %}
{% set attributes = {class: ['content-header', 'wrapper']}|merge_recursive(attributes) %}

<header {%- include 'atoms-attributes' %}>

Expand Down Expand Up @@ -26,7 +26,7 @@
{% set lengthClass = 'xx-long' %}
{% endif %}

{% set attributes = attributes|default({})|merge({class: attributes.class|default([])|merge(['content-header__title', 'content-header__title--' ~ lengthClass]) }) %}
{% set attributes = {class: ['content-header__title', 'content-header__title--' ~ lengthClass]}|merge_recursive(attributes) %}
{% set level = 1 %}

{% include 'atoms-heading' %}
Expand Down
42 changes: 42 additions & 0 deletions source/php/Twig/MergeExtension.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
<?php

namespace Libero\PatternLibrary\Twig;

use Closure;
use Twig\Extension\AbstractExtension;
use Twig\Extension\GlobalsInterface;
use Twig\TwigFilter;
use function array_merge_recursive;
use function is_iterable;

final class MergeExtension extends AbstractExtension implements GlobalsInterface
{
public function getFilters(): iterable
{
yield new TwigFilter('merge_recursive', Closure::fromCallable([$this, 'mergeRecursive']));
}

private function mergeRecursive(iterable $one, ?iterable $two): iterable
{
if (!is_iterable($two)) {
return $one;
}

return array_merge_recursive($this->toArray($one), $this->toArray($two));
}

private function toArray(iterable $iterable): array
{
$result = [];

foreach ($iterable as $key => $value) {
if (is_iterable($value)) {
$value = $this->toArray($value);
}

$result[$key] = $value;
}

return $result;
}
}