Skip to content

Commit fb8eb19

Browse files
author
Derek Reese
committed
WIP
1 parent 3e5575d commit fb8eb19

15 files changed

+666
-101
lines changed

config/install/patternkit.settings.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,4 @@ patternkit_json_editor_js: ""
66
patternkit_json_editor_theme: bootstrap4
77
patternkit_libraries: []
88
patternkit_render_cache: true
9+
patternkit_pl_host: https://demo.patternlab.io/api

patternkit.links.task.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,3 +22,7 @@ patternkit.settings.json_settings:
2222
title: 'JSON Pattern Library Settings'
2323
route_name: patternkit.settings.json_settings
2424
base_route: patternkit.settings
25+
patternkit.settings.rest_settings:
26+
title: 'REST Pattern Library Settings'
27+
route_name: patternkit.settings.rest_settings
28+
base_route: patternkit.settings

patternkit.routing.yml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,3 +55,13 @@ patternkit.settings.json_settings:
5555
_admin_route: TRUE
5656
requirements:
5757
_permission: 'access administration pages'
58+
patternkit.settings.rest_settings:
59+
path: '/admin/config/user-interface/patternkit/rest'
60+
defaults:
61+
_form: '\Drupal\patternkit\Form\PatternLibraryRESTForm'
62+
_title: 'Patternkit REST Library settings'
63+
_description: 'Configure Patternkit REST Pattern Library Support.'
64+
options:
65+
_admin_route: TRUE
66+
requirements:
67+
_permission: 'access administration pages'

patternkit.services.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ services:
2020
patternkit.library.discovery.parser.json:
2121
class: Drupal\patternkit\PatternLibraryParser\JSONPatternLibraryParser
2222
arguments: ['@serialization.json', '@app.root', '@module_handler', '@theme.manager']
23+
patternkit.library.discovery.parser.rest:
24+
class: Drupal\patternkit\PatternLibraryParser\RESTPatternLibraryParser
25+
arguments: ['@cache.default', '@http_client', '@config.factory', '@file_system', '@logger.channel.patternkit', '@serialization.json', '@stream_wrapper_manager']
2326
patternkit.library.discovery.parser.twig:
2427
class: Drupal\patternkit\PatternLibraryParser\TwigPatternLibraryParser
2528
arguments: ['@serialization.json', '@app.root', '@module_handler', '@theme.manager']

src/Form/PatternLibraryJSONForm.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,4 +133,17 @@ public function getFormId() :string {
133133
return 'patternkit_json_editor_config';
134134
}
135135

136+
/**
137+
* {@inheritDoc}
138+
*/
139+
public function submitForm(array &$form, FormStateInterface $form_state): void {
140+
$this->config(static::SETTINGS)
141+
->set('patternkit_json_editor_theme', $form_state->getValue('patternkit_json_editor_theme'))
142+
->set('patternkit_json_editor_icons', $form_state->getValue('patternkit_json_editor_icons'))
143+
->set('patternkit_json_editor_css', $form_state->getValue('patternkit_json_editor_css'))
144+
->set('patternkit_json_editor_js', $form_state->getValue('patternkit_json_editor_js'))
145+
->save();
146+
parent::submitForm($form, $form_state);
147+
}
148+
136149
}

src/Form/PatternLibraryRESTForm.php

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
<?php
2+
3+
namespace Drupal\patternkit\Form;
4+
5+
use Drupal\Core\Form\ConfigFormBase;
6+
use Drupal\Core\Form\FormStateInterface;
7+
8+
/**
9+
* Settings form for configuring the REST Library Plugin.
10+
*/
11+
class PatternLibraryRESTForm extends ConfigFormBase {
12+
13+
/**
14+
* Settings identifier.
15+
*
16+
* @var string
17+
*/
18+
public const SETTINGS = 'patternkit.settings';
19+
20+
/**
21+
* Implements buildForm().
22+
*
23+
* {@inheritDoc}
24+
*/
25+
public function buildForm(array $form, FormStateInterface $form_state) :array {
26+
$config = $this->config(static::SETTINGS);
27+
28+
$form['patternkit_pl_host'] = array(
29+
'#type' => 'textfield',
30+
'#title' => t('PatternLab Host Web Address'),
31+
'#description' => t('Enter the website address of the PatternLab host REST endpoint.'),
32+
'#default_value' => $config->get('patternkit_pl_host'),
33+
);
34+
35+
return parent::buildForm($form, $form_state);
36+
}
37+
38+
/**
39+
* {@inheritDoc}
40+
*/
41+
protected function getEditableConfigNames() :array {
42+
return [static::SETTINGS];
43+
}
44+
45+
/**
46+
* {@inheritDoc}
47+
*/
48+
public function getFormId() :string {
49+
return 'patternkit_rest_editor_config';
50+
}
51+
52+
/**
53+
* {@inheritDoc}
54+
*/
55+
public function submitForm(array &$form, FormStateInterface $form_state): void {
56+
$this->config(static::SETTINGS)
57+
->set('patternkit_pl_host', $form_state->getValue('patternkit_pl_host'))
58+
->save();
59+
parent::submitForm($form, $form_state);
60+
}
61+
62+
}

src/Form/PatternkitSettingsForm.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace Drupal\patternkit\Form;
44

