fix our ruby/group hack

This commit is contained in:
dakkar 2025-02-07 18:20:36 +00:00
parent 29b1f61d67
commit d426e2a7ef
2 changed files with 18 additions and 9 deletions

View file

@ -179,7 +179,8 @@ export class MfmService {
break; break;
} }
case 'ruby': { // this is here only to catch upstream changes!
case 'ruby--': {
let ruby: [string, string][] = []; let ruby: [string, string][] = [];
for (const child of node.childNodes) { for (const child of node.childNodes) {
if (child.nodeName === 'rp') { if (child.nodeName === 'rp') {
@ -310,16 +311,24 @@ export class MfmService {
continue; continue;
} }
if (child.nodeName === 'rt') { if (child.nodeName === 'rt') {
text += '$[ruby $[group '; // the only case in which we don't need a `$[group ]`
// is when both sides of the ruby are simple words
const needsGroup = nonRtNodes.length > 1 ||
/\s|\[|\]/.test(getText(nonRtNodes[0])) ||
/\s|\[|\]/.test(getText(child)) ;
text += '$[ruby ';
if (needsGroup) text += '$[group ';
appendChildren(nonRtNodes); appendChildren(nonRtNodes);
text += '] '; if (needsGroup) text += ']';
text += ' ';
analyze(child); analyze(child);
text += '] '; text += ']';
nonRtNodes = []; nonRtNodes = [];
continue; continue;
} }
nonRtNodes.push(child); nonRtNodes.push(child);
} }
appendChildren(nonRtNodes);
} }
break; break;
} }

View file

@ -158,16 +158,16 @@ describe('MfmService', () => {
}); });
test('ruby with spaces', () => { test('ruby with spaces', () => {
assert.deepStrictEqual(mfmService.fromHtml('<p>a <ruby>Miss key<rp>(</rp><rt>ミスキー</rt><rp>)</rp> b</ruby> c</p>'), 'a Miss key(ミスキー) b c'); assert.deepStrictEqual(mfmService.fromHtml('<p>a <ruby>Miss key<rp>(</rp><rt>ミスキー</rt><rp>)</rp> b</ruby> c</p>'), 'a $[ruby $[group Miss key] ミスキー] b c');
assert.deepStrictEqual(mfmService.fromHtml('<p>a <ruby>Misskey<rp>(</rp><rt>ミス キー</rt><rp>)</rp> b</ruby> c</p>'), 'a Misskey(ミス キー) b c'); assert.deepStrictEqual(mfmService.fromHtml('<p>a <ruby>Misskey<rp>(</rp><rt>ミス キー</rt><rp>)</rp> b</ruby> c</p>'), 'a $[ruby $[group Misskey] ミス キー] b c');
assert.deepStrictEqual( assert.deepStrictEqual(
mfmService.fromHtml('<p>a <ruby>Misskey<rp>(</rp><rt>ミスキー</rt><rp>)</rp>Misskey<rp>(</rp><rt>ミス キー</rt><rp>)</rp>Misskey<rp>(</rp><rt>ミスキー</rt><rp>)</rp></ruby> b</p>'), mfmService.fromHtml('<p>a <ruby>Misskey<rp>(</rp><rt>ミスキー</rt><rp>)</rp>Misskey<rp>(</rp><rt>ミス キー</rt><rp>)</rp>Misskey<rp>(</rp><rt>ミスキー</rt><rp>)</rp></ruby> b</p>'),
'a Misskey(ミスキー)Misskey(ミス キー)Misskey(ミスキー) b' 'a $[ruby Misskey ミスキー]$[ruby $[group Misskey] ミス キー]$[ruby Misskey ミスキー] b'
); );
}); });
test('ruby with other inline tags', () => { test('ruby with other inline tags', () => {
assert.deepStrictEqual(mfmService.fromHtml('<p>a <ruby><strong>Misskey</strong><rp>(</rp><rt>ミスキー</rt><rp>)</rp> b</ruby> c</p>'), 'a **Misskey**(ミスキー) b c'); assert.deepStrictEqual(mfmService.fromHtml('<p>a <ruby><strong>Misskey</strong><rp>(</rp><rt>ミスキー</rt><rp>)</rp> b</ruby> c</p>'), 'a $[ruby **Misskey** ミスキー] b c');
}); });
test('mention', () => { test('mention', () => {
@ -181,7 +181,7 @@ describe('MfmService', () => {
test('ruby', () => { test('ruby', () => {
assert.deepStrictEqual( assert.deepStrictEqual(
mfmService.fromHtml('<ruby> <i>some</i> text <rp>(</rp><rt>ignore me</rt><rp>)</rp> and <rt>more</rt></ruby>'), mfmService.fromHtml('<ruby> <i>some</i> text <rp>(</rp><rt>ignore me</rt><rp>)</rp> and <rt>more</rt></ruby>'),
'$[ruby $[group <i>some</i> text ] ignore me] $[ruby $[group and ] more]' '$[ruby $[group <i>some</i> text ] ignore me]$[ruby $[group and ] more]'
); );
}); });
}); });