Преглед изворни кода

Merge pull request #19512 from overleaf/mj-def-mathjax

[web] Pass def, let, and (re)newenvironment to mathjax

GitOrigin-RevId: b79b656024bcaddd1bd96a4b9ed297de2de043e3
Mathias Jakobsen пре 2 година
родитељ
комит
f4896b2152

+ 39 - 7
services/web/frontend/js/features/source-editor/extensions/visual/atomic-decorations.ts

@@ -616,14 +616,46 @@ export const atomicDecorations = (options: Options) => {
           return false // no markup in verbatim content
         } else if (
           nodeRef.type.is('NewCommand') ||
-          nodeRef.type.is('RenewCommand')
+          nodeRef.type.is('RenewCommand') ||
+          nodeRef.type.is('Def')
         ) {
-          const argumentNode = nodeRef.node.getChild('LiteralArgContent')
-          if (argumentNode) {
-            const argument = state
-              .sliceDoc(argumentNode.from, argumentNode.to)
-              .trim()
-            if (/^\\\w+/.test(argument)) {
+          const nameNode =
+            nodeRef.node.getChild('LiteralArgContent') ??
+            nodeRef.node.getChild('Csname') ??
+            nodeRef.node.getChild('CtrlSym')
+          if (nameNode) {
+            const name = state.sliceDoc(nameNode.from, nameNode.to).trim()
+            if (/^\\\w+/.test(name)) {
+              const content = state.sliceDoc(nodeRef.from, nodeRef.to)
+              if (content) {
+                commandDefinitions += `${content}\n`
+              }
+            }
+          }
+        } else if (
+          nodeRef.type.is('RenewEnvironment') ||
+          nodeRef.type.is('NewEnvironment')
+        ) {
+          const nameNode = nodeRef.node.getChild('LiteralArgContent')
+          if (nameNode) {
+            const name = state.sliceDoc(nameNode.from, nameNode.to).trim()
+            if (/^\w+/.test(name)) {
+              const content = state.sliceDoc(nodeRef.from, nodeRef.to)
+              if (content) {
+                commandDefinitions += `${content}\n`
+              }
+            }
+          }
+        } else if (nodeRef.type.is('Let')) {
+          const commandNodes = nodeRef.node.getChildren('Csname')
+          if (commandNodes.length !== 2) {
+            return
+          }
+          const nameNode = commandNodes[0]
+          if (nameNode) {
+            // We support more flexible names in let (Csname) than in newcommand
+            const name = state.sliceDoc(nameNode.from, nameNode.to).trim()
+            if (name.length > 1 && name.startsWith('\\')) {
               const content = state.sliceDoc(nodeRef.from, nodeRef.to)
               if (content) {
                 commandDefinitions += `${content}\n`

+ 4 - 1
services/web/frontend/js/features/source-editor/languages/latex/latex-language.ts

@@ -129,7 +129,10 @@ export const LaTeXLanguage = LRLanguage.define({
           ) {
             types.push('$TextArgument')
           }
-        } else if (type.name.endsWith('Environment')) {
+        } else if (
+          type.name.endsWith('Environment') &&
+          !['NewEnvironment', 'RenewEnvironment'].includes(type.name)
+        ) {
           types.push('$Environment')
         } else if (type.name.endsWith('Brace')) {
           types.push('$Brace')

+ 4 - 0
services/web/frontend/js/features/source-editor/lezer-latex/latex.grammar

@@ -60,6 +60,7 @@
     IncludeGraphicsCtrlSeq,
     CaptionCtrlSeq,
     DefCtrlSeq,
+    LetCtrlSeq,
     LeftCtrlSeq,
     RightCtrlSeq,
     NewCommandCtrlSeq,
@@ -293,6 +294,9 @@ KnownCommand<ArgumentType> {
         // allow more general Csname argument to \def commands, since other symbols such as '@' are often used in definitions
         DefCtrlSeq optionalWhitespace? (Csname | CtrlSym) optionalWhitespace? (MacroParameter | OptionalMacroParameter)* optionalWhitespace? DefinitionArgument
     } |
+    Let {
+        LetCtrlSeq Csname optionalWhitespace? "="? optionalWhitespace? Csname
+    } |
     Hbox {
         HboxCtrlSeq optionalWhitespace? TextArgument
     } |

+ 2 - 0
services/web/frontend/js/features/source-editor/lezer-latex/tokens.mjs

@@ -34,6 +34,7 @@ import {
   IncludeGraphicsCtrlSeq,
   CaptionCtrlSeq,
   DefCtrlSeq,
+  LetCtrlSeq,
   LeftCtrlSeq,
   RightCtrlSeq,
   NewCommandCtrlSeq,
@@ -543,6 +544,7 @@ const otherKnowncommands = {
   '\\includegraphics': IncludeGraphicsCtrlSeq,
   '\\caption': CaptionCtrlSeq,
   '\\def': DefCtrlSeq,
+  '\\let': LetCtrlSeq,
   '\\left': LeftCtrlSeq,
   '\\right': RightCtrlSeq,
   '\\newcommand': NewCommandCtrlSeq,