diff --git a/CHANGELOG.md b/CHANGELOG.md index eddcd86b0bab2f0576537a8d9e41dfee46007832..9380f23cfb9af824183aad39f9a528d046a7faf3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -54,6 +54,7 @@ (Cherry-picked from https://github.com/MisskeyIO/misskey/pull/869) - Fix: `/api/pages/update`ã«ã¦`name`を指定ã›ãšã«ãƒªã‚¯ã‚¨ã‚¹ãƒˆã™ã‚‹ã¨ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã™ã‚‹å•é¡Œã‚’ä¿®æ£ - Fix: AIセンシティブ判定㌠arm64 環境ã§å‹•ä½œã—ãªã„å•é¡Œã‚’ä¿®æ£ +- Fix: éžMisskeyç³»ã®ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã‹ã‚‰HTML`<ruby>`ã‚¿ã‚°ã‚’å«ã‚€ãƒŽãƒ¼ãƒˆã‚’å—ä¿¡ã—ãŸå ´åˆã€MFMã®èªã¿ä»®å(ルビ)文法ã«å¤‰æ›ã—ã¦è¡¨ç¤º ### Misskey.js - Feat: allow setting `binaryType` of WebSocket connection diff --git a/packages/backend/src/core/MfmService.ts b/packages/backend/src/core/MfmService.ts index 8061622340b6bf22f825dcfbe841f10dea9aed9a..bf06d4457e2ad7ce166ac927c0b8876addfe34df 100644 --- a/packages/backend/src/core/MfmService.ts +++ b/packages/backend/src/core/MfmService.ts @@ -171,6 +171,39 @@ export class MfmService { break; } + case 'ruby': { + let ruby: [string, string][] = []; + for (const child of node.childNodes) { + if (child.nodeName === 'rp') { + continue; + } + if (treeAdapter.isTextNode(child) && !/\s|\[|\]/.test(child.value)) { + ruby.push([child.value, '']); + continue; + } + if (child.nodeName === 'rt' && ruby.length > 0) { + const rt = getText(child); + if (/\s|\[|\]/.test(rt)) { + // If any space is included in rt, it is treated as a normal text + ruby = []; + appendChildren(node.childNodes); + break; + } else { + ruby.at(-1)![1] = rt; + continue; + } + } + // If any other element is included in ruby, it is treated as a normal text + ruby = []; + appendChildren(node.childNodes); + break; + } + for (const [base, rt] of ruby) { + text += `$[ruby ${base} ${rt}]`; + } + break; + } + // block code (<pre><code>) case 'pre': { if (node.childNodes.length === 1 && node.childNodes[0].nodeName === 'code') { diff --git a/packages/backend/test/unit/MfmService.ts b/packages/backend/test/unit/MfmService.ts index fd4a03413bb16aaab4b90ffc46e3acc636581a03..36af8823f6fc5dd004fa70aef1ea68131a488600 100644 --- a/packages/backend/test/unit/MfmService.ts +++ b/packages/backend/test/unit/MfmService.ts @@ -108,6 +108,24 @@ describe('MfmService', () => { assert.deepStrictEqual(mfmService.fromHtml('<p>a <a></a> d</p>'), 'a d'); }); + test('ruby', () => { + assert.deepStrictEqual(mfmService.fromHtml('<p>a <ruby>Misskey<rp>(</rp><rt>ミスã‚ー</rt><rp>)</rp></ruby> b</p>'), 'a $[ruby Misskey ミスã‚ー] b'); + assert.deepStrictEqual(mfmService.fromHtml('<p>a <ruby>Misskey<rp>(</rp><rt>ミスã‚ー</rt><rp>)</rp>Misskey<rp>(</rp><rt>ミスã‚ー</rt><rp>)</rp></ruby> b</p>'), 'a $[ruby Misskey ミスã‚ー]$[ruby Misskey ミスã‚ー] b'); + }); + + 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>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>Misskey<rp>(</rp><rt>ミス ã‚ー</rt><rp>)</rp>Misskey<rp>(</rp><rt>ミスã‚ー</rt><rp>)</rp></ruby> b</p>'), + 'a Misskey(ミスã‚ー)Misskey(ミス ã‚ー)Misskey(ミスã‚ー) b' + ); + }); + + 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'); + }); + test('mention', () => { assert.deepStrictEqual(mfmService.fromHtml('<p>a <a href="https://example.com/@user" class="u-url mention">@user</a> d</p>'), 'a @user@example.com d'); });