removed use of reflection in PatternsManager.java. For this the Code to generate the Localization files was extracted into its own submodule.

The generator now also creates a class that Holds a Map of all Localizations for the timeago-parser.
pull/1288/head
Thilo Kogge 2025-03-27 19:38:58 +01:00
rodzic 0b99100dbd
commit 18572da79d
9 zmienionych plików z 168 dodań i 32 usunięć

Wyświetl plik

@ -1,2 +1,2 @@
include 'extractor', 'timeago-parser'
include 'extractor', 'timeago-parser', 'timeago-generator'
rootProject.name = 'NewPipeExtractor'

Wyświetl plik

@ -0,0 +1,5 @@
dependencies {
implementation "com.github.TeamNewPipe:nanojson:$nanojsonVersion"
implementation "com.google.code.findbugs:jsr305:$jsr305Version"
implementation project(":timeago-parser")
}

Wyświetl plik

@ -1,3 +1,5 @@
package com.github.TeamNewPipe;
import com.grack.nanojson.JsonObject;
import com.grack.nanojson.JsonParser;

Wyświetl plik

@ -1,3 +1,5 @@
package com.github.TeamNewPipe;
import com.grack.nanojson.JsonAppendableWriter;
import com.grack.nanojson.JsonObject;
import com.grack.nanojson.JsonParser;

Wyświetl plik

