summaryrefslogtreecommitdiff
path: root/packages/backend/src/core
diff options
context:
space:
mode:
authorHong Minhee (洪 民憙) <hong@minhee.org>2025-01-14 22:06:39 +0900
committerGitHub <noreply@github.com>2025-01-14 13:06:39 +0000
commitd018fe58aa91eb702b098df659f23f9a981f4368 (patch)
tree8779dd2e0fb45cb7762a7d3c9a5f562487b1e564 /packages/backend/src/core
parentenhance(backend): 絵文字の連合でライセンス欄を相互にやり... (diff)
downloadsharkey-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')
-rw-r--r--packages/backend/src/core/MfmService.ts33
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') {