[MFM] Resolve #4009
This commit is contained in:
		
							parent
							
								
									311e67047d
								
							
						
					
					
						commit
						103fe8b91d
					
				|  | @ -1,6 +1,10 @@ | |||
| ChangeLog | ||||
| ========= | ||||
| 
 | ||||
| unreleased | ||||
| ---------- | ||||
| * MFMで左回転、往復回転を行えるように | ||||
| 
 | ||||
| 10.79.0 | ||||
| ---------- | ||||
| * 返信するときにCWを維持するかどうか設定できるように | ||||
|  |  | |||
|  | @ -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)); | ||||
| 				} | ||||
|  |  | |||
|  | @ -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
 | ||||
|  |  | |||
							
								
								
									
										29
									
								
								test/mfm.ts
								
								
								
								
							
							
						
						
									
										29
									
								
								test/mfm.ts
								
								
								
								
							|  | @ -253,13 +253,28 @@ describe('MFM', () => { | |||
| 			]); | ||||
| 		}); | ||||
| 
 | ||||
| 		it('spin', () => { | ||||
| 			const tokens = analyze('<spin>:foo:</spin>'); | ||||
| 			assert.deepStrictEqual(tokens, [ | ||||
| 				tree('spin', [ | ||||
| 					leaf('emoji', { name: 'foo' }) | ||||
| 				], {}), | ||||
| 			]); | ||||
| 		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', () => { | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue