[MFM] Resolve #4009

This commit is contained in:
syuilo 2019-01-27 19:32:35 +09:00
parent 311e67047d
commit 103fe8b91d
No known key found for this signature in database
GPG key ID: BDC4C49D06AB9D69
4 changed files with 45 additions and 10 deletions

View file

@ -1,6 +1,10 @@
ChangeLog ChangeLog
========= =========
unreleased
----------
* MFMで左回転、往復回転を行えるように
10.79.0 10.79.0
---------- ----------
* 返信するときにCWを維持するかどうか設定できるように * 返信するときにCWを維持するかどうか設定できるように

View file

@ -128,9 +128,16 @@ export default Vue.component('misskey-flavored-markdown', {
motionCount++; motionCount++;
const isLong = sumTextsLength(token.children) > 5 || countNodesF(token.children) > 3; const isLong = sumTextsLength(token.children) > 5 || countNodesF(token.children) > 3;
const isMany = motionCount > 3; const isMany = motionCount > 3;
const direction =
token.node.props.attr == 'left' ? 'reverse' :
token.node.props.attr == 'alternate' ? 'alternate' :
'normal';
const style = (this.$store.state.settings.disableAnimatedMfm || isLong || isMany)
? ''
: `animation: spin 1.5s linear infinite; animation-direction: ${direction};`;
return (createElement as any)('span', { return (createElement as any)('span', {
attrs: { attrs: {
style: (this.$store.state.settings.disableAnimatedMfm || isLong || isMany) ? 'display: inline-block;' : 'display: inline-block; animation: spin 1.5s linear infinite;' style: 'display: inline-block;' + style
}, },
}, genEl(token.children)); }, genEl(token.children));
} }

View file

@ -148,12 +148,21 @@ const mfm = P.createLanguage({
//#region Spin //#region Spin
spin: r => spin: r =>
P.regexp(/<spin>(.+?)<\/spin>/, 1) P((input, i) => {
const text = input.substr(i);
const match = text.match(/^<spin(\s[a-z]+?)?>(.+?)<\/spin>/i);
if (!match) return P.makeFailure(i, 'not a spin');
return P.makeSuccess(i + match[0].length, {
content: match[2], attr: match[1] ? match[1].trim() : null
});
})
.map(x => createTree('spin', P.alt( .map(x => createTree('spin', P.alt(
r.emoji, r.emoji,
r.flip, r.flip,
r.text r.text
).atLeast(1).tryParse(x), {})), ).atLeast(1).tryParse(x.content), {
attr: x.attr
})),
//#endregion //#endregion
//#region Jump //#region Jump

View file

@ -253,15 +253,30 @@ describe('MFM', () => {
]); ]);
}); });
it('spin', () => { describe('spin', () => {
it('simple', () => {
const tokens = analyze('<spin>:foo:</spin>'); const tokens = analyze('<spin>:foo:</spin>');
assert.deepStrictEqual(tokens, [ assert.deepStrictEqual(tokens, [
tree('spin', [ tree('spin', [
leaf('emoji', { name: 'foo' }) leaf('emoji', { name: 'foo' })
], {}), ], {
attr: null
}),
]); ]);
}); });
it('with attr', () => {
const tokens = analyze('<spin left>:foo:</spin>');
assert.deepStrictEqual(tokens, [
tree('spin', [
leaf('emoji', { name: 'foo' })
], {
attr: 'left'
}),
]);
});
});
it('jump', () => { it('jump', () => {
const tokens = analyze('<jump>:foo:</jump>'); const tokens = analyze('<jump>:foo:</jump>');
assert.deepStrictEqual(tokens, [ assert.deepStrictEqual(tokens, [