Skip to content

Commit

Permalink
Fix confusing present and future tables parsing
Browse files Browse the repository at this point in the history
  • Loading branch information
jazzman committed Apr 24, 2023
1 parent 13de924 commit e3e84f6
Show file tree
Hide file tree
Showing 2 changed files with 105 additions and 36 deletions.
77 changes: 50 additions & 27 deletions src/main/java/pro/jazzman/odmiana/bot/messages/VerbView.java
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,9 @@ public class VerbView implements View {
🍏3 os: ${singular.past.neutral.third} | ${plural.past.neutral.third}
```
""";

private static final String FUTURE_TEMPLATE = """
⏰*Czas przyszły* - *liczba pojedyncza*
```
🧔🏼1 os: ${singular.future.male.first}
Expand All @@ -61,22 +64,29 @@ public class VerbView implements View {
🙅🏼‍3 os: ${plural.future.nonmale.third}
```
""";

private static final String IMPERATIVE_TEMPLATE = """
📢*Tryb rozkazujący*
```
1 os: ${singular.imperative.placeholder} | ${plural.imperative.first}
2 os: ${singular.imperative.second} | ${plural.imperative.second}
```
""";

private static final String ADDITIONAL_TEMPLATE = """
*Bezosobnik*: `${impersonal}`
*Gerundium*: `${gerund}`
*Imiesłów przysłówkowy współczesny*: `${modern.adverbial.participle}`
*Imiesłów przymiotnikowy czynny*: `${active.participle}`
*Imiesłów przymiotnikowy bierny*: `${passive.adjective.participle}`
""";

private Verb verb;

public String render() {
String template = TEMPLATE;

var placeholders = new HashMap<String, String>();
placeholders.put("infinitive", verb.getInfinitive());
placeholders.put("translation", verb.hasTranslation() ? " - " + verb.getTranslation() : "");
Expand Down Expand Up @@ -106,9 +116,6 @@ public String render() {
placeholders.put("singular.past.neutral.second", fixedString(verb.getSingularPastNeutral2(), pastMaxLength));
placeholders.put("singular.past.neutral.third", fixedString(verb.getSingularPastNeutral3(), pastMaxLength));

placeholders.put("singular.imperative.placeholder", "-".repeat(verb.getSingularImperative2().length()));
placeholders.put("singular.imperative.second", verb.getSingularImperative2());

placeholders.put("plural.past.male.first", verb.getPluralPastMale1());
placeholders.put("plural.past.male.second", verb.getPluralPastMale2());
placeholders.put("plural.past.male.third", verb.getPluralPastMale3());
Expand All @@ -118,38 +125,54 @@ public String render() {
placeholders.put("plural.past.neutral.first", verb.getPluralPastNeutral1());
placeholders.put("plural.past.neutral.second", verb.getPluralPastNeutral2());
placeholders.put("plural.past.neutral.third", verb.getPluralPastNeutral3());
placeholders.put("plural.imperative.first", verb.getPluralImperative1());
placeholders.put("plural.imperative.second", verb.getPluralImperative2());

placeholders.put("singular.future.male.first", verb.getSingularFutureMale1());
placeholders.put("singular.future.male.second", verb.getSingularFutureMale2());
placeholders.put("singular.future.male.third", verb.getSingularFutureMale3());
if (verb.getSingularFutureMale1() != null) {
placeholders.put("singular.future.male.first", verb.getSingularFutureMale1());
placeholders.put("singular.future.male.second", verb.getSingularFutureMale2());
placeholders.put("singular.future.male.third", verb.getSingularFutureMale3());

placeholders.put("singular.future.female.first", verb.getSingularFutureFemale1());
placeholders.put("singular.future.female.second", verb.getSingularFutureFemale2());
placeholders.put("singular.future.female.third", verb.getSingularFutureFemale3());

placeholders.put("singular.future.neutral.first", verb.getSingularFutureNeutral1());
placeholders.put("singular.future.neutral.second", verb.getSingularFutureNeutral2());
placeholders.put("singular.future.neutral.third", verb.getSingularFutureNeutral3());

placeholders.put("plural.future.male.first", verb.getPluralFutureMale1());
placeholders.put("plural.future.male.second", verb.getPluralFutureMale2());
placeholders.put("plural.future.male.third", verb.getPluralFutureMale3());

placeholders.put("plural.future.nonmale.first", verb.getPluralFutureNonMale1());
placeholders.put("plural.future.nonmale.second", verb.getPluralFutureNonMale2());
placeholders.put("plural.future.nonmale.third", verb.getPluralFutureNonMale3());

template += FUTURE_TEMPLATE;
}

placeholders.put("singular.future.female.first", verb.getSingularFutureFemale1());
placeholders.put("singular.future.female.second", verb.getSingularFutureFemale2());
placeholders.put("singular.future.female.third", verb.getSingularFutureFemale3());
if (verb.getPluralImperative1() != null) {
placeholders.put("singular.imperative.placeholder", "-".repeat(verb.getSingularImperative2().length()));
placeholders.put("singular.imperative.second", verb.getSingularImperative2());
placeholders.put("plural.imperative.first", verb.getPluralImperative1());
placeholders.put("plural.imperative.second", verb.getPluralImperative2());

placeholders.put("singular.future.neutral.first", verb.getSingularFutureNeutral1());
placeholders.put("singular.future.neutral.second", verb.getSingularFutureNeutral2());
placeholders.put("singular.future.neutral.third", verb.getSingularFutureNeutral3());
template += IMPERATIVE_TEMPLATE;
}

placeholders.put("plural.future.male.first", verb.getPluralFutureMale1());
placeholders.put("plural.future.male.second", verb.getPluralFutureMale2());
placeholders.put("plural.future.male.third", verb.getPluralFutureMale3());
if (verb.getImpersonal() != null) {
placeholders.put("impersonal", verb.getImpersonal());
placeholders.put("gerund", verb.getGerund());
placeholders.put("modern.adverbial.participle", verb.getModernAdverbialParticiple());
placeholders.put("active.participle", verb.getActiveParticiple());
placeholders.put("passive.adjective.participle", verb.getPassiveAdjectiveParticiple());

placeholders.put("plural.future.nonmale.first", verb.getPluralFutureNonMale1());
placeholders.put("plural.future.nonmale.second", verb.getPluralFutureNonMale2());
placeholders.put("plural.future.nonmale.third", verb.getPluralFutureNonMale3());
template += ADDITIONAL_TEMPLATE;
}

placeholders.put("impersonal", verb.getImpersonal());
placeholders.put("gerund", verb.getGerund());
placeholders.put("modern.adverbial.participle", verb.getModernAdverbialParticiple());
placeholders.put("active.participle", verb.getActiveParticiple());
placeholders.put("passive.adjective.participle", verb.getPassiveAdjectiveParticiple());

placeholders.replaceAll((k, v) -> v != null ? v : "-");

return StringSubstitutor.replace(TEMPLATE, placeholders);
return StringSubstitutor.replace(template, placeholders);
}

private String fixedString(String word, int length) {
Expand Down
64 changes: 55 additions & 9 deletions src/main/java/pro/jazzman/odmiana/parsers/VerbParser.java
Original file line number Diff line number Diff line change
Expand Up @@ -43,20 +43,41 @@ private void setInfinitive() {
}

private void setPresent() {
Table presentTenseTable = table("Czas teraźniejszy", document);
Table table = presentTenseTable(document);

if (presentTenseTable == null) {
if (table == null) {
log.warn("Unable to find a present tense table on the page");
} else {
verb.setSingularPresent1(presentTenseTable.extract(1,0));
verb.setSingularPresent2(presentTenseTable.extract(2, 0));
verb.setSingularPresent3(presentTenseTable.extract(3, 0));
verb.setPluralPresent1(presentTenseTable.extract(1, 1));
verb.setPluralPresent2(presentTenseTable.extract(2, 1));
verb.setPluralPresent3(presentTenseTable.extract(3, 1));
verb.setSingularPresent1(table.extract(1,0));
verb.setSingularPresent2(table.extract(2, 0));
verb.setSingularPresent3(table.extract(3, 0));
verb.setPluralPresent1(table.extract(1, 1));
verb.setPluralPresent2(table.extract(2, 1));
verb.setPluralPresent3(table.extract(3, 1));
}
}

private Table presentTenseTable(Document document) {
Table table = table("Czas teraźniejszy", document);

if (table != null) {
return table;
}

Element element = document.selectFirst("table.table-striped.fleksja-table.table-bordered");

if (element != null) {
Elements headers = element.select("thead tr th");
Elements rows = element.select("tbody tr");

if (headers.size() == 3 && rows.size() == 3) {
return Table.from(element);
}
}

return null;
}

private void setPast() {
Table pastTenseTable = table("Czas przeszły", document);

Expand Down Expand Up @@ -90,7 +111,7 @@ private void setPast() {
}

private void setFuture() {
Table table = table("Czas przyszły", document);
Table table = futureTenseTable();

if (table == null) {
log.warn("Unable to find a future tense table on the page");
Expand All @@ -116,6 +137,31 @@ private void setFuture() {
verb.setPluralFutureNonMale3(table.extract(4, 4, "span.forma:eq(0)"));
}

private Table futureTenseTable() {
Element p = document.selectFirst("p:contains(Czas przyszły)");

if (p != null) {
Element parent = p.parent();

if (parent != null) {
Elements children = parent.children();

Element element = children.get(children.indexOf(p) + 1).selectFirst("table");

if (element != null) {
Elements headers = element.select("thead tr:eq(1) th");
Elements rows = element.select("tbody tr");

if (headers.size() == 5 && rows.size() == 3) {
return Table.from(element);
}
}
}
}

return null;
}

private void setImperative() {
Table imperativeTable = table("Tryb rozkazujący", document);

Expand Down

0 comments on commit e3e84f6

Please sign in to comment.