diff --git a/src/ui/android/res/layout/lexical_item.xml b/src/ui/android/res/layout/lexical_item.xml index 0c56b6730..49f090a26 100644 --- a/src/ui/android/res/layout/lexical_item.xml +++ b/src/ui/android/res/layout/lexical_item.xml @@ -3,7 +3,7 @@ android:layout_width="fill_parent" android:layout_height="fill_parent" > + + \ No newline at end of file diff --git a/src/ui/android/res/xml/inflection_bg.xml b/src/ui/android/res/xml/inflection_bg.xml new file mode 100644 index 000000000..6d666fddf --- /dev/null +++ b/src/ui/android/res/xml/inflection_bg.xml @@ -0,0 +1,615 @@ + + +

Съществително

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ед.ч.нечленувано
s (NF Sg Indef)
членувано
s (NF Sg Def)
пълен член
s NFSgDefNom
мн.ч.нечленувано
s (NF Pl Indef)
членувано
s (NF Pl Def)
звателна форма
s NFVocative
бройна форма
s NFPlCount
+ +

Прилагателно

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ед.ч.м.р.нечленувано
rel (ASg Masc Indef)
непълен член
rel (ASg Masc Def)
пълен член
rel ASgMascDefNom
ж.р.нечленувано
rel (ASg Fem Indef)
членувано
rel (ASg Fem Def)
ср.р.нечленувано
rel (ASg Neut Indef)
членувано
rel (ASg Neut Def)
мн.ч.нечленувано
rel (APl Indef)
членувано
rel (APl Def)
+
+ +

Прилагателно

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ед.ч.м.р.нечленувано
s (ASg Masc Indef)
непълен член
s (ASg Masc Def)
пълен член
s ASgMascDefNom
ж.р.нечленувано
s (ASg Fem Indef)
членувано
s (ASg Fem Def)
ср.р.нечленувано
s (ASg Neut Indef)
членувано
s (ASg Neut Def)
мн.ч.нечленувано
s (APl Indef)
членувано
s (APl Def)
+ +

Наречие

+

adv

+
+ +

Наречие

+

s

+
+ +

Предлог

+

s

+
+ +

Глагол от несвършен вид

+ +

Изявително наклонение

+ +

Сегашно време

+ + + + + + + + + + + + + + + + + + + + + +
ед.ч.мн.ч.
1 л.
s Imperf (VPres Sg P1)
s Imperf (VPres Pl P1)
2 л.
s Imperf (VPres Sg P2)
s Imperf (VPres Pl P2)
3 л.
s Imperf (VPres Sg P3)
s Imperf (VPres Pl P3)
+ +

Минало свършено време (аорист)

+ + + + + + + + + + + + + + + + + + + + + +
ед.ч.мн.ч.
1 л.
s Imperf (VAorist Sg P1)
s Imperf (VAorist Pl P1)
2 л.
s Imperf (VAorist Sg P2)
s Imperf (VAorist Pl P2)
3 л.
s Imperf (VAorist Sg P3)
s Imperf (VAorist Pl P3)
+ +

Минало несвършено време (имперфект)

+ + + + + + + + + + + + + + + + + + + + + +
ед.ч.мн.ч.
1 л.
s Imperf (VImperfect Sg P1)
s Imperf (VImperfect Pl P1)
2 л.
s Imperf (VImperfect Sg P2)
s Imperf (VImperfect Pl P2)
3 л.
s Imperf (VImperfect Sg P3)
s Imperf (VImperfect Pl P3)
+ +

Повелително наклонение

+ + + + + + + + + +
ед.ч.мн.ч.
s Imperf (VImperative Sg)
s Imperf (VImperative Pl)
+ +

Причастия (отглаголни прилагателни)

+ +

Минало страдателно причастие

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ед.ч.м.р.нечленувано
s Imperf (VPassive (ASg Masc Indef))
непълен член
s Imperf (VPassive (ASg Masc Def))
пълен член
s Imperf (VPassive ASgMascDefNom)
ж.р.нечленувано
s Imperf (VPassive (ASg Fem Indef))
членувано
s Imperf (VPassive (ASg Fem Def))
ср.р.нечленувано
s Imperf (VPassive (ASg Neut Indef))
членувано
s Imperf (VPassive (ASg Neut Def))
мн.ч.нечленувано
s Imperf (VPassive (APl Indef))
членувано
s Imperf (VPassive (APl Def))
+ +

