From 10fa2baa56a4166d75a3807198b17c2b34db77de Mon Sep 17 00:00:00 2001
From: "kr.angelov"
Date: Wed, 23 Oct 2013 15:10:13 +0000
Subject: [PATCH] the first version of the Android's morphology browser
---
src/ui/android/res/layout/lexical_item.xml | 12 +-
src/ui/android/res/xml/inflection_bg.xml | 615 ++++++++++++++++++
src/ui/android/res/xml/inflection_en.xml | 84 +++
.../ui/android/Language.java | 8 +-
.../ui/android/LexicalEntryActivity.java | 200 +++++-
.../ui/android/Translator.java | 16 +-
6 files changed, 901 insertions(+), 34 deletions(-)
create mode 100644 src/ui/android/res/xml/inflection_bg.xml
create mode 100644 src/ui/android/res/xml/inflection_en.xml
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 @@
+
+
+ Съществително
+
+
+
+ Прилагателно
+
+
+
+ Прилагателно
+
+
+ Наречие
+
+
+
+ Наречие
+
+
+
+ Предлог
+
+
+
+ Глагол от несвършен вид
+
+ Изявително наклонение
+
+ Сегашно време
+
+
+ Минало свършено време (аорист)
+
+
+ Минало несвършено време (имперфект)
+
+
+ Повелително наклонение
+
+
+ Причастия (отглаголни прилагателни)
+
+ Минало страдателно причастие
+
+
+ Минало свършено деятелно причастие
+
+
+ Минало несвършено деятелно причастие
+
+
+ Сегашно деятелно причастие
+
+
+ Деепричастие (отглаголно наречие)
+
+
+ Глагол от свършен вид
+ Изявително наклонение
+
+ Сегашно време
+
+
+ Минало свършено време (аорист)
+
+
+ Минало несвършено време (имперфект)
+
+
+ Повелително наклонение
+
+
+ Причастия (отглаголни прилагателни)
+
+ Минало свършено деятелно причастие
+
+
+ Минало несвършено деятелно причастие
+
+
+ Отглаголно съществително
+
+
+
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
+
+
+
+
+ Adjective
+
+
+ Adverb
+
+
+
+ Adverb
+
+
+
+ Preposition
+
+
+
+ Verb
+
+
+
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(""+parser.getName()+">");
+ }
+ 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);
}