diff options
| author | Hong Minhee (洪 民憙) <hong@minhee.org> | 2025-01-14 22:06:39 +0900 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-01-14 13:06:39 +0000 |
| commit | d018fe58aa91eb702b098df659f23f9a981f4368 (patch) | |
| tree | 8779dd2e0fb45cb7762a7d3c9a5f562487b1e564 /packages/backend/src/core/MfmService.ts | |
| parent | enhance(backend): 絵文字の連合でライセンス欄を相互にやり... (diff) | |
| download | sharkey-d018fe58aa91eb702b098df659f23f9a981f4368.tar.gz sharkey-d018fe58aa91eb702b098df659f23f9a981f4368.tar.bz2 sharkey-d018fe58aa91eb702b098df659f23f9a981f4368.zip | |
fix(backend): Let MfmService.fromHtml accept ruby (#15117)
This fix makes `MfmService.fromHtml()` method accept `<ruby>` tags
and translate it to MFM's ruby characters syntax (`$[ruby ...]`).
このパッチは`MfmService.fromHtml()`メソッドが`<ruby>`タグをMFMの
読み仮名(ルビ)文法に翻訳する様に修正します。
Diffstat (limited to 'packages/backend/src/core/MfmService.ts')
| -rw-r--r-- | packages/backend/src/core/MfmService.ts | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/packages/backend/src/core/MfmService.ts b/packages/backend/src/core/MfmService.ts index 8061622340..bf06d4457e 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') { |