Минало свършено деятелно причастие

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ед.ч.м.р.нечленувано
s Imperf (VPerfect (ASg Masc Indef))
непълен член
s Imperf (VPerfect (ASg Masc Def))
пълен член
s Imperf (VPerfect ASgMascDefNom)
ж.р.нечленувано
s Imperf (VPerfect (ASg Fem Indef))
членувано
s Imperf (VPerfect (ASg Fem Def))
ср.р.нечленувано
s Imperf (VPerfect (ASg Neut Indef))
членувано
s Imperf (VPerfect (ASg Neut Def))
мн.ч.нечленувано
s Imperf (VPerfect (APl Indef))
членувано
s Imperf (VPerfect (APl Def))
+ +

Минало несвършено деятелно причастие

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ед.ч.м.р.нечленувано
s Imperf (VPluPerfect (ASg Masc Indef))
непълен член
s Imperf (VPluPerfect (ASg Masc Def))
пълен член
s Imperf (VPluPerfect ASgMascDefNom)
ж.р.нечленувано
s Imperf (VPluPerfect (ASg Fem Indef))
членувано
s Imperf (VPluPerfect (ASg Fem Def))
ср.р.нечленувано
s Imperf (VPluPerfect (ASg Neut Indef))
членувано
s Imperf (VPluPerfect (ASg Neut Def))
мн.ч.нечленувано
s Imperf (VPluPerfect (APl Indef))
членувано
s Imperf (VPluPerfect (APl Def))
+ +

Сегашно деятелно причастие

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ед.ч.м.р.нечленувано
s Imperf (VPresPart (ASg Masc Indef))
непълен член
s Imperf (VPresPart (ASg Masc Def))
пълен член
s Imperf (VPresPart ASgMascDefNom)
ж.р.нечленувано
s Imperf (VPresPart (ASg Fem Indef))
членувано
s Imperf (VPresPart (ASg Fem Def))
ср.р.нечленувано
s Imperf (VPresPart (ASg Neut Indef))
членувано
s Imperf (VPresPart (ASg Neut Def))
мн.ч.нечленувано
s Imperf (VPresPart (APl Indef))
членувано
s Imperf (VPresPart (APl Def))
+ +

Деепричастие (отглаголно наречие)

+

s Imperf VGerund

+ +

Глагол от свършен вид

+

Изявително наклонение

+ +

Сегашно време

+ + + + + + + + + + + + + + + + + + + + + +
ед.ч.мн.ч.
1 л.
s Perf (VPres Sg P1)
s Perf (VPres Pl P1)
2 л.
s Perf (VPres Sg P2)
s Perf (VPres Pl P2)
3 л.
s Perf (VPres Sg P3)
s Perf (VPres Pl P3)
+ +

Минало свършено време (аорист)

+ + + + + + + + + + + + + + + + + + + + + +
ед.ч.мн.ч.
1 л.
s Perf (VAorist Sg P1)
s Perf (VAorist Pl P1)
2 л.
s Perf (VAorist Sg P2)
s Perf (VAorist Pl P2)
3 л.
s Perf (VAorist Sg P3)
s Perf (VAorist Pl P3)
+ +

Минало несвършено време (имперфект)

+ + + + + + + + + + + + + + + + + + + + + +
ед.ч.мн.ч.
1 л.
s Perf (VImperfect Sg P1)
s Perf (VImperfect Pl P1)
2 л.
s Perf (VImperfect Sg P2)
s Perf (VImperfect Pl P2)
3 л.
s Perf (VImperfect Sg P3)
s Perf (VImperfect Pl P3)
+ +

Повелително наклонение

+ + + + + + + + + +
ед.ч.мн.ч.
s Perf (VImperative Sg)
s Perf (VImperative Pl)
+ +

Причастия (отглаголни прилагателни)

+ +

