Problem

  1. The $format_id parameter to check_markup() is optional currently, even though calling code should always know the text format in which the user input has been created.
  2. The $langcode parameter defaults to an empty string, even though there is a language code for denoting unspecified language.

Proposed solution

  1. Make $format_id required. Still allow to pass NULL to use the fallback format in edge-case scenarios.

  2. Make $langcode default to LanguageInterface::LANGCODE_NOT_SPECIFIED, so text is always processed with a proper language code.


Spin-off from #569238: Make check_markup() not cache by default:

Discussion revealed that all code totally has to pass a $langcode to check_markup(), so all filters can safely rely on it. Aforementioned issue also contained a patch that tried to fix the invocations we have in core to pass the proper language code for filtered nodes, comments, and all that.

We want to drop the default of '' for the $langcode argument for check_markup(), because implementations should _always_ pass a language code.


Contributor tasks needed
Task Novice task? Contributor instructions Complete?
Implement proposed work Novice
Should the issue summary be updated? Form opinion Novice Instructions
Doublecheck the change record for the API changes Novice Instructions
Review patch to ensure that it fixes the issue, stays within scope, is properly documented, and follows coding standards Novice Instructions

Comments

sun’s picture

This is quite a challenge to solve, because we have many places (for example comments), where we do not have context (such as in http://api.drupal.org/api/function/comment_submit/7), and then again, even if we would have the context of the node, then translatable fields make it a bit harder to reliably determine the language of the node (since we should assume that a comment is written in the same language of the content that is displayed and commented on -- unless we display a language selector for comments ;).

sun’s picture

The overall question boils down to: If there is no direct language context (like for comments), should we take over the language from the "parent" object (here: node)?

Note: I'm fully aware that another issue in the queue adds language context to comments, so please take the question in an abstracted way.

nedjo’s picture

For context, passing language to filters was introduced in #319788: Pass language information to filters.

all code totally has to pass a $langcode to check_markup(), so all filters can safely rely on it.

sun, could you expand? Why? Is passing a code like FIELD_LANGUAGE_NONE an option when the language isn't known?

Some objects that we check markup for just don't have a language, even that of a parent. Blocks would be one: block_block_view(). So it's hard to see how we would pass a meaningful language code in every case.

sun’s picture

These were the changes from that other patch:

+++ modules/block/block.module	11 Sep 2009 15:52:36 -0000
@@ -177,7 +177,7 @@ function block_block_save($delta = 0, $e
 function block_block_view($delta = 0, $edit = array()) {
   $block = db_query('SELECT body, format FROM {block_custom} WHERE bid = :bid', array(':bid' => $delta))->fetchObject();
-  $data['content'] = check_markup($block->body, $block->format);
+  $data['content'] = check_markup($block->body, $block->format, $GLOBALS['language']->language, TRUE);
   return $data;
 }
+++ modules/comment/comment.module	11 Sep 2009 15:55:11 -0000
@@ -827,7 +827,7 @@ function comment_build_content($comment,
   // Build comment body.
   $comment->content['comment_body'] = array(
-    '#markup' => check_markup($comment->comment, $comment->format),
+    '#markup' => check_markup($comment->comment, $comment->format, $node->language, TRUE),
   );
@@ -1144,7 +1144,7 @@ function comment_node_update_index($node
     foreach ($comments as $comment) {
-      $text .= '<h2>' . check_plain($comment->subject) . '</h2>' . check_markup($comment->comment, $comment->format);
+      $text .= '<h2>' . check_plain($comment->subject) . '</h2>' . check_markup($comment->comment, $comment->format, $node->language, TRUE);
     }
+++ modules/comment/comment.tokens.inc	11 Sep 2009 15:56:41 -0000
@@ -175,7 +175,7 @@ function comment_tokens($type, $tokens, 
         case 'body':
-          $replacements[$original] = $sanitize ? check_markup($comment->comment, $comment->format) : $replacements[$original] = $comment->comment;
+          $replacements[$original] = $sanitize ? check_markup($comment->comment, $comment->format, $language_code, TRUE) : $replacements[$original] = $comment->comment;
           break;
 
+++ modules/node/node.api.php	11 Sep 2009 15:59:43 -0000
@@ -486,7 +486,7 @@ function hook_node_update_index($node) {
   $text = '';
   $comments = db_query('SELECT subject, comment, format FROM {comment} WHERE nid = :nid AND status = :status', array(':nid' => $node->nid, ':status' => COMMENT_PUBLISHED));
   foreach ($comments as $comment) {
-    $text .= '<h2>' . check_plain($comment->subject) . '</h2>' . check_markup($comment->comment, $comment->format);
+    $text .= '<h2>' . check_plain($comment->subject) . '</h2>' . check_markup($comment->comment, $comment->format, $node->language, TRUE);
   }
   return $text;
+++ modules/profile/profile.module	11 Sep 2009 16:00:37 -0000
@@ -292,7 +292,7 @@ function profile_view_field($account, $f
     switch ($field->type) {
       case 'textarea':
-        return check_markup($value);
+        return check_markup($value, FILTER_FORMAT_DEFAULT, '', TRUE);
+++ modules/user/user.module	11 Sep 2009 16:00:59 -0000
@@ -2681,7 +2681,7 @@ function user_forms() {
 function user_comment_view($comment) {
   if (variable_get('user_signatures', 0) && !empty($comment->signature)) {
-    $comment->signature = check_markup($comment->signature, $comment->format);
+    $comment->signature = check_markup($comment->signature, $comment->format, '', TRUE);
   }
   else {
     $comment->signature = '';

If we would subtract comments from that (assuming that #605630: Comment language administration UI gets committed), then it would boil down to:

- Body of custom blocks (which only have a language through the i18n contrib module currently, unless #430886: Make all blocks fieldable entities is committed)

- Profile module textareas (which may take over the user's preferred language setting)

- User signature (attached to comments) (which may take over the user's preferred language setting)

This review is powered by Dreditor.

sun.core’s picture

Version: 7.x-dev » 8.x-dev

Blargh.

pasqualle’s picture

Priority: Critical » Normal
Issue tags: -i18n sprint, -D7 API clean-up
wim leers’s picture

Issue summary: View changes
Issue tags: +Novice, +php-novice

Now that #2217877: Text filters should be able to add #attached, #post_render_cache, and cache tags has landed, this will actually be quite trivial fix.

cs_shadow’s picture

At all places, where check_markup() is called without a $langcode, are those supposed to be fixed here only or that'll require a follow-up?

wim leers’s picture

Since there are only a dozen calls to check_markup() left, I'd say it can and should happen in this issue.

cs_shadow’s picture

Status: Active » Needs review
StatusFileSize
new11.44 KB

Couple of things to notice:

  1. Function signature for check_markup() has changed. Now $langcode appears before $format_id, which is still optional while $langcode is required. Since its an API change, it may require a change notice.
  2. Places where check_markup() was called without a language code, in calls to check_markup() an empty string is used currently.

Status: Needs review » Needs work

The last submitted patch, 10: filter-601074-10.patch, failed testing.

Status: Needs work » Needs review

cs_shadow queued 10: filter-601074-10.patch for re-testing.

wim leers’s picture

Status: Needs review » Needs work
+++ b/core/modules/ckeditor/src/Plugin/CKEditorPlugin/Internal.php
@@ -325,7 +325,7 @@ protected function generateFormatTagsSetting(Editor $editor) {
+        $output = trim(check_markup($input, '', $editor->id()));

This should be Drupal\Core\Language::LANGCODE_NOT_SPECIFIED. Also elsewhere where the empty string is used.

sun’s picture

Can we keep the current order of arguments to check_markup(), please?

I almost forgot that the format is still optional to check_markup(). Making it optional was one of the worst ideas ever. User input is entered with and for a selected text format, it must be filtered and formatted with the same format. You need to know the format to use, or the necessary filter rules won't be applied. If you don't, then the result of check_markup() will be useless garbage.

Instead, we should change the signature to make the format required. If necessary, we may allow to pass FALSE to resemble the currently automated fallback format behavior. But the argument should be required.

wim leers’s picture

#14: I couldn't agree more! :)

wim leers’s picture

In fact, I was writing a tweet to you just now, sun, to ask you about precisely that :D

cs_shadow’s picture

@Wim: In cases where langcode is not specified, should i include Drupal\Core\Language or use the fully qualified name for LANGCODE_NOT_SPECIFIED?

cs_shadow’s picture

Title: $langcode must be required for check_markup() » $langcode and $format_id must be required for check_markup()
Issue summary: View changes
cs_shadow’s picture

Status: Needs work » Needs review
StatusFileSize
new10.72 KB

Changes from patch in #10:

1. Order of parameters retained.
2. Made $format_id required.
3. Pass NULL in places where $format_id was not passed earlier.
4. Pass LanguageInterface::LANGCODE_NOT_SPECIFIED in places where $langcode was either not specified earlier or empty string was used.

sun’s picture

Hm. According to the issue summary (…which happens to have been authored by a former self, though I can't remember), the main intention of the original change proposal appears to be that check_markup() should not have to deal with a $langcode that may be an empty string, but instead, always operate on a defined language code.

This issue was created long before the language system was improved for D8. Technically, we do not necessarily have to force all callers to pass an explicit language. Thanks to those improvements, today, we could simply change the default value:

-function check_markup($text, $format_id = NULL, $langcode = '', $filter_types_to_skip = array()) {
+function check_markup($text, $format_id, $langcode = LanguageInterface::LANGCODE_NOT_SPECIFIED, $filter_types_to_skip = array()) {

The required nature of $format_id is crystal clear to me, but $langcode looks & feels pretty optional to me. So:

If a caller forgets to pass a language, What Could Possibly Go Wrong?™

Status: Needs review » Needs work

The last submitted patch, 19: filter-601074-19.patch, failed testing.

cs_shadow’s picture

OK, now I'm a bit confused about what we're trying to do here. From what I understand if any format_id is not specified, same way as text in the fallback format. And that's precisely why this test is in place: Drupal\filter\Tests\FilterNoFormatTest.

  /**                                                                                                                                                 
   * Tests text without format.                                                                                                                       
   *                                                                                                                                                  
   * Tests if text with no format is filtered the same way as text in the                                                                             
   * fallback format.                                                                                                                                 
   */                                                                                                                                                 
  function testCheckMarkupNoFormat() {                                                                                                                
    // Create some text. Include some HTML and line breaks, so we get a good                                                                          
    // test of the filtering that is applied to it.                                                                                                   
    $text = "<strong>" . $this->randomName(32) . "</strong>\n\n<div>" . $this->randomName(32) . "</div>";                                             
                                                                                                                                                      
    // Make sure that when this text is run through check_markup() with no text                                                                       
    // format, it is filtered as though it is in the fallback format.                                                                                 
    $this->assertEqual(check_markup($text, NULL, LanguageInterface::LANGCODE_NOT_SPECIFIED), check_markup($text, filter_fallback_format(), LanguageInt
  }                                                                                                                                                   

On the other hand, there's no such test in place for default langcode. Something is wrong here.

sun’s picture

Yes, the changes to $format_id in the latest patch look fine to me. The functionality is still the same, we're just making the parameter required. Therefore, all existing tests still apply (and have been adjusted correctly, upon a cursory look).

I guess there is probably no explicit test coverage for passing/omitting a language yet. (AFAIK, we don't have a filter implementation in core that would use or rely on the language. We only have a dummy test filter implementation that simply dumps all filter context variables into the resulting content.)

I'm still not sure whether we need to make the $langcode parameter required, or simply make it default to LanguageInterface::LANGCODE_NOT_SPECIFIED. It sounds perfectly acceptable to me to not pass a language code into check_markup() — input filters will simply produce language-agnostic output. If you expected language-aware output, then you should pass an explicit language code.

In any case, the effective change to HEAD is that $langcode can no longer be an empty string, but instead, it is always a language code.

In short, I think we should move forward with the signature in #20; i.e., make $format_id required + change the default value of $langcode.

wim leers’s picture

Title: $langcode and $format_id must be required for check_markup() » check_markup(): $format_id must be required, $langcode must default to LANGCODE_NOT_SPECIFIED

I'm still not sure whether we need to make the $langcode parameter required, or simply make it default to LanguageInterface::LANGCODE_NOT_SPECIFIED. It sounds perfectly acceptable to me to not pass a language code into check_markup() — input filters will simply produce language-agnostic output. If you expected language-aware output, then you should pass an explicit language code.

+1

Adjusting title accordingly.

cs_shadow’s picture

Someone needs to rewrite the issue summary what we really want (refer to @sun's comment in #23).

cs_shadow’s picture

StatusFileSize
new8.18 KB
new6.18 KB

Patch with following changes:

1. Function changed as per #20.
2. Removed LanguageInterface::LANGCODE_NOT_SPECIFIED from calls to check_markup() where it was not required.

Let's see if testbot agrees.

cs_shadow’s picture

Status: Needs work » Needs review

Status: Needs review » Needs work

The last submitted patch, 26: interdiff-19-26.patch, failed testing.

cs_shadow’s picture

Status: Needs work » Needs review
StatusFileSize
new6.18 KB

Uploading the interdiff in correct format.

sun’s picture

Title: check_markup(): $format_id must be required, $langcode must default to LANGCODE_NOT_SPECIFIED » check_markup(): $format_id must be required, $langcode should default to LANGCODE_NOT_SPECIFIED
Issue summary: View changes

Thanks! Looks great - only some small nits:

  1. +++ b/core/modules/filter/filter.module
    @@ -442,13 +443,12 @@ function filter_fallback_format() {
    - * @param string|null $format_id
    - *   (optional) The machine name of the filter format to be used to filter the
    - *   text. Defaults to the fallback format. See filter_fallback_format().
    + * @param string $format_id
    + *   The machine name of the filter format to be used to filter the text.
    

    Let's keep the 2nd + 3rd sentence of the @param description, but adjust it to state:

    If NULL, the fallback format is used; see filter_fallback_format().

  2. +++ b/core/modules/filter/filter.module
    @@ -442,13 +443,12 @@ function filter_fallback_format() {
      * @param string $langcode
    ...
    + *   replacement can be implemented. Defaults to 'und'.
    

    The default value should reference the fully-qualified LanguageInterface constant name instead of its internal value.

Updated the issue summary.

cs_shadow’s picture

StatusFileSize
new1.02 KB
new8.31 KB

Fixed the issues in #30.

cs_shadow’s picture

cs_shadow’s picture

@sun: Is anything else required here?

sun’s picture

Status: Needs review » Reviewed & tested by the community

There's no validation for whether the passed language code is a valid language code, and the expected behavior is undefined, and thus no test is added here.

IMO that's fine, since it is not Filter module's job to perform such a validation - the $langcode is just simply forwarded into the filter process.

alexpott’s picture

Status: Reviewed & tested by the community » Needs work
Issue tags: +Needs change record

We need a change record for this one.

cs_shadow’s picture

Status: Needs work » Needs review
Issue tags: -Needs change record
tim.plunkett’s picture

+++ b/core/modules/filter/filter.module
@@ -463,7 +465,7 @@ function filter_fallback_format() {
-function check_markup($text, $format_id = NULL, $langcode = '', $filter_types_to_skip = array()) {
+function check_markup($text, $format_id, $langcode = LanguageInterface::LANGCODE_NOT_SPECIFIED, $filter_types_to_skip = array()) {

I don't understand what is accomplished here. Because of the move to '#type' => 'processed_text', filter_pre_render_text() still allows for a NULL $format_id, and we don't save any code.

wim leers’s picture

Status: Needs review » Needs work

#37: It's indeed possible to still set the format ID to NULL if you really want to; but the public API should really force you to set an actual format. That's what this is about.
However, if you're saying that the default of '#format' => NULL should be removed from filter_element_info(), then I agree. And if we do that, we'll also want to remove this from filter_pre_render_text():

  if (!isset($format_id)) {
    $format_id = filter_fallback_format();
  }

And perhaps instead of that, we'll want to throw an exception if '#format' is not set.

tim.plunkett’s picture

I think we should do both of the things mentioned in #38, that's what I had in mind.

roderik’s picture

Issue summary: View changes
Issue tags: -php-novice +Amsterdam2014

Tagging Amsterdam sprint.

filter_pre_render_text() was moved in commit 2c1fe04, but it still seems that the equivalent code block should be removed from core/modules/filter/src/Element/ProcessedText.php (where the code was moved to).

For (an) experienced Drupal/PHP coder but novice contributor(s):

- understand the issue generally
- check what is mentioned in #38/#39
- check my assumption
- do the work
- review the work
- check if this makes changes to the Change Record draft necessary.

roderik’s picture

Issue summary: View changes

(Fix wrong paste of 'contributor tasks' table in summary)

hctom’s picture

We will have a look at this...

rupertj’s picture

StatusFileSize
new9.23 KB

Here's a patch that implements the previous patch #31, plus Wim's comments in #38. hctom is working on tests.

hctom’s picture

StatusFileSize
new10.26 KB

Here is a patch that implements previous patches #31 and #43 and adds more changes:

  • Changed the documentation of check_markup() to reflect required $format_id argument
  • Improved documentation of Drupal\filter\Element\ProcessedText to name the new exception thats thrown when no $format_id is passed
  • Changed Drupal\filter\Tests\FilterNoFormatTest to check exception throwing when no $format_id is passed
  • Changed Drupal\views\Tests\Handler\AreaTextTest to not use check_plain($string, NULL) but check_plain($string, filter_fallback_format())
rupertj’s picture

Status: Needs work » Needs review
StatusFileSize
new6.72 KB

Attaching interdiff

wim leers’s picture

Can you re-upload the patch in #44? Testbot is not detecting it because you attached new files while setting the status to NR. Thanks :)

rupertj’s picture

StatusFileSize
new10.26 KB

Here you go.

Status: Needs review » Needs work

The last submitted patch, 47: filter-601074-44.patch, failed testing.

hctom’s picture

Status: Needs work » Needs review
hctom’s picture

StatusFileSize
new10.27 KB

After doing a rebase I recreated the patch of #44. See this comment for all applied changes.

Status: Needs review » Needs work

The last submitted patch, 50: filter-601074-50.patch, failed testing.

wim leers’s picture

A Format ID is not set exception is thrown, so the test coverage is uncovering another case where check_markup() is being called with $format_id = NULL :)

Should be an easy fix!

hctom’s picture

StatusFileSize
new12.97 KB

Unfortunately this is not such an easy fix, because there are several tests that rely on #format = NULL (e.g. Drupal\text\Tests\TextWithSummaryItemTest). So I now only additionally added filter_fallback_format() to all dynamic #format values and would like to hand over the the checking of the other tests to people who are more deep into the materia, because I do not want to supersede those tests by eventually making the wrong changes to them.

Attached you can find a patch containing all my recent changes as well as of course all changes from #31, #43 and #44.

hctom’s picture

StatusFileSize
new6.23 KB
new2.98 KB

Attached you can find 2 interdiffs. Hope these help?!

hctom’s picture

k4v’s picture

Status: Needs work » Needs review

Status: Needs review » Needs work

The last submitted patch, 53: filter-601074-52.patch, failed testing.

rpayanm’s picture

Status: Needs work » Needs review
StatusFileSize
new12.07 KB

re-rolled

Status: Needs review » Needs work

The last submitted patch, 58: 601074-58.patch, failed testing.

Scionar’s picture

Assigned: Unassigned » Scionar
Scionar’s picture

Assigned: Scionar » Unassigned
disasm’s picture

Issue tags: -Novice

I am removing the Novice tag from this issue because there are no easy action items for this task.

I’m using this documentation as a source: https://www.drupal.org/core-mentoring/novice-tasks#avoid

Version: 8.0.x-dev » 8.1.x-dev

Drupal 8.0.6 was released on April 6 and is the final bugfix release for the Drupal 8.0.x series. Drupal 8.0.x will not receive any further development aside from security fixes. Drupal 8.1.0-rc1 is now available and sites should prepare to update to 8.1.0.

Bug reports should be targeted against the 8.1.x-dev branch from now on, and new development or disruptive changes should be targeted against the 8.2.x-dev branch. For more information see the Drupal 8 minor version schedule and the Allowed changes during the Drupal 8 release cycle.

Version: 8.1.x-dev » 8.2.x-dev

Drupal 8.1.9 was released on September 7 and is the final bugfix release for the Drupal 8.1.x series. Drupal 8.1.x will not receive any further development aside from security fixes. Drupal 8.2.0-rc1 is now available and sites should prepare to upgrade to 8.2.0.

Bug reports should be targeted against the 8.2.x-dev branch from now on, and new development or disruptive changes should be targeted against the 8.3.x-dev branch. For more information see the Drupal 8 minor version schedule and the Allowed changes during the Drupal 8 release cycle.

Version: 8.2.x-dev » 8.3.x-dev

Drupal 8.2.6 was released on February 1, 2017 and is the final full bugfix release for the Drupal 8.2.x series. Drupal 8.2.x will not receive any further development aside from critical and security fixes. Sites should prepare to update to 8.3.0 on April 5, 2017. (Drupal 8.3.0-alpha1 is available for testing.)

Bug reports should be targeted against the 8.3.x-dev branch from now on, and new development or disruptive changes should be targeted against the 8.4.x-dev branch. For more information see the Drupal 8 minor version schedule and the Allowed changes during the Drupal 8 release cycle.

Version: 8.3.x-dev » 8.4.x-dev

Drupal 8.3.6 was released on August 2, 2017 and is the final full bugfix release for the Drupal 8.3.x series. Drupal 8.3.x will not receive any further development aside from critical and security fixes. Sites should prepare to update to 8.4.0 on October 4, 2017. (Drupal 8.4.0-alpha1 is available for testing.)

Bug reports should be targeted against the 8.4.x-dev branch from now on, and new development or disruptive changes should be targeted against the 8.5.x-dev branch. For more information see the Drupal 8 minor version schedule and the Allowed changes during the Drupal 8 release cycle.

Version: 8.4.x-dev » 8.5.x-dev

Drupal 8.4.4 was released on January 3, 2018 and is the final full bugfix release for the Drupal 8.4.x series. Drupal 8.4.x will not receive any further development aside from critical and security fixes. Sites should prepare to update to 8.5.0 on March 7, 2018. (Drupal 8.5.0-alpha1 is available for testing.)

Bug reports should be targeted against the 8.5.x-dev branch from now on, and new development or disruptive changes should be targeted against the 8.6.x-dev branch. For more information see the Drupal 8 minor version schedule and the Allowed changes during the Drupal 8 release cycle.

Version: 8.5.x-dev » 8.6.x-dev

Drupal 8.5.6 was released on August 1, 2018 and is the final bugfix release for the Drupal 8.5.x series. Drupal 8.5.x will not receive any further development aside from security fixes. Sites should prepare to update to 8.6.0 on September 5, 2018. (Drupal 8.6.0-rc1 is available for testing.)

Bug reports should be targeted against the 8.6.x-dev branch from now on, and new development or disruptive changes should be targeted against the 8.7.x-dev branch. For more information see the Drupal 8 minor version schedule and the Allowed changes during the Drupal 8 release cycle.

Version: 8.6.x-dev » 8.8.x-dev

Drupal 8.6.x will not receive any further development aside from security fixes. Bug reports should be targeted against the 8.8.x-dev branch from now on, and new development or disruptive changes should be targeted against the 8.9.x-dev branch. For more information see the Drupal 8 and 9 minor version schedule and the Allowed changes during the Drupal 8 and 9 release cycles.

Version: 8.8.x-dev » 8.9.x-dev

Drupal 8.8.7 was released on June 3, 2020 and is the final full bugfix release for the Drupal 8.8.x series. Drupal 8.8.x will not receive any further development aside from security fixes. Sites should prepare to update to Drupal 8.9.0 or Drupal 9.0.0 for ongoing support.

Bug reports should be targeted against the 8.9.x-dev branch from now on, and new development or disruptive changes should be targeted against the 9.1.x-dev branch. For more information see the Drupal 8 and 9 minor version schedule and the Allowed changes during the Drupal 8 and 9 release cycles.

Version: 8.9.x-dev » 9.2.x-dev

Drupal 8 is end-of-life as of November 17, 2021. There will not be further changes made to Drupal 8. Bugfixes are now made to the 9.3.x and higher branches only. For more information see the Drupal core minor version schedule and the Allowed changes during the Drupal core release cycle.

Version: 9.2.x-dev » 9.3.x-dev

Version: 9.3.x-dev » 9.4.x-dev

Drupal 9.3.15 was released on June 1st, 2022 and is the final full bugfix release for the Drupal 9.3.x series. Drupal 9.3.x will not receive any further development aside from security fixes. Drupal 9 bug reports should be targeted for the 9.4.x-dev branch from now on, and new development or disruptive changes should be targeted for the 9.5.x-dev branch. For more information see the Drupal core minor version schedule and the Allowed changes during the Drupal core release cycle.

Version: 9.4.x-dev » 9.5.x-dev

Drupal 9.4.9 was released on December 7, 2022 and is the final full bugfix release for the Drupal 9.4.x series. Drupal 9.4.x will not receive any further development aside from security fixes. Drupal 9 bug reports should be targeted for the 9.5.x-dev branch from now on, and new development or disruptive changes should be targeted for the 10.1.x-dev branch. For more information see the Drupal core minor version schedule and the Allowed changes during the Drupal core release cycle.

quietone’s picture

This was an issue at a bugsmash group triage. After reading the comments and looking at the patch and the existing code, this appear to still be relevant. This does need an Issue Summary update. And it needs tests, see #52 and #53.

Version: 9.5.x-dev » 11.x-dev

Drupal core is moving towards using a “main” branch. As an interim step, a new 11.x branch has been opened, as Drupal.org infrastructure cannot currently fully support a branch named main. New developments and disruptive changes should now be targeted for the 11.x branch. For more information, see the Drupal core minor version schedule and the Allowed changes during the Drupal core release cycle.

Version: 11.x-dev » main

Drupal core is now using the main branch as the primary development branch. New developments and disruptive changes should now be targeted to the main branch.

Read more in the announcement.