mirror of
https://activitypub.software/TransFem-org/Sharkey
synced 2024-11-26 07:55:14 +00:00
Add multiline math syntax
Co-authored-by: syuilo <syuilotan@yahoo.co.jp>
This commit is contained in:
parent
4398651841
commit
79d2374d8e
6 changed files with 62 additions and 17 deletions
|
@ -1,5 +1,6 @@
|
|||
<template>
|
||||
<span v-html="compiledFormula"></span>
|
||||
<div v-if="block" v-html="compiledFormula"></div>
|
||||
<span v-else v-html="compiledFormula"></span>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
|
@ -11,6 +12,10 @@ export default Vue.extend({
|
|||
formula: {
|
||||
type: String,
|
||||
required: true
|
||||
},
|
||||
block: {
|
||||
type: Boolean,
|
||||
required: true
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<template>
|
||||
<x-formula :formula="formula"/>
|
||||
<x-formula :formula="formula" :block="block" />
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
|
@ -14,6 +14,10 @@ export default Vue.extend({
|
|||
formula: {
|
||||
type: String,
|
||||
required: true
|
||||
},
|
||||
block: {
|
||||
type: Boolean,
|
||||
required: true
|
||||
}
|
||||
}
|
||||
});
|
||||
|
|
|
@ -228,12 +228,24 @@ export default Vue.component('misskey-flavored-markdown', {
|
|||
})];
|
||||
}
|
||||
|
||||
case 'math': {
|
||||
case 'mathInline': {
|
||||
//const MkFormula = () => import('./formula.vue').then(m => m.default);
|
||||
return [createElement(MkFormula, {
|
||||
key: Math.random(),
|
||||
props: {
|
||||
formula: token.node.props.formula
|
||||
formula: token.node.props.formula,
|
||||
block: false
|
||||
}
|
||||
})];
|
||||
}
|
||||
|
||||
case 'mathBlock': {
|
||||
//const MkFormula = () => import('./formula.vue').then(m => m.default);
|
||||
return [createElement(MkFormula, {
|
||||
key: Math.random(),
|
||||
props: {
|
||||
formula: token.node.props.formula,
|
||||
block: true
|
||||
}
|
||||
})];
|
||||
}
|
||||
|
|
|
@ -87,7 +87,13 @@ export default (tokens: MfmForest, mentionedRemoteUsers: INote['mentionedRemoteU
|
|||
return el;
|
||||
},
|
||||
|
||||
math(token) {
|
||||
mathInline(token) {
|
||||
const el = doc.createElement('code');
|
||||
el.textContent = token.node.props.formula;
|
||||
return el;
|
||||
},
|
||||
|
||||
mathBlock(token) {
|
||||
const el = doc.createElement('code');
|
||||
el.textContent = token.node.props.formula;
|
||||
return el;
|
||||
|
|
|
@ -103,7 +103,8 @@ const mfm = P.createLanguage({
|
|||
r.blockCode,
|
||||
r.inlineCode,
|
||||
r.quote,
|
||||
r.math,
|
||||
r.mathInline,
|
||||
r.mathBlock,
|
||||
r.search,
|
||||
r.title,
|
||||
r.center,
|
||||
|
@ -121,7 +122,7 @@ const mfm = P.createLanguage({
|
|||
r.mention,
|
||||
r.hashtag,
|
||||
r.emoji,
|
||||
r.math,
|
||||
r.mathInline,
|
||||
r.text
|
||||
).atLeast(1).tryParse(x), {})),
|
||||
//#endregion
|
||||
|
@ -135,7 +136,7 @@ const mfm = P.createLanguage({
|
|||
r.mention,
|
||||
r.hashtag,
|
||||
r.emoji,
|
||||
r.math,
|
||||
r.mathInline,
|
||||
r.text
|
||||
).atLeast(1).tryParse(x), {})),
|
||||
//#endregion
|
||||
|
@ -180,7 +181,7 @@ const mfm = P.createLanguage({
|
|||
r.mention,
|
||||
r.hashtag,
|
||||
r.emoji,
|
||||
r.math,
|
||||
r.mathInline,
|
||||
r.url,
|
||||
r.link,
|
||||
r.text
|
||||
|
@ -274,10 +275,16 @@ const mfm = P.createLanguage({
|
|||
}),
|
||||
//#endregion
|
||||
|
||||
//#region Math
|
||||
math: r =>
|
||||
//#region Math (inline)
|
||||
mathInline: r =>
|
||||
P.regexp(/\\\((.+?)\\\)/, 1)
|
||||
.map(x => createLeaf('math', { formula: x })),
|
||||
.map(x => createLeaf('mathInline', { formula: x })),
|
||||
//#endregion
|
||||
|
||||
//#region Math (block)
|
||||
mathBlock: r =>
|
||||
P.regexp(/\\\[([\s\S]+?)\\\]/, 1)
|
||||
.map(x => createLeaf('mathBlock', { formula: x.trim() })),
|
||||
//#endregion
|
||||
|
||||
//#region Mention
|
||||
|
@ -311,7 +318,7 @@ const mfm = P.createLanguage({
|
|||
r.emoji,
|
||||
r.url,
|
||||
r.link,
|
||||
r.math,
|
||||
r.mathInline,
|
||||
r.text
|
||||
).atLeast(1).tryParse(x), {})),
|
||||
//#endregion
|
||||
|
|
19
test/mfm.ts
19
test/mfm.ts
|
@ -836,15 +836,26 @@ describe('MFM', () => {
|
|||
});
|
||||
});
|
||||
|
||||
it('math', () => {
|
||||
it('mathInline', () => {
|
||||
const fomula = 'x = {-b \\pm \\sqrt{b^2-4ac} \\over 2a}';
|
||||
const text = `\\(${fomula}\\)`;
|
||||
const tokens = analyze(text);
|
||||
const content = `\\(${fomula}\\)`;
|
||||
const tokens = analyze(content);
|
||||
assert.deepStrictEqual(tokens, [
|
||||
leaf('math', { formula: fomula })
|
||||
leaf('mathInline', { formula: fomula })
|
||||
]);
|
||||
});
|
||||
|
||||
describe('mathBlock', () => {
|
||||
it('simple', () => {
|
||||
const fomula = 'x = {-b \\pm \\sqrt{b^2-4ac} \\over 2a}';
|
||||
const content = `\\[\n${fomula}\n\\]`;
|
||||
const tokens = analyze(content);
|
||||
assert.deepStrictEqual(tokens, [
|
||||
leaf('mathBlock', { formula: fomula })
|
||||
]);
|
||||
});
|
||||
});
|
||||
|
||||
it('search', () => {
|
||||
const tokens1 = analyze('a b c 検索');
|
||||
assert.deepStrictEqual(tokens1, [
|
||||
|
|
Loading…
Reference in a new issue