diff --git a/.github/workflows/twig-cs-fixer.yml b/.github/workflows/twig-cs-fixer.yml new file mode 100644 index 0000000000000..38ddceb658388 --- /dev/null +++ b/.github/workflows/twig-cs-fixer.yml @@ -0,0 +1,46 @@ +name: Twig CS Fixer + +on: + push: + paths: + - '**.twig' + pull_request: + paths: + - '**.twig' + +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +permissions: + contents: read + +jobs: + twig-cs-fixer: + name: Twig CS Fixer + runs-on: ubuntu-24.04 + + env: + php-version: '8.4' + steps: + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ env.php-version }} + ini-values: "memory_limit=-1" + coverage: none + + - name: Checkout target branch + uses: actions/checkout@v4 + with: + ref: ${{ github.base_ref }} + + - name: Install dependencies + run: | + COMPOSER_HOME="$(composer config home)" + ([ -d "$COMPOSER_HOME" ] || mkdir "$COMPOSER_HOME") && cp .github/composer-config.json "$COMPOSER_HOME/config.json" + export COMPOSER_ROOT_VERSION=$(grep ' VERSION = ' src/Symfony/Component/HttpKernel/Kernel.php | grep -P -o '[0-9]+\.[0-9]+').x-dev + composer require --dev vincentlanglet/twig-cs-fixer:^3.8.1 + + - name: Run Twig CS Fixer Lint + run: vendor/bin/twig-cs-fixer lint --config=.twig-cs-fixer.dist.php --report=github diff --git a/.gitignore b/.gitignore index 0c37517192aba..16f2ab07006a0 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,8 @@ composer.lock phpunit.xml .php-cs-fixer.cache .php-cs-fixer.php +.twig-cs-fixer.cache +.twig-cs-fixer.php .phpunit.result.cache composer.phar package.tar diff --git a/.twig-cs-fixer.dist.php b/.twig-cs-fixer.dist.php new file mode 100644 index 0000000000000..759d0431cc0fa --- /dev/null +++ b/.twig-cs-fixer.dist.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +$ruleset = new TwigCsFixer\Ruleset\Ruleset(); +$ruleset->addStandard(new TwigCsFixer\Standard\TwigCsFixer()); + +$finder = new TwigCsFixer\File\Finder(); +$finder->in('src/Symfony/Bridge/'); +$finder->in('src/Symfony/Bundle/'); +$finder->in('src/Symfony/Component/'); +$finder->exclude('Fixtures'); + +$config = new TwigCsFixer\Config\Config(); +$config->setCacheFile('.twig-cs-fixer.cache'); +$config->setRuleset($ruleset); +$config->setFinder($finder); +// RFC: should we allow? +// $config->allowNonFixableRules(); + +return $config; diff --git a/src/Symfony/Bridge/Twig/Resources/views/Email/default/notification/body.html.twig b/src/Symfony/Bridge/Twig/Resources/views/Email/default/notification/body.html.twig index 9027546861a14..1934dba6b79fb 100644 --- a/src/Symfony/Bridge/Twig/Resources/views/Email/default/notification/body.html.twig +++ b/src/Symfony/Bridge/Twig/Resources/views/Email/default/notification/body.html.twig @@ -1 +1 @@ -{% extends "@email/zurb_2/notification/body.html.twig" %} +{% extends '@email/zurb_2/notification/body.html.twig' %} diff --git a/src/Symfony/Bridge/Twig/Resources/views/Email/default/notification/body.txt.twig b/src/Symfony/Bridge/Twig/Resources/views/Email/default/notification/body.txt.twig index 37671b1f28455..bd744494794e2 100644 --- a/src/Symfony/Bridge/Twig/Resources/views/Email/default/notification/body.txt.twig +++ b/src/Symfony/Bridge/Twig/Resources/views/Email/default/notification/body.txt.twig @@ -1 +1 @@ -{% extends "@email/zurb_2/notification/body.txt.twig" %} +{% extends '@email/zurb_2/notification/body.txt.twig' %} diff --git a/src/Symfony/Bridge/Twig/Resources/views/Email/zurb_2/notification/body.html.twig b/src/Symfony/Bridge/Twig/Resources/views/Email/zurb_2/notification/body.html.twig index 28a62de3eed57..272f706244ca5 100644 --- a/src/Symfony/Bridge/Twig/Resources/views/Email/zurb_2/notification/body.html.twig +++ b/src/Symfony/Bridge/Twig/Resources/views/Email/zurb_2/notification/body.html.twig @@ -3,15 +3,15 @@ - + diff --git a/src/Symfony/Bridge/Twig/Resources/views/Form/bootstrap_3_horizontal_layout.html.twig b/src/Symfony/Bridge/Twig/Resources/views/Form/bootstrap_3_horizontal_layout.html.twig index 49cd804398b5e..d30c1e2f1c2d0 100644 --- a/src/Symfony/Bridge/Twig/Resources/views/Form/bootstrap_3_horizontal_layout.html.twig +++ b/src/Symfony/Bridge/Twig/Resources/views/Form/bootstrap_3_horizontal_layout.html.twig @@ -1,4 +1,4 @@ -{% use "bootstrap_3_layout.html.twig" %} +{% use 'bootstrap_3_layout.html.twig' %} {% block form_start -%} {% set attr = attr|merge({class: (attr.class|default('') ~ ' form-horizontal')|trim}) %} @@ -25,7 +25,7 @@ col-sm-2 {% block form_row -%} {%- set widget_attr = {} -%} {%- if help is not empty -%} - {%- set widget_attr = {attr: {'aria-describedby': id ~"_help"}} -%} + {%- set widget_attr = {attr: {'aria-describedby': id ~ '_help'}} -%} {%- endif -%} {{- form_label(form) -}} diff --git a/src/Symfony/Bridge/Twig/Resources/views/Form/bootstrap_3_layout.html.twig b/src/Symfony/Bridge/Twig/Resources/views/Form/bootstrap_3_layout.html.twig index f4e313b4756c8..e8ec836b19a41 100644 --- a/src/Symfony/Bridge/Twig/Resources/views/Form/bootstrap_3_layout.html.twig +++ b/src/Symfony/Bridge/Twig/Resources/views/Form/bootstrap_3_layout.html.twig @@ -1,4 +1,4 @@ -{% use "bootstrap_base_layout.html.twig" %} +{% use 'bootstrap_base_layout.html.twig' %} {# Widgets #} @@ -35,10 +35,10 @@ {% block checkbox_widget -%} {%- set parent_label_class = parent_label_class|default(label_attr.class|default('')) -%} {% if 'checkbox-inline' in parent_label_class %} - {{- form_label(form, null, { widget: parent() }) -}} + {{- form_label(form, null, {widget: parent()}) -}} {% else -%}
- {{- form_label(form, null, { widget: parent() }) -}} + {{- form_label(form, null, {widget: parent()}) -}}
{%- endif -%} {%- endblock checkbox_widget %} @@ -46,10 +46,10 @@ {% block radio_widget -%} {%- set parent_label_class = parent_label_class|default(label_attr.class|default('')) -%} {%- if 'radio-inline' in parent_label_class -%} - {{- form_label(form, null, { widget: parent() }) -}} + {{- form_label(form, null, {widget: parent()}) -}} {%- else -%}
- {{- form_label(form, null, { widget: parent() }) -}} + {{- form_label(form, null, {widget: parent()}) -}}
{%- endif -%} {%- endblock radio_widget %} @@ -73,13 +73,13 @@ {% endblock %} {% block checkbox_label -%} - {%- set label_attr = label_attr|merge({'for': id}) -%} + {%- set label_attr = label_attr|merge({for: id}) -%} {{- block('checkbox_radio_label') -}} {%- endblock checkbox_label %} {% block radio_label -%} - {%- set label_attr = label_attr|merge({'for': id}) -%} + {%- set label_attr = label_attr|merge({for: id}) -%} {{- block('checkbox_radio_label') -}} {%- endblock radio_label %} @@ -104,7 +104,7 @@ {% set label = name|humanize %} {%- endif -%} {%- endif -%} - + {#- if statement must be kept on the same line, to force the space between widget and label -#} {{- widget|raw }} {% if label is not same as(false) -%} {%- if translation_domain is same as(false) -%} @@ -130,7 +130,7 @@ {% block form_row -%} {%- set widget_attr = {} -%} {%- if help is not empty -%} - {%- set widget_attr = {attr: {'aria-describedby': id ~"_help"}} -%} + {%- set widget_attr = {attr: {'aria-describedby': id ~ '_help'}} -%} {%- endif -%} {{- form_label(form) }} {# -#} @@ -201,7 +201,7 @@ {% block form_help -%} {%- if help is not empty -%} {%- set help_attr = help_attr|merge({class: (help_attr.class|default('') ~ ' help-block')|trim}) -%} - + {%- if translation_domain is same as(false) -%} {%- if help_html is same as(false) -%} {{- help -}} diff --git a/src/Symfony/Bridge/Twig/Resources/views/Form/bootstrap_4_horizontal_layout.html.twig b/src/Symfony/Bridge/Twig/Resources/views/Form/bootstrap_4_horizontal_layout.html.twig index 990b324cb0d17..92f6965e81bdd 100644 --- a/src/Symfony/Bridge/Twig/Resources/views/Form/bootstrap_4_horizontal_layout.html.twig +++ b/src/Symfony/Bridge/Twig/Resources/views/Form/bootstrap_4_horizontal_layout.html.twig @@ -1,4 +1,4 @@ -{% use "bootstrap_4_layout.html.twig" %} +{% use 'bootstrap_4_layout.html.twig' %} {# Labels #} @@ -26,7 +26,7 @@ col-sm-2 {%- else -%} {%- set widget_attr = {} -%} {%- if help is not empty -%} - {%- set widget_attr = {attr: {'aria-describedby': id ~"_help"}} -%} + {%- set widget_attr = {attr: {'aria-describedby': id ~ '_help'}} -%} {%- endif -%} {{- form_label(form) -}} @@ -41,7 +41,7 @@ col-sm-2 {% block fieldset_form_row -%} {%- set widget_attr = {} -%} {%- if help is not empty -%} - {%- set widget_attr = {attr: {'aria-describedby': id ~"_help"}} -%} + {%- set widget_attr = {attr: {'aria-describedby': id ~ '_help'}} -%} {%- endif -%}
diff --git a/src/Symfony/Bridge/Twig/Resources/views/Form/bootstrap_4_layout.html.twig b/src/Symfony/Bridge/Twig/Resources/views/Form/bootstrap_4_layout.html.twig index 458cc6847ed8e..31f36917b7d1a 100644 --- a/src/Symfony/Bridge/Twig/Resources/views/Form/bootstrap_4_layout.html.twig +++ b/src/Symfony/Bridge/Twig/Resources/views/Form/bootstrap_4_layout.html.twig @@ -1,4 +1,4 @@ -{% use "bootstrap_base_layout.html.twig" %} +{% use 'bootstrap_base_layout.html.twig' %} {# Widgets #} @@ -123,10 +123,10 @@ {%- set type = type|default('file') -%} {%- set input_lang = 'en' -%} {% if app is defined and app.request is defined %}{%- set input_lang = app.request.locale -%}{%- endif -%} - {%- set attr = {lang: input_lang} | merge(attr) -%} + {%- set attr = {lang: input_lang}|merge(attr) -%} {{- block('form_widget_simple') -}} - {%- set label_attr = label_attr|merge({ class: (label_attr.class|default('') ~ ' custom-file-label')|trim })|filter((value, key) => key != 'id') -%} -
{%- endif -%} {%- endblock datetime_widget %} diff --git a/src/Symfony/Bridge/Twig/Resources/views/Form/form_div_layout.html.twig b/src/Symfony/Bridge/Twig/Resources/views/Form/form_div_layout.html.twig index 537849faebaa4..e739523a33455 100644 --- a/src/Symfony/Bridge/Twig/Resources/views/Form/form_div_layout.html.twig +++ b/src/Symfony/Bridge/Twig/Resources/views/Form/form_div_layout.html.twig @@ -29,7 +29,7 @@ {%- block collection_widget -%} {% if prototype is defined and not prototype.rendered %} - {%- set attr = attr|merge({'data-prototype': form_row(prototype) }) -%} + {%- set attr = attr|merge({'data-prototype': form_row(prototype)}) -%} {% endif %} {{- block('form_widget') -}} {%- endblock collection_widget -%} @@ -61,7 +61,7 @@ {%- endif -%} {%- if form_method != method -%} @@ -437,10 +437,10 @@ {% if not form.methodRendered and form is rootform %} {%- do form.setMethodRendered() -%} {% set method = method|upper %} - {%- if method in ["GET", "POST"] -%} + {%- if method in ['GET', 'POST'] -%} {% set form_method = method %} {%- else -%} - {% set form_method = "POST" %} + {% set form_method = 'POST' %} {%- endif -%} {%- if form_method != method -%} @@ -476,7 +476,7 @@ {% block attributes -%} {%- for attrname, attrvalue in attr -%} - {{- " " -}} + {{- ' ' -}} {%- if attrname in ['placeholder', 'title'] -%} {{- attrname }}="{{ translation_domain is same as(false) or attrvalue is null ? attrvalue : attrvalue|trans(attr_translation_parameters, translation_domain) }}" {%- elseif attrvalue is same as(true) -%} diff --git a/src/Symfony/Bridge/Twig/Resources/views/Form/form_table_layout.html.twig b/src/Symfony/Bridge/Twig/Resources/views/Form/form_table_layout.html.twig index 00a51ab04bc28..d7eff26ed357e 100644 --- a/src/Symfony/Bridge/Twig/Resources/views/Form/form_table_layout.html.twig +++ b/src/Symfony/Bridge/Twig/Resources/views/Form/form_table_layout.html.twig @@ -1,9 +1,9 @@ -{% use "form_div_layout.html.twig" %} +{% use 'form_div_layout.html.twig' %} {%- block form_row -%} {%- set widget_attr = {} -%} {%- if help is not empty -%} - {%- set widget_attr = {attr: {'aria-describedby': id ~"_help"}} -%} + {%- set widget_attr = {attr: {'aria-describedby': id ~ '_help'}} -%} {%- endif -%} diff --git a/src/Symfony/Bridge/Twig/Resources/views/Form/foundation_5_layout.html.twig b/src/Symfony/Bridge/Twig/Resources/views/Form/foundation_5_layout.html.twig index 23e463e6822f0..b60f41e8eddfd 100644 --- a/src/Symfony/Bridge/Twig/Resources/views/Form/foundation_5_layout.html.twig +++ b/src/Symfony/Bridge/Twig/Resources/views/Form/foundation_5_layout.html.twig @@ -1,4 +1,4 @@ -{% extends "form_div_layout.html.twig" %} +{% extends 'form_div_layout.html.twig' %} {# Based on Foundation 5 Doc #} {# Widgets #} @@ -68,8 +68,8 @@
{{ form_errors(form.time) }}
-
{{ form_widget(form.date, { datetime: true } ) }}
-
{{ form_widget(form.time, { datetime: true } ) }}
+
{{ form_widget(form.date, {datetime: true}) }}
+
{{ form_widget(form.time, {datetime: true}) }}
{% endif %} {%- endblock datetime_widget %} @@ -156,7 +156,7 @@ {%- endif -%}