@ -1,12 +1,20 @@
package com.github.TeamNewPipe;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.time.temporal.ChronoUnit;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import com.grack.nanojson.JsonArray;
import com.grack.nanojson.JsonObject;
import com.grack.nanojson.JsonParser;
import com.grack.nanojson.JsonParserException;
import org.schabi.newpipe.extractor.timeago.PatternsHolder;
import org.schabi.newpipe.extractor.timeago.TimeAgoUnit;
import java.io.*;
import java.util.*;
public class GeneratePatternClasses {
public static void main(String[] args) throws FileNotFoundException, JsonParserException {
@ -16,6 +24,8 @@ public class GeneratePatternClasses {
final JsonObject from = JsonParser.object().from(resourceAsStream);
final TreeMap<String, Object> map = new TreeMap<>(from);
final StringBuilder patternMapEntries = new StringBuilder();
for (Map.Entry<String, Object> entry : map.entrySet()) {
final String languageCode = entry.getKey().replace('-', '_');
final Map<String, Object> unitsList = (Map<String, Object>) entry.getValue();
@ -31,16 +41,17 @@ public class GeneratePatternClasses {
final JsonArray years = (JsonArray) unitsList.get("years");
final StringBuilder specialCasesString = new StringBuilder();
specialCasesConstruct(TimeAgoUnit.SECONDS, seconds, specialCasesString);
specialCasesConstruct(TimeAgoUnit.MINUTES, minutes, specialCasesString);
specialCasesConstruct(TimeAgoUnit.HOURS, hours, specialCasesString);
specialCasesConstruct(TimeAgoUnit.DAYS, days, specialCasesString);
specialCasesConstruct(TimeAgoUnit.WEEKS, weeks, specialCasesString);
specialCasesConstruct(TimeAgoUnit.MONTHS, months, specialCasesString);
specialCasesConstruct(TimeAgoUnit.YEARS, years, specialCasesString);
specialCasesConstruct(ChronoUnit.SECONDS, seconds, specialCasesString);
specialCasesConstruct(ChronoUnit.MINUTES, minutes, specialCasesString);
specialCasesConstruct(ChronoUnit.HOURS, hours, specialCasesString);
specialCasesConstruct(ChronoUnit.DAYS, days, specialCasesString);
specialCasesConstruct(ChronoUnit.WEEKS, weeks, specialCasesString);
specialCasesConstruct(ChronoUnit.MONTHS, months, specialCasesString);
specialCasesConstruct(ChronoUnit.YEARS, years, specialCasesString);
System.out.println("Generating \"" + languageCode + "\" pattern class...");
try (final FileWriter fileOut = new FileWriter(
"timeago-parser/src/main/java/org/schabi/newpipe/extractor/timeago/patterns/" +
languageCode + ".java")) {
@ -48,7 +59,7 @@ public class GeneratePatternClasses {
"\n" +
"package org.schabi.newpipe.extractor.timeago.patterns;\n\n" +
"import org.schabi.newpipe.extractor.timeago.PatternsHolder;\n" +
(specialCasesString.length() > 0 ? "import org.schabi.newpipe.extractor.timeago.TimeAgoUnit;\n" : "") +
(specialCasesString.length() > 0 ? "\nimport java.time.temporal.ChronoUnit;\n" : "") +
"\n" +
"public class " + languageCode + " extends PatternsHolder {\n" +
" private static final String WORD_SEPARATOR = \"" + wordSeparator + "\";\n" +
@ -76,10 +87,38 @@ public class GeneratePatternClasses {
} catch (IOException e) {
e.printStackTrace();
}
patternMapEntries.append(" patternMap.put(\"")
.append(languageCode).append("\", ")
.append(languageCode).append(".getInstance());\n");
}
try (final FileWriter fileOut = new FileWriter(
"timeago-parser/src/main/java/org/schabi/newpipe/extractor/timeago/PatternMap.java")) {
final String patternMapClass = INFO_CLASS_GENERATED + "\n" +
"\n" +
"package org.schabi.newpipe.extractor.timeago;\n\n" +
"import org.schabi.newpipe.extractor.timeago.patterns.*;\n" +
"import java.util.HashMap;\n" +
"import java.util.Map;\n\n" +
"public class PatternMap {\n" +
" private static final Map<String, PatternsHolder> patternMap = new HashMap<>();\n" +
"\n" +
" static {\n" +
patternMapEntries +
" }\n" +
"\n" +
" public static PatternsHolder getPattern(String languageCode) {\n" +
" return patternMap.get(languageCode);\n" +
" }\n" +
"}";
fileOut.write(patternMapClass);
} catch (IOException e) {
e.printStackTrace();
}
}
private static void specialCasesConstruct(TimeAgoUnit unit, JsonArray array, StringBuilder stringBuilder) {
private static void specialCasesConstruct(ChronoUnit unit, JsonArray array, StringBuilder stringBuilder) {
final Iterator<Object> iterator = array.iterator();
while (iterator.hasNext()) {
final Object o = iterator.next();
@ -91,7 +130,7 @@ public class GeneratePatternClasses {
iterator.remove();
stringBuilder.append(" ")
.append("putSpecialCase(TimeAgoUnit.").append(unit.name())
.append("putSpecialCase(ChronoUnit.").append(unit.name())
.append(", \"").append(caseText).append("\"")
.append(", ").append(caseAmount).append(");").append("\n");
}
@ -113,4 +152,4 @@ public class GeneratePatternClasses {
return toReturn.toString();
}
}
}

Wyświetl plik

@ -1,3 +1,5 @@
package com.github.TeamNewPipe;
import java.util.*;
public class Utils {

Wyświetl plik

@ -1,4 +1,3 @@
dependencies {
implementation "com.github.TeamNewPipe:nanojson:$nanojsonVersion"
implementation "com.google.code.findbugs:jsr305:$jsr305Version"
}

Wyświetl plik

@ -0,0 +1,100 @@
/**/// DO NOT MODIFY THIS FILE MANUALLY
/**/// This class was automatically generated by "GeneratePatternClasses.java",
/**/// modify the "unique_patterns.json" and re-generate instead.
package org.schabi.newpipe.extractor.timeago;
import org.schabi.newpipe.extractor.timeago.patterns.*;
import java.util.HashMap;
import java.util.Map;
public class PatternMap {
private static final Map<String, PatternsHolder> patternMap = new HashMap<>();
static {
patternMap.put("af", af.getInstance());
patternMap.put("am", am.getInstance());
patternMap.put("ar", ar.getInstance());
patternMap.put("az", az.getInstance());
patternMap.put("be", be.getInstance());
patternMap.put("bg", bg.getInstance());
patternMap.put("bn", bn.getInstance());
patternMap.put("bs", bs.getInstance());
patternMap.put("ca", ca.getInstance());
patternMap.put("cs", cs.getInstance());
patternMap.put("da", da.getInstance());
patternMap.put("de", de.getInstance());
patternMap.put("el", el.getInstance());
patternMap.put("en", en.getInstance());
patternMap.put("en_GB", en_GB.getInstance());
patternMap.put("es", es.getInstance());
patternMap.put("es_419", es_419.getInstance());
patternMap.put("es_US", es_US.getInstance());
patternMap.put("et", et.getInstance());
patternMap.put("eu", eu.getInstance());
patternMap.put("fa", fa.getInstance());
patternMap.put("fi", fi.getInstance());
patternMap.put("fil", fil.getInstance());
patternMap.put("fr", fr.getInstance());
patternMap.put("fr_CA", fr_CA.getInstance());
patternMap.put("gl", gl.getInstance());
patternMap.put("gu", gu.getInstance());
patternMap.put("hi", hi.getInstance());
patternMap.put("hr", hr.getInstance());
patternMap.put("hu", hu.getInstance());
patternMap.put("hy", hy.getInstance());
patternMap.put("id", id.getInstance());
patternMap.put("is", is.getInstance());
patternMap.put("it", it.getInstance());
patternMap.put("iw", iw.getInstance());
patternMap.put("ja", ja.getInstance());
patternMap.put("ka", ka.getInstance());
patternMap.put("kk", kk.getInstance());
patternMap.put("km", km.getInstance());
patternMap.put("kn", kn.getInstance());
patternMap.put("ko", ko.getInstance());
patternMap.put("ky", ky.getInstance());
patternMap.put("lo", lo.getInstance());
patternMap.put("lt", lt.getInstance());
patternMap.put("lv", lv.getInstance());
patternMap.put("mk", mk.getInstance());
patternMap.put("ml", ml.getInstance());
patternMap.put("mn", mn.getInstance());
patternMap.put("mr", mr.getInstance());
patternMap.put("ms", ms.getInstance());
patternMap.put("my", my.getInstance());
patternMap.put("ne", ne.getInstance());
patternMap.put("nl", nl.getInstance());
patternMap.put("no", no.getInstance());
patternMap.put("pa", pa.getInstance());
patternMap.put("pl", pl.getInstance());
patternMap.put("pt", pt.getInstance());
patternMap.put("pt_PT", pt_PT.getInstance());
patternMap.put("ro", ro.getInstance());
patternMap.put("ru", ru.getInstance());
patternMap.put("si", si.getInstance());
patternMap.put("sk", sk.getInstance());
patternMap.put("sl", sl.getInstance());
patternMap.put("sq", sq.getInstance());
patternMap.put("sr", sr.getInstance());
patternMap.put("sr_Latn", sr_Latn.getInstance());
patternMap.put("sv", sv.getInstance());
patternMap.put("sw", sw.getInstance());
patternMap.put("ta", ta.getInstance());
patternMap.put("te", te.getInstance());
patternMap.put("th", th.getInstance());
patternMap.put("tr", tr.getInstance());
patternMap.put("uk", uk.getInstance());
patternMap.put("ur", ur.getInstance());
patternMap.put("uz", uz.getInstance());
patternMap.put("vi", vi.getInstance());
patternMap.put("zh_CN", zh_CN.getInstance());
patternMap.put("zh_HK", zh_HK.getInstance());
patternMap.put("zh_TW", zh_TW.getInstance());
patternMap.put("zu", zu.getInstance());
}
public static PatternsHolder getPattern(String languageCode) {
return patternMap.get(languageCode);
}
}

Wyświetl plik

@ -2,7 +2,6 @@ package org.schabi.newpipe.extractor.timeago;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.lang.reflect.InvocationTargetException;
public class PatternsManager {
/**
@ -14,18 +13,6 @@ public class PatternsManager {
public static PatternsHolder getPatterns(@Nonnull String languageCode, @Nullable String countryCode) {
final String targetLocalizationClassName = languageCode +
(countryCode == null || countryCode.isEmpty() ? "" : "_" + countryCode);
try {
final Class<?> targetClass = Class.forName(
"org.schabi.newpipe.extractor.timeago.patterns." + targetLocalizationClassName);
return (PatternsHolder) targetClass.getDeclaredMethod("getInstance").invoke(null);
} catch (ClassNotFoundException ignored) {
// Target localization is not supported
} catch (IllegalAccessException | NoSuchMethodException | InvocationTargetException e) {
e.printStackTrace();
}
return null;
return PatternMap.getPattern(targetLocalizationClassName);
}
}