Минало свършено деятелно причастие

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ед.ч.м.р.нечленувано
s Perf (VPerfect (ASg Masc Indef))
непълен член
s Perf (VPerfect (ASg Masc Def))
пълен член
s Perf (VPerfect ASgMascDefNom)
ж.р.нечленувано
s Perf (VPerfect (ASg Fem Indef))
членувано
s Perf (VPerfect (ASg Fem Def))
ср.р.нечленувано
s Perf (VPerfect (ASg Neut Indef))
членувано
s Perf (VPerfect (ASg Neut Def))
мн.ч.нечленувано
s Perf (VPerfect (APl Indef))
членувано
s Perf (VPerfect (APl Def))
+ +

Минало несвършено деятелно причастие

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ед.ч.м.р.нечленувано
s Perf (VPluPerfect (ASg Masc Indef))
непълен член
s Perf (VPluPerfect (ASg Masc Def))
пълен член
s Perf (VPluPerfect ASgMascDefNom)
ж.р.нечленувано
s Perf (VPluPerfect (ASg Fem Indef))
членувано
s Perf (VPluPerfect (ASg Fem Def))
ср.р.нечленувано
s Perf (VPluPerfect (ASg Neut Indef))
членувано
s Perf (VPluPerfect (ASg Neut Def))
мн.ч.нечленувано
s Perf (VPluPerfect (APl Indef))
членувано
s Perf (VPluPerfect (APl Def))
+ +

Отглаголно съществително

+ + + + + + + + + + + + + + + + + + + +
ед.ч.нечленувано
s Imperf (VNoun (NF Sg Indef))
членувано
s Imperf (VNoun (NF Sg Def))
мн.ч.нечленувано
s Imperf (VNoun (NF Pl Indef))
членувано
s Imperf (VNoun (NF Pl Def))
+
+
diff --git a/src/ui/android/res/xml/inflection_en.xml b/src/ui/android/res/xml/inflection_en.xml new file mode 100644 index 000000000..13835ccde --- /dev/null +++ b/src/ui/android/res/xml/inflection_en.xml @@ -0,0 +1,84 @@ + + +

Noun

+ + + + + + + + + + + + + + + + + +
nomgen
sg
s Sg Nom
s Sg Gen
pl
s Pl Nom
s Pl Gen
+
+ +

Adjective

+ + + + + + + + + + + + + + + + + + + + + + +
nomgen
posit
s (AAdj Posit Nom)
s (AAdj Posit Gen)
compar
s (AAdj Compar Nom)
s (AAdj Compar Gen)
compar
s (AAdj Superl Nom)
s (AAdj Superl Gen)
+

Adverb

+

s AAdv

+
+ +

Adverb

+

s

+
+ +

Preposition

+

s

+
+ +

Verb

