mirror of
https://github.com/overleaf/overleaf.git
synced 2024-11-29 04:13:41 -05:00
Merge pull request #18676 from overleaf/mj-web-linter-document-class
[web] Allow underscore in optional argument in \documentclass GitOrigin-RevId: c6f8716548411ade03814c8123df76fa8aa70ecc
This commit is contained in:
parent
2247f02308
commit
f0eba8e742
4 changed files with 47 additions and 4 deletions
|
@ -152,8 +152,7 @@ export const LaTeXLanguage = LRLanguage.define({
|
|||
'HrefCommand/ShortTextArgument/ShortArg/...': t.link,
|
||||
'HrefCommand/UrlArgument/...': t.monospace,
|
||||
'CtrlSeq Csname': t.tagName,
|
||||
'DocumentClass/OptionalArgument/ShortOptionalArg/Normal':
|
||||
t.attributeValue,
|
||||
'DocumentClass/OptionalArgument/ShortOptionalArg/...': t.attributeValue,
|
||||
'DocumentClass/ShortTextArgument/ShortArg/Normal': t.typeName,
|
||||
'ListEnvironment/BeginEnv/OptionalArgument/...': t.monospace,
|
||||
Number: t.number,
|
||||
|
|
|
@ -322,7 +322,7 @@ const read1filename = function (TokeniseResult, k) {
|
|||
}
|
||||
}
|
||||
|
||||
const readOptionalLabel = function (TokeniseResult, k) {
|
||||
const readOptionalArgumentWithUnderscores = function (TokeniseResult, k) {
|
||||
// read a label my_label:text..
|
||||
const Tokens = TokeniseResult.tokens
|
||||
const text = TokeniseResult.text
|
||||
|
@ -348,6 +348,7 @@ const readOptionalLabel = function (TokeniseResult, k) {
|
|||
label = label + str
|
||||
if (str.match(/\]/)) {
|
||||
// breaking due to ]
|
||||
j++
|
||||
break
|
||||
}
|
||||
} else if (tok[1] === '_') {
|
||||
|
@ -800,6 +801,31 @@ const InterpretTokens = function (TokeniseResult, ErrorReporter) {
|
|||
) {
|
||||
// Environments.push({command: "end", name: "user-defined-equation", token: token});
|
||||
seenUserDefinedEndEquation = true
|
||||
} else if (seq === 'documentclass') {
|
||||
// try to read any optional params [LABEL].... allowing for
|
||||
// underscores, advance if found
|
||||
let newPos = readOptionalArgumentWithUnderscores(TokeniseResult, i)
|
||||
if (newPos instanceof Error) {
|
||||
TokenErrorFromTo(
|
||||
Tokens[i + 1],
|
||||
Tokens[Math.min(newPos.pos, len - 1)],
|
||||
'invalid documentclass option'
|
||||
)
|
||||
i = newPos.pos
|
||||
} else if (newPos == null) {
|
||||
/* do nothing */
|
||||
} else {
|
||||
i = newPos
|
||||
}
|
||||
// Read parameter {....}, ignore if missing
|
||||
newPos = readDefinition(TokeniseResult, i)
|
||||
if (newPos === null) {
|
||||
// NOTE: We could choose to throw an error here, as the argument is
|
||||
// required. However, that would show errors as you are typing. So
|
||||
// maybe it's better to be lenient.
|
||||
} else {
|
||||
i = newPos
|
||||
}
|
||||
} else if (
|
||||
seq === 'newcommand' ||
|
||||
seq === 'renewcommand' ||
|
||||
|
@ -1038,7 +1064,7 @@ const InterpretTokens = function (TokeniseResult, ErrorReporter) {
|
|||
} else if (seq === 'hyperref') {
|
||||
// try to read any optional params [LABEL].... allowing for
|
||||
// underscores, advance if found
|
||||
let newPos = readOptionalLabel(TokeniseResult, i)
|
||||
let newPos = readOptionalArgumentWithUnderscores(TokeniseResult, i)
|
||||
if (newPos instanceof Error) {
|
||||
TokenErrorFromTo(
|
||||
Tokens[i + 1],
|
||||
|
|
|
@ -484,6 +484,7 @@ ShortOptionalArg {
|
|||
( textBase
|
||||
| NonEmptyGroup<ShortOptionalArg>
|
||||
| "#" // macro character
|
||||
| "_" // underscore is used in some parameter names
|
||||
)*
|
||||
}
|
||||
|
||||
|
|
|
@ -494,6 +494,23 @@ describe('LatexLinter', function () {
|
|||
assert.equal(errors[0].text, 'unclosed group {')
|
||||
})
|
||||
|
||||
it('should accept documentclass with no options', function () {
|
||||
const { errors } = Parse('\\documentclass{article}')
|
||||
assert.equal(errors.length, 0)
|
||||
})
|
||||
|
||||
it('should accept documentclass with options', function () {
|
||||
const { errors } = Parse('\\documentclass[a4paper]{article}')
|
||||
assert.equal(errors.length, 0)
|
||||
})
|
||||
|
||||
it('should accept documentclass with underscore in options', function () {
|
||||
const { errors } = Parse(
|
||||
'\\documentclass[my_custom_document_class_option]{my-custom-class}'
|
||||
)
|
||||
assert.equal(errors.length, 0)
|
||||
})
|
||||
|
||||
// %novalidate
|
||||
// %begin novalidate
|
||||
// %end novalidate
|
||||
|
|
Loading…
Reference in a new issue