---
title: "Feature: Program facts know whether they are rich text"
manual: "Academic Programs"
version: "main"
permalink: "https://docs.typo3.org/permalink/fgtclb/academic-programs:feature-programs-facts-know-rich-text@main"
source: "Changelog/3.0/Feature-ProgramFactsKnowRichText.rst"
rendered: "2026-10-17T08:47:58+00:00"
---

# Feature: Program facts know whether they are rich text {#feature-programs-facts-know-rich-text}

## Description {#description}

The facts of a program, on the program page, in the **Course Data**
content element and on the cards of the **Course List**, now know
whether the value of a program field is rich text. The job profile, the
performance scope and the prerequisites are rich text while their field has the
rich text editor on program pages, which it has as shipped.

The decision follows the TCA of `pages` for the program page type. A site
package that switches the editor off for one of the fields, for every page type
or in the `columnsOverrides` of the program page type only, changes the facts
without a template of its own. See [Rich text facts](https://docs.typo3.org/permalink/fgtclb/academic-programs:program-facts-rich-text@main).

`Program/Facts/Item.html` uses the new property `{fact.isRichText}`:

-   The value of a rich text fact is rendered as it is stored, as before, in an
    element with the class `ce-bodytext` next to `ace-value`, so
    the styles a site gives to
    the body text of content elements apply to it.
-   Any other value, the credit points and a text field without the editor, is
    escaped, and its line breaks are kept.

An override of the partial adopts the same branches:

**Program/Facts/Item.html**

```html
<f:if condition="{fact.isRichText}">
    <f:then>
        <span class="ace-value ce-bodytext">
            {fact.value -> f:format.raw()}
        </span>
    </f:then>
    <f:else>
        <span class="ace-value">
            <f:if condition="{fact.isCategoryType}">
                <f:then>
                    <f:for each="{fact.categories}" as="category" iteration="i">
                        {category.title}{f:if(condition: '!{i.isLast}', then: ', ')}
                    </f:for>
                </f:then>
                <f:else>
                    {fact.value -> f:format.nl2br()}
                </f:else>
            </f:if>
        </span>
    </f:else>
</f:if>
```

## Impact {#impact}

With the shipped configuration the facts show the same values as before. The
value element of the three text facts gains the class `ce-bodytext`, every
other value element carries `ace-value` alone.

A project that switched the rich text editor off for one of the three fields
sees a change, and it is intended: the facts used to print the stored text as
HTML, unescaped and without its line breaks, although the backend offered the
field as plain text. They now show it as text. Stored markup, typed into the
field or left from the time it had the editor, appears literally. Such a project
either switches the editor on again for the field, or overrides
`Program/Facts/Item.html` and keeps printing the value with
`f:format.raw()`.

An override of `Program/Facts/Item.html` that prints every value raw keeps
its output and gets no class.
