[MFM] Resolve #4009

This commit is contained in:
syuilo 2019-01-27 19:32:35 +09:00
parent 28f0b24715
commit 582aae6494
4 changed files with 45 additions and 10 deletions

View file

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

View file

@ -128,9 +128,16 @@ export default Vue.component('misskey-flavored-markdown', {
motionCount++;
const isLong = sumTextsLength(token.children) > 5 || countNodesF(token.children) > 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', {
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));
}

View file

@ -148,12 +148,21 @@ const mfm = P.createLanguage({
//#region Spin
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(
r.emoji,
r.flip,
r.text
).atLeast(1).tryParse(x), {})),
).atLeast(1).tryParse(x.content), {
attr: x.attr
})),
//#endregion
//#region Jump

View file

@ -253,15 +253,30 @@ describe('MFM', () => {
]);
});
it('spin', () => {
describe('spin', () => {
it('simple', () => {
const tokens = analyze('<spin>:foo:</spin>');
assert.deepStrictEqual(tokens, [
tree('spin', [
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', () => {
const tokens = analyze('<jump>:foo:</jump>');
assert.deepStrictEqual(tokens, [