summaryrefslogtreecommitdiff
path: root/packages/backend/src/core/MfmService.ts
diff options
context:
space:
mode:
authorかっこかり <67428053+kakkokari-gtyih@users.noreply.github.com>2023-11-23 19:49:45 +0900
committerGitHub <noreply@github.com>2023-11-23 19:49:45 +0900
commited6f866a4f6e32a7875951fe7ea358d5cd21c6ce (patch)
tree89d2fcfd23d0ac49ddf0b24c7a70a2593a8f3d60 /packages/backend/src/core/MfmService.ts
parentfix(backend): 招待コードが使い回せる問題を修正 (#12423) (diff)
downloadmisskey-ed6f866a4f6e32a7875951fe7ea358d5cd21c6ce.tar.gz
misskey-ed6f866a4f6e32a7875951fe7ea358d5cd21c6ce.tar.bz2
misskey-ed6f866a4f6e32a7875951fe7ea358d5cd21c6ce.zip
enhance/fix(AP/frontend): 最近追加されたMFMのもろもろを修正 (#12420)
* (enhance) MFM rubyが連合されるように * Update Changelog * Update Changelog * (fix) unixtimeのフォールバック (AP) * (fix) unixtimeのフォールバック (frontend) * Update Changelog
Diffstat (limited to 'packages/backend/src/core/MfmService.ts')
-rw-r--r--packages/backend/src/core/MfmService.ts79
1 files changed, 68 insertions, 11 deletions
diff --git a/packages/backend/src/core/MfmService.ts b/packages/backend/src/core/MfmService.ts
index af602168d4..e74c62e1a8 100644
--- a/packages/backend/src/core/MfmService.ts
+++ b/packages/backend/src/core/MfmService.ts
@@ -250,6 +250,12 @@ export class MfmService {
}
}
+ function fnDefault(node: mfm.MfmFn) {
+ const el = doc.createElement('i');
+ appendChildren(node.children, el);
+ return el;
+ }
+
const handlers: { [K in mfm.MfmNode['type']]: (node: mfm.NodeType<K>) => any } = {
bold: (node) => {
const el = doc.createElement('b');
@@ -276,17 +282,68 @@ export class MfmService {
},
fn: (node) => {
- if (node.props.name === 'unixtime') {
- const text = node.children[0]!.type === 'text' ? node.children[0].props.text : '';
- const date = new Date(parseInt(text, 10) * 1000);
- const el = doc.createElement('time');
- el.setAttribute('datetime', date.toISOString());
- el.textContent = date.toISOString();
- return el;
- } else {
- const el = doc.createElement('i');
- appendChildren(node.children, el);
- return el;
+ switch (node.props.name) {
+ case 'unixtime': {
+ const text = node.children[0].type === 'text' ? node.children[0].props.text : '';
+ try {
+ const date = new Date(parseInt(text, 10) * 1000);
+ const el = doc.createElement('time');
+ el.setAttribute('datetime', date.toISOString());
+ el.textContent = date.toISOString();
+ return el;
+ } catch (err) {
+ return fnDefault(node);
+ }
+ }
+
+ case 'ruby': {
+ if (node.children.length === 1) {
+ const child = node.children[0];
+ const text = child.type === 'text' ? child.props.text : '';
+ const rubyEl = doc.createElement('ruby');
+ const rtEl = doc.createElement('rt');
+
+ // ruby未対応のHTMLサニタイザーを通したときにルビが「劉備(りゅうび)」となるようにする
+ const rpStartEl = doc.createElement('rp');
+ rpStartEl.appendChild(doc.createTextNode('('));
+ const rpEndEl = doc.createElement('rp');
+ rpEndEl.appendChild(doc.createTextNode(')'));
+
+ rubyEl.appendChild(doc.createTextNode(text.split(' ')[0]));
+ rtEl.appendChild(doc.createTextNode(text.split(' ')[1]));
+ rubyEl.appendChild(rpStartEl);
+ rubyEl.appendChild(rtEl);
+ rubyEl.appendChild(rpEndEl);
+ return rubyEl;
+ } else {
+ const rt = node.children.at(-1);
+
+ if (!rt) {
+ return fnDefault(node);
+ }
+
+ const text = rt.type === 'text' ? rt.props.text : '';
+ const rubyEl = doc.createElement('ruby');
+ const rtEl = doc.createElement('rt');
+
+ // ruby未対応のHTMLサニタイザーを通したときにルビが「劉備(りゅうび)」となるようにする
+ const rpStartEl = doc.createElement('rp');
+ rpStartEl.appendChild(doc.createTextNode('('));
+ const rpEndEl = doc.createElement('rp');
+ rpEndEl.appendChild(doc.createTextNode(')'));
+
+ appendChildren(node.children.slice(0, node.children.length - 1), rubyEl);
+ rtEl.appendChild(doc.createTextNode(text.trim()));
+ rubyEl.appendChild(rpStartEl);
+ rubyEl.appendChild(rtEl);
+ rubyEl.appendChild(rpEndEl);
+ return rubyEl;
+ }
+ }
+
+ default: {
+ return fnDefault(node);
+ }
}
},