CKEditor 5 "left" alignment doesn't inject "text-align-left" class to elements

Created on 12 January 2024, almost 2 years ago

Problem/Motivation

CKEditor 5 in Drupal 10.2.x doesn't add the class "text-align-left" when the text is left align. It causes issues in RTL pages, where all the text is automatically positioned to the right, and the content editors cannot align it left.

Steps to reproduce

1. Enable the text alignment button in admin/config/content/formats
2. In any new or existing content, add some text and click the "align left" option in the WYSIWYG toolbar
3. Click the source button (in Full HTML profile) to check the injected classes
4. Save the content and inspect the element in the page

Proposed resolution

๐Ÿ› Bug report
Status

Active

Version

10.2 โœจ

Component
CKEditor 5ย  โ†’

Last updated about 2 months ago

Created by

๐Ÿ‡ง๐Ÿ‡ทBrazil bruno.bicudo Braganรงa Paulista - Sรฃo Paulo

Live updates comments and jobs are added and updated live.
Sign in to follow issues

Comments & Activities

  • Issue created by @bruno.bicudo
  • Status changed to Postponed: needs info almost 2 years ago
  • ๐Ÿ‡ฆ๐Ÿ‡บAustralia larowlan ๐Ÿ‡ฆ๐Ÿ‡บ๐Ÿ.au GMT+10

    Can you reproduce this in a fresh install?

  • ๐Ÿ‡ง๐Ÿ‡ทBrazil bruno.bicudo Braganรงa Paulista - Sรฃo Paulo

    @larowlan I recorded this evidence โ†’ from simplytest.me with a "Drupal Core" 10.2.1 sandbox.

    If you need it, I can also take an evidence from a local fresh environment.

    Thanks! :)

  • Status changed to Active almost 2 years ago
  • ๐Ÿ‡ฆ๐Ÿ‡บAustralia larowlan ๐Ÿ‡ฆ๐Ÿ‡บ๐Ÿ.au GMT+10

    Thanks

  • Status changed to Postponed: needs info over 1 year ago
  • ๐Ÿ‡ง๐Ÿ‡ชBelgium wim leers Ghent ๐Ÿ‡ง๐Ÿ‡ช๐Ÿ‡ช๐Ÿ‡บ

    So you're saying this used to work correctly in 10.0 and 10.1? ๐Ÿค”

  • ๐Ÿ‡ฌ๐Ÿ‡งUnited Kingdom vitaliych

    This is happens and to the drupal 10.1.6

  • Status changed to Active 11 months ago
  • ๐Ÿ‡ซ๐Ÿ‡ฎFinland Alexander Tallqvist

    We're experiencing exactly the same issue with a site running Drupal 10.3.9. All the "text-align-*" classes get properly set except for the "text-align-left" one.

  • ๐Ÿ‡น๐Ÿ‡ณTunisia oumaimaneffati

    For anyone experiencing the issue where text-align-left is never output (because CKEditor 5 considers "left" the default and does not store it in the model), here is a workaround.

    You can implement this as a custom CKEditor 5 plugin. It overrides the alignment command to ensure that "left" is explicitly written to the model, allowing the downcast to output the correct class.

     const classMap = {
          left: 'text-align-left',
          center: 'text-align-center',
          right: 'text-align-right',
          justify: 'text-align-justify',
        };
    
        editor.once('ready', () => {
          const command = editor.commands.get('alignment');
    
          if (command) {
            this.listenTo(command, 'execute', (evt, data) => {
              const value = Array.isArray(data) ? data[0]?.value : data?.value;
              const selection = editor.model.document.selection;
              if (value === 'left') {
                editor.model.change(writer => {
                  for (const block of selection.getSelectedBlocks()) {
                    writer.setAttribute('alignment', 'left', block);
                  }
                });
                evt.stop();
              }
            });
          }
        });
    
        editor.conversion.for('downcast').attributeToAttribute({
          model: 'alignment',
          view: (modelValue) => {
            const cls = classMap[modelValue];
            return cls ? { key: 'class', value: cls } : null;
          },
          converterPriority: 'high',
        });
Production build 0.71.5 2024