Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
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
40 changes: 40 additions & 0 deletions lib/filters/add_class/definition.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
/**
* @file The safe_join filter
*
* Docs for TwigExtension::safeJoin (Drupal 9.3.x):
*
* ```
* new TwigFilter('safe_join',
* [$this, 'safeJoin'],
* [
* 'needs_environment' => TRUE,
* 'is_safe' => ['html']
* ]
* )
* ```
*
* ```
* Joins several strings together safely.
*
* @param \Twig\Environment $env
* A Twig Environment instance.
* @param mixed[]|\Traversable|null $value
* The pieces to join.
* @param string $glue
* The delimiter with which to join the string. Defaults to an empty string.
* This value is expected to be safe for output and user provided data
* should never be used as a glue.
*
* @return string
* The strings joined together.
* ```
*/

export const name = 'add_class';

export const options = {
needs_environment: true,
is_safe: ['html'],
};

export const acceptedArguments = [{ name: 'className', defaultValue: '' }];
21 changes: 21 additions & 0 deletions lib/filters/add_class/twing.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import { newTwingFilter } from '../../helpers/twing.js';
import { name, options, acceptedArguments } from './definition.js';

function surround(value, className) {
if (Array.isArray(className)) {
className = className.join(' ');
}
return `<div class="${className}">${value}</div>`;
}
export function callable(value, clasName) {
if (typeof value === 'object') {
const output = [];
Object.values(value).forEach((value) => {
output.push(surround(value, clasName));
});
return output.join(' ');
}
return surround(value, clasName);
}

export default newTwingFilter(name, callable, options, acceptedArguments);
11 changes: 11 additions & 0 deletions lib/filters/set_attribute/definition.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
export const name = 'set_attribute';

export const options = {
needs_environment: true,
is_safe: ['html'],
};

export const acceptedArguments = [
{ name: 'attributeName', defaultValue: '' },
{ name: 'attributeValue', defaultValue: '' },
];
18 changes: 18 additions & 0 deletions lib/filters/set_attribute/twing.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import { newTwingFilter } from '../../helpers/twing.js';
import { name, options, acceptedArguments } from './definition.js';

function surround(value, attributeName, attributeValue) {
return `<div ${attributeName}="${attributeValue}">${value}</div>`;
}
export function callable(value, attributeName, attributeValue) {
if (typeof value === 'object') {
const output = [];
Object.values(value).forEach((value) => {
output.push(surround(value, attributeName, attributeValue));
});
return output.join(' ');
}
return surround(value, attributeName, attributeValue);
}

export default newTwingFilter(name, callable, options, acceptedArguments);
4 changes: 4 additions & 0 deletions lib/filters/twing.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ import cleanIdFilter from './clean_id/twing.js';
import drupalEscapeFilter from './drupal_escape/twing.js';
import formatDateFilter from './format_date/twing.js';
import placeholderFilter from './placeholder/twing.js';
import addClassFilter from './add_class/twing.js';
import setAttributeFilter from './set_attribute/twing.js';
import renderFilter from './render/twing.js';
import safeJoinFilter from './safe_join/twing.js';
import {
Expand All @@ -18,7 +20,9 @@ import withoutFilter from './without/twing.js';

const filters = [
cleanClassFilter,
setAttributeFilter,
cleanIdFilter,
addClassFilter,
drupalEscapeFilter,
formatDateFilter,
placeholderFilter,
Expand Down
31 changes: 31 additions & 0 deletions tests/Twing/filters/add_class.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import test from 'ava';
import { setupTwingBefore, renderTemplateMacro } from '#twing-fixture';

test.before(setupTwingBefore);

const template = `{{ content|add_class("sample-class") }}`;

test('Add class to simple content', renderTemplateMacro, {
template,
data: {
content: 'Inner content',
},
expected: '<div class="sample-class">Inner content</div>',
});

test('Add class to content array', renderTemplateMacro, {
template,
data: {
content: ['Inner content', 'Inner content2'],
},
expected:
'<div class="sample-class">Inner content</div> <div class="sample-class">Inner content2</div>',
});

test('Add array class to simple content', renderTemplateMacro, {
template: `{{ content|add_class(["sample-class" , "sample-class2"]) }}`,
data: {
content: 'Inner content',
},
expected: '<div class="sample-class sample-class2">Inner content</div>',
});
14 changes: 14 additions & 0 deletions tests/Twing/filters/set_attribute.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import test from 'ava';
import { setupTwingBefore, renderTemplateMacro } from '#twing-fixture';

test.before(setupTwingBefore);

const template = `{{ content|set_attribute('role', "xxx") }}`;

test('set attribute to simple content', renderTemplateMacro, {
template,
data: {
content: 'Inner content',
},
expected: '<div role="xxx">Inner content</div>',
});