View source
<?php
use Drupal\Component\Serialization\Json;
use Drupal\Core\Cache\CacheBackendInterface;
use Drupal\Core\Routing\RouteMatchInterface;
use Symfony\Component\DomCrawler\Crawler;
const SWAGGER_UI_FORMATTER_LIBRARY_PATH_CID = 'swagger_ui_formatter:library_path';
const SWAGGER_UI_FORMATTER_SVG_DEFINITION_CID = 'swagger_ui_formatter:svg_definition';
function swagger_ui_formatter_theme($existing, $type, $theme, $path) {
return [
'swagger_ui_field_item' => [
'variables' => [
'field_name' => NULL,
'delta' => NULL,
],
],
];
}
function swagger_ui_formatter_library_info_build() {
$libraries = [];
if ($library_path = _swagger_ui_formatter_get_library_path()) {
$libraries['swagger_ui_formatter.swagger_ui'] = [
'version' => _swagger_ui_formatter_get_library_version(),
'css' => [
'theme' => [
$library_path . '/dist/swagger-ui.css' => [
'minified' => TRUE,
],
],
],
'js' => [
$library_path . '/dist/swagger-ui-bundle.js' => [
'minified' => TRUE,
],
$library_path . '/dist/swagger-ui-standalone-preset.js' => [
'minified' => TRUE,
],
],
];
$libraries['swagger_ui_formatter.swagger_ui_integration'] = [
'version' => '1.0',
'js' => [
'js/swagger-ui-formatter.js' => [],
],
'dependencies' => [
'core/drupal',
'core/jquery',
'core/jquery.once',
'core/drupalSettings',
],
];
}
return $libraries;
}
function _swagger_ui_formatter_get_library_path() {
if ($cache = \Drupal::cache()
->get(SWAGGER_UI_FORMATTER_LIBRARY_PATH_CID)) {
return $cache->data;
}
else {
foreach ([
'/libraries/swagger-ui',
'/libraries/swagger_ui',
] as $library_dir) {
if (_swagger_ui_formatter_is_library_directory($library_dir)) {
\Drupal::cache()
->set(SWAGGER_UI_FORMATTER_LIBRARY_PATH_CID, $library_dir, CacheBackendInterface::CACHE_PERMANENT, [
SWAGGER_UI_FORMATTER_LIBRARY_PATH_CID,
]);
return $library_dir;
}
}
return FALSE;
}
}
function _swagger_ui_formatter_is_library_directory($library_dir) {
$files_to_check = [
'package.json',
'dist/swagger-ui.css',
'dist/swagger-ui-bundle.js',
'dist/swagger-ui-standalone-preset.js',
];
foreach ($files_to_check as $file) {
if (!file_exists(DRUPAL_ROOT . $library_dir . '/' . $file)) {
return FALSE;
}
}
return TRUE;
}
function _swagger_ui_formatter_get_library_version() {
if ($library_path = _swagger_ui_formatter_get_library_path()) {
$file = DRUPAL_ROOT . $library_path . '/package.json';
if (!file_exists($file)) {
return '';
}
$content = file_get_contents($file);
if (!$content) {
return '';
}
$data = Json::decode($content);
if (isset($data['version'])) {
return $data['version'];
}
}
return '';
}
function _swagger_ui_formatter_get_svg_definition() {
if ($cache = \Drupal::cache()
->get(SWAGGER_UI_FORMATTER_SVG_DEFINITION_CID)) {
return $cache->data;
}
$library_path = _swagger_ui_formatter_get_library_path();
if ($library_path && file_exists(DRUPAL_ROOT . $library_path . '/dist/index.html')) {
$dom_crawler = new Crawler(file_get_contents(DRUPAL_ROOT . $library_path . '/dist/index.html'));
$dom_crawler = $dom_crawler
->filterXPath('descendant-or-self::body/svg');
if ($domElement = $dom_crawler
->getNode(0)) {
$svg = $domElement->ownerDocument
->saveHTML($domElement);
\Drupal::cache()
->set(SWAGGER_UI_FORMATTER_SVG_DEFINITION_CID, $svg);
return $svg;
}
}
return NULL;
}
function swagger_ui_formatter_help($route_name, RouteMatchInterface $route_match) {
switch ($route_name) {
case 'help.page.swagger_ui_formatter':
$readme = file_get_contents(__DIR__ . '/README.txt');
$output = '';
if ($readme && \Drupal::moduleHandler()
->moduleExists('markdown') === TRUE) {
$filter_manager = \Drupal::service('plugin.manager.filter');
$settings = \Drupal::configFactory()
->get('markdown.settings')
->getRawData();
$filter = $filter_manager
->createInstance('markdown', [
'settings' => $settings,
]);
$output = $filter
->process($readme, 'en');
}
elseif ($readme) {
$output = '<pre>' . $readme . '</pre>';
}
$output .= '<p>';
$output .= t('Visit the <a href=":project_link">project page</a> on Drupal.org for more information.', [
':project_link' => 'https://www.drupal.org/project/swagger_ui_formatter',
]);
$output .= '</p>';
return $output;
}
}
function swagger_ui_formatter_cache_flush() {
\Drupal::cache()
->invalidate(SWAGGER_UI_FORMATTER_LIBRARY_PATH_CID);
\Drupal::cache()
->invalidate(SWAGGER_UI_FORMATTER_SVG_DEFINITION_CID);
}