[MFM] Resolve #4009
This commit is contained in:
parent
311e67047d
commit
103fe8b91d
|
@ -1,6 +1,10 @@
|
||||||
ChangeLog
|
ChangeLog
|
||||||
=========
|
=========
|
||||||
|
|
||||||
|
unreleased
|
||||||
|
----------
|
||||||
|
* MFMで左回転、往復回転を行えるように
|
||||||
|
|
||||||
10.79.0
|
10.79.0
|
||||||
----------
|
----------
|
||||||
* 返信するときにCWを維持するかどうか設定できるように
|
* 返信するときにCWを維持するかどうか設定できるように
|
||||||
|
|
|
@ -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));
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
19
test/mfm.ts
19
test/mfm.ts
|
@ -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, [
|
||||||
|
|
Loading…
Reference in New Issue