Project

General

Profile

Actions

Bug #106512

open

CKEditor 5: custom transformation do not allow null in regular expression transformation

Added by Rémi Payette 23 days ago. Updated 20 days ago.

Status:
New
Priority:
Should have
Assignee:
-
Category:
RTE (rtehtmlarea + ckeditor)
Target version:
-
Start date:
2025-04-04
Due date:
% Done:

0%

Estimated time:
TYPO3 Version:
13
PHP Version:
8.2
Tags:
Complexity:
Is Regression:
Sprint Focus:

Description

I was trying to do the exact same thing as the original poster of #104827

The fix for the From: part works great, but null still isn't accepted in the To: part, which for ckeditor means : dont replace that part, keep it as is.

https://ckeditor.com/docs/ckeditor5/latest/api/module_typing_typingconfig-TextTransformationDescription.html

Let say I want to put pipes around every word :

editor:
  config:
    typing:
      transformations:
        extra: [
          {
            from: { pattern: '(\s)([A-Za-z]*)(\s)$' },
            to: [ ' |', null, '| ' ]
          }
        ]
TypeError: right-hand side of 'in' should be an object, got null

I'm sorry if I missed something obvious, I have not yet earned my "typo3 master" badge.


Related issues 1 (0 open1 closed)

Related to TYPO3 Core - Bug #104827: CKEditor 5: custom transformation do not allow regular expressions due to escapingClosed2024-09-05

Actions
Actions #1

Updated by Garvin Hicking 23 days ago

  • Related to Bug #104827: CKEditor 5: custom transformation do not allow regular expressions due to escaping added
Actions #2

Updated by S P 23 days ago

In your specific example it should be possible to just not capture the middle part:

{
  from: { pattern: '(\s)[A-Za-z]*(\s)$' },
  to: [ ' |', '| ' ]
}

That's generally true for regular expressions, by the way: only ever capture stuff you actually need. It performs faster, keeps code more readible and intentions more clear.

If you need the parenthesis for scoping of complex expressions (disjunctions or similar), you can still mark them as non-captured using the ?: flag: (?:[A-Za-z]*) (I'm assuming a "normal" regex engine inside CKeditor - since it is JS it should be possible)

Actions #3

Updated by Rémi Payette 20 days ago

I have not tested if it works ( the non-capture of certain groups ) but it's contrary to what the ckeditor doc says :

The input value (from) can be passed either as a string or as a regular expression.
  • If a string is passed, it will be simply checked if the end of the input matches it.
  • If a regular expression is passed, its entire length must be covered with capturing groups (e.g. /(foo)(bar)$/). Also, since it is compared against the end of the input, it has to end with $ to be correctly matched. See examples below.

https://ckeditor.com/docs/ckeditor5/latest/api/module_typing_typingconfig-TextTransformationDescription.html ( 4th line of text in the page )

I'm afraid it will work only in certain conditions or stop working at any update in the future.

Actions #4

Updated by Rémi Payette 20 days ago

I tested without capturing group and with ?: , result are the same : the pipes get at the beggining of the replacement, space, and the word missing it's first letter.

someword

become
|| omeword
Actions

Also available in: Atom PDF