+ + + + + + + + + + + + + + + + + + + + + +
infitive
s VInf
present
s VPres
past
s VPast
past part.
s VPPart
present part.
s VPresPart
+
+
diff --git a/src/ui/android/src/org/grammaticalframework/ui/android/Language.java b/src/ui/android/src/org/grammaticalframework/ui/android/Language.java index cd16974ab..996846e82 100644 --- a/src/ui/android/src/org/grammaticalframework/ui/android/Language.java +++ b/src/ui/android/src/org/grammaticalframework/ui/android/Language.java @@ -8,11 +8,13 @@ public class Language implements Serializable { private final String mLangCode; private final String mLangName; private final String mConcrete; + private final int mInflResource; - public Language(String langCode, String langName, String concrete) { + public Language(String langCode, String langName, String concrete, int inflResource) { mLangCode = langCode; mLangName = langName; mConcrete = concrete; + mInflResource = inflResource; } public String getLangCode() { @@ -22,6 +24,10 @@ public class Language implements Serializable { public String getLangName() { return mLangName; } + + public int getInflectionResource() { + return mInflResource; + } String getConcrete() { return mConcrete; diff --git a/src/ui/android/src/org/grammaticalframework/ui/android/LexicalEntryActivity.java b/src/ui/android/src/org/grammaticalframework/ui/android/LexicalEntryActivity.java index 393a854cf..8c8777e2f 100644 --- a/src/ui/android/src/org/grammaticalframework/ui/android/LexicalEntryActivity.java +++ b/src/ui/android/src/org/grammaticalframework/ui/android/LexicalEntryActivity.java @@ -1,19 +1,35 @@ package org.grammaticalframework.ui.android; +import java.io.IOException; +import java.io.InputStream; +import java.io.Reader; import java.util.ArrayList; import java.util.List; +import java.util.Map; +import java.util.Scanner; import android.app.Activity; import android.app.ListActivity; +import android.content.Context; +import android.content.res.Resources; +import android.content.res.XmlResourceParser; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; +import android.view.View.OnClickListener; import android.view.ViewGroup; +import android.view.ViewGroup.LayoutParams; +import android.webkit.WebView; import android.widget.ArrayAdapter; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.ListView; +import android.widget.RelativeLayout; import android.widget.TextView; import org.grammaticalframework.pgf.*; import org.grammaticalframework.ui.android.LanguageSelector.OnLanguageSelectedListener; +import org.xmlpull.v1.XmlPullParserException; public class LexicalEntryActivity extends ListActivity { @@ -51,6 +67,8 @@ public class LexicalEntryActivity extends ListActivity { mShowLanguageView.setSelectedLanguage(mTranslator.getTargetLanguage()); } + private View expandedView; + private void updateTranslations() { @SuppressWarnings("unchecked") List list = (List) @@ -59,33 +77,167 @@ public class LexicalEntryActivity extends ListActivity { List data = new ArrayList(); for (MorphoAnalysis a : list) { Expr e = Expr.readExpr(a.getLemma()); - String phrase = mTranslator.linearize(e); - if (!data.contains(phrase)) { - data.add(phrase); + if (!data.contains(a.getLemma())) { + data.add(a.getLemma()); } } - ArrayAdapter adapter = new ArrayAdapter(this, - android.R.layout.simple_list_item_1, - data) { - public View getView(int position, View convertView, ViewGroup parent) { - String item = getItem(position); - - LayoutInflater inflater = (LayoutInflater) getContext() - .getSystemService(Activity.LAYOUT_INFLATER_SERVICE); - if (convertView == null) { - convertView = inflater.inflate(R.layout.lexical_item, null); - } - - TextView descView = - (TextView) convertView.findViewById(R.id.lexical_desc); - descView.setText(item); - - return convertView; - } - }; - - setListAdapter(adapter); + setListAdapter(new LexicalAdapter(this, data)); + expandedView = null; } + + private void collapse() { + if (expandedView == null) + return; + + ImageView arrow = (ImageView) expandedView.findViewById(R.id.arrow); + arrow.setImageResource(R.drawable.open_arrow); + + WebView inflectionView = (WebView) expandedView.findViewById(R.id.lexical_inflection); + ((RelativeLayout) expandedView).removeView(inflectionView); + + expandedView = null; + } + + private void expand(View view, String lemma) { + String tag = null; + if (lemma.endsWith("_N") || lemma.endsWith("_N2")) + tag = "noun"; + else if (lemma.endsWith("_V") || lemma.endsWith("_V2") || + lemma.endsWith("_V3") || lemma.endsWith("_V2V") || + lemma.endsWith("_VV") || lemma.endsWith("_VS")) + tag = "verb"; + else if (lemma.endsWith("_A") || lemma.endsWith("_A2")) + tag = "adjective"; + else if (lemma.endsWith("_Prep")) + tag = "prep"; + else if (lemma.endsWith("_Adv")) + tag = "adverb"; + + if (tag == null) + return; + + int res = mTranslator.getTargetLanguage().getInflectionResource(); + if (res == 0) + return; + + ImageView arrow = (ImageView) view.findViewById(R.id.arrow); + arrow.setImageResource(R.drawable.close_arrow); + + WebView inflectionView = (WebView) view.findViewById(R.id.lexical_inflection); + if (inflectionView == null) { + inflectionView = new WebView(this); + inflectionView.setId(R.id.lexical_inflection); + RelativeLayout.LayoutParams params = + new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); + params.addRule(RelativeLayout.BELOW, R.id.lexical_desc); + ((RelativeLayout) view).addView(inflectionView, params); + } + + Expr expr = Expr.readExpr(lemma); + Map lins = mTranslator.tabularLinearize(expr); + XmlResourceParser parser = getResources().getXml(res); + StringBuilder builder = new StringBuilder(); + builder.append(""); + + try { + boolean emit = false; + boolean form = false; + int event = parser.next(); + while (event != XmlResourceParser.END_DOCUMENT) { + switch (event) { + case XmlResourceParser.START_TAG: + if (tag.equals(parser.getName())) { + emit = true; + } if ("form".equals(parser.getName())) { + form = true; + } else if (emit) { + builder.append("<"+parser.getName()); + int n_attrs = parser.getAttributeCount(); + for (int i = 0; i < n_attrs; i++) { + builder.append(' '); + builder.append(parser.getAttributeName(i)); + builder.append("=\""); + builder.append(parser.getAttributeValue(i)); + builder.append("\""); + } + builder.append(">"); + } + break; + case XmlResourceParser.END_TAG: + if (tag.equals(parser.getName())) { + emit = false; + } else if ("form".equals(parser.getName())) { + form = false; + } else if (emit) { + builder.append(""); + } + break; + case XmlResourceParser.TEXT: + if (emit) { + if (form) { + String s = lins.get(parser.getText()); + if (s != null) + builder.append(s); + } else { + builder.append(parser.getText()); + } + } + break; + } + event = parser.next(); + } + } catch (IOException e) { + e.printStackTrace(); + } catch (XmlPullParserException e) { + e.printStackTrace(); + } finally { + parser.close(); + } + + builder.append(""); + inflectionView.loadData(builder.toString(), "text/html", null); + + expandedView = view; + } + + private class LexicalAdapter extends ArrayAdapter { + public LexicalAdapter(Context context, List data) { + super(context, android.R.layout.simple_list_item_1, data); + } + + public View getView(int position, View convertView, ViewGroup parent) { + final String lemma = getItem(position); + + LayoutInflater inflater = (LayoutInflater) getContext() + .getSystemService(Activity.LAYOUT_INFLATER_SERVICE); + if (convertView == null) { + convertView = inflater.inflate(R.layout.lexical_item, null); + } + + TextView descView = + (TextView) convertView.findViewById(R.id.lexical_desc); + + Expr e = Expr.readExpr(lemma); + String phrase = mTranslator.linearize(e); + descView.setText(phrase); + + convertView.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View view) { + if (expandedView == view) + collapse(); + else if (expandedView == null) + expand(view, lemma); + else { + collapse(); + expand(view, lemma); + } + } + }); + + return convertView; + } + } } diff --git a/src/ui/android/src/org/grammaticalframework/ui/android/Translator.java b/src/ui/android/src/org/grammaticalframework/ui/android/Translator.java index 9f50ebc18..5f52d5325 100644 --- a/src/ui/android/src/org/grammaticalframework/ui/android/Translator.java +++ b/src/ui/android/src/org/grammaticalframework/ui/android/Translator.java @@ -14,6 +14,7 @@ import java.io.IOException; import java.io.InputStream; import java.util.Arrays; import java.util.List; +import java.util.Map; public class Translator { @@ -24,12 +25,10 @@ public class Translator { // TODO: build dynamically? private Language[] mLanguages = { - new Language("en-US", "English", "ParseEng"), - new Language("cmn-Hans-CN", "Chinese", "ParseChi"), - // new Language("de-DE", "German", "ParseGer"), - // new Language("es-ES", "Spanish", "ResourceDemoSpa"), - //new Language("fr-FR", "French", "ResourceDemoFre"), - // new Language("bg-BG", "Bulgarian", "ParseBul"), + new Language("en-US", "English", "ParseEng", R.xml.inflection_en), + new Language("bg-BG", "Bulgarian", "ParseBul", R.xml.inflection_bg), + //new Language("fr-FR", "French", "ParseFre", 0) + //new Language("cmn-Hans-CN", "Chinese", "ParseChi", 0) }; private Language mSourceLanguage; @@ -104,6 +103,11 @@ public class Translator { return targetLang.linearize(e); } + public Map tabularLinearize(Expr e) { + Concr targetLang = getConcr(getTargetLanguage().getConcrete()); + return targetLang.tabularLinearize(e); + } + public List lookupMorpho(String sentence) { return getConcr(getSourceLanguage().getConcrete()).lookupMorpho(sentence); }