IJPL-190645 Enable text-level spellchecking for Java, XML, HTML, Plain-Text and Markdown

Merge-request: IJ-MR-172291
Merged-by: Ilia Permiashkin <ilia.permiashkin@jetbrains.com>

GitOrigin-RevId: 0a9a50d89d614c56123cf64fdeeaeac87ae6a041
This commit is contained in:
Ilia Permiashkin
2025-08-13 22:43:43 +00:00
committed by intellij-monorepo-bot
parent 7373cc97bb
commit c4e1473104
13 changed files with 72 additions and 50 deletions
@@ -4,6 +4,7 @@ package com.intellij.spellchecker;
import com.intellij.codeInspection.SuppressManager;
import com.intellij.codeInspection.util.ChronoUtil;
import com.intellij.openapi.project.DumbAware;
import com.intellij.openapi.util.registry.Registry;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiLiteralExpression;
import com.intellij.psi.PsiMethod;
@@ -42,4 +43,9 @@ public final class JavaSpellcheckingStrategy extends SpellcheckingStrategy imple
return super.getTokenizer(element);
}
@Override
public boolean useTextLevelSpellchecking() {
return Registry.is("spellchecker.grazie.enabled");
}
}
@@ -1,46 +1,46 @@
**C**<TYPO descr="Typo: In word 'orrect'">orrect</TYPO>, **Pro**<TYPO descr="Typo: In word 'blem'">blem</TYPO>, **Pr**<TYPO descr="Typo: In word 'oblem'">oblem</TYPO>, **Co**<TYPO descr="Typo: In word 'rrect'">rrect</TYPO>
**C**orrect, **Pro**blem, **Pr**oblem, **Co**rrect
bc5<TYPO descr="Typo: In word 'ebcd'">ebcd</TYPO>0_1a55_484d_<TYPO descr="Typo: In word 'aadc'">aadc</TYPO>_198<TYPO descr="Typo: In word 'faeb'">faeb</TYPO>50db0
bc5ebcd0_1a55_484d_aadc_198faeb50db0
password: VxBFMd9YCKjq6<TYPO descr="Typo: In word 'PBFG'">PBFG</TYPO>54FIY3V
password: VxBFMd9YCKjq6PBFG54FIY3V
<TYPO descr="Typo: In word 'Postgre'">Postgre</TYPO>SQL
PostgreSQL
cherry-picked from <TYPO descr="Typo: In word 'cafebabe'">cafebabe</TYPO>3690498<TYPO descr="Typo: In word 'eecb'">eecb</TYPO>45<TYPO descr="Typo: In word 'dfedba'">dfedba</TYPO>4
cherry-picked from cafebabe3690498eecb45dfedba4
-Xlint
Mindest- oder Regelstudienzeit,
<TYPO descr="Typo: In word 'Eignungs'">Eignungs</TYPO>- und Sprachtests,
<TYPO descr="Typo: In word 'Hochschul'">Hochschul</TYPO>- oder Fachhochschulreife,
<TYPO descr="Typo: In word 'Ausbildungs'">Ausbildungs</TYPO>- oder Praxisaufstieg
Eignungs- und Sprachtests,
Hochschul- oder Fachhochschulreife,
Ausbildungs- oder Praxisaufstieg
/Users/Olga.<TYPO descr="Typo: In word 'Doroshko'">Doroshko</TYPO>/Library/Java
/Users/Olga.Doroshko/Library/Java
-----BEGIN PUBLIC KEY-----
MFwwDQYJKoZ<TYPO descr="Typo: In word 'Ihvc'">Ihvc</TYPO>NAQEBBQADSwAwSAJBALPwh7JEV7KNuZ0JGIoXz5XWv4bUkCMF
HTZ8ZG50urBdSMBZmtW75AdKHv5qvXt5Q+cb6N3FOqOhPVQjBM5+iAMCAw<TYPO descr="Typo: In word 'EAAQ'">EAAQ</TYPO>==
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALPwh7JEV7KNuZ0JGIoXz5XWv4bUkCMF
HTZ8ZG50urBdSMBZmtW75AdKHv5qvXt5Q+cb6N3FOqOhPVQjBM5+iAMCAwEAAQ==
-----END PUBLIC KEY-----
-----BEGIN RSA PRIVATE KEY-----
<TYPO descr="Typo: In word 'MIIB'">MIIB</TYPO>Og<TYPO descr="Typo: In word 'IBAAJBAL'">IBAAJBAL</TYPO>Pwh7JEV7KNuZ0JGIoXz5XWv4bUk<TYPO descr="Typo: In word 'CMFHTZ'">CMFHTZ</TYPO>8ZG50urBdSMBZmtW7
5AdKHv5qvXt5Q+cb6N3FOqOhPVQjBM5+iAMCAw<TYPO descr="Typo: In word 'EAAQJAD'">EAAQJAD</TYPO>8dqv0gUVBbA6U62tuFD
PNU7qxD9rN3aW2<TYPO descr="Typo: In word 'xldl'">xldl</TYPO>YV7XErHX8iWW+zA0M+aiOE+mOEot<TYPO descr="Typo: In word 'TYPF'">TYPF</TYPO>2+zMyW4mHkxNRj
MIIBOgIBAAJBALPwh7JEV7KNuZ0JGIoXz5XWv4bUkCMFHTZ8ZG50urBdSMBZmtW7
5AdKHv5qvXt5Q+cb6N3FOqOhPVQjBM5+iAMCAwEAAQJAD8dqv0gUVBbA6U62tuFD
PNU7qxD9rN3aW2xldlYV7XErHX8iWW+zA0M+aiOE+mOEotTYPF2+zMyW4mHkxNRj
cQIhAPO6KReZCUz3KgyJf88EO8z+2CkeRrbOkqU51daGS8VbAiEAuTPOQgAVe0WR
bQ26FQ<TYPO descr="Typo: In word 'Wwyo'">Wwyo</TYPO>CR7u<TYPO descr="Typo: In word 'Eehh'">Eehh</TYPO>X<TYPO descr="Typo: In word 'Imzuv'">Imzuv</TYPO>YRehWpsCIQCn52h+1YdHgVzFy7rhTvU8r03<TYPO descr="Typo: In word 'Kgyj'">Kgyj</TYPO>D
tzX0S0fNcPhUQQIgRF7<TYPO descr="Typo: In word 'dwimk'">dwimk</TYPO>Iv4iKU+BM3A<TYPO descr="Typo: In word 'Ybsvuhc'">Ybsvuhc</TYPO>MdvYId+yLaI<TYPO descr="Typo: In word 'Hytd'">Hytd</TYPO>PECIATh
iIRn<TYPO descr="Typo: In word 'MZOGZ'">MZOGZ</TYPO>TqZZ2Ku9wz2F1vKln97vth3FwbO2qgn
bQ26FQWwyoCR7uEehhXImzuvYRehWpsCIQCn52h+1YdHgVzFy7rhTvU8r03KgyjD
tzX0S0fNcPhUQQIgRF7dwimkIv4iKU+BM3AYbsvuhcMdvYId+yLaIHytdPECIATh
iIRnMZOGZTqZZ2Ku9wz2F1vKln97vth3FwbO2qgn
-----END RSA PRIVATE KEY-----
LqAgHd9T<TYPO descr="Typo: In word 'Fasf'">Fasf</TYPO>VYIgFxWHgoS1eq4xGvR+g<TYPO descr="Typo: In word 'SGZL'">SGZL</TYPO>0v8ZMk=
1QkUKfW9<TYPO descr="Typo: In word 'XDLO'">XDLO</TYPO>+YxZwQbL1Vnx5rUThCJHeX8ClcT1X6DeY+g<TYPO descr="Typo: In word 'Qyukc'">Qyukc</TYPO>HizHkS+6HR0nTxmQWknFj6D9z/U8kdXsEA==
LqAgHd9TFasfVYIgFxWHgoS1eq4xGvR+gSGZL0v8ZMk=
1QkUKfW9XDLO+YxZwQbL1Vnx5rUThCJHeX8ClcT1X6DeY+gQyukcHizHkS+6HR0nTxmQWknFj6D9z/U8kdXsEA==
Random words:
- RES<TYPO descr="Typo: In word 'Tful'">Tful</TYPO>
- <TYPO descr="Typo: In word 'CAPM'">CAPM</TYPO>3
- RESTful
- CAPM3
- iDRAC
dafür // u + Unicode Combining Diaeresis Mark
@@ -1 +1 @@
<link href="<TYPO descr="Typo: In word 'amasons'">amasons</TYPO>.com"/>
<link href="amasons.com"/>
@@ -1,7 +1,7 @@
/** Half width Katakana variants (FF00 - <TYPO descr="Typo: In word 'FFEF'">FFEF</TYPO>)
/** Half width Katakana variants (FF00 - FFEF)
* ワタシハジャバガスキデス。
*/
/** Full width ASCII variants (FF00 - <TYPO descr="Typo: In word 'FFEF'">FFEF</TYPO>)
/** Full width ASCII variants (FF00 - FFEF)
* I LOVE JAVA
*/
/** Hiragana (3040 - 309F)
@@ -2,6 +2,7 @@ package org.intellij.plugins.markdown.spellchecker;
import com.intellij.lang.ASTNode;
import com.intellij.openapi.project.DumbAware;
import com.intellij.openapi.util.registry.Registry;
import com.intellij.psi.PsiElement;
import com.intellij.psi.impl.source.tree.TreeUtil;
import com.intellij.psi.tree.TokenSet;
@@ -12,21 +13,28 @@ import org.intellij.plugins.markdown.lang.MarkdownTokenTypes;
import org.jetbrains.annotations.NotNull;
final class MarkdownSpellcheckingStrategy extends SpellcheckingStrategy implements DumbAware {
public static final TokenSet NO_SPELLCHECKING_TYPES = TokenSet.create(MarkdownElementTypes.CODE_BLOCK,
MarkdownElementTypes.CODE_FENCE,
MarkdownElementTypes.CODE_SPAN,
MarkdownElementTypes.LINK_DESTINATION);
public static final TokenSet NO_SPELLCHECKING_TYPES = TokenSet.create(
MarkdownElementTypes.CODE_BLOCK,
MarkdownElementTypes.CODE_FENCE,
MarkdownElementTypes.CODE_SPAN,
MarkdownElementTypes.LINK_DESTINATION
);
@Override
public @NotNull Tokenizer getTokenizer(PsiElement element) {
final ASTNode node = element.getNode();
if (node == null || node.getElementType() != MarkdownTokenTypes.TEXT) {
return SpellcheckingStrategy.EMPTY_TOKENIZER;
return EMPTY_TOKENIZER;
}
if (TreeUtil.findParent(node, NO_SPELLCHECKING_TYPES) != null) {
return SpellcheckingStrategy.EMPTY_TOKENIZER;
return EMPTY_TOKENIZER;
}
return SpellcheckingStrategy.TEXT_TOKENIZER;
return TEXT_TOKENIZER;
}
@Override
public boolean useTextLevelSpellchecking() {
return Registry.is("spellchecker.grazie.enabled");
}
}
@@ -24,7 +24,10 @@ import com.intellij.spellchecker.SpellCheckerManager;
import com.intellij.spellchecker.grazie.diacritic.Diacritics;
import com.intellij.spellchecker.inspections.SpellcheckingExtension.SpellCheckingResult;
import com.intellij.spellchecker.inspections.SpellcheckingExtension.SpellingTypo;
import com.intellij.spellchecker.tokenizer.*;
import com.intellij.spellchecker.tokenizer.LanguageSpellchecking;
import com.intellij.spellchecker.tokenizer.SpellcheckingStrategy;
import com.intellij.spellchecker.tokenizer.SuppressibleSpellcheckingStrategy;
import com.intellij.spellchecker.tokenizer.TokenConsumer;
import com.intellij.spellchecker.util.SpellCheckerBundle;
import com.intellij.util.Consumer;
import com.intellij.util.containers.CollectionFactory;
@@ -94,6 +97,7 @@ public final class SpellCheckingInspection extends LocalInspectionTool implement
return PsiElementVisitor.EMPTY_VISITOR;
}
var scopes = buildAllowedScopes();
SpellCheckerManager manager = SpellCheckerManager.getInstance(holder.getProject());
return new PsiElementVisitor() {
@Override
public void visitElement(final @NotNull PsiElement element) {
@@ -118,12 +122,13 @@ public final class SpellCheckingInspection extends LocalInspectionTool implement
return;
}
inspect(element, session, strategy, holder);
inspect(manager, element, session, strategy, holder);
}
};
}
private void inspect(@NotNull PsiElement element,
private void inspect(@NotNull SpellCheckerManager manager,
@NotNull PsiElement element,
@NotNull LocalInspectionToolSession session,
@NotNull SpellcheckingStrategy strategy,
@NotNull ProblemsHolder holder) {
@@ -137,7 +142,6 @@ public final class SpellCheckingInspection extends LocalInspectionTool implement
);
if (result == SpellCheckingResult.Checked) return;
SpellCheckerManager manager = SpellCheckerManager.getInstance(holder.getProject());
Set<SpellCheckingScope> scopes = buildAllowedScopes();
tokenize(
strategy, element,
@@ -8,7 +8,6 @@ import com.intellij.codeInsight.intention.choice.ChoiceTitleIntentionAction
import com.intellij.codeInsight.intention.choice.ChoiceVariantIntentionAction
import com.intellij.codeInsight.intention.choice.DefaultIntentionActionWithChoice
import com.intellij.codeInsight.intention.preview.IntentionPreviewUtils
import com.intellij.codeInspection.util.IntentionName
import com.intellij.openapi.editor.Document
import com.intellij.openapi.editor.Editor
import com.intellij.openapi.editor.impl.DocumentMarkupModel
@@ -27,19 +26,12 @@ import com.intellij.spellchecker.statistics.SpellcheckerRateTracker
import com.intellij.spellchecker.util.SpellCheckerBundle
import com.intellij.util.concurrency.ThreadingAssertions
internal class ChangeTo(
internal class ChangeTo @JvmOverloads constructor(
typo: String,
element: PsiElement,
private val range: TextRange,
private val tracker: SpellcheckerRateTracker?,
private val tracker: SpellcheckerRateTracker? = null,
) : DefaultIntentionActionWithChoice, LazySuggestions(typo) {
// To prevent API breakage
constructor(typo: String, element: PsiElement, range: TextRange) : this(
typo,
element,
range,
null,
)
private val pointer = SmartPointerManager.getInstance(element.project).createSmartPsiElementPointer(element, element.containingFile)
@@ -1,4 +1,10 @@
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.spellchecker.tokenizer
class PlainTextSpellcheckingStrategy: SpellcheckingStrategy()
import com.intellij.openapi.util.registry.Registry
class PlainTextSpellcheckingStrategy: SpellcheckingStrategy() {
override fun useTextLevelSpellchecking(): Boolean {
return Registry.`is`("spellchecker.grazie.enabled")
}
}
@@ -1 +1 @@
YWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFh<TYPO descr="Typo: In word 'YWEK'">YWEK</TYPO>
<TYPO>YWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEK</TYPO>
@@ -1 +1 @@
someСorrectWordsAndTypo
someCorrectWordsAndTypo
@@ -1 +1 @@
SoomeTypoJooinedTogeether
SomeTypoJoinedTogether
@@ -1 +1 @@
someTypoAndСorrectWords
someTypoAndCorrectWords
@@ -4,6 +4,7 @@ package com.intellij.spellchecker.xml;
import com.intellij.codeInspection.SuppressQuickFix;
import com.intellij.openapi.project.DumbAware;
import com.intellij.openapi.util.TextRange;
import com.intellij.openapi.util.registry.Registry;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.*;
import com.intellij.psi.impl.source.tree.LeafPsiElement;
@@ -94,6 +95,11 @@ public class XmlSpellcheckingStrategy extends SuppressibleSpellcheckingStrategy
return file == null || file.getLanguage() instanceof TemplateLanguage;
}
@Override
public boolean useTextLevelSpellchecking() {
return Registry.is("spellchecker.grazie.enabled");
}
@Override
protected boolean isLiteral(@NotNull PsiElement element) {
return element instanceof XmlAttributeValue || element instanceof XmlText;