Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ If you're using Gradle, you could add NewPipe Extractor as a dependency with the
3. If you are using tools to minimize your project, make sure to keep the files below, by e.g. adding the following lines to your proguard file:
```
## Rules for NewPipeExtractor
-keep class org.schabi.newpipe.extractor.timeago.patterns.** { *; }
-keep class org.mozilla.javascript.** { *; }
-keep class org.mozilla.classfile.ClassFileWriter
-dontwarn org.mozilla.javascript.tools.**
Expand Down
2 changes: 1 addition & 1 deletion settings.gradle
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
include 'extractor', 'timeago-parser'
include 'extractor', 'timeago-parser', 'timeago-generator'
rootProject.name = 'NewPipeExtractor'
5 changes: 5 additions & 0 deletions timeago-generator/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
dependencies {
implementation "com.github.TeamNewPipe:nanojson:$nanojsonVersion"
implementation "com.google.code.findbugs:jsr305:$jsr305Version"
implementation project(":timeago-parser")
}
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
package org.schabi.newpipe.timeago_generator;

import com.grack.nanojson.JsonObject;
import com.grack.nanojson.JsonParser;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
package org.schabi.newpipe.timeago_generator;

import com.grack.nanojson.JsonAppendableWriter;
import com.grack.nanojson.JsonObject;
import com.grack.nanojson.JsonParser;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,20 @@
package org.schabi.newpipe.timeago_generator;

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 {
Expand All @@ -16,6 +24,8 @@ public static void main(String[] args) throws FileNotFoundException, JsonParserE
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();
Expand All @@ -31,24 +41,25 @@ public static void main(String[] args) throws FileNotFoundException, JsonParserE
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")) {
final String test = INFO_CLASS_GENERATED + "\n" +
"\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" +
Expand Down Expand Up @@ -76,10 +87,38 @@ public static void main(String[] args) throws FileNotFoundException, JsonParserE
} 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(final 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();
Expand All @@ -91,7 +130,7 @@ private static void specialCasesConstruct(TimeAgoUnit unit, JsonArray array, Str
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");
}
Expand All @@ -113,4 +152,4 @@ private static String join(List<Object> list) {

return toReturn.toString();
}
}
}
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
package org.schabi.newpipe.timeago_generator;

import java.util.*;

public class Utils {
Expand Down
1 change: 0 additions & 1 deletion timeago-parser/build.gradle
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
dependencies {
implementation "com.github.TeamNewPipe:nanojson:$nanojsonVersion"
implementation "com.google.code.findbugs:jsr305:$jsr305Version"
}
Original file line number Diff line number Diff line change
@@ -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(final String languageCode) {
return patternMap.get(languageCode);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.lang.reflect.InvocationTargetException;

public class PatternsManager {
/**
Expand All @@ -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);
}
}