Skip to content

Commit

Permalink
EscapeAmpersand inspection triggering in certain matrix environments (#…
Browse files Browse the repository at this point in the history
…1431)

* Added matrix and pmatrix environments to the default environment list.

* Updated EscapeAmpersand inspection tests to test for matrix environments (no trigger).

* Fixed #1427: Expanded the list of invalid ampersand locations.

Also moved magic contents to Magic.

* Removed unnecessary set appending.

* Applied suggestions:
- Support for all [-|b|B|v|V|p|g]matrix[*], [-|b|B|v|V|p]smallmatrix[*] matrices in autocomplete and get ignored in EscapeAmpersand inspection.
- Removed duplicate entries in alignmentEnvironments (magic).
  • Loading branch information
HannahSchellekens committed May 19, 2020
1 parent 6443539 commit 61c9d21
Show file tree
Hide file tree
Showing 7 changed files with 89 additions and 28 deletions.
12 changes: 5 additions & 7 deletions src/nl/hannahsten/texifyidea/completion/LatexCommandProvider.kt
Expand Up @@ -87,16 +87,14 @@ class LatexCommandProvider internal constructor(private val mode: LatexMode) : C
val environments: MutableList<Environment> = ArrayList()
Collections.addAll(environments, *DefaultEnvironment.values())
LatexDefinitionIndex.getItemsInFileSet(parameters.originalFile).stream()
.filter { cmd: LatexCommands -> Magic.Command.environmentDefinitions.contains(cmd.name) }
.map { cmd: LatexCommands -> cmd.requiredParameter(0) }
.filter { obj: String? -> Objects.nonNull(obj) }
.map { environmentName: String? -> SimpleEnvironment(environmentName!!) }
.filter { cmd -> Magic.Command.environmentDefinitions.contains(cmd.name) }
.map { cmd -> cmd.requiredParameter(0) }
.filter { obj -> Objects.nonNull(obj) }
.map { environmentName -> SimpleEnvironment(environmentName!!) }
.forEach { e: SimpleEnvironment -> environments.add(e) }

