Skip to content

Commit e2f5d27

Browse files
authored
fix(YfmTabs): correct serialization of yfm-tabs inside blockqoute (#201)
1 parent 9d27a3f commit e2f5d27

File tree

2 files changed

+67
-5
lines changed

2 files changed

+67
-5
lines changed

src/extensions/yfm/YfmTabs/YfmTabs.test.ts

Lines changed: 59 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import {builders} from 'prosemirror-test-builder';
33
import {createMarkupChecker} from '../../../../tests/sameMarkup';
44
import {ExtensionsManager} from '../../../core';
55
import {BaseNode, BaseSpecsPreset} from '../../base/specs';
6-
import {blockquoteNodeName, italicMarkName} from '../../markdown/specs';
6+
import {BlockquoteSpecs, blockquoteNodeName, italicMarkName} from '../../markdown/specs';
77

88
import {TabsNode, YfmTabsSpecs} from './YfmTabsSpecs';
99

@@ -19,10 +19,11 @@ afterEach(() => {
1919
});
2020

2121
const {schema, parser, serializer} = new ExtensionsManager({
22-
extensions: (builder) => builder.use(BaseSpecsPreset, {}).use(YfmTabsSpecs, {}),
22+
extensions: (builder) =>
23+
builder.use(BaseSpecsPreset, {}).use(BlockquoteSpecs).use(YfmTabsSpecs, {}),
2324
}).buildDeps();
2425

25-
const {doc, p, tab, tabs, tabPanel, tabsList} = builders<
26+
const {doc, p, bq, tab, tabs, tabPanel, tabsList} = builders<
2627
'doc' | 'p' | 'bq' | 'tab' | 'tabPanel' | 'tabs' | 'tabsList'
2728
>(schema, {
2829
doc: {nodeType: BaseNode.Doc},
@@ -119,4 +120,59 @@ describe('YfmTabs extension', () => {
119120
),
120121
);
121122
});
123+
124+
it('should correct parse and serialize yfm-tabs inside blockqute', () => {
125+
const markup = `
126+
> {% list tabs %}
127+
>
128+
> - Tab
129+
>
130+
> Content
131+
>
132+
> {% endlist %}`.trim();
133+
134+
same(
135+
markup,
136+
doc(
137+
bq(
138+
tabs(
139+
{
140+
class: 'yfm-tabs',
141+
'data-diplodoc-group': `defaultTabsGroup-${generatedId}`,
142+
},
143+
tabsList(
144+
{
145+
class: 'yfm-tab-list',
146+
role: 'tablist',
147+
},
148+
tab(
149+
{
150+
id: 'unknown',
151+
class: 'yfm-tab active',
152+
role: 'tab',
153+
'aria-controls': generatedId,
154+
'aria-selected': 'true',
155+
tabindex: '-1',
156+
'data-diplodoc-is-active': 'true',
157+
'data-diplodoc-id': 'tab',
158+
'data-diplodoc-key': 'tab',
159+
},
160+
'Tab',
161+
),
162+
),
163+
tabPanel(
164+
{
165+
id: generatedId,
166+
class: 'yfm-tab-panel active',
167+
role: 'tabpanel',
168+
'data-title': 'Tab',
169+
'aria-labelledby': 'tab',
170+
},
171+
p('Content'),
172+
),
173+
),
174+
),
175+
),
176+
);
177+
});
122178
});

src/extensions/yfm/YfmTabs/YfmTabsSpecs/toYfm.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,10 @@ export const toYfm: Record<TabsNode, SerializerNodeToken> = {
1515
},
1616

1717
[TabsNode.Tabs]: (state, node) => {
18-
state.write('{% list tabs %}\n\n');
18+
state.write('{% list tabs %}');
19+
state.write('\n');
20+
state.write('\n');
21+
1922
const children: Node[] = [];
2023
node.content.forEach((a) => {
2124
children.push(a);
@@ -24,7 +27,10 @@ export const toYfm: Record<TabsNode, SerializerNodeToken> = {
2427
const tabList = children[0].content;
2528

2629
tabList.forEach((tab, _, i) => {
27-
state.write('- ' + (tab.textContent || getPlaceholderContent(tab)) + '\n\n');
30+
state.write('- ' + (tab.textContent || getPlaceholderContent(tab)));
31+
state.write('\n');
32+
state.write('\n');
33+
2834
if (children[i + 1]) state.renderList(children[i + 1], ' ', () => ' ');
2935
});
3036

0 commit comments

Comments
 (0)