function toc_js_node_view in Toc.js 2.0.x
Same name and namespace in other branches
- 8 toc_js.module \toc_js_node_view()
Implements hook_entity_view().
File
- ./
toc_js.module, line 100 - Contains toc_js.module.
Code
function toc_js_node_view(array &$build, EntityInterface $entity, EntityViewDisplayInterface $display, $view_mode) {
if ($display
->getComponent('toc_js')) {
/** @var \Drupal\node\NodeTypeInterface $node_type */
$node_type = $entity->type->entity;
$toc_override = $node_type
->getThirdPartySetting('toc_js_per_node', 'override', 0);
$toc_override_default = $node_type
->getThirdPartySetting('toc_js_per_node', 'override_default', 1);
// Support toc_js per node feature.
if ($entity
->hasField('toc_js_active') && $toc_override) {
// Use default override value if not set
if ($entity->toc_js_active->value == NULL) {
$entity->toc_js_active->value = $toc_override_default;
}
if (empty($entity->toc_js_active->value)) {
return;
}
}
$toc_js_settings = $node_type
->getThirdPartySettings('toc_js');
if (empty($toc_js_settings['toc_js_active'])) {
// Toc has been disabled but the extra field hasn't been disabled.
return;
}
// lambda function to clean css identifiers
$cleanCssIdentifier = function ($value) {
return Html::cleanCssIdentifier(trim($value));
};
// toc-js class is used to initialize the toc. Additional classes are added from the configuration.
$classes = array_map($cleanCssIdentifier, array_merge([
'toc-js',
], explode(',', $node_type
->getThirdPartySetting('toc_js', 'classes'))));
$attributes = new Attribute([
'class' => $classes,
]);
$attributes
->setAttribute('id', 'toc-js-node-' . $entity
->id());
$title_attributes = new Attribute([
'class' => [
'toc-title',
'h2',
],
]);
if ($node_type
->getThirdPartySetting('toc_js', 'sticky', 0)) {
$attributes
->addClass('sticky');
}
foreach ($toc_js_settings as $name => $setting) {
if ($name == 'toc_js_active' || $name == 'title' || $name == 'classes') {
continue;
}
$data_name = 'data-' . $cleanCssIdentifier($name);
$attributes
->setAttribute($data_name, $setting);
}
$build['toc_js'] = [
'#theme' => 'toc_js',
'#title' => $node_type
->getThirdPartySetting('toc_js', 'title', 'Table of contents'),
'#tag' => 'div',
'#title_attributes' => $title_attributes,
'#attributes' => $attributes,
'#entity' => $entity,
'#attached' => [
'library' => [
'toc_js/toc',
],
],
];
}
}