// Create autocomplete elements.
result.addAllElements(ContainerUtil.map2List(
environments
) { env: Environment ->
result.addAllElements(ContainerUtil.map2List(environments) { env: Environment ->
LookupElementBuilder.create(env, env.environmentName)
.withPresentableText(env.environmentName)
.bold()
Expand Down
Expand Up @@ -5,9 +5,7 @@ import com.intellij.psi.PsiElement
import nl.hannahsten.texifyidea.inspections.TexifyRegexInspection
import nl.hannahsten.texifyidea.psi.LatexCommands
import nl.hannahsten.texifyidea.psi.LatexEnvironment
import nl.hannahsten.texifyidea.util.Magic
import nl.hannahsten.texifyidea.util.firstParentOfType
import nl.hannahsten.texifyidea.util.isComment
import nl.hannahsten.texifyidea.util.*
import java.util.regex.Matcher
import java.util.regex.Pattern

Expand All @@ -23,31 +21,24 @@ class LatexEscapeAmpersandInspection : TexifyRegexInspection(
replacement = { _, _ -> """\&""" },
quickFixName = { """Change to \&""" }
) {

override fun checkContext(matcher: Matcher, element: PsiElement): Boolean {
if (element.isAmpersandAllowed()) return false
if (element.isComment()) return false
return checkContext(element)
}

private fun PsiElement.isAmpersandAllowed(): Boolean {
// Do not trigger inside comments.
if (this.isComment()) return true
if (this.firstParentOfType(LatexEnvironment::class)?.environmentName in Magic.Environment.tableEnvironments) return true
if (this.firstParentOfType(LatexEnvironment::class)?.environmentName in alignableEnvironments) return true

// Do not trigger in environments that use the ampersand as special character.
if (this.inDirectEnvironment(Magic.Environment.tableEnvironments)) return true
if (this.inDirectEnvironment(Magic.Environment.alignableEnvironments)) return true

// Do not trigger in URLs.
if (this.firstParentOfType(LatexCommands::class)?.name in Magic.Command.urls) return true
return false
}

companion object {
val alignableEnvironments = setOf(
"eqnarray", "eqnarray*",
"split",
"align", "align*",
"alignat", "alignat*",
"flalign", "flalign*",
"aligned", "alignedat",
"cases", "dcases",
"smallmatrix", "smallmatrix*",
"matrix", "matrix*",
"pmatrix", "pmatrix*")
return false
}
}
26 changes: 26 additions & 0 deletions src/nl/hannahsten/texifyidea/lang/DefaultEnvironment.kt
Expand Up @@ -2,6 +2,8 @@ package nl.hannahsten.texifyidea.lang

import nl.hannahsten.texifyidea.lang.Environment.Context
import nl.hannahsten.texifyidea.lang.Package.Companion.AMSMATH
import nl.hannahsten.texifyidea.lang.Package.Companion.GAUSS
import nl.hannahsten.texifyidea.lang.Package.Companion.MATHTOOLS
import nl.hannahsten.texifyidea.lang.Package.Companion.XCOLOR
import nl.hannahsten.texifyidea.psi.LatexEnvironment
import nl.hannahsten.texifyidea.util.name
Expand Down Expand Up @@ -81,8 +83,10 @@ enum class DefaultEnvironment(
GATHER(environmentName = "gather", context = Context.MATH, dependency = AMSMATH),
GATHERED(environmentName = "gathered", context = Context.MATH, dependency = AMSMATH),
GATHER_STAR(environmentName = "gather*", context = Context.MATH, dependency = AMSMATH),
MATRIX(environmentName = "matrix", context = Context.MATH, dependency = AMSMATH),
MULTLINE(environmentName = "multline", context = Context.MATH, dependency = AMSMATH),
MULTLINE_STAR(environmentName = "multline*", context = Context.MATH, dependency = AMSMATH),
PMATRIX(environmentName = "pmatrix", context = Context.MATH, dependency = AMSMATH),
SMALLMATRIX(environmentName = "smallmatrix", context = Context.MATH, dependency = AMSMATH),
SPLIT(environmentName = "split", context = Context.MATH, dependency = AMSMATH),
SUBARRAY(environmentName = "subarray", context = Context.MATH, dependency = AMSMATH),
Expand All @@ -93,6 +97,28 @@ enum class DefaultEnvironment(
XALIGNAT_STAR(environmentName = "xalignat*", context = Context.MATH, dependency = AMSMATH),
XXALIGNAT(environmentName = "xxalignat", context = Context.MATH, dependency = AMSMATH),

// mathtools
MATRIX_STAR(environmentName = "matrix*", context = Context.MATH, dependency = MATHTOOLS),
PMATRIX_STAR(environmentName = "pmatrix*", context = Context.MATH, dependency = MATHTOOLS),
BMATRIX_STAR(environmentName = "bmatrix*", context = Context.MATH, dependency = MATHTOOLS),
BMATRIX_CAPITAL_STAR(environmentName = "Bmatrix*", context = Context.MATH, dependency = MATHTOOLS),
VMATRIX_STAR(environmentName = "vmatrix*", context = Context.MATH, dependency = MATHTOOLS),
VMATRIX_CAPITAL_STAR(environmentName = "Vmatrix*", context = Context.MATH, dependency = MATHTOOLS),
SMALLMATRIX_STAR(environmentName = "smallmatrix*", context = Context.MATH, dependency = MATHTOOLS),
PSMALLMATRIX(environmentName = "psmallmatrix", context = Context.MATH, dependency = MATHTOOLS),
PSMALLMATRIX_STAR(environmentName = "psmallmatrix*", context = Context.MATH, dependency = MATHTOOLS),
BSMALLMATRIX(environmentName = "bsmallmatrix", context = Context.MATH, dependency = MATHTOOLS),
BSMALLMATRIX_STAR(environmentName = "bsmallmatrix*", context = Context.MATH, dependency = MATHTOOLS),
BSMALLMATRIX_CAPITAL(environmentName = "Bsmallmatrix", context = Context.MATH, dependency = MATHTOOLS),
BSMALLMATRIX_CAPITAL_STAR(environmentName = "Bsmallmatrix*", context = Context.MATH, dependency = MATHTOOLS),
VSMALLMATRIX(environmentName = "vsmallmatrix", context = Context.MATH, dependency = MATHTOOLS),
VSMALLMATRIX_STAR(environmentName = "vsmallmatrix*", context = Context.MATH, dependency = MATHTOOLS),
VSMALLMATRIX_CAPITAL(environmentName = "Vsmallmatrix", context = Context.MATH, dependency = MATHTOOLS),
VSMALLMATRIX_CAPITAL_STAR(environmentName = "Vsmallmatrix*", context = Context.MATH, dependency = MATHTOOLS),

// gauss
GMATRIX(environmentName = "gmatrix", context = Context.MATH, dependency = GAUSS),

// comment
COMMENT(environmentName = "comment", context = Context.COMMENT, dependency = Package.COMMENT),

Expand Down
1 change: 1 addition & 0 deletions src/nl/hannahsten/texifyidea/lang/Package.kt
Expand Up @@ -23,6 +23,7 @@ open class Package @JvmOverloads constructor(
@JvmField val CLEVEREF = Package("cleveref")
@JvmField val CSQUOTES = Package("csquotes")
@JvmField val FONTENC = Package("fontenc")
@JvmField val GAUSS = Package("gauss")
@JvmField val GRAPHICX = Package("graphicx")
@JvmField val HYPERREF = Package("hyperref")
@JvmField val IMAKEIDX = Package("imakeidx")
Expand Down
32 changes: 31 additions & 1 deletion src/nl/hannahsten/texifyidea/util/Magic.kt
Expand Up @@ -44,7 +44,6 @@ object Magic {
@JvmField
val noQuickFix: LocalQuickFix? = null

@Language("Latex")
@JvmField
val latexDemoText = """
|%
Expand Down Expand Up @@ -203,6 +202,7 @@ object Magic {
@JvmField
val listingEnvironments = hashSetOf("itemize", "enumerate", "description")

@JvmField
val tableEnvironments = hashSetOf("tabular", "tabular*", "tabularx", "array", "longtable")

/**
Expand All @@ -229,15 +229,45 @@ object Magic {
/**
* Environments that introduce figures
*/
@JvmField
val figures = hashSetOf("figure")

@JvmField
val verbatim = hashSetOf("verbatim", "Verbatim", "lstlisting", "plantuml", "luacode", "luacode*")

@JvmField
val algorithmEnvironments = setOf("algorithmic")

/**
* All environments that define a matrix.
*/
@JvmField
val matrixEnvironments = setOf(
"matrix", "pmatrix", "bmatrix", "vmatrix", "Bmatrix", "Vmatrix",
"matrix*", "pmatrix*", "bmatrix*", "vmatrix*", "Bmatrix*", "Vmatrix*",
"smallmatrix", "psmallmatrix", "bsmallmatrix", "vsmallmatrix", "Bsmallmatrix", "Vsmallmatrix",
"smallmatrix*", "psmallmatrix*", "bsmallmatrix*", "vsmallmatrix*", "Bsmallmatrix*", "Vsmallmatrix*",
"gmatrix"
)

@JvmField
val alignableEnvironments = setOf(
"eqnarray", "eqnarray*",
"split",
"align", "align*",
"alignat", "alignat*",
"flalign", "flalign*",
"aligned", "alignedat",
"cases", "dcases"
) + matrixEnvironments
}

/**
* @author Abby Berkers
*/
object Comment {

@JvmField
val preambleValues = hashSetOf("tikz", "math")
}

Expand Down
2 changes: 1 addition & 1 deletion src/nl/hannahsten/texifyidea/util/Psi.kt
Expand Up @@ -274,7 +274,7 @@ fun PsiElement.inDirectEnvironment(environmentName: String): Boolean = inDirectE
fun PsiElement.inDirectEnvironment(validNames: Collection<String>): Boolean {
val environment = parentOfType(LatexEnvironment::class) ?: return false
val nameText = environment.name() ?: return false
return validNames.contains(nameText.text)
return nameText.text in validNames
}

/**
Expand Down
Expand Up @@ -2,6 +2,7 @@ package nl.hannahsten.texifyidea.inspections.latex

import nl.hannahsten.texifyidea.file.LatexFileType
import nl.hannahsten.texifyidea.inspections.TexifyInspectionTestBase
import nl.hannahsten.texifyidea.util.Magic

internal class LatexEscapeAmpersandInspectionTest : TexifyInspectionTestBase(LatexEscapeAmpersandInspection()) {

Expand Down Expand Up @@ -46,6 +47,20 @@ internal class LatexEscapeAmpersandInspectionTest : TexifyInspectionTestBase(Lat
myFixture.checkHighlighting(true, false, false, false)
}

fun `test that ampersand in in matrix environments does not trigger a warning`() {
Magic.Environment.matrixEnvironments.forEach { environment ->
myFixture.configureByText(LatexFileType, """
\begin{document}
$\begin{$environment}
a& =b\\
c& =d
\end{$environment}$
\end{document}
""".trimIndent())
myFixture.checkHighlighting(true, false, false, false)
}
}

fun `test that ampersand in url command does not trigger a warning`() {
myFixture.configureByText(LatexFileType, """
\url{a&b}
Expand Down

0 comments on commit 61c9d21

Please sign in to comment.