[MFM] Resolve #4009
This commit is contained in:
		| @@ -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, [ | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 syuilo
					syuilo