Skip to content

Commit 98d2090

Browse files
authored
Merge pull request #11794 from Turbo87/rendered-html
components/rendered-html: Fix modifier triggering on `@html` changes
2 parents 6ea4d72 + a216b9f commit 98d2090

File tree

5 files changed

+78
-6
lines changed

5 files changed

+78
-6
lines changed

app/components/rendered-html.hbs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@
44
--}}
55
<TextContent
66
...attributes
7-
{{highlight-syntax selector="pre > code:not(.language-mermaid)"}}
8-
{{update-source-media this.colorScheme.resolvedScheme}}
9-
{{render-mermaids}}
7+
{{highlight-syntax @html selector="pre > code:not(.language-mermaid)"}}
8+
{{update-source-media this.colorScheme.resolvedScheme @html}}
9+
{{render-mermaids @html}}
1010
>
1111
{{html-safe @html}}
1212
</TextContent>

app/modifiers/highlight-syntax.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,10 @@ hljs.registerAliases('markup', { languageName: 'xml' });
4242
// common aliases
4343
hljs.registerAliases('rs', { languageName: 'rust' });
4444

45-
export default modifier((element, _, { selector }) => {
45+
export default modifier((element, [input], { selector }) => {
46+
// Consume the input argument to ensure the modifier reruns when it changes
47+
void input;
48+
4649
let elements = selector ? element.querySelectorAll(selector) : [element];
4750

4851
for (let element of elements) {

app/modifiers/render-mermaids.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,10 @@ export default class ScrollPositionModifier extends Modifier {
77
@service notifications;
88
@service mermaid;
99

10-
modify(element) {
10+
modify(element, [input]) {
11+
// Consume the input argument to ensure the modifier reruns when it changes
12+
void input;
13+
1114
// If the `mermaid` library is loaded (which should have happened in the controller)
1215
let mermaid = this.mermaid.loadTask.lastSuccessful?.value;
1316
if (mermaid) {

app/modifiers/update-source-media.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@ import { modifier } from 'ember-modifier';
66
*
77
* The code was adapted from https://larsmagnus.co/blog/how-to-make-images-react-to-light-and-dark-mode.
88
*/
9-
export default modifier((element, [colorPreference]) => {
9+
export default modifier((element, [colorPreference, input]) => {
10+
// Consume the input argument to ensure the modifier reruns when it changes
11+
void input;
12+
1013
let pictures = element.querySelectorAll('picture');
1114

1215
pictures.forEach(picture => {
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import { render, settled } from '@ember/test-helpers';
2+
import { module, test } from 'qunit';
3+
4+
import { hbs } from 'ember-cli-htmlbars';
5+
6+
import { setupRenderingTest } from 'crates-io/tests/helpers';
7+
8+
module('Component | RenderedHtml', function (hooks) {
9+
setupRenderingTest(hooks);
10+
11+
test('renders HTML', async function (assert) {
12+
this.htmlContent = '<p>Hello <strong>world</strong>!</p>';
13+
14+
await render(hbs`<RenderedHtml @html={{this.htmlContent}} />`);
15+
16+
assert.dom('p').hasText('Hello world!');
17+
assert.dom('strong').hasText('world');
18+
19+
this.set('htmlContent', '<p>Updated <em>content</em></p>');
20+
await settled();
21+
22+
assert.dom('p').hasText('Updated content');
23+
assert.dom('em').hasText('content');
24+
});
25+
26+
test('renders code blocks with syntax highlighting', async function (assert) {
27+
this.htmlContent = '<pre><code class="language-rust">fn main() {}</code></pre>';
28+
29+
await render(hbs`<RenderedHtml @html={{this.htmlContent}} />`);
30+
31+
assert.dom('pre').exists();
32+
assert.dom('code.language-rust').hasText('fn main() {}');
33+
assert.dom('.hljs-keyword').hasText('fn');
34+
assert.dom('.hljs-title').hasText('main');
35+
36+
this.set('htmlContent', '<pre><code class="language-rust">let x = 42;</code></pre>');
37+
await settled();
38+
39+
assert.dom('code.language-rust').hasText('let x = 42;');
40+
assert.dom('.hljs-keyword').hasText('let');
41+
assert.dom('.hljs-variable').hasText('x');
42+
assert.dom('.hljs-number').hasText('42');
43+
});
44+
45+
test('renders mermaid diagrams', async function (assert) {
46+
let mermaidService = this.owner.lookup('service:mermaid');
47+
await mermaidService.loadTask.perform();
48+
49+
this.htmlContent = '<pre><code class="language-mermaid">graph TD\n A --> B</code></pre>';
50+
51+
await render(hbs`<RenderedHtml @html={{this.htmlContent}} />`);
52+
53+
assert.dom('pre').exists();
54+
assert.dom('code.language-mermaid svg.flowchart').exists();
55+
assert.dom('.nodeLabel').hasText('A');
56+
57+
this.set('htmlContent', '<pre><code class="language-mermaid">graph TD\n X --> Y</code></pre>');
58+
await settled();
59+
60+
assert.dom('code.language-mermaid svg.flowchart').exists();
61+
assert.dom('.nodeLabel').hasText('X');
62+
});
63+
});

0 commit comments

Comments
 (0)