Skip to content

Commit a216b9f

Browse files
committed
components/rendered-html: Fix modifier triggering on @html changes
1 parent aeec7f3 commit a216b9f

File tree

5 files changed

+36
-7
lines changed

5 files changed

+36
-7
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 => {

tests/components/rendered-html-test.js

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { render } from '@ember/test-helpers';
1+
import { render, settled } from '@ember/test-helpers';
22
import { module, test } from 'qunit';
33

44
import { hbs } from 'ember-cli-htmlbars';
@@ -15,6 +15,12 @@ module('Component | RenderedHtml', function (hooks) {
1515

1616
assert.dom('p').hasText('Hello world!');
1717
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');
1824
});
1925

2026
test('renders code blocks with syntax highlighting', async function (assert) {
@@ -26,6 +32,14 @@ module('Component | RenderedHtml', function (hooks) {
2632
assert.dom('code.language-rust').hasText('fn main() {}');
2733
assert.dom('.hljs-keyword').hasText('fn');
2834
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');
2943
});
3044

3145
test('renders mermaid diagrams', async function (assert) {
@@ -39,5 +53,11 @@ module('Component | RenderedHtml', function (hooks) {
3953
assert.dom('pre').exists();
4054
assert.dom('code.language-mermaid svg.flowchart').exists();
4155
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');
4262
});
4363
});

0 commit comments

Comments
 (0)