5+
use Drupal\Core\Config\Config;
56
use Drupal\Core\Config\ConfigFactoryInterface;
67
use Drupal\Core\Form\ConfigFormBase;
78
use Drupal\Core\Form\FormStateInterface;
@@ -130,8 +131,7 @@ public function getFormId() :string {
130131
* {@inheritDoc}
131132
*/
132133
public function submitForm(array &$form, FormStateInterface $form_state): void {
133-
$config = $this->config(static::SETTINGS);
134-
$config
134+
$config = $this->config(static::SETTINGS)
135135
->set('patternkit_libraries', $form_state->getValue('patternkit_libraries'))
136136
->set('patternkit_cache_enabled', $form_state->getValue('patternkit_cache_enabled'))
137137
->set('patternkit_render_cache', $form_state->getValue('patternkit_render_cache'))

src/Loader/PatternLibraryLoader.php

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,16 @@
22

33
namespace Drupal\patternkit\Loader;
44

5+
use Drupal\Component\Plugin\Exception\PluginException;
56
use Drupal\Core\Logger\LoggerChannelInterface;
67
use Drupal\patternkit\PatternLibraryCollector;
8+
use Twig\Error\LoaderError;
9+
use Twig_LoaderInterface;
710

811
/**
912
* Functionality for parsing Twig pattern libraries.
1013
*/
11-
class PatternLibraryLoader extends \Twig_Loader_Filesystem {
14+
class PatternLibraryLoader extends \Twig_Loader_Filesystem implements Twig_LoaderInterface {
1215

1316
/**
1417
* Overrides to add paths from pattern libraries.
@@ -21,6 +24,7 @@ class PatternLibraryLoader extends \Twig_Loader_Filesystem {
2124
* Provides library names and paths.
2225
*
2326
* @throws \Twig\Error\LoaderError
27+
* Thrown when encountering a cascaded loader error.
2428
*/
2529
public function __construct($paths,
2630
LoggerChannelInterface $logger,
@@ -30,8 +34,10 @@ public function __construct($paths,
3034
try {
3135
$libraries = $pattern_collector->getLibraryDefinitions();
3236
}
33-
catch (\Exception $exception) {
34-
$logger->error('Error loading pattern libraries: @message', ['@message' => $exception->getMessage()]);
37+
catch (PluginException $exception) {
38+
$message = $exception->getMessage();
39+
$logger->error('Error loading pattern libraries: @message', ['@message' => $message]);
40+
throw new LoaderError($message);
3541
}
3642
foreach ($libraries as $namespace => $library) {
3743
$path = $library['data'];

src/PatternLibraryCollector.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
use Symfony\Component\DependencyInjection\ContainerInterface;
2121
use Drupal\Core\Cache\CacheCollector;
2222
use Drupal\Core\Lock\LockBackendInterface;
23+
use function is_array;
2324

2425
/**
2526
* The PatternLibraryCollector caches library information and performs retrieval
@@ -129,7 +130,7 @@ public static function create(ContainerInterface $container): self {
129130
/** @var \Drupal\Core\Lock\LockBackendInterface $lock */
130131
$lock = $container->get('lock');
131132
/** @var \Drupal\Core\Logger\LoggerChannelInterface $logger */
132-
$logger = $container->get('@logger.channel.default');
133+
$logger = $container->get('logger.channel.patternkit');
133134
/** @var \Drupal\Core\Extension\ModuleHandlerInterface $module_handler */
134135
$module_handler = $container->get('module_handler');
135136
/** @var string $root */
@@ -210,7 +211,7 @@ public function buildByExtension($extension_type, $extension): array {
210211
$libraries = $this->applyLibrariesOverride($libraries, $extension);
211212

212213
foreach ($libraries as $id => &$library) {
213-
if (!isset($library['patterns'])) {
214+
if (!isset($library['patterns']) || !is_array($library['patterns'])) {
214215
unset($libraries[$id]);
215216
continue;
216217
}

src/PatternLibraryParser/FilePatternLibraryParser.php

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use Drupal\patternkit\PatternEditorConfig;
1111
use Drupal\patternkit\PatternLibraryJSONParserTrait;
1212
use Drupal\patternkit\PatternLibraryParserBase;
13+
use Symfony\Component\Finder\Iterator\RecursiveDirectoryIterator;
1314

1415
/**
1516
* Parses a File pattern library collection into usable metadata.
@@ -39,6 +40,50 @@ public function __construct(
3940
parent::__construct($root, $module_handler, $theme_manager);
4041
}
4142

43+
/**
44+
* Returns an array of file components grouped by file basename and extension.
45+
*
46+
* @param string $path
47+
* The fully-qualified path to discover component files.
48+
* @param array $filter
49+
* An optional filter of file extensions to search for.
50+
*
51+
* @return array
52+
* Array of file components.
53+
* [basename][extension] = filename.
54+
*/
55+
public static function discoverComponents($path, array $filter = []): array {
56+
$components = [];
57+
$rdit = new RecursiveDirectoryIterator($path, \FilesystemIterator::KEY_AS_PATHNAME | \FilesystemIterator::CURRENT_AS_FILEINFO);
58+
/** @var \SplFileInfo $file */
59+
foreach (new \RecursiveIteratorIterator($rdit) as $file) {
60+
// Skip directories and non-files.
61+
if (!$file->isFile()) {
62+
continue;
63+
}
64+
$file_path = $file->getPath();
65+
66+
// Skip tests folders.
67+
if (strpos($file_path, '/tests') !== FALSE) {
68+
continue;
69+
}
70+
71+
// Get the file extension for the file.
72+
$file_ext = $file->getExtension();
73+
if (!in_array(strtolower($file_ext), $filter, TRUE)) {
74+
continue;
75+
}
76+
77+
// We use file_basename as a unique key, it is required that the
78+
// JSON and twig file share this basename.
79+
$file_basename = $file->getBasename('.' . $file_ext);
80+
81+
// Build an array of all the filenames of interest, keyed by name.
82+
$components[$file_basename][$file_ext] = "$file_path/$file_basename.$file_ext";
83+
}
84+
return $components;
85+
}
86+
4287
/**
4388
* Fetches all assets for a pattern.
4489
*

0 commit comments

Comments
 (0)