From fe4f41501fc2d0a969728af62a46f5b9d0fa0511 Mon Sep 17 00:00:00 2001 From: Alf Eaton Date: Mon, 10 Mar 2025 11:40:13 +0000 Subject: [PATCH] Parse labels from environment options (#24189) GitOrigin-RevId: e51eed7521f6e32e614f8b38092a0b0219f7f186 --- services/web/app/src/Features/Metadata/MetaHandler.mjs | 9 +++++++-- .../features/source-editor/languages/latex/metadata.ts | 3 ++- services/web/test/unit/src/Metadata/MetaHandlerTests.mjs | 4 +++- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/services/web/app/src/Features/Metadata/MetaHandler.mjs b/services/web/app/src/Features/Metadata/MetaHandler.mjs index 1f7c1e2f86..ef5d11887e 100644 --- a/services/web/app/src/Features/Metadata/MetaHandler.mjs +++ b/services/web/app/src/Features/Metadata/MetaHandler.mjs @@ -23,14 +23,19 @@ async function extractMetaFromDoc(lines) { } const labelRe = /\\label{(.{0,80}?)}/g + const labelOptionRe = /\blabel={?(.{0,80}?)[\s},\]]/g const packageRe = /^\\usepackage(?:\[.{0,80}?])?{(.{0,80}?)}/g const reqPackageRe = /^\\RequirePackage(?:\[.{0,80}?])?{(.{0,80}?)}/g for (const rawLine of lines) { const line = getNonCommentedContent(rawLine) - for (const pkg of lineMatches(labelRe, line)) { - docMeta.labels.push(pkg) + for (const label of lineMatches(labelRe, line)) { + docMeta.labels.push(label) + } + + for (const label of lineMatches(labelOptionRe, line)) { + docMeta.labels.push(label) } for (const pkg of lineMatches(packageRe, line, ',')) { diff --git a/services/web/frontend/js/features/source-editor/languages/latex/metadata.ts b/services/web/frontend/js/features/source-editor/languages/latex/metadata.ts index 4e9cd10af7..e8dacbe59e 100644 --- a/services/web/frontend/js/features/source-editor/languages/latex/metadata.ts +++ b/services/web/frontend/js/features/source-editor/languages/latex/metadata.ts @@ -2,6 +2,7 @@ import { EditorView } from '@codemirror/view' import { Transaction, Text } from '@codemirror/state' const metadataChangeRe = /\\(documentclass|usepackage|RequirePackage|label)\b/ +const optionChangeRe = /\b(label)=/ export const metadata = () => [ // trigger metadata reload if edited line contains metadata-related commands @@ -26,7 +27,7 @@ export const metadata = () => [ const toLine = doc.lineAt(to).number for (const line of doc.iterLines(fromLine, toLine + 1)) { - if (metadataChangeRe.test(line)) { + if (metadataChangeRe.test(line) || optionChangeRe.test(line)) { needsMetadataUpdate = true return } diff --git a/services/web/test/unit/src/Metadata/MetaHandlerTests.mjs b/services/web/test/unit/src/Metadata/MetaHandlerTests.mjs index 35ecaf94d8..289fd0b164 100644 --- a/services/web/test/unit/src/Metadata/MetaHandlerTests.mjs +++ b/services/web/test/unit/src/Metadata/MetaHandlerTests.mjs @@ -19,6 +19,8 @@ describe('MetaHandler', function () { '\\label{ccc}%bar', // ccc should be in the returned labels '\\label{ddd} % bar', // ddd should be in the returned labels '\\label{ e,f,g }', // e,f,g should be in the returned labels + '\\begin{lstlisting}[label=foo, caption={Test}]', // foo should be in the returned labels + '\\begin{lstlisting}[label={lst:foo},caption={Test}]', // lst:foo should be in the returned labels ] this.docs = { @@ -85,7 +87,7 @@ describe('MetaHandler', function () { ) expect(result).to.deep.equal({ - labels: ['aaa', 'ccc', 'ddd', 'e,f,g'], + labels: ['aaa', 'ccc', 'ddd', 'e,f,g', 'foo', 'lst:foo'], packages: { foo: this.packageMapping.foo, baz: this.packageMapping.baz,