Skip to content

Commit

Permalink
[ca] make Catalan language a singleton (#11131)
Browse files Browse the repository at this point in the history
  • Loading branch information
jaumeortola authored Dec 21, 2024
1 parent f9532fb commit 9f54386
Show file tree
Hide file tree
Showing 31 changed files with 129 additions and 49 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -18,16 +18,41 @@
*/
package org.languagetool.language;

import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.languagetool.Language;
import org.languagetool.Languages;
import org.languagetool.synthesis.Synthesizer;
import org.languagetool.synthesis.ca.CatalanSynthesizer;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Objects;

public class BalearicCatalan extends Catalan {

private static final String LANGUAGE_SHORT_CODE = "ca-ES-balear";

private static volatile Throwable instantiationTraceBalear;

public BalearicCatalan() {
super(true);
Throwable trace = instantiationTraceBalear;
if (trace != null) {
throw new RuntimeException("Language was already instantiated, see the cause stacktrace below.", trace);
}
instantiationTraceBalear = new Throwable();
}

public static @NotNull BalearicCatalan getInstance() {
Language language = Objects.requireNonNull(Languages.getLanguageForShortCode(LANGUAGE_SHORT_CODE));
if (language instanceof BalearicCatalan catalan) {
return catalan;
}
throw new RuntimeException("BalearicCatalan language expected, got " + language);
}

@Override
public String getName() {
return "Catalan (Balearic)";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,9 +45,31 @@

public class Catalan extends Language {

private static final Pattern PATTERN_1 = compile("(\\b[lmnstdLMNSTD])'");
private static final Pattern PATTERN_2 = compile("(\\b[lmnstdLMNSTD])’\"");
private static final Pattern PATTERN_3 = compile("(\\b[lmnstdLMNSTD])’'");
private static final String LANGUAGE_SHORT_CODE = "ca-ES";

private static volatile Throwable instantiationTrace;

public Catalan() {
Throwable trace = instantiationTrace;
if (trace != null) {
throw new RuntimeException("Language was already instantiated, see the cause stacktrace below.", trace);
}
instantiationTrace = new Throwable();
}

/**
* This is a fake constructor overload for the subclasses. Public constructors can only be used by the LT itself.
*/
protected Catalan(boolean fakeValue) {
}

public static @NotNull Catalan getInstance() {
Language language = Objects.requireNonNull(Languages.getLanguageForShortCode(LANGUAGE_SHORT_CODE));
if (language instanceof Catalan catalan) {
return catalan;
}
throw new RuntimeException("Catalan language expected, got " + language);
}

@Override
public String getName() {
Expand Down Expand Up @@ -138,7 +160,7 @@ public Disambiguator createDefaultDisambiguator() {

@Override
public Tokenizer createDefaultWordTokenizer() {
return new CatalanWordTokenizer();
return CatalanWordTokenizer.INSTANCE;
}

/** @since 5.1 */
Expand Down Expand Up @@ -170,7 +192,11 @@ public String getClosingSingleQuote() {
public boolean isAdvancedTypographyEnabled() {
return true;
}


private static final Pattern PATTERN_1 = compile("(\\b[lmnstdLMNSTD])'");
private static final Pattern PATTERN_2 = compile("(\\b[lmnstdLMNSTD])’\"");
private static final Pattern PATTERN_3 = compile("(\\b[lmnstdLMNSTD])’'");

@Override
public String toAdvancedTypography (String input) {
String output = super.toAdvancedTypography(input);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.languagetool.Language;
import org.languagetool.Languages;
import org.languagetool.UserConfig;
import org.languagetool.rules.*;
import org.languagetool.rules.ca.*;
Expand All @@ -34,6 +35,27 @@

public class ValencianCatalan extends Catalan {

private static final String LANGUAGE_SHORT_CODE = "ca-ES-valencia";

private static volatile Throwable instantiationTraceValecian;

public ValencianCatalan() {
super(true);
Throwable trace = instantiationTraceValecian;
if (trace != null) {
throw new RuntimeException("Language was already instantiated, see the cause stacktrace below.", trace);
}
instantiationTraceValecian = new Throwable();
}

public static @NotNull ValencianCatalan getInstance() {
Language language = Objects.requireNonNull(Languages.getLanguageForShortCode(LANGUAGE_SHORT_CODE));
if (language instanceof ValencianCatalan catalan) {
return catalan;
}
throw new RuntimeException("ValencianCatalan language expected, got " + language);
}

@Override
public String getName() {
return "Catalan (Valencian)";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,10 @@ public class CatalanNumberInWordFilter extends AbstractNumberInWordFilter {
private static MorfologikCatalanSpellerRule catalanSpellerRule;

public CatalanNumberInWordFilter() throws IOException {
super(new Catalan());
super(Catalan.getInstance());
ResourceBundle messages = JLanguageTool.getDataBroker().getResourceBundle(JLanguageTool.MESSAGE_BUNDLE, new Locale(language.getShortCode()));
if (catalanSpellerRule == null) {
catalanSpellerRule = new MorfologikCatalanSpellerRule(messages, new Catalan(), null, Collections.emptyList());
catalanSpellerRule = new MorfologikCatalanSpellerRule(messages, Catalan.getInstance(), null, Collections.emptyList());
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@

public class CatalanNumberSpellerFilter extends RuleFilter {

private final Language language = new Catalan();
private final Language language = Catalan.getInstance();
private final CatalanSynthesizer synth = (CatalanSynthesizer) language.getSynthesizer();

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ public Map<String, List<String>> getWrongWords() {
}

public SimpleReplaceAdverbsMent(final ResourceBundle messages) throws IOException {
super(messages, new Catalan());
super(messages, Catalan.getInstance());
super.setCategory(new Category(new CategoryId("PICKY_STYLE"), "regles d'estil, mode perfeccionaista"));
super.setLocQualityIssueType(ITSIssueType.Style);
super.setDefaultOff();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ public class SimpleReplaceAnglicism extends AbstractSimpleReplaceRule2 {
private static final Locale CA_LOCALE = new Locale("ca");

public SimpleReplaceAnglicism(final ResourceBundle messages) throws IOException {
super(messages, new Catalan());
super(messages, Catalan.getInstance());
setCategory(Categories.STYLE.getCategory(messages));
setLocQualityIssueType(ITSIssueType.Style);
useSubRuleSpecificIds();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ public class SimpleReplaceMultiwordsRule extends AbstractSimpleReplaceRule2 {
private static final Locale CA_LOCALE = new Locale("ca");

public SimpleReplaceMultiwordsRule(final ResourceBundle messages) throws IOException {
super(messages, new Catalan());
super(messages, Catalan.getInstance());
setCategory(Categories.GRAMMAR.getCategory(messages));
setLocQualityIssueType(ITSIssueType.Grammar);
useSubRuleSpecificIds();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.languagetool.Languages;
import org.languagetool.tagging.ca.CatalanTagger;
import org.languagetool.tokenizers.WordTokenizer;
import org.languagetool.tools.StringTools;
Expand All @@ -39,6 +40,8 @@
*/
public class CatalanWordTokenizer extends WordTokenizer {

public static final CatalanWordTokenizer INSTANCE = new CatalanWordTokenizer();

private static final String wordCharacters = "§©@€£\\$_\\p{L}\\\\-\u0300-\u036F\u00A8\u2070-\u209F°%‰‱&\uFFFD\u00AD\u00AC";
private static final Pattern tokenizerPattern = Pattern.compile("[" + wordCharacters + "]+|[^" + wordCharacters + "]");
//all possible forms of "pronoms febles" after a verb.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
public class CatalanConcurrencyTest extends AbstractLanguageConcurrencyTest {
@Override
protected Language createLanguage() {
return new Catalan();
return Catalan.getInstance();
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
public class JLanguageToolTest {


private Language lang = new Catalan();
private Language lang = Catalan.getInstance();
private JLanguageTool tool = new JLanguageTool(lang);


Expand All @@ -63,7 +63,7 @@ public void testCleanOverlappingErrors() throws IOException {

@Test
public void testValencianVariant() throws IOException {
Language lang = new ValencianCatalan();
Language lang = ValencianCatalan.getInstance();
JLanguageTool tool = new JLanguageTool(lang);
List<RuleMatch> matches = tool.check("Cal usar mètodes d'anàlisi adequats.");
assertEquals(0, matches.size());
Expand Down Expand Up @@ -114,14 +114,18 @@ public void testValencianVariant() throws IOException {

@Test
public void testBalearicVariant() throws IOException {
Language lang = new BalearicCatalan();
Language lang = BalearicCatalan.getInstance();
JLanguageTool tool = new JLanguageTool(lang);
List<RuleMatch> matches = tool.check("Cal usar mètodes d'anàlisi adequats.");
assertEquals(0, matches.size());

List<RuleMatch> matches2 = tool.check("Aquestes frases per a probar.");
assertEquals(1, matches2.size());
assertEquals("provar", matches2.get(0).getSuggestedReplacements().get(0));

List<RuleMatch> matches3 = tool.check("Pens que és una cosa bona.");
assertEquals(0, matches3.size());

}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
public class ValencianCatalanConcurrencyTest extends AbstractLanguageConcurrencyTest {
@Override
protected Language createLanguage() {
return new ValencianCatalan();
return ValencianCatalan.getInstance();
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ public class CatalanTest extends LanguageSpecificTest {
public void testLanguage() throws IOException {
// NOTE: this text needs to be kept in sync with config.ts -> DEMO_TEXTS:
String s = "Introduïu açí el vostre text. o feu servir aquest texts com a a exemple per a alguns errades que LanguageTool hi pot detectat.";
Catalan lang = new Catalan();
Catalan lang = Catalan.getInstance();
testDemoText(lang, s,
Arrays.asList("MORFOLOGIK_RULE_CA_ES", "UPPERCASE_SENTENCE_START", "CONCORDANCES_DET_NOM", "CATALAN_WORD_REPEAT_RULE", "CONCORDANCES_DET_NOM", "VERB_SEGUIT_DINFINITIU")
);
Expand All @@ -46,7 +46,7 @@ public void testLanguage() throws IOException {

@Test
public void testRepeatedPatternRules() throws IOException {
Language lang = new Catalan();
Language lang = Catalan.getInstance();
JLanguageTool lt = new JLanguageTool(lang);
List<RuleMatch> matches = lt.check("Iniciem les converses. Llavors s'inicià una altra cosa.", JLanguageTool.Level.PICKY);
assertEquals("Matches across rules in a rule group", 1, matches.size());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,8 @@ public class CatalanUnpairedBracketsRuleTest {

@Before
public void setUp() throws IOException {
rule = new CatalanUnpairedBracketsRule(TestTools.getEnglishMessages(), new Catalan());
lt = new JLanguageTool(new Catalan());
rule = new CatalanUnpairedBracketsRule(TestTools.getEnglishMessages(), Catalan.getInstance());
lt = new JLanguageTool(Catalan.getInstance());
}

@Test
Expand Down Expand Up @@ -146,7 +146,7 @@ private void assertMatches(String input, int expectedMatches) throws IOException

@Test
public void testMultipleSentences() throws IOException {
final JLanguageTool tool = new JLanguageTool(new Catalan());
final JLanguageTool tool = new JLanguageTool(Catalan.getInstance());
tool.enableRule("CA_UNPAIRED_BRACKETS");

List<RuleMatch> matches;
Expand Down Expand Up @@ -177,7 +177,7 @@ public void testMultipleSentences() throws IOException {

@Test
public void testQuestionExclamation() throws IOException {
final JLanguageTool tool = new JLanguageTool(new Catalan());
final JLanguageTool tool = new JLanguageTool(Catalan.getInstance());
tool.enableRule("CA_UNPAIRED_QUESTION");
tool.enableRule("CA_UNPAIRED_EXCLAMATION");

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,9 @@ public class CatalanWordRepeatRuleTest {
*/
@Test
public void testRule() throws IOException {
final CatalanWordRepeatRule rule = new CatalanWordRepeatRule(TestTools.getMessages("ca"), new Catalan());
final CatalanWordRepeatRule rule = new CatalanWordRepeatRule(TestTools.getMessages("ca"), Catalan.getInstance());
RuleMatch[] matches;
JLanguageTool lt = new JLanguageTool(new Catalan());
JLanguageTool lt = new JLanguageTool(Catalan.getInstance());
//correct
matches = rule.match(lt.getAnalyzedSentence("Sempre pensa en en Joan."));
assertEquals(0, matches.length);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ public class CatalanWrongWordInContextRuleTest {

@Test
public void testRule() throws IOException {
Catalan catalan = new Catalan();
Catalan catalan = Catalan.getInstance();
CatalanWrongWordInContextRule rule = new CatalanWrongWordInContextRule(null, catalan);
JLanguageTool lt = new JLanguageTool(catalan);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ public class CheckCaseRuleTest {

@Before
public void setUp() throws Exception {
lt = new JLanguageTool(new Catalan());
lt = new JLanguageTool(Catalan.getInstance());
rule = new CheckCaseRule(TestTools.getMessages("ca"), lt.getLanguage());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,10 +34,10 @@ public class MorfologikCatalanSpellerRuleTest {
@Test
public void testMorfologikSpeller() throws IOException {
MorfologikCatalanSpellerRule rule =
new MorfologikCatalanSpellerRule (TestTools.getMessages("ca"), new Catalan(), null, Collections.emptyList());
new MorfologikCatalanSpellerRule (TestTools.getMessages("ca"), Catalan.getInstance(), null, Collections.emptyList());

RuleMatch[] matches;
JLanguageTool lt = new JLanguageTool(new Catalan());
JLanguageTool lt = new JLanguageTool(Catalan.getInstance());

matches = rule.match(lt.getAnalyzedSentence("Tornaràn"));
assertEquals(1, matches.length);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ public class PronomFebleDuplicateRuleTest {
@Before
public void setUp() throws IOException {
rule = new PronomFebleDuplicateRule(TestTools.getEnglishMessages());
lt = new JLanguageTool(new Catalan());
lt = new JLanguageTool(Catalan.getInstance());
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,8 @@ public class ReplaceOperationNamesRuleTest {

@Before
public void setUp() throws IOException {
rule = new ReplaceOperationNamesRule(TestTools.getEnglishMessages(), new Catalan());
lt = new JLanguageTool(new Catalan());
rule = new ReplaceOperationNamesRule(TestTools.getEnglishMessages(), Catalan.getInstance());
lt = new JLanguageTool(Catalan.getInstance());
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ public class SimpleReplaceBalearicRuleTest {

@Before
public void setUp() throws Exception {
lt = new JLanguageTool(new Catalan());
lt = new JLanguageTool(Catalan.getInstance());
rule = new SimpleReplaceBalearicRule(TestTools.getMessages("ca"), lt.getLanguage());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,8 @@ public class SimpleReplaceDNVRuleTest {

@Before
public void setUp() throws Exception {
rule = new SimpleReplaceDNVRule(TestTools.getMessages("ca"), new ValencianCatalan());
lt = new JLanguageTool(new ValencianCatalan());
rule = new SimpleReplaceDNVRule(TestTools.getMessages("ca"), ValencianCatalan.getInstance());
lt = new JLanguageTool(ValencianCatalan.getInstance());
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,8 @@ public class SimpleReplaceDNVSecondaryRuleTest {

@Before
public void setUp() throws Exception {
rule = new SimpleReplaceDNVSecondaryRule(TestTools.getMessages("ca"), new ValencianCatalan());
lt = new JLanguageTool(new ValencianCatalan());
rule = new SimpleReplaceDNVSecondaryRule(TestTools.getMessages("ca"), ValencianCatalan.getInstance());
lt = new JLanguageTool(ValencianCatalan.getInstance());
}

@Test
Expand Down
Loading

0 comments on commit 9f54386

Please sign in to comment.