| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- import { getEnvironmentName } from './environments'
- import { EditorState } from '@codemirror/state'
- import { SyntaxNode, SyntaxNodeRef } from '@lezer/common'
- import { ancestorNodeOfType } from './ancestors'
- export type MathContainer = {
- content: string
- displayMode: boolean
- passToMathJax: boolean
- pos: number
- }
- export const mathAncestorNode = (state: EditorState, pos: number) =>
- ancestorNodeOfType(state, pos, '$MathContainer') ||
- ancestorNodeOfType(state, pos, 'EquationEnvironment') ||
- // NOTE: EquationArrayEnvironment can be nested inside EquationEnvironment
- ancestorNodeOfType(state, pos, 'EquationArrayEnvironment')
- export const parseMathContainer = (
- state: EditorState,
- nodeRef: SyntaxNodeRef,
- ancestorNode: SyntaxNode
- ): MathContainer | null => {
- // the content of the Math element, without braces
- const innerContent = state.doc.sliceString(nodeRef.from, nodeRef.to).trim()
- if (!innerContent.length) {
- return null
- }
- let content = innerContent
- let displayMode = false
- let passToMathJax = true
- let pos = nodeRef.from
- if (ancestorNode.type.is('$Environment')) {
- const environmentName = getEnvironmentName(ancestorNode, state)
- if (environmentName) {
- // use the outer content of environments that MathJax supports
- // https://docs.mathjax.org/en/latest/input/tex/macros/index.html#environments
- if (environmentName === 'tikzcd') {
- passToMathJax = false
- }
- if (environmentName !== 'math' && environmentName !== 'displaymath') {
- content = state.doc
- .sliceString(ancestorNode.from, ancestorNode.to)
- .trim()
- pos = ancestorNode.from
- }
- if (environmentName !== 'math') {
- displayMode = true
- }
- }
- } else {
- if (
- ancestorNode.type.is('BracketMath') ||
- Boolean(ancestorNode.getChild('DisplayMath'))
- ) {
- displayMode = true
- }
- }
- return { content, displayMode, passToMathJax, pos }
- }
|